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AEQAAVsBYMAARAAAAV2CggFfAAAHBIKOBcAARlvAAEZjGIIjBABbASsEgo8FwABGlsAARq0YPwQAYMAAQrQBasAARp9gwABCtBUEgpAFwABIE8AASB4YgXsEAF2BkAFbASsEgpEFwABINsAASD4YgXYAXgAAAAAAAVcNAFwABIKSBcAASFXAAEhcGIIUAF4AAAAAAAFXDQBcAASCkwXAAEhzwABIexiCFQBeAAAAAAABVw0AXAAEgpQFwABImMAASKAYgXcAXgAAAAAAAVcOAFsAAQWCtQXAAEilwABIpcAASPEAAAADwABItsAASPEAAAAEBATAAEi8AAAEgXZeAAAAAAABVw0AXADAAEjLAAAEghReAAAAAAABVw0AXADAAEjZAAAEghVeAAAAAAABVw0AXADAAEjoAAAEgXdeAAAAAAABVw4AWwAAXYKFAV8AAAE/BQgBgpGAAMAAUdEIAYKSgQDAAFHmCAGCk4IAwABR+wgBgpSDAMAAUhAJAcAASKXAAEQWAAAAABcGgpYFwABJRcAASVPAAEl7AQCCEwAAAAEDwABJWsAASXsAAAAAAAAAXYHUAV8AAAFKwABJXQEfwABJYYLtAQFfAAABLgAGgpkFwABKmMAASqHAAErPAQCCJAQAAAABA8AASq3AAErPAAAAAAAAAGDAAEDuAUrAAEqwASEcwABKyxzAAEq4FsAASrEuPwSCj4F9AQABasAASrpgwABCtBkAwABCzIF+AQABkwDAAEPXBoKfBcAASwLAAEsLwABLOwEAghgAAAABA8AASxfAAEs7AAAAAAAAAGDAAEDuAUrAAEsaASEcwABLNxzAAEsiFsAASxsuPwSCj4F9AQABasAASyRgwABCtB4AwABCzIF+AQABkwDAAEPXBoKaBcAAS3TAAEt9wABLywEAgiUEAAAAAQPAAEuNwABLywAAAAAAAABgwABA7gFKwABLlgEcwABLuhzAAEueFsAAS5cuPwSCj4F9AQABasAAS6BgwABCtCUAwABCzIF+AQABasAAS71gwABCtBUAwABD1waCoAXAAEvQwABL2cAATAIBAIF8AAAAAQPAAEviwABMAgAAAAAAAABgwABA7gFKwABL5QEhHMAAS/4cwABL7RbAAEvmLj8Ego+BfQEAAWrAAEvvYMAAQrQXAMAAQsyBfgEAAZMAwABD1waCoQXA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Q9c+AT0cwABD4xbAAEPXLoRUjTuR5oPSAQABg8AAQ/HAAawVAMAARQc/PRfAAEQLLoRQjTsqkec/QUPAAEQ1HMAARD6GwABEPMABrISBhAEAAYLAAERAwAGsAgDAAEPhPgROwABEWMAARGEAAIRMYMAAQrQBHsAARGONXAMAA4DAAER6wAGr4obAAESFwAGshILAAESIwAGsAgBJwABEmxzAAESoh8AARJ/AAbDPgu8BAAGTAMAAQ+M+BT0XwABEuS6EUI07KpHnQBzAAETyHMAAROeGwABE5cABrISCCwEAAYfAAETpwAGwzwDAAEPZgdABAAGCwABE9cABrAIAwABD4sAAROXAAET9AD0cwABFFhbAAEUKLoRUjTuR5oNwAQABHsAARSPAAETAAwADgMAARTHAAavihsAARTzAAayEHMAARUGGwABFP8ABrISCCwEAAYfAAEVDwAGwzwDAAEPZAADAAEUEPY7AAEVawAGshBzAAEVchsAARVrAAayEggsBAAGHwABFX8ABsM8AwABD2UnAAEVzHMAARXmGwABFd8ABrISBfgEAAYLAAEV8wAGsAgDAAEPXQsAARYYCPz9OwABFo8AARagAAIReYMAAQrQBHMAARbOAwABFqsABq+KCjQEAATUAAAABAGDAAEK0AYbAAEW0wAGshDUAAAABAGDAAEK0AY7AAEW0wAGshBzAAEW1FADAAbJUCACCCwEAAZQAwABD2RQAwAGyVAgAAMAAQ2dJwABHKxzAAEc0FMAARy/AAbIuCACBhAEAAZMAwABD4T4CScAAR30hFsAAR4IuhDKNO5HlPgE9MMAAR6EfwABHp8AAQo8DAAMkwABIAwInhGQcwABH8BzAAEfpFMAAR+rAAbIuCACDQQAAAADAAELXhGABAAE3EADAAELigMAASBXAAaviHMAASDKGwABIMMABrISC4gEAAZQAwABD2gA/PRzAAEhaFsAASE4uhFSNO5Hmg9IBAAFqwABIaGDAAEK0ghUAwABFBz4JQBzAAEixFMAASKzAAbIuCACC7wEAAWrAAEizYMAAQrSCDgDAAEPjwABIrMAASMIAScAASM8cwABI4RzAAEjZFMAASNTAAbIuCACBfQEAATeA4ADAAELMgX4BAAE3gMAAwABD1z4DPYvAAEj4wAGsFRzAAEkFFMAASQDAAbIuCACBfQEA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fgEAAYDAASGTwAJnGgAGn7FDwAEho8ABIafAASIAAACF8ZvNAAAAAQPAASG3wAEiAAAAAAEBAcABIbwAAACC4WDAAEK0AABgwABCtAE+AUrAASHJARzAASHQLoXFm80BAAEcwAEh4IDAASHawAJnc4MpAQABasABIexgwABCtBsAwABD2wCdWwafskPAASIFwAEiCsABIm4AAIXym80AAAABA8ABIhrAASJuAAAAAgICwAEiHwAAAILhYMAAQrQAwAEiKgAAAID/YMAAQrQAAFwBPgE9HMABIjcuhcebzQIAAhzAASJHgMABIkHAAmftgykBAAFqwAEiU2DAAEK0GwDAAEPbgcABImTAAmf8AJ1cAAACZRsAAmXeAAJmsAACZvEAAmdKAAJnxAACaE0AAAAGAp/1Q8ABI6rAASPKwAEncgNNAWrAASOrYMAAQLUEAAFgnWwAAWCqgQAABgaf90PAASRGwAEkU8ABJPADAIKNAAAAAQPAASRVwAEk8AAAAAEBAcABJFoAAACC4WDAAEK0AABgwABCtAE+AknAASRnIhzAASRxgMABJGvAAmjAgYQBAAGTAMAAQ+EBHMABJH6AwAEkeMACaMCB0wEAARbAASSBLoIJnUwAwABD5D4BPTDAASSRH8ABJJvAAEIKAwADgMABJKzAAmjALieC4QA/SsABJM0BHMABJNQuhfObzQEAAYDAASTmwAJowACf+waf+EPAAST1wAElA8ABJawDAILlAAAAAQPAASUGwAElrAAAAAICAsABJQsAAACC4WDAAEK0AMABJRYAACCA/2DAAEK0AABcAT4CScABJSMiHMABJS2AwAElJ8ACaYOBhAEAAZMAwABD4QEcwAElOoDAASU0wAJpg4HTAQABFsABJT0uggmdTADAAEPkPgE9MMABJU0fwAElV8AAQgoDAAOAwAElaMACaYMuJ4LhAD89HMABJYkuhfSbzQIAAoDAASWbwAJpg4HAASWiwAJpkgCf/Aaf/0PAASXmwAEl7sABJiwBAIWaAAAAAQPAASYBwAEmLAAAAAAAAABgwABCtAE+AUrAASYHAWrAASYZYMAAQrQbBp/6Q8ABJlDAASZbwAEmmgAAhaSbzQAAAAEDwAEmZsABJpoAAAABAQHAASZrAAAAgglgwABCtAAAYKqBAT4BSsABJnkBHsABJoSqhQEAAYDA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XcAAQ1gBYKqxARzAAIGmLoWkm80BAAGCwACBssACiiQAnH49HMAAgcaDwACBv8ACiliFIwQABJOCwACB0sACiiQugMAAgeDAAom7AMAAQ31KwACB7AGDwACB88ACilgGoM9DwACCjcAAgpLAAINNAACDjQAAAAEDwACCm8AAg00AAAADAgPAAIKgAAAAgLtgwABCtADAAIKrAAAAgL1gwABCtADAAIK7AAAghNdgqrEBagBgwABDvQAAXAE+Aj0ewACC2MAAQfUDAAOAwACC6MACiuqBwACC78ACivkWwACC+S6CCcAAQ4cARcAAgwYBwACDD8AAgxEAAILkYMAAQrQBgMAAgxPAAorqARzAAIMcg8AAgxrAAotUgYQBAAGBwACDHsACivkAwABD4QGLwACDJcACi1QcwACDI4PAAIMlwAKLVIILAQABlADAAEPZPgE9HMAAgzQuguUCAAKDwACDNcACi1SCwACDOsACiwgAwABDaAAAAn9aAAKG3wAChz8AAoefAAKH5gACiFYAAoiyAAKJAQACiZQAAorDAAKL2QAAAAoCoNNDwAEzkMABM7DAATejA1ABasABM5FgwABAtQQAAWCglgABYKqWAAAGBqDVQ8ABNBDAATRRwAE08QMAgo0BasABNBFgwABAtYUBAAABA8ABNFPAATTxAAAAAQEBwAE0WAAAAILhYMAAQrQAAGCqsQE+AknAATRlIhzAATRvgMABNGnAAoxogYQBAAGTAMAAQ+EBHMABNHyAwAE0dsACjGiB0wEAARbAATR/LoIJnUwAwABD5D4BPTDAATSPH8ABNJnAAEIKAwADgMABNKrAAoxoLieC4QA/SsABNMsBHMABNNIuhfubzQEAAYDAATTnwAKMaACg2Qag1kPAATT2wAE1BMABNbYDAILlAAAAAQPAATUHwAE1tgAAAAICAsABNQwAAACC4WDAAEK0AMABNR0AACCA/2CqsQAAXAE+AknAATUqIhzAATU0gMABNS7AAo0pgYQBAAGTAMAAQ+EBHMABNUGAwAE1O8ACjSmB0wEAARbAATVELoIJnUwAwABD5D4BPTDAATVUH8ABNV7AAEIKAwADgMABNW/AAo0pLieC4QA/PRzAATWQLoX8m80CAAKAwAE1pcACjSmBwAE1rMACjTgAoNoGoN1DwAE18MABNfjAATY5AQCFmgAA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wAKbp4ILAQABlADAAEPZPgE9HMAAqtIuguUCAAKDwACq08ACm6eCwACq2MACm1sAwABDaAAAAo+tAAKXMgACl5IAApfyAAKYOQACmKkAApkFAAKZVAACmecAApsWAAKcLAAAAAoCoR1DwAE458ABOQfAATzUA1EBasABOOhgwABAtQQAAWCg4AABYKqfAAAGBqEfQ8ABOWHAATmewAE6PAMAgo0BasABOWJgwABAtYUwAAABA8ABOaDAATo8AAAAAQEBwAE5pQAAAILhYMAAQrQAAGCr2QE+AknAATmyIhzAATm8gMABObbAApy7gYQBAAGTAMAAQ+EBHMABOcmAwAE5w8ACnLuB0wEAARbAATnMLoIJnUwAwABD5D4BPTDAATncH8ABOebAAEIKAwADgMABOffAApy7LieC4QA/SsABOhgBHMABOh8uhf6bzQEAAYDAAToywAKcuwChIwahIEPAATpBwAE6T8ABOv0DAILlAAAAAQPAATpSwAE6/QAAAAICAsABOlcAAACC4WDAAEK0AMABOmYAACCA/2Cr2QAAXAE+AknAATpzIhzAATp9gMABOnfAAp18gYQBAAGTAMAAQ+EBHMABOoqAwAE6hMACnXyB0wEAARbAATqNLoIJnUwAwABD5D4BPTDAATqdH8ABOqfAAEIKAwADgMABOrjAAp18LieC4QA/PRzAATrZLoX/m80CAAKAwAE67MACnXyBwAE688ACnYsAoSQGoSdDwAE7N8ABOz/AATt+AQCFmgAAAAEDwAE7UsABO34AAAAAAAAAYMAAQrQBPgFKwAE7WAFqwAE7a2DAAEK0PwahIkPAATuiwAE7rsABO+4AAIWkm80AAAABA8ABO7nAATvuAAAAAQEBwAE7vgAAAIIJYMAAQrQAAGCqnwE+AUrAATvMAR7AATvXqqMBAAGAwAE748ACno8ABqEjQ8ABO/PAATv7wAE8WgAAhf6bzQAAAAEDwAE8DcABPFoAAAABAQHAATwSAAAAguFgwABCtAAAYKvZAT4BSsABPB8BHMABPCYuhdqbzQEAARzAATw4gMABPDLAAp7ogykBAAFqwAE8RmDAAEK0PwDAAEPbAJ1lBqEkQ8ABPF/AATxkwAE80gAAhf+bzQAAAAEDwAE8dsABPNIAAAACAgLAATx7AAAAguFgwABCtADAATyKAAAAgP9gq9kA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wADQBRbAAM/+LoIJwABDh4LiAQABlADAAEPaAMAAQ2c/PTDAANAPHsAA0CqWZgAAAAAGoWFDwADQ6MAA0PjAANHpAACEPgAAAAEDwADQ/8AA0ekAAAACAQLAANEEAAAAgLtgwABCtADAANEQAAAAgL1gwABCtAFqAGDAAEO9AABdwABDWAFgrPoBPgU9icAA0RzAAqpwHsAA0S3AAEH1AwADgMAA0T3AAqphgcAA0UTAAqpwFsAA0U4uggnAAEOHAE7AANFfwADRZgAAgglgwABCtAEcwADRbIHAANFowAKqcILiAQABgMAA0W7AAqphAMAAQ9pOwADRicAA0ZAAAIGzXcAAQ1gBYKz6ARzAANGSLoWkm80BAAGCwADRnsACqsoAnPg9HMAA0bKDwADRq8ACqv6FIwQABJOCwADRvsACqsougMAA0czAAqphAMAAQ31KwADR2AGDwADR38ACqv4GoWNDwADSecAA0n7AANM5AACDjQAAAAEDwADSh8AA0zkAAAADAgPAANKMAAAAgLtgwABCtADAANKXAAAAgL1gwABCtADAANKnAAAghNdgrPoBagBgwABDvQAAXAE+Aj0ewADSxMAAQfUDAAOAwADS1MACq5CBwADS28ACq58WwADS5S6CCcAAQ4cARcAA0vIBwADS+8AA0v0AAILkYMAAQrQBgMAA0v/AAquQARzAANMIg8AA0wbAAqv6gYQBAAGBwADTCsACq58AwABD4QGLwADTEcACq/ocwADTD4PAANMRwAKr+oILAQABlADAAEPZPgE9HMAA0yAuguUCAAKDwADTIcACq/qCwADTJsACq64AwABDaAAAAqAAAAKnhQACp+UAAqhFAAKojAACqPwAAqlYAAKppwACqjoAAqtpAAKsfwAAAAoCoWdDwAE+JsABPkbAAUI5A1IBasABPidgwABAtQQAAWChKgABYKqoAAAGBqFpQ8ABPqbAAT7nwAE/hwMAgo0BasABPqdgwABAtYV3AAABA8ABPunAAT+HAAAAAQEBwAE+7gAAAILhYMAAQrQAAGCs+gE+AknAAT77IhzAAT8FgMABPv/AAq0OgYQBAAGTAMAAQ+EBHMABPxKAwAE/DMACrQ6B0wEAARbAAT8VLoIJnUwAwABD5D4BPTDAAT8lH8ABPy/AAEIKAwADgMABP0DAAq0OLieC4QA/SsAB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ggsBAAGAqQnABEtNAMAAQ9kAv/qBfgEAARypGYGpE8AES1qDzwEAAYOpJMAETAAAwABEpgDAAEPXPgFKqTIBKj9KqVIBKQa//3WpZqlrqccAAIZsAAAAAQOpc6nHAAAAAQEBqXsAAACCQWDAAESYAABgwABA7gE+AUqpiAEcqY8uiXO8WwIAAhyprRappi6CCcAAQB6C4gEAARaptYCpr8AETMeCCcAARJwAwABD2oCpvcAETMcAv+cGwABAAHWpzKnRqvsAAISAAAAAAQOp26r7AAAAAgECqeQAAACJRGDAAEQXAKnyAAAAguFgwABCtAFqAGDAAEK0FQBgwABA7gE+A0mqBCIcqg+BqgnABE1JgYQBAAGTAMAAQ+EBHKoegaoYwARNSYLvAQABFqolLoIJwABAHgDAAEPjPgE9MKo2H6pAwABB/gMAA4GqUcAETUmTFqpgLoIJwABAHgA/SapzJap/gKp3wARNPGDAAESYPgFKqpIBHKqZLolzvFsCAAKBqqvABE1JFKqywARNPAABYMAARJgAv+c/SqrGASEcqvAcqtWAqs3ABE08iXQCAAIugarpwARNSQDAAEQagX4BAAErAMAARA0GwABAAXWrAKsErhYAAIl1AAAAAQOrC64WAAAAAgECqxQAAACJRGDAAEQXAKsiAAAAgLtgwABCtAFqAGDAAEK0FQBgwABCtAE+BEmrNCIcqz+BqznABE5agYQBAAGTAMAAQ+EBHKtOgatIwAROWoLvAQABFqtVLoIJwABAHgDAAEPjPgE9MKtmH6twwABB/gQABIGrgcAETlqTFquQLoIJwABAHieAuwA/SausJau4gKuwwAROTWDAAESYPgROq9Kr2AAAgkFgwABEmAEUq9rABE5NAAFgwABEmE6r7av2AACJdmDAAEK0ARysBBar/S6CCcAAQB6C4gEAARasDIKsBsAETuyCCcAARJwAwABD2kWsVAGsXaxjAACC4WDAAEK0AYGsZcAETloBHKxyhKxswARPQoHQAQABg6x1wARPCQDAAEPiAYysf8AET0IcrISErH/ABE9CggsBAAGUAMAAQ9k+AUmskhysli6Jc7xbAgAChKyowARPQoKsr8AETuwAv+c+AUqswwGErMrABE9CP0qs6QEcrPCUg0EAAAAAwABC1z9FrP4BrQetCQAAguRgwABCtAGBrQvA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RJtJwABLOSIcwABLQ4DAAEs9wARdSoF+AQABkwDAAEPXABzAAEtPgcAAS0vABF1ZgX4BAAGDwABLUsAEXYEAwABD10rAAEtaAYLAAEthwARdaD9OwABLdsAAS4gAAIl/YMAAQrQBFsAAS5aCwABLisAEXWiCCcAARJxOwABLpsAAS7IAAImAYMAAQrQBHMAAS8scwABLuoDAAEu0wARdSoILAQABHMAAS8SDwABLvcAEXYGC4gEAAYHAAEvGwARdWQDAAEPaAMAAQ9mCCwEAAYXAAEvNwAReTADAAEPZScAAS+QihMAAS+jABF3SABbAAEwFLolgvFvAAEAdPgZOwABMHcAATCQAAIGzYMAAQCMBHsAATDXAAEA0AQABhsAATD/ABF5zAE7AAExXwABMXQAAguFgwABCtAGTPRXAAExowARfIAgcwABMd4fAAExwwARe94WcvFsEAAQUwABMgcAEXyAIAC6TgMAATJHABF1KAMAAQDc9FcAATJ/ABF8gCBzAAEyuh8AATKfABF73hZy8WwQABIDAAEy4wARdSoLAAEy/wARdaJOFwABMz8AEXkwAwABANz0cwABM8IfAAEzpwARe94WcvFsEAAQUwABM+sAEXyAIAC6BwABNB8AEXVmDwABNDMAEXYEAwABAN0rAAE0bAYfAAE0iwARe9z9OwABNOcAATUAAAImBXcAAQ1gBWwExwABNQlsAPR7AAE1Kv+4DAAOHwABNW8AEX/mTgMAATWbABF1KAEnAAE1yHMAATYkWwABNgoLAAE12wARdaIIJwABEnILvAQABkwDAAEPjPRzAAE2Vh8AATY7ABF/5gOMBAAGCwABNmcAEXWgAwABDaT89HsAATau/7gMAA4fAAE28wARf+YHAAE3EwARdWYPAAE3JwARdgQBKwABN1gEewABN3b/wBAAELofAAE4CwARf+YbAAE4KwARec4TAAE4XwARd0gAGv+51wABONcAATkDAAE+MAAGJgrxbAAAAAQPAAE5QwABPjAAAAAMDA8AATlYAAACJg13AAENYAVsAwABOYwAAAIC7YMAAQrQAwABObgAAAIC9YMAAQrQAAGDAAEK0AT4DTsAATn3AAE6EAACCCWDAAEK0ARzAAE6KgsAATobABGEcguIBAAGBwABOjMAEYQ0AwABD2knAAE6XHMAATqKDwABOm8AEYTWC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ysAEiy0cwACf12rAAJ/NYMAARJiS14PPAQABHMAAn+cug88BAAGDwACf8sAEiy0AwABALgDAAESmAMAAQDZKwACgBgGCwACgDcAEil9KwACgHwEuBsAAQEB1wACgM8AAoDrAAKTOAACJjgAAAAEDwACgRcAApM4AAAAAAAAAYMAARJgBPgJFwACgTgHAAKBXwACgWQAAguRgwABCtAGTARzAAKBggMAAoF7ABIw4gYQBAAEWwACgZy6CCcAAQB4AwABD4QGIwACgb8AEjDgcwACgcIDAAKBvwASMOIILAQABlADAAEPZQT4HTsAAoILAAKCEAAGFR2DAAEK0ARzAAKCLLoPPAQABgMAAoJbABIw4AMAAQC5JwACg6xzAAKDxgcAAoO/ABIyXgX4BAAEcwACg/mrAAKD0YMAARJiS2oPPAQABgcAAoQnABIyXAMAARKYAwABD10LAAKENAD9FwAChkwHAAKGcwAChngAAhK5gwABCtAGAwAChoMAEjDgBHMAAoaWCwACho8AEjRCBhAEAARbAAKGsLoIJwABAHgDAAEPhAYrAAKG0wASNEBzAAKG1gsAAobTABI0QggsBAAGUAMAAQ9k+Ak7AAKHJwAChywABhUdgwABCtAEcwACh0i6DzwEAAYLAAKHdwASNEADAAEAuScAAoekiHMAAogYcwACh+GrAAKHuYMAARJiS2oPPAQABg8AAogPABI12AMAARKaBfgEAAZMAwABD1wAhHMAAohWDwACiE8AEjXaBfgEAAZMAwABD1z4BSsAAowwBHcAAoxmJjgAAAADAAEAUP07AAKOrwACjsgABgbNgwABAIwEewACjtMAAQDQBAAEWwACjwy6CCcAAQB4ARcAAo9IBwACj28AAo90AAISuYMAAQrQBkwEcwACj5IPAAKPiwASOQIGEAQABgMAAo+bABIw4AMAAQ+EBi8AAo+nABI5AHMAAo+qDwACj6cAEjkCCCwEAAZQAwABD2T4BPRzAAKP/gsAAo/jABI4PiEO8WwIAAoPAAKQGwASOQBzAAKQOLoPPAQABg8AApBnABI5AAMAAQC4AwABANkXAAKQsAcAApDXAAKQ3AACErmDAAEK0AYDAAKQ5wASMOAEcwACkPoPAAKQ8wASO3YGEAQABFsAApEUuggnAAEAeAMAAQ+EBi8AApE3ABI7dHMAApE6DwACkTcAEjt2CCwEAAZQAwABD2T4BPRzAAKRjgsAApFzABI4PiEO8WwIAAoPAAKRqwASO3RzAAKR3asAApG1gwABEmJLag88BAAEcwACkhy6DzwEAAYPAAKSSwASO3QDAAEAuAMAARKYAwABANkrAAKSmAYLAAKStwASOD0rAAKS/AS4GwABANHXAAKUvwACld8AApawABYmlvFsCasAApTBgwABAtZKsagBgk3qS4AAAAQPAAKWAwAClrAAAAAEBAcAApYUAAACCCWDAAEK0AABgwABAIwAGwABANnXAAKa1wACmusAApvcABIhDvFsBagBgk3qS7AAAAQPAAKbAwACm9wAAAAICAsAApsUAAACC4WDAAEK0AMAAptAAAACJqGDAAEK0AABcAAbAAEA3dcAAp6PAAKenwACpNAAAhZy8WwAAAAEDwACnsMAAqTQAAAAEBATAAKe1AAAAguFgwABCtADAAKfDAAAAialgwABEmADAAKfWAAAAgLtgwABCtADAAKfhAAAAgL1gwABCtAAAYMAAQrQBPghAFsAAqAGBwACn88AEkJGJYLxbwABEm8AAp/PAAKgLAEAcwACoG5OB0AEAAYLAAKgewASQoADAAEPiwACoGcAAqCMAQBzAAKg3gsAAqDHABJCggdABAAGDwACoOsAEkK8AwABD4sAAqDHAAKg9AEAcwACoT4PAAKhLwASQr4HQAQABFsAAqGCBwACoUsAEkJGCCcAARJwAwABD4sAAqEvAAKhmAEAcwACodpOB0AEAAYDAAKh5wASQggDAAEPiwACodMAAqH4AQBzAAKiiHMAAqJKAwACojMAEkIKCCwEAARzAAKiZg8AAqJXABJCvguIBAAGCwACom8AEkKAAwABD2gDAAEPZgdABAAEWwACopS6CCcAAQB4AwABD4sAAqIzAAKirAEXAAKiyAcAAqLvAAKi9AACC5GDAAEK0AYLAAKi/wASQoAEcwACoyITAAKjGwASR8oGEAQABg8AAqMrABJCvAMAAQ+EBjMAAqM/ABJHyHMAAqNCEwACoz8AEkfKCCwEAAZQAwABD2T4CPRzAAKjcLohDvFsCAAKAwACo48AEkIIcwACo+IHAAKjqwASQkYPPAQABhMAAqQPABJHyAMAARKYAwABANj2IwACpDsAEkIIcwACpFIDAAKkOwASQgoILAQABlADAAEPZSsAAqSQBgMAAqSvABJCCAAAEez0ABHuAAAR70gAEfC8ABHyYAAR8+wAEfUkABH5mAASBLgAEhBoABIbwAASJVAAEjAAABI+wAASQBAAEkFcABJLDAAAAEALAAEBBdcAAqTnAAKlZwACrxwOA8QFqwACpOmDAAEC1BAABYL/WAAAAAAQGwABAR3XAAKoNwACqG8AAqowABYmqvFsBagBgk3qS+AAAAQPAAKozwACqjAAAAAMDA8AAqj4AAACDgF3AAENYAWDAAEK0AMAAqkgAAACAu2DAAEK0AMAAqlMAAACAvWDAAEK0AABgwABEmAAGwABASHXAAKqRwACqlsAAqu0AAIlevFsAAAABA8AAqqPAAKrtAAAAAQEBwACqqAAAAIRKYMAAQrQAAGDAAEDuAT4BSsAAqrgBHsAAqsu/6wEAAYDAAKrgwASTzgAGwABASXXAAKrywACrKsAAq1oABIPPAmrAAKrzYMAAQLWBGmoAYJN6kp0AAAEDwACrNMAAq1oAAAABAQHAAKs5AAAAguFgwABCtAAAYMAAQrQABsAAQEp1wACrX8AAq5XAAKvFAwCBfgFqwACrYGDAAEC1grwAAAEDwACrl8AAq8UAAAABAQHAAKufAAAAgkFgwABEAAAAYMAAQO4BPgFKwACrrAEdwACruYF+AQABgMAAq7zABJSHAL/9AAAEkzcABJOjAASUAAAElFIABJS7AAAABALAAEBLdcAAq8rAAKvqwACtxAOA8gFqwACry2DAAEC1BAABYL/WAAAAAAMGwABAUXXAAKy2wACsu8AArRIAAIlevFsAAAABA8AArMjAAK0SAAAAAQEBwACszQAAAIRKYMAAQrQAAGDAAEDuAT4BSsAArN0BHsAArPC/6gEAAYDAAK0FwASVKgAGwABAUnXAAK0XwACtT8AArX8ABIPPAmrAAK0YYMAAQLWBGmoAYJN6kp0AAAEDwACtWcAArX8AAAABAQHAAK1eAAAAguFgwABCtAAAYMAAQrQABsAAQFN1wACthMAArZLAAK3CAwCBfgAAAAEDwACtlMAArcIAAAABAQHAAK2cAAAAgkFgwABEAAAAYMAAQO4BPgFKwACtqQEdwACttoF+AQABgMAArbnABJXXAL/9AAAElP8ABJVcAASVrgAElgsAAAADAsAAQFR1wACtx8AArefAAK/BA4DzAWrAAK3IYMAAQLUEAAFgv9YAAAAAAwbAAEBadcAArrPAAK64wACvDwAAiV68WwAAAAEDwACuxcAArw8AAAABAQHAAK7KAAAAhEpgwABCtAAAYMAAQO4BPgFKwACu2gEewACu7b/rAQABgMAArwLABJZ2AAbAAEBbdcAArxTAAK9MwACvfAAEg88CasAArxVgwABAtYEaagBgk3qSnQAAAQPAAK9WwACvfAAAAAEBAcAAr1sAAACC4WDAAEK0AABgwABCtAAGwABAXHXAAK+BwACvj8AAr78DAIF+AAAAAQPAAK+RwACvvwAAAAEBAcAAr5kAAACCQWDAAEQAAABgwABA7gE+AUrAAK+mAR3AAK+zgX4BAAGAwACvtsAElyMAv/0AAASWSwAElqgABJb6AASXVwAAAAMCwABAXXXAAK/EwACvysAAsf4DiawAAAFgwABEAAABYMAARB0DBMAAQF91wACxycAAsc4JgLsAYMAAQrQABMAAQGB1wACx38AAseQJg+YAYMAARJgABMAAQGF1wACx9cAAsfwJiUQAYMAARJgAAQXAAEBqdcAAr+zAAK/ywACwJAEAAAPAAK/+wACwJAAAAAMDA8AAsAQAAASAu2DAAEK0AMAAsBAAAASD5mDAAESYAMAAsBwAAASJRGDAAESYAABgwABAXQE/BAgBwABAX4AAwASX/ggBwABAYIEAwASYDQgBwABAYYIAwASYHAkBwACv8sAARBYAAAAAAwbAAEBjdcAAsCnAALAxwACwTgEAgL0AAAABA8AAsDXAALBOAAAAAAAAAGDAAEK0AUrAALA4ARzAALA+FsAAsDgugLvAAEBfggsBAAEWwACwSBbAALBALolEwABAYYIJwABEnADAAEPZBsAAQGZ1wACwUsAAsGLAALB3AwCCjQAAAAEDwACwZMAAsHcAAAABAQHAALBpAAAAia1gwABCtAAAYMAARJgBSsAAsG8BHMAAsG8uiU8BAAGAwACwdcAEmPgAwABAZwbAAEBndcAAsJfAALCewACxDAAAiU8AAAABA8AAsKPAALEMAAAAAQEBwACwqAAAAIlPYMAAQrQAAGDAAESYAT4CScAAsLUhHMAAsL+AwACwucAEmVaBfgEAAZMAwABD1z4BPTDAALDNH8AAsNfAAEH9AQABgMAAsOjABJlWAD9KwACw+gEWwACxAS6JRMAA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QIkAAISzYMAARJgBHMAAQJUWwABAiy6J57xbwABCLYJ9AAAAAMAARA49HMAAQLcUwABAr8AEvvAIAIoDAQABJAAIJ4oKFMAAQNjABMBiCgAnigsnigwnig0UwABBdMAEwGIKACeKDieKDwDAAET5PgE9HMAAQfoUwABB38AEvvAIAIoDAQABJAAJJ4oQFsAAQhYWwABCDC6J57xbwABCLYoRwABEFCeKEofAAEJOwAS+ayeKBoLAAEJZwAS7WieGlIbAAEJlwAS+SSeE4wDAAET5QsAAQpoAAcAAQshqwABCyGDAAEK0HgA+AT4DPRzAAELsFMAAQuTABL7wCACKAwEAASQACieKExbAAEMXFsAAQw0uiee8W8AAQi2KEcAARBQnihQnihWHwABDR8AEvmsnigaCwABDUsAEu1onhpSGwABDXsAEvkknhOMAwABE+T2KwABDecAEu1okwABDmQInihaCwABDjsAEu1pCwABDpQABwABD02rAAEPTYMAAQrQZAD4BPgI9HMAAQ/gUwABD8MAEvvAIAIoDAQABJAAKJ4oXh8AARAzABL5rJ4oGgsAARBfABLtaJ4aUhsAARCPABL5JJ4PzJ4oYFsAARFUuiee8W8AAQi0nihkAwABE+ULAAERuAAHAAEScasAARJxgwABCtCUAPgE+Az0cwABExhTAAES+wAS+8AgAigMBAAEkAAgnihqCwABE4MAEu1onhpSGwABE7MAEvkknihsnihwWwABFHi6J57xbwABCLSeKGQDAAET5PYrAAEU3wAS7WiTAAEVVAieKHYLAAEVKwAS7WkLAAEVhAAHAAEWPasAARY9gwABCtBcAPgE+Aj0cwABFtxTAAEWvwAS+8AgAigMBAAEkAAgnih6HwABFzsAEvmsnigaCwABF2cAEu1onhpSGwABF5cAEvkkng/Mnih8AwABE+ULAAEYaAEnAAEY2NQAAAAAAWwGAwABGOsAEutg1AAAAAABbAWrAAEZVYMAAQrQXMAAngYg+AT0cwABGcRTAAEZpwAS+8AgAigMBAAEniiAAwABE+T4BPRzAAEasFMAARqTABL7wCACKAwEAASTAAEbgAieKIR7AAEbHwABBvgEAARbAAEbULonnvFvAAEItAADAAET5ScAARu41AAAAAABbAYHAAEbywAS7KDUAAAAAAFsBasAARwxgwABCtBUwACeBiD4CTsAARyTAAEcmAACDlmDAAESYASMUwABHKMAEvw0JACTAAEdEARbAAEc5LonnvFvAAEItJMAAR1MBgsAAR0jABLtaAWDAAESYPRzAAEdjFMAAR1vABL7wCACDcAEAASTAAEeIBSeKIhTAAEd6wATD9goAJ4Nmg8AAR33ABLvsJ4NoAMAARPZJwABHlhzAAEeohMAAR5rABLwGgX4BAAGTAMAAQ9c+AT0cwABHvhTAAEe2wAS+8AgAg3ABAAEkwABH4AIniiKCwABH1cAEu1oAwABE9knAAEfuNQAAAAAAWwGBwABH8sAEuyg1AAAAAABbAWrAAEgMYMAAQrQZMAAngYg+AT0cwABIJRTAAEgdwAS+8AgAg3ABAAEkwABIUQMniiKCwABIPMAEu1qDwABIR8AEu+wAwABE9j4BPRzAAEhvFMAASGfABL7wCACDcAEAASTAAEieBCeKIoLAAEiGwAS7WieKI4PAAEiUwAS77ADAAET2ScAASKyFwABIsMAEvh8+A07AAEjUwABI5QAAiiRgwABE4gEfwABI68AARQEAAAAARcAASQEBwABJCsAASQwAAILkYMAAQrQBkwE1AAAAAABbARTAAEkRwATFnwsANQAAAAAAWwEWwABJLBbAAEkVLonmvFvAAEIsggnAAEOHMAAngYgBFcAASTTABMWfCxzAAEk1FMAASTTABMWfCwCCCwEAAZQAwABD2T4CScAASUMcwABJSRTAAElHwATFnwsAgu8BAAGTAMAAQ+M+AT0cwABJaxTAAElawATFegoAg3ABAAEng28AwABE9j89NQAAAAAAWwEUwABJisAExXoKADUAAAAAAFsBHMAASbcWwABJoS6J5rxbwABCLIKNAQABFMAASbjABMWfCwAAwABDZzAAJ4GIPRzAAEnTFMAAScvABL7wCACDcAEAASTAAEoCBSeKJYLAAEnkwAS7WieDZhTAAEnwwATFegoAJ4NoAMAARPY/SsAAShABHMAASh8UwABKF8AEvvAIAIJ9AAAAAMAARPsGwABCOA6iNqJGt0kAAIJ9AWqiRmCTbCoAAAEDok63SQAAAAAAAABgwABEmAE+GUmimxyiqxainy6J6LxbwABCLoF+AQABKwDAAEQNPgFKoukBHKLwLon0vFsAAAAAwABCNz9OoxijIwAAiShgwABEmAEe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wABAiAAcriuAriDABMdhgX4BAAEngWgAwABEpz4DPRWuRsAEzUENKU6ucK51AACEs2DAAESYARyugRaudy6J57xbwABCLYJ9AAAAAMAARA49HK6iFK6bwATNJAwAigMBAAEkAAgnigoUrsPABM6hDgAnigsnigwnig0Ur1/ABM6hDgAnig4nig8AwABE+T4BPRyv0RSvysAEzSQMAIoDAQABJAAJJ4oQFq/tFq/jLonnvFvAAEItihHAAEQUJ4oSFLAhwATMtgsAJ4oGgLArwATHYSeGlBSwN8AEzIMKACeE4wDAAET5QrBnAAGwlWqwlWDAAEK0HgA+AT4DPRywuBSwscAEzSQMAIoDAQABJAAKJ4oTFrDjFrDZLonnvFvAAEItihHAAEQUJ4oUJ4oVFLETwATMtgsAJ4oGgLEdwATHYSeGlBSxKcAEzIMKACeE4wDAAET5PYixP8AEx2EksV8CJ4oWgLFUwATHYUKxawABsZlqsZlgwABCtBkAPgE+Aj0csb0UsbbABM0kDACKAwEAASQACieKFxSx0cAEzLYLACeKBoCx28AEx2EnhpQUsefABMyDCgAng/MnihgWshQuiee8W8AAQi0nihkAwABE+UKyLQABsltqsltgwABCtCUAPgE+Az0csoQUsn3ABM0kDACKAwEAASQACCeKGoCynsAEx2EnhpQUsqrABMyDCgAnihsnihwWstcuiee8W8AAQi0nihkAwABE+T2IsvDABMdhJLMOAieKHYCzA8AEx2FCsxoAAbNIarNIYMAAQrQXAD4BPgI9HLNvFLNowATNJAwAigMBAAEkAAgnih4Us4bABMy2CwAnigaAs5DABMdhJ4aUFLOcwATMgwoAJ4PzJ4ofAMAARPlCs8wASbPoHLPygbPswATHl4F+AQABarQHYMAAQrQXAMAAQ9c+AT0ctCIUtBvABM0kDACKAwEAASeKIADAAET5PgE9HLRcFLRVwATNJAwAigMBAAEktJACJ4ohHrR3wABBvgEAARa0hC6J57xbwABCLQAAwABE+Um0nhy0p4K0osAEx+iBfgEAAWq0vGDAAEK0FQDAAEPXPgROtNS01gAAg5ZgwABEmAEjFLTYwATNQQ0AJLT0ARa06S6J57xbwABCLSS1AwGAtPjABMdhAWDAAESYPRy1EhS1C8AEzSQMAINwAQABJLUrAieK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WyMABV/yAAVsXQAAABUCwABFVICZwAC//MAAwALAAawhA4r6AWrAAMACYJNsKgABYMAARAAAAWDAAEUZDQTAAEVXgJqCu4LgBYr7vFsAYMAAQO4BGoLOwABFcgTAAEVugJnAAMCFwADAiwmGfgBgwABEmAAEwABFWICZwADBc8AAwXwJivy8WwBgwABEmAAEwABFWYCZwADCfcAAwoIJhte8WwBgwABEmAAEwABFWoCZwADDQMAAw0UYdbxbAGDAAEK0AATAAEVvgJnAAMOYwADDnAmGZQBgwABEmAAEwABFW4CZwADD5MAAw+oJiv28WwBgwABEmAAEwABFXICZwADEOMAAxEEJiv68WwBgwABEmAAEwABFXYCZwADEl8AAxKQYiv+8WwBdwABDWAFgwABEmAErBMAARV6AmcAAxP7AAMUDGIsAvFsAYMAARJgBKwTAAEVfgJnAAMVhwADFbxiLAbxbAGDAAEK0ASsEwABFYICZwADFz8AAxd8YiwK8WwBdwABDiQJgwABEmGDAAESYASsEwABFYYCZwADF/cAAxhEYiwO8WwBdwABDiQJgwABEmF3AAENYAWDAAESYASsBBcAARceAmcAAx87AAMfOwADIPwCFPrxbAAPAAMfcwADIPwAAAAcHB8AAx+IAAASGfmDAAESYAMAAx+8AAASK/GDAAESYAMAAx/8AAASG12DAAESYAMAAyAsAAAR1YMAAQrQAwADIFwAABIZlYMAARJgAwADIKAAABIr9YMAARJgAwADINQAABIr+YMAARJgAAGDAAEVUAT8ICAHAAEVugADABW6WCAHAAEVYgQDABW6lCAHAAEVZggDABW60CAHAAEVagwDABW7DCAHAAEVvhADABW7RCAHAAEVbhQDABW7gCAHAAEVchgDABW7vCQHAAMfOwABEFgAAAAA4BsAARXKAmoLlgvWDJgEFiwS8WwFqAGCTepZ0AAABA4MIgyYAAAAAAAAAYMAAQO4ABsAARYqAmcAAyULAAMlKwADPDAQBiwYAAAABA8AAyVjAAM8MAAAACgoKwADJZwAAAIZgYMAARJgAwADJdgAAAIC7YMAAQrQAwADJhwAAAIC9YMAAQrQAwADJlgAAAIrNYMAAQrQAwADJqwAAAIrOYMAAQrQAwADJwAAAAIrPYMAAQrQAwADJ1QAAAIrQYMAAQrQAwADJ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AASGwADRisAFdgWTHsAA0ZS8mAEAAYbAANGowAV2BQCHwADRsMAFdhwAPRXAANHGwAV2OggewADR0cAARaUDAAMUwADR38AFdjoIAJMewADR7LyYAQABFMAA0gDABXY6CAAAAD2LwADSEMAFdboewADSF8AARZsCAAKDwADSIcAFdbqAwADSJ8AFdXUATsAA0jnAANJAAACLDGDAAEDuARzAANJKgMAA0kPABXV1gX4BAAEnitUAwABEp0nAANJaIhzAANJjgsAA0l7ABXWjgX4BAAErAMAARKcAIiIWwADSeIHAANJvwAV1jIOKwABEnwEhHMAA0ouDwADShsAFdbqBfgEAASsAwABD1wEUwADSlsAFd8YJAD4BPYrAANKnwAV1oycAP07AANLBwADSzgAAisVgwABA7gEhHMAA0taCwADS0cAFdaOBfgEAASsAwABEpz2MwADS5MAFddEewADS68AARaIGAAaEwADS/sAFddGTHsAA0we8mAEAAYTAANMbwAV10QCFwADTIsAFdeiAwADTMMAFdXUUwADTOMAFeGAKAABJwADTSyIiFsAA01aAwADTT8AFdXWCT8AARJ4AHMAA02aCwADTYcAFdaOBfgEAASsAwABEpwAhHMAA03eEwADTcsAFddGEgAEAASeGaQDAAESqPgJOwADTlcAA06EAAIsNYMAAQO4BIhbAANOqgMAA06PABXV1g4rAAESfASEcwADTvYLAANO4wAV1o4F+AQABKwDAAESnPYzAANPMwAV10R7AANPTwABFrwIAAoTAANPqwAV10RTAANPwwAV5MwsAAD4BPYzAANQRwAV10R7AANQYwABFrgEAAYTAANQrwAV10QBJwADUPCIcwADURYLAANRAwAV1o4F+AQABKwDAAESnABzAANRVhMAA1FDABXXRhIABAAEniw4AwABEqj4BPYrAANRvwAV1oycAP0rAANSEAR/AANSQwABFxwcAB4DAANSawAV1dYHAANSiwAV1jILAANSswAV1o4PAANSywAV1uoTAANS4wAV10YbAANS+wAV2BRTAANTFwAV2OggAAAbAAEV2gJnAANcqwADXNcAA10oBAIrBAAAAAQPAANc+wADXSgAAAAAAAABgwABEmAFKwADXQQEWwADXQS6K/LxbwABFWAbAAEV3gJnAANdPwADXWsAA1/EBAIrCAAAAAQPAANdfwADX8QAAAAAAAABgwABEmAE+A0nAANdlHMAA128WwADXaS6G17xbwABFWYF+AQABKwDAAESnSsAA13gBJwA/ScAA14ccwADXkRbAANeLLobXvFvAAEVZhIABAAEng48AwABEqj4BSsAA16oBHMAA17cWwADXsS6G17xbwABFWYPRAgAClBzAANfRFsAA18oWwADXxC6G17xbwABFWYIJwABEnILiAQABlADAAEPaAMAARK4/SsAA1+EBFsAA1+guhte8W8AARVkGwABFeICZwADX9sAA1/7AANhNAQCFbQAAAAEDwADYA8AA2E0AAAAAAAAAYMAAQrQBPgJJwADYCRzAANgTFsAA2A0udbxbwABFWoF+AQABKwDAAEPXSsAA2BwBHsAA2CPAAEWSAQABFsAA2DAuhn7AAEVuAD9KwADYPQEWwADYRC51vFvAAEVaBsAARZKAmcAA2ITAANiPwADZCQABiw+8WwAAAAEDwADYm8AA2QkAAAABAQHAANijAAAAhn5gwABEmAAAYMAAQrQBPgNJwADYsRzAANi8gMAA2LXABXxBgX4BAAEnitoAwABEp0rAANjHATdQP0nAANjWHMAA2OGAwADY2sAFfEGBfgEAASeK2wDAAESnSsAA2O0BN4G7P0rAANj9AZMGwABFeYCZwADZDsAA2RnAANkuAQCKwwAAAAEDwADZH8AA2S4AAAAAAAAAYMAARJgBSsAA2SIBNQAAAAEAYMAARJgBFsAA2SIuiv28W8AARVsjHMAA2SmAAMAFfOuBfgEAASsAACcAgADABXzrAWDAAESYBsAARXqAmcAA2TPAANk+wADZWQEAisQAAAABA8AA2UfAANlZAAAAAAAAAGDAAESYAUrAANlKATUAAAABAGDAAESYARbAANlKLor+vFvAAEVcIxzAANlUgADABX1egX4BAAErAAAnAIAAwAV9XgFgwABEmAbAAEWUgJnAAN7KwADe1sAA3zcAAYsQvFsAAAABA8AA3tvAAN83AAAAAwMDwADe4wAAAIZgYMAARJgAwADe7AAAAILhYMAAQrQAwADe+gAAAIUFYMAARJgAAFwBPgE9MMAA3wkfwADfD8AAQo8DAAOCwADfH8AFfeOAwADfKMAFfcWBwADfLcAFfdQABsAARY6AmcAA50LAAOdKwADoFQQBitUAAAABA8AA51PAAOgVAAAAAgEBwADnWwAAAIZlYMAARJgAAcAA52cAAACLEWDAAEDuAWoAYMAAQ70AYMAARVQBPgI9icAA53fABX5fIxzAAOeKgcAA54LABX5fgX4BAAErAMAARA0awADnmsAARXOBwADnp8AFfl8BYMAAQO5KwADntAEeAJM/AQFgwABFVAEjgcAA57vABX5fHsAA583AAEWaAgACgMAA5+HABX5PKgAewADn+MAARZkCAAKAwADoBcAFfk8qAAFbAAbAAEWPgJnAAOhDwADoS8AA6QkEAYsSAAAAAQPAAOhZwADpCQAAAAIBAcAA6GEAAACGZWDAAESYAAHAAOhtAAAAixFgwABA7gFqAGDAAEO9AGDAAEVUAT4CPYnAAOh9wAV/QSMcwADokIHAAOiIwAV/QYF+AQABKwDAAEQNGsAA6KDAAEVzgcAA6K3ABX9BAWDAAEDuSsAA6LoBHgCTPwEBYMAARVQBI4HAAOjBwAV/QR7AAOjLwABFmgIAAoDAAOjfwAV/MSkAHsAA6O3AAEWZAgACgMAA6PrABX8xKQABWwAGwABFc4CagyuDRINiAQF/vFsBaoNEYJNsKgAAAQODT4NiAAAAAAAAAGDAAEDuAUqDUgEag1LAAEVXBsAARZeAmcAA6ubAAOrtwADsngABixO8WwAAAAEDwADrEMAA7J4AAAADAgPAAOslAAAAixRdwABDWAFgwABEmADAAOs0AAAAixVgwABA7gDAAOtOAAAAixZgwABCtAFqAGDAAEK0FQBbAT4BRsAA62fAAOuYwADrcAAAAIsXYMAARJgAHMAA64SAwADre8AFgE+DiwEAAYLAAOuJwAWAcwDAAEMwPgFJwADroBzAAOusg8AA66TABYCYgwIBAAEewADrtcAAREEBAAEnixgAAMAARLU+AUnAAOvZgcAA693ABYBkPgE9MMAA6/gfwADr/sAAQecBAAEnixkAPgE9MMAA7EUfwADsS8AAQkYBAAEkwADsgQInixqDwADsecAFgJgAPwbAAEWYgJnAAOyjwADsqsAA7nIAAYsbvFsAAAABA8AA7MLAAO5yAAAAAgICwADsxwAAAIQCYMAAQrQAwADs1gAAAIsVYMAAQO4AAFsBPgJJwADs6yIiHMAA7P5qwADs8GDAAEK0ln2B0AEAAYDAAO0BwAWBcwDAAEPiABzAAO0WgMAA7Q3ABYFzgdABAAFqwADtGWDAAEK0loAAwABD4gEiHMAA7UJqwADtNGDAAEK0gvOB0AEAAYDAAO1FwAWBcwDAAEPiABzAAO1agMAA7VHABYFzgdABAAFqwADtXWDAAEK0loMAwABD4j4BSsAA7XUAP0nAAO2HgcAA7YvABYGCPgE9MMAA7aIfwADtqMAAQecBAAEcwADt2SeLHIILAQABHsAA7eLAAETBAQABgMAA7e/ABYFzAADAAEStAD4BPTDAAO4OH8AA7hTAAEJGAQABHMAA7kgnixyCCwEAAR7AAO5RwABEwQEAAYDAAO5ewAWBcwAAwABErQAGwABFmYCZwADud8AA7n7AAPBGAAGLHbxbAAAAAQPAAO6KwADwRgAAAAICAsAA7pIAAACGZWDAAESYAMAA7p0AAACLHmDAAEDuAABbAT4DTsAA7tTAAO7dAACLFF3AAENYAWDAAESYARzAAO7kgMAA7t/ABYLuiYwBAAFqwADu6mDAAESYloYAwABEu0nAAO70IiKBwADu+MAFgv0AFsAA7xSCwADvC8AFgxKDisAAQzsAFsAA7zAWwADvK4LAAO8iwAWDEoNswABDPYOKwABEnz4BPRzAAO9NgsAA70TABYMSgOMBAAEnAADAAENpP0nAAO97HMAA74SAwADvf8AFgu6EgAEAAWrAAO+PYMAARJiWhgDAAESqPgFKwADvvAEewADvw8AARYsCAAAChn4nitWLCoLAAO/lwAWDEj4BSsAA8BoBHsAA8CHAAEWLAQAAAYsKgsAA8DPABYMSBsAARZqAmcAA8EvAAPBSwAD6VwABix+8WwAAAAEDwADwZcAA+lcAAAACAgLAAPBtAAAAhmVgwABEmADAAPB4AAAAix5gwABA7gAAWwE+A0nAAPCPHMAA8JiAwADwk8AFhEuEgAEAASeLIADAAESqPgFJwADwtRzAAPC+gMAA8LnABYRLhIACAAIniyGXAMAARKo+AT2IwADw4MAFhEscwADw7IDAAPDnwAWES4PYAwADkzcHJ4ZoAMAARLo+Aj2IwADxHcAFhEscwADxKYDAAPEkwAWES4PRAQABlwDAAESuScAA8T8iIhzAAPFPFsAA8UiAwADxQ8AFhEuCCcAARJyBhAEAAZYAwABD4QEhHMAA8XUcwADxZ4DAAPFiwAWES4PPAQABlADAAESmgX4BAAFqwADxeGDAAEK0lm4AwABD1wEhHMAA8aEcwADxk4DAAPGOwAWES4PPAQABlQDAAESmgX4BAAFqwADxpGDAAEK0gdYAwABD1z4BPTDAAPG8H8AA8cLAAEHnAQABJ4siAD8+AT2IwADyOcAFhEscwADyRYDAAPJAwAWES4ZnAgACJ4ZpJ4ZoAMAARLhJwADygyIcwADykxbAAPKMgMAA8ofABYRLggnAAEScgu8BAAGUAMAAQ+MAHMAA8q0cwADyn4DAAPKawAWES4PPAQABlADAAESmgX4BAAFqwADysGDAAEK0lm4AwABD1z4GPR7AAPLAwABFmAIAAhzAAPLegMAA8tnABYRLg88BAAGTAMAARKYpAEnAAPL6IhzAAPMKFsAA8wOAwADy/sAFhEuCCcAARJyBfgEAAZUAwABD1wEhHMAA8yUcwADzF4DAAPMSwAWES4PPAQABlQDAAESmgX4BAAFqwADzKGDAAEK0gdYAwABD1z4BPTDAAPM+H8AA80TAAEHnAQABJ4sjAD9OwADzu8AA88gAAIsKXcAAQ1gBYMAARJgBHMAA88+AwADzysAFhEuJjAEAAWrAAPPVYMAARJiWiQDAAES7ScAA8+EigcAA8+XABYRaABbAAPQKFsAA9AWCwADz+MAFht2DbMAAQz2DisAARJ8+AT0cwAD0LYLAAPQgwAWG3YDjAQABJwAAwABDaT89HsAA9F/AAEWXAwADgsAA9IPABYbdKZQASsAA9KEBHsAA9KjAAEWLAgAAAoZ+J4rViwqCwAD0ysAFht0/ScAA9OQcwAD07YDAAPTowAWES4SAAQABasAA9PhgwABEmJaJAMAARKo+AUnAAPUGHMAA9Q+AwAD1CsAFhEuEgAIAAmrAAPUaYMAARJiWiZQAwABEqj4HTsAA9VzAAPVmAACK0GDAAEK0ARzAAPVtgMAA9WjABYRLiXUCAAInhmiVAMAARKtOwAD1jsAA9ZcAAIskYMAARJgBIxzAAPWwgsAA9abABYf7gYQBAAGTAMAAQ+EcwAD1vIDAAPW3wAWES4PRAQABlQDAAESuHMAA9dCAwAD1y8AFhEuD0QIAApWCwAD13cAFh/sAwABErgFgwABEmE7AAPX4wAD2AQAAiyVgwABEmAEjHMAA9g6CwAD2BMAFh/uBhAEAAZMAwABD4ScAHMAA9h+AwAD2GsAFhEuD0QEAARzAAPYzgsAA9inABYf7ggsBAAGUAMAAQ9kAwABErgFgwABEmE7AAPZFwAD2UgAAiwpdwABDWAFgwABEmAEcwAD2XYTAAPZUwAWImImMAQABasAA9mNgwABEmJaJAMAARLs9HsAA9nHAAEWXAgAChcAA9pXABYj+KQBJwAD2siKBwAD2tsAFhFoAFsAA9tsWwAD21oXAAPbJwAWI/oNswABDPYOKwABEnz4BPRzAAPcAhcAA9vPABYj+gOMBAAEnAADAAENpP0rAAPc2AR7AAPc9wABFiwMAAAOGfieK1YrCg8AA91fABYgqiwqFwAD3b8AFiP4+BE7AAPe6wAD3xwAAiwpdwABDWAFgwABEmAEcwAD3zoDAAPfJwAWES4mMAQABasAA99RgwABEmJaJAMAARLtJwAD34iKBwAD35sAFhFoAFsAA+AsWwAD4BoLAAPf5wAWJ0INswABDPYOKwABEnz4BPRzAAPgwgsAA+CPABYnQgOMBAAEnAADAAENpPz0ewAD4ZsAARZcCAAKCwAD4isAFidApAErAAPinAR7AAPiuwABFiwIAAAKGfieK1YsKgsAA+NDABYnQPgROwAD5FcAA+SIAAIsKXcAAQ1gBYMAARJgBHMAA+SmAwAD5JMAFhEuJjAEAAWrAAPkvYMAARJiWiQDAAES7PR7AAPk7wABFlwIAAoLAAPlfwAWKlykAScAA+XoiIoHAAPl+wAWEWgAWwAD5qILAAPmbwAWKl4OKwABDOwAWwAD50hbAAPnNgsAA+cDABYqXg2zAAEM9g4rAAESfPgE9HMAA+fWCwAD56MAFipeA4wEAAScAAMAAQ2k/SsAA+icBHsAA+i7AAEWLAQAAAYsKgsAA+kDABYqXBsAARZuAmcABB/3AAQgIwAEIsQABiya8WwAAAAEDwAEIEcABCLEAAAACAgLAAQgWAAAAhW1gwABCtADAAQgjAAAAhn5gwABEmAAAYMAAQrQBPgJJwAEIXyIhHMABCGiAwAEIY8AFi5iBfgEAASsAwABD1wAcwAEIeIDAAQhzwAWLmIF+AQABHsABCHvAAEWSAQABgcABCIjABYunAADAAEPXSsABCJEBKz9KwAEIogGAwAEIqcAFi5gGwABFnICZwAEKhMABCpLAAQ5TAAGLJ7xbAAAAAQPAAQqbwAEOUwAAAAQEBMABCqMAAACKwmDAAESYAMABCq0AAACAu2DAAEK0AMABCrgAAACAvWDAAEK0AMABCsIAAACLKGDAAEDuAABgwABEmAE+BUnAAQsgHMABCymAwAELJMAFjFGBfgEAASsAwABEp0rAAQsyASs/ScABC0McwAELTYHAAQtHwAWMYIF+AQABgsABC1DABYxvAMAAQ9dKwAELVQEnAD9JwAELrhzAAQvJHMABC7eAwAELssAFjFGDzwEAAYHAAQvCwAWMYADAAESmgX4BAAFqwAELzGDAAEK0lowAwABD1z4DScABC+MhHMABDAAcwAEL7IDAAQvnwAWMUYPPAQABHMABC/uCwAEL98AFjG+C4gEAAZQAwABD2gDAAESmgX4BAAFqwAEMA2DAAEK0lo8AwABD1z4BPR7AAQwdwABFlAMAA4DAAQwjwAWMUYHAAQwpwAWMYCeLKQA/PR7AAQxrwABFUwMAA4DAAQx8wAWMURzAAQyIgcABDILABYxgggsBAAGUAMAAQ9kcwAEMkYLAAQyNwAWMb4LiAQABlADAAEPaAErAAQzVARzAAQz3HMABDOGAwAEM3MAFjFGD0QIAAoHAAQzrwAWMYILAAQzywAWMbwDAAESuiZAAAAAAwABEvT9JwAENECGDwAENFcAFjH4+AUXAAQ1rAcABDXTAAQ12AACC5GDAAEK0AYHAAQ14wAWMYAEcwAENgYTAAQ1/wAWORoGEAQABgsABDYPABYxvAMAAQ+EBjMABDYjABY5GHMABDYmEwAENiMAFjkaCCwEAAZQAwABD2T4BScABDZccwAENrhzAAQ2ggMABDZvABYxRg88BAAGEwAENq8AFjkYAwABEpoF+AQABasABDbFgwABCtJZuAMAAQ9c+Aj0ewAENycAARVMDAAOAwAEN2sAFjFGBwAEN4MAFjGCCwAEN58AFjG8ASsABDfcBJMABDgcDJ4OPgMABDgHABYxRJ4OQPz9KwAEOJQEewAEOLMAARZ4DAAOAwAEOPsAFjFGBwAEORMAFjGCCwAEOS8AFjG8ABsAARZ2AmcABDljAAQ5kwAEO0QABiyq8WwAAAAEDwAEOcsABDtEAAAABAQHAAQ53AAAAg85gwABCtAAAYMAAQO4BPgFKwAEOgwEiHMABDo+AwAEOisAFj4uBhAEAATd/AMAAQ+EAIRzAAQ7JHMABDrIcwAEOpmrAAQ6ZXcAAQ1gBYMAAQrSWnIKNAQABHMABDqyAwAEOp8AFj4uDKAEAAZcAwABC0QDAAENngX0BAAEcwAEOt5SC7gEAARzAAQ7AgMABDrvABY+LgX0BAAE3DwDAAELMAMAAQtAAwABCzIF+AQABkwDAAEPXBsAARZ6AmcABD+XAAQ/zwAEZ0AABiyu8WwAAAAEDwAEQBMABGdAAAAADAwPAARAMAAAAisJgwABEmADAARAWAAAAgLtgwABCtADAARAhAAAAgL1gwABCtAAAYMAARJgBPghOwAEQOQAAAINyYMAAROIATsABEEnAARBWAACLLGDAAEK0AYHAARBYwAWQhE7AARBnwAEQbQAAguFgwABCtAGBwAEQb8AFkIROwAEQzMABENkAAIstYMAAQO4BKUPAARDmHMABEPOFwAEQ7cAFkNiBhAEAAYLAARD1wAWQkwDAAEPhQT4CTsABEQbAARELAACDzmDAAEK0ARzAARESgMABEQ3ABZB1g88BAAGFwAERHcAFkNgAwABEpknAARErHMABETSHwAERL8AFkTGBfgEAAWrAARE3YMAAQrSBvgDAAEPXPgxOwAERlcABEaEAAIGRYMAARJgBHsABEaPAAEWmAwADgMABEbTABZB1hcABEbrABZDYKQBJwAER0CIcwAER4BTAARHUwAWRkAgAgX4BAAErAMAARKcAhsABEevABZD0PgI9jcABEgXABZDYHMABEguFwAESBcAFkNiCCwEAAZYAwABD2ULAARIbAD89IxzAARI+g8ABEjfABZCsgX4BAAErAMAARA2LwAESN8AFkKwfwAESQsAARQEAAAAAKwFgwABE4k7AARJhwAESZwAAikhgwABEmAEcwAESboDAARJpwAWQdYPRAgAChMABEnjABZC8hcABEobABZDYAMAARK5JwAESliGGwAESm8AFkPQ9FcABEqnABZJSCRzAARK3FMABErHABZJSCQCJkAAAAADAAES9Pz0cwAES1YPAARLOwAWQrINwAQABFMABEtvABZJSCQAAwABE9k7AARLvwAES/AAAiy5gwABCtAGWScABEwkcwAETGRTAARMNwAWRkAgAgX4BAAErAMAARKc+AT0VwAETLsAFkZAIHMABE0GAwAETPMAFkHWD0QIAAoXAARNLwAWQ2BzAARNYhcABE1LABZDYggsBAAGWAMAAQ9kAwABErknAARNtHMABE30UwAETccAFkZAIAIF+AQABJ4PVAMAARKc+Aj0VwAETkcAFkZAIJ4svPRXAAROwwAWS6AqUPz0cwAET24PAARPUwAWQrINwAQABFMABE+HABZGQCAAAwABE9j2NwAET98AFkNgcwAET/YXAARP3wAWQ2IILAQABFMABFADABZLoCgAAwABD2T2MwAEUFsAFkLyFwAEUJcAFkNg9jsABFDTABZD0KUnAARRWHsABFFrAAEWdAQABh8ABFGnABZExAD4CScABFHoiIobAARR+wAWQ9AAcwAEUnGrAARSOYMAAQrSWfYHQAQABh8ABFJ/ABZExAMAAQ+IAHMABFLVqwAEUp2DAAEK0loCB0wEAAYfAARS4wAWRMQDAAEPkPgM9IxzAARUeg8ABFRfABZCsgX4BAAErAMAARA2LwAEVF8AFkKwfwAEVIsAARQEAAAAAKwFgwABE4knAARU8HMABFU2EwAEVQMAFkLyBhAEAAYXAARVPwAWQ2ADAAEPhPgI9HMABFWuDwAEVZMAFkKyDcAEAARzAARV2gMABFXHABZB1g9ECAAKEwAEVgMAFkLyFwAEVjsAFkNgAwABErgDAAET2PYzAARWjwAWQvIXAARWywAWQ2D89jsABFc/ABZD0Kj89jcABFffABZDYHMABFfyFwAEV98AFkNiCCwEAAZQAwABD2UnAARYNHsABFhHAAEWrAQABh8ABFiXABZExAD4BPR7AARY2wABFlAMAA4DAARY8wAWQdYXAARZCwAWQ2CeLMAA+CU7AARZ6wAEWhwAAiy5gwABCtAGUScABFpQiHMABFqgcwAEWnofAARaZwAWRMYF9AQABN8AA/AAAwABCzIF+AQABN8AA2AAAwABD1wAcwAEWwRzAARa8hcABFrbABZDYggsBAAGUAMAAQ9mBhAEAAYLAARbDwAWQkwDAAEPhPgJOwAEW2MABFt0AAIRrYMAAQrQBHMABFuSAwAEW38AFkHWDzwEAARzAARb1hcABFu/ABZDYggsBAAGUAMAAQ9kAwABEpknAARcFHMABFxkcwAEXDxTAARcKwAWWMQkAgX0BAAE3wAD8AADAAELMgX4BAAE3wADcAADAAEPXPgI9j8ABFzLABZExHMABF1ocwAEXQTfAAQAAgZkBAAEcwAEXUxzAARdKh8ABF0XABZExgX0BAAE3g/8AwABCzILuAQABNwoAwABC0ADAAELNgZkBAAEcwAEXYhTAARddwAWWMQkAgX0BAAE3g/8AwABCzADAAELNPRXAARd4wAWVsgiVPz89IxzAARevg8ABF6jABZCsgX4BAAErAMAARA2LwAEXqMAFkKwfwAEXs8AARQEAAAAAKwFgwABE4k7AARfSwAEX2AAAikhgwABEmAEcwAEX34DAARfawAWQdYPRAgAChMABF+nABZC8hcABF/fABZDYAMAARK5JwAEYByGGwAEYDMAFkPQ9FcABGBrABZdrCRzAARgoFMABGCLABZdrCQCJkAAAAADAAES9Pz0cwAEYRoPAARg/wAWQrINwAQABFMABGEzABZdrCQAAwABE9j0cwAEYY4PAARhcwAWQrINwAQABHsABGGnAAEWnAQABh8ABGHXABZExAADAAET2PY3AARiFwAWQ2BzAARiLhcABGIXABZDYggsBAAEUwAEYjsAFlbIIAADAAEPZPYzAARikwAWQvIXAARizwAWQ2EnAARjMHMABGNeDwAEY0MAFkKyBfgEAASsAwABEDUrAARjgARzAARjsgMABGOfABZB1g9ECAAKBwAEY9sAFkISCwAEY/cAFkJMAwABErj9JwAEZBxzAARkYhMABGQvABZC8gYQBAAGCwAEZGsAFkJMAwABD4T4DTsABGS7AARk0AACKSGDAAESYARzAARk7gMABGTbABZB1g9ECAAKEwAEZRcAFkLyCwAEZU8AFkJMAwABErknAARlfIYbAARlkwAWQ9D2PwAEZcsAFmOccwAEZgIfAARl6wAWY54mQAAAAAMAARL0/PRzAARmcg8ABGZXABZCsg3ABAAGHwAEZosAFmOcAwABE9j9KwAEZtAEcwAEZwoPAARm7wAWQrIJ9AAAAAMAARPsGwABFn4CZwAEaa8ABGnnAAR1xAAGLMbxbAAAAAQPAARqEwAEdcQAAAAMDA8ABGowAAACGfmDAAESYAMABGpgAAACAu2DAAEK0AMABGqMAAACAvWDAAEK0AABgwABEmAE+CEnAARquHMABGriBwAEassAFmdGBfgEAAYLAARq7wAWZ4ADAAEPXSsABGsABJwA/TsABGtnAARrnAAGLMmDAAEK0ARzAARrwgMABGunABZnCg88BAAGBwAEa+8AFmdEAwABEpknAARsHIR7AARsMwABFugEAAYPAARsjwAWaKAA+AT0ewAEbO8AARZQDAAOAwAEbQcAFmcKBwAEbScAFmdEnizMAP07AARuRwAEbowAAizRgwABA7gEqRcABG7ABwAEbucABG7sAAILkYMAAQrQBgcABG73ABZnRARzAARvGhcABG8TABZq3gYQBAAGCwAEbyMAFmeAAwABD4QGNwAEbzcAFmrccwAEbzoXAARvNwAWat4ILAQABlADAAEPZPgNOwAEb5MABG+0AAYRKYMAAQrQBHMABG/aAwAEb78AFmcKDzwEAAYXAARwBwAWatwDAAESmScABHAshHsABHBDAAEWqAQABhsABHCPABZsaAD4BPR7AARw4wABFlAMAA4DAARw+wAWZwoXAARxGwAWatyeLNQA/ScABHHQiHMABHIZqwAEceGDAAEK0ln2B0AEAAYbAARyJwAWbGgDAAEPiABzAARyehsABHJXABZsagdABAAFqwAEcoWDAAEK0loAAwABD4j4BPYzAARy6wAWanik/PYjAARzmwAWZwhzAARz2gMABHO/ABZnCg9ECAAKBwAEdAMAFmdGCwAEdB8AFmeAAwABErknAAR0RhMABHRXABZqePYjAAR0owAWZwhzAAR04gMABHTHABZnCiZAAAAAAwABEvT9KwAEdSwEewAEdUsAARaABAAGAwAEdZsAFmcIABsAARaCAmcABHevAAR35wAEe3wABiza8WwAAAAEDwAEeDMABHt8AAAABAQHAAR4UAAAAhn5gwABEmAAAYMAARJgBPgVJwAEeIhzAAR4tgMABHibABZyZgX4BAAEnitoAwABEp0rAAR44ASeK2j9JwAEeSxzAAR5WgMABHk/ABZyZgX4BAAEnitUAwABEp0rAAR5hASeK1T9JwAEedBzAAR5/gMABHnjABZyZgX4BAAEnitsAwABEp0rAAR6LASeK2z9JwAEenxzAAR6qgMABHqPABZyZgX4BAAEnho8AwABEp0rAAR64ASeGjz9KwAEezgGAwAEe1cAFnJkGwABFoYCZwAEe5MABHvLAAR+WAAGLN7xbAAAAAQPAAR7/wAEflgAAAAMDA8ABHwcAAACKwWDAAESYAMABHxUAAACAu2DAAEK0AMABHyAAAACAvWDAAEK0AABgwABEmAE+AknAAR8rHMABHziAwAEfL8AFnZSBfgEAASsAwABEp0rAAR9BAScAP0rAAR9QAR7AAR9XwABFqAQABIDAAR9twAWdlIHAAR93wAWdo4LAAR9+wAWdsmrAAR+DXcAAQ1gBYMAAQrSWuwAGwABFooCZwAEfm8ABH6nAASNIAAGLOLxbAAAAAQPAAR+ywAEjSAAAAAYGBsABH7oAAACGZWDAAESYAMABH8QAAACAu2DAAEK0AMABH88AAACAvWDAAEK0AMABH+sAAACLCl3AAEMWAWDAAESYAMABIAAAAACGfmDAAESYAMABIA0AAACKxWDAAEDuAABgwABEmAE+CU7AASAmwAEgLQAAiwxgwABA7gEcwAEgN4TAASAwwAWen4F+AQABJ4rVAMAARKdOwAEgTMABIF8AAIs5YMAAQO4BIobAASBhwAWexwGFwAEga8AFnq5JwAEgfSIcwAEghoDAASCBwAWeXYF+AQABKwDAAESnABzAASCeg8ABIJHABZ6KgX4BAAErAMAARA1KwAEgpwEjhsABIK7ABZ7HJ4ZpJwABYMAARJg/ScABIMUiIRzAASDOgMABIMnABZ5dgX4BAAErAMAARKcAIRzAASDmg8ABINnABZ6KgX4BAAErAMAARA0+AT0wwAEg9x/AASD9wABB5wEAASeLOgA/TsABIUUAAACBs2DAAESYAEnAASFRIRzAASFagMABIVXABZ5dgX4BAAErAMAARKc+AT0VwAEha8AFn8UIHsABIXTAAEWoBQAEgMABIYrABZ5dgcABIZDABZ5sgsABIZfABZ57asABIZxdwABDWAFgwABCtJbWAYs7KT4BPRXAASHpwAWfxQgcwAEiTBzAASIKg8ABIfLABZ6KgwABAWDAAESYATTAASIOA8ABIg7AASI/AAAAAQEBwAEiDwAAAIHwYMAARJgAAGDAAESYAUrAASIVAR7AASIVwABFtwQABGrAASIgXcAAQ1gBYMAAQrSW6xTAASIwwAWgewkAasABIjNgkaCJOioAAMAAQyGEuAEAASeGaQDAAEMqScABImEWwAEibBTAASJlwAWfxQgAgk/AAESePgFJwAEifYbAASKBwAWex0rAASKJASeGaT9JwAEioCKHwAEipMAFnvUAIRzAASLCFMABIrvABZ/FCACEgAEAASeGaQDAAESqPgE9FcABItvABZ/FCBzAASLoJ4ZpggsBAAEUwAEi6sAFn8UIAADA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PYnAATInwAWrvR7AATIzvL0BAWDAAEK0AZYAPRzAATJLgcABMkLABau9guUCAAKTasABMlFgwABCtIG+AMAAQ2g9HMABMmqBwAEyYcAFq72C5QIAApQcwAEye2rAATJwYMAARJiXG4PPAQABHMABMouAwAEyhsAFq32DKAEAAZcAwABC0QDAAESmAMAAQ2g9HMABMqGBwAEymMAFq72C5QIAApUcwAEysmrAATKnYMAARJiXG4PPAQABHMABMsKAwAEyvcAFq32BfQEAATcPAMAAQswAwABEpgDAAENoPgZOwAEzJcABMyoAAItJYMAAQrQBN4DATsABM3DAATN9AACLSmDAAEK0AZVJwAEziBzAATORgMABM4zABat9gu8BAAE3h/8AwABD4z4DPYrAATOkwAWs1TeA4D2LwAEzucAFrOuWScABM9McwAEz3IDAATPXwAWrfYLvAQABN8AA//8AwABD4z4CPYvAATPywAWs65c9isABNA7ABazVN4DwPz89icABNDPABau9HsABND+8vQEBYMAAQrQBHMABNEaWgykBAAGDwAE0SMAFrOsAwABD2wBOwAE0YcABNGcAAILhYMAAQrQBk0PAATRyHMABNIiLwAE0e8AFrOscwAE0eYPAATR7wAWs64LiAQABlADAAEPagdMBAAGTAMAAQ+Q+Bk7AATScwAE0oQAAi0tgwABCtAEcwAE0yRzAATTBHMABNKqAwAE0pcAFq32DKAEAARzAATSwNwaDKQEAAYPAATSywAWs6wDAAEPbAMAAQtGBfQEAATc/AMAAQsyBmQEAAYLAATTLwAWs1QDAAELNPRzAATTigcABNNnABau9guUCAAKEwAE048AFrapqwAE07GDAAEK0gb4AwABDaD0cwAE1B4HAATT+wAWrvYLlAgACHMABNQ6EwAE1CMAFraqCCwEAAZQAwABD2RzAATUgasABNRVgwABEmJcbg88BAAEcwAE1MIXAATUrwAWt94MoAQABlwDAAELRAMAARKYAwABDaD0cwAE1SIHAATU/wAWrvYLlAgACHMABNU+EwAE1ScAFraqCCwEAAZUAwABD2RzAATVhasABNVZgwABEmJcbg88BAAEcwAE1cYXAATVswAWt94F9AQABNw8AwABCzADAAESmAMAAQ2g9jMABNYHABa2qHMABNYeEwAE1gcAFraqCCwEAAZYAwABD2T2KwAE1lcAFrNU3gIBKwAE13wEewAE17cAARMABAAGBwAE1+8AFq70ABsAARaiAmcABNwDAATcOwAE4JQABi0y8WwAAAAEDwAE3I8ABOCUAAAAFBATAATcyAAAAit5gwABEmADAATdBAAAAgLtgwABCtADAATdMAAAAgL1gwABCtADAATdbAAAAi01dwABDWAFgwABCtAABwAE3cgAAAIs7YMAAQO4BagBgwABA7i9gwABEmAE+AUrAATeTATUAAAABAGDAAESYAR7AATeawABFqQUABIDAATelwAWv14HAATewwAWv5oLAATe3wAWv9YPAATe8wAWwBAGLO4TAATflwAWwGiMcwAE394UAwAWwQIF+AQABKwAAHMABOAyAwAE4AsAFr9eD0QIAAoHAATgWwAWv5oLAATgdwAWv9QDAAESuhQDABbBAAWDAAESYBsAARamAmcABOb7AATnMwAFBqAABi068WwAAAAEDwAE51sABQagAAAAFBATAATnlAAAAit5gwABEmADAATn0AAAAgLtgwABCtADAATn/AAAAgL1gwABCtADAAToOAAAAi01dwABDWAFgwABCtAABwAE6JQAAAIs7YMAAQO4BagBgwABA7i9gwABEmAE+B07AATpTAAAAg3JgwABE4gBOwAE6Y8ABOnAAAIssYMAAQrQBgcABOnLABbEMTsABOoHAATqHAACC4WDAAEK0AYHAATqJwAWxDEPAATrfHMABOuyHwAE65sAFsYyBhAEAAYLAATruwAWxGwDAAEPhQT4CTsABOv/AATsEAACDzmDAAEK0ARzAATsQgMABOwbABbD9g88BAAGHwAE7G8AFsYwAwABEpknAATspIhzAATsyFMABOy3ABbHRCACBhAEAATd/AMAAQ+EAIRzAATtpHMABO1EcwAE7RYPAATs8wAWxKoKNAQABHMABO0sUwAE7RsAFsdEIAIMoAQABlwDAAELRAMAAQ2eBfQEAARzAATtWlILuAQABHMABO18UwAE7WsAFsdEIAIF9AQABNw8AwABCzADAAELQAMAAQsyBfgEAAZMAwABD1z4BPY/AATt5wAWxjBzAATt+h8ABO3nABbGMggsBAAGUAMAAQ9k+CE7AATugAAAAgZFgwABEmABOwAE7uQAAAIsuYMAAQrQAScABO88cwAE72BTAATvT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AVQrwAFUMAAAg85gwABCtAEcwAFUN4DAAVQywAXDt4PPAQABgcABVELABcQpAMAARKZJwAFUThzAAVRXgsABVFLABcSPgX4BAAFqwAFUWmDAAEK0lm4AwABD1z4BSsABVG4BJMABVKkDHMABVH2AwAFUeMAFw7eD0QIAApOBwAFUisAFxCkAwABErieLXxzAAVSXgMABVJLABcO3g9EBAAEcwAFUo4HAAVShwAXEKYILAQABlADAAEPZAMAARK4/ScABVL0iHMABVMaCwAFUwcAFxI+C7wEAATd/AMAAQ+MBHMABVQ0cwAFU9RzAAVTpasABVN1dwABDWAFgwABCtJckgo0BAAEcwAFU74LAAVTqwAXEj4MoAQABlwDAAELRAMAAQ2eBfQEAARzAAVT6lILuAQABHMABVQOCwAFU/sAFxI+BfQEAATcPAMAAQswAwABC0ADAAELMgX4BAAGTAMAAQ9c+AULAAVUgAD8/SsABVUMBgMABVUrABcO3BsAARcCAmcABVVfAAVVbwAFVpgAAhnUAAAABA8ABVWLAAVWmAAAAAQEBwAFVagAAAIrKYMAARJgAAGDAAEUZAT4BSsABVXsBHMABVYIuhnYBAAEewAFVkcAARUcBAAGAwAFVl8AFxjcAAMAARcEGwABFwYCZwAFVq8ABVa/AAWHcAACGdgAAAAEDwAFVucABYdwAAAABAQHAAVW+AAAAispgwABFGQAAYMAARRkBPglOwAFV7AAAAItgYMAARJgATsABVgXAAVYUAACLYWDAAESYAScATsABViUAAACLYmDAAESYAE7AAVY5AAAAi2NgwABCtABOwAFWUAAAAItkYMAARJgATsABVmcAAACLZWDAAESYAEnAAVZ4FsABVo0WwAFWhoDAAVZ8wAXGpYZ+wABFH4OKwABEnz4EPYnAAVahwAXGvhbAAVa6gMABVrDABcalhn7AAEUfScABVsgWwAFW1oDAAVbMwAXGpYrFwABFLD4DPYrAAVbuwAXGzhbAAVcJgMABVv/ABcalisHAAEUhPYvAAVcbwAXG4xbAAVcygMABVyjABcalisLAAEUiPYzAAVdAwAXG8yMWwAFXV4DAAVdNwAXGpYrGwABFLRbAAVdrgMABV2HABcalhW3AAEUjKwFgwABCtD89jcABV4bABccDHsABV5PAAEWuAQABFsABV7CA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abxbAQABgMABcMXABdGfAMAARbM/PRzAAXDXgMABcNTABdGfg3ABAAEWwAFw3S6GZcAARW8AwABE9knAAXDoIRzAAXDzFsABcOwuiv28W8AARVuBfgEAASsAwABEpz01wAFw/AAAAQBgwABE4gGAwAFw/MAF0Z81AAAAAQBbARzAAXEAgcABcP7ABdMAg3ABAAEni2wAwABE9jUAAAABAFsBHMABcQyBwAFxCsAF0wCDcAEAARbAAXESLor9vFvAAEVbAMAARPaBAMAF0wA/ScABcR8hHMABcS0WwAFxIy6K/rxbwABFXIF+AQABKwDAAESnPTXAAXE2AAABAGDAAETiAYDAAXE2wAXRnzUAAAABAFsBHMABcTqBwAFxOMAF05WDcAEAASeLbQDAAET2NQAAAAEAWwEcwAFxRoHAAXFEwAXTlYNwAQABFsABcUwuiv68W8AARVwAwABE9oEAwAXTlT9KwAFxXAEcwAFxZoDAAXFjwAXRn4J9AAAAAMAARPsGwABFxICZwAFxecABcYfAAXNKAwCBfgAAAAEDwAFxicABc0oAAAABAQHAAXGRAAAAgkFgwABEAAAAYMAAQO4BPgJJwAFxnh7AAXGivJkCAAIugMABcbLABdRMAErAAXG6ASk/SsABccsBIiIiIiIiIiIiIiXAAXHYgMABcdLABdRMYMAARRkAHMABcfEWwAFx6i6GfsAARW6BfgEAARbAAXH6FMABcfTABdRMAAFgwABFGYZ+wABFHwDAAESnABzAAXIZFsABcgwuisXAAEWAgX4BAAEWwAFyIhTAAXIcwAXUTAABYMAARRmKxcAARSwAwABEDQAcwAFyQxbAAXI6LorBwABFdoF+AQABFsABckwUwAFyRsAF1EwAAWDAAEUZisHAAEUhAMAARKcAHMABcmUWwAFyYC6KwsAARXeBfgEAARbAAXJuFMABcmjABdRMAAFgwABFGYrCwABFIgDAAESnABzAAXKDFsABcn4uhW3AAEV4gX4BAAEWwAFyjBTAAXKGwAXUTAABYMAARRmFbcAARSMAwABD1wAcwAFyoRbAAXKcLoZlwABFb4F+AQABFsABcqoUwAFypMAF1EwAAWDAAEUZhmXAAEUkAMAARKcAHMABcsMWwAFyui6Kx8AARYKBfgEAARbAAXLMFMABcsbABdRMAAFgwABFGYrHwABF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ACeE4RzAAilLasACKUBgwABCtBmBmQEAAWrAAilNYMAAQrRCAMAAQs0AAD0cwAIpY4LAAilbwAYB74FoAwADHgCTPwEBYKpOAYTAAilkwAYEYwAnhmkcwAIpdGrAAilsYMAAQrSB4oGZAQABasACKXZgwABCtJevAMAAQs0AAD0cwAIpjILAAimEwAYB74FoAwADHgCTPwEBYKpOAYTAAimNwAYEYwAni2wcwAIpm2rAAimVYMAAQrSB6IGZAQABasACKZ1gwABCtJe2AMAAQs0AAD0cwAIptILAAimswAYB74FoAwADHgCTPwEBYKpOAYTAAim1wAYEYwAni20cwAIpxmrAAim9YMAAQrSB7oGZAQABasACKchgwABCtJe6AMAAQs0AAD2MwAIp28AGBGMcwAIp5IHAAinfwAYBM4FoAgACasACKeVgwABCtIqjHMACKgRqwAIp92DAAEK0HoGZAQABasACKgZgwABCtJevAMAAQs0AAD0cwAIqHILAAioUwAYB74FoAwADHgCTPwEBYKpOAYTAAiodwAYEYwBqwAIqIGDAAESYl7NqwAIqJ2DAAEK0HgAAPRzAAipAgsACKjjABgHvgWgDAAMeAJM/AQFgqk4BhMACKkHABgRjACeD1RzAAipWasACKklgwABCtB6BmQEAAWrAAipYYMAAQrSXrwDAAELNAAA9HMACKm6CwAIqZsAGAe+BaAMAAx4Akz8BAWCqTgGEwAIqb8AGBGMAJ4ThHMACKoJqwAIqd2DAAEK0GYGZAQABasACKoRgwABCtEIAwABCzQAAPRzAAiqagsACKpLABgHvgWgDAAMeAJM/AQFgqk4BhMACKpvABgRjACeGaWrAAiqjYMAAQrSB3AAAPRzAAiq6gsACKrLABgHvgWgDAAMeAJM/AQFgqk4BhMACKrvABgRjACeLbBzAAirJasACKsNgwABCtIHogZkBAAFqwAIqy2DAAEK0l7YAwABCzQAAPRzAAirigsACKtrABgHvgWgDAAMeAJM/AQFgqk4BhMACKuPABgRjACeLbRzAAir0asACKutgwABCtIHugZkBAAFqwAIq9mDAAEK0l7oAwABCzQAAPYzAAisJwAYEYxzAAisSgcACKw3ABgEzgWgCAAJqwAIrE2DAAEK0HhzAAisuasACKyFgwABCtB6BmQEAAWrAAiswYMAA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cnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gVGVzdCBwcm9ncmFtIGZvciBEYXJ0IEFPVCAoZGFydDJhb3QsIGRhcnRhb3RydW50aW1lKS4KCm1haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKICBwcmludCgnSGVsbG8sIOS4lueVjC4nKTsKfQoMABROTjwBOQEgFwIBVWZpbGU6Ly8vdXNyL2xvY2FsL2dvb2dsZS9ob21lL2Nza2F1L3NyYy90ZXN0X21hdHJpeC9zZGsvdG9vbHMvYm90cy9kYXJ0X2FvdF90ZXN0LmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL2FzeW5jLmRhcnSRXy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovKioKICogU3VwcG9ydCBmb3IgYXN5bmNocm9ub3VzIHByb2dyYW1taW5nLAogKiB3aXRoIGNsYXNzZXMgc3VjaCBhcyBGdXR1cmUgYW5kIFN0cmVhbS4KICoKICogVW5kZXJzdGFuZGluZyBbRnV0dXJlXXMgYW5kIFtTdHJlYW1dcyBpcyBhIHByZXJlcXVpc2l0ZSBmb3IKICogd3JpdGluZyBqdXN0IGFib3V0IGFueSBEYXJ0IHByb2dyYW0uCiAqCiAqIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICoKICogIyMgRnV0dXJlCiAqCiAqIEEgRnV0dXJlIG9iamVjdCByZXByZXNlbnRzIGEgY29tcHV0YXRpb24gd2hvc2UgcmV0dXJuIHZhbHVlCiAqIG1pZ2h0IG5vdCB5ZXQgYmUgYXZhaWxhYmxlLgogKiBUaGUgRnV0dXJlIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb21wdXRhdGlvbgogKiB3aGVuIGl0IGNvbXBsZXRlcyBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS4KICogRnV0dXJlcyBhcmUgb2Z0ZW4gdXNlZCBmb3IgcG90ZW50aWFsbHkgbGVuZ3RoeSBjb21wdXRhdGlvbnMKICogc3VjaCBhcyBJL08gYW5kIGludGVyYWN0aW9uIHdpdGggdXNlcnMuCiAqCiAqIE1hbnkgbWV0aG9kcyBpbiB0aGUgRGFydCBsaWJyYXJpZXMgcmV0dXJuIEZ1dHVyZXMgd2hlbgogKiBwZXJmb3JtaW5nIHRhc2tzLiBGb3IgZXhhbXBsZSwgd2hlbiBiaW5kaW5nIGFuIEh0dHBTZXJ2ZXIKICogdG8gYSBob3N0IGFuZCBwb3J0LCB0aGUgYGJpbmQoKWAgbWV0aG9kIHJldHVybnMgYSBGdXR1cmUuCiAqCiAqICAgICAgSHR0cFNlcnZlci5iaW5kKCcxMjcuMC4wLjEnLCA0NDQ0KQogKiAgICAgICAgICAudGhlbigoc2VydmVyKSA9PiBwcmludCgnJHtzZXJ2ZXIuaXNCcm9hZGNhc3R9JykpCiAqICAgICAgICAgIC5jYXRjaEVycm9yKHByaW50KTsKICoKICogW0Z1dHVyZS50aGVuXSByZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJ1bnMKICogd2hlbiB0aGUgRnV0dXJlJ3Mgb3BlcmF0aW9uLCBpbiB0aGlzIGNhc2UgdGhlIGBiaW5kKClgIG1ldGhvZCwKICogY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KICogVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBvcGVyYXRpb24KICogaXMgcGFzc2VkIGludG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgogKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBgYmluZCgpYCBtZXRob2QgcmV0dXJucyB0aGUgSHR0cFNlcnZlcgogKiBvYmplY3QuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBwcmludHMgb25lIG9mIGl0cyBwcm9wZXJ0aWVzLgogKiBbRnV0dXJlLmNhdGNoRXJyb3JdIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQKICogcnVucyBpZiBhbiBlcnJvciBvY2N1cnMgd2l0aGluIHRoZSBGdXR1cmUuCiAqCiAqICMjIFN0cmVhbQogKgogKiBBIFN0cmVhbSBwcm92aWRlcyBhbiBhc3luY2hyb25vdXMgc2VxdWVuY2Ugb2YgZGF0YS4KICogRXhhbXBsZXMgb2YgZGF0YSBzZXF1ZW5jZXMgaW5jbHVkZSBpbmRpdmlkdWFsIGV2ZW50cywgbGlrZSBtb3VzZSBjbGlja3MsCiAqIG9yIHNlcXVlbnRpYWwgY2h1bmtzIG9mIGxhcmdlciBkYXRhLCBsaWtlIG11bHRpcGxlIGJ5dGUgbGlzdHMgd2l0aCB0aGUKICogY29udGVudHMgb2YgYSBmaWxlCiAqIHN1Y2ggYXMgbW91c2UgY2xpY2tzLCBhbmQgYSBzdHJlYW0gb2YgYnl0ZSBsaXN0cyByZWFkIGZyb20gYSBmaWxlLgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgb3BlbnMgYSBmaWxlIGZvciByZWFkaW5nLgogKiBbU3RyZWFtLmxpc3Rlbl0gcmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBydW5zCiAqIGVhY2ggdGltZSBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlLgogKgogKiAgICAgU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtID0gbmV3IEZpbGUoJ3F1b3Rlcy50eHQnKS5vcGVuUmVhZCgpOwogKiAgICAgc3RyZWFtLnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpLmxpc3RlbihwcmludCk7CiAqCiAqIFRoZSBzdHJlYW0gZW1pdHMgYSBzZXF1ZW5jZSBvZiBhIGxpc3Qgb2YgYnl0ZXMuCiAqIFRoZSBwcm9ncmFtIG11c3QgaW50ZXJwcmV0IHRoZSBieXRlcyBvciBoYW5kbGUgdGhlIHJhdyBieXRlIGRhdGEuCiAqIEhlcmUsIHRoZSBjb2RlIHVzZXMgYSBVVEYtOCBkZWNvZGVyIChwcm92aWRlZCBpbiB0aGUgYGRhcnQ6Y29udmVydGAgbGlicmFyeSkKICogdG8gY29udmVydCB0aGUgc2VxdWVuY2Ugb2YgYnl0ZXMgaW50byBhIHNlcXVlbmNlCiAqIG9mIERhcnQgc3RyaW5ncy4KICoKICogQW5vdGhlciBjb21tb24gdXNlIG9mIHN0cmVhbXMgaXMgZm9yIHVzZXItZ2VuZXJhdGVkIGV2ZW50cwogKiBpbiBhIHdlYiBhcHA6IFRoZSBmb2xsb3dpbmcgY29kZSBsaXN0ZW5zIGZvciBtb3VzZSBjbGlja3Mgb24gYSBidXR0b24uCiAqCiAqICAgICBxdWVyeVNlbGVjdG9yKCcjbXlCdXR0b24nKS5vbkNsaWNrLmxpc3RlbigoXykgPT4gcHJpbnQoJ0NsaWNrLicpKTsKICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqICogVGhlIFtkYXJ0OmFzeW5jIHNlY3Rpb24gb2YgdGhlIGxpYnJhcnkgdG91cl1bYXN5bmNocm9ub3VzLXByb2dyYW1taW5nXToKICogICBBIGJyaWVmIG92ZXJ2aWV3IG9mIGFzeW5jaHJvbm91cyBwcm9ncmFtbWluZy4KICoKICogKiBbVXNlIEZ1dHVyZS1CYXNlZCBBUElzXVtmdXR1cmVzLXR1dG9yaWFsXTogQSBjbG9zZXIgbG9vayBhdCBGdXR1cmVzIGFuZAogKiAgIGhvdyB0byB1c2UgdGhlbSB0byB3cml0ZSBhc3luY2hyb25vdXMgRGFydCBjb2RlLgogKgogKiAqIFtGdXR1cmVzIGFuZCBFcnJvciBIYW5kbGluZ11bZnV0dXJlcy1lcnJvci1oYW5kbGluZ106IEV2ZXJ5dGhpbmcgeW91CiAqICAgd2FudGVkIHRvIGtub3cgYWJvdXQgaGFuZGxpbmcgZXJyb3JzIGFuZCBleGNlcHRpb25zIHdoZW4gd29ya2luZyB3aXRoCiAqICAgRnV0dXJlcyAoYnV0IHdlcmUgYWZyYWlkIHRvIGFzaykuCiAqCiAqICogW1RoZSBFdmVudCBMb29wIGFuZCBEYXJ0XShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvZXZlbnQtbG9vcC8pOgogKiAgIExlYXJuIGhvdyBEYXJ0IGhhbmRsZXMgdGhlIGV2ZW50IHF1ZXVlIGFuZCBtaWNyb3Rhc2sgcXVldWUsIHNvIHlvdSBjYW4KICogICB3cml0ZSBiZXR0ZXIgYXN5bmNocm9ub3VzIGNvZGUgd2l0aCBmZXdlciBzdXJwcmlzZXMuCiAqCiAqICogW3Rlc3QgcGFja2FnZTogQXN5bmNocm9ub3VzIFRlc3RzXVt0ZXN0LXJlYWRtZV06IEhvdyB0byB0ZXN0IGFzeW5jaHJvbm91cwogKiAgIGNvZGUuCiAqCiAqIFthc3luY2hyb25vdXMtcHJvZ3JhbW1pbmddOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNkYXJ0YXN5bmMtLS1hc3luY2hyb25vdXMtcHJvZ3JhbW1pbmcKICogW2Z1dHVyZXMtdHV0b3JpYWxdOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy90dXRvcmlhbHMvZnV0dXJlcy8KICogW2Z1dHVyZXMtZXJyb3ItaGFuZGxpbmddOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvZnV0dXJlcy1hbmQtZXJyb3ItaGFuZGxpbmcvCiAqIFt0ZXN0LXJlYWRtZV06IGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy90ZXN0CiAqCiAqIHtAY2F0ZWdvcnkgQ29yZX0KICovCmxpYnJhcnkgZGFydC5hc3luYzsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IEhhc2hNYXAsIEl0ZXJhYmxlQmFzZTsKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIKICAgIHNob3cKICAgICAgICBDYXN0U3RyZWFtLAogICAgICAgIENhc3RTdHJlYW1UcmFuc2Zvcm1lciwKICAgICAgICBFbXB0eUl0ZXJhdG9yLAogICAgICAgIEl0ZXJhYmxlRWxlbWVudEVycm9yLAogICAgICAgIHByaW50VG9ab25lLAogICAgICAgIHByaW50VG9Db25zb2xlLAogICAgICAgIFNpbmNlOwoKcGFydCAnYXN5bmNfZXJyb3IuZGFydCc7CnBhcnQgJ2Jyb2FkY2FzdF9zdHJlYW1fY29udHJvbGxlci5kYXJ0JzsKcGFydCAnZGVmZXJyZWRfbG9hZC5kYXJ0JzsKcGFydCAnZnV0dXJlLmRhcnQnOwpwYXJ0ICdmdXR1cmVfaW1wbC5kYXJ0JzsKcGFydCAnc2NoZWR1bGVfbWljcm90YXNrLmRhcnQnOwpwYXJ0ICdzdHJlYW0uZGFydCc7CnBhcnQgJ3N0cmVhbV9jb250cm9sbGVyLmRhcnQnOwpwYXJ0ICdzdHJlYW1faW1wbC5kYXJ0JzsKcGFydCAnc3RyZWFtX3BpcGUuZGFydCc7CnBhcnQgJ3N0cmVhbV90cmFuc2Zvcm1lcnMuZGFydCc7CnBhcnQgJ3RpbWVyLmRhcnQnOwpwYXJ0ICd6b25lLmRhcnQnOwp5AE5OPAEEKSsDPygDJQMcAw0DPx8zMT8rAzo9PQMrPiADOUIbJyk/PzouAw0DN0xKFkYzOyUDRTUDM0VQNBQDPkoDSgMWA00zA002A0pLJwNPTDoDTwsDgIBIWzkDFAQUATUYCRQfFx4VGA8BGSkbFBkgFB8ZGSETEgEKZGFydDphc3luYzJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvZnV0dXJlX2ltcGwuZGFydMAAZ6cvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLyoqIFRoZSBvblZhbHVlIGFuZCBvbkVycm9yIGhhbmRsZXJzIHJldHVybiBlaXRoZXIgYSB2YWx1ZSBvciBhIGZ1dHVyZSAqLwp0eXBlZGVmIEZ1dHVyZU9yPFQ+IF9GdXR1cmVPblZhbHVlPFMsIFQ+KFMgdmFsdWUpOwovKiogVGVzdCB1c2VkIGJ5IFtGdXR1cmUuY2F0Y2hFcnJvcl0gdG8gaGFuZGxlIHNraXAgc29tZSBlcnJvcnMuICovCnR5cGVkZWYgYm9vbCBfRnV0dXJlRXJyb3JUZXN0KE9iamVjdCBlcnJvcik7Ci8qKiBVc2VkIGJ5IFtXaGVuRnV0dXJlXS4gKi8KdHlwZWRlZiBkeW5hbWljIF9GdXR1cmVBY3Rpb24oKTsKCmFic3RyYWN0IGNsYXNzIF9Db21wbGV0ZXI8VD4gaW1wbGVtZW50cyBDb21wbGV0ZXI8VD4gewogIGZpbmFsIF9GdXR1cmU8VD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8VD4oKTsKCiAgdm9pZCBjb21wbGV0ZShbRnV0dXJlT3I8VD4gdmFsdWVdKTsKCiAgdm9pZCBjb21wbGV0ZUVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihlcnJvcik7CiAgICBpZiAoIWZ1dHVyZS5fbWF5Q29tcGxldGUpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKTsKICAgIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpOwogICAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICAgIH0KICAgIF9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgX2NvbXBsZXRlRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwoKICAvLyBUaGUgZnV0dXJlJ3MgX2lzQ29tcGxldGUgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCBwZW5kaW5nIGNvbXBsZXRpb25zLgogIC8vIFdlIHRoZXJlZm9yZSB1c2UgX21heUNvbXBsZXRlLgogIGJvb2wgZ2V0IGlzQ29tcGxldGVkID0+ICFmdXR1cmUuX21heUNvbXBsZXRlOwp9CgpjbGFzcyBfQXN5bmNDb21wbGV0ZXI8VD4gZXh0ZW5kcyBfQ29tcGxldGVyPFQ+IHsKICB2b2lkIGNvbXBsZXRlKFtGdXR1cmVPcjxUPiB2YWx1ZV0pIHsKICAgIGlmICghZnV0dXJlLl9tYXlDb21wbGV0ZSkgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpOwogICAgZnV0dXJlLl9hc3luY0NvbXBsZXRlKHZhbHVlKTsKICB9CgogIHZvaWQgX2NvbXBsZXRlRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGZ1dHVyZS5fYXN5bmNDb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9Cn0KCmNsYXNzIF9TeW5jQ29tcGxldGVyPFQ+IGV4dGVuZHMgX0NvbXBsZXRlcjxUPiB7CiAgdm9pZCBjb21wbGV0ZShbRnV0dXJlT3I8VD4gdmFsdWVdKSB7CiAgICBpZiAoIWZ1dHVyZS5fbWF5Q29tcGxldGUpIHRocm93IG5ldyBTdGF0ZUVycm9yKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKTsKICAgIGZ1dHVyZS5fY29tcGxldGUodmFsdWUpOwogIH0KCiAgdm9pZCBfY29tcGxldGVFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgZnV0dXJlLl9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9Cn0KCmNsYXNzIF9GdXR1cmVMaXN0ZW5lcjxTLCBUPiB7CiAgc3RhdGljIGNvbnN0IGludCBtYXNrVmFsdWUgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgbWFza0Vycm9yID0gMjsKICBzdGF0aWMgY29uc3QgaW50IG1hc2tUZXN0RXJyb3IgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgbWFza1doZW5jb21wbGV0ZSA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZUNoYWluID0gMDsKICBzdGF0aWMgY29uc3QgaW50IHN0YXRlVGhlbiA9IG1hc2tWYWx1ZTsKICBzdGF0aWMgY29uc3QgaW50IHN0YXRlVGhlbk9uZXJyb3IgPSBtYXNrVmFsdWUgfCBtYXNrRXJyb3I7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZUNhdGNoZXJyb3IgPSBtYXNrRXJyb3I7CiAgc3RhdGljIGNvbnN0IGludCBzdGF0ZUNhdGNoZXJyb3JUZXN0ID0gbWFza0Vycm9yIHwgbWFza1Rlc3RFcnJvcjsKICBzdGF0aWMgY29uc3QgaW50IHN0YXRlV2hlbmNvbXBsZXRlID0gbWFza1doZW5jb21wbGV0ZTsKICAvLyBMaXN0ZW5lcnMgb24gdGhlIHNhbWUgZnV0dXJlIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGlzIGxpbmsuCiAgX0Z1dHVyZUxpc3RlbmVyIF9uZXh0TGlzdGVuZXI7CiAgLy8gVGhlIGZ1dHVyZSB0byBjb21wbGV0ZSB3aGVuIHRoaXMgbGlzdGVuZXIgaXMgYWN0aXZhdGVkLgogIGZpbmFsIF9GdXR1cmU8VD4gcmVzdWx0OwogIC8vIFdoaWNoIGZpZWxkcyBtZWFucyB3aGF0LgogIGZpbmFsIGludCBzdGF0ZTsKICAvLyBVc2VkIGZvciB0aGVuL3doZW5Eb25lIGNhbGxiYWNrIGFuZCBlcnJvciB0ZXN0CiAgZmluYWwgRnVuY3Rpb24gY2FsbGJhY2s7CiAgLy8gVXNlZCBmb3IgZXJyb3IgY2FsbGJhY2tzLgogIGZpbmFsIEZ1bmN0aW9uIGVycm9yQ2FsbGJhY2s7CgogIF9GdXR1cmVMaXN0ZW5lci50aGVuKAogICAgICB0aGlzLnJlc3VsdCwgX0Z1dHVyZU9uVmFsdWU8UywgVD4gb25WYWx1ZSwgRnVuY3Rpb24gZXJyb3JDYWxsYmFjaykKICAgICAgOiBjYWxsYmFjayA9IG9uVmFsdWUsCiAgICAgICAgZXJyb3JDYWxsYmFjayA9IGVycm9yQ2FsbGJhY2ssCiAgICAgICAgc3RhdGUgPSAoZXJyb3JDYWxsYmFjayA9PSBudWxsKSA/IHN0YXRlVGhlbiA6IHN0YXRlVGhlbk9uZXJyb3I7CgogIF9GdXR1cmVMaXN0ZW5lci5jYXRjaEVycm9yKHRoaXMucmVzdWx0LCB0aGlzLmVycm9yQ2FsbGJhY2ssIHRoaXMuY2FsbGJhY2spCiAgICAgIDogc3RhdGUgPSAoY2FsbGJhY2sgPT0gbnVsbCkgPyBzdGF0ZUNhdGNoZXJyb3IgOiBzdGF0ZUNhdGNoZXJyb3JUZXN0OwoKICBfRnV0dXJlTGlzdGVuZXIud2hlbkNvbXBsZXRlKHRoaXMucmVzdWx0LCB0aGlzLmNhbGxiYWNrKQogICAgICA6IGVycm9yQ2FsbGJhY2sgPSBudWxsLAogICAgICAgIHN0YXRlID0gc3RhdGVXaGVuY29tcGxldGU7CgogIFpvbmUgZ2V0IF96b25lID0+IHJlc3VsdC5fem9uZTsKCiAgYm9vbCBnZXQgaGFuZGxlc1ZhbHVlID0+IChzdGF0ZSAmIG1hc2tWYWx1ZSAhPSAwKTsKICBib29sIGdldCBoYW5kbGVzRXJyb3IgPT4gKHN0YXRlICYgbWFza0Vycm9yICE9IDApOwogIGJvb2wgZ2V0IGhhc0Vycm9yVGVzdCA9PiAoc3RhdGUgPT0gc3RhdGVDYXRjaGVycm9yVGVzdCk7CiAgYm9vbCBnZXQgaGFuZGxlc0NvbXBsZXRlID0+IChzdGF0ZSA9PSBzdGF0ZVdoZW5jb21wbGV0ZSk7CgogIF9GdXR1cmVPblZhbHVlPFMsIFQ+IGdldCBfb25WYWx1ZSB7CiAgICBhc3NlcnQoaGFuZGxlc1ZhbHVlKTsKICAgIHJldHVybiBjYWxsYmFjazsKICB9CgogIEZ1bmN0aW9uIGdldCBfb25FcnJvciA9PiBlcnJvckNhbGxiYWNrOwogIF9GdXR1cmVFcnJvclRlc3QgZ2V0IF9lcnJvclRlc3QgewogICAgYXNzZXJ0KGhhc0Vycm9yVGVzdCk7CiAgICByZXR1cm4gY2FsbGJhY2s7CiAgfQoKICBfRnV0dXJlQWN0aW9uIGdldCBfd2hlbkNvbXBsZXRlQWN0aW9uIHsKICAgIGFzc2VydChoYW5kbGVzQ29tcGxldGUpOwogICAgcmV0dXJuIGNhbGxiYWNrOwogIH0KCiAgLy8vIFdoZXRoZXIgdGhpcyBsaXN0ZW5lciBoYXMgYW4gZXJyb3IgY2FsbGJhY2suCiAgLy8vCiAgLy8vIFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgbGlzdGVuZXIgW2hhbmRsZXNFcnJvcl0uCiAgYm9vbCBnZXQgaGFzRXJyb3JDYWxsYmFjayB7CiAgICBhc3NlcnQoaGFuZGxlc0Vycm9yKTsKICAgIHJldHVybiBfb25FcnJvciAhPSBudWxsOwogIH0KCiAgRnV0dXJlT3I8VD4gaGFuZGxlVmFsdWUoUyBzb3VyY2VSZXN1bHQpIHsKICAgIHJldHVybiBfem9uZS5ydW5VbmFyeTxGdXR1cmVPcjxUPiwgUz4oX29uVmFsdWUsIHNvdXJjZVJlc3VsdCk7CiAgfQoKICBib29sIG1hdGNoZXNFcnJvclRlc3QoQXN5bmNFcnJvciBhc3luY0Vycm9yKSB7CiAgICBpZiAoIWhhc0Vycm9yVGVzdCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gX3pvbmUucnVuVW5hcnk8Ym9vbCwgT2JqZWN0PihfZXJyb3JUZXN0LCBhc3luY0Vycm9yLmVycm9yKTsKICB9CgogIEZ1dHVyZU9yPFQ+IGhhbmRsZUVycm9yKEFzeW5jRXJyb3IgYXN5bmNFcnJvcikgewogICAgYXNzZXJ0KGhhbmRsZXNFcnJvciAmJiBoYXNFcnJvckNhbGxiYWNrKTsKICAgIHZhciBlcnJvckNhbGxiYWNrID0gdGhpcy5lcnJvckNhbGxiYWNrOyAvLyBUbyBlbmFibGUgcHJvbW90aW9uLgogICAgLy8gSWYgdGhlIGVycm9yQ2FsbGJhY2sgcmV0dXJucyBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgRnV0dXJlT3I8VD4sCiAgICAvLyB0aGlzIHJldHVybiBzdGF0ZW1lbnQgdGhyb3dzLCBhbmQgdGhlIGNhbGxlciBoYW5kbGVzIHRoZSBlcnJvci4KICAgIGlmIChlcnJvckNhbGxiYWNrIGlzIGR5bmFtaWMgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSkgewogICAgICByZXR1cm4gX3pvbmUucnVuQmluYXJ5PGR5bmFtaWMsIE9iamVjdCwgU3RhY2tUcmFjZT4oCiAgICAgICAgICBlcnJvckNhbGxiYWNrLCBhc3luY0Vycm9yLmVycm9yLCBhc3luY0Vycm9yLnN0YWNrVHJhY2UpOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGVycm9yQ2FsbGJhY2sgaXMgZHluYW1pYyBGdW5jdGlvbihPYmplY3QpKTsKICAgICAgcmV0dXJuIF96b25lLnJ1blVuYXJ5PGR5bmFtaWMsIE9iamVjdD4oZXJyb3JDYWxsYmFjaywgYXN5bmNFcnJvci5lcnJvcik7CiAgICB9CiAgfQoKICBkeW5hbWljIGhhbmRsZVdoZW5Db21wbGV0ZSgpIHsKICAgIGFzc2VydCghaGFuZGxlc0Vycm9yKTsKICAgIHJldHVybiBfem9uZS5ydW4oX3doZW5Db21wbGV0ZUFjdGlvbik7CiAgfQp9CgpjbGFzcyBfRnV0dXJlPFQ+IGltcGxlbWVudHMgRnV0dXJlPFQ+IHsKICAvLy8gSW5pdGlhbCBzdGF0ZSwgd2FpdGluZyBmb3IgYSByZXN1bHQuIEluIHRoaXMgc3RhdGUsIHRoZQogIC8vLyBbcmVzdWx0T3JMaXN0ZW5lcnNdIGZpZWxkIGhvbGRzIGEgc2luZ2xlLWxpbmtlZCBsaXN0IG9mCiAgLy8vIFtfRnV0dXJlTGlzdGVuZXJdIGxpc3RlbmVycy4KICBzdGF0aWMgY29uc3QgaW50IF9zdGF0ZUluY29tcGxldGUgPSAwOwoKICAvLy8gUGVuZGluZyBjb21wbGV0aW9uLiBTZXQgd2hlbiBjb21wbGV0ZWQgdXNpbmcgW19hc3luY0NvbXBsZXRlXSBvcgogIC8vLyBbX2FzeW5jQ29tcGxldGVFcnJvcl0uIEl0IGlzIGFuIGVycm9yIHRvIHRyeSB0byBjb21wbGV0ZSBpdCBhZ2Fpbi4KICAvLy8gW3Jlc3VsdE9yTGlzdGVuZXJzXSBob2xkcyBsaXN0ZW5lcnMuCiAgc3RhdGljIGNvbnN0IGludCBfc3RhdGVQZW5kaW5nQ29tcGxldGUgPSAxOwoKICAvLy8gVGhlIGZ1dHVyZSBoYXMgYmVlbiBjaGFpbmVkIHRvIGFub3RoZXIgZnV0dXJlLiBUaGUgcmVzdWx0IG9mIHRoYXQKICAvLy8gb3RoZXIgZnV0dXJlIGJlY29tZXMgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1dHVyZSBhcyB3ZWxsLgogIC8vLyBbcmVzdWx0T3JMaXN0ZW5lcnNdIGNvbnRhaW5zIHRoZSBzb3VyY2UgZnV0dXJlLgogIHN0YXRpYyBjb25zdCBpbnQgX3N0YXRlQ2hhaW5lZCA9IDI7CgogIC8vLyBUaGUgZnV0dXJlIGhhcyBiZWVuIGNvbXBsZXRlZCB3aXRoIGEgdmFsdWUgcmVzdWx0LgogIHN0YXRpYyBjb25zdCBpbnQgX3N0YXRlVmFsdWUgPSA0OwoKICAvLy8gVGhlIGZ1dHVyZSBoYXMgYmVlbiBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciByZXN1bHQuCiAgc3RhdGljIGNvbnN0IGludCBfc3RhdGVFcnJvciA9IDg7CgogIC8qKiBXaGV0aGVyIHRoZSBmdXR1cmUgaXMgY29tcGxldGUsIGFuZCBhcyB3aGF0LiAqLwogIGludCBfc3RhdGUgPSBfc3RhdGVJbmNvbXBsZXRlOwoKICAvKioKICAgKiBab25lIHRoYXQgdGhlIGZ1dHVyZSB3YXMgY29tcGxldGVkIGZyb20uCiAgICogVGhpcyBpcyB0aGUgem9uZSB0aGF0IGFuIGVycm9yIHJlc3VsdCBiZWxvbmdzIHRvLgogICAqCiAgICogVW50aWwgdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQsIHRoZSBmaWVsZCBtYXkgaG9sZCB0aGUgem9uZSB0aGF0CiAgICogbGlzdGVuZXIgY2FsbGJhY2tzIHVzZWQgdG8gY3JlYXRlIHRoaXMgZnV0dXJlIHNob3VsZCBiZSBydW4gaW4uCiAgICovCiAgZmluYWwgWm9uZSBfem9uZTsKCiAgLyoqCiAgICogRWl0aGVyIHRoZSByZXN1bHQsIGEgbGlzdCBvZiBsaXN0ZW5lcnMgb3IgYW5vdGhlciBmdXR1cmUuCiAgICoKICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBmdXR1cmUgaXMgZWl0aGVyIGEgdmFsdWUgb3IgYW4gZXJyb3IuCiAgICogQSByZXN1bHQgaXMgb25seSBzdG9yZWQgd2hlbiB0aGUgZnV0dXJlIGhhcyBjb21wbGV0ZWQuCiAgICoKICAgKiBUaGUgbGlzdGVuZXJzIGlzIGFuIGludGVybmFsbHkgbGlua2VkIGxpc3Qgb2YgW19GdXR1cmVMaXN0ZW5lcl1zLgogICAqIExpc3RlbmVycyBhcmUgb25seSByZW1lbWJlcmVkIHdoaWxlIHRoZSBmdXR1cmUgaXMgbm90IHlldCBjb21wbGV0ZSwKICAgKiBhbmQgaXQgaXMgbm90IGNoYWluZWQgdG8gYW5vdGhlciBmdXR1cmUuCiAgICoKICAgKiBUaGUgZnV0dXJlIGlzIGFub3RoZXIgZnV0dXJlIHRoYXQgaGlzIGZ1dHVyZSBpcyBjaGFpbmVkIHRvLiBUaGlzIGZ1dHVyZQogICAqIGlzIHdhaXRpbmcgZm9yIHRoZSBvdGhlciBmdXR1cmUgdG8gY29tcGxldGUsIGFuZCB3aGVuIGl0IGRvZXMsIHRoaXMgZnV0dXJlCiAgICogd2lsbCBjb21wbGV0ZSB3aXRoIHRoZSBzYW1lIHJlc3VsdC4KICAgKiBBbGwgbGlzdGVuZXJzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIG90aGVyIGZ1dHVyZS4KICAgKi8KICB2YXIgX3Jlc3VsdE9yTGlzdGVuZXJzOwoKICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgYXN5bmMvYXdhaXQuCiAgX0Z1dHVyZSgpIDogX3pvbmUgPSBab25lLmN1cnJlbnQ7CgogIF9GdXR1cmUuaW1tZWRpYXRlKEZ1dHVyZU9yPFQ+IHJlc3VsdCkgOiBfem9uZSA9IFpvbmUuY3VycmVudCB7CiAgICBfYXN5bmNDb21wbGV0ZShyZXN1bHQpOwogIH0KCiAgLyoqIENyZWF0ZXMgYSBmdXR1cmUgd2l0aCB0aGUgdmFsdWUgYW5kIHRoZSBzcGVjaWZpZWQgem9uZS4gKi8KICBfRnV0dXJlLnpvbmVWYWx1ZShUIHZhbHVlLCB0aGlzLl96b25lKSB7CiAgICBfc2V0VmFsdWUodmFsdWUpOwogIH0KCiAgX0Z1dHVyZS5pbW1lZGlhdGVFcnJvcih2YXIgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKQogICAgICA6IF96b25lID0gWm9uZS5jdXJyZW50IHsKICAgIF9hc3luY0NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLyoqIENyZWF0ZXMgYSBmdXR1cmUgdGhhdCBpcyBhbHJlYWR5IGNvbXBsZXRlZCB3aXRoIHRoZSB2YWx1ZS4gKi8KICBfRnV0dXJlLnZhbHVlKFQgdmFsdWUpIDogdGhpcy56b25lVmFsdWUodmFsdWUsIFpvbmUuY3VycmVudCk7CgogIGJvb2wgZ2V0IF9tYXlDb21wbGV0ZSA9PiBfc3RhdGUgPT0gX3N0YXRlSW5jb21wbGV0ZTsKICBib29sIGdldCBfaXNQZW5kaW5nQ29tcGxldGUgPT4gX3N0YXRlID09IF9zdGF0ZVBlbmRpbmdDb21wbGV0ZTsKICBib29sIGdldCBfbWF5QWRkTGlzdGVuZXIgPT4gX3N0YXRlIDw9IF9zdGF0ZVBlbmRpbmdDb21wbGV0ZTsKICBib29sIGdldCBfaXNDaGFpbmVkID0+IF9zdGF0ZSA9PSBfc3RhdGVDaGFpbmVkOwogIGJvb2wgZ2V0IF9pc0NvbXBsZXRlID0+IF9zdGF0ZSA+PSBfc3RhdGVWYWx1ZTsKICBib29sIGdldCBfaGFzRXJyb3IgPT4gX3N0YXRlID09IF9zdGF0ZUVycm9yOwoKICB2b2lkIF9zZXRDaGFpbmVkKF9GdXR1cmUgc291cmNlKSB7CiAgICBhc3NlcnQoX21heUFkZExpc3RlbmVyKTsKICAgIF9zdGF0ZSA9IF9zdGF0ZUNoYWluZWQ7CiAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBzb3VyY2U7CiAgfQoKICBGdXR1cmU8Uj4gdGhlbjxSPihGdXR1cmVPcjxSPiBmKFQgdmFsdWUpLCB7RnVuY3Rpb24gb25FcnJvcn0pIHsKICAgIFpvbmUgY3VycmVudFpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICBpZiAoIWlkZW50aWNhbChjdXJyZW50Wm9uZSwgX3Jvb3Rab25lKSkgewogICAgICBmID0gY3VycmVudFpvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPEZ1dHVyZU9yPFI+LCBUPihmKTsKICAgICAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgewogICAgICAgIC8vIEluIGNoZWNrZWQgbW9kZSwgdGhpcyBjaGVja3MgdGhhdCBvbkVycm9yIGlzIGFzc2lnbmFibGUgdG8gb25lIG9mOgogICAgICAgIC8vICAgZHluYW1pYyBGdW5jdGlvbihPYmplY3QpCiAgICAgICAgLy8gICBkeW5hbWljIEZ1bmN0aW9uKE9iamVjdCwgU3RhY2tUcmFjZSkKICAgICAgICBvbkVycm9yID0gX3JlZ2lzdGVyRXJyb3JIYW5kbGVyKG9uRXJyb3IsIGN1cnJlbnRab25lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF90aGVuTm9ab25lUmVnaXN0cmF0aW9uPFI+KGYsIG9uRXJyb3IpOwogIH0KCiAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBhc3luYy9hd2FpdC4KICBGdXR1cmU8RT4gX3RoZW5Ob1pvbmVSZWdpc3RyYXRpb248RT4oCiAgICAgIEZ1dHVyZU9yPEU+IGYoVCB2YWx1ZSksIEZ1bmN0aW9uIG9uRXJyb3IpIHsKICAgIF9GdXR1cmU8RT4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8RT4oKTsKICAgIF9hZGRMaXN0ZW5lcihuZXcgX0Z1dHVyZUxpc3RlbmVyPFQsIEU+LnRoZW4ocmVzdWx0LCBmLCBvbkVycm9yKSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPFQ+IGNhdGNoRXJyb3IoRnVuY3Rpb24gb25FcnJvciwge2Jvb2wgdGVzdChlcnJvcil9KSB7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBpZiAoIWlkZW50aWNhbChyZXN1bHQuX3pvbmUsIF9yb290Wm9uZSkpIHsKICAgICAgb25FcnJvciA9IF9yZWdpc3RlckVycm9ySGFuZGxlcihvbkVycm9yLCByZXN1bHQuX3pvbmUpOwogICAgICBpZiAodGVzdCAhPSBudWxsKSB0ZXN0ID0gcmVzdWx0Ll96b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjayh0ZXN0KTsKICAgIH0KICAgIF9hZGRMaXN0ZW5lcihuZXcgX0Z1dHVyZUxpc3RlbmVyPFQsIFQ+LmNhdGNoRXJyb3IocmVzdWx0LCBvbkVycm9yLCB0ZXN0KSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPFQ+IHdoZW5Db21wbGV0ZShkeW5hbWljIGFjdGlvbigpKSB7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBpZiAoIWlkZW50aWNhbChyZXN1bHQuX3pvbmUsIF9yb290Wm9uZSkpIHsKICAgICAgYWN0aW9uID0gcmVzdWx0Ll96b25lLnJlZ2lzdGVyQ2FsbGJhY2s8ZHluYW1pYz4oYWN0aW9uKTsKICAgIH0KICAgIF9hZGRMaXN0ZW5lcihuZXcgX0Z1dHVyZUxpc3RlbmVyPFQsIFQ+LndoZW5Db21wbGV0ZShyZXN1bHQsIGFjdGlvbikpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmVhbTxUPiBhc1N0cmVhbSgpID0+IG5ldyBTdHJlYW08VD4uZnJvbUZ1dHVyZSh0aGlzKTsKCiAgdm9pZCBfc2V0UGVuZGluZ0NvbXBsZXRlKCkgewogICAgYXNzZXJ0KF9tYXlDb21wbGV0ZSk7CiAgICBfc3RhdGUgPSBfc3RhdGVQZW5kaW5nQ29tcGxldGU7CiAgfQoKICB2b2lkIF9jbGVhclBlbmRpbmdDb21wbGV0ZSgpIHsKICAgIGFzc2VydChfaXNQZW5kaW5nQ29tcGxldGUpOwogICAgX3N0YXRlID0gX3N0YXRlSW5jb21wbGV0ZTsKICB9CgogIEFzeW5jRXJyb3IgZ2V0IF9lcnJvciB7CiAgICBhc3NlcnQoX2hhc0Vycm9yKTsKICAgIHJldHVybiBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgfQoKICBfRnV0dXJlIGdldCBfY2hhaW5Tb3VyY2UgewogICAgYXNzZXJ0KF9pc0NoYWluZWQpOwogICAgcmV0dXJuIF9yZXN1bHRPckxpc3RlbmVyczsKICB9CgogIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgYXN5bmMvYXdhaXQuCiAgdm9pZCBfc2V0VmFsdWUoVCB2YWx1ZSkgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7IC8vIEJ1dCBtYXkgaGF2ZSBhIGNvbXBsZXRpb24gcGVuZGluZy4KICAgIF9zdGF0ZSA9IF9zdGF0ZVZhbHVlOwogICAgX3Jlc3VsdE9yTGlzdGVuZXJzID0gdmFsdWU7CiAgfQoKICB2b2lkIF9zZXRFcnJvck9iamVjdChBc3luY0Vycm9yIGVycm9yKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsgLy8gQnV0IG1heSBoYXZlIGEgY29tcGxldGlvbiBwZW5kaW5nLgogICAgX3N0YXRlID0gX3N0YXRlRXJyb3I7CiAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBlcnJvcjsKICB9CgogIHZvaWQgX3NldEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfc2V0RXJyb3JPYmplY3QobmV3IEFzeW5jRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpKTsKICB9CgogIC8vLyBDb3B5IHRoZSBjb21wbGV0aW9uIHJlc3VsdCBvZiBbc291cmNlXSBpbnRvIHRoaXMgZnV0dXJlLgogIC8vLwogIC8vLyBVc2VkIHdoZW4gYSBjaGFpbmVkIGZ1dHVyZSBub3RpY2VzIHRoYXQgaXRzIHNvdXJjZSBpcyBjb21wbGV0ZWQuCiAgdm9pZCBfY2xvbmVSZXN1bHQoX0Z1dHVyZSBzb3VyY2UpIHsKICAgIGFzc2VydCghX2lzQ29tcGxldGUpOwogICAgYXNzZXJ0KHNvdXJjZS5faXNDb21wbGV0ZSk7CiAgICBfc3RhdGUgPSBzb3VyY2UuX3N0YXRlOwogICAgX3Jlc3VsdE9yTGlzdGVuZXJzID0gc291cmNlLl9yZXN1bHRPckxpc3RlbmVyczsKICB9CgogIHZvaWQgX2FkZExpc3RlbmVyKF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgYXNzZXJ0KGxpc3RlbmVyLl9uZXh0TGlzdGVuZXIgPT0gbnVsbCk7CiAgICBpZiAoX21heUFkZExpc3RlbmVyKSB7CiAgICAgIGxpc3RlbmVyLl9uZXh0TGlzdGVuZXIgPSBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIF9yZXN1bHRPckxpc3RlbmVycyA9IGxpc3RlbmVyOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9pc0NoYWluZWQpIHsKICAgICAgICAvLyBEZWxlZ2F0ZSBsaXN0ZW5lcnMgdG8gY2hhaW5lZCBzb3VyY2UgZnV0dXJlLgogICAgICAgIC8vIElmIHRoZSBzb3VyY2UgaXMgY29tcGxldGUsIGluc3RlYWQgY29weSBpdHMgdmFsdWVzIGFuZAogICAgICAgIC8vIGRyb3AgdGhlIGNoYWluaW5nLgogICAgICAgIF9GdXR1cmUgc291cmNlID0gX2NoYWluU291cmNlOwogICAgICAgIGlmICghc291cmNlLl9pc0NvbXBsZXRlKSB7CiAgICAgICAgICBzb3VyY2UuX2FkZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgX2Nsb25lUmVzdWx0KHNvdXJjZSk7CiAgICAgIH0KICAgICAgYXNzZXJ0KF9pc0NvbXBsZXRlKTsKICAgICAgLy8gSGFuZGxlIGxhdGUgbGlzdGVuZXJzIGFzeW5jaHJvbm91c2x5LgogICAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgICAgX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzKHRoaXMsIGxpc3RlbmVyKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIF9wcmVwZW5kTGlzdGVuZXJzKF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMpIHsKICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgcmV0dXJuOwogICAgaWYgKF9tYXlBZGRMaXN0ZW5lcikgewogICAgICBfRnV0dXJlTGlzdGVuZXIgZXhpc3RpbmdMaXN0ZW5lcnMgPSBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIF9yZXN1bHRPckxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgICAgaWYgKGV4aXN0aW5nTGlzdGVuZXJzICE9IG51bGwpIHsKICAgICAgICBfRnV0dXJlTGlzdGVuZXIgY3Vyc29yID0gbGlzdGVuZXJzOwogICAgICAgIHdoaWxlIChjdXJzb3IuX25leHRMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICBjdXJzb3IgPSBjdXJzb3IuX25leHRMaXN0ZW5lcjsKICAgICAgICB9CiAgICAgICAgY3Vyc29yLl9uZXh0TGlzdGVuZXIgPSBleGlzdGluZ0xpc3RlbmVyczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKF9pc0NoYWluZWQpIHsKICAgICAgICAvLyBEZWxlZ2F0ZSBsaXN0ZW5lcnMgdG8gY2hhaW5lZCBzb3VyY2UgZnV0dXJlLgogICAgICAgIC8vIElmIHRoZSBzb3VyY2UgaXMgY29tcGxldGUsIGluc3RlYWQgY29weSBpdHMgdmFsdWVzIGFuZAogICAgICAgIC8vIGRyb3AgdGhlIGNoYWluaW5nLgogICAgICAgIF9GdXR1cmUgc291cmNlID0gX2NoYWluU291cmNlOwogICAgICAgIGlmICghc291cmNlLl9pc0NvbXBsZXRlKSB7CiAgICAgICAgICBzb3VyY2UuX3ByZXBlbmRMaXN0ZW5lcnMobGlzdGVuZXJzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgX2Nsb25lUmVzdWx0KHNvdXJjZSk7CiAgICAgIH0KICAgICAgYXNzZXJ0KF9pc0NvbXBsZXRlKTsKICAgICAgbGlzdGVuZXJzID0gX3JldmVyc2VMaXN0ZW5lcnMobGlzdGVuZXJzKTsKICAgICAgX3pvbmUuc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcnMpOwogICAgICB9KTsKICAgIH0KICB9CgogIF9GdXR1cmVMaXN0ZW5lciBfcmVtb3ZlTGlzdGVuZXJzKCkgewogICAgLy8gUmV2ZXJzZSBsaXN0ZW5lcnMgYmVmb3JlIHJldHVybmluZyB0aGVtLCBzbyB0aGUgcmVzdWx0aW5nIGxpc3QgaXMgaW4KICAgIC8vIHN1YnNjcmlwdGlvbiBvcmRlci4KICAgIGFzc2VydCghX2lzQ29tcGxldGUpOwogICAgX0Z1dHVyZUxpc3RlbmVyIGN1cnJlbnQgPSBfcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICBfcmVzdWx0T3JMaXN0ZW5lcnMgPSBudWxsOwogICAgcmV0dXJuIF9yZXZlcnNlTGlzdGVuZXJzKGN1cnJlbnQpOwogIH0KCiAgX0Z1dHVyZUxpc3RlbmVyIF9yZXZlcnNlTGlzdGVuZXJzKF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMpIHsKICAgIF9GdXR1cmVMaXN0ZW5lciBwcmV2OwogICAgX0Z1dHVyZUxpc3RlbmVyIGN1cnJlbnQgPSBsaXN0ZW5lcnM7CiAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgIF9GdXR1cmVMaXN0ZW5lciBuZXh0ID0gY3VycmVudC5fbmV4dExpc3RlbmVyOwogICAgICBjdXJyZW50Ll9uZXh0TGlzdGVuZXIgPSBwcmV2OwogICAgICBwcmV2ID0gY3VycmVudDsKICAgICAgY3VycmVudCA9IG5leHQ7CiAgICB9CiAgICByZXR1cm4gcHJldjsKICB9CgogIC8vIFRha2UgdGhlIHZhbHVlICh3aGVuIGNvbXBsZXRlZCkgb2Ygc291cmNlIGFuZCBjb21wbGV0ZSB0YXJnZXQgd2l0aCB0aGF0CiAgLy8gdmFsdWUgKG9yIGVycm9yKS4gVGhpcyBmdW5jdGlvbiBjb3VsZCBjaGFpbiBhbGwgRnV0dXJlcywgYnV0IGlzIHNsb3dlcgogIC8vIGZvciBfRnV0dXJlIHRoYW4gX2NoYWluQ29yZUZ1dHVyZSwgc28geW91IG11c3QgdXNlIF9jaGFpbkNvcmVGdXR1cmUKICAvLyBpbiB0aGF0IGNhc2UuCiAgc3RhdGljIHZvaWQgX2NoYWluRm9yZWlnbkZ1dHVyZShGdXR1cmUgc291cmNlLCBfRnV0dXJlIHRhcmdldCkgewogICAgYXNzZXJ0KCF0YXJnZXQuX2lzQ29tcGxldGUpOwogICAgYXNzZXJ0KHNvdXJjZSBpcyEgX0Z1dHVyZSk7CgogICAgLy8gTWFyayB0aGUgdGFyZ2V0IGFzIGNoYWluZWQgKGFuZCBhcyBzdWNoIGhhbGYtY29tcGxldGVkKS4KICAgIHRhcmdldC5fc2V0UGVuZGluZ0NvbXBsZXRlKCk7CiAgICB0cnkgewogICAgICBzb3VyY2UudGhlbigodmFsdWUpIHsKICAgICAgICBhc3NlcnQodGFyZ2V0Ll9pc1BlbmRpbmdDb21wbGV0ZSk7CiAgICAgICAgLy8gVGhlICJ2YWx1ZSIgbWF5IGJlIGFub3RoZXIgZnV0dXJlIGlmIHRoZSBmb3JlaWduIGZ1dHVyZQogICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGlzIG1pcy1iZWhhdmluZywKICAgICAgICAvLyBzbyB1c2UgX2NvbXBsZXRlIGluc3RlYWQgb2YgX2NvbXBsZXRlV2l0aFZhbHVlLgogICAgICAgIHRhcmdldC5fY2xlYXJQZW5kaW5nQ29tcGxldGUoKTsgLy8gQ2xlYXIgdGhpcyBmaXJzdCwgaXQncyBzZXQgYWdhaW4uCiAgICAgICAgdGFyZ2V0Ll9jb21wbGV0ZSh2YWx1ZSk7CiAgICAgIH0sCiAgICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogZXZlbnR1YWxseSB3ZSB3b3VsZCBsaWtlIHRvIG1ha2UgdGhpcyBub24tb3B0aW9uYWwKICAgICAgICAgIC8vIGFuZCBkZXBlbmRlbnQgb24gdGhlIGxpc3RlbmVycyBvZiB0aGUgdGFyZ2V0IGZ1dHVyZS4gSWYgbm9uZSBvZgogICAgICAgICAgLy8gdGhlIHRhcmdldCBmdXR1cmUncyBsaXN0ZW5lcnMgd2FudCB0byBoYXZlIHRoZSBzdGFjayB0cmFjZSB3ZSBkb24ndAogICAgICAgICAgLy8gbmVlZCBhIHRyYWNlLgogICAgICAgICAgb25FcnJvcjogKGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgICAgIGFzc2VydCh0YXJnZXQuX2lzUGVuZGluZ0NvbXBsZXRlKTsKICAgICAgICB0YXJnZXQuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgLy8gVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIGB0aGVuYCBjYWxsIHRocmV3IHN5bmNocm9ub3VzbHkgd2hlbiBnaXZlbgogICAgICAvLyB2YWxpZCBhcmd1bWVudHMuCiAgICAgIC8vIFRoYXQgcmVxdWlyZXMgYSBub24tY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRnV0dXJlIGludGVyZmFjZSwKICAgICAgLy8gd2hpY2ggc2hvdWxkLCBob3BlZnVsbHksIG5ldmVyIGhhcHBlbi4KICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIHRhcmdldC5fY29tcGxldGVFcnJvcihlLCBzKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyBUYWtlIHRoZSB2YWx1ZSAod2hlbiBjb21wbGV0ZWQpIG9mIHNvdXJjZSBhbmQgY29tcGxldGUgdGFyZ2V0IHdpdGggdGhhdAogIC8vIHZhbHVlIChvciBlcnJvcikuIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHNvdXJjZSBpcyBhIF9GdXR1cmUuCiAgc3RhdGljIHZvaWQgX2NoYWluQ29yZUZ1dHVyZShfRnV0dXJlIHNvdXJjZSwgX0Z1dHVyZSB0YXJnZXQpIHsKICAgIGFzc2VydCh0YXJnZXQuX21heUFkZExpc3RlbmVyKTsgLy8gTm90IGNvbXBsZXRlZCwgbm90IGFscmVhZHkgY2hhaW5lZC4KICAgIHdoaWxlIChzb3VyY2UuX2lzQ2hhaW5lZCkgewogICAgICBzb3VyY2UgPSBzb3VyY2UuX2NoYWluU291cmNlOwogICAgfQogICAgaWYgKHNvdXJjZS5faXNDb21wbGV0ZSkgewogICAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzID0gdGFyZ2V0Ll9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgICAgdGFyZ2V0Ll9jbG9uZVJlc3VsdChzb3VyY2UpOwogICAgICBfcHJvcGFnYXRlVG9MaXN0ZW5lcnModGFyZ2V0LCBsaXN0ZW5lcnMpOwogICAgfSBlbHNlIHsKICAgICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVycyA9IHRhcmdldC5fcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIHRhcmdldC5fc2V0Q2hhaW5lZChzb3VyY2UpOwogICAgICBzb3VyY2UuX3ByZXBlbmRMaXN0ZW5lcnMobGlzdGVuZXJzKTsKICAgIH0KICB9CgogIHZvaWQgX2NvbXBsZXRlKEZ1dHVyZU9yPFQ+IHZhbHVlKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKICAgIGlmICh2YWx1ZSBpcyBGdXR1cmU8VD4pIHsKICAgICAgaWYgKHZhbHVlIGlzIF9GdXR1cmU8VD4pIHsKICAgICAgICBfY2hhaW5Db3JlRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY2hhaW5Gb3JlaWduRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgX0Z1dHVyZUxpc3RlbmVyIGxpc3RlbmVycyA9IF9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgICAgX3NldFZhbHVlKHZhbHVlKTsKICAgICAgX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzKHRoaXMsIGxpc3RlbmVycyk7CiAgICB9CiAgfQoKICB2b2lkIF9jb21wbGV0ZVdpdGhWYWx1ZShUIHZhbHVlKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKICAgIGFzc2VydCh2YWx1ZSBpcyEgRnV0dXJlPFQ+KTsKCiAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzID0gX3JlbW92ZUxpc3RlbmVycygpOwogICAgX3NldFZhbHVlKHZhbHVlKTsKICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcnMpOwogIH0KCiAgdm9pZCBfY29tcGxldGVFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBhc3NlcnQoIV9pc0NvbXBsZXRlKTsKCiAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXJzID0gX3JlbW92ZUxpc3RlbmVycygpOwogICAgX3NldEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyh0aGlzLCBsaXN0ZW5lcnMpOwogIH0KCiAgdm9pZCBfYXN5bmNDb21wbGV0ZShGdXR1cmVPcjxUPiB2YWx1ZSkgewogICAgYXNzZXJ0KCFfaXNDb21wbGV0ZSk7CiAgICAvLyBUd28gY29ybmVyIGNhc2VzIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1dHVyZToKICAgIC8vICAgMS4gdGhlIGZ1dHVyZSBpcyBhbHJlYWR5IGNvbXBsZXRlZCBhbmQgYW4gZXJyb3IuCiAgICAvLyAgIDIuIHRoZSBmdXR1cmUgaXMgbm90IHlldCBjb21wbGV0ZWQgYnV0IG1pZ2h0IGJlY29tZSBhbiBlcnJvci4KICAgIC8vIFRoZSBmaXJzdCBjYXNlIG1lYW5zIHRoYXQgd2UgbXVzdCBub3QgaW1tZWRpYXRlbHkgY29tcGxldGUgdGhlIEZ1dHVyZSwKICAgIC8vIGFzIG91ciBjb2RlIHdvdWxkIGltbWVkaWF0ZWx5IHN0YXJ0IHByb3BhZ2F0aW5nIHRoZSBlcnJvciB3aXRob3V0CiAgICAvLyBnaXZpbmcgdGhlIHRpbWUgdG8gaW5zdGFsbCBlcnJvci1oYW5kbGVycy4KICAgIC8vIEhvd2V2ZXIgdGhlIHNlY29uZCBjYXNlIHJlcXVpcmVzIHVzIHRvIGRlYWwgd2l0aCB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuCiAgICAvLyBPdGhlcndpc2UgdGhlIHZhbHVlIGNvdWxkIGNvbXBsZXRlIHdpdGggYW4gZXJyb3IgYW5kIHJlcG9ydCBhbgogICAgLy8gdW5oYW5kbGVkIGVycm9yLCBldmVuIHRob3VnaCB3ZSBrbm93IHdlIGFyZSBhbHJlYWR5IGdvaW5nIHRvIGxpc3RlbiB0bwogICAgLy8gaXQuCgogICAgaWYgKHZhbHVlIGlzIEZ1dHVyZTxUPikgewogICAgICBfY2hhaW5GdXR1cmUodmFsdWUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfc2V0UGVuZGluZ0NvbXBsZXRlKCk7CiAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgIF9jb21wbGV0ZVdpdGhWYWx1ZSh2YWx1ZSk7CiAgICB9KTsKICB9CgogIHZvaWQgX2NoYWluRnV0dXJlKEZ1dHVyZTxUPiB2YWx1ZSkgewogICAgaWYgKHZhbHVlIGlzIF9GdXR1cmU8VD4pIHsKICAgICAgaWYgKHZhbHVlLl9oYXNFcnJvcikgewogICAgICAgIC8vIERlbGF5IGNvbXBsZXRpb24gdG8gYWxsb3cgdGhlIHVzZXIgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzLgogICAgICAgIF9zZXRQZW5kaW5nQ29tcGxldGUoKTsKICAgICAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgICAgICBfY2hhaW5Db3JlRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY2hhaW5Db3JlRnV0dXJlKHZhbHVlLCB0aGlzKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBKdXN0IGxpc3RlbiBvbiB0aGUgZm9yZWlnbiBmdXR1cmUuIFRoaXMgZ3VhcmFudGVlcyBhbiBhc3luYyBkZWxheS4KICAgIF9jaGFpbkZvcmVpZ25GdXR1cmUodmFsdWUsIHRoaXMpOwogIH0KCiAgdm9pZCBfYXN5bmNDb21wbGV0ZUVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGFzc2VydCghX2lzQ29tcGxldGUpOwoKICAgIF9zZXRQZW5kaW5nQ29tcGxldGUoKTsKICAgIF96b25lLnNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBQcm9wYWdhdGVzIHRoZSB2YWx1ZS9lcnJvciBvZiBbc291cmNlXSB0byBpdHMgW2xpc3RlbmVyc10sIGV4ZWN1dGluZyB0aGUKICAgKiBsaXN0ZW5lcnMnIGNhbGxiYWNrcy4KICAgKi8KICBzdGF0aWMgdm9pZCBfcHJvcGFnYXRlVG9MaXN0ZW5lcnMoX0Z1dHVyZSBzb3VyY2UsIF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lcnMpIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGFzc2VydChzb3VyY2UuX2lzQ29tcGxldGUpOwogICAgICBib29sIGhhc0Vycm9yID0gc291cmNlLl9oYXNFcnJvcjsKICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7CiAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICBBc3luY0Vycm9yIGFzeW5jRXJyb3IgPSBzb3VyY2UuX2Vycm9yOwogICAgICAgICAgc291cmNlLl96b25lCiAgICAgICAgICAgICAgLmhhbmRsZVVuY2F1Z2h0RXJyb3IoYXN5bmNFcnJvci5lcnJvciwgYXN5bmNFcnJvci5zdGFja1RyYWNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIFVzdWFsbHkgZnV0dXJlcyBvbmx5IGhhdmUgb25lIGxpc3RlbmVyLiBJZiB0aGV5IGhhdmUgc2V2ZXJhbCwgd2UKICAgICAgLy8gY2FsbCBoYW5kbGUgdGhlbSBzZXBhcmF0ZWx5IGluIHJlY3Vyc2l2ZSBjYWxscywgY29udGludWluZwogICAgICAvLyBoZXJlIG9ubHkgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBsaXN0ZW5lciBsZWZ0LgogICAgICB3aGlsZSAobGlzdGVuZXJzLl9uZXh0TGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgIF9GdXR1cmVMaXN0ZW5lciBsaXN0ZW5lciA9IGxpc3RlbmVyczsKICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lci5fbmV4dExpc3RlbmVyOwogICAgICAgIGxpc3RlbmVyLl9uZXh0TGlzdGVuZXIgPSBudWxsOwogICAgICAgIF9wcm9wYWdhdGVUb0xpc3RlbmVycyhzb3VyY2UsIGxpc3RlbmVyKTsKICAgICAgfQogICAgICBfRnV0dXJlTGlzdGVuZXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnM7CiAgICAgIGZpbmFsIHNvdXJjZVJlc3VsdCA9IHNvdXJjZS5fcmVzdWx0T3JMaXN0ZW5lcnM7CiAgICAgIC8vIERvIHRoZSBhY3R1YWwgcHJvcGFnYXRpb24uCiAgICAgIC8vIFNldCBpbml0aWFsIHN0YXRlIG9mIGxpc3RlbmVySGFzRXJyb3IgYW5kIGxpc3RlbmVyVmFsdWVPckVycm9yLiBUaGVzZQogICAgICAvLyB2YXJpYWJsZXMgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgb3V0Y29tZSBvZiBwb3RlbnRpYWwgY2FsbGJhY2tzLgogICAgICAvLyBOb24tZXJyb3IgcmVzdWx0cywgaW5jbHVkaW5nIGZ1dHVyZXMsIGFyZSBzdG9yZWQgaW4KICAgICAgLy8gbGlzdGVuZXJWYWx1ZU9yRXJyb3IgYW5kIGxpc3RlbmVySGFzRXJyb3IgaXMgc2V0IHRvIGZhbHNlLiBFcnJvcnMKICAgICAgLy8gYXJlIHN0b3JlZCBpbiBsaXN0ZW5lclZhbHVlT3JFcnJvciBhcyBhbiBbQXN5bmNFcnJvcl0gYW5kCiAgICAgIC8vIGxpc3RlbmVySGFzRXJyb3IgaXMgc2V0IHRvIHRydWUuCiAgICAgIGJvb2wgbGlzdGVuZXJIYXNFcnJvciA9IGhhc0Vycm9yOwogICAgICB2YXIgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBzb3VyY2VSZXN1bHQ7CgogICAgICAvLyBPbmx5IGlmIHdlIGVpdGhlciBoYXZlIGFuIGVycm9yIG9yIGNhbGxiYWNrcywgZ28gaW50byB0aGlzLCBzb21ld2hhdAogICAgICAvLyBleHBlbnNpdmUsIGJyYW5jaC4gSGVyZSB3ZSdsbCBlbnRlci9sZWF2ZSB0aGUgem9uZS4gTWFueSBmdXR1cmVzCiAgICAgIC8vIGRvbid0IGhhdmUgY2FsbGJhY2tzLCBzbyB0aGlzIGlzIGEgc2lnbmlmaWNhbnQgb3B0aW1pemF0aW9uLgogICAgICBpZiAoaGFzRXJyb3IgfHwgbGlzdGVuZXIuaGFuZGxlc1ZhbHVlIHx8IGxpc3RlbmVyLmhhbmRsZXNDb21wbGV0ZSkgewogICAgICAgIFpvbmUgem9uZSA9IGxpc3RlbmVyLl96b25lOwogICAgICAgIGlmIChoYXNFcnJvciAmJiAhc291cmNlLl96b25lLmluU2FtZUVycm9yWm9uZSh6b25lKSkgewogICAgICAgICAgLy8gRG9uJ3QgY3Jvc3Mgem9uZSBib3VuZGFyaWVzIHdpdGggZXJyb3JzLgogICAgICAgICAgQXN5bmNFcnJvciBhc3luY0Vycm9yID0gc291cmNlLl9lcnJvcjsKICAgICAgICAgIHNvdXJjZS5fem9uZQogICAgICAgICAgICAgIC5oYW5kbGVVbmNhdWdodEVycm9yKGFzeW5jRXJyb3IuZXJyb3IsIGFzeW5jRXJyb3Iuc3RhY2tUcmFjZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBab25lIG9sZFpvbmU7CiAgICAgICAgaWYgKCFpZGVudGljYWwoWm9uZS5jdXJyZW50LCB6b25lKSkgewogICAgICAgICAgLy8gQ2hhbmdlIHpvbmUgaWYgaXQncyBub3QgY3VycmVudC4KICAgICAgICAgIG9sZFpvbmUgPSBab25lLl9lbnRlcih6b25lKTsKICAgICAgICB9CgogICAgICAgIC8vIFRoZXNlIGNhbGxiYWNrcyBhcmUgYWJzdHJhY3RlZCB0byBpc29sYXRlIHRoZSB0cnkvY2F0Y2ggYmxvY2tzCiAgICAgICAgLy8gZnJvbSB0aGUgcmVzdCBvZiB0aGUgY29kZSB0byB3b3JrIGFyb3VuZCBhIFY4IGdsYXNzIGphdy4KICAgICAgICB2b2lkIGhhbmRsZVdoZW5Db21wbGV0ZUNhbGxiYWNrKCkgewogICAgICAgICAgLy8gVGhlIHdoZW5Db21wbGV0ZS1oYW5kbGVyIGlzIG5vdCBjb21iaW5lZCB3aXRoIG5vcm1hbCB2YWx1ZS9lcnJvcgogICAgICAgICAgLy8gaGFuZGxpbmcuIFRoaXMgbWVhbnMgYXQgbW9zdCBvbmUgaGFuZGxlWCBtZXRob2QgaXMgY2FsbGVkIHBlcgogICAgICAgICAgLy8gbGlzdGVuZXIuCiAgICAgICAgICBhc3NlcnQoIWxpc3RlbmVyLmhhbmRsZXNWYWx1ZSk7CiAgICAgICAgICBhc3NlcnQoIWxpc3RlbmVyLmhhbmRsZXNFcnJvcik7CiAgICAgICAgICB2YXIgY29tcGxldGVSZXN1bHQ7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb21wbGV0ZVJlc3VsdCA9IGxpc3RlbmVyLmhhbmRsZVdoZW5Db21wbGV0ZSgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBpZiAoaGFzRXJyb3IgJiYgaWRlbnRpY2FsKHNvdXJjZS5fZXJyb3IuZXJyb3IsIGUpKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBzb3VyY2UuX2Vycm9yOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gbmV3IEFzeW5jRXJyb3IoZSwgcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdGVuZXJIYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb21wbGV0ZVJlc3VsdCBpcyBGdXR1cmUpIHsKICAgICAgICAgICAgaWYgKGNvbXBsZXRlUmVzdWx0IGlzIF9GdXR1cmUgJiYgY29tcGxldGVSZXN1bHQuX2lzQ29tcGxldGUpIHsKICAgICAgICAgICAgICBpZiAoY29tcGxldGVSZXN1bHQuX2hhc0Vycm9yKSB7CiAgICAgICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IGNvbXBsZXRlUmVzdWx0Ll9lcnJvcjsKICAgICAgICAgICAgICAgIGxpc3RlbmVySGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBleGlzdGluZyByZXN1bHQgb2Ygc291cmNlLgogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBjb21wbGV0ZVJlc3VsdCBmdXR1cmUgdG8gY29tcGxldGUKICAgICAgICAgICAgLy8gYmVmb3JlIGtub3dpbmcgaWYgaXQncyBhbiBlcnJvciBvciB3ZSBzaG91bGQgdXNlIHRoZSByZXN1bHQKICAgICAgICAgICAgLy8gb2Ygc291cmNlLgogICAgICAgICAgICB2YXIgb3JpZ2luYWxTb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gY29tcGxldGVSZXN1bHQudGhlbigoXykgPT4gb3JpZ2luYWxTb3VyY2UpOwogICAgICAgICAgICBsaXN0ZW5lckhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2b2lkIGhhbmRsZVZhbHVlQ2FsbGJhY2soKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IGxpc3RlbmVyLmhhbmRsZVZhbHVlKHNvdXJjZVJlc3VsdCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gbmV3IEFzeW5jRXJyb3IoZSwgcyk7CiAgICAgICAgICAgIGxpc3RlbmVySGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdm9pZCBoYW5kbGVFcnJvcigpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIEFzeW5jRXJyb3IgYXN5bmNFcnJvciA9IHNvdXJjZS5fZXJyb3I7CiAgICAgICAgICAgIGlmIChsaXN0ZW5lci5tYXRjaGVzRXJyb3JUZXN0KGFzeW5jRXJyb3IpICYmCiAgICAgICAgICAgICAgICBsaXN0ZW5lci5oYXNFcnJvckNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgbGlzdGVuZXJWYWx1ZU9yRXJyb3IgPSBsaXN0ZW5lci5oYW5kbGVFcnJvcihhc3luY0Vycm9yKTsKICAgICAgICAgICAgICBsaXN0ZW5lckhhc0Vycm9yID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgaWYgKGlkZW50aWNhbChzb3VyY2UuX2Vycm9yLmVycm9yLCBlKSkgewogICAgICAgICAgICAgIGxpc3RlbmVyVmFsdWVPckVycm9yID0gc291cmNlLl9lcnJvcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsaXN0ZW5lclZhbHVlT3JFcnJvciA9IG5ldyBBc3luY0Vycm9yKGUsIHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3RlbmVySGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGxpc3RlbmVyLmhhbmRsZXNDb21wbGV0ZSkgewogICAgICAgICAgaGFuZGxlV2hlbkNvbXBsZXRlQ2FsbGJhY2soKTsKICAgICAgICB9IGVsc2UgaWYgKCFoYXNFcnJvcikgewogICAgICAgICAgaWYgKGxpc3RlbmVyLmhhbmRsZXNWYWx1ZSkgewogICAgICAgICAgICBoYW5kbGVWYWx1ZUNhbGxiYWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChsaXN0ZW5lci5oYW5kbGVzRXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHdlIGNoYW5nZWQgem9uZSwgb2xkWm9uZSB3aWxsIG5vdCBiZSBudWxsLgogICAgICAgIGlmIChvbGRab25lICE9IG51bGwpIFpvbmUuX2xlYXZlKG9sZFpvbmUpOwoKICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIncyB2YWx1ZSBpcyBhIGZ1dHVyZSB3ZSBuZWVkIHRvIGNoYWluIGl0LiBOb3RlIHRoYXQKICAgICAgICAvLyB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGNhbGxiYWNrLgogICAgICAgIGlmIChsaXN0ZW5lclZhbHVlT3JFcnJvciBpcyBGdXR1cmUpIHsKICAgICAgICAgIEZ1dHVyZSBjaGFpblNvdXJjZSA9IGxpc3RlbmVyVmFsdWVPckVycm9yOwogICAgICAgICAgLy8gU2hvcnRjdXQgaWYgdGhlIGNoYWluLXNvdXJjZSBpcyBhbHJlYWR5IGNvbXBsZXRlZC4gSnVzdCBjb250aW51ZQogICAgICAgICAgLy8gdGhlIGxvb3AuCiAgICAgICAgICBfRnV0dXJlIHJlc3VsdCA9IGxpc3RlbmVyLnJlc3VsdDsKICAgICAgICAgIGlmIChjaGFpblNvdXJjZSBpcyBfRnV0dXJlKSB7CiAgICAgICAgICAgIGlmIChjaGFpblNvdXJjZS5faXNDb21wbGV0ZSkgewogICAgICAgICAgICAgIGxpc3RlbmVycyA9IHJlc3VsdC5fcmVtb3ZlTGlzdGVuZXJzKCk7CiAgICAgICAgICAgICAgcmVzdWx0Ll9jbG9uZVJlc3VsdChjaGFpblNvdXJjZSk7CiAgICAgICAgICAgICAgc291cmNlID0gY2hhaW5Tb3VyY2U7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2NoYWluQ29yZUZ1dHVyZShjaGFpblNvdXJjZSwgcmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2NoYWluRm9yZWlnbkZ1dHVyZShjaGFpblNvdXJjZSwgcmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgX0Z1dHVyZSByZXN1bHQgPSBsaXN0ZW5lci5yZXN1bHQ7CiAgICAgIGxpc3RlbmVycyA9IHJlc3VsdC5fcmVtb3ZlTGlzdGVuZXJzKCk7CiAgICAgIGlmICghbGlzdGVuZXJIYXNFcnJvcikgewogICAgICAgIHJlc3VsdC5fc2V0VmFsdWUobGlzdGVuZXJWYWx1ZU9yRXJyb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIEFzeW5jRXJyb3IgYXN5bmNFcnJvciA9IGxpc3RlbmVyVmFsdWVPckVycm9yOwogICAgICAgIHJlc3VsdC5fc2V0RXJyb3JPYmplY3QoYXN5bmNFcnJvcik7CiAgICAgIH0KICAgICAgLy8gUHJlcGFyZSBmb3IgbmV4dCByb3VuZC4KICAgICAgc291cmNlID0gcmVzdWx0OwogICAgfQogIH0KCiAgRnV0dXJlPFQ+IHRpbWVvdXQoRHVyYXRpb24gdGltZUxpbWl0LCB7RnV0dXJlT3I8VD4gb25UaW1lb3V0KCl9KSB7CiAgICBpZiAoX2lzQ29tcGxldGUpIHJldHVybiBuZXcgX0Z1dHVyZS5pbW1lZGlhdGUodGhpcyk7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBUaW1lciB0aW1lcjsKICAgIGlmIChvblRpbWVvdXQgPT0gbnVsbCkgewogICAgICB0aW1lciA9IG5ldyBUaW1lcih0aW1lTGltaXQsICgpIHsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoCiAgICAgICAgICAgIG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJGdXR1cmUgbm90IGNvbXBsZXRlZCIsIHRpbWVMaW1pdCkpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIFpvbmUgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgb25UaW1lb3V0ID0gem9uZS5yZWdpc3RlckNhbGxiYWNrKG9uVGltZW91dCk7CiAgICAgIHRpbWVyID0gbmV3IFRpbWVyKHRpbWVMaW1pdCwgKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlKHpvbmUucnVuKG9uVGltZW91dCkpOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGVFcnJvcihlLCBzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgdGhpcy50aGVuKChUIHYpIHsKICAgICAgaWYgKHRpbWVyLmlzQWN0aXZlKSB7CiAgICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZVdpdGhWYWx1ZSh2KTsKICAgICAgfQogICAgfSwgb25FcnJvcjogKGUsIFN0YWNrVHJhY2UgcykgewogICAgICBpZiAodGltZXIuaXNBY3RpdmUpIHsKICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZSwgcyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCi8vLyBSZWdpc3RlcnMgZXJyb3JIYW5kbGVyIGluIHpvbmUgaWYgaXQgaGFzIHRoZSBjb3JyZWN0IHR5cGUuCi8vLwovLy8gQ2hlY2tzIHRoYXQgdGhlIGZ1bmN0aW9uIGFjY2VwdHMgZWl0aGVyIGFuIFtPYmplY3RdIGFuZCBhIFtTdGFja1RyYWNlXQovLy8gb3IganVzdCBvbmUgW09iamVjdF0uIERvZXMgbm90IGNoZWNrIHRoZSByZXR1cm4gdHlwZS4KLy8vIFRoZSBhY3R1YWxseSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIGBGdXR1cmVPcjxSPmAgd2hlcmUgYFJgIGlzIHRoZQovLy8gdmFsdWUgdHlwZSBvZiB0aGUgZnV0dXJlIHRoYXQgdGhlIGNhbGwgd2lsbCBjb21wbGV0ZSAoZWl0aGVyIHJldHVybmVkCi8vLyBieSBbRnV0dXJlLnRoZW5dIG9yIFtGdXR1cmUuY2F0Y2hFcnJvcl0pLiBXZSBjaGVjayB0aGUgcmV0dXJuZWQgdmFsdWUKLy8vIGR5bmFtaWNhbGx5IGJlY2F1c2UgdGhlIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyBpbiBwb3NpdGlvbnMKLy8vIHdpdGhvdXQgaW5mZXJlbmNlLCBzbyBhIGZ1bmN0aW9uIGV4cHJlc3Npb24gd29uJ3QgaW5mZXIgdGhlIHJldHVybiB0eXBlLgovLy8KLy8vIFRocm93cyBpZiB0aGUgdHlwZSBpcyBub3QgdmFsaWQuCkZ1bmN0aW9uIF9yZWdpc3RlckVycm9ySGFuZGxlcihGdW5jdGlvbiBlcnJvckhhbmRsZXIsIFpvbmUgem9uZSkgewogIGlmIChlcnJvckhhbmRsZXIgaXMgZHluYW1pYyBGdW5jdGlvbihPYmplY3QsIFN0YWNrVHJhY2UpKSB7CiAgICByZXR1cm4gem9uZQogICAgICAgIC5yZWdpc3RlckJpbmFyeUNhbGxiYWNrPGR5bmFtaWMsIE9iamVjdCwgU3RhY2tUcmFjZT4oZXJyb3JIYW5kbGVyKTsKICB9CiAgaWYgKGVycm9ySGFuZGxlciBpcyBkeW5hbWljIEZ1bmN0aW9uKE9iamVjdCkpIHsKICAgIHJldHVybiB6b25lLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBPYmplY3Q+KGVycm9ySGFuZGxlcik7CiAgfQogIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICBlcnJvckhhbmRsZXIsCiAgICAgICJvbkVycm9yIiwKICAgICAgIkVycm9yIGhhbmRsZXIgbXVzdCBhY2NlcHQgb25lIE9iamVjdCBvciBvbmUgT2JqZWN0IGFuZCBhIFN0YWNrVHJhY2UiCiAgICAgICIgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJuIGEgYSB2YWxpZCByZXN1bHQiKTsKfQqDBwBOTjwBFAFKM0QtHSEBNy4BJgE+IlBMHzArBicEATwBTSQwAgExJ1AiBAE9MwQCATAnUB0EAT0uBAIBHiIiJikjKj0wRDlAIT0bHhM0Gx8gARhJHCdIAU1MATseIwEiATU1OzwBJhoVBAEqJBoVBAEqHRUEATMGSB4aHQQBLEMEATEkRwQBMy5ESkdBO0MNOU8GBAEhGysEAgEoPj4jKQFHSSsuAUg+NiYBOSQBOiQBNiEBBi43BUVFBhQBBj8FPTwFR0kuBU1QKTYGGgEuJAFBHAQBQSsWBAE9HywEAURAATdCPzIxLwElHRwhBAFCJS5AHU4mMj8IBjMEASkoMipGEwQBPyovPkkGTxMEAS0qLz8GShMEAToBHxokBAEhIB8EARoXHwQBHRgfBAEpHEAaIAQBK0AaIAQBODgEAT8GRyYaIBw0BAEwLBszJQ0YOEIeJyMpEgoeCBsvIy8KBgQBNiMbPiYnLC8pCjIIDRg4Qh4nIy8SCh4IGzAjMAoGBAEnTBsaMh8nBAFBGikeNCQWFgYRBAFNTEkTQyEgAUAiChwrQys7TSEJUE1RGzYrMgoVTRpQMB0lCgYEAU1HQUsgJAYePSMwDT0iKwYEASYaHiEnDyoIDTYYLgYEASUaIQE0FiwEAT8aATQiLAQBKxoyOkdOSTJPRk4LAR4bDgYbISEIBAEnHx1FHyUpDA8nCA4GSiYEATsaARshKQgEAQZOGwZREyIoHxgxF00KEAhKRDkwLiwnMQgsNiRPSD1LQyooLwFOSkZLJD82MRdNEgoBFi4uJwoBSkQsTksXKioeEDwbQTQVOw4lFAwqSy4+KRA+Fg5JSxopTyYMCgElEEcbOSUMCgEdEDM5LUcoDhs1NBU7DiUMCgEoKCAnIwwRJxsMCgE5MwFOOC41ThcsKCs1MCQYFTUOEzYMEgoIKC0fMA82LAghFwYEAUU5KhEdKB9GCg0gNCgOMRknCgoGFhwYJggkHBglCAgTBAIBPwRLOkdKSktNBCVDPhBMBDJGBCEUEUw1AgEbZGFydDphc3luYy9mdXR1cmVfaW1wbC5kYXJ0OW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9zY2hlZHVsZV9taWNyb3Rhc2suZGFydJMOLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCnR5cGVkZWYgdm9pZCBfQXN5bmNDYWxsYmFjaygpOwoKY2xhc3MgX0FzeW5jQ2FsbGJhY2tFbnRyeSB7CiAgZmluYWwgX0FzeW5jQ2FsbGJhY2sgY2FsbGJhY2s7CiAgX0FzeW5jQ2FsbGJhY2tFbnRyeSBuZXh0OwogIF9Bc3luY0NhbGxiYWNrRW50cnkodGhpcy5jYWxsYmFjayk7Cn0KCi8qKiBIZWFkIG9mIHNpbmdsZSBsaW5rZWQgbGlzdCBvZiBwZW5kaW5nIGNhbGxiYWNrcy4gKi8KX0FzeW5jQ2FsbGJhY2tFbnRyeSBfbmV4dENhbGxiYWNrOwovKiogVGFpbCBvZiBzaW5nbGUgbGlua2VkIGxpc3Qgb2YgcGVuZGluZyBjYWxsYmFja3MuICovCl9Bc3luY0NhbGxiYWNrRW50cnkgX2xhc3RDYWxsYmFjazsKLyoqCiAqIFRhaWwgb2YgcHJpb3JpdHkgY2FsbGJhY2tzIGFkZGVkIGJ5IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNhbGxiYWNrLgogKgogKiBQcmlvcml0eSBjYWxsYmFja3MgYXJlIHB1dCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogKiBjYWxsYmFjayBxdWV1ZSwgc28gdGhhdCBpZiBvbmUgY2FsbGJhY2sgc2NoZWR1bGVzIG1vcmUgdGhhbiBvbmUKICogcHJpb3JpdHkgY2FsbGJhY2ssIHRoZXkgYXJlIHN0aWxsIGVucXVldWVkIGluIHNjaGVkdWxpbmcgb3JkZXIuCiAqLwpfQXN5bmNDYWxsYmFja0VudHJ5IF9sYXN0UHJpb3JpdHlDYWxsYmFjazsKLyoqCiAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgdGhlIGNhbGxiYWNrIGxvb3AuCiAqCiAqIElmIHdlIGFyZSBpbnNpZGUgdGhlIGxvb3AsIHdlIG5ldmVyIG5lZWQgdG8gc2NoZWR1bGUgdGhlIGxvb3AsCiAqIGV2ZW4gaWYgYWRkaW5nIGEgZmlyc3QgZWxlbWVudC4KICovCmJvb2wgX2lzSW5DYWxsYmFja0xvb3AgPSBmYWxzZTsKCnZvaWQgX21pY3JvdGFza0xvb3AoKSB7CiAgd2hpbGUgKF9uZXh0Q2FsbGJhY2sgIT0gbnVsbCkgewogICAgX2xhc3RQcmlvcml0eUNhbGxiYWNrID0gbnVsbDsKICAgIF9Bc3luY0NhbGxiYWNrRW50cnkgZW50cnkgPSBfbmV4dENhbGxiYWNrOwogICAgX25leHRDYWxsYmFjayA9IGVudHJ5Lm5leHQ7CiAgICBpZiAoX25leHRDYWxsYmFjayA9PSBudWxsKSBfbGFzdENhbGxiYWNrID0gbnVsbDsKICAgIChlbnRyeS5jYWxsYmFjaykoKTsKICB9Cn0KCnZvaWQgX3N0YXJ0TWljcm90YXNrTG9vcCgpIHsKICBfaXNJbkNhbGxiYWNrTG9vcCA9IHRydWU7CiAgdHJ5IHsKICAgIC8vIE1vdmVkIHRvIHNlcGFyYXRlIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5LWZpbmFsbHkgcHJldmVudHMKICAgIC8vIGdvb2Qgb3B0aW1pemF0aW9uLgogICAgX21pY3JvdGFza0xvb3AoKTsKICB9IGZpbmFsbHkgewogICAgX2xhc3RQcmlvcml0eUNhbGxiYWNrID0gbnVsbDsKICAgIF9pc0luQ2FsbGJhY2tMb29wID0gZmFsc2U7CiAgICBpZiAoX25leHRDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgIF9Bc3luY1J1bi5fc2NoZWR1bGVJbW1lZGlhdGUoX3N0YXJ0TWljcm90YXNrTG9vcCk7CiAgICB9CiAgfQp9CgovKioKICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFzIGEgbWljcm90YXNrLgogKgogKiBUaGUgbWljcm90YXNrIGlzIGNhbGxlZCBhZnRlciBhbGwgb3RoZXIgY3VycmVudGx5IHNjaGVkdWxlZAogKiBtaWNyb3Rhc2tzLCBidXQgYXMgcGFydCBvZiB0aGUgY3VycmVudCBzeXN0ZW0gZXZlbnQuCiAqLwp2b2lkIF9zY2hlZHVsZUFzeW5jQ2FsbGJhY2soX0FzeW5jQ2FsbGJhY2sgY2FsbGJhY2spIHsKICBfQXN5bmNDYWxsYmFja0VudHJ5IG5ld0VudHJ5ID0gbmV3IF9Bc3luY0NhbGxiYWNrRW50cnkoY2FsbGJhY2spOwogIGlmIChfbmV4dENhbGxiYWNrID09IG51bGwpIHsKICAgIF9uZXh0Q2FsbGJhY2sgPSBfbGFzdENhbGxiYWNrID0gbmV3RW50cnk7CiAgICBpZiAoIV9pc0luQ2FsbGJhY2tMb29wKSB7CiAgICAgIF9Bc3luY1J1bi5fc2NoZWR1bGVJbW1lZGlhdGUoX3N0YXJ0TWljcm90YXNrTG9vcCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIF9sYXN0Q2FsbGJhY2submV4dCA9IG5ld0VudHJ5OwogICAgX2xhc3RDYWxsYmFjayA9IG5ld0VudHJ5OwogIH0KfQoKLyoqCiAqIFNjaGVkdWxlcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgYWxsIG90aGVyIGN1cnJlbnRseSBzY2hlZHVsZWQgb25lcy4KICoKICogVGhpcyBjYWxsYmFjayB0YWtlcyBwcmlvcml0eSBvdmVyIGV4aXN0aW5nIHNjaGVkdWxlZCBjYWxsYmFja3MuCiAqIEl0IGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5IHRvIGdpdmUgaGlnaGVyIHByaW9yaXR5IHRvIGVycm9yIHJlcG9ydGluZy4KICoKICogSXMgYWx3YXlzIHJ1biBpbiB0aGUgcm9vdCB6b25lLgogKi8Kdm9pZCBfc2NoZWR1bGVQcmlvcml0eUFzeW5jQ2FsbGJhY2soX0FzeW5jQ2FsbGJhY2sgY2FsbGJhY2spIHsKICBpZiAoX25leHRDYWxsYmFjayA9PSBudWxsKSB7CiAgICBfc2NoZWR1bGVBc3luY0NhbGxiYWNrKGNhbGxiYWNrKTsKICAgIF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9IF9sYXN0Q2FsbGJhY2s7CiAgICByZXR1cm47CiAgfQogIF9Bc3luY0NhbGxiYWNrRW50cnkgZW50cnkgPSBuZXcgX0FzeW5jQ2FsbGJhY2tFbnRyeShjYWxsYmFjayk7CiAgaWYgKF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9PSBudWxsKSB7CiAgICBlbnRyeS5uZXh0ID0gX25leHRDYWxsYmFjazsKICAgIF9uZXh0Q2FsbGJhY2sgPSBfbGFzdFByaW9yaXR5Q2FsbGJhY2sgPSBlbnRyeTsKICB9IGVsc2UgewogICAgZW50cnkubmV4dCA9IF9sYXN0UHJpb3JpdHlDYWxsYmFjay5uZXh0OwogICAgX2xhc3RQcmlvcml0eUNhbGxiYWNrLm5leHQgPSBlbnRyeTsKICAgIF9sYXN0UHJpb3JpdHlDYWxsYmFjayA9IGVudHJ5OwogICAgaWYgKGVudHJ5Lm5leHQgPT0gbnVsbCkgewogICAgICBfbGFzdENhbGxiYWNrID0gZW50cnk7CiAgICB9CiAgfQp9CgovKioKICogUnVucyBhIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogKgogKiBDYWxsYmFja3MgcmVnaXN0ZXJlZCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gYXJlIGFsd2F5cyBleGVjdXRlZCBpbiBvcmRlciBhbmQKICogYXJlIGd1YXJhbnRlZWQgdG8gcnVuIGJlZm9yZSBvdGhlciBhc3luY2hyb25vdXMgZXZlbnRzIChsaWtlIFtUaW1lcl0gZXZlbnRzLAogKiBvciBET00gZXZlbnRzKS4KICoKICogKipXYXJuaW5nOioqIGl0IGlzIHBvc3NpYmxlIHRvIHN0YXJ2ZSB0aGUgRE9NIGJ5IHJlZ2lzdGVyaW5nIGFzeW5jaHJvbm91cwogKiBjYWxsYmFja3MgdGhyb3VnaCB0aGlzIG1ldGhvZC4gRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHJ1bnMKICogdGhlIGNhbGxiYWNrcyB3aXRob3V0IGV2ZXIgZ2l2aW5nIHRoZSBUaW1lciBjYWxsYmFjayBhIGNoYW5jZSB0byBleGVjdXRlOgogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgVGltZXIucnVuKCgpIHsgcHJpbnQoImV4ZWN1dGVkIik7IH0pOyAgLy8gV2lsbCBuZXZlciBiZSBleGVjdXRlZC4KICogICAgICAgZm9vKCkgewogKiAgICAgICAgIHNjaGVkdWxlTWljcm90YXNrKGZvbyk7ICAvLyBTY2hlZHVsZXMgW2Zvb10gaW4gZnJvbnQgb2Ygb3RoZXIgZXZlbnRzLgogKiAgICAgICB9CiAqICAgICAgIGZvbygpOwogKiAgICAgfQogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBbVGhlIEV2ZW50IExvb3AgYW5kIERhcnRdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9hcnRpY2xlcy9ldmVudC1sb29wLyk6CiAqIExlYXJuIGhvdyBEYXJ0IGhhbmRsZXMgdGhlIGV2ZW50IHF1ZXVlIGFuZCBtaWNyb3Rhc2sgcXVldWUsIHNvIHlvdSBjYW4gd3JpdGUKICogYmV0dGVyIGFzeW5jaHJvbm91cyBjb2RlIHdpdGggZmV3ZXIgc3VycHJpc2VzLgogKi8Kdm9pZCBzY2hlZHVsZU1pY3JvdGFzayh2b2lkIGNhbGxiYWNrKCkpIHsKICBfWm9uZSBjdXJyZW50Wm9uZSA9IFpvbmUuY3VycmVudDsKICBpZiAoaWRlbnRpY2FsKF9yb290Wm9uZSwgY3VycmVudFpvbmUpKSB7CiAgICAvLyBObyBuZWVkIHRvIGJpbmQgdGhlIGNhbGxiYWNrLiBXZSBrbm93IHRoYXQgdGhlIHJvb3QncyBzY2hlZHVsZU1pY3JvdGFzawogICAgLy8gd2lsbCBiZSBpbnZva2VkIGluIHRoZSByb290IHpvbmUuCiAgICBfcm9vdFNjaGVkdWxlTWljcm90YXNrKG51bGwsIG51bGwsIF9yb290Wm9uZSwgY2FsbGJhY2spOwogICAgcmV0dXJuOwogIH0KICBfWm9uZUZ1bmN0aW9uIGltcGxlbWVudGF0aW9uID0gY3VycmVudFpvbmUuX3NjaGVkdWxlTWljcm90YXNrOwogIGlmIChpZGVudGljYWwoX3Jvb3Rab25lLCBpbXBsZW1lbnRhdGlvbi56b25lKSAmJgogICAgICBfcm9vdFpvbmUuaW5TYW1lRXJyb3Jab25lKGN1cnJlbnRab25lKSkgewogICAgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzaygKICAgICAgICBudWxsLCBudWxsLCBjdXJyZW50Wm9uZSwgY3VycmVudFpvbmUucmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjaykpOwogICAgcmV0dXJuOwogIH0KICBab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb3Rhc2soWm9uZS5jdXJyZW50LmJpbmRDYWxsYmFja0d1YXJkZWQoY2FsbGJhY2spKTsKfQoKY2xhc3MgX0FzeW5jUnVuIHsKICAvKiogU2NoZWR1bGUgdGhlIGdpdmVuIGNhbGxiYWNrIGJlZm9yZSBhbnkgb3RoZXIgZXZlbnQgaW4gdGhlIGV2ZW50LWxvb3AuICovCiAgZXh0ZXJuYWwgc3RhdGljIHZvaWQgX3NjaGVkdWxlSW1tZWRpYXRlKHZvaWQgY2FsbGJhY2soKSk7Cn0KgJsATk48ARQBHwEcIRwmAgE4IzgjBEkDNkNDBCsENgNCIwQgARgiIi8gNRgEAgEdHAg/GhYOIh8hOQYEAgEENQM/OAQ3RB8uHjkGCyMeBAIBBFADQ0oDIwQ/HyYrDARBJyAzCy0oIx4dBgQCAQQjA09QEwNNSU0DEEsRUQsQCQMWA09QMgQqJCtPKT0MBEEzMBxKDAROAgESTzwCASJkYXJ0OmFzeW5jL3NjaGVkdWxlX21pY3JvdGFzay5kYXJ0OG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9zdHJlYW1fY29udHJvbGxlci5kYXJ0wAB/ry8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuYXN5bmM7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvbnRyb2xsZXIgZm9yIGNyZWF0aW5nIGFuZCBhZGRpbmcgZXZlbnRzIHRvIGEgc3RyZWFtLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKICogVHlwZSBvZiBhIHN0cmVhbSBjb250cm9sbGVyJ3MgYG9uTGlzdGVuYCwgYG9uUGF1c2VgIGFuZCBgb25SZXN1bWVgIGNhbGxiYWNrcy4KICovCnR5cGVkZWYgdm9pZCBDb250cm9sbGVyQ2FsbGJhY2soKTsKCi8qKgogKiBUeXBlIG9mIHN0cmVhbSBjb250cm9sbGVyIGBvbkNhbmNlbGAgY2FsbGJhY2tzLgogKgogKiBUaGUgY2FsbGJhY2sgbWF5IHJldHVybiBlaXRoZXIgYHZvaWRgIG9yIGEgZnV0dXJlLgogKi8KdHlwZWRlZiBDb250cm9sbGVyQ2FuY2VsQ2FsbGJhY2soKTsKCi8qKgogKiBBIGNvbnRyb2xsZXIgd2l0aCB0aGUgc3RyZWFtIGl0IGNvbnRyb2xzLgogKgogKiBUaGlzIGNvbnRyb2xsZXIgYWxsb3dzIHNlbmRpbmcgZGF0YSwgZXJyb3IgYW5kIGRvbmUgZXZlbnRzIG9uCiAqIGl0cyBbc3RyZWFtXS4KICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBzaW1wbGUgc3RyZWFtIHRoYXQgb3RoZXJzCiAqIGNhbiBsaXN0ZW4gb24sIGFuZCB0byBwdXNoIGV2ZW50cyB0byB0aGF0IHN0cmVhbS4KICoKICogSXQncyBwb3NzaWJsZSB0byBjaGVjayB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgcGF1c2VkIG9yIG5vdCwgYW5kIHdoZXRoZXIKICogaXQgaGFzIHN1YnNjcmliZXJzIG9yIG5vdCwgYXMgd2VsbCBhcyBnZXR0aW5nIGEgY2FsbGJhY2sgd2hlbiBlaXRoZXIgb2YKICogdGhlc2UgY2hhbmdlLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtQ29udHJvbGxlcjxUPiBpbXBsZW1lbnRzIFN0cmVhbVNpbms8VD4gewogIC8qKiBUaGUgc3RyZWFtIHRoYXQgdGhpcyBjb250cm9sbGVyIGlzIGNvbnRyb2xsaW5nLiAqLwogIFN0cmVhbTxUPiBnZXQgc3RyZWFtOwoKICAvKioKICAgKiBBIGNvbnRyb2xsZXIgd2l0aCBhIFtzdHJlYW1dIHRoYXQgc3VwcG9ydHMgb25seSBvbmUgc2luZ2xlIHN1YnNjcmliZXIuCiAgICoKICAgKiBJZiBbc3luY10gaXMgdHJ1ZSwgdGhlIHJldHVybmVkIHN0cmVhbSBjb250cm9sbGVyIGlzIGEKICAgKiBbU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyXSwgYW5kIG11c3QgYmUgdXNlZCB3aXRoIHRoZSBjYXJlCiAgICogYW5kIGF0dGVudGlvbiBuZWNlc3NhcnkgdG8gbm90IGJyZWFrIHRoZSBbU3RyZWFtXSBjb250cmFjdC4gSWYgaW4gZG91YnQsCiAgICogdXNlIHRoZSBub24tc3luYyB2ZXJzaW9uLgogICAqCiAgICogVXNpbmcgYW4gYXN5bmNocm9ub3VzIGNvbnRyb2xsZXIgd2lsbCBuZXZlciBnaXZlIHRoZSB3cm9uZwogICAqIGJlaGF2aW9yLCBidXQgdXNpbmcgYSBzeW5jaHJvbm91cyBjb250cm9sbGVyIGluY29ycmVjdGx5IGNhbiBjYXVzZQogICAqIG90aGVyd2lzZSBjb3JyZWN0IHByb2dyYW1zIHRvIGJyZWFrLgogICAqCiAgICogQSBzeW5jaHJvbm91cyBjb250cm9sbGVyIGlzIG9ubHkgaW50ZW5kZWQgZm9yIG9wdGltaXppbmcgZXZlbnQKICAgKiBwcm9wYWdhdGlvbiB3aGVuIG9uZSBhc3luY2hyb25vdXMgZXZlbnQgaW1tZWRpYXRlbHkgdHJpZ2dlcnMgYW5vdGhlci4KICAgKiBJdCBzaG91bGQgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBjYWxscyB0byBbYWRkXSBvciBbYWRkRXJyb3JdCiAgICogYXJlIGd1YXJhbnRlZWQgdG8gb2NjdXIgaW4gcGxhY2VzIHdoZXJlIGl0IHdvbid0IGJyZWFrIGBTdHJlYW1gIGludmFyaWFudHMuCiAgICoKICAgKiBVc2Ugc3luY2hyb25vdXMgY29udHJvbGxlcnMgb25seSB0byBmb3J3YXJkIChwb3RlbnRpYWxseSB0cmFuc2Zvcm1lZCkKICAgKiBldmVudHMgZnJvbSBhbm90aGVyIHN0cmVhbSBvciBhIGZ1dHVyZS4KICAgKgogICAqIEEgU3RyZWFtIHNob3VsZCBiZSBpbmVydCB1bnRpbCBhIHN1YnNjcmliZXIgc3RhcnRzIGxpc3RlbmluZyBvbiBpdCAodXNpbmcKICAgKiB0aGUgW29uTGlzdGVuXSBjYWxsYmFjayB0byBzdGFydCBwcm9kdWNpbmcgZXZlbnRzKS4gU3RyZWFtcyBzaG91bGQgbm90CiAgICogbGVhayByZXNvdXJjZXMgKGxpa2Ugd2Vic29ja2V0cykgd2hlbiBubyB1c2VyIGV2ZXIgbGlzdGVucyBvbiB0aGUgc3RyZWFtLgogICAqCiAgICogVGhlIGNvbnRyb2xsZXIgYnVmZmVycyBhbGwgaW5jb21pbmcgZXZlbnRzIHVudGlsIGEgc3Vic2NyaWJlciBpcwogICAqIHJlZ2lzdGVyZWQsIGJ1dCB0aGlzIGZlYXR1cmUgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiByYXJlIGNpcmN1bXN0YW5jZXMuCiAgICoKICAgKiBUaGUgW29uUGF1c2VdIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gYmVjb21lcwogICAqIHBhdXNlZC4gW29uUmVzdW1lXSBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIHJlc3VtZWQuCiAgICoKICAgKiBUaGUgW29uTGlzdGVuXSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtCiAgICogcmVjZWl2ZXMgaXRzIGxpc3RlbmVyIGFuZCBbb25DYW5jZWxdIHdoZW4gdGhlIGxpc3RlbmVyIGVuZHMKICAgKiBpdHMgc3Vic2NyaXB0aW9uLiBJZiBbb25DYW5jZWxdIG5lZWRzIHRvIHBlcmZvcm0gYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiwKICAgKiBbb25DYW5jZWxdIHNob3VsZCByZXR1cm4gYSBmdXR1cmUgdGhhdCBjb21wbGV0ZXMgd2hlbiB0aGUgY2FuY2VsIG9wZXJhdGlvbgogICAqIGlzIGRvbmUuCiAgICoKICAgKiBJZiB0aGUgc3RyZWFtIGlzIGNhbmNlbGVkIGJlZm9yZSB0aGUgY29udHJvbGxlciBuZWVkcyBuZXcgZGF0YSB0aGUKICAgKiBbb25SZXN1bWVdIGNhbGwgbWlnaHQgbm90IGJlIGV4ZWN1dGVkLgogICAqLwogIGZhY3RvcnkgU3RyZWFtQ29udHJvbGxlcigKICAgICAge3ZvaWQgb25MaXN0ZW4oKSwKICAgICAgdm9pZCBvblBhdXNlKCksCiAgICAgIHZvaWQgb25SZXN1bWUoKSwKICAgICAgb25DYW5jZWwoKSwKICAgICAgYm9vbCBzeW5jOiBmYWxzZX0pIHsKICAgIHJldHVybiBzeW5jCiAgICAgICAgPyBuZXcgX1N5bmNTdHJlYW1Db250cm9sbGVyPFQ+KG9uTGlzdGVuLCBvblBhdXNlLCBvblJlc3VtZSwgb25DYW5jZWwpCiAgICAgICAgOiBuZXcgX0FzeW5jU3RyZWFtQ29udHJvbGxlcjxUPihvbkxpc3Rlbiwgb25QYXVzZSwgb25SZXN1bWUsIG9uQ2FuY2VsKTsKICB9CgogIC8qKgogICAqIEEgY29udHJvbGxlciB3aGVyZSBbc3RyZWFtXSBjYW4gYmUgbGlzdGVuZWQgdG8gbW9yZSB0aGFuIG9uY2UuCiAgICoKICAgKiBUaGUgW1N0cmVhbV0gcmV0dXJuZWQgYnkgW3N0cmVhbV0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtLgogICAqIEl0IGNhbiBiZSBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZS4KICAgKgogICAqIEEgU3RyZWFtIHNob3VsZCBiZSBpbmVydCB1bnRpbCBhIHN1YnNjcmliZXIgc3RhcnRzIGxpc3RlbmluZyBvbiBpdCAodXNpbmcKICAgKiB0aGUgW29uTGlzdGVuXSBjYWxsYmFjayB0byBzdGFydCBwcm9kdWNpbmcgZXZlbnRzKS4gU3RyZWFtcyBzaG91bGQgbm90CiAgICogbGVhayByZXNvdXJjZXMgKGxpa2Ugd2Vic29ja2V0cykgd2hlbiBubyB1c2VyIGV2ZXIgbGlzdGVucyBvbiB0aGUgc3RyZWFtLgogICAqCiAgICogQnJvYWRjYXN0IHN0cmVhbXMgZG8gbm90IGJ1ZmZlciBldmVudHMgd2hlbiB0aGVyZSBpcyBubyBsaXN0ZW5lci4KICAgKgogICAqIFRoZSBjb250cm9sbGVyIGRpc3RyaWJ1dGVzIGFueSBldmVudHMgdG8gYWxsIGN1cnJlbnRseSBzdWJzY3JpYmVkCiAgICogbGlzdGVuZXJzIGF0IHRoZSB0aW1lIHdoZW4gW2FkZF0sIFthZGRFcnJvcl0gb3IgW2Nsb3NlXSBpcyBjYWxsZWQuCiAgICogSXQgaXMgbm90IGFsbG93ZWQgdG8gY2FsbCBgYWRkYCwgYGFkZEVycm9yYCwgb3IgYGNsb3NlYCBiZWZvcmUgYSBwcmV2aW91cwogICAqIGNhbGwgaGFzIHJldHVybmVkLiBUaGUgY29udHJvbGxlciBkb2VzIG5vdCBoYXZlIGFueSBpbnRlcm5hbCBxdWV1ZSBvZgogICAqIGV2ZW50cywgYW5kIGlmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMgYXQgdGhlIHRpbWUgdGhlIGV2ZW50IGlzIGFkZGVkLAogICAqIGl0IHdpbGwganVzdCBiZSBkcm9wcGVkLCBvciwgaWYgaXQgaXMgYW4gZXJyb3IsIGJlIHJlcG9ydGVkIGFzIHVuY2F1Z2h0LgogICAqCiAgICogRWFjaCBsaXN0ZW5lciBzdWJzY3JpcHRpb24gaXMgaGFuZGxlZCBpbmRlcGVuZGVudGx5LAogICAqIGFuZCBpZiBvbmUgcGF1c2VzLCBvbmx5IHRoZSBwYXVzaW5nIGxpc3RlbmVyIGlzIGFmZmVjdGVkLgogICAqIEEgcGF1c2VkIGxpc3RlbmVyIHdpbGwgYnVmZmVyIGV2ZW50cyBpbnRlcm5hbGx5IHVudGlsIHVucGF1c2VkIG9yIGNhbmNlbGVkLgogICAqCiAgICogSWYgW3N5bmNdIGlzIHRydWUsIGV2ZW50cyBtYXkgYmUgZmlyZWQgZGlyZWN0bHkgYnkgdGhlIHN0cmVhbSdzCiAgICogc3Vic2NyaXB0aW9ucyBkdXJpbmcgYW4gW2FkZF0sIFthZGRFcnJvcl0gb3IgW2Nsb3NlXSBjYWxsLgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gY29udHJvbGxlciBpcyBhIFtTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXJdLAogICAqIGFuZCBtdXN0IGJlIHVzZWQgd2l0aCB0aGUgY2FyZSBhbmQgYXR0ZW50aW9uIG5lY2Vzc2FyeSB0byBub3QgYnJlYWsKICAgKiB0aGUgW1N0cmVhbV0gY29udHJhY3QuCiAgICogU2VlIFtDb21wbGV0ZXIuc3luY10gZm9yIHNvbWUgZXhwbGFuYXRpb25zIG9uIHdoZW4gYSBzeW5jaHJvbm91cwogICAqIGRpc3BhdGNoaW5nIGNhbiBiZSB1c2VkLgogICAqIElmIGluIGRvdWJ0LCBrZWVwIHRoZSBjb250cm9sbGVyIG5vbi1zeW5jLgogICAqCiAgICogSWYgW3N5bmNdIGlzIGZhbHNlLCB0aGUgZXZlbnQgd2lsbCBhbHdheXMgYmUgZmlyZWQgYXQgYSBsYXRlciB0aW1lLAogICAqIGFmdGVyIHRoZSBjb2RlIGFkZGluZyB0aGUgZXZlbnQgaGFzIGNvbXBsZXRlZC4KICAgKiBJbiB0aGF0IGNhc2UsIG5vIGd1YXJhbnRlZXMgYXJlIGdpdmVuIHdpdGggcmVnYXJkIHRvIHdoZW4KICAgKiBtdWx0aXBsZSBsaXN0ZW5lcnMgZ2V0IHRoZSBldmVudHMsIGV4Y2VwdCB0aGF0IGVhY2ggbGlzdGVuZXIgd2lsbCBnZXQKICAgKiBhbGwgZXZlbnRzIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBFYWNoIHN1YnNjcmlwdGlvbiBoYW5kbGVzIHRoZSBldmVudHMKICAgKiBpbmRpdmlkdWFsbHkuCiAgICogSWYgdHdvIGV2ZW50cyBhcmUgc2VudCBvbiBhbiBhc3luYyBjb250cm9sbGVyIHdpdGggdHdvIGxpc3RlbmVycywKICAgKiBvbmUgb2YgdGhlIGxpc3RlbmVycyBtYXkgZ2V0IGJvdGggZXZlbnRzCiAgICogYmVmb3JlIHRoZSBvdGhlciBsaXN0ZW5lciBnZXRzIGFueS4KICAgKiBBIGxpc3RlbmVyIG11c3QgYmUgc3Vic2NyaWJlZCBib3RoIHdoZW4gdGhlIGV2ZW50IGlzIGluaXRpYXRlZAogICAqICh0aGF0IGlzLCB3aGVuIFthZGRdIGlzIGNhbGxlZCkKICAgKiBhbmQgd2hlbiB0aGUgZXZlbnQgaXMgbGF0ZXIgZGVsaXZlcmVkLAogICAqIGluIG9yZGVyIHRvIHJlY2VpdmUgdGhlIGV2ZW50LgogICAqCiAgICogVGhlIFtvbkxpc3Rlbl0gY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIGZpcnN0IGxpc3RlbmVyIGlzIHN1YnNjcmliZWQsCiAgICogYW5kIHRoZSBbb25DYW5jZWxdIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IGFjdGl2ZSBsaXN0ZW5lcnMuCiAgICogSWYgYSBsaXN0ZW5lciBpcyBhZGRlZCBhZ2FpbiBsYXRlciwgYWZ0ZXIgdGhlIFtvbkNhbmNlbF0gd2FzIGNhbGxlZCwKICAgKiB0aGUgW29uTGlzdGVuXSB3aWxsIGJlIGNhbGxlZCBhZ2Fpbi4KICAgKi8KICBmYWN0b3J5IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KAogICAgICB7dm9pZCBvbkxpc3RlbigpLCB2b2lkIG9uQ2FuY2VsKCksIGJvb2wgc3luYzogZmFsc2V9KSB7CiAgICByZXR1cm4gc3luYwogICAgICAgID8gbmV3IF9TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPihvbkxpc3Rlbiwgb25DYW5jZWwpCiAgICAgICAgOiBuZXcgX0FzeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPihvbkxpc3Rlbiwgb25DYW5jZWwpOwogIH0KCiAgLyoqCiAgICogVGhlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICoKICAgKiBNYXkgYmUgc2V0IHRvIGBudWxsYCwgaW4gd2hpY2ggY2FzZSBubyBjYWxsYmFjayB3aWxsIGhhcHBlbi4KICAgKi8KICBDb250cm9sbGVyQ2FsbGJhY2sgZ2V0IG9uTGlzdGVuOwoKICB2b2lkIHNldCBvbkxpc3Rlbih2b2lkIG9uTGlzdGVuSGFuZGxlcigpKTsKCiAgLyoqCiAgICogVGhlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgcGF1c2VkLgogICAqCiAgICogTWF5IGJlIHNldCB0byBgbnVsbGAsIGluIHdoaWNoIGNhc2Ugbm8gY2FsbGJhY2sgd2lsbCBoYXBwZW4uCiAgICoKICAgKiBQYXVzZSByZWxhdGVkIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBicm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXJzLgogICAqLwogIENvbnRyb2xsZXJDYWxsYmFjayBnZXQgb25QYXVzZTsKCiAgdm9pZCBzZXQgb25QYXVzZSh2b2lkIG9uUGF1c2VIYW5kbGVyKCkpOwoKICAvKioKICAgKiBUaGUgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyByZXN1bWVkLgogICAqCiAgICogTWF5IGJlIHNldCB0byBgbnVsbGAsIGluIHdoaWNoIGNhc2Ugbm8gY2FsbGJhY2sgd2lsbCBoYXBwZW4uCiAgICoKICAgKiBQYXVzZSByZWxhdGVkIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCBvbiBicm9hZGNhc3Qgc3RyZWFtIGNvbnRyb2xsZXJzLgogICAqLwogIENvbnRyb2xsZXJDYWxsYmFjayBnZXQgb25SZXN1bWU7CgogIHZvaWQgc2V0IG9uUmVzdW1lKHZvaWQgb25SZXN1bWVIYW5kbGVyKCkpOwoKICAvKioKICAgKiBUaGUgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjYW5jZWxlZC4KICAgKgogICAqIE1heSBiZSBzZXQgdG8gYG51bGxgLCBpbiB3aGljaCBjYXNlIG5vIGNhbGxiYWNrIHdpbGwgaGFwcGVuLgogICAqLwogIENvbnRyb2xsZXJDYW5jZWxDYWxsYmFjayBnZXQgb25DYW5jZWw7CgogIHZvaWQgc2V0IG9uQ2FuY2VsKG9uQ2FuY2VsSGFuZGxlcigpKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHZpZXcgb2YgdGhpcyBvYmplY3QgdGhhdCBvbmx5IGV4cG9zZXMgdGhlIFtTdHJlYW1TaW5rXSBpbnRlcmZhY2UuCiAgICovCiAgU3RyZWFtU2luazxUPiBnZXQgc2luazsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgc3RyZWFtIGNvbnRyb2xsZXIgaXMgY2xvc2VkIGZvciBhZGRpbmcgbW9yZSBldmVudHMuCiAgICoKICAgKiBUaGUgY29udHJvbGxlciBiZWNvbWVzIGNsb3NlZCBieSBjYWxsaW5nIHRoZSBbY2xvc2VdIG1ldGhvZC4KICAgKiBOZXcgZXZlbnRzIGNhbm5vdCBiZSBhZGRlZCwgYnkgY2FsbGluZyBbYWRkXSBvciBbYWRkRXJyb3JdLAogICAqIHRvIGEgY2xvc2VkIGNvbnRyb2xsZXIuCiAgICoKICAgKiBJZiB0aGUgY29udHJvbGxlciBpcyBjbG9zZWQsCiAgICogdGhlICJkb25lIiBldmVudCBtaWdodCBub3QgaGF2ZSBiZWVuIGRlbGl2ZXJlZCB5ZXQsCiAgICogYnV0IGl0IGhhcyBiZWVuIHNjaGVkdWxlZCwgYW5kIGl0IGlzIHRvbyBsYXRlIHRvIGFkZCBtb3JlIGV2ZW50cy4KICAgKi8KICBib29sIGdldCBpc0Nsb3NlZDsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIHdvdWxkIG5lZWQgdG8gYnVmZmVyIGV2ZW50cy4KICAgKgogICAqIFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIGNvbnRyb2xsZXIncyBzdHJlYW0gaGFzIGEgbGlzdGVuZXIgYW5kIGl0IGlzCiAgICogcGF1c2VkLCBvciBpZiBpdCBoYXMgbm90IHJlY2VpdmVkIGEgbGlzdGVuZXIgeWV0LiBJbiB0aGF0IGNhc2UsIHRoZQogICAqIGNvbnRyb2xsZXIgaXMgY29uc2lkZXJlZCBwYXVzZWQgYXMgd2VsbC4KICAgKgogICAqIEEgYnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVyIGlzIG5ldmVyIGNvbnNpZGVyZWQgcGF1c2VkLiBJdCBhbHdheXMKICAgKiBmb3J3YXJkcyBpdHMgZXZlbnRzIHRvIGFsbCB1bmNhbmNlbGVkIHN1YnNjcmlwdGlvbnMsIGlmIGFueSwKICAgKiBhbmQgbGV0IHRoZSBzdWJzY3JpcHRpb25zIGhhbmRsZSB0aGVpciBvd24gcGF1c2luZyBhbmQgYnVmZmVyaW5nLgogICAqLwogIGJvb2wgZ2V0IGlzUGF1c2VkOwoKICAvKiogV2hldGhlciB0aGVyZSBpcyBhIHN1YnNjcmliZXIgb24gdGhlIFtTdHJlYW1dLiAqLwogIGJvb2wgZ2V0IGhhc0xpc3RlbmVyOwoKICAvKioKICAgKiBTZW5kcyBhIGRhdGEgW2V2ZW50XS4KICAgKgogICAqIExpc3RlbmVycyByZWNlaXZlIHRoaXMgZXZlbnQgaW4gYSBsYXRlciBtaWNyb3Rhc2suCiAgICoKICAgKiBOb3RlIHRoYXQgYSBzeW5jaHJvbm91cyBjb250cm9sbGVyIChjcmVhdGVkIGJ5IHBhc3NpbmcgdHJ1ZSB0byB0aGUgYHN5bmNgCiAgICogcGFyYW1ldGVyIG9mIHRoZSBgU3RyZWFtQ29udHJvbGxlcmAgY29uc3RydWN0b3IpIGRlbGl2ZXJzIGV2ZW50cwogICAqIGltbWVkaWF0ZWx5LiBTaW5jZSB0aGlzIGJlaGF2aW9yIHZpb2xhdGVzIHRoZSBjb250cmFjdCBtZW50aW9uZWQgaGVyZSwKICAgKiBzeW5jaHJvbm91cyBjb250cm9sbGVycyBzaG91bGQgb25seSBiZSB1c2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUKICAgKiBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBkZWxpdmVyZWQgZXZlbnRzIGFsd2F5cyAqYXBwZWFyKiBhcyBpZgogICAqIHRoZXkgd2VyZSBkZWxpdmVyZWQgaW4gYSBzZXBhcmF0ZSBtaWNyb3Rhc2suCiAgICovCiAgdm9pZCBhZGQoVCBldmVudCk7CgogIC8qKgogICAqIFNlbmRzIG9yIGVucXVldWVzIGFuIGVycm9yIGV2ZW50LgogICAqCiAgICogSWYgW2Vycm9yXSBpcyBgbnVsbGAsIGl0IGlzIHJlcGxhY2VkIGJ5IGEgW051bGxUaHJvd25FcnJvcl0uCiAgICoKICAgKiBMaXN0ZW5lcnMgcmVjZWl2ZSB0aGlzIGV2ZW50IGF0IGEgbGF0ZXIgbWljcm90YXNrLiBUaGlzIGJlaGF2aW9yIGNhbiBiZQogICAqIG92ZXJyaWRkZW4gYnkgdXNpbmcgYHN5bmNgIGNvbnRyb2xsZXJzLiBOb3RlLCBob3dldmVyLCB0aGF0IHN5bmMKICAgKiBjb250cm9sbGVycyBoYXZlIHRvIHNhdGlzZnkgdGhlIHByZWNvbmRpdGlvbnMgbWVudGlvbmVkIGluIHRoZQogICAqIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnN0cnVjdG9ycy4KICAgKi8KICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHN0cmVhbS4KICAgKgogICAqIExpc3RlbmVycyByZWNlaXZlIHRoZSBkb25lIGV2ZW50IGF0IGEgbGF0ZXIgbWljcm90YXNrLiBUaGlzIGJlaGF2aW9yIGNhbiBiZQogICAqIG92ZXJyaWRkZW4gYnkgdXNpbmcgYHN5bmNgIGNvbnRyb2xsZXJzLiBOb3RlLCBob3dldmVyLCB0aGF0IHN5bmMKICAgKiBjb250cm9sbGVycyBoYXZlIHRvIHNhdGlzZnkgdGhlIHByZWNvbmRpdGlvbnMgbWVudGlvbmVkIGluIHRoZQogICAqIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnN0cnVjdG9ycy4KICAgKi8KICBGdXR1cmUgY2xvc2UoKTsKCiAgLyoqCiAgICogUmVjZWl2ZXMgZXZlbnRzIGZyb20gW3NvdXJjZV0gYW5kIHB1dHMgdGhlbSBpbnRvIHRoaXMgY29udHJvbGxlcidzIHN0cmVhbS4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgd2hpY2ggY29tcGxldGVzIHdoZW4gdGhlIHNvdXJjZSBzdHJlYW0gaXMgZG9uZS4KICAgKgogICAqIEV2ZW50cyBtdXN0IG5vdCBiZSBhZGRlZCBkaXJlY3RseSB0byB0aGlzIGNvbnRyb2xsZXIgdXNpbmcgW2FkZF0sCiAgICogW2FkZEVycm9yXSwgW2Nsb3NlXSBvciBbYWRkU3RyZWFtXSwgdW50aWwgdGhlIHJldHVybmVkIGZ1dHVyZQogICAqIGlzIGNvbXBsZXRlLgogICAqCiAgICogRGF0YSBhbmQgZXJyb3IgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhpcyBjb250cm9sbGVyJ3Mgc3RyZWFtLiBBIGRvbmUKICAgKiBldmVudCBvbiB0aGUgc291cmNlIHdpbGwgZW5kIHRoZSBgYWRkU3RyZWFtYCBvcGVyYXRpb24gYW5kIGNvbXBsZXRlIHRoZQogICAqIHJldHVybmVkIGZ1dHVyZS4KICAgKgogICAqIElmIFtjYW5jZWxPbkVycm9yXSBpcyB0cnVlLCBvbmx5IHRoZSBmaXJzdCBlcnJvciBvbiBbc291cmNlXSBpcwogICAqIGZvcndhcmRlZCB0byB0aGUgY29udHJvbGxlcidzIHN0cmVhbSwgYW5kIHRoZSBgYWRkU3RyZWFtYCBlbmRzCiAgICogYWZ0ZXIgdGhpcy4gSWYgW2NhbmNlbE9uRXJyb3JdIGlzIGZhbHNlLCBhbGwgZXJyb3JzIGFyZSBmb3J3YXJkZWQKICAgKiBhbmQgb25seSBhIGRvbmUgZXZlbnQgd2lsbCBlbmQgdGhlIGBhZGRTdHJlYW1gLgogICAqIElmIFtjYW5jZWxPbkVycm9yXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4KICAgKi8KICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxUPiBzb3VyY2UsIHtib29sIGNhbmNlbE9uRXJyb3J9KTsKfQoKLyoqCiAqIEEgc3RyZWFtIGNvbnRyb2xsZXIgdGhhdCBkZWxpdmVycyBpdHMgZXZlbnRzIHN5bmNocm9ub3VzbHkuCiAqCiAqIEEgc3luY2hyb25vdXMgc3RyZWFtIGNvbnRyb2xsZXIgaXMgaW50ZW5kZWQgZm9yIGNhc2VzIHdoZXJlCiAqIGFuIGFscmVhZHkgYXN5bmNocm9ub3VzIGV2ZW50IHRyaWdnZXJzIGFuIGV2ZW50IG9uIGEgc3RyZWFtLgogKgogKiBJbnN0ZWFkIG9mIGFkZGluZyB0aGUgZXZlbnQgdG8gdGhlIHN0cmVhbSBpbiBhIGxhdGVyIG1pY3JvdGFzaywKICogY2F1c2luZyBleHRyYSBsYXRlbmN5LCB0aGUgZXZlbnQgaXMgaW5zdGVhZCBmaXJlZCBpbW1lZGlhdGVseSBieSB0aGUKICogc3luY2hyb25vdXMgc3RyZWFtIGNvbnRyb2xsZXIsIGFzIGlmIHRoZSBzdHJlYW0gZXZlbnQgd2FzCiAqIHRoZSBjdXJyZW50IGV2ZW50IG9yIG1pY3JvdGFzay4KICoKICogVGhlIHN5bmNocm9ub3VzIHN0cmVhbSBjb250cm9sbGVyIGNhbiBiZSB1c2VkIHRvIGJyZWFrIHRoZSBjb250cmFjdAogKiBvbiBbU3RyZWFtXSwgYW5kIGl0IG11c3QgYmUgdXNlZCBjYXJlZnVsbHkgdG8gYXZvaWQgZG9pbmcgc28uCiAqCiAqIFRoZSBvbmx5IGFkdmFudGFnZSB0byB1c2luZyBhIFtTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXJdIG92ZXIgYQogKiBub3JtYWwgW1N0cmVhbUNvbnRyb2xsZXJdIGlzIHRoZSBpbXByb3ZlZCBsYXRlbmN5LgogKiBPbmx5IHVzZSB0aGUgc3luY2hyb25vdXMgdmVyc2lvbiBpZiB0aGUgaW1wcm92ZW1lbnQgaXMgc2lnbmlmaWNhbnQsCiAqIGFuZCBpZiBpdHMgdXNlIGlzIHNhZmUuIE90aGVyd2lzZSBqdXN0IHVzZSBhIG5vcm1hbCBzdHJlYW0gY29udHJvbGxlciwKICogd2hpY2ggd2lsbCBhbHdheXMgaGF2ZSB0aGUgY29ycmVjdCBiZWhhdmlvciBmb3IgYSBbU3RyZWFtXSwgYW5kIHdvbid0CiAqIGFjY2lkZW50YWxseSBicmVhayBvdGhlciBjb2RlLgogKgogKiBBZGRpbmcgZXZlbnRzIHRvIGEgc3luY2hyb25vdXMgY29udHJvbGxlciBzaG91bGQgb25seSBoYXBwZW4gYXMgdGhlCiAqIHZlcnkgbGFzdCBwYXJ0IG9mIHRoZSBoYW5kbGluZyBvZiB0aGUgb3JpZ2luYWwgZXZlbnQuCiAqIEF0IHRoYXQgcG9pbnQsIGFkZGluZyBhbiBldmVudCB0byB0aGUgc3RyZWFtIGlzIGVxdWl2YWxlbnQgdG8KICogcmV0dXJuaW5nIHRvIHRoZSBldmVudCBsb29wIGFuZCBhZGRpbmcgdGhlIGV2ZW50IGluIHRoZSBuZXh0IG1pY3JvdGFzay4KICoKICogRWFjaCBsaXN0ZW5lciBjYWxsYmFjayB3aWxsIGJlIHJ1biBhcyBpZiBpdCB3YXMgYSB0b3AtbGV2ZWwgZXZlbnQKICogb3IgbWljcm90YXNrLiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgdGhyb3dzLCB0aGUgZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhcwogKiB1bmNhdWdodCBhcyBzb29uIGFzIHBvc3NpYmxlLgogKiBUaGlzIGlzIG9uZSByZWFzb24gdG8gYWRkIHRoZSBldmVudCBhcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgb3JpZ2luYWwgZXZlbnQKICogaGFuZGxlciAtIGFueSBhY3Rpb24gZG9uZSBhZnRlciBhZGRpbmcgdGhlIGV2ZW50IHdpbGwgZGVsYXkgdGhlIHJlcG9ydCBvZgogKiBlcnJvcnMgaW4gdGhlIGV2ZW50IGxpc3RlbmVyIGNhbGxiYWNrcy4KICoKICogSWYgYW4gZXZlbnQgaXMgYWRkZWQgaW4gYSBzZXR0aW5nIHRoYXQgaXNuJ3Qga25vd24gdG8gYmUgYW5vdGhlciBldmVudCwKICogaXQgbWF5IGNhdXNlIHRoZSBzdHJlYW0ncyBsaXN0ZW5lciB0byBnZXQgdGhhdCBldmVudCBiZWZvcmUgdGhlIGxpc3RlbmVyCiAqIGlzIHJlYWR5IHRvIGhhbmRsZSBpdC4gV2UgcHJvbWlzZSB0aGF0IGFmdGVyIGNhbGxpbmcgW1N0cmVhbS5saXN0ZW5dLAogKiB5b3Ugd29uJ3QgZ2V0IGFueSBldmVudHMgdW50aWwgdGhlIGNvZGUgZG9pbmcgdGhlIGxpc3RlbiBoYXMgY29tcGxldGVkLgogKiBDYWxsaW5nIFthZGRdIGluIHJlc3BvbnNlIHRvIGEgZnVuY3Rpb24gY2FsbCBvZiB1bmtub3duIG9yaWdpbiBtYXkgYnJlYWsKICogdGhhdCBwcm9taXNlLgogKgogKiBBbiBbb25MaXN0ZW5dIGNhbGxiYWNrIGZyb20gdGhlIGNvbnRyb2xsZXIgaXMgKm5vdCogYW4gYXN5bmNocm9ub3VzIGV2ZW50LAogKiBhbmQgYWRkaW5nIGV2ZW50cyB0byB0aGUgY29udHJvbGxlciBpbiB0aGUgYG9uTGlzdGVuYCBjYWxsYmFjayBpcyBhbHdheXMKICogd3JvbmcuIFRoZSBldmVudHMgd2lsbCBiZSBkZWxpdmVyZWQgYmVmb3JlIHRoZSBsaXN0ZW5lciBoYXMgZXZlbiByZWNlaXZlZAogKiB0aGUgc3Vic2NyaXB0aW9uIHlldC4KICoKICogVGhlIHN5bmNocm9ub3VzIGJyb2FkY2FzdCBzdHJlYW0gY29udHJvbGxlciBhbHNvIGhhcyBhIHJlc3RyaWN0aW9ucyB0aGF0IGEKICogbm9ybWFsIHN0cmVhbSBjb250cm9sbGVyIGRvZXMgbm90OgogKiBUaGUgW2FkZF0sIFthZGRFcnJvcl0sIFtjbG9zZV0gYW5kIFthZGRTdHJlYW1dIG1ldGhvZHMgKm11c3Qgbm90KiBiZQogKiBjYWxsZWQgd2hpbGUgYW4gZXZlbnQgaXMgYmVpbmcgZGVsaXZlcmVkLgogKiBUaGF0IGlzLCBpZiBhIGNhbGxiYWNrIG9uIGEgc3Vic2NyaXB0aW9uIG9uIHRoZSBjb250cm9sbGVyJ3Mgc3RyZWFtIGNhdXNlcwogKiBhIGNhbGwgdG8gYW55IG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUsIHRoZSBjYWxsIHdpbGwgZmFpbC4KICogQSBicm9hZGNhc3Qgc3RyZWFtIG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbGlzdGVuZXIsIGFuZCBpZiBhbgogKiBldmVudCBpcyBhZGRlZCBzeW5jaHJvbm91c2x5IHdoaWxlIGFub3RoZXIgaXMgYmVpbmcgYWxzbyBpbiB0aGUgcHJvY2VzcwogKiBvZiBiZWluZyBhZGRlZCwgdGhlIGxhdHRlciBldmVudCBtaWdodCByZWFjaCBzb21lIGxpc3RlbmVycyBiZWZvcmUKICogdGhlIGZvcm1lci4gVG8gcHJldmVudCB0aGF0LCBhbiBldmVudCBjYW5ub3QgYmUgYWRkZWQgd2hpbGUgYSBwcmV2aW91cwogKiBldmVudCBpcyBiZWluZyBmaXJlZC4KICogVGhpcyBndWFyYW50ZWVzIHRoYXQgYW4gZXZlbnQgaXMgZnVsbHkgZGVsaXZlcmVkIHdoZW4gdGhlCiAqIGZpcnN0IFthZGRdLCBbYWRkRXJyb3JdIG9yIFtjbG9zZV0gcmV0dXJucywKICogYW5kIGZ1cnRoZXIgZXZlbnRzIHdpbGwgYmUgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLgogKgogKiBUaGlzIHN0aWxsIG9ubHkgZ3VhcmFudGVlcyB0aGF0IHRoZSBldmVudCBpcyBkZWxpdmVyZWQgdG8gdGhlIHN1YnNjcmlwdGlvbi4KICogSWYgdGhlIHN1YnNjcmlwdGlvbiBpcyBwYXVzZWQsIHRoZSBhY3R1YWwgY2FsbGJhY2sgbWF5IHN0aWxsIGhhcHBlbiBsYXRlciwKICogYW5kIHRoZSBldmVudCB3aWxsIGluc3RlYWQgYmUgYnVmZmVyZWQgYnkgdGhlIHN1YnNjcmlwdGlvbi4KICogQmFycmluZyBwYXVzaW5nLCBhbmQgdGhlIGZvbGxvd2luZyBidWZmZXJlZCBldmVudHMgdGhhdCBoYXZlbid0IGJlZW4KICogZGVsaXZlcmVkIHlldCwgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgd2hlbiBhbiBldmVudCBpcyBhZGRlZC4KICoKICogQWRkaW5nIGFuIGV2ZW50IHRvIGEgc3luY2hyb25vdXMgbm9uLWJyb2FkY2FzdCBzdHJlYW0gY29udHJvbGxlciB3aGlsZQogKiBhbm90aGVyIGV2ZW50IGlzIGluIHByb2dyZXNzIG1heSBjYXVzZSB0aGUgc2Vjb25kIGV2ZW50IHRvIGJlIGRlbGF5ZWQKICogYW5kIG5vdCBiZSBkZWxpdmVyZWQgc3luY2hyb25vdXNseSwgYW5kIHVudGlsIHRoYXQgZXZlbnQgaXMgZGVsaXZlcmVkLAogKiB0aGUgY29udHJvbGxlciB3aWxsIG5vdCBhY3Qgc3luY2hyb25vdXNseS4KICovCmFic3RyYWN0IGNsYXNzIFN5bmNocm9ub3VzU3RyZWFtQ29udHJvbGxlcjxUPiBpbXBsZW1lbnRzIFN0cmVhbUNvbnRyb2xsZXI8VD4gewogIC8qKgogICAqIEFkZHMgZXZlbnQgdG8gdGhlIGNvbnRyb2xsZXIncyBzdHJlYW0uCiAgICoKICAgKiBBcyBbU3RyZWFtQ29udHJvbGxlci5hZGRdLCBidXQgbXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIGFuIGV2ZW50IGlzCiAgICogYmVpbmcgYWRkZWQgYnkgW2FkZF0sIFthZGRFcnJvcl0gb3IgW2Nsb3NlXS4KICAgKi8KICB2b2lkIGFkZChUIGRhdGEpOwoKICAvKioKICAgKiBBZGRzIGVycm9yIHRvIHRoZSBjb250cm9sbGVyJ3Mgc3RyZWFtLgogICAqCiAgICogQXMgW1N0cmVhbUNvbnRyb2xsZXIuYWRkRXJyb3JdLCBidXQgbXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIGFuIGV2ZW50IGlzCiAgICogYmVpbmcgYWRkZWQgYnkgW2FkZF0sIFthZGRFcnJvcl0gb3IgW2Nsb3NlXS4KICAgKi8KICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIGNvbnRyb2xsZXIncyBzdHJlYW0uCiAgICoKICAgKiBBcyBbU3RyZWFtQ29udHJvbGxlci5jbG9zZV0sIGJ1dCBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgYW4gZXZlbnQgaXMKICAgKiBiZWluZyBhZGRlZCBieSBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdLgogICAqLwogIEZ1dHVyZSBjbG9zZSgpOwp9CgphYnN0cmFjdCBjbGFzcyBfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZTxUPiB7CiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9zdWJzY3JpYmUoCiAgICAgIHZvaWQgb25EYXRhKFQgZGF0YSksIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcik7CiAgdm9pZCBfcmVjb3JkUGF1c2UoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikge30KICB2b2lkIF9yZWNvcmRSZXN1bWUoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikge30KICBGdXR1cmUgX3JlY29yZENhbmNlbChTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSA9PiBudWxsOwp9CgovLyBCYXNlIHR5cGUgZm9yIGltcGxlbWVudGF0aW9ucyBvZiBzdHJlYW0gY29udHJvbGxlcnMuCmFic3RyYWN0IGNsYXNzIF9TdHJlYW1Db250cm9sbGVyQmFzZTxUPgogICAgaW1wbGVtZW50cwogICAgICAgIFN0cmVhbUNvbnRyb2xsZXI8VD4sCiAgICAgICAgX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGU8VD4sCiAgICAgICAgX0V2ZW50U2luazxUPiwKICAgICAgICBfRXZlbnREaXNwYXRjaDxUPiB7fQoKLyoqCiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgW1N0cmVhbUNvbnRyb2xsZXJdLgogKgogKiBDb250cm9scyBhIHN0cmVhbSB0aGF0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgY29udHJvbGxlci4KICovCmFic3RyYWN0IGNsYXNzIF9TdHJlYW1Db250cm9sbGVyPFQ+IGltcGxlbWVudHMgX1N0cmVhbUNvbnRyb2xsZXJCYXNlPFQ+IHsKICAvLyBUaGUgc3RhdGVzIGFyZSBiaXQtZmxhZ3MuIE1vcmUgdGhhbiBvbmUgY2FuIGJlIHNldCBhdCBhIHRpbWUuCiAgLy8KICAvLyBUaGUgInN1YnNjcmlwdGlvbiBzdGF0ZSIgZ29lcyB0aHJvdWdoIHRoZSBzdGF0ZXM6CiAgLy8gICBpbml0aWFsIC0+IHN1YnNjcmliZWQgLT4gY2FuY2VsZWQuCiAgLy8gVGhlc2UgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KICAvLyBUaGUgImNsb3NlZCIgc3RhdGUgcmVjb3JkcyB3aGV0aGVyIHRoZSBbY2xvc2VdIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQKICAvLyBvbiB0aGUgY29udHJvbGxlci4gVGhpcyBjYW4gYmUgZG9uZSBhdCBhbnkgdGltZS4gSWYgZG9uZSBiZWZvcmUKICAvLyBzdWJzY3JpcHRpb24sIHRoZSBkb25lIGV2ZW50IGlzIHF1ZXVlZC4gSWYgZG9uZSBhZnRlciBjYW5jZWwsIHRoZSBkb25lCiAgLy8gZXZlbnQgaXMgaWdub3JlZCAoanVzdCBhcyBhbnkgb3RoZXIgZXZlbnQgYWZ0ZXIgYSBjYW5jZWwpLgoKICAvKiogVGhlIGNvbnRyb2xsZXIgaXMgaW4gaXRzIGluaXRpYWwgc3RhdGUgd2l0aCBubyBzdWJzY3JpcHRpb24uICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfSU5JVElBTCA9IDA7CiAgLyoqIFRoZSBjb250cm9sbGVyIGhhcyBhIHN1YnNjcmlwdGlvbiwgYnV0IGhhc24ndCBiZWVuIGNsb3NlZCBvciBjYW5jZWxlZC4gKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9TVUJTQ1JJQkVEID0gMTsKICAvKiogVGhlIHN1YnNjcmlwdGlvbiBpcyBjYW5jZWxlZC4gKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9DQU5DRUxFRCA9IDI7CiAgLyoqIE1hc2sgZm9yIHRoZSBzdWJzY3JpcHRpb24gc3RhdGUuICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfU1VCU0NSSVBUSU9OX01BU0sgPSAzOwoKICAvLyBUaGUgZm9sbG93aW5nIHN0YXRlIHJlbGF0ZSB0byB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdWJzY3JpcHRpb24uCiAgLy8gSWYgY2xvc2VkLCBhZGRpbmcgbW9yZSBldmVudHMgaXMgbm90IGFsbG93ZWQuCiAgLy8gSWYgZXhlY3V0aW5nIGFuIFthZGRTdHJlYW1dLCBuZXcgZXZlbnRzIGFyZSBub3QgYWxsb3dlZCBlaXRoZXIsIGJ1dCB3aWxsCiAgLy8gYmUgYWRkZWQgYnkgdGhlIHN0cmVhbS4KCiAgLyoqCiAgICogVGhlIGNvbnRyb2xsZXIgaXMgY2xvc2VkIGR1ZSB0byBjYWxsaW5nIFtjbG9zZV0uCiAgICoKICAgKiBXaGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLCB5b3UgY2FuIG5laXRoZXIgYWRkIG5ldyBldmVudHMgbm9yIGFkZCBuZXcKICAgKiBsaXN0ZW5lcnMuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQ0xPU0VEID0gNDsKICAvKioKICAgKiBUaGUgY29udHJvbGxlciBpcyBpbiB0aGUgbWlkZGxlIG9mIGFuIFthZGRTdHJlYW1dIG9wZXJhdGlvbi4KICAgKgogICAqIFdoaWxlIGFkZGluZyBldmVudHMgZnJvbSBhIHN0cmVhbSwgbm8gbmV3IGV2ZW50cyBjYW4gYmUgYWRkZWQgZGlyZWN0bHkKICAgKiBvbiB0aGUgY29udHJvbGxlci4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9BRERTVFJFQU0gPSA4OwoKICAvKioKICAgKiBGaWVsZCBjb250YWluaW5nIGRpZmZlcmVudCBkYXRhIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdWJzY3JpcHRpb24KICAgKiBzdGF0ZS4KICAgKgogICAqIElmIFtfc3RhdGVdIGlzIFtfU1RBVEVfSU5JVElBTF0sIHRoZSBmaWVsZCBtYXkgY29udGFpbiBhIFtfUGVuZGluZ0V2ZW50c10KICAgKiBmb3IgZXZlbnRzIGFkZGVkIHRvIHRoZSBjb250cm9sbGVyIGJlZm9yZSBhIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFdoaWxlIFtfc3RhdGVdIGlzIFtfU1RBVEVfU1VCU0NSSUJFRF0sIHRoZSBmaWVsZCBjb250YWlucyB0aGUgc3Vic2NyaXB0aW9uLgogICAqCiAgICogV2hlbiBbX3N0YXRlXSBpcyBbX1NUQVRFX0NBTkNFTEVEXSB0aGUgZmllbGQgaXMgY3VycmVudGx5IG5vdCB1c2VkLgogICAqLwogIHZhciBfdmFyRGF0YTsKCiAgLyoqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbnRyb2xsZXIuICovCiAgaW50IF9zdGF0ZSA9IF9TVEFURV9JTklUSUFMOwoKICAvKioKICAgKiBGdXR1cmUgY29tcGxldGVkIHdoZW4gdGhlIHN0cmVhbSBzZW5kcyBpdHMgbGFzdCBldmVudC4KICAgKgogICAqIFRoaXMgaXMgYWxzbyB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IFtjbG9zZV0uCiAgICovCiAgLy8gVE9ETyhscm4pOiBDb3VsZCB0aGlzIGJlIHN0b3JlZCBpbiB0aGUgdmFyRGF0YSBmaWVsZCB0b28sIGlmIGl0J3Mgbm90CiAgLy8gYWNjZXNzZWQgdW50aWwgdGhlIGNhbGwgdG8gImNsb3NlIj8gVGhlbiB3ZSBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpZiBpdCdzCiAgLy8gYWNjZXNzZWQgZWFybGllciwgb3IgaWYgY2xvc2UgaXMgY2FsbGVkIGJlZm9yZSBzdWJzY3JpYmluZy4KICBfRnV0dXJlIF9kb25lRnV0dXJlOwoKICBDb250cm9sbGVyQ2FsbGJhY2sgb25MaXN0ZW47CiAgQ29udHJvbGxlckNhbGxiYWNrIG9uUGF1c2U7CiAgQ29udHJvbGxlckNhbGxiYWNrIG9uUmVzdW1lOwogIENvbnRyb2xsZXJDYW5jZWxDYWxsYmFjayBvbkNhbmNlbDsKCiAgX1N0cmVhbUNvbnRyb2xsZXIodGhpcy5vbkxpc3RlbiwgdGhpcy5vblBhdXNlLCB0aGlzLm9uUmVzdW1lLCB0aGlzLm9uQ2FuY2VsKTsKCiAgLy8gUmV0dXJuIGEgbmV3IHN0cmVhbSBldmVyeSB0aW1lLiBUaGUgc3RyZWFtcyBhcmUgZXF1YWwsIGJ1dCBub3QgaWRlbnRpY2FsLgogIFN0cmVhbTxUPiBnZXQgc3RyZWFtID0+IG5ldyBfQ29udHJvbGxlclN0cmVhbTxUPih0aGlzKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHZpZXcgb2YgdGhpcyBvYmplY3QgdGhhdCBvbmx5IGV4cG9zZXMgdGhlIFtTdHJlYW1TaW5rXSBpbnRlcmZhY2UuCiAgICovCiAgU3RyZWFtU2luazxUPiBnZXQgc2luayA9PiBuZXcgX1N0cmVhbVNpbmtXcmFwcGVyPFQ+KHRoaXMpOwoKICAvKioKICAgKiBXaGV0aGVyIGEgbGlzdGVuZXIgaGFzIGV4aXN0ZWQgYW5kIGJlZW4gY2FuY2VsZWQuCiAgICoKICAgKiBBZnRlciB0aGlzLCBhZGRpbmcgbW9yZSBldmVudHMgd2lsbCBiZSBpZ25vcmVkLgogICAqLwogIGJvb2wgZ2V0IF9pc0NhbmNlbGVkID0+IChfc3RhdGUgJiBfU1RBVEVfQ0FOQ0VMRUQpICE9IDA7CgogIC8qKiBXaGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSBsaXN0ZW5lci4gKi8KICBib29sIGdldCBoYXNMaXN0ZW5lciA9PiAoX3N0YXRlICYgX1NUQVRFX1NVQlNDUklCRUQpICE9IDA7CgogIC8qKiBXaGV0aGVyIHRoZXJlIGhhcyBub3QgYmVlbiBhIGxpc3RlbmVyIHlldC4gKi8KICBib29sIGdldCBfaXNJbml0aWFsU3RhdGUgPT4KICAgICAgKF9zdGF0ZSAmIF9TVEFURV9TVUJTQ1JJUFRJT05fTUFTSykgPT0gX1NUQVRFX0lOSVRJQUw7CgogIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IChfc3RhdGUgJiBfU1RBVEVfQ0xPU0VEKSAhPSAwOwoKICBib29sIGdldCBpc1BhdXNlZCA9PgogICAgICBoYXNMaXN0ZW5lciA/IF9zdWJzY3JpcHRpb24uX2lzSW5wdXRQYXVzZWQgOiAhX2lzQ2FuY2VsZWQ7CgogIGJvb2wgZ2V0IF9pc0FkZGluZ1N0cmVhbSA9PiAoX3N0YXRlICYgX1NUQVRFX0FERFNUUkVBTSkgIT0gMDsKCiAgLyoqIE5ldyBldmVudHMgbWF5IG5vdCBiZSBhZGRlZCBhZnRlciBjbG9zZSwgb3IgZHVyaW5nIGFkZFN0cmVhbS4gKi8KICBib29sIGdldCBfbWF5QWRkRXZlbnQgPT4gKF9zdGF0ZSA8IF9TVEFURV9DTE9TRUQpOwoKICAvLyBSZXR1cm5zIHRoZSBwZW5kaW5nIGV2ZW50cy4KICAvLyBQZW5kaW5nIGV2ZW50cyBhcmUgZXZlbnRzIGFkZGVkIGJlZm9yZSBhIHN1YnNjcmlwdGlvbiBleGlzdHMuCiAgLy8gVGhleSBhcmUgYWRkZWQgdG8gdGhlIHN1YnNjcmlwdGlvbiB3aGVuIGl0IGlzIGNyZWF0ZWQuCiAgLy8gUGVuZGluZyBldmVudHMsIGlmIGFueSwgYXJlIGtlcHQgaW4gdGhlIF92YXJEYXRhIGZpZWxkIHVudGlsIHRoZQogIC8vIHN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAvLyBXaGlsZSBhZGRpbmcgYSBzdHJlYW0sIHBlbmRpbmcgZXZlbnRzIGFyZSBtb3ZlZCBpbnRvIHRoZQogIC8vIHN0YXRlIG9iamVjdCB0byBhbGxvdyB0aGUgc3RhdGUgb2JqZWN0IHRvIHVzZSB0aGUgX3ZhckRhdGEgZmllbGQuCiAgX1BlbmRpbmdFdmVudHM8VD4gZ2V0IF9wZW5kaW5nRXZlbnRzIHsKICAgIGFzc2VydChfaXNJbml0aWFsU3RhdGUpOwogICAgaWYgKCFfaXNBZGRpbmdTdHJlYW0pIHsKICAgICAgcmV0dXJuIF92YXJEYXRhOwogICAgfQogICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBzdGF0ZSA9IF92YXJEYXRhOwogICAgcmV0dXJuIHN0YXRlLnZhckRhdGE7CiAgfQoKICAvLyBSZXR1cm5zIHRoZSBwZW5kaW5nIGV2ZW50cywgYW5kIGNyZWF0ZXMgdGhlIG9iamVjdCBpZiBuZWNlc3NhcnkuCiAgX1N0cmVhbUltcGxFdmVudHM8VD4gX2Vuc3VyZVBlbmRpbmdFdmVudHMoKSB7CiAgICBhc3NlcnQoX2lzSW5pdGlhbFN0YXRlKTsKICAgIGlmICghX2lzQWRkaW5nU3RyZWFtKSB7CiAgICAgIF92YXJEYXRhID8/PSBuZXcgX1N0cmVhbUltcGxFdmVudHM8VD4oKTsKICAgICAgcmV0dXJuIF92YXJEYXRhOwogICAgfQogICAgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPiBzdGF0ZSA9IF92YXJEYXRhOwogICAgaWYgKHN0YXRlLnZhckRhdGEgPT0gbnVsbCkgc3RhdGUudmFyRGF0YSA9IG5ldyBfU3RyZWFtSW1wbEV2ZW50czxUPigpOwogICAgcmV0dXJuIHN0YXRlLnZhckRhdGE7CiAgfQoKICAvLyBHZXQgdGhlIGN1cnJlbnQgc3Vic2NyaXB0aW9uLgogIC8vIElmIHdlIGFyZSBhZGRpbmcgYSBzdHJlYW0sIHRoZSBzdWJzY3JpcHRpb24gaXMgbW92ZWQgaW50byB0aGUgc3RhdGUKICAvLyBvYmplY3QgdG8gYWxsb3cgdGhlIHN0YXRlIG9iamVjdCB0byB1c2UgdGhlIF92YXJEYXRhIGZpZWxkLgogIF9Db250cm9sbGVyU3Vic2NyaXB0aW9uPFQ+IGdldCBfc3Vic2NyaXB0aW9uIHsKICAgIGFzc2VydChoYXNMaXN0ZW5lcik7CiAgICBpZiAoX2lzQWRkaW5nU3RyZWFtKSB7CiAgICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gYWRkU3RhdGUgPSBfdmFyRGF0YTsKICAgICAgcmV0dXJuIGFkZFN0YXRlLnZhckRhdGE7CiAgICB9CiAgICByZXR1cm4gX3ZhckRhdGE7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGFuIGVycm9yIGRlc2NyaWJpbmcgd2h5IGFuIGV2ZW50IGNhbm5vdCBiZSBhZGRlZC4KICAgKgogICAqIFRoZSByZWFzb24sIGFuZCB0aGVyZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UsIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgc3RhdGUuCiAgICovCiAgRXJyb3IgX2JhZEV2ZW50U3RhdGUoKSB7CiAgICBpZiAoaXNDbG9zZWQpIHsKICAgICAgcmV0dXJuIG5ldyBTdGF0ZUVycm9yKCJDYW5ub3QgYWRkIGV2ZW50IGFmdGVyIGNsb3NpbmciKTsKICAgIH0KICAgIGFzc2VydChfaXNBZGRpbmdTdHJlYW0pOwogICAgcmV0dXJuIG5ldyBTdGF0ZUVycm9yKCJDYW5ub3QgYWRkIGV2ZW50IHdoaWxlIGFkZGluZyBhIHN0cmVhbSIpOwogIH0KCiAgLy8gU3RyZWFtU2luayBpbnRlcmZhY2UuCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08VD4gc291cmNlLCB7Ym9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgaWYgKCFfbWF5QWRkRXZlbnQpIHRocm93IF9iYWRFdmVudFN0YXRlKCk7CiAgICBpZiAoX2lzQ2FuY2VsZWQpIHJldHVybiBuZXcgX0Z1dHVyZS5pbW1lZGlhdGUobnVsbCk7CiAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGFkZFN0YXRlID0KICAgICAgICBuZXcgX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZTxUPigKICAgICAgICAgICAgdGhpcywgX3ZhckRhdGEsIHNvdXJjZSwgY2FuY2VsT25FcnJvciA/PyBmYWxzZSk7CiAgICBfdmFyRGF0YSA9IGFkZFN0YXRlOwogICAgX3N0YXRlIHw9IF9TVEFURV9BRERTVFJFQU07CiAgICByZXR1cm4gYWRkU3RhdGUuYWRkU3RyZWFtRnV0dXJlOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgZG9uZQogICAqIHByb2Nlc3NpbmcgZXZlbnRzLgogICAqCiAgICogVGhpcyBoYXBwZW5zIGVpdGhlciB3aGVuIHRoZSBkb25lIGV2ZW50IGhhcyBiZWVuIHNlbnQsIG9yIGlmIHRoZQogICAqIHN1YnNjcmliZXIgb2YgYSBzaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbSBpcyBjYW5jZWxsZWQuCiAgICovCiAgRnV0dXJlIGdldCBkb25lID0+IF9lbnN1cmVEb25lRnV0dXJlKCk7CgogIEZ1dHVyZSBfZW5zdXJlRG9uZUZ1dHVyZSgpIHsKICAgIF9kb25lRnV0dXJlID8/PSBfaXNDYW5jZWxlZCA/IEZ1dHVyZS5fbnVsbEZ1dHVyZSA6IG5ldyBfRnV0dXJlKCk7CiAgICByZXR1cm4gX2RvbmVGdXR1cmU7CiAgfQoKICAvKioKICAgKiBTZW5kIG9yIGVucXVldWUgYSBkYXRhIGV2ZW50LgogICAqLwogIHZvaWQgYWRkKFQgdmFsdWUpIHsKICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYmFkRXZlbnRTdGF0ZSgpOwogICAgX2FkZCh2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBTZW5kIG9yIGVucXVldWUgYW4gZXJyb3IgZXZlbnQuCiAgICovCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2JhZEV2ZW50U3RhdGUoKTsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihlcnJvcik7CiAgICBBc3luY0Vycm9yIHJlcGxhY2VtZW50ID0gWm9uZS5jdXJyZW50LmVycm9yQ2FsbGJhY2soZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKHJlcGxhY2VtZW50LmVycm9yKTsKICAgICAgc3RhY2tUcmFjZSA9IHJlcGxhY2VtZW50LnN0YWNrVHJhY2U7CiAgICB9CiAgICBfYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLyoqCiAgICogQ2xvc2VzIHRoaXMgY29udHJvbGxlciBhbmQgc2VuZHMgYSBkb25lIGV2ZW50IG9uIHRoZSBzdHJlYW0uCiAgICoKICAgKiBUaGUgZmlyc3QgdGltZSBhIGNvbnRyb2xsZXIgaXMgY2xvc2VkLCBhICJkb25lIiBldmVudCBpcyBhZGRlZCB0byBpdHMKICAgKiBzdHJlYW0uCiAgICoKICAgKiBZb3UgYXJlIGFsbG93ZWQgdG8gY2xvc2UgdGhlIGNvbnRyb2xsZXIgbW9yZSB0aGFuIG9uY2UsIGJ1dCBvbmx5IHRoZSBmaXJzdAogICAqIGNhbGwgaGFzIGFueSBlZmZlY3QuCiAgICoKICAgKiBBZnRlciBjbG9zaW5nLCBubyBmdXJ0aGVyIGV2ZW50cyBtYXkgYmUgYWRkZWQgdXNpbmcgW2FkZF0sIFthZGRFcnJvcl0KICAgKiBvciBbYWRkU3RyZWFtXS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdoZW4gdGhlIGRvbmUgZXZlbnQgaGFzIGJlZW4gZGVsaXZlcmVkLgogICAqLwogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICByZXR1cm4gX2Vuc3VyZURvbmVGdXR1cmUoKTsKICAgIH0KICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYmFkRXZlbnRTdGF0ZSgpOwogICAgX2Nsb3NlVW5jaGVja2VkKCk7CiAgICByZXR1cm4gX2Vuc3VyZURvbmVGdXR1cmUoKTsKICB9CgogIHZvaWQgX2Nsb3NlVW5jaGVja2VkKCkgewogICAgX3N0YXRlIHw9IF9TVEFURV9DTE9TRUQ7CiAgICBpZiAoaGFzTGlzdGVuZXIpIHsKICAgICAgX3NlbmREb25lKCk7CiAgICB9IGVsc2UgaWYgKF9pc0luaXRpYWxTdGF0ZSkgewogICAgICBfZW5zdXJlUGVuZGluZ0V2ZW50cygpLmFkZChjb25zdCBfRGVsYXllZERvbmUoKSk7CiAgICB9CiAgfQoKICAvLyBFdmVudFNpbmsgaW50ZXJmYWNlLiBVc2VkIGJ5IHRoZSBbYWRkU3RyZWFtXSBldmVudHMuCgogIC8vIEFkZCBkYXRhIGV2ZW50LCB1c2VkIGJvdGggYnkgdGhlIFthZGRTdHJlYW1dIGV2ZW50cyBhbmQgYnkgW2FkZF0uCiAgdm9pZCBfYWRkKFQgdmFsdWUpIHsKICAgIGlmIChoYXNMaXN0ZW5lcikgewogICAgICBfc2VuZERhdGEodmFsdWUpOwogICAgfSBlbHNlIGlmIChfaXNJbml0aWFsU3RhdGUpIHsKICAgICAgX2Vuc3VyZVBlbmRpbmdFdmVudHMoKS5hZGQobmV3IF9EZWxheWVkRGF0YTxUPih2YWx1ZSkpOwogICAgfQogIH0KCiAgdm9pZCBfYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIGlmIChoYXNMaXN0ZW5lcikgewogICAgICBfc2VuZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0gZWxzZSBpZiAoX2lzSW5pdGlhbFN0YXRlKSB7CiAgICAgIF9lbnN1cmVQZW5kaW5nRXZlbnRzKCkuYWRkKG5ldyBfRGVsYXllZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgICB9CiAgfQoKICB2b2lkIF9jbG9zZSgpIHsKICAgIC8vIEVuZCBvZiBhZGRTdHJlYW0gc3RyZWFtLgogICAgYXNzZXJ0KF9pc0FkZGluZ1N0cmVhbSk7CiAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGFkZFN0YXRlID0gX3ZhckRhdGE7CiAgICBfdmFyRGF0YSA9IGFkZFN0YXRlLnZhckRhdGE7CiAgICBfc3RhdGUgJj0gfl9TVEFURV9BRERTVFJFQU07CiAgICBhZGRTdGF0ZS5jb21wbGV0ZSgpOwogIH0KCiAgLy8gX1N0cmVhbUNvbnRyb2xsZXJMaWZlQ3ljbGUgaW50ZXJmYWNlCgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBfc3Vic2NyaWJlKHZvaWQgb25EYXRhKFQgZGF0YSksIEZ1bmN0aW9uIG9uRXJyb3IsCiAgICAgIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAgaWYgKCFfaXNJbml0aWFsU3RhdGUpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGxpc3RlbmVkIHRvLiIpOwogICAgfQogICAgX0NvbnRyb2xsZXJTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gbmV3IF9Db250cm9sbGVyU3Vic2NyaXB0aW9uPFQ+KAogICAgICAgIHRoaXMsIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKCiAgICBfUGVuZGluZ0V2ZW50czxUPiBwZW5kaW5nRXZlbnRzID0gX3BlbmRpbmdFdmVudHM7CiAgICBfc3RhdGUgfD0gX1NUQVRFX1NVQlNDUklCRUQ7CiAgICBpZiAoX2lzQWRkaW5nU3RyZWFtKSB7CiAgICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gYWRkU3RhdGUgPSBfdmFyRGF0YTsKICAgICAgYWRkU3RhdGUudmFyRGF0YSA9IHN1YnNjcmlwdGlvbjsKICAgICAgYWRkU3RhdGUucmVzdW1lKCk7CiAgICB9IGVsc2UgewogICAgICBfdmFyRGF0YSA9IHN1YnNjcmlwdGlvbjsKICAgIH0KICAgIHN1YnNjcmlwdGlvbi5fc2V0UGVuZGluZ0V2ZW50cyhwZW5kaW5nRXZlbnRzKTsKICAgIHN1YnNjcmlwdGlvbi5fZ3VhcmRDYWxsYmFjaygoKSB7CiAgICAgIF9ydW5HdWFyZGVkKG9uTGlzdGVuKTsKICAgIH0pOwoKICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgfQoKICBGdXR1cmUgX3JlY29yZENhbmNlbChTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICAvLyBXaGVuIHdlIGNhbmNlbCwgd2UgZmlyc3QgY2FuY2VsIGFueSBzdHJlYW0gYmVpbmcgYWRkZWQsCiAgICAvLyBUaGVuIHdlIGNhbGwgYG9uQ2FuY2VsYCwgYW5kIGZpbmFsbHkgdGhlIF9kb25lRnV0dXJlIGlzIGNvbXBsZXRlZC4KICAgIC8vIElmIGVpdGhlciBvZiBhZGRTdHJlYW0ncyBjYW5jZWwgb3IgYG9uQ2FuY2VsYCByZXR1cm5zIGEgZnV0dXJlLAogICAgLy8gd2Ugd2FpdCBmb3IgaXQgYmVmb3JlIGNvbnRpbnVpbmcuCiAgICAvLyBBbnkgZXJyb3IgZHVyaW5nIHRoaXMgcHJvY2VzcyBlbmRzIHVwIGluIHRoZSByZXR1cm5lZCBmdXR1cmUuCiAgICAvLyBJZiBtb3JlIGVycm9ycyBoYXBwZW4sIHdlIGFjdCBhcyBpZiBpdCBoYXBwZW5zIGluc2lkZSBuZXN0ZWQgdHJ5L2ZpbmFsbHlzCiAgICAvLyBvciB3aGVuQ29tcGxldGUgY2FsbHMsIGFuZCBvbmx5IHRoZSBsYXN0IGVycm9yIGVuZHMgdXAgaW4gdGhlCiAgICAvLyByZXR1cm5lZCBmdXR1cmUuCiAgICBGdXR1cmUgcmVzdWx0OwogICAgaWYgKF9pc0FkZGluZ1N0cmVhbSkgewogICAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGFkZFN0YXRlID0gX3ZhckRhdGE7CiAgICAgIHJlc3VsdCA9IGFkZFN0YXRlLmNhbmNlbCgpOwogICAgfQogICAgX3ZhckRhdGEgPSBudWxsOwogICAgX3N0YXRlID0KICAgICAgICAoX3N0YXRlICYgfihfU1RBVEVfU1VCU0NSSUJFRCB8IF9TVEFURV9BRERTVFJFQU0pKSB8IF9TVEFURV9DQU5DRUxFRDsKCiAgICBpZiAob25DYW5jZWwgIT0gbnVsbCkgewogICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgICAvLyBPbmx5IGludHJvZHVjZSBhIGZ1dHVyZSBpZiBvbmUgaXMgbmVlZGVkLgogICAgICAgIC8vIElmIF9vbkNhbmNlbCByZXR1cm5zIG51bGwsIG5vIGZ1dHVyZSBpcyBuZWVkZWQuCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdCA9IG9uQ2FuY2VsKCk7CiAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgLy8gUmV0dXJuIHRoZSBlcnJvciBpbiB0aGUgcmV0dXJuZWQgZnV0dXJlLgogICAgICAgICAgLy8gQ29tcGxldGUgaXQgYXN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGlzIHRpbWUgZm9yIGEgbGlzdGVuZXIKICAgICAgICAgIC8vIHRvIGhhbmRsZSB0aGUgZXJyb3IuCiAgICAgICAgICByZXN1bHQgPSBuZXcgX0Z1dHVyZSgpLi5fYXN5bmNDb21wbGV0ZUVycm9yKGUsIHMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBTaW1wbGVyIGNhc2Ugd2hlbiB3ZSBhbHJlYWR5IGtub3cgdGhhdCB3ZSB3aWxsIHJldHVybiBhIGZ1dHVyZS4KICAgICAgICByZXN1bHQgPSByZXN1bHQud2hlbkNvbXBsZXRlKG9uQ2FuY2VsKTsKICAgICAgfQogICAgfQoKICAgIHZvaWQgY29tcGxldGUoKSB7CiAgICAgIGlmIChfZG9uZUZ1dHVyZSAhPSBudWxsICYmIF9kb25lRnV0dXJlLl9tYXlDb21wbGV0ZSkgewogICAgICAgIF9kb25lRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogICAgICB9CiAgICB9CgogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IHJlc3VsdC53aGVuQ29tcGxldGUoY29tcGxldGUpOwogICAgfSBlbHNlIHsKICAgICAgY29tcGxldGUoKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfcmVjb3JkUGF1c2UoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgewogICAgaWYgKF9pc0FkZGluZ1N0cmVhbSkgewogICAgICBfU3RyZWFtQ29udHJvbGxlckFkZFN0cmVhbVN0YXRlPFQ+IGFkZFN0YXRlID0gX3ZhckRhdGE7CiAgICAgIGFkZFN0YXRlLnBhdXNlKCk7CiAgICB9CiAgICBfcnVuR3VhcmRlZChvblBhdXNlKTsKICB9CgogIHZvaWQgX3JlY29yZFJlc3VtZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICBpZiAoX2lzQWRkaW5nU3RyZWFtKSB7CiAgICAgIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gYWRkU3RhdGUgPSBfdmFyRGF0YTsKICAgICAgYWRkU3RhdGUucmVzdW1lKCk7CiAgICB9CiAgICBfcnVuR3VhcmRlZChvblJlc3VtZSk7CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfU3luY1N0cmVhbUNvbnRyb2xsZXJEaXNwYXRjaDxUPgogICAgaW1wbGVtZW50cyBfU3RyZWFtQ29udHJvbGxlcjxUPiwgU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyPFQ+IHsKICBpbnQgZ2V0IF9zdGF0ZTsKICB2b2lkIHNldCBfc3RhdGUoaW50IHN0YXRlKTsKCiAgdm9pZCBfc2VuZERhdGEoVCBkYXRhKSB7CiAgICBfc3Vic2NyaXB0aW9uLl9hZGQoZGF0YSk7CiAgfQoKICB2b2lkIF9zZW5kRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIF9zdWJzY3JpcHRpb24uX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgX3NlbmREb25lKCkgewogICAgX3N1YnNjcmlwdGlvbi5fY2xvc2UoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9Bc3luY1N0cmVhbUNvbnRyb2xsZXJEaXNwYXRjaDxUPgogICAgaW1wbGVtZW50cyBfU3RyZWFtQ29udHJvbGxlcjxUPiB7CiAgdm9pZCBfc2VuZERhdGEoVCBkYXRhKSB7CiAgICBfc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKG5ldyBfRGVsYXllZERhdGE8VD4oZGF0YSkpOwogIH0KCiAgdm9pZCBfc2VuZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKG5ldyBfRGVsYXllZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgfQoKICB2b2lkIF9zZW5kRG9uZSgpIHsKICAgIF9zdWJzY3JpcHRpb24uX2FkZFBlbmRpbmcoY29uc3QgX0RlbGF5ZWREb25lKCkpOwogIH0KfQoKLy8gVE9ETyhscm4pOiBVc2UgY29tbW9uIHN1cGVyY2xhc3MgZm9yIGNhbGxiYWNrLWNvbnRyb2xsZXJzIHdoZW4gVk0gc3VwcG9ydHMKLy8gY29uc3RydWN0b3JzIGluIG1peGluIHN1cGVyY2xhc3Nlcy4KCmNsYXNzIF9Bc3luY1N0cmVhbUNvbnRyb2xsZXI8VD4gPSBfU3RyZWFtQ29udHJvbGxlcjxUPgogICAgd2l0aCBfQXN5bmNTdHJlYW1Db250cm9sbGVyRGlzcGF0Y2g8VD47CgpjbGFzcyBfU3luY1N0cmVhbUNvbnRyb2xsZXI8VD4gPSBfU3RyZWFtQ29udHJvbGxlcjxUPgogICAgd2l0aCBfU3luY1N0cmVhbUNvbnRyb2xsZXJEaXNwYXRjaDxUPjsKCnR5cGVkZWYgX05vdGlmaWNhdGlvbkhhbmRsZXIoKTsKCnZvaWQgX3J1bkd1YXJkZWQoX05vdGlmaWNhdGlvbkhhbmRsZXIgbm90aWZpY2F0aW9uSGFuZGxlcikgewogIGlmIChub3RpZmljYXRpb25IYW5kbGVyID09IG51bGwpIHJldHVybjsKICB0cnkgewogICAgbm90aWZpY2F0aW9uSGFuZGxlcigpOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIFpvbmUuY3VycmVudC5oYW5kbGVVbmNhdWdodEVycm9yKGUsIHMpOwogIH0KfQoKY2xhc3MgX0NvbnRyb2xsZXJTdHJlYW08VD4gZXh0ZW5kcyBfU3RyZWFtSW1wbDxUPiB7CiAgX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGU8VD4gX2NvbnRyb2xsZXI7CgogIF9Db250cm9sbGVyU3RyZWFtKHRoaXMuX2NvbnRyb2xsZXIpOwoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX2NyZWF0ZVN1YnNjcmlwdGlvbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSA9PgogICAgICBfY29udHJvbGxlci5fc3Vic2NyaWJlKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKCiAgLy8gT3ZlcnJpZGUgPT0gYW5kIGhhc2hDb2RlIHNvIHRoYXQgbmV3IHN0cmVhbXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUKICAvLyBjb250cm9sbGVyIGFyZSBjb25zaWRlcmVkIGVxdWFsLiBUaGUgY29udHJvbGxlciByZXR1cm5zIGEgbmV3IHN0cmVhbQogIC8vIGVhY2ggdGltZSBpdCdzIHF1ZXJpZWQsIGJ1dCBkb2Vzbid0IGhhdmUgdG8gY2FjaGUgdGhlIHJlc3VsdC4KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfY29udHJvbGxlci5oYXNoQ29kZSBeIDB4MzUzMjM1MzI7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAoaWRlbnRpY2FsKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gb3RoZXIgaXMgX0NvbnRyb2xsZXJTdHJlYW0gJiYKICAgICAgICBpZGVudGljYWwob3RoZXIuX2NvbnRyb2xsZXIsIHRoaXMuX2NvbnRyb2xsZXIpOwogIH0KfQoKY2xhc3MgX0NvbnRyb2xsZXJTdWJzY3JpcHRpb248VD4gZXh0ZW5kcyBfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHsKICBmaW5hbCBfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZTxUPiBfY29udHJvbGxlcjsKCiAgX0NvbnRyb2xsZXJTdWJzY3JpcHRpb24odGhpcy5fY29udHJvbGxlciwgdm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IHN1cGVyKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKCiAgRnV0dXJlIF9vbkNhbmNlbCgpIHsKICAgIHJldHVybiBfY29udHJvbGxlci5fcmVjb3JkQ2FuY2VsKHRoaXMpOwogIH0KCiAgdm9pZCBfb25QYXVzZSgpIHsKICAgIF9jb250cm9sbGVyLl9yZWNvcmRQYXVzZSh0aGlzKTsKICB9CgogIHZvaWQgX29uUmVzdW1lKCkgewogICAgX2NvbnRyb2xsZXIuX3JlY29yZFJlc3VtZSh0aGlzKTsKICB9Cn0KCi8qKiBBIGNsYXNzIHRoYXQgZXhwb3NlcyBvbmx5IHRoZSBbU3RyZWFtU2lua10gaW50ZXJmYWNlIG9mIGFuIG9iamVjdC4gKi8KY2xhc3MgX1N0cmVhbVNpbmtXcmFwcGVyPFQ+IGltcGxlbWVudHMgU3RyZWFtU2luazxUPiB7CiAgZmluYWwgU3RyZWFtQ29udHJvbGxlciBfdGFyZ2V0OwogIF9TdHJlYW1TaW5rV3JhcHBlcih0aGlzLl90YXJnZXQpOwogIHZvaWQgYWRkKFQgZGF0YSkgewogICAgX3RhcmdldC5hZGQoZGF0YSk7CiAgfQoKICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIF90YXJnZXQuYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgRnV0dXJlIGNsb3NlKCkgPT4gX3RhcmdldC5jbG9zZSgpOwoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxUPiBzb3VyY2UpID0+IF90YXJnZXQuYWRkU3RyZWFtKHNvdXJjZSk7CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfdGFyZ2V0LmRvbmU7Cn0KCi8qKgogKiBPYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgdXNlZCB0byBoYW5kbGUgW1N0cmVhbUNvbnRyb2xsZXIuYWRkU3RyZWFtXS4KICovCmNsYXNzIF9BZGRTdHJlYW1TdGF0ZTxUPiB7CiAgLy8gW19GdXR1cmVdIHJldHVybmVkIGJ5IGNhbGwgdG8gYWRkU3RyZWFtLgogIGZpbmFsIF9GdXR1cmUgYWRkU3RyZWFtRnV0dXJlOwoKICAvLyBTdWJzY3JpcHRpb24gb24gc3RyZWFtIGFyZ3VtZW50IHRvIGFkZFN0cmVhbS4KICBmaW5hbCBTdHJlYW1TdWJzY3JpcHRpb24gYWRkU3Vic2NyaXB0aW9uOwoKICBfQWRkU3RyZWFtU3RhdGUoCiAgICAgIF9FdmVudFNpbms8VD4gY29udHJvbGxlciwgU3RyZWFtPFQ+IHNvdXJjZSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IGFkZFN0cmVhbUZ1dHVyZSA9IG5ldyBfRnV0dXJlKCksCiAgICAgICAgYWRkU3Vic2NyaXB0aW9uID0gc291cmNlLmxpc3Rlbihjb250cm9sbGVyLl9hZGQsCiAgICAgICAgICAgIG9uRXJyb3I6IGNhbmNlbE9uRXJyb3IKICAgICAgICAgICAgICAgID8gbWFrZUVycm9ySGFuZGxlcihjb250cm9sbGVyKQogICAgICAgICAgICAgICAgOiBjb250cm9sbGVyLl9hZGRFcnJvciwKICAgICAgICAgICAgb25Eb25lOiBjb250cm9sbGVyLl9jbG9zZSwKICAgICAgICAgICAgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CgogIHN0YXRpYyBtYWtlRXJyb3JIYW5kbGVyKF9FdmVudFNpbmsgY29udHJvbGxlcikgPT4gKGUsIFN0YWNrVHJhY2UgcykgewogICAgICAgIGNvbnRyb2xsZXIuX2FkZEVycm9yKGUsIHMpOwogICAgICAgIGNvbnRyb2xsZXIuX2Nsb3NlKCk7CiAgICAgIH07CgogIHZvaWQgcGF1c2UoKSB7CiAgICBhZGRTdWJzY3JpcHRpb24ucGF1c2UoKTsKICB9CgogIHZvaWQgcmVzdW1lKCkgewogICAgYWRkU3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogIH0KCiAgLyoqCiAgICogU3RvcCBhZGRpbmcgdGhlIHN0cmVhbS4KICAgKgogICAqIENvbXBsZXRlIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgYFN0cmVhbUNvbnRyb2xsZXIuYWRkU3RyZWFtYCB3aGVuCiAgICogdGhlIGNhbmNlbCBpcyBjb21wbGV0ZS4KICAgKgogICAqIFJldHVybiBhIGZ1dHVyZSBpZiB0aGUgY2FuY2VsIHRha2VzIHRpbWUsIG90aGVyd2lzZSByZXR1cm4gYG51bGxgLgogICAqLwogIEZ1dHVyZSBjYW5jZWwoKSB7CiAgICB2YXIgY2FuY2VsID0gYWRkU3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgaWYgKGNhbmNlbCA9PSBudWxsKSB7CiAgICAgIGFkZFN0cmVhbUZ1dHVyZS5fYXN5bmNDb21wbGV0ZShudWxsKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gY2FuY2VsLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgIGFkZFN0cmVhbUZ1dHVyZS5fYXN5bmNDb21wbGV0ZShudWxsKTsKICAgIH0pOwogIH0KCiAgdm9pZCBjb21wbGV0ZSgpIHsKICAgIGFkZFN0cmVhbUZ1dHVyZS5fYXN5bmNDb21wbGV0ZShudWxsKTsKICB9Cn0KCmNsYXNzIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGU8VD4gZXh0ZW5kcyBfQWRkU3RyZWFtU3RhdGU8VD4gewogIC8vIFRoZSBzdWJzY3JpcHRpb24gb3IgcGVuZGluZyBkYXRhIG9mIGEgX1N0cmVhbUNvbnRyb2xsZXIuCiAgLy8gU3RvcmVkIGhlcmUgYmVjYXVzZSB3ZSByZXVzZSB0aGUgYF92YXJEYXRhYCBmaWVsZCAgaW4gdGhlIF9TdHJlYW1Db250cm9sbGVyCiAgLy8gdG8gc3RvcmUgdGhpcyBzdGF0ZSBvYmplY3QuCiAgdmFyIHZhckRhdGE7CgogIF9TdHJlYW1Db250cm9sbGVyQWRkU3RyZWFtU3RhdGUoX1N0cmVhbUNvbnRyb2xsZXI8VD4gY29udHJvbGxlciwgdGhpcy52YXJEYXRhLAogICAgICBTdHJlYW08VD4gc291cmNlLCBib29sIGNhbmNlbE9uRXJyb3IpCiAgICAgIDogc3VwZXIoY29udHJvbGxlciwgc291cmNlLCBjYW5jZWxPbkVycm9yKSB7CiAgICBpZiAoY29udHJvbGxlci5pc1BhdXNlZCkgewogICAgICBhZGRTdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgIH0KICB9Cn0Kg7AATk48ARQBRzpHAQRRBCMBBDMDNgQkAQQtA0ERQDUDS0sRBD45GAEGTAU8Q04fBUBIKgVES0NRBUstBU9MTwVGTQU+OwU3QVFQDgVILAYcGBYXEhsQTlAEAQZEBT4rBU9MTwVHBUdIT0tLTgU6P1EFRUBISRxGHjAFSTQ/S0sTRy4pRCUsJAVOUUoqBiY+EERGBAEGQgVCBiMBLQEGPQVCBVAGIgErAQY+BUIFUAYjAS0BBj8FQgYpASgBBlEGGgEGRQVCQR0FIjlHBhUBBjsFSkkuBUlCRwYVATgYAQYbBTgFT0ZMRU0yBhUBBicFQgVNRkQoBjgBBhgFUUZEKAYSAQZQBUYFR0MSBU1NFgVFREc1OgY8AgEEPwM/QANDSD0jA0dBA0Y2R0pJIgNHOUFLA0VNIU9NKwNLTElLTBEDTkxNGQNOJkgtTj1BS0ZKGT0vPgNPTj9IUQNKSUouBE8GLAVJMgYUAQYsBU4yBjgBBiUFSzIGEgIBLyRROzxEAgE4KA8dJxcdAQQxAz0ESkMFNyojS0VMQAFGJ1AqJygqMQFJM04dAQY2BUsQBiYGQgVMGAYpAQZLDAVPPwVRBUkGEAEqHwEGPAUyBktOQRcBHx4fJQFQAU86AQZRBj0BBjcFNQY7AS49ATQePQE2ARdBAUABRzUBIUM8Rhw+RykdHBcGORoEAUYwHRwvFwY5SxoEASNJQTEZGz4fBhUEAQY/BVAGGxQ/Bh1FBAEbPS85MjA9GSAlBAEGQBgFRj4GKgEfRhgEAQYjBhYvEQQBBiUGOS8iTB8wKwYiBAEGQgVLDQVQGgVLFQVOBhMUIgYvFyAEARsdFxMiOAYEAToBRxcXGCI+BgQBOBclIkgGBAESIB08ISEZBAEqAUorHEQGTjcBNiEbPicZDR8GMyUdCAEZBAE9P0pHKUVRRRgTGz4iBhUNTgEcHDU7Dh8ZNkkiPQoPSzAIBgEWPSoIBgEaLg0SBgETBAE6Gz4YBhoEATsbPhkGGwQCATBGEh4BGx4EATkwBAEVHAQCATEmGzoEATlFBAEVNQQCAU4nATcsATYrASABPSsIGxMsBAIBNC0BJwFBQkYBR0pDATkBIy0pOAQCAUszAUE7NwEXLAQBFCQEARUlBAIBSjciJBUXBAE5KQQBJQFDASMCAQRMBBsuIQEzLAETRik5Iy8oJysBSCQdCQERHQQBEh4EAQYdBUcdBUgGFCsaLBMGJCwIBAEUKgQCAUY+USEPAVEsMx8fBgQCASFkYXJ0OmFzeW5jL3N0cmVhbV9jb250cm9sbGVyLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL3N0cmVhbV9pbXBsLmRhcnTAAH3XLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCi8qKiBBYnN0cmFjdCBhbmQgcHJpdmF0ZSBpbnRlcmZhY2UgZm9yIGEgcGxhY2UgdG8gcHV0IGV2ZW50cy4gKi8KYWJzdHJhY3QgY2xhc3MgX0V2ZW50U2luazxUPiB7CiAgdm9pZCBfYWRkKFQgZGF0YSk7CiAgdm9pZCBfYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwogIHZvaWQgX2Nsb3NlKCk7Cn0KCi8qKgogKiBBYnN0cmFjdCBhbmQgcHJpdmF0ZSBpbnRlcmZhY2UgZm9yIGEgcGxhY2UgdG8gc2VuZCBldmVudHMuCiAqCiAqIFVzZWQgYnkgZXZlbnQgYnVmZmVyaW5nIHRvIGZpbmFsbHkgZGlzcGF0Y2ggdGhlIHBlbmRpbmcgZXZlbnQsIHdoZXJlCiAqIFtfRXZlbnRTaW5rXSBpcyB3aGVyZSB0aGUgZXZlbnQgZmlyc3QgZW50ZXJzIHRoZSBzdHJlYW0gc3Vic2NyaXB0aW9uLAogKiBhbmQgbWF5IHlldCBiZSBidWZmZXJlZC4KICovCmFic3RyYWN0IGNsYXNzIF9FdmVudERpc3BhdGNoPFQ+IHsKICB2b2lkIF9zZW5kRGF0YShUIGRhdGEpOwogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CiAgdm9pZCBfc2VuZERvbmUoKTsKfQoKLyoqCiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc3RyZWFtIHN1YnNjcmlwdGlvbiBvZiBidWZmZXJpbmcgZXZlbnRzLgogKgogKiBUaGUgb25seSBwdWJsaWMgbWV0aG9kcyBhcmUgdGhvc2Ugb2YgW1N0cmVhbVN1YnNjcmlwdGlvbl0sIHNvIGluc3RhbmNlcyBvZgogKiBbX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbl0gY2FuIGJlIHJldHVybmVkIGRpcmVjdGx5IGFzIGEKICogW1N0cmVhbVN1YnNjcmlwdGlvbl0gd2l0aG91dCBleHBvc2luZyBpbnRlcm5hbCBmdW5jdGlvbmFsaXR5LgogKgogKiBUaGUgW1N0cmVhbUNvbnRyb2xsZXJdIGlzIGEgcHVibGljIGZhY2luZyB2ZXJzaW9uIG9mIFtTdHJlYW1dIGFuZCB0aGlzIGNsYXNzLAogKiB3aXRoIHNvbWUgbWV0aG9kcyBtYWRlIHB1YmxpYy4KICoKICogVGhlIHVzZXIgaW50ZXJmYWNlIG9mIFtfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uXSBhcmUgdGhlIGZvbGxvd2luZwogKiBtZXRob2RzOgogKgogKiAqIFtfYWRkXTogQWRkIGEgZGF0YSBldmVudCB0byB0aGUgc3RyZWFtLgogKiAqIFtfYWRkRXJyb3JdOiBBZGQgYW4gZXJyb3IgZXZlbnQgdG8gdGhlIHN0cmVhbS4KICogKiBbX2Nsb3NlXTogUmVxdWVzdCB0byBjbG9zZSB0aGUgc3RyZWFtLgogKiAqIFtfb25DYW5jZWxdOiBDYWxsZWQgd2hlbiB0aGUgc3Vic2NyaXB0aW9uIHdpbGwgcHJvdmlkZSBubyBtb3JlIGV2ZW50cywKICogICAgIGVpdGhlciBkdWUgdG8gYmVpbmcgYWN0aXZlbHkgY2FuY2VsZWQsIG9yIGFmdGVyIHNlbmRpbmcgYSBkb25lIGV2ZW50LgogKiAqIFtfb25QYXVzZV06IENhbGxlZCB3aGVuIHRoZSBzdWJzY3JpcHRpb24gd2FudHMgdGhlIGV2ZW50IHNvdXJjZSB0byBwYXVzZS4KICogKiBbX29uUmVzdW1lXTogQ2FsbGVkIHdoZW4gYWxsb3dpbmcgbmV3IGV2ZW50cyBhZnRlciBhIHBhdXNlLgogKgogKiBUaGUgdXNlciBzaG91bGQgbm90IGFkZCBuZXcgZXZlbnRzIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiByZXF1ZXN0cyBhIHBhdXNlZCwKICogYnV0IGlmIGl0IGhhcHBlbnMgYW55d2F5LCB0aGUgc3Vic2NyaXB0aW9uIHdpbGwgZW5xdWV1ZSB0aGUgZXZlbnRzIGp1c3QgYXMKICogd2hlbiBuZXcgZXZlbnRzIGFycml2ZSB3aGlsZSBzdGlsbCBmaXJpbmcgYW4gb2xkIGV2ZW50LgogKi8KY2xhc3MgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPgogICAgaW1wbGVtZW50cyBTdHJlYW1TdWJzY3JpcHRpb248VD4sIF9FdmVudFNpbms8VD4sIF9FdmVudERpc3BhdGNoPFQ+IHsKICAvKiogVGhlIGBjYW5jZWxPbkVycm9yYCBmbGFnIGZyb20gdGhlIGBsaXN0ZW5gIGNhbGwuICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQ0FOQ0VMX09OX0VSUk9SID0gMTsKICAvKioKICAgKiBXaGV0aGVyIHRoZSAiZG9uZSIgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQuCiAgICogTm8gZnVydGhlciBldmVudHMgYXJlIGFjY2VwdGVkIGFmdGVyIHRoaXMuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQ0xPU0VEID0gMjsKICAvKioKICAgKiBTZXQgaWYgdGhlIGlucHV0IGhhcyBiZWVuIGFza2VkIG5vdCB0byBzZW5kIGV2ZW50cy4KICAgKgogICAqIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIGJlaW5nIHBhdXNlZCwgc2luY2UgdGhlIGlucHV0IHdpbGwgcmVtYWluIHBhdXNlZAogICAqIGFmdGVyIGEgY2FsbCB0byBbcmVzdW1lXSBpZiB0aGVyZSBhcmUgcGVuZGluZyBldmVudHMuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfSU5QVVRfUEFVU0VEID0gNDsKICAvKioKICAgKiBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gaGFzIGJlZW4gY2FuY2VsZWQuCiAgICoKICAgKiBTZXQgYnkgY2FsbGluZyBbY2FuY2VsXSwgb3IgYnkgaGFuZGxpbmcgYSAiZG9uZSIgZXZlbnQsIG9yIGFuICJlcnJvciIgZXZlbnQKICAgKiB3aGVuIGBjYW5jZWxPbkVycm9yYCBpcyB0cnVlLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NBTkNFTEVEID0gODsKICAvKioKICAgKiBTZXQgd2hlbiBlaXRoZXI6CiAgICoKICAgKiAgICogYW4gZXJyb3IgaXMgc2VudCwgYW5kIFtjYW5jZWxPbkVycm9yXSBpcyB0cnVlLCBvcgogICAqICAgKiBhIGRvbmUgZXZlbnQgaXMgc2VudC4KICAgKgogICAqIElmIHRoZSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsZWQgd2hpbGUgX1NUQVRFX1dBSVRfRk9SX0NBTkNFTCBpcyBzZXQsIHRoZQogICAqIHN0YXRlIGlzIHVuc2V0LCBhbmQgbm8gZnVydGhlciBldmVudHMgbXVzdCBiZSBkZWxpdmVyZWQuCiAgICovCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMID0gMTY7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfSU5fQ0FMTEJBQ0sgPSAzMjsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9IQVNfUEVORElORyA9IDY0OwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1BBVVNFX0NPVU5UID0gMTI4OwoKICAvKiBFdmVudCBoYW5kbGVycyBwcm92aWRlZCBpbiBjb25zdHJ1Y3Rvci4gKi8KICBfRGF0YUhhbmRsZXI8VD4gX29uRGF0YTsKICBGdW5jdGlvbiBfb25FcnJvcjsKICBfRG9uZUhhbmRsZXIgX29uRG9uZTsKICBmaW5hbCBab25lIF96b25lID0gWm9uZS5jdXJyZW50OwoKICAvKiogQml0IHZlY3RvciBiYXNlZCBvbiBzdGF0ZS1jb25zdGFudHMgYWJvdmUuICovCiAgaW50IF9zdGF0ZTsKCiAgLy8gVE9ETyhmbG9pdHNjaCk6IHJldXNlIGFub3RoZXIgZmllbGQKICAvKiogVGhlIGZ1dHVyZSBbX29uQ2FuY2VsXSBtYXkgcmV0dXJuLiAqLwogIEZ1dHVyZSBfY2FuY2VsRnV0dXJlOwoKICAvKioKICAgKiBRdWV1ZSBvZiBwZW5kaW5nIGV2ZW50cy4KICAgKgogICAqIElzIGNyZWF0ZWQgd2hlbiBuZWNlc3NhcnksIG9yIHNldCBpbiBjb25zdHJ1Y3RvciBmb3IgcHJlY29uZmlndXJlZCBldmVudHMuCiAgICovCiAgX1BlbmRpbmdFdmVudHM8VD4gX3BlbmRpbmc7CgogIF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb24oCiAgICAgIHZvaWQgb25EYXRhKFQgZGF0YSksIEZ1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcikKICAgICAgOiBfc3RhdGUgPSAoY2FuY2VsT25FcnJvciA/IF9TVEFURV9DQU5DRUxfT05fRVJST1IgOiAwKSB7CiAgICB0aGlzLm9uRGF0YShvbkRhdGEpOwogICAgdGhpcy5vbkVycm9yKG9uRXJyb3IpOwogICAgdGhpcy5vbkRvbmUob25Eb25lKTsKICB9CgogIC8qKgogICAqIFNldHMgdGhlIHN1YnNjcmlwdGlvbidzIHBlbmRpbmcgZXZlbnRzIG9iamVjdC4KICAgKgogICAqIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBvbmNlLiBUaGUgcGVuZGluZyBldmVudHMgb2JqZWN0IGlzIHVzZWQgZm9yIHRoZQogICAqIHJlc3Qgb2YgdGhlIHN1YnNjcmlwdGlvbidzIGxpZmUgY3ljbGUuCiAgICovCiAgdm9pZCBfc2V0UGVuZGluZ0V2ZW50cyhfUGVuZGluZ0V2ZW50czxUPiBwZW5kaW5nRXZlbnRzKSB7CiAgICBhc3NlcnQoX3BlbmRpbmcgPT0gbnVsbCk7CiAgICBpZiAocGVuZGluZ0V2ZW50cyA9PSBudWxsKSByZXR1cm47CiAgICBfcGVuZGluZyA9IHBlbmRpbmdFdmVudHM7CiAgICBpZiAoIXBlbmRpbmdFdmVudHMuaXNFbXB0eSkgewogICAgICBfc3RhdGUgfD0gX1NUQVRFX0hBU19QRU5ESU5HOwogICAgICBfcGVuZGluZy5zY2hlZHVsZSh0aGlzKTsKICAgIH0KICB9CgogIC8vIFN0cmVhbVN1YnNjcmlwdGlvbiBpbnRlcmZhY2UuCgogIHZvaWQgb25EYXRhKHZvaWQgaGFuZGxlRGF0YShUIGV2ZW50KSkgewogICAgaGFuZGxlRGF0YSA/Pz0gX251bGxEYXRhSGFuZGxlcjsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlICd2b2lkJywgYW5kIHRoZSB0eXBlCiAgICAvLyBzaG91bGQgYmUgaW5mZXJyZWQuCiAgICBfb25EYXRhID0gX3pvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIFQ+KGhhbmRsZURhdGEpOwogIH0KCiAgdm9pZCBvbkVycm9yKEZ1bmN0aW9uIGhhbmRsZUVycm9yKSB7CiAgICBoYW5kbGVFcnJvciA/Pz0gX251bGxFcnJvckhhbmRsZXI7CiAgICBpZiAoaGFuZGxlRXJyb3IgaXMgdm9pZCBGdW5jdGlvbihPYmplY3QsIFN0YWNrVHJhY2UpKSB7CiAgICAgIF9vbkVycm9yID0gX3pvbmUKICAgICAgICAgIC5yZWdpc3RlckJpbmFyeUNhbGxiYWNrPGR5bmFtaWMsIE9iamVjdCwgU3RhY2tUcmFjZT4oaGFuZGxlRXJyb3IpOwogICAgfSBlbHNlIGlmIChoYW5kbGVFcnJvciBpcyB2b2lkIEZ1bmN0aW9uKE9iamVjdCkpIHsKICAgICAgX29uRXJyb3IgPSBfem9uZS5yZWdpc3RlclVuYXJ5Q2FsbGJhY2s8ZHluYW1pYywgT2JqZWN0PihoYW5kbGVFcnJvcik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiaGFuZGxlRXJyb3IgY2FsbGJhY2sgbXVzdCB0YWtlIGVpdGhlciBhbiBPYmplY3QgIgogICAgICAgICAgIih0aGUgZXJyb3IpLCBvciBib3RoIGFuIE9iamVjdCAodGhlIGVycm9yKSBhbmQgYSBTdGFja1RyYWNlLiIpOwogICAgfQogIH0KCiAgdm9pZCBvbkRvbmUodm9pZCBoYW5kbGVEb25lKCkpIHsKICAgIGhhbmRsZURvbmUgPz89IF9udWxsRG9uZUhhbmRsZXI7CiAgICBfb25Eb25lID0gX3pvbmUucmVnaXN0ZXJDYWxsYmFjayhoYW5kbGVEb25lKTsKICB9CgogIHZvaWQgcGF1c2UoW0Z1dHVyZSByZXN1bWVTaWduYWxdKSB7CiAgICBpZiAoX2lzQ2FuY2VsZWQpIHJldHVybjsKICAgIGJvb2wgd2FzUGF1c2VkID0gX2lzUGF1c2VkOwogICAgYm9vbCB3YXNJbnB1dFBhdXNlZCA9IF9pc0lucHV0UGF1c2VkOwogICAgLy8gSW5jcmVtZW50IHBhdXNlIGNvdW50IGFuZCBtYXJrIGlucHV0IHBhdXNlZCAoaWYgaXQgaXNuJ3QgYWxyZWFkeSkuCiAgICBfc3RhdGUgPSAoX3N0YXRlICsgX1NUQVRFX1BBVVNFX0NPVU5UKSB8IF9TVEFURV9JTlBVVF9QQVVTRUQ7CiAgICBpZiAocmVzdW1lU2lnbmFsICE9IG51bGwpIHJlc3VtZVNpZ25hbC53aGVuQ29tcGxldGUocmVzdW1lKTsKICAgIGlmICghd2FzUGF1c2VkICYmIF9wZW5kaW5nICE9IG51bGwpIF9wZW5kaW5nLmNhbmNlbFNjaGVkdWxlKCk7CiAgICBpZiAoIXdhc0lucHV0UGF1c2VkICYmICFfaW5DYWxsYmFjaykgX2d1YXJkQ2FsbGJhY2soX29uUGF1c2UpOwogIH0KCiAgdm9pZCByZXN1bWUoKSB7CiAgICBpZiAoX2lzQ2FuY2VsZWQpIHJldHVybjsKICAgIGlmIChfaXNQYXVzZWQpIHsKICAgICAgX2RlY3JlbWVudFBhdXNlQ291bnQoKTsKICAgICAgaWYgKCFfaXNQYXVzZWQpIHsKICAgICAgICBpZiAoX2hhc1BlbmRpbmcgJiYgIV9wZW5kaW5nLmlzRW1wdHkpIHsKICAgICAgICAgIC8vIElucHV0IGlzIHN0aWxsIHBhdXNlZC4KICAgICAgICAgIF9wZW5kaW5nLnNjaGVkdWxlKHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQoX21heVJlc3VtZUlucHV0KTsKICAgICAgICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0lOUFVUX1BBVVNFRDsKICAgICAgICAgIGlmICghX2luQ2FsbGJhY2spIF9ndWFyZENhbGxiYWNrKF9vblJlc3VtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBGdXR1cmUgY2FuY2VsKCkgewogICAgLy8gVGhlIHVzZXIgZG9lc24ndCB3YW50IHRvIHJlY2VpdmUgYW55IGZ1cnRoZXIgZXZlbnRzLiBJZiB0aGVyZSBpcyBhbgogICAgLy8gZXJyb3Igb3IgZG9uZSBldmVudCBwZW5kaW5nICh3YWl0aW5nIGZvciB0aGUgY2FuY2VsIHRvIGJlIGRvbmUpIGRpc2NhcmQKICAgIC8vIHRoYXQgZXZlbnQuCiAgICBfc3RhdGUgJj0gfl9TVEFURV9XQUlUX0ZPUl9DQU5DRUw7CiAgICBpZiAoIV9pc0NhbmNlbGVkKSB7CiAgICAgIF9jYW5jZWwoKTsKICAgIH0KICAgIHJldHVybiBfY2FuY2VsRnV0dXJlID8/IEZ1dHVyZS5fbnVsbEZ1dHVyZTsKICB9CgogIEZ1dHVyZTxFPiBhc0Z1dHVyZTxFPihbRSBmdXR1cmVWYWx1ZV0pIHsKICAgIF9GdXR1cmU8RT4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8RT4oKTsKCiAgICAvLyBPdmVyd3JpdGUgdGhlIG9uRG9uZSBhbmQgb25FcnJvciBoYW5kbGVycy4KICAgIF9vbkRvbmUgPSAoKSB7CiAgICAgIHJlc3VsdC5fY29tcGxldGUoZnV0dXJlVmFsdWUpOwogICAgfTsKICAgIF9vbkVycm9yID0gKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgICAgRnV0dXJlIGNhbmNlbEZ1dHVyZSA9IGNhbmNlbCgpOwogICAgICBpZiAoIWlkZW50aWNhbChjYW5jZWxGdXR1cmUsIEZ1dHVyZS5fbnVsbEZ1dHVyZSkpIHsKICAgICAgICBjYW5jZWxGdXR1cmUud2hlbkNvbXBsZXRlKCgpIHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gU3RhdGUgbWFuYWdlbWVudC4KCiAgYm9vbCBnZXQgX2lzSW5wdXRQYXVzZWQgPT4gKF9zdGF0ZSAmIF9TVEFURV9JTlBVVF9QQVVTRUQpICE9IDA7CiAgYm9vbCBnZXQgX2lzQ2xvc2VkID0+IChfc3RhdGUgJiBfU1RBVEVfQ0xPU0VEKSAhPSAwOwogIGJvb2wgZ2V0IF9pc0NhbmNlbGVkID0+IChfc3RhdGUgJiBfU1RBVEVfQ0FOQ0VMRUQpICE9IDA7CiAgYm9vbCBnZXQgX3dhaXRzRm9yQ2FuY2VsID0+IChfc3RhdGUgJiBfU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMKSAhPSAwOwogIGJvb2wgZ2V0IF9pbkNhbGxiYWNrID0+IChfc3RhdGUgJiBfU1RBVEVfSU5fQ0FMTEJBQ0spICE9IDA7CiAgYm9vbCBnZXQgX2hhc1BlbmRpbmcgPT4gKF9zdGF0ZSAmIF9TVEFURV9IQVNfUEVORElORykgIT0gMDsKICBib29sIGdldCBfaXNQYXVzZWQgPT4gX3N0YXRlID49IF9TVEFURV9QQVVTRV9DT1VOVDsKICBib29sIGdldCBfY2FuRmlyZSA9PiBfc3RhdGUgPCBfU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgYm9vbCBnZXQgX21heVJlc3VtZUlucHV0ID0+CiAgICAgICFfaXNQYXVzZWQgJiYgKF9wZW5kaW5nID09IG51bGwgfHwgX3BlbmRpbmcuaXNFbXB0eSk7CiAgYm9vbCBnZXQgX2NhbmNlbE9uRXJyb3IgPT4gKF9zdGF0ZSAmIF9TVEFURV9DQU5DRUxfT05fRVJST1IpICE9IDA7CgogIGJvb2wgZ2V0IGlzUGF1c2VkID0+IF9pc1BhdXNlZDsKCiAgdm9pZCBfY2FuY2VsKCkgewogICAgX3N0YXRlIHw9IF9TVEFURV9DQU5DRUxFRDsKICAgIGlmIChfaGFzUGVuZGluZykgewogICAgICBfcGVuZGluZy5jYW5jZWxTY2hlZHVsZSgpOwogICAgfQogICAgaWYgKCFfaW5DYWxsYmFjaykgX3BlbmRpbmcgPSBudWxsOwogICAgX2NhbmNlbEZ1dHVyZSA9IF9vbkNhbmNlbCgpOwogIH0KCiAgLyoqCiAgICogRGVjcmVtZW50cyB0aGUgcGF1c2UgY291bnQuCiAgICoKICAgKiBEb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHVucGF1c2UgdGhlIGlucHV0IChjYWxsIFtfb25SZXN1bWVdKSB3aGVuCiAgICogdGhlIHBhdXNlIGNvdW50IHJlYWNoZXMgemVyby4gVGhpcyBpcyBoYW5kbGVkIGVsc2V3aGVyZSwgYW5kIG9ubHkKICAgKiBpZiB0aGVyZSBhcmUgbm8gcGVuZGluZyBldmVudHMgYnVmZmVyZWQuCiAgICovCiAgdm9pZCBfZGVjcmVtZW50UGF1c2VDb3VudCgpIHsKICAgIGFzc2VydChfaXNQYXVzZWQpOwogICAgX3N0YXRlIC09IF9TVEFURV9QQVVTRV9DT1VOVDsKICB9CgogIC8vIF9FdmVudFNpbmsgaW50ZXJmYWNlLgoKICB2b2lkIF9hZGQoVCBkYXRhKSB7CiAgICBhc3NlcnQoIV9pc0Nsb3NlZCk7CiAgICBpZiAoX2lzQ2FuY2VsZWQpIHJldHVybjsKICAgIGlmIChfY2FuRmlyZSkgewogICAgICBfc2VuZERhdGEoZGF0YSk7CiAgICB9IGVsc2UgewogICAgICBfYWRkUGVuZGluZyhuZXcgX0RlbGF5ZWREYXRhPFQ+KGRhdGEpKTsKICAgIH0KICB9CgogIHZvaWQgX2FkZEVycm9yKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBpZiAoX2lzQ2FuY2VsZWQpIHJldHVybjsKICAgIGlmIChfY2FuRmlyZSkgewogICAgICBfc2VuZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsgLy8gUmVwb3J0cyBjYW5jZWwgYWZ0ZXIgc2VuZGluZy4KICAgIH0gZWxzZSB7CiAgICAgIF9hZGRQZW5kaW5nKG5ldyBfRGVsYXllZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgICB9CiAgfQoKICB2b2lkIF9jbG9zZSgpIHsKICAgIGFzc2VydCghX2lzQ2xvc2VkKTsKICAgIGlmIChfaXNDYW5jZWxlZCkgcmV0dXJuOwogICAgX3N0YXRlIHw9IF9TVEFURV9DTE9TRUQ7CiAgICBpZiAoX2NhbkZpcmUpIHsKICAgICAgX3NlbmREb25lKCk7CiAgICB9IGVsc2UgewogICAgICBfYWRkUGVuZGluZyhjb25zdCBfRGVsYXllZERvbmUoKSk7CiAgICB9CiAgfQoKICAvLyBIb29rcyBjYWxsZWQgd2hlbiB0aGUgaW5wdXQgaXMgcGF1c2VkLCB1bnBhdXNlZCBvciBjYW5jZWxlZC4KICAvLyBUaGVzZSBtdXN0IG5vdCB0aHJvdy4gSWYgb3ZlcndyaXR0ZW4gdG8gY2FsbCB1c2VyIGNvZGUsIGluY2x1ZGUgc3VpdGFibGUKICAvLyB0cnkvY2F0Y2ggd3JhcHBpbmcgYW5kIHNlbmQgYW55IGVycm9ycyB0bwogIC8vIFtfWm9uZS5jdXJyZW50LmhhbmRsZVVuY2F1Z2h0RXJyb3JdLgogIHZvaWQgX29uUGF1c2UoKSB7CiAgICBhc3NlcnQoX2lzSW5wdXRQYXVzZWQpOwogIH0KCiAgdm9pZCBfb25SZXN1bWUoKSB7CiAgICBhc3NlcnQoIV9pc0lucHV0UGF1c2VkKTsKICB9CgogIEZ1dHVyZSBfb25DYW5jZWwoKSB7CiAgICBhc3NlcnQoX2lzQ2FuY2VsZWQpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBIYW5kbGUgcGVuZGluZyBldmVudHMuCgogIC8qKgogICAqIEFkZCBhIHBlbmRpbmcgZXZlbnQuCiAgICoKICAgKiBJZiB0aGUgc3Vic2NyaXB0aW9uIGlzIG5vdCBwYXVzZWQsIHRoaXMgYWxzbyBzY2hlZHVsZXMgYSBmaXJpbmcKICAgKiBvZiBwZW5kaW5nIGV2ZW50cyBsYXRlciAoaWYgbmVjZXNzYXJ5KS4KICAgKi8KICB2b2lkIF9hZGRQZW5kaW5nKF9EZWxheWVkRXZlbnQgZXZlbnQpIHsKICAgIF9TdHJlYW1JbXBsRXZlbnRzPFQ+IHBlbmRpbmcgPSBfcGVuZGluZzsKICAgIGlmIChfcGVuZGluZyA9PSBudWxsKSB7CiAgICAgIHBlbmRpbmcgPSBfcGVuZGluZyA9IG5ldyBfU3RyZWFtSW1wbEV2ZW50czxUPigpOwogICAgfQogICAgcGVuZGluZy5hZGQoZXZlbnQpOwogICAgaWYgKCFfaGFzUGVuZGluZykgewogICAgICBfc3RhdGUgfD0gX1NUQVRFX0hBU19QRU5ESU5HOwogICAgICBpZiAoIV9pc1BhdXNlZCkgewogICAgICAgIF9wZW5kaW5nLnNjaGVkdWxlKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvKiBfRXZlbnREaXNwYXRjaCBpbnRlcmZhY2UuICovCgogIHZvaWQgX3NlbmREYXRhKFQgZGF0YSkgewogICAgYXNzZXJ0KCFfaXNDYW5jZWxlZCk7CiAgICBhc3NlcnQoIV9pc1BhdXNlZCk7CiAgICBhc3NlcnQoIV9pbkNhbGxiYWNrKTsKICAgIGJvb2wgd2FzSW5wdXRQYXVzZWQgPSBfaXNJbnB1dFBhdXNlZDsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICBfem9uZS5ydW5VbmFyeUd1YXJkZWQoX29uRGF0YSwgZGF0YSk7CiAgICBfc3RhdGUgJj0gfl9TVEFURV9JTl9DQUxMQkFDSzsKICAgIF9jaGVja1N0YXRlKHdhc0lucHV0UGF1c2VkKTsKICB9CgogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgYXNzZXJ0KCFfaXNDYW5jZWxlZCk7CiAgICBhc3NlcnQoIV9pc1BhdXNlZCk7CiAgICBhc3NlcnQoIV9pbkNhbGxiYWNrKTsKICAgIGJvb2wgd2FzSW5wdXRQYXVzZWQgPSBfaXNJbnB1dFBhdXNlZDsKCiAgICB2b2lkIHNlbmRFcnJvcigpIHsKICAgICAgLy8gSWYgdGhlIHN1YnNjcmlwdGlvbiBoYXMgYmVlbiBjYW5jZWxlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgY2FuY2VsCiAgICAgIC8vIGZ1dHVyZSB0byBmaW5pc2ggd2UgbXVzdCBub3QgcmVwb3J0IHRoZSBlcnJvci4KICAgICAgaWYgKF9pc0NhbmNlbGVkICYmICFfd2FpdHNGb3JDYW5jZWwpIHJldHVybjsKICAgICAgX3N0YXRlIHw9IF9TVEFURV9JTl9DQUxMQkFDSzsKICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoaXMgZHluYW1pYyBzaG91bGQgYmUgJ3ZvaWQnLgogICAgICB2YXIgb25FcnJvciA9IF9vbkVycm9yOwogICAgICBpZiAob25FcnJvciBpcyB2b2lkIEZ1bmN0aW9uKE9iamVjdCwgU3RhY2tUcmFjZSkpIHsKICAgICAgICBfem9uZS5ydW5CaW5hcnlHdWFyZGVkPE9iamVjdCwgU3RhY2tUcmFjZT4ob25FcnJvciwgZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChfb25FcnJvciBpcyB2b2lkIEZ1bmN0aW9uKE9iamVjdCkpOwogICAgICAgIF96b25lLnJ1blVuYXJ5R3VhcmRlZDxPYmplY3Q+KF9vbkVycm9yLCBlcnJvcik7CiAgICAgIH0KICAgICAgX3N0YXRlICY9IH5fU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICB9CgogICAgaWYgKF9jYW5jZWxPbkVycm9yKSB7CiAgICAgIF9zdGF0ZSB8PSBfU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMOwogICAgICBfY2FuY2VsKCk7CiAgICAgIGlmIChfY2FuY2VsRnV0dXJlICE9IG51bGwgJiYKICAgICAgICAgICFpZGVudGljYWwoX2NhbmNlbEZ1dHVyZSwgRnV0dXJlLl9udWxsRnV0dXJlKSkgewogICAgICAgIF9jYW5jZWxGdXR1cmUud2hlbkNvbXBsZXRlKHNlbmRFcnJvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2VuZEVycm9yKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHNlbmRFcnJvcigpOwogICAgICAvLyBPbmx5IGNoZWNrIHN0YXRlIGlmIG5vdCBjYW5jZWxPbkVycm9yLgogICAgICBfY2hlY2tTdGF0ZSh3YXNJbnB1dFBhdXNlZCk7CiAgICB9CiAgfQoKICB2b2lkIF9zZW5kRG9uZSgpIHsKICAgIGFzc2VydCghX2lzQ2FuY2VsZWQpOwogICAgYXNzZXJ0KCFfaXNQYXVzZWQpOwogICAgYXNzZXJ0KCFfaW5DYWxsYmFjayk7CgogICAgdm9pZCBzZW5kRG9uZSgpIHsKICAgICAgLy8gSWYgdGhlIHN1YnNjcmlwdGlvbiBoYXMgYmVlbiBjYW5jZWxlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgY2FuY2VsCiAgICAgIC8vIGZ1dHVyZSB0byBmaW5pc2ggd2UgbXVzdCBub3QgcmVwb3J0IHRoZSBkb25lIGV2ZW50LgogICAgICBpZiAoIV93YWl0c0ZvckNhbmNlbCkgcmV0dXJuOwogICAgICBfc3RhdGUgfD0gKF9TVEFURV9DQU5DRUxFRCB8IF9TVEFURV9DTE9TRUQgfCBfU1RBVEVfSU5fQ0FMTEJBQ0spOwogICAgICBfem9uZS5ydW5HdWFyZGVkKF9vbkRvbmUpOwogICAgICBfc3RhdGUgJj0gfl9TVEFURV9JTl9DQUxMQkFDSzsKICAgIH0KCiAgICBfY2FuY2VsKCk7CiAgICBfc3RhdGUgfD0gX1NUQVRFX1dBSVRfRk9SX0NBTkNFTDsKICAgIGlmIChfY2FuY2VsRnV0dXJlICE9IG51bGwgJiYKICAgICAgICAhaWRlbnRpY2FsKF9jYW5jZWxGdXR1cmUsIEZ1dHVyZS5fbnVsbEZ1dHVyZSkpIHsKICAgICAgX2NhbmNlbEZ1dHVyZS53aGVuQ29tcGxldGUoc2VuZERvbmUpOwogICAgfSBlbHNlIHsKICAgICAgc2VuZERvbmUoKTsKICAgIH0KICB9CgogIC8qKgogICAqIENhbGwgYSBob29rIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIGNhbGwgaXMgcHJvcGVybHkgd3JhcHBlZCBpbiBjb2RlIHRvIGF2b2lkIG90aGVyIGNhbGxiYWNrcwogICAqIGR1cmluZyB0aGUgY2FsbCwgYW5kIGl0IGNoZWNrcyBmb3Igc3RhdGUgY2hhbmdlcyBhZnRlciB0aGUgY2FsbAogICAqIHRoYXQgc2hvdWxkIGNhdXNlIGZ1cnRoZXIgY2FsbGJhY2tzLgogICAqLwogIHZvaWQgX2d1YXJkQ2FsbGJhY2sodm9pZCBjYWxsYmFjaygpKSB7CiAgICBhc3NlcnQoIV9pbkNhbGxiYWNrKTsKICAgIGJvb2wgd2FzSW5wdXRQYXVzZWQgPSBfaXNJbnB1dFBhdXNlZDsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICBjYWxsYmFjaygpOwogICAgX3N0YXRlICY9IH5fU1RBVEVfSU5fQ0FMTEJBQ0s7CiAgICBfY2hlY2tTdGF0ZSh3YXNJbnB1dFBhdXNlZCk7CiAgfQoKICAvKioKICAgKiBDaGVjayBpZiB0aGUgaW5wdXQgbmVlZHMgdG8gYmUgaW5mb3JtZWQgb2Ygc3RhdGUgY2hhbmdlcy4KICAgKgogICAqIFN0YXRlIGNoYW5nZXMgYXJlIHBhdXNpbmcsIHJlc3VtaW5nIGFuZCBjYW5jZWxpbmcuCiAgICoKICAgKiBBZnRlciBjYW5jZWxpbmcsIG5vIGZ1cnRoZXIgY2FsbGJhY2tzIHdpbGwgaGFwcGVuLgogICAqCiAgICogVGhlIGNhbmNlbCBjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgYSB1c2VyIGNhbmNlbCwgb3IgYWZ0ZXIKICAgKiB0aGUgZmluYWwgZG9uZSBldmVudCBpcyBzZW50LgogICAqLwogIHZvaWQgX2NoZWNrU3RhdGUoYm9vbCB3YXNJbnB1dFBhdXNlZCkgewogICAgYXNzZXJ0KCFfaW5DYWxsYmFjayk7CiAgICBpZiAoX2hhc1BlbmRpbmcgJiYgX3BlbmRpbmcuaXNFbXB0eSkgewogICAgICBfc3RhdGUgJj0gfl9TVEFURV9IQVNfUEVORElORzsKICAgICAgaWYgKF9pc0lucHV0UGF1c2VkICYmIF9tYXlSZXN1bWVJbnB1dCkgewogICAgICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0lOUFVUX1BBVVNFRDsKICAgICAgfQogICAgfQogICAgLy8gSWYgdGhlIHN0YXRlIGNoYW5nZXMgZHVyaW5nIGEgY2FsbGJhY2ssIHdlIGltbWVkaWF0ZWx5CiAgICAvLyBtYWtlIGEgbmV3IHN0YXRlLWNoYW5nZSBjYWxsYmFjay4gTG9vcCB1bnRpbCB0aGUgc3RhdGUgZGlkbid0IGNoYW5nZS4KICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChfaXNDYW5jZWxlZCkgewogICAgICAgIF9wZW5kaW5nID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYm9vbCBpc0lucHV0UGF1c2VkID0gX2lzSW5wdXRQYXVzZWQ7CiAgICAgIGlmICh3YXNJbnB1dFBhdXNlZCA9PSBpc0lucHV0UGF1c2VkKSBicmVhazsKICAgICAgX3N0YXRlIF49IF9TVEFURV9JTl9DQUxMQkFDSzsKICAgICAgaWYgKGlzSW5wdXRQYXVzZWQpIHsKICAgICAgICBfb25QYXVzZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIF9vblJlc3VtZSgpOwogICAgICB9CiAgICAgIF9zdGF0ZSAmPSB+X1NUQVRFX0lOX0NBTExCQUNLOwogICAgICB3YXNJbnB1dFBhdXNlZCA9IGlzSW5wdXRQYXVzZWQ7CiAgICB9CiAgICBpZiAoX2hhc1BlbmRpbmcgJiYgIV9pc1BhdXNlZCkgewogICAgICBfcGVuZGluZy5zY2hlZHVsZSh0aGlzKTsKICAgIH0KICB9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29tbW9uIGJhc2UgY2xhc3MgZm9yIHNpbmdsZSBhbmQgbXVsdGktc3Vic2NyaXB0aW9uIHN0cmVhbXMuCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYWJzdHJhY3QgY2xhc3MgX1N0cmVhbUltcGw8VD4gZXh0ZW5kcyBTdHJlYW08VD4gewogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFN0cmVhbSBpbnRlcmZhY2UuCgogIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBsaXN0ZW4odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIGNhbmNlbE9uRXJyb3IgPSBpZGVudGljYWwodHJ1ZSwgY2FuY2VsT25FcnJvcik7CiAgICBTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0KICAgICAgICBfY3JlYXRlU3Vic2NyaXB0aW9uKG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKTsKICAgIF9vbkxpc3RlbihzdWJzY3JpcHRpb24pOwogICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICB9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvKiogQ3JlYXRlIGEgc3Vic2NyaXB0aW9uIG9iamVjdC4gQ2FsbGVkIGJ5IFtzdWJjcmliZV0uICovCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IF9jcmVhdGVTdWJzY3JpcHRpb24odm9pZCBvbkRhdGEoVCBkYXRhKSwKICAgICAgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKSB7CiAgICByZXR1cm4gbmV3IF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4oCiAgICAgICAgb25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgLyoqIEhvb2sgY2FsbGVkIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBoYXMgYmVlbiBjcmVhdGVkLiAqLwogIHZvaWQgX29uTGlzdGVuKFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24pIHt9Cn0KCnR5cGVkZWYgX1BlbmRpbmdFdmVudHM8VD4gX0V2ZW50R2VuZXJhdG9yPFQ+KCk7CgovKiogU3RyZWFtIHRoYXQgZ2VuZXJhdGVzIGl0cyBvd24gZXZlbnRzLiAqLwpjbGFzcyBfR2VuZXJhdGVkU3RyZWFtSW1wbDxUPiBleHRlbmRzIF9TdHJlYW1JbXBsPFQ+IHsKICBmaW5hbCBfRXZlbnRHZW5lcmF0b3I8VD4gX3BlbmRpbmc7CiAgYm9vbCBfaXNVc2VkID0gZmFsc2U7CiAgLyoqCiAgICogSW5pdGlhbGl6ZXMgdGhlIHN0cmVhbSB0byBoYXZlIG9ubHkgdGhlIGV2ZW50cyBwcm92aWRlZCBieSBhCiAgICogW19QZW5kaW5nRXZlbnRzXS4KICAgKgogICAqIEEgbmV3IFtfUGVuZGluZ0V2ZW50c10gbXVzdCBiZSBnZW5lcmF0ZWQgZm9yIGVhY2ggbGlzdGVuLgogICAqLwogIF9HZW5lcmF0ZWRTdHJlYW1JbXBsKHRoaXMuX3BlbmRpbmcpOwoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX2NyZWF0ZVN1YnNjcmlwdGlvbih2b2lkIG9uRGF0YShUIGRhdGEpLAogICAgICBGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgIGlmIChfaXNVc2VkKSB0aHJvdyBuZXcgU3RhdGVFcnJvcigiU3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbGlzdGVuZWQgdG8uIik7CiAgICBfaXNVc2VkID0gdHJ1ZTsKICAgIHJldHVybiBuZXcgX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPigKICAgICAgICBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcikKICAgICAgLi5fc2V0UGVuZGluZ0V2ZW50cyhfcGVuZGluZygpKTsKICB9Cn0KCi8qKiBQZW5kaW5nIGV2ZW50cyBvYmplY3QgdGhhdCBnZXRzIGl0cyBldmVudHMgZnJvbSBhbiBbSXRlcmFibGVdLiAqLwpjbGFzcyBfSXRlcmFibGVQZW5kaW5nRXZlbnRzPFQ+IGV4dGVuZHMgX1BlbmRpbmdFdmVudHM8VD4gewogIC8vIFRoZSBpdGVyYXRvciBwcm92aWRpbmcgZGF0YSBmb3IgZGF0YSBldmVudHMuCiAgLy8gU2V0IHRvIG51bGwgd2hlbiBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KICBJdGVyYXRvcjxUPiBfaXRlcmF0b3I7CgogIF9JdGVyYWJsZVBlbmRpbmdFdmVudHMoSXRlcmFibGU8VD4gZGF0YSkgOiBfaXRlcmF0b3IgPSBkYXRhLml0ZXJhdG9yOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF9pdGVyYXRvciA9PSBudWxsOwoKICB2b2lkIGhhbmRsZU5leHQoX0V2ZW50RGlzcGF0Y2g8VD4gZGlzcGF0Y2gpIHsKICAgIGlmIChfaXRlcmF0b3IgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigiTm8gZXZlbnRzIHBlbmRpbmcuIik7CiAgICB9CiAgICAvLyBTZW5kIG9uZSBldmVudCBwZXIgY2FsbCB0byBtb3ZlTmV4dC4KICAgIC8vIElmIG1vdmVOZXh0IHJldHVybnMgdHJ1ZSwgc2VuZCB0aGUgY3VycmVudCBlbGVtZW50IGFzIGRhdGEuCiAgICAvLyBJZiBjdXJyZW50IHRocm93cywgc2VuZCB0aGF0IGVycm9yLCBidXQga2VlcCBpdGVyYXRpbmcuCiAgICAvLyBJZiBtb3ZlTmV4dCByZXR1cm5zIGZhbHNlLCBzZW5kIGEgZG9uZSBldmVudCBhbmQgY2xlYXIgdGhlIF9pdGVyYXRvci4KICAgIC8vIElmIG1vdmVOZXh0IHRocm93cyBhbiBlcnJvciwgc2VuZCBhbiBlcnJvciBhbmQgcHJlcGFyZSB0byBzZW5kIGEgZG9uZQogICAgLy8gZXZlbnQgYWZ0ZXJ3YXJkcy4KICAgIGJvb2wgaGFzTW9yZTsKICAgIHRyeSB7CiAgICAgIGhhc01vcmUgPSBfaXRlcmF0b3IubW92ZU5leHQoKTsKICAgICAgaWYgKGhhc01vcmUpIHsKICAgICAgICBkaXNwYXRjaC5fc2VuZERhdGEoX2l0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIF9pdGVyYXRvciA9IG51bGw7CiAgICAgICAgZGlzcGF0Y2guX3NlbmREb25lKCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaWYgKGhhc01vcmUgPT0gbnVsbCkgewogICAgICAgIC8vIFRocmV3IGluIC5tb3ZlTmV4dCgpLgogICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIHNlbmQgYSBkb25lIGFmdGVyd2FyZHMuCiAgICAgICAgX2l0ZXJhdG9yID0gY29uc3QgRW1wdHlJdGVyYXRvcjxOdWxsPigpOwogICAgICAgIGRpc3BhdGNoLl9zZW5kRXJyb3IoZSwgcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhyZXcgaW4gLmN1cnJlbnQuCiAgICAgICAgZGlzcGF0Y2guX3NlbmRFcnJvcihlLCBzKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIGlmIChpc1NjaGVkdWxlZCkgY2FuY2VsU2NoZWR1bGUoKTsKICAgIF9pdGVyYXRvciA9IG51bGw7CiAgfQp9CgovLyBJbnRlcm5hbCBoZWxwZXJzLgoKLy8gVHlwZXMgb2YgdGhlIGRpZmZlcmVudCBoYW5kbGVycyBvbiBhIHN0cmVhbS4gVHlwZXMgdXNlZCB0byB0eXBlIGZpZWxkcy4KdHlwZWRlZiB2b2lkIF9EYXRhSGFuZGxlcjxUPihUIHZhbHVlKTsKdHlwZWRlZiB2b2lkIF9Eb25lSGFuZGxlcigpOwoKLyoqIERlZmF1bHQgZGF0YSBoYW5kbGVyLCBkb2VzIG5vdGhpbmcuICovCnZvaWQgX251bGxEYXRhSGFuZGxlcihPYmplY3QgdmFsdWUpIHt9CgovKiogRGVmYXVsdCBlcnJvciBoYW5kbGVyLCByZXBvcnRzIHRoZSBlcnJvciB0byB0aGUgY3VycmVudCB6b25lJ3MgaGFuZGxlci4gKi8Kdm9pZCBfbnVsbEVycm9ySGFuZGxlcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgWm9uZS5jdXJyZW50LmhhbmRsZVVuY2F1Z2h0RXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwp9CgovKiogRGVmYXVsdCBkb25lIGhhbmRsZXIsIGRvZXMgbm90aGluZy4gKi8Kdm9pZCBfbnVsbERvbmVIYW5kbGVyKCkge30KCi8qKiBBIGRlbGF5ZWQgZXZlbnQgb24gYSBidWZmZXJpbmcgc3RyZWFtIHN1YnNjcmlwdGlvbi4gKi8KYWJzdHJhY3QgY2xhc3MgX0RlbGF5ZWRFdmVudDxUPiB7CiAgLyoqIEFkZGVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIFtTdHJlYW1Db250cm9sbGVyXS4gKi8KICBfRGVsYXllZEV2ZW50IG5leHQ7CiAgLyoqIEV4ZWN1dGUgdGhlIGRlbGF5ZWQgZXZlbnQgb24gdGhlIFtTdHJlYW1Db250cm9sbGVyXS4gKi8KICB2b2lkIHBlcmZvcm0oX0V2ZW50RGlzcGF0Y2g8VD4gZGlzcGF0Y2gpOwp9CgovKiogQSBkZWxheWVkIGRhdGEgZXZlbnQuICovCmNsYXNzIF9EZWxheWVkRGF0YTxUPiBleHRlbmRzIF9EZWxheWVkRXZlbnQ8VD4gewogIGZpbmFsIFQgdmFsdWU7CiAgX0RlbGF5ZWREYXRhKHRoaXMudmFsdWUpOwogIHZvaWQgcGVyZm9ybShfRXZlbnREaXNwYXRjaDxUPiBkaXNwYXRjaCkgewogICAgZGlzcGF0Y2guX3NlbmREYXRhKHZhbHVlKTsKICB9Cn0KCi8qKiBBIGRlbGF5ZWQgZXJyb3IgZXZlbnQuICovCmNsYXNzIF9EZWxheWVkRXJyb3IgZXh0ZW5kcyBfRGVsYXllZEV2ZW50IHsKICBmaW5hbCBlcnJvcjsKICBmaW5hbCBTdGFja1RyYWNlIHN0YWNrVHJhY2U7CgogIF9EZWxheWVkRXJyb3IodGhpcy5lcnJvciwgdGhpcy5zdGFja1RyYWNlKTsKICB2b2lkIHBlcmZvcm0oX0V2ZW50RGlzcGF0Y2ggZGlzcGF0Y2gpIHsKICAgIGRpc3BhdGNoLl9zZW5kRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KfQoKLyoqIEEgZGVsYXllZCBkb25lIGV2ZW50LiAqLwpjbGFzcyBfRGVsYXllZERvbmUgaW1wbGVtZW50cyBfRGVsYXllZEV2ZW50IHsKICBjb25zdCBfRGVsYXllZERvbmUoKTsKICB2b2lkIHBlcmZvcm0oX0V2ZW50RGlzcGF0Y2ggZGlzcGF0Y2gpIHsKICAgIGRpc3BhdGNoLl9zZW5kRG9uZSgpOwogIH0KCiAgX0RlbGF5ZWRFdmVudCBnZXQgbmV4dCA9PiBudWxsOwoKICB2b2lkIHNldCBuZXh0KF9EZWxheWVkRXZlbnQgXykgewogICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIk5vIGV2ZW50cyBhZnRlciBhIGRvbmUuIik7CiAgfQp9CgovKiogU3VwZXJjbGFzcyBmb3IgcHJvdmlkZXIgb2YgcGVuZGluZyBldmVudHMuICovCmFic3RyYWN0IGNsYXNzIF9QZW5kaW5nRXZlbnRzPFQ+IHsKICAvLyBObyBhc3luYyBldmVudCBoYXMgYmVlbiBzY2hlZHVsZWQuCiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfVU5TQ0hFRFVMRUQgPSAwOwogIC8vIEFuIGFzeW5jIGV2ZW50IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBydW4gYSBmdW5jdGlvbi4KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9TQ0hFRFVMRUQgPSAxOwogIC8vIEFuIGFzeW5jIGV2ZW50IGhhcyBiZWVuIHNjaGVkdWxlZCwgYnV0IGl0IHdpbGwgZG8gbm90aGluZyB3aGVuIGl0IHJ1bnMuCiAgLy8gQXN5bmMgZXZlbnRzIGNhbid0IGJlIHByZWVtcHRlZC4KICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9DQU5DRUxFRCA9IDM7CgogIC8qKgogICAqIFN0YXRlIG9mIGJlaW5nIHNjaGVkdWxlZC4KICAgKgogICAqIFNldCB0byBbX1NUQVRFX1NDSEVEVUxFRF0gd2hlbiBwZW5kaW5nIGV2ZW50cyBhcmUgc2NoZWR1bGVkIGZvcgogICAqIGFzeW5jIGRpc3BhdGNoLiBTaW5jZSB3ZSBjYW4ndCBjYW5jZWwgYSBbc2NoZWR1bGVNaWNyb3Rhc2tdIGNhbGwsIGlmCiAgICogc2NoZWR1bGluZyBpcyAiY2FuY2VsZWQiLCB0aGUgX3N0YXRlIGlzIHNpbXBseSBzZXQgdG8gW19TVEFURV9DQU5DRUxFRF0KICAgKiB3aGljaCB3aWxsIG1ha2UgdGhlIGFzeW5jIGNvZGUgZG8gbm90aGluZyBleGNlcHQgcmVzZXR0aW5nIFtfc3RhdGVdLgogICAqCiAgICogSWYgZXZlbnRzIGFyZSBzY2hlZHVsZWQgd2hpbGUgdGhlIHN0YXRlIGlzIFtfU1RBVEVfQ0FOQ0VMRURdLCBpdCBpcwogICAqIG1lcmVseSBzd2l0Y2hlZCBiYWNrIHRvIFtfU1RBVEVfU0NIRURVTEVEXSwgYnV0IG5vIG5ldyBjYWxsIHRvCiAgICogW3NjaGVkdWxlTWljcm90YXNrXSBpcyBwZXJmb3JtZWQuCiAgICovCiAgaW50IF9zdGF0ZSA9IF9TVEFURV9VTlNDSEVEVUxFRDsKCiAgYm9vbCBnZXQgaXNFbXB0eTsKCiAgYm9vbCBnZXQgaXNTY2hlZHVsZWQgPT4gX3N0YXRlID09IF9TVEFURV9TQ0hFRFVMRUQ7CiAgYm9vbCBnZXQgX2V2ZW50U2NoZWR1bGVkID0+IF9zdGF0ZSA+PSBfU1RBVEVfU0NIRURVTEVEOwoKICAvKioKICAgKiBTY2hlZHVsZSBhbiBldmVudCB0byBydW4gbGF0ZXIuCiAgICoKICAgKiBJZiBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBkaXNwYXRjaCBhcwogICAqIGFyZ3VtZW50IGVhY2ggdGltZS4gSXQgbWF5IHJldXNlIGFuIGVhcmxpZXIgYXJndW1lbnQgaW4gc29tZSBjYXNlcy4KICAgKi8KICB2b2lkIHNjaGVkdWxlKF9FdmVudERpc3BhdGNoPFQ+IGRpc3BhdGNoKSB7CiAgICBpZiAoaXNTY2hlZHVsZWQpIHJldHVybjsKICAgIGFzc2VydCghaXNFbXB0eSk7CiAgICBpZiAoX2V2ZW50U2NoZWR1bGVkKSB7CiAgICAgIGFzc2VydChfc3RhdGUgPT0gX1NUQVRFX0NBTkNFTEVEKTsKICAgICAgX3N0YXRlID0gX1NUQVRFX1NDSEVEVUxFRDsKICAgICAgcmV0dXJuOwogICAgfQogICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICBpbnQgb2xkU3RhdGUgPSBfc3RhdGU7CiAgICAgIF9zdGF0ZSA9IF9TVEFURV9VTlNDSEVEVUxFRDsKICAgICAgaWYgKG9sZFN0YXRlID09IF9TVEFURV9DQU5DRUxFRCkgcmV0dXJuOwogICAgICBoYW5kbGVOZXh0KGRpc3BhdGNoKTsKICAgIH0pOwogICAgX3N0YXRlID0gX1NUQVRFX1NDSEVEVUxFRDsKICB9CgogIHZvaWQgY2FuY2VsU2NoZWR1bGUoKSB7CiAgICBpZiAoaXNTY2hlZHVsZWQpIF9zdGF0ZSA9IF9TVEFURV9DQU5DRUxFRDsKICB9CgogIHZvaWQgaGFuZGxlTmV4dChfRXZlbnREaXNwYXRjaDxUPiBkaXNwYXRjaCk7CgogIC8qKiBUaHJvdyBhd2F5IGFueSBwZW5kaW5nIGV2ZW50cyBhbmQgY2FuY2VsIHNjaGVkdWxlZCBldmVudHMuICovCiAgdm9pZCBjbGVhcigpOwp9CgovKiogQ2xhc3MgaG9sZGluZyBwZW5kaW5nIGV2ZW50cyBmb3IgYSBbX1N0cmVhbUltcGxdLiAqLwpjbGFzcyBfU3RyZWFtSW1wbEV2ZW50czxUPiBleHRlbmRzIF9QZW5kaW5nRXZlbnRzPFQ+IHsKICAvLy8gU2luZ2xlIGxpbmtlZCBsaXN0IG9mIFtfRGVsYXllZEV2ZW50XSBvYmplY3RzLgogIF9EZWxheWVkRXZlbnQgZmlyc3RQZW5kaW5nRXZlbnQ7CgogIC8vLyBMYXN0IGVsZW1lbnQgaW4gdGhlIGxpc3Qgb2YgcGVuZGluZyBldmVudHMuIE5ldyBldmVudHMgYXJlIGFkZGVkIGFmdGVyIGl0LgogIF9EZWxheWVkRXZlbnQgbGFzdFBlbmRpbmdFdmVudDsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBsYXN0UGVuZGluZ0V2ZW50ID09IG51bGw7CgogIHZvaWQgYWRkKF9EZWxheWVkRXZlbnQgZXZlbnQpIHsKICAgIGlmIChsYXN0UGVuZGluZ0V2ZW50ID09IG51bGwpIHsKICAgICAgZmlyc3RQZW5kaW5nRXZlbnQgPSBsYXN0UGVuZGluZ0V2ZW50ID0gZXZlbnQ7CiAgICB9IGVsc2UgewogICAgICBsYXN0UGVuZGluZ0V2ZW50ID0gbGFzdFBlbmRpbmdFdmVudC5uZXh0ID0gZXZlbnQ7CiAgICB9CiAgfQoKICB2b2lkIGhhbmRsZU5leHQoX0V2ZW50RGlzcGF0Y2g8VD4gZGlzcGF0Y2gpIHsKICAgIGFzc2VydCghaXNTY2hlZHVsZWQpOwogICAgX0RlbGF5ZWRFdmVudCBldmVudCA9IGZpcnN0UGVuZGluZ0V2ZW50OwogICAgZmlyc3RQZW5kaW5nRXZlbnQgPSBldmVudC5uZXh0OwogICAgaWYgKGZpcnN0UGVuZGluZ0V2ZW50ID09IG51bGwpIHsKICAgICAgbGFzdFBlbmRpbmdFdmVudCA9IG51bGw7CiAgICB9CiAgICBldmVudC5wZXJmb3JtKGRpc3BhdGNoKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICBpZiAoaXNTY2hlZHVsZWQpIGNhbmNlbFNjaGVkdWxlKCk7CiAgICBmaXJzdFBlbmRpbmdFdmVudCA9IGxhc3RQZW5kaW5nRXZlbnQgPSBudWxsOwogIH0KfQoKdHlwZWRlZiB2b2lkIF9Ccm9hZGNhc3RDYWxsYmFjazxUPihTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKTsKCi8qKgogKiBEb25lIHN1YnNjcmlwdGlvbiB0aGF0IHdpbGwgc2VuZCBvbmUgZG9uZSBldmVudCBhcyBzb29uIGFzIHBvc3NpYmxlLgogKi8KY2xhc3MgX0RvbmVTdHJlYW1TdWJzY3JpcHRpb248VD4gaW1wbGVtZW50cyBTdHJlYW1TdWJzY3JpcHRpb248VD4gewogIHN0YXRpYyBjb25zdCBpbnQgX0RPTkVfU0VOVCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBfU0NIRURVTEVEID0gMjsKICBzdGF0aWMgY29uc3QgaW50IF9QQVVTRUQgPSA0OwoKICBmaW5hbCBab25lIF96b25lOwogIGludCBfc3RhdGUgPSAwOwogIF9Eb25lSGFuZGxlciBfb25Eb25lOwoKICBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbih0aGlzLl9vbkRvbmUpIDogX3pvbmUgPSBab25lLmN1cnJlbnQgewogICAgX3NjaGVkdWxlKCk7CiAgfQoKICBib29sIGdldCBfaXNTZW50ID0+IChfc3RhdGUgJiBfRE9ORV9TRU5UKSAhPSAwOwogIGJvb2wgZ2V0IF9pc1NjaGVkdWxlZCA9PiAoX3N0YXRlICYgX1NDSEVEVUxFRCkgIT0gMDsKICBib29sIGdldCBpc1BhdXNlZCA9PiBfc3RhdGUgPj0gX1BBVVNFRDsKCiAgdm9pZCBfc2NoZWR1bGUoKSB7CiAgICBpZiAoX2lzU2NoZWR1bGVkKSByZXR1cm47CiAgICBfem9uZS5zY2hlZHVsZU1pY3JvdGFzayhfc2VuZERvbmUpOwogICAgX3N0YXRlIHw9IF9TQ0hFRFVMRUQ7CiAgfQoKICB2b2lkIG9uRGF0YSh2b2lkIGhhbmRsZURhdGEoVCBkYXRhKSkge30KICB2b2lkIG9uRXJyb3IoRnVuY3Rpb24gaGFuZGxlRXJyb3IpIHt9CiAgdm9pZCBvbkRvbmUodm9pZCBoYW5kbGVEb25lKCkpIHsKICAgIF9vbkRvbmUgPSBoYW5kbGVEb25lOwogIH0KCiAgdm9pZCBwYXVzZShbRnV0dXJlIHJlc3VtZVNpZ25hbF0pIHsKICAgIF9zdGF0ZSArPSBfUEFVU0VEOwogICAgaWYgKHJlc3VtZVNpZ25hbCAhPSBudWxsKSByZXN1bWVTaWduYWwud2hlbkNvbXBsZXRlKHJlc3VtZSk7CiAgfQoKICB2b2lkIHJlc3VtZSgpIHsKICAgIGlmIChpc1BhdXNlZCkgewogICAgICBfc3RhdGUgLT0gX1BBVVNFRDsKICAgICAgaWYgKCFpc1BhdXNlZCAmJiAhX2lzU2VudCkgewogICAgICAgIF9zY2hlZHVsZSgpOwogICAgICB9CiAgICB9CiAgfQoKICBGdXR1cmUgY2FuY2VsKCkgPT4gRnV0dXJlLl9udWxsRnV0dXJlOwoKICBGdXR1cmU8RT4gYXNGdXR1cmU8RT4oW0UgZnV0dXJlVmFsdWVdKSB7CiAgICBfRnV0dXJlPEU+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPEU+KCk7CiAgICBfb25Eb25lID0gKCkgewogICAgICByZXN1bHQuX2NvbXBsZXRlV2l0aFZhbHVlKGZ1dHVyZVZhbHVlKTsKICAgIH07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBfc2VuZERvbmUoKSB7CiAgICBfc3RhdGUgJj0gfl9TQ0hFRFVMRUQ7CiAgICBpZiAoaXNQYXVzZWQpIHJldHVybjsKICAgIF9zdGF0ZSB8PSBfRE9ORV9TRU5UOwogICAgaWYgKF9vbkRvbmUgIT0gbnVsbCkgX3pvbmUucnVuR3VhcmRlZChfb25Eb25lKTsKICB9Cn0KCmNsYXNzIF9Bc0Jyb2FkY2FzdFN0cmVhbTxUPiBleHRlbmRzIFN0cmVhbTxUPiB7CiAgZmluYWwgU3RyZWFtPFQ+IF9zb3VyY2U7CiAgZmluYWwgX0Jyb2FkY2FzdENhbGxiYWNrPFQ+IF9vbkxpc3RlbkhhbmRsZXI7CiAgZmluYWwgX0Jyb2FkY2FzdENhbGxiYWNrPFQ+IF9vbkNhbmNlbEhhbmRsZXI7CiAgZmluYWwgWm9uZSBfem9uZTsKCiAgX0FzQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPiBfY29udHJvbGxlcjsKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX3N1YnNjcmlwdGlvbjsKCiAgX0FzQnJvYWRjYXN0U3RyZWFtKAogICAgICB0aGlzLl9zb3VyY2UsCiAgICAgIHZvaWQgb25MaXN0ZW5IYW5kbGVyKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pLAogICAgICB2b2lkIG9uQ2FuY2VsSGFuZGxlcihTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSkKICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IHRoZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgdm9pZCBhbmQgc2hvdWxkIGJlCiAgICAgIC8vIGluZmVycmVkLgogICAgICA6IF9vbkxpc3RlbkhhbmRsZXIgPSBab25lLmN1cnJlbnQKICAgICAgICAgICAgLnJlZ2lzdGVyVW5hcnlDYWxsYmFjazxkeW5hbWljLCBTdHJlYW1TdWJzY3JpcHRpb248VD4+KAogICAgICAgICAgICAgICAgb25MaXN0ZW5IYW5kbGVyKSwKICAgICAgICBfb25DYW5jZWxIYW5kbGVyID0gWm9uZS5jdXJyZW50CiAgICAgICAgICAgIC5yZWdpc3RlclVuYXJ5Q2FsbGJhY2s8ZHluYW1pYywgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+PigKICAgICAgICAgICAgICAgIG9uQ2FuY2VsSGFuZGxlciksCiAgICAgICAgX3pvbmUgPSBab25lLmN1cnJlbnQgewogICAgX2NvbnRyb2xsZXIgPSBuZXcgX0FzQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPihfb25MaXN0ZW4sIF9vbkNhbmNlbCk7CiAgfQoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiB0cnVlOwoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gbGlzdGVuKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBpZiAoX2NvbnRyb2xsZXIgPT0gbnVsbCB8fCBfY29udHJvbGxlci5pc0Nsb3NlZCkgewogICAgICAvLyBSZXR1cm4gYSBkdW1teSBzdWJzY3JpcHRpb24gYmFja2VkIGJ5IG5vdGhpbmcsIHNpbmNlCiAgICAgIC8vIGl0IHdpbGwgb25seSBldmVyIHNlbmQgb25lIGRvbmUgZXZlbnQuCiAgICAgIHJldHVybiBuZXcgX0RvbmVTdHJlYW1TdWJzY3JpcHRpb248VD4ob25Eb25lKTsKICAgIH0KICAgIF9zdWJzY3JpcHRpb24gPz89IF9zb3VyY2UubGlzdGVuKF9jb250cm9sbGVyLmFkZCwKICAgICAgICBvbkVycm9yOiBfY29udHJvbGxlci5hZGRFcnJvciwgb25Eb25lOiBfY29udHJvbGxlci5jbG9zZSk7CiAgICBjYW5jZWxPbkVycm9yID0gaWRlbnRpY2FsKHRydWUsIGNhbmNlbE9uRXJyb3IpOwogICAgcmV0dXJuIF9jb250cm9sbGVyLl9zdWJzY3JpYmUob25EYXRhLCBvbkVycm9yLCBvbkRvbmUsIGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgdm9pZCBfb25DYW5jZWwoKSB7CiAgICBib29sIHNodXRkb3duID0gKF9jb250cm9sbGVyID09IG51bGwpIHx8IF9jb250cm9sbGVyLmlzQ2xvc2VkOwogICAgaWYgKF9vbkNhbmNlbEhhbmRsZXIgIT0gbnVsbCkgewogICAgICBfem9uZS5ydW5VbmFyeSgKICAgICAgICAgIF9vbkNhbmNlbEhhbmRsZXIsIG5ldyBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uV3JhcHBlcjxUPih0aGlzKSk7CiAgICB9CiAgICBpZiAoc2h1dGRvd24pIHsKICAgICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICAgIF9zdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX29uTGlzdGVuKCkgewogICAgaWYgKF9vbkxpc3RlbkhhbmRsZXIgIT0gbnVsbCkgewogICAgICBfem9uZS5ydW5VbmFyeSgKICAgICAgICAgIF9vbkxpc3RlbkhhbmRsZXIsIG5ldyBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uV3JhcHBlcjxUPih0aGlzKSk7CiAgICB9CiAgfQoKICAvLyBNZXRob2RzIGNhbGxlZCBmcm9tIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb25XcmFwcGVyLgogIHZvaWQgX2NhbmNlbFN1YnNjcmlwdGlvbigpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybjsKICAgIC8vIENhbGxlZCBieSBbX2NvbnRyb2xsZXJdIHdoZW4gaXQgaGFzIG5vIHN1YnNjcmliZXJzIGxlZnQuCiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uID0gX3N1YnNjcmlwdGlvbjsKICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgX2NvbnRyb2xsZXIgPSBudWxsOyAvLyBNYXJrcyB0aGUgc3RyZWFtIGFzIG5vIGxvbmdlciBsaXN0ZW5hYmxlLgogICAgc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogIH0KCiAgdm9pZCBfcGF1c2VTdWJzY3JpcHRpb24oRnV0dXJlIHJlc3VtZVNpZ25hbCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gPT0gbnVsbCkgcmV0dXJuOwogICAgX3N1YnNjcmlwdGlvbi5wYXVzZShyZXN1bWVTaWduYWwpOwogIH0KCiAgdm9pZCBfcmVzdW1lU3Vic2NyaXB0aW9uKCkgewogICAgaWYgKF9zdWJzY3JpcHRpb24gPT0gbnVsbCkgcmV0dXJuOwogICAgX3N1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICB9CgogIGJvb2wgZ2V0IF9pc1N1YnNjcmlwdGlvblBhdXNlZCB7CiAgICBpZiAoX3N1YnNjcmlwdGlvbiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX3N1YnNjcmlwdGlvbi5pc1BhdXNlZDsKICB9Cn0KCi8qKgogKiBXcmFwcGVyIGZvciBzdWJzY3JpcHRpb24gdGhhdCBkaXNhbGxvd3MgY2hhbmdpbmcgaGFuZGxlcnMuCiAqLwpjbGFzcyBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uV3JhcHBlcjxUPiBpbXBsZW1lbnRzIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgZmluYWwgX0FzQnJvYWRjYXN0U3RyZWFtIF9zdHJlYW07CgogIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb25XcmFwcGVyKHRoaXMuX3N0cmVhbSk7CgogIHZvaWQgb25EYXRhKHZvaWQgaGFuZGxlRGF0YShUIGRhdGEpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGNoYW5nZSBoYW5kbGVycyBvZiBhc0Jyb2FkY2FzdFN0cmVhbSBzb3VyY2Ugc3Vic2NyaXB0aW9uLiIpOwogIH0KCiAgdm9pZCBvbkVycm9yKEZ1bmN0aW9uIGhhbmRsZUVycm9yKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGNoYW5nZSBoYW5kbGVycyBvZiBhc0Jyb2FkY2FzdFN0cmVhbSBzb3VyY2Ugc3Vic2NyaXB0aW9uLiIpOwogIH0KCiAgdm9pZCBvbkRvbmUodm9pZCBoYW5kbGVEb25lKCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJDYW5ub3QgY2hhbmdlIGhhbmRsZXJzIG9mIGFzQnJvYWRjYXN0U3RyZWFtIHNvdXJjZSBzdWJzY3JpcHRpb24uIik7CiAgfQoKICB2b2lkIHBhdXNlKFtGdXR1cmUgcmVzdW1lU2lnbmFsXSkgewogICAgX3N0cmVhbS5fcGF1c2VTdWJzY3JpcHRpb24ocmVzdW1lU2lnbmFsKTsKICB9CgogIHZvaWQgcmVzdW1lKCkgewogICAgX3N0cmVhbS5fcmVzdW1lU3Vic2NyaXB0aW9uKCk7CiAgfQoKICBGdXR1cmUgY2FuY2VsKCkgewogICAgX3N0cmVhbS5fY2FuY2VsU3Vic2NyaXB0aW9uKCk7CiAgICByZXR1cm4gRnV0dXJlLl9udWxsRnV0dXJlOwogIH0KCiAgYm9vbCBnZXQgaXNQYXVzZWQgewogICAgcmV0dXJuIF9zdHJlYW0uX2lzU3Vic2NyaXB0aW9uUGF1c2VkOwogIH0KCiAgRnV0dXJlPEU+IGFzRnV0dXJlPEU+KFtFIGZ1dHVyZVZhbHVlXSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkNhbm5vdCBjaGFuZ2UgaGFuZGxlcnMgb2YgYXNCcm9hZGNhc3RTdHJlYW0gc291cmNlIHN1YnNjcmlwdGlvbi4iKTsKICB9Cn0KCi8qKgogKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgW1N0cmVhbUl0ZXJhdG9yXS4KICoKICogUGF1c2VzIHRoZSBzdHJlYW0gYmV0d2VlbiBjYWxscyB0byBbbW92ZU5leHRdLgogKi8KY2xhc3MgX1N0cmVhbUl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgU3RyZWFtSXRlcmF0b3I8VD4gewogIC8vIFRoZSBzdHJlYW0gaXRlcmF0b3IgaXMgYWx3YXlzIGluIG9uZSBvZiBmb3VyIHN0YXRlcy4KICAvLyBUaGUgdmFsdWUgb2YgdGhlIFtfc3RhdGVEYXRhXSBmaWVsZCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4KICAvLwogIC8vIFdoZW4gYF9zdWJzY3JpcHRpb24gPT0gbnVsbGAgYW5kIGBfc3RhdGVEYXRhICE9IG51bGxgOgogIC8vIFRoZSBzdHJlYW0gaXRlcmF0b3IgaGFzIGJlZW4gY3JlYXRlZCwgYnV0IFttb3ZlTmV4dF0gaGFzIG5vdCBiZWVuIGNhbGxlZAogIC8vIHlldC4gVGhlIFtfc3RhdGVEYXRhXSBmaWVsZCBjb250YWlucyB0aGUgc3RyZWFtIHRvIGxpc3RlbiB0byBvbiB0aGUgZmlyc3QKICAvLyBjYWxsIHRvIFttb3ZlTmV4dF0gYW5kIFtjdXJyZW50XSByZXR1cm5zIGBudWxsYC4KICAvLwogIC8vIFdoZW4gYF9zdWJzY3JpcHRpb24gIT0gbnVsbGAgYW5kIGAhX2lzUGF1c2VkYDoKICAvLyBUaGUgdXNlciBoYXMgY2FsbGVkIFttb3ZlTmV4dF0gYW5kIHRoZSBpdGVyYXRvciBpcyB3YWl0aW5nIGZvciB0aGUgbmV4dAogIC8vIGV2ZW50LiBUaGUgW19zdGF0ZURhdGFdIGZpZWxkIGNvbnRhaW5zIHRoZSBbX0Z1dHVyZV0gcmV0dXJuZWQgYnkgdGhlCiAgLy8gW19tb3ZlTmV4dF0gY2FsbCBhbmQgW2N1cnJlbnRdIHJldHVybnMgYG51bGwuYAogIC8vCiAgLy8gV2hlbiBgX3N1YnNjcmlwdGlvbiAhPSBudWxsYCBhbmQgYF9pc1BhdXNlZGA6CiAgLy8gVGhlIG1vc3QgcmVjZW50IGNhbGwgdG8gW21vdmVOZXh0XSBoYXMgY29tcGxldGVkIHdpdGggYSBgdHJ1ZWAgdmFsdWUKICAvLyBhbmQgW2N1cnJlbnRdIHByb3ZpZGVzIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBldmVudC4KICAvLyBUaGUgW19zdGF0ZURhdGFdIGZpZWxkIGNvbnRhaW5zIHRoZSBbY3VycmVudF0gdmFsdWUuCiAgLy8KICAvLyBXaGVuIGBfc3Vic2NyaXB0aW9uID09IG51bGxgIGFuZCBgX3N0YXRlRGF0YSA9PSBudWxsYDoKICAvLyBUaGUgc3RyZWFtIGhhcyBjb21wbGV0ZWQgb3IgYmVlbiBjYW5jZWxlZCB1c2luZyBbY2FuY2VsXS4KICAvLyBUaGUgc3RyZWFtIGNvbXBsZXRlcyBvbiBlaXRoZXIgYSBkb25lIGV2ZW50IG9yIGFuIGVycm9yIGV2ZW50LgogIC8vIFRoZSBsYXN0IGNhbGwgdG8gW21vdmVOZXh0XSBoYXMgY29tcGxldGVkIHdpdGggYGZhbHNlYCBhbmQgW2N1cnJlbnRdCiAgLy8gcmV0dXJucyBgbnVsbGAuCgogIC8vLyBTdWJzY3JpcHRpb24gYmVpbmcgbGlzdGVuZWQgdG8uCiAgLy8vCiAgLy8vIFNldCB0byBgbnVsbGAgd2hlbiB0aGUgc3RyZWFtIHN1YnNjcmlwdGlvbiBpcyBkb25lIG9yIGNhbmNlbGVkLgogIFN0cmVhbVN1YnNjcmlwdGlvbiBfc3Vic2NyaXB0aW9uOwoKICAvLy8gRGF0YSB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3RhdGUuCiAgLy8vCiAgLy8vIEJlZm9yZSBmaXJzdCBjYWxsIHRvIFttb3ZlTmV4dF06IFRoZSBzdHJlYW0gdG8gbGlzdGVuIHRvLgogIC8vLwogIC8vLyBBZnRlciBjYWxsaW5nIFttb3ZlTmV4dF0gYnV0IGJlZm9yZSB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlczoKICAvLy8gVGhlIHJldHVybmVkIGZ1dHVyZS4KICAvLy8KICAvLy8gQWZ0ZXIgY2FsbGluZyBbbW92ZU5leHRdIGFuZCB0aGUgcmV0dXJuZWQgZnV0dXJlIGhhcyBjb21wbGV0ZWQKICAvLy8gd2l0aCBgdHJ1ZWA6IFRoZSB2YWx1ZSBvZiBbY3VycmVudF0uCiAgLy8vCiAgLy8vIEFmdGVyIGNhbGxpbmcgW21vdmVOZXh0XSBhbmQgdGhlIHJldHVybmVkIGZ1dHVyZSBoYXMgY29tcGxldGVkCiAgLy8vIHdpdGggYGZhbHNlYCwgb3IgYWZ0ZXIgY2FsbGluZyBbY2FuY2VsXTogYG51bGxgLgogIE9iamVjdCBfc3RhdGVEYXRhOwoKICAvLy8gV2hldGhlciB0aGUgaXRlcmF0b3IgaXMgYmV0d2VlbiBjYWxscyB0byBgbW92ZU5leHRgLgogIC8vLyBUaGlzIHdpbGwgdXN1YWxseSBjYXVzZSB0aGUgW19zdWJzY3JpcHRpb25dIHRvIGJlIHBhdXNlZCwgYnV0IGFzIGFuCiAgLy8vIG9wdGltaXphdGlvbiwgd2Ugb25seSBwYXVzZSBhZnRlciB0aGUgW21vdmVOZXh0XSBmdXR1cmUgaGFzIGJlZW4KICAvLy8gY29tcGxldGVkLgogIGJvb2wgX2lzUGF1c2VkID0gZmFsc2U7CgogIF9TdHJlYW1JdGVyYXRvcihmaW5hbCBTdHJlYW08VD4gc3RyZWFtKSA6IF9zdGF0ZURhdGEgPSBzdHJlYW07CgogIFQgZ2V0IGN1cnJlbnQgewogICAgaWYgKF9zdWJzY3JpcHRpb24gIT0gbnVsbCAmJiBfaXNQYXVzZWQpIHsKICAgICAgcmV0dXJuIF9zdGF0ZURhdGE7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIEZ1dHVyZTxib29sPiBtb3ZlTmV4dCgpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgaWYgKF9pc1BhdXNlZCkgewogICAgICAgIHZhciBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxib29sPigpOwogICAgICAgIF9zdGF0ZURhdGEgPSBmdXR1cmU7CiAgICAgICAgX2lzUGF1c2VkID0gZmFsc2U7CiAgICAgICAgX3N1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICByZXR1cm4gZnV0dXJlOwogICAgICB9CiAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCJBbHJlYWR5IHdhaXRpbmcgZm9yIG5leHQuIik7CiAgICB9CiAgICByZXR1cm4gX2luaXRpYWxpemVPckRvbmUoKTsKICB9CgogIC8vLyBDYWxsZWQgaWYgdGhlcmUgaXMgbm8gYWN0aXZlIHN1YnNjcmlwdGlvbiB3aGVuIFttb3ZlTmV4dF0gaXMgY2FsbGVkLgogIC8vLwogIC8vLyBFaXRoZXIgc3RhcnRzIGxpc3RlbmluZyBvbiB0aGUgc3RyZWFtIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8KICAvLy8gW21vdmVOZXh0XSwgb3IgcmV0dXJucyBhIGBmYWxzZWAgZnV0dXJlIGJlY2F1c2UgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeQogIC8vLyBlbmRlZC4KICBGdXR1cmU8Ym9vbD4gX2luaXRpYWxpemVPckRvbmUoKSB7CiAgICBhc3NlcnQoX3N1YnNjcmlwdGlvbiA9PSBudWxsKTsKICAgIHZhciBzdGF0ZURhdGEgPSBfc3RhdGVEYXRhOwogICAgaWYgKHN0YXRlRGF0YSAhPSBudWxsKSB7CiAgICAgIFN0cmVhbTxUPiBzdHJlYW0gPSBzdGF0ZURhdGE7CiAgICAgIF9zdWJzY3JpcHRpb24gPSBzdHJlYW0ubGlzdGVuKF9vbkRhdGEsCiAgICAgICAgICBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBfb25Eb25lLCBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgICAgdmFyIGZ1dHVyZSA9IG5ldyBfRnV0dXJlPGJvb2w+KCk7CiAgICAgIF9zdGF0ZURhdGEgPSBmdXR1cmU7CiAgICAgIHJldHVybiBmdXR1cmU7CiAgICB9CiAgICByZXR1cm4gRnV0dXJlLl9mYWxzZUZ1dHVyZTsKICB9CgogIEZ1dHVyZSBjYW5jZWwoKSB7CiAgICBTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gX3N1YnNjcmlwdGlvbjsKICAgIE9iamVjdCBzdGF0ZURhdGEgPSBfc3RhdGVEYXRhOwogICAgX3N0YXRlRGF0YSA9IG51bGw7CiAgICBpZiAoc3Vic2NyaXB0aW9uICE9IG51bGwpIHsKICAgICAgX3N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIGlmICghX2lzUGF1c2VkKSB7CiAgICAgICAgX0Z1dHVyZTxib29sPiBmdXR1cmUgPSBzdGF0ZURhdGE7CiAgICAgICAgZnV0dXJlLl9hc3luY0NvbXBsZXRlKGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpOwogICAgfQogICAgcmV0dXJuIEZ1dHVyZS5fbnVsbEZ1dHVyZTsKICB9CgogIHZvaWQgX29uRGF0YShUIGRhdGEpIHsKICAgIGFzc2VydChfc3Vic2NyaXB0aW9uICE9IG51bGwgJiYgIV9pc1BhdXNlZCk7CiAgICBfRnV0dXJlPGJvb2w+IG1vdmVOZXh0RnV0dXJlID0gX3N0YXRlRGF0YTsKICAgIF9zdGF0ZURhdGEgPSBkYXRhOwogICAgX2lzUGF1c2VkID0gdHJ1ZTsKICAgIG1vdmVOZXh0RnV0dXJlLl9jb21wbGV0ZSh0cnVlKTsKICAgIGlmIChfc3Vic2NyaXB0aW9uICE9IG51bGwgJiYgX2lzUGF1c2VkKSBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgfQoKICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGFzc2VydChfc3Vic2NyaXB0aW9uICE9IG51bGwgJiYgIV9pc1BhdXNlZCk7CiAgICBfRnV0dXJlPGJvb2w+IG1vdmVOZXh0RnV0dXJlID0gX3N0YXRlRGF0YTsKICAgIF9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgX3N0YXRlRGF0YSA9IG51bGw7CiAgICBtb3ZlTmV4dEZ1dHVyZS5fY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIF9vbkRvbmUoKSB7CiAgICBhc3NlcnQoX3N1YnNjcmlwdGlvbiAhPSBudWxsICYmICFfaXNQYXVzZWQpOwogICAgX0Z1dHVyZTxib29sPiBtb3ZlTmV4dEZ1dHVyZSA9IF9zdGF0ZURhdGE7CiAgICBfc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIF9zdGF0ZURhdGEgPSBudWxsOwogICAgbW92ZU5leHRGdXR1cmUuX2NvbXBsZXRlKGZhbHNlKTsKICB9Cn0KCi8qKiBBbiBlbXB0eSBicm9hZGNhc3Qgc3RyZWFtLCBzZW5kaW5nIGEgZG9uZSBldmVudCBhcyBzb29uIGFzIHBvc3NpYmxlLiAqLwpjbGFzcyBfRW1wdHlTdHJlYW08VD4gZXh0ZW5kcyBTdHJlYW08VD4gewogIGNvbnN0IF9FbXB0eVN0cmVhbSgpIDogc3VwZXIuX2ludGVybmFsKCk7CiAgYm9vbCBnZXQgaXNCcm9hZGNhc3QgPT4gdHJ1ZTsKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gbGlzdGVuKHZvaWQgb25EYXRhKFQgZGF0YSksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gbmV3IF9Eb25lU3RyZWFtU3Vic2NyaXB0aW9uPFQ+KG9uRG9uZSk7CiAgfQp9CoQnAE5OPAEUAUEfFTcRAgEEPgNISRwEIxo4FAIBBEYDTkBBA1EiA0oMAy00LExNT0EDT047BCZJOi8GMTAGJgY5BU47BiwGMQVRIwYoBhYFOx8FTj4GMCwsLQEwGxUYIwE0DgEpLBgBBh4FUAYeASBQQBkbGQQBBjQFSywGPB4nHiIkHwYEASMBKiVGG0MEAScnPBdNN0wNUUsGBAEjJTIEASYdICpKQkFDQwQBEh0VHhgwJCMRIyo3CggGBAEUS08TJxgRBjAEASsqATITJQcwJjonNAwPMggHARMEARcBQjc7Rj4+NjQePEUBIgETHxchBichBAEGIQVGRy4GIBciBAEbARYYHRQXDS4GBAE4HRRGDTkGBAESGB0dFBMNKQYEAUJOLyoUHAQBFR0EARcZEQQBHAEGGgVFLQYqLRw3BhgYJBghCAYEASIBGxoYGioiKiMhBAE5GhgaKgEXTDgzJDgeOlAPMzgIJQYBGigRIzsvDxUIDRMwIwYEARUaGBoBFkw9JEghJQYBDyYhOSwNEgYEAQYbBUNFKgYpGioiECMhBAEGPwU4BTgFQSMGKhorJS8oCAY+TRMZGRAIKzIkGxQPFQglJgYlHwYEAgFHQEcySBcBND80KUUdGQQBST1BPTAxBAE9NQIBMAEtNyUYBkIXBT8GJwFBPU8UMDAnBAIBRjwyLxkBSAEpATAdMgYsQz9NTRkSCiYVLw8aHggVHSEyMSMPHiMIBgQBEScWBAIBFQFLJx0BKycBT0A3AgErGwE7IjsWPiwCAR0xERwtHwQCAR4sDx8BLiosBAIBHS4YKhoEASIBIzUEAgEyIygrOilNJigBBh8FRUpNSgVJRCcGIwEUATY6AQYlBU1JBi4dFhspIQ4GGx0jLxwIHwQBGi8EAS8BRBACATk3NSMBUSIBMAEiJDQNOAYEATAaLSQlHwYdBAERJzEEAgFIAQRIBEQjIyABFBIYAUERBAEyNyoBFR4oGgQBKigjGgQBJhdBBAESFBkjFQgGBAEpASsqEy4HEwQBFRsaGjQEAgEwGzAwFAEvJwEWFEBARhMoRCIoRCIfTQQBIAE0Pzc+MDUGNkM0SwQBFUMkFkkGFCMgHggGBAEVJBZJBgQBOB8nQDUaRRsEATEnJwQBHyccBAEjLSMEAgEEPgRKJAEvASkgTQQBJyBNBAEjIE0EASYuBAESIwQBFCMfBAEWKgQBKyBNBAIBBC4DMgQ4Oj8FPE5PNgU0TUo0BTNKOToFPD9EShUBJgZGJAExBkAGSRsGRSsGRTcVATtKRxEaAUEBEi4ZBhEEARwhFyodGyAXCDkGIAQBSwZJTQ0lIyAdJC1EKBsVBiAEARQ4IxcgHBgqJggkBh8EARkxLxcWJEMEATkxLxoXNgQBEzEvGhclBAIBTCosIDQ/MwQCARtkYXJ0OmFzeW5jL3N0cmVhbV9pbXBsLmRhcnQrb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL3pvbmUuZGFydMAA1p4vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKdHlwZWRlZiBSIFpvbmVDYWxsYmFjazxSPigpOwp0eXBlZGVmIFIgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4oVCBhcmcpOwp0eXBlZGVmIFIgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oVDEgYXJnMSwgVDIgYXJnMik7Cgp0eXBlZGVmIEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyID0gdm9pZCBGdW5jdGlvbihab25lIHNlbGYsCiAgICBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKdHlwZWRlZiBSdW5IYW5kbGVyID0gUiBGdW5jdGlvbjxSPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIEZ1bmN0aW9uKCkgZik7CnR5cGVkZWYgUnVuVW5hcnlIYW5kbGVyID0gUiBGdW5jdGlvbjxSLCBUPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIEZ1bmN0aW9uKFQgYXJnKSBmLCBUIGFyZyk7CnR5cGVkZWYgUnVuQmluYXJ5SGFuZGxlciA9IFIgRnVuY3Rpb248UiwgVDEsIFQyPihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsCiAgICBab25lIHpvbmUsIFIgRnVuY3Rpb24oVDEgYXJnMSwgVDIgYXJnMikgZiwgVDEgYXJnMSwgVDIgYXJnMik7CnR5cGVkZWYgUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXIgPSBab25lQ2FsbGJhY2s8Uj4gRnVuY3Rpb248Uj4oCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBGdW5jdGlvbigpIGYpOwp0eXBlZGVmIFJlZ2lzdGVyVW5hcnlDYWxsYmFja0hhbmRsZXIgPSBab25lVW5hcnlDYWxsYmFjazxSLCBUPiBGdW5jdGlvbjxSLCBUPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIEZ1bmN0aW9uKFQgYXJnKSBmKTsKdHlwZWRlZiBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlcgogICAgPSBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiBGdW5jdGlvbjxSLCBUMSwgVDI+KFpvbmUgc2VsZiwKICAgICAgICBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgRnVuY3Rpb24oVDEgYXJnMSwgVDIgYXJnMikgZik7CnR5cGVkZWYgQXN5bmNFcnJvciBFcnJvckNhbGxiYWNrSGFuZGxlcihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsCiAgICBab25lIHpvbmUsIE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKdHlwZWRlZiB2b2lkIFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCB2b2lkIGYoKSk7CnR5cGVkZWYgVGltZXIgQ3JlYXRlVGltZXJIYW5kbGVyKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoKSk7CnR5cGVkZWYgVGltZXIgQ3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXIoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LAogICAgWm9uZSB6b25lLCBEdXJhdGlvbiBwZXJpb2QsIHZvaWQgZihUaW1lciB0aW1lcikpOwp0eXBlZGVmIHZvaWQgUHJpbnRIYW5kbGVyKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFN0cmluZyBsaW5lKTsKdHlwZWRlZiBab25lIEZvcmtIYW5kbGVyKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgWm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXMpOwoKLyoqIFBhaXIgb2YgZXJyb3IgYW5kIHN0YWNrIHRyYWNlLiBSZXR1cm5lZCBieSBbWm9uZS5lcnJvckNhbGxiYWNrXS4gKi8KY2xhc3MgQXN5bmNFcnJvciBpbXBsZW1lbnRzIEVycm9yIHsKICBmaW5hbCBPYmplY3QgZXJyb3I7CiAgZmluYWwgU3RhY2tUcmFjZSBzdGFja1RyYWNlOwoKICBBc3luY0Vycm9yKHRoaXMuZXJyb3IsIHRoaXMuc3RhY2tUcmFjZSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICckZXJyb3InOwp9CgpjbGFzcyBfWm9uZUZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbj4gewogIGZpbmFsIF9ab25lIHpvbmU7CiAgZmluYWwgVCBmdW5jdGlvbjsKICBjb25zdCBfWm9uZUZ1bmN0aW9uKHRoaXMuem9uZSwgdGhpcy5mdW5jdGlvbik7Cn0KCi8qKgogKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBhIGZvcmtlZCB6b25lLgogKgogKiBXaGVuIGZvcmtpbmcgYSBuZXcgem9uZSAoc2VlIFtab25lLmZvcmtdKSBvbmUgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0CiAqIGJlaGF2aW9yIG9mIHRoZSB6b25lIGJ5IHByb3ZpZGluZyBjYWxsYmFja3MuIFRoZXNlIGNhbGxiYWNrcyBtdXN0IGJlCiAqIGdpdmVuIGluIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAqCiAqIEhhbmRsZXJzIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBzYW1lLW5hbWVkIG1ldGhvZHMgb24gW1pvbmVdIGJ1dAogKiByZWNlaXZlIHRocmVlIGFkZGl0aW9uYWwgYXJndW1lbnRzOgogKgogKiAgIDEuIHRoZSB6b25lIHRoZSBoYW5kbGVycyBhcmUgYXR0YWNoZWQgdG8gKHRoZSAic2VsZiIgem9uZSkuCiAqICAgMi4gYSBbWm9uZURlbGVnYXRlXSB0byB0aGUgcGFyZW50IHpvbmUuCiAqICAgMy4gdGhlIHpvbmUgdGhhdCBmaXJzdCByZWNlaXZlZCB0aGUgcmVxdWVzdCAoYmVmb3JlIHRoZSByZXF1ZXN0IHdhcwogKiAgICAgYnViYmxlZCB1cCkuCiAqCiAqIEhhbmRsZXJzIGNhbiBlaXRoZXIgc3RvcCBwcm9wYWdhdGlvbiB0aGUgcmVxdWVzdCAoYnkgc2ltcGx5IG5vdCBjYWxsaW5nIHRoZQogKiBwYXJlbnQgaGFuZGxlciksIG9yIGZvcndhcmQgdG8gdGhlIHBhcmVudCB6b25lLCBwb3RlbnRpYWxseSBtb2RpZnlpbmcgdGhlCiAqIGFyZ3VtZW50cyBvbiB0aGUgd2F5LgogKi8KYWJzdHJhY3QgY2xhc3MgWm9uZVNwZWNpZmljYXRpb24gewogIC8qKgogICAqIENyZWF0ZXMgYSBzcGVjaWZpY2F0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGhhbmRsZXJzLgogICAqLwogIGNvbnN0IGZhY3RvcnkgWm9uZVNwZWNpZmljYXRpb24oCiAgICAgIHtIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlciBoYW5kbGVVbmNhdWdodEVycm9yLAogICAgICBSdW5IYW5kbGVyIHJ1biwKICAgICAgUnVuVW5hcnlIYW5kbGVyIHJ1blVuYXJ5LAogICAgICBSdW5CaW5hcnlIYW5kbGVyIHJ1bkJpbmFyeSwKICAgICAgUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJDYWxsYmFjaywKICAgICAgUmVnaXN0ZXJVbmFyeUNhbGxiYWNrSGFuZGxlciByZWdpc3RlclVuYXJ5Q2FsbGJhY2ssCiAgICAgIFJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2ssCiAgICAgIEVycm9yQ2FsbGJhY2tIYW5kbGVyIGVycm9yQ2FsbGJhY2ssCiAgICAgIFNjaGVkdWxlTWljcm90YXNrSGFuZGxlciBzY2hlZHVsZU1pY3JvdGFzaywKICAgICAgQ3JlYXRlVGltZXJIYW5kbGVyIGNyZWF0ZVRpbWVyLAogICAgICBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlciBjcmVhdGVQZXJpb2RpY1RpbWVyLAogICAgICBQcmludEhhbmRsZXIgcHJpbnQsCiAgICAgIEZvcmtIYW5kbGVyIGZvcmt9KSA9IF9ab25lU3BlY2lmaWNhdGlvbjsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNwZWNpZmljYXRpb24gZnJvbSBbb3RoZXJdIHdpdGggdGhlIHByb3ZpZGVkIGhhbmRsZXJzIG92ZXJyaWRpbmcKICAgKiB0aGUgb25lcyBpbiBbb3RoZXJdLgogICAqLwogIGZhY3RvcnkgWm9uZVNwZWNpZmljYXRpb24uZnJvbShab25lU3BlY2lmaWNhdGlvbiBvdGhlciwKICAgICAge0hhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyIGhhbmRsZVVuY2F1Z2h0RXJyb3IsCiAgICAgIFJ1bkhhbmRsZXIgcnVuLAogICAgICBSdW5VbmFyeUhhbmRsZXIgcnVuVW5hcnksCiAgICAgIFJ1bkJpbmFyeUhhbmRsZXIgcnVuQmluYXJ5LAogICAgICBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciByZWdpc3RlckNhbGxiYWNrLAogICAgICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyVW5hcnlDYWxsYmFjaywKICAgICAgUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjaywKICAgICAgRXJyb3JDYWxsYmFja0hhbmRsZXIgZXJyb3JDYWxsYmFjaywKICAgICAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIHNjaGVkdWxlTWljcm90YXNrLAogICAgICBDcmVhdGVUaW1lckhhbmRsZXIgY3JlYXRlVGltZXIsCiAgICAgIENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyIGNyZWF0ZVBlcmlvZGljVGltZXIsCiAgICAgIFByaW50SGFuZGxlciBwcmludCwKICAgICAgRm9ya0hhbmRsZXIgZm9ya30pIHsKICAgIHJldHVybiBuZXcgWm9uZVNwZWNpZmljYXRpb24oCiAgICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcjogaGFuZGxlVW5jYXVnaHRFcnJvciA/PyBvdGhlci5oYW5kbGVVbmNhdWdodEVycm9yLAogICAgICAgIHJ1bjogcnVuID8/IG90aGVyLnJ1biwKICAgICAgICBydW5VbmFyeTogcnVuVW5hcnkgPz8gb3RoZXIucnVuVW5hcnksCiAgICAgICAgcnVuQmluYXJ5OiBydW5CaW5hcnkgPz8gb3RoZXIucnVuQmluYXJ5LAogICAgICAgIHJlZ2lzdGVyQ2FsbGJhY2s6IHJlZ2lzdGVyQ2FsbGJhY2sgPz8gb3RoZXIucmVnaXN0ZXJDYWxsYmFjaywKICAgICAgICByZWdpc3RlclVuYXJ5Q2FsbGJhY2s6CiAgICAgICAgICAgIHJlZ2lzdGVyVW5hcnlDYWxsYmFjayA/PyBvdGhlci5yZWdpc3RlclVuYXJ5Q2FsbGJhY2ssCiAgICAgICAgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazoKICAgICAgICAgICAgcmVnaXN0ZXJCaW5hcnlDYWxsYmFjayA/PyBvdGhlci5yZWdpc3RlckJpbmFyeUNhbGxiYWNrLAogICAgICAgIGVycm9yQ2FsbGJhY2s6IGVycm9yQ2FsbGJhY2sgPz8gb3RoZXIuZXJyb3JDYWxsYmFjaywKICAgICAgICBzY2hlZHVsZU1pY3JvdGFzazogc2NoZWR1bGVNaWNyb3Rhc2sgPz8gb3RoZXIuc2NoZWR1bGVNaWNyb3Rhc2ssCiAgICAgICAgY3JlYXRlVGltZXI6IGNyZWF0ZVRpbWVyID8/IG90aGVyLmNyZWF0ZVRpbWVyLAogICAgICAgIGNyZWF0ZVBlcmlvZGljVGltZXI6IGNyZWF0ZVBlcmlvZGljVGltZXIgPz8gb3RoZXIuY3JlYXRlUGVyaW9kaWNUaW1lciwKICAgICAgICBwcmludDogcHJpbnQgPz8gb3RoZXIucHJpbnQsCiAgICAgICAgZm9yazogZm9yayA/PyBvdGhlci5mb3JrKTsKICB9CgogIEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyIGdldCBoYW5kbGVVbmNhdWdodEVycm9yOwogIFJ1bkhhbmRsZXIgZ2V0IHJ1bjsKICBSdW5VbmFyeUhhbmRsZXIgZ2V0IHJ1blVuYXJ5OwogIFJ1bkJpbmFyeUhhbmRsZXIgZ2V0IHJ1bkJpbmFyeTsKICBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciBnZXQgcmVnaXN0ZXJDYWxsYmFjazsKICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIGdldCByZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXIgZ2V0IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgRXJyb3JDYWxsYmFja0hhbmRsZXIgZ2V0IGVycm9yQ2FsbGJhY2s7CiAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIGdldCBzY2hlZHVsZU1pY3JvdGFzazsKICBDcmVhdGVUaW1lckhhbmRsZXIgZ2V0IGNyZWF0ZVRpbWVyOwogIENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyIGdldCBjcmVhdGVQZXJpb2RpY1RpbWVyOwogIFByaW50SGFuZGxlciBnZXQgcHJpbnQ7CiAgRm9ya0hhbmRsZXIgZ2V0IGZvcms7Cn0KCi8qKgogKiBJbnRlcm5hbCBbWm9uZVNwZWNpZmljYXRpb25dIGNsYXNzLgogKgogKiBUaGUgaW1wbGVtZW50YXRpb24gd2FudHMgdG8gcmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZSBnZXR0ZXJzIGNhbm5vdCBjaGFuZ2UKICogZHluYW1pY2FsbHkuIFdlIHRodXMgcmVxdWlyZSB1c2VycyB0byBnbyB0aHJvdWdoIHRoZSByZWRpcmVjdGluZwogKiBbWm9uZVNwZWNpZmljYXRpb25dIGNvbnN0cnVjdG9yIHdoaWNoIGluc3RhbnRpYXRlcyB0aGlzIGNsYXNzLgogKi8KY2xhc3MgX1pvbmVTcGVjaWZpY2F0aW9uIGltcGxlbWVudHMgWm9uZVNwZWNpZmljYXRpb24gewogIGNvbnN0IF9ab25lU3BlY2lmaWNhdGlvbigKICAgICAge3RoaXMuaGFuZGxlVW5jYXVnaHRFcnJvciwKICAgICAgdGhpcy5ydW4sCiAgICAgIHRoaXMucnVuVW5hcnksCiAgICAgIHRoaXMucnVuQmluYXJ5LAogICAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssCiAgICAgIHRoaXMucmVnaXN0ZXJVbmFyeUNhbGxiYWNrLAogICAgICB0aGlzLnJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2ssCiAgICAgIHRoaXMuZXJyb3JDYWxsYmFjaywKICAgICAgdGhpcy5zY2hlZHVsZU1pY3JvdGFzaywKICAgICAgdGhpcy5jcmVhdGVUaW1lciwKICAgICAgdGhpcy5jcmVhdGVQZXJpb2RpY1RpbWVyLAogICAgICB0aGlzLnByaW50LAogICAgICB0aGlzLmZvcmt9KTsKCiAgZmluYWwgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgaGFuZGxlVW5jYXVnaHRFcnJvcjsKICBmaW5hbCBSdW5IYW5kbGVyIHJ1bjsKICBmaW5hbCBSdW5VbmFyeUhhbmRsZXIgcnVuVW5hcnk7CiAgZmluYWwgUnVuQmluYXJ5SGFuZGxlciBydW5CaW5hcnk7CiAgZmluYWwgUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXIgcmVnaXN0ZXJDYWxsYmFjazsKICBmaW5hbCBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIHJlZ2lzdGVyVW5hcnlDYWxsYmFjazsKICBmaW5hbCBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlciByZWdpc3RlckJpbmFyeUNhbGxiYWNrOwogIGZpbmFsIEVycm9yQ2FsbGJhY2tIYW5kbGVyIGVycm9yQ2FsbGJhY2s7CiAgZmluYWwgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIHNjaGVkdWxlTWljcm90YXNrOwogIGZpbmFsIENyZWF0ZVRpbWVySGFuZGxlciBjcmVhdGVUaW1lcjsKICBmaW5hbCBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlciBjcmVhdGVQZXJpb2RpY1RpbWVyOwogIGZpbmFsIFByaW50SGFuZGxlciBwcmludDsKICBmaW5hbCBGb3JrSGFuZGxlciBmb3JrOwp9CgovKioKICogQW4gYWRhcHRlZCB2aWV3IG9mIHRoZSBwYXJlbnQgem9uZS4KICoKICogVGhpcyBjbGFzcyBhbGxvd3MgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgem9uZSBtZXRob2QgdG8gaW52b2tlIG1ldGhvZHMgb24KICogdGhlIHBhcmVudCB6b25lIHdoaWxlIHJldGFpbmluZyBrbm93bGVkZ2Ugb2YgdGhlIG9yaWdpbmF0aW5nIHpvbmUuCiAqCiAqIEN1c3RvbSB6b25lcyAoY3JlYXRlZCB0aHJvdWdoIFtab25lLmZvcmtdIG9yIFtydW5ab25lZF0pIGNhbiBwcm92aWRlCiAqIGltcGxlbWVudGF0aW9ucyBvZiBtb3N0IG1ldGhvZHMgb2Ygem9uZXMuIFRoaXMgaXMgc2ltaWxhciB0byBvdmVycmlkaW5nCiAqIG1ldGhvZHMgb24gW1pvbmVdLCBleGNlcHQgdGhhdCB0aGlzIG1lY2hhbmlzbSBkb2Vzbid0IHJlcXVpcmUgc3ViY2xhc3NpbmcuCiAqCiAqIEEgY3VzdG9tIHpvbmUgZnVuY3Rpb24gKHByb3ZpZGVkIHRocm91Z2ggYSBbWm9uZVNwZWNpZmljYXRpb25dKSB0eXBpY2FsbHkKICogcmVjb3JkcyBvciB3cmFwcyBpdHMgcGFyYW1ldGVycyBhbmQgdGhlbiBkZWxlZ2F0ZXMgdGhlIG9wZXJhdGlvbiB0byBpdHMKICogcGFyZW50IHpvbmUgdXNpbmcgdGhlIHByb3ZpZGVkIFtab25lRGVsZWdhdGVdLgogKgogKiBXaGlsZSB6b25lcyBoYXZlIGFjY2VzcyB0byB0aGVpciBwYXJlbnQgem9uZSAodGhyb3VnaCBbWm9uZS5wYXJlbnRdKSBpdCBpcwogKiByZWNvbW1lbmRlZCB0byBjYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBwcm92aWRlZCBwYXJlbnQgZGVsZWdhdGUgZm9yIHR3bwogKiByZWFzb25zOgogKiAxLiB0aGUgZGVsZWdhdGUgbWV0aG9kcyB0YWtlIGFuIGFkZGl0aW9uYWwgYHpvbmVgIGFyZ3VtZW50IHdoaWNoIGlzIHRoZQogKiAgIHpvbmUgdGhlIGFjdGlvbiBoYXMgYmVlbiBpbml0aWF0ZWQgaW4uCiAqIDIuIGRlbGVnYXRlIGNhbGxzIGFyZSBtb3JlIGVmZmljaWVudCwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIGtub3dzIGhvdwogKiAgIHRvIHNraXAgem9uZXMgdGhhdCB3b3VsZCBqdXN0IGRlbGVnYXRlIHRvIHRoZWlyIHBhcmVudHMuCiAqLwphYnN0cmFjdCBjbGFzcyBab25lRGVsZWdhdGUgewogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihab25lIHpvbmUsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwogIFIgcnVuPFI+KFpvbmUgem9uZSwgUiBmKCkpOwogIFIgcnVuVW5hcnk8UiwgVD4oWm9uZSB6b25lLCBSIGYoVCBhcmcpLCBUIGFyZyk7CiAgUiBydW5CaW5hcnk8UiwgVDEsIFQyPihab25lIHpvbmUsIFIgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMik7CiAgWm9uZUNhbGxiYWNrPFI+IHJlZ2lzdGVyQ2FsbGJhY2s8Uj4oWm9uZSB6b25lLCBSIGYoKSk7CiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gcmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KFpvbmUgem9uZSwgUiBmKFQgYXJnKSk7CiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+KAogICAgICBab25lIHpvbmUsIFIgZihUMSBhcmcxLCBUMiBhcmcyKSk7CiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpOwogIHZvaWQgc2NoZWR1bGVNaWNyb3Rhc2soWm9uZSB6b25lLCB2b2lkIGYoKSk7CiAgVGltZXIgY3JlYXRlVGltZXIoWm9uZSB6b25lLCBEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBmKCkpOwogIFRpbWVyIGNyZWF0ZVBlcmlvZGljVGltZXIoWm9uZSB6b25lLCBEdXJhdGlvbiBwZXJpb2QsIHZvaWQgZihUaW1lciB0aW1lcikpOwogIHZvaWQgcHJpbnQoWm9uZSB6b25lLCBTdHJpbmcgbGluZSk7CiAgWm9uZSBmb3JrKFpvbmUgem9uZSwgWm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXMpOwp9CgovKioKICogQSB6b25lIHJlcHJlc2VudHMgYW4gZW52aXJvbm1lbnQgdGhhdCByZW1haW5zIHN0YWJsZSBhY3Jvc3MgYXN5bmNocm9ub3VzCiAqIGNhbGxzLgogKgogKiBDb2RlIGlzIGFsd2F5cyBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiBhIHpvbmUsIGF2YWlsYWJsZSBhcwogKiBbWm9uZS5jdXJyZW50XS4gVGhlIGluaXRpYWwgYG1haW5gIGZ1bmN0aW9uIHJ1bnMgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiAqIGRlZmF1bHQgem9uZSAoW1pvbmUucm9vdF0pLiBDb2RlIGNhbiBiZSBydW4gaW4gYSBkaWZmZXJlbnQgem9uZSB1c2luZyBlaXRoZXIKICogW3J1blpvbmVkXSwgdG8gY3JlYXRlIGEgbmV3IHpvbmUsIG9yIFtab25lLnJ1bl0gdG8gcnVuIGNvZGUgaW4gdGhlIGNvbnRleHQgb2YKICogYW4gZXhpc3Rpbmcgem9uZSBsaWtlbHkgY3JlYXRlZCB1c2luZyBbWm9uZS5mb3JrXS4KICoKICogRGV2ZWxvcGVycyBjYW4gY3JlYXRlIGEgbmV3IHpvbmUgdGhhdCBvdmVycmlkZXMgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSBvZgogKiBhbiBleGlzdGluZyB6b25lLiBGb3IgZXhhbXBsZSwgY3VzdG9tIHpvbmVzIGNhbiByZXBsYWNlIG9mIG1vZGlmeSB0aGUKICogYmVoYXZpb3Igb2YgYHByaW50YCwgdGltZXJzLCBtaWNyb3Rhc2tzIG9yIGhvdyB1bmNhdWdodCBlcnJvcnMgYXJlIGhhbmRsZWQuCiAqCiAqIFRoZSBbWm9uZV0gY2xhc3MgaXMgbm90IHN1YmNsYXNzYWJsZSwgYnV0IHVzZXJzIGNhbiBwcm92aWRlIGN1c3RvbSB6b25lcyBieQogKiBmb3JraW5nIGFuIGV4aXN0aW5nIHpvbmUgKHVzdWFsbHkgW1pvbmUuY3VycmVudF0pIHdpdGggYSBbWm9uZVNwZWNpZmljYXRpb25dLgogKiBUaGlzIGlzIHNpbWlsYXIgdG8gY3JlYXRpbmcgYSBuZXcgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGBab25lYCBjbGFzcwogKiBhbmQgdGhhdCBvdmVycmlkZXMgc29tZSBtZXRob2RzLCBleGNlcHQgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhIG5ldwogKiBjbGFzcy4gSW5zdGVhZCB0aGUgb3ZlcnJpZGluZyBtZXRob2RzIGFyZSBwcm92aWRlZCBhcyBmdW5jdGlvbnMgdGhhdAogKiBleHBsaWNpdGx5IHRha2UgdGhlIGVxdWl2YWxlbnQgb2YgdGhlaXIgb3duIGNsYXNzLCB0aGUgInN1cGVyIiBjbGFzcyBhbmQgdGhlCiAqIGB0aGlzYCBvYmplY3QgYXMgcGFyYW1ldGVycy4KICoKICogQXN5bmNocm9ub3VzIGNhbGxiYWNrcyBhbHdheXMgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB6b25lIHdoZXJlIHRoZXkgd2VyZQogKiBzY2hlZHVsZWQuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdHdvIHN0ZXBzOgogKiAxLiB0aGUgY2FsbGJhY2sgaXMgZmlyc3QgcmVnaXN0ZXJlZCB1c2luZyBvbmUgb2YgW3JlZ2lzdGVyQ2FsbGJhY2tdLAogKiAgIFtyZWdpc3RlclVuYXJ5Q2FsbGJhY2tdLCBvciBbcmVnaXN0ZXJCaW5hcnlDYWxsYmFja10uIFRoaXMgYWxsb3dzIHRoZSB6b25lCiAqICAgdG8gcmVjb3JkIHRoYXQgYSBjYWxsYmFjayBleGlzdHMgYW5kIHBvdGVudGlhbGx5IG1vZGlmeSBpdCAoYnkgcmV0dXJuaW5nIGEKICogICBkaWZmZXJlbnQgY2FsbGJhY2spLiBUaGUgY29kZSBkb2luZyB0aGUgcmVnaXN0cmF0aW9uIChlLmcuLCBgRnV0dXJlLnRoZW5gKQogKiAgIGFsc28gcmVtZW1iZXJzIHRoZSBjdXJyZW50IHpvbmUgc28gdGhhdCBpdCBjYW4gbGF0ZXIgcnVuIHRoZSBjYWxsYmFjayBpbgogKiAgIHRoYXQgem9uZS4KICogMi4gQXQgYSBsYXRlciBwb2ludCB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBpcyBydW4gaW4gdGhlIHJlbWVtYmVyZWQgem9uZS4KICoKICogVGhpcyBpcyBhbGwgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwbGF0Zm9ybSBjb2RlIGFuZCBtb3N0IHVzZXJzIGRvbid0IG5lZWQKICogdG8gd29ycnkgYWJvdXQgaXQuIEhvd2V2ZXIsIGRldmVsb3BlcnMgb2YgbmV3IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLAogKiBwcm92aWRlZCBieSB0aGUgdW5kZXJseWluZyBzeXN0ZW0gb3IgdGhyb3VnaCBuYXRpdmUgZXh0ZW5zaW9ucywgbXVzdCBmb2xsb3cKICogdGhlIHByb3RvY29sIHRvIGJlIHpvbmUgY29tcGF0aWJsZS4KICoKICogRm9yIGNvbnZlbmllbmNlLCB6b25lcyBwcm92aWRlIFtiaW5kQ2FsbGJhY2tdIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcKICogW2JpbmRVbmFyeUNhbGxiYWNrXSBhbmQgW2JpbmRCaW5hcnlDYWxsYmFja10pIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlc3BlY3QKICogdGhlIHpvbmUgY29udHJhY3Q6IHRoZXNlIGZ1bmN0aW9ucyBmaXJzdCBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgYHJlZ2lzdGVyYAogKiBmdW5jdGlvbnMgYW5kIHRoZW4gd3JhcCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gc28gdGhhdCBpdCBydW5zIGluIHRoZSBjdXJyZW50CiAqIHpvbmUgd2hlbiBpdCBpcyBsYXRlciBhc3luY2hyb25vdXNseSBpbnZva2VkLgogKgogKiBTaW1pbGFybHksIHpvbmVzIHByb3ZpZGUgW2JpbmRDYWxsYmFja0d1YXJkZWRdIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcKICogW2JpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZF0gYW5kIFtiaW5kQmluYXJ5Q2FsbGJhY2tHdWFyZGVkXSksIHdoZW4gdGhlCiAqIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIHRocm91Z2ggW1pvbmUucnVuR3VhcmRlZF0uCiAqLwphYnN0cmFjdCBjbGFzcyBab25lIHsKICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yIHNvIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIGluc3RhbnRpYXRlIGEgWm9uZSBjbGFzcy4KICBab25lLl8oKTsKCiAgLyoqCiAgICogVGhlIHJvb3Qgem9uZS4KICAgKgogICAqIEFsbCBpc29sYXRlIGVudHJ5IGZ1bmN0aW9ucyAoYG1haW5gIG9yIHNwYXduZWQgZnVuY3Rpb25zKSBzdGFydCBydW5uaW5nIGluCiAgICogdGhlIHJvb3Qgem9uZSAodGhhdCBpcywgW1pvbmUuY3VycmVudF0gaXMgaWRlbnRpY2FsIHRvIFtab25lLnJvb3RdIHdoZW4gdGhlCiAgICogZW50cnkgZnVuY3Rpb24gaXMgY2FsbGVkKS4gSWYgbm8gY3VzdG9tIHpvbmUgaXMgY3JlYXRlZCwgdGhlIHJlc3Qgb2YgdGhlCiAgICogcHJvZ3JhbSBhbHdheXMgcnVucyBpbiB0aGUgcm9vdCB6b25lLgogICAqCiAgICogVGhlIHJvb3Qgem9uZSBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGFsbCB6b25lIG9wZXJhdGlvbnMuCiAgICogTWFueSBtZXRob2RzLCBsaWtlIFtyZWdpc3RlckNhbGxiYWNrXSBkbyB0aGUgYmFyZSBtaW5pbXVtIHJlcXVpcmVkIG9mIHRoZQogICAqIGZ1bmN0aW9uLCBhbmQgYXJlIG9ubHkgcHJvdmlkZWQgYXMgYSBob29rIGZvciBjdXN0b20gem9uZXMuIE90aGVycywgbGlrZQogICAqIFtzY2hlZHVsZU1pY3JvdGFza10sIGludGVyYWN0IHdpdGggdGhlIHVuZGVybHlpbmcgc3lzdGVtIHRvIGltcGxlbWVudCB0aGUKICAgKiBkZXNpcmVkIGJlaGF2aW9yLgogICAqLwogIHN0YXRpYyBjb25zdCBab25lIHJvb3QgPSBfcm9vdFpvbmU7CgogIC8qKiBUaGUgY3VycmVudGx5IHJ1bm5pbmcgem9uZS4gKi8KICBzdGF0aWMgWm9uZSBfY3VycmVudCA9IF9yb290Wm9uZTsKCiAgLyoqIFRoZSB6b25lIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZS4gKi8KICBzdGF0aWMgWm9uZSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgLyoqCiAgICogSGFuZGxlcyB1bmNhdWdodCBhc3luY2hyb25vdXMgZXJyb3JzLgogICAqCiAgICogVGhlcmUgYXJlIHR3byBraW5kIG9mIGFzeW5jaHJvbm91cyBlcnJvcnMgdGhhdCBhcmUgaGFuZGxlZCBieSB0aGlzCiAgICogZnVuY3Rpb246CiAgICogMS4gVW5jYXVnaHQgZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrcywgZm9yIGV4YW1wbGUsCiAgICogICBhIGB0aHJvd2AgaW4gdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBbVGltZXIucnVuXS4KICAgKiAyLiBBc3luY2hyb25vdXMgZXJyb3JzIHRoYXQgYXJlIHB1c2hlZCB0aHJvdWdoIFtGdXR1cmVdIGFuZCBbU3RyZWFtXQogICAqICAgY2hhaW5zLCBidXQgZm9yIHdoaWNoIG5vIGNoaWxkIHJlZ2lzdGVyZWQgYW4gZXJyb3IgaGFuZGxlci4KICAgKiAgIE1vc3QgYXN5bmNocm9ub3VzIGNsYXNzZXMsIGxpa2UgW0Z1dHVyZV0gb3IgW1N0cmVhbV0gcHVzaCBlcnJvcnMgdG8gdGhlaXIKICAgKiAgIGxpc3RlbmVycy4gRXJyb3JzIGFyZSBwcm9wYWdhdGVkIHRoaXMgd2F5IHVudGlsIGVpdGhlciBhIGxpc3RlbmVyIGhhbmRsZXMKICAgKiAgIHRoZSBlcnJvciAoZm9yIGV4YW1wbGUgd2l0aCBbRnV0dXJlLmNhdGNoRXJyb3JdKSwgb3Igbm8gbGlzdGVuZXIgaXMKICAgKiAgIGF2YWlsYWJsZSBhbnltb3JlLiBJbiB0aGUgbGF0dGVyIGNhc2UsIGZ1dHVyZXMgYW5kIHN0cmVhbXMgaW52b2tlIHRoZQogICAqICAgem9uZSdzIFtoYW5kbGVVbmNhdWdodEVycm9yXS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIHdoZW4gaGFuZGxlZCBieSB0aGUgcm9vdCB6b25lLCB1bmNhdWdodCBhc3luY2hyb25vdXMgZXJyb3JzIGFyZQogICAqIHRyZWF0ZWQgbGlrZSB1bmNhdWdodCBzeW5jaHJvbm91cyBleGNlcHRpb25zLgogICAqLwogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKCiAgLyoqCiAgICogVGhlIHBhcmVudCB6b25lIG9mIHRoZSB0aGlzIHpvbmUuCiAgICoKICAgKiBJcyBgbnVsbGAgaWYgYHRoaXNgIGlzIHRoZSBbcm9vdF0gem9uZS4KICAgKgogICAqIFpvbmVzIGFyZSBjcmVhdGVkIGJ5IFtmb3JrXSBvbiBhbiBleGlzdGluZyB6b25lLCBvciBieSBbcnVuWm9uZWRdIHdoaWNoCiAgICogZm9ya3MgdGhlIFtjdXJyZW50XSB6b25lLiBUaGUgbmV3IHpvbmUncyBwYXJlbnQgem9uZSBpcyB0aGUgem9uZSBpdCB3YXMKICAgKiBmb3JrZWQgZnJvbS4KICAgKi8KICBab25lIGdldCBwYXJlbnQ7CgogIC8qKgogICAqIFRoZSBlcnJvciB6b25lIGlzIHRoZSBvbmUgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGluZyB3aXRoIHVuY2F1Z2h0CiAgICogZXJyb3JzLgogICAqCiAgICogVGhpcyBpcyB0aGUgY2xvc2VzdCBwYXJlbnQgem9uZSBvZiB0aGlzIHpvbmUgdGhhdCBwcm92aWRlcyBhCiAgICogW2hhbmRsZVVuY2F1Z2h0RXJyb3JdIG1ldGhvZC4KICAgKgogICAqIEFzeW5jaHJvbm91cyBlcnJvcnMgbmV2ZXIgY3Jvc3Mgem9uZSBib3VuZGFyaWVzIGJldHdlZW4gem9uZXMgd2l0aAogICAqIGRpZmZlcmVudCBlcnJvciBoYW5kbGVycy4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogaW1wb3J0ICdkYXJ0OmFzeW5jJzsKICAgKgogICAqIG1haW4oKSB7CiAgICogICB2YXIgZnV0dXJlOwogICAqICAgcnVuWm9uZWQoKCkgewogICAqICAgICAvLyBUaGUgYXN5bmNocm9ub3VzIGVycm9yIGlzIGNhdWdodCBieSB0aGUgY3VzdG9tIHpvbmUgd2hpY2ggcHJpbnRzCiAgICogICAgIC8vICdhc3luY2hyb25vdXMgZXJyb3InLgogICAqICAgICBmdXR1cmUgPSBuZXcgRnV0dXJlLmVycm9yKCJhc3luY2hyb25vdXMgZXJyb3IiKTsKICAgKiAgIH0sIG9uRXJyb3I6IChlKSB7IHByaW50KGUpOyB9KTsgIC8vIENyZWF0ZXMgYSB6b25lIHdpdGggYW4gZXJyb3IgaGFuZGxlci4KICAgKiAgIC8vIFRoZSBmb2xsb3dpbmcgYGNhdGNoRXJyb3JgIGhhbmRsZXIgaXMgbmV2ZXIgaW52b2tlZCwgYmVjYXVzZSB0aGUKICAgKiAgIC8vIGN1c3RvbSB6b25lIGNyZWF0ZWQgYnkgdGhlIGNhbGwgdG8gYHJ1blpvbmVkYCBwcm92aWRlcyBhbgogICAqICAgLy8gZXJyb3IgaGFuZGxlci4KICAgKiAgIGZ1dHVyZS5jYXRjaEVycm9yKChlKSB7IHRocm93ICJpcyBuZXZlciByZWFjaGVkIjsgfSk7CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90ZSB0aGF0IGVycm9ycyBjYW5ub3QgZW50ZXIgYSBjaGlsZCB6b25lIHdpdGggYSBkaWZmZXJlbnQgZXJyb3IgaGFuZGxlcgogICAqIGVpdGhlcjoKICAgKiBgYGAKICAgKiBpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogICAqCiAgICogbWFpbigpIHsKICAgKiAgIHJ1blpvbmVkKCgpIHsKICAgKiAgICAgLy8gVGhlIGZvbGxvd2luZyBhc3luY2hyb25vdXMgZXJyb3IgaXMgKm5vdCogY2F1Z2h0IGJ5IHRoZSBgY2F0Y2hFcnJvcmAKICAgKiAgICAgLy8gaW4gdGhlIG5lc3RlZCB6b25lLCBzaW5jZSBlcnJvcnMgYXJlIG5vdCB0byBjcm9zcyB6b25lIGJvdW5kYXJpZXMKICAgKiAgICAgLy8gd2l0aCBkaWZmZXJlbnQgZXJyb3IgaGFuZGxlcnMuCiAgICogICAgIC8vIEluc3RlYWQgdGhlIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGN1cnJlbnQgZXJyb3IgaGFuZGxlciwKICAgKiAgICAgLy8gcHJpbnRpbmcgIkNhdWdodCBieSBvdXRlciB6b25lOiBhc3luY2hyb25vdXMgZXJyb3IiLgogICAqICAgICB2YXIgZnV0dXJlID0gbmV3IEZ1dHVyZS5lcnJvcigiYXN5bmNocm9ub3VzIGVycm9yIik7CiAgICogICAgIHJ1blpvbmVkKCgpIHsKICAgKiAgICAgICBmdXR1cmUuY2F0Y2hFcnJvcigoZSkgeyB0aHJvdyAiaXMgbmV2ZXIgcmVhY2hlZCI7IH0pOwogICAqICAgICB9LCBvbkVycm9yOiAoZSkgeyB0aHJvdyAiaXMgbmV2ZXIgcmVhY2hlZCI7IH0pOwogICAqICAgfSwgb25FcnJvcjogKGUpIHsgcHJpbnQoIkNhdWdodCBieSBvdXRlciB6b25lOiAkZSIpOyB9KTsKICAgKiB9CiAgICogYGBgCiAgICovCiAgWm9uZSBnZXQgZXJyb3Jab25lOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYHRoaXNgIGFuZCBbb3RoZXJab25lXSBhcmUgaW4gdGhlIHNhbWUgZXJyb3Igem9uZS4KICAgKgogICAqIFR3byB6b25lcyBhcmUgaW4gdGhlIHNhbWUgZXJyb3Igem9uZSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgW2Vycm9yWm9uZV0uCiAgICovCiAgYm9vbCBpblNhbWVFcnJvclpvbmUoWm9uZSBvdGhlclpvbmUpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHpvbmUgYXMgYSBjaGlsZCBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgbmV3IHpvbmUgdXNlcyB0aGUgY2xvc3VyZXMgaW4gdGhlIGdpdmVuIFtzcGVjaWZpY2F0aW9uXSB0byBvdmVycmlkZQogICAqIHRoZSBjdXJyZW50J3Mgem9uZSBiZWhhdmlvci4gQWxsIHNwZWNpZmljYXRpb24gZW50cmllcyB0aGF0IGFyZSBgbnVsbGAKICAgKiBpbmhlcml0IHRoZSBiZWhhdmlvciBmcm9tIHRoZSBwYXJlbnQgem9uZSAoYHRoaXNgKS4KICAgKgogICAqIFRoZSBuZXcgem9uZSBpbmhlcml0cyB0aGUgc3RvcmVkIHZhbHVlcyAoYWNjZXNzZWQgdGhyb3VnaCBbb3BlcmF0b3IgW11dKQogICAqIG9mIHRoaXMgem9uZSBhbmQgdXBkYXRlcyB0aGVtIHdpdGggdmFsdWVzIGZyb20gW3pvbmVWYWx1ZXNdLCB3aGljaCBlaXRoZXIKICAgKiBhZGRzIG5ldyB2YWx1ZXMgb3Igb3ZlcnJpZGVzIGV4aXN0aW5nIG9uZXMuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhlIGZvcmsgb3BlcmF0aW9uIGlzIGludGVyY2VwdGlibGUuIEEgem9uZSBjYW4gdGh1cyBjaGFuZ2UKICAgKiB0aGUgem9uZSBzcGVjaWZpY2F0aW9uIChvciB6b25lIHZhbHVlcyksIGdpdmluZyB0aGUgZm9ya2luZyB6b25lIGZ1bGwKICAgKiBjb250cm9sIG92ZXIgdGhlIGNoaWxkIHpvbmUuCiAgICovCiAgWm9uZSBmb3JrKHtab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlc30pOwoKICAvKioKICAgKiBFeGVjdXRlcyBbYWN0aW9uXSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBCeSBkZWZhdWx0IChhcyBpbXBsZW1lbnRlZCBpbiB0aGUgW3Jvb3RdIHpvbmUpLCBydW5zIFthY3Rpb25dCiAgICogd2l0aCBbY3VycmVudF0gc2V0IHRvIHRoaXMgem9uZS4KICAgKgogICAqIElmIFthY3Rpb25dIHRocm93cywgdGhlIHN5bmNocm9ub3VzIGV4Y2VwdGlvbiBpcyBub3QgY2F1Z2h0IGJ5IHRoZSB6b25lJ3MKICAgKiBlcnJvciBoYW5kbGVyLiBVc2UgW3J1bkd1YXJkZWRdIHRvIGFjaGlldmUgdGhhdC4KICAgKgogICAqIFNpbmNlIHRoZSByb290IHpvbmUgaXMgdGhlIG9ubHkgem9uZSB0aGF0IGNhbiBtb2RpZnkgdGhlIHZhbHVlIG9mCiAgICogW2N1cnJlbnRdLCBjdXN0b20gem9uZXMgaW50ZXJjZXB0aW5nIHJ1biBzaG91bGQgYWx3YXlzIGRlbGVnYXRlIHRvIHRoZWlyCiAgICogcGFyZW50IHpvbmUuIFRoZXkgbWF5IHRha2UgYWN0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjYWxsLgogICAqLwogIFIgcnVuPFI+KFIgYWN0aW9uKCkpOwoKICAvKioKICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gW2FjdGlvbl0gd2l0aCBbYXJndW1lbnRdIGluIHRoaXMgem9uZS4KICAgKgogICAqIEFzIFtydW5dIGV4Y2VwdCB0aGF0IFthY3Rpb25dIGlzIGNhbGxlZCB3aXRoIG9uZSBbYXJndW1lbnRdIGluc3RlYWQgb2YKICAgKiBub25lLgogICAqLwogIFIgcnVuVW5hcnk8UiwgVD4oUiBhY3Rpb24oVCBhcmd1bWVudCksIFQgYXJndW1lbnQpOwoKICAvKioKICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gW2FjdGlvbl0gd2l0aCBbYXJndW1lbnQxXSBhbmQgW2FyZ3VtZW50Ml0gaW4gdGhpcwogICAqIHpvbmUuCiAgICoKICAgKiBBcyBbcnVuXSBleGNlcHQgdGhhdCBbYWN0aW9uXSBpcyBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzIGluc3RlYWQgb2Ygbm9uZS4KICAgKi8KICBSIHJ1bkJpbmFyeTxSLCBUMSwgVDI+KAogICAgICBSIGFjdGlvbihUMSBhcmd1bWVudDEsIFQyIGFyZ3VtZW50MiksIFQxIGFyZ3VtZW50MSwgVDIgYXJndW1lbnQyKTsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIFthY3Rpb25dIGluIHRoaXMgem9uZSBhbmQgY2F0Y2hlcyBzeW5jaHJvbm91cwogICAqIGVycm9ycy4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bzoKICAgKiBgYGAKICAgKiB0cnkgewogICAqICAgdGhpcy5ydW4oYWN0aW9uKTsKICAgKiB9IGNhdGNoIChlLCBzKSB7CiAgICogICB0aGlzLmhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICogfQogICAqIGBgYAogICAqCiAgICogU2VlIFtydW5dLgogICAqLwogIHZvaWQgcnVuR3VhcmRlZCh2b2lkIGFjdGlvbigpKTsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIFthY3Rpb25dIHdpdGggW2FyZ3VtZW50XSBpbiB0aGlzIHpvbmUgYW5kCiAgICogY2F0Y2hlcyBzeW5jaHJvbm91cyBlcnJvcnMuCiAgICoKICAgKiBTZWUgW3J1bkd1YXJkZWRdLgogICAqLwogIHZvaWQgcnVuVW5hcnlHdWFyZGVkPFQ+KHZvaWQgYWN0aW9uKFQgYXJndW1lbnQpLCBUIGFyZ3VtZW50KTsKCiAgLyoqCiAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIFthY3Rpb25dIHdpdGggW2FyZ3VtZW50MV0gYW5kIFthcmd1bWVudDJdIGluIHRoaXMKICAgKiB6b25lIGFuZCBjYXRjaGVzIHN5bmNocm9ub3VzIGVycm9ycy4KICAgKgogICAqIFNlZSBbcnVuR3VhcmRlZF0uCiAgICovCiAgdm9pZCBydW5CaW5hcnlHdWFyZGVkPFQxLCBUMj4oCiAgICAgIHZvaWQgYWN0aW9uKFQxIGFyZ3VtZW50MSwgVDIgYXJndW1lbnQyKSwgVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpOwoKICAvKioKICAgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGNhbGxiYWNrIGluIHRoaXMgem9uZS4KICAgKgogICAqIFdoZW4gaW1wbGVtZW50aW5nIGFuIGFzeW5jaHJvbm91cyBwcmltaXRpdmUgdGhhdCB1c2VzIGNhbGxiYWNrcywgdGhlCiAgICogY2FsbGJhY2sgbXVzdCBiZSByZWdpc3RlcmVkIHVzaW5nIFtyZWdpc3RlckNhbGxiYWNrXSBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlCiAgICogdXNlciBwcm92aWRlcyB0aGUgY2FsbGJhY2suIFRoaXMgYWxsb3dzIHpvbmVzIHRvIHJlY29yZCBvdGhlciBpbmZvcm1hdGlvbgogICAqIHRoYXQgdGhleSBuZWVkIGF0IHRoZSBzYW1lIHRpbWUsIHBlcmhhcHMgZXZlbiB3cmFwcGluZyB0aGUgY2FsbGJhY2ssIHNvCiAgICogdGhhdCB0aGUgY2FsbGJhY2sgaXMgcHJlcGFyZWQgd2hlbiBpdCBpcyBsYXRlciBydW4gaW4gdGhlIHNhbWUgem9uZXMKICAgKiAodXNpbmcgW3J1bl0pLiBGb3IgZXhhbXBsZSwgYSB6b25lIG1heSBkZWNpZGUKICAgKiB0byBzdG9yZSB0aGUgc3RhY2sgdHJhY2UgKGF0IHRoZSB0aW1lIG9mIHRoZSByZWdpc3RyYXRpb24pIHdpdGggdGhlCiAgICogY2FsbGJhY2suCiAgICoKICAgKiBSZXR1cm5zIHRoZSBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBwcm92aWRlZAogICAqIFtjYWxsYmFja10uIEZyZXF1ZW50bHkgem9uZXMgc2ltcGx5IHJldHVybiB0aGUgb3JpZ2luYWwgY2FsbGJhY2suCiAgICoKICAgKiBDdXN0b20gem9uZXMgbWF5IGludGVyY2VwdCB0aGlzIG9wZXJhdGlvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW4KICAgKiBbWm9uZS5yb290XSByZXR1cm5zIHRoZSBvcmlnaW5hbCBjYWxsYmFjayB1bmNoYW5nZWQuCiAgICovCiAgWm9uZUNhbGxiYWNrPFI+IHJlZ2lzdGVyQ2FsbGJhY2s8Uj4oUiBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBjYWxsYmFjayBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBTaW1pbGFyIHRvIFtyZWdpc3RlckNhbGxiYWNrXSBidXQgd2l0aCBhIHVuYXJ5IGNhbGxiYWNrLgogICAqLwogIFpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IHJlZ2lzdGVyVW5hcnlDYWxsYmFjazxSLCBUPihSIGNhbGxiYWNrKFQgYXJnKSk7CgogIC8qKgogICAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gY2FsbGJhY2sgaW4gdGhpcyB6b25lLgogICAqCiAgICogU2ltaWxhciB0byBbcmVnaXN0ZXJDYWxsYmFja10gYnV0IHdpdGggYSB1bmFyeSBjYWxsYmFjay4KICAgKi8KICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiByZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgY2FsbGJhY2soVDEgYXJnMSwgVDIgYXJnMikpOwoKICAvKioKICAgKiAgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCBbY2FsbGJhY2tdIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICogIGV4ZWN1dGUgaW4gdGhpcyB6b25lLgogICAqCiAgICogIEVxdWl2YWxlbnQgdG86CiAgICoKICAgKiAgICAgIFpvbmVDYWxsYmFjayByZWdpc3RlcmVkID0gdGhpcy5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJ1bihyZWdpc3RlcmVkKTsKICAgKgogICAqLwogIFpvbmVDYWxsYmFjazxSPiBiaW5kQ2FsbGJhY2s8Uj4oUiBjYWxsYmFjaygpKTsKCiAgLyoqCiAgICogIFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgW2NhbGxiYWNrXSBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbAogICAqICBleGVjdXRlIGluIHRoaXMgem9uZS4KICAgKgogICAqICBFcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgICBab25lQ2FsbGJhY2sgcmVnaXN0ZXJlZCA9IHRoaXMucmVnaXN0ZXJVbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoYXJnKSA9PiB0aGluLnJ1blVuYXJ5KHJlZ2lzdGVyZWQsIGFyZyk7CiAgICovCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gYmluZFVuYXJ5Q2FsbGJhY2s8UiwgVD4oUiBjYWxsYmFjayhUIGFyZ3VtZW50KSk7CgogIC8qKgogICAqICBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFtjYWxsYmFja10gYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwKICAgKiAgZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiAgRXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICAgWm9uZUNhbGxiYWNrIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpbi5ydW5CaW5hcnkocmVnaXN0ZXJlZCwgYXJnMSwgYXJnMik7CiAgICovCiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gYmluZEJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgY2FsbGJhY2soVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpKTsKCiAgLyoqCiAgICogUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCBbY2FsbGJhY2tdIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsCiAgICogZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcywgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIHRyZWF0ZWQgYXMgdW5jYXVnaHQKICAgKiBlcnJvcnMuCiAgICoKICAgKiBFcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgIFpvbmVDYWxsYmFjayByZWdpc3RlcmVkID0gdGhpcy5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgcmV0dXJuICgpID0+IHRoaXMucnVuR3VhcmRlZChyZWdpc3RlcmVkKTsKICAgKgogICAqLwogIHZvaWQgRnVuY3Rpb24oKSBiaW5kQ2FsbGJhY2tHdWFyZGVkKHZvaWQgY2FsbGJhY2soKSk7CgogIC8qKgogICAqIFJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgW2NhbGxiYWNrXSBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbAogICAqIGV4ZWN1dGUgaW4gdGhpcyB6b25lLgogICAqCiAgICogV2hlbiB0aGUgZnVuY3Rpb24gZXhlY3V0ZXMsIGVycm9ycyBhcmUgY2F1Z2h0IGFuZCB0cmVhdGVkIGFzIHVuY2F1Z2h0CiAgICogZXJyb3JzLgogICAqCiAgICogRXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICBab25lQ2FsbGJhY2sgcmVnaXN0ZXJlZCA9IHRoaXMucmVnaXN0ZXJVbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgcmV0dXJuIChhcmcpID0+IHRoaXMucnVuVW5hcnlHdWFyZGVkKHJlZ2lzdGVyZWQsIGFyZyk7CiAgICovCiAgdm9pZCBGdW5jdGlvbihUKSBiaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQ8VD4odm9pZCBjYWxsYmFjayhUIGFyZ3VtZW50KSk7CgogIC8qKgogICAqICBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFtjYWxsYmFja10gYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwKICAgKiAgZXhlY3V0ZSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiAgRXF1aXZhbGVudCB0bzoKICAgKgogICAqICAgICAgWm9uZUNhbGxiYWNrIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGNhbGxiYWNrKTsKICAgKiAgICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpcy5ydW5CaW5hcnlHdWFyZGVkKHJlZ2lzdGVyZWQsIGFyZzEsIGFyZzIpOwogICAqLwogIHZvaWQgRnVuY3Rpb24oVDEsIFQyKSBiaW5kQmluYXJ5Q2FsbGJhY2tHdWFyZGVkPFQxLCBUMj4oCiAgICAgIHZvaWQgY2FsbGJhY2soVDEgYXJndW1lbnQxLCBUMiBhcmd1bWVudDIpKTsKCiAgLyoqCiAgICogSW50ZXJjZXB0cyBlcnJvcnMgd2hlbiBhZGRlZCBwcm9ncmFtbWF0aWNhbGx5IHRvIGEgYEZ1dHVyZWAgb3IgYFN0cmVhbWAuCiAgICoKICAgKiBXaGVuIGNhbGxpbmcgW0NvbXBsZXRlci5jb21wbGV0ZUVycm9yXSwgW1N0cmVhbUNvbnRyb2xsZXIuYWRkRXJyb3JdLAogICAqIG9yIHNvbWUgW0Z1dHVyZV0gY29uc3RydWN0b3JzLCB0aGUgY3VycmVudCB6b25lIGlzIGFsbG93ZWQgdG8gaW50ZXJjZXB0CiAgICogYW5kIHJlcGxhY2UgdGhlIGVycm9yLgogICAqCiAgICogRnV0dXJlIGNvbnN0cnVjdG9ycyBpbnZva2UgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBlcnJvciBpcyByZWNlaXZlZAogICAqIGRpcmVjdGx5LCBmb3IgZXhhbXBsZSB3aXRoIFtGdXR1cmUuZXJyb3JdLCBvciB3aGVuIHRoZSBlcnJvciBpcyBjYXVnaHQKICAgKiBzeW5jaHJvbm91c2x5LCBmb3IgZXhhbXBsZSB3aXRoIFtGdXR1cmUuc3luY10uCiAgICoKICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbiBlcnJvciBpcyBvbmx5IHNlbnQgdGhyb3VnaCBbZXJyb3JDYWxsYmFja10KICAgKiBvbmNlLiBMaWJyYXJpZXMgdGhhdCB1c2UgaW50ZXJtZWRpYXRlIGNvbnRyb2xsZXJzIG9yIGNvbXBsZXRlcnMgbWlnaHQKICAgKiBlbmQgdXAgaW52b2tpbmcgW2Vycm9yQ2FsbGJhY2tdIG11bHRpcGxlIHRpbWVzLgogICAqCiAgICogUmV0dXJucyBgbnVsbGAgaWYgbm8gcmVwbGFjZW1lbnQgaXMgZGVzaXJlZC4gT3RoZXJ3aXNlIHJldHVybnMgYW4gaW5zdGFuY2UKICAgKiBvZiBbQXN5bmNFcnJvcl0gaG9sZGluZyB0aGUgbmV3IHBhaXIgb2YgZXJyb3IgYW5kIHN0YWNrIHRyYWNlLgogICAqCiAgICogQWx0aG91Z2ggbm90IHJlY29tbWVuZGVkLCB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgbWF5IGhhdmUgaXRzIGBlcnJvcmAgbWVtYmVyCiAgICogKFtBc3luY0Vycm9yLmVycm9yXSkgYmUgZXF1YWwgdG8gYG51bGxgIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yIHNob3VsZCBiZQogICAqIHJlcGxhY2VkIGJ5IGEgW051bGxUaHJvd25FcnJvcl0uCiAgICoKICAgKiBDdXN0b20gem9uZXMgbWF5IGludGVyY2VwdCB0aGlzIG9wZXJhdGlvbi4KICAgKgogICAqIEltcGxlbWVudGF0aW9ucyBvZiBhIG5ldyBhc3luY2hyb25vdXMgcHJpbWl0aXZlIHRoYXQgY29udmVydHMgc3luY2hyb25vdXMKICAgKiBlcnJvcnMgdG8gYXN5bmNocm9ub3VzIGVycm9ycyByYXJlbHkgbmVlZCB0byBpbnZva2UgW2Vycm9yQ2FsbGJhY2tdLCBzaW5jZQogICAqIGVycm9ycyBhcmUgdXN1YWxseSByZXBvcnRlZCB0aHJvdWdoIGZ1dHVyZSBjb21wbGV0ZXJzIG9yIHN0cmVhbQogICAqIGNvbnRyb2xsZXJzLgogICAqLwogIEFzeW5jRXJyb3IgZXJyb3JDYWxsYmFjayhPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CgogIC8qKgogICAqIFJ1bnMgW2NhbGxiYWNrXSBhc3luY2hyb25vdXNseSBpbiB0aGlzIHpvbmUuCiAgICoKICAgKiBUaGUgZ2xvYmFsIGBzY2hlZHVsZU1pY3JvdGFza2AgZGVsZWdhdGVzIHRvIHRoZSBjdXJyZW50IHpvbmUncwogICAqIFtzY2hlZHVsZU1pY3JvdGFza10uIFRoZSByb290IHpvbmUncyBpbXBsZW1lbnRhdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUKICAgKiB1bmRlcmx5aW5nIHN5c3RlbSB0byBzY2hlZHVsZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgYXMgYSBtaWNyb3Rhc2suCiAgICoKICAgKiBDdXN0b20gem9uZXMgbWF5IGludGVyY2VwdCB0aGlzIG9wZXJhdGlvbiAoZm9yIGV4YW1wbGUgdG8gd3JhcCB0aGUgZ2l2ZW4KICAgKiBbY2FsbGJhY2tdKS4KICAgKi8KICB2b2lkIHNjaGVkdWxlTWljcm90YXNrKHZvaWQgY2FsbGJhY2soKSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBUaW1lciB3aGVyZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgaW4gdGhpcyB6b25lLgogICAqLwogIFRpbWVyIGNyZWF0ZVRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKCkpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgcGVyaW9kaWMgVGltZXIgd2hlcmUgdGhlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGluIHRoaXMgem9uZS4KICAgKi8KICBUaW1lciBjcmVhdGVQZXJpb2RpY1RpbWVyKER1cmF0aW9uIHBlcmlvZCwgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpOwoKICAvKioKICAgKiBQcmludHMgdGhlIGdpdmVuIFtsaW5lXS4KICAgKgogICAqIFRoZSBnbG9iYWwgYHByaW50YCBmdW5jdGlvbiBkZWxlZ2F0ZXMgdG8gdGhlIGN1cnJlbnQgem9uZSdzIFtwcmludF0KICAgKiBmdW5jdGlvbiB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbnRlcmNlcHQgcHJpbnRpbmcuCiAgICoKICAgKiBFeGFtcGxlOgogICAqIGBgYAogICAqIGltcG9ydCAnZGFydDphc3luYyc7CiAgICoKICAgKiBtYWluKCkgewogICAqICAgcnVuWm9uZWQoKCkgewogICAqICAgICAvLyBFbmRzIHVwIHByaW50aW5nOiAiSW50ZXJjZXB0ZWQ6IGluIHpvbmUiLgogICAqICAgICBwcmludCgiaW4gem9uZSIpOwogICAqICAgfSwgem9uZVNwZWNpZmljYXRpb246IG5ldyBab25lU3BlY2lmaWNhdGlvbigKICAgKiAgICAgICBwcmludDogKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBTdHJpbmcgbGluZSkgewogICAqICAgICBwYXJlbnQucHJpbnQoem9uZSwgIkludGVyY2VwdGVkOiAkbGluZSIpOwogICAqICAgfSkpOwogICAqIH0KICAgKiBgYGAKICAgKi8KICB2b2lkIHByaW50KFN0cmluZyBsaW5lKTsKCiAgLyoqCiAgICogQ2FsbCB0byBlbnRlciB0aGUgWm9uZS4KICAgKgogICAqIFRoZSBwcmV2aW91cyBjdXJyZW50IHpvbmUgaXMgcmV0dXJuZWQuCiAgICovCiAgc3RhdGljIFpvbmUgX2VudGVyKFpvbmUgem9uZSkgewogICAgYXNzZXJ0KHpvbmUgIT0gbnVsbCk7CiAgICBhc3NlcnQoIWlkZW50aWNhbCh6b25lLCBfY3VycmVudCkpOwogICAgWm9uZSBwcmV2aW91cyA9IF9jdXJyZW50OwogICAgX2N1cnJlbnQgPSB6b25lOwogICAgcmV0dXJuIHByZXZpb3VzOwogIH0KCiAgLyoqCiAgICogQ2FsbCB0byBsZWF2ZSB0aGUgWm9uZS4KICAgKgogICAqIFRoZSBwcmV2aW91cyBab25lIG11c3QgYmUgcHJvdmlkZWQgYXMgYHByZXZpb3VzYC4KICAgKi8KICBzdGF0aWMgdm9pZCBfbGVhdmUoWm9uZSBwcmV2aW91cykgewogICAgYXNzZXJ0KHByZXZpb3VzICE9IG51bGwpOwogICAgWm9uZS5fY3VycmVudCA9IHByZXZpb3VzOwogIH0KCiAgLyoqCiAgICogUmV0cmlldmVzIHRoZSB6b25lLXZhbHVlIGFzc29jaWF0ZWQgd2l0aCBba2V5XS4KICAgKgogICAqIElmIHRoaXMgem9uZSBkb2VzIG5vdCBjb250YWluIHRoZSB2YWx1ZSBsb29rcyB1cCB0aGUgc2FtZSBrZXkgaW4gdGhlCiAgICogcGFyZW50IHpvbmUuIElmIHRoZSBba2V5XSBpcyBub3QgZm91bmQgcmV0dXJucyBgbnVsbGAuCiAgICoKICAgKiBBbnkgb2JqZWN0IGNhbiBiZSB1c2VkIGFzIGtleSwgYXMgbG9uZyBhcyBpdCBoYXMgY29tcGF0aWJsZSBgb3BlcmF0b3IgPT1gCiAgICogYW5kIGBoYXNoQ29kZWAgaW1wbGVtZW50YXRpb25zLgogICAqIEJ5IGNvbnRyb2xsaW5nIGFjY2VzcyB0byB0aGUga2V5LCBhIHpvbmUgY2FuIGdyYW50IG9yIGRlbnkgYWNjZXNzIHRvIHRoZQogICAqIHpvbmUgdmFsdWUuCiAgICovCiAgb3BlcmF0b3IgW10oT2JqZWN0IGtleSk7Cn0KClpvbmVEZWxlZ2F0ZSBfcGFyZW50RGVsZWdhdGUoX1pvbmUgem9uZSkgewogIGlmICh6b25lLnBhcmVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICByZXR1cm4gem9uZS5wYXJlbnQuX2RlbGVnYXRlOwp9CgpjbGFzcyBfWm9uZURlbGVnYXRlIGltcGxlbWVudHMgWm9uZURlbGVnYXRlIHsKICBmaW5hbCBfWm9uZSBfZGVsZWdhdGlvblRhcmdldDsKCiAgX1pvbmVEZWxlZ2F0ZSh0aGlzLl9kZWxlZ2F0aW9uVGFyZ2V0KTsKCiAgdm9pZCBoYW5kbGVVbmNhdWdodEVycm9yKFpvbmUgem9uZSwgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX2hhbmRsZVVuY2F1Z2h0RXJyb3I7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcigKICAgICAgICBpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgUiBydW48Uj4oWm9uZSB6b25lLCBSIGYoKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3J1bjsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIFJ1bkhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgUiBydW5VbmFyeTxSLCBUPihab25lIHpvbmUsIFIgZihUIGFyZyksIFQgYXJnKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcnVuVW5hcnk7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBSdW5VbmFyeUhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYsIGFyZyk7CiAgfQoKICBSIHJ1bkJpbmFyeTxSLCBUMSwgVDI+KFpvbmUgem9uZSwgUiBmKFQxIGFyZzEsIFQyIGFyZzIpLCBUMSBhcmcxLCBUMiBhcmcyKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcnVuQmluYXJ5OwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUnVuQmluYXJ5SGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZiwgYXJnMSwgYXJnMik7CiAgfQoKICBab25lQ2FsbGJhY2s8Uj4gcmVnaXN0ZXJDYWxsYmFjazxSPihab25lIHpvbmUsIFIgZigpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSBfZGVsZWdhdGlvblRhcmdldC5fcmVnaXN0ZXJDYWxsYmFjazsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIFJlZ2lzdGVyQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBmKTsKICB9CgogIFpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IHJlZ2lzdGVyVW5hcnlDYWxsYmFjazxSLCBUPihab25lIHpvbmUsIFIgZihUIGFyZykpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9yZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxab25lLCBfcGFyZW50RGVsZWdhdGUoaW1wbFpvbmUpLCB6b25lLCBmKTsKICB9CgogIFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IHJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPigKICAgICAgWm9uZSB6b25lLCBSIGYoVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9yZWdpc3RlckJpbmFyeUNhbGxiYWNrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9lcnJvckNhbGxiYWNrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgaWYgKGlkZW50aWNhbChpbXBsWm9uZSwgX3Jvb3Rab25lKSkgcmV0dXJuIG51bGw7CiAgICBFcnJvckNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcigKICAgICAgICBpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCBzY2hlZHVsZU1pY3JvdGFzayhab25lIHpvbmUsIGYoKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3NjaGVkdWxlTWljcm90YXNrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgU2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGYpOwogIH0KCiAgVGltZXIgY3JlYXRlVGltZXIoWm9uZSB6b25lLCBEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9jcmVhdGVUaW1lcjsKICAgIF9ab25lIGltcGxab25lID0gaW1wbGVtZW50YXRpb24uem9uZTsKICAgIENyZWF0ZVRpbWVySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgZHVyYXRpb24sIGYpOwogIH0KCiAgVGltZXIgY3JlYXRlUGVyaW9kaWNUaW1lcihab25lIHpvbmUsIER1cmF0aW9uIHBlcmlvZCwgdm9pZCBmKFRpbWVyIHRpbWVyKSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX2NyZWF0ZVBlcmlvZGljVGltZXI7CiAgICBfWm9uZSBpbXBsWm9uZSA9IGltcGxlbWVudGF0aW9uLnpvbmU7CiAgICBDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsWm9uZSwgX3BhcmVudERlbGVnYXRlKGltcGxab25lKSwgem9uZSwgcGVyaW9kLCBmKTsKICB9CgogIHZvaWQgcHJpbnQoWm9uZSB6b25lLCBTdHJpbmcgbGluZSkgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gX2RlbGVnYXRpb25UYXJnZXQuX3ByaW50OwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgUHJpbnRIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIGhhbmRsZXIoaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIGxpbmUpOwogIH0KCiAgWm9uZSBmb3JrKFpvbmUgem9uZSwgWm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXMpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IF9kZWxlZ2F0aW9uVGFyZ2V0Ll9mb3JrOwogICAgX1pvbmUgaW1wbFpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgRm9ya0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoCiAgICAgICAgaW1wbFpvbmUsIF9wYXJlbnREZWxlZ2F0ZShpbXBsWm9uZSksIHpvbmUsIHNwZWNpZmljYXRpb24sIHpvbmVWYWx1ZXMpOwogIH0KfQoKLyoqCiAqIEJhc2UgY2xhc3MgZm9yIFpvbmUgaW1wbGVtZW50YXRpb25zLgogKi8KYWJzdHJhY3QgY2xhc3MgX1pvbmUgaW1wbGVtZW50cyBab25lIHsKICBjb25zdCBfWm9uZSgpOwoKICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHR5cGVzIG9mIHRoZSBgX1pvbmVGdW5jdGlvbmBzIHNob3VsZCBoYXZlIGEgdHlwZSBmb3IKICAvLyBhbGwgZmllbGRzLgogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuVW5hcnk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9ydW5CaW5hcnk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gZ2V0IF9yZWdpc3RlckNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJCaW5hcnlDYWxsYmFjazsKICBfWm9uZUZ1bmN0aW9uPEVycm9yQ2FsbGJhY2tIYW5kbGVyPiBnZXQgX2Vycm9yQ2FsbGJhY2s7CiAgX1pvbmVGdW5jdGlvbjxTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXI+IGdldCBfc2NoZWR1bGVNaWNyb3Rhc2s7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVUaW1lckhhbmRsZXI+IGdldCBfY3JlYXRlVGltZXI7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVQZXJpb2RpY1RpbWVySGFuZGxlcj4gZ2V0IF9jcmVhdGVQZXJpb2RpY1RpbWVyOwogIF9ab25lRnVuY3Rpb248UHJpbnRIYW5kbGVyPiBnZXQgX3ByaW50OwogIF9ab25lRnVuY3Rpb248Rm9ya0hhbmRsZXI+IGdldCBfZm9yazsKICBfWm9uZUZ1bmN0aW9uPEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyPiBnZXQgX2hhbmRsZVVuY2F1Z2h0RXJyb3I7CiAgX1pvbmUgZ2V0IHBhcmVudDsKICBab25lRGVsZWdhdGUgZ2V0IF9kZWxlZ2F0ZTsKICBNYXAgZ2V0IF9tYXA7CgogIGJvb2wgaW5TYW1lRXJyb3Jab25lKFpvbmUgb3RoZXJab25lKSB7CiAgICByZXR1cm4gaWRlbnRpY2FsKHRoaXMsIG90aGVyWm9uZSkgfHwKICAgICAgICBpZGVudGljYWwoZXJyb3Jab25lLCBvdGhlclpvbmUuZXJyb3Jab25lKTsKICB9Cn0KCmNsYXNzIF9DdXN0b21ab25lIGV4dGVuZHMgX1pvbmUgewogIC8vIFRoZSBhY3R1YWwgem9uZSBhbmQgaW1wbGVtZW50YXRpb24gb2YgZWFjaCBvZiB0aGVzZQogIC8vIGluaGVyaXRhYmxlIHpvbmUgZnVuY3Rpb25zLgogIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgdHlwZXMgb2YgdGhlIGBfWm9uZUZ1bmN0aW9uYHMgc2hvdWxkIGhhdmUgYSB0eXBlIGZvcgogIC8vIGFsbCBmaWVsZHMuCiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gX3J1bjsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcnVuVW5hcnk7CiAgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4gX3J1bkJpbmFyeTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcmVnaXN0ZXJDYWxsYmFjazsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IF9yZWdpc3RlckJpbmFyeUNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248RXJyb3JDYWxsYmFja0hhbmRsZXI+IF9lcnJvckNhbGxiYWNrOwogIF9ab25lRnVuY3Rpb248U2NoZWR1bGVNaWNyb3Rhc2tIYW5kbGVyPiBfc2NoZWR1bGVNaWNyb3Rhc2s7CiAgX1pvbmVGdW5jdGlvbjxDcmVhdGVUaW1lckhhbmRsZXI+IF9jcmVhdGVUaW1lcjsKICBfWm9uZUZ1bmN0aW9uPENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyPiBfY3JlYXRlUGVyaW9kaWNUaW1lcjsKICBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4gX3ByaW50OwogIF9ab25lRnVuY3Rpb248Rm9ya0hhbmRsZXI+IF9mb3JrOwogIF9ab25lRnVuY3Rpb248SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXI+IF9oYW5kbGVVbmNhdWdodEVycm9yOwoKICAvLyBBIGNhY2hlZCBkZWxlZ2F0ZSB0byB0aGlzIHpvbmUuCiAgWm9uZURlbGVnYXRlIF9kZWxlZ2F0ZUNhY2hlOwoKICAvLy8gVGhlIHBhcmVudCB6b25lLgogIGZpbmFsIF9ab25lIHBhcmVudDsKCiAgLy8vIFRoZSB6b25lJ3Mgc2NvcGVkIHZhbHVlIGRlY2xhcmF0aW9uIG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbHdheXMgYSBbSGFzaE1hcF0uCiAgZmluYWwgTWFwIF9tYXA7CgogIFpvbmVEZWxlZ2F0ZSBnZXQgX2RlbGVnYXRlIHsKICAgIGlmIChfZGVsZWdhdGVDYWNoZSAhPSBudWxsKSByZXR1cm4gX2RlbGVnYXRlQ2FjaGU7CiAgICBfZGVsZWdhdGVDYWNoZSA9IG5ldyBfWm9uZURlbGVnYXRlKHRoaXMpOwogICAgcmV0dXJuIF9kZWxlZ2F0ZUNhY2hlOwogIH0KCiAgX0N1c3RvbVpvbmUodGhpcy5wYXJlbnQsIFpvbmVTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sIHRoaXMuX21hcCkgewogICAgLy8gVGhlIHJvb3Qgem9uZSB3aWxsIGhhdmUgaW1wbGVtZW50YXRpb25zIG9mIGFsbCBwYXJ0cyBvZiB0aGUKICAgIC8vIHNwZWNpZmljYXRpb24sIHNvIGl0IHdpbGwgbmV2ZXIgdHJ5IHRvIGFjY2VzcyB0aGUgKG51bGwpIHBhcmVudC4KICAgIC8vIEFsbCBvdGhlciB6b25lcyBoYXZlIGEgbm9uLW51bGwgcGFyZW50LgogICAgX3J1biA9IChzcGVjaWZpY2F0aW9uLnJ1biAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KHRoaXMsIHNwZWNpZmljYXRpb24ucnVuKQogICAgICAgIDogcGFyZW50Ll9ydW47CiAgICBfcnVuVW5hcnkgPSAoc3BlY2lmaWNhdGlvbi5ydW5VbmFyeSAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KHRoaXMsIHNwZWNpZmljYXRpb24ucnVuVW5hcnkpCiAgICAgICAgOiBwYXJlbnQuX3J1blVuYXJ5OwogICAgX3J1bkJpbmFyeSA9IChzcGVjaWZpY2F0aW9uLnJ1bkJpbmFyeSAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KHRoaXMsIHNwZWNpZmljYXRpb24ucnVuQmluYXJ5KQogICAgICAgIDogcGFyZW50Ll9ydW5CaW5hcnk7CiAgICBfcmVnaXN0ZXJDYWxsYmFjayA9IChzcGVjaWZpY2F0aW9uLnJlZ2lzdGVyQ2FsbGJhY2sgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPih0aGlzLCBzcGVjaWZpY2F0aW9uLnJlZ2lzdGVyQ2FsbGJhY2spCiAgICAgICAgOiBwYXJlbnQuX3JlZ2lzdGVyQ2FsbGJhY2s7CiAgICBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrID0gKHNwZWNpZmljYXRpb24ucmVnaXN0ZXJVbmFyeUNhbGxiYWNrICE9IG51bGwpCiAgICAgICAgPyBuZXcgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4odGhpcywgc3BlY2lmaWNhdGlvbi5yZWdpc3RlclVuYXJ5Q2FsbGJhY2spCiAgICAgICAgOiBwYXJlbnQuX3JlZ2lzdGVyVW5hcnlDYWxsYmFjazsKICAgIF9yZWdpc3RlckJpbmFyeUNhbGxiYWNrID0gKHNwZWNpZmljYXRpb24ucmVnaXN0ZXJCaW5hcnlDYWxsYmFjayAhPSBudWxsKQogICAgICAgID8gbmV3IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KAogICAgICAgICAgICB0aGlzLCBzcGVjaWZpY2F0aW9uLnJlZ2lzdGVyQmluYXJ5Q2FsbGJhY2spCiAgICAgICAgOiBwYXJlbnQuX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgICBfZXJyb3JDYWxsYmFjayA9IChzcGVjaWZpY2F0aW9uLmVycm9yQ2FsbGJhY2sgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEVycm9yQ2FsbGJhY2tIYW5kbGVyPigKICAgICAgICAgICAgdGhpcywgc3BlY2lmaWNhdGlvbi5lcnJvckNhbGxiYWNrKQogICAgICAgIDogcGFyZW50Ll9lcnJvckNhbGxiYWNrOwogICAgX3NjaGVkdWxlTWljcm90YXNrID0gKHNwZWNpZmljYXRpb24uc2NoZWR1bGVNaWNyb3Rhc2sgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcj4oCiAgICAgICAgICAgIHRoaXMsIHNwZWNpZmljYXRpb24uc2NoZWR1bGVNaWNyb3Rhc2spCiAgICAgICAgOiBwYXJlbnQuX3NjaGVkdWxlTWljcm90YXNrOwogICAgX2NyZWF0ZVRpbWVyID0gKHNwZWNpZmljYXRpb24uY3JlYXRlVGltZXIgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPENyZWF0ZVRpbWVySGFuZGxlcj4odGhpcywgc3BlY2lmaWNhdGlvbi5jcmVhdGVUaW1lcikKICAgICAgICA6IHBhcmVudC5fY3JlYXRlVGltZXI7CiAgICBfY3JlYXRlUGVyaW9kaWNUaW1lciA9IChzcGVjaWZpY2F0aW9uLmNyZWF0ZVBlcmlvZGljVGltZXIgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyPigKICAgICAgICAgICAgdGhpcywgc3BlY2lmaWNhdGlvbi5jcmVhdGVQZXJpb2RpY1RpbWVyKQogICAgICAgIDogcGFyZW50Ll9jcmVhdGVQZXJpb2RpY1RpbWVyOwogICAgX3ByaW50ID0gKHNwZWNpZmljYXRpb24ucHJpbnQgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4odGhpcywgc3BlY2lmaWNhdGlvbi5wcmludCkKICAgICAgICA6IHBhcmVudC5fcHJpbnQ7CiAgICBfZm9yayA9IChzcGVjaWZpY2F0aW9uLmZvcmsgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEZvcmtIYW5kbGVyPih0aGlzLCBzcGVjaWZpY2F0aW9uLmZvcmspCiAgICAgICAgOiBwYXJlbnQuX2Zvcms7CiAgICBfaGFuZGxlVW5jYXVnaHRFcnJvciA9IChzcGVjaWZpY2F0aW9uLmhhbmRsZVVuY2F1Z2h0RXJyb3IgIT0gbnVsbCkKICAgICAgICA/IG5ldyBfWm9uZUZ1bmN0aW9uPEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyPigKICAgICAgICAgICAgdGhpcywgc3BlY2lmaWNhdGlvbi5oYW5kbGVVbmNhdWdodEVycm9yKQogICAgICAgIDogcGFyZW50Ll9oYW5kbGVVbmNhdWdodEVycm9yOwogIH0KCiAgLyoqCiAgICogVGhlIGNsb3Nlc3QgZXJyb3ItaGFuZGxpbmcgem9uZS4KICAgKgogICAqIFJldHVybnMgYHRoaXNgIGlmIGB0aGlzYCBoYXMgYW4gZXJyb3ItaGFuZGxlci4gT3RoZXJ3aXNlIHJldHVybnMgdGhlCiAgICogcGFyZW50J3MgZXJyb3Item9uZS4KICAgKi8KICBab25lIGdldCBlcnJvclpvbmUgPT4gX2hhbmRsZVVuY2F1Z2h0RXJyb3Iuem9uZTsKCiAgdm9pZCBydW5HdWFyZGVkKHZvaWQgZigpKSB7CiAgICB0cnkgewogICAgICBydW4oZik7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICB2b2lkIHJ1blVuYXJ5R3VhcmRlZDxUPih2b2lkIGYoVCBhcmcpLCBUIGFyZykgewogICAgdHJ5IHsKICAgICAgcnVuVW5hcnkoZiwgYXJnKTsKICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgaGFuZGxlVW5jYXVnaHRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIHZvaWQgcnVuQmluYXJ5R3VhcmRlZDxUMSwgVDI+KHZvaWQgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMikgewogICAgdHJ5IHsKICAgICAgcnVuQmluYXJ5KGYsIGFyZzEsIGFyZzIpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBoYW5kbGVVbmNhdWdodEVycm9yKGUsIHMpOwogICAgfQogIH0KCiAgWm9uZUNhbGxiYWNrPFI+IGJpbmRDYWxsYmFjazxSPihSIGYoKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlckNhbGxiYWNrKGYpOwogICAgcmV0dXJuICgpID0+IHRoaXMucnVuKHJlZ2lzdGVyZWQpOwogIH0KCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gYmluZFVuYXJ5Q2FsbGJhY2s8UiwgVD4oUiBmKFQgYXJnKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlclVuYXJ5Q2FsbGJhY2soZik7CiAgICByZXR1cm4gKGFyZykgPT4gdGhpcy5ydW5VbmFyeShyZWdpc3RlcmVkLCBhcmcpOwogIH0KCiAgWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gYmluZEJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgZihUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGYpOwogICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGlzLnJ1bkJpbmFyeShyZWdpc3RlcmVkLCBhcmcxLCBhcmcyKTsKICB9CgogIHZvaWQgRnVuY3Rpb24oKSBiaW5kQ2FsbGJhY2tHdWFyZGVkKHZvaWQgZigpKSB7CiAgICB2YXIgcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyQ2FsbGJhY2soZik7CiAgICByZXR1cm4gKCkgPT4gdGhpcy5ydW5HdWFyZGVkKHJlZ2lzdGVyZWQpOwogIH0KCiAgdm9pZCBGdW5jdGlvbihUKSBiaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQ8VD4odm9pZCBmKFQgYXJnKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlclVuYXJ5Q2FsbGJhY2soZik7CiAgICByZXR1cm4gKGFyZykgPT4gdGhpcy5ydW5VbmFyeUd1YXJkZWQocmVnaXN0ZXJlZCwgYXJnKTsKICB9CgogIHZvaWQgRnVuY3Rpb24oVDEsIFQyKSBiaW5kQmluYXJ5Q2FsbGJhY2tHdWFyZGVkPFQxLCBUMj4oCiAgICAgIHZvaWQgZihUMSBhcmcxLCBUMiBhcmcyKSkgewogICAgdmFyIHJlZ2lzdGVyZWQgPSByZWdpc3RlckJpbmFyeUNhbGxiYWNrKGYpOwogICAgcmV0dXJuIChhcmcxLCBhcmcyKSA9PiB0aGlzLnJ1bkJpbmFyeUd1YXJkZWQocmVnaXN0ZXJlZCwgYXJnMSwgYXJnMik7CiAgfQoKICBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICB2YXIgcmVzdWx0ID0gX21hcFtrZXldOwogICAgaWYgKHJlc3VsdCAhPSBudWxsIHx8IF9tYXAuY29udGFpbnNLZXkoa2V5KSkgcmV0dXJuIHJlc3VsdDsKICAgIC8vIElmIHdlIGFyZSBub3QgdGhlIHJvb3Qgem9uZSwgbG9vayB1cCBpbiB0aGUgcGFyZW50IHpvbmUuCiAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKICAgICAgLy8gV2UgZG8gbm90IG9wdGltaXplIGZvciByZXBlYXRlZGx5IGxvb2tpbmcgdXAgYSBrZXkgd2hpY2ggaXNuJ3QKICAgICAgLy8gdGhlcmUuIFRoYXQgd291bGQgcmVxdWlyZSBzdG9yaW5nIHRoZSBrZXkgYW5kIGtlZXBpbmcgaXQgYWxpdmUuCiAgICAgIC8vIENvcHlpbmcgdGhlIGtleS92YWx1ZSBmcm9tIHRoZSBwYXJlbnQgZG9lcyBub3Qga2VlcCBhbnkgbmV3IHZhbHVlcwogICAgICAvLyBhbGl2ZS4KICAgICAgdmFyIHZhbHVlID0gcGFyZW50W2tleV07CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgX21hcFtrZXldID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgYXNzZXJ0KHRoaXMgPT0gX3Jvb3Rab25lKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gTWV0aG9kcyB0aGF0IGNhbiBiZSBjdXN0b21pemVkIGJ5IHRoZSB6b25lIHNwZWNpZmljYXRpb24uCgogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9oYW5kbGVVbmNhdWdodEVycm9yOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoCiAgICAgICAgaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIFpvbmUgZm9yayh7Wm9uZVNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwgTWFwIHpvbmVWYWx1ZXN9KSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9mb3JrOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgRm9ya0hhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoCiAgICAgICAgaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIHNwZWNpZmljYXRpb24sIHpvbmVWYWx1ZXMpOwogIH0KCiAgUiBydW48Uj4oUiBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3J1bjsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFJ1bkhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGYpOwogIH0KCiAgUiBydW5VbmFyeTxSLCBUPihSIGYoVCBhcmcpLCBUIGFyZykgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcnVuVW5hcnk7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSdW5VbmFyeUhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGYsIGFyZyk7CiAgfQoKICBSIHJ1bkJpbmFyeTxSLCBUMSwgVDI+KFIgZihUMSBhcmcxLCBUMiBhcmcyKSwgVDEgYXJnMSwgVDIgYXJnMikgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gdGhpcy5fcnVuQmluYXJ5OwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgUnVuQmluYXJ5SGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZiwgYXJnMSwgYXJnMik7CiAgfQoKICBab25lQ2FsbGJhY2s8Uj4gcmVnaXN0ZXJDYWxsYmFjazxSPihSIGNhbGxiYWNrKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3JlZ2lzdGVyQ2FsbGJhY2s7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSZWdpc3RlckNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgY2FsbGJhY2spOwogIH0KCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gcmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KFIgY2FsbGJhY2soVCBhcmcpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9yZWdpc3RlclVuYXJ5Q2FsbGJhY2s7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBjYWxsYmFjayk7CiAgfQoKICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiByZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgIFIgY2FsbGJhY2soVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2s7CiAgICBhc3NlcnQoaW1wbGVtZW50YXRpb24gIT0gbnVsbCk7CiAgICBab25lRGVsZWdhdGUgcGFyZW50RGVsZWdhdGUgPSBfcGFyZW50RGVsZWdhdGUoaW1wbGVtZW50YXRpb24uem9uZSk7CiAgICBSZWdpc3RlckJpbmFyeUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgY2FsbGJhY2spOwogIH0KCiAgQXN5bmNFcnJvciBlcnJvckNhbGxiYWNrKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9lcnJvckNhbGxiYWNrOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgZmluYWwgWm9uZSBpbXBsZW1lbnRhdGlvblpvbmUgPSBpbXBsZW1lbnRhdGlvbi56b25lOwogICAgaWYgKGlkZW50aWNhbChpbXBsZW1lbnRhdGlvblpvbmUsIF9yb290Wm9uZSkpIHJldHVybiBudWxsOwogICAgZmluYWwgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uWm9uZSk7CiAgICBFcnJvckNhbGxiYWNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvblpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICB2b2lkIHNjaGVkdWxlTWljcm90YXNrKHZvaWQgZigpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9zY2hlZHVsZU1pY3JvdGFzazsKICAgIGFzc2VydChpbXBsZW1lbnRhdGlvbiAhPSBudWxsKTsKICAgIFpvbmVEZWxlZ2F0ZSBwYXJlbnREZWxlZ2F0ZSA9IF9wYXJlbnREZWxlZ2F0ZShpbXBsZW1lbnRhdGlvbi56b25lKTsKICAgIFNjaGVkdWxlTWljcm90YXNrSGFuZGxlciBoYW5kbGVyID0gaW1wbGVtZW50YXRpb24uZnVuY3Rpb247CiAgICByZXR1cm4gaGFuZGxlcihpbXBsZW1lbnRhdGlvbi56b25lLCBwYXJlbnREZWxlZ2F0ZSwgdGhpcywgZik7CiAgfQoKICBUaW1lciBjcmVhdGVUaW1lcihEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBmKCkpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX2NyZWF0ZVRpbWVyOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgQ3JlYXRlVGltZXJIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBkdXJhdGlvbiwgZik7CiAgfQoKICBUaW1lciBjcmVhdGVQZXJpb2RpY1RpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoVGltZXIgdGltZXIpKSB7CiAgICB2YXIgaW1wbGVtZW50YXRpb24gPSB0aGlzLl9jcmVhdGVQZXJpb2RpY1RpbWVyOwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgQ3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXIgaGFuZGxlciA9IGltcGxlbWVudGF0aW9uLmZ1bmN0aW9uOwogICAgcmV0dXJuIGhhbmRsZXIoaW1wbGVtZW50YXRpb24uem9uZSwgcGFyZW50RGVsZWdhdGUsIHRoaXMsIGR1cmF0aW9uLCBmKTsKICB9CgogIHZvaWQgcHJpbnQoU3RyaW5nIGxpbmUpIHsKICAgIHZhciBpbXBsZW1lbnRhdGlvbiA9IHRoaXMuX3ByaW50OwogICAgYXNzZXJ0KGltcGxlbWVudGF0aW9uICE9IG51bGwpOwogICAgWm9uZURlbGVnYXRlIHBhcmVudERlbGVnYXRlID0gX3BhcmVudERlbGVnYXRlKGltcGxlbWVudGF0aW9uLnpvbmUpOwogICAgUHJpbnRIYW5kbGVyIGhhbmRsZXIgPSBpbXBsZW1lbnRhdGlvbi5mdW5jdGlvbjsKICAgIHJldHVybiBoYW5kbGVyKGltcGxlbWVudGF0aW9uLnpvbmUsIHBhcmVudERlbGVnYXRlLCB0aGlzLCBsaW5lKTsKICB9Cn0KCnZvaWQgX3Jvb3RIYW5kbGVVbmNhdWdodEVycm9yKAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICBfc2NoZWR1bGVQcmlvcml0eUFzeW5jQ2FsbGJhY2soKCkgewogICAgZXJyb3IgPz89IG5ldyBOdWxsVGhyb3duRXJyb3IoKTsKICAgIGlmIChzdGFja1RyYWNlID09IG51bGwpIHRocm93IGVycm9yOwogICAgX3JldGhyb3coZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0pOwp9CgpleHRlcm5hbCB2b2lkIF9yZXRocm93KE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKTsKClIgX3Jvb3RSdW48Uj4oWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZigpKSB7CiAgaWYgKFpvbmUuX2N1cnJlbnQgPT0gem9uZSkgcmV0dXJuIGYoKTsKCiAgWm9uZSBvbGQgPSBab25lLl9lbnRlcih6b25lKTsKICB0cnkgewogICAgcmV0dXJuIGYoKTsKICB9IGZpbmFsbHkgewogICAgWm9uZS5fbGVhdmUob2xkKTsKICB9Cn0KClIgX3Jvb3RSdW5VbmFyeTxSLCBUPigKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBSIGYoVCBhcmcpLCBUIGFyZykgewogIGlmIChab25lLl9jdXJyZW50ID09IHpvbmUpIHJldHVybiBmKGFyZyk7CgogIFpvbmUgb2xkID0gWm9uZS5fZW50ZXIoem9uZSk7CiAgdHJ5IHsKICAgIHJldHVybiBmKGFyZyk7CiAgfSBmaW5hbGx5IHsKICAgIFpvbmUuX2xlYXZlKG9sZCk7CiAgfQp9CgpSIF9yb290UnVuQmluYXJ5PFIsIFQxLCBUMj4oWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsCiAgICBSIGYoVDEgYXJnMSwgVDIgYXJnMiksIFQxIGFyZzEsIFQyIGFyZzIpIHsKICBpZiAoWm9uZS5fY3VycmVudCA9PSB6b25lKSByZXR1cm4gZihhcmcxLCBhcmcyKTsKCiAgWm9uZSBvbGQgPSBab25lLl9lbnRlcih6b25lKTsKICB0cnkgewogICAgcmV0dXJuIGYoYXJnMSwgYXJnMik7CiAgfSBmaW5hbGx5IHsKICAgIFpvbmUuX2xlYXZlKG9sZCk7CiAgfQp9Cgpab25lQ2FsbGJhY2s8Uj4gX3Jvb3RSZWdpc3RlckNhbGxiYWNrPFI+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZigpKSB7CiAgcmV0dXJuIGY7Cn0KClpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IF9yb290UmVnaXN0ZXJVbmFyeUNhbGxiYWNrPFIsIFQ+KAogICAgWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsIFIgZihUIGFyZykpIHsKICByZXR1cm4gZjsKfQoKWm9uZUJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4gX3Jvb3RSZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICBab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwgUiBmKFQxIGFyZzEsIFQyIGFyZzIpKSB7CiAgcmV0dXJuIGY7Cn0KCkFzeW5jRXJyb3IgX3Jvb3RFcnJvckNhbGxiYWNrKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgICAgIE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSA9PgogICAgbnVsbDsKCnZvaWQgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzaygKICAgIFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCB2b2lkIGYoKSkgewogIGlmICghaWRlbnRpY2FsKF9yb290Wm9uZSwgem9uZSkpIHsKICAgIGJvb2wgaGFzRXJyb3JIYW5kbGVyID0gIV9yb290Wm9uZS5pblNhbWVFcnJvclpvbmUoem9uZSk7CiAgICBpZiAoaGFzRXJyb3JIYW5kbGVyKSB7CiAgICAgIGYgPSB6b25lLmJpbmRDYWxsYmFja0d1YXJkZWQoZik7CiAgICB9IGVsc2UgewogICAgICBmID0gem9uZS5iaW5kQ2FsbGJhY2soZik7CiAgICB9CiAgICAvLyBVc2Ugcm9vdCB6b25lIGFzIGV2ZW50IHpvbmUgaWYgdGhlIGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAgICB6b25lID0gX3Jvb3Rab25lOwogIH0KICBfc2NoZWR1bGVBc3luY0NhbGxiYWNrKGYpOwp9CgpUaW1lciBfcm9vdENyZWF0ZVRpbWVyKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLAogICAgRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soKSkgewogIGlmICghaWRlbnRpY2FsKF9yb290Wm9uZSwgem9uZSkpIHsKICAgIGNhbGxiYWNrID0gem9uZS5iaW5kQ2FsbGJhY2soY2FsbGJhY2spOwogIH0KICByZXR1cm4gVGltZXIuX2NyZWF0ZVRpbWVyKGR1cmF0aW9uLCBjYWxsYmFjayk7Cn0KClRpbWVyIF9yb290Q3JlYXRlUGVyaW9kaWNUaW1lcihab25lIHNlbGYsIFpvbmVEZWxlZ2F0ZSBwYXJlbnQsIFpvbmUgem9uZSwKICAgIER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSkgewogIGlmICghaWRlbnRpY2FsKF9yb290Wm9uZSwgem9uZSkpIHsKICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlICd2b2lkJy4KICAgIGNhbGxiYWNrID0gem9uZS5iaW5kVW5hcnlDYWxsYmFjazxkeW5hbWljLCBUaW1lcj4oY2FsbGJhY2spOwogIH0KICByZXR1cm4gVGltZXIuX2NyZWF0ZVBlcmlvZGljVGltZXIoZHVyYXRpb24sIGNhbGxiYWNrKTsKfQoKdm9pZCBfcm9vdFByaW50KFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwgWm9uZSB6b25lLCBTdHJpbmcgbGluZSkgewogIHByaW50VG9Db25zb2xlKGxpbmUpOwp9Cgp2b2lkIF9wcmludFRvWm9uZShTdHJpbmcgbGluZSkgewogIFpvbmUuY3VycmVudC5wcmludChsaW5lKTsKfQoKWm9uZSBfcm9vdEZvcmsoWm9uZSBzZWxmLCBab25lRGVsZWdhdGUgcGFyZW50LCBab25lIHpvbmUsCiAgICBab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlcykgewogIC8vIFRPRE8oZmxvaXRzY2gpOiBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGdldCByaWQgb2YgdGhpcyBoYWNrLgogIC8vIENoYW5nZSB0aGUgc3RhdGljIHpvbmVPckRpcmVjdFByaW50IGZ1bmN0aW9uIHRvIGdvIHRocm91Z2ggem9uZXMKICAvLyBmcm9tIG5vdyBvbi4KICBwcmludFRvWm9uZSA9IF9wcmludFRvWm9uZTsKCiAgaWYgKHNwZWNpZmljYXRpb24gPT0gbnVsbCkgewogICAgc3BlY2lmaWNhdGlvbiA9IGNvbnN0IFpvbmVTcGVjaWZpY2F0aW9uKCk7CiAgfSBlbHNlIGlmIChzcGVjaWZpY2F0aW9uIGlzISBfWm9uZVNwZWNpZmljYXRpb24pIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJab25lU3BlY2lmaWNhdGlvbnMgbXVzdCBiZSBpbnN0YW50aWF0ZWQiCiAgICAgICAgIiB3aXRoIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3Rvci4iKTsKICB9CiAgTWFwIHZhbHVlTWFwOwogIGlmICh6b25lVmFsdWVzID09IG51bGwpIHsKICAgIGlmICh6b25lIGlzIF9ab25lKSB7CiAgICAgIHZhbHVlTWFwID0gem9uZS5fbWFwOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVNYXAgPSBuZXcgSGFzaE1hcCgpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YWx1ZU1hcCA9IG5ldyBIYXNoTWFwLmZyb20oem9uZVZhbHVlcyk7CiAgfQogIHJldHVybiBuZXcgX0N1c3RvbVpvbmUoem9uZSwgc3BlY2lmaWNhdGlvbiwgdmFsdWVNYXApOwp9CgpjbGFzcyBfUm9vdFpvbmUgZXh0ZW5kcyBfWm9uZSB7CiAgY29uc3QgX1Jvb3Rab25lKCk7CgogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KF9yb290Wm9uZSwgX3Jvb3RSdW4pOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcnVuVW5hcnkgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4oX3Jvb3Rab25lLCBfcm9vdFJ1blVuYXJ5KTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBnZXQgX3J1bkJpbmFyeSA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPihfcm9vdFpvbmUsIF9yb290UnVuQmluYXJ5KTsKICBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPiBnZXQgX3JlZ2lzdGVyQ2FsbGJhY2sgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGdW5jdGlvbj4oX3Jvb3Rab25lLCBfcm9vdFJlZ2lzdGVyQ2FsbGJhY2spOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RnVuY3Rpb24+KF9yb290Wm9uZSwgX3Jvb3RSZWdpc3RlclVuYXJ5Q2FsbGJhY2spOwogIF9ab25lRnVuY3Rpb248RnVuY3Rpb24+IGdldCBfcmVnaXN0ZXJCaW5hcnlDYWxsYmFjayA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEZ1bmN0aW9uPihfcm9vdFpvbmUsIF9yb290UmVnaXN0ZXJCaW5hcnlDYWxsYmFjayk7CiAgX1pvbmVGdW5jdGlvbjxFcnJvckNhbGxiYWNrSGFuZGxlcj4gZ2V0IF9lcnJvckNhbGxiYWNrID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248RXJyb3JDYWxsYmFja0hhbmRsZXI+KF9yb290Wm9uZSwgX3Jvb3RFcnJvckNhbGxiYWNrKTsKICBfWm9uZUZ1bmN0aW9uPFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcj4gZ2V0IF9zY2hlZHVsZU1pY3JvdGFzayA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPFNjaGVkdWxlTWljcm90YXNrSGFuZGxlcj4oCiAgICAgICAgICBfcm9vdFpvbmUsIF9yb290U2NoZWR1bGVNaWNyb3Rhc2spOwogIF9ab25lRnVuY3Rpb248Q3JlYXRlVGltZXJIYW5kbGVyPiBnZXQgX2NyZWF0ZVRpbWVyID0+CiAgICAgIGNvbnN0IF9ab25lRnVuY3Rpb248Q3JlYXRlVGltZXJIYW5kbGVyPihfcm9vdFpvbmUsIF9yb290Q3JlYXRlVGltZXIpOwogIF9ab25lRnVuY3Rpb248Q3JlYXRlUGVyaW9kaWNUaW1lckhhbmRsZXI+IGdldCBfY3JlYXRlUGVyaW9kaWNUaW1lciA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPENyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyPigKICAgICAgICAgIF9yb290Wm9uZSwgX3Jvb3RDcmVhdGVQZXJpb2RpY1RpbWVyKTsKICBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4gZ2V0IF9wcmludCA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPFByaW50SGFuZGxlcj4oX3Jvb3Rab25lLCBfcm9vdFByaW50KTsKICBfWm9uZUZ1bmN0aW9uPEZvcmtIYW5kbGVyPiBnZXQgX2ZvcmsgPT4KICAgICAgY29uc3QgX1pvbmVGdW5jdGlvbjxGb3JrSGFuZGxlcj4oX3Jvb3Rab25lLCBfcm9vdEZvcmspOwogIF9ab25lRnVuY3Rpb248SGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXI+IGdldCBfaGFuZGxlVW5jYXVnaHRFcnJvciA9PgogICAgICBjb25zdCBfWm9uZUZ1bmN0aW9uPEhhbmRsZVVuY2F1Z2h0RXJyb3JIYW5kbGVyPigKICAgICAgICAgIF9yb290Wm9uZSwgX3Jvb3RIYW5kbGVVbmNhdWdodEVycm9yKTsKCiAgLy8gVGhlIHBhcmVudCB6b25lLgogIF9ab25lIGdldCBwYXJlbnQgPT4gbnVsbDsKCiAgLy8vIFRoZSB6b25lJ3Mgc2NvcGVkIHZhbHVlIGRlY2xhcmF0aW9uIG1hcC4KICAvLy8KICAvLy8gVGhpcyBpcyBhbHdheXMgYSBbSGFzaE1hcF0uCiAgTWFwIGdldCBfbWFwID0+IF9yb290TWFwOwoKICBzdGF0aWMgZmluYWwgX3Jvb3RNYXAgPSBuZXcgSGFzaE1hcCgpOwoKICBzdGF0aWMgWm9uZURlbGVnYXRlIF9yb290RGVsZWdhdGU7CgogIFpvbmVEZWxlZ2F0ZSBnZXQgX2RlbGVnYXRlIHsKICAgIGlmIChfcm9vdERlbGVnYXRlICE9IG51bGwpIHJldHVybiBfcm9vdERlbGVnYXRlOwogICAgcmV0dXJuIF9yb290RGVsZWdhdGUgPSBuZXcgX1pvbmVEZWxlZ2F0ZSh0aGlzKTsKICB9CgogIC8qKgogICAqIFRoZSBjbG9zZXN0IGVycm9yLWhhbmRsaW5nIHpvbmUuCiAgICoKICAgKiBSZXR1cm5zIGB0aGlzYCBpZiBgdGhpc2AgaGFzIGFuIGVycm9yLWhhbmRsZXIuIE90aGVyd2lzZSByZXR1cm5zIHRoZQogICAqIHBhcmVudCdzIGVycm9yLXpvbmUuCiAgICovCiAgWm9uZSBnZXQgZXJyb3Jab25lID0+IHRoaXM7CgogIC8vIFpvbmUgaW50ZXJmYWNlLgoKICB2b2lkIHJ1bkd1YXJkZWQodm9pZCBmKCkpIHsKICAgIHRyeSB7CiAgICAgIGlmIChpZGVudGljYWwoX3Jvb3Rab25lLCBab25lLl9jdXJyZW50KSkgewogICAgICAgIGYoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX3Jvb3RSdW4obnVsbCwgbnVsbCwgdGhpcywgZik7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICB2b2lkIHJ1blVuYXJ5R3VhcmRlZDxUPih2b2lkIGYoVCBhcmcpLCBUIGFyZykgewogICAgdHJ5IHsKICAgICAgaWYgKGlkZW50aWNhbChfcm9vdFpvbmUsIFpvbmUuX2N1cnJlbnQpKSB7CiAgICAgICAgZihhcmcpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfcm9vdFJ1blVuYXJ5KG51bGwsIG51bGwsIHRoaXMsIGYsIGFyZyk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3IoZSwgcyk7CiAgICB9CiAgfQoKICB2b2lkIHJ1bkJpbmFyeUd1YXJkZWQ8VDEsIFQyPih2b2lkIGYoVDEgYXJnMSwgVDIgYXJnMiksIFQxIGFyZzEsIFQyIGFyZzIpIHsKICAgIHRyeSB7CiAgICAgIGlmIChpZGVudGljYWwoX3Jvb3Rab25lLCBab25lLl9jdXJyZW50KSkgewogICAgICAgIGYoYXJnMSwgYXJnMik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9yb290UnVuQmluYXJ5KG51bGwsIG51bGwsIHRoaXMsIGYsIGFyZzEsIGFyZzIpOwogICAgfSBjYXRjaCAoZSwgcykgewogICAgICBoYW5kbGVVbmNhdWdodEVycm9yKGUsIHMpOwogICAgfQogIH0KCiAgWm9uZUNhbGxiYWNrPFI+IGJpbmRDYWxsYmFjazxSPihSIGYoKSkgewogICAgcmV0dXJuICgpID0+IHRoaXMucnVuPFI+KGYpOwogIH0KCiAgWm9uZVVuYXJ5Q2FsbGJhY2s8UiwgVD4gYmluZFVuYXJ5Q2FsbGJhY2s8UiwgVD4oUiBmKFQgYXJnKSkgewogICAgcmV0dXJuIChhcmcpID0+IHRoaXMucnVuVW5hcnk8UiwgVD4oZiwgYXJnKTsKICB9CgogIFpvbmVCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+IGJpbmRCaW5hcnlDYWxsYmFjazxSLCBUMSwgVDI+KAogICAgICBSIGYoVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpcy5ydW5CaW5hcnk8UiwgVDEsIFQyPihmLCBhcmcxLCBhcmcyKTsKICB9CgogIHZvaWQgRnVuY3Rpb24oKSBiaW5kQ2FsbGJhY2tHdWFyZGVkKHZvaWQgZigpKSB7CiAgICByZXR1cm4gKCkgPT4gdGhpcy5ydW5HdWFyZGVkKGYpOwogIH0KCiAgdm9pZCBGdW5jdGlvbihUKSBiaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQ8VD4odm9pZCBmKFQgYXJnKSkgewogICAgcmV0dXJuIChhcmcpID0+IHRoaXMucnVuVW5hcnlHdWFyZGVkKGYsIGFyZyk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKFQxLCBUMikgYmluZEJpbmFyeUNhbGxiYWNrR3VhcmRlZDxUMSwgVDI+KAogICAgICB2b2lkIGYoVDEgYXJnMSwgVDIgYXJnMikpIHsKICAgIHJldHVybiAoYXJnMSwgYXJnMikgPT4gdGhpcy5ydW5CaW5hcnlHdWFyZGVkKGYsIGFyZzEsIGFyZzIpOwogIH0KCiAgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gbnVsbDsKCiAgLy8gTWV0aG9kcyB0aGF0IGNhbiBiZSBjdXN0b21pemVkIGJ5IHRoZSB6b25lIHNwZWNpZmljYXRpb24uCgogIHZvaWQgaGFuZGxlVW5jYXVnaHRFcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICBfcm9vdEhhbmRsZVVuY2F1Z2h0RXJyb3IobnVsbCwgbnVsbCwgdGhpcywgZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgWm9uZSBmb3JrKHtab25lU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLCBNYXAgem9uZVZhbHVlc30pIHsKICAgIHJldHVybiBfcm9vdEZvcmsobnVsbCwgbnVsbCwgdGhpcywgc3BlY2lmaWNhdGlvbiwgem9uZVZhbHVlcyk7CiAgfQoKICBSIHJ1bjxSPihSIGYoKSkgewogICAgaWYgKGlkZW50aWNhbChab25lLl9jdXJyZW50LCBfcm9vdFpvbmUpKSByZXR1cm4gZigpOwogICAgcmV0dXJuIF9yb290UnVuKG51bGwsIG51bGwsIHRoaXMsIGYpOwogIH0KCiAgUiBydW5VbmFyeTxSLCBUPihSIGYoVCBhcmcpLCBUIGFyZykgewogICAgaWYgKGlkZW50aWNhbChab25lLl9jdXJyZW50LCBfcm9vdFpvbmUpKSByZXR1cm4gZihhcmcpOwogICAgcmV0dXJuIF9yb290UnVuVW5hcnkobnVsbCwgbnVsbCwgdGhpcywgZiwgYXJnKTsKICB9CgogIFIgcnVuQmluYXJ5PFIsIFQxLCBUMj4oUiBmKFQxIGFyZzEsIFQyIGFyZzIpLCBUMSBhcmcxLCBUMiBhcmcyKSB7CiAgICBpZiAoaWRlbnRpY2FsKFpvbmUuX2N1cnJlbnQsIF9yb290Wm9uZSkpIHJldHVybiBmKGFyZzEsIGFyZzIpOwogICAgcmV0dXJuIF9yb290UnVuQmluYXJ5KG51bGwsIG51bGwsIHRoaXMsIGYsIGFyZzEsIGFyZzIpOwogIH0KCiAgWm9uZUNhbGxiYWNrPFI+IHJlZ2lzdGVyQ2FsbGJhY2s8Uj4oUiBmKCkpID0+IGY7CgogIFpvbmVVbmFyeUNhbGxiYWNrPFIsIFQ+IHJlZ2lzdGVyVW5hcnlDYWxsYmFjazxSLCBUPihSIGYoVCBhcmcpKSA9PiBmOwoKICBab25lQmluYXJ5Q2FsbGJhY2s8UiwgVDEsIFQyPiByZWdpc3RlckJpbmFyeUNhbGxiYWNrPFIsIFQxLCBUMj4oCiAgICAgICAgICBSIGYoVDEgYXJnMSwgVDIgYXJnMikpID0+CiAgICAgIGY7CgogIEFzeW5jRXJyb3IgZXJyb3JDYWxsYmFjayhPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgPT4gbnVsbDsKCiAgdm9pZCBzY2hlZHVsZU1pY3JvdGFzayh2b2lkIGYoKSkgewogICAgX3Jvb3RTY2hlZHVsZU1pY3JvdGFzayhudWxsLCBudWxsLCB0aGlzLCBmKTsKICB9CgogIFRpbWVyIGNyZWF0ZVRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoKSkgewogICAgcmV0dXJuIFRpbWVyLl9jcmVhdGVUaW1lcihkdXJhdGlvbiwgZik7CiAgfQoKICBUaW1lciBjcmVhdGVQZXJpb2RpY1RpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGYoVGltZXIgdGltZXIpKSB7CiAgICByZXR1cm4gVGltZXIuX2NyZWF0ZVBlcmlvZGljVGltZXIoZHVyYXRpb24sIGYpOwogIH0KCiAgdm9pZCBwcmludChTdHJpbmcgbGluZSkgewogICAgcHJpbnRUb0NvbnNvbGUobGluZSk7CiAgfQp9Cgpjb25zdCBfcm9vdFpvbmUgPSBjb25zdCBfUm9vdFpvbmUoKTsKCi8qKgogKiBSdW5zIFtib2R5XSBpbiBpdHMgb3duIHpvbmUuCiAqCiAqIENyZWF0ZXMgYSBuZXcgem9uZSB1c2luZyBbWm9uZS5mb3JrXSBiYXNlZCBvbiBbem9uZVNwZWNpZmljYXRpb25dIGFuZAogKiBbem9uZVZhbHVlc10sIHRoZW4gcnVucyBbYm9keV0gaW4gdGhhdCB6b25lIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCiAqCiAqIElmIFtvbkVycm9yXSBpcyBwcm92aWRlZCwgaXQgbXVzdCBoYXZlIG9uZSBvZiB0aGUgdHlwZXMKICogKiBgdm9pZCBGdW5jdGlvbihPYmplY3QpYAogKiAqIGB2b2lkIEZ1bmN0aW9uKE9iamVjdCwgU3RhY2tUcmFjZSlgCiAqIGFuZCB0aGUgW29uRXJyb3JdIGhhbmRsZXIgaXMgdXNlZCAqYm90aCogdG8gaGFuZGxlIGFzeW5jaHJvbm91cyBlcnJvcnMKICogYnkgb3ZlcnJpZGluZyBbWm9uZVNwZWNpZmljYXRpb24uaGFuZGxlVW5jYXVnaHRFcnJvcl0gaW4gW3pvbmVTcGVjaWZpY2F0aW9uXSwKICogaWYgYW55LCAqYW5kKiB0byBoYW5kbGUgZXJyb3JzIHRocm93biBzeW5jaHJvbm91c2x5IGJ5IHRoZSBjYWxsIHRvIFtib2R5XS4KICoKICogSWYgYW4gZXJyb3Igb2NjdXJzIHN5bmNocm9ub3VzbHkgaW4gW2JvZHldLAogKiB0aGVuIHRocm93aW5nIGluIHRoZSBbb25FcnJvcl0gaGFuZGxlcgogKiBtYWtlcyB0aGUgY2FsbCB0byBgcnVuWm9uZWAgdGhyb3cgdGhhdCBlcnJvciwKICogYW5kIG90aGVyd2lzZSB0aGUgY2FsbCB0byBgcnVuWm9uZWRgIHJldHVybnMgYG51bGxgLgogKgogKiBJZiB0aGUgem9uZSBzcGVjaWZpY2F0aW9uIGhhcyBhIGBoYW5kbGVVbmNhdWdodEVycm9yYCB2YWx1ZSBvciB0aGUgW29uRXJyb3JdCiAqIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgdGhlIHpvbmUgYmVjb21lcyBhbiBlcnJvci16b25lLgogKgogKiBFcnJvcnMgd2lsbCBuZXZlciBjcm9zcyBlcnJvci16b25lIGJvdW5kYXJpZXMgYnkgdGhlbXNlbHZlcy4KICogRXJyb3JzIHRoYXQgdHJ5IHRvIGNyb3NzIGVycm9yLXpvbmUgYm91bmRhcmllcyBhcmUgY29uc2lkZXJlZCB1bmNhdWdodCBpbgogKiB0aGVpciBvcmlnaW5hdGluZyBlcnJvciB6b25lLgogKgogKiAgICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmUudmFsdWUoNDk5KTsKICogICAgIHJ1blpvbmVkKCgpIHsKICogICAgICAgdmFyIGZ1dHVyZTIgPSBmdXR1cmUudGhlbigoXykgeyB0aHJvdyAiZXJyb3IgaW4gZmlyc3QgZXJyb3Item9uZSI7IH0pOwogKiAgICAgICBydW5ab25lZCgoKSB7CiAqICAgICAgICAgdmFyIGZ1dHVyZTMgPSBmdXR1cmUyLmNhdGNoRXJyb3IoKGUpIHsgcHJpbnQoIk5ldmVyIHJlYWNoZWQhIik7IH0pOwogKiAgICAgICB9LCBvbkVycm9yOiAoZSkgeyBwcmludCgidW51c2VkIGVycm9yIGhhbmRsZXIiKTsgfSk7CiAqICAgICB9LCBvbkVycm9yOiAoZSkgeyBwcmludCgiY2F0Y2hlcyBlcnJvciBvZiBmaXJzdCBlcnJvci16b25lLiIpOyB9KTsKICoKICogRXhhbXBsZToKICoKICogICAgIHJ1blpvbmVkKCgpIHsKICogICAgICAgbmV3IEZ1dHVyZSgoKSB7IHRocm93ICJhc3luY2hyb25vdXMgZXJyb3IiOyB9KTsKICogICAgIH0sIG9uRXJyb3I6IHByaW50KTsgIC8vIFdpbGwgcHJpbnQgImFzeW5jaHJvbm91cyBlcnJvciIuCiAqCiAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHBhc3MgYW4gZXJyb3IgZnJvbSBvbmUgZXJyb3Igem9uZSB0byBhbm90aGVyCiAqIGJ5IHJlLXRocm93aW5nIGl0IGluIHRoZSBuZXcgem9uZS4gSWYgW29uRXJyb3JdIHRocm93cywgdGhhdCBlcnJvciB3aWxsCiAqIG9jY3VyIGluIHRoZSBvcmlnaW5hbCB6b25lIHdoZXJlIFtydW5ab25lZF0gd2FzIGNhbGxlZC4KICovClIgcnVuWm9uZWQ8Uj4oUiBib2R5KCksCiAgICB7TWFwIHpvbmVWYWx1ZXMsIFpvbmVTcGVjaWZpY2F0aW9uIHpvbmVTcGVjaWZpY2F0aW9uLCBGdW5jdGlvbiBvbkVycm9yfSkgewogIGlmIChvbkVycm9yID09IG51bGwpIHsKICAgIHJldHVybiBfcnVuWm9uZWQ8Uj4oYm9keSwgem9uZVZhbHVlcywgem9uZVNwZWNpZmljYXRpb24pOwogIH0KICB2b2lkIEZ1bmN0aW9uKE9iamVjdCkgdW5hcnlPbkVycm9yOwogIHZvaWQgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSBiaW5hcnlPbkVycm9yOwogIGlmIChvbkVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0LCBTdGFja1RyYWNlKSkgewogICAgYmluYXJ5T25FcnJvciA9IG9uRXJyb3I7CiAgfSBlbHNlIGlmIChvbkVycm9yIGlzIHZvaWQgRnVuY3Rpb24oT2JqZWN0KSkgewogICAgdW5hcnlPbkVycm9yID0gb25FcnJvcjsKICB9IGVsc2UgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIm9uRXJyb3IgY2FsbGJhY2sgbXVzdCB0YWtlIGVpdGhlciBhbiBPYmplY3QgIgogICAgICAgICIodGhlIGVycm9yKSwgb3IgYm90aCBhbiBPYmplY3QgKHRoZSBlcnJvcikgYW5kIGEgU3RhY2tUcmFjZS4iKTsKICB9CiAgSGFuZGxlVW5jYXVnaHRFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gKFpvbmUgc2VsZiwgWm9uZURlbGVnYXRlIHBhcmVudCwKICAgICAgWm9uZSB6b25lLCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICB0cnkgewogICAgICBpZiAoYmluYXJ5T25FcnJvciAhPSBudWxsKSB7CiAgICAgICAgc2VsZi5wYXJlbnQucnVuQmluYXJ5KGJpbmFyeU9uRXJyb3IsIGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQodW5hcnlPbkVycm9yICE9IG51bGwpOwogICAgICAgIHNlbGYucGFyZW50LnJ1blVuYXJ5KHVuYXJ5T25FcnJvciwgZXJyb3IpOwogICAgICB9CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGlmIChpZGVudGljYWwoZSwgZXJyb3IpKSB7CiAgICAgICAgcGFyZW50LmhhbmRsZVVuY2F1Z2h0RXJyb3Ioem9uZSwgZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHBhcmVudC5oYW5kbGVVbmNhdWdodEVycm9yKHpvbmUsIGUsIHMpOwogICAgICB9CiAgICB9CiAgfTsKICBpZiAoem9uZVNwZWNpZmljYXRpb24gPT0gbnVsbCkgewogICAgem9uZVNwZWNpZmljYXRpb24gPQogICAgICAgIG5ldyBab25lU3BlY2lmaWNhdGlvbihoYW5kbGVVbmNhdWdodEVycm9yOiBlcnJvckhhbmRsZXIpOwogIH0gZWxzZSB7CiAgICB6b25lU3BlY2lmaWNhdGlvbiA9IG5ldyBab25lU3BlY2lmaWNhdGlvbi5mcm9tKHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIGhhbmRsZVVuY2F1Z2h0RXJyb3I6IGVycm9ySGFuZGxlcik7CiAgfQogIHRyeSB7CiAgICByZXR1cm4gX3J1blpvbmVkPFI+KGJvZHksIHpvbmVWYWx1ZXMsIHpvbmVTcGVjaWZpY2F0aW9uKTsKICB9IGNhdGNoIChlLCBzdGFja1RyYWNlKSB7CiAgICBpZiAoYmluYXJ5T25FcnJvciAhPSBudWxsKSB7CiAgICAgIGJpbmFyeU9uRXJyb3IoZSwgc3RhY2tUcmFjZSk7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQodW5hcnlPbkVycm9yICE9IG51bGwpOwogICAgICB1bmFyeU9uRXJyb3IoZSk7CiAgICB9CiAgfQogIHJldHVybiBudWxsOwp9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dDBvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2FzeW5jX3BhdGNoLmRhcnSoRi8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDphc3luYyIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzIHVzZWQKLy8vIGJ5IHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhIHNoYXJlZAovLy8gZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBWTUxpYnJhcnlIb29rcywgcGF0Y2g7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAiZGVmZXJyZWRfbG9hZF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic2NoZWR1bGVfbWljcm90YXNrX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ0aW1lcl9wYXRjaC5kYXJ0IjsKCi8vIEVxdWl2YWxlbnQgb2YgY2FsbGluZyBGQVRBTCBmcm9tIEMrKyBjb2RlLgpfZmF0YWwobXNnKSBuYXRpdmUgIkRhcnRBc3luY19mYXRhbCI7CgpjbGFzcyBfQXN5bmNBd2FpdENvbXBsZXRlcjxUPiBpbXBsZW1lbnRzIENvbXBsZXRlcjxUPiB7CiAgZmluYWwgX2NvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VD4uc3luYygpOwogIGJvb2wgaXNTeW5jOwoKICBfQXN5bmNBd2FpdENvbXBsZXRlcigpIDogaXNTeW5jID0gZmFsc2U7CgogIHZvaWQgY29tcGxldGUoW0Z1dHVyZU9yPFQ+IHZhbHVlXSkgewogICAgaWYgKGlzU3luYykgewogICAgICBfY29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgRnV0dXJlPFQ+KSB7CiAgICAgIHZhbHVlLnRoZW4oX2NvbXBsZXRlci5jb21wbGV0ZSwgb25FcnJvcjogX2NvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjaGVkdWxlTWljcm90YXNrKCgpIHsKICAgICAgICBfY29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2b2lkIGNvbXBsZXRlRXJyb3IoZSwgW3N0XSkgewogICAgaWYgKGlzU3luYykgewogICAgICBfY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZSwgc3QpOwogICAgfSBlbHNlIHsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgIF9jb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzdCk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgdm9pZCBzdGFydChmKSB7CiAgICBmKCk7CiAgICBpc1N5bmMgPSB0cnVlOwogIH0KCiAgRnV0dXJlPFQ+IGdldCBmdXR1cmUgPT4gX2NvbXBsZXRlci5mdXR1cmU7CiAgYm9vbCBnZXQgaXNDb21wbGV0ZWQgPT4gX2NvbXBsZXRlci5pc0NvbXBsZXRlZDsKfQoKLy8gV2UgbmVlZCB0byBwYXNzIHRoZSB2YWx1ZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgbGVhdmUgdGhlIHNlY29uZCBhbmQgdGhpcmQKLy8gYXJndW1lbnRzIGVtcHR5ICh1c2VkIGZvciBlcnJvciBoYW5kbGluZykuCi8vIFNlZSB2bS9hc3RfdHJhbnNmb3JtZXIuY2MgZm9yIHVzYWdlLgpGdW5jdGlvbiBfYXN5bmNUaGVuV3JhcHBlckhlbHBlcihjb250aW51YXRpb24pIHsKICAvLyBBbnkgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIGFzIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBtdXN0IGJlIHJlZ2lzdGVyZWQKICAvLyBpbiB0aGUgY3VycmVudCBab25lLiBOb3JtYWxseSwgdGhpcyBpcyBkb25lIGJ5IHRoZSBmdXR1cmUgd2hlbiBhCiAgLy8gY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCAoZm9yIGV4YW1wbGUgd2l0aCBgLnRoZW5gIG9yIGAuY2F0Y2hFcnJvcmApLiBJbiBvdXIKICAvLyBjYXNlIHdlIHdhbnQgdG8gcmV1c2UgdGhlIHNhbWUgY2FsbGJhY2sgbXVsdGlwbGUgdGltZXMgYW5kIHRoZXJlZm9yZSBhdm9pZAogIC8vIHRoZSBtdWx0aXBsZSByZWdpc3RyYXRpb25zLiBGb3Igb3VyIGludGVybmFsIGZ1dHVyZXMgKGBfRnV0dXJlYCkgd2UgY2FuCiAgLy8gdXNlIHRoZSBzaG9ydGN1dC12ZXJzaW9uIG9mIGAudGhlbmAsIGFuZCBza2lwIHRoZSByZWdpc3RyYXRpb24uIEhvd2V2ZXIsCiAgLy8gdGhhdCBtZWFucyB0aGF0IHRoZSBjb250aW51YXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGJ5IHVzLgogIC8vCiAgLy8gRnVydGhlcm1vcmUsIHdlIGtub3cgdGhhdCB0aGUgcm9vdC16b25lIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYW5kCiAgLy8gd2UgY2FuIHRoZXJlZm9yZSBza2lwIHRoZSByZWdpc3RyYXRpb24gY2FsbCBmb3IgaXQuCiAgLy8KICAvLyBOb3RlLCB0aGF0IHRoZSBjb250aW51YXRpb24gYWNjZXB0cyB1cCB0byB0aHJlZSBhcmd1bWVudHMuIElmIHRoZSBjdXJyZW50CiAgLy8gem9uZSBpcyB0aGUgcm9vdCB6b25lLCB3ZSBkb24ndCB3cmFwIHRoZSBjb250aW51YXRpb24sIGFuZCBhIGJhZAogIC8vIGBGdXR1cmVgIGltcGxlbWVudGF0aW9uIGNvdWxkIHBvdGVudGlhbGx5IGludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCB0aGUKICAvLyB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLgogIGlmIChab25lLmN1cnJlbnQgPT0gWm9uZS5yb290KSByZXR1cm4gY29udGludWF0aW9uOwogIHJldHVybiBab25lLmN1cnJlbnQucmVnaXN0ZXJVbmFyeUNhbGxiYWNrKCh4KSA9PiBjb250aW51YXRpb24oeCwgbnVsbCwgbnVsbCkpOwp9CgovLyBXZSBuZWVkIHRvIHBhc3MgdGhlIGV4Y2VwdGlvbiBhbmQgc3RhY2sgdHJhY2Ugb2JqZWN0cyBhcyBzZWNvbmQgYW5kIHRoaXJkCi8vIHBhcmFtZXRlciB0byB0aGUgY29udGludWF0aW9uLiAgU2VlIHZtL2FzdF90cmFuc2Zvcm1lci5jYyBmb3IgdXNhZ2UuCkZ1bmN0aW9uIF9hc3luY0Vycm9yV3JhcHBlckhlbHBlcihjb250aW51YXRpb24pIHsKICAvLyBTZWUgY29tbWVudHMgb2YgYF9hc3luY1RoZW5XcmFwcGVySGVscGVyYC4KICB2YXIgZXJyb3JDYWxsYmFjayA9IChlLCBzKSA9PiBjb250aW51YXRpb24obnVsbCwgZSwgcyk7CiAgaWYgKFpvbmUuY3VycmVudCA9PSBab25lLnJvb3QpIHJldHVybiBlcnJvckNhbGxiYWNrOwogIHJldHVybiBab25lLmN1cnJlbnQucmVnaXN0ZXJCaW5hcnlDYWxsYmFjayhlcnJvckNhbGxiYWNrKTsKfQoKLy8vIFJlZ2lzdGVycyB0aGUgW3RoZW5DYWxsYmFja10gYW5kIFtlcnJvckNhbGxiYWNrXSBvbiB0aGUgZ2l2ZW4gW29iamVjdF0uCi8vLwovLy8gSWYgW29iamVjdF0gaXMgbm90IGEgZnV0dXJlLCB0aGVuIGl0IGlzIHdyYXBwZWQgaW50byBvbmUuCi8vLwovLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJlZ2lzdGVyaW5nIHdpdGggYC50aGVuYC4KRnV0dXJlIF9hd2FpdEhlbHBlcigKICAgIHZhciBvYmplY3QsIEZ1bmN0aW9uIHRoZW5DYWxsYmFjaywgRnVuY3Rpb24gZXJyb3JDYWxsYmFjaywgdmFyIGF3YWl0ZXIpIHsKICBpZiAob2JqZWN0IGlzISBGdXR1cmUpIHsKICAgIG9iamVjdCA9IG5ldyBfRnV0dXJlKCkuLl9zZXRWYWx1ZShvYmplY3QpOwogIH0gZWxzZSBpZiAob2JqZWN0IGlzISBfRnV0dXJlKSB7CiAgICByZXR1cm4gb2JqZWN0LnRoZW4odGhlbkNhbGxiYWNrLCBvbkVycm9yOiBlcnJvckNhbGxiYWNrKTsKICB9CiAgLy8gYG9iamVjdGAgaXMgYSBgX0Z1dHVyZWAuCiAgLy8KICAvLyBTaW5jZSB0aGUgY2FsbGJhY2tzIGhhdmUgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IHpvbmUgKHNlZQogIC8vIFtfYXN5bmNUaGVuV3JhcHBlckhlbHBlcl0gYW5kIFtfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXJdKSwgd2UgY2FuIGF2b2lkCiAgLy8gYW5vdGhlciByZWdpc3RyYXRpb24gYW5kIGRpcmVjdGx5IGludm9rZSB0aGUgbm8tem9uZS1yZWdpc3RyYXRpb24gYC50aGVuYC4KICAvLwogIC8vIFdlIGNhbiBvbmx5IGRvIHRoaXMgZm9yIG91ciBpbnRlcm5hbCBmdXR1cmVzICh0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgogIC8vIGFsbCBmdXR1cmVzIHRoYXQgYXJlIGNvbnN0cnVjdGVkIGJ5IHRoZSBgZGFydDphc3luY2AgbGlicmFyeSkuCiAgb2JqZWN0Ll9hd2FpdGVyID0gYXdhaXRlcjsKICByZXR1cm4gb2JqZWN0Ll90aGVuTm9ab25lUmVnaXN0cmF0aW9uKHRoZW5DYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7Cn0KCi8vIENhbGxlZCBhcyBwYXJ0IG9mIHRoZSAnYXdhaXQgZm9yICguLi4pJyBjb25zdHJ1Y3QuIFJlZ2lzdGVycyB0aGUKLy8gYXdhaXRlciBvbiB0aGUgc3RyZWFtLgp2b2lkIF9hc3luY1N0YXJMaXN0ZW5IZWxwZXIodmFyIG9iamVjdCwgdmFyIGF3YWl0ZXIpIHsKICBpZiAob2JqZWN0IGlzISBfU3RyZWFtSW1wbCkgewogICAgcmV0dXJuOwogIH0KICAvLyBgb2JqZWN0YCBpcyBhIGBfU3RyZWFtSW1wbGAuCiAgb2JqZWN0Ll9hd2FpdGVyID0gYXdhaXRlcjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX2FzeW5jU3Rhck1vdmVOZXh0SGVscGVyKHZhciBzdHJlYW0pIHsKICBpZiAoc3RyZWFtIGlzISBfU3RyZWFtSW1wbCkgewogICAgcmV0dXJuOwogIH0KICAvLyBzdHJlYW0gaXMgYSBfU3RyZWFtSW1wbC4KICBpZiAoc3RyZWFtLl9nZW5lcmF0b3IgPT0gbnVsbCkgewogICAgLy8gTm8gZ2VuZXJhdG9yIHJlZ2lzdGVyZWQsIHRoaXMgaXNuJ3QgYW4gYXN5bmMqIFN0cmVhbS4KICAgIHJldHVybjsKICB9CiAgX21vdmVOZXh0RGVidWdnZXJTdGVwQ2hlY2soc3RyZWFtLl9nZW5lcmF0b3IpOwp9CgovLyBfQXN5bmNTdGFyU3RyZWFtQ29udHJvbGxlciBpcyB1c2VkIGJ5IHRoZSBjb21waWxlciB0byBpbXBsZW1lbnQKLy8gYXN5bmMqIGdlbmVyYXRvciBmdW5jdGlvbnMuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXI8VD4gewogIFN0cmVhbUNvbnRyb2xsZXI8VD4gY29udHJvbGxlcjsKICBGdW5jdGlvbiBhc3luY1N0YXJCb2R5OwogIGJvb2wgaXNBZGRpbmcgPSBmYWxzZTsKICBib29sIG9uTGlzdGVuUmVjZWl2ZWQgPSBmYWxzZTsKICBib29sIGlzU2NoZWR1bGVkID0gZmFsc2U7CiAgYm9vbCBpc1N1c3BlbmRlZEF0WWllbGQgPSBmYWxzZTsKICBDb21wbGV0ZXIgY2FuY2VsbGF0aW9uQ29tcGxldGVyID0gbnVsbDsKCiAgU3RyZWFtPFQ+IGdldCBzdHJlYW0gewogICAgZmluYWwgU3RyZWFtPFQ+IGxvY2FsID0gY29udHJvbGxlci5zdHJlYW07CiAgICBpZiAobG9jYWwgaXMgX1N0cmVhbUltcGw8VD4pIHsKICAgICAgbG9jYWwuX2dlbmVyYXRvciA9IGFzeW5jU3RhckJvZHk7CiAgICB9CiAgICByZXR1cm4gbG9jYWw7CiAgfQoKICB2b2lkIHJ1bkJvZHkoKSB7CiAgICBpc1NjaGVkdWxlZCA9IGZhbHNlOwogICAgaXNTdXNwZW5kZWRBdFlpZWxkID0gZmFsc2U7CiAgICBhc3luY1N0YXJCb2R5KCk7CiAgfQoKICB2b2lkIHNjaGVkdWxlR2VuZXJhdG9yKCkgewogICAgaWYgKGlzU2NoZWR1bGVkIHx8IGNvbnRyb2xsZXIuaXNQYXVzZWQgfHwgaXNBZGRpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaXNTY2hlZHVsZWQgPSB0cnVlOwogICAgc2NoZWR1bGVNaWNyb3Rhc2socnVuQm9keSk7CiAgfQoKICAvLyBBZGRzIGVsZW1lbnQgdG8gc3RyZWFtLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGVybWluYXRlCiAgLy8gZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCiAgLy8KICAvLyBUT0RPKGhhdXNuZXIpOiBQZXIgc3BlYywgdGhlIGdlbmVyYXRvciBzaG91bGQgYmUgc3VzcGVuZGVkIGJlZm9yZQogIC8vIGV4aXRpbmcgd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4gV2UgY291bGQgYWRkIGEgZ2V0dGVyIGxpa2UgdGhpczoKICAvLyBnZXQgaXNDYW5jZWxsZWQgPT4gY29udHJvbGxlci5oYXNMaXN0ZW5lcjsKICAvLyBUaGUgZ2VuZXJhdG9yIHdvdWxkIHRyYW5zbGF0ZSBhICd5aWVsZCBlJyBzdGF0ZW1lbnQgdG8KICAvLyBjb250cm9sbGVyLmFkZChlKTsKICAvLyBzdXNwZW5kOwogIC8vIGlmIChjb250cm9sbGVyLmlzQ2FuY2VsbGVkKSByZXR1cm47CiAgYm9vbCBhZGQoVCBldmVudCkgewogICAgaWYgKCFvbkxpc3RlblJlY2VpdmVkKSBfZmF0YWwoInlpZWxkIGJlZm9yZSBzdHJlYW0gaXMgbGlzdGVuZWQgdG8iKTsKICAgIGlmIChpc1N1c3BlbmRlZEF0WWllbGQpIF9mYXRhbCgidW5leHBlY3RlZCB5aWVsZCIpOwogICAgLy8gSWYgc3RyZWFtIGlzIGNhbmNlbGxlZCwgdGVsbCBjYWxsZXIgdG8gZXhpdCB0aGUgYXN5bmMgZ2VuZXJhdG9yLgogICAgaWYgKCFjb250cm9sbGVyLmhhc0xpc3RlbmVyKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29udHJvbGxlci5hZGQoZXZlbnQpOwogICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICAgIGlzU3VzcGVuZGVkQXRZaWVsZCA9IHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBBZGRzIHRoZSBlbGVtZW50cyBvZiBzdHJlYW0gaW50byB0aGlzIGNvbnRyb2xsZXIncyBzdHJlYW0uCiAgLy8gVGhlIGdlbmVyYXRvciB3aWxsIGJlIHNjaGVkdWxlZCBhZ2FpbiB3aGVuIGFsbCBvZiB0aGUKICAvLyBlbGVtZW50cyBvZiB0aGUgYWRkZWQgc3RyZWFtIGhhdmUgYmVlbiBjb25zdW1lZC4KICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGVybWluYXRlCiAgLy8gZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCiAgYm9vbCBhZGRTdHJlYW0oU3RyZWFtPFQ+IHN0cmVhbSkgewogICAgaWYgKCFvbkxpc3RlblJlY2VpdmVkKSBfZmF0YWwoInlpZWxkIGJlZm9yZSBzdHJlYW0gaXMgbGlzdGVuZWQgdG8iKTsKICAgIC8vIElmIHN0cmVhbSBpcyBjYW5jZWxsZWQsIHRlbGwgY2FsbGVyIHRvIGV4aXQgdGhlIGFzeW5jIGdlbmVyYXRvci4KICAgIGlmICghY29udHJvbGxlci5oYXNMaXN0ZW5lcikgcmV0dXJuIHRydWU7CiAgICBpc0FkZGluZyA9IHRydWU7CiAgICB2YXIgd2hlbkRvbmVBZGRpbmcgPSBjb250cm9sbGVyLmFkZFN0cmVhbShzdHJlYW0sIGNhbmNlbE9uRXJyb3I6IGZhbHNlKTsKICAgIHdoZW5Eb25lQWRkaW5nLnRoZW4oKF8pIHsKICAgICAgaXNBZGRpbmcgPSBmYWxzZTsKICAgICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICAgICAgaWYgKCFpc1NjaGVkdWxlZCkgaXNTdXNwZW5kZWRBdFlpZWxkID0gdHJ1ZTsKICAgIH0pOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKChjYW5jZWxsYXRpb25Db21wbGV0ZXIgIT0gbnVsbCkgJiYgIWNhbmNlbGxhdGlvbkNvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICAvLyBJZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNhbmNlbGxlZCwgY29tcGxldGUgdGhlIGNhbmNlbGxhdGlvbiBmdXR1cmUKICAgICAgLy8gd2l0aCB0aGUgZXJyb3IuCiAgICAgIGNhbmNlbGxhdGlvbkNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gSWYgc3RyZWFtIGlzIGNhbmNlbGxlZCwgdGVsbCBjYWxsZXIgdG8gZXhpdCB0aGUgYXN5bmMgZ2VuZXJhdG9yLgogICAgaWYgKCFjb250cm9sbGVyLmhhc0xpc3RlbmVyKSByZXR1cm47CiAgICBjb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIC8vIE5vIG5lZWQgdG8gc2NoZWR1bGUgdGhlIGdlbmVyYXRvciBib2R5IGhlcmUuIFRoaXMgY29kZSBpcyBvbmx5CiAgICAvLyBjYWxsZWQgZnJvbSB0aGUgY2F0Y2ggY2xhdXNlIG9mIHRoZSBpbXBsaWNpdCB0cnktY2F0Y2gtZmluYWxseQogICAgLy8gYXJvdW5kIHRoZSBnZW5lcmF0b3IgYm9keS4gVGhhdCBpcywgd2UgYXJlIG9uIHRoZSBlcnJvciBwYXRoIG91dAogICAgLy8gb2YgdGhlIGdlbmVyYXRvciBhbmQgZG8gbm90IG5lZWQgdG8gcnVuIHRoZSBnZW5lcmF0b3IgYWdhaW4uCiAgfQoKICBjbG9zZSgpIHsKICAgIGlmICgoY2FuY2VsbGF0aW9uQ29tcGxldGVyICE9IG51bGwpICYmICFjYW5jZWxsYXRpb25Db21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgLy8gSWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjYW5jZWxsZWQsIGNvbXBsZXRlIHRoZSBjYW5jZWxsYXRpb24gZnV0dXJlCiAgICAgIC8vIHdpdGggdGhlIGVycm9yLgogICAgICBjYW5jZWxsYXRpb25Db21wbGV0ZXIuY29tcGxldGUoKTsKICAgIH0KICAgIGNvbnRyb2xsZXIuY2xvc2UoKTsKICB9CgogIF9Bc3luY1N0YXJTdHJlYW1Db250cm9sbGVyKHRoaXMuYXN5bmNTdGFyQm9keSkgewogICAgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIG9uTGlzdGVuOiB0aGlzLm9uTGlzdGVuLAogICAgICAgIG9uUmVzdW1lOiB0aGlzLm9uUmVzdW1lLAogICAgICAgIG9uQ2FuY2VsOiB0aGlzLm9uQ2FuY2VsKTsKICB9CgogIG9uTGlzdGVuKCkgewogICAgYXNzZXJ0KCFvbkxpc3RlblJlY2VpdmVkKTsKICAgIG9uTGlzdGVuUmVjZWl2ZWQgPSB0cnVlOwogICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICB9CgogIG9uUmVzdW1lKCkgewogICAgaWYgKGlzU3VzcGVuZGVkQXRZaWVsZCkgewogICAgICBzY2hlZHVsZUdlbmVyYXRvcigpOwogICAgfQogIH0KCiAgb25DYW5jZWwoKSB7CiAgICBpZiAoY29udHJvbGxlci5pc0Nsb3NlZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjYW5jZWxsYXRpb25Db21wbGV0ZXIgPT0gbnVsbCkgewogICAgICBjYW5jZWxsYXRpb25Db21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICAgIC8vIE9ubHkgcmVzdW1lIHRoZSBnZW5lcmF0b3IgaWYgaXQgaXMgc3VzcGVuZGVkIGF0IGEgeWllbGQuCiAgICAgIC8vIENhbmNlbGxhdGlvbiBkb2VzIG5vdCBhZmZlY3QgYW4gYXN5bmMgZ2VuZXJhdG9yIHRoYXQgaXMKICAgICAgLy8gc3VzcGVuZGVkIGF0IGFuIGF3YWl0LgogICAgICBpZiAoaXNTdXNwZW5kZWRBdFlpZWxkKSB7CiAgICAgICAgc2NoZWR1bGVHZW5lcmF0b3IoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNhbmNlbGxhdGlvbkNvbXBsZXRlci5mdXR1cmU7CiAgfQp9CgpAcGF0Y2gKdm9pZCBfcmV0aHJvdyhPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgbmF0aXZlICJBc3luY19yZXRocm93IjsKCkBwYXRjaApjbGFzcyBfRnV0dXJlPFQ+IHsKICAvLy8gVGhlIGNsb3N1cmUgaW1wbGVtZW50aW5nIHRoZSBhc3luY1sqXS1ib2R5IHRoYXQgaXMgYGF3YWl0YGluZyB0aGlzIGZ1dHVyZS4KICBGdW5jdGlvbiBfYXdhaXRlcjsKfQoKQHBhdGNoCmNsYXNzIF9TdHJlYW1JbXBsPFQ+IHsKICAvLy8gVGhlIGNsb3N1cmUgaW1wbGVtZW50aW5nIHRoZSBhc3luY1sqXS1ib2R5IHRoYXQgaXMgYGF3YWl0YGluZyB0aGlzIGZ1dHVyZS4KICBGdW5jdGlvbiBfYXdhaXRlcjsKCiAgLy8vIFRoZSBjbG9zdXJlIGltcGxlbWVudGluZyB0aGUgYXN5bmMtZ2VuZXJhdG9yIGJvZHkgdGhhdCBpcyBjcmVhdGluZyBldmVudHMKICAvLy8gZm9yIHRoaXMgc3RyZWFtLgogIEZ1bmN0aW9uIF9nZW5lcmF0b3I7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oQ29tcGxldGVyIGNvbXBsZXRlciwgT2JqZWN0IHZhbHVlKSB7CiAgY29tcGxldGVyLmNvbXBsZXRlKHZhbHVlKTsKfQoKLy8vIFJldHVybnMgYSBbU3RhY2tUcmFjZV0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN5bmNocm9ub3VzIHByZWZpeCBmb3IgdGhpcwovLy8gYXN5bmNocm9ub3VzIG1ldGhvZC4KT2JqZWN0IF9hc3luY1N0YWNrVHJhY2VIZWxwZXIoRnVuY3Rpb24gYXN5bmNfb3ApCiAgICBuYXRpdmUgIlN0YWNrVHJhY2VfYXN5bmNTdGFja1RyYWNlSGVscGVyIjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9jbGVhckFzeW5jVGhyZWFkU3RhY2tUcmFjZSgpCiAgICBuYXRpdmUgIlN0YWNrVHJhY2VfY2xlYXJBc3luY1RocmVhZFN0YWNrVHJhY2UiOwoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX3NldEFzeW5jVGhyZWFkU3RhY2tUcmFjZShTdGFja1RyYWNlIHN0YWNrVHJhY2UpCiAgICBuYXRpdmUgIlN0YWNrVHJhY2Vfc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlIjsKCnZvaWQgX21vdmVOZXh0RGVidWdnZXJTdGVwQ2hlY2soRnVuY3Rpb24gYXN5bmNfb3ApCiAgICBuYXRpdmUgIkFzeW5jU3Rhck1vdmVOZXh0X2RlYnVnZ2VyU3RlcENoZWNrIjsKgTkATk48AU1QTSQBNAE6JCkcAS4mATguDwErAScSIiVKDR0kCgYEASASJw0dKQoGBAESCRMEAS0yAgFOLigxTkZQUE1OQAVOOQVPRkwgNlECAU1IMjA6Nz0CAUwEPgQ0FU4bLyM+BB4FR01QBVFEHUYCAUQaNyAMBCIdAgEiLCAMBB4jPQwEMQIBQx8aJiIaGSEcIyoBGS8jKAYSBAETGSAVBAEdOg4GGCAEAUkhBUdJMDwYDikWSThIIxMGGxkfEgQBQDs2MSElSUguFU0eGBszCBIEATdRTBk+DgZIKSxGRkhEBAEMUUwZKAYYBAEzJyEhIgQBDx8dGQQBDx4bBgQBDx8TBikvQkEgIB0IBikEAgEHSwEHE1EVAgEHF1EVAVAXFwIBIkEdAgFNGTEvASIjNAEiNjIBMzIBIWRhcnQ6YXN5bmMtcGF0Y2gvYXN5bmNfcGF0Y2guZGFydD1vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3NjaGVkdWxlX21pY3JvdGFza19wYXRjaC5kYXJ0g40vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiYXN5bmNfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgX0FzeW5jUnVuIHsKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfc2NoZWR1bGVJbW1lZGlhdGUodm9pZCBjYWxsYmFjaygpKSB7CiAgICBpZiAoX1NjaGVkdWxlSW1tZWRpYXRlLl9jbG9zdXJlID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIk1pY3JvdGFza3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0KICAgIF9TY2hlZHVsZUltbWVkaWF0ZS5fY2xvc3VyZShjYWxsYmFjayk7CiAgfQp9Cgp0eXBlZGVmIHZvaWQgX1NjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZSh2b2lkIGNhbGxiYWNrKCkpOwoKY2xhc3MgX1NjaGVkdWxlSW1tZWRpYXRlIHsKICBzdGF0aWMgX1NjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZSBfY2xvc3VyZTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX3NldFNjaGVkdWxlSW1tZWRpYXRlQ2xvc3VyZShfU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlIGNsb3N1cmUpIHsKICBfU2NoZWR1bGVJbW1lZGlhdGUuX2Nsb3N1cmUgPSBjbG9zdXJlOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfZW5zdXJlU2NoZWR1bGVJbW1lZGlhdGUoKSB7CiAgX0FzeW5jUnVuLl9zY2hlZHVsZUltbWVkaWF0ZShfc3RhcnRNaWNyb3Rhc2tMb29wKTsKfQoiAE5OPAEfAQcSCTQvQgYrBAIBOQEbLQIBIkcpAgEiIjUCAS5kYXJ0OmFzeW5jLXBhdGNoL3NjaGVkdWxlX21pY3JvdGFza19wYXRjaC5kYXJ0Qm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy9icm9hZGNhc3Rfc3RyZWFtX2NvbnRyb2xsZXIuZGFydLyOLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCmNsYXNzIF9Ccm9hZGNhc3RTdHJlYW08VD4gZXh0ZW5kcyBfQ29udHJvbGxlclN0cmVhbTxUPiB7CiAgX0Jyb2FkY2FzdFN0cmVhbShfU3RyZWFtQ29udHJvbGxlckxpZmVjeWNsZTxUPiBjb250cm9sbGVyKQogICAgICA6IHN1cGVyKGNvbnRyb2xsZXIpOwoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiB0cnVlOwp9CgpjbGFzcyBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IGV4dGVuZHMgX0NvbnRyb2xsZXJTdWJzY3JpcHRpb248VD4gewogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0VWRU5UX0lEID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9GSVJJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX1JFTU9WRV9BRlRFUl9GSVJJTkcgPSA0OwogIC8vIFRPRE8obHJuKTogVXNlIHRoZSBfc3RhdGUgZmllbGQgb24gX0NvbnRyb2xsZXJTdWJzY3JpcHRpb24gdG8KICAvLyBhbHNvIHN0b3JlIHRoaXMgc3RhdGUuIFJlcXVpcmVzIHRoYXQgdGhlIHN1YnNjcmlwdGlvbiBpbXBsZW1lbnRhdGlvbgogIC8vIGRvZXMgbm90IGFzc3VtZSB0aGF0IGl0J3MgdXNlIG9mIHRoZSBzdGF0ZSBpbnRlZ2VyIGlzIHRoZSBvbmx5IHVzZS4KICBpbnQgX2V2ZW50U3RhdGUgPSAwOyAvLyBJbml0aWFsaXplZCB0byBoZWxwIGRhcnQyanMgdHlwZSBpbmZlcmVuY2UuCgogIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gX25leHQ7CiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBfcHJldmlvdXM7CgogIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb24oX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGU8VD4gY29udHJvbGxlciwKICAgICAgdm9pZCBvbkRhdGEoVCBkYXRhKSwgRnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yKQogICAgICA6IHN1cGVyKGNvbnRyb2xsZXIsIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yKSB7CiAgICBfbmV4dCA9IF9wcmV2aW91cyA9IHRoaXM7CiAgfQoKICBib29sIF9leHBlY3RzRXZlbnQoaW50IGV2ZW50SWQpID0+IChfZXZlbnRTdGF0ZSAmIF9TVEFURV9FVkVOVF9JRCkgPT0gZXZlbnRJZDsKCiAgdm9pZCBfdG9nZ2xlRXZlbnRJZCgpIHsKICAgIF9ldmVudFN0YXRlIF49IF9TVEFURV9FVkVOVF9JRDsKICB9CgogIGJvb2wgZ2V0IF9pc0ZpcmluZyA9PiAoX2V2ZW50U3RhdGUgJiBfU1RBVEVfRklSSU5HKSAhPSAwOwoKICB2b2lkIF9zZXRSZW1vdmVBZnRlckZpcmluZygpIHsKICAgIGFzc2VydChfaXNGaXJpbmcpOwogICAgX2V2ZW50U3RhdGUgfD0gX1NUQVRFX1JFTU9WRV9BRlRFUl9GSVJJTkc7CiAgfQoKICBib29sIGdldCBfcmVtb3ZlQWZ0ZXJGaXJpbmcgPT4KICAgICAgKF9ldmVudFN0YXRlICYgX1NUQVRFX1JFTU9WRV9BRlRFUl9GSVJJTkcpICE9IDA7CgogIC8vIFRoZSBjb250cm9sbGVyLl9yZWNvcmRQYXVzZSBkb2Vzbid0IGRvIGFueXRoaW5nIGZvciBhIGJyb2FkY2FzdCBjb250cm9sbGVyLAogIC8vIHNvIHdlIGRvbid0IGJvdGhlciBjYWxsaW5nIGl0LgogIHZvaWQgX29uUGF1c2UoKSB7fQoKICAvLyBUaGUgY29udHJvbGxlci5fcmVjb3JkUmVzdW1lIGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIGEgYnJvYWRjYXN0CiAgLy8gY29udHJvbGxlciwgc28gd2UgZG9uJ3QgYm90aGVyIGNhbGxpbmcgaXQuCiAgdm9pZCBfb25SZXN1bWUoKSB7fQoKICAvLyBfb25DYW5jZWwgaXMgaW5oZXJpdGVkLgp9CgphYnN0cmFjdCBjbGFzcyBfQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPgogICAgaW1wbGVtZW50cyBfU3RyZWFtQ29udHJvbGxlckJhc2U8VD4gewogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0lOSVRJQUwgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0VWRU5UX0lEID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFURV9GSVJJTkcgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX1NUQVRFX0NMT1NFRCA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBfU1RBVEVfQUREU1RSRUFNID0gODsKCiAgQ29udHJvbGxlckNhbGxiYWNrIG9uTGlzdGVuOwogIENvbnRyb2xsZXJDYW5jZWxDYWxsYmFjayBvbkNhbmNlbDsKCiAgLy8gU3RhdGUgb2YgdGhlIGNvbnRyb2xsZXIuCiAgaW50IF9zdGF0ZTsKCiAgLy8gRG91YmxlLWxpbmtlZCBsaXN0IG9mIGFjdGl2ZSBsaXN0ZW5lcnMuCiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBfZmlyc3RTdWJzY3JpcHRpb247CiAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBfbGFzdFN1YnNjcmlwdGlvbjsKCiAgLy8gRXh0cmEgc3RhdGUgdXNlZCBkdXJpbmcgYW4gW2FkZFN0cmVhbV0gY2FsbC4KICBfQWRkU3RyZWFtU3RhdGU8VD4gX2FkZFN0cmVhbVN0YXRlOwoKICAvKioKICAgKiBGdXR1cmUgcmV0dXJuZWQgYnkgW2Nsb3NlXSBhbmQgW2RvbmVdLgogICAqCiAgICogVGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2hlbmV2ZXIgdGhlIGRvbmUgZXZlbnQgaGFzIGJlZW4gc2VudCB0byBhbGwKICAgKiByZWxldmFudCBsaXN0ZW5lcnMuCiAgICogVGhlIHJlbGV2YW50IGxpc3RlbmVycyBhcmUgdGhlIG9uZXMgdGhhdCB3ZXJlIGxpc3RlbmluZyB3aGVuIFtjbG9zZV0gd2FzCiAgICogY2FsbGVkLiBXaGVuIGFsbCBvZiB0aGVzZSBoYXZlIGJlZW4gY2FuY2VsZWQgKHNlbmRpbmcgdGhlIGRvbmUgZXZlbnQgbWFrZXMKICAgKiB0aGVtIGNhbmNlbCwgYnV0IHRoZXkgY2FuIGFsc28gYmUgY2FuY2VsZWQgYmVmb3JlIHNlbmRpbmcgdGhlIGV2ZW50KSwKICAgKiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICoKICAgKiBBbnkgYXR0ZW1wdCB0byBsaXN0ZW4gYWZ0ZXIgY2FsbGluZyBbY2xvc2VdIHdpbGwgdGhyb3csIHNvIHRoZXJlIHdvbid0CiAgICogYmUgYW55IGZ1cnRoZXIgbGlzdGVuZXJzLgogICAqLwogIF9GdXR1cmUgX2RvbmVGdXR1cmU7CgogIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyKHRoaXMub25MaXN0ZW4sIHRoaXMub25DYW5jZWwpCiAgICAgIDogX3N0YXRlID0gX1NUQVRFX0lOSVRJQUw7CgogIENvbnRyb2xsZXJDYWxsYmFjayBnZXQgb25QYXVzZSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3MiKTsKICB9CgogIHZvaWQgc2V0IG9uUGF1c2Uodm9pZCBvblBhdXNlSGFuZGxlcigpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3MiKTsKICB9CgogIENvbnRyb2xsZXJDYWxsYmFjayBnZXQgb25SZXN1bWUgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkJyb2FkY2FzdCBzdHJlYW0gY29udHJvbGxlcnMgZG8gbm90IHN1cHBvcnQgcGF1c2UgY2FsbGJhY2tzIik7CiAgfQoKICB2b2lkIHNldCBvblJlc3VtZSh2b2lkIG9uUmVzdW1lSGFuZGxlcigpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQnJvYWRjYXN0IHN0cmVhbSBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBwYXVzZSBjYWxsYmFja3MiKTsKICB9CgogIC8vIFN0cmVhbUNvbnRyb2xsZXIgaW50ZXJmYWNlLgoKICBTdHJlYW08VD4gZ2V0IHN0cmVhbSA9PiBuZXcgX0Jyb2FkY2FzdFN0cmVhbTxUPih0aGlzKTsKCiAgU3RyZWFtU2luazxUPiBnZXQgc2luayA9PiBuZXcgX1N0cmVhbVNpbmtXcmFwcGVyPFQ+KHRoaXMpOwoKICBib29sIGdldCBpc0Nsb3NlZCA9PiAoX3N0YXRlICYgX1NUQVRFX0NMT1NFRCkgIT0gMDsKCiAgLyoqCiAgICogQSBicm9hZGNhc3QgY29udHJvbGxlciBpcyBuZXZlciBwYXVzZWQuCiAgICoKICAgKiBFYWNoIHJlY2VpdmluZyBzdHJlYW0gbWF5IGJlIHBhdXNlZCBpbmRpdmlkdWFsbHksIGFuZCB0aGV5IGhhbmRsZSB0aGVpcgogICAqIG93biBidWZmZXJpbmcuCiAgICovCiAgYm9vbCBnZXQgaXNQYXVzZWQgPT4gZmFsc2U7CgogIC8qKiBXaGV0aGVyIHRoZXJlIGFyZSBjdXJyZW50bHkgb25lIG9yIG1vcmUgc3Vic2NyaWJlcnMuICovCiAgYm9vbCBnZXQgaGFzTGlzdGVuZXIgPT4gIV9pc0VtcHR5OwoKICAvKioKICAgKiBUZXN0IHdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgZXhhY3RseSBvbmUgbGlzdGVuZXIuCiAgICoKICAgKiBBc3N1bWVzIHRoYXQgdGhlIHN0cmVhbSBoYXMgYSBsaXN0ZW5lciAobm90IFtfaXNFbXB0eV0pLgogICAqLwogIGJvb2wgZ2V0IF9oYXNPbmVMaXN0ZW5lciB7CiAgICBhc3NlcnQoIV9pc0VtcHR5KTsKICAgIHJldHVybiBpZGVudGljYWwoX2ZpcnN0U3Vic2NyaXB0aW9uLCBfbGFzdFN1YnNjcmlwdGlvbik7CiAgfQoKICAvKiogV2hldGhlciBhbiBldmVudCBpcyBiZWluZyBmaXJlZCAoc2VudCB0byBzb21lLCBidXQgbm90IGFsbCwgbGlzdGVuZXJzKS4gKi8KICBib29sIGdldCBfaXNGaXJpbmcgPT4gKF9zdGF0ZSAmIF9TVEFURV9GSVJJTkcpICE9IDA7CgogIGJvb2wgZ2V0IF9pc0FkZGluZ1N0cmVhbSA9PiAoX3N0YXRlICYgX1NUQVRFX0FERFNUUkVBTSkgIT0gMDsKCiAgYm9vbCBnZXQgX21heUFkZEV2ZW50ID0+IChfc3RhdGUgPCBfU1RBVEVfQ0xPU0VEKTsKCiAgX0Z1dHVyZSBfZW5zdXJlRG9uZUZ1dHVyZSgpIHsKICAgIGlmIChfZG9uZUZ1dHVyZSAhPSBudWxsKSByZXR1cm4gX2RvbmVGdXR1cmU7CiAgICByZXR1cm4gX2RvbmVGdXR1cmUgPSBuZXcgX0Z1dHVyZSgpOwogIH0KCiAgLy8gTGlua2VkIGxpc3QgaGVscGVycwoKICBib29sIGdldCBfaXNFbXB0eSA9PiBfZmlyc3RTdWJzY3JpcHRpb24gPT0gbnVsbDsKCiAgLyoqIEFkZHMgc3Vic2NyaXB0aW9uIHRvIGxpbmtlZCBsaXN0IG9mIGFjdGl2ZSBsaXN0ZW5lcnMuICovCiAgdm9pZCBfYWRkTGlzdGVuZXIoX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgIGFzc2VydChpZGVudGljYWwoc3Vic2NyaXB0aW9uLl9uZXh0LCBzdWJzY3JpcHRpb24pKTsKICAgIHN1YnNjcmlwdGlvbi5fZXZlbnRTdGF0ZSA9IChfc3RhdGUgJiBfU1RBVEVfRVZFTlRfSUQpOwogICAgLy8gSW5zZXJ0IGluIGxpbmtlZCBsaXN0IGFzIGxhc3Qgc3Vic2NyaXB0aW9uLgogICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBvbGRMYXN0ID0gX2xhc3RTdWJzY3JpcHRpb247CiAgICBfbGFzdFN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbi5fbmV4dCA9IG51bGw7CiAgICBzdWJzY3JpcHRpb24uX3ByZXZpb3VzID0gb2xkTGFzdDsKICAgIGlmIChvbGRMYXN0ID09IG51bGwpIHsKICAgICAgX2ZpcnN0U3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uOwogICAgfSBlbHNlIHsKICAgICAgb2xkTGFzdC5fbmV4dCA9IHN1YnNjcmlwdGlvbjsKICAgIH0KICB9CgogIHZvaWQgX3JlbW92ZUxpc3RlbmVyKF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICBhc3NlcnQoaWRlbnRpY2FsKHN1YnNjcmlwdGlvbi5fY29udHJvbGxlciwgdGhpcykpOwogICAgYXNzZXJ0KCFpZGVudGljYWwoc3Vic2NyaXB0aW9uLl9uZXh0LCBzdWJzY3JpcHRpb24pKTsKICAgIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gcHJldmlvdXMgPSBzdWJzY3JpcHRpb24uX3ByZXZpb3VzOwogICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBuZXh0ID0gc3Vic2NyaXB0aW9uLl9uZXh0OwogICAgaWYgKHByZXZpb3VzID09IG51bGwpIHsKICAgICAgLy8gVGhpcyB3YXMgdGhlIGZpcnN0IHN1YnNjcmlwdGlvbi4KICAgICAgX2ZpcnN0U3Vic2NyaXB0aW9uID0gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dDsKICAgIH0KICAgIGlmIChuZXh0ID09IG51bGwpIHsKICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3Qgc3Vic2NyaXB0aW9uLgogICAgICBfbGFzdFN1YnNjcmlwdGlvbiA9IHByZXZpb3VzOwogICAgfSBlbHNlIHsKICAgICAgbmV4dC5fcHJldmlvdXMgPSBwcmV2aW91czsKICAgIH0KCiAgICBzdWJzY3JpcHRpb24uX25leHQgPSBzdWJzY3JpcHRpb24uX3ByZXZpb3VzID0gc3Vic2NyaXB0aW9uOwogIH0KCiAgLy8gX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGUgaW50ZXJmYWNlLgoKICBTdHJlYW1TdWJzY3JpcHRpb248VD4gX3N1YnNjcmliZSh2b2lkIG9uRGF0YShUIGRhdGEpLCBGdW5jdGlvbiBvbkVycm9yLAogICAgICB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3IpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICBvbkRvbmUgPz89IF9udWxsRG9uZUhhbmRsZXI7CiAgICAgIHJldHVybiBuZXcgX0RvbmVTdHJlYW1TdWJzY3JpcHRpb248VD4ob25Eb25lKTsKICAgIH0KICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBuZXcgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPigKICAgICAgICB0aGlzLCBvbkRhdGEsIG9uRXJyb3IsIG9uRG9uZSwgY2FuY2VsT25FcnJvcik7CiAgICBfYWRkTGlzdGVuZXIoc3Vic2NyaXB0aW9uKTsKICAgIGlmIChpZGVudGljYWwoX2ZpcnN0U3Vic2NyaXB0aW9uLCBfbGFzdFN1YnNjcmlwdGlvbikpIHsKICAgICAgLy8gT25seSBvbmUgbGlzdGVuZXIsIHNvIGl0IG11c3QgYmUgdGhlIGZpcnN0IGxpc3RlbmVyLgogICAgICBfcnVuR3VhcmRlZChvbkxpc3Rlbik7CiAgICB9CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogIH0KCiAgRnV0dXJlIF9yZWNvcmRDYW5jZWwoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YikgewogICAgX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBzdWI7CiAgICAvLyBJZiBhbHJlYWR5IHJlbW92ZWQgYnkgdGhlIHN0cmVhbSwgZG9uJ3QgcmVtb3ZlIGl0IGFnYWluLgogICAgaWYgKGlkZW50aWNhbChzdWJzY3JpcHRpb24uX25leHQsIHN1YnNjcmlwdGlvbikpIHJldHVybiBudWxsOwogICAgaWYgKHN1YnNjcmlwdGlvbi5faXNGaXJpbmcpIHsKICAgICAgc3Vic2NyaXB0aW9uLl9zZXRSZW1vdmVBZnRlckZpcmluZygpOwogICAgfSBlbHNlIHsKICAgICAgX3JlbW92ZUxpc3RlbmVyKHN1YnNjcmlwdGlvbik7CiAgICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgZmlyaW5nIGFuIGV2ZW50LCB0aGUgZW1wdHktY2hlY2sgaXMgcGVyZm9ybWVkIGF0CiAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpc3RlbmVyIGxvb3AgaW5zdGVhZCBvZiBoZXJlLgogICAgICBpZiAoIV9pc0ZpcmluZyAmJiBfaXNFbXB0eSkgewogICAgICAgIF9jYWxsT25DYW5jZWwoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIF9yZWNvcmRQYXVzZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7fQogIHZvaWQgX3JlY29yZFJlc3VtZShTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7fQoKICAvLyBFdmVudFNpbmsgaW50ZXJmYWNlLgoKICBFcnJvciBfYWRkRXZlbnRFcnJvcigpIHsKICAgIGlmIChpc0Nsb3NlZCkgewogICAgICByZXR1cm4gbmV3IFN0YXRlRXJyb3IoIkNhbm5vdCBhZGQgbmV3IGV2ZW50cyBhZnRlciBjYWxsaW5nIGNsb3NlIik7CiAgICB9CiAgICBhc3NlcnQoX2lzQWRkaW5nU3RyZWFtKTsKICAgIHJldHVybiBuZXcgU3RhdGVFcnJvcigiQ2Fubm90IGFkZCBuZXcgZXZlbnRzIHdoaWxlIGRvaW5nIGFuIGFkZFN0cmVhbSIpOwogIH0KCiAgdm9pZCBhZGQoVCBkYXRhKSB7CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2FkZEV2ZW50RXJyb3IoKTsKICAgIF9zZW5kRGF0YShkYXRhKTsKICB9CgogIHZvaWQgYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKGVycm9yKTsKICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYWRkRXZlbnRFcnJvcigpOwogICAgQXN5bmNFcnJvciByZXBsYWNlbWVudCA9IFpvbmUuY3VycmVudC5lcnJvckNhbGxiYWNrKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICAgIHN0YWNrVHJhY2UgPSByZXBsYWNlbWVudC5zdGFja1RyYWNlOwogICAgfQogICAgX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgfQoKICBGdXR1cmUgY2xvc2UoKSB7CiAgICBpZiAoaXNDbG9zZWQpIHsKICAgICAgYXNzZXJ0KF9kb25lRnV0dXJlICE9IG51bGwpOwogICAgICByZXR1cm4gX2RvbmVGdXR1cmU7CiAgICB9CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2FkZEV2ZW50RXJyb3IoKTsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQ0xPU0VEOwogICAgRnV0dXJlIGRvbmVGdXR1cmUgPSBfZW5zdXJlRG9uZUZ1dHVyZSgpOwogICAgX3NlbmREb25lKCk7CiAgICByZXR1cm4gZG9uZUZ1dHVyZTsKICB9CgogIEZ1dHVyZSBnZXQgZG9uZSA9PiBfZW5zdXJlRG9uZUZ1dHVyZSgpOwoKICBGdXR1cmUgYWRkU3RyZWFtKFN0cmVhbTxUPiBzdHJlYW0sIHtib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBpZiAoIV9tYXlBZGRFdmVudCkgdGhyb3cgX2FkZEV2ZW50RXJyb3IoKTsKICAgIF9zdGF0ZSB8PSBfU1RBVEVfQUREU1RSRUFNOwogICAgX2FkZFN0cmVhbVN0YXRlID0gbmV3IF9BZGRTdHJlYW1TdGF0ZSh0aGlzLCBzdHJlYW0sIGNhbmNlbE9uRXJyb3IgPz8gZmFsc2UpOwogICAgcmV0dXJuIF9hZGRTdHJlYW1TdGF0ZS5hZGRTdHJlYW1GdXR1cmU7CiAgfQoKICAvLyBfRXZlbnRTaW5rIGludGVyZmFjZSwgY2FsbGVkIGZyb20gQWRkU3RyZWFtU3RhdGUuCiAgdm9pZCBfYWRkKFQgZGF0YSkgewogICAgX3NlbmREYXRhKGRhdGEpOwogIH0KCiAgdm9pZCBfYWRkRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgIF9zZW5kRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgdm9pZCBfY2xvc2UoKSB7CiAgICBhc3NlcnQoX2lzQWRkaW5nU3RyZWFtKTsKICAgIF9BZGRTdHJlYW1TdGF0ZSBhZGRTdGF0ZSA9IF9hZGRTdHJlYW1TdGF0ZTsKICAgIF9hZGRTdHJlYW1TdGF0ZSA9IG51bGw7CiAgICBfc3RhdGUgJj0gfl9TVEFURV9BRERTVFJFQU07CiAgICBhZGRTdGF0ZS5jb21wbGV0ZSgpOwogIH0KCiAgLy8gRXZlbnQgaGFuZGxpbmcuCiAgdm9pZCBfZm9yRWFjaExpc3RlbmVyKAogICAgICB2b2lkIGFjdGlvbihfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikpIHsKICAgIGlmIChfaXNGaXJpbmcpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoCiAgICAgICAgICAiQ2Fubm90IGZpcmUgbmV3IGV2ZW50LiBDb250cm9sbGVyIGlzIGFscmVhZHkgZmlyaW5nIGFuIGV2ZW50Iik7CiAgICB9CiAgICBpZiAoX2lzRW1wdHkpIHJldHVybjsKCiAgICAvLyBHZXQgZXZlbnQgaWQgb2YgdGhpcyBldmVudC4KICAgIGludCBpZCA9IChfc3RhdGUgJiBfU1RBVEVfRVZFTlRfSUQpOwogICAgLy8gU3RhcnQgZmlyaW5nIChzZXQgdGhlIF9TVEFURV9GSVJJTkcgYml0KS4gV2UgZG9uJ3QgZG8gW29uQ2FuY2VsXQogICAgLy8gY2FsbGJhY2tzIHdoaWxlIGZpcmluZywgYW5kIHdlIHByZXZlbnQgcmVlbnRyYW5jeSBvZiB0aGlzIGZ1bmN0aW9uLgogICAgLy8KICAgIC8vIFNldCBbX3N0YXRlXSdzIGV2ZW50IGlkIHRvIHRoZSBuZXh0IGV2ZW50J3MgaWQuCiAgICAvLyBBbnkgbGlzdGVuZXJzIGFkZGVkIHdoaWxlIGZpcmluZyB0aGlzIGV2ZW50IHdpbGwgZXhwZWN0IHRoZSBuZXh0IGV2ZW50LAogICAgLy8gbm90IHRoaXMgb25lLCBhbmQgd29uJ3QgZ2V0IG5vdGlmaWVkLgogICAgX3N0YXRlIF49IF9TVEFURV9FVkVOVF9JRCB8IF9TVEFURV9GSVJJTkc7CiAgICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9maXJzdFN1YnNjcmlwdGlvbjsKICAgIHdoaWxlIChzdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgICBpZiAoc3Vic2NyaXB0aW9uLl9leHBlY3RzRXZlbnQoaWQpKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLl9ldmVudFN0YXRlIHw9IF9Ccm9hZGNhc3RTdWJzY3JpcHRpb24uX1NUQVRFX0ZJUklORzsKICAgICAgICBhY3Rpb24oc3Vic2NyaXB0aW9uKTsKICAgICAgICBzdWJzY3JpcHRpb24uX3RvZ2dsZUV2ZW50SWQoKTsKICAgICAgICBfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IG5leHQgPSBzdWJzY3JpcHRpb24uX25leHQ7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi5fcmVtb3ZlQWZ0ZXJGaXJpbmcpIHsKICAgICAgICAgIF9yZW1vdmVMaXN0ZW5lcihzdWJzY3JpcHRpb24pOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpcHRpb24uX2V2ZW50U3RhdGUgJj0gfl9Ccm9hZGNhc3RTdWJzY3JpcHRpb24uX1NUQVRFX0ZJUklORzsKICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbi5fbmV4dDsKICAgICAgfQogICAgfQogICAgX3N0YXRlICY9IH5fU1RBVEVfRklSSU5HOwoKICAgIGlmIChfaXNFbXB0eSkgewogICAgICBfY2FsbE9uQ2FuY2VsKCk7CiAgICB9CiAgfQoKICB2b2lkIF9jYWxsT25DYW5jZWwoKSB7CiAgICBhc3NlcnQoX2lzRW1wdHkpOwogICAgaWYgKGlzQ2xvc2VkICYmIF9kb25lRnV0dXJlLl9tYXlDb21wbGV0ZSkgewogICAgICAvLyBXaGVuIGNsb3NlZCwgX2RvbmVGdXR1cmUgaXMgbm90IG51bGwuCiAgICAgIF9kb25lRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogICAgfQogICAgX3J1bkd1YXJkZWQob25DYW5jZWwpOwogIH0KfQoKY2xhc3MgX1N5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+IGV4dGVuZHMgX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4KICAgIGltcGxlbWVudHMgU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyPFQ+IHsKICBfU3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIodm9pZCBvbkxpc3RlbigpLCB2b2lkIG9uQ2FuY2VsKCkpCiAgICAgIDogc3VwZXIob25MaXN0ZW4sIG9uQ2FuY2VsKTsKCiAgLy8gRXZlbnREaXNwYXRjaCBpbnRlcmZhY2UuCgogIGJvb2wgZ2V0IF9tYXlBZGRFdmVudCA9PiBzdXBlci5fbWF5QWRkRXZlbnQgJiYgIV9pc0ZpcmluZzsKCiAgX2FkZEV2ZW50RXJyb3IoKSB7CiAgICBpZiAoX2lzRmlyaW5nKSB7CiAgICAgIHJldHVybiBuZXcgU3RhdGVFcnJvcigKICAgICAgICAgICJDYW5ub3QgZmlyZSBuZXcgZXZlbnQuIENvbnRyb2xsZXIgaXMgYWxyZWFkeSBmaXJpbmcgYW4gZXZlbnQiKTsKICAgIH0KICAgIHJldHVybiBzdXBlci5fYWRkRXZlbnRFcnJvcigpOwogIH0KCiAgdm9pZCBfc2VuZERhdGEoVCBkYXRhKSB7CiAgICBpZiAoX2lzRW1wdHkpIHJldHVybjsKICAgIGlmIChfaGFzT25lTGlzdGVuZXIpIHsKICAgICAgX3N0YXRlIHw9IF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyLl9TVEFURV9GSVJJTkc7CiAgICAgIF9Ccm9hZGNhc3RTdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uID0gX2ZpcnN0U3Vic2NyaXB0aW9uOwogICAgICBzdWJzY3JpcHRpb24uX2FkZChkYXRhKTsKICAgICAgX3N0YXRlICY9IH5fQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlci5fU1RBVEVfRklSSU5HOwogICAgICBpZiAoX2lzRW1wdHkpIHsKICAgICAgICBfY2FsbE9uQ2FuY2VsKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgX2ZvckVhY2hMaXN0ZW5lcigoX0J1ZmZlcmluZ1N0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pIHsKICAgICAgc3Vic2NyaXB0aW9uLl9hZGQoZGF0YSk7CiAgICB9KTsKICB9CgogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgaWYgKF9pc0VtcHR5KSByZXR1cm47CiAgICBfZm9yRWFjaExpc3RlbmVyKChfQnVmZmVyaW5nU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbikgewogICAgICBzdWJzY3JpcHRpb24uX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0pOwogIH0KCiAgdm9pZCBfc2VuZERvbmUoKSB7CiAgICBpZiAoIV9pc0VtcHR5KSB7CiAgICAgIF9mb3JFYWNoTGlzdGVuZXIoKF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLl9jbG9zZSgpOwogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChfZG9uZUZ1dHVyZSAhPSBudWxsKTsKICAgICAgYXNzZXJ0KF9kb25lRnV0dXJlLl9tYXlDb21wbGV0ZSk7CiAgICAgIF9kb25lRnV0dXJlLl9hc3luY0NvbXBsZXRlKG51bGwpOwogICAgfQogIH0KfQoKY2xhc3MgX0FzeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPiBleHRlbmRzIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyPFQ+IHsKICBfQXN5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyKHZvaWQgb25MaXN0ZW4oKSwgdm9pZCBvbkNhbmNlbCgpKQogICAgICA6IHN1cGVyKG9uTGlzdGVuLCBvbkNhbmNlbCk7CgogIC8vIEV2ZW50RGlzcGF0Y2ggaW50ZXJmYWNlLgoKICB2b2lkIF9zZW5kRGF0YShUIGRhdGEpIHsKICAgIGZvciAoX0Jyb2FkY2FzdFN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24gPSBfZmlyc3RTdWJzY3JpcHRpb247CiAgICAgICAgc3Vic2NyaXB0aW9uICE9IG51bGw7CiAgICAgICAgc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uLl9uZXh0KSB7CiAgICAgIHN1YnNjcmlwdGlvbi5fYWRkUGVuZGluZyhuZXcgX0RlbGF5ZWREYXRhPFQ+KGRhdGEpKTsKICAgIH0KICB9CgogIHZvaWQgX3NlbmRFcnJvcihPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogICAgZm9yIChfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9maXJzdFN1YnNjcmlwdGlvbjsKICAgICAgICBzdWJzY3JpcHRpb24gIT0gbnVsbDsKICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb24uX25leHQpIHsKICAgICAgc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKG5ldyBfRGVsYXllZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgICB9CiAgfQoKICB2b2lkIF9zZW5kRG9uZSgpIHsKICAgIGlmICghX2lzRW1wdHkpIHsKICAgICAgZm9yIChfQnJvYWRjYXN0U3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9IF9maXJzdFN1YnNjcmlwdGlvbjsKICAgICAgICAgIHN1YnNjcmlwdGlvbiAhPSBudWxsOwogICAgICAgICAgc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uLl9uZXh0KSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLl9hZGRQZW5kaW5nKGNvbnN0IF9EZWxheWVkRG9uZSgpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KF9kb25lRnV0dXJlICE9IG51bGwpOwogICAgICBhc3NlcnQoX2RvbmVGdXR1cmUuX21heUNvbXBsZXRlKTsKICAgICAgX2RvbmVGdXR1cmUuX2FzeW5jQ29tcGxldGUobnVsbCk7CiAgICB9CiAgfQp9CgovKioKICogU3RyZWFtIGNvbnRyb2xsZXIgdGhhdCBpcyB1c2VkIGJ5IFtTdHJlYW0uYXNCcm9hZGNhc3RTdHJlYW1dLgogKgogKiBUaGlzIHN0cmVhbSBjb250cm9sbGVyIGFsbG93cyBpbmNvbWluZyBldmVudHMgd2hpbGUgaXQgaXMgZmlyaW5nCiAqIG90aGVyIGV2ZW50cy4gVGhpcyBpcyBoYW5kbGVkIGJ5IGRlbGF5aW5nIHRoZSBldmVudHMgdW50aWwgdGhlCiAqIGN1cnJlbnQgZXZlbnQgaXMgZG9uZSBmaXJpbmcsIGFuZCB0aGVuIGZpcmUgdGhlIHBlbmRpbmcgZXZlbnRzLgogKgogKiBUaGlzIGNsYXNzIGV4dGVuZHMgW19TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcl0uIEV2ZW50cyBvZgogKiBhbiAiYXNCcm9hZGNhc3RTdHJlYW0iIHN0cmVhbSBhcmUgYWx3YXlzIGluaXRpYXRlZCBieSBldmVudHMKICogb24gYW5vdGhlciBzdHJlYW0sIGFuZCBpdCBpcyBmaW5lIHRvIGZvcndhcmQgdGhlbSBzeW5jaHJvbm91c2x5LgogKi8KY2xhc3MgX0FzQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPiBleHRlbmRzIF9TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcjxUPgogICAgaW1wbGVtZW50cyBfRXZlbnREaXNwYXRjaDxUPiB7CiAgX1N0cmVhbUltcGxFdmVudHM8VD4gX3BlbmRpbmc7CgogIF9Bc0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIodm9pZCBvbkxpc3RlbigpLCB2b2lkIG9uQ2FuY2VsKCkpCiAgICAgIDogc3VwZXIob25MaXN0ZW4sIG9uQ2FuY2VsKTsKCiAgYm9vbCBnZXQgX2hhc1BlbmRpbmcgPT4gX3BlbmRpbmcgIT0gbnVsbCAmJiAhX3BlbmRpbmcuaXNFbXB0eTsKCiAgdm9pZCBfYWRkUGVuZGluZ0V2ZW50KF9EZWxheWVkRXZlbnQgZXZlbnQpIHsKICAgIF9wZW5kaW5nID8/PSBuZXcgX1N0cmVhbUltcGxFdmVudHM8VD4oKTsKICAgIF9wZW5kaW5nLmFkZChldmVudCk7CiAgfQoKICB2b2lkIGFkZChUIGRhdGEpIHsKICAgIGlmICghaXNDbG9zZWQgJiYgX2lzRmlyaW5nKSB7CiAgICAgIF9hZGRQZW5kaW5nRXZlbnQobmV3IF9EZWxheWVkRGF0YTxUPihkYXRhKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN1cGVyLmFkZChkYXRhKTsKICAgIHdoaWxlIChfaGFzUGVuZGluZykgewogICAgICBfcGVuZGluZy5oYW5kbGVOZXh0KHRoaXMpOwogICAgfQogIH0KCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICBpZiAoIWlzQ2xvc2VkICYmIF9pc0ZpcmluZykgewogICAgICBfYWRkUGVuZGluZ0V2ZW50KG5ldyBfRGVsYXllZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghX21heUFkZEV2ZW50KSB0aHJvdyBfYWRkRXZlbnRFcnJvcigpOwogICAgX3NlbmRFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICB3aGlsZSAoX2hhc1BlbmRpbmcpIHsKICAgICAgX3BlbmRpbmcuaGFuZGxlTmV4dCh0aGlzKTsKICAgIH0KICB9CgogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIGlmICghaXNDbG9zZWQgJiYgX2lzRmlyaW5nKSB7CiAgICAgIF9hZGRQZW5kaW5nRXZlbnQoY29uc3QgX0RlbGF5ZWREb25lKCkpOwogICAgICBfc3RhdGUgfD0gX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIuX1NUQVRFX0NMT1NFRDsKICAgICAgcmV0dXJuIHN1cGVyLmRvbmU7CiAgICB9CiAgICBGdXR1cmUgcmVzdWx0ID0gc3VwZXIuY2xvc2UoKTsKICAgIGFzc2VydCghX2hhc1BlbmRpbmcpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHZvaWQgX2NhbGxPbkNhbmNlbCgpIHsKICAgIGlmIChfaGFzUGVuZGluZykgewogICAgICBfcGVuZGluZy5jbGVhcigpOwogICAgICBfcGVuZGluZyA9IG51bGw7CiAgICB9CiAgICBzdXBlci5fY2FsbE9uQ2FuY2VsKCk7CiAgfQp9CoIAAE5OPAEUATk9GwEgAgFFKCYzQ0pJRgEjJwFDUEQeBAFRARokBAE8ASEXLwQBITcBUSQVAUYwFgEdAgEtKicoJiYpAR8lAR4OAS0wLwEyJgEGLAVKGU5QSxwFTB8GFwE7IQEjIEgEASwgSAQBJCBIBAEuIEgEASEBOQE9ATYBBi0FTRQGHgE+JQEGNwU+Bh0XPQQBUTcBQAE1ASAxKAQBGQEzAT8+OTszOyYfJhspDSQGBAFBNzpBORwqIQ0dBhgpJA0hBgFABAErAUorFCM1Bkg3IDw+HQYZBAE0MkBCIiwNJU43JBkIBhEEATs8ARoBGxRKBh1NBAEVLxUEATkiL0wfMCsGIwQBExQjGgYvHS0RFwQBKgE9LyBRLAQBNxYVBAE4IwQBEh0wHCEZBAEVGUMVHEsGGgEjKUhLBzdPLS9BIyxKHic9LykKSx0PKwgGHgEUFwYEARkWMC8oBhsEAgFOMEMjAR4BPQEVFR1LBiMEARsaGzpDHzsWGQgOBkYfCAQBORpGMQgEARUVSB8KDSMoKAYEAgFRRCMBHgEbRh4tOwYEATlGHi1GBgQBFRVIIC84CA0jKCgGBAIBBEEDREJDA0JARARQIyEBQSMBQQEvLRkEARUiMw4GFRohBgQBOSI+DgYvIxohBgQBEyIuOhkGIxoTBAEZFxgXBhsEAgErZGFydDphc3luYy9icm9hZGNhc3Rfc3RyZWFtX2NvbnRyb2xsZXIuZGFydC1vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvYXN5bmMvZnV0dXJlLmRhcnTAAIjnLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5hc3luYzsKCi8vLyBBIHR5cGUgcmVwcmVzZW50aW5nIHZhbHVlcyB0aGF0IGFyZSBlaXRoZXIgYEZ1dHVyZTxUPmAgb3IgYFRgLgovLy8KLy8vIFRoaXMgY2xhc3MgZGVjbGFyYXRpb24gaXMgYSBwdWJsaWMgc3RhbmQtaW4gZm9yIGFuIGludGVybmFsCi8vLyBmdXR1cmUtb3ItdmFsdWUgZ2VuZXJpYyB0eXBlLiBSZWZlcmVuY2VzIHRvIHRoaXMgY2xhc3MgYXJlIHJlc29sdmVkIHRvIHRoZQovLy8gaW50ZXJuYWwgdHlwZS4KLy8vCi8vLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYW55IGNsYXNzIHRvIGV4dGVuZCwgbWl4IGluIG9yIGltcGxlbWVudAovLy8gYEZ1dHVyZU9yYC4KLy8vCi8vLyBOb3RlOiB0aGUgYEZ1dHVyZU9yPFQ+YCB0eXBlIGlzIGludGVycHJldGVkIGFzIGBkeW5hbWljYCBpbiBub24gc3Ryb25nLW1vZGUuCi8vLwovLy8gIyBFeGFtcGxlcwovLy8gYGBgIGRhcnQKLy8vIC8vIFRoZSBgRnV0dXJlPFQ+LnRoZW5gIGZ1bmN0aW9uIHRha2VzIGEgY2FsbGJhY2sgW2ZdIHRoYXQgcmV0dXJucyBlaXRoZXIKLy8vIC8vIGFuIGBTYCBvciBhIGBGdXR1cmU8Uz5gLgovLy8gRnV0dXJlPFM+IHRoZW48Uz4oRnV0dXJlT3I8Uz4gZihUIHgpLCAuLi4pOwovLy8KLy8vIC8vIGBDb21wbGV0ZXI8VD4uY29tcGxldGVgIHRha2VzIGVpdGhlciBhIGBUYCBvciBgRnV0dXJlPFQ+YC4KLy8vIHZvaWQgY29tcGxldGUoRnV0dXJlT3I8VD4gdmFsdWUpOwovLy8gYGBgCi8vLwovLy8gIyBBZHZhbmNlZAovLy8gVGhlIGBGdXR1cmVPcjxpbnQ+YCB0eXBlIGlzIGFjdHVhbGx5IHRoZSAidHlwZSB1bmlvbiIgb2YgdGhlIHR5cGVzIGBpbnRgIGFuZAovLy8gYEZ1dHVyZTxpbnQ+YC4gVGhpcyB0eXBlIHVuaW9uIGlzIGRlZmluZWQgaW4gc3VjaCBhIHdheSB0aGF0Ci8vLyBgRnV0dXJlT3I8T2JqZWN0PmAgaXMgYm90aCBhIHN1cGVyLSBhbmQgc3ViLXR5cGUgb2YgYE9iamVjdGAgKHN1Yi10eXBlCi8vLyBiZWNhdXNlIGBPYmplY3RgIGlzIG9uZSBvZiB0aGUgdHlwZXMgb2YgdGhlIHVuaW9uLCBzdXBlci10eXBlIGJlY2F1c2UKLy8vIGBPYmplY3RgIGlzIGEgc3VwZXItdHlwZSBvZiBib3RoIG9mIHRoZSB0eXBlcyBvZiB0aGUgdW5pb24pLiBUb2dldGhlciBpdAovLy8gbWVhbnMgdGhhdCBgRnV0dXJlT3I8T2JqZWN0PmAgaXMgZXF1aXZhbGVudCB0byBgT2JqZWN0YC4KLy8vCi8vLyBBcyBhIGNvcm9sbGFyeSwgYEZ1dHVyZU9yPE9iamVjdD5gIGlzIGVxdWl2YWxlbnQgdG8KLy8vIGBGdXR1cmVPcjxGdXR1cmVPcjxPYmplY3Q+PmAsIGBGdXR1cmVPcjxGdXR1cmU8T2JqZWN0Pj5gIGlzIGVxdWl2YWxlbnQgdG8KLy8vIGBGdXR1cmU8T2JqZWN0PmAuCmFic3RyYWN0IGNsYXNzIEZ1dHVyZU9yPFQ+IHsKICAvLyBQcml2YXRlIGdlbmVyYXRpdmUgY29uc3RydWN0b3IsIHNvIHRoYXQgaXQgaXMgbm90IHN1YmNsYXNzYWJsZSwgbWl4YWJsZSwgb3IKICAvLyBpbnN0YW50aWFibGUuCiAgRnV0dXJlT3IuXygpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJGdXR1cmVPciBjYW4ndCBiZSBpbnN0YW50aWF0ZWQiKTsKICB9Cn0KCi8qKgogKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgZGVsYXllZCBjb21wdXRhdGlvbi4KICoKICogQSBbRnV0dXJlXSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHBvdGVudGlhbCB2YWx1ZSwgb3IgZXJyb3IsCiAqIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuCiAqIFJlY2VpdmVycyBvZiBhIFtGdXR1cmVdIGNhbiByZWdpc3RlciBjYWxsYmFja3MKICogdGhhdCBoYW5kbGUgdGhlIHZhbHVlIG9yIGVycm9yIG9uY2UgaXQgaXMgYXZhaWxhYmxlLgogKiBGb3IgZXhhbXBsZToKICoKICogICAgIEZ1dHVyZTxpbnQ+IGZ1dHVyZSA9IGdldEZ1dHVyZSgpOwogKiAgICAgZnV0dXJlLnRoZW4oKHZhbHVlKSA9PiBoYW5kbGVWYWx1ZSh2YWx1ZSkpCiAqICAgICAgICAgICAuY2F0Y2hFcnJvcigoZXJyb3IpID0+IGhhbmRsZUVycm9yKGVycm9yKSk7CiAqCiAqIEEgW0Z1dHVyZV0gY2FuIGJlIGNvbXBsZXRlZCBpbiB0d28gd2F5czoKICogd2l0aCBhIHZhbHVlICgidGhlIGZ1dHVyZSBzdWNjZWVkcyIpCiAqIG9yIHdpdGggYW4gZXJyb3IgKCJ0aGUgZnV0dXJlIGZhaWxzIikuCiAqIFVzZXJzIGNhbiBpbnN0YWxsIGNhbGxiYWNrcyBmb3IgZWFjaCBjYXNlLgogKgogKiBJbiBzb21lIGNhc2VzIHdlIHNheSB0aGF0IGEgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIGFub3RoZXIgZnV0dXJlLgogKiBUaGlzIGlzIGEgc2hvcnQgd2F5IG9mIHN0YXRpbmcgdGhhdCB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCBpbiB0aGUgc2FtZSB3YXksCiAqIHdpdGggdGhlIHNhbWUgdmFsdWUgb3IgZXJyb3IsCiAqIGFzIHRoZSBvdGhlciBmdXR1cmUgb25jZSB0aGF0IGNvbXBsZXRlcy4KICogV2hlbmV2ZXIgYSBmdW5jdGlvbiBpbiB0aGUgY29yZSBsaWJyYXJ5IG1heSBjb21wbGV0ZSBhIGZ1dHVyZQogKiAoZm9yIGV4YW1wbGUgW0NvbXBsZXRlci5jb21wbGV0ZV0gb3IgW25ldyBGdXR1cmUudmFsdWVdKSwKICogdGhlbiBpdCBhbHNvIGFjY2VwdHMgYW5vdGhlciBmdXR1cmUgYW5kIGRvZXMgdGhpcyB3b3JrIGZvciB0aGUgZGV2ZWxvcGVyLgogKgogKiBUaGUgcmVzdWx0IG9mIHJlZ2lzdGVyaW5nIGEgcGFpciBvZiBjYWxsYmFja3MgaXMgYSBuZXcgRnV0dXJlICh0aGUKICogInN1Y2Nlc3NvciIpIHdoaWNoIGluIHR1cm4gaXMgY29tcGxldGVkIHdpdGggdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUKICogY29ycmVzcG9uZGluZyBjYWxsYmFjay4KICogVGhlIHN1Y2Nlc3NvciBpcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciBpZiB0aGUgaW52b2tlZCBjYWxsYmFjayB0aHJvd3MuCiAqIEZvciBleGFtcGxlOgogKiBgYGAKICogRnV0dXJlPGludD4gc3VjY2Vzc29yID0gZnV0dXJlLnRoZW4oKGludCB2YWx1ZSkgewogKiAgICAgLy8gSW52b2tlZCB3aGVuIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggYSB2YWx1ZS4KICogICAgIHJldHVybiA0MjsgIC8vIFRoZSBzdWNjZXNzb3IgaXMgY29tcGxldGVkIHdpdGggdGhlIHZhbHVlIDQyLgogKiAgIH0sCiAqICAgb25FcnJvcjogKGUpIHsKICogICAgIC8vIEludm9rZWQgd2hlbiB0aGUgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yLgogKiAgICAgaWYgKGNhbkhhbmRsZShlKSkgewogKiAgICAgICByZXR1cm4gNDk5OyAgLy8gVGhlIHN1Y2Nlc3NvciBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgdmFsdWUgNDk5LgogKiAgICAgfSBlbHNlIHsKICogICAgICAgdGhyb3cgZTsgIC8vIFRoZSBzdWNjZXNzb3IgaXMgY29tcGxldGVkIHdpdGggdGhlIGVycm9yIGUuCiAqICAgICB9CiAqICAgfSk7CiAqIGBgYAogKgogKiBJZiBhIGZ1dHVyZSBkb2VzIG5vdCBoYXZlIGEgc3VjY2Vzc29yIHdoZW4gaXQgY29tcGxldGVzIHdpdGggYW4gZXJyb3IsCiAqIGl0IGZvcndhcmRzIHRoZSBlcnJvciBtZXNzYWdlIHRvIHRoZSBnbG9iYWwgZXJyb3ItaGFuZGxlci4KICogVGhpcyBiZWhhdmlvciBtYWtlcyBzdXJlIHRoYXQgbm8gZXJyb3IgaXMgc2lsZW50bHkgZHJvcHBlZC4KICogSG93ZXZlciwgaXQgYWxzbyBtZWFucyB0aGF0IGVycm9yIGhhbmRsZXJzIHNob3VsZCBiZSBpbnN0YWxsZWQgZWFybHksCiAqIHNvIHRoYXQgdGhleSBhcmUgcHJlc2VudCBhcyBzb29uIGFzIGEgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yLgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoaXMgcG90ZW50aWFsIGJ1ZzoKICogYGBgCiAqIHZhciBmdXR1cmUgPSBnZXRGdXR1cmUoKTsKICogbmV3IFRpbWVyKG5ldyBEdXJhdGlvbihtaWxsaXNlY29uZHM6IDUpLCAoKSB7CiAqICAgLy8gVGhlIGVycm9yLWhhbmRsZXIgaXMgbm90IGF0dGFjaGVkIHVudGlsIDUgbXMgYWZ0ZXIgdGhlIGZ1dHVyZSBoYXMKICogICAvLyBiZWVuIHJlY2VpdmVkLiBJZiB0aGUgZnV0dXJlIGZhaWxzIGJlZm9yZSB0aGF0LCB0aGUgZXJyb3IgaXMKICogICAvLyBmb3J3YXJkZWQgdG8gdGhlIGdsb2JhbCBlcnJvci1oYW5kbGVyLCBldmVuIHRob3VnaCB0aGVyZSBpcyBjb2RlCiAqICAgLy8gKGp1c3QgYmVsb3cpIHRvIGV2ZW50dWFsbHkgaGFuZGxlIHRoZSBlcnJvci4KICogICBmdXR1cmUudGhlbigodmFsdWUpIHsgdXNlVmFsdWUodmFsdWUpOyB9LAogKiAgICAgICAgICAgICAgIG9uRXJyb3I6IChlKSB7IGhhbmRsZUVycm9yKGUpOyB9KTsKICogfSk7CiAqIGBgYAogKgogKiBXaGVuIHJlZ2lzdGVyaW5nIGNhbGxiYWNrcywgaXQncyBvZnRlbiBtb3JlIHJlYWRhYmxlIHRvIHJlZ2lzdGVyIHRoZSB0d28KICogY2FsbGJhY2tzIHNlcGFyYXRlbHksIGJ5IGZpcnN0IHVzaW5nIFt0aGVuXSB3aXRoIG9uZSBhcmd1bWVudAogKiAodGhlIHZhbHVlIGhhbmRsZXIpIGFuZCB1c2luZyBhIHNlY29uZCBbY2F0Y2hFcnJvcl0gZm9yIGhhbmRsaW5nIGVycm9ycy4KICogRWFjaCBvZiB0aGVzZSB3aWxsIGZvcndhcmQgdGhlIHJlc3VsdCB0aGF0IHRoZXkgZG9uJ3QgaGFuZGxlCiAqIHRvIHRoZWlyIHN1Y2Nlc3NvcnMsIGFuZCB0b2dldGhlciB0aGV5IGhhbmRsZSBib3RoIHZhbHVlIGFuZCBlcnJvciByZXN1bHQuCiAqIEl0IGFsc28gaGFzIHRoZSBhZGRpdGlvbmFsIGJlbmVmaXQgb2YgdGhlIFtjYXRjaEVycm9yXSBoYW5kbGluZyBlcnJvcnMgaW4gdGhlCiAqIFt0aGVuXSB2YWx1ZSBjYWxsYmFjayB0b28uCiAqIFVzaW5nIHNlcXVlbnRpYWwgaGFuZGxlcnMgaW5zdGVhZCBvZiBwYXJhbGxlbCBvbmVzIG9mdGVuIGxlYWRzIHRvIGNvZGUgdGhhdAogKiBpcyBlYXNpZXIgdG8gcmVhc29uIGFib3V0LgogKiBJdCBhbHNvIG1ha2VzIGFzeW5jaHJvbm91cyBjb2RlIHZlcnkgc2ltaWxhciB0byBzeW5jaHJvbm91cyBjb2RlOgogKiBgYGAKICogLy8gU3luY2hyb25vdXMgY29kZS4KICogdHJ5IHsKICogICBpbnQgdmFsdWUgPSBmb28oKTsKICogICByZXR1cm4gYmFyKHZhbHVlKTsKICogfSBjYXRjaCAoZSkgewogKiAgIHJldHVybiA0OTk7CiAqIH0KICogYGBgCiAqCiAqIEVxdWl2YWxlbnQgYXN5bmNocm9ub3VzIGNvZGUsIGJhc2VkIG9uIGZ1dHVyZXM6CiAqIGBgYAogKiBGdXR1cmU8aW50PiBmdXR1cmUgPSBuZXcgRnV0dXJlKGZvbyk7ICAvLyBSZXN1bHQgb2YgZm9vKCkgYXMgYSBmdXR1cmUuCiAqIGZ1dHVyZS50aGVuKChpbnQgdmFsdWUpID0+IGJhcih2YWx1ZSkpCiAqICAgICAgIC5jYXRjaEVycm9yKChlKSA9PiA0OTkpOwogKiBgYGAKICoKICogU2ltaWxhciB0byB0aGUgc3luY2hyb25vdXMgY29kZSwgdGhlIGVycm9yIGhhbmRsZXIgKHJlZ2lzdGVyZWQgd2l0aAogKiBbY2F0Y2hFcnJvcl0pIGlzIGhhbmRsaW5nIGFueSBlcnJvcnMgdGhyb3duIGJ5IGVpdGhlciBgZm9vYCBvciBgYmFyYC4KICogSWYgdGhlIGVycm9yLWhhbmRsZXIgaGFkIGJlZW4gcmVnaXN0ZXJlZCBhcyB0aGUgYG9uRXJyb3JgIHBhcmFtZXRlciBvZgogKiB0aGUgYHRoZW5gIGNhbGwsIGl0IHdvdWxkIG5vdCBjYXRjaCBlcnJvcnMgZnJvbSB0aGUgYGJhcmAgY2FsbC4KICoKICogRnV0dXJlcyBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGNhbGxiYWNrLXBhaXIgcmVnaXN0ZXJlZC4gRWFjaCBzdWNjZXNzb3IgaXMKICogdHJlYXRlZCBpbmRlcGVuZGVudGx5IGFuZCBpcyBoYW5kbGVkIGFzIGlmIGl0IHdhcyB0aGUgb25seSBzdWNjZXNzb3IuCiAqCiAqIEEgZnV0dXJlIG1heSBhbHNvIGZhaWwgdG8gZXZlciBjb21wbGV0ZS4gSW4gdGhhdCBjYXNlLCBubyBjYWxsYmFja3MgYXJlCiAqIGNhbGxlZC4KICovCmFic3RyYWN0IGNsYXNzIEZ1dHVyZTxUPiB7CiAgLy8vIEEgYEZ1dHVyZTxOdWxsPmAgY29tcGxldGVkIHdpdGggYG51bGxgLgogIHN0YXRpYyBmaW5hbCBfRnV0dXJlPE51bGw+IF9udWxsRnV0dXJlID0KICAgICAgbmV3IF9GdXR1cmU8TnVsbD4uem9uZVZhbHVlKG51bGwsIFpvbmUucm9vdCk7CgogIC8vLyBBIGBGdXR1cmU8Ym9vbD5gIGNvbXBsZXRlZCB3aXRoIGBmYWxzZWAuCiAgc3RhdGljIGZpbmFsIF9GdXR1cmU8Ym9vbD4gX2ZhbHNlRnV0dXJlID0KICAgICAgbmV3IF9GdXR1cmU8Ym9vbD4uem9uZVZhbHVlKGZhbHNlLCBab25lLnJvb3QpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgZnV0dXJlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0KICAgKiBhc3luY2hyb25vdXNseSB3aXRoIFtUaW1lci5ydW5dLgogICAqCiAgICogSWYgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgW2NvbXB1dGF0aW9uXSB0aHJvd3MsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMKICAgKiBjb21wbGV0ZWQgd2l0aCB0aGUgZXJyb3IuCiAgICoKICAgKiBJZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgaXRzZWxmIGEgW0Z1dHVyZV0sIGNvbXBsZXRpb24gb2YKICAgKiB0aGUgY3JlYXRlZCBmdXR1cmUgd2lsbCB3YWl0IHVudGlsIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzLAogICAqIGFuZCB3aWxsIHRoZW4gY29tcGxldGUgd2l0aCB0aGUgc2FtZSByZXN1bHQuCiAgICoKICAgKiBJZiBhIG5vbi1mdXR1cmUgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkCiAgICogd2l0aCB0aGF0IHZhbHVlLgogICAqLwogIGZhY3RvcnkgRnV0dXJlKEZ1dHVyZU9yPFQ+IGNvbXB1dGF0aW9uKCkpIHsKICAgIF9GdXR1cmU8VD4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIFRpbWVyLnJ1bigoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZShjb21wdXRhdGlvbigpKTsKICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKHJlc3VsdCwgZSwgcyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBmdXR1cmUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW2NvbXB1dGF0aW9uXQogICAqIGFzeW5jaHJvbm91c2x5IHdpdGggW3NjaGVkdWxlTWljcm90YXNrXS4KICAgKgogICAqIElmIGV4ZWN1dGluZyBbY29tcHV0YXRpb25dIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoZSB0aHJvd24gZXJyb3IuCiAgICoKICAgKiBJZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0gcmV0dXJucyBhIFtGdXR1cmVdLCBjb21wbGV0aW9uIG9mCiAgICogdGhlIGNyZWF0ZWQgZnV0dXJlIHdpbGwgd2FpdCB1bnRpbCB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcywKICAgKiBhbmQgd2lsbCB0aGVuIGNvbXBsZXRlIHdpdGggdGhlIHNhbWUgcmVzdWx0LgogICAqCiAgICogSWYgY2FsbGluZyBbY29tcHV0YXRpb25dIHJldHVybnMgYSBub24tZnV0dXJlIHZhbHVlLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCB2YWx1ZS4KICAgKi8KICBmYWN0b3J5IEZ1dHVyZS5taWNyb3Rhc2soRnV0dXJlT3I8VD4gY29tcHV0YXRpb24oKSkgewogICAgX0Z1dHVyZTxUPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICB0cnkgewogICAgICAgIHJlc3VsdC5fY29tcGxldGUoY29tcHV0YXRpb24oKSk7CiAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhyZXN1bHQsIGUsIHMpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgZnV0dXJlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiBpbW1lZGlhdGVseSBjYWxsaW5nCiAgICogW2NvbXB1dGF0aW9uXS4KICAgKgogICAqIElmIGNhbGxpbmcgW2NvbXB1dGF0aW9uXSB0aHJvd3MsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlCiAgICogZXJyb3IuCiAgICoKICAgKiBJZiBjYWxsaW5nIFtjb21wdXRhdGlvbl0gcmV0dXJucyBhIGBGdXR1cmU8VD5gLCB0aGF0IGZ1dHVyZSBpcyByZXR1cm5lZC4KICAgKgogICAqIElmIGNhbGxpbmcgW2NvbXB1dGF0aW9uXSByZXR1cm5zIGEgbm9uLWZ1dHVyZSB2YWx1ZSwKICAgKiBhIGZ1dHVyZSBpcyByZXR1cm5lZCB3aGljaCBoYXMgYmVlbiBjb21wbGV0ZWQgd2l0aCB0aGF0IHZhbHVlLgogICAqLwogIGZhY3RvcnkgRnV0dXJlLnN5bmMoRnV0dXJlT3I8VD4gY29tcHV0YXRpb24oKSkgewogICAgdHJ5IHsKICAgICAgdmFyIHJlc3VsdCA9IGNvbXB1dGF0aW9uKCk7CiAgICAgIGlmIChyZXN1bHQgaXMgRnV0dXJlPFQ+KSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IF9GdXR1cmU8VD4udmFsdWUocmVzdWx0KTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyb3IsIHN0YWNrVHJhY2UpIHsKICAgICAgdmFyIGZ1dHVyZSA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICAgIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CiAgICAgICAgZnV0dXJlLl9hc3luY0NvbXBsZXRlRXJyb3IoCiAgICAgICAgICAgIF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpLCByZXBsYWNlbWVudC5zdGFja1RyYWNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmdXR1cmUuX2FzeW5jQ29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1dHVyZTsKICAgIH0KICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBmdXR1cmUgY29tcGxldGVkIHdpdGggW3ZhbHVlXS4KICAgKgogICAqIElmIFt2YWx1ZV0gaXMgYSBmdXR1cmUsIHRoZSBjcmVhdGVkIGZ1dHVyZSB3YWl0cyBmb3IgdGhlCiAgICogW3ZhbHVlXSBmdXR1cmUgdG8gY29tcGxldGUsIGFuZCB0aGVuIGNvbXBsZXRlcyB3aXRoIHRoZSBzYW1lIHJlc3VsdC4KICAgKiBTaW5jZSBhIFt2YWx1ZV0gZnV0dXJlIGNhbiBjb21wbGV0ZSB3aXRoIGFuIGVycm9yLCBzbyBjYW4gdGhlIGZ1dHVyZQogICAqIGNyZWF0ZWQgYnkgW0Z1dHVyZS52YWx1ZV0sIGV2ZW4gaWYgdGhlIG5hbWUgc3VnZ2VzdHMgb3RoZXJ3aXNlLgogICAqCiAgICogSWYgW3ZhbHVlXSBpcyBub3QgYSBbRnV0dXJlXSwgdGhlIGNyZWF0ZWQgZnV0dXJlIGlzIGNvbXBsZXRlZAogICAqIHdpdGggdGhlIFt2YWx1ZV0gdmFsdWUsCiAgICogZXF1aXZhbGVudGx5IHRvIGBuZXcgRnV0dXJlPFQ+LnN5bmMoKCkgPT4gdmFsdWUpYC4KICAgKgogICAqIFVzZSBbQ29tcGxldGVyXSB0byBjcmVhdGUgYSBmdXR1cmUgYW5kIGNvbXBsZXRlIGl0IGxhdGVyLgogICAqLwogIGZhY3RvcnkgRnV0dXJlLnZhbHVlKFtGdXR1cmVPcjxUPiB2YWx1ZV0pIHsKICAgIHJldHVybiBuZXcgX0Z1dHVyZTxUPi5pbW1lZGlhdGUodmFsdWUpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLgogICAqCiAgICogVGhlIGNyZWF0ZWQgZnV0dXJlIHdpbGwgYmUgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgaW4gYSBmdXR1cmUgbWljcm90YXNrLgogICAqIFRoaXMgYWxsb3dzIGVub3VnaCB0aW1lIGZvciBzb21lb25lIHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIG9uIHRoZSBmdXR1cmUuCiAgICogSWYgYW4gZXJyb3IgaGFuZGxlciBpc24ndCBhZGRlZCBiZWZvcmUgdGhlIGZ1dHVyZSBjb21wbGV0ZXMsIHRoZSBlcnJvcgogICAqIHdpbGwgYmUgY29uc2lkZXJlZCB1bmhhbmRsZWQuCiAgICoKICAgKiBJZiBbZXJyb3JdIGlzIGBudWxsYCwgaXQgaXMgcmVwbGFjZWQgYnkgYSBbTnVsbFRocm93bkVycm9yXS4KICAgKgogICAqIFVzZSBbQ29tcGxldGVyXSB0byBjcmVhdGUgYSBmdXR1cmUgYW5kIGNvbXBsZXRlIGl0IGxhdGVyLgogICAqLwogIGZhY3RvcnkgRnV0dXJlLmVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihlcnJvcik7CiAgICBpZiAoIWlkZW50aWNhbChab25lLmN1cnJlbnQsIF9yb290Wm9uZSkpIHsKICAgICAgQXN5bmNFcnJvciByZXBsYWNlbWVudCA9IFpvbmUuY3VycmVudC5lcnJvckNhbGxiYWNrKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgICAgICBlcnJvciA9IF9ub25OdWxsRXJyb3IocmVwbGFjZW1lbnQuZXJyb3IpOwogICAgICAgIHN0YWNrVHJhY2UgPSByZXBsYWNlbWVudC5zdGFja1RyYWNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IF9GdXR1cmU8VD4uaW1tZWRpYXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGZ1dHVyZSB0aGF0IHJ1bnMgaXRzIGNvbXB1dGF0aW9uIGFmdGVyIGEgZGVsYXkuCiAgICoKICAgKiBUaGUgW2NvbXB1dGF0aW9uXSB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBnaXZlbiBbZHVyYXRpb25dIGhhcyBwYXNzZWQsCiAgICogYW5kIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uCiAgICoKICAgKiBJZiBbY29tcHV0YXRpb25dIHJldHVybnMgYSBmdXR1cmUsCiAgICogdGhlIGZ1dHVyZSByZXR1cm5lZCBieSB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgY29tcGxldGUgd2l0aCB0aGUgdmFsdWUgb3IKICAgKiBlcnJvciBvZiB0aGF0IGZ1dHVyZS4KICAgKgogICAqIElmIHRoZSBkdXJhdGlvbiBpcyAwIG9yIGxlc3MsCiAgICogaXQgY29tcGxldGVzIG5vIHNvb25lciB0aGFuIGluIHRoZSBuZXh0IGV2ZW50LWxvb3AgaXRlcmF0aW9uLAogICAqIGFmdGVyIGFsbCBtaWNyb3Rhc2tzIGhhdmUgcnVuLgogICAqCiAgICogSWYgW2NvbXB1dGF0aW9uXSBpcyBvbWl0dGVkLAogICAqIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBbY29tcHV0YXRpb25dIHdhcyBgKCkgPT4gbnVsbGAsCiAgICogYW5kIHRoZSBmdXR1cmUgd2lsbCBldmVudHVhbGx5IGNvbXBsZXRlIHdpdGggdGhlIGBudWxsYCB2YWx1ZS4KICAgKgogICAqIElmIGNhbGxpbmcgW2NvbXB1dGF0aW9uXSB0aHJvd3MsIHRoZSBjcmVhdGVkIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggdGhlCiAgICogZXJyb3IuCiAgICoKICAgKiBTZWUgYWxzbyBbQ29tcGxldGVyXSBmb3IgYSB3YXkgdG8gY3JlYXRlIGFuZCBjb21wbGV0ZSBhIGZ1dHVyZSBhdCBhCiAgICogbGF0ZXIgdGltZSB0aGF0IGlzbid0IG5lY2Vzc2FyaWx5IGFmdGVyIGEga25vd24gZml4ZWQgZHVyYXRpb24uCiAgICovCiAgZmFjdG9yeSBGdXR1cmUuZGVsYXllZChEdXJhdGlvbiBkdXJhdGlvbiwgW0Z1dHVyZU9yPFQ+IGNvbXB1dGF0aW9uKCldKSB7CiAgICBfRnV0dXJlPFQ+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBuZXcgVGltZXIoZHVyYXRpb24sICgpIHsKICAgICAgaWYgKGNvbXB1dGF0aW9uID09IG51bGwpIHsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlKG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlKGNvbXB1dGF0aW9uKCkpOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKHJlc3VsdCwgZSwgcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBXYWl0cyBmb3IgbXVsdGlwbGUgZnV0dXJlcyB0byBjb21wbGV0ZSBhbmQgY29sbGVjdHMgdGhlaXIgcmVzdWx0cy4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgd2hpY2ggd2lsbCBjb21wbGV0ZSBvbmNlIGFsbCB0aGUgcHJvdmlkZWQgZnV0dXJlcwogICAqIGhhdmUgY29tcGxldGVkLCBlaXRoZXIgd2l0aCB0aGVpciByZXN1bHRzLCBvciB3aXRoIGFuIGVycm9yIGlmIGFueQogICAqIG9mIHRoZSBwcm92aWRlZCBmdXR1cmVzIGZhaWwuCiAgICoKICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJldHVybmVkIGZ1dHVyZSB3aWxsIGJlIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyB0aGF0CiAgICogd2VyZSBwcm9kdWNlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgZnV0dXJlcyBhcmUgcHJvdmlkZWQgYnkgaXRlcmF0aW5nCiAgICogW2Z1dHVyZXNdLgogICAqCiAgICogSWYgYW55IGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvciwKICAgKiB0aGVuIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhhdCBlcnJvci4KICAgKiBJZiBmdXJ0aGVyIGZ1dHVyZXMgYWxzbyBjb21wbGV0ZSB3aXRoIGVycm9ycywgdGhvc2UgZXJyb3JzIGFyZSBkaXNjYXJkZWQuCiAgICoKICAgKiBJZiBgZWFnZXJFcnJvcmAgaXMgdHJ1ZSwgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvcgogICAqIGltbWVkaWF0ZWx5IG9uIHRoZSBmaXJzdCBlcnJvciBmcm9tIG9uZSBvZiB0aGUgZnV0dXJlcy4gT3RoZXJ3aXNlIGFsbAogICAqIGZ1dHVyZXMgbXVzdCBjb21wbGV0ZSBiZWZvcmUgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgKHN0aWxsIHdpdGgKICAgKiB0aGUgZmlyc3QgZXJyb3I7IHRoZSByZW1haW5pbmcgZXJyb3JzIGFyZSBzaWxlbnRseSBkcm9wcGVkKS4KICAgKgogICAqIEluIHRoZSBjYXNlIG9mIGFuIGVycm9yLCBbY2xlYW5VcF0gKGlmIHByb3ZpZGVkKSwgaXMgaW52b2tlZCBvbiBhbnkKICAgKiBub24tbnVsbCByZXN1bHQgb2Ygc3VjY2Vzc2Z1bCBmdXR1cmVzLgogICAqIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gYGNsZWFuVXBgIHJlc291cmNlcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZQogICAqIGxvc3QgKHNpbmNlIHRoZSByZXR1cm5lZCBmdXR1cmUgZG9lcyBub3QgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlc2UgdmFsdWVzKS4KICAgKiBUaGUgW2NsZWFuVXBdIGZ1bmN0aW9uIGlzIHVudXNlZCBpZiB0aGVyZSBpcyBubyBlcnJvci4KICAgKgogICAqIFRoZSBjYWxsIHRvIFtjbGVhblVwXSBzaG91bGQgbm90IHRocm93LiBJZiBpdCBkb2VzLCB0aGUgZXJyb3Igd2lsbCBiZSBhbgogICAqIHVuY2F1Z2h0IGFzeW5jaHJvbm91cyBlcnJvci4KICAgKi8KICBzdGF0aWMgRnV0dXJlPExpc3Q8VD4+IHdhaXQ8VD4oSXRlcmFibGU8RnV0dXJlPFQ+PiBmdXR1cmVzLAogICAgICB7Ym9vbCBlYWdlckVycm9yOiBmYWxzZSwgdm9pZCBjbGVhblVwKFQgc3VjY2Vzc1ZhbHVlKX0pIHsKICAgIGZpbmFsIF9GdXR1cmU8TGlzdDxUPj4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8TGlzdDxUPj4oKTsKICAgIExpc3Q8VD4gdmFsdWVzOyAvLyBDb2xsZWN0cyB0aGUgdmFsdWVzLiBTZXQgdG8gbnVsbCBvbiBlcnJvci4KICAgIGludCByZW1haW5pbmcgPSAwOyAvLyBIb3cgbWFueSBmdXR1cmVzIGFyZSB3ZSB3YWl0aW5nIGZvci4KICAgIHZhciBlcnJvcjsgLy8gVGhlIGZpcnN0IGVycm9yIGZyb20gYSBmdXR1cmUuCiAgICBTdGFja1RyYWNlIHN0YWNrVHJhY2U7IC8vIFRoZSBzdGFja1RyYWNlIHRoYXQgY2FtZSB3aXRoIHRoZSBlcnJvci4KCiAgICAvLyBIYW5kbGUgYW4gZXJyb3IgZnJvbSBhbnkgb2YgdGhlIGZ1dHVyZXMuCiAgICAvLyBUT0RPKGptZXNzZXJseSk6IHVzZSBgdm9pZGAgcmV0dXJuIHR5cGUgb25jZSBpdCBjYW4gYmUgaW5mZXJyZWQgZm9yIHRoZQogICAgLy8gYHRoZW5gIGNhbGwgYmVsb3cuCiAgICBoYW5kbGVFcnJvcih0aGVFcnJvciwgU3RhY2tUcmFjZSB0aGVTdGFja1RyYWNlKSB7CiAgICAgIHJlbWFpbmluZy0tOwogICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKICAgICAgICBpZiAoY2xlYW5VcCAhPSBudWxsKSB7CiAgICAgICAgICBmb3IgKHZhciB2YWx1ZSBpbiB2YWx1ZXMpIHsKICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAvLyBFbnN1cmUgZXJyb3JzIGZyb20gY2xlYW5VcCBhcmUgdW5jYXVnaHQuCiAgICAgICAgICAgICAgbmV3IEZ1dHVyZS5zeW5jKCgpIHsKICAgICAgICAgICAgICAgIGNsZWFuVXAodmFsdWUpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhbHVlcyA9IG51bGw7CiAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwIHx8IGVhZ2VyRXJyb3IpIHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGVFcnJvcih0aGVFcnJvciwgdGhlU3RhY2tUcmFjZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVycm9yID0gdGhlRXJyb3I7CiAgICAgICAgICBzdGFja1RyYWNlID0gdGhlU3RhY2tUcmFjZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDAgJiYgIWVhZ2VyRXJyb3IpIHsKICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9CiAgICB9CgogICAgdHJ5IHsKICAgICAgLy8gQXMgZWFjaCBmdXR1cmUgY29tcGxldGVzLCBwdXQgaXRzIHZhbHVlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgLy8gcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgdmFsdWVzLgogICAgICBmb3IgKHZhciBmdXR1cmUgaW4gZnV0dXJlcykgewogICAgICAgIGludCBwb3MgPSByZW1haW5pbmc7CiAgICAgICAgZnV0dXJlLnRoZW4oKFQgdmFsdWUpIHsKICAgICAgICAgIHJlbWFpbmluZy0tOwogICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhbHVlc1twb3NdID0gdmFsdWU7CiAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgewogICAgICAgICAgICAgIHJlc3VsdC5fY29tcGxldGVXaXRoVmFsdWUodmFsdWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNsZWFuVXAgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gRW5zdXJlIGVycm9ycyBmcm9tIGNsZWFuVXAgYXJlIHVuY2F1Z2h0LgogICAgICAgICAgICAgIG5ldyBGdXR1cmUuc3luYygoKSB7CiAgICAgICAgICAgICAgICBjbGVhblVwKHZhbHVlKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDAgJiYgIWVhZ2VyRXJyb3IpIHsKICAgICAgICAgICAgICByZXN1bHQuX2NvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgb25FcnJvcjogaGFuZGxlRXJyb3IpOwogICAgICAgIC8vIEluY3JlbWVudCB0aGUgJ3JlbWFpbmluZycgYWZ0ZXIgdGhlIGNhbGwgdG8gJ3RoZW4nLgogICAgICAgIC8vIElmIHRoYXQgY2FsbCB0aHJvd3MsIHdlIGRvbid0IGV4cGVjdCBhbnkgZnV0dXJlIGNhbGxiYWNrIGZyb20KICAgICAgICAvLyB0aGUgZnV0dXJlLCBhbmQgd2UgYWxzbyBkb24ndCBpbmNyZW1lbnQgcmVtYWluaW5nLgogICAgICAgIHJlbWFpbmluZysrOwogICAgICB9CiAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgewogICAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKGNvbnN0IFtdKTsKICAgICAgfQogICAgICB2YWx1ZXMgPSBuZXcgTGlzdDxUPihyZW1haW5pbmcpOwogICAgfSBjYXRjaCAoZSwgc3QpIHsKICAgICAgLy8gVGhlIGVycm9yIG11c3QgaGF2ZSBiZWVuIHRocm93biB3aGlsZSBpdGVyYXRpbmcgb3ZlciB0aGUgZnV0dXJlcwogICAgICAvLyBsaXN0LCBvciB3aGlsZSBpbnN0YWxsaW5nIGEgY2FsbGJhY2sgaGFuZGxlciBvbiB0aGUgZnV0dXJlLgogICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZWFnZXJFcnJvcikgewogICAgICAgIC8vIFRocm93IGEgbmV3IEZ1dHVyZS5lcnJvci4KICAgICAgICAvLyBEb24ndCBqdXN0IGNhbGwgYHJlc3VsdC5fY29tcGxldGVFcnJvcmAgc2luY2UgdGhhdCB3b3VsZCBwcm9wYWdhdGUKICAgICAgICAvLyB0aGUgZXJyb3IgdG9vIGVhZ2VybHksIG5vdCBnaXZpbmcgdGhlIGNhbGxlcnMgdGltZSB0byBpbnN0YWxsCiAgICAgICAgLy8gZXJyb3IgaGFuZGxlcnMuCiAgICAgICAgLy8gQWxzbywgZG9uJ3QgdXNlIGBfYXN5bmNDb21wbGV0ZUVycm9yYCBzaW5jZSB0aGF0IG9uZSBkb2Vzbid0IGdpdmUKICAgICAgICAvLyB6b25lcyB0aGUgY2hhbmNlIHRvIGludGVyY2VwdCB0aGUgZXJyb3IuCiAgICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZSwgc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIERvbid0IGFsbG9jYXRlIGEgbGlzdCBmb3IgdmFsdWVzLCB0aHVzIGluZGljYXRpbmcgdGhhdCB0aGVyZSB3YXMgYW4KICAgICAgICAvLyBlcnJvci4KICAgICAgICAvLyBTZXQgZXJyb3IgdG8gdGhlIGNhdWdodCBleGNlcHRpb24uCiAgICAgICAgZXJyb3IgPSBlOwogICAgICAgIHN0YWNrVHJhY2UgPSBzdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgZmlyc3QgZnV0dXJlIGluIFtmdXR1cmVzXSB0byBjb21wbGV0ZS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgZmlyc3QKICAgKiBmdXR1cmUgaW4gW2Z1dHVyZXNdIHRvIHJlcG9ydCB0aGF0IGl0IGlzIGNvbXBsZXRlLAogICAqIHdoZXRoZXIgaXQncyB3aXRoIGEgdmFsdWUgb3IgYW4gZXJyb3IuCiAgICogVGhlIHJlc3VsdHMgb2YgYWxsIHRoZSBvdGhlciBmdXR1cmVzIGFyZSBkaXNjYXJkZWQuCiAgICoKICAgKiBJZiBbZnV0dXJlc10gaXMgZW1wdHksIG9yIGlmIG5vbmUgb2YgaXRzIGZ1dHVyZXMgY29tcGxldGUsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBuZXZlciBjb21wbGV0ZXMuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxUPiBhbnk8VD4oSXRlcmFibGU8RnV0dXJlPFQ+PiBmdXR1cmVzKSB7CiAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxUPi5zeW5jKCk7CiAgICB2YXIgb25WYWx1ZSA9IChUIHZhbHVlKSB7CiAgICAgIGlmICghY29tcGxldGVyLmlzQ29tcGxldGVkKSBjb21wbGV0ZXIuY29tcGxldGUodmFsdWUpOwogICAgfTsKICAgIHZhciBvbkVycm9yID0gKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrKSB7CiAgICAgIGlmICghY29tcGxldGVyLmlzQ29tcGxldGVkKSBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2spOwogICAgfTsKICAgIGZvciAodmFyIGZ1dHVyZSBpbiBmdXR1cmVzKSB7CiAgICAgIGZ1dHVyZS50aGVuKG9uVmFsdWUsIG9uRXJyb3I6IG9uRXJyb3IpOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICAvKioKICAgKiBQZXJmb3JtcyBhbiBhY3Rpb24gZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgaXRlcmFibGUsIGluIHR1cm4uCiAgICoKICAgKiBUaGUgW2FjdGlvbl0gbWF5IGJlIGVpdGhlciBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMuCiAgICoKICAgKiBDYWxscyBbYWN0aW9uXSB3aXRoIGVhY2ggZWxlbWVudCBpbiBbZWxlbWVudHNdIGluIG9yZGVyLgogICAqIElmIHRoZSBjYWxsIHRvIFthY3Rpb25dIHJldHVybnMgYSBgRnV0dXJlPFQ+YCwgdGhlIGl0ZXJhdGlvbiB3YWl0cwogICAqIHVudGlsIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIGJlZm9yZSBjb250aW51aW5nIHdpdGggdGhlIG5leHQgZWxlbWVudC4KICAgKgogICAqIFJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB3aXRoIGBudWxsYCB3aGVuIGFsbCBlbGVtZW50cyBoYXZlIGJlZW4KICAgKiBwcm9jZXNzZWQuCiAgICoKICAgKiBOb24tW0Z1dHVyZV0gcmV0dXJuIHZhbHVlcywgYW5kIGNvbXBsZXRpb24tdmFsdWVzIG9mIHJldHVybmVkIFtGdXR1cmVdcywKICAgKiBhcmUgZGlzY2FyZGVkLgogICAqCiAgICogQW55IGVycm9yIGZyb20gW2FjdGlvbl0sIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cywKICAgKiB3aWxsIHN0b3AgdGhlIGl0ZXJhdGlvbiBhbmQgYmUgcmVwb3J0ZWQgaW4gdGhlIHJldHVybmVkIFtGdXR1cmVdLgogICAqLwogIHN0YXRpYyBGdXR1cmUgZm9yRWFjaDxUPihJdGVyYWJsZTxUPiBlbGVtZW50cywgRnV0dXJlT3IgYWN0aW9uKFQgZWxlbWVudCkpIHsKICAgIHZhciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yOwogICAgcmV0dXJuIGRvV2hpbGUoKCkgewogICAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIHJlc3VsdCA9IGFjdGlvbihpdGVyYXRvci5jdXJyZW50KTsKICAgICAgaWYgKHJlc3VsdCBpcyBGdXR1cmUpIHJldHVybiByZXN1bHQudGhlbihfa1RydWUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwogIH0KCiAgLy8gQ29uc3RhbnQgYHRydWVgIGZ1bmN0aW9uLCB1c2VkIGFzIGNhbGxiYWNrIGJ5IFtmb3JFYWNoXS4KICBzdGF0aWMgYm9vbCBfa1RydWUoXykgPT4gdHJ1ZTsKCiAgLyoqCiAgICogUGVyZm9ybXMgYW4gb3BlcmF0aW9uIHJlcGVhdGVkbHkgdW50aWwgaXQgcmV0dXJucyBgZmFsc2VgLgogICAqCiAgICogVGhlIG9wZXJhdGlvbiwgW2FjdGlvbl0sIG1heSBiZSBlaXRoZXIgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzLgogICAqCiAgICogVGhlIG9wZXJhdGlvbiBpcyBjYWxsZWQgcmVwZWF0ZWRseSBhcyBsb25nIGFzIGl0IHJldHVybnMgZWl0aGVyIHRoZSBbYm9vbF0KICAgKiB2YWx1ZSBgdHJ1ZWAgb3IgYSBgRnV0dXJlPGJvb2w+YCB3aGljaCBjb21wbGV0ZXMgd2l0aCB0aGUgdmFsdWUgYHRydWVgLgogICAqCiAgICogSWYgYSBjYWxsIHRvIFthY3Rpb25dIHJldHVybnMgYGZhbHNlYCBvciBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHRvCiAgICogYGZhbHNlYCwgaXRlcmF0aW9uIGVuZHMgYW5kIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgW2RvV2hpbGVdIGlzIGNvbXBsZXRlZAogICAqIHdpdGggYSBgbnVsbGAgdmFsdWUuCiAgICoKICAgKiBJZiBhIGNhbGwgdG8gW2FjdGlvbl0gdGhyb3dzIG9yIGEgZnV0dXJlIHJldHVybmVkIGJ5IFthY3Rpb25dIGNvbXBsZXRlcwogICAqIHdpdGggYW4gZXJyb3IsIGl0ZXJhdGlvbiBlbmRzIGFuZCB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IFtkb1doaWxlXQogICAqIGNvbXBsZXRlcyB3aXRoIHRoZSBzYW1lIGVycm9yLgogICAqCiAgICogQ2FsbHMgdG8gW2FjdGlvbl0gbWF5IGhhcHBlbiBhdCBhbnkgdGltZSwKICAgKiBpbmNsdWRpbmcgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgZG9XaGlsZWAuCiAgICogVGhlIG9ubHkgcmVzdHJpY3Rpb24gaXMgYSBuZXcgY2FsbCB0byBbYWN0aW9uXSB3b24ndCBoYXBwZW4gYmVmb3JlCiAgICogdGhlIHByZXZpb3VzIGNhbGwgaGFzIHJldHVybmVkLCBhbmQgaWYgaXQgcmV0dXJuZWQgYSBgRnV0dXJlPGJvb2w+YCwgbm90CiAgICogdW50aWwgdGhhdCBmdXR1cmUgaGFzIGNvbXBsZXRlZC4KICAgKi8KICBzdGF0aWMgRnV0dXJlIGRvV2hpbGUoRnV0dXJlT3I8Ym9vbD4gYWN0aW9uKCkpIHsKICAgIF9GdXR1cmUgZG9uZVNpZ25hbCA9IG5ldyBfRnV0dXJlKCk7CiAgICB2b2lkIEZ1bmN0aW9uKGJvb2wpIG5leHRJdGVyYXRpb247CiAgICAvLyBCaW5kIHRoaXMgY2FsbGJhY2sgZXhwbGljaXRseSBzbyB0aGF0IGVhY2ggaXRlcmF0aW9uIGlzbid0IGJvdW5kIGluIHRoZQogICAgLy8gY29udGV4dCBvZiBhbGwgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbnMnIGNhbGxiYWNrcy4KICAgIC8vIFRoaXMgYXZvaWRzLCBlLmcuLCBkZWVwbHkgbmVzdGVkIHN0YWNrIHRyYWNlcyBmcm9tIHRoZSBzdGFjayB0cmFjZQogICAgLy8gcGFja2FnZS4KICAgIG5leHRJdGVyYXRpb24gPSBab25lLmN1cnJlbnQuYmluZFVuYXJ5Q2FsbGJhY2tHdWFyZGVkKChib29sIGtlZXBHb2luZykgewogICAgICB3aGlsZSAoa2VlcEdvaW5nKSB7CiAgICAgICAgRnV0dXJlT3I8Ym9vbD4gcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQgPSBhY3Rpb24oKTsKICAgICAgICB9IGNhdGNoIChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICAgICAgLy8gQ2Fubm90IHVzZSBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayBiZWNhdXNlIGl0IGNvbXBsZXRlcwogICAgICAgICAgLy8gdGhlIGZ1dHVyZSBzeW5jaHJvbm91c2x5LgogICAgICAgICAgX2FzeW5jQ29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhkb25lU2lnbmFsLCBlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQgaXMgRnV0dXJlPGJvb2w+KSB7CiAgICAgICAgICByZXN1bHQudGhlbihuZXh0SXRlcmF0aW9uLCBvbkVycm9yOiBkb25lU2lnbmFsLl9jb21wbGV0ZUVycm9yKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAga2VlcEdvaW5nID0gcmVzdWx0OwogICAgICB9CiAgICAgIGRvbmVTaWduYWwuX2NvbXBsZXRlKG51bGwpOwogICAgfSk7CiAgICBuZXh0SXRlcmF0aW9uKHRydWUpOwogICAgcmV0dXJuIGRvbmVTaWduYWw7CiAgfQoKICAvKioKICAgKiBSZWdpc3RlciBjYWxsYmFja3MgdG8gYmUgY2FsbGVkIHdoZW4gdGhpcyBmdXR1cmUgY29tcGxldGVzLgogICAqCiAgICogV2hlbiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhIHZhbHVlLAogICAqIHRoZSBbb25WYWx1ZV0gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGF0IHZhbHVlLgogICAqIElmIHRoaXMgZnV0dXJlIGlzIGFscmVhZHkgY29tcGxldGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkCiAgICogaW1tZWRpYXRlbHksIGJ1dCB3aWxsIGJlIHNjaGVkdWxlZCBpbiBhIGxhdGVyIG1pY3JvdGFzay4KICAgKgogICAqIElmIFtvbkVycm9yXSBpcyBwcm92aWRlZCwgYW5kIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLAogICAqIHRoZSBgb25FcnJvcmAgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhhdCBlcnJvciBhbmQgaXRzIHN0YWNrIHRyYWNlLgogICAqIFRoZSBgb25FcnJvcmAgY2FsbGJhY2sgbXVzdCBhY2NlcHQgZWl0aGVyIG9uZSBhcmd1bWVudCBvciB0d28gYXJndW1lbnRzCiAgICogd2hlcmUgdGhlIGxhdHRlciBpcyBhIFtTdGFja1RyYWNlXS4KICAgKiBJZiBgb25FcnJvcmAgYWNjZXB0cyB0d28gYXJndW1lbnRzLAogICAqIGl0IGlzIGNhbGxlZCB3aXRoIGJvdGggdGhlIGVycm9yIGFuZCB0aGUgc3RhY2sgdHJhY2UsCiAgICogb3RoZXJ3aXNlIGl0IGlzIGNhbGxlZCB3aXRoIGp1c3QgdGhlIGVycm9yIG9iamVjdC4KICAgKiBUaGUgYG9uRXJyb3JgIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgdmFsdWUgb3IgZnV0dXJlIHRoYXQgY2FuIGJlIHVzZWQKICAgKiB0byBjb21wbGV0ZSB0aGUgcmV0dXJuZWQgZnV0dXJlLCBzbyBpdCBtdXN0IGJlIHNvbWV0aGluZyBhc3NpZ25hYmxlIHRvCiAgICogYEZ1dHVyZU9yPFI+YC4KICAgKgogICAqIFJldHVybnMgYSBuZXcgW0Z1dHVyZV0KICAgKiB3aGljaCBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIHRvIGBvblZhbHVlYAogICAqIChpZiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhIHZhbHVlKQogICAqIG9yIHRvIGBvbkVycm9yYCAoaWYgdGhpcyBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IpLgogICAqCiAgICogSWYgdGhlIGludm9rZWQgY2FsbGJhY2sgdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIHRocm93biBlcnJvcgogICAqIGFuZCBhIHN0YWNrIHRyYWNlIGZvciB0aGUgZXJyb3IuCiAgICogSW4gdGhlIGNhc2Ugb2YgYG9uRXJyb3JgLAogICAqIGlmIHRoZSBleGNlcHRpb24gdGhyb3duIGlzIGBpZGVudGljYWxgIHRvIHRoZSBlcnJvciBhcmd1bWVudCB0byBgb25FcnJvcmAsCiAgICogdGhlIHRocm93IGlzIGNvbnNpZGVyZWQgYSByZXRocm93LAogICAqIGFuZCB0aGUgb3JpZ2luYWwgc3RhY2sgdHJhY2UgaXMgdXNlZCBpbnN0ZWFkLgogICAqCiAgICogSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSBbRnV0dXJlXSwKICAgKiB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGB0aGVuYCB3aWxsIGJlIGNvbXBsZXRlZCB3aXRoCiAgICogdGhlIHNhbWUgcmVzdWx0IGFzIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrLgogICAqCiAgICogSWYgW29uRXJyb3JdIGlzIG5vdCBnaXZlbiwgYW5kIHRoaXMgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLAogICAqIHRoZSBlcnJvciBpcyBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIHJldHVybmVkIGZ1dHVyZS4KICAgKgogICAqIEluIG1vc3QgY2FzZXMsIGl0IGlzIG1vcmUgcmVhZGFibGUgdG8gdXNlIFtjYXRjaEVycm9yXSBzZXBhcmF0ZWx5LCBwb3NzaWJseQogICAqIHdpdGggYSBgdGVzdGAgcGFyYW1ldGVyLCBpbnN0ZWFkIG9mIGhhbmRsaW5nIGJvdGggdmFsdWUgYW5kIGVycm9yIGluIGEKICAgKiBzaW5nbGUgW3RoZW5dIGNhbGwuCiAgICoKICAgKiBOb3RlIHRoYXQgZnV0dXJlcyBkb24ndCBkZWxheSByZXBvcnRpbmcgb2YgZXJyb3JzIHVudGlsIGxpc3RlbmVycyBhcmUKICAgKiBhZGRlZC4gSWYgdGhlIGZpcnN0IGB0aGVuYCBvciBgY2F0Y2hFcnJvcmAgY2FsbCBoYXBwZW5zIGFmdGVyIHRoaXMgZnV0dXJlCiAgICogaGFzIGNvbXBsZXRlZCB3aXRoIGFuIGVycm9yIHRoZW4gdGhlIGVycm9yIGlzIHJlcG9ydGVkIGFzIHVuaGFuZGxlZCBlcnJvci4KICAgKiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9uIFtGdXR1cmVdLgogICAqLwogIEZ1dHVyZTxSPiB0aGVuPFI+KEZ1dHVyZU9yPFI+IG9uVmFsdWUoVCB2YWx1ZSksIHtGdW5jdGlvbiBvbkVycm9yfSk7CgogIC8qKgogICAqIEhhbmRsZXMgZXJyb3JzIGVtaXR0ZWQgYnkgdGhpcyBbRnV0dXJlXS4KICAgKgogICAqIFRoaXMgaXMgdGhlIGFzeW5jaHJvbm91cyBlcXVpdmFsZW50IG9mIGEgImNhdGNoIiBibG9jay4KICAgKgogICAqIFJldHVybnMgYSBuZXcgW0Z1dHVyZV0gdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCB3aXRoIGVpdGhlciB0aGUgcmVzdWx0IG9mCiAgICogdGhpcyBmdXR1cmUgb3IgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBgb25FcnJvcmAgY2FsbGJhY2suCiAgICoKICAgKiBJZiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhIHZhbHVlLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhlIHNhbWUgdmFsdWUuCiAgICoKICAgKiBJZiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvciwKICAgKiB0aGVuIFt0ZXN0XSBpcyBmaXJzdCBjYWxsZWQgd2l0aCB0aGUgZXJyb3IgdmFsdWUuCiAgICoKICAgKiBJZiBgdGVzdGAgcmV0dXJucyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBieSB0aGlzIGBjYXRjaEVycm9yYCwKICAgKiBhbmQgdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCB0aGUgc2FtZSBlcnJvciBhbmQgc3RhY2sgdHJhY2UKICAgKiBhcyB0aGlzIGZ1dHVyZS4KICAgKgogICAqIElmIGB0ZXN0YCByZXR1cm5zIGB0cnVlYCwKICAgKiBbb25FcnJvcl0gaXMgY2FsbGVkIHdpdGggdGhlIGVycm9yIGFuZCBwb3NzaWJseSBzdGFjayB0cmFjZSwKICAgKiBhbmQgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbAogICAqIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGZvciBbdGhlbl0ncyBgb25FcnJvcmAuCiAgICoKICAgKiBJZiBgdGVzdGAgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIHRydWUuCiAgICogVGhlIGB0ZXN0YCBmdW5jdGlvbiBzaG91bGQgbm90IHRocm93LCBidXQgaWYgaXQgZG9lcywgaXQgaXMgaGFuZGxlZCBhcwogICAqIGlmIHRoZSBgb25FcnJvcmAgZnVuY3Rpb24gaGFkIHRocm93bi4KICAgKgogICAqIE5vdGUgdGhhdCBmdXR1cmVzIGRvbid0IGRlbGF5IHJlcG9ydGluZyBvZiBlcnJvcnMgdW50aWwgbGlzdGVuZXJzIGFyZQogICAqIGFkZGVkLiBJZiB0aGUgZmlyc3QgYGNhdGNoRXJyb3JgIChvciBgdGhlbmApIGNhbGwgaGFwcGVucyBhZnRlciB0aGlzIGZ1dHVyZQogICAqIGhhcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciB0aGVuIHRoZSBlcnJvciBpcyByZXBvcnRlZCBhcyB1bmhhbmRsZWQgZXJyb3IuCiAgICogU2VlIHRoZSBkZXNjcmlwdGlvbiBvbiBbRnV0dXJlXS4KICAgKi8KICAvLyBUaGUgYEZ1bmN0aW9uYCBiZWxvdyBzdGFuZHMgZm9yIG9uZSBvZiB0d28gdHlwZXM6CiAgLy8gLSAoZHluYW1pYykgLT4gRnV0dXJlT3I8VD4KICAvLyAtIChkeW5hbWljLCBTdGFja1RyYWNlKSAtPiBGdXR1cmVPcjxUPgogIC8vIEdpdmVuIHRoYXQgdGhlcmUgaXMgYSBgdGVzdGAgZnVuY3Rpb24gdGhhdCBpcyB1c3VhbGx5IHVzZWQgdG8gZG8gYW4KICAvLyBgaXNDaGVja2Agd2Ugc2hvdWxkIGFsc28gZXhwZWN0IGZ1bmN0aW9ucyB0aGF0IHRha2UgYSBzcGVjaWZpYyBhcmd1bWVudC4KICAvLyBOb3RlOiBtYWtpbmcgYGNhdGNoRXJyb3JgIHJldHVybiBhIGBGdXR1cmU8VD5gIGluIG5vbi1zdHJvbmcgbW9kZSBjb3VsZCBiZQogIC8vIGEgYnJlYWtpbmcgY2hhbmdlLgogIEZ1dHVyZTxUPiBjYXRjaEVycm9yKEZ1bmN0aW9uIG9uRXJyb3IsIHtib29sIHRlc3QoT2JqZWN0IGVycm9yKX0pOwoKICAvKioKICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMuCiAgICoKICAgKiBUaGUgW2FjdGlvbl0gZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhpcyBmdXR1cmUgY29tcGxldGVzLCB3aGV0aGVyIGl0CiAgICogZG9lcyBzbyB3aXRoIGEgdmFsdWUgb3Igd2l0aCBhbiBlcnJvci4KICAgKgogICAqIFRoaXMgaXMgdGhlIGFzeW5jaHJvbm91cyBlcXVpdmFsZW50IG9mIGEgImZpbmFsbHkiIGJsb2NrLgogICAqCiAgICogVGhlIGZ1dHVyZSByZXR1cm5lZCBieSB0aGlzIGNhbGwsIGBmYCwgd2lsbCBjb21wbGV0ZSB0aGUgc2FtZSB3YXkKICAgKiBhcyB0aGlzIGZ1dHVyZSB1bmxlc3MgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBbYWN0aW9uXSBjYWxsLCBvciBpbgogICAqIGEgW0Z1dHVyZV0gcmV0dXJuZWQgYnkgdGhlIFthY3Rpb25dIGNhbGwuIElmIHRoZSBjYWxsIHRvIFthY3Rpb25dCiAgICogZG9lcyBub3QgcmV0dXJuIGEgZnV0dXJlLCBpdHMgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCiAgICoKICAgKiBJZiB0aGUgY2FsbCB0byBbYWN0aW9uXSB0aHJvd3MsIHRoZW4gYGZgIGlzIGNvbXBsZXRlZCB3aXRoIHRoZQogICAqIHRocm93biBlcnJvci4KICAgKgogICAqIElmIHRoZSBjYWxsIHRvIFthY3Rpb25dIHJldHVybnMgYSBbRnV0dXJlXSwgYGYyYCwgdGhlbiBjb21wbGV0aW9uIG9mCiAgICogYGZgIGlzIGRlbGF5ZWQgdW50aWwgYGYyYCBjb21wbGV0ZXMuIElmIGBmMmAgY29tcGxldGVzIHdpdGgKICAgKiBhbiBlcnJvciwgdGhhdCB3aWxsIGJlIHRoZSByZXN1bHQgb2YgYGZgIHRvby4gVGhlIHZhbHVlIG9mIGBmMmAgaXMgYWx3YXlzCiAgICogaWdub3JlZC4KICAgKgogICAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG86CiAgICoKICAgKiAgICAgRnV0dXJlPFQ+IHdoZW5Db21wbGV0ZShhY3Rpb24oKSkgewogICAqICAgICAgIHJldHVybiB0aGlzLnRoZW4oKHYpIHsKICAgKiAgICAgICAgIHZhciBmMiA9IGFjdGlvbigpOwogICAqICAgICAgICAgaWYgKGYyIGlzIEZ1dHVyZSkgcmV0dXJuIGYyLnRoZW4oKF8pID0+IHYpOwogICAqICAgICAgICAgcmV0dXJuIHYKICAgKiAgICAgICB9LCBvbkVycm9yOiAoZSkgewogICAqICAgICAgICAgdmFyIGYyID0gYWN0aW9uKCk7CiAgICogICAgICAgICBpZiAoZjIgaXMgRnV0dXJlKSByZXR1cm4gZjIudGhlbigoXykgeyB0aHJvdyBlOyB9KTsKICAgKiAgICAgICAgIHRocm93IGU7CiAgICogICAgICAgfSk7CiAgICogICAgIH0KICAgKi8KICBGdXR1cmU8VD4gd2hlbkNvbXBsZXRlKEZ1dHVyZU9yIGFjdGlvbigpKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdHJlYW1dIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1dHVyZS4KICAgKgogICAqIFRoZSBzdHJlYW0gd2lsbCBwcm9kdWNlIHNpbmdsZSBkYXRhIG9yIGVycm9yIGV2ZW50IGNvbnRhaW5pbmcgdGhlCiAgICogY29tcGxldGlvbiByZXN1bHQgb2YgdGhpcyBmdXR1cmUsIGFuZCB0aGVuIGl0IHdpbGwgY2xvc2Ugd2l0aCBhCiAgICogZG9uZSBldmVudC4KICAgKgogICAqIElmIHRoZSBmdXR1cmUgbmV2ZXIgY29tcGxldGVzLCB0aGUgc3RyZWFtIHdpbGwgbm90IHByb2R1Y2UgYW55IGV2ZW50cy4KICAgKi8KICBTdHJlYW08VD4gYXNTdHJlYW0oKTsKCiAgLyoqCiAgICogVGltZS1vdXQgdGhlIGZ1dHVyZSBjb21wdXRhdGlvbiBhZnRlciBbdGltZUxpbWl0XSBoYXMgcGFzc2VkLgogICAqCiAgICogUmV0dXJucyBhIG5ldyBmdXR1cmUgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGlzIGZ1dHVyZSwKICAgKiBpZiB0aGlzIGZ1dHVyZSBjb21wbGV0ZXMgaW4gdGltZS4KICAgKgogICAqIElmIHRoaXMgZnV0dXJlIGRvZXMgbm90IGNvbXBsZXRlIGJlZm9yZSBgdGltZUxpbWl0YCBoYXMgcGFzc2VkLAogICAqIHRoZSBbb25UaW1lb3V0XSBhY3Rpb24gaXMgZXhlY3V0ZWQgaW5zdGVhZCwgYW5kIGl0cyByZXN1bHQgKHdoZXRoZXIgaXQKICAgKiByZXR1cm5zIG9yIHRocm93cykgaXMgdXNlZCBhcyB0aGUgcmVzdWx0IG9mIHRoZSByZXR1cm5lZCBmdXR1cmUuCiAgICogVGhlIFtvblRpbWVvdXRdIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgW1RdIG9yIGEgYEZ1dHVyZTxUPmAuCiAgICoKICAgKiBJZiBgb25UaW1lb3V0YCBpcyBvbWl0dGVkLCBhIHRpbWVvdXQgd2lsbCBjYXVzZSB0aGUgcmV0dXJuZWQgZnV0dXJlIHRvCiAgICogY29tcGxldGUgd2l0aCBhIFtUaW1lb3V0RXhjZXB0aW9uXS4KICAgKi8KICBGdXR1cmU8VD4gdGltZW91dChEdXJhdGlvbiB0aW1lTGltaXQsIHtGdXR1cmVPcjxUPiBvblRpbWVvdXQoKX0pOwp9CgovKioKICogVGhyb3duIHdoZW4gYSBzY2hlZHVsZWQgdGltZW91dCBoYXBwZW5zIHdoaWxlIHdhaXRpbmcgZm9yIGFuIGFzeW5jIHJlc3VsdC4KICovCmNsYXNzIFRpbWVvdXRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIC8qKiBEZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2Ugb2YgdGhlIHRpbWVvdXQuICovCiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgLyoqIFRoZSBkdXJhdGlvbiB0aGF0IHdhcyBleGNlZWRlZC4gKi8KICBmaW5hbCBEdXJhdGlvbiBkdXJhdGlvbjsKCiAgVGltZW91dEV4Y2VwdGlvbih0aGlzLm1lc3NhZ2UsIFt0aGlzLmR1cmF0aW9uXSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZyByZXN1bHQgPSAiVGltZW91dEV4Y2VwdGlvbiI7CiAgICBpZiAoZHVyYXRpb24gIT0gbnVsbCkgcmVzdWx0ID0gIlRpbWVvdXRFeGNlcHRpb24gYWZ0ZXIgJGR1cmF0aW9uIjsKICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHJlc3VsdCA9ICIkcmVzdWx0OiAkbWVzc2FnZSI7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKLyoqCiAqIEEgd2F5IHRvIHByb2R1Y2UgRnV0dXJlIG9iamVjdHMgYW5kIHRvIGNvbXBsZXRlIHRoZW0gbGF0ZXIKICogd2l0aCBhIHZhbHVlIG9yIGVycm9yLgogKgogKiBNb3N0IG9mIHRoZSB0aW1lLCB0aGUgc2ltcGxlc3Qgd2F5IHRvIGNyZWF0ZSBhIGZ1dHVyZSBpcyB0byBqdXN0IHVzZQogKiBvbmUgb2YgdGhlIFtGdXR1cmVdIGNvbnN0cnVjdG9ycyB0byBjYXB0dXJlIHRoZSByZXN1bHQgb2YgYSBzaW5nbGUKICogYXN5bmNocm9ub3VzIGNvbXB1dGF0aW9uOgogKiBgYGAKICogbmV3IEZ1dHVyZSgoKSB7IGRvU29tZXRoaW5nKCk7IHJldHVybiByZXN1bHQ7IH0pOwogKiBgYGAKICogb3IsIGlmIHRoZSBmdXR1cmUgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgc2VxdWVuY2Ugb2YgYXN5bmNocm9ub3VzCiAqIGNvbXB1dGF0aW9ucywgdGhleSBjYW4gYmUgY2hhaW5lZCB1c2luZyBbRnV0dXJlLnRoZW5dIG9yIHNpbWlsYXIgZnVuY3Rpb25zCiAqIG9uIFtGdXR1cmVdOgogKiBgYGAKICogRnV0dXJlIGRvU3R1ZmYoKXsKICogICByZXR1cm4gc29tZUFzeW5jT3BlcmF0aW9uKCkudGhlbigocmVzdWx0KSB7CiAqICAgICByZXR1cm4gc29tZU90aGVyQXN5bmNPcGVyYXRpb24ocmVzdWx0KTsKICogICB9KTsKICogfQogKiBgYGAKICogSWYgeW91IGRvIG5lZWQgdG8gY3JlYXRlIGEgRnV0dXJlIGZyb20gc2NyYXRjaCDigJQgZm9yIGV4YW1wbGUsCiAqIHdoZW4geW91J3JlIGNvbnZlcnRpbmcgYSBjYWxsYmFjay1iYXNlZCBBUEkgaW50byBhIEZ1dHVyZS1iYXNlZAogKiBvbmUg4oCUIHlvdSBjYW4gdXNlIGEgQ29tcGxldGVyIGFzIGZvbGxvd3M6CiAqIGBgYAogKiBjbGFzcyBBc3luY09wZXJhdGlvbiB7CiAqICAgQ29tcGxldGVyIF9jb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAqCiAqICAgRnV0dXJlPFQ+IGRvT3BlcmF0aW9uKCkgewogKiAgICAgX3N0YXJ0T3BlcmF0aW9uKCk7CiAqICAgICByZXR1cm4gX2NvbXBsZXRlci5mdXR1cmU7IC8vIFNlbmQgZnV0dXJlIG9iamVjdCBiYWNrIHRvIGNsaWVudC4KICogICB9CiAqCiAqICAgLy8gU29tZXRoaW5nIGNhbGxzIHRoaXMgd2hlbiB0aGUgdmFsdWUgaXMgcmVhZHkuCiAqICAgdm9pZCBfZmluaXNoT3BlcmF0aW9uKFQgcmVzdWx0KSB7CiAqICAgICBfY29tcGxldGVyLmNvbXBsZXRlKHJlc3VsdCk7CiAqICAgfQogKgogKiAgIC8vIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBjYWxsIHRoaXMuCiAqICAgdm9pZCBfZXJyb3JIYXBwZW5lZChlcnJvcikgewogKiAgICAgX2NvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yKTsKICogICB9CiAqIH0KICogYGBgCiAqLwphYnN0cmFjdCBjbGFzcyBDb21wbGV0ZXI8VD4gewogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGVyLgogICAqCiAgICogVGhlIGdlbmVyYWwgd29ya2Zsb3cgZm9yIGNyZWF0aW5nIGEgbmV3IGZ1dHVyZSBpcyB0byAxKSBjcmVhdGUgYQogICAqIG5ldyBjb21wbGV0ZXIsIDIpIGhhbmQgb3V0IGl0cyBmdXR1cmUsIGFuZCwgYXQgYSBsYXRlciBwb2ludCwgMykgaW52b2tlCiAgICogZWl0aGVyIFtjb21wbGV0ZV0gb3IgW2NvbXBsZXRlRXJyb3JdLgogICAqCiAgICogVGhlIGNvbXBsZXRlciBjb21wbGV0ZXMgdGhlIGZ1dHVyZSBhc3luY2hyb25vdXNseS4gVGhhdCBtZWFucyB0aGF0CiAgICogY2FsbGJhY2tzIHJlZ2lzdGVyZWQgb24gdGhlIGZ1dHVyZSBhcmUgbm90IGNhbGxlZCBpbW1lZGlhdGVseSB3aGVuCiAgICogW2NvbXBsZXRlXSBvciBbY29tcGxldGVFcnJvcl0gaXMgY2FsbGVkLiBJbnN0ZWFkIHRoZSBjYWxsYmFja3MgYXJlCiAgICogZGVsYXllZCB1bnRpbCBhIGxhdGVyIG1pY3JvdGFzay4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICAgKiBoYW5kT3V0KGNvbXBsZXRlci5mdXR1cmUpOwogICAqIGxhdGVyOiB7CiAgICogICBjb21wbGV0ZXIuY29tcGxldGUoJ2NvbXBsZXRpb24gdmFsdWUnKTsKICAgKiB9CiAgICogYGBgCiAgICovCiAgZmFjdG9yeSBDb21wbGV0ZXIoKSA9PiBuZXcgX0FzeW5jQ29tcGxldGVyPFQ+KCk7CgogIC8qKgogICAqIENvbXBsZXRlcyB0aGUgZnV0dXJlIHN5bmNocm9ub3VzbHkuCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgY29tcGxldGlvbiBvZiB0aGUgZnV0dXJlIGlzCiAgICoga25vd24gdG8gYmUgdGhlIGZpbmFsIHJlc3VsdCBvZiBhbm90aGVyIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIElmIGluIGRvdWJ0CiAgICogdXNlIHRoZSBkZWZhdWx0IFtDb21wbGV0ZXJdIGNvbnN0cnVjdG9yLgogICAqCiAgICogVXNpbmcgYW4gbm9ybWFsLCBhc3luY2hyb25vdXMsIGNvbXBsZXRlciB3aWxsIG5ldmVyIGdpdmUgdGhlIHdyb25nCiAgICogYmVoYXZpb3IsIGJ1dCB1c2luZyBhIHN5bmNocm9ub3VzIGNvbXBsZXRlciBpbmNvcnJlY3RseSBjYW4gY2F1c2UKICAgKiBvdGhlcndpc2UgY29ycmVjdCBwcm9ncmFtcyB0byBicmVhay4KICAgKgogICAqIEEgc3luY2hyb25vdXMgY29tcGxldGVyIGlzIG9ubHkgaW50ZW5kZWQgZm9yIG9wdGltaXppbmcgZXZlbnQKICAgKiBwcm9wYWdhdGlvbiB3aGVuIG9uZSBhc3luY2hyb25vdXMgZXZlbnQgaW1tZWRpYXRlbHkgdHJpZ2dlcnMgYW5vdGhlci4KICAgKiBJdCBzaG91bGQgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBjYWxscyB0byBbY29tcGxldGVdIGFuZCBbY29tcGxldGVFcnJvcl0KICAgKiBhcmUgZ3VhcmFudGVlZCB0byBvY2N1ciBpbiBwbGFjZXMgd2hlcmUgaXQgd29uJ3QgYnJlYWsgYEZ1dHVyZWAgaW52YXJpYW50cy4KICAgKgogICAqIENvbXBsZXRpbmcgc3luY2hyb25vdXNseSBtZWFucyB0aGF0IHRoZSBjb21wbGV0ZXIncyBmdXR1cmUgd2lsbCBiZQogICAqIGNvbXBsZXRlZCBpbW1lZGlhdGVseSB3aGVuIGNhbGxpbmcgdGhlIFtjb21wbGV0ZV0gb3IgW2NvbXBsZXRlRXJyb3JdCiAgICogbWV0aG9kIG9uIGEgc3luY2hyb25vdXMgY29tcGxldGVyLCB3aGljaCBhbHNvIGNhbGxzIGFueSBjYWxsYmFja3MKICAgKiByZWdpc3RlcmVkIG9uIHRoYXQgZnV0dXJlLgogICAqCiAgICogQ29tcGxldGluZyBzeW5jaHJvbm91c2x5IG11c3Qgbm90IGJyZWFrIHRoZSBydWxlIHRoYXQgd2hlbiB5b3UgYWRkIGEKICAgKiBjYWxsYmFjayBvbiBhIGZ1dHVyZSwgdGhhdCBjYWxsYmFjayBtdXN0IG5vdCBiZSBjYWxsZWQgdW50aWwgdGhlIGNvZGUKICAgKiB0aGF0IGFkZGVkIHRoZSBjYWxsYmFjayBoYXMgY29tcGxldGVkLgogICAqIEZvciB0aGF0IHJlYXNvbiwgYSBzeW5jaHJvbm91cyBjb21wbGV0aW9uIG11c3Qgb25seSBvY2N1ciBhdCB0aGUgdmVyeSBlbmQKICAgKiAoaW4gInRhaWwgcG9zaXRpb24iKSBvZiBhbm90aGVyIHN5bmNocm9ub3VzIGV2ZW50LAogICAqIGJlY2F1c2UgYXQgdGhhdCBwb2ludCwgY29tcGxldGluZyB0aGUgZnV0dXJlIGltbWVkaWF0ZWx5IGlzIGJlIGVxdWl2YWxlbnQKICAgKiB0byByZXR1cm5pbmcgdG8gdGhlIGV2ZW50IGxvb3AgYW5kIGNvbXBsZXRpbmcgdGhlIGZ1dHVyZSBpbiB0aGUgbmV4dAogICAqIG1pY3JvdGFzay4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiAgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIuc3luYygpOwogICAqICAgICAvLyBUaGUgY29tcGxldGlvbiBpcyB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY2hyb25vdXMgb25Eb25lIGV2ZW50LgogICAqICAgICAvLyBObyBvdGhlciBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFmdGVyIHRoZSBjb21wbGV0aW9uLiBJdCBpcyBzYWZlCiAgICogICAgIC8vIHRvIHVzZSB0aGUgQ29tcGxldGVyLnN5bmMgY29uc3RydWN0b3IuCiAgICogICAgIHN0cmVhbS5saXN0ZW4ocHJpbnQsIG9uRG9uZTogKCkgeyBjb21wbGV0ZXIuY29tcGxldGUoImRvbmUiKTsgfSk7CiAgICoKICAgKiBCYWQgZXhhbXBsZS4gRG8gbm90IHVzZSB0aGlzIGNvZGUuIE9ubHkgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3NlczoKICAgKgogICAqICAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlci5zeW5jKCk7CiAgICogICAgIGNvbXBsZXRlci5mdXR1cmUudGhlbigoXykgeyBiYXIoKTsgfSk7CiAgICogICAgIC8vIFRoZSBjb21wbGV0aW9uIGlzIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jaHJvbm91cyBvbkRvbmUgZXZlbnQuCiAgICogICAgIC8vIEhvd2V2ZXIsIHRoZXJlIGlzIHN0aWxsIGNvZGUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGNvbXBsZXRpb24uIFRoaXMKICAgKiAgICAgLy8gb3BlcmF0aW9uIGlzICpub3QqIHNhZmUuCiAgICogICAgIHN0cmVhbS5saXN0ZW4ocHJpbnQsIG9uRG9uZTogKCkgewogICAqICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSgiZG9uZSIpOwogICAqICAgICAgIGZvbygpOyAgLy8gSW4gdGhpcyBjYXNlLCBmb28oKSBydW5zIGFmdGVyIGJhcigpLgogICAqICAgICB9KTsKICAgKi8KICBmYWN0b3J5IENvbXBsZXRlci5zeW5jKCkgPT4gbmV3IF9TeW5jQ29tcGxldGVyPFQ+KCk7CgogIC8qKgogICAqIFRoZSBmdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQgYnkgdGhpcyBjb21wbGV0ZXIuCiAgICoKICAgKiBUaGUgZnV0dXJlIHRoYXQgaXMgY29tcGxldGVkIHdoZW4gW2NvbXBsZXRlXSBvciBbY29tcGxldGVFcnJvcl0gaXMgY2FsbGVkLgogICAqLwogIEZ1dHVyZTxUPiBnZXQgZnV0dXJlOwoKICAvKioKICAgKiBDb21wbGV0ZXMgW2Z1dHVyZV0gd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzLgogICAqCiAgICogVGhlIHZhbHVlIG11c3QgYmUgZWl0aGVyIGEgdmFsdWUgb2YgdHlwZSBbVF0KICAgKiBvciBhIGZ1dHVyZSBvZiB0eXBlIGBGdXR1cmU8VD5gLgogICAqCiAgICogSWYgdGhlIHZhbHVlIGlzIGl0c2VsZiBhIGZ1dHVyZSwgdGhlIGNvbXBsZXRlciB3aWxsIHdhaXQgZm9yIHRoYXQgZnV0dXJlCiAgICogdG8gY29tcGxldGUsIGFuZCBjb21wbGV0ZSB3aXRoIHRoZSBzYW1lIHJlc3VsdCwgd2hldGhlciBpdCBpcyBhIHN1Y2Nlc3MKICAgKiBvciBhbiBlcnJvci4KICAgKgogICAqIENhbGxpbmcgW2NvbXBsZXRlXSBvciBbY29tcGxldGVFcnJvcl0gbXVzdCBiZSBkb25lIGF0IG1vc3Qgb25jZS4KICAgKgogICAqIEFsbCBsaXN0ZW5lcnMgb24gdGhlIGZ1dHVyZSBhcmUgaW5mb3JtZWQgYWJvdXQgdGhlIHZhbHVlLgogICAqLwogIHZvaWQgY29tcGxldGUoW0Z1dHVyZU9yPFQ+IHZhbHVlXSk7CgogIC8qKgogICAqIENvbXBsZXRlIFtmdXR1cmVdIHdpdGggYW4gZXJyb3IuCiAgICoKICAgKiBDYWxsaW5nIFtjb21wbGV0ZV0gb3IgW2NvbXBsZXRlRXJyb3JdIG11c3QgYmUgZG9uZSBhdCBtb3N0IG9uY2UuCiAgICoKICAgKiBDb21wbGV0aW5nIGEgZnV0dXJlIHdpdGggYW4gZXJyb3IgaW5kaWNhdGVzIHRoYXQgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24KICAgKiB3aGlsZSB0cnlpbmcgdG8gcHJvZHVjZSBhIHZhbHVlLgogICAqCiAgICogSWYgW2Vycm9yXSBpcyBgbnVsbGAsIGl0IGlzIHJlcGxhY2VkIGJ5IGEgW051bGxUaHJvd25FcnJvcl0uCiAgICoKICAgKiBJZiBgZXJyb3JgIGlzIGEgYEZ1dHVyZWAsIHRoZSBmdXR1cmUgaXRzZWxmIGlzIHVzZWQgYXMgdGhlIGVycm9yIHZhbHVlLgogICAqIElmIHlvdSB3YW50IHRvIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgZnV0dXJlLCB5b3UgY2FuIHVzZToKICAgKiBgYGAKICAgKiB0aGlzQ29tcGxldGVyLmNvbXBsZXRlKHRoZUZ1dHVyZSkKICAgKiBgYGAKICAgKiBvciBpZiB5b3Ugb25seSB3YW50IHRvIGhhbmRsZSBhbiBlcnJvciBmcm9tIHRoZSBmdXR1cmU6CiAgICogYGBgCiAgICogdGhlRnV0dXJlLmNhdGNoRXJyb3IodGhpc0NvbXBsZXRlci5jb21wbGV0ZUVycm9yKTsKICAgKiBgYGAKICAgKi8KICB2b2lkIGNvbXBsZXRlRXJyb3IoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSk7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIFtmdXR1cmVdIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgKgogICAqIFJlZmxlY3RzIHdoZXRoZXIgW2NvbXBsZXRlXSBvciBbY29tcGxldGVFcnJvcl0gaGFzIGJlZW4gY2FsbGVkLgogICAqIEEgYHRydWVgIHZhbHVlIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IGxpc3RlbmVycyBvZiB0aGlzIGZ1dHVyZQogICAqIGhhdmUgYmVlbiBpbnZva2VkIHlldCwgZWl0aGVyIGJlY2F1c2UgdGhlIGNvbXBsZXRlciB1c3VhbGx5IHdhaXRzIHVudGlsCiAgICogYSBsYXRlciBtaWNyb3Rhc2sgdG8gcHJvcGFnYXRlIHRoZSByZXN1bHQsIG9yIGJlY2F1c2UgW2NvbXBsZXRlXQogICAqIHdhcyBjYWxsZWQgd2l0aCBhIGZ1dHVyZSB0aGF0IGhhc24ndCBjb21wbGV0ZWQgeWV0LgogICAqCiAgICogV2hlbiB0aGlzIHZhbHVlIGlzIGB0cnVlYCwgW2NvbXBsZXRlXSBhbmQgW2NvbXBsZXRlRXJyb3JdIG11c3Qgbm90IGJlCiAgICogY2FsbGVkIGFnYWluLgogICAqLwogIGJvb2wgZ2V0IGlzQ29tcGxldGVkOwp9CgovLyBIZWxwZXIgZnVuY3Rpb24gY29tcGxldGluZyBhIF9GdXR1cmUgd2l0aCBlcnJvciwgYnV0IGNoZWNraW5nIHRoZSB6b25lCi8vIGZvciBlcnJvciByZXBsYWNlbWVudCBmaXJzdC4Kdm9pZCBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhfRnV0dXJlIHJlc3VsdCwgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSkgewogIEFzeW5jRXJyb3IgcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CiAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKICAgIGVycm9yID0gX25vbk51bGxFcnJvcihyZXBsYWNlbWVudC5lcnJvcik7CiAgICBzdGFja1RyYWNlID0gcmVwbGFjZW1lbnQuc3RhY2tUcmFjZTsKICB9CiAgcmVzdWx0Ll9jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKfQoKLy8gTGlrZSBbX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2tdIGJ1dCBjb21wbGV0ZXMgYXN5bmNocm9ub3VzbHkuCnZvaWQgX2FzeW5jQ29tcGxldGVXaXRoRXJyb3JDYWxsYmFjaygKICAgIF9GdXR1cmUgcmVzdWx0LCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgQXN5bmNFcnJvciByZXBsYWNlbWVudCA9IFpvbmUuY3VycmVudC5lcnJvckNhbGxiYWNrKGVycm9yLCBzdGFja1RyYWNlKTsKICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewogICAgZXJyb3IgPSBfbm9uTnVsbEVycm9yKHJlcGxhY2VtZW50LmVycm9yKTsKICAgIHN0YWNrVHJhY2UgPSByZXBsYWNlbWVudC5zdGFja1RyYWNlOwogIH0KICByZXN1bHQuX2FzeW5jQ29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7Cn0KCi8qKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBgbnVsbGAgdG8gYSBbTnVsbFRocm93bkVycm9yXS4gKi8KT2JqZWN0IF9ub25OdWxsRXJyb3IoT2JqZWN0IGVycm9yKSA9PiBlcnJvciA/PyBuZXcgTnVsbFRocm93bkVycm9yKCk7CoOlAE5OPAEUAUMEQE8TBEwQBFEEDw1OIDAEQiYIBA9RQUtKTT0EOE4WHVETEUIEAgEEMQNANjI4EAMpMjkDLCgqLgNIUCEsQT1NA0ZLG0wQBzU9RAgUPhtIEEMJCQcDSj4/SUw6Bx0xSkVJNS80BwcDTEFMQE5RHk8eRQcYCRgYEREFBwMzB0oqIgcDR0lKQwNOSQNLCwQbLis0AS8sNQEGRSYFTR8FP0cyBUkWBi4qEwwpFzIICBMEAQZFLgUoPQVARzIFOjcGOCobDCkXMggIEwQBBkMUBVAMBU4FOkQGMwoiIRcPLQgiJU4hJEcPNwgVBgQBBi4FPkpKRQVDHTgFPwYuLAQBBjQFT1BMIwVCBT8GQCIvTiEyLQgGPQQBBj8FT0UFKE0bBSNDJAUiPkQFUAwFSUUGSyodISAPDisZNAoICBMEAQZIBUhIIwVMSxAFLDlPBUpLT0IFSSxLTzwFTiIGPkA8Qj8xRwEwTxo2ExwfJiE6IyASDgwKFyw6ERwmCjIyCAYBCkgpJB0gFyAhIjEOEzQ6IyASDjE4DgwiP0k+FQgcKwgnFkpFKiVOSRtNNCgPTxIuExkIBhMEAQZGBUM4LDkFQCoGOS0ePQcuSQciLgYdBAEGQwU9BT5ITAVPEAVOFAU7RwZPJhguLTgTCAQBPiEBBkAFSQVQTQVLTxoFTUgkBS80SE4mBjMoJ086ShBNGh8OHSZIJ0oSCiZKEgocCCIIGRcEAQZBBS48Sj4FSEtNKSk7OEtMFAUcQS0/BSU8Jh9QKDMFKTo9BUk9BVFMGQVLT1AmBkcBBi4FPQVNQgUsOAUtNwVRSxUFH0JHOAVPTCsFS1FQJgY3ICxJTlAYRQEGQwVMLAU/BUdHRzwFRBMFSkFPDgUjBSwiIDkWHSBBFg8LBi0BBj4FR0URBUwGGAEGQwVNJwVFTEZCBUwpBkQCAQROBC4yGCkbATMBFihHNxMEAgEEPhoDSEYdBzUHSU4QBxUxLwkFB0FDLQcaLQMfGkcHAzYnJAcDLCIoBwUHBB4GHgVGTSsFSEhIJgUOCSYgDi8HCQYzAQYpBU9RLgVIRyoFQ0tOUQVISkcgBUpLLE84T0oQBQ4FL0tNM0sFSAUvMEtNJSsnPA0GNwEGNQVQBhgBBjIFMiYFTk0SBUYFPwYmAQYmBUYFTiYFQgVNSQknCT0JOAkGPQEGLgVFS01GOQVLEwYYAgFKIFBKHS4pBCwCAUMmNEodLikEMQIBREYBFmRhcnQ6YXN5bmMvZnV0dXJlLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2FzeW5jL3N0cmVhbS5kYXJ0wAEydi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuYXN5bmM7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvcmUgU3RyZWFtIHR5cGVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnR5cGVkZWYgdm9pZCBfVGltZXJDYWxsYmFjaygpOwoKLyoqCiAqIEEgc291cmNlIG9mIGFzeW5jaHJvbm91cyBkYXRhIGV2ZW50cy4KICoKICogQSBTdHJlYW0gcHJvdmlkZXMgYSB3YXkgdG8gcmVjZWl2ZSBhIHNlcXVlbmNlIG9mIGV2ZW50cy4KICogRWFjaCBldmVudCBpcyBlaXRoZXIgYSBkYXRhIGV2ZW50LCBhbHNvIGNhbGxlZCBhbiAqZWxlbWVudCogb2YgdGhlIHN0cmVhbSwKICogb3IgYW4gZXJyb3IgZXZlbnQsIHdoaWNoIGlzIGEgbm90aWZpY2F0aW9uIHRoYXQgc29tZXRoaW5nIGhhcyBmYWlsZWQuCiAqIFdoZW4gYSBzdHJlYW0gaGFzIGVtaXR0ZWQgYWxsIGl0cyBldmVudCwKICogYSBzaW5nbGUgImRvbmUiIGV2ZW50IHdpbGwgbm90aWZ5IHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBlbmQgaGFzIGJlZW4gcmVhY2hlZC4KICoKICogWW91IFtsaXN0ZW5dIG9uIGEgc3RyZWFtIHRvIG1ha2UgaXQgc3RhcnQgZ2VuZXJhdGluZyBldmVudHMsCiAqIGFuZCB0byBzZXQgdXAgbGlzdGVuZXJzIHRoYXQgcmVjZWl2ZSB0aGUgZXZlbnRzLgogKiBXaGVuIHlvdSBsaXN0ZW4sIHlvdSByZWNlaXZlIGEgW1N0cmVhbVN1YnNjcmlwdGlvbl0gb2JqZWN0CiAqIHdoaWNoIGlzIHRoZSBhY3RpdmUgb2JqZWN0IHByb3ZpZGluZyB0aGUgZXZlbnRzLAogKiBhbmQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3RvcCBsaXN0ZW5pbmcgYWdhaW4sCiAqIG9yIHRvIHRlbXBvcmFyaWx5IHBhdXNlIGV2ZW50cyBmcm9tIHRoZSBzdWJzY3JpcHRpb24uCiAqCiAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2Ygc3RyZWFtczogIlNpbmdsZS1zdWJzY3JpcHRpb24iIHN0cmVhbXMgYW5kCiAqICJicm9hZGNhc3QiIHN0cmVhbXMuCiAqCiAqICpBIHNpbmdsZS1zdWJzY3JpcHRpb24gc3RyZWFtKiBhbGxvd3Mgb25seSBhIHNpbmdsZSBsaXN0ZW5lciBkdXJpbmcgdGhlIHdob2xlCiAqIGxpZmV0aW1lIG9mIHRoZSBzdHJlYW0uCiAqIEl0IGRvZXNuJ3Qgc3RhcnQgZ2VuZXJhdGluZyBldmVudHMgdW50aWwgaXQgaGFzIGEgbGlzdGVuZXIsCiAqIGFuZCBpdCBzdG9wcyBzZW5kaW5nIGV2ZW50cyB3aGVuIHRoZSBsaXN0ZW5lciBpcyB1bnN1YnNjcmliZWQsCiAqIGV2ZW4gaWYgdGhlIHNvdXJjZSBvZiBldmVudHMgY291bGQgc3RpbGwgcHJvdmlkZSBtb3JlLgogKgogKiBMaXN0ZW5pbmcgdHdpY2Ugb24gYSBzaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbSBpcyBub3QgYWxsb3dlZCwgZXZlbiBhZnRlcgogKiB0aGUgZmlyc3Qgc3Vic2NyaXB0aW9uIGhhcyBiZWVuIGNhbmNlbGVkLgogKgogKiBTaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbXMgYXJlIGdlbmVyYWxseSB1c2VkIGZvciBzdHJlYW1pbmcgY2h1bmtzIG9mCiAqIGxhcmdlciBjb250aWd1b3VzIGRhdGEgbGlrZSBmaWxlIEkvTy4KICoKICogKkEgYnJvYWRjYXN0IHN0cmVhbSogYWxsb3dzIGFueSBudW1iZXIgb2YgbGlzdGVuZXJzLCBhbmQgaXQgZmlyZXMKICogaXRzIGV2ZW50cyB3aGVuIHRoZXkgYXJlIHJlYWR5LCB3aGV0aGVyIHRoZXJlIGFyZSBsaXN0ZW5lcnMgb3Igbm90LgogKgogKiBCcm9hZGNhc3Qgc3RyZWFtcyBhcmUgdXNlZCBmb3IgaW5kZXBlbmRlbnQgZXZlbnRzL29ic2VydmVycy4KICoKICogSWYgc2V2ZXJhbCBsaXN0ZW5lcnMgd2FudCB0byBsaXN0ZW4gdG8gYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHN0cmVhbSwKICogdXNlIFthc0Jyb2FkY2FzdFN0cmVhbV0gdG8gY3JlYXRlIGEgYnJvYWRjYXN0IHN0cmVhbSBvbiB0b3Agb2YgdGhlCiAqIG5vbi1icm9hZGNhc3Qgc3RyZWFtLgogKgogKiBPbiBlaXRoZXIga2luZCBvZiBzdHJlYW0sIHN0cmVhbSB0cmFuc2Zvcm1hdGlvbnMsIHN1Y2ggYXMgW3doZXJlXSBhbmQKICogW3NraXBdLCByZXR1cm4gdGhlIHNhbWUgdHlwZSBvZiBzdHJlYW0gYXMgdGhlIG9uZSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgb24sCiAqIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQuCiAqCiAqIFdoZW4gYW4gZXZlbnQgaXMgZmlyZWQsIHRoZSBsaXN0ZW5lcihzKSBhdCB0aGF0IHRpbWUgd2lsbCByZWNlaXZlIHRoZSBldmVudC4KICogSWYgYSBsaXN0ZW5lciBpcyBhZGRlZCB0byBhIGJyb2FkY2FzdCBzdHJlYW0gd2hpbGUgYW4gZXZlbnQgaXMgYmVpbmcgZmlyZWQsCiAqIHRoYXQgbGlzdGVuZXIgd2lsbCBub3QgcmVjZWl2ZSB0aGUgZXZlbnQgY3VycmVudGx5IGJlaW5nIGZpcmVkLgogKiBJZiBhIGxpc3RlbmVyIGlzIGNhbmNlbGVkLCBpdCBpbW1lZGlhdGVseSBzdG9wcyByZWNlaXZpbmcgZXZlbnRzLgogKiBMaXN0ZW5pbmcgb24gYSBicm9hZGNhc3Qgc3RyZWFtIGNhbiBiZSB0cmVhdGVkIGFzIGxpc3RlbmluZyBvbiBhIG5ldyBzdHJlYW0KICogY29udGFpbmluZyBvbmx5IHRoZSBldmVudHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBlbWl0dGVkIHdoZW4gdGhlIFtsaXN0ZW5dCiAqIGNhbGwgb2NjdXJzLgogKiBGb3IgZXhhbXBsZSwgdGhlIFtmaXJzdF0gZ2V0dGVyIGxpc3RlbnMgdG8gdGhlIHN0cmVhbSwgdGhlbiByZXR1cm5zIHRoZSBmaXJzdAogKiBldmVudCB0aGF0IGxpc3RlbmVyIHJlY2VpdmVzLgogKiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgZmlyc3QgZXZlbiBlbWl0dGVkIGJ5IHRoZSBzdHJlYW0sIGJ1dCB0aGUgZmlyc3QKICogb2YgdGhlICpyZW1haW5pbmcqIGV2ZW50cyBvZiB0aGUgYnJvYWRjYXN0IHN0cmVhbS4KICoKICogV2hlbiB0aGUgImRvbmUiIGV2ZW50IGlzIGZpcmVkLCBzdWJzY3JpYmVycyBhcmUgdW5zdWJzY3JpYmVkIGJlZm9yZQogKiByZWNlaXZpbmcgdGhlIGV2ZW50LiBBZnRlciB0aGUgZXZlbnQgaGFzIGJlZW4gc2VudCwgdGhlIHN0cmVhbSBoYXMgbm8KICogc3Vic2NyaWJlcnMuIEFkZGluZyBuZXcgc3Vic2NyaWJlcnMgdG8gYSBicm9hZGNhc3Qgc3RyZWFtIGFmdGVyIHRoaXMgcG9pbnQKICogaXMgYWxsb3dlZCwgYnV0IHRoZXkgd2lsbCBqdXN0IHJlY2VpdmUgYSBuZXcgImRvbmUiIGV2ZW50IGFzIHNvb24KICogYXMgcG9zc2libGUuCiAqCiAqIFN0cmVhbSBzdWJzY3JpcHRpb25zIGFsd2F5cyByZXNwZWN0ICJwYXVzZSIgcmVxdWVzdHMuIElmIG5lY2Vzc2FyeSB0aGV5IG5lZWQKICogdG8gYnVmZmVyIHRoZWlyIGlucHV0LCBidXQgb2Z0ZW4sIGFuZCBwcmVmZXJhYmx5LCB0aGV5IGNhbiBzaW1wbHkgcmVxdWVzdAogKiB0aGVpciBpbnB1dCB0byBwYXVzZSB0b28uCiAqCiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFtpc0Jyb2FkY2FzdF0gcmV0dXJucyBmYWxzZS4KICogQSBicm9hZGNhc3Qgc3RyZWFtIGluaGVyaXRpbmcgZnJvbSBbU3RyZWFtXSBtdXN0IG92ZXJyaWRlIFtpc0Jyb2FkY2FzdF0KICogdG8gcmV0dXJuIGB0cnVlYC4KICovCmFic3RyYWN0IGNsYXNzIFN0cmVhbTxUPiB7CiAgU3RyZWFtKCk7CgogIC8qKgogICAqIEludGVybmFsIHVzZSBvbmx5LiBXZSBkbyBub3Qgd2FudCB0byBwcm9taXNlIHRoYXQgU3RyZWFtIHN0YXlzIGNvbnN0LgogICAqCiAgICogSWYgbWl4aW5zIGJlY29tZSBjb21wYXRpYmxlIHdpdGggY29uc3QgY29uc3RydWN0b3JzLCB3ZSBtYXkgdXNlIGEKICAgKiBzdHJlYW0gbWl4aW4gaW5zdGVhZCBvZiBleHRlbmRpbmcgU3RyZWFtIGZyb20gYSBjb25zdCBjbGFzcy4KICAgKi8KICBjb25zdCBTdHJlYW0uX2ludGVybmFsKCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gZW1wdHkgYnJvYWRjYXN0IHN0cmVhbS4KICAgKgogICAqIFRoaXMgaXMgYSBzdHJlYW0gd2hpY2ggZG9lcyBub3RoaW5nIGV4Y2VwdCBzZW5kaW5nIGEgZG9uZSBldmVudAogICAqIHdoZW4gaXQncyBsaXN0ZW5lZCB0by4KICAgKi8KICBjb25zdCBmYWN0b3J5IFN0cmVhbS5lbXB0eSgpID0gX0VtcHR5U3RyZWFtPFQ+OwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHNpbmdsZS1zdWJzY3JpcHRpb24gc3RyZWFtIGZyb20gdGhlIGZ1dHVyZS4KICAgKgogICAqIFdoZW4gdGhlIGZ1dHVyZSBjb21wbGV0ZXMsIHRoZSBzdHJlYW0gd2lsbCBmaXJlIG9uZSBldmVudCwgZWl0aGVyCiAgICogZGF0YSBvciBlcnJvciwgYW5kIHRoZW4gY2xvc2Ugd2l0aCBhIGRvbmUtZXZlbnQuCiAgICovCiAgZmFjdG9yeSBTdHJlYW0uZnJvbUZ1dHVyZShGdXR1cmU8VD4gZnV0dXJlKSB7CiAgICAvLyBVc2UgdGhlIGNvbnRyb2xsZXIncyBidWZmZXJpbmcgdG8gZmlsbCBpbiB0aGUgdmFsdWUgZXZlbiBiZWZvcmUKICAgIC8vIHRoZSBzdHJlYW0gaGFzIGEgbGlzdGVuZXIuIEZvciBhIHNpbmdsZSB2YWx1ZSwgaXQncyBub3Qgd29ydGggaXQKICAgIC8vIHRvIHdhaXQgZm9yIGEgbGlzdGVuZXIgYmVmb3JlIGRvaW5nIHRoZSBgdGhlbmAgb24gdGhlIGZ1dHVyZS4KICAgIF9TdHJlYW1Db250cm9sbGVyPFQ+IGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUPihzeW5jOiB0cnVlKTsKICAgIGZ1dHVyZS50aGVuKCh2YWx1ZSkgewogICAgICBjb250cm9sbGVyLl9hZGQodmFsdWUpOwogICAgICBjb250cm9sbGVyLl9jbG9zZVVuY2hlY2tlZCgpOwogICAgfSwgb25FcnJvcjogKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIGNvbnRyb2xsZXIuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgY29udHJvbGxlci5fY2xvc2VVbmNoZWNrZWQoKTsKICAgIH0pOwogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIGEgc3RyZWFtIGZyb20gYSBncm91cCBvZiBmdXR1cmVzLgogICAqCiAgICogVGhlIHN0cmVhbSByZXBvcnRzIHRoZSByZXN1bHRzIG9mIHRoZSBmdXR1cmVzIG9uIHRoZSBzdHJlYW0gaW4gdGhlIG9yZGVyCiAgICogaW4gd2hpY2ggdGhlIGZ1dHVyZXMgY29tcGxldGUuCiAgICogRWFjaCBmdXR1cmUgcHJvdmlkZXMgZWl0aGVyIGEgZGF0YSBldmVudCBvciBhbiBlcnJvciBldmVudCwKICAgKiBkZXBlbmRpbmcgb24gaG93IHRoZSBmdXR1cmUgY29tcGxldGVzLgogICAqCiAgICogSWYgc29tZSBmdXR1cmVzIGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgd2hlbiBgU3RyZWFtLmZyb21GdXR1cmVzYCBpcyBjYWxsZWQsCiAgICogdGhlaXIgcmVzdWx0cyB3aWxsIGJlIGVtaXR0ZWQgaW4gc29tZSB1bnNwZWNpZmllZCBvcmRlci4KICAgKgogICAqIFdoZW4gYWxsIGZ1dHVyZXMgaGF2ZSBjb21wbGV0ZWQsIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgogICAqCiAgICogSWYgW2Z1dHVyZXNdIGlzIGVtcHR5LCB0aGUgc3RyZWFtIGNsb3NlcyBhcyBzb29uIGFzIHBvc3NpYmxlLgogICAqLwogIGZhY3RvcnkgU3RyZWFtLmZyb21GdXR1cmVzKEl0ZXJhYmxlPEZ1dHVyZTxUPj4gZnV0dXJlcykgewogICAgX1N0cmVhbUNvbnRyb2xsZXI8VD4gY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFQ+KHN5bmM6IHRydWUpOwogICAgaW50IGNvdW50ID0gMDsKICAgIC8vIERlY2xhcmUgdGhlc2UgYXMgdmFyaWFibGVzIGhvbGRpbmcgY2xvc3VyZXMgaW5zdGVhZCBvZiBhcwogICAgLy8gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgogICAgLy8gVGhpcyBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgY2xvc3VyZSBmcm9tIHRoZSBmdW5jdGlvbnMgZm9yIGVhY2ggZnV0dXJlLgogICAgdmFyIG9uVmFsdWUgPSAoVCB2YWx1ZSkgewogICAgICBpZiAoIWNvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgICBjb250cm9sbGVyLl9hZGQodmFsdWUpOwogICAgICAgIGlmICgtLWNvdW50ID09IDApIGNvbnRyb2xsZXIuX2Nsb3NlVW5jaGVja2VkKCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgb25FcnJvciA9IChlcnJvciwgU3RhY2tUcmFjZSBzdGFjaykgewogICAgICBpZiAoIWNvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgICBjb250cm9sbGVyLl9hZGRFcnJvcihlcnJvciwgc3RhY2spOwogICAgICAgIGlmICgtLWNvdW50ID09IDApIGNvbnRyb2xsZXIuX2Nsb3NlVW5jaGVja2VkKCk7CiAgICAgIH0KICAgIH07CiAgICAvLyBUaGUgZnV0dXJlcyBhcmUgYWxyZWFkeSBydW5uaW5nLCBzbyBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlbSBpbW1lZGlhdGVseQogICAgLy8gKGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIHN0cmVhbSB0byBiZSBsaXN0ZW5lZCBvbikuCiAgICAvLyBJZiB3ZSB3YWl0LCB3ZSBtaWdodCBub3QgY2F0Y2ggZXJyb3JzIGluIHRoZSBmdXR1cmVzIGluIHRpbWUuCiAgICBmb3IgKHZhciBmdXR1cmUgaW4gZnV0dXJlcykgewogICAgICBjb3VudCsrOwogICAgICBmdXR1cmUudGhlbihvblZhbHVlLCBvbkVycm9yOiBvbkVycm9yKTsKICAgIH0KICAgIC8vIFVzZSBzY2hlZHVsZSBtaWNyb3Rhc2sgc2luY2UgY29udHJvbGxlciBpcyBzeW5jLgogICAgaWYgKGNvdW50ID09IDApIHNjaGVkdWxlTWljcm90YXNrKGNvbnRyb2xsZXIuY2xvc2UpOwogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIHNpbmdsZS1zdWJzY3JpcHRpb24gc3RyZWFtIHRoYXQgZ2V0cyBpdHMgZGF0YSBmcm9tIFtlbGVtZW50c10uCiAgICoKICAgKiBUaGUgaXRlcmFibGUgaXMgaXRlcmF0ZWQgd2hlbiB0aGUgc3RyZWFtIHJlY2VpdmVzIGEgbGlzdGVuZXIsIGFuZCBzdG9wcwogICAqIGl0ZXJhdGluZyBpZiB0aGUgbGlzdGVuZXIgY2FuY2VscyB0aGUgc3Vic2NyaXB0aW9uLCBvciBpZiB0aGUKICAgKiBbSXRlcmF0b3IubW92ZU5leHRdIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAgb3IgdGhyb3dzLgogICAqIEl0ZXJhdGlvbiBpcyBzdXNwZW5kZWQgd2hpbGUgdGhlIHN0cmVhbSBzdWJzY3JpcHRpb24gaXMgcGF1c2VkLgogICAqCiAgICogSWYgY2FsbGluZyBbSXRlcmF0b3IubW92ZU5leHRdIG9uIGBlbGVtZW50cy5pdGVyYXRvcmAgdGhyb3dzLAogICAqIHRoZSBzdHJlYW0gZW1pdHMgdGhhdCBlcnJvciBhbmQgdGhlbiBpdCBjbG9zZXMuCiAgICogSWYgcmVhZGluZyBbSXRlcmF0b3IuY3VycmVudF0gb24gYGVsZW1lbnRzLml0ZXJhdG9yYCB0aHJvd3MsCiAgICogdGhlIHN0cmVhbSBlbWl0cyB0aGF0IGVycm9yLCBidXQga2VlcHMgaXRlcmF0aW5nLgogICAqLwogIGZhY3RvcnkgU3RyZWFtLmZyb21JdGVyYWJsZShJdGVyYWJsZTxUPiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBfR2VuZXJhdGVkU3RyZWFtSW1wbDxUPigKICAgICAgICAoKSA9PiBuZXcgX0l0ZXJhYmxlUGVuZGluZ0V2ZW50czxUPihlbGVtZW50cykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHJlcGVhdGVkbHkgZW1pdHMgZXZlbnRzIGF0IFtwZXJpb2RdIGludGVydmFscy4KICAgKgogICAqIFRoZSBldmVudCB2YWx1ZXMgYXJlIGNvbXB1dGVkIGJ5IGludm9raW5nIFtjb21wdXRhdGlvbl0uIFRoZSBhcmd1bWVudCB0bwogICAqIHRoaXMgY2FsbGJhY2sgaXMgYW4gaW50ZWdlciB0aGF0IHN0YXJ0cyB3aXRoIDAgYW5kIGlzIGluY3JlbWVudGVkIGZvcgogICAqIGV2ZXJ5IGV2ZW50LgogICAqCiAgICogSWYgW2NvbXB1dGF0aW9uXSBpcyBvbWl0dGVkIHRoZSBldmVudCB2YWx1ZXMgd2lsbCBhbGwgYmUgYG51bGxgLgogICAqLwogIGZhY3RvcnkgU3RyZWFtLnBlcmlvZGljKER1cmF0aW9uIHBlcmlvZCwKICAgICAgW1QgY29tcHV0YXRpb24oaW50IGNvbXB1dGF0aW9uQ291bnQpXSkgewogICAgVGltZXIgdGltZXI7CiAgICBpbnQgY29tcHV0YXRpb25Db3VudCA9IDA7CiAgICBTdHJlYW1Db250cm9sbGVyPFQ+IGNvbnRyb2xsZXI7CiAgICAvLyBDb3VudHMgdGhlIHRpbWUgdGhhdCB0aGUgU3RyZWFtIHdhcyBydW5uaW5nIChhbmQgbm90IHBhdXNlZCkuCiAgICBTdG9wd2F0Y2ggd2F0Y2ggPSBuZXcgU3RvcHdhdGNoKCk7CgogICAgdm9pZCBzZW5kRXZlbnQoKSB7CiAgICAgIHdhdGNoLnJlc2V0KCk7CiAgICAgIFQgZGF0YTsKICAgICAgaWYgKGNvbXB1dGF0aW9uICE9IG51bGwpIHsKICAgICAgICB0cnkgewogICAgICAgICAgZGF0YSA9IGNvbXB1dGF0aW9uKGNvbXB1dGF0aW9uQ291bnQrKyk7CiAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcihlLCBzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29udHJvbGxlci5hZGQoZGF0YSk7CiAgICB9CgogICAgdm9pZCBzdGFydFBlcmlvZGljVGltZXIoKSB7CiAgICAgIGFzc2VydCh0aW1lciA9PSBudWxsKTsKICAgICAgdGltZXIgPSBuZXcgVGltZXIucGVyaW9kaWMocGVyaW9kLCAoVGltZXIgdGltZXIpIHsKICAgICAgICBzZW5kRXZlbnQoKTsKICAgICAgfSk7CiAgICB9CgogICAgY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFQ+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46ICgpIHsKICAgICAgICAgIHdhdGNoLnN0YXJ0KCk7CiAgICAgICAgICBzdGFydFBlcmlvZGljVGltZXIoKTsKICAgICAgICB9LAogICAgICAgIG9uUGF1c2U6ICgpIHsKICAgICAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgICAgd2F0Y2guc3RvcCgpOwogICAgICAgIH0sCiAgICAgICAgb25SZXN1bWU6ICgpIHsKICAgICAgICAgIGFzc2VydCh0aW1lciA9PSBudWxsKTsKICAgICAgICAgIER1cmF0aW9uIGVsYXBzZWQgPSB3YXRjaC5lbGFwc2VkOwogICAgICAgICAgd2F0Y2guc3RhcnQoKTsKICAgICAgICAgIHRpbWVyID0gbmV3IFRpbWVyKHBlcmlvZCAtIGVsYXBzZWQsICgpIHsKICAgICAgICAgICAgdGltZXIgPSBudWxsOwogICAgICAgICAgICBzdGFydFBlcmlvZGljVGltZXIoKTsKICAgICAgICAgICAgc2VuZEV2ZW50KCk7CiAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIG9uQ2FuY2VsOiAoKSB7CiAgICAgICAgICBpZiAodGltZXIgIT0gbnVsbCkgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgICByZXR1cm4gRnV0dXJlLl9udWxsRnV0dXJlOwogICAgICAgIH0pOwogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIHN0cmVhbSB3aGVyZSBhbGwgZXZlbnRzIG9mIGFuIGV4aXN0aW5nIHN0cmVhbSBhcmUgcGlwZWQgdGhyb3VnaAogICAqIGEgc2luay10cmFuc2Zvcm1hdGlvbi4KICAgKgogICAqIFRoZSBnaXZlbiBbbWFwU2lua10gY2xvc3VyZSBpcyBpbnZva2VkIHdoZW4gdGhlIHJldHVybmVkIHN0cmVhbSBpcwogICAqIGxpc3RlbmVkIHRvLiBBbGwgZXZlbnRzIGZyb20gdGhlIFtzb3VyY2VdIGFyZSBhZGRlZCBpbnRvIHRoZSBldmVudCBzaW5rCiAgICogdGhhdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBpbnZvY2F0aW9uLiBUaGUgdHJhbnNmb3JtYXRpb24gcHV0cyBhbGwKICAgKiB0cmFuc2Zvcm1lZCBldmVudHMgaW50byB0aGUgc2luayB0aGUgW21hcFNpbmtdIGNsb3N1cmUgcmVjZWl2ZWQgZHVyaW5nCiAgICogaXRzIGludm9jYXRpb24uIENvbmNlcHR1YWxseSB0aGUgW21hcFNpbmtdIGNyZWF0ZXMgYSB0cmFuc2Zvcm1hdGlvbiBwaXBlCiAgICogd2l0aCB0aGUgaW5wdXQgc2luayBiZWluZyB0aGUgcmV0dXJuZWQgW0V2ZW50U2lua10gYW5kIHRoZSBvdXRwdXQgc2luawogICAqIGJlaW5nIHRoZSBzaW5rIGl0IHJlY2VpdmVkLgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBmcmVxdWVudGx5IHVzZWQgdG8gYnVpbGQgdHJhbnNmb3JtZXJzLgogICAqCiAgICogRXhhbXBsZSB1c2UgZm9yIGEgZHVwbGljYXRpbmcgdHJhbnNmb3JtZXI6CiAgICoKICAgKiAgICAgY2xhc3MgRHVwbGljYXRpb25TaW5rIGltcGxlbWVudHMgRXZlbnRTaW5rPFN0cmluZz4gewogICAqICAgICAgIGZpbmFsIEV2ZW50U2luazxTdHJpbmc+IF9vdXRwdXRTaW5rOwogICAqICAgICAgIER1cGxpY2F0aW9uU2luayh0aGlzLl9vdXRwdXRTaW5rKTsKICAgKgogICAqICAgICAgIHZvaWQgYWRkKFN0cmluZyBkYXRhKSB7CiAgICogICAgICAgICBfb3V0cHV0U2luay5hZGQoZGF0YSk7CiAgICogICAgICAgICBfb3V0cHV0U2luay5hZGQoZGF0YSk7CiAgICogICAgICAgfQogICAqCiAgICogICAgICAgdm9pZCBhZGRFcnJvcihlLCBbc3RdKSB7IF9vdXRwdXRTaW5rLmFkZEVycm9yKGUsIHN0KTsgfQogICAqICAgICAgIHZvaWQgY2xvc2UoKSB7IF9vdXRwdXRTaW5rLmNsb3NlKCk7IH0KICAgKiAgICAgfQogICAqCiAgICogICAgIGNsYXNzIER1cGxpY2F0aW9uVHJhbnNmb3JtZXIgZXh0ZW5kcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8U3RyaW5nLCBTdHJpbmc+IHsKICAgKiAgICAgICAvLyBTb21lIGdlbmVyaWMgdHlwZXMgb21pdHRlZCBmb3IgYnJldml0eS4KICAgKiAgICAgICBTdHJlYW0gYmluZChTdHJlYW0gc3RyZWFtKSA9PiBuZXcgU3RyZWFtPFN0cmluZz4uZXZlbnRUcmFuc2Zvcm1lZCgKICAgKiAgICAgICAgICAgc3RyZWFtLAogICAqICAgICAgICAgICAoRXZlbnRTaW5rIHNpbmspID0+IG5ldyBEdXBsaWNhdGlvblNpbmsoc2luaykpOwogICAqICAgICB9CiAgICoKICAgKiAgICAgc3RyaW5nU3RyZWFtLnRyYW5zZm9ybShuZXcgRHVwbGljYXRpb25UcmFuc2Zvcm1lcigpKTsKICAgKgogICAqIFRoZSByZXN1bHRpbmcgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiBbc291cmNlXSBpcy4KICAgKi8KICBmYWN0b3J5IFN0cmVhbS5ldmVudFRyYW5zZm9ybWVkKAogICAgICBTdHJlYW0gc291cmNlLCBFdmVudFNpbmsgbWFwU2luayhFdmVudFNpbms8VD4gc2luaykpIHsKICAgIHJldHVybiBuZXcgX0JvdW5kU2lua1N0cmVhbShzb3VyY2UsIG1hcFNpbmspOwogIH0KCiAgLyoqCiAgICogQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFN0cmVhbTxUPmAuCiAgICoKICAgKiBUaGlzIGFsbG93cyBbc291cmNlXSB0byBiZSB1c2VkIGF0IHRoZSBuZXcgdHlwZSwgYnV0IGF0IHJ1bi10aW1lIGl0CiAgICogbXVzdCBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb2YgYm90aCB0aGUgbmV3IHR5cGUgYW5kIGl0cyBvcmlnaW5hbCB0eXBlLgogICAqCiAgICogRGF0YSBldmVudHMgY3JlYXRlZCBieSB0aGUgc291cmNlIHN0cmVhbSBtdXN0IGFsc28gYmUgaW5zdGFuY2VzIG9mIFtUXS4KICAgKi8KICBzdGF0aWMgU3RyZWFtPFQ+IGNhc3RGcm9tPFMsIFQ+KFN0cmVhbTxTPiBzb3VyY2UpID0+CiAgICAgIG5ldyBDYXN0U3RyZWFtPFMsIFQ+KHNvdXJjZSk7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtLgogICAqLwogIGJvb2wgZ2V0IGlzQnJvYWRjYXN0ID0+IGZhbHNlOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbXVsdGktc3Vic2NyaXB0aW9uIHN0cmVhbSB0aGF0IHByb2R1Y2VzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSB3aWxsIHN1YnNjcmliZSB0byB0aGlzIHN0cmVhbSB3aGVuIGl0cyBmaXJzdAogICAqIHN1YnNjcmliZXIgaXMgYWRkZWQsIGFuZCB3aWxsIHN0YXkgc3Vic2NyaWJlZCB1bnRpbCB0aGlzIHN0cmVhbSBlbmRzLAogICAqIG9yIGEgY2FsbGJhY2sgY2FuY2VscyB0aGUgc3Vic2NyaXB0aW9uLgogICAqCiAgICogSWYgW29uTGlzdGVuXSBpcyBwcm92aWRlZCwgaXQgaXMgY2FsbGVkIHdpdGggYSBzdWJzY3JpcHRpb24tbGlrZSBvYmplY3QKICAgKiB0aGF0IHJlcHJlc2VudHMgdGhlIHVuZGVybHlpbmcgc3Vic2NyaXB0aW9uIHRvIHRoaXMgc3RyZWFtLiBJdCBpcwogICAqIHBvc3NpYmxlIHRvIHBhdXNlLCByZXN1bWUgb3IgY2FuY2VsIHRoZSBzdWJzY3JpcHRpb24gZHVyaW5nIHRoZSBjYWxsCiAgICogdG8gW29uTGlzdGVuXS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZXZlbnQgaGFuZGxlcnMsIGluY2x1ZGluZwogICAqIHVzaW5nIFtTdHJlYW1TdWJzY3JpcHRpb24uYXNGdXR1cmVdLgogICAqCiAgICogSWYgW29uQ2FuY2VsXSBpcyBwcm92aWRlZCwgaXQgaXMgY2FsbGVkIGluIGEgc2ltaWxhciB3YXkgdG8gW29uTGlzdGVuXQogICAqIHdoZW4gdGhlIHJldHVybmVkIHN0cmVhbSBzdG9wcyBoYXZpbmcgbGlzdGVuZXIuIElmIGl0IGxhdGVyIGdldHMKICAgKiBhIG5ldyBsaXN0ZW5lciwgdGhlIFtvbkxpc3Rlbl0gZnVuY3Rpb24gaXMgY2FsbGVkIGFnYWluLgogICAqCiAgICogVXNlIHRoZSBjYWxsYmFja3MsIGZvciBleGFtcGxlLCBmb3IgcGF1c2luZyB0aGUgdW5kZXJseWluZyBzdWJzY3JpcHRpb24KICAgKiB3aGlsZSBoYXZpbmcgbm8gc3Vic2NyaWJlcnMgdG8gcHJldmVudCBsb3NpbmcgZXZlbnRzLCBvciBjYW5jZWxpbmcgdGhlCiAgICogc3Vic2NyaXB0aW9uIHdoZW4gdGhlcmUgYXJlIG5vIGxpc3RlbmVycy4KICAgKi8KICBTdHJlYW08VD4gYXNCcm9hZGNhc3RTdHJlYW0oCiAgICAgIHt2b2lkIG9uTGlzdGVuKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pLAogICAgICB2b2lkIG9uQ2FuY2VsKFN0cmVhbVN1YnNjcmlwdGlvbjxUPiBzdWJzY3JpcHRpb24pfSkgewogICAgcmV0dXJuIG5ldyBfQXNCcm9hZGNhc3RTdHJlYW08VD4odGhpcywgb25MaXN0ZW4sIG9uQ2FuY2VsKTsKICB9CgogIC8qKgogICAqIEFkZHMgYSBzdWJzY3JpcHRpb24gdG8gdGhpcyBzdHJlYW0uCiAgICoKICAgKiBSZXR1cm5zIGEgW1N0cmVhbVN1YnNjcmlwdGlvbl0gd2hpY2ggaGFuZGxlcyBldmVudHMgZnJvbSB0aGlzIHN0cmVhbSB1c2luZwogICAqIHRoZSBwcm92aWRlZCBbb25EYXRhXSwgW29uRXJyb3JdIGFuZCBbb25Eb25lXSBoYW5kbGVycy4KICAgKiBUaGUgaGFuZGxlcnMgY2FuIGJlIGNoYW5nZWQgb24gdGhlIHN1YnNjcmlwdGlvbiwgYnV0IHRoZXkgc3RhcnQgb3V0CiAgICogYXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9ucy4KICAgKgogICAqIE9uIGVhY2ggZGF0YSBldmVudCBmcm9tIHRoaXMgc3RyZWFtLCB0aGUgc3Vic2NyaWJlcidzIFtvbkRhdGFdIGhhbmRsZXIKICAgKiBpcyBjYWxsZWQuIElmIFtvbkRhdGFdIGlzIGBudWxsYCwgbm90aGluZyBoYXBwZW5zLgogICAqCiAgICogT24gZXJyb3JzIGZyb20gdGhpcyBzdHJlYW0sIHRoZSBbb25FcnJvcl0gaGFuZGxlciBpcyBjYWxsZWQgd2l0aCB0aGUKICAgKiBlcnJvciBvYmplY3QgYW5kIHBvc3NpYmx5IGEgc3RhY2sgdHJhY2UuCiAgICoKICAgKiBUaGUgW29uRXJyb3JdIGNhbGxiYWNrIG11c3QgYmUgb2YgdHlwZSBgdm9pZCBvbkVycm9yKGVycm9yKWAgb3IKICAgKiBgdm9pZCBvbkVycm9yKGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpYC4gSWYgW29uRXJyb3JdIGFjY2VwdHMKICAgKiB0d28gYXJndW1lbnRzIGl0IGlzIGNhbGxlZCB3aXRoIHRoZSBlcnJvciBvYmplY3QgYW5kIHRoZSBzdGFjayB0cmFjZQogICAqICh3aGljaCBjb3VsZCBiZSBgbnVsbGAgaWYgdGhpcyBzdHJlYW0gaXRzZWxmIHJlY2VpdmVkIGFuIGVycm9yIHdpdGhvdXQKICAgKiBzdGFjayB0cmFjZSkuCiAgICogT3RoZXJ3aXNlIGl0IGlzIGNhbGxlZCB3aXRoIGp1c3QgdGhlIGVycm9yIG9iamVjdC4KICAgKiBJZiBbb25FcnJvcl0gaXMgb21pdHRlZCwgYW55IGVycm9ycyBvbiB0aGlzIHN0cmVhbSBhcmUgY29uc2lkZXJlZCB1bmhhbmRsZWQsCiAgICogYW5kIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjdXJyZW50IFtab25lXSdzIGVycm9yIGhhbmRsZXIuCiAgICogQnkgZGVmYXVsdCB1bmhhbmRsZWQgYXN5bmMgZXJyb3JzIGFyZSB0cmVhdGVkCiAgICogYXMgaWYgdGhleSB3ZXJlIHVuY2F1Z2h0IHRvcC1sZXZlbCBlcnJvcnMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBjbG9zZXMgYW5kIHNlbmRzIGEgZG9uZSBldmVudCwgdGhlIFtvbkRvbmVdIGhhbmRsZXIgaXMKICAgKiBjYWxsZWQuIElmIFtvbkRvbmVdIGlzIGBudWxsYCwgbm90aGluZyBoYXBwZW5zLgogICAqCiAgICogSWYgW2NhbmNlbE9uRXJyb3JdIGlzIHRydWUsIHRoZSBzdWJzY3JpcHRpb24gaXMgYXV0b21hdGljYWxseSBjYW5jZWxlZAogICAqIHdoZW4gdGhlIGZpcnN0IGVycm9yIGV2ZW50IGlzIGRlbGl2ZXJlZC4gVGhlIGRlZmF1bHQgaXMgYGZhbHNlYC4KICAgKgogICAqIFdoaWxlIGEgc3Vic2NyaXB0aW9uIGlzIHBhdXNlZCwgb3Igd2hlbiBpdCBoYXMgYmVlbiBjYW5jZWxlZCwKICAgKiB0aGUgc3Vic2NyaXB0aW9uIGRvZXNuJ3QgcmVjZWl2ZSBldmVudHMgYW5kIG5vbmUgb2YgdGhlCiAgICogZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgYXJlIGNhbGxlZC4KICAgKi8KICBTdHJlYW1TdWJzY3JpcHRpb248VD4gbGlzdGVuKHZvaWQgb25EYXRhKFQgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgc3RyZWFtIGZyb20gdGhpcyBzdHJlYW0gdGhhdCBkaXNjYXJkcyBzb21lIGVsZW1lbnRzLgogICAqCiAgICogVGhlIG5ldyBzdHJlYW0gc2VuZHMgdGhlIHNhbWUgZXJyb3IgYW5kIGRvbmUgZXZlbnRzIGFzIHRoaXMgc3RyZWFtLAogICAqIGJ1dCBpdCBvbmx5IHNlbmRzIHRoZSBkYXRhIGV2ZW50cyB0aGF0IHNhdGlzZnkgdGhlIFt0ZXN0XS4KICAgKgogICAqIElmIHRoZSBbdGVzdF0gZnVuY3Rpb24gdGhyb3dzLCB0aGUgZGF0YSBldmVudCBpcyBkcm9wcGVkIGFuZCB0aGUKICAgKiBlcnJvciBpcyBlbWl0dGVkIG9uIHRoZSByZXR1cm5lZCBzdHJlYW0gaW5zdGVhZC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGluZGl2aWR1YWxseSBwZXJmb3JtIHRoZSBgdGVzdGAuCiAgICovCiAgU3RyZWFtPFQ+IHdoZXJlKGJvb2wgdGVzdChUIGV2ZW50KSkgewogICAgcmV0dXJuIG5ldyBfV2hlcmVTdHJlYW08VD4odGhpcywgdGVzdCk7CiAgfQoKICAvKioKICAgKiBUcmFuc2Zvcm1zIGVhY2ggZWxlbWVudCBvZiB0aGlzIHN0cmVhbSBpbnRvIGEgbmV3IHN0cmVhbSBldmVudC4KICAgKgogICAqIENyZWF0ZXMgYSBuZXcgc3RyZWFtIHRoYXQgY29udmVydHMgZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtCiAgICogdG8gYSBuZXcgdmFsdWUgdXNpbmcgdGhlIFtjb252ZXJ0XSBmdW5jdGlvbiwgYW5kIGVtaXRzIHRoZSByZXN1bHQuCiAgICoKICAgKiBGb3IgZWFjaCBkYXRhIGV2ZW50LCBgb2AsIGluIHRoaXMgc3RyZWFtLCB0aGUgcmV0dXJuZWQgc3RyZWFtCiAgICogcHJvdmlkZXMgYSBkYXRhIGV2ZW50IHdpdGggdGhlIHZhbHVlIGBjb252ZXJ0KG8pYC4KICAgKiBJZiBbY29udmVydF0gdGhyb3dzLCB0aGUgcmV0dXJuZWQgc3RyZWFtIHJlcG9ydHMgaXQgYXMgYW4gZXJyb3IKICAgKiBldmVudCBpbnN0ZWFkLgogICAqCiAgICogRXJyb3IgYW5kIGRvbmUgZXZlbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQgdG8gdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIFRoZSBbY29udmVydF0gZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgcGVyIGRhdGEgZXZlbnQgcGVyIGxpc3RlbmVyLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGluZGl2aWR1YWxseSBjYWxsIFtjb252ZXJ0XSBvbiBlYWNoIGRhdGEgZXZlbnQuCiAgICovCiAgU3RyZWFtPFM+IG1hcDxTPihTIGNvbnZlcnQoVCBldmVudCkpIHsKICAgIHJldHVybiBuZXcgX01hcFN0cmVhbTxULCBTPih0aGlzLCBjb252ZXJ0KTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgc3RyZWFtIHdpdGggZWFjaCBkYXRhIGV2ZW50IG9mIHRoaXMgc3RyZWFtIGFzeW5jaHJvbm91c2x5CiAgICogbWFwcGVkIHRvIGEgbmV3IGV2ZW50LgogICAqCiAgICogVGhpcyBhY3RzIGxpa2UgW21hcF0sIGV4Y2VwdCB0aGF0IFtjb252ZXJ0XSBtYXkgcmV0dXJuIGEgW0Z1dHVyZV0sCiAgICogYW5kIGluIHRoYXQgY2FzZSwgdGhpcyBzdHJlYW0gd2FpdHMgZm9yIHRoYXQgZnV0dXJlIHRvIGNvbXBsZXRlIGJlZm9yZQogICAqIGNvbnRpbnVpbmcgd2l0aCBpdHMgcmVzdWx0LgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICovCiAgU3RyZWFtPEU+IGFzeW5jTWFwPEU+KEZ1dHVyZU9yPEU+IGNvbnZlcnQoVCBldmVudCkpIHsKICAgIF9TdHJlYW1Db250cm9sbGVyQmFzZTxFPiBjb250cm9sbGVyOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbjsKCiAgICB2b2lkIG9uTGlzdGVuKCkgewogICAgICBmaW5hbCBhZGQgPSBjb250cm9sbGVyLmFkZDsKICAgICAgYXNzZXJ0KGNvbnRyb2xsZXIgaXMgX1N0cmVhbUNvbnRyb2xsZXI8RT4gfHwKICAgICAgICAgIGNvbnRyb2xsZXIgaXMgX0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXIpOwogICAgICBmaW5hbCBhZGRFcnJvciA9IGNvbnRyb2xsZXIuX2FkZEVycm9yOwogICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigoVCBldmVudCkgewogICAgICAgIEZ1dHVyZU9yPEU+IG5ld1ZhbHVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBuZXdWYWx1ZSA9IGNvbnZlcnQoZXZlbnQpOwogICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChuZXdWYWx1ZSBpcyBGdXR1cmU8RT4pIHsKICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgbmV3VmFsdWUKICAgICAgICAgICAgICAudGhlbihhZGQsIG9uRXJyb3I6IGFkZEVycm9yKQogICAgICAgICAgICAgIC53aGVuQ29tcGxldGUoc3Vic2NyaXB0aW9uLnJlc3VtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKG5ld1ZhbHVlKTsKICAgICAgICB9CiAgICAgIH0sIG9uRXJyb3I6IGFkZEVycm9yLCBvbkRvbmU6IGNvbnRyb2xsZXIuY2xvc2UpOwogICAgfQoKICAgIGlmICh0aGlzLmlzQnJvYWRjYXN0KSB7CiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxFPi5icm9hZGNhc3QoCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgICAgICB9LAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RT4oCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvblBhdXNlOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgfSwKICAgICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvbkNhbmNlbDogKCkgPT4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpLAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gY29udHJvbGxlci5zdHJlYW07CiAgfQoKICAvKioKICAgKiBUcmFuc2Zvcm1zIGVhY2ggZWxlbWVudCBpbnRvIGEgc2VxdWVuY2Ugb2YgYXN5bmNocm9ub3VzIGV2ZW50cy4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyZWFtIGFuZCBmb3IgZWFjaCBldmVudCBvZiB0aGlzIHN0cmVhbSwgZG8gdGhlIGZvbGxvd2luZzoKICAgKgogICAqICogSWYgdGhlIGV2ZW50IGlzIGFuIGVycm9yIGV2ZW50IG9yIGEgZG9uZSBldmVudCwgaXQgaXMgZW1pdHRlZCBkaXJlY3RseQogICAqIGJ5IHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICogKiBPdGhlcndpc2UgaXQgaXMgYW4gZWxlbWVudC4gVGhlbiB0aGUgW2NvbnZlcnRdIGZ1bmN0aW9uIGlzIGNhbGxlZAogICAqIHdpdGggdGhlIGVsZW1lbnQgYXMgYXJndW1lbnQgdG8gcHJvZHVjZSBhIGNvbnZlcnQtc3RyZWFtIGZvciB0aGUgZWxlbWVudC4KICAgKiAqIElmIHRoYXQgY2FsbCB0aHJvd3MsIHRoZSBlcnJvciBpcyBlbWl0dGVkIG9uIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICogKiBJZiB0aGUgY2FsbCByZXR1cm5zIGBudWxsYCwgbm8gZnVydGhlciBhY3Rpb24gaXMgdGFrZW4gZm9yIHRoZSBlbGVtZW50cy4KICAgKiAqIE90aGVyd2lzZSwgdGhpcyBzdHJlYW0gaXMgcGF1c2VkIGFuZCBjb252ZXJ0LXN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAgKiBFdmVyeSBkYXRhIGFuZCBlcnJvciBldmVudCBvZiB0aGUgY29udmVydC1zdHJlYW0gaXMgZW1pdHRlZCBvbiB0aGUgcmV0dXJuZWQKICAgKiBzdHJlYW0gaW4gdGhlIG9yZGVyIGl0IGlzIHByb2R1Y2VkLgogICAqIFdoZW4gdGhlIGNvbnZlcnQtc3RyZWFtIGVuZHMsIHRoaXMgc3RyZWFtIGlzIHJlc3VtZWQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiB0aGlzIHN0cmVhbSBpcy4KICAgKi8KICBTdHJlYW08RT4gYXN5bmNFeHBhbmQ8RT4oU3RyZWFtPEU+IGNvbnZlcnQoVCBldmVudCkpIHsKICAgIF9TdHJlYW1Db250cm9sbGVyQmFzZTxFPiBjb250cm9sbGVyOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbjsKICAgIHZvaWQgb25MaXN0ZW4oKSB7CiAgICAgIGFzc2VydChjb250cm9sbGVyIGlzIF9TdHJlYW1Db250cm9sbGVyIHx8CiAgICAgICAgICBjb250cm9sbGVyIGlzIF9Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyKTsKICAgICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oKFQgZXZlbnQpIHsKICAgICAgICBTdHJlYW08RT4gbmV3U3RyZWFtOwogICAgICAgIHRyeSB7CiAgICAgICAgICBuZXdTdHJlYW0gPSBjb252ZXJ0KGV2ZW50KTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKGUsIHMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAobmV3U3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgY29udHJvbGxlci5hZGRTdHJlYW0obmV3U3RyZWFtKS53aGVuQ29tcGxldGUoc3Vic2NyaXB0aW9uLnJlc3VtZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAgICAgb25FcnJvcjogY29udHJvbGxlci5fYWRkRXJyb3IsIC8vIEF2b2lkIFpvbmUgZXJyb3IgcmVwbGFjZW1lbnQuCiAgICAgICAgICBvbkRvbmU6IGNvbnRyb2xsZXIuY2xvc2UpOwogICAgfQoKICAgIGlmICh0aGlzLmlzQnJvYWRjYXN0KSB7CiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxFPi5icm9hZGNhc3QoCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgICAgICB9LAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8RT4oCiAgICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sCiAgICAgICAgICBvblBhdXNlOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAgICAgICAgfSwKICAgICAgICAgIG9uUmVzdW1lOiAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvbkNhbmNlbDogKCkgPT4gc3Vic2NyaXB0aW9uLmNhbmNlbCgpLAogICAgICAgICAgc3luYzogdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gY29udHJvbGxlci5zdHJlYW07CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgd3JhcHBlciBTdHJlYW0gdGhhdCBpbnRlcmNlcHRzIHNvbWUgZXJyb3JzIGZyb20gdGhpcyBzdHJlYW0uCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBzZW5kcyBhbiBlcnJvciB0aGF0IG1hdGNoZXMgW3Rlc3RdLCB0aGVuIGl0IGlzIGludGVyY2VwdGVkCiAgICogYnkgdGhlIFtvbkVycm9yXSBmdW5jdGlvbi4KICAgKgogICAqIFRoZSBbb25FcnJvcl0gY2FsbGJhY2sgbXVzdCBiZSBvZiB0eXBlIGB2b2lkIG9uRXJyb3IoZXJyb3IpYCBvcgogICAqIGB2b2lkIG9uRXJyb3IoZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSlgLgogICAqIFRoZSBmdW5jdGlvbiB0eXBlIGRldGVybWluZXMgd2hldGhlciBbb25FcnJvcl0gaXMgaW52b2tlZCB3aXRoIGEgc3RhY2sKICAgKiB0cmFjZSBhcmd1bWVudC4KICAgKiBUaGUgc3RhY2sgdHJhY2UgYXJndW1lbnQgbWF5IGJlIGBudWxsYCBpZiB0aGlzIHN0cmVhbSByZWNlaXZlZCBhbiBlcnJvcgogICAqIHdpdGhvdXQgYSBzdGFjayB0cmFjZS4KICAgKgogICAqIEFuIGFzeW5jaHJvbm91cyBlcnJvciBgZXJyb3JgIGlzIG1hdGNoZWQgYnkgYSB0ZXN0IGZ1bmN0aW9uIGlmCiAgICpgdGVzdChlcnJvcilgIHJldHVybnMgdHJ1ZS4gSWYgW3Rlc3RdIGlzIG9taXR0ZWQsIGV2ZXJ5IGVycm9yIGlzIGNvbnNpZGVyZWQKICAgKiBtYXRjaGluZy4KICAgKgogICAqIElmIHRoZSBlcnJvciBpcyBpbnRlcmNlcHRlZCwgdGhlIFtvbkVycm9yXSBmdW5jdGlvbiBjYW4gZGVjaWRlIHdoYXQgdG8gZG8KICAgKiB3aXRoIGl0LiBJdCBjYW4gdGhyb3cgaWYgaXQgd2FudHMgdG8gcmFpc2UgYSBuZXcgKG9yIHRoZSBzYW1lKSBlcnJvciwKICAgKiBvciBzaW1wbHkgcmV0dXJuIHRvIG1ha2UgdGhpcyBzdHJlYW0gZm9yZ2V0IHRoZSBlcnJvci4KICAgKiBJZiB0aGUgcmVjZWl2ZWQgYGVycm9yYCB2YWx1ZSBpcyB0aHJvd24gYWdhaW4gYnkgdGhlIFtvbkVycm9yXSBmdW5jdGlvbiwKICAgKiBpdCBhY3RzIGxpa2UgYSBgcmV0aHJvd2AgYW5kIGl0IGlzIGVtaXR0ZWQgYWxvbmcgd2l0aCBpdHMgb3JpZ2luYWwKICAgKiBzdGFjayB0cmFjZSwgbm90IHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgYHRocm93YCBpbnNpZGUgW29uRXJyb3JdLgogICAqCiAgICogSWYgeW91IG5lZWQgdG8gdHJhbnNmb3JtIGFuIGVycm9yIGludG8gYSBkYXRhIGV2ZW50LCB1c2UgdGhlIG1vcmUgZ2VuZXJpYwogICAqIFtTdHJlYW0udHJhbnNmb3JtXSB0byBoYW5kbGUgdGhlIGV2ZW50IGJ5IHdyaXRpbmcgYSBkYXRhIGV2ZW50IHRvCiAgICogdGhlIG91dHB1dCBzaW5rLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICogSWYgYSBicm9hZGNhc3Qgc3RyZWFtIGlzIGxpc3RlbmVkIHRvIG1vcmUgdGhhbiBvbmNlLCBlYWNoIHN1YnNjcmlwdGlvbgogICAqIHdpbGwgaW5kaXZpZHVhbGx5IHBlcmZvcm0gdGhlIGB0ZXN0YCBhbmQgaGFuZGxlIHRoZSBlcnJvci4KICAgKi8KICBTdHJlYW08VD4gaGFuZGxlRXJyb3IoRnVuY3Rpb24gb25FcnJvciwge2Jvb2wgdGVzdChlcnJvcil9KSB7CiAgICByZXR1cm4gbmV3IF9IYW5kbGVFcnJvclN0cmVhbTxUPih0aGlzLCBvbkVycm9yLCB0ZXN0KTsKICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtIGludG8gYSBzZXF1ZW5jZSBvZiBlbGVtZW50cy4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyZWFtIHdoZXJlIGVhY2ggZWxlbWVudCBvZiB0aGlzIHN0cmVhbSBpcyByZXBsYWNlZAogICAqIGJ5IHplcm8gb3IgbW9yZSBkYXRhIGV2ZW50cy4KICAgKiBUaGUgZXZlbnQgdmFsdWVzIGFyZSBwcm92aWRlZCBhcyBhbiBbSXRlcmFibGVdIGJ5IGEgY2FsbCB0byBbY29udmVydF0KICAgKiB3aXRoIHRoZSBlbGVtZW50IGFzIGFyZ3VtZW50LCBhbmQgdGhlIGVsZW1lbnRzIG9mIHRoYXQgaXRlcmFibGUgaXMKICAgKiBlbWl0dGVkIGluIGl0ZXJhdGlvbiBvcmRlci4KICAgKiBJZiBjYWxsaW5nIFtjb252ZXJ0XSB0aHJvd3MsIG9yIGlmIHRoZSBpdGVyYXRpb24gb2YgdGhlIHJldHVybmVkIHZhbHVlcwogICAqIHRocm93cywgdGhlIGVycm9yIGlzIGVtaXR0ZWQgb24gdGhlIHJldHVybmVkIHN0cmVhbSBhbmQgaXRlcmF0aW9uIGVuZHMKICAgKiBmb3IgdGhhdCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogRXJyb3IgZXZlbnRzIGFuZCB0aGUgZG9uZSBldmVudCBvZiB0aGlzIHN0cmVhbSBhcmUgZm9yd2FyZGVkIGRpcmVjdGx5CiAgICogdG8gdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIElmIGEgYnJvYWRjYXN0IHN0cmVhbSBpcyBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgZWFjaCBzdWJzY3JpcHRpb24KICAgKiB3aWxsIGluZGl2aWR1YWxseSBjYWxsIGBjb252ZXJ0YCBhbmQgZXhwYW5kIHRoZSBldmVudHMuCiAgICovCiAgU3RyZWFtPFM+IGV4cGFuZDxTPihJdGVyYWJsZTxTPiBjb252ZXJ0KFQgZWxlbWVudCkpIHsKICAgIHJldHVybiBuZXcgX0V4cGFuZFN0cmVhbTxULCBTPih0aGlzLCBjb252ZXJ0KTsKICB9CgogIC8qKgogICAqIFBpcGVzIHRoZSBldmVudHMgb2YgdGhpcyBzdHJlYW0gaW50byBbc3RyZWFtQ29uc3VtZXJdLgogICAqCiAgICogQWxsIGV2ZW50cyBvZiB0aGlzIHN0cmVhbSBhcmUgYWRkZWQgdG8gYHN0cmVhbUNvbnN1bWVyYCB1c2luZwogICAqIFtTdHJlYW1Db25zdW1lci5hZGRTdHJlYW1dLgogICAqIFRoZSBgc3RyZWFtQ29uc3VtZXJgIGlzIGNsb3NlZCB3aGVuIHRoaXMgc3RyZWFtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZAogICAqIHRvIGl0IC0gd2hlbiB0aGUgZnV0dXJlIHJldHVybmVkIGJ5IGBhZGRTdHJlYW1gIGNvbXBsZXRlcyB3aXRob3V0IGFuIGVycm9yLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCBjb21wbGV0ZXMgd2hlbiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBjb25zdW1lZAogICAqIGFuZCB0aGUgY29uc3VtZXIgaGFzIGJlZW4gY2xvc2VkLgogICAqCiAgICogVGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGZ1dHVyZSByZXR1cm5lZAogICAqIGJ5IFtTdHJlYW1Db25zdW1lci5jbG9zZV0uCiAgICogSWYgdGhlIGNhbGwgdG8gW1N0cmVhbUNvbnN1bWVyLmFkZFN0cmVhbV0gZmFpbHMgaW4gc29tZSB3YXksIHRoaXMKICAgKiBtZXRob2QgZmFpbHMgaW4gdGhlIHNhbWUgd2F5LgogICAqLwogIEZ1dHVyZSBwaXBlKFN0cmVhbUNvbnN1bWVyPFQ+IHN0cmVhbUNvbnN1bWVyKSB7CiAgICByZXR1cm4gc3RyZWFtQ29uc3VtZXIuYWRkU3RyZWFtKHRoaXMpLnRoZW4oKF8pID0+IHN0cmVhbUNvbnN1bWVyLmNsb3NlKCkpOwogIH0KCiAgLyoqCiAgICogQXBwbGllcyAgW3N0cmVhbVRyYW5zZm9ybWVyXSB0byB0aGlzIHN0cmVhbS4KICAgKgogICAqIFJldHVybnMgdGhlIHRyYW5zZm9ybWVkIHN0cmVhbSwKICAgKiB0aGF0IGlzLCB0aGUgcmVzdWx0IG9mIGBzdHJlYW1UcmFuc2Zvcm1lci5iaW5kKHRoaXMpYC4KICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgYWxsb3dzIHdyaXRpbmcgdGhlIGNhbGwgdG8gYHN0cmVhbVRyYW5zZm9ybWVyLmJpbmRgCiAgICogaW4gYSBjaGFpbmVkIGZhc2hpb24sIGxpa2UKICAgKiBgYGAKICAgKiBzdHJlYW0ubWFwKG1hcHBpbmcpLnRyYW5zZm9ybSh0cmFuc2Zvcm1hdGlvbikudG9MaXN0KCkKICAgKiBgYGAKICAgKiB3aGljaCBjYW4gYmUgbW9yZSBjb252ZW5pZW50IHRoYW4gY2FsbGluZyBgYmluZGAgZGlyZWN0bHkuCiAgICoKICAgKiBUaGUgW3N0cmVhbVRyYW5zZm9ybWVyXSBjYW4gcmV0dXJuIGFueSBzdHJlYW0uCiAgICogV2hldGhlciB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbSBvciBub3QsCiAgICogYW5kIHdoaWNoIGVsZW1lbnRzIGl0IHdpbGwgY29udGFpbiwKICAgKiBpcyBlbnRpcmVseSB1cCB0byB0aGUgdHJhbnNmb3JtYXRpb24uCiAgICovCiAgU3RyZWFtPFM+IHRyYW5zZm9ybTxTPihTdHJlYW1UcmFuc2Zvcm1lcjxULCBTPiBzdHJlYW1UcmFuc2Zvcm1lcikgewogICAgcmV0dXJuIHN0cmVhbVRyYW5zZm9ybWVyLmJpbmQodGhpcyk7CiAgfQoKICAvKioKICAgKiBDb21iaW5lcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyBieSByZXBlYXRlZGx5IGFwcGx5aW5nIFtjb21iaW5lXS4KICAgKgogICAqIFNpbWlsYXIgdG8gW0l0ZXJhYmxlLnJlZHVjZV0sIHRoaXMgZnVuY3Rpb24gbWFpbnRhaW5zIGEgdmFsdWUsCiAgICogc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIHN0cmVhbQogICAqIGFuZCB1cGRhdGVkIGZvciBlYWNoIGZ1cnRoZXIgZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKiBGb3IgZWFjaCBlbGVtZW50IGFmdGVyIHRoZSBmaXJzdCwKICAgKiB0aGUgdmFsdWUgaXMgdXBkYXRlZCB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW2NvbWJpbmVdCiAgICogd2l0aCB0aGUgcHJldmlvdXMgdmFsdWUgYW5kIHRoZSBlbGVtZW50LgogICAqCiAgICogV2hlbiB0aGlzIHN0cmVhbSBpcyBkb25lLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoCiAgICogdGhlIHZhbHVlIGF0IHRoYXQgdGltZS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGlzIGVtcHR5LCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoCiAgICogYW4gZXJyb3IuCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIHRoZSBjYWxsIHRvIFtjb21iaW5lXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIGlzIHN0b3BwZWQuCiAgICovCiAgRnV0dXJlPFQ+IHJlZHVjZShUIGNvbWJpbmUoVCBwcmV2aW91cywgVCBlbGVtZW50KSkgewogICAgX0Z1dHVyZTxUPiByZXN1bHQgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgYm9vbCBzZWVuRmlyc3QgPSBmYWxzZTsKICAgIFQgdmFsdWU7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgaWYgKHNlZW5GaXJzdCkgewogICAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gY29tYmluZSh2YWx1ZSwgZWxlbWVudCksIChUIG5ld1ZhbHVlKSB7CiAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIHJlc3VsdCkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgPSBlbGVtZW50OwogICAgICAgICAgICBzZWVuRmlyc3QgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogcmVzdWx0Ll9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKCFzZWVuRmlyc3QpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAvLyBUaHJvdyBhbmQgcmVjYXRjaCwgaW5zdGVhZCBvZiBqdXN0IGRvaW5nCiAgICAgICAgICAgICAgLy8gIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrLCBlLCB0aGVFcnJvciwgU3RhY2tUcmFjZS5jdXJyZW50KSwKICAgICAgICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc3RhY2tUcmFjZSBpcyBzZXQgb24gdGhlIGVycm9yLgogICAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgICAgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2socmVzdWx0LCBlLCBzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZSh2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBDb21iaW5lcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyBieSByZXBlYXRlZGx5IGFwcGx5aW5nIFtjb21iaW5lXS4KICAgKgogICAqIFNpbWlsYXIgdG8gW0l0ZXJhYmxlLmZvbGRdLCB0aGlzIGZ1bmN0aW9uIG1haW50YWlucyBhIHZhbHVlLAogICAqIHN0YXJ0aW5nIHdpdGggW2luaXRpYWxWYWx1ZV0gYW5kIHVwZGF0ZWQgZm9yIGVhY2ggZWxlbWVudCBvZgogICAqIHRoaXMgc3RyZWFtLgogICAqIEZvciBlYWNoIGVsZW1lbnQsIHRoZSB2YWx1ZSBpcyB1cGRhdGVkIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZwogICAqIFtjb21iaW5lXSB3aXRoIHRoZSBwcmV2aW91cyB2YWx1ZSBhbmQgdGhlIGVsZW1lbnQuCiAgICoKICAgKiBXaGVuIHRoaXMgc3RyZWFtIGlzIGRvbmUsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGgKICAgKiB0aGUgdmFsdWUgYXQgdGhhdCB0aW1lLgogICAqIEZvciBhbiBlbXB0eSBzdHJlYW0sIHRoZSBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggW2luaXRpYWxWYWx1ZV0uCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgb3IgdGhlIGNhbGwgdG8gW2NvbWJpbmVdIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3NpbmcgaXMgc3RvcHBlZC4KICAgKi8KICBGdXR1cmU8Uz4gZm9sZDxTPihTIGluaXRpYWxWYWx1ZSwgUyBjb21iaW5lKFMgcHJldmlvdXMsIFQgZWxlbWVudCkpIHsKICAgIF9GdXR1cmU8Uz4gcmVzdWx0ID0gbmV3IF9GdXR1cmU8Uz4oKTsKICAgIFMgdmFsdWUgPSBpbml0aWFsVmFsdWU7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZWxlbWVudCkgewogICAgICAgICAgX3J1blVzZXJDb2RlKCgpID0+IGNvbWJpbmUodmFsdWUsIGVsZW1lbnQpLCAoUyBuZXdWYWx1ZSkgewogICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIHJlc3VsdCkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogcmVzdWx0Ll9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgcmVzdWx0Ll9jb21wbGV0ZSh2YWx1ZSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBDb21iaW5lcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVsZW1lbnRzIGludG8gYSBzaW5nbGUgc3RyaW5nLgogICAqCiAgICogRWFjaCBlbGVtZW50IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyBpdHMgW09iamVjdC50b1N0cmluZ10gbWV0aG9kLgogICAqIElmIFtzZXBhcmF0b3JdIGlzIHByb3ZpZGVkLCBpdCBpcyBpbnNlcnRlZCBiZXR3ZWVuIGVsZW1lbnQgc3RyaW5nCiAgICogcmVwcmVzZW50YXRpb25zLgogICAqCiAgICogVGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGUgY29tYmluZWQgc3RyaW5nIHdoZW4gdGhpcyBzdHJlYW0KICAgKiBpcyBkb25lLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIHRoZSBjYWxsIHRvIFtPYmplY3QudG9TdHJpbmddIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICovCiAgRnV0dXJlPFN0cmluZz4gam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgX0Z1dHVyZTxTdHJpbmc+IHJlc3VsdCA9IG5ldyBfRnV0dXJlPFN0cmluZz4oKTsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCBlbGVtZW50KSB7CiAgICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICAgIGJ1ZmZlci53cml0ZShzZXBhcmF0b3IpOwogICAgICAgICAgfQogICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGJ1ZmZlci53cml0ZShlbGVtZW50KTsKICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgX2NhbmNlbEFuZEVycm9yV2l0aFJlcGxhY2VtZW50KHN1YnNjcmlwdGlvbiwgcmVzdWx0LCBlLCBzKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IHJlc3VsdC5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIHJlc3VsdC5fY29tcGxldGUoYnVmZmVyLnRvU3RyaW5nKCkpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIFtuZWVkbGVdIG9jY3VycyBpbiB0aGUgZWxlbWVudHMgcHJvdmlkZWQgYnkgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBDb21wYXJlcyBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0gdG8gW25lZWRsZV0gdXNpbmcgW09iamVjdC49PV0uCiAgICogSWYgYW4gZXF1YWwgZWxlbWVudCBpcyBmb3VuZCwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgdHJ1ZWAuCiAgICogSWYgdGhpcyBzdHJlYW0gZW5kcyB3aXRob3V0IGZpbmRpbmcgYSBtYXRjaCwgdGhlIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aAogICAqIGBmYWxzZWAuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgb3IgdGhlIGNhbGwgdG8gW09iamVjdC49PV0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmU8Ym9vbD4gY29udGFpbnMoT2JqZWN0IG5lZWRsZSkgewogICAgX0Z1dHVyZTxib29sPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxib29sPigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIGVsZW1lbnQpIHsKICAgICAgICAgIF9ydW5Vc2VyQ29kZSgoKSA9PiAoZWxlbWVudCA9PSBuZWVkbGUpLCAoYm9vbCBpc01hdGNoKSB7CiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7CiAgICAgICAgICAgICAgX2NhbmNlbEFuZFZhbHVlKHN1YnNjcmlwdGlvbiwgZnV0dXJlLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZShmYWxzZSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBFeGVjdXRlcyBbYWN0aW9uXSBvbiBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBDb21wbGV0ZXMgdGhlIHJldHVybmVkIFtGdXR1cmVdIHdoZW4gYWxsIGVsZW1lbnRzIG9mIHRoaXMgc3RyZWFtCiAgICogaGF2ZSBiZWVuIHByb2Nlc3NlZC4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciBpZiB0aGUgY2FsbCB0byBbYWN0aW9uXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqLwogIEZ1dHVyZSBmb3JFYWNoKHZvaWQgYWN0aW9uKFQgZWxlbWVudCkpIHsKICAgIF9GdXR1cmUgZnV0dXJlID0gbmV3IF9GdXR1cmUoKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCBlbGVtZW50KSB7CiAgICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHR5cGUgc2hvdWxkIGJlICd2b2lkJyBhbmQgaW5mZXJyZWQuCiAgICAgICAgICBfcnVuVXNlckNvZGU8ZHluYW1pYz4oKCkgPT4gYWN0aW9uKGVsZW1lbnQpLCAoXykge30sCiAgICAgICAgICAgICAgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZShudWxsKTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIENoZWNrcyB3aGV0aGVyIFt0ZXN0XSBhY2NlcHRzIGFsbCBlbGVtZW50cyBwcm92aWRlZCBieSB0aGlzIHN0cmVhbS4KICAgKgogICAqIENhbGxzIFt0ZXN0XSBvbiBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0uCiAgICogSWYgdGhlIGNhbGwgcmV0dXJucyBgZmFsc2VgLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIGBmYWxzZWAKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVuZHMgd2l0aG91dCBmaW5kaW5nIGFuIGVsZW1lbnQgdGhhdCBbdGVzdF0gcmVqZWN0cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIGB0cnVlYC4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCBvciBpZiB0aGUgY2FsbCB0byBbdGVzdF0gdGhyb3dzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKi8KICBGdXR1cmU8Ym9vbD4gZXZlcnkoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIF9GdXR1cmU8Ym9vbD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8Ym9vbD4oKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCBlbGVtZW50KSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdGVzdChlbGVtZW50KSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoIWlzTWF0Y2gpIHsKICAgICAgICAgICAgICBfY2FuY2VsQW5kVmFsdWUoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZSh0cnVlKTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIENoZWNrcyB3aGV0aGVyIFt0ZXN0XSBhY2NlcHRzIGFueSBlbGVtZW50IHByb3ZpZGVkIGJ5IHRoaXMgc3RyZWFtLgogICAqCiAgICogQ2FsbHMgW3Rlc3RdIG9uIGVhY2ggZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKiBJZiB0aGUgY2FsbCByZXR1cm5zIGB0cnVlYCwgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBgdHJ1ZWAKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVuZHMgd2l0aG91dCBmaW5kaW5nIGFuIGVsZW1lbnQgdGhhdCBbdGVzdF0gYWNjZXB0cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIGBmYWxzZWAuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciwgb3IgaWYgdGhlIGNhbGwgdG8gW3Rlc3RdIHRocm93cywKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IsCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICovCiAgRnV0dXJlPGJvb2w+IGFueShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgX0Z1dHVyZTxib29sPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxib29sPigpOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIGVsZW1lbnQpIHsKICAgICAgICAgIF9ydW5Vc2VyQ29kZSgoKSA9PiB0ZXN0KGVsZW1lbnQpLCAoYm9vbCBpc01hdGNoKSB7CiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7CiAgICAgICAgICAgICAgX2NhbmNlbEFuZFZhbHVlKHN1YnNjcmlwdGlvbiwgZnV0dXJlLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZShmYWxzZSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgc3RyZWFtLgogICAqCiAgICogV2FpdHMgZm9yIGFsbCBlbGVtZW50cyBvZiB0aGlzIHN0cmVhbS4gV2hlbiB0aGlzIHN0cmVhbSBlbmRzLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhlIG51bWJlciBvZiBlbGVtZW50cy4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvciwKICAgKiBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGxpc3RlbnMgdG8gdGhpcyBzdHJlYW0sIGFuZCBhIG5vbi1icm9hZGNhc3Qgc3RyZWFtIGNhbm5vdAogICAqIGJlIHJldXNlZCBhZnRlciBmaW5kaW5nIGl0cyBsZW5ndGguCiAgICovCiAgRnV0dXJlPGludD4gZ2V0IGxlbmd0aCB7CiAgICBfRnV0dXJlPGludD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8aW50PigpOwogICAgaW50IGNvdW50ID0gMDsKICAgIHRoaXMubGlzdGVuKAogICAgICAgIChfKSB7CiAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZShjb3VudCk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgc3RyZWFtIGNvbnRhaW5zIGFueSBlbGVtZW50cy4KICAgKgogICAqIFdhaXRzIGZvciB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIHN0cmVhbSwgdGhlbiBjb21wbGV0ZXMgdGhlIHJldHVybmVkCiAgICogZnV0dXJlIHdpdGggYHRydWVgLgogICAqIElmIHRoaXMgc3RyZWFtIGVuZHMgd2l0aG91dCBlbWl0dGluZyBhbnkgZWxlbWVudHMsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMKICAgKiBjb21wbGV0ZWQgd2l0aCBgZmFsc2VgLgogICAqCiAgICogSWYgdGhlIGZpcnN0IGV2ZW50IGlzIGFuIGVycm9yLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQKICAgKiBlcnJvci4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIGxpc3RlbnMgdG8gdGhpcyBzdHJlYW0sIGFuZCBhIG5vbi1icm9hZGNhc3Qgc3RyZWFtIGNhbm5vdAogICAqIGJlIHJldXNlZCBhZnRlciBjaGVja2luZyB3aGV0aGVyIGl0IGlzIGVtcHR5LgogICAqLwogIEZ1dHVyZTxib29sPiBnZXQgaXNFbXB0eSB7CiAgICBfRnV0dXJlPGJvb2w+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPGJvb2w+KCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKF8pIHsKICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgZmFsc2UpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZSh0cnVlKTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIEFkYXB0IHRoaXMgc3RyZWFtIHRvIGJlIGEgYFN0cmVhbTxSPmAuCiAgICoKICAgKiBUaGlzIHN0cmVhbSBpcyB3cmFwcGVkIGFzIGEgYFN0cmVhbTxSPmAgd2hpY2ggY2hlY2tzIGF0IHJ1bi10aW1lIHRoYXQKICAgKiBlYWNoIGRhdGEgZXZlbnQgZW1pdHRlZCBieSB0aGlzIHN0cmVhbSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtSXS4KICAgKi8KICBTdHJlYW08Uj4gY2FzdDxSPigpID0+IFN0cmVhbS5jYXN0RnJvbTxULCBSPih0aGlzKTsKICAvKioKICAgKiBDb2xsZWN0cyBhbGwgZWxlbWVudHMgb2YgdGhpcyBzdHJlYW0gaW4gYSBbTGlzdF0uCiAgICoKICAgKiBDcmVhdGVzIGEgYExpc3Q8VD5gIGFuZCBhZGRzIGFsbCBlbGVtZW50cyBvZiB0aGlzIHN0cmVhbSB0byB0aGUgbGlzdAogICAqIGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4KICAgKiBXaGVuIHRoaXMgc3RyZWFtIGVuZHMsIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBsaXN0LgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqLwogIEZ1dHVyZTxMaXN0PFQ+PiB0b0xpc3QoKSB7CiAgICBMaXN0PFQ+IHJlc3VsdCA9IDxUPltdOwogICAgX0Z1dHVyZTxMaXN0PFQ+PiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxMaXN0PFQ+PigpOwogICAgdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgZGF0YSkgewogICAgICAgICAgcmVzdWx0LmFkZChkYXRhKTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIENvbGxlY3RzIHRoZSBkYXRhIG9mIHRoaXMgc3RyZWFtIGluIGEgW1NldF0uCiAgICoKICAgKiBDcmVhdGVzIGEgYFNldDxUPmAgYW5kIGFkZHMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgc3RyZWFtIHRvIHRoZSBzZXQuCiAgICogaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLgogICAqIFdoZW4gdGhpcyBzdHJlYW0gZW5kcywgdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IHNldC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzZXQgaXMgdGhlIHNhbWUgdHlwZSBhcyByZXR1cm5lZCBieSBgbmV3IFNldDxUPigpYC4KICAgKiBJZiBhbm90aGVyIHR5cGUgb2Ygc2V0IGlzIG5lZWRlZCwgZWl0aGVyIHVzZSBbZm9yRWFjaF0gdG8gYWRkIGVhY2gKICAgKiBlbGVtZW50IHRvIHRoZSBzZXQsIG9yIHVzZQogICAqIGB0b0xpc3QoKS50aGVuKChsaXN0KSA9PiBuZXcgU29tZU90aGVyU2V0LmZyb20obGlzdCkpYAogICAqIHRvIGNyZWF0ZSB0aGUgc2V0LgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqLwogIEZ1dHVyZTxTZXQ8VD4+IHRvU2V0KCkgewogICAgU2V0PFQ+IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTsKICAgIF9GdXR1cmU8U2V0PFQ+PiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxTZXQ8VD4+KCk7CiAgICB0aGlzLmxpc3RlbigKICAgICAgICAoVCBkYXRhKSB7CiAgICAgICAgICByZXN1bHQuYWRkKGRhdGEpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZShyZXN1bHQpOwogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRGlzY2FyZHMgYWxsIGRhdGEgb24gdGhpcyBzdHJlYW0sIGJ1dCBzaWduYWxzIHdoZW4gaXQgaXMgZG9uZSBvciBhbiBlcnJvcgogICAqIG9jY3VycmVkLgogICAqCiAgICogV2hlbiBzdWJzY3JpYmluZyB1c2luZyBbZHJhaW5dLCBjYW5jZWxPbkVycm9yIHdpbGwgYmUgdHJ1ZS4gVGhpcyBtZWFucwogICAqIHRoYXQgdGhlIGZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggdGhlIGZpcnN0IGVycm9yIG9uIHRoaXMgc3RyZWFtIGFuZCB0aGVuCiAgICogY2FuY2VsIHRoZSBzdWJzY3JpcHRpb24uCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IsIG9yIHRoZSBjYWxsIHRvIFtjb21iaW5lXSB0aHJvd3MsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLAogICAqIGFuZCBwcm9jZXNzaW5nIGlzIHN0b3BwZWQuCiAgICoKICAgKiBJbiBjYXNlIG9mIGEgYGRvbmVgIGV2ZW50IHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhlIGdpdmVuCiAgICogW2Z1dHVyZVZhbHVlXS4KICAgKi8KICBGdXR1cmU8RT4gZHJhaW48RT4oW0UgZnV0dXJlVmFsdWVdKSA9PgogICAgICBsaXN0ZW4obnVsbCwgY2FuY2VsT25FcnJvcjogdHJ1ZSkuYXNGdXR1cmU8RT4oZnV0dXJlVmFsdWUpOwoKICAvKioKICAgKiBQcm92aWRlcyBhdCBtb3N0IHRoZSBmaXJzdCBbY291bnRdIGRhdGEgZXZlbnRzIG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBzYW1lIGV2ZW50cyB0aGF0IHRoaXMgc3RyZWFtIHdvdWxkCiAgICogaWYgbGlzdGVuZWQgdG8gYXQgdGhlIHNhbWUgdGltZSwKICAgKiB1bnRpbCBlaXRoZXIgdGhpcyBzdHJlYW0gZW5kcyBvciBpdCBoYXMgZW1pdHRlZCBbY291bnRdIGRhdGEgZXZlbnRzLAogICAqIGF0IHdoaWNoIHBvaW50IHRoZSByZXR1cm5lZCBzdHJlYW0gaXMgZG9uZS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIHByb2R1Y2VzIGZld2VyIHRoYW4gW2NvdW50XSBkYXRhIGV2ZW50cyBiZWZvcmUgaXQncyBkb25lLAogICAqIHNvIHdpbGwgdGhlIHJldHVybmVkIHN0cmVhbS4KICAgKgogICAqIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gdGhpcyBzdHJlYW0gd2hlbiB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvCiAgICogYW5kIHN0b3BzIGxpc3RlbmluZyB3aGVuIHRoZSBmaXJzdCBbY291bnRdIGRhdGEgZXZlbnRzIGhhdmUgYmVlbiByZWNlaXZlZC4KICAgKgogICAqIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGlzIGlzIGEgc2luZ2xlLXN1YnNjcmlwdGlvbiAobm9uLWJyb2FkY2FzdCkgc3RyZWFtcwogICAqIGl0IGNhbm5vdCBiZSByZXVzZWQgYWZ0ZXIgdGhlIHJldHVybmVkIHN0cmVhbSBoYXMgYmVlbiBsaXN0ZW5lZCB0by4KICAgKgogICAqIElmIHRoaXMgaXMgYSBicm9hZGNhc3Qgc3RyZWFtLCB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGEgYnJvYWRjYXN0IHN0cmVhbS4KICAgKiBJbiB0aGF0IGNhc2UsIHRoZSBldmVudHMgYXJlIG9ubHkgY291bnRlZCBmcm9tIHRoZSB0aW1lCiAgICogdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAgKi8KICBTdHJlYW08VD4gdGFrZShpbnQgY291bnQpIHsKICAgIHJldHVybiBuZXcgX1Rha2VTdHJlYW08VD4odGhpcywgY291bnQpOwogIH0KCiAgLyoqCiAgICogRm9yd2FyZHMgZGF0YSBldmVudHMgd2hpbGUgW3Rlc3RdIGlzIHN1Y2Nlc3NmdWwuCiAgICoKICAgKiBSZXR1cm5zIGEgc3RyZWFtIHRoYXQgcHJvdmlkZXMgdGhlIHNhbWUgZXZlbnRzIGFzIHRoaXMgc3RyZWFtCiAgICogdW50aWwgW3Rlc3RdIGZhaWxzIGZvciBhIGRhdGEgZXZlbnQuCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBkb25lIHdoZW4gZWl0aGVyIHRoaXMgc3RyZWFtIGlzIGRvbmUsCiAgICogb3Igd2hlbiB0aGlzIHN0cmVhbSBmaXJzdCBlbWl0cyBhIGRhdGEgZXZlbnQgdGhhdCBmYWlscyBbdGVzdF0uCiAgICoKICAgKiBUaGUgYHRlc3RgIGNhbGwgaXMgY29uc2lkZXJlZCBmYWlsaW5nIGlmIGl0IHJldHVybnMgYSBub24tYHRydWVgIHZhbHVlCiAgICogb3IgaWYgaXQgdGhyb3dzLiBJZiB0aGUgYHRlc3RgIGNhbGwgdGhyb3dzLCB0aGUgZXJyb3IgaXMgZW1pdHRlZCBhcyB0aGUKICAgKiBsYXN0IGV2ZW50IG9uIHRoZSByZXR1cm5lZCBzdHJlYW1zLgogICAqCiAgICogU3RvcHMgbGlzdGVuaW5nIHRvIHRoaXMgc3RyZWFtIGFmdGVyIHRoZSBhY2NlcHRlZCBlbGVtZW50cy4KICAgKgogICAqIEludGVybmFsbHkgdGhlIG1ldGhvZCBjYW5jZWxzIGl0cyBzdWJzY3JpcHRpb24gYWZ0ZXIgdGhlc2UgZWxlbWVudHMuIFRoaXMKICAgKiBtZWFucyB0aGF0IHNpbmdsZS1zdWJzY3JpcHRpb24gKG5vbi1icm9hZGNhc3QpIHN0cmVhbXMgYXJlIGNsb3NlZCBhbmQKICAgKiBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGEgY2FsbCB0byB0aGlzIG1ldGhvZC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIEZvciBhIGJyb2FkY2FzdCBzdHJlYW0sIHRoZSBldmVudHMgYXJlIG9ubHkgdGVzdGVkIGZyb20gdGhlIHRpbWUKICAgKiB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLgogICAqLwogIFN0cmVhbTxUPiB0YWtlV2hpbGUoYm9vbCB0ZXN0KFQgZWxlbWVudCkpIHsKICAgIHJldHVybiBuZXcgX1Rha2VXaGlsZVN0cmVhbTxUPih0aGlzLCB0ZXN0KTsKICB9CgogIC8qKgogICAqIFNraXBzIHRoZSBmaXJzdCBbY291bnRdIGRhdGEgZXZlbnRzIGZyb20gdGhpcyBzdHJlYW0uCiAgICoKICAgKiBSZXR1cm5zIGEgc3RyZWFtIHRoYXQgZW1pdHMgdGhlIHNhbWUgZXZlbnRzIGFzIHRoaXMgc3RyZWFtIHdvdWxkCiAgICogaWYgbGlzdGVuZWQgdG8gYXQgdGhlIHNhbWUgdGltZSwgZXhjZXB0IHRoYXQgdGhlIGZpcnN0IFtjb3VudF0KICAgKiBkYXRhIGV2ZW50cyBhcmUgbm90IGVtaXR0ZWQuCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBkb25lIHdoZW4gdGhpcyBzdHJlYW0gaXMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBmZXdlciB0aGFuIFtjb3VudF0gZGF0YSBldmVudHMKICAgKiBiZWZvcmUgYmVpbmcgZG9uZSwgdGhlIHJldHVybmVkIHN0cmVhbSBlbWl0cyBubyBkYXRhIGV2ZW50cy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBzdHJlYW0gaXMgYSBicm9hZGNhc3Qgc3RyZWFtIGlmIHRoaXMgc3RyZWFtIGlzLgogICAqIEZvciBhIGJyb2FkY2FzdCBzdHJlYW0sIHRoZSBldmVudHMgYXJlIG9ubHkgY291bnRlZCBmcm9tIHRoZSB0aW1lCiAgICogdGhlIHJldHVybmVkIHN0cmVhbSBpcyBsaXN0ZW5lZCB0by4KICAgKi8KICBTdHJlYW08VD4gc2tpcChpbnQgY291bnQpIHsKICAgIHJldHVybiBuZXcgX1NraXBTdHJlYW08VD4odGhpcywgY291bnQpOwogIH0KCiAgLyoqCiAgICogU2tpcCBkYXRhIGV2ZW50cyBmcm9tIHRoaXMgc3RyZWFtIHdoaWxlIHRoZXkgYXJlIG1hdGNoZWQgYnkgW3Rlc3RdLgogICAqCiAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbSwKICAgKiBleGNlcHQgdGhhdCBkYXRhIGV2ZW50cyBhcmUgbm90IGVtaXR0ZWQgdW50aWwgYSBkYXRhIGV2ZW50IGZhaWxzIGB0ZXN0YC4KICAgKiBUaGUgdGVzdCBmYWlscyB3aGVuIGNhbGxlZCB3aXRoIGEgZGF0YSBldmVudAogICAqIGlmIGl0IHJldHVybnMgYSBub24tYHRydWVgIHZhbHVlIG9yIGlmIHRoZSBjYWxsIHRvIGB0ZXN0YCB0aHJvd3MuCiAgICogSWYgdGhlIGNhbGwgdGhyb3dzLCB0aGUgZXJyb3IgaXMgZW1pdHRlZCBhcyBhbiBlcnJvciBldmVudAogICAqIG9uIHRoZSByZXR1cm5lZCBzdHJlYW0gaW5zdGVhZCBvZiB0aGUgZGF0YSBldmVudCwKICAgKiBvdGhlcndpc2UgdGhlIGV2ZW50IHRoYXQgbWFkZSBgdGVzdGAgcmV0dXJuIG5vbi10cnVlIGlzIGVtaXR0ZWQgYXMgdGhlCiAgICogZmlyc3QgZGF0YSBldmVudC4KICAgKgogICAqIEVycm9yIGFuZCBkb25lIGV2ZW50cyBhcmUgcHJvdmlkZWQgYnkgdGhlIHJldHVybmVkIHN0cmVhbSB1bm1vZGlmaWVkLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICogRm9yIGEgYnJvYWRjYXN0IHN0cmVhbSwgdGhlIGV2ZW50cyBhcmUgb25seSB0ZXN0ZWQgZnJvbSB0aGUgdGltZQogICAqIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICovCiAgU3RyZWFtPFQ+IHNraXBXaGlsZShib29sIHRlc3QoVCBlbGVtZW50KSkgewogICAgcmV0dXJuIG5ldyBfU2tpcFdoaWxlU3RyZWFtPFQ+KHRoaXMsIHRlc3QpOwogIH0KCiAgLyoqCiAgICogU2tpcHMgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgZXF1YWwgdG8gdGhlIHByZXZpb3VzIGRhdGEgZXZlbnQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIHByb3ZpZGVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbSwgZXhjZXB0CiAgICogdGhhdCBpdCBuZXZlciBwcm92aWRlcyB0d28gY29uc2VjdXRpdmUgZGF0YSBldmVudHMgdGhhdCBhcmUgZXF1YWwuCiAgICogVGhhdCBpcywgZXJyb3JzIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgcmV0dXJuZWQgc3RyZWFtLCBhbmQKICAgKiBkYXRhIGV2ZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggaWYgdGhleSBhcmUgZGlzdGluY3QgZnJvbSB0aGUgbW9zdAogICAqIHJlY2VudGx5IGVtaXR0ZWQgZGF0YSBldmVudC4KICAgKgogICAqIEVxdWFsaXR5IGlzIGRldGVybWluZWQgYnkgdGhlIHByb3ZpZGVkIFtlcXVhbHNdIG1ldGhvZC4gSWYgdGhhdCBpcwogICAqIG9taXR0ZWQsIHRoZSAnPT0nIG9wZXJhdG9yIG9uIHRoZSBsYXN0IHByb3ZpZGVkIGRhdGEgZWxlbWVudCBpcyB1c2VkLgogICAqCiAgICogSWYgW2VxdWFsc10gdGhyb3dzLCB0aGUgZGF0YSBldmVudCBpcyByZXBsYWNlZCBieSBhbiBlcnJvciBldmVudAogICAqIGNvbnRhaW5pbmcgdGhlIHRocm93biBlcnJvci4gVGhlIGJlaGF2aW9yIGlzIGVxdWl2YWxlbnQgdG8gdGhlCiAgICogb3JpZ2luYWwgc3RyZWFtIGVtaXR0aW5nIHRoZSBlcnJvciBldmVudCwgYW5kIGl0IGRvZXNuJ3QgY2hhbmdlCiAgICogdGhlIHdoYXQgdGhlIG1vc3QgcmVjZW50bHkgZW1pdHRlZCBkYXRhIGV2ZW50IGlzLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICogSWYgYSBicm9hZGNhc3Qgc3RyZWFtIGlzIGxpc3RlbmVkIHRvIG1vcmUgdGhhbiBvbmNlLCBlYWNoIHN1YnNjcmlwdGlvbgogICAqIHdpbGwgaW5kaXZpZHVhbGx5IHBlcmZvcm0gdGhlIGBlcXVhbHNgIHRlc3QuCiAgICovCiAgU3RyZWFtPFQ+IGRpc3RpbmN0KFtib29sIGVxdWFscyhUIHByZXZpb3VzLCBUIG5leHQpXSkgewogICAgcmV0dXJuIG5ldyBfRGlzdGluY3RTdHJlYW08VD4odGhpcywgZXF1YWxzKTsKICB9CgogIC8qKgogICAqIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogU3RvcHMgbGlzdGVuaW5nIHRvIHRoaXMgc3RyZWFtIGFmdGVyIHRoZSBmaXJzdCBlbGVtZW50IGhhcyBiZWVuIHJlY2VpdmVkLgogICAqCiAgICogSW50ZXJuYWxseSB0aGUgbWV0aG9kIGNhbmNlbHMgaXRzIHN1YnNjcmlwdGlvbiBhZnRlciB0aGUgZmlyc3QgZWxlbWVudC4KICAgKiBUaGlzIG1lYW5zIHRoYXQgc2luZ2xlLXN1YnNjcmlwdGlvbiAobm9uLWJyb2FkY2FzdCkgc3RyZWFtcyBhcmUgY2xvc2VkCiAgICogYW5kIGNhbm5vdCBiZSByZXVzZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZ2V0dGVyLgogICAqCiAgICogSWYgYW4gZXJyb3IgZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgZmlyc3QgZGF0YSBldmVudCwgdGhlIHJldHVybmVkIGZ1dHVyZQogICAqIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBpcyBlbXB0eSAoYSBkb25lIGV2ZW50IG9jY3VycyBiZWZvcmUgdGhlIGZpcnN0IGRhdGEgZXZlbnQpLAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IuCiAgICoKICAgKiBFeGNlcHQgZm9yIHRoZSB0eXBlIG9mIHRoZSBlcnJvciwgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0bwogICAqIGB0aGlzLmVsZW1lbnRBdCgwKWAuCiAgICovCiAgRnV0dXJlPFQ+IGdldCBmaXJzdCB7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgdmFsdWUpIHsKICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgdmFsdWUpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKGZ1dHVyZSwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBUaGUgbGFzdCBlbGVtZW50IG9mIHRoaXMgc3RyZWFtLgogICAqCiAgICogSWYgdGhpcyBzdHJlYW0gZW1pdHMgYW4gZXJyb3IgZXZlbnQsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yCiAgICogYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBpcyBlbXB0eSAodGhlIGRvbmUgZXZlbnQgaXMgdGhlIGZpcnN0IGV2ZW50KSwKICAgKiB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLgogICAqLwogIEZ1dHVyZTxUPiBnZXQgbGFzdCB7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBUIHJlc3VsdDsKICAgIGJvb2wgZm91bmRSZXN1bHQgPSBmYWxzZTsKICAgIGxpc3RlbigKICAgICAgICAoVCB2YWx1ZSkgewogICAgICAgICAgZm91bmRSZXN1bHQgPSB0cnVlOwogICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiBmdXR1cmUuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICBpZiAoZm91bmRSZXN1bHQpIHsKICAgICAgICAgICAgZnV0dXJlLl9jb21wbGV0ZShyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2soZnV0dXJlLCBlLCBzKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgcmV0dXJuIGZ1dHVyZTsKICB9CgogIC8qKgogICAqIFRoZSBzaW5nbGUgZWxlbWVudCBvZiB0aGlzIHN0cmVhbS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yIGV2ZW50LAogICAqIHRoZSByZXR1cm5lZCBmdXR1cmUgaXMgY29tcGxldGVkIHdpdGggdGhhdCBlcnJvcgogICAqIGFuZCBwcm9jZXNzaW5nIHN0b3BzLgogICAqCiAgICogSWYgW3RoaXNdIGlzIGVtcHR5IG9yIGhhcyBtb3JlIHRoYW4gb25lIGVsZW1lbnQsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvci4KICAgKi8KICBGdXR1cmU8VD4gZ2V0IHNpbmdsZSB7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlPFQ+KCk7CiAgICBUIHJlc3VsdDsKICAgIGJvb2wgZm91bmRSZXN1bHQgPSBmYWxzZTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbigKICAgICAgICAoVCB2YWx1ZSkgewogICAgICAgICAgaWYgKGZvdW5kUmVzdWx0KSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCBlbGVtZW50IHdlIGdldC4KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgICBfY2FuY2VsQW5kRXJyb3JXaXRoUmVwbGFjZW1lbnQoc3Vic2NyaXB0aW9uLCBmdXR1cmUsIGUsIHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGZvdW5kUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKGZvdW5kUmVzdWx0KSB7CiAgICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKGZ1dHVyZSwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIHN0cmVhbSBtYXRjaGluZyBbdGVzdF0uCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgaXMgY29tcGxldGVkIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBzdHJlYW0KICAgKiB0aGF0IFt0ZXN0XSByZXR1cm5zIGB0cnVlYCBmb3IuCiAgICoKICAgKiBJZiBubyBzdWNoIGVsZW1lbnQgaXMgZm91bmQgYmVmb3JlIHRoaXMgc3RyZWFtIGlzIGRvbmUsIGFuZCBhCiAgICogW29yRWxzZV0gZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXN1bHQgb2YgY2FsbGluZyBbb3JFbHNlXQogICAqIGJlY29tZXMgdGhlIHZhbHVlIG9mIHRoZSBmdXR1cmUuIElmIFtvckVsc2VdIHRocm93cywgdGhlIHJldHVybmVkCiAgICogZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQgZXJyb3IuCiAgICoKICAgKiBJZiB0aGlzIHN0cmVhbSBlbWl0cyBhbiBlcnJvciBiZWZvcmUgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCB0aGF0IGVycm9yLCBhbmQgcHJvY2Vzc2luZyBzdG9wcy4KICAgKgogICAqIFN0b3BzIGxpc3RlbmluZyB0byB0aGlzIHN0cmVhbSBhZnRlciB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBvciBlcnJvcgogICAqIGhhcyBiZWVuIHJlY2VpdmVkLgogICAqCiAgICogSW50ZXJuYWxseSB0aGUgbWV0aG9kIGNhbmNlbHMgaXRzIHN1YnNjcmlwdGlvbiBhZnRlciB0aGUgZmlyc3QgZWxlbWVudCB0aGF0CiAgICogbWF0Y2hlcyB0aGUgcHJlZGljYXRlLiBUaGlzIG1lYW5zIHRoYXQgc2luZ2xlLXN1YnNjcmlwdGlvbiAobm9uLWJyb2FkY2FzdCkKICAgKiBzdHJlYW1zIGFyZSBjbG9zZWQgYW5kIGNhbm5vdCBiZSByZXVzZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgbWV0aG9kLgogICAqCiAgICogSWYgYW4gZXJyb3Igb2NjdXJzLCBvciBpZiB0aGlzIHN0cmVhbSBlbmRzIHdpdGhvdXQgZmluZGluZyBhIG1hdGNoIGFuZAogICAqIHdpdGggbm8gW29yRWxzZV0gZnVuY3Rpb24gcHJvdmlkZWQsCiAgICogdGhlIHJldHVybmVkIGZ1dHVyZSBpcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvci4KICAgKi8KICBGdXR1cmU8VD4gZmlyc3RXaGVyZShib29sIHRlc3QoVCBlbGVtZW50KSwge1Qgb3JFbHNlKCl9KSB7CiAgICBfRnV0dXJlPFQ+IGZ1dHVyZSA9IG5ldyBfRnV0dXJlKCk7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgdmFsdWUpIHsKICAgICAgICAgIF9ydW5Vc2VyQ29kZSgoKSA9PiB0ZXN0KHZhbHVlKSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FuY2VsQW5kRXJyb3JDbG9zdXJlKHN1YnNjcmlwdGlvbiwgZnV0dXJlKSk7CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiBmdXR1cmUuX2NvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiAoKSB7CiAgICAgICAgICBpZiAob3JFbHNlICE9IG51bGwpIHsKICAgICAgICAgICAgX3J1blVzZXJDb2RlKG9yRWxzZSwgZnV0dXJlLl9jb21wbGV0ZSwgZnV0dXJlLl9jb21wbGV0ZUVycm9yKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKGZ1dHVyZSwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBGaW5kcyB0aGUgbGFzdCBlbGVtZW50IGluIHRoaXMgc3RyZWFtIG1hdGNoaW5nIFt0ZXN0XS4KICAgKgogICAqIElmIHRoaXMgc3RyZWFtIGVtaXRzIGFuIGVycm9yLCB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIGNvbXBsZXRlZCB3aXRoIHRoYXQKICAgKiBlcnJvciwgYW5kIHByb2Nlc3Npbmcgc3RvcHMuCiAgICoKICAgKiBPdGhlcndpc2UgYXMgW2ZpcnN0V2hlcmVdLCBleGNlcHQgdGhhdCB0aGUgbGFzdCBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kCiAgICogaW5zdGVhZCBvZiB0aGUgZmlyc3QuCiAgICogVGhhdCBtZWFucyB0aGF0IGEgbm9uLWVycm9yIHJlc3VsdCBjYW5ub3QgYmUgcHJvdmlkZWQgYmVmb3JlIHRoaXMgc3RyZWFtCiAgICogaXMgZG9uZS4KICAgKi8KICBGdXR1cmU8VD4gbGFzdFdoZXJlKGJvb2wgdGVzdChUIGVsZW1lbnQpLCB7VCBvckVsc2UoKX0pIHsKICAgIF9GdXR1cmU8VD4gZnV0dXJlID0gbmV3IF9GdXR1cmUoKTsKICAgIFQgcmVzdWx0OwogICAgYm9vbCBmb3VuZFJlc3VsdCA9IGZhbHNlOwogICAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBfcnVuVXNlckNvZGUoKCkgPT4gdHJ1ZSA9PSB0ZXN0KHZhbHVlKSwgKGJvb2wgaXNNYXRjaCkgewogICAgICAgICAgICBpZiAoaXNNYXRjaCkgewogICAgICAgICAgICAgIGZvdW5kUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKGZvdW5kUmVzdWx0KSB7CiAgICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9yRWxzZSAhPSBudWxsKSB7CiAgICAgICAgICAgIF9ydW5Vc2VyQ29kZShvckVsc2UsIGZ1dHVyZS5fY29tcGxldGUsIGZ1dHVyZS5fY29tcGxldGVFcnJvcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgICAgICAgfSBjYXRjaCAoZSwgcykgewogICAgICAgICAgICBfY29tcGxldGVXaXRoRXJyb3JDYWxsYmFjayhmdXR1cmUsIGUsIHMpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gZnV0dXJlOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIHNpbmdsZSBlbGVtZW50IGluIHRoaXMgc3RyZWFtIG1hdGNoaW5nIFt0ZXN0XS4KICAgKgogICAqIExpa2UgW2xhc3RXaGVyZV0sIGV4Y2VwdCB0aGF0IGl0IGlzIGFuIGVycm9yIGlmIG1vcmUgdGhhbiBvbmUKICAgKiBtYXRjaGluZyBlbGVtZW50IG9jY3VycyBpbiB0aGlzIHN0cmVhbS4KICAgKi8KICBGdXR1cmU8VD4gc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KFQgZWxlbWVudCksIHtUIG9yRWxzZSgpfSkgewogICAgX0Z1dHVyZTxUPiBmdXR1cmUgPSBuZXcgX0Z1dHVyZTxUPigpOwogICAgVCByZXN1bHQ7CiAgICBib29sIGZvdW5kUmVzdWx0ID0gZmFsc2U7CiAgICBTdHJlYW1TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOwogICAgc3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW4oCiAgICAgICAgKFQgdmFsdWUpIHsKICAgICAgICAgIF9ydW5Vc2VyQ29kZSgoKSA9PiB0cnVlID09IHRlc3QodmFsdWUpLCAoYm9vbCBpc01hdGNoKSB7CiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7CiAgICAgICAgICAgICAgaWYgKGZvdW5kUmVzdWx0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgICAgICAgIF9jYW5jZWxBbmRFcnJvcldpdGhSZXBsYWNlbWVudChzdWJzY3JpcHRpb24sIGZ1dHVyZSwgZSwgcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGZvdW5kUmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbmNlbEFuZEVycm9yQ2xvc3VyZShzdWJzY3JpcHRpb24sIGZ1dHVyZSkpOwogICAgICAgIH0sCiAgICAgICAgb25FcnJvcjogZnV0dXJlLl9jb21wbGV0ZUVycm9yLAogICAgICAgIG9uRG9uZTogKCkgewogICAgICAgICAgaWYgKGZvdW5kUmVzdWx0KSB7CiAgICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGUocmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKG9yRWxzZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgX3J1blVzZXJDb2RlKG9yRWxzZSwgZnV0dXJlLl9jb21wbGV0ZSwgZnV0dXJlLl9jb21wbGV0ZUVycm9yKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICAgIF9jb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrKGZ1dHVyZSwgZSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgW2luZGV4XXRoIGRhdGEgZXZlbnQgb2YgdGhpcyBzdHJlYW0uCiAgICoKICAgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gdGhpcyBzdHJlYW0gYWZ0ZXIgdGhlIFtpbmRleF10aCBkYXRhIGV2ZW50IGhhcyBiZWVuCiAgICogcmVjZWl2ZWQuCiAgICoKICAgKiBJbnRlcm5hbGx5IHRoZSBtZXRob2QgY2FuY2VscyBpdHMgc3Vic2NyaXB0aW9uIGFmdGVyIHRoZXNlIGVsZW1lbnRzLiBUaGlzCiAgICogbWVhbnMgdGhhdCBzaW5nbGUtc3Vic2NyaXB0aW9uIChub24tYnJvYWRjYXN0KSBzdHJlYW1zIGFyZSBjbG9zZWQgYW5kCiAgICogY2Fubm90IGJlIHJldXNlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBtZXRob2QuCiAgICoKICAgKiBJZiBhbiBlcnJvciBldmVudCBvY2N1cnMgYmVmb3JlIHRoZSB2YWx1ZSBpcyBmb3VuZCwgdGhlIGZ1dHVyZSBjb21wbGV0ZXMKICAgKiB3aXRoIHRoaXMgZXJyb3IuCiAgICoKICAgKiBJZiBhIGRvbmUgZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgdmFsdWUgaXMgZm91bmQsIHRoZSBmdXR1cmUgY29tcGxldGVzCiAgICogd2l0aCBhIFtSYW5nZUVycm9yXS4KICAgKi8KICBGdXR1cmU8VD4gZWxlbWVudEF0KGludCBpbmRleCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaW5kZXgsICJpbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGluZGV4LCAiaW5kZXgiKTsKICAgIF9GdXR1cmU8VD4gZnV0dXJlID0gbmV3IF9GdXR1cmU8VD4oKTsKICAgIFN0cmVhbVN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CiAgICBpbnQgZWxlbWVudEluZGV4ID0gMDsKICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdGVuKAogICAgICAgIChUIHZhbHVlKSB7CiAgICAgICAgICBpZiAoaW5kZXggPT0gZWxlbWVudEluZGV4KSB7CiAgICAgICAgICAgIF9jYW5jZWxBbmRWYWx1ZShzdWJzY3JpcHRpb24sIGZ1dHVyZSwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBlbGVtZW50SW5kZXggKz0gMTsKICAgICAgICB9LAogICAgICAgIG9uRXJyb3I6IGZ1dHVyZS5fY29tcGxldGVFcnJvciwKICAgICAgICBvbkRvbmU6ICgpIHsKICAgICAgICAgIGZ1dHVyZS5fY29tcGxldGVFcnJvcigKICAgICAgICAgICAgICBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4IiwgbnVsbCwgZWxlbWVudEluZGV4KSk7CiAgICAgICAgfSwKICAgICAgICBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIHJldHVybiBmdXR1cmU7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSB3aXRoIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGlzIHN0cmVhbS4KICAgKgogICAqIFdoZW5ldmVyIG1vcmUgdGhhbiBbdGltZUxpbWl0XSBwYXNzZXMgYmV0d2VlbiB0d28gZXZlbnRzIGZyb20gdGhpcyBzdHJlYW0sCiAgICogdGhlIFtvblRpbWVvdXRdIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2hpY2ggY2FuIGVtaXQgZnVydGhlciBldmVudHMgb24KICAgKiB0aGUgcmV0dXJuZWQgc3RyZWFtLgogICAqCiAgICogVGhlIGNvdW50ZG93biBkb2Vzbid0IHN0YXJ0IHVudGlsIHRoZSByZXR1cm5lZCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8uCiAgICogVGhlIGNvdW50ZG93biBpcyByZXNldCBldmVyeSB0aW1lIGFuIGV2ZW50IGlzIGZvcndhcmRlZCBmcm9tIHRoaXMgc3RyZWFtLAogICAqIG9yIHdoZW4gdGhpcyBzdHJlYW0gaXMgcGF1c2VkIGFuZCByZXN1bWVkLgogICAqCiAgICogVGhlIFtvblRpbWVvdXRdIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudDogYW4KICAgKiBbRXZlbnRTaW5rXSB0aGF0IGFsbG93cyBwdXR0aW5nIGV2ZW50cyBpbnRvIHRoZSByZXR1cm5lZCBzdHJlYW0uCiAgICogVGhpcyBgRXZlbnRTaW5rYCBpcyBvbmx5IHZhbGlkIGR1cmluZyB0aGUgY2FsbCB0byBbb25UaW1lb3V0XS4KICAgKiBDYWxsaW5nIFtFdmVudFNpbmsuY2xvc2VdIG9uIHRoZSBzaW5rIHBhc3NlZCB0byBbb25UaW1lb3V0XSBjbG9zZXMgdGhlCiAgICogcmV0dXJuZWQgc3RyZWFtLCBhbmQgbm8gZnVydGhlciBldmVudHMgYXJlIHByb2Nlc3NlZC4KICAgKgogICAqIElmIFtvblRpbWVvdXRdIGlzIG9taXR0ZWQsIGEgdGltZW91dCB3aWxsIGp1c3QgcHV0IGEgW1RpbWVvdXRFeGNlcHRpb25dCiAgICogaW50byB0aGUgZXJyb3IgY2hhbm5lbCBvZiB0aGUgcmV0dXJuZWQgc3RyZWFtLgogICAqIElmIHRoZSBjYWxsIHRvIFtvblRpbWVvdXRdIHRocm93cywgdGhlIGVycm9yIGlzIGVtaXR0ZWQgb24gdGhlIHJldHVybmVkCiAgICogc3RyZWFtLgogICAqCiAgICogVGhlIHJldHVybmVkIHN0cmVhbSBpcyBhIGJyb2FkY2FzdCBzdHJlYW0gaWYgdGhpcyBzdHJlYW0gaXMuCiAgICogSWYgYSBicm9hZGNhc3Qgc3RyZWFtIGlzIGxpc3RlbmVkIHRvIG1vcmUgdGhhbiBvbmNlLCBlYWNoIHN1YnNjcmlwdGlvbgogICAqIHdpbGwgaGF2ZSBpdHMgaW5kaXZpZHVhbGx5IHRpbWVyIHRoYXQgc3RhcnRzIGNvdW50aW5nIG9uIGxpc3RlbiwKICAgKiBhbmQgdGhlIHN1YnNjcmlwdGlvbnMnIHRpbWVycyBjYW4gYmUgcGF1c2VkIGluZGl2aWR1YWxseS4KICAgKi8KICBTdHJlYW08VD4gdGltZW91dChEdXJhdGlvbiB0aW1lTGltaXQsIHt2b2lkIG9uVGltZW91dChFdmVudFNpbms8VD4gc2luayl9KSB7CiAgICBfU3RyZWFtQ29udHJvbGxlckJhc2U8VD4gY29udHJvbGxlcjsKICAgIC8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBzZXQgb24gbGlzdGVuLgogICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbjsKICAgIFRpbWVyIHRpbWVyOwogICAgWm9uZSB6b25lOwogICAgX1RpbWVyQ2FsbGJhY2sgdGltZW91dDsKCiAgICB2b2lkIG9uRGF0YShUIGV2ZW50KSB7CiAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICBjb250cm9sbGVyLmFkZChldmVudCk7CiAgICAgIHRpbWVyID0gem9uZS5jcmVhdGVUaW1lcih0aW1lTGltaXQsIHRpbWVvdXQpOwogICAgfQoKICAgIHZvaWQgb25FcnJvcihlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSB7CiAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICBhc3NlcnQoY29udHJvbGxlciBpcyBfU3RyZWFtQ29udHJvbGxlciB8fAogICAgICAgICAgY29udHJvbGxlciBpcyBfQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcik7CiAgICAgIGNvbnRyb2xsZXIuX2FkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsgLy8gQXZvaWQgWm9uZSBlcnJvciByZXBsYWNlbWVudC4KICAgICAgdGltZXIgPSB6b25lLmNyZWF0ZVRpbWVyKHRpbWVMaW1pdCwgdGltZW91dCk7CiAgICB9CgogICAgdm9pZCBvbkRvbmUoKSB7CiAgICAgIHRpbWVyLmNhbmNlbCgpOwogICAgICBjb250cm9sbGVyLmNsb3NlKCk7CiAgICB9CgogICAgdm9pZCBvbkxpc3RlbigpIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgb25MaXN0ZW4gY2FsbGJhY2sgZm9yIG9mIGNvbnRyb2xsZXIuCiAgICAgIC8vIEl0IHJ1bnMgaW4gdGhlIHNhbWUgem9uZSB0aGF0IHRoZSBzdWJzY3JpcHRpb24gd2FzIGNyZWF0ZWQgaW4uCiAgICAgIC8vIFVzZSB0aGF0IHpvbmUgZm9yIGNyZWF0aW5nIHRpbWVycyBhbmQgcnVubmluZyB0aGUgb25UaW1lb3V0CiAgICAgIC8vIGNhbGxiYWNrLgogICAgICB6b25lID0gWm9uZS5jdXJyZW50OwogICAgICBpZiAob25UaW1lb3V0ID09IG51bGwpIHsKICAgICAgICB0aW1lb3V0ID0gKCkgewogICAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcigKICAgICAgICAgICAgICBuZXcgVGltZW91dEV4Y2VwdGlvbigiTm8gc3RyZWFtIGV2ZW50IiwgdGltZUxpbWl0KSwgbnVsbCk7CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSAndm9pZCcsIGFuZCB0aGUgdHlwZQogICAgICAgIC8vIHNob3VsZCBiZSBpbmZlcnJlZC4KICAgICAgICB2YXIgcmVnaXN0ZXJlZE9uVGltZW91dCA9CiAgICAgICAgICAgIHpvbmUucmVnaXN0ZXJVbmFyeUNhbGxiYWNrPGR5bmFtaWMsIEV2ZW50U2luazxUPj4ob25UaW1lb3V0KTsKICAgICAgICB2YXIgd3JhcHBlciA9IG5ldyBfQ29udHJvbGxlckV2ZW50U2lua1dyYXBwZXI8VD4obnVsbCk7CiAgICAgICAgdGltZW91dCA9ICgpIHsKICAgICAgICAgIHdyYXBwZXIuX3NpbmsgPSBjb250cm9sbGVyOyAvLyBPbmx5IHZhbGlkIGR1cmluZyBjYWxsLgogICAgICAgICAgem9uZS5ydW5VbmFyeUd1YXJkZWQocmVnaXN0ZXJlZE9uVGltZW91dCwgd3JhcHBlcik7CiAgICAgICAgICB3cmFwcGVyLl9zaW5rID0gbnVsbDsKICAgICAgICB9OwogICAgICB9CgogICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLmxpc3RlbihvbkRhdGEsIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lKTsKICAgICAgdGltZXIgPSB6b25lLmNyZWF0ZVRpbWVyKHRpbWVMaW1pdCwgdGltZW91dCk7CiAgICB9CgogICAgRnV0dXJlIG9uQ2FuY2VsKCkgewogICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgRnV0dXJlIHJlc3VsdCA9IHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgICAgc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBjb250cm9sbGVyID0gaXNCcm9hZGNhc3QKICAgICAgICA/IG5ldyBfU3luY0Jyb2FkY2FzdFN0cmVhbUNvbnRyb2xsZXI8VD4ob25MaXN0ZW4sIG9uQ2FuY2VsKQogICAgICAgIDogbmV3IF9TeW5jU3RyZWFtQ29udHJvbGxlcjxUPihvbkxpc3RlbiwgKCkgewogICAgICAgICAgICAvLyBEb24ndCBudWxsIHRoZSB0aW1lciwgb25DYW5jZWwgbWF5IGNhbGwgY2FuY2VsIGFnYWluLgogICAgICAgICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgICAgICB9LCAoKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgICAgICAgdGltZXIgPSB6b25lLmNyZWF0ZVRpbWVyKHRpbWVMaW1pdCwgdGltZW91dCk7CiAgICAgICAgICB9LCBvbkNhbmNlbCk7CiAgICByZXR1cm4gY29udHJvbGxlci5zdHJlYW07CiAgfQp9CgovKioKICogQSBzdWJzY3JpcHRpb24gb24gZXZlbnRzIGZyb20gYSBbU3RyZWFtXS4KICoKICogV2hlbiB5b3UgbGlzdGVuIG9uIGEgW1N0cmVhbV0gdXNpbmcgW1N0cmVhbS5saXN0ZW5dLAogKiBhIFtTdHJlYW1TdWJzY3JpcHRpb25dIG9iamVjdCBpcyByZXR1cm5lZC4KICoKICogVGhlIHN1YnNjcmlwdGlvbiBwcm92aWRlcyBldmVudHMgdG8gdGhlIGxpc3RlbmVyLAogKiBhbmQgaG9sZHMgdGhlIGNhbGxiYWNrcyB1c2VkIHRvIGhhbmRsZSB0aGUgZXZlbnRzLgogKiBUaGUgc3Vic2NyaXB0aW9uIGNhbiBhbHNvIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgZnJvbSB0aGUgZXZlbnRzLAogKiBvciB0byB0ZW1wb3JhcmlseSBwYXVzZSB0aGUgZXZlbnRzIGZyb20gdGhlIHN0cmVhbS4KICovCmFic3RyYWN0IGNsYXNzIFN0cmVhbVN1YnNjcmlwdGlvbjxUPiB7CiAgLyoqCiAgICogQ2FuY2VscyB0aGlzIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIEFmdGVyIHRoaXMgY2FsbCwgdGhlIHN1YnNjcmlwdGlvbiBubyBsb25nZXIgcmVjZWl2ZXMgZXZlbnRzLgogICAqCiAgICogVGhlIHN0cmVhbSBtYXkgbmVlZCB0byBzaHV0IGRvd24gdGhlIHNvdXJjZSBvZiBldmVudHMgYW5kIGNsZWFuIHVwIGFmdGVyCiAgICogdGhlIHN1YnNjcmlwdGlvbiBpcyBjYW5jZWxlZC4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQgb25jZSB0aGUgc3RyZWFtIGhhcyBmaW5pc2hlZAogICAqIGl0cyBjbGVhbnVwLgogICAqCiAgICogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgbWF5IGFsc28gcmV0dXJuIGBudWxsYCBpZiBubyBjbGVhbnVwIHdhcyBuZWNlc3NhcnkuCiAgICogUmV0dXJuaW5nIGBudWxsYCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4KICAgKgogICAqIFR5cGljYWxseSwgZnV0dXJlcyBhcmUgcmV0dXJuZWQgd2hlbiB0aGUgc3RyZWFtIG5lZWRzIHRvIHJlbGVhc2UgcmVzb3VyY2VzLgogICAqIEZvciBleGFtcGxlLCBhIHN0cmVhbSBtaWdodCBuZWVkIHRvIGNsb3NlIGFuIG9wZW4gZmlsZSAoYXMgYW4gYXN5bmNocm9ub3VzCiAgICogb3BlcmF0aW9uKS4gSWYgdGhlIGxpc3RlbmVyIHdhbnRzIHRvIGRlbGV0ZSB0aGUgZmlsZSBhZnRlciBoYXZpbmcKICAgKiBjYW5jZWxlZCB0aGUgc3Vic2NyaXB0aW9uLCBpdCBtdXN0IHdhaXQgZm9yIHRoZSBjbGVhbnVwIGZ1dHVyZSB0byBjb21wbGV0ZS4KICAgKgogICAqIEEgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGEgYG51bGxgIHZhbHVlLgogICAqIElmIHRoZSBjbGVhbnVwIHRocm93cywgd2hpY2ggaXQgcmVhbGx5IHNob3VsZG4ndCwgdGhlIHJldHVybmVkIGZ1dHVyZQogICAqIGNvbXBsZXRlcyB3aXRoIHRoYXQgZXJyb3IuCiAgICovCiAgRnV0dXJlIGNhbmNlbCgpOwoKICAvKioKICAgKiBSZXBsYWNlcyB0aGUgZGF0YSBldmVudCBoYW5kbGVyIG9mIHRoaXMgc3Vic2NyaXB0aW9uLgogICAqCiAgICogVGhlIFtoYW5kbGVEYXRhXSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgc3RyZWFtCiAgICogYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgICogSWYgW2hhbmRsZURhdGFdIGlzIGBudWxsYCwgZnVydGhlciBlbGVtZW50cyBhcmUgaWdub3JlZC4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBjdXJyZW50IGhhbmRsZXIgc2V0IGJ5IHRoZSBpbnZvY2F0aW9uIG9mCiAgICogW1N0cmVhbS5saXN0ZW5dIG9yIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBbb25EYXRhXS4KICAgKi8KICB2b2lkIG9uRGF0YSh2b2lkIGhhbmRsZURhdGEoVCBkYXRhKSk7CgogIC8qKgogICAqIFJlcGxhY2VzIHRoZSBlcnJvciBldmVudCBoYW5kbGVyIG9mIHRoaXMgc3Vic2NyaXB0aW9uLgogICAqCiAgICogVGhlIFtoYW5kbGVFcnJvcl0gZnVuY3Rpb24gbXVzdCBiZSBhYmxlIHRvIGJlIGNhbGxlZCB3aXRoIGVpdGhlcgogICAqIG9uZSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB3aXRoIHR3byBwb3NpdGlvbmFsIGFyZ3VtZW50cwogICAqIHdoZXJlIHRoZSBzZWNvbmRzIGlzIGFsd2F5cyBhIFtTdGFja1RyYWNlXS4KICAgKgogICAqIFRoZSBbaGFuZGxlRXJyb3JdIGFyZ3VtZW50IG1heSBiZSBgbnVsbGAsIGluIHdoaWNoIGNhc2UgZnVydGhlcgogICAqIGVycm9yIGV2ZW50cyBhcmUgY29uc2lkZXJlZCB1bmhhbmRsZWQsIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHRvCiAgICogW1pvbmUuaGFuZGxlVW5jYXVnaHRFcnJvcl0uCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBhbGwgZXJyb3IgZXZlbnRzIGZyb20gdGhlCiAgICogc3RyZWFtIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBjdXJyZW50IGhhbmRsZXIgc2V0IGJ5IHRoZSBpbnZvY2F0aW9uIG9mCiAgICogW1N0cmVhbS5saXN0ZW5dLCBieSBjYWxsaW5nIFthc0Z1dHVyZV0sIG9yIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBbb25FcnJvcl0uCiAgICovCiAgdm9pZCBvbkVycm9yKEZ1bmN0aW9uIGhhbmRsZUVycm9yKTsKCiAgLyoqCiAgICogUmVwbGFjZXMgdGhlIGRvbmUgZXZlbnQgaGFuZGxlciBvZiB0aGlzIHN1YnNjcmlwdGlvbi4KICAgKgogICAqIFRoZSBbaGFuZGxlRG9uZV0gZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBjbG9zZXMuCiAgICogVGhlIHZhbHVlIG1heSBiZSBgbnVsbGAsIGluIHdoaWNoIGNhc2Ugbm8gZnVuY3Rpb24gaXMgY2FsbGVkLgogICAqCiAgICogVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIGN1cnJlbnQgaGFuZGxlciBzZXQgYnkgdGhlIGludm9jYXRpb24gb2YKICAgKiBbU3RyZWFtLmxpc3Rlbl0sIGJ5IGNhbGxpbmcgW2FzRnV0dXJlXSwgb3IgYnkgYSBwcmV2aW91cyBjYWxsIHRvIFtvbkRvbmVdLgogICAqLwogIHZvaWQgb25Eb25lKHZvaWQgaGFuZGxlRG9uZSgpKTsKCiAgLyoqCiAgICogUmVxdWVzdCB0aGF0IHRoZSBzdHJlYW0gcGF1c2VzIGV2ZW50cyB1bnRpbCBmdXJ0aGVyIG5vdGljZS4KICAgKgogICAqIFdoaWxlIHBhdXNlZCwgdGhlIHN1YnNjcmlwdGlvbiB3aWxsIG5vdCBmaXJlIGFueSBldmVudHMuCiAgICogSWYgaXQgcmVjZWl2ZXMgZXZlbnRzIGZyb20gaXRzIHNvdXJjZSwgdGhleSB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsCiAgICogdGhlIHN1YnNjcmlwdGlvbiBpcyByZXN1bWVkLgogICAqIEZvciBub24tYnJvYWRjYXN0IHN0cmVhbXMsIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBpcyB1c3VhbGx5IGluZm9ybWVkCiAgICogYWJvdXQgdGhlIHBhdXNlLAogICAqIHNvIGl0IGNhbiBzdG9wIGdlbmVyYXRpbmcgZXZlbnRzIHVudGlsIHRoZSBzdWJzY3JpcHRpb24gaXMgcmVzdW1lZC4KICAgKgogICAqIFRvIGF2b2lkIGJ1ZmZlcmluZyBldmVudHMgb24gYSBicm9hZGNhc3Qgc3RyZWFtLCBpdCBpcyBiZXR0ZXIgdG8KICAgKiBjYW5jZWwgdGhpcyBzdWJzY3JpcHRpb24sIGFuZCBzdGFydCB0byBsaXN0ZW4gYWdhaW4gd2hlbiBldmVudHMKICAgKiBhcmUgbmVlZGVkLCBpZiB0aGUgaW50ZXJtZWRpYXRlIGV2ZW50cyBhcmUgbm90IGltcG9ydGFudC4KICAgKgogICAqIElmIFtyZXN1bWVTaWduYWxdIGlzIHByb3ZpZGVkLCB0aGUgc3RyZWFtIHN1YnNjcmlwdGlvbiB3aWxsIHVuZG8gdGhlIHBhdXNlCiAgICogd2hlbiB0aGUgZnV0dXJlIGNvbXBsZXRlcywgYXMgaWYgYnkgYSBjYWxsIHRvIFtyZXN1bWVdLgogICAqIElmIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXJyb3IsCiAgICogdGhlIHN0cmVhbSB3aWxsIHN0aWxsIHJlc3VtZSwgYnV0IHRoZSBlcnJvciB3aWxsIGJlIGNvbnNpZGVyZWQgdW5oYW5kbGVkCiAgICogYW5kIGlzIHBhc3NlZCB0byBbWm9uZS5oYW5kbGVVbmNhdWdodEVycm9yXS4KICAgKgogICAqIEEgY2FsbCB0byBbcmVzdW1lXSB3aWxsIGFsc28gdW5kbyBhIHBhdXNlLgogICAqCiAgICogSWYgdGhlIHN1YnNjcmlwdGlvbiBpcyBwYXVzZWQgbW9yZSB0aGFuIG9uY2UsIGFuIGVxdWFsIG51bWJlcgogICAqIG9mIHJlc3VtZXMgbXVzdCBiZSBwZXJmb3JtZWQgdG8gcmVzdW1lIHRoZSBzdHJlYW0uCiAgICogQ2FsbHMgdG8gW3Jlc3VtZV0gYW5kIHRoZSBjb21wbGV0aW9uIG9mIGEgW3Jlc3VtZVNpZ25hbF0gYXJlCiAgICogaW50ZXJjaGFuZ2VhYmxlIC0gdGhlIFtwYXVzZV0gd2hpY2ggd2FzIHBhc3NlZCBhIFtyZXN1bWVTaWduYWxdIG1heSBiZQogICAqIGVuZGVkIGJ5IGEgY2FsbCB0byBbcmVzdW1lXSwgYW5kIGNvbXBsZXRpbmcgdGhlIFtyZXN1bWVTaWduYWxdIG1heSBlbmQgYQogICAqIGRpZmZlcmVudCBbcGF1c2VdLgogICAqCiAgICogSXQgaXMgc2FmZSB0byBbcmVzdW1lXSBvciBjb21wbGV0ZSBhIFtyZXN1bWVTaWduYWxdIGV2ZW4gd2hlbiB0aGUKICAgKiBzdWJzY3JpcHRpb24gaXMgbm90IHBhdXNlZCwgYW5kIHRoZSByZXN1bWUgd2lsbCBoYXZlIG5vIGVmZmVjdC4KICAgKgogICAqIEN1cnJlbnRseSBET00gc3RyZWFtcyBzaWxlbnRseSBkcm9wIGV2ZW50cyB3aGVuIHRoZSBzdHJlYW0gaXMgcGF1c2VkLiBUaGlzCiAgICogaXMgYSBidWcgYW5kIHdpbGwgYmUgZml4ZWQuCiAgICovCiAgdm9pZCBwYXVzZShbRnV0dXJlIHJlc3VtZVNpZ25hbF0pOwoKICAvKioKICAgKiBSZXN1bWUgYWZ0ZXIgYSBwYXVzZS4KICAgKgogICAqIFRoaXMgdW5kb2VzIG9uZSBwcmV2aW91cyBjYWxsIHRvIFtwYXVzZV0uCiAgICogV2hlbiBhbGwgcHJldmlvdXNseSBjYWxscyB0byBbcGF1c2VdIGhhdmUgYmVlbiBtYXRjaGVkIGJ5IGEgY2FsbHMgdG8KICAgKiBbcmVzdW1lXSwgcG9zc2libHkgdGhyb3VnaCBhIGByZXN1bWVTaWduYWxgIHBhc3NlZCB0byBbcGF1c2VdLAogICAqIHRoZSBzdHJlYW0gc3Vic2NyaXB0aW9uIG1heSBlbWl0IGV2ZW50cyBhZ2Fpbi4KICAgKgogICAqIEl0IGlzIHNhZmUgdG8gW3Jlc3VtZV0gZXZlbiB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgbm90IHBhdXNlZCwgYW5kIHRoZQogICAqIHJlc3VtZSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAqLwogIHZvaWQgcmVzdW1lKCk7CgogIC8qKgogICAqIFdoZXRoZXIgdGhlIFtTdHJlYW1TdWJzY3JpcHRpb25dIGlzIGN1cnJlbnRseSBwYXVzZWQuCiAgICoKICAgKiBJZiB0aGVyZSBoYXZlIGJlZW4gbW9yZSBjYWxscyB0byBbcGF1c2VdIHRoYW4gdG8gW3Jlc3VtZV0gb24gdGhpcwogICAqIHN0cmVhbSBzdWJzY3JpcHRpb24sIHRoZSBzdWJzY3JpcHRpb24gaXMgcGF1c2VkLCBhbmQgdGhpcyBnZXR0ZXIKICAgKiByZXR1cm5zIGB0cnVlYC4KICAgKgogICAqIFJldHVybnMgYGZhbHNlYCBpZiB0aGUgc3RyZWFtIGNhbiBjdXJyZW50bHkgZW1pdCBldmVudHMsIG9yIGlmCiAgICogdGhlIHN1YnNjcmlwdGlvbiBoYXMgY29tcGxldGVkIG9yIGJlZW4gY2FuY2VsbGVkLgogICAqLwogIGJvb2wgZ2V0IGlzUGF1c2VkOwoKICAvKioKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgaGFuZGxlcyB0aGUgW29uRG9uZV0gYW5kIFtvbkVycm9yXSBjYWxsYmFja3MuCiAgICoKICAgKiBUaGlzIG1ldGhvZCAqb3ZlcndyaXRlcyogdGhlIGV4aXN0aW5nIFtvbkRvbmVdIGFuZCBbb25FcnJvcl0gY2FsbGJhY2tzCiAgICogd2l0aCBuZXcgb25lcyB0aGF0IGNvbXBsZXRlIHRoZSByZXR1cm5lZCBmdXR1cmUuCiAgICoKICAgKiBJbiBjYXNlIG9mIGFuIGVycm9yIHRoZSBzdWJzY3JpcHRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNhbmNlbCAoZXZlbgogICAqIHdoZW4gaXQgd2FzIGxpc3RlbmluZyB3aXRoIGBjYW5jZWxPbkVycm9yYCBzZXQgdG8gYGZhbHNlYCkuCiAgICoKICAgKiBJbiBjYXNlIG9mIGEgYGRvbmVgIGV2ZW50IHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggdGhlIGdpdmVuCiAgICogW2Z1dHVyZVZhbHVlXS4KICAgKi8KICBGdXR1cmU8RT4gYXNGdXR1cmU8RT4oW0UgZnV0dXJlVmFsdWVdKTsKfQoKLyoqCiAqIEEgW1NpbmtdIHRoYXQgc3VwcG9ydHMgYWRkaW5nIGVycm9ycy4KICoKICogVGhpcyBtYWtlcyBpdCBzdWl0YWJsZSBmb3IgY2FwdHVyaW5nIHRoZSByZXN1bHRzIG9mIGFzeW5jaHJvbm91cwogKiBjb21wdXRhdGlvbnMsIHdoaWNoIGNhbiBjb21wbGV0ZSB3aXRoIGEgdmFsdWUgb3IgYW4gZXJyb3IuCiAqCiAqIFRoZSBbRXZlbnRTaW5rXSBoYXMgYmVlbiBkZXNpZ25lZCB0byBoYW5kbGUgYXN5bmNocm9ub3VzIGV2ZW50cyBmcm9tCiAqIFtTdHJlYW1dcy4gU2VlLCBmb3IgZXhhbXBsZSwgW1N0cmVhbS5ldmVudFRyYW5zZm9ybWVkXSB3aGljaCB1c2VzCiAqIGBFdmVudFNpbmtgcyB0byB0cmFuc2Zvcm0gZXZlbnRzLgogKi8KYWJzdHJhY3QgY2xhc3MgRXZlbnRTaW5rPFQ+IGltcGxlbWVudHMgU2luazxUPiB7CiAgLyoqCiAgICogQWRkcyBhIGRhdGEgW2V2ZW50XSB0byB0aGUgc2luay4KICAgKgogICAqIE11c3Qgbm90IGJlIGNhbGxlZCBvbiBhIGNsb3NlZCBzaW5rLgogICAqLwogIHZvaWQgYWRkKFQgZXZlbnQpOwoKICAvKioKICAgKiBBZGRzIGFuIFtlcnJvcl0gdG8gdGhlIHNpbmsuCiAgICoKICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQgb24gYSBjbG9zZWQgc2luay4KICAgKi8KICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHNpbmsuCiAgICoKICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG1vcmUgdGhhbiBvbmNlIGlzIGFsbG93ZWQsIGJ1dCBkb2VzIG5vdGhpbmcuCiAgICoKICAgKiBOZWl0aGVyIFthZGRdIG5vciBbYWRkRXJyb3JdIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMgbWV0aG9kLgogICAqLwogIHZvaWQgY2xvc2UoKTsKfQoKLyoqIFtTdHJlYW1dIHdyYXBwZXIgdGhhdCBvbmx5IGV4cG9zZXMgdGhlIFtTdHJlYW1dIGludGVyZmFjZS4gKi8KY2xhc3MgU3RyZWFtVmlldzxUPiBleHRlbmRzIFN0cmVhbTxUPiB7CiAgZmluYWwgU3RyZWFtPFQ+IF9zdHJlYW07CgogIGNvbnN0IFN0cmVhbVZpZXcoU3RyZWFtPFQ+IHN0cmVhbSkKICAgICAgOiBfc3RyZWFtID0gc3RyZWFtLAogICAgICAgIHN1cGVyLl9pbnRlcm5hbCgpOwoKICBib29sIGdldCBpc0Jyb2FkY2FzdCA9PiBfc3RyZWFtLmlzQnJvYWRjYXN0OwoKICBTdHJlYW08VD4gYXNCcm9hZGNhc3RTdHJlYW0oCiAgICAgICAgICB7dm9pZCBvbkxpc3RlbihTdHJlYW1TdWJzY3JpcHRpb248VD4gc3Vic2NyaXB0aW9uKSwKICAgICAgICAgIHZvaWQgb25DYW5jZWwoU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbil9KSA9PgogICAgICBfc3RyZWFtLmFzQnJvYWRjYXN0U3RyZWFtKG9uTGlzdGVuOiBvbkxpc3Rlbiwgb25DYW5jZWw6IG9uQ2FuY2VsKTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IGxpc3Rlbih2b2lkIG9uRGF0YShUIHZhbHVlKSwKICAgICAge0Z1bmN0aW9uIG9uRXJyb3IsIHZvaWQgb25Eb25lKCksIGJvb2wgY2FuY2VsT25FcnJvcn0pIHsKICAgIHJldHVybiBfc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KfQoKLyoqCiAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYSAic2luayIgYWNjZXB0aW5nIG11bHRpcGxlIGVudGlyZSBzdHJlYW1zLgogKgogKiBBIGNvbnN1bWVyIGNhbiBhY2NlcHQgYSBudW1iZXIgb2YgY29uc2VjdXRpdmUgc3RyZWFtcyB1c2luZyBbYWRkU3RyZWFtXSwKICogYW5kIHdoZW4gbm8gZnVydGhlciBkYXRhIG5lZWQgdG8gYmUgYWRkZWQsIHRoZSBbY2xvc2VdIG1ldGhvZCB0ZWxscyB0aGUKICogY29uc3VtZXIgdG8gY29tcGxldGUgaXRzIHdvcmsgYW5kIHNodXQgZG93bi4KICoKICogVGhlIFtTdHJlYW0ucGlwZV0gYWNjZXB0cyBhIGBTdHJlYW1Db25zdW1lcmAgYW5kIHdpbGwgcGFzcyB0aGUgc3RyZWFtCiAqIHRvIHRoZSBjb25zdW1lcidzIFthZGRTdHJlYW1dIG1ldGhvZC4gV2hlbiB0aGF0IGNvbXBsZXRlcywgaXQgd2lsbAogKiBjYWxsIFtjbG9zZV0gYW5kIHRoZW4gY29tcGxldGUgaXRzIG93biByZXR1cm5lZCBmdXR1cmUuCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1Db25zdW1lcjxTPiB7CiAgLyoqCiAgICogQ29uc3VtZXMgdGhlIGVsZW1lbnRzIG9mIFtzdHJlYW1dLgogICAqCiAgICogTGlzdGVucyBvbiBbc3RyZWFtXSBhbmQgZG9lcyBzb21ldGhpbmcgZm9yIGVhY2ggZXZlbnQuCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgZG9uZSBiZWluZyBhZGRlZCwKICAgKiBhbmQgdGhlIGNvbnN1bWVyIGlzIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBzdHJlYW0uCiAgICogTm8gZnVydGhlciBjYWxscyB0byBbYWRkU3RyZWFtXSBvciBbY2xvc2VdIHNob3VsZCBoYXBwZW4gYmVmb3JlIHRoZQogICAqIHJldHVybmVkIGZ1dHVyZSBoYXMgY29tcGxldGVkLgogICAqCiAgICogVGhlIGNvbnN1bWVyIG1heSBzdG9wIGxpc3RlbmluZyB0byB0aGUgc3RyZWFtIGFmdGVyIGFuIGVycm9yLAogICAqIGl0IG1heSBjb25zdW1lIGFsbCB0aGUgZXJyb3JzIGFuZCBvbmx5IHN0b3AgYXQgYSBkb25lIGV2ZW50LAogICAqIG9yIGl0IG1heSBiZSBjYW5jZWxlZCBlYXJseSBpZiB0aGUgcmVjZWl2ZXIgZG9uJ3Qgd2FudCBhbnkgZnVydGhlciBldmVudHMuCiAgICoKICAgKiBJZiB0aGUgY29uc3VtZXIgc3RvcHMgbGlzdGVuaW5nIGJlY2F1c2Ugb2Ygc29tZSBlcnJvciBwcmV2ZW50aW5nIGl0CiAgICogZnJvbSBjb250aW51aW5nLCBpdCBtYXkgcmVwb3J0IHRoaXMgZXJyb3IgaW4gdGhlIHJldHVybmVkIGZ1dHVyZSwKICAgKiBvdGhlcndpc2UgaXQgd2lsbCBqdXN0IGNvbXBsZXRlIHRoZSBmdXR1cmUgd2l0aCBgbnVsbGAuCiAgICovCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08Uz4gc3RyZWFtKTsKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnN1bWVyIHRoYXQgbm8gZnVydGhlciBzdHJlYW1zIHdpbGwgYmUgYWRkZWQuCiAgICoKICAgKiBUaGlzIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gY29tcGxldGUgYW55IHJlbWFpbmluZyB3b3JrIGFuZCByZWxlYXNlCiAgICogcmVzb3VyY2VzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQKICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgd2hpY2ggaXMgY29tcGxldGVkIHdoZW4gdGhlIGNvbnN1bWVyIGhhcyBzaHV0IGRvd24uCiAgICogSWYgY2xlYW5pbmcgdXAgY2FuIGZhaWwsIHRoZSBlcnJvciBtYXkgYmUgcmVwb3J0ZWQgaW4gdGhlIHJldHVybmVkIGZ1dHVyZSwKICAgKiBvdGhlcndpc2UgaXQgY29tcGxldGVzIHdpdGggYG51bGxgLgogICAqLwogIEZ1dHVyZSBjbG9zZSgpOwp9CgovKioKICogQSBvYmplY3QgdGhhdCBhY2NlcHRzIHN0cmVhbSBldmVudHMgYm90aCBzeW5jaHJvbm91c2x5IGFuZCBhc3luY2hyb25vdXNseS4KICoKICogQSBbU3RyZWFtU2lua10gY29tYmluZXMgdGhlIG1ldGhvZHMgZnJvbSBbU3RyZWFtQ29uc3VtZXJdIGFuZCBbRXZlbnRTaW5rXS4KICoKICogVGhlIFtFdmVudFNpbmtdIG1ldGhvZHMgY2FuJ3QgYmUgdXNlZCB3aGlsZSB0aGUgW2FkZFN0cmVhbV0gaXMgY2FsbGVkLgogKiBBcyBzb29uIGFzIHRoZSBbYWRkU3RyZWFtXSdzIFtGdXR1cmVdIGNvbXBsZXRlcyB3aXRoIGEgdmFsdWUsIHRoZQogKiBbRXZlbnRTaW5rXSBtZXRob2RzIGNhbiBiZSB1c2VkIGFnYWluLgogKgogKiBJZiBbYWRkU3RyZWFtXSBpcyBjYWxsZWQgYWZ0ZXIgYW55IG9mIHRoZSBbRXZlbnRTaW5rXSBtZXRob2RzLCBpdCdsbAogKiBiZSBkZWxheWVkIHVudGlsIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBoYXMgY29uc3VtZWQgdGhlIGRhdGEgYWRkZWQgYnkgdGhlCiAqIFtFdmVudFNpbmtdIG1ldGhvZHMuCiAqCiAqIFdoZW4gW0V2ZW50U2lua10gbWV0aG9kcyBhcmUgdXNlZCwgdGhlIFtkb25lXSBbRnV0dXJlXSBjYW4gYmUgdXNlZCB0bwogKiBjYXRjaCBhbnkgZXJyb3JzLgogKgogKiBXaGVuIFtjbG9zZV0gaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiB0aGUgW2RvbmVdIFtGdXR1cmVdLgogKi8KYWJzdHJhY3QgY2xhc3MgU3RyZWFtU2luazxTPiBpbXBsZW1lbnRzIEV2ZW50U2luazxTPiwgU3RyZWFtQ29uc3VtZXI8Uz4gewogIC8qKgogICAqIFRlbGxzIHRoZSBzdHJlYW0gc2luayB0aGF0IG5vIGZ1cnRoZXIgc3RyZWFtcyB3aWxsIGJlIGFkZGVkLgogICAqCiAgICogVGhpcyBhbGxvd3MgdGhlIHN0cmVhbSBzaW5rIHRvIGNvbXBsZXRlIGFueSByZW1haW5pbmcgd29yayBhbmQgcmVsZWFzZQogICAqIHJlc291cmNlcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBzdHJlYW0gc2luayBoYXMgc2h1dCBkb3duLgogICAqIElmIGNsZWFuaW5nIHVwIGNhbiBmYWlsLCB0aGUgZXJyb3IgbWF5IGJlIHJlcG9ydGVkIGluIHRoZSByZXR1cm5lZCBmdXR1cmUsCiAgICogb3RoZXJ3aXNlIGl0IGNvbXBsZXRlcyB3aXRoIGBudWxsYC4KICAgKgogICAqIFJldHVybnMgdGhlIHNhbWUgZnV0dXJlIGFzIFtkb25lXS4KICAgKgogICAqIFRoZSBzdHJlYW0gc2luayBtYXkgY2xvc2UgYmVmb3JlIHRoZSBbY2xvc2VdIG1ldGhvZCBpcyBjYWxsZWQsIGVpdGhlciBkdWUKICAgKiB0byBhbiBlcnJvciBvciBiZWNhdXNlIGl0IGlzIGl0c2VsZiBwcm92aWRpbmcgZXZlbnRzIHRvIHNvbWVvbmUgd2hvIGhhcwogICAqIHN0b3BwZWQgbGlzdGVuaW5nLiBJbiB0aGF0IGNhc2UsIHRoZSBbZG9uZV0gZnV0dXJlIGlzIGNvbXBsZXRlZCBmaXJzdCwKICAgKiBhbmQgdGhlIGBjbG9zZWAgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBgZG9uZWAgZnV0dXJlIHdoZW4gY2FsbGVkLgogICAqCiAgICogVW5pZmllcyBbU3RyZWFtQ29uc3VtZXIuY2xvc2VdIGFuZCBbRXZlbnRTaW5rLmNsb3NlXSB3aGljaCBib3RoIG1hcmsgdGhlaXIKICAgKiBvYmplY3QgYXMgbm90IGV4cGVjdGluZyBhbnkgZnVydGhlciBldmVudHMuCiAgICovCiAgRnV0dXJlIGNsb3NlKCk7CgogIC8qKgogICAqIFJldHVybiBhIGZ1dHVyZSB3aGljaCBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgW1N0cmVhbVNpbmtdIGlzIGZpbmlzaGVkLgogICAqCiAgICogSWYgdGhlIGBTdHJlYW1TaW5rYCBmYWlscyB3aXRoIGFuIGVycm9yLAogICAqIHBlcmhhcHMgaW4gcmVzcG9uc2UgdG8gYWRkaW5nIGV2ZW50cyB1c2luZyBbYWRkXSwgW2FkZEVycm9yXSBvciBbY2xvc2VdLAogICAqIHRoZSBbZG9uZV0gZnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCB0aGF0IGVycm9yLgogICAqCiAgICogT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgZnV0dXJlIHdpbGwgY29tcGxldGUgd2hlbiBlaXRoZXI6CiAgICoKICAgKiAqIGFsbCBldmVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBhbmQgdGhlIHNpbmsgaGFzIGJlZW4gY2xvc2VkLCBvcgogICAqICogdGhlIHNpbmsgaGFzIG90aGVyd2lzZSBiZWVuIHN0b3BwZWQgZnJvbSBoYW5kbGluZyBtb3JlIGV2ZW50cwogICAqICAgKGZvciBleGFtcGxlIGJ5IGNhbmNlbGluZyBhIHN0cmVhbSBzdWJzY3JpcHRpb24pLgogICAqLwogIEZ1dHVyZSBnZXQgZG9uZTsKfQoKLyoqCiAqIFRyYW5zZm9ybXMgYSBTdHJlYW0uCiAqCiAqIFdoZW4gYSBzdHJlYW0ncyBbU3RyZWFtLnRyYW5zZm9ybV0gbWV0aG9kIGlzIGludm9rZWQgd2l0aCBhCiAqIFtTdHJlYW1UcmFuc2Zvcm1lcl0sIHRoZSBzdHJlYW0gY2FsbHMgdGhlIFtiaW5kXSBtZXRob2Qgb24gdGhlIHByb3ZpZGVkCiAqIHRyYW5zZm9ybWVyLiBUaGUgcmVzdWx0aW5nIHN0cmVhbSBpcyB0aGVuIHJldHVybmVkIGZyb20gdGhlCiAqIFtTdHJlYW0udHJhbnNmb3JtXSBtZXRob2QuCiAqCiAqIENvbmNlcHR1YWxseSwgYSB0cmFuc2Zvcm1lciBpcyBzaW1wbHkgYSBmdW5jdGlvbiBmcm9tIFtTdHJlYW1dIHRvIFtTdHJlYW1dCiAqIHRoYXQgaXMgZW5jYXBzdWxhdGVkIGludG8gYSBjbGFzcy4KICoKICogSXQgaXMgZ29vZCBwcmFjdGljZSB0byB3cml0ZSB0cmFuc2Zvcm1lcnMgdGhhdCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcy4KICoKICogQWxsIG90aGVyIHRyYW5zZm9ybWluZyBtZXRob2RzIG9uIFtTdHJlYW1dLCBzdWNoIGFzIFtTdHJlYW0ubWFwXSwKICogW1N0cmVhbS53aGVyZV0gb3IgW1N0cmVhbS5leHBhbmRdIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZwogKiBbU3RyZWFtLnRyYW5zZm9ybV0uIEEgW1N0cmVhbVRyYW5zZm9ybWVyXSBpcyB0aHVzIHZlcnkgcG93ZXJmdWwgYnV0IG9mdGVuCiAqIGFsc28gYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0byB1c2UuCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1UcmFuc2Zvcm1lcjxTLCBUPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdHJlYW1UcmFuc2Zvcm1lcl0gYmFzZWQgb24gdGhlIGdpdmVuIFtvbkxpc3Rlbl0gY2FsbGJhY2suCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIHRyYW5zZm9ybWVyIHVzZXMgdGhlIHByb3ZpZGVkIFtvbkxpc3Rlbl0gY2FsbGJhY2sKICAgKiB3aGVuIGEgdHJhbnNmb3JtZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLiBBdCB0aGF0IHRpbWUsIHRoZSBjYWxsYmFjawogICAqIHJlY2VpdmVzIHRoZSBpbnB1dCBzdHJlYW0gKHRoZSBvbmUgcGFzc2VkIHRvIFtiaW5kXSkgYW5kIGEKICAgKiBib29sZWFuIGZsYWcgYGNhbmNlbE9uRXJyb3JgIHRvIGNyZWF0ZSBhIFtTdHJlYW1TdWJzY3JpcHRpb25dLgogICAqCiAgICogVGhlIFtvbkxpc3Rlbl0gY2FsbGJhY2sgZG9lcyAqbm90KiByZWNlaXZlIHRoZSBoYW5kbGVycyB0aGF0IHdlcmUgcGFzc2VkCiAgICogdG8gW1N0cmVhbS5saXN0ZW5dLiBUaGVzZSBhcmUgYXV0b21hdGljYWxseSBzZXQgYWZ0ZXIgdGhlIGNhbGwgdG8gdGhlCiAgICogW29uTGlzdGVuXSBjYWxsYmFjayAodXNpbmcgW1N0cmVhbVN1YnNjcmlwdGlvbi5vbkRhdGFdLAogICAqIFtTdHJlYW1TdWJzY3JpcHRpb24ub25FcnJvcl0gYW5kIFtTdHJlYW1TdWJzY3JpcHRpb24ub25Eb25lXSkuCiAgICoKICAgKiBNb3N0IGNvbW1vbmx5LCBhbiBbb25MaXN0ZW5dIGNhbGxiYWNrIHdpbGwgZmlyc3QgY2FsbCBbU3RyZWFtLmxpc3Rlbl0gb24KICAgKiB0aGUgcHJvdmlkZWQgc3RyZWFtICh3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBjYW5jZWxPbkVycm9yYCBmbGFnKSwgYW5kIHRoZW4KICAgKiByZXR1cm4gYSBuZXcgW1N0cmVhbVN1YnNjcmlwdGlvbl0uCiAgICoKICAgKiBUaGVyZSBhcmUgdHdvIGNvbW1vbiB3YXlzIHRvIGNyZWF0ZSBhIFN0cmVhbVN1YnNjcmlwdGlvbjoKICAgKgogICAqIDEuIGJ5IGFsbG9jYXRpbmcgYSBbU3RyZWFtQ29udHJvbGxlcl0gYW5kIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mCiAgICogICAgbGlzdGVuaW5nIHRvIGl0cyBzdHJlYW0uIEl0J3MgaW1wb3J0YW50IHRvIGZvcndhcmQgcGF1c2UsIHJlc3VtZSBhbmQKICAgKiAgICBjYW5jZWwgZXZlbnRzICh1bmxlc3MgdGhlIHRyYW5zZm9ybWVyIGludGVudGlvbmFsbHkgd2FudHMgdG8gY2hhbmdlCiAgICogICAgdGhpcyBiZWhhdmlvcikuCiAgICogMi4gYnkgY3JlYXRpbmcgYSBuZXcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIFtTdHJlYW1TdWJzY3JpcHRpb25dLgogICAqICAgIE5vdGUgdGhhdCB0aGUgc3Vic2NyaXB0aW9uIHNob3VsZCBydW4gY2FsbGJhY2tzIGluIHRoZSBbWm9uZV0gdGhlCiAgICogICAgc3RyZWFtIHdhcyBsaXN0ZW5lZCB0byAoc2VlIFtab25lXSBhbmQgW1pvbmUuYmluZENhbGxiYWNrXSkuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogYGBgCiAgICogLy8vIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gW2lucHV0XSBhbmQgZHVwbGljYXRlcyBhbGwgbm9uLWVycm9yIGV2ZW50cy4KICAgKiBTdHJlYW1TdWJzY3JpcHRpb248aW50PiBfb25MaXN0ZW4oU3RyZWFtPGludD4gaW5wdXQsIGJvb2wgY2FuY2VsT25FcnJvcikgewogICAqICAgU3RyZWFtU3Vic2NyaXB0aW9uPFN0cmluZz4gc3Vic2NyaXB0aW9uOwogICAqICAgLy8gQ3JlYXRlIGNvbnRyb2xsZXIgdGhhdCBmb3J3YXJkcyBwYXVzZSwgcmVzdW1lIGFuZCBjYW5jZWwgZXZlbnRzLgogICAqICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxTdHJpbmc+KAogICAqICAgICAgIG9uUGF1c2U6ICgpIHsKICAgKiAgICAgICAgIHN1YnNjcmlwdGlvbi5wYXVzZSgpOwogICAqICAgICAgIH0sCiAgICogICAgICAgb25SZXN1bWU6ICgpIHsKICAgKiAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgKiAgICAgICB9LAogICAqICAgICAgIG9uQ2FuY2VsOiAoKSA9PiBzdWJzY3JpcHRpb24uY2FuY2VsKCksCiAgICogICAgICAgc3luYzogdHJ1ZSk7IC8vICJzeW5jIiBpcyBjb3JyZWN0IGhlcmUsIHNpbmNlIGV2ZW50cyBhcmUgZm9yd2FyZGVkLgogICAqCiAgICogICAvLyBMaXN0ZW4gdG8gdGhlIHByb3ZpZGVkIHN0cmVhbSB1c2luZyBgY2FuY2VsT25FcnJvcmAuCiAgICogICBzdWJzY3JpcHRpb24gPSBpbnB1dC5saXN0ZW4oKGRhdGEpIHsKICAgKiAgICAgLy8gRHVwbGljYXRlIHRoZSBkYXRhLgogICAqICAgICBjb250cm9sbGVyLmFkZChkYXRhKTsKICAgKiAgICAgY29udHJvbGxlci5hZGQoZGF0YSk7CiAgICogICB9LAogICAqICAgICAgIG9uRXJyb3I6IGNvbnRyb2xsZXIuYWRkRXJyb3IsCiAgICogICAgICAgb25Eb25lOiBjb250cm9sbGVyLmNsb3NlLAogICAqICAgICAgIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogICAqCiAgICogICAvLyBSZXR1cm4gYSBuZXcgW1N0cmVhbVN1YnNjcmlwdGlvbl0gYnkgbGlzdGVuaW5nIHRvIHRoZSBjb250cm9sbGVyJ3MKICAgKiAgIC8vIHN0cmVhbS4KICAgKiAgIHJldHVybiBjb250cm9sbGVyLnN0cmVhbS5saXN0ZW4obnVsbCk7CiAgICogfQogICAqCiAgICogLy8gSW5zdGFudGlhdGUgYSB0cmFuc2Zvcm1lcjoKICAgKiB2YXIgZHVwbGljYXRvciA9IGNvbnN0IFN0cmVhbVRyYW5zZm9ybWVyPGludCwgaW50Pihfb25MaXN0ZW4pOwogICAqCiAgICogLy8gVXNlIGFzIGZvbGxvd3M6CiAgICogaW50U3RyZWFtLnRyYW5zZm9ybShkdXBsaWNhdG9yKTsKICAgKiBgYGAKICAgKi8KICBjb25zdCBmYWN0b3J5IFN0cmVhbVRyYW5zZm9ybWVyKAogICAgICAgICAgU3RyZWFtU3Vic2NyaXB0aW9uPFQ+IG9uTGlzdGVuKAogICAgICAgICAgICAgIFN0cmVhbTxTPiBzdHJlYW0sIGJvb2wgY2FuY2VsT25FcnJvcikpID0KICAgICAgX1N0cmVhbVN1YnNjcmlwdGlvblRyYW5zZm9ybWVyPFMsIFQ+OwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1N0cmVhbVRyYW5zZm9ybWVyXSB0aGF0IGRlbGVnYXRlcyBldmVudHMgdG8gdGhlIGdpdmVuIGZ1bmN0aW9ucy4KICAgKgogICAqIEV4YW1wbGUgdXNlIG9mIGEgZHVwbGljYXRpbmcgdHJhbnNmb3JtZXI6CiAgICoKICAgKiBgYGAKICAgKiBzdHJpbmdTdHJlYW0udHJhbnNmb3JtKG5ldyBTdHJlYW1UcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4uZnJvbUhhbmRsZXJzKAogICAqICAgICBoYW5kbGVEYXRhOiAoU3RyaW5nIHZhbHVlLCBFdmVudFNpbms8U3RyaW5nPiBzaW5rKSB7CiAgICogICAgICAgc2luay5hZGQodmFsdWUpOwogICAqICAgICAgIHNpbmsuYWRkKHZhbHVlKTsgIC8vIER1cGxpY2F0ZSB0aGUgaW5jb21pbmcgZXZlbnRzLgogICAqICAgICB9KSk7CiAgICogYGBgCiAgICoKICAgKiBUcmFuc2Zvcm1lcnMgdGhhdCBhcmUgY29uc3RydWN0ZWQgdGhpcyB3YXkgY2Fubm90IHVzZSBjYXB0dXJlZCBzdGF0ZSBpZgogICAqIHRoZXkgYXJlIHVzZWQgaW4gc3RyZWFtcyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0byBtdWx0aXBsZSB0aW1lcy4KICAgKiBgYGAKICAgKiBTdHJlYW1Db250cm9sbGVyPFN0cmluZz4gY29udHJvbGxlcjsKICAgKiBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KG9uTGlzdGVuOiAoKSB7CiAgICogICBzY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICogICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoIkJhZCIpOwogICAqICAgICBjb250cm9sbGVyLmFkZEVycm9yKCJXb3JzZSIpOwogICAqICAgICBjb250cm9sbGVyLmFkZEVycm9yKCJXb3JzdCIpOwogICAqICAgfSk7CiAgICogfSk7CiAgICogdmFyIHNoYXJlZFN0YXRlID0gMDsKICAgKiB2YXIgdHJhbnNmb3JtZWRTdHJlYW0gPSBjb250cm9sbGVyLnN0cmVhbS50cmFuc2Zvcm0oCiAgICogICAgIG5ldyBTdHJlYW1UcmFuc2Zvcm1lcjxTdHJpbmc+LmZyb21IYW5kbGVycygKICAgKiAgICAgICAgIGhhbmRsZUVycm9yOiAoZXJyb3IsIHN0YWNrVHJhY2UsIHNpbmspIHsKICAgKiAgIHNoYXJlZFN0YXRlKys7IC8vIEluY3JlbWVudCBzaGFyZWQgZXJyb3ItY291bnRlci4KICAgKiAgIHNpbmsuYWRkKCJFcnJvciAkc2hhcmVkU3RhdGU6ICRlcnJvciIpOwogICAqIH0pKTsKICAgKgogICAqIHRyYW5zZm9ybWVkU3RyZWFtLmxpc3RlbihwcmludCk7CiAgICogdHJhbnNmb3JtZWRTdHJlYW0ubGlzdGVuKHByaW50KTsgLy8gTGlzdGVuIHR3aWNlLgogICAqIC8vIExpc3RlbmluZyB0d2ljZSB0byB0aGUgc2FtZSBzdHJlYW0gbWFrZXMgdGhlIHRyYW5zZm9ybWVyIHNoYXJlIHRoZSBzYW1lCiAgICogLy8gc3RhdGUuIEluc3RlYWQgb2YgaGF2aW5nICJFcnJvciAxOiBCYWQiLCAiRXJyb3IgMjogV29yc2UiLAogICAqIC8vICJFcnJvciAzOiBXb3JzdCIgYXMgb3V0cHV0IChlYWNoIHR3aWNlIGZvciB0aGUgc2VwYXJhdGUgc3Vic2NyaXB0aW9ucyksCiAgICogLy8gdGhpcyBwcm9ncmFtIGVtaXRzOgogICAqIC8vIEVycm9yIDE6IEJhZAogICAqIC8vIEVycm9yIDI6IEJhZAogICAqIC8vIEVycm9yIDM6IFdvcnNlCiAgICogLy8gRXJyb3IgNDogV29yc2UKICAgKiAvLyBFcnJvciA1OiBXb3JzdAogICAqIC8vIEVycm9yIDY6IFdvcnN0CiAgICogYGBgCiAgICovCiAgZmFjdG9yeSBTdHJlYW1UcmFuc2Zvcm1lci5mcm9tSGFuZGxlcnMoCiAgICAgIHt2b2lkIGhhbmRsZURhdGEoUyBkYXRhLCBFdmVudFNpbms8VD4gc2luayksCiAgICAgIHZvaWQgaGFuZGxlRXJyb3IoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UsIEV2ZW50U2luazxUPiBzaW5rKSwKICAgICAgdm9pZCBoYW5kbGVEb25lKEV2ZW50U2luazxUPiBzaW5rKX0pID0gX1N0cmVhbUhhbmRsZXJUcmFuc2Zvcm1lcjxTLCBUPjsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtTdHJlYW1UcmFuc2Zvcm1lcl0gYmFzZWQgb24gYSBbYmluZF0gY2FsbGJhY2suCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyZWFtIHRyYW5zZm9ybWVyIHVzZXMgdGhlIFtiaW5kXSBhcmd1bWVudCB0byBpbXBsZW1lbnQgdGhlCiAgICogW1N0cmVhbVRyYW5zZm9ybWVyLmJpbmRdIEFQSSBhbmQgY2FuIGJlIHVzZWQgd2hlbiB0aGUgdHJhbnNmb3JtYXRpb24gaXMKICAgKiBhdmFpbGFibGUgYXMgYSBzdHJlYW0tdG8tc3RyZWFtIGZ1bmN0aW9uLgogICAqCiAgICogYGBgZGFydAogICAqIGZpbmFsIHNwbGl0RGVjb2RlZCA9IFN0cmVhbVRyYW5zZm9ybWVyPExpc3Q8aW50PiwgU3RyaW5nPi5mcm9tQmluZCgKICAgKiAgICAgKHN0cmVhbSkgPT4gc3RyZWFtLnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpLnRyYW5zZm9ybShMaW5lU3BsaXR0ZXIoKSkpOwogICAqIGBgYAogICAqLwogIEBTaW5jZSgiMi4xIikKICBmYWN0b3J5IFN0cmVhbVRyYW5zZm9ybWVyLmZyb21CaW5kKFN0cmVhbTxUPiBGdW5jdGlvbihTdHJlYW08Uz4pIGJpbmQpID0KICAgICAgX1N0cmVhbUJpbmRUcmFuc2Zvcm1lcjxTLCBUPjsKCiAgLyoqCiAgICogQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYFN0cmVhbVRyYW5zZm9ybWVyPFRTLCBUVD5gLgogICAqCiAgICogVGhpcyBhbGxvd3MgW3NvdXJjZV0gdG8gYmUgdXNlZCBhdCB0aGUgbmV3IHR5cGUsIGJ1dCBhdCBydW4tdGltZSBpdAogICAqIG11c3Qgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIGJvdGggdGhlIG5ldyB0eXBlIGFuZCBpdHMgb3JpZ2luYWwgdHlwZS4KICAgKgogICAqIERhdGEgZXZlbnRzIHBhc3NlZCBpbnRvIHRoZSByZXR1cm5lZCB0cmFuc2Zvcm1lciBtdXN0IGFsc28gYmUgaW5zdGFuY2VzCiAgICogb2YgW1NTXSwgYW5kIGRhdGEgZXZlbnRzIHByb2R1Y2VkIGJ5IFtzb3VyY2VdIGZvciB0aG9zZSBldmVudHMgbXVzdAogICAqIGFsc28gYmUgaW5zdGFuY2VzIG9mIFtUVF0uCiAgICovCiAgc3RhdGljIFN0cmVhbVRyYW5zZm9ybWVyPFRTLCBUVD4gY2FzdEZyb208U1MsIFNULCBUUywgVFQ+KAogICAgICBTdHJlYW1UcmFuc2Zvcm1lcjxTUywgU1Q+IHNvdXJjZSkgewogICAgcmV0dXJuIG5ldyBDYXN0U3RyZWFtVHJhbnNmb3JtZXI8U1MsIFNULCBUUywgVFQ+KHNvdXJjZSk7CiAgfQoKICAvKioKICAgKiBUcmFuc2Zvcm1zIHRoZSBwcm92aWRlZCBbc3RyZWFtXS4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyZWFtIHdpdGggZXZlbnRzIHRoYXQgYXJlIGNvbXB1dGVkIGZyb20gZXZlbnRzIG9mIHRoZQogICAqIHByb3ZpZGVkIFtzdHJlYW1dLgogICAqCiAgICogVGhlIFtTdHJlYW1UcmFuc2Zvcm1lcl0gaW50ZXJmYWNlIGlzIGNvbXBsZXRlbHkgZ2VuZXJpYywKICAgKiBzbyBpdCBjYW5ub3Qgc2F5IHdoYXQgc3ViY2xhc3NlcyBkby4KICAgKiBFYWNoIFtTdHJlYW1UcmFuc2Zvcm1lcl0gc2hvdWxkIGRvY3VtZW50IGNsZWFybHkgaG93IGl0IHRyYW5zZm9ybXMgdGhlCiAgICogc3RyZWFtIChvbiB0aGUgY2xhc3Mgb3IgdmFyaWFibGUgdXNlZCB0byBhY2Nlc3MgdGhlIHRyYW5zZm9ybWVyKSwKICAgKiBhcyB3ZWxsIGFzIGFueSBkaWZmZXJlbmNlcyBmcm9tIHRoZSBmb2xsb3dpbmcgdHlwaWNhbCBiZWhhdmlvcjoKICAgKgogICAqICogV2hlbiB0aGUgcmV0dXJuZWQgc3RyZWFtIGlzIGxpc3RlbmVkIHRvLCBpdCBzdGFydHMgbGlzdGVuaW5nIHRvIHRoZQogICAqICAgaW5wdXQgW3N0cmVhbV0uCiAgICogKiBTdWJzY3JpcHRpb25zIG9mIHRoZSByZXR1cm5lZCBzdHJlYW0gZm9yd2FyZCAoaW4gYSByZWFzb25hYmxlIHRpbWUpCiAgICogICBhIFtTdHJlYW1TdWJzY3JpcHRpb24ucGF1c2VdIGNhbGwgdG8gdGhlIHN1YnNjcmlwdGlvbiBvZiB0aGUgaW5wdXQKICAgKiAgIFtzdHJlYW1dLgogICAqICogU2ltaWxhcmx5LCBjYW5jZWxpbmcgYSBzdWJzY3JpcHRpb24gb2YgdGhlIHJldHVybmVkIHN0cmVhbSBldmVudHVhbGx5CiAgICogICAoaW4gcmVhc29uYWJsZSB0aW1lKSBjYW5jZWxzIHRoZSBzdWJzY3JpcHRpb24gb2YgdGhlIGlucHV0IFtzdHJlYW1dLgogICAqCiAgICogIlJlYXNvbmFibGUgdGltZSIgZGVwZW5kcyBvbiB0aGUgdHJhbnNmb3JtZXIgYW5kIHN0cmVhbS4gU29tZSB0cmFuc2Zvcm1lcnMsCiAgICogbGlrZSBhICJ0aW1lb3V0IiB0cmFuc2Zvcm1lciwgbWlnaHQgbWFrZSB0aGVzZSBvcGVyYXRpb25zIGRlcGVuZCBvbiBhCiAgICogZHVyYXRpb24uIE90aGVycyBtaWdodCBub3QgZGVsYXkgdGhlbSBhdCBhbGwsIG9yIGp1c3QgYnkgYSBtaWNyb3Rhc2suCiAgICoKICAgKiBUcmFuc2Zvcm1lcnMgYXJlIGZyZWUgdG8gaGFuZGxlIGVycm9ycyBpbiBhbnkgd2F5LgogICAqIEEgdHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb24gbWF5IGNob29zZSB0byBwcm9wYWdhdGUgZXJyb3JzLAogICAqIG9yIGNvbnZlcnQgdGhlbSB0byBvdGhlciBldmVudHMsIG9yIGlnbm9yZSB0aGVtIGNvbXBsZXRlbHksCiAgICogYnV0IGlmIGVycm9ycyBhcmUgaWdub3JlZCwgaXQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KICAgKi8KICBTdHJlYW08VD4gYmluZChTdHJlYW08Uz4gc3RyZWFtKTsKCiAgLyoqCiAgICogUHJvdmlkZXMgYSBgU3RyZWFtVHJhbnNmb3JtZXI8UlMsIFJUPmAgdmlldyBvZiB0aGlzIHN0cmVhbSB0cmFuc2Zvcm1lci4KICAgKgogICAqIFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZXIgd2lsbCBjaGVjayBhdCBydW4tdGltZSB0aGF0IGFsbCBkYXRhIGV2ZW50cwogICAqIG9mIHRoZSBzdHJlYW0gaXQgdHJhbnNmb3JtcyBhcmUgYWN0dWFsbHkgaW5zdGFuY2VzIG9mIFtTXSwKICAgKiBhbmQgaXQgd2lsbCBjaGVjayB0aGF0IGFsbCBkYXRhIGV2ZW50cyBwcm9kdWNlZCBieSB0aGlzIHRyYW5zZm9ybWVyCiAgICogYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbUlRdLgogICAqLwogIFN0cmVhbVRyYW5zZm9ybWVyPFJTLCBSVD4gY2FzdDxSUywgUlQ+KCk7Cn0KCi8qKgogKiBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgW1N0cmVhbVRyYW5zZm9ybWVyXS4KICoKICogQ29udGFpbnMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgZXZlcnkgbWV0aG9kIGV4Y2VwdCBbYmluZF0uCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1UcmFuc2Zvcm1lckJhc2U8UywgVD4gaW1wbGVtZW50cyBTdHJlYW1UcmFuc2Zvcm1lcjxTLCBUPiB7CiAgY29uc3QgU3RyZWFtVHJhbnNmb3JtZXJCYXNlKCk7CgogIFN0cmVhbVRyYW5zZm9ybWVyPFJTLCBSVD4gY2FzdDxSUywgUlQ+KCkgPT4KICAgICAgU3RyZWFtVHJhbnNmb3JtZXIuY2FzdEZyb208UywgVCwgUlMsIFJUPih0aGlzKTsKfQoKLyoqCiAqIEFuIFtJdGVyYXRvcl0gbGlrZSBpbnRlcmZhY2UgZm9yIHRoZSB2YWx1ZXMgb2YgYSBbU3RyZWFtXS4KICoKICogVGhpcyB3cmFwcyBhIFtTdHJlYW1dIGFuZCBhIHN1YnNjcmlwdGlvbiBvbiB0aGUgc3RyZWFtLiBJdCBsaXN0ZW5zCiAqIG9uIHRoZSBzdHJlYW0sIGFuZCBjb21wbGV0ZXMgdGhlIGZ1dHVyZSByZXR1cm5lZCBieSBbbW92ZU5leHRdIHdoZW4gdGhlCiAqIG5leHQgdmFsdWUgYmVjb21lcyBhdmFpbGFibGUuCiAqCiAqIFRoZSBzdHJlYW0gbWF5IGJlIHBhdXNlZCBiZXR3ZWVuIGNhbGxzIHRvIFttb3ZlTmV4dF0uCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJlYW1JdGVyYXRvcjxUPiB7CiAgLyoqIENyZWF0ZSBhIFtTdHJlYW1JdGVyYXRvcl0gb24gW3N0cmVhbV0uICovCiAgZmFjdG9yeSBTdHJlYW1JdGVyYXRvcihTdHJlYW08VD4gc3RyZWFtKQogICAgICAvLyBUT0RPKGxybik6IHVzZSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yIHdoZW4gdHlwZQogICAgICAvLyBhcmd1bWVudHMgYXJlIHN1cHBvcnRlZC4KICAgICAgPT4KICAgICAgbmV3IF9TdHJlYW1JdGVyYXRvcjxUPihzdHJlYW0pOwoKICAvKioKICAgKiBXYWl0IGZvciB0aGUgbmV4dCBzdHJlYW0gdmFsdWUgdG8gYmUgYXZhaWxhYmxlLgogICAqCiAgICogUmV0dXJucyBhIGZ1dHVyZSB3aGljaCB3aWxsIGNvbXBsZXRlIHdpdGggZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgLgogICAqIENvbXBsZXRpbmcgd2l0aCBgdHJ1ZWAgbWVhbnMgdGhhdCBhbm90aGVyIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkIGFuZAogICAqIGNhbiBiZSByZWFkIGFzIFtjdXJyZW50XS4KICAgKiBDb21wbGV0aW5nIHdpdGggYGZhbHNlYCBtZWFucyB0aGF0IHRoZSBzdHJlYW0gaXRlcmF0aW9uIGlzIGRvbmUgYW5kCiAgICogbm8gZnVydGhlciBldmVudHMgd2lsbCBldmVyIGJlIGF2YWlsYWJsZS4KICAgKiBUaGUgZnV0dXJlIG1heSBjb21wbGV0ZSB3aXRoIGFuIGVycm9yLCBpZiB0aGUgc3RyZWFtIHByb2R1Y2VzIGFuIGVycm9yLAogICAqIHdoaWNoIGFsc28gZW5kcyBpdGVyYXRpb24uCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIGFnYWluIHVudGlsIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgYQogICAqIHByZXZpb3VzIGNhbGwgaXMgY29tcGxldGVkLgogICAqLwogIEZ1dHVyZTxib29sPiBtb3ZlTmV4dCgpOwoKICAvKioKICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyZWFtLgogICAqCiAgICogSXMgYG51bGxgIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBbbW92ZU5leHRdIGFuZCBhZnRlciBhIGNhbGwgdG8KICAgKiBgbW92ZU5leHRgIGNvbXBsZXRlcyB3aXRoIGEgYGZhbHNlYCByZXN1bHQgb3IgYW4gZXJyb3IuCiAgICoKICAgKiBXaGVuIGEgYG1vdmVOZXh0YCBjYWxsIGNvbXBsZXRlcyB3aXRoIGB0cnVlYCwgdGhlIGBjdXJyZW50YCBmaWVsZCBob2xkcwogICAqIHRoZSBtb3N0IHJlY2VudCBldmVudCBvZiB0aGUgc3RyZWFtLCBhbmQgaXQgc3RheXMgbGlrZSB0aGF0IHVudGlsIHRoZSBuZXh0CiAgICogY2FsbCB0byBgbW92ZU5leHRgLgogICAqIEJldHdlZW4gYSBjYWxsIHRvIGBtb3ZlTmV4dGAgYW5kIHdoZW4gaXRzIHJldHVybmVkIGZ1dHVyZSBjb21wbGV0ZXMsCiAgICogdGhlIHZhbHVlIGlzIHVuc3BlY2lmaWVkLgogICAqLwogIFQgZ2V0IGN1cnJlbnQ7CgogIC8qKgogICAqIENhbmNlbHMgdGhlIHN0cmVhbSBpdGVyYXRvciAoYW5kIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBzdWJzY3JpcHRpb24pIGVhcmx5LgogICAqCiAgICogVGhlIHN0cmVhbSBpdGVyYXRvciBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGVkIGlmIHRoZSBbbW92ZU5leHRdIGZ1dHVyZQogICAqIGNvbXBsZXRlcyB3aXRoIGVpdGhlciBgZmFsc2VgIG9yIGFuIGVycm9yLgogICAqCiAgICogSWYgeW91IG5lZWQgdG8gc3RvcCBsaXN0ZW5pbmcgZm9yIHZhbHVlcyBiZWZvcmUgdGhlIHN0cmVhbSBpdGVyYXRvciBpcwogICAqIGF1dG9tYXRpY2FsbHkgY2xvc2VkLCB5b3UgbXVzdCBjYWxsIFtjYW5jZWxdIHRvIGVuc3VyZSB0aGF0IHRoZSBzdHJlYW0KICAgKiBpcyBwcm9wZXJseSBjbG9zZWQuCiAgICoKICAgKiBJZiBbbW92ZU5leHRdIGhhcyBiZWVuIGNhbGxlZCB3aGVuIHRoZSBpdGVyYXRvciBpcyBjYW5jZWxlZCwKICAgKiBpdHMgcmV0dXJuZWQgZnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCBgZmFsc2VgIGFzIHZhbHVlLAogICAqIGFzIHdpbGwgYWxsIGZ1cnRoZXIgY2FsbHMgdG8gW21vdmVOZXh0XS4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgaWYgdGhlIGNhbmNlbC1vcGVyYXRpb24gaXMgbm90IGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5LgogICAqIE90aGVyd2lzZSByZXR1cm5zIGBudWxsYC4KICAgKi8KICBGdXR1cmUgY2FuY2VsKCk7Cn0KCi8qKgogKiBXcmFwcyBhbiBbX0V2ZW50U2lua10gc28gaXQgZXhwb3NlcyBvbmx5IHRoZSBbRXZlbnRTaW5rXSBpbnRlcmZhY2UuCiAqLwpjbGFzcyBfQ29udHJvbGxlckV2ZW50U2lua1dyYXBwZXI8VD4gaW1wbGVtZW50cyBFdmVudFNpbms8VD4gewogIEV2ZW50U2luayBfc2luazsKICBfQ29udHJvbGxlckV2ZW50U2lua1dyYXBwZXIodGhpcy5fc2luayk7CgogIHZvaWQgYWRkKFQgZGF0YSkgewogICAgX3NpbmsuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIF9zaW5rLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfc2luay5jbG9zZSgpOwogIH0KfQqIhQBOTjwBFAFHFUcBHwEEKQM8TkksUQNAND40MjkDRRgDURs/QjoDTi0DSikDRUcDQANIRhkDSU8bA1BPQ0VPTxBRIU82A0dJTkUQA1BNHQM+SxUEGwwBBksFR0IGHAEGKAVFHAYyAQY/BUc2BjBHSEVLGh4kJi8kCB4EAQYuBU4kQSwFUT4FPAVDBjxLE0EeTh4iIDgIBy4iLDgIB08+RSIPLgY4OR4EAQZOBU1DO0UFQzVCNwY2KDgEAQZKBU5LEgVGBisvER4kRScBFxUOIQ4yGSUSCggcBgEgHTkVCgYBKhQXGSALFhoYGAsXISwZMxoiGQ4LFy0YJQweBAEGTxwFSE1HTE5MIQVABTAFPjAuBSMkJA0FQzELBVY2Thc/CwU/BUAGIz0yBAEGKgVJTwVNBjckAQYwBiEBBlAFRkstBU1HSk8qBUxGPgVNTC8GHzo8QAQBBikFUD1JIAVMOAVKLgVFSEpMEzhSPzMwBUs1BUxGBUM9KQY1PgEGSAVJQAVGNgVCTCsGKCwEAQZFBURIBUM4RRQFUAVCSEw6BikwBAEGTRwFSEwhBUIGOCkoARYiMzUtLR4OJRklEgolIBMsMhEkCjcGARw2HhkjDRcNLB4YIg0ZIw0xFwYeBAEGRQVPBU4dSU9JUEtRKTsFQgY5KSgWMDUtHQ4mGSUSCiEgTQoJSiUGARw2HhkjDRcNLB4YIg0ZIw0xFwYeBAEGTAVPIAVFM0wVTRwFRFAPBU9LPE5IRwVPRxYFQkxABkA7BAEGSQVIIktIIU1MJgVLHQVCTD0GODMEAQY8BUMhUVEFSScFTyBHIwYyTwQBBjIFJTxMIAk8CUAFND8pKwZGKQQBBkUFRDQ6Jz0uBUUdBUQPRTcgBjcqHA0lIBYbRyA+Ex0eDAsoFRwSOlBENh04DhMlDAseEwQBBkUFQkISRTgFRR1HBUU3IAZIKhwlIBZFHjwLKBUjCx4TBAEGSgVPRxYFUA4FTTcbBjE0LiUXIBYYJQwZECMbSAwLKBUvCx4TBAEGTgVJUU8OBUc3GwYpMCUgFkMbOw48CygVIwseEwQBBjcFRhoFRzQbBiskJSAWRT89CygVIgseEwQBBkkFMlAbBUkzBUU3GwYtMCUgFj0cPA48CygVIgseEwQBBkgFMk4bBUk0BUU3GwYrMCUgFj0bOw48CygVIwseEwQBBiwFQ0MFJDcbBU4pBhsuExEOEwsoFSMLHhMEAQYwBU0ZTx0FUAwFTjMGHTAlIA44CygVIgseEwQBBiwFS0gGNgY3BUofTQUkNxsGHRw2ERMcCygVJAseEwQBBjIFSR9MBUZIIDwYBSQ3GwYbIjQRExwLKBUkCx4TBAEGTw8FTFAeRTcgBUMUBilCAQZEBUgmSjEFTiIFTVAFTkkFTz0pBh4sBAEGNgVDKkJFBUxNKQVBBU9LMwVCRikGLjAEAQY7BUZEIjYFOUIFQkcpBh4sBAEGSQVBTjJHQDdMFwVLBUJGKQYuMAQBBkUFSUhERyIFSEsFRkRFNwVCTDIGOjEEAQYnBU8FTUw3BU8jBVAyBUQaBhgqJSAUOAsoFRA0GzYMCx4TBAEGJgUqNhsFQjIGFyoOHgwUHhoLKBUdJhQMEDQbNgwLHhMEAQYoBSo2GwU2MgYZKg4eJSAUHTISNB1KDhQMHhoLKBUdJhQMEDQbNgwLHhMEAQY9BU4lBUNDRyoFRk0FThgFUVBKBUwpNQY9JyUgFDsbPA48CygVIEsUDBA0GzYMCx4TBAEGPAVPIgVPG04OBjwnDh4lIBRDGyIeDjwLKBUdJhQMIEsUDBA0GzYMCx4TBAEGPgVDLQY+Kg4eJSAUQxshFjghThIYECIeDjwLKBUdJhQMECJNFg40GzYMCx4TBAEGQwVMDwVPSzMFThYFTBoGIzAxKiUaIBQnOhQMHQsoFSFPCx4TBAEGPwVQShoFS08wBT5GREw7BU00TQ0FQkxGPwZPKTIoEQ8cARsWHTQGATEWMDVQNAYBFBYaBgEWOkhFExsfFx9JCw9KHyJKQBdBPiALCAFMNAYBGBYtGxUGAR1ENkUcIhIjOhgeBAIBBC0DOC4DNTZFNwQnBiAFQgVOIwVFEgVROwVRUEdRBTZLIAYTAQY7BUgkPgVHOAYoAQY8BUY/MQVFRCEFQxoFR1EGJgEGOwVBQwVHUAYiAQZBBT5IIkoWSQVGRT8FUD0sTjIFMAVDOEJMThgFR0UFUCEGJQEGGwUvSkQ0BU4hBhEBBjsFR0YVBUQ3BhUBBkkFTDYFSkEFQxQGKgIBBCkDRD4DSEUlBDEGJgUqBhUBBiIFKgY4AQYWBUYFRAYQAgFCKBsBJRobAS8BHz5BSQE1PyJJBAIBBEYDTEswA0lGOwQjBigFPAVON0kkBUNCUAVJRz0GJgEGPwVJKQVKUCkGEgIBBE4DTgNKRSoDSE0YA0kVAz8ESgZCBUwpBU1QKQUoBU9NTEcFUDEGEgEGSwUuTjYFPwVHRTkGEwIBBBgDP0s/HgNOJgNOA0U+TScEKQZLBUtKQEQFTks9RAVOUSgFPwVHTUwYRkpFBQ4FCUpQMEs2GSMOGiQOMk8FPywgHx8KKSUqBU0SLgcFI0QFGCYJBiMqNywBBlEFLwUJUD4cPw4JBU1GCSpAHiUnJwsJGjo1NjkvCgUmN1BDUBwVFRcXFxcJBiozUE4BBj8FT00vBQ1JUAkGEEskAQY6BUlPBU1JIAY9Kj4EAQYnBUsYBT4qTEdFBUsXS0oRTUwFUUtLBThCQUQGJAEGTQVLQEklBiwCAQQ0A0MEUCEBLjYCAQQ+A0ZLIQM5BCMwK0IiCSYBBjUFSUsfSS9NIAVKIQYbAQYmBUc9BU1QGUofBhEBBlEFTDAFTEwZBUI+LgVOHwYTAgEERwQ/EysBFRUEATInBAEREwQCARZkYXJ0OmFzeW5jL3N0cmVhbS5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9hc3luYy90aW1lci5kYXJ0keovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmFzeW5jOwoKLyoqCiAqIEEgY291bnQtZG93biB0aW1lciB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIGZpcmUgb25jZSBvciByZXBlYXRlZGx5LgogKgogKiBUaGUgdGltZXIgY291bnRzIGRvd24gZnJvbSB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIHRvIDAuCiAqIFdoZW4gdGhlIHRpbWVyIHJlYWNoZXMgMCwgdGhlIHRpbWVyIGludm9rZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbi4KICogVXNlIGEgcGVyaW9kaWMgdGltZXIgdG8gcmVwZWF0ZWRseSBjb3VudCBkb3duIHRoZSBzYW1lIGludGVydmFsLgogKgogKiBBIG5lZ2F0aXZlIGR1cmF0aW9uIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSBkdXJhdGlvbiBvZiAwLgogKiBJZiB0aGUgZHVyYXRpb24gaXMgc3RhdGljYWxseSBrbm93biB0byBiZSAwLCBjb25zaWRlciB1c2luZyBbcnVuXS4KICoKICogRnJlcXVlbnRseSB0aGUgZHVyYXRpb24gaXMgZWl0aGVyIGEgY29uc3RhbnQgb3IgY29tcHV0ZWQgYXMgaW4gdGhlCiAqIGZvbGxvd2luZyBleGFtcGxlICh0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBvcGVyYXRvciBvZgogKiB0aGUgW0R1cmF0aW9uXSBjbGFzcyk6CiAqIGBgYGRhcnQKICogY29uc3QgdGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDMpOwogKiBjb25zdCBtcyA9IGNvbnN0IER1cmF0aW9uKG1pbGxpc2Vjb25kczogMSk7CiAqCiAqIHN0YXJ0VGltZW91dChbaW50IG1pbGxpc2Vjb25kc10pIHsKICogICB2YXIgZHVyYXRpb24gPSBtaWxsaXNlY29uZHMgPT0gbnVsbCA/IHRpbWVvdXQgOiBtcyAqIG1pbGxpc2Vjb25kczsKICogICByZXR1cm4gbmV3IFRpbWVyKGR1cmF0aW9uLCBoYW5kbGVUaW1lb3V0KTsKICogfQogKiAuLi4KICogdm9pZCBoYW5kbGVUaW1lb3V0KCkgeyAgLy8gY2FsbGJhY2sgZnVuY3Rpb24KICogICAuLi4KICogfQogKiBgYGAKICogTm90ZTogSWYgRGFydCBjb2RlIHVzaW5nIFRpbWVyIGlzIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQsIHRoZSBmaW5lc3QKICogZ3JhbnVsYXJpdHkgYXZhaWxhYmxlIGluIHRoZSBicm93c2VyIGlzIDQgbWlsbGlzZWNvbmRzLgogKgogKiBTZWUgW1N0b3B3YXRjaF0gZm9yIG1lYXN1cmluZyBlbGFwc2VkIHRpbWUuCiAqLwphYnN0cmFjdCBjbGFzcyBUaW1lciB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyB0aW1lci4KICAgKgogICAqIFRoZSBbY2FsbGJhY2tdIGZ1bmN0aW9uIGlzIGludm9rZWQgYWZ0ZXIgdGhlIGdpdmVuIFtkdXJhdGlvbl0uCiAgICoKICAgKi8KICBmYWN0b3J5IFRpbWVyKER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGNhbGxiYWNrKCkpIHsKICAgIGlmIChab25lLmN1cnJlbnQgPT0gWm9uZS5yb290KSB7CiAgICAgIC8vIE5vIG5lZWQgdG8gYmluZCB0aGUgY2FsbGJhY2suIFdlIGtub3cgdGhhdCB0aGUgcm9vdCdzIHRpbWVyIHdpbGwKICAgICAgLy8gYmUgaW52b2tlZCBpbiB0aGUgcm9vdCB6b25lLgogICAgICByZXR1cm4gWm9uZS5jdXJyZW50LmNyZWF0ZVRpbWVyKGR1cmF0aW9uLCBjYWxsYmFjayk7CiAgICB9CiAgICByZXR1cm4gWm9uZS5jdXJyZW50CiAgICAgICAgLmNyZWF0ZVRpbWVyKGR1cmF0aW9uLCBab25lLmN1cnJlbnQuYmluZENhbGxiYWNrR3VhcmRlZChjYWxsYmFjaykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyByZXBlYXRpbmcgdGltZXIuCiAgICoKICAgKiBUaGUgW2NhbGxiYWNrXSBpcyBpbnZva2VkIHJlcGVhdGVkbHkgd2l0aCBbZHVyYXRpb25dIGludGVydmFscyB1bnRpbAogICAqIGNhbmNlbGVkIHdpdGggdGhlIFtjYW5jZWxdIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIGV4YWN0IHRpbWluZyBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nIHRpbWVyIGltcGxlbWVudGF0aW9uLgogICAqIE5vIG1vcmUgdGhhbiBgbmAgY2FsbGJhY2tzIHdpbGwgYmUgbWFkZSBpbiBgZHVyYXRpb24gKiBuYCB0aW1lLAogICAqIGJ1dCB0aGUgdGltZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjYWxsYmFja3MKICAgKiBjYW4gYmUgc2hvcnRlciBhbmQgbG9uZ2VyIHRoYW4gYGR1cmF0aW9uYC4KICAgKgogICAqIEluIHBhcnRpY3VsYXIsIGFuIGltcGxlbWVudGF0aW9uIG1heSBzY2hlZHVsZSB0aGUgbmV4dCBjYWxsYmFjaywgZS5nLiwKICAgKiBhIGBkdXJhdGlvbmAgYWZ0ZXIgZWl0aGVyIHdoZW4gdGhlIHByZXZpb3VzIGNhbGxiYWNrIGVuZGVkLAogICAqIHdoZW4gdGhlIHByZXZpb3VzIGNhbGxiYWNrIHN0YXJ0ZWQsIG9yIHdoZW4gdGhlIHByZXZpb3VzIGNhbGxiYWNrIHdhcwogICAqIHNjaGVkdWxlZCBmb3IgLSBldmVuIGlmIHRoZSBhY3R1YWwgY2FsbGJhY2sgd2FzIGRlbGF5ZWQuCiAgICovCiAgZmFjdG9yeSBUaW1lci5wZXJpb2RpYyhEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpIHsKICAgIGlmIChab25lLmN1cnJlbnQgPT0gWm9uZS5yb290KSB7CiAgICAgIC8vIE5vIG5lZWQgdG8gYmluZCB0aGUgY2FsbGJhY2suIFdlIGtub3cgdGhhdCB0aGUgcm9vdCdzIHRpbWVyIHdpbGwKICAgICAgLy8gYmUgaW52b2tlZCBpbiB0aGUgcm9vdCB6b25lLgogICAgICByZXR1cm4gWm9uZS5jdXJyZW50LmNyZWF0ZVBlcmlvZGljVGltZXIoZHVyYXRpb24sIGNhbGxiYWNrKTsKICAgIH0KICAgIHZhciBib3VuZENhbGxiYWNrID0gWm9uZS5jdXJyZW50LmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZDxUaW1lcj4oY2FsbGJhY2spOwogICAgcmV0dXJuIFpvbmUuY3VycmVudC5jcmVhdGVQZXJpb2RpY1RpbWVyKGR1cmF0aW9uLCBib3VuZENhbGxiYWNrKTsKICB9CgogIC8qKgogICAqIFJ1bnMgdGhlIGdpdmVuIFtjYWxsYmFja10gYXN5bmNocm9ub3VzbHkgYXMgc29vbiBhcyBwb3NzaWJsZS4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgbmV3IFRpbWVyKER1cmF0aW9uLnplcm8sIGNhbGxiYWNrKWAuCiAgICovCiAgc3RhdGljIHZvaWQgcnVuKHZvaWQgY2FsbGJhY2soKSkgewogICAgbmV3IFRpbWVyKER1cmF0aW9uLnplcm8sIGNhbGxiYWNrKTsKICB9CgogIC8qKgogICAqIENhbmNlbHMgdGhlIHRpbWVyLgogICAqCiAgICogT25jZSBhIFtUaW1lcl0gaGFzIGJlZW4gY2FuY2VsZWQsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIG5vdCBiZSBjYWxsZWQKICAgKiBieSB0aGUgdGltZXIuIENhbGxpbmcgW2NhbmNlbF0gbW9yZSB0aGFuIG9uY2Ugb24gYSBbVGltZXJdIGlzIGFsbG93ZWQsIGFuZAogICAqIHdpbGwgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdC4KICAgKi8KICB2b2lkIGNhbmNlbCgpOwoKICAvKioKICAgKiBUaGUgbnVtYmVyIG9mIGR1cmF0aW9ucyBwcmVjZWRpbmcgdGhlIG1vc3QgcmVjZW50IHRpbWVyIGV2ZW50LgogICAqCiAgICogVGhlIHZhbHVlIHN0YXJ0cyBhdCB6ZXJvIGFuZCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSB0aW1lciBldmVudAogICAqIG9jY3Vycywgc28gZWFjaCBjYWxsYmFjayB3aWxsIHNlZSBhIGxhcmdlciB2YWx1ZSB0aGFuIHRoZSBwcmV2aW91cyBvbmUuCiAgICoKICAgKiBJZiBhIHBlcmlvZGljIHRpbWVyIHdpdGggYSBub24temVybyBkdXJhdGlvbiBpcyBkZWxheWVkIHRvbyBtdWNoLAogICAqIHNvIG1vcmUgdGhhbiBvbmUgdGljayBzaG91bGQgaGF2ZSBoYXBwZW5lZCwKICAgKiBhbGwgYnV0IHRoZSBsYXN0IHRpY2sgaW4gdGhlIHBhc3QgYXJlIGNvbnNpZGVyZWQgIm1pc3NlZCIsCiAgICogYW5kIG5vIGNhbGxiYWNrIGlzIGludm9rZWQgZm9yIHRoZW0uCiAgICogVGhlIFt0aWNrXSBjb3VudCByZWZsZWN0cyB0aGUgbnVtYmVyIG9mIGR1cmF0aW9ucyB0aGF0IGhhdmUgcGFzc2VkIGFuZAogICAqIG5vdCB0aGUgbnVtYmVyIG9mIGNhbGxiYWNrIGludm9jYXRpb25zIHRoYXQgaGF2ZSBoYXBwZW5lZC4KICAgKi8KICBpbnQgZ2V0IHRpY2s7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgdGltZXIgaXMgc3RpbGwgYWN0aXZlLgogICAqCiAgICogQSBub24tcGVyaW9kaWMgdGltZXIgaXMgYWN0aXZlIGlmIHRoZSBjYWxsYmFjayBoYXMgbm90IGJlZW4gZXhlY3V0ZWQsCiAgICogYW5kIHRoZSB0aW1lciBoYXMgbm90IGJlZW4gY2FuY2VsZWQuCiAgICoKICAgKiBBIHBlcmlvZGljIHRpbWVyIGlzIGFjdGl2ZSBpZiBpdCBoYXMgbm90IGJlZW4gY2FuY2VsZWQuCiAgICovCiAgYm9vbCBnZXQgaXNBY3RpdmU7CgogIGV4dGVybmFsIHN0YXRpYyBUaW1lciBfY3JlYXRlVGltZXIoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgY2FsbGJhY2soKSk7CiAgZXh0ZXJuYWwgc3RhdGljIFRpbWVyIF9jcmVhdGVQZXJpb2RpY1RpbWVyKAogICAgICBEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBjYWxsYmFjayhUaW1lciB0aW1lcikpOwp9CoCBAE5OPAEUAQRJAztQRAM/RgNGSRoLLy8DJkgwBQcwCQUHSDsDLwQXBhoFRAUGNiVKJjsGGEwEAQYkBUoqBUZFNDAFTEFLPgZKJUomQwZQRgQBBkMFSgYlKAQBBhgFUFAiBhEBBkQFSU0FRzFAKkxABhABBjAFSyoFPQYVAUouNgIBFWRhcnQ6YXN5bmMvdGltZXIuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2Vycm9yc19wYXRjaC5kYXJ0wABMgS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIEVycm9yIHsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9vYmplY3RUb1N0cmluZyhPYmplY3Qgb2JqZWN0KSB7CiAgICByZXR1cm4gT2JqZWN0Ll90b1N0cmluZyhvYmplY3QpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfc3RyaW5nVG9TYWZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKICAgIHJldHVybiBqc29uLmVuY29kZShzdHJpbmcpOwogIH0KCiAgQHBhdGNoCiAgU3RhY2tUcmFjZSBnZXQgc3RhY2tUcmFjZSA9PiBfc3RhY2tUcmFjZTsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIFN0YWNrVHJhY2UgX3N0YWNrVHJhY2U7Cn0KCmNsYXNzIF9Bc3NlcnRpb25FcnJvciBleHRlbmRzIEVycm9yIGltcGxlbWVudHMgQXNzZXJ0aW9uRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBfQXNzZXJ0aW9uRXJyb3IuX2NyZWF0ZSgKICAgICAgdGhpcy5fZmFpbGVkQXNzZXJ0aW9uLCB0aGlzLl91cmwsIHRoaXMuX2xpbmUsIHRoaXMuX2NvbHVtbiwgdGhpcy5tZXNzYWdlKTsKCiAgLy8gQXNzZXJ0aW9uRXJyb3JfdGhyb3dOZXcgaW4gZXJyb3JzLmNjIGZpc2hlcyB0aGUgYXNzZXJ0aW9uIHNvdXJjZSBjb2RlCiAgLy8gb3V0IG9mIHRoZSBzY3JpcHQuIEl0IGV4cGVjdHMgYSBEYXJ0IHN0YWNrIGZyYW1lIGZyb20gY2xhc3MKICAvLyBfQXNzZXJ0aW9uRXJyb3IuIFRodXMgd2UgbmVlZCBhIERhcnQgc3R1YiB0aGF0IGNhbGxzIHRoZSBuYXRpdmUgY29kZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgX3Rocm93TmV3KGludCBhc3NlcnRpb25TdGFydCwgaW50IGFzc2VydGlvbkVuZCwgT2JqZWN0IG1lc3NhZ2UpIHsKICAgIF9kb1Rocm93TmV3KGFzc2VydGlvblN0YXJ0LCBhc3NlcnRpb25FbmQsIG1lc3NhZ2UpOwogIH0KCiAgc3RhdGljIF9kb1Rocm93TmV3KGludCBhc3NlcnRpb25TdGFydCwgaW50IGFzc2VydGlvbkVuZCwgT2JqZWN0IG1lc3NhZ2UpCiAgICAgIG5hdGl2ZSAiQXNzZXJ0aW9uRXJyb3JfdGhyb3dOZXciOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgX2V2YWx1YXRlQXNzZXJ0aW9uKGNvbmRpdGlvbikgewogICAgaWYgKGlkZW50aWNhbChjb25kaXRpb24sIHRydWUpIHx8IGlkZW50aWNhbChjb25kaXRpb24sIGZhbHNlKSkgewogICAgICByZXR1cm4gY29uZGl0aW9uOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiBpcyBfQ2xvc3VyZSkgewogICAgICByZXR1cm4gKGNvbmRpdGlvbiBhcyBkeW5hbWljKSgpOwogICAgfQogICAgaWYgKGNvbmRpdGlvbiBpcyBGdW5jdGlvbikgewogICAgICBjb25kaXRpb24gPSBjb25kaXRpb24oKTsKICAgIH0KICAgIHJldHVybiBjb25kaXRpb247CiAgfQoKICBTdHJpbmcgZ2V0IF9tZXNzYWdlU3RyaW5nIHsKICAgIGlmIChtZXNzYWdlID09IG51bGwpIHJldHVybiAiaXMgbm90IHRydWUuIjsKICAgIGlmIChtZXNzYWdlIGlzIFN0cmluZykgcmV0dXJuIG1lc3NhZ2U7CiAgICByZXR1cm4gRXJyb3Iuc2FmZVRvU3RyaW5nKG1lc3NhZ2UpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgaWYgKF91cmwgPT0gbnVsbCkgewogICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSByZXR1cm4gX2ZhaWxlZEFzc2VydGlvbj8udHJpbSgpOwogICAgICByZXR1cm4gIicke19mYWlsZWRBc3NlcnRpb24/LnRyaW0oKX0nOiAkX21lc3NhZ2VTdHJpbmciOwogICAgfQogICAgdmFyIGNvbHVtbkluZm8gPSAiIjsKICAgIGlmIChfY29sdW1uID4gMCkgewogICAgICAvLyBPbmx5IGFkZCBjb2x1bW4gaW5mb3JtYXRpb24gaWYgaXQgaXMgdmFsaWQuCiAgICAgIGNvbHVtbkluZm8gPSAiIHBvcyAkX2NvbHVtbiI7CiAgICB9CiAgICByZXR1cm4gIickX3VybCc6IEZhaWxlZCBhc3NlcnRpb246IGxpbmUgJF9saW5lJGNvbHVtbkluZm86ICIKICAgICAgICAiJyRfZmFpbGVkQXNzZXJ0aW9uJzogJF9tZXNzYWdlU3RyaW5nIjsKICB9CgogIGZpbmFsIFN0cmluZyBfZmFpbGVkQXNzZXJ0aW9uOwogIGZpbmFsIFN0cmluZyBfdXJsOwogIGZpbmFsIGludCBfbGluZTsKICBmaW5hbCBpbnQgX2NvbHVtbjsKICBmaW5hbCBPYmplY3QgbWVzc2FnZTsKfQoKY2xhc3MgX1R5cGVFcnJvciBleHRlbmRzIF9Bc3NlcnRpb25FcnJvciBpbXBsZW1lbnRzIFR5cGVFcnJvciB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIF9UeXBlRXJyb3IuX2NyZWF0ZShTdHJpbmcgdXJsLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGVycm9yTXNnKQogICAgICA6IHN1cGVyLl9jcmVhdGUoImlzIGFzc2lnbmFibGUiLCB1cmwsIGxpbmUsIGNvbHVtbiwgZXJyb3JNc2cpOwoKICBzdGF0aWMgX3Rocm93TmV3KGludCBsb2NhdGlvbiwgT2JqZWN0IHNyY192YWx1ZSwgX1R5cGUgZHN0X3R5cGUsCiAgICAgIFN0cmluZyBkc3RfbmFtZSkgbmF0aXZlICJUeXBlRXJyb3JfdGhyb3dOZXciOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBzdXBlci5tZXNzYWdlOwp9CgpjbGFzcyBfQ2FzdEVycm9yIGV4dGVuZHMgRXJyb3IgaW1wbGVtZW50cyBDYXN0RXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBfQ2FzdEVycm9yLl9jcmVhdGUodGhpcy5fdXJsLCB0aGlzLl9saW5lLCB0aGlzLl9jb2x1bW4sIHRoaXMuX2Vycm9yTXNnKTsKCiAgLy8gQSBDYXN0RXJyb3IgaXMgYWxsb2NhdGVkIGJ5IFR5cGVFcnJvci5fdGhyb3dOZXcoKSB3aGVuIGRzdF9uYW1lIGVxdWFscwogIC8vIFN5bWJvbHM6OkluVHlwZUNhc3QoKS4KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX2Vycm9yTXNnOwoKICAvLyBGaWVsZHMgX3VybCwgX2xpbmUsIGFuZCBfY29sdW1uIGFyZSBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KICBmaW5hbCBTdHJpbmcgX3VybDsKICBmaW5hbCBpbnQgX2xpbmU7CiAgZmluYWwgaW50IF9jb2x1bW47CiAgZmluYWwgU3RyaW5nIF9lcnJvck1zZzsKfQoKQHBhdGNoCmNsYXNzIEZhbGxUaHJvdWdoRXJyb3IgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBGYWxsVGhyb3VnaEVycm9yLl9jcmVhdGUoU3RyaW5nIHVybCwgaW50IGxpbmUpCiAgICAgIDogX3VybCA9IHVybCwKICAgICAgICBfbGluZSA9IGxpbmU7CgogIHN0YXRpYyBfdGhyb3dOZXcoaW50IGNhc2VfY2xhdXNlX3BvcykgbmF0aXZlICJGYWxsVGhyb3VnaEVycm9yX3Rocm93TmV3IjsKCiAgQHBhdGNoCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICInJF91cmwnOiBTd2l0Y2ggY2FzZSBmYWxsLXRocm91Z2ggYXQgbGluZSAkX2xpbmUuIjsKICB9CgogIC8vIFRoZXNlIG5ldyBmaWVsZHMgY2Fubm90IGJlIGRlY2xhcmVkIGZpbmFsLCBiZWNhdXNlIGEgY29uc3RydWN0b3IgZXhpc3RzCiAgLy8gaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBwYXRjaGVkIGNsYXNzLgogIFN0cmluZyBfdXJsOwogIGludCBfbGluZTsKfQoKY2xhc3MgX0ludGVybmFsRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBfSW50ZXJuYWxFcnJvcih0aGlzLl9tc2cpOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJJbnRlcm5hbEVycm9yOiAnJHtfbXNnfSciOwogIGZpbmFsIFN0cmluZyBfbXNnOwp9CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBVbnN1cHBvcnRlZEVycm9yIHsKICBzdGF0aWMgX3Rocm93TmV3KFN0cmluZyBtc2cpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKG1zZyk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvciB7CiAgc3RhdGljIF90aHJvd05ldyhTdHJpbmcgdmFyaWFibGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvcih2YXJpYWJsZU5hbWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBBYnN0cmFjdENsYXNzSW5zdGFudGlhdGlvbkVycm9yLl9jcmVhdGUoCiAgICAgIHRoaXMuX2NsYXNzTmFtZSwgdGhpcy5fdXJsLCB0aGlzLl9saW5lKTsKCiAgc3RhdGljIF90aHJvd05ldyhpbnQgY2FzZV9jbGF1c2VfcG9zLCBTdHJpbmcgY2xhc3NOYW1lKQogICAgICBuYXRpdmUgIkFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3JfdGhyb3dOZXciOwoKICBAcGF0Y2gKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIkNhbm5vdCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyAkX2NsYXNzTmFtZTogIgogICAgICAgICJfdXJsICckX3VybCcgbGluZSAkX2xpbmUiOwogIH0KCiAgLy8gVGhlc2UgbmV3IGZpZWxkcyBjYW5ub3QgYmUgZGVjbGFyZWQgZmluYWwsIGJlY2F1c2UgYSBjb25zdHJ1Y3RvciBleGlzdHMKICAvLyBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHBhdGNoZWQgY2xhc3MuCiAgU3RyaW5nIF91cmw7CiAgaW50IF9saW5lOwp9CgpAcGF0Y2gKY2xhc3MgTm9TdWNoTWV0aG9kRXJyb3IgewogIC8vIERlcHJlY2F0ZWQgbWVtYmVycyB0byBiZSByZW1vdmVkLgogIFN5bWJvbCBfbWVtYmVyTmFtZTsKICBMaXN0IF9hcmd1bWVudHM7CiAgTWFwPFN5bWJvbCwgZHluYW1pYz4gX25hbWVkQXJndW1lbnRzOwogIExpc3QgX2V4aXN0aW5nQXJndW1lbnROYW1lczsKCiAgZmluYWwgT2JqZWN0IF9yZWNlaXZlcjsKICBmaW5hbCBfSW52b2NhdGlvbk1pcnJvciBfaW52b2NhdGlvbjsKCiAgQHBhdGNoCiAgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24oT2JqZWN0IHJlY2VpdmVyLCBJbnZvY2F0aW9uIGludm9jYXRpb24pCiAgICAgIDogX3JlY2VpdmVyID0gcmVjZWl2ZXIsCiAgICAgICAgX2ludm9jYXRpb24gPSBpbnZvY2F0aW9uIGFzIF9JbnZvY2F0aW9uTWlycm9yOwoKICBzdGF0aWMgdm9pZCBfdGhyb3dOZXdJbnZvY2F0aW9uKE9iamVjdCByZWNlaXZlciwgSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CiAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24ocmVjZWl2ZXIsIGludm9jYXRpb24pOwogIH0KCiAgLy8gVGhlIGNvbXBpbGVyIGVtaXRzIGEgY2FsbCB0byBfdGhyb3dOZXcgd2hlbiBpdCBjYW5ub3QgcmVzb2x2ZSBhIHN0YXRpYwogIC8vIG1ldGhvZCBhdCBjb21waWxlIHRpbWUuIFRoZSByZWNlaXZlciBpcyBhY3R1YWxseSB0aGUgbGl0ZXJhbCBjbGFzcyBvZiB0aGUKICAvLyB1bnJlc29sdmVkIG1ldGhvZC4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBzdGF0aWMgdm9pZCBfdGhyb3dOZXcoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVtYmVyTmFtZSwgaW50IGludm9jYXRpb25fdHlwZSwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsIExpc3QgYXJndW1lbnRzLCBMaXN0IGFyZ3VtZW50TmFtZXMpIHsKICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFcnJvci5fd2l0aFR5cGUocmVjZWl2ZXIsIG1lbWJlck5hbWUsIGludm9jYXRpb25fdHlwZSwKICAgICAgICB0eXBlQXJndW1lbnRzLCBhcmd1bWVudHMsIGFyZ3VtZW50TmFtZXMpOwogIH0KCiAgc3RhdGljIHZvaWQgX3Rocm93TmV3SWZOb3RMb2FkZWQoCiAgICAgIF9MaWJyYXJ5UHJlZml4IHByZWZpeCwKICAgICAgT2JqZWN0IHJlY2VpdmVyLAogICAgICBTdHJpbmcgbWVtYmVyTmFtZSwKICAgICAgaW50IGludm9jYXRpb25fdHlwZSwKICAgICAgT2JqZWN0IHR5cGVBcmd1bWVudHMsCiAgICAgIExpc3QgYXJndW1lbnRzLAogICAgICBMaXN0IGFyZ3VtZW50TmFtZXMpIHsKICAgIGlmICghcHJlZml4LmlzTG9hZGVkKCkpIHsKICAgICAgX3Rocm93TmV3KHJlY2VpdmVyLCBtZW1iZXJOYW1lLCBpbnZvY2F0aW9uX3R5cGUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50cywKICAgICAgICAgIGFyZ3VtZW50TmFtZXMpOwogICAgfQogIH0KCiAgLy8gVE9ETyhyZWdpcyk6IERlcHJlY2F0ZWQgbWVtYmVyIHN0aWxsIHVzZWQgYnkgZGFydDJqcyB0byBiZSByZW1vdmVkLgogIC8vIFJlbWVtYmVyIHRoZSB0eXBlIGZyb20gdGhlIGludm9jYXRpb24gbWlycm9yIG9yIHN0YXRpYyBjb21waWxhdGlvbgogIC8vIGFuYWx5c2lzIHdoZW4gdGhyb3duIGRpcmVjdGx5IHdpdGggX3Rocm93TmV3LiBBIG5lZ2F0aXZlIHZhbHVlIG1lYW5zCiAgLy8gdGhhdCBubyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCiAgaW50IF9pbnZvY2F0aW9uX3R5cGU7CgogIC8vIFRPRE8ocmVnaXMpOiBEZXByZWNhdGVkIGNvbnN0cnVjdG9yIHN0aWxsIHVzZWQgYnkgZGFydDJqcyB0byBiZSByZW1vdmVkLgogIEBwYXRjaAogIE5vU3VjaE1ldGhvZEVycm9yKE9iamVjdCByZWNlaXZlciwgU3ltYm9sIG1lbWJlck5hbWUsCiAgICAgIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywgTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIFtMaXN0IGV4aXN0aW5nQXJndW1lbnROYW1lcyA9IG51bGxdKQogICAgICA6IF9yZWNlaXZlciA9IHJlY2VpdmVyLAogICAgICAgIF9pbnZvY2F0aW9uID0gbnVsbCwKICAgICAgICBfbWVtYmVyTmFtZSA9IG1lbWJlck5hbWUsCiAgICAgICAgX2FyZ3VtZW50cyA9IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgICAgX25hbWVkQXJndW1lbnRzID0gbmFtZWRBcmd1bWVudHMsCiAgICAgICAgX2V4aXN0aW5nQXJndW1lbnROYW1lcyA9IGV4aXN0aW5nQXJndW1lbnROYW1lcywKICAgICAgICBfaW52b2NhdGlvbl90eXBlID0gLTE7CgogIC8vIEhlbHBlciB0byBidWlsZCBhIG1hcCBvZiBuYW1lZCBhcmd1bWVudHMuCiAgc3RhdGljIE1hcDxTeW1ib2wsIGR5bmFtaWM+IF9OYW1lZEFyZ3VtZW50c01hcCgKICAgICAgTGlzdCBhcmd1bWVudHMsIExpc3QgYXJndW1lbnROYW1lcykgewogICAgTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHMgPSBuZXcgTWFwPFN5bWJvbCwgZHluYW1pYz4oKTsKICAgIGludCBudW1Qb3NpdGlvbmFsQXJndW1lbnRzID0gYXJndW1lbnRzLmxlbmd0aCAtIGFyZ3VtZW50TmFtZXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBhcmdfdmFsdWUgPSBhcmd1bWVudHNbbnVtUG9zaXRpb25hbEFyZ3VtZW50cyArIGldOwogICAgICBuYW1lZEFyZ3VtZW50c1tuZXcgU3ltYm9sKGFyZ3VtZW50TmFtZXNbaV0pXSA9IGFyZ192YWx1ZTsKICAgIH0KICAgIHJldHVybiBuYW1lZEFyZ3VtZW50czsKICB9CgogIC8vIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIEV4Y2VwdGlvbnM6OlRocm93QnlUeXBlKGtOb1N1Y2hNZXRob2QpIGFuZCBmcm9tCiAgLy8gX3Rocm93TmV3IGFib3ZlLCB0YWtpbmcgYSBUeXBlQXJndW1lbnRzIG9iamVjdCByYXRoZXIgdGhhbiBhbiB1bnBhY2tlZCBsaXN0CiAgLy8gb2YgdHlwZXMsIGFzIHdlbGwgYXMgYSBsaXN0IG9mIGFsbCBhcmd1bWVudHMgYW5kIGEgbGlzdCBvZiBuYW1lcywgcmF0aGVyCiAgLy8gdGhhbiBhIHNlcGFyYXRlIGxpc3Qgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgYW5kIGEgbWFwIG9mIG5hbWVkIGFyZ3VtZW50cy4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgTm9TdWNoTWV0aG9kRXJyb3IuX3dpdGhUeXBlKAogICAgICB0aGlzLl9yZWNlaXZlciwKICAgICAgU3RyaW5nIG1lbWJlck5hbWUsCiAgICAgIGludCBpbnZvY2F0aW9uX3R5cGUsCiAgICAgIE9iamVjdCB0eXBlQXJndW1lbnRzLAogICAgICBMaXN0IGFyZ3VtZW50cywKICAgICAgTGlzdCBhcmd1bWVudE5hbWVzKQogICAgICA6IHRoaXMuX2ludm9jYXRpb24gPSBuZXcgX0ludm9jYXRpb25NaXJyb3IuX3dpdGhUeXBlKAogICAgICAgICAgICBuZXcgU3ltYm9sKG1lbWJlck5hbWUpLAogICAgICAgICAgICBpbnZvY2F0aW9uX3R5cGUsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgIT0gbnVsbAogICAgICAgICAgICAgICAgLy8gVE9ETygzMzA3Myk6IFVzZSBhY3R1YWwgY291bnQgb2YgdHlwZSBhcmd1bWVudHMgaW4gcGxhY2Ugb2YgMC4KICAgICAgICAgICAgICAgID8gX0ludm9jYXRpb25NaXJyb3IuX3VucGFja1R5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cywgMCkKICAgICAgICAgICAgICAgIDogbnVsbCwKICAgICAgICAgICAgYXJndW1lbnROYW1lcyAhPSBudWxsCiAgICAgICAgICAgICAgICA/IGFyZ3VtZW50cy5zdWJsaXN0KDAsIGFyZ3VtZW50cy5sZW5ndGggLSBhcmd1bWVudE5hbWVzLmxlbmd0aCkKICAgICAgICAgICAgICAgIDogYXJndW1lbnRzLAogICAgICAgICAgICBhcmd1bWVudE5hbWVzICE9IG51bGwKICAgICAgICAgICAgICAgID8gX05hbWVkQXJndW1lbnRzTWFwKGFyZ3VtZW50cywgYXJndW1lbnROYW1lcykKICAgICAgICAgICAgICAgIDogbnVsbCk7CgogIHN0YXRpYyBTdHJpbmcgX2V4aXN0aW5nTWV0aG9kU2lnbmF0dXJlKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsCiAgICAgIGludCBpbnZvY2F0aW9uVHlwZSkgbmF0aXZlICJOb1N1Y2hNZXRob2RFcnJvcl9leGlzdGluZ01ldGhvZFNpZ25hdHVyZSI7CgogIEBwYXRjaAogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIC8vIFRPRE8ocmVnaXMpOiBSZW1vdmUgdGhpcyBudWxsIGNoZWNrIG9uY2UgZGFydDJqcyBpcyB1cGRhdGVkLgogICAgaWYgKF9pbnZvY2F0aW9uID09IG51bGwpIHsKICAgICAgLy8gVXNlIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiB0b1N0cmluZy4KICAgICAgcmV0dXJuIF90b1N0cmluZ0RlcHJlY2F0ZWQoKTsKICAgIH0KICAgIFN0cmluZyBtZW1iZXJOYW1lID0KICAgICAgICBpbnRlcm5hbC5TeW1ib2wuY29tcHV0ZVVubWFuZ2xlZE5hbWUoX2ludm9jYXRpb24ubWVtYmVyTmFtZSk7CiAgICB2YXIgbGV2ZWwgPSAoX2ludm9jYXRpb24uX3R5cGUgPj4gX0ludm9jYXRpb25NaXJyb3IuX0xFVkVMX1NISUZUKSAmCiAgICAgICAgX0ludm9jYXRpb25NaXJyb3IuX0xFVkVMX01BU0s7CiAgICB2YXIga2luZCA9IF9pbnZvY2F0aW9uLl90eXBlICYgX0ludm9jYXRpb25NaXJyb3IuX0tJTkRfTUFTSzsKICAgIGlmIChraW5kID09IF9JbnZvY2F0aW9uTWlycm9yLl9MT0NBTF9WQVIpIHsKICAgICAgcmV0dXJuICJOb1N1Y2hNZXRob2RFcnJvcjogQ2Fubm90IGFzc2lnbiB0byBmaW5hbCB2YXJpYWJsZSAnJG1lbWJlck5hbWUnIjsKICAgIH0KCiAgICBTdHJpbmdCdWZmZXIgdHlwZUFyZ3VtZW50c0J1ZiA9IG51bGw7CiAgICB2YXIgdHlwZUFyZ3VtZW50cyA9IF9pbnZvY2F0aW9uLnR5cGVBcmd1bWVudHM7CiAgICBpZiAoKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgJiYgKHR5cGVBcmd1bWVudHMubGVuZ3RoID4gMCkpIHsKICAgICAgdHlwZUFyZ3VtZW50c0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgdHlwZUFyZ3VtZW50c0J1Zi53cml0ZSgiPCIpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIHR5cGVBcmd1bWVudHNCdWYud3JpdGUoIiwgIik7CiAgICAgICAgfQogICAgICAgIHR5cGVBcmd1bWVudHNCdWYud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKHR5cGVBcmd1bWVudHNbaV0pKTsKICAgICAgfQogICAgICB0eXBlQXJndW1lbnRzQnVmLndyaXRlKCI+Iik7CiAgICB9CiAgICBTdHJpbmdCdWZmZXIgYXJndW1lbnRzQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgdmFyIHBvc2l0aW9uYWxBcmd1bWVudHMgPSBfaW52b2NhdGlvbi5wb3NpdGlvbmFsQXJndW1lbnRzOwogICAgaW50IGFyZ3VtZW50Q291bnQgPSAwOwogICAgaWYgKHBvc2l0aW9uYWxBcmd1bWVudHMgIT0gbnVsbCkgewogICAgICBmb3IgKDsgYXJndW1lbnRDb3VudCA8IHBvc2l0aW9uYWxBcmd1bWVudHMubGVuZ3RoOyBhcmd1bWVudENvdW50KyspIHsKICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA+IDApIHsKICAgICAgICAgIGFyZ3VtZW50c0J1Zi53cml0ZSgiLCAiKTsKICAgICAgICB9CiAgICAgICAgYXJndW1lbnRzQnVmCiAgICAgICAgICAgIC53cml0ZShFcnJvci5zYWZlVG9TdHJpbmcocG9zaXRpb25hbEFyZ3VtZW50c1thcmd1bWVudENvdW50XSkpOwogICAgICB9CiAgICB9CiAgICB2YXIgbmFtZWRBcmd1bWVudHMgPSBfaW52b2NhdGlvbi5uYW1lZEFyZ3VtZW50czsKICAgIGlmIChuYW1lZEFyZ3VtZW50cyAhPSBudWxsKSB7CiAgICAgIG5hbWVkQXJndW1lbnRzLmZvckVhY2goKFN5bWJvbCBrZXksIHZhciB2YWx1ZSkgewogICAgICAgIGlmIChhcmd1bWVudENvdW50ID4gMCkgewogICAgICAgICAgYXJndW1lbnRzQnVmLndyaXRlKCIsICIpOwogICAgICAgIH0KICAgICAgICBhcmd1bWVudHNCdWYud3JpdGUoaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKGtleSkpOwogICAgICAgIGFyZ3VtZW50c0J1Zi53cml0ZSgiOiAiKTsKICAgICAgICBhcmd1bWVudHNCdWYud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgYXJndW1lbnRDb3VudCsrOwogICAgICB9KTsKICAgIH0KICAgIFN0cmluZyBleGlzdGluZ1NpZyA9CiAgICAgICAgX2V4aXN0aW5nTWV0aG9kU2lnbmF0dXJlKF9yZWNlaXZlciwgbWVtYmVyTmFtZSwgX2ludm9jYXRpb24uX3R5cGUpOwogICAgU3RyaW5nIGFyZ3NNc2cgPSBleGlzdGluZ1NpZyAhPSBudWxsID8gIiB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cyIgOiAiIjsKCiAgICBTdHJpbmcga2luZEJ1ZjsKICAgIGlmIChraW5kID49IDAgJiYga2luZCA8IDUpIHsKICAgICAga2luZEJ1ZiA9IChjb25zdCBbCiAgICAgICAgIm1ldGhvZCIsCiAgICAgICAgImdldHRlciIsCiAgICAgICAgInNldHRlciIsCiAgICAgICAgImdldHRlciBvciBzZXR0ZXIiLAogICAgICAgICJ2YXJpYWJsZSIKICAgICAgXSlba2luZF07CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIG1zZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk5vU3VjaE1ldGhvZEVycm9yOiAiKTsKICAgIGJvb2wgaXNfdHlwZV9jYWxsID0gZmFsc2U7CiAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX0RZTkFNSUM6CiAgICAgICAgewogICAgICAgICAgaWYgKF9yZWNlaXZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChleGlzdGluZ1NpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgbXNnQnVmLndyaXRlbG4oIlRoZSBudWxsIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgJGtpbmRCdWYgIgogICAgICAgICAgICAgICAgICAiJyRtZW1iZXJOYW1lJyRhcmdzTXNnLiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJUaGUgJGtpbmRCdWYgJyRtZW1iZXJOYW1lJyB3YXMgY2FsbGVkIG9uIG51bGwuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChfcmVjZWl2ZXIgaXMgX0Nsb3N1cmUpIHsKICAgICAgICAgICAgICBtc2dCdWYud3JpdGVsbigiQ2xvc3VyZSBjYWxsIHdpdGggbWlzbWF0Y2hlZCBhcmd1bWVudHM6ICIKICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICckbWVtYmVyTmFtZSciKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChfcmVjZWl2ZXIgaXMgX1R5cGUgJiYgbWVtYmVyTmFtZSA9PSAiY2FsbCIpIHsKICAgICAgICAgICAgICBpc190eXBlX2NhbGwgPSB0cnVlOwogICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gX3JlY2VpdmVyLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgbXNnQnVmLndyaXRlbG4oIkF0dGVtcHRlZCB0byB1c2UgdHlwZSAnJG5hbWUnIGFzIGEgZnVuY3Rpb24uICIKICAgICAgICAgICAgICAgICAgIlNpbmNlIHR5cGVzIGRvIG5vdCBkZWZpbmUgYSBtZXRob2QgJ2NhbGwnLCB0aGlzIGlzIG5vdCAiCiAgICAgICAgICAgICAgICAgICJwb3NzaWJsZS4gRGlkIHlvdSBpbnRlbmQgdG8gY2FsbCB0aGUgJG5hbWUgY29uc3RydWN0b3IgYW5kICIKICAgICAgICAgICAgICAgICAgImZvcmdldCB0aGUgJ25ldycgb3BlcmF0b3I/Iik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbXNnQnVmLndyaXRlbG4oIkNsYXNzICcke19yZWNlaXZlci5ydW50aW1lVHlwZX0nIGhhcyBubyBpbnN0YW5jZSAiCiAgICAgICAgICAgICAgICAgICIka2luZEJ1ZiAnJG1lbWJlck5hbWUnJGFyZ3NNc2cuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fU1VQRVI6CiAgICAgICAgewogICAgICAgICAgbXNnQnVmLndyaXRlbG4oIlN1cGVyIGNsYXNzIG9mIGNsYXNzICcke19yZWNlaXZlci5ydW50aW1lVHlwZX0nIGhhcyAiCiAgICAgICAgICAgICAgIm5vIGluc3RhbmNlICRraW5kQnVmICckbWVtYmVyTmFtZSckYXJnc01zZy4iKTsKICAgICAgICAgIG1lbWJlck5hbWUgPSAic3VwZXIuJG1lbWJlck5hbWUiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIF9JbnZvY2F0aW9uTWlycm9yLl9TVEFUSUM6CiAgICAgICAgewogICAgICAgICAgbXNnQnVmLndyaXRlbG4oIk5vIHN0YXRpYyAka2luZEJ1ZiAnJG1lbWJlck5hbWUnJGFyZ3NNc2cgIgogICAgICAgICAgICAgICJkZWNsYXJlZCBpbiBjbGFzcyAnJF9yZWNlaXZlcicuIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX0NPTlNUUlVDVE9SOgogICAgICAgIHsKICAgICAgICAgIG1zZ0J1Zi53cml0ZWxuKCJObyBjb25zdHJ1Y3RvciAnJG1lbWJlck5hbWUnJGFyZ3NNc2cgZGVjbGFyZWQgIgogICAgICAgICAgICAgICJpbiBjbGFzcyAnJF9yZWNlaXZlcicuIik7CiAgICAgICAgICBtZW1iZXJOYW1lID0gIm5ldyAkbWVtYmVyTmFtZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX1RPUF9MRVZFTDoKICAgICAgICB7CiAgICAgICAgICBtc2dCdWYud3JpdGVsbigiTm8gdG9wLWxldmVsICRraW5kQnVmICckbWVtYmVyTmFtZSckYXJnc01zZyAiCiAgICAgICAgICAgICAgImRlY2xhcmVkLiIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChsZXZlbCA9PSBfSW52b2NhdGlvbk1pcnJvci5fVE9QX0xFVkVMKSB7CiAgICAgIG1zZ0J1Zi53cml0ZWxuKCJSZWNlaXZlcjogdG9wLWxldmVsIik7CiAgICB9IGVsc2UgewogICAgICBtc2dCdWYud3JpdGVsbigiUmVjZWl2ZXI6ICR7RXJyb3Iuc2FmZVRvU3RyaW5nKF9yZWNlaXZlcil9Iik7CiAgICB9CgogICAgaWYgKGtpbmQgPT0gX0ludm9jYXRpb25NaXJyb3IuX01FVEhPRCkgewogICAgICBTdHJpbmcgbSA9IGlzX3R5cGVfY2FsbCA/ICIkX3JlY2VpdmVyIiA6ICIkbWVtYmVyTmFtZSI7CiAgICAgIG1zZ0J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG0iKTsKICAgICAgaWYgKHR5cGVBcmd1bWVudHNCdWYgIT0gbnVsbCkgewogICAgICAgIG1zZ0J1Zi53cml0ZSh0eXBlQXJndW1lbnRzQnVmKTsKICAgICAgfQogICAgICBtc2dCdWYud3JpdGUoIigkYXJndW1lbnRzQnVmKSIpOwogICAgfSBlbHNlIGlmIChhcmd1bWVudENvdW50ID09IDApIHsKICAgICAgbXNnQnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSIpOwogICAgfSBlbHNlIGlmIChraW5kID09IF9JbnZvY2F0aW9uTWlycm9yLl9TRVRURVIpIHsKICAgICAgbXNnQnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSRhcmd1bWVudHNCdWYiKTsKICAgIH0gZWxzZSB7CiAgICAgIG1zZ0J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG1lbWJlck5hbWUgPSAkYXJndW1lbnRzQnVmIik7CiAgICB9CgogICAgaWYgKGV4aXN0aW5nU2lnICE9IG51bGwpIHsKICAgICAgbXNnQnVmLndyaXRlKCJcbkZvdW5kOiAkbWVtYmVyTmFtZSRleGlzdGluZ1NpZyIpOwogICAgfQoKICAgIHJldHVybiBtc2dCdWYudG9TdHJpbmcoKTsKICB9CgogIC8vIFRPRE8ocmVnaXMpOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBvbmNlIGRhcnQyanMgaXMgdXBkYXRlZC4KICBTdHJpbmcgX3RvU3RyaW5nRGVwcmVjYXRlZCgpIHsKICAgIHZhciBsZXZlbCA9IChfaW52b2NhdGlvbl90eXBlID4+IF9JbnZvY2F0aW9uTWlycm9yLl9MRVZFTF9TSElGVCkgJgogICAgICAgIF9JbnZvY2F0aW9uTWlycm9yLl9MRVZFTF9NQVNLOwogICAgdmFyIHR5cGUgPSBfaW52b2NhdGlvbl90eXBlICYgX0ludm9jYXRpb25NaXJyb3IuX0tJTkRfTUFTSzsKICAgIFN0cmluZyBtZW1iZXJOYW1lID0gKF9tZW1iZXJOYW1lID09IG51bGwpCiAgICAgICAgPyAiIgogICAgICAgIDogaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKF9tZW1iZXJOYW1lKTsKCiAgICBpZiAodHlwZSA9PSBfSW52b2NhdGlvbk1pcnJvci5fTE9DQUxfVkFSKSB7CiAgICAgIHJldHVybiAiTm9TdWNoTWV0aG9kRXJyb3I6IENhbm5vdCBhc3NpZ24gdG8gZmluYWwgdmFyaWFibGUgJyRtZW1iZXJOYW1lJyI7CiAgICB9CgogICAgU3RyaW5nQnVmZmVyIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGludCBhcmd1bWVudENvdW50ID0gMDsKICAgIGlmIChfYXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgZm9yICg7IGFyZ3VtZW50Q291bnQgPCBfYXJndW1lbnRzLmxlbmd0aDsgYXJndW1lbnRDb3VudCsrKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50Q291bnQgPiAwKSB7CiAgICAgICAgICBhcmd1bWVudHMud3JpdGUoIiwgIik7CiAgICAgICAgfQogICAgICAgIGFyZ3VtZW50cy53cml0ZShFcnJvci5zYWZlVG9TdHJpbmcoX2FyZ3VtZW50c1thcmd1bWVudENvdW50XSkpOwogICAgICB9CiAgICB9CiAgICBpZiAoX25hbWVkQXJndW1lbnRzICE9IG51bGwpIHsKICAgICAgX25hbWVkQXJndW1lbnRzLmZvckVhY2goKFN5bWJvbCBrZXksIHZhciB2YWx1ZSkgewogICAgICAgIGlmIChhcmd1bWVudENvdW50ID4gMCkgewogICAgICAgICAgYXJndW1lbnRzLndyaXRlKCIsICIpOwogICAgICAgIH0KICAgICAgICBhcmd1bWVudHMud3JpdGUoaW50ZXJuYWwuU3ltYm9sLmNvbXB1dGVVbm1hbmdsZWROYW1lKGtleSkpOwogICAgICAgIGFyZ3VtZW50cy53cml0ZSgiOiAiKTsKICAgICAgICBhcmd1bWVudHMud3JpdGUoRXJyb3Iuc2FmZVRvU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgYXJndW1lbnRDb3VudCsrOwogICAgICB9KTsKICAgIH0KICAgIGJvb2wgYXJnc19taXNtYXRjaCA9IF9leGlzdGluZ0FyZ3VtZW50TmFtZXMgIT0gbnVsbDsKICAgIFN0cmluZyBhcmdzX21lc3NhZ2UgPSBhcmdzX21pc21hdGNoID8gIiB3aXRoIG1hdGNoaW5nIGFyZ3VtZW50cyIgOiAiIjsKCiAgICBTdHJpbmcgdHlwZV9zdHI7CiAgICBpZiAodHlwZSA+PSAwICYmIHR5cGUgPCA1KSB7CiAgICAgIHR5cGVfc3RyID0gKGNvbnN0IFsKICAgICAgICAibWV0aG9kIiwKICAgICAgICAiZ2V0dGVyIiwKICAgICAgICAic2V0dGVyIiwKICAgICAgICAiZ2V0dGVyIG9yIHNldHRlciIsCiAgICAgICAgInZhcmlhYmxlIgogICAgICBdKVt0eXBlXTsKICAgIH0KCiAgICBTdHJpbmdCdWZmZXIgbXNnX2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIk5vU3VjaE1ldGhvZEVycm9yOiAiKTsKICAgIGJvb2wgaXNfdHlwZV9jYWxsID0gZmFsc2U7CiAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICAgIGNhc2UgX0ludm9jYXRpb25NaXJyb3IuX0RZTkFNSUM6CiAgICAgICAgewogICAgICAgICAgaWYgKF9yZWNlaXZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChhcmdzX21pc21hdGNoKSB7CiAgICAgICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJUaGUgbnVsbCBvYmplY3QgZG9lcyBub3QgaGF2ZSBhICR0eXBlX3N0ciAiCiAgICAgICAgICAgICAgICAgICInJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZS4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtc2dfYnVmCiAgICAgICAgICAgICAgICAgIC53cml0ZWxuKCJUaGUgJHR5cGVfc3RyICckbWVtYmVyTmFtZScgd2FzIGNhbGxlZCBvbiBudWxsLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoX3JlY2VpdmVyIGlzIF9DbG9zdXJlKSB7CiAgICAgICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJDbG9zdXJlIGNhbGwgd2l0aCBtaXNtYXRjaGVkIGFyZ3VtZW50czogIgogICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gJyRtZW1iZXJOYW1lJyIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9yZWNlaXZlciBpcyBfVHlwZSAmJiBtZW1iZXJOYW1lID09ICJjYWxsIikgewogICAgICAgICAgICAgIGlzX3R5cGVfY2FsbCA9IHRydWU7CiAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBfcmVjZWl2ZXIudG9TdHJpbmcoKTsKICAgICAgICAgICAgICBtc2dfYnVmLndyaXRlbG4oIkF0dGVtcHRlZCB0byB1c2UgdHlwZSAnJG5hbWUnIGFzIGEgZnVuY3Rpb24uICIKICAgICAgICAgICAgICAgICAgIlNpbmNlIHR5cGVzIGRvIG5vdCBkZWZpbmUgYSBtZXRob2QgJ2NhbGwnLCB0aGlzIGlzIG5vdCAiCiAgICAgICAgICAgICAgICAgICJwb3NzaWJsZS4gRGlkIHlvdSBpbnRlbmQgdG8gY2FsbCB0aGUgJG5hbWUgY29uc3RydWN0b3IgYW5kICIKICAgICAgICAgICAgICAgICAgImZvcmdldCB0aGUgJ25ldycgb3BlcmF0b3I/Iik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbXNnX2J1ZgogICAgICAgICAgICAgICAgICAud3JpdGVsbigiQ2xhc3MgJyR7X3JlY2VpdmVyLnJ1bnRpbWVUeXBlfScgaGFzIG5vIGluc3RhbmNlICIKICAgICAgICAgICAgICAgICAgICAgICIkdHlwZV9zdHIgJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fU1VQRVI6CiAgICAgICAgewogICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJTdXBlciBjbGFzcyBvZiBjbGFzcyAnJHtfcmVjZWl2ZXIucnVudGltZVR5cGV9JyBoYXMgIgogICAgICAgICAgICAgICJubyBpbnN0YW5jZSAkdHlwZV9zdHIgJyRtZW1iZXJOYW1lJyRhcmdzX21lc3NhZ2UuIik7CiAgICAgICAgICBtZW1iZXJOYW1lID0gInN1cGVyLiRtZW1iZXJOYW1lIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fU1RBVElDOgogICAgICAgIHsKICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiTm8gc3RhdGljICR0eXBlX3N0ciAnJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZSAiCiAgICAgICAgICAgICAgImRlY2xhcmVkIGluIGNsYXNzICckX3JlY2VpdmVyJy4iKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fQ09OU1RSVUNUT1I6CiAgICAgICAgewogICAgICAgICAgbXNnX2J1Zi53cml0ZWxuKCJObyBjb25zdHJ1Y3RvciAnJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZSBkZWNsYXJlZCAiCiAgICAgICAgICAgICAgImluIGNsYXNzICckX3JlY2VpdmVyJy4iKTsKICAgICAgICAgIG1lbWJlck5hbWUgPSAibmV3ICRtZW1iZXJOYW1lIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBfSW52b2NhdGlvbk1pcnJvci5fVE9QX0xFVkVMOgogICAgICAgIHsKICAgICAgICAgIG1zZ19idWYud3JpdGVsbigiTm8gdG9wLWxldmVsICR0eXBlX3N0ciAnJG1lbWJlck5hbWUnJGFyZ3NfbWVzc2FnZSAiCiAgICAgICAgICAgICAgImRlY2xhcmVkLiIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChsZXZlbCA9PSBfSW52b2NhdGlvbk1pcnJvci5fVE9QX0xFVkVMKSB7CiAgICAgIG1zZ19idWYud3JpdGVsbigiUmVjZWl2ZXI6IHRvcC1sZXZlbCIpOwogICAgfSBlbHNlIHsKICAgICAgbXNnX2J1Zi53cml0ZWxuKCJSZWNlaXZlcjogJHtFcnJvci5zYWZlVG9TdHJpbmcoX3JlY2VpdmVyKX0iKTsKICAgIH0KCiAgICBpZiAodHlwZSA9PSBfSW52b2NhdGlvbk1pcnJvci5fTUVUSE9EKSB7CiAgICAgIFN0cmluZyBtID0gaXNfdHlwZV9jYWxsID8gIiRfcmVjZWl2ZXIiIDogIiRtZW1iZXJOYW1lIjsKICAgICAgbXNnX2J1Zi53cml0ZSgiVHJpZWQgY2FsbGluZzogJG0oJGFyZ3VtZW50cykiKTsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnRDb3VudCA9PSAwKSB7CiAgICAgIG1zZ19idWYud3JpdGUoIlRyaWVkIGNhbGxpbmc6ICRtZW1iZXJOYW1lIik7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gX0ludm9jYXRpb25NaXJyb3IuX1NFVFRFUikgewogICAgICBtc2dfYnVmLndyaXRlKCJUcmllZCBjYWxsaW5nOiAkbWVtYmVyTmFtZSRhcmd1bWVudHMiKTsKICAgIH0gZWxzZSB7CiAgICAgIG1zZ19idWYud3JpdGUoIlRyaWVkIGNhbGxpbmc6ICRtZW1iZXJOYW1lID0gJGFyZ3VtZW50cyIpOwogICAgfQoKICAgIGlmIChhcmdzX21pc21hdGNoKSB7CiAgICAgIFN0cmluZ0J1ZmZlciBmb3JtYWxQYXJhbWV0ZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9leGlzdGluZ0FyZ3VtZW50TmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIGZvcm1hbFBhcmFtZXRlcnMud3JpdGUoIiwgIik7CiAgICAgICAgfQogICAgICAgIGZvcm1hbFBhcmFtZXRlcnMud3JpdGUoX2V4aXN0aW5nQXJndW1lbnROYW1lc1tpXSk7CiAgICAgIH0KICAgICAgbXNnX2J1Zi53cml0ZSgiXG5Gb3VuZDogJG1lbWJlck5hbWUoJGZvcm1hbFBhcmFtZXRlcnMpIik7CiAgICB9CgogICAgcmV0dXJuIG1zZ19idWYudG9TdHJpbmcoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0NvbXBpbGVUaW1lRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIF9lcnJvck1zZzsKICBfQ29tcGlsZVRpbWVFcnJvcih0aGlzLl9lcnJvck1zZyk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX2Vycm9yTXNnOwp9CgovLy8gVXNlZCBieSBGYXN0YSB0byByZXBvcnQgYSBydW50aW1lIGVycm9yIHdoZW4gYSBmaW5hbCBmaWVsZCB3aXRoIGFuCi8vLyBpbml0aWFsaXplciBpcyBhbHNvIGluaXRpYWxpemVkIGluIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBOb3RlOiBpbiBzdHJvbmcgbW9kZSwgdGhpcyBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBhbmQgdGhpcyBjbGFzcyBiZWNvbWVzCi8vLyBvYnNvbGV0ZS4KY2xhc3MgX0R1cGxpY2F0ZWRGaWVsZEluaXRpYWxpemVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIF9uYW1lOwoKICBfRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcih0aGlzLl9uYW1lKTsKCiAgdG9TdHJpbmcoKSA9PiAiRXJyb3I6IGZpZWxkICckX25hbWUnIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIjsKfQqCUABOTjwBHgEHDgkxJQQBCTUgBAEJLAEcGgIBQBwbUQFLQUskSzgEAUsoASQpRRgGIScGIR8GFgQBHjArKAQBFhg8PwYZFzUkBkEwBAEhFRMVGAIBQBxIRQFDNAEmAgE2HEsBTBwBIgFLFRMVGgIBBxkJHDEUFgFMAQkWQAQBTTQPDQIBFxwjMxUCAQcaGSElBAIBByIqNwQCAQcoHCsvATo5AQkWPSQEAU00Dw0CAQcaJxYTKB8BGicBCUseNwFMRgQBTE8YJFFCUTIEASQdFxkbHBYcHlEaBgQBSUhKJxgBTgk4RSseHCIqKjgfAS8yLEZKNT1ABhsEAU1RTlAcHxYZGxwWGjwkHSJSSxgiUB0iPxkBTU4BCRZEHy0kBhhGSCdBMFEGASozQS0jNxUoCkYIIwY0PxsnTCEkChVMCAY1IjchJApHIjcZCgYZTEwBFCEZEhISHBMQBgFDHxUnCiMnSS0VUA4TKUgtRSMyTUxQMRVRNg4MEQolClA+LBEKJgpFMhEKKwpKKSoRCikKSBwRCgYBMS0NRAYBLT4pJigIJyUyND8NQgYBHzgGAR4EAUAhRydALg09ATBRBgExGx5DISEKSAgGIzghIQpEHzQZCgY5SwEVIRoSEhIcExAGAUQfFScKIyFLMhUWTw4TKUktRSMyTkxQMRUWT0AODBEKJQpRRCwRCiYKTDIRCisKUCkqEQopCk8cEQoGATEuDUUGAS0+NiUzND0NQAYBGTpAFSgKOwhABgEfBAIBGigaJSICAUdBBE4ONxYBMAFBAgEhZGFydDpjb3JlLXBhdGNoL2Vycm9yc19wYXRjaC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydIMzLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBDbGFzc2VzIGFuZCB1dGlsaXRpZXMgdGhhdCBzdXBwbGVtZW50IHRoZSBjb2xsZWN0aW9uIHN1cHBvcnQgaW4gZGFydDpjb3JlLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7Ci8vLwovLy8ge0BjYXRlZ29yeSBDb3JlfQpsaWJyYXJ5IGRhcnQuY29sbGVjdGlvbjsKCmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIGhpZGUgU3ltYm9sOwppbXBvcnQgJ2RhcnQ6bWF0aCcgc2hvdyBSYW5kb207IC8vIFVzZWQgYnkgTGlzdE1peGluLnNodWZmbGUuCgpwYXJ0ICdjb2xsZWN0aW9ucy5kYXJ0JzsKcGFydCAnaGFzaF9tYXAuZGFydCc7CnBhcnQgJ2hhc2hfc2V0LmRhcnQnOwpwYXJ0ICdpdGVyYWJsZS5kYXJ0JzsKcGFydCAnaXRlcmF0b3IuZGFydCc7CnBhcnQgJ2xpbmtlZF9oYXNoX21hcC5kYXJ0JzsKcGFydCAnbGlua2VkX2hhc2hfc2V0LmRhcnQnOwpwYXJ0ICdsaW5rZWRfbGlzdC5kYXJ0JzsKcGFydCAnbGlzdC5kYXJ0JzsKcGFydCAnbWFwcy5kYXJ0JzsKcGFydCAncXVldWUuZGFydCc7CnBhcnQgJ3NldC5kYXJ0JzsKcGFydCAnc3BsYXlfdHJlZS5kYXJ0JzsKHwBOTjwBTwQmBCIEFRkBJT4BGRYWFhYdHRkSEhMRGAEPZGFydDpjb2xsZWN0aW9uNG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL2hhc2hfbWFwLmRhcnSZMy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBEZWZhdWx0IGZ1bmN0aW9uIGZvciBlcXVhbGl0eSBjb21wYXJpc29uIGluIGN1c3RvbWl6ZWQgSGFzaE1hcHMKYm9vbCBfZGVmYXVsdEVxdWFscyhhLCBiKSA9PiBhID09IGI7CgovLy8gRGVmYXVsdCBmdW5jdGlvbiBmb3IgaGFzaC1jb2RlIGNvbXB1dGF0aW9uIGluIGN1c3RvbWl6ZWQgSGFzaE1hcHMKaW50IF9kZWZhdWx0SGFzaENvZGUoYSkgPT4gYS5oYXNoQ29kZTsKCi8vLyBUeXBlIG9mIGN1c3RvbSBlcXVhbGl0eSBmdW5jdGlvbgp0eXBlZGVmIF9FcXVhbGl0eTxLPiA9IGJvb2wgRnVuY3Rpb24oSyBhLCBLIGIpOwoKLy8vIFR5cGUgb2YgY3VzdG9tIGhhc2ggY29kZSBmdW5jdGlvbi4KdHlwZWRlZiBfSGFzaGVyPEs+ID0gaW50IEZ1bmN0aW9uKEsgb2JqZWN0KTsKCi8vLyBBIGhhc2gtdGFibGUgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW01hcF0uCi8vLwovLy8gVGhlIGtleXMgb2YgYSBgSGFzaE1hcGAgbXVzdCBoYXZlIGNvbnNpc3RlbnQgW09iamVjdC49PV0KLy8vIGFuZCBbT2JqZWN0Lmhhc2hDb2RlXSBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYD09YCBvcGVyYXRvcgovLy8gbXVzdCBkZWZpbmUgYSBzdGFibGUgZXF1aXZhbGVuY2UgcmVsYXRpb24gb24gdGhlIGtleXMgKHJlZmxleGl2ZSwKLy8vIHN5bW1ldHJpYywgdHJhbnNpdGl2ZSwgYW5kIGNvbnNpc3RlbnQgb3ZlciB0aW1lKSwgYW5kIHRoYXQgYGhhc2hDb2RlYAovLy8gbXVzdCBiZSB0aGUgc2FtZSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjb25zaWRlcmVkIGVxdWFsIGJ5IGA9PWAuCi8vLwovLy8gVGhlIG1hcCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgovLy8KLy8vIEl0ZXJhdGluZyB0aGUgbWFwJ3Mga2V5cywgdmFsdWVzIG9yIGVudHJpZXMgKHRocm91Z2ggW2ZvckVhY2hdKQovLy8gbWF5IGhhcHBlbiBpbiBhbnkgb3JkZXIuCi8vLyBUaGUgaXRlcmF0aW9uIG9yZGVyIG9ubHkgY2hhbmdlcyB3aGVuIHRoZSBtYXAgaXMgbW9kaWZpZWQuCi8vLyBWYWx1ZXMgYXJlIGl0ZXJhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZWlyIGFzc29jaWF0ZWQga2V5cywKLy8vIHNvIGl0ZXJhdGluZyB0aGUgW2tleXNdIGFuZCBbdmFsdWVzXSBpbiBwYXJhbGxlbAovLy8gd2lsbCBnaXZlIG1hdGNoaW5nIGtleSBhbmQgdmFsdWUgcGFpcnMuCmFic3RyYWN0IGNsYXNzIEhhc2hNYXA8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIC8vLyBDcmVhdGVzIGFuIHVub3JkZXJlZCBoYXNoLXRhYmxlIGJhc2VkIFtNYXBdLgogIC8vLwogIC8vLyBUaGUgY3JlYXRlZCBtYXAgaXMgbm90IG9yZGVyZWQgaW4gYW55IHdheS4gV2hlbiBpdGVyYXRpbmcgdGhlIGtleXMgb3IKICAvLy8gdmFsdWVzLCB0aGUgaXRlcmF0aW9uIG9yZGVyIGlzIHVuc3BlY2lmaWVkIGV4Y2VwdCB0aGF0IGl0IHdpbGwgc3RheSB0aGUKICAvLy8gc2FtZSBhcyBsb25nIGFzIHRoZSBtYXAgaXNuJ3QgY2hhbmdlZC4KICAvLy8KICAvLy8gSWYgW2VxdWFsc10gaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgdG8gY29tcGFyZSB0aGUga2V5cyBpbiB0aGUgdGFibGUgd2l0aAogIC8vLyBuZXcga2V5cy4gSWYgW2VxdWFsc10gaXMgb21pdHRlZCwgdGhlIGtleSdzIG93biBbT2JqZWN0Lj09XSBpcyB1c2VkCiAgLy8vIGluc3RlYWQuCiAgLy8vCiAgLy8vIFNpbWlsYXIsIGlmIFtoYXNoQ29kZV0gaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgdG8gcHJvZHVjZSBhIGhhc2ggdmFsdWUKICAvLy8gZm9yIGtleXMgaW4gb3JkZXIgdG8gcGxhY2UgdGhlbSBpbiB0aGUgaGFzaCB0YWJsZS4gSWYgaXQgaXMgb21pdHRlZCwgdGhlCiAgLy8vIGtleSdzIG93biBbT2JqZWN0Lmhhc2hDb2RlXSBpcyB1c2VkLgogIC8vLwogIC8vLyBJZiB1c2luZyBtZXRob2RzIGxpa2UgW29wZXJhdG9yIFtdXSwgW3JlbW92ZV0gYW5kIFtjb250YWluc0tleV0gdG9nZXRoZXIKICAvLy8gd2l0aCBhIGN1c3RvbSBlcXVhbGl0eSBhbmQgaGFzaGNvZGUsIGFuIGV4dHJhIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbgogIC8vLyBjYW4gYmUgc3VwcGxpZWQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIFtlcXVhbHNdIG9yCiAgLy8vIFtoYXNoQ29kZV0gd2l0aCBhbiBhcmd1bWVudCB0aGF0IG1heSBub3QgYmUgYSBbS10gaW5zdGFuY2UsIGFuZCBpZiB0aGUKICAvLy8gY2FsbCByZXR1cm5zIGZhbHNlLCB0aGUga2V5IGlzIGFzc3VtZWQgdG8gbm90IGJlIGluIHRoZSBzZXQuCiAgLy8vIFRoZSBbaXNWYWxpZEtleV0gZnVuY3Rpb24gZGVmYXVsdHMgdG8ganVzdCB0ZXN0aW5nIGlmIHRoZSBvYmplY3QgaXMgYQogIC8vLyBbS10gaW5zdGFuY2UuCiAgLy8vCiAgLy8vIEV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICBuZXcgSGFzaE1hcDxpbnQsaW50PihlcXVhbHM6IChpbnQgYSwgaW50IGIpID0+IChiIC0gYSkgJSA1ID09IDAsCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogKGludCBlKSA9PiBlICUgNSkKICAvLy8KICAvLy8gVGhpcyBleGFtcGxlIG1hcCBkb2VzIG5vdCBuZWVkIGFuIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbiB0byBiZSBwYXNzZWQuCiAgLy8vIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIGFjY2VwdHMgb25seSBgaW50YCB2YWx1ZXMsIHdoaWNoIGNhbiBzYWZlbHkgYmUKICAvLy8gcGFzc2VkIHRvIGJvdGggdGhlIGBlcXVhbHNgIGFuZCBgaGFzaENvZGVgIGZ1bmN0aW9ucy4KICAvLy8KICAvLy8gSWYgbmVpdGhlciBgZXF1YWxzYCwgYGhhc2hDb2RlYCwgbm9yIGBpc1ZhbGlkS2V5YCBpcyBwcm92aWRlZCwKICAvLy8gdGhlIGRlZmF1bHQgYGlzVmFsaWRLZXlgIGluc3RlYWQgYWNjZXB0cyBhbGwga2V5cy4KICAvLy8gVGhlIGRlZmF1bHQgZXF1YWxpdHkgYW5kIGhhc2hjb2RlIG9wZXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gd29yayBvbiBhbGwKICAvLy8gb2JqZWN0cy4KICAvLy8KICAvLy8gTGlrZXdpc2UsIGlmIGBlcXVhbHNgIGlzIFtpZGVudGljYWxdLCBgaGFzaENvZGVgIGlzIFtpZGVudGl0eUhhc2hDb2RlXQogIC8vLyBhbmQgYGlzVmFsaWRLZXlgIGlzIG9taXR0ZWQsIHRoZSByZXN1bHRpbmcgbWFwIGlzIGlkZW50aXR5IGJhc2VkLAogIC8vLyBhbmQgdGhlIGBpc1ZhbGlkS2V5YCBkZWZhdWx0cyB0byBhY2NlcHRpbmcgYWxsIGtleXMuCiAgLy8vIFN1Y2ggYSBtYXAgY2FuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgdXNpbmcgW0hhc2hNYXAuaWRlbnRpdHldLgogIC8vLwogIC8vLyBUaGUgdXNlZCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYCBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBjb25zaXN0ZW50LAogIC8vLyBzbyB0aGF0IGlmIGBlcXVhbHMoYSwgYilgIHRoZW4gYGhhc2hDb2RlKGEpID09IGhhc2hDb2RlKGIpYC4gVGhlIGhhc2gKICAvLy8gb2YgYW4gb2JqZWN0LCBvciB3aGF0IGl0IGNvbXBhcmVzIGVxdWFsIHRvLCBzaG91bGQgbm90IGNoYW5nZSB3aGlsZSB0aGUKICAvLy8gb2JqZWN0IGlzIGEga2V5IGluIHRoZSBtYXAuIElmIGl0IGRvZXMgY2hhbmdlLCB0aGUgcmVzdWx0IGlzCiAgLy8vIHVucHJlZGljdGFibGUuCiAgLy8vCiAgLy8vIElmIHlvdSBzdXBwbHkgb25lIG9mIFtlcXVhbHNdIGFuZCBbaGFzaENvZGVdLAogIC8vLyB5b3Ugc2hvdWxkIGdlbmVyYWxseSBhbHNvIHRvIHN1cHBseSB0aGUgb3RoZXIuCiAgZXh0ZXJuYWwgZmFjdG9yeSBIYXNoTWFwKAogICAgICB7Ym9vbCBlcXVhbHMoSyBrZXkxLCBLIGtleTIpLAogICAgICBpbnQgaGFzaENvZGUoSyBrZXkpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pOwoKICAvLy8gQ3JlYXRlcyBhbiB1bm9yZGVyZWQgaWRlbnRpdHktYmFzZWQgbWFwLgogIC8vLwogIC8vLyBFZmZlY3RpdmVseSBhIHNob3J0aGFuZCBmb3I6CiAgLy8vCiAgLy8vICAgICBuZXcgSGFzaE1hcDxLLCBWPihlcXVhbHM6IGlkZW50aWNhbCwKICAvLy8gICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlOiBpZGVudGl0eUhhc2hDb2RlKQogIGV4dGVybmFsIGZhY3RvcnkgSGFzaE1hcC5pZGVudGl0eSgpOwoKICAvLy8gQ3JlYXRlcyBhIFtIYXNoTWFwXSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YgW290aGVyXS4KICAvLy8KICAvLy8gVGhlIGtleXMgbXVzdCBhbGwgYmUgaW5zdGFuY2VzIG9mIFtLXSBhbmQgdGhlIHZhbHVlcyBvZiBbVl0uCiAgLy8vIFRoZSBbb3RoZXJdIG1hcCBpdHNlbGYgY2FuIGhhdmUgYW55IHR5cGUuCiAgZmFjdG9yeSBIYXNoTWFwLmZyb20oTWFwIG90aGVyKSB7CiAgICBNYXA8SywgVj4gcmVzdWx0ID0gSGFzaE1hcDxLLCBWPigpOwogICAgb3RoZXIuZm9yRWFjaCgoaywgdikgewogICAgICByZXN1bHRba10gPSB2OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbSGFzaE1hcF0gdGhhdCBjb250YWlucyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgZmFjdG9yeSBIYXNoTWFwLm9mKE1hcDxLLCBWPiBvdGhlcikgPT4gSGFzaE1hcDxLLCBWPigpLi5hZGRBbGwob3RoZXIpOwoKICAvLy8gQ3JlYXRlcyBhIFtIYXNoTWFwXSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wdXRlZCBmcm9tIHRoZQogIC8vLyBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBbaXRlcmFibGVdIHRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgYSBrZXkvdmFsdWUKICAvLy8gcGFpciwgYnkgYXBwbHlpbmcgW2tleV0gYW5kIFt2YWx1ZV0gcmVzcGVjdGl2ZWx5LgogIC8vLwogIC8vLyBUaGUga2V5cyBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIGRvIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhlIGxhc3QKICAvLy8gb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogIC8vLwogIC8vLyBJZiBubyB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdGhlCiAgLy8vIGlkZW50aXR5IGZ1bmN0aW9uLgogIGZhY3RvcnkgSGFzaE1hcC5mcm9tSXRlcmFibGUoSXRlcmFibGUgaXRlcmFibGUsCiAgICAgIHtLIGtleShlbGVtZW50KSwgViB2YWx1ZShlbGVtZW50KX0pIHsKICAgIE1hcDxLLCBWPiBtYXAgPSBIYXNoTWFwPEssIFY+KCk7CiAgICBNYXBCYXNlLl9maWxsTWFwV2l0aE1hcHBlZEl0ZXJhYmxlKG1hcCwgaXRlcmFibGUsIGtleSwgdmFsdWUpOwogICAgcmV0dXJuIG1hcDsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0hhc2hNYXBdIGFzc29jaWF0aW5nIHRoZSBnaXZlbiBba2V5c10gdG8gW3ZhbHVlc10uCiAgLy8vCiAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXRlcmF0ZXMgb3ZlciBba2V5c10gYW5kIFt2YWx1ZXNdIGFuZCBtYXBzIGVhY2ggZWxlbWVudAogIC8vLyBvZiBba2V5c10gdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBbdmFsdWVzXS4KICAvLy8KICAvLy8gSWYgW2tleXNdIGNvbnRhaW5zIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3Qgb2NjdXJyZW5jZQogIC8vLyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS4KICAvLy8KICAvLy8gSXQgaXMgYW4gZXJyb3IgaWYgdGhlIHR3byBbSXRlcmFibGVdcyBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KICBmYWN0b3J5IEhhc2hNYXAuZnJvbUl0ZXJhYmxlcyhJdGVyYWJsZTxLPiBrZXlzLCBJdGVyYWJsZTxWPiB2YWx1ZXMpIHsKICAgIE1hcDxLLCBWPiBtYXAgPSBIYXNoTWFwPEssIFY+KCk7CiAgICBNYXBCYXNlLl9maWxsTWFwV2l0aEl0ZXJhYmxlcyhtYXAsIGtleXMsIHZhbHVlcyk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbSGFzaE1hcF0gY29udGFpbmluZyB0aGUgZW50cmllcyBvZiBbZW50cmllc10uCiAgLy8vCiAgLy8vIFJldHVybnMgYSBuZXcgYEhhc2hNYXA8SywgVj5gIHdoZXJlIGFsbCBlbnRyaWVzIG9mIFtlbnRyaWVzXQogIC8vLyBoYXZlIGJlZW4gYWRkZWQgaW4gaXRlcmF0aW9uIG9yZGVyLgogIC8vLwogIC8vLyBJZiBtdWx0aXBsZSBbZW50cmllc10gaGF2ZSB0aGUgc2FtZSBrZXksCiAgLy8vIGxhdGVyIG9jY3VycmVuY2VzIG92ZXJ3cml0ZSB0aGUgZWFybGllciBvbmVzLgogIEBTaW5jZSgiMi4xIikKICBmYWN0b3J5IEhhc2hNYXAuZnJvbUVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpID0+CiAgICAgIEhhc2hNYXA8SywgVj4oKS4uYWRkRW50cmllcyhlbnRyaWVzKTsKfQqAngBOTjwBGQFEJQFGJwElMAEnLQEwBD1NRkpEBCQERB0/RDUsNDMGTE4tBlBKDwZNTysGT0pKTUNMFAYPBks7BkxKPAZFOU4PBk1IO0MGS0xOQxUGNDUcJBsnAS8GIwYvOCcBSAZDMCQoGxUIEwQBSEkBShIGTzgGSUQGShkyLCVDEAQBRAZPOgZNJQZISCU2EAQBPwZDKgYvNBBDLAIBHWRhcnQ6Y29sbGVjdGlvbi9oYXNoX21hcC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb2xsZWN0aW9uL3NwbGF5X3RyZWUuZGFydMAAZ2QvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247Cgp0eXBlZGVmIF9QcmVkaWNhdGU8VD4gPSBib29sIEZ1bmN0aW9uKFQgdmFsdWUpOwoKLy8vIEEgbm9kZSBpbiBhIHNwbGF5IHRyZWUuIEl0IGhvbGRzIHRoZSBzb3J0aW5nIGtleSBhbmQgdGhlIGxlZnQKLy8vIGFuZCByaWdodCBjaGlsZHJlbiBpbiB0aGUgdHJlZS4KY2xhc3MgX1NwbGF5VHJlZU5vZGU8Sz4gewogIGZpbmFsIEsga2V5OwogIF9TcGxheVRyZWVOb2RlPEs+IGxlZnQ7CiAgX1NwbGF5VHJlZU5vZGU8Sz4gcmlnaHQ7CgogIF9TcGxheVRyZWVOb2RlKHRoaXMua2V5KTsKfQoKLy8vIEEgbm9kZSBpbiBhIHNwbGF5IHRyZWUgYmFzZWQgbWFwLgovLy8KLy8vIEEgW19TcGxheVRyZWVOb2RlXSB0aGF0IGFsc28gY29udGFpbnMgYSB2YWx1ZQpjbGFzcyBfU3BsYXlUcmVlTWFwTm9kZTxLLCBWPiBleHRlbmRzIF9TcGxheVRyZWVOb2RlPEs+IHsKICBWIHZhbHVlOwogIF9TcGxheVRyZWVNYXBOb2RlKEsga2V5LCB0aGlzLnZhbHVlKSA6IHN1cGVyKGtleSk7Cn0KCi8vLyBBIHNwbGF5IHRyZWUgaXMgYSBzZWxmLWJhbGFuY2luZyBiaW5hcnkgc2VhcmNoIHRyZWUuCi8vLwovLy8gSXQgaGFzIHRoZSBhZGRpdGlvbmFsIHByb3BlcnR5IHRoYXQgcmVjZW50bHkgYWNjZXNzZWQgZWxlbWVudHMKLy8vIGFyZSBxdWljayB0byBhY2Nlc3MgYWdhaW4uCi8vLyBJdCBwZXJmb3JtcyBiYXNpYyBvcGVyYXRpb25zIHN1Y2ggYXMgaW5zZXJ0aW9uLCBsb29rLXVwIGFuZAovLy8gcmVtb3ZhbCwgaW4gTyhsb2cobikpIGFtb3J0aXplZCB0aW1lLgphYnN0cmFjdCBjbGFzcyBfU3BsYXlUcmVlPEssIE5vZGUgZXh0ZW5kcyBfU3BsYXlUcmVlTm9kZTxLPj4gewogIC8vIFRoZSByb290IG5vZGUgb2YgdGhlIHNwbGF5IHRyZWUuIEl0IHdpbGwgY29udGFpbiBlaXRoZXIgdGhlIGxhc3QKICAvLyBlbGVtZW50IGluc2VydGVkIG9yIHRoZSBsYXN0IGVsZW1lbnQgbG9va2VkIHVwLgogIE5vZGUgZ2V0IF9yb290OwogIHNldCBfcm9vdChOb2RlIG5ld1ZhbHVlKTsKCiAgLy8gVGhlIGR1bW15IG5vZGUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgYSBzcGxheSBvbiB0aGUgdHJlZS4gUmV1c2luZyBpdAogIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGEgbm9kZSBlYWNoIHRpbWUgYSBzcGxheSBpcyBwZXJmb3JtZWQuCiAgTm9kZSBnZXQgX2R1bW15OwoKICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNwbGF5IHRyZWUuCiAgaW50IF9jb3VudCA9IDA7CgogIC8vLyBDb3VudGVyIGluY3JlbWVudGVkIHdoZW5ldmVyIHRoZSBrZXlzIGluIHRoZSBtYXAgY2hhbmdlcy4KICAvLy8KICAvLy8gVXNlZCB0byBkZXRlY3QgY29uY3VycmVudCBtb2RpZmljYXRpb25zLgogIGludCBfbW9kaWZpY2F0aW9uQ291bnQgPSAwOwoKICAvLy8gQ291bnRlciBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUgdHJlZSBzdHJ1Y3R1cmUgY2hhbmdlcy4KICAvLy8KICAvLy8gVXNlZCB0byBkZXRlY3QgdGhhdCBhbiBpbi1wbGFjZSB0cmF2ZXJzYWwgY2Fubm90IHVzZQogIC8vLyBjYWNoZWQgaW5mb3JtYXRpb24gdGhhdCByZWxpZXMgb24gdGhlIHRyZWUgc3RydWN0dXJlLgogIGludCBfc3BsYXlDb3VudCA9IDA7CgogIC8vLyBUaGUgY29tcGFyYXRvciB0aGF0IGlzIHVzZWQgZm9yIHRoaXMgc3BsYXkgdHJlZS4KICBDb21wYXJhdG9yPEs+IGdldCBfY29tcGFyYXRvcjsKCiAgLy8vIFRoZSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHRoYXQgYSBnaXZlbiBvYmplY3QgaXMgYSB2YWxpZCBrZXkuCiAgX1ByZWRpY2F0ZSBnZXQgX3ZhbGlkS2V5OwoKICAvLy8gQ29tcGFyaXNvbiB1c2VkIHRvIGNvbXBhcmUga2V5cy4KICBpbnQgX2NvbXBhcmUoSyBrZXkxLCBLIGtleTIpOwoKICAvLy8gUGVyZm9ybSB0aGUgc3BsYXkgb3BlcmF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5LiBNb3ZlcyB0aGUgbm9kZSB3aXRoCiAgLy8vIHRoZSBnaXZlbiBrZXkgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZS4gIElmIG5vIG5vZGUgaGFzIHRoZSBnaXZlbgogIC8vLyBrZXksIHRoZSBsYXN0IG5vZGUgb24gdGhlIHNlYXJjaCBwYXRoIGlzIG1vdmVkIHRvIHRoZSB0b3Agb2YgdGhlCiAgLy8vIHRyZWUuIFRoaXMgaXMgdGhlIHNpbXBsaWZpZWQgdG9wLWRvd24gc3BsYXlpbmcgYWxnb3JpdGhtIGZyb206CiAgLy8vICJTZWxmLWFkanVzdGluZyBCaW5hcnkgU2VhcmNoIFRyZWVzIiBieSBTbGVhdG9yIGFuZCBUYXJqYW4uCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIG5ldyByb290IG9mIHRoZSB0cmVlIHRvIFtrZXldLgogIC8vLyBSZXR1cm5zIC0xIGlmIHRoZSB0YWJsZSBpcyBlbXB0eS4KICBpbnQgX3NwbGF5KEsga2V5KSB7CiAgICBpZiAoX3Jvb3QgPT0gbnVsbCkgcmV0dXJuIC0xOwoKICAgIC8vIFRoZSByaWdodCBjaGlsZCBvZiB0aGUgZHVtbXkgbm9kZSB3aWxsIGhvbGQKICAgIC8vIHRoZSBMIHRyZWUgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBsZWZ0IGNoaWxkIG9mIHRoZSBkdW1teSBub2RlCiAgICAvLyB3aWxsIGhvbGQgdGhlIFIgdHJlZSBvZiB0aGUgYWxnb3JpdGhtLiAgVXNpbmcgYSBkdW1teSBub2RlLCBsZWZ0CiAgICAvLyBhbmQgcmlnaHQgd2lsbCBhbHdheXMgYmUgbm9kZXMgYW5kIHdlIGF2b2lkIHNwZWNpYWwgY2FzZXMuCiAgICBOb2RlIGxlZnQgPSBfZHVtbXk7CiAgICBOb2RlIHJpZ2h0ID0gX2R1bW15OwogICAgTm9kZSBjdXJyZW50ID0gX3Jvb3Q7CiAgICBpbnQgY29tcDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbXAgPSBfY29tcGFyZShjdXJyZW50LmtleSwga2V5KTsKICAgICAgaWYgKGNvbXAgPiAwKSB7CiAgICAgICAgaWYgKGN1cnJlbnQubGVmdCA9PSBudWxsKSBicmVhazsKICAgICAgICBjb21wID0gX2NvbXBhcmUoY3VycmVudC5sZWZ0LmtleSwga2V5KTsKICAgICAgICBpZiAoY29tcCA+IDApIHsKICAgICAgICAgIC8vIFJvdGF0ZSByaWdodC4KICAgICAgICAgIF9TcGxheVRyZWVOb2RlPEs+IHRtcCA9IGN1cnJlbnQubGVmdDsKICAgICAgICAgIGN1cnJlbnQubGVmdCA9IHRtcC5yaWdodDsKICAgICAgICAgIHRtcC5yaWdodCA9IGN1cnJlbnQ7CiAgICAgICAgICBjdXJyZW50ID0gdG1wOwogICAgICAgICAgaWYgKGN1cnJlbnQubGVmdCA9PSBudWxsKSBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gTGluayByaWdodC4KICAgICAgICByaWdodC5sZWZ0ID0gY3VycmVudDsKICAgICAgICByaWdodCA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubGVmdDsKICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkgewogICAgICAgIGlmIChjdXJyZW50LnJpZ2h0ID09IG51bGwpIGJyZWFrOwogICAgICAgIGNvbXAgPSBfY29tcGFyZShjdXJyZW50LnJpZ2h0LmtleSwga2V5KTsKICAgICAgICBpZiAoY29tcCA8IDApIHsKICAgICAgICAgIC8vIFJvdGF0ZSBsZWZ0LgogICAgICAgICAgTm9kZSB0bXAgPSBjdXJyZW50LnJpZ2h0OwogICAgICAgICAgY3VycmVudC5yaWdodCA9IHRtcC5sZWZ0OwogICAgICAgICAgdG1wLmxlZnQgPSBjdXJyZW50OwogICAgICAgICAgY3VycmVudCA9IHRtcDsKICAgICAgICAgIGlmIChjdXJyZW50LnJpZ2h0ID09IG51bGwpIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBMaW5rIGxlZnQuCiAgICAgICAgbGVmdC5yaWdodCA9IGN1cnJlbnQ7CiAgICAgICAgbGVmdCA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucmlnaHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIC8vIEFzc2VtYmxlLgogICAgbGVmdC5yaWdodCA9IGN1cnJlbnQubGVmdDsKICAgIHJpZ2h0LmxlZnQgPSBjdXJyZW50LnJpZ2h0OwogICAgY3VycmVudC5sZWZ0ID0gX2R1bW15LnJpZ2h0OwogICAgY3VycmVudC5yaWdodCA9IF9kdW1teS5sZWZ0OwogICAgX3Jvb3QgPSBjdXJyZW50OwoKICAgIF9kdW1teS5yaWdodCA9IG51bGw7CiAgICBfZHVtbXkubGVmdCA9IG51bGw7CiAgICBfc3BsYXlDb3VudCsrOwogICAgcmV0dXJuIGNvbXA7CiAgfQoKICAvLyBFbXVsYXRlcyBzcGxheWluZyB3aXRoIGEga2V5IHRoYXQgaXMgc21hbGxlciB0aGFuIGFueSBpbiB0aGUgc3VidHJlZQogIC8vIGFuY2hvcmVkIGF0IFtub2RlXS4KICAvLyBhbmQgdGhhdCBub2RlIGlzIHJldHVybmVkLiBJdCBzaG91bGQgcmVwbGFjZSB0aGUgcmVmZXJlbmNlIHRvIFtub2RlXQogIC8vIGluIGFueSBwYXJlbnQgdHJlZSBvciByb290IHBvaW50ZXIuCiAgZXh0ZXJuYWwgTm9kZSBfc3BsYXlNaW4oTm9kZSBub2RlKTsKCiAgLy8gRW11bGF0ZXMgc3BsYXlpbmcgd2l0aCBhIGtleSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBhbnkgaW4gdGhlIHN1YnRyZWUKICAvLyBhbmNob3JlZCBhdCBbbm9kZV0uCiAgLy8gQWZ0ZXIgdGhpcywgdGhlIGxhcmdlc3QgZWxlbWVudCBpbiB0aGUgdHJlZSBpcyB0aGUgcm9vdCBvZiB0aGUgc3VidHJlZSwKICAvLyBhbmQgdGhhdCBub2RlIGlzIHJldHVybmVkLiBJdCBzaG91bGQgcmVwbGFjZSB0aGUgcmVmZXJlbmNlIHRvIFtub2RlXQogIC8vIGluIGFueSBwYXJlbnQgdHJlZSBvciByb290IHBvaW50ZXIuCiAgZXh0ZXJuYWwgTm9kZSBfc3BsYXlNYXgoTm9kZSBub2RlKTsKCiAgTm9kZSBfcmVtb3ZlKEsga2V5KSB7CiAgICBpZiAoX3Jvb3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpbnQgY29tcCA9IF9zcGxheShrZXkpOwogICAgaWYgKGNvbXAgIT0gMCkgcmV0dXJuIG51bGw7CiAgICBOb2RlIHJlc3VsdCA9IF9yb290OwogICAgX2NvdW50LS07CiAgICAvLyBhc3NlcnQoX2NvdW50ID49IDApOwogICAgaWYgKF9yb290LmxlZnQgPT0gbnVsbCkgewogICAgICBfcm9vdCA9IF9yb290LnJpZ2h0OwogICAgfSBlbHNlIHsKICAgICAgTm9kZSByaWdodCA9IF9yb290LnJpZ2h0OwogICAgICAvLyBTcGxheSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbmV3IHJvb3QgaGFzIGFuIGVtcHR5IHJpZ2h0IGNoaWxkLgogICAgICBfcm9vdCA9IF9zcGxheU1heChfcm9vdC5sZWZ0KTsKICAgICAgLy8gSW5zZXJ0IHRoZSBvcmlnaW5hbCByaWdodCBjaGlsZCBhcyB0aGUgcmlnaHQgY2hpbGQgb2YgdGhlIG5ldwogICAgICAvLyByb290LgogICAgICBfcm9vdC5yaWdodCA9IHJpZ2h0OwogICAgfQogICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIEFkZHMgYSBuZXcgcm9vdCBub2RlIHdpdGggdGhlIGdpdmVuIFtrZXldIG9yIFt2YWx1ZV0uCiAgLy8vCiAgLy8vIFRoZSBbY29tcF0gdmFsdWUgaXMgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIGV4aXN0aW5nIHJvb3QncyBrZXkKICAvLy8gd2l0aCBrZXkuCiAgdm9pZCBfYWRkTmV3Um9vdChOb2RlIG5vZGUsIGludCBjb21wKSB7CiAgICBfY291bnQrKzsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgaWYgKF9yb290ID09IG51bGwpIHsKICAgICAgX3Jvb3QgPSBub2RlOwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBhc3NlcnQoX2NvdW50ID49IDApOwogICAgaWYgKGNvbXAgPCAwKSB7CiAgICAgIG5vZGUubGVmdCA9IF9yb290OwogICAgICBub2RlLnJpZ2h0ID0gX3Jvb3QucmlnaHQ7CiAgICAgIF9yb290LnJpZ2h0ID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUucmlnaHQgPSBfcm9vdDsKICAgICAgbm9kZS5sZWZ0ID0gX3Jvb3QubGVmdDsKICAgICAgX3Jvb3QubGVmdCA9IG51bGw7CiAgICB9CiAgICBfcm9vdCA9IG5vZGU7CiAgfQoKICBOb2RlIGdldCBfZmlyc3QgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgX3Jvb3QgPSBfc3BsYXlNaW4oX3Jvb3QpOwogICAgcmV0dXJuIF9yb290OwogIH0KCiAgTm9kZSBnZXQgX2xhc3QgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgX3Jvb3QgPSBfc3BsYXlNYXgoX3Jvb3QpOwogICAgcmV0dXJuIF9yb290OwogIH0KCiAgdm9pZCBfY2xlYXIoKSB7CiAgICBfcm9vdCA9IG51bGw7CiAgICBfY291bnQgPSAwOwogICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CiAgfQp9CgpjbGFzcyBfVHlwZVRlc3Q8VD4gewogIGJvb2wgdGVzdCh2KSA9PiB2IGlzIFQ7Cn0KCmludCBfZHluYW1pY0NvbXBhcmUoZHluYW1pYyBhLCBkeW5hbWljIGIpID0+IENvbXBhcmFibGUuY29tcGFyZShhLCBiKTsKCkNvbXBhcmF0b3I8Sz4gX2RlZmF1bHRDb21wYXJlPEs+KCkgewogIC8vIElmIEsgPDogQ29tcGFyYWJsZSwgdGhlbiB3ZSBjYW4ganVzdCB1c2UgQ29tcGFyYWJsZS5jb21wYXJlCiAgLy8gd2l0aCBubyBjYXN0cy4KICBPYmplY3QgY29tcGFyZSA9IENvbXBhcmFibGUuY29tcGFyZTsKICBpZiAoY29tcGFyZSBpcyBDb21wYXJhdG9yPEs+KSB7CiAgICByZXR1cm4gY29tcGFyZTsKICB9CiAgLy8gT3RoZXJ3aXNlIHdyYXAgYW5kIGNhc3QgdGhlIGFyZ3VtZW50cyBvbiBlYWNoIGNhbGwuCiAgcmV0dXJuIF9keW5hbWljQ29tcGFyZTsKfQoKLy8vIEEgW01hcF0gb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBvcmRlcmVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuCi8vLwovLy8gVGhlIG1hcCBpcyBiYXNlZCBvbiBhIHNlbGYtYmFsYW5jaW5nIGJpbmFyeSB0cmVlLiBJdCBhbGxvd3MgbW9zdCBvcGVyYXRpb25zCi8vLyBpbiBhbW9ydGl6ZWQgbG9nYXJpdGhtaWMgdGltZS4KLy8vCi8vLyBLZXlzIG9mIHRoZSBtYXAgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZSBgY29tcGFyZWAgZnVuY3Rpb24gcGFzc2VkIGluCi8vLyB0aGUgY29uc3RydWN0b3IsIGJvdGggZm9yIG9yZGVyaW5nIGFuZCBmb3IgZXF1YWxpdHkuCi8vLyBJZiB0aGUgbWFwIGNvbnRhaW5zIG9ubHkgdGhlIGtleSBgYWAsIHRoZW4gYG1hcC5jb250YWluc0tleShiKWAKLy8vIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiBhbmQgb25seSBpZiBgY29tcGFyZShhLCBiKSA9PSAwYCwKLy8vIGFuZCB0aGUgdmFsdWUgb2YgYGEgPT0gYmAgaXMgbm90IGV2ZW4gY2hlY2tlZC4KLy8vIElmIHRoZSBjb21wYXJlIGZ1bmN0aW9uIGlzIG9taXR0ZWQsIHRoZSBvYmplY3RzIGFyZSBhc3N1bWVkIHRvIGJlCi8vLyBbQ29tcGFyYWJsZV0sIGFuZCBhcmUgY29tcGFyZWQgdXNpbmcgdGhlaXIgW0NvbXBhcmFibGUuY29tcGFyZVRvXSBtZXRob2QuCi8vLyBOb24tY29tcGFyYWJsZSBvYmplY3RzIChpbmNsdWRpbmcgYG51bGxgKSB3aWxsIG5vdCB3b3JrIGFzIGtleXMKLy8vIGluIHRoYXQgY2FzZS4KLy8vCi8vLyBUbyBhbGxvdyBjYWxsaW5nIFtvcGVyYXRvciBbXV0sIFtyZW1vdmVdIG9yIFtjb250YWluc0tleV0gd2l0aCBvYmplY3RzCi8vLyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgY29tcGFyZWAgZnVuY3Rpb24sIGFuIGV4dHJhIGBpc1ZhbGlkS2V5YAovLy8gcHJlZGljYXRlIGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZC4gVGhpcyBmdW5jdGlvbiBpcyB0ZXN0ZWQgYmVmb3JlCi8vLyB1c2luZyB0aGUgYGNvbXBhcmVgIGZ1bmN0aW9uIG9uIGFuIGFyZ3VtZW50IHZhbHVlIHRoYXQgbWF5IG5vdCBiZSBhIFtLXQovLy8gdmFsdWUuIElmIG9taXR0ZWQsIHRoZSBgaXNWYWxpZEtleWAgZnVuY3Rpb24gZGVmYXVsdHMgdG8gdGVzdGluZyBpZiB0aGUKLy8vIHZhbHVlIGlzIGEgW0tdLgpjbGFzcyBTcGxheVRyZWVNYXA8SywgVj4gZXh0ZW5kcyBfU3BsYXlUcmVlPEssIF9TcGxheVRyZWVNYXBOb2RlPEssIFY+PgogICAgd2l0aCBNYXBNaXhpbjxLLCBWPiB7CiAgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gX3Jvb3Q7CiAgZmluYWwgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gX2R1bW15ID0gX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4obnVsbCwgbnVsbCk7CgogIENvbXBhcmF0b3I8Sz4gX2NvbXBhcmF0b3I7CiAgX1ByZWRpY2F0ZSBfdmFsaWRLZXk7CgogIFNwbGF5VHJlZU1hcChbaW50IGNvbXBhcmUoSyBrZXkxLCBLIGtleTIpLCBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KV0pCiAgICAgIDogX2NvbXBhcmF0b3IgPSBjb21wYXJlID8/IF9kZWZhdWx0Q29tcGFyZTxLPigpLAogICAgICAgIF92YWxpZEtleSA9IGlzVmFsaWRLZXkgPz8gKCh2KSA9PiB2IGlzIEspOwoKICAvLy8gQ3JlYXRlcyBhIFtTcGxheVRyZWVNYXBdIHRoYXQgY29udGFpbnMgYWxsIGtleS92YWx1ZSBwYWlycyBvZiBbb3RoZXJdLgogIC8vLwogIC8vLyBUaGUga2V5cyBtdXN0IGFsbCBiZSBpbnN0YW5jZXMgb2YgW0tdIGFuZCB0aGUgdmFsdWVzIG9mIFtWXS4KICAvLy8gVGhlIFtvdGhlcl0gbWFwIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZS4KICBmYWN0b3J5IFNwbGF5VHJlZU1hcC5mcm9tKE1hcCBvdGhlciwKICAgICAgW2ludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKSB7CiAgICBTcGxheVRyZWVNYXA8SywgVj4gcmVzdWx0ID0gU3BsYXlUcmVlTWFwPEssIFY+KGNvbXBhcmUsIGlzVmFsaWRLZXkpOwogICAgb3RoZXIuZm9yRWFjaCgoaywgdikgewogICAgICByZXN1bHRba10gPSB2OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlTWFwXSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YgW290aGVyXS4KICBmYWN0b3J5IFNwbGF5VHJlZU1hcC5vZihNYXA8SywgVj4gb3RoZXIsCiAgICAgICAgICBbaW50IGNvbXBhcmUoSyBrZXkxLCBLIGtleTIpLCBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KV0pID0+CiAgICAgIFNwbGF5VHJlZU1hcDxLLCBWPihjb21wYXJlLCBpc1ZhbGlkS2V5KS4uYWRkQWxsKG90aGVyKTsKCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlTWFwXSB3aGVyZSB0aGUga2V5cyBhbmQgdmFsdWVzIGFyZSBjb21wdXRlZCBmcm9tIHRoZQogIC8vLyBbaXRlcmFibGVdLgogIC8vLwogIC8vLyBGb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBbaXRlcmFibGVdIHRoaXMgY29uc3RydWN0b3IgY29tcHV0ZXMgYSBrZXkvdmFsdWUKICAvLy8gcGFpciwgYnkgYXBwbHlpbmcgW2tleV0gYW5kIFt2YWx1ZV0gcmVzcGVjdGl2ZWx5LgogIC8vLwogIC8vLyBUaGUga2V5cyBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIGRvIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS4gVGhlIGxhc3QKICAvLy8gb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogIC8vLwogIC8vLyBJZiBubyBmdW5jdGlvbnMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdG8KICAvLy8gdXNlIHRoZSBpdGVyYWJsZSB2YWx1ZSBpdHNlbGYuCiAgZmFjdG9yeSBTcGxheVRyZWVNYXAuZnJvbUl0ZXJhYmxlKEl0ZXJhYmxlIGl0ZXJhYmxlLAogICAgICB7SyBrZXkoZWxlbWVudCksCiAgICAgIFYgdmFsdWUoZWxlbWVudCksCiAgICAgIGludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KSB7CiAgICBTcGxheVRyZWVNYXA8SywgVj4gbWFwID0gU3BsYXlUcmVlTWFwPEssIFY+KGNvbXBhcmUsIGlzVmFsaWRLZXkpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhNYXBwZWRJdGVyYWJsZShtYXAsIGl0ZXJhYmxlLCBrZXksIHZhbHVlKTsKICAgIHJldHVybiBtYXA7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtTcGxheVRyZWVNYXBdIGFzc29jaWF0aW5nIHRoZSBnaXZlbiBba2V5c10gdG8gW3ZhbHVlc10uCiAgLy8vCiAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXRlcmF0ZXMgb3ZlciBba2V5c10gYW5kIFt2YWx1ZXNdIGFuZCBtYXBzIGVhY2ggZWxlbWVudAogIC8vLyBvZiBba2V5c10gdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBbdmFsdWVzXS4KICAvLy8KICAvLy8gSWYgW2tleXNdIGNvbnRhaW5zIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3Qgb2NjdXJyZW5jZQogIC8vLyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS4KICAvLy8KICAvLy8gSXQgaXMgYW4gZXJyb3IgaWYgdGhlIHR3byBbSXRlcmFibGVdcyBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KICBmYWN0b3J5IFNwbGF5VHJlZU1hcC5mcm9tSXRlcmFibGVzKEl0ZXJhYmxlPEs+IGtleXMsIEl0ZXJhYmxlPFY+IHZhbHVlcywKICAgICAgW2ludCBjb21wYXJlKEsga2V5MSwgSyBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKSB7CiAgICBTcGxheVRyZWVNYXA8SywgVj4gbWFwID0gU3BsYXlUcmVlTWFwPEssIFY+KGNvbXBhcmUsIGlzVmFsaWRLZXkpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhJdGVyYWJsZXMobWFwLCBrZXlzLCB2YWx1ZXMpOwogICAgcmV0dXJuIG1hcDsKICB9CgogIGludCBfY29tcGFyZShLIGtleTEsIEsga2V5MikgPT4gX2NvbXBhcmF0b3Ioa2V5MSwga2V5Mik7CgogIFNwbGF5VHJlZU1hcC5faW50ZXJuYWwoKTsKCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBpZiAoIV92YWxpZEtleShrZXkpKSByZXR1cm4gbnVsbDsKICAgIGlmIChfcm9vdCAhPSBudWxsKSB7CiAgICAgIGludCBjb21wID0gX3NwbGF5KGtleSk7CiAgICAgIGlmIChjb21wID09IDApIHsKICAgICAgICByZXR1cm4gX3Jvb3QudmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgaWYgKCFfdmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICBfU3BsYXlUcmVlTWFwTm9kZTxLLCBWPiBtYXBSb290ID0gX3JlbW92ZShrZXkpOwogICAgaWYgKG1hcFJvb3QgIT0gbnVsbCkgcmV0dXJuIG1hcFJvb3QudmFsdWU7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBpZiAoa2V5ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Ioa2V5KTsKICAgIC8vIFNwbGF5IG9uIHRoZSBrZXkgdG8gbW92ZSB0aGUgbGFzdCBub2RlIG9uIHRoZSBzZWFyY2ggcGF0aCBmb3IKICAgIC8vIHRoZSBrZXkgdG8gdGhlIHJvb3Qgb2YgdGhlIHRyZWUuCiAgICBpbnQgY29tcCA9IF9zcGxheShrZXkpOwogICAgaWYgKGNvbXAgPT0gMCkgewogICAgICBfcm9vdC52YWx1ZSA9IHZhbHVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBfYWRkTmV3Um9vdChfU3BsYXlUcmVlTWFwTm9kZShrZXksIHZhbHVlKSwgY29tcCk7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGlmIChrZXkgPT0gbnVsbCkgdGhyb3cgQXJndW1lbnRFcnJvcihrZXkpOwogICAgaW50IGNvbXAgPSBfc3BsYXkoa2V5KTsKICAgIGlmIChjb21wID09IDApIHsKICAgICAgcmV0dXJuIF9yb290LnZhbHVlOwogICAgfQogICAgaW50IG1vZGlmaWNhdGlvbkNvdW50ID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgaW50IHNwbGF5Q291bnQgPSBfc3BsYXlDb3VudDsKICAgIFYgdmFsdWUgPSBpZkFic2VudCgpOwogICAgaWYgKG1vZGlmaWNhdGlvbkNvdW50ICE9IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICB9CiAgICBpZiAoc3BsYXlDb3VudCAhPSBfc3BsYXlDb3VudCkgewogICAgICBjb21wID0gX3NwbGF5KGtleSk7CiAgICAgIC8vIEtleSBpcyBzdGlsbCBub3QgdGhlcmUsIG90aGVyd2lzZSBfbW9kaWZpY2F0aW9uQ291bnQgd291bGQgYmUgY2hhbmdlZC4KICAgICAgYXNzZXJ0KGNvbXAgIT0gMCk7CiAgICB9CiAgICBfYWRkTmV3Um9vdChfU3BsYXlUcmVlTWFwTm9kZShrZXksIHZhbHVlKSwgY29tcCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIG90aGVyLmZvckVhY2goKEsga2V5LCBWIHZhbHVlKSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfSk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiAoX3Jvb3QgPT0gbnVsbCk7CiAgfQoKICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgSXRlcmF0b3I8X1NwbGF5VHJlZU5vZGU8Sz4+IG5vZGVzID0gX1NwbGF5VHJlZU5vZGVJdGVyYXRvcjxLPih0aGlzKTsKICAgIHdoaWxlIChub2Rlcy5tb3ZlTmV4dCgpKSB7CiAgICAgIF9TcGxheVRyZWVNYXBOb2RlPEssIFY+IG5vZGUgPSBub2Rlcy5jdXJyZW50OwogICAgICBmKG5vZGUua2V5LCBub2RlLnZhbHVlKTsKICAgIH0KICB9CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIHJldHVybiBfY291bnQ7CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgX2NsZWFyKCk7CiAgfQoKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKICAgIHJldHVybiBfdmFsaWRLZXkoa2V5KSAmJiBfc3BsYXkoa2V5KSA9PSAwOwogIH0KCiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgaW50IGluaXRpYWxTcGxheUNvdW50ID0gX3NwbGF5Q291bnQ7CiAgICBib29sIHZpc2l0KF9TcGxheVRyZWVNYXBOb2RlIG5vZGUpIHsKICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewogICAgICAgIGlmIChub2RlLnZhbHVlID09IHZhbHVlKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoaW5pdGlhbFNwbGF5Q291bnQgIT0gX3NwbGF5Q291bnQpIHsKICAgICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUucmlnaHQgIT0gbnVsbCAmJiB2aXNpdChub2RlLnJpZ2h0KSkgcmV0dXJuIHRydWU7CiAgICAgICAgbm9kZSA9IG5vZGUubGVmdDsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHZpc2l0KF9yb290KTsKICB9CgogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IF9TcGxheVRyZWVLZXlJdGVyYWJsZTxLPih0aGlzKTsKCiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PiBfU3BsYXlUcmVlVmFsdWVJdGVyYWJsZTxLLCBWPih0aGlzKTsKCiAgLy8vIEdldCB0aGUgZmlyc3Qga2V5IGluIHRoZSBtYXAuIFJldHVybnMgWzpudWxsOl0gaWYgdGhlIG1hcCBpcyBlbXB0eS4KICBLIGZpcnN0S2V5KCkgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9maXJzdC5rZXk7CiAgfQoKICAvLy8gR2V0IHRoZSBsYXN0IGtleSBpbiB0aGUgbWFwLiBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZSBtYXAgaXMgZW1wdHkuCiAgSyBsYXN0S2V5KCkgewogICAgaWYgKF9yb290ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9sYXN0LmtleTsKICB9CgogIC8vLyBHZXQgdGhlIGxhc3Qga2V5IGluIHRoZSBtYXAgdGhhdCBpcyBzdHJpY3RseSBzbWFsbGVyIHRoYW4gW2tleV0uIFJldHVybnMKICAvLy8gWzpudWxsOl0gaWYgbm8ga2V5IHdhcyBub3QgZm91bmQuCiAgSyBsYXN0S2V5QmVmb3JlKEsga2V5KSB7CiAgICBpZiAoa2V5ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Ioa2V5KTsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGludCBjb21wID0gX3NwbGF5KGtleSk7CiAgICBpZiAoY29tcCA8IDApIHJldHVybiBfcm9vdC5rZXk7CiAgICBfU3BsYXlUcmVlTm9kZTxLPiBub2RlID0gX3Jvb3QubGVmdDsKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsOwogICAgd2hpbGUgKG5vZGUucmlnaHQgIT0gbnVsbCkgewogICAgICBub2RlID0gbm9kZS5yaWdodDsKICAgIH0KICAgIHJldHVybiBub2RlLmtleTsKICB9CgogIC8vLyBHZXQgdGhlIGZpcnN0IGtleSBpbiB0aGUgbWFwIHRoYXQgaXMgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gW2tleV0uIFJldHVybnMKICAvLy8gWzpudWxsOl0gaWYgbm8ga2V5IHdhcyBub3QgZm91bmQuCiAgSyBmaXJzdEtleUFmdGVyKEsga2V5KSB7CiAgICBpZiAoa2V5ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Ioa2V5KTsKICAgIGlmIChfcm9vdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGludCBjb21wID0gX3NwbGF5KGtleSk7CiAgICBpZiAoY29tcCA+IDApIHJldHVybiBfcm9vdC5rZXk7CiAgICBfU3BsYXlUcmVlTm9kZTxLPiBub2RlID0gX3Jvb3QucmlnaHQ7CiAgICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHdoaWxlIChub2RlLmxlZnQgIT0gbnVsbCkgewogICAgICBub2RlID0gbm9kZS5sZWZ0OwogICAgfQogICAgcmV0dXJuIG5vZGUua2V5OwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIGZpbmFsIF9TcGxheVRyZWU8SywgX1NwbGF5VHJlZU5vZGU8Sz4+IF90cmVlOwoKICAvLy8gV29ya2xpc3Qgb2Ygbm9kZXMgdG8gdmlzaXQuCiAgLy8vCiAgLy8vIFRoZXNlIG5vZGVzIGhhdmUgYmVlbiBwYXNzZWQgb3ZlciBvbiB0aGUgd2F5IGRvd24gaW4gYQogIC8vLyBkZXB0aC1maXJzdCBsZWZ0LXRvLXJpZ2h0IHRyYXZlcnNhbC4gVmlzaXRpbmcgZWFjaCBub2RlLAogIC8vLyBhbmQgdGhlaXIgcmlnaHQgc3VidHJlZXMgd2lsbCB2aXNpdCB0aGUgcmVtYWluZGVyIG9mCiAgLy8vIHRoZSBub2RlcyBvZiBhIGZ1bGwgdHJhdmVyc2FsLgogIC8vLwogIC8vLyBPbmx5IHZhbGlkIGFzIGxvbmcgYXMgdGhlIG9yaWdpbmFsIHRyZWUgaXNuJ3QgcmVvcmRlcmVkLgogIGZpbmFsIExpc3Q8X1NwbGF5VHJlZU5vZGU8Sz4+IF93b3JrTGlzdCA9IDxfU3BsYXlUcmVlTm9kZTxLPj5bXTsKCiAgLy8vIE9yaWdpbmFsIG1vZGlmaWNhdGlvbiBjb3VudGVyIG9mIFtfdHJlZV0uCiAgLy8vCiAgLy8vIEluY3JlbWVudGVkIG9uIFtfdHJlZV0gd2hlbiBhIGtleSBpcyBhZGRlZCBvciByZW1vdmVkLgogIC8vLyBJZiBpdCBjaGFuZ2VzLCBpdGVyYXRpb24gaXMgYWJvcnRlZC4KICAvLy8KICAvLy8gTm90IGZpbmFsIGJlY2F1c2Ugc29tZSBpdGVyYXRvcnMgbWF5IG1vZGlmeSB0aGUgdHJlZSBrbm93aW5nbHksCiAgLy8vIGFuZCB0aGV5IHVwZGF0ZSB0aGUgbW9kaWZpY2F0aW9uIGNvdW50IGluIHRoYXQgY2FzZS4KICBpbnQgX21vZGlmaWNhdGlvbkNvdW50OwoKICAvLy8gQ291bnQgb2Ygc3BsYXkgb3BlcmF0aW9ucyBvbiBbX3RyZWVdIHdoZW4gW193b3JrTGlzdF0gd2FzIGJ1aWx0LgogIC8vLwogIC8vLyBJZiB0aGUgc3BsYXkgY291bnQgb24gW190cmVlXSBpbmNyZWFzZXMsIFtfd29ya0xpc3RdIGJlY29tZXMgaW52YWxpZC4KICBpbnQgX3NwbGF5Q291bnQ7CgogIC8vLyBDdXJyZW50IG5vZGUuCiAgX1NwbGF5VHJlZU5vZGU8Sz4gX2N1cnJlbnROb2RlOwoKICBfU3BsYXlUcmVlSXRlcmF0b3IoX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gdHJlZSkKICAgICAgOiBfdHJlZSA9IHRyZWUsCiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gdHJlZS5fbW9kaWZpY2F0aW9uQ291bnQsCiAgICAgICAgX3NwbGF5Q291bnQgPSB0cmVlLl9zcGxheUNvdW50IHsKICAgIF9maW5kTGVmdE1vc3REZXNjZW5kZW50KHRyZWUuX3Jvb3QpOwogIH0KCiAgX1NwbGF5VHJlZUl0ZXJhdG9yLnN0YXJ0QXQoX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gdHJlZSwgSyBzdGFydEtleSkKICAgICAgOiBfdHJlZSA9IHRyZWUsCiAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0gdHJlZS5fbW9kaWZpY2F0aW9uQ291bnQgewogICAgaWYgKHRyZWUuX3Jvb3QgPT0gbnVsbCkgcmV0dXJuOwogICAgaW50IGNvbXBhcmUgPSB0cmVlLl9zcGxheShzdGFydEtleSk7CiAgICBfc3BsYXlDb3VudCA9IHRyZWUuX3NwbGF5Q291bnQ7CiAgICBpZiAoY29tcGFyZSA8IDApIHsKICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgcm9vdCwgc3RhcnQgYXQgdGhlIG5leHQgZWxlbWVudCBhZnRlciB0aGUgcm9vdC4KICAgICAgX2ZpbmRMZWZ0TW9zdERlc2NlbmRlbnQodHJlZS5fcm9vdC5yaWdodCk7CiAgICB9IGVsc2UgewogICAgICBfd29ya0xpc3QuYWRkKHRyZWUuX3Jvb3QpOwogICAgfQogIH0KCiAgVCBnZXQgY3VycmVudCB7CiAgICBpZiAoX2N1cnJlbnROb2RlID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9nZXRWYWx1ZShfY3VycmVudE5vZGUpOwogIH0KCiAgdm9pZCBfZmluZExlZnRNb3N0RGVzY2VuZGVudChfU3BsYXlUcmVlTm9kZTxLPiBub2RlKSB7CiAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7CiAgICAgIF93b3JrTGlzdC5hZGQobm9kZSk7CiAgICAgIG5vZGUgPSBub2RlLmxlZnQ7CiAgICB9CiAgfQoKICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHRyZWUgc3RydWN0dXJlIG9mIHRoZSB0cmVlIGhhcyBjaGFuZ2VkLgogIC8vLwogIC8vLyBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSBzcGxheSBvcGVyYXRpb24uCiAgLy8vIElmIHRoZSBrZXktc2V0IGNoYW5nZXMsIGl0ZXJhdGlvbiBpcyBhYm9ydGVkIGJlZm9yZSBnZXR0aW5nCiAgLy8vIGhlcmUsIHNvIHdlIGtub3cgdGhhdCB0aGUga2V5cyBhcmUgdGhlIHNhbWUgYXMgYmVmb3JlLCBpdCdzCiAgLy8vIG9ubHkgdGhlIHRyZWUgdGhhdCBoYXMgYmVlbiByZW9yZGVyZWQuCiAgdm9pZCBfcmVidWlsZFdvcmtMaXN0KF9TcGxheVRyZWVOb2RlPEs+IGN1cnJlbnROb2RlKSB7CiAgICBhc3NlcnQoX3dvcmtMaXN0LmlzTm90RW1wdHkpOwogICAgX3dvcmtMaXN0LmNsZWFyKCk7CiAgICBpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkgewogICAgICBfZmluZExlZnRNb3N0RGVzY2VuZGVudChfdHJlZS5fcm9vdCk7CiAgICB9IGVsc2UgewogICAgICBfdHJlZS5fc3BsYXkoY3VycmVudE5vZGUua2V5KTsKICAgICAgX2ZpbmRMZWZ0TW9zdERlc2NlbmRlbnQoX3RyZWUuX3Jvb3QucmlnaHQpOwogICAgICBhc3NlcnQoX3dvcmtMaXN0LmlzTm90RW1wdHkpOwogICAgfQogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfbW9kaWZpY2F0aW9uQ291bnQgIT0gX3RyZWUuX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihfdHJlZSk7CiAgICB9CiAgICAvLyBQaWNrcyB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSB3b3JrbGlzdCBhcyBjdXJyZW50LgogICAgLy8gVXBkYXRlcyB0aGUgd29ya2xpc3Qgd2l0aCB0aGUgbGVmdC1tb3N0IHBhdGggb2YgdGhlIGN1cnJlbnQgbm9kZSdzCiAgICAvLyByaWdodC1oYW5kIGNoaWxkLgogICAgLy8gSWYgdGhlIHdvcmtsaXN0IGlzIG5vIGxvbmdlciB2YWxpZCAoYWZ0ZXIgYSBzcGxheSksIGl0IGlzIHJlYnVpbGQKICAgIC8vIGZyb20gc2NyYXRjaC4KICAgIGlmIChfd29ya0xpc3QuaXNFbXB0eSkgewogICAgICBfY3VycmVudE5vZGUgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoX3RyZWUuX3NwbGF5Q291bnQgIT0gX3NwbGF5Q291bnQgJiYgX2N1cnJlbnROb2RlICE9IG51bGwpIHsKICAgICAgX3JlYnVpbGRXb3JrTGlzdChfY3VycmVudE5vZGUpOwogICAgfQogICAgX2N1cnJlbnROb2RlID0gX3dvcmtMaXN0LnJlbW92ZUxhc3QoKTsKICAgIF9maW5kTGVmdE1vc3REZXNjZW5kZW50KF9jdXJyZW50Tm9kZS5yaWdodCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIFQgX2dldFZhbHVlKF9TcGxheVRyZWVOb2RlPEs+IG5vZGUpOwp9CgpjbGFzcyBfU3BsYXlUcmVlS2V5SXRlcmFibGU8Sz4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxLPiB7CiAgX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gX3RyZWU7CiAgX1NwbGF5VHJlZUtleUl0ZXJhYmxlKHRoaXMuX3RyZWUpOwogIGludCBnZXQgbGVuZ3RoID0+IF90cmVlLl9jb3VudDsKICBib29sIGdldCBpc0VtcHR5ID0+IF90cmVlLl9jb3VudCA9PSAwOwogIEl0ZXJhdG9yPEs+IGdldCBpdGVyYXRvciA9PiBfU3BsYXlUcmVlS2V5SXRlcmF0b3I8Sz4oX3RyZWUpOwoKICBTZXQ8Sz4gdG9TZXQoKSB7CiAgICBTcGxheVRyZWVTZXQ8Sz4gc2V0ID0gU3BsYXlUcmVlU2V0PEs+KF90cmVlLl9jb21wYXJhdG9yLCBfdHJlZS5fdmFsaWRLZXkpOwogICAgc2V0Ll9jb3VudCA9IF90cmVlLl9jb3VudDsKICAgIHNldC5fcm9vdCA9IHNldC5fY29weU5vZGUoX3RyZWUuX3Jvb3QpOwogICAgcmV0dXJuIHNldDsKICB9Cn0KCmNsYXNzIF9TcGxheVRyZWVWYWx1ZUl0ZXJhYmxlPEssIFY+IGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8Vj4gewogIFNwbGF5VHJlZU1hcDxLLCBWPiBfbWFwOwogIF9TcGxheVRyZWVWYWx1ZUl0ZXJhYmxlKHRoaXMuX21hcCk7CiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5fY291bnQ7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbWFwLl9jb3VudCA9PSAwOwogIEl0ZXJhdG9yPFY+IGdldCBpdGVyYXRvciA9PiBfU3BsYXlUcmVlVmFsdWVJdGVyYXRvcjxLLCBWPihfbWFwKTsKfQoKY2xhc3MgX1NwbGF5VHJlZUtleUl0ZXJhdG9yPEs+IGV4dGVuZHMgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIEs+IHsKICBfU3BsYXlUcmVlS2V5SXRlcmF0b3IoX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gbWFwKSA6IHN1cGVyKG1hcCk7CiAgSyBfZ2V0VmFsdWUoX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSkgPT4gbm9kZS5rZXk7Cn0KCmNsYXNzIF9TcGxheVRyZWVWYWx1ZUl0ZXJhdG9yPEssIFY+IGV4dGVuZHMgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIFY+IHsKICBfU3BsYXlUcmVlVmFsdWVJdGVyYXRvcihTcGxheVRyZWVNYXA8SywgVj4gbWFwKSA6IHN1cGVyKG1hcCk7CiAgViBfZ2V0VmFsdWUoX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSkgewogICAgX1NwbGF5VHJlZU1hcE5vZGU8SywgVj4gbWFwTm9kZSA9IG5vZGU7CiAgICByZXR1cm4gbWFwTm9kZS52YWx1ZTsKICB9Cn0KCmNsYXNzIF9TcGxheVRyZWVOb2RlSXRlcmF0b3I8Sz4KICAgIGV4dGVuZHMgX1NwbGF5VHJlZUl0ZXJhdG9yPEssIF9TcGxheVRyZWVOb2RlPEs+PiB7CiAgX1NwbGF5VHJlZU5vZGVJdGVyYXRvcihfU3BsYXlUcmVlPEssIF9TcGxheVRyZWVOb2RlPEs+PiB0cmVlKSA6IHN1cGVyKHRyZWUpOwogIF9TcGxheVRyZWVOb2RlSXRlcmF0b3Iuc3RhcnRBdCgKICAgICAgX1NwbGF5VHJlZTxLLCBfU3BsYXlUcmVlTm9kZTxLPj4gdHJlZSwgSyBzdGFydEtleSkKICAgICAgOiBzdXBlci5zdGFydEF0KHRyZWUsIHN0YXJ0S2V5KTsKICBfU3BsYXlUcmVlTm9kZTxLPiBfZ2V0VmFsdWUoX1NwbGF5VHJlZU5vZGU8Sz4gbm9kZSkgPT4gbm9kZTsKfQoKLy8vIEEgW1NldF0gb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSBvcmRlcmVkIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuCi8vLwovLy8gVGhlIHNldCBpcyBiYXNlZCBvbiBhIHNlbGYtYmFsYW5jaW5nIGJpbmFyeSB0cmVlLiBJdCBhbGxvd3MgbW9zdCBvcGVyYXRpb25zCi8vLyBpbiBhbW9ydGl6ZWQgbG9nYXJpdGhtaWMgdGltZS4KLy8vCi8vLyBFbGVtZW50cyBvZiB0aGUgc2V0IGFyZSBjb21wYXJlZCB1c2luZyB0aGUgYGNvbXBhcmVgIGZ1bmN0aW9uIHBhc3NlZCBpbgovLy8gdGhlIGNvbnN0cnVjdG9yLCBib3RoIGZvciBvcmRlcmluZyBhbmQgZm9yIGVxdWFsaXR5LgovLy8gSWYgdGhlIHNldCBjb250YWlucyBvbmx5IGFuIG9iamVjdCBgYWAsIHRoZW4gYHNldC5jb250YWlucyhiKWAKLy8vIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiBhbmQgb25seSBpZiBgY29tcGFyZShhLCBiKSA9PSAwYCwKLy8vIGFuZCB0aGUgdmFsdWUgb2YgYGEgPT0gYmAgaXMgbm90IGV2ZW4gY2hlY2tlZC4KLy8vIElmIHRoZSBjb21wYXJlIGZ1bmN0aW9uIGlzIG9taXR0ZWQsIHRoZSBvYmplY3RzIGFyZSBhc3N1bWVkIHRvIGJlCi8vLyBbQ29tcGFyYWJsZV0sIGFuZCBhcmUgY29tcGFyZWQgdXNpbmcgdGhlaXIgW0NvbXBhcmFibGUuY29tcGFyZVRvXSBtZXRob2QuCi8vLyBOb24tY29tcGFyYWJsZSBvYmplY3RzIChpbmNsdWRpbmcgYG51bGxgKSB3aWxsIG5vdCB3b3JrIGFzIGFuIGVsZW1lbnQKLy8vIGluIHRoYXQgY2FzZS4KY2xhc3MgU3BsYXlUcmVlU2V0PEU+IGV4dGVuZHMgX1NwbGF5VHJlZTxFLCBfU3BsYXlUcmVlTm9kZTxFPj4KICAgIHdpdGggSXRlcmFibGVNaXhpbjxFPiwgU2V0TWl4aW48RT4gewogIF9TcGxheVRyZWVOb2RlPEU+IF9yb290OwogIGZpbmFsIF9TcGxheVRyZWVOb2RlPEU+IF9kdW1teSA9IF9TcGxheVRyZWVOb2RlPEU+KG51bGwpOwoKICBDb21wYXJhdG9yPEU+IF9jb21wYXJhdG9yOwogIF9QcmVkaWNhdGUgX3ZhbGlkS2V5OwoKICAvLy8gQ3JlYXRlIGEgbmV3IFtTcGxheVRyZWVTZXRdIHdpdGggdGhlIGdpdmVuIGNvbXBhcmUgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIElmIHRoZSBbY29tcGFyZV0gZnVuY3Rpb24gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW0NvbXBhcmFibGUuY29tcGFyZV0sCiAgLy8vIGFuZCB0aGUgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlLgogIC8vLwogIC8vLyBBIHByb3ZpZGVkIGBjb21wYXJlYCBmdW5jdGlvbiBtYXkgbm90IHdvcmsgb24gYWxsIG9iamVjdHMuIEl0IG1heSBub3QgZXZlbgogIC8vLyB3b3JrIG9uIGFsbCBgRWAgaW5zdGFuY2VzLgogIC8vLwogIC8vLyBGb3Igb3BlcmF0aW9ucyB0aGF0IGFkZCBlbGVtZW50cyB0byB0aGUgc2V0LCB0aGUgdXNlciBpcyBzdXBwb3NlZCB0byBub3QKICAvLy8gcGFzcyBpbiBvYmplY3RzIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGNvbXBhcmUgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFRoZSBtZXRob2RzIFtjb250YWluc10sIFtyZW1vdmVdLCBbbG9va3VwXSwgW3JlbW92ZUFsbF0gb3IgW3JldGFpbkFsbF0KICAvLy8gYXJlIHR5cGVkIHRvIGFjY2VwdCBhbnkgb2JqZWN0KHMpLCBhbmQgdGhlIFtpc1ZhbGlkS2V5XSB0ZXN0IGNhbiB1c2VkIHRvCiAgLy8vIGZpbHRlciB0aG9zZSBvYmplY3RzIGJlZm9yZSBoYW5kaW5nIHRoZW0gdG8gdGhlIGBjb21wYXJlYCBmdW5jdGlvbi4KICAvLy8KICAvLy8gSWYgW2lzVmFsaWRLZXldIGlzIHByb3ZpZGVkLCBvbmx5IHZhbHVlcyBzYXRpc2Z5aW5nIGBpc1ZhbGlkS2V5KG90aGVyKWAKICAvLy8gYXJlIGNvbXBhcmVkIHVzaW5nIHRoZSBgY29tcGFyZWAgbWV0aG9kIGluIHRoZSBtZXRob2RzIG1lbnRpb25lZCBhYm92ZS4KICAvLy8gSWYgdGhlIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGZvciBhbiBvYmplY3QsIGl0IGlzIGFzc3VtZWQgdG8KICAvLy8gbm90IGJlIGluIHRoZSBzZXQuCiAgLy8vCiAgLy8vIElmIG9taXR0ZWQsIHRoZSBgaXNWYWxpZEtleWAgZnVuY3Rpb24gZGVmYXVsdHMgdG8gY2hlY2tpbmcgYWdhaW5zdCB0aGUKICAvLy8gdHlwZSBwYXJhbWV0ZXI6IGBvdGhlciBpcyBFYC4KICBTcGxheVRyZWVTZXQoW2ludCBjb21wYXJlKEUga2V5MSwgRSBrZXkyKSwgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSldKQogICAgICA6IF9jb21wYXJhdG9yID0gY29tcGFyZSA/PyBfZGVmYXVsdENvbXBhcmU8RT4oKSwKICAgICAgICBfdmFsaWRLZXkgPSBpc1ZhbGlkS2V5ID8/ICgodikgPT4gdiBpcyBFKTsKCiAgLy8vIENyZWF0ZXMgYSBbU3BsYXlUcmVlU2V0XSB0aGF0IGNvbnRhaW5zIGFsbCBbZWxlbWVudHNdLgogIC8vLwogIC8vLyBUaGUgc2V0IHdvcmtzIGFzIGlmIGNyZWF0ZWQgYnkgYG5ldyBTcGxheVRyZWVTZXQ8RT4oY29tcGFyZSwgaXNWYWxpZEtleSlgLgogIC8vLwogIC8vLyBBbGwgdGhlIFtlbGVtZW50c10gc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBbRV0gYW5kIHZhbGlkIGFyZ3VtZW50cyB0bwogIC8vLyBbY29tcGFyZV0uCiAgLy8vIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgLy8vIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGRvd24tY2FzdCBhIGBTZXRgLCBmb3IgZXhhbXBsZSBhczoKICAvLy8gYGBgZGFydAogIC8vLyBTZXQ8U3VwZXJUeXBlPiBzdXBlclNldCA9IC4uLjsKICAvLy8gU2V0PFN1YlR5cGU+IHN1YlNldCA9CiAgLy8vICAgICBuZXcgU3BsYXlUcmVlU2V0PFN1YlR5cGU+LmZyb20oc3VwZXJTZXQud2hlcmVUeXBlPFN1YlR5cGU+KCkpOwogIC8vLyBgYGAKICBmYWN0b3J5IFNwbGF5VHJlZVNldC5mcm9tKEl0ZXJhYmxlIGVsZW1lbnRzLAogICAgICBbaW50IGNvbXBhcmUoRSBrZXkxLCBFIGtleTIpLCBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KV0pIHsKICAgIFNwbGF5VHJlZVNldDxFPiByZXN1bHQgPSBTcGxheVRyZWVTZXQ8RT4oY29tcGFyZSwgaXNWYWxpZEtleSk7CiAgICBmb3IgKGZpbmFsIGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKICAgICAgRSBlID0gZWxlbWVudDsKICAgICAgcmVzdWx0LmFkZChlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtTcGxheVRyZWVTZXRdIGZyb20gW2VsZW1lbnRzXS4KICAvLy8KICAvLy8gVGhlIHNldCB3b3JrcyBhcyBpZiBjcmVhdGVkIGJ5IGBuZXcgU3BsYXlUcmVlU2V0PEU+KGNvbXBhcmUsIGlzVmFsaWRLZXkpYC4KICAvLy8KICAvLy8gQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSB2YWxpZCBhcyBhcmd1bWVudHMgdG8gdGhlIFtjb21wYXJlXSBmdW5jdGlvbi4KICBmYWN0b3J5IFNwbGF5VHJlZVNldC5vZihJdGVyYWJsZTxFPiBlbGVtZW50cywKICAgICAgICAgIFtpbnQgY29tcGFyZShFIGtleTEsIEUga2V5MiksIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpXSkgPT4KICAgICAgU3BsYXlUcmVlU2V0KGNvbXBhcmUsIGlzVmFsaWRLZXkpLi5hZGRBbGwoZWxlbWVudHMpOwoKICBTZXQ8VD4gX25ld1NldDxUPigpID0+CiAgICAgIFNwbGF5VHJlZVNldDxUPigoVCBhLCBUIGIpID0+IF9jb21wYXJhdG9yKGEgYXMgRSwgYiBhcyBFKSwgX3ZhbGlkS2V5KTsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcywgbmV3U2V0OiBfbmV3U2V0KTsKICBpbnQgX2NvbXBhcmUoRSBlMSwgRSBlMikgPT4gX2NvbXBhcmF0b3IoZTEsIGUyKTsKCiAgLy8gRnJvbSBJdGVyYWJsZS4KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IF9TcGxheVRyZWVLZXlJdGVyYXRvcjxFPih0aGlzKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2NvdW50OwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX3Jvb3QgPT0gbnVsbDsKICBib29sIGdldCBpc05vdEVtcHR5ID0+IF9yb290ICE9IG51bGw7CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChfY291bnQgPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gX2ZpcnN0LmtleTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKF9jb3VudCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiBfbGFzdC5rZXk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgaWYgKF9jb3VudCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIGlmIChfY291bnQgPiAxKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICByZXR1cm4gX3Jvb3Qua2V5OwogIH0KCiAgLy8gRnJvbSBTZXQuCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgcmV0dXJuIF92YWxpZEtleShlbGVtZW50KSAmJiBfc3BsYXkoZWxlbWVudCkgPT0gMDsKICB9CgogIGJvb2wgYWRkKEUgZWxlbWVudCkgewogICAgaW50IGNvbXBhcmUgPSBfc3BsYXkoZWxlbWVudCk7CiAgICBpZiAoY29tcGFyZSA9PSAwKSByZXR1cm4gZmFsc2U7CiAgICBfYWRkTmV3Um9vdChfU3BsYXlUcmVlTm9kZShlbGVtZW50KSwgY29tcGFyZSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBvYmplY3QpIHsKICAgIGlmICghX3ZhbGlkS2V5KG9iamVjdCkpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfcmVtb3ZlKG9iamVjdCkgIT0gbnVsbDsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGVsZW1lbnRzKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpbnQgY29tcGFyZSA9IF9zcGxheShlbGVtZW50KTsKICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgewogICAgICAgIF9hZGROZXdSb290KF9TcGxheVRyZWVOb2RlKGVsZW1lbnQpLCBjb21wYXJlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCByZW1vdmVBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgZm9yIChPYmplY3QgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoX3ZhbGlkS2V5KGVsZW1lbnQpKSBfcmVtb3ZlKGVsZW1lbnQpOwogICAgfQogIH0KCiAgdm9pZCByZXRhaW5BbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgLy8gQnVpbGQgYSBzZXQgd2l0aCB0aGUgc2FtZSBzZW5zZSBvZiBlcXVhbGl0eSBhcyB0aGlzIHNldC4KICAgIFNwbGF5VHJlZVNldDxFPiByZXRhaW5TZXQgPSBTcGxheVRyZWVTZXQ8RT4oX2NvbXBhcmF0b3IsIF92YWxpZEtleSk7CiAgICBpbnQgbW9kaWZpY2F0aW9uQ291bnQgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBmb3IgKE9iamVjdCBvYmplY3QgaW4gZWxlbWVudHMpIHsKICAgICAgaWYgKG1vZGlmaWNhdGlvbkNvdW50ICE9IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICAgIC8vIFRoZSBpdGVyYXRvciBzaG91bGQgbm90IGhhdmUgc2lkZSBlZmZlY3RzLgogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgICAvLyBFcXVpdmFsZW50IHRvIHRoaXMuY29udGFpbnMob2JqZWN0KS4KICAgICAgaWYgKF92YWxpZEtleShvYmplY3QpICYmIF9zcGxheShvYmplY3QpID09IDApIHsKICAgICAgICByZXRhaW5TZXQuYWRkKF9yb290LmtleSk7CiAgICAgIH0KICAgIH0KICAgIC8vIFRha2Ugb3ZlciB0aGUgZWxlbWVudHMgZnJvbSB0aGUgcmV0YWluZWQgc2V0LCBpZiBpdCBkaWZmZXJzLgogICAgaWYgKHJldGFpblNldC5fY291bnQgIT0gX2NvdW50KSB7CiAgICAgIF9yb290ID0gcmV0YWluU2V0Ll9yb290OwogICAgICBfY291bnQgPSByZXRhaW5TZXQuX2NvdW50OwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIH0KICB9CgogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpIHsKICAgIGlmICghX3ZhbGlkS2V5KG9iamVjdCkpIHJldHVybiBudWxsOwogICAgaW50IGNvbXAgPSBfc3BsYXkob2JqZWN0KTsKICAgIGlmIChjb21wICE9IDApIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9yb290LmtleTsKICB9CgogIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpIHsKICAgIFNldDxFPiByZXN1bHQgPSBTcGxheVRyZWVTZXQ8RT4oX2NvbXBhcmF0b3IsIF92YWxpZEtleSk7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmIChvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gZGlmZmVyZW5jZShTZXQ8T2JqZWN0PiBvdGhlcikgewogICAgU2V0PEU+IHJlc3VsdCA9IFNwbGF5VHJlZVNldDxFPihfY29tcGFyYXRvciwgX3ZhbGlkS2V5KTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKCFvdGhlci5jb250YWlucyhlbGVtZW50KSkgcmVzdWx0LmFkZChlbGVtZW50KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gdW5pb24oU2V0PEU+IG90aGVyKSB7CiAgICByZXR1cm4gX2Nsb25lKCkuLmFkZEFsbChvdGhlcik7CiAgfQoKICBTcGxheVRyZWVTZXQ8RT4gX2Nsb25lKCkgewogICAgdmFyIHNldCA9IFNwbGF5VHJlZVNldDxFPihfY29tcGFyYXRvciwgX3ZhbGlkS2V5KTsKICAgIHNldC5fY291bnQgPSBfY291bnQ7CiAgICBzZXQuX3Jvb3QgPSBfY29weU5vZGUoX3Jvb3QpOwogICAgcmV0dXJuIHNldDsKICB9CgogIC8vIENvcGllcyB0aGUgc3RydWN0dXJlIG9mIGEg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bGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhCi8vLyBzaGFyZWQgZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgYXMgaW50ZXJuYWw7CgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IHBhdGNoLCBJdGVyYWJsZUVsZW1lbnRFcnJvcjsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIiBzaG93IFVpbnQzMkxpc3Q7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAiY29tcGFjdF9oYXNoLmRhcnQiOwoKQHBhdGNoCmNsYXNzIEhhc2hNYXA8SywgVj4gewogIEBwYXRjaAogIGZhY3RvcnkgSGFzaE1hcCgKICAgICAge2Jvb2wgZXF1YWxzKEsga2V5MSwgSyBrZXkyKSwKICAgICAgaW50IGhhc2hDb2RlKEsga2V5KSwKICAgICAgYm9vbCBpc1ZhbGlkS2V5KHBvdGVudGlhbEtleSl9KSB7CiAgICBpZiAoaXNWYWxpZEtleSA9PSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBudWxsKSB7CiAgICAgICAgaWYgKGVxdWFscyA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF9IYXNoTWFwPEssIFY+KCk7CiAgICAgICAgfQogICAgICAgIGhhc2hDb2RlID0gX2RlZmF1bHRIYXNoQ29kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKGlkZW50aXR5SGFzaENvZGUsIGhhc2hDb2RlKSAmJgogICAgICAgICAgICBpZGVudGljYWwoaWRlbnRpY2FsLCBlcXVhbHMpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF9JZGVudGl0eUhhc2hNYXA8SywgVj4oKTsKICAgICAgICB9CiAgICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaENvZGUgPz89IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICB9CiAgICByZXR1cm4gbmV3IF9DdXN0b21IYXNoTWFwPEssIFY+KGVxdWFscywgaGFzaENvZGUsIGlzVmFsaWRLZXkpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBIYXNoTWFwLmlkZW50aXR5KCkgPT4gbmV3IF9JZGVudGl0eUhhc2hNYXA8SywgVj4oKTsKCiAgU2V0PEs+IF9uZXdLZXlTZXQoKTsKfQoKY29uc3QgaW50IF9NT0RJRklDQVRJT05fQ09VTlRfTUFTSyA9IDB4M2ZmZmZmZmY7CgpjbGFzcyBfSGFzaE1hcDxLLCBWPiBleHRlbmRzIE1hcEJhc2U8SywgVj4gaW1wbGVtZW50cyBIYXNoTWFwPEssIFY+IHsKICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0NBUEFDSVRZID0gODsKCiAgaW50IF9lbGVtZW50Q291bnQgPSAwOwogIExpc3Q8X0hhc2hNYXBFbnRyeTxLLCBWPj4gX2J1Y2tldHMgPQogICAgICBuZXcgTGlzdDxfSGFzaE1hcEVudHJ5PEssIFY+PihfSU5JVElBTF9DQVBBQ0lUWSk7CiAgaW50IF9tb2RpZmljYXRpb25Db3VudCA9IDA7CgogIGludCBnZXQgbGVuZ3RoID0+IF9lbGVtZW50Q291bnQ7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfZWxlbWVudENvdW50ID09IDA7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfZWxlbWVudENvdW50ICE9IDA7CgogIEl0ZXJhYmxlPEs+IGdldCBrZXlzID0+IG5ldyBfSGFzaE1hcEtleUl0ZXJhYmxlPEssIFY+KHRoaXMpOwogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gbmV3IF9IYXNoTWFwVmFsdWVJdGVyYWJsZTxLLCBWPih0aGlzKTsKCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGtleS5oYXNoQ29kZTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiB0cnVlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpXTsKICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgICBpZiAoZW50cnkudmFsdWUgPT0gdmFsdWUpIHJldHVybiB0cnVlOwogICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGtleS5oYXNoQ29kZTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGVudHJ5LmtleSA9PSBrZXkpIHsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShLIGtleSwgViB2YWx1ZSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSB7CiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgX2FkZEVudHJ5KGJ1Y2tldHMsIGluZGV4LCBsZW5ndGgsIGtleSwgdmFsdWUsIGhhc2hDb2RlKTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSB7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIGZpbmFsIHN0YW1wID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgZmluYWwgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICBpZiAoc3RhbXAgPT0gX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIF9hZGRFbnRyeShidWNrZXRzLCBpbmRleCwgbGVuZ3RoLCBrZXksIHZhbHVlLCBoYXNoQ29kZSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgb3RoZXIuZm9yRWFjaCgoSyBrZXksIFYgdmFsdWUpIHsKICAgICAgdGhpc1trZXldID0gdmFsdWU7CiAgICB9KTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihLIGtleSwgViB2YWx1ZSkpIHsKICAgIGZpbmFsIHN0YW1wID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgbGVuZ3RoID0gYnVja2V0cy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaV07CiAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgYWN0aW9uKGVudHJ5LmtleSwgZW50cnkudmFsdWUpOwogICAgICAgIGlmIChzdGFtcCAhPSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgICAgfQogICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgfQogICAgfQogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgZmluYWwgaGFzaENvZGUgPSBrZXkuaGFzaENvZGU7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIF9IYXNoTWFwRW50cnk8SywgVj4gcHJldmlvdXMgPSBudWxsOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgZmluYWwgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBlbnRyeS5rZXkgPT0ga2V5KSB7CiAgICAgICAgX3JlbW92ZUVudHJ5KGVudHJ5LCBwcmV2aW91cywgaW5kZXgpOwogICAgICAgIF9lbGVtZW50Q291bnQtLTsKICAgICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPQogICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgIGVudHJ5ID0gbmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9idWNrZXRzID0gbmV3IExpc3QoX0lOSVRJQUxfQ0FQQUNJVFkpOwogICAgaWYgKF9lbGVtZW50Q291bnQgPiAwKSB7CiAgICAgIF9lbGVtZW50Q291bnQgPSAwOwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPSAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICB9CiAgfQoKICB2b2lkIF9yZW1vdmVFbnRyeShfSGFzaE1hcEVudHJ5PEssIFY+IGVudHJ5LAogICAgICBfSGFzaE1hcEVudHJ5PEssIFY+IHByZXZpb3VzSW5CdWNrZXQsIGludCBidWNrZXRJbmRleCkgewogICAgaWYgKHByZXZpb3VzSW5CdWNrZXQgPT0gbnVsbCkgewogICAgICBfYnVja2V0c1tidWNrZXRJbmRleF0gPSBlbnRyeS5uZXh0OwogICAgfSBlbHNlIHsKICAgICAgcHJldmlvdXNJbkJ1Y2tldC5uZXh0ID0gZW50cnkubmV4dDsKICAgIH0KICB9CgogIHZvaWQgX2FkZEVudHJ5KExpc3Q8X0hhc2hNYXBFbnRyeTxLLCBWPj4gYnVja2V0cywgaW50IGluZGV4LCBpbnQgbGVuZ3RoLAogICAgICBLIGtleSwgViB2YWx1ZSwgaW50IGhhc2hDb2RlKSB7CiAgICBmaW5hbCBlbnRyeSA9IG5ldyBfSGFzaE1hcEVudHJ5PEssIFY+KGtleSwgdmFsdWUsIGhhc2hDb2RlLCBidWNrZXRzW2luZGV4XSk7CiAgICBidWNrZXRzW2luZGV4XSA9IGVudHJ5OwogICAgZmluYWwgbmV3RWxlbWVudHMgPSBfZWxlbWVudENvdW50ICsgMTsKICAgIF9lbGVtZW50Q291bnQgPSBuZXdFbGVtZW50czsKICAgIC8vIElmIHdlIGVuZCB1cCB3aXRoIG1vcmUgdGhhbiA3NSUgbm9uLWVtcHR5IGVudHJpZXMsIHdlCiAgICAvLyByZXNpemUgdGhlIGJhY2tpbmcgc3RvcmUuCiAgICBpZiAoKG5ld0VsZW1lbnRzIDw8IDIpID4gKChsZW5ndGggPDwgMSkgKyBsZW5ndGgpKSBfcmVzaXplKCk7CiAgICBfbW9kaWZpY2F0aW9uQ291bnQgPSAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgfQoKICB2b2lkIF9yZXNpemUoKSB7CiAgICBmaW5hbCBvbGRCdWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBvbGRMZW5ndGggPSBvbGRCdWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIG5ld0xlbmd0aCA9IG9sZExlbmd0aCA8PCAxOwogICAgZmluYWwgbmV3QnVja2V0cyA9IG5ldyBMaXN0PF9IYXNoTWFwRW50cnk8SywgVj4+KG5ld0xlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZExlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IG9sZEJ1Y2tldHNbaV07CiAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgZmluYWwgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgICAgZmluYWwgaGFzaENvZGUgPSBlbnRyeS5oYXNoQ29kZTsKICAgICAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKG5ld0xlbmd0aCAtIDEpOwogICAgICAgIGVudHJ5Lm5leHQgPSBuZXdCdWNrZXRzW2luZGV4XTsKICAgICAgICBuZXdCdWNrZXRzW2luZGV4XSA9IGVudHJ5OwogICAgICAgIGVudHJ5ID0gbmV4dDsKICAgICAgfQogICAgfQogICAgX2J1Y2tldHMgPSBuZXdCdWNrZXRzOwogIH0KCiAgU2V0PEs+IF9uZXdLZXlTZXQoKSA9PiBuZXcgX0hhc2hTZXQ8Sz4oKTsKfQoKY2xhc3MgX0N1c3RvbUhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcDxLLCBWPiB7CiAgZmluYWwgX0VxdWFsaXR5PEs+IF9lcXVhbHM7CiAgZmluYWwgX0hhc2hlcjxLPiBfaGFzaENvZGU7CiAgZmluYWwgX1ByZWRpY2F0ZSBfdmFsaWRLZXk7CiAgX0N1c3RvbUhhc2hNYXAodGhpcy5fZXF1YWxzLCB0aGlzLl9oYXNoQ29kZSwgdmFsaWRLZXkpCiAgICAgIDogX3ZhbGlkS2V5ID0gKHZhbGlkS2V5ICE9IG51bGwpID8gdmFsaWRLZXkgOiBuZXcgX1R5cGVUZXN0PEs+KCkudGVzdDsKCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICBpZiAoIV92YWxpZEtleShrZXkpKSByZXR1cm4gZmFsc2U7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgX2VxdWFscyhlbnRyeS5rZXksIGtleSkpIHJldHVybiB0cnVlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIGlmICghX3ZhbGlkS2V5KGtleSkpIHJldHVybiBudWxsOwogICAgZmluYWwgaGFzaENvZGUgPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIF9lcXVhbHMoZW50cnkua2V5LCBrZXkpKSB7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBfZXF1YWxzKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIF9hZGRFbnRyeShidWNrZXRzLCBpbmRleCwgbGVuZ3RoLCBrZXksIHZhbHVlLCBoYXNoQ29kZSk7CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAobGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBfZXF1YWxzKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBpbnQgc3RhbXAgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBWIHZhbHVlID0gaWZBYnNlbnQoKTsKICAgIGlmIChzdGFtcCA9PSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgX2FkZEVudHJ5KGJ1Y2tldHMsIGluZGV4LCBsZW5ndGgsIGtleSwgdmFsdWUsIGhhc2hDb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgaWYgKCFfdmFsaWRLZXkoa2V5KSkgcmV0dXJuIG51bGw7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICBfSGFzaE1hcEVudHJ5PEssIFY+IHByZXZpb3VzID0gbnVsbDsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIG5leHQgPSBlbnRyeS5uZXh0OwogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgX2VxdWFscyhlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICBfcmVtb3ZlRW50cnkoZW50cnksIHByZXZpb3VzLCBpbmRleCk7CiAgICAgICAgX2VsZW1lbnRDb3VudC0tOwogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9CiAgICAgICAgICAgIChfbW9kaWZpY2F0aW9uQ291bnQgKyAxKSAmIF9NT0RJRklDQVRJT05fQ09VTlRfTUFTSzsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgcHJldmlvdXMgPSBlbnRyeTsKICAgICAgZW50cnkgPSBuZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBTZXQ8Sz4gX25ld0tleVNldCgpID0+IG5ldyBfQ3VzdG9tSGFzaFNldDxLPihfZXF1YWxzLCBfaGFzaENvZGUsIF92YWxpZEtleSk7Cn0KCmNsYXNzIF9JZGVudGl0eUhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcDxLLCBWPiB7CiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGlkZW50aXR5SGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGlkZW50aWNhbChlbnRyeS5rZXksIGtleSkpIHJldHVybiB0cnVlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBrZXkpIHsKICAgIGZpbmFsIGhhc2hDb2RlID0gaWRlbnRpdHlIYXNoQ29kZShrZXkpOwogICAgZmluYWwgYnVja2V0cyA9IF9idWNrZXRzOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChidWNrZXRzLmxlbmd0aCAtIDEpOwogICAgdmFyIGVudHJ5ID0gYnVja2V0c1tpbmRleF07CiAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gZW50cnkuaGFzaENvZGUgJiYgaWRlbnRpY2FsKGVudHJ5LmtleSwga2V5KSkgewogICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGlkZW50aXR5SGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGxlbmd0aCA9IGJ1Y2tldHMubGVuZ3RoOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChsZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGlkZW50aWNhbChlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBfYWRkRW50cnkoYnVja2V0cywgaW5kZXgsIGxlbmd0aCwga2V5LCB2YWx1ZSwgaGFzaENvZGUpOwogIH0KCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IGlkZW50aXR5SGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGJ1Y2tldHMgPSBfYnVja2V0czsKICAgIGZpbmFsIGxlbmd0aCA9IGJ1Y2tldHMubGVuZ3RoOwogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChsZW5ndGggLSAxKTsKICAgIHZhciBlbnRyeSA9IGJ1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IGVudHJ5Lmhhc2hDb2RlICYmIGlkZW50aWNhbChlbnRyeS5rZXksIGtleSkpIHsKICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgZmluYWwgc3RhbXAgPSBfbW9kaWZpY2F0aW9uQ291bnQ7CiAgICBWIHZhbHVlID0gaWZBYnNlbnQoKTsKICAgIGlmIChzdGFtcCA9PSBfbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgX2FkZEVudHJ5KGJ1Y2tldHMsIGluZGV4LCBsZW5ndGgsIGtleSwgdmFsdWUsIGhhc2hDb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgZmluYWwgaGFzaENvZGUgPSBpZGVudGl0eUhhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBidWNrZXRzID0gX2J1Y2tldHM7CiAgICBmaW5hbCBpbmRleCA9IGhhc2hDb2RlICYgKGJ1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICB2YXIgZW50cnkgPSBidWNrZXRzW2luZGV4XTsKICAgIF9IYXNoTWFwRW50cnk8SywgVj4gcHJldmlvdXMgPSBudWxsOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgZmluYWwgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgIGlmIChoYXNoQ29kZSA9PSBlbnRyeS5oYXNoQ29kZSAmJiBpZGVudGljYWwoZW50cnkua2V5LCBrZXkpKSB7CiAgICAgICAgX3JlbW92ZUVudHJ5KGVudHJ5LCBwcmV2aW91cywgaW5kZXgpOwogICAgICAgIF9lbGVtZW50Q291bnQtLTsKICAgICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPQogICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOwogICAgICB9CiAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgIGVudHJ5ID0gbmV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgU2V0PEs+IF9uZXdLZXlTZXQoKSA9PiBuZXcgX0lkZW50aXR5SGFzaFNldDxLPigpOwp9CgpjbGFzcyBfSGFzaE1hcEVudHJ5PEssIFY+IHsKICBmaW5hbCBLIGtleTsKICBWIHZhbHVlOwogIGZpbmFsIGludCBoYXNoQ29kZTsKICBfSGFzaE1hcEVudHJ5PEssIFY+IG5leHQ7CiAgX0hhc2hNYXBFbnRyeSh0aGlzLmtleSwgdGhpcy52YWx1ZSwgdGhpcy5oYXNoQ29kZSwgdGhpcy5uZXh0KTsKfQoKYWJzdHJhY3QgY2xhc3MgX0hhc2hNYXBJdGVyYWJsZTxLLCBWLCBFPgogICAgZXh0ZW5kcyBpbnRlcm5hbC5FZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgZmluYWwgX0hhc2hNYXA8SywgVj4gX21hcDsKICBfSGFzaE1hcEl0ZXJhYmxlKHRoaXMuX21hcCk7CiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5sZW5ndGg7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbWFwLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbWFwLmlzTm90RW1wdHk7Cn0KCmNsYXNzIF9IYXNoTWFwS2V5SXRlcmFibGU8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcEl0ZXJhYmxlPEssIFYsIEs+IHsKICBfSGFzaE1hcEtleUl0ZXJhYmxlKF9IYXNoTWFwPEssIFY+IG1hcCkgOiBzdXBlcihtYXApOwogIEl0ZXJhdG9yPEs+IGdldCBpdGVyYXRvciA9PiBuZXcgX0hhc2hNYXBLZXlJdGVyYXRvcjxLLCBWPihfbWFwKTsKICBib29sIGNvbnRhaW5zKE9iamVjdCBrZXkpID0+IF9tYXAuY29udGFpbnNLZXkoa2V5KTsKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oSyBrZXkpKSB7CiAgICBfbWFwLmZvckVhY2goKEsga2V5LCBfKSB7CiAgICAgIGFjdGlvbihrZXkpOwogICAgfSk7CiAgfQoKICBTZXQ8Sz4gdG9TZXQoKSA9PiBfbWFwLl9uZXdLZXlTZXQoKS4uYWRkQWxsKHRoaXMpOwp9CgpjbGFzcyBfSGFzaE1hcFZhbHVlSXRlcmFibGU8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcEl0ZXJhYmxlPEssIFYsIFY+IHsKICBfSGFzaE1hcFZhbHVlSXRlcmFibGUoX0hhc2hNYXA8SywgVj4gbWFwKSA6IHN1cGVyKG1hcCk7CiAgSXRlcmF0b3I8Vj4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBfSGFzaE1hcFZhbHVlSXRlcmF0b3I8SywgVj4oX21hcCk7CiAgYm9vbCBjb250YWlucyhPYmplY3QgdmFsdWUpID0+IF9tYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKFYgdmFsdWUpKSB7CiAgICBfbWFwLmZvckVhY2goKF8sIFYgdmFsdWUpIHsKICAgICAgYWN0aW9uKHZhbHVlKTsKICAgIH0pOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0hhc2hNYXBJdGVyYXRvcjxLLCBWLCBFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBfSGFzaE1hcDxLLCBWPiBfbWFwOwogIGZpbmFsIGludCBfc3RhbXA7CgogIGludCBfaW5kZXggPSAwOwogIF9IYXNoTWFwRW50cnk8SywgVj4gX2VudHJ5OwoKICBfSGFzaE1hcEl0ZXJhdG9yKHRoaXMuX21hcCkgOiBfc3RhbXAgPSBfbWFwLl9tb2RpZmljYXRpb25Db3VudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfc3RhbXAgIT0gX21hcC5fbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihfbWFwKTsKICAgIH0KICAgIHZhciBlbnRyeSA9IF9lbnRyeTsKICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGZpbmFsIG5leHQgPSBlbnRyeS5uZXh0OwogICAgICBpZiAobmV4dCAhPSBudWxsKSB7CiAgICAgICAgX2VudHJ5ID0gbmV4dDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBfZW50cnkgPSBudWxsOwogICAgfQogICAgZmluYWwgYnVja2V0cyA9IF9tYXAuX2J1Y2tldHM7CiAgICBmaW5hbCBsZW5ndGggPSBidWNrZXRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSBfaW5kZXg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBlbnRyeSA9IGJ1Y2tldHNbaV07CiAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgX2luZGV4ID0gaSArIDE7CiAgICAgICAgX2VudHJ5ID0gZW50cnk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIF9pbmRleCA9IGxlbmd0aDsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCmNsYXNzIF9IYXNoTWFwS2V5SXRlcmF0b3I8SywgVj4gZXh0ZW5kcyBfSGFzaE1hcEl0ZXJhdG9yPEssIFYsIEs+IHsKICBfSGFzaE1hcEtleUl0ZXJhdG9yKF9IYXNoTWFwPEssIFY+IG1hcCkgOiBzdXBlcihtYXApOwogIEsgZ2V0IGN1cnJlbnQgPT4gX2VudHJ5Py5rZXk7Cn0KCmNsYXNzIF9IYXNoTWFwVmFsdWVJdGVyYXRvcjxLLCBWPiBleHRlbmRzIF9IYXNoTWFwSXRlcmF0b3I8SywgViwgVj4gewogIF9IYXNoTWFwVmFsdWVJdGVyYXRvcihfSGFzaE1hcDxLLCBWPiBtYXApIDogc3VwZXIobWFwKTsKICBWIGdldCBjdXJyZW50ID0+IF9lbnRyeT8udmFsdWU7Cn0KCkBwYXRjaApjbGFzcyBIYXNoU2V0PEU+IHsKICBAcGF0Y2gKICBmYWN0b3J5IEhhc2hTZXQoCiAgICAgIHtib29sIGVxdWFscyhFIGUxLCBFIGUyKSwKICAgICAgaW50IGhhc2hDb2RlKEUgZSksCiAgICAgIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpfSkgewogICAgaWYgKGlzVmFsaWRLZXkgPT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gbnVsbCkgewogICAgICAgIGlmIChlcXVhbHMgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG5ldyBfSGFzaFNldDxFPigpOwogICAgICAgIH0KICAgICAgICBoYXNoQ29kZSA9IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChpZGVudGl0eUhhc2hDb2RlLCBoYXNoQ29kZSkgJiYKICAgICAgICAgICAgaWRlbnRpY2FsKGlkZW50aWNhbCwgZXF1YWxzKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBfSWRlbnRpdHlIYXNoU2V0PEU+KCk7CiAgICAgICAgfQogICAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGhhc2hDb2RlID8/PSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICBlcXVhbHMgPz89IF9kZWZhdWx0RXF1YWxzOwogICAgfQogICAgcmV0dXJuIG5ldyBfQ3VzdG9tSGFzaFNldDxFPihlcXVhbHMsIGhhc2hDb2RlLCBpc1ZhbGlkS2V5KTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgSGFzaFNldC5pZGVudGl0eSgpID0+IG5ldyBfSWRlbnRpdHlIYXNoU2V0PEU+KCk7Cn0KCmNsYXNzIF9IYXNoU2V0PEU+IGV4dGVuZHMgX1NldEJhc2U8RT4gaW1wbGVtZW50cyBIYXNoU2V0PEU+IHsKICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0NBUEFDSVRZID0gODsKCiAgTGlzdDxfSGFzaFNldEVudHJ5PEU+PiBfYnVja2V0cyA9CiAgICAgIG5ldyBMaXN0PF9IYXNoU2V0RW50cnk8RT4+KF9JTklUSUFMX0NBUEFDSVRZKTsKICBpbnQgX2VsZW1lbnRDb3VudCA9IDA7CiAgaW50IF9tb2RpZmljYXRpb25Db3VudCA9IDA7CgogIGJvb2wgX2VxdWFscyhlMSwgZTIpID0+IGUxID09IGUyOwogIGludCBfaGFzaENvZGUoZSkgPT4gZS5oYXNoQ29kZTsKCiAgc3RhdGljIFNldDxSPiBfbmV3RW1wdHk8Uj4oKSA9PiBuZXcgX0hhc2hTZXQ8Uj4oKTsKCiAgLy8gSXRlcmFibGUuCgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBuZXcgX0hhc2hTZXRJdGVyYXRvcjxFPih0aGlzKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX2VsZW1lbnRDb3VudDsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfZWxlbWVudENvdW50ID09IDA7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX2VsZW1lbnRDb3VudCAhPSAwOwoKICBib29sIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKICAgIGludCBpbmRleCA9IF9oYXNoQ29kZShvYmplY3QpICYgKF9idWNrZXRzLmxlbmd0aCAtIDEpOwogICAgX0hhc2hTZXRFbnRyeTxFPiBlbnRyeSA9IF9idWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChfZXF1YWxzKGVudHJ5LmtleSwgb2JqZWN0KSkgcmV0dXJuIHRydWU7CiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgbG9va3VwKE9iamVjdCBvYmplY3QpIHsKICAgIGludCBpbmRleCA9IF9oYXNoQ29kZShvYmplY3QpICYgKF9idWNrZXRzLmxlbmd0aCAtIDEpOwogICAgX0hhc2hTZXRFbnRyeTxFPiBlbnRyeSA9IF9idWNrZXRzW2luZGV4XTsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXk7CiAgICAgIGlmIChfZXF1YWxzKGtleSwgb2JqZWN0KSkgcmV0dXJuIGtleTsKICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9idWNrZXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IF9idWNrZXRzW2ldOwogICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIHJldHVybiBlbnRyeS5rZXk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBmb3IgKGludCBpID0gX2J1Y2tldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIGVudHJ5ID0gX2J1Y2tldHNbaV07CiAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgd2hpbGUgKGVudHJ5Lm5leHQgIT0gbnVsbCkgewogICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZW50cnkua2V5OwogICAgICB9CiAgICB9CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIC8vIFNldC4KCiAgYm9vbCBhZGQoRSBlbGVtZW50KSB7CiAgICBmaW5hbCBoYXNoQ29kZSA9IF9oYXNoQ29kZShlbGVtZW50KTsKICAgIGZpbmFsIGluZGV4ID0gaGFzaENvZGUgJiAoX2J1Y2tldHMubGVuZ3RoIC0gMSk7CiAgICBfSGFzaFNldEVudHJ5PEU+IGVudHJ5ID0gX2J1Y2tldHNbaW5kZXhdOwogICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKICAgICAgaWYgKF9lcXVhbHMoZW50cnkua2V5LCBlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICBfYWRkRW50cnkoZWxlbWVudCwgaGFzaENvZGUsIGluZGV4KTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gb2JqZWN0cykgewogICAgZm9yIChFIG9iamVjdCBpbiBvYmplY3RzKSB7CiAgICAgIGFkZChvYmplY3QpOwogICAgfQogIH0KCiAgYm9vbCBfcmVtb3ZlKE9iamVjdCBvYmplY3QsIGludCBoYXNoQ29kZSkgewogICAgZmluYWwgaW5kZXggPSBoYXNoQ29kZSAmIChfYnVja2V0cy5sZW5ndGggLSAxKTsKICAgIF9IYXNoU2V0RW50cnk8RT4gZW50cnkgPSBfYnVja2V0c1tpbmRleF07CiAgICBfSGFzaFNldEVudHJ5PEU+IHByZXZpb3VzID0gbnVsbDsKICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgIGlmIChfZXF1YWxzKGVudHJ5LmtleSwgb2JqZWN0KSkgewogICAgICAgIF9IYXNoU2V0RW50cnk8RT4gbmV4dCA9IGVudHJ5LnJlbW92ZSgpOwogICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7CiAgICAgICAgICBfYnVja2V0c1tpbmRleF0gPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgX2VsZW1lbnRDb3VudC0tOwogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9CiAgICAgICAgICAgIChfbW9kaWZpY2F0aW9uQ291bnQgKyAxKSAmIF9NT0RJRklDQVRJT05fQ09VTlRfTUFTSzsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwcmV2aW91cyA9IGVudHJ5OwogICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBib29sIHJlbW92ZShPYmplY3Qgb2JqZWN0KSA9PiBfcmVtb3ZlKG9iamVjdCwgX2hhc2hDb2RlKG9iamVjdCkpOwoKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IG9iamVjdHNUb1JlbW92ZSkgewogICAgZm9yIChPYmplY3Qgb2JqZWN0IGluIG9iamVjdHNUb1JlbW92ZSkgewogICAgICBfcmVtb3ZlKG9iamVjdCwgX2hhc2hDb2RlKG9iamVjdCkpOwogICAgfQogIH0KCiAgdm9pZCBfZmlsdGVyV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIGJvb2wgcmVtb3ZlTWF0Y2hpbmcpIHsKICAgIGludCBsZW5ndGggPSBfYnVja2V0cy5sZW5ndGg7CiAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIF9IYXNoU2V0RW50cnk8RT4gZW50cnkgPSBfYnVja2V0c1tpbmRleF07CiAgICAgIF9IYXNoU2V0RW50cnk8RT4gcHJldmlvdXMgPSBudWxsOwogICAgICB3aGlsZSAoZW50cnkgIT0gbnVsbCkgewogICAgICAgIGludCBtb2RpZmljYXRpb25Db3VudCA9IF9tb2RpZmljYXRpb25Db3VudDsKICAgICAgICBib29sIHRlc3RSZXN1bHQgPSB0ZXN0KGVudHJ5LmtleSk7CiAgICAgICAgaWYgKG1vZGlmaWNhdGlvbkNvdW50ICE9IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRlc3RSZXN1bHQgPT0gcmVtb3ZlTWF0Y2hpbmcpIHsKICAgICAgICAgIF9IYXNoU2V0RW50cnk8RT4gbmV4dCA9IGVudHJ5LnJlbW92ZSgpOwogICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpIHsKICAgICAgICAgICAgX2J1Y2tldHNbaW5kZXhdID0gbmV4dDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0OwogICAgICAgICAgfQogICAgICAgICAgX2VsZW1lbnRDb3VudC0tOwogICAgICAgICAgX21vZGlmaWNhdGlvbkNvdW50ID0KICAgICAgICAgICAgICAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICAgICAgICBlbnRyeSA9IG5leHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfZmlsdGVyV2hlcmUodGVzdCwgdHJ1ZSk7CiAgfQoKICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfZmlsdGVyV2hlcmUodGVzdCwgZmFsc2UpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9idWNrZXRzID0gbmV3IExpc3QoX0lOSVRJQUxfQ0FQQUNJVFkpOwogICAgaWYgKF9lbGVtZW50Q291bnQgPiAwKSB7CiAgICAgIF9lbGVtZW50Q291bnQgPSAwOwogICAgICBfbW9kaWZpY2F0aW9uQ291bnQgPSAoX21vZGlmaWNhdGlvbkNvdW50ICsgMSkgJiBfTU9ESUZJQ0FUSU9OX0NPVU5UX01BU0s7CiAgICB9CiAgfQoKICB2b2lkIF9hZGRFbnRyeShFIGtleSwgaW50IGhhc2hDb2RlLCBpbnQgaW5kZXgpIHsKICAgIF9idWNrZXRzW2luZGV4XSA9IG5ldyBfSGFzaFNldEVudHJ5PEU+KGtleSwgaGFzaENvZGUsIF9idWNrZXRzW2luZGV4XSk7CiAgICBpbnQgbmV3RWxlbWVudHMgPSBfZWxlbWVudENvdW50ICsgMTsKICAgIF9lbGVtZW50Q291bnQgPSBuZXdFbGVtZW50czsKICAgIGludCBsZW5ndGggPSBfYnVja2V0cy5sZW5ndGg7CiAgICAvLyBJZiB3ZSBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gNzUlIG5vbi1lbXB0eSBlbnRyaWVzLCB3ZQogICAgLy8gcmVzaXplIHRoZSBiYWNraW5nIHN0b3JlLgogICAgaWYgKChuZXdFbGVtZW50cyA8PCAyKSA+ICgobGVuZ3RoIDw8IDEpICsgbGVuZ3RoKSkgX3Jlc2l6ZSgpOwogICAgX21vZGlmaWNhdGlvbkNvdW50ID0gKF9tb2RpZmljYXRpb25Db3VudCArIDEpICYgX01PRElGSUNBVElPTl9DT1VOVF9NQVNLOwogIH0KCiAgdm9pZCBfcmVzaXplKCkgewogICAgaW50IG9sZExlbmd0aCA9IF9idWNrZXRzLmxlbmd0aDsKICAgIGludCBuZXdMZW5ndGggPSBvbGRMZW5ndGggPDwgMTsKICAgIExpc3Qgb2xkQnVja2V0cyA9IF9idWNrZXRzOwogICAgTGlzdCBuZXdCdWNrZXRzID0gbmV3IExpc3Q8X0hhc2hTZXRFbnRyeTxFPj4obmV3TGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkTGVuZ3RoOyBpKyspIHsKICAgICAgX0hhc2hTZXRFbnRyeTxFPiBlbnRyeSA9IG9sZEJ1Y2tldHNbaV07CiAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgX0hhc2hTZXRFbnRyeTxFPiBuZXh0ID0gZW50cnkubmV4dDsKICAgICAgICBpbnQgbmV3SW5kZXggPSBlbnRyeS5oYXNoQ29kZSAmIChuZXdMZW5ndGggLSAxKTsKICAgICAgICBlbnRyeS5uZXh0ID0gbmV3QnVja2V0c1tuZXdJbmRleF07CiAgICAgICAgbmV3QnVja2V0c1tuZXdJbmRleF0gPSBlbnRyeTsKICAgICAgICBlbnRyeSA9IG5leHQ7CiAgICAgIH0KICAgIH0KICAgIF9idWNrZXRzID0gbmV3QnVja2V0czsKICB9CgogIEhhc2hTZXQ8RT4gX25ld1NldCgpID0+IG5ldyBfSGFzaFNldDxFPigpOwogIEhhc2hTZXQ8Uj4gX25ld1NpbWlsYXJTZXQ8Uj4oKSA9PiBuZXcgX0hhc2hTZXQ8Uj4oKTsKfQoKY2xhc3MgX0lkZW50aXR5SGFzaFNldDxFPiBleHRlbmRzIF9IYXNoU2V0PEU+IHsKICBpbnQgX2hhc2hDb2RlKGUpID0+IGlkZW50aXR5SGFzaENvZGUoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gaWRlbnRpY2FsKGUxLCBlMik7CgogIEhhc2hTZXQ8RT4gX25ld1NldCgpID0+IG5ldyBfSWRlbnRpdHlIYXNoU2V0PEU+KCk7CiAgSGFzaFNldDxSPiBfbmV3U2ltaWxhclNldDxSPigpID0+IG5ldyBfSWRlbnRpdHlIYXNoU2V0PFI+KCk7Cn0KCmNsYXNzIF9DdXN0b21IYXNoU2V0PEU+IGV4dGVuZHMgX0hhc2hTZXQ8RT4gewogIGZpbmFsIF9FcXVhbGl0eTxFPiBfZXF1YWxpdHk7CiAgZmluYWwgX0hhc2hlcjxFPiBfaGFzaGVyOwogIGZpbmFsIF9QcmVkaWNhdGUgX3ZhbGlkS2V5OwogIF9DdXN0b21IYXNoU2V0KHRoaXMuX2VxdWFsaXR5LCB0aGlzLl9oYXNoZXIsIGJvb2wgdmFsaWRLZXkoT2JqZWN0IG8pKQogICAgICA6IF92YWxpZEtleSA9ICh2YWxpZEtleSAhPSBudWxsKSA/IHZhbGlkS2V5IDogbmV3IF9UeXBlVGVzdDxFPigpLnRlc3Q7CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICBpZiAoIV92YWxpZEtleShlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHN1cGVyLnJlbW92ZShlbGVtZW50KTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGlmICghX3ZhbGlkS2V5KGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gc3VwZXIuY29udGFpbnMoZWxlbWVudCk7CiAgfQoKICBFIGxvb2t1cChPYmplY3QgZWxlbWVudCkgewogICAgaWYgKCFfdmFsaWRLZXkoZWxlbWVudCkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHN1cGVyLmxvb2t1cChlbGVtZW50KTsKICB9CgogIGJvb2wgY29udGFpbnNBbGwoSXRlcmFibGU8T2JqZWN0PiBlbGVtZW50cykgewogICAgZm9yIChPYmplY3QgZWxlbWVudCBpbiBlbGVtZW50cykgewogICAgICBpZiAoIV92YWxpZEtleShlbGVtZW50KSB8fCAhdGhpcy5jb250YWlucyhlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2b2lkIHJlbW92ZUFsbChJdGVyYWJsZTxPYmplY3Q+IGVsZW1lbnRzKSB7CiAgICBmb3IgKE9iamVjdCBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgIGlmIChfdmFsaWRLZXkoZWxlbWVudCkpIHsKICAgICAgICBzdXBlci5fcmVtb3ZlKGVsZW1lbnQsIF9oYXNoZXIoZWxlbWVudCkpOwogICAgICB9CiAgICB9CiAgfQoKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBfZXF1YWxpdHkoZTEsIGUyKTsKICBpbnQgX2hhc2hDb2RlKGUpID0+IF9oYXNoZXIoZSk7CgogIEhhc2hTZXQ8RT4gX25ld1NldCgpID0+IG5ldyBfQ3VzdG9tSGFzaFNldDxFPihfZXF1YWxpdHksIF9oYXNoZXIsIF92YWxpZEtleSk7CiAgSGFzaFNldDxSPiBfbmV3U2ltaWxhclNldDxSPigpID0+IG5ldyBfSGFzaFNldDxSPigpOwp9CgpjbGFzcyBfSGFzaFNldEVudHJ5PEU+IHsKICBmaW5hbCBFIGtleTsKICBmaW5hbCBpbnQgaGFzaENvZGU7CiAgX0hhc2hTZXRFbnRyeTxFPiBuZXh0OwogIF9IYXNoU2V0RW50cnkodGhpcy5rZXksIHRoaXMuaGFzaENvZGUsIHRoaXMubmV4dCk7CgogIF9IYXNoU2V0RW50cnk8RT4gcmVtb3ZlKCkgewogICAgZmluYWwgcmVzdWx0ID0gbmV4dDsKICAgIG5leHQgPSBudWxsOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KCmNsYXNzIF9IYXNoU2V0SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgX0hhc2hTZXQ8RT4gX3NldDsKICBmaW5hbCBpbnQgX21vZGlmaWNhdGlvbkNvdW50OwogIGludCBfaW5kZXggPSAwOwogIF9IYXNoU2V0RW50cnk8RT4gX25leHQ7CiAgRSBfY3VycmVudDsKCiAgX0hhc2hTZXRJdGVyYXRvcih0aGlzLl9zZXQpIDogX21vZGlmaWNhdGlvbkNvdW50ID0gX3NldC5fbW9kaWZpY2F0aW9uQ291bnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX21vZGlmaWNhdGlvbkNvdW50ICE9IF9zZXQuX21vZGlmaWNhdGlvbkNvdW50KSB7CiAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IoX3NldCk7CiAgICB9CiAgICBpZiAoX25leHQgIT0gbnVsbCkgewogICAgICBfY3VycmVudCA9IF9uZXh0LmtleTsKICAgICAgX25leHQgPSBfbmV4dC5uZXh0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIExpc3Q8X0hhc2hTZXRFbnRyeTxFPj4gYnVja2V0cyA9IF9zZXQuX2J1Y2tldHM7CiAgICB3aGlsZSAoX2luZGV4IDwgYnVja2V0cy5sZW5ndGgpIHsKICAgICAgX25leHQgPSBidWNrZXRzW19pbmRleF07CiAgICAgIF9pbmRleCA9IF9pbmRleCArIDE7CiAgICAgIGlmIChfbmV4dCAhPSBudWxsKSB7CiAgICAgICAgX2N1cnJlbnQgPSBfbmV4dC5rZXk7CiAgICAgICAgX25leHQgPSBfbmV4dC5uZXh0OwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBfY3VycmVudCA9IG51bGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CgovKioKICogQSBoYXNoLWJhc2VkIG1hcCB0aGF0IGl0ZXJhdGVzIGtleXMgYW5kIHZhbHVlcyBpbiBrZXkgaW5zZXJ0aW9uIG9yZGVyLgogKiBUaGlzIGlzIG5ldmVyIGFjdHVhbGx5IGluc3RhbnRpYXRlZCBhbnkgbW9yZSAtIHRoZSBjb25zdHJ1Y3RvciBhbHdheXMKICogcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBfQ29tcGFjdExpbmtlZEhhc2hNYXAgb3IgX0ludGVybmFsTGlua2VkSGFzaE1hcCwKICogd2hpY2ggZGVzcGl0ZSB0aGUgbmFtZXMgZG8gbm90IHVzZSBsaW5rcyAoYnV0IGFyZSBpbnNlcnRpb24tb3JkZXJlZCBhcyBpZgogKiB0aGV5IGRpZCkuCiAqLwpAcGF0Y2gKY2xhc3MgTGlua2VkSGFzaE1hcDxLLCBWPiB7CiAgQHBhdGNoCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwKAogICAgICB7Ym9vbCBlcXVhbHMoSyBrZXkxLCBLIGtleTIpLAogICAgICBpbnQgaGFzaENvZGUoSyBrZXkpLAogICAgICBib29sIGlzVmFsaWRLZXkocG90ZW50aWFsS2V5KX0pIHsKICAgIGlmIChpc1ZhbGlkS2V5ID09IG51bGwpIHsKICAgICAgaWYgKGhhc2hDb2RlID09IG51bGwpIHsKICAgICAgICBpZiAoZXF1YWxzID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0ludGVybmFsTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgICAgIH0KICAgICAgICBoYXNoQ29kZSA9IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlkZW50aWNhbChpZGVudGl0eUhhc2hDb2RlLCBoYXNoQ29kZSkgJiYKICAgICAgICAgICAgaWRlbnRpY2FsKGlkZW50aWNhbCwgZXF1YWxzKSkgewogICAgICAgICAgcmV0dXJuIG5ldyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcDxLLCBWPigpOwogICAgICAgIH0KICAgICAgICBlcXVhbHMgPz89IF9kZWZhdWx0RXF1YWxzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoYXNoQ29kZSA/Pz0gX2RlZmF1bHRIYXNoQ29kZTsKICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgIH0KICAgIHJldHVybiBuZXcgX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoTWFwPEssIFY+KGVxdWFscywgaGFzaENvZGUsIGlzVmFsaWRLZXkpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmlkZW50aXR5KCkgPT4gbmV3IF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwPEssIFY+KCk7Cn0KCkBwYXRjaApjbGFzcyBMaW5rZWRIYXNoU2V0PEU+IHsKICBAcGF0Y2gKICBmYWN0b3J5IExpbmtlZEhhc2hTZXQoCiAgICAgIHtib29sIGVxdWFscyhFIGUxLCBFIGUyKSwKICAgICAgaW50IGhhc2hDb2RlKEUgZSksCiAgICAgIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpfSkgewogICAgaWYgKGlzVmFsaWRLZXkgPT0gbnVsbCkgewogICAgICBpZiAoaGFzaENvZGUgPT0gbnVsbCkgewogICAgICAgIGlmIChlcXVhbHMgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG5ldyBfQ29tcGFjdExpbmtlZEhhc2hTZXQ8RT4oKTsKICAgICAgICB9CiAgICAgICAgaGFzaENvZGUgPSBfZGVmYXVsdEhhc2hDb2RlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpZGVudGljYWwoaWRlbnRpdHlIYXNoQ29kZSwgaGFzaENvZGUpICYmCiAgICAgICAgICAgIGlkZW50aWNhbChpZGVudGljYWwsIGVxdWFscykpIHsKICAgICAgICAgIHJldHVybiBuZXcgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXQ8RT4oKTsKICAgICAgICB9CiAgICAgICAgZXF1YWxzID8/PSBfZGVmYXVsdEVxdWFsczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaENvZGUgPz89IF9kZWZhdWx0SGFzaENvZGU7CiAgICAgIGVxdWFscyA/Pz0gX2RlZmF1bHRFcXVhbHM7CiAgICB9CiAgICByZXR1cm4gbmV3IF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaFNldDxFPihlcXVhbHMsIGhhc2hDb2RlLCBpc1ZhbGlkS2V5KTsKICB9CgogIEBwYXRjaAogIGZhY3RvcnkgTGlua2VkSGFzaFNldC5pZGVudGl0eSgpID0+IG5ldyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaFNldDxFPigpOwp9CgpAcGF0Y2gKYWJzdHJhY3QgY2xhc3MgX1NwbGF5VHJlZTxLLCBOb2RlIGV4dGVuZHMgX1NwbGF5VHJlZU5vZGU8Sz4+IHsKICAvLyBXZSBvdmVycmlkZSBfc3BsYXlNaW4gYW5kIF9zcGxheU1heCB0byBvcHRpbWl6ZSB0eXBlLWNoZWNrcy4KICBAcGF0Y2gKICBOb2RlIF9zcGxheU1pbihOb2RlIG5v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Y2guZGFydCI7CgovLyBIYXNoIHRhYmxlIHdpdGggb3BlbiBhZGRyZXNzaW5nIHRoYXQgc2VwYXJhdGVzIHRoZSBpbmRleCBmcm9tIGtleXMvdmFsdWVzLgoKLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIHJlaGFzaGluZyBvZiB0aGUgbGlua2VkIGhhc2htYXBzIGluIFtvYmplY3RzXS4gV2UKLy8gZG8gdGhpcyBlYWdlcmx5IGFmdGVyIHNuYXBzaG90IGRlc2VyaWFsaXphdGlvbi4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCnZvaWQgX3JlaGFzaE9iamVjdHMoTGlzdCBvYmplY3RzKSB7CiAgZmluYWwgaW50IGxlbmd0aCA9IG9iamVjdHMubGVuZ3RoOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgIG9iamVjdHNbaV0uX3JlZ2VuZXJhdGVJbmRleCgpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0hhc2hGaWVsZEJhc2UgewogIC8vIEVhY2ggb2NjdXBpZWQgZW50cnkgaW4gX2luZGV4IGlzIGEgZml4ZWQtc2l6ZSBpbnRlZ2VyIHRoYXQgZW5jb2RlcyBhIHBhaXI6CiAgLy8gICBbIGhhc2ggcGF0dGVybiBmb3Iga2V5IHwgaW5kZXggb2YgZW50cnkgaW4gX2RhdGEgXQogIC8vIFRoZSBoYXNoIHBhdHRlcm4gaXMgYmFzZWQgb24gaGFzaENvZGUsIGJ1dCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvLgogIC8vIFRoZSBsZW5ndGggb2YgX2luZGV4IGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3bywgYW5kIHRoZXJlIGlzIGFsd2F5cyBhdAogIC8vIGxlYXN0IG9uZSB1bm9jY3VwaWVkIGVudHJ5LgogIC8vIE5PVEU6IFdoZW4gbWFwcyBhcmUgZGVzZXJpYWxpemVkLCB0aGVpciBfaW5kZXggYW5kIF9oYXNoTWFzayBpcyByZWdlbmVyYXRlZAogIC8vIGVhZ2VybHkgYnkgX3JlZ2VuZXJhdGVJbmRleC4KICBVaW50MzJMaXN0IF9pbmRleCA9IG5ldyBVaW50MzJMaXN0KF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFKTsKCiAgLy8gQ2FjaGVkIGluLXBsYWNlIG1hc2sgZm9yIHRoZSBoYXNoIHBhdHRlcm4gY29tcG9uZW50LgogIGludCBfaGFzaE1hc2sgPSBfSGFzaEJhc2UuX2luZGV4U2l6ZVRvSGFzaE1hc2soX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwoKICAvLyBGaXhlZC1sZW5ndGggbGlzdCBvZiBrZXlzIChzZXQpIG9yIGtleS92YWx1ZSBhdCBldmVuL29kZCBpbmRpY2VzIChtYXApLgogIExpc3QgX2RhdGE7CgogIC8vIExlbmd0aCBvZiBfZGF0YSB0aGF0IGlzIHVzZWQgKGkuZS4sIGtleXMgKyB2YWx1ZXMgZm9yIGEgbWFwKS4KICBpbnQgX3VzZWREYXRhID0gMDsKCiAgLy8gTnVtYmVyIG9mIGRlbGV0ZWQga2V5cy4KICBpbnQgX2RlbGV0ZWRLZXlzID0gMDsKCiAgLy8gTm90ZTogQWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgaW4gYSBzaW5nbGUgY29uc3RydWN0b3Igc28gdGhhdCB0aGUgVk0KICAvLyByZWNvZ25pemVzIHRoZXkgY2Fubm90IGhvbGQgbnVsbCB2YWx1ZXMuIFRoaXMgbWFrZXMgYSBiaWcgKDIwJSkgcGVyZm9ybWFuY2UKICAvLyBkaWZmZXJlbmNlIG9uIHNvbWUgb3BlcmF0aW9ucy4KICBfSGFzaEZpZWxkQmFzZShpbnQgZGF0YVNpemUpIDogdGhpcy5fZGF0YSA9IG5ldyBMaXN0KGRhdGFTaXplKTsKfQoKLy8gQmFzZSBjbGFzcyBmb3IgVk0taW50ZXJuYWwgY2xhc3Nlczsga2VlcCBpbiBzeW5jIHdpdGggX0hhc2hGaWVsZEJhc2UuCmFic3RyYWN0IGNsYXNzIF9IYXNoVk1CYXNlIHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OnR5cGVkX2RhdGEjX1VpbnQzMkxpc3QiKQogIFVpbnQzMkxpc3QgZ2V0IF9pbmRleCBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfZ2V0SW5kZXgiOwogIHZvaWQgc2V0IF9pbmRleChVaW50MzJMaXN0IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0SW5kZXgiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBfaGFzaE1hc2sgbmF0aXZlICJMaW5rZWRIYXNoTWFwX2dldEhhc2hNYXNrIjsKICB2b2lkIHNldCBfaGFzaE1hc2soaW50IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0SGFzaE1hc2siOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0xpc3QiKQogIExpc3QgZ2V0IF9kYXRhIG5hdGl2ZSAiTGlua2VkSGFzaE1hcF9nZXREYXRhIjsKICB2b2lkIHNldCBfZGF0YShMaXN0IHZhbHVlKSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfc2V0RGF0YSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IF91c2VkRGF0YSBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfZ2V0VXNlZERhdGEiOwogIHZvaWQgc2V0IF91c2VkRGF0YShpbnQgdmFsdWUpIG5hdGl2ZSAiTGlua2VkSGFzaE1hcF9zZXRVc2VkRGF0YSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IF9kZWxldGVkS2V5cyBuYXRpdmUgIkxpbmtlZEhhc2hNYXBfZ2V0RGVsZXRlZEtleXMiOwogIHZvaWQgc2V0IF9kZWxldGVkS2V5cyhpbnQgdmFsdWUpIG5hdGl2ZSAiTGlua2VkSGFzaE1hcF9zZXREZWxldGVkS2V5cyI7Cn0KCi8vIFRoaXMgbWl4aW4gY2FuIGJlIGFwcGxpZWQgdG8gX0hhc2hGaWVsZEJhc2Ugb3IgX0hhc2hWTUJhc2UgKGZvcgovLyBub3JtYWwgYW5kIFZNLWludGVybmFsaXplZCBjbGFzc2VzLCByZXNwZWN0aXZlbGV5KSwgd2hpY2ggcHJvdmlkZSB0aGUKLy8gYWN0dWFsIGZpZWxkcy9hY2Nlc3NvcnMgdGhhdCB0aGlzIG1peGluIGFzc3VtZXMuCi8vIFRPRE8oa29kYSk6IENvbnNpZGVyIG1vdmluZyBmaWVsZCBjb21tZW50cyB0byBfSGFzaEZpZWxkQmFzZS4KYWJzdHJhY3QgY2xhc3MgX0hhc2hCYXNlIGltcGxlbWVudHMgX0hhc2hWTUJhc2UgewogIC8vIFRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGZvciBlYWNoIGNvbXBvbmVudCBpcyBkZXRlcm1pbmVkIGJ5IHRhYmxlIHNpemUuCiAgLy8gVGhlIGxlbmd0aCBvZiBfaW5kZXggaXMgdHdpY2UgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIF9kYXRhLCBhbmQgYm90aAogIC8vIGFyZSBkb3VibGVkIHdoZW4gX2RhdGEgaXMgZnVsbC4gVGh1cywgX2luZGV4IHdpbGwgaGF2ZSBhIG1heCBsb2FkIGZhY3RvcgogIC8vIG9mIDEvMiwgd2hpY2ggZW5hYmxlcyBvbmUgbW9yZSBiaXQgdG8gYmUgdXNlZCBmb3IgdGhlIGhhc2guCiAgLy8gVE9ETyhrb2RhKTogQ29uc2lkZXIgZ3Jvd2luZyBfZGF0YSBieSBmYWN0b3Igc3FydCgyKSwgdHdpY2UgYXMgb2Z0ZW4uCiAgc3RhdGljIGNvbnN0IGludCBfSU5JVElBTF9JTkRFWF9CSVRTID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9JTklUSUFMX0lOREVYX1NJWkUgPSAxIDw8IChfSU5JVElBTF9JTkRFWF9CSVRTICsgMSk7CgogIC8vIFVudXNlZCBhbmQgZGVsZXRlZCBlbnRyaWVzIGFyZSBtYXJrZWQgYnkgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LgogIHN0YXRpYyBjb25zdCBpbnQgX1VOVVNFRF9QQUlSID0gMDsKICBzdGF0aWMgY29uc3QgaW50IF9ERUxFVEVEX1BBSVIgPSAxOwoKICAvLyBPbiAzMi1iaXQsIHRoZSB0b3AgYml0cyBhcmUgd2FzdGVkIHRvIGF2b2lkIE1pbnQgYWxsb2NhdGlvbi4KICAvLyBUT0RPKGtvZGEpOiBSZWNsYWltIHRoZSBiaXRzIGJ5IG1ha2luZyB0aGUgY29tcGlsZXIgdHJlYXQgaGFzaCBwYXR0ZXJucwogIC8vIGFzIHVuc2lnbmVkIHdvcmRzLgogIHN0YXRpYyBpbnQgX2luZGV4U2l6ZVRvSGFzaE1hc2soaW50IGluZGV4U2l6ZSkgewogICAgaW50IGluZGV4Qml0cyA9IGluZGV4U2l6ZS5iaXRMZW5ndGggLSAyOwogICAgcmV0dXJuIGludGVybmFsLmlzNjRCaXQKICAgICAgICA/ICgxIDw8ICgzMiAtIGluZGV4Qml0cykpIC0gMQogICAgICAgIDogKDEgPDwgKDMwIC0gaW5kZXhCaXRzKSkgLSAxOwogIH0KCiAgc3RhdGljIGludCBfaGFzaFBhdHRlcm4oaW50IGZ1bGxIYXNoLCBpbnQgaGFzaE1hc2ssIGludCBzaXplKSB7CiAgICBmaW5hbCBpbnQgbWFza2VkSGFzaCA9IGZ1bGxIYXNoICYgaGFzaE1hc2s7CiAgICAvLyBUT0RPKGtvZGEpOiBDb25zaWRlciBrZWVwaW5nIGJpdCBsZW5ndGggYW5kIHVzZSBsZWZ0IHNoaWZ0LgogICAgcmV0dXJuIChtYXNrZWRIYXNoID09IDApID8gKHNpemUgPj4gMSkgOiBtYXNrZWRIYXNoICogKHNpemUgPj4gMSk7CiAgfQoKICAvLyBMaW5lYXIgcHJvYmluZy4KICBzdGF0aWMgaW50IF9maXJzdFByb2JlKGludCBmdWxsSGFzaCwgaW50IHNpemVNYXNrKSB7CiAgICBmaW5hbCBpbnQgaSA9IGZ1bGxIYXNoICYgc2l6ZU1hc2s7CiAgICAvLyBMaWdodCwgZmFzdCBzaHVmZmxlIHRvIG1pdGlnYXRlIGJhZCBoYXNoQ29kZSAoZS5nLiwgc2VxdWVudGlhbCkuCiAgICByZXR1cm4gKChpIDw8IDEpICsgaSkgJiBzaXplTWFzazsKICB9CgogIHN0YXRpYyBpbnQgX25leHRQcm9iZShpbnQgaSwgaW50IHNpemVNYXNrKSA9PiAoaSArIDEpICYgc2l6ZU1hc2s7CgogIC8vIEEgc2VsZi1sb29wIGlzIHVzZWQgdG8gbWFyayBhIGRlbGV0ZWQga2V5IG9yIHZhbHVlLgogIHN0YXRpYyBib29sIF9pc0RlbGV0ZWQoTGlzdCBkYXRhLCBPYmplY3Qga2V5T3JWYWx1ZSkgPT4KICAgICAgaWRlbnRpY2FsKGtleU9yVmFsdWUsIGRhdGEpOwogIHN0YXRpYyB2b2lkIF9zZXREZWxldGVkQXQoTGlzdCBkYXRhLCBpbnQgZCkgewogICAgZGF0YVtkXSA9IGRhdGE7CiAgfQoKICAvLyBDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkZXRlY3Rpb24gcmVsaWVzIG9uIHRoaXMgY2hlY2tzdW0gbW9ub3RvbmljYWxseQogIC8vIGluY3JlYXNpbmcgYmV0d2VlbiByZWFsbG9jYXRpb25zIG9mIF9kYXRhLgogIGludCBnZXQgX2NoZWNrU3VtID0+IF91c2VkRGF0YSArIF9kZWxldGVkS2V5czsKICBib29sIF9pc01vZGlmaWVkU2luY2UoTGlzdCBvbGREYXRhLCBpbnQgb2xkQ2hlY2tTdW0pID0+CiAgICAgICFpZGVudGljYWwoX2RhdGEsIG9sZERhdGEpIHx8IChfY2hlY2tTdW0gIT0gb2xkQ2hlY2tTdW0pOwoKICBpbnQgZ2V0IGxlbmd0aDsKfQoKY2xhc3MgX09wZXJhdG9yRXF1YWxzQW5kSGFzaENvZGUgewogIGludCBfaGFzaENvZGUoZSkgPT4gZS5oYXNoQ29kZTsKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBlMSA9PSBlMjsKfQoKY2xhc3MgX0lkZW50aWNhbEFuZElkZW50aXR5SGFzaENvZGUgewogIGludCBfaGFzaENvZGUoZSkgPT4gaWRlbnRpdHlIYXNoQ29kZShlKTsKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBpZGVudGljYWwoZTEsIGUyKTsKfQoKLy8gVk0taW50ZXJuYWxpemVkIGltcGxlbWVudGF0aW9uIG9mIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBMaW5rZWRIYXNoTWFwLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnRlcm5hbExpbmtlZEhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaFZNQmFzZQogICAgd2l0aAogICAgICAgIE1hcE1peGluPEssIFY+LAogICAgICAgIF9MaW5rZWRIYXNoTWFwTWl4aW48SywgVj4sCiAgICAgICAgX0hhc2hCYXNlLAogICAgICAgIF9PcGVyYXRvckVxdWFsc0FuZEhhc2hDb2RlCiAgICBpbXBsZW1lbnRzIExpbmtlZEhhc2hNYXA8SywgVj4gewogIF9JbnRlcm5hbExpbmtlZEhhc2hNYXAoKSB7CiAgICBfaW5kZXggPSBuZXcgVWludDMyTGlzdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSk7CiAgICBfaGFzaE1hc2sgPSBfSGFzaEJhc2UuX2luZGV4U2l6ZVRvSGFzaE1hc2soX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwogICAgX2RhdGEgPSBuZXcgTGlzdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSk7CiAgICBfdXNlZERhdGEgPSAwOwogICAgX2RlbGV0ZWRLZXlzID0gMDsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9MaW5rZWRIYXNoTWFwTWl4aW48SywgVj4gaW1wbGVtZW50cyBfSGFzaEJhc2UgewogIGludCBfaGFzaENvZGUoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMik7CiAgaW50IGdldCBfY2hlY2tTdW07CiAgYm9vbCBfaXNNb2RpZmllZFNpbmNlKExpc3Qgb2xkRGF0YSwgaW50IG9sZENoZWNrU3VtKTsKCiAgaW50IGdldCBsZW5ndGggPT4gKF91c2VkRGF0YSA+PiAxKSAtIF9kZWxldGVkS2V5czsKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIHZvaWQgX3JlaGFzaCgpIHsKICAgIGlmICgoX2RlbGV0ZWRLZXlzIDw8IDIpID4gX3VzZWREYXRhKSB7CiAgICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIHNocmlua2luZy4KICAgICAgLy8gVE9ETyhrb2RhKTogQ29uc2lkZXIgaW4tcGxhY2UgY29tcGFjdGlvbiBhbmQgbW9yZSBjb3N0bHkgQ01FIGNoZWNrLgogICAgICBfaW5pdChfaW5kZXgubGVuZ3RoLCBfaGFzaE1hc2ssIF9kYXRhLCBfdXNlZERhdGEpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhrb2RhKTogU3VwcG9ydCAzMi0+NjQgYml0IHRyYW5zaXRpb24gKGFuZCBhZGp1c3QgX2hhc2hNYXNrKS4KICAgICAgX2luaXQoX2luZGV4Lmxlbmd0aCA8PCAxLCBfaGFzaE1hc2sgPj4gMSwgX2RhdGEsIF91c2VkRGF0YSk7CiAgICB9CiAgfQoKICB2b2lkIGNsZWFyKCkgewogICAgaWYgKCFpc0VtcHR5KSB7CiAgICAgIF9pbml0KF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFLCBfaGFzaE1hc2ssIG51bGwsIDApOwogICAgfQogIH0KCiAgLy8gQWxsb2NhdGUgbmV3IF9pbmRleCBhbmQgX2RhdGEsIGFuZCBvcHRpb25hbGx5IGNvcHkgZXhpc3RpbmcgY29udGVudHMuCiAgdm9pZCBfaW5pdChpbnQgc2l6ZSwgaW50IGhhc2hNYXNrLCBMaXN0IG9sZERhdGEsIGludCBvbGRVc2VkKSB7CiAgICBhc3NlcnQoc2l6ZSAmIChzaXplIC0gMSkgPT0gMCk7CiAgICBhc3NlcnQoX0hhc2hCYXNlLl9VTlVTRURfUEFJUiA9PSAwKTsKICAgIF9pbmRleCA9IG5ldyBVaW50MzJMaXN0KHNpemUpOwogICAgX2hhc2hNYXNrID0gaGFzaE1hc2s7CiAgICBfZGF0YSA9IG5ldyBMaXN0KHNpemUpOwogICAgX3VzZWREYXRhID0gMDsKICAgIF9kZWxldGVkS2V5cyA9IDA7CiAgICBpZiAob2xkRGF0YSAhPSBudWxsKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkVXNlZDsgaSArPSAyKSB7CiAgICAgICAgdmFyIGtleSA9IG9sZERhdGFbaV07CiAgICAgICAgaWYgKCFfSGFzaEJhc2UuX2lzRGVsZXRlZChvbGREYXRhLCBrZXkpKSB7CiAgICAgICAgICAvLyBUT0RPKGtvZGEpOiBXaGlsZSB0aGVyZSBhcmUgZW5vdWdoIGhhc2ggYml0cywgYXZvaWQgaGFzaENvZGUgY2FsbHMuCiAgICAgICAgICB0aGlzW2tleV0gPSBvbGREYXRhW2kgKyAxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbX3JlaGFzaE9iamVjdHNdIChzZWUgYWJvdmUpLgogIHZvaWQgX3JlZ2VuZXJhdGVJbmRleCgpIHsKICAgIF9pbmRleCA9IG5ldyBVaW50MzJMaXN0KF9kYXRhLmxlbmd0aCk7CiAgICBhc3NlcnQoX2hhc2hNYXNrID09IDApOwogICAgX2hhc2hNYXNrID0gX0hhc2hCYXNlLl9pbmRleFNpemVUb0hhc2hNYXNrKF9pbmRleC5sZW5ndGgpOwogICAgZmluYWwgaW50IHRtcFVzZWQgPSBfdXNlZERhdGE7CiAgICBfdXNlZERhdGEgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBVc2VkOyBpICs9IDIpIHsKICAgICAgdGhpc1tfZGF0YVtpXV0gPSBfZGF0YVtpICsgMV07CiAgICB9CiAgfQoKICB2b2lkIF9pbnNlcnQoSyBrZXksIFYgdmFsdWUsIGludCBoYXNoUGF0dGVybiwgaW50IGkpIHsKICAgIGlmIChfdXNlZERhdGEgPT0gX2RhdGEubGVuZ3RoKSB7CiAgICAgIF9yZWhhc2goKTsKICAgICAgdGhpc1trZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBhc3NlcnQoMSA8PSBoYXNoUGF0dGVybiAmJiBoYXNoUGF0dGVybiA8ICgxIDw8IDMyKSk7CiAgICAgIGZpbmFsIGludCBpbmRleCA9IF91c2VkRGF0YSA+PiAxOwogICAgICBhc3NlcnQoKGluZGV4ICYgaGFzaFBhdHRlcm4pID09IDApOwogICAgICBfaW5kZXhbaV0gPSBoYXNoUGF0dGVybiB8IGluZGV4OwogICAgICBfZGF0YVtfdXNlZERhdGErK10gPSBrZXk7CiAgICAgIF9kYXRhW191c2VkRGF0YSsrXSA9IHZhbHVlOwogICAgfQogIH0KCiAgLy8gSWYga2V5IGlzIHByZXNlbnQsIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB2YWx1ZSBpbiBfZGF0YSwgZWxzZSByZXR1cm5zCiAgLy8gdGhlIG5lZ2F0ZWQgaW5zZXJ0aW9uIHBvaW50IGluIF9pbmRleC4KICBpbnQgX2ZpbmRWYWx1ZU9ySW5zZXJ0UG9pbnQoSyBrZXksIGludCBmdWxsSGFzaCwgaW50IGhhc2hQYXR0ZXJuLCBpbnQgc2l6ZSkgewogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgZmlyc3REZWxldGVkID0gLTE7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgPT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBpZiAoZmlyc3REZWxldGVkIDwgMCkgewogICAgICAgICAgZmlyc3REZWxldGVkID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmluYWwgaW50IGVudHJ5ID0gaGFzaFBhdHRlcm4gXiBwYWlyOwogICAgICAgIGlmIChlbnRyeSA8IG1heEVudHJpZXMpIHsKICAgICAgICAgIGZpbmFsIGludCBkID0gZW50cnkgPDwgMTsKICAgICAgICAgIGlmIChfZXF1YWxzKGtleSwgX2RhdGFbZF0pKSB7CiAgICAgICAgICAgIHJldHVybiBkICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaSA9IF9IYXNoQmFzZS5fbmV4dFByb2JlKGksIHNpemVNYXNrKTsKICAgICAgcGFpciA9IF9pbmRleFtpXTsKICAgIH0KICAgIHJldHVybiBmaXJzdERlbGV0ZWQgPj0gMCA/IC1maXJzdERlbGV0ZWQgOiAtaTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgZnVsbEhhc2ggPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGludCBoYXNoUGF0dGVybiA9IF9IYXNoQmFzZS5faGFzaFBhdHRlcm4oZnVsbEhhc2gsIF9oYXNoTWFzaywgc2l6ZSk7CiAgICBmaW5hbCBpbnQgZCA9IF9maW5kVmFsdWVPckluc2VydFBvaW50KGtleSwgZnVsbEhhc2gsIGhhc2hQYXR0ZXJuLCBzaXplKTsKICAgIGlmIChkID4gMCkgewogICAgICBfZGF0YVtkXSA9IHZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgZmluYWwgaW50IGkgPSAtZDsKICAgICAgX2luc2VydChrZXksIHZhbHVlLCBoYXNoUGF0dGVybiwgaSk7CiAgICB9CiAgfQoKICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIGZpbmFsIGludCBzaXplID0gX2luZGV4Lmxlbmd0aDsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGZpbmFsIGludCBkID0gX2ZpbmRWYWx1ZU9ySW5zZXJ0UG9pbnQoa2V5LCBmdWxsSGFzaCwgaGFzaFBhdHRlcm4sIHNpemUpOwogICAgaWYgKGQgPiAwKSB7CiAgICAgIHJldHVybiBfZGF0YVtkXTsKICAgIH0KICAgIC8vICdpZkFic2VudCcgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIG1hcC4KICAgIExpc3Qgb2xkRGF0YSA9IF9kYXRhOwogICAgaW50IG9sZENoZWNrU3VtID0gX2NoZWNrU3VtOwogICAgViB2YWx1ZSA9IGlmQWJzZW50KCk7CiAgICBpZiAoX2lzTW9kaWZpZWRTaW5jZShvbGREYXRhLCBvbGRDaGVja1N1bSkpIHsKICAgICAgdGhpc1trZXldID0gdmFsdWU7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBpbnQgaSA9IC1kOwogICAgICBfaW5zZXJ0KGtleSwgdmFsdWUsIGhhc2hQYXR0ZXJuLCBpKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIGZpbmFsIGludCBzaXplID0gX2luZGV4Lmxlbmd0aDsKICAgIGZpbmFsIGludCBzaXplTWFzayA9IHNpemUgLSAxOwogICAgZmluYWwgaW50IG1heEVudHJpZXMgPSBzaXplID4+IDE7CiAgICBmaW5hbCBpbnQgZnVsbEhhc2ggPSBfaGFzaENvZGUoa2V5KTsKICAgIGZpbmFsIGludCBoYXNoUGF0dGVybiA9IF9IYXNoQmFzZS5faGFzaFBhdHRlcm4oZnVsbEhhc2gsIF9oYXNoTWFzaywgc2l6ZSk7CiAgICBpbnQgaSA9IF9IYXNoQmFzZS5fZmlyc3RQcm9iZShmdWxsSGFzaCwgc2l6ZU1hc2spOwogICAgaW50IHBhaXIgPSBfaW5kZXhbaV07CiAgICB3aGlsZSAocGFpciAhPSBfSGFzaEJhc2UuX1VOVVNFRF9QQUlSKSB7CiAgICAgIGlmIChwYWlyICE9IF9IYXNoQmFzZS5fREVMRVRFRF9QQUlSKSB7CiAgICAgICAgZmluYWwgaW50IGVudHJ5ID0gaGFzaFBhdHRlcm4gXiBwYWlyOwogICAgICAgIGlmIChlbnRyeSA8IG1heEVudHJpZXMpIHsKICAgICAgICAgIGZpbmFsIGludCBkID0gZW50cnkgPDwgMTsKICAgICAgICAgIGlmIChfZXF1YWxzKGtleSwgX2RhdGFbZF0pKSB7CiAgICAgICAgICAgIF9pbmRleFtpXSA9IF9IYXNoQmFzZS5fREVMRVRFRF9QQUlSOwogICAgICAgICAgICBfSGFzaEJhc2UuX3NldERlbGV0ZWRBdChfZGF0YSwgZCk7CiAgICAgICAgICAgIFYgdmFsdWUgPSBfZGF0YVtkICsgMV07CiAgICAgICAgICAgIF9IYXNoQmFzZS5fc2V0RGVsZXRlZEF0KF9kYXRhLCBkICsgMSk7CiAgICAgICAgICAgICsrX2RlbGV0ZWRLZXlzOwogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSBfSGFzaEJhc2UuX25leHRQcm9iZShpLCBzaXplTWFzayk7CiAgICAgIHBhaXIgPSBfaW5kZXhbaV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIElmIGtleSBpcyBhYnNlbnQsIHJldHVybiBfZGF0YSAod2hpY2ggaXMgbmV2ZXIgYSB2YWx1ZSkuCiAgT2JqZWN0IF9nZXRWYWx1ZU9yRGF0YShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgc2l6ZU1hc2sgPSBzaXplIC0gMTsKICAgIGZpbmFsIGludCBtYXhFbnRyaWVzID0gc2l6ZSA+PiAxOwogICAgZmluYWwgaW50IGZ1bGxIYXNoID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBpbnQgaGFzaFBhdHRlcm4gPSBfSGFzaEJhc2UuX2hhc2hQYXR0ZXJuKGZ1bGxIYXNoLCBfaGFzaE1hc2ssIHNpemUpOwogICAgaW50IGkgPSBfSGFzaEJhc2UuX2ZpcnN0UHJvYmUoZnVsbEhhc2gsIHNpemVNYXNrKTsKICAgIGludCBwYWlyID0gX2luZGV4W2ldOwogICAgd2hpbGUgKHBhaXIgIT0gX0hhc2hCYXNlLl9VTlVTRURfUEFJUikgewogICAgICBpZiAocGFpciAhPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUikgewogICAgICAgIGZpbmFsIGludCBlbnRyeSA9IGhhc2hQYXR0ZXJuIF4gcGFpcjsKICAgICAgICBpZiAoZW50cnkgPCBtYXhFbnRyaWVzKSB7CiAgICAgICAgICBmaW5hbCBpbnQgZCA9IGVudHJ5IDw8IDE7CiAgICAgICAgICBpZiAoX2VxdWFscyhrZXksIF9kYXRhW2RdKSkgewogICAgICAgICAgICByZXR1cm4gX2RhdGFbZCArIDFdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpID0gX0hhc2hCYXNlLl9uZXh0UHJvYmUoaSwgc2l6ZU1hc2spOwogICAgICBwYWlyID0gX2luZGV4W2ldOwogICAgfQogICAgcmV0dXJuIF9kYXRhOwogIH0KCiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PiAhaWRlbnRpY2FsKF9kYXRhLCBfZ2V0VmFsdWVPckRhdGEoa2V5KSk7CgogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgdmFyIHYgPSBfZ2V0VmFsdWVPckRhdGEoa2V5KTsKICAgIHJldHVybiBpZGVudGljYWwoX2RhdGEsIHYpID8gbnVsbCA6IGludGVybmFsLnVuc2FmZUNhc3Q8Vj4odik7CiAgfQoKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICBmb3IgKHZhciB2IGluIHZhbHVlcykgewogICAgICAvLyBTcGVjLiBzYXlzIHRoaXMgc2hvdWxkIGFsd2F5cyB1c2UgIj09IiwgYWxzbyBmb3IgaWRlbnRpdHkgbWFwcywgZXRjLgogICAgICBpZiAodiA9PSB2YWx1ZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKEsga2V5LCBWIHZhbHVlKSkgewogICAgdmFyIGtpID0ga2V5cy5pdGVyYXRvcjsKICAgIHZhciB2aSA9IHZhbHVlcy5pdGVyYXRvcjsKICAgIHdoaWxlIChraS5tb3ZlTmV4dCgpKSB7CiAgICAgIHZpLm1vdmVOZXh0KCk7CiAgICAgIGYoa2kuY3VycmVudCwgdmkuY3VycmVudCk7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyA9PgogICAgICBuZXcgX0NvbXBhY3RJdGVyYWJsZTxLPih0aGlzLCBfZGF0YSwgX3VzZWREYXRhLCAtMiwgMik7CiAgSXRlcmFibGU8Vj4gZ2V0IHZhbHVlcyA9PgogICAgICBuZXcgX0NvbXBhY3RJdGVyYWJsZTxWPih0aGlzLCBfZGF0YSwgX3VzZWREYXRhLCAtMSwgMik7Cn0KCmNsYXNzIF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwPEssIFY+IGV4dGVuZHMgX0hhc2hGaWVsZEJhc2UKICAgIHdpdGgKICAgICAgICBNYXBNaXhpbjxLLCBWPiwKICAgICAgICBfTGlua2VkSGFzaE1hcE1peGluPEssIFY+LAogICAgICAgIF9IYXNoQmFzZSwKICAgICAgICBfSWRlbnRpY2FsQW5kSWRlbnRpdHlIYXNoQ29kZQogICAgaW1wbGVtZW50cyBMaW5rZWRIYXNoTWFwPEssIFY+IHsKICBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcCgpIDogc3VwZXIoX0hhc2hCYXNlLl9JTklUSUFMX0lOREVYX1NJWkUpOwp9CgpjbGFzcyBfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hNYXA8SywgVj4gZXh0ZW5kcyBfSGFzaEZpZWxkQmFzZQogICAgd2l0aCBNYXBNaXhpbjxLLCBWPiwgX0xpbmtlZEhhc2hNYXBNaXhpbjxLLCBWPiwgX0hhc2hCYXNlCiAgICBpbXBsZW1lbnRzIExpbmtlZEhhc2hNYXA8SywgVj4gewogIGZpbmFsIF9lcXVhbGl0eTsKICBmaW5hbCBfaGFzaGVyOwogIGZpbmFsIF92YWxpZEtleTsKCiAgLy8gVE9ETyhrb2RhKTogQXNrIGdicmFjaGEgd2h5IEkgY2Fubm90IGhhdmUgZmllbGRzIF9lcXVhbHMvX2hhc2hDb2RlLgogIGludCBfaGFzaENvZGUoZSkgPT4gX2hhc2hlcihlKTsKICBib29sIF9lcXVhbHMoZTEsIGUyKSA9PiBfZXF1YWxpdHkoZTEsIGUyKTsKCiAgYm9vbCBjb250YWluc0tleShPYmplY3QgbykgPT4gX3ZhbGlkS2V5KG8pID8gc3VwZXIuY29udGFpbnNLZXkobykgOiBmYWxzZTsKICBWIG9wZXJhdG9yIFtdKE9iamVjdCBvKSA9PiBfdmFsaWRLZXkobykgPyBzdXBlcltvXSA6IG51bGw7CiAgViByZW1vdmUoT2JqZWN0IG8pID0+IF92YWxpZEtleShvKSA/IHN1cGVyLnJlbW92ZShvKSA6IG51bGw7CgogIF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaE1hcCh0aGlzLl9lcXVhbGl0eSwgdGhpcy5faGFzaGVyLCB2YWxpZEtleSkKICAgICAgOiBfdmFsaWRLZXkgPSAodmFsaWRLZXkgIT0gbnVsbCkgPyB2YWxpZEtleSA6IG5ldyBfVHlwZVRlc3Q8Sz4oKS50ZXN0LAogICAgICAgIHN1cGVyKF9IYXNoQmFzZS5fSU5JVElBTF9JTkRFWF9TSVpFKTsKfQoKLy8gSXRlcmF0ZXMgdGhyb3VnaCBfZGF0YVtfb2Zmc2V0ICsgX3N0ZXBdLCBfZGF0YVtfb2Zmc2V0ICsgMipfc3RlcF0sIC4uLgovLyBhbmQgY2hlY2tzIGZvciBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KY2xhc3MgX0NvbXBhY3RJdGVyYWJsZTxFPiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSGFzaEJhc2UgX3RhYmxlOwogIGZpbmFsIExpc3QgX2RhdGE7CiAgZmluYWwgaW50IF9sZW47CiAgZmluYWwgaW50IF9vZmZzZXQ7CiAgZmluYWwgaW50IF9zdGVwOwoKICBfQ29tcGFjdEl0ZXJhYmxlKAogICAgICB0aGlzLl90YWJsZSwgdGhpcy5fZGF0YSwgdGhpcy5fbGVuLCB0aGlzLl9vZmZzZXQsIHRoaXMuX3N0ZXApOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4KICAgICAgbmV3IF9Db21wYWN0SXRlcmF0b3I8RT4oX3RhYmxlLCBfZGF0YSwgX2xlbiwgX29mZnNldCwgX3N0ZXApOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfdGFibGUubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gbGVuZ3RoID09IDA7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKfQoKY2xhc3MgX0NvbXBhY3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBfSGFzaEJhc2UgX3RhYmxlOwogIGZpbmFsIExpc3QgX2RhdGE7CiAgZmluYWwgaW50IF9sZW47CiAgaW50IF9vZmZzZXQ7CiAgZmluYWwgaW50IF9zdGVwOwogIGZpbmFsIGludCBfY2hlY2tTdW07CiAgRSBjdXJyZW50OwoKICBfQ29tcGFjdEl0ZXJhdG9yKAogICAgICBfSGFzaEJhc2UgdGFibGUsIHRoaXMuX2RhdGEsIHRoaXMuX2xlbiwgdGhpcy5fb2Zmc2V0LCB0aGlzLl9zdGVwKQogICAgICA6IF90YWJsZSA9IHRhYmxlLAogICAgICAgIF9jaGVja1N1bSA9IHRhYmxlLl9jaGVja1N1bTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfdGFibGUuX2lzTW9kaWZpZWRTaW5jZShfZGF0YSwgX2NoZWNrU3VtKSkgewogICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKF90YWJsZSk7CiAgICB9CiAgICBkbyB7CiAgICAgIF9vZmZzZXQgKz0gX3N0ZXA7CiAgICB9IHdoaWxlIChfb2Zmc2V0IDwgX2xlbiAmJiBfSGFzaEJhc2UuX2lzRGVsZXRlZChfZGF0YSwgX2RhdGFbX29mZnNldF0pKTsKICAgIGlmIChfb2Zmc2V0IDwgX2xlbikgewogICAgICBjdXJyZW50ID0gaW50ZXJuYWwudW5zYWZlQ2FzdDxFPihfZGF0YVtfb2Zmc2V0XSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn0KCi8vIFNldCBpbXBsZW1lbnRhdGlvbiwgYW5hbG9nb3VzIHRvIF9Db21wYWN0TGlua2VkSGFzaE1hcC4KY2xhc3MgX0NvbXBhY3RMaW5rZWRIYXNoU2V0PEU+IGV4dGVuZHMgX0hhc2hGaWVsZEJhc2UKICAgIHdpdGggX0hhc2hCYXNlLCBfT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZSwgU2V0TWl4aW48RT4KICAgIGltcGxlbWVudHMgTGlua2VkSGFzaFNldDxFPiB7CiAgX0NvbXBhY3RMaW5rZWRIYXNoU2V0KCkgOiBzdXBlcihfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSA+PiAxKSB7CiAgICBhc3NlcnQoX0hhc2hCYXNlLl9VTlVTRURfUEFJUiA9PSAwKTsKICB9CgogIHN0YXRpYyBTZXQ8Uj4gX25ld0VtcHR5PFI+KCkgPT4gbmV3IF9Db21wYWN0TGlua2VkSGFzaFNldDxSPigpOwoKICBTZXQ8Uj4gY2FzdDxSPigpID0+IFNldC5jYXN0RnJvbTxFLCBSPih0aGlzLCBuZXdTZXQ6IF9uZXdFbXB0eSk7CiAgaW50IGdldCBsZW5ndGggPT4gX3VzZWREYXRhIC0gX2RlbGV0ZWRLZXlzOwoKICBFIGdldCBmaXJzdCB7CiAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBfdXNlZERhdGE7IG9mZnNldCsrKSB7CiAgICAgIE9iamVjdCBjdXJyZW50ID0gX2RhdGFbb2Zmc2V0XTsKICAgICAgaWYgKCFfSGFzaEJhc2UuX2lzRGVsZXRlZChfZGF0YSwgY3VycmVudCkpIHsKICAgICAgICByZXR1cm4gY3VycmVudDsKICAgICAgfQogICAgfQogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGZvciAoaW50IG9mZnNldCA9IF91c2VkRGF0YSAtIDE7IG9mZnNldCA+PSAwOyBvZmZzZXQtLSkgewogICAgICBPYmplY3QgY3VycmVudCA9IF9kYXRhW29mZnNldF07CiAgICAgIGlmICghX0hhc2hCYXNlLl9pc0RlbGV0ZWQoX2RhdGEsIGN1cnJlbnQpKSB7CiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgIH0KICAgIH0KICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgdm9pZCBfcmVoYXNoKCkgewogICAgaWYgKChfZGVsZXRlZEtleXMgPDwgMSkgPiBfdXNlZERhdGEpIHsKICAgICAgX2luaXQoX2luZGV4Lmxlbmd0aCwgX2hhc2hNYXNrLCBfZGF0YSwgX3VzZWREYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIF9pbml0KF9pbmRleC5sZW5ndGggPDwgMSwgX2hhc2hNYXNrID4+IDEsIF9kYXRhLCBfdXNlZERhdGEpOwogICAgfQogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIGlmICghaXNFbXB0eSkgewogICAgICBfaW5pdChfSGFzaEJhc2UuX0lOSVRJQUxfSU5ERVhfU0laRSwgX2hhc2hNYXNrLCBudWxsLCAwKTsKICAgIH0KICB9CgogIHZvaWQgX2luaXQoaW50IHNpemUsIGludCBoYXNoTWFzaywgTGlzdCBvbGREYXRhLCBpbnQgb2xkVXNlZCkgewogICAgX2luZGV4ID0gbmV3IFVpbnQzMkxpc3Qoc2l6ZSk7CiAgICBfaGFzaE1hc2sgPSBoYXNoTWFzazsKICAgIF9kYXRhID0gbmV3IExpc3Qoc2l6ZSA+PiAxKTsKICAgIF91c2VkRGF0YSA9IDA7CiAgICBfZGVsZXRlZEtleXMgPSAwOwogICAgaWYgKG9sZERhdGEgIT0gbnVsbCkgewogICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZFVzZWQ7IGkgKz0gMSkgewogICAgICAgIHZhciBrZXkgPSBvbGREYXRhW2ldOwogICAgICAgIGlmICghX0hhc2hCYXNlLl9pc0RlbGV0ZWQob2xkRGF0YSwga2V5KSkgewogICAgICAgICAgYWRkKGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBib29sIGFkZChFIGtleSkgewogICAgZmluYWwgaW50IHNpemUgPSBfaW5kZXgubGVuZ3RoOwogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgZmlyc3REZWxldGVkID0gLTE7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgPT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBpZiAoZmlyc3REZWxldGVkIDwgMCkgewogICAgICAgICAgZmlyc3REZWxldGVkID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmluYWwgaW50IGQgPSBoYXNoUGF0dGVybiBeIHBhaXI7CiAgICAgICAgaWYgKGQgPCBtYXhFbnRyaWVzICYmIF9lcXVhbHMoa2V5LCBfZGF0YVtkXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaSA9IF9IYXNoQmFzZS5fbmV4dFByb2JlKGksIHNpemVNYXNrKTsKICAgICAgcGFpciA9IF9pbmRleFtpXTsKICAgIH0KICAgIGlmIChfdXNlZERhdGEgPT0gX2RhdGEubGVuZ3RoKSB7CiAgICAgIF9yZWhhc2goKTsKICAgICAgYWRkKGtleSk7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBpbnQgaW5zZXJ0aW9uUG9pbnQgPSAoZmlyc3REZWxldGVkID49IDApID8gZmlyc3REZWxldGVkIDogaTsKICAgICAgYXNzZXJ0KDEgPD0gaGFzaFBhdHRlcm4gJiYgaGFzaFBhdHRlcm4gPCAoMSA8PCAzMikpOwogICAgICBhc3NlcnQoKGhhc2hQYXR0ZXJuICYgX3VzZWREYXRhKSA9PSAwKTsKICAgICAgX2luZGV4W2luc2VydGlvblBvaW50XSA9IGhhc2hQYXR0ZXJuIHwgX3VzZWREYXRhOwogICAgICBfZGF0YVtfdXNlZERhdGErK10gPSBrZXk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8vIElmIGtleSBpcyBhYnNlbnQsIHJldHVybiBfZGF0YSAod2hpY2ggaXMgbmV2ZXIgYSB2YWx1ZSkuCiAgT2JqZWN0IF9nZXRLZXlPckRhdGEoT2JqZWN0IGtleSkgewogICAgZmluYWwgaW50IHNpemUgPSBfaW5kZXgubGVuZ3RoOwogICAgZmluYWwgaW50IHNpemVNYXNrID0gc2l6ZSAtIDE7CiAgICBmaW5hbCBpbnQgbWF4RW50cmllcyA9IHNpemUgPj4gMTsKICAgIGZpbmFsIGludCBmdWxsSGFzaCA9IF9oYXNoQ29kZShrZXkpOwogICAgZmluYWwgaW50IGhhc2hQYXR0ZXJuID0gX0hhc2hCYXNlLl9oYXNoUGF0dGVybihmdWxsSGFzaCwgX2hhc2hNYXNrLCBzaXplKTsKICAgIGludCBpID0gX0hhc2hCYXNlLl9maXJzdFByb2JlKGZ1bGxIYXNoLCBzaXplTWFzayk7CiAgICBpbnQgcGFpciA9IF9pbmRleFtpXTsKICAgIHdoaWxlIChwYWlyICE9IF9IYXNoQmFzZS5fVU5VU0VEX1BBSVIpIHsKICAgICAgaWYgKHBhaXIgIT0gX0hhc2hCYXNlLl9ERUxFVEVEX1BBSVIpIHsKICAgICAgICBmaW5hbCBpbnQgZCA9IGhhc2hQYXR0ZXJuIF4gcGFpcjsKICAgICAgICBpZiAoZCA8IG1heEVudHJpZXMgJiYgX2VxdWFscyhrZXksIF9kYXRhW2RdKSkgewogICAgICAgICAgcmV0dXJuIF9kYXRhW2RdOyAvLyBOb3RlOiBNdXN0IHJldHVybiB0aGUgZXhpc3Rpbmcga2V5LgogICAgICAgIH0KICAgICAgfQogICAgICBpID0gX0hhc2hCYXNlLl9uZXh0UHJvYmUoaSwgc2l6ZU1hc2spOwogICAgICBwYWlyID0gX2luZGV4W2ldOwogICAgfQogICAgcmV0dXJuIF9kYXRhOwogIH0KCiAgRSBsb29rdXAoT2JqZWN0IGtleSkgewogICAgdmFyIGsgPSBfZ2V0S2V5T3JEYXRhKGtleSk7CiAgICByZXR1cm4gaWRlbnRpY2FsKF9kYXRhLCBrKSA/IG51bGwgOiBrOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3Qga2V5KSA9PiAhaWRlbnRpY2FsKF9kYXRhLCBfZ2V0S2V5T3JEYXRhKGtleSkpOwoKICBib29sIHJlbW92ZShPYmplY3Qga2V5KSB7CiAgICBmaW5hbCBpbnQgc2l6ZSA9IF9pbmRleC5sZW5ndGg7CiAgICBmaW5hbCBpbnQgc2l6ZU1hc2sgPSBzaXplIC0gMTsKICAgIGZpbmFsIGludCBtYXhFbnRyaWVzID0gc2l6ZSA+PiAxOwogICAgZmluYWwgaW50IGZ1bGxIYXNoID0gX2hhc2hDb2RlKGtleSk7CiAgICBmaW5hbCBpbnQgaGFzaFBhdHRlcm4gPSBfSGFzaEJhc2UuX2hhc2hQYXR0ZXJuKGZ1bGxIYXNoLCBfaGFzaE1hc2ssIHNpemUpOwogICAgaW50IGkgPSBfSGFzaEJhc2UuX2ZpcnN0UHJvYmUoZnVsbEhhc2gsIHNpemVNYXNrKTsKICAgIGludCBwYWlyID0gX2luZGV4W2ldOwogICAgd2hpbGUgKHBhaXIgIT0gX0hhc2hCYXNlLl9VTlVTRURfUEFJUikgewogICAgICBpZiAocGFpciAhPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUikgewogICAgICAgIGZpbmFsIGludCBkID0gaGFzaFBhdHRlcm4gXiBwYWlyOwogICAgICAgIGlmIChkIDwgbWF4RW50cmllcyAmJiBfZXF1YWxzKGtleSwgX2RhdGFbZF0pKSB7CiAgICAgICAgICBfaW5kZXhbaV0gPSBfSGFzaEJhc2UuX0RFTEVURURfUEFJUjsKICAgICAgICAgIF9IYXNoQmFzZS5fc2V0RGVsZXRlZEF0KF9kYXRhLCBkKTsKICAgICAgICAgICsrX2RlbGV0ZWRLZXlzOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGkgPSBfSGFzaEJhc2UuX25leHRQcm9iZShpLCBzaXplTWFzayk7CiAgICAgIHBhaXIgPSBfaW5kZXhbaV07CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4KICAgICAgbmV3IF9Db21wYWN0SXRlcmF0b3I8RT4odGhpcywgX2RhdGEsIF91c2VkRGF0YSwgLTEsIDEpOwoKICAvLyBSZXR1cm5zIGEgc2V0IG9mIHRoZSBzYW1lIHR5cGUsIGFsdGhvdWdoIHRoaXMKICAvLyBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIHNwZWMuIChGb3IgaW5zdGFuY2UsIGFsd2F5cyB1c2luZyBhbiBpZGVudGl0eSBzZXQKICAvLyB3b3VsZCBiZSB0ZWNobmljYWxseSBjb3JyZWN0LCBhbGJlaXQgc3VycHJpc2luZy4pCiAgU2V0PEU+IHRvU2V0KCkgPT4gbmV3IF9Db21wYWN0TGlua2VkSGFzaFNldDxFPigpLi5hZGRBbGwodGhpcyk7CgogIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbX3JlaGFzaE9iamVjdHNdIChzZWUgYWJvdmUpLgogIHZvaWQgX3JlZ2VuZXJhdGVJbmRleCgpIHsKICAgIF9yZWhhc2goKTsKICB9Cn0KCmNsYXNzIF9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoU2V0PEU+IGV4dGVuZHMgX0NvbXBhY3RMaW5rZWRIYXNoU2V0PEU+CiAgICB3aXRoIF9JZGVudGljYWxBbmRJZGVudGl0eUhhc2hDb2RlIHsKICBTZXQ8RT4gdG9TZXQoKSA9PiBuZXcgX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hTZXQ8RT4oKS4uYWRkQWxsKHRoaXMpOwoKICBzdGF0aWMgU2V0PFI+IF9uZXdFbXB0eTxSPigpID0+IG5ldyBfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaFNldDxSPigpOwoKICBTZXQ8Uj4gY2FzdDxSPigpID0+IFNldC5jYXN0RnJvbTxFLCBSPih0aGlzLCBuZXdTZXQ6IF9uZXdFbXB0eSk7Cn0KCmNsYXNzIF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaFNldDxFPiBleHRlbmRzIF9Db21wYWN0TGlua2VkSGFzaFNldDxFPiB7CiAgZmluYWwgX2VxdWFsaXR5OwogIGZpbmFsIF9oYXNoZXI7CiAgZmluYWwgX3ZhbGlkS2V5OwoKICBpbnQgX2hhc2hDb2RlKGUpID0+IF9oYXNoZXIoZSk7CiAgYm9vbCBfZXF1YWxzKGUxLCBlMikgPT4gX2VxdWFsaXR5KGUxLCBlMik7CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IG8pID0+IF92YWxpZEtleShvKSA/IHN1cGVyLmNvbnRhaW5zKG8pIDogZmFsc2U7CiAgRSBsb29rdXAoT2JqZWN0IG8pID0+IF92YWxpZEtleShvKSA/IHN1cGVyLmxvb2t1cChvKSA6IG51bGw7CiAgYm9vbCByZW1vdmUoT2JqZWN0IG8pID0+IF92YWxpZEtleShvKSA/IHN1cGVyLnJlbW92ZShvKSA6IGZhbHNlOwoKICBfQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hTZXQodGhpcy5fZXF1YWxpdHksIHRoaXMuX2hhc2hlciwgdmFsaWRLZXkpCiAgICAgIDogX3ZhbGlkS2V5ID0gKHZhbGlkS2V5ICE9IG51bGwpID8gdmFsaWRLZXkgOiBuZXcgX1R5cGVUZXN0PEU+KCkudGVzdDsKCiAgU2V0PFI+IGNhc3Q8Uj4oKSA9PiBTZXQuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgU2V0PEU+IHRvU2V0KCkgPT4KICAgICAgbmV3IF9Db21wYWN0TGlua2VkQ3VzdG9tSGFzaFNldDxFPihfZXF1YWxpdHksIF9oYXNoZXIsIF92YWxpZEtleSkKICAgICAgICAuLmFkZEFsbCh0aGlzKTsKfQqCjgBOTjwBJAFOAVEzIiQlJSMEAgEgUDpOSyFRIkUBOlEBTQ4BQxUBHRgBTVEkQgIBSR1BOUUBNDhEATUxPQE0OEQBND5KAgFDSTRBMk1MTkFLLEkBRSUmAUJNGDMtHCYnBAFCMENHBAEVNydIJgQBRAE5OiMwFAQBTTAxOkABEgIBIyIkAgEmKy0CAUoaNwkYIxMjJR08TzUTFgQCAUAUGBU4ATUjIwETKylNOQ1LQwYEAREUQAYEAUtCJCkjGhwTFhstHjNRJgoIBgQBPBwrHD8jEyslBgQBOSURGQ07KConICIGBAFOLFAjJjcbGi0tIBwKDy4iJCgaDAoILRgGMwQBJiQpT00RGA0YKwYEASckKU9NERcGMBohGjIZDRgrBhIEARkkIyYpTzcaLS0uIiQoMS8kMxwaDAoILRgGEQQBPickIyYpTzcaLS0uIiQoIQwKCC0YBhIEAUsBHiJDBAElHE4YFQgGEgQBKRweHBUhBgQBGj4cPgIBQQkYIxMmJUoCAT8+JRMREwFJIi0BTT0/AUZNLgIBSiswGhQSFRMBFEUBHkQBIyMjAgEzGhQSDxMXDQEUSBglARQ1NQYJGE0aOBMNFhQGBAIBOzY8IkgpBAFCAUMuARA5JjMYCAYsBAEPPiYzGAgGLAQBEys5DUMGBAERFEAGBAFCIxohExYbLR4zFAoIBgQBFCQjJilPNxsaLS0gHAoPKjgYCggtGAYlERANSTsuOCAGEQQBPiUkIyYpTzcaLS0qOEIKCC0YBhIEARkgKwQBRgEcJCMmKU83Gi0tKjgvLRoXCggtGAYSBAEePgEzTjdCATwcDwQCAUgpSgFKAUMCAUgTERMBIi0BRz9DAUZNATAUSBgCASdkYXJ0OmNvbGxlY3Rpb24tcGF0Y2gvY29tcGFjdF9oYXNoLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vbWFwcy5kYXJ0rWAvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gQmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGEgW01hcF0uCi8vLwovLy8gVGhpcyBjbGFzcyBoYXMgYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgYnV0IGZpdmUgb2YgdGhlIG1lbWJlcnMgb2YKLy8vIFtNYXBdLgovLy8gQSBiYXNpYyBgTWFwYCBjbGFzcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgZXh0ZW5kaW5nIHRoaXMgY2xhc3MgYW5kCi8vLyBpbXBsZW1lbnRpbmcgYGtleXNgLCBgb3BlcmF0b3JbXWAsIGBvcGVyYXRvcltdPWAsIGByZW1vdmVgIGFuZCBgY2xlYXJgLgovLy8gVGhlIHJlbWFpbmluZyBvcGVyYXRpb25zIGFyZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGVzZSBmaXZlLgovLy8KLy8vIFRoZSBga2V5c2AgaXRlcmFibGUgc2hvdWxkIGhhdmUgZWZmaWNpZW50IFtJdGVyYWJsZS5sZW5ndGhdIGFuZAovLy8gW0l0ZXJhYmxlLmNvbnRhaW5zXSBvcGVyYXRpb25zLCBhbmQgaXQgc2hvdWxkIGNhdGNoIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucwovLy8gb2YgdGhlIGtleXMgd2hpbGUgaXRlcmF0aW5nLgovLy8KLy8vIEEgbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gaXMgdXN1YWxseSBwb3NzaWJsZSBieSBvdmVycmlkaW5nCi8vLyBzb21lIG9mIHRoZSBvdGhlciBtZW1iZXJzIGFzIHdlbGwuCmFic3RyYWN0IGNsYXNzIE1hcEJhc2U8SywgVj4gZXh0ZW5kcyBNYXBNaXhpbjxLLCBWPiB7CiAgc3RhdGljIFN0cmluZyBtYXBUb1N0cmluZyhNYXAgbSkgewogICAgLy8gUmV1c2VzIHRoZSBsaXN0IGluIEl0ZXJhYmxlQmFzZSBmb3IgZGV0ZWN0aW5nIHRvU3RyaW5nIGN5Y2xlcy4KICAgIGlmIChfaXNUb1N0cmluZ1Zpc2l0aW5nKG0pKSB7CiAgICAgIHJldHVybiAney4uLn0nOwogICAgfQoKICAgIHZhciByZXN1bHQgPSBTdHJpbmdCdWZmZXIoKTsKICAgIHRyeSB7CiAgICAgIF90b1N0cmluZ1Zpc2l0aW5nLmFkZChtKTsKICAgICAgcmVzdWx0LndyaXRlKCd7Jyk7CiAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgICBtLmZvckVhY2goKGssIHYpIHsKICAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgICByZXN1bHQud3JpdGUoJywgJyk7CiAgICAgICAgfQogICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgcmVzdWx0LndyaXRlKGspOwogICAgICAgIHJlc3VsdC53cml0ZSgnOiAnKTsKICAgICAgICByZXN1bHQud3JpdGUodik7CiAgICAgIH0pOwogICAgICByZXN1bHQud3JpdGUoJ30nKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgbSkpOwogICAgICBfdG9TdHJpbmdWaXNpdGluZy5yZW1vdmVMYXN0KCk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIF9pZCh4KSA9PiB4OwoKICAvLy8gRmlsbHMgYSBbTWFwXSB3aXRoIGtleS92YWx1ZSBwYWlycyBjb21wdXRlZCBmcm9tIFtpdGVyYWJsZV0uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgW01hcF0gY2xhc3NlcyBpbiB0aGUgbmFtZWQgY29uc3RydWN0b3IKICAvLy8gYGZyb21JdGVyYWJsZWAuCiAgc3RhdGljIHZvaWQgX2ZpbGxNYXBXaXRoTWFwcGVkSXRlcmFibGUoCiAgICAgIE1hcCBtYXAsIEl0ZXJhYmxlIGl0ZXJhYmxlLCBrZXkoZWxlbWVudCksIHZhbHVlKGVsZW1lbnQpKSB7CiAgICBrZXkgPz89IF9pZDsKICAgIHZhbHVlID8/PSBfaWQ7CgogICAgZm9yICh2YXIgZWxlbWVudCBpbiBpdGVyYWJsZSkgewogICAgICBtYXBba2V5KGVsZW1lbnQpXSA9IHZhbHVlKGVsZW1lbnQpOwogICAgfQogIH0KCiAgLy8vIEZpbGxzIGEgbWFwIGJ5IGFzc29jaWF0aW5nIHRoZSBba2V5c10gdG8gW3ZhbHVlc10uCiAgLy8vCiAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgW01hcF0gY2xhc3NlcyBpbiB0aGUgbmFtZWQgY29uc3RydWN0b3IKICAvLy8gYGZyb21JdGVyYWJsZXNgLgogIHN0YXRpYyB2b2lkIF9maWxsTWFwV2l0aEl0ZXJhYmxlcyhNYXAgbWFwLCBJdGVyYWJsZSBrZXlzLCBJdGVyYWJsZSB2YWx1ZXMpIHsKICAgIEl0ZXJhdG9yIGtleUl0ZXJhdG9yID0ga2V5cy5pdGVyYXRvcjsKICAgIEl0ZXJhdG9yIHZhbHVlSXRlcmF0b3IgPSB2YWx1ZXMuaXRlcmF0b3I7CgogICAgYm9vbCBoYXNOZXh0S2V5ID0ga2V5SXRlcmF0b3IubW92ZU5leHQoKTsKICAgIGJvb2wgaGFzTmV4dFZhbHVlID0gdmFsdWVJdGVyYXRvci5tb3ZlTmV4dCgpOwoKICAgIHdoaWxlIChoYXNOZXh0S2V5ICYmIGhhc05leHRWYWx1ZSkgewogICAgICBtYXBba2V5SXRlcmF0b3IuY3VycmVudF0gPSB2YWx1ZUl0ZXJhdG9yLmN1cnJlbnQ7CiAgICAgIGhhc05leHRLZXkgPSBrZXlJdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgICBoYXNOZXh0VmFsdWUgPSB2YWx1ZUl0ZXJhdG9yLm1vdmVOZXh0KCk7CiAgICB9CgogICAgaWYgKGhhc05leHRLZXkgfHwgaGFzTmV4dFZhbHVlKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIkl0ZXJhYmxlcyBkbyBub3QgaGF2ZSBzYW1lIGxlbmd0aC4iKTsKICAgIH0KICB9Cn0KCi8vLyBNaXhpbiBpbXBsZW1lbnRpbmcgYSBbTWFwXS4KLy8vCi8vLyBUaGlzIG1peGluIGhhcyBhIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIGFsbCBidXQgZml2ZSBvZiB0aGUgbWVtYmVycyBvZgovLy8gW01hcF0uCi8vLyBBIGJhc2ljIGBNYXBgIGNsYXNzIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBtaXhpbiBpbiB0aGlzIGNsYXNzIGFuZAovLy8gaW1wbGVtZW50aW5nIGBrZXlzYCwgYG9wZXJhdG9yW11gLCBgb3BlcmF0b3JbXT1gLCBgcmVtb3ZlYCBhbmQgYGNsZWFyYC4KLy8vIFRoZSByZW1haW5pbmcgb3BlcmF0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlc2UgZml2ZS4KLy8vCi8vLyBUaGUgYGtleXNgIGl0ZXJhYmxlIHNob3VsZCBoYXZlIGVmZmljaWVudCBbSXRlcmFibGUubGVuZ3RoXSBhbmQKLy8vIFtJdGVyYWJsZS5jb250YWluc10gb3BlcmF0aW9ucywgYW5kIGl0IHNob3VsZCBjYXRjaCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbnMKLy8vIG9mIHRoZSBrZXlzIHdoaWxlIGl0ZXJhdGluZy4KLy8vCi8vLyBBIG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIGlzIHVzdWFsbHkgcG9zc2libGUgYnkgb3ZlcnJpZGluZwovLy8gc29tZSBvZiB0aGUgb3RoZXIgbWVtYmVycyBhcyB3ZWxsLgphYnN0cmFjdCBjbGFzcyBNYXBNaXhpbjxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgSXRlcmFibGU8Sz4gZ2V0IGtleXM7CiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KTsKICBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpOwogIFYgcmVtb3ZlKE9iamVjdCBrZXkpOwogIC8vIFRoZSBgY2xlYXJgIG9wZXJhdGlvbiBzaG91bGQgbm90IGJlIGJhc2VkIG9uIGByZW1vdmVgLgogIC8vIEl0IHNob3VsZCBjbGVhciB0aGUgbWFwIGV2ZW4gaWYgc29tZSBrZXlzIGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcy4KICB2b2lkIGNsZWFyKCk7CgogIE1hcDxSSywgUlY+IGNhc3Q8UkssIFJWPigpID0+IE1hcC5jYXN0RnJvbTxLLCBWLCBSSywgUlY+KHRoaXMpOwogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihLIGtleSwgViB2YWx1ZSkpIHsKICAgIGZvciAoSyBrZXkgaW4ga2V5cykgewogICAgICBhY3Rpb24oa2V5LCB0aGlzW2tleV0pOwogICAgfQogIH0KCiAgdm9pZCBhZGRBbGwoTWFwPEssIFY+IG90aGVyKSB7CiAgICBmb3IgKEsga2V5IGluIG90aGVyLmtleXMpIHsKICAgICAgdGhpc1trZXldID0gb3RoZXJba2V5XTsKICAgIH0KICB9CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKICAgIGZvciAoSyBrZXkgaW4ga2V5cykgewogICAgICBpZiAodGhpc1trZXldID09IHZhbHVlKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgaWYgKGNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgcmV0dXJuIHRoaXNba2V5XTsKICAgIH0KICAgIHJldHVybiB0aGlzW2tleV0gPSBpZkFic2VudCgpOwogIH0KCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgewogICAgaWYgKHRoaXMuY29udGFpbnNLZXkoa2V5KSkgewogICAgICByZXR1cm4gdGhpc1trZXldID0gdXBkYXRlKHRoaXNba2V5XSk7CiAgICB9CiAgICBpZiAoaWZBYnNlbnQgIT0gbnVsbCkgewogICAgICByZXR1cm4gdGhpc1trZXldID0gaWZBYnNlbnQoKTsKICAgIH0KICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUoa2V5LCAia2V5IiwgIktleSBub3QgaW4gbWFwLiIpOwogIH0KCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5rZXlzKSB7CiAgICAgIHRoaXNba2V5XSA9IHVwZGF0ZShrZXksIHRoaXNba2V5XSk7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgewogICAgcmV0dXJuIGtleXMubWFwKChLIGtleSkgPT4gTWFwRW50cnk8SywgVj4oa2V5LCB0aGlzW2tleV0pKTsKICB9CgogIE1hcDxLMiwgVjI+IG1hcDxLMiwgVjI+KE1hcEVudHJ5PEsyLCBWMj4gdHJhbnNmb3JtKEsga2V5LCBWIHZhbHVlKSkgewogICAgdmFyIHJlc3VsdCA9IDxLMiwgVjI+e307CiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5rZXlzKSB7CiAgICAgIHZhciBlbnRyeSA9IHRyYW5zZm9ybShrZXksIHRoaXNba2V5XSk7CiAgICAgIHJlc3VsdFtlbnRyeS5rZXldID0gZW50cnkudmFsdWU7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBhZGRFbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBuZXdFbnRyaWVzKSB7CiAgICBmb3IgKHZhciBlbnRyeSBpbiBuZXdFbnRyaWVzKSB7CiAgICAgIHRoaXNbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlOwogICAgfQogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoSyBrZXksIFYgdmFsdWUpKSB7CiAgICB2YXIga2V5c1RvUmVtb3ZlID0gPEs+W107CiAgICBmb3IgKHZhciBrZXkgaW4ga2V5cykgewogICAgICBpZiAodGVzdChrZXksIHRoaXNba2V5XSkpIGtleXNUb1JlbW92ZS5hZGQoa2V5KTsKICAgIH0KICAgIGZvciAodmFyIGtleSBpbiBrZXlzVG9SZW1vdmUpIHsKICAgICAgdGhpcy5yZW1vdmUoa2V5KTsKICAgIH0KICB9CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgPT4ga2V5cy5jb250YWlucyhrZXkpOwogIGludCBnZXQgbGVuZ3RoID0+IGtleXMubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4ga2V5cy5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4ga2V5cy5pc05vdEVtcHR5OwogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX01hcEJhc2VWYWx1ZUl0ZXJhYmxlPEssIFY+KHRoaXMpOwogIFN0cmluZyB0b1N0cmluZygpID0+IE1hcEJhc2UubWFwVG9TdHJpbmcodGhpcyk7Cn0KCi8vLyBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbiB1bm1vZGlmaWFibGUgW01hcF0uCi8vLwovLy8gVGhpcyBjbGFzcyBoYXMgYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgYnV0IHR3byBvZiB0aGUgbWVtYmVycyBvZgovLy8gYW4gdW1vZGlmaWFibGUgW01hcF0uCi8vLyBBIHNpbXBsZSB1bm1vZGlmaWFibGUgYE1hcGAgY2xhc3MgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGV4dGVuZGluZyB0aGlzCi8vLyBjbGFzcyBhbmQgaW1wbGVtZW50aW5nIGBrZXlzYCBhbmQgYG9wZXJhdG9yW11gLgovLy8KLy8vIE1vZGlmeWluZyBvcGVyYXRpb25zIHRocm93IHdoZW4gdXNlZC4KLy8vIFRoZSByZW1haW5pbmcgbm9uLW1vZGlmeWluZyBvcGVyYXRpb25zIGFyZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBga2V5c2AKLy8vIGFuZCBgb3BlcmF0b3JbXWAuCi8vLwovLy8gVGhlIGBrZXlzYCBpdGVyYWJsZSBzaG91bGQgaGF2ZSBlZmZpY2llbnQgW0l0ZXJhYmxlLmxlbmd0aF0gYW5kCi8vLyBbSXRlcmFibGUuY29udGFpbnNdIG9wZXJhdGlvbnMsIGFuZCBpdCBzaG91bGQgY2F0Y2ggY29uY3VycmVudCBtb2RpZmljYXRpb25zCi8vLyBvZiB0aGUga2V5cyB3aGlsZSBpdGVyYXRpbmcuCi8vLwovLy8gQSBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBpcyB1c3VhbGx5IHBvc3NpYmxlIGJ5IG92ZXJyaWRpbmcKLy8vIHNvbWUgb2YgdGhlIG90aGVyIG1lbWJlcnMgYXMgd2VsbC4KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlTWFwQmFzZTxLLCBWPiA9IE1hcEJhc2U8SywgVj4KICAgIHdpdGggX1VubW9kaWZpYWJsZU1hcE1peGluPEssIFY+OwoKLy8vIEltcGxlbWVudGF0aW9uIG9mIFtNYXAudmFsdWVzXSBiYXNlZCBvbiB0aGUgbWFwIGFuZCBpdHMgW01hcC5rZXlzXSBpdGVyYWJsZS4KLy8vCi8vLyBJdGVyYWJsZSB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGBNYXBgLgovLy8gSXQgYWNjZXNzZXMgdGhlIHZhbHVlcyBieSBpdGVyYXRpbmcgb3ZlciB0aGUga2V5cyBvZiB0aGUgbWFwLCBhbmQgdXNpbmcgdGhlCi8vLyBtYXAncyBgb3BlcmF0b3JbXWAgdG8gbG9va3VwIHRoZSBrZXlzLgpjbGFzcyBfTWFwQmFzZVZhbHVlSXRlcmFibGU8SywgVj4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxWPiB7CiAgZmluYWwgTWFwPEssIFY+IF9tYXA7CiAgX01hcEJhc2VWYWx1ZUl0ZXJhYmxlKHRoaXMuX21hcCk7CgogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX21hcC5pc0VtcHR5OwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gX21hcC5pc05vdEVtcHR5OwogIFYgZ2V0IGZpcnN0ID0+IF9tYXBbX21hcC5rZXlzLmZpcnN0XTsKICBWIGdldCBzaW5nbGUgPT4gX21hcFtfbWFwLmtleXMuc2luZ2xlXTsKICBWIGdldCBsYXN0ID0+IF9tYXBbX21hcC5rZXlzLmxhc3RdOwoKICBJdGVyYXRvcjxWPiBnZXQgaXRlcmF0b3IgPT4gX01hcEJhc2VWYWx1ZUl0ZXJhdG9yPEssIFY+KF9tYXApOwp9CgovLy8gSXRlcmF0b3IgY3JlYXRlZCBieSBbX01hcEJhc2VWYWx1ZUl0ZXJhYmxlXS4KLy8vCi8vLyBJdGVyYXRlcyBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBtYXAgYnkgaXRlcmF0aW5nIGl0cyBrZXlzIGFuZCBsb29rdXAgdXAgdGhlCi8vLyB2YWx1ZXMuCmNsYXNzIF9NYXBCYXNlVmFsdWVJdGVyYXRvcjxLLCBWPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFY+IHsKICBmaW5hbCBJdGVyYXRvcjxLPiBfa2V5czsKICBmaW5hbCBNYXA8SywgVj4gX21hcDsKICBWIF9jdXJyZW50OwoKICBfTWFwQmFzZVZhbHVlSXRlcmF0b3IoTWFwPEssIFY+IG1hcCkKICAgICAgOiBfbWFwID0gbWFwLAogICAgICAgIF9rZXlzID0gbWFwLmtleXMuaXRlcmF0b3I7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX2tleXMubW92ZU5leHQoKSkgewogICAgICBfY3VycmVudCA9IF9tYXBbX2tleXMuY3VycmVudF07CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX2N1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgViBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKfQoKLy8vIE1peGluIHRoYXQgb3ZlcnJpZGVzIG11dGF0aW5nIG1hcCBvcGVyYXRpb25zIHdpdGggaW1wbGVtZW50YXRpb25zIHRoYXQKLy8vIHRocm93LgphYnN0cmFjdCBjbGFzcyBfVW5tb2RpZmlhYmxlTWFwTWl4aW48SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICB2b2lkIGNsZWFyKCkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIik7CiAgfQoKICAvLy8gVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbWFwLgogIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChLIGtleSwgViB2YWx1ZSkpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICBWIHB1dElmQWJzZW50KEsga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIG1hcCIpOwogIH0KCiAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIG1hcC4KICBWIHVwZGF0ZShLIGtleSwgViB1cGRhdGUoViB2YWx1ZSksIHtWIGlmQWJzZW50KCl9KSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9CgogIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBtYXAuCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoSyBrZXksIFYgdmFsdWUpKSB7CiAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXAiKTsKICB9Cn0KCi8vLyBXcmFwcGVyIGFyb3VuZCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBbTWFwXSB0aGF0IG9ubHkgZXhwb3NlcyBgTWFwYAovLy8gbWVtYmVycy4KLy8vCi8vLyBBIHNpbXBsZSB3cmFwcGVyIHRoYXQgZGVsZWdhdGVzIGFsbCBgTWFwYCBtZW1iZXJzIHRvIHRoZSBtYXAgcHJvdmlkZWQgaW4gdGhlCi8vLyBjb25zdHJ1Y3Rvci4KLy8vCi8vLyBCYXNlIGZvciBkZWxlZ2F0aW5nIG1hcCBpbXBsZW1lbnRhdGlvbnMgbGlrZSBbVW5tb2RpZmlhYmxlTWFwVmlld10uCmNsYXNzIE1hcFZpZXc8SywgVj4gaW1wbGVtZW50cyBNYXA8SywgVj4gewogIGZpbmFsIE1hcDxLLCBWPiBfbWFwOwogIGNvbnN0IE1hcFZpZXcoTWFwPEssIFY+IG1hcCkgOiBfbWFwID0gbWFwOwoKICBNYXA8UkssIFJWPiBjYXN0PFJLLCBSVj4oKSA9PiBfbWFwLmNhc3Q8UkssIFJWPigpOwogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gX21hcFtrZXldOwogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICBfbWFwW2tleV0gPSB2YWx1ZTsKICB9CgogIHZvaWQgYWRkQWxsKE1hcDxLLCBWPiBvdGhlcikgewogICAgX21hcC5hZGRBbGwob3RoZXIpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIF9tYXAuY2xlYXIoKTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgPT4gX21hcC5wdXRJZkFic2VudChrZXksIGlmQWJzZW50KTsKICBib29sIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpID0+IF9tYXAuY29udGFpbnNLZXkoa2V5KTsKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSA9PiBfbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihLIGtleSwgViB2YWx1ZSkpIHsKICAgIF9tYXAuZm9yRWFjaChhY3Rpb24pOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbWFwLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbWFwLmlzTm90RW1wdHk7CiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5sZW5ndGg7CiAgSXRlcmFibGU8Sz4gZ2V0IGtleXMgPT4gX21hcC5rZXlzOwogIFYgcmVtb3ZlKE9iamVjdCBrZXkpID0+IF9tYXAucmVtb3ZlKGtleSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gX21hcC50b1N0cmluZygpOwogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX21hcC52YWx1ZXM7CgogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllcyA9PiBfbWFwLmVudHJpZXM7CgogIHZvaWQgYWRkRW50cmllcyhJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZW50cmllcykgewogICAgX21hcC5hZGRFbnRyaWVzKGVudHJpZXMpOwogIH0KCiAgTWFwPEsyLCBWMj4gbWFwPEsyLCBWMj4oTWFwRW50cnk8SzIsIFYyPiB0cmFuc2Zvcm0oSyBrZXksIFYgdmFsdWUpKSA9PgogICAgICBfbWFwLm1hcDxLMiwgVjI+KHRyYW5zZm9ybSk7CgogIFYgdXBkYXRlKEsga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pID0+CiAgICAgIF9tYXAudXBkYXRlKGtleSwgdXBkYXRlLCBpZkFic2VudDogaWZBYnNlbnQpOwoKICB2b2lkIHVwZGF0ZUFsbChWIHVwZGF0ZShLIGtleSwgViB2YWx1ZSkpIHsKICAgIF9tYXAudXBkYXRlQWxsKHVwZGF0ZSk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChLIGtleSwgViB2YWx1ZSkpIHsKICAgIF9tYXAucmVtb3ZlV2hlcmUodGVzdCk7CiAgfQp9CgovLy8gVmlldyBvZiBhIFtNYXBdIHRoYXQgZGlzYWxsb3cgbW9kaWZ5aW5nIHRoZSBtYXAuCi8vLwovLy8gQSB3cmFwcGVyIGFyb3VuZCBhIGBNYXBgIHRoYXQgZm9yd2FyZHMgYWxsIG1lbWJlcnMgdG8gdGhlIG1hcCBwcm92aWRlZCBpbgovLy8gdGhlIGNvbnN0cnVjdG9yLCBleGNlcHQgZm9yIG9wZXJhdGlvbnMgdGhhdCBtb2RpZnkgdGhlIG1hcC4KLy8vIE1vZGlmeWluZyBvcGVyYXRpb25zIHRocm93IGluc3RlYWQuCmNsYXNzIFVubW9kaWZpYWJsZU1hcFZpZXc8SywgVj4gZXh0ZW5kcyBNYXBWaWV3PEssIFY+CiAgICB3aXRoIF9Vbm1vZGlmaWFibGVNYXBNaXhpbjxLLCBWPiB7CiAgVW5tb2RpZmlhYmxlTWFwVmlldyhNYXA8SywgVj4gbWFwKSA6IHN1cGVyKG1hcCk7CgogIE1hcDxSSywgUlY+IGNhc3Q8UkssIFJWPigpID0+CiAgICAgIFVubW9kaWZpYWJsZU1hcFZpZXc8UkssIFJWPihfbWFwLmNhc3Q8UkssIFJWPigpKTsKfQqBfABOTjwBGQEpBEwLR0xFBERRIQRGJzYlRiIWBgEhCiAZGRkWHgoXGRwZChkQNCYGAR4EARYBQwZEFipCERMBJCoGBAE5BkQXTyouAS4yASk4Ky8GASZBBgQCASAETAtGTEUERFEhBEYnNRgdIBg8TBABQi4aHgYEASEgHgYEASUaKwYSBAEnHBgGIwQBNyEsBhwlBj4EAS0hKgYEASlABAFIHSEtJwYTBAE5JCUGBAEwHhw3BiQYBgQBNiEkKj8yAgEzBEsaSzQEKk4WBERRIQRGJzkmAVEEN1ArRxgkASEkKigqJgFBAgExBE4MOxsYDgEnFCMBFBwmEwYVEgQBHQIBSwtCPiY+BAE+IT4EAT42PgQBPhE+BAE+GT4EAT4wPgQBPic+BAE+Nz4EAT4tPgQCAUkNBFERBEgrGC0BNSomFwQBIRgEARESBAFJOUEuGgQBJCohJSwoKQE4ATYeBAFJIwE4NAEtHAQBMBwEAgE1BE5AKDYnMwEgOAIBGWRhcnQ6Y29sbGVjdGlvbi9tYXBzLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vaXRlcmFibGUuZGFydK7MLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb2xsZWN0aW9uOwoKLy8vIFRoaXMgW0l0ZXJhYmxlXSBtaXhpbiBpbXBsZW1lbnRzIGFsbCBbSXRlcmFibGVdIG1lbWJlcnMgZXhjZXB0IGBpdGVyYXRvcmAuCi8vLwovLy8gQWxsIG90aGVyIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGBpdGVyYXRvcmAuCmFic3RyYWN0IGNsYXNzIEl0ZXJhYmxlTWl4aW48RT4gaW1wbGVtZW50cyBJdGVyYWJsZTxFPiB7CiAgLy8gVGhpcyBjbGFzcyBoYXMgbWV0aG9kcyBjb3BpZWQgdmVyYmF0aW0gaW50bzoKICAvLyAtIEl0ZXJhYmxlQmFzZQogIC8vIC0gU2V0TWl4aW4KICAvLyBJZiBjaGFuZ2luZyBhIG1ldGhvZCBoZXJlLCBhbHNvIGNoYW5nZSB0aGUgb3RoZXIgY29waWVzLgoKICBJdGVyYWJsZTxSPiBjYXN0PFI+KCkgPT4gSXRlcmFibGUuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBNYXBwZWRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCBmKEUgZWxlbWVudCkpID0+IFdoZXJlSXRlcmFibGU8RT4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8RT4gZm9sbG93ZWRCeShJdGVyYWJsZTxFPiBvdGhlcikgewogICAgLy8gVHlwZSB3b3JrYXJvdW5kIGJlY2F1c2UgSXRlcmFibGVNaXhpbjxFPiBkb2Vzbid0IHByb21vdGUKICAgIC8vIHRvIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+LgogICAgSXRlcmFibGU8RT4gc2VsZiA9IHRoaXM7CiAgICBpZiAoc2VsZiBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPikgewogICAgICByZXR1cm4gRm9sbG93ZWRCeUl0ZXJhYmxlPEU+LmZpcnN0RWZmaWNpZW50KHNlbGYsIG90aGVyKTsKICAgIH0KICAgIHJldHVybiBGb2xsb3dlZEJ5SXRlcmFibGU8RT4odGhpcywgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgZm9yIChFIGUgaW4gdGhpcykgewogICAgICBpZiAoZSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgZihlbGVtZW50KTsKICB9CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBJdGVyYXRvcjxFPiBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHZhbHVlID0gaXRlcmF0b3IuY3VycmVudDsKICAgIHdoaWxlIChpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgaXRlcmF0b3IuY3VycmVudCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBib29sIGV2ZXJ5KGJvb2wgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICghZihlbGVtZW50KSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gIiI7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yID09ICIiKSB7CiAgICAgIGRvIHsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgYm9vbCBhbnkoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgPT4KICAgICAgTGlzdDxFPi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CgogIFNldDxFPiB0b1NldCgpID0+IFNldDxFPi5mcm9tKHRoaXMpOwoKICBpbnQgZ2V0IGxlbmd0aCB7CiAgICBhc3NlcnQodGhpcyBpcyEgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpOwogICAgaW50IGNvdW50ID0gMDsKICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3I7CiAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogICAgICBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiAhaXRlcmF0b3IubW92ZU5leHQoKTsKCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIHJldHVybiBUYWtlSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFRha2VXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIHJldHVybiBTa2lwSXRlcmFibGU8RT4odGhpcywgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFNraXBXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIH0KICAgIHJldHVybiBpdC5jdXJyZW50OwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBJdGVyYXRvcjxFPiBpdCA9IGl0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgfQogICAgRSByZXN1bHQ7CiAgICBkbyB7CiAgICAgIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICB9IHdoaWxlIChpdC5tb3ZlTmV4dCgpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBFIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICBpZiAoaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSB2YWx1ZSksIHtFIG9yRWxzZSgpfSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgdmFsdWUpLCB7RSBvckVsc2UoKX0pIHsKICAgIEUgcmVzdWx0OwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBzaW5nbGVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaW5kZXgsICJpbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKGluZGV4LCAiaW5kZXgiKTsKICAgIGludCBlbGVtZW50SW5kZXggPSAwOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoaW5kZXggPT0gZWxlbWVudEluZGV4KSByZXR1cm4gZWxlbWVudDsKICAgICAgZWxlbWVudEluZGV4Kys7CiAgICB9CiAgICB0aHJvdyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiLCBudWxsLCBlbGVtZW50SW5kZXgpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gSXRlcmFibGVCYXNlLml0ZXJhYmxlVG9TaG9ydFN0cmluZyh0aGlzLCAnKCcsICcpJyk7Cn0KCi8vLyBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgW0l0ZXJhYmxlXS4KLy8vCi8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYWxsIG1ldGhvZHMgb2YgW0l0ZXJhYmxlXSwgZXhjZXB0IFtJdGVyYWJsZS5pdGVyYXRvcl0sCi8vLyBpbiB0ZXJtcyBvZiBgaXRlcmF0b3JgLgphYnN0cmFjdCBjbGFzcyBJdGVyYWJsZUJhc2U8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgY29uc3QgSXRlcmFibGVCYXNlKCk7CgogIC8vLyBDb252ZXJ0IGFuIGBJdGVyYWJsZWAgdG8gYSBzdHJpbmcgbGlrZSBbSXRlcmFibGVCYXNlLnRvU3RyaW5nXS4KICAvLy8KICAvLy8gQWxsb3dzIHVzaW5nIG90aGVyIGRlbGltaXRlcnMgdGhhbiAnKCcgYW5kICcpJy4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW2l0ZXJhYmxlXSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGl0ZXJhYmxlVG9TaG9ydFN0cmluZyhJdGVyYWJsZSBpdGVyYWJsZSwKICAgICAgW1N0cmluZyBsZWZ0RGVsaW1pdGVyID0gJygnLCBTdHJpbmcgcmlnaHREZWxpbWl0ZXIgPSAnKSddKSB7CiAgICBpZiAoX2lzVG9TdHJpbmdWaXNpdGluZyhpdGVyYWJsZSkpIHsKICAgICAgaWYgKGxlZnREZWxpbWl0ZXIgPT0gIigiICYmIHJpZ2h0RGVsaW1pdGVyID09ICIpIikgewogICAgICAgIC8vIEF2b2lkIGNyZWF0aW5nIGEgbmV3IHN0cmluZyBpbiB0aGUgImNvbW1vbiIgY2FzZS4KICAgICAgICByZXR1cm4gIiguLi4pIjsKICAgICAgfQogICAgICByZXR1cm4gIiRsZWZ0RGVsaW1pdGVyLi4uJHJpZ2h0RGVsaW1pdGVyIjsKICAgIH0KICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IDxTdHJpbmc+W107CiAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQoaXRlcmFibGUpOwogICAgdHJ5IHsKICAgICAgX2l0ZXJhYmxlUGFydHNUb1N0cmluZ3MoaXRlcmFibGUsIHBhcnRzKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgaXRlcmFibGUpKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQogICAgcmV0dXJuIChTdHJpbmdCdWZmZXIobGVmdERlbGltaXRlcikKICAgICAgICAgIC4ud3JpdGVBbGwocGFydHMsICIsICIpCiAgICAgICAgICAuLndyaXRlKHJpZ2h0RGVsaW1pdGVyKSkKICAgICAgICAudG9TdHJpbmcoKTsKICB9CgogIC8vLyBDb252ZXJ0cyBhbiBgSXRlcmFibGVgIHRvIGEgc3RyaW5nLgogIC8vLwogIC8vLyBDb252ZXJ0cyBlYWNoIGVsZW1lbnRzIHRvIGEgc3RyaW5nLCBhbmQgc2VwYXJhdGVzIHRoZSByZXN1bHRzIGJ5ICIsICIuCiAgLy8vIFRoZW4gd3JhcHMgdGhlIHJlc3VsdCBpbiBbbGVmdERlbGltaXRlcl0gYW5kIFtyaWdodERlbGltaXRlcl0uCiAgLy8vCiAgLy8vIFVubGlrZSBbaXRlcmFibGVUb1Nob3J0U3RyaW5nXSwgdGhpcyBjb252ZXJzaW9uIGRvZXNuJ3Qgb21pdCBhbnkKICAvLy8gZWxlbWVudHMgb3IgcHV0cyBhbnkgbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4KICAvLy8KICAvLy8gSGFuZGxlcyBjaXJjdWxhciByZWZlcmVuY2VzIHdoZXJlIGNvbnZlcnRpbmcgb25lIG9mIHRoZSBlbGVtZW50cwogIC8vLyB0byBhIHN0cmluZyBlbmRzIHVwIGNvbnZlcnRpbmcgW2l0ZXJhYmxlXSB0byBhIHN0cmluZyBhZ2Fpbi4KICBzdGF0aWMgU3RyaW5nIGl0ZXJhYmxlVG9GdWxsU3RyaW5nKEl0ZXJhYmxlIGl0ZXJhYmxlLAogICAgICBbU3RyaW5nIGxlZnREZWxpbWl0ZXIgPSAnKCcsIFN0cmluZyByaWdodERlbGltaXRlciA9ICcpJ10pIHsKICAgIGlmIChfaXNUb1N0cmluZ1Zpc2l0aW5nKGl0ZXJhYmxlKSkgewogICAgICByZXR1cm4gIiRsZWZ0RGVsaW1pdGVyLi4uJHJpZ2h0RGVsaW1pdGVyIjsKICAgIH0KICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIobGVmdERlbGltaXRlcik7CiAgICBfdG9TdHJpbmdWaXNpdGluZy5hZGQoaXRlcmFibGUpOwogICAgdHJ5IHsKICAgICAgYnVmZmVyLndyaXRlQWxsKGl0ZXJhYmxlLCAiLCAiKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGFzc2VydChpZGVudGljYWwoX3RvU3RyaW5nVmlzaXRpbmcubGFzdCwgaXRlcmFibGUpKTsKICAgICAgX3RvU3RyaW5nVmlzaXRpbmcucmVtb3ZlTGFzdCgpOwogICAgfQogICAgYnVmZmVyLndyaXRlKHJpZ2h0RGVsaW1pdGVyKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9Cn0KCi8vLyBBIGNvbGxlY3Rpb24gdXNlZCB0byBpZGVudGlmeSBjeWNsaWMgbGlzdHMgZHVyaW5nIHRvU3RyaW5nKCkgY2FsbHMuCmZpbmFsIExpc3QgX3RvU3RyaW5nVmlzaXRpbmcgPSBbXTsKCi8vLyBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHZpc2l0aW5nIGBvYCBpbiBhIHRvU3RyaW5nIGNhbGwuCmJvb2wgX2lzVG9TdHJpbmdWaXNpdGluZyhPYmplY3QgbykgewogIGZvciAoaW50IGkgPSAwOyBpIDwgX3RvU3RyaW5nVmlzaXRpbmcubGVuZ3RoOyBpKyspIHsKICAgIGlmIChpZGVudGljYWwobywgX3RvU3RyaW5nVmlzaXRpbmdbaV0pKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgovLy8gQ29udmVydCBlbGVtZW50cyBvZiBbaXRlcmFibGVdIHRvIHN0cmluZ3MgYW5kIHN0b3JlIHRoZW0gaW4gW3BhcnRzXS4Kdm9pZCBfaXRlcmFibGVQYXJ0c1RvU3RyaW5ncyhJdGVyYWJsZSBpdGVyYWJsZSwgTGlzdDxTdHJpbmc+IHBhcnRzKSB7CiAgLyoKICAgKiBUaGlzIGlzIHRoZSBjb21wbGljYXRlZCBwYXJ0IG9mIFtpdGVyYWJsZVRvU2hvcnRTdHJpbmddLgogICAqIEl0IGlzIGV4dHJhY3RlZCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIGhhdmluZyB0b28gbXVjaCBjb2RlCiAgICogaW5zaWRlIHRoZSB0cnkvZmluYWxseS4KICAgKi8KICAvLy8gVHJ5IHRvIHN0YXkgYmVsb3cgdGhpcyBtYW55IGNoYXJhY3RlcnMuCiAgY29uc3QgaW50IGxlbmd0aExpbWl0ID0gODA7CgogIC8vLyBBbHdheXMgYXQgbGVhc3QgdGhpcyBtYW55IGVsZW1lbnRzIGF0IHRoZSBzdGFydC4KICBjb25zdCBpbnQgaGVhZENvdW50ID0gMzsKCiAgLy8vIEFsd2F5cyBhdCBsZWFzdCB0aGlzIG1hbnkgZWxlbWVudHMgYXQgdGhlIGVuZC4KICBjb25zdCBpbnQgdGFpbENvdW50ID0gMjsKCiAgLy8vIFN0b3AgaXRlcmF0aW5nIGFmdGVyIHRoaXMgbWFueSBlbGVtZW50cy4gSXRlcmFibGVzIGNhbiBiZSBpbmZpbml0ZS4KICBjb25zdCBpbnQgbWF4Q291bnQgPSAxMDA7CiAgLy8gUGVyIGVudHJ5IGxlbmd0aCBvdmVyaGVhZC4gSXQncyBmb3IgIiwgIiBmb3IgYWxsIGFmdGVyIHRoZSBmaXJzdCBlbnRyeSwKICAvLyBhbmQgZm9yICIoIiBhbmQgIikiIGZvciB0aGUgaW5pdGlhbCBlbnRyeS4gQnkgcHVyZSBsdWNrLCB0aGF0J3MgdGhlIHNhbWUKICAvLyBudW1iZXIuCiAgY29uc3QgaW50IG92ZXJoZWFkID0gMjsKICBjb25zdCBpbnQgZWxsaXBzaXNTaXplID0gMzsgLy8gIi4uLiIubGVuZ3RoLgoKICBpbnQgbGVuZ3RoID0gMDsKICBpbnQgY291bnQgPSAwOwogIEl0ZXJhdG9yIGl0ID0gaXRlcmFibGUuaXRlcmF0b3I7CiAgLy8gSW5pdGlhbCBydW4gb2YgZWxlbWVudHMsIGF0IGxlYXN0IGhlYWRDb3VudCwgYW5kIHRoZW4gY29udGludWUgdW50aWwKICAvLyBwYXNzaW5nIGF0IG1vc3QgbGVuZ3RoTGltaXQgY2hhcmFjdGVycy4KICB3aGlsZSAobGVuZ3RoIDwgbGVuZ3RoTGltaXQgfHwgY291bnQgPCBoZWFkQ291bnQpIHsKICAgIGlmICghaXQubW92ZU5leHQoKSkgcmV0dXJuOwogICAgU3RyaW5nIG5leHQgPSAiJHtpdC5jdXJyZW50fSI7CiAgICBwYXJ0cy5hZGQobmV4dCk7CiAgICBsZW5ndGggKz0gbmV4dC5sZW5ndGggKyBvdmVyaGVhZDsKICAgIGNvdW50Kys7CiAgfQoKICBTdHJpbmcgcGVudWx0aW1hdGVTdHJpbmc7CiAgU3RyaW5nIHVsdGltYXRlU3RyaW5nOwoKICAvLyBGaW5kIGxhc3QgdHdvIGVsZW1lbnRzLiBPbmUgb3IgbW9yZSBvZiB0aGVtIG1heSBhbHJlYWR5IGJlIGluIHRoZQogIC8vIHBhcnRzIGFycmF5LiBJbmNsdWRlIHRoZWlyIGxlbmd0aCBpbiBgbGVuZ3RoYC4KICBPYmplY3QgcGVudWx0aW1hdGU7CiAgT2JqZWN0IHVsdGltYXRlOwogIGlmICghaXQubW92ZU5leHQoKSkgewogICAgaWYgKGNvdW50IDw9IGhlYWRDb3VudCArIHRhaWxDb3VudCkgcmV0dXJuOwogICAgdWx0aW1hdGVTdHJpbmcgPSBwYXJ0cy5yZW1vdmVMYXN0KCk7CiAgICBwZW51bHRpbWF0ZVN0cmluZyA9IHBhcnRzLnJlbW92ZUxhc3QoKTsKICB9IGVsc2UgewogICAgcGVudWx0aW1hdGUgPSBpdC5jdXJyZW50OwogICAgY291bnQrKzsKICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICBpZiAoY291bnQgPD0gaGVhZENvdW50ICsgMSkgewogICAgICAgIHBhcnRzLmFkZCgiJHBlbnVsdGltYXRlIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHVsdGltYXRlU3RyaW5nID0gIiRwZW51bHRpbWF0ZSI7CiAgICAgIHBlbnVsdGltYXRlU3RyaW5nID0gcGFydHMucmVtb3ZlTGFzdCgpOwogICAgICBsZW5ndGggKz0gdWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgb3ZlcmhlYWQ7CiAgICB9IGVsc2UgewogICAgICB1bHRpbWF0ZSA9IGl0LmN1cnJlbnQ7CiAgICAgIGNvdW50Kys7CiAgICAgIC8vIFRoZW4ga2VlcCBsb29waW5nLCBrZWVwaW5nIHRoZSBsYXN0IHR3byBlbGVtZW50cyBpbiB2YXJpYWJsZXMuCiAgICAgIGFzc2VydChjb3VudCA8IG1heENvdW50KTsKICAgICAgd2hpbGUgKGl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICBwZW51bHRpbWF0ZSA9IHVsdGltYXRlOwogICAgICAgIHVsdGltYXRlID0gaXQuY3VycmVudDsKICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChjb3VudCA+IG1heENvdW50KSB7CiAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZvdW5kIHRoZSBlbmQgYmVmb3JlIG1heENvdW50LCBnaXZlIHVwLgogICAgICAgICAgLy8gVGhpcyBjYW5ub3QgaGFwcGVuIGluIHRoZSBjb2RlIGFib3ZlIGJlY2F1c2UgZWFjaCBlbnRyeQogICAgICAgICAgLy8gaW5jcmVhc2VzIGxlbmd0aCBieSBhdCBsZWFzdCB0d28sIHNvIHRoZXJlIGlzIG5vIHdheSB0bwogICAgICAgICAgLy8gdmlzaXQgbW9yZSB0aGFuIH40MCBlbGVtZW50cyBiZWZvcmUgdGhpcyBsb29wLgoKICAgICAgICAgIC8vIFJlbW92ZSBhbnkgc3VycGx1cyBlbGVtZW50cyB1bnRpbCBsZW5ndGgsIGluY2x1ZGluZyAiLCAuLi4pIiwKICAgICAgICAgIC8vIGlzIGF0IG1vc3QgbGVuZ3RoTGltaXQuCiAgICAgICAgICB3aGlsZSAobGVuZ3RoID4gbGVuZ3RoTGltaXQgLSBlbGxpcHNpc1NpemUgLSBvdmVyaGVhZCAmJgogICAgICAgICAgICAgIGNvdW50ID4gaGVhZENvdW50KSB7CiAgICAgICAgICAgIGxlbmd0aCAtPSBwYXJ0cy5yZW1vdmVMYXN0KCkubGVuZ3RoICsgb3ZlcmhlYWQ7CiAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICB9CiAgICAgICAgICBwYXJ0cy5hZGQoIi4uLiIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBwZW51bHRpbWF0ZVN0cmluZyA9ICIkcGVudWx0aW1hdGUiOwogICAgICB1bHRpbWF0ZVN0cmluZyA9ICIkdWx0aW1hdGUiOwogICAgICBsZW5ndGggKz0gdWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgcGVudWx0aW1hdGVTdHJpbmcubGVuZ3RoICsgMiAqIG92ZXJoZWFkOwogICAgfQogIH0KCiAgLy8gSWYgdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0aGUgaW5pdGlhbCBydW4gYW5kIHRoZSBsYXN0IHR3bywKICAvLyBwcmVwYXJlIHRvIGFkZCBhbiBlbGxpcHNpcy4KICBTdHJpbmcgZWxpc2lvbjsKICBpZiAoY291bnQgPiBwYXJ0cy5sZW5ndGggKyB0YWlsQ291bnQpIHsKICAgIGVsaXNpb24gPSAiLi4uIjsKICAgIGxlbmd0aCArPSBlbGxpcHNpc1NpemUgKyBvdmVyaGVhZDsKICB9CgogIC8vIElmIHRoZSBsYXN0IHR3byBlbGVtZW50cyB3ZXJlIHZlcnkgbG9uZywgYW5kIHdlIGhhdmUgbW9yZSB0aGFuCiAgLy8gaGVhZENvdW50IGVsZW1lbnRzIGluIHRoZSBpbml0aWFsIHJ1biwgZHJvcCBzb21lIHRvIG1ha2Ugcm9vbSBmb3IKICAvLyB0aGUgbGFzdCB0d28uCiAgd2hpbGUgKGxlbmd0aCA+IGxlbmd0aExpbWl0ICYmIHBhcnRzLmxlbmd0aCA+IGhlYWRDb3VudCkgewogICAgbGVuZ3RoIC09IHBhcnRzLnJlbW92ZUxhc3QoKS5sZW5ndGggKyBvdmVyaGVhZDsKICAgIGlmIChlbGlzaW9uID09IG51bGwpIHsKICAgICAgZWxpc2lvbiA9ICIuLi4iOwogICAgICBsZW5ndGggKz0gZWxsaXBzaXNTaXplICsgb3ZlcmhlYWQ7CiAgICB9CiAgfQogIGlmIChlbGlzaW9uICE9IG51bGwpIHsKICAgIHBhcnRzLmFkZChlbGlzaW9uKTsKICB9CiAgcGFydHMuYWRkKHBlbnVsdGltYXRlU3RyaW5nKTsKICBwYXJ0cy5hZGQodWx0aW1hdGVTdHJpbmcpOwp9CoGUAE5OPAEZAU8EPjkyFBA+ATpHAUUBPAE1JQEuQCYdLkAGLwQBIhglBhIEASQoBAEsKiAuBiAiMAYSBAFFHj0SBAEiHiUGEQQBKSopKjALLSUNKyQhLQgGHgQBIx4mBhIEASwuAScBEy4THBwPBhIEASwBIwEgKQQBLi0EASApBAEuLQQBEB8aLgYXBAEPHxouBg4JGx0TBAERH0AbPRMEATMeKQYpLAQBMg4gHhsaHggGJiksBAE2DiAeGx0wChoeCAYmKSwEARswMRoeMRYGRgQBSwIBLARRHDUYAUYGNgZHQzlDKTs9GAgxBiUlCjAQOyYGKCIjFQQBKgZNRQZHPAZHQzhDKTEGNyUKJxA7JgYiHgQCAUgjAT8lNzkEEAIBSUYFPkodBi4eATcbATUbAUocTU4NGi8BEhEjSi02ICMVJg0EARwZAUc0FhMYMCksCx4NGiQjEAgnLjINHQ9IIB4gHxEgQ0VFPAFLJUMjPBUMHBIKCCokUQYEAUEhEioVJwQBREcTPTQbFykGBBkYBCAdAgEdZGFydDpjb2xsZWN0aW9uL2l0ZXJhYmxlLmRhcnQ7b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vbGlua2VkX2hhc2hfbWFwLmRhcnSXyy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29sbGVjdGlvbjsKCi8vLyBBIGhhc2gtdGFibGUgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW01hcF0uCi8vLwovLy8gVGhlIGluc2VydGlvbiBvcmRlciBvZiBrZXlzIGlzIHJlbWVtYmVyZWQsCi8vLyBhbmQga2V5cyBhcmUgaXRlcmF0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBpbnNlcnRlZCBpbnRvIHRoZSBtYXAuCi8vLyBWYWx1ZXMgYXJlIGl0ZXJhdGVkIGluIHRoZWlyIGNvcnJlc3BvbmRpbmcga2V5J3Mgb3JkZXIuCi8vLyBDaGFuZ2luZyBhIGtleSdzIHZhbHVlLCB3aGVuIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLAovLy8gZG9lcyBub3QgY2hhbmdlIHRoZSBpdGVyYXRpb24gb3JkZXIsCi8vLyBidXQgcmVtb3ZpbmcgdGhlIGtleSBhbmQgYWRkaW5nIGl0IGFnYWluCi8vLyB3aWxsIG1ha2UgaXQgYmUgbGFzdCBpbiB0aGUgaXRlcmF0aW9uIG9yZGVyLgovLy8KLy8vIFRoZSBrZXlzIG9mIGEgYExpbmtlZEhhc2hNYXBgIG11c3QgaGF2ZSBjb25zaXN0ZW50IFtPYmplY3QuPT1dCi8vLyBhbmQgW09iamVjdC5oYXNoQ29kZV0gaW1wbGVtZW50YXRpb25zLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGA9PWAgb3BlcmF0b3IKLy8vIG11c3QgZGVmaW5lIGEgc3RhYmxlIGVxdWl2YWxlbmNlIHJlbGF0aW9uIG9uIHRoZSBrZXlzIChyZWZsZXhpdmUsCi8vLyBzeW1tZXRyaWMsIHRyYW5zaXRpdmUsIGFuZCBjb25zaXN0ZW50IG92ZXIgdGltZSksIGFuZCB0aGF0IGBoYXNoQ29kZWAKLy8vIG11c3QgYmUgdGhlIHNhbWUgZm9yIG9iamVjdHMgdGhhdCBhcmUgY29uc2lkZXJlZCBlcXVhbCBieSBgPT1gLgovLy8KLy8vIFRoZSBtYXAgYWxsb3dzIGBudWxsYCBhcyBhIGtleS4KYWJzdHJhY3QgY2xhc3MgTGlua2VkSGFzaE1hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgLy8vIENyZWF0ZXMgYW4gaW5zZXJ0aW9uLW9yZGVyZWQgaGFzaC10YWJsZSBiYXNlZCBbTWFwXS4KICAvLy8KICAvLy8gSWYgW2VxdWFsc10gaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgdG8gY29tcGFyZSB0aGUga2V5cyBpbiB0aGUgdGFibGUgd2l0aAogIC8vLyBuZXcga2V5cy4gSWYgW2VxdWFsc10gaXMgb21pdHRlZCwgdGhlIGtleSdzIG93biBbT2JqZWN0Lj09XSBpcyB1c2VkCiAgLy8vIGluc3RlYWQuCiAgLy8vCiAgLy8vIFNpbWlsYXIsIGlmIFtoYXNoQ29kZV0gaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgdG8gcHJvZHVjZSBhIGhhc2ggdmFsdWUKICAvLy8gZm9yIGtleXMgaW4gb3JkZXIgdG8gcGxhY2UgdGhlbSBpbiB0aGUgaGFzaCB0YWJsZS4gSWYgaXQgaXMgb21pdHRlZCwgdGhlCiAgLy8vIGtleSdzIG93biBbT2JqZWN0Lmhhc2hDb2RlXSBpcyB1c2VkLgogIC8vLwogIC8vLyBJZiB1c2luZyBtZXRob2RzIGxpa2UgW29wZXJhdG9yIFtdXSwgW3JlbW92ZV0gYW5kIFtjb250YWluc0tleV0gdG9nZXRoZXIKICAvLy8gd2l0aCBhIGN1c3RvbSBlcXVhbGl0eSBhbmQgaGFzaGNvZGUsIGFuIGV4dHJhIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbgogIC8vLyBjYW4gYmUgc3VwcGxpZWQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIFtlcXVhbHNdIG9yCiAgLy8vIFtoYXNoQ29kZV0gd2l0aCBhbiBhcmd1bWVudCB0aGF0IG1heSBub3QgYmUgYSBbS10gaW5zdGFuY2UsIGFuZCBpZiB0aGUKICAvLy8gY2FsbCByZXR1cm5zIGZhbHNlLCB0aGUga2V5IGlzIGFzc3VtZWQgdG8gbm90IGJlIGluIHRoZSBzZXQuCiAgLy8vIFRoZSBbaXNWYWxpZEtleV0gZnVuY3Rpb24gZGVmYXVsdHMgdG8ganVzdCB0ZXN0aW5nIGlmIHRoZSBvYmplY3QgaXMgYQogIC8vLyBbS10gaW5zdGFuY2UuCiAgLy8vCiAgLy8vIEV4YW1wbGU6CiAgLy8vCiAgLy8vICAgICBuZXcgTGlua2VkSGFzaE1hcDxpbnQsaW50PihlcXVhbHM6IChpbnQgYSwgaW50IGIpID0+IChiIC0gYSkgJSA1ID09IDAsCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogKGludCBlKSA9PiBlICUgNSkKICAvLy8KICAvLy8gVGhpcyBleGFtcGxlIG1hcCBkb2VzIG5vdCBuZWVkIGFuIGBpc1ZhbGlkS2V5YCBmdW5jdGlvbiB0byBiZSBwYXNzZWQuCiAgLy8vIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIGFjY2VwdHMgb25seSBgaW50YCB2YWx1ZXMsIHdoaWNoIGNhbiBzYWZlbHkgYmUKICAvLy8gcGFzc2VkIHRvIGJvdGggdGhlIGBlcXVhbHNgIGFuZCBgaGFzaENvZGVgIGZ1bmN0aW9ucy4KICAvLy8KICAvLy8gSWYgbmVpdGhlciBgZXF1YWxzYCwgYGhhc2hDb2RlYCwgbm9yIGBpc1ZhbGlkS2V5YCBpcyBwcm92aWRlZCwKICAvLy8gdGhlIGRlZmF1bHQgYGlzVmFsaWRLZXlgIGluc3RlYWQgYWNjZXB0cyBhbGwga2V5cy4KICAvLy8gVGhlIGRlZmF1bHQgZXF1YWxpdHkgYW5kIGhhc2hjb2RlIG9wZXJhdGlvbnMgYXJlIGFzc3VtZWQgdG8gd29yayBvbiBhbGwKICAvLy8gb2JqZWN0cy4KICAvLy8KICAvLy8gTGlrZXdpc2UsIGlmIGBlcXVhbHNgIGlzIFtpZGVudGljYWxdLCBgaGFzaENvZGVgIGlzIFtpZGVudGl0eUhhc2hDb2RlXQogIC8vLyBhbmQgYGlzVmFsaWRLZXlgIGlzIG9taXR0ZWQsIHRoZSByZXN1bHRpbmcgbWFwIGlzIGlkZW50aXR5IGJhc2VkLAogIC8vLyBhbmQgdGhlIGBpc1ZhbGlkS2V5YCBkZWZhdWx0cyB0byBhY2NlcHRpbmcgYWxsIGtleXMuCiAgLy8vIFN1Y2ggYSBtYXAgY2FuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgdXNpbmcgW0xpbmtlZEhhc2hNYXAuaWRlbnRpdHldLgogIC8vLwogIC8vLyBUaGUgdXNlZCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYCBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBjb25zaXN0ZW50LAogIC8vLyBzbyB0aGF0IGlmIGBlcXVhbHMoYSwgYilgIHRoZW4gYGhhc2hDb2RlKGEpID09IGhhc2hDb2RlKGIpYC4gVGhlIGhhc2gKICAvLy8gb2YgYW4gb2JqZWN0LCBvciB3aGF0IGl0IGNvbXBhcmVzIGVxdWFsIHRvLCBzaG91bGQgbm90IGNoYW5nZSB3aGlsZSB0aGUKICAvLy8gb2JqZWN0IGlzIGluIHRoZSB0YWJsZS4gSWYgaXQgZG9lcyBjaGFuZ2UsIHRoZSByZXN1bHQgaXMgdW5wcmVkaWN0YWJsZS4KICAvLy8KICAvLy8gSWYgeW91IHN1cHBseSBvbmUgb2YgW2VxdWFsc10gYW5kIFtoYXNoQ29kZV0sCiAgLy8vIHlvdSBzaG91bGQgZ2VuZXJhbGx5IGFsc28gdG8gc3VwcGx5IHRoZSBvdGhlci4KICBleHRlcm5hbCBmYWN0b3J5IExpbmtlZEhhc2hNYXAoCiAgICAgIHtib29sIGVxdWFscyhLIGtleTEsIEsga2V5MiksCiAgICAgIGludCBoYXNoQ29kZShLIGtleSksCiAgICAgIGJvb2wgaXNWYWxpZEtleShwb3RlbnRpYWxLZXkpfSk7CgogIC8vLyBDcmVhdGVzIGFuIGluc2VydGlvbi1vcmRlcmVkIGlkZW50aXR5LWJhc2VkIG1hcC4KICAvLy8KICAvLy8gRWZmZWN0aXZlbHkgYSBzaG9ydGhhbmQgZm9yOgogIC8vLwogIC8vLyAgICAgbmV3IExpbmtlZEhhc2hNYXA8SywgVj4oZXF1YWxzOiBpZGVudGljYWwsCiAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogaWRlbnRpdHlIYXNoQ29kZSkKICBleHRlcm5hbCBmYWN0b3J5IExpbmtlZEhhc2hNYXAuaWRlbnRpdHkoKTsKCiAgLy8vIENyZWF0ZXMgYSBbTGlua2VkSGFzaE1hcF0gdGhhdCBjb250YWlucyBhbGwga2V5IHZhbHVlIHBhaXJzIG9mIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFRoZSBrZXlzIG11c3QgYWxsIGJlIGluc3RhbmNlcyBvZiBbS10gYW5kIHRoZSB2YWx1ZXMgdG8gW1ZdLgogIC8vLyBUaGUgW290aGVyXSBtYXAgaXRzZWxmIGNhbiBoYXZlIGFueSB0eXBlLgogIGZhY3RvcnkgTGlua2VkSGFzaE1hcC5mcm9tKE1hcCBvdGhlcikgewogICAgTGlua2VkSGFzaE1hcDxLLCBWPiByZXN1bHQgPSBMaW5rZWRIYXNoTWFwPEssIFY+KCk7CiAgICBvdGhlci5mb3JFYWNoKChrLCB2KSB7CiAgICAgIHJlc3VsdFtrXSA9IHY7CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLy8gQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkgdmFsdWUgcGFpcnMgb2YgW290aGVyXS4KICBmYWN0b3J5IExpbmtlZEhhc2hNYXAub2YoTWFwPEssIFY+IG90aGVyKSA9PgogICAgICBMaW5rZWRIYXNoTWFwPEssIFY+KCkuLmFkZEFsbChvdGhlcik7CgogIC8vLyBDcmVhdGVzIGEgW0xpbmtlZEhhc2hNYXBdIHdoZXJlIHRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIGNvbXB1dGVkIGZyb20gdGhlCiAgLy8vIFtpdGVyYWJsZV0uCiAgLy8vCiAgLy8vIEZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIFtpdGVyYWJsZV0gdGhpcyBjb25zdHJ1Y3RvciBjb21wdXRlcyBhIGtleS92YWx1ZQogIC8vLyBwYWlyLCBieSBhcHBseWluZyBba2V5XSBhbmQgW3ZhbHVlXSByZXNwZWN0aXZlbHkuCiAgLy8vCiAgLy8vIFRoZSBrZXlzIG9mIHRoZSBrZXkvdmFsdWUgcGFpcnMgZG8gbm90IG5lZWQgdG8gYmUgdW5pcXVlLiBUaGUgbGFzdAogIC8vLyBvY2N1cnJlbmNlIG9mIGEga2V5IHdpbGwgc2ltcGx5IG92ZXJ3cml0ZSBhbnkgcHJldmlvdXMgdmFsdWUuCiAgLy8vCiAgLy8vIElmIG5vIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGZvciBba2V5XSBhbmQgW3ZhbHVlXSB0aGUgZGVmYXVsdCBpcyB0aGUKICAvLy8gaWRlbnRpdHkgZnVuY3Rpb24uCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmZyb21JdGVyYWJsZShJdGVyYWJsZSBpdGVyYWJsZSwKICAgICAge0sga2V5KGVsZW1lbnQpLCBWIHZhbHVlKGVsZW1lbnQpfSkgewogICAgTGlua2VkSGFzaE1hcDxLLCBWPiBtYXAgPSBMaW5rZWRIYXNoTWFwPEssIFY+KCk7CiAgICBNYXBCYXNlLl9maWxsTWFwV2l0aE1hcHBlZEl0ZXJhYmxlKG1hcCwgaXRlcmFibGUsIGtleSwgdmFsdWUpOwogICAgcmV0dXJuIG1hcDsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0xpbmtlZEhhc2hNYXBdIGFzc29jaWF0aW5nIHRoZSBnaXZlbiBba2V5c10gdG8gW3ZhbHVlc10uCiAgLy8vCiAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXRlcmF0ZXMgb3ZlciBba2V5c10gYW5kIFt2YWx1ZXNdIGFuZCBtYXBzIGVhY2ggZWxlbWVudCBvZgogIC8vLyBba2V5c10gdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBbdmFsdWVzXS4KICAvLy8KICAvLy8gSWYgW2tleXNdIGNvbnRhaW5zIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3Qgb2NjdXJyZW5jZQogIC8vLyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS4KICAvLy8KICAvLy8gSXQgaXMgYW4gZXJyb3IgaWYgdGhlIHR3byBbSXRlcmFibGVdcyBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4KICBmYWN0b3J5IExpbmtlZEhhc2hNYXAuZnJvbUl0ZXJhYmxlcyhJdGVyYWJsZTxLPiBrZXlzLCBJdGVyYWJsZTxWPiB2YWx1ZXMpIHsKICAgIExpbmtlZEhhc2hNYXA8SywgVj4gbWFwID0gTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgTWFwQmFzZS5fZmlsbE1hcFdpdGhJdGVyYWJsZXMobWFwLCBrZXlzLCB2YWx1ZXMpOwogICAgcmV0dXJuIG1hcDsKICB9CgogIC8vLyBDcmVhdGVzIGEgW0xpbmtlZEhhc2hNYXBdIGNvbnRhaW5pbmcgdGhlIGVudHJpZXMgb2YgW2VudHJpZXNdLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgbmV3IGBMaW5rZWRIYXNoTWFwPEssIFY+YCB3aGVyZSBhbGwgZW50cmllcyBvZiBbZW50cmllc10KICAvLy8gaGF2ZSBiZWVuIGFkZGVkIGluIGl0ZXJhdGlvbiBvcmRlci4KICAvLy8KICAvLy8gSWYgbXVsdGlwbGUgW2VudHJpZXNdIGhhdmUgdGhlIHNhbWUga2V5LAogIC8vLyBsYXRlciBvY2N1cnJlbmNlcyBvdmVyd3JpdGUgdGhlIGVhcmxpZXIgb25lcy4KICBAU2luY2UoIjIuMSIpCiAgZmFjdG9yeSBMaW5rZWRIYXNoTWFwLmZyb21FbnRyaWVzKEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBlbnRyaWVzKSA9PgogICAgICA8SywgVj57fS4uYWRkRW50cmllcyhlbnRyaWVzKTsKfQqAjwBOTjwBGQEwBC9IPEApLTEEQ01GSkQEJDo7BlBKDwZNTysGT0pKTUNMFAYPBlFBBkxKPAZFOU4PBk1IO0kGS0xOTgY0NSIkGycBNwYjBjU+LQFOBkMwKjgbFQgTBAFOLywBUBIGTzgGSUQGShk4LDVDEAQBSgZSNwZNJQZITjU2EAQBRQZJKgYvNBBJJQIBJGRhcnQ6Y29sbGVjdGlvbi9saW5rZWRfaGFzaF9tYXAuZGFydDdvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29sbGVjdGlvbi9saW5rZWRfbGlzdC5kYXJ0nr0vLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gQSBzcGVjaWFsaXplZCBkb3VibGUtbGlua2VkIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBleHRlbmRzIFtMaW5rZWRMaXN0RW50cnldLgovLy8KLy8vIFRoaXMgaXMgbm90IGEgZ2VuZXJpYyBkYXRhIHN0cnVjdHVyZS4gSXQgb25seSBhY2NlcHRzIGVsZW1lbnRzIHRoYXQgZXh0ZW5kCi8vLyB0aGUgW0xpbmtlZExpc3RFbnRyeV0gY2xhc3MuIFNlZSB0aGUgW1F1ZXVlXSBpbXBsZW1lbnRhdGlvbnMgZm9yIGdlbmVyaWMKLy8vIGNvbGxlY3Rpb25zIHRoYXQgYWxsb3cgY29uc3RhbnQgdGltZSBhZGRpbmcgYW5kIHJlbW92aW5nIGF0IHRoZSBlbmRzLgovLy8KLy8vIFRoaXMgaXMgbm90IGEgW0xpc3RdIGltcGxlbWVudGF0aW9uLiBEZXNwaXRlIGl0cyBuYW1lLCB0aGlzIGNsYXNzIGRvZXMgbm90Ci8vLyBpbXBsZW1lbnQgdGhlIFtMaXN0XSBpbnRlcmZhY2UuIEl0IGRvZXMgbm90IGFsbG93IGNvbnN0YW50IHRpbWUgbG9va3VwIGJ5Ci8vLyBpbmRleC4KLy8vCi8vLyBCZWNhdXNlIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGNvbnRhaW4gdGhlIGxpbmtzIG9mIHRoaXMgbGlua2VkIGxpc3QsCi8vLyBlYWNoIGVsZW1lbnQgY2FuIGJlIGluIG9ubHkgb25lIGxpc3QgYXQgYSB0aW1lLiBUbyBhZGQgYW4gZWxlbWVudCB0byBhbm90aGVyCi8vLyBsaXN0LCBpdCBtdXN0IGZpcnN0IGJlIHJlbW92ZWQgZnJvbSBpdHMgY3VycmVudCBsaXN0IChpZiBhbnkpLgovLy8KLy8vIEluIHJldHVybiwgZWFjaCBlbGVtZW50IGtub3dzIGl0cyBvd24gcGxhY2UgaW4gdGhlIGxpbmtlZCBsaXN0LCBhcyB3ZWxsIGFzCi8vLyB3aGljaCBsaXN0IGl0IGlzIGluLiBUaGlzIGFsbG93cyBjb25zdGFudCB0aW1lCi8vLyBbTGlua2VkTGlzdEVudHJ5Lmluc2VydEFmdGVyXSwgW0xpbmtlZExpc3RFbnRyeS5pbnNlcnRCZWZvcmVdIGFuZAovLy8gW0xpbmtlZExpc3RFbnRyeS51bmxpbmtdIG9wZXJhdGlvbnMgd2hlbiBhbGwgeW91IGhhdmUgaXMgdGhlIGVsZW1lbnQuCi8vLwovLy8gQSBgTGlua2VkTGlzdGAgYWxzbyBhbGxvd3MgY29uc3RhbnQgdGltZSBhZGRpbmcgYW5kIHJlbW92aW5nIGF0IGVpdGhlciBlbmQsCi8vLyBhbmQgYSBjb25zdGFudCB0aW1lIGxlbmd0aCBnZXR0ZXIuCmNsYXNzIExpbmtlZExpc3Q8RSBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxFPj4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgaW50IF9tb2RpZmljYXRpb25Db3VudCA9IDA7CiAgaW50IF9sZW5ndGggPSAwOwogIEUgX2ZpcnN0OwoKICAvLy8gQ29uc3RydWN0IGEgbmV3IGVtcHR5IGxpbmtlZCBsaXN0LgogIExpbmtlZExpc3QoKTsKCiAgLy8vIEFkZCBbZW50cnldIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmtlZCBsaXN0LgogIHZvaWQgYWRkRmlyc3QoRSBlbnRyeSkgewogICAgX2luc2VydEJlZm9yZShfZmlyc3QsIGVudHJ5LCB1cGRhdGVGaXJzdDogdHJ1ZSk7CiAgICBfZmlyc3QgPSBlbnRyeTsKICB9CgogIC8vLyBBZGQgW2VudHJ5XSB0byB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdC4KICB2b2lkIGFkZChFIGVudHJ5KSB7CiAgICBfaW5zZXJ0QmVmb3JlKF9maXJzdCwgZW50cnksIHVwZGF0ZUZpcnN0OiBmYWxzZSk7CiAgfQoKICAvLy8gQWRkIFtlbnRyaWVzXSB0byB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdC4KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBlbnRyaWVzKSB7CiAgICBlbnRyaWVzLmZvckVhY2goYWRkKTsKICB9CgogIC8vLyBSZW1vdmUgW2VudHJ5XSBmcm9tIHRoZSBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gUmV0dXJucyBmYWxzZSBhbmQgZG9lcyBub3RoaW5nIGlmIFtlbnRyeV0gaXMgbm90IGluIHRoaXMgbGlua2VkIGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGBlbnRyeS51bmxpbmsoKWAgaWYgdGhlIGVudHJ5IGlzIGluIHRoaXMKICAvLy8gbGlzdC4KICBib29sIHJlbW92ZShFIGVudHJ5KSB7CiAgICBpZiAoZW50cnkuX2xpc3QgIT0gdGhpcykgcmV0dXJuIGZhbHNlOwogICAgX3VubGluayhlbnRyeSk7IC8vIFVubGluayB3aWxsIGRlY3JlbWVudCBsZW5ndGguCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBfTGlua2VkTGlzdEl0ZXJhdG9yPEU+KHRoaXMpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbGVuZ3RoOwoKICAvLy8gUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgbGlua2VkIGxpc3QuCiAgdm9pZCBjbGVhcigpIHsKICAgIF9tb2RpZmljYXRpb25Db3VudCsrOwogICAgaWYgKGlzRW1wdHkpIHJldHVybjsKCiAgICBFIG5leHQgPSBfZmlyc3Q7CiAgICBkbyB7CiAgICAgIEUgZW50cnkgPSBuZXh0OwogICAgICBuZXh0ID0gZW50cnkuX25leHQ7CiAgICAgIGVudHJ5Ll9uZXh0ID0gZW50cnkuX3ByZXZpb3VzID0gZW50cnkuX2xpc3QgPSBudWxsOwogICAgfSB3aGlsZSAoIWlkZW50aWNhbChuZXh0LCBfZmlyc3QpKTsKCiAgICBfZmlyc3QgPSBudWxsOwogICAgX2xlbmd0aCA9IDA7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAoaXNFbXB0eSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCdObyBzdWNoIGVsZW1lbnQnKTsKICAgIH0KICAgIHJldHVybiBfZmlyc3Q7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoJ05vIHN1Y2ggZWxlbWVudCcpOwogICAgfQogICAgcmV0dXJuIF9maXJzdC5fcHJldmlvdXM7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcignTm8gc3VjaCBlbGVtZW50Jyk7CiAgICB9CiAgICBpZiAoX2xlbmd0aCA+IDEpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcignVG9vIG1hbnkgZWxlbWVudHMnKTsKICAgIH0KICAgIHJldHVybiBfZmlyc3Q7CiAgfQoKICAvLy8gQ2FsbCBbYWN0aW9uXSB3aXRoIGVhY2ggZW50cnkgaW4gdGhpcyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gSXQncyBhbiBlcnJvciBpZiBbYWN0aW9uXSBtb2RpZnkgdGhlIGxpbmtlZCBsaXN0LgogIHZvaWQgZm9yRWFjaCh2b2lkIGFjdGlvbihFIGVudHJ5KSkgewogICAgaW50IG1vZGlmaWNhdGlvbkNvdW50ID0gX21vZGlmaWNhdGlvbkNvdW50OwogICAgaWYgKGlzRW1wdHkpIHJldHVybjsKCiAgICBFIGN1cnJlbnQgPSBfZmlyc3Q7CiAgICBkbyB7CiAgICAgIGFjdGlvbihjdXJyZW50KTsKICAgICAgaWYgKG1vZGlmaWNhdGlvbkNvdW50ICE9IF9tb2RpZmljYXRpb25Db3VudCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgICBjdXJyZW50ID0gY3VycmVudC5fbmV4dDsKICAgIH0gd2hpbGUgKCFpZGVudGljYWwoY3VycmVudCwgX2ZpcnN0KSk7CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IF9sZW5ndGggPT0gMDsKCiAgLy8vIEluc2VydHMgW25ld0VudHJ5XSBhcyBsYXN0IGVudHJ5IG9mIHRoZSBsaXN0LgogIC8vLwogIC8vLyBJZiBbdXBkYXRlRmlyc3RdIGlzIHRydWUgYW5kIFtlbnRyeV0gaXMgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0LAogIC8vLyB1cGRhdGVzIHRoZSBbX2ZpcnN0XSBmaWVsZCB0byBwb2ludCB0byB0aGUgW25ld0VudHJ5XSBhcyBmaXJzdCBlbnRyeS4KICB2b2lkIF9pbnNlcnRCZWZvcmUoRSBlbnRyeSwgRSBuZXdFbnRyeSwge2Jvb2wgdXBkYXRlRmlyc3R9KSB7CiAgICBpZiAobmV3RW50cnkubGlzdCAhPSBudWxsKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoJ0xpbmtlZExpc3RFbnRyeSBpcyBhbHJlYWR5IGluIGEgTGlua2VkTGlzdCcpOwogICAgfQogICAgX21vZGlmaWNhdGlvbkNvdW50Kys7CgogICAgbmV3RW50cnkuX2xpc3QgPSB0aGlzOwogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgYXNzZXJ0KGVudHJ5ID09IG51bGwpOwogICAgICBuZXdFbnRyeS5fcHJldmlvdXMgPSBuZXdFbnRyeS5fbmV4dCA9IG5ld0VudHJ5OwogICAgICBfZmlyc3QgPSBuZXdFbnRyeTsKICAgICAgX2xlbmd0aCsrOwogICAgICByZXR1cm47CiAgICB9CiAgICBFIHByZWRlY2Vzc29yID0gZW50cnkuX3ByZXZpb3VzOwogICAgRSBzdWNjZXNzb3IgPSBlbnRyeTsKICAgIG5ld0VudHJ5Ll9wcmV2aW91cyA9IHByZWRlY2Vzc29yOwogICAgbmV3RW50cnkuX25leHQgPSBzdWNjZXNzb3I7CiAgICBwcmVkZWNlc3Nvci5fbmV4dCA9IG5ld0VudHJ5OwogICAgc3VjY2Vzc29yLl9wcmV2aW91cyA9IG5ld0VudHJ5OwogICAgaWYgKHVwZGF0ZUZpcnN0ICYmIGlkZW50aWNhbChlbnRyeSwgX2ZpcnN0KSkgewogICAgICBfZmlyc3QgPSBuZXdFbnRyeTsKICAgIH0KICAgIF9sZW5ndGgrKzsKICB9CgogIHZvaWQgX3VubGluayhFIGVudHJ5KSB7CiAgICBfbW9kaWZpY2F0aW9uQ291bnQrKzsKICAgIGVudHJ5Ll9uZXh0Ll9wcmV2aW91cyA9IGVudHJ5Ll9wcmV2aW91czsKICAgIEUgbmV4dCA9IGVudHJ5Ll9wcmV2aW91cy5fbmV4dCA9IGVudHJ5Ll9uZXh0OwogICAgX2xlbmd0aC0tOwogICAgZW50cnkuX2xpc3QgPSBlbnRyeS5fbmV4dCA9IGVudHJ5Ll9wcmV2aW91cyA9IG51bGw7CiAgICBpZiAoaXNFbXB0eSkgewogICAgICBfZmlyc3QgPSBudWxsOwogICAgfSBlbHNlIGlmIChpZGVudGljYWwoZW50cnksIF9maXJzdCkpIHsKICAgICAgX2ZpcnN0ID0gbmV4dDsKICAgIH0KICB9Cn0KCmNsYXNzIF9MaW5rZWRMaXN0SXRlcmF0b3I8RSBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxFPj4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgTGlua2VkTGlzdDxFPiBfbGlzdDsKICBmaW5hbCBpbnQgX21vZGlmaWNhdGlvbkNvdW50OwogIEUgX2N1cnJlbnQ7CiAgTGlua2VkTGlzdEVudHJ5PEU+IF9uZXh0OwogIGJvb2wgX3Zpc2l0ZWRGaXJzdDsKCiAgX0xpbmtlZExpc3RJdGVyYXRvcihMaW5rZWRMaXN0PEU+IGxpc3QpCiAgICAgIDogX2xpc3QgPSBsaXN0LAogICAgICAgIF9tb2RpZmljYXRpb25Db3VudCA9IGxpc3QuX21vZGlmaWNhdGlvbkNvdW50LAogICAgICAgIF9uZXh0ID0gbGlzdC5fZmlyc3QsCiAgICAgICAgX3Zpc2l0ZWRGaXJzdCA9IGZhbHNlOwoKICBFIGdldCBjdXJyZW50ID0+IF9jdXJyZW50OwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9tb2RpZmljYXRpb25Db3VudCAhPSBfbGlzdC5fbW9kaWZpY2F0aW9uQ291bnQpIHsKICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgfQogICAgaWYgKF9saXN0LmlzRW1wdHkgfHwgKF92aXNpdGVkRmlyc3QgJiYgaWRlbnRpY2FsKF9uZXh0LCBfbGlzdC5maXJzdCkpKSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX3Zpc2l0ZWRGaXJzdCA9IHRydWU7CiAgICBfY3VycmVudCA9IF9uZXh0OwogICAgX25leHQgPSBfbmV4dC5fbmV4dDsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8vIEFuIG9iamVjdCB0aGF0IGNhbiBiZSBhbiBlbGVtZW50IGluIGEgW0xpbmtlZExpc3RdLgovLy8KLy8vIEFsbCBlbGVtZW50cyBvZiBhIGBMaW5rZWRMaXN0YCBtdXN0IGV4dGVuZCB0aGlzIGNsYXNzLgovLy8gVGhlIGNsYXNzIHByb3ZpZGVzIHRoZSBpbnRlcm5hbCBsaW5rcyB0aGF0IGxpbmsgZWxlbWVudHMgdG9nZXRoZXIKLy8vIGluIHRoZSBgTGlua2VkTGlzdGAsIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgbGlua2VkIGxpc3QgaXRzZWxmCi8vLyB0aGF0IGFuIGVsZW1lbnQgaXMgY3VycmVudGx5IHBhcnQgb2YuCi8vLwovLy8gQW4gZW50cnkgY2FuIGJlIGluIGF0IG1vc3Qgb25lIGxpbmtlZCBsaXN0IGF0IGEgdGltZS4KLy8vIFdoaWxlIGFuIGVudHJ5IGlzIGluIGEgbGlua2VkIGxpc3QsIHRoZSBbbGlzdF0gcHJvcGVydHkgcG9pbnRzIHRvIHRoYXQKLy8vIGxpbmtlZCBsaXN0LCBhbmQgb3RoZXJ3aXNlIHRoZSBgbGlzdGAgcHJvcGVydHkgaXMgYG51bGxgLgovLy8KLy8vIFdoZW4gY3JlYXRlZCwgYW4gZW50cnkgaXMgbm90IGluIGFueSBsaW5rZWQgbGlzdC4KYWJzdHJhY3QgY2xhc3MgTGlua2VkTGlzdEVudHJ5PEUgZXh0ZW5kcyBMaW5rZWRMaXN0RW50cnk8RT4+IHsKICBMaW5rZWRMaXN0PEU+IF9saXN0OwogIEUgX25leHQ7CiAgRSBfcHJldmlvdXM7CgogIC8vLyBHZXQgdGhlIGxpbmtlZCBsaXN0IGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LgogIC8vLwogIC8vLyBSZXR1cm5zIGBudWxsYCBpZiB0aGlzIGVudHJ5IGlzIG5vdCBjdXJyZW50bHkgaW4gYW55IGxpc3QuCiAgTGlua2VkTGlzdDxFPiBnZXQgbGlzdCA9PiBfbGlzdDsKCiAgLy8vIFVubGluayB0aGUgZWxlbWVudCBmcm9tIGl0cyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gVGhlIGVudHJ5IG11c3QgY3VycmVudGx5IGJlIGluIGEgbGlua2VkIGxpc3Qgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCiAgdm9pZCB1bmxpbmsoKSB7CiAgICBfbGlzdC5fdW5saW5rKHRoaXMpOwogIH0KCiAgLy8vIFJldHVybiB0aGUgc3VjY2Vzc29yIG9mIHRoaXMgZWxlbWVudCBpbiBpdHMgbGlua2VkIGxpc3QuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2Nlc3NvciBpbiB0aGUgbGlua2VkIGxpc3QsIG9yIGlmIHRoaXMKICAvLy8gZW50cnkgaXMgbm90IGN1cnJlbnRseSBpbiBhbnkgbGlzdC4KICBFIGdldCBuZXh0IHsKICAgIGlmIChfbGlzdCA9PSBudWxsIHx8IGlkZW50aWNhbChfbGlzdC5maXJzdCwgX25leHQpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfbmV4dDsKICB9CgogIC8vLyBSZXR1cm4gdGhlIHByZWRlY2Vzc29yIG9mIHRoaXMgZWxlbWVudCBpbiBpdHMgbGlua2VkIGxpc3QuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHByZWRlY2Vzc29yIGluIHRoZSBsaW5rZWQgbGlzdCwgb3IgaWYgdGhpcwogIC8vLyBlbnRyeSBpcyBub3QgY3VycmVudGx5IGluIGFueSBsaXN0LgogIEUgZ2V0IHByZXZpb3VzIHsKICAgIGlmIChfbGlzdCA9PSBudWxsIHx8IGlkZW50aWNhbCh0aGlzLCBfbGlzdC5maXJzdCkpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9wcmV2aW91czsKICB9CgogIC8vLyBJbnNlcnQgYW4gZWxlbWVudCBhZnRlciB0aGlzIGVsZW1lbnQgaW4gdGhpcyBlbGVtZW50J3MgbGlua2VkIGxpc3QuCiAgLy8vCiAgLy8vIFRoaXMgZW50cnkgbXVzdCBiZSBpbiBhIGxpbmtlZCBsaXN0IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogIC8vLyBUaGUgW2VudHJ5XSBtdXN0IG5vdCBiZSBpbiBhIGxpbmtlZCBsaXN0LgogIHZvaWQgaW5zZXJ0QWZ0ZXIoRSBlbnRyeSkgewogICAgX2xpc3QuX2luc2VydEJlZm9yZShfbmV4dCwgZW50cnksIHVwZGF0ZUZpcnN0OiBmYWxzZSk7CiAgfQoKICAvLy8gSW5zZXJ0IGFuIGVsZW1lbnQgYmVmb3JlIHRoaXMgZWxlbWVudCBpbiB0aGlzIGVsZW1lbnQncyBsaW5rZWQgbGlzdC4KICAvLy8KICAvLy8gVGhpcyBlbnRyeSBtdXN0IGJlIGluIGEgbGlua2VkIGxpc3Qgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCiAgLy8vIFRoZSBbZW50cnldIG11c3Qgbm90IGJlIGluIGEgbGlua2VkIGxpc3QuCiAgdm9pZCBpbnNlcnRCZWZvcmUoRSBlbnRyeSkgewogICAgX2xpc3QuX2luc2VydEJlZm9yZSh0aGlzLCBlbnRyeSwgdXBkYXRlRmlyc3Q6IHRydWUpOwogIH0KfQqBCQBOTjwBGQFRBE9NSgRPTgsES1FDBE8zRkoEUCdFHhMMASkQATcbNRQEATEWNgQBMyUaBAErBkwGTQwZKzURBAE8AR0BMREaGQEVCRYaOigBExEEARATKwYTBAEPEysGHQQBERMrBhctBhMEATkGOCcwGQEYCRc1MQgfKwQBJAE0BktMQCFGBhoBGxMdNhkRDgYlGSYgIiQzGQYPBAEaGi0yDzgTFSsVBgQCAVEdIA4cFgEqFjYdHwEdARQ6LwZNFxQGGhYZEQQCATgEO0ZDKgQ6Sz4ENj8XCw8BMwZBIwEvBk8SGQQBPwZNKg9FEgQBQQZPKhNEFgQBSgZGMB47BAFLBkYwHzkEAgEgZGFydDpjb2xsZWN0aW9uL2xpbmtlZF9saXN0LmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbGxlY3Rpb24vbGlzdC5kYXJ0vPQvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbGxlY3Rpb247CgovLy8gQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBsaXN0LgovLy8KLy8vIGBMaXN0QmFzZWAgY2FuIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGBMaXN0YAovLy8gaW50ZXJmYWNlLgovLy8KLy8vIEFsbCBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIGBsZW5ndGhgLCBgb3BlcmF0b3JbXWAsCi8vLyBgb3BlcmF0b3JbXT1gIGFuZCBgbGVuZ3RoPWAsIHdoaWNoIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi8vLwovLy8gKk5PVElDRSo6IEZvcndhcmRpbmcganVzdCB0aGVzZSBmb3VyIG9wZXJhdGlvbnMgdG8gYSBub3JtYWwgZ3Jvd2FibGUgW0xpc3RdCi8vLyAoYXMgY3JlYXRlZCBieSBgbmV3IExpc3QoKWApIHdpbGwgZ2l2ZSB2ZXJ5IGJhZCBwZXJmb3JtYW5jZSBmb3IgYGFkZGAgYW5kCi8vLyBgYWRkQWxsYCBvcGVyYXRpb25zIG9mIGBMaXN0QmFzZWAuIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGltcGxlbWVudGVkIGJ5Ci8vLyBpbmNyZWFzaW5nIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYnkgb25lIGZvciBlYWNoIGBhZGRgIG9wZXJhdGlvbiwgYW5kCi8vLyByZXBlYXRlZGx5IGluY3JlYXNpbmcgdGhlIGxlbmd0aCBvZiBhIGdyb3dhYmxlIGxpc3QgaXMgbm90IGVmZmljaWVudC4KLy8vIFRvIGF2b2lkIHRoaXMsIGVpdGhlciBvdmVycmlkZSAnYWRkJyBhbmQgJ2FkZEFsbCcgdG8gYWxzbyBmb3J3YXJkIGRpcmVjdGx5Ci8vLyB0byB0aGUgZ3Jvd2FibGUgbGlzdCwgb3IsIHByZWZlcmFibHksIHVzZSBgRGVsZWdhdGluZ0xpc3RgIGZyb20KLy8vICJwYWNrYWdlOmNvbGxlY3Rpb24vd3JhcHBlcnMuZGFydCIgaW5zdGVhZC4KYWJzdHJhY3QgY2xhc3MgTGlzdEJhc2U8RT4gZXh0ZW5kcyBPYmplY3Qgd2l0aCBMaXN0TWl4aW48RT4gewogIC8vLyBDb252ZXJ0IGEgYExpc3RgIHRvIGEgc3RyaW5nIGFzIGBbZWFjaCwgZWxlbWVudCwgYXMsIHN0cmluZ11gLgogIC8vLwogIC8vLyBIYW5kbGVzIGNpcmN1bGFyIHJlZmVyZW5jZXMgd2hlcmUgY29udmVydGluZyBvbmUgb2YgdGhlIGVsZW1lbnRzCiAgLy8vIHRvIGEgc3RyaW5nIGVuZHMgdXAgY29udmVydGluZyBbbGlzdF0gdG8gYSBzdHJpbmcgYWdhaW4uCiAgc3RhdGljIFN0cmluZyBsaXN0VG9TdHJpbmcoTGlzdCBsaXN0KSA9PgogICAgICBJdGVyYWJsZUJhc2UuaXRlcmFibGVUb0Z1bGxTdHJpbmcobGlzdCwgJ1snLCAnXScpOwp9CgovLy8gQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhIFtMaXN0XSBjbGFzcy4KLy8vCi8vLyBgTGlzdE1peGluYCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIHRvIG1ha2UgYSBjbGFzcyBpbXBsZW1lbnQKLy8vIHRoZSBgTGlzdGAgaW50ZXJmYWNlLgovLy8KLy8vIFRoaXMgaW1wbGVtZW50cyBhbGwgcmVhZCBvcGVyYXRpb25zIHVzaW5nIG9ubHkgdGhlIGBsZW5ndGhgIGFuZAovLy8gYG9wZXJhdG9yW11gIG1lbWJlcnMuIEl0IGltcGxlbWVudHMgd3JpdGUgb3BlcmF0aW9ucyB1c2luZyB0aG9zZSBhbmQKLy8vIGBsZW5ndGg9YCBhbmQgYG9wZXJhdG9yW109YAovLy8KLy8vICpOT1RJQ0UqOiBGb3J3YXJkaW5nIGp1c3QgdGhlc2UgZm91ciBvcGVyYXRpb25zIHRvIGEgbm9ybWFsIGdyb3dhYmxlIFtMaXN0XQovLy8gKGFzIGNyZWF0ZWQgYnkgYG5ldyBMaXN0KClgKSB3aWxsIGdpdmUgdmVyeSBiYWQgcGVyZm9ybWFuY2UgZm9yIGBhZGRgIGFuZAovLy8gYGFkZEFsbGAgb3BlcmF0aW9ucyBvZiBgTGlzdEJhc2VgLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBpbXBsZW1lbnRlZCBieQovLy8gaW5jcmVhc2luZyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJ5IG9uZSBmb3IgZWFjaCBgYWRkYCBvcGVyYXRpb24sIGFuZAovLy8gcmVwZWF0ZWRseSBpbmNyZWFzaW5nIHRoZSBsZW5ndGggb2YgYSBncm93YWJsZSBsaXN0IGlzIG5vdCBlZmZpY2llbnQuCi8vLyBUbyBhdm9pZCB0aGlzLCBlaXRoZXIgb3ZlcnJpZGUgJ2FkZCcgYW5kICdhZGRBbGwnIHRvIGFsc28gZm9yd2FyZCBkaXJlY3RseQovLy8gdG8gdGhlIGdyb3dhYmxlIGxpc3QsIG9yLCBpZiBwb3NzaWJsZSwgdXNlIGBEZWxlZ2F0aW5nTGlzdGAgZnJvbQovLy8gInBhY2thZ2U6Y29sbGVjdGlvbi93cmFwcGVycy5kYXJ0IiBpbnN0ZWFkLgphYnN0cmFjdCBjbGFzcyBMaXN0TWl4aW48RT4gaW1wbGVtZW50cyBMaXN0PEU+IHsKICAvLyBJdGVyYWJsZSBpbnRlcmZhY2UuCiAgLy8gVE9ETyhscm4pOiBXaGVuIHdlIGdldCBjb21wb3NhYmxlIG1peGlucywgcmV1c2UgSXRlcmFibGVNaXhpbiBpbnN0ZWFkCiAgLy8gb2YgcmVkYWNsYXRpbmcgZXZlcnl0aGluZy4KICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gTGlzdEl0ZXJhdG9yPEU+KHRoaXMpOwoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IHRoaXNbaW5kZXhdOwoKICBJdGVyYWJsZTxFPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEU+IG90aGVyKSA9PgogICAgICBGb2xsb3dlZEJ5SXRlcmFibGU8RT4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwoKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBhY3Rpb24odGhpc1tpXSk7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gbGVuZ3RoID09IDA7CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gdGhpc1swXTsKICB9CgogIHZvaWQgc2V0IGZpcnN0KEUgdmFsdWUpIHsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aGlzWzBdID0gdmFsdWU7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICB9CgogIHZvaWQgc2V0IGxhc3QoRSB2YWx1ZSkgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRoaXNbbGVuZ3RoIC0gMV0gPSB2YWx1ZTsKICB9CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgaWYgKGxlbmd0aCA+IDEpIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICAgIHJldHVybiB0aGlzWzBdOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBldmVyeShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoIXRlc3QodGhpc1tpXSkpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEUgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBFIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIEUgbWF0Y2g7CiAgICBib29sIG1hdGNoRm91bmQgPSBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgRSBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAobWF0Y2hGb3VuZCkgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTsKICAgICAgICBtYXRjaCA9IGVsZW1lbnQ7CiAgICAgIH0KICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgaWYgKG1hdGNoRm91bmQpIHJldHVybiBtYXRjaDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gIiI7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCkuLndyaXRlQWxsKHRoaXMsIHNlcGFyYXRvcik7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBJdGVyYWJsZTxFPiB3aGVyZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gV2hlcmVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gV2hlcmVUeXBlSXRlcmFibGU8VD4odGhpcyk7CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4gTWFwcGVkTGlzdEl0ZXJhYmxlPEUsIFQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihFIGVsZW1lbnQpKSA9PgogICAgICBFeHBhbmRJdGVyYWJsZTxFLCBUPih0aGlzLCBmKTsKCiAgRSByZWR1Y2UoRSBjb21iaW5lKEUgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIEUgdmFsdWUgPSB0aGlzWzBdOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCB0aGlzW2ldKTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpID0+IFN1Ykxpc3RJdGVyYWJsZTxFPih0aGlzLCBjb3VudCwgbnVsbCk7CgogIEl0ZXJhYmxlPEU+IHNraXBXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgcmV0dXJuIFNraXBXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpID0+IFN1Ykxpc3RJdGVyYWJsZTxFPih0aGlzLCAwLCBjb3VudCk7CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgcmV0dXJuIFRha2VXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgTGlzdDxFPiByZXN1bHQ7CiAgICBpZiAoZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IExpc3Q8RT4obGVuZ3RoKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gdGhpc1tpXTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gdG9TZXQoKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gU2V0PEU+KCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdC5hZGQodGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gTGlzdCBpbnRlcmZhY2UuCiAgdm9pZCBhZGQoRSBlbGVtZW50KSB7CiAgICB0aGlzW3RoaXMubGVuZ3RoKytdID0gZWxlbWVudDsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBpbnQgaSA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChFIGVsZW1lbnQgaW4gaXRlcmFibGUpIHsKICAgICAgYXNzZXJ0KHRoaXMubGVuZ3RoID09IGkgfHwgKHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKSkpOwogICAgICB0aGlzLmxlbmd0aCA9IGkgKyAxOwogICAgICB0aGlzW2ldID0gZWxlbWVudDsKICAgICAgaSsrOwogICAgfQogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSB7CiAgICAgICAgdGhpcy5fY2xvc2VHYXAoaSwgaSArIDEpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLy8gUmVtb3ZlcyBlbGVtZW50cyBmcm9tIHRoZSBsaXN0IHN0YXJ0aW5nIGF0IFtzdGFydF0gdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcKICAvLy8gW2VuZF0uICBBcmd1bWVudHMgYXJlIHByZS12YWxpZGF0ZWQuCiAgdm9pZCBfY2xvc2VHYXAoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBhc3NlcnQoMCA8PSBzdGFydCk7CiAgICBhc3NlcnQoc3RhcnQgPCBlbmQpOwogICAgYXNzZXJ0KGVuZCA8PSBsZW5ndGgpOwogICAgaW50IHNpemUgPSBlbmQgLSBzdGFydDsKICAgIGZvciAoaW50IGkgPSBlbmQ7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB0aGlzW2kgLSBzaXplXSA9IHRoaXNbaV07CiAgICB9CiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aCAtIHNpemU7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICBfZmlsdGVyKHRlc3QsIGZhbHNlKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIF9maWx0ZXIodGVzdCwgdHJ1ZSk7CiAgfQoKICB2b2lkIF9maWx0ZXIoYm9vbCB0ZXN0KEUgZWxlbWVudCksIGJvb2wgcmV0YWluTWF0Y2hpbmcpIHsKICAgIExpc3Q8RT4gcmV0YWluZWQgPSA8RT5bXTsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSA9PSByZXRhaW5NYXRjaGluZykgewogICAgICAgIHJldGFpbmVkLmFkZChlbGVtZW50KTsKICAgICAgfQogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBpZiAocmV0YWluZWQubGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgIHRoaXMuc2V0UmFuZ2UoMCwgcmV0YWluZWQubGVuZ3RoLCByZXRhaW5lZCk7CiAgICAgIHRoaXMubGVuZ3RoID0gcmV0YWluZWQubGVuZ3RoOwogICAgfQogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIHRoaXMubGVuZ3RoID0gMDsKICB9CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IExpc3QuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgRSByZW1vdmVMYXN0KCkgewogICAgaWYgKGxlbmd0aCA9PSAwKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgfQogICAgRSByZXN1bHQgPSB0aGlzW2xlbmd0aCAtIDFdOwogICAgbGVuZ3RoLS07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShFIGEsIEUgYildKSB7CiAgICBTb3J0LnNvcnQodGhpcywgY29tcGFyZSA/PyBfY29tcGFyZUFueSk7CiAgfQoKICBzdGF0aWMgaW50IF9jb21wYXJlQW55KGEsIGIpIHsKICAgIC8vIEluIHN0cm9uZyBtb2RlIENvbXBhcmFibGUuY29tcGFyZSByZXF1aXJlcyBhbiBpbXBsaWNpdCBjYXN0IHRvIGVuc3VyZQogICAgLy8gYGFgIGFuZCBgYmAgYXJlIENvbXBhcmFibGUuCiAgICByZXR1cm4gQ29tcGFyYWJsZS5jb21wYXJlKGEsIGIpOwogIH0KCiAgdm9pZCBzaHVmZmxlKFtSYW5kb20gcmFuZG9tXSkgewogICAgcmFuZG9tID8/PSBSYW5kb20oKTsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIHdoaWxlIChsZW5ndGggPiAxKSB7CiAgICAgIGludCBwb3MgPSByYW5kb20ubmV4dEludChsZW5ndGgpOwogICAgICBsZW5ndGggLT0gMTsKICAgICAgdmFyIHRtcCA9IHRoaXNbbGVuZ3RoXTsKICAgICAgdGhpc1tsZW5ndGhdID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICBNYXA8aW50LCBFPiBhc01hcCgpIHsKICAgIHJldHVybiBMaXN0TWFwVmlldzxFPih0aGlzKTsKICB9CgogIExpc3Q8RT4gb3BlcmF0b3IgKyhMaXN0PEU+IG90aGVyKSB7CiAgICB2YXIgcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9ICh0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgdGhpcy5sZW5ndGgsIHRoaXMpOwogICAgcmVzdWx0LnNldFJhbmdlKHRoaXMubGVuZ3RoLCByZXN1bHQubGVuZ3RoLCBvdGhlcik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBpbnQgbGlzdExlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZW5kID8/PSBsaXN0TGVuZ3RoOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGlzdExlbmd0aCk7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBMaXN0PEU+IHJlc3VsdCA9IDxFPltdLi5sZW5ndGggPSBsZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdFtpXSA9IHRoaXNbc3RhcnQgKyBpXTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBJdGVyYWJsZTxFPiBnZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHJldHVybiBTdWJMaXN0SXRlcmFibGU8RT4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgaWYgKGVuZCA+IHN0YXJ0KSB7CiAgICAgIF9jbG9zZUdhcChzdGFydCwgZW5kKTsKICAgIH0KICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0UgZmlsbF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHRoaXNbaV0gPSBmaWxsOwogICAgfQogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybjsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShza2lwQ291bnQsICJza2lwQ291bnQiKTsKCiAgICBMaXN0PEU+IG90aGVyTGlzdDsKICAgIGludCBvdGhlclN0YXJ0OwogICAgLy8gVE9ETyhmbG9pdHNjaCk6IE1ha2UgdGhpcyBhY2NlcHQgbW9yZS4KICAgIGlmIChpdGVyYWJsZSBpcyBMaXN0PEU+KSB7CiAgICAgIG90aGVyTGlzdCA9IGl0ZXJhYmxlOwogICAgICBvdGhlclN0YXJ0ID0gc2tpcENvdW50OwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJMaXN0ID0gaXRlcmFibGUuc2tpcChza2lwQ291bnQpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICBvdGhlclN0YXJ0ID0gMDsKICAgIH0KICAgIGlmIChvdGhlclN0YXJ0ICsgbGVuZ3RoID4gb3RoZXJMaXN0Lmxlbmd0aCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KICAgIGlmIChvdGhlclN0YXJ0IDwgc3RhcnQpIHsKICAgICAgLy8gQ29weSBiYWNrd2FyZHMgdG8gZW5zdXJlIGNvcnJlY3QgY29weSBpZiBbZnJvbV0gaXMgdGhpcy4KICAgICAgZm9yIChpbnQgaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgdGhpc1tzdGFydCArIGldID0gb3RoZXJMaXN0W290aGVyU3RhcnQgKyBpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHRoaXNbc3RhcnQgKyBpXSA9IG90aGVyTGlzdFtvdGhlclN0YXJ0ICsgaV07CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gbmV3Q29udGVudHMpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGlmIChuZXdDb250ZW50cyBpcyEgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgbmV3Q29udGVudHMgPSBuZXdDb250ZW50cy50b0xpc3QoKTsKICAgIH0KICAgIGludCByZW1vdmVMZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGludCBpbnNlcnRMZW5ndGggPSBuZXdDb250ZW50cy5sZW5ndGg7CiAgICBpZiAocmVtb3ZlTGVuZ3RoID49IGluc2VydExlbmd0aCkgewogICAgICBpbnQgaW5zZXJ0RW5kID0gc3RhcnQgKyBpbnNlcnRMZW5ndGg7CiAgICAgIHRoaXMuc2V0UmFuZ2Uoc3RhcnQsIGluc2VydEVuZCwgbmV3Q29udGVudHMpOwogICAgICBpZiAocmVtb3ZlTGVuZ3RoID4gaW5zZXJ0TGVuZ3RoKSB7CiAgICAgICAgX2Nsb3NlR2FwKGluc2VydEVuZCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaW50IGRlbHRhID0gaW5zZXJ0TGVuZ3RoIC0gcmVtb3ZlTGVuZ3RoOwogICAgICBpbnQgbmV3TGVuZ3RoID0gdGhpcy5sZW5ndGggKyBkZWx0YTsKICAgICAgaW50IGluc2VydEVuZCA9IHN0YXJ0ICsgaW5zZXJ0TGVuZ3RoOyAvLyBha2EuIGVuZCArIGRlbHRhLgogICAgICB0aGlzLmxlbmd0aCA9IG5ld0xlbmd0aDsKICAgICAgdGhpcy5zZXRSYW5nZShpbnNlcnRFbmQsIG5ld0xlbmd0aCwgdGhpcywgZW5kKTsKICAgICAgdGhpcy5zZXRSYW5nZShzdGFydCwgaW5zZXJ0RW5kLCBuZXdDb250ZW50cyk7CiAgICB9CiAgfQoKICBpbnQgaW5kZXhPZihPYmplY3QgZWxlbWVudCwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IGVsZW1lbnQsIFtpbnQgc3RhcnRdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoaW5kZXgsICJpbmRleCIpOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbChpbmRleCwgMCwgbGVuZ3RoLCAiaW5kZXgiKTsKICAgIGlmIChpbmRleCA9PSB0aGlzLmxlbmd0aCkgewogICAgICBhZGQoZWxlbWVudCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMubGVuZ3RoKys7CiAgICBzZXRSYW5nZShpbmRleCArIDEsIHRoaXMubGVuZ3RoLCB0aGlzLCBpbmRleCk7CiAgICB0aGlzW2luZGV4XSA9IGVsZW1lbnQ7CiAgfQoKICBFIHJlbW92ZUF0KGludCBpbmRleCkgewogICAgRSByZXN1bHQgPSB0aGlzW2luZGV4XTsKICAgIF9jbG9zZUdhcChpbmRleCwgaW5kZXggKyAxKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKGluZGV4LCAwLCBsZW5ndGgsICJpbmRleCIpOwogICAgaWYgKGl0ZXJhYmxlIGlzISBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSB8fCBpZGVudGljYWwoaXRlcmFibGUsIHRoaXMpKSB7CiAgICAgIGl0ZXJhYmxlID0gaXRlcmFibGUudG9MaXN0KCk7CiAgICB9CiAgICBpbnQgaW5zZXJ0aW9uTGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoOwogICAgLy8gVGhlcmUgbWlnaHQgYmUgZXJyb3JzIGFmdGVyIHRoZSBsZW5ndGggY2hhbmdlLCBpbiB3aGljaCBjYXNlIHRoZSBsaXN0CiAgICAvLyB3aWxsIGVuZCB1cCBiZWluZyBtb2RpZmllZCBidXQgdGhlIG9wZXJhdGlvbiBub3QgY29tcGxldGUuIFVubGVzcyB3ZQogICAgLy8gYWx3YXlzIGdvIHRocm91Z2ggYSAidG9MaXN0IiB3ZSBjYW4ndCByZWFsbHkgYXZvaWQgdGhhdC4KICAgIHRoaXMubGVuZ3RoICs9IGluc2VydGlvbkxlbmd0aDsKICAgIGlmIChpdGVyYWJsZS5sZW5ndGggIT0gaW5zZXJ0aW9uTGVuZ3RoKSB7CiAgICAgIC8vIElmIHRoZSBpdGVyYWJsZSdzIGxlbmd0aCBpcyBsaW5rZWQgdG8gdGhpcyBsaXN0J3MgbGVuZ3RoIHNvbWVob3csCiAgICAgIC8vIHdlIGNhbid0IGluc2VydCBvbmUgaW4gdGhlIG90aGVyLgogICAgICB0aGlzLmxlbmd0aCAtPSBpbnNlcnRpb25MZW5ndGg7CiAgICAgIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihpdGVyYWJsZSk7CiAgICB9CiAgICBzZXRSYW5nZShpbmRleCArIGluc2VydGlvbkxlbmd0aCwgdGhpcy5sZW5ndGgsIHRoaXMsIGluZGV4KTsKICAgIHNldEFsbChpbmRleCwgaXRlcmFibGUpOwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIExpc3QpIHsKICAgICAgc2V0UmFuZ2UoaW5kZXgsIGluZGV4ICsgaXRlcmFibGUubGVuZ3RoLCBpdGVyYWJsZSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKEUgZWxlbWVudCBpbiBpdGVyYWJsZSkgewogICAgICAgIHRoaXNbaW5kZXgrK10gPSBlbGVtZW50OwogICAgICB9CiAgICB9CiAgfQoKICBJdGVyYWJsZTxFPiBnZXQgcmV2ZXJzZWQgPT4gUmV2ZXJzZWRMaXN0SXRlcmFibGU8RT4odGhpcyk7CgogIFN0cmluZyB0b1N0cmluZygpID0+IEl0ZXJhYmxlQmFzZS5pdGVyYWJsZVRvRnVsbFN0cmluZyh0aGlzLCAnWycsICddJyk7Cn0KghgATk48ARkBJwRHDwRDPwRQTktLSk9EMD5FBkc/KzkCASsEQRoEREkgBFBOS0tKT0UwMRlLIDUBKQEvOQEpHicXIzEIBgQBIwEjARA9FAQBHD0VBAEPPR0EARs9HgQBET06FAQBIh4nKyMxCAYSBAElHicoIzEIBhEEASMeJyYjMQgGEgQBNR4nGykjMQgGKSwEATQeLBspIzEIBiksBAE2Hg0dJxsbGjAKGxkIIzEIBiIpLAQBKSBFHgQBSwE8AUsBNSUBNB49FycnIzEIBhIEAUUeHicnIzEIBhIEAUgBMC0EAUUBMC0EASsUFCcNIAYnGwYTBAETHicbBhMEARUYIwQBJhkiTRsZCwYEASAsICIVCAYSBAFRKyceGBkbHCkgBiEEASsaBAErGQQBPB4eJx0tHwgjMQgGKjMlBgQBERUEATITFy4GIQ4TBAEnLQQBIU0jJQQBIhkeGSgTHiAXBgQBGCEEASY/KzgTBAEqIhg4Hi0nIwYTBAEtOTEEASk5Fx0GBAExOSgWBgQBUTkeHTkBFxQuHxweDUQWBjIrBh5CLjUIDSk1CAYEAUM5MyoGJCsoLDQpIwgNLytBHzY0BgQBMR4wKAYPBAE6HjAjBg8EATFIJygGDwQBOkgnIwYPBAEmMEAgFA4GEzMbBAEaHCETBAE0QE0kBitNTEAkLksrJjMGQR0EATEcOg0kIQgGBAE9AUoCARlkYXJ0OmNvbGxlY3Rpb24vbGlzdC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2NvbnZlcnQuZGFydIm8Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLwovLy8gRW5jb2RlcnMgYW5kIGRlY29kZXJzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gZGlmZmVyZW50IGRhdGEgcmVwcmVzZW50YXRpb25zLAovLy8gaW5jbHVkaW5nIEpTT04gYW5kIFVURi04LgovLy8KLy8vIEluIGFkZGl0aW9uIHRvIGNvbnZlcnRlcnMgZm9yIGNvbW1vbiBkYXRhIHJlcHJlc2VudGF0aW9ucywgdGhpcyBsaWJyYXJ5Ci8vLyBwcm92aWRlcyBzdXBwb3J0IGZvciBpbXBsZW1lbnRpbmcgY29udmVydGVycyBpbiBhIHdheSB3aGljaCBtYWtlcyB0aGVtIGVhc3kgdG8KLy8vIGNoYWluIGFuZCB0byB1c2Ugd2l0aCBzdHJlYW1zLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6Y29udmVydCc7Ci8vLwovLy8gVHdvIGNvbW1vbmx5IHVzZWQgY29udmVydGVycyBhcmUgdGhlIHRvcC1sZXZlbCBpbnN0YW5jZXMgb2YKLy8vIFtKc29uQ29kZWNdIGFuZCBbVXRmOENvZGVjXSwgbmFtZWQgW2pzb25dIGFuZCBbdXRmOF0sIHJlc3BlY3RpdmVseS4KLy8vCi8vLyBKU09OIGlzIGEgc2ltcGxlIHRleHQgZm9ybWF0IGZvciByZXByZXNlbnRpbmcKLy8vIHN0cnVjdHVyZWQgb2JqZWN0cyBhbmQgY29sbGVjdGlvbnMuCi8vLyBUaGUgSlNPTiBlbmNvZGVyL2RlY29kZXIgdHJhbnNmb3JtcyBiZXR3ZWVuIHN0cmluZ3MgYW5kCi8vLyBvYmplY3Qgc3RydWN0dXJlcywgc3VjaCBhcyBsaXN0cyBhbmQgbWFwcywgdXNpbmcgdGhlIEpTT04gZm9ybWF0LgovLy8KLy8vIFVURi04IGlzIGEgY29tbW9uIHZhcmlhYmxlLXdpZHRoIGVuY29kaW5nIHRoYXQgY2FuIHJlcHJlc2VudAovLy8gZXZlcnkgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciBzZXQuCi8vLyBUaGUgVVRGLTggZW5jb2Rlci9kZWNvZGVyIHRyYW5zZm9ybXMgYmV0d2VlbiBTdHJpbmdzIGFuZCBieXRlcy4KLy8vCi8vLyBDb252ZXJ0ZXJzIGFyZSBvZnRlbiB1c2VkIHdpdGggc3RyZWFtcwovLy8gdG8gdHJhbnNmb3JtIHRoZSBkYXRhIHRoYXQgY29tZXMgdGhyb3VnaCB0aGUgc3RyZWFtCi8vLyBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS4KLy8vIFRoZSBmb2xsb3dpbmcgY29kZSB1c2VzIHR3byBjb252ZXJ0ZXJzLgovLy8gVGhlIGZpcnN0IGlzIGEgVVRGLTggZGVjb2Rlciwgd2hpY2ggY29udmVydHMgdGhlIGRhdGEgZnJvbSBieXRlcyB0byBVVEYtOAovLy8gYXMgaXQncyByZWFkIGZyb20gYSBmaWxlLAovLy8gVGhlIHNlY29uZCBpcyBhbiBpbnN0YW5jZSBvZiBbTGluZVNwbGl0dGVyXSwKLy8vIHdoaWNoIHNwbGl0cyB0aGUgZGF0YSBvbiBuZXdsaW5lIGJvdW5kYXJpZXMuCi8vLwovLy8gICAgIHZhciBsaW5lTnVtYmVyID0gMTsKLy8vICAgICB2YXIgc3RyZWFtID0gRmlsZSgncXVvdGVzLnR4dCcpLm9wZW5SZWFkKCk7Ci8vLwovLy8gICAgIHN0cmVhbS50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKQovLy8gICAgICAgICAgIC50cmFuc2Zvcm0oY29uc3QgTGluZVNwbGl0dGVyKCkpCi8vLyAgICAgICAgICAgLmxpc3RlbigobGluZSkgewovLy8gICAgICAgICAgICAgaWYgKHNob3dMaW5lTnVtYmVycykgewovLy8gICAgICAgICAgICAgICBzdGRvdXQud3JpdGUoJyR7bGluZU51bWJlcisrfSAnKTsKLy8vICAgICAgICAgICAgIH0KLy8vICAgICAgICAgICAgIHN0ZG91dC53cml0ZWxuKGxpbmUpOwovLy8gICAgICAgICAgIH0pOwovLy8KLy8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFtDb2RlY10gYW5kIFtDb252ZXJ0ZXJdIGNsYXNzZXMKLy8vIGZvciBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyB5b3VyIG93biBjb252ZXJ0ZXJzLgovLy8KLy8vIHtAY2F0ZWdvcnkgQ29yZX0KbGlicmFyeSBkYXJ0LmNvbnZlcnQ7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIHNob3cgQ2FzdENvbnZlcnRlciwgcGFyc2VIZXhCeXRlOwoKcGFydCAnYXNjaWkuZGFydCc7CnBhcnQgJ2Jhc2U2NC5kYXJ0JzsKcGFydCAnYnl0ZV9jb252ZXJzaW9uLmRhcnQnOwpwYXJ0ICdjaHVua2VkX2NvbnZlcnNpb24uZGFydCc7CnBhcnQgJ2NvZGVjLmRhcnQnOwpwYXJ0ICdjb252ZXJ0ZXIuZGFydCc7CnBhcnQgJ2VuY29kaW5nLmRhcnQnOwpwYXJ0ICdodG1sX2VzY2FwZS5kYXJ0JzsKcGFydCAnanNvbi5kYXJ0JzsKcGFydCAnbGF0aW4xLmRhcnQnOwpwYXJ0ICdsaW5lX3NwbGl0dGVyLmRhcnQnOwpwYXJ0ICdzdHJpbmdfY29udmVyc2lvbi5kYXJ0JzsKcGFydCAndXRmLmRhcnQnOwpKAE5OPAEEUR4ETFMjBCYEHwRASAQyKDxGBEEyRAQrOB0sTh4xMQQcNAQnLx8nNBImEgRCOAQVFgEVGjoBExQdIBMXFhkSFBsfEQEMZGFydDpjb252ZXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2FzY2lpLmRhcnSlDi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0FzY2lpQ29kZWNdLgovLy8KLy8vIFRoaXMgaW5zdGFuY2UgcHJvdmlkZXMgYSBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgbW9zdCBjb21tb24gQVNDSUkKLy8vIHVzZSBjYXNlcy4KLy8vCi8vLyBFeGFtcGxlczoKLy8vIGBgYGRhcnQKLy8vIHZhciBlbmNvZGVkID0gYXNjaWkuZW5jb2RlKCJUaGlzIGlzIEFTQ0lJISIpOwovLy8gdmFyIGRlY29kZWQgPSBhc2NpaS5kZWNvZGUoWzB4NTQsIDB4NjgsIDB4NjksIDB4NzMsIDB4MjAsIDB4NjksIDB4NzMsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCwgMHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgyMV0pOwovLy8gYGBgCmNvbnN0IEFzY2lpQ29kZWMgYXNjaWkgPSBBc2NpaUNvZGVjKCk7Cgpjb25zdCBpbnQgX2FzY2lpTWFzayA9IDB4N0Y7CgovLy8gQW4gW0FzY2lpQ29kZWNdIGFsbG93cyBlbmNvZGluZyBzdHJpbmdzIGFzIEFTQ0lJIGJ5dGVzCi8vLyBhbmQgZGVjb2RpbmcgQVNDSUkgYnl0ZXMgdG8gc3RyaW5ncy4KY2xhc3MgQXNjaWlDb2RlYyBleHRlbmRzIEVuY29kaW5nIHsKICBmaW5hbCBib29sIF9hbGxvd0ludmFsaWQ7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW0FzY2lpQ29kZWNdLgogIC8vLwogIC8vLyBJZiBbYWxsb3dJbnZhbGlkXSBpcyB0cnVlLCB0aGUgW2RlY29kZV0gbWV0aG9kIGFuZCB0aGUgY29udmVydGVyCiAgLy8vIHJldHVybmVkIGJ5IFtkZWNvZGVyXSB3aWxsIGRlZmF1bHQgdG8gYWxsb3dpbmcgaW52YWxpZCB2YWx1ZXMuCiAgLy8vIElmIGFsbG93aW5nIGludmFsaWQgdmFsdWVzLCB0aGUgdmFsdWVzIHdpbGwgYmUgZGVjb2RlZCBpbnRvIHRoZSBVbmljb2RlCiAgLy8vIFJlcGxhY2VtZW50IGNoYXJhY3RlciAoVStGRkZEKS4gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCiAgLy8vIENhbGxzIHRvIHRoZSBbZGVjb2RlXSBtZXRob2QgY2FuIGNob29zZSB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQuCiAgLy8vCiAgLy8vIEVuY29kZXJzIHdpbGwgbm90IGFjY2VwdCBpbnZhbGlkIChub24gQVNDSUkpIGNoYXJhY3RlcnMuCiAgY29uc3QgQXNjaWlDb2RlYyh7Ym9vbCBhbGxvd0ludmFsaWQgPSBmYWxzZX0pIDogX2FsbG93SW52YWxpZCA9IGFsbG93SW52YWxpZDsKCiAgLy8vIFRoZSBuYW1lIG9mIHRoaXMgY29kZWMsICJ1cy1hc2NpaSIuCiAgU3RyaW5nIGdldCBuYW1lID0+ICJ1cy1hc2NpaSI7CgogIFVpbnQ4TGlzdCBlbmNvZGUoU3RyaW5nIHNvdXJjZSkgPT4gZW5jb2Rlci5jb252ZXJ0KHNvdXJjZSk7CgogIC8vLyBEZWNvZGVzIHRoZSBBU0NJSSBbYnl0ZXNdIChhIGxpc3Qgb2YgdW5zaWduZWQgNy1iaXQgaW50ZWdlcnMpIHRvIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIHN0cmluZy4KICAvLy8KICAvLy8gSWYgW2J5dGVzXSBjb250YWlucyB2YWx1ZXMgdGhhdCBhcmUgbm90IGluIHRoZSByYW5nZSAwIC4uIDEyNywgdGhlIGRlY29kZXIKICAvLy8gd2lsbCBldmVudHVhbGx5IHRocm93IGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgLy8vCiAgLy8vIElmIFthbGxvd0ludmFsaWRdIGlzIG5vdCBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIHVzZWQgdG8gY3JlYXRlCiAgLy8vIHRoaXMgW0FzY2lpQ29kZWNdLgogIFN0cmluZyBkZWNvZGUoTGlzdDxpbnQ+IGJ5dGVzLCB7Ym9vbCBhbGxvd0ludmFsaWR9KSB7CiAgICBhbGxvd0ludmFsaWQgPz89IF9hbGxvd0ludmFsaWQ7CiAgICBpZiAoYWxsb3dJbnZhbGlkKSB7CiAgICAgIHJldHVybiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiB0cnVlKS5jb252ZXJ0KGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSkuY29udmVydChieXRlcyk7CiAgICB9CiAgfQoKICBBc2NpaUVuY29kZXIgZ2V0IGVuY29kZXIgPT4gY29uc3QgQXNjaWlFbmNvZGVyKCk7CgogIEFzY2lpRGVjb2RlciBnZXQgZGVjb2RlciA9PiBfYWxsb3dJbnZhbGlkCiAgICAgID8gY29uc3QgQXNjaWlEZWNvZGVyKGFsbG93SW52YWxpZDogdHJ1ZSkKICAgICAgOiBjb25zdCBBc2NpaURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSk7Cn0KCi8vIFN1cGVyY2xhc3MgZm9yIFtBc2NpaUVuY29kZXJdIGFuZCBbTGF0aW4xRW5jb2Rlcl0uCi8vIEdlbmVyYWxpemVzIGNvbW1vbiBvcGVyYXRpb25zIHRoYXQgb25seSBkaWZmZXIgYnkgYSBtYXNrOwpjbGFzcyBfVW5pY29kZVN1YnNldEVuY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8U3RyaW5nLCBMaXN0PGludD4+IHsKICBmaW5hbCBpbnQgX3N1YnNldE1hc2s7CgogIGNvbnN0IF9Vbmljb2RlU3Vic2V0RW5jb2Rlcih0aGlzLl9zdWJzZXRNYXNrKTsKCiAgLy8vIENvbnZlcnRzIHRoZSBbU3RyaW5nXSBpbnRvIGEgbGlzdCBvZiBpdHMgY29kZSB1bml0cy4KICAvLy8KICAvLy8gSWYgW3N0YXJ0XSBhbmQgW2VuZF0gYXJlIHByb3ZpZGVkLCBvbmx5IHRoZSBzdWJzdHJpbmcKICAvLy8gYHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZClgIGlzIHVzZWQgYXMgaW5wdXQgdG8gdGhlIGNvbnZlcnNpb24uCiAgVWludDhMaXN0IGNvbnZlcnQoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICB2YXIgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHN0cmluZ0xlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICB2YXIgcmVzdWx0ID0gVWludDhMaXN0KGxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjb2RlVW5pdCA9IHN0cmluZy5jb2RlVW5pdEF0KHN0YXJ0ICsgaSk7CiAgICAgIGlmICgoY29kZVVuaXQgJiB+X3N1YnNldE1hc2spICE9IDApIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgICBzdHJpbmcsICJzdHJpbmciLCAiQ29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLiIpOwogICAgICB9CiAgICAgIHJlc3VsdFtpXSA9IGNvZGVVbml0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW0J5dGVDb252ZXJzaW9uU2lua10uCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgcmV0dXJuIF9Vbmljb2RlU3Vic2V0RW5jb2RlclNpbmsoX3N1YnNldE1hc2ssCiAgICAgICAgc2luayBpcyBCeXRlQ29udmVyc2lvblNpbmsgPyBzaW5rIDogQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oc2luaykpOwogIH0KCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3MnIGJpbmQsIHRvIHByb3ZpZGUgYSBiZXR0ZXIgdHlwZS4KICBTdHJlYW08TGlzdDxpbnQ+PiBiaW5kKFN0cmVhbTxTdHJpbmc+IHN0cmVhbSkgPT4gc3VwZXIuYmluZChzdHJlYW0pOwp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBzdHJpbmdzIG9mIG9ubHkgQVNDSUkgY2hhcmFjdGVycyB0byBieXRlcy4KY2xhc3MgQXNjaWlFbmNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXRFbmNvZGVyIHsKICBjb25zdCBBc2NpaUVuY29kZXIoKSA6IHN1cGVyKF9hc2NpaU1hc2spOwp9CgovLy8gVGhpcyBjbGFzcyBlbmNvZGVzIGNodW5rZWQgc3RyaW5ncyB0byBieXRlcyAodW5zaWduZWQgOC1iaXQKLy8vIGludGVnZXJzKS4KY2xhc3MgX1VuaWNvZGVTdWJzZXRFbmNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgZmluYWwgQnl0ZUNvbnZlcnNpb25TaW5rIF9zaW5rOwogIGZpbmFsIGludCBfc3Vic2V0TWFzazsKCiAgX1VuaWNvZGVTdWJzZXRFbmNvZGVyU2luayh0aGlzLl9zdWJzZXRNYXNrLCB0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNvZGVVbml0ID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICgoY29kZVVuaXQgJiB+X3N1YnNldE1hc2spICE9IDApIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAogICAgICAgICAgICAiU291cmNlIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludDogJGNvZGVVbml0LiIpOwogICAgICB9CiAgICB9CiAgICBfc2luay5hZGQoc291cmNlLmNvZGVVbml0cy5zdWJsaXN0KHN0YXJ0LCBlbmQpKTsKICAgIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIExhdGluLTEgYnl0ZXMgKGxpc3RzIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKQovLy8gdG8gYSBzdHJpbmcuCmFic3RyYWN0IGNsYXNzIF9Vbmljb2RlU3Vic2V0RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIGJvb2wgX2FsbG93SW52YWxpZDsKICBmaW5hbCBpbnQgX3N1YnNldE1hc2s7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgZGVjb2Rlci4KICAvLy8KICAvLy8gVGhlIFtfYWxsb3dJbnZhbGlkXSBhcmd1bWVudCBkZWZpbmVzIGhvdyBbY29udmVydF0gZGVhbHMKICAvLy8gd2l0aCBpbnZhbGlkIGJ5dGVzLgogIC8vLwogIC8vLyBUaGUgW19zdWJzZXRNYXNrXSBhcmd1bWVudCBpcyBhIGJpdCBtYXNrIHVzZWQgdG8gZGVmaW5lIHRoZSBzdWJzZXQKICAvLy8gb2YgVW5pY29kZSBiZWluZyBkZWNvZGVkLiBVc2UgW19MQVRJTjFfTUFTS10gZm9yIExhdGluLTEgKDgtYml0KSBvcgogIC8vLyBbX2FzY2lpTWFza10gZm9yIEFTQ0lJICg3LWJpdCkuCiAgLy8vCiAgLy8vIElmIFtfYWxsb3dJbnZhbGlkXSBpcyBgdHJ1ZWAsIFtjb252ZXJ0XSByZXBsYWNlcyBpbnZhbGlkIGJ5dGVzIHdpdGggdGhlCiAgLy8vIFVuaWNvZGUgUmVwbGFjZW1lbnQgY2hhcmFjdGVyIGBVK0ZGRkRgICjvv70pLgogIC8vLyBPdGhlcndpc2UgaXQgdGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgY29uc3QgX1VuaWNvZGVTdWJzZXREZWNvZGVyKHRoaXMuX2FsbG93SW52YWxpZCwgdGhpcy5fc3Vic2V0TWFzayk7CgogIC8vLyBDb252ZXJ0cyB0aGUgW2J5dGVzXSAoYSBsaXN0IG9mIHVuc2lnbmVkIDctIG9yIDgtYml0IGludGVnZXJzKSB0byB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gYW5kIFtlbmRdIGFyZSBwcm92aWRlZCwgb25seSB0aGUgc3ViLWxpc3Qgb2YgYnl0ZXMgZnJvbQogIC8vLyBgc3RhcnRgIHRvIGBlbmRgIChgZW5kYCBub3QgaW5jbHVzaXZlKSBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBjb252ZXJzaW9uLgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBieXRlcywgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICB2YXIgYnl0ZUNvdW50ID0gYnl0ZXMubGVuZ3RoOwogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnl0ZUNvdW50KTsKICAgIGVuZCA/Pz0gYnl0ZUNvdW50OwoKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBieXRlID0gYnl0ZXNbaV07CiAgICAgIGlmICgoYnl0ZSAmIH5fc3Vic2V0TWFzaykgIT0gMCkgewogICAgICAgIGlmICghX2FsbG93SW52YWxpZCkgewogICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlIGluIGlucHV0OiAkYnl0ZSIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2NvbnZlcnRJbnZhbGlkKGJ5dGVzLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGVzKGJ5dGVzLCBzdGFydCwgZW5kKTsKICB9CgogIFN0cmluZyBfY29udmVydEludmFsaWQoTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIHZhciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciB2YWx1ZSA9IGJ5dGVzW2ldOwogICAgICBpZiAoKHZhbHVlICYgfl9zdWJzZXRNYXNrKSAhPSAwKSB2YWx1ZSA9IDB4RkZGRDsKICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUodmFsdWUpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLy8vIFN0YXJ0cyBhIGNodW5rZWQgY29udmVyc2lvbi4KICAvLy8KICAvLy8gVGhlIGNvbnZlcnRlciB3b3JrcyBtb3JlIGVmZmljaWVudGx5IGlmIHRoZSBnaXZlbiBbc2lua10gaXMgYQogIC8vLyBbU3RyaW5nQ29udmVyc2lvblNpbmtdLgogIEJ5dGVDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8U3RyaW5nPiBzaW5rKTsKCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3MncyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPFN0cmluZz4gYmluZChTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pID0+IHN1cGVyLmJpbmQoc3RyZWFtKTsKfQoKY2xhc3MgQXNjaWlEZWNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXREZWNvZGVyIHsKICBjb25zdCBBc2NpaURlY29kZXIoe2Jvb2wgYWxsb3dJbnZhbGlkID0gZmFsc2V9KQogICAgICA6IHN1cGVyKGFsbG93SW52YWxpZCwgX2FzY2lpTWFzayk7CgogIC8vLyBTdGFydHMgYSBjaHVua2VkIGNvbnZlcnNpb24uCiAgLy8vCiAgLy8vIFRoZSBjb252ZXJ0ZXIgd29ya3MgbW9yZSBlZmZpY2llbnRseSBpZiB0aGUgZ2l2ZW4gW3NpbmtdIGlzIGEKICAvLy8gW1N0cmluZ0NvbnZlcnNpb25TaW5rXS4KICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RyaW5nU2luazsKICAgIGlmIChzaW5rIGlzIFN0cmluZ0NvbnZlcnNpb25TaW5rKSB7CiAgICAgIHN0cmluZ1NpbmsgPSBzaW5rOwogICAgfSBlbHNlIHsKICAgICAgc3RyaW5nU2luayA9IFN0cmluZ0NvbnZlcnNpb25TaW5rLmZyb20oc2luayk7CiAgICB9CiAgICAvLyBUT0RPKGxybik6IFVzZSBhc1V0ZjE2U2luayB3aGVuIGl0IGJlY29tZXMgYXZhaWxhYmxlLiBJdAogICAgLy8gd29ya3MganVzdCBhcyB3ZWxsLCBpcyBsaWtlbHkgdG8gaGF2ZSBsZXNzIGRlY29kaW5nIG92ZXJoZWFkLAogICAgLy8gYW5kIG1ha2UgYWRkaW5nIFUrRkZGRCBlYXNpZXIuCiAgICAvLyBBdCB0aGF0IHRpbWUsIG1lcmdlIHRoaXMgd2l0aCBfTGF0aW4xRGVjb2RlclNpbms7CiAgICBpZiAoX2FsbG93SW52YWxpZCkgewogICAgICByZXR1cm4gX0Vycm9ySGFuZGxpbmdBc2NpaURlY29kZXJTaW5rKHN0cmluZ1NpbmsuYXNVdGY4U2luayhmYWxzZSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9TaW1wbGVBc2NpaURlY29kZXJTaW5rKHN0cmluZ1NpbmspOwogICAgfQogIH0KfQoKY2xhc3MgX0Vycm9ySGFuZGxpbmdBc2NpaURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgQnl0ZUNvbnZlcnNpb25TaW5rIF91dGY4U2luazsKICBfRXJyb3JIYW5kbGluZ0FzY2lpRGVjb2RlclNpbmsodGhpcy5fdXRmOFNpbmspOwoKICB2b2lkIGNsb3NlKCkgewogICAgX3V0ZjhTaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBhZGRTbGljZShzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICBpZiAoKHNvdXJjZVtpXSAmIH5fYXNjaWlNYXNrKSAhPSAwKSB7CiAgICAgICAgaWYgKGkgPiBzdGFydCkgX3V0ZjhTaW5rLmFkZFNsaWNlKHNvdXJjZSwgc3RhcnQsIGksIGZhbHNlKTsKICAgICAgICAvLyBBZGQgVVRGLTggZW5jb2Rpbmcgb2YgVStGRkZELgogICAgICAgIF91dGY4U2luay5hZGQoY29uc3QgPGludD5bMHhFRiwgMHhCRiwgMHhCRF0pOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydCA8IGVuZCkgewogICAgICBfdXRmOFNpbmsuYWRkU2xpY2Uoc291cmNlLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogICAgfSBlbHNlIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KCmNsYXNzIF9TaW1wbGVBc2NpaURlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgU2luayBfc2luazsKICBfU2ltcGxlQXNjaWlEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoKHNvdXJjZVtpXSAmIH5fYXNjaWlNYXNrKSAhPSAwKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJTb3VyY2UgY29udGFpbnMgbm9uLUFTQ0lJIGJ5dGVzLiIpOwogICAgICB9CiAgICB9CiAgICBfc2luay5hZGQoU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlKSk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIGZpbmFsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOwogICAgaWYgKHN0YXJ0IDwgZW5kKSB7CiAgICAgIGlmIChzdGFydCAhPSAwIHx8IGVuZCAhPSBsZW5ndGgpIHsKICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc3VibGlzdChzdGFydCwgZW5kKTsKICAgICAgfQogICAgICBhZGQoc291cmNlKTsKICAgIH0KICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQp9CoEhAE5OPAEWAUMESA8EDgwySkwIJwEdATspJBwBJwZHRU5LSAY/UAEqIQE+AUscBlExBlEZOCQYRA1FBgQBNAEsLzECATY9QxkBMQE7BjxJPyZAHiQnMywjPwgcBhMEASMGRBxGMkwEAT5HAgFDMywCAUAPQyIZATsBERMEAUI7KCssHU4IBjUSDwYEAgFJEUwcGQEiBj8aBklKJgZOMi9FAUwcBklRPiI3FwEoGygeQgozCAY0BAFAISgcNyMGHgQBIwZEHkABP0cCATMyKQEjBkQeQSUoGQ00BkBFJjkZSw0yBgQCAUYgMgERFwQBHy8EAUU7KCxEKTYXCAYXNhkPBgQCAT8OJwEREwQBHy4sQwgGLQQBRSI0FyktCBMGGQQCARdkYXJ0OmNvbnZlcnQvYXNjaWkuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC9iYXNlNjQuZGFydMAAet0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gQSBbYmFzZTY0XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCkgZW5jb2RlciBhbmQgZGVjb2Rlci4KLy8vCi8vLyBJdCBlbmNvZGVzIHVzaW5nIHRoZSBkZWZhdWx0IGJhc2U2NCBhbHBoYWJldCwKLy8vIGRlY29kZXMgdXNpbmcgYm90aCB0aGUgYmFzZTY0IGFuZCBiYXNlNjR1cmwgYWxwaGFiZXRzLAovLy8gZG9lcyBub3QgYWxsb3cgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCByZXF1aXJlcyBwYWRkaW5nLgovLy8KLy8vIEV4YW1wbGVzOgovLy8KLy8vICAgICB2YXIgZW5jb2RlZCA9IGJhc2U2NC5lbmNvZGUoWzB4NjIsIDB4NmMsIDB4YzMsIDB4YTUsIDB4NjIsIDB4YzMsIDB4YTYsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcyLCAweDY3LCAweDcyLCAweGMzLCAweGI4LCAweDY0XSk7Ci8vLyAgICAgdmFyIGRlY29kZWQgPSBiYXNlNjQuZGVjb2RlKCJZbXpEcFdMRHBuSm5jc080WkFvPSIpOwovLy8KLy8vIFRoZSB0b3AtbGV2ZWwgW2Jhc2U2NEVuY29kZV0gYW5kIFtiYXNlNjREZWNvZGVdIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZAovLy8gaW5zdGVhZCBpZiBhIGxvY2FsIHZhcmlhYmxlIHNoYWRvd3MgdGhlIFtiYXNlNjRdIGNvbnN0YW50Lgpjb25zdCBCYXNlNjRDb2RlYyBiYXNlNjQgPSBCYXNlNjRDb2RlYygpOwoKLy8vIEEgW2Jhc2U2NHVybF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIGVuY29kZXIgYW5kIGRlY29kZXIuCi8vLwovLy8gSXQgZW5jb2RlcyBhbmQgZGVjb2RlcyB1c2luZyB0aGUgYmFzZTY0dXJsIGFscGhhYmV0LAovLy8gZGVjb2RlcyB1c2luZyBib3RoIHRoZSBiYXNlNjQgYW5kIGJhc2U2NHVybCBhbHBoYWJldHMsCi8vLyBkb2VzIG5vdCBhbGxvdyBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kIHJlcXVpcmVzIHBhZGRpbmcuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLwovLy8gICAgIHZhciBlbmNvZGVkID0gYmFzZTY0VXJsLmVuY29kZShbMHg2MiwgMHg2YywgMHhjMywgMHhhNSwgMHg2MiwgMHhjMywgMHhhNiwKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzIsIDB4NjcsIDB4NzIsIDB4YzMsIDB4YjgsIDB4NjRdKTsKLy8vICAgICB2YXIgZGVjb2RlZCA9IGJhc2U2NFVybC5kZWNvZGUoIlltekRwV0xEcG5KbmNzTzRaQW89Iik7CmNvbnN0IEJhc2U2NENvZGVjIGJhc2U2NFVybCA9IEJhc2U2NENvZGVjLnVybFNhZmUoKTsKCi8vLyBFbmNvZGVzIFtieXRlc10gdXNpbmcgW2Jhc2U2NF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIGVuY29kaW5nLgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2Jhc2U2NC5lbmNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZSBnbG9iYWwKLy8vIFtiYXNlNjRdIGNvbnN0YW50LgpTdHJpbmcgYmFzZTY0RW5jb2RlKExpc3Q8aW50PiBieXRlcykgPT4gYmFzZTY0LmVuY29kZShieXRlcyk7CgovLy8gRW5jb2RlcyBbYnl0ZXNdIHVzaW5nIFtiYXNlNjR1cmxdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4KSBlbmNvZGluZy4KLy8vCi8vLyBTaG9ydGhhbmQgZm9yIFtiYXNlNjR1cmwuZW5jb2RlXS4KU3RyaW5nIGJhc2U2NFVybEVuY29kZShMaXN0PGludD4gYnl0ZXMpID0+IGJhc2U2NFVybC5lbmNvZGUoYnl0ZXMpOwoKLy8vIERlY29kZXMgW2Jhc2U2NF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgpIG9yIFtiYXNlNjR1cmxdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4KSBlbmNvZGVkIGJ5dGVzLgovLy8KLy8vIFNob3J0aGFuZCBmb3IgW2Jhc2U2NC5kZWNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZQovLy8gZ2xvYmFsIFtiYXNlNjRdIGNvbnN0YW50LgpVaW50OExpc3QgYmFzZTY0RGVjb2RlKFN0cmluZyBzb3VyY2UpID0+IGJhc2U2NC5kZWNvZGUoc291cmNlKTsKCi8vIENvbnN0YW50cyB1c2VkIGluIG1vcmUgdGhhbiBvbmUgY2xhc3MuCmNvbnN0IGludCBfcGFkZGluZ0NoYXIgPSAweDNkOyAvLyAnPScuCgovLy8gQSBbYmFzZTY0XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCkgZW5jb2RlciBhbmQgZGVjb2Rlci4KLy8vCi8vLyBBIFtCYXNlNjRDb2RlY10gYWxsb3dzIGJhc2U2NCBlbmNvZGluZyBieXRlcyBpbnRvIEFTQ0lJIHN0cmluZ3MgYW5kCi8vLyBkZWNvZGluZyB2YWxpZCBlbmNvZGluZ3MgYmFjayB0byBieXRlcy4KLy8vCi8vLyBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgaGFuZGxlcyB0aGUgc2ltcGxlc3QgUkZDIDQ2NDggYmFzZTY0IGFuZCBiYXNlNjR1cmwKLy8vIGVuY29kaW5ncy4KLy8vIEl0IGRvZXMgbm90IGFsbG93IGludmFsaWQgY2hhcmFjdGVycyB3aGVuIGRlY29kaW5nIGFuZCBpdCByZXF1aXJlcywKLy8vIGFuZCBnZW5lcmF0ZXMsIHBhZGRpbmcgc28gdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgZm91cgovLy8gY2hhcmFjdGVycy4KY2xhc3MgQmFzZTY0Q29kZWMgZXh0ZW5kcyBDb2RlYzxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIEJhc2U2NEVuY29kZXIgX2VuY29kZXI7CiAgY29uc3QgQmFzZTY0Q29kZWMoKSA6IF9lbmNvZGVyID0gY29uc3QgQmFzZTY0RW5jb2RlcigpOwogIGNvbnN0IEJhc2U2NENvZGVjLnVybFNhZmUoKSA6IF9lbmNvZGVyID0gY29uc3QgQmFzZTY0RW5jb2Rlci51cmxTYWZlKCk7CgogIEJhc2U2NEVuY29kZXIgZ2V0IGVuY29kZXIgPT4gX2VuY29kZXI7CgogIEJhc2U2NERlY29kZXIgZ2V0IGRlY29kZXIgPT4gY29uc3QgQmFzZTY0RGVjb2RlcigpOwoKICAvLy8gRGVjb2RlcyBbZW5jb2RlZF0uCiAgLy8vCiAgLy8vIFRoZSBpbnB1dCBpcyBkZWNvZGVkIGFzIGlmIGJ5IGBkZWNvZGVyLmNvbnZlcnRgLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgW1VpbnQ4TGlzdF0gY29udGFpbnMgZXhhY3RseSB0aGUgZGVjb2RlZCBieXRlcywKICAvLy8gc28gdGhlIFtVaW50OExpc3QubGVuZ3RoXSBpcyBwcmVjaXNlbHkgdGhlIG51bWJlciBvZiBkZWNvZGVkIGJ5dGVzLgogIC8vLyBUaGUgW1VpbnQ4TGlzdC5idWZmZXJdIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgZGVjb2RlZCBieXRlcy4KICBVaW50OExpc3QgZGVjb2RlKFN0cmluZyBlbmNvZGVkKSA9PiBkZWNvZGVyLmNvbnZlcnQoZW5jb2RlZCk7CgogIC8vLyBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgaW4gW3NvdXJjZV0uCiAgLy8vCiAgLy8vIE9ubHkgYWN0cyBvbiB0aGUgc3Vic3RyaW5nIGZyb20gW3N0YXJ0XSB0byBbZW5kXSwgd2l0aCBbZW5kXQogIC8vLyBkZWZhdWx0aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAvLy8KICAvLy8gTm9ybWFsaXphdGlvbiB3aWxsOgogIC8vLyAqIFVuZXNjYXBlIGFueSBgJWAtZXNjYXBlcy4KICAvLy8gKiBPbmx5IGFsbG93IHZhbGlkIGNoYXJhY3RlcnMgKGBBYC1gWmAsIGBhYC1gemAsIGAwYC1gOWAsIGAvYCBhbmQgYCtgKS4KICAvLy8gKiBOb3JtYWxpemUgYSBgX2Agb3IgYC1gIGNoYXJhY3RlciB0byBgL2Agb3IgYCtgLgogIC8vLyAqIFZhbGlkYXRlIHRoYXQgZXhpc3RpbmcgcGFkZGluZyAodHJhaWxpbmcgYD1gIGNoYXJhY3RlcnMpIGlzIGNvcnJlY3QuCiAgLy8vICogSWYgbm8gcGFkZGluZyBleGlzdHMsIGFkZCBjb3JyZWN0IHBhZGRpbmcgaWYgbmVjZXNzYXJ5IGFuZCBwb3NzaWJsZS4KICAvLy8gKiBWYWxpZGF0ZSB0aGF0IHRoZSBsZW5ndGggaXMgY29ycmVjdCAoYSBtdWx0aXBsZSBvZiBmb3VyKS4KICBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBzb3VyY2UsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBjb25zdCBwZXJjZW50ID0gMHgyNTsKICAgIGNvbnN0IGVxdWFscyA9IDB4M2Q7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwogICAgdmFyIHNsaWNlU3RhcnQgPSBzdGFydDsKICAgIHZhciBhbHBoYWJldCA9IF9CYXNlNjRFbmNvZGVyLl9iYXNlNjRBbHBoYWJldDsKICAgIHZhciBpbnZlcnNlQWxwaGFiZXQgPSBfQmFzZTY0RGVjb2Rlci5faW52ZXJzZUFscGhhYmV0OwogICAgdmFyIGZpcnN0UGFkZGluZyA9IC0xOwogICAgdmFyIGZpcnN0UGFkZGluZ1NvdXJjZUluZGV4ID0gLTE7CiAgICB2YXIgcGFkZGluZ0NvdW50ID0gMDsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDspIHsKICAgICAgdmFyIHNsaWNlRW5kID0gaTsKICAgICAgdmFyIGNoYXIgPSBzb3VyY2UuY29kZVVuaXRBdChpKyspOwogICAgICB2YXIgb3JpZ2luYWxDaGFyID0gY2hhcjsKICAgICAgLy8gTm9ybWFsaXplIGNoYXIsIGtlZXAgb3JpZ2luYWxDaGFyIHRvIHNlZSBpZiBpdCBtYXRjaGVzIHRoZSBzb3VyY2UuCiAgICAgIGlmIChjaGFyID09IHBlcmNlbnQpIHsKICAgICAgICBpZiAoaSArIDIgPD0gZW5kKSB7CiAgICAgICAgICBjaGFyID0gcGFyc2VIZXhCeXRlKHNvdXJjZSwgaSk7IC8vIE1heSBiZSBuZWdhdGl2ZS4KICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCAlMjUgaXNuJ3QgdmFsaWQsIGJ1dCBvdXIgdGFibGUgY29uc2lkZXJzIGl0CiAgICAgICAgICAvLyBhIHBvdGVudGlhbCBwYWRkaW5nIHN0YXJ0LCBzbyBza2lwIHRoZSBjaGVja3MuCiAgICAgICAgICBpZiAoY2hhciA9PSBwZXJjZW50KSBjaGFyID0gLTE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEFuIGludmFsaWQgSEVYIGVzY2FwZSAodG9vIHNob3J0KS4KICAgICAgICAgIC8vIEp1c3Qgc2tpcCBwYXN0IHRoZSBoYW5kbGluZyBhbmQgcmVhY2ggdGhlIHRocm93IGJlbG93LgogICAgICAgICAgY2hhciA9IC0xOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBJZiBjaGFyIGlzIG5lZ2F0aXZlIGhlcmUsIGhleC1kZWNvZGluZyBmYWlsZWQgaW4gc29tZSB3YXkuCiAgICAgIGlmICgwIDw9IGNoYXIgJiYgY2hhciA8PSAxMjcpIHsKICAgICAgICB2YXIgdmFsdWUgPSBpbnZlcnNlQWxwaGFiZXRbY2hhcl07CiAgICAgICAgaWYgKHZhbHVlID49IDApIHsKICAgICAgICAgIGNoYXIgPSBhbHBoYWJldC5jb2RlVW5pdEF0KHZhbHVlKTsKICAgICAgICAgIGlmIChjaGFyID09IG9yaWdpbmFsQ2hhcikgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBfQmFzZTY0RGVjb2Rlci5fcGFkZGluZykgewogICAgICAgICAgLy8gV2UgaGF2ZSBydWxlZCBvdXQgcGVyY2VudCwgc28gY2hhciBpcyAnPScuCiAgICAgICAgICBpZiAoZmlyc3RQYWRkaW5nIDwgMCkgewogICAgICAgICAgICAvLyBNYXJrIHBvc2l0aW9uIGluIG5vcm1hbGl6ZWQgb3V0cHV0IHdoZXJlIHBhZGRpbmcgb2NjdXJzLgogICAgICAgICAgICBmaXJzdFBhZGRpbmcgPSAoYnVmZmVyPy5sZW5ndGggPz8gMCkgKyAoc2xpY2VFbmQgLSBzbGljZVN0YXJ0KTsKICAgICAgICAgICAgZmlyc3RQYWRkaW5nU291cmNlSW5kZXggPSBzbGljZUVuZDsKICAgICAgICAgIH0KICAgICAgICAgIHBhZGRpbmdDb3VudCsrOwogICAgICAgICAgLy8gSXQgY291bGQgaGF2ZSBiZWVuIGFuIGVzY2FwZWQgZXF1YWxzICglM0QpLgogICAgICAgICAgaWYgKG9yaWdpbmFsQ2hhciA9PSBlcXVhbHMpIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgIT0gX0Jhc2U2NERlY29kZXIuX2ludmFsaWQpIHsKICAgICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICBidWZmZXIud3JpdGUoc291cmNlLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBzbGljZUVuZCkpOwogICAgICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoY2hhcik7CiAgICAgICAgICBzbGljZVN0YXJ0ID0gaTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgYmFzZTY0IGRhdGEiLCBzb3VyY2UsIHNsaWNlRW5kKTsKICAgIH0KICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICBidWZmZXIud3JpdGUoc291cmNlLnN1YnN0cmluZyhzbGljZVN0YXJ0LCBlbmQpKTsKICAgICAgaWYgKGZpcnN0UGFkZGluZyA+PSAwKSB7CiAgICAgICAgLy8gVGhlcmUgd2FzIHBhZGRpbmcgaW4gdGhlIHNvdXJjZS4gQ2hlY2sgdGhhdCBpdCBpcyB2YWxpZDoKICAgICAgICAvLyAqIHJlc3VsdCBsZW5ndGggYSBtdWx0aXBsZSBvZiBmb3VyCiAgICAgICAgLy8gKiBvbmUgb3IgdHdvIHBhZGRpbmcgY2hhcmFjdGVycyBhdCB0aGUgZW5kLgogICAgICAgIF9jaGVja1BhZGRpbmcoc291cmNlLCBmaXJzdFBhZGRpbmdTb3VyY2VJbmRleCwgZW5kLCBmaXJzdFBhZGRpbmcsCiAgICAgICAgICAgIHBhZGRpbmdDb3VudCwgYnVmZmVyLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTGVuZ3RoIG9mIGxhc3QgY2h1bmsgKDEtNCBjaGFycykgaW4gdGhlIGVuY29kaW5nLgogICAgICAgIHZhciBlbmRMZW5ndGggPSAoKGJ1ZmZlci5sZW5ndGggLSAxKSAlIDQpICsgMTsKICAgICAgICBpZiAoZW5kTGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIFRoZSBkYXRhIG11c3QgaGF2ZSBsZW5ndGggMCwgMiBvciAzIG1vZHVsbyA0LgogICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIiwgc291cmNlLCBlbmQpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoZW5kTGVuZ3RoIDwgNCkgewogICAgICAgICAgYnVmZmVyLndyaXRlKCI9Iik7CiAgICAgICAgICBlbmRMZW5ndGgrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLnRvU3RyaW5nKCkpOwogICAgfQogICAgLy8gT3JpZ2luYWwgd2FzIGFscmVhZHkgbm9ybWFsaXplZCwgb25seSBjaGVjayBwYWRkaW5nLgogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGZpcnN0UGFkZGluZyA+PSAwKSB7CiAgICAgIF9jaGVja1BhZGRpbmcoc291cmNlLCBmaXJzdFBhZGRpbmdTb3VyY2VJbmRleCwgZW5kLCBmaXJzdFBhZGRpbmcsCiAgICAgICAgICBwYWRkaW5nQ291bnQsIGxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICAvLyBObyBwYWRkaW5nIGdpdmVuLCBzbyBhZGQgc29tZSBpZiBuZWVkZWQgaXQuCiAgICAgIHZhciBlbmRMZW5ndGggPSBsZW5ndGggJSA0OwogICAgICBpZiAoZW5kTGVuZ3RoID09IDEpIHsKICAgICAgICAvLyBUaGUgZGF0YSBtdXN0IGhhdmUgbGVuZ3RoIDAsIDIgb3IgMyBtb2R1bG8gNC4KICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgYmFzZTY0IGVuY29kaW5nIGxlbmd0aCAiLCBzb3VyY2UsIGVuZCk7CiAgICAgIH0KICAgICAgaWYgKGVuZExlbmd0aCA+IDEpIHsKICAgICAgICAvLyBUaGVyZSBpcyBubyAiaW5zZXJ0QXQiIG9uIFN0cmluZywgYnV0IHRoaXMgd29ya3MgYXMgd2VsbC4KICAgICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZVJhbmdlKGVuZCwgZW5kLCAoZW5kTGVuZ3RoID09IDIpID8gIj09IiA6ICI9Iik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzb3VyY2U7CiAgfQoKICBzdGF0aWMgdm9pZCBfY2hlY2tQYWRkaW5nKFN0cmluZyBzb3VyY2UsIGludCBzb3VyY2VJbmRleCwgaW50IHNvdXJjZUVuZCwKICAgICAgaW50IGZpcnN0UGFkZGluZywgaW50IHBhZGRpbmdDb3VudCwgaW50IGxlbmd0aCkgewogICAgaWYgKGxlbmd0aCAlIDQgIT0gMCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsICIKICAgICAgICAgICJpcyAkbGVuZ3RoIiwKICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgIHNvdXJjZUVuZCk7CiAgICB9CiAgICBpZiAoZmlyc3RQYWRkaW5nICsgcGFkZGluZ0NvdW50ICE9IGxlbmd0aCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIiwgc291cmNlLCBzb3VyY2VJbmRleCk7CiAgICB9CiAgICBpZiAocGFkZGluZ0NvdW50ID4gMikgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsCiAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICBzb3VyY2VJbmRleCk7CiAgICB9CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRW5jb2RlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBCYXNlNjQgYW5kIGJhc2U2NHVybCBlbmNvZGluZyBjb252ZXJ0ZXIuCi8vLwovLy8gRW5jb2RlcyBsaXN0cyBvZiBieXRlcyB1c2luZyBiYXNlNjQgb3IgYmFzZTY0dXJsIGVuY29kaW5nLgovLy8KLy8vIFRoZSByZXN1bHRzIGFyZSBBU0NJSSBzdHJpbmdzIHVzaW5nIGEgcmVzdHJpY3RlZCBhbHBoYWJldC4KY2xhc3MgQmFzZTY0RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIGJvb2wgX3VybFNhZmU7CgogIGNvbnN0IEJhc2U2NEVuY29kZXIoKSA6IF91cmxTYWZlID0gZmFsc2U7CiAgY29uc3QgQmFzZTY0RW5jb2Rlci51cmxTYWZlKCkgOiBfdXJsU2FmZSA9IHRydWU7CgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBpbnB1dCkgewogICAgaWYgKGlucHV0LmlzRW1wdHkpIHJldHVybiAiIjsKICAgIHZhciBlbmNvZGVyID0gX0Jhc2U2NEVuY29kZXIoX3VybFNhZmUpOwogICAgdmFyIGJ1ZmZlciA9IGVuY29kZXIuZW5jb2RlKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgsIHRydWUpOwogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGVzKGJ1ZmZlcik7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgaWYgKHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmspIHsKICAgICAgcmV0dXJuIF9VdGY4QmFzZTY0RW5jb2RlclNpbmsoc2luay5hc1V0ZjhTaW5rKGZhbHNlKSwgX3VybFNhZmUpOwogICAgfQogICAgcmV0dXJuIF9Bc2NpaUJhc2U2NEVuY29kZXJTaW5rKHNpbmssIF91cmxTYWZlKTsKICB9Cn0KCi8vLyBIZWxwZXIgY2xhc3MgZm9yIGVuY29kaW5nIGJ5dGVzIHRvIGJhc2U2NC4KY2xhc3MgX0Jhc2U2NEVuY29kZXIgewogIC8vLyBUaGUgUkZDIDQ2NDggYmFzZTY0IGVuY29kaW5nIGFscGhhYmV0LgogIHN0YXRpYyBjb25zdCBTdHJpbmcgX2Jhc2U2NEFscGhhYmV0ID0KICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwoKICAvLy8gVGhlIFJGQyA0NjQ4IGJhc2U2NHVybCBlbmNvZGluZyBhbHBoYWJldC4KICBzdGF0aWMgY29uc3QgU3RyaW5nIF9iYXNlNjRVcmxBbHBoYWJldCA9CiAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIjsKCiAgLy8vIFNoaWZ0LWNvdW50IHRvIGV4dHJhY3QgdGhlIHZhbHVlcyBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGNvbnN0IGludCBfdmFsdWVTaGlmdCA9IDI7CgogIC8vLyBNYXNrIHRvIGV4dHJhY3QgdGhlIGNvdW50IHZhbHVlIHN0b3JlZCBpbiBbX3N0YXRlXS4KICBzdGF0aWMgY29uc3QgaW50IF9jb3VudE1hc2sgPSAzOwoKICBzdGF0aWMgY29uc3QgaW50IF9zaXhCaXRNYXNrID0gMHgzRjsKCiAgLy8vIEludGVybWVkaWF0ZSBzdGF0ZSBiZXR3ZWVuIGNodW5rcy4KICAvLy8KICAvLy8gRW5jb2RpbmcgaGFuZGxlcyB0aHJlZSBieXRlcyBhdCBhIHRpbWUuCiAgLy8vIElmIGZld2VyIHRoYW4gdGhyZWUgYnl0ZXMgaGFzIGJlZW4gc2VlbiwgdGhpcyB2YWx1ZSBlbmNvZGVzCiAgLy8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VlbiAoMCwgMSBvciAyKSBhbmQgdGhlaXIgdmFsdWVzLgogIGludCBfc3RhdGUgPSAwOwoKICAvLy8gQWxwaGFiZXQgdXNlZCBmb3IgZW5jb2RpbmcuCiAgZmluYWwgU3RyaW5nIF9hbHBoYWJldDsKCiAgX0Jhc2U2NEVuY29kZXIoYm9vbCB1cmxTYWZlKQogICAgICA6IF9hbHBoYWJldCA9IHVybFNhZmUgPyBfYmFzZTY0VXJsQWxwaGFiZXQgOiBfYmFzZTY0QWxwaGFiZXQ7CgogIC8vLyBFbmNvZGUgY291bnQgYW5kIGJpdHMgaW50byBhIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBbX3N0YXRlXS4KICBzdGF0aWMgaW50IF9lbmNvZGVTdGF0ZShpbnQgY291bnQsIGludCBiaXRzKSB7CiAgICBhc3NlcnQoY291bnQgPD0gX2NvdW50TWFzayk7CiAgICByZXR1cm4gYml0cyA8PCBfdmFsdWVTaGlmdCB8IGNvdW50OwogIH0KCiAgLy8vIEV4dHJhY3QgYml0cyBmcm9tIGVuY29kZWQgc3RhdGUuCiAgc3RhdGljIGludCBfc3RhdGVCaXRzKGludCBzdGF0ZSkgPT4gc3RhdGUgPj4gX3ZhbHVlU2hpZnQ7CgogIC8vLyBFeHRyYWN0IGNvdW50IGZyb20gZW5jb2RlZCBzdGF0ZS4KICBzdGF0aWMgaW50IF9zdGF0ZUNvdW50KGludCBzdGF0ZSkgPT4gc3RhdGUgJiBfY291bnRNYXNrOwoKICAvLy8gQ3JlYXRlIGEgW1VpbnQ4TGlzdF0gd2l0aCB0aGUgcHJvdmlkZWQgbGVuZ3RoLgogIFVpbnQ4TGlzdCBjcmVhdGVCdWZmZXIoaW50IGJ1ZmZlckxlbmd0aCkgPT4gVWludDhMaXN0KGJ1ZmZlckxlbmd0aCk7CgogIC8vLyBFbmNvZGUgW2J5dGVzXSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gYW5kIHRoZSBiaXRzIGluIFtfc3RhdGVdLgogIC8vLwogIC8vLyBSZXR1cm5zIGEgW1VpbnQ4TGlzdF0gb2YgdGhlIEFTQ0lJIGNvZGVzIG9mIHRoZSBlbmNvZGVkIGRhdGEuCiAgLy8vCiAgLy8vIElmIHRoZSBpbnB1dCwgaW5jbHVkaW5nIGxlZnQgb3ZlciBbX3N0YXRlXSBmcm9tIGVhcmxpZXIgZW5jb2RpbmdzLAogIC8vLyBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhyZWUgYnl0ZXMsIHRoZW4gdGhlIHBhcnRpYWwgc3RhdGUgaXMgc3RvcmVkCiAgLy8vIGJhY2sgaW50byBbX3N0YXRlXS4KICAvLy8gSWYgW2lzTGFzdF0gaXMgdHJ1ZSwgcGFydGlhbCBzdGF0ZSBpcyBlbmNvZGVkIGluIHRoZSBvdXRwdXQgaW5zdGVhZCwKICAvLy8gd2l0aCB0aGUgbmVjZXNzYXJ5IHBhZGRpbmcuCiAgLy8vCiAgLy8vIFJldHVybnMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIG91dHB1dC4KICBVaW50OExpc3QgZW5jb2RlKExpc3Q8aW50PiBieXRlcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoYnl0ZXMgPT0gbnVsbCB8fCBlbmQgPD0gYnl0ZXMubGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKCiAgICB2YXIgY291bnQgPSBfc3RhdGVDb3VudChfc3RhdGUpOwogICAgdmFyIGJ5dGVDb3VudCA9IChjb3VudCArIGxlbmd0aCk7CiAgICB2YXIgZnVsbENodW5rcyA9IGJ5dGVDb3VudCB+LyAzOwogICAgdmFyIHBhcnRpYWxDaHVua0xlbmd0aCA9IGJ5dGVDb3VudCAtIGZ1bGxDaHVua3MgKiAzOwogICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGZ1bGxDaHVua3MgKiA0OwogICAgaWYgKGlzTGFzdCAmJiBwYXJ0aWFsQ2h1bmtMZW5ndGggPiAwKSB7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSA0OyAvLyBSb29tIGZvciBwYWRkaW5nLgogICAgfQogICAgdmFyIG91dHB1dCA9IGNyZWF0ZUJ1ZmZlcihidWZmZXJMZW5ndGgpOwogICAgX3N0YXRlID0KICAgICAgICBlbmNvZGVDaHVuayhfYWxwaGFiZXQsIGJ5dGVzLCBzdGFydCwgZW5kLCBpc0xhc3QsIG91dHB1dCwgMCwgX3N0YXRlKTsKICAgIGlmIChidWZmZXJMZW5ndGggPiAwKSByZXR1cm4gb3V0cHV0OwogICAgLy8gSWYgdGhlIGlucHV0IHBsdXMgdGhlIGRhdGEgaW4gc3RhdGUgaXMgc3RpbGwgbGVzcyB0aGFuIHRocmVlIGJ5dGVzLAogICAgLy8gdGhlcmUgbWF5IG5vdCBiZSBhbnkgb3V0cHV0LgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgaW50IGVuY29kZUNodW5rKFN0cmluZyBhbHBoYWJldCwgTGlzdDxpbnQ+IGJ5dGVzLCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgIGJvb2wgaXNMYXN0LCBVaW50OExpc3Qgb3V0cHV0LCBpbnQgb3V0cHV0SW5kZXgsIGludCBzdGF0ZSkgewogICAgdmFyIGJpdHMgPSBfc3RhdGVCaXRzKHN0YXRlKTsKICAgIC8vIENvdW50IG51bWJlciBvZiBtaXNzaW5nIGJ5dGVzIGluIHRocmVlLWJ5dGUgY2h1bmsuCiAgICB2YXIgZXhwZWN0ZWRDaGFycyA9IDMgLSBfc3RhdGVDb3VudChzdGF0ZSk7CgogICAgLy8gVGhlIGlucHV0IG11c3QgYmUgYSBsaXN0IG9mIGJ5dGVzIChpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMC4uMjU1KS4KICAgIC8vIFRoZSB2YWx1ZSBvZiBgYnl0ZU9yYCB3aWxsIGJlIHRoZSBiaXR3aXNlIG9yIG9mIGFsbCB0aGUgdmFsdWVzIGluCiAgICAvLyBgYnl0ZXNgIGFuZCBhIGxhdGVyIGNoZWNrIHdpbGwgdmFsaWRhdGUgdGhhdCB0aGV5IHdlcmUgYWxsIHZhbGlkIGJ5dGVzLgogICAgdmFyIGJ5dGVPciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgICBieXRlT3IgfD0gYnl0ZTsKICAgICAgYml0cyA9ICgoYml0cyA8PCA4KSB8IGJ5dGUpICYgMHhGRkZGRkY7IC8vIE5ldmVyIHN0b3JlIG1vcmUgdGhhbiAyNCBiaXRzLgogICAgICBleHBlY3RlZENoYXJzLS07CiAgICAgIGlmIChleHBlY3RlZENoYXJzID09IDApIHsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDE4KSAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDEyKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDYpICYgX3NpeEJpdE1hc2spOwogICAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoYml0cyAmIF9zaXhCaXRNYXNrKTsKICAgICAgICBleHBlY3RlZENoYXJzID0gMzsKICAgICAgICBiaXRzID0gMDsKICAgICAgfQogICAgfQogICAgaWYgKGJ5dGVPciA+PSAwICYmIGJ5dGVPciA8PSAyNTUpIHsKICAgICAgaWYgKGlzTGFzdCAmJiBleHBlY3RlZENoYXJzIDwgMykgewogICAgICAgIHdyaXRlRmluYWxDaHVuayhhbHBoYWJldCwgb3V0cHV0LCBvdXRwdXRJbmRleCwgMyAtIGV4cGVjdGVkQ2hhcnMsIGJpdHMpOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHJldHVybiBfZW5jb2RlU3RhdGUoMyAtIGV4cGVjdGVkQ2hhcnMsIGJpdHMpOwogICAgfQoKICAgIC8vIFRoZXJlIHdhcyBhbiBpbnZhbGlkIGJ5dGUgdmFsdWUgc29tZXdoZXJlIGluIHRoZSBpbnB1dCAtIGZpbmQgaXQhCiAgICB2YXIgaSA9IHN0YXJ0OwogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgdmFyIGJ5dGUgPSBieXRlc1tpXTsKICAgICAgaWYgKGJ5dGUgPCAwIHx8IGJ5dGUgPiAyNTUpIGJyZWFrOwogICAgICBpKys7CiAgICB9CiAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgIGJ5dGVzLCAiTm90IGEgYnl0ZSB2YWx1ZSBhdCBpbmRleCAkaTogMHgke2J5dGVzW2ldLnRvUmFkaXhTdHJpbmcoMTYpfSIpOwogIH0KCiAgLy8vIFdyaXRlcyBhIGZpbmFsIGVuY29kZWQgZm91ci1jaGFyYWN0ZXIgY2h1bmsuCiAgLy8vCiAgLy8vIE9ubHkgdXNlZCB3aGVuIHRoZSBbX3N0YXRlXSBjb250YWlucyBhIHBhcnRpYWwgKDEgb3IgMiBieXRlKQogIC8vLyBpbnB1dC4KICBzdGF0aWMgdm9pZCB3cml0ZUZpbmFsQ2h1bmsoCiAgICAgIFN0cmluZyBhbHBoYWJldCwgVWludDhMaXN0IG91dHB1dCwgaW50IG91dHB1dEluZGV4LCBpbnQgY291bnQsIGludCBiaXRzKSB7CiAgICBhc3NlcnQoY291bnQgPiAwKTsKICAgIGlmIChjb3VudCA9PSAxKSB7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoKGJpdHMgPj4gMikgJiBfc2l4Qml0TWFzayk7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IGFscGhhYmV0LmNvZGVVbml0QXQoKGJpdHMgPDwgNCkgJiBfc2l4Qml0TWFzayk7CiAgICAgIG91dHB1dFtvdXRwdXRJbmRleCsrXSA9IF9wYWRkaW5nQ2hhcjsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gX3BhZGRpbmdDaGFyOwogICAgfSBlbHNlIHsKICAgICAgYXNzZXJ0KGNvdW50ID09IDIpOwogICAgICBvdXRwdXRbb3V0cHV0SW5kZXgrK10gPSBhbHBoYWJldC5jb2RlVW5pdEF0KChiaXRzID4+IDEwKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gYWxwaGFiZXQuY29kZVVuaXRBdCgoYml0cyA+PiA0KSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gYWxwaGFiZXQuY29kZVVuaXRBdCgoYml0cyA8PCAyKSAmIF9zaXhCaXRNYXNrKTsKICAgICAgb3V0cHV0W291dHB1dEluZGV4KytdID0gX3BhZGRpbmdDaGFyOwogICAgfQogIH0KfQoKY2xhc3MgX0J1ZmZlckNhY2hpbmdCYXNlNjRFbmNvZGVyIGV4dGVuZHMgX0Jhc2U2NEVuY29kZXIgewogIC8vLyBSZXVzZWQgYnVmZmVyLgogIC8vLwogIC8vLyBXaGVuIHRoZSBidWZmZXIgaXNuJ3QgcmVsZWFzZWQgdG8gdGhlIHNpbmssIG9ubHkgdXNlZCB0byBjcmVhdGUgYW5vdGhlcgogIC8vLyB2YWx1ZSAoYSBzdHJpbmcpLCB0aGUgYnVmZmVyIGNhbiBiZSByZXVzZWQgYmV0d2VlbiBjaHVua3MuCiAgVWludDhMaXN0IGJ1ZmZlckNhY2hlOwoKICBfQnVmZmVyQ2FjaGluZ0Jhc2U2NEVuY29kZXIoYm9vbCB1cmxTYWZlKSA6IHN1cGVyKHVybFNhZmUpOwoKICBVaW50OExpc3QgY3JlYXRlQnVmZmVyKGludCBidWZmZXJMZW5ndGgpIHsKICAgIGlmIChidWZmZXJDYWNoZSA9PSBudWxsIHx8IGJ1ZmZlckNhY2hlLmxlbmd0aCA8IGJ1ZmZlckxlbmd0aCkgewogICAgICBidWZmZXJDYWNoZSA9IFVpbnQ4TGlzdChidWZmZXJMZW5ndGgpOwogICAgfQogICAgLy8gUmV0dXJuIGEgdmlldyBvZiB0aGUgYnVmZmVyLCBzbyBpdCBoYXMgdGhlIHJlcXVlc3RlZCBsZW5ndGguCiAgICByZXR1cm4gVWludDhMaXN0LnZpZXcoYnVmZmVyQ2FjaGUuYnVmZmVyLCAwLCBidWZmZXJMZW5ndGgpOwogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0Jhc2U2NEVuY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgdm9pZCBhZGQoTGlzdDxpbnQ+IHNvdXJjZSkgewogICAgX2FkZChzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7CiAgICBfYWRkKG51bGwsIDAsIDAsIHRydWUpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBpZiAoZW5kID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiZW5kIik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UubGVuZ3RoKTsKICAgIF9hZGQoc291cmNlLCBzdGFydCwgZW5kLCBpc0xhc3QpOwogIH0KCiAgdm9pZCBfYWRkKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpOwp9CgpjbGFzcyBfQXNjaWlCYXNlNjRFbmNvZGVyU2luayBleHRlbmRzIF9CYXNlNjRFbmNvZGVyU2luayB7CiAgZmluYWwgU2luazxTdHJpbmc+IF9zaW5rOwogIGZpbmFsIF9CYXNlNjRFbmNvZGVyIF9lbmNvZGVyOwoKICBfQXNjaWlCYXNlNjRFbmNvZGVyU2luayh0aGlzLl9zaW5rLCBib29sIHVybFNhZmUpCiAgICAgIDogX2VuY29kZXIgPSBfQnVmZmVyQ2FjaGluZ0Jhc2U2NEVuY29kZXIodXJsU2FmZSk7CgogIHZvaWQgX2FkZChMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICB2YXIgYnVmZmVyID0gX2VuY29kZXIuZW5jb2RlKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICB2YXIgc3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZXMoYnVmZmVyKTsKICAgICAgX3NpbmsuYWRkKHN0cmluZyk7CiAgICB9CiAgICBpZiAoaXNMYXN0KSB7CiAgICAgIF9zaW5rLmNsb3NlKCk7CiAgICB9CiAgfQp9CgpjbGFzcyBfVXRmOEJhc2U2NEVuY29kZXJTaW5rIGV4dGVuZHMgX0Jhc2U2NEVuY29kZXJTaW5rIHsKICBmaW5hbCBCeXRlQ29udmVyc2lvblNpbmsgX3Npbms7CiAgZmluYWwgX0Jhc2U2NEVuY29kZXIgX2VuY29kZXI7CgogIF9VdGY4QmFzZTY0RW5jb2RlclNpbmsodGhpcy5fc2luaywgYm9vbCB1cmxTYWZlKQogICAgICA6IF9lbmNvZGVyID0gX0Jhc2U2NEVuY29kZXIodXJsU2FmZSk7CgogIHZvaWQgX2FkZChMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICB2YXIgYnVmZmVyID0gX2VuY29kZXIuZW5jb2RlKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewogICAgICBfc2luay5hZGRTbGljZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIGlzTGFzdCk7CiAgICB9CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGVjb2RlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBEZWNvZGVyIGZvciBiYXNlNjQgZW5jb2RlZCBkYXRhLgovLy8KLy8vIFRoaXMgZGVjb2RlciBhY2NlcHRzIGJvdGggYmFzZTY0IGFuZCBiYXNlNjR1cmwgKCJ1cmwtc2FmZSIpIGVuY29kaW5ncy4KLy8vCi8vLyBUaGUgZW5jb2RpbmcgaXMgcmVxdWlyZWQgdG8gYmUgcHJvcGVybHkgcGFkZGVkLgpjbGFzcyBCYXNlNjREZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgTGlzdDxpbnQ+PiB7CiAgY29uc3QgQmFzZTY0RGVjb2RlcigpOwoKICAvLy8gRGVjb2RlcyB0aGUgY2hhcmFjdGVycyBvZiBbaW5wdXRdIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBhcyBiYXNlNjQuCiAgLy8vCiAgLy8vIElmIFtzdGFydF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IG9mIFtpbnB1dF0uCiAgLy8vIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2YgW2lucHV0XS4KICAvLy8KICAvLy8gVGhlIHJldHVybmVkIFtVaW50OExpc3RdIGNvbnRhaW5zIGV4YWN0bHkgdGhlIGRlY29kZWQgYnl0ZXMsCiAgLy8vIHNvIHRoZSBbVWludDhMaXN0Lmxlbmd0aF0gaXMgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgZGVjb2RlZCBieXRlcy4KICAvLy8gVGhlIFtVaW50OExpc3QuYnVmZmVyXSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGRlY29kZWQgYnl0ZXMuCiAgVWludDhMaXN0IGNvbnZlcnQoU3RyaW5nIGlucHV0LCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGlucHV0Lmxlbmd0aCk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gVWludDhMaXN0KDApOwogICAgdmFyIGRlY29kZXIgPSBfQmFzZTY0RGVjb2RlcigpOwogICAgdmFyIGJ1ZmZlciA9IGRlY29kZXIuZGVjb2RlKGlucHV0LCBzdGFydCwgZW5kKTsKICAgIGRlY29kZXIuY2xvc2UoaW5wdXQsIGVuZCk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgcmV0dXJuIF9CYXNlNjREZWNvZGVyU2luayhzaW5rKTsKICB9Cn0KCi8vLyBIZWxwZXIgY2xhc3MgaW1wbGVtZW50aW5nIGJhc2U2NCBkZWNvZGluZyB3aXRoIGludGVybWVkaWF0ZSBzdGF0ZS4KY2xhc3MgX0Jhc2U2NERlY29kZXIgewogIC8vLyBTaGlmdC1jb3VudCB0byBleHRyYWN0IHRoZSB2YWx1ZXMgc3RvcmVkIGluIFtfc3RhdGVdLgogIHN0YXRpYyBjb25zdCBpbnQgX3ZhbHVlU2hpZnQgPSAyOwoKICAvLy8gTWFzayB0byBleHRyYWN0IHRoZSBjb3VudCB2YWx1ZSBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGNvbnN0IGludCBfY291bnRNYXNrID0gMzsKCiAgLy8vIEludmFsaWQgY2hhcmFjdGVyIGluIGRlY29kaW5nIHRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX2ludmFsaWQgPSAtMjsKCiAgLy8vIFBhZGRpbmcgY2hhcmFjdGVyIGluIGRlY29kaW5nIHRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX3BhZGRpbmcgPSAtMTsKCiAgLy8gU2hvcnRoYW5kcyB0byBtYWtlIHRoZSB0YWJsZSBtb3JlIHJlYWRhYmxlLgogIHN0YXRpYyBjb25zdCBpbnQgX18gPSBfaW52YWxpZDsKICBzdGF0aWMgY29uc3QgaW50IF9wID0gX3BhZGRpbmc7CgogIC8vLyBNYXBwaW5nIGZyb20gQVNDSUkgY2hhcmFjdGVycyB0byB0aGVpciBpbmRleCBpbiB0aGUgYmFzZTY0IGFscGhhYmV0LgogIC8vLwogIC8vLyBVc2VzIFtfaW52YWxpZF0gZm9yIGludmFsaWQgaW5kaWNlcyBhbmQgW19wYWRkaW5nXSBmb3IgdGhlIHBhZGRpbmcKICAvLy8gY2hhcmFjdGVyLgogIC8vLwogIC8vLyBBY2NlcHRzIHRoZSAiVVJMLXNhZmUiIGFscGhhYmV0IGFzIHdlbGwgKGAtYCBhbmQgYF9gIGFyZSB0aGUKICAvLy8gNjJuZCBhbmQgNjNyZCBhbHBoYWJldCBjaGFyYWN0ZXJzKSwgYW5kIGNvbnNpZGVycyBgJWAgYSBwYWRkaW5nCiAgLy8vIGNoYXJhY3Rlciwgd2hpY2ggbXVzdCB0aGVuIGJlIGZvbGxvd2VkIGJ5IGAzRGAsIHRoZSBwZXJjZW50LWVzY2FwZQogIC8vLyBmb3IgYD1gLgogIHN0YXRpYyBmaW5hbCBMaXN0PGludD4gX2ludmVyc2VBbHBoYWJldCA9IEludDhMaXN0LmZyb21MaXN0KFsKICAgIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCAvLwogICAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIC8vCiAgICBfXywgX18sIF9fLCBfXywgX18sIF9wLCBfXywgX18sIF9fLCBfXywgX18sIDYyLCBfXywgNjIsIF9fLCA2MywgLy8KICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCBfXywgX18sIF9fLCBfcCwgX18sIF9fLCAvLwogICAgX18sIDAwLCAwMSwgMDIsIDAzLCAwNCwgMDUsIDA2LCAwNywgMDgsIDA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIC8vCiAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIF9fLCBfXywgX18sIF9fLCA2MywgLy8KICAgIF9fLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCAvLwogICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCBfXywgX18sIF9fLCBfXywgX18sIC8vCiAgXSk7CgogIC8vIENoYXJhY3RlciBjb25zdGFudHMuCiAgc3RhdGljIGNvbnN0IGludCBfY2hhcl9wZXJjZW50ID0gMHgyNTsgLy8gJyUnLgogIHN0YXRpYyBjb25zdCBpbnQgX2NoYXJfMyA9IDB4MzM7IC8vICczJy4KICBzdGF0aWMgY29uc3QgaW50IF9jaGFyX2QgPSAweDY0OyAvLyAnZCcuCgogIC8vLyBNYWludGFpbnMgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSBvZiBhIHBhcnRseS1kZWNvZGVkIGlucHV0LgogIC8vLwogIC8vLyBCYXNlNjQgaXMgZGVjb2RlZCBpbiBjaHVua3Mgb2YgZm91ciBjaGFyYWN0ZXJzLiBJZiBhIGNodW5rIGRvZXMgbm90CiAgLy8vIGNvbnRhaW4gYSBmdWxsIGJsb2NrLCB0aGUgZGVjb2RlZCBiaXRzIChzaXggcGVyIGNoYXJhY3Rlcikgb2YgdGhlCiAgLy8vIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQgaW4gW19zdGF0ZV0gdW50aWwgdGhlIG5leHQgY2FsbCB0bwogIC8vLyBbX2RlY29kZV0gb3IgW19jbG9zZV0uCiAgLy8vCiAgLy8vIElmIG5vIHBhZGRpbmcgaGFzIGJlZW4gc2VlbiwgdGhlIHZhbHVlIGlzCiAgLy8vICAgYG51bWJlck9mQ2hhcmFjdGVyc1NlZW4gfCAoZGVjb2RlZEJpdHMgPDwgMilgCiAgLy8vIHdoZXJlIGBudW1iZXJPZkNoYXJhY3RlcnNTZWVuYCBpcyBiZXR3ZWVuIDAgYW5kIDMgYW5kIGRlY29kZWQgYml0cwogIC8vLyBjb250YWlucyBzaXggYml0cyBwZXIgc2VlbiBjaGFyYWN0ZXIuCiAgLy8vCiAgLy8vIElmIHBhZGRpbmcgaGFzIGJlZW4gc2VlbiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuIEl0J3MgdGhlIGJpdHdpc2UgbmVnYXRpb24KICAvLy8gb2YgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYWxsb3dlZCBwYWRkaW5nIGNoYXJhY3RlcnMgKGFsd2F5cyB+MCBvciB+MSkuCiAgLy8vCiAgLy8vIEEgc3RhdGUgb2YgYDBgIG9yIGB+MGAgYXJlIHZhbGlkIHBsYWNlcyB0byBlbmQgZGVjb2RpbmcsIGFsbCBvdGhlciB2YWx1ZXMKICAvLy8gbWVhbiB0aGF0IGEgZm91ci1jaGFyYWN0ZXIgYmxvY2sgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4KICBpbnQgX3N0YXRlID0gMDsKCiAgLy8vIEVuY29kZXMgW2NvdW50XSBhbmQgW2JpdHNdIGFzIGEgdmFsdWUgdG8gYmUgc3RvcmVkIGluIFtfc3RhdGVdLgogIHN0YXRpYyBpbnQgX2VuY29kZUNoYXJhY3RlclN0YXRlKGludCBjb3VudCwgaW50IGJpdHMpIHsKICAgIGFzc2VydChjb3VudCA9PSAoY291bnQgJiBfY291bnRNYXNrKSk7CiAgICByZXR1cm4gKGJpdHMgPDwgX3ZhbHVlU2hpZnQgfCBjb3VudCk7CiAgfQoKICAvLy8gRXh0cmFjdHMgY291bnQgZnJvbSBhIFtfc3RhdGVdIHZhbHVlLgogIHN0YXRpYyBpbnQgX3N0YXRlQ291bnQoaW50IHN0YXRlKSB7CiAgICBhc3NlcnQoc3RhdGUgPj0gMCk7CiAgICByZXR1cm4gc3RhdGUgJiBfY291bnRNYXNrOwogIH0KCiAgLy8vIEV4dHJhY3RzIHZhbHVlIGJpdHMgZnJvbSBhIFtfc3RhdGVdIHZhbHVlLgogIHN0YXRpYyBpbnQgX3N0YXRlQml0cyhpbnQgc3RhdGUpIHsKICAgIGFzc2VydChzdGF0ZSA+PSAwKTsKICAgIHJldHVybiBzdGF0ZSA+PiBfdmFsdWVTaGlmdDsKICB9CgogIC8vLyBFbmNvZGVzIGEgbnVtYmVyIG9mIGV4cGVjdGVkIHBhZGRpbmcgY2hhcmFjdGVycyB0byBiZSBzdG9yZWQgaW4gW19zdGF0ZV0uCiAgc3RhdGljIGludCBfZW5jb2RlUGFkZGluZ1N0YXRlKGludCBleHBlY3RlZFBhZGRpbmcpIHsKICAgIGFzc2VydChleHBlY3RlZFBhZGRpbmcgPj0gMCk7CiAgICBhc3NlcnQoZXhwZWN0ZWRQYWRkaW5nIDw9IDUpOwogICAgcmV0dXJuIC1leHBlY3RlZFBhZGRpbmcgLSAxOyAvLyB+ZXhwZWN0ZWRQYWRkaW5nIGFkYXB0ZWQgdG8gZGFydDJqcy4KICB9CgogIC8vLyBFeHRyYWN0cyBleHBlY3RlZCBwYWRkaW5nIGNoYXJhY3RlciBjb3VudCBmcm9tIGEgW19zdGF0ZV0gdmFsdWUuCiAgc3RhdGljIGludCBfc3RhdGVQYWRkaW5nKGludCBzdGF0ZSkgewogICAgYXNzZXJ0KHN0YXRlIDwgMCk7CiAgICByZXR1cm4gLXN0YXRlIC0gMTsgLy8gfnN0YXRlIGFkYXB0ZWQgdG8gZGFydDJqcy4KICB9CgogIHN0YXRpYyBib29sIF9oYXNTZWVuUGFkZGluZyhpbnQgc3RhdGUpID0+IHN0YXRlIDwgMDsKCiAgLy8vIERlY29kZXMgW2lucHV0XSBmcm9tIFtzdGFydF0gdG8gW2VuZF0uCiAgLy8vCiAgLy8vIFJldHVybnMgYSBbVWludDhMaXN0XSB3aXRoIHRoZSBkZWNvZGVkIGJ5dGVzLgogIC8vLyBJZiBhIHByZXZpb3VzIGNhbGwgaGFkIGFuIGluY29tcGxldGUgZm91ci1jaGFyYWN0ZXIgYmxvY2ssIHRoZSBiaXRzIGZyb20KICAvLy8gdGhvc2UgYXJlIGluY2x1ZGVkIGluIGRlY29kaW5nCiAgVWludDhMaXN0IGRlY29kZShTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoZW5kIDw9IGlucHV0Lmxlbmd0aCk7CiAgICBpZiAoX2hhc1NlZW5QYWRkaW5nKF9zdGF0ZSkpIHsKICAgICAgX3N0YXRlID0gX2NoZWNrUGFkZGluZyhpbnB1dCwgc3RhcnQsIGVuZCwgX3N0YXRlKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gVWludDhMaXN0KDApOwogICAgdmFyIGJ1ZmZlciA9IF9hbGxvY2F0ZUJ1ZmZlcihpbnB1dCwgc3RhcnQsIGVuZCwgX3N0YXRlKTsKICAgIF9zdGF0ZSA9IGRlY29kZUNodW5rKGlucHV0LCBzdGFydCwgZW5kLCBidWZmZXIsIDAsIF9zdGF0ZSk7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgLy8vIENoZWNrcyB0aGF0IFtfc3RhdGVdIHJlcHJlc2VudHMgYSB2YWxpZCBkZWNvZGluZy4KICB2b2lkIGNsb3NlKFN0cmluZyBpbnB1dCwgaW50IGVuZCkgewogICAgaWYgKF9zdGF0ZSA8IF9lbmNvZGVQYWRkaW5nU3RhdGUoMCkpIHsKICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCJNaXNzaW5nIHBhZGRpbmcgY2hhcmFjdGVyIiwgaW5wdXQsIGVuZCk7CiAgICB9CiAgICBpZiAoX3N0YXRlID4gMCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAiSW52YWxpZCBsZW5ndGgsIG11c3QgYmUgbXVsdGlwbGUgb2YgZm91ciIsIGlucHV0LCBlbmQpOwogICAgfQogICAgX3N0YXRlID0gX2VuY29kZVBhZGRpbmdTdGF0ZSgwKTsKICB9CgogIC8vLyBEZWNvZGVzIFtpbnB1dF0gZnJvbSBbc3RhcnRdIHRvIFtlbmRdLgogIC8vLwogIC8vLyBJbmNsdWRlcyB0aGUgc3RhdGUgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIGluIHRoZSBkZWNvZGluZy4KICAvLy8gV3JpdGVzIHRoZSBkZWNvZGluZyB0byBbb3V0cHV0XSBhdCBbb3V0SW5kZXhdLCBhbmQgdGhlcmUgbXVzdAogIC8vLyBiZSByb29tIGluIHRoZSBvdXRwdXQuCiAgc3RhdGljIGludCBkZWNvZGVDaHVuayhTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCwgVWludDhMaXN0IG91dHB1dCwKICAgICAgaW50IG91dEluZGV4LCBpbnQgc3RhdGUpIHsKICAgIGFzc2VydCghX2hhc1NlZW5QYWRkaW5nKHN0YXRlKSk7CiAgICBjb25zdCBhc2NpaU1hc2sgPSAxMjc7CiAgICBjb25zdCBhc2NpaU1heCA9IDEyNzsKICAgIGNvbnN0IGVpZ2h0Qml0TWFzayA9IDB4RkY7CiAgICBjb25zdCBiaXRzUGVyQ2hhcmFjdGVyID0gNjsKCiAgICB2YXIgYml0cyA9IF9zdGF0ZUJpdHMoc3RhdGUpOwogICAgdmFyIGNvdW50ID0gX3N0YXRlQ291bnQoc3RhdGUpOwogICAgLy8gU3RyaW5nIGNvbnRlbnRzIHNob3VsZCBiZSBhbGwgQVNDSUkuCiAgICAvLyBJbnN0ZWFkIG9mIGNoZWNraW5nIGZvciBlYWNoIGNoYXJhY3Rlciwgd2UgY29sbGVjdCB0aGUgYml0d2lzZS1vciBvZgogICAgLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIGluIGBjaGFyT3JgIGFuZCBsYXRlciB2YWxpZGF0ZSB0aGF0IGFsbCBjaGFyYWN0ZXJzCiAgICAvLyB3ZXJlIEFTQ0lJLgogICAgdmFyIGNoYXJPciA9IDA7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2hhciA9IGlucHV0LmNvZGVVbml0QXQoaSk7CiAgICAgIGNoYXJPciB8PSBjaGFyOwogICAgICB2YXIgY29kZSA9IF9pbnZlcnNlQWxwaGFiZXRbY2hhciAmIGFzY2lpTWFza107CiAgICAgIGlmIChjb2RlID49IDApIHsKICAgICAgICBiaXRzID0gKChiaXRzIDw8IGJpdHNQZXJDaGFyYWN0ZXIpIHwgY29kZSkgJiAweEZGRkZGRjsKICAgICAgICBjb3VudCA9IChjb3VudCArIDEpICYgMzsKICAgICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgICAgYXNzZXJ0KG91dEluZGV4ICsgMyA8PSBvdXRwdXQubGVuZ3RoKTsKICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IChiaXRzID4+IDE2KSAmIGVpZ2h0Qml0TWFzazsKICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IChiaXRzID4+IDgpICYgZWlnaHRCaXRNYXNrOwogICAgICAgICAgb3V0cHV0W291dEluZGV4KytdID0gYml0cyAmIGVpZ2h0Qml0TWFzazsKICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChjb2RlID09IF9wYWRkaW5nICYmIGNvdW50ID4gMSkgewogICAgICAgIGlmIChjaGFyT3IgPCAwIHx8IGNoYXJPciA+IGFzY2lpTWF4KSBicmVhazsKICAgICAgICBpZiAoY291bnQgPT0gMykgewogICAgICAgICAgaWYgKChiaXRzICYgMHgwMykgIT0gMCkgewogICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZW5jb2RpbmcgYmVmb3JlIHBhZGRpbmciLCBpbnB1dCwgaSk7CiAgICAgICAgICB9CiAgICAgICAgICBvdXRwdXRbb3V0SW5kZXgrK10gPSBiaXRzID4+IDEwOwogICAgICAgICAgb3V0cHV0W291dEluZGV4KytdID0gYml0cyA+PiAyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoKGJpdHMgJiAweDBGKSAhPSAwKSB7CiAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBlbmNvZGluZyBiZWZvcmUgcGFkZGluZyIsIGlucHV0LCBpKTsKICAgICAgICAgIH0KICAgICAgICAgIG91dHB1dFtvdXRJbmRleCsrXSA9IGJpdHMgPj4gNDsKICAgICAgICB9CiAgICAgICAgLy8gRXhwZWN0ZWQgcGFkZGluZyBpcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIHBhZGRpbmcgY2hhcmFjdGVycywKICAgICAgICAvLyB3aGVyZSBgPWAgY291bnRzIGFzIHRocmVlIGFuZCBgJTNEYCBjb3VudHMgYXMgb25lIHBlciBjaGFyYWN0ZXIuCiAgICAgICAgLy8KICAgICAgICAvLyBFeHBlY3QgZWl0aGVyIHplcm8gb3Igb25lIHBhZGRpbmcgZGVwZW5kaW5nIG9uIGNvdW50ICgyIG9yIDMpLAogICAgICAgIC8vIHBsdXMgdHdvIG1vcmUgY2hhcmFjdGVycyBpZiB0aGUgY29kZSB3YXMgYCVgIChhIHBhcnRpYWwgcGFkZGluZykuCiAgICAgICAgdmFyIGV4cGVjdGVkUGFkZGluZyA9ICgzIC0gY291bnQpICogMzsKICAgICAgICBpZiAoY2hhciA9PSBfY2hhcl9wZXJjZW50KSBleHBlY3RlZFBhZGRpbmcgKz0gMjsKICAgICAgICBzdGF0ZSA9IF9lbmNvZGVQYWRkaW5nU3RhdGUoZXhwZWN0ZWRQYWRkaW5nKTsKICAgICAgICByZXR1cm4gX2NoZWNrUGFkZGluZyhpbnB1dCwgaSArIDEsIGVuZCwgc3RhdGUpOwogICAgICB9CiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBjaGFyYWN0ZXIiLCBpbnB1dCwgaSk7CiAgICB9CiAgICBpZiAoY2hhck9yID49IDAgJiYgY2hhck9yIDw9IGFzY2lpTWF4KSB7CiAgICAgIHJldHVybiBfZW5jb2RlQ2hhcmFjdGVyU3RhdGUoY291bnQsIGJpdHMpOwogICAgfQogICAgLy8gVGhlcmUgaXMgYW4gaW52YWxpZCAobm9uLUFTQ0lJKSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0LgogICAgaW50IGk7CiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIHZhciBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNoYXIgPCAwIHx8IGNoYXIgPiBhc2NpaU1heCkgYnJlYWs7CiAgICB9CiAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgY2hhcmFjdGVyIiwgaW5wdXQsIGkpOwogIH0KCiAgLy8vIEFsbG9jYXRlcyBhIGJ1ZmZlciB3aXRoIHJvb20gZm9yIHRoZSBkZWNvZGluZyBvZiBhIHN1YnN0cmluZyBvZiBbaW5wdXRdLgogIC8vLwogIC8vLyBJbmNsdWRlcyByb29tIGZvciB0aGUgY2hhcmFjdGVycyBpbiBbc3RhdGVdLCBhbmQgaGFuZGxlcyBwYWRkaW5nIGNvcnJlY3RseS4KICBzdGF0aWMgVWludDhMaXN0IF9hbGxvY2F0ZUJ1ZmZlcigKICAgICAgU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBzdGF0ZSkgewogICAgYXNzZXJ0KHN0YXRlID49IDApOwogICAgdmFyIHBhZGRpbmdTdGFydCA9IF90cmltUGFkZGluZ0NoYXJzKGlucHV0LCBzdGFydCwgZW5kKTsKICAgIHZhciBsZW5ndGggPSBfc3RhdGVDb3VudChzdGF0ZSkgKyAocGFkZGluZ1N0YXJ0IC0gc3RhcnQpOwogICAgLy8gVGhyZWUgYnl0ZXMgcGVyIGZ1bGwgZm91ciBieXRlcyBpbiB0aGUgaW5wdXQuCiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gKGxlbmd0aCA+PiAyKSAqIDM7CiAgICAvLyBJZiBwYWRkaW5nIHdhcyBzZWVuLCB0aGVuIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmssIGFuZCB0aGUgZmluYWwgcGFydGlhbAogICAgLy8gY2h1bmsgc2hvdWxkIGJlIGRlY29kZWQgdG9vLgogICAgdmFyIHJlbWFpbmRlckxlbmd0aCA9IGxlbmd0aCAmIDM7CiAgICBpZiAocmVtYWluZGVyTGVuZ3RoICE9IDAgJiYgcGFkZGluZ1N0YXJ0IDwgZW5kKSB7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSByZW1haW5kZXJMZW5ndGggLSAxOwogICAgfQogICAgaWYgKGJ1ZmZlckxlbmd0aCA+IDApIHJldHVybiBVaW50OExpc3QoYnVmZmVyTGVuZ3RoKTsKICAgIC8vIElmIHRoZSBpbnB1dCBwbHVzIHN0YXRlIGlzIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMsIGFuZCBpdCdzIG5vdAogICAgLy8gYXQgdGhlIGVuZCBvZiBpbnB1dCwgbm8gYnVmZmVyIGlzIG5lZWRlZC4KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiBwYWRkaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgogIC8vLwogIC8vLyBSZXR1cm5zIHRoZSBlbmQgb2YgaW5wdXQgaWYgdGhlcmUgaXMgbm8gcGFkZGluZy4KICAvLy8KICAvLy8gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBkZWNvZGluZyBidWZmZXIgaGFzIHRoZSBleGFjdCBzaXplCiAgLy8vIGl0IG5lZWRzIHdoZW4gaW5wdXQgaXMgdmFsaWQsIGFuZCBhdCBsZWFzdCBlbm91Z2ggYnl0ZXMgdG8gcmVhY2ggdGhlIGVycm9yCiAgLy8vIHdoZW4gaW5wdXQgaXMgaW52YWxpZC4KICAvLy8KICAvLy8gTmV2ZXIgY291bnQgbW9yZSB0aGFuIHR3byBwYWRkaW5nIHNlcXVlbmNlcyBzaW5jZSBhbnkgbW9yZSB0aGFuIHRoYXQKICAvLy8gd2lsbCByYWlzZSBhbiBlcnJvciBhbnl3YXksIGFuZCB3ZSBvbmx5IGNhcmUgYWJvdXQgYmVpbmcgcHJlY2lzZSBmb3IKICAvLy8gc3VjY2Vzc2Z1bCBjb252ZXJzaW9ucy4KICBzdGF0aWMgaW50IF90cmltUGFkZGluZ0NoYXJzKFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBUaGlzIG1heSBjb3VudCAnJT0nIGFzIHR3byBwYWRkaW5ncy4gVGhhdCdzIG9rLCBpdCB3aWxsIGVyciBsYXRlciwKICAgIC8vIGJ1dCB0aGUgYnVmZmVyIHdpbGwgYmUgbGFyZ2UgZW5vdWdoIHRvIHJlYWNoIHRoZSBlcnJvci4KICAgIHZhciBwYWRkaW5nID0gMDsKICAgIHZhciBpbmRleCA9IGVuZDsKICAgIHZhciBuZXdFbmQgPSBlbmQ7CiAgICB3aGlsZSAoaW5kZXggPiBzdGFydCAmJiBwYWRkaW5nIDwgMikgewogICAgICBpbmRleC0tOwogICAgICB2YXIgY2hhciA9IGlucHV0LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoY2hhciA9PSBfcGFkZGluZ0NoYXIpIHsKICAgICAgICBwYWRkaW5nKys7CiAgICAgICAgbmV3RW5kID0gaW5kZXg7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKChjaGFyIHwgMHgyMCkgPT0gX2NoYXJfZCkgewogICAgICAgIGlmIChpbmRleCA9PSBzdGFydCkgYnJlYWs7CiAgICAgICAgaW5kZXgtLTsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfMykgewogICAgICAgIGlmIChpbmRleCA9PSBzdGFydCkgYnJlYWs7CiAgICAgICAgaW5kZXgtLTsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChpbmRleCk7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfcGVyY2VudCkgewogICAgICAgIHBhZGRpbmcrKzsKICAgICAgICBuZXdFbmQgPSBpbmRleDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBuZXdFbmQ7CiAgfQoKICAvLy8gQ2hlY2sgdGhhdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgaXMgdmFsaWQgcGFkZGluZy4KICAvLy8KICAvLy8gVmFsaWQgcGFkZGluZyBpcyBhIGNvcnJlY3QgbnVtYmVyICgwLCAxIG9yIDIpIG9mIGA9YCBjaGFyYWN0ZXJzCiAgLy8vIG9yIGAlM0RgIHNlcXVlbmNlcyBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgYmFzZTY0IGNoYXJhY3RlcnMuCiAgLy8vIFRoZSBbc3RhdGVdIHBhcmFtZXRlciBlbmNvZGVzIHdoaWNoIHBhZGRpbmcgY29udGludWF0aW9ucyBhcmUgYWxsb3dlZAogIC8vLyBhcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGNoYXJhY3RlcnMuIFRoYXQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YKICAvLy8gZXhwZWN0ZWQgcGFkZGluZyBjaGFyYWN0ZXJzIHRpbWVzIDMgbWludXMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGNoYXJhY3RlcnMKICAvLy8gc2VlbiBzbyBmYXIsIHdoZXJlIGA9YCBjb3VudHMgYXMgMyBjb3VudHMgYXMgdGhyZWUgY2hhcmFjdGVycywKICAvLy8gYW5kIHRoZSBwYWRkaW5nIHNlcXVlbmNlIGAlM0RgIGNvdW50cyBhcyBvbmUgY2hhcmFjdGVyIHBlciBjaGFyYWN0ZXIuCiAgLy8vCiAgLy8vIFRoZSBudW1iZXIgb2YgbWlzc2luZyBjaGFyYWN0ZXJzIGlzIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIDUgYmVjYXVzZSB3ZQogIC8vLyBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBoYXZpbmcgc2VlbiBhdCBsZWFzdCBvbmUgYD1gIG9yIGAlYAogIC8vLyBjaGFyYWN0ZXIuCiAgLy8vIElmIHRoZSBudW1iZXIgb2YgbWlzc2luZyBjaGFyYWN0ZXJzIGlzIG5vdCAzIG9yIDAsIHdlIGhhdmUgc2VlbiAoYXQgbGVhc3QpCiAgLy8vIGEgYCVgIGNoYXJhY3RlciBhbmQgZXhwZWN0cyB0aGUgcmVzdCBvZiB0aGUgYCUzRGAgc2VxdWVuY2UsIGFuZCBhIGA9YCBpcwogIC8vLyBub3QgYWxsb3dlZC4gV2hlbiBtaXNzaW5nIDMgY2hhcmFjdGVycywgZWl0aGVyIGA9YCBvciBgJWAgaXMgYWxsb3dlZC4KICAvLy8KICAvLy8gV2hlbiB0aGUgdmFsdWUgaXMgMCwgbm8gbW9yZSBwYWRkaW5nIChvciBhbnkgb3RoZXIgY2hhcmFjdGVyKSBpcyBhbGxvd2VkLgogIHN0YXRpYyBpbnQgX2NoZWNrUGFkZGluZyhTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IHN0YXRlKSB7CiAgICBhc3NlcnQoX2hhc1NlZW5QYWRkaW5nKHN0YXRlKSk7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gc3RhdGU7CiAgICB2YXIgZXhwZWN0ZWRQYWRkaW5nID0gX3N0YXRlUGFkZGluZyhzdGF0ZSk7CiAgICBhc3NlcnQoZXhwZWN0ZWRQYWRkaW5nID49IDApOwogICAgYXNzZXJ0KGV4cGVjdGVkUGFkZGluZyA8IDYpOwogICAgd2hpbGUgKGV4cGVjdGVkUGFkZGluZyA+IDApIHsKICAgICAgdmFyIGNoYXIgPSBpbnB1dC5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgICAgaWYgKGV4cGVjdGVkUGFkZGluZyA9PSAzKSB7CiAgICAgICAgaWYgKGNoYXIgPT0gX3BhZGRpbmdDaGFyKSB7CiAgICAgICAgICBleHBlY3RlZFBhZGRpbmcgLT0gMzsKICAgICAgICAgIHN0YXJ0Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGNoYXIgPT0gX2NoYXJfcGVyY2VudCkgewogICAgICAgICAgZXhwZWN0ZWRQYWRkaW5nLS07CiAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgYnJlYWs7CiAgICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChzdGFydCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBQYXJ0aWFsIHBhZGRpbmcgbWVhbnMgd2UgaGF2ZSBzZWVuIHBhcnQgb2YgYSAiJTNEIiBlc2NhcGUuCiAgICAgIHZhciBleHBlY3RlZFBhcnRpYWxQYWRkaW5nID0gZXhwZWN0ZWRQYWRkaW5nOwogICAgICBpZiAoZXhwZWN0ZWRQYXJ0aWFsUGFkZGluZyA+IDMpIGV4cGVjdGVkUGFydGlhbFBhZGRpbmcgLT0gMzsKICAgICAgaWYgKGV4cGVjdGVkUGFydGlhbFBhZGRpbmcgPT0gMikgewogICAgICAgIC8vIEV4cGVjdHMgJzMnCiAgICAgICAgaWYgKGNoYXIgIT0gX2NoYXJfMykgYnJlYWs7CiAgICAgICAgc3RhcnQrKzsKICAgICAgICBleHBlY3RlZFBhZGRpbmctLTsKICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSBicmVhazsKICAgICAgICBjaGFyID0gaW5wdXQuY29kZVVuaXRBdChzdGFydCk7CiAgICAgIH0KICAgICAgLy8gRXhwZWN0cyAnRCcgb3IgJ2QnLgogICAgICBpZiAoKGNoYXIgfCAweDIwKSAhPSBfY2hhcl9kKSBicmVhazsKICAgICAgc3RhcnQrKzsKICAgICAgZXhwZWN0ZWRQYWRkaW5nLS07CiAgICAgIGlmIChzdGFydCA9PSBlbmQpIGJyZWFrOwogICAgfQogICAgaWYgKHN0YXJ0ICE9IGVuZCkgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcGFkZGluZyBjaGFyYWN0ZXIiLCBpbnB1dCwgc3RhcnQpOwogICAgfQogICAgcmV0dXJuIF9lbmNvZGVQYWRkaW5nU3RhdGUoZXhwZWN0ZWRQYWRkaW5nKTsKICB9Cn0KCmNsYXNzIF9CYXNlNjREZWNvZGVyU2luayBleHRlbmRzIFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZSB7CiAgLy8vIE91dHB1dCBzaW5rCiAgZmluYWwgU2luazxMaXN0PGludD4+IF9zaW5rOwogIGZpbmFsIF9CYXNlNjREZWNvZGVyIF9kZWNvZGVyID0gX0Jhc2U2NERlY29kZXIoKTsKCiAgX0Jhc2U2NERlY29kZXJTaW5rKHRoaXMuX3NpbmspOwoKICB2b2lkIGFkZChTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoc3RyaW5nLmlzRW1wdHkpIHJldHVybjsKICAgIHZhciBidWZmZXIgPSBfZGVjb2Rlci5kZWNvZGUoc3RyaW5n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ZXIgdGhhdCBjYW4gY29udmVydCBKc29uIG9iamVjdHMgZGlyZWN0bHkgdG8gYnl0ZXMsIG9yIGNhbiBkZWNvZGUKLy8vIGJ5dGVzIGRpcmVjdGx5IHRvIGpzb24gb2JqZWN0cy4KLy8vCi8vLyBGdXNlZCBjb2RlY3MgZ2VuZXJhbGx5IGF0dGVtcHQgdG8gb3B0aW1pemUgdGhlIG9wZXJhdGlvbnMgYW5kIGNhbiBiZSBmYXN0ZXIKLy8vIHRoYW4gZXhlY3V0aW5nIGVhY2ggc3RlcCBvZiBhbiBlbmNvZGluZyBzZXBhcmF0ZWx5LgphYnN0cmFjdCBjbGFzcyBDb2RlYzxTLCBUPiB7CiAgY29uc3QgQ29kZWMoKTsKCiAgLy8vIEVuY29kZXMgW2lucHV0XS4KICAvLy8KICAvLy8gVGhlIGlucHV0IGlzIGVuY29kZWQgYXMgaWYgYnkgYGVuY29kZXIuY29udmVydGAuCiAgVCBlbmNvZGUoUyBpbnB1dCkgPT4gZW5jb2Rlci5jb252ZXJ0KGlucHV0KTsKCiAgLy8vIERlY29kZXMgW2VuY29kZWRdIGRhdGEuCiAgLy8vCiAgLy8vIFRoZSBpbnB1dCBpcyBkZWNvZGVkIGFzIGlmIGJ5IGBkZWNvZGVyLmNvbnZlcnRgLgogIFMgZGVjb2RlKFQgZW5jb2RlZCkgPT4gZGVjb2Rlci5jb252ZXJ0KGVuY29kZWQpOwoKICAvLy8gUmV0dXJucyB0aGUgZW5jb2RlciBmcm9tIFtTXSB0byBbVF0uCiAgLy8vCiAgLy8vIEl0IG1heSBiZSBzdGF0ZWZ1bCBhbmQgc2hvdWxkIG5vdCBiZSByZXVzZWQuCiAgQ29udmVydGVyPFMsIFQ+IGdldCBlbmNvZGVyOwoKICAvLy8gUmV0dXJucyB0aGUgZGVjb2RlciBvZiBgdGhpc2AsIGNvbnZlcnRpbmcgZnJvbSBbVF0gdG8gW1NdLgogIC8vLwogIC8vLyBJdCBtYXkgYmUgc3RhdGVmdWwgYW5kIHNob3VsZCBub3QgYmUgcmV1c2VkLgogIENvbnZlcnRlcjxULCBTPiBnZXQgZGVjb2RlcjsKCiAgLy8vIEZ1c2VzIGB0aGlzYCB3aXRoIGBvdGhlcmAuCiAgLy8vCiAgLy8vIFdoZW4gZW5jb2RpbmcsIHRoZSByZXN1bHRpbmcgY29kZWMgZW5jb2RlcyB3aXRoIGB0aGlzYCBiZWZvcmUKICAvLy8gZW5jb2Rpbmcgd2l0aCBbb3RoZXJdLgogIC8vLwogIC8vLyBXaGVuIGRlY29kaW5nLCB0aGUgcmVzdWx0aW5nIGNvZGVjIGRlY29kZXMgd2l0aCBbb3RoZXJdIGJlZm9yZSBkZWNvZGluZwogIC8vLyB3aXRoIGB0aGlzYC4KICAvLy8KICAvLy8gSW4gc29tZSBjYXNlcyBvbmUgbmVlZHMgdG8gdXNlIHRoZSBbaW52ZXJ0ZWRdIGNvZGVjcyB0byBiZSBhYmxlIHRvIGZ1c2UKICAvLy8gdGhlbSBjb3JyZWN0bHkuIFRoYXQgaXMsIHRoZSBvdXRwdXQgdHlwZSBvZiBgdGhpc2AgKFtUXSkgbXVzdCBtYXRjaCB0aGUKICAvLy8gaW5wdXQgdHlwZSBvZiB0aGUgc2Vjb25kIGNvZGVjIFtvdGhlcl0uCiAgLy8vCiAgLy8vIEV4YW1wbGVzOgogIC8vLyBgYGBkYXJ0CiAgLy8vIGZpbmFsIGpzb25Ub0J5dGVzID0ganNvbi5mdXNlKHV0ZjgpOwogIC8vLyBMaXN0PGludD4gYnl0ZXMgPSBqc29uVG9CeXRlcy5lbmNvZGUoWyJqc29uLW9iamVjdCJdKTsKICAvLy8gdmFyIGRlY29kZWQgPSBqc29uVG9CeXRlcy5kZWNvZGUoYnl0ZXMpOwogIC8vLyBhc3NlcnQoZGVjb2RlZCBpcyBMaXN0ICYmIGRlY29kZWRbMF0gPT0gImpzb24tb2JqZWN0Iik7CiAgLy8vCiAgLy8vIHZhciBpbnZlcnRlZCA9IGpzb24uaW52ZXJ0ZWQ7CiAgLy8vIHZhciBqc29uSWRlbnRpdHkgPSBqc29uLmZ1c2UoaW52ZXJ0ZWQpOwogIC8vLyB2YXIganNvbk9iamVjdCA9IGpzb25JZGVudGl0eS5lbmNvZGUoWyIxIiwgMl0pOwogIC8vLyBhc3NlcnQoanNvbk9iamVjdCBpcyBMaXN0ICYmIGpzb25PYmplY3RbMF0gPT0gIjEiICYmIGpzb25PYmplY3RbMV0gPT0gMik7CiAgLy8vIGBgYAogIC8vIFRPRE8oZmxvaXRzY2gpOiB1c2UgYmV0dGVyIGV4YW1wbGUgd2l0aCBsaW5lLXNwbGl0dGVyIG9uY2UgdGhhdCBvbmUgaXMKICAvLyBpbiB0aGlzIGxpYnJhcnkuCiAgQ29kZWM8UywgUj4gZnVzZTxSPihDb2RlYzxULCBSPiBvdGhlcikgewogICAgcmV0dXJuIF9GdXNlZENvZGVjPFMsIFQsIFI+KHRoaXMsIG90aGVyKTsKICB9CgogIC8vLyBJbnZlcnRzIGB0aGlzYC4KICAvLy8KICAvLy8gVGhlIFtlbmNvZGVyXSBhbmQgW2RlY29kZXJdIG9mIHRoZSByZXN1bHRpbmcgY29kZWMgYXJlIHN3YXBwZWQuCiAgQ29kZWM8VCwgUz4gZ2V0IGludmVydGVkID0+IF9JbnZlcnRlZENvZGVjPFQsIFM+KHRoaXMpOwp9CgovLy8gRnVzZXMgdGhlIGdpdmVuIGNvZGVjcy4KLy8vCi8vLyBJbiB0aGUgbm9uLWNodW5rZWQgY29udmVyc2lvbiBzaW1wbHkgaW52b2tlcyB0aGUgbm9uLWNodW5rZWQgY29udmVyc2lvbnMgaW4KLy8vIHNlcXVlbmNlLgpjbGFzcyBfRnVzZWRDb2RlYzxTLCBNLCBUPiBleHRlbmRzIENvZGVjPFMsIFQ+IHsKICBmaW5hbCBDb2RlYzxTLCBNPiBfZmlyc3Q7CiAgZmluYWwgQ29kZWM8TSwgVD4gX3NlY29uZDsKCiAgQ29udmVydGVyPFMsIFQ+IGdldCBlbmNvZGVyID0+IF9maXJzdC5lbmNvZGVyLmZ1c2U8VD4oX3NlY29uZC5lbmNvZGVyKTsKICBDb252ZXJ0ZXI8VCwgUz4gZ2V0IGRlY29kZXIgPT4gX3NlY29uZC5kZWNvZGVyLmZ1c2U8Uz4oX2ZpcnN0LmRlY29kZXIpOwoKICBfRnVzZWRDb2RlYyh0aGlzLl9maXJzdCwgdGhpcy5fc2Vjb25kKTsKfQoKY2xhc3MgX0ludmVydGVkQ29kZWM8VCwgUz4gZXh0ZW5kcyBDb2RlYzxULCBTPiB7CiAgZmluYWwgQ29kZWM8UywgVD4gX2NvZGVjOwoKICBfSW52ZXJ0ZWRDb2RlYyhDb2RlYzxTLCBUPiBjb2RlYykgOiBfY29kZWMgPSBjb2RlYzsKCiAgQ29udmVydGVyPFQsIFM+IGdldCBlbmNvZGVyID0+IF9jb2RlYy5kZWNvZGVyOwogIENvbnZlcnRlcjxTLCBUPiBnZXQgZGVjb2RlciA9PiBfY29kZWMuZW5jb2RlcjsKCiAgQ29kZWM8UywgVD4gZ2V0IGludmVydGVkID0+IF9jb2RlYzsKfQpjAE5OPAEWATcER04kBFA4HREBFwY3LwEeBjczASsGMx8BQQYzHwEhBkQdBk4TBk5OLgYQDis9Lz4GJC42UApMFisuBAEWBkY6AgEcBFAOMRwdAUpKASoCATEcATYBMTEBJgIBF2RhcnQ6Y29udmVydC9jb2RlYy5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2NvbnZlcnRlci5kYXJ0ipUvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gQSBbQ29udmVydGVyXSBjb252ZXJ0cyBkYXRhIGZyb20gb25lIHJlcHJlc2VudGF0aW9uIGludG8gYW5vdGhlci4KLy8vCi8vLyBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZiBgQ29udmVydGVyYCBleHRlbmQgdGhpcyBjbGFzcywKLy8vIHRvIGluaGVyaXQgYW55IGZ1cnRoZXIgbWV0aG9kcyB0aGF0IG1heSBiZSBhZGRlZCB0byB0aGUgY2xhc3MuCmFic3RyYWN0IGNsYXNzIENvbnZlcnRlcjxTLCBUPiBleHRlbmRzIFN0cmVhbVRyYW5zZm9ybWVyQmFzZTxTLCBUPiB7CiAgY29uc3QgQ29udmVydGVyKCk7CgogIC8vLyBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYSBgQ29udmVydGVyPFRTLCBUVD5gLgogIC8vLwogIC8vLyBUaGlzIGFsbG93cyBbc291cmNlXSB0byBiZSB1c2VkIGF0IHRoZSBuZXcgdHlwZSwgYnV0IGF0IHJ1bi10aW1lIGl0CiAgLy8vIG11c3Qgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIGJvdGggdGhlIG5ldyB0eXBlIGFuZCBpdHMgb3JpZ2luYWwgdHlwZS4KICAvLy8KICAvLy8gQ29udmVyc2lvbiBpbnB1dCBtdXN0IGJlIGJvdGggW1NTXSBhbmQgW1RTXSBhbmQgdGhlIG91dHB1dCBjcmVhdGVkIGJ5CiAgLy8vIFtzb3VyY2VdIGZvciB0aG9zZSBpbnB1dCBtdXN0IGJlIGJvdGggW1NUXSBhbmQgW1RUXS4KICBzdGF0aWMgQ29udmVydGVyPFRTLCBUVD4gY2FzdEZyb208U1MsIFNULCBUUywgVFQ+KENvbnZlcnRlcjxTUywgU1Q+IHNvdXJjZSkgPT4KICAgICAgQ2FzdENvbnZlcnRlcjxTUywgU1QsIFRTLCBUVD4oc291cmNlKTsKCiAgLy8vIENvbnZlcnRzIFtpbnB1dF0gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbi4KICBUIGNvbnZlcnQoUyBpbnB1dCk7CgogIC8vLyBGdXNlcyBgdGhpc2Agd2l0aCBbb3RoZXJdLgogIC8vLwogIC8vLyBFbmNvZGluZyB3aXRoIHRoZSByZXN1bHRpbmcgY29udmVydGVyIGlzIGVxdWl2YWxlbnQgdG8gY29udmVydGluZyB3aXRoCiAgLy8vIGB0aGlzYCBiZWZvcmUgY29udmVydGluZyB3aXRoIGBvdGhlcmAuCiAgQ29udmVydGVyPFMsIFRUPiBmdXNlPFRUPihDb252ZXJ0ZXI8VCwgVFQ+IG90aGVyKSB7CiAgICByZXR1cm4gX0Z1c2VkQ29udmVydGVyPFMsIFQsIFRUPih0aGlzLCBvdGhlcik7CiAgfQoKICAvLy8gU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBUaGUgcmV0dXJuZWQgc2luayBzZXJ2ZXMgYXMgaW5wdXQgZm9yIHRoZSBsb25nLXJ1bm5pbmcgY29udmVyc2lvbi4gVGhlCiAgLy8vIGdpdmVuIFtzaW5rXSBzZXJ2ZXMgYXMgb3V0cHV0LgogIFNpbms8Uz4gc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFQ+IHNpbmspIHsKICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIlRoaXMgY29udmVydGVyIGRvZXMgbm90IHN1cHBvcnQgY2h1bmtlZCBjb252ZXJzaW9uczogJHRoaXMiKTsKICB9CgogIFN0cmVhbTxUPiBiaW5kKFN0cmVhbTxTPiBzdHJlYW0pIHsKICAgIHJldHVybiBTdHJlYW08VD4uZXZlbnRUcmFuc2Zvcm1lZCgKICAgICAgICBzdHJlYW0sIChFdmVudFNpbmsgc2luaykgPT4gX0NvbnZlcnRlclN0cmVhbUV2ZW50U2luayh0aGlzLCBzaW5rKSk7CiAgfQoKICAvLy8gUHJvdmlkZXMgYSBgQ29udmVydGVyPFJTLCBSVD5gIHZpZXcgb2YgdGhpcyBzdHJlYW0gdHJhbnNmb3JtZXIuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZXIgd2lsbCBjaGVjayBhdCBydW4tdGltZSB0aGF0IGFsbCBjb252ZXJzaW9uCiAgLy8vIGlucHV0cyBhcmUgYWN0dWFsbHkgaW5zdGFuY2VzIG9mIFtTXSwKICAvLy8gYW5kIGl0IHdpbGwgY2hlY2sgdGhhdCBhbGwgY29udmVyc2lvbiBvdXRwdXQgcHJvZHVjZWQgYnkgdGhpcyBjb252ZXJ0ZXIKICAvLy8gYXJlIGFjdHVhbGx5IGluc3RhbmNlcyBvZiBbUlRdLgogIENvbnZlcnRlcjxSUywgUlQ+IGNhc3Q8UlMsIFJUPigpID0+IENvbnZlcnRlci5jYXN0RnJvbTxTLCBULCBSUywgUlQ+KHRoaXMpOwp9CgovLy8gRnVzZXMgdHdvIGNvbnZlcnRlcnMuCi8vLwovLy8gRm9yIGEgbm9uLWNodW5rZWQgY29udmVyc2lvbiBjb252ZXJ0cyB0aGUgaW5wdXQgaW4gc2VxdWVuY2UuCmNsYXNzIF9GdXNlZENvbnZlcnRlcjxTLCBNLCBUPiBleHRlbmRzIENvbnZlcnRlcjxTLCBUPiB7CiAgZmluYWwgQ29udmVydGVyPFMsIE0+IF9maXJzdDsKICBmaW5hbCBDb252ZXJ0ZXI8TSwgVD4gX3NlY29uZDsKCiAgX0Z1c2VkQ29udmVydGVyKHRoaXMuX2ZpcnN0LCB0aGlzLl9zZWNvbmQpOwoKICBUIGNvbnZlcnQoUyBpbnB1dCkgPT4gX3NlY29uZC5jb252ZXJ0KF9maXJzdC5jb252ZXJ0KGlucHV0KSk7CgogIFNpbms8Uz4gc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFQ+IHNpbmspIHsKICAgIHJldHVybiBfZmlyc3Quc3RhcnRDaHVua2VkQ29udmVyc2lvbihfc2Vjb25kLnN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oc2luaykpOwogIH0KfQpKAE5OPAEWAUYETUNFFQEzBkpQBkw7US0BQRYBIQZNLTYzBAEjBk0lMRxHBAElJ0wEAUYGSyxOJk4CARoEQTkgIQEuAUABMVAEAgEbZGFydDpjb252ZXJ0L2NvbnZlcnRlci5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb252ZXJ0L2VuY29kaW5nLmRhcnSKBi8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBPcGVuLWVuZGVkIEVuY29kaW5nIGVudW0uCmFic3RyYWN0IGNsYXNzIEVuY29kaW5nIGV4dGVuZHMgQ29kZWM8U3RyaW5nLCBMaXN0PGludD4+IHsKICBjb25zdCBFbmNvZGluZygpOwoKICAvLy8gUmV0dXJucyB0aGUgZW5jb2RlciBmcm9tIGBTdHJpbmdgIHRvIGBMaXN0PGludD5gLgogIC8vLwogIC8vLyBJdCBtYXkgYmUgc3RhdGVmdWwgYW5kIHNob3VsZCBub3QgYmUgcmV1c2VkLgogIENvbnZlcnRlcjxTdHJpbmcsIExpc3Q8aW50Pj4gZ2V0IGVuY29kZXI7CgogIC8vLyBSZXR1cm5zIHRoZSBkZWNvZGVyIG9mIGB0aGlzYCwgY29udmVydGluZyBmcm9tIGBMaXN0PGludD5gIHRvIGBTdHJpbmdgLgogIC8vLwogIC8vLyBJdCBtYXkgYmUgc3RhdGVmdWwgYW5kIHNob3VsZCBub3QgYmUgcmV1c2VkLgogIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gZ2V0IGRlY29kZXI7CgogIEZ1dHVyZTxTdHJpbmc+IGRlY29kZVN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBieXRlU3RyZWFtKSB7CiAgICByZXR1cm4gYnl0ZVN0cmVhbQogICAgICAgIC50cmFuc2Zvcm08U3RyaW5nPihkZWNvZGVyKQogICAgICAgIC5mb2xkKFN0cmluZ0J1ZmZlcigpLAogICAgICAgICAgICAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0cmluZykgPT4gYnVmZmVyLi53cml0ZShzdHJpbmcpKQogICAgICAgIC50aGVuKChTdHJpbmdCdWZmZXIgYnVmZmVyKSA9PiBidWZmZXIudG9TdHJpbmcoKSk7CiAgfQoKICAvLy8gTmFtZSBvZiB0aGUgZW5jb2RpbmcuCiAgLy8vCiAgLy8vIElmIHRoZSBlbmNvZGluZyBpcyBzdGFuZGFyZGl6ZWQsIHRoaXMgaXMgdGhlIGxvd2VyLWNhc2UgdmVyc2lvbiBvZiBvbmUgb2YKICAvLy8gdGhlIElBTkEgb2ZmaWNpYWwgbmFtZXMgZm9yIHRoZSBjaGFyYWN0ZXIgc2V0IChzZWUKICAvLy8gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cy9jaGFyYWN0ZXItc2V0cy54bWwpCiAgU3RyaW5nIGdldCBuYW1lOwoKICAvLyBBbGwgYWxpYXNlcyAoaW4gbG93ZXJjYXNlKSBvZiBzdXBwb3J0ZWQgZW5jb2RpbmcgZnJvbQogIC8vIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMvY2hhcmFjdGVyLXNldHMueG1sLgogIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBFbmNvZGluZz4gX25hbWVUb0VuY29kaW5nID0gPFN0cmluZywgRW5jb2Rpbmc+ewogICAgLy8gSVNPXzg4NTktMToxOTg3LgogICAgImlzb184ODU5LTE6MTk4NyI6IGxhdGluMSwKICAgICJpc28taXItMTAwIjogbGF0aW4xLAogICAgImlzb184ODU5LTEiOiBsYXRpbjEsCiAgICAiaXNvLTg4NTktMSI6IGxhdGluMSwKICAgICJsYXRpbjEiOiBsYXRpbjEsCiAgICAibDEiOiBsYXRpbjEsCiAgICAiaWJtODE5IjogbGF0aW4xLAogICAgImNwODE5IjogbGF0aW4xLAogICAgImNzaXNvbGF0aW4xIjogbGF0aW4xLAoKICAgIC8vIFVTLUFTQ0lJLgogICAgImlzby1pci02IjogYXNjaWksCiAgICAiYW5zaV94My40LTE5NjgiOiBhc2NpaSwKICAgICJhbnNpX3gzLjQtMTk4NiI6IGFzY2lpLAogICAgImlzb182NDYuaXJ2OjE5OTEiOiBhc2NpaSwKICAgICJpc282NDYtdXMiOiBhc2NpaSwKICAgICJ1cy1hc2NpaSI6IGFzY2lpLAogICAgInVzIjogYXNjaWksCiAgICAiaWJtMzY3IjogYXNjaWksCiAgICAiY3AzNjciOiBhc2NpaSwKICAgICJjc2FzY2lpIjogYXNjaWksCiAgICAiYXNjaWkiOiBhc2NpaSwgLy8gVGhpcyBpcyBub3QgaW4gdGhlIElBTkEgb2ZmaWNpYWwgbmFtZXMuCgogICAgLy8gVVRGLTguCiAgICAiY3N1dGY4IjogdXRmOCwKICAgICJ1dGYtOCI6IHV0ZjgKICB9OwoKICAvLy8gR2V0cyBhbiBbRW5jb2RpbmddIG9iamVjdCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0CiAgLy8vIG5hbWUuIFRoZSBuYW1lcyB1c2VkIGFyZSB0aGUgSUFOQSBvZmZpY2lhbCBuYW1lcyBmb3IgdGhlCiAgLy8vIGNoYXJhY3RlciBzZXQgKHNlZQogIC8vLyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzL2NoYXJhY3Rlci1zZXRzLnhtbCkuCiAgLy8vCiAgLy8vIFRoZSBbbmFtZV0gcGFzc2VkIGlzIGNhc2UgaW5zZW5zaXRpdmUuCiAgLy8vCiAgLy8vIElmIGNoYXJhY3RlciBzZXQgaXMgbm90IHN1cHBvcnRlZCBbOm51bGw6XSBpcyByZXR1cm5lZC4KICBzdGF0aWMgRW5jb2RpbmcgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gX25hbWVUb0VuY29kaW5nW25hbWVdOwogIH0KfQpTAE5OPAEWAR47FAE4BjMsAU4GMywBPhYkHks7BAEcBlA5SRMBO0hLGB8aGhoWEhYVGwERFx0dHxgXERUUFj8BDhQSBQFDPxlKBi0GPisjHyIEAgEaZGFydDpjb252ZXJ0L2VuY29kaW5nLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvbnZlcnQvanNvbi5kYXJ0wACKjC8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29udmVydDsKCi8vLyBFcnJvciB0aHJvd24gYnkgSlNPTiBzZXJpYWxpemF0aW9uIGlmIGFuIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZC4KLy8vCi8vLyBUaGUgW3Vuc3VwcG9ydGVkT2JqZWN0XSBmaWVsZCBob2xkcyB0aGF0IG9iamVjdCB0aGF0IGZhaWxlZCB0byBiZSBzZXJpYWxpemVkLgovLy8KLy8vIElmIGFuIG9iamVjdCBpc24ndCBkaXJlY3RseSBzZXJpYWxpemFibGUsIHRoZSBzZXJpYWxpemVyIGNhbGxzIHRoZSBgdG9Kc29uYAovLy8gbWV0aG9kIG9uIHRoZSBvYmplY3QuIElmIHRoYXQgY2FsbCBmYWlscywgdGhlIGVycm9yIHdpbGwgYmUgc3RvcmVkIGluIHRoZQovLy8gW2NhdXNlXSBmaWVsZC4gSWYgdGhlIGNhbGwgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBpc24ndCBkaXJlY3RseQovLy8gc2VyaWFsaXphYmxlLCB0aGUgW2NhdXNlXSBpcyBudWxsLgpjbGFzcyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvciBleHRlbmRzIEVycm9yIHsKICAvLy8gVGhlIG9iamVjdCB0aGF0IGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLgogIGZpbmFsIE9iamVjdCB1bnN1cHBvcnRlZE9iamVjdDsKCiAgLy8vIFRoZSBleGNlcHRpb24gdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGNvbnZlcnQgdGhlIG9iamVjdC4KICBmaW5hbCBPYmplY3QgY2F1c2U7CgogIC8vLyBUaGUgcGFydGlhbCByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24sIHVwIHVudGlsIHRoZSBlcnJvciBoYXBwZW5lZC4KICAvLy8KICAvLy8gTWF5IGJlIG51bGwuCiAgZmluYWwgU3RyaW5nIHBhcnRpYWxSZXN1bHQ7CgogIEpzb25VbnN1cHBvcnRlZE9iamVjdEVycm9yKHRoaXMudW5zdXBwb3J0ZWRPYmplY3QsCiAgICAgIHt0aGlzLmNhdXNlLCB0aGlzLnBhcnRpYWxSZXN1bHR9KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgdmFyIHNhZmVTdHJpbmcgPSBFcnJvci5zYWZlVG9TdHJpbmcodW5zdXBwb3J0ZWRPYmplY3QpOwogICAgU3RyaW5nIHByZWZpeDsKICAgIGlmIChjYXVzZSAhPSBudWxsKSB7CiAgICAgIHByZWZpeCA9ICJDb252ZXJ0aW5nIG9iamVjdCB0byBhbiBlbmNvZGFibGUgb2JqZWN0IGZhaWxlZDoiOwogICAgfSBlbHNlIHsKICAgICAgcHJlZml4ID0gIkNvbnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IjsKICAgIH0KICAgIHJldHVybiAiJHByZWZpeCAkc2FmZVN0cmluZyI7CiAgfQp9CgovLy8gUmVwb3J0cyB0aGF0IGFuIG9iamVjdCBjb3VsZCBub3QgYmUgc3RyaW5naWZpZWQgZHVlIHRvIGN5Y2xpYyByZWZlcmVuY2VzLgovLy8KLy8vIEFuIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgaXRzZWxmIGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5Ci8vLyBbSnNvbkNvZGVjLmVuY29kZV0vW0pzb25FbmNvZGVyLmNvbnZlcnRdLgovLy8gV2hlbiB0aGUgY3ljbGUgaXMgZGV0ZWN0ZWQsIGEgW0pzb25DeWNsaWNFcnJvcl0gaXMgdGhyb3duLgpjbGFzcyBKc29uQ3ljbGljRXJyb3IgZXh0ZW5kcyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvciB7CiAgLy8vIFRoZSBmaXJzdCBvYmplY3QgdGhhdCB3YXMgZGV0ZWN0ZWQgYXMgcGFydCBvZiBhIGN5Y2xlLgogIEpzb25DeWNsaWNFcnJvcihPYmplY3Qgb2JqZWN0KSA6IHN1cGVyKG9iamVjdCk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lmeSI7Cn0KCi8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0pzb25Db2RlY10uCi8vLwovLy8gVGhpcyBpbnN0YW5jZSBwcm92aWRlcyBhIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBtb3N0IGNvbW1vbiBKU09OCi8vLyB1c2UgY2FzZXMuCi8vLwovLy8gRXhhbXBsZXM6Ci8vLwovLy8gICAgIHZhciBlbmNvZGVkID0ganNvbi5lbmNvZGUoWzEsIDIsIHsgImEiOiBudWxsIH1dKTsKLy8vICAgICB2YXIgZGVjb2RlZCA9IGpzb24uZGVjb2RlKCdbImZvbyIsIHsgImJhciI6IDQ5OSB9XScpOwovLy8KLy8vIFRoZSB0b3AtbGV2ZWwgW2pzb25FbmNvZGVdIGFuZCBbanNvbkRlY29kZV0gZnVuY3Rpb25zIG1heSBiZSB1c2VkIGluc3RlYWQgaWYKLy8vIGEgbG9jYWwgdmFyaWFibGUgc2hhZG93cyB0aGUgW2pzb25dIGNvbnN0YW50Lgpjb25zdCBKc29uQ29kZWMganNvbiA9IEpzb25Db2RlYygpOwoKLy8vIENvbnZlcnRzIFt2YWx1ZV0gdG8gYSBKU09OIHN0cmluZy4KLy8vCi8vLyBJZiB2YWx1ZSBjb250YWlucyBvYmplY3RzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSBlbmNvZGFibGUgdG8gYSBKU09OCi8vLyBzdHJpbmcgKGEgdmFsdWUgdGhhdCBpcyBub3QgYSBudW1iZXIsIGJvb2xlYW4sIHN0cmluZywgbnVsbCwgbGlzdCBvciBhIG1hcAovLy8gd2l0aCBzdHJpbmcga2V5cyksIHRoZSBbdG9FbmNvZGFibGVdIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydCBpdCB0byBhbgovLy8gb2JqZWN0IHRoYXQgbXVzdCBiZSBkaXJlY3RseSBlbmNvZGFibGUuCi8vLwovLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKLy8vIHJlc3VsdCBvZiBjYWxsaW5nIGAudG9Kc29uKClgIG9uIHRoZSB1bmVuY29kYWJsZSBvYmplY3QuCi8vLwovLy8gU2hvcnRoYW5kIGZvciBbanNvbi5lbmNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZSBnbG9iYWwKLy8vIFtqc29uXSBjb25zdGFudC4KU3RyaW5nIGpzb25FbmNvZGUoT2JqZWN0IG9iamVjdCwge09iamVjdCB0b0VuY29kYWJsZShPYmplY3Qgbm9uRW5jb2RhYmxlKX0pID0+CiAgICBqc29uLmVuY29kZShvYmplY3QsIHRvRW5jb2RhYmxlOiB0b0VuY29kYWJsZSk7CgovLy8gUGFyc2VzIHRoZSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBKc29uIG9iamVjdC4KLy8vCi8vLyBUaGUgb3B0aW9uYWwgW3Jldml2ZXJdIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIG9iamVjdCBvciBsaXN0Ci8vLyBwcm9wZXJ0eSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBkdXJpbmcgZGVjb2RpbmcuIFRoZSBga2V5YCBhcmd1bWVudCBpcyBlaXRoZXIKLy8vIHRoZSBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwgdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QKLy8vIHByb3BlcnRpZXMsIG9yIGBudWxsYCBmb3IgdGhlIGZpbmFsIHJlc3VsdC4KLy8vCi8vLyBUaGUgZGVmYXVsdCBbcmV2aXZlcl0gKHdoZW4gbm90IHByb3ZpZGVkKSBpcyB0aGUgaWRlbnRpdHkgZnVuY3Rpb24uCi8vLwovLy8gU2hvcnRoYW5kIGZvciBbanNvbi5kZWNvZGVdLiBVc2VmdWwgaWYgYSBsb2NhbCB2YXJpYWJsZSBzaGFkb3dzIHRoZSBnbG9iYWwKLy8vIFtqc29uXSBjb25zdGFudC4KZHluYW1pYyBqc29uRGVjb2RlKFN0cmluZyBzb3VyY2UsIHtPYmplY3QgcmV2aXZlcihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpfSkgPT4KICAgIGpzb24uZGVjb2RlKHNvdXJjZSwgcmV2aXZlcjogcmV2aXZlcik7CgovLy8gQSBbSnNvbkNvZGVjXSBlbmNvZGVzIEpTT04gb2JqZWN0cyB0byBzdHJpbmdzIGFuZCBkZWNvZGVzIHN0cmluZ3MgdG8KLy8vIEpTT04gb2JqZWN0cy4KLy8vCi8vLyBFeGFtcGxlczoKLy8vCi8vLyAgICAgdmFyIGVuY29kZWQgPSBqc29uLmVuY29kZShbMSwgMiwgeyAiYSI6IG51bGwgfV0pOwovLy8gICAgIHZhciBkZWNvZGVkID0ganNvbi5kZWNvZGUoJ1siZm9vIiwgeyAiYmFyIjogNDk5IH1dJyk7CmNsYXNzIEpzb25Db2RlYyBleHRlbmRzIENvZGVjPE9iamVjdCwgU3RyaW5nPiB7CiAgZmluYWwgRnVuY3Rpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSBfcmV2aXZlcjsKICBmaW5hbCBGdW5jdGlvbihkeW5hbWljKSBfdG9FbmNvZGFibGU7CgogIC8vLyBDcmVhdGVzIGEgYEpzb25Db2RlY2Agd2l0aCB0aGUgZ2l2ZW4gcmV2aXZlciBhbmQgZW5jb2RpbmcgZnVuY3Rpb24uCiAgLy8vCiAgLy8vIFRoZSBbcmV2aXZlcl0gZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBkZWNvZGluZy4gSXQgaXMgaW52b2tlZCBvbmNlIGZvcgogIC8vLyBlYWNoIG9iamVjdCBvciBsaXN0IHByb3BlcnR5IHRoYXQgaGFzIGJlZW4gcGFyc2VkLgogIC8vLyBUaGUgYGtleWAgYXJndW1lbnQgaXMgZWl0aGVyIHRoZSBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwKICAvLy8gdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QgcHJvcGVydGllcywgb3IgYG51bGxgIGZvciB0aGUgZmluYWwgcmVzdWx0LgogIC8vLwogIC8vLyBJZiBbcmV2aXZlcl0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcmd1bWVudC4KICAvLy8KICAvLy8gVGhlIFt0b0VuY29kYWJsZV0gZnVuY3Rpb24gaXMgdXNlZCBkdXJpbmcgZW5jb2RpbmcuIEl0IGlzIGludm9rZWQgZm9yCiAgLy8vIHZhbHVlcyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgZW5jb2RhYmxlIHRvIGEgc3RyaW5nIChhIHZhbHVlIHRoYXQgaXMgbm90IGEKICAvLy8gbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIG51bGwsIGxpc3Qgb3IgYSBtYXAgd2l0aCBzdHJpbmcga2V5cykuIFRoZQogIC8vLyBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiBvYmplY3QgdGhhdCBpcyBkaXJlY3RseSBlbmNvZGFibGUuIFRoZSBlbGVtZW50cyBvZgogIC8vLyBhIHJldHVybmVkIGxpc3QgYW5kIHZhbHVlcyBvZiBhIHJldHVybmVkIG1hcCBkbyBub3QgbmVlZCB0byBiZSBkaXJlY3RseQogIC8vLyBlbmNvZGFibGUsIGFuZCBpZiB0aGV5IGFyZW4ndCwgYHRvRW5jb2RhYmxlYCB3aWxsIGJlIHVzZWQgb24gdGhlbSBhcyB3ZWxsLgogIC8vLyBQbGVhc2Ugbm90aWNlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gY2F1c2UgYW4gaW5maW5pdGUgcmVjdXJzaXZlIHJlZ3Jlc3MKICAvLy8gaW4gdGhpcyB3YXksIGJ5IGVmZmVjdGl2ZWx5IGNyZWF0aW5nIGFuIGluZmluaXRlIGRhdGEgc3RydWN0dXJlIHRocm91Z2gKICAvLy8gcmVwZWF0ZWQgY2FsbCB0byBgdG9FbmNvZGFibGVgLgogIC8vLwogIC8vLyBJZiBbdG9FbmNvZGFibGVdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZQogIC8vLyByZXN1bHQgb2YgY2FsbGluZyBgLnRvSnNvbigpYCBvbiB0aGUgdW5lbmNvZGFibGUgb2JqZWN0LgogIGNvbnN0IEpzb25Db2RlYyh7cmV2aXZlcihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpLCB0b0VuY29kYWJsZSh2YXIgb2JqZWN0KX0pCiAgICAgIDogX3Jldml2ZXIgPSByZXZpdmVyLAogICAgICAgIF90b0VuY29kYWJsZSA9IHRvRW5jb2RhYmxlOwoKICAvLy8gQ3JlYXRlcyBhIGBKc29uQ29kZWNgIHdpdGggdGhlIGdpdmVuIHJldml2ZXIuCiAgLy8vCiAgLy8vIFRoZSBbcmV2aXZlcl0gZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggb2JqZWN0IG9yIGxpc3QgcHJvcGVydHkKICAvLy8gdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLiBUaGUgYGtleWAgYXJndW1lbnQgaXMgZWl0aGVyIHRoZQogIC8vLyBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwgdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QKICAvLy8gcHJvcGVydGllcywgb3IgYG51bGxgIGZvciB0aGUgZmluYWwgcmVzdWx0LgogIEpzb25Db2RlYy53aXRoUmV2aXZlcihyZXZpdmVyKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkpCiAgICAgIDogdGhpcyhyZXZpdmVyOiByZXZpdmVyKTsKCiAgLy8vIFBhcnNlcyB0aGUgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgSnNvbiBvYmplY3QuCiAgLy8vCiAgLy8vIFRoZSBvcHRpb25hbCBbcmV2aXZlcl0gZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggb2JqZWN0IG9yIGxpc3QKICAvLy8gcHJvcGVydHkgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZHVyaW5nIGRlY29kaW5nLiBUaGUgYGtleWAgYXJndW1lbnQgaXMgZWl0aGVyCiAgLy8vIHRoZSBpbnRlZ2VyIGxpc3QgaW5kZXggZm9yIGEgbGlzdCBwcm9wZXJ0eSwgdGhlIHN0cmluZyBtYXAga2V5IGZvciBvYmplY3QKICAvLy8gcHJvcGVydGllcywgb3IgYG51bGxgIGZvciB0aGUgZmluYWwgcmVzdWx0LgogIC8vLwogIC8vLyBUaGUgZGVmYXVsdCBbcmV2aXZlcl0gKHdoZW4gbm90IHByb3ZpZGVkKSBpcyB0aGUgaWRlbnRpdHkgZnVuY3Rpb24uCiAgZHluYW1pYyBkZWNvZGUoU3RyaW5nIHNvdXJjZSwge3Jldml2ZXIoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKX0pIHsKICAgIHJldml2ZXIgPz89IF9yZXZpdmVyOwogICAgaWYgKHJldml2ZXIgPT0gbnVsbCkgcmV0dXJuIGRlY29kZXIuY29udmVydChzb3VyY2UpOwogICAgcmV0dXJuIEpzb25EZWNvZGVyKHJldml2ZXIpLmNvbnZlcnQoc291cmNlKTsKICB9CgogIC8vLyBDb252ZXJ0cyBbdmFsdWVdIHRvIGEgSlNPTiBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIHZhbHVlIGNvbnRhaW5zIG9iamVjdHMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IGVuY29kYWJsZSB0byBhIEpTT04KICAvLy8gc3RyaW5nIChhIHZhbHVlIHRoYXQgaXMgbm90IGEgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIG51bGwsIGxpc3Qgb3IgYSBtYXAKICAvLy8gd2l0aCBzdHJpbmcga2V5cyksIHRoZSBbdG9FbmNvZGFibGVdIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydCBpdCB0byBhbgogIC8vLyBvYmplY3QgdGhhdCBtdXN0IGJlIGRpcmVjdGx5IGVuY29kYWJsZS4KICAvLy8KICAvLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAvLy8gcmVzdWx0IG9mIGNhbGxpbmcgYC50b0pzb24oKWAgb24gdGhlIHVuZW5jb2RhYmxlIG9iamVjdC4KICBTdHJpbmcgZW5jb2RlKE9iamVjdCB2YWx1ZSwge3RvRW5jb2RhYmxlKG9iamVjdCl9KSB7CiAgICB0b0VuY29kYWJsZSA/Pz0gX3RvRW5jb2RhYmxlOwogICAgaWYgKHRvRW5jb2RhYmxlID09IG51bGwpIHJldHVybiBlbmNvZGVyLmNvbnZlcnQodmFsdWUpOwogICAgcmV0dXJuIEpzb25FbmNvZGVyKHRvRW5jb2RhYmxlKS5jb252ZXJ0KHZhbHVlKTsKICB9CgogIEpzb25FbmNvZGVyIGdldCBlbmNvZGVyIHsKICAgIGlmIChfdG9FbmNvZGFibGUgPT0gbnVsbCkgcmV0dXJuIGNvbnN0IEpzb25FbmNvZGVyKCk7CiAgICByZXR1cm4gSnNvbkVuY29kZXIoX3RvRW5jb2RhYmxlKTsKICB9CgogIEpzb25EZWNvZGVyIGdldCBkZWNvZGVyIHsKICAgIGlmIChfcmV2aXZlciA9PSBudWxsKSByZXR1cm4gY29uc3QgSnNvbkRlY29kZXIoKTsKICAgIHJldHVybiBKc29uRGVjb2RlcihfcmV2aXZlcik7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBKU09OIG9iamVjdHMgdG8gc3RyaW5ncy4KY2xhc3MgSnNvbkVuY29kZXIgZXh0ZW5kcyBDb252ZXJ0ZXI8T2JqZWN0LCBTdHJpbmc+IHsKICAvLy8gVGhlIHN0cmluZyB1c2VkIGZvciBpbmRlbnRpb24uCiAgLy8vCiAgLy8vIFdoZW4gZ2VuZXJhdGluZyBtdWx0aS1saW5lIG91dHB1dCwgdGhpcyBzdHJpbmcgaXMgaW5zZXJ0ZWQgb25jZSBhdCB0aGUKICAvLy8gYmVnaW5uaW5nIG9mIGVhY2ggaW5kZW50ZWQgbGluZSBmb3IgZWFjaCBsZXZlbCBvZiBpbmRlbnRhdGlvbi4KICAvLy8KICAvLy8gSWYgYG51bGxgLCB0aGUgb3V0cHV0IGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgbGluZS4KICBmaW5hbCBTdHJpbmcgaW5kZW50OwoKICAvLy8gRnVuY3Rpb24gY2FsbGVkIG9uIG5vbi1lbmNvZGFibGUgb2JqZWN0cyB0byByZXR1cm4gYSByZXBsYWNlbWVudAogIC8vLyBlbmNvZGFibGUgb2JqZWN0IHRoYXQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSBvcmlnbmFsJ3MgcGxhY2UuCiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwoKICAvLy8gQ3JlYXRlcyBhIEpTT04gZW5jb2Rlci4KICAvLy8KICAvLy8gVGhlIEpTT04gZW5jb2RlciBoYW5kbGVzIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zLCBudWxsLCBsaXN0cyBhbmQKICAvLy8gbWFwcyB3aXRoIHN0cmluZyBrZXlzIGRpcmVjdGx5LgogIC8vLwogIC8vLyBBbnkgb3RoZXIgb2JqZWN0IGlzIGF0dGVtcHRlZCBjb252ZXJ0ZWQgYnkgW3RvRW5jb2RhYmxlXSB0byBhbgogIC8vLyBvYmplY3QgdGhhdCBpcyBvZiBvbmUgb2YgdGhlIGNvbnZlcnRpYmxlIHR5cGVzLgogIC8vLwogIC8vLyBJZiBbdG9FbmNvZGFibGVdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGNhbGxpbmcgYC50b0pzb24oKWAgb24KICAvLy8gdGhlIG9iamVjdC4KICBjb25zdCBKc29uRW5jb2RlcihbdG9FbmNvZGFibGUob2JqZWN0KV0pCiAgICAgIDogaW5kZW50ID0gbnVsbCwKICAgICAgICBfdG9FbmNvZGFibGUgPSB0b0VuY29kYWJsZTsKCiAgLy8vIENyZWF0ZXMgYSBKU09OIGVuY29kZXIgdGhhdCBjcmVhdGVzIG11bHRpLWxpbmUgSlNPTi4KICAvLy8KICAvLy8gVGhlIGVuY29kaW5nIG9mIGVsZW1lbnRzIG9mIGxpc3RzIGFuZCBtYXBzIGFyZSBpbmRlbnRlZCBhbmQgcHV0IG9uIHNlcGFyYXRlCiAgLy8vIGxpbmVzLiBUaGUgW2luZGVudF0gc3RyaW5nIGlzIHByZXBlbmRlZCB0byB0aGVzZSBlbGVtZW50cywgb25jZSBmb3IgZWFjaAogIC8vLyBsZXZlbCBvZiBpbmRlbnRhdGlvbi4KICAvLy8KICAvLy8gSWYgW2luZGVudF0gaXMgYG51bGxgLCB0aGUgb3V0cHV0IGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgbGluZS4KICAvLy8KICAvLy8gVGhlIEpTT04gZW5jb2RlciBoYW5kbGVzIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zLCBudWxsLCBsaXN0cyBhbmQKICAvLy8gbWFwcyB3aXRoIHN0cmluZyBrZXlzIGRpcmVjdGx5LgogIC8vLwogIC8vLyBBbnkgb3RoZXIgb2JqZWN0IGlzIGF0dGVtcHRlZCBjb252ZXJ0ZWQgYnkgW3RvRW5jb2RhYmxlXSB0byBhbgogIC8vLyBvYmplY3QgdGhhdCBpcyBvZiBvbmUgb2YgdGhlIGNvbnZlcnRpYmxlIHR5cGVzLgogIC8vLwogIC8vLyBJZiBbdG9FbmNvZGFibGVdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGNhbGxpbmcgYC50b0pzb24oKWAgb24KICAvLy8gdGhlIG9iamVjdC4KICBjb25zdCBKc29uRW5jb2Rlci53aXRoSW5kZW50KHRoaXMuaW5kZW50LCBbdG9FbmNvZGFibGUob2JqZWN0KV0pCiAgICAgIDogX3RvRW5jb2RhYmxlID0gdG9FbmNvZGFibGU7CgogIC8vLyBDb252ZXJ0cyBbb2JqZWN0XSB0byBhIEpTT04gW1N0cmluZ10uCiAgLy8vCiAgLy8vIERpcmVjdGx5IHNlcmlhbGl6YWJsZSB2YWx1ZXMgYXJlIFtudW1dLCBbU3RyaW5nXSwgW2Jvb2xdLCBhbmQgW051bGxdLCBhcwogIC8vLyB3ZWxsIGFzIHNvbWUgW0xpc3RdIGFuZCBbTWFwXSB2YWx1ZXMuIEZvciBbTGlzdF0sIHRoZSBlbGVtZW50cyBtdXN0IGFsbCBiZQogIC8vLyBzZXJpYWxpemFibGUuIEZvciBbTWFwXSwgdGhlIGtleXMgbXVzdCBiZSBbU3RyaW5nXSBhbmQgdGhlIHZhbHVlcyBtdXN0IGJlCiAgLy8vIHNlcmlhbGl6YWJsZS4KICAvLy8KICAvLy8gSWYgYSB2YWx1ZSBvZiBhbnkgb3RoZXIgdHlwZSBpcyBhdHRlbXB0ZWQgdG8gYmUgc2VyaWFsaXplZCwgdGhlCiAgLy8vIGB0b0VuY29kYWJsZWAgZnVuY3Rpb24gcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCB3aXRoIHRoZSB2YWx1ZQogIC8vLyBhcyBhcmd1bWVudC4gVGhlIHJlc3VsdCwgd2hpY2ggbXVzdCBiZSBhIGRpcmVjdGx5IHNlcmlhbGl6YWJsZSB2YWx1ZSwgaXMKICAvLy8gc2VyaWFsaXplZCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4KICAvLy8KICAvLy8gSWYgdGhlIGNvbnZlcnNpb24gdGhyb3dzLCBvciByZXR1cm5zIGEgdmFsdWUgdGhhdCBpcyBub3QgZGlyZWN0bHkKICAvLy8gc2VyaWFsaXphYmxlLCBhIFtKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcl0gZXhjZXB0aW9uIGlzIHRocm93bi4KICAvLy8gSWYgdGhlIGNhbGwgdGhyb3dzLCB0aGUgZXJyb3IgaXMgY2F1Z2h0IGFuZCBzdG9yZWQgaW4gdGhlCiAgLy8vIFtKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcl0ncyBbOmNhdXNlOl0gZmllbGQuCiAgLy8vCiAgLy8vIElmIGEgW0xpc3RdIG9yIFtNYXBdIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZiwgZGlyZWN0bHkgb3IgdGhyb3VnaAogIC8vLyBvdGhlciBsaXN0cyBvciBtYXBzLCBpdCBjYW5ub3QgYmUgc2VyaWFsaXplZCBhbmQgYSBbSnNvbkN5Y2xpY0Vycm9yXSBpcwogIC8vLyB0aHJvd24uCiAgLy8vCiAgLy8vIFtvYmplY3RdIHNob3VsZCBub3QgY2hhbmdlIGR1cmluZyBzZXJpYWxpemF0aW9uLgogIC8vLwogIC8vLyBJZiBhbiBvYmplY3QgaXMgc2VyaWFsaXplZCBtb3JlIHRoYW4gb25jZSwgW2NvbnZlcnRdIG1heSBjYWNoZSB0aGUgdGV4dAogIC8vLyBmb3IgaXQuIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgY29udGVudCBvZiBhbiBvYmplY3QgY2hhbmdlcyBhZnRlciBpdCBpcwogIC8vLyBmaXJzdCBzZXJpYWxpemVkLCB0aGUgbmV3IHZhbHVlcyBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgcmVzdWx0LgogIFN0cmluZyBjb252ZXJ0KE9iamVjdCBvYmplY3QpID0+CiAgICAgIF9Kc29uU3RyaW5nU3RyaW5naWZpZXIuc3RyaW5naWZ5KG9iamVjdCwgX3RvRW5jb2RhYmxlLCBpbmRlbnQpOwoKICAvLy8gU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBUaGUgY29udmVydGVyIHdvcmtzIG1vcmUgZWZmaWNpZW50bHkgaWYgdGhlIGdpdmVuIFtzaW5rXSBpcyBhCiAgLy8vIFtTdHJpbmdDb252ZXJzaW9uU2lua10uCiAgLy8vCiAgLy8vIFJldHVybnMgYSBjaHVua2VkLWNvbnZlcnNpb24gc2luayB0aGF0IGFjY2VwdHMgYXQgbW9zdCBvbmUgb2JqZWN0LiBJdCBpcwogIC8vLyBhbiBlcnJvciB0byBpbnZva2UgYGFkZGAgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHJldHVybmVkIHNpbmsuCiAgQ2h1bmtlZENvbnZlcnNpb25TaW5rPE9iamVjdD4gc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPFN0cmluZz4gc2luaykgewogICAgaWYgKHNpbmsgaXMgX1V0ZjhFbmNvZGVyU2luaykgewogICAgICByZXR1cm4gX0pzb25VdGY4RW5jb2RlclNpbmsoCiAgICAgICAgICBzaW5rLl9zaW5rLAogICAgICAgICAgX3RvRW5jb2RhYmxlLAogICAgICAgICAgSnNvblV0ZjhFbmNvZGVyLl91dGY4RW5jb2RlKGluZGVudCksCiAgICAgICAgICBKc29uVXRmOEVuY29kZXIuX2RlZmF1bHRCdWZmZXJTaXplKTsKICAgIH0KICAgIHJldHVybiBfSnNvbkVuY29kZXJTaW5rKAogICAgICAgIHNpbmsgaXMgU3RyaW5nQ29udmVyc2lvblNpbmsgPyBzaW5rIDogU3RyaW5nQ29udmVyc2lvblNpbmsuZnJvbShzaW5rKSwKICAgICAgICBfdG9FbmNvZGFibGUsCiAgICAgICAgaW5kZW50KTsKICB9CgogIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGNsYXNzJ3MgYmluZCwgdG8gcHJvdmlkZSBhIGJldHRlciB0eXBlLgogIFN0cmVhbTxTdHJpbmc+IGJpbmQoU3RyZWFtPE9iamVjdD4gc3RyZWFtKSA9PiBzdXBlci5iaW5kKHN0cmVhbSk7CgogIENvbnZlcnRlcjxPYmplY3QsIFQ+IGZ1c2U8VD4oQ29udmVydGVyPFN0cmluZywgVD4gb3RoZXIpIHsKICAgIGlmIChvdGhlciBpcyBVdGY4RW5jb2RlciAmJiBUIGlzIExpc3Q8aW50PikgewogICAgICAvLyBUaGUgaW5zdGFuY2UgY2hlY2sgZ3VhcmFudGVlcyB0aGF0IGBUYCBpcyAoYSBzdWJ0eXBlIG9mKSBMaXN0PGludD4sCiAgICAgIC8vIGJ1dCB0aGUgc3RhdGljIHR5cGUgc3lzdGVtIGRvZXNuJ3Qga25vdyB0aGF0LCBhbmQgc28gd2UgY2FzdC4KICAgICAgLy8gQ2FzdCB0aHJvdWdoIGR5bmFtaWMgdG8ga2VlcCB0aGUgY2FzdCBpbXBsaWNpdCBmb3IgYnVpbGRzIHVzaW5nCiAgICAgIC8vIHVuY2hlY2tlZCBpbXBsaWNpdCBjYXN0cy4KICAgICAgcmV0dXJuIEpzb25VdGY4RW5jb2RlcihpbmRlbnQsIF90b0VuY29kYWJsZSkgYXMgZHluYW1pYzsKICAgIH0KICAgIHJldHVybiBzdXBlci5mdXNlPFQ+KG90aGVyKTsKICB9Cn0KCi8vLyBFbmNvZGVyIHRoYXQgZW5jb2RlcyBhIHNpbmdsZSBvYmplY3QgYXMgYSBVVEYtOCBlbmNvZGVkIEpTT04gc3RyaW5nLgovLy8KLy8vIFRoaXMgZW5jb2RlciB3b3JrcyBlcXVpdmFsZW50bHkgdG8gZmlyc3QgY29udmVydGluZyB0aGUgb2JqZWN0IHRvCi8vLyBhIEpTT04gc3RyaW5nLCBhbmQgdGhlbiBVVEYtOCBlbmNvZGluZyB0aGUgc3RyaW5nLCBidXQgd2l0aG91dAovLy8gY3JlYXRpbmcgYW4gaW50ZXJtZWRpYXRlIHN0cmluZy4KY2xhc3MgSnNvblV0ZjhFbmNvZGVyIGV4dGVuZHMgQ29udmVydGVyPE9iamVjdCwgTGlzdDxpbnQ+PiB7CiAgLy8vIERlZmF1bHQgYnVmZmVyIHNpemUgdXNlZCBieSB0aGUgSlNPTi10by1VVEYtOCBlbmNvZGVyLgogIHN0YXRpYyBjb25zdCBpbnQgX2RlZmF1bHRCdWZmZXJTaXplID0gMjU2OwogIEBkZXByZWNhdGVkCiAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gX2RlZmF1bHRCdWZmZXJTaXplOwoKICAvLy8gSW5kZW50YXRpb24gdXNlZCBpbiBwcmV0dHktcHJpbnQgbW9kZSwgYG51bGxgIGlmIG5vdCBwcmV0dHkuCiAgZmluYWwgTGlzdDxpbnQ+IF9pbmRlbnQ7CgogIC8vLyBGdW5jdGlvbiBjYWxsZWQgd2l0aCBlYWNoIHVuLWVuY29kYWJsZSBvYmplY3QgZW5jb3VudGVyZWQuCiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwoKICAvLy8gVVRGLTggYnVmZmVyIHNpemUuCiAgZmluYWwgaW50IF9idWZmZXJTaXplOwoKICAvLy8gQ3JlYXRlIGNvbnZlcnRlci4KICAvLy8KICAvLy8gSWYgW2luZGVudF0gaXMgbm9uLWBudWxsYCwgdGhlIGNvbnZlcnRlciBhdHRlbXB0cyB0byAicHJldHR5LXByaW50IiB0aGUKICAvLy8gSlNPTiwgYW5kIHVzZXMgYGluZGVudGAgYXMgdGhlIGluZGVudGF0aW9uLiBPdGhlcndpc2UgdGhlIHJlc3VsdCBoYXMgbm8KICAvLy8gd2hpdGVzcGFjZSBvdXRzaWRlIG9mIHN0cmluZyBsaXRlcmFscy4KICAvLy8gSWYgYGluZGVudGAgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgdmFsaWQgSlNPTiB3aGl0ZXNwYWNlCiAgLy8vIGNoYXJhY3RlcnMsIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgdmFsaWQgSlNPTi4gSlNPTiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKICAvLy8gYXJlIHNwYWNlIChVKzAwMjApLCB0YWIgKFUrMDAwOSksIGxpbmUgZmVlZCAoVSswMDBhKSBhbmQgY2FycmlhZ2UgcmV0dXJuCiAgLy8vIChVKzAwMGQpIChbRUNNQQogIC8vLyA0MDRdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvc3RhbmRhcmRzL0VjbWEtNDA0Lmh0bSkpLgogIC8vLwogIC8vLyBUaGUgW2J1ZmZlclNpemVdIGlzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzIHVzZWQgdG8gY29sbGVjdAogIC8vLyBVVEYtOCBjb2RlIHVuaXRzLgogIC8vLyBJZiB1c2luZyBbc3RhcnRDaHVua2VkQ29udmVyc2lvbl0sIGl0IHdpbGwgYmUgdGhlIHNpemUgb2YgdGhlIGNodW5rcy4KICAvLy8KICAvLy8gVGhlIEpTT04gZW5jb2RlciBoYW5kbGVzIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zLCBudWxsLCBsaXN0cyBhbmQgbWFwcwogIC8vLyBkaXJlY3RseS4KICAvLy8KICAvLy8gQW55IG90aGVyIG9iamVjdCBpcyBhdHRlbXB0ZWQgY29udmVydGVkIGJ5IFt0b0VuY29kYWJsZV0gdG8gYW4gb2JqZWN0IHRoYXQKICAvLy8gaXMgb2Ygb25lIG9mIHRoZSBjb252ZXJ0aWJsZSB0eXBlcy4KICAvLy8KICAvLy8gSWYgW3RvRW5jb2RhYmxlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBjYWxsaW5nIGAudG9Kc29uKClgIG9uIHRoZQogIC8vLyBvYmplY3QuCiAgSnNvblV0ZjhFbmNvZGVyKAogICAgICBbU3RyaW5nIGluZGVudCwgdG9FbmNvZGFibGUob2JqZWN0KSwgaW50IGJ1ZmZlclNpemUgPSBfZGVmYXVsdEJ1ZmZlclNpemVdKQogICAgICA6IF9pbmRlbnQgPSBfdXRmOEVuY29kZShpbmRlbnQpLAogICAgICAgIF90b0VuY29kYWJsZSA9IHRvRW5jb2RhYmxlLAogICAgICAgIF9idWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKCiAgc3RhdGljIExpc3Q8aW50PiBfdXRmOEVuY29kZShTdHJpbmcgc3RyaW5nKSB7CiAgICBpZiAoc3RyaW5nID09IG51bGwpIHJldHVybiBudWxsOwogICAgaWYgKHN0cmluZy5pc0VtcHR5KSByZXR1cm4gVWludDhMaXN0KDApOwogICAgY2hlY2tBc2NpaToKICAgIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoc3RyaW5nLmNvZGVVbml0QXQoaSkgPj0gMHg4MCkgYnJlYWsgY2hlY2tBc2NpaTsKICAgICAgfQogICAgICByZXR1cm4gc3RyaW5nLmNvZGVVbml0czsKICAgIH0KICAgIHJldHVybiB1dGY4LmVuY29kZShzdHJpbmcpOwogIH0KCiAgLy8vIENvbnZlcnQgW29iamVjdF0gaW50byBVVEYtOCBlbmNvZGVkIEpTT04uCiAgTGlzdDxpbnQ+IGNvbnZlcnQoT2JqZWN0IG9iamVjdCkgewogICAgdmFyIGJ5dGVzID0gPExpc3Q8aW50Pj5bXTsKICAgIC8vIFRoZSBgc3RyaW5naWZ5YCBmdW5jdGlvbiBhbHdheXMgY29udmVydHMgaW50byBjaHVua3MuCiAgICAvLyBDb2xsZWN0IHRoZSBjaHVua3MgaW50byB0aGUgYGJ5dGVzYCBsaXN0LCB0aGVuIGNvbWJpbmUgdGhlbSBhZnRlcndhcmRzLgogICAgdm9pZCBhZGRDaHVuayhVaW50OExpc3QgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGNodW5rLmxlbmd0aCkgewogICAgICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgICBjaHVuayA9CiAgICAgICAgICAgIFVpbnQ4TGlzdC52aWV3KGNodW5rLmJ1ZmZlciwgY2h1bmsub2Zmc2V0SW5CeXRlcyArIHN0YXJ0LCBsZW5ndGgpOwogICAgICB9CiAgICAgIGJ5dGVzLmFkZChjaHVuayk7CiAgICB9CgogICAgX0pzb25VdGY4U3RyaW5naWZpZXIuc3RyaW5naWZ5KAogICAgICAgIG9iamVjdCwgX2luZGVudCwgX3RvRW5jb2RhYmxlLCBfYnVmZmVyU2l6ZSwgYWRkQ2h1bmspOwogICAgaWYgKGJ5dGVzLmxlbmd0aCA9PSAxKSByZXR1cm4gYnl0ZXNbMF07CiAgICB2YXIgbGVuZ3RoID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGVuZ3RoICs9IGJ5dGVzW2ldLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHQgPSBVaW50OExpc3QobGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwLCBvZmZzZXQgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGJ5dGVMaXN0ID0gYnl0ZXNbaV07CiAgICAgIGludCBlbmQgPSBvZmZzZXQgKyBieXRlTGlzdC5sZW5ndGg7CiAgICAgIHJlc3VsdC5zZXRSYW5nZShvZmZzZXQsIGVuZCwgYnl0ZUxpc3QpOwogICAgICBvZmZzZXQgPSBlbmQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFN0YXJ0IGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBPbmx5IG9uZSBvYmplY3QgY2FuIGJlIHBhc3NlZCBpbnRvIHRoZSByZXR1cm5lZCBzaW5rLgogIC8vLwogIC8vLyBUaGUgYXJndW1lbnQgW3NpbmtdIHdpbGwgcmVjZWl2ZSBieXRlIGxpc3RzIGluIHNpemVzIGRlcGVuZGluZyBvbiB0aGUKICAvLy8gYGJ1ZmZlclNpemVgIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2hlbiBjcmVhdGluZyB0aGlzIGVuY29kZXIuCiAgQ2h1bmtlZENvbnZlcnNpb25TaW5rPE9iamVjdD4gc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPExpc3Q8aW50Pj4gc2luaykgewogICAgQnl0ZUNvbnZlcnNpb25TaW5rIGJ5dGVTaW5rOwogICAgaWYgKHNpbmsgaXMgQnl0ZUNvbnZlcnNpb25TaW5rKSB7CiAgICAgIGJ5dGVTaW5rID0gc2luazsKICAgIH0gZWxzZSB7CiAgICAgIGJ5dGVTaW5rID0gQnl0ZUNvbnZlcnNpb25TaW5rLmZyb20oc2luayk7CiAgICB9CiAgICByZXR1cm4gX0pzb25VdGY4RW5jb2RlclNpbmsoYnl0ZVNpbmssIF90b0VuY29kYWJsZSwgX2luZGVudCwgX2J1ZmZlclNpemUpOwogIH0KCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3MncyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPExpc3Q8aW50Pj4gYmluZChTdHJlYW08T2JqZWN0PiBzdHJlYW0pIHsKICAgIHJldHVybiBzdXBlci5iaW5kKHN0cmVhbSk7CiAgfQp9CgovLy8gSW1wbGVtZW50cyB0aGUgY2h1bmtlZCBjb252ZXJzaW9uIGZyb20gb2JqZWN0IHRvIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLgovLy8KLy8vIFRoZSBzaW5rIG9ubHkgYWNjZXB0cyBvbmUgdmFsdWUsIGJ1dCB3aWxsIHByb2R1Y2Ugb3V0cHV0IGluIGEgY2h1bmtlZCB3YXkuCmNsYXNzIF9Kc29uRW5jb2RlclNpbmsgZXh0ZW5kcyBDaHVua2VkQ29udmVyc2lvblNpbms8T2JqZWN0PiB7CiAgZmluYWwgU3RyaW5nIF9pbmRlbnQ7CiAgZmluYWwgRnVuY3Rpb24oZHluYW1pYykgX3RvRW5jb2RhYmxlOwogIGZpbmFsIFN0cmluZ0NvbnZlcnNpb25TaW5rIF9zaW5rOwogIGJvb2wgX2lzRG9uZSA9IGZhbHNlOwoKICBfSnNvbkVuY29kZXJTaW5rKHRoaXMuX3NpbmssIHRoaXMuX3RvRW5jb2RhYmxlLCB0aGlzLl9pbmRlbnQpOwoKICAvLy8gRW5jb2RlcyB0aGUgZ2l2ZW4gb2JqZWN0IFtvXS4KICAvLy8KICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gaW52b2tlIHRoaXMgbWV0aG9kIG1vcmUgdGhhbiBvbmNlIG9uIGFueSBpbnN0YW5jZS4gV2hpbGUKICAvLy8gdGhpcyBtYWtlcyB0aGUgaW5wdXQgZWZmZWN0aXZlbHkgbm9uLWNodW5rZWQgdGhlIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZAogIC8vLyBpbiBhIGNodW5rZWQgd2F5LgogIHZvaWQgYWRkKE9iamVjdCBvKSB7CiAgICBpZiAoX2lzRG9uZSkgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJPbmx5IG9uZSBjYWxsIHRvIGFkZCBhbGxvd2VkIik7CiAgICB9CiAgICBfaXNEb25lID0gdHJ1ZTsKICAgIHZhciBzdHJpbmdTaW5rID0gX3NpbmsuYXNTdHJpbmdTaW5rKCk7CiAgICBfSnNvblN0cmluZ1N0cmluZ2lmaWVyLnByaW50T24obywgc3RyaW5nU2luaywgX3RvRW5jb2RhYmxlLCBfaW5kZW50KTsKICAgIHN0cmluZ1NpbmsuY2xvc2UoKTsKICB9CgogIHZvaWQgY2xvc2UoKSB7LyogZG8gbm90aGluZyAqL30KfQoKLy8vIFNpbmsgcmV0dXJuZWQgd2hlbiBzdGFydGluZyBhIGNodW5rZWQgY29udmVyc2lvbiBmcm9tIG9iamVjdCB0byBieXRlcy4KY2xhc3MgX0pzb25VdGY4RW5jb2RlclNpbmsgZXh0ZW5kcyBDaHVua2VkQ29udmVyc2lvblNpbms8T2JqZWN0PiB7CiAgLy8vIFRoZSBieXRlIHNpbmsgcmVjZWl2ZWluZyB0aGUgZW5jb2RlZCBjaHVua3MuCiAgZmluYWwgQnl0ZUNvbnZlcnNpb25TaW5rIF9zaW5rOwogIGZpbmFsIExpc3Q8aW50PiBfaW5kZW50OwogIGZpbmFsIEZ1bmN0aW9uKGR5bmFtaWMpIF90b0VuY29kYWJsZTsKICBmaW5hbCBpbnQgX2J1ZmZlclNpemU7CiAgYm9vbCBfaXNEb25lID0gZmFsc2U7CiAgX0pzb25VdGY4RW5jb2RlclNpbmsoCiAgICAgIHRoaXMuX3NpbmssIHRoaXMuX3RvRW5jb2RhYmxlLCB0aGlzLl9pbmRlbnQsIHRoaXMuX2J1ZmZlclNpemUpOwoKICAvLy8gQ2FsbGJhY2sgY2FsbGVkIGZvciBlYWNoIHNsaWNlIG9mIHJlc3VsdCBieXRlcy4KICB2b2lkIF9hZGRDaHVuayhVaW50OExpc3QgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX3NpbmsuYWRkU2xpY2UoY2h1bmssIHN0YXJ0LCBlbmQsIGZhbHNlKTsKICB9CgogIHZvaWQgYWRkKE9iamVjdCBvYmplY3QpIHsKICAgIGlmIChfaXNEb25lKSB7CiAgICAgIHRocm93IFN0YXRlRXJyb3IoIk9ubHkgb25lIGNhbGwgdG8gYWRkIGFsbG93ZWQiKTsKICAgIH0KICAgIF9pc0RvbmUgPSB0cnVlOwogICAgX0pzb25VdGY4U3RyaW5naWZpZXIuc3RyaW5naWZ5KAogICAgICAgIG9iamVjdCwgX2luZGVudCwgX3RvRW5jb2RhYmxlLCBfYnVmZmVyU2l6ZSwgX2FkZENodW5rKTsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKCFfaXNEb25lKSB7CiAgICAgIF9pc0RvbmUgPSB0cnVlOwogICAgICBfc2luay5jbG9zZSgpOwogICAgfQogIH0KfQoKLy8vIFRoaXMgY2xhc3MgcGFyc2VzIEpTT04gc3RyaW5ncyBhbmQgYnVpbGRzIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdHMuCmNsYXNzIEpzb25EZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPFN0cmluZywgT2JqZWN0PiB7CiAgZmluYWwgRnVuY3Rpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSBfcmV2aXZlcjsKCiAgLy8vIENvbnN0cnVjdHMgYSBuZXcgSnNvbkRlY29kZXIuCiAgLy8vCiAgLy8vIFRoZSBbcmV2aXZlcl0gbWF5IGJlIGBudWxsYC4KICBjb25zdCBKc29uRGVjb2RlcihbcmV2aXZlcihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpXSkgOiBfcmV2aXZlciA9IHJldml2ZXI7CgogIC8vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gSlNPTi1zdHJpbmcgW2lucHV0XSB0byBpdHMgY29ycmVzcG9uZGluZyBvYmplY3QuCiAgLy8vCiAgLy8vIFBhcnNlZCBKU09OIHZhbHVlcyBhcmUgb2YgdGhlIHR5cGVzIFtudW1dLCBbU3RyaW5nXSwgW2Jvb2xdLCBbTnVsbF0sCiAgLy8vIFtMaXN0XXMgb2YgcGFyc2VkIEpTT04gdmFsdWVzIG9yIFtNYXBdcyBmcm9tIFtTdHJpbmddIHRvIHBhcnNlZCBKU09OCiAgLy8vIHZhbHVlcy4KICAvLy8KICAvLy8gSWYgYHRoaXNgIHdhcyBpbml0aWFsaXplZCB3aXRoIGEgcmV2aXZlciwgdGhlbiB0aGUgcGFyc2luZyBvcGVyYXRpb24KICAvLy8gaW52b2tlcyB0aGUgcmV2aXZlciBvbiBldmVyeSBvYmplY3Qgb3IgbGlzdCBwcm9wZXJ0eSB0aGF0IGhhcyBiZWVuIHBhcnNlZC4KICAvLy8gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHByb3BlcnR5IG5hbWUgKFtTdHJpbmddKSBvciBsaXN0IGluZGV4IChbaW50XSksIGFuZAogIC8vLyB0aGUgdmFsdWUgaXMgdGhlIHBhcnNlZCB2YWx1ZS4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcmV2aXZlciBpcyB1c2VkIGFzCiAgLy8vIHRoZSB2YWx1ZSBvZiB0aGF0IHByb3BlcnR5IGluc3RlYWQgdGhlIHBhcnNlZCB2YWx1ZS4KICAvLy8KICAvLy8gVGhyb3dzIFtGb3JtYXRFeGNlcHRpb25dIGlmIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQgSlNPTiB0ZXh0LgogIGR5bmFtaWMgY29udmVydChTdHJpbmcgaW5wdXQpID0+IF9wYXJzZUpzb24oaW5wdXQsIF9yZXZpdmVyKTsKCiAgLy8vIFN0YXJ0cyBhIGNvbnZlcnNpb24gZnJvbSBhIGNodW5rZWQgSlNPTiBzdHJpbmcgdG8gaXRzIGNvcnJlc3BvbmRpbmcgb2JqZWN0LgogIC8vLwogIC8vLyBUaGUgb3V0cHV0IFtzaW5rXSByZWNlaXZlcyBleGFjdGx5IG9uZSBkZWNvZGVkIGVsZW1lbnQgdGhyb3VnaCBgYWRkYC4KICBleHRlcm5hbCBTdHJpbmdDb252ZXJzaW9uU2luayBzdGFydENodW5rZWRDb252ZXJzaW9uKFNpbms8T2JqZWN0PiBzaW5rKTsKCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3MncyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPE9iamVjdD4gYmluZChTdHJlYW08U3RyaW5nPiBzdHJlYW0pID0+IHN1cGVyLmJpbmQoc3RyZWFtKTsKfQoKLy8gSW50ZXJuYWwgb3B0aW1pemVkIEpTT04gcGFyc2luZyBpbXBsZW1lbnRhdGlvbi4KZXh0ZXJuYWwgX3BhcnNlSnNvbihTdHJpbmcgc291cmNlLCByZXZpdmVyKGtleSwgdmFsdWUpKTsKCi8vIEltcGxlbWVudGF0aW9uIG9mIGVuY29kZXIvc3RyaW5naWZpZXIuCgpkeW5hbWljIF9kZWZhdWx0VG9FbmNvZGFibGUoZHluYW1pYyBvYmplY3QpID0+IG9iamVjdC50b0pzb24oKTsKCi8vLyBKU09OIGVuY29kZXIgdGhhdCB0cmF2ZXJzZXMgYW4gb2JqZWN0IHN0cnVjdHVyZSBhbmQgd3JpdGVzIEpTT04gc291cmNlLgovLy8KLy8vIFRoaXMgaXMgYW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gdGhhdCBkb2Vzbid0IGRlY2lkZSBvbiB0aGUgb3V0cHV0Ci8vLyBmb3JtYXQsIGJ1dCB3cml0ZXMgdGhlIEpTT04gdGhyb3VnaCBhYnN0cmFjdCBtZXRob2RzIGxpa2UgW3dyaXRlU3RyaW5nXS4KYWJzdHJhY3QgY2xhc3MgX0pzb25TdHJpbmdpZmllciB7CiAgLy8gQ2hhcmFjdGVyIGNvZGUgY29uc3RhbnRzLgogIHN0YXRpYyBjb25zdCBpbnQgYmFja3NwYWNlID0gMHgwODsKICBzdGF0aWMgY29uc3QgaW50IHRhYiA9IDB4MDk7CiAgc3RhdGljIGNvbnN0IGludCBuZXdsaW5lID0gMHgwYTsKICBzdGF0aWMgY29uc3QgaW50IGNhcnJpYWdlUmV0dXJuID0gMHgwZDsKICBzdGF0aWMgY29uc3QgaW50IGZvcm1GZWVkID0gMHgwYzsKICBzdGF0aWMgY29uc3QgaW50IHF1b3RlID0gMHgyMjsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfMCA9IDB4MzA7CiAgc3RhdGljIGNvbnN0IGludCBiYWNrc2xhc2ggPSAweDVjOwogIHN0YXRpYyBjb25zdCBpbnQgY2hhcl9iID0gMHg2MjsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfZiA9IDB4NjY7CiAgc3RhdGljIGNvbnN0IGludCBjaGFyX24gPSAweDZlOwogIHN0YXRpYyBjb25zdCBpbnQgY2hhcl9yID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IGNoYXJfdCA9IDB4NzQ7CiAgc3RhdGljIGNvbnN0IGludCBjaGFyX3UgPSAweDc1OwoKICAvLy8gTGlzdCBvZiBvYmplY3RzIGN1cnJlbnRseSBiZWluZyB0cmF2ZXJzZWQuIFVzZWQgdG8gZGV0ZWN0IGN5Y2xlcy4KICBmaW5hbCBMaXN0IF9zZWVuID0gW107CgogIC8vLyBGdW5jdGlvbiBjYWxsZWQgZm9yIGVhY2ggdW4tZW5jb2RhYmxlIG9iamVjdCBlbmNvdW50ZXJlZC4KICBmaW5hbCBGdW5jdGlvbihkeW5hbWljKSBfdG9FbmNvZGFibGU7CgogIF9Kc29uU3RyaW5naWZpZXIodG9FbmNvZGFibGUobykpCiAgICAgIDogX3RvRW5jb2RhYmxlID0gdG9FbmNvZGFibGUgPz8gX2RlZmF1bHRUb0VuY29kYWJsZTsKCiAgU3RyaW5nIGdldCBfcGFydGlhbFJlc3VsdDsKCiAgLy8vIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgSlNPTiBvdXRwdXQuCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgY2hhcmFjdGVycyk7CgogIC8vLyBBcHBlbmQgcGFydCBvZiBhIHN0cmluZyB0byB0aGUgSlNPTiBvdXRwdXQuCiAgdm9pZCB3cml0ZVN0cmluZ1NsaWNlKFN0cmluZyBjaGFyYWN0ZXJzLCBpbnQgc3RhcnQsIGludCBlbmQpOwoKICAvLy8gQXBwZW5kIGEgc2luZ2xlIGNoYXJhY3RlciwgZ2l2ZW4gYnkgaXRzIGNvZGUgcG9pbnQsIHRvIHRoZSBKU09OIG91dHB1dC4KICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKTsKCiAgLy8vIFdyaXRlIGEgbnVtYmVyIHRvIHRoZSBKU09OIG91dHB1dC4KICB2b2lkIHdyaXRlTnVtYmVyKG51bSBudW1iZXIpOwoKICAvLyAoJzAnICsgeCkgb3IgKCdhJyArIHggLSAxMCkKICBzdGF0aWMgaW50IGhleERpZ2l0KGludCB4KSA9PiB4IDwgMTAgPyA0OCArIHggOiA4NyArIHg7CgogIC8vLyBXcml0ZSwgYW5kIHN1aXRhYmx5IGVzY2FwZSwgYSBzdHJpbmcncyBjb250ZW50IGFzIGEgSlNPTiBzdHJpbmcgbGl0ZXJhbC4KICB2b2lkIHdyaXRlU3RyaW5nQ29udGVudChTdHJpbmcgcykgewogICAgdmFyIG9mZnNldCA9IDA7CiAgICBmaW5hbCBsZW5ndGggPSBzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNoYXJDb2RlID0gcy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhckNvZGUgPiBiYWNrc2xhc2gpIGNvbnRpbnVlOwogICAgICBpZiAoY2hhckNvZGUgPCAzMikgewogICAgICAgIGlmIChpID4gb2Zmc2V0KSB3cml0ZVN0cmluZ1NsaWNlKHMsIG9mZnNldCwgaSk7CiAgICAgICAgb2Zmc2V0ID0gaSArIDE7CiAgICAgICAgd3JpdGVDaGFyQ29kZShiYWNrc2xhc2gpOwogICAgICAgIHN3aXRjaCAoY2hhckNvZGUpIHsKICAgICAgICAgIGNhc2UgYmFja3NwYWNlOgogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfYik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSB0YWI6CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl90KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIG5ld2xpbmU6CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl9uKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIGZvcm1GZWVkOgogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfZik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBjYXJyaWFnZVJldHVybjoKICAgICAgICAgICAgd3JpdGVDaGFyQ29kZShjaGFyX3IpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhcl91KTsKICAgICAgICAgICAgd3JpdGVDaGFyQ29kZShjaGFyXzApOwogICAgICAgICAgICB3cml0ZUNoYXJDb2RlKGNoYXJfMCk7CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoaGV4RGlnaXQoKGNoYXJDb2RlID4+IDQpICYgMHhmKSk7CiAgICAgICAgICAgIHdyaXRlQ2hhckNvZGUoaGV4RGlnaXQoY2hhckNvZGUgJiAweGYpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09IHF1b3RlIHx8IGNoYXJDb2RlID09IGJhY2tzbGFzaCkgewogICAgICAgIGlmIChpID4gb2Zmc2V0KSB3cml0ZVN0cmluZ1NsaWNlKHMsIG9mZnNldCwgaSk7CiAgICAgICAgb2Zmc2V0ID0gaSArIDE7CiAgICAgICAgd3JpdGVDaGFyQ29kZShiYWNrc2xhc2gpOwogICAgICAgIHdyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogICAgICB9CiAgICB9CiAgICBpZiAob2Zmc2V0ID09IDApIHsKICAgICAgd3JpdGVTdHJpbmcocyk7CiAgICB9IGVsc2UgaWYgKG9mZnNldCA8IGxlbmd0aCkgewogICAgICB3cml0ZVN0cmluZ1NsaWNlKHMsIG9mZnNldCwgbGVuZ3RoKTsKICAgIH0KICB9CgogIC8vLyBDaGVjayBpZiBhbiBlbmNvdW50ZXJlZCBvYmplY3QgaXMgYWxyZWFkeSBiZWluZyB0cmF2ZXJzZWQuCiAgLy8vCiAgLy8vIFJlY29yZHMgdGhlIG9iamVjdCBpZiBpdCBpc24ndCBhbHJlYWR5IHNlZW4uIFNob3VsZCBoYXZlIGEgbWF0Y2hpbmcgY2FsbCB0bwogIC8vLyBbX3JlbW92ZVNlZW5dIHdoZW4gdGhlIG9iamVjdCBpcyBubyBsb25nZXIgYmVpbmcgdHJhdmVyc2VkLgogIHZvaWQgX2NoZWNrQ3ljbGUob2JqZWN0KSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9zZWVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChpZGVudGljYWwob2JqZWN0LCBfc2VlbltpXSkpIHsKICAgICAgICB0aHJvdyBKc29uQ3ljbGljRXJyb3Iob2JqZWN0KTsKICAgICAgfQogICAgfQogICAgX3NlZW4uYWRkKG9iamVjdCk7CiAgfQoKICAvLy8gUmVtb3ZlIFtvYmplY3RdIGZyb20gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHRyYXZlcnNlZCBvYmplY3RzLgogIC8vLwogIC8vLyBTaG91bGQgYmUgY2FsbGVkIGluIHRoZSBvcHBvc2l0ZSBvcmRlciBvZiB0aGUgbWF0Y2hpbmcgW19jaGVja0N5Y2xlXQogIC8vLyBjYWxscy4KICB2b2lkIF9yZW1vdmVTZWVuKG9iamVjdCkgewogICAgYXNzZXJ0KF9zZWVuLmlzTm90RW1wdHkpOwogICAgYXNzZXJ0KGlkZW50aWNhbChfc2Vlbi5sYXN0LCBvYmplY3QpKTsKICAgIF9zZWVuLnJlbW92ZUxhc3QoKTsKICB9CgogIC8vLyBXcml0ZSBhbiBvYmplY3QuCiAgLy8vCiAgLy8vIElmIFtvYmplY3RdIGlzbid0IGRpcmVjdGx5IGVuY29kYWJsZSwgdGhlIFtfdG9FbmNvZGFibGVdIGZ1bmN0aW9uIGdldHMgb25lCiAgLy8vIGNoYW5jZSB0byByZXR1cm4gYSByZXBsYWNlbWVudCB3aGljaCBpcyBlbmNvZGFibGUuCiAgdm9pZCB3cml0ZU9iamVjdChvYmplY3QpIHsKICAgIC8vIFRyaWVzIHN0cmluZ2lmeWluZyBvYmplY3QgZGlyZWN0bHkuIElmIGl0J3Mgbm90IGEgc2ltcGxlIHZhbHVlLCBMaXN0IG9yCiAgICAvLyBNYXAsIGNhbGwgdG9Kc29uKCkgdG8gZ2V0IGEgY3VzdG9tIHJlcHJlc2VudGF0aW9uIGFuZCB0cnkgc2VyaWFsaXppbmcKICAgIC8vIHRoYXQuCiAgICBpZiAod3JpdGVKc29uVmFsdWUob2JqZWN0KSkgcmV0dXJuOwogICAgX2NoZWNrQ3ljbGUob2JqZWN0KTsKICAgIHRyeSB7CiAgICAgIHZhciBjdXN0b21Kc29uID0gX3RvRW5jb2RhYmxlKG9iamVjdCk7CiAgICAgIGlmICghd3JpdGVKc29uVmFsdWUoY3VzdG9tSnNvbikpIHsKICAgICAgICB0aHJvdyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcihvYmplY3QsIHBhcnRpYWxSZXN1bHQ6IF9wYXJ0aWFsUmVzdWx0KTsKICAgICAgfQogICAgICBfcmVtb3ZlU2VlbihvYmplY3QpOwogICAgfSBjYXRjaCAoZSkgewogICAgICB0aHJvdyBKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcihvYmplY3QsCiAgICAgICAgICBjYXVzZTogZSwgcGFydGlhbFJlc3VsdDogX3BhcnRpYWxSZXN1bHQpOwogICAgfQogIH0KCiAgLy8vIFNlcmlhbGl6ZSBhIFtudW1dLCBbU3RyaW5nXSwgW2Jvb2xdLCBbTnVsbF0sIFtMaXN0XSBvciBbTWFwXSB2YWx1ZS4KICAvLy8KICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBvbmUgb2YgdGhlc2UgdHlwZXMsIGFuZCBmYWxzZSBpZiBub3QuCiAgLy8vIElmIGEgdmFsdWUgaXMgYm90aCBhIFtMaXN0XSBhbmQgYSBbTWFwXSwgaXQncyBzZXJpYWxpemVkIGFzIGEgW0xpc3RdLgogIGJvb2wgd3JpdGVKc29uVmFsdWUob2JqZWN0KSB7CiAgICBpZiAob2JqZWN0IGlzIG51bSkgewogICAgICBpZiAoIW9iamVjdC5pc0Zpbml0ZSkgcmV0dXJuIGZhbHNlOwogICAgICB3cml0ZU51bWJlcihvYmplY3QpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKG9iamVjdCwgdHJ1ZSkpIHsKICAgICAgd3JpdGVTdHJpbmcoJ3RydWUnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChvYmplY3QsIGZhbHNlKSkgewogICAgICB3cml0ZVN0cmluZygnZmFsc2UnKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKG9iamVjdCA9PSBudWxsKSB7CiAgICAgIHdyaXRlU3RyaW5nKCdudWxsJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChvYmplY3QgaXMgU3RyaW5nKSB7CiAgICAgIHdyaXRlU3RyaW5nKCciJyk7CiAgICAgIHdyaXRlU3RyaW5nQ29udGVudChvYmplY3QpOwogICAgICB3cml0ZVN0cmluZygnIicpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAob2JqZWN0IGlzIExpc3QpIHsKICAgICAgX2NoZWNrQ3ljbGUob2JqZWN0KTsKICAgICAgd3JpdGVMaXN0KG9iamVjdCk7CiAgICAgIF9yZW1vdmVTZWVuKG9iamVjdCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChvYmplY3QgaXMgTWFwKSB7CiAgICAgIF9jaGVja0N5Y2xlKG9iamVjdCk7CiAgICAgIC8vIHdyaXRlTWFwIGNhbiBmYWlsIGlmIGtleXMgYXJlIG5vdCBhbGwgc3RyaW5ncy4KICAgICAgdmFyIHN1Y2Nlc3MgPSB3cml0ZU1hcChvYmplY3QpOwogICAgICBfcmVtb3ZlU2VlbihvYmplY3QpOwogICAgICByZXR1cm4gc3VjY2VzczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vLyBTZXJpYWxpemUgYSBbTGlzdF0uCiAgdm9pZCB3cml0ZUxpc3QoTGlzdCBsaXN0KSB7CiAgICB3cml0ZVN0cmluZygnWycpOwogICAgaWYgKGxpc3QuaXNOb3RFbXB0eSkgewogICAgICB3cml0ZU9iamVjdChsaXN0WzBdKTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgd3JpdGVTdHJpbmcoJywnKTsKICAgICAgICB3cml0ZU9iamVjdChsaXN0W2ldKTsKICAgICAgfQogICAgfQogICAgd3JpdGVTdHJpbmcoJ10nKTsKICB9CgogIC8vLyBTZXJpYWxpemUgYSBbTWFwXS4KICBib29sIHdyaXRlTWFwKE1hcCBtYXApIHsKICAgIGlmIChtYXAuaXNFbXB0eSkgewogICAgICB3cml0ZVN0cmluZygie30iKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIga2V5VmFsdWVMaXN0ID0gTGlzdChtYXAubGVuZ3RoICogMik7CiAgICB2YXIgaSA9IDA7CiAgICB2YXIgYWxsU3RyaW5nS2V5cyA9IHRydWU7CiAgICBtYXAuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoa2V5IGlzISBTdHJpbmcpIHsKICAgICAgICBhbGxTdHJpbmdLZXlzID0gZmFsc2U7CiAgICAgIH0KICAgICAga2V5VmFsdWVMaXN0W2krK10gPSBrZXk7CiAgICAgIGtleVZhbHVlTGlzdFtpKytdID0gdmFsdWU7CiAgICB9KTsKICAgIGlmICghYWxsU3RyaW5nS2V5cykgcmV0dXJuIGZhbHNlOwogICAgd3JpdGVTdHJpbmcoJ3snKTsKICAgIHZhciBzZXBhcmF0b3IgPSAnIic7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlTGlzdC5sZW5ndGg7IGkgKz0gMikgewogICAgICB3cml0ZVN0cmluZyhzZXBhcmF0b3IpOwogICAgICBzZXBhcmF0b3IgPSAnLCInOwogICAgICB3cml0ZVN0cmluZ0NvbnRlbnQoa2V5VmFsdWVMaXN0W2ldKTsKICAgICAgd3JpdGVTdHJpbmcoJyI6Jyk7CiAgICAgIHdyaXRlT2JqZWN0KGtleVZhbHVlTGlzdFtpICsgMV0pOwogICAgfQogICAgd3JpdGVTdHJpbmcoJ30nKTsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8vIEEgbW9kaWZpY2F0aW9uIG9mIFtfSnNvblN0cmluZ2lmaWVyXSB3aGljaCBpbmRlbnRzIHRoZSBjb250ZW50cyBvZiBbTGlzdF0gYW5kCi8vLyBbTWFwXSBvYmplY3RzIHVzaW5nIHRoZSBzcGVjaWZpZWQgaW5kZW50IHZhbHVlLgovLy8KLy8vIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBbd3JpdGVJbmRlbnRhdGlvbl0uCmFic3RyYWN0IGNsYXNzIF9Kc29uUHJldHR5UHJpbnRNaXhpbiBpbXBsZW1lbnRzIF9Kc29uU3RyaW5naWZpZXIgewogIGludCBfaW5kZW50TGV2ZWwgPSAwOwoKICAvLy8gQWRkIFtpbmRlbnRMZXZlbF0gaW5kZW50YXRpb25zIHRvIHRoZSBKU09OIG91dHB1dC4KICB2b2lkIHdyaXRlSW5kZW50YXRpb24oaW50IGluZGVudExldmVsKTsKCiAgdm9pZCB3cml0ZUxpc3QoTGlzdCBsaXN0KSB7CiAgICBpZiAobGlzdC5pc0VtcHR5KSB7CiAgICAgIHdyaXRlU3RyaW5nKCdbXScpOwogICAgfSBlbHNlIHsKICAgICAgd3JpdGVTdHJpbmcoJ1tcbicpOwogICAgICBfaW5kZW50TGV2ZWwrKzsKICAgICAgd3JpdGVJbmRlbnRhdGlvbihfaW5kZW50TGV2ZWwpOwogICAgICB3cml0ZU9iamVjdChsaXN0WzBdKTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgd3JpdGVTdHJpbmcoJyxcbicpOwogICAgICAgIHdyaXRlSW5kZW50YXRpb24oX2luZGVudExldmVsKTsKICAgICAgICB3cml0ZU9iamVjdChsaXN0W2ldKTsKICAgICAgfQogICAgICB3cml0ZVN0cmluZygnXG4nKTsKICAgICAgX2luZGVudExldmVsLS07CiAgICAgIHdyaXRlSW5kZW50YXRpb24oX2luZGVudExldmVsKTsKICAgICAgd3JpdGVTdHJpbmcoJ10nKTsKICAgIH0KICB9CgogIGJvb2wgd3JpdGVNYXAoTWFwIG1hcCkgewogICAgaWYgKG1hcC5pc0VtcHR5KSB7CiAgICAgIHdyaXRlU3RyaW5nKCJ7fSIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZhciBrZXlWYWx1ZUxpc3QgPSBMaXN0KG1hcC5sZW5ndGggKiAyKTsKICAgIHZhciBpID0gMDsKICAgIHZhciBhbGxTdHJpbmdLZXlzID0gdHJ1ZTsKICAgIG1hcC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaXMhIFN0cmluZykgewogICAgICAgIGFsbFN0cmluZ0tleXMgPSBmYWxzZTsKICAgICAgfQogICAgICBrZXlWYWx1ZUxpc3RbaSsrXSA9IGtleTsKICAgICAga2V5VmFsdWVMaXN0W2krK10gPSB2YWx1ZTsKICAgIH0pOwogICAgaWYgKCFhbGxTdHJpbmdLZXlzKSByZXR1cm4gZmFsc2U7CiAgICB3cml0ZVN0cmluZygne1xuJyk7CiAgICBfaW5kZW50TGV2ZWwrKzsKICAgIHZhciBzZXBhcmF0b3IgPSAiIjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVMaXN0Lmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIHdyaXRlU3RyaW5nKHNlcGFyYXRvcik7CiAgICAgIHNlcGFyYXRvciA9ICIsXG4iOwogICAgICB3cml0ZUluZGVudGF0aW9uKF9pbmRlbnRMZXZlbCk7CiAgICAgIHdyaXRlU3RyaW5nKCciJyk7CiAgICAgIHdyaXRlU3RyaW5nQ29udGVudChrZXlWYWx1ZUxpc3RbaV0pOwogICAgICB3cml0ZVN0cmluZygnIjogJyk7CiAgICAgIHdyaXRlT2JqZWN0KGtleVZhbHVlTGlzdFtpICsgMV0pOwogICAgfQogICAgd3JpdGVTdHJpbmcoJ1xuJyk7CiAgICBfaW5kZW50TGV2ZWwtLTsKICAgIHdyaXRlSW5kZW50YXRpb24oX2luZGVudExldmVsKTsKICAgIHdyaXRlU3RyaW5nKCd9Jyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCi8vLyBBIHNwZWNpYWxpemF0aW9uIG9mIFtfSnNvblN0cmluZ2lmaWVyXSB0aGF0IHdyaXRlcyBpdHMgSlNPTiB0byBhIHN0cmluZy4KY2xhc3MgX0pzb25TdHJpbmdTdHJpbmdpZmllciBleHRlbmRzIF9Kc29uU3RyaW5naWZpZXIgewogIGZpbmFsIFN0cmluZ1NpbmsgX3Npbms7CgogIF9Kc29uU3RyaW5nU3RyaW5naWZpZXIodGhpcy5fc2luaywgZHluYW1pYyBGdW5jdGlvbihkeW5hbWljKSBfdG9FbmNvZGFibGUpCiAgICAgIDogc3VwZXIoX3RvRW5jb2RhYmxlKTsKCiAgLy8vIENvbnZlcnQgb2JqZWN0IHRvIGEgc3RyaW5nLgogIC8vLwogIC8vLyBUaGUgW3RvRW5jb2RhYmxlXSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnQgbm9uLWVuY29kYWJsZSBvYmplY3RzCiAgLy8vIHRvIGVuY29kYWJsZSBvbmVzLgogIC8vLwogIC8vLyBJZiBbaW5kZW50XSBpcyBub3QgYG51bGxgLCB0aGUgcmVzdWx0aW5nIEpTT04gd2lsbCBiZSAicHJldHR5LXByaW50ZWQiCiAgLy8vIHdpdGggbmV3bGluZXMgYW5kIGluZGVudGF0aW9uLiBUaGUgYGluZGVudGAgc3RyaW5nIGlzIGFkZGVkIGFzIGluZGVudGF0aW9uCiAgLy8vIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsLiBJdCBzaG91bGQgb25seSBjb250YWluIHZhbGlkIEpTT04gd2hpdGVzcGFjZQogIC8vLyBjaGFyYWN0ZXJzIChzcGFjZSwgdGFiLCBjYXJyaWFnZSByZXR1cm4gb3IgbGluZSBmZWVkKS4KICBzdGF0aWMgU3RyaW5nIHN0cmluZ2lmeShvYmplY3QsIHRvRW5jb2RhYmxlKG8pLCBTdHJpbmcgaW5kZW50KSB7CiAgICB2YXIgb3V0cHV0ID0gU3RyaW5nQnVmZmVyKCk7CiAgICBwcmludE9uKG9iamVjdCwgb3V0cHV0LCB0b0VuY29kYWJsZSwgaW5kZW50KTsKICAgIHJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKICB9CgogIC8vLyBDb252ZXJ0IG9iamVjdCB0byBhIHN0cmluZywgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIFtvdXRwdXRdIHNpbmsuCiAgLy8vCiAgLy8vIFRoZSByZXN1bHQgaXMgd3JpdHRlbiBwaWVjZW1hbGx5IHRvIHRoZSBzaW5rLgogIHN0YXRpYyB2b2lkIHByaW50T24oCiAgICAgIG9iamVjdCwgU3RyaW5nU2luayBvdXRwdXQsIHRvRW5jb2RhYmxlKG8pLCBTdHJpbmcgaW5kZW50KSB7CiAgICBfSnNvblN0cmluZ2lmaWVyIHN0cmluZ2lmaWVyOwogICAgaWYgKGluZGVudCA9PSBudWxsKSB7CiAgICAgIHN0cmluZ2lmaWVyID0gX0pzb25TdHJpbmdTdHJpbmdpZmllcihvdXRwdXQsIHRvRW5jb2RhYmxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmluZ2lmaWVyID0gX0pzb25TdHJpbmdTdHJpbmdpZmllclByZXR0eShvdXRwdXQsIHRvRW5jb2RhYmxlLCBpbmRlbnQpOwogICAgfQogICAgc3RyaW5naWZpZXIud3JpdGVPYmplY3Qob2JqZWN0KTsKICB9CgogIFN0cmluZyBnZXQgX3BhcnRpYWxSZXN1bHQgPT4gX3NpbmsgaXMgU3RyaW5nQnVmZmVyID8gX3NpbmsudG9TdHJpbmcoKSA6IG51bGw7CgogIHZvaWQgd3JpdGVOdW1iZXIobnVtIG51bWJlcikgewogICAgX3Npbmsud3JpdGUobnVtYmVyLnRvU3RyaW5nKCkpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICBfc2luay53cml0ZShzdHJpbmcpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1NsaWNlKFN0cmluZyBzdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX3Npbmsud3JpdGUoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CiAgfQoKICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKSB7CiAgICBfc2luay53cml0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICB9Cn0KCmNsYXNzIF9Kc29uU3RyaW5nU3RyaW5naWZpZXJQcmV0dHkgZXh0ZW5kcyBfSnNvblN0cmluZ1N0cmluZ2lmaWVyCiAgICB3aXRoIF9Kc29uUHJldHR5UHJpbnRNaXhpbiB7CiAgZmluYWwgU3RyaW5nIF9pbmRlbnQ7CgogIF9Kc29uU3RyaW5nU3RyaW5naWZpZXJQcmV0dHkoU3RyaW5nU2luayBzaW5rLCB0b0VuY29kYWJsZShvKSwgdGhpcy5faW5kZW50KQogICAgICA6IHN1cGVyKHNpbmssIHRvRW5jb2RhYmxlKTsKCiAgdm9pZCB3cml0ZUluZGVudGF0aW9uKGludCBjb3VudCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB3cml0ZVN0cmluZyhfaW5kZW50KTsKICB9Cn0KCi8vLyBTcGVjaWFsaXphdGlvbiBvZiBbX0pzb25TdHJpbmdpZmllcl0gdGhhdCB3cml0ZXMgdGhlIEpTT04gYXMgVVRGLTguCi8vLwovLy8gVGhlIEpTT04gdGV4dCBpcyBVVEYtOCBlbmNvZGVkIGFuZCB3cml0dGVuIHRvIFtVaW50OExpc3RdIGJ1ZmZlcnMuCi8vLyBUaGUgYnVmZmVycyBhcmUgdGhlbiBwYXNzZWQgYmFjayB0byBhIHVzZXIgcHJvdmlkZWQgY2FsbGJhY2sgbWV0aG9kLgpjbGFzcyBfSnNvblV0ZjhTdHJpbmdpZmllciBleHRlbmRzIF9Kc29uU3RyaW5naWZpZXIgewogIGZpbmFsIGludCBidWZmZXJTaXplOwogIGZpbmFsIHZvaWQgRnVuY3Rpb24oVWludDhMaXN0IGxpc3QsIGludCBzdGFydCwgaW50IGVuZCkgYWRkQ2h1bms7CiAgVWludDhMaXN0IGJ1ZmZlcjsKICBpbnQgaW5kZXggPSAwOwoKICBfSnNvblV0ZjhTdHJpbmdpZmllcih0b0VuY29kYWJsZShvKSwgdGhpcy5idWZmZXJTaXplLCB0aGlzLmFkZENodW5rKQogICAgICA6IGJ1ZmZlciA9IFVpbnQ4TGlzdChidWZmZXJTaXplKSwKICAgICAgICBzdXBlcih0b0VuY29kYWJsZSk7CgogIC8vLyBDb252ZXJ0IFtvYmplY3RdIHRvIFVURi04IGVuY29kZWQgSlNPTi4KICAvLy8KICAvLy8gQ2FsbHMgW2FkZENodW5rXSB3aXRoIHNsaWNlcyBvZiBVVEYtOCBjb2RlIHVuaXRzLgogIC8vLyBUaGVzZSB3aWxsIHR5cGljYWxseSBoYXZlIHNpemUgW2J1ZmZlclNpemVdLCBidXQgbWF5IGJlIHNob3J0ZXIuCiAgLy8vIFRoZSBidWZmZXJzIGFyZSBub3QgcmV1c2VkLCBzbyB0aGUgW2FkZENodW5rXSBjYWxsIG1heSBrZWVwIGFuZCByZXVzZSB0aGUKICAvLy8gY2h1bmtzLgogIC8vLwogIC8vLyBJZiBbaW5kZW50XSBpcyBub24tYG51bGxgLCB0aGUgcmVzdWx0IHdpbGwgYmUgInByZXR0eS1wcmludGVkIiB3aXRoIGV4dHJhCiAgLy8vIG5ld2xpbmVzIGFuZCBpbmRlbnRhdGlvbiwgdXNpbmcgW2luZGVudF0gYXMgdGhlIGluZGVudGF0aW9uLgogIHN0YXRpYyB2b2lkIHN0cmluZ2lmeShPYmplY3Qgb2JqZWN0LCBMaXN0PGludD4gaW5kZW50LCB0b0VuY29kYWJsZShvKSwKICAgICAgaW50IGJ1ZmZlclNpemUsIHZvaWQgYWRkQ2h1bmsoVWludDhMaXN0IGNodW5rLCBpbnQgc3RhcnQsIGludCBlbmQpKSB7CiAgICBfSnNvblV0ZjhTdHJpbmdpZmllciBzdHJpbmdpZmllcjsKICAgIGlmIChpbmRlbnQgIT0gbnVsbCkgewogICAgICBzdHJpbmdpZmllciA9CiAgICAgICAgICBfSnNvblV0ZjhTdHJpbmdpZmllclByZXR0eSh0b0VuY29kYWJsZSwgaW5kZW50LCBidWZmZXJTaXplLCBhZGRDaHVuayk7CiAgICB9IGVsc2UgewogICAgICBzdHJpbmdpZmllciA9IF9Kc29uVXRmOFN0cmluZ2lmaWVyKHRvRW5jb2RhYmxlLCBidWZmZXJTaXplLCBhZGRDaHVuayk7CiAgICB9CiAgICBzdHJpbmdpZmllci53cml0ZU9iamVjdChvYmplY3QpOwogICAgc3RyaW5naWZpZXIuZmx1c2goKTsKICB9CgogIC8vLyBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgZW5kIHRvIHB1c2ggdGhlIGxhc3QgY2h1bmsgdG8gdGhlIFthZGRDaHVua10KICAvLy8gY2FsbGJhY2suCiAgdm9pZCBmbHVzaCgpIHsKICAgIGlmIChpbmRleCA+IDApIHsKICAgICAgYWRkQ2h1bmsoYnVmZmVyLCAwLCBpbmRleCk7CiAgICB9CiAgICBidWZmZXIgPSBudWxsOwogICAgaW5kZXggPSAwOwogIH0KCiAgU3RyaW5nIGdldCBfcGFydGlhbFJlc3VsdCA9PiBudWxsOwoKICB2b2lkIHdyaXRlTnVtYmVyKG51bSBudW1iZXIpIHsKICAgIHdyaXRlQXNjaWlTdHJpbmcobnVtYmVyLnRvU3RyaW5nKCkpOwogIH0KCiAgLy8vIFdyaXRlIGEgc3RyaW5nIHRoYXQgaXMga25vd24gdG8gbm90IGhhdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCiAgdm9pZCB3cml0ZUFzY2lpU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKICAgIC8vIFRPRE8obHJuKTogT3B0aW1pemUgYnkgY29weWluZyBkaXJlY3RseSBpbnRvIGJ1ZmZlciBpbnN0ZWFkIG9mIGdvaW5nCiAgICAvLyB0aHJvdWdoIHdyaXRlQ2hhckNvZGU7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hhciA9IHN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgICBhc3NlcnQoY2hhciA8PSAweDdmKTsKICAgICAgd3JpdGVCeXRlKGNoYXIpOwogICAgfQogIH0KCiAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CiAgICB3cml0ZVN0cmluZ1NsaWNlKHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCk7CiAgfQoKICB2b2lkIHdyaXRlU3RyaW5nU2xpY2UoU3RyaW5nIHN0cmluZywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAvLyBUT0RPKGxybik6IE9wdGltaXplIGJ5IGNvcHlpbmcgZGlyZWN0bHkgaW50byBidWZmZXIgaW5zdGVhZCBvZiBnb2luZwogICAgLy8gdGhyb3VnaCB3cml0ZUNoYXJDb2RlL3dyaXRlQnl0ZS4gQXNzdW1wdGlvbiBpcyB0aGUgbW9zdCBjaGFyYWN0ZXJzCiAgICAvLyBpbiBzdGFyaW5ncyBhcmUgcGxhaW4gQVNDSUkuCiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2hhciA9IHN0cmluZy5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA8PSAweDdmKSB7CiAgICAgICAgd3JpdGVCeXRlKGNoYXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgoY2hhciAmIDB4RkMwMCkgPT0gMHhEODAwICYmIGkgKyAxIDwgZW5kKSB7CiAgICAgICAgICAvLyBMZWFkIHN1cnJvZ2F0ZS4KICAgICAgICAgIHZhciBuZXh0Q2hhciA9IHN0cmluZy5jb2RlVW5pdEF0KGkgKyAxKTsKICAgICAgICAgIGlmICgobmV4dENoYXIgJiAweEZDMDApID09IDB4REMwMCkgewogICAgICAgICAgICAvLyBUYWlsIHN1cnJvZ2F0ZS4KICAgICAgICAgICAgY2hhciA9IDB4MTAwMDAgKyAoKGNoYXIgJiAweDNmZikgPDwgMTApICsgKG5leHRDaGFyICYgMHgzZmYpOwogICAgICAgICAgICB3cml0ZUZvdXJCeXRlQ2hhckNvZGUoY2hhcik7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdyaXRlTXVsdGlCeXRlQ2hhckNvZGUoY2hhcik7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIGlmIChjaGFyQ29kZSA8PSAweDdmKSB7CiAgICAgIHdyaXRlQnl0ZShjaGFyQ29kZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHdyaXRlTXVsdGlCeXRlQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgdm9pZCB3cml0ZU11bHRpQnl0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgaWYgKGNoYXJDb2RlIDw9IDB4N2ZmKSB7CiAgICAgIHdyaXRlQnl0ZSgweEMwIHwgKGNoYXJDb2RlID4+IDYpKTsKICAgICAgd3JpdGVCeXRlKDB4ODAgfCAoY2hhckNvZGUgJiAweDNmKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChjaGFyQ29kZSA8PSAweGZmZmYpIHsKICAgICAgd3JpdGVCeXRlKDB4RTAgfCAoY2hhckNvZGUgPj4gMTIpKTsKICAgICAgd3JpdGVCeXRlKDB4ODAgfCAoKGNoYXJDb2RlID4+IDYpICYgMHgzZikpOwogICAgICB3cml0ZUJ5dGUoMHg4MCB8IChjaGFyQ29kZSAmIDB4M2YpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgd3JpdGVGb3VyQnl0ZUNoYXJDb2RlKGNoYXJDb2RlKTsKICB9CgogIHZvaWQgd3JpdGVGb3VyQnl0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgYXNzZXJ0KGNoYXJDb2RlIDw9IDB4MTBmZmZmKTsKICAgIHdyaXRlQnl0ZSgweEYwIHwgKGNoYXJDb2RlID4+IDE4KSk7CiAgICB3cml0ZUJ5dGUoMHg4MCB8ICgoY2hhckNvZGUgPj4gMTIpICYgMHgzZikpOwogICAgd3JpdGVCeXRlKDB4ODAgfCAoKGNoYXJDb2RlID4+IDYpICYgMHgzZikpOwogICAgd3JpdGVCeXRlKDB4ODAgfCAoY2hhckNvZGUgJiAweDNmKSk7CiAgfQoKICB2b2lkIHdyaXRlQnl0ZShpbnQgYnl0ZSkgewogICAgYXNzZXJ0KGJ5dGUgPD0gMHhmZik7CiAgICBpZiAoaW5kZXggPT0gYnVmZmVyLmxlbmd0aCkgewogICAgICBhZGRDaHVuayhidWZmZXIsIDAsIGluZGV4KTsKICAgICAgYnVmZmVyID0gVWludDhMaXN0KGJ1ZmZlclNpemUpOwogICAgICBpbmRleCA9IDA7CiAgICB9CiAgICBidWZmZXJbaW5kZXgrK10gPSBieXRlOwogIH0KfQoKLy8vIFByZXR0eS1wcmludGluZyB2ZXJzaW9uIG9mIFtfSnNvblV0ZjhTdHJpbmdpZmllcl0uCmNsYXNz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cmluZ3MgdG8gSVNPIExhdGluLTEgKGFrYSBJU08tODg1OS0xKSBieXRlcwovLy8gYW5kIGRlY29kZXMgTGF0aW4tMSBieXRlcyB0byBzdHJpbmdzLgpjbGFzcyBMYXRpbjFDb2RlYyBleHRlbmRzIEVuY29kaW5nIHsKICBmaW5hbCBib29sIF9hbGxvd0ludmFsaWQ7CgogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW0xhdGluMUNvZGVjXS4KICAvLy8KICAvLy8gSWYgW2FsbG93SW52YWxpZF0gaXMgdHJ1ZSwgdGhlIFtkZWNvZGVdIG1ldGhvZCBhbmQgdGhlIGNvbnZlcnRlcgogIC8vLyByZXR1cm5lZCBieSBbZGVjb2Rlcl0gd2lsbCBkZWZhdWx0IHRvIGFsbG93aW5nIGludmFsaWQgdmFsdWVzLiBJbnZhbGlkCiAgLy8vIHZhbHVlcyBhcmUgZGVjb2RlZCBpbnRvIHRoZSBVbmljb2RlIFJlcGxhY2VtZW50IGNoYXJhY3RlciAoVStGRkZEKS4KICAvLy8gQ2FsbHMgdG8gdGhlIFtkZWNvZGVdIG1ldGhvZCBjYW4gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0LgogIC8vLwogIC8vLyBFbmNvZGVycyB3aWxsIG5vdCBhY2NlcHQgaW52YWxpZCAobm9uIExhdGluLTEpIGNoYXJhY3RlcnMuCiAgY29uc3QgTGF0aW4xQ29kZWMoe2Jvb2wgYWxsb3dJbnZhbGlkID0gZmFsc2V9KSA6IF9hbGxvd0ludmFsaWQgPSBhbGxvd0ludmFsaWQ7CgogIC8vLyBUaGUgbmFtZSBvZiB0aGlzIGNvZGVjLCAiaXNvLTg4NTktMSIuCiAgU3RyaW5nIGdldCBuYW1lID0+ICJpc28tODg1OS0xIjsKCiAgVWludDhMaXN0IGVuY29kZShTdHJpbmcgc291cmNlKSA9PiBlbmNvZGVyLmNvbnZlcnQoc291cmNlKTsKCiAgLy8vIERlY29kZXMgdGhlIExhdGluLTEgW2J5dGVzXSAoYSBsaXN0IG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKSB0byB0aGUKICAvLy8gY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIFtieXRlc10gY29udGFpbnMgdmFsdWVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcmFuZ2UgMCAuLiAyNTUsIHRoZSBkZWNvZGVyCiAgLy8vIHdpbGwgZXZlbnR1YWxseSB0aHJvdyBhIFtGb3JtYXRFeGNlcHRpb25dLgogIC8vLwogIC8vLyBJZiBbYWxsb3dJbnZhbGlkXSBpcyBub3QgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSB1c2VkIHRvIGNyZWF0ZQogIC8vLyB0aGlzIFtMYXRpbjFDb2RlY10uCiAgU3RyaW5nIGRlY29kZShMaXN0PGludD4gYnl0ZXMsIHtib29sIGFsbG93SW52YWxpZH0pIHsKICAgIGFsbG93SW52YWxpZCA/Pz0gX2FsbG93SW52YWxpZDsKICAgIGlmIChhbGxvd0ludmFsaWQpIHsKICAgICAgcmV0dXJuIGNvbnN0IExhdGluMURlY29kZXIoYWxsb3dJbnZhbGlkOiB0cnVlKS5jb252ZXJ0KGJ5dGVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjb25zdCBMYXRpbjFEZWNvZGVyKGFsbG93SW52YWxpZDogZmFsc2UpLmNvbnZlcnQoYnl0ZXMpOwogICAgfQogIH0KCiAgTGF0aW4xRW5jb2RlciBnZXQgZW5jb2RlciA9PiBjb25zdCBMYXRpbjFFbmNvZGVyKCk7CgogIExhdGluMURlY29kZXIgZ2V0IGRlY29kZXIgPT4gX2FsbG93SW52YWxpZAogICAgICA/IGNvbnN0IExhdGluMURlY29kZXIoYWxsb3dJbnZhbGlkOiB0cnVlKQogICAgICA6IGNvbnN0IExhdGluMURlY29kZXIoYWxsb3dJbnZhbGlkOiBmYWxzZSk7Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIHN0cmluZ3Mgb2Ygb25seSBJU08gTGF0aW4tMSBjaGFyYWN0ZXJzIHRvIGJ5dGVzLgpjbGFzcyBMYXRpbjFFbmNvZGVyIGV4dGVuZHMgX1VuaWNvZGVTdWJzZXRFbmNvZGVyIHsKICBjb25zdCBMYXRpbjFFbmNvZGVyKCkgOiBzdXBlcihfbGF0aW4xTWFzayk7Cn0KCi8vLyBUaGlzIGNsYXNzIGNvbnZlcnRzIExhdGluLTEgYnl0ZXMgKGxpc3RzIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKQovLy8gdG8gYSBzdHJpbmcuCmNsYXNzIExhdGluMURlY29kZXIgZXh0ZW5kcyBfVW5pY29kZVN1YnNldERlY29kZXIgewogIC8vLyBJbnN0YW50aWF0ZXMgYSBuZXcgW0xhdGluMURlY29kZXJdLgogIC8vLwogIC8vLyBUaGUgb3B0aW9uYWwgW2FsbG93SW52YWxpZF0gYXJndW1lbnQgZGVmaW5lcyBob3cgW2NvbnZlcnRdIGRlYWxzCiAgLy8vIHdpdGggaW52YWxpZCBieXRlcy4KICAvLy8KICAvLy8gSWYgaXQgaXMgYHRydWVgLCBbY29udmVydF0gcmVwbGFjZXMgaW52YWxpZCBieXRlcyB3aXRoIHRoZSBVbmljb2RlCiAgLy8vIFJlcGxhY2VtZW50IGNoYXJhY3RlciBgVStGRkZEYCAo77+9KS4KICAvLy8gT3RoZXJ3aXNlIGl0IHRocm93cyBhIFtGb3JtYXRFeGNlcHRpb25dLgogIGNvbnN0IExhdGluMURlY29kZXIoe2Jvb2wgYWxsb3dJbnZhbGlkID0gZmFsc2V9KQogICAgICA6IHN1cGVyKGFsbG93SW52YWxpZCwgX2xhdGluMU1hc2spOwoKICAvLy8gU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBUaGUgY29udmVydGVyIHdvcmtzIG1vcmUgZWZmaWNpZW50bHkgaWYgdGhlIGdpdmVuIFtzaW5rXSBpcyBhCiAgLy8vIFtTdHJpbmdDb252ZXJzaW9uU2lua10uCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0cmluZ1Npbms7CiAgICBpZiAoc2luayBpcyBTdHJpbmdDb252ZXJzaW9uU2luaykgewogICAgICBzdHJpbmdTaW5rID0gc2luazsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmluZ1NpbmsgPSBTdHJpbmdDb252ZXJzaW9uU2luay5mcm9tKHNpbmspOwogICAgfQogICAgLy8gVE9ETyhscm4pOiBVc2Ugc3RyaW5nU2luay5hc1V0ZjE2U2luaygpIGlmIGl0IGJlY29tZXMgYXZhaWxhYmxlLgogICAgaWYgKCFfYWxsb3dJbnZhbGlkKSByZXR1cm4gX0xhdGluMURlY29kZXJTaW5rKHN0cmluZ1NpbmspOwogICAgcmV0dXJuIF9MYXRpbjFBbGxvd0ludmFsaWREZWNvZGVyU2luayhzdHJpbmdTaW5rKTsKICB9Cn0KCmNsYXNzIF9MYXRpbjFEZWNvZGVyU2luayBleHRlbmRzIEJ5dGVDb252ZXJzaW9uU2lua0Jhc2UgewogIFN0cmluZ0NvbnZlcnNpb25TaW5rIF9zaW5rOwogIF9MYXRpbjFEZWNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9zaW5rLmNsb3NlKCk7CiAgICBfc2luayA9IG51bGw7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gc291cmNlKSB7CiAgICBhZGRTbGljZShzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIGZhbHNlKTsKICB9CgogIHZvaWQgX2FkZFNsaWNlVG9TaW5rKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIC8vIElmIF9zaW5rIHdhcyBhIFVURi0xNiBjb252ZXJzaW9uIHNpbmssIGp1c3QgYWRkIHRoZSBzbGljZSBkaXJlY3RseSB3aXRoCiAgICAvLyBfc2luay5hZGRTbGljZShzb3VyY2UsIHN0YXJ0LCBlbmQsIGlzTGFzdCkuCiAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBhbiBtb2RlcmF0ZWx5IHN0dXBpZCB3b3JrYXJvdW5kIHVudGlsIGEgcmVhbAogICAgLy8gc29sdXRpb24gY2FuIGJlIG1hZGUuCiAgICBfc2luay5hZGQoU3RyaW5nLmZyb21DaGFyQ29kZXMoc291cmNlLCBzdGFydCwgZW5kKSk7CiAgICBpZiAoaXNMYXN0KSBjbG9zZSgpOwogIH0KCiAgdm9pZCBhZGRTbGljZShMaXN0PGludD4gc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIGJvb2wgaXNMYXN0KSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBzb3VyY2UubGVuZ3RoKTsKICAgIGlmIChzdGFydCA9PSBlbmQpIHJldHVybjsKICAgIGlmIChzb3VyY2UgaXMhIFVpbnQ4TGlzdCkgewogICAgICAvLyBMaXN0IG1heSBjb250YWluIHZhbHVlIG91dHNpZGUgb2YgdGhlIDAuLjI1NSByYW5nZS4gSWYgc28sIHRocm93LgogICAgICAvLyBUZWNobmljYWxseSwgd2UgY291bGQgZXhjdXNlIFVpbnQ4Q2xhbXBlZExpc3QgYXMgd2VsbCwgYnV0IGl0IHVubGlrZWx5CiAgICAgIC8vIHRvIGJlIHJlbGV2YW50LgogICAgICBfY2hlY2tWYWxpZExhdGluMShzb3VyY2UsIHN0YXJ0LCBlbmQpOwogICAgfQogICAgX2FkZFNsaWNlVG9TaW5rKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICB9CgogIHN0YXRpYyB2b2lkIF9jaGVja1ZhbGlkTGF0aW4xKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgdmFyIG1hc2sgPSAwOwogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgbWFzayB8PSBzb3VyY2VbaV07CiAgICB9CiAgICBpZiAobWFzayA+PSAwICYmIG1hc2sgPD0gX2xhdGluMU1hc2spIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3JlcG9ydEludmFsaWRMYXRpbjEoc291cmNlLCBzdGFydCwgZW5kKTsgLy8gQWx3YXlzIHRocm93cy4KICB9CgogIHN0YXRpYyB2b2lkIF9yZXBvcnRJbnZhbGlkTGF0aW4xKExpc3Q8aW50PiBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi1MYXRpbi0xIGNoYXJhY3RlciBjb2RlLgogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBzb3VyY2VbaV07CiAgICAgIGlmIChjaGFyIDwgMCB8fCBjaGFyID4gX2xhdGluMU1hc2spIHsKICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJTb3VyY2UgY29udGFpbnMgbm9uLUxhdGluLTEgY2hhcmFjdGVycy4iLCBzb3VyY2UsIGkpOwogICAgICB9CiAgICB9CiAgICAvLyBVbnJlYWNoYWJsZSAtIHdlIG9ubHkgY2FsbCB0aGUgZnVuY3Rpb24gaWYgdGhlIGxvb3AgYWJvdmUgdGhyb3dzLgogICAgYXNzZXJ0KGZhbHNlKTsKICB9Cn0KCmNsYXNzIF9MYXRpbjFBbGxvd0ludmFsaWREZWNvZGVyU2luayBleHRlbmRzIF9MYXRpbjFEZWNvZGVyU2luayB7CiAgX0xhdGluMUFsbG93SW52YWxpZERlY29kZXJTaW5rKFN0cmluZ0NvbnZlcnNpb25TaW5rIHNpbmspIDogc3VwZXIoc2luayk7CgogIHZvaWQgYWRkU2xpY2UoTGlzdDxpbnQ+IHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICB2YXIgY2hhciA9IHNvdXJjZVtpXTsKICAgICAgaWYgKGNoYXIgPiBfbGF0aW4xTWFzayB8fCBjaGFyIDwgMCkgewogICAgICAgIGlmIChpID4gc3RhcnQpIF9hZGRTbGljZVRvU2luayhzb3VyY2UsIHN0YXJ0LCBpLCBmYWxzZSk7CiAgICAgICAgLy8gQWRkIFVURi04IGVuY29kaW5nIG9mIFUrRkZGRC4KICAgICAgICBfYWRkU2xpY2VUb1NpbmsoY29uc3QgWzB4RkZGRF0sIDAsIDEsIGZhbHNlKTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICB9CiAgICB9CiAgICBpZiAoc3RhcnQgPCBlbmQpIHsKICAgICAgX2FkZFNsaWNlVG9TaW5rKHNvdXJjZSwgc3RhcnQsIGVuZCwgaXNMYXN0KTsKICAgIH0KICAgIGlmIChpc0xhc3QpIHsKICAgICAgY2xvc2UoKTsKICAgIH0KICB9Cn0KgLgATk48ARYBRARODwQODC8/QQgqAR4BSiolHAEoBkdNSj4GQVEBLCMBPgFNHAZRMQZRGjgkGEUNRgYEATYBLTAyAgFJNC4CAUkRNCoGRxoGSSovMyoBIwZEHkElKBkNNAZIPzcEAgE6HiIBERMSBAEfLwQBTE8zRh05GQQBRUEeIEtQGS0GMQQBSBIoGQYsDgZABAFLPygcLB9DCAZJEwQCAUJLAUU7KBwsQSk2FwgGFzMGEg8GBAIBGGRhcnQ6Y29udmVydC9sYXRpbjEuZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29udmVydC91dGYuZGFydMAATocvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvbnZlcnQ7CgovLy8gVGhlIFVuaWNvZGUgUmVwbGFjZW1lbnQgY2hhcmFjdGVyIGBVK0ZGRkRgICjvv70pLgpjb25zdCBpbnQgdW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZSA9IDB4RkZGRDsKCi8vLyBUaGUgVW5pY29kZSBCeXRlIE9yZGVyIE1hcmtlciAoQk9NKSBjaGFyYWN0ZXIgYFUrRkVGRmAuCmNvbnN0IGludCB1bmljb2RlQm9tQ2hhcmFjdGVyUnVuZSA9IDB4RkVGRjsKCi8vLyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW1V0ZjhDb2RlY10uCi8vLwovLy8gVGhpcyBpbnN0YW5jZSBwcm92aWRlcyBhIGNvbnZlbmllbnQgYWNjZXNzIHRvIHRoZSBtb3N0IGNvbW1vbiBVVEYtOAovLy8gdXNlIGNhc2VzLgovLy8KLy8vIEV4YW1wbGVzOgovLy8KLy8vICAgICB2YXIgZW5jb2RlZCA9IHV0ZjguZW5jb2RlKCLDjsOxxaPDqXLDscOlxaPDrsO2w7HDpcS8w67FvsOlxaPDruG7ncOxIik7Ci8vLyAgICAgdmFyIGRlY29kZWQgPSB1dGY4LmRlY29kZShbMHg2MiwgMHg2YywgMHhjMywgMHhhNSwgMHg2MiwgMHhjMywgMHhhNiwKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcyLCAweDY3LCAweDcyLCAweGMzLCAweGI4LCAweDY0XSk7CmNvbnN0IFV0ZjhDb2RlYyB1dGY4ID0gVXRmOENvZGVjKCk7CgovLy8gQSBbVXRmOENvZGVjXSBlbmNvZGVzIHN0cmluZ3MgdG8gdXRmLTggY29kZSB1bml0cyAoYnl0ZXMpIGFuZCBkZWNvZGVzCi8vLyBVVEYtOCBjb2RlIHVuaXRzIHRvIHN0cmluZ3MuCmNsYXNzIFV0ZjhDb2RlYyBleHRlbmRzIEVuY29kaW5nIHsKICBmaW5hbCBib29sIF9hbGxvd01hbGZvcm1lZDsKCiAgLy8vIEluc3RhbnRpYXRlcyBhIG5ldyBbVXRmOENvZGVjXS4KICAvLy8KICAvLy8gVGhlIG9wdGlvbmFsIFthbGxvd01hbGZvcm1lZF0gYXJndW1lbnQgZGVmaW5lcyBob3cgW2RlY29kZXJdIChhbmQgW2RlY29kZV0pCiAgLy8vIGRlYWwgd2l0aCBpbnZhbGlkIG9yIHVudGVybWluYXRlZCBjaGFyYWN0ZXIgc2VxdWVuY2VzLgogIC8vLwogIC8vLyBJZiBpdCBpcyBgdHJ1ZWAgKGFuZCBub3Qgb3ZlcnJpZGRlbiBhdCB0aGUgbWV0aG9kIGludm9jYXRpb24pIFtkZWNvZGVdIGFuZAogIC8vLyB0aGUgW2RlY29kZXJdIHJlcGxhY2UgaW52YWxpZCAob3IgdW50ZXJtaW5hdGVkKSBvY3RldAogIC8vLyBzZXF1ZW5jZXMgd2l0aCB0aGUgVW5pY29kZSBSZXBsYWNlbWVudCBjaGFyYWN0ZXIgYFUrRkZGRGAgKO+/vSkuIE90aGVyd2lzZQogIC8vLyB0aGV5IHRocm93IGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgY29uc3QgVXRmOENvZGVjKHtib29sIGFsbG93TWFsZm9ybWVkID0gZmFsc2V9KQogICAgICA6IF9hbGxvd01hbGZvcm1lZCA9IGFsbG93TWFsZm9ybWVkOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhpcyBjb2RlYywgInV0Zi04Ii4KICBTdHJpbmcgZ2V0IG5hbWUgPT4gInV0Zi04IjsKCiAgLy8vIERlY29kZXMgdGhlIFVURi04IFtjb2RlVW5pdHNdIChhIGxpc3Qgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMpIHRvIHRoZQogIC8vLyBjb3JyZXNwb25kaW5nIHN0cmluZy4KICAvLy8KICAvLy8gSWYgdGhlIFtjb2RlVW5pdHNdIHN0YXJ0IHdpdGggdGhlIGVuY29kaW5nIG9mIGEKICAvLy8gW3VuaWNvZGVCb21DaGFyYWN0ZXJSdW5lXSwgdGhhdCBjaGFyYWN0ZXIgaXMgZGlzY2FyZGVkLgogIC8vLwogIC8vLyBJZiBbYWxsb3dNYWxmb3JtZWRdIGlzIGB0cnVlYCB0aGUgZGVjb2RlciByZXBsYWNlcyBpbnZhbGlkIChvcgogIC8vLyB1bnRlcm1pbmF0ZWQpIGNoYXJhY3RlciBzZXF1ZW5jZXMgd2l0aCB0aGUgVW5pY29kZSBSZXBsYWNlbWVudCBjaGFyYWN0ZXIKICAvLy8gYFUrRkZGRGAgKO+/vSkuIE90aGVyd2lzZSBpdCB0aHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXS4KICAvLy8KICAvLy8gSWYgW2FsbG93TWFsZm9ybWVkXSBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIHRoZSBgYWxsb3dNYWxmb3JtZWRgIHRoYXQKICAvLy8gd2FzIHVzZWQgdG8gaW5zdGFudGlhdGUgYHRoaXNgLgogIFN0cmluZyBkZWNvZGUoTGlzdDxpbnQ+IGNvZGVVbml0cywge2Jvb2wgYWxsb3dNYWxmb3JtZWR9KSB7CiAgICBhbGxvd01hbGZvcm1lZCA/Pz0gX2FsbG93TWFsZm9ybWVkOwogICAgcmV0dXJuIFV0ZjhEZWNvZGVyKGFsbG93TWFsZm9ybWVkOiBhbGxvd01hbGZvcm1lZCkuY29udmVydChjb2RlVW5pdHMpOwogIH0KCiAgVXRmOEVuY29kZXIgZ2V0IGVuY29kZXIgPT4gY29uc3QgVXRmOEVuY29kZXIoKTsKICBVdGY4RGVjb2RlciBnZXQgZGVjb2RlciB7CiAgICByZXR1cm4gVXRmOERlY29kZXIoYWxsb3dNYWxmb3JtZWQ6IF9hbGxvd01hbGZvcm1lZCk7CiAgfQp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBzdHJpbmdzIHRvIHRoZWlyIFVURi04IGNvZGUgdW5pdHMgKGEgbGlzdCBvZgovLy8gdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMpLgpjbGFzcyBVdGY4RW5jb2RlciBleHRlbmRzIENvbnZlcnRlcjxTdHJpbmcsIExpc3Q8aW50Pj4gewogIGNvbnN0IFV0ZjhFbmNvZGVyKCk7CgogIC8vLyBDb252ZXJ0cyBbc3RyaW5nXSB0byBpdHMgVVRGLTggY29kZSB1bml0cyAoYSBsaXN0IG9mCiAgLy8vIHVuc2lnbmVkIDgtYml0IGludGVnZXJzKS4KICAvLy8KICAvLy8gSWYgW3N0YXJ0XSBhbmQgW2VuZF0gYXJlIHByb3ZpZGVkLCBvbmx5IHRoZSBzdWJzdHJpbmcKICAvLy8gYHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZClgIGlzIGNvbnZlcnRlZC4KICBMaXN0PGludD4gY29udmVydChTdHJpbmcgc3RyaW5nLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pIHsKICAgIHZhciBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgc3RyaW5nTGVuZ3RoKTsKICAgIHZhciBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIFVpbnQ4TGlzdCgwKTsKICAgIC8vIENyZWF0ZSBhIG5ldyBlbmNvZGVyIHdpdGggYSBsZW5ndGggdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2guCiAgICAvLyBBIHNpbmdsZSBjb2RlIHVuaXQgdXNlcyBhdCBtb3N0IDMgYnl0ZXMsIGEgc3Vycm9nYXRlIHBhaXIgYXQgbW9zdCA0LgogICAgdmFyIGVuY29kZXIgPSBfVXRmOEVuY29kZXIud2l0aEJ1ZmZlclNpemUobGVuZ3RoICogMyk7CiAgICB2YXIgZW5kUG9zaXRpb24gPSBlbmNvZGVyLl9maWxsQnVmZmVyKHN0cmluZywgc3RhcnQsIGVuZCk7CiAgICBhc3NlcnQoZW5kUG9zaXRpb24gPj0gZW5kIC0gMSk7CiAgICBpZiAoZW5kUG9zaXRpb24gIT0gZW5kKSB7CiAgICAgIC8vIEVuY29kaW5nIHNraXBwZWQgdGhlIGxhc3QgY29kZSB1bml0LgogICAgICAvLyBUaGF0IGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgbGFzdCBjb2RlIHVuaXQgaXMgYSBsZWFkc3Vycm9nYXRlLgogICAgICAvLyBGb3JjZSBlbmNvZGluZyBvZiB0aGUgbGVhZCBzdXJyb2dhdGUgYnkgaXRzZWxmLgogICAgICB2YXIgbGFzdENvZGVVbml0ID0gc3RyaW5nLmNvZGVVbml0QXQoZW5kIC0gMSk7CiAgICAgIGFzc2VydChfaXNMZWFkU3Vycm9nYXRlKGxhc3RDb2RlVW5pdCkpOwogICAgICAvLyBXZSB1c2UgYSBub24tc3Vycm9nYXRlIGFzIGBuZXh0VW5pdGAgc28gdGhhdCBfd3JpdGVTdXJyb2dhdGUganVzdAogICAgICAvLyB3cml0ZXMgdGhlIGxlYWQtc3Vycm9nYXRlLgogICAgICB2YXIgd2FzQ29tYmluZWQgPSBlbmNvZGVyLl93cml0ZVN1cnJvZ2F0ZShsYXN0Q29kZVVuaXQsIDApOwogICAgICBhc3NlcnQoIXdhc0NvbWJpbmVkKTsKICAgIH0KICAgIHJldHVybiBlbmNvZGVyLl9idWZmZXIuc3VibGlzdCgwLCBlbmNvZGVyLl9idWZmZXJJbmRleCk7CiAgfQoKICAvLy8gU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBUaGUgY29udmVydGVyIHdvcmtzIG1vcmUgZWZmaWNpZW50bHkgaWYgdGhlIGdpdmVuIFtzaW5rXSBpcyBhCiAgLy8vIFtCeXRlQ29udmVyc2lvblNpbmtdLgogIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxMaXN0PGludD4+IHNpbmspIHsKICAgIHJldHVybiBfVXRmOEVuY29kZXJTaW5rKAogICAgICAgIHNpbmsgaXMgQnl0ZUNvbnZlcnNpb25TaW5rID8gc2luayA6IEJ5dGVDb252ZXJzaW9uU2luay5mcm9tKHNpbmspKTsKICB9CgogIC8vIE92ZXJyaWRlIHRoZSBiYXNlLWNsYXNzZXMgYmluZCwgdG8gcHJvdmlkZSBhIGJldHRlciB0eXBlLgogIFN0cmVhbTxMaXN0PGludD4+IGJpbmQoU3RyZWFtPFN0cmluZz4gc3RyZWFtKSA9PiBzdXBlci5iaW5kKHN0cmVhbSk7Cn0KCi8vLyBUaGlzIGNsYXNzIGVuY29kZXMgU3RyaW5ncyB0byBVVEYtOCBjb2RlIHVuaXRzICh1bnNpZ25lZCA4IGJpdCBpbnRlZ2VycykuCi8vIFRPRE8oZmxvaXRzY2gpOiBtYWtlIHRoaXMgY2xhc3MgcHVibGljLgpjbGFzcyBfVXRmOEVuY29kZXIgewogIGludCBfY2FycnkgPSAwOwogIGludCBfYnVmZmVySW5kZXggPSAwOwogIGZpbmFsIExpc3Q8aW50PiBfYnVmZmVyOwoKICBzdGF0aWMgY29uc3QgX0RFRkFVTFRfQllURV9CVUZGRVJfU0laRSA9IDEwMjQ7CgogIF9VdGY4RW5jb2RlcigpIDogdGhpcy53aXRoQnVmZmVyU2l6ZShfREVGQVVMVF9CWVRFX0JVRkZFUl9TSVpFKTsKCiAgX1V0ZjhFbmNvZGVyLndpdGhCdWZmZXJTaXplKGludCBidWZmZXJTaXplKQogICAgICA6IF9idWZmZXIgPSBfY3JlYXRlQnVmZmVyKGJ1ZmZlclNpemUpOwoKICAvLy8gQWxsb3cgYW4gaW1wbGVtZW50YXRpb24gdG8gcGljayB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IG9mIHN0b3JpbmcgYnl0ZXMuCiAgc3RhdGljIExpc3Q8aW50PiBfY3JlYXRlQnVmZmVyKGludCBzaXplKSA9PiBVaW50OExpc3Qoc2l6ZSk7CgogIC8vLyBUcmllcyB0byBjb21iaW5lIHRoZSBnaXZlbiBbbGVhZGluZ1N1cnJvZ2F0ZV0gd2l0aCB0aGUgW25leHRDb2RlVW5pdF0gYW5kCiAgLy8vIHdyaXRlcyBpdCB0byBbX2J1ZmZlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgW25leHRDb2RlVW5pdF0gd2FzIGNvbWJpbmVkIHdpdGggdGhlCiAgLy8vIFtsZWFkaW5nU3Vycm9nYXRlXS4gSWYgaXQgd2Fzbid0IHRoZW4gbmV4dENvZGVVbml0IHdhcyBub3QgYSB0cmFpbGluZwogIC8vLyBzdXJyb2dhdGUgYW5kIGhhcyBub3QgYmVlbiB3cml0dGVuIHlldC4KICAvLy8KICAvLy8gSXQgaXMgc2FmZSB0byBwYXNzIDAgZm9yIFtuZXh0Q29kZVVuaXRdIGluIHdoaWNoIGNhc2Ugb25seSB0aGUgbGVhZGluZwogIC8vLyBzdXJyb2dhdGUgaXMgd3JpdHRlbi4KICBib29sIF93cml0ZVN1cnJvZ2F0ZShpbnQgbGVhZGluZ1N1cnJvZ2F0ZSwgaW50IG5leHRDb2RlVW5pdCkgewogICAgaWYgKF9pc1RhaWxTdXJyb2dhdGUobmV4dENvZGVVbml0KSkgewogICAgICB2YXIgcnVuZSA9IF9jb21iaW5lU3Vycm9nYXRlUGFpcihsZWFkaW5nU3Vycm9nYXRlLCBuZXh0Q29kZVVuaXQpOwogICAgICAvLyBJZiB0aGUgcnVuZSBpcyBlbmNvZGVkIHdpdGggMiBjb2RlLXVuaXRzIHRoZW4gaXQgbXVzdCBiZSBlbmNvZGVkCiAgICAgIC8vIHdpdGggNCBieXRlcyBpbiBVVEYtOC4KICAgICAgYXNzZXJ0KHJ1bmUgPiBfVEhSRUVfQllURV9MSU1JVCk7CiAgICAgIGFzc2VydChydW5lIDw9IF9GT1VSX0JZVEVfTElNSVQpOwogICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4RjAgfCAocnVuZSA+PiAxOCk7CiAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8ICgocnVuZSA+PiAxMikgJiAweDNmKTsKICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKChydW5lID4+IDYpICYgMHgzZik7CiAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHg4MCB8IChydW5lICYgMHgzZik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IGFsbG93IHRvIHRocm93IG9uIG1hbGZvcm1lZCBzdHJpbmdzLgogICAgICAvLyBFbmNvZGUgdGhlIGhhbGYtc3Vycm9nYXRlIGRpcmVjdGx5IGludG8gVVRGLTguIFRoaXMgeWllbGRzCiAgICAgIC8vIGludmFsaWQgVVRGLTgsIGJ1dCB3ZSBzdGFydGVkIG91dCB3aXRoIGludmFsaWQgVVRGLTE2LgoKICAgICAgLy8gU3Vycm9nYXRlcyBhcmUgYWx3YXlzIGVuY29kZWQgaW4gMyBieXRlcyBpbiBVVEYtOC4KICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweEUwIHwgKGxlYWRpbmdTdXJyb2dhdGUgPj4gMTIpOwogICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAoKGxlYWRpbmdTdXJyb2dhdGUgPj4gNikgJiAweDNmKTsKICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKGxlYWRpbmdTdXJyb2dhdGUgJiAweDNmKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgLy8vIEZpbGxzIHRoZSBbX2J1ZmZlcl0gd2l0aCBhcyBtYW55IGNoYXJhY3RlcnMgYXMgcG9zc2libGUuCiAgLy8vCiAgLy8vIERvZXMgbm90IGVuY29kZSBhbnkgdHJhaWxpbmcgbGVhZC1zdXJyb2dhdGUuIFRoaXMgbXVzdCBiZSBkb25lIGJ5IHRoZQogIC8vLyBjYWxsZXIuCiAgLy8vCiAgLy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcuIFRoZSByZXR1cm5lZCBpbmRleCBwb2ludHMgdG8gdGhlCiAgLy8vIGZpcnN0IGNvZGUgdW5pdCB0aGF0IGhhc24ndCBiZWVuIGVuY29kZWQuCiAgaW50IF9maWxsQnVmZmVyKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaWYgKHN0YXJ0ICE9IGVuZCAmJiBfaXNMZWFkU3Vycm9nYXRlKHN0ci5jb2RlVW5pdEF0KGVuZCAtIDEpKSkgewogICAgICAvLyBEb24ndCBoYW5kbGUgYSB0cmFpbGluZyBsZWFkLXN1cnJvZ2F0ZSBpbiB0aGlzIGxvb3AuIFRoZSBjYWxsZXIgaGFzCiAgICAgIC8vIHRvIGRlYWwgd2l0aCB0aG9zZS4KICAgICAgZW5kLS07CiAgICB9CiAgICBpbnQgc3RyaW5nSW5kZXg7CiAgICBmb3IgKHN0cmluZ0luZGV4ID0gc3RhcnQ7IHN0cmluZ0luZGV4IDwgZW5kOyBzdHJpbmdJbmRleCsrKSB7CiAgICAgIHZhciBjb2RlVW5pdCA9IHN0ci5jb2RlVW5pdEF0KHN0cmluZ0luZGV4KTsKICAgICAgLy8gQVNDSUkgaGFzIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGluIFVURi04IGFuZCBVVEYtMTYuCiAgICAgIGlmIChjb2RlVW5pdCA8PSBfT05FX0JZVEVfTElNSVQpIHsKICAgICAgICBpZiAoX2J1ZmZlckluZGV4ID49IF9idWZmZXIubGVuZ3RoKSBicmVhazsKICAgICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IGNvZGVVbml0OwogICAgICB9IGVsc2UgaWYgKF9pc0xlYWRTdXJyb2dhdGUoY29kZVVuaXQpKSB7CiAgICAgICAgaWYgKF9idWZmZXJJbmRleCArIDMgPj0gX2J1ZmZlci5sZW5ndGgpIGJyZWFrOwogICAgICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBzYWZlIHRvIHJlYWQgdGhlIG5leHQgY29kZSB1bml0LiBXZSBkZWNyZW1lbnRlZAogICAgICAgIC8vIFtlbmRdIGFib3ZlIHdoZW4gdGhlIGxhc3QgdmFsaWQgY29kZSB1bml0IHdhcyBhIGxlYWRpbmcgc3Vycm9nYXRlLgogICAgICAgIHZhciBuZXh0Q29kZVVuaXQgPSBzdHIuY29kZVVuaXRBdChzdHJpbmdJbmRleCArIDEpOwogICAgICAgIHZhciB3YXNDb21iaW5lZCA9IF93cml0ZVN1cnJvZ2F0ZShjb2RlVW5pdCwgbmV4dENvZGVVbml0KTsKICAgICAgICBpZiAod2FzQ29tYmluZWQpIHN0cmluZ0luZGV4Kys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHJ1bmUgPSBjb2RlVW5pdDsKICAgICAgICBpZiAocnVuZSA8PSBfVFdPX0JZVEVfTElNSVQpIHsKICAgICAgICAgIGlmIChfYnVmZmVySW5kZXggKyAxID49IF9idWZmZXIubGVuZ3RoKSBicmVhazsKICAgICAgICAgIF9idWZmZXJbX2J1ZmZlckluZGV4KytdID0gMHhDMCB8IChydW5lID4+IDYpOwogICAgICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKHJ1bmUgJiAweDNmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXNzZXJ0KHJ1bmUgPD0gX1RIUkVFX0JZVEVfTElNSVQpOwogICAgICAgICAgaWYgKF9idWZmZXJJbmRleCArIDIgPj0gX2J1ZmZlci5sZW5ndGgpIGJyZWFrOwogICAgICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweEUwIHwgKHJ1bmUgPj4gMTIpOwogICAgICAgICAgX2J1ZmZlcltfYnVmZmVySW5kZXgrK10gPSAweDgwIHwgKChydW5lID4+IDYpICYgMHgzZik7CiAgICAgICAgICBfYnVmZmVyW19idWZmZXJJbmRleCsrXSA9IDB4ODAgfCAocnVuZSAmIDB4M2YpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0cmluZ0luZGV4OwogIH0KfQoKLy8vIFRoaXMgY2xhc3MgZW5jb2RlcyBjaHVua2VkIHN0cmluZ3MgdG8gVVRGLTggY29kZSB1bml0cyAodW5zaWduZWQgOC1iaXQKLy8vIGludGVnZXJzKS4KY2xhc3MgX1V0ZjhFbmNvZGVyU2luayBleHRlbmRzIF9VdGY4RW5jb2RlciB3aXRoIFN0cmluZ0NvbnZlcnNpb25TaW5rTWl4aW4gewogIGZpbmFsIEJ5dGVDb252ZXJzaW9uU2luayBfc2luazsKCiAgX1V0ZjhFbmNvZGVyU2luayh0aGlzLl9zaW5rKTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChfY2FycnkgIT0gMCkgewogICAgICAvLyBhZGRTbGljZSB3aWxsIGNhbGwgY2xvc2UgYWdhaW4sIGJ1dCB0aGVuIHRoZSBjYXJyeSBtdXN0IGJlIGVxdWFsIHRvIDAuCiAgICAgIGFkZFNsaWNlKCIiLCAwLCAwLCB0cnVlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX3NpbmsuY2xvc2UoKTsKICB9CgogIHZvaWQgYWRkU2xpY2UoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgX2J1ZmZlckluZGV4ID0gMDsKCiAgICBpZiAoc3RhcnQgPT0gZW5kICYmICFpc0xhc3QpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChfY2FycnkgIT0gMCkgewogICAgICB2YXIgbmV4dENvZGVVbml0ID0gMDsKICAgICAgaWYgKHN0YXJ0ICE9IGVuZCkgewogICAgICAgIG5leHRDb2RlVW5pdCA9IHN0ci5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhc3NlcnQoaXNMYXN0KTsKICAgICAgfQogICAgICB2YXIgd2FzQ29tYmluZWQgPSBfd3JpdGVTdXJyb2dhdGUoX2NhcnJ5LCBuZXh0Q29kZVVuaXQpOwogICAgICAvLyBFaXRoZXIgd2UgZ290IGEgbm9uLWVtcHR5IHN0cmluZywgb3Igd2UgbXVzdCBub3QgaGF2ZSBiZWVuIGNvbWJpbmVkLgogICAgICBhc3NlcnQoIXdhc0NvbWJpbmVkIHx8IHN0YXJ0ICE9IGVuZCk7CiAgICAgIGlmICh3YXNDb21iaW5lZCkgc3RhcnQrKzsKICAgICAgX2NhcnJ5ID0gMDsKICAgIH0KICAgIGRvIHsKICAgICAgc3RhcnQgPSBfZmlsbEJ1ZmZlcihzdHIsIHN0YXJ0LCBlbmQpOwogICAgICB2YXIgaXNMYXN0U2xpY2UgPSBpc0xhc3QgJiYgKHN0YXJ0ID09IGVuZCk7CiAgICAgIGlmIChzdGFydCA9PSBlbmQgLSAxICYmIF9pc0xlYWRTdXJyb2dhdGUoc3RyLmNvZGVVbml0QXQoc3RhcnQpKSkgewogICAgICAgIGlmIChpc0xhc3QgJiYgX2J1ZmZlckluZGV4IDwgX2J1ZmZlci5sZW5ndGggLSAzKSB7CiAgICAgICAgICAvLyBUaGVyZSBpcyBzdGlsbCBzcGFjZSBmb3IgdGhlIGxhc3QgaW5jb21wbGV0ZSBzdXJyb2dhdGUuCiAgICAgICAgICAvLyBXZSB1c2UgYSBub24tc3Vycm9nYXRlIGFzIHNlY29uZCBhcmd1bWVudC4gVGhpcyB3YXkgdGhlCiAgICAgICAgICAvLyBmdW5jdGlvbiB3aWxsIGp1c3QgYWRkIHRoZSBzdXJyb2dhdGUtaGFsZiB0byB0aGUgYnVmZmVyLgogICAgICAgICAgdmFyIGhhc0JlZW5Db21iaW5lZCA9IF93cml0ZVN1cnJvZ2F0ZShzdHIuY29kZVVuaXRBdChzdGFydCksIDApOwogICAgICAgICAgYXNzZXJ0KCFoYXNCZWVuQ29tYmluZWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBPdGhlcndpc2Ugc3RvcmUgaXQgaW4gdGhlIGNhcnJ5LiBJZiBpc0xhc3QgaXMgdHJ1ZSwgdGhlbgogICAgICAgICAgLy8gY2xvc2Ugd2lsbCBmbHVzaCB0aGUgbGFzdCBjYXJyeS4KICAgICAgICAgIF9jYXJyeSA9IHN0ci5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgc3RhcnQrKzsKICAgICAgfQogICAgICBfc2luay5hZGRTbGljZShfYnVmZmVyLCAwLCBfYnVmZmVySW5kZXgsIGlzTGFzdFNsaWNlKTsKICAgICAgX2J1ZmZlckluZGV4ID0gMDsKICAgIH0gd2hpbGUgKHN0YXJ0IDwgZW5kKTsKICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQoKICAvLyBUT0RPKGZsb2l0c2NoKTogaW1wbGVtZW50IGFzVXRmOFNpbmsuIFNsaWd0aGx5IGNvbXBsaWNhdGVkIGJlY2F1c2UgaXQKICAvLyBuZWVkcyB0byBkZWFsIHdpdGggbWFsZm9ybWVkIGlucHV0Lgp9CgovLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBVVEYtOCBjb2RlIHVuaXRzIChsaXN0cyBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycykKLy8vIHRvIGEgc3RyaW5nLgpjbGFzcyBVdGY4RGVjb2RlciBleHRlbmRzIENvbnZlcnRlcjxMaXN0PGludD4sIFN0cmluZz4gewogIGZpbmFsIGJvb2wgX2FsbG93TWFsZm9ybWVkOwoKICAvLy8gSW5zdGFudGlhdGVzIGEgbmV3IFtVdGY4RGVjb2Rlcl0uCiAgLy8vCiAgLy8vIFRoZSBvcHRpb25hbCBbYWxsb3dNYWxmb3JtZWRdIGFyZ3VtZW50IGRlZmluZXMgaG93IFtjb252ZXJ0XSBkZWFscwogIC8vLyB3aXRoIGludmFsaWQgb3IgdW50ZXJtaW5hdGVkIGNoYXJhY3RlciBzZXF1ZW5jZXMuCiAgLy8vCiAgLy8vIElmIGl0IGlzIGB0cnVlYCBbY29udmVydF0gcmVwbGFjZXMgaW52YWxpZCAob3IgdW50ZXJtaW5hdGVkKSBjaGFyYWN0ZXIKICAvLy8gc2VxdWVuY2VzIHdpdGggdGhlIFVuaWNvZGUgUmVwbGFjZW1lbnQgY2hhcmFjdGVyIGBVK0ZGRkRgICjvv70pLiBPdGhlcndpc2UKICAvLy8gaXQgdGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgY29uc3QgVXRmOERlY29kZXIoe2Jvb2wgYWxsb3dNYWxmb3JtZWQgPSBmYWxzZX0pCiAgICAgIDogX2FsbG93TWFsZm9ybWVkID0gYWxsb3dNYWxmb3JtZWQ7CgogIC8vLyBDb252ZXJ0cyB0aGUgVVRGLTggW2NvZGVVbml0c10gKGEgbGlzdCBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycykgdG8gdGhlCiAgLy8vIGNvcnJlc3BvbmRpbmcgc3RyaW5nLgogIC8vLwogIC8vLyBVc2VzIHRoZSBjb2RlIHVuaXRzIGZyb20gW3N0YXJ0XSB0bywgYnV0IG5vIGluY2x1ZGluZywgW2VuZF0uCiAgLy8vIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBjb2RlVW5pdHMubGVuZ3RoYC4KICAvLy8KICAvLy8gSWYgdGhlIFtjb2RlVW5pdHNdIHN0YXJ0IHdpdGggdGhlIGVuY29kaW5nIG9mIGEKICAvLy8gW3VuaWNvZGVCb21DaGFyYWN0ZXJSdW5lXSwgdGhhdCBjaGFyYWN0ZXIgaXMgZGlzY2FyZGVkLgogIFN0cmluZyBjb252ZXJ0KExpc3Q8aW50PiBjb2RlVW5pdHMsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgLy8gQWxsb3cgdGhlIGltcGxlbWVudGF0aW9uIHRvIGludGVyY2VwdCBhbmQgc3BlY2lhbGl6ZSBiYXNlZCBvbiB0aGUgdHlwZQogICAgLy8gb2YgY29kZVVuaXRzLgogICAgdmFyIHJlc3VsdCA9IF9jb252ZXJ0SW50ZXJjZXB0ZWQoX2FsbG93TWFsZm9ybWVkLCBjb2RlVW5pdHMsIHN0YXJ0LCBlbmQpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIGxlbmd0aCA9IGNvZGVVbml0cy5sZW5ndGg7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOwoKICAgIC8vIEZhc3QgY2FzZSBmb3IgQVNDSUkgc3RyaW5ncyBhdm9pZHMgU3RyaW5nQnVmZmVyL19VdGY4RGVjb2Rlci4KICAgIGludCBvbmVCeXRlcyA9IF9zY2FuT25lQnl0ZUNoYXJhY3RlcnMoY29kZVVuaXRzLCBzdGFydCwgZW5kKTsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7CiAgICBib29sIGlzRmlyc3RDaGFyYWN0ZXIgPSB0cnVlOwogICAgaWYgKG9uZUJ5dGVzID4gMCkgewogICAgICB2YXIgZmlyc3RQYXJ0ID0gU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZVVuaXRzLCBzdGFydCwgc3RhcnQgKyBvbmVCeXRlcyk7CiAgICAgIHN0YXJ0ICs9IG9uZUJ5dGVzOwogICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgICAgcmV0dXJuIGZpcnN0UGFydDsKICAgICAgfQogICAgICBidWZmZXIgPSBTdHJpbmdCdWZmZXIoZmlyc3RQYXJ0KTsKICAgICAgaXNGaXJzdENoYXJhY3RlciA9IGZhbHNlOwogICAgfQoKICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICB2YXIgZGVjb2RlciA9IF9VdGY4RGVjb2RlcihidWZmZXIsIF9hbGxvd01hbGZvcm1lZCk7CiAgICBkZWNvZGVyLl9pc0ZpcnN0Q2hhcmFjdGVyID0gaXNGaXJzdENoYXJhY3RlcjsKICAgIGRlY29kZXIuY29udmVydChjb2RlVW5pdHMsIHN0YXJ0LCBlbmQpOwogICAgZGVjb2Rlci5mbHVzaChjb2RlVW5pdHMsIGVuZCk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICAvLy8gU3RhcnRzIGEgY2h1bmtlZCBjb252ZXJzaW9uLgogIC8vLwogIC8vLyBUaGUgY29udmVydGVyIHdvcmtzIG1vcmUgZWZmaWNpZW50bHkgaWYgdGhlIGdpdmVuIFtzaW5rXSBpcyBhCiAgLy8vIFtTdHJpbmdDb252ZXJzaW9uU2lua10uCiAgQnl0ZUNvbnZlcnNpb25TaW5rIHN0YXJ0Q2h1bmtlZENvbnZlcnNpb24oU2luazxTdHJpbmc+IHNpbmspIHsKICAgIFN0cmluZ0NvbnZlcnNpb25TaW5rIHN0cmluZ1Npbms7CiAgICBpZiAoc2luayBpcyBTdHJpbmdDb252ZXJzaW9uU2luaykgewogICAgICBzdHJpbmdTaW5rID0gc2luazsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmluZ1NpbmsgPSBTdHJpbmdDb252ZXJzaW9uU2luay5mcm9tKHNpbmspOwogICAgfQogICAgcmV0dXJuIHN0cmluZ1NpbmsuYXNVdGY4U2luayhfYWxsb3dNYWxmb3JtZWQpOwogIH0KCiAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UtY2xhc3NlcyBiaW5kLCB0byBwcm92aWRlIGEgYmV0dGVyIHR5cGUuCiAgU3RyZWFtPFN0cmluZz4gYmluZChTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pID0+IHN1cGVyLmJpbmQoc3RyZWFtKTsKCiAgZXh0ZXJuYWwgQ29udmVydGVyPExpc3Q8aW50PiwgVD4gZnVzZTxUPihDb252ZXJ0ZXI8U3RyaW5nLCBUPiBuZXh0KTsKCiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfY29udmVydEludGVyY2VwdGVkKAogICAgICBib29sIGFsbG93TWFsZm9ybWVkLCBMaXN0PGludD4gY29kZVVuaXRzLCBpbnQgc3RhcnQsIGludCBlbmQpOwp9CgovLyBVVEYtOCBjb25zdGFudHMuCmNvbnN0IGludCBfT05FX0JZVEVfTElNSVQgPSAweDdmOyAvLyA3IGJpdHMKY29uc3QgaW50IF9UV09fQllURV9MSU1JVCA9IDB4N2ZmOyAvLyAxMSBiaXRzCmNvbnN0IGludCBfVEhSRUVfQllURV9MSU1JVCA9IDB4ZmZmZjsgLy8gMTYgYml0cwpjb25zdCBpbnQgX0ZPVVJfQllURV9MSU1JVCA9IDB4MTBmZmZmOyAvLyAyMSBiaXRzLCB0cnVuY2F0ZWQgdG8gVW5pY29kZSBtYXguCgovLyBVVEYtMTYgY29uc3RhbnRzLgpjb25zdCBpbnQgX1NVUlJPR0FURV9UQUdfTUFTSyA9IDB4RkMwMDsKY29uc3QgaW50IF9TVVJST0dBVEVfVkFMVUVfTUFTSyA9IDB4M0ZGOwpjb25zdCBpbnQgX0xFQURfU1VSUk9HQVRFX01JTiA9IDB4RDgwMDsKY29uc3QgaW50IF9UQUlMX1NVUlJPR0FURV9NSU4gPSAweERDMDA7Cgpib29sIF9pc0xlYWRTdXJyb2dhdGUoaW50IGNvZGVVbml0KSA9PgogICAgKGNvZGVVbml0ICYgX1NVUlJPR0FURV9UQUdfTUFTSykgPT0gX0xFQURfU1VSUk9HQVRFX01JTjsKYm9vbCBfaXNUYWlsU3Vycm9nYXRlKGludCBjb2RlVW5pdCkgPT4KICAgIChjb2RlVW5pdCAmIF9TVVJST0dBVEVfVEFHX01BU0spID09IF9UQUlMX1NVUlJPR0FURV9NSU47CmludCBfY29tYmluZVN1cnJvZ2F0ZVBhaXIoaW50IGxlYWQsIGludCB0YWlsKSA9PgogICAgMHgxMDAwMCArICgobGVhZCAmIF9TVVJST0dBVEVfVkFMVUVfTUFTSykgPDwgMTApIHwKICAgICh0YWlsICYgX1NVUlJPR0FURV9WQUxVRV9NQVNLKTsKCi8vLyBEZWNvZGVzIFVURi04LgovLy8KLy8vIFRoZSBkZWNvZGVyIGhhbmRsZXMgY2h1bmtlZCBpbnB1dC4KLy8gVE9ETyhmbG9pdHNjaCk6IG1ha2UgdGhpcyBjbGFzcyBwdWJsaWMuCmNsYXNzIF9VdGY4RGVjb2RlciB7CiAgZmluYWwgYm9vbCBfYWxsb3dNYWxmb3JtZWQ7CiAgZmluYWwgU3RyaW5nU2luayBfc3RyaW5nU2luazsKICBib29sIF9pc0ZpcnN0Q2hhcmFjdGVyID0gdHJ1ZTsKICBpbnQgX3ZhbHVlID0gMDsKICBpbnQgX2V4cGVjdGVkVW5pdHMgPSAwOwogIGludCBfZXh0cmFVbml0cyA9IDA7CgogIF9VdGY4RGVjb2Rlcih0aGlzLl9zdHJpbmdTaW5rLCB0aGlzLl9hbGxvd01hbGZvcm1lZCk7CgogIGJvb2wgZ2V0IGhhc1BhcnRpYWxJbnB1dCA9PiBfZXhwZWN0ZWRVbml0cyA+IDA7CgogIC8vIExpbWl0cyBvZiBvbmUgdGhyb3VnaCBmb3VyIGJ5dGUgZW5jb2RpbmdzLgogIHN0YXRpYyBjb25zdCBMaXN0PGludD4gX0xJTUlUUyA9IDxpbnQ+WwogICAgX09ORV9CWVRFX0xJTUlULAogICAgX1RXT19CWVRFX0xJTUlULAogICAgX1RIUkVFX0JZVEVfTElNSVQsCiAgICBfRk9VUl9CWVRFX0xJTUlUCiAgXTsKCiAgdm9pZCBjbG9zZSgpIHsKICAgIGZsdXNoKCk7CiAgfQoKICAvLy8gRmx1c2hlcyB0aGlzIGRlY29kZXIgYXMgaWYgY2xvc2VkLgogIC8vLwogIC8vLyBUaGlzIG1ldGhvZCB0aHJvd3MgaWYgdGhlIGlucHV0IHdhcyBwYXJ0aWFsIGFuZCB0aGUgZGVjb2RlciB3YXMKICAvLy8gY29uc3RydWN0ZWQgd2l0aCBgYWxsb3dNYWxmb3JtZWRgIHNldCB0byBgZmFsc2VgLgogIC8vLwogIC8vLyBUaGUgW3NvdXJjZV0gYW5kIFtvZmZzZXRdIG9mIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1heSBiZSBwcm92aWRlZCwKICAvLy8gYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgZXhjZXB0aW9uIGlmIG9uZSBpcyB0aHJvd24uCiAgdm9pZCBmbHVzaChbTGlzdDxpbnQ+IHNvdXJjZSwgaW50IG9mZnNldF0pIHsKICAgIGlmIChoYXNQYXJ0aWFsSW5wdXQpIHsKICAgICAgaWYgKCFfYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJVbmZpbmlzaGVkIFVURi04IG9jdGV0IHNlcXVlbmNlIiwgc291cmNlLCBvZmZzZXQpOwogICAgICB9CiAgICAgIF9zdHJpbmdTaW5rLndyaXRlQ2hhckNvZGUodW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZSk7CiAgICAgIF92YWx1ZSA9IDA7CiAgICAgIF9leHBlY3RlZFVuaXRzID0gMDsKICAgICAgX2V4dHJhVW5pdHMgPSAwOwogICAgfQogIH0KCiAgdm9pZCBjb252ZXJ0KExpc3Q8aW50PiBjb2RlVW5pdHMsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKICAgIHZhciB2YWx1ZSA9IF92YWx1ZTsKICAgIHZhciBleHBlY3RlZFVuaXRzID0gX2V4cGVjdGVkVW5pdHM7CiAgICB2YXIgZXh0cmFVbml0cyA9IF9leHRyYVVuaXRzOwogICAgX3ZhbHVlID0gMDsKICAgIF9leHBlY3RlZFVuaXRzID0gMDsKICAgIF9leHRyYVVuaXRzID0gMDsKCiAgICB2YXIgaSA9IHN0YXJ0SW5kZXg7CiAgICBsb29wOgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgbXVsdGlieXRlOgogICAgICBpZiAoZXhwZWN0ZWRVbml0cyA+IDApIHsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoaSA9PSBlbmRJbmRleCkgewogICAgICAgICAgICBicmVhayBsb29wOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHVuaXQgPSBjb2RlVW5pdHNbaV07CiAgICAgICAgICBpZiAoKHVuaXQgJiAweEMwKSAhPSAweDgwKSB7CiAgICAgICAgICAgIGV4cGVjdGVkVW5pdHMgPSAwOwogICAgICAgICAgICBpZiAoIV9hbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgIkJhZCBVVEYtOCBlbmNvZGluZyAweCR7dW5pdC50b1JhZGl4U3RyaW5nKDE2KX0iLAogICAgICAgICAgICAgICAgICBjb2RlVW5pdHMsCiAgICAgICAgICAgICAgICAgIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9pc0ZpcnN0Q2hhcmFjdGVyID0gZmFsc2U7CiAgICAgICAgICAgIF9zdHJpbmdTaW5rLndyaXRlQ2hhckNvZGUodW5pY29kZVJlcGxhY2VtZW50Q2hhcmFjdGVyUnVuZSk7CiAgICAgICAgICAgIGJyZWFrIG11bHRpYnl0ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDYpIHwgKHVuaXQgJiAweDNmKTsKICAgICAgICAgICAgZXhwZWN0ZWRVbml0cy0tOwogICAgICAgICAgICBpKys7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoZXhwZWN0ZWRVbml0cyA+IDApOwogICAgICAgIGlmICh2YWx1ZSA8PSBfTElNSVRTW2V4dHJhVW5pdHMgLSAxXSkgewogICAgICAgICAgLy8gT3Zlcmx5IGxvbmcgZW5jb2RpbmcuIFRoZSB2YWx1ZSBjb3VsZCBiZSBlbmNvZGVkIHdpdGggYSBzaG9ydGVyCiAgICAgICAgICAvLyBlbmNvZGluZy4KICAgICAgICAgIGlmICghX2FsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJPdmVybG9uZyBlbmNvZGluZyBvZiAweCR7dmFsdWUudG9SYWRpeFN0cmluZygxNil9IiwKICAgICAgICAgICAgICAgIGNvZGVVbml0cywKICAgICAgICAgICAgICAgIGkgLSBleHRyYVVuaXRzIC0gMSk7CiAgICAgICAgICB9CiAgICAgICAgICBleHBlY3RlZFVuaXRzID0gZXh0cmFVbml0cyA9IDA7CiAgICAgICAgICB2YWx1ZSA9IHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmU7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA+IF9GT1VSX0JZVEVfTElNSVQpIHsKICAgICAgICAgIGlmICghX2FsbG93TWFsZm9ybWVkKSB7CiAgICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICJDaGFyYWN0ZXIgb3V0c2lkZSB2YWxpZCBVbmljb2RlIHJhbmdlOiAiCiAgICAgICAgICAgICAgICAiMHgke3ZhbHVlLnRvUmFkaXhTdHJpbmcoMTYpfSIsCiAgICAgICAgICAgICAgICBjb2RlVW5pdHMsCiAgICAgICAgICAgICAgICBpIC0gZXh0cmFVbml0cyAtIDEpOwogICAgICAgICAgfQogICAgICAgICAgdmFsdWUgPSB1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5lOwogICAgICAgIH0KICAgICAgICBpZiAoIV9pc0ZpcnN0Q2hhcmFjdGVyIHx8IHZhbHVlICE9IHVuaWNvZGVCb21DaGFyYWN0ZXJSdW5lKSB7CiAgICAgICAgICBfc3RyaW5nU2luay53cml0ZUNoYXJDb2RlKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgX2lzRmlyc3RDaGFyYWN0ZXIgPSBmYWxzZTsKICAgICAgfQoKICAgICAgd2hpbGUgKGkgPCBlbmRJbmRleCkgewogICAgICAgIHZhciBvbmVCeXRlcyA9IF9zY2FuT25lQnl0ZUNoYXJhY3RlcnMoY29kZVVuaXRzLCBpLCBlbmRJbmRleCk7CiAgICAgICAgaWYgKG9uZUJ5dGVzID4gMCkgewogICAgICAgICAgX2lzRmlyc3RDaGFyYWN0ZXIgPSBmYWxzZTsKICAgICAgICAgIGFzc2VydChpICsgb25lQnl0ZXMgPD0gZW5kSW5kZXgpOwogICAgICAgICAgX3N0cmluZ1Npbmsud3JpdGUoU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZVVuaXRzLCBpLCBpICsgb25lQnl0ZXMpKTsKCiAgICAgICAgICBpICs9IG9uZUJ5dGVzOwogICAgICAgICAgaWYgKGkgPT0gZW5kSW5kZXgpIGJyZWFrOwogICAgICAgIH0KICAgICAgICB2YXIgdW5pdCA9IGNvZGVVbml0c1tpKytdOwogICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiB0aGUgd2F5IHdlIHRlc3Qgd2UgY291bGQgcG90ZW50aWFsbHkgYWxsb3cKICAgICAgICAvLyB1bml0cyB0aGF0IGFyZSB0b28gbGFyZ2UsIGlmIHRoZXkgaGFwcGVuIHRvIGhhdmUgdGhlCiAgICAgICAgLy8gcmlnaHQgYml0LXBhdHRlcm4uIChTYW1lIGlzIHRydWUgZm9yIHRoZSBtdWx0aWJ5dGUgbG9vcCBhYm92ZSkuCiAgICAgICAgLy8gVE9ETyhmbG9pdHNjaCk6IG9wdGltaXplIHRoaXMgbG9vcC4gU2VlOgogICAgICAgIC8vIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMjI5MjkwMjIvZGlmZi8xL3Nkay9saWIvY29udmVydC91dGYuZGFydD9jb2x1bW5fd2lkdGg9ODAKICAgICAgICBpZiAodW5pdCA8IDApIHsKICAgICAgICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBzaG91bGQgdGhpcyBiZSB1bml0IDw9IDAgPwogICAgICAgICAgaWYgKCFfYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIk5lZ2F0aXZlIFVURi04IGNvZGUgdW5pdDogLTB4JHsoLXVuaXQpLnRvUmFkaXhTdHJpbmcoMTYpfSIsCiAgICAgICAgICAgICAgICBjb2RlVW5pdHMsCiAgICAgICAgICAgICAgICBpIC0gMSk7CiAgICAgICAgICB9CiAgICAgICAgICBfc3RyaW5nU2luay53cml0ZUNoYXJDb2RlKHVuaWNvZGVSZXBsYWNlbWVudENoYXJhY3RlclJ1bmUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhc3NlcnQodW5pdCA+IF9PTkVfQllURV9MSU1JVCk7CiAgICAgICAgICBpZiAoKHVuaXQgJiAweEUwKSA9PSAweEMwKSB7CiAgICAgICAgICAgIHZhbHVlID0gdW5pdCAmIDB4MUY7CiAgICAgICAgICAgIGV4cGVjdGVkVW5pdHMgPSBleHRyYVVuaXRzID0gMTsKICAgICAgICAgICAgY29udGludWUgbG9vcDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgodW5pdCAmIDB4RjApID09IDB4RTApIHsKICAgICAgICAgICAgdmFsdWUgPSB1bml0ICYgMHgwRjsKICAgICAgICAgICAgZXhwZWN0ZWRVbml0cyA9IGV4dHJhVW5pdHMgPSAyOwogICAgICAgICAgICBjb250aW51ZSBsb29wOwogICAgICAgICAgfQogICAgICAgICAgLy8gMHhGNSwgMHhGNiAuLi4gMHhGRiBuZXZlciBhcHBlYXIgaW4gdmFsaWQgVVRGLTggc2VxdWVuY2VzLgogICAgICAgICAgaWYgKCh1bml0ICYgMHhGOCkgPT0gMHhGMCAmJiB1bml0IDwgMHhGNSkgewogICAgICAgICAgICB2YWx1ZSA9IHVuaXQgJiAweDA3OwogICAgICAgICAgICBleHBlY3RlZFVuaXRzID0gZXh0cmFVbml0cyA9IDM7CiAgICAgICAgICAgIGNvbnRpbnVlIGxvb3A7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIV9hbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiQmFkIFVURi04IGVuY29kaW5nIDB4JHt1bml0LnRvUmFkaXhTdHJpbmcoMTYpfSIsCiAgICAgICAgICAgICAgICBjb2RlVW5pdHMsCiAgICAgICAgICAgICAgICBpIC0gMSk7CiAgICAgICAgICB9CiAgICAgICAgICB2YWx1ZSA9IHVuaWNvZGVS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cG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgUE9XRVJTX09GX1RFTiwgcGF0Y2gsIENsYXNzSUQ7CgppbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSIgc2hvdyBVaW50OExpc3QsIFVpbnQxNkxpc3Q7CgovLy8gVGhpcyBwYXRjaCBsaWJyYXJ5IGhhcyBubyBhZGRpdGlvbmFsIHBhcnRzLgoKLy8gSlNPTiBjb252ZXJzaW9uLgoKQHBhdGNoCl9wYXJzZUpzb24oU3RyaW5nIHNvdXJjZSwgcmV2aXZlcihrZXksIHZhbHVlKSkgewogIF9CdWlsZEpzb25MaXN0ZW5lciBsaXN0ZW5lcjsKICBpZiAocmV2aXZlciA9PSBudWxsKSB7CiAgICBsaXN0ZW5lciA9IG5ldyBfQnVpbGRKc29uTGlzdGVuZXIoKTsKICB9IGVsc2UgewogICAgbGlzdGVuZXIgPSBuZXcgX1Jldml2ZXJKc29uTGlzdGVuZXIocmV2aXZlcik7CiAgfQogIHZhciBwYXJzZXIgPSBuZXcgX0pzb25TdHJpbmdQYXJzZXIobGlzdGVuZXIpOwogIHBhcnNlci5jaHVuayA9IHNvdXJjZTsKICBwYXJzZXIuY2h1bmtFbmQgPSBzb3VyY2UubGVuZ3RoOwogIHBhcnNlci5wYXJzZSgwKTsKICBwYXJzZXIuY2xvc2UoKTsKICByZXR1cm4gbGlzdGVuZXIucmVzdWx0Owp9CgpAcGF0Y2gKY2xhc3MgVXRmOERlY29kZXIgewogIEBwYXRjaAogIENvbnZlcnRlcjxMaXN0PGludD4sIFQ+IGZ1c2U8VD4oQ29udmVydGVyPFN0cmluZywgVD4gbmV4dCkgewogICAgaWYgKG5leHQgaXMgSnNvbkRlY29kZXIpIHsKICAgICAgcmV0dXJuIG5ldyBfSnNvblV0ZjhEZWNvZGVyKAogICAgICAgICAgICAgIChuZXh0IGFzIEpzb25EZWNvZGVyKS5fcmV2aXZlciwgdGhpcy5fYWxsb3dNYWxmb3JtZWQpCiAgICAgICAgICBhcyBkeW5hbWljLyo9Q29udmVydGVyPExpc3Q8aW50PiwgVD4qLzsKICAgIH0KICAgIC8vIFRPRE8obHJuKTogUmVjb2duaXplIGEgZnVzZWQgZGVjb2RlciB3aGVyZSB0aGUgbmV4dCBzdGVwIGlzIEpzb25EZWNvZGVyLgogICAgcmV0dXJuIHN1cGVyLmZ1c2U8VD4obmV4dCk7CiAgfQoKICAvLyBBbGxvdyBpbnRlcmNlcHRpbmcgb2YgVVRGLTggZGVjb2Rpbmcgd2hlbiBidWlsdC1pbiBsaXN0cyBhcmUgcGFzc2VkLgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX2NvbnZlcnRJbnRlcmNlcHRlZCgKICAgICAgYm9vbCBhbGxvd01hbGZvcm1lZCwgTGlzdDxpbnQ+IGNvZGVVbml0cywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICByZXR1cm4gbnVsbDsgLy8gVGhpcyBjYWxsIHdhcyBub3QgaW50ZXJjZXB0ZWQuCiAgfQp9CgpjbGFzcyBfSnNvblV0ZjhEZWNvZGVyIGV4dGVuZHMgQ29udmVydGVyPExpc3Q8aW50PiwgT2JqZWN0PiB7CiAgZmluYWwgRnVuY3Rpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSBfcmV2aXZlcjsKICBmaW5hbCBib29sIF9hbGxvd01hbGZvcm1lZDsKCiAgX0pzb25VdGY4RGVjb2Rlcih0aGlzLl9yZXZpdmVyLCB0aGlzLl9hbGxvd01hbGZvcm1lZCk7CgogIE9iamVjdCBjb252ZXJ0KExpc3Q8aW50PiBpbnB1dCkgewogICAgdmFyIHBhcnNlciA9IF9Kc29uVXRmOERlY29kZXJTaW5rLl9jcmVhdGVQYXJzZXIoX3Jldml2ZXIsIF9hbGxvd01hbGZvcm1lZCk7CiAgICBwYXJzZXIuY2h1bmsgPSBpbnB1dDsKICAgIHBhcnNlci5jaHVua0VuZCA9IGlucHV0Lmxlbmd0aDsKICAgIHBhcnNlci5wYXJzZSgwKTsKICAgIHBhcnNlci5jbG9zZSgpOwogICAgcmV0dXJuIHBhcnNlci5yZXN1bHQ7CiAgfQoKICBCeXRlQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPE9iamVjdD4gc2luaykgewogICAgcmV0dXJuIG5ldyBfSnNvblV0ZjhEZWNvZGVyU2luayhfcmV2aXZlciwgc2luaywgX2FsbG93TWFsZm9ybWVkKTsKICB9Cn0KCi8vLy8gSW1wbGVtZW50YXRpb24gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vIFNpbXBsZSBBUEkgZm9yIEpTT04gcGFyc2luZy4KCi8qKgogKiBMaXN0ZW5lciBmb3IgcGFyc2luZyBldmVudHMgZnJvbSBbX0NodW5rZWRKc29uUGFyc2VyXS4KICovCmFic3RyYWN0IGNsYXNzIF9Kc29uTGlzdGVuZXIgewogIHZvaWQgaGFuZGxlU3RyaW5nKFN0cmluZyB2YWx1ZSkge30KICB2b2lkIGhhbmRsZU51bWJlcihudW0gdmFsdWUpIHt9CiAgdm9pZCBoYW5kbGVCb29sKGJvb2wgdmFsdWUpIHt9CiAgdm9pZCBoYW5kbGVOdWxsKCkge30KICB2b2lkIGJlZ2luT2JqZWN0KCkge30KICB2b2lkIHByb3BlcnR5TmFtZSgpIHt9CiAgdm9pZCBwcm9wZXJ0eVZhbHVlKCkge30KICB2b2lkIGVuZE9iamVjdCgpIHt9CiAgdm9pZCBiZWdpbkFycmF5KCkge30KICB2b2lkIGFycmF5RWxlbWVudCgpIHt9CiAgdm9pZCBlbmRBcnJheSgpIHt9CgogIC8qKgogICAqIFJlYWQgb3V0IHRoZSBmaW5hbCByZXN1bHQgb2YgcGFyc2luZyBhIEpTT04gc3RyaW5nLgogICAqCiAgICogTXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBlbnRpcmUgaW5wdXQgaGFzIGJlZW4gcGFyc2VkLgogICAqLwogIGdldCByZXN1bHQ7Cn0KCi8qKgogKiBBIFtfSnNvbkxpc3RlbmVyXSB0aGF0IGJ1aWxkcyBkYXRhIG9iamVjdHMgZnJvbSB0aGUgcGFyc2VyIGV2ZW50cy4KICoKICogVGhpcyBpcyBhIHNpbXBsZSBzdGFjay1iYXNlZCBvYmplY3QgYnVpbGRlci4gSXQga2VlcHMgdGhlIG1vc3QgcmVjZW50bHkKICogc2VlbiB2YWx1ZSBpbiBhIHZhcmlhYmxlLCBhbmQgdXNlcyBpdCBkZXBlbmRpbmcgb24gdGhlIGZvbGxvd2luZyBldmVudC4KICovCmNsYXNzIF9CdWlsZEpzb25MaXN0ZW5lciBleHRlbmRzIF9Kc29uTGlzdGVuZXIgewogIC8qKgogICAqIFN0YWNrIHVzZWQgdG8gaGFuZGxlIG5lc3RlZCBjb250YWluZXJzLgogICAqCiAgICogVGhlIGN1cnJlbnQgY29udGFpbmVyIGlzIHB1c2hlZCBvbiB0aGUgc3RhY2sgd2hlbiBhIG5ldyBvbmUgaXMKICAgKiBzdGFydGVkLiBJZiB0aGUgY29udGFpbmVyIGlzIGEgW01hcF0sIHRoZXJlIGlzIGFsc28gYSBjdXJyZW50IFtrZXldCiAgICogd2hpY2ggaXMgYWxzbyBzdG9yZWQgb24gdGhlIHN0YWNrLgogICAqLwogIExpc3Qgc3RhY2sgPSBbXTsKICAvKiogVGhlIGN1cnJlbnQgW01hcF0gb3IgW0xpc3RdIGJlaW5nIGJ1aWx0LiAqLwogIHZhciBjdXJyZW50Q29udGFpbmVyOwogIC8qKiBUaGUgbW9zdCByZWNlbnRseSByZWFkIHByb3BlcnR5IGtleS4gKi8KICBTdHJpbmcga2V5OwogIC8qKiBUaGUgbW9zdCByZWNlbnRseSByZWFkIHZhbHVlLiAqLwogIHZhciB2YWx1ZTsKCiAgLyoqIFB1c2hlcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb250YWluZXIgKGFuZCBrZXksIGlmIGEgW01hcF0pLiAqLwogIHZvaWQgcHVzaENvbnRhaW5lcigpIHsKICAgIGlmIChjdXJyZW50Q29udGFpbmVyIGlzIE1hcCkgc3RhY2suYWRkKGtleSk7CiAgICBzdGFjay5hZGQoY3VycmVudENvbnRhaW5lcik7CiAgfQoKICAvKiogUG9wcyB0aGUgdG9wIGNvbnRhaW5lciBmcm9tIHRoZSBbc3RhY2tdLCBpbmNsdWRpbmcgYSBrZXkgaWYgYXBwbGljYWJsZS4gKi8KICB2b2lkIHBvcENvbnRhaW5lcigpIHsKICAgIHZhbHVlID0gY3VycmVudENvbnRhaW5lcjsKICAgIGN1cnJlbnRDb250YWluZXIgPSBzdGFjay5yZW1vdmVMYXN0KCk7CiAgICBpZiAoY3VycmVudENvbnRhaW5lciBpcyBNYXApIGtleSA9IHN0YWNrLnJlbW92ZUxhc3QoKTsKICB9CgogIHZvaWQgaGFuZGxlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewogICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogIH0KCiAgdm9pZCBoYW5kbGVOdW1iZXIobnVtIHZhbHVlKSB7CiAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgfQoKICB2b2lkIGhhbmRsZUJvb2woYm9vbCB2YWx1ZSkgewogICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogIH0KCiAgdm9pZCBoYW5kbGVOdWxsKCkgewogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgfQoKICB2b2lkIGJlZ2luT2JqZWN0KCkgewogICAgcHVzaENvbnRhaW5lcigpOwogICAgY3VycmVudENvbnRhaW5lciA9IDxTdHJpbmcsIGR5bmFtaWM+e307CiAgfQoKICB2b2lkIHByb3BlcnR5TmFtZSgpIHsKICAgIGtleSA9IHZhbHVlOwogICAgdmFsdWUgPSBudWxsOwogIH0KCiAgdm9pZCBwcm9wZXJ0eVZhbHVlKCkgewogICAgTWFwIG1hcCA9IGN1cnJlbnRDb250YWluZXI7CiAgICBtYXBba2V5XSA9IHZhbHVlOwogICAga2V5ID0gdmFsdWUgPSBudWxsOwogIH0KCiAgdm9pZCBlbmRPYmplY3QoKSB7CiAgICBwb3BDb250YWluZXIoKTsKICB9CgogIHZvaWQgYmVnaW5BcnJheSgpIHsKICAgIHB1c2hDb250YWluZXIoKTsKICAgIGN1cnJlbnRDb250YWluZXIgPSBbXTsKICB9CgogIHZvaWQgYXJyYXlFbGVtZW50KCkgewogICAgY3VycmVudENvbnRhaW5lci5hZGQodmFsdWUpOwogICAgdmFsdWUgPSBudWxsOwogIH0KCiAgdm9pZCBlbmRBcnJheSgpIHsKICAgIHBvcENvbnRhaW5lcigpOwogIH0KCiAgLyoqIFJlYWQgb3V0IHRoZSBmaW5hbCByZXN1bHQgb2YgcGFyc2luZyBhIEpTT04gc3RyaW5nLiAqLwogIGdldCByZXN1bHQgewogICAgYXNzZXJ0KGN1cnJlbnRDb250YWluZXIgPT0gbnVsbCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQp9CgpjbGFzcyBfUmV2aXZlckpzb25MaXN0ZW5lciBleHRlbmRzIF9CdWlsZEpzb25MaXN0ZW5lciB7CiAgZmluYWwgRnVuY3Rpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSByZXZpdmVyOwogIF9SZXZpdmVySnNvbkxpc3RlbmVyKHRoaXMucmV2aXZlcik7CgogIHZvaWQgYXJyYXlFbGVtZW50KCkgewogICAgTGlzdCBsaXN0ID0gY3VycmVudENvbnRhaW5lcjsKICAgIHZhbHVlID0gcmV2aXZlcihsaXN0Lmxlbmd0aCwgdmFsdWUpOwogICAgc3VwZXIuYXJyYXlFbGVtZW50KCk7CiAgfQoKICB2b2lkIHByb3BlcnR5VmFsdWUoKSB7CiAgICB2YWx1ZSA9IHJldml2ZXIoa2V5LCB2YWx1ZSk7CiAgICBzdXBlci5wcm9wZXJ0eVZhbHVlKCk7CiAgfQoKICBnZXQgcmVzdWx0IHsKICAgIHJldHVybiByZXZpdmVyKG51bGwsIHZhbHVlKTsKICB9Cn0KCi8qKgogKiBCdWZmZXIgaG9sZGluZyBwYXJ0cyBvZiBhIG51bWVyYWwuCiAqCiAqIFRoZSBidWZmZXIgY29udGFpbnMgdGhlIGNoYXJhY3RlcnMgb2YgYSBKU09OIG51bWJlci4KICogVGhlc2UgYXJlIGFsbCBBU0NJSSwgc28gYW4gW1VpbnQ4TGlzdF0gaXMgdXNlZCBhcyBiYWNraW5nIHN0b3JlLgogKgogKiBUaGlzIGJ1ZmZlciBpcyB1c2VkIHdoZW4gYSBKU09OIG51bWJlciBpcyBzcGxpdCBiZXR3ZWVuIHNlcGFyYXRlIGNodW5rcy4KICoKICovCmNsYXNzIF9OdW1iZXJCdWZmZXIgewogIHN0YXRpYyBjb25zdCBpbnQgbWluQ2FwYWNpdHkgPSAxNjsKICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0T3ZlcmhlYWQgPSA1OwogIFVpbnQ4TGlzdCBsaXN0OwogIGludCBsZW5ndGggPSAwOwogIF9OdW1iZXJCdWZmZXIoaW50IGluaXRpYWxDYXBhY2l0eSkKICAgICAgOiBsaXN0ID0gbmV3IFVpbnQ4TGlzdChfaW5pdGlhbENhcGFjaXR5KGluaXRpYWxDYXBhY2l0eSkpOwoKICBpbnQgZ2V0IGNhcGFjaXR5ID0+IGxpc3QubGVuZ3RoOwoKICAvLyBQaWNrIGFuIGluaXRpYWwgY2FwYWNpdHkgZ3JlYXRlciB0aGFuIHRoZSBmaXJzdCBwYXJ0J3Mgc2l6ZS4KICAvLyBUaGUgdHlwaWNhbCB1c2UgY2FzZSBoYXMgdHdvIHBhcnRzLCB0aGlzIGlzIHRoZSBhdHRlbXB0IGF0CiAgLy8gZ3Vlc3NpbmcgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBwYXJ0IHdpdGhvdXQgb3ZlcmRvaW5nIGl0LgogIC8vIFRoZSBkZWZhdWx0IGVzdGltYXRlIG9mIHRoZSBzZWNvbmQgcGFydCBpcyBba0RlZmF1bHRPdmVyaGVhZF0sCiAgLy8gdGhlbiByb3VuZCB0byBtdWx0aXBsdW0gb2YgZm91ciwgYW5kIHJldHVybiB0aGUgcmVzdWx0LAogIC8vIG9yIFttaW5DYXBhY2l0eV0gaWYgdGhhdCBpcyBncmVhdGVyLgogIHN0YXRpYyBpbnQgX2luaXRpYWxDYXBhY2l0eShpbnQgbWluQ2FwYWNpdHkpIHsKICAgIG1pbkNhcGFjaXR5ICs9IGtEZWZhdWx0T3ZlcmhlYWQ7CiAgICBpZiAobWluQ2FwYWNpdHkgPCBtaW5DYXBhY2l0eSkgcmV0dXJuIG1pbkNhcGFjaXR5OwogICAgbWluQ2FwYWNpdHkgPSAobWluQ2FwYWNpdHkgKyAzKSAmIH4zOyAvLyBSb3VuZCB0byBtdWx0aXBsZSBvZiBmb3VyLgogICAgcmV0dXJuIG1pbkNhcGFjaXR5OwogIH0KCiAgLy8gR3Jvd3MgdG8gdGhlIGV4YWN0IHNpemUgYXNrZWQgZm9yLgogIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG5ld0NhcGFjaXR5KSB7CiAgICBVaW50OExpc3QgbGlzdCA9IHRoaXMubGlzdDsKICAgIGlmIChuZXdDYXBhY2l0eSA8PSBsaXN0Lmxlbmd0aCkgcmV0dXJuOwogICAgVWludDhMaXN0IG5ld0xpc3QgPSBuZXcgVWludDhMaXN0KG5ld0NhcGFjaXR5KTsKICAgIG5ld0xpc3Quc2V0UmFuZ2UoMCwgbGlzdC5sZW5ndGgsIGxpc3QsIDApOwogICAgdGhpcy5saXN0ID0gbmV3TGlzdDsKICB9CgogIFN0cmluZyBnZXRTdHJpbmcoKSB7CiAgICBTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGxpc3QsIDAsIGxlbmd0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gVE9ETyhscm4pOiBTZWUgaWYgcGFyc2luZyBvZiBudW1iZXJzIGNhbiBiZSBhYnN0cmFjdGVkIHRvIHNvbWV0aGluZwogIC8vIG5vdCBvbmx5IHdvcmtpbmcgb24gc3RyaW5ncywgYnV0IGFsc28gb24gY2hhci1jb2RlIGxpc3RzLCB3aXRob3V0IGxvc3NpbmcKICAvLyBwZXJmb3JtYW5jZS4KICBudW0gcGFyc2VOdW0oKSA9PiBudW0ucGFyc2UoZ2V0U3RyaW5nKCkpOwogIGRvdWJsZSBwYXJzZURvdWJsZSgpID0+IGRvdWJsZS5wYXJzZShnZXRTdHJpbmcoKSk7Cn0KCi8qKgogKiBDaHVua2VkIEpTT04gcGFyc2VyLgogKgogKiBSZWNlaXZlcyBpbnB1dHMgaW4gY2h1bmtzLCBnaXZlcyBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgaW5wdXQsCiAqIGFuZCBzdG9yZXMgaW5wdXQgc3RhdGUgYmV0d2VlbiBjaHVua3MuCiAqCiAqIEltcGxlbWVudGF0aW9ucyBpbmNsdWRlIFtTdHJpbmddIGFuZCBVVEYtOCBwYXJzZXJzLgogKi8KYWJzdHJhY3QgY2xhc3MgX0NodW5rZWRKc29uUGFyc2VyPFQ+IHsKICAvLyBBIHNpbXBsZSBub24tcmVjdXJzaXZlIHN0YXRlLWJhc2VkIHBhcnNlciBmb3IgSlNPTi4KICAvLwogIC8vIExpdGVyYWwgdmFsdWVzIGFjY2VwdGVkIGluIHN0YXRlcyBBUlJBWV9FTVBUWSwgQVJSQVlfQ09NTUEsIE9CSkVDVF9DT0xPTgogIC8vIGFuZCBzdHJpbmdzIGFsc28gaW4gT0JKRUNUX0VNUFRZLCBPQkpFQ1RfQ09NTUEuCiAgLy8gICAgICAgICAgICAgICBWQUxVRSAgU1RSSU5HICA6ICAsICB9ICBdICAgICAgICBUcmFuc2l0aW9ucyB0bwogIC8vIEVNUFRZICAgICAgICAgICAgWCAgICAgIFggICAgICAgICAgICAgICAgICAgLT4gRU5ECiAgLy8gQVJSQVlfRU1QVFkgICAgICBYICAgICAgWCAgICAgICAgICAgICBAICAgICAtPiBBUlJBWV9WQUxVRSAvIHBvcAogIC8vIEFSUkFZX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgQCAgICAgQCAgICAgLT4gQVJSQVlfQ09NTUEgLyBwb3AKICAvLyBBUlJBWV9DT01NQSAgICAgIFggICAgICBYICAgICAgICAgICAgICAgICAgIC0+IEFSUkFZX1ZBTFVFCiAgLy8gT0JKRUNUX0VNUFRZICAgICAgICAgICAgWCAgICAgICAgICBAICAgICAgICAtPiBPQkpFQ1RfS0VZIC8gcG9wCiAgLy8gT0JKRUNUX0tFWSAgICAgICAgICAgICAgICAgICBAICAgICAgICAgICAgICAtPiBPQkpFQ1RfQ09MT04KICAvLyBPQkpFQ1RfQ09MT04gICAgIFggICAgICBYICAgICAgICAgICAgICAgICAgIC0+IE9CSkVDVF9WQUxVRQogIC8vIE9CSkVDVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgQCAgQCAgICAgICAgLT4gT0JKRUNUX0NPTU1BIC8gcG9wCiAgLy8gT0JKRUNUX0NPTU1BICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAtPiBPQkpFQ1RfS0VZCiAgLy8gRU5ECiAgLy8gU3RhcnRpbmcgYSBuZXcgYXJyYXkgb3Igb2JqZWN0IHdpbGwgcHVzaCB0aGUgY3VycmVudCBzdGF0ZS4gVGhlICJwb3AiCiAgLy8gYWJvdmUgbWVhbnMgcmVzdG9yaW5nIHRoaXMgc3RhdGUgYW5kIHRoZW4gbWFya2luZyBpdCBhcyBhbiBlbmRlZCB2YWx1ZS4KICAvLyBYIG1lYW5zIGdlbmVyaWMgaGFuZGxpbmcsIEAgbWVhbnMgc3BlY2lhbCBoYW5kbGluZyBmb3IganVzdCB0aGF0CiAgLy8gc3RhdGUgLSB0aGF0IGlzLCB2YWx1ZXMgYXJlIGhhbmRsZWQgZ2VuZXJpY2FsbHksIG9ubHkgcHVuY3R1YXRpb24KICAvLyBjYXJlcyBhYm91dCB0aGUgY3VycmVudCBzdGF0ZS4KICAvLyBWYWx1ZXMgZm9yIHN0YXRlcyBhcmUgY2hvc2VuIHNvIGJpdHMgMCBhbmQgMSB0ZWxsIHdoZXRoZXIKICAvLyBhIHN0cmluZy92YWx1ZSBpcyBhbGxvd2VkLCBhbmQgc2V0dGluZyBiaXRzIDAgdGhyb3VnaCAyIGFmdGVyIGEgdmFsdWUKICAvLyBnZXRzIHRvIHRoZSBuZXh0IHN0YXRlIChub3QgZW1wdHksIGRvZXNuJ3QgYWxsb3cgYSB2YWx1ZSkuCgogIC8vIFN0YXRlIGJ1aWxkaW5nLWJsb2NrIGNvbnN0YW50cy4KICBzdGF0aWMgY29uc3QgaW50IFRPUF9MRVZFTCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBJTlNJREVfQVJSQVkgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgSU5TSURFX09CSkVDVCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBBRlRFUl9DT0xPTiA9IDM7IC8vIEFsd2F5cyBpbnNpZGUgb2JqZWN0LgoKICBzdGF0aWMgY29uc3QgaW50IEFMTE9XX1NUUklOR19NQVNLID0gODsgLy8gQWxsb3dlZCBpZiB6ZXJvLgogIHN0YXRpYyBjb25zdCBpbnQgQUxMT1dfVkFMVUVfTUFTSyA9IDQ7IC8vIEFsbG93ZWQgaWYgemVyby4KICBzdGF0aWMgY29uc3QgaW50IEFMTE9XX1ZBTFVFID0gMDsKICBzdGF0aWMgY29uc3QgaW50IFNUUklOR19PTkxZID0gNDsKICBzdGF0aWMgY29uc3QgaW50IE5PX1ZBTFVFUyA9IDEyOwoKICAvLyBPYmplY3RzIGFuZCBhcnJheXMgYXJlICJlbXB0eSIgdW50aWwgdGhlaXIgZmlyc3QgcHJvcGVydHkvZWxlbWVudC4KICAvLyBBdCB0aGlzIHBvc2l0aW9uLCB0aGV5IG1heSBlaXRoZXIgaGF2ZSBhbiBlbnRyeSBvciBhIGNsb3NlLWJyYWNrZXQuCiAgc3RhdGljIGNvbnN0IGludCBFTVBUWSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBOT05fRU1QVFkgPSAxNjsKICBzdGF0aWMgY29uc3QgaW50IEVNUFRZX01BU0sgPSAxNjsgLy8gRW1wdHkgaWYgemVyby4KCiAgLy8gQWN0dWFsIHN0YXRlcyAgICAgICAgICAgICAgIDogQ29udGV4dCB8IElzIGVtcHR5PyB8IE5leHQ/CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9JTklUSUFMID0gVE9QX0xFVkVMIHwgRU1QVFkgfCBBTExPV19WQUxVRTsKICBzdGF0aWMgY29uc3QgaW50IFNUQVRFX0VORCA9IFRPUF9MRVZFTCB8IE5PTl9FTVBUWSB8IE5PX1ZBTFVFUzsKCiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9BUlJBWV9FTVBUWSA9IElOU0lERV9BUlJBWSB8IEVNUFRZIHwgQUxMT1dfVkFMVUU7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9BUlJBWV9WQUxVRSA9IElOU0lERV9BUlJBWSB8IE5PTl9FTVBUWSB8IE5PX1ZBTFVFUzsKICBzdGF0aWMgY29uc3QgaW50IFNUQVRFX0FSUkFZX0NPTU1BID0gSU5TSURFX0FSUkFZIHwgTk9OX0VNUFRZIHwgQUxMT1dfVkFMVUU7CgogIHN0YXRpYyBjb25zdCBpbnQgU1RBVEVfT0JKRUNUX0VNUFRZID0gSU5TSURFX09CSkVDVCB8IEVNUFRZIHwgU1RSSU5HX09OTFk7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9PQkpFQ1RfS0VZID0gSU5TSURFX09CSkVDVCB8IE5PTl9FTVBUWSB8IE5PX1ZBTFVFUzsKICBzdGF0aWMgY29uc3QgaW50IFNUQVRFX09CSkVDVF9DT0xPTiA9IEFGVEVSX0NPTE9OIHwgTk9OX0VNUFRZIHwgQUxMT1dfVkFMVUU7CiAgc3RhdGljIGNvbnN0IGludCBTVEFURV9PQkpFQ1RfVkFMVUUgPSBBRlRFUl9DT0xPTiB8IE5PTl9FTVBUWSB8IE5PX1ZBTFVFUzsKICBzdGF0aWMgY29uc3QgaW50IFNUQVRFX09CSkVDVF9DT01NQSA9IElOU0lERV9PQkpFQ1QgfCBOT05fRU1QVFkgfCBTVFJJTkdfT05MWTsKCiAgLy8gQml0cyBzZXQgaW4gc3RhdGUgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IHJlYWRpbmcgYSB2YWx1ZS4KICAvLyBUaGlzIHRyYW5zaXRpb25zIHRoZSBzdGF0ZSB0byBleHBlY3QgdGhlIG5leHQgcHVuY3R1YXRpb24uCiAgc3RhdGljIGNvbnN0IGludCBWQUxVRV9SRUFEX0JJVFMgPSBOT05fRU1QVFkgfCBOT19WQUxVRVM7CgogIC8vIENoYXJhY3RlciBjb2RlIGNvbnN0YW50cy4KICBzdGF0aWMgY29uc3QgaW50IEJBQ0tTUEFDRSA9IDB4MDg7CiAgc3RhdGljIGNvbnN0IGludCBUQUIgPSAweDA5OwogIHN0YXRpYyBjb25zdCBpbnQgTkVXTElORSA9IDB4MGE7CiAgc3RhdGljIGNvbnN0IGludCBDQVJSSUFHRV9SRVRVUk4gPSAweDBkOwogIHN0YXRpYyBjb25zdCBpbnQgRk9STV9GRUVEID0gMHgwYzsKICBzdGF0aWMgY29uc3QgaW50IFNQQUNFID0gMHgyMDsKICBzdGF0aWMgY29uc3QgaW50IFFVT1RFID0gMHgyMjsKICBzdGF0aWMgY29uc3QgaW50IFBMVVMgPSAweDJiOwogIHN0YXRpYyBjb25zdCBpbnQgQ09NTUEgPSAweDJjOwogIHN0YXRpYyBjb25zdCBpbnQgTUlOVVMgPSAweDJkOwogIHN0YXRpYyBjb25zdCBpbnQgREVDSU1BTFBPSU5UID0gMHgyZTsKICBzdGF0aWMgY29uc3QgaW50IFNMQVNIID0gMHgyZjsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfMCA9IDB4MzA7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSXzkgPSAweDM5OwogIHN0YXRpYyBjb25zdCBpbnQgQ09MT04gPSAweDNhOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9FID0gMHg0NTsKICBzdGF0aWMgY29uc3QgaW50IExCUkFDS0VUID0gMHg1YjsKICBzdGF0aWMgY29uc3QgaW50IEJBQ0tTTEFTSCA9IDB4NWM7CiAgc3RhdGljIGNvbnN0IGludCBSQlJBQ0tFVCA9IDB4NWQ7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX2EgPSAweDYxOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9iID0gMHg2MjsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfZSA9IDB4NjU7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX2YgPSAweDY2OwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9sID0gMHg2YzsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfbiA9IDB4NmU7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX3IgPSAweDcyOwogIHN0YXRpYyBjb25zdCBpbnQgQ0hBUl9zID0gMHg3MzsKICBzdGF0aWMgY29uc3QgaW50IENIQVJfdCA9IDB4NzQ7CiAgc3RhdGljIGNvbnN0IGludCBDSEFSX3UgPSAweDc1OwogIHN0YXRpYyBjb25zdCBpbnQgTEJSQUNFID0gMHg3YjsKICBzdGF0aWMgY29uc3QgaW50IFJCUkFDRSA9IDB4N2Q7CgogIC8vIFN0YXRlIG9mIHBhcnRpYWwgdmFsdWUgYXQgY2h1bmsgc3BsaXQuCiAgc3RhdGljIGNvbnN0IGludCBOT19QQVJUSUFMID0gMDsKICBzdGF0aWMgY29uc3QgaW50IFBBUlRJQUxfU1RSSU5HID0gMTsKICBzdGF0aWMgY29uc3QgaW50IFBBUlRJQUxfTlVNRVJBTCA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBQQVJUSUFMX0tFWVdPUkQgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19QQVJUSUFMID0gMzsKCiAgLy8gUGFydGlhbCBzdGF0ZXMgZm9yIG51bWVyYWxzLiBWYWx1ZXMgY2FuIGJlIHwnZWQgd2l0aCBQQVJUSUFMX05VTUVSQUwuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fU0lHTiA9IDA7IC8vIEFmdGVyIGluaXRpYWwgJy0nLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX1pFUk8gPSA0OyAvLyBBZnRlciAnMCcgYXMgZmlyc3QgZGlnaXQuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fRElHSVQgPSA4OyAvLyBBZnRlciBkaWdpdCwgbm8gJy4nIG9yICdlJyBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX0RPVCA9IDEyOyAvLyBBZnRlciAnLicuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fRE9UX0RJR0lUID0gMTY7IC8vIEFmdGVyIGEgZGVjaW1hbCBkaWdpdCAoYWZ0ZXIgJy4nKS4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9FID0gMjA7IC8vIEFmdGVyICdlJyBvciAnRScuCiAgc3RhdGljIGNvbnN0IGludCBOVU1fRV9TSUdOID0gMjQ7IC8vIEFmdGVyICctJyBvciAnKycgYWZ0ZXIgJ2UnIG9yICdFJy4KICBzdGF0aWMgY29uc3QgaW50IE5VTV9FX0RJR0lUID0gMjg7IC8vIEFmdGVyIGV4cG9uZW50IGRpZ2l0LgogIHN0YXRpYyBjb25zdCBpbnQgTlVNX1NVQ0NFU1MgPSAzMjsgLy8gTmV2ZXIgc3RvcmVkIGFzIHBhcnRpYWwgc3RhdGUuCgogIC8vIFBhcnRpYWwgc3RhdGVzIGZvciBzdHJpbmdzLgogIHN0YXRpYyBjb25zdCBpbnQgU1RSX1BMQUlOID0gMDsgLy8gSW5zaWRlIHN0cmluZywgYnV0IG5vdCBlc2NhcGUuCiAgc3RhdGljIGNvbnN0IGludCBTVFJfRVNDQVBFID0gNDsgLy8gQWZ0ZXIgJ1wnLgogIHN0YXRpYyBjb25zdCBpbnQgU1RSX1UgPSAxNjsgLy8gQWZ0ZXIgJ1x1JyBhbmQgMC0zIGhleCBkaWdpdHMuCiAgc3RhdGljIGNvbnN0IGludCBTVFJfVV9DT1VOVF9TSElGVCA9IDI7IC8vIEhleCBkaWdpdCBjb3VudCBpbiBiaXRzIDItMy4KICBzdGF0aWMgY29uc3QgaW50IFNUUl9VX1ZBTFVFX1NISUZUID0gNTsgLy8gSGV4IGRpZ2l0IHZhbHVlIGluIGJpdHMgNSsuCgogIC8vIFBhcnRpYWwgc3RhdGVzIGZvciBrZXl3b3Jkcy4KICBzdGF0aWMgY29uc3QgaW50IEtXRF9UWVBFX01BU0sgPSAxMjsKICBzdGF0aWMgY29uc3QgaW50IEtXRF9UWVBFX1NISUZUID0gMjsKICBzdGF0aWMgY29uc3QgaW50IEtXRF9OVUxMID0gMDsgLy8gUHJlZml4IG9mICJudWxsIiBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgS1dEX1RSVUUgPSA0OyAvLyBQcmVmaXggb2YgInRydWUiIHNlZW4uCiAgc3RhdGljIGNvbnN0IGludCBLV0RfRkFMU0UgPSA4OyAvLyBQcmVmaXggb2YgImZhbHNlIiBzZWVuLgogIHN0YXRpYyBjb25zdCBpbnQgS1dEX0JPTSA9IDEyOyAvLyBQcmVmaXggb2YgQk9NIHNlZW4uCiAgc3RhdGljIGNvbnN0IGludCBLV0RfQ09VTlRfU0hJRlQgPSA0OyAvLyBQcmVmaXggbGVuZ3RoIGluIGJpdHMgNCsuCgogIC8vIE1hc2sgdXNlZCB0byBtYXNrIG9mZiB0d28gbG93ZXIgYml0cy4KICBzdGF0aWMgY29uc3QgaW50IFRXT19CSVRfTUFTSyA9IDM7CgogIGZpbmFsIF9Kc29uTGlzdGVuZXIgbGlzdGVuZXI7CgogIC8vIFRoZSBjdXJyZW50IHBhcnNpbmcgc3RhdGUuCiAgaW50IHN0YXRlID0gU1RBVEVfSU5JVElBTDsKICBMaXN0PGludD4gc3RhdGVzID0gPGludD5bXTsKCiAgLyoqCiAgICogU3RvcmVzIHRva2VuaXplciBzdGF0ZSBiZXR3ZWVuIGNodW5rcy4KICAgKgogICAqIFRoaXMgc3RhdGUgaXMgc3RvcmVkIHdoZW4gYSBjaHVuayBzdG9wcyBpbiB0aGUgbWlkZGxlIG9mIGEKICAgKiB0b2tlbiAoc3RyaW5nLCBudW1lcmFsLCBib29sZWFuIG9yIG51bGwpLgogICAqCiAgICogVGhlIHBhcnRpYWwgc3RhdGUgaXMgdXNlZCB0byBjb250aW51ZSBwYXJzaW5nIG9uIHRoZSBuZXh0IGNodW5rLgogICAqIFRoZSBwcmV2aW91cyBjaHVuayBpcyBub3QgcmV0YWluZWQsIGFueSBkYXRhIG5lZWRlZCBhcmUgc3RvcmVkIGluCiAgICogdGhpcyBpbnRlZ2VyLCBvciBpbiB0aGUgW2J1ZmZlcl0gZmllbGQgYXMgYSBzdHJpbmctYnVpbGRpbmcgYnVmZmVyCiAgICogb3IgYSBbX051bWJlckJ1ZmZlcl0uCiAgICoKICAgKiBQcmVmaXggc3RhdGUgc3RvcmVkIGluIFtwcmVmaXhTdGF0ZV0gYXMgYml0cy4KICAgKgogICAqICAgICAgICAgICAgLi4wMCA6IE5vIHBhcnRpYWwgdmFsdWUgKE5PX1BBUlRJQUwpLgogICAqCiAgICogICAgICAgICAuLjAwMDAxIDogUGFydGlhbCBzdHJpbmcsIG5vdCBpbnNpZGUgZXNjYXBlLgogICAqICAgICAgICAgLi4wMDEwMSA6IFBhcnRpYWwgc3RyaW5nLCBhZnRlciAnXCcuCiAgICogICAgIC4udnZ2djFkZDAxIDogUGFydGlhbCBcdSBlc2NhcGUuCiAgICogICAgICAgICAgICAgICAgICAgVGhlICdkZCcgYml0cyAoMi0zKSBlbmNvZGUgdGhlIG51bWJlciBvZiBoZXggZGlnaXRzIHNlZW4uCiAgICogICAgICAgICAgICAgICAgICAgQml0cyA1LTE2IGVuY29kZSB0aGUgdmFsdWUgb2YgdGhlIGhleCBkaWdpdHMgc2VlbiBzbyBmYXIuCiAgICoKICAgKiAgICAgICAgLi4wZGRkMTAgOiBQYXJ0aWFsIG51bWVyYWwuCiAgICogICAgICAgICAgICAgICAgICAgVGhlIGBkZGRgIGJpdHMgc3RvcmUgdGhlIHBhcnRzIG9mIGluIHRoZSBudW1lcmFsIHNlZW4gc28KICAgKiAgICAgICAgICAgICAgICAgICBmYXIsIGFzIHRoZSBjb25zdGFudHMgYE5VTV8qYCBkZWZpbmVkIGFib3ZlLgogICAqICAgICAgICAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBudW1lcmFsIGFyZSBzdG9yZWQgaW4gW2J1ZmZlcl0KICAgKiAgICAgICAgICAgICAgICAgICBhcyBhIFtfTnVtYmVyQnVmZmVyXS4KICAgKgogICAqICAgICAgLi4wZGRkMDAxMSA6IFBhcnRpYWwgJ251bGwnIGtleXdvcmQuCiAgICogICAgICAuLjBkZGQwMTExIDogUGFydGlhbCAndHJ1ZScga2V5d29yZC4KICAgKiAgICAgIC4uMGRkZDEwMTEgOiBQYXJ0aWFsICdmYWxzZScga2V5d29yZC4KICAgKiAgICAgIC4uMGRkZDExMTEgOiBQYXJ0aWFsIFVURi04IEJPTSBieXRlIHNlcWV1ZW5jZSAoIlx4RUZceEJCXHhCRiIpLgogICAqICAgICAgICAgICAgICAgICAgIEZvciBhbGwga2V5d29yZHMsIHRoZSBgZGRkYCBiaXRzIGVuY29kZSB0aGUgbnVtYmVyCiAgICogICAgICAgICAgICAgICAgICAgb2YgbGV0dGVycyBzZWVuLgogICAqICAgICAgICAgICAgICAgICAgIFRoZSBCT00gYnl0ZSBzZXF1ZW5jZSBpcyBvbmx5IHVzZWQgYnkgW19Kc29uVXRmOFBhcnNlcl0sCiAgICogICAgICAgICAgICAgICAgICAgYW5kIG9ubHkgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIGlucHV0LgogICAqLwogIGludCBwYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwoKICAvKioKICAgKiBFeHRyYSBkYXRhIHN0b3JlZCB3aGlsZSBwYXJzaW5nIGEgcHJpbWl0aXZlIHZhbHVlLgogICAqIE1heSBiZSBzZXQgZHVyaW5nIHBhcnNpbmcsIGFsd2F5cyBzZXQgYXQgY2h1bmsgZW5kIGlmIGEgdmFsdWUgaXMgcGFydGlhbC4KICAgKgogICAqIE1heSBjb250YWluIGEgc3RyaW5nIGJ1ZmZlciB3aGlsZSBwYXJzaW5nIHN0cmluZ3MuCiAgICovCiAgdmFyIGJ1ZmZlciA9IG51bGw7CgogIF9DaHVua2VkSnNvblBhcnNlcih0aGlzLmxpc3RlbmVyKTsKCiAgLyoqCiAgICogUHVzaCB0aGUgY3VycmVudCBwYXJzZSBbc3RhdGVdIG9uIGEgc3RhY2suCiAgICoKICAgKiBTdGF0ZSBpcyBwdXNoZWQgd2hlbiBhIG5ldyBhcnJheSBvciBvYmplY3QgbGl0ZXJhbCBzdGFydHMsCiAgICogc28gdGhlIHBhcnNlciBjYW4gZ28gYmFjayB0byB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIHRoZSBsaXRlcmFsIGVuZHMuCiAgICovCiAgdm9pZCBzYXZlU3RhdGUoaW50IHN0YXRlKSB7CiAgICBzdGF0ZXMuYWRkKHN0YXRlKTsKICB9CgogIC8qKgogICAqIFJlc3RvcmUgYSBzdGF0ZSBwdXNoZWQgd2l0aCBbc2F2ZVN0YXRlXS4KICAgKi8KICBpbnQgcmVzdG9yZVN0YXRlKCkgewogICAgcmV0dXJuIHN0YXRlcy5yZW1vdmVMYXN0KCk7IC8vIFRocm93cyBpZiBlbXB0eS4KICB9CgogIC8qKgogICAqIEZpbmFsaXplcyB0aGUgcGFyc2luZy4KICAgKgogICAqIFRocm93cyBpZiB0aGUgc291cmNlIHJlYWQgc28gZmFyIGRvZXNuJ3QgZW5kIHVwIHdpdGggYSBjb21wbGV0ZQogICAqIHBhcnNlZCB2YWx1ZS4gVGhhdCBtZWFucyBpdCBtdXN0IG5vdCBiZSBpbnNpZGUgYSBsaXN0IG9yIG9iamVjdAogICAqIGxpdGVyYWwsIGFuZCBhbnkgcGFydGlhbCB2YWx1ZSByZWFkIHNob3VsZCBhbHNvIGJlIGEgdmFsaWQgY29tcGxldGUKICAgKiB2YWx1ZS4KICAgKgogICAqIFRoZSBvbmx5IHZhbGlkIHBhcnRpYWwgc3RhdGUgaXMgYSBudW1iZXIgdGhhdCBlbmRzIGluIGEgZGlnaXQsIGFuZAogICAqIG9ubHkgaWYgdGhlIG51bWJlciBpcyB0aGUgZW50aXJlIEpTT04gdmFsdWUgYmVpbmcgcGFyc2VkCiAgICogKG90aGVyd2lzZSBpdCB3b3VsZCBiZSBpbnNpZGUgYSBsaXN0IG9yIG9iamVjdCkuCiAgICogU3VjaCBhIG51bWJlciB3aWxsIGJlIGNvbXBsZXRlZC4gQW55IG90aGVyIHBhcnRpYWwgc3RhdGUgaXMgYW4gZXJyb3IuCiAgICovCiAgdm9pZCBjbG9zZSgpIHsKICAgIGlmIChwYXJ0aWFsU3RhdGUgIT0gTk9fUEFSVElBTCkgewogICAgICBpbnQgcGFydGlhbFR5cGUgPSBwYXJ0aWFsU3RhdGUgJiBNQVNLX1BBUlRJQUw7CiAgICAgIGlmIChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX05VTUVSQUwpIHsKICAgICAgICBpbnQgbnVtU3RhdGUgPSBwYXJ0aWFsU3RhdGUgJiB+TUFTS19QQVJUSUFMOwogICAgICAgIC8vIEEgcGFydGlhbCBudW1iZXIgbWlnaHQgYmUgYSB2YWxpZCBudW1iZXIgaWYgd2Uga25vdyBpdCdzIGRvbmUuCiAgICAgICAgLy8gVGhlcmUgaXMgYW4gdW5uZWNlc3Nhcnkgb3ZlcmhlYWQgaWYgaW5wdXQgaXMgYSBzaW5nbGUgbnVtYmVyLAogICAgICAgIC8vIGJ1dCB0aGlzIGlzIGFzc3VtZWQgdG8gYmUgcmFyZS4KICAgICAgICBfTnVtYmVyQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKICAgICAgICBmaW5pc2hDaHVua051bWJlcihudW1TdGF0ZSwgMCwgMCwgYnVmZmVyKTsKICAgICAgfSBlbHNlIGlmIChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX1NUUklORykgewogICAgICAgIGZhaWwoY2h1bmtFbmQsICJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXNzZXJ0KHBhcnRpYWxUeXBlID09IFBBUlRJQUxfS0VZV09SRCk7CiAgICAgICAgZmFpbChjaHVua0VuZCk7IC8vIEluY29tcGxldGUgbGl0ZXJhbC4KICAgICAgfQogICAgfQogICAgaWYgKHN0YXRlICE9IFNUQVRFX0VORCkgewogICAgICBmYWlsKGNodW5rRW5kKTsKICAgIH0KICB9CgogIC8qKgogICAqIFJlYWQgb3V0IHRoZSByZXN1bHQgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGNsb3NpbmcgdGhlIHBhcnNlci4KICAgKgogICAqIFRoZSBwYXJzZXIgaXMgY2xvc2VkIGJ5IGNhbGxpbmcgW2Nsb3NlXSBvciBjYWxsaW5nIFthZGRTb3VyY2VDaHVua10gd2l0aAogICAqIGB0cnVlYCBhcyBzZWNvbmQgKGBpc0xhc3RgKSBhcmd1bWVudC4KICAgKi8KICBPYmplY3QgZ2V0IHJlc3VsdCB7CiAgICByZXR1cm4gbGlzdGVuZXIucmVzdWx0OwogIH0KCiAgLyoqIFNldHMgdGhlIGN1cnJlbnQgc291cmNlIGNodW5rLiAqLwogIHZvaWQgc2V0IGNodW5rKFQgc291cmNlKTsKCiAgLyoqCiAgICogTGVuZ3RoIG9mIGN1cnJlbnQgY2h1bmsuCiAgICoKICAgKiBUaGUgdmFsaWQgYXJndW1lbnRzIHRvIFtnZXRDaGFyXSBhcmUgMCAuLiBgY2h1bmtFbmQgLSAxYC4KICAgKi8KICBpbnQgZ2V0IGNodW5rRW5kOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjaHVuayBpdHNlbGYuCiAgICoKICAgKiBPbmx5IHVzZWQgYnkgW2ZhaWxdIHRvIGluY2x1ZGUgdGhlIGNodW5rIGluIHRoZSB0aHJvd24gW0Zvcm1hdEV4Y2VwdGlvbl0uCiAgICovCiAgVCBnZXQgY2h1bms7CgogIC8qKgogICAqIEdldCBjaGFyY2FjdGVyL2NvZGUgdW5pdCBvZiBjdXJyZW50IGNodW5rLgogICAqCiAgICogVGhlIFtpbmRleF0gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIGxlc3MgdGhhbiBgY2h1bmtFbmRgLgogICAqIEluIHByYWN0aXZlLCBbaW5kZXhdIHdpbGwgYmUgbm8gc21hbGxlciB0aGFuIHRoZSBgc3RhcnRgIGFyZ3VtZW50IHBhc3NlZAogICAqIHRvIFtwYXJzZV0uCiAgICovCiAgaW50IGdldENoYXIoaW50IGluZGV4KTsKCiAgLyoqCiAgICogQ29weSBBU0NJSSBjaGFyYWN0ZXJzIGZyb20gc3RhcnQgdG8gZW5kIG9mIGNodW5rIGludG8gYSBsaXN0LgogICAqCiAgICogVXNlZCBmb3IgbnVtYmVyIGJ1ZmZlciAoYWx3YXlzIGNvcGllcyBBU0NJSSwgc28gZW5jb2RpbmcgaXMgbm90IGltcG9ydGFudCkuCiAgICovCiAgdm9pZCBjb3B5Q2hhcnNUb0xpc3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBMaXN0PGludD4gdGFyZ2V0LCBpbnQgb2Zmc2V0KTsKCiAgLyoqCiAgICogQnVpbGQgYSBzdHJpbmcgdXNpbmcgaW5wdXQgY29kZSB1bml0cy4KICAgKgogICAqIENyZWF0ZXMgYSBzdHJpbmcgYnVmZmVyIGFuZCBlbmFibGVzIGFkZGluZyBjaGFyYWN0ZXJzIGFuZCBzbGljZXMKICAgKiB0byB0aGF0IGJ1ZmZlci4KICAgKiBUaGUgYnVmZmVyIGlzIHN0b3JlZCBpbiB0aGUgW2J1ZmZlcl0gZmllbGQuIElmIHRoZSBzdHJpbmcgaXMgdW50ZXJtaW5hdGVkLAogICAqIHRoZSBzYW1lIGJ1ZmZlciBpcyB1c2VkIHRvIGNvbnRpbnVlIHBhcnNpbmcgaW4gdGhlIG5leHQgY2h1bmsuCiAgICovCiAgdm9pZCBiZWdpblN0cmluZygpOwogIC8qKgogICAqIEFkZCBzaW5nbGUgY2hhcmFjdGVyIGNvZGUgdG8gc3RyaW5nIGJlaW5nIGJ1aWx0LgogICAqCiAgICogVXNlZCBmb3IgdW5wYXJzZWQgZXNjYXBlIHNlcXVlbmNlcy4KICAgKi8KICB2b2lkIGFkZENoYXJUb1N0cmluZyhpbnQgY2hhckNvZGUpOwoKICAvKioKICAgKiBBZGRzIHNsaWNlIG9mIGN1cnJlbnQgY2h1bmsgdG8gc3RyaW5nIGJlaW5nIGJ1aWx0LgogICAqCiAgICogVGhlIFtzdGFydF0gcG9zaXRpb25zIGlzIGluY2x1c2l2ZSwgW2VuZF0gaXMgZXhjbHVzaXZlLgogICAqLwogIHZvaWQgYWRkU2xpY2VUb1N0cmluZyhpbnQgc3RhcnQsIGludCBlbmQpOwoKICAvKiogRmluYWxpemVzIHRoZSBzdHJpbmcgYmVpbmcgYnVpbHQgYW5kIHJldHVybnMgaXQgYXMgYSBTdHJpbmcuICovCiAgU3RyaW5nIGVuZFN0cmluZygpOwoKICAvKioKICAgKiBFeHRyYWN0cyBhIGxpdGVyYWwgc3RyaW5nIGZyb20gYSBzbGljZSBvZiB0aGUgY3VycmVudCBjaHVuay4KICAgKgogICAqIE5vIGludGVycHJldGF0aW9uIG9mIHRoZSBjb250ZW50IGlzIHBlcmZvcm1lZCwgZXhjZXB0IGZvciBjb252ZXJ0aW5nCiAgICogdGhlIHNvdXJjZSBmb3JtYXQgdG8gc3RyaW5nLgogICAqIFRoaXMgY2FuIGJlIGltcGxlbWVudGVkIG1vcmUgb3IgbGVzcyBlZmZpY2llbnRseSBkZXBlbmRpbmcgb24gdGhlCiAgICogdW5kZXJseWluZyBzb3VyY2UuCiAgICoKICAgKiBUaGlzIGlzIHVzZWQgZm9yIHN0cmluZyBsaXRlcmFscyB0aGF0IGNvbnRhaW4gbm8gZXNjYXBlcy4KICAgKgogICAqIFRoZSBbYml0c10gaW50ZWdlciBpcyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UKICAgKiBmcm9tIGBzdGFydGAgdG8gYGVuZGAuCiAgICogVXN1YWxseSBmb3VuZCBieSBkb2luZyBiaXR3aXNlIG9yIG9mIGFsbCB0aGUgdmFsdWVzLgogICAqIFRoZSBmdW5jdGlvbiBtYXkgY2hvb3NlIHRvIG9wdGltaXplIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUuCiAgICovCiAgU3RyaW5nIGdldFN0cmluZyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaXRzKTsKCiAgLyoqCiAgICogUGFyc2UgYSBzbGljZSBvZiB0aGUgY3VycmVudCBjaHVuayBhcyBhIG51bWJlci4KICAgKgogICAqIFNpbmNlIGludGVnZXJzIGhhdmUgYSBtYXhpbWFsIHZhbHVlLCBhbmQgd2UgZG9uJ3QgdHJhY2sgdGhlIHZhbHVlCiAgICogaW4gdGhlIGJ1ZmZlciwgYSBzZXF1ZW5jZSBvZiBkaWdpdHMgY2FuIGJlIGVpdGhlciBhbiBpbnQgb3IgYSBkb3VibGUuCiAgICogVGhlIGBudW0ucGFyc2VgIGZ1bmN0aW9uIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgogICAqCiAgICogVGhlIGZvcm1hdCBpcyBleHBlY3RlZCB0byBiZSBjb3JyZWN0LgogICAqLwogIG51bSBwYXJzZU51bShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGNvbnN0IGludCBhc2NpaUJpdHMgPSAweDdmOyAvLyBOdW1iZXIgbGl0ZXJhbHMgYXJlIEFTQ0lJIG9ubHkuCiAgICByZXR1cm4gbnVtLnBhcnNlKGdldFN0cmluZyhzdGFydCwgZW5kLCBhc2NpaUJpdHMpKTsKICB9CgogIC8qKgogICAqIFBhcnNlIGEgc2xpY2Ugb2YgdGhlIGN1cnJlbnQgY2h1bmsgYXMgYSBkb3VibGUuCiAgICoKICAgKiBUaGUgZm9ybWF0IGlzIGV4cGVjdGVkIHRvIGJlIGNvcnJlY3QuCiAgICogVGhpcyBpcyB1c2VkIGJ5IFtwYXJzZU51bWJlcl0gd2hlbiB0aGUgZG91YmxlIHZhbHVlIGNhbm5vdCBiZQogICAqIGJ1aWx0IGV4YWN0bHkgZHVyaW5nIHBhcnNpbmcuCiAgICovCiAgZG91YmxlIHBhcnNlRG91YmxlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgY29uc3QgaW50IGFzY2lpQml0cyA9IDB4N2Y7IC8vIERvdWJsZSBsaXRlcmFscyBhcmUgQVNDSUkgb25seS4KICAgIHJldHVybiBkb3VibGUucGFyc2UoZ2V0U3RyaW5nKHN0YXJ0LCBlbmQsIGFzY2lpQml0cykpOwogIH0KCiAgLyoqCiAgICogQ29udGludWVzIHBhcnNpbmcgYSBwYXJ0aWFsIHZhbHVlLgogICAqLwogIGludCBwYXJzZVBhcnRpYWwoaW50IHBvc2l0aW9uKSB7CiAgICBpZiAocG9zaXRpb24gPT0gY2h1bmtFbmQpIHJldHVybiBwb3NpdGlvbjsKICAgIGludCBwYXJ0aWFsU3RhdGUgPSB0aGlzLnBhcnRpYWxTdGF0ZTsKICAgIGFzc2VydChwYXJ0aWFsU3RhdGUgIT0gTk9fUEFSVElBTCk7CiAgICBpbnQgcGFydGlhbFR5cGUgPSBwYXJ0aWFsU3RhdGUgJiBNQVNLX1BBUlRJQUw7CiAgICB0aGlzLnBhcnRpYWxTdGF0ZSA9IE5PX1BBUlRJQUw7CiAgICBwYXJ0aWFsU3RhdGUgPSBwYXJ0aWFsU3RhdGUgJiB+TUFTS19QQVJUSUFMOwogICAgYXNzZXJ0KHBhcnRpYWxUeXBlICE9IDApOwogICAgaWYgKHBhcnRpYWxUeXBlID09IFBBUlRJQUxfU1RSSU5HKSB7CiAgICAgIHBvc2l0aW9uID0gcGFyc2VQYXJ0aWFsU3RyaW5nKHBvc2l0aW9uLCBwYXJ0aWFsU3RhdGUpOwogICAgfSBlbHNlIGlmIChwYXJ0aWFsVHlwZSA9PSBQQVJUSUFMX05VTUVSQUwpIHsKICAgICAgcG9zaXRpb24gPSBwYXJzZVBhcnRpYWxOdW1iZXIocG9zaXRpb24sIHBhcnRpYWxTdGF0ZSk7CiAgICB9IGVsc2UgaWYgKHBhcnRpYWxUeXBlID09IFBBUlRJQUxfS0VZV09SRCkgewogICAgICBwb3NpdGlvbiA9IHBhcnNlUGFydGlhbEtleXdvcmQocG9zaXRpb24sIHBhcnRpYWxTdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gcG9zaXRpb247CiAgfQoKICAvKioKICAgKiBQYXJzZXMgdGhlIHJlbWFpbmRlciBvZiBhIG51bWJlciBpbnRvIHRoZSBudW1iZXIgYnVmZmVyLgogICAqCiAgICogU3ludGF4IGlzIGNoZWNrZWQgd2hpbGUgcGFzaW5nLgogICAqIFN0YXJ0cyBhdCBwb3NpdGlvbiwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIHN0YXJ0IG9mIHRoZSBjaHVuaywKICAgKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi1udW1iZXItbGl0ZXJhbCBjaGFyYWN0ZXIgZm91bmQsCiAgICogb3IgY2h1bmtFbmQgaWYgdGhlIGVudGlyZSBjaHVuayBpcyBhIHZhbGlkIG51bWJlciBjb250aW51YXRpb24uCiAgICogVGhyb3dzIGlmIGEgc3ludGF4IGVycm9yIGlzIGRldGVjdGVkLgogICAqLwogIGludCBwYXJzZVBhcnRpYWxOdW1iZXIoaW50IHBvc2l0aW9uLCBpbnQgc3RhdGUpIHsKICAgIGludCBzdGFydCA9IHBvc2l0aW9uOwogICAgLy8gUHJpbWl0aXZlIGltcGxlbWVudGF0aW9uLCBjYW4gYmUgb3B0aW1pemVkLgogICAgX051bWJlckJ1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKICAgIGludCBlbmQgPSBjaHVua0VuZDsKICAgIHRvQmFpbG91dDoKICAgIHsKICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgYnJlYWsgdG9CYWlsb3V0OwogICAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICBpbnQgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICBpZiAoc3RhdGUgPT0gTlVNX1NJR04pIHsKICAgICAgICBpZiAoZGlnaXQgPD0gOSkgewogICAgICAgICAgaWYgKGRpZ2l0ID09IDApIHsKICAgICAgICAgICAgc3RhdGUgPSBOVU1fWkVSTzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX0RJR0lUOwogICAgICAgICAgfQogICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIGJyZWFrIHRvQmFpbG91dDsKICAgICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICAgIGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RhdGUgPT0gTlVNX1pFUk8pIHsKICAgICAgICAvLyBKU09OIGRvZXMgbm90IGFsbG93IGluc2lnbmlmaWNhbnQgbGVhZGluZyB6ZXJvcyAoZS5nLiwgIjA5IikuCiAgICAgICAgaWYgKGRpZ2l0IDw9IDkpIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICBzdGF0ZSA9IE5VTV9ESUdJVDsKICAgICAgfQogICAgICB3aGlsZSAoc3RhdGUgPT0gTlVNX0RJR0lUKSB7CiAgICAgICAgaWYgKGRpZ2l0ID4gOSkgewogICAgICAgICAgaWYgKGNoYXIgPT0gREVDSU1BTFBPSU5UKSB7CiAgICAgICAgICAgIHN0YXRlID0gTlVNX0RPVDsKICAgICAgICAgIH0gZWxzZSBpZiAoKGNoYXIgfCAweDIwKSA9PSBDSEFSX2UpIHsKICAgICAgICAgICAgc3RhdGUgPSBOVU1fRTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZpbmlzaENodW5rTnVtYmVyKHN0YXRlLCBzdGFydCwgcG9zaXRpb24sIGJ1ZmZlcik7CiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSBicmVhayB0b0JhaWxvdXQ7CiAgICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICAgIGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgfQogICAgICBpZiAoc3RhdGUgPT0gTlVNX0RPVCkgewogICAgICAgIGlmIChkaWdpdCA+IDkpIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICBzdGF0ZSA9IE5VTV9ET1RfRElHSVQ7CiAgICAgIH0KICAgICAgd2hpbGUgKHN0YXRlID09IE5VTV9ET1RfRElHSVQpIHsKICAgICAgICBpZiAoZGlnaXQgPiA5KSB7CiAgICAgICAgICBpZiAoKGNoYXIgfCAweDIwKSA9PSBDSEFSX2UpIHsKICAgICAgICAgICAgc3RhdGUgPSBOVU1fRTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZpbmlzaENodW5rTnVtYmVyKHN0YXRlLCBzdGFydCwgcG9zaXRpb24sIGJ1ZmZlcik7CiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSBicmVhayB0b0JhaWxvdXQ7CiAgICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICAgIGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgfQogICAgICBpZiAoc3RhdGUgPT0gTlVNX0UpIHsKICAgICAgICBpZiAoY2hhciA9PSBQTFVTIHx8IGNoYXIgPT0gTUlOVVMpIHsKICAgICAgICAgIHN0YXRlID0gTlVNX0VfU0lHTjsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSBicmVhayB0b0JhaWxvdXQ7CiAgICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzc2VydChzdGF0ZSA+PSBOVU1fRSk7CiAgICAgIHdoaWxlIChkaWdpdCA8PSA5KSB7CiAgICAgICAgc3RhdGUgPSBOVU1fRV9ESUdJVDsKICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIGJyZWFrIHRvQmFpbG91dDsKICAgICAgICBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbik7CiAgICAgICAgZGlnaXQgPSBjaGFyIF4gQ0hBUl8wOwogICAgICB9CiAgICAgIGZpbmlzaENodW5rTnVtYmVyKHN0YXRlLCBzdGFydCwgcG9zaXRpb24sIGJ1ZmZlcik7CiAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgIH0KICAgIC8vIEJhaWxvdXQgY29kZSBpbiBjYXNlIHRoZSBjdXJyZW50IGNodW5rIGVuZHMgd2hpbGUgcGFyc2luZyB0aGUgbnVtZXJhbC4KICAgIGFzc2VydChwb3NpdGlvbiA9PSBlbmQpOwogICAgY29udGludWVDaHVua051bWJlcihzdGF0ZSwgc3RhcnQsIGJ1ZmZlcik7CiAgICByZXR1cm4gY2h1bmtFbmQ7CiAgfQoKICAvKioKICAgKiBDb250aW51ZXMgcGFyc2luZyBhIHBhcnRpYWwgc3RyaW5nIGxpdGVyYWwuCiAgICoKICAgKiBIYW5kbGVzIHBhcnRpYWwgZXNjYXBlcyBhbmQgdGhlbiBoYW5kcyB0aGUgcGFyc2luZyBvZmYgdG8KICAgKiBbcGFyc2VTdHJpbmdUb0J1ZmZlcl0uCiAgICovCiAgaW50IHBhcnNlUGFydGlhbFN0cmluZyhpbnQgcG9zaXRpb24sIGludCBwYXJ0aWFsU3RhdGUpIHsKICAgIGlmIChwYXJ0aWFsU3RhdGUgPT0gU1RSX1BMQUlOKSB7CiAgICAgIHJldHVybiBwYXJzZVN0cmluZ1RvQnVmZmVyKHBvc2l0aW9uKTsKICAgIH0KICAgIGlmIChwYXJ0aWFsU3RhdGUgPT0gU1RSX0VTQ0FQRSkgewogICAgICBwb3NpdGlvbiA9IHBhcnNlU3RyaW5nRXNjYXBlKHBvc2l0aW9uKTsKICAgICAgLy8gcGFyc2VTdHJpbmdFc2NhcGUgc2V0cyBwYXJ0aWFsU3RhdGUgaWYgaXQgc2VlcyB0aGUgZW5kLgogICAgICBpZiAocG9zaXRpb24gPT0gY2h1bmtFbmQpIHJldHVybiBwb3NpdGlvbjsKICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nVG9CdWZmZXIocG9zaXRpb24pOwogICAgfQogICAgYXNzZXJ0KChwYXJ0aWFsU3RhdGUgJiBTVFJfVSkgIT0gMCk7CiAgICBpbnQgdmFsdWUgPSBwYXJ0aWFsU3RhdGUgPj4gU1RSX1VfVkFMVUVfU0hJRlQ7CiAgICBpbnQgY291bnQgPSAocGFydGlhbFN0YXRlID4+IFNUUl9VX0NPVU5UX1NISUZUKSAmIFRXT19CSVRfTUFTSzsKICAgIGZvciAoaW50IGkgPSBjb3VudDsgaSA8IDQ7IGkrKywgcG9zaXRpb24rKykgewogICAgICBpZiAocG9zaXRpb24gPT0gY2h1bmtFbmQpIHJldHVybiBjaHVua1N0cmluZ0VzY2FwZVUoaSwgdmFsdWUpOwogICAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICBpbnQgZGlnaXQgPSBwYXJzZUhleERpZ2l0KGNoYXIpOwogICAgICBpZiAoZGlnaXQgPCAwKSBmYWlsKHBvc2l0aW9uLCAiSW52YWxpZCBoZXggZGlnaXQiKTsKICAgICAgdmFsdWUgPSAxNiAqIHZhbHVlICsgZGlnaXQ7CiAgICB9CiAgICBhZGRDaGFyVG9TdHJpbmcodmFsdWUpOwogICAgcmV0dXJuIHBhcnNlU3RyaW5nVG9CdWZmZXIocG9zaXRpb24pOwogIH0KCiAgLyoqCiAgICogQ29udGludWVzIHBhcnNpbmcgYSBwYXJ0aWFsIGtleXdvcmQuCiAgICovCiAgaW50IHBhcnNlUGFydGlhbEtleXdvcmQoaW50IHBvc2l0aW9uLCBpbnQgcGFydGlhbFN0YXRlKSB7CiAgICBpbnQga2V5d29yZFR5cGUgPSBwYXJ0aWFsU3RhdGUgJiBLV0RfVFlQRV9NQVNLOwogICAgaW50IGNvdW50ID0gcGFydGlhbFN0YXRlID4+IEtXRF9DT1VOVF9TSElGVDsKICAgIGludCBrZXl3b3JkVHlwZUluZGV4ID0ga2V5d29yZFR5cGUgPj4gS1dEX1RZUEVfU0hJRlQ7CiAgICBTdHJpbmcga2V5d29yZCA9CiAgICAgICAgY29uc3QgWyJudWxsIiwgInRydWUiLCAiZmFsc2UiLCAiXHhFRlx4QkJceEJGIl1ba2V5d29yZFR5cGVJbmRleF07CiAgICBhc3NlcnQoY291bnQgPCBrZXl3b3JkLmxlbmd0aCk7CiAgICBkbyB7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBjaHVua0VuZCkgewogICAgICAgIHRoaXMucGFydGlhbFN0YXRlID0KICAgICAgICAgICAgUEFSVElBTF9LRVlXT1JEIHwga2V5d29yZFR5cGUgfCAoY291bnQgPDwgS1dEX0NPVU5UX1NISUZUKTsKICAgICAgICByZXR1cm4gY2h1bmtFbmQ7CiAgICAgIH0KICAgICAgaW50IGV4cGVjdGVkQ2hhciA9IGtleXdvcmQuY29kZVVuaXRBdChjb3VudCk7CiAgICAgIGlmIChnZXRDaGFyKHBvc2l0aW9uKSAhPSBleHBlY3RlZENoYXIpIHsKICAgICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgICAgYXNzZXJ0KGtleXdvcmRUeXBlID09IEtXRF9CT00pOwogICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgIH0KICAgICAgcG9zaXRpb24rKzsKICAgICAgY291bnQrKzsKICAgIH0gd2hpbGUgKGNvdW50IDwga2V5d29yZC5sZW5ndGgpOwogICAgaWYgKGtleXdvcmRUeXBlID09IEtXRF9OVUxMKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU51bGwoKTsKICAgIH0gZWxzZSBpZiAoa2V5d29yZFR5cGUgIT0gS1dEX0JPTSkgewogICAgICBsaXN0ZW5lci5oYW5kbGVCb29sKGtleXdvcmRUeXBlID09IEtXRF9UUlVFKTsKICAgIH0KICAgIHJldHVybiBwb3NpdGlvbjsKICB9CgogIC8qKiBDb252ZXJ0IGhleC1kaWdpdCB0byBpdHMgdmFsdWUuIFJldHVybnMgLTEgaWYgY2hhciBpcyBub3QgYSBoZXggZGlnaXQuICovCiAgaW50IHBhcnNlSGV4RGlnaXQoaW50IGNoYXIpIHsKICAgIGludCBkaWdpdCA9IGNoYXIgXiAweDMwOwogICAgaWYgKGRpZ2l0IDw9IDkpIHJldHVybiBkaWdpdDsKICAgIGludCBsZXR0ZXIgPSAoY2hhciB8IDB4MjApIF4gMHg2MDsKICAgIC8vIHZhbHVlcyAxIC4uIDYgYXJlICdhJyB0aHJvdWdoICdmJwogICAgaWYgKGxldHRlciA8PSA2ICYmIGxldHRlciA+IDApIHJldHVybiBsZXR0ZXIgKyA5OwogICAgcmV0dXJuIC0xOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIHRoZSBjdXJyZW50IGNodW5rIGFzIGEgY2h1bmsgb2YgSlNPTi4KICAgKgogICAqIFN0YXJ0cyBwYXJzaW5nIGF0IFtwb3NpdGlvbl0gYW5kIGNvbnRpbnVlcyB1bnRpbCBbY2h1bmtFbmRdLgogICAqIENvbnRpbnVlcyBwYXJzaW5nIHdoZXJlIHRoZSBwcmV2aW91cyBjaHVuayAoaWYgYW55KSBlbmRlZC4KICAgKi8KICB2b2lkIHBhcnNlKGludCBwb3NpdGlvbikgewogICAgaW50IGxlbmd0aCA9IGNodW5rRW5kOwogICAgaWYgKHBhcnRpYWxTdGF0ZSAhPSBOT19QQVJUSUFMKSB7CiAgICAgIHBvc2l0aW9uID0gcGFyc2VQYXJ0aWFsKHBvc2l0aW9uKTsKICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuOwogICAgfQogICAgaW50IHN0YXRlID0gdGhpcy5zdGF0ZTsKICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkgewogICAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICBzd2l0Y2ggKGNoYXIpIHsKICAgICAgICBjYXNlIFNQQUNFOgogICAgICAgIGNhc2UgQ0FSUklBR0VfUkVUVVJOOgogICAgICAgIGNhc2UgTkVXTElORToKICAgICAgICBjYXNlIFRBQjoKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFFVT1RFOgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1NUUklOR19NQVNLKSAhPSAwKSByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBzdGF0ZSB8PSBWQUxVRV9SRUFEX0JJVFM7CiAgICAgICAgICBwb3NpdGlvbiA9IHBhcnNlU3RyaW5nKHBvc2l0aW9uICsgMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIExCUkFDS0VUOgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIGxpc3RlbmVyLmJlZ2luQXJyYXkoKTsKICAgICAgICAgIHNhdmVTdGF0ZShzdGF0ZSk7CiAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0FSUkFZX0VNUFRZOwogICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTEJSQUNFOgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIGxpc3RlbmVyLmJlZ2luT2JqZWN0KCk7CiAgICAgICAgICBzYXZlU3RhdGUoc3RhdGUpOwogICAgICAgICAgc3RhdGUgPSBTVEFURV9PQkpFQ1RfRU1QVFk7CiAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDSEFSX246CiAgICAgICAgICBpZiAoKHN0YXRlICYgQUxMT1dfVkFMVUVfTUFTSykgIT0gMCkgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgc3RhdGUgfD0gVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24gPSBwYXJzZU51bGwocG9zaXRpb24pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDSEFSX2Y6CiAgICAgICAgICBpZiAoKHN0YXRlICYgQUxMT1dfVkFMVUVfTUFTSykgIT0gMCkgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgc3RhdGUgfD0gVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24gPSBwYXJzZUZhbHNlKHBvc2l0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ0hBUl90OgogICAgICAgICAgaWYgKChzdGF0ZSAmIEFMTE9XX1ZBTFVFX01BU0spICE9IDApIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIHN0YXRlIHw9IFZBTFVFX1JFQURfQklUUzsKICAgICAgICAgIHBvc2l0aW9uID0gcGFyc2VUcnVlKHBvc2l0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ09MT046CiAgICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfT0JKRUNUX0tFWSkgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgICAgICAgbGlzdGVuZXIucHJvcGVydHlOYW1lKCk7CiAgICAgICAgICBzdGF0ZSA9IFNUQVRFX09CSkVDVF9DT0xPTjsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENPTU1BOgogICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX09CSkVDVF9WQUxVRSkgewogICAgICAgICAgICBsaXN0ZW5lci5wcm9wZXJ0eVZhbHVlKCk7CiAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfT0JKRUNUX0NPTU1BOwogICAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTVEFURV9BUlJBWV9WQUxVRSkgewogICAgICAgICAgICBsaXN0ZW5lci5hcnJheUVsZW1lbnQoKTsKICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9BUlJBWV9DT01NQTsKICAgICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUkJSQUNLRVQ6CiAgICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfQVJSQVlfRU1QVFkpIHsKICAgICAgICAgICAgbGlzdGVuZXIuZW5kQXJyYXkoKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBVEVfQVJSQVlfVkFMVUUpIHsKICAgICAgICAgICAgbGlzdGVuZXIuYXJyYXlFbGVtZW50KCk7CiAgICAgICAgICAgIGxpc3RlbmVyLmVuZEFycmF5KCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZSA9IHJlc3RvcmVTdGF0ZSgpIHwgVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUkJSQUNFOgogICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX09CSkVDVF9FTVBUWSkgewogICAgICAgICAgICBsaXN0ZW5lci5lbmRPYmplY3QoKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBVEVfT0JKRUNUX1ZBTFVFKSB7CiAgICAgICAgICAgIGxpc3RlbmVyLnByb3BlcnR5VmFsdWUoKTsKICAgICAgICAgICAgbGlzdGVuZXIuZW5kT2JqZWN0KCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZSA9IHJlc3RvcmVTdGF0ZSgpIHwgVkFMVUVfUkVBRF9CSVRTOwogICAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAoKHN0YXRlICYgQUxMT1dfVkFMVUVfTUFTSykgIT0gMCkgZmFpbChwb3NpdGlvbik7CiAgICAgICAgICBzdGF0ZSB8PSBWQUxVRV9SRUFEX0JJVFM7CiAgICAgICAgICBwb3NpdGlvbiA9IHBhcnNlTnVtYmVyKGNoYXIsIHBvc2l0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYSAidHJ1ZSIgbGl0ZXJhbCBzdGFydGluZyBhdCBbcG9zaXRpb25dLgogICAqCiAgICogVGhlIGNoYXJhY3RlciBgc291cmNlW3Bvc2l0aW9uXWAgbXVzdCBiZSAidCIuCiAgICovCiAgaW50IHBhcnNlVHJ1ZShpbnQgcG9zaXRpb24pIHsKICAgIGFzc2VydChnZXRDaGFyKHBvc2l0aW9uKSA9PSBDSEFSX3QpOwogICAgaWYgKGNodW5rRW5kIDwgcG9zaXRpb24gKyA0KSB7CiAgICAgIHJldHVybiBwYXJzZUtleXdvcmRQcmVmaXgocG9zaXRpb24sICJ0cnVlIiwgS1dEX1RSVUUpOwogICAgfQogICAgaWYgKGdldENoYXIocG9zaXRpb24gKyAxKSAhPSBDSEFSX3IgfHwKICAgICAgICBnZXRDaGFyKHBvc2l0aW9uICsgMikgIT0gQ0hBUl91IHx8CiAgICAgICAgZ2V0Q2hhcihwb3NpdGlvbiArIDMpICE9IENIQVJfZSkgewogICAgICByZXR1cm4gZmFpbChwb3NpdGlvbik7CiAgICB9CiAgICBsaXN0ZW5lci5oYW5kbGVCb29sKHRydWUpOwogICAgcmV0dXJuIHBvc2l0aW9uICsgNDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhICJmYWxzZSIgbGl0ZXJhbCBzdGFydGluZyBhdCBbcG9zaXRpb25dLgogICAqCiAgICogVGhlIGNoYXJhY3RlciBgc291cmNlW3Bvc2l0aW9uXWAgbXVzdCBiZSAiZiIuCiAgICovCiAgaW50IHBhcnNlRmFsc2UoaW50IHBvc2l0aW9uKSB7CiAgICBhc3NlcnQoZ2V0Q2hhcihwb3NpdGlvbikgPT0gQ0hBUl9mKTsKICAgIGlmIChjaHVua0VuZCA8IHBvc2l0aW9uICsgNSkgewogICAgICByZXR1cm4gcGFyc2VLZXl3b3JkUHJlZml4KHBvc2l0aW9uLCAiZmFsc2UiLCBLV0RfRkFMU0UpOwogICAgfQogICAgaWYgKGdldENoYXIocG9zaXRpb24gKyAxKSAhPSBDSEFSX2EgfHwKICAgICAgICBnZXRDaGFyKHBvc2l0aW9uICsgMikgIT0gQ0hBUl9sIHx8CiAgICAgICAgZ2V0Q2hhcihwb3NpdGlvbiArIDMpICE9IENIQVJfcyB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyA0KSAhPSBDSEFSX2UpIHsKICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlQm9vbChmYWxzZSk7CiAgICByZXR1cm4gcG9zaXRpb24gKyA1OwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgIm51bGwiIGxpdGVyYWwgc3RhcnRpbmcgYXQgW3Bvc2l0aW9uXS4KICAgKgogICAqIFRoZSBjaGFyYWN0ZXIgYHNvdXJjZVtwb3NpdGlvbl1gIG11c3QgYmUgIm4iLgogICAqLwogIGludCBwYXJzZU51bGwoaW50IHBvc2l0aW9uKSB7CiAgICBhc3NlcnQoZ2V0Q2hhcihwb3NpdGlvbikgPT0gQ0hBUl9uKTsKICAgIGlmIChjaHVua0VuZCA8IHBvc2l0aW9uICsgNCkgewogICAgICByZXR1cm4gcGFyc2VLZXl3b3JkUHJlZml4KHBvc2l0aW9uLCAibnVsbCIsIEtXRF9OVUxMKTsKICAgIH0KICAgIGlmIChnZXRDaGFyKHBvc2l0aW9uICsgMSkgIT0gQ0hBUl91IHx8CiAgICAgICAgZ2V0Q2hhcihwb3NpdGlvbiArIDIpICE9IENIQVJfbCB8fAogICAgICAgIGdldENoYXIocG9zaXRpb24gKyAzKSAhPSBDSEFSX2wpIHsKICAgICAgcmV0dXJuIGZhaWwocG9zaXRpb24pOwogICAgfQogICAgbGlzdGVuZXIuaGFuZGxlTnVsbCgpOwogICAgcmV0dXJuIHBvc2l0aW9uICsgNDsKICB9CgogIGludCBwYXJzZUtleXdvcmRQcmVmaXgoaW50IHBvc2l0aW9uLCBTdHJpbmcgY2hhcnMsIGludCB0eXBlKSB7CiAgICBhc3NlcnQoZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2hhcnMuY29kZVVuaXRBdCgwKSk7CiAgICBpbnQgbGVuZ3RoID0gY2h1bmtFbmQ7CiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIGludCBjb3VudCA9IDE7CiAgICB3aGlsZSAoKytwb3NpdGlvbiA8IGxlbmd0aCkgewogICAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICBpZiAoY2hhciAhPSBjaGFycy5jb2RlVW5pdEF0KGNvdW50KSkgcmV0dXJuIGZhaWwoc3RhcnQpOwogICAgICBjb3VudCsrOwogICAgfQogICAgdGhpcy5wYXJ0aWFsU3RhdGUgPSBQQVJUSUFMX0tFWVdPUkQgfCB0eXBlIHwgKGNvdW50IDw8IEtXRF9DT1VOVF9TSElGVCk7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgc3RyaW5nIHZhbHVlLgogICAqCiAgICogSW5pdGlhbCBbcG9zaXRpb25dIGlzIHJpZ2h0IGFmdGVyIHRoZSBpbml0aWFsIHF1b3RlLgogICAqIFJldHVybmVkIHBvc2l0aW9uIHJpZ2h0IGFmdGVyIHRoZSBmaW5hbCBxdW90ZS4KICAgKi8KICBpbnQgcGFyc2VTdHJpbmcoaW50IHBvc2l0aW9uKSB7CiAgICAvLyBGb3JtYXQ6ICciJyhbXlx4MDAtXHgxZlxcXCJdfCdcXCdbYmZucnQvXFwiXSkqJyInCiAgICAvLyBJbml0aWFsIHBvc2l0aW9uIGlzIHJpZ2h0IGFmdGVyIGZpcnN0ICciJy4KICAgIGludCBzdGFydCA9IHBvc2l0aW9uOwogICAgaW50IGVuZCA9IGNodW5rRW5kOwogICAgaW50IGJpdHMgPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7CiAgICAgIGludCBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbisrKTsKICAgICAgYml0cyB8PSBjaGFyOyAvLyBJbmNsdWRlcyBmaW5hbCAnIicsIGJ1dCB0aGF0IG5ldmVyIG1hdHRlcnMuCiAgICAgIC8vIEJBQ0tTTEFTSCBpcyBsYXJnZXIgdGhhbiBRVU9URSBhbmQgU1BBQ0UuCiAgICAgIGlmIChjaGFyID4gQkFDS1NMQVNIKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gQkFDS1NMQVNIKSB7CiAgICAgICAgYmVnaW5TdHJpbmcoKTsKICAgICAgICBpbnQgc2xpY2VFbmQgPSBwb3NpdGlvbiAtIDE7CiAgICAgICAgaWYgKHN0YXJ0IDwgc2xpY2VFbmQpIGFkZFNsaWNlVG9TdHJpbmcoc3RhcnQsIHNsaWNlRW5kKTsKICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmdUb0J1ZmZlcihzbGljZUVuZCk7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT0gUVVPVEUpIHsKICAgICAgICBsaXN0ZW5lci5oYW5kbGVTdHJpbmcoZ2V0U3RyaW5nKHN0YXJ0LCBwb3NpdGlvbiAtIDEsIGJpdHMpKTsKICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPCBTUEFDRSkgewogICAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uIC0gMSwgIkNvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZyIpOwogICAgICB9CiAgICB9CiAgICBiZWdpblN0cmluZygpOwogICAgaWYgKHN0YXJ0IDwgZW5kKSBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgcmV0dXJuIGNodW5rU3RyaW5nKFNUUl9QTEFJTik7CiAgfQoKICAvKioKICAgKiBTZXRzIHVwIGEgcGFydGlhbCBzdHJpbmcgc3RhdGUuCiAgICoKICAgKiBUaGUgc3RhdGUgaXMgZWl0aGVyIG5vdCBpbnNpZGUgYW4gZXNjYXBlLCBvciByaWdodCBhZnRlciBhIGJhY2tzbGFzaC4KICAgKiBGb3IgcGFydGlhbCBzdHJpbmdzIGVuZGluZyBpbnNpZGUgYSBVbmljb2RlIGVzY2FwZSwgdXNlCiAgICogW2NodW5rU3RyaW5nRXNjYXBlVV0uCiAgICovCiAgaW50IGNodW5rU3RyaW5nKGludCBzdHJpbmdTdGF0ZSkgewogICAgcGFydGlhbFN0YXRlID0gUEFSVElBTF9TVFJJTkcgfCBzdHJpbmdTdGF0ZTsKICAgIHJldHVybiBjaHVua0VuZDsKICB9CgogIC8qKgogICAqIFNldHMgdXAgYSBwYXJ0aWFsIHN0cmluZyBzdGF0ZSBmb3IgYSBwYXJ0aWFsbHkgcGFyc2VkIFVuaWNvZGUgZXNjYXBlLgogICAqCiAgICogVGhlIHBhcnRpYWwgc3RyaW5nIHN0YXRlIGluY2x1ZGVzIHRoZSBjdXJyZW50IFtidWZmZXJdIGFuZCB0aGUKICAgKiBudW1iZXIgb2YgaGV4IGRpZ2l0cyBvZiB0aGUgVW5pY29kZSBzZWVuIHNvIGZhciAoZS5nLiwgZm9yIGAiXHUzMCcpCiAgICogdGhlIHN0YXRlIGtub3dzIHRoYXQgdHdvIGRpZ2l0cyBoYXZlIGJlZW4gc2VlbiwgYW5kIHdoYXQgdGhlaXIgdmFsdWUgaXMuCiAgICoKICAgKiBSZXR1cm5zIFtjaHVua0VuZF0gc28gaXQgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiBhIHJldHVybiBzdGF0ZW1lbnQuCiAgICovCiAgaW50IGNodW5rU3RyaW5nRXNjYXBlVShpbnQgY291bnQsIGludCB2YWx1ZSkgewogICAgcGFydGlhbFN0YXRlID0gUEFSVElBTF9TVFJJTkcgfAogICAgICAgIFNUUl9VIHwKICAgICAgICAoY291bnQgPDwgU1RSX1VfQ09VTlRfU0hJRlQpIHwKICAgICAgICAodmFsdWUgPDwgU1RSX1VfVkFMVUVfU0hJRlQpOwogICAgcmV0dXJuIGNodW5rRW5kOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIHRoZSByZW1haW5kZXIgb2YgYSBzdHJpbmcgbGl0ZXJhbCBpbnRvIGEgYnVmZmVyLgogICAqCiAgICogVGhlIGJ1ZmZlciBpcyBzdG9yZWQgaW4gW2J1ZmZlcl0gYW5kIGl0cyB1bmRlcmx5aW5nIGZvcm1hdCBkZXBlbmRzIG9uCiAgICogdGhlIGlucHV0IGNodW5rIHR5cGUuIEZvciBleGFtcGxlIFVURi04IGRlY29kaW5nIGhhcHBlbnMgaW4gdGhlCiAgICogYnVmZmVyLCBub3QgaW4gdGhlIHBhcnNlciwgc2luY2UgYWxsIHNpZ25pZmljYW50IEpTT04gY2hhcmFjdGVycyBhcmUgQVNDSUkuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIHNjYW5zIHRocm91Z2ggdGhlIHN0cmluZyBsaXRlcmFsIGZvciBlc2NhcGVzLCBhbmQgY29waWVzCiAgICogc2xpY2VzIG9mIG5vbi1lc2NhcGUgY2hhcmFjdGVycyB1c2luZyBbYWRkU2xpY2VUb1N0cmluZ10uCiAgICovCiAgaW50IHBhcnNlU3RyaW5nVG9CdWZmZXIoaW50IHBvc2l0aW9uKSB7CiAgICBpbnQgZW5kID0gY2h1bmtFbmQ7CiAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbjsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIHsKICAgICAgICBpZiAocG9zaXRpb24gPiBzdGFydCkgewogICAgICAgICAgYWRkU2xpY2VUb1N0cmluZyhzdGFydCwgcG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2h1bmtTdHJpbmcoU1RSX1BMQUlOKTsKICAgICAgfQogICAgICBpbnQgY2hhciA9IGdldENoYXIocG9zaXRpb24rKyk7CiAgICAgIGlmIChjaGFyID4gQkFDS1NMQVNIKSBjb250aW51ZTsKICAgICAgaWYgKGNoYXIgPCBTUEFDRSkgewogICAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uIC0gMSk7IC8vIENvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZy4KICAgICAgfQogICAgICBpZiAoY2hhciA9PSBRVU9URSkgewogICAgICAgIGludCBxdW90ZVBvc2l0aW9uID0gcG9zaXRpb24gLSAxOwogICAgICAgIGlmIChxdW90ZVBvc2l0aW9uID4gc3RhcnQpIHsKICAgICAgICAgIGFkZFNsaWNlVG9TdHJpbmcoc3RhcnQsIHF1b3RlUG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICBsaXN0ZW5lci5oYW5kbGVTdHJpbmcoZW5kU3RyaW5nKCkpOwogICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgfQogICAgICBpZiAoY2hhciAhPSBCQUNLU0xBU0gpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBIYW5kbGUgZXNjYXBlLgogICAgICBpZiAocG9zaXRpb24gLSAxID4gc3RhcnQpIHsKICAgICAgICBhZGRTbGljZVRvU3RyaW5nKHN0YXJ0LCBwb3NpdGlvbiAtIDEpOwogICAgICB9CiAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIHJldHVybiBjaHVua1N0cmluZyhTVFJfRVNDQVBFKTsKICAgICAgcG9zaXRpb24gPSBwYXJzZVN0cmluZ0VzY2FwZShwb3NpdGlvbik7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBlbmQpIHJldHVybiBwb3NpdGlvbjsKICAgICAgc3RhcnQgPSBwb3NpdGlvbjsKICAgIH0KICAgIHJldHVybiAtMTsgLy8gVU5SRUFDSEFCTEUuCiAgfQoKICAvKioKICAgKiBQYXJzZSBhIHN0cmluZyBlc2NhcGUuCiAgICoKICAgKiBQb3NpdGlvbiBpcyByaWdodCBhZnRlciB0aGUgaW5pdGlhbCBiYWNrc2xhc2guCiAgICogVGhlIGZvbGxvd2luZyBlc2NhcGUgaXMgcGFyc2VkIGludG8gYSBjaGFyYWN0ZXIgY29kZSB3aGljaCBpcyBhZGRlZCB0bwogICAqIHRoZSBjdXJyZW50IHN0cmluZyBidWZmZXIgdXNpbmcgW2FkZENoYXJUb1N0cmluZ10uCiAgICoKICAgKiBSZXR1cm5zIHBvc2l0aW9uIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgZXNjYXBlLgogICAqLwogIGludCBwYXJzZVN0cmluZ0VzY2FwZShpbnQgcG9zaXRpb24pIHsKICAgIGludCBjaGFyID0gZ2V0Q2hhcihwb3NpdGlvbisrKTsKICAgIGludCBsZW5ndGggPSBjaHVua0VuZDsKICAgIHN3aXRjaCAoY2hhcikgewogICAgICBjYXNlIENIQVJfYjoKICAgICAgICBjaGFyID0gQkFDS1NQQUNFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENIQVJfZjoKICAgICAgICBjaGFyID0gRk9STV9GRUVEOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENIQVJfbjoKICAgICAgICBjaGFyID0gTkVXTElORTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSEFSX3I6CiAgICAgICAgY2hhciA9IENBUlJJQUdFX1JFVFVSTjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSEFSX3Q6CiAgICAgICAgY2hhciA9IFRBQjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTTEFTSDoKICAgICAgY2FzZSBCQUNLU0xBU0g6CiAgICAgIGNhc2UgUVVPVEU6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hBUl91OgogICAgICAgIGludCBoZXhTdGFydCA9IHBvc2l0aW9uIC0gMTsKICAgICAgICBpbnQgdmFsdWUgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBpZiAocG9zaXRpb24gPT0gbGVuZ3RoKSByZXR1cm4gY2h1bmtTdHJpbmdFc2NhcGVVKGksIHZhbHVlKTsKICAgICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKyspOwogICAgICAgICAgaW50IGRpZ2l0ID0gY2hhciBeIDB4MzA7CiAgICAgICAgICB2YWx1ZSAqPSAxNjsKICAgICAgICAgIGlmIChkaWdpdCA8PSA5KSB7CiAgICAgICAgICAgIHZhbHVlICs9IGRpZ2l0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlnaXQgPSAoY2hhciB8IDB4MjApIC0gQ0hBUl9hOwogICAgICAgICAgICBpZiAoZGlnaXQgPCAwIHx8IGRpZ2l0ID4gNSkgewogICAgICAgICAgICAgIHJldHVybiBmYWlsKGhleFN0YXJ0LCAiSW52YWxpZCB1bmljb2RlIGVzY2FwZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhbHVlICs9IGRpZ2l0ICsgMTA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNoYXIgPSB2YWx1ZTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAoY2hhciA8IFNQQUNFKSByZXR1cm4gZmFpbChwb3NpdGlvbiwgIkNvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZyIpOwogICAgICAgIHJldHVybiBmYWlsKHBvc2l0aW9uLCAiVW5yZWNvZ25pemVkIHN0cmluZyBlc2NhcGUiKTsKICAgIH0KICAgIGFkZENoYXJUb1N0cmluZyhjaGFyKTsKICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBjaHVua1N0cmluZyhTVFJfUExBSU4pOwogICAgcmV0dXJuIHBvc2l0aW9uOwogIH0KCiAgLy8vIFNldHMgdXAgYSBwYXJ0aWFsIG51bWVyYWwgc3RhdGUuCiAgLy8vIFJldHVybnMgY2h1bmtFbmQgdG8gYWxsb3cgZWFzeSBvbmUtbGluZSBiYWlsb3V0IHRlc3RzLgogIGludCBiZWdpbkNodW5rTnVtYmVyKGludCBzdGF0ZSwgaW50IHN0YXJ0KSB7CiAgICBpbnQgZW5kID0gY2h1bmtFbmQ7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICB2YXIgYnVmZmVyID0gbmV3IF9OdW1iZXJCdWZmZXIobGVuZ3RoKTsKICAgIGNvcHlDaGFyc1RvTGlzdChzdGFydCwgZW5kLCBidWZmZXIubGlzdCwgMCk7CiAgICBidWZmZXIubGVuZ3RoID0gbGVuZ3RoOwogICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CiAgICB0aGlzLnBhcnRpYWxTdGF0ZSA9IFBBUlRJQUxfTlVNRVJBTCB8IHN0YXRlOwogICAgcmV0dXJuIGVuZDsKICB9CgogIHZvaWQgYWRkTnVtYmVyQ2h1bmsoX051bWJlckJ1ZmZlciBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCwgaW50IG92ZXJoZWFkKSB7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpbnQgY291bnQgPSBidWZmZXIubGVuZ3RoOwogICAgaW50IG5ld0NvdW50ID0gY291bnQgKyBsZW5ndGg7CiAgICBpbnQgbmV3Q2FwYWNpdHkgPSBuZXdDb3VudCArIG92ZXJoZWFkOwogICAgYnVmZmVyLmVuc3VyZUNhcGFjaXR5KG5ld0NhcGFjaXR5KTsKICAgIGNvcHlDaGFyc1RvTGlzdChzdGFydCwgZW5kLCBidWZmZXIubGlzdCwgY291bnQpOwogICAgYnVmZmVyLmxlbmd0aCA9IG5ld0NvdW50OwogIH0KCiAgLy8gQ29udGludWVzIGFuIGFscmVhZHkgY2h1bmtlZCBudW1iZXIgYWNyb3NzIGFuIGVudGlyZSBjaHVuay4KICBpbnQgY29udGludWVDaHVua051bWJlcihpbnQgc3RhdGUsIGludCBzdGFydCwgX051bWJlckJ1ZmZlciBidWZmZXIpIHsKICAgIGludCBlbmQgPSBjaHVua0VuZDsKICAgIGFkZE51bWJlckNodW5rKGJ1ZmZlciwgc3RhcnQsIGVuZCwgX051bWJlckJ1ZmZlci5rRGVmYXVsdE92ZXJoZWFkKTsKICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5wYXJ0aWFsU3RhdGUgPSBQQVJUSUFMX05VTUVSQUwgfCBzdGF0ZTsKICAgIHJldHVybiBlbmQ7CiAgfQoKICBpbnQgZmluaXNoQ2h1bmtOdW1iZXIoaW50IHN0YXRlLCBpbnQgc3RhcnQsIGludCBlbmQsIF9OdW1iZXJCdWZmZXIgYnVmZmVyKSB7CiAgICBpZiAoc3RhdGUgPT0gTlVNX1pFUk8pIHsKICAgICAgbGlzdGVuZXIuaGFuZGxlTnVtYmVyKDApOwogICAgICByZXR1cm4gZW5kOwogICAgfQogICAgaWYgKGVuZCA+IHN0YXJ0KSB7CiAgICAgIGFkZE51bWJlckNodW5rKGJ1ZmZlciwgc3RhcnQsIGVuZCwgMCk7CiAgICB9CiAgICBpZiAoc3RhdGUgPT0gTlVNX0RJR0lUKSB7CiAgICAgIG51bSB2YWx1ZSA9IGJ1ZmZlci5wYXJzZU51bSgpOwogICAgICBsaXN0ZW5lci5oYW5kbGVOdW1iZXIodmFsdWUpOwogICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBOVU1fRE9UX0RJR0lUIHx8IHN0YXRlID09IE5VTV9FX0RJR0lUKSB7CiAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihidWZmZXIucGFyc2VEb3VibGUoKSk7CiAgICB9IGVsc2UgewogICAgICBmYWlsKGNodW5rRW5kLCAiVW50ZXJtaW5hdGVkIG51bWJlciBsaXRlcmFsIik7CiAgICB9CiAgICByZXR1cm4gZW5kOwogIH0KCiAgaW50IHBhcnNlTnVtYmVyKGludCBjaGFyLCBpbnQgcG9zaXRpb24pIHsKICAgIC8vIEFsc28gY2FsbGVkIG9uIGFueSB1bmV4cGVjdGVkIGNoYXJhY3Rlci4KICAgIC8vIEZvcm1hdDoKICAgIC8vICAnLSc/KCcwJ3xbMS05XVswLTldKikoJy4nWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT8KICAgIGludCBzdGFydCA9IHBvc2l0aW9uOwogICAgaW50IGxlbmd0aCA9IGNodW5rRW5kOwogICAgLy8gQ29sbGVjdHMgYW4gaW50IHZhbHVlIHdoaWxlIHBhcnNpbmcuIFVzZWQgZm9yIGJvdGggYW4gaW50ZWdlciBsaXRlcmFsLAogICAgLy8gYW5kIHRoZSBleHBvbmVudCBwYXJ0IG9mIGEgZG91YmxlIGxpdGVyYWwuCiAgICAvLyBTdG9yZWQgYXMgbmVnYXRpdmUgdG8gZW5zdXJlIHdlIGNhbiByZXByZXNlbnQgLTJeNjMuCiAgICBpbnQgaW50VmFsdWUgPSAwOwogICAgZG91YmxlIGRvdWJsZVZhbHVlID0gMC4wOyAvLyBDb2xsZWN0IGRvdWJsZSB2YWx1ZSB3aGlsZSBwYXJzaW5nLgogICAgLy8gMSBpZiB0aGVyZSBpcyBubyBsZWFkaW5nIC0sIC0xIGlmIHRoZXJlIGlzLgogICAgaW50IHNpZ24gPSAxOwogICAgYm9vbCBpc0RvdWJsZSA9IGZhbHNlOwogICAgLy8gQnJlYWsgdGhpcyBibG9jayB3aGVuIHRoZSBlbmQgb2YgdGhlIG51bWJlciBsaXRlcmFsIGlzIHJlYWNoZWQuCiAgICAvLyBBdCB0aGF0IHRpbWUsIHBvc2l0aW9uIHBvaW50cyB0byB0aGUgbmV4dCBjaGFyYWN0ZXIsIGFuZCBpc0RvdWJsZQogICAgLy8gaXMgc2V0IGlmIHRoZSBsaXRlcmFsIGNvbnRhaW5zIGEgZGVjaW1hbCBwb2ludCBvciBhbiBleHBvbmVudGlhbC4KICAgIGlmIChjaGFyID09IE1JTlVTKSB7CiAgICAgIHNpZ24gPSAtMTsKICAgICAgcG9zaXRpb24rKzsKICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuIGJlZ2luQ2h1bmtOdW1iZXIoTlVNX1NJR04sIHN0YXJ0KTsKICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgfQogICAgaW50IGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgIGlmIChkaWdpdCA+IDkpIHsKICAgICAgaWYgKHNpZ24gPCAwKSB7CiAgICAgICAgZmFpbChwb3NpdGlvbiwgIk1pc3NpbmcgZXhwZWN0ZWQgZGlnaXQiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IGV2ZW4gc3RhcnQgb3V0IGFzIGEgbnVtZXJhbC4KICAgICAgICBmYWlsKHBvc2l0aW9uKTsKICAgICAgfQogICAgfQogICAgaWYgKGRpZ2l0ID09IDApIHsKICAgICAgcG9zaXRpb24rKzsKICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuIGJlZ2luQ2h1bmtOdW1iZXIoTlVNX1pFUk8sIHN0YXJ0KTsKICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIC8vIElmIHN0YXJ0aW5nIHdpdGggemVybywgbmV4dCBjaGFyYWN0ZXIgbXVzdCBub3QgYmUgZGlnaXQuCiAgICAgIGlmIChkaWdpdCA8PSA5KSBmYWlsKHBvc2l0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGludCBkaWdpdENvdW50ID0gMDsKICAgICAgZG8gewogICAgICAgIGlmIChkaWdpdENvdW50ID49IDE4KSB7CiAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cuCiAgICAgICAgICAvLyBJcyAxIGlmIGRpZ2l0IGlzIDggb3IgOSBhbmQgc2lnbiA9PSAwLCBvciBkaWdpdCBpcyA5IGFuZCBzaWduIDwgMDsKICAgICAgICAgIGludCBoaWdoRGlnaXQgPSBkaWdpdCA+PiAzOwogICAgICAgICAgaWYgKHNpZ24gPCAwKSBoaWdoRGlnaXQgJj0gZGlnaXQ7CiAgICAgICAgICBpZiAoZGlnaXRDb3VudCA9PSAxOSB8fCBpbnRWYWx1ZSAtIGhpZ2hEaWdpdCA8IC05MjIzMzcyMDM2ODU0Nzc1ODApIHsKICAgICAgICAgICAgaXNEb3VibGUgPSB0cnVlOwogICAgICAgICAgICAvLyBCaWcgdmFsdWUgdGhhdCB3ZSBrbm93IGlzIG5vdCB0cnVzdGVkIHRvIGJlIGV4YWN0IGxhdGVyLAogICAgICAgICAgICAvLyBmb3JjaW5nIHJlcGFyc2luZyB1c2luZyBgZG91YmxlLnBhcnNlYC4KICAgICAgICAgICAgZG91YmxlVmFsdWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGludFZhbHVlID0gMTAgKiBpbnRWYWx1ZSAtIGRpZ2l0OwogICAgICAgIGRpZ2l0Q291bnQrKzsKICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9ESUdJVCwgc3RhcnQpOwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0gd2hpbGUgKGRpZ2l0IDw9IDkpOwogICAgfQogICAgaWYgKGNoYXIgPT0gREVDSU1BTFBPSU5UKSB7CiAgICAgIGlmICghaXNEb3VibGUpIHsKICAgICAgICBpc0RvdWJsZSA9IHRydWU7CiAgICAgICAgZG91YmxlVmFsdWUgPSAoaW50VmFsdWUgPT0gMCkgPyAwLjAgOiAtaW50VmFsdWUudG9Eb3VibGUoKTsKICAgICAgfQogICAgICBpbnRWYWx1ZSA9IDA7CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9ET1QsIHN0YXJ0KTsKICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIGlmIChkaWdpdCA+IDkpIGZhaWwocG9zaXRpb24pOwogICAgICBkbyB7CiAgICAgICAgZG91YmxlVmFsdWUgPSAxMC4wICogZG91YmxlVmFsdWUgKyBkaWdpdDsKICAgICAgICBpbnRWYWx1ZSAtPSAxOwogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuIGJlZ2luQ2h1bmtOdW1iZXIoTlVNX0RPVF9ESUdJVCwgc3RhcnQpOwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIH0gd2hpbGUgKGRpZ2l0IDw9IDkpOwogICAgfQogICAgaWYgKChjaGFyIHwgMHgyMCkgPT0gQ0hBUl9lKSB7CiAgICAgIGlmICghaXNEb3VibGUpIHsKICAgICAgICBpc0RvdWJsZSA9IHRydWU7CiAgICAgICAgZG91YmxlVmFsdWUgPSAoaW50VmFsdWUgPT0gMCkgPyAwLjAgOiAtaW50VmFsdWUudG9Eb3VibGUoKTsKICAgICAgICBpbnRWYWx1ZSA9IDA7CiAgICAgIH0KICAgICAgcG9zaXRpb24rKzsKICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuIGJlZ2luQ2h1bmtOdW1iZXIoTlVNX0UsIHN0YXJ0KTsKICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICBpbnQgZXhwU2lnbiA9IDE7CiAgICAgIGludCBleHBvbmVudCA9IDA7CiAgICAgIGlmICgoKGNoYXIgKyAxKSB8IDIpID09IDB4MmUgLyorIG9yIC0qLykgewogICAgICAgIGV4cFNpZ24gPSAweDJDIC0gY2hhcjsgLy8gLTEgZm9yIE1JTlVTLCArMSBmb3IgUExVUwogICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgaWYgKHBvc2l0aW9uID09IGxlbmd0aCkgcmV0dXJuIGJlZ2luQ2h1bmtOdW1iZXIoTlVNX0VfU0lHTiwgc3RhcnQpOwogICAgICAgIGNoYXIgPSBnZXRDaGFyKHBvc2l0aW9uKTsKICAgICAgfQogICAgICBkaWdpdCA9IGNoYXIgXiBDSEFSXzA7CiAgICAgIGlmIChkaWdpdCA+IDkpIHsKICAgICAgICBmYWlsKHBvc2l0aW9uLCAiTWlzc2luZyBleHBlY3RlZCBkaWdpdCIpOwogICAgICB9CiAgICAgIGJvb2wgZXhwb25lbnRPdmVyZmxvdyA9IGZhbHNlOwogICAgICBkbyB7CiAgICAgICAgZXhwb25lbnQgPSAxMCAqIGV4cG9uZW50ICsgZGlnaXQ7CiAgICAgICAgaWYgKGV4cG9uZW50ID4gNDAwKSBleHBvbmVudE92ZXJmbG93ID0gdHJ1ZTsKICAgICAgICBwb3NpdGlvbisrOwogICAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpIHJldHVybiBiZWdpbkNodW5rTnVtYmVyKE5VTV9FX0RJR0lULCBzdGFydCk7CiAgICAgICAgY2hhciA9IGdldENoYXIocG9zaXRpb24pOwogICAgICAgIGRpZ2l0ID0gY2hhciBeIENIQVJfMDsKICAgICAgfSB3aGlsZSAoZGlnaXQgPD0gOSk7CiAgICAgIGlmIChleHBvbmVudE92ZXJmbG93KSB7CiAgICAgICAgaWYgKGRvdWJsZVZhbHVlID09IDAuMCB8fCBleHBTaWduIDwgMCkgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTnVtYmVyKHNpZ24gPCAwID8gLTAuMCA6IDAuMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcigKICAgICAgICAgICAgICBzaWduIDwgMCA/IGRvdWJsZS5uZWdhdGl2ZUluZmluaXR5IDogZG91YmxlLmluZmluaXR5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICB9CiAgICAgIGludFZhbHVlICs9IGV4cFNpZ24gKiBleHBvbmVudDsKICAgIH0KICAgIGlmICghaXNEb3VibGUpIHsKICAgICAgaW50IGJpdEZsYWcgPSAtKHNpZ24gKyAxKSA+PiAxOyAvLyAwIGlmIHNpZ24gPT0gLTEsIC0xIGlmIHNpZ24gPT0gMQogICAgICAvLyBOZWdhdGUgaWYgYml0RmxhZyBpcyAtMSBieSBkb2luZyB+aW50VmFsdWUgKyAxCiAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcigoaW50VmFsdWUgXiBiaXRGbGFnKSAtIGJpdEZsYWcpOwogICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9CiAgICAvLyBEb3VibGUgdmFsdWVzIGF0IG9yIGFib3ZlIHRoaXMgdmFsdWUgKDIgKiogNTMpIG1heSBoYXZlIGxvc3QgcHJlY2lzaW9uLgogICAgLy8gT25seSB0cnVzdCByZXN1bHRzIHRoYXQgYXJlIGJlbG93IHRoaXMgdmFsdWUuCiAgICBjb25zdCBkb3VibGUgbWF4RXhhY3REb3VibGUgPSA5MDA3MTk5MjU0NzQwOTkyLjA7CiAgICBpZiAoZG91YmxlVmFsdWUgPCBtYXhFeGFjdERvdWJsZSkgewogICAgICBpbnQgZXhwb25lbnQgPSBpbnRWYWx1ZTsKICAgICAgZG91YmxlIHNpZ25lZE1hbnRpc3NhID0gZG91YmxlVmFsdWUgKiBzaWduOwogICAgICBpZiAoZXhwb25lbnQgPj0gLTIyKSB7CiAgICAgICAgaWYgKGV4cG9uZW50IDwgMCkgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTnVtYmVyKHNpZ25lZE1hbnRpc3NhIC8gUE9XRVJTX09GX1RFTlstZXhwb25lbnRdKTsKICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgaWYgKGV4cG9uZW50ID09IDApIHsKICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihzaWduZWRNYW50aXNzYSk7CiAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIGlmIChleHBvbmVudCA8PSAyMikgewogICAgICAgICAgbGlzdGVuZXIuaGFuZGxlTnVtYmVyKHNpZ25lZE1hbnRpc3NhICogUE9XRVJTX09GX1RFTltleHBvbmVudF0pOwogICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gSWYgdGhlIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlICsvLW1heEV4YWN0RG91YmxlIG9yCiAgICAvLyBleHBvbmVudCBpcyBvdXRzaWRlIHRoZSByYW5nZSArLy0yMiwgdGhlbiB3ZSBjYW4ndCB0cnVzdCBzaW1wbGUgZG91YmxlCiAgICAvLyBhcml0aG1ldGljIHRvIGdldCB0aGUgZXhhY3QgcmVzdWx0LCBzbyB3ZSB1c2UgdGhlIHN5c3RlbSBkb3VibGUgcGFyc2luZy4KICAgIGxpc3RlbmVyLmhhbmRsZU51bWJlcihwYXJzZURvdWJsZShzdGFydCwgcG9zaXRpb24pKTsKICAgIHJldHVybiBwb3NpdGlvbjsKICB9CgogIGZhaWwoaW50IHBvc2l0aW9uLCBbU3RyaW5nIG1lc3NhZ2VdKSB7CiAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CiAgICAgIG1lc3NhZ2UgPSAiVW5leHBlY3RlZCBjaGFyYWN0ZXIiOwogICAgICBpZiAocG9zaXRpb24gPT0gY2h1bmtFbmQpIG1lc3NhZ2UgPSAiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiOwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbihtZXNzYWdlLCBjaHVuaywgcG9zaXRpb24pOwogIH0KfQoKLyoqCiAqIENodW5rZWQgSlNPTiBwYXJzZXIgdGhhdCBwYXJzZXMgW1N0cmluZ10gY2h1bmtzLgogKi8KY2xhc3MgX0pzb25TdHJpbmdQYXJzZXIgZXh0ZW5kcyBfQ2h1bmtlZEpzb25QYXJzZXI8U3RyaW5nPiB7CiAgU3RyaW5nIGNodW5rOwogIGludCBjaHVua0VuZDsKCiAgX0pzb25TdHJpbmdQYXJzZXIoX0pzb25MaXN0ZW5lciBsaXN0ZW5lcikgOiBzdXBlcihsaXN0ZW5lcik7CgogIGludCBnZXRDaGFyKGludCBwb3NpdGlvbikgPT4gY2h1bmsuY29kZVVuaXRBdChwb3NpdGlvbik7CgogIFN0cmluZyBnZXRTdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYml0cykgewogICAgcmV0dXJuIGNodW5rLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICB9CgogIHZvaWQgYmVnaW5TdHJpbmcoKSB7CiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICB9CgogIHZvaWQgYWRkU2xpY2VUb1N0cmluZyhpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGJ1ZmZlci53cml0ZShjaHVuay5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwogIH0KCiAgdm9pZCBhZGRDaGFyVG9TdHJpbmcoaW50IGNoYXJDb2RlKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBidWZmZXIud3JpdGVDaGFyQ29kZShjaGFyQ29kZSk7CiAgfQoKICBTdHJpbmcgZW5kU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgdGhpcy5idWZmZXIgPSBudWxsOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgdm9pZCBjb3B5Q2hhcnNUb0xpc3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBMaXN0IHRhcmdldCwgaW50IG9mZnNldCkgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB0YXJnZXRbb2Zmc2V0ICsgaV0gPSBjaHVuay5jb2RlVW5pdEF0KHN0YXJ0ICsgaSk7CiAgICB9CiAgfQoKICBkb3VibGUgcGFyc2VEb3VibGUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICByZXR1cm4gX3BhcnNlRG91YmxlKGNodW5rLCBzdGFydCwgZW5kKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBKc29uRGVjb2RlciB7CiAgQHBhdGNoCiAgU3RyaW5nQ29udmVyc2lvblNpbmsgc3RhcnRDaHVua2VkQ29udmVyc2lvbihTaW5rPE9iamVjdD4gc2luaykgewogICAgcmV0dXJuIG5ldyBfSnNvblN0cmluZ0RlY29kZXJTaW5rKHRoaXMuX3Jldml2ZXIsIHNpbmspOwogIH0KfQoKLyoqCiAqIEltcGxlbWVudHMgdGhlIGNodW5rZWQgY29udmVyc2lvbiBmcm9tIGEgSlNPTiBzdHJpbmcgdG8gaXRzIGNvcnJlc3BvbmRpbmcKICogb2JqZWN0LgogKgogKiBUaGUgc2luayBvbmx5IGNyZWF0ZXMgb25lIG9iamVjdCwgYnV0IGl0cyBpbnB1dCBjYW4gYmUgY2h1bmtlZC4KICovCmNsYXNzIF9Kc29uU3RyaW5nRGVjb2RlclNpbmsgZXh0ZW5kcyBTdHJpbmdDb252ZXJzaW9uU2lua0Jhc2UgewogIF9Kc29uU3RyaW5nUGFyc2VyIF9wYXJzZXI7CiAgZmluYWwgRnVuY3Rpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSBfcmV2aXZlcjsKICBmaW5hbCBTaW5rPE9iamVjdD4gX3Npbms7CgogIF9Kc29uU3RyaW5nRGVjb2RlclNpbmsodGhpcy5fcmV2aXZlciwgdGhpcy5fc2luaykKICAgICAgOiBfcGFyc2VyID0gX2NyZWF0ZVBhcnNlcihfcmV2aXZlcik7CgogIHN0YXRpYyBfSnNvblN0cmluZ1BhcnNlciBfY3JlYXRlUGFyc2VyKHJldml2ZXIpIHsKICAgIF9CdWlsZEpzb25MaXN0ZW5lciBsaXN0ZW5lcjsKICAgIGlmIChyZXZpdmVyID09IG51bGwpIHsKICAgICAgbGlzdGVuZXIgPSBuZXcgX0J1aWxkSnNvbkxpc3RlbmVyKCk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lciA9IG5ldyBfUmV2aXZlckpzb25MaXN0ZW5lcihyZXZpdmVyKTsKICAgIH0KICAgIHJldHVybiBuZXcgX0pzb25TdHJpbmdQYXJzZXIobGlzdGVuZXIpOwogIH0KCiAgdm9pZCBhZGRTbGljZShTdHJpbmcgY2h1bmssIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBpc0xhc3QpIHsKICAgIF9wYXJzZXIuY2h1bmsgPSBjaHVuazsKICAgIF9wYXJzZXIuY2h1bmtFbmQgPSBlbmQ7CiAgICBfcGFyc2VyLnBhcnNlKHN0YXJ0KTsKICAgIGlmIChpc0xhc3QpIF9wYXJzZXIuY2xvc2UoKTsKICB9CgogIHZvaWQgYWRkKFN0cmluZyBjaHVuaykgewogICAgYWRkU2xpY2UoY2h1bmssIDAsIGNodW5rLmxlbmd0aCwgZmFsc2UpOwogIH0KCiAgdm9pZCBjbG9zZSgpIHsKICAgIF9wYXJzZXIuY2xvc2UoKTsKICAgIHZhciBkZWNvZGVkID0gX3BhcnNlci5yZXN1bHQ7CiAgICBfc2luay5hZGQoZGVjb2RlZCk7CiAgICBfc2luay5jbG9zZSgpOwogIH0KCiAgQnl0ZUNvbnZlcnNpb25TaW5rIGFzVXRmOFNpbmsoYm9vbCBhbGxvd01hbGZvcm1lZCkgewogICAgX3BhcnNlciA9IG51bGw7CiAgICByZXR1cm4gbmV3IF9Kc29uVXRmOERlY29kZXJTaW5rKF9yZXZpdmVyLCBfc2luaywgYWxsb3dNYWxmb3JtZWQpOwogIH0KfQoKY2xhc3MgX1V0ZjhTdHJpbmdCdWZmZXIgewogIHN0YXRpYyBjb25zdCBpbnQgSU5JVElBTF9DQVBBQ0lUWSA9IDMyOwogIC8vIFBhcnRpYWwgc3RhdGUgZW5jb2RpbmcuCiAgc3RhdGljIGNvbnN0IGludCBNQVNLX1RXT19CSVQgPSAweDAzOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19TSVpFID0gTUFTS19UV09fQklUOwogIHN0YXRpYyBjb25zdCBpbnQgU0hJRlRfTUlTU0lORyA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBTSElGVF9WQUxVRSA9IDQ7CiAgc3RhdGljIGNvbnN0IGludCBOT19QQVJUSUFMID0gMDsKCiAgLy8gVVRGLTggZW5jb2RpbmcgYW5kIGxpbWl0cy4KICBzdGF0aWMgY29uc3QgaW50IE1BWF9BU0NJSSA9IDEyNzsKICBzdGF0aWMgY29uc3QgaW50IE1BWF9UV09fQllURSA9IDB4N2ZmOwogIHN0YXRpYyBjb25zdCBpbnQgTUFYX1RIUkVFX0JZVEUgPSAweGZmZmY7CiAgc3RhdGljIGNvbnN0IGludCBNQVhfVU5JQ09ERSA9IDBYMTBmZmZmOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19UV09fQllURSA9IDB4MWY7CiAgc3RhdGljIGNvbnN0IGludCBNQVNLX1RIUkVFX0JZVEUgPSAweDBmOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19GT1VSX0JZVEUgPSAweDA3OwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19DT05USU5VRV9UQUcgPSAweEMwOwogIHN0YXRpYyBjb25zdCBpbnQgTUFTS19DT05USU5VRV9WQUxVRSA9IDB4M2Y7CiAgc3RhdGljIGNvbnN0IGludCBDT05USU5VRV9UQUcgPSAweDgwOwoKICAvLyBVVEYtMTYgc3Vycm9nYXRlIGVuY29kaW5nLgogIHN0YXRpYyBjb25zdCBpbnQgTEVBRF9TVVJST0dBVEUgPSAweEQ4MDA7CiAgc3RhdGljIGNvbnN0IGludCBUQUlMX1NVUlJPR0FURSA9IDB4REMwMDsKICBzdGF0aWMgY29uc3QgaW50IFNISUZUX0hJR0hfU1VSUk9HQVRFID0gMTA7CiAgc3RhdGljIGNvbnN0IGludCBNQVNLX0xPV19TVVJST0dBVEUgPSAweDNmZjsKCiAgLy8gVGhlIGludGVybmFsIGJ1ZmZlciBzdGFydHMgYXMgVWludDhMaXN0LCBidXQgbWF5IGNoYW5nZSB0byBVaW50MTZMaXN0CiAgLy8gaWYgdGhlIHN0cmluZyBjb250YWlucyBub24tTGF0aW4tMSBjaGFyYWN0ZXJzLgogIExpc3Q8aW50PiBidWZmZXIgPSBuZXcgVWludDhMaXN0KElOSVRJQUxfQ0FQQUNJVFkpOwogIC8vIE51bWJlciBvZiBlbGVtZW50cyBpbiBidWZmZXIuCiAgaW50IGxlbmd0aCA9IDA7CiAgLy8gUGFydGlhbCBkZWNvZGluZyBzdGF0ZSwgZm9yIGNhc2VzIHdoZXJlIGFuIFVURi04IHNlcXVlbmNlcyBpcyBzcGxpdAogIC8vIGJldHdlZW4gY2h1bmtzLgogIGludCBwYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogIC8vIFdoZXRoZXIgYWxsIGNoYXJhY3RlcnMgc28gZmFyIGhhdmUgYmVlbiBMYXRpbi0xIChhbmQgdGhlIGJ1ZmZlciBpcwogIC8vIHN0aWxsIGEgVWludDhMaXN0KS4gU2V0IHRvIGZhbHNlIHdoZW4gdGhlIGZpcnN0IG5vbi1MYXRpbi0xIGNoYXJhY3RlcgogIC8vIGlzIGVuY291bnRlcmVkLCBhbmQgdGhlIGJ1ZmZlciBpcyB0aGVuIGFsc28gY29udmVydGVkIHRvIGEgVWludDE2TGlzdC4KICBib29sIGlzTGF0aW4xID0gdHJ1ZTsKICAvLyBJZiBhbGxvd2luZyBtYWxmb3JtZWQsIGludmFsaWQgVVRGLTggc2VxdWVuY2VzIGFyZSBjb252ZXJ0ZWQgdG8KICAvLyBVK0ZGRkQuCiAgYm9vbCBhbGxvd01hbGZvcm1lZDsKCiAgX1V0ZjhTdHJpbmdCdWZmZXIodGhpcy5hbGxvd01hbGZvcm1lZCk7CgogIC8qKgogICAqIFBhcnNlIHRoZSBjb250aW51YXRpb24gb2YgYSBtdWx0aS1ieXRlIFVURi04IHNlcXVlbmNlLgogICAqCiAgICogUGFyc2UgW3V0ZjhdIGZyb20gW3Bvc2l0aW9uXSB0byBbZW5kXS4gSWYgdGhlIHNlcXVlbmNlIGV4dGVuZHMgYmV5b25kCiAgICogYGVuZGAsIHN0b3JlIHRoZSBwYXJ0aWFsIHN0YXRlIGluIFtwYXJ0aWFsU3RhdGVdLCBhbmQgY29udGludWUgZnJvbSB0aGVyZQogICAqIG9uIHRoZSBuZXh0IGFkZGVkIHNsaWNlLgogICAqCiAgICogVGhlIFtzaXplXSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB0b3RhbCwKICAgKiBhbmQgW21pc3NpbmddIGlzIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGNvbnRpbnVhdGlvbiBieXRlcy4KICAgKiBUaGUgW3NpemVdIGlzIHVzZWQgdG8gZGV0ZWN0IG92ZXJsb25nIGVuY29kaW5ncy4KICAgKiBUaGUgW3ZhbHVlXSBpcyB0aGUgdmFsdWUgY29sbGVjdGVkIHNvIGZhci4KICAgKgogICAqIFdoZW4gY2FsbGVkIGFmdGVyIHNlZWluZyB0aGUgZmlyc3QgbXVsdGktYnl0ZSBtYXJrZXIsIHRoZSBbc2l6ZV0gYW5kCiAgICogW21pc3NpbmddIHZhbHVlcyBhcmUgYWx3YXlzIHRoZSBzYW1lLCBidXQgdGhleSBtYXkgZGlmZmVyIGlmIGNvbnRpbnVpbmcKICAgKiBhZnRlciBhIHBhcnRpYWwgc2VxdWVuY2UuCiAgICovCiAgaW50IGFkZENvbnRpbnVhdGlvbigKICAgICAgTGlzdDxpbnQ+IHV0ZjgsIGludCBwb3NpdGlvbiwgaW50IGVuZCwgaW50IHNpemUsIGludCBtaXNzaW5nLCBpbnQgdmFsdWUpIHsKICAgIGludCBjb2RlRW5kID0gcG9zaXRpb24gKyBtaXNzaW5nOwogICAgZG8gewogICAgICBpZiAocG9zaXRpb24gPT0gZW5kKSB7CiAgICAgICAgbWlzc2luZyA9IGNvZGVFbmQgLSBwb3NpdGlvbjsKICAgICAgICBwYXJ0aWFsU3RhdGUgPQogICAgICAgICAgICBzaXplIHwgKG1pc3NpbmcgPDwgU0hJRlRfTUlTU0lORykgfCAodmFsdWUgPDwgU0hJRlRfVkFMVUUpOwogICAgICAgIHJldHVybiBlbmQ7CiAgICAgIH0KICAgICAgaW50IGNoYXIgPSB1dGY4W3Bvc2l0aW9uXTsKICAgICAgaWYgKChjaGFyICYgTUFTS19DT05USU5VRV9UQUcpICE9IENPTlRJTlVFX1RBRykgewogICAgICAgIGlmIChhbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgYWRkQ2hhckNvZGUoMHhGRkZEKTsKICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgIkV4cGVjdGVkIFVURi04IGNvbnRpbnVhdGlvbiBieXRlLCAiCiAgICAgICAgICAgICJmb3VuZCAkY2hhciIsCiAgICAgICAgICAgIHV0ZjgsCiAgICAgICAgICAgIHBvc2l0aW9uKTsKICAgICAgfQogICAgICB2YWx1ZSA9IDY0ICogdmFsdWUgKyAoY2hhciAmIE1BU0tfQ09OVElOVUVfVkFMVUUpOwogICAgICBwb3NpdGlvbisrOwogICAgfSB3aGlsZSAocG9zaXRpb24gPCBjb2RlRW5kKTsKICAgIGlmICh2YWx1ZSA8PSBjb25zdCBbMCwgTUFYX0FTQ0lJLCBNQVhfVFdPX0JZVEUsIE1BWF9USFJFRV9CWVRFXVtzaXplXSkgewogICAgICAvLyBPdmVyLWxvbmcgZW5jb2RpbmcuCiAgICAgIGlmIChhbGxvd01hbGZvcm1lZCkgewogICAgICAgIHZhbHVlID0gMHhGRkZEOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJJbnZhbGlkIGVuY29kaW5nOiBVKyR7dmFsdWUudG9SYWRpeFN0cmluZygxNikucGFkTGVmdCg0LCAnMCcpfSIKICAgICAgICAgICAgIiBlbmNvZGVkIGluICR7c2l6ZSArIDF9IGJ5dGVzLiIsCiAgICAgICAgICAgIHV0ZjgsCiAgICAgICAgICAgIHBvc2l0aW9uIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIGFkZENoYXJDb2RlKHZhbHVlKTsKICAgIHJldHVybiBwb3NpdGlvbjsKICB9CgogIHZvaWQgYWRkQ2hhckNvZGUoaW50IGNoYXIpIHsKICAgIGFzc2VydChjaGFyID49IDApOwogICAgYXNzZXJ0KGNoYXIgPD0gTUFYX1VOSUNPREUpOwogICAgaWYgKHBhcnRpYWxTdGF0ZSAhPSBOT19QQVJUSUFMKSB7CiAgICAgIGlmIChhbGxvd01hbGZvcm1lZCkgewogICAgICAgIHBhcnRpYWxTdGF0ZSA9IE5PX1BBUlRJQUw7CiAgICAgICAgYWRkQ2hhckNvZGUoMHhGRkZEKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbmNvbXBsZXRlIFVURi04IHNlcXVlbmNlIik7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc0xhdGluMSAmJiBjaGFyID4gMHhmZikgewogICAgICBfdG8xNkJpdCgpOyAvLyBBbHNvIGdyb3dzIGEgbGl0dGxlIGlmIGNsb3NlIHRvIGZ1bGwuCiAgICB9CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAoY2hhciA8PSBNQVhfVEhSRUVfQllURSkgewogICAgICBpZiAobGVuZ3RoID09IGJ1ZmZlci5sZW5ndGgpIF9ncm93KCk7CiAgICAgIGJ1ZmZlcltsZW5ndGhdID0gY2hhcjsKICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGggKyAxOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobGVuZ3RoICsgMiA+IGJ1ZmZlci5sZW5ndGgpIF9ncm93KCk7CiAgICBpbnQgYml0cyA9IGNoYXIgLSAweDEwMDAwOwogICAgYnVmZmVyW2xlbmd0aF0gPSBMRUFEX1NVUlJPR0FURSB8IChiaXRzID4+IFNISUZUX0hJR0hfU1VSUk9HQVRFKTsKICAgIGJ1ZmZlcltsZW5ndGggKyAxXSA9IFRBSUxfU1VSUk9HQVRFIHwgKGJpdHMgJiBNQVNLX0xPV19TVVJST0dBVEUpOwogICAgdGhpcy5sZW5ndGggPSBsZW5ndGggKyAyOwogIH0KCiAgdm9pZCBfdG8xNkJpdCgpIHsKICAgIGFzc2VydChpc0xhdGluMSk7CiAgICBVaW50MTZMaXN0IG5ld0J1ZmZlcjsKICAgIGlmICgobGVuZ3RoICsgSU5JVElBTF9DQVBBQ0lUWSkgKiAyIDw9IGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgLy8gUmV1c2UgZXhpc3RpbmcgYnVmZmVyIGlmIGl0J3MgYmlnIGVub3VnaC4KICAgICAgbmV3QnVmZmVyID0gbmV3IFVpbnQxNkxpc3QudmlldygoYnVmZmVyIGFzIFVpbnQ4TGlzdCkuYnVmZmVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGludCBuZXdDYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGg7CiAgICAgIGlmIChuZXdDYXBhY2l0eSAtIGxlbmd0aCA8IElOSVRJQUxfQ0FQQUNJVFkpIHsKICAgICAgICBuZXdDYXBhY2l0eSA9IGxlbmd0aCArIElOSVRJQUxfQ0FQQUNJVFk7CiAgICAgIH0KICAgICAgbmV3QnVmZmVyID0gbmV3IFVpbnQxNkxpc3QobmV3Q2FwYWNpdHkpOwogICAgfQogICAgbmV3QnVmZmVyLnNldFJhbmdlKDAsIGxlbmd0aCwgYnVmZmVyKTsKICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjsKICAgIGlzTGF0aW4xID0gZmFsc2U7CiAgfQoKICB2b2lkIF9ncm93KCkgewogICAgaW50IG5ld0NhcGFjaXR5ID0gYnVmZmVyLmxlbmd0aCAqIDI7CiAgICBMaXN0IG5ld0J1ZmZlcjsKICAgIGlmIChpc0xhdGluMSkgewogICAgICBuZXdCdWZmZXIgPSBuZXcgVWludDhMaXN0KG5ld0NhcGFjaXR5KTsKICAgIH0gZWxzZSB7CiAgICAgIG5ld0J1ZmZlciA9IG5ldyBVaW50MTZMaXN0KG5ld0NhcGFjaXR5KTsKICAgIH0KICAgIG5ld0J1ZmZlci5zZXRSYW5nZSgwLCBsZW5ndGgsIGJ1ZmZlcik7CiAgICBidWZmZXIgPSBuZXdCdWZmZXI7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiB1dGY4LCBpbnQgcG9zaXRpb24sIGludCBlbmQpIHsKICAgIGFzc2VydChwb3NpdGlvbiA8IGVuZCk7CiAgICBpZiAocGFydGlhbFN0YXRlID4gMCkgewogICAgICBpbnQgY29udGludWVCeXRlQ291bnQgPSAocGFydGlhbFN0YXRlICYgTUFTS19UV09fQklUKTsKICAgICAgaW50IG1pc3NpbmcgPSAocGFydGlhbFN0YXRlID4+IFNISUZUX01JU1NJTkcpICYgTUFTS19UV09fQklUOwogICAgICBpbnQgdmFsdWUgPSBwYXJ0aWFsU3RhdGUgPj4gU0hJRlRfVkFMVUU7CiAgICAgIHBhcnRpYWxTdGF0ZSA9IE5PX1BBUlRJQUw7CiAgICAgIHBvc2l0aW9uID0gYWRkQ29udGludWF0aW9uKAogICAgICAgICAgdXRmOCwgcG9zaXRpb24sIGVuZCwgY29udGludWVCeXRlQ291bnQsIG1pc3NpbmcsIHZhbHVlKTsKICAgICAgaWYgKHBvc2l0aW9uID09IGVuZCkgcmV0dXJuOwogICAgfQogICAgLy8gS2VlcCBpbmRleCBhbmQgY2FwYWNpdHkgaW4gbG9jYWwgdmFyaWFibGVzIHdoaWxlIGxvb3Bpbmcgb3ZlcgogICAgLy8gQVNDSUkgY2hhcmFjdGVycy4KICAgIGludCBpbmRleCA9IGxlbmd0aDsKICAgIGludCBjYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGg7CiAgICB3aGlsZSAocG9zaXRpb24gPCBlbmQpIHsKICAgICAgaW50IGNoYXIgPSB1dGY4W3Bvc2l0aW9uXTsKICAgICAgaWYgKGNoYXIgPD0gTUFYX0FTQ0lJKSB7CiAgICAgICAgaWYgKGluZGV4ID09IGNhcGFjaXR5KSB7CiAgICAgICAgICBsZW5ndGggPSBpbmRleDsKICAgICAgICAgIF9ncm93KCk7CiAgICAgICAgICBjYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGNoYXI7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZW5ndGggPSBpbmRleDsKICAgICAgaWYgKChjaGFyICYgTUFTS19DT05USU5VRV9UQUcpID09IENPTlRJTlVFX1RBRykgewogICAgICAgIGlmIChhbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgYWRkQ2hhckNvZGUoMHhGRkZEKTsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgVVRGLTggY29udGludWF0aW9uIGJ5dGUiLCB1dGY4LCBwb3NpdGlvbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoYXIgPCAweEUwKSB7CiAgICAgICAgLy8gQzAtREYKICAgICAgICAvLyBUd28tYnl0ZS4KICAgICAgICBwb3NpdGlvbiA9IGFkZENvbnRpbnVhdGlvbigKICAgICAgICAgICAgdXRmOCwgcG9zaXRpb24gKyAxLCBlbmQsIDEsIDEsIGNoYXIgJiBNQVNLX1RXT19CWVRFKTsKICAgICAgfSBlbHNlIGlmIChjaGFyIDwgMHhGMCkgewogICAgICAgIC8vIEUwLUVGCiAgICAgICAgLy8gVGhyZWUtYnl0ZS4KICAgICAgICBwb3NpdGlvbiA9IGFkZENvbnRpbnVhdGlvbigKICAgICAgICAgICAgdXRmOCwgcG9zaXRpb24gKyAxLCBlbmQsIDIsIDIsIGNoYXIgJiBNQVNLX1RIUkVFX0JZVEUpOwogICAgICB9IGVsc2UgaWYgKGNoYXIgPCAweEY4KSB7CiAgICAgICAgLy8gRjAtRjcKICAgICAgICAvLyBGb3VyLWJ5dGUuCiAgICAgICAgcG9zaXRpb24gPSBhZGRDb250aW51YXRpb24oCiAgICAgICAgICAgIHV0ZjgsIHBvc2l0aW9uICsgMSwgZW5kLCAzLCAzLCBjaGFyICYgTUFTS19GT1VSX0JZVEUpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChhbGxvd01hbGZvcm1lZCkgewogICAgICAgICAgYWRkQ2hhckNvZGUoMHhGRkZEKTsKICAgICAgICAgIHBvc2l0aW9uKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICAgIkludmFsaWQgVVRGLTggYnl0ZTogJGNoYXIiLCB1dGY4LCBwb3NpdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGluZGV4ID0gbGVuZ3RoOwogICAgICBjYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGg7CiAgICB9CiAgICBsZW5ndGggPSBpbmRleDsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmIChwYXJ0aWFsU3RhdGUgIT0gTk9fUEFSVElBTCkgewogICAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIHsKICAgICAgICBwYXJ0aWFsU3RhdGUgPSBOT19QQVJUSUFMOwogICAgICAgIGFkZENoYXJDb2RlKDB4RkZGRCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW50IGNvbnRpbnVlQnl0ZUNvdW50ID0gKHBhcnRpYWxTdGF0ZSAmIE1BU0tfVFdPX0JJVCk7CiAgICAgICAgaW50IG1pc3NpbmcgPSAocGFydGlhbFN0YXRlID4+IFNISUZUX01JU1NJTkcpICYgTUFTS19UV09fQklUOwogICAgICAgIGludCB2YWx1ZSA9IHBhcnRpYWxTdGF0ZSA+PiBTSElGVF9WQUxVRTsKICAgICAgICBpbnQgc2VlbkJ5dGVDb3VudCA9IGNvbnRpbnVlQnl0ZUNvdW50IC0gbWlzc2luZyArIDE7CiAgICAgICAgTGlzdCBzb3VyY2UgPSBuZXcgVWludDhMaXN0KHNlZW5CeXRlQ291bnQpOwogICAgICAgIHdoaWxlIChzZWVuQnl0ZUNvdW50ID4gMSkgewogICAgICAgICAgc2VlbkJ5dGVDb3VudC0tOwogICAgICAgICAgc291cmNlW3NlZW5CeXRlQ291bnRdID0gQ09OVElOVUVfVEFHIHwgKHZhbHVlICYgTUFTS19DT05USU5VRV9WQUxVRSk7CiAgICAgICAgICB2YWx1ZSA+Pj0gNjsKICAgICAgICB9CiAgICAgICAgc291cmNlWzBdID0gdmFsdWUgfCAoMHgzYzAgPj4gKGNvbnRpbnVlQnl0ZUNvdW50IC0gMSkpOwogICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAgICJJbmNvbXBsZXRlIFVURi04IHNlcXVlbmNlIiwgc291cmNlLCBzb3VyY2UubGVuZ3RoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhidWZmZXIsIDAsIGxlbmd0aCk7CiAgfQp9CgovKioKICogQ2h1bmtlZCBKU09OIHBhcnNlciB0aGF0IHBhcnNlcyBVVEYtOCBjaHVua3MuCiAqLwpjbGFzcyBfSnNvblV0ZjhQYXJzZXIgZXh0ZW5kcyBfQ2h1bmtlZEpzb25QYXJzZXI8TGlzdDxpbnQ+PiB7CiAgZmluYWwgYm9vbCBhbGxvd01hbGZvcm1lZDsKICBMaXN0PGludD4gY2h1bms7CiAgaW50IGNodW5rRW5kOwoKICBfSnNvblV0ZjhQYXJzZXIoX0pzb25MaXN0ZW5lciBsaXN0ZW5lciwgdGhpcy5hbGxvd01hbGZvcm1lZCkKICAgICAgOiBzdXBlcihsaXN0ZW5lcikgewogICAgLy8gU3RhcnRzIG91dCBjaGVja2luZyBmb3IgYW4gb3B0aW9uYWwgQk9NIChLV0RfQk9NLCBjb3VudCA9IDApLgogICAgcGFydGlhbFN0YXRlID0KICAgICAgICBfQ2h1bmtlZEpzb25QYXJzZXIuUEFSVElBTF9LRVlXT1JEIHwgX0NodW5rZWRKc29uUGFyc2VyLktXRF9CT007CiAgfQoKICBpbnQgZ2V0Q2hhcihpbnQgcG9zaXRpb24pID0+IGNodW5rW3Bvc2l0aW9uXTsKCiAgU3RyaW5nIGdldFN0cmluZyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaXRzKSB7CiAgICBjb25zdCBpbnQgbWF4QXNjaWlDaGFyID0gMHg3ZjsKICAgIGlmIChiaXRzIDw9IG1heEFzY2lpQ2hhcikgewogICAgICByZXR1cm4gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNodW5rLCBzdGFydCwgZW5kKTsKICAgIH0KICAgIGJlZ2luU3RyaW5nKCk7CiAgICBpZiAoc3RhcnQgPCBlbmQpIGFkZFNsaWNlVG9TdHJpbmcoc3RhcnQsIGVuZCk7CiAgICBTdHJpbmcgcmVzdWx0ID0gZW5kU3RyaW5nKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBiZWdpblN0cmluZygpIHsKICAgIHRoaXMuYnVmZmVyID0gbmV3IF9VdGY4U3RyaW5nQnVmZmVyKGFsbG93TWFsZm9ybWVkKTsKICB9CgogIHZvaWQgYWRkU2xpY2VUb1N0cmluZyhpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIF9VdGY4U3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgYnVmZmVyLmFkZFNsaWNlKGNodW5rLCBzdGFydCwgZW5kKTsKICB9CgogIHZvaWQgYWRkQ2hhclRvU3RyaW5nKGludCBjaGFyQ29kZSkgewogICAgX1V0ZjhTdHJpbmdCdWZmZXIgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBidWZmZXIuYWRkQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgU3RyaW5nIGVuZFN0cmluZygpIHsKICAgIF9VdGY4U3RyaW5nQnVmZmVyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgdGhpcy5idWZmZXIgPSBudWxsOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgdm9pZCBjb3B5Q2hhcnNUb0xpc3QoaW50IHN0YXJ0LCBpbnQgZW5kLCBMaXN0IHRhcmdldCwgaW50IG9mZnNldCkgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgdGFyZ2V0LnNldFJhbmdlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoLCBjaHVuaywgc3RhcnQpOwogIH0KCiAgZG91YmxlIHBhcnNlRG91YmxlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgU3RyaW5nIHN0cmluZyA9IGdldFN0cmluZyhzdGFydCwgZW5kLCAweDdmKTsKICAgIHJldHVybiBfcGFyc2VEb3VibGUoc3RyaW5nLCAwLCBzdHJpbmcubGVuZ3RoKTsKICB9Cn0KCmRvdWJsZSBfcGFyc2VEb3VibGUoU3RyaW5nIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSBuYXRpdmUgIkRvdWJsZV9wYXJzZSI7CgovKioKICogSW1wbGVtZW50cyB0aGUgY2h1bmtlZCBjb252ZXJzaW9uIGZyb20gYSBVVEYtOCBlbmNvZGluZyBvZiBKU09OCiAqIHRvIGl0cyBjb3JyZXNwb25kaW5nIG9iamVjdC4KICovCmNsYXNzIF9Kc29uVXRmOERlY29kZXJTaW5rIGV4dGVuZHMgQnl0ZUNvbnZlcnNpb25TaW5rQmFzZSB7CiAgZmluYWwgX0pzb25VdGY4UGFyc2VyIF9wYXJzZXI7CiAgZmluYWwgU2luazxPYmplY3Q+IF9zaW5rOwoKICBfSnNvblV0ZjhEZWNvZGVyU2luayhyZXZpdmVyLCB0aGlzLl9zaW5rLCBib29sIGFsbG93TWFsZm9ybWVkKQogICAgICA6IF9wYXJzZXIgPSBfY3JlYXRlUGFyc2VyKHJldml2ZXIsIGFsbG93TWFsZm9ybWVkKTsKCiAgc3RhdGljIF9Kc29uVXRmOFBhcnNlciBfY3JlYXRlUGFyc2VyKHJldml2ZXIsIGJvb2wgYWxsb3dNYWxmb3JtZWQpIHsKICAgIF9CdWlsZEpzb25MaXN0ZW5lciBsaXN0ZW5lcjsKICAgIGlmIChyZXZpdmVyID09IG51bGwpIHsKICAgICAgbGlzdGVuZXIgPSBuZXcgX0J1aWxkSnNvbkxpc3RlbmVyKCk7CiAgICB9IGVsc2UgewogICAgICBsaXN0ZW5lciA9IG5ldyBfUmV2aXZlckpzb25MaXN0ZW5lcihyZXZpdmVyKTsKICAgIH0KICAgIHJldHVybiBuZXcgX0pzb25VdGY4UGFyc2VyKGxpc3RlbmVyLCBhbGxvd01hbGZvcm1lZCk7CiAgfQoKICB2b2lkIGFkZFNsaWNlKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGlzTGFzdCkgewogICAgX2FkZENodW5rKGNodW5rLCBzdGFydCwgZW5kKTsKICAgIGlmIChpc0xhc3QpIGNsb3NlKCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gY2h1bmspIHsKICAgIF9hZGRDaHVuayhjaHVuaywgMCwgY2h1bmsubGVuZ3RoKTsKICB9CgogIHZvaWQgX2FkZENodW5rKExpc3Q8aW50PiBjaHVuaywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBfcGFyc2VyLmNodW5rID0gY2h1bms7CiAgICBfcGFyc2VyLmNodW5rRW5kID0gZW5kOwogICAgX3BhcnNlci5wYXJzZShzdGFydCk7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgX3BhcnNlci5jbG9zZSgpOwogICAgdmFyIGRlY29kZWQgPSBfcGFyc2VyLnJlc3VsdDsKICAgIF9zaW5rLmFkZChkZWNvZGVkKTsKICAgIF9zaW5rLmNsb3NlKCk7CiAgfQp9CgpAcGF0Y2gKaW50IF9zY2FuT25lQnl0ZUNoYXJhY3RlcnMoTGlzdDxpbnQ+IHVuaXRzLCBpbnQgZnJvbSwgaW50IGVuZEluZGV4KSB7CiAgZmluYWwgdG8gPSBlbmRJbmRleDsKCiAgLy8gU3BlY2lhbCBjYXNlIGZvciBfVWludDhBcnJheVZpZXcuCiAgaWYgKHVuaXRzIGlzIFVpbnQ4TGlzdCkgewogICAgaWYgKGZyb20gPj0gMCAmJiB0byA+PSAwICYmIHRvIDw9IHVuaXRzLmxlbmd0aCkgewogICAgICBmb3IgKGludCBpID0gZnJvbTsgaSA8IHRvOyBpKysp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aWMgcGxhdGZvcm0gbWF5IG5vdCBzdXBwb3J0IGFsbAovLy8gb3BlcmF0aW9ucy4KLy8vCi8vLyBUbyB1c2UgdGhpcyBsaWJyYXJ5IGluIHlvdXIgY29kZToKLy8vCi8vLyAgICAgaW1wb3J0ICdkYXJ0OmRldmVsb3Blcic7Ci8vLwovLy8ge0BjYXRlZ29yeSBDb3JlfQpsaWJyYXJ5IGRhcnQuZGV2ZWxvcGVyOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6aXNvbGF0ZScgc2hvdyBJc29sYXRlLCBSYXdSZWNlaXZlUG9ydCwgU2VuZFBvcnQ7CgpwYXJ0ICdleHRlbnNpb24uZGFydCc7CnBhcnQgJ3Byb2ZpbGVyLmRhcnQnOwpwYXJ0ICdzZXJ2aWNlLmRhcnQnOwpwYXJ0ICd0aW1lbGluZS5kYXJ0JzsKCi8vLyBJZiBbd2hlbl0gaXMgdHJ1ZSwgc3RvcCB0aGUgcHJvZ3JhbSBhcyBpZiBhIGJyZWFrcG9pbnQgd2VyZSBoaXQgYXQgdGhlCi8vLyBmb2xsb3dpbmcgc3RhdGVtZW50LgovLy8KLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIFt3aGVuXS4gU29tZSBkZWJ1Z2dlcnMgbWF5IGRpc3BsYXkgW21lc3NhZ2VdLgovLy8KLy8vIE5PVEU6IFdoZW4gaW52b2tlZCwgdGhlIGlzb2xhdGUgd2lsbCBub3QgcmV0dXJuIHVudGlsIGEgZGVidWdnZXIKLy8vIGNvbnRpbnVlcyBleGVjdXRpb24uIFdoZW4gcnVubmluZyBpbiB0aGUgRGFydCBWTSwgdGhlIGJlaGF2aW91ciBpcyB0aGUgc2FtZQovLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCBhIGRlYnVnZ2VyIGlzIGNvbm5lY3RlZC4gV2hlbiBjb21waWxlZCB0bwovLy8gSmF2YVNjcmlwdCwgdGhpcyB1c2VzIHRoZSAiZGVidWdnZXIiIHN0YXRlbWVudCwgYW5kIGJlaGF2ZXMgZXhhY3RseSBhcwovLy8gdGhhdCBkb2VzLgpleHRlcm5hbCBib29sIGRlYnVnZ2VyKHtib29sIHdoZW46IHRydWUsIFN0cmluZyBtZXNzYWdlfSk7CgovLy8gU2VuZCBhIHJlZmVyZW5jZSB0byBbb2JqZWN0XSB0byBhbnkgYXR0YWNoZWQgZGVidWdnZXJzLgovLy8KLy8vIERlYnVnZ2VycyBtYXkgb3BlbiBhbiBpbnNwZWN0b3Igb24gdGhlIG9iamVjdC4gUmV0dXJucyB0aGUgYXJndW1lbnQuCmV4dGVybmFsIE9iamVjdCBpbnNwZWN0KE9iamVjdCBvYmplY3QpOwoKLy8vIEVtaXQgYSBsb2cgZXZlbnQuCi8vLwovLy8gVGhpcyBmdW5jdGlvbiB3YXMgZGVzaWduZWQgdG8gbWFwIGNsb3NlbHkgdG8gdGhlIGxvZ2dpbmcgaW5mb3JtYXRpb24KLy8vIGNvbGxlY3RlZCBieSBgcGFja2FnZTpsb2dnaW5nYC4KLy8vCi8vLyAtIFttZXNzYWdlXSBpcyB0aGUgbG9nIG1lc3NhZ2UKLy8vIC0gW3RpbWVdIChvcHRpb25hbCkgaXMgdGhlIHRpbWVzdGFtcAovLy8gLSBbc2VxdWVuY2VOdW1iZXJdIChvcHRpb25hbCkgaXMgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgc2VxdWVuY2UgbnVtYmVyCi8vLyAtIFtsZXZlbF0gKG9wdGlvbmFsKSBpcyB0aGUgc2V2ZXJpdHkgbGV2ZWwgKGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyMDAwKTsgc2VlCi8vLyAgIHRoZSBgcGFja2FnZTpsb2dnaW5nYCBgTGV2ZWxgIGNsYXNzIGZvciBhbiBvdmVydmlldyBvZiB0aGUgcG9zc2libGUgdmFsdWVzCi8vLyAtIFtuYW1lXSAob3B0aW9uYWwpIGlzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2Ugb2YgdGhlIGxvZyBtZXNzYWdlCi8vLyAtIFt6b25lXSAob3B0aW9uYWwpIHRoZSB6b25lIHdoZXJlIHRoZSBsb2cgd2FzIGVtaXR0ZWQKLy8vIC0gW2Vycm9yXSAob3B0aW9uYWwpIGFuIGVycm9yIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2cgZXZlbnQKLy8vIC0gW3N0YWNrVHJhY2VdIChvcHRpb25hbCkgYSBzdGFjayB0cmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsb2cgZXZlbnQKZXh0ZXJuYWwgdm9pZCBsb2coCiAgU3RyaW5nIG1lc3NhZ2UsIHsKICBEYXRlVGltZSB0aW1lLAogIGludCBzZXF1ZW5jZU51bWJlciwKICBpbnQgbGV2ZWw6IDAsCiAgU3RyaW5nIG5hbWU6ICcnLAogIFpvbmUgem9uZSwKICBPYmplY3QgZXJyb3IsCiAgU3RhY2tUcmFjZSBzdGFja1RyYWNlLAp9KTsKRQBOTjwBRgRMRhAEJgQhBBUYARUXPgEXFhUWAUsZBEcERVBLSw87ATwESSgBFgRJJAQjKVBRUUU7SEsTFBEWEBMNEBkEAQ5kYXJ0OmRldmVsb3BlcjRvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZGV2ZWxvcGVyL2V4dGVuc2lvbi5kYXJ0lv0vLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmRldmVsb3BlcjsKCi8vLyBBIHJlc3BvbnNlIHRvIGEgc2VydmljZSBwcm90b2NvbCBleHRlbnNpb24gUlBDLgovLy8KLy8vIElmIHRoZSBSUEMgd2FzIHN1Y2Nlc3NmdWwsIHVzZSBbU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdF0sIG90aGVyd2lzZQovLy8gdXNlIFtTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuZXJyb3JdLgpjbGFzcyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UgewogIGZpbmFsIFN0cmluZyBfcmVzdWx0OwogIGZpbmFsIGludCBfZXJyb3JDb2RlOwogIGZpbmFsIFN0cmluZyBfZXJyb3JEZXRhaWw7CgogIC8vLyBDcmVhdGVzIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSB0byBhIHNlcnZpY2UgcHJvdG9jb2wgZXh0ZW5zaW9uIFJQQy4KICAvLy8KICAvLy8gUmVxdWlyZXMgW3Jlc3VsdF0gdG8gYmUgYSBKU09OIG9iamVjdCBlbmNvZGVkIGFzIGEgc3RyaW5nLiBXaGVuIGZvcm1pbmcKICAvLy8gdGhlIEpTT04tUlBDIG1lc3NhZ2UgW3Jlc3VsdF0gd2lsbCBiZSBpbmxpbmVkIGRpcmVjdGx5LgogIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoU3RyaW5nIHJlc3VsdCkKICAgICAgOiBfcmVzdWx0ID0gcmVzdWx0LAogICAgICAgIF9lcnJvckNvZGUgPSBudWxsLAogICAgICAgIF9lcnJvckRldGFpbCA9IG51bGwgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoX3Jlc3VsdCwgInJlc3VsdCIpOwogIH0KCiAgLy8vIENyZWF0ZXMgYW4gZXJyb3IgcmVzcG9uc2UgdG8gYSBzZXJ2aWNlIHByb3RvY29sIGV4dGVuc2lvbiBSUEMuCiAgLy8vCiAgLy8vIFJlcXVpcmVzIFtlcnJvckNvZGVdIHRvIGJlIFtpbnZhbGlkUGFyYW1zXSBvciBiZXR3ZWVuIFtleHRlbnNpb25FcnJvck1pbl0KICAvLy8gYW5kIFtleHRlbnNpb25FcnJvck1heF0uIFJlcXVpcmVzIFtlcnJvckRldGFpbF0gdG8gYmUgYSBKU09OIG9iamVjdAogIC8vLyBlbmNvZGVkIGFzIGEgc3RyaW5nLiBXaGVuIGZvcm1pbmcgdGhlIEpTT04tUlBDIG1lc3NhZ2UgW2Vycm9yRGV0YWlsXSB3aWxsCiAgLy8vIGJlIGlubGluZWQgZGlyZWN0bHkuCiAgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmVycm9yKGludCBlcnJvckNvZGUsIFN0cmluZyBlcnJvckRldGFpbCkKICAgICAgOiBfcmVzdWx0ID0gbnVsbCwKICAgICAgICBfZXJyb3JDb2RlID0gZXJyb3JDb2RlLAogICAgICAgIF9lcnJvckRldGFpbCA9IGVycm9yRGV0YWlsIHsKICAgIF92YWxpZGF0ZUVycm9yQ29kZShfZXJyb3JDb2RlKTsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKF9lcnJvckRldGFpbCwgImVycm9yRGV0YWlsIik7CiAgfQoKICAvLy8gSW52YWxpZCBtZXRob2QgcGFyYW1ldGVyKHMpIGVycm9yIGNvZGUuCiAgQGRlcHJlY2F0ZWQKICBzdGF0aWMgY29uc3Qga0ludmFsaWRQYXJhbXMgPSBpbnZhbGlkUGFyYW1zOwoKICAvLy8gR2VuZXJpYyBleHRlbnNpb24gZXJyb3IgY29kZS4KICBAZGVwcmVjYXRlZAogIHN0YXRpYyBjb25zdCBrRXh0ZW5zaW9uRXJyb3IgPSBleHRlbnNpb25FcnJvcjsKCiAgLy8vIE1heGltdW0gZXh0ZW5zaW9uIHByb3ZpZGVkIGVycm9yIGNvZGUuCiAgQGRlcHJlY2F0ZWQKICBzdGF0aWMgY29uc3Qga0V4dGVuc2lvbkVycm9yTWF4ID0gZXh0ZW5zaW9uRXJyb3JNYXg7CgogIC8vLyBNaW5pbXVtIGV4dGVuc2lvbiBwcm92aWRlZCBlcnJvciBjb2RlLgogIEBkZXByZWNhdGVkCiAgc3RhdGljIGNvbnN0IGtFeHRlbnNpb25FcnJvck1pbiA9IGV4dGVuc2lvbkVycm9yTWluOwoKICAvLy8gSW52YWxpZCBtZXRob2QgcGFyYW1ldGVyKHMpIGVycm9yIGNvZGUuCiAgc3RhdGljIGNvbnN0IGludmFsaWRQYXJhbXMgPSAtMzI2MDI7CgogIC8vLyBHZW5lcmljIGV4dGVuc2lvbiBlcnJvciBjb2RlLgogIHN0YXRpYyBjb25zdCBleHRlbnNpb25FcnJvciA9IC0zMjAwMDsKCiAgLy8vIE1heGltdW0gZXh0ZW5zaW9uIHByb3ZpZGVkIGVycm9yIGNvZGUuCiAgc3RhdGljIGNvbnN0IGV4dGVuc2lvbkVycm9yTWF4ID0gLTMyMDAwOwoKICAvLy8gTWluaW11bSBleHRlbnNpb24gcHJvdmlkZWQgZXJyb3IgY29kZS4KICBzdGF0aWMgY29uc3QgZXh0ZW5zaW9uRXJyb3JNaW4gPSAtMzIwMTY7CgogIHN0YXRpYyBTdHJpbmcgX2Vycm9yQ29kZU1lc3NhZ2UoaW50IGVycm9yQ29kZSkgewogICAgX3ZhbGlkYXRlRXJyb3JDb2RlKGVycm9yQ29kZSk7CiAgICBpZiAoZXJyb3JDb2RlID09IGludmFsaWRQYXJhbXMpIHsKICAgICAgcmV0dXJuICJJbnZhbGlkIHBhcmFtcyI7CiAgICB9CiAgICByZXR1cm4gIlNlcnZlciBlcnJvciI7CiAgfQoKICBzdGF0aWMgX3ZhbGlkYXRlRXJyb3JDb2RlKGludCBlcnJvckNvZGUpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGVycm9yQ29kZSwgImVycm9yQ29kZSIpOwogICAgaWYgKGVycm9yQ29kZSA9PSBpbnZhbGlkUGFyYW1zKSByZXR1cm47CiAgICBpZiAoKGVycm9yQ29kZSA+PSBleHRlbnNpb25FcnJvck1pbikgJiYgKGVycm9yQ29kZSA8PSBleHRlbnNpb25FcnJvck1heCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoZXJyb3JDb2RlLCAiZXJyb3JDb2RlIiwgIk91dCBvZiByYW5nZSIpOwogIH0KCiAgLy8gaWdub3JlOiB1bnVzZWRfZWxlbWVudCwgY2FsbGVkIGZyb20gcnVudGltZS9saWIvZGV2ZWxvcGVyLmRhcnQKICBib29sIF9pc0Vycm9yKCkgPT4gKF9lcnJvckNvZGUgIT0gbnVsbCkgJiYgKF9lcnJvckRldGFpbCAhPSBudWxsKTsKCiAgLy8gaWdub3JlOiB1bnVzZWRfZWxlbWVudCwgY2FsbGVkIGZyb20gcnVudGltZS9saWIvZGV2ZWxvcGVyLmRhcnQKICBTdHJpbmcgX3RvU3RyaW5nKCkgewogICAgaWYgKF9yZXN1bHQgIT0gbnVsbCkgewogICAgICByZXR1cm4gX3Jlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChfZXJyb3JDb2RlICE9IG51bGwpOwogICAgICBhc3NlcnQoX2Vycm9yRGV0YWlsICE9IG51bGwpOwogICAgICByZXR1cm4ganNvbi5lbmNvZGUoewogICAgICAgICdjb2RlJzogX2Vycm9yQ29kZSwKICAgICAgICAnbWVzc2FnZSc6IF9lcnJvckNvZGVNZXNzYWdlKF9lcnJvckNvZGUpLAogICAgICAgICdkYXRhJzogeydkZXRhaWxzJzogX2Vycm9yRGV0YWlsfQogICAgICB9KTsKICAgIH0KICB9Cn0KCi8vLyBBIHNlcnZpY2UgcHJvdG9jb2wgZXh0ZW5zaW9uIGhhbmRsZXIuIFJlZ2lzdGVyZWQgd2l0aCBbcmVnaXN0ZXJFeHRlbnNpb25dLgovLy8KLy8vIE11c3QgY29tcGxldGUgdG8gYSBbU2VydmljZUV4dGVuc2lvblJlc3BvbnNlXS4gW21ldGhvZF0gaXMgdGhlIG1ldGhvZCBuYW1lCi8vLyBvZiB0aGUgc2VydmljZSBwcm90b2NvbCByZXF1ZXN0LCBhbmQgW3BhcmFtZXRlcnNdIGlzIGEgbWFwIGhvbGRpbmcgdGhlCi8vLyBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2aWNlIHByb3RvY29sIHJlcXVlc3QuCi8vLwovLy8gKk5PVEUqOiBhbGwgcGFyYW1ldGVyIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGVuY29kZWQgYXMgc3RyaW5ncy4KdHlwZWRlZiBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlcigKICAgIFN0cmluZyBtZXRob2QsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyk7CgovLy8gUmVnaXN0ZXIgYSBbU2VydmljZUV4dGVuc2lvbkhhbmRsZXJdIHRoYXQgd2lsbCBiZSBpbnZva2VkIGluIHRoaXMgaXNvbGF0ZQovLy8gZm9yIFttZXRob2RdLiAqTk9URSo6IFNlcnZpY2UgcHJvdG9jb2wgZXh0ZW5zaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQKLy8vIGluIGVhY2ggaXNvbGF0ZS4KLy8vCi8vLyAqTk9URSo6IFttZXRob2RdIG11c3QgYmVnaW4gd2l0aCAnZXh0LicgYW5kIHlvdSBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcKLy8vIHN0cnVjdHVyZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciBwYWNrYWdlczogJ2V4dC5wYWNrYWdlLmNvbW1hbmQnLgovLy8gVGhhdCBpcywgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSAnZXh0LicgcHJlZml4LCBzaG91bGQgYmUgdGhlIHJlZ2lzdGVyaW5nCi8vLyBwYWNrYWdlIG5hbWUgZm9sbG93ZWQgYnkgYW5vdGhlciBwZXJpb2QgKCcuJykgYW5kIHRoZW4gdGhlIGNvbW1hbmQgbmFtZS4KLy8vIEZvciBleGFtcGxlOiAnZXh0LmRhcnQuaW8uZ2V0T3BlbkZpbGVzJy4KLy8vCi8vLyBCZWNhdXNlIHNlcnZpY2UgZXh0ZW5zaW9ucyBhcmUgaXNvbGF0ZSBzcGVjaWZpYywgY2xpZW50cyB1c2luZyBleHRlbnNpb25zCi8vLyBtdXN0IGFsd2F5cyBpbmNsdWRlIGFuICdpc29sYXRlSWQnIHBhcmFtZXRlciB3aXRoIGVhY2ggUlBDLgp2b2lkIHJlZ2lzdGVyRXh0ZW5zaW9uKFN0cmluZyBtZXRob2QsIFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIGhhbmRsZXIpIHsKICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChtZXRob2QsICdtZXRob2QnKTsKICBpZiAoIW1ldGhvZC5zdGFydHNXaXRoKCdleHQuJykpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKG1ldGhvZCwgJ21ldGhvZCcsICdNdXN0IGJlZ2luIHdpdGggZXh0LicpOwogIH0KICBpZiAoX2xvb2t1cEV4dGVuc2lvbihtZXRob2QpICE9IG51bGwpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdFeHRlbnNpb24gYWxyZWFkeSByZWdpc3RlcmVkOiAkbWV0aG9kJyk7CiAgfQogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGhhbmRsZXIsICdoYW5kbGVyJyk7CiAgX3JlZ2lzdGVyRXh0ZW5zaW9uKG1ldGhvZCwgaGFuZGxlcik7Cn0KCi8vLyBQb3N0IGFuIGV2ZW50IG9mIFtldmVudEtpbmRdIHdpdGggcGF5bG9hZCBvZiBbZXZlbnREYXRhXSB0byB0aGUgYEV4dGVuc2lvbmAKLy8vIGV2ZW50IHN0cmVhbS4Kdm9pZCBwb3N0RXZlbnQoU3RyaW5nIGV2ZW50S2luZCwgTWFwIGV2ZW50RGF0YSkgewogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGV2ZW50S2luZCwgJ2V2ZW50S2luZCcpOwogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGV2ZW50RGF0YSwgJ2V2ZW50RGF0YScpOwogIFN0cmluZyBldmVudERhdGFBc1N0cmluZyA9IGpzb24uZW5jb2RlKGV2ZW50RGF0YSk7CiAgX3Bvc3RFdmVudChldmVudEtpbmQsIGV2ZW50RGF0YUFzU3RyaW5nKTsKfQoKZXh0ZXJuYWwgdm9pZCBfcG9zdEV2ZW50KFN0cmluZyBldmVudEtpbmQsIFN0cmluZyBldmVudERhdGEpOwoKLy8gQm90aCBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIHdyaXR0ZW4gaW5zaWRlIEMrKyB0byBhdm9pZCB1cGRhdGluZyB0aGUgZGF0YQovLyBzdHJ1Y3R1cmVzIGluIERhcnQsIGdldHRpbmcgYW4gT09CLCBhbmQgb2JzZXJ2aW5nIHN0YWxlIHN0YXRlLiBEbyBub3QgbW92ZQovLyB0aGVzZSBpbnRvIERhcnQgY29kZSB1bmxlc3MgeW91IGNhbiBlbnN1cmUgdGhhdCB0aGUgb3BlcmF0aW9ucyB3aWxsIGNhbiBiZQovLyBkb25lIGF0b21pY2FsbHkuIE5hdGl2ZSBjb2RlIGxpdmVzIGluIHZtL2lzb2xhdGUuY2MtCi8vIExvb2t1cFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIGFuZCBSZWdpc3RlclNlcnZpY2VFeHRlbnNpb25IYW5kbGVyLgpleHRlcm5hbCBTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlciBfbG9va3VwRXh0ZW5zaW9uKFN0cmluZyBtZXRob2QpOwpleHRlcm5hbCBfcmVnaXN0ZXJFeHRlbnNpb24oU3RyaW5nIG1ldGhvZCwgU2VydmljZUV4dGVuc2lvbkhhbmRsZXIgaGFuZGxlcik7CoCeAE5OPAEYATQEUCohGBgdAUkGTj4xGhseMwQBRQZQSlAbRBggJSQ9BAEuDi8BJA4xAS0ONwEtDjcBLicBJCgBLSsBLSsBMyMmHwYbBAEtOCxQDgZLBAFERQFEFxsWDSIkGxwyKgoGBAIBTwRPSzAEQ0I0AU5JFQRNTVBNLQROQEkwJE0EKkYEMicCAVASMjY2NSwCAT4BTU5OOEZCTQEdZGFydDpkZXZlbG9wZXIvZXh0ZW5zaW9uLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9wcm9maWxlci5kYXJ0gxwvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiZGV2ZWxvcGVyLmRhcnQiOwoKQHBhdGNoCmNsYXNzIFVzZXJUYWcgewogIEBwYXRjaAogIGZhY3RvcnkgVXNlclRhZyhTdHJpbmcgbGFiZWwpIHsKICAgIHJldHVybiBuZXcgX1VzZXJUYWcobGFiZWwpOwogIH0KICBAcGF0Y2gKICBzdGF0aWMgVXNlclRhZyBnZXQgZGVmYXVsdFRhZyA9PiBfZ2V0RGVmYXVsdFRhZygpOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9Vc2VyVGFnIGltcGxlbWVudHMgVXNlclRhZyB7CiAgZmFjdG9yeSBfVXNlclRhZyhTdHJpbmcgbGFiZWwpIG5hdGl2ZSAiVXNlclRhZ19uZXciOwogIFN0cmluZyBnZXQgbGFiZWwgbmF0aXZlICJVc2VyVGFnX2xhYmVsIjsKICBVc2VyVGFnIG1ha2VDdXJyZW50KCkgbmF0aXZlICJVc2VyVGFnX21ha2VDdXJyZW50IjsKfQoKQHBhdGNoClVzZXJUYWcgZ2V0Q3VycmVudFRhZygpID0+IF9nZXRDdXJyZW50VGFnKCk7ClVzZXJUYWcgX2dldEN1cnJlbnRUYWcoKSBuYXRpdmUgIlByb2ZpbGVyX2dldEN1cnJlbnRUYWciOwoKVXNlclRhZyBfZ2V0RGVmYXVsdFRhZygpIG5hdGl2ZSAiVXNlclRhZ19kZWZhdWx0VGFnIjsKHgBOTjwBHQEHEAkiIAQJNQIBGiQ3KzYCAQctOgE2ASJkYXJ0OmRldmVsb3Blci1wYXRjaC9wcm9maWxlci5kYXJ0M29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9kZXZlbG9wZXIvcHJvZmlsZXIuZGFydI9hLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5kZXZlbG9wZXI7CgovLy8gQSBVc2VyVGFnIGNhbiBiZSB1c2VkIHRvIGdyb3VwIHNhbXBsZXMgaW4gdGhlIE9ic2VydmF0b3J5IHByb2ZpbGVyLgphYnN0cmFjdCBjbGFzcyBVc2VyVGFnIHsKICAvLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIFVzZXJUYWcgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYnkgYSBwcm9ncmFtLgogIHN0YXRpYyBjb25zdCBNQVhfVVNFUl9UQUdTID0gNjQ7CgogIGV4dGVybmFsIGZhY3RvcnkgVXNlclRhZyhTdHJpbmcgbGFiZWwpOwoKICAvLy8gTGFiZWwgb2YgW3RoaXNdLgogIFN0cmluZyBnZXQgbGFiZWw7CgogIC8vLyBNYWtlIFt0aGlzXSB0aGUgY3VycmVudCB0YWcgZm9yIHRoZSBpc29sYXRlLiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhZwogIC8vLyBiZWZvcmUgc2V0dGluZy4KICBVc2VyVGFnIG1ha2VDdXJyZW50KCk7CgogIC8vLyBUaGUgZGVmYXVsdCBbVXNlclRhZ10gd2l0aCBsYWJlbCAnRGVmYXVsdCcuCiAgZXh0ZXJuYWwgc3RhdGljIFVzZXJUYWcgZ2V0IGRlZmF1bHRUYWc7Cn0KCi8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IFtVc2VyVGFnXSBmb3IgdGhlIGlzb2xhdGUuCmV4dGVybmFsIFVzZXJUYWcgZ2V0Q3VycmVudFRhZygpOwoKLy8vIEFic3RyYWN0IFtNZXRyaWNdIGNsYXNzLiBNZXRyaWMgbmFtZXMgbXVzdCBiZSB1bmlxdWUsIGFyZSBoaWVyYXJjaGljYWwsCi8vLyBhbmQgdXNlIHBlcmlvZHMgYXMgc2VwYXJhdG9ycy4gRm9yIGV4YW1wbGUsICdhLmIuYycuIFVuaXF1ZW5lc3MgaXMgb25seQovLy8gZW5mb3JjZWQgd2hlbiBhIE1ldHJpYyBpcyByZWdpc3RlcmVkLiBUaGUgbmFtZSBvZiBhIG1ldHJpYyBjYW5ub3QgY29udGFpbgovLy8gdGhlIHNsYXNoICgnLycpIGNoYXJhY3Rlci4KYWJzdHJhY3QgY2xhc3MgTWV0cmljIHsKICAvLy8gW25hbWVdIG9mIHRoaXMgbWV0cmljLgogIGZpbmFsIFN0cmluZyBuYW1lOwoKICAvLy8gW2Rlc2NyaXB0aW9uXSBvZiB0aGlzIG1ldHJpYy4KICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CgogIE1ldHJpYyh0aGlzLm5hbWUsIHRoaXMuZGVzY3JpcHRpb24pIHsKICAgIGlmICgobmFtZSA9PSAndm0nKSB8fCBuYW1lLmNvbnRhaW5zKCcvJykpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgTWV0cmljIG5hbWUuJyk7CiAgICB9CiAgfQoKICBNYXAgX3RvSlNPTigpOwp9CgovLy8gQSBtZWFzdXJlZCB2YWx1ZSB3aXRoIGEgbWluIGFuZCBtYXguIEluaXRpYWwgdmFsdWUgaXMgbWluLiBWYWx1ZSB3aWxsCi8vLyBiZSBjbGFtcGVkIHRvIHRoZSBpbnRlcnZhbCBbbWluLCBtYXhdLgpjbGFzcyBHYXVnZSBleHRlbmRzIE1ldHJpYyB7CiAgZmluYWwgZG91YmxlIG1pbjsKICBmaW5hbCBkb3VibGUgbWF4OwoKICBkb3VibGUgX3ZhbHVlOwogIGRvdWJsZSBnZXQgdmFsdWUgPT4gX3ZhbHVlOwogIHNldCB2YWx1ZShkb3VibGUgdikgewogICAgaWYgKHYgPCBtaW4pIHsKICAgICAgdiA9IG1pbjsKICAgIH0gZWxzZSBpZiAodiA+IG1heCkgewogICAgICB2ID0gbWF4OwogICAgfQogICAgX3ZhbHVlID0gdjsKICB9CgogIEdhdWdlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIHRoaXMubWluLCB0aGlzLm1heCkKICAgICAgOiBzdXBlcihuYW1lLCBkZXNjcmlwdGlvbikgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobWluLCAnbWluJyk7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChtYXgsICdtYXgnKTsKICAgIGlmICghKG1pbiA8IG1heCkpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdtaW4gbXVzdCBiZSBsZXNzIHRoYW4gbWF4Jyk7CiAgICBfdmFsdWUgPSBtaW47CiAgfQoKICBNYXAgX3RvSlNPTigpIHsKICAgIHZhciBtYXAgPSB7CiAgICAgICd0eXBlJzogJ0dhdWdlJywKICAgICAgJ2lkJzogJ21ldHJpY3MvJG5hbWUnLAogICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICdkZXNjcmlwdGlvbic6IGRlc2NyaXB0aW9uLAogICAgICAndmFsdWUnOiB2YWx1ZSwKICAgICAgJ21pbic6IG1pbiwKICAgICAgJ21heCc6IG1heCwKICAgIH07CiAgICByZXR1cm4gbWFwOwogIH0KfQoKLy8vIEEgY2hhbmdpbmcgdmFsdWUuIEluaXRpYWwgdmFsdWUgaXMgMC4wLgpjbGFzcyBDb3VudGVyIGV4dGVuZHMgTWV0cmljIHsKICBDb3VudGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIDogc3VwZXIobmFtZSwgZGVzY3JpcHRpb24pOwoKICBkb3VibGUgX3ZhbHVlID0gMC4wOwogIGRvdWJsZSBnZXQgdmFsdWUgPT4gX3ZhbHVlOwogIHNldCB2YWx1ZShkb3VibGUgdikgewogICAgX3ZhbHVlID0gdjsKICB9CgogIE1hcCBfdG9KU09OKCkgewogICAgdmFyIG1hcCA9IHsKICAgICAgJ3R5cGUnOiAnQ291bnRlcicsCiAgICAgICdpZCc6ICdtZXRyaWNzLyRuYW1lJywKICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAnZGVzY3JpcHRpb24nOiBkZXNjcmlwdGlvbiwKICAgICAgJ3ZhbHVlJzogdmFsdWUsCiAgICB9OwogICAgcmV0dXJuIG1hcDsKICB9Cn0KCmNsYXNzIE1ldHJpY3MgewogIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBNZXRyaWM+IF9tZXRyaWNzID0gbmV3IE1hcDxTdHJpbmcsIE1ldHJpYz4oKTsKCiAgLy8vIFJlZ2lzdGVyIFtNZXRyaWNdcyB0byBtYWtlIHRoZW0gdmlzaWJsZSB0byBPYnNlcnZhdG9yeS4KICBzdGF0aWMgdm9pZCByZWdpc3RlcihNZXRyaWMgbWV0cmljKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChtZXRyaWMsICdtZXRyaWMnKTsKICAgIGlmIChfbWV0cmljc1ttZXRyaWMubmFtZV0gIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignUmVnaXN0ZXJlZCBtZXRyaWNzIGhhdmUgdW5pcXVlIG5hbWVzJyk7CiAgICB9CiAgICBfbWV0cmljc1ttZXRyaWMubmFtZV0gPSBtZXRyaWM7CiAgfQoKICAvLy8gRGVyZWdpc3RlciBbTWV0cmljXXMgdG8gbWFrZSB0aGVtIG5vdCB2aXNpYmxlIHRvIE9ic2VydmF0b3J5LgogIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXIoTWV0cmljIG1ldHJpYykgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobWV0cmljLCAnbWV0cmljJyk7CiAgICBfbWV0cmljcy5yZW1vdmUobWV0cmljLm5hbWUpOwogIH0KCiAgLy8gaWdub3JlOiB1bnVzZWRfZWxlbWVudCwgY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKICBzdGF0aWMgU3RyaW5nIF9wcmludE1ldHJpYyhTdHJpbmcgaWQpIHsKICAgIHZhciBtZXRyaWMgPSBfbWV0cmljc1tpZF07CiAgICBpZiAobWV0cmljID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4ganNvbi5lbmNvZGUobWV0cmljLl90b0pTT04oKSk7CiAgfQoKICAvLyBpZ25vcmU6IHVudXNlZF9lbGVtZW50LCBjYWxsZWQgZnJvbSBuYXRpdmUgY29kZQogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgIWNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJkYXJ0LnZtLnByb2R1Y3QiKSkKICBzdGF0aWMgU3RyaW5nIF9wcmludE1ldHJpY3MoKSB7CiAgICB2YXIgbWV0cmljcyA9IFtdOwogICAgZm9yICh2YXIgbWV0cmljIGluIF9tZXRyaWNzLnZhbHVlcykgewogICAgICBtZXRyaWNzLmFkZChtZXRyaWMuX3RvSlNPTigpKTsKICAgIH0KICAgIHZhciBtYXAgPSB7CiAgICAgICd0eXBlJzogJ01ldHJpY0xpc3QnLAogICAgICAnbWV0cmljcyc6IG1ldHJpY3MsCiAgICB9OwogICAgcmV0dXJuIGpzb24uZW5jb2RlKG1hcCk7CiAgfQp9CoCXAE5OPAEYAUgZUCMBKgEXFAFLFhkBMioCATMiAUxMTh8YHRUBJBwBKDA3BgQBEQIBSisdFBQBER4YEw8aDwYQBAE9IywsTBIEARIQFx0UIhYSEgcQBAIBLB9HARceGBAEARIQGR0UIhYHEAQCARBJAT4oMilHBiQEAUQqMiIEATUqHxoTBioEATVMIhYqJQYQHBoHHQQCARxkYXJ0OmRldmVsb3Blci9wcm9maWxlci5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZGV2ZWxvcGVyLmRhcnSU9y8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDpkZXZlbG9wZXIiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgcGF0Y2g7CgppbXBvcnQgImRhcnQ6YXN5bmMiIHNob3cgRnV0dXJlLCBab25lOwoKaW1wb3J0ICJkYXJ0Omlzb2xhdGUiIHNob3cgU2VuZFBvcnQ7CgovLy8gVGhlc2UgYXJlIHRoZSBhZGRpdGlvbmFsIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeToKLy8gcGFydCAicHJvZmlsZXIuZGFydCIKLy8gcGFydCAidGltZWxpbmUuZGFydCIKCkBwYXRjaApib29sIGRlYnVnZ2VyKHtib29sIHdoZW46IHRydWUsIFN0cmluZyBtZXNzYWdlfSkgbmF0aXZlICJEZXZlbG9wZXJfZGVidWdnZXIiOwoKQHBhdGNoCk9iamVjdCBpbnNwZWN0KE9iamVjdCBvYmplY3QpIG5hdGl2ZSAiRGV2ZWxvcGVyX2luc3BlY3QiOwoKQHBhdGNoCnZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLAogICAge0RhdGVUaW1lIHRpbWUsCiAgICBpbnQgc2VxdWVuY2VOdW1iZXIsCiAgICBpbnQgbGV2ZWw6IDAsCiAgICBTdHJpbmcgbmFtZTogJycsCiAgICBab25lIHpvbmUsCiAgICBPYmplY3QgZXJyb3IsCiAgICBTdGFja1RyYWNlIHN0YWNrVHJhY2V9KSB7CiAgaWYgKG1lc3NhZ2UgaXMhIFN0cmluZykgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobWVzc2FnZSwgIm1lc3NhZ2UiLCAiTXVzdCBiZSBhIFN0cmluZyIpOwogIH0KICB0aW1lID8/PSBuZXcgRGF0ZVRpbWUubm93KCk7CiAgaWYgKHRpbWUgaXMhIERhdGVUaW1lKSB7CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSh0aW1lLCAidGltZSIsICJNdXN0IGJlIGEgRGF0ZVRpbWUiKTsKICB9CiAgaWYgKHNlcXVlbmNlTnVtYmVyID09IG51bGwpIHsKICAgIHNlcXVlbmNlTnVtYmVyID0gX25leHRTZXF1ZW5jZU51bWJlcisrOwogIH0gZWxzZSB7CiAgICBfbmV4dFNlcXVlbmNlTnVtYmVyID0gc2VxdWVuY2VOdW1iZXIgKyAxOwogIH0KICBfbG9nKG1lc3NhZ2UsIHRpbWUubWlsbGlzZWNvbmRzU2luY2VFcG9jaCwgc2VxdWVuY2VOdW1iZXIsIGxldmVsLCBuYW1lLCB6b25lLAogICAgICBlcnJvciwgc3RhY2tUcmFjZSk7Cn0KCmludCBfbmV4dFNlcXVlbmNlTnVtYmVyID0gMDsKCl9sb2coU3RyaW5nIG1lc3NhZ2UsIGludCB0aW1lc3RhbXAsIGludCBzZXF1ZW5jZU51bWJlciwgaW50IGxldmVsLCBTdHJpbmcgbmFtZSwKICAgIFpvbmUgem9uZSwgT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIG5hdGl2ZSAiRGV2ZWxvcGVyX2xvZyI7CgpAcGF0Y2gKdm9pZCBfcG9zdEV2ZW50KFN0cmluZyBldmVudEtpbmQsIFN0cmluZyBldmVudERhdGEpCiAgICBuYXRpdmUgIkRldmVsb3Blcl9wb3N0RXZlbnQiOwoKQHBhdGNoClNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIF9sb29rdXBFeHRlbnNpb24oU3RyaW5nIG1ldGhvZCkKICAgIG5hdGl2ZSAiRGV2ZWxvcGVyX2xvb2t1cEV4dGVuc2lvbiI7CgpAcGF0Y2gKX3JlZ2lzdGVyRXh0ZW5zaW9uKFN0cmluZyBtZXRob2QsIFNlcnZpY2VFeHRlbnNpb25IYW5kbGVyIGhhbmRsZXIpCiAgICBuYXRpdmUgIkRldmVsb3Blcl9yZWdpc3RlckV4dGVuc2lvbiI7CgovLyBUaGlzIGNvZGUgaXMgb25seSBpbnZva2VkIHdoZW4gdGhlcmUgaXMgbm8gb3RoZXIgRGFydCBjb2RlIG9uIHRoZSBzdGFjay4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAhY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoImRhcnQudm0ucHJvZHVjdCIpKQpfcnVuRXh0ZW5zaW9uKAogICAgU2VydmljZUV4dGVuc2lvbkhhbmRsZXIgaGFuZGxlciwKICAgIFN0cmluZyBtZXRob2QsCiAgICBMaXN0PFN0cmluZz4gcGFyYW1ldGVyS2V5cywKICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJWYWx1ZXMsCiAgICBTZW5kUG9ydCByZXBseVBvcnQsCiAgICBPYmplY3QgaWQsCiAgICBib29sIHRyYWNlX3NlcnZpY2UpIHsKICB2YXIgcGFyYW1ldGVycyA9IDxTdHJpbmcsIFN0cmluZz57fTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtZXRlcktleXMubGVuZ3RoOyBpKyspIHsKICAgIHBhcmFtZXRlcnNbcGFyYW1ldGVyS2V5c1tpXV0gPSBwYXJhbWV0ZXJWYWx1ZXNbaV07CiAgfQogIHZhciByZXNwb25zZTsKICB0cnkgewogICAgcmVzcG9uc2UgPSBoYW5kbGVyKG1ldGhvZCwgcGFyYW1ldGVycyk7CiAgfSBjYXRjaCAoZSwgc3QpIHsKICAgIHZhciBlcnJvckRldGFpbHMgPSAoc3QgPT0gbnVsbCkgPyAnJGUnIDogJyRlXG4kc3QnOwogICAgcmVzcG9uc2UgPSBuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmVycm9yKAogICAgICAgIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5rRXh0ZW5zaW9uRXJyb3IsIGVycm9yRGV0YWlscyk7CiAgICBfcG9zdFJlc3BvbnNlKHJlcGx5UG9ydCwgaWQsIHJlc3BvbnNlLCB0cmFjZV9zZXJ2aWNlKTsKICAgIHJldHVybjsKICB9CiAgaWYgKHJlc3BvbnNlIGlzISBGdXR1cmUpIHsKICAgIHJlc3BvbnNlID0gbmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5lcnJvcigKICAgICAgICBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2Uua0V4dGVuc2lvbkVycm9yLAogICAgICAgICJFeHRlbnNpb24gaGFuZGxlciBtdXN0IHJldHVybiBhIEZ1dHVyZSIpOwogICAgX3Bvc3RSZXNwb25zZShyZXBseVBvcnQsIGlkLCByZXNwb25zZSwgdHJhY2Vfc2VydmljZSk7CiAgICByZXR1cm47CiAgfQogIHJlc3BvbnNlLmNhdGNoRXJyb3IoKGUsIHN0KSB7CiAgICAvLyBDYXRjaCBhbnkgZXJyb3JzIGVhZ2VybHkgYW5kIHdyYXAgdGhlbSBpbiBhIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS4KICAgIHZhciBlcnJvckRldGFpbHMgPSAoc3QgPT0gbnVsbCkgPyAnJGUnIDogJyRlXG4kc3QnOwogICAgcmV0dXJuIG5ldyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UuZXJyb3IoCiAgICAgICAgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLmtFeHRlbnNpb25FcnJvciwgZXJyb3JEZXRhaWxzKTsKICB9KS50aGVuKChyZXNwb25zZSkgewogICAgLy8gUG9zdCB0aGUgdmFsaWQgcmVzcG9uc2Ugb3IgdGhlIHdyYXBwZWQgZXJyb3IgYWZ0ZXIgdmVyaWZ5aW5nIHRoYXQKICAgIC8vIHRoZSByZXNwb25zZSBpcyBhIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS4KICAgIGlmIChyZXNwb25zZSBpcyEgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlKSB7CiAgICAgIHJlc3BvbnNlID0gbmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5lcnJvcigKICAgICAgICAgIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5rRXh0ZW5zaW9uRXJyb3IsCiAgICAgICAgICAiRXh0ZW5zaW9uIGhhbmRsZXIgbXVzdCBjb21wbGV0ZSB0byBhIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZSIpOwogICAgfQogICAgX3Bvc3RSZXNwb25zZShyZXBseVBvcnQsIGlkLCByZXNwb25zZSwgdHJhY2Vfc2VydmljZSk7CiAgfSkuY2F0Y2hFcnJvcigoZSwgc3QpIHsKICAgIC8vIFdlIGRvIG5vdCBleHBlY3QgYW55IGVycm9ycyB0byBvY2N1ciBpbiB0aGUgLnRoZW4gb3IgLmNhdGNoRXJyb3IgYmxvY2tzCiAgICAvLyBidXQsIHN1cHByZXNzIHRoZW0ganVzdCBpbiBjYXNlLgogIH0pOwp9CgovLyBUaGlzIGNvZGUgaXMgb25seSBpbnZva2VkIGJ5IF9ydW5FeHRlbnNpb24uCl9wb3N0UmVzcG9uc2UoU2VuZFBvcnQgcmVwbHlQb3J0LCBPYmplY3QgaWQsIFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZSByZXNwb25zZSwKICAgIGJvb2wgdHJhY2Vfc2VydmljZSkgewogIGFzc2VydChyZXBseVBvcnQgIT0gbnVsbCk7CiAgaWYgKGlkID09IG51bGwpIHsKICAgIGlmICh0cmFjZV9zZXJ2aWNlKSB7CiAgICAgIHByaW50KCJ2bS1zZXJ2aWNlOiBwb3N0aW5nIG5vIHJlc3BvbnNlIGZvciByZXF1ZXN0Iik7CiAgICB9CiAgICAvLyBObyBpZCAtPiBubyByZXNwb25zZS4KICAgIHJlcGx5UG9ydC5zZW5kKG51bGwpOwogICAgcmV0dXJuOwogIH0KICBhc3NlcnQoaWQgIT0gbnVsbCk7CiAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogIHNiLndyaXRlKCd7Impzb25ycGMiOiIyLjAiLCcpOwogIGlmIChyZXNwb25zZS5faXNFcnJvcigpKSB7CiAgICBpZiAodHJhY2Vfc2VydmljZSkgewogICAgICBwcmludCgidm0tc2VydmljZTogcG9zdGluZyBlcnJvciByZXNwb25zZSBmb3IgcmVxdWVzdCAkaWQiKTsKICAgIH0KICAgIHNiLndyaXRlKCciZXJyb3IiOicpOwogIH0gZWxzZSB7CiAgICBpZiAodHJhY2Vfc2VydmljZSkgewogICAgICBwcmludCgidm0tc2VydmljZTogcG9zdGluZyByZXNwb25zZSBmb3IgcmVxdWVzdCAkaWQiKTsKICAgIH0KICAgIHNiLndyaXRlKCcicmVzdWx0IjonKTsKICB9CiAgc2Iud3JpdGUoJyR7cmVzcG9uc2UuX3RvU3RyaW5nKCl9LCcpOwogIGlmIChpZCBpcyBTdHJpbmcpIHsKICAgIHNiLndyaXRlKCciaWQiOiIkaWQifScpOwogIH0gZWxzZSB7CiAgICBzYi53cml0ZSgnImlkIjokaWR9Jyk7CiAgfQogIHJlcGx5UG9ydC5zZW5kKHNiLnRvU3RyaW5nKCkpOwp9CgpAcGF0Y2gKaW50IF9nZXRTZXJ2aWNlTWFqb3JWZXJzaW9uKCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmljZU1ham9yVmVyc2lvbiI7CgpAcGF0Y2gKaW50IF9nZXRTZXJ2aWNlTWlub3JWZXJzaW9uKCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmljZU1pbm9yVmVyc2lvbiI7CgpAcGF0Y2gKdm9pZCBfZ2V0U2VydmVySW5mbyhTZW5kUG9ydCBzZW5kUG9ydCkgbmF0aXZlICJEZXZlbG9wZXJfZ2V0U2VydmVySW5mbyI7CgpAcGF0Y2gKdm9pZCBfd2ViU2VydmVyQ29udHJvbChTZW5kUG9ydCBzZW5kUG9ydCwgYm9vbCBlbmFibGUpCiAgICBuYXRpdmUgIkRldmVsb3Blcl93ZWJTZXJ2ZXJDb250cm9sIjsKCkBwYXRjaApTdHJpbmcgX2dldElzb2xhdGVJREZyb21TZW5kUG9ydChTZW5kUG9ydCBzZW5kUG9ydCkKICAgIG5hdGl2ZSAiRGV2ZWxvcGVyX2dldElzb2xhdGVJREZyb21TZW5kUG9ydCI7CoCrAE5OPAFNT0srASQBJwElAToYGAEHTgEHOgEHGRQYEhUPEh4cSwQfG0cEICwLLgRQGgIBHQFQTAEHNCIBBzgoAQdDKgFMSg8lEyAiGA8aJzM3BBAILBQ4M0E7DAQdMzIzOwwEIE04L0EXSTMxNTRMBjsaTygGAgEvUBodFBk8Bh0aDAQWKCEdGUMGGgsZPQYbBCgWHQsbBCECAQdJAQdJAQdJAQc3KQEHNDEBI2RhcnQ6ZGV2ZWxvcGVyLXBhdGNoL2RldmVsb3Blci5kYXJ0KG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9mZmkvZmZpLmRhcnSOcy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKCi8vLyB7QGNhdGVnb3J5IFZNfQovLy8ge0Bub2RvY30KbGlicmFyeSBkYXJ0LmZmaTsKCnBhcnQgIm5hdGl2ZV90eXBlLmRhcnQiOwpwYXJ0ICJhbm5vdGF0aW9ucy5kYXJ0IjsKcGFydCAiZHluYW1pY19saWJyYXJ5LmRhcnQiOwoKLy8vIEFsbG9jYXRlIFtjb3VudF0gZWxlbWVudHMgb2YgdHlwZSBbVF0gb24gdGhlIEMgaGVhcCB3aXRoIG1hbGxvYygpIGFuZCByZXR1cm4KLy8vIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIG1lbW9yeS4KLy8vCi8vLyBOb3RlIHRoYXQgdGhlIG1lbW9yeSBhcmUgdW5pbml0aWFsaXplZC4KLy8vCi8vLyBUT0RPKGRhY29oYXJrZXMpOiBjaGFuZ2Ugc2lnbmF0dXJlIHRvIFQgYWxsb2NhdGU8VCBleHRlbmRzIFBvaW50ZXI+KCkgPwovLy8gVGhpcyB3b3VsZCBlbmFibGUgdXMgdG8gYWxsb2NhdGUgc3RydWN0cy4gSG93ZXZlciBob3cgZG8gd2Uga25vdyB0aGUgc2l6ZSBvZgovLy8gc3RydWN0cz8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM1NzgyCmV4dGVybmFsIFBvaW50ZXI8VD4gYWxsb2NhdGU8VCBleHRlbmRzIE5hdGl2ZVR5cGU+KHtpbnQgY291bnQ6IDF9KTsKCi8vLyBDb25zdHJ1Y3Rpb24gZnJvbSByYXcgdmFsdWUKZXh0ZXJuYWwgVCBmcm9tQWRkcmVzczxUIGV4dGVuZHMgUG9pbnRlcj4oaW50IHB0cik7CgovLy8gbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgbmF0aXZlIHR5cGUgVApleHRlcm5hbCBpbnQgc2l6ZU9mPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPigpOwoKLy8vIENvbnZlcnQgRGFydCBmdW5jdGlvbiB0byBhIEMgZnVuY3Rpb24gcG9pbnRlciwgYXV0b21hdGljYWxseSBtYXJzaGFsbGluZwovLy8gdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlCi8vLwovLy8gTm90ZTogdGhpcyBpcyBub3QgaW1wbGVtZW50ZWQsIGFsd2F5cyByZXR1cm5zIFBvaW50ZXIgd2l0aCBhZGRyZXNzIDAuCi8vLwovLy8gVE9ETyhkYWNvaGFya2VzKTogSW1wbGVtZW50IHRoaXMgZmVhdHVyZS4KLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTc2MQpleHRlcm5hbCBQb2ludGVyPE5hdGl2ZUZ1bmN0aW9uPFQ+PiBmcm9tRnVuY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPigKICAgIEBEYXJ0UmVwcmVzZW50YXRpb25PZigiVCIpIEZ1bmN0aW9uIGYpOwoKLyoKLy8vIFRPRE8oZGFjb2hhcmtlcyk6IEltcGxlbWVudCB0aGlzIGZlYXR1cmUuCi8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzU3NzAKLy8vIFJldHVybiBhIHBvaW50ZXIgb2JqZWN0IHRoYXQgaGFzIGEgZmluYWxpemVyIGF0dGFjaGVkIHRvIGl0LiBXaGVuIHRoaXMKLy8vIHBvaW50ZXIgb2JqZWN0IGlzIGNvbGxlY3RlZCBieSBHQyB0aGUgZ2l2ZW4gZmluYWxpemVyIGlzIGludm9rZWQuCi8vLwovLy8gTm90ZTogdGhlIHBvaW50ZXIgb2JqZWN0IHBhc3NlZCB0byB0aGUgZmluYWxpemVyIGlzIG5vdCB0aGUgc2FtZSBhcwovLy8gdGhlIHBvaW50ZXIgb2JqZWN0IHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBbZmluYWxpemFibGVdIC0gaXQgcG9pbnRzCi8vLyB0byB0aGUgc2FtZSBtZW1vcnkgcmVnaW9uIGJ1dCBoYXMgZGlmZmVyZW50IGlkZW50aXR5LgpleHRlcm5hbCBQb2ludGVyPFQ+IGZpbmFsaXphYmxlPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPigKICAgIFBvaW50ZXI8VD4gcCwgdm9pZCBmaW5hbGl6ZXIoUG9pbnRlcjxUPiBwdHIpKTsKKi8KCi8vLyBSZXByZXNlbnRzIGEgcG9pbnRlciBpbnRvIHRoZSBuYXRpdmUgQyBtZW1vcnkuCmNsYXNzIFBvaW50ZXI8VCBleHRlbmRzIE5hdGl2ZVR5cGU+IGV4dGVuZHMgTmF0aXZlVHlwZSB7CiAgY29uc3QgUG9pbnRlcigpOwoKICAvLy8gU3RvcmUgYSBEYXJ0IHZhbHVlIGludG8gdGhpcyBsb2NhdGlvbi4KICAvLy8KICAvLy8gVGhlIFt2YWx1ZV0gaXMgYXV0b21hdGljYWxseSBtYXJzaGFsbGVkIGludG8gaXRzIEMgcmVwcmVzZW50YXRpb24uCiAgLy8vIE5vdGUgdGhhdCBpbnRzIHdoaWNoIGRvIG5vdCBmaXQgaW4gW1RdIGFyZSB0cnVuY2F0ZWQgYW5kIHNpZ24gZXh0ZW5kZWQsCiAgLy8vIGFuZCBkb3VibGVzIHN0b3JlZCBpbnRvIFBvaW50ZXI8W0Zsb2F0XT4gbG9zZSBwcmVjaXNpb24uCiAgZXh0ZXJuYWwgdm9pZCBzdG9yZShARGFydFJlcHJlc2VudGF0aW9uT2YoIlQiKSBPYmplY3QgdmFsdWUpOwoKICAvLy8gTG9hZCBhIERhcnQgdmFsdWUgZnJvbSB0aGlzIGxvY2F0aW9uLgogIC8vLwogIC8vLyBUaGUgdmFsdWUgaXMgYXV0b21hdGljYWxseSB1bm1hcnNoYWxsZWQgZnJvbSBpdHMgQyByZXByZXNlbnRhdGlvbi4KICBleHRlcm5hbCBSIGxvYWQ8QERhcnRSZXByZXNlbnRhdGlvbk9mKCJUIikgUj4oKTsKCiAgLy8vIEFjY2VzcyB0byB0aGUgcmF3IHBvaW50ZXIgdmFsdWUuCiAgZXh0ZXJuYWwgaW50IGdldCBhZGRyZXNzOwoKICAvLy8gUG9pbnRlciBhcml0aG1ldGljICh0YWtlcyBlbGVtZW50IHNpemUgaW50byBhY2NvdW50KS4KICBleHRlcm5hbCBQb2ludGVyPFQ+IGVsZW1lbnRBdChpbnQgaW5kZXgpOwoKICAvLy8gUG9pbnRlciBhcml0aG1ldGljIChieXRlIG9mZnNldCkuCiAgLy8vCiAgLy8vIFRPRE8oZGFjb2hhcmtlcyk6IHJlbW92ZSB0aGlzPwogIC8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzU4ODMKICBleHRlcm5hbCBQb2ludGVyPFQ+IG9mZnNldEJ5KGludCBvZmZzZXRJbkJ5dGVzKTsKCiAgLy8vIENhc3QgUG9pbnRlcjxUPiB0byBhIChzdWJ0eXBlIG9mKSBQb2ludGVyPFY+LgogIGV4dGVybmFsIFUgY2FzdDxVIGV4dGVuZHMgUG9pbnRlcj4oKTsKCiAgLy8vIENvbnZlcnQgdG8gRGFydCBmdW5jdGlvbiwgYXV0b21hdGljYWxseSBtYXJzaGFsbGluZyB0aGUgYXJndW1lbnRzCiAgLy8vIGFuZCByZXR1cm4gdmFsdWUuCiAgLy8vCiAgLy8vIENhbiBvbmx5IGJlIGNhbGxlZCBvbiBbUG9pbnRlcl08W05hdGl2ZUZ1bmN0aW9uXT4uCiAgZXh0ZXJuYWwgUiBhc0Z1bmN0aW9uPEBEYXJ0UmVwcmVzZW50YXRpb25PZigiVCIpIFIgZXh0ZW5kcyBGdW5jdGlvbj4oKTsKCiAgLy8vIEZyZWUgbWVtb3J5IG9uIHRoZSBDIGhlYXAgcG9pbnRlZCB0byBieSB0aGlzIHBvaW50ZXIgd2l0aCBmcmVlKCkuCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCB0aGlzIHplcm9zIG91dCB0aGUgYWRkcmVzcy4KICBleHRlcm5hbCB2b2lkIGZyZWUoKTsKCiAgLy8vIEVxdWFsaXR5IGZvciBQb2ludGVycyBvbmx5IGRlcGVuZHMgb24gdGhlaXIgYWRkcmVzcy4KICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGFkZHJlc3MgPT0gb3RoZXIuYWRkcmVzczsKICB9CgogIC8vLyBUaGUgaGFzaCBjb2RlIGZvciBhIFBvaW50ZXIgb25seSBkZXBlbmRzIG9uIGl0cyBhZGRyZXNzLgogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIGFkZHJlc3MuaGFzaENvZGU7CiAgfQp9CmoATk47ARMNEgEZGR0BUS0ELARMUTtEASA0ASotAU0jBEoELjJGLAEDLjJLRgRIRzo3MwMBMzkTAS0GSU4/QAEsBkkzASccATwsASgGJTQzATQoAUgYBjlKAUgGLBgBOxwlJQQBPxUdBAIBCGRhcnQ6ZmZpLm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZmZpX3BhdGNoLmRhcnSGiS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IHBhdGNoOwoKQHBhdGNoClBvaW50ZXI8VD4gYWxsb2NhdGU8VCBleHRlbmRzIE5hdGl2ZVR5cGU+KHtpbnQgY291bnQ6IDF9KSBuYXRpdmUgIkZmaV9hbGxvY2F0ZSI7CgpAcGF0Y2gKVCBmcm9tQWRkcmVzczxUIGV4dGVuZHMgUG9pbnRlcj4oaW50IHB0cikgbmF0aXZlICJGZmlfZnJvbUFkZHJlc3MiOwoKQHBhdGNoCmludCBzaXplT2Y8VCBleHRlbmRzIE5hdGl2ZVR5cGU+KCkgbmF0aXZlICJGZmlfc2l6ZU9mIjsKCkBwYXRjaApQb2ludGVyPE5hdGl2ZUZ1bmN0aW9uPFQ+PiBmcm9tRnVuY3Rpb248VCBleHRlbmRzIEZ1bmN0aW9uPigKICAgIEBEYXJ0UmVwcmVzZW50YXRpb25PZigiVCIpIEZ1bmN0aW9uIGYpIG5hdGl2ZSAiRmZpX2Zyb21GdW5jdGlvbiI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBQb2ludGVyPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPiB7CiAgQHBhdGNoCiAgdm9pZCBzdG9yZShPYmplY3QgdmFsdWUpIG5hdGl2ZSAiRmZpX3N0b3JlIjsKCiAgQHBhdGNoCiAgUiBsb2FkPFI+KCkgbmF0aXZlICJGZmlfbG9hZCI7CgogIEBwYXRjaAogIGludCBnZXQgYWRkcmVzcyBuYXRpdmUgIkZmaV9hZGRyZXNzIjsKCiAgLy8gTm90ZSB0aGlzIGNvdWxkIGFsc28gYmUgaW1wbG1lbnRlZCB3aXRob3V0IGFuIGV4dHJhIG5hdGl2ZSBhcyBvZmZzZXRCeQogIC8vIChlbGVtZW50U2l6ZSgpKmluZGV4KS4gVGhpcyB3b3VsZCBiZSAyIG5hdGl2ZSBjYWxscyByYXRoZXIgdGhhbiBvbmUuIFdoYXQKICAvLyB3b3VsZCBiZSBiZXR0ZXI/CiAgQHBhdGNoCiAgUG9pbnRlcjxUPiBlbGVtZW50QXQoaW50IGluZGV4KSBuYXRpdmUgIkZmaV9lbGVtZW50QXQiOwoKICAvLyBOb3RlIHRoaXMgY291bGQgYWxzbyBiZSBpbXBsbWVudGVkIHdpdGhvdXQgYW4gZXh0cmEgIG5hdGl2ZSBhcwogIC8vIGZyb21BZGRyZXNzKGFkZHJlc3MpLiBUaGlzIHdvdWxkIGJlIDIgbmF0aXZlIGNhbGxzIHJhdGhlciB0aGFuIG9uZS4KICAvLyBXaGF0IHdvdWxkIGJlIGJldHRlcj8KICBAcGF0Y2gKICBQb2ludGVyPFQ+IG9mZnNldEJ5KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIkZmaV9vZmZzZXRCeSI7CgogIC8vIE5vdGUgdGhpcyBjb3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIHdpdGhvdXQgYW4gZXh0cmEgbmF0aXZlIGFzCiAgLy8gZnJvbUFkZHJlc3MoYWRkcmVzcykuIFRoaXMgd291bGQgYmUgMiBuYXRpdmUgY2FsbHMgcmF0aGVyIHRoYW4gb25lLgogIC8vIFdoYXQgd291bGQgYmUgYmV0dGVyPwogIEBwYXRjaAogIFUgY2FzdDxVIGV4dGVuZHMgUG9pbnRlcj4oKSBuYXRpdmUgIkZmaV9jYXN0IjsKCiAgQHBhdGNoCiAgUiBhc0Z1bmN0aW9uPFIgZXh0ZW5kcyBGdW5jdGlvbj4oKSBuYXRpdmUgIkZmaV9hc0Z1bmN0aW9uIjsKCiAgQHBhdGNoCiAgdm9pZCBmcmVlKCkgbmF0aXZlICJGZmlfZnJlZSI7Cn0KOQBOTjwBJAEHUQEHRAEHOAEHPUYBBxomCS8BCSEBCSgBTE8WCToBREkbCUABREkbCTEBCT4BCSECAR1kYXJ0OmZmaS1wYXRjaC9mZmlfcGF0Y2guZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvZmZpL25hdGl2ZV90eXBlLmRhcnSOwS8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuZmZpOwoKLy8vIFtOYXRpdmVUeXBlXSdzIHN1YnR5cGVzIHJlcHJlc2VudCBhIG5hdGl2ZSB0eXBlIGluIEMuCi8vLwovLy8gW05hdGl2ZVR5cGVdJ3Mgc3VidHlwZXMgYXJlIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlCi8vLyBwdXJlbHkgYXMgbWFya2VycyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIE5hdGl2ZVR5cGUgewogIGNvbnN0IE5hdGl2ZVR5cGUoKTsKfQoKLy8vIFtfTmF0aXZlSW50ZWdlcl0ncyBzdWJ0eXBlcyByZXByZXNlbnQgYSBuYXRpdmUgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtfTmF0aXZlSW50ZWdlcl0ncyBzdWJ0eXBlcyBhcmUgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmUKLy8vIHB1cmVseSBhcyBtYXJrZXJzIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgX05hdGl2ZUludGVnZXIgZXh0ZW5kcyBOYXRpdmVUeXBlIHsKICBjb25zdCBfTmF0aXZlSW50ZWdlcigpOwp9CgovLy8gW19OYXRpdmVEb3VibGVdJ3Mgc3VidHlwZXMgcmVwcmVzZW50IGEgbmF0aXZlIGZsb2F0IG9yIGRvdWJsZSBpbiBDLgovLy8KLy8vIFtfTmF0aXZlRG91YmxlXSdzIHN1YnR5cGVzIGFyZSBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZQovLy8gcHVyZWx5IGFzIG1hcmtlcnMgaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBfTmF0aXZlRG91YmxlIGV4dGVuZHMgTmF0aXZlVHlwZSB7CiAgY29uc3QgX05hdGl2ZURvdWJsZSgpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSBzaWduZWQgOCBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtJbnQ4XSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlciBpbgovLy8gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBJbnQ4IGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IEludDgoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgc2lnbmVkIDE2IGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW0ludDE2XSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlciBpbgovLy8gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBJbnQxNiBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBJbnQxNigpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSBzaWduZWQgMzIgYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbSW50MzJdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyIGluCi8vLyB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIEludDMyIGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IEludDMyKCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHNpZ25lZCA2NCBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtJbnQ2NF0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIgaW4KLy8vIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgSW50NjQgZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgSW50NjQoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgdW5zaWduZWQgOCBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtVaW50OF0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIgaW4KLy8vIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgVWludDggZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgVWludDgoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgdW5zaWduZWQgMTYgYml0IGludGVnZXIgaW4gQy4KLy8vCi8vLyBbVWludDE2XSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlcgovLy8gaW4gdHlwZSBzaWduYXR1cmVzLgpjbGFzcyBVaW50MTYgZXh0ZW5kcyBfTmF0aXZlSW50ZWdlciB7CiAgY29uc3QgVWludDE2KCk7Cn0KCi8vLyBSZXByZXNlbnRzIGEgbmF0aXZlIHVuc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW1VpbnQzMl0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIKLy8vIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgVWludDMyIGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IFVpbnQzMigpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSB1bnNpZ25lZCA2NCBiaXQgaW50ZWdlciBpbiBDLgovLy8KLy8vIFtVaW50NjRdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyCi8vLyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIFVpbnQ2NCBleHRlbmRzIF9OYXRpdmVJbnRlZ2VyIHsKICBjb25zdCBVaW50NjQoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgcG9pbnRlci1zaXplZCBpbnRlZ2VyIGluIEMuCi8vLwovLy8gW0ludFB0cl0gaXMgbm90IGNvbnN0cnVjdGlibGUgaW4gdGhlIERhcnQgY29kZSBhbmQgc2VydmVzIHB1cmVseSBhcyBtYXJrZXIKLy8vIGluIHR5cGUgc2lnbmF0dXJlcy4KY2xhc3MgSW50UHRyIGV4dGVuZHMgX05hdGl2ZUludGVnZXIgewogIGNvbnN0IEludFB0cigpOwp9CgovLy8gUmVwcmVzZW50cyBhIG5hdGl2ZSAzMiBiaXQgZmxvYXQgaW4gQy4KLy8vCi8vLyBbRmxvYXRdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyCi8vLyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIEZsb2F0IGV4dGVuZHMgX05hdGl2ZURvdWJsZSB7CiAgY29uc3QgRmxvYXQoKTsKfQoKLy8vIFJlcHJlc2VudHMgYSBuYXRpdmUgNjQgYml0IGRvdWJsZSBpbiBDLgovLy8KLy8vIFtEb3VibGVdIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMgbWFya2VyCi8vLyBpbiB0eXBlIHNpZ25hdHVyZXMuCmNsYXNzIERvdWJsZSBleHRlbmRzIF9OYXRpdmVEb3VibGUgewogIGNvbnN0IERvdWJsZSgpOwp9CgovLy8gUmVwcmVzZW50cyBhIHZvaWQgdHlwZSBpbiBDLgovLy8KLy8vIFtWb2lkXSBpcyBub3QgY29uc3RydWN0aWJsZSBpbiB0aGUgRGFydCBjb2RlIGFuZCBzZXJ2ZXMgcHVyZWx5IGFzIG1hcmtlciBpbgovLy8gdHlwZSBzaWduYXR1cmVzLgpAdW5zaXplZApjbGFzcyBWb2lkIGV4dGVuZHMgTmF0aXZlVHlwZSB7CiAgY29uc3QgVm9pZCgpOwp9CgovLy8gUmVwcmVzZW50cyBhIGZ1bmN0aW9uIHR5cGUgaW4gQy4KLy8vCi8vLyBbTmF0aXZlRnVuY3Rpb25dIGlzIG5vdCBjb25zdHJ1Y3RpYmxlIGluIHRoZSBEYXJ0IGNvZGUgYW5kIHNlcnZlcyBwdXJlbHkgYXMKLy8vIG1hcmtlciBpbiB0eXBlIHNpZ25hdHVyZXMuCkB1bnNpemVkCmNsYXNzIE5hdGl2ZUZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbj4gZXh0ZW5kcyBOYXRpdmVUeXBlIHt9CoCHAE5OPAESAToETSoTFgIBQQRRKioaAgFIBFAqKRkCATMEUBUkEAIBNARRFSURAgE0BFEVJRECATQEURUlEQIBNQRRFSURAgE2BE8YJhICATYETxgmEgIBNgRPGCYSAgE0BE8YJhICASsEThgkEQIBLARPGCUSAgEhBFAVCSAQAgElBFAfCT8BGWRhcnQ6ZmZpL25hdGl2ZV90eXBlLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ZmaS9hbm5vdGF0aW9ucy5kYXJ0hz0vLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmZmaTsKCmNsYXNzIFN0cnVjdCB7CiAgY29uc3QgU3RydWN0KCk7Cn0KCi8vLyBUaGlzIERhcnQgY2xhc3MgcmVwcmVzZW50cyBhIEMgc3RydWN0LgovLy8KLy8vIEZpZWxkcyBpbiB0aGlzIHN0cnVjdCwgYW5ub3RhdGVkIHdpdGggYSBzdWJ0eXBlIG9mIFtOYXRpdmVUeXBlXSwgYXJlCi8vLyBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkIGludG8gd3JhcHBlcnMgdG8gYWNjZXNzIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAovLy8gaW4gQyBtZW1vcnkuCi8vLwovLy8gRmllbGRzIHdpdGhvdXQgYSBbTmF0aXZlVHlwZV0gYW5ub3RhdGlvbiBhcmUgbm90IHN1cHBvcnRlZC4KY29uc3Qgc3RydWN0ID0gY29uc3QgU3RydWN0KCk7CgpjbGFzcyBEYXJ0UmVwcmVzZW50YXRpb25PZiB7CiAgLy8vIFJlcHJlc2VudHMgdGhlIERhcnQgdHlwZSBjb3JyZXNwb25kaW5nIHRvIGEgW05hdGl2ZVR5cGVdLgogIC8vLwogIC8vLyBbSW50OF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW0ludDE2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtJbnQzMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbSW50NjRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW1VpbnQ4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtVaW50MTZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbVWludDMyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2ludF0KICAvLy8gW1VpbnQ2NF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtpbnRdCiAgLy8vIFtJbnRQdHJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbaW50XQogIC8vLyBbRG91YmxlXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gW2RvdWJsZV0KICAvLy8gW0Zsb2F0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFtkb3VibGVdCiAgLy8vIFtQb2ludGVyXTxUPiAgICAgICAgICAgICAgICAgICAgICAgICAtPiBbUG9pbnRlcl08VD4KICAvLy8gVCBleHRlbmRzIFtQb2ludGVyXSAgICAgICAgICAgICAgICAgIC0+IFQKICAvLy8gW05hdGl2ZUZ1bmN0aW9uXTxUMSBGdW5jdGlvbihUMiwgVDMpIC0+IFMxIEZ1bmN0aW9uKFMyLCBTMykKICAvLy8gICAgd2hlcmUgRGFydFJlcHJlc2VudGF0aW9uT2YoVG4pIC0+IFNuCiAgY29uc3QgRGFydFJlcHJlc2VudGF0aW9uT2YoU3RyaW5nIG5hdGl2ZVR5cGUpOwp9CgpjbGFzcyBVbnNpemVkIHsKICBjb25zdCBVbnNpemVkKCk7Cn0KCi8vLyBUaGlzIFtOYXRpdmVUeXBlXSBkb2VzIG5vdCBoYXZlIHByZWRlZmluZWQgc2l6ZS4KLy8vCi8vLyBVbnNpemVkIE5hdGl2ZVR5cGVzIGRvIG5vdCBzdXBwb3J0IFtzaXplT2ZdIGJlY2F1c2UgdGhlaXIgc2l6ZSBpcyB1bmtub3duLgovLy8gQ29uc2VxdWVudGx5LCBbYWxsb2NhdGVdLCBbUG9pbnRlci5sb2FkXSwgW1BvaW50ZXIuc3RvcmVdLCBhbmQKLy8vIFtQb2ludGVyLmVsZW1lbnRBdF0gYXJlIG5vdCBhdmFpbGFibGUuCmNvbnN0IHVuc2l6ZWQgPSBjb25zdCBVbnNpemVkKCk7CjQATk48ARIBDxICASsESU8RBEAfAR1ABjQ0NDQ0NDQ0NDc3OzBCLjECARATAgE1BE9DKyEBGWRhcnQ6ZmZpL2Fubm90YXRpb25zLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ZmaS9keW5hbWljX2xpYnJhcnkuZGFydITwLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5mZmk7CgovLy8gUmVwcmVzZW50cyBhIGR5bmFtaWNhbGx5IGxvYWRlZCBDIGxpYnJhcnkuCmNsYXNzIER5bmFtaWNMaWJyYXJ5IHsKICAvLy8gTG9hZHMgYSBkeW5hbWljIGxpYnJhcnkgZmlsZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBkbG9wZW4uCiAgLy8vCiAgLy8vIFRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0gaWYgbG9hZGluZyB0aGUgZHluYW1pYyBsaWJyYXJ5IGZhaWxzLgogIC8vLwogIC8vLyBOb3RlIHRoYXQgaXQgbG9hZHMgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgbGlicmFyeSBsYXppbHkgKFJUTERfTEFaWSkuCiAgZXh0ZXJuYWwgZmFjdG9yeSBEeW5hbWljTGlicmFyeS5vcGVuKFN0cmluZyBuYW1lKTsKCiAgLy8vIExvb2tzIHVwIGEgc3ltYm9sIGluIHRoZSBbRHluYW1pY0xpYnJhcnldIGFuZCByZXR1cm5zIGl0cyBhZGRyZXNzIGluCiAgLy8vIG1lbW9yeS4gRXF1aXZhbGVudCBvZiBkbHN5bS4KICAvLy8KICAvLy8gVGhyb3dzIGFuIFtBcmd1bWVudEVycm9yXSBpZiBpdCBmYWlscyB0byBsb29rdXAgdGhlIHN5bWJvbC4KICBleHRlcm5hbCBQb2ludGVyPFQ+IGxvb2t1cDxUIGV4dGVuZHMgTmF0aXZlVHlwZT4oU3RyaW5nIHN5bWJvbE5hbWUpOwoKICAvLy8gSGVscGVyIHRoYXQgY29tYmluZXMgbG9va3VwIGFuZCBjYXN0IHRvIGEgRGFydCBmdW5jdGlvbi4KICBGIGxvb2t1cEZ1bmN0aW9uPFQgZXh0ZW5kcyBGdW5jdGlvbiwgRiBleHRlbmRzIEZ1bmN0aW9uPihTdHJpbmcgc3ltYm9sTmFtZSkgewogICAgcmV0dXJuIGxvb2t1cDxOYXRpdmVGdW5jdGlvbjxUPj4oc3ltYm9sTmFtZSk/LmFzRnVuY3Rpb248Rj4oKTsKICB9CgogIC8vLyBEeW5hbWljIGxpYnJhcmllcyBhcmUgZXF1YWwgaWYgdGhleSBsb2FkIHRoZSBzYW1lIGxpYnJhcnkuCiAgZXh0ZXJuYWwgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7CgogIC8vLyBUaGUgaGFzaCBjb2RlIGZvciBhIER5bmFtaWNMaWJyYXJ5IG9ubHkgZGVwZW5kcyBvbiB0aGUgbG9hZGVkIGxpYnJhcnkKICBleHRlcm5hbCBpbnQgZ2V0IGhhc2hDb2RlOwp9CiIATk48ARIBLxdGBkYGSjUBSyMGQkcBP1BDBAFBJAFMHQIBHWRhcnQ6ZmZpL2R5bmFtaWNfbGlicmFyeS5kYXJ0Pm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZmZpX2R5bmFtaWNfbGlicmFyeV9wYXRjaC5kYXJ0g4kvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBwYXRjaDsKCkR5bmFtaWNMaWJyYXJ5IF9vcGVuKFN0cmluZyBuYW1lKSBuYXRpdmUgIkZmaV9kbF9vcGVuIjsKCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIER5bmFtaWNMaWJyYXJ5IHsKICBAcGF0Y2gKICBmYWN0b3J5IER5bmFtaWNMaWJyYXJ5Lm9wZW4oU3RyaW5nIG5hbWUpIHsKICAgIHJldHVybiBfb3BlbihuYW1lKTsKICB9CgogIEBwYXRjaAogIFBvaW50ZXI8VD4gbG9va3VwPFQgZXh0ZW5kcyBOYXRpdmVUeXBlPihTdHJpbmcgc3ltYm9sTmFtZSkKICAgICAgbmF0aXZlICJGZmlfZGxfbG9va3VwIjsKCiAgLy8gVE9ETyhkYWNvaGFya2VzKTogRXhwb3NlIHRoaXMgdG8gdXNlcnMsIG9yIGV4dGVuZCBQb2ludGVyPwogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTg4MQogIGludCBnZXRIYW5kbGUoKSBuYXRpdmUgIkZmaV9kbF9nZXRIYW5kbGUiOwoKICBAcGF0Y2gKICBib29sIG9wZXJhdG9yID09KG90aGVyKSB7CiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGdldEhhbmRsZSgpID09IG90aGVyLmdldEhhbmRsZSgpOwogIH0KCiAgQHBhdGNoCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gZ2V0SGFuZGxlKCkuaGFzaENvZGU7CiAgfQp9CiUATk48ASQBOAEHGhcJLRgEAQk9HgFAMy0BCRwlLQQBCRUhBAIBLWRhcnQ6ZmZpLXBhdGNoL2ZmaV9keW5hbWljX2xpYnJhcnlfcGF0Y2guZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvaW50ZXJuYWwuZGFydLWOLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydC5faW50ZXJuYWw7CgppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnCiAgICBzaG93CiAgICAgICAgRnV0dXJlLAogICAgICAgIFN0cmVhbSwKICAgICAgICBTdHJlYW1TdWJzY3JpcHRpb24sCiAgICAgICAgU3RyZWFtVHJhbnNmb3JtZXIsCiAgICAgICAgU3RyZWFtVHJhbnNmb3JtZXJCYXNlLAogICAgICAgIFpvbmU7CmltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IENvbnZlcnRlcjsKaW1wb3J0ICdkYXJ0OmNvcmUnIGhpZGUgU3ltYm9sOwppbXBvcnQgJ2RhcnQ6Y29yZScgYXMgY29yZTsKaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgUmFuZG9tOwoKcGFydCAnYXN5bmNfY2FzdC5kYXJ0JzsKcGFydCAnY2FzdC5kYXJ0JzsKcGFydCAnaXRlcmFibGUuZGFydCc7CnBhcnQgJ2xpc3QuZGFydCc7CnBhcnQgJ3ByaW50LmRhcnQnOwpwYXJ0ICdzb3J0LmRhcnQnOwpwYXJ0ICdzeW1ib2wuZGFydCc7CnBhcnQgJ2xpbmtlZF9saXN0LmRhcnQnOwoKLy8gUG93ZXJzIG9mIDEwIHVwIHRvIDEwXjIyIGFyZSByZXByZXNlbnRhYmxlIGFzIGRvdWJsZXMuCi8vIFBvd2VycyBvZiAxMCBhYm92ZSB0aGF0IGFyZSBvbmx5IGFwcHJveGltYXRlIGR1ZSB0byBsYWNrIG9mIHByZWNpc3Npb24uCi8vIFVzZWQgYnkgZG91YmxlLXBhcnNpbmcuCmNvbnN0IFBPV0VSU19PRl9URU4gPSBjb25zdCBbCiAgMS4wLCAvLyAwCiAgMTAuMCwKICAxMDAuMCwKICAxMDAwLjAsCiAgMTAwMDAuMCwKICAxMDAwMDAuMCwgLy8gNQogIDEwMDAwMDAuMCwKICAxMDAwMDAwMC4wLAogIDEwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMC4wLCAvLyAxMAogIDEwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAuMCwgLy8gMTUKICAxMDAwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwMDAwMC4wLAogIDEwMDAwMDAwMDAwMDAwMDAwMDAwMC4wLCAvLyAyMAogIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCwKICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wLApdOwoKLyoqCiAqIEFuIFtJdGVyYWJsZV0gb2YgdGhlIFVURi0xNiBjb2RlIHVuaXRzIG9mIGEgW1N0cmluZ10gaW4gaW5kZXggb3JkZXIuCiAqLwpjbGFzcyBDb2RlVW5pdHMgZXh0ZW5kcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxpbnQ+IHsKICAvKiogVGhlIHN0cmluZyB0aGF0IHRoaXMgaXMgdGhlIGNvZGUgdW5pdHMgb2YuICovCiAgZmluYWwgU3RyaW5nIF9zdHJpbmc7CgogIENvZGVVbml0cyh0aGlzLl9zdHJpbmcpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfc3RyaW5nLmxlbmd0aDsKICBpbnQgb3BlcmF0b3IgW10oaW50IGkpID0+IF9zdHJpbmcuY29kZVVuaXRBdChpKTsKCiAgc3RhdGljIFN0cmluZyBzdHJpbmdPZihDb2RlVW5pdHMgdSkgPT4gdS5fc3RyaW5nOwp9CgovLy8gTWFya3MgYSBmdW5jdGlvbiBvciBsaWJyYXJ5IGFzIGhhdmluZyBhbiBleHRlcm5hbCBpbXBsZW1lbnRhdGlvbiAoIm5hdGl2ZSIKLy8vIGluIHRoZSBEYXJ0IFZNKS4KLy8vCi8vLyBPbiBhIGZ1bmN0aW9uLCB0aGlzIHByb3ZpZGVzIGEgYmFja2VuZC1zcGVjaWZpYyBTdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0bwovLy8gaWRlbnRpZnkgdGhlIGZ1bmN0aW9uJ3MgaW1wbGVtZW50YXRpb24uCi8vLwovLy8gT24gYSBsaWJyYXJ5LCBpdCBwcm92aWRlcyBhIFVyaSB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgbmF0aXZlCi8vLyBsaWJyYXJ5J3MgaW1wbGVtZW50YXRpb24uCmNsYXNzIEV4dGVybmFsTmFtZSB7CiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgY29uc3QgRXh0ZXJuYWxOYW1lKHRoaXMubmFtZSk7Cn0KCi8vIFNoYXJlZCBoZXgtcGFyc2luZyB1dGlsaXRpZXMuCgovLy8gUGFyc2VzIGEgc2luZ2xlIGhleC1kaWdpdCBhcyBjb2RlIHVuaXQuCi8vLwovLy8gUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGEgdmFsaWQgaGV4LWRpZ2l0LgppbnQgaGV4RGlnaXRWYWx1ZShpbnQgY2hhcikgewogIGFzc2VydChjaGFyID49IDAgJiYgY2hhciA8PSAweEZGRkYpOwogIGNvbnN0IGludCBkaWdpdDAgPSAweDMwOwogIGNvbnN0IGludCBhID0gMHg2MTsKICBjb25zdCBpbnQgZiA9IDB4NjY7CiAgaW50IGRpZ2l0ID0gY2hhciBeIGRpZ2l0MDsKICBpZiAoZGlnaXQgPD0gOSkgcmV0dXJuIGRpZ2l0OwogIGludCBsZXR0ZXIgPSAoY2hhciB8IDB4MjApOwogIGlmIChhIDw9IGxldHRlciAmJiBsZXR0ZXIgPD0gZikgcmV0dXJuIGxldHRlciAtIChhIC0gMTApOwogIHJldHVybiAtMTsKfQoKLy8vIFBhcnNlcyB0d28gaGV4IGRpZ2l0cyBpbiBhIHN0cmluZy4KLy8vCi8vLyBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaWYgZWl0aGVyIGRpZ2l0IGlzbid0IHZhbGlkLgppbnQgcGFyc2VIZXhCeXRlKFN0cmluZyBzb3VyY2UsIGludCBpbmRleCkgewogIGFzc2VydChpbmRleCArIDIgPD0gc291cmNlLmxlbmd0aCk7CiAgaW50IGRpZ2l0MSA9IGhleERpZ2l0VmFsdWUoc291cmNlLmNvZGVVbml0QXQoaW5kZXgpKTsKICBpbnQgZGlnaXQyID0gaGV4RGlnaXRWYWx1ZShzb3VyY2UuY29kZVVuaXRBdChpbmRleCArIDEpKTsKICByZXR1cm4gZGlnaXQxICogMTYgKyBkaWdpdDIgLSAoZGlnaXQyICYgMjU2KTsKfQoKLy8vIEdpdmVuIGFuIFtpbnN0YW5jZV0gb2Ygc29tZSBnZW5lcmljIHR5cGUgW1RdLCBhbmQgW2V4dHJhY3RdLCBhIGZpcnN0LWNsYXNzCi8vLyBnZW5lcmljIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHR5cGUgcGFyYW1ldGVycyBhcyBbVF0sCi8vLyBpbnZva2VzIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHR5cGUgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gVAovLy8gd2hlbiBbaW5zdGFuY2VdIHdhcyBjb25zdHJ1Y3RlZC4KLy8vCi8vLyBFeGFtcGxlOgovLy8KLy8vIGBgYGRhcnQKLy8vIGNsYXNzIFR3bzxBLCBCPiB7fQovLy8KLy8vIHByaW50KGV4dHJhY3RUeXBlQXJndW1lbnRzPExpc3Q+KDxpbnQ+W10sIDxUPigpID0+IG5ldyBTZXQ8VD4oKSkpOwovLy8gLy8gUHJpbnRzOiBJbnN0YW5jZSBvZiAnU2V0PGludD4nLgovLy8KLy8vIHByaW50KGV4dHJhY3RUeXBlQXJndW1lbnRzPE1hcD4oPFN0cmluZywgYm9vbD57fSwKLy8vICAgICA8VCwgUz4oKSA9PiBuZXcgVHdvPFQsIFM+KSk7Ci8vLyAvLyBQcmludHM6IEluc3RhbmNlIG9mICdUd288U3RyaW5nLCBib29sPicuCi8vLyBgYGAKLy8vCi8vLyBUaGUgdHlwZSBhcmd1bWVudCBUIGlzIGltcG9ydGFudCB0byBjaG9vc2Ugd2hpY2ggc3BlY2lmaWMgdHlwZSBwYXJhbWV0ZXIKLy8vIGxpc3QgaW4gW2luc3RhbmNlXSdzIHR5cGUgaGllcmFyY2h5IGlzIGJlaW5nIGV4dHJhY3RlZC4gQ29uc2lkZXI6Ci8vLwovLy8gYGBgZGFydAovLy8gY2xhc3MgQTxUPiB7fQovLy8gY2xhc3MgQjxUPiB7fQovLy8KLy8vIGNsYXNzIEMgaW1wbGVtZW50cyBBPGludD4sIEI8U3RyaW5nPiB7fQovLy8KLy8vIG1haW4oKSB7Ci8vLyAgIHZhciBjID0gbmV3IEMoKTsKLy8vICAgcHJpbnQoZXh0cmFjdFR5cGVBcmd1bWVudHM8QT4oYywgPFQ+KCkgPT4gPFQ+W10pKTsKLy8vICAgLy8gUHJpbnRzOiBJbnN0YW5jZSBvZiAnTGlzdDxpbnQ+Jy4KLy8vCi8vLyAgIHByaW50KGV4dHJhY3RUeXBlQXJndW1lbnRzPEI+KGMsIDxUPigpID0+IDxUPltdKSk7Ci8vLyAgIC8vIFByaW50czogSW5zdGFuY2Ugb2YgJ0xpc3Q8U3RyaW5nPicuCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBBIGNhbGxlciBtdXN0IG5vdDoKLy8vCi8vLyAqICAgUGFzcyBgbnVsbGAgZm9yIFtpbnN0YW5jZV0uCi8vLyAqICAgVXNlIGEgbm9uLWNsYXNzIHR5cGUgKGkuZS4gYSBmdW5jdGlvbiB0eXBlKSBmb3IgW1RdLgovLy8gKiAgIFVzZSBhIG5vbi1nZW5lcmljIHR5cGUgZm9yIFtUXS4KLy8vICogICBQYXNzIGFuIGluc3RhbmNlIG9mIGEgZ2VuZXJpYyB0eXBlIGFuZCBhIGZ1bmN0aW9uIHRoYXQgZG9uJ3QgYm90aCB0YWtlCi8vLyAgICAgdGhlIHNhbWUgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzOgovLy8KLy8vICAgICBgYGBkYXJ0Ci8vLyAgICAgZXh0cmFjdFR5cGVBcmd1bWVudHM8TGlzdD4oPGludD5bXSwgPFQsIFM+KCkgPT4gbnVsbCk7Ci8vLyAgICAgYGBgCi8vLwovLy8gU2VlIHRoaXMgaXNzdWUgZm9yIG1vcmUgY29udGV4dDoKLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zMTM3MQpleHRlcm5hbCBPYmplY3QgZXh0cmFjdFR5cGVBcmd1bWVudHM8VD4oVCBpbnN0YW5jZSwgRnVuY3Rpb24gZXh0cmFjdCk7CgovLy8gQW5ub3RhdGlvbiBjbGFzcyBtYXJraW5nIHRoZSB2ZXJzaW9uIHdoZXJlIFNESyBBUEkgd2FzIGFkZGVkLgovLy8KLy8vIEEgYFNpbmNlYCBhbm5vdGF0aW9uIGNhbiBiZSBhcHBsaWVkIHRvIGEgbGlicmFyeSBkZWNsYXJhdGlvbiwKLy8vIGFueSBwdWJsaWMgZGVjbGFyYXRpb24gaW4gYSBsaWJyYXJ5LCBvciBpbiBhIGNsYXNzLCBvciB0bwovLy8gYW4gb3B0aW9uYWwgcGFyYW1ldGVyLgovLy8KLy8vIEl0IHNpZ25pZmllcyB0aGF0IHRoZSBleHBvcnQsIG1lbWJlciBvciBwYXJhbWV0ZXIgd2FzICphZGRlZCogaW4KLy8vIHRoYXQgdmVyc2lvbi4KLy8vCi8vLyBXaGVuIGFwcGxpZWQgdG8gYSBsaWJyYXJ5IGRlY2xhcmF0aW9uLCBpdCBhbHNvIGEgYXBwbGllcyB0bwovLy8gYWxsIG1lbWJlcnMgZGVjbGFyZWQgb3IgZXhwb3J0ZWQgYnkgdGhhdCBsaWJyYXJ5LgovLy8gSWYgYXBwbGllZCB0byBhIGNsYXNzLCBpdCBhbHNvIGFwcGxpZXMgdG8gYWxsIG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycwovLy8gb2YgdGhhdCBjbGFzcy4KLy8vIElmIGFwcGxpZWQgdG8gYSBjbGFzcyBtZXRob2QsIG9yIHBhcmFtZXRlciBvZiBzdWNoLAovLy8gYW55IG1ldGhvZCBpbXBsZW1lbnRpbmcgdGhhdCBpbnRlcmZhY2UgbWV0aG9kIGlzIGFsc28gYW5ub3RhdGVkLgovLy8gSSBtdWx0aXBsZSBgU2luY2VgIGFubm90YXRpb25zIGFwcGx5IHRvIHRoZSBzYW1lIGRlY2xhcmF0aW9uIG9yCi8vLyBwYXJhbWV0ZXIsIHRoZSBsYXRlc3QgdmVyc2lvbiB0YWtlcyBwcmVjZW5kZW5jZS4KLy8vCi8vLyBBbnkgdXNlIG9mIGEgbWFya2VkIEFQSSBtYXkgdHJpZ2dlciBhIHdhcm5pbmcgaWYgdGhlIHVzaW5nIGNvZGUKLy8vIGRvZXMgbm90IHJlcXVpcmUgYW4gU0RLIHZlcnNpb24gZ3VhcmFudGVlaW5nIHRoYXQgdGhlIEFQSSBpcyBhdmFpbGFibGUsCi8vLyB1bmxlc3MgdGhlIEFQSSBmZWF0dXJlIGlzIGFsc28gcHJvdmlkZWQgYnkgc29tZXRoaW5nIGVsc2UuCi8vLyBJdCBpcyBvbmx5IGEgcHJvYmxlbSBpZiBhbiBhbm5vdGF0ZWQgZmVhdHVyZSBpcyB1c2VkLCBhbmQgdGhlIGFubm90YXRlZAovLy8gQVBJIGlzIHRoZSAqb25seSogdGhpbmcgcHJvdmlkaW5nIHRoZSBmdW5jdGlvbmFsaXR5LgovLy8gRm9yIGV4YW1wbGUsIHVzaW5nIGBGdXR1cmVgIGV4cG9ydGVkIGJ5IGBkYXJ0OmNvcmVgIGlzIG5vdCBhIHByb2JsZW0KLy8vIGlmIHRoZSBzYW1lIGxpYnJhcnkgYWxzbyBpbXBvcnRzIGBkYXJ0OmFzeW5jYCwgYW5kIHVzaW5nIGFuIG9wdGlvbmFsCi8vLyBwYXJhbWV0ZXIgb24gYW4gaW50ZXJmYWNlIGlzIG5vdCBhIHByb2JsZW0gaWYgdGhlIHNhbWUgdHlwZSBhbHNvCi8vLyBpbXBsZW1lbnRzIGFub3RoZXIgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgc2FtZSBwYXJhbWV0ZXIuCi8vLwovLy8gVGhlIHZlcnNpb24gbXVzdCBiZSBhIHNlbWFudGljIHZlcnNpb24gKGxpa2UgYDEuNC4yYCBvciBgMC45LjQtcmVjLjRgKSwKLy8vIG9yIHRoZSBmaXJzdCB0d28gbnVtYmVycyBvZiBhIHNlbWFudGljIHZlcnNpb24gKGxpa2UgYDEuMGAgb3IgYDIuMmApLAovLy8gcmVwcmVzZW50aW5nIGEgc3RhYmxlIHJlbGVhc2UsIGFuZCBlcXVpdmFsZW50IHRvIHRoZSBzZW1hbnRpYyB2ZXJzaW9uCi8vLyB5b3UgZ2V0IGJ5IGFwcGVuZGluZyBhIGAuMGAuCkBTaW5jZSgiMi4yIikKY2xhc3MgU2luY2UgewogIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwogIGNvbnN0IFNpbmNlKHRoaXMudmVyc2lvbik7Cn0KCi8qKgogKiBIVFRQIHN0YXR1cyBjb2Rlcy4gIEV4cG9ydGVkIGluIGRhcnQ6aW8gYW5kIGRhcnQ6aHRtbC4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBTdGF0dXMgewogIHN0YXRpYyBjb25zdCBpbnQgY29udGludWVfID0gMTAwOwogIHN0YXRpYyBjb25zdCBpbnQgc3dpdGNoaW5nUHJvdG9jb2xzID0gMTAxOwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHByb2Nlc3NpbmcgPSAxMDI7CiAgc3RhdGljIGNvbnN0IGludCBvayA9IDIwMDsKICBzdGF0aWMgY29uc3QgaW50IGNyZWF0ZWQgPSAyMDE7CiAgc3RhdGljIGNvbnN0IGludCBhY2NlcHRlZCA9IDIwMjsKICBzdGF0aWMgY29uc3QgaW50IG5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbiA9IDIwMzsKICBzdGF0aWMgY29uc3QgaW50IG5vQ29udGVudCA9IDIwNDsKICBzdGF0aWMgY29uc3QgaW50IHJlc2V0Q29udGVudCA9IDIwNTsKICBzdGF0aWMgY29uc3QgaW50IHBhcnRpYWxDb250ZW50ID0gMjA2OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG11bHRpU3RhdHVzID0gMjA3OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGFscmVhZHlSZXBvcnRlZCA9IDIwODsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBpbVVzZWQgPSAyMjY7CiAgc3RhdGljIGNvbnN0IGludCBtdWx0aXBsZUNob2ljZXMgPSAzMDA7CiAgc3RhdGljIGNvbnN0IGludCBtb3ZlZFBlcm1hbmVudGx5ID0gMzAxOwogIHN0YXRpYyBjb25zdCBpbnQgZm91bmQgPSAzMDI7CiAgc3RhdGljIGNvbnN0IGludCBtb3ZlZFRlbXBvcmFyaWx5ID0gMzAyOyAvLyBDb21tb24gYWxpYXMgZm9yIGZvdW5kLgogIHN0YXRpYyBjb25zdCBpbnQgc2VlT3RoZXIgPSAzMDM7CiAgc3RhdGljIGNvbnN0IGludCBub3RNb2RpZmllZCA9IDMwNDsKICBzdGF0aWMgY29uc3QgaW50IHVzZVByb3h5ID0gMzA1OwogIHN0YXRpYyBjb25zdCBpbnQgdGVtcG9yYXJ5UmVkaXJlY3QgPSAzMDc7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgcGVybWFuZW50UmVkaXJlY3QgPSAzMDg7CiAgc3RhdGljIGNvbnN0IGludCBiYWRSZXF1ZXN0ID0gNDAwOwogIHN0YXRpYyBjb25zdCBpbnQgdW5hdXRob3JpemVkID0gNDAxOwogIHN0YXRpYyBjb25zdCBpbnQgcGF5bWVudFJlcXVpcmVkID0gNDAyOwogIHN0YXRpYyBjb25zdCBpbnQgZm9yYmlkZGVuID0gNDAzOwogIHN0YXRpYyBjb25zdCBpbnQgbm90Rm91bmQgPSA0MDQ7CiAgc3RhdGljIGNvbnN0IGludCBtZXRob2ROb3RBbGxvd2VkID0gNDA1OwogIHN0YXRpYyBjb25zdCBpbnQgbm90QWNjZXB0YWJsZSA9IDQwNjsKICBzdGF0aWMgY29uc3QgaW50IHByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCA9IDQwNzsKICBzdGF0aWMgY29uc3QgaW50IHJlcXVlc3RUaW1lb3V0ID0gNDA4OwogIHN0YXRpYyBjb25zdCBpbnQgY29uZmxpY3QgPSA0MDk7CiAgc3RhdGljIGNvbnN0IGludCBnb25lID0gNDEwOwogIHN0YXRpYyBjb25zdCBpbnQgbGVuZ3RoUmVxdWlyZWQgPSA0MTE7CiAgc3RhdGljIGNvbnN0IGludCBwcmVjb25kaXRpb25GYWlsZWQgPSA0MTI7CiAgc3RhdGljIGNvbnN0IGludCByZXF1ZXN0RW50aXR5VG9vTGFyZ2UgPSA0MTM7CiAgc3RhdGljIGNvbnN0IGludCByZXF1ZXN0VXJpVG9vTG9uZyA9IDQxNDsKICBzdGF0aWMgY29uc3QgaW50IHVuc3VwcG9ydGVkTWVkaWFUeXBlID0gNDE1OwogIHN0YXRpYyBjb25zdCBpbnQgcmVxdWVzdGVkUmFuZ2VOb3RTYXRpc2ZpYWJsZSA9IDQxNjsKICBzdGF0aWMgY29uc3QgaW50IGV4cGVjdGF0aW9uRmFpbGVkID0gNDE3OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG1pc2RpcmVjdGVkUmVxdWVzdCA9IDQyMTsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCB1bnByb2Nlc3NhYmxlRW50aXR5ID0gNDIyOwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGxvY2tlZCA9IDQyMzsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBmYWlsZWREZXBlbmRlbmN5ID0gNDI0OwogIHN0YXRpYyBjb25zdCBpbnQgdXBncmFkZVJlcXVpcmVkID0gNDI2OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHByZWNvbmRpdGlvblJlcXVpcmVkID0gNDI4OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IHRvb01hbnlSZXF1ZXN0cyA9IDQyOTsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCByZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2UgPSA0MzE7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgY29ubmVjdGlvbkNsb3NlZFdpdGhvdXRSZXNwb25zZSA9IDQ0NDsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCB1bmF2YWlsYWJsZUZvckxlZ2FsUmVhc29ucyA9IDQ1MTsKICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIGNvbnN0IGludCBjbGllbnRDbG9zZWRSZXF1ZXN0ID0gNDk5OwogIHN0YXRpYyBjb25zdCBpbnQgaW50ZXJuYWxTZXJ2ZXJFcnJvciA9IDUwMDsKICBzdGF0aWMgY29uc3QgaW50IG5vdEltcGxlbWVudGVkID0gNTAxOwogIHN0YXRpYyBjb25zdCBpbnQgYmFkR2F0ZXdheSA9IDUwMjsKICBzdGF0aWMgY29uc3QgaW50IHNlcnZpY2VVbmF2YWlsYWJsZSA9IDUwMzsKICBzdGF0aWMgY29uc3QgaW50IGdhdGV3YXlUaW1lb3V0ID0gNTA0OwogIHN0YXRpYyBjb25zdCBpbnQgaHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQgPSA1MDU7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgdmFyaWFudEFsc29OZWdvdGlhdGVzID0gNTA2OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IGluc3VmZmljaWVudFN0b3JhZ2UgPSA1MDc7CiAgQFNpbmNlKCIyLjEiKQogIHN0YXRpYyBjb25zdCBpbnQgbG9vcERldGVjdGVkID0gNTA4OwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG5vdEV4dGVuZGVkID0gNTEwOwogIEBTaW5jZSgiMi4xIikKICBzdGF0aWMgY29uc3QgaW50IG5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkID0gNTExOwogIC8vIENsaWVudCBnZW5lcmF0ZWQgc3RhdHVzIGNvZGUuCiAgc3RhdGljIGNvbnN0IGludCBuZXR3b3JrQ29ubmVjdFRpbWVvdXRFcnJvciA9IDU5OTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBjb250aW51ZV8gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBDT05USU5VRSA9IGNvbnRpbnVlXzsKICBARGVwcmVjYXRlZCgiVXNlIHN3aXRjaGluZ1Byb3RvY29scyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFNXSVRDSElOR19QUk9UT0NPTFMgPSBzd2l0Y2hpbmdQcm90b2NvbHM7CiAgQERlcHJlY2F0ZWQoIlVzZSBvayBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE9LID0gb2s7CiAgQERlcHJlY2F0ZWQoIlVzZSBjcmVhdGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQ1JFQVRFRCA9IGNyZWF0ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBhY2NlcHRlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEFDQ0VQVEVEID0gYWNjZXB0ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBub25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTiA9IG5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjsKICBARGVwcmVjYXRlZCgiVXNlIG5vQ29udGVudCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PX0NPTlRFTlQgPSBub0NvbnRlbnQ7CiAgQERlcHJlY2F0ZWQoIlVzZSByZXNldENvbnRlbnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBSRVNFVF9DT05URU5UID0gcmVzZXRDb250ZW50OwogIEBEZXByZWNhdGVkKCJVc2UgcGFydGlhbENvbnRlbnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBQQVJUSUFMX0NPTlRFTlQgPSBwYXJ0aWFsQ29udGVudDsKICBARGVwcmVjYXRlZCgiVXNlIG11bHRpcGxlQ2hvaWNlcyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1VTFRJUExFX0NIT0lDRVMgPSBtdWx0aXBsZUNob2ljZXM7CiAgQERlcHJlY2F0ZWQoIlVzZSBtb3ZlZFBlcm1hbmVudGx5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTU9WRURfUEVSTUFORU5UTFkgPSBtb3ZlZFBlcm1hbmVudGx5OwogIEBEZXByZWNhdGVkKCJVc2UgZm91bmQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBGT1VORCA9IGZvdW5kOwogIEBEZXByZWNhdGVkKCJVc2UgbW92ZWRUZW1wb3JhcmlseSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE1PVkVEX1RFTVBPUkFSSUxZID0gbW92ZWRUZW1wb3JhcmlseTsKICBARGVwcmVjYXRlZCgiVXNlIHNlZU90aGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU0VFX09USEVSID0gc2VlT3RoZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBub3RNb2RpZmllZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5PVF9NT0RJRklFRCA9IG5vdE1vZGlmaWVkOwogIEBEZXByZWNhdGVkKCJVc2UgdXNlUHJveHkgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBVU0VfUFJPWFkgPSB1c2VQcm94eTsKICBARGVwcmVjYXRlZCgiVXNlIHRlbXBvcmFyeVJlZGlyZWN0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVEVNUE9SQVJZX1JFRElSRUNUID0gdGVtcG9yYXJ5UmVkaXJlY3Q7CiAgQERlcHJlY2F0ZWQoIlVzZSBiYWRSZXF1ZXN0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQkFEX1JFUVVFU1QgPSBiYWRSZXF1ZXN0OwogIEBEZXByZWNhdGVkKCJVc2UgdW5hdXRob3JpemVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVU5BVVRIT1JJWkVEID0gdW5hdXRob3JpemVkOwogIEBEZXByZWNhdGVkKCJVc2UgcGF5bWVudFJlcXVpcmVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUEFZTUVOVF9SRVFVSVJFRCA9IHBheW1lbnRSZXF1aXJlZDsKICBARGVwcmVjYXRlZCgiVXNlIGZvcmJpZGRlbiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEZPUkJJRERFTiA9IGZvcmJpZGRlbjsKICBARGVwcmVjYXRlZCgiVXNlIG5vdEZvdW5kIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9UX0ZPVU5EID0gbm90Rm91bmQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBtZXRob2ROb3RBbGxvd2VkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTUVUSE9EX05PVF9BTExPV0VEID0gbWV0aG9kTm90QWxsb3dlZDsKICBARGVwcmVjYXRlZCgiVXNlIG5vdEFjY2VwdGFibGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBOT1RfQUNDRVBUQUJMRSA9IG5vdEFjY2VwdGFibGU7CiAgQERlcHJlY2F0ZWQoIlVzZSBwcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA9IHByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDsKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RUaW1lb3V0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9USU1FT1VUID0gcmVxdWVzdFRpbWVvdXQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb25mbGljdCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IENPTkZMSUNUID0gY29uZmxpY3Q7CiAgQERlcHJlY2F0ZWQoIlVzZSBnb25lIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgR09ORSA9IGdvbmU7CiAgQERlcHJlY2F0ZWQoIlVzZSBsZW5ndGhSZXF1aXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IExFTkdUSF9SRVFVSVJFRCA9IGxlbmd0aFJlcXVpcmVkOwogIEBEZXByZWNhdGVkKCJVc2UgcHJlY29uZGl0aW9uRmFpbGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUFJFQ09ORElUSU9OX0ZBSUxFRCA9IHByZWNvbmRpdGlvbkZhaWxlZDsKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RFbnRpdHlUb29MYXJnZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RfRU5USVRZX1RPT19MQVJHRSA9IHJlcXVlc3RFbnRpdHlUb29MYXJnZTsKICBARGVwcmVjYXRlZCgiVXNlIHJlcXVlc3RVcmlUb29Mb25nIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9VUklfVE9PX0xPTkcgPSByZXF1ZXN0VXJpVG9vTG9uZzsKICBARGVwcmVjYXRlZCgiVXNlIHVuc3VwcG9ydGVkTWVkaWFUeXBlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgVU5TVVBQT1JURURfTUVESUFfVFlQRSA9IHVuc3VwcG9ydGVkTWVkaWFUeXBlOwogIEBEZXByZWNhdGVkKCJVc2UgcmVxdWVzdGVkUmFuZ2VOb3RTYXRpc2ZpYWJsZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFJFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUgPQogICAgICByZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlOwogIEBEZXByZWNhdGVkKCJVc2UgZXhwZWN0YXRpb25GYWlsZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBFWFBFQ1RBVElPTl9GQUlMRUQgPSBleHBlY3RhdGlvbkZhaWxlZDsKICBARGVwcmVjYXRlZCgiVXNlIHVwZ3JhZGVSZXF1aXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IFVQR1JBREVfUkVRVUlSRUQgPSB1cGdyYWRlUmVxdWlyZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBpbnRlcm5hbFNlcnZlckVycm9yIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gaW50ZXJuYWxTZXJ2ZXJFcnJvcjsKICBARGVwcmVjYXRlZCgiVXNlIG5vdEltcGxlbWVudGVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gbm90SW1wbGVtZW50ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBiYWRHYXRld2F5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQkFEX0dBVEVXQVkgPSBiYWRHYXRld2F5OwogIEBEZXByZWNhdGVkKCJVc2Ugc2VydmljZVVuYXZhaWxhYmxlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgU0VSVklDRV9VTkFWQUlMQUJMRSA9IHNlcnZpY2VVbmF2YWlsYWJsZTsKICBARGVwcmVjYXRlZCgiVXNlIGdhdGV3YXlUaW1lb3V0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgR0FURVdBWV9USU1FT1VUID0gZ2F0ZXdheVRpbWVvdXQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBodHRwVmVyc2lvbk5vdFN1cHBvcnRlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEID0gaHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBuZXR3b3JrQ29ubmVjdFRpbWVvdXRFcnJvciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgaW50IE5FVFdPUktfQ09OTkVDVF9USU1FT1VUX0VSUk9SID0gbmV0d29ya0Nvbm5lY3RUaW1lb3V0RXJyb3I7Cn0KgYAATk48ARgBGgEUCRAQHBsfDiYgHCABGBIWEhMSFBkBOksbHgwICQoLEQ0ODxAXEhMUFRwXGBkaIRwdAwEESAQ0NBgBGwEkMwE0AgFPFQRPLARKHhUVIQIBIQEsBEgeJxsWFh0gHjwNAgEnBDotJjg8MAIBT0tMJQQNBAwXBEcnBDYlMAgETUYEDBISBCwEDRc5KgQ5LQYIBBcEJD0oTysEED8MBCUyRwFCBEI+GwRFEgRANksTOEVENQRETD9MOUlJRT8ETEpKIQ4OGB0CAQQ6BBwkLRAlHSIjNiQnKRAmECoQISorIEYjJiMsECwlJyokIysoNikjHyktMCwvNywQLRAuECEQKyoQLxAqEDYQOhA1EC4uKSUtKTIQMBAuECcQJhA4IzUBJykwPSAcJSYmKDlQJysqMSw1LTcuOSMiLjkmKSkvJikvOygtKjAtNycqJikuOiszOVAsNSYoIiAsNTA9M0UvPTJCOjUkLzstNzFALDUoLTA9LDU1SThPAgEOZGFydDpfaW50ZXJuYWwyb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL2l0ZXJhYmxlLmRhcnTAAF5VLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faW50ZXJuYWw7CgovKioKICogTWFya2VyIGludGVyZmFjZSBmb3IgW0l0ZXJhYmxlXSBzdWJjbGFzc2VzIHRoYXQgaGF2ZSBhbiBlZmZpY2llbnQKICogW2xlbmd0aF0gaW1wbGVtZW50YXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxUPiBleHRlbmRzIEl0ZXJhYmxlPFQ+IHsKICBjb25zdCBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSgpOwogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuCiAgICoKICAgKiBUaGlzIGlzIGFuIGVmZmljaWVudCBvcGVyYXRpb24gdGhhdCBkb2Vzbid0IHJlcXVpcmUgaXRlcmF0aW5nIHRocm91Z2gKICAgKiB0aGUgZWxlbWVudHMuCiAgICovCiAgaW50IGdldCBsZW5ndGg7Cn0KCi8qKgogKiBBbiBbSXRlcmFibGVdIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSBlZmZpY2llbnQgW2xlbmd0aF0gYW5kIFtlbGVtZW50QXRdLgogKgogKiBBbGwgb3RoZXIgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgW2xlbmd0aF0gYW5kIFtlbGVtZW50QXRdLAogKiBpbmNsdWRpbmcgW2l0ZXJhdG9yXS4KICovCmFic3RyYWN0IGNsYXNzIExpc3RJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBpbnQgZ2V0IGxlbmd0aDsKICBFIGVsZW1lbnRBdChpbnQgaSk7CgogIGNvbnN0IExpc3RJdGVyYWJsZSgpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gbmV3IExpc3RJdGVyYXRvcjxFPih0aGlzKTsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgYWN0aW9uKEUgZWxlbWVudCkpIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aW9uKGVsZW1lbnRBdChpKSk7CiAgICAgIGlmIChsZW5ndGggIT0gdGhpcy5sZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgcmV0dXJuIGVsZW1lbnRBdCgwKTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHJldHVybiBlbGVtZW50QXQobGVuZ3RoIC0gMSk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIGlmIChsZW5ndGggPiAxKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICByZXR1cm4gZWxlbWVudEF0KDApOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoZWxlbWVudEF0KGkpID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgYm9vbCBldmVyeShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoIXRlc3QoZWxlbWVudEF0KGkpKSkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdChlbGVtZW50QXQoaSkpKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEUgZWxlbWVudCA9IGVsZW1lbnRBdChpKTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgbGFzdFdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBFIGVsZW1lbnQgPSBlbGVtZW50QXQoaSk7CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpLCB7RSBvckVsc2UoKX0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIEUgbWF0Y2ggPSBudWxsOwogICAgYm9vbCBtYXRjaEZvdW5kID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEUgZWxlbWVudCA9IGVsZW1lbnRBdChpKTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAobWF0Y2hGb3VuZCkgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTsKICAgICAgICBtYXRjaCA9IGVsZW1lbnQ7CiAgICAgIH0KICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXRjaEZvdW5kKSByZXR1cm4gbWF0Y2g7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgU3RyaW5nIGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmICghc2VwYXJhdG9yLmlzRW1wdHkpIHsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gIiI7CiAgICAgIFN0cmluZyBmaXJzdCA9ICIke2VsZW1lbnRBdCgwKX0iOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmaXJzdCk7CiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICBidWZmZXIud3JpdGUoZWxlbWVudEF0KGkpKTsKICAgICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgICB9IGVsc2UgewogICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgYnVmZmVyLndyaXRlKGVsZW1lbnRBdChpKSk7CiAgICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgfQogIH0KCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHN1cGVyLndoZXJlKHRlc3QpOwoKICBJdGVyYWJsZTxUPiBtYXA8VD4oVCBmKEUgZWxlbWVudCkpID0+IG5ldyBNYXBwZWRMaXN0SXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIEUgcmVkdWNlKEUgY29tYmluZShFIHZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgRSB2YWx1ZSA9IGVsZW1lbnRBdCgwKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCBlbGVtZW50QXQoaSkpOwogICAgICBpZiAobGVuZ3RoICE9IHRoaXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICB2YXIgdmFsdWUgPSBpbml0aWFsVmFsdWU7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudEF0KGkpKTsKICAgICAgaWYgKGxlbmd0aCAhPSB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIGNvdW50LCBudWxsKTsKCiAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzdXBlci5za2lwV2hpbGUodGVzdCk7CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IGNvdW50KSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KHRoaXMsIDAsIGNvdW50KTsKCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzdXBlci50YWtlV2hpbGUodGVzdCk7CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgTGlzdDxFPiByZXN1bHQ7CiAgICBpZiAoZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBMaXN0PEU+KGxlbmd0aCk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdFtpXSA9IGVsZW1lbnRBdChpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBTZXQ8RT4gdG9TZXQoKSB7CiAgICBTZXQ8RT4gcmVzdWx0ID0gbmV3IFNldDxFPigpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHQuYWRkKGVsZW1lbnRBdChpKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKY2xhc3MgU3ViTGlzdEl0ZXJhYmxlPEU+IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfaXRlcmFibGU7IC8vIEhhcyBlZmZpY2llbnQgbGVuZ3RoIGFuZCBlbGVtZW50QXQuCiAgZmluYWwgaW50IF9zdGFydDsKICAvKiogSWYgbnVsbCwgcmVwcmVzZW50cyB0aGUgbGVuZ3RoIG9mIHRoZSBpdGVyYWJsZS4gKi8KICBmaW5hbCBpbnQgX2VuZE9yTGVuZ3RoOwoKICBTdWJMaXN0SXRlcmFibGUodGhpcy5faXRlcmFibGUsIHRoaXMuX3N0YXJ0LCB0aGlzLl9lbmRPckxlbmd0aCkgewogICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKF9zdGFydCwgInN0YXJ0Iik7CiAgICBpZiAoX2VuZE9yTGVuZ3RoICE9IG51bGwpIHsKICAgICAgUmFuZ2VFcnJvci5jaGVja05vdE5lZ2F0aXZlKF9lbmRPckxlbmd0aCwgImVuZCIpOwogICAgICBpZiAoX3N0YXJ0ID4gX2VuZE9yTGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoX3N0YXJ0LCAwLCBfZW5kT3JMZW5ndGgsICJzdGFydCIpOwogICAgICB9CiAgICB9CiAgfQoKICBpbnQgZ2V0IF9lbmRJbmRleCB7CiAgICBpbnQgbGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChfZW5kT3JMZW5ndGggPT0gbnVsbCB8fCBfZW5kT3JMZW5ndGggPiBsZW5ndGgpIHJldHVybiBsZW5ndGg7CiAgICByZXR1cm4gX2VuZE9yTGVuZ3RoOwogIH0KCiAgaW50IGdldCBfc3RhcnRJbmRleCB7CiAgICBpbnQgbGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChfc3RhcnQgPiBsZW5ndGgpIHJldHVybiBsZW5ndGg7CiAgICByZXR1cm4gX3N0YXJ0OwogIH0KCiAgaW50IGdldCBsZW5ndGggewogICAgaW50IGxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoX3N0YXJ0ID49IGxlbmd0aCkgcmV0dXJuIDA7CiAgICBpZiAoX2VuZE9yTGVuZ3RoID09IG51bGwgfHwgX2VuZE9yTGVuZ3RoID49IGxlbmd0aCkgewogICAgICByZXR1cm4gbGVuZ3RoIC0gX3N0YXJ0OwogICAgfQogICAgcmV0dXJuIF9lbmRPckxlbmd0aCAtIF9zdGFydDsKICB9CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgaW50IHJlYWxJbmRleCA9IF9zdGFydEluZGV4ICsgaW5kZXg7CiAgICBpZiAoaW5kZXggPCAwIHx8IHJlYWxJbmRleCA+PSBfZW5kSW5kZXgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9pdGVyYWJsZS5lbGVtZW50QXQocmVhbEluZGV4KTsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXAoaW50IGNvdW50KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogICAgaW50IG5ld1N0YXJ0ID0gX3N0YXJ0ICsgY291bnQ7CiAgICBpZiAoX2VuZE9yTGVuZ3RoICE9IG51bGwgJiYgbmV3U3RhcnQgPj0gX2VuZE9yTGVuZ3RoKSB7CiAgICAgIHJldHVybiBuZXcgRW1wdHlJdGVyYWJsZTxFPigpOwogICAgfQogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8RT4oX2l0ZXJhYmxlLCBuZXdTdGFydCwgX2VuZE9yTGVuZ3RoKTsKICB9CgogIEl0ZXJhYmxlPEU+IHRha2UoaW50IGNvdW50KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogICAgaWYgKF9lbmRPckxlbmd0aCA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEU+KF9pdGVyYWJsZSwgX3N0YXJ0LCBfc3RhcnQgKyBjb3VudCk7CiAgICB9IGVsc2UgewogICAgICBpbnQgbmV3RW5kID0gX3N0YXJ0ICsgY291bnQ7CiAgICAgIGlmIChfZW5kT3JMZW5ndGggPCBuZXdFbmQpIHJldHVybiB0aGlzOwogICAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxFPihfaXRlcmFibGUsIF9zdGFydCwgbmV3RW5kKTsKICAgIH0KICB9CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgaW50IHN0YXJ0ID0gX3N0YXJ0OwogICAgaW50IGVuZCA9IF9pdGVyYWJsZS5sZW5ndGg7CiAgICBpZiAoX2VuZE9yTGVuZ3RoICE9IG51bGwgJiYgX2VuZE9yTGVuZ3RoIDwgZW5kKSBlbmQgPSBfZW5kT3JMZW5ndGg7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoIDwgMCkgbGVuZ3RoID0gMDsKICAgIExpc3Q8RT4gcmVzdWx0ID0KICAgICAgICBncm93YWJsZSA/IChuZXcgTGlzdDxFPigpLi5sZW5ndGggPSBsZW5ndGgpIDogbmV3IExpc3Q8RT4obGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gX2l0ZXJhYmxlLmVsZW1lbnRBdChzdGFydCArIGkpOwogICAgICBpZiAoX2l0ZXJhYmxlLmxlbmd0aCA8IGVuZCkgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovKioKICogQW4gW0l0ZXJhdG9yXSB0aGF0IGl0ZXJhdGVzIGEgbGlzdC1saWtlIFtJdGVyYWJsZV0uCiAqCiAqIEFsbCBpdGVyYXRpb25zIGlzIGRvbmUgaW4gdGVybXMgb2YgW0l0ZXJhYmxlLmxlbmd0aF0gYW5kCiAqIFtJdGVyYWJsZS5lbGVtZW50QXRdLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBmYXN0IGZvciBsaXN0LWxpa2UKICogaXRlcmFibGVzLgogKi8KY2xhc3MgTGlzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhYmxlPEU+IF9pdGVyYWJsZTsKICBmaW5hbCBpbnQgX2xlbmd0aDsKICBpbnQgX2luZGV4OwogIEUgX2N1cnJlbnQ7CgogIExpc3RJdGVyYXRvcihJdGVyYWJsZTxFPiBpdGVyYWJsZSkKICAgICAgOiBfaXRlcmFibGUgPSBpdGVyYWJsZSwKICAgICAgICBfbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoLAogICAgICAgIF9pbmRleCA9IDA7CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpbnQgbGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChfbGVuZ3RoICE9IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKF9pdGVyYWJsZSk7CiAgICB9CiAgICBpZiAoX2luZGV4ID49IGxlbmd0aCkgewogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9jdXJyZW50ID0gX2l0ZXJhYmxlLmVsZW1lbnRBdChfaW5kZXgpOwogICAgX2luZGV4Kys7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KCnR5cGVkZWYgVCBfVHJhbnNmb3JtYXRpb248UywgVD4oUyB2YWx1ZSk7CgpjbGFzcyBNYXBwZWRJdGVyYWJsZTxTLCBUPiBleHRlbmRzIEl0ZXJhYmxlPFQ+IHsKICBmaW5hbCBJdGVyYWJsZTxTPiBfaXRlcmFibGU7CiAgZmluYWwgX1RyYW5zZm9ybWF0aW9uPFMsIFQ+IF9mOwoKICBmYWN0b3J5IE1hcHBlZEl0ZXJhYmxlKEl0ZXJhYmxlPFM+IGl0ZXJhYmxlLCBUIGZ1bmN0aW9uKFMgdmFsdWUpKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZTxTLCBUPihpdGVyYWJsZSwgZnVuY3Rpb24pOwogICAgfQogICAgcmV0dXJuIG5ldyBNYXBwZWRJdGVyYWJsZTxTLCBUPi5fKGl0ZXJhYmxlLCBmdW5jdGlvbik7CiAgfQoKICBNYXBwZWRJdGVyYWJsZS5fKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9mKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBNYXBwZWRJdGVyYXRvcjxTLCBUPihfaXRlcmFibGUuaXRlcmF0b3IsIF9mKTsKCiAgLy8gTGVuZ3RoIHJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgbWFwcGluZy4KICBpbnQgZ2V0IGxlbmd0aCA9PiBfaXRlcmFibGUubGVuZ3RoOwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gX2l0ZXJhYmxlLmlzRW1wdHk7CgogIC8vIEluZGV4IGJhc2VkIGxvb2t1cCBjYW4gYmUgZG9uZSBiZWZvcmUgdHJhbnNmb3JtaW5nLgogIFQgZ2V0IGZpcnN0ID0+IF9mKF9pdGVyYWJsZS5maXJzdCk7CiAgVCBnZXQgbGFzdCA9PiBfZihfaXRlcmFibGUubGFzdCk7CiAgVCBnZXQgc2luZ2xlID0+IF9mKF9pdGVyYWJsZS5zaW5nbGUpOwogIFQgZWxlbWVudEF0KGludCBpbmRleCkgPT4gX2YoX2l0ZXJhYmxlLmVsZW1lbnRBdChpbmRleCkpOwp9CgpjbGFzcyBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZTxTLCBUPiBleHRlbmRzIE1hcHBlZEl0ZXJhYmxlPFMsIFQ+CiAgICBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPFQ+IHsKICBFZmZpY2llbnRMZW5ndGhNYXBwZWRJdGVyYWJsZShJdGVyYWJsZTxTPiBpdGVyYWJsZSwgVCBmdW5jdGlvbihTIHZhbHVlKSkKICAgICAgOiBzdXBlci5fKGl0ZXJhYmxlLCBmdW5jdGlvbik7Cn0KCmNsYXNzIE1hcHBlZEl0ZXJhdG9yPFMsIFQ+IGV4dGVuZHMgSXRlcmF0b3I8VD4gewogIFQgX2N1cnJlbnQ7CiAgZmluYWwgSXRlcmF0b3I8Uz4gX2l0ZXJhdG9yOwogIGZpbmFsIF9UcmFuc2Zvcm1hdGlvbjxTLCBUPiBfZjsKCiAgTWFwcGVkSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9pdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIF9jdXJyZW50ID0gX2YoX2l0ZXJhdG9yLmN1cnJlbnQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIFQgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCi8qKgogKiBTcGVjaWFsaXplZCBhbHRlcm5hdGl2ZSB0byBbTWFwcGVkSXRlcmFibGVdIGZvciBtYXBwZWQgW0xpc3Rdcy4KICoKICogRXhwZWN0cyBlZmZpY2llbnQgYGxlbmd0aGAgYW5kIGBlbGVtZW50QXRgIG9uIHRoZSBzb3VyY2UgaXRlcmFibGUuCiAqLwpjbGFzcyBNYXBwZWRMaXN0SXRlcmFibGU8UywgVD4gZXh0ZW5kcyBMaXN0SXRlcmFibGU8VD4gewogIGZpbmFsIEl0ZXJhYmxlPFM+IF9zb3VyY2U7CiAgZmluYWwgX1RyYW5zZm9ybWF0aW9uPFMsIFQ+IF9mOwoKICBNYXBwZWRMaXN0SXRlcmFibGUodGhpcy5fc291cmNlLCB0aGlzLl9mKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX3NvdXJjZS5sZW5ndGg7CiAgVCBlbGVtZW50QXQoaW50IGluZGV4KSA9PiBfZihfc291cmNlLmVsZW1lbnRBdChpbmRleCkpOwp9Cgp0eXBlZGVmIGJvb2wgX0VsZW1lbnRQcmVkaWNhdGU8RT4oRSBlbGVtZW50KTsKCmNsYXNzIFdoZXJlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwoKICBXaGVyZUl0ZXJhYmxlKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9mKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBXaGVyZUl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX2YpOwoKICAvLyBTcGVjaWFsaXphdGlvbiBvZiBbSXRlcmFibGUubWFwXSB0byBub24tRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUuCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihFIGVsZW1lbnQpKSA9PiBuZXcgTWFwcGVkSXRlcmFibGU8RSwgVD4uXyh0aGlzLCBmKTsKfQoKY2xhc3MgV2hlcmVJdGVyYXRvcjxFPiBleHRlbmRzIEl0ZXJhdG9yPEU+IHsKICBmaW5hbCBJdGVyYXRvcjxFPiBfaXRlcmF0b3I7CiAgZmluYWwgX0VsZW1lbnRQcmVkaWNhdGU8RT4gX2Y7CgogIFdoZXJlSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgd2hpbGUgKF9pdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIGlmIChfZihfaXRlcmF0b3IuY3VycmVudCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfaXRlcmF0b3IuY3VycmVudDsKfQoKdHlwZWRlZiBJdGVyYWJsZTxUPiBfRXhwYW5kRnVuY3Rpb248UywgVD4oUyBzb3VyY2VFbGVtZW50KTsKCmNsYXNzIEV4cGFuZEl0ZXJhYmxlPFMsIFQ+IGV4dGVuZHMgSXRlcmFibGU8VD4gewogIGZpbmFsIEl0ZXJhYmxlPFM+IF9pdGVyYWJsZTsKICBmaW5hbCBfRXhwYW5kRnVuY3Rpb248UywgVD4gX2Y7CgogIEV4cGFuZEl0ZXJhYmxlKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9mKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBFeHBhbmRJdGVyYXRvcjxTLCBUPihfaXRlcmFibGUuaXRlcmF0b3IsIF9mKTsKfQoKY2xhc3MgRXhwYW5kSXRlcmF0b3I8UywgVD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CiAgZmluYWwgSXRlcmF0b3I8Uz4gX2l0ZXJhdG9yOwogIGZpbmFsIF9FeHBhbmRGdW5jdGlvbjxTLCBUPiBfZjsKICAvLyBJbml0aWFsaXplIF9jdXJyZW50RXhwYW5zaW9uIHRvIGFuIGVtcHR5IGl0ZXJhYmxlLiBBIG51bGwgdmFsdWUKICAvLyBtYXJrcyB0aGUgZW5kIG9mIGl0ZXJhdGlvbiwgYW5kIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBfZiBiZWZvcmUKICAvLyB0aGUgZmlyc3QgbW92ZU5leHQgY2FsbC4KICBJdGVyYXRvcjxUPiBfY3VycmVudEV4cGFuc2lvbiA9IGNvbnN0IEVtcHR5SXRlcmF0b3IoKTsKICBUIF9jdXJyZW50OwoKICBFeHBhbmRJdGVyYXRvcih0aGlzLl9pdGVyYXRvciwgdGhpcy5fZik7CgogIFQgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX2N1cnJlbnRFeHBhbnNpb24gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgd2hpbGUgKCFfY3VycmVudEV4cGFuc2lvbi5tb3ZlTmV4dCgpKSB7CiAgICAgIF9jdXJyZW50ID0gbnVsbDsKICAgICAgaWYgKF9pdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgLy8gSWYgX2YgdGhyb3dzLCB0aGlzIGVuZHMgaXRlcmF0aW9uLiBPdGhlcndpc2UgX2N1cnJlbnRFeHBhbnNpb24gYW5kCiAgICAgICAgLy8gX2N1cnJlbnQgd2lsbCBiZSBzZXQgYWdhaW4gYmVsb3cuCiAgICAgICAgX2N1cnJlbnRFeHBhbnNpb24gPSBudWxsOwogICAgICAgIF9jdXJyZW50RXhwYW5zaW9uID0gX2YoX2l0ZXJhdG9yLmN1cnJlbnQpLml0ZXJhdG9yOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgX2N1cnJlbnQgPSBfY3VycmVudEV4cGFuc2lvbi5jdXJyZW50OwogICAgcmV0dXJuIHRydWU7CiAgfQp9CgpjbGFzcyBUYWtlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIGludCBfdGFrZUNvdW50OwoKICBmYWN0b3J5IFRha2VJdGVyYWJsZShJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IHRha2VDb3VudCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwodGFrZUNvdW50LCAidGFrZUNvdW50Iik7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUodGFrZUNvdW50LCAidGFrZUNvdW50Iik7CiAgICBpZiAoaXRlcmFibGUgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhUYWtlSXRlcmFibGU8RT4oaXRlcmFibGUsIHRha2VDb3VudCk7CiAgICB9CiAgICByZXR1cm4gbmV3IFRha2VJdGVyYWJsZTxFPi5fKGl0ZXJhYmxlLCB0YWtlQ291bnQpOwogIH0KCiAgVGFrZUl0ZXJhYmxlLl8odGhpcy5faXRlcmFibGUsIHRoaXMuX3Rha2VDb3VudCk7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFRha2VJdGVyYXRvcjxFPihfaXRlcmFibGUuaXRlcmF0b3IsIF90YWtlQ291bnQpOwogIH0KfQoKY2xhc3MgRWZmaWNpZW50TGVuZ3RoVGFrZUl0ZXJhYmxlPEU+IGV4dGVuZHMgVGFrZUl0ZXJhYmxlPEU+CiAgICBpbXBsZW1lbnRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBFZmZpY2llbnRMZW5ndGhUYWtlSXRlcmFibGUoSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCB0YWtlQ291bnQpCiAgICAgIDogc3VwZXIuXyhpdGVyYWJsZSwgdGFrZUNvdW50KTsKCiAgaW50IGdldCBsZW5ndGggewogICAgaW50IGl0ZXJhYmxlTGVuZ3RoID0gX2l0ZXJhYmxlLmxlbmd0aDsKICAgIGlmIChpdGVyYWJsZUxlbmd0aCA+IF90YWtlQ291bnQpIHJldHVybiBfdGFrZUNvdW50OwogICAgcmV0dXJuIGl0ZXJhYmxlTGVuZ3RoOwogIH0KfQoKY2xhc3MgVGFrZUl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBpbnQgX3JlbWFpbmluZzsKCiAgVGFrZUl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9yZW1haW5pbmcpIHsKICAgIGFzc2VydChfcmVtYWluaW5nID49IDApOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIF9yZW1haW5pbmctLTsKICAgIGlmIChfcmVtYWluaW5nID49IDApIHsKICAgICAgcmV0dXJuIF9pdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgfQogICAgX3JlbWFpbmluZyA9IC0xOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCB7CiAgICBpZiAoX3JlbWFpbmluZyA8IDApIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9pdGVyYXRvci5jdXJyZW50OwogIH0KfQoKY2xhc3MgVGFrZVdoaWxlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwoKICBUYWtlV2hpbGVJdGVyYWJsZSh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fZik7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFRha2VXaGlsZUl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX2YpOwogIH0KfQoKY2xhc3MgVGFrZVdoaWxlSXRlcmF0b3I8RT4gZXh0ZW5kcyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgSXRlcmF0b3I8RT4gX2l0ZXJhdG9yOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwogIGJvb2wgX2lzRmluaXNoZWQgPSBmYWxzZTsKCiAgVGFrZVdoaWxlSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9pc0ZpbmlzaGVkKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoIV9pdGVyYXRvci5tb3ZlTmV4dCgpIHx8ICFfZihfaXRlcmF0b3IuY3VycmVudCkpIHsKICAgICAgX2lzRmluaXNoZWQgPSB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgewogICAgaWYgKF9pc0ZpbmlzaGVkKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBfaXRlcmF0b3IuY3VycmVudDsKICB9Cn0KCmNsYXNzIFNraXBJdGVyYWJsZTxFPiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfaXRlcmFibGU7CiAgZmluYWwgaW50IF9za2lwQ291bnQ7CgogIGZhY3RvcnkgU2tpcEl0ZXJhYmxlKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgY291bnQpIHsKICAgIGlmIChpdGVyYWJsZSBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkgewogICAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aFNraXBJdGVyYWJsZTxFPihpdGVyYWJsZSwgY291bnQpOwogICAgfQogICAgcmV0dXJuIG5ldyBTa2lwSXRlcmFibGU8RT4uXyhpdGVyYWJsZSwgX2NoZWNrQ291bnQoY291bnQpKTsKICB9CgogIFNraXBJdGVyYWJsZS5fKHRoaXMuX2l0ZXJhYmxlLCB0aGlzLl9za2lwQ291bnQpOwoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgewogICAgcmV0dXJuIG5ldyBTa2lwSXRlcmFibGU8RT4uXyhfaXRlcmFibGUsIF9za2lwQ291bnQgKyBfY2hlY2tDb3VudChjb3VudCkpOwogIH0KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgU2tpcEl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX3NraXBDb3VudCk7CiAgfQp9CgpjbGFzcyBFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGU8RT4gZXh0ZW5kcyBTa2lwSXRlcmFibGU8RT4KICAgIGltcGxlbWVudHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gewogIGZhY3RvcnkgRWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgY291bnQpIHsKICAgIHJldHVybiBuZXcgRWZmaWNpZW50TGVuZ3RoU2tpcEl0ZXJhYmxlPEU+Ll8oaXRlcmFibGUsIF9jaGVja0NvdW50KGNvdW50KSk7CiAgfQoKICBFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGUuXyhJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IGNvdW50KQogICAgICA6IHN1cGVyLl8oaXRlcmFibGUsIGNvdW50KTsKCiAgaW50IGdldCBsZW5ndGggewogICAgaW50IGxlbmd0aCA9IF9pdGVyYWJsZS5sZW5ndGggLSBfc2tpcENvdW50OwogICAgaWYgKGxlbmd0aCA+PSAwKSByZXR1cm4gbGVuZ3RoOwogICAgcmV0dXJuIDA7CiAgfQoKICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgewogICAgcmV0dXJuIG5ldyBFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGU8RT4uXygKICAgICAgICBfaXRlcmFibGUsIF9za2lwQ291bnQgKyBfY2hlY2tDb3VudChjb3VudCkpOwogIH0KfQoKaW50IF9jaGVja0NvdW50KGludCBjb3VudCkgewogIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKGNvdW50LCAiY291bnQiKTsKICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoY291bnQsICJjb3VudCIpOwogIHJldHVybiBjb3VudDsKfQoKY2xhc3MgU2tpcEl0ZXJhdG9yPEU+IGV4dGVuZHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIEl0ZXJhdG9yPEU+IF9pdGVyYXRvcjsKICBpbnQgX3NraXBDb3VudDsKCiAgU2tpcEl0ZXJhdG9yKHRoaXMuX2l0ZXJhdG9yLCB0aGlzLl9za2lwQ291bnQpIHsKICAgIGFzc2VydChfc2tpcENvdW50ID49IDApOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NraXBDb3VudDsgaSsrKSBfaXRlcmF0b3IubW92ZU5leHQoKTsKICAgIF9za2lwQ291bnQgPSAwOwogICAgcmV0dXJuIF9pdGVyYXRvci5tb3ZlTmV4dCgpOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfaXRlcmF0b3IuY3VycmVudDsKfQoKY2xhc3MgU2tpcFdoaWxlSXRlcmFibGU8RT4gZXh0ZW5kcyBJdGVyYWJsZTxFPiB7CiAgZmluYWwgSXRlcmFibGU8RT4gX2l0ZXJhYmxlOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwoKICBTa2lwV2hpbGVJdGVyYWJsZSh0aGlzLl9pdGVyYWJsZSwgdGhpcy5fZik7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IFNraXBXaGlsZUl0ZXJhdG9yPEU+KF9pdGVyYWJsZS5pdGVyYXRvciwgX2YpOwogIH0KfQoKY2xhc3MgU2tpcFdoaWxlSXRlcmF0b3I8RT4gZXh0ZW5kcyBJdGVyYXRvcjxFPiB7CiAgZmluYWwgSXRlcmF0b3I8RT4gX2l0ZXJhdG9yOwogIGZpbmFsIF9FbGVtZW50UHJlZGljYXRlPEU+IF9mOwogIGJvb2wgX2hhc1NraXBwZWQgPSBmYWxzZTsKCiAgU2tpcFdoaWxlSXRlcmF0b3IodGhpcy5faXRlcmF0b3IsIHRoaXMuX2YpOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKCFfaGFzU2tpcHBlZCkgewogICAgICBfaGFzU2tpcHBlZCA9IHRydWU7CiAgICAgIHdoaWxlIChfaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIGlmICghX2YoX2l0ZXJhdG9yLmN1cnJlbnQpKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF9pdGVyYXRvci5tb3ZlTmV4dCgpOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfaXRlcmF0b3IuY3VycmVudDsKfQoKLyoqCiAqIFRoZSBhbHdheXMgZW1wdHkgW0l0ZXJhYmxlXS4KICovCmNsYXNzIEVtcHR5SXRlcmFibGU8RT4gZXh0ZW5kcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgY29uc3QgRW1wdHlJdGVyYWJsZSgpOwoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gY29uc3QgRW1wdHlJdGVyYXRvcigpOwoKICB2b2lkIGZvckVhY2godm9pZCBhY3Rpb24oRSBlbGVtZW50KSkge30KCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiB0cnVlOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiAwOwoKICBFIGdldCBmaXJzdCB7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCAwLCAiaW5kZXgiKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpID0+IGZhbHNlOwoKICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiB0cnVlOwoKICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gZmFsc2U7CgogIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBsYXN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIFN0cmluZyBqb2luKFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKSA9PiAiIjsKCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHRoaXM7CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlbGVtZW50KSkgPT4gbmV3IEVtcHR5SXRlcmFibGU8VD4oKTsKCiAgRSByZWR1Y2UoRSBjb21iaW5lKEUgdmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBwcmV2aW91c1ZhbHVlLCBFIGVsZW1lbnQpKSB7CiAgICByZXR1cm4gaW5pdGlhbFZhbHVlOwogIH0KCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShjb3VudCwgImNvdW50Iik7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEl0ZXJhYmxlPEU+IHNraXBXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gdGhpczsKCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tOb3ROZWdhdGl2ZShjb3VudCwgImNvdW50Iik7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEl0ZXJhYmxlPEU+IHRha2VXaGlsZShib29sIHRlc3QoRSBlbGVtZW50KSkgPT4gdGhpczsKCiAgTGlzdDxFPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSA9PiBncm93YWJsZSA/IDxFPltdIDogbmV3IExpc3Q8RT4oMCk7CgogIFNldDxFPiB0b1NldCgpID0+IG5ldyBTZXQ8RT4oKTsKfQoKLyoqIFRoZSBhbHdheXMgZW1wdHkgaXRlcmF0b3IuICovCmNsYXNzIEVtcHR5SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgY29uc3QgRW1wdHlJdGVyYXRvcigpOwogIGJvb2wgbW92ZU5leHQoKSA9PiBmYWxzZTsKICBFIGdldCBjdXJyZW50ID0+IG51bGw7Cn0KCmNsYXNzIEZvbGxvd2VkQnlJdGVyYWJsZTxFPiBleHRlbmRzIEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBJdGVyYWJsZTxFPiBfZmlyc3Q7CiAgZmluYWwgSXRlcmFibGU8RT4gX3NlY29uZDsKICBGb2xsb3dlZEJ5SXRlcmFibGUodGhpcy5fZmlyc3QsIHRoaXMuX3NlY29uZCk7CgogIGZhY3RvcnkgRm9sbG93ZWRCeUl0ZXJhYmxlLmZpcnN0RWZmaWNpZW50KAogICAgICBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiBmaXJzdCwgSXRlcmFibGU8RT4gc2Vjb25kKSB7CiAgICBpZiAoc2Vjb25kIGlzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+KSB7CiAgICAgIHJldHVybiBuZXcgRWZmaWNpZW50TGVuZ3RoRm9sbG93ZWRCeUl0ZXJhYmxlPEU+KGZpcnN0LCBzZWNvbmQpOwogICAgfQogICAgcmV0dXJuIG5ldyBGb2xsb3dlZEJ5SXRlcmFibGU8RT4oZmlyc3QsIHNlY29uZCk7CiAgfQoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgPT4gbmV3IEZvbGxvd2VkQnlJdGVyYXRvcihfZmlyc3QsIF9zZWNvbmQpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfZmlyc3QubGVuZ3RoICsgX3NlY29uZC5sZW5ndGg7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfZmlyc3QuaXNFbXB0eSAmJiBfc2Vjb25kLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfZmlyc3QuaXNOb3RFbXB0eSB8fCBfc2Vjb25kLmlzTm90RW1wdHk7CgogIC8vIE1heSBiZSBtb3JlIGVmZmljaWVudCBpZiBlaXRoZXIgaXRlcmFibGUgaXMgYSBTZXQuCiAgYm9vbCBjb250YWlucyhPYmplY3QgdmFsdWUpID0+CiAgICAgIF9maXJzdC5jb250YWlucyh2YWx1ZSkgfHwgX3NlY29uZC5jb250YWlucyh2YWx1ZSk7CgogIEUgZ2V0IGZpcnN0IHsKICAgIHZhciBpdGVyYXRvciA9IF9maXJzdC5pdGVyYXRvcjsKICAgIGlmIChpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gaXRlcmF0b3IuY3VycmVudDsKICAgIHJldHVybiBfc2Vjb25kLmZpcnN0OwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICB2YXIgaXRlcmF0b3IgPSBfc2Vjb25kLml0ZXJhdG9yOwogICAgaWYgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgRSBsYXN0ID0gaXRlcmF0b3IuY3VycmVudDsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIGxhc3QgPSBpdGVyYXRvci5jdXJyZW50OwogICAgICByZXR1cm4gbGFzdDsKICAgIH0KICAgIHJldHVybiBfZmlyc3QubGFzdDsKICB9CgogIC8vIElmIGxpbmVhciBzZXF1ZW5jZXMgb2YgYGZvbGxvd2VkQnlgIGJlY29tZXMgYW4gaXNzdWUsIHdlIGNhbiBmbGF0dGVuCiAgLy8gaW50byBhIGxpc3Qgb2YgaXRlcmFibGVzIGluc3RlYWQgb2YgYSB0cmVlIG9yIHNwaW5lLgp9CgpjbGFzcyBFZmZpY2llbnRMZW5ndGhGb2xsb3dlZEJ5SXRlcmFibGU8RT4gZXh0ZW5kcyBGb2xsb3dlZEJ5SXRlcmFibGU8RT4KICAgIGltcGxlbWVudHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gewogIEVmZmljaWVudExlbmd0aEZvbGxvd2VkQnlJdGVyYWJsZSgKICAgICAgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4gZmlyc3QsIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHNlY29uZCkKICAgICAgOiBzdXBlcihmaXJzdCwgc2Vjb25kKTsKCiAgSXRlcmFibGU8RT4gc2tpcChpbnQgY291bnQpIHsKICAgIGludCBmaXJzdExlbmd0aCA9IF9maXJzdC5sZW5ndGg7CiAgICBpZiAoY291bnQgPj0gZmlyc3RMZW5ndGgpIHJldHVybiBfc2Vjb25kLnNraXAoY291bnQgLSBmaXJzdExlbmd0aCk7CiAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aEZvbGxvd2VkQnlJdGVyYWJsZTxFPigKICAgICAgICBfZmlyc3Quc2tpcChjb3VudCksIF9zZWNvbmQpOwogIH0KCiAgSXRlcmFibGU8RT4gdGFrZShpbnQgY291bnQpIHsKICAgIGludCBmaXJzdExlbmd0aCA9IF9maXJzdC5sZW5ndGg7CiAgICBpZiAoY291bnQgPD0gZmlyc3RMZW5ndGgpIHJldHVybiBfZmlyc3QudGFrZShjb3VudCk7CiAgICByZXR1cm4gbmV3IEVmZmljaWVudExlbmd0aEZvbGxvd2VkQnlJdGVyYWJsZTxFPigKICAgICAgICBfZmlyc3QsIF9zZWNvbmQudGFrZShjb3VudCAtIGZpcnN0TGVuZ3RoKSk7CiAgfQoKICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIGludCBmaXJzdExlbmd0aCA9IF9maXJzdC5sZW5ndGg7CiAgICBpZiAoaW5kZXggPCBmaXJzdExlbmd0aCkgcmV0dXJuIF9maXJzdC5lbGVtZW50QXQoaW5kZXgpOwogICAgcmV0dXJuIF9zZWNvbmQuZWxlbWVudEF0KGluZGV4IC0gZmlyc3RMZW5ndGgpOwogIH0KCiAgRSBnZXQgZmlyc3QgewogICAgaWYgKF9maXJzdC5pc05vdEVtcHR5KSByZXR1cm4gX2ZpcnN0LmZpcnN0OwogICAgcmV0dXJuIF9zZWNvbmQuZmlyc3Q7CiAgfQoKICBFIGdldCBsYXN0IHsKICAgIGlmIChfc2Vjb25kLmlzTm90RW1wdHkpIHJldHVybiBfc2Vjb25kLmxhc3Q7CiAgICByZXR1cm4gX2ZpcnN0Lmxhc3Q7CiAgfQp9CgpjbGFzcyBGb2xsb3dlZEJ5SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CiAgSXRlcmF0b3I8RT4gX2N1cnJlbnRJdGVyYXRvcjsKICBJdGVyYWJsZTxFPiBfbmV4dEl0ZXJhYmxlOwoKICBGb2xsb3dlZEJ5SXRlcmF0b3IoSXRlcmFibGU8RT4gZmlyc3QsIHRoaXMuX25leHRJdGVyYWJsZSkKICAgICAgOiBfY3VycmVudEl0ZXJhdG9yID0gZmlyc3QuaXRlcmF0b3I7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpZiAoX2N1cnJlbnRJdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChfbmV4dEl0ZXJhYmxlICE9IG51bGwpIHsKICAgICAgX2N1cnJlbnRJdGVyYXRvciA9IF9uZXh0SXRlcmFibGUuaXRlcmF0b3I7CiAgICAgIF9uZXh0SXRlcmFibGUgPSBudWxsOwogICAgICByZXR1cm4gX2N1cnJlbnRJdGVyYXRvci5tb3ZlTmV4dCgpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudEl0ZXJhdG9yLmN1cnJlbnQ7Cn0KCmNsYXNzIFdoZXJlVHlwZUl0ZXJhYmxlPFQ+IGV4dGVuZHMgSXRlcmFibGU8VD4gewogIGZpbmFsIEl0ZXJhYmxlPE9iamVjdD4gX3NvdXJjZTsKICBXaGVyZVR5cGVJdGVyYWJsZSh0aGlzLl9zb3VyY2UpOwogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciA9PiBuZXcgV2hlcmVUeXBlSXRlcmF0b3I8VD4oX3NvdXJjZS5pdGVyYXRvcik7Cn0KCmNsYXNzIFdoZXJlVHlwZUl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewogIGZpbmFsIEl0ZXJhdG9yPE9iamVjdD4gX3NvdXJjZTsKICBXaGVyZVR5cGVJdGVyYXRvcih0aGlzLl9zb3VyY2UpOwogIGJvb2wgbW92ZU5leHQoKSB7CiAgICB3aGlsZSAoX3NvdXJjZS5tb3ZlTmV4dCgpKSB7CiAgICAgIGlmIChfc291cmNlLmN1cnJlbnQgaXMgVCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBUIGdldCBjdXJyZW50ID0+IF9zb3VyY2UuY3VycmVudDsKfQoKLyoqCiAqIENyZWF0ZXMgZXJyb3JzIHRocm93IGJ5IFtJdGVyYWJsZV0gd2hlbiB0aGUgZWxlbWVudCBjb3VudCBpcyB3cm9uZy4KICovCmFic3RyYWN0IGNsYXNzIEl0ZXJhYmxlRWxlbWVudEVycm9yIHsKICAvKiogRXJyb3IgdGhyb3duIHRocm93biBieSwgZS5nLiwgW0l0ZXJhYmxlLmZpcnN0XSB3aGVuIHRoZXJlIGlzIG5vIHJlc3VsdC4gKi8KICBzdGF0aWMgU3RhdGVFcnJvciBub0VsZW1lbnQoKSA9PiBuZXcgU3RhdGVFcnJvcigiTm8gZWxlbWVudCIpOwogIC8qKiBFcnJvciB0aHJvd24gYnks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eXBlZF9kYXRhIiBzaG93IEludDMyTGlzdDsKCi8vLyBUaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgcGFydHMgb2YgdGhpcyBwYXRjaCBsaWJyYXJ5OgovLyBwYXJ0ICJjbGFzc19pZF9mYXN0YS5kYXJ0IjsKLy8gcGFydCAicHJpbnRfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInN5bWJvbF9wYXRjaC5kYXJ0IjsKCkBwYXRjaApMaXN0PFQ+IG1ha2VMaXN0Rml4ZWRMZW5ndGg8VD4oTGlzdDxUPiBncm93YWJsZUxpc3QpCiAgICBuYXRpdmUgIkludGVybmFsX21ha2VMaXN0Rml4ZWRMZW5ndGgiOwoKQHBhdGNoCkxpc3Q8VD4gbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZTxUPihMaXN0PFQ+IGZpeGVkTGVuZ3RoTGlzdCkKICAgIG5hdGl2ZSAiSW50ZXJuYWxfbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZSI7CgpAcGF0Y2gKT2JqZWN0IGV4dHJhY3RUeXBlQXJndW1lbnRzPFQ+KFQgaW5zdGFuY2UsIEZ1bmN0aW9uIGV4dHJhY3QpCiAgICBuYXRpdmUgIkludGVybmFsX2V4dHJhY3RUeXBlQXJndW1lbnRzIjsKCmNsYXNzIFZNTGlicmFyeUhvb2tzIHsKICAvLyBFeGFtcGxlOiAiZGFydDppc29sYXRlIF9UaW1lci5fZmFjdG9yeSIKICBzdGF0aWMgdmFyIHRpbWVyRmFjdG9yeTsKCiAgLy8gRXhhbXBsZTogImRhcnQ6aW8gX0V2ZW50SGFuZGxlci5fc2VuZERhdGEiCiAgc3RhdGljIHZhciBldmVudEhhbmRsZXJTZW5kRGF0YTsKCiAgLy8gQSBudWxsYXJ5IGNsb3N1cmUgdGhhdCBhbnN3ZXJzIHRoZSBjdXJyZW50IGNsb2NrIHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KICAvLyBFeGFtcGxlOiAiZGFydDppbyBfRXZlbnRIYW5kbGVyLl90aW1lck1pbGxpc2Vjb25kQ2xvY2siCiAgc3RhdGljIHZhciB0aW1lck1pbGxpc2Vjb25kQ2xvY2s7CgogIC8vIEltcGxlbWVudGF0aW9uIG9mIFJlc291cmNlLnJlYWRBc0J5dGVzLgogIHN0YXRpYyB2YXIgcmVzb3VyY2VSZWFkQXNCeXRlczsKCiAgLy8gSW1wbGVtZW50YXRpb24gb2YgcGFja2FnZSByb290L21hcCBwcm92aXNpb24uCiAgc3RhdGljIHZhciBwYWNrYWdlUm9vdFN0cmluZzsKICBzdGF0aWMgdmFyIHBhY2thZ2VDb25maWdTdHJpbmc7CiAgc3RhdGljIHZhciBwYWNrYWdlUm9vdFVyaUZ1dHVyZTsKICBzdGF0aWMgdmFyIHBhY2thZ2VDb25maWdVcmlGdXR1cmU7CiAgc3RhdGljIHZhciByZXNvbHZlUGFja2FnZVVyaUZ1dHVyZTsKCiAgc3RhdGljIHZhciBfY29tcHV0ZVNjcmlwdFVyaTsKICBzdGF0aWMgdmFyIF9jYWNoZWRTY3JpcHQ7CiAgc3RhdGljIHNldCBwbGF0Zm9ybVNjcmlwdCh2YXIgZikgewogICAgX2NvbXB1dGVTY3JpcHRVcmkgPSBmOwogICAgX2NhY2hlZFNjcmlwdCA9IG51bGw7CiAgfQoKICBzdGF0aWMgZ2V0IHBsYXRmb3JtU2NyaXB0IHsKICAgIGlmIChfY2FjaGVkU2NyaXB0ID09IG51bGwgJiYgX2NvbXB1dGVTY3JpcHRVcmkgIT0gbnVsbCkgewogICAgICBfY2FjaGVkU2NyaXB0ID0gX2NvbXB1dGVTY3JpcHRVcmkoKTsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkU2NyaXB0OwogIH0KfQoKZmluYWwgYm9vbCBpczY0Qml0ID0gX2lucXVpcmVJczY0Qml0KCk7Cgpib29sIF9pbnF1aXJlSXM2NEJpdCgpIG5hdGl2ZSAiSW50ZXJuYWxfaW5xdWlyZUlzNjRCaXQiOwoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKYm9vbCBfY2xhc3NSYW5nZUNoZWNrKGludCBjaWQsIGludCBsb3dlckxpbWl0LCBpbnQgdXBwZXJMaW1pdCkgewogIHJldHVybiBjaWQgPj0gbG93ZXJMaW1pdCAmJiBjaWQgPD0gdXBwZXJMaW1pdDsKfQoKYm9vbCBfY2xhc3NSYW5nZUNoZWNrTmVnYXRpdmUoaW50IGNpZCwgaW50IGxvd2VyTGltaXQsIGludCB1cHBlckxpbWl0KSB7CiAgcmV0dXJuIGNpZCA8IGxvd2VyTGltaXQgfHwgY2lkID4gdXBwZXJMaW1pdDsKfQoKLy8gVXRpbGl0eSBjbGFzcyBub3cgb25seSB1c2VkIGJ5IHRoZSBWTS4KY2xhc3MgTGlzdHMgewogIHN0YXRpYyB2b2lkIGNvcHkoTGlzdCBzcmMsIGludCBzcmNTdGFydCwgTGlzdCBkc3QsIGludCBkc3RTdGFydCwgaW50IGNvdW50KSB7CiAgICBpZiAoc3JjU3RhcnQgPCBkc3RTdGFydCkgewogICAgICBmb3IgKGludCBpID0gc3JjU3RhcnQgKyBjb3VudCAtIDEsIGogPSBkc3RTdGFydCArIGNvdW50IC0gMTsKICAgICAgICAgIGkgPj0gc3JjU3RhcnQ7CiAgICAgICAgICBpLS0sIGotLSkgewogICAgICAgIGRzdFtqXSA9IHNyY1tpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IHNyY1N0YXJ0LCBqID0gZHN0U3RhcnQ7IGkgPCBzcmNTdGFydCArIGNvdW50OyBpKyssIGorKykgewogICAgICAgIGRzdFtqXSA9IHNyY1tpXTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gUHJlcGVuZCB0aGUgcGFyZW50IHR5cGUgYXJndW1lbnRzIChtYXliZSBudWxsKSBvZiBsZW5ndGggJ3BhcmVudExlbicgdG8gdGhlCi8vIGZ1bmN0aW9uIHR5cGUgYXJndW1lbnRzIChtYXkgYmUgbnVsbCkuIFRoZSByZXN1bHQgaXMgbnVsbCBpZiBib3RoIGlucHV0Ci8vIHZlY3RvcnMgYXJlIG51bGwgb3IgaXMgYSBuZXdseSBhbGxvY2F0ZWQgYW5kIGNhbm9uaWNhbGl6ZWQgdmVjdG9yIG9mIGxlbmd0aAovLyAndG90YWxMZW4nLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKX3ByZXBlbmRUeXBlQXJndW1lbnRzKGZ1bmN0aW9uVHlwZUFyZ3VtZW50cywgcGFyZW50VHlwZUFyZ3VtZW50cywgcGFyZW50TGVuLAogICAgdG90YWxMZW4pIG5hdGl2ZSAiSW50ZXJuYWxfcHJlcGVuZFR5cGVBcmd1bWVudHMiOwoKLy8gQ2hlY2sgdGhhdCBhIHNldCBvZiB0eXBlIGFyZ3VtZW50cyBzYXRpc2Z5IHRoZSB0eXBlIHBhcmFtZXRlciBib3VuZHMgb24gYQovLyBjbG9zdXJlLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKX2JvdW5kc0NoZWNrRm9yUGFydGlhbEluc3RhbnRpYXRpb24oY2xvc3VyZSwgdHlwZUFyZ3MpCiAgICBuYXRpdmUgIkludGVybmFsX2JvdW5kc0NoZWNrRm9yUGFydGlhbEluc3RhbnRpYXRpb24iOwoKLy8gQ2FsbGVkIGJ5IElSUmVnRXhwTWFjcm9Bc3NlbWJsZXI6Okdyb3dTdGFjay4KSW50MzJMaXN0IF9ncm93UmVnRXhwU3RhY2soSW50MzJMaXN0IHN0YWNrKSB7CiAgZmluYWwgbmV3U3RhY2sgPSBuZXcgSW50MzJMaXN0KHN0YWNrLmxlbmd0aCAqIDIpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHsKICAgIG5ld1N0YWNrW2ldID0gc3RhY2tbaV07CiAgfQogIHJldHVybiBuZXdTdGFjazsKfQoKLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBza2lwIGltcGxpY2l0IG9yIGV4cGxpY2l0IGNoZWNrZWQgZG93biBjYXN0cyBpbgovLyB0aGUgcGFydHMgb2YgdGhlIGNvcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiB3aGVyZSB3ZSBrbm93IGJ5IGNvbnN0cnVjdGlvbiB0aGUKLy8gdHlwZSBvZiBhIHZhbHVlLgovLwovLyBJbXBvcnRhbnQ6IHRoaXMgaXMgdW5zYWZlIGFuZCBtdXN0IGJlIHVzZWQgd2l0aCBjYXJlLgpUIHVuc2FmZUNhc3Q8VD4oT2JqZWN0IHYpIG5hdGl2ZSAiSW50ZXJuYWxfdW5zYWZlQ2FzdCI7CoCAAE5OPAFNT0srASABKQE6HxwdAQc1KwEHPjEBBz0sARctGwEwIwFNPSQBLSIBMyAiIyUmASAcJRsaBAEePisGGgQCASgBOQEiJkExAgFJLwIBKg5QH0MZFhkIDU0ZCAYEAgFPS08PIk02AU0MIjc6ATAuNCscBBMCAVBSFAM5OAEoZGFydDpfaW50ZXJuYWwtcGF0Y2gvaW50ZXJuYWxfcGF0Y2guZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2NsYXNzX2lkX2Zhc3RhLmRhcnSDpS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJpbnRlcm5hbF9wYXRjaC5kYXJ0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgQ2xhc3NJRCB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIHN0YXRpYyBpbnQgZ2V0SUQoT2JqZWN0IHZhbHVlKSBuYXRpdmUgIkNsYXNzSURfZ2V0SUQiOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBjaWRBcnJheSA9IDA7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBmaW5hbCBpbnQgY2lkRXh0ZXJuYWxPbmVCeXRlU3RyaW5nID0gMDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBjaWRHcm93YWJsZU9iamVjdEFycmF5ID0gMDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBjaWRJbW11dGFibGVBcnJheSA9IDA7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBmaW5hbCBpbnQgY2lkT25lQnl0ZVN0cmluZyA9IDA7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBmaW5hbCBpbnQgY2lkVHdvQnl0ZVN0cmluZyA9IDA7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBmaW5hbCBpbnQgY2lkVWludDhBcnJheVZpZXcgPSAwOwp9Ch0ATk48ASIBGhAkNDkBHCEcMRwvHCocKRwpHCoCAShkYXJ0Ol9pbnRlcm5hbC1wYXRjaC9jbGFzc19pZF9mYXN0YS5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pbnRlcm5hbC9wYXRjaC5kYXJ0gT0vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiAiZGFydDpfaW50ZXJuYWwiOwoKY2xhc3MgX1BhdGNoIHsKICBjb25zdCBfUGF0Y2goKTsKfQoKY29uc3QgX1BhdGNoIHBhdGNoID0gY29uc3QgX1BhdGNoKCk7Cg0ATk48ARoBDxICASUBH2RhcnQ6X2ludGVybmFsLXBhdGNoL3BhdGNoLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2ludGVybmFsL2xpc3QuZGFydK7RLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5faW50ZXJuYWw7CgovKioKICogTWl4aW4gdGhhdCB0aHJvd3Mgb24gdGhlIGxlbmd0aCBjaGFuZ2luZyBvcGVyYXRpb25zIG9mIFtMaXN0XS4KICoKICogSW50ZW5kZWQgdG8gbWl4LWluIG9uIHRvcCBvZiBbTGlzdE1peGluXSBmb3IgZml4ZWQtbGVuZ3RoIGxpc3RzLgogKi8KYWJzdHJhY3QgY2xhc3MgRml4ZWRMZW5ndGhMaXN0TWl4aW48RT4gewogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgc2V0IGxlbmd0aChpbnQgbmV3TGVuZ3RoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCBhZGQoRSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCBpbnNlcnRBbGwoaW50IGF0LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICBib29sIHJlbW92ZShPYmplY3QgZWxlbWVudCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGEgZml4ZWQgbGVuZ3RoIGxpc3QuICovCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2xlYXIgYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICBFIHJlbW92ZUF0KGludCBpbmRleCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIEUgcmVtb3ZlTGFzdCgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYSBmaXhlZCBsZW5ndGggbGlzdC4gKi8KICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhIGZpeGVkIGxlbmd0aCBsaXN0LiAqLwogIHZvaWQgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KfQoKLyoqCiAqIE1peGluIGZvciBhbiB1bm1vZGlmaWFibGUgW0xpc3RdIGNsYXNzLgogKgogKiBUaGlzIG92ZXJyaWRlcyBhbGwgbXV0YXRpbmcgbWV0aG9kcyB3aXRoIG1ldGhvZHMgdGhhdCB0aHJvdy4KICogVGhpcyBtaXhpbiBpcyBpbnRlbmRlZCB0byBiZSBtaXhlZCBpbiBvbiB0b3Agb2YgW0xpc3RNaXhpbl0gb24KICogdW5tb2RpZmlhYmxlIGxpc3RzLgogKi8KYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlTGlzdE1peGluPEU+IGltcGxlbWVudHMgTGlzdDxFPiB7CiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgc2V0IGxlbmd0aChpbnQgbmV3TGVuZ3RoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiQ2Fubm90IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICBzZXQgZmlyc3QoRSBlbGVtZW50KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgc2V0IGxhc3QoRSBlbGVtZW50KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBzZXRBbGwoaW50IGF0LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgYWRkKEUgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIGluc2VydChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIHZvaWQgaW5zZXJ0QWxsKGludCBhdCwgSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHNvcnQoW0NvbXBhcmF0b3I8RT4gY29tcGFyZV0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2xlYXIgYW4gdW5tb2RpZmlhYmxlIGxpc3QiKTsKICB9CgogIC8qKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFuIHVubW9kaWZpYWJsZSBsaXN0LiAqLwogIEUgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBFIHJlbW92ZUxhc3QoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0Iik7CiAgfQoKICAvKiogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KCiAgLyoqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgdm9pZCBmaWxsUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBbRSBmaWxsVmFsdWVdKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpOwogIH0KfQoKLyoqCiAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgZml4ZWQtbGVuZ3RoIGxpc3QuCiAqCiAqIEFsbCBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIGBsZW5ndGhgLCBgb3BlcmF0b3JbXWAgYW5kCiAqIGBvcGVyYXRvcltdPWAsIHdoaWNoIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQuCiAqLwphYnN0cmFjdCBjbGFzcyBGaXhlZExlbmd0aExpc3RCYXNlPEU+ID0gTGlzdEJhc2U8RT4KICAgIHdpdGggRml4ZWRMZW5ndGhMaXN0TWl4aW48RT47CgovKioKICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYW4gdW5tb2RpZmlhYmxlIGxpc3QuCiAqCiAqIEFsbCBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIGBsZW5ndGhgIGFuZCBgb3BlcmF0b3JbXWAsCiAqIHdoaWNoIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQuCiAqLwphYnN0cmFjdCBjbGFzcyBVbm1vZGlmaWFibGVMaXN0QmFzZTxFPiA9IExpc3RCYXNlPEU+CiAgICB3aXRoIFVubW9kaWZpYWJsZUxpc3RNaXhpbjxFPjsKCmNsYXNzIF9MaXN0SW5kaWNlc0l0ZXJhYmxlIGV4dGVuZHMgTGlzdEl0ZXJhYmxlPGludD4gewogIExpc3QgX2JhY2tlZExpc3Q7CgogIF9MaXN0SW5kaWNlc0l0ZXJhYmxlKHRoaXMuX2JhY2tlZExpc3QpOwoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfYmFja2VkTGlzdC5sZW5ndGg7CiAgaW50IGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZEluZGV4KGluZGV4LCB0aGlzKTsKICAgIHJldHVybiBpbmRleDsKICB9Cn0KCmNsYXNzIExpc3RNYXBWaWV3PEU+IGV4dGVuZHMgVW5tb2RpZmlhYmxlTWFwQmFzZTxpbnQsIEU+IHsKICBMaXN0PEU+IF92YWx1ZXM7CgogIExpc3RNYXBWaWV3KHRoaXMuX3ZhbHVlcyk7CgogIEUgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4gY29udGFpbnNLZXkoa2V5KSA/IF92YWx1ZXNba2V5XSA6IG51bGw7CiAgaW50IGdldCBsZW5ndGggPT4gX3ZhbHVlcy5sZW5ndGg7CgogIEl0ZXJhYmxlPEU+IGdldCB2YWx1ZXMgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxFPihfdmFsdWVzLCAwLCBudWxsKTsKICBJdGVyYWJsZTxpbnQ+IGdldCBrZXlzID0+IG5ldyBfTGlzdEluZGljZXNJdGVyYWJsZShfdmFsdWVzKTsKCiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfdmFsdWVzLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfdmFsdWVzLmlzTm90RW1wdHk7CiAgYm9vbCBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgPT4gX3ZhbHVlcy5jb250YWlucyh2YWx1ZSk7CiAgYm9vbCBjb250YWluc0tleShPYmplY3Qga2V5KSA9PiBrZXkgaXMgaW50ICYmIGtleSA+PSAwICYmIGtleSA8IGxlbmd0aDsKCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihpbnQga2V5LCBFIHZhbHVlKSkgewogICAgaW50IGxlbmd0aCA9IF92YWx1ZXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBmKGksIF92YWx1ZXNbaV0pOwogICAgICBpZiAobGVuZ3RoICE9IF92YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihfdmFsdWVzKTsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgUmV2ZXJzZWRMaXN0SXRlcmFibGU8RT4gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4gewogIEl0ZXJhYmxlPEU+IF9zb3VyY2U7CiAgUmV2ZXJzZWRMaXN0SXRlcmFibGUodGhpcy5fc291cmNlKTsKCiAgaW50IGdldCBsZW5ndGggPT4gX3NvdXJjZS5sZW5ndGg7CgogIEUgZWxlbWVudEF0KGludCBpbmRleCkgPT4gX3NvdXJjZS5lbGVtZW50QXQoX3NvdXJjZS5sZW5ndGggLSAxIC0gaW5kZXgpOwp9CgovKioKICogQ3JlYXRlcyBlcnJvcnMgdGhyb3duIGJ5IHVubW9kaWZpYWJsZSBsaXN0cyB3aGVuIHRoZXkgYXJlIGF0dGVtcHRlZCBtb2RpZmllZC4KICoKICogVGhpcyBjbGFzcyBjcmVhdGVzIFtVbnN1cHBvcnRlZEVycm9yXXMgd2l0aCBzcGVjaWFsaXplZCBtZXNzYWdlcy4KICovCmFic3RyYWN0IGNsYXNzIFVubW9kaWZpYWJsZUxpc3RFcnJvciB7CiAgLyoqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byBhZGQgZWxlbWVudHMgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgc3RhdGljIFVuc3VwcG9ydGVkRXJyb3IgYWRkKCkgPT4KICAgICAgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gdW5tb2RpZmlhYmxlIExpc3QiKTsKCiAgLyoqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byBhZGQgZWxlbWVudHMgdG8gYW4gdW5tb2RpZmlhYmxlIGxpc3QuICovCiAgc3RhdGljIFVuc3VwcG9ydGVkRXJyb3IgY2hhbmdlKCkgPT4KICAgICAgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjaGFuZ2UgdGhlIGNvbnRlbnQgb2YgYW4gdW5tb2RpZmlhYmxlIExpc3QiKTsKCiAgLyoqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byBjaGFuZ2UgdGhlIGxlbmd0aCBvZiBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBzdGF0aWMgVW5zdXBwb3J0ZWRFcnJvciBsZW5ndGgoKSA9PgogICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGNoYW5nZSBsZW5ndGggb2YgdW5tb2RpZmlhYmxlIExpc3QiKTsKCiAgLyoqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byByZW1vdmUgZWxlbWVudHMgZnJvbSBhbiB1bm1vZGlmaWFibGUgbGlzdC4gKi8KICBzdGF0aWMgVW5zdXBwb3J0ZWRFcnJvciByZW1vdmUoKSA9PgogICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIHVubW9kaWZpYWJsZSBMaXN0Iik7Cn0KCi8qKgogKiBDcmVhdGVzIGVycm9ycyB0aHJvd24gYnkgbm9uLWdyb3dhYmxlIGxpc3RzIHdoZW4gdGhleSBhcmUgYXR0ZW1wdGVkIG1vZGlmaWVkLgogKgogKiBUaGlzIGNsYXNzIGNyZWF0ZXMgW1Vuc3VwcG9ydGVkRXJyb3JdcyB3aXRoIHNwZWNpYWxpemVkIG1lc3NhZ2VzLgogKi8KYWJzdHJhY3QgY2xhc3MgTm9uR3Jvd2FibGVMaXN0RXJyb3IgewogIC8qKiBFcnJvciB0aHJvd24gd2hlbiB0cnlpbmcgdG8gYWRkIGVsZW1lbnRzIHRvIGFuIG5vbi1ncm93YWJsZSBsaXN0LiAqLwogIHN0YXRpYyBVbnN1cHBvcnRlZEVycm9yIGFkZCgpID0+CiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIG5vbi1ncm93YWJsZSBMaXN0Iik7CgogIC8qKiBFcnJvciB0aHJvd24gd2hlbiB0cnlpbmcgdG8gY2hhbmdlIHRoZSBsZW5ndGggb2YgYW4gbm9uLWdyb3dhYmxlIGxpc3QuICovCiAgc3RhdGljIFVuc3VwcG9ydGVkRXJyb3IgbGVuZ3RoKCkgPT4KICAgICAgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBjaGFuZ2UgbGVuZ3RoIG9mIG5vbi1ncm93YWJsZSBMaXN0Iik7CgogIC8qKiBFcnJvciB0aHJvd24gd2hlbiB0cnlpbmcgdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gbm9uLWdyb3dhYmxlIGxpc3QuICovCiAgc3RhdGljIFVuc3VwcG9ydGVkRXJyb3IgcmVtb3ZlKCkgPT4KICAgICAgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBub24tZ3Jvd2FibGUgTGlzdCIpOwp9CgovKioKICogQ29udmVydHMgYSBncm93YWJsZSBsaXN0IHRvIGEgZml4ZWQgbGVuZ3RoIGxpc3Qgd2l0aCB0aGUgc2FtZSBlbGVtZW50cy4KICoKICogRm9yIGludGVybmFsIHVzZSBvbmx5LgogKiBPbmx5IHdvcmtzIG9uIGdyb3dhYmxlIGxpc3RzIGFzIGNyZWF0ZWQgYnkgYFtdYCBvciBgbmV3IExpc3QoKWAuCiAqIE1heSB0aHJvdyBvbiBhbnkgb3RoZXIgbGlzdC4KICoKICogVGhlIG9wZXJhdGlvbiBpcyBlZmZpY2llbnQuIEl0IGRvZXNuJ3QgY29weSB0aGUgZWxlbWVudHMsIGJ1dCBjb252ZXJ0cwogKiB0aGUgZXhpc3RpbmcgbGlzdCBkaXJlY3RseSB0byBhIGZpeGVkIGxlbmd0aCBsaXN0LgogKiBUaGF0IG1lYW5zIHRoYXQgaXQgaXMgYSBkZXN0cnVjdGl2ZSBjb252ZXJzaW9uLgogKiBUaGUgb3JpZ2luYWwgbGlzdCBzaG91bGQgbm90IGJlIHVzZWQgYWZ0ZXJ3YXJkcy4KICoKICogVGhlIHJldHVybmVkIGxpc3QgbWF5IGJlIHRoZSBzYW1lIGxpc3QgYXMgdGhlIG9yaWdpbmFsLAogKiBvciBpdCBtYXkgYmUgYSBkaWZmZXJlbnQgbGlzdCAoYWNjb3JkaW5nIHRvIFtpZGVudGljYWxdKS4KICogVGhlIG9yaWdpbmFsIGxpc3QgbWF5IGhhdmUgY2hhbmdlZCB0eXBlIHRvIGJlIGEgZml4ZWQgbGlzdCwKICogb3IgYmVjb21lIGVtcHR5IG9yIGJlZW4gb3RoZXJ3aXNlIG1vZGlmaWVkLgogKiBJdCB3aWxsIHN0aWxsIGJlIGEgdmFsaWQgb2JqZWN0LCBzbyByZWZlcmVuY2VzIHRvIGl0IHdpbGwgbm90LCBlLmcuLCBjcmFzaAogKiB0aGUgcnVudGltZSBpZiBhY2Nlc3NlZCwgYnV0IG5vIHByb21pc2VzIGFyZSBtYWRlIHdydC4gaXRzIGNvbnRlbnRzLgogKgogKiBUaGlzIHVuc3BlY2lmaWVkIGJlaGF2aW9yIGlzIHRoZSByZWFzb24gdGhlIGZ1bmN0aW9uIGlzIG5vdCBleHBvc2VkIHRvCiAqIHVzZXJzLiBXZSBhbGxvdyB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIHRoZSBtb3N0IGVmZmljaWVudAogKiBjb252ZXJzaW9uLCBhdCB0aGUgY29zdCBvZiBsZWF2aW5nIHRoZSBvcmlnaW5hbCBsaXN0IGluIGFuIHVuc3BlY2lmaWVkCiAqIHN0YXRlLgogKi8KZXh0ZXJuYWwgTGlzdDxUPiBtYWtlTGlzdEZpeGVkTGVuZ3RoPFQ+KExpc3Q8VD4gZ3Jvd2FibGVMaXN0KTsKCi8qKgogKiBDb252ZXJ0cyBhIGZpeGVkLWxlbmd0aCBsaXN0IHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0LgogKgogKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAqIE9ubHkgd29ya3MgZm9yIGNvcmUgZml4ZWQtbGVuZ3RoIGxpc3RzIGFzIGNyZWF0ZWQgYnkgYG5ldyBMaXN0KGxlbmd0aClgLAogKiBvciBhcyByZXR1cm5lZCBieSBbbWFrZUxpc3RGaXhlZExlbmd0aF0uCiAqCiAqIFRoZSBvcGVyYXRpb24gaXMgZWZmaWNpZW50LiBJdCBkb2Vzbid0IGNvcHkgdGhlIGVsZW1lbnRzLCBidXQgY29udmVydHMKICogdGhlIGV4aXN0aW5nIGxpc3QgZGlyZWN0bHkgdG8gYSBmaXhlZCBsZW5ndGggbGlzdC4KICogVGhhdCBtZWFucyB0aGF0IGl0IGlzIGEgZGVzdHJ1Y3RpdmUgY29udmVyc2lvbi4KICogVGhlIG9yaWdpbmFsIGxpc3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGFmdGVyd2FyZHMuCiAqCiAqIFRoZSB1bm1vZGlmaWFibGUgbGlzdCB0eXBlIGlzIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkIGJ5IGNvbnN0IGxpc3RzLgogKi8KZXh0ZXJuYWwgTGlzdDxUPiBtYWtlRml4ZWRMaXN0VW5tb2RpZmlhYmxlPFQ+KExpc3Q8VD4gZml4ZWRMZW5ndGhMaXN0KTsKgVcATk48ARgBBEIDRAQpQR4gPAQBQRZFBAFBJEUEAUExRQQBQSZFBAFBIEoEAUErSgQBQStKBAFBEUQEAUEaSgQBQRNKBAFBKUoEAUFASgQCAQQrA0BCFwQ9QipGBAFCHiA9BAEZRgQBGEYEAUIuRgQBQhZGBAFCJkYEAUIxRgQBQiZGBAFCIEsEAUIrSwQBQitLBAFCJ0YEAUIiRgQBQhFFBAFCGksEAUITSwQBQlFGBAFCKUsEAUJASwQBQjZGBAIBBDMDRTAENCIBBDQDRSEENSMBNxQBKgEoHS0SBAIBOxMBHQFHJAFGPwEnLT9KASshJxgmOAgGBAIBOBcmASQBSwIBBFEDRQQnSyM/AUsmUQFQJkkBUCZEAgEEUQNFBCZLIz8BUCZJAVAmRAIBBEsDGkQgA0o2MzQDOz0/L05IA0pMSgoEPwEEOQMaTCwDSjYzNANJBEgBGGRhcnQ6X2ludGVybmFsL2xpc3QuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW50ZXJuYWwvc3ltYm9sLmRhcnSSty8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuX2ludGVybmFsOwoKLyoqCiAqIEltcGxlbWVudGF0aW9uIG9mIFtjb3JlLlN5bWJvbF0uICBUaGlzIGNsYXNzIHVzZXMgdGhlIHNhbWUgbmFtZSBhcwogKiBhIGNvcmUgY2xhc3Mgc28gYSB1c2VyIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UuCiAqCiAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gaGlkZSBbX25hbWVdIGZyb20gdXNlciBjb2RlLCBidXQKICogbWFrZSBpdCBhY2Nlc3NpYmxlIHRvIERhcnQgcGxhdGZvcm0gY29kZSB2aWEgdGhlIHN0YXRpYyBtZXRob2QKICogW2dldE5hbWVdLgogKi8KY2xhc3MgU3ltYm9sIGltcGxlbWVudHMgY29yZS5TeW1ib2wgewogIGZpbmFsIFN0cmluZyBfbmFtZTsKCiAgLyoqCiAgICogU291cmNlIG9mIFJlZ0V4cCBtYXRjaGluZyBEYXJ0IHJlc2VydmVkIHdvcmRzLgogICAqCiAgICogUmVzZXJ2ZWQgd29yZHMgYXJlIG5vdCBhbGxvd2VkIGFzIGlkZW50aWZpZXJzLgogICAqLwogIHN0YXRpYyBjb25zdCBTdHJpbmcgcmVzZXJ2ZWRXb3JkUkUgPQogICAgICByJyg/OmFzc2VydHxicmVha3xjKD86YSg/OnNlfHRjaCl8bGFzc3xvbig/OnN0fHRpbnVlKSl8ZCg/OmVmYXVsdHxvKXwnCiAgICAgIHInZSg/OmxzZXxudW18eHRlbmRzKXxmKD86YWxzZXxpbmFsKD86bHkpP3xvcil8aVtmbnNdfG4oPzpld3x1bGwpfCcKICAgICAgcidyZXQoPzpocm93fHVybil8cyg/OnVwZXJ8d2l0Y2gpfHQoPzpoKD86aXN8cm93KXxyKD86dWV8eSkpfCcKICAgICAgcid2KD86YXJ8b2lkKXx3KD86aGlsZXxpdGgpKSc7CiAgLyoqCiAgICogU291cmNlIG9mIFJlZ0V4cCBtYXRjaGluZyBhbnkgcHVibGljIGlkZW50aWZpZXIuCiAgICoKICAgKiBBIHB1YmxpYyBpZGVudGlmaWVyIGlzIGEgdmFsaWQgaWRlbnRpZmllciAobm90IGEgcmVzZXJ2ZWQgd29yZCkKICAgKiB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAnXycuCiAgICovCiAgc3RhdGljIGNvbnN0IFN0cmluZyBwdWJsaWNJZGVudGlmaWVyUkUgPQogICAgICByJyg/IScgJyRyZXNlcnZlZFdvcmRSRScgcidcYig/IVwkKSlbYS16QS1aJF1bXHckXSonOwogIC8qKgogICAqIFNvdXJjZSBvZiBSZWdFeHAgbWF0Y2hpbmcgYW55IGlkZW50aWZpZXIuCiAgICoKICAgKiBJdCBtYXRjaGVzIGlkZW50aWZpZXJzIGJ1dCBub3QgcmVzZXJ2ZWQgd29yZHMuIFRoZSBpZGVudGlmaWVycwogICAqIG1heSBzdGFydCB3aXRoICdfJy4KICAgKi8KICBzdGF0aWMgY29uc3QgU3RyaW5nIGlkZW50aWZpZXJSRSA9CiAgICAgIHInKD8hJyAnJHJlc2VydmVkV29yZFJFJyByJ1xiKD8hXCQpKVthLXpBLVokX11bXHckXSonOwogIC8qKgogICAqIFNvdXJjZSBvZiBSZWdFeHAgbWF0Y2hpbmcgYSBkZWNsYXJhYmxlIG9wZXJhdG9yIG5hbWVzLgogICAqCiAgICogVGhlIG9wZXJhdG9ycyB0aGF0IGNhbiBiZSBkZWNsYXJlZCB1c2luZyBgb3BlcmF0b3JgIGRlY2xhcmF0aW9ucyBhcmUKICAgKiBhbHNvIHRoZSBvbmx5IG9uZXMgYWxsb3dlZCBhcyBzeW1ib2xzLiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0b3JzIGlzCiAgICogdGhlIHNhbWUgYXMgdGhlIG9wZXJhdG9yIGl0c2VsZiBleGNlcHQgZm9yIHVuYXJ5IG1pbnVzLCB3aGVyZSB0aGUgbmFtZQogICAqIGlzICJ1bmFyeS0iLgogICAqLwogIHN0YXRpYyBjb25zdCBTdHJpbmcgb3BlcmF0b3JSRSA9CiAgICAgIHInKD86W1wtKyovJSZ8Xl18XFtcXT0/fD09fH4vP3w8Wzw9XT98Pls+PV0/fHVuYXJ5LSknOwoKICAvLyBHcmFtbWFyIGlmIHN5bWJvbHM6CiAgLy8gICAgc3ltYm9sIDo6PSBxdWFsaWZpZWROYW1lIHwgPGVtcHR5PgogIC8vICAgIHF1YWxpZmllZE5hbWUgOjo9IHB1YmxpY0lkZW50aWZpZXIgJy4nIHF1YWxpZmllZE5hbWUgfCBuYW1lCiAgLy8gICAgbmFtZSA6Oj0gcHVibGljSWRlbnRpZmllcgogIC8vICAgICAgICAgICB8IHB1YmxpY0lkZW50aWZpZXIgJz0nCiAgLy8gICAgICAgICAgIHwgb3BlcmF0b3IKICAvLyB3aGVyZSBwdWJsaWNJZGVudGlmaWVyIGlzIGFueSB2YWxpZCBpZGVudGlmaWVyIChub3QgYSByZXNlcnZlZCB3b3JkKQogIC8vIHRoYXQgaXNuJ3QgcHJpdmF0ZSAoZG9lc24ndCBzdGFydCB3aXRoICdfJykuCiAgLy8KICAvLyBSYWlscm9hZCBkaWFncmFtIG9mIHRoZSBhY2NlcHRlZCBncmFtbWFyOgogIC8vCiAgLy8gICAgLy0tLS0tLS0tLS0tLS0tLS1cCiAgLy8gICAgfCAgICAgICAgICAgICAgICB8CiAgLy8gICAgfCAgICAgICAgICAvLVsuXS0vICAgICAvLVs9XS1cCiAgLy8gICAgXCAgICAgICAgIC8gICAgICAgICAgIC8gICAgICAgXAogIC8vICAtLS0tLS0tW2lkXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+CiAgLy8gICAgICAgXCAgICAgICAgICAgICAgICAgICAgIC8KICAvLyAgICAgICAgXC0tLS0tLVtvcGVyYXRvcl0tLS0vCiAgLy8gICAgICAgICAgICBcICAgICAgICAgICAgICAvCiAgLy8gICAgICAgICAgICAgXC0tLS0tLS0tLS0tLS8KICAvLwoKICAvKioKICAgKiBSZWdFeHAgdGhhdCB2YWxpZGF0ZXMgYSBub24tZW1wdHkgbm9uLXByaXZhdGUgc3ltYm9sLgogICAqCiAgICogVGhlIGVtcHR5IHN5bWJvbCBpcyBoYW5kbGVkIGJlZm9yZSB0aGlzIHJlZ2V4cCBpcyB1c2VkLCBhbmQgaXMgbm90CiAgICogYWNjZXB0ZWQuCiAgICovCiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBwdWJsaWNTeW1ib2xQYXR0ZXJuID0gbmV3IFJlZ0V4cCgKICAgICAgJ14oPzokb3BlcmF0b3JSRVwkfCRwdWJsaWNJZGVudGlmaWVyUkUoPzo9P1wkfFsuXSg/IVwkKSkpKz9cJCcpOwoKICAvLyBUaGUgZ3JhbW1hciBvZiBzeW1ib2xzIHRoYXQgbWF5IGJlIHByaXZhdGUgaXMgdGhlIHNhbWUgYXMgZm9yIHB1YmxpYwogIC8vIHN5bWJvbHMsIGV4Y2VwdCB0aGF0ICJwdWJsaWNJZGVudGlmaWVyIiBpcyByZXBsYWNlZCBieSAiaWRlbnRpZmllciIsCiAgLy8gd2hpY2ggbWF0Y2hlcyBhbnkgaWRlbnRpZmllci4KCiAgLyoqCiAgICogUmVnRXhwIHRoYXQgdmFsaWRhdGVzIGEgbm9uLWVtcHR5IHN5bWJvbC4KICAgKgogICAqIFByaXZhdGUgc3ltYm9scyBhcmUgYWNjZXB0ZWQuCiAgICoKICAgKiBUaGUgZW1wdHkgc3ltYm9sIGlzIGhhbmRsZWQgYmVmb3JlIHRoaXMgcmVnZXhwIGlzIHVzZWQsIGFuZCBpcyBub3QKICAgKiBhY2NlcHRlZC4KICAgKi8KICBzdGF0aWMgZmluYWwgUmVnRXhwIHN5bWJvbFBhdHRlcm4gPQogICAgICBuZXcgUmVnRXhwKCdeKD86JG9wZXJhdG9yUkVcJHwkaWRlbnRpZmllclJFKD86PT9cJHxbLl0oPyFcJCkpKSs/XCQnKTsKCiAgZXh0ZXJuYWwgY29uc3QgU3ltYm9sKFN0cmluZyBuYW1lKTsKCiAgLyoqCiAgICogUGxhdGZvcm0tcHJpdmF0ZSBtZXRob2QgdXNlZCBieSB0aGUgbWlycm9yIHN5c3RlbSB0byBjcmVhdGUKICAgKiBvdGhlcndpc2UgaW52YWxpZCBuYW1lcy4KICAgKi8KICBjb25zdCBTeW1ib2wudW52YWxpZGF0ZWQodGhpcy5fbmFtZSk7CgogIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IGRhcnQyanMuCiAgU3ltYm9sLnZhbGlkYXRlZChTdHJpbmcgbmFtZSkgOiB0aGlzLl9uYW1lID0gdmFsaWRhdGVQdWJsaWNTeW1ib2wobmFtZSk7CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpID0+IG90aGVyIGlzIFN5bWJvbCAmJiBfbmFtZSA9PSBvdGhlci5fbmFtZTsKCiAgZXh0ZXJuYWwgaW50IGdldCBoYXNoQ29kZTsKCiAgZXh0ZXJuYWwgdG9TdHJpbmcoKTsKCiAgLy8vIFBsYXRmb3JtLXByaXZhdGUgYWNjZXNzb3Igd2hpY2ggY2Fubm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgbGlicmFyaWVzLgogIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShTeW1ib2wgc3ltYm9sKSA9PiBzeW1ib2wuX25hbWU7CgogIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVQdWJsaWNTeW1ib2woU3RyaW5nIG5hbWUpIHsKICAgIGlmIChuYW1lLmlzRW1wdHkgfHwgcHVibGljU3ltYm9sUGF0dGVybi5oYXNNYXRjaChuYW1lKSkgcmV0dXJuIG5hbWU7CiAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdfJykpIHsKICAgICAgLy8gVGhlcmUgbWF5IGJlIG90aGVyIHByaXZhdGUgcGFydHMgaW4gYSBxdWFsaWZpZWQgbmFtZSB0aGFuIHRoZSBmaXJzdAogICAgICAvLyBvbmUsIGJ1dCB0aGlzIGlzIGEgY29tbW9uIGNhc2UgdGhhdCBkZXNlcnZlcyBhIHNwZWNpZmljIGVycm9yCiAgICAgIC8vIG1lc3NhZ2UuCiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCciJG5hbWUiIGlzIGEgcHJpdmF0ZSBpZGVudGlmaWVyJyk7CiAgICB9CiAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignIiRuYW1lIiBpcyBub3QgYSB2YWxpZCAocXVhbGlmaWVkKSBzeW1ib2wgbmFtZScpOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIHdoZXRoZXIgbmFtZSBpcyBhIHZhbGlkIHN5bWJvbCBuYW1lLgogICAqCiAgICogVGhpcyB0ZXN0IGFsbG93cyBib3RoIHByaXZhdGUgYW5kIG5vbi1wcml2YXRlIHN5bWJvbHMuCiAgICovCiAgc3RhdGljIGJvb2wgaXNWYWxpZFN5bWJvbChTdHJpbmcgbmFtZSkgewogICAgcmV0dXJuIChuYW1lLmlzRW1wdHkgfHwgc3ltYm9sUGF0dGVybi5oYXNNYXRjaChuYW1lKSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIGNvbXB1dGVVbm1hbmdsZWROYW1lKFN5bWJvbCBzeW1ib2wpOwp9CoCQAE5OPAEYAQRGNQNEQg4EJhYBBjQFNAYnTUpFJQY2BUUiBis8Bi8FRBkGJT0GPAVKSUwSBiM9ARkrRCImGkoyBS8FGxsnKCwjIiEgBQEGOwVIDwY4RwFKSiMBBi8FIwVIDwYmTAEmAQZBHgYoASBLAUYBHQEXAUw4ATRJIE1HEkIGTwQBBjEFPAYrOwQBPgIBGmRhcnQ6X2ludGVybmFsL3N5bWJvbC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvc3ltYm9sX3BhdGNoLmRhcnSGgy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJpbnRlcm5hbF9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBTeW1ib2wgewogIEBwYXRjaAogIGNvbnN0IFN5bWJvbChTdHJpbmcgbmFtZSkgOiB0aGlzLl9uYW1lID0gbmFtZTsKCiAgQHBhdGNoCiAgdG9TdHJpbmcoKSA9PiAnU3ltYm9sKCIke2NvbXB1dGVVbm1hbmdsZWROYW1lKHRoaXMpfSIpJzsKCiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBjb21wdXRlVW5tYW5nbGVkTmFtZShTeW1ib2wgc3ltYm9sKSB7CiAgICBTdHJpbmcgc3RyaW5nID0gU3ltYm9sLmdldE5hbWUoc3ltYm9sKTsKCiAgICAvLyBnZXQ6Zm9vIC0+IGZvbwogICAgLy8gc2V0OmZvbyAtPiBmb289CiAgICAvLyBnZXQ6X2Zvb0B4eHggLT4gX2ZvbwogICAgLy8gc2V0Ol9mb29AeHh4IC0+IF9mb289CiAgICAvLyBDbGFzcy5fY29uc3RydWN0b3JAeHh4IC0+IENsYXNzLl9jb25zdHJ1Y3RvcgogICAgLy8gX0NsYXNzQHh4eC5fY29uc3RydWN0b3JAeHh4IC0+IF9DbGFzcy5fY29uc3RydWN0b3IKICAgIC8vIGxpYi5fU0B4eHggd2l0aCBsaWIuX00xQHh4eCwgbGliLl9NMkB4eHggLT4gbGliLl9TIHdpdGggbGliLl9NMSwgbGliLl9NMgogICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGJvb2wgYWRkX3NldHRlcl9zdWZmaXggPSBmYWxzZTsKICAgIHZhciBwb3MgPSAwOwogICAgaWYgKHN0cmluZy5sZW5ndGggPj0gNCAmJiBzdHJpbmdbM10gPT0gJzonKSB7CiAgICAgIC8vIERyb3AgJ2dldDonIG9yICdzZXQ6JyBwcmVmaXguCiAgICAgIHBvcyA9IDQ7CiAgICAgIGlmIChzdHJpbmdbMF0gPT0gJ3MnKSB7CiAgICAgICAgYWRkX3NldHRlcl9zdWZmaXggPSB0cnVlOwogICAgICB9CiAgICB9CiAgICAvLyBTa2lwIGV2ZXJ5dGhpbmcgYmV0d2VlbiBBVCBhbmQgUEVSSU9ELCBTUEFDRSwgQ09NTUEgb3IgRU5ECiAgICBib29sIHNraXAgPSBmYWxzZTsKICAgIGZvciAoOyBwb3MgPCBzdHJpbmcubGVuZ3RoOyBwb3MrKykgewogICAgICB2YXIgY2hhciA9IHN0cmluZ1twb3NdOwogICAgICBpZiAoY2hhciA9PSAnQCcpIHsKICAgICAgICBza2lwID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcuJyB8fCBjaGFyID09ICcgJyB8fCBjaGFyID09ICcsJykgewogICAgICAgIHNraXAgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoIXNraXApIHsKICAgICAgICByZXN1bHQud3JpdGUoY2hhcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChhZGRfc2V0dGVyX3N1ZmZpeCkgewogICAgICByZXN1bHQud3JpdGUoJz0nKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIEBwYXRjaAogIGludCBnZXQgaGFzaENvZGUgewogICAgY29uc3QgYXJiaXRyYXJ5UHJpbWUgPSA2NjQ1OTc7CiAgICByZXR1cm4gMHgxZmZmZmZmZiAmIChhcmJpdHJhcnlQcmltZSAqIF9uYW1lLmhhc2hDb2RlKTsKICB9Cn0KPgBOTjwBIgEHDwkxAQk7AQk2LAEWFxwdNDpQLiQRMicPHiIIBkIXKR4ZFT4WCBMcCAYdGQYeBAEJFSM7BAIBJmRhcnQ6X2ludGVybmFsLXBhdGNoL3N5bWJvbF9wYXRjaC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvcHJpbnRfcGF0Y2guZGFydIL8Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImludGVybmFsX3BhdGNoLmRhcnQiOwoKLy8gQSBwcmludC1jbG9zdXJlIGdldHMgYSBTdHJpbmcgdGhhdCBzaG91bGQgYmUgcHJpbnRlZC4gSW4gZ2VuZXJhbCB0aGUKLy8gc3RyaW5nIGlzIGEgbGluZSwgYnV0IGl0IG1heSBjb250YWluICJcbiIgY2hhcmFjdGVycy4KdHlwZWRlZiB2b2lkIF9QcmludENsb3N1cmUoU3RyaW5nIGxpbmUpOwoKQHBhdGNoCnZvaWQgcHJpbnRUb0NvbnNvbGUoU3RyaW5nIGxpbmUpIHsKICBfcHJpbnRDbG9zdXJlKGxpbmUpOwp9Cgp2b2lkIF91bnN1cHBvcnRlZFByaW50KFN0cmluZyBsaW5lKSB7CiAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIidwcmludCcgaXMgbm90IHN1cHBvcnRlZCIpOwp9CgovLyBfcHJpbnRDbG9zdXJlIGNhbiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZW1iZWRkZXIgdG8gc3VwcGx5IGEgZGlmZmVyZW50Ci8vIHByaW50IGltcGxlbWVudGF0aW9uLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCl9QcmludENsb3N1cmUgX3ByaW50Q2xvc3VyZSA9IF91bnN1cHBvcnRlZFByaW50OwoZAE5OPAEiAUg5KQEHIxcCASY6AgFKGRoxASVkYXJ0Ol9pbnRlcm5hbC1wYXRjaC9wcmludF9wYXRjaC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pbnRlcm5hbC9wcmludC5kYXJ0gjUvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0Ll9pbnRlcm5hbDsKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHNldCBieSB0aGUgZmlyc3QgYWxsb2NhdGlvbiBvZiBhIFpvbmUuCiAqCiAqIE9uY2UgdGhlIGZ1bmN0aW9uIGlzIHNldCB0aGUgY29yZSBgcHJpbnRgIGZ1bmN0aW9uIGNhbGxzIHRoaXMgY2xvc3VyZSBpbnN0ZWFkCiAqIG9mIFtwcmludFRvQ29uc29sZV0uCiAqCiAqIFRoaXMgZGVjb3VwbGVzIHRoZSBjb3JlIGxpYnJhcnkgZnJvbSB0aGUgYXN5bmMgbGlicmFyeS4KICovCnZvaWQgRnVuY3Rpb24oU3RyaW5nKSBwcmludFRvWm9uZSA9IG51bGw7CgpleHRlcm5hbCB2b2lkIHByaW50VG9Db25zb2xlKFN0cmluZyBsaW5lKTsKEwBOTjwBGAEEOwNRGAM7BCoBKwEZZGFydDpfaW50ZXJuYWwvcHJpbnQuZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaXNvbGF0ZS9pc29sYXRlLmRhcnTAAHH9Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8qKgogKiBDb25jdXJyZW50IHByb2dyYW1taW5nIHVzaW5nIF9pc29sYXRlc186CiAqIGluZGVwZW5kZW50IHdvcmtlcnMgdGhhdCBhcmUgc2ltaWxhciB0byB0aHJlYWRzCiAqIGJ1dCBkb24ndCBzaGFyZSBtZW1vcnksCiAqIGNvbW11bmljYXRpbmcgb25seSB2aWEgbWVzc2FnZXMuCiAqCiAqIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgogKgogKiAgICAgaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOwogKgogKiB7QGNhdGVnb3J5IFZNfQogKi8KbGlicmFyeSBkYXJ0Lmlzb2xhdGU7CgppbXBvcnQgImRhcnQ6YXN5bmMiOwoKcGFydCAiY2FwYWJpbGl0eS5kYXJ0IjsKCi8qKgogKiBUaHJvd24gd2hlbiBhbiBpc29sYXRlIGNhbm5vdCBiZSBjcmVhdGVkLgogKi8KY2xhc3MgSXNvbGF0ZVNwYXduRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICAvKiogRXJyb3IgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUgc3Bhd24gb3BlcmF0aW9uLiAqLwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBJc29sYXRlU3Bhd25FeGNlcHRpb24odGhpcy5tZXNzYWdlKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSXNvbGF0ZVNwYXduRXhjZXB0aW9uOiAkbWVzc2FnZSI7Cn0KCi8qKgogKiBBbiBpc29sYXRlZCBEYXJ0IGV4ZWN1dGlvbiBjb250ZXh0LgogKgogKiBBbGwgRGFydCBjb2RlIHJ1bnMgaW4gYW4gaXNvbGF0ZSwgYW5kIGNvZGUgY2FuIGFjY2VzcyBjbGFzc2VzIGFuZCB2YWx1ZXMKICogb25seSBmcm9tIHRoZSBzYW1lIGlzb2xhdGUuIERpZmZlcmVudCBpc29sYXRlcyBjYW4gY29tbXVuaWNhdGUgYnkgc2VuZGluZwogKiB2YWx1ZXMgdGhyb3VnaCBwb3J0cyAoc2VlIFtSZWNlaXZlUG9ydF0sIFtTZW5kUG9ydF0pLgogKgogKiBBbiBgSXNvbGF0ZWAgb2JqZWN0IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGlzb2xhdGUsIHVzdWFsbHkgZGlmZmVyZW50IGZyb20KICogdGhlIGN1cnJlbnQgaXNvbGF0ZS4KICogSXQgcmVwcmVzZW50cywgYW5kIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wsIHRoZSBvdGhlciBpc29sYXRlLgogKgogKiBXaGVuIHNwYXduaW5nIGEgbmV3IGlzb2xhdGUsIHRoZSBzcGF3bmluZyBpc29sYXRlIHJlY2VpdmVzIGFuIGBJc29sYXRlYAogKiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXcgaXNvbGF0ZSB3aGVuIHRoZSBzcGF3biBvcGVyYXRpb24gc3VjY2VlZHMuCiAqCiAqIElzb2xhdGVzIHJ1biBjb2RlIGluIGl0cyBvd24gZXZlbnQgbG9vcCwgYW5kIGVhY2ggZXZlbnQgbWF5IHJ1biBzbWFsbGVyIHRhc2tzCiAqIGluIGEgbmVzdGVkIG1pY3JvdGFzayBxdWV1ZS4KICoKICogQW4gYElzb2xhdGVgIG9iamVjdCBhbGxvd3Mgb3RoZXIgaXNvbGF0ZXMgdG8gY29udHJvbCB0aGUgZXZlbnQgbG9vcAogKiBvZiB0aGUgaXNvbGF0ZSB0aGF0IGl0IHJlcHJlc2VudHMsIGFuZCB0byBpbnNwZWN0IHRoZSBpc29sYXRlLAogKiBmb3IgZXhhbXBsZSBieSBwYXVzaW5nIHRoZSBpc29sYXRlIG9yIGJ5IGdldHRpbmcgZXZlbnRzIHdoZW4gdGhlIGlzb2xhdGUKICogaGFzIGFuIHVuY2F1Z2h0IGVycm9yLgogKgogKiBUaGUgW2NvbnRyb2xQb3J0XSBpZGVudGlmaWVzIGFuZCBnaXZlcyBhY2Nlc3MgdG8gY29udHJvbGxpbmcgdGhlIGlzb2xhdGUsCiAqIGFuZCB0aGUgW3BhdXNlQ2FwYWJpbGl0eV0gYW5kIFt0ZXJtaW5hdGVDYXBhYmlsaXR5XSBndWFyZCBhY2Nlc3MKICogdG8gc29tZSBjb250cm9sIG9wZXJhdGlvbnMuCiAqIEZvciBleGFtcGxlLCBjYWxsaW5nIFtwYXVzZV0gb24gYW4gYElzb2xhdGVgIG9iamVjdCBjcmVhdGVkIHdpdGhvdXQgYQogKiBbcGF1c2VDYXBhYmlsaXR5XSwgaGFzIG5vIGVmZmVjdC4KICoKICogVGhlIGBJc29sYXRlYCBvYmplY3QgcHJvdmlkZWQgYnkgYSBzcGF3biBvcGVyYXRpb24gd2lsbCBoYXZlIHRoZQogKiBjb250cm9sIHBvcnQgYW5kIGNhcGFiaWxpdGllcyBuZWVkZWQgdG8gY29udHJvbCB0aGUgaXNvbGF0ZS4KICogTmV3IGlzb2xhdGUgb2JqZWN0cyBjYW4gYmUgY3JlYXRlZCB3aXRob3V0IHNvbWUgb2YgdGhlc2UgY2FwYWJpbGl0aWVzCiAqIGlmIG5lY2Vzc2FyeSwgdXNpbmcgdGhlIFtJc29sYXRlLklzb2xhdGVdIGNvbnN0cnVjdG9yLgogKgogKiBBbiBgSXNvbGF0ZWAgb2JqZWN0IGNhbm5vdCBiZSBzZW50IG92ZXIgYSBgU2VuZFBvcnRgLCBidXQgdGhlIGNvbnRyb2wgcG9ydAogKiBhbmQgY2FwYWJpbGl0aWVzIGNhbiBiZSBzZW50LCBhbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uaW5nCiAqIGBJc29sYXRlYCBvYmplY3QgaW4gdGhlIHJlY2VpdmluZyBwb3J0J3MgaXNvbGF0ZS4KICovCmNsYXNzIElzb2xhdGUgewogIC8qKiBBcmd1bWVudCB0byBgcGluZ2AgYW5kIGBraWxsYDogQXNrIGZvciBpbW1lZGlhdGUgYWN0aW9uLiAqLwogIHN0YXRpYyBjb25zdCBpbnQgaW1tZWRpYXRlID0gMDsKICAvKiogQXJndW1lbnQgdG8gYHBpbmdgIGFuZCBga2lsbGA6IEFzayBmb3IgYWN0aW9uIGJlZm9yZSB0aGUgbmV4dCBldmVudC4gKi8KICBzdGF0aWMgY29uc3QgaW50IGJlZm9yZU5leHRFdmVudCA9IDE7CgogIC8qKgogICAqIENvbnRyb2wgcG9ydCB1c2VkIHRvIHNlbmQgY29udHJvbCBtZXNzYWdlcyB0byB0aGUgaXNvbGF0ZS4KICAgKgogICAqIFRoZSBjb250cm9sIHBvcnQgaWRlbnRpZmllcyB0aGUgaXNvbGF0ZS4KICAgKgogICAqIEFuIGBJc29sYXRlYCBvYmplY3QgYWxsb3dzIHNlbmRpbmcgY29udHJvbCBtZXNzYWdlcwogICAqIHRocm91Z2ggdGhlIGNvbnRyb2wgcG9ydC4KICAgKgogICAqIFNvbWUgY29udHJvbCBtZXNzYWdlcyByZXF1aXJlIGEgc3BlY2lmaWMgY2FwYWJpbGl0eSB0byBiZSBwYXNzZWQgYWxvbmcKICAgKiB3aXRoIHRoZSBtZXNzYWdlIChzZWUgW3BhdXNlQ2FwYWJpbGl0eV0gYW5kIFt0ZXJtaW5hdGVDYXBhYmlsaXR5XSksCiAgICogb3RoZXJ3aXNlIHRoZSBtZXNzYWdlIGlzIGlnbm9yZWQgYnkgdGhlIGlzb2xhdGUuCiAgICovCiAgZmluYWwgU2VuZFBvcnQgY29udHJvbFBvcnQ7CgogIC8qKgogICAqIENhcGFiaWxpdHkgZ3JhbnRpbmcgdGhlIGFiaWxpdHkgdG8gcGF1c2UgdGhlIGlzb2xhdGUuCiAgICoKICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgcmVxdWlyZWQgYnkgW3BhdXNlXS4KICAgKiBJZiB0aGUgY2FwYWJpbGl0eSBpcyBgbnVsbGAsIG9yIGlmIGl0IGlzIG5vdCB0aGUgY29ycmVjdCBwYXVzZSBjYXBhYmlsaXR5CiAgICogb2YgdGhlIGlzb2xhdGUgaWRlbnRpZmllZCBieSBbY29udHJvbFBvcnRdLAogICAqIHRoZW4gY2FsbHMgdG8gW3BhdXNlXSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAqCiAgICogSWYgdGhlIGlzb2xhdGUgaXMgc3Bhd25lZCBpbiBhIHBhdXNlZCBzdGF0ZSwgdXNlIHRoaXMgY2FwYWJpbGl0eSBhcwogICAqIGFyZ3VtZW50IHRvIHRoZSBbcmVzdW1lXSBtZXRob2QgaW4gb3JkZXIgdG8gcmVzdW1lIHRoZSBwYXVzZWQgaXNvbGF0ZS4KICAgKi8KICBmaW5hbCBDYXBhYmlsaXR5IHBhdXNlQ2FwYWJpbGl0eTsKCiAgLyoqCiAgICogQ2FwYWJpbGl0eSBncmFudGluZyB0aGUgYWJpbGl0eSB0byB0ZXJtaW5hdGUgdGhlIGlzb2xhdGUuCiAgICoKICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgcmVxdWlyZWQgYnkgW2tpbGxdIGFuZCBbc2V0RXJyb3JzRmF0YWxdLgogICAqIElmIHRoZSBjYXBhYmlsaXR5IGlzIGBudWxsYCwgb3IgaWYgaXQgaXMgbm90IHRoZSBjb3JyZWN0IHRlcm1pbmF0aW9uCiAgICogY2FwYWJpbGl0eSBvZiB0aGUgaXNvbGF0ZSBpZGVudGlmaWVkIGJ5IFtjb250cm9sUG9ydF0sCiAgICogdGhlbiBjYWxscyB0byB0aG9zZSBtZXRob2RzIHdpbGwgaGF2ZSBubyBlZmZlY3QuCiAgICovCiAgZmluYWwgQ2FwYWJpbGl0eSB0ZXJtaW5hdGVDYXBhYmlsaXR5OwoKICAvKioKICAgKiBUaGUgbmFtZSBvZiB0aGUgW0lzb2xhdGVdIGRpc3BsYXllZCBmb3IgZGVidWcgcHVycG9zZXMuCiAgICoKICAgKiBUaGlzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGBkZWJ1Z05hbWVgIHBhcmFtZXRlciBpbiBbc3Bhd25dIGFuZCBbc3Bhd25VcmldLgogICAqCiAgICogVGhpcyBuYW1lIGRvZXMgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGlzb2xhdGUuIE11bHRpcGxlIGlzb2xhdGVzIGluIHRoZQogICAqIHNhbWUgcHJvY2VzcyBtYXkgaGF2ZSB0aGUgc2FtZSBgZGVidWdOYW1lYC4KICAgKgogICAqIEZvciBhIGdpdmVuIGlzb2xhdGUsIHRoaXMgdmFsdWUgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CiAgICogYERhcnRfRGVidWdOYW1lYCBpbiB0aGUgQyBlbWJlZGRpbmcgQVBJIGFuZCB0aGUgYGRlYnVnTmFtZWAgcHJvcGVydHkgaW4KICAgKiBbSXNvbGF0ZU1pcnJvcl0uCiAgICovCiAgZXh0ZXJuYWwgU3RyaW5nIGdldCBkZWJ1Z05hbWU7CgogIC8qKgogICAqIENyZWF0ZSBhIG5ldyBbSXNvbGF0ZV0gb2JqZWN0IHdpdGggYSByZXN0cmljdGVkIHNldCBvZiBjYXBhYmlsaXRpZXMuCiAgICoKICAgKiBUaGUgcG9ydCBzaG91bGQgYmUgYSBjb250cm9sIHBvcnQgZm9yIGFuIGlzb2xhdGUsIGFzIHRha2VuIGZyb20KICAgKiBhbm90aGVyIGBJc29sYXRlYCBvYmplY3QuCiAgICoKICAgKiBUaGUgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSB0aGUgc3Vic2V0IG9mIHRoZSBjYXBhYmlsaXRpZXMgdGhhdCBhcmUKICAgKiBhdmFpbGFibGUgdG8gdGhlIG9yaWdpbmFsIGlzb2xhdGUuCiAgICogQ2FwYWJpbGl0aWVzIG9mIGFuIGlzb2xhdGUgYXJlIGxvY2tlZCB0byB0aGF0IGlzb2xhdGUsIGFuZCBoYXZlIG5vIGVmZmVjdAogICAqIGFueXdoZXJlIGVsc2UsIHNvIHRoZSBjYXBhYmlsaXRpZXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgc2FtZSBpc29sYXRlIGFzCiAgICogdGhlIGNvbnRyb2wgcG9ydC4KICAgKgogICAqIENhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIGFuIFtJc29sYXRlXSBvYmplY3QgZnJvbSBhIGNvbnRyb2wgcG9ydCwgYW5kCiAgICogYW55IGF2YWlsYWJsZSBjYXBhYmlsaXRpZXMsIHRoYXQgaGF2ZSBiZWVuIHNlbnQgdGhyb3VnaCBhIFtTZW5kUG9ydF0uCiAgICoKICAgKiBFeGFtcGxlOgogICAqIGBgYGRhcnQKICAgKiBJc29sYXRlIGlzb2xhdGUgPSBmaW5kU29tZUlzb2xhdGUoKTsKICAgKiBJc29sYXRlIHJlc3RyaWN0ZWRJc29sYXRlID0gbmV3IElzb2xhdGUoaXNvbGF0ZS5jb250cm9sUG9ydCk7CiAgICogdW50cnVzdGVkQ29kZShyZXN0cmljdGVkSXNvbGF0ZSk7CiAgICogYGBgCiAgICogVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSBuZXcgYElzb2xhdGVgIG9iamVjdCB0aGF0IGNhbm5vdCBiZSB1c2VkIHRvCiAgICogcGF1c2Ugb3IgdGVybWluYXRlIHRoZSBpc29sYXRlLiBBbGwgdGhlIHVudHJ1c3RlZCBjb2RlIGNhbiBkbyBpcyB0bwogICAqIGluc3BlY3QgdGhlIGlzb2xhdGUgYW5kIHNlZSB1bmNhdWdodCBlcnJvcnMgb3Igd2hlbiBpdCB0ZXJtaW5hdGVzLgogICAqLwogIElzb2xhdGUodGhpcy5jb250cm9sUG9ydCwge3RoaXMucGF1c2VDYXBhYmlsaXR5LCB0aGlzLnRlcm1pbmF0ZUNhcGFiaWxpdHl9KTsKCiAgLyoqCiAgICogUmV0dXJuIGFuIFtJc29sYXRlXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGlzb2xhdGUuCiAgICoKICAgKiBUaGUgY3VycmVudCBpc29sYXRlIGZvciBjb2RlIHVzaW5nIFtjdXJyZW50XQogICAqIGlzIHRoZSBpc29sYXRlIHJ1bm5pbmcgdGhlIGNvZGUuCiAgICoKICAgKiBUaGUgaXNvbGF0ZSBvYmplY3QgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdGllcyByZXF1aXJlZCB0byBpbnNwZWN0LAogICAqIHBhdXNlIG9yIGtpbGwgdGhlIGlzb2xhdGUsIGFuZCBhbGxvd3MgZ3JhbnRpbmcgdGhlc2UgY2FwYWJpbGl0aWVzCiAgICogdG8gb3RoZXJzLgogICAqCiAgICogSXQgaXMgcG9zc2libGUgdG8gcGF1c2UgdGhlIGN1cnJlbnQgaXNvbGF0ZSwgYnV0IGRvaW5nIHNvICp3aXRob3V0KgogICAqIGZpcnN0IHBhc3NpbmcgdGhlIGFiaWxpdHkgdG8gcmVzdW1lIGl0IGFnYWluIHRvIGFub3RoZXIgaXNvbGF0ZSwKICAgKiBpcyBhIHN1cmUgd2F5IHRvIGhhbmcgeW91ciBwcm9ncmFtLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBJc29sYXRlIGdldCBjdXJyZW50OwoKICAvKioKICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHBhY2thZ2UgY29uZmlndXJhdGlvbiBvZiB0aGUgY3VycmVudCBpc29sYXRlLCBpZiBhbnkuCiAgICoKICAgKiBUaGlzIGdldHRlciByZXR1cm5zIGBudWxsYCwgYXMgdGhlIGBwYWNrYWdlcy9gIGRpcmVjdG9yeSBpcyBub3Qgc3VwcG9ydGVkCiAgICogaW4gRGFydCAyLgogICAqLwogIEBEZXByZWNhdGVkKCdwYWNrYWdlcy8gZGlyZWN0b3J5IHJlc29sdXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBEYXJ0IDIuJykKICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFVyaT4gZ2V0IHBhY2thZ2VSb290OwoKICAvKioKICAgKiBUaGUgcGFja2FnZSByb290IG9mIHRoZSBjdXJyZW50IGlzb2xhdGUsIGlmIGFueS4KICAgKgogICAqIElmIHRoZSBpc29sYXRlIGlzIHVzaW5nIGEgW3BhY2thZ2VSb290XSBvciB0aGUgaXNvbGF0ZSBoYXMgbm90IGJlZW4KICAgKiBzZXR1cCBmb3IgcGFja2FnZSByZXNvbHV0aW9uLCB0aGlzIGdldHRlciByZXR1cm5zIGBudWxsYCwgb3RoZXJ3aXNlIGl0CiAgICogcmV0dXJucyB0aGUgcGFja2FnZSBjb25maWcgVVJJLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8VXJpPiBnZXQgcGFja2FnZUNvbmZpZzsKCiAgLyoqCiAgICogTWFwcyBhIHBhY2thZ2U6IFVSSSB0byBhIG5vbi1wYWNrYWdlIFVyaS4KICAgKgogICAqIElmIHRoZXJlIGlzIG5vIHZhbGlkIG1hcHBpbmcgZnJvbSB0aGUgcGFja2FnZTogVVJJIGluIHRoZSBjdXJyZW50CiAgICogaXNvbGF0ZSwgdGhlbiB0aGlzIGNhbGwgcmV0dXJucyBgbnVsbGAuIE5vbi1wYWNrYWdlOiBVUklzIGFyZQogICAqIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxVcmk+IHJlc29sdmVQYWNrYWdlVXJpKFVyaSBwYWNrYWdlVXJpKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbmQgc3Bhd25zIGFuIGlzb2xhdGUgdGhhdCBzaGFyZXMgdGhlIHNhbWUgY29kZSBhcyB0aGUgY3VycmVudAogICAqIGlzb2xhdGUuCiAgICoKICAgKiBUaGUgYXJndW1lbnQgW2VudHJ5UG9pbnRdIHNwZWNpZmllcyB0aGUgaW5pdGlhbCBmdW5jdGlvbiB0byBjYWxsCiAgICogaW4gdGhlIHNwYXduZWQgaXNvbGF0ZS4KICAgKiBUaGUgZW50cnktcG9pbnQgZnVuY3Rpb24gaXMgaW52b2tlZCBpbiB0aGUgbmV3IGlzb2xhdGUgd2l0aCBbbWVzc2FnZV0KICAgKiBhcyB0aGUgb25seSBhcmd1bWVudC4KICAgKgogICAqIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGEgdG9wLWxldmVsIGZ1bmN0aW9uIG9yIGEgc3RhdGljIG1ldGhvZAogICAqIHRoYXQgY2FuIGJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LAogICAqIHRoYXQgaXMsIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGZ1bmN0aW9uIHZhbHVlCiAgICogd2hpY2ggYWNjZXB0cyBhdCBsZWFzdCBvbmUgcG9zaXRpb25hbCBwYXJhbWV0ZXIKICAgKiBhbmQgaGFzIGF0IG1vc3Qgb25lIHJlcXVpcmVkIHBvc2l0aW9uYWwgcGFyYW1ldGVyLgogICAqIFRoZSBmdW5jdGlvbiBtYXkgYWNjZXB0IGFueSBudW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycywKICAgKiBhcyBsb25nIGFzIGl0ICpjYW4qIGJlIGNhbGxlZCB3aXRoIGp1c3QgYSBzaW5nbGUgYXJndW1lbnQuCiAgICogVGhlIGZ1bmN0aW9uIG11c3Qgbm90IGJlIHRoZSB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGV4cHJlc3Npb24KICAgKiBvciBhbiBpbnN0YW5jZSBtZXRob2QgdGVhci1vZmYuCiAgICoKICAgKiBVc3VhbGx5IHRoZSBpbml0aWFsIFttZXNzYWdlXSBjb250YWlucyBhIFtTZW5kUG9ydF0gc28KICAgKiB0aGF0IHRoZSBzcGF3bmVyIGFuZCBzcGF3bmVlIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIuCiAgICoKICAgKiBJZiB0aGUgW3BhdXNlZF0gcGFyYW1ldGVyIGlzIHNldCB0byBgdHJ1ZWAsCiAgICogdGhlIGlzb2xhdGUgd2lsbCBzdGFydCB1cCBpbiBhIHBhdXNlZCBzdGF0ZSwKICAgKiBqdXN0IGJlZm9yZSBjYWxsaW5nIHRoZSBbZW50cnlQb2ludF0gZnVuY3Rpb24gd2l0aCB0aGUgW21lc3NhZ2VdLAogICAqIGFzIGlmIGJ5IGFuIGluaXRpYWwgY2FsbCBvZiBgaXNvbGF0ZS5wYXVzZShpc29sYXRlLnBhdXNlQ2FwYWJpbGl0eSlgLgogICAqIFRvIHJlc3VtZSB0aGUgaXNvbGF0ZSwgY2FsbCBgaXNvbGF0ZS5yZXN1bWUoaXNvbGF0ZS5wYXVzZUNhcGFiaWxpdHkpYC4KICAgKgogICAqIElmIHRoZSBbZXJyb3JzQXJlRmF0YWxdLCBbb25FeGl0XSBhbmQvb3IgW29uRXJyb3JdIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLAogICAqIHRoZSBpc29sYXRlIHdpbGwgYWN0IGFzIGlmLCByZXNwZWN0aXZlbHksIFtzZXRFcnJvcnNGYXRhbF0sCiAgICogW2FkZE9uRXhpdExpc3RlbmVyXSBhbmQgW2FkZEVycm9yTGlzdGVuZXJdIHdlcmUgY2FsbGVkIHdpdGggdGhlCiAgICogY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgYW5kIHdhcyBwcm9jZXNzZWQgYmVmb3JlIHRoZSBpc29sYXRlIHN0YXJ0cwogICAqIHJ1bm5pbmcuCiAgICoKICAgKiBJZiBbZGVidWdOYW1lXSBpcyBwcm92aWRlZCwgdGhlIHNwYXduZWQgW0lzb2xhdGVdIHdpbGwgYmUgaWRlbnRpZmlhYmxlIGJ5CiAgICogdGhpcyBuYW1lIGluIGRlYnVnZ2VycyBhbmQgbG9nZ2luZy4KICAgKgogICAqIElmIFtlcnJvcnNBcmVGYXRhbF0gaXMgb21pdHRlZCwgdGhlIHBsYXRmb3JtIG1heSBjaG9vc2UgYSBkZWZhdWx0IGJlaGF2aW9yCiAgICogb3IgaW5oZXJpdCB0aGUgY3VycmVudCBpc29sYXRlJ3MgYmVoYXZpb3IuCiAgICoKICAgKiBZb3UgY2FuIGFsc28gY2FsbCB0aGUgW3NldEVycm9yc0ZhdGFsXSwgW2FkZE9uRXhpdExpc3RlbmVyXSBhbmQKICAgKiBbYWRkRXJyb3JMaXN0ZW5lcl0gbWV0aG9kcyBvbiB0aGUgcmV0dXJuZWQgaXNvbGF0ZSwgYnV0IHVubGVzcyB0aGUKICAgKiBpc29sYXRlIHdhcyBzdGFydGVkIGFzIFtwYXVzZWRdLCBpdCBtYXkgYWxyZWFkeSBoYXZlIHRlcm1pbmF0ZWQKICAgKiBiZWZvcmUgdGhvc2UgbWV0aG9kcyBjYW4gY29tcGxldGUuCiAgICoKICAgKiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIHdpbGwgY29tcGxldGUgd2l0aCBhbiBbSXNvbGF0ZV0gaW5zdGFuY2UgaWYgdGhlCiAgICogc3Bhd25pbmcgc3VjY2VlZGVkLiBJdCB3aWxsIGNvbXBsZXRlIHdpdGggYW4gZXJyb3Igb3RoZXJ3aXNlLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8SXNvbGF0ZT4gc3Bhd248VD4oCiAgICAgIHZvaWQgZW50cnlQb2ludChUIG1lc3NhZ2UpLCBUIG1lc3NhZ2UsCiAgICAgIHtib29sIHBhdXNlZDogZmFsc2UsCiAgICAgIGJvb2wgZXJyb3JzQXJlRmF0YWwsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgU3RyaW5nIGRlYnVnTmFtZX0pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuZCBzcGF3bnMgYW4gaXNvbGF0ZSB0aGF0IHJ1bnMgdGhlIGNvZGUgZnJvbSB0aGUgbGlicmFyeSB3aXRoCiAgICogdGhlIHNwZWNpZmllZCBVUkkuCiAgICoKICAgKiBUaGUgaXNvbGF0ZSBzdGFydHMgZXhlY3V0aW5nIHRoZSB0b3AtbGV2ZWwgYG1haW5gIGZ1bmN0aW9uIG9mIHRoZSBsaWJyYXJ5CiAgICogd2l0aCB0aGUgZ2l2ZW4gVVJJLgogICAqCiAgICogVGhlIHRhcmdldCBgbWFpbmAgbXVzdCBiZSBjYWxsYWJsZSB3aXRoIHplcm8sIG9uZSBvciB0d28gYXJndW1lbnRzLgogICAqIEV4YW1wbGVzOgogICAqCiAgICogKiBgbWFpbigpYAogICAqICogYG1haW4oYXJncylgCiAgICogKiBgbWFpbihhcmdzLCBtZXNzYWdlKWAKICAgKgogICAqIFdoZW4gcHJlc2VudCwgdGhlIHBhcmFtZXRlciBgYXJnc2AgaXMgc2V0IHRvIHRoZSBwcm92aWRlZCBbYXJnc10gbGlzdC4KICAgKiBXaGVuIHByZXNlbnQsIHRoZSBwYXJhbWV0ZXIgYG1lc3NhZ2VgIGlzIHNldCB0byB0aGUgaW5pdGlhbCBbbWVzc2FnZV0uCiAgICoKICAgKiBJZiB0aGUgW3BhdXNlZF0gcGFyYW1ldGVyIGlzIHNldCB0byBgdHJ1ZWAsCiAgICogdGhlIGlzb2xhdGUgd2lsbCBzdGFydCB1cCBpbiBhIHBhdXNlZCBzdGF0ZSwKICAgKiBhcyBpZiBieSBhbiBpbml0aWFsIGNhbGwgb2YgYGlzb2xhdGUucGF1c2UoaXNvbGF0ZS5wYXVzZUNhcGFiaWxpdHkpYC4KICAgKiBUbyByZXN1bWUgdGhlIGlzb2xhdGUsIGNhbGwgYGlzb2xhdGUucmVzdW1lKGlzb2xhdGUucGF1c2VDYXBhYmlsaXR5KWAuCiAgICoKICAgKiBJZiB0aGUgW2Vycm9yc0FyZUZhdGFsXSwgW29uRXhpdF0gYW5kL29yIFtvbkVycm9yXSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwKICAgKiB0aGUgaXNvbGF0ZSB3aWxsIGFjdCBhcyBpZiwgcmVzcGVjdGl2ZWx5LCBbc2V0RXJyb3JzRmF0YWxdLAogICAqIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kIFthZGRFcnJvckxpc3RlbmVyXSB3ZXJlIGNhbGxlZCB3aXRoIHRoZQogICAqIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGFuZCB3YXMgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgaXNvbGF0ZSBzdGFydHMKICAgKiBydW5uaW5nLgogICAqCiAgICogWW91IGNhbiBhbHNvIGNhbGwgdGhlIFtzZXRFcnJvcnNGYXRhbF0sIFthZGRPbkV4aXRMaXN0ZW5lcl0gYW5kCiAgICogW2FkZEVycm9yTGlzdGVuZXJdIG1ldGhvZHMgb24gdGhlIHJldHVybmVkIGlzb2xhdGUsIGJ1dCB1bmxlc3MgdGhlCiAgICogaXNvbGF0ZSB3YXMgc3RhcnRlZCBhcyBbcGF1c2VkXSwgaXQgbWF5IGFscmVhZHkgaGF2ZSB0ZXJtaW5hdGVkCiAgICogYmVmb3JlIHRob3NlIG1ldGhvZHMgY2FuIGNvbXBsZXRlLgogICAqCiAgICogSWYgdGhlIFtjaGVja2VkXSBwYXJhbWV0ZXIgaXMgc2V0IHRvIGB0cnVlYCBvciBgZmFsc2VgLAogICAqIHRoZSBuZXcgaXNvbGF0ZSB3aWxsIHJ1biBjb2RlIGluIGNoZWNrZWQgbW9kZSAoZW5hYmxpbmcgYXNzZXJ0cyBhbmQgdHlwZQogICAqIGNoZWNrcyksIHJlc3BlY3RpdmVseSBpbiBwcm9kdWN0aW9uIG1vZGUgKGRpc2FibGluZyBhc3NlcnRzIGFuZCB0eXBlCiAgICogY2hlY2tzKSwgaWYgcG9zc2libGUuIElmIHRoZSBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIG5ldyBpc29sYXRlIHdpbGwKICAgKiBpbmhlcml0IHRoZSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGlzb2xhdGUuCiAgICoKICAgKiBJbiBEYXJ0MiBzdHJvbmcgbW9kZSwgdGhlIGBjaGVja2VkYCBwYXJhbWV0ZXIgb25seSBjb250cm9scyBhc3NlcnRzLCBidXQKICAgKiBub3QgdHlwZSBjaGVja3MuCiAgICoKICAgKiBJdCBtYXkgbm90IGFsd2F5cyBiZSBwb3NzaWJsZSB0byBob25vciB0aGUgYGNoZWNrZWRgIHBhcmFtZXRlci4KICAgKiBJZiB0aGUgaXNvbGF0ZSBjb2RlIHdhcyBwcmUtY29tcGlsZWQsIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gY2hhbmdlCiAgICogdGhlIGNoZWNrZWQgbW9kZSBzZXR0aW5nIGR5bmFtaWNhbGx5LgogICAqIEluIHRoYXQgY2FzZSwgdGhlIGBjaGVja2VkYCBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgKgogICAqIFdBUk5JTkc6IFRoZSBbY2hlY2tlZF0gcGFyYW1ldGVyIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBhbGwgcGxhdGZvcm1zIHlldC4KICAgKgogICAqIElmIHRoZSBbcGFja2FnZUNvbmZpZ10gcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGVuIGl0IGlzIHVzZWQgdG8gZmluZCB0aGUKICAgKiBsb2NhdGlvbiBvZiBhIHBhY2thZ2UgcmVzb2x1dGlvbiBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBzcGF3bmVkCiAgICogaXNvbGF0ZS4KICAgKgogICAqIElmIHRoZSBbYXV0b21hdGljUGFja2FnZVJlc29sdXRpb25dIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgdGhlbiB0aGUKICAgKiBsb2NhdGlvbiBvZiB0aGUgcGFja2FnZSBzb3VyY2VzIGluIHRoZSBzcGF3bmVkIGlzb2xhdGUgaXMgYXV0b21hdGljYWxseQogICAqIGRldGVybWluZWQuCiAgICoKICAgKiBUaGUgW2Vudmlyb25tZW50XSBpcyBhIG1hcHBpbmcgZnJvbSBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hpY2ggdGhlCiAgICogc3Bhd25lZCBpc29sYXRlIHVzZXMgd2hlbiBsb29raW5nIHVwIFtTdHJpbmcuZnJvbUVudmlyb25tZW50XSB2YWx1ZXMuCiAgICogVGhlIHN5c3RlbSBtYXkgYWRkIGl0cyBvd24gZW50cmllcyB0byBlbnZpcm9ubWVudCBhcyB3ZWxsLgogICAqIElmIGBlbnZpcm9ubWVudGAgaXMgb21pdHRlZCwgdGhlIHNwYXduZWQgaXNvbGF0ZSBoYXMgdGhlIHNhbWUgZW52aXJvbm1lbnQKICAgKiBkZWNsYXJhdGlvbnMgYXMgdGhlIHNwYXduaW5nIGlzb2xhdGUuCiAgICoKICAgKiBXQVJOSU5HOiBUaGUgW2Vudmlyb25tZW50XSBwYXJhbWV0ZXIgaXMgbm90IGltcGxlbWVudGVkIG9uIGFsbAogICAqIHBsYXRmb3JtcyB5ZXQuCiAgICoKICAgKiBJZiBbZGVidWdOYW1lXSBpcyBwcm92aWRlZCwgdGhlIHNwYXduZWQgW0lzb2xhdGVdIHdpbGwgYmUgaWRlbnRpZmlhYmxlIGJ5CiAgICogdGhpcyBuYW1lIGluIGRlYnVnZ2VycyBhbmQgbG9nZ2luZy4KICAgKgogICAqIFJldHVybnMgYSBmdXR1cmUgdGhhdCB3aWxsIGNvbXBsZXRlIHdpdGggYW4gW0lzb2xhdGVdIGluc3RhbmNlIGlmIHRoZQogICAqIHNwYXduaW5nIHN1Y2NlZWRlZC4gSXQgd2lsbCBjb21wbGV0ZSB3aXRoIGFuIGVycm9yIG90aGVyd2lzZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPElzb2xhdGU+IHNwYXduVXJpKAogICAgICBVcmkgdXJpLAogICAgICBMaXN0PFN0cmluZz4gYXJncywKICAgICAgdmFyIG1lc3NhZ2UsCiAgICAgIHtib29sIHBhdXNlZDogZmFsc2UsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgYm9vbCBlcnJvcnNBcmVGYXRhbCwKICAgICAgYm9vbCBjaGVja2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBARGVwcmVjYXRlZCgnVGhlIHBhY2thZ2VzLyBkaXIgaXMgbm90IHN1cHBvcnRlZCBpbiBEYXJ0IDInKQogICAgICAgICAgVXJpIHBhY2thZ2VSb290LAogICAgICBVcmkgcGFja2FnZUNvbmZpZywKICAgICAgYm9vbCBhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbjogZmFsc2UsCiAgICAgIFN0cmluZyBkZWJ1Z05hbWV9KTsKCiAgLyoqCiAgICogUmVxdWVzdHMgdGhlIGlzb2xhdGUgdG8gcGF1c2UuCiAgICoKICAgKiBXaGVuIHRoZSBpc29sYXRlIHJlY2VpdmVzIHRoZSBwYXVzZSBjb21tYW5kLCBpdCBzdG9wcwogICAqIHByb2Nlc3NpbmcgZXZlbnRzIGZyb20gdGhlIGV2ZW50IGxvb3AgcXVldWUuCiAgICogSXQgbWF5IHN0aWxsIGFkZCBuZXcgZXZlbnRzIHRvIHRoZSBxdWV1ZSBpbiByZXNwb25zZSB0bywgZS5nLiwgdGltZXJzCiAgICogb3IgcmVjZWl2ZS1wb3J0IG1lc3NhZ2VzLiBXaGVuIHRoZSBpc29sYXRlIGlzIHJlc3VtZWQsCiAgICogaXQgc3RhcnRzIGhhbmRsaW5nIHRoZSBhbHJlYWR5IGVucXVldWVkIGV2ZW50cy4KICAgKgogICAqIFRoZSBwYXVzZSByZXF1ZXN0IGlzIHNlbnQgdGhyb3VnaCB0aGUgaXNvbGF0ZSdzIGNvbW1hbmQgcG9ydCwKICAgKiB3aGljaCBieXBhc3NlcyB0aGUgcmVjZWl2aW5nIGlzb2xhdGUncyBldmVudCBsb29wLgogICAqIFRoZSBwYXVzZSB0YWtlcyBlZmZlY3Qgd2hlbiBpdCBpcyByZWNlaXZlZCwgcGF1c2luZyB0aGUgZXZlbnQgbG9vcAogICAqIGFzIGl0IGlzIGF0IHRoYXQgdGltZS4KICAgKgogICAqIFRoZSBbcmVzdW1lQ2FwYWJpbGl0eV0gaXMgdXNlZCB0byBpZGVudGl0eSB0aGUgcGF1c2UsCiAgICogYW5kIG11c3QgYmUgdXNlZCBhZ2FpbiB0byBlbmQgdGhlIHBhdXNlIHVzaW5nIFtyZXN1bWVdLgogICAqIElmIFtyZXN1bWVDYXBhYmlsaXR5XSBpcyBvbWl0dGVkLCBhIG5ldyBjYXBhYmlsaXR5IG9iamVjdCBpcyBjcmVhdGVkCiAgICogYW5kIHVzZWQgaW5zdGVhZC4KICAgKgogICAqIElmIGFuIGlzb2xhdGUgaXMgcGF1c2VkIG1vcmUgdGhhbiBvbmNlIHVzaW5nIHRoZSBzYW1lIGNhcGFiaWxpdHksCiAgICogb25seSBvbmUgcmVzdW1lIHdpdGggdGhhdCBjYXBhYmlsaXR5IGlzIG5lZWRlZCB0byBlbmQgdGhlIHBhdXNlLgogICAqCiAgICogSWYgYW4gaXNvbGF0ZSBpcyBwYXVzZWQgdXNpbmcgbW9yZSB0aGFuIG9uZSBjYXBhYmlsaXR5LAogICAqIGVhY2ggcGF1c2UgbXVzdCBiZSBpbmRpdmlkdWFsbHkgZW5kZWQgYmVmb3JlIHRoZSBpc29sYXRlIHJlc3VtZXMuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBjYXBhYmlsaXR5IHRoYXQgbXVzdCBiZSB1c2VkIHRvIGVuZCB0aGUgcGF1c2UuCiAgICogVGhpcyBpcyBlaXRoZXIgW3Jlc3VtZUNhcGFiaWxpdHldLCBvciBhIG5ldyBjYXBhYmlsaXR5IHdoZW4KICAgKiBbcmVzdW1lQ2FwYWJpbGl0eV0gaXMgb21pdHRlZC4KICAgKgogICAqIElmIFtwYXVzZUNhcGFiaWxpdHldIGlzIGBudWxsYCwgb3IgaXQncyBub3QgdGhlIHBhdXNlIGNhcGFiaWxpdHkKICAgKiBvZiB0aGUgaXNvbGF0ZSBpZGVudGlmaWVkIGJ5IFtjb250cm9sUG9ydF0sCiAgICogdGhlIHBhdXNlIHJlcXVlc3QgaXMgaWdub3JlZCBieSB0aGUgcmVjZWl2aW5nIGlzb2xhdGUuCiAgICovCiAgQ2FwYWJpbGl0eSBwYXVzZShbQ2FwYWJpbGl0eSByZXN1bWVDYXBhYmlsaXR5XSkgewogICAgcmVzdW1lQ2FwYWJpbGl0eSA/Pz0gbmV3IENhcGFiaWxpdHkoKTsKICAgIF9wYXVzZShyZXN1bWVDYXBhYmlsaXR5KTsKICAgIHJldHVybiByZXN1bWVDYXBhYmlsaXR5OwogIH0KCiAgLyoqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIFtwYXVzZV0uICovCiAgZXh0ZXJuYWwgdm9pZCBfcGF1c2UoQ2FwYWJpbGl0eSByZXN1bWVDYXBhYmlsaXR5KTsKCiAgLyoqCiAgICogUmVzdW1lcyBhIHBhdXNlZCBpc29sYXRlLgogICAqCiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFuIGlzb2xhdGUgcmVxdWVzdGluZyB0aGF0IGl0IGVuZHMgYSBwYXVzZQogICAqIHRoYXQgd2FzIHByZXZpb3VzbHkgcmVxdWVzdGVkLgogICAqCiAgICogV2hlbiBhbGwgYWN0aXZlIHBhdXNlIHJlcXVlc3RzIGhhdmUgYmVlbiBjYW5jZWxsZWQsIHRoZSBpc29sYXRlCiAgICogd2lsbCBjb250aW51ZSBwcm9jZXNzaW5nIGV2ZW50cyBhbmQgaGFuZGxpbmcgbm9ybWFsIG1lc3NhZ2VzLgogICAqCiAgICogSWYgdGhlIFtyZXN1bWVDYXBhYmlsaXR5XSBpcyBub3Qgb25lIHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiB1c2VkCiAgICogdG8gcGF1c2UgdGhlIGlzb2xhdGUsIG9yIGl0IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB0byByZXN1bWUgZnJvbQogICAqIHRoYXQgcGF1c2UsIHRoZSByZXN1bWUgY2FsbCBoYXMgbm8gZWZmZWN0LgogICAqLwogIGV4dGVybmFsIHZvaWQgcmVzdW1lKENhcGFiaWxpdHkgcmVzdW1lQ2FwYWJpbGl0eSk7CgogIC8qKgogICAqIFJlcXVlc3RzIGFuIGV4aXQgbWVzc2FnZSBvbiBbcmVzcG9uc2VQb3J0XSB3aGVuIHRoZSBpc29sYXRlIHRlcm1pbmF0ZXMuCiAgICoKICAgKiBUaGUgaXNvbGF0ZSB3aWxsIHNlbmQgW3Jlc3BvbnNlXSBhcyBhIG1lc3NhZ2Ugb24gW3Jlc3BvbnNlUG9ydF0gYXMgdGhlIGxhc3QKICAgKiB0aGluZyBiZWZvcmUgaXQgdGVybWluYXRlcy4gSXQgd2lsbCBydW4gbm8gZnVydGhlciBjb2RlIGFmdGVyIHRoZSBtZXNzYWdlCiAgICogaGFzIGJlZW4gc2VudC4KICAgKgogICAqIEFkZGluZyB0aGUgc2FtZSBwb3J0IG1vcmUgdGhhbiBvbmNlIHdpbGwgb25seSBjYXVzZSBpdCB0byByZWNlaXZlIG9uZSBleGl0CiAgICogbWVzc2FnZSwgdXNpbmcgdGhlIGxhc3QgcmVzcG9uc2UgdmFsdWUgdGhhdCB3YXMgYWRkZWQsCiAgICogYW5kIGl0IG9ubHkgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIHVzaW5nIFtyZW1vdmVPbkV4aXRMaXN0ZW5lcl0uCiAgICoKICAgKiBJZiB0aGUgaXNvbGF0ZSBoYXMgdGVybWluYXRlZCBiZWZvcmUgaXQgY2FuIHJlY2VpdmUgdGhpcyByZXF1ZXN0LAogICAqIG5vIGV4aXQgbWVzc2FnZSB3aWxsIGJlIHNlbnQuCiAgICoKICAgKiBUaGUgW3Jlc3BvbnNlXSBvYmplY3QgbXVzdCBmb2xsb3cgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFzIGVuZm9yY2VkIGJ5CiAgICogW1NlbmRQb3J0LnNlbmRdLgogICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIG9ubHkgdXNlIHNpbXBsZSB2YWx1ZXMgdGhhdCBjYW4gYmUgc2VudCB0byBhbGwKICAgKiBpc29sYXRlcywgbGlrZSBgbnVsbGAsIGJvb2xlYW5zLCBudW1iZXJzIG9yIHN0cmluZ3MuCiAgICoKICAgKiBTaW5jZSBpc29sYXRlcyBydW4gY29uY3VycmVudGx5LCBpdCdzIHBvc3NpYmxlIGZvciBpdCB0byBleGl0IGJlZm9yZSB0aGUKICAgKiBleGl0IGxpc3RlbmVyIGlzIGVzdGFibGlzaGVkLCBhbmQgaW4gdGhhdCBjYXNlIG5vIHJlc3BvbnNlIHdpbGwgYmUKICAgKiBzZW50IG9uIFtyZXNwb25zZVBvcnRdLgogICAqIFRvIGF2b2lkIHRoaXMsIGVpdGhlciB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHRvIHRoZSBzcGF3bgogICAqIGZ1bmN0aW9uLCBvciBzdGFydCB0aGUgaXNvbGF0ZSBwYXVzZWQsIGFkZCB0aGUgbGlzdGVuZXIgYW5kCiAgICogdGhlbiByZXN1bWUgdGhlIGlzb2xhdGUuCiAgICovCiAgLyogVE9ETyhscm4pOiBDYW4gd2UgZG8gYmV0dGVyPyBDYW4gdGhlIHN5c3RlbSByZWNvZ25pemUgdGhpcyBtZXNzYWdlIGFuZAogICAqIHNlbmQgYSByZXBseSBpZiB0aGUgcmVjZWl2aW5nIGlzb2xhdGUgaXMgZGVhZD8KICAgKi8KICBleHRlcm5hbCB2b2lkIGFkZE9uRXhpdExpc3RlbmVyKFNlbmRQb3J0IHJlc3BvbnNlUG9ydCwge09iamVjdCByZXNwb25zZX0pOwoKICAvKioKICAgKiBTdG9wcyBsaXN0ZW5pbmcgZm9yIGV4aXQgbWVzc2FnZXMgZnJvbSB0aGUgaXNvbGF0ZS4KICAgKgogICAqIFJlcXVlc3RzIGZvciB0aGUgaXNvbGF0ZSB0byBub3Qgc2VuZCBleGl0IG1lc3NhZ2VzIG9uIFtyZXNwb25zZVBvcnRdLgogICAqIElmIHRoZSBpc29sYXRlIGlzbid0IGV4cGVjdGluZyB0byBzZW5kIGV4aXQgbWVzc2FnZXMgb24gW3Jlc3BvbnNlUG9ydF0sCiAgICogYmVjYXVzZSB0aGUgcG9ydCBoYXNuJ3QgYmVlbiBhZGRlZCB1c2luZyBbYWRkT25FeGl0TGlzdGVuZXJdLAogICAqIG9yIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLCB0aGUgcmVxdWVzdCBpcyBpZ25vcmVkLgogICAqCiAgICogSWYgdGhlIHNhbWUgcG9ydCBoYXMgYmVlbiBwYXNzZWQgdmlhIFthZGRPbkV4aXRMaXN0ZW5lcl0gbW9yZSB0aGFuIG9uY2UsCiAgICogb25seSBvbmUgY2FsbCB0byBgcmVtb3ZlT25FeGl0TGlzdGVuZXJgIGlzIG5lZWRlZCB0byBzdG9wIGl0IGZyb20gcmVjZWl2aW5nCiAgICogZXhpdCBtZXNzYWdlcy4KICAgKgogICAqIENsb3NpbmcgdGhlIHJlY2VpdmUgcG9ydCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgW3Jlc3BvbnNlUG9ydF0gZG9lcwogICAqIG5vdCBzdG9wIHRoZSBpc29sYXRlIGZyb20gc2VuZGluZyB1bmNhdWdodCBlcnJvcnMsIHRoZXkgYXJlIGp1c3QgZ29pbmcgdG8KICAgKiBiZSBsb3N0LgogICAqCiAgICogQW4gZXhpdCBtZXNzYWdlIG1heSBzdGlsbCBiZSBzZW50IGlmIHRoZSBpc29sYXRlIHRlcm1pbmF0ZXMKICAgKiBiZWZvcmUgdGhpcyByZXF1ZXN0IGlzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCByZW1vdmVPbkV4aXRMaXN0ZW5lcihTZW5kUG9ydCByZXNwb25zZVBvcnQpOwoKICAvKioKICAgKiBTZXRzIHdoZXRoZXIgdW5jYXVnaHQgZXJyb3JzIHdpbGwgdGVybWluYXRlIHRoZSBpc29sYXRlLgogICAqCiAgICogSWYgZXJyb3JzIGFyZSBmYXRhbCwgYW55IHVuY2F1Z2h0IGVycm9yIHdpbGwgdGVybWluYXRlIHRoZSBpc29sYXRlCiAgICogZXZlbnQgbG9vcCBhbmQgc2h1dCBkb3duIHRoZSBpc29sYXRlLgogICAqCiAgICogVGhpcyBjYWxsIHJlcXVpcmVzIHRoZSBbdGVybWluYXRlQ2FwYWJpbGl0eV0gZm9yIHRoZSBpc29sYXRlLgogICAqIElmIHRoZSBjYXBhYmlsaXR5IGlzIGFic2VudCBvciBpbmNvcnJlY3QsIG5vIGNoYW5nZSBpcyBtYWRlLgogICAqCiAgICogU2luY2UgaXNvbGF0ZXMgcnVuIGNvbmN1cnJlbnRseSwgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHJlY2VpdmluZyBpc29sYXRlCiAgICogdG8gZXhpdCBkdWUgdG8gYW4gZXJyb3IsIGJlZm9yZSBhIHJlcXVlc3QsIHVzaW5nIHRoaXMgbWV0aG9kLCBoYXMgYmVlbgogICAqIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQuCiAgICogVG8gYXZvaWQgdGhpcywgZWl0aGVyIHVzZSB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdG8gdGhlIHNwYXduCiAgICogZnVuY3Rpb24sIG9yIHN0YXJ0IHRoZSBpc29sYXRlIHBhdXNlZCwgc2V0IGVycm9ycyBub24tZmF0YWwgYW5kCiAgICogdGhlbiByZXN1bWUgdGhlIGlzb2xhdGUuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCBzZXRFcnJvcnNGYXRhbChib29sIGVycm9yc0FyZUZhdGFsKTsKCiAgLyoqCiAgICogUmVxdWVzdHMgdGhlIGlzb2xhdGUgdG8gc2h1dCBkb3duLgogICAqCiAgICogVGhlIGlzb2xhdGUgaXMgcmVxdWVzdGVkIHRvIHRlcm1pbmF0ZSBpdHNlbGYuCiAgICogVGhlIFtwcmlvcml0eV0gYXJndW1lbnQgc3BlY2lmaWVzIHdoZW4gdGhpcyBtdXN0IGhhcHBlbi4KICAgKgogICAqIFRoZSBbcHJpb3JpdHldLCB3aGVuIHByb3ZpZGVkLCBtdXN0IGJlIG9uZSBvZiBbaW1tZWRpYXRlXSBvcgogICAqIFtiZWZvcmVOZXh0RXZlbnRdICh0aGUgZGVmYXVsdCkuCiAgICogVGhlIHNodXRkb3duIGlzIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgdGltZXMgZGVwZW5kaW5nIG9uIHRoZSBwcmlvcml0eToKICAgKgogICAqICogYGltbWVkaWF0ZWA6IFRoZSBpc29sYXRlIHNodXRzIGRvd24gYXMgc29vbiBhcyBwb3NzaWJsZS4KICAgKiAgICAgQ29udHJvbCBtZXNzYWdlcyBhcmUgaGFuZGxlZCBpbiBvcmRlciwgc28gYWxsIHByZXZpb3VzbHkgc2VudCBjb250cm9sCiAgICogICAgIGV2ZW50cyBmcm9tIHRoaXMgaXNvbGF0ZSB3aWxsIGFsbCBoYXZlIGJlZW4gcHJvY2Vzc2VkLgogICAqICAgICBUaGUgc2h1dGRvd24gc2hvdWxkIGhhcHBlbiBubyBsYXRlciB0aGFuIGlmIHNlbnQgd2l0aAogICAqICAgICBgYmVmb3JlTmV4dEV2ZW50YC4KICAgKiAgICAgSXQgbWF5IGhhcHBlbiBlYXJsaWVyIGlmIHRoZSBzeXN0ZW0gaGFzIGEgd2F5IHRvIHNodXQgZG93biBjbGVhbmx5CiAgICogICAgIGF0IGFuIGVhcmxpZXIgdGltZSwgZXZlbiBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhbm90aGVyIGV2ZW50LgogICAqICogYGJlZm9yZU5leHRFdmVudGA6IFRoZSBzaHV0ZG93biBpcyBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IHRpbWUKICAgKiAgICAgY29udHJvbCByZXR1cm5zIHRvIHRoZSBldmVudCBsb29wIG9mIHRoZSByZWNlaXZpbmcgaXNvbGF0ZSwKICAgKiAgICAgYWZ0ZXIgdGhlIGN1cnJlbnQgZXZlbnQsIGFuZCBhbnkgYWxyZWFkeSBzY2hlZHVsZWQgY29udHJvbCBldmVudHMsCiAgICogICAgIGFyZSBjb21wbGV0ZWQuCiAgICoKICAgKiBJZiBbdGVybWluYXRlQ2FwYWJpbGl0eV0gaXMgYG51bGxgLCBvciBpdCdzIG5vdCB0aGUgdGVybWluYXRlIGNhcGFiaWxpdHkKICAgKiBvZiB0aGUgaXNvbGF0ZSBpZGVudGlmaWVkIGJ5IFtjb250cm9sUG9ydF0sCiAgICogdGhlIGtpbGwgcmVxdWVzdCBpcyBpZ25vcmVkIGJ5IHRoZSByZWNlaXZpbmcgaXNvbGF0ZS4KICAgKi8KICBleHRlcm5hbCB2b2lkIGtpbGwoe2ludCBwcmlvcml0eTogYmVmb3JlTmV4dEV2ZW50fSk7CgogIC8qKgogICAqIFJlcXVlc3RzIHRoYXQgdGhlIGlzb2xhdGUgc2VuZCBbcmVzcG9uc2VdIG9uIHRoZSBbcmVzcG9uc2VQb3J0XS4KICAgKgogICAqIFRoZSBbcmVzcG9uc2VdIG9iamVjdCBtdXN0IGZvbGxvdyB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgZW5mb3JjZWQgYnkKICAgKiBbU2VuZFBvcnQuc2VuZF0uCiAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSB1c2Ugc2ltcGxlIHZhbHVlcyB0aGF0IGNhbiBiZSBzZW50IHRvIGFsbAogICAqIGlzb2xhdGVzLCBsaWtlIGBudWxsYCwgYm9vbGVhbnMsIG51bWJlcnMgb3Igc3RyaW5ncy4KICAgKgogICAqIElmIHRoZSBpc29sYXRlIGlzIGFsaXZlLCBpdCB3aWxsIGV2ZW50dWFsbHkgc2VuZCBgcmVzcG9uc2VgCiAgICogKGRlZmF1bHRpbmcgdG8gYG51bGxgKSBvbiB0aGUgcmVzcG9uc2UgcG9ydC4KICAgKgogICAqIFRoZSBbcHJpb3JpdHldIG11c3QgYmUgb25lIG9mIFtpbW1lZGlhdGVdIG9yIFtiZWZvcmVOZXh0RXZlbnRdLgogICAqIFRoZSByZXNwb25zZSBpcyBzZW50IGF0IGRpZmZlcmVudCB0aW1lcyBkZXBlbmRpbmcgb24gdGhlIHBpbmcgdHlwZToKICAgKgogICAqICogYGltbWVkaWF0ZWA6IFRoZSBpc29sYXRlIHJlc3BvbmRzIGFzIHNvb24gYXMgaXQgcmVjZWl2ZXMgdGhlCiAgICogICAgIGNvbnRyb2wgbWVzc2FnZS4gVGhpcyBpcyBhZnRlciBhbnkgcHJldmlvdXMgY29udHJvbCBtZXNzYWdlCiAgICogICAgIGZyb20gdGhlIHNhbWUgaXNvbGF0ZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkLAogICAqICAgICBidXQgbWF5IGJlIGR1cmluZyBleGVjdXRpb24gb2YgYW5vdGhlciBldmVudC4KICAgKiAqIGBiZWZvcmVOZXh0RXZlbnRgOiBUaGUgcmVzcG9uc2UgaXMgc2NoZWR1bGVkIGZvciB0aGUgbmV4dCB0aW1lCiAgICogICAgIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgZXZlbnQgbG9vcCBvZiB0aGUgcmVjZWl2aW5nIGlzb2xhdGUsCiAgICogICAgIGFmdGVyIHRoZSBjdXJyZW50IGV2ZW50LCBhbmQgYW55IGFscmVhZHkgc2NoZWR1bGVkIGNvbnRyb2wgZXZlbnRzLAogICAqICAgICBhcmUgY29tcGxldGVkLgogICAqLwogIGV4dGVybmFsIHZvaWQgcGluZyhTZW5kUG9ydCByZXNwb25zZVBvcnQsCiAgICAgIHtPYmplY3QgcmVzcG9uc2UsIGludCBwcmlvcml0eTogaW1tZWRpYXRlfSk7CgogIC8qKgogICAqIFJlcXVlc3RzIHRoYXQgdW5jYXVnaHQgZXJyb3JzIG9mIHRoZSBpc29sYXRlIGFyZSBzZW50IGJhY2sgdG8gW3BvcnRdLgogICAqCiAgICogVGhlIGVycm9ycyBhcmUgc2VudCBiYWNrIGFzIHR3byBlbGVtZW50cyBsaXN0cy4KICAgKiBUaGUgZmlyc3QgZWxlbWVudCBpcyBhIGBTdHJpbmdgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciwgdXN1YWxseQogICAqIGNyZWF0ZWQgYnkgY2FsbGluZyBgdG9TdHJpbmdgIG9uIHRoZSBlcnJvci4KICAgKiBUaGUgc2Vjb25kIGVsZW1lbnQgaXMgYSBgU3RyaW5nYCByZXByZXNlbnRhdGlvbiBvZiBhbiBhY2NvbXBhbnlpbmcKICAgKiBzdGFjayB0cmFjZSwgb3IgYG51bGxgIGlmIG5vIHN0YWNrIHRyYWNlIHdhcyBwcm92aWRlZC4KICAgKiBUbyBjb252ZXJ0IHRoaXMgYmFjayB0byBhIFtTdGFja1RyYWNlXSBvYmplY3QsIHVzZSBbU3RhY2tUcmFjZS5mcm9tU3RyaW5nXS4KICAgKgogICAqIExpc3RlbmluZyB1c2luZyB0aGUgc2FtZSBwb3J0IG1vcmUgdGhhbiBvbmNlIGRvZXMgbm90aGluZy4KICAgKiBBIHBvcnQgd2lsbCBvbmx5IHJlY2VpdmUgZWFjaCBlcnJvciBvbmNlLAogICAqIGFuZCB3aWxsIG9ubHkgbmVlZCB0byBiZSByZW1vdmVkIG9uY2UgdXNpbmcgW3JlbW92ZUVycm9yTGlzdGVuZXJdLgoKICAgKiBDbG9zaW5nIHRoZSByZWNlaXZlIHBvcnQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgZG9lcyBub3Qgc3RvcAogICAqIHRoZSBpc29sYXRlIGZyb20gc2VuZGluZyB1bmNhdWdodCBlcnJvcnMsIHRoZXkgYXJlIGp1c3QgZ29pbmcgdG8gYmUgbG9zdC4KICAgKiBJbnN0ZWFkIHVzZSBbcmVtb3ZlRXJyb3JMaXN0ZW5lcl0gdG8gc3RvcCByZWNlaXZpbmcgZXJyb3JzIG9uIFtwb3J0XS4KICAgKgogICAqIFNpbmNlIGlzb2xhdGVzIHJ1biBjb25jdXJyZW50bHksIGl0J3MgcG9zc2libGUgZm9yIGl0IHRvIGV4aXQgYmVmb3JlIHRoZQogICAqIGVycm9yIGxpc3RlbmVyIGlzIGVzdGFibGlzaGVkLiBUbyBhdm9pZCB0aGlzLCBzdGFydCB0aGUgaXNvbGF0ZSBwYXVzZWQsCiAgICogYWRkIHRoZSBsaXN0ZW5lciBhbmQgdGhlbiByZXN1bWUgdGhlIGlzb2xhdGUuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCBhZGRFcnJvckxpc3RlbmVyKFNlbmRQb3J0IHBvcnQpOwoKICAvKioKICAgKiBTdG9wcyBsaXN0ZW5pbmcgZm9yIHVuY2F1Z2h0IGVycm9ycyBmcm9tIHRoZSBpc29sYXRlLgogICAqCiAgICogUmVxdWVzdHMgZm9yIHRoZSBpc29sYXRlIHRvIG5vdCBzZW5kIHVuY2F1Z2h0IGVycm9ycyBvbiBbcG9ydF0uCiAgICogSWYgdGhlIGlzb2xhdGUgaXNuJ3QgZXhwZWN0aW5nIHRvIHNlbmQgdW5jYXVnaHQgZXJyb3JzIG9uIFtwb3J0XSwKICAgKiBiZWNhdXNlIHRoZSBwb3J0IGhhc24ndCBiZWVuIGFkZGVkIHVzaW5nIFthZGRFcnJvckxpc3RlbmVyXSwKICAgKiBvciBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgdGhlIHJlcXVlc3QgaXMgaWdub3JlZC4KICAgKgogICAqIElmIHRoZSBzYW1lIHBvcnQgaGFzIGJlZW4gcGFzc2VkIHZpYSBbYWRkRXJyb3JMaXN0ZW5lcl0gbW9yZSB0aGFuIG9uY2UsCiAgICogb25seSBvbmUgY2FsbCB0byBgcmVtb3ZlRXJyb3JMaXN0ZW5lcmAgaXMgbmVlZGVkIHRvIHN0b3AgaXQgZnJvbSByZWNlaXZpbmcKICAgKiB1bmNhdWdodCBlcnJvcnMuCiAgICoKICAgKiBVbmNhdWdodCBlcnJvcnMgbWVzc2FnZSBtYXkgc3RpbGwgYmUgc2VudCBieSB0aGUgaXNvbGF0ZQogICAqIHVudGlsIHRoaXMgcmVxdWVzdCBpcyByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkLgogICAqLwogIGV4dGVybmFsIHZvaWQgcmVtb3ZlRXJyb3JMaXN0ZW5lcihTZW5kUG9ydCBwb3J0KTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGJyb2FkY2FzdCBzdHJlYW0gb2YgdW5jYXVnaHQgZXJyb3JzIGZyb20gdGhlIGlzb2xhdGUuCiAgICoKICAgKiBFYWNoIGVycm9yIGlzIHByb3ZpZGVkIGFzIGFuIGVycm9yIGV2ZW50IG9uIHRoZSBzdHJlYW0uCiAgICoKICAgKiBUaGUgYWN0dWFsIGVycm9yIG9iamVjdCBhbmQgc3RhY2tUcmFjZXMgd2lsbCBub3QgbmVjZXNzYXJpbHkKICAgKiBiZSB0aGUgc2FtZSBvYmplY3QgdHlwZXMgYXMgaW4gdGhlIGFjdHVhbCBpc29sYXRlLCBidXQgdGhleSB3aWxsCiAgICogYWx3YXlzIGhhdmUgdGhlIHNhbWUgW09iamVjdC50b1N0cmluZ10gcmVzdWx0LgogICAqCiAgICogVGhpcyBzdHJlYW0gaXMgYmFzZWQgb24gW2FkZEVycm9yTGlzdGVuZXJdIGFuZCBbcmVtb3ZlRXJyb3JMaXN0ZW5lcl0uCiAgICovCiAgU3RyZWFtIGdldCBlcnJvcnMgewogICAgU3RyZWFtQ29udHJvbGxlciBjb250cm9sbGVyOwogICAgUmF3UmVjZWl2ZVBvcnQgcG9ydDsKICAgIHZvaWQgaGFuZGxlRXJyb3IobWVzc2FnZSkgewogICAgICBMaXN0IGxpc3RNZXNzYWdlID0gbWVzc2FnZTsKICAgICAgU3RyaW5nIGVycm9yRGVzY3JpcHRpb24gPSBsaXN0TWVzc2FnZVswXTsKICAgICAgU3RyaW5nIHN0YWNrRGVzY3JpcHRpb24gPSBsaXN0TWVzc2FnZVsxXTsKICAgICAgdmFyIGVycm9yID0gbmV3IFJlbW90ZUVycm9yKGVycm9yRGVzY3JpcHRpb24sIHN0YWNrRGVzY3JpcHRpb24pOwogICAgICBjb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBlcnJvci5zdGFja1RyYWNlKTsKICAgIH0KCiAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46ICgpIHsKICAgICAgICAgIHBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoaGFuZGxlRXJyb3IpOwogICAgICAgICAgdGhpcy5hZGRFcnJvckxpc3RlbmVyKHBvcnQuc2VuZFBvcnQpOwogICAgICAgIH0sCiAgICAgICAgb25DYW5jZWw6ICgpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlRXJyb3JMaXN0ZW5lcihwb3J0LnNlbmRQb3J0KTsKICAgICAgICAgIHBvcnQuY2xvc2UoKTsKICAgICAgICAgIHBvcnQgPSBudWxsOwogICAgICAgIH0pOwogICAgcmV0dXJuIGNvbnRyb2xsZXIuc3RyZWFtOwogIH0KfQoKLyoqCiAqIFNlbmRzIG1lc3NhZ2VzIHRvIGl0cyBbUmVjZWl2ZVBvcnRdcy4KICoKICogW1NlbmRQb3J0XXMgYXJlIGNyZWF0ZWQgZnJvbSBbUmVjZWl2ZVBvcnRdcy4gQW55IG1lc3NhZ2Ugc2VudCB0aHJvdWdoCiAqIGEgW1NlbmRQb3J0XSBpcyBkZWxpdmVyZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgW1JlY2VpdmVQb3J0XS4gVGhlcmUgbWlnaHQgYmUKICogbWFueSBbU2VuZFBvcnRdcyBmb3IgdGhlIHNhbWUgW1JlY2VpdmVQb3J0XS4KICoKICogW1NlbmRQb3J0XXMgY2FuIGJlIHRyYW5zbWl0dGVkIHRvIG90aGVyIGlzb2xhdGVzLCBhbmQgdGhleSBwcmVzZXJ2ZSBlcXVhbGl0eQogKiB3aGVuIHNlbnQuCiAqLwphYnN0cmFjdCBjbGFzcyBTZW5kUG9ydCBpbXBsZW1lbnRzIENhcGFiaWxpdHkgewogIC8qKgogICAqIFNlbmRzIGFuIGFzeW5jaHJvbm91cyBbbWVzc2FnZV0gdGhyb3VnaCB0aGlzIHNlbmQgcG9ydCwgdG8gaXRzCiAgICogY29ycmVzcG9uZGluZyBgUmVjZWl2ZVBvcnRgLgogICAqCiAgICogVGhlIGNvbnRlbnQgb2YgW21lc3NhZ2VdIGNhbiBiZTogcHJpbWl0aXZlIHZhbHVlcyAobnVsbCwgbnVtLCBib29sLCBkb3VibGUsCiAgICogU3RyaW5nKSwgaW5zdGFuY2VzIG9mIFtTZW5kUG9ydF0sIGFuZCBsaXN0cyBhbmQgbWFwcyB3aG9zZSBlbGVtZW50cyBhcmUgYW55CiAgICogb2YgdGhlc2UuIExpc3QgYW5kIG1hcHMgYXJlIGFsc28gYWxsb3dlZCB0byBiZSBjeWNsaWMuCiAgICoKICAgKiBJbiB0aGUgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIHdoZW4gdHdvIGlzb2xhdGVzIHNoYXJlIHRoZSBzYW1lIGNvZGUgYW5kIGFyZQogICAqIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyAoZS5nLiBpc29sYXRlcyBjcmVhdGVkIHZpYSBbSXNvbGF0ZS5zcGF3bl0pLCBpdAogICAqIGlzIGFsc28gcG9zc2libGUgdG8gc2VuZCBvYmplY3QgaW5zdGFuY2VzICh3aGljaCB3b3VsZCBiZSBjb3BpZWQgaW4gdGhlCiAgICogcHJvY2VzcykuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBkYXJ0dm0uICBGb3Igbm93LCB0aGUKICAgKiBkYXJ0MmpzIGNvbXBpbGVyIG9ubHkgc3VwcG9ydHMgdGhlIHJlc3RyaWN0ZWQgbWVzc2FnZXMgZGVzY3JpYmVkIGFib3ZlLgogICAqCiAgICogVGhlIHNlbmQgaGFwcGVucyBpbW1lZGlhdGVseSBhbmQgZG9lc24ndCBibG9jay4gIFRoZSBjb3JyZXNwb25kaW5nIHJlY2VpdmUKICAgKiBwb3J0IGNhbiByZWNlaXZlIHRoZSBtZXNzYWdlIGFzIHNvb24gYXMgaXRzIGlzb2xhdGUncyBldmVudCBsb29wIGlzIHJlYWR5CiAgICogdG8gZGVsaXZlciBpdCwgaW5kZXBlbmRlbnRseSBvZiB3aGF0IHRoZSBzZW5kaW5nIGlzb2xhdGUgaXMgZG9pbmcuCiAgICovCiAgdm9pZCBzZW5kKHZhciBtZXNzYWdlKTsKCiAgLyoqCiAgICogVGVzdHMgd2hldGhlciBbb3RoZXJdIGlzIGEgW1NlbmRQb3J0XSBwb2ludGluZyB0byB0aGUgc2FtZQogICAqIFtSZWNlaXZlUG9ydF0gYXMgdGhpcyBvbmUuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PSh2YXIgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBoYXNoIGNvZGUgZm9yIHRoaXMgc2VuZCBwb3J0IHRoYXQgaXMKICAgKiBjb25zaXN0ZW50IHdpdGggdGhlID09IG9wZXJhdG9yLgogICAqLwogIGludCBnZXQgaGFzaENvZGU7Cn0KCi8qKgogKiBUb2dldGhlciB3aXRoIFtTZW5kUG9ydF0sIHRoZSBvbmx5IG1lYW5zIG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBpc29sYXRlcy4KICoKICogW1JlY2VpdmVQb3J0XXMgaGF2ZSBhIGBzZW5kUG9ydGAgZ2V0dGVyIHdoaWNoIHJldHVybnMgYSBbU2VuZFBvcnRdLgogKiBBbnkgbWVzc2FnZSB0aGF0IGlzIHNlbnQgdGhyb3VnaCB0aGlzIFtTZW5kUG9ydF0KICogaXMgZGVsaXZlcmVkIHRvIHRoZSBbUmVjZWl2ZVBvcnRdIGl0IGhhcyBiZWVuIGNyZWF0ZWQgZnJvbS4gVGhlcmUsIHRoZQogKiBtZXNzYWdlIGlzIGRpc3BhdGNoZWQgdG8gdGhlIGBSZWNlaXZlUG9ydGAncyBsaXN0ZW5lci4KICoKICogQSBbUmVjZWl2ZVBvcnRdIGlzIGEgbm9uLWJyb2FkY2FzdCBzdHJlYW0uIFRoaXMgbWVhbnMgdGhhdCBpdCBidWZmZXJzCiAqIGluY29taW5nIG1lc3NhZ2VzIHVudGlsIGEgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gT25seSBvbmUgbGlzdGVuZXIgY2FuCiAqIHJlY2VpdmUgbWVzc2FnZXMuIFNlZSBbU3RyZWFtLmFzQnJvYWRjYXN0U3RyZWFtXSBmb3IgdHJhbnNmb3JtaW5nIHRoZSBwb3J0CiAqIHRvIGEgYnJvYWRjYXN0IHN0cmVhbS4KICoKICogQSBbUmVjZWl2ZVBvcnRdIG1heSBoYXZlIG1hbnkgW1NlbmRQb3J0XXMuCiAqLwphYnN0cmFjdCBjbGFzcyBSZWNlaXZlUG9ydCBpbXBsZW1lbnRzIFN0cmVhbSB7CiAgLyoqCiAgICogT3BlbnMgYSBsb25nLWxpdmVkIHBvcnQgZm9yIHJlY2VpdmluZyBtZXNzYWdlcy4KICAgKgogICAqIEEgW1JlY2VpdmVQb3J0XSBpcyBhIG5vbi1icm9hZGNhc3Qgc3RyZWFtLiBUaGlzIG1lYW5zIHRoYXQgaXQgYnVmZmVycwogICAqIGluY29taW5nIG1lc3NhZ2VzIHVudGlsIGEgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gT25seSBvbmUgbGlzdGVuZXIgY2FuCiAgICogcmVjZWl2ZSBtZXNzYWdlcy4gU2VlIFtTdHJlYW0uYXNCcm9hZGNhc3RTdHJlYW1dIGZvciB0cmFuc2Zvcm1pbmcgdGhlIHBvcnQKICAgKiB0byBhIGJyb2FkY2FzdCBzdHJlYW0uCiAgICoKICAgKiBBIHJlY2VpdmUgcG9ydCBpcyBjbG9zZWQgYnkgY2FuY2VsaW5nIGl0cyBzdWJzY3JpcHRpb24uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBSZWNlaXZlUG9ydCgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1JlY2VpdmVQb3J0XSBmcm9tIGEgW1Jhd1JlY2VpdmVQb3J0XS4KICAgKgogICAqIFRoZSBoYW5kbGVyIG9mIHRoZSBnaXZlbiBbcmF3UG9ydF0gaXMgb3ZlcndyaXR0ZW4gZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24KICAgKiBvZiB0aGUgcmVzdWx0LgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgUmVjZWl2ZVBvcnQuZnJvbVJhd1JlY2VpdmVQb3J0KFJhd1JlY2VpdmVQb3J0IHJhd1BvcnQpOwoKICAvKioKICAgKiBJbmhlcml0ZWQgZnJvbSBbU3RyZWFtXS4KICAgKgogICAqIE5vdGUgdGhhdCBbb25FcnJvcl0gYW5kIFtjYW5jZWxPbkVycm9yXSBhcmUgaWdub3JlZCBzaW5jZSBhIFJlY2VpdmVQb3J0CiAgICogd2lsbCBuZXZlciByZWNlaXZlIGFuIGVycm9yLgogICAqCiAgICogVGhlIFtvbkRvbmVdIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy4KICAgKiBUaGUgc3RyZWFtIGNsb3NlcyB3aGVuIFtjbG9zZV0gaXMgY2FsbGVkLgogICAqLwogIFN0cmVhbVN1YnNjcmlwdGlvbiBsaXN0ZW4odm9pZCBvbkRhdGEodmFyIG1lc3NhZ2UpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSk7CgogIC8qKgogICAqIENsb3NlcyBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBjYW5jZWxlZCB5ZXQsIGFkZHMgYSBjbG9zZS1ldmVudCB0byB0aGUgZXZlbnQKICAgKiBxdWV1ZSBhbmQgZGlzY2FyZHMgYW55IGZ1cnRoZXIgaW5jb21pbmcgbWVzc2FnZXMuCiAgICoKICAgKiBJZiB0aGUgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KICAgKi8KICB2b2lkIGNsb3NlKCk7CgogIC8qKgogICAqIFJldHVybnMgYSBbU2VuZFBvcnRdIHRoYXQgc2VuZHMgdG8gdGhpcyByZWNlaXZlIHBvcnQuCiAgICovCiAgU2VuZFBvcnQgZ2V0IHNlbmRQb3J0Owp9CgphYnN0cmFjdCBjbGFzcyBSYXdSZWNlaXZlUG9ydCB7CiAgLyoqCiAgICogT3BlbnMgYSBsb25nLWxpdmVkIHBvcnQgZm9yIHJlY2VpdmluZyBtZXNzYWdlcy4KICAgKgogICAqIEEgW1Jhd1JlY2VpdmVQb3J0XSBpcyBsb3cgbGV2ZWwgYW5kIGRvZXMgbm90IHdvcmsgd2l0aCBbWm9uZV1zLiBJdAogICAqIGNhbiBub3QgYmUgcGF1c2VkLiBUaGUgZGF0YS1oYW5kbGVyIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgZmlyc3QKICAgKiBldmVudCBpcyByZWNlaXZlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFJhd1JlY2VpdmVQb3J0KFtGdW5jdGlvbiBoYW5kbGVyXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGhhbmRsZXIgdGhhdCBpcyBpbnZva2VkIGZvciBldmVyeSBpbmNvbWluZyBtZXNzYWdlLgogICAqCiAgICogVGhlIGhhbmRsZXIgaXMgaW52b2tlZCBpbiB0aGUgcm9vdC16b25lIChbWm9uZS5yb290XSkuCiAgICovCiAgdm9pZCBzZXQgaGFuZGxlcihGdW5jdGlvbiBuZXdIYW5kbGVyKTsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBwb3J0LgogICAqCiAgICogQWZ0ZXIgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIGFueSBpbmNvbWluZyBtZXNzYWdlIGlzIHNpbGVudGx5IGRyb3BwZWQuCiAgICovCiAgdm9pZCBjbG9zZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW1NlbmRQb3J0XSB0aGF0IHNlbmRzIHRvIHRoaXMgcmF3IHJlY2VpdmUgcG9ydC4KICAgKi8KICBTZW5kUG9ydCBnZXQgc2VuZFBvcnQ7Cn0KCi8qKgogKiBEZXNjcmlwdGlvbiBvZiBhbiBlcnJvciBmcm9tIGFub3RoZXIgaXNvbGF0ZS4KICoKICogVGhpcyBlcnJvciBoYXMgdGhlIHNhbWUgYHRvU3RyaW5nKClgIGFuZCBgc3RhY2tUcmFjZS50b1N0cmluZygpYCBiZWhhdmlvcgogKiBhcyB0aGUgb3JpZ2luYWwgZXJyb3IsIGJ1dCBoYXMgbm8gb3RoZXIgZmVhdHVyZXMgb2YgdGhlIG9yaWdpbmFsIGVycm9yLgogKi8KY2xhc3MgUmVtb3RlRXJyb3IgaW1wbGVtZW50cyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIF9kZXNjcmlwdGlvbjsKICBmaW5hbCBTdGFja1RyYWNlIHN0YWNrVHJhY2U7CiAgUmVtb3RlRXJyb3IoU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgc3RhY2tEZXNjcmlwdGlvbikKICAgICAgOiBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiwKICAgICAgICBzdGFja1RyYWNlID0gbmV3IFN0YWNrVHJhY2UuZnJvbVN0cmluZyhzdGFja0Rlc2NyaXB0aW9uKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfZGVzY3JpcHRpb247Cn0KgvIATk48AQQsMxskAyUDHgMSBBYBFQEYAQQtBDM4GBwnOgIBBCcDTE05A0wYQQNLSgNRIANHQkwaA01EH0klA0RASToDTk01BBBCIk4oAQZABS4FOR8FTEk2Bh4BBjsFLU8xMAVJTAYkAQY/BUFKPDYGKAEGPQVQBU8xBVBNFgYhAQZKBUUfBUgoT00XBU1LBQ4NKkMnCUhJSAZPAQZCBTImBUdHEAVJRikGJwEGTwVPEAZMLwEGNgVJTCUGMQEGLwVHQxoGQQEGTA4FRh1LGwVCMDU1OEBAQSUFPEMFMTJHS0wFUUFFSQ4FTykFUDAFRUhFKAVMQwYsLRsbFxgaAQZMGAVPGQVJDwUQFB0FTEwFMTJLTAVRQUVJDgVFSEUoBT1OSk0xBU4WBUVMKzcFTwVPSQ4FSU0RBUZLQE8rBUQUBU8pBUtDBiwPGRMbFxgbFCdCGxkuGgEGJAU7Mks8NQVDOEgcBTs9ShcFR0YFPUcFQEEkBUYxPAY0Kx4dBAEtNQEGHwVDJAVFQwVIRjAGNQEGTQVRTxQFUDxIBUcjBUwWSToFTkgdSEEeBkw0Bk0BBjkFS01DRQVOURQFTk8OBUE0Bj0BBj4FSCsFQ0IFTkwdSEUeBjUBBigFMz4FQiZNBUBPQD8cTElGRUwYBU4xOwY3AQZGBUwWSToFQTIFRUkFREVAN0ZFTBgGLDMBBksFNUoxSDxRBUAvSAFNT0sFTk0zBjEBBjsFRUdCRQVNUBYFPjMGNAEGRQU9BUJGNAVLBhYhGSAiMDBHNAYBMRQXMjALFzMYFwweBAIBBCkDSVAwA1AOBDAGRCIFUVE8BVBRTU1NBVBPSAYaAQZAIAYfAQY/JgYUAgEETwNHNEo6A0lLThoDLgQvBjUFS01QHAU9BiIBBjYFTxQGSwEGHgVNIgVBLwY2PgEGFAVONwVIBhABBjsGGQIBIAY1BUhGGAY3AQZCBTwGKQEGFgVLBhABBj8GGQIBBDEDTUsEJR0fOyRCJQIBDGRhcnQ6aXNvbGF0ZTJvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2lzb2xhdGVfcGF0Y2guZGFydMAATNovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6aXNvbGF0ZSIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzCi8vLyB1c2VkIGJ5IHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhCi8vLyBzaGFyZWQgZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBWTUxpYnJhcnlIb29rcywgcGF0Y2g7CgppbXBvcnQgImRhcnQ6YXN5bmMiCiAgICBzaG93IENvbXBsZXRlciwgRnV0dXJlLCBTdHJlYW0sIFN0cmVhbUNvbnRyb2xsZXIsIFN0cmVhbVN1YnNjcmlwdGlvbiwgVGltZXI7CgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiIgc2hvdyBIYXNoTWFwOwoKLy8vIFRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnk6Ci8vIHBhcnQgInRpbWVyX2ltcGwuZGFydCI7CgpAcGF0Y2gKY2xhc3MgUmVjZWl2ZVBvcnQgewogIEBwYXRjaAogIGZhY3RvcnkgUmVjZWl2ZVBvcnQoKSA9PiBuZXcgX1JlY2VpdmVQb3J0SW1wbCgpOwoKICBAcGF0Y2gKICBmYWN0b3J5IFJlY2VpdmVQb3J0LmZyb21SYXdSZWNlaXZlUG9ydChSYXdSZWNlaXZlUG9ydCByYXdQb3J0KSB7CiAgICByZXR1cm4gbmV3IF9SZWNlaXZlUG9ydEltcGwuZnJvbVJhd1JlY2VpdmVQb3J0KHJhd1BvcnQpOwogIH0KfQoKQHBhdGNoCmNsYXNzIENhcGFiaWxpdHkgewogIEBwYXRjaAogIGZhY3RvcnkgQ2FwYWJpbGl0eSgpID0+IG5ldyBfQ2FwYWJpbGl0eUltcGwoKTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfQ2FwYWJpbGl0eUltcGwgaW1wbGVtZW50cyBDYXBhYmlsaXR5IHsKICBmYWN0b3J5IF9DYXBhYmlsaXR5SW1wbCgpIG5hdGl2ZSAiQ2FwYWJpbGl0eUltcGxfZmFjdG9yeSI7CgogIGJvb2wgb3BlcmF0b3IgPT0odmFyIG90aGVyKSB7CiAgICByZXR1cm4gKG90aGVyIGlzIF9DYXBhYmlsaXR5SW1wbCkgJiYgX2VxdWFscyhvdGhlcik7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIHJldHVybiBfZ2V0X2hhc2hjb2RlKCk7CiAgfQoKICBfZXF1YWxzKG90aGVyKSBuYXRpdmUgIkNhcGFiaWxpdHlJbXBsX2VxdWFscyI7CiAgX2dldF9oYXNoY29kZSgpIG5hdGl2ZSAiQ2FwYWJpbGl0eUltcGxfZ2V0X2hhc2hjb2RlIjsKfQoKQHBhdGNoCmNsYXNzIFJhd1JlY2VpdmVQb3J0IHsKICAvKioKICAgKiBPcGVucyBhIGxvbmctbGl2ZWQgcG9ydCBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzLgogICAqCiAgICogQSBbUmF3UmVjZWl2ZVBvcnRdIGlzIGxvdyBsZXZlbCBhbmQgZG9lcyBub3Qgd29yayB3aXRoIFtab25lXXMuIEl0CiAgICogY2FuIG5vdCBiZSBwYXVzZWQuIFRoZSBkYXRhLWhhbmRsZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBmaXJzdAogICAqIGV2ZW50IGlzIHJlY2VpdmVkLgogICAqLwogIEBwYXRjaAogIGZhY3RvcnkgUmF3UmVjZWl2ZVBvcnQoW0Z1bmN0aW9uIGhhbmRsZXJdKSB7CiAgICBfUmF3UmVjZWl2ZVBvcnRJbXBsIHJlc3VsdCA9IG5ldyBfUmF3UmVjZWl2ZVBvcnRJbXBsKCk7CiAgICByZXN1bHQuaGFuZGxlciA9IGhhbmRsZXI7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQoKY2xhc3MgX1JlY2VpdmVQb3J0SW1wbCBleHRlbmRzIFN0cmVhbSBpbXBsZW1lbnRzIFJlY2VpdmVQb3J0IHsKICBfUmVjZWl2ZVBvcnRJbXBsKCkgOiB0aGlzLmZyb21SYXdSZWNlaXZlUG9ydChuZXcgUmF3UmVjZWl2ZVBvcnQoKSk7CgogIF9SZWNlaXZlUG9ydEltcGwuZnJvbVJhd1JlY2VpdmVQb3J0KHRoaXMuX3Jhd1BvcnQpIHsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIob25DYW5jZWw6IGNsb3NlLCBzeW5jOiB0cnVlKTsKICAgIF9yYXdQb3J0LmhhbmRsZXIgPSBfY29udHJvbGxlci5hZGQ7CiAgfQoKICBTZW5kUG9ydCBnZXQgc2VuZFBvcnQgewogICAgcmV0dXJuIF9yYXdQb3J0LnNlbmRQb3J0OwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uIGxpc3Rlbih2b2lkIG9uRGF0YSh2YXIgbWVzc2FnZSksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgY2xvc2UoKSB7CiAgICBfcmF3UG9ydC5jbG9zZSgpOwogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICB9CgogIGZpbmFsIFJhd1JlY2VpdmVQb3J0IF9yYXdQb3J0OwogIFN0cmVhbUNvbnRyb2xsZXIgX2NvbnRyb2xsZXI7Cn0KCnR5cGVkZWYgdm9pZCBfSW1tZWRpYXRlQ2FsbGJhY2soKTsKCi8vLyBUaGUgY2FsbGJhY2sgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIHRocm91Z2ggYHNjaGVkdWxlSW1tZWRpYXRlYC4KX0ltbWVkaWF0ZUNhbGxiYWNrIF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2s7CgovLy8gVGhlIGNsb3N1cmUgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY2hlZHVsZUltbWVkaWF0ZUNsb3N1cmUsIHdoZW4gdGhlIFZNCi8vLyBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGV2ZW50IGxvb3AuCnZvaWQgX2lzb2xhdGVTY2hlZHVsZUltbWVkaWF0ZSh2b2lkIGNhbGxiYWNrKCkpIHsKICBhc3NlcnQoKF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2sgPT0gbnVsbCkgfHwKICAgICAgKF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2sgPT0gY2FsbGJhY2spKTsKICBfcGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9ydW5QZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2soKSB7CiAgaWYgKF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgdmFyIGNhbGxiYWNrID0gX3BlbmRpbmdJbW1lZGlhdGVDYWxsYmFjazsKICAgIF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2sgPSBudWxsOwogICAgY2FsbGJhY2soKTsKICB9Cn0KCl9JbW1lZGlhdGVDYWxsYmFjayBfcmVtb3ZlUGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrKCkgewogIHZhciBjYWxsYmFjayA9IF9wZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2s7CiAgX3BlbmRpbmdJbW1lZGlhdGVDYWxsYmFjayA9IG51bGw7CiAgcmV0dXJuIGNhbGxiYWNrOwp9CgovLy8gVGhlIGVtYmVkZGVyIGNhbiBleGVjdXRlIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IGhvbGQgb2YKLy8vIFtfaXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlXSBhYm92ZS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCkZ1bmN0aW9uIF9nZXRJc29sYXRlU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlKCkgewogIHJldHVybiBfaXNvbGF0ZVNjaGVkdWxlSW1tZWRpYXRlOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9SYXdSZWNlaXZlUG9ydEltcGwgaW1wbGVtZW50cyBSYXdSZWNlaXZlUG9ydCB7CiAgZmFjdG9yeSBfUmF3UmVjZWl2ZVBvcnRJbXBsKCkgbmF0aXZlICJSYXdSZWNlaXZlUG9ydEltcGxfZmFjdG9yeSI7CgogIGNsb3NlKCkgewogICAgLy8gQ2xvc2UgdGhlIHBvcnQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBoYW5kbGVyIG1hcC4KICAgIF9oYW5kbGVyTWFwLnJlbW92ZSh0aGlzLl9jbG9zZUludGVybmFsKCkpOwogIH0KCiAgU2VuZFBvcnQgZ2V0IHNlbmRQb3J0IHsKICAgIHJldHVybiBfZ2V0X3NlbmRwb3J0KCk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgcmV0dXJuIChvdGhlciBpcyBfUmF3UmVjZWl2ZVBvcnRJbXBsKSAmJgogICAgICAgICh0aGlzLl9nZXRfaWQoKSA9PSBvdGhlci5fZ2V0X2lkKCkpOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICByZXR1cm4gc2VuZFBvcnQuaGFzaENvZGU7CiAgfQoKICAvKioqKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzICoqKiovCiAgX2dldF9pZCgpIG5hdGl2ZSAiUmF3UmVjZWl2ZVBvcnRJbXBsX2dldF9pZCI7CiAgX2dldF9zZW5kcG9ydCgpIG5hdGl2ZSAiUmF3UmVjZWl2ZVBvcnRJbXBsX2dldF9zZW5kcG9ydCI7CgogIC8vIENhbGxlZCBmcm9tIHRoZSBWTSB0byByZXRyaWV2ZSB0aGUgaGFuZGxlciBmb3IgYSBtZXNzYWdlLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBfbG9va3VwSGFuZGxlcihpbnQgaWQpIHsKICAgIHZhciByZXN1bHQgPSBfaGFuZGxlck1hcFtpZF07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gQ2FsbGVkIGZyb20gdGhlIFZNIHRvIGRpc3BhdGNoIHRvIHRoZSBoYW5kbGVyLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyB2b2lkIF9oYW5kbGVNZXNzYWdlKEZ1bmN0aW9uIGhhbmRsZXIsIHZhciBtZXNzYWdlKSB7CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBhbnkgZXhjZXB0aW9uIGFib3J0cyB0aGUKICAgIC8vIFZNLiBPbmNlIHdlIGhhdmUgbm9uLWZhdGFsIGdsb2JhbCBleGNlcHRpb25zIHdlIG5lZWQgdG8gY2F0Y2ggZXJyb3JzCiAgICAvLyBzbyB0aGF0IHdlIGNhbiBydW4gdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MuCiAgICBoYW5kbGVyKG1lc3NhZ2UpOwogICAgX3J1blBlbmRpbmdJbW1lZGlhdGVDYWxsYmFjaygpOwogIH0KCiAgLy8gQ2FsbCBpbnRvIHRoZSBWTSB0byBjbG9zZSB0aGUgVk0gbWFpbnRhaW5lZCBtYXBwaW5ncy4KICBfY2xvc2VJbnRlcm5hbCgpIG5hdGl2ZSAiUmF3UmVjZWl2ZVBvcnRJbXBsX2Nsb3NlSW50ZXJuYWwiOwoKICB2b2lkIHNldCBoYW5kbGVyKEZ1bmN0aW9uIHZhbHVlKSB7CiAgICBfaGFuZGxlck1hcFt0aGlzLl9nZXRfaWQoKV0gPSB2YWx1ZTsKICB9CgogIC8vIFRPRE8oaXBvc3ZhKTogSWRlYWxseSBrZWVwIHRoaXMgbWFwIGluIHRoZSBWTS4KICAvLyBpZCB0byBoYW5kbGVyIG1hcHBpbmcuCiAgc3RhdGljIF9pbml0SGFuZGxlck1hcCgpIHsKICAgIC8vIFRPRE8oMTg1MTEpOiBXb3JrYXJvdW5kIGJhZCBDaGVja1NtaSBob2lzdGluZy4KICAgIHZhciB0ZW1wTWFwID0gbmV3IEhhc2hNYXAoKTsKICAgIC8vIENvbGxlY3QgZmVlZGJhY2sgdGhhdCBub3QgYWxsIGtleXMgYXJlIFNtaXMuCiAgICB0ZW1wTWFwWyIuIl0gPSAxOwogICAgdGVtcE1hcFsiLiJdID0gMjsKCiAgICByZXR1cm4gbmV3IEhhc2hNYXAoKTsKICB9CgogIHN0YXRpYyBmaW5hbCBNYXAgX2hhbmRsZXJNYXAgPSBfaW5pdEhhbmRsZXJNYXAoKTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfU2VuZFBvcnRJbXBsIGltcGxlbWVudHMgU2VuZFBvcnQgewogIC8qLS0tIHB1YmxpYyBpbnRlcmZhY2UgLS0tKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICB2b2lkIHNlbmQodmFyIG1lc3NhZ2UpIHsKICAgIF9zZW5kSW50ZXJuYWwobWVzc2FnZSk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KHZhciBvdGhlcikgewogICAgcmV0dXJuIChvdGhlciBpcyBfU2VuZFBvcnRJbXBsKSAmJiAodGhpcy5fZ2V0X2lkKCkgPT0gb3RoZXIuX2dldF9pZCgpKTsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9nZXRfaGFzaGNvZGUoKTsKICB9CgogIC8qLS0tIHByaXZhdGUgaW1wbGVtZW50YXRpb24gLS0tKi8KICBfZ2V0X2lkKCkgbmF0aXZlICJTZW5kUG9ydEltcGxfZ2V0X2lkIjsKICBfZ2V0X2hhc2hjb2RlKCkgbmF0aXZlICJTZW5kUG9ydEltcGxfZ2V0X2hhc2hjb2RlIjsKCiAgLy8gRm9yd2FyZCB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgVk0uCiAgdm9pZCBfc2VuZEludGVybmFsKHZhciBtZXNzYWdlKSBuYXRpdmUgIlNlbmRQb3J0SW1wbF9zZW5kSW50ZXJuYWxfIjsKfQoKdHlwZWRlZiBfTnVsbGFyeUZ1bmN0aW9uKCk7CnR5cGVkZWYgX1VuYXJ5RnVuY3Rpb24oTnVsbCBhcmdzKTsKdHlwZWRlZiBfQmluYXJ5RnVuY3Rpb24oTnVsbCBhcmdzLCBOdWxsIG1lc3NhZ2UpOwoKLyoqCiAqIFRha2VzIHRoZSByZWFsIGVudHJ5IHBvaW50IGFzIGFyZ3VtZW50IGFuZCBpbnZva2VzIGl0IHdpdGggdGhlCiAqIGluaXRpYWwgbWVzc2FnZS4gIERlZmVycyBleGVjdXRpb24gb2YgdGhlIGVudHJ5IHBvaW50IHVudGlsIHRoZQogKiBpc29sYXRlIGlzIGluIHRoZSBtZXNzYWdlIGxvb3AuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKdm9pZCBfc3RhcnRNYWluSXNvbGF0ZShGdW5jdGlvbiBlbnRyeVBvaW50LCBMaXN0PFN0cmluZz4gYXJncykgewogIF9zdGFydElzb2xhdGUoCiAgICAgIG51bGwsIC8vIG5vIHBhcmVudCBwb3J0CiAgICAgIGVudHJ5UG9pbnQsCiAgICAgIGFyZ3MsCiAgICAgIG51bGwsIC8vIG5vIG1lc3NhZ2UKICAgICAgdHJ1ZSwgLy8gaXNTcGF3blVyaQogICAgICBudWxsLCAvLyBubyBjb250cm9sIHBvcnQKICAgICAgbnVsbCk7IC8vIG5vIGNhcGFiaWxpdGllcwp9CgovKioKICogUmV0dXJucyB0aGUgX3N0YXJ0TWFpbklzb2xhdGUgZnVuY3Rpb24uIFRoaXMgY2xvc3VyaXphdGlvbiBhbGxvd3MgZW1iZWRkZXJzCiAqIHRvIHNldHVwIHRyYW1wb2xpbmVzIHRvIHRoZSBtYWluIGZ1bmN0aW9uLiBUaGlzIHdvcmthcm91bmQgY2FuIGJlIHJlbW92ZWQKICogb25jZSBzdXBwb3J0IGZvciBAcHJhZ21hKCJ2bTplbnRyeV9wb2ludCIsICJnZXQiKSBhcyBkb2N1bWVudGVkIGluCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTcyMCBsYW5kcy4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpGdW5jdGlvbiBfZ2V0U3RhcnRNYWluSXNvbGF0ZUZ1bmN0aW9uKCkgewogIHJldHVybiBfc3RhcnRNYWluSXNvbGF0ZTsKfQoKLyoqCiAqIFRha2VzIHRoZSByZWFsIGVudHJ5IHBvaW50IGFzIGFyZ3VtZW50IGFuZCBpbnZva2VzIGl0IHdpdGggdGhlIGluaXRpYWwKICogbWVzc2FnZS4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQp2b2lkIF9zdGFydElzb2xhdGUoCiAgICBTZW5kUG9ydCBwYXJlbnRQb3J0LAogICAgRnVuY3Rpb24gZW50cnlQb2ludCwKICAgIExpc3Q8U3RyaW5nPiBhcmdzLAogICAgdmFyIG1lc3NhZ2UsCiAgICBib29sIGlzU3Bhd25VcmksCiAgICBSYXdSZWNlaXZlUG9ydCBjb250cm9sUG9ydCwKICAgIExpc3QgY2FwYWJpbGl0aWVzKSB7CiAgLy8gVGhlIGNvbnRyb2wgcG9ydCAoYWthIHRoZSBtYWluIGlzb2xhdGUgcG9ydCkgZG9lcyBub3QgaGFuZGxlIGFueSBtZXNzYWdlcy4KICBpZiAoY29udHJvbFBvcnQgIT0gbnVsbCkgewogICAgY29udHJvbFBvcnQuaGFuZGxlciA9IChfKSB7fTsgLy8gTm9ib2R5IGhvbWUgb24gdGhlIGNvbnRyb2wgcG9ydC4KICB9CgogIGlmIChwYXJlbnRQb3J0ICE9IG51bGwpIHsKICAgIC8vIEJ1aWxkIGEgbWVzc2FnZSB0byBvdXIgcGFyZW50IGlzb2xhdGUgcHJvdmlkaW5nIGFjY2VzcyB0byB0aGUKICAgIC8vIGN1cnJlbnQgaXNvbGF0ZSdzIGNvbnRyb2wgcG9ydCBhbmQgY2FwYWJpbGl0aWVzLgogICAgLy8KICAgIC8vIFRPRE8oZmxvaXRzY2gpOiBTZW5kIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgZmluZCB0aGUgZW50cnkgcG9pbnQuCiAgICB2YXIgcmVhZHlNZXNzYWdlID0gbmV3IExpc3QoMik7CiAgICByZWFkeU1lc3NhZ2VbMF0gPSBjb250cm9sUG9ydC5zZW5kUG9ydDsKICAgIHJlYWR5TWVzc2FnZVsxXSA9IGNhcGFiaWxpdGllczsKCiAgICAvLyBPdXQgb2YgYW4gZXhjZXNzIG9mIHBhcmFub2lhIHdlIGNsZWFyIHRoZSBjYXBhYmlsaXRpZXMgZnJvbSB0aGUKICAgIC8vIHN0YWNrLiAgTm90IHJlYWxseSBuZWNlc3NhcnkuCiAgICBjYXBhYmlsaXRpZXMgPSBudWxsOwogICAgcGFyZW50UG9ydC5zZW5kKHJlYWR5TWVzc2FnZSk7CiAgfQogIGFzc2VydChjYXBhYmlsaXRpZXMgPT0gbnVsbCk7CgogIC8vIERlbGF5IGFsbCB1c2VyIGNvZGUgaGFuZGxpbmcgdG8gdGhlIG5leHQgcnVuIG9mIHRoZSBtZXNzYWdlIGxvb3AuIFRoaXMKICAvLyBhbGxvd3MgdXMgdG8gaW50ZXJjZXB0IGNlcnRhaW4gY29uZGl0aW9ucyBpbiB0aGUgZXZlbnQgZGlzcGF0Y2gsIHN1Y2ggYXMKICAvLyBzdGFydGluZyBpbiBwYXVzZWQgc3RhdGUuCiAgUmF3UmVjZWl2ZVBvcnQgcG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogIHBvcnQuaGFuZGxlciA9IChfKSB7CiAgICBwb3J0LmNsb3NlKCk7CgogICAgaWYgKGlzU3Bhd25VcmkpIHsKICAgICAgaWYgKGVudHJ5UG9pbnQgaXMgX0JpbmFyeUZ1bmN0aW9uKSB7CiAgICAgICAgKGVudHJ5UG9pbnQgYXMgZHluYW1pYykoYXJncywgbWVzc2FnZSk7CiAgICAgIH0gZWxzZSBpZiAoZW50cnlQb2ludCBpcyBfVW5hcnlGdW5jdGlvbikgewogICAgICAgIChlbnRyeVBvaW50IGFzIGR5bmFtaWMpKGFyZ3MpOwogICAgICB9IGVsc2UgewogICAgICAgIGVudHJ5UG9pbnQoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZW50cnlQb2ludChtZXNzYWdlKTsKICAgIH0KICB9OwogIC8vIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4KICBwb3J0LnNlbmRQb3J0LnNlbmQobnVsbCk7Cn0KCkBwYXRjaApjbGFzcyBJc29sYXRlIHsKICBzdGF0aWMgZmluYWwgX2N1cnJlbnRJc29sYXRlID0gX2dldEN1cnJlbnRJc29sYXRlKCk7CiAgc3RhdGljIGZpbmFsIF9yb290VXJpID0gX2dldEN1cnJlbnRSb290VXJpKCk7CgogIEBwYXRjaAogIHN0YXRpYyBJc29sYXRlIGdldCBjdXJyZW50ID0+IF9jdXJyZW50SXNvbGF0ZTsKCiAgQHBhdGNoCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWUgPT4gX2dldERlYnVnTmFtZShjb250cm9sUG9ydCk7CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8VXJpPiBnZXQgcGFja2FnZVJvb3QgewogICAgdmFyIGhvb2sgPSBWTUxpYnJhcnlIb29rcy5wYWNrYWdlUm9vdFVyaUZ1dHVyZTsKICAgIGlmIChob29rID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIklzb2xhdGUucGFja2FnZVJvb3QiKTsKICAgIH0KICAgIHJldHVybiBob29rKCk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFVyaT4gZ2V0IHBhY2thZ2VDb25maWcgewogICAgdmFyIGhvb2sgPSBWTUxpYnJhcnlIb29rcy5wYWNrYWdlQ29uZmlnVXJpRnV0dXJlOwogICAgaWYgKGhvb2sgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiSXNvbGF0ZS5wYWNrYWdlQ29uZmlnIik7CiAgICB9CiAgICByZXR1cm4gaG9vaygpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxVcmk+IHJlc29sdmVQYWNrYWdlVXJpKFVyaSBwYWNrYWdlVXJpKSB7CiAgICB2YXIgaG9vayA9IFZNTGlicmFyeUhvb2tzLnJlc29sdmVQYWNrYWdlVXJpRnV0dXJlOwogICAgaWYgKGhvb2sgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaSIpOwogICAgfQogICAgcmV0dXJuIGhvb2socGFja2FnZVVyaSk7CiAgfQoKICBzdGF0aWMgYm9vbCBfcGFja2FnZVN1cHBvcnRlZCgpID0+CiAgICAgIChWTUxpYnJhcnlIb29rcy5wYWNrYWdlUm9vdFVyaUZ1dHVyZSAhPSBudWxsKSAmJgogICAgICAoVk1MaWJyYXJ5SG9va3MucGFja2FnZUNvbmZpZ1VyaUZ1dHVyZSAhPSBudWxsKSAmJgogICAgICAoVk1MaWJyYXJ5SG9va3MucmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmUgIT0gbnVsbCk7CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8SXNvbGF0ZT4gc3Bhd248VD4odm9pZCBlbnRyeVBvaW50KFQgbWVzc2FnZSksIFQgbWVzc2FnZSwKICAgICAge2Jvb2wgcGF1c2VkOiBmYWxzZSwKICAgICAgYm9vbCBlcnJvcnNBcmVGYXRhbCwKICAgICAgU2VuZFBvcnQgb25FeGl0LAogICAgICBTZW5kUG9ydCBvbkVycm9yLAogICAgICBTdHJpbmcgZGVidWdOYW1lfSkgYXN5bmMgewogICAgLy8gYHBhdXNlZGAgaXNuJ3QgaGFuZGxlZCB5ZXQuCiAgICBSYXdSZWNlaXZlUG9ydCByZWFkeVBvcnQ7CiAgICB0cnkgewogICAgICAvLyBDaGVjayBmb3IgdGhlIHR5cGUgb2YgYGVudHJ5UG9pbnRgIG9uIHRoZSBzcGF3bmluZyBpc29sYXRlIHRvIG1ha2UKICAgICAgLy8gZXJyb3ItaGFuZGxpbmcgZWFzaWVyLgogICAgICBpZiAoZW50cnlQb2ludCBpcyEgX1VuYXJ5RnVuY3Rpb24pIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihlbnRyeVBvaW50KTsKICAgICAgfQogICAgICAvLyBUaGUgVk0gd2lsbCBpbnZva2UgW19zdGFydElzb2xhdGVdIHdpdGggZW50cnlQb2ludCBhcyBhcmd1bWVudC4KICAgICAgcmVhZHlQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CgogICAgICAvLyBXZSBkbyBub3QgaW5oZXJpdCB0aGUgcGFja2FnZSBjb25maWcgc2V0dGluZ3MgZnJvbSB0aGUgcGFyZW50IGlzb2xhdGUsCiAgICAgIC8vIGluc3RlYWQgd2UgdXNlIHRoZSB2YWx1ZXMgdGhhdCB3ZXJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLgogICAgICB2YXIgcGFja2FnZUNvbmZpZyA9IFZNTGlicmFyeUhvb2tzLnBhY2thZ2VDb25maWdTdHJpbmc7CiAgICAgIHZhciBzY3JpcHQgPSBWTUxpYnJhcnlIb29rcy5wbGF0Zm9ybVNjcmlwdDsKICAgICAgaWYgKHNjcmlwdCA9PSBudWxsKSB7CiAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHN1cHBvcnQgc3Bhd25pbmcgdGhlIG5ldwogICAgICAgIC8vIGlzb2xhdGUuCiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIklzb2xhdGUuc3Bhd24iKTsKICAgICAgfQogICAgICBpZiAoc2NyaXB0LnNjaGVtZSA9PSAicGFja2FnZSIpIHsKICAgICAgICBzY3JpcHQgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKHNjcmlwdCk7CiAgICAgIH0KCiAgICAgIF9zcGF3bkZ1bmN0aW9uKAogICAgICAgICAgcmVhZHlQb3J0LnNlbmRQb3J0LAogICAgICAgICAgc2NyaXB0LnRvU3RyaW5nKCksCiAgICAgICAgICBlbnRyeVBvaW50LAogICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgIHBhdXNlZCwKICAgICAgICAgIGVycm9yc0FyZUZhdGFsLAogICAgICAgICAgb25FeGl0LAogICAgICAgICAgb25FcnJvciwKICAgICAgICAgIG51bGwsCiAgICAgICAgICBwYWNrYWdlQ29uZmlnLAogICAgICAgICAgZGVidWdOYW1lKTsKICAgICAgcmV0dXJuIGF3YWl0IF9zcGF3bkNvbW1vbihyZWFkeVBvcnQpOwogICAgfSBjYXRjaCAoZSwgc3QpIHsKICAgICAgaWYgKHJlYWR5UG9ydCAhPSBudWxsKSB7CiAgICAgICAgcmVhZHlQb3J0LmNsb3NlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGF3YWl0IG5ldyBGdXR1cmU8SXNvbGF0ZT4uZXJyb3IoZSwgc3QpOwogICAgfQogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxJc29sYXRlPiBzcGF3blVyaShVcmkgdXJpLCBMaXN0PFN0cmluZz4gYXJncywgdmFyIG1lc3NhZ2UsCiAgICAgIHtib29sIHBhdXNlZDogZmFsc2UsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgYm9vbCBlcnJvcnNBcmVGYXRhbCwKICAgICAgYm9vbCBjaGVja2VkLAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBVcmkgcGFja2FnZVJvb3QsCiAgICAgIFVyaSBwYWNrYWdlQ29uZmlnLAogICAgICBib29sIGF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uOiBmYWxzZSwKICAgICAgU3RyaW5nIGRlYnVnTmFtZX0pIGFzeW5jIHsKICAgIFJhd1JlY2VpdmVQb3J0IHJlYWR5UG9ydDsKICAgIGlmIChlbnZpcm9ubWVudCAhPSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoImVudmlyb25tZW50Iik7CiAgICB9CgogICAgLy8gVmVyaWZ5IHRoYXQgbm8gbXV0dWFsbHkgZXhjbHVzaXZlIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFzc2VkLgogICAgaWYgKGF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uKSB7CiAgICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkNhbm5vdCBzaW11bHRhbmVvdXNseSByZXF1ZXN0ICIKICAgICAgICAgICAgImF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uIGFuZCBzcGVjaWZ5IGEiCiAgICAgICAgICAgICJwYWNrYWdlUm9vdC4iKTsKICAgICAgfQogICAgICBpZiAocGFja2FnZUNvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkNhbm5vdCBzaW11bHRhbmVvdXNseSByZXF1ZXN0ICIKICAgICAgICAgICAgImF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uIGFuZCBzcGVjaWZ5IGEiCiAgICAgICAgICAgICJwYWNrYWdlQ29uZmlnLiIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoKHBhY2thZ2VSb290ICE9IG51bGwpICYmIChwYWNrYWdlQ29uZmlnICE9IG51bGwpKSB7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkNhbm5vdCBzaW11bHRhbmVvdXNseSBzcGVjaWZ5IGEgIgogICAgICAgICAgICAicGFja2FnZVJvb3QgYW5kIGEgcGFja2FnZUNvbmZpZy4iKTsKICAgICAgfQogICAgfQogICAgdHJ5IHsKICAgICAgLy8gUmVzb2x2ZSB0aGUgdXJpIGFnYWluc3QgdGhlIGN1cnJlbnQgaXNvbGF0ZSdzIHJvb3QgVXJpIGZpcnN0LgogICAgICB2YXIgc3Bhd25lZFVyaSA9IF9yb290VXJpLnJlc29sdmVVcmkodXJpKTsKCiAgICAgIC8vIEluaGVyaXQgdGhpcyBpc29sYXRlJ3MgcGFja2FnZSByZXNvbHV0aW9uIHNldHVwIGlmIG5vdCBvdmVycmlkZGVuLgogICAgICBpZiAoIWF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uICYmCiAgICAgICAgICAocGFja2FnZVJvb3QgPT0gbnVsbCkgJiYKICAgICAgICAgIChwYWNrYWdlQ29uZmlnID09IG51bGwpKSB7CiAgICAgICAgaWYgKElzb2xhdGUuX3BhY2thZ2VTdXBwb3J0ZWQoKSkgewogICAgICAgICAgcGFja2FnZVJvb3QgPSBhd2FpdCBJc29sYXRlLnBhY2thZ2VSb290OwogICAgICAgICAgcGFja2FnZUNvbmZpZyA9IGF3YWl0IElzb2xhdGUucGFja2FnZUNvbmZpZzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEVuc3VyZSB0byByZXNvbHZlIHBhY2thZ2U6IFVSSXMgYmVpbmcgaGFuZGVkIGluIGFzIHBhcmFtZXRlcnMuCiAgICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsKSB7CiAgICAgICAgLy8gYHBhY2thZ2VzL2AgZGlyZWN0b3J5IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIEZvcmNlIGl0IG51bGwuCiAgICAgICAgLy8gVE9ETyhtZmFpcmh1cnN0KSBTaG91bGQgdGhpcyB0aHJvdyBhbiBleGNlcHRpb24/CiAgICAgICAgcGFja2FnZVJvb3QgPSBudWxsOwogICAgICB9IGVsc2UgaWYgKHBhY2thZ2VDb25maWcgIT0gbnVsbCkgewogICAgICAgIC8vIEF2b2lkIGNhbGxpbmcgcmVzb2x2ZVBhY2thZ2VVcmkgaWYgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBpbiBjYXNlCiAgICAgICAgLy8gdGhlIEFQSSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgIGlmIChwYWNrYWdlQ29uZmlnLnNjaGVtZSA9PSAicGFja2FnZSIpIHsKICAgICAgICAgIHBhY2thZ2VDb25maWcgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKHBhY2thZ2VDb25maWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVGhlIFZNIHdpbGwgaW52b2tlIFtfc3RhcnRJc29sYXRlXSBhbmQgbm90IGBtYWluYC4KICAgICAgcmVhZHlQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CiAgICAgIHZhciBwYWNrYWdlUm9vdFN0cmluZyA9IHBhY2thZ2VSb290Py50b1N0cmluZygpOwogICAgICB2YXIgcGFja2FnZUNvbmZpZ1N0cmluZyA9IHBhY2thZ2VDb25maWc/LnRvU3RyaW5nKCk7CgogICAgICBfc3Bhd25VcmkoCiAgICAgICAgICByZWFkeVBvcnQuc2VuZFBvcnQsCiAgICAgICAgICBzcGF3bmVkVXJpLnRvU3RyaW5nKCksCiAgICAgICAgICBhcmdzLAogICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgIHBhdXNlZCwKICAgICAgICAgIG9uRXhpdCwKICAgICAgICAgIG9uRXJyb3IsCiAgICAgICAgICBlcnJvcnNBcmVGYXRhbCwKICAgICAgICAgIGNoZWNrZWQsCiAgICAgICAgICBudWxsLAogICAgICAgICAgLyogZW52aXJvbm1lbnQgKi8KICAgICAgICAgIHBhY2thZ2VSb290U3RyaW5nLAogICAgICAgICAgcGFja2FnZUNvbmZpZ1N0cmluZywKICAgICAgICAgIGRlYnVnTmFtZSk7CiAgICAgIHJldHVybiBhd2FpdCBfc3Bhd25Db21tb24ocmVhZHlQb3J0KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKHJlYWR5UG9ydCAhPSBudWxsKSB7CiAgICAgICAgcmVhZHlQb3J0LmNsb3NlKCk7CiAgICAgIH0KICAgICAgcmV0aHJvdzsKICAgIH0KICB9CgogIHN0YXRpYyBGdXR1cmU8SXNvbGF0ZT4gX3NwYXduQ29tbW9uKFJhd1JlY2VpdmVQb3J0IHJlYWR5UG9ydCkgewogICAgQ29tcGxldGVyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8SXNvbGF0ZT4uc3luYygpOwogICAgcmVhZHlQb3J0LmhhbmRsZXIgPSAocmVhZHlNZXNzYWdlKSB7CiAgICAgIHJlYWR5UG9ydC5jbG9zZSgpOwogICAgICBpZiAocmVhZHlNZXNzYWdlIGlzIExpc3QgJiYgcmVhZHlNZXNzYWdlLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgU2VuZFBvcnQgY29udHJvbFBvcnQgPSByZWFkeU1lc3NhZ2VbMF07CiAgICAgICAgTGlzdCBjYXBhYmlsaXRpZXMgPSByZWFkeU1lc3NhZ2VbMV07CiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKG5ldyBJc29sYXRlKGNvbnRyb2xQb3J0LAogICAgICAgICAgICBwYXVzZUNhcGFiaWxpdHk6IGNhcGFiaWxpdGllc1swXSwKICAgICAgICAgICAgdGVybWluYXRlQ2FwYWJpbGl0eTogY2FwYWJpbGl0aWVzWzFdKSk7CiAgICAgIH0gZWxzZSBpZiAocmVhZHlNZXNzYWdlIGlzIFN0cmluZykgewogICAgICAgIC8vIFdlIGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIHN0YXJ0aW5nIHRoZSBuZXcgaXNvbGF0ZS4KICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihuZXcgSXNvbGF0ZVNwYXduRXhjZXB0aW9uKAogICAgICAgICAgICAnVW5hYmxlIHRvIHNwYXduIGlzb2xhdGU6ICR7cmVhZHlNZXNzYWdlfScpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4uCiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IobmV3IElzb2xhdGVTcGF3bkV4Y2VwdGlvbigKICAgICAgICAgICAgIkludGVybmFsIGVycm9yOiB1bmV4cGVjdGVkIGZvcm1hdCBmb3IgcmVhZHkgbWVzc2FnZTogIgogICAgICAgICAgICAiJyR7cmVhZHlNZXNzYWdlfSciKSk7CiAgICAgIH0KICAgIH07CiAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICB9CgogIC8vIFRPRE8oaXBvc3ZhKTogQ2xlYW51cCB0byBoYXZlIG9ubHkgb25lIGRlZmluaXRpb24uCiAgLy8gVGhlc2UgdmFsdWVzIG5lZWQgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGNsYXNzIElzb2xhdGVNZXNzYWdlSGFuZGxlcgogIC8vIGluIHZtL2lzb2xhdGUuY2MuCiAgc3RhdGljIGNvbnN0IF9QQVVTRSA9IDE7CiAgc3RhdGljIGNvbnN0IF9SRVNVTUUgPSAyOwogIHN0YXRpYyBjb25zdCBfUElORyA9IDM7CiAgc3RhdGljIGNvbnN0IF9LSUxMID0gNDsKICBzdGF0aWMgY29uc3QgX0FERF9FWElUID0gNTsKICBzdGF0aWMgY29uc3QgX0RFTF9FWElUID0gNjsKICBzdGF0aWMgY29uc3QgX0FERF9FUlJPUiA9IDc7CiAgc3RhdGljIGNvbnN0IF9ERUxfRVJST1IgPSA4OwogIHN0YXRpYyBjb25zdCBfRVJST1JfRkFUQUwgPSA5OwoKICBzdGF0aWMgdm9pZCBfc3Bhd25GdW5jdGlvbigKICAgICAgU2VuZFBvcnQgcmVhZHlQb3J0LAogICAgICBTdHJpbmcgdXJpLAogICAgICBGdW5jdGlvbiB0b3BMZXZlbEZ1bmN0aW9uLAogICAgICB2YXIgbWVzc2FnZSwKICAgICAgYm9vbCBwYXVzZWQsCiAgICAgIGJvb2wgZXJyb3JzQXJlRmF0YWwsCiAgICAgIFNlbmRQb3J0IG9uRXhpdCwKICAgICAgU2VuZFBvcnQgb25FcnJvciwKICAgICAgU3RyaW5nIHBhY2thZ2VSb290LAogICAgICBTdHJpbmcgcGFja2FnZUNvbmZpZywKICAgICAgU3RyaW5nIGRlYnVnTmFtZSkgbmF0aXZlICJJc29sYXRlX3NwYXduRnVuY3Rpb24iOwoKICBzdGF0aWMgdm9pZCBfc3Bhd25VcmkoCiAgICAgIFNlbmRQb3J0IHJlYWR5UG9ydCwKICAgICAgU3RyaW5nIHVyaSwKICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MsCiAgICAgIHZhciBtZXNzYWdlLAogICAgICBib29sIHBhdXNlZCwKICAgICAgU2VuZFBvcnQgb25FeGl0LAogICAgICBTZW5kUG9ydCBvbkVycm9yLAogICAgICBib29sIGVycm9yc0FyZUZhdGFsLAogICAgICBib29sIGNoZWNrZWQsCiAgICAgIExpc3QgZW52aXJvbm1lbnQsCiAgICAgIFN0cmluZyBwYWNrYWdlUm9vdCwKICAgICAgU3RyaW5nIHBhY2thZ2VDb25maWcsCiAgICAgIFN0cmluZyBkZWJ1Z05hbWUpIG5hdGl2ZSAiSXNvbGF0ZV9zcGF3blVyaSI7CgogIHN0YXRpYyB2b2lkIF9zZW5kT09CKHBvcnQsIG1zZykgbmF0aXZlICJJc29sYXRlX3NlbmRPT0IiOwoKICBzdGF0aWMgU3RyaW5nIF9nZXREZWJ1Z05hbWUoU2VuZFBvcnQgY29udHJvbFBvcnQpCiAgICAgIG5hdGl2ZSAiSXNvbGF0ZV9nZXREZWJ1Z05hbWUiOwoKICBAcGF0Y2gKICB2b2lkIF9wYXVzZShDYXBhYmlsaXR5IHJlc3VtZUNhcGFiaWxpdHkpIHsKICAgIHZhciBtc2cgPSBuZXcgTGlzdCg0KQogICAgICAuLlswXSA9IDAgLy8gTWFrZSByb29tIGZvciBPT0IgbWVzc2FnZSB0eXBlLgogICAgICAuLlsxXSA9IF9QQVVTRQogICAgICAuLlsyXSA9IHBhdXNlQ2FwYWJpbGl0eQogICAgICAuLlszXSA9IHJlc3VtZUNhcGFiaWxpdHk7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcmVzdW1lKENhcGFiaWxpdHkgcmVzdW1lQ2FwYWJpbGl0eSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX1JFU1VNRQogICAgICAuLlsyXSA9IHBhdXNlQ2FwYWJpbGl0eQogICAgICAuLlszXSA9IHJlc3VtZUNhcGFiaWxpdHk7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgYWRkT25FeGl0TGlzdGVuZXIoU2VuZFBvcnQgcmVzcG9uc2VQb3J0LCB7T2JqZWN0IHJlc3BvbnNlfSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0FERF9FWElUCiAgICAgIC4uWzJdID0gcmVzcG9uc2VQb3J0CiAgICAgIC4uWzNdID0gcmVzcG9uc2U7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcmVtb3ZlT25FeGl0TGlzdGVuZXIoU2VuZFBvcnQgcmVzcG9uc2VQb3J0KSB7CiAgICB2YXIgbXNnID0gbmV3IExpc3QoMykKICAgICAgLi5bMF0gPSAwIC8vIE1ha2Ugcm9vbSBmb3IgT09CIG1lc3NhZ2UgdHlwZS4KICAgICAgLi5bMV0gPSBfREVMX0VYSVQKICAgICAgLi5bMl0gPSByZXNwb25zZVBvcnQ7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgc2V0RXJyb3JzRmF0YWwoYm9vbCBlcnJvcnNBcmVGYXRhbCkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0VSUk9SX0ZBVEFMCiAgICAgIC4uWzJdID0gdGVybWluYXRlQ2FwYWJpbGl0eQogICAgICAuLlszXSA9IGVycm9yc0FyZUZhdGFsOwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIGtpbGwoe2ludCBwcmlvcml0eTogYmVmb3JlTmV4dEV2ZW50fSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDQpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0tJTEwKICAgICAgLi5bMl0gPSB0ZXJtaW5hdGVDYXBhYmlsaXR5CiAgICAgIC4uWzNdID0gcHJpb3JpdHk7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcGluZyhTZW5kUG9ydCByZXNwb25zZVBvcnQsIHtPYmplY3QgcmVzcG9uc2UsIGludCBwcmlvcml0eTogaW1tZWRpYXRlfSkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDUpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PTSBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX1BJTkcKICAgICAgLi5bMl0gPSByZXNwb25zZVBvcnQKICAgICAgLi5bM10gPSBwcmlvcml0eQogICAgICAuLls0XSA9IHJlc3BvbnNlOwogICAgX3NlbmRPT0IoY29udHJvbFBvcnQsIG1zZyk7CiAgfQoKICBAcGF0Y2gKICB2b2lkIGFkZEVycm9yTGlzdGVuZXIoU2VuZFBvcnQgcG9ydCkgewogICAgdmFyIG1zZyA9IG5ldyBMaXN0KDMpCiAgICAgIC4uWzBdID0gMCAvLyBNYWtlIHJvb20gZm9yIE9PQiBtZXNzYWdlIHR5cGUuCiAgICAgIC4uWzFdID0gX0FERF9FUlJPUgogICAgICAuLlsyXSA9IHBvcnQ7CiAgICBfc2VuZE9PQihjb250cm9sUG9ydCwgbXNnKTsKICB9CgogIEBwYXRjaAogIHZvaWQgcmVtb3ZlRXJyb3JMaXN0ZW5lcihTZW5kUG9ydCBwb3J0KSB7CiAgICB2YXIgbXNnID0gbmV3IExpc3QoMykKICAgICAgLi5bMF0gPSAwIC8vIE1ha2Ugcm9vbSBmb3IgT09CIG1lc3NhZ2UgdHlwZS4KICAgICAgLi5bMV0gPSBfREVMX0VSUk9SCiAgICAgIC4uWzJdID0gcG9ydDsKICAgIF9zZW5kT09CKGNvbnRyb2xQb3J0LCBtc2cpOwogIH0KCiAgc3RhdGljIElzb2xhdGUgX2dldEN1cnJlbnRJc29sYXRlKCkgewogICAgTGlzdCBwb3J0QW5kQ2FwYWJpbGl0aWVzID0gX2dldFBvcnRBbmRDYXBhYmlsaXRpZXNPZkN1cnJlbnRJc29sYXRlKCk7CiAgICByZXR1cm4gbmV3IElzb2xhdGUocG9ydEFuZENhcGFiaWxpdGllc1swXSwKICAgICAgICBwYXVzZUNhcGFiaWxpdHk6IHBvcnRBbmRDYXBhYmlsaXRpZXNbMV0sCiAgICAgICAgdGVybWluYXRlQ2FwYWJpbGl0eTogcG9ydEFuZENhcGFiaWxpdGllc1syXSk7CiAgfQoKICBzdGF0aWMgTGlzdCBfZ2V0UG9ydEFuZENhcGFiaWxpdGllc09mQ3VycmVudElzb2xhdGUoKQogICAgICBuYXRpdmUgIklzb2xhdGVfZ2V0UG9ydEFuZENhcGFiaWxpdGllc09mQ3VycmVudElzb2xhdGUiOwoKICBzdGF0aWMgVXJpIF9nZXRDdXJyZW50Um9vdFVyaSgpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBVcmkucGFyc2UoX2dldEN1cnJlbnRSb290VXJpU3RyKCkpOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHN0YXRpYyBTdHJpbmcgX2dldEN1cnJlbnRSb290VXJpU3RyKCkgbmF0aXZlICJJc29sYXRlX2dldEN1cnJlbnRSb290VXJpU3RyIjsKfQqCowBOTjwBTU1LKwE0ARRRAScBOhsBBxQJMwEJQz0EAgEHEwkxAgEaLj0BIDkEARUcBAExOAIBBxcGNQVIRhgGCS88HhMEAgE/RgE3RSgEARoeBAE2Py1JBAEMFhkEASEgAgEjAUcuAU0nMjAwKAIBIiYrLiYQBAIBNywkEwIBOiciMSQCARo2RQEMOi8EARocBAEgLS0EARUeBAEuMDwBPyQiIhMEATQkPk1MMxYkBAE7PgElKQQBNBwdNiE0FhYBGgQBNAIBGiofJBscBAEgTAQBFRwEASUqNgE/RwIBHCMyAQRCQyMEIkERHhIMGhofIAIBBE9NRjgEIiocAgEESgwEIhQZGRcRFSAZUB1GBAEcRTgHTyQsJAFHJRkjBCABTE4fLhcSARYrMDEnDxYIDRsGBTEcAgEHEDcwAQkxAQk2AQknNBg5BhMEAQkpNhg7BhMEAQk5Nxg/Bh0EASU3OTgBCUkbGxcYISMeCkwgKy0ISSgBUEY+MhxJFDUIKDoIARYeHRYTEhoSExAZFiwWHxsINQYEAQlLGxcYGxQnFxkuIR4fMwYBRSYhQTcdCCNBNx8IDT5DMQgGCkcxAUwpIyUrMzcKCAFIIUg8HCpNJTFKCggBPCg3OwERHiEQExISExoTEBwdHxYsEh8bCA8GBAFCOSkZPjAtNC40K0M7Og8iO0QjCAcdBAE4TxcbHBoaHh4fHyEBHhoSIRMTGxcYGhw4ARkaEhkTExcYGxQYGhwzATwBNCUBCS0aMxUeICAEAQktGjMWHiAgBAEJRRozGBsYIAQBCTUaMxgcIAQBCS0aMxsiHiAEAQkvGjMUIhggBAEJURozFBsXGCAEAQkpGjMZFCAEAQksGjMZFCAEAShKLzE2BAE4PwEkCjESEwYEAU8CASVkYXJ0Omlzb2xhdGUtcGF0Y2gvaXNvbGF0ZV9wYXRjaC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvdGltZXJfaW1wbC5kYXJ0umMvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiaXNvbGF0ZV9wYXRjaC5kYXJ0IjsKCi8vIFRpbWVyIGhlYXAgaW1wbGVtZW50ZWQgYXMgYSBhcnJheS1iYXNlZCBiaW5hcnkgaGVhcFswXS4KLy8gVGhpcyBhbGxvd3MgZm9yIE8oMSkgYGZpcnN0YCwgTyhsb2cobikpIGByZW1vdmVgL2ByZW1vdmVGaXJzdGAgYW5kIE8obG9nKG4pKQovLyBgYWRkYC4KLy8KLy8gVG8gZW5zdXJlIHRoZSB0aW1lcnMgYXJlIG9yZGVyZWQgYnkgaW5zZXJ0aW9uIHRpbWUsIHRoZSBfVGltZXIgY2xhc3MgaGFzIGEKLy8gYF9pZGAgZmllbGQgc2V0IHdoZW4gYWRkZWQgdG8gdGhlIGhlYXAuCi8vCi8vIFswXSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9oZWFwCmNsYXNzIF9UaW1lckhlYXAgewogIExpc3Q8X1RpbWVyPiBfbGlzdDsKICBpbnQgX3VzZWQgPSAwOwoKICBfVGltZXJIZWFwKFtpbnQgaW5pdFNpemUgPSA3XSkgOiBfbGlzdCA9IG5ldyBMaXN0PF9UaW1lcj4oaW5pdFNpemUpOwoKICBib29sIGdldCBpc0VtcHR5ID0+IF91c2VkID09IDA7CgogIF9UaW1lciBnZXQgZmlyc3QgPT4gX2xpc3RbMF07CgogIGJvb2wgaXNGaXJzdChfVGltZXIgdGltZXIpID0+IHRpbWVyLl9pbmRleE9yTmV4dCA9PSAwOwoKICB2b2lkIGFkZChfVGltZXIgdGltZXIpIHsKICAgIGlmIChfdXNlZCA9PSBfbGlzdC5sZW5ndGgpIHsKICAgICAgX3Jlc2l6ZSgpOwogICAgfQogICAgdGltZXIuX2luZGV4T3JOZXh0ID0gX3VzZWQrKzsKICAgIF9saXN0W3RpbWVyLl9pbmRleE9yTmV4dF0gPSB0aW1lcjsKICAgIF9idWJibGVVcCh0aW1lcik7CiAgfQoKICBfVGltZXIgcmVtb3ZlRmlyc3QoKSB7CiAgICB2YXIgZiA9IGZpcnN0OwogICAgcmVtb3ZlKGYpOwogICAgcmV0dXJuIGY7CiAgfQoKICB2b2lkIHJlbW92ZShfVGltZXIgdGltZXIpIHsKICAgIF91c2VkLS07CiAgICBpZiAoaXNFbXB0eSkgewogICAgICBfbGlzdFswXSA9IG51bGw7CiAgICAgIHRpbWVyLl9pbmRleE9yTmV4dCA9IG51bGw7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBsYXN0ID0gX2xpc3RbX3VzZWRdOwogICAgaWYgKCFpZGVudGljYWwobGFzdCwgdGltZXIpKSB7CiAgICAgIGxhc3QuX2luZGV4T3JOZXh0ID0gdGltZXIuX2luZGV4T3JOZXh0OwogICAgICBfbGlzdFtsYXN0Ll9pbmRleE9yTmV4dF0gPSBsYXN0OwogICAgICBpZiAobGFzdC5fY29tcGFyZVRvKHRpbWVyKSA8IDApIHsKICAgICAgICBfYnViYmxlVXAobGFzdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2J1YmJsZURvd24obGFzdCk7CiAgICAgIH0KICAgIH0KICAgIF9saXN0W191c2VkXSA9IG51bGw7CiAgICB0aW1lci5faW5kZXhPck5leHQgPSBudWxsOwogIH0KCiAgdm9pZCBfcmVzaXplKCkgewogICAgdmFyIG5ld0xpc3QgPSBuZXcgTGlzdDxfVGltZXI+KF9saXN0Lmxlbmd0aCAqIDIgKyAxKTsKICAgIG5ld0xpc3Quc2V0UmFuZ2UoMCwgX3VzZWQsIF9saXN0KTsKICAgIF9saXN0ID0gbmV3TGlzdDsKICB9CgogIHZvaWQgX2J1YmJsZVVwKF9UaW1lciB0aW1lcikgewogICAgd2hpbGUgKCFpc0ZpcnN0KHRpbWVyKSkgewogICAgICBUaW1lciBwYXJlbnQgPSBfcGFyZW50KHRpbWVyKTsKICAgICAgaWYgKHRpbWVyLl9jb21wYXJlVG8ocGFyZW50KSA8IDApIHsKICAgICAgICBfc3dhcCh0aW1lciwgcGFyZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfYnViYmxlRG93bihfVGltZXIgdGltZXIpIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGludCBsZWZ0SW5kZXggPSBfbGVmdENoaWxkSW5kZXgodGltZXIuX2luZGV4T3JOZXh0KTsKICAgICAgaW50IHJpZ2h0SW5kZXggPSBfcmlnaHRDaGlsZEluZGV4KHRpbWVyLl9pbmRleE9yTmV4dCk7CiAgICAgIF9UaW1lciBuZXdlc3QgPSB0aW1lcjsKICAgICAgaWYgKGxlZnRJbmRleCA8IF91c2VkICYmIF9saXN0W2xlZnRJbmRleF0uX2NvbXBhcmVUbyhuZXdlc3QpIDwgMCkgewogICAgICAgIG5ld2VzdCA9IF9saXN0W2xlZnRJbmRleF07CiAgICAgIH0KICAgICAgaWYgKHJpZ2h0SW5kZXggPCBfdXNlZCAmJiBfbGlzdFtyaWdodEluZGV4XS5fY29tcGFyZVRvKG5ld2VzdCkgPCAwKSB7CiAgICAgICAgbmV3ZXN0ID0gX2xpc3RbcmlnaHRJbmRleF07CiAgICAgIH0KICAgICAgaWYgKGlkZW50aWNhbChuZXdlc3QsIHRpbWVyKSkgewogICAgICAgIC8vIFdlIGFyZSB3aGVyZSB3ZSBzaG91bGQgYmUsIGJyZWFrLgogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIF9zd2FwKG5ld2VzdCwgdGltZXIpOwogICAgfQogIH0KCiAgdm9pZCBfc3dhcChfVGltZXIgZmlyc3QsIF9UaW1lciBzZWNvbmQpIHsKICAgIGludCB0bXAgPSBmaXJzdC5faW5kZXhPck5leHQ7CiAgICBmaXJzdC5faW5kZXhPck5leHQgPSBzZWNvbmQuX2luZGV4T3JOZXh0OwogICAgc2Vjb25kLl9pbmRleE9yTmV4dCA9IHRtcDsKICAgIF9saXN0W2ZpcnN0Ll9pbmRleE9yTmV4dF0gPSBmaXJzdDsKICAgIF9saXN0W3NlY29uZC5faW5kZXhPck5leHRdID0gc2Vjb25kOwogIH0KCiAgVGltZXIgX3BhcmVudChfVGltZXIgdGltZXIpID0+IF9saXN0W19wYXJlbnRJbmRleCh0aW1lci5faW5kZXhPck5leHQpXTsKICBUaW1lciBfbGVmdENoaWxkKF9UaW1lciB0aW1lcikgPT4gX2xpc3RbX2xlZnRDaGlsZEluZGV4KHRpbWVyLl9pbmRleE9yTmV4dCldOwogIFRpbWVyIF9yaWdodENoaWxkKF9UaW1lciB0aW1lcikgPT4KICAgICAgX2xpc3RbX3JpZ2h0Q2hpbGRJbmRleCh0aW1lci5faW5kZXhPck5leHQpXTsKCiAgc3RhdGljIGludCBfcGFyZW50SW5kZXgoaW50IGluZGV4KSA9PiAoaW5kZXggLSAxKSB+LyAyOwogIHN0YXRpYyBpbnQgX2xlZnRDaGlsZEluZGV4KGludCBpbmRleCkgPT4gMiAqIGluZGV4ICsgMTsKICBzdGF0aWMgaW50IF9yaWdodENoaWxkSW5kZXgoaW50IGluZGV4KSA9PiAyICogaW5kZXggKyAyOwp9CgpjbGFzcyBfVGltZXIgaW1wbGVtZW50cyBUaW1lciB7CiAgLy8gQ2FuY2VscyB0aGUgdGltZXIgaW4gdGhlIGV2ZW50IGhhbmRsZXIuCiAgc3RhdGljIGNvbnN0IF9OT19USU1FUiA9IC0xOwoKICAvLyBXZSBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgbWVzc2FnZSBhcnJpdmVkIGJhc2VkIG9uIHRoZSB2YWx1ZSBiZWluZyBzZW50LgogIHN0YXRpYyBjb25zdCBfWkVST19FVkVOVCA9IDE7CiAgc3RhdGljIGNvbnN0IF9USU1FT1VUX0VWRU5UID0gbnVsbDsKCiAgLy8gVGltZXJzIGFyZSBvcmRlcmVkIGJ5IHdha2V1cCB0aW1lLiBUaW1lcnMgd2l0aCBhIHRpbWVvdXQgdmFsdWUgb2YgPiAwIGRvCiAgLy8gZW5kIHVwIG9uIHRoZSBUaW1lckhlYXAuIFRpbWVycyB3aXRoIGEgdGltZW91dCBvZiAwIGFyZSBxdWV1ZWQgaW4gYSBsaXN0LgogIHN0YXRpYyBmaW5hbCBfaGVhcCA9IG5ldyBfVGltZXJIZWFwKCk7CiAgc3RhdGljIF9UaW1lciBfZmlyc3RaZXJvVGltZXI7CiAgc3RhdGljIF9UaW1lciBfbGFzdFplcm9UaW1lcjsKCiAgLy8gV2UgdXNlIGFuIGlkIHRvIGJlIGFibGUgdG8gc29ydCB0aW1lcnMgd2l0aCB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUuCiAgLy8gaWRzIGFyZSByZWN5Y2xlZCBhZnRlciBJRF9NQVNLIGVucXVldWVzIG9yIHdoZW4gdGhlIHRpbWVyIHF1ZXVlIGlzIGVtcHR5LgogIHN0YXRpYyBjb25zdCBfSURfTUFTSyA9IDB4MWZmZmZmZmY7CiAgc3RhdGljIGludCBfaWRDb3VudCA9IDA7CgogIHN0YXRpYyBSYXdSZWNlaXZlUG9ydCBfcmVjZWl2ZVBvcnQ7CiAgc3RhdGljIFNlbmRQb3J0IF9zZW5kUG9ydDsKICBzdGF0aWMgaW50IF9zY2hlZHVsZWRXYWtldXBUaW1lOwoKICBzdGF0aWMgYm9vbCBfaGFuZGxpbmdDYWxsYmFja3MgPSBmYWxzZTsKCiAgRnVuY3Rpb24gX2NhbGxiYWNrOyAvLyBDbG9zdXJlIHRvIGNhbGwgd2hlbiB0aW1lciBmaXJlcy4gbnVsbCBpZiBjYW5jZWxlZC4KICBpbnQgX3dha2V1cFRpbWU7IC8vIEV4cGlyYXRpb24gdGltZS4KICBmaW5hbCBpbnQgX21pbGxpU2Vjb25kczsgLy8gRHVyYXRpb24gc3BlY2lmaWVkIGF0IGNyZWF0aW9uLgogIGZpbmFsIGJvb2wgX3JlcGVhdGluZzsgLy8gSW5kaWNhdGVzIHBlcmlvZGljIHRpbWVycy4KICB2YXIgX2luZGV4T3JOZXh0OyAvLyBJbmRleCBpZiBwYXJ0IG9mIHRoZSBUaW1lckhlYXAsIGxpbmsgb3RoZXJ3aXNlLgogIGludCBfaWQ7IC8vIEluY3JlbWVudGluZyBpZCB0byBlbmFibGUgc29ydGluZyBvZiB0aW1lcnMgd2l0aCBzYW1lIGV4cGlyeS4KCiAgaW50IF90aWNrID0gMDsgLy8gQmFja2luZyBmb3IgW3RpY2tdLAoKICAvLyBHZXQgdGhlIG5leHQgYXZhaWxhYmxlIGlkLiBXZSBhY2NlcHQgY29sbGlzaW9ucyBhbmQgcmVvcmRlcmluZyB3aGVuIHRoZQogIC8vIF9pZENvdW50IG92ZXJmbG93cyBhbmQgdGhlIHRpbWVycyBleHBpcmUgYXQgdGhlIHNhbWUgbWlsbGlzZWNvbmQuCiAgc3RhdGljIGludCBfbmV4dElkKCkgewogICAgdmFyIHJlc3VsdCA9IF9pZENvdW50OwogICAgX2lkQ291bnQgPSAoX2lkQ291bnQgKyAxKSAmIF9JRF9NQVNLOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIF9UaW1lci5faW50ZXJuYWwoCiAgICAgIHRoaXMuX2NhbGxiYWNrLCB0aGlzLl93YWtldXBUaW1lLCB0aGlzLl9taWxsaVNlY29uZHMsIHRoaXMuX3JlcGVhdGluZykKICAgICAgOiBfaWQgPSBfbmV4dElkKCk7CgogIHN0YXRpYyBUaW1lciBfY3JlYXRlVGltZXIoCiAgICAgIHZvaWQgY2FsbGJhY2soVGltZXIgdGltZXIpLCBpbnQgbWlsbGlTZWNvbmRzLCBib29sIHJlcGVhdGluZykgewogICAgLy8gTmVnYXRpdmUgdGltZW91dHMgYXJlIHRyZWF0ZWQgYXMgaWYgMCB0aW1lb3V0LgogICAgaWYgKG1pbGxpU2Vjb25kcyA8IDApIHsKICAgICAgbWlsbGlTZWNvbmRzID0gMDsKICAgIH0KICAgIC8vIEFkZCBvbmUgYmVjYXVzZSBEYXRlVGltZS5ub3coKSBpcyBhc3N1bWVkIHRvIHJvdW5kIGRvd24KICAgIC8vIHRvIG5lYXJlc3QgbWlsbGlzZWNvbmQsIG5vdCB1cCwgc28gdGhhdCB0aW1lICsgZHVyYXRpb24gaXMgYmVmb3JlCiAgICAvLyBkdXJhdGlvbiBtaWxsaXNlY29uZHMgZnJvbSBub3cuIFVzaW5nIG1pY3Jvc2Vjb25kIHRpbWVycyBsaWtlCiAgICAvLyBTdG9wd2F0Y2ggYWxsb3dzIGRldGVjdGluZyB0aGF0IHRoZSB0aW1lciBmaXJlcyBlYXJseS4KICAgIGludCBub3cgPSBWTUxpYnJhcnlIb29rcy50aW1lck1pbGxpc2Vjb25kQ2xvY2soKTsKICAgIGludCB3YWtldXBUaW1lID0gKG1pbGxpU2Vjb25kcyA9PSAwKSA/IG5vdyA6IChub3cgKyAxICsgbWlsbGlTZWNvbmRzKTsKCiAgICBfVGltZXIgdGltZXIgPQogICAgICAgIG5ldyBfVGltZXIuX2ludGVybmFsKGNhbGxiYWNrLCB3YWtldXBUaW1lLCBtaWxsaVNlY29uZHMsIHJlcGVhdGluZyk7CiAgICAvLyBFbnF1ZXVlIHRoaXMgbmV3bHkgY3JlYXRlZCB0aW1lciBpbiB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlIGFuZAogICAgLy8gbm90aWZ5IGlmIG5lY2Vzc2FyeS4KICAgIHRpbWVyLl9lbnF1ZXVlKCk7CiAgICByZXR1cm4gdGltZXI7CiAgfQoKICBmYWN0b3J5IF9UaW1lcihpbnQgbWlsbGlTZWNvbmRzLCB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSkgewogICAgcmV0dXJuIF9jcmVhdGVUaW1lcihjYWxsYmFjaywgbWlsbGlTZWNvbmRzLCBmYWxzZSk7CiAgfQoKICBmYWN0b3J5IF9UaW1lci5wZXJpb2RpYyhpbnQgbWlsbGlTZWNvbmRzLCB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSkgewogICAgcmV0dXJuIF9jcmVhdGVUaW1lcihjYWxsYmFjaywgbWlsbGlTZWNvbmRzLCB0cnVlKTsKICB9CgogIGJvb2wgZ2V0IF9pc0luSGVhcCA9PiBfaW5kZXhPck5leHQgaXMgaW50OwoKICBpbnQgX2NvbXBhcmVUbyhfVGltZXIgb3RoZXIpIHsKICAgIGludCBjID0gX3dha2V1cFRpbWUgLSBvdGhlci5fd2FrZXVwVGltZTsKICAgIGlmIChjICE9IDApIHJldHVybiBjOwogICAgcmV0dXJuIF9pZCAtIG90aGVyLl9pZDsKICB9CgogIGJvb2wgZ2V0IGlzQWN0aXZlID0+IF9jYWxsYmFjayAhPSBudWxsOwoKICBpbnQgZ2V0IHRpY2sgPT4gX3RpY2s7CgogIC8vIENhbmNlbHMgYSBzZXQgdGltZXIuIFRoZSB0aW1lciBpcyByZW1vdmVkIGZyb20gdGhlIHRpbWVyIGhlYXAgaWYgaXQgaXMgYQogIC8vIG5vbi16ZXJvIHRpbWVyLiBaZXJvIHRpbWVycyBhcmUga2VwdCBpbiB0aGUgbGlzdCBhcyB0aGV5IG5lZWQgdG8gY29uc3VtZQogIC8vIHRoZSBjb3JyZXNwb25kaW5nIHBlbmRpbmcgbWVzc2FnZS4KICB2b2lkIGNhbmNlbCgpIHsKICAgIF9jYWxsYmFjayA9IG51bGw7CiAgICAvLyBPbmx5IGhlYXAgdGltZXJzIGFyZSByZWFsbHkgcmVtb3ZlZC4gWmVybyB0aW1lcnMgbmVlZCB0byBjb25zdW1lIHRoZWlyCiAgICAvLyBjb3JyZXNwb25kaW5nIHdha2V1cCBtZXNzYWdlIHNvIHRoZXkgYXJlIGxlZnQgaW4gdGhlIHF1ZXVlLgogICAgaWYgKCFfaXNJbkhlYXApIHJldHVybjsKICAgIGJvb2wgdXBkYXRlID0gX2hlYXAuaXNGaXJzdCh0aGlzKTsKICAgIF9oZWFwLnJlbW92ZSh0aGlzKTsKICAgIGlmICh1cGRhdGUpIHsKICAgICAgX25vdGlmeUV2ZW50SGFuZGxlcigpOwogICAgfQogIH0KCiAgdm9pZCBfYWR2YW5jZVdha2V1cFRpbWUoKSB7CiAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgbmV4dCB3YWtldXAgdGltZS4gRm9yIHJlcGVhdGluZyB0aW1lcnMgd2l0aCBhIDAgdGltZW91dAogICAgLy8gdGhlIG5leHQgd2FrZXVwIHRpbWUgaXMgbm93LgogICAgX2lkID0gX25leHRJZCgpOwogICAgaWYgKF9taWxsaVNlY29uZHMgPiAwKSB7CiAgICAgIF93YWtldXBUaW1lICs9IF9taWxsaVNlY29uZHM7CiAgICB9IGVsc2UgewogICAgICBfd2FrZXVwVGltZSA9IFZNTGlicmFyeUhvb2tzLnRpbWVyTWlsbGlzZWNvbmRDbG9jaygpOwogICAgfQogIH0KCiAgLy8gQWRkcyBhIHRpbWVyIHRvIHRoZSBoZWFwIG9yIHRpbWVyIGxpc3QuIFRpbWVycyB3aXRoIHRoZSBzYW1lIHdha2V1cCB0aW1lCiAgLy8gYXJlIGVucXVldWVkIGluIG9yZGVyIGFuZCBub3RpZmllZCBpbiBGSUZPIG9yZGVyLgogIHZvaWQgX2VucXVldWUoKSB7CiAgICBpZiAoX21pbGxpU2Vjb25kcyA9PSAwKSB7CiAgICAgIGlmIChfZmlyc3RaZXJvVGltZXIgPT0gbnVsbCkgewogICAgICAgIF9sYXN0WmVyb1RpbWVyID0gdGhpczsKICAgICAgICBfZmlyc3RaZXJvVGltZXIgPSB0aGlzOwogICAgICB9IGVsc2UgewogICAgICAgIF9sYXN0WmVyb1RpbWVyLl9pbmRleE9yTmV4dCA9IHRoaXM7CiAgICAgICAgX2xhc3RaZXJvVGltZXIgPSB0aGlzOwogICAgICB9CiAgICAgIC8vIEV2ZXJ5IHplcm8gdGltZXIgZ2V0cyBpdHMgb3duIGV2ZW50LgogICAgICBfbm90aWZ5WmVyb0hhbmRsZXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9oZWFwLmFkZCh0aGlzKTsKICAgICAgaWYgKF9oZWFwLmlzRmlyc3QodGhpcykpIHsKICAgICAgICBfbm90aWZ5RXZlbnRIYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIEVucXVldWUgb25lIG1lc3NhZ2UgZm9yIGVhY2ggemVybyB0aW1lci4gVG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBmcm9tCiAgLy8gRXZlbnRIYW5kbGVyIG1lc3NhZ2VzIHdlIHNlbmQgYSBfWkVST19FVkVOVCBpbnN0ZWFkIG9mIGEgX1RJTUVPVVRfRVZFTlQuCiAgc3RhdGljIHZvaWQgX25vdGlmeVplcm9IYW5kbGVyKCkgewogICAgaWYgKF9zZW5kUG9ydCA9PSBudWxsKSB7CiAgICAgIF9jcmVhdGVUaW1lckhhbmRsZXIoKTsKICAgIH0KICAgIF9zZW5kUG9ydC5zZW5kKF9aRVJPX0VWRU5UKTsKICB9CgogIC8vIEhhbmRsZSB0aGUgbm90aWZpY2F0aW9uIG9mIGEgemVybyB0aW1lci4gTWFrZSBzdXJlIHRvIGFsc28gZXhlY3V0ZSBub24temVybwogIC8vIHRpbWVycyB3aXRoIGEgbG93ZXIgZXhwaXJhdGlvbiB0aW1lLgogIHN0YXRpYyBMaXN0IF9xdWV1ZUZyb21aZXJvRXZlbnQoKSB7CiAgICB2YXIgcGVuZGluZ1RpbWVycyA9IG5ldyBMaXN0KCk7CiAgICBhc3NlcnQoX2ZpcnN0WmVyb1RpbWVyICE9IG51bGwpOwogICAgLy8gQ29sbGVjdCBwZW5kaW5nIHRpbWVycyBmcm9tIHRoZSB0aW1lciBoZWFwIHRoYXQgaGF2ZSBhbiBleHBpcmF0aW9uIHByaW9yCiAgICAvLyB0byB0aGUgY3VycmVudGx5IG5vdGlmaWVkIHplcm8gdGltZXIuCiAgICB2YXIgdGltZXI7CiAgICB3aGlsZSAoIV9oZWFwLmlzRW1wdHkgJiYgKF9oZWFwLmZpcnN0Ll9jb21wYXJlVG8oX2ZpcnN0WmVyb1RpbWVyKSA8IDApKSB7CiAgICAgIHRpbWVyID0gX2hlYXAucmVtb3ZlRmlyc3QoKTsKICAgICAgcGVuZGluZ1RpbWVycy5hZGQodGltZXIpOwogICAgfQogICAgLy8gQXBwZW5kIHRoZSBmaXJzdCB6ZXJvIHRpbWVyIHRvIHRoZSBwZW5kaW5nIHRpbWVycy4KICAgIHRpbWVyID0gX2ZpcnN0WmVyb1RpbWVyOwogICAgX2ZpcnN0WmVyb1RpbWVyID0gdGltZXIuX2luZGV4T3JOZXh0OwogICAgdGltZXIuX2luZGV4T3JOZXh0ID0gbnVsbDsKICAgIHBlbmRpbmdUaW1lcnMuYWRkKHRpbWVyKTsKICAgIHJldHVybiBwZW5kaW5nVGltZXJzOwogIH0KCiAgc3RhdGljIHZvaWQgX25vdGlmeUV2ZW50SGFuZGxlcigpIHsKICAgIGlmIChfaGFuZGxpbmdDYWxsYmFja3MpIHsKICAgICAgLy8gV2hpbGUgd2UgYXJlIGFscmVhZHkgaGFuZGxpbmcgY2FsbGJhY2tzIHdlIHdpbGwgbm90IG5vdGlmeSB0aGUgZXZlbnQKICAgICAgLy8gaGFuZGxlci4gX2hhbmRsZVRpbWVvdXQgd2lsbCBjYWxsIF9ub3RpZnlFdmVudEhhbmRsZXIgb25jZSBhbGwgcGVuZGluZwogICAgICAvLyB0aW1lcnMgYXJlIHByb2Nlc3NlZC4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIElmIHRoZXJlIGFyZSBubyBwZW5kaW5nIHRpbWVycy4gQ2xvc2UgZG93biB0aGUgcmVjZWl2ZSBwb3J0LgogICAgaWYgKChfZmlyc3RaZXJvVGltZXIgPT0gbnVsbCkgJiYgX2hlYXAuaXNFbXB0eSkgewogICAgICAvLyBObyBwZW5kaW5nIHRpbWVyczogQ2xvc2UgdGhlIHJlY2VpdmUgcG9ydCBhbmQgbGV0IHRoZSBldmVudCBoYW5kbGVyCiAgICAgIC8vIGtub3cuCiAgICAgIGlmIChfc2VuZFBvcnQgIT0gbnVsbCkgewogICAgICAgIF9jYW5jZWxXYWtldXAoKTsKICAgICAgICBfc2h1dGRvd25UaW1lckhhbmRsZXIoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKF9oZWFwLmlzRW1wdHkpIHsKICAgICAgLy8gT25seSB6ZXJvIHRpbWVycyBhcmUgbGVmdC4gQ2FuY2VsIGFueSBzY2hlZHVsZWQgd2FrZXVwcy4KICAgICAgX2NhbmNlbFdha2V1cCgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gT25seSBzZW5kIGEgbWVzc2FnZSBpZiB0aGUgcmVxdWVzdGVkIHdha2V1cCB0aW1lIGRpZmZlcnMgZnJvbSB0aGUKICAgIC8vIGFscmVhZHkgc2NoZWR1bGVkIHdha2V1cCB0aW1lLgogICAgdmFyIHdha2V1cFRpbWUgPSBfaGVhcC5maXJzdC5fd2FrZXVwVGltZTsKICAgIGlmICgoX3NjaGVkdWxlZFdha2V1cFRpbWUgPT0gbnVsbCkgfHwKICAgICAgICAod2FrZXVwVGltZSAhPSBfc2NoZWR1bGVkV2FrZXVwVGltZSkpIHsKICAgICAgX3NjaGVkdWxlV2FrZXVwKHdha2V1cFRpbWUpOwogICAgfQogIH0KCiAgc3RhdGljIExpc3QgX3F1ZXVlRnJvbVRpbWVvdXRFdmVudCgpIHsKICAgIHZhciBwZW5kaW5nVGltZXJzID0gbmV3IExpc3QoKTsKICAgIGlmIChfZmlyc3RaZXJvVGltZXIgIT0gbnVsbCkgewogICAgICAvLyBDb2xsZWN0IHBlbmRpbmcgdGltZXJzIGZyb20gdGhlIHRpbWVyIGhlYXAgdGhhdCBoYXZlIGFuIGV4cGlyYXRpb24KICAgICAgLy8gcHJpb3IgdG8gdGhlIG5leHQgemVybyB0aW1lci4KICAgICAgLy8gQnkgZGVmaW5pdGlvbiB0aGUgZmlyc3QgemVybyB0aW1lciBoYXMgYmVlbiBzY2hlZHVsZWQgYmVmb3JlIHRoZQogICAgICAvLyBjdXJyZW50IHRpbWUsIG1lYW5pbmcgYWxsIHRpbWVycyB3aGljaCBhcmUgImxlc3MgdGhhbiIgdGhlIGZpcnN0IHplcm8KICAgICAgLy8gdGltZXIgYXJlIGV4cGlyZWQuIFRoZSBmaXJzdCB6ZXJvIHRpbWVyIHdpbGwgYmUgZGlzcGF0Y2hlZCB3aGVuIGl0cwogICAgICAvLyBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaXMgZGVsaXZlcmVkLgogICAgICB2YXIgdGltZXI7CiAgICAgIHdoaWxlICghX2hlYXAuaXNFbXB0eSAmJiAoX2hlYXAuZmlyc3QuX2NvbXBhcmVUbyhfZmlyc3RaZXJvVGltZXIpIDwgMCkpIHsKICAgICAgICB0aW1lciA9IF9oZWFwLnJlbW92ZUZpcnN0KCk7CiAgICAgICAgcGVuZGluZ1RpbWVycy5hZGQodGltZXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBDb2xsZWN0IHBlbmRpbmcgdGltZXJzIGZyb20gdGhlIHRpbWVyIGhlYXAgd2hpY2ggaGF2ZSBleHBpcmVkIGF0IHRoaXMKICAgICAgLy8gdGltZS4KICAgICAgdmFyIGN1cnJlbnRUaW1lID0gVk1MaWJyYXJ5SG9va3MudGltZXJNaWxsaXNlY29uZENsb2NrKCk7CiAgICAgIHZhciB0aW1lcjsKICAgICAgd2hpbGUgKCFfaGVhcC5pc0VtcHR5ICYmIChfaGVhcC5maXJzdC5fd2FrZXVwVGltZSA8PSBjdXJyZW50VGltZSkpIHsKICAgICAgICB0aW1lciA9IF9oZWFwLnJlbW92ZUZpcnN0KCk7CiAgICAgICAgcGVuZGluZ1RpbWVycy5hZGQodGltZXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGVuZGluZ1RpbWVyczsKICB9CgogIHN0YXRpYyB2b2lkIF9ydW5UaW1lcnMoTGlzdCBwZW5kaW5nVGltZXJzKSB7CiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyB0aW1lcnMgY3VycmVudGx5IHJlc2V0IHRoZSBpZCBzcGFjZSBiZWZvcmUgd2UKICAgIC8vIGhhdmUgYSBjaGFuY2UgdG8gZW5xdWV1ZSBuZXcgdGltZXJzLgogICAgaWYgKF9oZWFwLmlzRW1wdHkgJiYgKF9maXJzdFplcm9UaW1lciA9PSBudWxsKSkgewogICAgICBfaWRDb3VudCA9IDA7CiAgICB9CgogICAgLy8gRmFzdCBleGl0IGlmIG5vIHBlbmRpbmcgdGltZXJzLgogICAgaWYgKHBlbmRpbmdUaW1lcnMubGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFRyaWdnZXIgYWxsIG9mIHRoZSBwZW5kaW5nIHRpbWVycy4gTmV3IHRpbWVycyBhZGRlZCBhcyBwYXJ0IG9mIHRoZQogICAgLy8gY2FsbGJhY2tzIHdpbGwgYmUgZW5xdWV1ZWQgbm93IGFuZCBub3RpZmllZCBpbiB0aGUgbmV4dCBzcGluIGF0IHRoZQogICAgLy8gZWFybGllc3QuCiAgICBfaGFuZGxpbmdDYWxsYmFja3MgPSB0cnVlOwogICAgdmFyIGkgPSAwOwogICAgdHJ5IHsKICAgICAgZm9yICg7IGkgPCBwZW5kaW5nVGltZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gTmV4dCBwZW5kaW5nIHRpbWVyLgogICAgICAgIHZhciB0aW1lciA9IHBlbmRpbmdUaW1lcnNbaV07CiAgICAgICAgdGltZXIuX2luZGV4T3JOZXh0ID0gbnVsbDsKCiAgICAgICAgLy8gT25lIG9mIHRoZSB0aW1lcnMgaW4gdGhlIHBlbmRpbmdfdGltZXJzIGxpc3QgY2FuIGNhbmNlbAogICAgICAgIC8vIG9uZSBvZiB0aGUgbGF0ZXIgdGltZXJzIHdoaWNoIHdpbGwgc2V0IHRoZSBjYWxsYmFjayB0bwogICAgICAgIC8vIG51bGwuIE9yIHRoZSBwZW5kaW5nIHplcm8gdGltZXIgaGFzIGJlZW4gY2FuY2VsZWQgZWFybGllci4KICAgICAgICBpZiAodGltZXIuX2NhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgIHZhciBjYWxsYmFjayA9IHRpbWVyLl9jYWxsYmFjazsKICAgICAgICAgIGlmICghdGltZXIuX3JlcGVhdGluZykgewogICAgICAgICAgICAvLyBNYXJrIHRpbWVyIGFzIGluYWN0aXZlLgogICAgICAgICAgICB0aW1lci5fY2FsbGJhY2sgPSBudWxsOwogICAgICAgICAgfSBlbHNlIGlmICh0aW1lci5fbWlsbGlTZWNvbmRzID4gMCkgewogICAgICAgICAgICB2YXIgbXMgPSB0aW1lci5fbWlsbGlTZWNvbmRzOwogICAgICAgICAgICBpbnQgb3ZlcmR1ZSA9CiAgICAgICAgICAgICAgICBWTUxpYnJhcnlIb29rcy50aW1lck1pbGxpc2Vjb25kQ2xvY2soKSAtIHRpbWVyLl93YWtldXBUaW1lOwogICAgICAgICAgICBpZiAob3ZlcmR1ZSA+IG1zKSB7CiAgICAgICAgICAgICAgaW50IG1pc3NlZFRpY2tzID0gb3ZlcmR1ZSB+LyBtczsKICAgICAgICAgICAgICB0aW1lci5fd2FrZXVwVGltZSArPSBtaXNzZWRUaWNrcyAqIG1zOwogICAgICAgICAgICAgIHRpbWVyLl90aWNrICs9IG1pc3NlZFRpY2tzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aW1lci5fdGljayArPSAxOwoKICAgICAgICAgIGNhbGxiYWNrKHRpbWVyKTsKICAgICAgICAgIC8vIFJlLWluc2VydCByZXBlYXRpbmcgdGltZXIgaWYgbm90IGNhbmNlbGVkLgogICAgICAgICAgaWYgKHRpbWVyLl9yZXBlYXRpbmcgJiYgKHRpbWVyLl9jYWxsYmFjayAhPSBudWxsKSkgewogICAgICAgICAgICB0aW1lci5fYWR2YW5jZVdha2V1cFRpbWUoKTsKICAgICAgICAgICAgdGltZXIuX2VucXVldWUoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEV4ZWN1dGUgcGVuZGluZyBtaWNybyB0YXNrcy4KICAgICAgICAgIHZhciBpbW1lZGlhdGVDYWxsYmFjayA9IF9yZW1vdmVQZW5kaW5nSW1tZWRpYXRlQ2FsbGJhY2soKTsKICAgICAgICAgIGlmIChpbW1lZGlhdGVDYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgIGltbWVkaWF0ZUNhbGxiYWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGZpbmFsbHkgewogICAgICBfaGFuZGxpbmdDYWxsYmFja3MgPSBmYWxzZTsKICAgICAgLy8gUmUtcXVldWUgdGltZXJzIHdlIGRpZG4ndCBnZXQgdG8uCiAgICAgIGZvciAoaSsrOyBpIDwgcGVuZGluZ1RpbWVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciB0aW1lciA9IHBlbmRpbmdUaW1lcnNbaV07CiAgICAgICAgdGltZXIuX2VucXVldWUoKTsKICAgICAgfQogICAgICBfbm90aWZ5RXZlbnRIYW5kbGVyKCk7CiAgICB9CiAgfQoKICBzdGF0aWMgdm9pZCBfaGFuZGxlTWVzc2FnZShtc2cpIHsKICAgIHZhciBwZW5kaW5nVGltZXJzOwogICAgaWYgKG1zZyA9PSBfWkVST19FVkVOVCkgewogICAgICBwZW5kaW5nVGltZXJzID0gX3F1ZXVlRnJvbVplcm9FdmVudCgpOwogICAgICBhc3NlcnQocGVuZGluZ1RpbWVycy5sZW5ndGggPiAwKTsKICAgIH0gZWxzZSB7CiAgICAgIGFzc2VydChtc2cgPT0gX1RJTUVPVVRfRVZFTlQpOwogICAgICBfc2NoZWR1bGVkV2FrZXVwVGltZSA9IG51bGw7IC8vIENvbnN1bWVkIHRoZSBsYXN0IHNjaGVkdWxlZCB3YWtldXAgbm93LgogICAgICBwZW5kaW5nVGltZXJzID0gX3F1ZXVlRnJvbVRpbWVvdXRFdmVudCgpOwogICAgfQogICAgX3J1blRpbWVycyhwZW5kaW5nVGltZXJzKTsKICAgIC8vIE5vdGlmeSB0aGUgZXZlbnQgaGFuZGxlciBvciBzaHV0ZG93biB0aGUgcG9ydCBpZiBubyBtb3JlIHBlbmRpbmcKICAgIC8vIHRpbWVycyBhcmUgcHJlc2VudC4KICAgIF9ub3RpZnlFdmVudEhhbmRsZXIoKTsKICB9CgogIC8vIFRlbGwgdGhlIGV2ZW50IGhhbmRsZXIgdG8gd2FrZSB0aGlzIGlzb2xhdGUgYXQgYSBzcGVjaWZpYyB0aW1lLgogIHN0YXRpYyB2b2lkIF9zY2hlZHVsZVdha2V1cChpbnQgd2FrZXVwVGltZSkgewogICAgaWYgKF9zZW5kUG9ydCA9PSBudWxsKSB7CiAgICAgIF9jcmVhdGVUaW1lckhhbmRsZXIoKTsKICAgIH0KICAgIFZNTGlicmFyeUhvb2tzLmV2ZW50SGFuZGxlclNlbmREYXRhKG51bGwsIF9zZW5kUG9ydCwgd2FrZXVwVGltZSk7CiAgICBfc2NoZWR1bGVkV2FrZXVwVGltZSA9IHdha2V1cFRpbWU7CiAgfQoKICAvLyBDYW5jZWwgcGVuZGluZyB3YWtldXBzIGluIHRoZSBldmVudCBoYW5kbGVyLgogIHN0YXRpYyB2b2lkIF9jYW5jZWxXYWtldXAoKSB7CiAgICBpZiAoX3NlbmRQb3J0ICE9IG51bGwpIHsKICAgICAgVk1MaWJyYXJ5SG9va3MuZXZlbnRIYW5kbGVyU2VuZERhdGEobnVsbCwgX3NlbmRQb3J0LCBfTk9fVElNRVIpOwogICAgICBfc2NoZWR1bGVkV2FrZXVwVGltZSA9IG51bGw7CiAgICB9CiAgfQoKICAvLyBDcmVhdGUgYSByZWNlaXZlIHBvcnQgYW5kIHJlZ2lzdGVyIGEgbWVzc2FnZSBoYW5kbGVyIGZvciB0aGUgdGltZXIKICAvLyBldmVudHMuCiAgc3RhdGljIHZvaWQgX2NyZWF0ZVRpbWVySGFuZGxlcigpIHsKICAgIGFzc2VydChfcmVjZWl2ZVBvcnQgPT0gbnVsbCk7CiAgICBhc3NlcnQoX3NlbmRQb3J0ID09IG51bGwpOwogICAgX3JlY2VpdmVQb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KF9oYW5kbGVNZXNzYWdlKTsKICAgIF9zZW5kUG9ydCA9IF9yZWNlaXZlUG9ydC5zZW5kUG9ydDsKICAgIF9zY2hlZHVsZWRXYWtldXBUaW1lID0gbnVsbDsKICB9CgogIHN0YXRpYyB2b2lkIF9zaHV0ZG93blRpbWVySGFuZGxlcigpIHsKICAgIF9yZWNlaXZlUG9ydC5jbG9zZSgpOwogICAgX3JlY2VpdmVQb3J0ID0gbnVsbDsKICAgIF9zZW5kUG9ydCA9IG51bGw7CiAgICBfc2NoZWR1bGVkV2FrZXVwVGltZSA9IG51bGw7CiAgfQoKICAvLyBUaGUgVGltZXIgZmFjdG9yeSByZWdpc3RlcmVkIHdpdGggdGhlIGRhcnQ6YXN5bmMgbGlicmFyeSBieSB0aGUgZW1iZWRkZXIuCiAgc3RhdGljIFRpbWVyIF9mYWN0b3J5KAogICAgICBpbnQgbWlsbGlTZWNvbmRzLCB2b2lkIGNhbGxiYWNrKFRpbWVyIHRpbWVyKSwgYm9vbCByZXBlYXRpbmcpIHsKICAgIGlmIChyZXBlYXRpbmcpIHsKICAgICAgcmV0dXJuIG5ldyBfVGltZXIucGVyaW9kaWMobWlsbGlTZWNvbmRzLCBjYWxsYmFjayk7CiAgICB9CiAgICByZXR1cm4gbmV3IF9UaW1lcihtaWxsaVNlY29uZHMsIGNhbGxiYWNrKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpfc2V0dXBIb29rcygpIHsKICBWTUxpYnJhcnlIb29rcy50aW1lckZhY3RvcnkgPSBfVGltZXIuX2ZhY3Rvcnk7Cn0KgdcATk48ASEBO1AKA04rAzATFhEBRwEiASABOQEbIREGIicWBAEZEw8OBAEeDRMXIQ4GHSMuJygZDxsIBhkfBAETOicVBAEhHiUqHg8PCAYEASMTOz0dSiMITCQIJi0PCBwGBAEsIi4fJykEAUpQJTMBOjo7AgEgLR8BUCAmAU5PKSEgAUtPJhsBJh0jASoBTSc+N0dMASgBTUcZGyoTBAEUTRkBHUY2HBgGP0lFPjZLARNNSRwWEgQBQTgEAUo3BAEtASEtGhwEASoBGQFOTigSFk5DHCcYEh0GBAEeTyQVHSQNPAYEAU43FB4lHyAPLB8ILhwNFyEfCAYEAU1OJR0dBiEEAVEqJiQlUC0PTiMgBjodKh8eGgQBJh5OUB8OBgFENk0PHxkhCA4gQhcOBgFJJi4qMCMGBAEpJCNMJ0pPTS0RUCUiCA1PD0ARSyUiCAYaBAEvTSw2FAYBJyUOBgFKSxEfDwouHyYjAUNCRicqIyckMCoaTCAvNSoODBwBGzg/KB4MKkUrIQwKCBAiKzEmGggdBgQBJBceLSgNJU4wBh9IGxsEAUUwHR0GRicEATIgHUcjBgQBSA0mIh83JyEEASgaGRYhBAFPGUYVOgYvBAIBIhAxAgEiZGFydDppc29sYXRlLXBhdGNoL3RpbWVyX2ltcGwuZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaXNvbGF0ZS9jYXBhYmlsaXR5LmRhcnSE6S8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaXNvbGF0ZTsKCi8qKgogKiBBbiB1bmZvcmdlYWJsZSBvYmplY3QgdGhhdCBjb21lcyBiYWNrIGFzIGVxdWFsIHdoZW4gcGFzc2VkIHRocm91Z2ggb3RoZXIKICogaXNvbGF0ZXMuCiAqCiAqIFNlbmRpbmcgYSBjYXBhYmlsaXR5IG9iamVjdCB0byBhbm90aGVyIGlzb2xhdGUsIGFuZCBnZXR0aW5nIGl0IGJhY2ssCiAqIHdpbGwgcHJvZHVjZSBhbiBvYmplY3QgdGhhdCBpcyBlcXVhbCB0byB0aGUgb3JpZ2luYWwuCiAqIFRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBjcmVhdGUgb2JqZWN0cyBlcXVhbCB0byBhIGNhcGFiaWxpdHkgb2JqZWN0LgogKgogKiBDYXBhYmlsaXRpZXMgY2FuIGJlIHVzZWQgYXMgYWNjZXNzIGd1YXJkczogQSByZW1vdGUgaXNvbGF0ZSBjYW4gc2VuZAogKiBhIHJlcXVlc3QgZm9yIGFuIG9wZXJhdGlvbiwgYnV0IGl0IGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUgcmVxdWVzdCBjb250YWlucwogKiB0aGUgY29ycmVjdCBjYXBhYmlsaXR5IG9iamVjdC4KICoKICogVGhpcyBhbGxvd3MgZXhwb3NpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIHRvIG11bHRpcGxlIGNsaWVudHMsCiAqIGJ1dCByZXN0cmljdGluZyBzb21lIG9wZXJhdGlvbnMgdG8gb25seSB0aG9zZSBjbGllbnRzCiAqIHRoYXQgaGF2ZSBhbHNvIGJlZW4gZ2l2ZW4gdGhlIGNvcnJlc3BvbmRpbmcgY2FwYWJpbGl0eS4KICoKICogQ2FwYWJpbGl0aWVzIGNhbiBiZSB1c2VkIGluc2lkZSBhIHNpbmdsZSBpc29sYXRlLAogKiBidXQgdGhleSBoYXZlIG5vIGFkdmFudGFnZSBvdmVyCiAqIGp1c3QgdXNpbmcgYG5ldyBPYmplY3RgIHRvIGNyZWF0ZSBhIHVuaXF1ZSBvYmplY3QsCiAqIGFuZCBpdCBvZmZlcnMgbm8gcmVhbCBzZWN1cml0eSBhZ2FpbnN0IG90aGVyIGNvZGUKICogcnVubmluZyBpbiB0aGUgc2FtZSBpc29sYXRlLgogKi8KY2xhc3MgQ2FwYWJpbGl0eSB7CiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IHVuZm9yZ2VhYmxlIGNhcGFiaWxpdHkgb2JqZWN0LgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgQ2FwYWJpbGl0eSgpOwp9CiQATk48ARYBBEwNA0g5SQNITiIDQDk7AzUjNjUgBBMGMQYhAgEcZGFydDppc29sYXRlL2NhcGFiaWxpdHkuZGFydCpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvbWF0aC9tYXRoLmRhcnSZSC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTWF0aGVtYXRpY2FsIGNvbnN0YW50cyBhbmQgZnVuY3Rpb25zLCBwbHVzIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCi8vLwovLy8gVG8gdXNlIHRoaXMgbGlicmFyeSBpbiB5b3VyIGNvZGU6Ci8vLwovLy8gICAgIGltcG9ydCAnZGFydDptYXRoJzsKLy8vCi8vLyB7QGNhdGVnb3J5IENvcmV9CmxpYnJhcnkgZGFydC5tYXRoOwoKcGFydCAiamVua2luc19zbWlfaGFzaC5kYXJ0IjsKcGFydCAicG9pbnQuZGFydCI7CnBhcnQgInJhbmRvbS5kYXJ0IjsKcGFydCAicmVjdGFuZ2xlLmRhcnQiOwoKLy8vIEJhc2Ugb2YgdGhlIG5hdHVyYWwgbG9nYXJpdGhtcy4KLy8vCi8vLyBUeXBpY2FsbHkgd3JpdHRlbiBhcyAiZSIuCmNvbnN0IGRvdWJsZSBlID0gMi43MTgyODE4Mjg0NTkwNDU7CgovLy8gTmF0dXJhbCBsb2dhcml0aG0gb2YgMTAuCi8vLwovLy8gVGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIDEwIGlzIHRoZSBudW1iZXIgc3VjaCB0aGF0IGBwb3coRSwgTE4xMCkgPT0gMTBgLgovLy8gVGhpcyB2YWx1ZSBpcyBub3QgZXhhY3QsIGJ1dCBpdCBpcyB0aGUgY2xvc2VzdCByZXByZXNlbnRhYmxlIGRvdWJsZSB0byB0aGUKLy8vIGV4YWN0IG1hdGhlbWF0aWNhbCB2YWx1ZS4KY29uc3QgZG91YmxlIGxuMTAgPSAyLjMwMjU4NTA5Mjk5NDA0NjsKCi8vLyBOYXR1cmFsIGxvZ2FyaXRobSBvZiAyLgovLy8KLy8vIFRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAyIGlzIHRoZSBudW1iZXIgc3VjaCB0aGF0IGBwb3coRSwgTE4yKSA9PSAyYC4KLy8vIFRoaXMgdmFsdWUgaXMgbm90IGV4YWN0LCBidXQgaXQgaXMgdGhlIGNsb3Nlc3QgcmVwcmVzZW50YWJsZSBkb3VibGUgdG8gdGhlCi8vLyBleGFjdCBtYXRoZW1hdGljYWwgdmFsdWUuCmNvbnN0IGRvdWJsZSBsbjIgPSAwLjY5MzE0NzE4MDU1OTk0NTM7CgovLy8gQmFzZS0yIGxvZ2FyaXRobSBvZiBbZV0uCmNvbnN0IGRvdWJsZSBsb2cyZSA9IDEuNDQyNjk1MDQwODg4OTYzNDsKCi8vLyBCYXNlLTEwIGxvZ2FyaXRobSBvZiBbZV0uCmNvbnN0IGRvdWJsZSBsb2cxMGUgPSAwLjQzNDI5NDQ4MTkwMzI1MTg7CgovLy8gVGhlIFBJIGNvbnN0YW50Lgpjb25zdCBkb3VibGUgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzI7CgovLy8gU3F1YXJlIHJvb3Qgb2YgMS8yLgpjb25zdCBkb3VibGUgc3FydDFfMiA9IDAuNzA3MTA2NzgxMTg2NTQ3NjsKCi8vLyBTcXVhcmUgcm9vdCBvZiAyLgpjb25zdCBkb3VibGUgc3FydDIgPSAxLjQxNDIxMzU2MjM3MzA5NTE7CgovLy8gUmV0dXJucyB0aGUgbGVzc2VyIG9mIHR3byBudW1iZXJzLgovLy8KLy8vIFJldHVybnMgTmFOIGlmIGVpdGhlciBhcmd1bWVudCBpcyBOYU4uCi8vLyBUaGUgbGVzc2VyIG9mIGAtMC4wYCBhbmQgYDAuMGAgaXMgYC0wLjBgLgovLy8gSWYgdGhlIGFyZ3VtZW50cyBhcmUgb3RoZXJ3aXNlIGVxdWFsIChpbmNsdWRpbmcgaW50IGFuZCBkb3VibGVzIHdpdGggdGhlCi8vLyBzYW1lIG1hdGhlbWF0aWNhbCB2YWx1ZSkgdGhlbiBpdCBpcyB1bnNwZWNpZmllZCB3aGljaCBvZiB0aGUgdHdvIGFyZ3VtZW50cwovLy8gaXMgcmV0dXJuZWQuCmV4dGVybmFsIFQgbWluPFQgZXh0ZW5kcyBudW0+KFQgYSwgVCBiKTsKCi8vLyBSZXR1cm5zIHRoZSBsYXJnZXIgb2YgdHdvIG51bWJlcnMuCi8vLwovLy8gUmV0dXJucyBOYU4gaWYgZWl0aGVyIGFyZ3VtZW50IGlzIE5hTi4KLy8vIFRoZSBsYXJnZXIgb2YgYC0wLjBgIGFuZCBgMC4wYCBpcyBgMC4wYC4gSWYgdGhlIGFyZ3VtZW50cyBhcmUKLy8vIG90aGVyd2lzZSBlcXVhbCAoaW5jbHVkaW5nIGludCBhbmQgZG91YmxlcyB3aXRoIHRoZSBzYW1lIG1hdGhlbWF0aWNhbCB2YWx1ZSkKLy8vIHRoZW4gaXQgaXMgdW5zcGVjaWZpZWQgd2hpY2ggb2YgdGhlIHR3byBhcmd1bWVudHMgaXMgcmV0dXJuZWQuCmV4dGVybmFsIFQgbWF4PFQgZXh0ZW5kcyBudW0+KFQgYSwgVCBiKTsKCi8vLyBBIHZhcmlhbnQgb2YgW2F0YW5dLgovLy8KLy8vIENvbnZlcnRzIGJvdGggYXJndW1lbnRzIHRvIFtkb3VibGVdcy4KLy8vCi8vLyBSZXR1cm5zIHRoZSBhbmdsZSBpbiByYWRpYW5zIGJldHdlZW4gdGhlIHBvc2l0aXZlIHgtYXhpcwovLy8gYW5kIHRoZSB2ZWN0b3IgKFtiXSxbYV0pLgovLy8gVGhlIHJlc3VsdCBpcyBpbiB0aGUgcmFuZ2UgLVBJLi5QSS4KLy8vCi8vLyBJZiBbYl0gaXMgcG9zaXRpdmUsIHRoaXMgaXMgdGhlIHNhbWUgYXMgYGF0YW4oYi9hKWAuCi8vLwovLy8gVGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSB3aGVuIFthXSBpcyBuZWdhdGl2ZSAoaW5jbHVkaW5nIHdoZW4gW2FdIGlzIHRoZQovLy8gZG91YmxlIC0wLjApLgovLy8KLy8vIElmIFthXSBpcyBlcXVhbCB0byB6ZXJvLCB0aGUgdmVjdG9yIChbYl0sW2FdKSBpcyBjb25zaWRlcmVkIHBhcmFsbGVsIHRvCi8vLyB0aGUgeC1heGlzLCBldmVuIGlmIFtiXSBpcyBhbHNvIGVxdWFsIHRvIHplcm8uIFRoZSBzaWduIG9mIFtiXSBkZXRlcm1pbmVzCi8vLyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB2ZWN0b3IgYWxvbmcgdGhlIHgtYXhpcy4KLy8vCi8vLyBSZXR1cm5zIE5hTiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgTmFOLgpleHRlcm5hbCBkb3VibGUgYXRhbjIobnVtIGEsIG51bSBiKTsKCi8vLyBSZXR1cm5zIFt4XSB0byB0aGUgcG93ZXIgb2YgW2V4cG9uZW50XS4KLy8vCi8vLyBJZiBbeF0gaXMgYW4gW2ludF0gYW5kIFtleHBvbmVudF0gaXMgYSBub24tbmVnYXRpdmUgW2ludF0sIHRoZSByZXN1bHQgaXMKLy8vIGFuIFtpbnRdLCBvdGhlcndpc2UgYm90aCBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBkb3VibGVzIGZpcnN0LCBhbmQgdGhlCi8vLyByZXN1bHQgaXMgYSBbZG91YmxlXS4KLy8vCi8vLyBGb3IgaW50ZWdlcnMsIHRoZSBwb3dlciBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIG1hdGhlbWF0aWNhbCByZXN1bHQgb2YgYHhgIHRvCi8vLyB0aGUgcG93ZXIgYGV4cG9uZW50YCwgb25seSBsaW1pdGVkIGJ5IHRoZSBhdmFpbGFibGUgbWVtb3J5LgovLy8KLy8vIEZvciBkb3VibGVzLCBgcG93KHgsIHkpYCBoYW5kbGVzIGVkZ2UgY2FzZXMgYXMgZm9sbG93czoKLy8vCi8vLyAtIGlmIGB5YCBpcyB6ZXJvICgwLjAgb3IgLTAuMCksIHRoZSByZXN1bHQgaXMgYWx3YXlzIDEuMC4KLy8vIC0gaWYgYHhgIGlzIDEuMCwgdGhlIHJlc3VsdCBpcyBhbHdheXMgMS4wLgovLy8gLSBvdGhlcndpc2UsIGlmIGVpdGhlciBgeGAgb3IgYHlgIGlzIE5hTiB0aGVuIHRoZSByZXN1bHQgaXMgTmFOLgovLy8gLSBpZiBgeGAgaXMgbmVnYXRpdmUgKGJ1dCBub3QgLTAuMCkgYW5kIGB5YCBpcyBhIGZpbml0ZSBub24taW50ZWdlciwgdGhlCi8vLyAgIHJlc3VsdCBpcyBOYU4uCi8vLyAtIGlmIGB4YCBpcyBJbmZpbml0eSBhbmQgYHlgIGlzIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGlzIDAuMC4KLy8vIC0gaWYgYHhgIGlzIEluZmluaXR5IGFuZCBgeWAgaXMgcG9zaXRpdmUsIHRoZSByZXN1bHQgaXMgSW5maW5pdHkuCi8vLyAtIGlmIGB4YCBpcyAwLjAgYW5kIGB5YCBpcyBuZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyBJbmZpbml0eS4KLy8vIC0gaWYgYHhgIGlzIDAuMCBhbmQgYHlgIGlzIHBvc2l0aXZlLCB0aGUgcmVzdWx0IGlzIDAuMC4KLy8vIC0gaWYgYHhgIGlzIC1JbmZpbml0eSBvciAtMC4wIGFuZCBgeWAgaXMgYW4gb2RkIGludGVnZXIsIHRoZW4gdGhlIHJlc3VsdCBpcwovLy8gICBgLXBvdygteCAseSlgLgovLy8gLSBpZiBgeGAgaXMgLUluZmluaXR5IG9yIC0wLjAgYW5kIGB5YCBpcyBub3QgYW4gb2RkIGludGVnZXIsIHRoZW4gdGhlIHJlc3VsdAovLy8gICBpcyB0aGUgc2FtZSBhcyBgcG93KC14ICwgeSlgLgovLy8gLSBpZiBgeWAgaXMgSW5maW5pdHkgYW5kIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBgeGAgaXMgbGVzcyB0aGFuIDEsIHRoZQovLy8gICByZXN1bHQgaXMgMC4wLgovLy8gLSBpZiBgeWAgaXMgSW5maW5pdHkgYW5kIGB4YCBpcyAtMSwgdGhlIHJlc3VsdCBpcyAxLjAuCi8vLyAtIGlmIGB5YCBpcyBJbmZpbml0eSBhbmQgdGhlIGFic29sdXRlIHZhbHVlIG9mIGB4YCBpcyBncmVhdGVyIHRoYW4gMSwKLy8vICAgdGhlIHJlc3VsdCBpcyBJbmZpbml0eS4KLy8vIC0gaWYgYHlgIGlzIC1JbmZpbml0eSwgdGhlIHJlc3VsdCBpcyBgMS9wb3coeCwgSW5maW5pdHkpYC4KLy8vCi8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBgcG93YCBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZSBJRUVFIFN0YW5kYXJkCi8vLyA3NTQtMjAwOC4KLy8vCi8vLyBOb3RpY2UgdGhhdCB0aGUgcmVzdWx0IG1heSBvdmVyZmxvdy4gSWYgaW50ZWdlcnMgYXJlIHJlcHJlc2VudGVkIGFzIDY0LWJpdAovLy8gbnVtYmVycywgYW4gaW50ZWdlciByZXN1bHQgbWF5IGJlIHRydW5jYXRlZCwgYW5kIGEgZG91YmxlIHJlc3VsdCBtYXkKLy8vIG92ZXJmbG93IHRvIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIFtkb3VibGUuaW5maW5pdHldLgpleHRlcm5hbCBudW0gcG93KG51bSB4LCBudW0gZXhwb25lbnQpOwoKLy8vIENvbnZlcnRzIFtyYWRpYW5zXSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIHRoZSBzaW5lIG9mIHRoZSB2YWx1ZS4KLy8vCi8vLyBJZiBbcmFkaWFuc10gaXMgbm90IGEgZmluaXRlIG51bWJlciwgdGhlIHJlc3VsdCBpcyBOYU4uCmV4dGVybmFsIGRvdWJsZSBzaW4obnVtIHJhZGlhbnMpOwoKLy8vIENvbnZlcnRzIFtyYWRpYW5zXSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIHRoZSBjb3NpbmUgb2YgdGhlIHZhbHVlLgovLy8KLy8vIElmIFtyYWRpYW5zXSBpcyBub3QgYSBmaW5pdGUgbnVtYmVyLCB0aGUgcmVzdWx0IGlzIE5hTi4KZXh0ZXJuYWwgZG91YmxlIGNvcyhudW0gcmFkaWFucyk7CgovLy8gQ29udmVydHMgW3JhZGlhbnNdIHRvIGEgW2RvdWJsZV0gYW5kIHJldHVybnMgdGhlIHRhbmdlbnQgb2YgdGhlIHZhbHVlLgovLy8KLy8vIFRoZSB0YW5nZW50IGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYHNpbihyYWRpYW5zKS9jb3MocmFkaWFucylgIGFuZCBtYXkgYmUKLy8vIGluZmluaXRlIChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgd2hlbiBgY29zKHJhZGlhbnMpYCBpcyBlcXVhbCB0byB6ZXJvLgovLy8gSWYgW3JhZGlhbnNdIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIsIHRoZSByZXN1bHQgaXMgTmFOLgpleHRlcm5hbCBkb3VibGUgdGFuKG51bSByYWRpYW5zKTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyBpdHMgYXJjIGNvc2luZSBpbiByYWRpYW5zLgovLy8KLy8vIFJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgMC4uUEksIG9yIE5hTiBpZiBbeF0gaXMgb3V0c2lkZQovLy8gdGhlIHJhbmdlIC0xLi4xLgpleHRlcm5hbCBkb3VibGUgYWNvcyhudW0geCk7CgovLy8gQ29udmVydHMgW3hdIHRvIGEgW2RvdWJsZV0gYW5kIHJldHVybnMgaXRzIGFyYyBzaW5lIGluIHJhZGlhbnMuCi8vLwovLy8gUmV0dXJucyBhIHZhbHVlIGluIHRoZSByYW5nZSAtUEkvMi4uUEkvMiwgb3IgTmFOIGlmIFt4XSBpcyBvdXRzaWRlCi8vLyB0aGUgcmFuZ2UgLTEuLjEuCmV4dGVybmFsIGRvdWJsZSBhc2luKG51bSB4KTsKCi8vLyBDb252ZXJ0cyBbeF0gdG8gYSBbZG91YmxlXSBhbmQgcmV0dXJucyBpdHMgYXJjIHRhbmdlbnQgaW4gcmFkaWFucy4KLy8vCi8vLyBSZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIC1QSS8yLi5QSS8yLCBvciBOYU4gaWYgW3hdIGlzIE5hTi4KZXh0ZXJuYWwgZG91YmxlIGF0YW4obnVtIHgpOwoKLy8vIENvbnZlcnRzIFt4XSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIHRoZSBwb3NpdGl2ZSBzcXVhcmUgcm9vdCBvZiB0aGUKLy8vIHZhbHVlLgovLy8KLy8vIFJldHVybnMgLTAuMCBpZiBbeF0gaXMgLTAuMCwgYW5kIE5hTiBpZiBbeF0gaXMgb3RoZXJ3aXNlIG5lZ2F0aXZlIG9yIE5hTi4KZXh0ZXJuYWwgZG91YmxlIHNxcnQobnVtIHgpOwoKLy8vIENvbnZlcnRzIFt4XSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIHRoZSBuYXR1cmFsIGV4cG9uZW50LCBbZV0sCi8vLyB0byB0aGUgcG93ZXIgW3hdLgovLy8KLy8vIFJldHVybnMgTmFOIGlmIFt4XSBpcyBOYU4uCmV4dGVybmFsIGRvdWJsZSBleHAobnVtIHgpOwoKLy8vIENvbnZlcnRzIFt4XSB0byBhIFtkb3VibGVdIGFuZCByZXR1cm5zIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiB0aGUgdmFsdWUuCi8vLwovLy8gUmV0dXJucyBuZWdhdGl2ZSBpbmZpbml0eSBpZiBbeF0gaXMgZXF1YWwgdG8gemVyby4KLy8vIFJldHVybnMgTmFOIGlmIFt4XSBpcyBOYU4gb3IgbGVzcyB0aGFuIHplcm8uCmV4dGVybmFsIGRvdWJsZSBsb2cobnVtIHgpOwqAtQBOTjwBSgQmBBwEFRMBHhMUFwEkBB4kAR0ETk8eJwEcBEtPHicBHSkBHioBFSYBGCsBFikBJwQrLk1PESkBJwQrQlFDKQEZBCoEPR4oBDkESxIETE4yBCslASwETU8aBFFABDwEPi9FTRVBRkE8UBVRJEsVO0oePwRIDgRPSTgnAUgEPCIBSgQ8IgFLBFFKPCIBRgRBFR0BRARHFR0BRwREHQFLCwROHQFGFgQfHAFPBDcxHAEJZGFydDptYXRoL29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvbWF0aF9wYXRjaC5kYXJ0o9AvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIE5vdGU6IHRoZSBWTSBjb25jYXRlbmF0ZXMgYWxsIHBhdGNoIGZpbGVzIGludG8gYSBzaW5nbGUgcGF0Y2ggZmlsZS4gVGhpcwovLy8gZmlsZSBpcyB0aGUgZmlyc3QgcGF0Y2ggaW4gImRhcnQ6bWF0aCIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzIHVzZWQKLy8vIGJ5IHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhIHNoYXJlZAovLy8gZnJvbnQgZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBwYXRjaDsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIiBzaG93IFVpbnQzMkxpc3Q7CgovLy8gVGhlcmUgYXJlIG5vIHBhcnRzIG9mIHRoaXMgcGF0Y2ggbGlicmFyeS4KCkBwYXRjaApUIG1pbjxUIGV4dGVuZHMgbnVtPihUIGEsIFQgYikgewogIC8vIFRoZXNlIHBhcnRpYWxseSByZWR1bmRhbnQgdHlwZSBjaGVja3MgaW1wcm92ZSBjb2RlIHF1YWxpdHkgZm9yIGRhcnQyanMuCiAgLy8gTW9zdCBvZiB0aGUgaW1wcm92ZW1lbnQgaXMgYXQgY2FsbCBzaXRlcyBmcm9tIHRoZSBpbmZlcnJlZCBub24tbnVsbCBudW0KICAvLyByZXR1cm4gdHlwZS4KICBpZiAoYSBpcyEgbnVtKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihhKTsKICBpZiAoYiBpcyEgbnVtKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihiKTsKCiAgaWYgKGEgPiBiKSByZXR1cm4gYjsKICBpZiAoYSA8IGIpIHJldHVybiBhOwogIGlmIChiIGlzIGRvdWJsZSkgewogICAgLy8gU3BlY2lhbCBjYXNlIGZvciBOYU4gYW5kIC0wLjAuIElmIG9uZSBhcmd1bWVudCBpcyBOYU4gcmV0dXJuIE5hTi4KICAgIC8vIFttaW5dIG11c3QgYWxzbyBkaXN0aW5ndWlzaCBiZXR3ZWVuIC0wLjAgYW5kIDAuMC4KICAgIGlmIChhIGlzIGRvdWJsZSkgewogICAgICBpZiAoYSA9PSAwLjApIHsKICAgICAgICAvLyBhIGlzIGVpdGhlciAwLjAgb3IgLTAuMC4gYiBpcyBlaXRoZXIgMC4wLCAtMC4wIG9yIE5hTi4KICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHJldHVybnMgLTAuMCBpZiBlaXRoZXIgYSBvciBiIGlzIC0wLjAsIGFuZCBpdAogICAgICAgIC8vIHJldHVybnMgTmFOIGlmIGIgaXMgTmFOLgogICAgICAgIG51bSBuID0gKGEgKyBiKSAqIGEgKiBiOwogICAgICAgIHJldHVybiBuOwogICAgICB9CiAgICB9CiAgICAvLyBDaGVjayBmb3IgTmFOIGFuZCBiID09IC0wLjAuCiAgICBpZiAoYSA9PSAwICYmIGIuaXNOZWdhdGl2ZSB8fCBiLmlzTmFOKSByZXR1cm4gYjsKICAgIHJldHVybiBhOwogIH0KICByZXR1cm4gYTsKfQoKQHBhdGNoClQgbWF4PFQgZXh0ZW5kcyBudW0+KFQgYSwgVCBiKSB7CiAgLy8gVGhlc2UgcGFydGlhbGx5IHJlZHVuZGFudCB0eXBlIGNoZWNrcyBpbXByb3ZlIGNvZGUgcXVhbGl0eSBmb3IgZGFydDJqcy4KICAvLyBNb3N0IG9mIHRoZSBpbXByb3ZlbWVudCBpcyBhdCBjYWxsIHNpdGVzIGZyb20gdGhlIGluZmVycmVkIG5vbi1udWxsIG51bQogIC8vIHJldHVybiB0eXBlLgogIGlmIChhIGlzISBudW0pIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGEpOwogIGlmIChiIGlzISBudW0pIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGIpOwoKICBpZiAoYSA+IGIpIHJldHVybiBhOwogIGlmIChhIDwgYikgcmV0dXJuIGI7CiAgaWYgKGIgaXMgZG91YmxlKSB7CiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIE5hTiBhbmQgLTAuMC4gSWYgb25lIGFyZ3VtZW50IGlzIE5hTiByZXR1cm4gTmFOLgogICAgLy8gW21heF0gbXVzdCBhbHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gLTAuMCBhbmQgMC4wLgogICAgaWYgKGEgaXMgZG91YmxlKSB7CiAgICAgIGlmIChhID09IDAuMCkgewogICAgICAgIC8vIGEgaXMgZWl0aGVyIDAuMCBvciAtMC4wLiBiIGlzIGVpdGhlciAwLjAsIC0wLjAsIG9yIE5hTi4KICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHJldHVybnMgMC4wIGlmIGVpdGhlciBhIG9yIGIgaXMgMC4wLCBhbmQgaXQKICAgICAgICAvLyByZXR1cm5zIE5hTiBpZiBiIGlzIE5hTi4KICAgICAgICBudW0gbiA9IGEgKyBiOwogICAgICAgIHJldHVybiBuOwogICAgICB9CiAgICB9CiAgICAvLyBDaGVjayBmb3IgTmFOLgogICAgaWYgKGIuaXNOYU4pIHJldHVybiBiOwogICAgcmV0dXJuIGE7CiAgfQogIC8vIG1heCgtMC4wLCAwKSBtdXN0IHJldHVybiAwLgogIGlmIChiID09IDAgJiYgYS5pc05lZ2F0aXZlKSByZXR1cm4gYjsKICByZXR1cm4gYTsKfQoKLy8gSWYgW3hdIGlzIGFuIFtpbnRdIGFuZCBbZXhwb25lbnRdIGlzIGEgbm9uLW5lZ2F0aXZlIFtpbnRdLCB0aGUgcmVzdWx0IGlzCi8vIGFuIFtpbnRdLCBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIFtkb3VibGVdLgpAcGF0Y2gKbnVtIHBvdyhudW0geCwgbnVtIGV4cG9uZW50KSB7CiAgaWYgKCh4IGlzIGludCkgJiYgKGV4cG9uZW50IGlzIGludCkgJiYgKGV4cG9uZW50ID49IDApKSB7CiAgICByZXR1cm4gX2ludFBvdyh4LCBleHBvbmVudCk7CiAgfQogIHJldHVybiBfZG91YmxlUG93KHgudG9Eb3VibGUoKSwgZXhwb25lbnQudG9Eb3VibGUoKSk7Cn0KCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKZG91YmxlIF9kb3VibGVQb3coZG91YmxlIGJhc2UsIGRvdWJsZSBleHBvbmVudCkgewogIGlmIChleHBvbmVudCA9PSAwLjApIHsKICAgIHJldHVybiAxLjA7IC8vIEVDTUEtMjYyIDE1LjguMi4xMwogIH0KICAvLyBTcGVlZCB1cCBzaW1wbGUgY2FzZXMuCiAgaWYgKGV4cG9uZW50ID09IDEuMCkgcmV0dXJuIGJhc2U7CiAgaWYgKGV4cG9uZW50ID09IDIuMCkgcmV0dXJuIGJhc2UgKiBiYXNlOwogIGlmIChleHBvbmVudCA9PSAzLjApIHJldHVybiBiYXNlICogYmFzZSAqIGJhc2U7CgogIGlmIChiYXNlID09IDEuMCkgcmV0dXJuIDEuMDsKCiAgaWYgKGJhc2UuaXNOYU4gfHwgZXhwb25lbnQuaXNOYU4pIHsKICAgIHJldHVybiBkb3VibGUubmFuOwogIH0KICBpZiAoKGJhc2UgIT0gLWRvdWJsZS5pbmZpbml0eSkgJiYgKGV4cG9uZW50ID09IDAuNSkpIHsKICAgIGlmIChiYXNlID09IDAuMCkgewogICAgICByZXR1cm4gMC4wOwogICAgfQogICAgcmV0dXJuIHNxcnQoYmFzZSk7CiAgfQogIHJldHVybiBfcG93KGJhc2UudG9Eb3VibGUoKSwgZXhwb25lbnQudG9Eb3VibGUoKSk7Cn0KCmRvdWJsZSBfcG93KGRvdWJsZSBiYXNlLCBkb3VibGUgZXhwb25lbnQpIG5hdGl2ZSAiTWF0aF9kb3VibGVQb3ciOwoKaW50IF9pbnRQb3coaW50IGJhc2UsIGludCBleHBvbmVudCkgewogIC8vIEV4cG9uZW50aWF0aW9uIGJ5IHNxdWFyaW5nLgogIGludCByZXN1bHQgPSAxOwogIHdoaWxlIChleHBvbmVudCAhPSAwKSB7CiAgICBpZiAoKGV4cG9uZW50ICYgMSkgPT0gMSkgewogICAgICByZXN1bHQgKj0gYmFzZTsKICAgIH0KICAgIGV4cG9uZW50ID4+PSAxOwogICAgLy8gU2tpcCB1bm5lY2Vzc2FyeSBvcGVyYXRpb24gKGNhbiBvdmVyZmxvdyB0byBNaW50KS4KICAgIGlmIChleHBvbmVudCAhPSAwKSB7CiAgICAgIGJhc2UgKj0gYmFzZTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKZG91YmxlIGF0YW4yKG51bSBhLCBudW0gYikgPT4gX2F0YW4yKGEudG9Eb3VibGUoKSwgYi50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKZG91YmxlIHNpbihudW0gcmFkaWFucykgPT4gX3NpbihyYWRpYW5zLnRvRG91YmxlKCkpOwpAcGF0Y2gKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQpkb3VibGUgY29zKG51bSByYWRpYW5zKSA9PiBfY29zKHJhZGlhbnMudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSB0YW4obnVtIHJhZGlhbnMpID0+IF90YW4ocmFkaWFucy50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKZG91YmxlIGFjb3MobnVtIHgpID0+IF9hY29zKHgudG9Eb3VibGUoKSk7CkBwYXRjaApAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCmRvdWJsZSBhc2luKG51bSB4KSA9PiBfYXNpbih4LnRvRG91YmxlKCkpOwpAcGF0Y2gKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQpkb3VibGUgYXRhbihudW0geCkgPT4gX2F0YW4oeC50b0RvdWJsZSgpKTsKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKZG91YmxlIHNxcnQobnVtIHgpID0+IF9zcXJ0KHgudG9Eb3VibGUoKSk7CkBwYXRjaApkb3VibGUgZXhwKG51bSB4KSA9PiBfZXhwKHgudG9Eb3VibGUoKSk7CkBwYXRjaApkb3VibGUgbG9nKG51bSB4KSA9PiBfbG9nKHgudG9Eb3VibGUoKSk7Cgpkb3VibGUgX2F0YW4yKGRvdWJsZSBhLCBkb3VibGUgYikgbmF0aXZlICJNYXRoX2F0YW4yIjsKZG91YmxlIF9zaW4oZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9zaW4iOwpkb3VibGUgX2Nvcyhkb3VibGUgeCkgbmF0aXZlICJNYXRoX2NvcyI7CmRvdWJsZSBfdGFuKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfdGFuIjsKZG91YmxlIF9hY29zKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfYWNvcyI7CmRvdWJsZSBfYXNpbihkb3VibGUgeCkgbmF0aXZlICJNYXRoX2FzaW4iOwpkb3VibGUgX2F0YW4oZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9hdGFuIjsKZG91YmxlIF9zcXJ0KGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfc3FydCI7CmRvdWJsZSBfZXhwKGRvdWJsZSB4KSBuYXRpdmUgIk1hdGhfZXhwIjsKZG91YmxlIF9sb2coZG91YmxlIHgpIG5hdGl2ZSAiTWF0aF9sb2ciOwoKLy8gVE9ETyhpcG9zdmEpOiBIYW5kbGUgcGF0Y2ggbWV0aG9kcyB3aXRoaW4gYSBwYXRjaCBjbGFzcyBjb3JyZWN0bHkuCkBwYXRjaApjbGFzcyBSYW5kb20gewogIEBwYXRjaAogIGZhY3RvcnkgUmFuZG9tKFtpbnQgc2VlZF0pIHsKICAgIHZhciBzdGF0ZSA9IF9SYW5kb20uX3NldHVwU2VlZCgoc2VlZCA9PSBudWxsKSA/IF9SYW5kb20uX25leHRTZWVkKCkgOiBzZWVkKTsKICAgIC8vIENyYW5rIGEgY291cGxlIG9mIHRpbWVzIHRvIGRpc3RyaWJ1dGUgdGhlIHNlZWQgYml0cyBhIGJpdCBmdXJ0aGVyLgogICAgcmV0dXJuIG5ldyBfUmFuZG9tLl93aXRoU3RhdGUoc3RhdGUpCiAgICAgIC4uX25leHRTdGF0ZSgpCiAgICAgIC4uX25leHRTdGF0ZSgpCiAgICAgIC4uX25leHRTdGF0ZSgpCiAgICAgIC4uX25leHRTdGF0ZSgpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBSYW5kb20uc2VjdXJlKCkgewogICAgcmV0dXJuIG5ldyBfU2VjdXJlUmFuZG9tKCk7CiAgfQp9CgpjbGFzcyBfUmFuZG9tIGltcGxlbWVudHMgUmFuZG9tIHsKICAvLyBJbnRlcm5hbCBzdGF0ZSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZpbmFsIFVpbnQzMkxpc3QgX3N0YXRlOwogIHN0YXRpYyBjb25zdCBfa1NUQVRFX0xPID0gMDsKICBzdGF0aWMgY29uc3QgX2tTVEFURV9ISSA9IDE7IC8vIFVudXNlZCBpbiBEYXJ0IGNvZGUuCgogIF9SYW5kb20uX3dpdGhTdGF0ZSh0aGlzLl9zdGF0ZSk7CgogIC8vIFRoZSBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIE11bHRpcGx5IHdpdGggQ2FycnkgKE1XQykgd2l0aCBhIEJhc2UgYiA9IDJeMzIuCiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NdWx0aXBseS13aXRoLWNhcnJ5CiAgLy8gVGhlIGNvbnN0YW50IEEgaXMgc2VsZWN0ZWQgZnJvbSAiTnVtZXJpY2FsIFJlY2lwZXMgM3JkIEVkaXRpb24iIHAuMzQ4IEIxLgoKICAvLyBJbXBsZW1lbnRzOgogIC8vICAgY29uc3QgX0EgPSAweGZmZmZkYTYxOwogIC8vICAgdmFyIHN0YXRlID0KICAvLyAgICAgICAoKF9BICogKF9zdGF0ZVtfa1NUQVRFX0xPXSkpICsgX3N0YXRlW19rU1RBVEVfSEldKSAmICgoMSA8PCA2NCkgLSAxKTsKICAvLyAgIF9zdGF0ZVtfa1NUQVRFX0xPXSA9IHN0YXRlICYgKCgxIDw8IDMyKSAtIDEpOwogIC8vICAgX3N0YXRlW19rU1RBVEVfSEldID0gc3RhdGUgPj4gMzI7CiAgLy8gVGhpcyBpcyBhIG5hdGl2ZSB0byBwcmV2ZW50IDY0LWJpdCBvcGVyYXRpb25zIGluIERhcnQsIHdoaWNoCiAgLy8gZmFpbCB3aXRoIC0tdGhyb3dfb25famF2YXNjcmlwdF9pbnRfb3ZlcmZsb3cuCiAgLy8gVE9ETyhyZWdpcyk6IEltcGxlbWVudCBpbiBEYXJ0IGFuZCByZW1vdmUgUmFuZG9tX25leHRTdGF0ZSBpbiBtYXRoLmNjLgogIHZvaWQgX25leHRTdGF0ZSgpIG5hdGl2ZSAiUmFuZG9tX25leHRTdGF0ZSI7CgogIGludCBuZXh0SW50KGludCBtYXgpIHsKICAgIGNvbnN0IGxpbWl0ID0gMHgzRkZGRkZGRjsKICAgIGlmICgobWF4IDw9IDApIHx8ICgobWF4ID4gbGltaXQpICYmIChtYXggPiBfUE9XMl8zMikpKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKAogICAgICAgICAgbWF4LCAxLCBfUE9XMl8zMiwgIm1heCIsICJNdXN0IGJlIHBvc2l0aXZlIGFuZCA8PSAyXjMyIik7CiAgICB9CiAgICBpZiAoKG1heCAmIC1tYXgpID09IG1heCkgewogICAgICAvLyBGYXN0IGNhc2UgZm9yIHBvd2VycyBvZiB0d28uCiAgICAgIF9uZXh0U3RhdGUoKTsKICAgICAgcmV0dXJuIF9zdGF0ZVtfa1NUQVRFX0xPXSAmIChtYXggLSAxKTsKICAgIH0KCiAgICB2YXIgcm5kMzI7CiAgICB2YXIgcmVzdWx0OwogICAgZG8gewogICAgICBfbmV4dFN0YXRlKCk7CiAgICAgIHJuZDMyID0gX3N0YXRlW19rU1RBVEVfTE9dOwogICAgICByZXN1bHQgPSBybmQzMiAlIG1heDsKICAgIH0gd2hpbGUgKChybmQzMiAtIHJlc3VsdCArIG1heCkgPiBfUE9XMl8zMik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZG91YmxlIG5leHREb3VibGUoKSB7CiAgICByZXR1cm4gKChuZXh0SW50KDEgPDwgMjYpICogX1BPVzJfMjdfRCkgKyBuZXh0SW50KDEgPDwgMjcpKSAvIF9QT1cyXzUzX0Q7CiAgfQoKICBib29sIG5leHRCb29sKCkgewogICAgcmV0dXJuIG5leHRJbnQoMikgPT0gMDsKICB9CgogIC8vIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBhbGdvcml0aG0uCiAgc3RhdGljIGNvbnN0IF9QT1cyXzMyID0gMSA8PCAzMjsKICBzdGF0aWMgY29uc3QgX1BPVzJfNTNfRCA9IDEuMCAqICgxIDw8IDUzKTsKICBzdGF0aWMgY29uc3QgX1BPVzJfMjdfRCA9IDEuMCAqICgxIDw8IDI3KTsKCiAgLy8gVXNlIGEgc2luZ2xldG9uIFJhbmRvbSBvYmplY3QgdG8gZ2V0IGEgbmV3IHNlZWQgaWYgbm8gc2VlZCB3YXMgcGFzc2VkLgogIHN0YXRpYyBmaW5hbCBfcHJuZyA9IG5ldyBfUmFuZG9tLl93aXRoU3RhdGUoX2luaXRpYWxTZWVkKCkpOwoKICAvLyBUaGlzIGlzIGEgbmF0aXZlIHRvIHByZXZlbnQgNjQtYml0IG9wZXJhdGlvbnMgaW4gRGFydCwgd2hpY2gKICAvLyBmYWlsIHdpdGggLS10aHJvd19vbl9qYXZhc2NyaXB0X2ludF9vdmVyZmxvdy4KICAvLyBUT0RPKHJlZ2lzKTogSW1wbGVtZW50IGhlcmUgaW4gRGFydCBhbmQgcmVtb3ZlIG5hdGl2ZSBpbiBtYXRoLmNjLgogIHN0YXRpYyBVaW50MzJMaXN0IF9zZXR1cFNlZWQoaW50IHNlZWQpIG5hdGl2ZSAiUmFuZG9tX3NldHVwU2VlZCI7CiAgLy8gR2V0IGEgc2VlZCBmcm9tIHRoZSBWTSdzIHJhbmRvbSBudW1iZXIgcHJvdmlkZXIuCiAgc3RhdGljIFVpbnQzMkxpc3QgX2luaXRpYWxTZWVkKCkgbmF0aXZlICJSYW5kb21faW5pdGlhbFNlZWQiOwoKICBzdGF0aWMgaW50IF9uZXh0U2VlZCgpIHsKICAgIC8vIFRyaWdnZXIgdGhlIFBSTkcgb25jZSB0byBjaGFuZ2UgdGhlIGludGVybmFsIHN0YXRlLgogICAgX3BybmcuX25leHRTdGF0ZSgpOwogICAgcmV0dXJuIF9wcm5nLl9zdGF0ZVtfa1NUQVRFX0xPXTsKICB9Cn0KCmNsYXNzIF9TZWN1cmVSYW5kb20gaW1wbGVtZW50cyBSYW5kb20gewogIF9TZWN1cmVSYW5kb20oKSB7CiAgICAvLyBUaHJvdyBlYXJseSBpbiBjb25zdHJ1Y3RvciBpZiBlbnRyb3B5IHNvdXJjZSBpcyBub3QgaG9va2VkIHVwLgogICAgX2dldEJ5dGVzKDEpOwogIH0KCiAgLy8gUmV0dXJuIGNvdW50IGJ5dGVzIG9mIGVudHJvcHkgYXMgYSBwb3NpdGl2ZSBpbnRlZ2VyOyBjb3VudCA8PSA4LgogIHN0YXRpYyBpbnQgX2dldEJ5dGVzKGludCBjb3VudCkgbmF0aXZlICJTZWN1cmVSYW5kb21fZ2V0Qnl0ZXMiOwoKICBpbnQgbmV4dEludChpbnQgbWF4KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKAogICAgICAgIG1heCwgMSwgX1BPVzJfMzIsICJtYXgiLCAiTXVzdCBiZSBwb3NpdGl2ZSBhbmQgPD0gMl4zMiIpOwogICAgZmluYWwgYnl0ZUNvdW50ID0gKChtYXggLSAxKS5iaXRMZW5ndGggKyA3KSA+PiAzOwogICAgaWYgKGJ5dGVDb3VudCA9PSAwKSB7CiAgICAgIHJldHVybiAwOyAvLyBOb3QgcmFuZG9tIGlmIG1heCA9PSAxLgogICAgfQogICAgdmFyIHJuZDsKICAgIHZhciByZXN1bHQ7CiAgICBkbyB7CiAgICAgIHJuZCA9IF9nZXRCeXRlcyhieXRlQ291bnQpOwogICAgICByZXN1bHQgPSBybmQgJSBtYXg7CiAgICB9IHdoaWxlICgocm5kIC0gcmVzdWx0ICsgbWF4KSA+ICgxIDw8IChieXRlQ291bnQgPDwgMykpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBkb3VibGUgbmV4dERvdWJsZSgpIHsKICAgIHJldHVybiAoX2dldEJ5dGVzKDcpID4+IDMpIC8gX1BPVzJfNTNfRDsKICB9CgogIGJvb2wgbmV4dEJvb2woKSB7CiAgICByZXR1cm4gX2dldEJ5dGVzKDEpLmlzRXZlbjsKICB9CgogIC8vIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBhbGdvcml0aG0uCiAgc3RhdGljIGNvbnN0IF9QT1cyXzMyID0gMSA8PCAzMjsKICBzdGF0aWMgY29uc3QgX1BPVzJfNTNfRCA9IDEuMCAqICgxIDw8IDUzKTsKfQqBLgBOTjwBTU9NJAEkASoBLgEHIU1NEi0tARcXFUk5FxZCRyQhEggGJDUOBAwCAQchTU0SLS0BFxcVSTkXFkNFJBcSCAYWGw4EISgMAgFMMQcfPCEEOAIBNTIZJgQcJCsyAR8BJhcEORcSBhcENQIBQwEmIRIaHxYGFDoZFAYEEQIBBzVCBzU1BzU1BzU1BzUrBzUrBzUrBzUrBykHKQE3KSkpKysrKykpAUYHDwkfUUopFRUVFgQBCRwgBAIBIjQcGx83ASMBUDZPAREeE1E1KUIzTC8BGR49IkQGHyYULQYBDxAJFCIcMRMEARhOBAEUHAQBJiMtLQFMPwFCM0dENkABGzsYJQQCASgURhIEAUZCARklQjYaKwYNEAkiGj4TBAEYLQQBFCAEASYjLQIBH2RhcnQ6bWF0aC1wYXRjaC9tYXRoX3BhdGNoLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL21hdGgvcmFuZG9tLmRhcnSF/C8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQubWF0aDsKCi8vLyBBIGdlbmVyYXRvciBvZiByYW5kb20gYm9vbCwgaW50LCBvciBkb3VibGUgdmFsdWVzLgovLy8KLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHN1cHBsaWVzIGEgc3RyZWFtIG9mIHBzZXVkby1yYW5kb20gYml0cyB0aGF0IGFyZQovLy8gbm90IHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaGljIHB1cnBvc2VzLgovLy8KLy8vIFVzZSB0aGUgW1JhbmRvbS5zZWN1cmVdKCkgY29uc3RydWN0b3IgZm9yIGNyeXB0b2dyYXBoaWMgcHVycG9zZXMuCmFic3RyYWN0IGNsYXNzIFJhbmRvbSB7CiAgLy8vIENyZWF0ZXMgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KICAvLy8KICAvLy8gVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBbc2VlZF0gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZQogIC8vLyBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCiAgLy8vIHJhbmRvbSBzdHJlYW0gY2FuIGNoYW5nZSBiZXR3ZWVuIHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJ5LgogIGV4dGVybmFsIGZhY3RvcnkgUmFuZG9tKFtpbnQgc2VlZF0pOwoKICAvLy8gQ3JlYXRlcyBhIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KICAvLy8KICAvLy8gSWYgdGhlIHByb2dyYW0gY2Fubm90IHByb3ZpZGUgYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUKICAvLy8gc291cmNlIG9mIHJhbmRvbSBudW1iZXJzLCBpdCB0aHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdLgogIGV4dGVybmFsIGZhY3RvcnkgUmFuZG9tLnNlY3VyZSgpOwoKICAvLy8gR2VuZXJhdGVzIGEgbm9uLW5lZ2F0aXZlIHJhbmRvbSBpbnRlZ2VyIHVuaWZvcm1seSBkaXN0cmlidXRlZCBpbiB0aGUgcmFuZ2UKICAvLy8gZnJvbSAwLCBpbmNsdXNpdmUsIHRvIFttYXhdLCBleGNsdXNpdmUuCiAgLy8vCiAgLy8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIFttYXhdIHZhbHVlcwogIC8vLyBiZXR3ZWVuIDEgYW5kICgxPDwzMikgaW5jbHVzaXZlLgogIGludCBuZXh0SW50KGludCBtYXgpOwoKICAvLy8gR2VuZXJhdGVzIGEgbm9uLW5lZ2F0aXZlIHJhbmRvbSBmbG9hdGluZyBwb2ludCB2YWx1ZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQKICAvLy8gaW4gdGhlIHJhbmdlIGZyb20gMC4wLCBpbmNsdXNpdmUsIHRvIDEuMCwgZXhjbHVzaXZlLgogIGRvdWJsZSBuZXh0RG91YmxlKCk7CgogIC8vLyBHZW5lcmF0ZXMgYSByYW5kb20gYm9vbGVhbiB2YWx1ZS4KICBib29sIG5leHRCb29sKCk7Cn0KKgBOTjwBEwE3BFAtBEYYKQY+QUAnAUIGP0EkAVEuBkwnGAFROxcBKBMCARVkYXJ0Om1hdGgvcmFuZG9tLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL21pcnJvcnMvbWlycm9ycy5kYXJ0wADCly8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBtaXJyb3JzIGxpYnJhcnksIHdlIGFkb3B0IGEgbmFtaW5nCi8vIGNvbnZlbnRpb24gd2l0aCByZXNwZWN0IHRvIGdldHRlcnMgYW5kIHNldHRlcnMuICBTcGVjaWZpY2FsbHksIGZvcgovLyBzb21lIHZhcmlhYmxlIG9yIGZpZWxkLi4uCi8vCi8vICAgdmFyIG15RmllbGQ7Ci8vCi8vIC4uLnRoZSBnZXR0ZXIgaXMgbmFtZWQgJ215RmllbGQnIGFuZCB0aGUgc2V0dGVyIGlzIG5hbWVkCi8vICdteUZpZWxkPScuICBUaGlzIGFsbG93cyB1cyB0byBhc3NpZ24gdW5pcXVlIG5hbWVzIHRvIGdldHRlcnMgYW5kCi8vIHNldHRlcnMgZm9yIHRoZSBwdXJwb3NlcyBvZiBtZW1iZXIgbG9va3VwLgoKLyoqCiAqIEJhc2ljIHJlZmxlY3Rpb24gaW4gRGFydCwKICogd2l0aCBzdXBwb3J0IGZvciBpbnRyb3NwZWN0aW9uIGFuZCBkeW5hbWljIGludm9jYXRpb24uCiAqCiAqICpJbnRyb3NwZWN0aW9uKiBpcyB0aGF0IHN1YnNldCBvZiByZWZsZWN0aW9uIGJ5IHdoaWNoIGEgcnVubmluZwogKiBwcm9ncmFtIGNhbiBleGFtaW5lIGl0cyBvd24gc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbgogKiB0aGF0IHByaW50cyBvdXQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVtYmVycyBvZiBhbiBhcmJpdHJhcnkgb2JqZWN0LgogKgogKiAqRHluYW1pYyBpbnZvY2F0aW9uKiByZWZlcnMgdGhlIGFiaWxpdHkgdG8gZXZhbHVhdGUgY29kZSB0aGF0CiAqIGhhcyBub3QgYmVlbiBsaXRlcmFsbHkgc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZSwgc3VjaCBhcyBjYWxsaW5nIGEgbWV0aG9kCiAqIHdob3NlIG5hbWUgaXMgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQgKGJlY2F1c2UgaXQgaXMgbG9va2VkIHVwCiAqIGluIGEgZGF0YWJhc2UsIG9yIHByb3ZpZGVkIGludGVyYWN0aXZlbHkgYnkgdGhlIHVzZXIpLgogKgogKiAjIyBIb3cgdG8gaW50ZXJwcmV0IHRoaXMgbGlicmFyeSdzIGRvY3VtZW50YXRpb24KICoKICogQXMgYSBydWxlLCB0aGUgbmFtZXMgb2YgRGFydCBkZWNsYXJhdGlvbnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nCiAqIGluc3RhbmNlcyBvZiBjbGFzcyBbU3ltYm9sXS4gV2hlbmV2ZXIgdGhlIGRvYyBzcGVha3Mgb2YgYW4gb2JqZWN0ICpzKgogKiBvZiBjbGFzcyBbU3ltYm9sXSBkZW5vdGluZyBhIG5hbWUsIGl0IG1lYW5zIHRoZSBzdHJpbmcgdGhhdAogKiB3YXMgdXNlZCB0byBjb25zdHJ1Y3QgKnMqLgogKgogKiBUaGUgZG9jdW1lbnRhdGlvbiBmcmVxdWVudGx5IGFidXNlcyBub3RhdGlvbiB3aXRoCiAqIERhcnQgcHNldWRvLWNvZGUgc3VjaCBhcyBbOm8ueChhKTpdLCB3aGVyZQogKiBvIGFuZCBhIGFyZSBkZWZpbmVkIHRvIGJlIG9iamVjdHM7IHdoYXQgaXMgYWN0dWFsbHkgbWVhbnQgaW4gdGhlc2UKICogY2FzZXMgaXMgWzpvJy54KGEnKTpdIHdoZXJlICpvJyogYW5kICphJyogYXJlIERhcnQgdmFyaWFibGVzCiAqIGJvdW5kIHRvICpvKiBhbmQgKmEqIHJlc3BlY3RpdmVseS4gRnVydGhlcm1vcmUsICpvJyogYW5kICphJyoKICogYXJlIGFzc3VtZWQgdG8gYmUgZnJlc2ggdmFyaWFibGVzIChtZWFuaW5nIHRoYXQgdGhleSBhcmUKICogZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBwcm9ncmFtKS4KICoKICogU29tZXRpbWVzIHRoZSBkb2N1bWVudGF0aW9uIHJlZmVycyB0byAqc2VyaWFsaXphYmxlKiBvYmplY3RzLgogKiBBbiBvYmplY3QgaXMgc2VyaWFsaXphYmxlIGFjcm9zcyBpc29sYXRlcyBpZiBhbmQgb25seSBpZiBpdCBpcyBhbiBpbnN0YW5jZSBvZgogKiBudW0sIGJvb2wsIFN0cmluZywgYSBsaXN0IG9mIG9iamVjdHMgdGhhdCBhcmUgc2VyaWFsaXphYmxlCiAqIGFjcm9zcyBpc29sYXRlcywgb3IgYSBtYXAgd2l0aCBrZXlzIGFuZCB2YWx1ZXMgdGhhdCBhcmUgYWxsIHNlcmlhbGl6YWJsZSBhY3Jvc3MKICogaXNvbGF0ZXMuCiAqCiAqICMjIFN0YXR1czogVW5zdGFibGUKICoKICogVGhlIGRhcnQ6bWlycm9ycyBsaWJyYXJ5IGlzIHVuc3RhYmxlIGFuZCBpdHMgQVBJIG1pZ2h0IGNoYW5nZSBzbGlnaHRseSBhcyBhCiAqIHJlc3VsdCBvZiB1c2VyIGZlZWRiYWNrLiBUaGlzIGxpYnJhcnkgaXMgcGxhdGZvcm0gZGVwZW5kZW50IGFuZCB0aGVyZWZvcmUgaXQKICogaGFzIGltcGxlbWVudGF0aW9ucyBmb3IgYm90aCBkYXJ0MmpzIGFuZCB0aGUgRGFydCBWTS4gQm90aCBhcmUgdW5kZXIKICogZGV2ZWxvcG1lbnQgYW5kIG1heSBub3Qgc3VwcG9ydCBhbGwgb3BlcmF0aW9ucyB5ZXQuCiAqCiAqIHtAY2F0ZWdvcnkgVk19CiAqLwpsaWJyYXJ5IGRhcnQubWlycm9yczsKCmltcG9ydCAnZGFydDphc3luYycgc2hvdyBGdXR1cmU7CgovKioKICogQSBbTWlycm9yU3lzdGVtXSBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdXNlZCB0byByZWZsZWN0IG9uIGEgc2V0IG9mCiAqIGFzc29jaWF0ZWQgbGlicmFyaWVzLgogKgogKiBBdCBydW50aW1lIGVhY2ggcnVubmluZyBpc29sYXRlIGhhcyBhIGRpc3RpbmN0IFtNaXJyb3JTeXN0ZW1dLgogKgogKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBbTWlycm9yU3lzdGVtXSB3aGljaCByZXByZXNlbnRzIGEgc2V0CiAqIG9mIGxpYnJhcmllcyB3aGljaCBhcmUgbm90IHJ1bm5pbmcgLS0gcGVyaGFwcyBhdCBjb21waWxlLXRpbWUuICBJbgogKiB0aGlzIGNhc2UsIGFsbCBhdmFpbGFibGUgcmVmbGVjdGl2ZSBmdW5jdGlvbmFsaXR5IHdvdWxkIGJlCiAqIHN1cHBvcnRlZCwgYnV0IHJ1bnRpbWUgZnVuY3Rpb25hbGl0eSAoc3VjaCBhcyBpbnZva2luZyBhIGZ1bmN0aW9uCiAqIG9yIGluc3BlY3RpbmcgdGhlIGNvbnRlbnRzIG9mIGEgdmFyaWFibGUpIHdvdWxkIGZhaWwgZHluYW1pY2FsbHkuCiAqLwphYnN0cmFjdCBjbGFzcyBNaXJyb3JTeXN0ZW0gewogIC8qKgogICAqIEFsbCBsaWJyYXJpZXMga25vd24gdG8gdGhlIG1pcnJvciBzeXN0ZW0sIGluZGV4ZWQgYnkgdGhlaXIgVVJJLgogICAqCiAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbWFwIG9mIHRoZSBsaWJyYXJpZXMgd2l0aCBbTGlicmFyeU1pcnJvci51cmldIGFzCiAgICoga2V5cy4KICAgKgogICAqIEZvciBhIHJ1bnRpbWUgbWlycm9yIHN5c3RlbSwgb25seSBsaWJyYXJpZXMgd2hpY2ggYXJlIGN1cnJlbnRseSBsb2FkZWQKICAgKiBhcmUgaW5jbHVkZWQsIGFuZCByZXBlYXRlZCBjYWxscyBvZiB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIGRpZmZlcmVudCBtYXBzCiAgICogYXMgbGlicmFyaWVzIGFyZSBsb2FkZWQuCiAgICovCiAgTWFwPFVyaSwgTGlicmFyeU1pcnJvcj4gZ2V0IGxpYnJhcmllczsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgdW5pcXVlIGxpYnJhcnkgbmFtZWQgW2xpYnJhcnlOYW1lXSBpZiBpdCBleGlzdHMuCiAgICoKICAgKiBJZiBubyB1bmlxdWUgbGlicmFyeSBleGlzdHMsIGFuIGVycm9yIGlzIHRocm93bi4KICAgKi8KICBleHRlcm5hbCBMaWJyYXJ5TWlycm9yIGZpbmRMaWJyYXJ5KFN5bWJvbCBsaWJyYXJ5TmFtZSk7CgogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBpc29sYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFtNaXJyb3JTeXN0ZW1dLgogICAqCiAgICogVGhpcyBtYXkgYmUgbnVsbCBpZiB0aGlzIG1pcnJvciBzeXN0ZW0gaXMgbm90IHJ1bm5pbmcuCiAgICovCiAgSXNvbGF0ZU1pcnJvciBnZXQgaXNvbGF0ZTsKCiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIFs6ZHluYW1pYzpdIHR5cGUuCiAgICovCiAgVHlwZU1pcnJvciBnZXQgZHluYW1pY1R5cGU7CgogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBbOnZvaWQ6XSB0eXBlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHZvaWRUeXBlOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIFtzeW1ib2xdLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBVc2luZyB0aGlzIG1ldGhvZCBtYXkgcmVzdWx0IGluIGxhcmdlciBvdXRwdXQuICBJZiBwb3NzaWJsZSwgdXNlCiAgICogW01pcnJvcnNVc2VkXSB0byBzcGVjaWZ5IHdoaWNoIHN5bWJvbHMgbXVzdCBiZSByZXRhaW5lZCBpbiBjbGVhciB0ZXh0LgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShTeW1ib2wgc3ltYm9sKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHN5bWJvbCBmb3IgW25hbWVdLgogICAqCiAgICogSWYgW2xpYnJhcnldIGlzIG5vdCBhIFtMaWJyYXJ5TWlycm9yXSBvciBpZiBbbmFtZV0gaXMgYSBwcml2YXRlIGlkZW50aWZpZXIKICAgKiBhbmQgW2xpYnJhcnldIGlzIGBudWxsYCwgdGhyb3dzIGFuIFtBcmd1bWVudEVycm9yXS4gSWYgW25hbWVdIGlzIGEgcHJpdmF0ZQogICAqIGlkZW50aWZpZXIsIHRoZSBzeW1ib2wgcmV0dXJuZWQgaXMgd2l0aCByZXNwZWN0IHRvIFtsaWJyYXJ5XS4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgdGV4dCBpcyBub24tbm9ybWF0aXZlOgogICAqCiAgICogVXNpbmcgdGhpcyBtZXRob2QgbWF5IHJlc3VsdCBpbiBsYXJnZXIgb3V0cHV0LiAgSWYgcG9zc2libGUsIHVzZQogICAqIHRoZSBjb25zdCBjb25zdHJ1Y3RvciBvZiBbU3ltYm9sXSBvciBzeW1ib2wgbGl0ZXJhbHMuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFN5bWJvbCBnZXRTeW1ib2woU3RyaW5nIG5hbWUsIFtMaWJyYXJ5TWlycm9yIGxpYnJhcnldKTsKfQoKLyoqCiAqIFJldHVybnMgYSBbTWlycm9yU3lzdGVtXSBmb3IgdGhlIGN1cnJlbnQgaXNvbGF0ZS4KICovCmV4dGVybmFsIE1pcnJvclN5c3RlbSBjdXJyZW50TWlycm9yU3lzdGVtKCk7CgovKioKICogUmVmbGVjdHMgYW4gaW5zdGFuY2UuCiAqCiAqIFJldHVybnMgYW4gW0luc3RhbmNlTWlycm9yXSByZWZsZWN0aW5nIFtyZWZsZWN0ZWVdLiBJZiBbcmVmbGVjdGVlXSBpcyBhCiAqIGZ1bmN0aW9uIG9yIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYSBbOmNhbGw6XSBtZXRob2QsIHRoZSByZXR1cm5lZAogKiBpbnN0YW5jZSBtaXJyb3Igd2lsbCBiZSBhIFtDbG9zdXJlTWlycm9yXS4KICoKICogTm90ZSB0aGF0IHNpbmNlIG9uZSBjYW5ub3Qgb2J0YWluIGFuIG9iamVjdCBmcm9tIGFub3RoZXIgaXNvbGF0ZSwgdGhpcwogKiBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHRvIG9idGFpbiAgbWlycm9ycyBvbiBvYmplY3RzIG9mIHRoZSBjdXJyZW50CiAqIGlzb2xhdGUuCiAqLwpleHRlcm5hbCBJbnN0YW5jZU1pcnJvciByZWZsZWN0KE9iamVjdCByZWZsZWN0ZWUpOwoKLyoqCiAqIFJlZmxlY3RzIGEgY2xhc3MgZGVjbGFyYXRpb24uCiAqCiAqIExldCAqQyogYmUgdGhlIG9yaWdpbmFsIGNsYXNzIGRlY2xhcmF0aW9uIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSBba2V5XS4KICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgW0NsYXNzTWlycm9yXSByZWZsZWN0aW5nICpDKi4KICoKICogSWYgW2tleV0gaXMgbm90IGFuIGluc3RhbmNlIG9mIFtUeXBlXSwgdGhlbiB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbgogKiBbQXJndW1lbnRFcnJvcl0uIElmIFtrZXldIGlzIHRoZSBUeXBlIGZvciBkeW5hbWljIG9yIGEgZnVuY3Rpb24gdHlwZWRlZiwKICogdGhyb3dzIGFuIFtBcmd1bWVudEVycm9yXS4KICoKICogTm90ZSB0aGF0IHNpbmNlIG9uZSBjYW5ub3Qgb2J0YWluIGEgW1R5cGVdIG9iamVjdCBmcm9tIGFub3RoZXIgaXNvbGF0ZSwgdGhpcwogKiBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHRvIG9idGFpbiBjbGFzcyBtaXJyb3JzIG9uIGNsYXNzZXMgb2YgdGhlIGN1cnJlbnQKICogaXNvbGF0ZS4KICovCmV4dGVybmFsIENsYXNzTWlycm9yIHJlZmxlY3RDbGFzcyhUeXBlIGtleSk7CgovKioKICogUmVmbGVjdHMgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgW2tleV0uCiAqCiAqIElmIFtrZXldIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBbVHlwZV0sIHRoZW4gdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4KICogW0FyZ3VtZW50RXJyb3JdLgogKgogKiBPcHRpb25hbGx5IHRha2VzIGEgbGlzdCBvZiBbdHlwZUFyZ3VtZW50c10gZm9yIGdlbmVyaWMgY2xhc3Nlcy4gSWYgdGhlIGxpc3QKICogaXMgcHJvdmlkZWQsIHRoZW4gdGhlIFtrZXldIG11c3QgYmUgYSBnZW5lcmljIGNsYXNzIHR5cGUsIGFuZCB0aGUgbnVtYmVyIG9mCiAqIHRoZSBwcm92aWRlZCB0eXBlIGFyZ3VtZW50cyBtdXN0IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdHlwZSB2YXJpYWJsZXMKICogZGVjbGFyZWQgYnkgdGhlIGNsYXNzLgogKgogKiBOb3RlIHRoYXQgc2luY2Ugb25lIGNhbm5vdCBvYnRhaW4gYSBbVHlwZV0gb2JqZWN0IGZyb20gYW5vdGhlciBpc29sYXRlLCB0aGlzCiAqIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgdG8gb2J0YWluIHR5cGUgbWlycm9ycyBvbiB0eXBlcyBvZiB0aGUgY3VycmVudAogKiBpc29sYXRlLgogKi8KZXh0ZXJuYWwgVHlwZU1pcnJvciByZWZsZWN0VHlwZShUeXBlIGtleSwgW0xpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50c10pOwoKLyoqCiAqIEEgW01pcnJvcl0gcmVmbGVjdHMgc29tZSBEYXJ0IGxhbmd1YWdlIGVudGl0eS4KICoKICogRXZlcnkgW01pcnJvcl0gb3JpZ2luYXRlcyBmcm9tIHNvbWUgW01pcnJvclN5c3RlbV0uCiAqLwphYnN0cmFjdCBjbGFzcyBNaXJyb3Ige30KCi8qKgogKiBBbiBbSXNvbGF0ZU1pcnJvcl0gcmVmbGVjdHMgYW4gaXNvbGF0ZS4KICovCmFic3RyYWN0IGNsYXNzIElzb2xhdGVNaXJyb3IgaW1wbGVtZW50cyBNaXJyb3IgewogIC8qKgogICAqIEEgdW5pcXVlIG5hbWUgdXNlZCB0byByZWZlciB0byB0aGUgaXNvbGF0ZSBpbiBkZWJ1Z2dpbmcgbWVzc2FnZXMuCiAgICovCiAgU3RyaW5nIGdldCBkZWJ1Z05hbWU7CgogIC8qKgogICAqIFdoZXRoZXIgdGhpcyBtaXJyb3IgcmVmbGVjdHMgdGhlIGN1cnJlbnRseSBydW5uaW5nIGlzb2xhdGUuCiAgICovCiAgYm9vbCBnZXQgaXNDdXJyZW50OwoKICAvKioKICAgKiBUaGUgcm9vdCBsaWJyYXJ5IGZvciB0aGUgcmVmbGVjdGVkIGlzb2xhdGUuCiAgICovCiAgTGlicmFyeU1pcnJvciBnZXQgcm9vdExpYnJhcnk7CgogIC8qKgogICAqIFdoZXRoZXIgW290aGVyXSBpcyBhbiBbSXNvbGF0ZU1pcnJvcl0gb24gdGhlIHNhbWUgaXNvbGF0ZSBhcyB0aGlzIG1pcnJvci4KICAgKgogICAqIFRoZSBlcXVhbGl0eSBob2xkcyBpZiBhbmQgb25seSBpZgogICAqCiAgICogMS4gW290aGVyXSBpcyBhIG1pcnJvciBvZiB0aGUgc2FtZSBraW5kLCBhbmQKICAgKiAyLiB0aGUgaXNvbGF0ZSBiZWluZyByZWZsZWN0ZWQgYnkgdGhpcyBtaXJyb3IgaXMgdGhlIHNhbWUgaXNvbGF0ZSBiZWluZwogICAqICAgIHJlZmxlY3RlZCBieSBbb3RoZXJdLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwoKICAvKioKICAgKiBMb2FkcyB0aGUgbGlicmFyeSBhdCB0aGUgZ2l2ZW4gdXJpIGludG8gdGhpcyBpc29sYXRlLgogICAqCiAgICogV0FSTklORzogWW91IGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIHVzZSBJc29sYXRlLnNwYXduVXJpIGluc3RlYWQgd2hlbgogICAqIHBvc3NpYmxlLiBJc29sYXRlTWlycm9yLmxvYWRVcmkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHN5bmNocm9ub3VzCiAgICogY29tbXVuaWNhdGlvbiBvciBzaGFyZWQgc3RhdGUgd2l0aCBkeW5hbWljYWxseSBsb2FkZWQgY29kZSBpcyBuZWVkZWQuCiAgICoKICAgKiBJZiBhIGxpYnJhcnkgd2l0aCB0aGUgc2FtZSBjYW5vbmljYWxpemVkIHVyaSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCwKICAgKiB0aGUgZXhpc3RpbmcgbGlicmFyeSB3aWxsIGJlIHJldHVybmVkLiAoVGhlIGlzb2xhdGUgd2lsbCBub3QgbG9hZCBhIG5ldwogICAqIGNvcHkgb2YgdGhlIGxpYnJhcnkuKQogICAqCiAgICogVGhpcyBiZWhhdmlvciBpcyBzaW1pbGFyIHRvIHRoZSBiZWhhdmlvciBvZiBhbiBpbXBvcnQgc3RhdGVtZW50IHRoYXQKICAgKiBhcHBlYXJzIGluIHRoZSByb290IGxpYnJhcnksIGV4Y2VwdCB0aGF0IHRoZSBpbXBvcnQgc2NvcGUgb2YgdGhlIHJvb3QKICAgKiBsaWJyYXJ5IGlzIG5vdCBjaGFuZ2VkLgogICAqLwogIEZ1dHVyZTxMaWJyYXJ5TWlycm9yPiBsb2FkVXJpKFVyaSB1cmkpOwp9CgovKioKICogQSBbRGVjbGFyYXRpb25NaXJyb3JdIHJlZmxlY3RzIHNvbWUgZW50aXR5IGRlY2xhcmVkIGluIGEgRGFydCBwcm9ncmFtLgogKi8KYWJzdHJhY3QgY2xhc3MgRGVjbGFyYXRpb25NaXJyb3IgaW1wbGVtZW50cyBNaXJyb3IgewogIC8qKgogICAqIFRoZSBzaW1wbGUgbmFtZSBmb3IgdGhpcyBEYXJ0IGxhbmd1YWdlIGVudGl0eS4KICAgKgogICAqIFRoZSBzaW1wbGUgbmFtZSBpcyBpbiBtb3N0IGNhc2VzIHRoZSBpZGVudGlmaWVyIG5hbWUgb2YgdGhlIGVudGl0eSwKICAgKiBzdWNoIGFzICdteU1ldGhvZCcgZm9yIGEgbWV0aG9kLCBbOnZvaWQgbXlNZXRob2QoKSB7Li4ufTpdIG9yICdteWxpYnJhcnknCiAgICogZm9yIGEgWzpsaWJyYXJ5ICdteWxpYnJhcnknOzpdIGRlY2xhcmF0aW9uLgogICAqLwogIFN5bWJvbCBnZXQgc2ltcGxlTmFtZTsKCiAgLyoqCiAgICogVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGZvciB0aGlzIERhcnQgbGFuZ3VhZ2UgZW50aXR5LgogICAqCiAgICogVGhpcyBuYW1lIGlzIHF1YWxpZmllZCBieSB0aGUgbmFtZSBvZiB0aGUgb3duZXIuIEZvciBpbnN0YW5jZSwKICAgKiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgYSBtZXRob2QgJ21ldGhvZCcgaW4gY2xhc3MgJ0NsYXNzJyBpbgogICAqIGxpYnJhcnkgJ2xpYnJhcnknIGlzICdsaWJyYXJ5LkNsYXNzLm1ldGhvZCcuCiAgICoKICAgKiBSZXR1cm5zIGEgW1N5bWJvbF0gY29uc3RydWN0ZWQgZnJvbSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlCiAgICogZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJlZmxlY3RlZS4KICAgKiBMZXQgKm8qIGJlIHRoZSBbb3duZXJdIG9mIHRoaXMgbWlycm9yLCBsZXQgKnIqIGJlIHRoZSByZWZsZWN0ZWUgb2YKICAgKiB0aGlzIG1pcnJvciwgbGV0ICpwKiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkCiAgICogbmFtZSBvZiB0aGUgcmVmbGVjdGVlIG9mICpvKiwgYW5kIGxldCAqcyogYmUgdGhlIHNpbXBsZSBuYW1lIG9mICpyKgogICAqIGNvbXB1dGVkIGJ5IFtzaW1wbGVOYW1lXS4KICAgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgKnIqIGlzIHRoZQogICAqIGNvbmNhdGVuYXRpb24gb2YgKnAqLCAnLicsIGFuZCAqcyouCiAgICoKICAgKiBCZWNhdXNlIGFuIGlzb2xhdGUgY2FuIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBsaWJyYXJ5IHdpdGggdGhlIHNhbWUgbmFtZSAoYXQKICAgKiBkaWZmZXJlbnQgVVJJcyksIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgZG9lcyBub3QgdW5pcXVlbHkgaWRlbnRpZnkgYW55CiAgICogbGFuZ3VhZ2UgZW50aXR5LgogICAqLwogIFN5bWJvbCBnZXQgcXVhbGlmaWVkTmFtZTsKCiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIG93bmVyIG9mIHRoaXMgRGFydCBsYW5ndWFnZSBlbnRpdHkuCiAgICoKICAgKiBUaGUgb3duZXIgaXMgdGhlIGRlY2xhcmF0aW9uIGltbWVkaWF0ZWx5IHN1cnJvdW5kaW5nIHRoZSByZWZsZWN0ZWU6CiAgICoKICAgKiAqIEZvciBhIGxpYnJhcnksIHRoZSBvd25lciBpcyBbOm51bGw6XS4KICAgKiAqIEZvciBhIGNsYXNzIGRlY2xhcmF0aW9uLCB0eXBlZGVmIG9yIHRvcCBsZXZlbCBmdW5jdGlvbiBvciB2YXJpYWJsZSwgdGhlCiAgICogICBvd25lciBpcyB0aGUgZW5jbG9zaW5nIGxpYnJhcnkuCiAgICogKiBGb3IgYSBtaXhpbiBhcHBsaWNhdGlvbiBgUyB3aXRoIE1gLCB0aGUgb3duZXIgaXMgdGhlIG93bmVyIG9mIGBNYC4KICAgKiAqIEZvciBhIGNvbnN0cnVjdG9yLCB0aGUgb3duZXIgaXMgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcy4KICAgKiAqIEZvciBhIG1ldGhvZCwgaW5zdGFuY2UgdmFyaWFibGUgb3IgYSBzdGF0aWMgdmFyaWFibGUsIHRoZSBvd25lciBpcyB0aGUKICAgKiAgIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcywgdW5sZXNzIHRoZSBjbGFzcyBpcyBhIG1peGluIGFwcGxpY2F0aW9uCiAgICogICBgUyB3aXRoIE1gLCBpbiB3aGljaCBjYXNlIHRoZSBvd25lciBpcyBgTWAuIE5vdGUgdGhhdCBgTWAgbWF5IGJlIGFuCiAgICogICBpbnZvY2F0aW9uIG9mIGEgZ2VuZXJpYy4KICAgKiAqIEZvciBhIHBhcmFtZXRlciwgbG9jYWwgdmFyaWFibGUgb3IgbG9jYWwgZnVuY3Rpb24gdGhlIG93bmVyIGlzIHRoZQogICAqICAgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGZ1bmN0aW9uLgogICAqLwogIERlY2xhcmF0aW9uTWlycm9yIGdldCBvd25lcjsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGlzIGxpYnJhcnkgcHJpdmF0ZS4KICAgKgogICAqIEFsd2F5cyByZXR1cm5zIGBmYWxzZWAgZm9yIGEgbGlicmFyeSBkZWNsYXJhdGlvbiwKICAgKiBvdGhlcndpc2UgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZSBzdGFydHMgd2l0aCBhbgogICAqIHVuZGVyc2NvcmUgY2hhcmFjdGVyIChgX2ApLCBhbmQgYGZhbHNlYCBpZiBpdCBkb2Vzbid0LgogICAqLwogIGJvb2wgZ2V0IGlzUHJpdmF0ZTsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGlzIHRvcC1sZXZlbC4KICAgKgogICAqIEEgZGVjbGFyYXRpb24gaXMgY29uc2lkZXJlZCB0b3AtbGV2ZWwgaWYgaXRzIFtvd25lcl0gaXMgYSBbTGlicmFyeU1pcnJvcl0uCiAgICovCiAgYm9vbCBnZXQgaXNUb3BMZXZlbDsKCiAgLyoqCiAgICogVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGlzIERhcnQgbGFuZ3VhZ2UgZW50aXR5LCBvciBbOm51bGw6XSBpZiB0aGUKICAgKiBlbnRpdHkgaXMgc3ludGhldGljLgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhIHZhcmlhYmxlLCB0aGUgcmV0dXJuZWQgbG9jYXRpb24gZ2l2ZXMgdGhlIHBvc2l0aW9uCiAgICogb2YgdGhlIHZhcmlhYmxlIG5hbWUgYXQgaXRzIHBvaW50IG9mIGRlY2xhcmF0aW9uLgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhIGxpYnJhcnksIGNsYXNzLCB0eXBlZGVmLCBmdW5jdGlvbiBvciB0eXBlIHZhcmlhYmxlCiAgICogd2l0aCBhc3NvY2lhdGVkIG1ldGFkYXRhLCB0aGUgcmV0dXJuZWQgbG9jYXRpb24gZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQogICAqIGZpcnN0IG1ldGFkYXRhIGRlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVmbGVjdGVlLgogICAqCiAgICogT3RoZXJ3aXNlOgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhIGxpYnJhcnksIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBnaXZlcyB0aGUgcG9zaXRpb24gb2YKICAgKiB0aGUga2V5d29yZCAnbGlicmFyeScgYXQgdGhlIHJlZmxlY3RlZSdzIHBvaW50IG9mIGRlY2xhcmF0aW9uLCBpZiB0aGUKICAgKiByZWZsZWN0ZWUgaXMgYSBuYW1lZCBsaWJyYXJ5LCBvciB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBmaXJzdCBsaW5lIGluCiAgICogdGhlIGNvbXBpbGF0aW9uIHVuaXQgZGVmaW5pbmcgdGhlIHJlZmxlY3RlZSBpZiB0aGUgcmVmbGVjdGVlIGlzIGFub255bW91cy4KICAgKgogICAqIElmIHRoZSByZWZsZWN0ZWUgaXMgYW4gYWJzdHJhY3QgY2xhc3MsIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBnaXZlcyB0aGUKICAgKiBwb3NpdGlvbiBvZiB0aGUga2V5d29yZCAnYWJzdHJhY3QnIGF0IHRoZSByZWZsZWN0ZWUncyBwb2ludCBvZiBkZWNsYXJhdGlvbi4KICAgKiBPdGhlcndpc2UsIGlmIHRoZSByZWZsZWN0ZWUgaXMgYSBjbGFzcywgdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzIHRoZQogICAqIHBvc2l0aW9uIG9mIHRoZSBrZXl3b3JkICdjbGFzcycgYXQgdGhlIHJlZmxlY3RlZSdzIHBvaW50IG9mIGRlY2xhcmF0aW9uLgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhIHR5cGVkZWYgdGhlIHJldHVybmVkIGxvY2F0aW9uIGdpdmVzIHRoZSBwb3NpdGlvbiBvZgogICAqIHRoZSBvZiB0aGUga2V5d29yZCAndHlwZWRlZicgYXQgdGhlIHJlZmxlY3RlZSdzIHBvaW50IG9mIGRlY2xhcmF0aW9uLgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhIGZ1bmN0aW9uIHdpdGggYSBkZWNsYXJlZCByZXR1cm4gdHlwZSwgdGhlIHJldHVybmVkCiAgICogbG9jYXRpb24gZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlIGF0IHRoZQogICAqIHJlZmxlY3RlZSdzIHBvaW50IG9mIGRlY2xhcmF0aW9uLiBPdGhlcndpc2UuIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBnaXZlcwogICAqIHRoZSBwb3NpdGlvbiBvZiB0aGUgZnVuY3Rpb24ncyBuYW1lIGF0IHRoZSByZWZsZWN0ZWUncyBwb2ludCBvZgogICAqIGRlY2xhcmF0aW9uLgogICAqCiAgICogVGhpcyBvcGVyYXRpb24gaXMgb3B0aW9uYWwgYW5kIG1heSB0aHJvdyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgU291cmNlTG9jYXRpb24gZ2V0IGxvY2F0aW9uOwoKICAvKioKICAgKiBBIGxpc3Qgb2YgdGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlY2xhcmF0aW9uLgogICAqCiAgICogTGV0ICpEKiBiZSB0aGUgZGVjbGFyYXRpb24gdGhpcyBtaXJyb3IgcmVmbGVjdHMuCiAgICogSWYgKkQqIGlzIGRlY29yYXRlZCB3aXRoIGFubm90YXRpb25zICpBMSwgLi4uLCBBbioKICAgKiB3aGVyZSAqbiA+IDAqLCB0aGVuIGZvciBlYWNoIGFubm90YXRpb24gKkFpKiBhc3NvY2lhdGVkCiAgICogd2l0aCAqRCwgMSA8PSBpIDw9IG4qLCBsZXQgKmNpKiBiZSB0aGUgY29uc3RhbnQgb2JqZWN0CiAgICogc3BlY2lmaWVkIGJ5ICpBaSouIFRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgd2hvc2UKICAgKiBtZW1iZXJzIGFyZSBpbnN0YW5jZSBtaXJyb3JzIG9uICpjMSwgLi4uLCBjbiouCiAgICogSWYgbm8gYW5ub3RhdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCAqRCosIHRoZW4KICAgKiBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgogICAqCiAgICogSWYgZXZhbHVhdGluZyBhbnkgb2YgKmMxLCAuLi4sIGNuKiB3b3VsZCBjYXVzZSBhCiAgICogY29tcGlsYXRpb24gZXJyb3IKICAgKiB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmIGEgbm9uLXJlZmxlY3RpdmUgY29tcGlsYXRpb24gZXJyb3IKICAgKiBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKi8KICBMaXN0PEluc3RhbmNlTWlycm9yPiBnZXQgbWV0YWRhdGE7Cn0KCi8qKgogKiBBbiBbT2JqZWN0TWlycm9yXSBpcyBhIGNvbW1vbiBzdXBlcmludGVyZmFjZSBvZiBbSW5zdGFuY2VNaXJyb3JdLAogKiBbQ2xhc3NNaXJyb3JdLCBhbmQgW0xpYnJhcnlNaXJyb3JdIHRoYXQgcmVwcmVzZW50cyB0aGVpciBzaGFyZWQKICogZnVuY3Rpb25hbGl0eS4KICoKICogRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgbWlycm9ycyBsaWJyYXJ5LCB0aGVzZSB0eXBlcyBhcmUgYWxsCiAqIG9iamVjdC1saWtlLCBpbiB0aGF0IHRoZXkgc3VwcG9ydCBtZXRob2QgaW52b2NhdGlvbiBhbmQgZmllbGQKICogYWNjZXNzLiAgUmVhbCBEYXJ0IG9iamVjdHMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBbSW5zdGFuY2VNaXJyb3JdCiAqIHR5cGUuCiAqCiAqIFNlZSBbSW5zdGFuY2VNaXJyb3JdLCBbQ2xhc3NNaXJyb3JdLCBhbmQgW0xpYnJhcnlNaXJyb3JdLgogKi8KYWJzdHJhY3QgY2xhc3MgT2JqZWN0TWlycm9yIGltcGxlbWVudHMgTWlycm9yIHsKICAvKioKICAgKiBJbnZva2VzIHRoZSBuYW1lZCBmdW5jdGlvbiBhbmQgcmV0dXJucyBhIG1pcnJvciBvbiB0aGUgcmVzdWx0LgogICAqCiAgICogTGV0ICpvKiBiZSB0aGUgb2JqZWN0IHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciwgbGV0ICpmKiBiZSB0aGUgc2ltcGxlIG5hbWUKICAgKiBvZiB0aGUgbWVtYmVyIGRlbm90ZWQgYnkgW21lbWJlck5hbWVdLCBsZXQgKmExLCAuLi4sIGFuKiBiZSB0aGUgZWxlbWVudHMKICAgKiBvZiBbcG9zaXRpb25hbEFyZ3VtZW50c10sIGxldCAqazEsIC4uLiwga20qIGJlIHRoZSBpZGVudGlmaWVycyBkZW5vdGVkIGJ5CiAgICogdGhlIGVsZW1lbnRzIG9mIFtuYW1lZEFyZ3VtZW50cy5rZXlzXSwgYW5kIGxldCAqdjEsIC4uLiwgdm0qIGJlIHRoZQogICAqIGVsZW1lbnRzIG9mIFtuYW1lZEFyZ3VtZW50cy52YWx1ZXNdLiBUaGVuIHRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUKICAgKiBtZXRob2QgaW52b2NhdGlvbiAqby5mKGExLCAuLi4sIGFuLCBrMTogdjEsIC4uLiwga206IHZtKSogaW4gYSBzY29wZSB0aGF0CiAgICogaGFzIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mICpvKiAoaWYgKm8qIGlzIGEgY2xhc3Mgb3IgbGlicmFyeSkgb3IKICAgKiB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBvZiAqbyogKG90aGVyd2lzZSkuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiByZXR1cm5zIGEgcmVzdWx0ICpyKiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcmVzdWx0IG9mCiAgICogY2FsbGluZyBbcmVmbGVjdF1cKCpyKlwpLgogICAqCiAgICogSWYgdGhlIGludm9jYXRpb24gY2F1c2VzIGEgY29tcGlsYXRpb24gZXJyb3IgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBpZgogICAqIGEgbm9uLXJlZmxlY3RpdmUgY29tcGlsYXRpb24gZXJyb3IgaGFkIGJlZW4gZW5jb3VudGVyZWQuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uICplKiAodGhhdCBpdCBkb2VzIG5vdCBjYXRjaCksIHRoaXMKICAgKiBtZXRob2QgdGhyb3dzICplKi4KICAgKi8KICAvKgogICAqIFRPRE8odHVybmlkZ2UpOiBIYW5kbGUgYW1iaWd1b3VzIG5hbWVzLgogICAqIFRPRE8odHVybmlkZ2UpOiBIYW5kbGUgb3B0aW9uYWwgJiBuYW1lZCBhcmd1bWVudHMuCiAgICovCiAgSW5zdGFuY2VNaXJyb3IgaW52b2tlKFN5bWJvbCBtZW1iZXJOYW1lLCBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pOwoKICAvKioKICAgKiBJbnZva2VzIGEgZ2V0dGVyIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBUaGUgZ2V0dGVyIGNhbiBiZSB0aGUgaW1wbGljaXQgZ2V0dGVyIGZvciBhIGZpZWxkIG9yIGEgdXNlci1kZWZpbmVkIGdldHRlcgogICAqIG1ldGhvZC4KICAgKgogICAqIExldCAqbyogYmUgdGhlIG9iamVjdCByZWZsZWN0ZWQgYnkgdGhpcyBtaXJyb3IsCiAgICogbGV0ICpmKiBiZSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGdldHRlciBkZW5vdGVkIGJ5IFtmaWVsZE5hbWVdLgogICAqCiAgICogVGhlbiB0aGlzIG1ldGhvZCB3aWxsIHBlcmZvcm0gdGhlIGdldHRlciBpbnZvY2F0aW9uICpvLmYqIGluIGEgc2NvcGUgdGhhdAogICAqIGhhcyBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgbWVtYmVycyBvZiAqbyogKGlmICpvKiBpcyBhIGNsYXNzIG9yIGxpYnJhcnkpIG9yCiAgICogdGhlIHByaXZhdGUgbWVtYmVycyBvZiB0aGUgY2xhc3Mgb2YgKm8qIChvdGhlcndpc2UpLgogICAqCiAgICogSWYgdGhpcyBtaXJyb3IgaXMgYW4gW0luc3RhbmNlTWlycm9yXSwgYW5kIFtmaWVsZE5hbWVdIGRlbm90ZXMgYW4gaW5zdGFuY2UKICAgKiBtZXRob2Qgb24gaXRzIHJlZmxlY3RlZSwgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbiBpcyBhbiBpbnN0YW5jZQogICAqIG1pcnJvciBvbiBhIGNsb3N1cmUgY29ycmVzcG9uZGluZyB0byB0aGF0IG1ldGhvZC4KICAgKgogICAqIElmIHRoaXMgbWlycm9yIGlzIGEgW0xpYnJhcnlNaXJyb3JdLCBhbmQgW2ZpZWxkTmFtZV0gZGVub3RlcyBhIHRvcC1sZXZlbAogICAqIG1ldGhvZCBpbiB0aGUgY29ycmVzcG9uZGluZyBsaWJyYXJ5LCB0aGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIGlzIGFuCiAgICogaW5zdGFuY2UgbWlycm9yIG9uIGEgY2xvc3VyZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgbWV0aG9kLgogICAqCiAgICogSWYgdGhpcyBtaXJyb3IgaXMgYSBbQ2xhc3NNaXJyb3JdLCBhbmQgW2ZpZWxkTmFtZV0gZGVub3RlcyBhIHN0YXRpYyBtZXRob2QKICAgKiBpbiB0aGUgY29ycmVzcG9uZGluZyBjbGFzcywgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbiBpcyBhbiBpbnN0YW5jZQogICAqIG1pcnJvciBvbiBhIGNsb3N1cmUgY29ycmVzcG9uZGluZyB0byB0aGF0IG1ldGhvZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHJldHVybnMgYSByZXN1bHQgKnIqLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKICAgKiBjYWxsaW5nIFtyZWZsZWN0XVwoKnIqXCkuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiBjYXVzZXMgYSBjb21waWxhdGlvbiBlcnJvciwgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBpZgogICAqIGEgbm9uLXJlZmxlY3RpdmUgY29tcGlsYXRpb24gZXJyb3IgaGFkIGJlZW4gZW5jb3VudGVyZWQuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uICplKiAodGhhdCBpdCBkb2VzIG5vdCBjYXRjaCksIHRoaXMKICAgKiBtZXRob2QgdGhyb3dzICplKi4KICAgKi8KICAvLyBUT0RPKGFoZSk6IFJlbW92ZSBzdHVmZiBhYm91dCBzY29wZSBhbmQgcHJpdmF0ZSBtZW1iZXJzLiBbZmllbGROYW1lXSBpcyBhCiAgLy8gY2FwYWJpbGl0eSBnaXZpbmcgYWNjZXNzIHRvIHByaXZhdGUgbWVtYmVycy4KICBJbnN0YW5jZU1pcnJvciBnZXRGaWVsZChTeW1ib2wgZmllbGROYW1lKTsKCiAgLyoqCiAgICogSW52b2tlcyBhIHNldHRlciBhbmQgcmV0dXJucyBhIG1pcnJvciBvbiB0aGUgcmVzdWx0LgogICAqCiAgICogVGhlIHNldHRlciBtYXkgYmUgZWl0aGVyIHRoZSBpbXBsaWNpdCBzZXR0ZXIgZm9yIGEgbm9uLWZpbmFsIGZpZWxkIG9yIGEKICAgKiB1c2VyLWRlZmluZWQgc2V0dGVyIG1ldGhvZC4KICAgKgogICAqIExldCAqbyogYmUgdGhlIG9iamVjdCByZWZsZWN0ZWQgYnkgdGhpcyBtaXJyb3IsCiAgICogbGV0ICpmKiBiZSB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGdldHRlciBkZW5vdGVkIGJ5IFtmaWVsZE5hbWVdLAogICAqIGFuZCBsZXQgKmEqIGJlIHRoZSBvYmplY3QgYm91bmQgdG8gW3ZhbHVlXS4KICAgKgogICAqIFRoZW4gdGhpcyBtZXRob2Qgd2lsbCBwZXJmb3JtIHRoZSBzZXR0ZXIgaW52b2NhdGlvbiAqby5mID0gYSogaW4gYSBzY29wZQogICAqIHRoYXQgaGFzIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mICpvKiAoaWYgKm8qIGlzIGEgY2xhc3Mgb3IKICAgKiBsaWJyYXJ5KSBvciB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBvZiAqbyogKG90aGVyd2lzZSkuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiByZXR1cm5zIGEgcmVzdWx0ICpyKiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcmVzdWx0IG9mCiAgICogY2FsbGluZyBbcmVmbGVjdF1cKFt2YWx1ZV1cKS4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIGNhdXNlcyBhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmCiAgICogYSBub24tcmVmbGVjdGl2ZSBjb21waWxhdGlvbiBlcnJvciBoYWQgYmVlbiBlbmNvdW50ZXJlZC4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90IGNhdGNoKSB0aGlzCiAgICogbWV0aG9kIHRocm93cyAqZSouCiAgICovCiAgLyogVE9ETyh0dXJuaWRnZSk6IEhhbmRsZSBhbWJpZ3VvdXMgbmFtZXMuKi8KICBJbnN0YW5jZU1pcnJvciBzZXRGaWVsZChTeW1ib2wgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBQZXJmb3JtcyBbaW52b2NhdGlvbl0gb24gdGhlIHJlZmxlY3RlZSBvZiB0aGlzIFtPYmplY3RNaXJyb3JdLgogICAqCiAgICogRXF1aXZhbGVudCB0bwogICAqCiAgICogICAgIGlmIChpbnZvY2F0aW9uLmlzR2V0dGVyKSB7CiAgICogICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGQoaW52b2NhdGlvbi5tZW1iZXJOYW1lKS5yZWZsZWN0ZWU7CiAgICogICAgIH0gZWxzZSBpZiAoaW52b2NhdGlvbi5pc1NldHRlcikgewogICAqICAgICAgIHJldHVybiB0aGlzLnNldEZpZWxkKGludm9jYXRpb24ubWVtYmVyTmFtZSwKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uLnBvc2l0aW9uYWxBcmd1bWVudHNbMF0pLnJlZmxlY3RlZTsKICAgKiAgICAgfSBlbHNlIHsKICAgKiAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoaW52b2NhdGlvbi5tZW1iZXJOYW1lLAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uLnBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24ubmFtZWRBcmd1bWVudHMpLnJlZmxlY3RlZTsKICAgKiAgICAgfQogICAqLwogIGRlbGVnYXRlKEludm9jYXRpb24gaW52b2NhdGlvbik7Cn0KCi8qKgogKiBBbiBbSW5zdGFuY2VNaXJyb3JdIHJlZmxlY3RzIGFuIGluc3RhbmNlIG9mIGEgRGFydCBsYW5ndWFnZSBvYmplY3QuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnN0YW5jZU1pcnJvciBpbXBsZW1lbnRzIE9iamVjdE1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIHR5cGUgb2YgdGhlIHJlZmxlY3RlZS4KICAgKgogICAqIFJldHVybnMgYSBtaXJyb3Igb24gdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgcmVmbGVjdGVlLgogICAqIFRoZSBjbGFzcyBvZiB0aGUgcmVmbGVjdGVlIG1heSBkaWZmZXIgZnJvbQogICAqIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgaW52b2tpbmcgW3J1bnRpbWVUeXBlXSBvbgogICAqIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgQ2xhc3NNaXJyb3IgZ2V0IHR5cGU7CgogIC8qKgogICAqIFdoZXRoZXIgW3JlZmxlY3RlZV0gd2lsbCByZXR1cm4gdGhlIGluc3RhbmNlIHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvci4KICAgKgogICAqIFRoaXMgd2lsbCBhbHdheXMgYmUgdHJ1ZSBpbiB0aGUgbG9jYWwgY2FzZSAocmVmbGVjdGluZyBpbnN0YW5jZXMgaW4gdGhlCiAgICogc2FtZSBpc29sYXRlKSwgYnV0IG9ubHkgdHJ1ZSBpbiB0aGUgcmVtb3RlIGNhc2UgaWYgdGhpcyBtaXJyb3IgcmVmbGVjdHMgYQogICAqIHNpbXBsZSB2YWx1ZS4KICAgKgogICAqIEEgdmFsdWUgaXMgc2ltcGxlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgogICAqCiAgICogKiB0aGUgdmFsdWUgaXMgWzpudWxsOl0KICAgKiAqIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIFtudW1dCiAgICogKiB0aGUgdmFsdWUgaXMgb2YgdHlwZSBbYm9vbF0KICAgKiAqIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIFtTdHJpbmddCiAgICovCiAgYm9vbCBnZXQgaGFzUmVmbGVjdGVlOwoKICAvKioKICAgKiBJZiB0aGUgW0luc3RhbmNlTWlycm9yXSByZWZsZWN0cyBhbiBpbnN0YW5jZSBpdCBpcyBtZWFuaW5nZnVsIHRvCiAgICogaGF2ZSBhIGxvY2FsIHJlZmVyZW5jZSB0bywgd2UgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGFjdHVhbAogICAqIGluc3RhbmNlIGhlcmUuCiAgICoKICAgKiBJZiB5b3UgYWNjZXNzIFtyZWZsZWN0ZWVdIHdoZW4gW2hhc1JlZmxlY3RlZV0gaXMgZmFsc2UsIGFuCiAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICBnZXQgcmVmbGVjdGVlOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgbWlycm9yIGlzIGVxdWFsIHRvIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gZWl0aGVyCiAgICoKICAgKiAgICBhLiBbaGFzUmVmbGVjdGVlXSBpcyB0cnVlIGFuZCBzbyBpcwogICAqICAgIFs6aWRlbnRpY2FsKHJlZmxlY3RlZSwgb3RoZXIucmVmbGVjdGVlKTpdLCBvcgogICAqCiAgICogICAgYi4gdGhlIHJlbW90ZSBvYmplY3RzIHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciBhbmQgYnkgW290aGVyXSBhcmUKICAgKiAgICBpZGVudGljYWwuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KCi8qKgogKiBBIFtDbG9zdXJlTWlycm9yXSByZWZsZWN0cyBhIGNsb3N1cmUuCiAqCiAqIEEgW0Nsb3N1cmVNaXJyb3JdIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgaXRzIHJlZmxlY3RlZSBhbmQKICogaW50cm9zcGVjdCBpdHMgZnVuY3Rpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBDbG9zdXJlTWlycm9yIGltcGxlbWVudHMgSW5zdGFuY2VNaXJyb3IgewogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbG9zdXJlLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBpbXBsaWNpdCBjbG9zdXJlIG9mIGEgZnVuY3Rpb24gaXMgdGhhdAogICAqIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGEgWzpjYWxsOl0KICAgKiBtZXRob2QgaXMgdGhhdCBbOmNhbGw6XSBtZXRob2QuCiAgICoKICAgKiBBIERhcnQgaW1wbGVtZW50YXRpb24gbWlnaHQgY2hvb3NlIHRvIGNyZWF0ZSBhIGNsYXNzIGZvciBlYWNoIGNsb3N1cmUKICAgKiBleHByZXNzaW9uLCBpbiB3aGljaCBjYXNlIFs6ZnVuY3Rpb246XSB3b3VsZCBiZSB0aGUgc2FtZSBhcwogICAqIFs6dHlwZS5kZWNsYXJhdGlvbnNbI2NhbGxdOl0uIEJ1dCB0aGUgRGFydCBsYW5ndWFnZSBtb2RlbCBkb2VzIG5vdCByZXF1aXJlCiAgICogdGhpcy4gQSBtb3JlIHR5cGljYWwgaW1wbGVtZW50YXRpb24gaW52b2x2ZXMgYSBzaW5nbGUgY2xvc3VyZSBjbGFzcyBmb3IKICAgKiBlYWNoIHR5cGUgc2lnbmF0dXJlLCB3aGVyZSB0aGUgY2FsbCBtZXRob2QgZGlzcGF0Y2hlcyB0byBhIGZ1bmN0aW9uIGhlbGQKICAgKiBpbiB0aGUgY2xvc3VyZSByYXRoZXIgdGhlIGNhbGwgbWV0aG9kCiAgICogZGlyZWN0bHkgaW1wbGVtZW50aW5nIHRoZSBjbG9zdXJlIGJvZHkuIFNvIG9uZSBjYW5ub3QgcmVseSBvbiBjbG9zdXJlcyBmcm9tCiAgICogZGlzdGluY3QgY2xvc3VyZSBleHByZXNzaW9ucyBoYXZpbmcgZGlzdGluY3QgY2xhc3NlcyAoWzp0eXBlOl0pLCBidXQgb25lCiAgICogY2FuIHJlbHkgb24gdGhlbSBoYXZpbmcgZGlzdGluY3QgZnVuY3Rpb25zIChbOmZ1bmN0aW9uOl0pLgogICAqLwogIE1ldGhvZE1pcnJvciBnZXQgZnVuY3Rpb247CgogIC8qKgogICAqIEV4ZWN1dGVzIHRoZSBjbG9zdXJlIGFuZCByZXR1cm5zIGEgbWlycm9yIG9uIHRoZSByZXN1bHQuCiAgICoKICAgKiBMZXQgKmYqIGJlIHRoZSBjbG9zdXJlIHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciwKICAgKiBsZXQgKmExLCAuLi4sIGFuKiBiZSB0aGUgZWxlbWVudHMgb2YgW3Bvc2l0aW9uYWxBcmd1bWVudHNdLAogICAqIGxldCAqazEsIC4uLiwga20qIGJlIHRoZSBpZGVudGlmaWVycyBkZW5vdGVkIGJ5IHRoZSBlbGVtZW50cyBvZgogICAqIFtuYW1lZEFyZ3VtZW50cy5rZXlzXSwKICAgKiBhbmQgbGV0ICp2MSwgLi4uLCB2bSogYmUgdGhlIGVsZW1lbnRzIG9mIFtuYW1lZEFyZ3VtZW50cy52YWx1ZXNdLgogICAqCiAgICogVGhlbiB0aGlzIG1ldGhvZCB3aWxsIHBlcmZvcm0gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogKmYoYTEsIC4uLiwgYW4sIGsxOiB2MSwgLi4uLCBrbTogdm0pKi4KICAgKgogICAqIElmIHRoZSBpbnZvY2F0aW9uIHJldHVybnMgYSByZXN1bHQgKnIqLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKICAgKiBjYWxsaW5nIFtyZWZsZWN0XVwoKnIqXCkuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiBjYXVzZXMgYSBjb21waWxhdGlvbiBlcnJvciwgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBpZgogICAqIGEgbm9uLXJlZmxlY3RpdmUgY29tcGlsYXRpb24gZXJyb3IgaGFkIGJlZW4gZW5jb3VudGVyZWQuCiAgICoKICAgKiBJZiB0aGUgaW52b2NhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uICplKiAodGhhdCBpdCBkb2VzIG5vdCBjYXRjaCksIHRoaXMKICAgKiBtZXRob2QgdGhyb3dzICplKi4KICAgKi8KICBJbnN0YW5jZU1pcnJvciBhcHBseShMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pOwp9CgovKioKICogQSBbTGlicmFyeU1pcnJvcl0gcmVmbGVjdHMgYSBEYXJ0IGxhbmd1YWdlIGxpYnJhcnksIHByb3ZpZGluZwogKiBhY2Nlc3MgdG8gdGhlIHZhcmlhYmxlcywgZnVuY3Rpb25zLCBhbmQgY2xhc3NlcyBvZiB0aGUKICogbGlicmFyeS4KICovCmFic3RyYWN0IGNsYXNzIExpYnJhcnlNaXJyb3IgaW1wbGVtZW50cyBEZWNsYXJhdGlvbk1pcnJvciwgT2JqZWN0TWlycm9yIHsKICAvKioKICAgKiBUaGUgYWJzb2x1dGUgdXJpIG9mIHRoZSBsaWJyYXJ5LgogICAqLwogIFVyaSBnZXQgdXJpOwoKICAvKioKICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBtYXAgb2YgdGhlIGRlY2xhcmF0aW9ucyBhY3R1YWxseSBnaXZlbiBpbiB0aGUgbGlicmFyeS4KICAgKgogICAqIFRoaXMgbWFwIGluY2x1ZGVzIGFsbCByZWd1bGFyIG1ldGhvZHMsIGdldHRlcnMsIHNldHRlcnMsIGZpZWxkcywgY2xhc3NlcwogICAqIGFuZCB0eXBlZGVmcyBhY3R1YWxseSBkZWNsYXJlZCBpbiB0aGUgbGlicmFyeS4gVGhlIG1hcCBpcyBrZXllZCBieSB0aGUKICAgKiBzaW1wbGUgbmFtZXMgb2YgdGhlIGRlY2xhcmF0aW9ucy4KICAgKi8KICBNYXA8U3ltYm9sLCBEZWNsYXJhdGlvbk1pcnJvcj4gZ2V0IGRlY2xhcmF0aW9uczsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIG1pcnJvciBpcyBlcXVhbCB0byBbb3RoZXJdLgogICAqCiAgICogVGhlIGVxdWFsaXR5IGhvbGRzIGlmIGFuZCBvbmx5IGlmCiAgICoKICAgKiAxLiBbb3RoZXJdIGlzIGEgbWlycm9yIG9mIHRoZSBzYW1lIGtpbmQsIGFuZAogICAqIDIuIFRoZSBsaWJyYXJ5IGJlaW5nIHJlZmxlY3RlZCBieSB0aGlzIG1pcnJvciBhbmQgdGhlIGxpYnJhcnkgYmVpbmcKICAgKiAgICByZWZsZWN0ZWQgYnkgW290aGVyXSBhcmUgdGhlIHNhbWUgbGlicmFyeSBpbiB0aGUgc2FtZSBpc29sYXRlLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgaW1wb3J0cyBhbmQgZXhwb3J0cyBpbiB0aGlzIGxpYnJhcnk7CiAgICovCiAgTGlzdDxMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvcj4gZ2V0IGxpYnJhcnlEZXBlbmRlbmNpZXM7Cn0KCi8vLyBBIG1pcnJvciBvbiBhbiBpbXBvcnQgb3IgZXhwb3J0IGRlY2xhcmF0aW9uLgphYnN0cmFjdCBjbGFzcyBMaWJyYXJ5RGVwZW5kZW5jeU1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7CiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIGRlcGVuZGVuY3kgaXMgYW4gaW1wb3J0LgogIGJvb2wgZ2V0IGlzSW1wb3J0OwoKICAvLy8gSXMgYHRydWVgIGlmIHRoaXMgZGVwZW5kZW5jeSBpcyBhbiBleHBvcnQuCiAgYm9vbCBnZXQgaXNFeHBvcnQ7CgogIC8vLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgZGVwZW5kZW5jeSBpcyBhIGRlZmVycmVkIGltcG9ydC4gT3RoZXJ3aXNlIHJldHVybnMKICAvLy8gZmFsc2UuCiAgYm9vbCBnZXQgaXNEZWZlcnJlZDsKCiAgLy8vIFJldHVybnMgdGhlIGxpYnJhcnkgbWlycm9yIG9mIHRoZSBsaWJyYXJ5IHRoYXQgaW1wb3J0cyBvciBleHBvcnRzIHRoZQogIC8vLyBbdGFyZ2V0TGlicmFyeV0uCiAgTGlicmFyeU1pcnJvciBnZXQgc291cmNlTGlicmFyeTsKCiAgLy8vIFJldHVybnMgdGhlIGxpYnJhcnkgbWlycm9yIG9mIHRoZSBsaWJyYXJ5IHRoYXQgaXMgaW1wb3J0ZWQgb3IgZXhwb3J0ZWQsCiAgLy8vIG9yIG51bGwgaWYgdGhlIGxpYnJhcnkgaXMgbm90IGxvYWRlZC4KICBMaWJyYXJ5TWlycm9yIGdldCB0YXJnZXRMaWJyYXJ5OwoKICAvLy8gUmV0dXJucyB0aGUgcHJlZml4IGlmIHRoaXMgaXMgYSBwcmVmaXhlZCBpbXBvcnQgYW5kIGBudWxsYCBvdGhlcndpc2UuCiAgU3ltYm9sIGdldCBwcmVmaXg7CgogIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHNob3cvaGlkZSBjb21iaW5hdG9ycyBvbiB0aGUgaW1wb3J0L2V4cG9ydAogIC8vLyBkZWNsYXJhdGlvbi4KICBMaXN0PENvbWJpbmF0b3JNaXJyb3I+IGdldCBjb21iaW5hdG9yczsKCiAgLy8vIFJldHVybnMgdGhlIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhpcyBpbXBvcnQvZXhwb3J0IGRlY2xhcmF0aW9uLgogIFNvdXJjZUxvY2F0aW9uIGdldCBsb2NhdGlvbjsKCiAgTGlzdDxJbnN0YW5jZU1pcnJvcj4gZ2V0IG1ldGFkYXRhOwoKICAvLy8gUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGNvbXBsZXRlcyB3aXRoIGEgbGlicmFyeSBtaXJyb3Igb24gdGhlIGxpYnJhcnkgYmVpbmcKICAvLy8gaW1wb3J0ZWQgb3IgZXhwb3J0ZWQgd2hlbiBpdCBpcyBsb2FkZWQsIGFuZCBpbml0aWF0ZXMgYSBsb2FkIG9mIHRoYXQKICAvLy8gbGlicmFyeSBpZiBpdCBpcyBub3QgbG9hZGVkLgogIEZ1dHVyZTxMaWJyYXJ5TWlycm9yPiBsb2FkTGlicmFyeSgpOwp9CgovLy8gQSBtaXJyb3Igb24gYSBzaG93L2hpZGUgY29tYmluYXRvciBkZWNsYXJlZCBvbiBhIGxpYnJhcnkgZGVwZW5kZW5jeS4KYWJzdHJhY3QgY2xhc3MgQ29tYmluYXRvck1pcnJvciBpbXBsZW1lbnRzIE1pcnJvciB7CiAgLy8vIFRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIG9uIHRoZSBjb21iaW5hdG9yLgogIExpc3Q8U3ltYm9sPiBnZXQgaWRlbnRpZmllcnM7CgogIC8vLyBJcyBgdHJ1ZWAgaWYgdGhpcyBpcyBhICdzaG93JyBjb21iaW5hdG9yLgogIGJvb2wgZ2V0IGlzU2hvdzsKCiAgLy8vIElzIGB0cnVlYCBpZiB0aGlzIGlzIGEgJ2hpZGUnIGNvbWJpbmF0b3IuCiAgYm9vbCBnZXQgaXNIaWRlOwp9CgovKioKICogQSBbVHlwZU1pcnJvcl0gcmVmbGVjdHMgYSBEYXJ0IGxhbmd1YWdlIGNsYXNzLCB0eXBlZGVmLAogKiBmdW5jdGlvbiB0eXBlIG9yIHR5cGUgdmFyaWFibGUuCiAqLwphYnN0cmFjdCBjbGFzcyBUeXBlTWlycm9yIGltcGxlbWVudHMgRGVjbGFyYXRpb25NaXJyb3IgewogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1pcnJvciByZWZsZWN0cyBkeW5hbWljLCBhIG5vbi1nZW5lcmljIGNsYXNzIG9yCiAgICogdHlwZWRlZiwgb3IgYW4gaW5zdGFudGlhdGVkIGdlbmVyaWMgY2xhc3Mgb3IgdHlwZWRlZiBpbiB0aGUgY3VycmVudAogICAqIGlzb2xhdGUuIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS4KICAgKi8KICBib29sIGdldCBoYXNSZWZsZWN0ZWRUeXBlOwoKICAvKioKICAgKiBJZiBbOmhhc1JlZmxlY3RlZFR5cGU6XSByZXR1cm5zIHRydWUsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgW1R5cGVdLgogICAqIE90aGVyd2lzZSwgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIGlzIHRocm93bi4KICAgKi8KICBUeXBlIGdldCByZWZsZWN0ZWRUeXBlOwoKICAvKioKICAgKiBBbiBpbW11dGFibGUgbGlzdCB3aXRoIG1pcnJvcnMgZm9yIGFsbCB0eXBlIHZhcmlhYmxlcyBmb3IgdGhpcyB0eXBlLgogICAqCiAgICogSWYgdGhpcyB0eXBlIGlzIGEgZ2VuZXJpYyBkZWNsYXJhdGlvbiBvciBhbiBpbnZvY2F0aW9uIG9mIGEgZ2VuZXJpYwogICAqIGRlY2xhcmF0aW9uLCB0aGUgcmV0dXJuZWQgbGlzdCBjb250YWlucyBtaXJyb3JzIG9uIHRoZSB0eXBlIHZhcmlhYmxlcwogICAqIGRlY2xhcmVkIGluIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbi4KICAgKiBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5LgogICAqCiAgICogVGhpcyBsaXN0IHByZXNlcnZlcyB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb24gb2YgdGhlIHR5cGUgdmFyaWFibGVzLgogICAqLwogIExpc3Q8VHlwZVZhcmlhYmxlTWlycm9yPiBnZXQgdHlwZVZhcmlhYmxlczsKCiAgLyoqCiAgICogQW4gaW1tdXRhYmxlIGxpc3Qgd2l0aCBtaXJyb3JzIGZvciBhbGwgdHlwZSBhcmd1bWVudHMgZm9yCiAgICogdGhpcyB0eXBlLgogICAqCiAgICogSWYgdGhlIHJlZmxlY3RlZSBpcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2VuZXJpYyBjbGFzcywKICAgKiB0aGUgdHlwZSBhcmd1bWVudHMgYXJlIHRoZSBiaW5kaW5ncyBvZiBpdHMgdHlwZSBwYXJhbWV0ZXJzLgogICAqIElmIHRoZSByZWZsZWN0ZWUgaXMgdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uIG9mIGEgZ2VuZXJpYywKICAgKiBpdCBoYXMgbm8gdHlwZSBhcmd1bWVudHMgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdC4KICAgKiBJZiB0aGUgcmVmbGVjdGVlIGlzIG5vdCBnZW5lcmljLCB0aGVuCiAgICogaXQgaGFzIG5vIHR5cGUgYXJndW1lbnRzIGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuCiAgICoKICAgKiBUaGlzIGxpc3QgcHJlc2VydmVzIHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbiBvZiB0aGUgdHlwZSB2YXJpYWJsZXMuCiAgICovCiAgTGlzdDxUeXBlTWlycm9yPiBnZXQgdHlwZUFyZ3VtZW50czsKCiAgLyoqCiAgICogSXMgdGhpcyB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gb2YgdGhpcyB0eXBlPwogICAqCiAgICogRm9yIG1vc3QgY2xhc3NlcywgdGhleSBhcmUgdGhlaXIgb3duIG9yaWdpbmFsIGRlY2xhcmF0aW9uLiAgRm9yCiAgICogZ2VuZXJpYyBjbGFzc2VzLCBob3dldmVyLCB0aGVyZSBpcyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlCiAgICogb3JpZ2luYWwgY2xhc3MgZGVjbGFyYXRpb24sIHdoaWNoIGhhcyB1bmJvdW5kIHR5cGUgdmFyaWFibGVzLCBhbmQKICAgKiB0aGUgaW5zdGFudGlhdGlvbnMgb2YgZ2VuZXJpYyBjbGFzc2VzLCB3aGljaCBoYXZlIGJvdW5kIHR5cGUKICAgKiB2YXJpYWJsZXMuCiAgICovCiAgYm9vbCBnZXQgaXNPcmlnaW5hbERlY2xhcmF0aW9uOwoKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gb2YgdGhpcyB0eXBlLgogICAqCiAgICogRm9yIG1vc3QgY2xhc3NlcywgdGhleSBhcmUgdGhlaXIgb3duIG9yaWdpbmFsIGRlY2xhcmF0aW9uLiAgRm9yCiAgICogZ2VuZXJpYyBjbGFzc2VzLCBob3dldmVyLCB0aGVyZSBpcyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlCiAgICogb3JpZ2luYWwgY2xhc3MgZGVjbGFyYXRpb24sIHdoaWNoIGhhcyB1bmJvdW5kIHR5cGUgdmFyaWFibGVzLCBhbmQKICAgKiB0aGUgaW5zdGFudGlhdGlvbnMgb2YgZ2VuZXJpYyBjbGFzc2VzLCB3aGljaCBoYXZlIGJvdW5kIHR5cGUKICAgKiB2YXJpYWJsZXMuCiAgICovCiAgVHlwZU1pcnJvciBnZXQgb3JpZ2luYWxEZWNsYXJhdGlvbjsKCiAgLyoqCiAgICogQ2hlY2tzIHRoZSBzdWJ0eXBlIHJlbGF0aW9uc2hpcCwgZGVub3RlZCBieSBgPDpgIGluIHRoZSBsYW5ndWFnZQogICAqIHNwZWNpZmljYXRpb24uCiAgICoKICAgKiBUaGlzIGlzIHRoZSB0eXBlIHJlbGF0aW9uc2hpcCB1c2VkIGluIGBpc2AgdGVzdCBjaGVja3MuCiAgICovCiAgYm9vbCBpc1N1YnR5cGVPZihUeXBlTWlycm9yIG90aGVyKTsKCiAgLyoqCiAgICogQ2hlY2tzIHRoZSBhc3NpZ25hYmlsaXR5IHJlbGF0aW9uc2hpcCwgZGVub3RlZCBieSBgPD0+YCBpbiB0aGUgbGFuZ3VhZ2UKICAgKiBzcGVjaWZpY2F0aW9uLgogICAqCiAgICogVGhpcyBpcyB0aGUgdHlwZSByZWxhdGlvbnNoaXAgdGVzdGVkIG9uIGFzc2lnbm1lbnQgaW4gY2hlY2tlZCBtb2RlLgogICAqLwogIGJvb2wgaXNBc3NpZ25hYmxlVG8oVHlwZU1pcnJvciBvdGhlcik7Cn0KCi8qKgogKiBBIFtDbGFzc01pcnJvcl0gcmVmbGVjdHMgYSBEYXJ0IGxhbmd1YWdlIGNsYXNzLgogKi8KYWJzdHJhY3QgY2xhc3MgQ2xhc3NNaXJyb3IgaW1wbGVtZW50cyBUeXBlTWlycm9yLCBPYmplY3RNaXJyb3IgewogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSBzdXBlcmNsYXNzIG9uIHRoZSByZWZsZWN0ZWUuCiAgICoKICAgKiBJZiB0aGlzIHR5cGUgaXMgWzpPYmplY3Q6XSwgdGhlIHN1cGVyY2xhc3Mgd2lsbCBiZSBudWxsLgogICAqLwogIENsYXNzTWlycm9yIGdldCBzdXBlcmNsYXNzOwoKICAvKioKICAgKiBBIGxpc3Qgb2YgbWlycm9ycyBvbiB0aGUgc3VwZXJpbnRlcmZhY2VzIG9mIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgTGlzdDxDbGFzc01pcnJvcj4gZ2V0IHN1cGVyaW50ZXJmYWNlczsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhYnN0cmFjdD8KICAgKi8KICBib29sIGdldCBpc0Fic3RyYWN0OwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGFuIGVudW0/CiAgICovCiAgYm9vbCBnZXQgaXNFbnVtOwoKICAvKioKICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBtYXAgb2YgdGhlIGRlY2xhcmF0aW9ucyBhY3R1YWxseSBnaXZlbiBpbiB0aGUgY2xhc3MKICAgKiBkZWNsYXJhdGlvbi4KICAgKgogICAqIFRoaXMgbWFwIGluY2x1ZGVzIGFsbCByZWd1bGFyIG1ldGhvZHMsIGdldHRlcnMsIHNldHRlcnMsIGZpZWxkcywKICAgKiBjb25zdHJ1Y3RvcnMgYW5kIHR5cGUgdmFyaWFibGVzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoZSBjbGFzcy4gQm90aAogICAqIHN0YXRpYyBhbmQgaW5zdGFuY2UgbWVtYmVycyBhcmUgaW5jbHVkZWQsIGJ1dCBubyBpbmhlcml0ZWQgbWVtYmVycyBhcmUKICAgKiBpbmNsdWRlZC4gVGhlIG1hcCBpcyBrZXllZCBieSB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBkZWNsYXJhdGlvbnMuCiAgICoKICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgaW5oZXJpdGVkIG1lbWJlcnMuCiAgICovCiAgTWFwPFN5bWJvbCwgRGVjbGFyYXRpb25NaXJyb3I+IGdldCBkZWNsYXJhdGlvbnM7CgogIC8qKgogICAqIFJldHVybnMgYSBtYXAgb2YgdGhlIG1ldGhvZHMsIGdldHRlcnMgYW5kIHNldHRlcnMgb2YgYW4gaW5zdGFuY2Ugb2YgdGhlCiAgICogY2xhc3MuCiAgICoKICAgKiBUaGUgaW50ZW50IGlzIHRvIGNhcHR1cmUgdGhvc2UgbWVtYmVycyB0aGF0IGNvbnN0aXR1dGUgdGhlIEFQSSBvZiBhbgogICAqIGluc3RhbmNlLiBIZW5jZSBmaWVsZHMgYXJlIG5vdCBpbmNsdWRlZCwgYnV0IHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzCiAgICogaW1wbGljaXRseSBpbnRyb2R1Y2VkIGJ5IGZpZWxkcyBhcmUgaW5jbHVkZWQuIFRoZSBtYXAgaW5jbHVkZXMgbWV0aG9kcywKICAgKiBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHRoYXQgYXJlIGluaGVyaXRlZCBhcyB3ZWxsIGFzIHRob3NlIGludHJvZHVjZWQgYnkgdGhlCiAgICogY2xhc3MgaXRzZWxmLgogICAqCiAgICogVGhlIG1hcCBpcyBrZXllZCBieSB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSBtZW1iZXJzLgogICAqLwogIE1hcDxTeW1ib2wsIE1ldGhvZE1pcnJvcj4gZ2V0IGluc3RhbmNlTWVtYmVyczsKCiAgLyoqCiAgICogUmV0dXJucyBhIG1hcCBvZiB0aGUgc3RhdGljIG1ldGhvZHMsIGdldHRlcnMgYW5kIHNldHRlcnMgb2YgdGhlIGNsYXNzLgogICAqCiAgICogVGhlIGludGVudCBpcyB0byBjYXB0dXJlIHRob3NlIG1lbWJlcnMgdGhhdCBjb25zdGl0dXRlIHRoZSBBUEkgb2YgYSBjbGFzcy4KICAgKiBIZW5jZSBmaWVsZHMgYXJlIG5vdCBpbmNsdWRlZCwgYnV0IHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGltcGxpY2l0bHkKICAgKiBpbnRyb2R1Y2VkIGJ5IGZpZWxkcyBhcmUgaW5jbHVkZWQuCiAgICoKICAgKiBUaGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBzaW1wbGUgbmFtZXMgb2YgdGhlIG1lbWJlcnMuCiAgICovCiAgTWFwPFN5bWJvbCwgTWV0aG9kTWlycm9yPiBnZXQgc3RhdGljTWVtYmVyczsKCiAgLyoqCiAgICogVGhlIG1peGluIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBJZiB0aGlzIGNsYXNzIGlzIHRoZSByZXN1bHQgb2YgYSBtaXhpbiBhcHBsaWNhdGlvbiBvZiB0aGUgZm9ybSBTIHdpdGggTSwKICAgKiByZXR1cm5zIGEgY2xhc3MgbWlycm9yIG9uIE0uIE90aGVyd2lzZSByZXR1cm5zIGEgY2xhc3MgbWlycm9yIG9uCiAgICogdGhlIHJlZmxlY3RlZS4KICAgKi8KICBDbGFzc01pcnJvciBnZXQgbWl4aW47CgogIC8vIFRPRE8oYWhlKTogV2hhdCBhYm91dDoKICAvLyAvLy8gRmluZHMgdGhlIGluc3RhbmNlIG1lbWJlciBuYW1lZCBbbmFtZV0gZGVjbGFyZWQgb3IgaW5oZXJpdGVkIGluIHRoZQogIC8vIC8vLyByZWZsZWN0ZWQgY2xhc3MuCiAgLy8gRGVjbGFyYXRpb25NaXJyb3IgaW5zdGFuY2VMb29rdXAoU3ltYm9sIG5hbWUpOwoKICAvKioKICAgKiBJbnZva2VzIHRoZSBuYW1lZCBjb25zdHJ1Y3RvciBhbmQgcmV0dXJucyBhIG1pcnJvciBvbiB0aGUgcmVzdWx0LgogICAqCiAgICogTGV0ICpjKiBiZSB0aGUgY2xhc3MgcmVmbGVjdGVkIGJ5IHRoaXMgbWlycm9yLAogICAqIGxldCAqYTEsIC4uLiwgYW4qIGJlIHRoZSBlbGVtZW50cyBvZiBbcG9zaXRpb25hbEFyZ3VtZW50c10sCiAgICogbGV0ICprMSwgLi4uLCBrbSogYmUgdGhlIGlkZW50aWZpZXJzIGRlbm90ZWQgYnkgdGhlIGVsZW1lbnRzIG9mCiAgICogW25hbWVkQXJndW1lbnRzLmtleXNdLAogICAqIGFuZCBsZXQgKnYxLCAuLi4sIHZtKiBiZSB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzLnZhbHVlc10uCiAgICoKICAgKiBJZiBbY29uc3RydWN0b3JOYW1lXSB3YXMgY3JlYXRlZCBmcm9tIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gdGhpcyBtZXRob2QKICAgKiB3aWxsIGV4ZWN1dGUgdGhlIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24KICAgKiAqbmV3IGMoYTEsIC4uLiwgYW4sIGsxOiB2MSwgLi4uLCBrbTogdm0pKiBpbiBhIHNjb3BlIHRoYXQgaGFzIGFjY2VzcyB0bwogICAqIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgKmMqLgogICAqCiAgICogT3RoZXJ3aXNlLCBsZXQgKmYqIGJlIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IgZGVub3RlZCBieQogICAqIFtjb25zdHJ1Y3Rvck5hbWVdLiBUaGVuIHRoaXMgbWV0aG9kIHdpbGwgZXhlY3V0ZSB0aGUgaW5zdGFuY2UgY3JlYXRpb24KICAgKiBleHByZXNzaW9uICpuZXcgYy5mKGExLCAuLi4sIGFuLCBrMTogdjEsIC4uLiwga206IHZtKSogaW4gYSBzY29wZSB0aGF0IGhhcwogICAqIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1iZXJzIG9mICpjKi4KICAgKgogICAqIEluIGVpdGhlciBjYXNlOgogICAqCiAgICogKiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSByZXN1bHQgKnIqLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZQogICAqICAgcmVzdWx0IG9mIGNhbGxpbmcgW3JlZmxlY3RdXCgqcipcKS4KICAgKiAqIElmIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gY2F1c2VzIGEgY29tcGlsYXRpb24gZXJyb3IsIHRoZSBlZmZlY3QgaXMKICAgKiAgIHRoZSBzYW1lIGFzIGlmIGEgbm9uLXJlZmxlY3RpdmUgY29tcGlsYXRpb24gZXJyb3IgaGFkIGJlZW4gZW5jb3VudGVyZWQuCiAgICogKiBJZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIHRocm93cyBhbiBleGNlcHRpb24gKmUqICh0aGF0IGl0IGRvZXMgbm90CiAgICogICBjYXRjaCksIHRoaXMgbWV0aG9kIHRocm93cyAqZSouCiAgICovCiAgSW5zdGFuY2VNaXJyb3IgbmV3SW5zdGFuY2UoU3ltYm9sIGNvbnN0cnVjdG9yTmFtZSwgTGlzdCBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICBbTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHNdKTsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIG1pcnJvciBpcyBlcXVhbCB0byBbb3RoZXJdLgogICAqCiAgICogVGhlIGVxdWFsaXR5IGhvbGRzIGlmIGFuZCBvbmx5IGlmCiAgICoKICAgKiAxLiBbb3RoZXJdIGlzIGEgbWlycm9yIG9mIHRoZSBzYW1lIGtpbmQsIGFuZAogICAqIDIuIFRoaXMgbWlycm9yIGFuZCBbb3RoZXJdIHJlZmxlY3QgdGhlIHNhbWUgY2xhc3MuCiAgICoKICAgKiBOb3RlIHRoYXQgaWYgdGhlIHJlZmxlY3RlZCBjbGFzcyBpcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2VuZXJpYyBjbGFzcywgMi4KICAgKiBpbXBsaWVzIHRoYXQgdGhlIHJlZmxlY3RlZCBjbGFzcyBhbmQgW290aGVyXSBoYXZlIGVxdWFsIHR5cGUgYXJndW1lbnRzLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNsYXNzIGRlbm90ZWQgYnkgdGhlIHJlY2VpdmVyIGlzIGEgc3ViY2xhc3Mgb2YgdGhlCiAgICogY2xhc3MgZGVub3RlZCBieSB0aGUgYXJndW1lbnQuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhlIHN1YmNsYXNzIHJlbGF0aW9uc2hpcCBpcyByZWZsZXhpdmUuCiAgICovCiAgYm9vbCBpc1N1YmNsYXNzT2YoQ2xhc3NNaXJyb3Igb3RoZXIpOwp9CgovKioKICogQSBbRnVuY3Rpb25UeXBlTWlycm9yXSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gaW4gdGhlCiAqIERhcnQgbGFuZ3VhZ2UuCiAqLwphYnN0cmFjdCBjbGFzcyBGdW5jdGlvblR5cGVNaXJyb3IgaW1wbGVtZW50cyBDbGFzc01pcnJvciB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBUeXBlTWlycm9yIGdldCByZXR1cm5UeXBlOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgTGlzdDxQYXJhbWV0ZXJNaXJyb3I+IGdldCBwYXJhbWV0ZXJzOwoKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgWzpjYWxsOl0gbWV0aG9kIGZvciB0aGUgcmVmbGVjdGVlLgogICAqLwogIC8vIFRoaXMgaXMgb25seSBoZXJlIGJlY2F1c2UgaW4gdGhlIHBhc3QgdGhlIFZNIGRpZCBub3QgaW1wbGVtZW50IGEgY2FsbAogIC8vIG1ldGhvZCBvbiBjbG9zdXJlcy4KICBNZXRob2RNaXJyb3IgZ2V0IGNhbGxNZXRob2Q7Cn0KCi8qKgogKiBBIFtUeXBlVmFyaWFibGVNaXJyb3JdIHJlcHJlc2VudHMgYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMgdHlwZS4KICovCmFic3RyYWN0IGNsYXNzIFR5cGVWYXJpYWJsZU1pcnJvciBleHRlbmRzIFR5cGVNaXJyb3IgewogIC8qKgogICAqIEEgbWlycm9yIG9uIHRoZSB0eXBlIHRoYXQgaXMgdGhlIHVwcGVyIGJvdW5kIG9mIHRoaXMgdHlwZSB2YXJpYWJsZS4KICAgKi8KICBUeXBlTWlycm9yIGdldCB1cHBlckJvdW5kOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIHN0YXRpYz8KICAgKgogICAqIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIG1pcnJvcnMgbGlicmFyeSwgdHlwZSB2YXJpYWJsZXMgYXJlIGNvbnNpZGVyZWQKICAgKiBub24tc3RhdGljLgogICAqLwogIGJvb2wgZ2V0IGlzU3RhdGljOwoKICAvKioKICAgKiBXaGV0aGVyIFtvdGhlcl0gaXMgYSBbVHlwZVZhcmlhYmxlTWlycm9yXSBvbiB0aGUgc2FtZSB0eXBlIHZhcmlhYmxlIGFzIHRoaXMKICAgKiBtaXJyb3IuCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gWzpzaW1wbGVOYW1lID09IG90aGVyLnNpbXBsZU5hbWU6XSBhbmQgWzpvd25lciA9PSBvdGhlci5vd25lcjpdLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwp9CgovKioKICogQSBbVHlwZWRlZk1pcnJvcl0gcmVwcmVzZW50cyBhIHR5cGVkZWYgaW4gYSBEYXJ0IGxhbmd1YWdlIHByb2dyYW0uCiAqLwphYnN0cmFjdCBjbGFzcyBUeXBlZGVmTWlycm9yIGltcGxlbWVudHMgVHlwZU1pcnJvciB7CiAgLyoqCiAgICogVGhlIGRlZmluaW5nIHR5cGUgZm9yIHRoaXMgdHlwZWRlZi4KICAgKgogICAqIElmIHRoZSB0eXBlIHJlZmVycmVkIHRvIGJ5IHRoZSByZWZsZWN0ZWUgaXMgYSBmdW5jdGlvbiB0eXBlICpGKiwgdGhlCiAgICogcmVzdWx0IHdpbGwgYmUgWzpGdW5jdGlvblR5cGVNaXJyb3I6XSByZWZsZWN0aW5nICpGKiB3aGljaCBpcyBhYnN0cmFjdAogICAqIGFuZCBoYXMgYW4gYWJzdHJhY3QgbWV0aG9kIFs6Y2FsbDpdIHdob3NlIHNpZ25hdHVyZSBjb3JyZXNwb25kcyB0byAqRiouCiAgICogRm9yIGluc3RhbmNlIFs6dm9pZCBmKGludCk6XSBpcyB0aGUgcmVmZXJlbnQgZm9yIFs6dHlwZWRlZiB2b2lkIGYoaW50KTpdLgogICAqLwogIEZ1bmN0aW9uVHlwZU1pcnJvciBnZXQgcmVmZXJlbnQ7Cn0KCi8qKgogKiBBIFtNZXRob2RNaXJyb3JdIHJlZmxlY3RzIGEgRGFydCBsYW5ndWFnZSBmdW5jdGlvbiwgbWV0aG9kLAogKiBjb25zdHJ1Y3RvciwgZ2V0dGVyLCBvciBzZXR0ZXIuCiAqLwphYnN0cmFjdCBjbGFzcyBNZXRob2RNaXJyb3IgaW1wbGVtZW50cyBEZWNsYXJhdGlvbk1pcnJvciB7CiAgLyoqCiAgICogQSBtaXJyb3Igb24gdGhlIHJldHVybiB0eXBlIGZvciB0aGUgcmVmbGVjdGVlLgogICAqLwogIFR5cGVNaXJyb3IgZ2V0IHJldHVyblR5cGU7CgogIC8qKgogICAqIFRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHJlZmxlY3RlZSwgaWYgYXZhaWxhYmxlLiBPdGhlcndpc2UgbnVsbC4KICAgKi8KICBTdHJpbmcgZ2V0IHNvdXJjZTsKCiAgLyoqCiAgICogQSBsaXN0IG9mIG1pcnJvcnMgb24gdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZWZsZWN0ZWUuCiAgICovCiAgTGlzdDxQYXJhbWV0ZXJNaXJyb3I+IGdldCBwYXJhbWV0ZXJzOwoKICAvKioKICAgKiBBIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQgbm9uLXN0YXRpYyBpZmYgaXQgaXMgcGVybWl0ZWQgdG8gcmVmZXIgdG8gJ3RoaXMnLgogICAqCiAgICogTm90ZSB0aGF0IGdlbmVyYXRpdmUgY29uc3RydWN0b3JzIGFyZSBjb25zaWRlcmVkIG5vbi1zdGF0aWMsIHdoZXJlYXMKICAgKiBmYWN0b3J5IGNvbnN0cnVjdG9ycyBhcmUgY29uc2lkZXJlZCBzdGF0aWMuCiAgICovCiAgYm9vbCBnZXQgaXNTdGF0aWM7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYWJzdHJhY3Q/CiAgICovCiAgYm9vbCBnZXQgaXNBYnN0cmFjdDsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZWZsZWN0ZWUgaXMgc3ludGhldGljLCBhbmQgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCiAgICoKICAgKiBBIHJlZmxlY3RlZSBpcyBzeW50aGV0aWMgaWYgaXQgaXMgYSBnZXR0ZXIgb3Igc2V0dGVyIGltcGxpY2l0bHkgaW50cm9kdWNlZAogICAqIGZvciBhIGZpZWxkIG9yIFR5cGUsIG9yIGlmIGl0IGlzIGEgY29uc3RydWN0b3IgdGhhdCB3YXMgaW1wbGljaXRseQogICAqIGludHJvZHVjZWQgYXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9yIGFzIHBhcnQgb2YgYSBtaXhpbiBhcHBsaWNhdGlvbi4KICAgKi8KICBib29sIGdldCBpc1N5bnRoZXRpYzsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhIHJlZ3VsYXIgZnVuY3Rpb24gb3IgbWV0aG9kPwogICAqCiAgICogQSBmdW5jdGlvbiBvciBtZXRob2QgaXMgcmVndWxhciBpZiBpdCBpcyBub3QgYSBnZXR0ZXIsIHNldHRlciwgb3IKICAgKiBjb25zdHJ1Y3Rvci4gIE5vdGUgdGhhdCBvcGVyYXRvcnMsIGJ5IHRoaXMgZGVmaW5pdGlvbiwgYXJlCiAgICogcmVndWxhciBtZXRob2RzLgogICAqLwogIGJvb2wgZ2V0IGlzUmVndWxhck1ldGhvZDsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhbiBvcGVyYXRvcj8KICAgKi8KICBib29sIGdldCBpc09wZXJhdG9yOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgZ2V0dGVyPwogICAqLwogIGJvb2wgZ2V0IGlzR2V0dGVyOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgc2V0dGVyPwogICAqLwogIGJvb2wgZ2V0IGlzU2V0dGVyOwoKICAvKioKICAgKiBJcyB0aGUgcmVmbGVjdGVlIGEgY29uc3RydWN0b3I/CiAgICovCiAgYm9vbCBnZXQgaXNDb25zdHJ1Y3RvcjsKCiAgLyoqCiAgICogVGhlIGNvbnN0cnVjdG9yIG5hbWUgZm9yIG5hbWVkIGNvbnN0cnVjdG9ycyBhbmQgZmFjdG9yeSBtZXRob2RzLgogICAqCiAgICogRm9yIHVubmFtZWQgY29uc3RydWN0b3JzLCB0aGlzIGlzIHRoZSBlbXB0eSBzdHJpbmcuICBGb3IKICAgKiBub24tY29uc3RydWN0b3JzLCB0aGlzIGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgWzonYmFyJzpdIGlzIHRoZSBjb25zdHJ1Y3RvciBuYW1lIGZvciBjb25zdHJ1Y3RvcgogICAqIFs6Rm9vLmJhcjpdIG9mIHR5cGUgWzpGb286XS4KICAgKi8KICBTeW1ib2wgZ2V0IGNvbnN0cnVjdG9yTmFtZTsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhIGNvbnN0IGNvbnN0cnVjdG9yPwogICAqLwogIGJvb2wgZ2V0IGlzQ29uc3RDb25zdHJ1Y3RvcjsKCiAgLyoqCiAgICogSXMgdGhlIHJlZmxlY3RlZSBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3I/CiAgICovCiAgYm9vbCBnZXQgaXNHZW5lcmF0aXZlQ29uc3RydWN0b3I7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3Rvcj8KICAgKi8KICBib29sIGdldCBpc1JlZGlyZWN0aW5nQ29uc3RydWN0b3I7CgogIC8qKgogICAqIElzIHRoZSByZWZsZWN0ZWUgYSBmYWN0b3J5IGNvbnN0cnVjdG9yPwogICAqLwogIGJvb2wgZ2V0IGlzRmFjdG9yeUNvbnN0cnVjdG9yOwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgbWlycm9yIGlzIGVxdWFsIHRvIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gWzpzaW1wbGVOYW1lID09IG90aGVyLnNpbXBsZU5hbWU6XSBhbmQgWzpvd25lciA9PSBvdGhlci5vd25lcjpdLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwp9CgovKioKICogQSBbVmFyaWFibGVNaXJyb3JdIHJlZmxlY3RzIGEgRGFydCBsYW5ndWFnZSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIFZhcmlhYmxlTWlycm9yIGltcGxlbWVudHMgRGVjbGFyYXRpb25NaXJyb3IgewogIC8qKgogICAqIFJldHVybnMgYSBtaXJyb3Igb24gdGhlIHR5cGUgb2YgdGhlIHJlZmxlY3RlZS4KICAgKi8KICBUeXBlTWlycm9yIGdldCB0eXBlOwoKICAvKioKICAgKiBSZXR1cm5zIFs6dHJ1ZTpdIGlmIHRoZSByZWZsZWN0ZWUgaXMgYSBzdGF0aWMgdmFyaWFibGUuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgbWlycm9yIGxpYnJhcnksIHRvcC1sZXZlbCB2YXJpYWJsZXMgYXJlCiAgICogaW1wbGljaXRseSBkZWNsYXJlZCBzdGF0aWMuCiAgICovCiAgYm9vbCBnZXQgaXNTdGF0aWM7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBpcyBhIGZpbmFsIHZhcmlhYmxlLgogICAqIE90aGVyd2lzZSByZXR1cm5zIFs6ZmFsc2U6XS4KICAgKi8KICBib29sIGdldCBpc0ZpbmFsOwoKICAvKioKICAgKiBSZXR1cm5zIFs6dHJ1ZTpdIGlmIHRoZSByZWZsZWN0ZWUgaXMgZGVjbGFyZWQgWzpjb25zdDpdLgogICAqIE90aGVyd2lzZSByZXR1cm5zIFs6ZmFsc2U6XS4KICAgKi8KICBib29sIGdldCBpc0NvbnN0OwoKICAvKioKICAgKiBXaGV0aGVyIHRoaXMgbWlycm9yIGlzIGVxdWFsIHRvIFtvdGhlcl0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgaG9sZHMgaWYgYW5kIG9ubHkgaWYKICAgKgogICAqIDEuIFtvdGhlcl0gaXMgYSBtaXJyb3Igb2YgdGhlIHNhbWUga2luZCwgYW5kCiAgICogMi4gWzpzaW1wbGVOYW1lID09IG90aGVyLnNpbXBsZU5hbWU6XSBhbmQgWzpvd25lciA9PSBvdGhlci5vd25lcjpdLgogICAqLwogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpOwp9CgovKioKICogQSBbUGFyYW1ldGVyTWlycm9yXSByZWZsZWN0cyBhIERhcnQgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIFBhcmFtZXRlck1pcnJvciBpbXBsZW1lbnRzIFZhcmlhYmxlTWlycm9yIHsKICAvKioKICAgKiBBIG1pcnJvciBvbiB0aGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlci4KICAgKi8KICBUeXBlTWlycm9yIGdldCB0eXBlOwoKICAvKioKICAgKiBSZXR1cm5zIFs6dHJ1ZTpdIGlmIHRoZSByZWZsZWN0ZWUgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLgogICAqIE90aGVyd2lzZSByZXR1cm5zIFs6ZmFsc2U6XS4KICAgKi8KICBib29sIGdldCBpc09wdGlvbmFsOwoKICAvKioKICAgKiBSZXR1cm5zIFs6dHJ1ZTpdIGlmIHRoZSByZWZsZWN0ZWUgaXMgYSBuYW1lZCBwYXJhbWV0ZXIuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGlzTmFtZWQ7CgogIC8qKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIHJlZmxlY3RlZSBoYXMgZXhwbGljaXRseSBkZWNsYXJlZCBhIGRlZmF1bHQgdmFsdWUuCiAgICogT3RoZXJ3aXNlIHJldHVybnMgWzpmYWxzZTpdLgogICAqLwogIGJvb2wgZ2V0IGhhc0RlZmF1bHRWYWx1ZTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgICoKICAgKiBSZXR1cm5zIGFuIFtJbnN0YW5jZU1pcnJvcl0gb24gdGhlIChjb21waWxlLXRpbWUgY29uc3RhbnQpCiAgICogZGVmYXVsdCB2YWx1ZSBmb3IgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLgogICAqIElmIG5vIGRlZmF1bHQgdmFsdWUgaXMgZGVjbGFyZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYAogICAqIGFuZCBhIG1pcnJvciBvZiBgbnVsbGAgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBSZXR1cm5zIGBudWxsYCBmb3IgYSByZXF1aXJlZCBwYXJhbWV0ZXIuCiAgICovCiAgSW5zdGFuY2VNaXJyb3IgZ2V0IGRlZmF1bHRWYWx1ZTsKfQoKLyoqCiAqIEEgW1NvdXJjZUxvY2F0aW9uXSBkZXNjcmliZXMgdGhlIHNwYW4gb2YgYW4gZW50aXR5IGluIERhcnQgc291cmNlIGNvZGUuCiAqLwphYnN0cmFjdCBjbGFzcyBTb3VyY2VMb2NhdGlvbiB7CiAgLyoqCiAgICogVGhlIDEtYmFzZWQgbGluZSBudW1iZXIgZm9yIHRoaXMgc291cmNlIGxvY2F0aW9uLgogICAqCiAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgdGhlIGxpbmUgbnVtYmVyIGlzIHVua25vd24uCiAgICovCiAgaW50IGdldCBsaW5lOwoKICAvKioKICAgKiBUaGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyIGZvciB0aGlzIHNvdXJjZSBsb2NhdGlvbi4KICAgKgogICAqIEEgdmFsdWUgb2YgMCBtZWFucyB0aGF0IHRoZSBjb2x1bW4gbnVtYmVyIGlzIHVua25vd24uCiAgICovCiAgaW50IGdldCBjb2x1bW47CgogIC8qKgogICAqIFJldHVybnMgdGhlIFVSSSB3aGVyZSB0aGUgc291cmNlIG9yaWdpbmF0ZWQuCiAgICovCiAgVXJpIGdldCBzb3VyY2VVcmk7Cn0KCi8qKgogKiBDbGFzcyB1c2VkIGZvciBlbmNvZGluZyBjb21tZW50cyBhcyBtZXRhZGF0YSBhbm5vdGF0aW9ucy4KICovCmNsYXNzIENvbW1lbnQgewogIC8qKgogICAqIFRoZSBjb21tZW50IHRleHQgYXMgd3JpdHRlbiBpbiB0aGUgc291cmNlIHRleHQuCiAgICovCiAgZmluYWwgU3RyaW5nIHRleHQ7CgogIC8qKgogICAqIFRoZSBjb21tZW50IHRleHQgd2l0aG91dCB0aGUgc3RhcnQsIGVuZCwgYW5kIHBhZGRpbmcgdGV4dC4KICAgKgogICAqIEZvciBleGFtcGxlLCBpZiBbdGV4dF0gaXMgWzogLyoqIENvbW1lbnQgdGV4dC4gKi8gOl0gdGhlbiB0aGUgW3RyaW1tZWRUZXh0XQogICAqIGlzIFs6IENvbW1lbnQgdGV4dC4gOl0uCiAgICovCiAgZmluYWwgU3RyaW5nIHRyaW1tZWRUZXh0OwoKICAvKioKICAgKiBJcyBbOnRydWU6XSBpZiB0aGlzIGNvbW1lbnQgaXMgYSBkb2N1bWVudGF0aW9uIGNvbW1lbnQuCiAgICoKICAgKiBUaGF0IGlzLCB0aGF0IHRoZSBjb21tZW50IGlzIGVpdGhlciBlbmNsb3NlZCBpbiBbOiAvKiogLi4uICovIDpdIG9yIHN0YXJ0cwogICAqIHdpdGggWzogLy8vIDpdLgogICAqLwogIGZpbmFsIGJvb2wgaXNEb2NDb21tZW50OwoKICBjb25zdCBDb21tZW50KHRoaXMudGV4dCwgdGhpcy50cmltbWVkVGV4dCwgdGhpcy5pc0RvY0NvbW1lbnQpOwp9CgovKioKICogQW5ub3RhdGlvbiBkZXNjcmliaW5nIGhvdyAiZGFydDptaXJyb3JzIiBpcyB1c2VkIChFWFBFUklNRU5UQUwpLgogKgogKiBXaGVuIHVzZWQgYXMgbWV0YWRhdGEgb24gYW4gaW1wb3J0IG9mICJkYXJ0Om1pcnJvcnMiIGluIGxpYnJhcnkgKkwqLCB0aGlzCiAqIGNsYXNzIGRlc2NyaWJlcyBob3cgImRhcnQ6bWlycm9ycyIgaXMgdXNlZCBieSBsaWJyYXJ5ICpMKiB1bmxlc3Mgb3ZlcnJpZGRlbi4KICogU2VlIFtvdmVycmlkZV0uCiAqCiAqIFRoZSBmb2xsb3dpbmcgdGV4dCBpcyBub24tbm9ybWF0aXZlOgogKgogKiBJbiBzb21lIHNjZW5hcmlvcywgZm9yIGV4YW1wbGUsIHdoZW4gbWluaWZ5aW5nIERhcnQgY29kZSwgb3Igd2hlbiBnZW5lcmF0aW5nCiAqIEphdmFTY3JpcHQgY29kZSBmcm9tIGEgRGFydCBwcm9ncmFtLCB0aGUgc2l6ZSBhbmQgcGVyZm9ybWFuY2Ugb2YgdGhlIG91dHB1dAogKiBjYW4gc3VmZmVyIGZyb20gdXNlIG9mIHJlZmxlY3Rpb24uICBJbiB0aG9zZSBjYXNlcywgdGVsbGluZyB0aGUgY29tcGlsZXIKICogd2hhdCBpcyB1c2VkLCBjYW4gaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdC4KICoKICogRXhhbXBsZSB1c2FnZToKICoKICogICAgIEBNaXJyb3JzVXNlZChzeW1ib2xzOiAnZm9vJykKICogICAgIGltcG9ydCAnZGFydDptaXJyb3JzJzsKICoKICogICAgIGNsYXNzIEZvbyB7CiAqICAgICAgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICogICAgICAgICBwcmludChNaXJyb3JTeXN0ZW0uZ2V0TmFtZShpbnZvY2F0aW9uLm1lbWJlck5hbWUpKTsKICogICAgICAgfQogKiAgICAgfQogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgbmV3IEZvbygpLmZvbygpOyAvLyBQcmludHMgImZvbyIuCiAqICAgICAgIG5ldyBGb28oKS5iYXIoKTsgLy8gTWlnaHQgcHJpbnQgYW4gYXJiaXRyYXJ5IChtYW5nbGVkKSBuYW1lLCAiYmFyIi4KICogICAgIH0KICoKICogRm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIFtNaXJyb3JzVXNlZF0gY29uc3RydWN0b3IKICogc2VlIHRoZSBjb21tZW50cyBmb3IgW3N5bWJvbHNdLCBbdGFyZ2V0c10sIFttZXRhVGFyZ2V0c10gYW5kIFtvdmVycmlkZV0uCiAqCiAqIEFuIGltcG9ydCBvZiBgZGFydDptaXJyb3JzYCBtYXkgaGF2ZSBtdWx0aXBsZSBbTWlycm9yc1VzZWRdIGFubm90YXRpb25zLiBUaGlzCiAqIGlzIHBhcnRpY3VsYXJseSBoZWxwZnVsIHRvIHNwZWNpZnkgb3ZlcnJpZGVzIGZvciBzcGVjaWZpYyBsaWJyYXJpZXMuIEZvcgogKiBleGFtcGxlOgogKgogKiAgICAgQE1pcnJvcnNVc2VkKHRhcmdldHM6ICdmb28uQmFyJywgb3ZlcnJpZGU6ICdmb28nKQogKiAgICAgQE1pcnJvcnNVc2VkKHRhcmdldHM6ICdCYXInKQogKiAgICAgaW1wb3J0ICdkYXJ0Om1pcnJvcnMnOwogKgogKiB3aWxsIGVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgYEJhcmAgZnJvbSB0aGUgY3VycmVudCBsaWJyYXJ5IGFuZCBmcm9tIGxpYnJhcnkKICogYGZvb2AgaXMgYXZhaWxhYmxlIGZvciByZWZsZWN0aW9uLiBTZWUgYWxzbyBbb3ZlcnJpZGVdLgogKi8KQERlcHJlY2F0ZWQoIk5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4gV2lsbCBiZSByZW1vdmVkIGluIGEgbGF0ZXIgcmVsZWFzZS4iKQpjbGFzcyBNaXJyb3JzVXNlZCB7CiAgLy8gTm90ZTogdGhlIGZpZWxkcyBvZiB0aGlzIGNsYXNzIGFyZSB1bnR5cGVkLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBtb3N0CiAgLy8gY29udmVuaWVudCB3YXkgdG8gc3BlY2lmeSBzeW1ib2xzIHRvZGF5IGlzIHVzaW5nIGEgc2luZ2xlIHN0cmluZy4gSW4KICAvLyBzb21lIGNhc2VzLCBhIGNvbnN0IGxpc3Qgb2YgY2xhc3NlcyBtaWdodCBiZSBjb252ZW5pZW50LiBTb21lCiAgLy8gbWlnaHQgcHJlZmVyIHRvIHVzZSBhIGNvbnN0IGxpc3Qgb2Ygc3ltYm9scy4KCiAgLyoqCiAgICogVGhlIGxpc3Qgb2Ygc3RyaW5ncyBwYXNzZWQgdG8gbmV3IFtTeW1ib2xdLCBhbmQgc3ltYm9scyB0aGF0IG1pZ2h0IGJlCiAgICogcGFzc2VkIHRvIFtNaXJyb3JTeXN0ZW0uZ2V0TmFtZV0uCiAgICoKICAgKiBDb21iaW5lZCB3aXRoIHRoZSBuYW1lcyBvZiBbdGFyZ2V0c10sIFttZXRhVGFyZ2V0c10gYW5kIHRoZWlyIG1lbWJlcnMsCiAgICogdGhpcyBmb3JtcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdHJpbmdzIHBhc3NlZCB0byBuZXcgW1N5bWJvbF0sIGFuZAogICAqIHN5bWJvbHMgdGhhdCBtaWdodCBiZSBwYXNzZWQgdG8gW01pcnJvclN5c3RlbS5nZXROYW1lXSBieSB0aGUgbGlicmFyeSB0bwogICAqIHdoaWNoIHRoaXMgbWV0YWRhdGEgYXBwbGllcy4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgdGV4dCBpcyBub24tbm9ybWF0aXZlOgogICAqCiAgICogRGFydDJqcyBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBmb3JtYXRzIHRvIHNwZWNpZnkgc3ltYm9sczoKICAgKgogICAqICogQSBjb25zdGFudCBbTGlzdF0gb2YgW1N0cmluZ10gY29uc3RhbnRzIHJlcHJlc2VudGluZyBzeW1ib2wgbmFtZXMsCiAgICogICBlLmcuLCBgY29uc3QgWydmb28nLCAnYmFyJ11gLgogICAqICogQSBzaW5nbGUgW1N0cmluZ10gY29uc3RhbnQgd2hvc2UgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgogICAqICAgc3ltYm9sIG5hbWVzLCBlLmcuLCBgImZvbywgYmFyImAuCiAgICoKICAgKiBTcGVjaWZ5aW5nIHRoZSBgc3ltYm9sc2AgZmllbGQgdHVybnMgb2ZmIHRoZSBmb2xsb3dpbmcgd2FybmluZ3MgZW1pdHRlZCBieQogICAqIGRhcnQyanM6CiAgICoKICAgKiAqIFVzaW5nICJNaXJyb3JTeXN0ZW0uZ2V0TmFtZSIgbWF5IHJlc3VsdCBpbiBsYXJnZXIgb3V0cHV0LgogICAqICogVXNpbmcgIm5ldyBTeW1ib2wiIG1heSByZXN1bHQgaW4gbGFyZ2VyIG91dHB1dC4KICAgKgogICAqIEZvciBleGFtcGxlLCBpZiB5b3UncmUgdXNpbmcgW25vU3VjaE1ldGhvZF0gdG8gaW50ZXJhY3Qgd2l0aCBhIGRhdGFiYXNlLAogICAqIGV4dHJhY3QgYWxsIHRoZSBwb3NzaWJsZSBjb2x1bW4gbmFtZXMgYW5kIGluY2x1ZGUgdGhlbSBpbiB0aGlzIGxpc3QuCiAgICogU2ltaWxhcmx5LCBpZiB5b3UncmUgdXNpbmcgW25vU3VjaE1ldGhvZF0gdG8gaW50ZXJhY3Qgd2l0aCBhbm90aGVyCiAgICogbGFuZ3VhZ2UgKEphdmFTY3JpcHQsIGZvciBleGFtcGxlKSBleHRyYWN0IGFsbCB0aGUgaWRlbnRpZmllcnMgZnJvbSB0aGUKICAgKiBBUEkgeW91IHVzZSBhbmQgaW5jbHVkZSB0aGVtIGluIHRoaXMgbGlzdC4KICAgKgogICAqIE5vdGUgdGhhdCBzcGVjaWZ5aW5nIGEgc3ltYm9sIG9ubHkgZW5zdXJlcyB0aGF0IHRoZSBzeW1ib2wgd2lsbCBiZQogICAqIGF2YWlsYWJsZSB1bmRlciB0aGF0IG5hbWUgYXQgcnVudGltZS4gSXQgZG9lcyBub3QgbWFyayB0YXJnZXRzIHdpdGgKICAgKiB0aGF0IG5hbWUgYXMgYXZhaWxhYmxlIGZvciByZWZsZWN0aW9uLiBTZWUgW3RhcmdldHNdIGFuZCBbbWV0YVRhcmdldHNdCiAgICogZm9yIHRoYXQgcHVycG9zZS4KICAgKi8KICBmaW5hbCBzeW1ib2xzOwoKICAvKioKICAgKiBBIGxpc3Qgb2YgcmVmbGVjdGl2ZSB0YXJnZXRzLgogICAqCiAgICogQ29tYmluZWQgd2l0aCBbbWV0YVRhcmdldHNdLCB0aGlzIHByb3ZpZGVzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHJlZmxlY3RpdmUKICAgKiB0YXJnZXRzIHVzZWQgYnkgdGhlIGxpYnJhcnkgdG8gd2hpY2ggdGhpcyBtZXRhZGF0YSBhcHBsaWVzLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBGb3Igbm93LCB0aGVyZSBpcyBubyBmb3JtYWwgZGVzY3JpcHRpb24gb2Ygd2hhdCBhIHJlZmxlY3RpdmUgdGFyZ2V0IGlzLgogICAqIEluZm9ybWFsbHksIGEgdGFyZ2V0IGlzIGEgbGlicmFyeSwgYSBjbGFzcywgYSBtZXRob2Qgb3IgYSBmaWVsZC4KICAgKgogICAqIERhcnQyanMgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZm9ybWF0cyB0byBzcGVjaWZ5IHRhcmdldHM6CiAgICoKICAgKiAqIEEgY29uc3RhbnQgW0xpc3RdIGNvbnRhaW5pbmcgW1N0cmluZ10gY29uc3RhbnRzIHJlcHJlc2VudGluZyAocXVhbGlmaWVkKQogICAqICAgbmFtZXMgb2YgdGFyZ2V0cyBhbmQgRGFydCB0eXBlcy4KICAgKiAqIEEgc2luZ2xlIFtTdHJpbmddIGNvbnN0YW50IHdob3NlIHZhbHVlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiAgIChxdWFsaWZpZWQpIG5hbWVzLgogICAqICogQSBzaW5nbGUgRGFydCB0eXBlLgogICAqCiAgICogQSAocXVhbGlmaWVkKSBuYW1lIGlzIHJlc29sdmVkIHRvIGEgdGFyZ2V0IGFzIGZvbGxvd3M6CiAgICoKICAgKiAxLiBJZiB0aGUgcXVhbGlmaWVkIG5hbWUgbWF0Y2hlcyBhIGxpYnJhcnkgbmFtZSwgdGhlIG1hdGNoaW5nIGxpYnJhcnkgaXMKICAgKiAgICB0aGUgdGFyZ2V0LgogICAqIDIuIEVsc2UsIGZpbmQgdGhlIGxvbmdlc3QgcHJlZml4IG9mIHRoZSBuYW1lIHN1Y2ggdGhhdCB0aGUgcHJlZml4IGVuZHMKICAgKiAgICBqdXN0IGJlZm9yZSBhIGAuYCBhbmQgaXMgYSBsaWJyYXJ5IG5hbWUuCiAgICogMy4gVXNlIHRoYXQgbGlicmFyeSBhcyBjdXJyZW50IHNjb3BlLiBJZiBubyBtYXRjaGluZyBwcmVmaXggd2FzIGZvdW5kLCB1c2UKICAgKiAgICB0aGUgY3VycmVudCBsaWJyYXJ5LCBpLmUuLCB0aGUgbGlicmFyeSB3aGVyZSB0aGUgW01pcnJvcnNVc2VkXQogICAqICAgIGFubm90YXRpb24gd2FzIHBsYWNlZC4KICAgKiA0LiBTcGxpdCB0aGUgcmVtYWluaW5nIHN1ZmZpeCAodGhlIGVudGlyZSBuYW1lIGlmIG5vIGxpYnJhcnkgbmFtZSB3YXMKICAgKiAgICBmb3VuZCBpbiBzdGVwIDMpIGludG8gYSBsaXN0IG9mIFtTdHJpbmddIHVzaW5nIGAuYCBhcyBhCiAgICogICAgc2VwYXJhdG9yLgogICAqIDUuIFNlbGVjdCBhbGwgdGFyZ2V0cyBpbiB0aGUgY3VycmVudCBzY29wZSB3aG9zZSBuYW1lIG1hdGNoZXMgYSBbU3RyaW5nXQogICAqICAgIGZyb20gdGhlIGxpc3QuCiAgICoKICAgKiBGb3IgZXhhbXBsZToKICAgKgogICAqICAgICBsaWJyYXJ5IG15LmxpYnJhcnkub25lOwogICAqCiAgICogICAgIGNsYXNzIEEgewogICAqICAgICAgIHZhciBhRmllbGQ7CiAgICogICAgIH0KICAgKgogICAqICAgICBsaWJyYXJ5IG1haW47CiAgICoKICAgKiAgICAgQE1pcnJvcnNVc2VkKHRhcmdldHM6ICJteS5saWJyYXJ5Lm9uZS5BLmFGaWVsZCIpCiAgICogICAgIGltcG9ydCAiZGFydDptaXJyb3JzIjsKICAgKgogICAqIFRoZSBbTWlycm9yc1VzZWRdIGFubm90YXRpb24gc3BlY2lmaWVzIGBBYCBhbmQgYGFGaWVsZGAgZnJvbSBsaWJyYXJ5CiAgICogYG15LmxpYnJhcnkub25lYCBhcyB0YXJnZXRzLiBUaGlzIHdpbGwgbWFyayB0aGUgY2xhc3MgYEFgIGFzIGEgcmVmbGVjdGl2ZQogICAqIHRhcmdldC4gVGhlIHRhcmdldCBzcGVjaWZpY2F0aW9uIGZvciBgYUZpZWxkYCBoYXMgbm8gZWZmZWN0LCBhcyB0aGVyZSBpcwogICAqIG5vIHRhcmdldCBpbiBgbXkubGlicmFyeS5vbmVgIHdpdGggdGhhdCBuYW1lLgogICAqCiAgICogTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd2l0aGluIGEgdGFyZ2V0IGFsc28gaXMgYXZhaWxhYmxlIGZvciByZWZsZWN0aW9uLgogICAqIFNvLCBpZiBhIGxpYnJhcnkgaXMgc3BlY2lmaWVkIGFzIHRhcmdldCwgYWxsIGNsYXNzZXMgaW4gdGhhdCBsaWJyYXJ5CiAgICogYmVjb21lIHRhcmdldHMgZm9yIHJlZmxlY3Rpb24uIExpa2V3aXNlLCBpZiBhIGNsYXNzIGlzIGEgdGFyZ2V0LCBhbGwKICAgKiBpdHMgbWV0aG9kcyBhbmQgZmllbGRzIGJlY29tZSB0YXJnZXRzIGZvciByZWZsZWN0aW9uLiBBcyBhIGNvbnNlcXVlbmNlLAogICAqIGBhRmllbGRgIGluIHRoZSBhYm92ZSBleGFtcGxlIGlzIGFsc28gYSByZWZsZWN0aXZlIHRhcmdldC4KICAgKgogICAqLwogIGZpbmFsIHRhcmdldHM7CgogIC8qKgogICAqIEEgbGlzdCBvZiBjbGFzc2VzIHRoYXQgd2hlbiB1c2VkIGFzIG1ldGFkYXRhIGluZGljYXRlcyBhIHJlZmxlY3RpdmUKICAgKiB0YXJnZXQuIFNlZSBhbHNvIFt0YXJnZXRzXS4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgdGV4dCBpcyBub24tbm9ybWF0aXZlOgogICAqCiAgICogVGhlIGZvcm1hdCBmb3Igc3BlY2lmeWluZyB0aGUgbGlzdCBvZiBjbGFzc2VzIGlzIHRoZSBzYW1lIGFzIHVzZWQgZm9yCiAgICogc3BlY2lmeWluZyBbdGFyZ2V0c10uIEhvd2V2ZXIsIGFzIGEgbGlicmFyeSBjYW5ub3QgYmUgdXNlZCBhcyBhIG1ldGFkYXRhCiAgICogYW5ub3RhdGlvbiBpbiBEYXJ0LCBhZGRpbmcgYSBsaWJyYXJ5IHRvIHRoZSBsaXN0IG9mIFttZXRhVGFyZ2V0c10gaGFzIG5vCiAgICogZWZmZWN0LiBJbiBwYXJ0aWN1bGFyLCBhZGRpbmcgYSBsaWJyYXJ5IHRvIFttZXRhVGFyZ2V0c10gZG9lcyBub3QgbWFrZQogICAqIHRoZSBsaWJyYXJ5J3MgY2xhc3NlcyB2YWxpZCBtZXRhZGF0YSBhbm5vdGF0aW9ucyB0byBlbmFibGUgcmVmbGVjdGlvbi4KICAgKgogICAqIElmIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgc3BlY2lmaWVkIGluIFttZXRhVGFyZ2V0c10gaXMgdXNlZCBhcwogICAqIG1ldGFkYXRhIGFubm90YXRpb24gb24gYSBsaWJyYXJ5LCBjbGFzcywgZmllbGQgb3IgbWV0aG9kLCB0aGF0IGxpYnJhcnksCiAgICogY2xhc3MsIGZpZWxkIG9yICBtZXRob2QgaXMgYWRkZWQgdG8gdGhlIHNldCBvZiB0YXJnZXRzIGZvciByZWZsZWN0aW9uLgogICAqCiAgICogRXhhbXBsZSB1c2FnZToKICAgKgogICAqICAgICBsaWJyYXJ5IGV4YW1wbGU7CiAgICogICAgIEBNaXJyb3JzVXNlZChtZXRhVGFyZ2V0czogImV4YW1wbGUuUmVmbGVjdGFibGUiKQogICAqICAgICBpbXBvcnQgImRhcnQ6bWlycm9ycyI7CiAgICoKICAgKiAgICAgY2xhc3MgUmVmbGVjdGFibGUgewogICAqICAgICAgIGNvbnN0IFJlZmxlY3RhYmxlKCk7CiAgICogICAgIH0KICAgKgogICAqICAgICBjbGFzcyBGb28gewogICAqICAgICAgIEBSZWZsZWN0YWJsZSgpCiAgICogICAgICAgcmVmbGVjdGFibGVNZXRob2QoKSB7IC4uLiB9CiAgICoKICAgKiAgICAgICBub25SZWZsZWN0YWJsZU1ldGhvZCgpIHsgLi4uIH0KICAgKiAgICAgfQogICAqCiAgICogSW4gdGhlIGFib3ZlIGV4YW1wbGUuIGByZWZsZWN0YWJsZU1ldGhvZGAgaXMgbWFya2VkIGFzIHJlZmxlY3RhYmxlIGJ5CiAgICogdXNpbmcgdGhlIGBSZWZsZWN0YWJsZWAgY2xhc3MsIHdoaWNoIGluIHR1cm4gaXMgc3BlY2lmaWVkIGluIHRoZQogICAqIFttZXRhVGFyZ2V0c10gYW5ub3RhdGlvbi4KICAgKgogICAqIFRoZSBtZXRob2QgYG5vblJlZmxlY3RhYmxlTWV0aG9kYCBsYWNrcyBhIG1ldGFkYXRhIGFubm90YXRpb24gYW5kIHRodXMKICAgKiB3aWxsIG5vdCBiZSByZWZsZWN0YWJsZSBhdCBydW50aW1lLgogICAqLwogIGZpbmFsIG1ldGFUYXJnZXRzOwoKICAvKioKICAgKiBBIGxpc3Qgb2YgbGlicmFyeSBuYW1lcyBvciAiKiIuCiAgICoKICAgKiBXaGVuIHVzZWQgYXMgbWV0YWRhdGEgb24gYW4gaW1wb3J0IG9mICJkYXJ0Om1pcnJvcnMiLCB0aGlzIG1ldGFkYXRhIGRvZXMKICAgKiBub3QgYXBwbHkgdG8gdGhlIGxpYnJhcnkgaW4gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgdXNlZCwgYnV0IGluc3RlYWQKICAgKiBhcHBsaWVzIHRvIHRoZSBvdGhlciBsaWJyYXJpZXMgKGFsbCBsaWJyYXJpZXMgaWYgIioiIGlzIHVzZWQpLgogICAqCiAgICogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIG5vbi1ub3JtYXRpdmU6CiAgICoKICAgKiBEYXJ0MmpzIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGZvcm1hdHMgdG8gc3BlY2lmeSBsaWJyYXJpZXM6CiAgICoKICAgKiAqIEEgY29uc3RhbnQgW0xpc3RdIGNvbnRhaW5pbmcgW1N0cmluZ10gY29uc3RhbnRzIHJlcHJlc2VudGluZyBuYW1lcyBvZgogICAqICAgbGlicmFyaWVzLgogICAqICogQSBzaW5nbGUgW1N0cmluZ10gY29uc3RhbnQgd2hvc2UgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgogICAqICAgbGlicmFyeSBuYW1lcy4KICAgKgogICAqIENvbmNlcHR1YWxseSwgYSBbTWlycm9yc1VzZWRdIGFubm90YXRpb24gd2l0aCBbb3ZlcnJpZGVdIGhhcyB0aGUgc2FtZQogICAqIGVmZmVjdCBhcyBwbGFjaW5nIHRoZSBhbm5vdGF0aW9uIGRpcmVjdGx5IG9uIHRoZSBpbXBvcnQgb2YgYGRhcnQ6bWlycm9yc2AKICAgKiBpbiBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIGxpYnJhcmllcy4gVGh1cywgaWYgdGhlIGxpYnJhcnkgaGFkIG5vCiAgICogW01pcnJvcnNVc2VkXSBhbm5vdGF0aW9uIGJlZm9yZSwgaXRzIHVuY29uZGl0aW9uYWwgaW1wb3J0IG9mCiAgICogYGRhcnQ6bWlycm9yc2AgaXMgb3ZlcnJpZGRlbiBieSBhbiBhbm5vdGF0ZWQgaW1wb3J0LgogICAqCiAgICogTm90ZSB0aGF0LCBsaWtlIG11bHRpcGxlIGV4cGxpY2l0IFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbnMsIHVzaW5nCiAgICogb3ZlcnJpZGUgb24gYSBsaWJyYXJ5IHdpdGggYW4gZXhpc3RpbmcgW01pcnJvcnNVc2VkXSBhbm5vdGF0aW9uIGlzCiAgICogYWRkaXRpdmUuIFRoYXQgaXMsIHRoZSBvdmVyYWxsIHNldCBvZiByZWZsZWN0aXZlIHRhcmdldHMgaXMgdGhlIHVuaW9uCiAgICogb2YgdGhlIHJlZmxlY3RpdmUgdGFyZ2V0cyB0aGF0IGFyaXNlIGZyb20gdGhlIG9yaWdpbmFsIGFuZCB0aGUKICAgKiBvdmVycmlkaW5nIFtNaXJyb3JzVXNlZF0gYW5ub3RhdGlvbnMuCiAgICoKICAgKiBUaGUgdXNlIG9mIFtvdmVycmlkZV0gaXMgb25seSBtZWFuaW5nZnVsIGZvciBsaWJyYXJpZXMgdGhhdCBoYXZlIGFuCiAgICogaW1wb3J0IG9mIGBkYXJ0Om1pcnJvcnNgIHdpdGhvdXQgYW5ub3RhdGlvbiBiZWNhdXNlIG90aGVyd2lzZSBpdCB3b3VsZAogICAqIHdvcmsgZXhhY3RseSB0aGUgc2FtZSB3YXkgd2l0aG91dCB0aGUgW292ZXJyaWRlXSBwYXJhbWV0ZXIuCiAgICoKICAgKiBXaGlsZSB0aGUgYW5ub3RhdGlvbiB3aWxsIGFwcGx5IHRvIHRoZSBnaXZlbiB0YXJnZXQgbGlicmFyaWVzLCB0aGUKICAgKiBbc3ltYm9sc10sIFt0YXJnZXRzXSBhbmQgW21ldGFUYXJnZXRzXSBhcmUgc3RpbGwgZXZhbHVhdGVkIGluIHRoZQogICAqIHNjb3BlIG9mIHRoZSBhbm5vdGF0aW9uLiBUaHVzLCB0byBzZWxlY3QgYSB0YXJnZXQgZnJvbSBsaWJyYXJ5IGBmb29gLAogICAqIGEgcXVhbGlmaWVkIG5hbWUgaGFzIHRvIGJlIHVzZWQgb3IsIGlmIHRoZSB0YXJnZXQgaXMgdmlzaWJsZSBpbiB0aGUKICAgKiBjdXJyZW50IHNjb3BlLCBpdHMgdHlwZSBtYXkgYmUgcmVmZXJlbmNlZC4KICAgKgogICAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgbWFya3MgYWxsIHRhcmdldHMgaW4gdGhlIGxpYnJhcnkgYGZvb2AKICAgKiBhcyByZWZsZWN0YWJsZSB0aGF0IGhhdmUgYSBtZXRhZGF0YSBhbm5vdGF0aW9uIHVzaW5nIHRoZSBgUmVmbGVjdGFibGVgCiAgICogY2xhc3MgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LgogICAqCiAgICogICAgIEBNaXJyb3JzVXNlZChtZXRhVGFyZ2V0czogImZvby5SZWZsZWN0YWJsZSIsIG92ZXJyaWRlOiAiZm9vIikKICAgKgogICAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCByZXF1aXJlIHRoZSB1c2Ugb2YgdGhlIGBSZWZsZWN0YWJsZWAKICAgKiBjbGFzcyBmcm9tIHRoZSBjdXJyZW50IGxpYnJhcnksIGluc3RlYWQuCiAgICoKICAgKiAgICAgQE1pcnJvcnNVc2VkKG1ldGFUYXJnZXRzOiAiUmVmbGVjdGFibGUiLCBvdmVycmlkZTogImZvbyIpCiAgICoKICAgKi8KICBmaW5hbCBvdmVycmlkZTsKCiAgLyoqCiAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBbTWlycm9yc1VzZWQuc3ltYm9sc10sIFtNaXJyb3JzVXNlZC50YXJnZXRzXSwKICAgKiBbTWlycm9yc1VzZWQubWV0YVRhcmdldHNdIGFuZCBbTWlycm9yc1VzZWQub3ZlcnJpZGVdIGZvciBkb2N1bWVudGF0aW9uCiAgICogb2YgdGhlIHBhcmFtZXRlcnMuCiAgICovCiAgY29uc3QgTWlycm9yc1VzZWQoCiAgICAgIHt0aGlzLnN5bWJvbHMsIHRoaXMudGFyZ2V0cywgdGhpcy5tZXRhVGFyZ2V0cywgdGhpcy5vdmVycmlkZX0pOwp9CoW9AE5OPAE+Rh0DEgM8RS4B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Y2xhc3MgX01pcnJvclJlZmVyZW5jZSB7CiAgZmFjdG9yeSBfTWlycm9yUmVmZXJlbmNlLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJjbGFzcyBfTWlycm9yUmVmZXJlbmNlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIG5hdGl2ZSAiTWlycm9yUmVmZXJlbmNlX2VxdWFscyI7Cn0KEABOTjwBIQEaGS9RBAE7AgEoZGFydDptaXJyb3JzLXBhdGNoL21pcnJvcl9yZWZlcmVuY2UuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvcHJvZmlsZXIvcHJvZmlsZXIuZGFydIGJLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBQbGVhc2Ugc2VlICdkYXJ0OmRldmVsb3BlcicuCkBEZXByZWNhdGVkKCJEYXJ0IFNESyAxLjEyIikKbGlicmFyeSBkYXJ0LnByb2ZpbGVyOwoKZXhwb3J0ICdkYXJ0OmRldmVsb3BlcicKICAgIHNob3cgZ2V0Q3VycmVudFRhZywgQ291bnRlciwgR2F1Z2UsIE1ldHJpYywgTWV0cmljcywgVXNlclRhZzsKDABOTjwBIR0XARhCAQ1kYXJ0OnByb2ZpbGVyNm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi90eXBlZF9kYXRhL3R5cGVkX2RhdGEuZGFydMABLsEvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8vIExpc3RzIHRoYXQgZWZmaWNpZW50bHkgaGFuZGxlIGZpeGVkIHNpemVkIGRhdGEKLy8vIChmb3IgZXhhbXBsZSwgdW5zaWduZWQgOCBieXRlIGludGVnZXJzKSBhbmQgU0lNRCBudW1lcmljIHR5cGVzLgovLy8KLy8vIFRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlOgovLy8KLy8vICAgICBpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7Ci8vLwovLy8ge0BjYXRlZ29yeSBDb3JlfQpsaWJyYXJ5IGRhcnQudHlwZWRfZGF0YTsKCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIHNob3cgVW5tb2RpZmlhYmxlTGlzdEJhc2U7CgpwYXJ0ICJ1bm1vZGlmaWFibGVfdHlwZWRfZGF0YS5kYXJ0IjsKCi8qKgogKiBBIHNlcXVlbmNlIG9mIGJ5dGVzIHVuZGVybHlpbmcgYSB0eXBlZCBkYXRhIG9iamVjdC4KICoKICogVXNlZCB0byBwcm9jZXNzIGxhcmdlIHF1YW50aXRpZXMgb2YgYmluYXJ5IG9yIG51bWVyaWNhbCBkYXRhCiAqIG1vcmUgZWZmaWNpZW50bHkgdXNpbmcgYSB0eXBlZCB2aWV3LgogKi8KYWJzdHJhY3QgY2xhc3MgQnl0ZUJ1ZmZlciB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgYnl0ZSBidWZmZXIsIGluIGJ5dGVzLgogICAqLwogIGludCBnZXQgbGVuZ3RoSW5CeXRlczsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50OExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBVaW50OExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSBhbmQgY29udGFpbnMgW2xlbmd0aF0gYnl0ZXMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIHJhbmdlIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIFVpbnQ4TGlzdCBhc1VpbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50OExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBJbnQ4TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdIGFuZCBjb250YWlucyBbbGVuZ3RoXSBieXRlcy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgcmFuZ2Ugb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgSW50OExpc3QgYXNJbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhDbGFtcGVkTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYFVpbnQ4Q2xhbXBlZExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSBhbmQgY29udGFpbnMgW2xlbmd0aF0gYnl0ZXMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIHJhbmdlIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIFVpbnQ4Q2xhbXBlZExpc3QgYXNVaW50OENsYW1wZWRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MTZMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgVWludDE2TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDE2LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAxNi1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZXZlbiwgdGhlIGxhc3QgYnl0ZSBjYW4ndCBiZSBwYXJ0IG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDE2LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHR3bywKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogMmAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBVaW50MTZMaXN0IGFzVWludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MTZMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgSW50MTZMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMTYtYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDE2LWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBldmVuLCB0aGUgbGFzdCBieXRlIGNhbid0IGJlIHBhcnQgb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgMTYtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgdHdvLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiAyYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEludDE2TGlzdCBhc0ludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDMyTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYFVpbnQzMkxpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gMzItYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSBmb3VyLCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgMzItYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZm91ciwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogNGAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBVaW50MzJMaXN0IGFzVWludDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50MzJMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgSW50MzJMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMzItYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDMyLWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgZm91ciwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDMyLWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGZvdXIsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDRgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgSW50MzJMaXN0IGFzSW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50NjRMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgVWludDY0TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSA2NC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgNjQtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZWlnaHQsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgVWludDY0TGlzdCBhc1VpbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDY0TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEludDY0TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSA2NC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgNjQtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZWlnaHQsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgSW50NjRMaXN0IGFzSW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMng0TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEludDMyeDRMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMTI4LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSAxMjgtYml0IGludGVnZXJzLgogICAqIElmIFtsZW5ndGhdIGlzIG9taXR0ZWQsIHRoZSByYW5nZSBleHRlbmRzIGFzIGZhciB0b3dhcmRzIHRoZSBlbmQgb2YKICAgKiB0aGUgYnVmZmVyIGFzIHBvc3NpYmxlIC0KICAgKiBpZiBbbGVuZ3RoSW5CeXRlc10gaXMgbm90IGRpdmlzaWJsZSBieSAxNiwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDEyOC1iaXQgYWxpZ25lZCByYW5nZQogICAqIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IGJlIGRpdmlzaWJsZSBieSBzaXh0ZWVuLAogICAqICogYGxlbmd0aGAgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGFuZAogICAqICogYG9mZnNldEluQnl0ZXMgKyBsZW5ndGggKiAxNmAgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIFtsZW5ndGhJbkJ5dGVzXS4KICAgKi8KICBJbnQzMng0TGlzdCBhc0ludDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEZsb2F0MzJMaXN0YCB3aWxsIGFsc28gY2hhbmdlIHRoZSBidWZmZXIsCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICoKICAgKiBUaGUgdmlld2VkIHJlZ2lvbiBzdGFydCBhdCBbb2Zmc2V0SW5CeXRlc10sIHdoaWNoIG11c3QgYmUgMzItYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDMyLWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgZm91ciwgdGhlIGxhc3QgYnl0ZXMgY2FuJ3QgYmUgcGFydAogICAqIG9mIHRoZSB2aWV3LgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIDMyLWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGZvdXIsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDRgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgRmxvYXQzMkxpc3QgYXNGbG9hdDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NExpc3RdIF92aWV3XyBvZiBhIHJlZ2lvbiBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhlIHZpZXcgaXMgYmFja2VkIGJ5IHRoZSBieXRlcyBvZiB0aGlzIGJ5dGUgYnVmZmVyLgogICAqIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGBGbG9hdDY0TGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLAogICAqIGFuZCBjb250YWlucyBbbGVuZ3RoXSA2NC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgNjQtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgZWlnaHQsCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDhgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgRmxvYXQ2NExpc3QgYXNGbG9hdDY0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQzMng0TGlzdF0gX3ZpZXdfIG9mIGEgcmVnaW9uIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmlldyBpcyBiYWNrZWQgYnkgdGhlIGJ5dGVzIG9mIHRoaXMgYnl0ZSBidWZmZXIuCiAgICogQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgYEZsb2F0MzJ4NExpc3RgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSwgd2hpY2ggbXVzdCBiZSAxMjgtYml0IGFsaWduZWQsCiAgICogYW5kIGNvbnRhaW5zIFtsZW5ndGhdIDEyOC1iaXQgaW50ZWdlcnMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgYXMgZmFyIHRvd2FyZHMgdGhlIGVuZCBvZgogICAqIHRoZSBidWZmZXIgYXMgcG9zc2libGUgLQogICAqIGlmIFtsZW5ndGhJbkJ5dGVzXSBpcyBub3QgZGl2aXNpYmxlIGJ5IDE2LCB0aGUgbGFzdCBieXRlcyBjYW4ndCBiZSBwYXJ0CiAgICogb2YgdGhlIHZpZXcuCiAgICoKICAgKiBUaGUgc3RhcnQgaW5kZXggYW5kIGxlbmd0aCBtdXN0IGRlc2NyaWJlIGEgdmFsaWQgMTI4LWJpdCBhbGlnbmVkIHJhbmdlCiAgICogb2YgdGhlIGJ1ZmZlcjoKICAgKgogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLAogICAqICogYG9mZnNldEluQnl0ZXNgIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHNpeHRlZW4sCiAgICogKiBgbGVuZ3RoYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwgYW5kCiAgICogKiBgb2Zmc2V0SW5CeXRlcyArIGxlbmd0aCAqIDE2YCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEZsb2F0MzJ4NExpc3QgYXNGbG9hdDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgRmxvYXQ2NHgyTGlzdGAgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYnVmZmVyLAogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqCiAgICogVGhlIHZpZXdlZCByZWdpb24gc3RhcnQgYXQgW29mZnNldEluQnl0ZXNdLCB3aGljaCBtdXN0IGJlIDEyOC1iaXQgYWxpZ25lZCwKICAgKiBhbmQgY29udGFpbnMgW2xlbmd0aF0gMTI4LWJpdCBpbnRlZ2Vycy4KICAgKiBJZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLCB0aGUgcmFuZ2UgZXh0ZW5kcyBhcyBmYXIgdG93YXJkcyB0aGUgZW5kIG9mCiAgICogdGhlIGJ1ZmZlciBhcyBwb3NzaWJsZSAtCiAgICogaWYgW2xlbmd0aEluQnl0ZXNdIGlzIG5vdCBkaXZpc2libGUgYnkgMTYsIHRoZSBsYXN0IGJ5dGVzIGNhbid0IGJlIHBhcnQKICAgKiBvZiB0aGUgdmlldy4KICAgKgogICAqIFRoZSBzdGFydCBpbmRleCBhbmQgbGVuZ3RoIG11c3QgZGVzY3JpYmUgYSB2YWxpZCAxMjgtYml0IGFsaWduZWQgcmFuZ2UKICAgKiBvZiB0aGUgYnVmZmVyOgogICAqCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBub3QgYmUgbmVnYXRpdmUsCiAgICogKiBgb2Zmc2V0SW5CeXRlc2AgbXVzdCBiZSBkaXZpc2libGUgYnkgc2l4dGVlbiwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoICogMTZgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBbbGVuZ3RoSW5CeXRlc10uCiAgICovCiAgRmxvYXQ2NHgyTGlzdCBhc0Zsb2F0NjR4Mkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0J5dGVEYXRhXSBfdmlld18gb2YgYSByZWdpb24gb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRoZSB2aWV3IGlzIGJhY2tlZCBieSB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIGJ1ZmZlci4KICAgKiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBgQnl0ZURhdGFgIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGJ1ZmZlciwKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKgogICAqIFRoZSB2aWV3ZWQgcmVnaW9uIHN0YXJ0IGF0IFtvZmZzZXRJbkJ5dGVzXSBhbmQgY29udGFpbnMgW2xlbmd0aF0gYnl0ZXMuCiAgICogSWYgW2xlbmd0aF0gaXMgb21pdHRlZCwgdGhlIHJhbmdlIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogICAqCiAgICogVGhlIHN0YXJ0IGluZGV4IGFuZCBsZW5ndGggbXVzdCBkZXNjcmliZSBhIHZhbGlkIHJhbmdlIG9mIHRoZSBidWZmZXI6CiAgICoKICAgKiAqIGBvZmZzZXRJbkJ5dGVzYCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSwKICAgKiAqIGBsZW5ndGhgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBhbmQKICAgKiAqIGBvZmZzZXRJbkJ5dGVzICsgbGVuZ3RoYCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gW2xlbmd0aEluQnl0ZXNdLgogICAqLwogIEJ5dGVEYXRhIGFzQnl0ZURhdGEoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwp9CgovKioKICogQSB0eXBlZCB2aWV3IG9mIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuCiAqLwphYnN0cmFjdCBjbGFzcyBUeXBlZERhdGEgewogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBlbGVtZW50IGluIHRoaXMKICAgKiBsaXN0LgogICAqLwogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgdW5kZXJseWluZyBieXRlIGJ1ZmZlciBvZiB0aGlzIHZpZXcuCiAgICovCiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyB2aWV3LCBpbiBieXRlcy4KICAgKi8KICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXM7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGJ5dGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KICAgKi8KICBCeXRlQnVmZmVyIGdldCBidWZmZXI7Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlZEludExpc3QgZXh0ZW5kcyBUeXBlZERhdGEgewogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgb3RoZXIgaXMgYWxzbyBhIHR5cGVkLWRhdGEgaW50ZWdlciBsaXN0LCB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsCiAgICogYmUgYSB0eXBlLWRhdGEgaW50ZWdlciBsaXN0IGNhcGFibGUgb2YgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIG9mCiAgICogdGhpcyBsaXN0IGFuZCBvZiBbb3RoZXJdLgogICAqIE90aGVyd2lzZSB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIGEgbm9ybWFsIGdyb3dhYmxlIGBMaXN0PGludD5gLgogICAqLwogIExpc3Q8aW50PiBvcGVyYXRvciArKExpc3Q8aW50PiBvdGhlcik7Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlZEZsb2F0TGlzdCBleHRlbmRzIFR5cGVkRGF0YSB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIGxpc3QgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBJZiBvdGhlciBpcyBhbHNvIGEgdHlwZWQtZGF0YSBmbG9hdGluZyBwb2ludCBudW1iZXIgbGlzdCwKICAgKiB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIGEgdHlwZS1kYXRhIGZsb2F0IGxpc3QgY2FwYWJsZSBvZiBjb250YWluaW5nCiAgICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgYW5kIG9mIFtvdGhlcl0uCiAgICogT3RoZXJ3aXNlIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgYSBub3JtYWwgZ3Jvd2FibGUgYExpc3Q8ZG91YmxlPmAuCiAgICovCiAgTGlzdDxkb3VibGU+IG9wZXJhdG9yICsoTGlzdDxkb3VibGU+IG90aGVyKTsKfQoKLyoqCiAqIERlc2NyaWJlcyBlbmRpYW5uZXNzIHRvIGJlIHVzZWQgd2hlbiBhY2Nlc3Npbmcgb3IgdXBkYXRpbmcgYQogKiBzZXF1ZW5jZSBvZiBieXRlcy4KICovCmNsYXNzIEVuZGlhbiB7CiAgZmluYWwgYm9vbCBfbGl0dGxlRW5kaWFuOwogIGNvbnN0IEVuZGlhbi5fKHRoaXMuX2xpdHRsZUVuZGlhbik7CgogIHN0YXRpYyBjb25zdCBFbmRpYW4gYmlnID0gY29uc3QgRW5kaWFuLl8oZmFsc2UpOwogIHN0YXRpYyBjb25zdCBFbmRpYW4gbGl0dGxlID0gY29uc3QgRW5kaWFuLl8odHJ1ZSk7CiAgc3RhdGljIGZpbmFsIEVuZGlhbiBob3N0ID0KICAgICAgKG5ldyBCeXRlRGF0YS52aWV3KG5ldyBVaW50MTZMaXN0LmZyb21MaXN0KFsxXSkuYnVmZmVyKSkuZ2V0SW50OCgwKSA9PSAxCiAgICAgICAgICA/IGxpdHRsZQogICAgICAgICAgOiBiaWc7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCwgcmFuZG9tLWFjY2VzcyBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGFsc28gcHJvdmlkZXMgcmFuZG9tCiAqIGFuZCB1bmFsaWduZWQgYWNjZXNzIHRvIHRoZSBmaXhlZC13aWR0aCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQKICogbnVtYmVycyByZXByZXNlbnRlZCBieSB0aG9zZSBieXRlcy4KICoKICogYEJ5dGVEYXRhYCBtYXkgYmUgdXNlZCB0byBwYWNrIGFuZCB1bnBhY2sgZGF0YSBmcm9tIGV4dGVybmFsIHNvdXJjZXMKICogKHN1Y2ggYXMgbmV0d29ya3Mgb3IgZmlsZXMgc3lzdGVtcyksIGFuZCB0byBwcm9jZXNzIGxhcmdlIHF1YW50aXRpZXMKICogb2YgbnVtZXJpY2FsIGRhdGEgbW9yZSBlZmZpY2llbnRseSB0aGFuIHdvdWxkIGJlIHBvc3NpYmxlCiAqIHdpdGggb3JkaW5hcnkgW0xpc3RdIGltcGxlbWVudGF0aW9ucy4KICogYEJ5dGVEYXRhYCBjYW4gc2F2ZSBzcGFjZSwgYnkgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIG9iamVjdCBoZWFkZXJzLAogKiBhbmQgdGltZSwgYnkgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGRhdGEgY29waWVzLgogKiBGaW5hbGx5LCBgQnl0ZURhdGFgIG1heSBiZSB1c2VkIHRvIGludGVudGlvbmFsbHkgcmVpbnRlcnByZXQgdGhlIGJ5dGVzCiAqIHJlcHJlc2VudGluZyBvbmUgYXJpdGhtZXRpYyB0eXBlIGFzIGFub3RoZXIuCiAqIEZvciBleGFtcGxlIHRoaXMgY29kZSBmcmFnbWVudCBkZXRlcm1pbmUgd2hhdCAzMi1iaXQgc2lnbmVkIGludGVnZXIKICogaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGJ5dGVzIG9mIGEgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcjoKICoKICogICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KDgpLmJ1ZmZlcjsKICogICAgIHZhciBiZGF0YSA9IG5ldyBCeXRlRGF0YS52aWV3KGJ1ZmZlcik7CiAqICAgICBiZGF0YS5zZXRGbG9hdDMyKDAsIDMuMDQpOwogKiAgICAgaW50IGh1aCA9IGJkYXRhLmdldEludDMyKDApOwogKi8KYWJzdHJhY3QgY2xhc3MgQnl0ZURhdGEgaW1wbGVtZW50cyBUeXBlZERhdGEgewogIC8qKgogICAqIENyZWF0ZXMgYSBbQnl0ZURhdGFdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGJ5dGVzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZXh0ZXJuYWwgZmFjdG9yeSBCeXRlRGF0YShpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbQnl0ZURhdGFdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtCeXRlRGF0YV0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICovCiAgZmFjdG9yeSBCeXRlRGF0YS52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0J5dGVEYXRhKG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGJ5dGUgYXQgdGhlCiAgICogc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKICAgKiByZXByZXNlbnRhdGlvbi4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIC0xMjggYW5kIDEyNywgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldEludDgoaW50IGJ5dGVPZmZzZXQpOwoKICAvKioKICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQogICAqIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwgd2hpY2gKICAgKiBtdXN0IGZpdCBpbiBhIHNpbmdsZSBieXRlLgogICAqCiAgICogSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBiZSBiZXR3ZWVuIC0xMjggYW5kIDEyNywgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQKICAgKiBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeSBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgMjU1LCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0VWludDgoaW50IGJ5dGVPZmZzZXQpOwoKICAvKioKICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQogICAqIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0CiAgICogaW4gYSBzaW5nbGUgYnl0ZS4KICAgKgogICAqIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLAogICAqIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIHZvaWQgc2V0VWludDgoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgdHdvIGJ5dGVzIGF0CiAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5CiAgICogZm9ybS4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIC0yPHN1cD4xNTwvc3VwPiBhbmQgMjxzdXA+MTU8L3N1cD4gLSAxLAogICAqIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldEludDE2KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKICAgKiBvYmplY3QgdG8gdGhlIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQKICAgKiBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdCBpbiB0d28gYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQogICAqIGJldHdlZW4gLTI8c3VwPjE1PC9zdXA+IGFuZCAyPHN1cD4xNTwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nCiAgICogYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeQogICAqIGZvcm0uCiAgICoKICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAwIGFuZCAgMjxzdXA+MTY8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDJgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGludCBnZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBTZXRzIHRoZSB0d28gYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QKICAgKiB0byB0aGUgdW5zaWduZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwKICAgKiB3aGljaCBtdXN0IGZpdCBpbiB0d28gYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KICAgKiAwIGFuZCAyPHN1cD4xNjwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBhdAogICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB0d28ncyBjb21wbGVtZW50IGJpbmFyeQogICAqIGZvcm0uCiAgICoKICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAtMjxzdXA+MzE8L3N1cD4gYW5kIDI8c3VwPjMxPC9zdXA+IC0gMSwKICAgKiBpbmNsdXNpdmUuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGludCBnZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwogICAqIG9iamVjdCB0byB0aGUgdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZAogICAqIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0IGluIGZvdXIgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQogICAqIGJldHdlZW4gLTI8c3VwPjMxPC9zdXA+IGFuZCAyPHN1cD4zMTwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBzdGFydGluZwogICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKICAgKiBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjMyPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZm91ciBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdAogICAqIHRvIHRoZSB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLAogICAqIHdoaWNoIG11c3QgZml0IGluIGZvdXIgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KICAgKiAwIGFuZCAyPHN1cD4zMjwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZWlnaHQgYnl0ZXMgYXQKICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKICAgKiBmb3JtLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gLTI8c3VwPjYzPC9zdXA+IGFuZCAyPHN1cD42Mzwvc3VwPiAtIDEsCiAgICogaW5jbHVzaXZlLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgZ2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBTZXRzIHRoZSBlaWdodCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzCiAgICogb2JqZWN0IHRvIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCiAgICogW3ZhbHVlXSwgd2hpY2ggbXVzdCBmaXQgaW4gZWlnaHQgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQogICAqIGJldHdlZW4gLTI8c3VwPjYzPC9zdXA+IGFuZCAyPHN1cD42Mzwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcKICAgKiBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdW5zaWduZWQgYmluYXJ5CiAgICogZm9ybS4KICAgKgogICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kICAyPHN1cD42NDwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgaW50IGdldFVpbnQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0CiAgICogdG8gdGhlIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sCiAgICogd2hpY2ggbXVzdCBmaXQgaW4gZWlnaHQgYnl0ZXMuCiAgICoKICAgKiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KICAgKiAwIGFuZCAyPHN1cD42NDwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBhdAogICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiBJRUVFIDc1NAogICAqIHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoYmluYXJ5MzIpLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCiAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KICAgKi8KICBkb3VibGUgZ2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSk7CgogIC8qKgogICAqIFNldHMgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwogICAqIG9iamVjdCB0byB0aGUgSUVFRSA3NTQgc2luZ2xlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKICAgKiAoYmluYXJ5MzIpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXS4KICAgKgogICAqICoqTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBsb3NlIHByZWNpc2lvbi4qKiBUaGUgaW5wdXQgW3ZhbHVlXSBpcwogICAqIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byAzMi1iaXQKICAgKiBmbG9hdGluZyBwb2ludCB2YWx1ZSBieSBJRUVFIDc1NCByb3VuZGluZyBydWxlcyBiZWZvcmUgaXQgaXMgc3RvcmVkLgogICAqIElmIFt2YWx1ZV0gY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBiaW5hcnkzMiwgaXQgd2lsbCBiZQogICAqIGNvbnZlcnRlZCB0byB0aGUgbmVhcmVzdCBiaW5hcnkzMiB2YWx1ZS4gIElmIHR3byBiaW5hcnkzMiB2YWx1ZXMgYXJlCiAgICogZXF1YWxseSBjbG9zZSwgdGhlIG9uZSB3aG9zZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaXMgemVybyB3aWxsIGJlIHVzZWQuCiAgICogTm90ZSB0aGF0IGZpbml0ZSAoYnV0IGxhcmdlKSB2YWx1ZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBpbmZpbml0eSwgYW5kCiAgICogc21hbGwgbm9uLXplcm8gdmFsdWVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gemVyby4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRGbG9hdDMyKGludCBieXRlT2Zmc2V0LCBkb3VibGUgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGVpZ2h0IGJ5dGVzIGF0CiAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIElFRUUgNzU0CiAgICogZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQgZm9ybWF0IChiaW5hcnk2NCkuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgogICAqLwogIGRvdWJsZSBnZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwogICAqIG9iamVjdCB0byB0aGUgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKICAgKiAoYmluYXJ5NjQpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXS4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgogICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCiAgICovCiAgdm9pZCBzZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBkb3VibGUgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiA4LWJpdCBzaWduZWQgaW50ZWdlcnMuCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgZWlnaHQgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgOC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAtMTI4IHRvICsxMjcuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnQ4TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50OExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEludDhMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDhMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIFtJbnQ4TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0ludDhMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKi8KICBmYWN0b3J5IEludDhMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzSW50OExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMTsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgOC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgZWlnaHQgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgOC1iaXQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgMCB0byAyNTUuCiAqLwphYnN0cmFjdCBjbGFzcyBVaW50OExpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50OExpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50OExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50OExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtVaW50OExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQogICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqLwogIGZhY3RvcnkgVWludDhMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzVWludDhMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIGxpc3QgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBJZiBbb3RoZXJdIGlzIGFsc28gYSB0eXBlZC1kYXRhIGxpc3QsIHRoZW4gdGhlIHJldHVybiBsaXN0IHdpbGwgYmUgYQogICAqIHR5cGVkIGRhdGEgbGlzdCBjYXBhYmxlIG9mIGhvbGRpbmcgYm90aCB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycyBhbmQKICAgKiB0aGUgZWxlbWVudHMgb2YgW290aGVyXSwgb3RoZXJ3aXNlIGl0J2xsIGJlIGEgbm9ybWFsIGxpc3Qgb2YgaW50ZWdlcnMuCiAgICovCiAgTGlzdDxpbnQ+IG9wZXJhdG9yICsoTGlzdDxpbnQ+IG90aGVyKTsKCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAxOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQogKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqCiAqIEludGVnZXJzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgY2xhbXBlZCB0byBhbiB1bnNpZ25lZCBlaWdodCBiaXQgdmFsdWUuCiAqIFRoYXQgaXMsIGFsbCB2YWx1ZXMgYmVsb3cgemVybyBhcmUgc3RvcmVkIGFzIHplcm8KICogYW5kIGFsbCB2YWx1ZXMgYWJvdmUgMjU1IGFyZSBzdG9yZWQgYXMgMjU1LgogKi8KYWJzdHJhY3QgY2xhc3MgVWludDhDbGFtcGVkTGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50OENsYW1wZWRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50OENsYW1wZWRMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQ4Q2xhbXBlZExpc3RdIG9mIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10KICAgKiBsaXN0IGFuZCBjb3BpZXMgb3ZlciB0aGUgdmFsdWVzIGNsYW1waW5nIHdoZW4gbmVlZGVkLgogICAqCiAgICogVmFsdWVzIGFyZSBjbGFtcGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgY2xhbXBzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50OENsYW1wZWRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDhDbGFtcGVkTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIHRoZQogICAqIHNwZWNpZmllZCBieXRlIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW1VpbnQ4TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlIGJ1ZmZlcgogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICovCiAgZmFjdG9yeSBVaW50OENsYW1wZWRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzVWludDhDbGFtcGVkTGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAxOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAxNi1iaXQgc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQogKiBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQogKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqCiAqIEludGVnZXJzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgdHJ1bmNhdGVkIHRvIHRoZWlyIGxvdyAxNiBiaXRzLAogKiBpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCAxNi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAtMzI3NjggdG8gKzMyNzY3LgogKi8KYWJzdHJhY3QgY2xhc3MgSW50MTZMaXN0IGltcGxlbWVudHMgTGlzdDxpbnQ+LCBfVHlwZWRJbnRMaXN0IHsKICAvKioKICAgKiBDcmVhdGVzIGFuIFtJbnQxNkxpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEludDE2TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQxNkxpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVmFsdWVzIGFyZSB0cnVuY2F0ZWQgdG8gZml0IGluIHRoZSBsaXN0IHdoZW4gdGhleSBhcmUgY29waWVkLAogICAqIHRoZSBzYW1lIHdheSBzdG9yaW5nIHZhbHVlcyB0cnVuY2F0ZXMgdGhlbS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEludDE2TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIFtJbnQxNkxpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtJbnQxNkxpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQogICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IEludDE2TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0ludDE2TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAyOwp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IDE2IGJpdHMsCiAqIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAwIHRvIDY1NTM1LgogKi8KYWJzdHJhY3QgY2xhc3MgVWludDE2TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MTZMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwKICAgKiBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50MTZMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW1VpbnQxNkxpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVmFsdWVzIGFyZSB0cnVuY2F0ZWQgdG8gZml0IGluIHRoZSBsaXN0IHdoZW4gdGhleSBhcmUgY29waWVkLAogICAqIHRoZSBzYW1lIHdheSBzdG9yaW5nIHZhbHVlcyB0cnVuY2F0ZXMgdGhlbS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFVpbnQxNkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MTZMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4KICAgKiB0aGUgc3BlY2lmaWVkIGJ5dGUgYnVmZmVyLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW1VpbnQxNkxpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZSBidWZmZXIKICAgKiBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IFVpbnQxNkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNVaW50MTZMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDI7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDMyLWJpdCBzaWduZWQgaW50ZWdlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCiAqIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5CiAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICoKICogSW50ZWdlcnMgc3RvcmVkIGluIHRoZSBsaXN0IGFyZSB0cnVuY2F0ZWQgdG8gdGhlaXIgbG93IDMyIGJpdHMsCiAqIGludGVycHJldGVkIGFzIGEgc2lnbmVkIDMyLWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgd2l0aCB2YWx1ZXMgaW4gdGhlCiAqIHJhbmdlIC0yMTQ3NDgzNjQ4IHRvIDIxNDc0ODM2NDcuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnQzMkxpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYW4gW0ludDMyTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCiAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50MzJMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDMyTGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICoKICAgKiBWYWx1ZXMgYXJlIHRydW5jYXRlZCB0byBmaXQgaW4gdGhlIGxpc3Qgd2hlbiB0aGV5IGFyZSBjb3BpZWQsCiAgICogdGhlIHNhbWUgd2F5IHN0b3JpbmcgdmFsdWVzIHRydW5jYXRlcyB0aGVtLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgSW50MzJMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gW0ludDMyTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0ludDMyTGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgSW50MzJMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzSW50MzJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDQ7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBJbnRlZ2VycyBzdG9yZWQgaW4gdGhlIGxpc3QgYXJlIHRydW5jYXRlZCB0byB0aGVpciBsb3cgMzIgYml0cywKICogaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgd2l0aCB2YWx1ZXMgaW4gdGhlCiAqIHJhbmdlIDAgdG8gNDI5NDk2NzI5NS4KICovCmFic3RyYWN0IGNsYXNzIFVpbnQzMkxpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDMyTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsCiAgICogb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDMyTGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50MzJMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50MzJMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDMyTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluCiAgICogdGhlIHNwZWNpZmllZCBieXRlIGJ1ZmZlci4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtVaW50MzJMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBVaW50MzJMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzVWludDMyTGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSA0Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiA2NC1iaXQgc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQogKiBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQogKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqCiAqIEludGVnZXJzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgdHJ1bmNhdGVkIHRvIHRoZWlyIGxvdyA2NCBiaXRzLAogKiBpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCA2NC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIHdpdGggdmFsdWVzIGluIHRoZQogKiByYW5nZSAtOTIyMzM3MjAzNjg1NDc3NTgwOCB0byArOTIyMzM3MjAzNjg1NDc3NTgwNy4KICovCmFic3RyYWN0IGNsYXNzIEludDY0TGlzdCBpbXBsZW1lbnRzIExpc3Q8aW50PiwgX1R5cGVkSW50TGlzdCB7CiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50NjRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQ2NExpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbSW50NjRMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQ2NExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBbSW50NjRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbSW50NjRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyCiAgICogYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBJbnQ2NExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNJbnQ2NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gODsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgNjQtYml0IHVuc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQogKiBbVHlwZWREYXRhXS4KICoKICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQogKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCiAqCiAqIEludGVnZXJzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgdHJ1bmNhdGVkIHRvIHRoZWlyIGxvdyA2NCBiaXRzLAogKiBpbnRlcnByZXRlZCBhcyBhbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB3aXRoIHZhbHVlcyBpbiB0aGUKICogcmFuZ2UgMCB0byAxODQ0Njc0NDA3MzcwOTU1MTYxNS4KICovCmFic3RyYWN0IGNsYXNzIFVpbnQ2NExpc3QgaW1wbGVtZW50cyBMaXN0PGludD4sIF9UeXBlZEludExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBbVWludDY0TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsCiAgICogb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgVWludDY0TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtVaW50NjRMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBVaW50NjRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gW1VpbnQ2NExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbgogICAqIHRoZSBzcGVjaWZpZWQgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbVWludDY0TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlIGJ1ZmZlcgogICAqIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgVWludDY0TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc1VpbnQ2NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gODsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgSUVFRSA3NTQgc2luZ2xlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKICogbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEgW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzCiAqIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkgbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4KICogdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgogKgogKiBEb3VibGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgbGlzdCBhcmUgY29udmVydGVkIHRvIHRoZSBuZWFyZXN0CiAqIHNpbmdsZS1wcmVjaXNpb24gdmFsdWUuIFZhbHVlcyByZWFkIGFyZSBjb252ZXJ0ZWQgdG8gYSBkb3VibGUKICogdmFsdWUgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KICovCmFic3RyYWN0IGNsYXNzIEZsb2F0MzJMaXN0IGltcGxlbWVudHMgTGlzdDxkb3VibGU+LCBfVHlwZWRGbG9hdExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQzMkxpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0MzJMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKgogICAqIFZhbHVlcyBhcmUgdHJ1bmNhdGVkIHRvIGZpdCBpbiB0aGUgbGlzdCB3aGVuIHRoZXkgYXJlIGNvcGllZCwKICAgKiB0aGUgc2FtZSB3YXkgc3RvcmluZyB2YWx1ZXMgdHJ1bmNhdGVzIHRoZW0uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyTGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gW2J1ZmZlcl0uCiAgICoKICAgKiBDaGFuZ2VzIGluIHRoZSBbRmxvYXQzMkxpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQogICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4KICAgKiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwKICAgKiBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgogICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gYG51bGxgLAogICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCiAgICoKICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCiAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKICAgKiBbYnl0ZXNQZXJFbGVtZW50XS4KICAgKi8KICBmYWN0b3J5IEZsb2F0MzJMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzRmxvYXQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gNDsKfQoKLyoqCiAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKICogbnVtYmVycyAgdGhhdCBpcyB2aWV3YWJsZSBhcyBhIFtUeXBlZERhdGFdLgogKgogKiBGb3IgbG9uZyBsaXN0cywgdGhpcwogKiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5IG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuCiAqIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEZsb2F0NjRMaXN0IGltcGxlbWVudHMgTGlzdDxkb3VibGU+LCBfVHlwZWRGbG9hdExpc3QgewogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgogICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjRMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0CiAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjRMaXN0LmZyb21MaXN0KExpc3Q8ZG91YmxlPiBlbGVtZW50cyk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtGbG9hdDY0TGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCiAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLgogICAqIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3Qgc3BlY2lmaWVkLAogICAqIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCiAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBgbnVsbGAsCiAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KICAgKgogICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgogICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgogICAqIFtieXRlc1BlckVsZW1lbnRdLgogICAqLwogIGZhY3RvcnkgRmxvYXQ2NExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIHJldHVybiBidWZmZXIuYXNGbG9hdDY0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSA4Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiBGbG9hdDMyeDQgbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgY29uc2lkZXJhYmx5IG1vcmUKICogc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEZsb2F0MzJ4NExpc3QgaW1wbGVtZW50cyBMaXN0PEZsb2F0MzJ4ND4sIFR5cGVkRGF0YSB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDMyeDRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLAogICAqIGFsbCBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDRMaXN0KGludCBsZW5ndGgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJ4NExpc3RdIHdpdGggdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEZsb2F0MzJ4ND4gZWxlbWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJ4NExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtGbG9hdDMyeDRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBGbG9hdDMyeDRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzRmxvYXQzMng0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGlzIGxpc3QgYW5kIFtvdGhlcl0uCiAgICoKICAgKiBJZiBbb3RoZXJdIGlzIGFsc28gYSBbRmxvYXQzMng0TGlzdF0sIHRoZSByZXN1bHQgaXMgYSBuZXcgW0Zsb2F0MzJ4NExpc3RdLAogICAqIG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGEgbm9ybWFsIGdyb3dhYmxlIGBMaXN0PEZsb2F0MzJ4ND5gLgogICAqLwogIExpc3Q8RmxvYXQzMng0PiBvcGVyYXRvciArKExpc3Q8RmxvYXQzMng0PiBvdGhlcik7CgogIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJFbGVtZW50ID0gMTY7Cn0KCi8qKgogKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIEludDMyeDQgbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgY29uc2lkZXJhYmx5IG1vcmUKICogc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEludDMyeDRMaXN0IGltcGxlbWVudHMgTGlzdDxJbnQzMng0PiwgVHlwZWREYXRhIHsKICAvKioKICAgKiBDcmVhdGVzIGEgW0ludDMyeDRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLAogICAqIGFsbCBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMng0TGlzdChpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMng0TGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEludDMyeDQ+IGVsZW1lbnRzKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtJbnQzMng0TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIFtidWZmZXJdLgogICAqCiAgICogQ2hhbmdlcyBpbiB0aGUgW0ludDMyeDRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBJbnQzMng0TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAogICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgcmV0dXJuIGJ1ZmZlci5hc0ludDMyeDRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgbGlzdCBhbmQgW290aGVyXS4KICAgKgogICAqIElmIFtvdGhlcl0gaXMgYWxzbyBhIFtJbnQzMng0TGlzdF0sIHRoZSByZXN1bHQgaXMgYSBuZXcgW0ludDMyeDRMaXN0XSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIG5vcm1hbCBncm93YWJsZSBgTGlzdDxJbnQzMng0PmAuCiAgICovCiAgTGlzdDxJbnQzMng0PiBvcGVyYXRvciArKExpc3Q8SW50MzJ4ND4gb3RoZXIpOwoKICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzUGVyRWxlbWVudCA9IDE2Owp9CgovKioKICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiBGbG9hdDY0eDIgbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKICogW1R5cGVkRGF0YV0uCiAqCiAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgY29uc2lkZXJhYmx5IG1vcmUKICogc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEZsb2F0NjR4Mkxpc3QgaW1wbGVtZW50cyBMaXN0PEZsb2F0NjR4Mj4sIFR5cGVkRGF0YSB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLAogICAqIGFsbCBvZiB3aG9zZSBlbGVtZW50cyBoYXZlIGFsbCBsYW5lcyBzZXQgdG8gemVyby4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mkxpc3QoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRmxvYXQ2NHgyTGlzdF0gd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIFtlbGVtZW50c10gbGlzdAogICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDY0eDJMaXN0LmZyb21MaXN0KExpc3Q8RmxvYXQ2NHgyPiBlbGVtZW50cyk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhpcyBsaXN0IGFuZCBbb3RoZXJdLgogICAqCiAgICogSWYgW290aGVyXSBpcyBhbHNvIGEgW0Zsb2F0NjR4Mkxpc3RdLCB0aGUgcmVzdWx0IGlzIGEgbmV3IFtGbG9hdDY0eDJMaXN0XSwKICAgKiBvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIG5vcm1hbCBncm93YWJsZSBgTGlzdDxGbG9hdDY0eDI+YC4KICAgKi8KICBMaXN0PEZsb2F0NjR4Mj4gb3BlcmF0b3IgKyhMaXN0PEZsb2F0NjR4Mj4gb3RoZXIpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjR4Mkxpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiBbYnVmZmVyXS4KICAgKgogICAqIENoYW5nZXMgaW4gdGhlIFtGbG9hdDY0eDJMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuCiAgICogSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAgICogaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGBudWxsYCwKICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgogICAqCiAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgogICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KICAgKgogICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCiAgICogW2J5dGVzUGVyRWxlbWVudF0uCiAgICovCiAgZmFjdG9yeSBGbG9hdDY0eDJMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCiAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICByZXR1cm4gYnVmZmVyLmFzRmxvYXQ2NHgyTGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgc3RhdGljIGNvbnN0IGludCBieXRlc1BlckVsZW1lbnQgPSAxNjsKfQoKLyoqCiAqIEZsb2F0MzJ4NCBpbW11dGFibGUgdmFsdWUgdHlwZSBhbmQgb3BlcmF0aW9ucy4KICoKICogRmxvYXQzMng0IHN0b3JlcyA0IDMyLWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gImxhbmVzIi4KICogVGhlIGxhbmVzIGFyZSAieCIsICJ5IiwgInoiLCBhbmQgInciIHJlc3BlY3RpdmVseS4KICovCmFic3RyYWN0IGNsYXNzIEZsb2F0MzJ4NCB7CiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpOwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQzMng0LnNwbGF0KGRvdWJsZSB2KTsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0MzJ4NC56ZXJvKCk7CiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDQuZnJvbUludDMyeDRCaXRzKEludDMyeDQgeCk7CgogIC8vLyBTZXRzIHRoZSB4IGFuZCB5IGxhbmVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzIGluIFt2XSBhbmQgc2V0cyB0aGUgegogIC8vLyBhbmQgdyBsYW5lcyB0byAwLjAuCiAgZXh0ZXJuYWwgZmFjdG9yeSBGbG9hdDMyeDQuZnJvbUZsb2F0NjR4MihGbG9hdDY0eDIgdik7CgogIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KICBGbG9hdDMyeDQgb3BlcmF0b3IgKyhGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gTmVnYXRlIG9wZXJhdG9yLgogIEZsb2F0MzJ4NCBvcGVyYXRvciAtKCk7CgogIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KICBGbG9hdDMyeDQgb3BlcmF0b3IgLShGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuCiAgRmxvYXQzMng0IG9wZXJhdG9yICooRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIERpdmlzaW9uIG9wZXJhdG9yLgogIEZsb2F0MzJ4NCBvcGVyYXRvciAvKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZWxhdGlvbmFsIGxlc3MgdGhhbi4KICBJbnQzMng0IGxlc3NUaGFuKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZWxhdGlvbmFsIGxlc3MgdGhhbiBvciBlcXVhbC4KICBJbnQzMng0IGxlc3NUaGFuT3JFcXVhbChGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBncmVhdGVyIHRoYW4uCiAgSW50MzJ4NCBncmVhdGVyVGhhbihGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBncmVhdGVyIHRoYW4gb3IgZXF1YWwuCiAgSW50MzJ4NCBncmVhdGVyVGhhbk9yRXF1YWwoRmxvYXQzMng0IG90aGVyKTsKCiAgLy8vIFJlbGF0aW9uYWwgZXF1YWwuCiAgSW50MzJ4NCBlcXVhbChGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmVsYXRpb25hbCBub3QtZXF1YWwuCiAgSW50MzJ4NCBub3RFcXVhbChGbG9hdDMyeDQgb3RoZXIpOwoKICAvLy8gUmV0dXJucyBhIGNvcHkgb2YgW3RoaXNdIGVhY2ggbGFuZSBiZWluZyBzY2FsZWQgYnkgW3NdLgogIC8vLyBFcXVpdmFsZW50IHRvIHRoaXMgKiBuZXcgRmxvYXQzMng0LnNwbGF0KHMpCiAgRmxvYXQzMng0IHNjYWxlKGRvdWJsZSBzKTsKCiAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIFtGbG9hdDMyeDRdLgogIEZsb2F0MzJ4NCBhYnMoKTsKCiAgLy8vIExhbmUtd2lzZSBjbGFtcCBbdGhpc10gdG8gYmUgaW4gdGhlIHJhbmdlIFtsb3dlckxpbWl0XS1bdXBwZXJMaW1pdF0uCiAgRmxvYXQzMng0IGNsYW1wKEZsb2F0MzJ4NCBsb3dlckxpbWl0LCBGbG9hdDMyeDQgdXBwZXJMaW1pdCk7CgogIC8vLyBFeHRyYWN0ZWQgeCB2YWx1ZS4KICBkb3VibGUgZ2V0IHg7CgogIC8vLyBFeHRyYWN0ZWQgeSB2YWx1ZS4KICBkb3VibGUgZ2V0IHk7CgogIC8vLyBFeHRyYWN0ZWQgeiB2YWx1ZS4KICBkb3VibGUgZ2V0IHo7CgogIC8vLyBFeHRyYWN0ZWQgdyB2YWx1ZS4KICBkb3VibGUgZ2V0IHc7CgogIC8vLyBFeHRyYWN0IHRoZSBzaWduIGJpdHMgZnJvbSBlYWNoIGxhbmUgcmV0dXJuIHRoZW0gaW4gdGhlIGZpcnN0IDQgYml0cy4KICAvLy8gIngiIGxhbmUgaXMgYml0IDAuCiAgLy8vICJ5IiBsYW5lIGlzIGJpdCAxLgogIC8vLyAieiIgbGFuZSBpcyBiaXQgMi4KICAvLy8gInciIGxhbmUgaXMgYml0IDMuCiAgaW50IGdldCBzaWduTWFzazsKCiAgLy8vIE1hc2sgcGFzc2VkIHRvIFtzaHVmZmxlXSBvciBbc2h1ZmZsZU1peF0uCiAgc3RhdGljIGNvbnN0IGludCB4eHh4ID0gMHgwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh4eSA9IDB4NDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHh6ID0gMHg4MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eHcgPSAweEMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5eCA9IDB4MTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHl5ID0gMHg1MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXogPSAweDkwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5dyA9IDB4RDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp4ID0gMHgyMDsKICBzdGF0aWMgY29uc3QgaW50IHh4enkgPSAweDYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6eiA9IDB4QTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp3ID0gMHhFMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3ggPSAweDMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh3eSA9IDB4NzA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd6ID0gMHhCMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3cgPSAweEYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eCA9IDB4NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHkgPSAweDQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eiA9IDB4ODQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXh3ID0gMHhDNDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXggPSAweDE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl5eSA9IDB4NTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl6ID0gMHg5NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXcgPSAweEQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6eCA9IDB4MjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXp5ID0gMHg2NDsKICBzdGF0aWMgY29uc3QgaW50IHh5enogPSAweEE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6dyA9IDB4RTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd4ID0gMHgzNDsKICBzdGF0aWMgY29uc3QgaW50IHh5d3kgPSAweDc0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3eiA9IDB4QjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd3ID0gMHhGNDsKICBzdGF0aWMgY29uc3QgaW50IHh6eHggPSAweDg7CiAgc3RhdGljIGNvbnN0IGludCB4enh5ID0gMHg0ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eHogPSAweDg4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp4dyA9IDB4Qzg7CiAgc3RhdGljIGNvbnN0IGludCB4enl4ID0gMHgxODsKICBzdGF0aWMgY29uc3QgaW50IHh6eXkgPSAweDU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5eiA9IDB4OTg7CiAgc3RhdGljIGNvbnN0IGludCB4enl3ID0gMHhEODsKICBzdGF0aWMgY29uc3QgaW50IHh6enggPSAweDI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp6eSA9IDB4Njg7CiAgc3RhdGljIGNvbnN0IGludCB4enp6ID0gMHhBODsKICBzdGF0aWMgY29uc3QgaW50IHh6encgPSAweEU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3eCA9IDB4Mzg7CiAgc3RhdGljIGNvbnN0IGludCB4end5ID0gMHg3ODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3ogPSAweEI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3dyA9IDB4Rjg7CiAgc3RhdGljIGNvbnN0IGludCB4d3h4ID0gMHhDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eSA9IDB4NEM7CiAgc3RhdGljIGNvbnN0IGludCB4d3h6ID0gMHg4QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eHcgPSAweENDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5eCA9IDB4MUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3l5ID0gMHg1QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXogPSAweDlDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5dyA9IDB4REM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p4ID0gMHgyQzsKICBzdGF0aWMgY29uc3QgaW50IHh3enkgPSAweDZDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6eiA9IDB4QUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p3ID0gMHhFQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3ggPSAweDNDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd3eSA9IDB4N0M7CiAgc3RhdGljIGNvbnN0IGludCB4d3d6ID0gMHhCQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3cgPSAweEZDOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eCA9IDB4MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eHkgPSAweDQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eiA9IDB4ODE7CiAgc3RhdGljIGNvbnN0IGludCB5eHh3ID0gMHhDMTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXggPSAweDExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh5eSA9IDB4NTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl6ID0gMHg5MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXcgPSAweEQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6eCA9IDB4MjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHp5ID0gMHg2MTsKICBzdGF0aWMgY29uc3QgaW50IHl4enogPSAweEExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6dyA9IDB4RTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd4ID0gMHgzMTsKICBzdGF0aWMgY29uc3QgaW50IHl4d3kgPSAweDcxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3eiA9IDB4QjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd3ID0gMHhGMTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHggPSAweDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXh5ID0gMHg0NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHogPSAweDg1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl4dyA9IDB4QzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl4ID0gMHgxNTsKICBzdGF0aWMgY29uc3QgaW50IHl5eXkgPSAweDU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5eiA9IDB4OTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl3ID0gMHhENTsKICBzdGF0aWMgY29uc3QgaW50IHl5enggPSAweDI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl6eSA9IDB4NjU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp6ID0gMHhBNTsKICBzdGF0aWMgY29uc3QgaW50IHl5encgPSAweEU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3eCA9IDB4MzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXd5ID0gMHg3NTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3ogPSAweEI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3dyA9IDB4RjU7CiAgc3RhdGljIGNvbnN0IGludCB5enh4ID0gMHg5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eSA9IDB4NDk7CiAgc3RhdGljIGNvbnN0IGludCB5enh6ID0gMHg4OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eHcgPSAweEM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5eCA9IDB4MTk7CiAgc3RhdGljIGNvbnN0IGludCB5enl5ID0gMHg1OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXogPSAweDk5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5dyA9IDB4RDk7CiAgc3RhdGljIGNvbnN0IGludCB5enp4ID0gMHgyOTsKICBzdGF0aWMgY29uc3QgaW50IHl6enkgPSAweDY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6eiA9IDB4QTk7CiAgc3RhdGljIGNvbnN0IGludCB5enp3ID0gMHhFOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3ggPSAweDM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp3eSA9IDB4Nzk7CiAgc3RhdGljIGNvbnN0IGludCB5end6ID0gMHhCOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3cgPSAweEY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eCA9IDB4RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eHkgPSAweDREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eiA9IDB4OEQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3h3ID0gMHhDRDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXggPSAweDFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd5eSA9IDB4NUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3l6ID0gMHg5RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXcgPSAweEREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6eCA9IDB4MkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3p5ID0gMHg2RDsKICBzdGF0aWMgY29uc3QgaW50IHl3enogPSAweEFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6dyA9IDB4RUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d4ID0gMHgzRDsKICBzdGF0aWMgY29uc3QgaW50IHl3d3kgPSAweDdEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3eiA9IDB4QkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d3ID0gMHhGRDsKICBzdGF0aWMgY29uc3QgaW50IHp4eHggPSAweDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHh5ID0gMHg0MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eHogPSAweDgyOwogIHN0YXRpYyBjb25zdCBpbnQgenh4dyA9IDB4QzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl4ID0gMHgxMjsKICBzdGF0aWMgY29uc3QgaW50IHp4eXkgPSAweDUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5eiA9IDB4OTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl3ID0gMHhEMjsKICBzdGF0aWMgY29uc3QgaW50IHp4enggPSAweDIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh6eSA9IDB4NjI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp6ID0gMHhBMjsKICBzdGF0aWMgY29uc3QgaW50IHp4encgPSAweEUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3eCA9IDB4MzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHd5ID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3ogPSAweEIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3dyA9IDB4RjI7CiAgc3RhdGljIGNvbnN0IGludCB6eXh4ID0gMHg2OwogIHN0YXRpYyBjb25zdCBpbnQgenl4eSA9IDB4NDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXh6ID0gMHg4NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eHcgPSAweEM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5eCA9IDB4MTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXl5ID0gMHg1NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXogPSAweDk2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5dyA9IDB4RDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp4ID0gMHgyNjsKICBzdGF0aWMgY29uc3QgaW50IHp5enkgPSAweDY2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6eiA9IDB4QTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp3ID0gMHhFNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3ggPSAweDM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl3eSA9IDB4NzY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd6ID0gMHhCNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3cgPSAweEY2OwogIHN0YXRpYyBjb25zdCBpbnQgenp4eCA9IDB4QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eHkgPSAweDRBOwogIHN0YXRpYyBjb25zdCBpbnQgenp4eiA9IDB4OEE7CiAgc3RhdGljIGNvbnN0IGludCB6enh3ID0gMHhDQTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXggPSAweDFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp5eSA9IDB4NUE7CiAgc3RhdGljIGNvbnN0IGludCB6enl6ID0gMHg5QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXcgPSAweERBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6eCA9IDB4MkE7CiAgc3RhdGljIGNvbnN0IGludCB6enp5ID0gMHg2QTsKICBzdGF0aWMgY29uc3QgaW50IHp6enogPSAweEFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6dyA9IDB4RUE7CiAgc3RhdGljIGNvbnN0IGludCB6end4ID0gMHgzQTsKICBzdGF0aWMgY29uc3QgaW50IHp6d3kgPSAweDdBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3eiA9IDB4QkE7CiAgc3RhdGljIGNvbnN0IGludCB6end3ID0gMHhGQTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHggPSAweEU7CiAgc3RhdGljIGNvbnN0IGludCB6d3h5ID0gMHg0RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHogPSAweDhFOwogIHN0YXRpYyBjb25zdCBpbnQgend4dyA9IDB4Q0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3l4ID0gMHgxRTsKICBzdGF0aWMgY29uc3QgaW50IHp3eXkgPSAweDVFOwogIHN0YXRpYyBjb25zdCBpbnQgend5eiA9IDB4OUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3l3ID0gMHhERTsKICBzdGF0aWMgY29uc3QgaW50IHp3enggPSAweDJFOwogIHN0YXRpYyBjb25zdCBpbnQgend6eSA9IDB4NkU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p6ID0gMHhBRTsKICBzdGF0aWMgY29uc3QgaW50IHp3encgPSAweEVFOwogIHN0YXRpYyBjb25zdCBpbnQgend3eCA9IDB4M0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3d5ID0gMHg3RTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3ogPSAweEJFOwogIHN0YXRpYyBjb25zdCBpbnQgend3dyA9IDB4RkU7CiAgc3RhdGljIGNvbnN0IGludCB3eHh4ID0gMHgzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eSA9IDB4NDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHh6ID0gMHg4MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eHcgPSAweEMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5eCA9IDB4MTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHl5ID0gMHg1MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXogPSAweDkzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5dyA9IDB4RDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp4ID0gMHgyMzsKICBzdGF0aWMgY29uc3QgaW50IHd4enkgPSAweDYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6eiA9IDB4QTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp3ID0gMHhFMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3ggPSAweDMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h3eSA9IDB4NzM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd6ID0gMHhCMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3cgPSAweEYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eCA9IDB4NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHkgPSAweDQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eiA9IDB4ODc7CiAgc3RhdGljIGNvbnN0IGludCB3eXh3ID0gMHhDNzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXggPSAweDE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l5eSA9IDB4NTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl6ID0gMHg5NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXcgPSAweEQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6eCA9IDB4Mjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXp5ID0gMHg2NzsKICBzdGF0aWMgY29uc3QgaW50IHd5enogPSAweEE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6dyA9IDB4RTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd4ID0gMHgzNzsKICBzdGF0aWMgY29uc3QgaW50IHd5d3kgPSAweDc3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3eiA9IDB4Qjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd3ID0gMHhGNzsKICBzdGF0aWMgY29uc3QgaW50IHd6eHggPSAweEI7CiAgc3RhdGljIGNvbnN0IGludCB3enh5ID0gMHg0QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eHogPSAweDhCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p4dyA9IDB4Q0I7CiAgc3RhdGljIGNvbnN0IGludCB3enl4ID0gMHgxQjsKICBzdGF0aWMgY29uc3QgaW50IHd6eXkgPSAweDVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5eiA9IDB4OUI7CiAgc3RhdGljIGNvbnN0IGludCB3enl3ID0gMHhEQjsKICBzdGF0aWMgY29uc3QgaW50IHd6enggPSAweDJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p6eSA9IDB4NkI7CiAgc3RhdGljIGNvbnN0IGludCB3enp6ID0gMHhBQjsKICBzdGF0aWMgY29uc3QgaW50IHd6encgPSAweEVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3eCA9IDB4M0I7CiAgc3RhdGljIGNvbnN0IGludCB3end5ID0gMHg3QjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3ogPSAweEJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3dyA9IDB4RkI7CiAgc3RhdGljIGNvbnN0IGludCB3d3h4ID0gMHhGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eSA9IDB4NEY7CiAgc3RhdGljIGNvbnN0IGludCB3d3h6ID0gMHg4RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eHcgPSAweENGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5eCA9IDB4MUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3l5ID0gMHg1RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXogPSAweDlGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5dyA9IDB4REY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p4ID0gMHgyRjsKICBzdGF0aWMgY29uc3QgaW50IHd3enkgPSAweDZGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6eiA9IDB4QUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p3ID0gMHhFRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3ggPSAweDNGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d3eSA9IDB4N0Y7CiAgc3RhdGljIGNvbnN0IGludCB3d3d6ID0gMHhCRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3cgPSAweEZGOwoKICAvLy8gU2h1ZmZsZSB0aGUgbGFuZSB2YWx1ZXMuIFttYXNrXSBtdXN0IGJlIG9uZSBvZiB0aGUgMjU2IHNodWZmbGUgY29uc3RhbnRzLgogIEZsb2F0MzJ4NCBzaHVmZmxlKGludCBtYXNrKTsKCiAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzIGluIFt0aGlzXSBhbmQgW290aGVyXS4gVGhlIHJldHVybmVkCiAgLy8vIEZsb2F0MzJ4NCB3aWxsIGhhdmUgWFkgbGFuZXMgZnJvbSBbdGhpc10gYW5kIFpXIGxhbmVzIGZyb20gW290aGVyXS4KICAvLy8gVXNlcyB0aGUgc2FtZSBbbWFza10gYXMgW3NodWZmbGVdLgogIEZsb2F0MzJ4NCBzaHVmZmxlTWl4KEZsb2F0MzJ4NCBvdGhlciwgaW50IG1hc2spOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbRmxvYXQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB4IHZhbHVlLgogIEZsb2F0MzJ4NCB3aXRoWChkb3VibGUgeCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtGbG9hdDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHkgdmFsdWUuCiAgRmxvYXQzMng0IHdpdGhZKGRvdWJsZSB5KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeiB2YWx1ZS4KICBGbG9hdDMyeDQgd2l0aFooZG91YmxlIHopOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbRmxvYXQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB3IHZhbHVlLgogIEZsb2F0MzJ4NCB3aXRoVyhkb3VibGUgdyk7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWluaW11bSB2YWx1ZSBpbiBbdGhpc10gb3IgW290aGVyXS4KICBGbG9hdDMyeDQgbWluKEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWF4aW11bSB2YWx1ZSBpbiBbdGhpc10gb3IgW290aGVyXS4KICBGbG9hdDMyeDQgbWF4KEZsb2F0MzJ4NCBvdGhlcik7CgogIC8vLyBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBbdGhpc10uCiAgRmxvYXQzMng0IHNxcnQoKTsKCiAgLy8vIFJldHVybnMgdGhlIHJlY2lwcm9jYWwgb2YgW3RoaXNdLgogIEZsb2F0MzJ4NCByZWNpcHJvY2FsKCk7CgogIC8vLyBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgcmVjaXByb2NhbCBvZiBbdGhpc10uCiAgRmxvYXQzMng0IHJlY2lwcm9jYWxTcXJ0KCk7Cn0KCi8qKgogKiBJbnQzMng0IGFuZCBvcGVyYXRpb25zLgogKgogKiBJbnQzMng0IHN0b3JlcyA0IDMyLWJpdCBiaXQtbWFza3MgaW4gImxhbmVzIi4KICogVGhlIGxhbmVzIGFyZSAieCIsICJ5IiwgInoiLCBhbmQgInciIHJlc3BlY3RpdmVseS4KICovCmFic3RyYWN0IGNsYXNzIEludDMyeDQgewogIGV4dGVybmFsIGZhY3RvcnkgSW50MzJ4NChpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7CiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnQzMng0LmJvb2woYm9vbCB4LCBib29sIHksIGJvb2wgeiwgYm9vbCB3KTsKICBleHRlcm5hbCBmYWN0b3J5IEludDMyeDQuZnJvbUZsb2F0MzJ4NEJpdHMoRmxvYXQzMng0IHgpOwoKICAvLy8gVGhlIGJpdC13aXNlIG9yIG9wZXJhdG9yLgogIEludDMyeDQgb3BlcmF0b3IgfChJbnQzMng0IG90aGVyKTsKCiAgLy8vIFRoZSBiaXQtd2lzZSBhbmQgb3BlcmF0b3IuCiAgSW50MzJ4NCBvcGVyYXRvciAmKEludDMyeDQgb3RoZXIpOwoKICAvLy8gVGhlIGJpdC13aXNlIHhvciBvcGVyYXRvci4KICBJbnQzMng0IG9wZXJhdG9yIF4oSW50MzJ4NCBvdGhlcik7CgogIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KICBJbnQzMng0IG9wZXJhdG9yICsoSW50MzJ4NCBvdGhlcik7CgogIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KICBJbnQzMng0IG9wZXJhdG9yIC0oSW50MzJ4NCBvdGhlcik7CgogIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20geCBsYW5lLgogIGludCBnZXQgeDsKCiAgLy8vIEV4dHJhY3QgMzItYml0IG1hc2sgZnJvbSB5IGxhbmUuCiAgaW50IGdldCB5OwoKICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHogbGFuZS4KICBpbnQgZ2V0IHo7CgogIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20gdyBsYW5lLgogIGludCBnZXQgdzsKCiAgLy8vIEV4dHJhY3QgdGhlIHRvcCBiaXQgZnJvbSBlYWNoIGxhbmUgcmV0dXJuIHRoZW0gaW4gdGhlIGZpcnN0IDQgYml0cy4KICAvLy8gIngiIGxhbmUgaXMgYml0IDAuCiAgLy8vICJ5IiBsYW5lIGlzIGJpdCAxLgogIC8vLyAieiIgbGFuZSBpcyBiaXQgMi4KICAvLy8gInciIGxhbmUgaXMgYml0IDMuCiAgaW50IGdldCBzaWduTWFzazsKCiAgLy8vIE1hc2sgcGFzc2VkIHRvIFtzaHVmZmxlXSBvciBbc2h1ZmZsZU1peF0uCiAgc3RhdGljIGNvbnN0IGludCB4eHh4ID0gMHgwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh4eSA9IDB4NDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHh6ID0gMHg4MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eHcgPSAweEMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5eCA9IDB4MTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHl5ID0gMHg1MDsKICBzdGF0aWMgY29uc3QgaW50IHh4eXogPSAweDkwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh5dyA9IDB4RDA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp4ID0gMHgyMDsKICBzdGF0aWMgY29uc3QgaW50IHh4enkgPSAweDYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh6eiA9IDB4QTA7CiAgc3RhdGljIGNvbnN0IGludCB4eHp3ID0gMHhFMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3ggPSAweDMwOwogIHN0YXRpYyBjb25zdCBpbnQgeHh3eSA9IDB4NzA7CiAgc3RhdGljIGNvbnN0IGludCB4eHd6ID0gMHhCMDsKICBzdGF0aWMgY29uc3QgaW50IHh4d3cgPSAweEYwOwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eCA9IDB4NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eHkgPSAweDQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl4eiA9IDB4ODQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXh3ID0gMHhDNDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXggPSAweDE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl5eSA9IDB4NTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXl6ID0gMHg5NDsKICBzdGF0aWMgY29uc3QgaW50IHh5eXcgPSAweEQ0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6eCA9IDB4MjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXp5ID0gMHg2NDsKICBzdGF0aWMgY29uc3QgaW50IHh5enogPSAweEE0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl6dyA9IDB4RTQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd4ID0gMHgzNDsKICBzdGF0aWMgY29uc3QgaW50IHh5d3kgPSAweDc0OwogIHN0YXRpYyBjb25zdCBpbnQgeHl3eiA9IDB4QjQ7CiAgc3RhdGljIGNvbnN0IGludCB4eXd3ID0gMHhGNDsKICBzdGF0aWMgY29uc3QgaW50IHh6eHggPSAweDg7CiAgc3RhdGljIGNvbnN0IGludCB4enh5ID0gMHg0ODsKICBzdGF0aWMgY29uc3QgaW50IHh6eHogPSAweDg4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp4dyA9IDB4Qzg7CiAgc3RhdGljIGNvbnN0IGludCB4enl4ID0gMHgxODsKICBzdGF0aWMgY29uc3QgaW50IHh6eXkgPSAweDU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp5eiA9IDB4OTg7CiAgc3RhdGljIGNvbnN0IGludCB4enl3ID0gMHhEODsKICBzdGF0aWMgY29uc3QgaW50IHh6enggPSAweDI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp6eSA9IDB4Njg7CiAgc3RhdGljIGNvbnN0IGludCB4enp6ID0gMHhBODsKICBzdGF0aWMgY29uc3QgaW50IHh6encgPSAweEU4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3eCA9IDB4Mzg7CiAgc3RhdGljIGNvbnN0IGludCB4end5ID0gMHg3ODsKICBzdGF0aWMgY29uc3QgaW50IHh6d3ogPSAweEI4OwogIHN0YXRpYyBjb25zdCBpbnQgeHp3dyA9IDB4Rjg7CiAgc3RhdGljIGNvbnN0IGludCB4d3h4ID0gMHhDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd4eSA9IDB4NEM7CiAgc3RhdGljIGNvbnN0IGludCB4d3h6ID0gMHg4QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eHcgPSAweENDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5eCA9IDB4MUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3l5ID0gMHg1QzsKICBzdGF0aWMgY29uc3QgaW50IHh3eXogPSAweDlDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd5dyA9IDB4REM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p4ID0gMHgyQzsKICBzdGF0aWMgY29uc3QgaW50IHh3enkgPSAweDZDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd6eiA9IDB4QUM7CiAgc3RhdGljIGNvbnN0IGludCB4d3p3ID0gMHhFQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3ggPSAweDNDOwogIHN0YXRpYyBjb25zdCBpbnQgeHd3eSA9IDB4N0M7CiAgc3RhdGljIGNvbnN0IGludCB4d3d6ID0gMHhCQzsKICBzdGF0aWMgY29uc3QgaW50IHh3d3cgPSAweEZDOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eCA9IDB4MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eHkgPSAweDQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh4eiA9IDB4ODE7CiAgc3RhdGljIGNvbnN0IGludCB5eHh3ID0gMHhDMTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXggPSAweDExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh5eSA9IDB4NTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHl6ID0gMHg5MTsKICBzdGF0aWMgY29uc3QgaW50IHl4eXcgPSAweEQxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6eCA9IDB4MjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHp5ID0gMHg2MTsKICBzdGF0aWMgY29uc3QgaW50IHl4enogPSAweEExOwogIHN0YXRpYyBjb25zdCBpbnQgeXh6dyA9IDB4RTE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd4ID0gMHgzMTsKICBzdGF0aWMgY29uc3QgaW50IHl4d3kgPSAweDcxOwogIHN0YXRpYyBjb25zdCBpbnQgeXh3eiA9IDB4QjE7CiAgc3RhdGljIGNvbnN0IGludCB5eHd3ID0gMHhGMTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHggPSAweDU7CiAgc3RhdGljIGNvbnN0IGludCB5eXh5ID0gMHg0NTsKICBzdGF0aWMgY29uc3QgaW50IHl5eHogPSAweDg1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl4dyA9IDB4QzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl4ID0gMHgxNTsKICBzdGF0aWMgY29uc3QgaW50IHl5eXkgPSAweDU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl5eiA9IDB4OTU7CiAgc3RhdGljIGNvbnN0IGludCB5eXl3ID0gMHhENTsKICBzdGF0aWMgY29uc3QgaW50IHl5enggPSAweDI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl6eSA9IDB4NjU7CiAgc3RhdGljIGNvbnN0IGludCB5eXp6ID0gMHhBNTsKICBzdGF0aWMgY29uc3QgaW50IHl5encgPSAweEU1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3eCA9IDB4MzU7CiAgc3RhdGljIGNvbnN0IGludCB5eXd5ID0gMHg3NTsKICBzdGF0aWMgY29uc3QgaW50IHl5d3ogPSAweEI1OwogIHN0YXRpYyBjb25zdCBpbnQgeXl3dyA9IDB4RjU7CiAgc3RhdGljIGNvbnN0IGludCB5enh4ID0gMHg5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp4eSA9IDB4NDk7CiAgc3RhdGljIGNvbnN0IGludCB5enh6ID0gMHg4OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eHcgPSAweEM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5eCA9IDB4MTk7CiAgc3RhdGljIGNvbnN0IGludCB5enl5ID0gMHg1OTsKICBzdGF0aWMgY29uc3QgaW50IHl6eXogPSAweDk5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp5dyA9IDB4RDk7CiAgc3RhdGljIGNvbnN0IGludCB5enp4ID0gMHgyOTsKICBzdGF0aWMgY29uc3QgaW50IHl6enkgPSAweDY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp6eiA9IDB4QTk7CiAgc3RhdGljIGNvbnN0IGludCB5enp3ID0gMHhFOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3ggPSAweDM5OwogIHN0YXRpYyBjb25zdCBpbnQgeXp3eSA9IDB4Nzk7CiAgc3RhdGljIGNvbnN0IGludCB5end6ID0gMHhCOTsKICBzdGF0aWMgY29uc3QgaW50IHl6d3cgPSAweEY5OwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eCA9IDB4RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eHkgPSAweDREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd4eiA9IDB4OEQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3h3ID0gMHhDRDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXggPSAweDFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd5eSA9IDB4NUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3l6ID0gMHg5RDsKICBzdGF0aWMgY29uc3QgaW50IHl3eXcgPSAweEREOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6eCA9IDB4MkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3p5ID0gMHg2RDsKICBzdGF0aWMgY29uc3QgaW50IHl3enogPSAweEFEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd6dyA9IDB4RUQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d4ID0gMHgzRDsKICBzdGF0aWMgY29uc3QgaW50IHl3d3kgPSAweDdEOwogIHN0YXRpYyBjb25zdCBpbnQgeXd3eiA9IDB4QkQ7CiAgc3RhdGljIGNvbnN0IGludCB5d3d3ID0gMHhGRDsKICBzdGF0aWMgY29uc3QgaW50IHp4eHggPSAweDI7CiAgc3RhdGljIGNvbnN0IGludCB6eHh5ID0gMHg0MjsKICBzdGF0aWMgY29uc3QgaW50IHp4eHogPSAweDgyOwogIHN0YXRpYyBjb25zdCBpbnQgenh4dyA9IDB4QzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl4ID0gMHgxMjsKICBzdGF0aWMgY29uc3QgaW50IHp4eXkgPSAweDUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh5eiA9IDB4OTI7CiAgc3RhdGljIGNvbnN0IGludCB6eHl3ID0gMHhEMjsKICBzdGF0aWMgY29uc3QgaW50IHp4enggPSAweDIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh6eSA9IDB4NjI7CiAgc3RhdGljIGNvbnN0IGludCB6eHp6ID0gMHhBMjsKICBzdGF0aWMgY29uc3QgaW50IHp4encgPSAweEUyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3eCA9IDB4MzI7CiAgc3RhdGljIGNvbnN0IGludCB6eHd5ID0gMHg3MjsKICBzdGF0aWMgY29uc3QgaW50IHp4d3ogPSAweEIyOwogIHN0YXRpYyBjb25zdCBpbnQgenh3dyA9IDB4RjI7CiAgc3RhdGljIGNvbnN0IGludCB6eXh4ID0gMHg2OwogIHN0YXRpYyBjb25zdCBpbnQgenl4eSA9IDB4NDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXh6ID0gMHg4NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eHcgPSAweEM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5eCA9IDB4MTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXl5ID0gMHg1NjsKICBzdGF0aWMgY29uc3QgaW50IHp5eXogPSAweDk2OwogIHN0YXRpYyBjb25zdCBpbnQgenl5dyA9IDB4RDY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp4ID0gMHgyNjsKICBzdGF0aWMgY29uc3QgaW50IHp5enkgPSAweDY2OwogIHN0YXRpYyBjb25zdCBpbnQgenl6eiA9IDB4QTY7CiAgc3RhdGljIGNvbnN0IGludCB6eXp3ID0gMHhFNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3ggPSAweDM2OwogIHN0YXRpYyBjb25zdCBpbnQgenl3eSA9IDB4NzY7CiAgc3RhdGljIGNvbnN0IGludCB6eXd6ID0gMHhCNjsKICBzdGF0aWMgY29uc3QgaW50IHp5d3cgPSAweEY2OwogIHN0YXRpYyBjb25zdCBpbnQgenp4eCA9IDB4QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eHkgPSAweDRBOwogIHN0YXRpYyBjb25zdCBpbnQgenp4eiA9IDB4OEE7CiAgc3RhdGljIGNvbnN0IGludCB6enh3ID0gMHhDQTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXggPSAweDFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp5eSA9IDB4NUE7CiAgc3RhdGljIGNvbnN0IGludCB6enl6ID0gMHg5QTsKICBzdGF0aWMgY29uc3QgaW50IHp6eXcgPSAweERBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6eCA9IDB4MkE7CiAgc3RhdGljIGNvbnN0IGludCB6enp5ID0gMHg2QTsKICBzdGF0aWMgY29uc3QgaW50IHp6enogPSAweEFBOwogIHN0YXRpYyBjb25zdCBpbnQgenp6dyA9IDB4RUE7CiAgc3RhdGljIGNvbnN0IGludCB6end4ID0gMHgzQTsKICBzdGF0aWMgY29uc3QgaW50IHp6d3kgPSAweDdBOwogIHN0YXRpYyBjb25zdCBpbnQgenp3eiA9IDB4QkE7CiAgc3RhdGljIGNvbnN0IGludCB6end3ID0gMHhGQTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHggPSAweEU7CiAgc3RhdGljIGNvbnN0IGludCB6d3h5ID0gMHg0RTsKICBzdGF0aWMgY29uc3QgaW50IHp3eHogPSAweDhFOwogIHN0YXRpYyBjb25zdCBpbnQgend4dyA9IDB4Q0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3l4ID0gMHgxRTsKICBzdGF0aWMgY29uc3QgaW50IHp3eXkgPSAweDVFOwogIHN0YXRpYyBjb25zdCBpbnQgend5eiA9IDB4OUU7CiAgc3RhdGljIGNvbnN0IGludCB6d3l3ID0gMHhERTsKICBzdGF0aWMgY29uc3QgaW50IHp3enggPSAweDJFOwogIHN0YXRpYyBjb25zdCBpbnQgend6eSA9IDB4NkU7CiAgc3RhdGljIGNvbnN0IGludCB6d3p6ID0gMHhBRTsKICBzdGF0aWMgY29uc3QgaW50IHp3encgPSAweEVFOwogIHN0YXRpYyBjb25zdCBpbnQgend3eCA9IDB4M0U7CiAgc3RhdGljIGNvbnN0IGludCB6d3d5ID0gMHg3RTsKICBzdGF0aWMgY29uc3QgaW50IHp3d3ogPSAweEJFOwogIHN0YXRpYyBjb25zdCBpbnQgend3dyA9IDB4RkU7CiAgc3RhdGljIGNvbnN0IGludCB3eHh4ID0gMHgzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h4eSA9IDB4NDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHh6ID0gMHg4MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eHcgPSAweEMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5eCA9IDB4MTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHl5ID0gMHg1MzsKICBzdGF0aWMgY29uc3QgaW50IHd4eXogPSAweDkzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h5dyA9IDB4RDM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp4ID0gMHgyMzsKICBzdGF0aWMgY29uc3QgaW50IHd4enkgPSAweDYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h6eiA9IDB4QTM7CiAgc3RhdGljIGNvbnN0IGludCB3eHp3ID0gMHhFMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3ggPSAweDMzOwogIHN0YXRpYyBjb25zdCBpbnQgd3h3eSA9IDB4NzM7CiAgc3RhdGljIGNvbnN0IGludCB3eHd6ID0gMHhCMzsKICBzdGF0aWMgY29uc3QgaW50IHd4d3cgPSAweEYzOwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eCA9IDB4NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eHkgPSAweDQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l4eiA9IDB4ODc7CiAgc3RhdGljIGNvbnN0IGludCB3eXh3ID0gMHhDNzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXggPSAweDE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l5eSA9IDB4NTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXl6ID0gMHg5NzsKICBzdGF0aWMgY29uc3QgaW50IHd5eXcgPSAweEQ3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6eCA9IDB4Mjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXp5ID0gMHg2NzsKICBzdGF0aWMgY29uc3QgaW50IHd5enogPSAweEE3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l6dyA9IDB4RTc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd4ID0gMHgzNzsKICBzdGF0aWMgY29uc3QgaW50IHd5d3kgPSAweDc3OwogIHN0YXRpYyBjb25zdCBpbnQgd3l3eiA9IDB4Qjc7CiAgc3RhdGljIGNvbnN0IGludCB3eXd3ID0gMHhGNzsKICBzdGF0aWMgY29uc3QgaW50IHd6eHggPSAweEI7CiAgc3RhdGljIGNvbnN0IGludCB3enh5ID0gMHg0QjsKICBzdGF0aWMgY29uc3QgaW50IHd6eHogPSAweDhCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p4dyA9IDB4Q0I7CiAgc3RhdGljIGNvbnN0IGludCB3enl4ID0gMHgxQjsKICBzdGF0aWMgY29uc3QgaW50IHd6eXkgPSAweDVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p5eiA9IDB4OUI7CiAgc3RhdGljIGNvbnN0IGludCB3enl3ID0gMHhEQjsKICBzdGF0aWMgY29uc3QgaW50IHd6enggPSAweDJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p6eSA9IDB4NkI7CiAgc3RhdGljIGNvbnN0IGludCB3enp6ID0gMHhBQjsKICBzdGF0aWMgY29uc3QgaW50IHd6encgPSAweEVCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3eCA9IDB4M0I7CiAgc3RhdGljIGNvbnN0IGludCB3end5ID0gMHg3QjsKICBzdGF0aWMgY29uc3QgaW50IHd6d3ogPSAweEJCOwogIHN0YXRpYyBjb25zdCBpbnQgd3p3dyA9IDB4RkI7CiAgc3RhdGljIGNvbnN0IGludCB3d3h4ID0gMHhGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d4eSA9IDB4NEY7CiAgc3RhdGljIGNvbnN0IGludCB3d3h6ID0gMHg4RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eHcgPSAweENGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5eCA9IDB4MUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3l5ID0gMHg1RjsKICBzdGF0aWMgY29uc3QgaW50IHd3eXogPSAweDlGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d5dyA9IDB4REY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p4ID0gMHgyRjsKICBzdGF0aWMgY29uc3QgaW50IHd3enkgPSAweDZGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d6eiA9IDB4QUY7CiAgc3RhdGljIGNvbnN0IGludCB3d3p3ID0gMHhFRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3ggPSAweDNGOwogIHN0YXRpYyBjb25zdCBpbnQgd3d3eSA9IDB4N0Y7CiAgc3RhdGljIGNvbnN0IGludCB3d3d6ID0gMHhCRjsKICBzdGF0aWMgY29uc3QgaW50IHd3d3cgPSAweEZGOwoKICAvLy8gU2h1ZmZsZSB0aGUgbGFuZSB2YWx1ZXMuIFttYXNrXSBtdXN0IGJlIG9uZSBvZiB0aGUgMjU2IHNodWZmbGUgY29uc3RhbnRzLgogIEludDMyeDQgc2h1ZmZsZShpbnQgbWFzayk7CgogIC8vLyBTaHVmZmxlIHRoZSBsYW5lIHZhbHVlcyBpbiBbdGhpc10gYW5kIFtvdGhlcl0uIFRoZSByZXR1cm5lZAogIC8vLyBJbnQzMng0IHdpbGwgaGF2ZSBYWSBsYW5lcyBmcm9tIFt0aGlzXSBhbmQgWlcgbGFuZXMgZnJvbSBbb3RoZXJdLgogIC8vLyBVc2VzIHRoZSBzYW1lIFttYXNrXSBhcyBbc2h1ZmZsZV0uCiAgSW50MzJ4NCBzaHVmZmxlTWl4KEludDMyeDQgb3RoZXIsIGludCBtYXNrKTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHggdmFsdWUuCiAgSW50MzJ4NCB3aXRoWChpbnQgeCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB5IHZhbHVlLgogIEludDMyeDQgd2l0aFkoaW50IHkpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeiB2YWx1ZS4KICBJbnQzMng0IHdpdGhaKGludCB6KTsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHcgdmFsdWUuCiAgSW50MzJ4NCB3aXRoVyhpbnQgdyk7CgogIC8vLyBFeHRyYWN0ZWQgeCB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgogIGJvb2wgZ2V0IGZsYWdYOwoKICAvLy8gRXh0cmFjdGVkIHkgdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KICBib29sIGdldCBmbGFnWTsKCiAgLy8vIEV4dHJhY3RlZCB6IHZhbHVlLiBSZXR1cm5zIGZhbHNlIGZvciAwLCB0cnVlIGZvciBhbnkgb3RoZXIgdmFsdWUuCiAgYm9vbCBnZXQgZmxhZ1o7CgogIC8vLyBFeHRyYWN0ZWQgdyB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgogIGJvb2wgZ2V0IGZsYWdXOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnWChib29sIHgpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeSB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnWShib29sIHkpOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeiB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnWihib29sIHopOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgdyB2YWx1ZS4KICBJbnQzMng0IHdpdGhGbGFnVyhib29sIHcpOwoKICAvLy8gTWVyZ2UgW3RydWVWYWx1ZV0gYW5kIFtmYWxzZVZhbHVlXSBiYXNlZCBvbiBbdGhpc10nIGJpdCBtYXNrOgogIC8vLyBTZWxlY3QgYml0IGZyb20gW3RydWVWYWx1ZV0gd2hlbiBiaXQgaW4gW3RoaXNdIGlzIG9uLgogIC8vLyBTZWxlY3QgYml0IGZyb20gW2ZhbHNlVmFsdWVdIHdoZW4gYml0IGluIFt0aGlzXSBpcyBvZmYuCiAgRmxvYXQzMng0IHNlbGVjdChGbG9hdDMyeDQgdHJ1ZVZhbHVlLCBGbG9hdDMyeDQgZmFsc2VWYWx1ZSk7Cn0KCi8qKgogKiBGbG9hdDY0eDIgaW1tdXRhYmxlIHZhbHVlIHR5cGUgYW5kIG9wZXJhdGlvbnMuCiAqCiAqIEZsb2F0NjR4MiBzdG9yZXMgMiA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluICJsYW5lcyIuCiAqIFRoZSBsYW5lcyBhcmUgIngiIGFuZCAieSIgcmVzcGVjdGl2ZWx5LgogKi8KYWJzdHJhY3QgY2xhc3MgRmxvYXQ2NHgyIHsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mihkb3VibGUgeCwgZG91YmxlIHkpOwogIGV4dGVybmFsIGZhY3RvcnkgRmxvYXQ2NHgyLnNwbGF0KGRvdWJsZSB2KTsKICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mi56ZXJvKCk7CgogIC8vLyBVc2VzIHRoZSAieCIgYW5kICJ5IiBsYW5lcyBmcm9tIFt2XS4KICBleHRlcm5hbCBmYWN0b3J5IEZsb2F0NjR4Mi5mcm9tRmxvYXQzMng0KEZsb2F0MzJ4NCB2KTsKCiAgLy8vIEFkZGl0aW9uIG9wZXJhdG9yLgogIEZsb2F0NjR4MiBvcGVyYXRvciArKEZsb2F0NjR4MiBvdGhlcik7CgogIC8vLyBOZWdhdGUgb3BlcmF0b3IuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIC0oKTsKCiAgLy8vIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgogIEZsb2F0NjR4MiBvcGVyYXRvciAtKEZsb2F0NjR4MiBvdGhlcik7CgogIC8vLyBNdWx0aXBsaWNhdGlvbiBvcGVyYXRvci4KICBGbG9hdDY0eDIgb3BlcmF0b3IgKihGbG9hdDY0eDIgb3RoZXIpOwoKICAvLy8gRGl2aXNpb24gb3BlcmF0b3IuCiAgRmxvYXQ2NHgyIG9wZXJhdG9yIC8oRmxvYXQ2NHgyIG90aGVyKTsKCiAgLy8vIFJldHVybnMgYSBjb3B5IG9mIFt0aGlzXSBlYWNoIGxhbmUgYmVpbmcgc2NhbGVkIGJ5IFtzXS4KICAvLy8gRXF1aXZhbGVudCB0byB0aGlzICogbmV3IEZsb2F0NjR4Mi5zcGxhdChzKQogIEZsb2F0NjR4MiBzY2FsZShkb3VibGUgcyk7CgogIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbRmxvYXQ2NHgyXS4KICBGbG9hdDY0eDIgYWJzKCk7CgogIC8vLyBMYW5lLXdpc2UgY2xhbXAgW3RoaXNdIHRvIGJlIGluIHRoZSByYW5nZSBbbG93ZXJMaW1pdF0tW3VwcGVyTGltaXRdLgogIEZsb2F0NjR4MiBjbGFtcChGbG9hdDY0eDIgbG93ZXJMaW1pdCwgRmxvYXQ2NHgyIHVwcGVyTGltaXQpOwoKICAvLy8gRXh0cmFjdGVkIHggdmFsdWUuCiAgZG91YmxlIGdldCB4OwoKICAvLy8gRXh0cmFjdGVkIHkgdmFsdWUuCiAgZG91YmxlIGdldCB5OwoKICAvLy8gRXh0cmFjdCB0aGUgc2lnbiBiaXRzIGZyb20gZWFjaCBsYW5lIHJldHVybiB0aGVtIGluIHRoZSBmaXJzdCAyIGJpdHMuCiAgLy8vICJ4IiBsYW5lIGlzIGJpdCAwLgogIC8vLyAieSIgbGFuZSBpcyBiaXQgMS4KICBpbnQgZ2V0IHNpZ25NYXNrOwoKICAvLy8gUmV0dXJucyBhIG5ldyBbRmxvYXQ2NHgyXSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB4IHZhbHVlLgogIEZsb2F0NjR4MiB3aXRoWChkb3VibGUgeCk7CgogIC8vLyBSZXR1cm5zIGEgbmV3IFtGbG9hdDY0eDJdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHkgdmFsdWUuCiAgRmxvYXQ2NHgyIHdpdGhZKGRvdWJsZSB5KTsKCiAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBtaW5pbXVtIHZhbHVlIGluIFt0aGlzXSBvciBbb3RoZXJdLgogIEZsb2F0NjR4MiBtaW4oRmxvYXQ2NHgyIG90aGVyKTsKCiAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBtYXhpbXVtIHZhbHVlIGluIFt0aGlzXSBvciBbb3RoZXJdLgogIEZsb2F0NjR4MiBtYXgoRmxvYXQ2NHgyIG90aGVyKTsKCiAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBzcXVhcmUgcm9vdCBvZiBbdGhpc10uCiAgRmxvYXQ2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dGhlIGltcG9ydHMKLy8vIHVzZWQgYnkgcGF0Y2hlcyBvZiB0aGF0IGxpYnJhcnkuIFdlIHBsYW4gdG8gY2hhbmdlIHRoaXMgd2hlbiB3ZSBoYXZlIGEKLy8vIHNoYXJlZCBmcm9udCBlbmQgYW5kIHNpbXBseSB1c2UgcGFydHMuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIgogICAgc2hvdwogICAgICAgIENsYXNzSUQsCiAgICAgICAgQ29kZVVuaXRzLAogICAgICAgIEV4cGFuZEl0ZXJhYmxlLAogICAgICAgIEZvbGxvd2VkQnlJdGVyYWJsZSwKICAgICAgICBJdGVyYWJsZUVsZW1lbnRFcnJvciwKICAgICAgICBMaXN0TWFwVmlldywKICAgICAgICBMaXN0cywKICAgICAgICBNYXBwZWRJdGVyYWJsZSwKICAgICAgICBNYXBwZWRJdGVyYWJsZSwKICAgICAgICBSZXZlcnNlZExpc3RJdGVyYWJsZSwKICAgICAgICBTa2lwV2hpbGVJdGVyYWJsZSwKICAgICAgICBTb3J0LAogICAgICAgIFN1Ykxpc3RJdGVyYWJsZSwKICAgICAgICBUYWtlV2hpbGVJdGVyYWJsZSwKICAgICAgICBXaGVyZUl0ZXJhYmxlLAogICAgICAgIFdoZXJlVHlwZUl0ZXJhYmxlLAogICAgICAgIHBhdGNoOwoKaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iIHNob3cgTGlzdEJhc2U7CgppbXBvcnQgJ2RhcnQ6bWF0aCcgc2hvdyBSYW5kb207CgovLy8gVGhlcmUgYXJlIG5vIHBhcnRzIGluIHBhdGNoIGxpYnJhcnk6CgpAcGF0Y2gKY2xhc3MgQnl0ZURhdGEgaW1wbGVtZW50cyBUeXBlZERhdGEgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBmYWN0b3J5IEJ5dGVEYXRhKGludCBsZW5ndGgpIHsKICAgIGZpbmFsIGxpc3QgPSBuZXcgVWludDhMaXN0KGxlbmd0aCkgYXMgX1R5cGVkTGlzdDsKICAgIF9yYW5nZUNoZWNrKGxpc3QubGVuZ3RoSW5CeXRlcywgMCwgbGVuZ3RoKTsKICAgIHJldHVybiBuZXcgX0J5dGVEYXRhVmlldyhsaXN0LCAwLCBsZW5ndGgpOwogIH0KCiAgLy8gQ2FsbGVkIGRpcmVjdGx5IGZyb20gQyBjb2RlLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBmYWN0b3J5IEJ5dGVEYXRhLl92aWV3KF9UeXBlZExpc3QgdHlwZWREYXRhLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgewogICAgX3JhbmdlQ2hlY2sodHlwZWREYXRhLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgICByZXR1cm4gbmV3IF9CeXRlRGF0YVZpZXcodHlwZWREYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KfQoKLy8gQmFzZWQgY2xhc3MgZm9yIF9UeXBlZExpc3QgdGhhdCBwcm92aWRlcyBjb21tb24gbWV0aG9kcyBmb3IgaW1wbGVtZW50aW5nCi8vIHRoZSBjb2xsZWN0aW9uIGFuZCBsaXN0IGludGVyZmFjZXMuCi8vIFRoaXMgY2xhc3MgZG9lcyBub3QgZXh0ZW5kIExpc3RCYXNlPFQ+IHNpbmNlIHRoYXQgd291bGQgYWRkIHR5cGUgYXJndW1lbnRzCi8vIHRvIGluc3RhbmNlcyBvZiBfVHlwZUxpc3RCYXNlLiBJbnN0ZWFkIHRoZSBzdWJjbGFzc2VzIHVzZSB0eXBlIHNwZWNpZmljCi8vIG1peGlucyAobGlrZSBfSW50TGlzdE1peGluLCBfRG91YmxlTGlzdE1peGluKSB0byBpbXBsZW1lbnQgTGlzdEJhc2U8VD4uCmFic3RyYWN0IGNsYXNzIF9UeXBlZExpc3RCYXNlIHsKICBpbnQgZ2V0IGxlbmd0aDsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgQ29sbGVjdGlvbiBpbnRlcmZhY2UuCiAgU3RyaW5nIGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWZmZXIud3JpdGVBbGwodGhpcyBhcyBJdGVyYWJsZSwgc2VwYXJhdG9yKTsKICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIGJvb2wgZ2V0IGlzRW1wdHkgewogICAgcmV0dXJuIHRoaXMubGVuZ3RoID09IDA7CiAgfQoKICBib29sIGdldCBpc05vdEVtcHR5ID0+ICFpc0VtcHR5OwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KCiAgc2V0IGxlbmd0aChuZXdMZW5ndGgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVzaXplIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgY2xlYXIoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIGJvb2wgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVtb3ZlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGUgaXRlcmFibGUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBPYmplY3QgaW50ZXJmYWNlLgogIFN0cmluZyB0b1N0cmluZygpID0+IExpc3RCYXNlLmxpc3RUb1N0cmluZyh0aGlzIGFzIExpc3QpOwoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCgogIC8vIFJldHVybnMgdHJ1ZSBpZiBvcGVyYXRpb24gc3VjY2VlZHMuCiAgLy8gJ2Zyb21DaWQnIGFuZCAndG9DaWQnIG1heSBiZSBjaWQtcyBvZiB0aGUgdmlld3MgYW5kIHRoZXJlZm9yZSBtYXkgbm90CiAgLy8gbWF0Y2ggdGhlIGNpZHMgb2YgJ3RoaXMnIGFuZCAnZnJvbScuCiAgLy8gVXNlcyB0b0NpZCBhbmQgZnJvbUNpZCB0byBkZWNpZGUgaWYgY2xhbXBpbmcgaXMgbmVjZXNzYXJ5LgogIC8vIEVsZW1lbnQgc2l6ZSBvZiB0b0NpZCBhbmQgZnJvbUNpZCBtdXN0IG1hdGNoICh0ZXN0IGF0IGNhbGxlcikuCiAgYm9vbCBfc2V0UmFuZ2UoaW50IHN0YXJ0SW5CeXRlcywgaW50IGxlbmd0aEluQnl0ZXMsIF9UeXBlZExpc3RCYXNlIGZyb20sCiAgICAgIGludCBzdGFydEZyb21JbkJ5dGVzLCBpbnQgdG9DaWQsIGludCBmcm9tQ2lkKSBuYXRpdmUgIlR5cGVkRGF0YV9zZXRSYW5nZSI7Cn0KCmFic3RyYWN0IGNsYXNzIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBMaXN0PGludD4gewogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzOwogIGludCBnZXQgb2Zmc2V0SW5CeXRlczsKICBfQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyOwoKICBMaXN0PGludD4gX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCk7CgogIEl0ZXJhYmxlPFQ+IHdoZXJlVHlwZTxUPigpID0+IG5ldyBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgSXRlcmFibGU8aW50PiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPGludD4gb3RoZXIpID0+CiAgICAgIG5ldyBGb2xsb3dlZEJ5SXRlcmFibGU8aW50Pi5maXJzdEVmZmljaWVudCh0aGlzLCBvdGhlcik7CgogIExpc3Q8Uj4gY2FzdDxSPigpID0+IExpc3QuY2FzdEZyb208aW50LCBSPih0aGlzKTsKICB2b2lkIHNldCBmaXJzdChpbnQgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbMF0gPSB2YWx1ZTsKICB9CgogIHZvaWQgc2V0IGxhc3QoaW50IHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gPSB2YWx1ZTsKICB9CgogIGludCBpbmRleFdoZXJlKGJvb2wgdGVzdChpbnQgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChpbnQgZWxlbWVudCksIFtpbnQgc3RhcnRdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIExpc3Q8aW50PiBvcGVyYXRvciArKExpc3Q8aW50PiBvdGhlcikgewogICAgaW50IHRvdGFsTGVuZ3RoID0gdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGg7CiAgICByZXR1cm4gPGludD5bXQogICAgICAuLmxlbmd0aCA9IHRvdGFsTGVuZ3RoCiAgICAgIC4uc2V0UmFuZ2UoMCwgdGhpcy5sZW5ndGgsIHRoaXMpCiAgICAgIC4uc2V0UmFuZ2UodGhpcy5sZW5ndGgsIHRvdGFsTGVuZ3RoLCBvdGhlcik7CiAgfQoKICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdm9pZCBzaHVmZmxlKFtSYW5kb20gcmFuZG9tXSkgewogICAgcmFuZG9tID8/PSBuZXcgUmFuZG9tKCk7CiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoOwogICAgd2hpbGUgKGkgPiAxKSB7CiAgICAgIGludCBwb3MgPSByYW5kb20ubmV4dEludChpKTsKICAgICAgaSAtPSAxOwogICAgICB2YXIgdG1wID0gdGhpc1tpXTsKICAgICAgdGhpc1tpXSA9IHRoaXNbcG9zXTsKICAgICAgdGhpc1twb3NdID0gdG1wOwogICAgfQogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPGludD4gZnJvbSwgW2ludCBza2lwQ291bnQgPSAwXSkgewogICAgLy8gQ2hlY2sgcmFuZ2VzLgogICAgaWYgKDAgPiBzdGFydCB8fCBzdGFydCA+IGVuZCB8fCBlbmQgPiBsZW5ndGgpIHsKICAgICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgbGVuZ3RoKTsgLy8gQWx3YXlzIHRocm93cy4KICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgIH0KICAgIGlmIChza2lwQ291bnQgPCAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHNraXBDb3VudCk7CiAgICB9CgogICAgZmluYWwgY291bnQgPSBlbmQgLSBzdGFydDsKICAgIGlmICgoZnJvbS5sZW5ndGggLSBza2lwQ291bnQpIDwgY291bnQpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CgogICAgaWYgKGNvdW50ID09IDApIHJldHVybjsKCiAgICBpZiAoZnJvbSBpcyBfVHlwZWRMaXN0QmFzZSkgewogICAgICAvLyBOb3RlOiBfVHlwZWRMaXN0QmFzZSBpcyBub3QgcmVsYXRlZCB0byBJdGVyYWJsZTxpbnQ+IHNvIHRoZXJlIGlzCiAgICAgIC8vIG5vIHByb21vdGlvbiBoZXJlLgogICAgICBmaW5hbCBmcm9tQXNUeXBlZExpc3QgPSBmcm9tIGFzIF9UeXBlZExpc3RCYXNlOwogICAgICBpZiAodGhpcy5lbGVtZW50U2l6ZUluQnl0ZXMgPT0gZnJvbUFzVHlwZWRMaXN0LmVsZW1lbnRTaXplSW5CeXRlcykgewogICAgICAgIGlmICgoY291bnQgPCAxMCkgJiYgKGZyb21Bc1R5cGVkTGlzdC5idWZmZXIgIT0gdGhpcy5idWZmZXIpKSB7CiAgICAgICAgICBMaXN0cy5jb3B5KGZyb20gYXMgTGlzdDxpbnQ+LCBza2lwQ291bnQsIHRoaXMsIHN0YXJ0LCBjb3VudCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJ1ZmZlci5fZGF0YS5fc2V0UmFuZ2UoCiAgICAgICAgICAgIHN0YXJ0ICogZWxlbWVudFNpemVJbkJ5dGVzICsgdGhpcy5vZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBjb3VudCAqIGVsZW1lbnRTaXplSW5CeXRlcywKICAgICAgICAgICAgZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlci5fZGF0YSwKICAgICAgICAgICAgc2tpcENvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzICsgZnJvbUFzVHlwZWRMaXN0Lm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIENsYXNzSUQuZ2V0SUQodGhpcyksCiAgICAgICAgICAgIENsYXNzSUQuZ2V0SUQoZnJvbSkpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGZyb21Bc1R5cGVkTGlzdC5idWZmZXIgPT0gdGhpcy5idWZmZXIpIHsKICAgICAgICAvLyBEaWZmZXJlbnQgZWxlbWVudCBzaXplcywgYnV0IHNhbWUgYnVmZmVyIG1lYW5zIHRoYXQgd2UgbmVlZAogICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBzdHJ1Y3R1cmUuCiAgICAgICAgLy8gVE9ETyhzcmRqYW4pOiBPcHRpbWl6ZSB0byBza2lwIGNvcHlpbmcgaWYgdGhlIHJhbmdlIGRvZXMgbm90IG92ZXJsYXAuCiAgICAgICAgZmluYWwgZnJvbUFzTGlzdCA9IGZyb20gYXMgTGlzdDxpbnQ+OwogICAgICAgIGZpbmFsIHRlbXBCdWZmZXIgPSBfY3JlYXRlTGlzdChjb3VudCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICB0ZW1wQnVmZmVyW2ldID0gZnJvbUFzTGlzdFtza2lwQ291bnQgKyBpXTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgIHRoaXNbaV0gPSB0ZW1wQnVmZmVyW2kgLSBzdGFydF07CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIExpc3Qgb3RoZXJMaXN0OwogICAgaW50IG90aGVyU3RhcnQ7CiAgICBpZiAoZnJvbSBpcyBMaXN0PGludD4pIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbTsKICAgICAgb3RoZXJTdGFydCA9IHNraXBDb3VudDsKICAgIH0gZWxzZSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb20uc2tpcChza2lwQ291bnQpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICBvdGhlclN0YXJ0ID0gMDsKICAgIH0KICAgIGlmIChvdGhlclN0YXJ0ICsgY291bnQgPiBvdGhlckxpc3QubGVuZ3RoKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQogICAgTGlzdHMuY29weShvdGhlckxpc3QsIG90aGVyU3RhcnQsIHRoaXMsIHN0YXJ0LCBjb3VudCk7CiAgfQoKICBJdGVyYWJsZTxpbnQ+IHdoZXJlKGJvb2wgZihpbnQgZWxlbWVudCkpID0+IG5ldyBXaGVyZUl0ZXJhYmxlPGludD4odGhpcywgZik7CgogIEl0ZXJhYmxlPGludD4gdGFrZShpbnQgbikgPT4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxpbnQ+KHRoaXMsIDAsIG4pOwoKICBJdGVyYWJsZTxpbnQ+IHRha2VXaGlsZShib29sIHRlc3QoaW50IGVsZW1lbnQpKSA9PgogICAgICBuZXcgVGFrZVdoaWxlSXRlcmFibGU8aW50Pih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8aW50PiBza2lwKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPGludD4odGhpcywgbiwgbnVsbCk7CgogIEl0ZXJhYmxlPGludD4gc2tpcFdoaWxlKGJvb2wgdGVzdChpbnQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBTa2lwV2hpbGVJdGVyYWJsZTxpbnQ+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxpbnQ+IGdldCByZXZlcnNlZCA9PiBuZXcgUmV2ZXJzZWRMaXN0SXRlcmFibGU8aW50Pih0aGlzKTsKCiAgTWFwPGludCwgaW50PiBhc01hcCgpID0+IG5ldyBMaXN0TWFwVmlldzxpbnQ+KHRoaXMpOwoKICBJdGVyYWJsZTxpbnQ+IGdldFJhbmdlKGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxpbnQ+KHRoaXMsIHN0YXJ0LCBlbmQpOwogIH0KCiAgSXRlcmF0b3I8aW50PiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9UeXBlZExpc3RJdGVyYXRvcjxpbnQ+KHRoaXMpOwoKICBMaXN0PGludD4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgcmV0dXJuIG5ldyBMaXN0PGludD4uZnJvbSh0aGlzLCBncm93YWJsZTogZ3Jvd2FibGUpOwogIH0KCiAgU2V0PGludD4gdG9TZXQoKSB7CiAgICByZXR1cm4gbmV3IFNldDxpbnQ+LmZyb20odGhpcyk7CiAgfQoKICB2b2lkIGZvckVhY2godm9pZCBmKGludCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBmKHRoaXNbaV0pOwogICAgfQogIH0KCiAgaW50IHJlZHVjZShpbnQgY29tYmluZShpbnQgdmFsdWUsIGludCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbiA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHZhciB2YWx1ZSA9IHRoaXNbMF07CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIGluaXRpYWxWYWx1ZSwgaW50IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGluaXRpYWxWYWx1ZSA9IGNvbWJpbmUoaW5pdGlhbFZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiBpbml0aWFsVmFsdWU7CiAgfQoKICBJdGVyYWJsZTxUPiBtYXA8VD4oVCBmKGludCBlbGVtZW50KSkgPT4gbmV3IE1hcHBlZEl0ZXJhYmxlPGludCwgVD4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IGV4cGFuZDxUPihJdGVyYWJsZTxUPiBmKGludCBlbGVtZW50KSkgPT4KICAgICAgbmV3IEV4cGFuZEl0ZXJhYmxlPGludCwgVD4odGhpcywgZik7CgogIGJvb2wgZXZlcnkoYm9vbCBmKGludCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAoIWYodGhpc1tpXSkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgYm9vbCBhbnkoYm9vbCBmKGludCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAoZih0aGlzW2ldKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpbnQgZmlyc3RXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpLCB7aW50IG9yRWxzZSgpfSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBpbnQgbGFzdFdoZXJlKGJvb2wgdGVzdChpbnQgZWxlbWVudCksIHtpbnQgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICB9CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgaW50IHNpbmdsZVdoZXJlKGJvb2wgdGVzdChpbnQgZWxlbWVudCksIHtpbnQgb3JFbHNlKCl9KSB7CiAgICB2YXIgcmVzdWx0ID0gbnVsbDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHsKICAgICAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKICAgICAgICBmb3VuZE1hdGNoaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kTWF0Y2hpbmcpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgaW50IGVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgIHJldHVybiB0aGlzW2luZGV4XTsKICB9CgogIHZvaWQgYWRkKGludCB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8aW50PiB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxpbnQ+IHZhbHVlcykgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKGludCBhLCBpbnQgYildKSB7CiAgICBTb3J0LnNvcnQodGhpcywgY29tcGFyZSA/PyBDb21wYXJhYmxlLmNvbXBhcmUpOwogIH0KCiAgaW50IGluZGV4T2YoaW50IGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHN0YXJ0ID0gMDsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoaW50IGVsZW1lbnQsIFtpbnQgc3RhcnQgPSBudWxsXSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IHJlbW92ZUxhc3QoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIGludCByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoaW50IGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KGludCBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBpbnQgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgaW50IGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgaW50IGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gdGhpc1swXTsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgfQoKICBMaXN0PGludD4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgTGlzdDxpbnQ+IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxpbnQ+IGl0ZXJhYmxlKSB7CiAgICBmaW5hbCBlbmQgPSBpdGVyYWJsZS5sZW5ndGggKyBpbmRleDsKICAgIHNldFJhbmdlKGluZGV4LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW2ludCBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0RvdWJsZUxpc3RNaXhpbiBpbXBsZW1lbnRzIExpc3Q8ZG91YmxlPiB7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CiAgaW50IGdldCBvZmZzZXRJbkJ5dGVzOwogIF9CeXRlQnVmZmVyIGdldCBidWZmZXI7CgogIExpc3Q8ZG91YmxlPiBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gbmV3IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxkb3VibGU+IGZvbGxvd2VkQnkoSXRlcmFibGU8ZG91YmxlPiBvdGhlcikgPT4KICAgICAgbmV3IEZvbGxvd2VkQnlJdGVyYWJsZTxkb3VibGU+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxkb3VibGUsIFI+KHRoaXMpOwogIHZvaWQgc2V0IGZpcnN0KGRvdWJsZSB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1swXSA9IHZhbHVlOwogIH0KCiAgdm9pZCBzZXQgbGFzdChkb3VibGUgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSwgW2ludCBzdGFydF0pIHsKICAgIGlmIChzdGFydCA9PSBudWxsIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgTGlzdDxkb3VibGU+IG9wZXJhdG9yICsoTGlzdDxkb3VibGU+IG90aGVyKSB7CiAgICBpbnQgdG90YWxMZW5ndGggPSB0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aDsKICAgIHJldHVybiA8ZG91YmxlPltdCiAgICAgIC4ubGVuZ3RoID0gdG90YWxMZW5ndGgKICAgICAgLi5zZXRSYW5nZSgwLCB0aGlzLmxlbmd0aCwgdGhpcykKICAgICAgLi5zZXRSYW5nZSh0aGlzLmxlbmd0aCwgdG90YWxMZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgY29udGFpbnMoT2JqZWN0IGVsZW1lbnQpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKSB7CiAgICByYW5kb20gPz89IG5ldyBSYW5kb20oKTsKICAgIHZhciBpID0gdGhpcy5sZW5ndGg7CiAgICB3aGlsZSAoaSA+IDEpIHsKICAgICAgaW50IHBvcyA9IHJhbmRvbS5uZXh0SW50KGkpOwogICAgICBpIC09IDE7CiAgICAgIHZhciB0bXAgPSB0aGlzW2ldOwogICAgICB0aGlzW2ldID0gdGhpc1twb3NdOwogICAgICB0aGlzW3Bvc10gPSB0bXA7CiAgICB9CiAgfQoKICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8ZG91YmxlPiBmcm9tLAogICAgICBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICAvLyBDaGVjayByYW5nZXMuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gZW5kIHx8IGVuZCA+IGxlbmd0aCkgewogICAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOyAvLyBBbHdheXMgdGhyb3dzLgogICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQogICAgaWYgKHNraXBDb3VudCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc2tpcENvdW50KTsKICAgIH0KCiAgICBmaW5hbCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKChmcm9tLmxlbmd0aCAtIHNraXBDb3VudCkgPCBjb3VudCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KCiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOwoKICAgIGlmIChmcm9tIGlzIF9UeXBlZExpc3RCYXNlKSB7CiAgICAgIC8vIE5vdGU6IF9UeXBlZExpc3RCYXNlIGlzIG5vdCByZWxhdGVkIHRvIEl0ZXJhYmxlPGRvdWJsZT4gc28gdGhlcmUgaXMKICAgICAgLy8gbm8gcHJvbW90aW9uIGhlcmUuCiAgICAgIGZpbmFsIGZyb21Bc1R5cGVkTGlzdCA9IGZyb20gYXMgX1R5cGVkTGlzdEJhc2U7CiAgICAgIGlmICh0aGlzLmVsZW1lbnRTaXplSW5CeXRlcyA9PSBmcm9tQXNUeXBlZExpc3QuZWxlbWVudFNpemVJbkJ5dGVzKSB7CiAgICAgICAgaWYgKChjb3VudCA8IDEwKSAmJiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciAhPSB0aGlzLmJ1ZmZlcikpIHsKICAgICAgICAgIExpc3RzLmNvcHkoZnJvbSBhcyBMaXN0PGRvdWJsZT4sIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVmZmVyLl9kYXRhLl9zZXRSYW5nZSgKICAgICAgICAgICAgc3RhcnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyB0aGlzLm9mZnNldEluQnl0ZXMsCiAgICAgICAgICAgIGNvdW50ICogZWxlbWVudFNpemVJbkJ5dGVzLAogICAgICAgICAgICBmcm9tQXNUeXBlZExpc3QuYnVmZmVyLl9kYXRhLAogICAgICAgICAgICBza2lwQ291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMgKyBmcm9tQXNUeXBlZExpc3Qub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRCh0aGlzKSwKICAgICAgICAgICAgQ2xhc3NJRC5nZXRJRChmcm9tKSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZnJvbUFzVHlwZWRMaXN0LmJ1ZmZlciA9PSB0aGlzLmJ1ZmZlcikgewogICAgICAgIC8vIERpZmZlcmVudCBlbGVtZW50IHNpemVzLCBidXQgc2FtZSBidWZmZXIgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0cnVjdHVyZS4KICAgICAgICAvLyBUT0RPKHNyZGphbik6IE9wdGltaXplIHRvIHNraXAgY29weWluZyBpZiB0aGUgcmFuZ2UgZG9lcyBub3Qgb3ZlcmxhcC4KICAgICAgICBmaW5hbCBmcm9tQXNMaXN0ID0gZnJvbSBhcyBMaXN0PGRvdWJsZT47CiAgICAgICAgZmluYWwgdGVtcEJ1ZmZlciA9IF9jcmVhdGVMaXN0KGNvdW50KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIHRlbXBCdWZmZXJbaV0gPSBmcm9tQXNMaXN0W3NraXBDb3VudCArIGldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgdGhpc1tpXSA9IHRlbXBCdWZmZXJbaSAtIHN0YXJ0XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgTGlzdCBvdGhlckxpc3Q7CiAgICBpbnQgb3RoZXJTdGFydDsKICAgIGlmIChmcm9tIGlzIExpc3Q8ZG91YmxlPikgewogICAgICBvdGhlckxpc3QgPSBmcm9tOwogICAgICBvdGhlclN0YXJ0ID0gc2tpcENvdW50OwogICAgfSBlbHNlIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbS5za2lwKHNraXBDb3VudCkudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgIG90aGVyU3RhcnQgPSAwOwogICAgfQogICAgaWYgKG90aGVyU3RhcnQgKyBjb3VudCA+IG90aGVyTGlzdC5sZW5ndGgpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vRmV3KCk7CiAgICB9CiAgICBMaXN0cy5jb3B5KG90aGVyTGlzdCwgb3RoZXJTdGFydCwgdGhpcywgc3RhcnQsIGNvdW50KTsKICB9CgogIEl0ZXJhYmxlPGRvdWJsZT4gd2hlcmUoYm9vbCBmKGRvdWJsZSBlbGVtZW50KSkgPT4KICAgICAgbmV3IFdoZXJlSXRlcmFibGU8ZG91YmxlPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8ZG91YmxlPiB0YWtlKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPGRvdWJsZT4odGhpcywgMCwgbik7CgogIEl0ZXJhYmxlPGRvdWJsZT4gdGFrZVdoaWxlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCkpID0+CiAgICAgIG5ldyBUYWtlV2hpbGVJdGVyYWJsZTxkb3VibGU+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxkb3VibGU+IHNraXAoaW50IG4pID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8ZG91YmxlPih0aGlzLCBuLCBudWxsKTsKCiAgSXRlcmFibGU8ZG91YmxlPiBza2lwV2hpbGUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSkgPT4KICAgICAgbmV3IFNraXBXaGlsZUl0ZXJhYmxlPGRvdWJsZT4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPGRvdWJsZT4gZ2V0IHJldmVyc2VkID0+IG5ldyBSZXZlcnNlZExpc3RJdGVyYWJsZTxkb3VibGU+KHRoaXMpOwoKICBNYXA8aW50LCBkb3VibGU+IGFzTWFwKCkgPT4gbmV3IExpc3RNYXBWaWV3PGRvdWJsZT4odGhpcyk7CgogIEl0ZXJhYmxlPGRvdWJsZT4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIHJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlPGRvdWJsZT4odGhpcywgc3RhcnQsIGVuZCk7CiAgfQoKICBJdGVyYXRvcjxkb3VibGU+IGdldCBpdGVyYXRvciA9PiBuZXcgX1R5cGVkTGlzdEl0ZXJhdG9yPGRvdWJsZT4odGhpcyk7CgogIExpc3Q8ZG91YmxlPiB0b0xpc3Qoe2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IExpc3Q8ZG91YmxlPi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CiAgfQoKICBTZXQ8ZG91YmxlPiB0b1NldCgpIHsKICAgIHJldHVybiBuZXcgU2V0PGRvdWJsZT4uZnJvbSh0aGlzKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoZG91YmxlIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBkb3VibGUgcmVkdWNlKGRvdWJsZSBjb21iaW5lKGRvdWJsZSB2YWx1ZSwgZG91YmxlIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpZiAobGVuID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdmFyIHZhbHVlID0gdGhpc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFsdWUgPSBjb21iaW5lKHZhbHVlLCB0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CgogIFQgZm9sZDxUPihUIGluaXRpYWxWYWx1ZSwgVCBjb21iaW5lKFQgaW5pdGlhbFZhbHVlLCBkb3VibGUgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaW5pdGlhbFZhbHVlID0gY29tYmluZShpbml0aWFsVmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKICB9CgogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoZG91YmxlIGVsZW1lbnQpKSA9PgogICAgICBuZXcgTWFwcGVkSXRlcmFibGU8ZG91YmxlLCBUPih0aGlzLCBmKTsKCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoZG91YmxlIGVsZW1lbnQpKSA9PgogICAgICBuZXcgRXhwYW5kSXRlcmFibGU8ZG91YmxlLCBUPih0aGlzLCBmKTsKCiAgYm9vbCBldmVyeShib29sIGYoZG91YmxlIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmICghZih0aGlzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBib29sIGFueShib29sIGYoZG91YmxlIGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChmKHRoaXNbaV0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGRvdWJsZSBmaXJzdFdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCksIHtkb3VibGUgb3JFbHNlKCl9KSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHJldHVybiBlbGVtZW50OwogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIGRvdWJsZSBsYXN0V2hlcmUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSwge2RvdWJsZSBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkgewogICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07CiAgICAgIGlmICh0ZXN0KGVsZW1lbnQpKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgIH0KICAgIH0KICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBkb3VibGUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KGRvdWJsZSBlbGVtZW50KSwge2RvdWJsZSBvckVsc2UoKX0pIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgYm9vbCBmb3VuZE1hdGNoaW5nID0gZmFsc2U7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBkb3VibGUgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgdm9pZCBhZGQoZG91YmxlIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGFkZEFsbChJdGVyYWJsZTxkb3VibGU+IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGFkZCB0byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPGRvdWJsZT4gdmFsdWVzKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgc29ydChbaW50IGNvbXBhcmUoZG91YmxlIGEsIGRvdWJsZSBiKV0pIHsKICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlID8/IENvbXBhcmFibGUuY29tcGFyZSk7CiAgfQoKICBpbnQgaW5kZXhPZihkb3VibGUgZWxlbWVudCwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgc3RhcnQgPSAwOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhPZihkb3VibGUgZWxlbWVudCwgW2ludCBzdGFydCA9IG51bGxdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgewogICAgICBzdGFydCA9IHRoaXMubGVuZ3RoIC0gMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBkb3VibGUgcmVtb3ZlTGFzdCgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgZG91YmxlIHJlbW92ZUF0KGludCBpbmRleCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChkb3VibGUgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZXRhaW5XaGVyZShib29sIHRlc3QoZG91YmxlIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIGRvdWJsZSBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzWzBdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBkb3VibGUgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzW2xlbmd0aCAtIDFdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBkb3VibGUgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID09IDEpIHJldHVybiB0aGlzWzBdOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICB9CgogIExpc3Q8ZG91YmxlPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBMaXN0PGRvdWJsZT4gcmVzdWx0ID0gX2NyZWF0ZUxpc3QobGVuZ3RoKTsKICAgIHJlc3VsdC5zZXRSYW5nZSgwLCBsZW5ndGgsIHRoaXMsIHN0YXJ0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPGRvdWJsZT4gaXRlcmFibGUpIHsKICAgIGZpbmFsIGVuZCA9IGl0ZXJhYmxlLmxlbmd0aCArIGluZGV4OwogICAgc2V0UmFuZ2UoaW5kZXgsIGVuZCwgaXRlcmFibGUpOwogIH0KCiAgdm9pZCBmaWxsUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBbZG91YmxlIGZpbGxWYWx1ZV0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7CiAgICAgIHRoaXNbaV0gPSBmaWxsVmFsdWU7CiAgICB9CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfRmxvYXQzMng0TGlzdE1peGluIGltcGxlbWVudHMgTGlzdDxGbG9hdDMyeDQ+IHsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgTGlzdDxGbG9hdDMyeDQ+IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBuZXcgV2hlcmVUeXBlSXRlcmFibGU8VD4odGhpcyk7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gZm9sbG93ZWRCeShJdGVyYWJsZTxGbG9hdDMyeDQ+IG90aGVyKSA9PgogICAgICBuZXcgRm9sbG93ZWRCeUl0ZXJhYmxlPEZsb2F0MzJ4ND4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwoKICBMaXN0PFI+IGNhc3Q8Uj4oKSA9PiBMaXN0LmNhc3RGcm9tPEZsb2F0MzJ4NCwgUj4odGhpcyk7CiAgdm9pZCBzZXQgZmlyc3QoRmxvYXQzMng0IHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzWzBdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldCBsYXN0KEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1t0aGlzLmxlbmd0aCAtIDFdID0gdmFsdWU7CiAgfQoKICBpbnQgaW5kZXhXaGVyZShib29sIHRlc3QoRmxvYXQzMng0IGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhXaGVyZShib29sIHRlc3QoRmxvYXQzMng0IGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBMaXN0PEZsb2F0MzJ4ND4gb3BlcmF0b3IgKyhMaXN0PEZsb2F0MzJ4ND4gb3RoZXIpIHsKICAgIGludCB0b3RhbExlbmd0aCA9IHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoOwogICAgcmV0dXJuIDxGbG9hdDMyeDQ+W10KICAgICAgLi5sZW5ndGggPSB0b3RhbExlbmd0aAogICAgICAuLnNldFJhbmdlKDAsIHRoaXMubGVuZ3RoLCB0aGlzKQogICAgICAuLnNldFJhbmdlKHRoaXMubGVuZ3RoLCB0b3RhbExlbmd0aCwgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgc2h1ZmZsZShbUmFuZG9tIHJhbmRvbV0pIHsKICAgIHJhbmRvbSA/Pz0gbmV3IFJhbmRvbSgpOwogICAgdmFyIGkgPSB0aGlzLmxlbmd0aDsKICAgIHdoaWxlIChpID4gMSkgewogICAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQoaSk7CiAgICAgIGkgLT0gMTsKICAgICAgdmFyIHRtcCA9IHRoaXNbaV07CiAgICAgIHRoaXNbaV0gPSB0aGlzW3Bvc107CiAgICAgIHRoaXNbcG9zXSA9IHRtcDsKICAgIH0KICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxGbG9hdDMyeDQ+IGZyb20sCiAgICAgIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIC8vIENoZWNrIHJhbmdlcy4KICAgIGlmICgwID4gc3RhcnQgfHwgc3RhcnQgPiBlbmQgfHwgZW5kID4gbGVuZ3RoKSB7CiAgICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxlbmd0aCk7IC8vIEFsd2F5cyB0aHJvd3MuCiAgICAgIGFzc2VydChmYWxzZSk7CiAgICB9CiAgICBpZiAoc2tpcENvdW50IDwgMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihza2lwQ291bnQpOwogICAgfQoKICAgIGZpbmFsIGNvdW50ID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAoKGZyb20ubGVuZ3RoIC0gc2tpcENvdW50KSA8IGNvdW50KSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm47CgogICAgaWYgKGZyb20gaXMgX1R5cGVkTGlzdEJhc2UpIHsKICAgICAgLy8gTm90ZTogX1R5cGVkTGlzdEJhc2UgaXMgbm90IHJlbGF0ZWQgdG8gSXRlcmFibGU8RmxvYXQzMng0PiBzbyB0aGVyZSBpcwogICAgICAvLyBubyBwcm9tb3Rpb24gaGVyZS4KICAgICAgZmluYWwgZnJvbUFzVHlwZWRMaXN0ID0gZnJvbSBhcyBfVHlwZWRMaXN0QmFzZTsKICAgICAgaWYgKHRoaXMuZWxlbWVudFNpemVJbkJ5dGVzID09IGZyb21Bc1R5cGVkTGlzdC5lbGVtZW50U2l6ZUluQnl0ZXMpIHsKICAgICAgICBpZiAoKGNvdW50IDwgMTApICYmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyICE9IHRoaXMuYnVmZmVyKSkgewogICAgICAgICAgTGlzdHMuY29weShmcm9tIGFzIExpc3Q8RmxvYXQzMng0Piwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgY291bnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5idWZmZXIuX2RhdGEuX3NldFJhbmdlKAogICAgICAgICAgICBzdGFydCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIHRoaXMub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgY291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMsCiAgICAgICAgICAgIGZyb21Bc1R5cGVkTGlzdC5idWZmZXIuX2RhdGEsCiAgICAgICAgICAgIHNraXBDb3VudCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIGZyb21Bc1R5cGVkTGlzdC5vZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBDbGFzc0lELmdldElEKHRoaXMpLAogICAgICAgICAgICBDbGFzc0lELmdldElEKGZyb20pKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyID09IHRoaXMuYnVmZmVyKSB7CiAgICAgICAgLy8gRGlmZmVyZW50IGVsZW1lbnQgc2l6ZXMsIGJ1dCBzYW1lIGJ1ZmZlciBtZWFucyB0aGF0IHdlIG5lZWQKICAgICAgICAvLyBhbiBpbnRlcm1lZGlhdGUgc3RydWN0dXJlLgogICAgICAgIC8vIFRPRE8oc3JkamFuKTogT3B0aW1pemUgdG8gc2tpcCBjb3B5aW5nIGlmIHRoZSByYW5nZSBkb2VzIG5vdCBvdmVybGFwLgogICAgICAgIGZpbmFsIGZyb21Bc0xpc3QgPSBmcm9tIGFzIExpc3Q8RmxvYXQzMng0PjsKICAgICAgICBmaW5hbCB0ZW1wQnVmZmVyID0gX2NyZWF0ZUxpc3QoY291bnQpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgdGVtcEJ1ZmZlcltpXSA9IGZyb21Bc0xpc3Rbc2tpcENvdW50ICsgaV07CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICB0aGlzW2ldID0gdGVtcEJ1ZmZlcltpIC0gc3RhcnRdOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBMaXN0IG90aGVyTGlzdDsKICAgIGludCBvdGhlclN0YXJ0OwogICAgaWYgKGZyb20gaXMgTGlzdDxGbG9hdDMyeDQ+KSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb207CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBmcm9tLnNraXAoc2tpcENvdW50KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgb3RoZXJTdGFydCA9IDA7CiAgICB9CiAgICBpZiAob3RoZXJTdGFydCArIGNvdW50ID4gb3RoZXJMaXN0Lmxlbmd0aCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KICAgIExpc3RzLmNvcHkob3RoZXJMaXN0LCBvdGhlclN0YXJ0LCB0aGlzLCBzdGFydCwgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RmxvYXQzMng0PiB3aGVyZShib29sIGYoRmxvYXQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgV2hlcmVJdGVyYWJsZTxGbG9hdDMyeDQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxGbG9hdDMyeDQ+IHRha2UoaW50IG4pID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQzMng0Pih0aGlzLCAwLCBuKTsKCiAgSXRlcmFibGU8RmxvYXQzMng0PiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFRha2VXaGlsZUl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEZsb2F0MzJ4ND4gc2tpcChpbnQgbikgPT4KICAgICAgbmV3IFN1Ykxpc3RJdGVyYWJsZTxGbG9hdDMyeDQ+KHRoaXMsIG4sIG51bGwpOwoKICBJdGVyYWJsZTxGbG9hdDMyeDQ+IHNraXBXaGlsZShib29sIHRlc3QoRmxvYXQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgU2tpcFdoaWxlSXRlcmFibGU8RmxvYXQzMng0Pih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8RmxvYXQzMng0PiBnZXQgcmV2ZXJzZWQgPT4gbmV3IFJldmVyc2VkTGlzdEl0ZXJhYmxlPEZsb2F0MzJ4ND4odGhpcyk7CgogIE1hcDxpbnQsIEZsb2F0MzJ4ND4gYXNNYXAoKSA9PiBuZXcgTGlzdE1hcFZpZXc8RmxvYXQzMng0Pih0aGlzKTsKCiAgSXRlcmFibGU8RmxvYXQzMng0PiBnZXRSYW5nZShpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQzMng0Pih0aGlzLCBzdGFydCwgZW5kKTsKICB9CgogIEl0ZXJhdG9yPEZsb2F0MzJ4ND4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBfVHlwZWRMaXN0SXRlcmF0b3I8RmxvYXQzMng0Pih0aGlzKTsKCiAgTGlzdDxGbG9hdDMyeDQ+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIHJldHVybiBuZXcgTGlzdDxGbG9hdDMyeDQ+LmZyb20odGhpcywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKICB9CgogIFNldDxGbG9hdDMyeDQ+IHRvU2V0KCkgewogICAgcmV0dXJuIG5ldyBTZXQ8RmxvYXQzMng0Pi5mcm9tKHRoaXMpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgIH0KICB9CgogIEZsb2F0MzJ4NCByZWR1Y2UoRmxvYXQzMng0IGNvbWJpbmUoRmxvYXQzMng0IHZhbHVlLCBGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB2YXIgdmFsdWUgPSB0aGlzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47ICsraSkgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBpbml0aWFsVmFsdWUsIEZsb2F0MzJ4NCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpbml0aWFsVmFsdWUgPSBjb21iaW5lKGluaXRpYWxWYWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gaW5pdGlhbFZhbHVlOwogIH0KCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihGbG9hdDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBNYXBwZWRJdGVyYWJsZTxGbG9hdDMyeDQsIFQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihGbG9hdDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBFeHBhbmRJdGVyYWJsZTxGbG9hdDMyeDQsIFQ+KHRoaXMsIGYpOwoKICBib29sIGV2ZXJ5KGJvb2wgZihGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKCFmKHRoaXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgZihGbG9hdDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKGYodGhpc1tpXSkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRmxvYXQzMng0IGZpcnN0V2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSwge0Zsb2F0MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRmxvYXQzMng0IGxhc3RXaGVyZShib29sIHRlc3QoRmxvYXQzMng0IGVsZW1lbnQpLCB7RmxvYXQzMng0IG9yRWxzZSgpfSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBzaW5nbGVXaGVyZShib29sIHRlc3QoRmxvYXQzMng0IGVsZW1lbnQpLCB7RmxvYXQzMng0IG9yRWxzZSgpfSkgewogICAgdmFyIHJlc3VsdCA9IG51bGw7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0MzJ4NCBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gdGhpc1tpbmRleF07CiAgfQoKICB2b2lkIGFkZChGbG9hdDMyeDQgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEZsb2F0MzJ4ND4gdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRmxvYXQzMng0IHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RmxvYXQzMng0PiB2YWx1ZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShGbG9hdDMyeDQgYSwgRmxvYXQzMng0IGIpXSkgewogICAgaWYgKGNvbXBhcmUgPT0gbnVsbCkgewogICAgICB0aHJvdyAiU0lNRCBkb24ndCBoYXZlIGRlZmF1bHQgY29tcGFyZS4iOwogICAgfQogICAgU29ydC5zb3J0KHRoaXMsIGNvbXBhcmUpOwogIH0KCiAgaW50IGluZGV4T2YoRmxvYXQzMng0IGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHN0YXJ0ID0gMDsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoRmxvYXQzMng0IGVsZW1lbnQsIFtpbnQgc3RhcnQgPSBudWxsXSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgRmxvYXQzMng0IHJlbW92ZUxhc3QoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIEZsb2F0MzJ4NCByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRmxvYXQzMng0IGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEZsb2F0MzJ4NCBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBGbG9hdDMyeDQgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRmxvYXQzMng0IGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRmxvYXQzMng0IGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gdGhpc1swXTsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgfQoKICBMaXN0PEZsb2F0MzJ4ND4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgTGlzdDxGbG9hdDMyeDQ+IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxGbG9hdDMyeDQ+IGl0ZXJhYmxlKSB7CiAgICBmaW5hbCBlbmQgPSBpdGVyYWJsZS5sZW5ndGggKyBpbmRleDsKICAgIHNldFJhbmdlKGluZGV4LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0Zsb2F0MzJ4NCBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0ludDMyeDRMaXN0TWl4aW4gaW1wbGVtZW50cyBMaXN0PEludDMyeDQ+IHsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgTGlzdDxJbnQzMng0PiBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKTsKCiAgSXRlcmFibGU8VD4gd2hlcmVUeXBlPFQ+KCkgPT4gbmV3IFdoZXJlVHlwZUl0ZXJhYmxlPFQ+KHRoaXMpOwoKICBJdGVyYWJsZTxJbnQzMng0PiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEludDMyeDQ+IG90aGVyKSA9PgogICAgICBuZXcgRm9sbG93ZWRCeUl0ZXJhYmxlPEludDMyeDQ+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKCiAgTGlzdDxSPiBjYXN0PFI+KCkgPT4gTGlzdC5jYXN0RnJvbTxJbnQzMng0LCBSPih0aGlzKTsKICB2b2lkIHNldCBmaXJzdChJbnQzMng0IHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzWzBdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldCBsYXN0KEludDMyeDQgdmFsdWUpIHsKICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleCgwLCB0aGlzKTsKICAgIHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHZhbHVlOwogIH0KCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEludDMyeDQgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRlc3QodGhpc1tpXSkpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleFdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBMaXN0PEludDMyeDQ+IG9wZXJhdG9yICsoTGlzdDxJbnQzMng0PiBvdGhlcikgewogICAgaW50IHRvdGFsTGVuZ3RoID0gdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGg7CiAgICByZXR1cm4gPEludDMyeDQ+W10KICAgICAgLi5sZW5ndGggPSB0b3RhbExlbmd0aAogICAgICAuLnNldFJhbmdlKDAsIHRoaXMubGVuZ3RoLCB0aGlzKQogICAgICAuLnNldFJhbmdlKHRoaXMubGVuZ3RoLCB0b3RhbExlbmd0aCwgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgc2h1ZmZsZShbUmFuZG9tIHJhbmRvbV0pIHsKICAgIHJhbmRvbSA/Pz0gbmV3IFJhbmRvbSgpOwogICAgdmFyIGkgPSB0aGlzLmxlbmd0aDsKICAgIHdoaWxlIChpID4gMSkgewogICAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQoaSk7CiAgICAgIGkgLT0gMTsKICAgICAgdmFyIHRtcCA9IHRoaXNbaV07CiAgICAgIHRoaXNbaV0gPSB0aGlzW3Bvc107CiAgICAgIHRoaXNbcG9zXSA9IHRtcDsKICAgIH0KICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxJbnQzMng0PiBmcm9tLAogICAgICBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICAvLyBDaGVjayByYW5nZXMuCiAgICBpZiAoMCA+IHN0YXJ0IHx8IHN0YXJ0ID4gZW5kIHx8IGVuZCA+IGxlbmd0aCkgewogICAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOyAvLyBBbHdheXMgdGhyb3dzLgogICAgICBhc3NlcnQoZmFsc2UpOwogICAgfQogICAgaWYgKHNraXBDb3VudCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc2tpcENvdW50KTsKICAgIH0KCiAgICBmaW5hbCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKChmcm9tLmxlbmd0aCAtIHNraXBDb3VudCkgPCBjb3VudCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KCiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOwoKICAgIGlmIChmcm9tIGlzIF9UeXBlZExpc3RCYXNlKSB7CiAgICAgIC8vIE5vdGU6IF9UeXBlZExpc3RCYXNlIGlzIG5vdCByZWxhdGVkIHRvIEl0ZXJhYmxlPEludDMyeDQ+IHNvIHRoZXJlIGlzCiAgICAgIC8vIG5vIHByb21vdGlvbiBoZXJlLgogICAgICBmaW5hbCBmcm9tQXNUeXBlZExpc3QgPSBmcm9tIGFzIF9UeXBlZExpc3RCYXNlOwogICAgICBpZiAodGhpcy5lbGVtZW50U2l6ZUluQnl0ZXMgPT0gZnJvbUFzVHlwZWRMaXN0LmVsZW1lbnRTaXplSW5CeXRlcykgewogICAgICAgIGlmICgoY291bnQgPCAxMCkgJiYgKGZyb21Bc1R5cGVkTGlzdC5idWZmZXIgIT0gdGhpcy5idWZmZXIpKSB7CiAgICAgICAgICBMaXN0cy5jb3B5KGZyb20gYXMgTGlzdDxJbnQzMng0Piwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgY291bnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5idWZmZXIuX2RhdGEuX3NldFJhbmdlKAogICAgICAgICAgICBzdGFydCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIHRoaXMub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgY291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMsCiAgICAgICAgICAgIGZyb21Bc1R5cGVkTGlzdC5idWZmZXIuX2RhdGEsCiAgICAgICAgICAgIHNraXBDb3VudCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIGZyb21Bc1R5cGVkTGlzdC5vZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBDbGFzc0lELmdldElEKHRoaXMpLAogICAgICAgICAgICBDbGFzc0lELmdldElEKGZyb20pKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyID09IHRoaXMuYnVmZmVyKSB7CiAgICAgICAgLy8gRGlmZmVyZW50IGVsZW1lbnQgc2l6ZXMsIGJ1dCBzYW1lIGJ1ZmZlciBtZWFucyB0aGF0IHdlIG5lZWQKICAgICAgICAvLyBhbiBpbnRlcm1lZGlhdGUgc3RydWN0dXJlLgogICAgICAgIC8vIFRPRE8oc3JkamFuKTogT3B0aW1pemUgdG8gc2tpcCBjb3B5aW5nIGlmIHRoZSByYW5nZSBkb2VzIG5vdCBvdmVybGFwLgogICAgICAgIGZpbmFsIGZyb21Bc0xpc3QgPSBmcm9tIGFzIExpc3Q8SW50MzJ4ND47CiAgICAgICAgZmluYWwgdGVtcEJ1ZmZlciA9IF9jcmVhdGVMaXN0KGNvdW50KTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIHRlbXBCdWZmZXJbaV0gPSBmcm9tQXNMaXN0W3NraXBDb3VudCArIGldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgdGhpc1tpXSA9IHRlbXBCdWZmZXJbaSAtIHN0YXJ0XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgTGlzdCBvdGhlckxpc3Q7CiAgICBpbnQgb3RoZXJTdGFydDsKICAgIGlmIChmcm9tIGlzIExpc3Q8SW50MzJ4ND4pIHsKICAgICAgb3RoZXJMaXN0ID0gZnJvbTsKICAgICAgb3RoZXJTdGFydCA9IHNraXBDb3VudDsKICAgIH0gZWxzZSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb20uc2tpcChza2lwQ291bnQpLnRvTGlzdChncm93YWJsZTogZmFsc2UpOwogICAgICBvdGhlclN0YXJ0ID0gMDsKICAgIH0KICAgIGlmIChvdGhlclN0YXJ0ICsgY291bnQgPiBvdGhlckxpc3QubGVuZ3RoKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQogICAgTGlzdHMuY29weShvdGhlckxpc3QsIG90aGVyU3RhcnQsIHRoaXMsIHN0YXJ0LCBjb3VudCk7CiAgfQoKICBJdGVyYWJsZTxJbnQzMng0PiB3aGVyZShib29sIGYoSW50MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFdoZXJlSXRlcmFibGU8SW50MzJ4ND4odGhpcywgZik7CgogIEl0ZXJhYmxlPEludDMyeDQ+IHRha2UoaW50IG4pID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8SW50MzJ4ND4odGhpcywgMCwgbik7CgogIEl0ZXJhYmxlPEludDMyeDQ+IHRha2VXaGlsZShib29sIHRlc3QoSW50MzJ4NCBlbGVtZW50KSkgPT4KICAgICAgbmV3IFRha2VXaGlsZUl0ZXJhYmxlPEludDMyeDQ+KHRoaXMsIHRlc3QpOwoKICBJdGVyYWJsZTxJbnQzMng0PiBza2lwKGludCBuKSA9PiBuZXcgU3ViTGlzdEl0ZXJhYmxlPEludDMyeDQ+KHRoaXMsIG4sIG51bGwpOwoKICBJdGVyYWJsZTxJbnQzMng0PiBza2lwV2hpbGUoYm9vbCB0ZXN0KEludDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBTa2lwV2hpbGVJdGVyYWJsZTxJbnQzMng0Pih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8SW50MzJ4ND4gZ2V0IHJldmVyc2VkID0+IG5ldyBSZXZlcnNlZExpc3RJdGVyYWJsZTxJbnQzMng0Pih0aGlzKTsKCiAgTWFwPGludCwgSW50MzJ4ND4gYXNNYXAoKSA9PiBuZXcgTGlzdE1hcFZpZXc8SW50MzJ4ND4odGhpcyk7CgogIEl0ZXJhYmxlPEludDMyeDQ+IGdldFJhbmdlKGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICByZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZTxJbnQzMng0Pih0aGlzLCBzdGFydCwgZW5kKTsKICB9CgogIEl0ZXJhdG9yPEludDMyeDQ+IGdldCBpdGVyYXRvciA9PiBuZXcgX1R5cGVkTGlzdEl0ZXJhdG9yPEludDMyeDQ+KHRoaXMpOwoKICBMaXN0PEludDMyeDQ+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIHJldHVybiBuZXcgTGlzdDxJbnQzMng0Pi5mcm9tKHRoaXMsIGdyb3dhYmxlOiBncm93YWJsZSk7CiAgfQoKICBTZXQ8SW50MzJ4ND4gdG9TZXQoKSB7CiAgICByZXR1cm4gbmV3IFNldDxJbnQzMng0Pi5mcm9tKHRoaXMpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihJbnQzMng0IGVsZW1lbnQpKSB7CiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBJbnQzMng0IHJlZHVjZShJbnQzMng0IGNvbWJpbmUoSW50MzJ4NCB2YWx1ZSwgSW50MzJ4NCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbiA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHZhciB2YWx1ZSA9IHRoaXNbMF07CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgKytpKSB7CiAgICAgIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIGluaXRpYWxWYWx1ZSwgSW50MzJ4NCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpbml0aWFsVmFsdWUgPSBjb21iaW5lKGluaXRpYWxWYWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gaW5pdGlhbFZhbHVlOwogIH0KCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihJbnQzMng0IGVsZW1lbnQpKSA9PgogICAgICBuZXcgTWFwcGVkSXRlcmFibGU8SW50MzJ4NCwgVD4odGhpcywgZik7CgogIEl0ZXJhYmxlPFQ+IGV4cGFuZDxUPihJdGVyYWJsZTxUPiBmKEludDMyeDQgZWxlbWVudCkpID0+CiAgICAgIG5ldyBFeHBhbmRJdGVyYWJsZTxJbnQzMng0LCBUPih0aGlzLCBmKTsKCiAgYm9vbCBldmVyeShib29sIGYoSW50MzJ4NCBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAoIWYodGhpc1tpXSkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgYm9vbCBhbnkoYm9vbCBmKEludDMyeDQgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKGYodGhpc1tpXSkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgSW50MzJ4NCBmaXJzdFdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpLCB7SW50MzJ4NCBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgSW50MzJ4NCBsYXN0V2hlcmUoYm9vbCB0ZXN0KEludDMyeDQgZWxlbWVudCksIHtJbnQzMng0IG9yRWxzZSgpfSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEludDMyeDQgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEludDMyeDQgZWxlbWVudCksIHtJbnQzMng0IG9yRWxzZSgpfSkgewogICAgdmFyIHJlc3VsdCA9IG51bGw7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEludDMyeDQgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgdm9pZCBhZGQoSW50MzJ4NCB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBhZGQgdG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBhZGRBbGwoSXRlcmFibGU8SW50MzJ4ND4gdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgSW50MzJ4NCB2YWx1ZSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIGluc2VydEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEludDMyeDQ+IHZhbHVlcykgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBpbnNlcnQgaW50byBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKEludDMyeDQgYSwgSW50MzJ4NCBiKV0pIHsKICAgIGlmIChjb21wYXJlID09IG51bGwpIHsKICAgICAgdGhyb3cgIlNJTUQgZG9uJ3QgaGF2ZSBkZWZhdWx0IGNvbXBhcmUuIjsKICAgIH0KICAgIFNvcnQuc29ydCh0aGlzLCBjb21wYXJlKTsKICB9CgogIGludCBpbmRleE9mKEludDMyeDQgZWxlbWVudCwgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgc3RhcnQgPSAwOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhPZihJbnQzMng0IGVsZW1lbnQsIFtpbnQgc3RhcnQgPSBudWxsXSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgSW50MzJ4NCByZW1vdmVMYXN0KCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBJbnQzMng0IHJlbW92ZUF0KGludCBpbmRleCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChJbnQzMng0IGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEludDMyeDQgZWxlbWVudCkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgSW50MzJ4NCBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzWzBdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBJbnQzMng0IGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgSW50MzJ4NCBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgTGlzdDxJbnQzMng0PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICB2YXIgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBMaXN0PEludDMyeDQ+IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxJbnQzMng0PiBpdGVyYWJsZSkgewogICAgZmluYWwgZW5kID0gaXRlcmFibGUubGVuZ3RoICsgaW5kZXg7CiAgICBzZXRSYW5nZShpbmRleCwgZW5kLCBpdGVyYWJsZSk7CiAgfQoKICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtJbnQzMng0IGZpbGxWYWx1ZV0pIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7CiAgICAgIHRoaXNbaV0gPSBmaWxsVmFsdWU7CiAgICB9CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfRmxvYXQ2NHgyTGlzdE1peGluIGltcGxlbWVudHMgTGlzdDxGbG9hdDY0eDI+IHsKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlczsKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXM7CiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKCiAgTGlzdDxGbG9hdDY0eDI+IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpOwoKICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBuZXcgV2hlcmVUeXBlSXRlcmFibGU8VD4odGhpcyk7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gZm9sbG93ZWRCeShJdGVyYWJsZTxGbG9hdDY0eDI+IG90aGVyKSA9PgogICAgICBuZXcgRm9sbG93ZWRCeUl0ZXJhYmxlPEZsb2F0NjR4Mj4uZmlyc3RFZmZpY2llbnQodGhpcywgb3RoZXIpOwoKICBMaXN0PFI+IGNhc3Q8Uj4oKSA9PiBMaXN0LmNhc3RGcm9tPEZsb2F0NjR4MiwgUj4odGhpcyk7CiAgdm9pZCBzZXQgZmlyc3QoRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBpZiAodGhpcy5sZW5ndGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoMCwgdGhpcyk7CiAgICB0aGlzWzBdID0gdmFsdWU7CiAgfQoKICB2b2lkIHNldCBsYXN0KEZsb2F0NjR4MiB2YWx1ZSkgewogICAgaWYgKHRoaXMubGVuZ3RoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KDAsIHRoaXMpOwogICAgdGhpc1t0aGlzLmxlbmd0aCAtIDFdID0gdmFsdWU7CiAgfQoKICBpbnQgaW5kZXhXaGVyZShib29sIHRlc3QoRmxvYXQ2NHgyIGVsZW1lbnQpLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0ZXN0KHRoaXNbaV0pKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CgogIGludCBsYXN0SW5kZXhXaGVyZShib29sIHRlc3QoRmxvYXQ2NHgyIGVsZW1lbnQpLCBbaW50IHN0YXJ0XSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IDA7IGktLSkgewogICAgICBpZiAodGVzdCh0aGlzW2ldKSkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBMaXN0PEZsb2F0NjR4Mj4gb3BlcmF0b3IgKyhMaXN0PEZsb2F0NjR4Mj4gb3RoZXIpIHsKICAgIGludCB0b3RhbExlbmd0aCA9IHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoOwogICAgcmV0dXJuIDxGbG9hdDY0eDI+W10KICAgICAgLi5sZW5ndGggPSB0b3RhbExlbmd0aAogICAgICAuLnNldFJhbmdlKDAsIHRoaXMubGVuZ3RoLCB0aGlzKQogICAgICAuLnNldFJhbmdlKHRoaXMubGVuZ3RoLCB0b3RhbExlbmd0aCwgb3RoZXIpOwogIH0KCiAgYm9vbCBjb250YWlucyhPYmplY3QgZWxlbWVudCkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgc2h1ZmZsZShbUmFuZG9tIHJhbmRvbV0pIHsKICAgIHJhbmRvbSA/Pz0gbmV3IFJhbmRvbSgpOwogICAgdmFyIGkgPSB0aGlzLmxlbmd0aDsKICAgIHdoaWxlIChpID4gMSkgewogICAgICBpbnQgcG9zID0gcmFuZG9tLm5leHRJbnQoaSk7CiAgICAgIGkgLT0gMTsKICAgICAgdmFyIHRtcCA9IHRoaXNbaV07CiAgICAgIHRoaXNbaV0gPSB0aGlzW3Bvc107CiAgICAgIHRoaXNbcG9zXSA9IHRtcDsKICAgIH0KICB9CgogIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxGbG9hdDY0eDI+IGZyb20sCiAgICAgIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIC8vIENoZWNrIHJhbmdlcy4KICAgIGlmICgwID4gc3RhcnQgfHwgc3RhcnQgPiBlbmQgfHwgZW5kID4gbGVuZ3RoKSB7CiAgICAgIFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxlbmd0aCk7IC8vIEFsd2F5cyB0aHJvd3MuCiAgICAgIGFzc2VydChmYWxzZSk7CiAgICB9CiAgICBpZiAoc2tpcENvdW50IDwgMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihza2lwQ291bnQpOwogICAgfQoKICAgIGZpbmFsIGNvdW50ID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAoKGZyb20ubGVuZ3RoIC0gc2tpcENvdW50KSA8IGNvdW50KSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb0ZldygpOwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm47CgogICAgaWYgKGZyb20gaXMgX1R5cGVkTGlzdEJhc2UpIHsKICAgICAgLy8gTm90ZTogX1R5cGVkTGlzdEJhc2UgaXMgbm90IHJlbGF0ZWQgdG8gSXRlcmFibGU8RmxvYXQ2NHgyPiBzbyB0aGVyZSBpcwogICAgICAvLyBubyBwcm9tb3Rpb24gaGVyZS4KICAgICAgZmluYWwgZnJvbUFzVHlwZWRMaXN0ID0gZnJvbSBhcyBfVHlwZWRMaXN0QmFzZTsKICAgICAgaWYgKHRoaXMuZWxlbWVudFNpemVJbkJ5dGVzID09IGZyb21Bc1R5cGVkTGlzdC5lbGVtZW50U2l6ZUluQnl0ZXMpIHsKICAgICAgICBpZiAoKGNvdW50IDwgMTApICYmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyICE9IHRoaXMuYnVmZmVyKSkgewogICAgICAgICAgTGlzdHMuY29weShmcm9tIGFzIExpc3Q8RmxvYXQ2NHgyPiwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgY291bnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5idWZmZXIuX2RhdGEuX3NldFJhbmdlKAogICAgICAgICAgICBzdGFydCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIHRoaXMub2Zmc2V0SW5CeXRlcywKICAgICAgICAgICAgY291bnQgKiBlbGVtZW50U2l6ZUluQnl0ZXMsCiAgICAgICAgICAgIGZyb21Bc1R5cGVkTGlzdC5idWZmZXIuX2RhdGEsCiAgICAgICAgICAgIHNraXBDb3VudCAqIGVsZW1lbnRTaXplSW5CeXRlcyArIGZyb21Bc1R5cGVkTGlzdC5vZmZzZXRJbkJ5dGVzLAogICAgICAgICAgICBDbGFzc0lELmdldElEKHRoaXMpLAogICAgICAgICAgICBDbGFzc0lELmdldElEKGZyb20pKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmcm9tQXNUeXBlZExpc3QuYnVmZmVyID09IHRoaXMuYnVmZmVyKSB7CiAgICAgICAgLy8gRGlmZmVyZW50IGVsZW1lbnQgc2l6ZXMsIGJ1dCBzYW1lIGJ1ZmZlciBtZWFucyB0aGF0IHdlIG5lZWQKICAgICAgICAvLyBhbiBpbnRlcm1lZGlhdGUgc3RydWN0dXJlLgogICAgICAgIC8vIFRPRE8oc3JkamFuKTogT3B0aW1pemUgdG8gc2tpcCBjb3B5aW5nIGlmIHRoZSByYW5nZSBkb2VzIG5vdCBvdmVybGFwLgogICAgICAgIGZpbmFsIGZyb21Bc0xpc3QgPSBmcm9tIGFzIExpc3Q8RmxvYXQ2NHgyPjsKICAgICAgICBmaW5hbCB0ZW1wQnVmZmVyID0gX2NyZWF0ZUxpc3QoY291bnQpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgdGVtcEJ1ZmZlcltpXSA9IGZyb21Bc0xpc3Rbc2tpcENvdW50ICsgaV07CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICB0aGlzW2ldID0gdGVtcEJ1ZmZlcltpIC0gc3RhcnRdOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBMaXN0IG90aGVyTGlzdDsKICAgIGludCBvdGhlclN0YXJ0OwogICAgaWYgKGZyb20gaXMgTGlzdDxGbG9hdDY0eDI+KSB7CiAgICAgIG90aGVyTGlzdCA9IGZyb207CiAgICAgIG90aGVyU3RhcnQgPSBza2lwQ291bnQ7CiAgICB9IGVsc2UgewogICAgICBvdGhlckxpc3QgPSBmcm9tLnNraXAoc2tpcENvdW50KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgb3RoZXJTdGFydCA9IDA7CiAgICB9CiAgICBpZiAob3RoZXJTdGFydCArIGNvdW50ID4gb3RoZXJMaXN0Lmxlbmd0aCkgewogICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29GZXcoKTsKICAgIH0KICAgIExpc3RzLmNvcHkob3RoZXJMaXN0LCBvdGhlclN0YXJ0LCB0aGlzLCBzdGFydCwgY291bnQpOwogIH0KCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiB3aGVyZShib29sIGYoRmxvYXQ2NHgyIGVsZW1lbnQpKSA9PgogICAgICBuZXcgV2hlcmVJdGVyYWJsZTxGbG9hdDY0eDI+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxGbG9hdDY0eDI+IHRha2UoaW50IG4pID0+IG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQ2NHgyPih0aGlzLCAwLCBuKTsKCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiB0YWtlV2hpbGUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSkgPT4KICAgICAgbmV3IFRha2VXaGlsZUl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcywgdGVzdCk7CgogIEl0ZXJhYmxlPEZsb2F0NjR4Mj4gc2tpcChpbnQgbikgPT4KICAgICAgbmV3IFN1Ykxpc3RJdGVyYWJsZTxGbG9hdDY0eDI+KHRoaXMsIG4sIG51bGwpOwoKICBJdGVyYWJsZTxGbG9hdDY0eDI+IHNraXBXaGlsZShib29sIHRlc3QoRmxvYXQ2NHgyIGVsZW1lbnQpKSA9PgogICAgICBuZXcgU2tpcFdoaWxlSXRlcmFibGU8RmxvYXQ2NHgyPih0aGlzLCB0ZXN0KTsKCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiBnZXQgcmV2ZXJzZWQgPT4gbmV3IFJldmVyc2VkTGlzdEl0ZXJhYmxlPEZsb2F0NjR4Mj4odGhpcyk7CgogIE1hcDxpbnQsIEZsb2F0NjR4Mj4gYXNNYXAoKSA9PiBuZXcgTGlzdE1hcFZpZXc8RmxvYXQ2NHgyPih0aGlzKTsKCiAgSXRlcmFibGU8RmxvYXQ2NHgyPiBnZXRSYW5nZShpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGU8RmxvYXQ2NHgyPih0aGlzLCBzdGFydCwgZW5kKTsKICB9CgogIEl0ZXJhdG9yPEZsb2F0NjR4Mj4gZ2V0IGl0ZXJhdG9yID0+IG5ldyBfVHlwZWRMaXN0SXRlcmF0b3I8RmxvYXQ2NHgyPih0aGlzKTsKCiAgTGlzdDxGbG9hdDY0eDI+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIHJldHVybiBuZXcgTGlzdDxGbG9hdDY0eDI+LmZyb20odGhpcywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKICB9CgogIFNldDxGbG9hdDY0eDI+IHRvU2V0KCkgewogICAgcmV0dXJuIG5ldyBTZXQ8RmxvYXQ2NHgyPi5mcm9tKHRoaXMpOwogIH0KCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgIH0KICB9CgogIEZsb2F0NjR4MiByZWR1Y2UoRmxvYXQ2NHgyIGNvbWJpbmUoRmxvYXQ2NHgyIHZhbHVlLCBGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW4gPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB2YXIgdmFsdWUgPSB0aGlzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47ICsraSkgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIHRoaXNbaV0pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgVCBmb2xkPFQ+KFQgaW5pdGlhbFZhbHVlLCBUIGNvbWJpbmUoVCBpbml0aWFsVmFsdWUsIEZsb2F0NjR4MiBlbGVtZW50KSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBpbml0aWFsVmFsdWUgPSBjb21iaW5lKGluaXRpYWxWYWx1ZSwgdGhpc1tpXSk7CiAgICB9CiAgICByZXR1cm4gaW5pdGlhbFZhbHVlOwogIH0KCiAgSXRlcmFibGU8VD4gbWFwPFQ+KFQgZihGbG9hdDY0eDIgZWxlbWVudCkpID0+CiAgICAgIG5ldyBNYXBwZWRJdGVyYWJsZTxGbG9hdDY0eDIsIFQ+KHRoaXMsIGYpOwoKICBJdGVyYWJsZTxUPiBleHBhbmQ8VD4oSXRlcmFibGU8VD4gZihGbG9hdDY0eDIgZWxlbWVudCkpID0+CiAgICAgIG5ldyBFeHBhbmRJdGVyYWJsZTxGbG9hdDY0eDIsIFQ+KHRoaXMsIGYpOwoKICBib29sIGV2ZXJ5KGJvb2wgZihGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKCFmKHRoaXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgYW55KGJvb2wgZihGbG9hdDY0eDIgZWxlbWVudCkpIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgaWYgKGYodGhpc1tpXSkpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRmxvYXQ2NHgyIGZpcnN0V2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSwge0Zsb2F0NjR4MiBvckVsc2UoKX0pIHsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRmxvYXQ2NHgyIGxhc3RXaGVyZShib29sIHRlc3QoRmxvYXQ2NHgyIGVsZW1lbnQpLCB7RmxvYXQ2NHgyIG9yRWxzZSgpfSkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgfQogICAgfQogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBzaW5nbGVXaGVyZShib29sIHRlc3QoRmxvYXQ2NHgyIGVsZW1lbnQpLCB7RmxvYXQ2NHgyIG9yRWxzZSgpfSkgewogICAgdmFyIHJlc3VsdCA9IG51bGw7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzW2ldOwogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIGlmIChmb3VuZE1hdGNoaW5nKSB7CiAgICAgICAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEZsb2F0NjR4MiBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gdGhpc1tpbmRleF07CiAgfQoKICB2b2lkIGFkZChGbG9hdDY0eDIgdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPEZsb2F0NjR4Mj4gdmFsdWUpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IGluc2VydCBpbnRvIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8RmxvYXQ2NHgyPiB2YWx1ZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgaW5zZXJ0IGludG8gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShGbG9hdDY0eDIgYSwgRmxvYXQ2NHgyIGIpXSkgewogICAgaWYgKGNvbXBhcmUgPT0gbnVsbCkgewogICAgICB0aHJvdyAiU0lNRCBkb24ndCBoYXZlIGRlZmF1bHQgY29tcGFyZS4iOwogICAgfQogICAgU29ydC5zb3J0KHRoaXMsIGNvbXBhcmUpOwogIH0KCiAgaW50IGluZGV4T2YoRmxvYXQ2NHgyIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoc3RhcnQgPCAwKSB7CiAgICAgIHN0YXJ0ID0gMDsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT0gZWxlbWVudCkgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICBpbnQgbGFzdEluZGV4T2YoRmxvYXQ2NHgyIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSBudWxsXSkgewogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHsKICAgICAgc3RhcnQgPSB0aGlzLmxlbmd0aCAtIDE7CiAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0aGlzW2ldID09IGVsZW1lbnQpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgRmxvYXQ2NHgyIHJlbW92ZUxhc3QoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIEZsb2F0NjR4MiByZW1vdmVBdChpbnQgaW5kZXgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgcmVtb3ZlIGZyb20gYSBmaXhlZC1sZW5ndGggbGlzdCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRmxvYXQ2NHgyIGVsZW1lbnQpKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHJlbW92ZSBmcm9tIGEgZml4ZWQtbGVuZ3RoIGxpc3QiKTsKICB9CgogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEZsb2F0NjR4MiBlbGVtZW50KSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSBhIGZpeGVkLWxlbmd0aCBsaXN0Iik7CiAgfQoKICBGbG9hdDY0eDIgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRmxvYXQ2NHgyIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRmxvYXQ2NHgyIGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gdGhpc1swXTsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgfQoKICBMaXN0PEZsb2F0NjR4Mj4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgdmFyIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgTGlzdDxGbG9hdDY0eDI+IHJlc3VsdCA9IF9jcmVhdGVMaXN0KGxlbmd0aCk7CiAgICByZXN1bHQuc2V0UmFuZ2UoMCwgbGVuZ3RoLCB0aGlzLCBzdGFydCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxGbG9hdDY0eDI+IGl0ZXJhYmxlKSB7CiAgICBmaW5hbCBlbmQgPSBpdGVyYWJsZS5sZW5ndGggKyBpbmRleDsKICAgIHNldFJhbmdlKGluZGV4LCBlbmQsIGl0ZXJhYmxlKTsKICB9CgogIHZvaWQgZmlsbFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgW0Zsb2F0NjR4MiBmaWxsVmFsdWVdKSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgewogICAgICB0aGlzW2ldID0gZmlsbFZhbHVlOwogICAgfQogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfQnl0ZUJ1ZmZlciBpbXBsZW1lbnRzIEJ5dGVCdWZmZXIgewogIGZpbmFsIF9UeXBlZExpc3QgX2RhdGE7CgogIF9CeXRlQnVmZmVyKHRoaXMuX2RhdGEpOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBfQnl0ZUJ1ZmZlci5fTmV3KGRhdGEpID0+IG5ldyBfQnl0ZUJ1ZmZlcihkYXRhKTsKCiAgLy8gRm9yd2FyZCBjYWxscyB0byBfZGF0YS4KICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgPT4gX2RhdGEubGVuZ3RoSW5CeXRlczsKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9kYXRhLmhhc2hDb2RlOwogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSA9PgogICAgICAob3RoZXIgaXMgX0J5dGVCdWZmZXIpICYmIGlkZW50aWNhbChfZGF0YSwgb3RoZXIuX2RhdGEpOwoKICBCeXRlRGF0YSBhc0J5dGVEYXRhKFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89IHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXM7CiAgICBfcmFuZ2VDaGVjayh0aGlzLl9kYXRhLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgICByZXR1cm4gbmV3IF9CeXRlRGF0YVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEludDhMaXN0IGFzSW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0gKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKAogICAgICAgIHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoICogSW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX0ludDhBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIFVpbnQ4TGlzdCBhc1VpbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2soCiAgICAgICAgdGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGggKiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX1VpbnQ4QXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBVaW50OENsYW1wZWRMaXN0IGFzVWludDhDbGFtcGVkTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PSAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8KICAgICAgICBVaW50OENsYW1wZWRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywKICAgICAgICBsZW5ndGggKiBVaW50OENsYW1wZWRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50OENsYW1wZWRBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEludDE2TGlzdCBhc0ludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2soCiAgICAgICAgdGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX0ludDE2QXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBVaW50MTZMaXN0IGFzVWludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewogICAgbGVuZ3RoID8/PQogICAgICAgICh0aGlzLmxlbmd0aEluQnl0ZXMgLSBvZmZzZXRJbkJ5dGVzKSB+LyBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKAogICAgICAgIHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoICogVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX1VpbnQxNkFycmF5Vmlldyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgSW50MzJMaXN0IGFzSW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgX29mZnNldEFsaWdubWVudENoZWNrKG9mZnNldEluQnl0ZXMsIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfSW50MzJBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIFVpbnQzMkxpc3QgYXNVaW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2soCiAgICAgICAgdGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogICAgcmV0dXJuIG5ldyBfVWludDMyQXJyYXlWaWV3KHRoaXMuX2RhdGEsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CiAgfQoKICBJbnQ2NExpc3QgYXNJbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgIF9yYW5nZUNoZWNrKAogICAgICAgIHRoaXMubGVuZ3RoSW5CeXRlcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9JbnQ2NEFycmF5Vmlldyh0aGlzLl9kYXRhLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwogIH0KCiAgVWludDY0TGlzdCBhc1VpbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgICBfcmFuZ2VDaGVjaygKICAgICAgICB0aGlzLmxlbmd0aEluQnl0ZXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9VaW50NjRBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEZsb2F0MzJMaXN0IGFzRmxvYXQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2sodGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLAogICAgICAgIGxlbmd0aCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX0Zsb2F0MzJBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEZsb2F0NjRMaXN0IGFzRmxvYXQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2sodGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLAogICAgICAgIGxlbmd0aCAqIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX0Zsb2F0NjRBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEZsb2F0MzJ4NExpc3QgYXNGbG9hdDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2sodGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLAogICAgICAgIGxlbmd0aCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9GbG9hdDMyeDRBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEludDMyeDRMaXN0IGFzSW50MzJ4NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKICAgIGxlbmd0aCA/Pz0KICAgICAgICAodGhpcy5sZW5ndGhJbkJ5dGVzIC0gb2Zmc2V0SW5CeXRlcykgfi8gSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2sodGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLAogICAgICAgIGxlbmd0aCAqIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICBfb2Zmc2V0QWxpZ25tZW50Q2hlY2sob2Zmc2V0SW5CeXRlcywgSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIHJldHVybiBuZXcgX0ludDMyeDRBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9CgogIEZsb2F0NjR4Mkxpc3QgYXNGbG9hdDY0eDJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CiAgICBsZW5ndGggPz89CiAgICAgICAgKHRoaXMubGVuZ3RoSW5CeXRlcyAtIG9mZnNldEluQnl0ZXMpIH4vIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgX3JhbmdlQ2hlY2sodGhpcy5sZW5ndGhJbkJ5dGVzLCBvZmZzZXRJbkJ5dGVzLAogICAgICAgIGxlbmd0aCAqIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICAgIF9vZmZzZXRBbGlnbm1lbnRDaGVjayhvZmZzZXRJbkJ5dGVzLCBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IF9GbG9hdDY0eDJBcnJheVZpZXcodGhpcy5fZGF0YSwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlZExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0QmFzZSB7CiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7CgogIC8vIERlZmF1bHQgbWV0aG9kIGltcGxlbWVudGluZyBwYXJ0cyBvZiB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IG9mZnNldEluQnl0ZXMgewogICAgcmV0dXJuIDA7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgewogICAgcmV0dXJuIGxlbmd0aCAqIGVsZW1lbnRTaXplSW5CeXRlczsKICB9CgogIF9CeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gbmV3IF9CeXRlQnVmZmVyKHRoaXMpOwoKICAvLyBNZXRob2RzIGltcGxlbWVudGluZyB0aGUgY29sbGVjdGlvbiBpbnRlcmZhY2UuCgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGxlbmd0aCBuYXRpdmUgIlR5cGVkRGF0YV9sZW5ndGgiOwoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2dldEludDgoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEludDgiOwogIHZvaWQgX3NldEludDgoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0SW50OCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2dldFVpbnQ4KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRVaW50OCI7CiAgdm9pZCBfc2V0VWludDgoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0VWludDgiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IF9nZXRJbnQxNihpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0SW50MTYiOwogIHZvaWQgX3NldEludDE2KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldEludDE2IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBfZ2V0VWludDE2KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRVaW50MTYiOwogIHZvaWQgX3NldFVpbnQxNihpbnQgb2Zmc2V0SW5CeXRlcywgaW50IHZhbHVlKSBuYXRpdmUgIlR5cGVkRGF0YV9TZXRVaW50MTYiOwoKICBpbnQgX2dldEludDMyKGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRJbnQzMiI7CiAgdm9pZCBfc2V0SW50MzIoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0SW50MzIiOwoKICBpbnQgX2dldFVpbnQzMihpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0VWludDMyIjsKICB2b2lkIF9zZXRVaW50MzIoaW50IG9mZnNldEluQnl0ZXMsIGludCB2YWx1ZSkgbmF0aXZlICJUeXBlZERhdGFfU2V0VWludDMyIjsKCiAgaW50IF9nZXRJbnQ2NChpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0SW50NjQiOwogIHZvaWQgX3NldEludDY0KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldEludDY0IjsKCiAgaW50IF9nZXRVaW50NjQoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldFVpbnQ2NCI7CiAgdm9pZCBfc2V0VWludDY0KGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgdmFsdWUpIG5hdGl2ZSAiVHlwZWREYXRhX1NldFVpbnQ2NCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgX2dldEZsb2F0MzIoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEZsb2F0MzIiOwogIHZvaWQgX3NldEZsb2F0MzIoaW50IG9mZnNldEluQnl0ZXMsIGRvdWJsZSB2YWx1ZSkKICAgICAgbmF0aXZlICJUeXBlZERhdGFfU2V0RmxvYXQzMiI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgX2dldEZsb2F0NjQoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEZsb2F0NjQiOwogIHZvaWQgX3NldEZsb2F0NjQoaW50IG9mZnNldEluQnl0ZXMsIGRvdWJsZSB2YWx1ZSkKICAgICAgbmF0aXZlICJUeXBlZERhdGFfU2V0RmxvYXQ2NCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgX2dldEZsb2F0MzJ4NChpbnQgb2Zmc2V0SW5CeXRlcykgbmF0aXZlICJUeXBlZERhdGFfR2V0RmxvYXQzMng0IjsKICB2b2lkIF9zZXRGbG9hdDMyeDQoaW50IG9mZnNldEluQnl0ZXMsIEZsb2F0MzJ4NCB2YWx1ZSkKICAgICAgbmF0aXZlICJUeXBlZERhdGFfU2V0RmxvYXQzMng0IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IF9nZXRJbnQzMng0KGludCBvZmZzZXRJbkJ5dGVzKSBuYXRpdmUgIlR5cGVkRGF0YV9HZXRJbnQzMng0IjsKICB2b2lkIF9zZXRJbnQzMng0KGludCBvZmZzZXRJbkJ5dGVzLCBJbnQzMng0IHZhbHVlKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YV9TZXRJbnQzMng0IjsKCiAgRmxvYXQ2NHgyIF9nZXRGbG9hdDY0eDIoaW50IG9mZnNldEluQnl0ZXMpIG5hdGl2ZSAiVHlwZWREYXRhX0dldEZsb2F0NjR4MiI7CiAgdm9pZCBfc2V0RmxvYXQ2NHgyKGludCBvZmZzZXRJbkJ5dGVzLCBGbG9hdDY0eDIgdmFsdWUpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhX1NldEZsb2F0NjR4MiI7CgogIC8qKgogICAqIFN0b3JlcyB0aGUgW0NvZGVVbml0c10gYXMgVVRGLTE2IHVuaXRzIGludG8gdGhpcyBUeXBlZERhdGEgYXQKICAgKiBwb3NpdGlvbnMgW3N0YXJ0XS4uW2VuZF0gKHVpbnQxNiBpbmRpY2VzKS4KICAgKi8KICB2b2lkIF9zZXRDb2RlVW5pdHMoCiAgICAgIENvZGVVbml0cyB1bml0cywgaW50IGJ5dGVTdGFydCwgaW50IGxlbmd0aCwgaW50IHNraXBDb3VudCkgewogICAgYXNzZXJ0KGJ5dGVTdGFydCArIGxlbmd0aCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50IDw9IGxlbmd0aEluQnl0ZXMpOwogICAgU3RyaW5nIHN0cmluZyA9IENvZGVVbml0cy5zdHJpbmdPZih1bml0cyk7CiAgICBpbnQgc2xpY2VFbmQgPSBza2lwQ291bnQgKyBsZW5ndGg7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZSgKICAgICAgICBza2lwQ291bnQsIHNsaWNlRW5kLCBzdHJpbmcubGVuZ3RoLCAic2tpcENvdW50IiwgInNraXBDb3VudCArIGxlbmd0aCIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBfc2V0VWludDE2KGJ5dGVTdGFydCArIGkgKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCwKICAgICAgICAgIHN0cmluZy5jb2RlVW5pdEF0KHNraXBDb3VudCArIGkpKTsKICAgIH0KICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQ4TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50OExpc3QpCiAgZmFjdG9yeSBJbnQ4TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQ4QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBJbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50OExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50OExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0IHdpdGggX0ludExpc3RNaXhpbiBpbXBsZW1lbnRzIEludDhMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEludDgoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbnQ4KGluZGV4LCBfdG9JbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQ4TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgVWludDhMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50OExpc3QpCiAgZmFjdG9yeSBVaW50OExpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfVWludDhBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IFVpbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgVWludDhMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQ4TGlzdCBleHRlbmRzIF9UeXBlZExpc3Qgd2l0aCBfSW50TGlzdE1peGluIGltcGxlbWVudHMgVWludDhMaXN0IHsKICAvLyBNZXRob2RzIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRVaW50OChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldFVpbnQ4KGluZGV4LCBfdG9VaW50OCh2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kcyBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBVaW50OENsYW1wZWRMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50OENsYW1wZWRMaXN0KQogIGZhY3RvcnkgVWludDhDbGFtcGVkTGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9VaW50OENsYW1wZWRBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IFVpbnQ4Q2xhbXBlZExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDhDbGFtcGVkTGlzdCBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBVaW50OENsYW1wZWRMaXN0IHsKICAvLyBNZXRob2RzIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRVaW50OChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldFVpbnQ4KGluZGV4LCBfdG9DbGFtcGVkVWludDgodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZHMgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBJbnQxNkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDE2TGlzdCkKICBmYWN0b3J5IEludDE2TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9JbnQxNkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgSW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBJbnQxNkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50MTZMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdCB3aXRoIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBJbnQxNkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDE2KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDE2KGluZGV4LCBfdG9JbnQxNih2YWx1ZSkpOwogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlIGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgQ29kZVVuaXRzKSB7CiAgICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICBpbnQgYnl0ZVN0YXJ0ID0gdGhpcy5vZmZzZXRJbkJ5dGVzICsgc3RhcnQgKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgICBfc2V0Q29kZVVuaXRzKGl0ZXJhYmxlLCBieXRlU3RhcnQsIGxlbmd0aCwgc2tpcENvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogICAgfQogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDE2TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDE2TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkSW50MTYoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDE2KGluZGV4ICogSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkSW50MTYoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRJbnQxNihpbmRleCAqIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBVaW50MTZMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50MTZMaXN0KQogIGZhY3RvcnkgVWludDE2TGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9VaW50MTZBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IFVpbnQxNkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IFVpbnQxNkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDE2TGlzdCBleHRlbmRzIF9UeXBlZExpc3Qgd2l0aCBfSW50TGlzdE1peGluIGltcGxlbWVudHMgVWludDE2TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZFVpbnQxNihpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRVaW50MTYoaW5kZXgsIF90b1VpbnQxNih2YWx1ZSkpOwogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlIGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgQ29kZVVuaXRzKSB7CiAgICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICBpbnQgYnl0ZVN0YXJ0ID0gdGhpcy5vZmZzZXRJbkJ5dGVzICsgc3RhcnQgKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgICAgX3NldENvZGVVbml0cyhpdGVyYWJsZSwgYnl0ZVN0YXJ0LCBsZW5ndGgsIHNraXBDb3VudCk7CiAgICB9IGVsc2UgewogICAgICBzdXBlci5zZXRSYW5nZShzdGFydCwgZW5kLCBpdGVyYWJsZSwgc2tpcENvdW50KTsKICAgIH0KICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50MTZMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRVaW50MTYoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldFVpbnQxNihpbmRleCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRVaW50MTYoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRVaW50MTYoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEludDMyTGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJMaXN0KQogIGZhY3RvcnkgSW50MzJMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX0ludDMyQXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBJbnQzMkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEludDMyTGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQzMkxpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0IHdpdGggX0ludExpc3RNaXhpbiBpbXBsZW1lbnRzIEludDMyTGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50MzIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50MzIoaW5kZXgsIF90b0ludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRJbnQzMihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0SW50MzIoaW5kZXggKiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldEludDMyKGluZGV4ICogSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFVpbnQzMkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQzMkxpc3QpCiAgZmFjdG9yeSBVaW50MzJMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX1VpbnQzMkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgVWludDMyTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgVWludDMyTGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50MzJMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdCB3aXRoIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBVaW50MzJMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRVaW50MzIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkVWludDMyKGluZGV4LCBfdG9VaW50MzIodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50MzJMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRVaW50MzIoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldFVpbnQzMihpbmRleCAqIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRVaW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRVaW50MzIoaW5kZXggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEludDY0TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50NjRMaXN0KQogIGZhY3RvcnkgSW50NjRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX0ludDY0QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBJbnQ2NExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSB7CiAgICByZXR1cm4gbmV3IEludDY0TGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQ2NExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0IHdpdGggX0ludExpc3RNaXhpbiBpbXBsZW1lbnRzIEludDY0TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50NjQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50NjRMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRJbnQ2NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0SW50NjQoaW5kZXggKiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQ2NChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldEludDY0KGluZGV4ICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFVpbnQ2NExpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQ2NExpc3QpCiAgZmFjdG9yeSBVaW50NjRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX1VpbnQ2NEFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgVWludDY0TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgVWludDY0TGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50NjRMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdCB3aXRoIF9JbnRMaXN0TWl4aW4gaW1wbGVtZW50cyBVaW50NjRMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRVaW50NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkVWludDY0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDY0TGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkVWludDY0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRVaW50NjQoaW5kZXggKiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkVWludDY0KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0VWludDY0KGluZGV4ICogVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBGbG9hdDMyTGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMkxpc3QpCiAgZmFjdG9yeSBGbG9hdDMyTGlzdChpbnQgbGVuZ3RoKSBuYXRpdmUgIlR5cGVkRGF0YV9GbG9hdDMyQXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBGbG9hdDMyTGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMkxpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQzMkxpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9Eb3VibGVMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQzMkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDMyKGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEZsb2F0MzIoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0MzJMaXN0KGxlbmd0aCk7CiAgfQoKICBkb3VibGUgX2dldEluZGV4ZWRGbG9hdDMyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDMyKGluZGV4ICogRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRGbG9hdDMyKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBfc2V0RmxvYXQzMihpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEZsb2F0NjRMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0TGlzdCkKICBmYWN0b3J5IEZsb2F0NjRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX0Zsb2F0NjRBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IEZsb2F0NjRMaXN0LmZyb21MaXN0KExpc3Q8ZG91YmxlPiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBGbG9hdDY0TGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9GbG9hdDY0TGlzdCBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0RvdWJsZUxpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDY0TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEZsb2F0NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQ2NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NExpc3QobGVuZ3RoKTsKICB9CgogIGRvdWJsZSBfZ2V0SW5kZXhlZEZsb2F0NjQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEZsb2F0NjQoaW5kZXggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0NjQoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIF9zZXRGbG9hdDY0KGluZGV4ICogRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgRmxvYXQzMng0TGlzdCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0TGlzdCkKICBmYWN0b3J5IEZsb2F0MzJ4NExpc3QoaW50IGxlbmd0aCkgbmF0aXZlICJUeXBlZERhdGFfRmxvYXQzMng0QXJyYXlfbmV3IjsKCiAgQHBhdGNoCiAgZmFjdG9yeSBGbG9hdDMyeDRMaXN0LmZyb21MaXN0KExpc3Q8RmxvYXQzMng0PiBlbGVtZW50cykgewogICAgcmV0dXJuIG5ldyBGbG9hdDMyeDRMaXN0KGVsZW1lbnRzLmxlbmd0aCkKICAgICAgLi5zZXRSYW5nZSgwLCBlbGVtZW50cy5sZW5ndGgsIGVsZW1lbnRzKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0MzJ4NExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9GbG9hdDMyeDRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQzMng0TGlzdCB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEZsb2F0MzJ4NChpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEZsb2F0MzJ4NCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRGbG9hdDMyeDQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0MzJ4NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBGbG9hdDMyeDRMaXN0KGxlbmd0aCk7CiAgfQoKICBGbG9hdDMyeDQgX2dldEluZGV4ZWRGbG9hdDMyeDQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEZsb2F0MzJ4NChpbmRleCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRGbG9hdDMyeDQoaW50IGluZGV4LCBGbG9hdDMyeDQgdmFsdWUpIHsKICAgIF9zZXRGbG9hdDMyeDQoaW5kZXggKiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEludDMyeDRMaXN0IHsKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0TGlzdCkKICBmYWN0b3J5IEludDMyeDRMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX0ludDMyeDRBcnJheV9uZXciOwoKICBAcGF0Y2gKICBmYWN0b3J5IEludDMyeDRMaXN0LmZyb21MaXN0KExpc3Q8SW50MzJ4ND4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QoZWxlbWVudHMubGVuZ3RoKQogICAgICAuLnNldFJhbmdlKDAsIGVsZW1lbnRzLmxlbmd0aCwgZWxlbWVudHMpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50MzJ4NExpc3QgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnQzMng0TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDMyeDRMaXN0IHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRJbnQzMng0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgSW50MzJ4NCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRJbnQzMng0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50MzJ4NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQzMng0TGlzdChsZW5ndGgpOwogIH0KCiAgSW50MzJ4NCBfZ2V0SW5kZXhlZEludDMyeDQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDMyeDQoaW5kZXggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEludDMyeDQoaW50IGluZGV4LCBJbnQzMng0IHZhbHVlKSB7CiAgICBfc2V0SW50MzJ4NChpbmRleCAqIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHBhdGNoCmNsYXNzIEZsb2F0NjR4Mkxpc3QgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4Mkxpc3QpCiAgZmFjdG9yeSBGbG9hdDY0eDJMaXN0KGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhX0Zsb2F0NjR4MkFycmF5X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdC5mcm9tTGlzdChMaXN0PEZsb2F0NjR4Mj4gZWxlbWVudHMpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyTGlzdChlbGVtZW50cy5sZW5ndGgpCiAgICAgIC4uc2V0UmFuZ2UoMCwgZWxlbWVudHMubGVuZ3RoLCBlbGVtZW50cyk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9GbG9hdDY0eDJMaXN0IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRmxvYXQ2NHgyTGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0NjR4Mkxpc3QgewogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDY0eDIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBGbG9hdDY0eDIgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQ2NHgyKGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDY0eDJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyTGlzdChsZW5ndGgpOwogIH0KCiAgRmxvYXQ2NHgyIF9nZXRJbmRleGVkRmxvYXQ2NHgyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDY0eDIoaW5kZXggKiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkRmxvYXQ2NHgyKGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBfc2V0RmxvYXQ2NHgyKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsSW50OEFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDhMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEludDgoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbnQ4KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQ4TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxVaW50OEFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQ4TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0VWludDgoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRVaW50OChpbmRleCwgX3RvVWludDgodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDhMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFVpbnQ4Q2xhbXBlZEFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQ4Q2xhbXBlZExpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldFVpbnQ4KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0VWludDgoaW5kZXgsIF90b0NsYW1wZWRVaW50OCh2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50OENsYW1wZWRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDhDbGFtcGVkTGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxJbnQxNkFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDE2TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEludDE2KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZEludDE2KGluZGV4LCBfdG9JbnQxNih2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQxNkxpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZEludDE2KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRJbnQxNihpbmRleCAqIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEludDE2KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBfc2V0SW50MTYoaW5kZXggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFVpbnQxNkFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQxNkxpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgoKICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRVaW50MTYoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkVWludDE2KGluZGV4LCBfdG9VaW50MTYodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIFVpbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50MTZMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRVaW50MTYoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldFVpbnQxNihpbmRleCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRVaW50MTYoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRVaW50MTYoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxJbnQzMkFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDMyTGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50MzIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50MzIoaW5kZXgsIF90b0ludDMyKHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDMyTGlzdChsZW5ndGgpOwogIH0KCiAgaW50IF9nZXRJbmRleGVkSW50MzIoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDMyKGluZGV4ICogSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkSW50MzIoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIF9zZXRJbnQzMihpbmRleCAqIEludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsVWludDMyQXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgVWludDMyTGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZFVpbnQzMihpbmRleCk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRVaW50MzIoaW5kZXgsIF90b1VpbnQzMih2YWx1ZSkpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQzMkxpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZFVpbnQzMihpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0VWludDMyKGluZGV4ICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZFVpbnQzMihpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldFVpbnQzMihpbmRleCAqIFVpbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEludDY0QXJyYXkgZXh0ZW5kcyBfVHlwZWRMaXN0CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgSW50NjRMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkSW50NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkSW50NjQoaW5kZXgsIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50NjRMaXN0KGxlbmd0aCk7CiAgfQoKICBpbnQgX2dldEluZGV4ZWRJbnQ2NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0SW50NjQoaW5kZXggKiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KTsKICB9CgogIHZvaWQgX3NldEluZGV4ZWRJbnQ2NChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldEludDY0KGluZGV4ICogSW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxVaW50NjRBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBVaW50NjRMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF9nZXRJbmRleGVkVWludDY0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfc2V0SW5kZXhlZFVpbnQ2NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ2NExpc3QobGVuZ3RoKTsKICB9CgogIGludCBfZ2V0SW5kZXhlZFVpbnQ2NChpbnQgaW5kZXgpIHsKICAgIHJldHVybiBfZ2V0VWludDY0KGluZGV4ICogVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZFVpbnQ2NChpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgX3NldFVpbnQ2NChpbmRleCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEZsb2F0MzJBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0RvdWJsZUxpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDMyTGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIGRvdWJsZSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEZsb2F0MzIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQzMihpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMkxpc3QobGVuZ3RoKTsKICB9CgogIGRvdWJsZSBfZ2V0SW5kZXhlZEZsb2F0MzIoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEZsb2F0MzIoaW5kZXggKiBGbG9hdDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0MzIoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIF9zZXRGbG9hdDMyKGluZGV4ICogRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEZsb2F0NjRBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0RvdWJsZUxpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDY0TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIGRvdWJsZSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfZ2V0SW5kZXhlZEZsb2F0NjQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQ2NChpbmRleCwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NExpc3QobGVuZ3RoKTsKICB9CgogIGRvdWJsZSBfZ2V0SW5kZXhlZEZsb2F0NjQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEZsb2F0NjQoaW5kZXggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEZsb2F0NjQoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIF9zZXRGbG9hdDY0KGluZGV4ICogRmxvYXQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50LCB2YWx1ZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbEZsb2F0MzJ4NEFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfRmxvYXQzMng0TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0MzJ4NExpc3QgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIExpc3QgaW50ZXJmYWNlLgoKICBGbG9hdDMyeDQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDMyeDQoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBGbG9hdDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQzMng0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMng0TGlzdChsZW5ndGgpOwogIH0KCiAgRmxvYXQzMng0IF9nZXRJbmRleGVkRmxvYXQzMng0KGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDMyeDQoaW5kZXggKiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkRmxvYXQzMng0KGludCBpbmRleCwgRmxvYXQzMng0IHZhbHVlKSB7CiAgICBfc2V0RmxvYXQzMng0KGluZGV4ICogRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0V4dGVybmFsSW50MzJ4NEFycmF5IGV4dGVuZHMgX1R5cGVkTGlzdAogICAgd2l0aCBfSW50MzJ4NExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQzMng0TGlzdCB7CiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UuCgogIEludDMyeDQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRJbnQzMng0KGluZGV4KTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgSW50MzJ4NCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3NldEluZGV4ZWRJbnQzMng0KGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50MzJ4NExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQzMng0TGlzdChsZW5ndGgpOwogIH0KCiAgSW50MzJ4NCBfZ2V0SW5kZXhlZEludDMyeDQoaW50IGluZGV4KSB7CiAgICByZXR1cm4gX2dldEludDMyeDQoaW5kZXggKiBJbnQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZEludDMyeDQoaW50IGluZGV4LCBJbnQzMng0IHZhbHVlKSB7CiAgICBfc2V0SW50MzJ4NChpbmRleCAqIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCwgdmFsdWUpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxGbG9hdDY0eDJBcnJheSBleHRlbmRzIF9UeXBlZExpc3QKICAgIHdpdGggX0Zsb2F0NjR4Mkxpc3RNaXhpbgogICAgaW1wbGVtZW50cyBGbG9hdDY0eDJMaXN0IHsKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBMaXN0IGludGVyZmFjZS4KICBGbG9hdDY0eDIgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX2dldEluZGV4ZWRGbG9hdDY0eDIoaW5kZXgpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBGbG9hdDY0eDIgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF9zZXRJbmRleGVkRmxvYXQ2NHgyKGluZGV4LCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIHRoZSBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDY0eDJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyTGlzdChsZW5ndGgpOwogIH0KCiAgRmxvYXQ2NHgyIF9nZXRJbmRleGVkRmxvYXQ2NHgyKGludCBpbmRleCkgewogICAgcmV0dXJuIF9nZXRGbG9hdDY0eDIoaW5kZXggKiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudCk7CiAgfQoKICB2b2lkIF9zZXRJbmRleGVkRmxvYXQ2NHgyKGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7CiAgICBfc2V0RmxvYXQ2NHgyKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQsIHZhbHVlKTsKICB9Cn0KCkBwYXRjaApjbGFzcyBGbG9hdDMyeDQgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBmYWN0b3J5IEZsb2F0MzJ4NChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdykKICAgICAgbmF0aXZlICJGbG9hdDMyeDRfZnJvbURvdWJsZXMiOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgZmFjdG9yeSBGbG9hdDMyeDQuc3BsYXQoZG91YmxlIHYpIG5hdGl2ZSAiRmxvYXQzMng0X3NwbGF0IjsKCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIGZhY3RvcnkgRmxvYXQzMng0Lnplcm8oKSBuYXRpdmUgIkZsb2F0MzJ4NF96ZXJvIjsKCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIGZhY3RvcnkgRmxvYXQzMng0LmZyb21JbnQzMng0Qml0cyhJbnQzMng0IHgpCiAgICAgIG5hdGl2ZSAiRmxvYXQzMng0X2Zyb21JbnQzMng0Qml0cyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBmYWN0b3J5IEZsb2F0MzJ4NC5mcm9tRmxvYXQ2NHgyKEZsb2F0NjR4MiB2KSBuYXRpdmUgIkZsb2F0MzJ4NF9mcm9tRmxvYXQ2NHgyIjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQzMng0IGltcGxlbWVudHMgRmxvYXQzMng0IHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IG9wZXJhdG9yICsoRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9hZGQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgb3BlcmF0b3IgLSgpIG5hdGl2ZSAiRmxvYXQzMng0X25lZ2F0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBvcGVyYXRvciAtKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfc3ViIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IG9wZXJhdG9yICooRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9tdWwiOwogIEZsb2F0MzJ4NCBvcGVyYXRvciAvKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfZGl2IjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgbGVzc1RoYW4oRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9jbXBsdCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IGxlc3NUaGFuT3JFcXVhbChGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X2NtcGx0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IGdyZWF0ZXJUaGFuKEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfY21wZ3QiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBncmVhdGVyVGhhbk9yRXF1YWwoRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9jbXBndGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgSW50MzJ4NCBlcXVhbChGbG9hdDMyeDQgb3RoZXIpIG5hdGl2ZSAiRmxvYXQzMng0X2NtcGVxdWFsIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgbm90RXF1YWwoRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9jbXBuZXF1YWwiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgc2NhbGUoZG91YmxlIHMpIG5hdGl2ZSAiRmxvYXQzMng0X3NjYWxlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IGFicygpIG5hdGl2ZSAiRmxvYXQzMng0X2FicyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBjbGFtcChGbG9hdDMyeDQgbG93ZXJMaW1pdCwgRmxvYXQzMng0IHVwcGVyTGltaXQpCiAgICAgIG5hdGl2ZSAiRmxvYXQzMng0X2NsYW1wIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIGdldCB4IG5hdGl2ZSAiRmxvYXQzMng0X2dldFgiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgZ2V0IHkgbmF0aXZlICJGbG9hdDMyeDRfZ2V0WSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBnZXQgeiBuYXRpdmUgIkZsb2F0MzJ4NF9nZXRaIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIGdldCB3IG5hdGl2ZSAiRmxvYXQzMng0X2dldFciOwogIGludCBnZXQgc2lnbk1hc2sgbmF0aXZlICJGbG9hdDMyeDRfZ2V0U2lnbk1hc2siOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHNodWZmbGUoaW50IG1hc2spIG5hdGl2ZSAiRmxvYXQzMng0X3NodWZmbGUiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgc2h1ZmZsZU1peChGbG9hdDMyeDQgencsIGludCBtYXNrKSBuYXRpdmUgIkZsb2F0MzJ4NF9zaHVmZmxlTWl4IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCB3aXRoWChkb3VibGUgeCkgbmF0aXZlICJGbG9hdDMyeDRfc2V0WCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCB3aXRoWShkb3VibGUgeSkgbmF0aXZlICJGbG9hdDMyeDRfc2V0WSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCB3aXRoWihkb3VibGUgeikgbmF0aXZlICJGbG9hdDMyeDRfc2V0WiI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCB3aXRoVyhkb3VibGUgdykgbmF0aXZlICJGbG9hdDMyeDRfc2V0VyI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQzMng0KQogIEZsb2F0MzJ4NCBtaW4oRmxvYXQzMng0IG90aGVyKSBuYXRpdmUgIkZsb2F0MzJ4NF9taW4iOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NCkKICBGbG9hdDMyeDQgbWF4KEZsb2F0MzJ4NCBvdGhlcikgbmF0aXZlICJGbG9hdDMyeDRfbWF4IjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHNxcnQoKSBuYXRpdmUgIkZsb2F0MzJ4NF9zcXJ0IjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHJlY2lwcm9jYWwoKSBuYXRpdmUgIkZsb2F0MzJ4NF9yZWNpcHJvY2FsIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHJlY2lwcm9jYWxTcXJ0KCkgbmF0aXZlICJGbG9hdDMyeDRfcmVjaXByb2NhbFNxcnQiOwp9CgpAcGF0Y2gKY2xhc3MgSW50MzJ4NCB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBmYWN0b3J5IEludDMyeDQoaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHcpIG5hdGl2ZSAiSW50MzJ4NF9mcm9tSW50cyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDMyeDQpCiAgZmFjdG9yeSBJbnQzMng0LmJvb2woYm9vbCB4LCBib29sIHksIGJvb2wgeiwgYm9vbCB3KQogICAgICBuYXRpdmUgIkludDMyeDRfZnJvbUJvb2xzIjsKCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBmYWN0b3J5IEludDMyeDQuZnJvbUZsb2F0MzJ4NEJpdHMoRmxvYXQzMng0IHgpCiAgICAgIG5hdGl2ZSAiSW50MzJ4NF9mcm9tRmxvYXQzMng0Qml0cyI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDMyeDQgaW1wbGVtZW50cyBJbnQzMng0IHsKICBJbnQzMng0IG9wZXJhdG9yIHwoSW50MzJ4NCBvdGhlcikgbmF0aXZlICJJbnQzMng0X29yIjsKICBJbnQzMng0IG9wZXJhdG9yICYoSW50MzJ4NCBvdGhlcikgbmF0aXZlICJJbnQzMng0X2FuZCI7CiAgSW50MzJ4NCBvcGVyYXRvciBeKEludDMyeDQgb3RoZXIpIG5hdGl2ZSAiSW50MzJ4NF94b3IiOwogIEludDMyeDQgb3BlcmF0b3IgKyhJbnQzMng0IG90aGVyKSBuYXRpdmUgIkludDMyeDRfYWRkIjsKICBJbnQzMng0IG9wZXJhdG9yIC0oSW50MzJ4NCBvdGhlcikgbmF0aXZlICJJbnQzMng0X3N1YiI7CiAgaW50IGdldCB4IG5hdGl2ZSAiSW50MzJ4NF9nZXRYIjsKICBpbnQgZ2V0IHkgbmF0aXZlICJJbnQzMng0X2dldFkiOwogIGludCBnZXQgeiBuYXRpdmUgIkludDMyeDRfZ2V0WiI7CiAgaW50IGdldCB3IG5hdGl2ZSAiSW50MzJ4NF9nZXRXIjsKICBpbnQgZ2V0IHNpZ25NYXNrIG5hdGl2ZSAiSW50MzJ4NF9nZXRTaWduTWFzayI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfSW50MzJ4NCkKICBJbnQzMng0IHNodWZmbGUoaW50IG1hc2spIG5hdGl2ZSAiSW50MzJ4NF9zaHVmZmxlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgc2h1ZmZsZU1peChJbnQzMng0IHp3LCBpbnQgbWFzaykgbmF0aXZlICJJbnQzMng0X3NodWZmbGVNaXgiOwogIEludDMyeDQgd2l0aFgoaW50IHgpIG5hdGl2ZSAiSW50MzJ4NF9zZXRYIjsKICBJbnQzMng0IHdpdGhZKGludCB5KSBuYXRpdmUgIkludDMyeDRfc2V0WSI7CiAgSW50MzJ4NCB3aXRoWihpbnQgeikgbmF0aXZlICJJbnQzMng0X3NldFoiOwogIEludDMyeDQgd2l0aFcoaW50IHcpIG5hdGl2ZSAiSW50MzJ4NF9zZXRXIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBnZXQgZmxhZ1ggbmF0aXZlICJJbnQzMng0X2dldEZsYWdYIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBnZXQgZmxhZ1kgbmF0aXZlICJJbnQzMng0X2dldEZsYWdZIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBnZXQgZmxhZ1ogbmF0aXZlICJJbnQzMng0X2dldEZsYWdaIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBnZXQgZmxhZ1cgbmF0aXZlICJJbnQzMng0X2dldEZsYWdXIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgd2l0aEZsYWdYKGJvb2wgeCkgbmF0aXZlICJJbnQzMng0X3NldEZsYWdYIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgd2l0aEZsYWdZKGJvb2wgeSkgbmF0aXZlICJJbnQzMng0X3NldEZsYWdZIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgd2l0aEZsYWdaKGJvb2wgeikgbmF0aXZlICJJbnQzMng0X3NldEZsYWdaIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0KQogIEludDMyeDQgd2l0aEZsYWdXKGJvb2wgdykgbmF0aXZlICJJbnQzMng0X3NldEZsYWdXIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDMyeDQpCiAgRmxvYXQzMng0IHNlbGVjdChGbG9hdDMyeDQgdHJ1ZVZhbHVlLCBGbG9hdDMyeDQgZmFsc2VWYWx1ZSkKICAgICAgbmF0aXZlICJJbnQzMng0X3NlbGVjdCI7Cn0KCkBwYXRjaApjbGFzcyBGbG9hdDY0eDIgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBmYWN0b3J5IEZsb2F0NjR4Mihkb3VibGUgeCwgZG91YmxlIHkpIG5hdGl2ZSAiRmxvYXQ2NHgyX2Zyb21Eb3VibGVzIjsKCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIGZhY3RvcnkgRmxvYXQ2NHgyLnNwbGF0KGRvdWJsZSB2KSBuYXRpdmUgIkZsb2F0NjR4Ml9zcGxhdCI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBmYWN0b3J5IEZsb2F0NjR4Mi56ZXJvKCkgbmF0aXZlICJGbG9hdDY0eDJfemVybyI7CgogIEBwYXRjaAogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBmYWN0b3J5IEZsb2F0NjR4Mi5mcm9tRmxvYXQzMng0KEZsb2F0MzJ4NCB2KSBuYXRpdmUgIkZsb2F0NjR4Ml9mcm9tRmxvYXQzMng0IjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQ2NHgyIGltcGxlbWVudHMgRmxvYXQ2NHgyIHsKICBGbG9hdDY0eDIgb3BlcmF0b3IgKyhGbG9hdDY0eDIgb3RoZXIpIG5hdGl2ZSAiRmxvYXQ2NHgyX2FkZCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiBvcGVyYXRvciAtKCkgbmF0aXZlICJGbG9hdDY0eDJfbmVnYXRlIjsKICBGbG9hdDY0eDIgb3BlcmF0b3IgLShGbG9hdDY0eDIgb3RoZXIpIG5hdGl2ZSAiRmxvYXQ2NHgyX3N1YiI7CiAgRmxvYXQ2NHgyIG9wZXJhdG9yICooRmxvYXQ2NHgyIG90aGVyKSBuYXRpdmUgIkZsb2F0NjR4Ml9tdWwiOwogIEZsb2F0NjR4MiBvcGVyYXRvciAvKEZsb2F0NjR4MiBvdGhlcikgbmF0aXZlICJGbG9hdDY0eDJfZGl2IjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgRmxvYXQ2NHgyIHNjYWxlKGRvdWJsZSBzKSBuYXRpdmUgIkZsb2F0NjR4Ml9zY2FsZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiBhYnMoKSBuYXRpdmUgIkZsb2F0NjR4Ml9hYnMiOwogIEZsb2F0NjR4MiBjbGFtcChGbG9hdDY0eDIgbG93ZXJMaW1pdCwgRmxvYXQ2NHgyIHVwcGVyTGltaXQpCiAgICAgIG5hdGl2ZSAiRmxvYXQ2NHgyX2NsYW1wIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX0RvdWJsZSIpCiAgZG91YmxlIGdldCB4IG5hdGl2ZSAiRmxvYXQ2NHgyX2dldFgiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfRG91YmxlIikKICBkb3VibGUgZ2V0IHkgbmF0aXZlICJGbG9hdDY0eDJfZ2V0WSI7CiAgaW50IGdldCBzaWduTWFzayBuYXRpdmUgIkZsb2F0NjR4Ml9nZXRTaWduTWFzayI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiB3aXRoWChkb3VibGUgeCkgbmF0aXZlICJGbG9hdDY0eDJfc2V0WCI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiB3aXRoWShkb3VibGUgeSkgbmF0aXZlICJGbG9hdDY0eDJfc2V0WSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyKQogIEZsb2F0NjR4MiBtaW4oRmxvYXQ2NHgyIG90aGVyKSBuYXRpdmUgIkZsb2F0NjR4Ml9taW4iOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0NjR4MikKICBGbG9hdDY0eDIgbWF4KEZsb2F0NjR4MiBvdGhlcikgbmF0aXZlICJGbG9hdDY0eDJfbWF4IjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0eDIpCiAgRmxvYXQ2NHgyIHNxcnQoKSBuYXRpdmUgIkZsb2F0NjR4Ml9zcXJ0IjsKfQoKY2xhc3MgX1R5cGVkTGlzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIExpc3Q8RT4gX2FycmF5OwogIGZpbmFsIGludCBfbGVuZ3RoOwogIGludCBfcG9zaXRpb247CiAgRSBfY3VycmVudDsKCiAgX1R5cGVkTGlzdEl0ZXJhdG9yKExpc3QgYXJyYXkpCiAgICAgIDogX2FycmF5ID0gYXJyYXksCiAgICAgICAgX2xlbmd0aCA9IGFycmF5Lmxlbmd0aCwKICAgICAgICBfcG9zaXRpb24gPSAtMSB7CiAgICBhc3NlcnQoYXJyYXkgaXMgX1R5cGVkTGlzdCB8fCBhcnJheSBpcyBfVHlwZWRMaXN0Vmlldyk7CiAgfQoKICBib29sIG1vdmVOZXh0KCkgewogICAgaW50IG5leHRQb3NpdGlvbiA9IF9wb3NpdGlvbiArIDE7CiAgICBpZiAobmV4dFBvc2l0aW9uIDwgX2xlbmd0aCkgewogICAgICBfY3VycmVudCA9IF9hcnJheVtuZXh0UG9zaXRpb25dOwogICAgICBfcG9zaXRpb24gPSBuZXh0UG9zaXRpb247CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX3Bvc2l0aW9uID0gX2xlbmd0aDsKICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCmFic3RyYWN0IGNsYXNzIF9UeXBlZExpc3RWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdEJhc2UgaW1wbGVtZW50cyBUeXBlZERhdGEgewogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgdGhlIFR5cGVkRGF0YSBpbnRlcmZhY2UuCgogIGludCBnZXQgbGVuZ3RoSW5CeXRlcyB7CiAgICByZXR1cm4gbGVuZ3RoICogZWxlbWVudFNpemVJbkJ5dGVzOwogIH0KCiAgX0J5dGVCdWZmZXIgZ2V0IGJ1ZmZlciB7CiAgICByZXR1cm4gX3R5cGVkRGF0YS5idWZmZXI7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIF9UeXBlZExpc3QgZ2V0IF90eXBlZERhdGEgbmF0aXZlICJUeXBlZERhdGFWaWV3X3R5cGVkRGF0YSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXMgbmF0aXZlICJUeXBlZERhdGFWaWV3X29mZnNldEluQnl0ZXMiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBsZW5ndGggbmF0aXZlICJUeXBlZERhdGFWaWV3X2xlbmd0aCI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDhBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDhMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQ4QXJyYXlWaWV3KQogIGZhY3RvcnkgX0ludDhBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfSW50OEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRJbnQ4KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQ4KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpLCBfdG9JbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQ4TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDhMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50OEFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgVWludDhMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50OEFycmF5VmlldykKICBmYWN0b3J5IF9VaW50OEFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19VaW50OEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRVaW50OChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQ4KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50OExpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvVWludDgodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50OExpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQ4Q2xhbXBlZEFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgVWludDhDbGFtcGVkTGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDhDbGFtcGVkQXJyYXlWaWV3KQogIGZhY3RvcnkgX1VpbnQ4Q2xhbXBlZEFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsCiAgICAgIGludCBsZW5ndGgpIG5hdGl2ZSAiVHlwZWREYXRhVmlld19VaW50OENsYW1wZWRBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0VWludDgob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50OChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDhMaXN0LmJ5dGVzUGVyRWxlbWVudCksCiAgICAgICAgX3RvQ2xhbXBlZFVpbnQ4KHZhbHVlKSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIFVpbnQ4TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDE2QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQxNkxpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDE2QXJyYXlWaWV3KQogIGZhY3RvcnkgX0ludDE2QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0ludDE2QXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEludDE2KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50MTYoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQpLCBfdG9JbnQxNih2YWx1ZSkpOwogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlIGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgQ29kZVVuaXRzKSB7CiAgICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICBpbnQgYnl0ZVN0YXJ0ID0gdGhpcy5vZmZzZXRJbkJ5dGVzICsgc3RhcnQgKiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogICAgICBfdHlwZWREYXRhLl9zZXRDb2RlVW5pdHMoaXRlcmFibGUsIGJ5dGVTdGFydCwgbGVuZ3RoLCBza2lwQ291bnQpOwogICAgfSBlbHNlIHsKICAgICAgc3VwZXIuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgaXRlcmFibGUsIHNraXBDb3VudCk7CiAgICB9CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBJbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDE2TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEludDE2TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVWludDE2QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBVaW50MTZMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9VaW50MTZBcnJheVZpZXcpCiAgZmFjdG9yeSBfVWludDE2QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X1VpbnQxNkFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRVaW50MTYob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQxNkxpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDE2KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudCksIF90b1VpbnQxNih2YWx1ZSkpOwogIH0KCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlIGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKSB7CiAgICBpZiAoaXRlcmFibGUgaXMgQ29kZVVuaXRzKSB7CiAgICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICBpbnQgYnl0ZVN0YXJ0ID0gdGhpcy5vZmZzZXRJbkJ5dGVzICsgc3RhcnQgKiBVaW50MTZMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICAgICAgX3R5cGVkRGF0YS5fc2V0Q29kZVVuaXRzKGl0ZXJhYmxlLCBieXRlU3RhcnQsIGxlbmd0aCwgc2tpcENvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwogICAgfQogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgoKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDE2TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCgogIFVpbnQxNkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50MTZMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbnQzMkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgSW50MzJMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMkFycmF5VmlldykKICBmYWN0b3J5IF9JbnQzMkFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19JbnQzMkFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGludCBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRJbnQzMihvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDMyKAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50KSwgX3RvSW50MzIodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBJbnQzMkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBJbnQzMkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1VpbnQzMkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnRMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgVWludDMyTGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfVWludDMyQXJyYXlWaWV3KQogIGZhY3RvcnkgX1VpbnQzMkFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19VaW50MzJBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBpbnQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0VWludDMyKG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBVaW50MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQzMigKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQpLCBfdG9VaW50MzIodmFsdWUpKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gVWludDMyTGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgVWludDMyTGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IFVpbnQzMkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ludDY0QXJyYXlWaWV3IGV4dGVuZHMgX1R5cGVkTGlzdFZpZXcKICAgIHdpdGggX0ludExpc3RNaXhpbgogICAgaW1wbGVtZW50cyBJbnQ2NExpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0ludDY0QXJyYXlWaWV3KQogIGZhY3RvcnkgX0ludDY0QXJyYXlWaWV3KF9UeXBlZExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkKICAgICAgbmF0aXZlICJUeXBlZERhdGFWaWV3X0ludDY0QXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEludDY0KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBJbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50NjQoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpLCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQ7CiAgfQoKICAvLyBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMuCiAgSW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50NjRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9VaW50NjRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfSW50TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIFVpbnQ2NExpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX1VpbnQ2NEFycmF5VmlldykKICBmYWN0b3J5IF9VaW50NjRBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfVWludDY0QXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgaW50IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldFVpbnQ2NChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogVWludDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50NjQoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIFVpbnQ2NExpc3QuYnl0ZXNQZXJFbGVtZW50KSwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBVaW50NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBVaW50NjRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgVWludDY0TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRmxvYXQzMkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9Eb3VibGVMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQzMkxpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJBcnJheVZpZXcpCiAgZmFjdG9yeSBfRmxvYXQzMkFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19GbG9hdDMyQXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgZG91YmxlIG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEZsb2F0MzIob2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEZsb2F0MzIoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0MzJMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gRmxvYXQzMkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0MzJMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMkxpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0NjRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfRG91YmxlTGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0NjRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9GbG9hdDY0QXJyYXlWaWV3KQogIGZhY3RvcnkgX0Zsb2F0NjRBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfRmxvYXQ2NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIGRvdWJsZSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIHJldHVybiBfdHlwZWREYXRhCiAgICAgICAgLl9nZXRGbG9hdDY0KG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRGbG9hdDY0KAogICAgICAgIG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDY0TGlzdC5ieXRlc1BlckVsZW1lbnQpLCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0NjRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDY0TGlzdCBfY3JlYXRlTGlzdChpbnQgbGVuZ3RoKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0NjRMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9GbG9hdDMyeDRBcnJheVZpZXcgZXh0ZW5kcyBfVHlwZWRMaXN0VmlldwogICAgd2l0aCBfRmxvYXQzMng0TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEZsb2F0MzJ4NExpc3QgewogIC8vIENvbnN0cnVjdG9yLgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0Zsb2F0MzJ4NEFycmF5VmlldykKICBmYWN0b3J5IF9GbG9hdDMyeDRBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfRmxvYXQzMng0QXJyYXlWaWV3X25ldyI7CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgTGlzdCBpbnRlcmZhY2UuCiAgRmxvYXQzMng0IG9wZXJhdG9yIFtdKGludCBpbmRleCkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEKICAgICAgICAuX2dldEZsb2F0MzJ4NChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogRmxvYXQzMng0TGlzdC5ieXRlc1BlckVsZW1lbnQpKTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KGludCBpbmRleCwgRmxvYXQzMng0IHZhbHVlKSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRGbG9hdDMyeDQoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEZsb2F0MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KSwgdmFsdWUpOwogIH0KCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzIHsKICAgIHJldHVybiBGbG9hdDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudDsKICB9CgogIC8vIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcy4KICBGbG9hdDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgRmxvYXQzMng0TGlzdChsZW5ndGgpOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfSW50MzJ4NEFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9JbnQzMng0TGlzdE1peGluCiAgICBpbXBsZW1lbnRzIEludDMyeDRMaXN0IHsKICAvLyBDb25zdHJ1Y3Rvci4KICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9JbnQzMng0QXJyYXlWaWV3KQogIGZhY3RvcnkgX0ludDMyeDRBcnJheVZpZXcoX1R5cGVkTGlzdCBidWZmZXIsIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIlR5cGVkRGF0YVZpZXdfSW50MzJ4NEFycmF5Vmlld19uZXciOwoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIExpc3QgaW50ZXJmYWNlLgogIEludDMyeDQgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0SW50MzJ4NChvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50KSk7CiAgfQoKICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDMyeDQoCiAgICAgICAgb2Zmc2V0SW5CeXRlcyArIChpbmRleCAqIEludDMyeDRMaXN0LmJ5dGVzUGVyRWxlbWVudCksIHZhbHVlKTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgVHlwZWREYXRhIGludGVyZmFjZS4KICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gSW50MzJ4NExpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEludDMyeDRMaXN0IF9jcmVhdGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHJldHVybiBuZXcgSW50MzJ4NExpc3QobGVuZ3RoKTsKICB9Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0Zsb2F0NjR4MkFycmF5VmlldyBleHRlbmRzIF9UeXBlZExpc3RWaWV3CiAgICB3aXRoIF9GbG9hdDY0eDJMaXN0TWl4aW4KICAgIGltcGxlbWVudHMgRmxvYXQ2NHgyTGlzdCB7CiAgLy8gQ29uc3RydWN0b3IuCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRmxvYXQ2NHgyQXJyYXlWaWV3KQogIGZhY3RvcnkgX0Zsb2F0NjR4MkFycmF5VmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19GbG9hdDY0eDJBcnJheVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBMaXN0IGludGVyZmFjZS4KICBGbG9hdDY0eDIgb3BlcmF0b3IgW10oaW50IGluZGV4KSB7CiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChpbmRleCwgdGhpcywgImluZGV4Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YQogICAgICAgIC5fZ2V0RmxvYXQ2NHgyKG9mZnNldEluQnl0ZXMgKyAoaW5kZXggKiBGbG9hdDY0eDJMaXN0LmJ5dGVzUGVyRWxlbWVudCkpOwogIH0KCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBGbG9hdDY0eDIgdmFsdWUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGluZGV4LCB0aGlzLCAiaW5kZXgiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEZsb2F0NjR4MigKICAgICAgICBvZmZzZXRJbkJ5dGVzICsgKGluZGV4ICogRmxvYXQ2NHgyTGlzdC5ieXRlc1BlckVsZW1lbnQpLCB2YWx1ZSk7CiAgfQoKICAvLyBNZXRob2QocykgaW1wbGVtZW50aW5nIFR5cGVkRGF0YSBpbnRlcmZhY2UuCiAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgewogICAgcmV0dXJuIEZsb2F0NjR4Mkxpc3QuYnl0ZXNQZXJFbGVtZW50OwogIH0KCiAgLy8gSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzLgogIEZsb2F0NjR4Mkxpc3QgX2NyZWF0ZUxpc3QoaW50IGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBGbG9hdDY0eDJMaXN0KGxlbmd0aCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9CeXRlRGF0YVZpZXcgaW1wbGVtZW50cyBCeXRlRGF0YSB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfQnl0ZURhdGFWaWV3KQogIGZhY3RvcnkgX0J5dGVEYXRhVmlldyhfVHlwZWRMaXN0IGJ1ZmZlciwgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpCiAgICAgIG5hdGl2ZSAiVHlwZWREYXRhVmlld19CeXRlRGF0YVZpZXdfbmV3IjsKCiAgLy8gTWV0aG9kKHMpIGltcGxlbWVudGluZyBUeXBlZERhdGEgaW50ZXJmYWNlLgogIF9CeXRlQnVmZmVyIGdldCBidWZmZXIgewogICAgcmV0dXJuIF90eXBlZERhdGEuYnVmZmVyOwogIH0KCiAgaW50IGdldCBsZW5ndGhJbkJ5dGVzIHsKICAgIHJldHVybiBsZW5ndGg7CiAgfQoKICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyB7CiAgICByZXR1cm4gMTsKICB9CgogIC8vIE1ldGhvZChzKSBpbXBsZW1lbnRpbmcgQnl0ZURhdGEgaW50ZXJmYWNlLgoKICBpbnQgZ2V0SW50OChpbnQgYnl0ZU9mZnNldCkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGJ5dGVPZmZzZXQsIHRoaXMsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICByZXR1cm4gX3R5cGVkRGF0YS5fZ2V0SW50OChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgfQoKICB2b2lkIHNldEludDgoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGJ5dGVPZmZzZXQsIHRoaXMsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQ4KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LCB2YWx1ZSk7CiAgfQoKICBpbnQgZ2V0VWludDgoaW50IGJ5dGVPZmZzZXQpIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5pbmRleChieXRlT2Zmc2V0LCB0aGlzLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgcmV0dXJuIF90eXBlZERhdGEuX2dldFVpbnQ4KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICB9CgogIHZvaWQgc2V0VWludDgoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLmluZGV4KGJ5dGVPZmZzZXQsIHRoaXMsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50OChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgdmFsdWUpOwogIH0KCiAgaW50IGdldEludDE2KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDEgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDIsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3R5cGVkRGF0YS5fZ2V0SW50MTYob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgaWYgKGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9ieXRlU3dhcDE2KHJlc3VsdCkudG9TaWduZWQoMTYpOwogIH0KCiAgdm9pZCBzZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDEgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDIsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRJbnQxNihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwKICAgICAgICBpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkgPyB2YWx1ZSA6IF9ieXRlU3dhcDE2KHZhbHVlKSk7CiAgfQoKICBpbnQgZ2V0VWludDE2KGludCBieXRlT2Zmc2V0LCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDEgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDIsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3R5cGVkRGF0YS5fZ2V0VWludDE2KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfYnl0ZVN3YXAxNihyZXN1bHQpOwogIH0KCiAgdm9pZCBzZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAxID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSAyLCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0VWludDE2KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LAogICAgICAgIGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSA/IHZhbHVlIDogX2J5dGVTd2FwMTYodmFsdWUpKTsKICB9CgogIGludCBnZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAzID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSA0LCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF90eXBlZERhdGEuX2dldEludDMyKG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBfYnl0ZVN3YXAzMihyZXN1bHQpLnRvU2lnbmVkKDMyKTsKICB9CgogIHZvaWQgc2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAzID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSA0LCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgX3R5cGVkRGF0YS5fc2V0SW50MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsCiAgICAgICAgaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpID8gdmFsdWUgOiBfYnl0ZVN3YXAzMih2YWx1ZSkpOwogIH0KCiAgaW50IGdldFVpbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAzID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSA0LCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF90eXBlZERhdGEuX2dldFVpbnQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2J5dGVTd2FwMzIocmVzdWx0KTsKICB9CgogIHZvaWQgc2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldFVpbnQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwKICAgICAgICBpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkgPyB2YWx1ZSA6IF9ieXRlU3dhcDMyKHZhbHVlKSk7CiAgfQoKICBpbnQgZ2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgNyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gOCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfdHlwZWREYXRhLl9nZXRJbnQ2NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCk7CiAgICBpZiAoaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gX2J5dGVTd2FwNjQocmVzdWx0KS50b1NpZ25lZCg2NCk7CiAgfQoKICB2b2lkIHNldEludDY0KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgNyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gOCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIF90eXBlZERhdGEuX3NldEludDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LAogICAgICAgIGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSA/IHZhbHVlIDogX2J5dGVTd2FwNjQodmFsdWUpKTsKICB9CgogIGludCBnZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgNyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gOCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfdHlwZWREYXRhLl9nZXRVaW50NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgaWYgKGlkZW50aWNhbChlbmRpYW4sIEVuZGlhbi5ob3N0KSkgewogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9ieXRlU3dhcDY0KHJlc3VsdCk7CiAgfQoKICB2b2lkIHNldFVpbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbRW5kaWFuIGVuZGlhbiA9IEVuZGlhbi5iaWddKSB7CiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYnl0ZU9mZnNldCArIDcgPj0gbGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGJ5dGVPZmZzZXQsIDAsIGxlbmd0aCAtIDgsICJieXRlT2Zmc2V0Iik7CiAgICB9CiAgICBfdHlwZWREYXRhLl9zZXRVaW50NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQsCiAgICAgICAgaWRlbnRpY2FsKGVuZGlhbiwgRW5kaWFuLmhvc3QpID8gdmFsdWUgOiBfYnl0ZVN3YXA2NCh2YWx1ZSkpOwogIH0KCiAgZG91YmxlIGdldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIF90eXBlZERhdGEuX2dldEZsb2F0MzIob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgfQogICAgX2NvbnZVMzJbMF0gPQogICAgICAgIF9ieXRlU3dhcDMyKF90eXBlZERhdGEuX2dldFVpbnQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCkpOwogICAgcmV0dXJuIF9jb252RjMyWzBdOwogIH0KCiAgdm9pZCBzZXRGbG9hdDMyKGludCBieXRlT2Zmc2V0LCBkb3VibGUgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgX3R5cGVkRGF0YS5fc2V0RmxvYXQzMihvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgdmFsdWUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfY29udkYzMlswXSA9IHZhbHVlOwogICAgX3R5cGVkRGF0YS5fc2V0VWludDMyKG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LCBfYnl0ZVN3YXAzMihfY29udlUzMlswXSkpOwogIH0KCiAgZG91YmxlIGdldEZsb2F0NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgNyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gOCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgcmV0dXJuIF90eXBlZERhdGEuX2dldEZsb2F0NjQob2Zmc2V0SW5CeXRlcyArIGJ5dGVPZmZzZXQpOwogICAgfQogICAgX2NvbnZVNjRbMF0gPQogICAgICAgIF9ieXRlU3dhcDY0KF90eXBlZERhdGEuX2dldFVpbnQ2NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCkpOwogICAgcmV0dXJuIF9jb252RjY0WzBdOwogIH0KCiAgdm9pZCBzZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBkb3VibGUgdmFsdWUsIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgNyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gOCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIGlmIChpZGVudGljYWwoZW5kaWFuLCBFbmRpYW4uaG9zdCkpIHsKICAgICAgX3R5cGVkRGF0YS5fc2V0RmxvYXQ2NChvZmZzZXRJbkJ5dGVzICsgYnl0ZU9mZnNldCwgdmFsdWUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfY29udkY2NFswXSA9IHZhbHVlOwogICAgX3R5cGVkRGF0YS5fc2V0VWludDY0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LCBfYnl0ZVN3YXA2NChfY29udlU2NFswXSkpOwogIH0KCiAgRmxvYXQzMng0IGdldEZsb2F0MzJ4NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbiBlbmRpYW4gPSBFbmRpYW4uYmlnXSkgewogICAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGJ5dGVPZmZzZXQgKyAzID49IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShieXRlT2Zmc2V0LCAwLCBsZW5ndGggLSA0LCAiYnl0ZU9mZnNldCIpOwogICAgfQogICAgLy8gVE9ETyhqb2hubWNjdXRjaGFuKSA6IE5lZWQgdG8gcmVzb2x2ZSB0aGlzIGZvciBlbmRpYW5pdHkuCiAgICByZXR1cm4gX3R5cGVkRGF0YS5fZ2V0RmxvYXQzMng0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0KTsKICB9CgogIHZvaWQgc2V0RmxvYXQzMng0KGludCBieXRlT2Zmc2V0LCBGbG9hdDMyeDQgdmFsdWUsCiAgICAgIFtFbmRpYW4gZW5kaWFuID0gRW5kaWFuLmJpZ10pIHsKICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBieXRlT2Zmc2V0ICsgMyA+PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoYnl0ZU9mZnNldCwgMCwgbGVuZ3RoIC0gNCwgImJ5dGVPZmZzZXQiKTsKICAgIH0KICAgIC8vIFRPRE8oam9obm1jY3V0Y2hhbikgOiBOZWVkIHRvIHJlc29sdmUgdGhpcyBmb3IgZW5kaWFuaXR5LgogICAgX3R5cGVkRGF0YS5fc2V0RmxvYXQzMng0KG9mZnNldEluQnl0ZXMgKyBieXRlT2Zmc2V0LCB2YWx1ZSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIF9UeXBlZExpc3QgZ2V0IF90eXBlZERhdGEgbmF0aXZlICJUeXBlZERhdGFWaWV3X3R5cGVkRGF0YSI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IG9mZnNldEluQnl0ZXMgbmF0aXZlICJUeXBlZERhdGFWaWV3X29mZnNldEluQnl0ZXMiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBsZW5ndGggbmF0aXZlICJUeXBlZERhdGFWaWV3X2xlbmd0aCI7Cn0KCmludCBfYnl0ZVN3YXAxNihpbnQgdmFsdWUpIHsKICByZXR1cm4gKCh2YWx1ZSAmIDB4RkYwMCkgPj4gOCkgfCAoKHZhbHVlICYgMHgwMEZGKSA8PCA4KTsKfQoKaW50IF9ieXRlU3dhcDMyKGludCB2YWx1ZSkgewogIHZhbHVlID0gKCh2YWx1ZSAmIDB4RkYwMEZGMDApID4+IDgpIHwgKCh2YWx1ZSAmIDB4MDBGRjAwRkYpIDw8IDgpOwogIHZhbHVlID0gKCh2YWx1ZSAmIDB4RkZGRjAwMDApID4+IDE2KSB8ICgodmFsdWUgJiAweDAwMDBGRkZGKSA8PCAxNik7CiAgcmV0dXJuIHZhbHVlOwp9CgppbnQgX2J5dGVTd2FwNjQoaW50IHZhbHVlKSB7CiAgcmV0dXJuIChfYnl0ZVN3YXAzMih2YWx1ZSkgPDwgMzIpIHwgX2J5dGVTd2FwMzIodmFsdWUgPj4gMzIpOwp9CgpmaW5hbCBfY29udlUzMiA9IG5ldyBVaW50MzJMaXN0KDIpOwpmaW5hbCBfY29udlU2NCA9IG5ldyBVaW50NjRMaXN0LnZpZXcoX2NvbnZVMzIuYnVmZmVyKTsKZmluYWwgX2NvbnZGMzIgPSBuZXcgRmxvYXQzMkxpc3QudmlldyhfY29udlUzMi5idWZmZXIpOwpmaW5hbCBfY29udkY2NCA9IG5ldyBGbG9hdDY0TGlzdC52aWV3KF9jb252VTMyLmJ1ZmZlcik7CgovLyBUb3AgbGV2ZWwgdXRpbGl0eSBtZXRob2RzLgppbnQgX3RvSW50KGludCB2YWx1ZSwgaW50IG1hc2spIHsKICB2YWx1ZSAmPSBtYXNrOwogIGlmICh2YWx1ZSA+IChtYXNrID4+IDEpKSB2YWx1ZSAtPSBtYXNrICsgMTsKICByZXR1cm4gdmFsdWU7Cn0KCmludCBfdG9JbnQ4KGludCB2YWx1ZSkgewogIHJldHVybiBfdG9JbnQodmFsdWUsIDB4RkYpOwp9CgppbnQgX3RvVWludDgoaW50IHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlICYgMHhGRjsKfQoKQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQppbnQgX3RvQ2xhbXBlZFVpbnQ4KGludCB2YWx1ZSkgewogIGlmICh2YWx1ZSA8IDApIHJldHVybiAwOwogIGlmICh2YWx1ZSA+IDB4RkYpIHJldHVybiAweEZGOwogIHJldHVybiB2YWx1ZTsKfQoKaW50IF90b0ludDE2KGludCB2YWx1ZSkgewogIHJldHVybiBfdG9JbnQodmFsdWUsIDB4RkZGRik7Cn0KCmludCBfdG9VaW50MTYoaW50IHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlICYgMHhGRkZGOwp9CgppbnQgX3RvSW50MzIoaW50IHZhbHVlKSB7CiAgcmV0dXJuIF90b0ludCh2YWx1ZSwgMHhGRkZGRkZGRik7Cn0KCmludCBfdG9VaW50MzIoaW50IHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlICYgMHhGRkZGRkZGRjsKfQoKLy8gSW4gYWRkaXRpb24gdG8gZXhwbGljaXRseSBjaGVja2luZyB0aGUgcmFuZ2UsIHRoaXMgbWV0aG9kIGltcGxpY2l0bHkgZW5zdXJlcwovLyB0aGF0IGFsbCBhcmd1bWVudHMgYXJlIG5vbi1udWxsIChhIG5vIHN1Y2ggbWV0aG9kIGVycm9yIGdldHMgdGhyb3duCi8vIG90aGVyd2lzZSkuCnZvaWQgX3JhbmdlQ2hlY2soaW50IGxpc3RMZW5ndGgsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewogIGlmIChsZW5ndGggPCAwKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShsZW5ndGgpOwogIH0KICBpZiAoc3RhcnQgPCAwKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShzdGFydCk7CiAgfQogIGlmIChzdGFydCArIGxlbmd0aCA+IGxpc3RMZW5ndGgpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKHN0YXJ0ICsgbGVuZ3RoKTsKICB9Cn0KCnZvaWQgX29mZnNldEFsaWdubWVudENoZWNrKGludCBvZmZzZXQsIGludCBhbGlnbm1lbnQpIHsKICBpZiAoKG9mZnNldCAlIGFsaWdubWVudCkgIT0gMCkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ09mZnNldCAoJG9mZnNldCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mICcKICAgICAgICAnQllURVNfUEVSX0VMRU1FTlQgKCRhbGlnbm1lbnQpJyk7CiAgfQp9CpFoAE5OPAFNUEsrARgJERMYHB4VDxgYHhsOGRsXGw8BKAEgASkBByYJHCE2MC8EASIcUEFABAIBTCdOS0sgEh4ZGgE2KS4yHgQBFR0EASMBMAEaRQQBEUoEASBKBAEpSgQBPUoEAS48AR8BKUsqQERLUQIBNB4ZGgElAUABMz8BNB4/FQQBHT8jBAE8HisjBg8EATxIJyMGDwQBKjITHSczBAEiGyQrBhIEASIdGRQjDhkbFwYEAU8VNEgVBhkqBgEfLSsGARwBIkocNktHSBIwPSgqTCEkEgo6RyZRLi8qNQosKwoQCAYBFBQdGB4NQBYGMSsGOwQBTwFFATUuAUgBNS4BRQE3ATE5NwQBQwEsOQQBFSQEASYbJBIGBAE0GzoZJCcGEgQBRhskNQYZBAFPATcrASQbJCUGEQQBIhskIwYSBAE7GyQdKQYpLAQBOhspHRsYCAYpLAQBPBcgGyQdGx0wChoeCAYmKSwEAR0YBAEYRQQBJUUEASZKBAE0SgQBKzQEAS4gERwRBjAoBg8EATUxHxwRBicoBg8EARVKBAEcSgQBLUoEAS1KBAESJCwEAREtLAQBEyU9KgQBLD8eLC0TBAEzKSQEATg5KBsGBAIBOh4ZGgEoAUABOUIBNyE/FQQBID8jBAE/HisjBg8EAT9IJyMGDwQBMDIWHSczBAEiGyQrBhIEASIdGRQjDhkbFwYEATsdFTRIFQYZKgYBHy0rBgEcASJNHDZLR0sSMD0oKkwhJBIKOkcmUTEvKjUKLCsKEAgGARQUIBgeDUAWBjErBjsEATQqAUsBOzEBTgE7MQFLAT0BNDk6BAFJAS88BAEYJwQBKRskEgYEAUAbOhkkJwYSBAFJGyQ1BhkEAS0uATouAScbJCUGEQQBJRskIwYSBAFEGyQdKQYpLAQBQxspHRsYCAYpLAQBRRcgGyQdGx0wChoeCAYmKSwEASAYBAEbRQQBKEUEASlKBAE3SgQBMTQEATEgERwRBjAoBg8EATgxHxwRBicoBg8EARhKBAEfSgQBMEoEATBKBAEVJCwEARQtLAQBFiU9KgQBLz8eLy0TBAE2KSQEATs5KBsGBAIBQB4ZGgErAUABP0UBOiQ/FQQBIz8jBAFCHisjBg8EAUJIJyMGDwQBNjIZHSczBAEiGyQrBhIEASIdGRQjDhkbFwYEAT4dFTRIFQYZKgYBHy0rBgEcASJQHDZLR04SMD0oKkwhJBIKOkcmUTQvKjUKLCsKEAgGARQUIxgeDUAWBjErBjsEATotAVEBQTQBJTUBQTQBUQFDATc5PQQBTwEyPwQBGyoEASwbJBIGBAFMGzoZJCcGEgQBTBskNQYZBAEwMQE9MQEqGyQlBhEEASgbJCMGEgQBTRskHSkGKSwEAUwbKR0bGAgGKSwEAU4XIBskHRsdMAoaHggGJiksBAEjGAQBHkUEAStFBAEsSgQBOkoEATcbMAYeBAE0IBEcEQYwKAYPBAE7MR8cEQYnKAYPBAEbSgQBIkoEATNKBAEzSgQBGCQsBAEXLSwEARklPSoEATI/HjItEwQBOSkkBAE+OSgbBgQCATweGRoBKQFAATtDATgiPxUEASE/IwQBQB4rIwYPBAFASCcjBg8EATIyFx0nMwQBIhskKwYSBAEiHRkUIw4ZGxcGBAE8HRU0SBUGGSoGAR8tKwYBHAEiThw2S0dMEjA9KCpMISQSCjpHJlEyLyo1CiwrChAIBgEUFCEYHg1AFgYxKwY7BAE2KwFNAT0yAVABPTIBTQE/ATU5OwQBSwEwPQQBGSgEASobJBIGBAFEGzoZJCcGEgQBShskNQYZBAEuLwE7LwEoGyQlBhEEASYbJCMGEgQBRxskHSkGKSwEAUYbKR0bGAgGKSwEAUgXIBskHRsdMAoaHggGJiksBAEhGAQBHEUEASlFBAEqSgQBOEoEATMbMAYeBAEyIBEcEQYwKAYPBAE5MR8cEQYnKAYPBAEZSgQBIEoEATFKBAExSgQBFiQsBAEVLSwEARclPSoEATA/HjAtEwQBNykkBAE8OSgbBgQCAUAeGRoBKwFAAT9FATokPxUEASM/IwQBQh4rIwYPBAFCSCcjBg8EATYyGR0nMwQBIhskKwYSBAEiHRkUIw4ZGxcGBAE+HRU0SBUGGSoGAR8tKwYBHAEiUBw2S0dOEjA9KCpMISQSCjpHJlE0Lyo1CiwrChAIBgEUFCMYHg1AFgYxKwY7BAE6LQFRAUE0ASU1AUE0AVEBQwE3OT0EAU8BMj8EARsqBAEsGyQSBgQBTBs6GSQnBhIEAUwbJDUGGQQBMDEBPTEBKhskJQYRBAEoGyQjBhIEAU0bJB0pBiksBAFMGykdGxgIBiksBAFOFyAbJB0bHTAKGh4IBiYpLAQBIxgEAR5FBAErRQQBLEoEATpKBAE3GzAGHgQBNCARHBEGMCgGDwQBOzEfHBEGJygGDwQBG0oEASJKBAEzSgQBM0oEARgkLAQBFy0sBAEZJT0qBAEyPx4yLRMEATkpJAQBPjkoGwYEAgEaKhoBGwEcOwEdMCYkPwE9M0JBBAE9URFPQgQBPw9LEVBDBAFNNyozNEoEAT8PSxFQRUMEAUEPTBFRRkQEAT8PSxFQRUMEAUEPTBFRRkQEAT8PSxFQRUMEAUEPTBFRRkQEAUMPTTMvR0UEAUMPTTMvR0UEAUcPTzMxSUcEAUMPTTMvR0UEAUcPTzMxSUcEAgEzHgFDGg4EARooBAEzATQBNCwBHwE0PkoBNEBMATRATAE0Qk4BQEwBQk4BQEwBQk4BN0c0JQE3RzQlAS5OOScBLEg1JQFOOScBBkMwBhZDTi8nIFAnPS0GBAIBBxEJLUEBCTIpMAQCARpMLDQfKDgGHAQBLCg4BiUEATEfJQQBHyUhBAIBBxIJLkMBCTMqMAQCARpOKjQfKDgGHQQBLCg4BicEAS8fJgQBHyYiBAIBBxkJNVEBCToxMAQCARorFyIqNB8oOAYdBAEsKDgGLgQBLx8mBAEfLSkEAgEHEgkuQwEJMyowBAIBGk4sNB8oOAYkBAEsKDgGLgQBTiFBIE49DTcGBAExHyYEAR8mIgQBJDkEATA5BAIBBxMJL0UBCTQrMAQCARpQMDQfKDgGJQQBLCg4BjAEAU4hQSBPPQ03BgQBNR8nBAEfJyMEASU7BAExOwQCAQcSCS5DAQkzKjAEAgEaTjAfKDgGJAQBLCg4Bi4EATEfJgQBHyYiBAEkOQQBMDkEAgEHEwkvRQEJNCswBAIBGlAwHyg4BiUEASwoOAYwBAE1HycEAR8nIwQBJTsEATE7BAIBBxIJLkMBCTMqMAQCARpOMB8oOAYkBAEsKDgGJAQBNR8mBAEfJiIEASQ5BAEwOQQCAQcTCS9FAQk0KzAEAgEaUDAfKDgGJQQBLCg4BiUEATUfJwQBHycjBAElOwQBMTsEAgEHFAkwRwEJOCwwBAIBGiYaHTA3Iig4BiYEAS8oOAYmBAE1HygEAR8oJAQBKT0EATU9BAIBBxQJMEcBCTgsMAQCARomGh0wNyIoOAYmBAEvKDgGJgQBNR8oBAEfKCQEASk9BAE1PQQCAQcWCTJLAQk9LjAEAgEaKB0fLiUoOAYoBAEyKDgGKAQBNR8qBAEfKiYEAS5BBAE6QQQCAQcUCTBHAQk5LDAEAgEaJhsdLCMoOAYmBAEwKDgGJgQBNR8oBAEfKCQEASo9BAE2PQQCAQcWCTJLAQk9LjAEAgEaKB0fLiUoOAYoBAEyKDgGKAQBNR8qBAEfKiYEAS5BBAE6QQQCARosFxowHyg4BhwEASwoOAYcBAE1HyUEAR8lIQQCARotFxswNB8oOAYdBAEsKDgGJwQBNR8mBAEfJiIEAgEaNBciMDQfKDgGHQQBLCg4Bi4EATUfJgQBHy0pBAIBGi0XGzABHyg4BiQEASwoOAYuBAE1HyYEAR8mIgQBJDkEATA5BAIBGi4XHDABHyg4BiUEASwoOAYwBAE1HycEAR8nIwQBJTsEATE7BAIBGi0XGzAfKDgGJAQBLCg4Bi4EATUfJgQBHyYiBAEkOQQBMDkEAgEaLhccMAEfKDgGJQQBLCg4BjAEATUfJwQBHycjBAElOwQBMTsEAgEaLRcbMAEfKDgGJAQBLCg4BiQEATUfJgQBHyYiBAEkOQQBMDkEAgEaLhccMAEfKDgGJQQBLCg4BiUEATUfJwQBHycjBAElOwQBMTsEAgEaLxodMAEiKDgGJgQBLyg4BiYEATUfKAQBHygkBAEpPQQBNT0EAgEaLxodMAEiKDgGJgQBLyg4BiYEATUfKAQBHygkBAEpPQQBNT0EAgEaMR0fMAElKDgGKAQBMig4BigEATUfKgQBHyomBAEuQQQBOkEEAgEaLxsdMAEjKDgGJgQBMCg4BiYEATUfKAQBHygkBAEqPQQBNj0EAgEaMR0fMCUoOAYoBAEyKDgGKAQBNR8qBAEfKiYEAS5BBAE6QQQCAQcSCS48JgEJLj4BCS40AQkuLyoBCS5RAgEaKC5ALjQuQC5AQCw+LEYsQSxJLD4sQi42LiouPiA3KDcoNyg3KDMBLjouTgEuNS41LjUuNS45LjkuLC44LkACAQcQCSxJAQksNyIBCSwxKgIBGiQ5Ojo6OiMjIyMxLDYsSC4uLi4oLCgsKCwoLCw3LDcsNyw3Lj4fAgEHEgkuSAEJLj4BCS40AQkuUQIBGihALjRAQEAuNi4qPiA3KDcoMy41LjUuOS45LiwCATUYFREOASEYIBk8BAEUJiInIBMGGRUSBAEdAgFMNQEaKAQBGx4EASk+ATQ+ATQwAgEaLBcaEjJLMAEsHyg4BhZHBAEsKDgGGU0EATEfJQQBHyUhBAIBGi0XGxIzTDEBLB8oOAYWSQQBLCg4BhpPBAExHyYEAR8mIgQCARo0FyISOkdEASwfKDgGFkkEASwoOAZOIQQBMR8mBAEfLSkEAgEaLRcbEjNMMQEsHyg4BhZJBAEsKDgGGk8EAU4hQSBOSA03BgQBMQEfJgQBHyYiBAIBGi4XHBI0TTIBLB8oOAYWSwQBLCg4BhtRBAFOIUEgT0gNNwYEATEBHycEAR8BJyMEAgEaLRcbEjNMMQEsHyg4BhZJBAEsKDgGGk8EATEfJgQBHyYiBAIBGi4XHBI0TTIBLB8oOAYWSwQBLCg4BhtRBAExHycEAR8nIwQCARotFxsSM0wxASwfKDgGFkkEASwoOAYaRQQBMR8mBAEfJiIEAgEaLhccEjRNMgEsHyg4BhZLBAEsKDgGG0YEATEfJwQBHycjBAIBGi8aHRI1TjMBLCIoOAYWTQQBLyg4BhxHBAExHygEAR8oJAQCARovGh0SNU4zASwiKDgGFk0EAS8oOAYcRwQBMR8oBAEfKCQEAgEaMR0fEjdQNQEsJSg4BhZRBAEyKDgGHkkEATEfKgQBHyomBAIBGi8bHRI1TjMBLCMoOAYWTQQBMCg4BhxHBAExHygEAR8oJAQCARoxHR8SN1A1ASwlKDgGFlEEATIoOAYeSQQBMR8qBAEfKiYEAgEaKjFKLwExGx4EARoTBAEfDgQBMAEgMkIGPAQBLDJCBjwEASEyQgY9BAEtMkIGPQQBPzZLBkMqFQYtBAFLNksGNUYEAUA2SwZEKhUGIAQBTDZLBjZGBAE/NksGQyoVBi0EAUs2SwY1RgQBQDZLBkQqFQYgBAFMNksGNkYEAT82SwZDKhUGLQQBSzZLBjVGBAFANksGRCoVBiAEAUw2SwY2RgQBRDZLBipBBhJIGAQBUDZLBipBDgYZUQQBRDZLBipBBhJIGAQBUDZLBipBDgYZUQQBSTZLBkFBBAE1JjZLBkFBBAEpPgE0PgE0MAIBHTwCAR1FRxACAR1AAgEkNzg4AR4iES4QAgEZHgIBGhcCATIhGyEQAgEaIAIBGxkCARokAgEbHQIBUEcPOhQoBBMnBCUwBAIBOCNDKwQCAStkYXJ0OnR5cGVkX2RhdGEtcGF0Y2gvdHlwZWRfZGF0YV9wYXRjaC5kYXJ0O29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vdm1zZXJ2aWNlL3Ztc2VydmljZV9pby5kYXJ0nVQvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKbGlicmFyeSB2bXNlcnZpY2VfaW87CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OmlvJzsKaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CmltcG9ydCAnZGFydDpfdm1zZXJ2aWNlJzsKCnBhcnQgJ2xvYWRlci5kYXJ0JzsKcGFydCAnc2VydmVyLmRhcnQnOwoKLy8gVGhlIFRDUCBpcC9wb3J0IHRoYXQgdGhlIEhUVFAgc2VydmVyIGxpc3RlbnMgb24uCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKaW50IF9wb3J0OwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpClN0cmluZyBfaXA7Ci8vIFNob3VsZCB0aGUgSFRUUCBzZXJ2ZXIgYXV0byBzdGFydD8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9hdXRvU3RhcnQ7Ci8vIFNob3VsZCB0aGUgSFRUUCBzZXJ2ZXIgcmVxdWlyZSBhbiBhdXRoIGNvZGU/CkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYm9vbCBfYXV0aENvZGVzRGlzYWJsZWQ7Ci8vIFNob3VsZCB0aGUgSFRUUCBzZXJ2ZXIgcnVuIGluIGRldm1vZGU/CkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYm9vbCBfb3JpZ2luQ2hlY2tEaXNhYmxlZDsKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9pc1dpbmRvd3MgPSBmYWxzZTsKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpib29sIF9pc0Z1Y2hzaWEgPSBmYWxzZTsKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQp2YXIgX3NpZ25hbFdhdGNoOwp2YXIgX3NpZ25hbFN1YnNjcmlwdGlvbjsKCi8vIEhUVFAgc2VydmVyLgpTZXJ2ZXIgc2VydmVyOwpGdXR1cmU8U2VydmVyPiBzZXJ2ZXJGdXR1cmU7CgpfbGF6eVNlcnZlckJvb3QoKSB7CiAgaWYgKHNlcnZlciAhPSBudWxsKSB7CiAgICByZXR1cm47CiAgfQogIC8vIExhemlseSBjcmVhdGUgc2VydmljZS4KICB2YXIgc2VydmljZSA9IG5ldyBWTVNlcnZpY2UoKTsKICAvLyBMYXppbHkgY3JlYXRlIHNlcnZlci4KICBzZXJ2ZXIgPQogICAgICBuZXcgU2VydmVyKHNlcnZpY2UsIF9pcCwgX3BvcnQsIF9vcmlnaW5DaGVja0Rpc2FibGVkLCBfYXV0aENvZGVzRGlzYWJsZWQpOwp9CgpGdXR1cmUgY2xlYW51cENhbGxiYWNrKCkgYXN5bmMgewogIHNodXRkb3duTG9hZGVycygpOwogIC8vIENhbmNlbCB0aGUgc2lncXVpdCBzdWJzY3JpcHRpb24uCiAgaWYgKF9zaWduYWxTdWJzY3JpcHRpb24gIT0gbnVsbCkgewogICAgYXdhaXQgX3NpZ25hbFN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIF9zaWduYWxTdWJzY3JpcHRpb24gPSBudWxsOwogIH0KICBpZiAoc2VydmVyICE9IG51bGwpIHsKICAgIHRyeSB7CiAgICAgIGF3YWl0IHNlcnZlci5jbGVhbnVwKHRydWUpOwogICAgfSBjYXRjaCAoZSwgc3QpIHsKICAgICAgcHJpbnQoIkVycm9yIGluIHZtLXNlcnZpY2Ugc2h1dGRvd246ICRlXG4kc3RcbiIpOwogICAgfQogIH0KICBpZiAoX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyICE9IG51bGwpIHsKICAgIF9yZWdpc3RlclNpZ25hbEhhbmRsZXJUaW1lci5jYW5jZWwoKTsKICAgIF9yZWdpc3RlclNpZ25hbEhhbmRsZXJUaW1lciA9IG51bGw7CiAgfQogIC8vIENhbGwgb3V0IHRvIGVtYmVkZGVyJ3Mgc2h1dGRvd24gY2FsbGJhY2suCiAgX3NodXRkb3duKCk7Cn0KCkZ1dHVyZTxVcmk+IGNyZWF0ZVRlbXBEaXJDYWxsYmFjayhTdHJpbmcgYmFzZSkgYXN5bmMgewogIERpcmVjdG9yeSB0ZW1wID0gYXdhaXQgRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcChiYXNlKTsKICAvLyBVbmRlcm5lYXRoIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBjcmVhdGUgYSBkaXJlY3Rvcnkgd2l0aCB0aGUKICAvLyBzYW1lIG5hbWUgYXMgdGhlIERldkZTIG5hbWUgW2Jhc2VdLgogIHZhciBmc1VyaSA9IHRlbXAudXJpLnJlc29sdmVVcmkobmV3IFVyaS5kaXJlY3RvcnkoYmFzZSkpOwogIGF3YWl0IG5ldyBEaXJlY3RvcnkuZnJvbVVyaShmc1VyaSkuY3JlYXRlKCk7CiAgcmV0dXJuIGZzVXJpOwp9CgpGdXR1cmUgZGVsZXRlRGlyQ2FsbGJhY2soVXJpIHBhdGgpIGFzeW5jIHsKICBEaXJlY3RvcnkgZGlyID0gbmV3IERpcmVjdG9yeS5mcm9tVXJpKHBhdGgpOwogIGF3YWl0IGRpci5kZWxldGUocmVjdXJzaXZlOiB0cnVlKTsKfQoKY2xhc3MgUGVuZGluZ1dyaXRlIHsKICBQZW5kaW5nV3JpdGUodGhpcy51cmksIHRoaXMuYnl0ZXMpOwogIGZpbmFsIENvbXBsZXRlciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBMaXN0PGludD4gYnl0ZXM7CgogIEZ1dHVyZSB3cml0ZSgpIGFzeW5jIHsKICAgIHZhciBmaWxlID0gbmV3IEZpbGUuZnJvbVVyaSh1cmkpOwogICAgdmFyIHBhcmVudF9kaXJlY3RvcnkgPSBmaWxlLnBhcmVudDsKICAgIGF3YWl0IHBhcmVudF9kaXJlY3RvcnkuY3JlYXRlKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgICBpZiAoYXdhaXQgZmlsZS5leGlzdHMoKSkgewogICAgICBhd2FpdCBmaWxlLmRlbGV0ZSgpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IGF3YWl0IGZpbGUud3JpdGVBc0J5dGVzKGJ5dGVzKTsKICAgIGNvbXBsZXRlci5jb21wbGV0ZShudWxsKTsKICAgIFdyaXRlTGltaXRlci5fd3JpdGVDb21wbGV0ZWQoKTsKICB9Cn0KCmNsYXNzIFdyaXRlTGltaXRlciB7CiAgc3RhdGljIGZpbmFsIExpc3Q8UGVuZGluZ1dyaXRlPiBwZW5kaW5nV3JpdGVzID0gbmV3IExpc3Q8UGVuZGluZ1dyaXRlPigpOwoKICAvLyBub24tcm9vdGVkIEFuZHJvaWQgZGV2aWNlcyBoYXZlIGEgdmVyeSBsb3cgbGltaXQgZm9yIHRoZSBudW1iZXIgb2YKICAvLyBvcGVuIGZpbGVzLiBBcnRpZmljaWFsbHkgY2FwIG91cnNlbHZlcyB0byAxNi4KICBzdGF0aWMgY29uc3Qga01heE9wZW5Xcml0ZXMgPSAxNjsKICBzdGF0aWMgaW50IG9wZW5Xcml0ZXMgPSAwOwoKICBzdGF0aWMgRnV0dXJlIHNjaGVkdWxlV3JpdGUoVXJpIHBhdGgsIExpc3Q8aW50PiBieXRlcykgYXN5bmMgewogICAgLy8gQ3JlYXRlIGEgbmV3IHBlbmRpbmcgd3JpdGUuCiAgICBQZW5kaW5nV3JpdGUgcHcgPSBuZXcgUGVuZGluZ1dyaXRlKHBhdGgsIGJ5dGVzKTsKICAgIHBlbmRpbmdXcml0ZXMuYWRkKHB3KTsKICAgIF9tYXliZVdyaXRlRmlsZXMoKTsKICAgIHJldHVybiBwdy5jb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgc3RhdGljIF9tYXliZVdyaXRlRmlsZXMoKSB7CiAgICB3aGlsZSAob3BlbldyaXRlcyA8IGtNYXhPcGVuV3JpdGVzKSB7CiAgICAgIGlmIChwZW5kaW5nV3JpdGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBQZW5kaW5nV3JpdGUgcHcgPSBwZW5kaW5nV3JpdGVzLnJlbW92ZUxhc3QoKTsKICAgICAgICBwdy53cml0ZSgpOwogICAgICAgIG9wZW5Xcml0ZXMrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgc3RhdGljIF93cml0ZUNvbXBsZXRlZCgpIHsKICAgIG9wZW5Xcml0ZXMtLTsKICAgIGFzc2VydChvcGVuV3JpdGVzID49IDApOwogICAgX21heWJlV3JpdGVGaWxlcygpOwogIH0KfQoKRnV0dXJlIHdyaXRlRmlsZUNhbGxiYWNrKFVyaSBwYXRoLCBMaXN0PGludD4gYnl0ZXMpIGFzeW5jIHsKICByZXR1cm4gV3JpdGVMaW1pdGVyLnNjaGVkdWxlV3JpdGUocGF0aCwgYnl0ZXMpOwp9CgpGdXR1cmUgd3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2soVXJpIHBhdGgsIFN0cmVhbTxMaXN0PGludD4+IGJ5dGVzKSBhc3luYyB7CiAgdmFyIGZpbGUgPSBuZXcgRmlsZS5mcm9tVXJpKHBhdGgpOwogIHZhciBwYXJlbnRfZGlyZWN0b3J5ID0gZmlsZS5wYXJlbnQ7CiAgYXdhaXQgcGFyZW50X2RpcmVjdG9yeS5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKTsKICBpZiAoYXdhaXQgZmlsZS5leGlzdHMoKSkgewogICAgYXdhaXQgZmlsZS5kZWxldGUoKTsKICB9CiAgSU9TaW5rIHNpbmsgPSBhd2FpdCBmaWxlLm9wZW5Xcml0ZSgpOwogIGF3YWl0IHNpbmsuYWRkU3RyZWFtKGJ5dGVzKTsKICBhd2FpdCBzaW5rLmNsb3NlKCk7Cn0KCkZ1dHVyZTxMaXN0PGludD4+IHJlYWRGaWxlQ2FsbGJhY2soVXJpIHBhdGgpIGFzeW5jIHsKICB2YXIgZmlsZSA9IG5ldyBGaWxlLmZyb21VcmkocGF0aCk7CiAgcmV0dXJuIGF3YWl0IGZpbGUucmVhZEFzQnl0ZXMoKTsKfQoKRnV0dXJlPExpc3Q8TWFwPFN0cmluZywgZHluYW1pYz4+PiBsaXN0RmlsZXNDYWxsYmFjayhVcmkgZGlyUGF0aCkgYXN5bmMgewogIHZhciBkaXIgPSBuZXcgRGlyZWN0b3J5LmZyb21VcmkoZGlyUGF0aCk7CiAgdmFyIGRpclBhdGhTdHIgPSBkaXJQYXRoLnBhdGg7CiAgdmFyIHN0cmVhbSA9IGRpci5saXN0KHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgdmFyIHJlc3VsdCA9IDxNYXA8U3RyaW5nLCBkeW5hbWljPj5bXTsKICBhd2FpdCBmb3IgKHZhciBmaWxlRW50aXR5IGluIHN0cmVhbSkgewogICAgdmFyIGZpbGVQYXRoID0gbmV3IFVyaS5maWxlKGZpbGVFbnRpdHkucGF0aCkucGF0aDsKICAgIHZhciBzdGF0ID0gYXdhaXQgZmlsZUVudGl0eS5zdGF0KCk7CiAgICBpZiAoc3RhdC50eXBlID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLkZJTEUgJiYKICAgICAgICBmaWxlUGF0aC5zdGFydHNXaXRoKGRpclBhdGhTdHIpKSB7CiAgICAgIHZhciBtYXAgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwogICAgICBtYXBbJ25hbWUnXSA9ICcvJyArIGZpbGVQYXRoLnN1YnN0cmluZyhkaXJQYXRoU3RyLmxlbmd0aCk7CiAgICAgIG1hcFsnc2l6ZSddID0gc3RhdC5zaXplOwogICAgICBtYXBbJ21vZGlmaWVkJ10gPSBzdGF0Lm1vZGlmaWVkLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2g7CiAgICAgIHJlc3VsdC5hZGQobWFwKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKRnV0dXJlPFVyaT4gc2VydmVySW5mb3JtYXRpb25DYWxsYmFjaygpIGFzeW5jIHsKICBfbGF6eVNlcnZlckJvb3QoKTsKICByZXR1cm4gc2VydmVyLnNlcnZlckFkZHJlc3M7Cn0KCkZ1dHVyZTxVcmk+IHdlYlNlcnZlckNvbnRyb2xDYWxsYmFjayhib29sIGVuYWJsZSkgYXN5bmMgewogIF9sYXp5U2VydmVyQm9vdCgpOwogIGlmIChzZXJ2ZXIucnVubmluZyA9PSBlbmFibGUpIHsKICAgIC8vIE5vIGNoYW5nZS4KICAgIHJldHVybiBzZXJ2ZXIuc2VydmVyQWRkcmVzczsKICB9CgogIGlmIChlbmFibGUpIHsKICAgIGF3YWl0IHNlcnZlci5zdGFydHVwKCk7CiAgICByZXR1cm4gc2VydmVyLnNlcnZlckFkZHJlc3M7CiAgfSBlbHNlIHsKICAgIGF3YWl0IHNlcnZlci5zaHV0ZG93bih0cnVlKTsKICAgIHJldHVybiBzZXJ2ZXIuc2VydmVyQWRkcmVzczsKICB9Cn0KCk51bGwgX2NsZWFyRnV0dXJlKF8pIHsKICBzZXJ2ZXJGdXR1cmUgPSBudWxsOwp9Cgpfb25TaWduYWwoUHJvY2Vzc1NpZ25hbCBzaWduYWwpIHsKICBpZiAoc2VydmVyRnV0dXJlICE9IG51bGwpIHsKICAgIC8vIFN0aWxsIHdhaXRpbmcuCiAgICByZXR1cm47CiAgfQogIF9sYXp5U2VydmVyQm9vdCgpOwogIC8vIFRvZ2dsZSBIVFRQIHNlcnZlci4KICBpZiAoc2VydmVyLnJ1bm5pbmcpIHsKICAgIHNlcnZlckZ1dHVyZSA9IHNlcnZlci5zaHV0ZG93bih0cnVlKS50aGVuKF9jbGVhckZ1dHVyZSk7CiAgfSBlbHNlIHsKICAgIHNlcnZlckZ1dHVyZSA9IHNlcnZlci5zdGFydHVwKCkudGhlbihfY2xlYXJGdXR1cmUpOwogIH0KfQoKVGltZXIgX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyOwoKX3JlZ2lzdGVyU2lnbmFsSGFuZGxlcigpIHsKICBfcmVnaXN0ZXJTaWduYWxIYW5kbGVyVGltZXIgPSBudWxsOwogIGlmIChfc2lnbmFsV2F0Y2ggPT0gbnVsbCkgewogICAgLy8gQ2Fubm90IHJlZ2lzdGVyIGZvciBzaWduYWxzLgogICAgcmV0dXJuOwogIH0KICBpZiAoX2lzV2luZG93cyB8fCBfaXNGdWNoc2lhKSB7CiAgICAvLyBDYW5ub3QgcmVnaXN0ZXIgZm9yIHNpZ25hbHMgb24gV2luZG93cyBvciBGdWNoc2lhLgogICAgcmV0dXJuOwogIH0KICBfc2lnbmFsU3Vic2NyaXB0aW9uID0gX3NpZ25hbFdhdGNoKFByb2Nlc3NTaWduYWwuU0lHUVVJVCkubGlzdGVuKF9vblNpZ25hbCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgIWNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJkYXJ0LnZtLnByb2R1Y3QiKSkKbWFpbigpIHsKICAvLyBTZXQgZW1iZWRkZXIgaG9va3MuCiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5jbGVhbnVwID0gY2xlYW51cENhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3MuY3JlYXRlVGVtcERpciA9IGNyZWF0ZVRlbXBEaXJDYWxsYmFjazsKICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmRlbGV0ZURpciA9IGRlbGV0ZURpckNhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3Mud3JpdGVGaWxlID0gd3JpdGVGaWxlQ2FsbGJhY2s7CiAgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy53cml0ZVN0cmVhbUZpbGUgPSB3cml0ZVN0cmVhbUZpbGVDYWxsYmFjazsKICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnJlYWRGaWxlID0gcmVhZEZpbGVDYWxsYmFjazsKICBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLmxpc3RGaWxlcyA9IGxpc3RGaWxlc0NhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3Muc2VydmVySW5mb3JtYXRpb24gPSBzZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrOwogIFZNU2VydmljZUVtYmVkZGVySG9va3Mud2ViU2VydmVyQ29udHJvbCA9IHdlYlNlcnZlckNvbnRyb2xDYWxsYmFjazsKICAvLyBBbHdheXMgaW5zdGFudGlhdGUgdGhlIHZtc2VydmljZSBvYmplY3Qgc28gdGhhdCB0aGUgZXhpdCBtZXNzYWdlCiAgLy8gY2FuIGJlIGRlbGl2ZXJlZCBhbmQgd2FpdGluZyBsb2FkZXJzIGNhbiBiZSBjYW5jZWxsZWQuCiAgbmV3IFZNU2VydmljZSgpOwogIGlmIChfYXV0b1N0YXJ0KSB7CiAgICBfbGF6eVNlcnZlckJvb3QoKTsKICAgIHNlcnZlci5zdGFydHVwKCk7CiAgICAvLyBJdCdzIGp1c3QgaGVyZSB0byBwdXNoIGFuIGV2ZW50IG9uIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2UgaW52b2tlIHRoZQogICAgLy8gc2NoZWR1bGVkIG1pY3JvdGFza3MuCiAgICBUaW1lci5ydW4oKCkge30pOwogIH0KICBzY3JpcHRMb2FkUG9ydC5oYW5kbGVyID0gX3Byb2Nlc3NMb2FkUmVxdWVzdDsKICAvLyBSZWdpc3RlciBzaWduYWwgaGFuZGxlciBhZnRlciBhIHNtYWxsIGRlbGF5IHRvIGF2b2lkIHN0YWxsaW5nIG1haW4KICAvLyBpc29sYXRlIHN0YXJ0dXAuCiAgX3JlZ2lzdGVyU2lnbmFsSGFuZGxlclRpbWVyID0gbmV3IFRpbWVyKHNob3J0RGVsYXksIF9yZWdpc3RlclNpZ25hbEhhbmRsZXIpOwogIHJldHVybiBzY3JpcHRMb2FkUG9ydDsKfQoKX3NodXRkb3duKCkgbmF0aXZlICJWTVNlcnZpY2VJT19TaHV0ZG93biI7CoEPAE5OPAEWARUaFxIXGhoBFBQBNBoLGgwmGhEwGhkqGhsaGRoZGhIZARAPHQEUGAwEHCEbC1ECASEVJiUoIAQYCiIWOAYELSooBC8PAgE3QEUpPC8QAgErLyUCARUmLxEZARkmKDQfGwYxHiQEAgEVTAFIMyQdAUEjNRsYIAQBHiomNhQWDw8IBgQBHRIdGAQCATwyAgFKJSYyHRkEKB8WAgE1JSMCAUosISopKTcoMislQR8+FwYEEQIBMBUfAgE6FSISIQQBEBwhCyEhBAIBFxcCASIeFgwEFRkYPQs4BAIBIwEbJh4kDAQiOgwETwIBSgkZNEA4OEQ2OEhGRjwTFBcWTx0WBDBIFk8ZAgErARFkYXJ0OnZtc2VydmljZV9pbzVvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL3Ztc2VydmljZS9sb2FkZXIuZGFydMAAiOsvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiB2bXNlcnZpY2VfaW87Cgpfc2FuaXRpemVXaW5kb3dzUGF0aChwYXRoKSB7CiAgLy8gRm9yIFdpbmRvd3Mgd2UgbmVlZCB0byBtYXNzYWdlIHRoZSBwYXRocyBhIGJpdCBhY2NvcmRpbmcgdG8KICAvLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9pZS9hcmNoaXZlLzIwMDYvMTIvMDYvZmlsZS11cmlzLWluLXdpbmRvd3MuYXNweAogIC8vCiAgLy8gQ29udmVydAogIC8vIEM6XG9uZVx0d29cdGhyZWUKICAvLyB0bwogIC8vIC9DOi9vbmUvdHdvL3RocmVlCgogIGlmIChfaXNXaW5kb3dzID09IGZhbHNlKSB7CiAgICAvLyBEbyBub3RoaW5nIHdoZW4gbm90IHJ1bm5pbmcgV2luZG93cy4KICAgIHJldHVybiBwYXRoOwogIH0KCiAgdmFyIGZpeGVkUGF0aCA9ICIke3BhdGgucmVwbGFjZUFsbCgnXFwnLCAnLycpfSI7CgogIGlmICgocGF0aC5sZW5ndGggPiAyKSAmJiAocGF0aFsxXSA9PSAnOicpKSB7CiAgICAvLyBQYXRoIGJlZ2lucyB3aXRoIGEgZHJpdmUgbGV0dGVyLgogICAgcmV0dXJuICcvJGZpeGVkUGF0aCc7CiAgfQoKICByZXR1cm4gZml4ZWRQYXRoOwp9CgpfdHJpbVdpbmRvd3NQYXRoKHBhdGgpIHsKICAvLyBDb252ZXJ0IC9YOi8gdG8gWDovLgogIGlmIChfaXNXaW5kb3dzID09IGZhbHNlKSB7CiAgICAvLyBEbyBub3RoaW5nIHdoZW4gbm90IHJ1bm5pbmcgV2luZG93cy4KICAgIHJldHVybiBwYXRoOwogIH0KICBpZiAoIXBhdGguc3RhcnRzV2l0aCgnLycpIHx8IChwYXRoLmxlbmd0aCA8IDMpKSB7CiAgICByZXR1cm4gcGF0aDsKICB9CiAgLy8gTWF0Y2ggJy8/OicuCiAgaWYgKChwYXRoWzBdID09ICcvJykgJiYgKHBhdGhbMl0gPT0gJzonKSkgewogICAgLy8gUmVtb3ZlIGxlYWRpbmcgJy8nLgogICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDEpOwogIH0KICByZXR1cm4gcGF0aDsKfQoKLy8gRW5zdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIuCl9lbmZvcmNlVHJhaWxpbmdTbGFzaCh1cmkpIHsKICBpZiAoIXVyaS5lbmRzV2l0aCgnLycpKSB7CiAgICByZXR1cm4gJyR1cmkvJzsKICB9CiAgcmV0dXJuIHVyaTsKfQoKY2xhc3MgRmlsZVJlcXVlc3QgewogIGZpbmFsIFNlbmRQb3J0IHNwOwogIGZpbmFsIGludCB0YWc7CiAgZmluYWwgVXJpIHVyaTsKICBmaW5hbCBVcmkgcmVzb2x2ZWRVcmk7CiAgZmluYWwgU3RyaW5nIGxpYnJhcnlVcmw7CiAgRmlsZVJlcXVlc3QodGhpcy5zcCwgdGhpcy50YWcsIHRoaXMudXJpLCB0aGlzLnJlc29sdmVkVXJpLCB0aGlzLmxpYnJhcnlVcmwpOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX3RyYWNlTG9hZGluZyA9IGZhbHNlOwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX2RldGVybWluaXN0aWMgPSBmYWxzZTsKCi8vIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXNvbGF0ZSB0aGF0IGlzIHVzZWQgZm9yIGxvYWRpbmcuCmNsYXNzIElzb2xhdGVMb2FkZXJTdGF0ZSBleHRlbmRzIElzb2xhdGVFbWJlZGRlckRhdGEgewogIElzb2xhdGVMb2FkZXJTdGF0ZSh0aGlzLmlzb2xhdGVJZCk7CgogIGZpbmFsIGludCBpc29sYXRlSWQ7CiAgYm9vbCBfZGVhZCA9IGZhbHNlOwogIFNlbmRQb3J0IHNwOwoKICB2b2lkIGluaXQoU3RyaW5nIHBhY2thZ2VSb290RmxhZywgU3RyaW5nIHBhY2thZ2VzQ29uZmlnRmxhZywKICAgICAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksIFN0cmluZyByb290U2NyaXB0KSB7CiAgICBpZiAoX2RlYWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gX3dvcmtpbmdEaXJlY3RvcnkgbXVzdCBiZSBzZXQgZmlyc3QuCiAgICBfd29ya2luZ0RpcmVjdG9yeSA9IG5ldyBVcmkuZGlyZWN0b3J5KHdvcmtpbmdEaXJlY3RvcnkpOwogICAgaWYgKHJvb3RTY3JpcHQgIT0gbnVsbCkgewogICAgICBfcm9vdFNjcmlwdCA9IFVyaS5wYXJzZShyb290U2NyaXB0KTsKICAgIH0KICAgIC8vIElmIHRoZSAtLXBhY2thZ2Utcm9vdCBmbGFnIHdhcyBwYXNzZWQuCiAgICBpZiAocGFja2FnZVJvb3RGbGFnICE9IG51bGwpIHsKICAgICAgX3NldFBhY2thZ2VSb290KHBhY2thZ2VSb290RmxhZyk7CiAgICB9CiAgICAvLyBJZiB0aGUgLS1wYWNrYWdlcyBmbGFnIHdhcyBwYXNzZWQuCiAgICBpZiAocGFja2FnZXNDb25maWdGbGFnICE9IG51bGwpIHsKICAgICAgX3NldFBhY2thZ2VzQ29uZmlnKHBhY2thZ2VzQ29uZmlnRmxhZyk7CiAgICB9CiAgfQoKICB2b2lkIHVwZGF0ZVBhY2thZ2VNYXAoU3RyaW5nIHBhY2thZ2VzQ29uZmlnRmxhZykgewogICAgaWYgKHBhY2thZ2VzQ29uZmlnRmxhZyA9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9wYWNrYWdlTWFwID0gbnVsbDsKICAgIF9zZXRQYWNrYWdlc0NvbmZpZyhwYWNrYWdlc0NvbmZpZ0ZsYWcpOwogIH0KCiAgdm9pZCBjbGVhbnVwKCkgewogICAgX2RlYWQgPSB0cnVlOwogICAgaWYgKF9wYWNrYWdlc1BvcnQgIT0gbnVsbCkgewogICAgICBfcGFja2FnZXNQb3J0LmNsb3NlKCk7CiAgICAgIF9wYWNrYWdlc1BvcnQgPSBudWxsOwogICAgfQogIH0KCiAgLy8gVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gdGhlIGVtYmVkZGVyIHN0YXJ0ZWQuCiAgVXJpIF93b3JraW5nRGlyZWN0b3J5OwoKICAvLyBUaGUgcm9vdCBzY3JpcHQncyB1cmkuCiAgVXJpIF9yb290U2NyaXB0OwoKICAvLyBQYWNrYWdlcyBhcmUgZWl0aGVyIHJlc29sdmVkIGxvb2tpbmcgdXAgaW4gYSBtYXAgb3IgcmVzb2x2ZWQgZnJvbSB3aXRoaW4gYQogIC8vIHBhY2thZ2Ugcm9vdC4KICBib29sIGdldCBfcGFja2FnZXNSZWFkeSA9PgogICAgICAoX3BhY2thZ2VSb290ICE9IG51bGwpIHx8CiAgICAgIChfcGFja2FnZU1hcCAhPSBudWxsKSB8fAogICAgICAoX3BhY2thZ2VFcnJvciAhPSBudWxsKTsKCiAgLy8gRXJyb3Igc3RyaW5nIHNldCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVzb2x2aW5nIHBhY2thZ2UgY29uZmlndXJhdGlvbi4KICAvLyBGb3IgZXhhbXBsZSBub3QgZmluZGluZyBhIC5wYWNrYWdlcyBmaWxlIG9yIHBhY2thZ2VzLyBkaXJlY3RvcnksIG1hbGZvcm1lZAogIC8vIC5wYWNrYWdlcyBmaWxlIG9yIGFueSBvdGhlciByZWxhdGVkIGVycm9yLgogIFN0cmluZyBfcGFja2FnZUVycm9yID0gbnVsbDsKCiAgLy8gVGhlIGRpcmVjdG9yeSB0byBsb29rIGluIHRvIHJlc29sdmUgInBhY2thZ2U6IiBzY2hlbWUgVVJJcy4gQnkgZGVmYXVsdCBpdAogIC8vIGlzIHRoZSAncGFja2FnZXMnIGRpcmVjdG9yeSByaWdodCBuZXh0IHRvIHRoZSBzY3JpcHQuCiAgVXJpIF9wYWNrYWdlUm9vdCA9IG51bGw7CgogIC8vIFRoZSBtYXAgZGVzY3JpYmluZyBob3cgY2VydGFpbiBwYWNrYWdlIG5hbWVzIGFyZSBtYXBwZWQgdG8gVXJpcy4KICBVcmkgX3BhY2thZ2VDb25maWcgPSBudWxsOwogIE1hcDxTdHJpbmcsIFVyaT4gX3BhY2thZ2VNYXAgPSBudWxsOwoKICAvLyBXZSBpc3N1ZSBvbmx5IDE2IGNvbmN1cnJlbnQgY2FsbHMgdG8gRmlsZS5yZWFkQXNCeXRlcygpIHRvIHN0YXkgd2l0aGluCiAgLy8gcGxhdGZvcm0tc3BlY2lmaWMgcmVzb3VyY2UgbGltaXRzIChlLmcuIG1heCBvcGVuIGZpbGVzKS4gVGhlIHJlc3QgZ28gb24KICAvLyBfZmlsZVJlcXVlc3RRdWV1ZSBhbmQgYXJlIHByb2Nlc3NlZCB3aGVuIHdlIGNhbiBzYWZlbHkgaXNzdWUgdGhlbS4KICBzdGF0aWMgZmluYWwgaW50IF9tYXhGaWxlUmVxdWVzdHMgPSBfZGV0ZXJtaW5pc3RpYyA/IDEgOiAxNjsKICBpbnQgY3VycmVudEZpbGVSZXF1ZXN0cyA9IDA7CiAgZmluYWwgTGlzdDxGaWxlUmVxdWVzdD4gX2ZpbGVSZXF1ZXN0UXVldWUgPSBuZXcgTGlzdDxGaWxlUmVxdWVzdD4oKTsKCiAgYm9vbCBnZXQgc2hvdWxkSXNzdWVGaWxlUmVxdWVzdCA9PiBjdXJyZW50RmlsZVJlcXVlc3RzIDwgX21heEZpbGVSZXF1ZXN0czsKICB2b2lkIGVucXVldWVGaWxlUmVxdWVzdChGaWxlUmVxdWVzdCBmcikgewogICAgX2ZpbGVSZXF1ZXN0UXVldWUuYWRkKGZyKTsKICB9CgogIEZpbGVSZXF1ZXN0IGRlcXVldWVGaWxlUmVxdWVzdCgpIHsKICAgIGlmIChfZmlsZVJlcXVlc3RRdWV1ZS5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBfZmlsZVJlcXVlc3RRdWV1ZS5yZW1vdmVBdCgwKTsKICB9CgogIF9zZXRQYWNrYWdlUm9vdChTdHJpbmcgcGFja2FnZVJvb3QpIHsKICAgIHBhY2thZ2VSb290ID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgaWYgKHBhY2thZ2VSb290LnN0YXJ0c1dpdGgoJ2ZpbGU6JykgfHwKICAgICAgICBwYWNrYWdlUm9vdC5zdGFydHNXaXRoKCdodHRwOicpIHx8CiAgICAgICAgcGFja2FnZVJvb3Quc3RhcnRzV2l0aCgnaHR0cHM6JykpIHsKICAgICAgcGFja2FnZVJvb3QgPSBfZW5mb3JjZVRyYWlsaW5nU2xhc2gocGFja2FnZVJvb3QpOwogICAgICBfcGFja2FnZVJvb3QgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlKHBhY2thZ2VSb290KTsKICAgIH0gZWxzZSB7CiAgICAgIHBhY2thZ2VSb290ID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgICBwYWNrYWdlUm9vdCA9IF90cmltV2luZG93c1BhdGgocGFja2FnZVJvb3QpOwogICAgICBfcGFja2FnZVJvb3QgPQogICAgICAgICAgX3dvcmtpbmdEaXJlY3RvcnkucmVzb2x2ZVVyaShuZXcgVXJpLmRpcmVjdG9yeShwYWNrYWdlUm9vdCkpOwogICAgfQogIH0KCiAgX3NldFBhY2thZ2VzQ29uZmlnKFN0cmluZyBwYWNrYWdlc1BhcmFtKSB7CiAgICB2YXIgcGFja2FnZXNOYW1lID0gX3Nhbml0aXplV2luZG93c1BhdGgocGFja2FnZXNQYXJhbSk7CiAgICB2YXIgcGFja2FnZXNVcmkgPSBVcmkucGFyc2UocGFja2FnZXNOYW1lKTsKICAgIGlmIChwYWNrYWdlc1VyaS5zY2hlbWUgPT0gJycpIHsKICAgICAgLy8gU2NyaXB0IGRvZXMgbm90IGhhdmUgYSBzY2hlbWUsIGFzc3VtZSB0aGF0IGl0IGlzIGEgcGF0aCwKICAgICAgLy8gcmVzb2x2ZSBpdCBhZ2FpbnN0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KICAgICAgcGFja2FnZXNVcmkgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlVXJpKHBhY2thZ2VzVXJpKTsKICAgIH0KICAgIF9yZXF1ZXN0UGFja2FnZXNNYXAocGFja2FnZXNVcmkpOwogICAgX3BlbmRpbmdQYWNrYWdlTG9hZHMuYWRkKCgpIHsKICAgICAgLy8gRHVtbXkgYWN0aW9uLgogICAgfSk7CiAgfQoKICAvLyBIYW5kbGluZyBvZiBhY2Nlc3MgdG8gdGhlIHBhY2thZ2Ugcm9vdCBvciBwYWNrYWdlIG1hcCBmcm9tIHVzZXIgY29kZS4KICBfdHJpZ2dlclBhY2thZ2VSZXNvbHV0aW9uKGFjdGlvbikgewogICAgaWYgKF9wYWNrYWdlc1JlYWR5KSB7CiAgICAgIC8vIFBhY2thZ2VzIGFyZSByZWFkeS4gRXhlY3V0ZSB0aGUgYWN0aW9uIG5vdy4KICAgICAgYWN0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoX3BlbmRpbmdQYWNrYWdlTG9hZHMuaXNFbXB0eSkgewogICAgICAgIC8vIFBhY2thZ2UgcmVzb2x1dGlvbiBoYXMgbm90IGJlZW4gc2V0dXAgeWV0LCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QKICAgICAgICAvLyByZXF1ZXN0IGZvciBwYWNrYWdlIHJlc29sdXRpb24gJiBsb2FkaW5nLgogICAgICAgIF9yZXF1ZXN0UGFja2FnZXNNYXAoKTsKICAgICAgfQogICAgICAvLyBSZWdpc3RlciB0aGUgYWN0aW9uIGZvciB3aGVuIHRoZSBwYWNrYWdlIHJlc29sdXRpb24gaXMgcmVhZHkuCiAgICAgIF9wZW5kaW5nUGFja2FnZUxvYWRzLmFkZChhY3Rpb24pOwogICAgfQogIH0KCiAgLy8gQSBsaXN0IG9mIGNhbGxiYWNrcyB3aGljaCBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUgcGFja2FnZSBtYXAgaGFzIGJlZW4KICAvLyBsb2FkZWQuCiAgTGlzdDxGdW5jdGlvbj4gX3BlbmRpbmdQYWNrYWdlTG9hZHMgPSBbXTsKCiAgLy8gR2l2ZW4gYSB1cmkgd2l0aCBhICdwYWNrYWdlJyBzY2hlbWUsIHJldHVybiBhIFVyaSB0aGF0IGlzIHByZWZpeGVkIHdpdGgKICAvLyB0aGUgcGFja2FnZSByb290IG9yIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24uCiAgVXJpIF9yZXNvbHZlUGFja2FnZVVyaShVcmkgdXJpKSB7CiAgICBhc3NlcnQodXJpLnNjaGVtZSA9PSAicGFja2FnZSIpOwogICAgYXNzZXJ0KF9wYWNrYWdlc1JlYWR5KTsKCiAgICBpZiAodXJpLmhvc3QuaXNOb3RFbXB0eSkgewogICAgICB2YXIgcGF0aCA9ICcke3VyaS5ob3N0fSR7dXJpLnBhdGh9JzsKICAgICAgdmFyIHJpZ2h0ID0gJ3BhY2thZ2U6JHBhdGgnOwogICAgICB2YXIgd3JvbmcgPSAncGFja2FnZTovLyRwYXRoJzsKCiAgICAgIHRocm93ICJVUklzIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICIKICAgICAgICAgICInJHJpZ2h0Jywgbm90ICckd3JvbmcnLiI7CiAgICB9CgogICAgdmFyIHBhY2thZ2VOYW1lRW5kID0gdXJpLnBhdGguaW5kZXhPZignLycpOwogICAgaWYgKHBhY2thZ2VOYW1lRW5kID09IDApIHsKICAgICAgLy8gUGFja2FnZSBVUklzIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBwYWNrYWdlIG5hbWUgKG5vdCBzdGFydCB3aXRoICIvIikuCiAgICAgIHRocm93ICJVUklTIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICIKICAgICAgICAgICIncGFja2FnZTpwYWNrYWdlTmFtZSR7dXJpLnBhdGh9Jywgbm90ICdwYWNrYWdlOiR7dXJpLnBhdGh9JyI7CiAgICB9CiAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICBfbG9nKCdSZXNvbHZpbmcgcGFja2FnZSB3aXRoIHVyaSBwYXRoOiAke3VyaS5wYXRofScpOwogICAgfQogICAgdmFyIHJlc29sdmVkVXJpOwogICAgaWYgKF9wYWNrYWdlRXJyb3IgIT0gbnVsbCkgewogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIlJlc29sdmluZyBwYWNrYWdlIHdpdGggcGVuZGluZyByZXNvbHV0aW9uIGVycm9yOiAkX3BhY2thZ2VFcnJvciIpOwogICAgICB9CiAgICAgIHRocm93IF9wYWNrYWdlRXJyb3I7CiAgICB9IGVsc2UgaWYgKF9wYWNrYWdlUm9vdCAhPSBudWxsKSB7CiAgICAgIHJlc29sdmVkVXJpID0gX3BhY2thZ2VSb290LnJlc29sdmUodXJpLnBhdGgpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHBhY2thZ2VOYW1lRW5kIDwgMCkgewogICAgICAgIC8vIFBhY2thZ2UgVVJJcyBtdXN0IGhhdmUgYSBwYXRoIGFmdGVyIHRoZSBwYWNrYWdlIG5hbWUsIGV2ZW4gaWYgaXQncwogICAgICAgIC8vIGp1c3QgIi8iLgogICAgICAgIHRocm93ICJVUklTIHVzaW5nIHRoZSAncGFja2FnZTonIHNjaGVtZSBzaG91bGQgbG9vayBsaWtlICIKICAgICAgICAgICAgIidwYWNrYWdlOiR7dXJpLnBhdGh9LycsIG5vdCAncGFja2FnZToke3VyaS5wYXRofSciOwogICAgICB9CiAgICAgIHZhciBwYWNrYWdlTmFtZSA9IHVyaS5wYXRoLnN1YnN0cmluZygwLCBwYWNrYWdlTmFtZUVuZCk7CiAgICAgIHZhciBtYXBwaW5nID0gX3BhY2thZ2VNYXBbcGFja2FnZU5hbWVdOwogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIk1hcHBlZCAnJHBhY2thZ2VOYW1lJyBwYWNrYWdlIHRvICckbWFwcGluZyciKTsKICAgICAgfQogICAgICBpZiAobWFwcGluZyA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgIk5vIG1hcHBpbmcgZm9yICckcGFja2FnZU5hbWUnIHBhY2thZ2Ugd2hlbiByZXNvbHZpbmcgJyR1cmknLiI7CiAgICAgIH0KICAgICAgdmFyIHBhdGg7CiAgICAgIGFzc2VydCh1cmkucGF0aC5sZW5ndGggPiBwYWNrYWdlTmFtZS5sZW5ndGgpOwogICAgICBwYXRoID0gdXJpLnBhdGguc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCArIDEpOwogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIlBhdGggdG8gYmUgcmVzb2x2ZWQgaW4gcGFja2FnZTogJHBhdGgiKTsKICAgICAgfQogICAgICByZXNvbHZlZFVyaSA9IG1hcHBpbmcucmVzb2x2ZShwYXRoKTsKICAgIH0KICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIlJlc29sdmVkICckdXJpJyB0byAnJHJlc29sdmVkVXJpJy4iKTsKICAgIH0KICAgIHJldHVybiByZXNvbHZlZFVyaTsKICB9CgogIFJhd1JlY2VpdmVQb3J0IF9wYWNrYWdlc1BvcnQ7CgogIHZvaWQgX3JlcXVlc3RQYWNrYWdlc01hcChbVXJpIHBhY2thZ2VDb25maWddKSB7CiAgICBpZiAoX3BhY2thZ2VzUG9ydCAhPSBudWxsKSB7CiAgICAgIC8vIEFscmVhZHkgc2NoZWR1bGVkLgogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBDcmVhdGUgYSBwb3J0IHRvIHJlY2VpdmUgdGhlIHBhY2thZ2VzIG1hcCBvbi4KICAgIF9wYWNrYWdlc1BvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoX2hhbmRsZVBhY2thZ2VzUmVwbHkpOwogICAgdmFyIHNwID0gX3BhY2thZ2VzUG9ydC5zZW5kUG9ydDsKCiAgICBpZiAocGFja2FnZUNvbmZpZyAhPSBudWxsKSB7CiAgICAgIC8vIEV4cGxpY2l0bHkgc3BlY2lmaWVkIC5wYWNrYWdlcyBwYXRoLgogICAgICBfaGFuZGxlUGFja2FnZXNSZXF1ZXN0KHNwLCBfdHJhY2VMb2FkaW5nLCAtMiwgcGFja2FnZUNvbmZpZyk7CiAgICB9IGVsc2UgewogICAgICAvLyBTZWFyY2ggZm9yIC5wYWNrYWdlcyBzdGFydGluZyBhdCB0aGUgcm9vdCBzY3JpcHQuCiAgICAgIF9oYW5kbGVQYWNrYWdlc1JlcXVlc3Qoc3AsIF90cmFjZUxvYWRpbmcsIC0xLCBfcm9vdFNjcmlwdCk7CiAgICB9CgogICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiUmVxdWVzdGVkIHBhY2thZ2VzIG1hcCBmb3IgJyRfcm9vdFNjcmlwdCcuIik7CiAgICB9CiAgfQoKICB2b2lkIF9oYW5kbGVQYWNrYWdlc1JlcGx5KG1zZykgewogICAgaWYgKF9wYWNrYWdlc1BvcnQgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgdG8gY2xvc2UgdGhlIF9wYWNrYWdlUG9ydCBiZWZvcmUgYW55IG90aGVyIGFjdGlvbi4KICAgIF9wYWNrYWdlc1BvcnQuY2xvc2UoKTsKICAgIF9wYWNrYWdlc1BvcnQgPSBudWxsOwoKICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkdvdCBwYWNrYWdlcyByZXBseTogJG1zZyIpOwogICAgfQogICAgaWYgKG1zZyBpcyBTdHJpbmcpIHsKICAgICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJHb3QgZmFpbHVyZSByZXNwb25zZSBvbiBwYWNrYWdlIHBvcnQ6ICckbXNnJyIpOwogICAgICB9CiAgICAgIC8vIFJlbWVtYmVyIHRoZSBlcnJvciBtZXNzYWdlLgogICAgICBfcGFja2FnZUVycm9yID0gbXNnOwogICAgfSBlbHNlIGlmIChtc2cgaXMgTGlzdCkgewogICAgICBpZiAobXNnLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgICAgIF9sb2coIlJlY2VpdmVkIHBhY2thZ2Ugcm9vdDogJyR7bXNnWzBdfSciKTsKICAgICAgICB9CiAgICAgICAgX3BhY2thZ2VSb290ID0gVXJpLnBhcnNlKG1zZ1swXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRmlyc3QgZW50cnkgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsb2FkZWQgLnBhY2thZ2VzIGZpbGUuCiAgICAgICAgYXNzZXJ0KChtc2cubGVuZ3RoICUgMikgPT0gMCk7CiAgICAgICAgYXNzZXJ0KG1zZy5sZW5ndGggPj0gMik7CiAgICAgICAgYXNzZXJ0KG1zZ1sxXSA9PSBudWxsKTsKICAgICAgICBfcGFja2FnZUNvbmZpZyA9IFVyaS5wYXJzZShtc2dbMF0pOwogICAgICAgIF9wYWNrYWdlTWFwID0gbmV3IE1hcDxTdHJpbmcsIFVyaT4oKTsKICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgLy8gVE9ETyhpcG9zdmEpOiBDb21wbGFpbiBhYm91dCBkdXBsaWNhdGUgZW50cmllcy4KICAgICAgICAgIF9wYWNrYWdlTWFwW21zZ1tpXV0gPSBVcmkucGFyc2UobXNnW2kgKyAxXSk7CiAgICAgICAgfQogICAgICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgICAgICBfbG9nKCJTZXR1cCBwYWNrYWdlIG1hcDogJF9wYWNrYWdlTWFwIik7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfcGFja2FnZUVycm9yID0gIkJhZCB0eXBlIG9mIHBhY2thZ2VzIHJlcGx5OiAke21zZy5ydW50aW1lVHlwZX0iOwogICAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coX3BhY2thZ2VFcnJvcik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZXNvbHZlIGFsbCBwZW5kaW5nIHBhY2thZ2UgbG9hZHMgbm93IHRoYXQgd2Uga25vdyBob3cgdG8gcmVzb2x2ZSB0aGVtLgogICAgd2hpbGUgKF9wZW5kaW5nUGFja2FnZUxvYWRzLmxlbmd0aCA+IDApIHsKICAgICAgLy8gT3JkZXIgZG9lcyBub3QgbWF0dGVyIGFzIHdlIHF1ZXVlIGFsbCBvZiB0aGUgcmVxdWVzdHMgdXAgcmlnaHQgbm93LgogICAgICB2YXIgcmVxID0gX3BlbmRpbmdQYWNrYWdlTG9hZHMucmVtb3ZlTGFzdCgpOwogICAgICAvLyBDYWxsIHRoZSByZWdpc3RlcmVkIGNsb3N1cmUsIHRvIGhhbmRsZSB0aGUgZGVsYXllZCBhY3Rpb24uCiAgICAgIHJlcSgpOwogICAgfQogICAgLy8gUmVzZXQgdGhlIHBlbmRpbmcgcGFja2FnZSBsb2FkcyB0byBlbXB0eS4gU28gdGhhdCB3ZSBldmVudHVhbGx5IGNhbgogICAgLy8gZmluaXNoIGxvYWRpbmcuCiAgICBfcGVuZGluZ1BhY2thZ2VMb2FkcyA9IFtdOwogIH0KfQoKX2xvZyhtc2cpIHsKICBwcmludCgiJSAkbXNnIik7Cn0KCnZhciBfaHR0cENsaWVudDsKCi8vIFNlbmQgYSByZXNwb25zZSB0byB0aGUgcmVxdWVzdGluZyBpc29sYXRlLgp2b2lkIF9zZW5kUmVzb3VyY2VSZXNwb25zZShTZW5kUG9ydCBzcCwgaW50IHRhZywgVXJpIHVyaSwgVXJpIHJlc29sdmVkVXJpLAogICAgU3RyaW5nIGxpYnJhcnlVcmwsIGR5bmFtaWMgZGF0YSkgewogIGFzc2VydCgoZGF0YSBpcyBMaXN0PGludD4pIHx8IChkYXRhIGlzIFN0cmluZykpOwogIHZhciBtc2cgPSBuZXcgTGlzdCg1KTsKICBpZiAoZGF0YSBpcyBTdHJpbmcpIHsKICAgIC8vIFdlIGVuY291bnRlcmVkIGFuIGVycm9yLCBmbGlwIHRoZSBzaWduIG9mIHRoZSB0YWcgdG8gaW5kaWNhdGUgdGhhdC4KICAgIHRhZyA9IC10YWc7CiAgICBpZiAobGlicmFyeVVybCA9PSBudWxsKSB7CiAgICAgIGRhdGEgPSAnQ291bGQgbm90IGxvYWQgIiR1cmkiOiAkZGF0YSc7CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gJ0NvdWxkIG5vdCBpbXBvcnQgIiR1cmkiIGZyb20gIiRsaWJyYXJ5VXJsIjogJGRhdGEnOwogICAgfQogIH0KICBtc2dbMF0gPSB0YWc7CiAgbXNnWzFdID0gdXJpLnRvU3RyaW5nKCk7CiAgbXNnWzJdID0gcmVzb2x2ZWRVcmkudG9TdHJpbmcoKTsKICBtc2dbM10gPSBsaWJyYXJ5VXJsOwogIG1zZ1s0XSA9IGRhdGE7CiAgc3Auc2VuZChtc2cpOwp9CgovLyBTZW5kIGEgcmVzcG9uc2UgdG8gdGhlIHJlcXVlc3RpbmcgaXNvbGF0ZS4Kdm9pZCBfc2VuZEV4dGVuc2lvbkltcG9ydFJlc3BvbnNlKAogICAgU2VuZFBvcnQgc3AsIFVyaSB1cmksIFN0cmluZyBsaWJyYXJ5VXJsLCBTdHJpbmcgcmVzb2x2ZWRVcmkpIHsKICB2YXIgbXNnID0gbmV3IExpc3QoNSk7CiAgaW50IHRhZyA9IF9EYXJ0X2tJbXBvcnRFeHRlbnNpb247CiAgaWYgKHJlc29sdmVkVXJpID09IG51bGwpIHsKICAgIC8vIFdlIGNvdWxkIG5vdCByZXNvbHZlIHRoZSBkYXJ0LWV4dDogdXJpLgogICAgdGFnID0gLXRhZzsKICAgIHJlc29sdmVkVXJpID0gJ0NvdWxkIG5vdCByZXNvbHZlICIkdXJpIiBmcm9tICIkbGlicmFyeVVybCInOwogIH0KICBtc2dbMF0gPSB0YWc7CiAgbXNnWzFdID0gdXJpLnRvU3RyaW5nKCk7CiAgbXNnWzJdID0gcmVzb2x2ZWRVcmk7CiAgbXNnWzNdID0gbGlicmFyeVVybDsKICBtc2dbNF0gPSByZXNvbHZlZFVyaTsKICBzcC5zZW5kKG1zZyk7Cn0KCnZvaWQgX2xvYWRIdHRwKAogICAgU2VuZFBvcnQgc3AsIGludCB0YWcsIFVyaSB1cmksIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICBpZiAoX2h0dHBDbGllbnQgPT0gbnVsbCkgewogICAgX2h0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudCgpLi5tYXhDb25uZWN0aW9uc1Blckhvc3QgPSA2OwogIH0KICBfaHR0cENsaWVudAogICAgICAuZ2V0VXJsKHJlc29sdmVkVXJpKQogICAgICAudGhlbigoSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCkgPT4gcmVxdWVzdC5jbG9zZSgpKQogICAgICAudGhlbigoSHR0cENsaWVudFJlc3BvbnNlIHJlc3BvbnNlKSB7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBCeXRlc0J1aWxkZXIoY29weTogZmFsc2UpOwogICAgcmVzcG9uc2UubGlzdGVuKGJ1aWxkZXIuYWRkLCBvbkRvbmU6ICgpIHsKICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gMjAwKSB7CiAgICAgICAgdmFyIG1zZyA9ICJGYWlsdXJlIGdldHRpbmcgJHJlc29sdmVkVXJpOlxuIgogICAgICAgICAgICAiICAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9ICR7cmVzcG9uc2UucmVhc29uUGhyYXNlfSI7CiAgICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwsIG1zZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKAogICAgICAgICAgICBzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBidWlsZGVyLnRha2VCeXRlcygpKTsKICAgICAgfQogICAgfSwgb25FcnJvcjogKGUpIHsKICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKAogICAgICAgICAgc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwgZS50b1N0cmluZygpKTsKICAgIH0pOwogIH0pLmNhdGNoRXJyb3IoKGUpIHsKICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBlLnRvU3RyaW5nKCkpOwogIH0pOwogIC8vIEl0J3MganVzdCBoZXJlIHRvIHB1c2ggYW4gZXZlbnQgb24gdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZSBpbnZva2UgdGhlCiAgLy8gc2NoZWR1bGVkIG1pY3JvdGFza3MuCiAgVGltZXIucnVuKCgpIHt9KTsKfQoKdm9pZCBfbG9hZEZpbGUoSXNvbGF0ZUxvYWRlclN0YXRlIGxvYWRlclN0YXRlLCBTZW5kUG9ydCBzcCwgaW50IHRhZywgVXJpIHVyaSwKICAgIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICB2YXIgcGF0aCA9IHJlc29sdmVkVXJpLnRvRmlsZVBhdGgoKTsKICB2YXIgc291cmNlRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwogIHNvdXJjZUZpbGUucmVhZEFzQnl0ZXMoKS50aGVuKChkYXRhKSB7CiAgICBfc2VuZFJlc291cmNlUmVzcG9uc2Uoc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwgZGF0YSk7CiAgfSwgb25FcnJvcjogKGUpIHsKICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCBlLnRvU3RyaW5nKCkpOwogIH0pLndoZW5Db21wbGV0ZSgoKSB7CiAgICBsb2FkZXJTdGF0ZS5jdXJyZW50RmlsZVJlcXVlc3RzLS07CiAgICB3aGlsZSAobG9hZGVyU3RhdGUuc2hvdWxkSXNzdWVGaWxlUmVxdWVzdCkgewogICAgICBGaWxlUmVxdWVzdCBmciA9IGxvYWRlclN0YXRlLmRlcXVldWVGaWxlUmVxdWVzdCgpOwogICAgICBpZiAoZnIgPT0gbnVsbCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIF9sb2FkRmlsZSgKICAgICAgICAgIGxvYWRlclN0YXRlLCBmci5zcCwgZnIudGFnLCBmci51cmksIGZyLnJlc29sdmVkVXJpLCBmci5saWJyYXJ5VXJsKTsKICAgICAgbG9hZGVyU3RhdGUuY3VycmVudEZpbGVSZXF1ZXN0cysrOwogICAgfQogIH0pOwp9Cgp2b2lkIF9sb2FkRGF0YVVyaSgKICAgIFNlbmRQb3J0IHNwLCBpbnQgdGFnLCBVcmkgdXJpLCBVcmkgcmVzb2x2ZWRVcmksIFN0cmluZyBsaWJyYXJ5VXJsKSB7CiAgdHJ5IHsKICAgIHZhciBtaW1lID0gdXJpLmRhdGEubWltZVR5cGU7CiAgICBpZiAoKG1pbWUgIT0gImFwcGxpY2F0aW9uL2RhcnQiKSAmJiAobWltZSAhPSAidGV4dC9wbGFpbiIpKSB7CiAgICAgIHRocm93ICJNSU1FLXR5cGUgbXVzdCBiZSBhcHBsaWNhdGlvbi9kYXJ0IG9yIHRleHQvcGxhaW46ICRtaW1lIGdpdmVuLiI7CiAgICB9CiAgICB2YXIgY2hhcnNldCA9IHVyaS5kYXRhLmNoYXJzZXQ7CiAgICBpZiAoKGNoYXJzZXQgIT0gInV0Zi04IikgJiYgKGNoYXJzZXQgIT0gIlVTLUFTQ0lJIikpIHsKICAgICAgLy8gVGhlIEMrKyBwb3J0aW9uIG9mIHRoZSBlbWJlZGRlciBhc3N1bWVzIFVURi04LgogICAgICB0aHJvdyAiT25seSB1dGYtOCBvciBVUy1BU0NJSSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZDogJGNoYXJzZXQgZ2l2ZW4uIjsKICAgIH0KICAgIF9zZW5kUmVzb3VyY2VSZXNwb25zZSgKICAgICAgICBzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsLCB1cmkuZGF0YS5jb250ZW50QXNCeXRlcygpKTsKICB9IGNhdGNoIChlKSB7CiAgICBfc2VuZFJlc291cmNlUmVzcG9uc2Uoc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwKICAgICAgICAiSW52YWxpZCBkYXRhIHVyaSAoJHVyaSk6XG4gICRlIik7CiAgfQp9CgovLyBMb2FkaW5nIGEgcGFja2FnZSBVUkkgbmVlZHMgdG8gZmlyc3QgbWFwIHRoZSBwYWNrYWdlIG5hbWUgdG8gYSBsb2FkYWJsZQovLyBVUkkuCl9sb2FkUGFja2FnZShJc29sYXRlTG9hZGVyU3RhdGUgbG9hZGVyU3RhdGUsIFNlbmRQb3J0IHNwLCBib29sIHRyYWNlTG9hZGluZywKICAgIGludCB0YWcsIFVyaSB1cmksIFVyaSByZXNvbHZlZFVyaSwgU3RyaW5nIGxpYnJhcnlVcmwpIHsKICBpZiAobG9hZGVyU3RhdGUuX3BhY2thZ2VzUmVhZHkpIHsKICAgIHZhciByZXNvbHZlZFVyaTsKICAgIHRyeSB7CiAgICAgIHJlc29sdmVkVXJpID0gbG9hZGVyU3RhdGUuX3Jlc29sdmVQYWNrYWdlVXJpKHVyaSk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJFeGNlcHRpb24gKCRlKSB3aGVuIHJlc29sdmluZyBwYWNrYWdlIFVSSTogJHVyaSIpOwogICAgICB9CiAgICAgIC8vIFJlcG9ydCBlcnJvci4KICAgICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKAogICAgICAgICAgc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCwgZS50b1N0cmluZygpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gUmVjdXJzaXZlbHkgY2FsbCB3aXRoIHRoZSBuZXcgcmVzb2x2ZWQgdXJpLgogICAgX2hhbmRsZVJlc291cmNlUmVxdWVzdCgKICAgICAgICBsb2FkZXJTdGF0ZSwgc3AsIHRyYWNlTG9hZGluZywgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsKTsKICB9IGVsc2UgewogICAgaWYgKGxvYWRlclN0YXRlLl9wZW5kaW5nUGFja2FnZUxvYWRzLmlzRW1wdHkpIHsKICAgICAgLy8gUGFja2FnZSByZXNvbHV0aW9uIGhhcyBub3QgYmVlbiBzZXR1cCB5ZXQsIGFuZCB0aGlzIGlzIHRoZSBmaXJzdAogICAgICAvLyByZXF1ZXN0IGZvciBwYWNrYWdlIHJlc29sdXRpb24gJiBsb2FkaW5nLgogICAgICBsb2FkZXJTdGF0ZS5fcmVxdWVzdFBhY2thZ2VzTWFwKCk7CiAgICB9CiAgICAvLyBSZWdpc3RlciB0aGUgYWN0aW9uIG9mIGxvYWRpbmcgdGhpcyBwYWNrYWdlIG9uY2UgdGhlIHBhY2thZ2UgcmVzb2x1dGlvbgogICAgLy8gaXMgcmVhZHkuCiAgICBsb2FkZXJTdGF0ZS5fcGVuZGluZ1BhY2thZ2VMb2Fkcy5hZGQoKCkgewogICAgICBfaGFuZGxlUmVzb3VyY2VSZXF1ZXN0KAogICAgICAgICAgbG9hZGVyU3RhdGUsIHNwLCB0cmFjZUxvYWRpbmcsIHRhZywgdXJpLCB1cmksIGxpYnJhcnlVcmwpOwogICAgfSk7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIlBlbmRpbmcgcGFja2FnZSBsb2FkIG9mICckdXJpJzogIgogICAgICAgICAgIiR7bG9hZGVyU3RhdGUuX3BlbmRpbmdQYWNrYWdlTG9hZHMubGVuZ3RofSBwZW5kaW5nIik7CiAgICB9CiAgfQp9CgovLyBUT0RPKGpvaG5tY2N1dGNoYW4pOiBUaGlzIGFuZCBtb3N0IG90aGVyIHRvcCBsZXZlbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlCi8vIHNob3VsZCBiZSB0dXJuZWQgaW50byBtZXRob2RzIG9uIHRoZSBJc29sYXRlTG9hZGVyU3RhdGUgY2xhc3MuCl9oYW5kbGVSZXNvdXJjZVJlcXVlc3QoSXNvbGF0ZUxvYWRlclN0YXRlIGxvYWRlclN0YXRlLCBTZW5kUG9ydCBzcCwKICAgIGJvb2wgdHJhY2VMb2FkaW5nLCBpbnQgdGFnLCBVcmkgdXJpLCBVcmkgcmVzb2x2ZWRVcmksIFN0cmluZyBsaWJyYXJ5VXJsKSB7CiAgaWYgKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAnJyB8fCByZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICBpZiAobG9hZGVyU3RhdGUuc2hvdWxkSXNzdWVGaWxlUmVxdWVzdCkgewogICAgICBfbG9hZEZpbGUobG9hZGVyU3RhdGUsIHNwLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwpOwogICAgICBsb2FkZXJTdGF0ZS5jdXJyZW50RmlsZVJlcXVlc3RzKys7CiAgICB9IGVsc2UgewogICAgICBGaWxlUmVxdWVzdCBmciA9IG5ldyBGaWxlUmVxdWVzdChzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsKTsKICAgICAgbG9hZGVyU3RhdGUuZW5xdWV1ZUZpbGVSZXF1ZXN0KGZyKTsKICAgIH0KICB9IGVsc2UgaWYgKChyZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2h0dHAnKSB8fAogICAgICAocmVzb2x2ZWRVcmkuc2NoZW1lID09ICdodHRwcycpKSB7CiAgICBfbG9hZEh0dHAoc3AsIHRhZywgdXJpLCByZXNvbHZlZFVyaSwgbGlicmFyeVVybCk7CiAgfSBlbHNlIGlmICgocmVzb2x2ZWRVcmkuc2NoZW1lID09ICdkYXRhJykpIHsKICAgIF9sb2FkRGF0YVVyaShzcCwgdGFnLCB1cmksIHJlc29sdmVkVXJpLCBsaWJyYXJ5VXJsKTsKICB9IGVsc2UgaWYgKChyZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ3BhY2thZ2UnKSkgewogICAgX2xvYWRQYWNrYWdlKAogICAgICAgIGxvYWRlclN0YXRlLCBzcCwgdHJhY2VMb2FkaW5nLCB0YWcsIHVyaSwgcmVzb2x2ZWRVcmksIGxpYnJhcnlVcmwpOwogIH0gZWxzZSB7CiAgICBfc2VuZFJlc291cmNlUmVzcG9uc2UoCiAgICAgICAgc3AsCiAgICAgICAgdGFnLAogICAgICAgIHVyaSwKICAgICAgICByZXNvbHZlZFVyaSwKICAgICAgICBsaWJyYXJ5VXJsLAogICAgICAgICdVbmtub3duIHNjaGVtZSAoJHtyZXNvbHZlZFVyaS5zY2hlbWV9KSBmb3IgJwogICAgICAgICckcmVzb2x2ZWRVcmknKTsKICB9Cn0KCi8vIEhhbmRsaW5nIG9mIHBhY2thZ2VzIHJlcXVlc3RzLiBGaW5kaW5nIGFuZCBwYXJzaW5nIG9mIC5wYWNrYWdlcyBmaWxlIG9yCi8vIHBhY2thZ2VzLyBkaXJlY3Rvcmllcy4KY29uc3QgX0xGID0gMHgwQTsKY29uc3QgX0NSID0gMHgwRDsKY29uc3QgX1NQQUNFID0gMHgyMDsKY29uc3QgX0hBU0ggPSAweDIzOwpjb25zdCBfRE9UID0gMHgyRTsKY29uc3QgX0NPTE9OID0gMHgzQTsKY29uc3QgX0RFTCA9IDB4N0Y7Cgpjb25zdCBfaW52YWxpZFBhY2thZ2VOYW1lQ2hhcnMgPSBjb25zdCBbCiAgdHJ1ZSwgLy8gIHNwYWNlCiAgZmFsc2UsIC8vICEKICB0cnVlLCAvLyAgIgogIHRydWUsIC8vICAjCiAgZmFsc2UsIC8vICQKICB0cnVlLCAvLyAgJQogIGZhbHNlLCAvLyAmCiAgZmFsc2UsIC8vICcKICBmYWxzZSwgLy8gKAogIGZhbHNlLCAvLyApCiAgZmFsc2UsIC8vICoKICBmYWxzZSwgLy8gKwogIGZhbHNlLCAvLyAsCiAgZmFsc2UsIC8vIC0KICBmYWxzZSwgLy8gLgogIHRydWUsIC8vICAvCiAgZmFsc2UsIC8vIDAKICBmYWxzZSwgLy8gMQogIGZhbHNlLCAvLyAyCiAgZmFsc2UsIC8vIDMKICBmYWxzZSwgLy8gNAogIGZhbHNlLCAvLyA1CiAgZmFsc2UsIC8vIDYKICBmYWxzZSwgLy8gNwogIGZhbHNlLCAvLyA4CiAgZmFsc2UsIC8vIDkKICB0cnVlLCAvLyAgOgogIGZhbHNlLCAvLyA7CiAgdHJ1ZSwgLy8gIDwKICBmYWxzZSwgLy8gPQogIHRydWUsIC8vICA+CiAgdHJ1ZSwgLy8gID8KICBmYWxzZSwgLy8gQAogIGZhbHNlLCAvLyBBCiAgZmFsc2UsIC8vIEIKICBmYWxzZSwgLy8gQwogIGZhbHNlLCAvLyBECiAgZmFsc2UsIC8vIEUKICBmYWxzZSwgLy8gRgogIGZhbHNlLCAvLyBHCiAgZmFsc2UsIC8vIEgKICBmYWxzZSwgLy8gSQogIGZhbHNlLCAvLyBKCiAgZmFsc2UsIC8vIEsKICBmYWxzZSwgLy8gTAogIGZhbHNlLCAvLyBNCiAgZmFsc2UsIC8vIE4KICBmYWxzZSwgLy8gTwogIGZhbHNlLCAvLyBQCiAgZmFsc2UsIC8vIFEKICBmYWxzZSwgLy8gUgogIGZhbHNlLCAvLyBTCiAgZmFsc2UsIC8vIFQKICBmYWxzZSwgLy8gVQogIGZhbHNlLCAvLyBWCiAgZmFsc2UsIC8vIFcKICBmYWxzZSwgLy8gWAogIGZhbHNlLCAvLyBZCiAgZmFsc2UsIC8vIFoKICB0cnVlLCAvLyAgWwogIHRydWUsIC8vICBcCiAgdHJ1ZSwgLy8gIF0KICB0cnVlLCAvLyAgXgogIGZhbHNlLCAvLyBfCiAgdHJ1ZSwgLy8gIGAKICBmYWxzZSwgLy8gYQogIGZhbHNlLCAvLyBiCiAgZmFsc2UsIC8vIGMKICBmYWxzZSwgLy8gZAogIGZhbHNlLCAvLyBlCiAgZmFsc2UsIC8vIGYKICBmYWxzZSwgLy8gZwogIGZhbHNlLCAvLyBoCiAgZmFsc2UsIC8vIGkKICBmYWxzZSwgLy8gagogIGZhbHNlLCAvLyBrCiAgZmFsc2UsIC8vIGwKICBmYWxzZSwgLy8gbQogIGZhbHNlLCAvLyBuCiAgZmFsc2UsIC8vIG8KICBmYWxzZSwgLy8gcAogIGZhbHNlLCAvLyBxCiAgZmFsc2UsIC8vIHIKICBmYWxzZSwgLy8gcwogIGZhbHNlLCAvLyB0CiAgZmFsc2UsIC8vIHUKICBmYWxzZSwgLy8gdgogIGZhbHNlLCAvLyB3CiAgZmFsc2UsIC8vIHgKICBmYWxzZSwgLy8geQogIGZhbHNlLCAvLyB6CiAgdHJ1ZSwgLy8gIHsKICB0cnVlLCAvLyAgfAogIHRydWUsIC8vICB9CiAgZmFsc2UsIC8vIH4KICB0cnVlLCAvLyAgREVMCl07CgpfcGFyc2VQYWNrYWdlc0ZpbGUoCiAgICBTZW5kUG9ydCBzcCwgYm9vbCB0cmFjZUxvYWRpbmcsIFVyaSBwYWNrYWdlc0ZpbGUsIExpc3Q8aW50PiBkYXRhKSB7CiAgLy8gVGhlIGZpcnN0IGVudHJ5IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlbnRpZmllZCAucGFja2FnZXMgZmlsZQogIC8vIGluc3RlYWQgb2YgYSBtYXBwaW5nLgogIHZhciByZXN1bHQgPSBbcGFja2FnZXNGaWxlLnRvU3RyaW5nKCksIG51bGxdOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoOwogIHdoaWxlIChpbmRleCA8IGxlbikgewogICAgdmFyIHN0YXJ0ID0gaW5kZXg7CiAgICB2YXIgY2hhciA9IGRhdGFbaW5kZXhdOwogICAgaWYgKChjaGFyID09IF9DUikgfHwgKGNoYXIgPT0gX0xGKSkgewogICAgICAvLyBTa2lwcGluZyBlbXB0eSBsaW5lcy4KICAgICAgaW5kZXgrKzsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gSWRlbnRpZnkgc3BsaXQgd2l0aGluIHRoZSBsaW5lIGFuZCBlbmQgb2YgdGhlIGxpbmUuCiAgICB2YXIgc2VwYXJhdG9yID0gLTE7CiAgICB2YXIgZW5kID0gbGVuOwogICAgLy8gVmVyaWZ5aW5nIHZhbGlkaXR5IG9mIHBhY2thZ2UgbmFtZSB3aGlsZSBzY2FubmluZyB0aGUgbGluZS4KICAgIHZhciBub25Eb3QgPSBmYWxzZTsKICAgIHZhciBpbnZhbGlkUGFja2FnZU5hbWUgPSBmYWxzZTsKCiAgICAvLyBTY2FuIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgb3IgZGF0YS4KICAgIHdoaWxlIChpbmRleCA8IGxlbikgewogICAgICBjaGFyID0gZGF0YVtpbmRleCsrXTsKICAgICAgLy8gSWYgd2UgaGF2ZSBub3QgcmVhY2hlZCB0aGUgc2VwYXJhdG9yIHlldCwgZGV0ZXJtaW5lIHdoZXRoZXIgd2UgYXJlCiAgICAgIC8vIHNjYW5uaW5nIGxlZ2FsIHBhY2thZ2UgbmFtZSBjaGFyYWN0ZXJzLgogICAgICBpZiAoc2VwYXJhdG9yID09IC0xKSB7CiAgICAgICAgaWYgKChjaGFyID09IF9DT0xPTikpIHsKICAgICAgICAgIC8vIFRoZSBmaXJzdCBjb2xvbiBvbiBhIGxpbmUgaXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHBhY2thZ2UgbmFtZSBhbmQKICAgICAgICAgIC8vIHJlbGF0ZWQgVVJJLgogICAgICAgICAgc2VwYXJhdG9yID0gaW5kZXggLSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTdGlsbCBzY2FubmluZyB0aGUgcGFja2FnZSBuYW1lIHBhcnQuIENoZWNrIGZvciB0aGUgdmFsaWRpdHkgb2YKICAgICAgICAgIC8vIHRoZSBjaGFyYWN0ZXJzLgogICAgICAgICAgbm9uRG90ID0gbm9uRG90IHx8IChjaGFyICE9IF9ET1QpOwogICAgICAgICAgaW52YWxpZFBhY2thZ2VOYW1lID0gaW52YWxpZFBhY2thZ2VOYW1lIHx8CiAgICAgICAgICAgICAgKGNoYXIgPCBfU1BBQ0UpIHx8CiAgICAgICAgICAgICAgKGNoYXIgPiBfREVMKSB8fAogICAgICAgICAgICAgIF9pbnZhbGlkUGFja2FnZU5hbWVDaGFyc1tjaGFyIC0gX1NQQUNFXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gSWRlbnRpZnkgZW5kIG9mIGxpbmUuCiAgICAgIGlmICgoY2hhciA9PSBfQ1IpIHx8IChjaGFyID09IF9MRikpIHsKICAgICAgICBlbmQgPSBpbmRleCAtIDE7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICAvLyBObyBmdXJ0aGVyIGhhbmRsaW5nIG5lZWRlZCBmb3IgY29tbWVudCBsaW5lcy4KICAgIGlmIChkYXRhW3N0YXJ0XSA9PSBfSEFTSCkgewogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiU2tpcHBpbmcgY29tbWVudCBpbiAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgICAiJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc3RhcnQsIGVuZCl9Iik7CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gQ2hlY2sgZm9yIGEgYmFkbHkgZm9ybWF0dGVkIGxpbmUsIHN0YXJ0aW5nIHdpdGggYSAnOicuCiAgICBpZiAoc2VwYXJhdG9yID09IHN0YXJ0KSB7CiAgICAgIHZhciBsaW5lID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiTGluZSBzdGFydHMgd2l0aCAnOicgaW4gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICAgIiRsaW5lIik7CiAgICAgIH0KICAgICAgc3Auc2VuZCgiTWlzc2luZyBwYWNrYWdlIG5hbWUgaW4gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICIkbGluZSIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gRW5zdXJlIHRoZXJlIGlzIGEgc2VwYXJhdG9yIG9uIHRoZSBsaW5lLgogICAgaWYgKHNlcGFyYXRvciA9PSAtMSkgewogICAgICB2YXIgbGluZSA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhLCBzdGFydCwgZW5kKTsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkxpbmUgaGFzIG5vICc6JyBpbiAkcGFja2FnZXNGaWxlOlxuIgogICAgICAgICAgICAiJGxpbmUiKTsKICAgICAgfQogICAgICBzcC5zZW5kKCJNaXNzaW5nICc6JyBzZXBhcmF0b3IgaW4gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICIkbGluZSIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHBhY2thZ2VOYW1lID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGRhdGEsIHN0YXJ0LCBzZXBhcmF0b3IpOwoKICAgIC8vIENoZWNrIGZvciB2YWxpZCBwYWNrYWdlIG5hbWUuCiAgICBpZiAoaW52YWxpZFBhY2thZ2VOYW1lIHx8ICFub25Eb3QpIHsKICAgICAgdmFyIGxpbmUgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJJbnZhbGlkIHBhY2thZ2UgbmFtZSAkcGFja2FnZU5hbWUgaW4gJHBhY2thZ2VzRmlsZSIpOwogICAgICB9CiAgICAgIHNwLnNlbmQoIkludmFsaWQgcGFja2FnZSBuYW1lICckcGFja2FnZU5hbWUnIGluICRwYWNrYWdlc0ZpbGU6XG4iCiAgICAgICAgICAiJGxpbmUiKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygicGFja2FnZU5hbWU6ICRwYWNrYWdlTmFtZSIpOwogICAgfQogICAgdmFyIHBhY2thZ2VVcmkgPSBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSwgc2VwYXJhdG9yICsgMSwgZW5kKTsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygib3JpZ2luYWwgcGFja2FnZVVyaTogJHBhY2thZ2VVcmkiKTsKICAgIH0KICAgIC8vIEVuc3VyZSB0aGUgcGFja2FnZSB1cmkgZW5kcyB3aXRoIGEgLy4KICAgIGlmICghcGFja2FnZVVyaS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgIHBhY2thZ2VVcmkgPSAiJHBhY2thZ2VVcmkvIjsKICAgIH0KICAgIHBhY2thZ2VVcmkgPSBwYWNrYWdlc0ZpbGUucmVzb2x2ZShwYWNrYWdlVXJpKS50b1N0cmluZygpOwogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJtYXBwaW5nOiAkcGFja2FnZU5hbWUgLT4gJHBhY2thZ2VVcmkiKTsKICAgIH0KICAgIHJlc3VsdC5hZGQocGFja2FnZU5hbWUpOwogICAgcmVzdWx0LmFkZChwYWNrYWdlVXJpKTsKICB9CgogIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlBhcnNlZCBwYWNrYWdlcyBmaWxlIGF0ICRwYWNrYWdlc0ZpbGUuIFNlbmRpbmc6XG4kcmVzdWx0Iik7CiAgfQogIHNwLnNlbmQocmVzdWx0KTsKfQoKX2xvYWRQYWNrYWdlc0ZpbGUoU2VuZFBvcnQgc3AsIGJvb2wgdHJhY2VMb2FkaW5nLCBVcmkgcGFja2FnZXNGaWxlKSBhc3luYyB7CiAgdHJ5IHsKICAgIHZhciBkYXRhID0gYXdhaXQgbmV3IEZpbGUuZnJvbVVyaShwYWNrYWdlc0ZpbGUpLnJlYWRBc0J5dGVzKCk7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkxvYWRlZCBwYWNrYWdlcyBmaWxlIGZyb20gJHBhY2thZ2VzRmlsZTpcbiIKICAgICAgICAgICIke25ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhkYXRhKX0iKTsKICAgIH0KICAgIF9wYXJzZVBhY2thZ2VzRmlsZShzcCwgdHJhY2VMb2FkaW5nLCBwYWNrYWdlc0ZpbGUsIGRhdGEpOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiRXJyb3IgbG9hZGluZyBwYWNrYWdlczogJGVcbiRzIik7CiAgICB9CiAgICBzcC5zZW5kKCJVbmNhdWdodCBlcnJvciAoJGUpIGxvYWRpbmcgcGFja2FnZXMgZmlsZS4iKTsKICB9Cn0KCl9maW5kUGFja2FnZXNGaWxlKFNlbmRQb3J0IHNwLCBib29sIHRyYWNlTG9hZGluZywgVXJpIGJhc2UpIGFzeW5jIHsKICB0cnkgewogICAgLy8gV2FsayB1cCB0aGUgZGlyZWN0b3J5IGhpZXJhcmNoeSB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZgogICAgLy8gLnBhY2thZ2VzIGZpbGVzIGluIHBhcmVudCBkaXJlY3RvcmllcyBhbmQgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYQogICAgLy8gcGFja2FnZXMvIGRpcmVjdG9yeSBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLgogICAgdmFyIGRpciA9IG5ldyBGaWxlLmZyb21VcmkoYmFzZSkucGFyZW50OwogICAgdmFyIHByZXYgPSBudWxsOwogICAgLy8gS2VlcCBzZWFyY2hpbmcgdW50aWwgd2UgcmVhY2ggdGhlIHJvb3QuCiAgICB3aGlsZSAoKHByZXYgPT0gbnVsbCkgfHwgKHByZXYucGF0aCAhPSBkaXIucGF0aCkpIHsKICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSAucGFja2FnZXMgZmlsZSBhbmQgaWYgaXQgZXhpc3RzIHRyeSB0bwogICAgICAvLyBsb2FkIGFuZCBwYXJzZSBpdC4KICAgICAgdmFyIGRpclVyaSA9IGRpci51cmk7CiAgICAgIHZhciBwYWNrYWdlc0ZpbGUgPSBkaXJVcmkucmVzb2x2ZSgiLnBhY2thZ2VzIik7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCJDaGVja2luZyBmb3IgJHBhY2thZ2VzRmlsZSBmaWxlLiIpOwogICAgICB9CiAgICAgIHZhciBleGlzdHMgPSBhd2FpdCBuZXcgRmlsZS5mcm9tVXJpKHBhY2thZ2VzRmlsZSkuZXhpc3RzKCk7CiAgICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgICBfbG9nKCIkcGFja2FnZXNGaWxlIGV4aXN0czogJGV4aXN0cyIpOwogICAgICB9CiAgICAgIGlmIChleGlzdHMpIHsKICAgICAgICBfbG9hZFBhY2thZ2VzRmlsZShzcCwgdHJhY2VMb2FkaW5nLCBwYWNrYWdlc0ZpbGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBNb3ZlIHVwIG9uZSBsZXZlbC4KICAgICAgcHJldiA9IGRpcjsKICAgICAgZGlyID0gZGlyLnBhcmVudDsKICAgIH0KCiAgICAvLyBObyAucGFja2FnZXMgZmlsZSB3YXMgZm91bmQuCiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkNvdWxkIG5vdCByZXNvbHZlIGEgcGFja2FnZSBsb2NhdGlvbiBmcm9tICRiYXNlIik7CiAgICB9CiAgICBzcC5zZW5kKCJDb3VsZCBub3QgcmVzb2x2ZSBhIHBhY2thZ2UgbG9jYXRpb24gZm9yIGJhc2UgYXQgJGJhc2UiKTsKICB9IGNhdGNoIChlLCBzKSB7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkVycm9yIGxvYWRpbmcgcGFja2FnZXM6ICRlXG4kcyIpOwogICAgfQogICAgc3Auc2VuZCgiVW5jYXVnaHQgZXJyb3IgKCRlKSBsb2FkaW5nIHBhY2thZ2VzIGZpbGUuIik7CiAgfQp9CgpGdXR1cmU8Ym9vbD4gX2xvYWRIdHRwUGFja2FnZXNGaWxlKAogICAgU2VuZFBvcnQgc3AsIGJvb2wgdHJhY2VMb2FkaW5nLCBVcmkgcmVzb3VyY2UpIGFzeW5jIHsKICB0cnkgewogICAgaWYgKF9odHRwQ2xpZW50ID09IG51bGwpIHsKICAgICAgX2h0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudCgpLi5tYXhDb25uZWN0aW9uc1Blckhvc3QgPSA2OwogICAgfQogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJGZXRjaGluZyBwYWNrYWdlcyBmaWxlIGZyb20gJyRyZXNvdXJjZScuIik7CiAgICB9CiAgICB2YXIgcmVxID0gYXdhaXQgX2h0dHBDbGllbnQuZ2V0VXJsKHJlc291cmNlKTsKICAgIHZhciByc3AgPSBhd2FpdCByZXEuY2xvc2UoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IEJ5dGVzQnVpbGRlcihjb3B5OiBmYWxzZSk7CiAgICBhd2FpdCBmb3IgKHZhciBieXRlcyBpbiByc3ApIHsKICAgICAgYnVpbGRlci5hZGQoYnl0ZXMpOwogICAgfQogICAgaWYgKHJzcC5zdGF0dXNDb2RlICE9IDIwMCkgewogICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygiR290IHN0YXR1cyAke3JzcC5zdGF0dXNDb2RlfSBmZXRjaGluZyAnJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB2YXIgZGF0YSA9IGJ1aWxkZXIudGFrZUJ5dGVzKCk7CiAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgIF9sb2coIkxvYWRlZCBwYWNrYWdlcyBmaWxlIGZyb20gJyRyZXNvdXJjZSc6XG4iCiAgICAgICAgICAiJHtuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoZGF0YSl9Iik7CiAgICB9CiAgICBfcGFyc2VQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcmVzb3VyY2UsIGRhdGEpOwogIH0gY2F0Y2ggKGUsIHMpIHsKICAgIGlmICh0cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiRXJyb3IgbG9hZGluZyBwYWNrYWdlcyBmaWxlIGZyb20gJyRyZXNvdXJjZSc6ICRlXG4kcyIpOwogICAgfQogICAgc3Auc2VuZCgiVW5jYXVnaHQgZXJyb3IgKCRlKSBsb2FkaW5nIHBhY2thZ2VzIGZpbGUgZnJvbSAnJHJlc291cmNlJy4iKTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpfbG9hZFBhY2thZ2VzRGF0YShzcCwgdHJhY2VMb2FkaW5nLCByZXNvdXJjZSkgewogIHRyeSB7CiAgICB2YXIgZGF0YSA9IHJlc291cmNlLmRhdGE7CiAgICB2YXIgbWltZSA9IGRhdGEubWltZVR5cGU7CiAgICBpZiAobWltZSAhPSAidGV4dC9wbGFpbiIpIHsKICAgICAgdGhyb3cgIk1JTUUtdHlwZSBtdXN0IGJlIHRleHQvcGxhaW46ICRtaW1lIGdpdmVuLiI7CiAgICB9CiAgICB2YXIgY2hhcnNldCA9IGRhdGEuY2hhcnNldDsKICAgIGlmICgoY2hhcnNldCAhPSAidXRmLTgiKSAmJiAoY2hhcnNldCAhPSAiVVMtQVNDSUkiKSkgewogICAgICAvLyBUaGUgQysrIHBvcnRpb24gb2YgdGhlIGVtYmVkZGVyIGFzc3VtZXMgVVRGLTguCiAgICAgIHRocm93ICJPbmx5IHV0Zi04IG9yIFVTLUFTQ0lJIGVuY29kaW5ncyBhcmUgc3VwcG9ydGVkOiAkY2hhcnNldCBnaXZlbi4iOwogICAgfQogICAgX3BhcnNlUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlLCBkYXRhLmNvbnRlbnRBc0J5dGVzKCkpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHNwLnNlbmQoIlVuY2F1Z2h0IGVycm9yICgkZSkgbG9hZGluZyBwYWNrYWdlcyBkYXRhLiIpOwogIH0KfQoKLy8gVGhpcyBjb2RlIHVzZWQgdG8gZXhpc3QgaW4gYSBzZWNvbmQgaXNvbGF0ZSBhbmQgc28gaXQgdXNlcyBhIFNlbmRQb3J0IHRvCi8vIHJlcG9ydCBpdCdzIHJldHVybiB2YWx1ZS4gVGhpcyBjb3VsZCBiZSByZWZhY3RvcmVkIHNvIHRoYXQgaXQgcmV0dXJucyBpdCdzCi8vIHZhbHVlIGFuZCB0aGUgY2FsbGVyIGNvdWxkIHdhaXQgb24gdGhlIGZ1dHVyZSByYXRoZXIgdGhhbiBhIG1lc3NhZ2Ugb24KLy8gU2VuZFBvcnQuCl9oYW5kbGVQYWNrYWdlc1JlcXVlc3QoCiAgICBTZW5kUG9ydCBzcCwgYm9vbCB0cmFjZUxvYWRpbmcsIGludCB0YWcsIFVyaSByZXNvdXJjZSkgYXN5bmMgewogIHRyeSB7CiAgICBpZiAodGFnID09IC0xKSB7CiAgICAgIGlmIChyZXNvdXJjZS5zY2hlbWUgPT0gJycgfHwgcmVzb3VyY2Uuc2NoZW1lID09ICdmaWxlJykgewogICAgICAgIF9maW5kUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlKTsKICAgICAgfSBlbHNlIGlmICgocmVzb3VyY2Uuc2NoZW1lID09ICdodHRwJykgfHwgKHJlc291cmNlLnNjaGVtZSA9PSAnaHR0cHMnKSkgewogICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSAucGFja2FnZXMgZmlsZSBuZXh0IHRvIHRoZSByZXNvdXJjZS4KICAgICAgICB2YXIgcGFja2FnZXNVcmkgPSByZXNvdXJjZS5yZXNvbHZlKCIucGFja2FnZXMiKTsKICAgICAgICB2YXIgZXhpc3RzID0gYXdhaXQgX2xvYWRIdHRwUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHBhY2thZ2VzVXJpKTsKICAgICAgICBpZiAoIWV4aXN0cykgewogICAgICAgICAgLy8gTG9hZGluZyBvZiB0aGUgLnBhY2thZ2VzIGZpbGUgZmFpbGVkIGZvciBodHRwL2h0dHBzIGJhc2VkIHNjcmlwdHMKICAgICAgICAgIHNwLnNlbmQoW251bGxdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3Auc2VuZCgiVW5zdXBwb3J0ZWQgc2NoZW1lIHVzZWQgdG8gbG9jYXRlIC5wYWNrYWdlcyBmaWxlOiAiCiAgICAgICAgICAgICInJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0YWcgPT0gLTIpIHsKICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgIF9sb2coIkhhbmRsaW5nIGxvYWQgb2YgcGFja2FnZXMgbWFwOiAnJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgICBpZiAocmVzb3VyY2Uuc2NoZW1lID09ICcnIHx8IHJlc291cmNlLnNjaGVtZSA9PSAnZmlsZScpIHsKICAgICAgICB2YXIgZXhpc3RzID0gYXdhaXQgbmV3IEZpbGUuZnJvbVVyaShyZXNvdXJjZSkuZXhpc3RzKCk7CiAgICAgICAgaWYgKGV4aXN0cykgewogICAgICAgICAgX2xvYWRQYWNrYWdlc0ZpbGUoc3AsIHRyYWNlTG9hZGluZywgcmVzb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzcC5zZW5kKCJQYWNrYWdlcyBmaWxlICckcmVzb3VyY2UnIG5vdCBmb3VuZC4iKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKHJlc291cmNlLnNjaGVtZSA9PSAnaHR0cCcpIHx8IChyZXNvdXJjZS5zY2hlbWUgPT0gJ2h0dHBzJykpIHsKICAgICAgICB2YXIgZXhpc3RzID0gYXdhaXQgX2xvYWRIdHRwUGFja2FnZXNGaWxlKHNwLCB0cmFjZUxvYWRpbmcsIHJlc291cmNlKTsKICAgICAgICBpZiAoIWV4aXN0cykgewogICAgICAgICAgc3Auc2VuZCgiUGFja2FnZXMgZmlsZSAnJHJlc291cmNlJyBub3QgZm91bmQuIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlc291cmNlLnNjaGVtZSA9PSAnZGF0YScpIHsKICAgICAgICBfbG9hZFBhY2thZ2VzRGF0YShzcCwgdHJhY2VMb2FkaW5nLCByZXNvdXJjZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3Auc2VuZCgiVW5rbm93biBzY2hlbWUgKCR7cmVzb3VyY2Uuc2NoZW1lfSkgZm9yIHBhY2thZ2UgZmlsZSBhdCAiCiAgICAgICAgICAgICInJHJlc291cmNlJy4iKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3Auc2VuZCgiVW5rbm93biBwYWNrYWdlcyByZXF1ZXN0IHRhZzogJHRhZyBmb3IgJyRyZXNvdXJjZScuIik7CiAgICB9CiAgfSBjYXRjaCAoZSwgcykgewogICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJFcnJvciBoYW5kbGluZyBwYWNrYWdlcyByZXF1ZXN0OiAkZVxuJHMiKTsKICAgIH0KICAgIHNwLnNlbmQoIlVuY2F1Z2h0IGVycm9yICgkZSkgaGFuZGxpbmcgcGFja2FnZXMgcmVxdWVzdC4iKTsKICB9Cn0KCi8vIFNodXRkb3duIGFsbCBhY3RpdmUgbG9hZGVycyBieSBzZW5kaW5nIGFuIGVycm9yIG1lc3NhZ2UuCnZvaWQgc2h1dGRvd25Mb2FkZXJzKCkgewogIFN0cmluZyBtZXNzYWdlID0gJ1NlcnZpY2Ugc2h1dGRvd24nOwogIGlmIChfaHR0cENsaWVudCAhPSBudWxsKSB7CiAgICBfaHR0cENsaWVudC5jbG9zZShmb3JjZTogdHJ1ZSk7CiAgICBfaHR0cENsaWVudCA9IG51bGw7CiAgfQogIGlzb2xhdGVFbWJlZGRlckRhdGEudmFsdWVzLnRvTGlzdCgpLmZvckVhY2goKGllZCkgewogICAgSXNvbGF0ZUxvYWRlclN0YXRlIGlscyA9IGllZDsKICAgIGlscy5jbGVhbnVwKCk7CiAgICBhc3NlcnQoaWxzLnNwICE9IG51bGwpOwogICAgX3NlbmRSZXNvdXJjZVJlc3BvbnNlKGlscy5zcCwgMSwgbnVsbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSk7CiAgfSk7Cn0KCi8vIFNlZSBEYXJ0X0xpYnJhcnlUYWcgaW4gZGFydF9hcGkuaApjb25zdCBfRGFydF9rQ2Fub25pY2FsaXplVXJsID0gMDsgLy8gQ2Fub25pY2FsaXplIHRoZSBVUkwuCmNvbnN0IF9EYXJ0X2tTY3JpcHRUYWcgPSAxOyAvLyBMb2FkIHRoZSByb290IHNjcmlwdC4KY29uc3QgX0RhcnRfa1NvdXJjZVRhZyA9IDI7IC8vIExvYWQgYSBwYXJ0IHNvdXJjZS4KY29uc3QgX0RhcnRfa0ltcG9ydFRhZyA9IDM7IC8vIEltcG9ydCBhIGxpYnJhcnkuCgovLyBFeHRyYSByZXF1ZXN0cy4gS2VlcCB0aGVzZSBpbiBzeW5jIGJldHdlZW4gbG9hZGVyLmRhcnQgYW5kIGJ1aWx0aW4uZGFydC4KY29uc3QgX0RhcnRfa0luaXRMb2FkZXIgPSA0OyAvLyBJbml0aWFsaXplIHRoZSBsb2FkZXIuCmNvbnN0IF9EYXJ0X2tSZXNvdXJjZUxvYWQgPSA1OyAvLyBSZXNvdXJjZSBjbGFzcyBzdXBwb3J0Lgpjb25zdCBfRGFydF9rR2V0UGFja2FnZVJvb3RVcmkgPSA2OyAvLyBVcmkgb2YgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuCmNvbnN0IF9EYXJ0X2tHZXRQYWNrYWdlQ29uZmlnVXJpID0gNzsgLy8gVXJpIG9mIHRoZSAucGFja2FnZXMgZmlsZS4KY29uc3QgX0RhcnRfa1Jlc29sdmVQYWNrYWdlVXJpID0gODsgLy8gUmVzb2x2ZSBhIHBhY2thZ2U6IHVyaS4KCi8vIEV4dHJhIHJlcXVlc3RzLiBLZWVwIHRoZXNlIGluIHN5bmMgYmV0d2VlbiBsb2FkZXIuZGFydCBhbmQgbG9hZGVyLmNjLgpjb25zdCBfRGFydF9rSW1wb3J0RXh0ZW5zaW9uID0gOTsgLy8gSW1wb3J0IGEgZGFydC1leHQ6IGZpbGUuCmNvbnN0IF9EYXJ0X2tSZXNvbHZlQXNGaWxlUGF0aCA9IDEwOyAvLyBSZXNvbHZlIHVyaSB0byBmaWxlIHBhdGguCgovLyBFeHRlcm5hbCBlbnRyeSBwb2ludCBmb3IgbG9hZGVyIHJlcXVlc3RzLgpfcHJvY2Vzc0xvYWRSZXF1ZXN0KHJlcXVlc3QpIHsKICBhc3NlcnQocmVxdWVzdCBpcyBMaXN0KTsKICBhc3NlcnQocmVxdWVzdC5sZW5ndGggPiA0KTsKCiAgLy8gU2hvdWxkIHdlIHRyYWNlIGxvYWRpbmc/CiAgYm9vbCB0cmFjZUxvYWRpbmcgPSByZXF1ZXN0WzBdOwoKICAvLyBUaGlzIGlzIHRoZSBzZW5kaW5nIGlzb2xhdGUncyBEYXJ0X0dldE1haW5Qb3J0SWQoKS4KICBpbnQgaXNvbGF0ZUlkID0gcmVxdWVzdFsxXTsKCiAgLy8gVGhlIHRhZyBkZXNjcmliaW5nIHRoZSBvcGVyYXRpb24uCiAgaW50IHRhZyA9IHJlcXVlc3RbMl07CgogIC8vIFRoZSBzZW5kIHBvcnQgdG8gc2VuZCB0aGUgcmVzcG9uc2Ugb24uCiAgU2VuZFBvcnQgc3AgPSByZXF1ZXN0WzNdOwoKICAvLyBHcmFiIHRoZSBsb2FkZXIgc3RhdGUgZm9yIHRoZSByZXF1ZXN0aW5nIGlzb2xhdGUuCiAgSXNvbGF0ZUxvYWRlclN0YXRlIGxvYWRlclN0YXRlID0gaXNvbGF0ZUVtYmVkZGVyRGF0YVtpc29sYXRlSWRdOwoKICAvLyBXZSBhcmUgZWl0aGVyIGFib3V0IHRvIGluaXRpYWxpemUgdGhlIGxvYWRlciwgb3IsIHdlIGFscmVhZHkgaGF2ZS4KICBhc3NlcnQoKHRhZyA9PSBfRGFydF9rSW5pdExvYWRlcikgfHwgKGxvYWRlclN0YXRlICE9IG51bGwpKTsKCiAgLy8gSGFuZGxlIHRoZSByZXF1ZXN0IHNwZWNpZmllZCBpbiB0aGUgdGFnLgogIHN3aXRjaCAodGFnKSB7CiAgICBjYXNlIF9EYXJ0X2tJbml0TG9hZGVyOgogICAgICB7CiAgICAgICAgU3RyaW5nIHBhY2thZ2VSb290ID0gcmVxdWVzdFs0XTsKICAgICAgICBTdHJpbmcgcGFja2FnZXNGaWxlID0gcmVxdWVzdFs1XTsKICAgICAgICBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9IHJlcXVlc3RbNl07CiAgICAgICAgU3RyaW5nIHJvb3RTY3JpcHQgPSByZXF1ZXN0WzddOwogICAgICAgIGJvb2wgaXNSZWxvYWRpbmcgPSByZXF1ZXN0WzhdOwogICAgICAgIGlmIChsb2FkZXJTdGF0ZSA9PSBudWxsKSB7CiAgICAgICAgICBsb2FkZXJTdGF0ZSA9IG5ldyBJc29sYXRlTG9hZGVyU3RhdGUoaXNvbGF0ZUlkKTsKICAgICAgICAgIGlzb2xhdGVFbWJlZGRlckRhdGFbaXNvbGF0ZUlkXSA9IGxvYWRlclN0YXRlOwogICAgICAgICAgbG9hZGVyU3RhdGUuaW5pdCgKICAgICAgICAgICAgICBwYWNrYWdlUm9vdCwgcGFja2FnZXNGaWxlLCB3b3JraW5nRGlyZWN0b3J5LCByb290U2NyaXB0KTsKICAgICAgICB9IGVsc2UgaWYgKGlzUmVsb2FkaW5nKSB7CiAgICAgICAgICBsb2FkZXJTdGF0ZS51cGRhdGVQYWNrYWdlTWFwKHBhY2thZ2VzRmlsZSk7CiAgICAgICAgfQogICAgICAgIGxvYWRlclN0YXRlLnNwID0gc3A7CiAgICAgICAgYXNzZXJ0KGlzb2xhdGVFbWJlZGRlckRhdGFbaXNvbGF0ZUlkXSA9PSBsb2FkZXJTdGF0ZSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIF9EYXJ0X2tSZXNvdXJjZUxvYWQ6CiAgICAgIHsKICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHJlcXVlc3RbNF0pOwogICAgICAgIF9oYW5kbGVSZXNvdXJjZVJlcXVlc3QoCiAgICAgICAgICAgIGxvYWRlclN0YXRlLCBzcCwgdHJhY2VMb2FkaW5nLCB0YWcsIHVyaSwgdXJpLCBudWxsKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgX0RhcnRfa0dldFBhY2thZ2VSb290VXJpOgogICAgICBsb2FkZXJTdGF0ZS5fdHJpZ2dlclBhY2thZ2VSZXNvbHV0aW9uKCgpIHsKICAgICAgICAvLyBUaGUgcGFja2FnZSByb290IGlzIGRlcHJlY2F0ZWQgYW5kIG5vdyBhbHdheXMgcmV0dXJucyBudWxsLgogICAgICAgIHNwLnNlbmQobnVsbCk7CiAgICAgIH0pOwogICAgICBicmVhazsKICAgIGNhc2UgX0RhcnRfa0dldFBhY2thZ2VDb25maWdVcmk6CiAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgIC8vIFJlc3BvbmQgd2l0aCB0aGUgcGFja2FnZXMgY29uZmlnIChpZiBhbnkpIGFmdGVyIHBhY2thZ2UgcmVzb2x1dGlvbi4KICAgICAgICBzcC5zZW5kKGxvYWRlclN0YXRlLl9wYWNrYWdlQ29uZmlnKTsKICAgICAgfSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBfRGFydF9rUmVzb2x2ZVBhY2thZ2VVcmk6CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocmVxdWVzdFs0XSk7CiAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgIC8vIFJlc3BvbmQgd2l0aCB0aGUgcmVzb2x2ZWQgcGFja2FnZSB1cmkgYWZ0ZXIgcGFja2FnZSByZXNvbHV0aW9uLgogICAgICAgIFVyaSByZXNvbHZlZFVyaTsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fcmVzb2x2ZVBhY2thZ2VVcmkodXJpKTsKICAgICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgICAgIF9sb2coIkV4Y2VwdGlvbiAoJGUpIHdoZW4gcmVzb2x2aW5nIHBhY2thZ2UgVVJJOiAkdXJpIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXNvbHZlZFVyaSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHNwLnNlbmQocmVzb2x2ZWRVcmkpOwogICAgICB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIF9EYXJ0X2tJbXBvcnRFeHRlbnNpb246CiAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UocmVxdWVzdFs0XSk7CiAgICAgIFN0cmluZyBsaWJyYXJ5VXJpID0gcmVxdWVzdFs1XTsKICAgICAgLy8gU3RyaXAgYW55IGZpbGVuYW1lIG9mZiBvZiB0aGUgbGlicmFyeVVyaSdzIHBhdGguCiAgICAgIGludCBpbmRleCA9IGxpYnJhcnlVcmkubGFzdEluZGV4T2YoJy8nKTsKICAgICAgdmFyIHBhdGg7CiAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgIHBhdGggPSAnLi8nOwogICAgICB9IGVsc2UgewogICAgICAgIHBhdGggPSBsaWJyYXJ5VXJpLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwogICAgICB9CiAgICAgIHZhciBwYXRoVXJpID0gVXJpLnBhcnNlKHBhdGgpOwogICAgICBzd2l0Y2ggKHBhdGhVcmkuc2NoZW1lKSB7CiAgICAgICAgY2FzZSAnJzoKICAgICAgICBjYXNlICdmaWxlJzoKICAgICAgICAgIF9zZW5kRXh0ZW5zaW9uSW1wb3J0UmVzcG9uc2UoCiAgICAgICAgICAgICAgc3AsIHVyaSwgbGlicmFyeVVyaSwgcGF0aFVyaS50b0ZpbGVQYXRoKCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZGF0YSc6CiAgICAgICAgY2FzZSAnaHR0cCc6CiAgICAgICAgY2FzZSAnaHR0cHMnOgogICAgICAgICAgX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZShzcCwgdXJpLCBsaWJyYXJ5VXJpLCBwYXRoVXJpLnRvU3RyaW5nKCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncGFja2FnZSc6CiAgICAgICAgICAvLyBTdGFydCBwYWNrYWdlIHJlc29sdXRpb24uCiAgICAgICAgICBsb2FkZXJTdGF0ZS5fdHJpZ2dlclBhY2thZ2VSZXNvbHV0aW9uKCgpIHsKICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmaW5kIHRoZSBmdWxseSByZXNvbHZlZCB1cmkgb2YgW3BhdGhdLgogICAgICAgICAgICBVcmkgcmVzb2x2ZWRVcmk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fcmVzb2x2ZVBhY2thZ2VVcmkocGF0aFVyaSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICAgICAgICBpZiAodHJhY2VMb2FkaW5nKSB7CiAgICAgICAgICAgICAgICBfbG9nKCJFeGNlcHRpb24gKCRlKSB3aGVuIHJlc29sdmluZyBwYWNrYWdlIFVSSTogJHVyaSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXNvbHZlZFVyaSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZSgKICAgICAgICAgICAgICAgIHNwLCB1cmksIGxpYnJhcnlVcmksIHJlc29sdmVkVXJpLnRvU3RyaW5nKCkpOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHRyYWNlTG9hZGluZykgewogICAgICAgICAgICBfbG9nKCdVbmtub3duIHNjaGVtZSAoJHtwYXRoVXJpLnNjaGVtZX0pIGluICRwYXRoVXJpLicpOwogICAgICAgICAgfQogICAgICAgICAgX3NlbmRFeHRlbnNpb25JbXBvcnRSZXNwb25zZShzcCwgdXJpLCBsaWJyYXJ5VXJpLCBudWxsKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBfRGFydF9rUmVzb2x2ZUFzRmlsZVBhdGg6CiAgICAgIGxvYWRlclN0YXRlLl90cmlnZ2VyUGFja2FnZVJlc29sdXRpb24oKCkgewogICAgICAgIFN0cmluZyB1cmkgPSByZXF1ZXN0WzRdOwogICAgICAgIFVyaSByZXNvbHZlZFVyaSA9IFVyaS5wYXJzZShfc2FuaXRpemVXaW5kb3dzUGF0aCh1cmkpKTsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAncGFja2FnZScpIHsKICAgICAgICAgICAgcmVzb2x2ZWRVcmkgPSBsb2FkZXJTdGF0ZS5fcmVzb2x2ZVBhY2thZ2VVcmkocmVzb2x2ZWRVcmkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc29sdmVkVXJpLnNjaGVtZSA9PSAnJyB8fCByZXNvbHZlZFVyaS5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgIHJlc29sdmVk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HggpIEEIDSMxRxcKDSUxTy0KDSMnMUsZDj0ZHkUMHgoeCg0hJyY6LxAZFQ8zCCUgERUoOhEVFRZRERgnNUEdEkUdIkkQIg4qPg4RER5FDEMRCA0jMSFADjFHDEpRIxoaLRsvGhNPJQwWIRkYKxkhGAoKDQ0/BAIBHWRhcnQ6dm1zZXJ2aWNlX2lvL2xvYWRlci5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi92bXNlcnZpY2Uvdm1zZXJ2aWNlLmRhcnTAAFHzLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCmxpYnJhcnkgZGFydC5fdm1zZXJ2aWNlOwoKaW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwppbXBvcnQgJ2RhcnQ6Y29udmVydCc7CmltcG9ydCAnZGFydDppc29sYXRlJzsKaW1wb3J0ICdkYXJ0Om1hdGgnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgpwYXJ0ICdhc3NldC5kYXJ0JzsKcGFydCAnY2xpZW50LmRhcnQnOwpwYXJ0ICdkZXZmcy5kYXJ0JzsKcGFydCAnY29uc3RhbnRzLmRhcnQnOwpwYXJ0ICdydW5uaW5nX2lzb2xhdGUuZGFydCc7CnBhcnQgJ3J1bm5pbmdfaXNvbGF0ZXMuZGFydCc7CnBhcnQgJ21lc3NhZ2UuZGFydCc7CnBhcnQgJ21lc3NhZ2Vfcm91dGVyLmRhcnQnOwpwYXJ0ICduYW1lZF9sb29rdXAuZGFydCc7CgpmaW5hbCBSYXdSZWNlaXZlUG9ydCBpc29sYXRlQ29udHJvbFBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKZmluYWwgUmF3UmVjZWl2ZVBvcnQgc2NyaXB0TG9hZFBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKCmFic3RyYWN0IGNsYXNzIElzb2xhdGVFbWJlZGRlckRhdGEgewogIHZvaWQgY2xlYW51cCgpOwp9CgpTdHJpbmcgX21ha2VBdXRoVG9rZW4oKSB7CiAgZmluYWwga1Rva2VuQnl0ZVNpemUgPSA4OwogIFVpbnQ4TGlzdCBieXRlcyA9IG5ldyBVaW50OExpc3Qoa1Rva2VuQnl0ZVNpemUpOwogIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tLnNlY3VyZSgpOwogIGZvciAoaW50IGkgPSAwOyBpIDwga1Rva2VuQnl0ZVNpemU7IGkrKykgewogICAgYnl0ZXNbaV0gPSByYW5kb20ubmV4dEludCgyNTYpOwogIH0KICByZXR1cm4gYmFzZTY0VXJsLmVuY29kZShieXRlcyk7Cn0KCi8vIFRoZSByYW5kb21seSBnZW5lcmF0ZWQgYXV0aCB0b2tlbiB1c2VkIHRvIGFjY2VzcyB0aGUgVk0gc2VydmljZS4KZmluYWwgU3RyaW5nIHNlcnZpY2VBdXRoVG9rZW4gPSBfbWFrZUF1dGhUb2tlbigpOwoKLy8gVGhpcyBpcyBmb3IgdXNlIGJ5IHRoZSBlbWJlZGRlci4gSXQgaXMgYSBtYXAgZnJvbSB0aGUgaXNvbGF0ZUlkIHRvCi8vIGFueXRoaW5nIGltcGxlbWVudGluZyBJc29sYXRlRW1iZWRkZXJEYXRhLiBXaGVuIGFuIGlzb2xhdGUgZ29lcyBhd2F5LAovLyB0aGUgY2xlYW51cCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGFmdGVyIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgpmaW5hbCBNYXA8aW50LCBJc29sYXRlRW1iZWRkZXJEYXRhPiBpc29sYXRlRW1iZWRkZXJEYXRhID0KICAgIG5ldyBNYXA8aW50LCBJc29sYXRlRW1iZWRkZXJEYXRhPigpOwoKLy8gVGhlc2UgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZGVjbGFyYXRpb25zIGluIHZtL2pzb25fc3RyZWFtLmguCmNvbnN0IGtQYXJzZUVycm9yID0gLTMyNzAwOwpjb25zdCBrSW52YWxpZFJlcXVlc3QgPSAtMzI2MDA7CmNvbnN0IGtNZXRob2ROb3RGb3VuZCA9IC0zMjYwMTsKY29uc3Qga0ludmFsaWRQYXJhbXMgPSAtMzI2MDI7CmNvbnN0IGtJbnRlcm5hbEVycm9yID0gLTMyNjAzOwoKY29uc3Qga0V4dGVuc2lvbkVycm9yID0gLTMyMDAwOwoKY29uc3Qga0ZlYXR1cmVEaXNhYmxlZCA9IDEwMDsKY29uc3Qga0Nhbm5vdEFkZEJyZWFrcG9pbnQgPSAxMDI7CmNvbnN0IGtTdHJlYW1BbHJlYWR5U3Vic2NyaWJlZCA9IDEwMzsKY29uc3Qga1N0cmVhbU5vdFN1YnNjcmliZWQgPSAxMDQ7CmNvbnN0IGtJc29sYXRlTXVzdEJlUnVubmFibGUgPSAxMDU7CmNvbnN0IGtJc29sYXRlTXVzdEJlUGF1c2VkID0gMTA2Owpjb25zdCBrQ2Fubm90UmVzdW1lID0gMTA3Owpjb25zdCBrSXNvbGF0ZUlzUmVsb2FkaW5nID0gMTA4Owpjb25zdCBrSXNvbGF0ZVJlbG9hZEJhcnJlZCA9IDEwOTsKY29uc3Qga0lzb2xhdGVNdXN0SGF2ZVJlbG9hZGVkID0gMTEwOwpjb25zdCBrU2VydmljZUFscmVhZHlSZWdpc3RlcmVkID0gMTExOwpjb25zdCBrU2VydmljZURpc2FwcGVhcmVkID0gMTEyOwpjb25zdCBrRXhwcmVzc2lvbkNvbXBpbGF0aW9uRXJyb3IgPSAxMTM7CgovLyBFeHBlcmltZW50YWwgKHVzZWQgaW4gcHJpdmF0ZSBycGNzKS4KY29uc3Qga0ZpbGVTeXN0ZW1BbHJlYWR5RXhpc3RzID0gMTAwMTsKY29uc3Qga0ZpbGVTeXN0ZW1Eb2VzTm90RXhpc3QgPSAxMDAyOwpjb25zdCBrRmlsZURvZXNOb3RFeGlzdCA9IDEwMDM7Cgp2YXIgX2Vycm9yTWVzc2FnZXMgPSB7CiAga0ludmFsaWRQYXJhbXM6ICdJbnZhbGlkIHBhcmFtcycsCiAga0ludGVybmFsRXJyb3I6ICdJbnRlcm5hbCBlcnJvcicsCiAga0ZlYXR1cmVEaXNhYmxlZDogJ0ZlYXR1cmUgaXMgZGlzYWJsZWQnLAogIGtTdHJlYW1BbHJlYWR5U3Vic2NyaWJlZDogJ1N0cmVhbSBhbHJlYWR5IHN1YnNjcmliZWQnLAogIGtTdHJlYW1Ob3RTdWJzY3JpYmVkOiAnU3RyZWFtIG5vdCBzdWJzY3JpYmVkJywKICBrRmlsZVN5c3RlbUFscmVhZHlFeGlzdHM6ICdGaWxlIHN5c3RlbSBhbHJlYWR5IGV4aXN0cycsCiAga0ZpbGVTeXN0ZW1Eb2VzTm90RXhpc3Q6ICdGaWxlIHN5c3RlbSBkb2VzIG5vdCBleGlzdCcsCiAga0ZpbGVEb2VzTm90RXhpc3Q6ICdGaWxlIGRvZXMgbm90IGV4aXN0JywKICBrU2VydmljZUFscmVhZHlSZWdpc3RlcmVkOiAnU2VydmljZSBhbHJlYWR5IHJlZ2lzdGVyZWQnLAogIGtTZXJ2aWNlRGlzYXBwZWFyZWQ6ICdTZXJ2aWNlIGhhcyBkaXNhcHBlYXJlZCcsCiAga0V4cHJlc3Npb25Db21waWxhdGlvbkVycm9yOiAnRXhwcmVzc2lvbiBjb21waWxhdGlvbiBlcnJvcicsCn07CgpTdHJpbmcgZW5jb2RlUnBjRXJyb3IoTWVzc2FnZSBtZXNzYWdlLCBpbnQgY29kZSwge1N0cmluZyBkZXRhaWxzfSkgewogIHZhciByZXNwb25zZSA9IHsKICAgICdqc29ucnBjJzogJzIuMCcsCiAgICAnaWQnOiBtZXNzYWdlLnNlcmlhbCwKICAgICdlcnJvcic6IHsKICAgICAgJ2NvZGUnOiBjb2RlLAogICAgICAnbWVzc2FnZSc6IF9lcnJvck1lc3NhZ2VzW2NvZGVdLAogICAgfSwKICB9OwogIGlmIChkZXRhaWxzICE9IG51bGwpIHsKICAgIHJlc3BvbnNlWydlcnJvciddWydkYXRhJ10gPSB7CiAgICAgICdkZXRhaWxzJzogZGV0YWlscywKICAgIH07CiAgfQogIHJldHVybiBqc29uLmVuY29kZShyZXNwb25zZSk7Cn0KClN0cmluZyBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBwYXJhbSkgewogIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrSW52YWxpZFBhcmFtcywKICAgICAgZGV0YWlsczogIiR7bWVzc2FnZS5tZXRob2R9IGV4cGVjdHMgdGhlICcke3BhcmFtfScgcGFyYW1ldGVyIik7Cn0KClN0cmluZyBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBwYXJhbSkgewogIHZhciB2YWx1ZSA9IG1lc3NhZ2UucGFyYW1zW3BhcmFtXTsKICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ludmFsaWRQYXJhbXMsCiAgICAgIGRldGFpbHM6ICIke21lc3NhZ2UubWV0aG9kfTogaW52YWxpZCAnJHtwYXJhbX0nIHBhcmFtZXRlcjogJHt2YWx1ZX0iKTsKfQoKU3RyaW5nIGVuY29kZUNvbXBpbGF0aW9uRXJyb3IoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgZGlhZ25vc3RpYykgewogIHJldHVybiBlbmNvZGVScGNFcnJvcihtZXNzYWdlLCBrRXhwcmVzc2lvbkNvbXBpbGF0aW9uRXJyb3IsCiAgICAgIGRldGFpbHM6IGRpYWdub3N0aWMpOwp9CgpTdHJpbmcgZW5jb2RlUmVzdWx0KE1lc3NhZ2UgbWVzc2FnZSwgTWFwIHJlc3VsdCkgewogIHZhciByZXNwb25zZSA9IHsKICAgICdqc29ucnBjJzogJzIuMCcsCiAgICAnaWQnOiBtZXNzYWdlLnNlcmlhbCwKICAgICdyZXN1bHQnOiByZXN1bHQsCiAgfTsKICByZXR1cm4ganNvbi5lbmNvZGUocmVzcG9uc2UpOwp9CgpTdHJpbmcgZW5jb2RlU3VjY2VzcyhNZXNzYWdlIG1lc3NhZ2UpIHsKICByZXR1cm4gZW5jb2RlUmVzdWx0KG1lc3NhZ2UsIHsndHlwZSc6ICdTdWNjZXNzJ30pOwp9Cgpjb25zdCBzaG9ydERlbGF5ID0gY29uc3QgRHVyYXRpb24obWlsbGlzZWNvbmRzOiAxMCk7CgovLy8gQ2FsbGVkIHdoZW4gdGhlIHNlcnZlciBzaG91bGQgYmUgc3RhcnRlZC4KdHlwZWRlZiBGdXR1cmUgU2VydmVyU3RhcnRDYWxsYmFjaygpOwoKLy8vIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHN0b3BwZWQuCnR5cGVkZWYgRnV0dXJlIFNlcnZlclN0b3BDYWxsYmFjaygpOwoKLy8vIENhbGxlZCB3aGVuIHRoZSBzZXJ2aWNlIGlzIGV4aXRpbmcuCnR5cGVkZWYgRnV0dXJlIENsZWFudXBDYWxsYmFjaygpOwoKLy8vIENhbGxlZCB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5CnR5cGVkZWYgRnV0dXJlPFVyaT4gQ3JlYXRlVGVtcERpckNhbGxiYWNrKFN0cmluZyBiYXNlKTsKCi8vLyBDYWxsZWQgdG8gZGVsZXRlIGEgZGlyZWN0b3J5CnR5cGVkZWYgRnV0dXJlIERlbGV0ZURpckNhbGxiYWNrKFVyaSBwYXRoKTsKCi8vLyBDYWxsZWQgdG8gd3JpdGUgYSBmaWxlLgp0eXBlZGVmIEZ1dHVyZSBXcml0ZUZpbGVDYWxsYmFjayhVcmkgcGF0aCwgTGlzdDxpbnQ+IGJ5dGVzKTsKCi8vLyBDYWxsZWQgdG8gd3JpdGUgYSBzdHJlYW0gaW50byBhIGZpbGUuCnR5cGVkZWYgRnV0dXJlIFdyaXRlU3RyZWFtRmlsZUNhbGxiYWNrKFVyaSBwYXRoLCBTdHJlYW08TGlzdDxpbnQ+PiBieXRlcyk7CgovLy8gQ2FsbGVkIHRvIHJlYWQgYSBmaWxlLgp0eXBlZGVmIEZ1dHVyZTxMaXN0PGludD4+IFJlYWRGaWxlQ2FsbGJhY2soVXJpIHBhdGgpOwoKLy8vIENhbGxlZCB0byBsaXN0IGFsbCBmaWxlcyB1bmRlciBzb21lIHBhdGguCnR5cGVkZWYgRnV0dXJlPExpc3Q8TWFwPFN0cmluZywgZHluYW1pYz4+PiBMaXN0RmlsZXNDYWxsYmFjayhVcmkgcGF0aCk7CgovLy8gQ2FsbGVkIHdoZW4gd2UgbmVlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyLgp0eXBlZGVmIEZ1dHVyZTxVcmk+IFNlcnZlckluZm9ybWFtZXNzYWdlX3JvdXRlcnRpb25DYWxsYmFjaygpOwoKLy8vIENhbGxlZCB3aGVuIHdlIG5lZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZlci4KdHlwZWRlZiBGdXR1cmU8VXJpPiBTZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrKCk7CgovLy8gQ2FsbGVkIHdoZW4gd2Ugd2FudCB0byBbZW5hYmxlXSBvciBkaXNhYmxlIHRoZSB3ZWIgc2VydmVyLgp0eXBlZGVmIEZ1dHVyZTxVcmk+IFdlYlNlcnZlckNvbnRyb2xDYWxsYmFjayhib29sIGVuYWJsZSk7CgovLy8gSG9va3MgdGhhdCBhcmUgc2V0dXAgYnkgdGhlIGVtYmVkZGVyLgpjbGFzcyBWTVNlcnZpY2VFbWJlZGRlckhvb2tzIHsKICBzdGF0aWMgU2VydmVyU3RhcnRDYWxsYmFjayBzZXJ2ZXJTdGFydDsKICBzdGF0aWMgU2VydmVyU3RvcENhbGxiYWNrIHNlcnZlclN0b3A7CiAgc3RhdGljIENsZWFudXBDYWxsYmFjayBjbGVhbnVwOwogIHN0YXRpYyBDcmVhdGVUZW1wRGlyQ2FsbGJhY2sgY3JlYXRlVGVtcERpcjsKICBzdGF0aWMgRGVsZXRlRGlyQ2FsbGJhY2sgZGVsZXRlRGlyOwogIHN0YXRpYyBXcml0ZUZpbGVDYWxsYmFjayB3cml0ZUZpbGU7CiAgc3RhdGljIFdyaXRlU3RyZWFtRmlsZUNhbGxiYWNrIHdyaXRlU3RyZWFtRmlsZTsKICBzdGF0aWMgUmVhZEZpbGVDYWxsYmFjayByZWFkRmlsZTsKICBzdGF0aWMgTGlzdEZpbGVzQ2FsbGJhY2sgbGlzdEZpbGVzOwogIHN0YXRpYyBTZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrIHNlcnZlckluZm9ybWF0aW9uOwogIHN0YXRpYyBXZWJTZXJ2ZXJDb250cm9sQ2FsbGJhY2sgd2ViU2VydmVyQ29udHJvbDsKfQoKY2xhc3MgVk1TZXJ2aWNlIGV4dGVuZHMgTWVzc2FnZVJvdXRlciB7CiAgc3RhdGljIFZNU2VydmljZSBfaW5zdGFuY2U7CgogIHN0YXRpYyBjb25zdCBzZXJ2aWNlTmFtZXNwYWNlID0gJ3MnOwoKICAvLy8gQ29sbGVjdGlvbiBvZiBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMuCiAgZmluYWwgTmFtZWRMb29rdXA8Q2xpZW50PiBjbGllbnRzID0KICAgICAgbmV3IE5hbWVkTG9va3VwPENsaWVudD4ocHJvbG9ndWU6IHNlcnZpY2VOYW1lc3BhY2UpOwogIGZpbmFsIElkR2VuZXJhdG9yIF9zZXJ2aWNlUmVxdWVzdHMgPSBuZXcgSWRHZW5lcmF0b3IocHJvbG9ndWU6ICdzcicpOwoKICAvLy8gQ29sbGVjdGlvbiBvZiBjdXJyZW50bHkgcnVubmluZyBpc29sYXRlcy4KICBSdW5uaW5nSXNvbGF0ZXMgcnVubmluZ0lzb2xhdGVzID0gbmV3IFJ1bm5pbmdJc29sYXRlcygpOwoKICAvLy8gRmxhZyB0byBpbmRpY2F0ZSBWTSBzZXJ2aWNlIGlzIGV4aXRpbmcuCiAgYm9vbCBpc0V4aXRpbmcgPSBmYWxzZTsKCiAgLy8vIEEgcG9ydCB1c2VkIHRvIHJlY2VpdmUgZXZlbnRzIGZyb20gdGhlIFZNLgogIGZpbmFsIFJhd1JlY2VpdmVQb3J0IGV2ZW50UG9ydDsKCiAgZmluYWwgZGV2ZnMgPSBuZXcgRGV2RlMoKTsKCiAgdm9pZCBfYWRkQ2xpZW50KENsaWVudCBjbGllbnQpIHsKICAgIGFzc2VydChjbGllbnQuc3RyZWFtcy5pc0VtcHR5KTsKICAgIGFzc2VydChjbGllbnQuc2VydmljZXMuaXNFbXB0eSk7CiAgICBjbGllbnRzLmFkZChjbGllbnQpOwogIH0KCiAgdm9pZCBfcmVtb3ZlQ2xpZW50KENsaWVudCBjbGllbnQpIHsKICAgIGZpbmFsIG5hbWVzcGFjZSA9IGNsaWVudHMua2V5T2YoY2xpZW50KTsKICAgIGNsaWVudHMucmVtb3ZlKGNsaWVudCk7CiAgICBmb3IgKHZhciBzdHJlYW1JZCBpbiBjbGllbnQuc3RyZWFtcykgewogICAgICBpZiAoIV9pc0FueUNsaWVudFN1YnNjcmliZWQoc3RyZWFtSWQpKSB7CiAgICAgICAgX3ZtQ2FuY2VsU3RyZWFtKHN0cmVhbUlkKTsKICAgICAgfQogICAgfQogICAgZm9yICh2YXIgc2VydmljZSBpbiBjbGllbnQuc2VydmljZXMua2V5cykgewogICAgICBfZXZlbnRNZXNzYWdlSGFuZGxlcigKICAgICAgICAgICdfU2VydmljZScsCiAgICAgICAgICBuZXcgUmVzcG9uc2UuanNvbih7CiAgICAgICAgICAgICdqc29ucnBjJzogJzIuMCcsCiAgICAgICAgICAgICdtZXRob2QnOiAnc3RyZWFtTm90aWZ5JywKICAgICAgICAgICAgJ3BhcmFtcyc6IHsKICAgICAgICAgICAgICAnc3RyZWFtSWQnOiAnX1NlcnZpY2UnLAogICAgICAgICAgICAgICdldmVudCc6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIkV2ZW50IiwKICAgICAgICAgICAgICAgICJraW5kIjogIlNlcnZpY2VVbnJlZ2lzdGVyZWQiLAogICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCc6IG5ldyBEYXRlVGltZS5ub3coKS5taWxsaXNlY29uZHNTaW5jZUVwb2NoLAogICAgICAgICAgICAgICAgJ3NlcnZpY2UnOiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgJ21ldGhvZCc6IG5hbWVzcGFjZSArICcuJyArIHNlcnZpY2UsCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICB9CiAgICAvLyBDb21wbGV0ZSBhbGwgcmVxdWVzdHMgYXMgZmFpbGVkCiAgICBmb3IgKHZhciBoYW5kbGUgaW4gY2xpZW50LnNlcnZpY2VIYW5kbGVzLnZhbHVlcykgewogICAgICBoYW5kbGUobnVsbCk7CiAgICB9CiAgfQoKICB2b2lkIF9ldmVudE1lc3NhZ2VIYW5kbGVyKFN0cmluZyBzdHJlYW1JZCwgUmVzcG9uc2UgZXZlbnQpIHsKICAgIGZvciAodmFyIGNsaWVudCBpbiBjbGllbnRzKSB7CiAgICAgIGlmIChjbGllbnQuc2VuZEV2ZW50cyAmJiBjbGllbnQuc3RyZWFtcy5jb250YWlucyhzdHJlYW1JZCkpIHsKICAgICAgICBjbGllbnQucG9zdChldmVudCk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX2NvbnRyb2xNZXNzYWdlSGFuZGxlcihpbnQgY29kZSwgaW50IHBvcnRJZCwgU2VuZFBvcnQgc3AsIFN0cmluZyBuYW1lKSB7CiAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgY2FzZSBDb25zdGFudHMuSVNPTEFURV9TVEFSVFVQX01FU1NBR0VfSUQ6CiAgICAgICAgcnVubmluZ0lzb2xhdGVzLmlzb2xhdGVTdGFydHVwKHBvcnRJZCwgc3AsIG5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENvbnN0YW50cy5JU09MQVRFX1NIVVRET1dOX01FU1NBR0VfSUQ6CiAgICAgICAgcnVubmluZ0lzb2xhdGVzLmlzb2xhdGVTaHV0ZG93bihwb3J0SWQsIHNwKTsKICAgICAgICBJc29sYXRlRW1iZWRkZXJEYXRhIGllZCA9IGlzb2xhdGVFbWJlZGRlckRhdGEucmVtb3ZlKHBvcnRJZCk7CiAgICAgICAgaWYgKGllZCAhPSBudWxsKSB7CiAgICAgICAgICBpZWQuY2xlYW51cCgpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICB9CgogIEZ1dHVyZTxOdWxsPiBfc2VydmVyTWVzc2FnZUhhbmRsZXIoaW50IGNvZGUsIFNlbmRQb3J0IHNwLCBib29sIGVuYWJsZSkgYXN5bmMgewogICAgc3dpdGNoIChjb2RlKSB7CiAgICAgIGNhc2UgQ29uc3RhbnRzLldFQl9TRVJWRVJfQ09OVFJPTF9NRVNTQUdFX0lEOgogICAgICAgIGlmIChWTVNlcnZpY2VFbWJlZGRlckhvb2tzLndlYlNlcnZlckNvbnRyb2wgPT0gbnVsbCkgewogICAgICAgICAgc3Auc2VuZChudWxsKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgVXJpIHVyaSA9IGF3YWl0IFZNU2VydmljZUVtYmVkZGVySG9va3Mud2ViU2VydmVyQ29udHJvbChlbmFibGUpOwogICAgICAgIHNwLnNlbmQodXJpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDb25zdGFudHMuU0VSVkVSX0lORk9fTUVTU0FHRV9JRDoKICAgICAgICBpZiAoVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5zZXJ2ZXJJbmZvcm1hdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICBzcC5zZW5kKG51bGwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBVcmkgdXJpID0gYXdhaXQgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5zZXJ2ZXJJbmZvcm1hdGlvbigpOwogICAgICAgIHNwLnNlbmQodXJpKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIEZ1dHVyZTxOdWxsPiBfaGFuZGxlTmF0aXZlUnBjQ2FsbChtZXNzYWdlLCBTZW5kUG9ydCByZXBseVBvcnQpIGFzeW5jIHsKICAgIC8vIEtlZXAgaW4gc3luYyB3aXRoICJydW50aW1lL3ZtL3NlcnZpY2VfaXNvbGF0ZS5jYzpJbnZva2VTZXJ2aWNlUnBjIi4KICAgIFJlc3BvbnNlIHJlc3BvbnNlOwoKICAgIHRyeSB7CiAgICAgIGZpbmFsIE1lc3NhZ2UgcnBjID0gbmV3IE1lc3NhZ2UuZnJvbUpzb25ScGMoCiAgICAgICAgICBudWxsLCBqc29uLmRlY29kZSh1dGY4LmRlY29kZShtZXNzYWdlIGFzIExpc3Q8aW50PikpKTsKICAgICAgaWYgKHJwYy50eXBlICE9IE1lc3NhZ2VUeXBlLlJlcXVlc3QpIHsKICAgICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZS5pbnRlcm5hbEVycm9yKAogICAgICAgICAgICAnVGhlIGNsaWVudCBzZW50IGEgbm9uLXJlcXVlc3QganNvbi1ycGMgbWVzc2FnZS4nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXNwb25zZSA9IGF3YWl0IHJvdXRlUmVxdWVzdCh0aGlzLCBycGMpOwogICAgICB9CiAgICB9IGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UuaW50ZXJuYWxFcnJvcigKICAgICAgICAgICdUaGUgcnBjIGNhbGwgcmVzdWx0ZWQgaW4gZXhjZXB0aW9uOiAkZXhjZXB0aW9uLicpOwogICAgfQogICAgTGlzdDxpbnQ+IGJ5dGVzOwogICAgc3dpdGNoIChyZXNwb25zZS5raW5kKSB7CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5TdHJpbmc6CiAgICAgICAgYnl0ZXMgPSB1dGY4LmVuY29kZShyZXNwb25zZS5wYXlsb2FkKTsKICAgICAgICBieXRlcyA9IGJ5dGVzIGlzIFVpbnQ4TGlzdCA/IGJ5dGVzIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChieXRlcyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5CaW5hcnk6CiAgICAgIGNhc2UgUmVzcG9uc2VQYXlsb2FkS2luZC5VdGY4U3RyaW5nOgogICAgICAgIGJ5dGVzID0gcmVzcG9uc2UucGF5bG9hZCBhcyBVaW50OExpc3Q7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXBseVBvcnQuc2VuZChieXRlcyk7CiAgfQoKICBGdXR1cmUgX2V4aXQoKSBhc3luYyB7CiAgICBpc0V4aXRpbmcgPSB0cnVlOwoKICAgIC8vIFN0b3AgdGhlIHNlcnZlci4KICAgIGlmIChWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnNlcnZlclN0b3AgIT0gbnVsbCkgewogICAgICBhd2FpdCBWTVNlcnZpY2VFbWJlZGRlckhvb2tzLnNlcnZlclN0b3AoKTsKICAgIH0KCiAgICAvLyBDbG9zZSByZWNlaXZlIHBvcnRzLgogICAgaXNvbGF0ZUNvbnRyb2xQb3J0LmNsb3NlKCk7CiAgICBzY3JpcHRMb2FkUG9ydC5jbG9zZSgpOwoKICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHNldCBhcyBhIGxpc3QgYmVjYXVzZSBjbGllbnQuZGlzY29ubmVjdCgpIHdpbGwKICAgIC8vIGFsdGVyIHRoZSBjb25uZWN0ZWQgY2xpZW50cyBzZXQuCiAgICB2YXIgY2xpZW50c0xpc3QgPSBjbGllbnRzLnRvTGlzdCgpOwogICAgZm9yICh2YXIgY2xpZW50IGluIGNsaWVudHNMaXN0KSB7CiAgICAgIGNsaWVudC5kaXNjb25uZWN0KCk7CiAgICB9CiAgICBkZXZmcy5jbGVhbnVwKCk7CiAgICBpZiAoVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5jbGVhbnVwICE9IG51bGwpIHsKICAgICAgYXdhaXQgVk1TZXJ2aWNlRW1iZWRkZXJIb29rcy5jbGVhbnVwKCk7CiAgICB9CgogICAgLy8gTm90aWZ5IHRoZSBWTSB0aGF0IHdlIGhhdmUgZXhpdGVkLgogICAgX29uRXhpdCgpOwogIH0KCiAgdm9pZCBtZXNzYWdlSGFuZGxlcihtZXNzYWdlKSB7CiAgICBpZiAobWVzc2FnZSBpcyBMaXN0KSB7CiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhbiBldmVudC4KICAgICAgICBfZXZlbnRNZXNzYWdlSGFuZGxlcihtZXNzYWdlWzBdLCBuZXcgUmVzcG9uc2UuZnJvbShtZXNzYWdlWzFdKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnRyb2wgbWVzc2FnZSBkaXJlY3RpbmcgdGhlIHZtIHNlcnZpY2UgdG8gZXhpdC4KICAgICAgICBhc3NlcnQobWVzc2FnZVswXSA9PSBDb25zdGFudHMuU0VSVklDRV9FWElUX01FU1NBR0VfSUQpOwogICAgICAgIF9leGl0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgZmluYWwgb3Bjb2RlID0gbWVzc2FnZVswXTsKICAgICAgICBpZiAob3Bjb2RlID09IENvbnN0YW50cy5NRVRIT0RfQ0FMTF9GUk9NX05BVElWRSkgewogICAgICAgICAgX2hhbmRsZU5hdGl2ZVJwY0NhbGwobWVzc2FnZVsxXSwgbWVzc2FnZVsyXSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRoaXMgaXMgYSBtZXNzYWdlIGludGVyYWN0aW5nIHdpdGggdGhlIHdlYiBzZXJ2ZXIuCiAgICAgICAgICBhc3NlcnQoKG9wY29kZSA9PSBDb25zdGFudHMuV0VCX1NFUlZFUl9DT05UUk9MX01FU1NBR0VfSUQpIHx8CiAgICAgICAgICAgICAgKG9wY29kZSA9PSBDb25zdGFudHMuU0VSVkVSX0lORk9fTUVTU0FHRV9JRCkpOwogICAgICAgICAgX3NlcnZlck1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2VbMF0sIG1lc3NhZ2VbMV0sIG1lc3NhZ2VbMl0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobWVzc2FnZS5sZW5ndGggPT0gNCkgewogICAgICAgIC8vIFRoaXMgaXMgYSBtZXNzYWdlIGluZm9ybWluZyB1cyBvZiB0aGUgYmlydGggb3IgZGVhdGggb2YgYW4KICAgICAgICAvLyBpc29sYXRlLgogICAgICAgIF9jb250cm9sTWVzc2FnZUhhbmRsZXIobWVzc2FnZVswXSwgbWVzc2FnZVsxXSwgbWVzc2FnZVsyXSwgbWVzc2FnZVszXSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBwcmludCgnSW50ZXJuYWwgdm0tc2VydmljZSBlcnJvcjogaWdub3JpbmcgaWxsZWdhbCBtZXNzYWdlOiAkbWVzc2FnZScpOwogIH0KCiAgVk1TZXJ2aWNlLl9pbnRlcm5hbCgpIDogZXZlbnRQb3J0ID0gaXNvbGF0ZUNvbnRyb2xQb3J0IHsKICAgIGV2ZW50UG9ydC5oYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7CiAgfQoKICBmYWN0b3J5IFZNU2VydmljZSgpIHsKICAgIGlmIChWTVNlcnZpY2UuX2luc3RhbmNlID09IG51bGwpIHsKICAgICAgVk1TZXJ2aWNlLl9pbnN0YW5jZSA9IG5ldyBWTVNlcnZpY2UuX2ludGVybmFsKCk7CiAgICAgIF9vblN0YXJ0KCk7CiAgICB9CiAgICByZXR1cm4gX2luc3RhbmNlOwogIH0KCiAgYm9vbCBfaXNBbnlDbGllbnRTdWJzY3JpYmVkKFN0cmluZyBzdHJlYW1JZCkgewogICAgZm9yICh2YXIgY2xpZW50IGluIGNsaWVudHMpIHsKICAgICAgaWYgKGNsaWVudC5zdHJlYW1zLmNvbnRhaW5zKHN0cmVhbUlkKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBDbGllbnQgX2ZpbmRGaXJzdENsaWVudFRoYXRIYW5kbGVzU2VydmljZShTdHJpbmcgc2VydmljZSkgewogICAgaWYgKGNsaWVudHMgIT0gbnVsbCkgewogICAgICBmb3IgKENsaWVudCBjIGluIGNsaWVudHMpIHsKICAgICAgICBpZiAoYy5zZXJ2aWNlcy5jb250YWluc0tleShzZXJ2aWNlKSkgewogICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHN0YXRpYyBjb25zdCBrU2VydmljZVN0cmVhbSA9ICdfU2VydmljZSc7CiAgc3RhdGljIGNvbnN0IHNlcnZpY2VTdHJlYW1zID0gY29uc3QgW2tTZXJ2aWNlU3RyZWFtXTsKCiAgRnV0dXJlPFN0cmluZz4gX3N0cmVhbUxpc3RlbihNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHZhciBjbGllbnQgPSBtZXNzYWdlLmNsaWVudDsKICAgIHZhciBzdHJlYW1JZCA9IG1lc3NhZ2UucGFyYW1zWydzdHJlYW1JZCddOwoKICAgIGlmIChjbGllbnQuc3RyZWFtcy5jb250YWlucyhzdHJlYW1JZCkpIHsKICAgICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtTdHJlYW1BbHJlYWR5U3Vic2NyaWJlZCk7CiAgICB9CiAgICBpZiAoIV9pc0FueUNsaWVudFN1YnNjcmliZWQoc3RyZWFtSWQpKSB7CiAgICAgIGlmICghc2VydmljZVN0cmVhbXMuY29udGFpbnMoc3RyZWFtSWQpICYmICFfdm1MaXN0ZW5TdHJlYW0oc3RyZWFtSWQpKSB7CiAgICAgICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtJbnZhbGlkUGFyYW1zLAogICAgICAgICAgICBkZXRhaWxzOiAic3RyZWFtTGlzdGVuOiBpbnZhbGlkICdzdHJlYW1JZCcgcGFyYW1ldGVyOiAke3N0cmVhbUlkfSIpOwogICAgICB9CiAgICB9CgogICAgLy8gU29tZSBzdHJlYW1zIGNhbiBnZW5lcmF0ZSBldmVudHMgb3Igc2lkZSBlZmZlY3RzIGFmdGVyIHJlZ2lzdHJhdGlvbgogICAgc3dpdGNoIChzdHJlYW1JZCkgewogICAgICBjYXNlIGtTZXJ2aWNlU3RyZWFtOgogICAgICAgIGZvciAoQ2xpZW50IGMgaW4gY2xpZW50cykgewogICAgICAgICAgaWYgKGMgPT0gY2xpZW50KSBjb250aW51ZTsKICAgICAgICAgIGZvciAoU3RyaW5nIHNlcnZpY2UgaW4gYy5zZXJ2aWNlcy5rZXlzKSB7CiAgICAgICAgICAgIF9zZW5kU2VydmljZVJlZ2lzdGVyZWRFdmVudChjLCBzZXJ2aWNlLCB0YXJnZXQ6IGNsaWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIDsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBjbGllbnQuc3RyZWFtcy5hZGQoc3RyZWFtSWQpOwogICAgcmV0dXJuIGVuY29kZVN1Y2Nlc3MobWVzc2FnZSk7CiAgfQoKICBGdXR1cmU8U3RyaW5nPiBfc3RyZWFtQ2FuY2VsKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIGNsaWVudCA9IG1lc3NhZ2UuY2xpZW50OwogICAgdmFyIHN0cmVhbUlkID0gbWVzc2FnZS5wYXJhbXNbJ3N0cmVhbUlkJ107CgogICAgaWYgKCFjbGllbnQuc3RyZWFtcy5jb250YWlucyhzdHJlYW1JZCkpIHsKICAgICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtTdHJlYW1Ob3RTdWJzY3JpYmVkKTsKICAgIH0KICAgIGNsaWVudC5zdHJlYW1zLnJlbW92ZShzdHJlYW1JZCk7CiAgICBpZiAoIXNlcnZpY2VTdHJlYW1zLmNvbnRhaW5zKHN0cmVhbUlkKSAmJgogICAgICAgICFfaXNBbnlDbGllbnRTdWJzY3JpYmVkKHN0cmVhbUlkKSkgewogICAgICBfdm1DYW5jZWxTdHJlYW0oc3RyZWFtSWQpOwogICAgfQoKICAgIHJldHVybiBlbmNvZGVTdWNjZXNzKG1lc3NhZ2UpOwogIH0KCiAgc3RhdGljIGJvb2wgX2hhc05hbWVzcGFjZShTdHJpbmcgbWV0aG9kKSA9PgogICAgICBtZXRob2QuY29udGFpbnMoJy4nKSAmJgogICAgICBfZ2V0TmFtZXNwYWNlKG1ldGhvZCkuc3RhcnRzV2l0aChzZXJ2aWNlTmFtZXNwYWNlKTsKICBzdGF0aWMgU3RyaW5nIF9nZXROYW1lc3BhY2UoU3RyaW5nIG1ldGhvZCkgPT4gbWV0aG9kLnNwbGl0KCcuJykuZmlyc3Q7CiAgc3RhdGljIFN0cmluZyBfZ2V0TWV0aG9kKFN0cmluZyBtZXRob2QpID0+IG1ldGhvZC5zcGxpdCgnLicpLmxhc3Q7CgogIEZ1dHVyZTxTdHJpbmc+IF9yZWdpc3RlclNlcnZpY2UoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICBmaW5hbCBjbGllbnQgPSBtZXNzYWdlLmNsaWVudDsKICAgIGZpbmFsIHNlcnZpY2UgPSBtZXNzYWdlLnBhcmFtc1snc2VydmljZSddOwogICAgZmluYWwgYWxpYXMgPSBtZXNzYWdlLnBhcmFtc1snYWxpYXMnXTsKCiAgICBpZiAoc2VydmljZSBpcyEgU3RyaW5nIHx8IHNlcnZpY2UgPT0gJycpIHsKICAgICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtJbnZhbGlkUGFyYW1zLAogICAgICAgICAgZGV0YWlsczogInJlZ2lzdGVyU2VydmljZTogaW52YWxpZCAnc2VydmljZScgcGFyYW1ldGVyOiAke3NlcnZpY2V9Iik7CiAgICB9CiAgICBpZiAoYWxpYXMgaXMhIFN0cmluZyB8fCBhbGlhcyA9PSAnJykgewogICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga0ludmFsaWRQYXJhbXMsCiAgICAgICAgICBkZXRhaWxzOiAicmVnaXN0ZXJTZXJ2aWNlOiBpbnZhbGlkICdhbGlhcycgcGFyYW1ldGVyOiAke2FsaWFzfSIpOwogICAgfQogICAgaWYgKGNsaWVudC5zZXJ2aWNlcy5jb250YWluc0tleShzZXJ2aWNlKSkgewogICAgICByZXR1cm4gZW5jb2RlUnBjRXJyb3IobWVzc2FnZSwga1NlcnZpY2VBbHJlYWR5UmVnaXN0ZXJlZCk7CiAgICB9CiAgICBjbGllbnQuc2VydmljZXNbc2VydmljZV0gPSBhbGlhczsKCiAgICBib29sIHJlbW92ZWQ7CiAgICB0cnkgewogICAgICAvLyBEbyBub3Qgc2VuZCBzdHJlYW1pbmcgZXZlbnRzIHRvIHRoZSBjbGllbnQgd2hpY2ggcmVnaXN0ZXJzIHRoZSBzZXJ2aWNlCiAgICAgIHJlbW92ZWQgPSBjbGllbnQuc3RyZWFtcy5yZW1vdmUoa1NlcnZpY2VTdHJlYW0pOwogICAgICBhd2FpdCBfc2VuZFNlcnZpY2VSZWdpc3RlcmVkRXZlbnQoY2xpZW50LCBzZXJ2aWNlKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGlmIChyZW1vdmVkKSBjbGllbnQuc3RyZWFtcy5hZGQoa1NlcnZpY2VTdHJlYW0pOwogICAgfQoKICAgIHJldHVybiBlbmNvZGVTdWNjZXNzKG1lc3NhZ2UpOwogIH0KCiAgX3NlbmRTZXJ2aWNlUmVnaXN0ZXJlZEV2ZW50KENsaWVudCBjbGllbnQsIFN0cmluZyBzZXJ2aWNlLAogICAgICB7Q2xpZW50IHRhcmdldH0pIGFzeW5jIHsKICAgIGZpbmFsIG5hbWVzcGFjZSA9IGNsaWVudHMua2V5T2YoY2xpZW50KTsKICAgIGZpbmFsIGFsaWFzID0gY2xpZW50LnNlcnZpY2VzW3NlcnZpY2VdOwogICAgZmluYWwgZXZlbnQgPSBuZXcgUmVzcG9uc2UuanNvbih7CiAgICAgICdqc29ucnBjJzogJzIuMCcsCiAgICAgICdtZXRob2QnOiAnc3RyZWFtTm90aWZ5JywKICAgICAgJ3BhcmFtcyc6IHsKICAgICAgICAnc3RyZWFtSWQnOiBrU2VydmljZVN0cmVhbSwKICAgICAgICAnZXZlbnQnOiB7CiAgICAgICAgICAidHlwZSI6ICJFdmVudCIsCiAgICAgICAgICAia2luZCI6ICJTZXJ2aWNlUmVnaXN0ZXJlZCIsCiAgICAgICAgICAndGltZXN0YW1wJzogbmV3IERhdGVUaW1lLm5vdygpLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2gsCiAgICAgICAgICAnc2VydmljZSc6IHNlcnZpY2UsCiAgICAgICAgICAnbWV0aG9kJzogbmFtZXNwYWNlICsgJy4nICsgc2VydmljZSwKICAgICAgICAgICdhbGlhcyc6IGFsaWFzCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICBfZXZlbnRNZXNzYWdlSGFuZGxlcihrU2VydmljZVN0cmVhbSwgZXZlbnQpOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0LnBvc3QoZXZlbnQpOwogICAgfQogIH0KCiAgRnV0dXJlPFN0cmluZz4gX2hhbmRsZVNlcnZpY2UoTWVzc2FnZSBtZXNzYWdlKSBhc3luYyB7CiAgICBmaW5hbCBuYW1lc3BhY2UgPSBfZ2V0TmFtZXNwYWNlKG1lc3NhZ2UubWV0aG9kKTsKICAgIGZpbmFsIG1ldGhvZCA9IF9nZXRNZXRob2QobWVzc2FnZS5tZXRob2QpOwogICAgZmluYWwgY2xpZW50ID0gY2xpZW50c1tuYW1lc3BhY2VdOwogICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CiAgICAgIGlmIChjbGllbnQuc2VydmljZXMuY29udGFpbnNLZXkobWV0aG9kKSkgewogICAgICAgIGZpbmFsIGlkID0gX3NlcnZpY2VSZXF1ZXN0cy5uZXdJZCgpOwogICAgICAgIGZpbmFsIG9sZElkID0gbWVzc2FnZS5zZXJpYWw7CiAgICAgICAgZmluYWwgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxTdHJpbmc+KCk7CiAgICAgICAgY2xpZW50LnNlcnZpY2VIYW5kbGVzW2lkXSA9IChNZXNzYWdlIG0pIHsKICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKICAgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKGpzb24uZW5jb2RlKG0uZm9yd2FyZFRvSnNvbih7J2lkJzogb2xkSWR9KSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtTZXJ2aWNlRGlzYXBwZWFyZWQpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGNsaWVudC5wb3N0KG5ldyBSZXNwb25zZS5qc29uKAogICAgICAgICAgICBtZXNzYWdlLmZvcndhcmRUb0pzb24oeydpZCc6IGlkLCAnbWV0aG9kJzogbWV0aG9kfSkpKTsKICAgICAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuY29kZVJwY0Vycm9yKG1lc3NhZ2UsIGtNZXRob2ROb3RGb3VuZCwKICAgICAgICBkZXRhaWxzOiAiVW5rbm93biBzZXJ2aWNlOiAke21lc3NhZ2UubWV0aG9kfSIpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gX3NwYXduVXJpKE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgdmFyIHRva2VuID0gbWVzc2FnZS5wYXJhbXNbJ3Rva2VuJ107CiAgICBpZiAodG9rZW4gPT0gbnVsbCkgewogICAgICByZXR1cm4gZW5jb2RlTWlzc2luZ1BhcmFtRXJyb3IobWVzc2FnZSwgJ3Rva2VuJyk7CiAgICB9CiAgICBpZiAodG9rZW4gaXMhIFN0cmluZykgewogICAgICByZXR1cm4gZW5jb2RlSW52YWxpZFBhcmFtRXJyb3IobWVzc2FnZSwgJ3Rva2VuJyk7CiAgICB9CiAgICB2YXIgdXJpID0gbWVzc2FnZS5wYXJhbXNbJ3VyaSddOwogICAgaWYgKHVyaSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcihtZXNzYWdlLCAndXJpJyk7CiAgICB9CiAgICBpZiAodXJpIGlzISBTdHJpbmcpIHsKICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICd1cmknKTsKICAgIH0KICAgIHZhciBhcmdzID0gbWVzc2FnZS5wYXJhbXNbJ2FyZ3MnXTsKICAgIHZhciBhcmdzT2ZTdHJpbmcgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CiAgICBpZiAoYXJncyAhPSBudWxsKSB7CiAgICAgIGlmIChhcmdzIGlzISBMaXN0KSB7CiAgICAgICAgcmV0dXJuIGVuY29kZUludmFsaWRQYXJhbUVycm9yKG1lc3NhZ2UsICdhcmdzJyk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgYXJnIGluIGFyZ3MpIHsKICAgICAgICBpZiAoYXJnIGlzISBTdHJpbmcpIHsKICAgICAgICAgIHJldHVybiBlbmNvZGVJbnZhbGlkUGFyYW1FcnJvcihtZXNzYWdlLCAnYXJncycpOwogICAgICAgIH0KICAgICAgICBhcmdzT2ZTdHJpbmcuYWRkKGFyZyk7CiAgICAgIH0KICAgIH0KICAgIHZhciBtc2cgPSBtZXNzYWdlLnBhcmFtc1snbWVzc2FnZSddOwoKICAgIElzb2xhdGUuc3Bhd25VcmkoVXJpLnBhcnNlKHVyaSksIGFyZ3NPZlN0cmluZywgbXNnKS50aGVuKChpc29sYXRlKSB7CiAgICAgIF9zcGF3blVyaU5vdGlmeShpc29sYXRlLmNvbnRyb2xQb3J0LCB0b2tlbik7CiAgICB9KS5jYXRjaEVycm9yKChlKSB7CiAgICAgIF9zcGF3blVyaU5vdGlmeShlLnRvU3RyaW5nKCksIHRva2VuKTsKICAgIH0pOwoKICAgIHJldHVybiBlbmNvZGVTdWNjZXNzKG1lc3NhZ2UpOwogIH0KCiAgRnV0dXJlPFJlc3BvbnNlPiByb3V0ZVJlcXVlc3QoVk1TZXJ2aWNlIF8sIE1lc3NhZ2UgbWVzc2FnZSkgYXN5bmMgewogICAgcmV0dXJuIG5ldyBSZXNwb25zZS5mcm9tKGF3YWl0IF9yb3V0ZVJlcXVlc3RJbXBsKG1lc3NhZ2UpKTsKICB9CgogIEZ1dHVyZSBfcm91dGVSZXF1ZXN0SW1wbChNZXNzYWdlIG1lc3NhZ2UpIGFzeW5jIHsKICAgIHRyeSB7CiAgICAgIGlmIChtZXNzYWdlLmNvbXBsZXRlZCkgewogICAgICAgIHJldHVybiBhd2FpdCBtZXNzYWdlLnJlc3BvbnNlOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PSAnc3RyZWFtTGlzdGVuJykgewogICAgICAgIHJldHVybiBhd2FpdCBfc3RyZWFtTGlzdGVuKG1lc3NhZ2UpOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PSAnc3RyZWFtQ2FuY2VsJykgewogICAgICAgIHJldHVybiBhd2FpdCBfc3RyZWFtQ2FuY2VsKG1lc3NhZ2UpOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PSAnX3JlZ2lzdGVyU2VydmljZScpIHsKICAgICAgICByZXR1cm4gYXdhaXQgX3JlZ2lzdGVyU2VydmljZShtZXNzYWdlKTsKICAgICAgfQogICAgICBpZiAobWVzc2FnZS5tZXRob2QgPT0gJ19zcGF3blVyaScpIHsKICAgICAgICByZXR1cm4gYXdhaXQgX3NwYXduVXJpKG1lc3NhZ2UpOwogICAgICB9CiAgICAgIGlmIChkZXZmcy5zaG91bGRIYW5kbGVNZXNzYWdlKG1lc3NhZ2UpKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IGRldmZzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7CiAgICAgIH0KICAgICAgaWYgKF9oYXNOYW1lc3BhY2UobWVzc2FnZS5tZXRob2QpKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IF9oYW5kbGVTZXJ2aWNlKG1lc3NhZ2UpOwogICAgICB9CiAgICAgIGlmIChtZXNzYWdlLnBhcmFtc1snaXNvbGF0ZUlkJ10gIT0gbnVsbCkgewogICAgICAgIHJldHVybiBhd2FpdCBydW5uaW5nSXNvbGF0ZXMucm91dGVSZXF1ZXN0KHRoaXMsIG1lc3NhZ2UpOwogICAgICB9CiAgICAgIHJldHVybiBhd2FpdCBtZXNzYWdlLnNlbmRUb1ZNKCk7CiAgICB9IGNhdGNoIChlLCBzdCkgewogICAgICBtZXNzYWdlLnNldEVycm9yUmVzcG9uc2Uoa0ludGVybmFsRXJyb3IsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbjokZVxuJHN0Jyk7CiAgICAgIHJldHVybiBtZXNzYWdlLnJlc3BvbnNlOwogICAgfQogIH0KCiAgdm9pZCByb3V0ZVJlc3BvbnNlKG1lc3NhZ2UpIHsKICAgIGZpbmFsIGNsaWVudCA9IG1lc3NhZ2UuY2xpZW50OwogICAgaWYgKGNsaWVudC5zZXJ2aWNlSGFuZGxlcy5jb250YWluc0tleShtZXNzYWdlLnNlcmlhbCkpIHsKICAgICAgY2xpZW50LnNlcnZpY2VIYW5kbGVzLnJlbW92ZShtZXNzYWdlLnNlcmlhbCkobWVzc2FnZSk7CiAgICAgIF9zZXJ2aWNlUmVxdWVzdHMucmVsZWFzZShtZXNzYWdlLnNlcmlhbCk7CiAgICB9CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKUmF3UmVjZWl2ZVBvcnQgYm9vdCgpIHsKICAvLyBSZXR1cm4gdGhlIHBvcnQgd2UgZXhwZWN0IGlzb2xhdGUgY29udHJvbCBtZXNzYWdlcyBvbi4KICByZXR1cm4gaXNvbGF0ZUNvbnRyb2xQb3J0Owp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICFjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgiZGFydC52bS5wcm9kdWN0IikpCnZvaWQgX3JlZ2lzdGVySXNvbGF0ZShpbnQgcG9ydF9pZCwgU2VuZFBvcnQgc3AsIFN0cmluZyBuYW1lKSB7CiAgdmFyIHNlcnZpY2UgPSBuZXcgVk1TZXJ2aWNlKCk7CiAgc2VydmljZS5ydW5uaW5nSXNvbGF0ZXMuaXNvbGF0ZVN0YXJ0dXAocG9ydF9pZCwgc3AsIG5hbWUpOwp9CgovLy8gTm90aWZ5IHRoZSBWTSB0aGF0IHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcuCnZvaWQgX29uU3RhcnQoKSBuYXRpdmUgIlZNU2VydmljZV9PblN0YXJ0IjsKCi8vLyBOb3RpZnkgdGhlIFZNIHRoYXQgdGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcuCnZvaWQgX29uRXhpdCgpIG5hdGl2ZSAiVk1TZXJ2aWNlX09uRXhpdCI7CgovLy8gTm90aWZ5IHRoZSBWTSB0aGF0IHRoZSBzZXJ2ZXIncyBhZGRyZXNzIGhhcyBjaGFuZ2VkLgp2b2lkIG9uU2VydmVyQWRkcmVzc0NoYW5nZShTdHJpbmcgYWRkcmVzcykKICAgIG5hdGl2ZSAiVk1TZXJ2aWNlX09uU2VydmVy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ZWZvcmUgaGFuZGxpbmcgYW4gZW1iZWRkZXIgZW50cnlwb2ludCB3ZSBmaW5hbGl6ZSB0aGUgc2V0dXAgb2YgdGhlCi8vIGRhcnQ6X2J1aWx0aW4gbGlicmFyeS4KYm9vbCBfc2V0dXBDb21wbGV0ZWQgPSBmYWxzZTsKCi8vICdwcmludCcgaW1wbGVtZW50YXRpb24uCi8vIFRoZSBzdGFuZGFsb25lIGVtYmVkZGVyIHJlZ2lzdGVycyB0aGUgY2xvc3VyaXplZCBfcHJpbnQgZnVuY3Rpb24gd2l0aCB0aGUKLy8gZGFydDpjb3JlIGxpYnJhcnkuCnZvaWQgX3ByaW50U3RyaW5nKFN0cmluZyBzKSBuYXRpdmUgIkJ1aWx0aW5fUHJpbnRTdHJpbmciOwoKdm9pZCBfcHJpbnQoYXJnKSB7CiAgX3ByaW50U3RyaW5nKGFyZy50b1N0cmluZygpKTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpfZ2V0UHJpbnRDbG9zdXJlKCkgPT4gX3ByaW50OwoKLy8gQXN5bmNocm9ub3VzIGxvYWRpbmcgb2YgcmVzb3VyY2VzLgovLyBUaGUgZW1iZWRkZXIgZm9yd2FyZHMgbG9hZGluZyByZXF1ZXN0cyB0byB0aGUgc2VydmljZSBpc29sYXRlLgoKLy8gQSBwb3J0IGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZpY2UgaXNvbGF0ZSBmb3IgSS9PLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpClNlbmRQb3J0IF9sb2FkUG9ydDsKCi8vIFRoZSBpc29sYXRlSWQgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2aWNlIGlzb2xhdGUgZm9yIEkvTy4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQppbnQgX2lzb2xhdGVJZDsKCi8vIFJlcXVlc3RzIG1hZGUgdG8gdGhlIHNlcnZpY2UgaXNvbGF0ZSBvdmVyIHRoZSBsb2FkIHBvcnQuCgovLyBFeHRyYSByZXF1ZXN0cy4gS2VlcCB0aGVzZSBpbiBzeW5jIGJldHdlZW4gbG9hZGVyLmRhcnQgYW5kIGJ1aWx0aW4uZGFydC4KY29uc3QgX0RhcnRfa0luaXRMb2FkZXIgPSA0OyAvLyBJbml0aWFsaXplIHRoZSBsb2FkZXIuCmNvbnN0IF9EYXJ0X2tSZXNvdXJjZUxvYWQgPSA1OyAvLyBSZXNvdXJjZSBjbGFzcyBzdXBwb3J0Lgpjb25zdCBfRGFydF9rR2V0UGFja2FnZVJvb3RVcmkgPSA2OyAvLyBVcmkgb2YgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuCmNvbnN0IF9EYXJ0X2tHZXRQYWNrYWdlQ29uZmlnVXJpID0gNzsgLy8gVXJpIG9mIHRoZSAucGFja2FnZXMgZmlsZS4KY29uc3QgX0RhcnRfa1Jlc29sdmVQYWNrYWdlVXJpID0gODsgLy8gUmVzb2x2ZSBhIHBhY2thZ2U6IHVyaS4KCi8vIE1ha2UgYSByZXF1ZXN0IHRvIHRoZSBsb2FkZXIuIEZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggcmVzdWx0IHdoaWNoIGlzCi8vIGVpdGhlciBhIFVyaSBvciBhIExpc3Q8aW50Pi4KRnV0dXJlPFQ+IF9tYWtlTG9hZGVyUmVxdWVzdDxUPihpbnQgdGFnLCBTdHJpbmcgdXJpKSB7CiAgYXNzZXJ0KF9pc29sYXRlSWQgIT0gbnVsbCk7CiAgaWYgKF9sb2FkUG9ydCA9PSBudWxsKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiU2VydmljZSBpc29sYXRlIGlzIG5vdCBhdmFpbGFibGUuIik7CiAgfQogIENvbXBsZXRlciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFQ+KCk7CiAgUmF3UmVjZWl2ZVBvcnQgcG9ydCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOwogIHBvcnQuaGFuZGxlciA9IChtc2cpIHsKICAgIC8vIENsb3NlIHRoZSBwb3J0LgogICAgcG9ydC5jbG9zZSgpOwogICAgY29tcGxldGVyLmNvbXBsZXRlKG1zZyk7CiAgfTsKICBfbG9hZFBvcnQuc2VuZChbX3RyYWNlTG9hZGluZywgX2lzb2xhdGVJZCwgdGFnLCBwb3J0LnNlbmRQb3J0LCB1cmldKTsKICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKfQoKLy8gVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiB0aGUgZW1iZWRkZXIgd2FzIGxhdW5jaGVkLgpVcmkgX3dvcmtpbmdEaXJlY3Rvcnk7Ci8vIFRoZSBVUkkgdGhhdCB0aGUgcm9vdCBzY3JpcHQgd2FzIGxvYWRlZCBmcm9tLiBSZW1lbWJlcmVkIHNvIHRoYXQKLy8gcGFja2FnZSBpbXBvcnRzIGNhbiBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byBpdC4gVGhlIHJvb3Qgc2NyaXB0IGlzIHRoZSBiYXNpcwovLyBmb3IgdGhlIHJvb3QgbGlicmFyeSBpbiB0aGUgVk0uClVyaSBfcm9vdFNjcmlwdDsKLy8gVGhlIHBhY2thZ2Ugcm9vdCBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4KVXJpIF9wYWNrYWdlUm9vdDsKCi8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIFdpbmRvd3MgcGF0aHMgc28gdGhhdCB0aGV5IGFyZSBjb21wYXRpYmxlIHdpdGggVVJJCi8vIGhhbmRsaW5nLgovLyBFbWJlZGRlciBzZXRzIHRoaXMgdG8gdHJ1ZSBpZiB3ZSBhcmUgcnVubmluZyBvbiBXaW5kb3dzLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmJvb2wgX2lzV2luZG93cyA9IGZhbHNlOwoKLy8gTG9nZ2luZyBmcm9tIGJ1aWx0aW4uZGFydCBpcyBwcmVmaXhlZCB3aXRoIGEgJyonLgpTdHJpbmcgX2xvZ0lkID0gKElzb2xhdGUuY3VycmVudC5oYXNoQ29kZSAlIDB4MTAwMDAwKS50b1JhZGl4U3RyaW5nKDE2KTsKX2xvZyhtc2cpIHsKICBfcHJpbnQoIiogJF9sb2dJZCAkbXNnIik7Cn0KCl9zYW5pdGl6ZVdpbmRvd3NQYXRoKHBhdGgpIHsKICAvLyBGb3IgV2luZG93cyB3ZSBuZWVkIHRvIG1hc3NhZ2UgdGhlIHBhdGhzIGEgYml0IGFjY29yZGluZyB0bwogIC8vIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2llL2FyY2hpdmUvMjAwNi8xMi8wNi9maWxlLXVyaXMtaW4td2luZG93cy5hc3B4CiAgLy8KICAvLyBDb252ZXJ0CiAgLy8gQzpcb25lXHR3b1x0aHJlZQogIC8vIHRvCiAgLy8gL0M6L29uZS90d28vdGhyZWUKCiAgaWYgKF9pc1dpbmRvd3MgPT0gZmFsc2UpIHsKICAgIC8vIERvIG5vdGhpbmcgd2hlbiBub3QgcnVubmluZyBXaW5kb3dzLgogICAgcmV0dXJuIHBhdGg7CiAgfQoKICB2YXIgZml4ZWRQYXRoID0gIiR7cGF0aC5yZXBsYWNlQWxsKCdcXCcsICcvJyl9IjsKCiAgaWYgKChwYXRoLmxlbmd0aCA+IDIpICYmIChwYXRoWzFdID09ICc6JykpIHsKICAgIC8vIFBhdGggYmVnaW5zIHdpdGggYSBkcml2ZSBsZXR0ZXIuCiAgICByZXR1cm4gJy8kZml4ZWRQYXRoJzsKICB9CgogIHJldHVybiBmaXhlZFBhdGg7Cn0KCl90cmltV2luZG93c1BhdGgocGF0aCkgewogIC8vIENvbnZlcnQgL1g6LyB0byBYOi8uCiAgaWYgKF9pc1dpbmRvd3MgPT0gZmFsc2UpIHsKICAgIC8vIERvIG5vdGhpbmcgd2hlbiBub3QgcnVubmluZyBXaW5kb3dzLgogICAgcmV0dXJuIHBhdGg7CiAgfQogIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykgfHwgKHBhdGgubGVuZ3RoIDwgMykpIHsKICAgIHJldHVybiBwYXRoOwogIH0KICAvLyBNYXRjaCAnLz86Jy4KICBpZiAoKHBhdGhbMF0gPT0gJy8nKSAmJiAocGF0aFsyXSA9PSAnOicpKSB7CiAgICAvLyBSZW1vdmUgbGVhZGluZyAnLycuCiAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMSk7CiAgfQogIHJldHVybiBwYXRoOwp9CgovLyBFbnN1cmUgd2UgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3Rlci4KX2VuZm9yY2VUcmFpbGluZ1NsYXNoKHVyaSkgewogIGlmICghdXJpLmVuZHNXaXRoKCcvJykpIHsKICAgIHJldHVybiAnJHVyaS8nOwogIH0KICByZXR1cm4gdXJpOwp9CgovLyBFbWJlZGRlciBFbnRyeXBvaW50OgovLyBUaGUgZW1iZWRkZXIgY2FsbHMgdGhpcyBtZXRob2Qgd2l0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQp2b2lkIF9zZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyBjd2QpIHsKICBpZiAoIV9zZXR1cENvbXBsZXRlZCkgewogICAgX3NldHVwSG9va3MoKTsKICB9CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coJ1NldHRpbmcgd29ya2luZyBkaXJlY3Rvcnk6ICRjd2QnKTsKICB9CiAgX3dvcmtpbmdEaXJlY3RvcnkgPSBuZXcgVXJpLmRpcmVjdG9yeShjd2QpOwogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCdXb3JraW5nIGRpcmVjdG9yeSBVUkk6ICRfd29ya2luZ0RpcmVjdG9yeScpOwogIH0KfQoKLy8gRW1iZWRkZXIgRW50cnlwb2ludDoKLy8gVGhlIGVtYmVkZGVyIGNhbGxzIHRoaXMgbWV0aG9kIHdpdGggYSBjdXN0b20gcGFja2FnZSByb290LgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpClN0cmluZyBfc2V0UGFja2FnZVJvb3QoU3RyaW5nIHBhY2thZ2VSb290KSB7CiAgaWYgKCFfc2V0dXBDb21wbGV0ZWQpIHsKICAgIF9zZXR1cEhvb2tzKCk7CiAgfQogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCdTZXR0aW5nIHBhY2thZ2Ugcm9vdDogJHBhY2thZ2VSb290Jyk7CiAgfQogIGlmIChwYWNrYWdlUm9vdC5zdGFydHNXaXRoKCdmaWxlOicpIHx8CiAgICAgIHBhY2thZ2VSb290LnN0YXJ0c1dpdGgoJ2h0dHA6JykgfHwKICAgICAgcGFja2FnZVJvb3Quc3RhcnRzV2l0aCgnaHR0cHM6JykpIHsKICAgIHBhY2thZ2VSb290ID0gX2VuZm9yY2VUcmFpbGluZ1NsYXNoKHBhY2thZ2VSb290KTsKICAgIF9wYWNrYWdlUm9vdCA9IF93b3JraW5nRGlyZWN0b3J5LnJlc29sdmUocGFja2FnZVJvb3QpOwogIH0gZWxzZSB7CiAgICBwYWNrYWdlUm9vdCA9IF9zYW5pdGl6ZVdpbmRvd3NQYXRoKHBhY2thZ2VSb290KTsKICAgIHBhY2thZ2VSb290ID0gX3RyaW1XaW5kb3dzUGF0aChwYWNrYWdlUm9vdCk7CiAgICBfcGFja2FnZVJvb3QgPSBfd29ya2luZ0RpcmVjdG9yeS5yZXNvbHZlVXJpKG5ldyBVcmkuZGlyZWN0b3J5KHBhY2thZ2VSb290KSk7CiAgfQogIC8vIE5vdyB0aGF0IHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGUgcGFja2FnZVJvb3QgdmFsdWUgYmVpbmcgdXNlZCwgc2V0IGl0CiAgLy8gdXAgZm9yIHVzZSBpbiBQbGF0Zm9ybS5wYWNrYWdlUm9vdC4gVGhpcyBpcyBvbmx5IHNldCB3aGVuIHRoZSBlbWJlZGRlcgogIC8vIHNldHMgdXAgdGhlIHBhY2thZ2Ugcm9vdC4gQXV0b21hdGljYWxseSBkaXNjb3ZlcmVkIHBhY2thZ2Ugcm9vdCB3aWxsCiAgLy8gbm90IHVwZGF0ZSB0aGUgVk1MaWJyYXJ5SG9va3MgdmFsdWUuCiAgdmFyIHBhY2thZ2VSb290U3RyID0gX3BhY2thZ2VSb290LnRvU3RyaW5nKCk7CiAgVk1MaWJyYXJ5SG9va3MucGFja2FnZVJvb3RTdHJpbmcgPSBwYWNrYWdlUm9vdFN0cjsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygnUGFja2FnZSByb290IFVSSTogJF9wYWNrYWdlUm9vdCcpOwogIH0KICByZXR1cm4gcGFja2FnZVJvb3RTdHI7Cn0KCi8vIEVtYmVkZGVyIEVudHJ5cG9pbnQ6CkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKU3RyaW5nIF9zZXRQYWNrYWdlc01hcChTdHJpbmcgcGFja2FnZXNQYXJhbSkgewogIGlmICghX3NldHVwQ29tcGxldGVkKSB7CiAgICBfc2V0dXBIb29rcygpOwogIH0KICAvLyBGaXJzdCBjb252ZXJ0IHRoZSBwYWNrYWdlcyBwYXJhbWV0ZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvIGEgVVJJIHdoaWNoCiAgLy8gY2FuIGJlIGhhbmRsZWQgYnkgdGhlIGxvYWRlciBjb2RlLgogIC8vIFRPRE8oaXBvc3ZhKTogQ29uc2lkZXIgcmVmYWN0b3JpbmcgdGhlIGNvbW1vbiBjb2RlIGJlbG93IHdoaWNoIGlzIGFsbW9zdAogIC8vIHNoYXJlZCB3aXRoIHJlc29sdXRpb24gb2YgdGhlIHJvb3Qgc2NyaXB0LgogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCJSZXNvbHZpbmcgcGFja2FnZXMgbWFwOiAkcGFja2FnZXNQYXJhbSIpOwogIH0KICBpZiAoX3dvcmtpbmdEaXJlY3RvcnkgPT0gbnVsbCkgewogICAgdGhyb3cgJ05vIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgc2V0Lic7CiAgfQogIHZhciBwYWNrYWdlc05hbWUgPSBfc2FuaXRpemVXaW5kb3dzUGF0aChwYWNrYWdlc1BhcmFtKTsKICB2YXIgcGFja2FnZXNVcmkgPSBVcmkucGFyc2UocGFja2FnZXNOYW1lKTsKICBpZiAocGFja2FnZXNVcmkuc2NoZW1lID09ICcnKSB7CiAgICAvLyBTY3JpcHQgZG9lcyBub3QgaGF2ZSBhIHNjaGVtZSwgYXNzdW1lIHRoYXQgaXQgaXMgYSBwYXRoLAogICAgLy8gcmVzb2x2ZSBpdCBhZ2FpbnN0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KICAgIHBhY2thZ2VzVXJpID0gX3dvcmtpbmdEaXJlY3RvcnkucmVzb2x2ZVVyaShwYWNrYWdlc1VyaSk7CiAgfQogIHZhciBwYWNrYWdlc1VyaVN0ciA9IHBhY2thZ2VzVXJpLnRvU3RyaW5nKCk7CiAgVk1MaWJyYXJ5SG9va3MucGFja2FnZUNvbmZpZ1N0cmluZyA9IHBhY2thZ2VzVXJpU3RyOwogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCdSZXNvbHZlZCBwYWNrYWdlcyBtYXAgdG86ICRwYWNrYWdlc1VyaScpOwogIH0KICByZXR1cm4gcGFja2FnZXNVcmlTdHI7Cn0KCi8vIFJlc29sdmVzIHRoZSBzY3JpcHQgdXJpIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlmZiB0aGUgZ2l2ZW4gdXJpCi8vIGRpZCBub3Qgc3BlY2lmeSBhIHNjaGVtZSAoZS5nLiBhIHBhdGggdG8gYSBzY3JpcHQgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lKS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpTdHJpbmcgX3Jlc29sdmVTY3JpcHRVcmkoU3RyaW5nIHNjcmlwdE5hbWUpIHsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygiUmVzb2x2aW5nIHNjcmlwdDogJHNjcmlwdE5hbWUiKTsKICB9CiAgaWYgKF93b3JraW5nRGlyZWN0b3J5ID09IG51bGwpIHsKICAgIHRocm93ICdObyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHNldC4nOwogIH0KICBzY3JpcHROYW1lID0gX3Nhbml0aXplV2luZG93c1BhdGgoc2NyaXB0TmFtZSk7CgogIHZhciBzY3JpcHRVcmkgPSBVcmkucGFyc2Uoc2NyaXB0TmFtZSk7CiAgaWYgKHNjcmlwdFVyaS5zY2hlbWUgPT0gJycpIHsKICAgIC8vIFNjcmlwdCBkb2VzIG5vdCBoYXZlIGEgc2NoZW1lLCBhc3N1bWUgdGhhdCBpdCBpcyBhIHBhdGgsCiAgICAvLyByZXNvbHZlIGl0IGFnYWluc3QgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgogICAgc2NyaXB0VXJpID0gX3dvcmtpbmdEaXJlY3RvcnkucmVzb2x2ZVVyaShzY3JpcHRVcmkpOwogIH0KCiAgLy8gUmVtZW1iZXIgdGhlIHJvb3Qgc2NyaXB0IFVSSSBzbyB0aGF0IHdlIGNhbiByZXNvbHZlIHBhY2thZ2VzIGJhc2VkIG9uCiAgLy8gdGhpcyBsb2NhdGlvbi4KICBfcm9vdFNjcmlwdCA9IHNjcmlwdFVyaTsKCiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coJ1Jlc29sdmVkIGVudHJ5IHBvaW50IHRvOiAkX3Jvb3RTY3JpcHQnKTsKICB9CiAgcmV0dXJuIHNjcmlwdFVyaS50b1N0cmluZygpOwp9CgovLyBPbmx5IHVzZWQgYnkgdm0vY2MgdW5pdCB0ZXN0cy4KVXJpIF9yZXNvbHZlUGFja2FnZVVyaShVcmkgdXJpKSB7CiAgYXNzZXJ0KF9wYWNrYWdlUm9vdCAhPSBudWxsKTsKICByZXR1cm4gX3BhY2thZ2VSb290LnJlc29sdmUodXJpLnBhdGgpOwp9CgovLyBSZXR1cm5zIGVpdGhlciBhIGZpbGUgcGF0aCBvciBhIFVSSSBzdGFydGluZyB3aXRoIGh0dHBbc106LCBhcyBhIFN0cmluZy4KU3RyaW5nIF9maWxlUGF0aEZyb21VcmkoU3RyaW5nIHVzZXJVcmkpIHsKICB2YXIgdXJpID0gVXJpLnBhcnNlKHVzZXJVcmkpOwogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCdHZXR0aW5nIGZpbGUgcGF0aCBmcm9tOiAkdXJpJyk7CiAgfQoKICB2YXIgcGF0aDsKICBzd2l0Y2ggKHVyaS5zY2hlbWUpIHsKICAgIGNhc2UgJyc6CiAgICBjYXNlICdmaWxlJzoKICAgICAgcmV0dXJuIHVyaS50b0ZpbGVQYXRoKCk7CiAgICBjYXNlICdwYWNrYWdlJzoKICAgICAgcmV0dXJuIF9maWxlUGF0aEZyb21VcmkoX3Jlc29sdmVQYWNrYWdlVXJpKHVyaSkudG9TdHJpbmcoKSk7CiAgICBjYXNlICdkYXRhJzoKICAgIGNhc2UgJ2h0dHAnOgogICAgY2FzZSAnaHR0cHMnOgogICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCk7CiAgICBkZWZhdWx0OgogICAgICAvLyBPbmx5IGhhbmRsaW5nIGZpbGUsIGh0dHAsIGFuZCBwYWNrYWdlIFVSSXMKICAgICAgLy8gaW4gc3RhbmRhbG9uZSBiaW5hcnkuCiAgICAgIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICAgICAgX2xvZygnVW5rbm93biBzY2hlbWUgKCR7dXJpLnNjaGVtZX0pIGluICR1cmkuJyk7CiAgICAgIH0KICAgICAgdGhyb3cgJ05vdCBhIGtub3duIHNjaGVtZTogJHVyaSc7CiAgfQp9CgovLyBSZWdpc3RlciBjYWxsYmFja3MgYW5kIGhvb2tzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGNvcmUgbGlicmFyaWVzLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCl9zZXR1cEhvb2tzKCkgewogIF9zZXR1cENvbXBsZXRlZCA9IHRydWU7CiAgVk1MaWJyYXJ5SG9va3MucmVzb3VyY2VSZWFkQXNCeXRlcyA9IF9yZXNvdXJjZVJlYWRBc0J5dGVzOwoKICBWTUxpYnJhcnlIb29rcy5wYWNrYWdlUm9vdFVyaUZ1dHVyZSA9IF9nZXRQYWNrYWdlUm9vdEZ1dHVyZTsKICBWTUxpYnJhcnlIb29rcy5wYWNrYWdlQ29uZmlnVXJpRnV0dXJlID0gX2dldFBhY2thZ2VDb25maWdGdXR1cmU7CiAgVk1MaWJyYXJ5SG9va3MucmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmUgPSBfcmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmU7Cn0KCi8vIEhhbmRsaW5nIG9mIFJlc291cmNlIGNsYXNzIGJ5IGRpc3BhdGNoaW5nIHRvIHRoZSBsb2FkIHBvcnQuCkZ1dHVyZTxMaXN0PGludD4+IF9yZXNvdXJjZVJlYWRBc0J5dGVzKFVyaSB1cmkpIGFzeW5jIHsKICBMaXN0IHJlc3BvbnNlID0KICAgICAgYXdhaXQgX21ha2VMb2FkZXJSZXF1ZXN0PExpc3Q8aW50Pj4oX0RhcnRfa1Jlc291cmNlTG9hZCwgdXJpLnRvU3RyaW5nKCkpOwogIGlmIChyZXNwb25zZVs0XSBpcyBTdHJpbmcpIHsKICAgIC8vIFRocm93IHRoZSBlcnJvci4KICAgIHRocm93IHJlc3BvbnNlWzRdOwogIH0gZWxzZSB7CiAgICByZXR1cm4gcmVzcG9uc2VbNF07CiAgfQp9CgovLyBUT0RPKG1mYWlyaHVyc3QpOiByZW1vdmUgdGhpcwpGdXR1cmU8VXJpPiBfZ2V0UGFja2FnZVJvb3RGdXR1cmUoKSB7CiAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgIF9sb2coIlJlcXVlc3QgZm9yIHBhY2thZ2Ugcm9vdCBmcm9tIHVzZXIgY29kZS4iKTsKICB9CiAgLy8gUmV0dXJuIG51bGwsIGFzIHRoZSBgcGFja2FnZXMvYCBkaXJlY3RvcnkgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXJ0IDIuCiAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobnVsbCk7Cn0KCkZ1dHVyZTxVcmk+IF9nZXRQYWNrYWdlQ29uZmlnRnV0dXJlKCkgewogIGlmIChfdHJhY2VMb2FkaW5nKSB7CiAgICBfbG9nKCJSZXF1ZXN0IGZvciBwYWNrYWdlIGNvbmZpZyBmcm9tIHVzZXIgY29kZS4iKTsKICB9CiAgYXNzZXJ0KF9sb2FkUG9ydCAhPSBudWxsKTsKICByZXR1cm4gX21ha2VMb2FkZXJSZXF1ZXN0PFVyaT4oX0RhcnRfa0dldFBhY2thZ2VDb25maWdVcmksIG51bGwpOwp9CgpGdXR1cmU8VXJpPiBfcmVzb2x2ZVBhY2thZ2VVcmlGdXR1cmUoVXJpIHBhY2thZ2VVcmkpIGFzeW5jIHsKICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygiUmVxdWVzdCBmb3IgcGFja2FnZSBVcmkgcmVzb2x1dGlvbiBmcm9tIHVzZXIgY29kZTogJHBhY2thZ2VVcmkiKTsKICB9CiAgaWYgKHBhY2thZ2VVcmkuc2NoZW1lICE9ICJwYWNrYWdlIikgewogICAgaWYgKF90cmFjZUxvYWRpbmcpIHsKICAgICAgX2xvZygiTm9uLXBhY2thZ2UgVXJpLCByZXR1cm5pbmcgdW5tb2RpZmllZDogJHBhY2thZ2VVcmkiKTsKICAgIH0KICAgIC8vIFJldHVybiB0aGUgaW5jb21pbmcgcGFyYW1ldGVyIGlmIG5vdCBwYXNzZWQgYSBwYWNrYWdlOiBVUkkuCiAgICByZXR1cm4gcGFja2FnZVVyaTsKICB9CiAgdmFyIHJlc3VsdCA9IGF3YWl0IF9tYWtlTG9hZGVyUmVxdWVzdDxVcmk+KAogICAgICBfRGFydF9rUmVzb2x2ZVBhY2thZ2VVcmksIHBhY2thZ2VVcmkudG9TdHJpbmcoKSk7CiAgaWYgKHJlc3VsdCBpcyEgVXJpKSB7CiAgICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgICBfbG9nKCJFeGNlcHRpb24gd2hlbiByZXNvbHZpbmcgcGFja2FnZSBVUkk6ICRwYWNrYWdlVXJpIik7CiAgICB9CiAgICByZXN1bHQgPSBudWxsOwogIH0KICBpZiAoX3RyYWNlTG9hZGluZykgewogICAgX2xvZygiUmVzb2x2ZWQgJyRwYWNrYWdlVXJpJyB0byAnJHJlc3VsdCciKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQqBXQBOTjwBEQEtFTslFxoBTBEcAUcaHgEbTRY6ARMgAgEaHgEmQgE+GhQBRxoQATwBTDc6R0Q/AUsgNx4bRQQsLhkXEh0FSBsCAUEXRFAjES0SAUsNPBoZATVJDBwCAR1BTQUNFggXAR0sEQQBMwEvKBoEARQCARkaHSwRBDQRBBIuGx4EDwIBLh0cFAQOAgEYRhooGhMEFy0ELhc3BAIBGD4aLRoTBBcwBCkpKjY7CzUxUQRKTEoqMDUXLQQZAgEYGi8aEwRPKE4wFzQEIy8EOi0iQDE9BC83FzQEGQIBTlAaLhcrBCMvBDEBKSBAMTkEAUsUGwEXMwQfAgEiIiApAgFMKiAXKgQBDBgNER8UQxEREh0NNB8bOQgoBAIBRRoQGj0BP0NFAgE/OBJQHxgXCxgEAgEhJhc2BEshAgEoFzgEHUQCAT0XTAQoGUIGQxcELjgYGUEGEwQXMQQRAgENZGFydDpfYnVpbHRpbjxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaHRtbC9kYXJ0aXVtL25hdGl2ZXdyYXBwZXJzLmRhcnSBfS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IG5hdGl2ZXdyYXBwZXJzOwoKY2xhc3MgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxIHt9CgpjbGFzcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczIge30KCmNsYXNzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMyB7fQoKY2xhc3MgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3M0IHt9Cg8ATk48ARgBIgEiASIBIgETZGFydDpuYXRpdmV3cmFwcGVycyZvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vaW8uZGFydJ8aLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8qKgogKiBGaWxlLCBzb2NrZXQsIEhUVFAsIGFuZCBvdGhlciBJL08gc3VwcG9ydCBmb3Igbm9uLXdlYiBhcHBsaWNhdGlvbnMuCiAqCiAqICoqSW1wb3J0YW50OioqIEJyb3dzZXItYmFzZWQgYXBwbGljYXRpb25zIGNhbid0IHVzZSB0aGlzIGxpYnJhcnkuCiAqIE9ubHkgc2VydmVycywgY29tbWFuZC1saW5lIHNjcmlwdHMsIGFuZCBGbHV0dGVyIG1vYmlsZSBhcHBzIGNhbiBpbXBvcnQKICogYW5kIHVzZSBkYXJ0OmlvLgogKgogKiBUaGlzIGxpYnJhcnkgYWxsb3dzIHlvdSB0byB3b3JrIHdpdGggZmlsZXMsIGRpcmVjdG9yaWVzLAogKiBzb2NrZXRzLCBwcm9jZXNzZXMsIEhUVFAgc2VydmVycyBhbmQgY2xpZW50cywgYW5kIG1vcmUuCiAqIE1hbnkgb3BlcmF0aW9ucyByZWxhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgYXJlIGFzeW5jaHJvbm91cwogKiBhbmQgYXJlIGhhbmRsZWQgdXNpbmcgW0Z1dHVyZV1zIG9yIFtTdHJlYW1dcywgYm90aCBvZiB3aGljaAogKiBhcmUgZGVmaW5lZCBpbiB0aGUgW2RhcnQ6YXN5bmMKICogbGlicmFyeV0oLi4vZGFydC1hc3luYy9kYXJ0LWFzeW5jLWxpYnJhcnkuaHRtbCkuCiAqCiAqIFRvIHVzZSB0aGUgZGFydDppbyBsaWJyYXJ5IGluIHlvdXIgY29kZToKICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqIEZvciBhbiBpbnRyb2R1Y3Rpb24gdG8gSS9PIGluIERhcnQsIHNlZSB0aGUgW2RhcnQ6aW8gbGlicmFyeQogKiB0b3VyXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZGFydC12bS9pby1saWJyYXJ5LXRvdXIpLgogKgogKiAjIyBGaWxlLCBEaXJlY3RvcnksIGFuZCBMaW5rCiAqCiAqIEFuIGluc3RhbmNlIG9mIFtGaWxlXSwgW0RpcmVjdG9yeV0sIG9yIFtMaW5rXSByZXByZXNlbnRzIGEgZmlsZSwKICogZGlyZWN0b3J5LCBvciBsaW5rLCByZXNwZWN0aXZlbHksIGluIHRoZSBuYXRpdmUgZmlsZSBzeXN0ZW0uCiAqCiAqIFlvdSBjYW4gbWFuaXB1bGF0ZSB0aGUgZmlsZSBzeXN0ZW0gdGhyb3VnaCBvYmplY3RzIG9mIHRoZXNlIHR5cGVzLgogKiBGb3IgZXhhbXBsZSwgeW91IGNhbiByZW5hbWUgYSBmaWxlIG9yIGRpcmVjdG9yeToKICoKICogICAgIEZpbGUgbXlGaWxlID0gbmV3IEZpbGUoJ215RmlsZS50eHQnKTsKICogICAgIG15RmlsZS5yZW5hbWUoJ3lvdXJGaWxlLnR4dCcpLnRoZW4oKF8pID0+IHByaW50KCdmaWxlIHJlbmFtZWQnKSk7CiAqCiAqIE1hbnkgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgRmlsZSwgRGlyZWN0b3J5LCBhbmQgTGluayBjbGFzc2VzCiAqIHJ1biBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJuIGEgRnV0dXJlLgogKgogKiAjIyBGaWxlU3lzdGVtRW50aXR5CiAqCiAqIEZpbGUsIERpcmVjdG9yeSwgYW5kIExpbmsgYWxsIGV4dGVuZCBbRmlsZVN5c3RlbUVudGl0eV0uCiAqIEluIGFkZGl0aW9uIHRvIGJlaW5nIHRoZSBzdXBlcmNsYXNzIGZvciB0aGVzZSBjbGFzc2VzLAogKiBGaWxlU3lzdGVtRW50aXR5IGhhcyBhIG51bWJlciBvZiBzdGF0aWMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHBhdGhzLgogKgogKiBUbyBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXRoLAogKiB5b3UgY2FuIHVzZSB0aGUgRmlsZVN5c3RlbUVudGl0eSBzdGF0aWMgbWV0aG9kcwogKiBzdWNoIGFzICdpc0RpcmVjdG9yeScsICdpc0ZpbGUnLCBhbmQgJ2V4aXN0cycuCiAqIEJlY2F1c2UgZmlsZSBzeXN0ZW0gYWNjZXNzIGludm9sdmVzIEkvTywgdGhlc2UgbWV0aG9kcwogKiBhcmUgYXN5bmNocm9ub3VzIGFuZCByZXR1cm4gYSBGdXR1cmUuCiAqCiAqICAgICBGaWxlU3lzdGVtRW50aXR5LmlzRGlyZWN0b3J5KG15UGF0aCkudGhlbigoaXNEaXIpIHsKICogICAgICAgaWYgKGlzRGlyKSB7CiAqICAgICAgICAgcHJpbnQoJyRteVBhdGggaXMgYSBkaXJlY3RvcnknKTsKICogICAgICAgfSBlbHNlIHsKICogICAgICAgICBwcmludCgnJG15UGF0aCBpcyBub3QgYSBkaXJlY3RvcnknKTsKICogICAgICAgfQogKiAgICAgfSk7CiAqCiAqICMjIEh0dHBTZXJ2ZXIgYW5kIEh0dHBDbGllbnQKICoKICogVGhlIGNsYXNzZXMgW0h0dHBTZXJ2ZXJdIGFuZCBbSHR0cENsaWVudF0KICogcHJvdmlkZSBIVFRQIHNlcnZlciBhbmQgSFRUUCBjbGllbnQgZnVuY3Rpb25hbGl0eS4KICoKICogVGhlIFtIdHRwU2VydmVyXSBjbGFzcyBwcm92aWRlcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBmb3IKICogaW1wbGVtZW50aW5nIGFuIEhUVFAgc2VydmVyLgogKiBGb3Igc29tZSBoaWdoZXItbGV2ZWwgYnVpbGRpbmctYmxvY2tzLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgdHJ5CiAqIHRoZSBbc2hlbGZdKGh0dHBzOi8vcHViLmRhcnRsYW5nLm9yZy9wYWNrYWdlcy9zaGVsZikKICogcHViIHBhY2thZ2UsIHdoaWNoIGNvbnRhaW5zCiAqIGEgc2V0IG9mIGhpZ2gtbGV2ZWwgY2xhc3NlcyB0aGF0LCB0b2dldGhlciB3aXRoIHRoZSBbSHR0cFNlcnZlcl0gY2xhc3MKICogaW4gdGhpcyBsaWJyYXJ5LCBtYWtlIGl0IGVhc2llciB0byBpbXBsZW1lbnQgSFRUUCBzZXJ2ZXJzLgogKgogKiAjIyBQcm9jZXNzCiAqCiAqIFRoZSBbUHJvY2Vzc10gY2xhc3MgcHJvdmlkZXMgYSB3YXkgdG8gcnVuIGEgcHJvY2VzcyBvbgogKiB0aGUgbmF0aXZlIG1hY2hpbmUuCiAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgc3Bhd25zIGEgcHJvY2VzcyB0aGF0IHJlY3Vyc2l2ZWx5IGxpc3RzCiAqIHRoZSBmaWxlcyB1bmRlciBgd2ViYC4KICoKICogICAgIFByb2Nlc3Muc3RhcnQoJ2xzJywgWyctUicsICd3ZWInXSkudGhlbigocHJvY2VzcykgewogKiAgICAgICBzdGRvdXQuYWRkU3RyZWFtKHByb2Nlc3Muc3Rkb3V0KTsKICogICAgICAgc3RkZXJyLmFkZFN0cmVhbShwcm9jZXNzLnN0ZGVycik7CiAqICAgICAgIHByb2Nlc3MuZXhpdENvZGUudGhlbihwcmludCk7CiAqICAgICB9KTsKICoKICogVXNpbmcgYHN0YXJ0KClgIHJldHVybnMgYSBGdXR1cmUsIHdoaWNoIGNvbXBsZXRlcyB3aXRoIGEgW1Byb2Nlc3NdIG9iamVjdAogKiB3aGVuIHRoZSBwcm9jZXNzIGhhcyBzdGFydGVkLiBUaGlzIFtQcm9jZXNzXSBvYmplY3QgYWxsb3dzIHlvdSB0byBpbnRlcmFjdAogKiB3aXRoIHRoZSBwcm9jZXNzIHdoaWxlIGl0IGlzIHJ1bm5pbmcuIFVzaW5nIGBydW4oKWAgcmV0dXJucyBhIEZ1dHVyZSwgd2hpY2gKICogY29tcGxldGVzIHdpdGggYSBbUHJvY2Vzc1Jlc3VsdF0gb2JqZWN0IHdoZW4gdGhlIHNwYXduZWQgcHJvY2VzcyBoYXMKICogdGVybWluYXRlZC4gVGhpcyBbUHJvY2Vzc1Jlc3VsdF0gb2JqZWN0IGNvbGxlY3RzIHRoZSBvdXRwdXQgYW5kIGV4aXQgY29kZQogKiBmcm9tIHRoZSBwcm9jZXNzLgogKgogKiBXaGVuIHVzaW5nIGBzdGFydCgpYCwKICogeW91IG5lZWQgdG8gcmVhZCBhbGwgZGF0YSBjb21pbmcgb24gdGhlIHN0ZG91dCBhbmQgc3RkZXJyIHN0cmVhbXMgb3RoZXJ3aXNlCiAqIHRoZSBzeXN0ZW0gcmVzb3VyY2VzIHdpbGwgbm90IGJlIGZyZWVkLgogKgogKiAjIyBXZWJTb2NrZXQKICoKICogVGhlIFtXZWJTb2NrZXRdIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSB3ZWIgc29ja2V0IHByb3RvY29sLiBUaGlzCiAqIGFsbG93cyBmdWxsLWR1cGxleCBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIGFwcGxpY2F0aW9ucy4KICoKICogQSB3ZWIgc29ja2V0IHNlcnZlciB1c2VzIGEgbm9ybWFsIEhUVFAgc2VydmVyIGZvciBhY2NlcHRpbmcgd2ViIHNvY2tldAogKiBjb25uZWN0aW9ucy4gVGhlIGluaXRpYWwgaGFuZHNoYWtlIGlzIGEgSFRUUCByZXF1ZXN0IHdoaWNoIGlzIHRoZW4gdXBncmFkZWQgdG8gYQogKiB3ZWIgc29ja2V0IGNvbm5lY3Rpb24uCiAqIFRoZSBzZXJ2ZXIgdXBncmFkZXMgdGhlIHJlcXVlc3QgdXNpbmcgW1dlYlNvY2tldFRyYW5zZm9ybWVyXQogKiBhbmQgbGlzdGVucyBmb3IgdGhlIGRhdGEgb24gdGhlIHJldHVybmVkIHdlYiBzb2NrZXQuCiAqIEZvciBleGFtcGxlLCBoZXJlJ3MgYSBtaW5pIHNlcnZlciB0aGF0IGxpc3RlbnMgZm9yICd3cycgZGF0YQogKiBvbiBhIFdlYlNvY2tldDoKICoKICogICAgIHJ1blpvbmVkKCgpIGFzeW5jIHsKICogICAgICAgdmFyIHNlcnZlciA9IGF3YWl0IEh0dHBTZXJ2ZXIuYmluZCgnMTI3LjAuMC4xJywgNDA0MCk7CiAqICAgICAgIHNlcnZlci5saXN0ZW4oKEh0dHBSZXF1ZXN0IHJlcSkgYXN5bmMgewogKiAgICAgICAgIGlmIChyZXEudXJpLnBhdGggPT0gJy93cycpIHsKICogICAgICAgICAgIHZhciBzb2NrZXQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc2Zvcm1lci51cGdyYWRlKHJlcSk7CiAqICAgICAgICAgICBzb2NrZXQubGlzdGVuKGhhbmRsZU1zZyk7CiAqICAgICAgICAgfQogKiAgICAgICB9KTsKICogICAgIH0sIG9uRXJyb3I6IChlKSA9PiBwcmludCgiQW4gZXJyb3Igb2NjdXJyZWQuIikpOwogKgogKiBUaGUgY2xpZW50IGNvbm5lY3RzIHRvIHRoZSBXZWJTb2NrZXQgdXNpbmcgdGhlIGBjb25uZWN0KClgIG1ldGhvZAogKiBhbmQgYSBVUkkgdGhhdCB1c2VzIHRoZSBXZWIgU29ja2V0IHByb3RvY29sLgogKiBUaGUgY2xpZW50IGNhbiB3cml0ZSB0byB0aGUgV2ViU29ja2V0IHdpdGggdGhlIGBhZGQoKWAgbWV0aG9kLgogKiBGb3IgZXhhbXBsZSwKICoKICogICAgIHZhciBzb2NrZXQgPSBhd2FpdCBXZWJTb2NrZXQuY29ubmVjdCgnd3M6Ly8xMjcuMC4wLjE6NDA0MC93cycpOwogKiAgICAgc29ja2V0LmFkZCgnSGVsbG8sIFdvcmxkIScpOwogKgogKiBDaGVjayBvdXQgdGhlCiAqIFt3ZWJzb2NrZXRfc2FtcGxlXShodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2RhcnQtc2FtcGxlcy90cmVlL21hc3Rlci9odG1sNS93ZWIvd2Vic29ja2V0cy9iYXNpY3MpCiAqIGFwcCwgd2hpY2ggdXNlcyBXZWJTb2NrZXRzIHRvIGNvbW11bmljYXRlIHdpdGggYSBzZXJ2ZXIuCiAqCiAqICMjIFNvY2tldCBhbmQgU2VydmVyU29ja2V0CiAqCiAqIENsaWVudHMgYW5kIHNlcnZlcnMgdXNlIFtTb2NrZXRdcyB0byBjb21tdW5pY2F0ZSB1c2luZyB0aGUgVENQIHByb3RvY29sLgogKiBVc2UgW1NlcnZlclNvY2tldF0gb24gdGhlIHNlcnZlciBzaWRlIGFuZCBbU29ja2V0XSBvbiB0aGUgY2xpZW50LgogKiBUaGUgc2VydmVyIGNyZWF0ZXMgYSBsaXN0ZW5pbmcgc29ja2V0IHVzaW5nIHRoZSBgYmluZCgpYCBtZXRob2QgYW5kCiAqIHRoZW4gbGlzdGVucyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgb24gdGhlIHNvY2tldC4gRm9yIGV4YW1wbGU6CiAqCiAqICAgICBTZXJ2ZXJTb2NrZXQuYmluZCgnMTI3LjAuMC4xJywgNDA0MSkKICogICAgICAgLnRoZW4oKHNlcnZlclNvY2tldCkgewogKiAgICAgICAgIHNlcnZlclNvY2tldC5saXN0ZW4oKHNvY2tldCkgewogKiAgICAgICAgICAgc29ja2V0LnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpLmxpc3RlbihwcmludCk7CiAqICAgICAgICAgfSk7CiAqICAgICAgIH0pOwogKgogKiBBIGNsaWVudCBjb25uZWN0cyBhIFNvY2tldCB1c2luZyB0aGUgYGNvbm5lY3QoKWAgbWV0aG9kLAogKiB3aGljaCByZXR1cm5zIGEgRnV0dXJlLgogKiBVc2luZyBgd3JpdGUoKWAsIGB3cml0ZWxuKClgLCBvciBgd3JpdGVBbGwoKWAgYXJlIHRoZSBlYXNpZXN0IHdheXMgdG8KICogc2VuZCBkYXRhIG92ZXIgdGhlIHNvY2tldC4KICogRm9yIGV4YW1wbGU6CiAqCiAqICAgICBTb2NrZXQuY29ubmVjdCgnMTI3LjAuMC4xJywgNDA0MSkudGhlbigoc29ja2V0KSB7CiAqICAgICAgIHNvY2tldC53cml0ZSgnSGVsbG8sIFdvcmxkIScpOwogKiAgICAgfSk7CiAqCiAqIEJlc2lkZXMgW1NvY2tldF0gYW5kIFtTZXJ2ZXJTb2NrZXRdLCB0aGUgW1Jhd1NvY2tldF0gYW5kCiAqIFtSYXdTZXJ2ZXJTb2NrZXRdIGNsYXNzZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG93ZXItbGV2ZWwgYWNjZXNzCiAqIHRvIGFzeW5jIHNvY2tldCBJTy4KICoKICogIyMgU3RhbmRhcmQgb3V0cHV0LCBlcnJvciwgYW5kIGlucHV0IHN0cmVhbXMKICoKICogVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGVycm9yLCBhbmQgaW5wdXQKICogc3RyZWFtcywgbmFtZWQgJ3N0ZG91dCcsICdzdGRlcnInLCBhbmQgJ3N0ZGluJywgcmVzcGVjdGl2ZWx5LgogKgogKiBUaGUgc3Rkb3V0IGFuZCBzdGRlcnIgc3RyZWFtcyBhcmUgYm90aCBbSU9TaW5rXXMgYW5kIGhhdmUgdGhlIHNhbWUgc2V0CiAqIG9mIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMuCiAqCiAqIFRvIHdyaXRlIGEgc3RyaW5nIHRvICdzdGRvdXQnOgogKgogKiAgICAgc3Rkb3V0LndyaXRlbG4oJ0hlbGxvLCBXb3JsZCEnKTsKICoKICogVG8gd3JpdGUgYSBsaXN0IG9mIG9iamVjdHMgdG8gJ3N0ZGVycic6CiAqCiAqICAgICBzdGRlcnIud3JpdGVBbGwoWyAnVGhhdCAnLCAnaXMgJywgJ2FuICcsICdlcnJvci4nLCAnXG4nXSk7CiAqCiAqIFRoZSBzdGFuZGFyZCBpbnB1dCBzdHJlYW0gaXMgYSB0cnVlIFtTdHJlYW1dLCBzbyBpdCBpbmhlcml0cwogKiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGZyb20gdGhlIFN0cmVhbSBjbGFzcy4KICoKICogVG8gcmVhZCB0ZXh0IHN5bmNocm9ub3VzbHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lCiAqICh0aGUgcHJvZ3JhbSBibG9ja3Mgd2FpdGluZyBmb3IgdXNlciB0byB0eXBlIGluZm9ybWF0aW9uKToKICoKICogICAgICBTdHJpbmcgaW5wdXRUZXh0ID0gc3RkaW4ucmVhZExpbmVTeW5jKCk7CiAqCiAqIHtAY2F0ZWdvcnkgVk19CiAqLwpsaWJyYXJ5IGRhcnQuaW87CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6X2ludGVybmFsJyBoaWRlIFN5bWJvbDsKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nCiAgICBzaG93IEhhc2hNYXAsIEhhc2hTZXQsIFF1ZXVlLCBMaXN0UXVldWUsIE1hcEJhc2UsIFVubW9kaWZpYWJsZU1hcFZpZXc7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OmRldmVsb3BlcicgaGlkZSBsb2c7CmltcG9ydCAnZGFydDppc29sYXRlJzsKaW1wb3J0ICdkYXJ0Om1hdGgnOwppbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CgpleHBvcnQgJ2RhcnQ6X2h0dHAnOwpleHBvcnQgJ2RhcnQ6X2ludGVybmFsJyBzaG93IEh0dHBTdGF0dXM7CgpwYXJ0ICdieXRlc19idWlsZGVyLmRhcnQnOwpwYXJ0ICdjb21tb24uZGFydCc7CnBhcnQgJ2RhdGFfdHJhbnNmb3JtZXIuZGFydCc7CnBhcnQgJ2RpcmVjdG9yeS5kYXJ0JzsKcGFydCAnZGlyZWN0b3J5X2ltcGwuZGFydCc7CnBhcnQgJ2VtYmVkZGVyX2NvbmZpZy5kYXJ0JzsKcGFydCAnZXZlbnRoYW5kbGVyLmRhcnQnOwpwYXJ0ICdmaWxlLmRhcnQnOwpwYXJ0ICdmaWxlX2ltcGwuZGFydCc7CnBhcnQgJ2ZpbGVfc3lzdGVtX2VudGl0eS5kYXJ0JzsKcGFydCAnaW9fcmVzb3VyY2VfaW5mby5kYXJ0JzsKcGFydCAnaW9fc2luay5kYXJ0JzsKcGFydCAnaW9fc2VydmljZS5kYXJ0JzsKcGFydCAnbGluay5kYXJ0JzsKcGFydCAnbmFtZXNwYWNlX2ltcGwuZGFydCc7CnBhcnQgJ292ZXJyaWRlcy5kYXJ0JzsKcGFydCAncGxhdGZvcm0uZGFydCc7CnBhcnQgJ3BsYXRmb3JtX2ltcGwuZGFydCc7CnBhcnQgJ3Byb2Nlc3MuZGFydCc7CnBhcnQgJ3NlY3VyZV9zZXJ2ZXJfc29ja2V0LmRhcnQnOwpwYXJ0ICdzZWN1cmVfc29ja2V0LmRhcnQnOwpwYXJ0ICdzZWN1cml0eV9jb250ZXh0LmRhcnQnOwpwYXJ0ICdzZXJ2aWNlX29iamVjdC5kYXJ0JzsKcGFydCAnc29ja2V0LmRhcnQnOwpwYXJ0ICdzdGRpby5kYXJ0JzsKcGFydCAnc3RyaW5nX3RyYW5zZm9ybWVyLmRhcnQnOwpwYXJ0ICdzeW5jX3NvY2tldC5kYXJ0JzsKgOUATk48AQRHA0VKFAM8O0A/IjQDLAMZA0A8AyADREADRjQDLUkDQisDFwM8OksDJDMyOikDOxYsEjALCwMgAy02Az8gRDgfSj4DDgM6F0saAzsrKycLA01OT0hNFQMZTysDEANMTQNKVBpAOEATAxtAMShDJw0NOANFMEIQA0ckAxFpPAMeA0xFR0UDLCAqOw8NAzwbSR4QAzkoCwM8QhcDMAM/QQNKHgMiAygDKwNCA0AxAzQ+AzEDEgQRARUlGUsXIhcUGgEVKQEbFB4XHB0aEhcgHhUYEhwXFhsVIhseHBQTIBkBB2RhcnQ6aW8vb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9maWxlX3BhdGNoLmRhcnSz2S8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgX0ZpbGUgewogIEBwYXRjaAogIHN0YXRpYyBfZXhpc3RzKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkgbmF0aXZlICJGaWxlX0V4aXN0cyI7CiAgQHBhdGNoCiAgc3RhdGljIF9jcmVhdGUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKSBuYXRpdmUgIkZpbGVfQ3JlYXRlIjsKICBAcGF0Y2gKICBzdGF0aWMgX2NyZWF0ZUxpbmsoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBTdHJpbmcgdGFyZ2V0KQogICAgICBuYXRpdmUgIkZpbGVfQ3JlYXRlTGluayI7CiAgQHBhdGNoCiAgc3RhdGljIF9saW5rVGFyZ2V0KF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX0xpbmtUYXJnZXQiOwogIEBwYXRjaAogIHN0YXRpYyBfZGVsZXRlTmF0aXZlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX0RlbGV0ZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9kZWxldGVMaW5rTmF0aXZlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX0RlbGV0ZUxpbmsiOwogIEBwYXRjaAogIHN0YXRpYyBfcmVuYW1lKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3Qgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9SZW5hbWUiOwogIEBwYXRjaAogIHN0YXRpYyBfcmVuYW1lTGluayhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfUmVuYW1lTGluayI7CiAgQHBhdGNoCiAgc3RhdGljIF9jb3B5KF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3Qgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9Db3B5IjsKICBAcGF0Y2gKICBzdGF0aWMgX2xlbmd0aEZyb21QYXRoKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJGaWxlX0xlbmd0aEZyb21QYXRoIjsKICBAcGF0Y2gKICBzdGF0aWMgX2xhc3RNb2RpZmllZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRmlsZV9MYXN0TW9kaWZpZWQiOwogIEBwYXRjaAogIHN0YXRpYyBfc2V0TGFzdE1vZGlmaWVkKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgaW50IG1pbGxpcykKICAgICAgbmF0aXZlICJGaWxlX1NldExhc3RNb2RpZmllZCI7CiAgQHBhdGNoCiAgc3RhdGljIF9sYXN0QWNjZXNzZWQoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKQogICAgICBuYXRpdmUgIkZpbGVfTGFzdEFjY2Vzc2VkIjsKICBAcGF0Y2gKICBzdGF0aWMgX3NldExhc3RBY2Nlc3NlZChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGludCBtaWxsaXMpCiAgICAgIG5hdGl2ZSAiRmlsZV9TZXRMYXN0QWNjZXNzZWQiOwogIEBwYXRjaAogIHN0YXRpYyBfb3BlbihfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGludCBtb2RlKQogICAgICBuYXRpdmUgIkZpbGVfT3BlbiI7CiAgQHBhdGNoCiAgc3RhdGljIGludCBfb3BlblN0ZGlvKGludCBmZCkgbmF0aXZlICJGaWxlX09wZW5TdGRpbyI7Cn0KCkBwYXRjaApjbGFzcyBfUmFuZG9tQWNjZXNzRmlsZU9wcyB7CiAgQHBhdGNoCiAgZmFjdG9yeSBfUmFuZG9tQWNjZXNzRmlsZU9wcyhpbnQgcG9pbnRlcikgPT4KICAgICAgbmV3IF9SYW5kb21BY2Nlc3NGaWxlT3BzSW1wbChwb2ludGVyKTsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfUmFuZG9tQWNjZXNzRmlsZU9wc0ltcGwgZXh0ZW5kcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEKICAgIGltcGxlbWVudHMgX1JhbmRvbUFjY2Vzc0ZpbGVPcHMgewogIF9SYW5kb21BY2Nlc3NGaWxlT3BzSW1wbC5fKCk7CgogIGZhY3RvcnkgX1JhbmRvbUFjY2Vzc0ZpbGVPcHNJbXBsKGludCBwb2ludGVyKSA9PgogICAgICBuZXcgX1JhbmRvbUFjY2Vzc0ZpbGVPcHNJbXBsLl8oKS4uX3NldFBvaW50ZXIocG9pbnRlcik7CgogIHZvaWQgX3NldFBvaW50ZXIoaW50IHBvaW50ZXIpIG5hdGl2ZSAiRmlsZV9TZXRQb2ludGVyIjsKCiAgaW50IGdldFBvaW50ZXIoKSBuYXRpdmUgIkZpbGVfR2V0UG9pbnRlciI7CiAgaW50IGNsb3NlKCkgbmF0aXZlICJGaWxlX0Nsb3NlIjsKICByZWFkQnl0ZSgpIG5hdGl2ZSAiRmlsZV9SZWFkQnl0ZSI7CiAgcmVhZChpbnQgYnl0ZXMpIG5hdGl2ZSAiRmlsZV9SZWFkIjsKICByZWFkSW50byhMaXN0PGludD4gYnVmZmVyLCBpbnQgc3RhcnQsIGludCBlbmQpIG5hdGl2ZSAiRmlsZV9SZWFkSW50byI7CiAgd3JpdGVCeXRlKGludCB2YWx1ZSkgbmF0aXZlICJGaWxlX1dyaXRlQnl0ZSI7CiAgd3JpdGVGcm9tKExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCkgbmF0aXZlICJGaWxlX1dyaXRlRnJvbSI7CiAgcG9zaXRpb24oKSBuYXRpdmUgIkZpbGVfUG9zaXRpb24iOwogIHNldFBvc2l0aW9uKGludCBwb3NpdGlvbikgbmF0aXZlICJGaWxlX1NldFBvc2l0aW9uIjsKICB0cnVuY2F0ZShpbnQgbGVuZ3RoKSBuYXRpdmUgIkZpbGVfVHJ1bmNhdGUiOwogIGxlbmd0aCgpIG5hdGl2ZSAiRmlsZV9MZW5ndGgiOwogIGZsdXNoKCkgbmF0aXZlICJGaWxlX0ZsdXNoIjsKICBsb2NrKGludCBsb2NrLCBpbnQgc3RhcnQsIGludCBlbmQpIG5hdGl2ZSAiRmlsZV9Mb2NrIjsKfQoKY2xhc3MgX1dhdGNoZXJQYXRoIHsKICBmaW5hbCBpbnQgcGF0aElkOwogIGZpbmFsIFN0cmluZyBwYXRoOwogIGZpbmFsIGludCBldmVudHM7CiAgaW50IGNvdW50ID0gMDsKICBfV2F0Y2hlclBhdGgodGhpcy5wYXRoSWQsIHRoaXMucGF0aCwgdGhpcy5ldmVudHMpOwp9CgpAcGF0Y2gKY2xhc3MgX0ZpbGVTeXN0ZW1XYXRjaGVyIHsKICB2b2lkIF9wYXRoV2F0Y2hlZEVuZCgpOwoKICBzdGF0aWMgaW50IF9pZDsKICBzdGF0aWMgZmluYWwgTWFwPGludCwgX1dhdGNoZXJQYXRoPiBfaWRNYXAgPSB7fTsKCiAgZmluYWwgU3RyaW5nIF9wYXRoOwogIGZpbmFsIGludCBfZXZlbnRzOwogIGZpbmFsIGJvb2wgX3JlY3Vyc2l2ZTsKCiAgX1dhdGNoZXJQYXRoIF93YXRjaGVyUGF0aDsKCiAgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRXZlbnQ+IF9icm9hZGNhc3RDb250cm9sbGVyOwoKICBAcGF0Y2gKICBzdGF0aWMgU3RyZWFtPEZpbGVTeXN0ZW1FdmVudD4gX3dhdGNoKAogICAgICBTdHJpbmcgcGF0aCwgaW50IGV2ZW50cywgYm9vbCByZWN1cnNpdmUpIHsKICAgIGlmIChQbGF0Zm9ybS5pc0xpbnV4KSB7CiAgICAgIHJldHVybiBuZXcgX0lub3RpZnlGaWxlU3lzdGVtV2F0Y2hlcihwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSkuX3N0cmVhbTsKICAgIH0KICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgcmV0dXJuIG5ldyBfV2luMzJGaWxlU3lzdGVtV2F0Y2hlcihwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSkuX3N0cmVhbTsKICAgIH0KICAgIGlmIChQbGF0Zm9ybS5pc01hY09TKSB7CiAgICAgIHJldHVybiBuZXcgX0ZTRXZlbnRTdHJlYW1GaWxlU3lzdGVtV2F0Y2hlcihwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSkKICAgICAgICAgIC5fc3RyZWFtOwogICAgfQogICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgIkZpbGUgc3lzdGVtIHdhdGNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOwogIH0KCiAgX0ZpbGVTeXN0ZW1XYXRjaGVyLl8odGhpcy5fcGF0aCwgdGhpcy5fZXZlbnRzLCB0aGlzLl9yZWN1cnNpdmUpIHsKICAgIGlmICghaXNTdXBwb3J0ZWQpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiRmlsZSBzeXN0ZW0gd2F0Y2hpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIiwgX3BhdGgpOwogICAgfQogICAgX2Jyb2FkY2FzdENvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRXZlbnQ+LmJyb2FkY2FzdCgKICAgICAgICBvbkxpc3RlbjogX2xpc3Rlbiwgb25DYW5jZWw6IF9jYW5jZWwpOwogIH0KCiAgU3RyZWFtPEZpbGVTeXN0ZW1FdmVudD4gZ2V0IF9zdHJlYW0gPT4gX2Jyb2FkY2FzdENvbnRyb2xsZXIuc3RyZWFtOwoKICB2b2lkIF9saXN0ZW4oKSB7CiAgICBpZiAoX2lkID09IG51bGwpIHsKICAgICAgdHJ5IHsKICAgICAgICBfaWQgPSBfaW5pdFdhdGNoZXIoKTsKICAgICAgICBfbmV3V2F0Y2hlcigpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgX2Jyb2FkY2FzdENvbnRyb2xsZXIuYWRkRXJyb3IobmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaWxlIHN5c3RlbSBlbnRpdHkgd2F0Y2hlciIsIG51bGwsIGUpKTsKICAgICAgICBfYnJvYWRjYXN0Q29udHJvbGxlci5jbG9zZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgdmFyIHBhdGhJZDsKICAgIHRyeSB7CiAgICAgIHBhdGhJZCA9CiAgICAgICAgICBfd2F0Y2hQYXRoKF9pZCwgX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcGF0aCwgX2V2ZW50cywgX3JlY3Vyc2l2ZSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIF9icm9hZGNhc3RDb250cm9sbGVyCiAgICAgICAgICAuYWRkRXJyb3IobmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkZhaWxlZCB0byB3YXRjaCBwYXRoIiwgX3BhdGgsIGUpKTsKICAgICAgX2Jyb2FkY2FzdENvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFfaWRNYXAuY29udGFpbnNLZXkocGF0aElkKSkgewogICAgICBfaWRNYXBbcGF0aElkXSA9IG5ldyBfV2F0Y2hlclBhdGgocGF0aElkLCBfcGF0aCwgX2V2ZW50cyk7CiAgICB9CiAgICBfd2F0Y2hlclBhdGggPSBfaWRNYXBbcGF0aElkXTsKICAgIF93YXRjaGVyUGF0aC5jb3VudCsrOwogICAgX3BhdGhXYXRjaGVkKCkucGlwZShfYnJvYWRjYXN0Q29udHJvbGxlcik7CiAgfQoKICB2b2lkIF9jYW5jZWwoKSB7CiAgICBpZiAoX3dhdGNoZXJQYXRoICE9IG51bGwpIHsKICAgICAgYXNzZXJ0KF93YXRjaGVyUGF0aC5jb3VudCA+IDApOwogICAgICBfd2F0Y2hlclBhdGguY291bnQtLTsKICAgICAgaWYgKF93YXRjaGVyUGF0aC5jb3VudCA9PSAwKSB7CiAgICAgICAgX3Vud2F0Y2hQYXRoKF9pZCwgX3dhdGNoZXJQYXRoLnBhdGhJZCk7CiAgICAgICAgX3BhdGhXYXRjaGVkRW5kKCk7CiAgICAgICAgX2lkTWFwLnJlbW92ZShfd2F0Y2hlclBhdGgucGF0aElkKTsKICAgICAgfQogICAgICBfd2F0Y2hlclBhdGggPSBudWxsOwogICAgfQogICAgaWYgKF9pZE1hcC5pc0VtcHR5ICYmIF9pZCAhPSBudWxsKSB7CiAgICAgIF9jbG9zZVdhdGNoZXIoX2lkKTsKICAgICAgX2RvbmVXYXRjaGVyKCk7CiAgICAgIF9pZCA9IG51bGw7CiAgICB9CiAgfQoKICAvLyBDYWxsZWQgd2hlbiAoYW5kIGFmdGVyKSBhIG5ldyB3YXRjaGVyIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIGF2YWlsYWJsZS4KICB2b2lkIF9uZXdXYXRjaGVyKCkge30KICAvLyBDYWxsZWQgd2hlbiBhIHdhdGNoZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KICB2b2lkIF9kb25lV2F0Y2hlcigpIHt9CiAgLy8gQ2FsbGVkIHdoZW4gYSBuZXcgcGF0aCBpcyBiZWluZyB3YXRjaGVkLgogIFN0cmVhbSBfcGF0aFdhdGNoZWQoKSB7fQogIC8vIENhbGxlZCB3aGVuIGEgcGF0aCBpcyBubyBsb25nZXIgYmVpbmcgd2F0Y2hlZC4KICB2b2lkIF9kb25lUGF0aFdhdGNoZWQoKSB7fQoKICBzdGF0aWMgX1dhdGNoZXJQYXRoIF9wYXRoRnJvbVBhdGhJZChpbnQgcGF0aElkKSB7CiAgICByZXR1cm4gX2lkTWFwW3BhdGhJZF07CiAgfQoKICBzdGF0aWMgU3RyZWFtIF9saXN0ZW5PblNvY2tldChpbnQgc29ja2V0SWQsIGludCBpZCwgaW50IHBhdGhJZCkgewogICAgdmFyIG5hdGl2ZSA9IG5ldyBfTmF0aXZlU29ja2V0LndhdGNoKHNvY2tldElkKTsKICAgIHZhciBzb2NrZXQgPSBuZXcgX1Jhd1NvY2tldChuYXRpdmUpOwogICAgcmV0dXJuIHNvY2tldC5leHBhbmQoKGV2ZW50KSB7CiAgICAgIHZhciBzdG9wcyA9IFtdOwogICAgICB2YXIgZXZlbnRzID0gW107CiAgICAgIHZhciBwYWlyID0ge307CiAgICAgIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC5yZWFkKSB7CiAgICAgICAgU3RyaW5nIGdldFBhdGgoZXZlbnQpIHsKICAgICAgICAgIHZhciBwYXRoID0gX3BhdGhGcm9tUGF0aElkKGV2ZW50WzRdKS5wYXRoOwogICAgICAgICAgaWYgKGV2ZW50WzJdICE9IG51bGwgJiYgZXZlbnRbMl0uaXNOb3RFbXB0eSkgewogICAgICAgICAgICBwYXRoICs9IFBsYXRmb3JtLnBhdGhTZXBhcmF0b3I7CiAgICAgICAgICAgIHBhdGggKz0gZXZlbnRbMl07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICB9CgogICAgICAgIGJvb2wgZ2V0SXNEaXIoZXZlbnQpIHsKICAgICAgICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgICAgICAgLy8gV2luZG93cyBkb2VzIG5vdCBnZXQgJ2lzRGlyJyBhcyBwYXJ0IG9mIHRoZSBldmVudC4KICAgICAgICAgICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHkuaXNEaXJlY3RvcnlTeW5jKGdldFBhdGgoZXZlbnQpKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAoZXZlbnRbMF0gJiBGaWxlU3lzdGVtRXZlbnQuX2lzRGlyKSAhPSAwOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBhZGQoaWQsIGV2ZW50KSB7CiAgICAgICAgICBpZiAoKGV2ZW50LnR5cGUgJiBfcGF0aEZyb21QYXRoSWQoaWQpLmV2ZW50cykgPT0gMCkgcmV0dXJuOwogICAgICAgICAgZXZlbnRzLmFkZChbaWQsIGV2ZW50XSk7CiAgICAgICAgfQoKICAgICAgICB2b2lkIHJld3JpdGVNb3ZlKGV2ZW50LCBpc0RpcikgewogICAgICAgICAgaWYgKGV2ZW50WzNdKSB7CiAgICAgICAgICAgIGFkZChldmVudFs0XSwgbmV3IEZpbGVTeXN0ZW1DcmVhdGVFdmVudC5fKGdldFBhdGgoZXZlbnQpLCBpc0RpcikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWRkKGV2ZW50WzRdLCBuZXcgRmlsZVN5c3RlbURlbGV0ZUV2ZW50Ll8oZ2V0UGF0aChldmVudCksIGlzRGlyKSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpbnQgZXZlbnRDb3VudDsKICAgICAgICBkbyB7CiAgICAgICAgICBldmVudENvdW50ID0gMDsKICAgICAgICAgIGZvciAodmFyIGV2ZW50IGluIF9yZWFkRXZlbnRzKGlkLCBwYXRoSWQpKSB7CiAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgICAgZXZlbnRDb3VudCsrOwogICAgICAgICAgICBpbnQgcGF0aElkID0gZXZlbnRbNF07CiAgICAgICAgICAgIGlmICghX2lkTWFwLmNvbnRhaW5zS2V5KHBhdGhJZCkpIHsKICAgICAgICAgICAgICAvLyBQYXRoIGlzIG5vIGxvbmdlciBiZWluZyB3YXRoZWQuCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYm9vbCBpc0RpciA9IGdldElzRGlyKGV2ZW50KTsKICAgICAgICAgICAgdmFyIHBhdGggPSBnZXRQYXRoKGV2ZW50KTsKICAgICAgICAgICAgaWYgKChldmVudFswXSAmIEZpbGVTeXN0ZW1FdmVudC5jcmVhdGUpICE9IDApIHsKICAgICAgICAgICAgICBhZGQoZXZlbnRbNF0sIG5ldyBGaWxlU3lzdGVtQ3JlYXRlRXZlbnQuXyhwYXRoLCBpc0RpcikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoZXZlbnRbMF0gJiBGaWxlU3lzdGVtRXZlbnQubW9kaWZ5KSAhPSAwKSB7CiAgICAgICAgICAgICAgYWRkKGV2ZW50WzRdLCBuZXcgRmlsZVN5c3RlbU1vZGlmeUV2ZW50Ll8ocGF0aCwgaXNEaXIsIHRydWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKGV2ZW50WzBdICYgRmlsZVN5c3RlbUV2ZW50Ll9tb2RpZnlBdHRyaWJ1dGVzKSAhPSAwKSB7CiAgICAgICAgICAgICAgYWRkKGV2ZW50WzRdLCBuZXcgRmlsZVN5c3RlbU1vZGlmeUV2ZW50Ll8ocGF0aCwgaXNEaXIsIGZhbHNlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChldmVudFswXSAmIEZpbGVTeXN0ZW1FdmVudC5tb3ZlKSAhPSAwKSB7CiAgICAgICAgICAgICAgaW50IGxpbmsgPSBldmVudFsxXTsKICAgICAgICAgICAgICBpZiAobGluayA+IDApIHsKICAgICAgICAgICAgICAgIHBhaXIucHV0SWZBYnNlbnQocGF0aElkLCAoKSA9PiB7fSk7CiAgICAgICAgICAgICAgICBpZiAocGFpcltwYXRoSWRdLmNvbnRhaW5zS2V5KGxpbmspKSB7CiAgICAgICAgICAgICAgICAgIGFkZCgKICAgICAgICAgICAgICAgICAgICAgIGV2ZW50WzRdLAogICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVTeXN0ZW1Nb3ZlRXZlbnQuXygKICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKHBhaXJbcGF0aElkXVtsaW5rXSksIGlzRGlyLCBwYXRoKSk7CiAgICAgICAgICAgICAgICAgIHBhaXJbcGF0aElkXS5yZW1vdmUobGluayk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBwYWlyW3BhdGhJZF1bbGlua10gPSBldmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV3cml0ZU1vdmUoZXZlbnQsIGlzRGlyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChldmVudFswXSAmIEZpbGVTeXN0ZW1FdmVudC5kZWxldGUpICE9IDApIHsKICAgICAgICAgICAgICBhZGQoZXZlbnRbNF0sIG5ldyBGaWxlU3lzdGVtRGVsZXRlRXZlbnQuXyhwYXRoLCBpc0RpcikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoZXZlbnRbMF0gJiBGaWxlU3lzdGVtRXZlbnQuX2RlbGV0ZVNlbGYpICE9IDApIHsKICAgICAgICAgICAgICBhZGQoZXZlbnRbNF0sIG5ldyBGaWxlU3lzdGVtRGVsZXRlRXZlbnQuXyhwYXRoLCBpc0RpcikpOwogICAgICAgICAgICAgIC8vIFNpZ25hbCBkb25lIGV2ZW50LgogICAgICAgICAgICAgIHN0b3BzLmFkZChbZXZlbnRbNF0sIG51bGxdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKGV2ZW50Q291bnQgPiAwKTsKICAgICAgICAvLyBCZSBzdXJlIHRvIGNsZWFyIHRoaXMgbWFudWFsbHksIGFzIHRoZSBzb2NrZXRzIGFyZSBub3QgcmVhZCB0aHJvdWdoCiAgICAgICAgLy8gdGhlIF9OYXRpdmVTb2NrZXQgaW50ZXJmYWNlLgogICAgICAgIG5hdGl2ZS5hdmFpbGFibGUgPSAwOwogICAgICAgIGZvciAodmFyIG1hcCBpbiBwYWlyLnZhbHVlcykgewogICAgICAgICAgZm9yICh2YXIgZXZlbnQgaW4gbWFwLnZhbHVlcykgewogICAgICAgICAgICByZXdyaXRlTW92ZShldmVudCwgZ2V0SXNEaXIoZXZlbnQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQuY2xvc2VkKSB7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCkgewogICAgICB9IGVsc2UgewogICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgIH0KICAgICAgZXZlbnRzLmFkZEFsbChzdG9wcyk7CiAgICAgIHJldHVybiBldmVudHM7CiAgICB9KTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBib29sIGdldCBpc1N1cHBvcnRlZCBuYXRpdmUgIkZpbGVTeXN0ZW1XYXRjaGVyX0lzU3VwcG9ydGVkIjsKCiAgc3RhdGljIGludCBfaW5pdFdhdGNoZXIoKSBuYXRpdmUgIkZpbGVTeXN0ZW1XYXRjaGVyX0luaXRXYXRjaGVyIjsKICBzdGF0aWMgdm9pZCBfY2xvc2VXYXRjaGVyKGludCBpZCkgbmF0aXZlICJGaWxlU3lzdGVtV2F0Y2hlcl9DbG9zZVdhdGNoZXIiOwoKICBzdGF0aWMgaW50IF93YXRjaFBhdGgoaW50IGlkLCBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgU3RyaW5nIHBhdGgsIGludCBldmVudHMsCiAgICAgIGJvb2wgcmVjdXJzaXZlKSBuYXRpdmUgIkZpbGVTeXN0ZW1XYXRjaGVyX1dhdGNoUGF0aCI7CiAgc3RhdGljIHZvaWQgX3Vud2F0Y2hQYXRoKGludCBpZCwgaW50IHBhdGhfaWQpCiAgICAgIG5hdGl2ZSAiRmlsZVN5c3RlbVdhdGNoZXJfVW53YXRjaFBhdGgiOwogIHN0YXRpYyBMaXN0IF9yZWFkRXZlbnRzKGludCBpZCwgaW50IHBhdGhfaWQpCiAgICAgIG5hdGl2ZSAiRmlsZVN5c3RlbVdhdGNoZXJfUmVhZEV2ZW50cyI7CiAgc3RhdGljIGludCBfZ2V0U29ja2V0SWQoaW50IGlkLCBpbnQgcGF0aF9pZCkKICAgICAgbmF0aXZlICJGaWxlU3lzdGVtV2F0Y2hlcl9HZXRTb2NrZXRJZCI7Cn0KCmNsYXNzIF9Jbm90aWZ5RmlsZVN5c3RlbVdhdGNoZXIgZXh0ZW5kcyBfRmlsZVN5c3RlbVdhdGNoZXIgewogIHN0YXRpYyBmaW5hbCBNYXA8aW50LCBTdHJlYW1Db250cm9sbGVyPiBfaWRNYXAgPSB7fTsKICBzdGF0aWMgU3RyZWFtU3Vic2NyaXB0aW9uIF9zdWJzY3JpcHRpb247CgogIF9Jbm90aWZ5RmlsZVN5c3RlbVdhdGNoZXIocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpCiAgICAgIDogc3VwZXIuXyhwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CgogIHZvaWQgX25ld1dhdGNoZXIoKSB7CiAgICBpbnQgaWQgPSBfRmlsZVN5c3RlbVdhdGNoZXIuX2lkOwogICAgX3N1YnNjcmlwdGlvbiA9CiAgICAgICAgX0ZpbGVTeXN0ZW1XYXRjaGVyLl9saXN0ZW5PblNvY2tldChpZCwgaWQsIDApLmxpc3RlbigoZXZlbnQpIHsKICAgICAgaWYgKF9pZE1hcC5jb250YWluc0tleShldmVudFswXSkpIHsKICAgICAgICBpZiAoZXZlbnRbMV0gIT0gbnVsbCkgewogICAgICAgICAgX2lkTWFwW2V2ZW50WzBdXS5hZGQoZXZlbnRbMV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfaWRNYXBbZXZlbnRbMF1dLmNsb3NlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgX2RvbmVXYXRjaGVyKCkgewogICAgX3N1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICB9CgogIFN0cmVhbSBfcGF0aFdhdGNoZWQoKSB7CiAgICB2YXIgcGF0aElkID0gX3dhdGNoZXJQYXRoLnBhdGhJZDsKICAgIGlmICghX2lkTWFwLmNvbnRhaW5zS2V5KHBhdGhJZCkpIHsKICAgICAgX2lkTWFwW3BhdGhJZF0gPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRXZlbnQ+LmJyb2FkY2FzdCgpOwogICAgfQogICAgcmV0dXJuIF9pZE1hcFtwYXRoSWRdLnN0cmVhbTsKICB9CgogIHZvaWQgX3BhdGhXYXRjaGVkRW5kKCkgewogICAgdmFyIHBhdGhJZCA9IF93YXRjaGVyUGF0aC5wYXRoSWQ7CiAgICBpZiAoIV9pZE1hcC5jb250YWluc0tleShwYXRoSWQpKSByZXR1cm47CiAgICBfaWRNYXBbcGF0aElkXS5jbG9zZSgpOwogICAgX2lkTWFwLnJlbW92ZShwYXRoSWQpOwogIH0KfQoKY2xhc3MgX1dpbjMyRmlsZVN5c3RlbVdhdGNoZXIgZXh0ZW5kcyBfRmlsZVN5c3RlbVdhdGNoZXIgewogIFN0cmVhbVN1YnNjcmlwdGlvbiBfc3Vic2NyaXB0aW9uOwogIFN0cmVhbUNvbnRyb2xsZXIgX2NvbnRyb2xsZXI7CgogIF9XaW4zMkZpbGVTeXN0ZW1XYXRjaGVyKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKQogICAgICA6IHN1cGVyLl8ocGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwoKICBTdHJlYW0gX3BhdGhXYXRjaGVkKCkgewogICAgdmFyIHBhdGhJZCA9IF93YXRjaGVyUGF0aC5wYXRoSWQ7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPEZpbGVTeXN0ZW1FdmVudD4oKTsKICAgIF9zdWJzY3JpcHRpb24gPQogICAgICAgIF9GaWxlU3lzdGVtV2F0Y2hlci5fbGlzdGVuT25Tb2NrZXQocGF0aElkLCAwLCBwYXRoSWQpLmxpc3RlbigoZXZlbnQpIHsKICAgICAgYXNzZXJ0KGV2ZW50WzBdID09IHBhdGhJZCk7CiAgICAgIGlmIChldmVudFsxXSAhPSBudWxsKSB7CiAgICAgICAgX2NvbnRyb2xsZXIuYWRkKGV2ZW50WzFdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBfY29udHJvbGxlci5zdHJlYW07CiAgfQoKICB2b2lkIF9wYXRoV2F0Y2hlZEVuZCgpIHsKICAgIF9zdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICBfY29udHJvbGxlci5jbG9zZSgpOwogIH0KfQoKY2xhc3MgX0ZTRXZlbnRTdHJlYW1GaWxlU3lzdGVtV2F0Y2hlciBleHRlbmRzIF9GaWxlU3lzdGVtV2F0Y2hlciB7CiAgU3RyZWFtU3Vic2NyaXB0aW9uIF9zdWJzY3JpcHRpb247CiAgU3RyZWFtQ29udHJvbGxlciBfY29udHJvbGxlcjsKCiAgX0ZTRXZlbnRTdHJlYW1GaWxlU3lzdGVtV2F0Y2hlcihwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSkKICAgICAgOiBzdXBlci5fKHBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKCiAgU3RyZWFtIF9wYXRoV2F0Y2hlZCgpIHsKICAgIHZhciBwYXRoSWQgPSBfd2F0Y2hlclBhdGgucGF0aElkOwogICAgdmFyIHNvY2tldElkID0gX0ZpbGVTeXN0ZW1XYXRjaGVyLl9nZXRTb2NrZXRJZCgwLCBwYXRoSWQpOwogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRXZlbnQ+KCk7CiAgICBfc3Vic2NyaXB0aW9uID0KICAgICAgICBfRmlsZVN5c3RlbVdhdGNoZXIuX2xpc3Rlbk9uU29ja2V0KHNvY2tldElkLCAwLCBwYXRoSWQpLmxpc3RlbigoZXZlbnQpIHsKICAgICAgaWYgKGV2ZW50WzFdICE9IG51bGwpIHsKICAgICAgICBfY29udHJvbGxlci5hZGQoZXZlbnRbMV0pOwogICAgICB9IGVsc2UgewogICAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbTsKICB9CgogIHZvaWQgX3BhdGhXYXRjaGVkRW5kKCkgewogICAgX3N1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKVWludDhMaXN0IF9tYWtlVWludDhMaXN0VmlldyhVaW50OExpc3Qgc291cmNlLCBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgewogIHJldHVybiBuZXcgVWludDhMaXN0LnZpZXcoc291cmNlLmJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKfQqBpwBOTjwBIAEHDglQCVAJTSAJPiAJQBwJRCAJShwJTiAJSBoJQiQJQCIJTyUJQCIJTyUJQhoJOQIBBx0JLy0CARpAJiABMz4BOgEtIyUmSTBLJTcvIR85AgEVFBUUETUCAQcbGgESMwEWFRkBHQE6AQkpMRxNBh5LBhxKFAYjQwQBRBglTAZMLwQBRgETFwweFxQ/SiYQCAYQCg9OEhtQJA4GJ0EGIxovBAETICYcJTAbLAgbBikaFhIGBAFOGDAZLhs0HQE0GwQBRDQpIxYXFSogNTksHgwXCgEfJEJFDDsKAR5GIwoBKRpPE08MCgEYDRo3KRojLzEYDionPEcOPE0OR04OOiMeNDYXIDFGLRkuEhcrEA48Rw5BRyQrDgwiTygeJyoxDAozNw8XCBwVCAQBCUYBRE0BTzwwLi8tLy4CAT03KwE1KgEXJRRHKiAqESQKCAgEARgcBAEaJidKBiIEARsmLRwbBAIBOyQgATMqARomOxRPIh4jDx0ICB8EARscGQQCAUMkIAE7KgEaJj87FFEeIw8dCAgfBAEbHBkEAgEiUEMCAR1kYXJ0OmlvLXBhdGNoL2ZpbGVfcGF0Y2guZGFydDVvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL2lvX3NlcnZpY2VfcGF0Y2guZGFydIt9Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCmNsYXNzIF9JT1NlcnZpY2VQb3J0cyB7CiAgLy8gV2UgbGltaXQgdGhlIG51bWJlciBvZiBJTyBTZXJ2aWNlIHBvcnRzIHBlciBpc29sYXRlIHNvIHRoYXQgd2UgZG9uJ3QKICAvLyBzcGF3biB0b28gbWFueSB0aHJlYWRzIGFsbCBhdCBvbmNlLCB3aGljaCBjYW4gY3Jhc2ggdGhlIFZNIG9uIFdpbmRvd3MuCiAgc3RhdGljIGNvbnN0IGludCBtYXhQb3J0cyA9IDMyOwogIExpc3Q8U2VuZFBvcnQ+IF9wb3J0cyA9IDxTZW5kUG9ydD5bXTsKICBMaXN0PFNlbmRQb3J0PiBfZnJlZVBvcnRzID0gPFNlbmRQb3J0PltdOwogIE1hcDxpbnQsIFNlbmRQb3J0PiBfdXNlZFBvcnRzID0gbmV3IEhhc2hNYXA8aW50LCBTZW5kUG9ydD4oKTsKCiAgX0lPU2VydmljZVBvcnRzKCk7CgogIFNlbmRQb3J0IF9nZXRQb3J0KGludCBmb3JSZXF1ZXN0SWQpIHsKICAgIGlmIChfZnJlZVBvcnRzLmlzRW1wdHkgJiYgX3VzZWRQb3J0cy5sZW5ndGggPCBtYXhQb3J0cykgewogICAgICBmaW5hbCBTZW5kUG9ydCBwb3J0ID0gX25ld1NlcnZpY2VQb3J0KCk7CiAgICAgIF9wb3J0cy5hZGQocG9ydCk7CiAgICAgIF9mcmVlUG9ydHMuYWRkKHBvcnQpOwogICAgfQogICAgaWYgKCFfZnJlZVBvcnRzLmlzRW1wdHkpIHsKICAgICAgZmluYWwgU2VuZFBvcnQgcG9ydCA9IF9mcmVlUG9ydHMucmVtb3ZlTGFzdCgpOwogICAgICBhc3NlcnQoIV91c2VkUG9ydHMuY29udGFpbnNLZXkoZm9yUmVxdWVzdElkKSk7CiAgICAgIF91c2VkUG9ydHNbZm9yUmVxdWVzdElkXSA9IHBvcnQ7CiAgICAgIHJldHVybiBwb3J0OwogICAgfQogICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCB0aGUgbWF4IG51bWJlciBvZiBwb3J0cy4gUmUtdXNlIGFuCiAgICAvLyBleGlzdGluZyBvbmUuCiAgICBmaW5hbCBTZW5kUG9ydCBwb3J0ID0gX3BvcnRzW2ZvclJlcXVlc3RJZCAlIG1heFBvcnRzXTsKICAgIF91c2VkUG9ydHNbZm9yUmVxdWVzdElkXSA9IHBvcnQ7CiAgICByZXR1cm4gcG9ydDsKICB9CgogIHZvaWQgX3JldHVyblBvcnQoaW50IGZvclJlcXVlc3RJZCkgewogICAgZmluYWwgU2VuZFBvcnQgcG9ydCA9IF91c2VkUG9ydHMucmVtb3ZlKGZvclJlcXVlc3RJZCk7CiAgICBpZiAoIV91c2VkUG9ydHMudmFsdWVzLmNvbnRhaW5zKHBvcnQpKSB7CiAgICAgIF9mcmVlUG9ydHMuYWRkKHBvcnQpOwogICAgfQogIH0KCiAgc3RhdGljIFNlbmRQb3J0IF9uZXdTZXJ2aWNlUG9ydCgpIG5hdGl2ZSAiSU9TZXJ2aWNlX05ld1NlcnZpY2VQb3J0IjsKfQoKQHBhdGNoCmNsYXNzIF9JT1NlcnZpY2UgewogIHN0YXRpYyBfSU9TZXJ2aWNlUG9ydHMgX3NlcnZpY2VQb3J0cyA9IG5ldyBfSU9TZXJ2aWNlUG9ydHMoKTsKICBzdGF0aWMgUmF3UmVjZWl2ZVBvcnQgX3JlY2VpdmVQb3J0OwogIHN0YXRpYyBTZW5kUG9ydCBfcmVwbHlUb1BvcnQ7CiAgc3RhdGljIEhhc2hNYXA8aW50LCBDb21wbGV0ZXI+IF9tZXNzYWdlTWFwID0gbmV3IEhhc2hNYXA8aW50LCBDb21wbGV0ZXI+KCk7CiAgc3RhdGljIGludCBfaWQgPSAwOwoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlIF9kaXNwYXRjaChpbnQgcmVxdWVzdCwgTGlzdCBkYXRhKSB7CiAgICBpbnQgaWQ7CiAgICBkbyB7CiAgICAgIGlkID0gX2dldE5leHRJZCgpOwogICAgfSB3aGlsZSAoX21lc3NhZ2VNYXAuY29udGFpbnNLZXkoaWQpKTsKICAgIGZpbmFsIFNlbmRQb3J0IHNlcnZpY2VQb3J0ID0gX3NlcnZpY2VQb3J0cy5fZ2V0UG9ydChpZCk7CiAgICBfZW5zdXJlSW5pdGlhbGl6ZSgpOwogICAgZmluYWwgQ29tcGxldGVyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKICAgIF9tZXNzYWdlTWFwW2lkXSA9IGNvbXBsZXRlcjsKICAgIHRyeSB7CiAgICAgIHNlcnZpY2VQb3J0LnNlbmQoW2lkLCBfcmVwbHlUb1BvcnQsIHJlcXVlc3QsIGRhdGFdKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIF9tZXNzYWdlTWFwLnJlbW92ZShpZCkuY29tcGxldGUoZXJyb3IpOwogICAgICBpZiAoX21lc3NhZ2VNYXAubGVuZ3RoID09IDApIHsKICAgICAgICBfZmluYWxpemUoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICBzdGF0aWMgdm9pZCBfZW5zdXJlSW5pdGlhbGl6ZSgpIHsKICAgIGlmIChfcmVjZWl2ZVBvcnQgPT0gbnVsbCkgewogICAgICBfcmVjZWl2ZVBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKICAgICAgX3JlcGx5VG9Qb3J0ID0gX3JlY2VpdmVQb3J0LnNlbmRQb3J0OwogICAgICBfcmVjZWl2ZVBvcnQuaGFuZGxlciA9IChkYXRhKSB7CiAgICAgICAgYXNzZXJ0KGRhdGEgaXMgTGlzdCAmJiBkYXRhLmxlbmd0aCA9PSAyKTsKICAgICAgICBfbWVzc2FnZU1hcC5yZW1vdmUoZGF0YVswXSkuY29tcGxldGUoZGF0YVsxXSk7CiAgICAgICAgX3NlcnZpY2VQb3J0cy5fcmV0dXJuUG9ydChkYXRhWzBdKTsKICAgICAgICBpZiAoX21lc3NhZ2VNYXAubGVuZ3RoID09IDApIHsKICAgICAgICAgIF9maW5hbGl6ZSgpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICB9CgogIHN0YXRpYyB2b2lkIF9maW5hbGl6ZSgpIHsKICAgIF9pZCA9IDA7CiAgICBfcmVjZWl2ZVBvcnQuY2xvc2UoKTsKICAgIF9yZWNlaXZlUG9ydCA9IG51bGw7CiAgfQoKICBzdGF0aWMgaW50IF9nZXROZXh0SWQoKSB7CiAgICBpZiAoX2lkID09IDB4N0ZGRkZGRkYpIF9pZCA9IDA7CiAgICByZXR1cm4gX2lkKys7CiAgfQp9CmYATk48ASABGEpMIigsQAEVASg+LxgcBh81NScTBkQVOyURBAEnOy0cBgQBRwIBBxNAJiBOFgEJNAwJGSs9GTEhCjsWLiUVCAYdBAEkICssJjI3LCcXCgkGBAEcDRoZBAEcJBIEAgEjZGFydDppby1wYXRjaC9pb19zZXJ2aWNlX3BhdGNoLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9uYW1lc3BhY2VfcGF0Y2guZGFydIZbLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX05hbWVzcGFjZUltcGwgZXh0ZW5kcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEgaW1wbGVtZW50cyBfTmFtZXNwYWNlIHsKICBfTmFtZXNwYWNlSW1wbC5fKCk7CgogIHN0YXRpYyBfTmFtZXNwYWNlSW1wbCBfY3JlYXRlKF9OYW1lc3BhY2VJbXBsIG5hbWVzcGFjZSwgdmFyIG4pCiAgICAgIG5hdGl2ZSAiTmFtZXNwYWNlX0NyZWF0ZSI7CiAgc3RhdGljIGludCBfZ2V0UG9pbnRlcihfTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UpCiAgICAgIG5hdGl2ZSAiTmFtZXNwYWNlX0dldFBvaW50ZXIiOwogIHN0YXRpYyBpbnQgX2dldERlZmF1bHQoKSBuYXRpdmUgIk5hbWVzcGFjZV9HZXREZWZhdWx0IjsKCiAgLy8gSWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzICJuYW1lc3BhY2VzIiwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZQogIC8vIGVtYmVkZGVyIHdpdGggdGhlIHBsYXRmb3JtLXNwZWNpZmljIG5hbWVzcGFjZSBpbmZvcm1hdGlvbi4KICBzdGF0aWMgX05hbWVzcGFjZUltcGwgX2NhY2hlZE5hbWVzcGFjZSA9IG51bGw7CiAgc3RhdGljIHZvaWQgX3NldHVwTmFtZXNwYWNlKHZhciBuYW1lc3BhY2UpIHsKICAgIF9jYWNoZWROYW1lc3BhY2UgPSBfY3JlYXRlKG5ldyBfTmFtZXNwYWNlSW1wbC5fKCksIG5hbWVzcGFjZSk7CiAgfQoKICBzdGF0aWMgX05hbWVzcGFjZUltcGwgZ2V0IF9uYW1lc3BhY2UgewogICAgaWYgKF9jYWNoZWROYW1lc3BhY2UgPT0gbnVsbCkgewogICAgICAvLyBUaGUgZW1iZWRkZXIgaGFzIG5vdCBzdXBwbGllZCBhIG5hbWVzcGFjZSBiZWZvcmUgb25lIGlzIG5lZWRlZCwgc28KICAgICAgLy8gaW5zdGVhZCB1c2UgYSBzYWZlLWlzaCBkZWZhdWx0IHZhbHVlLgogICAgICBfY2FjaGVkTmFtZXNwYWNlID0gX2NyZWF0ZShuZXcgX05hbWVzcGFjZUltcGwuXygpLCBfZ2V0RGVmYXVsdCgpKTsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkTmFtZXNwYWNlOwogIH0KCiAgc3RhdGljIGludCBnZXQgX25hbWVzcGFjZVBvaW50ZXIgPT4gX2dldFBvaW50ZXIoX25hbWVzcGFjZSk7Cn0KCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9OYW1lc3BhY2UgewogIEBwYXRjaAogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyB2b2lkIF9zZXR1cE5hbWVzcGFjZSh2YXIgbmFtZXNwYWNlKSB7CiAgICBfTmFtZXNwYWNlSW1wbC5fc2V0dXBOYW1lc3BhY2UobmFtZXNwYWNlKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBfTmFtZXNwYWNlIGdldCBfbmFtZXNwYWNlID0+IF9OYW1lc3BhY2VJbXBsLl9uYW1lc3BhY2U7CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgZ2V0IF9uYW1lc3BhY2VQb2ludGVyID0+IF9OYW1lc3BhY2VJbXBsLl9uYW1lc3BhY2VQb2ludGVyOwp9CjIATk48ARpOFgFBITMlOgFJQDEvQwQBKSRML0kGHQQBPwIBBxoTCSQvLwQBCUEBCUgCASJkYXJ0OmlvLXBhdGNoL25hbWVzcGFjZV9wYXRjaC5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vcHJvY2Vzc19wYXRjaC5kYXJ0wABKPy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgX1dpbmRvd3NDb2RlUGFnZURlY29kZXIgewogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX2RlY29kZUJ5dGVzKExpc3Q8aW50PiBieXRlcykgbmF0aXZlICJTeXN0ZW1FbmNvZGluZ1RvU3RyaW5nIjsKfQoKQHBhdGNoCmNsYXNzIF9XaW5kb3dzQ29kZVBhZ2VFbmNvZGVyIHsKICBAcGF0Y2gKICBzdGF0aWMgTGlzdDxpbnQ+IF9lbmNvZGVTdHJpbmcoU3RyaW5nIHN0cmluZykgbmF0aXZlICJTdHJpbmdUb1N5c3RlbUVuY29kaW5nIjsKfQoKQHBhdGNoCmNsYXNzIFByb2Nlc3MgewogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8UHJvY2Vzcz4gc3RhcnQoU3RyaW5nIGV4ZWN1dGFibGUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIHtTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQ6IHRydWUsCiAgICAgIGJvb2wgcnVuSW5TaGVsbDogZmFsc2UsCiAgICAgIFByb2Nlc3NTdGFydE1vZGUgbW9kZTogUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWx9KSB7CiAgICBfUHJvY2Vzc0ltcGwgcHJvY2VzcyA9IG5ldyBfUHJvY2Vzc0ltcGwoCiAgICAgICAgZXhlY3V0YWJsZSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICBlbnZpcm9ubWVudCwKICAgICAgICBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICAgICAgcnVuSW5TaGVsbCwKICAgICAgICBtb2RlKTsKICAgIHJldHVybiBwcm9jZXNzLl9zdGFydCgpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxQcm9jZXNzUmVzdWx0PiBydW4oU3RyaW5nIGV4ZWN1dGFibGUsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIHtTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgYm9vbCBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQ6IHRydWUsCiAgICAgIGJvb2wgcnVuSW5TaGVsbDogZmFsc2UsCiAgICAgIEVuY29kaW5nIHN0ZG91dEVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZywKICAgICAgRW5jb2Rpbmcgc3RkZXJyRW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nfSkgewogICAgcmV0dXJuIF9ydW5Ob25JbnRlcmFjdGl2ZVByb2Nlc3MoCiAgICAgICAgZXhlY3V0YWJsZSwKICAgICAgICBhcmd1bWVudHMsCiAgICAgICAgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICBlbnZpcm9ubWVudCwKICAgICAgICBpbmNsdWRlUGFyZW50RW52aXJvbm1lbnQsCiAgICAgICAgcnVuSW5TaGVsbCwKICAgICAgICBzdGRvdXRFbmNvZGluZywKICAgICAgICBzdGRlcnJFbmNvZGluZyk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgUHJvY2Vzc1Jlc3VsdCBydW5TeW5jKFN0cmluZyBleGVjdXRhYmxlLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICB7U3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50OiB0cnVlLAogICAgICBib29sIHJ1bkluU2hlbGw6IGZhbHNlLAogICAgICBFbmNvZGluZyBzdGRvdXRFbmNvZGluZzogc3lzdGVtRW5jb2RpbmcsCiAgICAgIEVuY29kaW5nIHN0ZGVyckVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZ30pIHsKICAgIHJldHVybiBfcnVuTm9uSW50ZXJhY3RpdmVQcm9jZXNzU3luYygKICAgICAgICBleGVjdXRhYmxlLAogICAgICAgIGFyZ3VtZW50cywKICAgICAgICB3b3JraW5nRGlyZWN0b3J5LAogICAgICAgIGVudmlyb25tZW50LAogICAgICAgIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgICAgICBydW5JblNoZWxsLAogICAgICAgIHN0ZG91dEVuY29kaW5nLAogICAgICAgIHN0ZGVyckVuY29kaW5nKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBib29sIGtpbGxQaWQoaW50IHBpZCwgW1Byb2Nlc3NTaWduYWwgc2lnbmFsID0gUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtXSkgewogICAgaWYgKHNpZ25hbCBpcyEgUHJvY2Vzc1NpZ25hbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiQXJndW1lbnQgJ3NpZ25hbCcgbXVzdCBiZSBhIFByb2Nlc3NTaWduYWwiKTsKICAgIH0KICAgIHJldHVybiBfUHJvY2Vzc1V0aWxzLl9raWxsUGlkKHBpZCwgc2lnbmFsLl9zaWduYWxOdW1iZXIpOwogIH0KfQoKTGlzdDxfU2lnbmFsQ29udHJvbGxlcj4gX3NpZ25hbENvbnRyb2xsZXJzID0gbmV3IExpc3QoMzIpOwoKY2xhc3MgX1NpZ25hbENvbnRyb2xsZXIgewogIGZpbmFsIFByb2Nlc3NTaWduYWwgc2lnbmFsOwoKICBTdHJlYW1Db250cm9sbGVyPFByb2Nlc3NTaWduYWw+IF9jb250cm9sbGVyOwogIHZhciBfaWQ7CgogIF9TaWduYWxDb250cm9sbGVyKHRoaXMuc2lnbmFsKSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFByb2Nlc3NTaWduYWw+LmJyb2FkY2FzdCgKICAgICAgICBvbkxpc3RlbjogX2xpc3Rlbiwgb25DYW5jZWw6IF9jYW5jZWwpOwogIH0KCiAgU3RyZWFtPFByb2Nlc3NTaWduYWw+IGdldCBzdHJlYW0gPT4gX2NvbnRyb2xsZXIuc3RyZWFtOwoKICB2b2lkIF9saXN0ZW4oKSB7CiAgICB2YXIgaWQgPSBfc2V0U2lnbmFsSGFuZGxlcihzaWduYWwuX3NpZ25hbE51bWJlcik7CiAgICBpZiAoaWQgaXMhIGludCkgewogICAgICBfY29udHJvbGxlcgogICAgICAgICAgLmFkZEVycm9yKG5ldyBTaWduYWxFeGNlcHRpb24oIkZhaWxlZCB0byBsaXN0ZW4gZm9yICRzaWduYWwiLCBpZCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfaWQgPSBpZDsKICAgIHZhciBzb2NrZXQgPSBuZXcgX1Jhd1NvY2tldChuZXcgX05hdGl2ZVNvY2tldC53YXRjaFNpZ25hbChpZCkpOwogICAgc29ja2V0Lmxpc3RlbigoZXZlbnQpIHsKICAgICAgaWYgKGV2ZW50ID09IFJhd1NvY2tldEV2ZW50LnJlYWQpIHsKICAgICAgICB2YXIgYnl0ZXMgPSBzb2NrZXQucmVhZCgpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZChzaWduYWwpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIF9jYW5jZWwoKSB7CiAgICBpZiAoX2lkICE9IG51bGwpIHsKICAgICAgX2NsZWFyU2lnbmFsSGFuZGxlcihzaWduYWwuX3NpZ25hbE51bWJlcik7CiAgICAgIF9pZCA9IG51bGw7CiAgICB9CiAgfQoKICBzdGF0aWMgX3NldFNpZ25hbEhhbmRsZXIoaW50IHNpZ25hbCkgbmF0aXZlICJQcm9jZXNzX1NldFNpZ25hbEhhbmRsZXIiOwogIHN0YXRpYyBpbnQgX2NsZWFyU2lnbmFsSGFuZGxlcihpbnQgc2lnbmFsKQogICAgICBuYXRpdmUgIlByb2Nlc3NfQ2xlYXJTaWduYWxIYW5kbGVyIjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCkZ1bmN0aW9uIF9nZXRXYXRjaFNpZ25hbEludGVybmFsKCkgPT4gX1Byb2Nlc3NVdGlscy5fd2F0Y2hTaWduYWxJbnRlcm5hbDsKCkBwYXRjaApjbGFzcyBfUHJvY2Vzc1V0aWxzIHsKICBAcGF0Y2gKICBzdGF0aWMgdm9pZCBfZXhpdChpbnQgc3RhdHVzKSBuYXRpdmUgIlByb2Nlc3NfRXhpdCI7CiAgQHBhdGNoCiAgc3RhdGljIHZvaWQgX3NldEV4aXRDb2RlKGludCBzdGF0dXMpIG5hdGl2ZSAiUHJvY2Vzc19TZXRFeGl0Q29kZSI7CiAgQHBhdGNoCiAgc3RhdGljIGludCBfZ2V0RXhpdENvZGUoKSBuYXRpdmUgIlByb2Nlc3NfR2V0RXhpdENvZGUiOwogIEBwYXRjaAogIHN0YXRpYyB2b2lkIF9zbGVlcChpbnQgbWlsbGlzKSBuYXRpdmUgIlByb2Nlc3NfU2xlZXAiOwogIEBwYXRjaAogIHN0YXRpYyBpbnQgX3BpZChQcm9jZXNzIHByb2Nlc3MpIG5hdGl2ZSAiUHJvY2Vzc19QaWQiOwogIHN0YXRpYyBib29sIF9raWxsUGlkKGludCBwaWQsIGludCBzaWduYWwpIG5hdGl2ZSAiUHJvY2Vzc19LaWxsUGlkIjsKICBAcGF0Y2gKICBzdGF0aWMgU3RyZWFtPFByb2Nlc3NTaWduYWw+IF93YXRjaFNpZ25hbChQcm9jZXNzU2lnbmFsIHNpZ25hbCkgewogICAgaWYgKHNpZ25hbCAhPSBQcm9jZXNzU2lnbmFsLnNpZ2h1cCAmJgogICAgICAgIHNpZ25hbCAhPSBQcm9jZXNzU2lnbmFsLnNpZ2ludCAmJgogICAgICAgIHNpZ25hbCAhPSBQcm9jZXNzU2lnbmFsLnNpZ3Rlcm0gJiYKICAgICAgICAoUGxhdGZvcm0uaXNXaW5kb3dzIHx8CiAgICAgICAgICAgIChzaWduYWwgIT0gUHJvY2Vzc1NpZ25hbC5zaWd1c3IxICYmCiAgICAgICAgICAgICAgICBzaWduYWwgIT0gUHJvY2Vzc1NpZ25hbC5zaWd1c3IyICYmCiAgICAgICAgICAgICAgICBzaWduYWwgIT0gUHJvY2Vzc1NpZ25hbC5zaWd3aW5jaCkpKSB7CiAgICAgIHRocm93IG5ldyBTaWduYWxFeGNlcHRpb24oCiAgICAgICAgICAiTGlzdGVuaW5nIGZvciBzaWduYWwgJHNpZ25hbCBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgICByZXR1cm4gX3dhdGNoU2lnbmFsSW50ZXJuYWwoc2lnbmFsKTsKICB9CgogIHN0YXRpYyBTdHJlYW08UHJvY2Vzc1NpZ25hbD4gX3dhdGNoU2lnbmFsSW50ZXJuYWwoUHJvY2Vzc1NpZ25hbCBzaWduYWwpIHsKICAgIGlmIChfc2lnbmFsQ29udHJvbGxlcnNbc2lnbmFsLl9zaWduYWxOdW1iZXJdID09IG51bGwpIHsKICAgICAgX3NpZ25hbENvbnRyb2xsZXJzW3NpZ25hbC5fc2lnbmFsTnVtYmVyXSA9IG5ldyBfU2lnbmFsQ29udHJvbGxlcihzaWduYWwpOwogICAgfQogICAgcmV0dXJuIF9zaWduYWxDb250cm9sbGVyc1tzaWduYWwuX3NpZ25hbE51bWJlcl0uc3RyZWFtOwogIH0KfQoKQHBhdGNoCmNsYXNzIFByb2Nlc3NJbmZvIHsKICBAcGF0Y2gKICBzdGF0aWMgaW50IGdldCBtYXhSc3MgewogICAgdmFyIHJlc3VsdCA9IF9tYXhSc3MoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIGludCBnZXQgY3VycmVudFJzcyB7CiAgICB2YXIgcmVzdWx0ID0gX2N1cnJlbnRSc3MoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIF9tYXhSc3MoKSBuYXRpdmUgIlByb2Nlc3NJbmZvX01heFJTUyI7CiAgc3RhdGljIF9jdXJyZW50UnNzKCkgbmF0aXZlICJQcm9jZXNzSW5mb19DdXJyZW50UlNTIjsKfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfUHJvY2Vzc1N0YXJ0U3RhdHVzIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJzZXQiKQogIGludCBfZXJyb3JDb2RlOyAvLyBTZXQgdG8gT1MgZXJyb3IgY29kZSBpZiBwcm9jZXNzIHN0YXJ0IGZhaWxlZC4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJzZXQiKQogIFN0cmluZyBfZXJyb3JNZXNzYWdlOyAvLyBTZXQgdG8gT1MgZXJyb3IgbWVzc2FnZSBpZiBwcm9jZXNzIHN0YXJ0IGZhaWxlZC4KfQoKLy8gVGhlIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIG1peGluLCBkdWUgdG8gbWlzc2luZwovLyBpbXBsaWNpdCBjb25zdHJ1Y3Rvci4KY2xhc3MgX1Byb2Nlc3NJbXBsTmF0aXZlV3JhcHBlciBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSB7fQoKY2xhc3MgX1Byb2Nlc3NJbXBsIGV4dGVuZHMgX1Byb2Nlc3NJbXBsTmF0aXZlV3JhcHBlciBpbXBsZW1lbnRzIFByb2Nlc3MgewogIF9Qcm9jZXNzUmVzb3VyY2VJbmZvIF9yZXNvdXJjZUluZm87CiAgc3RhdGljIGJvb2wgY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gZmFsc2U7CgogIF9Qcm9jZXNzSW1wbCgKICAgICAgU3RyaW5nIHBhdGgsCiAgICAgIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICAgIHRoaXMuX3dvcmtpbmdEaXJlY3RvcnksCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgICBib29sIHJ1bkluU2hlbGwsCiAgICAgIFByb2Nlc3NTdGFydE1vZGUgbW9kZSkKICAgICAgOiBzdXBlcigpIHsKICAgIGlmICghY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyKSB7CiAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9uKAogICAgICAgICAgJ2V4dC5kYXJ0LmlvLmdldFByb2Nlc3NlcycsIF9Qcm9jZXNzUmVzb3VyY2VJbmZvLmdldFN0YXJ0ZWRQcm9jZXNzZXMpOwogICAgICByZWdpc3RlckV4dGVuc2lvbignZXh0LmRhcnQuaW8uZ2V0UHJvY2Vzc0J5SWQnLAogICAgICAgICAgX1Byb2Nlc3NSZXNvdXJjZUluZm8uZ2V0UHJvY2Vzc0luZm9NYXBCeUlkKTsKICAgICAgY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAocnVuSW5TaGVsbCkgewogICAgICBhcmd1bWVudHMgPSBfZ2V0U2hlbGxBcmd1bWVudHMocGF0aCwgYXJndW1lbnRzKTsKICAgICAgcGF0aCA9IF9nZXRTaGVsbENvbW1hbmQoKTsKICAgIH0KCiAgICBpZiAocGF0aCBpcyEgU3RyaW5nKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJQYXRoIGlzIG5vdCBhIFN0cmluZzogJHBhdGgiKTsKICAgIH0KICAgIF9wYXRoID0gcGF0aDsKCiAgICBpZiAoYXJndW1lbnRzIGlzISBMaXN0KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJBcmd1bWVudHMgaXMgbm90IGEgTGlzdDogJGFyZ3VtZW50cyIpOwogICAgfQogICAgaW50IGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICBfYXJndW1lbnRzID0gbmV3IExpc3Q8U3RyaW5nPihsZW4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldOwogICAgICBpZiAoYXJnIGlzISBTdHJpbmcpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiTm9uLXN0cmluZyBhcmd1bWVudDogJGFyZyIpOwogICAgICB9CiAgICAgIF9hcmd1bWVudHNbaV0gPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgICBfYXJndW1lbnRzW2ldID0gX3dpbmRvd3NBcmd1bWVudEVzY2FwZShfYXJndW1lbnRzW2ldKTsKICAgICAgfQogICAgfQoKICAgIGlmIChfd29ya2luZ0RpcmVjdG9yeSAhPSBudWxsICYmIF93b3JraW5nRGlyZWN0b3J5IGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAiV29ya2luZ0RpcmVjdG9yeSBpcyBub3QgYSBTdHJpbmc6ICRfd29ya2luZ0RpcmVjdG9yeSIpOwogICAgfQoKICAgIF9lbnZpcm9ubWVudCA9IFtdOwogICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIG5vbi1udWxsIGVudmlyb25tZW50LgogICAgZW52aXJvbm1lbnQgPSAoZW52aXJvbm1lbnQgPT0gbnVsbCkgPyAoY29uc3Qge30pIDogZW52aXJvbm1lbnQ7CiAgICBpZiAoZW52aXJvbm1lbnQgaXMhIE1hcCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRW52aXJvbm1lbnQgaXMgbm90IGEgbWFwOiAkZW52aXJvbm1lbnQiKTsKICAgIH0KICAgIGVudmlyb25tZW50LmZvckVhY2goKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSBpcyEgU3RyaW5nIHx8IHZhbHVlIGlzISBTdHJpbmcpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgIkVudmlyb25tZW50IGtleSBvciB2YWx1ZSBpcyBub3QgYSBzdHJpbmc6ICgka2V5LCAkdmFsdWUpIik7CiAgICAgIH0KICAgICAgX2Vudmlyb25tZW50LmFkZCgnJGtleT0kdmFsdWUnKTsKICAgIH0pOwogICAgaWYgKGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCkgewogICAgICBQbGF0Zm9ybS5lbnZpcm9ubWVudC5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgICAgYXNzZXJ0KGtleSBpcyBTdHJpbmcpOwogICAgICAgIGFzc2VydCh2YWx1ZSBpcyBTdHJpbmcpOwogICAgICAgIC8vIERvIG5vdCBvdmVycmlkZSBrZXlzIGFscmVhZHkgc2V0IGFzIHBhcnQgb2YgZW52aXJvbm1lbnQuCiAgICAgICAgaWYgKCFlbnZpcm9ubWVudC5jb250YWluc0tleShrZXkpKSB7CiAgICAgICAgICBfZW52aXJvbm1lbnQuYWRkKCcka2V5PSR2YWx1ZScpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgaWYgKG1vZGUgaXMhIFByb2Nlc3NTdGFydE1vZGUpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIk1vZGUgaXMgbm90IGEgUHJvY2Vzc1N0YXJ0TW9kZTogJG1vZGUiKTsKICAgIH0KICAgIF9tb2RlID0gbW9kZTsKCiAgICBpZiAoX21vZGVIYXNTdGRpbyhtb2RlKSkgewogICAgICAvLyBzdGRpbiBnb2luZyB0byBwcm9jZXNzLgogICAgICBfc3RkaW4gPSBuZXcgX1N0ZFNpbmsobmV3IF9Tb2NrZXQuX3dyaXRlUGlwZSgpLi5fb3duZXIgPSB0aGlzKTsKICAgICAgLy8gc3Rkb3V0IGNvbWluZyBmcm9tIHByb2Nlc3MuCiAgICAgIF9zdGRvdXQgPSBuZXcgX1N0ZFN0cmVhbShuZXcgX1NvY2tldC5fcmVhZFBpcGUoKS4uX293bmVyID0gdGhpcyk7CiAgICAgIC8vIHN0ZGVyciBjb21pbmcgZnJvbSBwcm9jZXNzLgogICAgICBfc3RkZXJyID0gbmV3IF9TdGRTdHJlYW0obmV3IF9Tb2NrZXQuX3JlYWRQaXBlKCkuLl9vd25lciA9IHRoaXMpOwogICAgfQogICAgaWYgKF9tb2RlSXNBdHRhY2hlZChtb2RlKSkgewogICAgICBfZXhpdEhhbmRsZXIgPSBuZXcgX1NvY2tldC5fcmVhZFBpcGUoKTsKICAgIH0KICAgIF9lbmRlZCA9IGZhbHNlOwogICAgX3N0YXJ0ZWQgPSBmYWxzZTsKICB9CgogIF9OYXRpdmVTb2NrZXQgZ2V0IF9zdGRpbk5hdGl2ZVNvY2tldCA9PgogICAgICAoX3N0ZGluLl9zaW5rIGFzIF9Tb2NrZXQpLl9uYXRpdmVTb2NrZXQ7CiAgX05hdGl2ZVNvY2tldCBnZXQgX3N0ZG91dE5hdGl2ZVNvY2tldCA9PgogICAgICAoX3N0ZG91dC5fc3RyZWFtIGFzIF9Tb2NrZXQpLl9uYXRpdmVTb2NrZXQ7CiAgX05hdGl2ZVNvY2tldCBnZXQgX3N0ZGVyck5hdGl2ZVNvY2tldCA9PgogICAgICAoX3N0ZGVyci5fc3RyZWFtIGFzIF9Tb2NrZXQpLl9uYXRpdmVTb2NrZXQ7CgogIHN0YXRpYyBib29sIF9tb2RlSXNBdHRhY2hlZChQcm9jZXNzU3RhcnRNb2RlIG1vZGUpIHsKICAgIHJldHVybiAobW9kZSA9PSBQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbCkgfHwKICAgICAgICAobW9kZSA9PSBQcm9jZXNzU3RhcnRNb2RlLmluaGVyaXRTdGRpbyk7CiAgfQoKICBzdGF0aWMgYm9vbCBfbW9kZUhhc1N0ZGlvKFByb2Nlc3NTdGFydE1vZGUgbW9kZSkgewogICAgcmV0dXJuIChtb2RlID09IFByb2Nlc3NTdGFydE1vZGUubm9ybWFsKSB8fAogICAgICAgIChtb2RlID09IFByb2Nlc3NTdGFydE1vZGUuZGV0YWNoZWRXaXRoU3RkaW8pOwogIH0KCiAgc3RhdGljIFN0cmluZyBfZ2V0U2hlbGxDb21tYW5kKCkgewogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICByZXR1cm4gJ2NtZC5leGUnOwogICAgfQogICAgcmV0dXJuICcvYmluL3NoJzsKICB9CgogIHN0YXRpYyBMaXN0PFN0cmluZz4gX2dldFNoZWxsQXJndW1lbnRzKAogICAgICBTdHJpbmcgZXhlY3V0YWJsZSwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cykgewogICAgTGlzdDxTdHJpbmc+IHNoZWxsQXJndW1lbnRzID0gW107CiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIHNoZWxsQXJndW1lbnRzLmFkZCgnL2MnKTsKICAgICAgc2hlbGxBcmd1bWVudHMuYWRkKGV4ZWN1dGFibGUpOwogICAgICBmb3IgKHZhciBhcmcgaW4gYXJndW1lbnRzKSB7CiAgICAgICAgc2hlbGxBcmd1bWVudHMuYWRkKGFyZyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBjb21tYW5kTGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgZXhlY3V0YWJsZSA9IGV4ZWN1dGFibGUucmVwbGFjZUFsbCgiJyIsICInXCInXCInIik7CiAgICAgIGNvbW1hbmRMaW5lLndyaXRlKCInJGV4ZWN1dGFibGUnIik7CiAgICAgIHNoZWxsQXJndW1lbnRzLmFkZCgiLWMiKTsKICAgICAgZm9yICh2YXIgYXJnIGluIGFyZ3VtZW50cykgewogICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlQWxsKCInIiwgIidcIidcIiciKTsKICAgICAgICBjb21tYW5kTGluZS53cml0ZSgiICckYXJnJyIpOwogICAgICB9CiAgICAgIHNoZWxsQXJndW1lbnRzLmFkZChjb21tYW5kTGluZS50b1N0cmluZygpKTsKICAgIH0KICAgIHJldHVybiBzaGVsbEFyZ3VtZW50czsKICB9CgogIFN0cmluZyBfd2luZG93c0FyZ3VtZW50RXNjYXBlKFN0cmluZyBhcmd1bWVudCkgewogICAgdmFyIHJlc3VsdCA9IGFyZ3VtZW50OwogICAgaWYgKGFyZ3VtZW50LmNvbnRhaW5zKCdcdCcpIHx8CiAgICAgICAgYXJndW1lbnQuY29udGFpbnMoJyAnKSB8fAogICAgICAgIGFyZ3VtZW50LmNvbnRhaW5zKCciJykpIHsKICAgICAgLy8gUHJvZHVjZSBzb21ldGhpbmcgdGhhdCB0aGUgQyBydW50aW1lIG9uIFdpbmRvd3Mgd2lsbCBwYXJzZQogICAgICAvLyBiYWNrIGFzIHRoaXMgc3RyaW5nLgoKICAgICAgLy8gUmVwbGFjZSBhbnkgbnVtYmVyIG9mICdcJyBmb2xsb3dlZCBieSAnIicgd2l0aAogICAgICAvLyB0d2ljZSBhcyBtYW55ICdcJyBmb2xsb3dlZCBieSAnXCInLgogICAgICB2YXIgYmFja3NsYXNoID0gJ1xcJy5jb2RlVW5pdEF0KDApOwogICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgIHZhciBuZXh0UG9zID0gMDsKICAgICAgdmFyIHF1b3RlUG9zID0gYXJndW1lbnQuaW5kZXhPZignIicsIG5leHRQb3MpOwogICAgICB3aGlsZSAocXVvdGVQb3MgIT0gLTEpIHsKICAgICAgICB2YXIgbnVtQmFja3NsYXNoID0gMDsKICAgICAgICB2YXIgcG9zID0gcXVvdGVQb3MgLSAxOwogICAgICAgIHdoaWxlIChwb3MgPj0gMCAmJiBhcmd1bWVudC5jb2RlVW5pdEF0KHBvcykgPT0gYmFja3NsYXNoKSB7CiAgICAgICAgICBudW1CYWNrc2xhc2grKzsKICAgICAgICAgIHBvcy0tOwogICAgICAgIH0KICAgICAgICBzYi53cml0ZShhcmd1bWVudC5zdWJzdHJpbmcobmV4dFBvcywgcXVvdGVQb3MgLSBudW1CYWNrc2xhc2gpKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUJhY2tzbGFzaDsgaSsrKSB7CiAgICAgICAgICBzYi53cml0ZShyJ1xcJyk7CiAgICAgICAgfQogICAgICAgIHNiLndyaXRlKHInXCInKTsKICAgICAgICBuZXh0UG9zID0gcXVvdGVQb3MgKyAxOwogICAgICAgIHF1b3RlUG9zID0gYXJndW1lbnQuaW5kZXhPZignIicsIG5leHRQb3MpOwogICAgICB9CiAgICAgIHNiLndyaXRlKGFyZ3VtZW50LnN1YnN0cmluZyhuZXh0UG9zLCBhcmd1bWVudC5sZW5ndGgpKTsKICAgICAgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKCiAgICAgIC8vIEFkZCAnIicgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIGFuZCByZXBsYWNlIGFsbCAnXCcgYXQKICAgICAgLy8gdGhlIGVuZCB3aXRoIHR3byAnXCcuCiAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcignIicpOwogICAgICBzYi53cml0ZShyZXN1bHQpOwogICAgICBuZXh0UG9zID0gYXJndW1lbnQubGVuZ3RoIC0gMTsKICAgICAgd2hpbGUgKGFyZ3VtZW50LmNvZGVVbml0QXQobmV4dFBvcykgPT0gYmFja3NsYXNoKSB7CiAgICAgICAgc2Iud3JpdGUoJ1xcJyk7CiAgICAgICAgbmV4dFBvcy0tOwogICAgICB9CiAgICAgIHNiLndyaXRlKCciJyk7CiAgICAgIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGludCBfaW50RnJvbUJ5dGVzKExpc3Q8aW50PiBieXRlcywgaW50IG9mZnNldCkgewogICAgcmV0dXJuIChieXRlc1tvZmZzZXRdICsKICAgICAgICAoYnl0ZXNbb2Zmc2V0ICsgMV0gPDwgOCkgKwogICAgICAgIChieXRlc1tvZmZzZXQgKyAyXSA8PCAxNikgKwogICAgICAgIChieXRlc1tvZmZzZXQgKyAzXSA8PCAyNCkpOwogIH0KCiAgRnV0dXJlPFByb2Nlc3M+IF9zdGFydCgpIHsKICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFByb2Nlc3M+KCk7CiAgICBpZiAoX21vZGVJc0F0dGFjaGVkKF9tb2RlKSkgewogICAgICBfZXhpdENvZGUgPSBuZXcgQ29tcGxldGVyPGludD4oKTsKICAgIH0KICAgIC8vIFRPRE8oYWdlcik6IE1ha2UgdGhlIGFjdHVhbCBwcm9jZXNzIHN0YXJ0aW5nIHJlYWxseSBhc3luYyBpbnN0ZWFkIG9mCiAgICAvLyBzaW11bGF0aW5nIGl0IHdpdGggYSB0aW1lci4KICAgIFRpbWVyLnJ1bigoKSB7CiAgICAgIHZhciBzdGF0dXMgPSBuZXcgX1Byb2Nlc3NTdGFydFN0YXR1cygpOwogICAgICBib29sIHN1Y2Nlc3MgPSBfc3RhcnROYXRpdmUoCiAgICAgICAgICBfTmFtZXNwYWNlLl9uYW1lc3BhY2UsCiAgICAgICAgICBfcGF0aCwKICAgICAgICAgIF9hcmd1bWVudHMsCiAgICAgICAgICBfd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICAgIF9lbnZpcm9ubWVudCwKICAgICAgICAgIF9tb2RlLl9tb2RlLAogICAgICAgICAgX21vZGVIYXNTdGRpbyhfbW9kZSkgPyBfc3RkaW5OYXRpdmVTb2NrZXQgOiBudWxsLAogICAgICAgICAgX21vZGVIYXNTdGRpbyhfbW9kZSkgPyBfc3Rkb3V0TmF0aXZlU29ja2V0IDogbnVsbCwKICAgICAgICAgIF9tb2RlSGFzU3RkaW8oX21vZGUpID8gX3N0ZGVyck5hdGl2ZVNvY2tldCA6IG51bGwsCiAgICAgICAgICBfbW9kZUlzQXR0YWNoZWQoX21vZGUpID8gX2V4aXRIYW5kbGVyLl9uYXRpdmVTb2NrZXQgOiBudWxsLAogICAgICAgICAgc3RhdHVzKTsKICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IobmV3IFByb2Nlc3NFeGNlcHRpb24oCiAgICAgICAgICAgIF9wYXRoLCBfYXJndW1lbnRzLCBzdGF0dXMuX2Vycm9yTWVzc2FnZSwgc3RhdHVzLl9lcnJvckNvZGUpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIF9zdGFydGVkID0gdHJ1ZTsKICAgICAgX3Jlc291cmNlSW5mbyA9IG5ldyBfUHJvY2Vzc1Jlc291cmNlSW5mbyh0aGlzKTsKCiAgICAgIC8vIFNldHVwIGFuIGV4aXQgaGFuZGxlciB0byBoYW5kbGUgaW50ZXJuYWwgY2xlYW51cCBhbmQgcG9zc2libGUKICAgICAgLy8gY2FsbGJhY2sgd2hlbiBhIHByb2Nlc3MgdGVybWluYXRlcy4KICAgICAgaWYgKF9tb2RlSXNBdHRhY2hlZChfbW9kZSkpIHsKICAgICAgICBpbnQgZXhpdERhdGFSZWFkID0gMDsKICAgICAgICBmaW5hbCBpbnQgRVhJVF9EQVRBX1NJWkUgPSA4OwogICAgICAgIExpc3Q8aW50PiBleGl0RGF0YUJ1ZmZlciA9IG5ldyBMaXN0PGludD4oRVhJVF9EQVRBX1NJWkUpOwogICAgICAgIF9leGl0SGFuZGxlci5saXN0ZW4oKGRhdGEpIHsKICAgICAgICAgIGludCBleGl0Q29kZShMaXN0PGludD4gaW50cykgewogICAgICAgICAgICB2YXIgY29kZSA9IF9pbnRGcm9tQnl0ZXMoaW50cywgMCk7CiAgICAgICAgICAgIHZhciBuZWdhdGl2ZSA9IF9pbnRGcm9tQnl0ZXMoaW50cywgNCk7CiAgICAgICAgICAgIGFzc2VydChuZWdhdGl2ZSA9PSAwIHx8IG5lZ2F0aXZlID09IDEpOwogICAgICAgICAgICByZXR1cm4gKG5lZ2F0aXZlID09IDApID8gY29kZSA6IC1jb2RlOwogICAgICAgICAgfQoKICAgICAgICAgIHZvaWQgaGFuZGxlRXhpdCgpIHsKICAgICAgICAgICAgX2VuZGVkID0gdHJ1ZTsKICAgICAgICAgICAgX2V4aXRDb2RlLmNvbXBsZXRlKGV4aXRDb2RlKGV4aXREYXRhQnVmZmVyKSk7CiAgICAgICAgICAgIC8vIEtpbGwgc3RkaW4sIGhlbHBpbmcgaGFuZCBpZiB0aGUgdXNlciBmb3Jnb3QgdG8gZG8gaXQuCiAgICAgICAgICAgIGlmIChfbW9kZUhhc1N0ZGlvKF9tb2RlKSkgewogICAgICAgICAgICAgIChfc3RkaW4uX3NpbmsgYXMgX1NvY2tldCkuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9yZXNvdXJjZUluZm8uc3RvcHBlZCgpOwogICAgICAgICAgfQoKICAgICAgICAgIGV4aXREYXRhQnVmZmVyLnNldFJhbmdlKAogICAgICAgICAgICAgIGV4aXREYXRhUmVhZCwgZXhpdERhdGFSZWFkICsgZGF0YS5sZW5ndGgsIGRhdGEpOwogICAgICAgICAgZXhpdERhdGFSZWFkICs9IGRhdGEubGVuZ3RoOwogICAgICAgICAgaWYgKGV4aXREYXRhUmVhZCA9PSBFWElUX0RBVEFfU0laRSkgewogICAgICAgICAgICBoYW5kbGVFeGl0KCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSh0aGlzKTsKICAgIH0pOwogICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICBQcm9jZXNzUmVzdWx0IF9ydW5BbmRXYWl0KEVuY29kaW5nIHN0ZG91dEVuY29kaW5nLCBFbmNvZGluZyBzdGRlcnJFbmNvZGluZykgewogICAgdmFyIHN0YXR1cyA9IG5ldyBfUHJvY2Vzc1N0YXJ0U3RhdHVzKCk7CiAgICBfZXhpdENvZGUgPSBuZXcgQ29tcGxldGVyPGludD4oKTsKICAgIGJvb2wgc3VjY2VzcyA9IF9zdGFydE5hdGl2ZSgKICAgICAgICBfTmFtZXNwYWNlLl9uYW1lc3BhY2UsCiAgICAgICAgX3BhdGgsCiAgICAgICAgX2FyZ3VtZW50cywKICAgICAgICBfd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICBfZW52aXJvbm1lbnQsCiAgICAgICAgUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWwuX21vZGUsCiAgICAgICAgX3N0ZGluTmF0aXZlU29ja2V0LAogICAgICAgIF9zdGRvdXROYXRpdmVTb2NrZXQsCiAgICAgICAgX3N0ZGVyck5hdGl2ZVNvY2tldCwKICAgICAgICBfZXhpdEhhbmRsZXIuX25hdGl2ZVNvY2tldCwKICAgICAgICBzdGF0dXMpOwogICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgIHRocm93IG5ldyBQcm9jZXNzRXhjZXB0aW9uKAogICAgICAgICAgX3BhdGgsIF9hcmd1bWVudHMsIHN0YXR1cy5fZXJyb3JNZXNzYWdlLCBzdGF0dXMuX2Vycm9yQ29kZSk7CiAgICB9CgogICAgX3Jlc291cmNlSW5mbyA9IG5ldyBfUHJvY2Vzc1Jlc291cmNlSW5mbyh0aGlzKTsKCiAgICB2YXIgcmVzdWx0ID0gX3dhaXQoX3N0ZGluTmF0aXZlU29ja2V0LCBfc3Rkb3V0TmF0aXZlU29ja2V0LAogICAgICAgIF9zdGRlcnJOYXRpdmVTb2NrZXQsIF9leGl0SGFuZGxlci5fbmF0aXZlU29ja2V0KTsKCiAgICBnZXRPdXRwdXQob3V0cHV0LCBlbmNvZGluZykgewogICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgcmV0dXJuIG91dHB1dDsKICAgICAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShvdXRwdXQpOwogICAgfQoKICAgIF9yZXNvdXJjZUluZm8uc3RvcHBlZCgpOwoKICAgIHJldHVybiBuZXcgUHJvY2Vzc1Jlc3VsdCgKICAgICAgICByZXN1bHRbMF0sCiAgICAgICAgcmVzdWx0WzFdLAogICAgICAgIGdldE91dHB1dChyZXN1bHRbMl0sIHN0ZG91dEVuY29kaW5nKSwKICAgICAgICBnZXRPdXRwdXQocmVzdWx0WzNdLCBzdGRlcnJFbmNvZGluZykpOwogIH0KCiAgYm9vbCBfc3RhcnROYXRpdmUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLAogICAgICBTdHJpbmcgcGF0aCwKICAgICAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIExpc3Q8U3RyaW5nPiBlbnZpcm9ubWVudCwKICAgICAgaW50IG1vZGUsCiAgICAgIF9OYXRpdmVTb2NrZXQgc3RkaW4sCiAgICAgIF9OYXRpdmVTb2NrZXQgc3Rkb3V0LAogICAgICBfTmF0aXZlU29ja2V0IHN0ZGVyciwKICAgICAgX05hdGl2ZVNvY2tldCBleGl0SGFuZGxlciwKICAgICAgX1Byb2Nlc3NTdGFydFN0YXR1cyBzdGF0dXMpIG5hdGl2ZSAiUHJvY2Vzc19TdGFydCI7CgogIF93YWl0KF9OYXRpdmVTb2NrZXQgc3RkaW4sIF9OYXRpdmVTb2NrZXQgc3Rkb3V0LCBfTmF0aXZlU29ja2V0IHN0ZGVyciwKICAgICAgX05hdGl2ZVNvY2tldCBleGl0SGFuZGxlcikgbmF0aXZlICJQcm9jZXNzX1dhaXQiOwoKICBTdHJlYW08TGlzdDxpbnQ+PiBnZXQgc3Rkb3V0IHsKICAgIHJldHVybiBfc3Rkb3V0OwogIH0KCiAgU3RyZWFtPExpc3Q8aW50Pj4gZ2V0IHN0ZGVyciB7CiAgICByZXR1cm4gX3N0ZGVycjsKICB9CgogIElPU2luayBnZXQgc3RkaW4gewogICAgcmV0dXJuIF9zdGRpbjsKICB9CgogIEZ1dHVyZTxpbnQ+IGdldCBleGl0Q29kZSA9PiBfZXhpdENvZGUgIT0gbnVsbCA/IF9leGl0Q29kZS5mdXR1cmUgOiBudWxsOwoKICBib29sIGtpbGwoW1Byb2Nlc3NTaWduYWwgc2lnbmFsID0gUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtXSkgewogICAgaWYgKHNpZ25hbCBpcyEgUHJvY2Vzc1NpZ25hbCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiQXJndW1lbnQgJ3NpZ25hbCcgbXVzdCBiZSBhIFByb2Nlc3NTaWduYWwiKTsKICAgIH0KICAgIGFzc2VydChfc3RhcnRlZCk7CiAgICBpZiAoX2VuZGVkKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gX1Byb2Nlc3NVdGlscy5fa2lsbFBpZChwaWQsIHNpZ25hbC5fc2lnbmFsTnVtYmVyKTsKICB9CgogIGludCBnZXQgcGlkID0+IF9Qcm9jZXNzVXRpbHMuX3BpZCh0aGlzKTsKCiAgU3RyaW5nIF9wYXRoOwogIExpc3Q8U3RyaW5nPiBfYXJndW1lbnRzOwogIFN0cmluZyBfd29ya2luZ0RpcmVjdG9yeTsKICBMaXN0PFN0cmluZz4gX2Vudmlyb25tZW50OwogIFByb2Nlc3NTdGFydE1vZGUgX21vZGU7CiAgLy8gUHJpdmF0ZSBtZXRob2RzIG9mIFNvY2tldCBhcmUgdXNlZCBieSBfaW4sIF9vdXQsIGFuZCBfZXJyLgogIF9TdGRTaW5rIF9zdGRpbjsKICBfU3RkU3RyZWFtIF9zdGRvdXQ7CiAgX1N0ZFN0cmVhbSBfc3RkZXJyOwogIF9Tb2NrZXQgX2V4aXRIYW5kbGVyOwogIGJvb2wgX2VuZGVkOwogIGJvb2wgX3N0YXJ0ZWQ7CiAgQ29tcGxldGVyPGludD4gX2V4aXRDb2RlOwp9CgovLyBfTm9uSW50ZXJhY3RpdmVQcm9jZXNzIGlzIGEgd3JhcHBlciBhcm91bmQgYW4gaW50ZXJhY3RpdmUgcHJvY2VzcwovLyB0aGF0IGJ1ZmZlcnMgb3V0cHV0IHNvIGl0IGNhbiBiZSBkZWxpdmVyZWQgd2hlbiB0aGUgcHJvY2VzcyBleGl0cy4KLy8gX05vbkludGVyYWN0aXZlUHJvY2VzcyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgUHJvY2Vzcy5ydW4KLy8gbWV0aG9kLgpGdXR1cmU8UHJvY2Vzc1Jlc3VsdD4gX3J1bk5vbkludGVyYWN0aXZlUHJvY2VzcygKICAgIFN0cmluZyBwYXRoLAogICAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgIFN0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnZpcm9ubWVudCwKICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgYm9vbCBydW5JblNoZWxsLAogICAgRW5jb2Rpbmcgc3Rkb3V0RW5jb2RpbmcsCiAgICBFbmNvZGluZyBzdGRlcnJFbmNvZGluZykgewogIC8vIFN0YXJ0IHRoZSB1bmRlcmx5aW5nIHByb2Nlc3MuCiAgcmV0dXJuIFByb2Nlc3Muc3RhcnQocGF0aCwgYXJndW1lbnRzLAogICAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCwKICAgICAgICAgIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudDogaW5jbHVkZVBhcmVudEVudmlyb25tZW50LAogICAgICAgICAgcnVuSW5TaGVsbDogcnVuSW5TaGVsbCkKICAgICAgLnRoZW4oKFByb2Nlc3MgcCkgewogICAgaW50IHBpZCA9IHAucGlkOwoKICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBzdGRpbiBpcyBjbG9zZWQuCiAgICBwLnN0ZGluLmNsb3NlKCk7CgogICAgLy8gU2V0dXAgc3Rkb3V0IGFuZCBzdGRlcnIgaGFuZGxpbmcuCiAgICBGdXR1cmUgZm9sZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0sIEVuY29kaW5nIGVuY29kaW5nKSB7CiAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbQogICAgICAgICAgICAuZm9sZChuZXcgQnl0ZXNCdWlsZGVyKCksIChidWlsZGVyLCBkYXRhKSA9PiBidWlsZGVyLi5hZGQoZGF0YSkpCiAgICAgICAgICAgIC50aGVuKChidWlsZGVyKSA9PiBidWlsZGVyLnRha2VCeXRlcygpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc3RyZWFtLnRyYW5zZm9ybShlbmNvZGluZy5kZWNvZGVyKS5mb2xkKG5ldyBTdHJpbmdCdWZmZXIoKSwKICAgICAgICAgICAgKGJ1ZiwgZGF0YSkgewogICAgICAgICAgYnVmLndyaXRlKGRhdGEpOwogICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICAgICB9KS50aGVuKChzYikgPT4gc2IudG9TdHJpbmcoKSk7CiAgICAgIH0KICAgIH0KCiAgICBGdXR1cmUgc3Rkb3V0ID0gZm9sZFN0cmVhbShwLnN0ZG91dCwgc3Rkb3V0RW5jb2RpbmcpOwogICAgRnV0dXJlIHN0ZGVyciA9IGZvbGRTdHJlYW0ocC5zdGRlcnIsIHN0ZGVyckVuY29kaW5nKTsKCiAgICByZXR1cm4gRnV0dXJlLndhaXQoW3AuZXhpdENvZGUsIHN0ZG91dCwgc3RkZXJyXSkudGhlbigocmVzdWx0KSB7CiAgICAgIHJldHVybiBuZXcgUHJvY2Vzc1Jlc3VsdChwaWQsIHJlc3VsdFswXSwgcmVzdWx0WzFdLCByZXN1bHRbMl0pOwogICAgfSk7CiAgfSk7Cn0KClByb2Nlc3NSZXN1bHQgX3J1bk5vbkludGVyYWN0aXZlUHJvY2Vzc1N5bmMoCiAgICBTdHJpbmcgZXhlY3V0YWJsZSwKICAgIExpc3Q8U3RyaW5nPiBhcmd1bWVudHMsCiAgICBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgIGJvb2wgcnVuSW5TaGVsbCwKICAgIEVuY29kaW5nIHN0ZG91dEVuY29kaW5nLAogICAgRW5jb2Rpbmcgc3RkZXJyRW5jb2RpbmcpIHsKICB2YXIgcHJvY2VzcyA9IG5ldyBfUHJvY2Vzc0ltcGwoCiAgICAgIGV4ZWN1dGFibGUsCiAgICAgIGFyZ3VtZW50cywKICAgICAgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgZW52aXJvbm1lbnQsCiAgICAgIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudCwKICAgICAgcnVuSW5TaGVsbCwKICAgICAgUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWwpOwogIHJldHVybiBwcm9jZXNzLl9ydW5BbmRXYWl0KHN0ZG91dEVuY29kaW5nLCBzdGRlcnJFbmNvZGluZyk7Cn0Kgn0ATk48ASABByAJTwIBByAJUQIBBxAJSiAnKx45LRQTGhUiFA8dBAEJTiAnKx4vMiYUExoVIhQYGQQBCUogJyseLzIqFBMaFSIUGBkEAQlRJEwGPgQCATsBGh4BLwsBI0EvBAE6ARM2FhJODgYORBwqIzEjCggIBAETFzESBgQBSi0rAgEiSgEHFgk3CUUJOgk5CTlGCUQqKisfMDM2ITwGKQQBTDxQBjwEAgEHFAkaHB0UBhMEAQkeIB0UBhMEATA4AgEaHCNDI0wCAU0ZRAFKJjABEBMeHiclFx0SJRlRNjcnBgEWNyEGARs+BhIBHkYGICgkHhw+CCQgPwgGAUUfQwYBFzNEH0kGJzAhSQgnCCQyHyFELSsKCgYBJUgGEgEfIUYlSCVIBiEuBhQWBAEqLysyKzIBNzAxBAE1MDYEASUeGAYWBAEqMyYeICYjIQgNLDoqICMuJggyBhsEATMbIyIiRB4BOC0qIxc1Hx4gRBoRCkgxGwoZIDMIPh4BQR8iGCU6GBMIFR4GARMEATMcIyQkBAEdLiIoBkwjEy4jIREWHRgXPD09RhMWNkoQCAEXNgFHLSQeJkIlKS8zNDMMAR4bOkUoMw4lDAEjPycwGgwMCAEgCB0EAVAsJiEfDxQbFiccHR0kERQiRwYBNAFAOgEiKyYGAR0BHhMTLi8EARUcEx4fIBAbHBwhOgFJOAEhFAQBIRQEARUTBAFLAT4kTAYWHj4EASsBEBscHRpAExYWGA8RHAIBRUY/CzERHB0lIxUdHyMoLiQ+IhoVAS4VASlFHhZNNQ9LGhsWKAgGATo6AUVGCAYCAS0XHB0lIxUdHyISERgTIBIgPgIBIGRhcnQ6aW8tcGF0Y2gvcHJvY2Vzc19wYXRjaC5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vc29ja2V0X3BhdGNoLmRhcnTAAPACLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBSYXdTZXJ2ZXJTb2NrZXQgewogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8UmF3U2VydmVyU29ja2V0PiBiaW5kKGFkZHJlc3MsIGludCBwb3J0LAogICAgICB7aW50IGJhY2tsb2c6IDAsIGJvb2wgdjZPbmx5OiBmYWxzZSwgYm9vbCBzaGFyZWQ6IGZhbHNlfSkgewogICAgcmV0dXJuIF9SYXdTZXJ2ZXJTb2NrZXQuYmluZChhZGRyZXNzLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCk7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgUmF3U29ja2V0IHsKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFJhd1NvY2tldD4gY29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICByZXR1cm4gX1Jhd1NvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxSYXdTb2NrZXQ+PiBzdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzfSkgewogICAgcmV0dXJuIF9SYXdTb2NrZXQuc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3MpOwogIH0KfQoKQHBhdGNoCmNsYXNzIFJhd1NvY2tldE9wdGlvbiB7CiAgc3RhdGljIGZpbmFsIExpc3Q8aW50PiBfb3B0aW9uc0NhY2hlID0KICAgICAgTGlzdDxpbnQ+KF9SYXdTb2NrZXRPcHRpb25zLnZhbHVlcy5sZW5ndGgpOwoKICBAcGF0Y2gKICBzdGF0aWMgaW50IF9nZXRPcHRpb25WYWx1ZShpbnQga2V5KSB7CiAgICBpZiAoa2V5ID4gX1Jhd1NvY2tldE9wdGlvbnMudmFsdWVzLmxlbmd0aCkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKGtleSwgJ2tleScpOwogICAgfQogICAgX29wdGlvbnNDYWNoZVtrZXldID8/PSBfZ2V0TmF0aXZlT3B0aW9uVmFsdWUoa2V5KTsKICAgIHJldHVybiBfb3B0aW9uc0NhY2hlW2tleV07CiAgfQoKICBzdGF0aWMgaW50IF9nZXROYXRpdmVPcHRpb25WYWx1ZShpbnQga2V5KQogICAgICBuYXRpdmUgIlJhd1NvY2tldE9wdGlvbl9HZXRPcHRpb25WYWx1ZSI7Cn0KCkBwYXRjaApjbGFzcyBJbnRlcm5ldEFkZHJlc3MgewogIEBwYXRjaAogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IExPT1BCQUNLX0lQX1Y0IHsKICAgIHJldHVybiBfSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IExPT1BCQUNLX0lQX1Y2IHsKICAgIHJldHVybiBfSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NjsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IEFOWV9JUF9WNCB7CiAgICByZXR1cm4gX0ludGVybmV0QWRkcmVzcy5hbnlJUHY0OwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgQU5ZX0lQX1Y2IHsKICAgIHJldHVybiBfSW50ZXJuZXRBZGRyZXNzLmFueUlQdjY7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IEludGVybmV0QWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgewogICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzLnBhcnNlKGFkZHJlc3MpOwogIH0KCiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxMaXN0PEludGVybmV0QWRkcmVzcz4+IGxvb2t1cChTdHJpbmcgaG9zdCwKICAgICAge0ludGVybmV0QWRkcmVzc1R5cGUgdHlwZTogSW50ZXJuZXRBZGRyZXNzVHlwZS5hbnl9KSB7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5sb29rdXAoaG9zdCwgdHlwZTogdHlwZSk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIF9jbG9uZVdpdGhOZXdIb3N0KAogICAgICBJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgU3RyaW5nIGhvc3QpIHsKICAgIHJldHVybiAoYWRkcmVzcyBhcyBfSW50ZXJuZXRBZGRyZXNzKS5fY2xvbmVXaXRoTmV3SG9zdChob3N0KTsKICB9Cn0KCkBwYXRjaApjbGFzcyBOZXR3b3JrSW50ZXJmYWNlIHsKICBAcGF0Y2gKICBzdGF0aWMgYm9vbCBnZXQgbGlzdFN1cHBvcnRlZCB7CiAgICByZXR1cm4gX2xpc3RTdXBwb3J0ZWQoKTsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8TGlzdDxOZXR3b3JrSW50ZXJmYWNlPj4gbGlzdCgKICAgICAge2Jvb2wgaW5jbHVkZUxvb3BiYWNrOiBmYWxzZSwKICAgICAgYm9vbCBpbmNsdWRlTGlua0xvY2FsOiBmYWxzZSwKICAgICAgSW50ZXJuZXRBZGRyZXNzVHlwZSB0eXBlOiBJbnRlcm5ldEFkZHJlc3NUeXBlLmFueX0pIHsKICAgIHJldHVybiBfTmF0aXZlU29ja2V0Lmxpc3RJbnRlcmZhY2VzKAogICAgICAgIGluY2x1ZGVMb29wYmFjazogaW5jbHVkZUxvb3BiYWNrLAogICAgICAgIGluY2x1ZGVMaW5rTG9jYWw6IGluY2x1ZGVMaW5rTG9jYWwsCiAgICAgICAgdHlwZTogdHlwZSk7CiAgfQoKICBzdGF0aWMgYm9vbCBfbGlzdFN1cHBvcnRlZCgpIG5hdGl2ZSAiTmV0d29ya0ludGVyZmFjZV9MaXN0U3VwcG9ydGVkIjsKfQoKdm9pZCBfdGhyb3dPbkJhZFBvcnQoaW50IHBvcnQpIHsKICBpZiAoKHBvcnQgPT0gbnVsbCkgfHwgKHBvcnQgPCAwKSB8fCAocG9ydCA+IDB4RkZGRikpIHsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIHBvcnQgJHBvcnQiKTsKICB9Cn0KCnZvaWQgX3Rocm93T25CYWRUdGwoaW50IHR0bCkgewogIGlmICh0dGwgPT0gbnVsbCB8fCB0dGwgPCAxIHx8IHR0bCA+IDI1NSkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgdHRsICR0dGwnKTsKICB9Cn0KCmNsYXNzIF9JbnRlcm5ldEFkZHJlc3MgaW1wbGVtZW50cyBJbnRlcm5ldEFkZHJlc3MgewogIHN0YXRpYyBjb25zdCBpbnQgX2FkZHJlc3NMb29wYmFja0lQdjQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX2FkZHJlc3NMb29wYmFja0lQdjYgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgX2FkZHJlc3NBbnlJUHY0ID0gMjsKICBzdGF0aWMgY29uc3QgaW50IF9hZGRyZXNzQW55SVB2NiA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBfSVB2NEFkZHJMZW5ndGggPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgX0lQdjZBZGRyTGVuZ3RoID0gMTY7CgogIHN0YXRpYyBfSW50ZXJuZXRBZGRyZXNzIGxvb3BiYWNrSVB2NCA9CiAgICAgIG5ldyBfSW50ZXJuZXRBZGRyZXNzLmZpeGVkKF9hZGRyZXNzTG9vcGJhY2tJUHY0KTsKICBzdGF0aWMgX0ludGVybmV0QWRkcmVzcyBsb29wYmFja0lQdjYgPQogICAgICBuZXcgX0ludGVybmV0QWRkcmVzcy5maXhlZChfYWRkcmVzc0xvb3BiYWNrSVB2Nik7CiAgc3RhdGljIF9JbnRlcm5ldEFkZHJlc3MgYW55SVB2NCA9IG5ldyBfSW50ZXJuZXRBZGRyZXNzLmZpeGVkKF9hZGRyZXNzQW55SVB2NCk7CiAgc3RhdGljIF9JbnRlcm5ldEFkZHJlc3MgYW55SVB2NiA9IG5ldyBfSW50ZXJuZXRBZGRyZXNzLmZpeGVkKF9hZGRyZXNzQW55SVB2Nik7CgogIGZpbmFsIFN0cmluZyBhZGRyZXNzOwogIGZpbmFsIFN0cmluZyBfaG9zdDsKICBmaW5hbCBVaW50OExpc3QgX2luX2FkZHI7CgogIEludGVybmV0QWRkcmVzc1R5cGUgZ2V0IHR5cGUgPT4gX2luX2FkZHIubGVuZ3RoID09IF9JUHY0QWRkckxlbmd0aAogICAgICA/IEludGVybmV0QWRkcmVzc1R5cGUuSVB2NAogICAgICA6IEludGVybmV0QWRkcmVzc1R5cGUuSVB2NjsKCiAgU3RyaW5nIGdldCBob3N0ID0+IF9ob3N0ICE9IG51bGwgPyBfaG9zdCA6IGFkZHJlc3M7CgogIExpc3Q8aW50PiBnZXQgcmF3QWRkcmVzcyA9PiBuZXcgVWludDhMaXN0LmZyb21MaXN0KF9pbl9hZGRyKTsKCiAgYm9vbCBnZXQgaXNMb29wYmFjayB7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjQ6CiAgICAgICAgcmV0dXJuIF9pbl9hZGRyWzBdID09IDEyNzsKCiAgICAgIGNhc2UgSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY2OgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX0lQdjZBZGRyTGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICBpZiAoX2luX2FkZHJbaV0gIT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2luX2FkZHJbX0lQdjZBZGRyTGVuZ3RoIC0gMV0gPT0gMTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IGlzTGlua0xvY2FsIHsKICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlIEludGVybmV0QWRkcmVzc1R5cGUuSVB2NDoKICAgICAgICAvLyBDaGVja2luZyBmb3IgMTY5LjI1NC4wLjAvMTYuCiAgICAgICAgcmV0dXJuIF9pbl9hZGRyWzBdID09IDE2OSAmJiBfaW5fYWRkclsxXSA9PSAyNTQ7CgogICAgICBjYXNlIEludGVybmV0QWRkcmVzc1R5cGUuSVB2NjoKICAgICAgICAvLyBDaGVja2luZyBmb3IgZmU4MDo6LzEwLgogICAgICAgIHJldHVybiBfaW5fYWRkclswXSA9PSAweEZFICYmIChfaW5fYWRkclsxXSAmIDB4QjApID09IDB4ODA7CiAgICB9CiAgfQoKICBib29sIGdldCBpc011bHRpY2FzdCB7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjQ6CiAgICAgICAgLy8gQ2hlY2tpbmcgZm9yIDIyNC4wLjAuMCB0aHJvdWdoIDIzOS4yNTUuMjU1LjI1NS4KICAgICAgICByZXR1cm4gX2luX2FkZHJbMF0gPj0gMjI0ICYmIF9pbl9hZGRyWzBdIDwgMjQwOwoKICAgICAgY2FzZSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjY6CiAgICAgICAgLy8gQ2hlY2tpbmcgZm9yIGZmMDA6Oi84LgogICAgICAgIHJldHVybiBfaW5fYWRkclswXSA9PSAweEZGOwogICAgfQogIH0KCiAgRnV0dXJlPEludGVybmV0QWRkcmVzcz4gcmV2ZXJzZSgpID0+IF9OYXRpdmVTb2NrZXQucmV2ZXJzZUxvb2t1cCh0aGlzKTsKCiAgX0ludGVybmV0QWRkcmVzcyh0aGlzLmFkZHJlc3MsIHRoaXMuX2hvc3QsIHRoaXMuX2luX2FkZHIpOwoKICBmYWN0b3J5IF9JbnRlcm5ldEFkZHJlc3MucGFyc2UoU3RyaW5nIGFkZHJlc3MpIHsKICAgIGlmIChhZGRyZXNzIGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgaW50ZXJuZXQgYWRkcmVzcyAkYWRkcmVzcyIpOwogICAgfQogICAgdmFyIGluX2FkZHIgPSBfcGFyc2UoYWRkcmVzcyk7CiAgICBpZiAoaW5fYWRkciA9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIGludGVybmV0IGFkZHJlc3MgJGFkZHJlc3MiKTsKICAgIH0KICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcyhhZGRyZXNzLCBudWxsLCBpbl9hZGRyKTsKICB9CgogIGZhY3RvcnkgX0ludGVybmV0QWRkcmVzcy5maXhlZChpbnQgaWQpIHsKICAgIHN3aXRjaCAoaWQpIHsKICAgICAgY2FzZSBfYWRkcmVzc0xvb3BiYWNrSVB2NDoKICAgICAgICB2YXIgaW5fYWRkciA9IG5ldyBVaW50OExpc3QoX0lQdjRBZGRyTGVuZ3RoKTsKICAgICAgICBpbl9hZGRyWzBdID0gMTI3OwogICAgICAgIGluX2FkZHJbX0lQdjRBZGRyTGVuZ3RoIC0gMV0gPSAxOwogICAgICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcygiMTI3LjAuMC4xIiwgbnVsbCwgaW5fYWRkcik7CiAgICAgIGNhc2UgX2FkZHJlc3NMb29wYmFja0lQdjY6CiAgICAgICAgdmFyIGluX2FkZHIgPSBuZXcgVWludDhMaXN0KF9JUHY2QWRkckxlbmd0aCk7CiAgICAgICAgaW5fYWRkcltfSVB2NkFkZHJMZW5ndGggLSAxXSA9IDE7CiAgICAgICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKCI6OjEiLCBudWxsLCBpbl9hZGRyKTsKICAgICAgY2FzZSBfYWRkcmVzc0FueUlQdjQ6CiAgICAgICAgdmFyIGluX2FkZHIgPSBuZXcgVWludDhMaXN0KF9JUHY0QWRkckxlbmd0aCk7CiAgICAgICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKCIwLjAuMC4wIiwgIjAuMC4wLjAiLCBpbl9hZGRyKTsKICAgICAgY2FzZSBfYWRkcmVzc0FueUlQdjY6CiAgICAgICAgdmFyIGluX2FkZHIgPSBuZXcgVWludDhMaXN0KF9JUHY2QWRkckxlbmd0aCk7CiAgICAgICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKCI6OiIsICI6OiIsIGluX2FkZHIpOwogICAgICBkZWZhdWx0OgogICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICB9CgogIC8vIENyZWF0ZSBhIGNsb25lIG9mIHRoaXMgX0ludGVybmV0QWRkcmVzcyByZXBsYWNpbmcgdGhlIGhvc3QuCiAgX0ludGVybmV0QWRkcmVzcyBfY2xvbmVXaXRoTmV3SG9zdChTdHJpbmcgaG9zdCkgewogICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKAogICAgICAgIGFkZHJlc3MsIGhvc3QsIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoX2luX2FkZHIpKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIHsKICAgIGlmICghKG90aGVyIGlzIF9JbnRlcm5ldEFkZHJlc3MpKSByZXR1cm4gZmFsc2U7CiAgICBpZiAob3RoZXIudHlwZSAhPSB0eXBlKSByZXR1cm4gZmFsc2U7CiAgICBib29sIGVxdWFscyA9IHRydWU7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9pbl9hZGRyLmxlbmd0aCAmJiBlcXVhbHM7IGkrKykgewogICAgICBlcXVhbHMgPSBvdGhlci5faW5fYWRkcltpXSA9PSBfaW5fYWRkcltpXTsKICAgIH0KICAgIHJldHVybiBlcXVhbHM7CiAgfQoKICBpbnQgZ2V0IGhhc2hDb2RlIHsKICAgIGludCByZXN1bHQgPSAxOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaW5fYWRkci5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHQgPSAocmVzdWx0ICogMzEgKyBfaW5fYWRkcltpXSkgJiAweDNGRkZGRkZGOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiAiSW50ZXJuZXRBZGRyZXNzKCckYWRkcmVzcycsICR7dHlwZS5uYW1lfSkiOwogIH0KCiAgc3RhdGljIFVpbnQ4TGlzdCBfcGFyc2UoU3RyaW5nIGFkZHJlc3MpIG5hdGl2ZSAiSW50ZXJuZXRBZGRyZXNzX1BhcnNlIjsKfQoKY2xhc3MgX05ldHdvcmtJbnRlcmZhY2UgaW1wbGVtZW50cyBOZXR3b3JrSW50ZXJmYWNlIHsKICBmaW5hbCBTdHJpbmcgbmFtZTsKICBmaW5hbCBpbnQgaW5kZXg7CiAgZmluYWwgTGlzdDxJbnRlcm5ldEFkZHJlc3M+IGFkZHJlc3NlcyA9IFtdOwoKICBfTmV0d29ya0ludGVyZmFjZSh0aGlzLm5hbWUsIHRoaXMuaW5kZXgpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIk5ldHdvcmtJbnRlcmZhY2UoJyRuYW1lJywgJGFkZHJlc3NlcykiOwogIH0KfQoKLy8gVGhlIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgbWl4aW4sIGR1ZSB0byBtaXNzaW5nCi8vIGltcGxpY2l0IGNvbnN0cnVjdG9yLgpjbGFzcyBfTmF0aXZlU29ja2V0TmF0aXZlV3JhcHBlciBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMSB7fQoKLy8gVGhlIF9OYXRpdmVTb2NrZXQgY2xhc3MgZW5jYXBzdWxhdGVzIGFuIE9TIHNvY2tldC4KY2xhc3MgX05hdGl2ZVNvY2tldCBleHRlbmRzIF9OYXRpdmVTb2NrZXROYXRpdmVXcmFwcGVyIHdpdGggX1NlcnZpY2VPYmplY3QgewogIC8vIEJpdCBmbGFncyB1c2VkIHdoZW4gY29tbXVuaWNhdGluZyBiZXR3ZWVuIHRoZSBldmVudGhhbmRsZXIgYW5kCiAgLy8gZGFydCBjb2RlLiBUaGUgRVZFTlQgZmxhZ3MgYXJlIHVzZWQgdG8gaW5kaWNhdGUgZXZlbnRzIG9mCiAgLy8gaW50ZXJlc3Qgd2hlbiBzZW5kaW5nIGEgbWVzc2FnZSBmcm9tIGRhcnQgY29kZSB0byB0aGUKICAvLyBldmVudGhhbmRsZXIuIFdoZW4gcmVjZWl2aW5nIGEgbWVzc2FnZSBmcm9tIHRoZSBldmVudGhhbmRsZXIgdGhlCiAgLy8gRVZFTlQgZmxhZ3MgaW5kaWNhdGUgdGhlIGV2ZW50cyB0aGF0IGFjdHVhbGx5IGhhcHBlbmVkLiBUaGUKICAvLyBDT01NQU5EIGZsYWdzIGFyZSB1c2VkIHRvIHNlbmQgY29tbWFuZHMgZnJvbSBkYXJ0IHRvIHRoZQogIC8vIGV2ZW50aGFuZGxlci4gQ09NTUFORCBmbGFncyBhcmUgbmV2ZXIgcmVjZWl2ZWQgZnJvbSB0aGUKICAvLyBldmVudGhhbmRsZXIuIEFkZGl0aW9uYWwgZmxhZ3MgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgb3RoZXIKICAvLyBpbmZvcm1hdGlvbi4KICBzdGF0aWMgY29uc3QgaW50IHJlYWRFdmVudCA9IDA7CiAgc3RhdGljIGNvbnN0IGludCB3cml0ZUV2ZW50ID0gMTsKICBzdGF0aWMgY29uc3QgaW50IGVycm9yRXZlbnQgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgY2xvc2VkRXZlbnQgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgZGVzdHJveWVkRXZlbnQgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgZmlyc3RFdmVudCA9IHJlYWRFdmVudDsKICBzdGF0aWMgY29uc3QgaW50IGxhc3RFdmVudCA9IGRlc3Ryb3llZEV2ZW50OwogIHN0YXRpYyBjb25zdCBpbnQgZXZlbnRDb3VudCA9IGxhc3RFdmVudCAtIGZpcnN0RXZlbnQgKyAxOwoKICBzdGF0aWMgY29uc3QgaW50IGNsb3NlQ29tbWFuZCA9IDg7CiAgc3RhdGljIGNvbnN0IGludCBzaHV0ZG93blJlYWRDb21tYW5kID0gOTsKICBzdGF0aWMgY29uc3QgaW50IHNodXRkb3duV3JpdGVDb21tYW5kID0gMTA7CiAgLy8gVGhlIGxvd2VyIGJpdHMgb2YgcmV0dXJuVG9rZW5Db21tYW5kIG1lc3NhZ2VzIGNvbnRhaW5zIHRoZSBudW1iZXIKICAvLyBvZiB0b2tlbnMgcmV0dXJuZWQuCiAgc3RhdGljIGNvbnN0IGludCByZXR1cm5Ub2tlbkNvbW1hbmQgPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IHNldEV2ZW50TWFza0NvbW1hbmQgPSAxMjsKICBzdGF0aWMgY29uc3QgaW50IGZpcnN0Q29tbWFuZCA9IGNsb3NlQ29tbWFuZDsKICBzdGF0aWMgY29uc3QgaW50IGxhc3RDb21tYW5kID0gc2V0RXZlbnRNYXNrQ29tbWFuZDsKCiAgLy8gVHlwZSBmbGFnIHNlbmQgdG8gdGhlIGV2ZW50aGFuZGxlciBwcm92aWRpbmcgYWRkaXRpb25hbAogIC8vIGluZm9ybWF0aW9uIG9uIHRoZSB0eXBlIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IuCiAgc3RhdGljIGNvbnN0IGludCBsaXN0ZW5pbmdTb2NrZXQgPSAxNjsKICBzdGF0aWMgY29uc3QgaW50IHBpcGVTb2NrZXQgPSAxNzsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVOb3JtYWxTb2NrZXQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZUxpc3RlbmluZ1NvY2tldCA9IDEgPDwgbGlzdGVuaW5nU29ja2V0OwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZVBpcGUgPSAxIDw8IHBpcGVTb2NrZXQ7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlVHlwZU1hc2sgPSB0eXBlTGlzdGVuaW5nU29ja2V0IHwgcGlwZVNvY2tldDsKCiAgLy8gUHJvdG9jb2wgZmxhZ3MuCiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggU29ja2V0VHlwZSBlbnVtIGluIHNvY2tldC5oLgogIHN0YXRpYyBjb25zdCBpbnQgdGNwU29ja2V0ID0gMTg7CiAgc3RhdGljIGNvbnN0IGludCB1ZHBTb2NrZXQgPSAxOTsKICBzdGF0aWMgY29uc3QgaW50IGludGVybmFsU29ja2V0ID0gMjA7CiAgc3RhdGljIGNvbnN0IGludCBpbnRlcm5hbFNpZ25hbFNvY2tldCA9IDIxOwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZVRjcFNvY2tldCA9IDEgPDwgdGNwU29ja2V0OwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZVVkcFNvY2tldCA9IDEgPDwgdWRwU29ja2V0OwogIHN0YXRpYyBjb25zdCBpbnQgdHlwZUludGVybmFsU29ja2V0ID0gMSA8PCBpbnRlcm5hbFNvY2tldDsKICBzdGF0aWMgY29uc3QgaW50IHR5cGVJbnRlcm5hbFNpZ25hbFNvY2tldCA9IDEgPDwgaW50ZXJuYWxTaWduYWxTb2NrZXQ7CiAgc3RhdGljIGNvbnN0IGludCB0eXBlUHJvdG9jb2xNYXNrID0gdHlwZVRjcFNvY2tldCB8CiAgICAgIHR5cGVVZHBTb2NrZXQgfAogICAgICB0eXBlSW50ZXJuYWxTb2NrZXQgfAogICAgICB0eXBlSW50ZXJuYWxTaWduYWxTb2NrZXQ7CgogIC8vIE5hdGl2ZSBwb3J0IG1lc3NhZ2VzLgogIHN0YXRpYyBjb25zdCBob3N0TmFtZUxvb2t1cE1lc3NhZ2UgPSAwOwogIHN0YXRpYyBjb25zdCBsaXN0SW50ZXJmYWNlc01lc3NhZ2UgPSAxOwogIHN0YXRpYyBjb25zdCByZXZlcnNlTG9va3VwTWVzc2FnZSA9IDI7CgogIC8vIFByb3RvY29sIGZsYWdzLgogIHN0YXRpYyBjb25zdCBpbnQgcHJvdG9jb2xJUHY0ID0gMSA8PCAwOwogIHN0YXRpYyBjb25zdCBpbnQgcHJvdG9jb2xJUHY2ID0gMSA8PCAxOwoKICBzdGF0aWMgY29uc3QgaW50IG5vcm1hbFRva2VuQmF0Y2hTaXplID0gODsKICBzdGF0aWMgY29uc3QgaW50IGxpc3RlbmluZ1Rva2VuQmF0Y2hTaXplID0gMjsKCiAgc3RhdGljIGNvbnN0IER1cmF0aW9uIF9yZXRyeUR1cmF0aW9uID0gY29uc3QgRHVyYXRpb24obWlsbGlzZWNvbmRzOiAyNTApOwogIHN0YXRpYyBjb25zdCBEdXJhdGlvbiBfcmV0cnlEdXJhdGlvbkxvb3BiYWNrID0KICAgICAgY29uc3QgRHVyYXRpb24obWlsbGlzZWNvbmRzOiAyNSk7CgogIC8vIFNvY2tldCBjbG9zZSBzdGF0ZQogIGJvb2wgaXNDbG9zZWQgPSBmYWxzZTsKICBib29sIGlzQ2xvc2luZyA9IGZhbHNlOwogIGJvb2wgaXNDbG9zZWRSZWFkID0gZmFsc2U7CiAgYm9vbCBjbG9zZWRSZWFkRXZlbnRTZW50ID0gZmFsc2U7CiAgYm9vbCBpc0Nsb3NlZFdyaXRlID0gZmFsc2U7CiAgQ29tcGxldGVyIGNsb3NlQ29tcGxldGVyID0gbmV3IENvbXBsZXRlci5zeW5jKCk7CgogIC8vIEhhbmRsZXJzIGFuZCByZWNlaXZlIHBvcnQgZm9yIHNvY2tldCBldmVudHMgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci4KICBmaW5hbCBMaXN0IGV2ZW50SGFuZGxlcnMgPSBuZXcgTGlzdChldmVudENvdW50ICsgMSk7CiAgUmF3UmVjZWl2ZVBvcnQgZXZlbnRQb3J0OwogIGJvb2wgZmxhZ3NTZW50ID0gZmFsc2U7CgogIC8vIFRoZSB0eXBlIGZsYWdzIGZvciB0aGlzIHNvY2tldC4KICBmaW5hbCBpbnQgdHlwZUZsYWdzOwoKICAvLyBIb2xkcyB0aGUgcG9ydCBvZiB0aGUgc29ja2V0LCAwIGlmIG5vdCBrbm93bi4KICBpbnQgbG9jYWxQb3J0ID0gMDsKCiAgLy8gSG9sZHMgdGhlIGFkZHJlc3MgdXNlZCB0byBjb25uZWN0IG9yIGJpbmQgdGhlIHNvY2tldC4KICBJbnRlcm5ldEFkZHJlc3MgbG9jYWxBZGRyZXNzOwoKICBpbnQgYXZhaWxhYmxlID0gMDsKCiAgaW50IHRva2VucyA9IDA7CgogIGJvb2wgc2VuZFJlYWRFdmVudHMgPSBmYWxzZTsKICBib29sIHJlYWRFdmVudElzc3VlZCA9IGZhbHNlOwoKICBib29sIHNlbmRXcml0ZUV2ZW50cyA9IGZhbHNlOwogIGJvb2wgd3JpdGVFdmVudElzc3VlZCA9IGZhbHNlOwogIGJvb2wgd3JpdGVBdmFpbGFibGUgPSBmYWxzZTsKCiAgc3RhdGljIGJvb2wgY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gZmFsc2U7CiAgX1JlYWRXcml0ZVJlc291cmNlSW5mbyByZXNvdXJjZUluZm87CgogIC8vIFRoZSBvd25lciBvYmplY3QgaXMgdGhlIG9iamVjdCB0aGF0IHRoZSBTb2NrZXQgaXMgYmVpbmcgdXNlZCBieSwgZS5nLgogIC8vIGEgSHR0cFNlcnZlciwgYSBXZWJTb2NrZXQgY29ubmVjdGlvbiwgYSBwcm9jZXNzIHBpcGUsIGV0Yy4KICBPYmplY3Qgb3duZXI7CgogIHN0YXRpYyBGdXR1cmU8TGlzdDxJbnRlcm5ldEFkZHJlc3M+PiBsb29rdXAoU3RyaW5nIGhvc3QsCiAgICAgIHtJbnRlcm5ldEFkZHJlc3NUeXBlIHR5cGU6IEludGVybmV0QWRkcmVzc1R5cGUuYW55fSkgewogICAgcmV0dXJuIF9JT1NlcnZpY2UuX2Rpc3BhdGNoKF9JT1NlcnZpY2Uuc29ja2V0TG9va3VwLCBbaG9zdCwgdHlwZS5fdmFsdWVdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IGNyZWF0ZUVycm9yKHJlc3BvbnNlLCAiRmFpbGVkIGhvc3QgbG9va3VwOiAnJGhvc3QnIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnNraXAoMSkubWFwPEludGVybmV0QWRkcmVzcz4oKHJlc3VsdCkgewogICAgICAgICAgdmFyIHR5cGUgPSBuZXcgSW50ZXJuZXRBZGRyZXNzVHlwZS5fZnJvbShyZXN1bHRbMF0pOwogICAgICAgICAgcmV0dXJuIG5ldyBfSW50ZXJuZXRBZGRyZXNzKHJlc3VsdFsxXSwgaG9zdCwgcmVzdWx0WzJdKTsKICAgICAgICB9KS50b0xpc3QoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPEludGVybmV0QWRkcmVzcz4gcmV2ZXJzZUxvb2t1cChJbnRlcm5ldEFkZHJlc3MgYWRkcikgewogICAgcmV0dXJuIF9JT1NlcnZpY2UuX2Rpc3BhdGNoKF9JT1NlcnZpY2Uuc29ja2V0UmV2ZXJzZUxvb2t1cCwKICAgICAgICBbKGFkZHIgYXMgX0ludGVybmV0QWRkcmVzcykuX2luX2FkZHJdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IGNyZWF0ZUVycm9yKHJlc3BvbnNlLCAiRmFpbGVkIHJldmVyc2UgaG9zdCBsb29rdXAiLCBhZGRyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gKGFkZHIgYXMgX0ludGVybmV0QWRkcmVzcykuX2Nsb25lV2l0aE5ld0hvc3QocmVzcG9uc2UpOwogICAgICB9CiAgICB9KTsKICB9CgogIHN0YXRpYyBGdXR1cmU8TGlzdDxOZXR3b3JrSW50ZXJmYWNlPj4gbGlzdEludGVyZmFjZXMoCiAgICAgIHtib29sIGluY2x1ZGVMb29wYmFjazogZmFsc2UsCiAgICAgIGJvb2wgaW5jbHVkZUxpbmtMb2NhbDogZmFsc2UsCiAgICAgIEludGVybmV0QWRkcmVzc1R5cGUgdHlwZTogSW50ZXJuZXRBZGRyZXNzVHlwZS5hbnl9KSB7CiAgICByZXR1cm4gX0lPU2VydmljZS5fZGlzcGF0Y2goX0lPU2VydmljZS5zb2NrZXRMaXN0SW50ZXJmYWNlcywgW3R5cGUuX3ZhbHVlXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKGlzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcihyZXNwb25zZSwgIkZhaWxlZCBsaXN0aW5nIGludGVyZmFjZXMiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbWFwID0gcmVzcG9uc2Uuc2tpcCgxKS5mb2xkKG5ldyBNYXA8U3RyaW5nLCBOZXR3b3JrSW50ZXJmYWNlPigpLAogICAgICAgICAgICAobWFwLCByZXN1bHQpIHsKICAgICAgICAgIHZhciB0eXBlID0gbmV3IEludGVybmV0QWRkcmVzc1R5cGUuX2Zyb20ocmVzdWx0WzBdKTsKICAgICAgICAgIHZhciBuYW1lID0gcmVzdWx0WzNdOwogICAgICAgICAgdmFyIGluZGV4ID0gcmVzdWx0WzRdOwogICAgICAgICAgdmFyIGFkZHJlc3MgPSBuZXcgX0ludGVybmV0QWRkcmVzcyhyZXN1bHRbMV0sICIiLCByZXN1bHRbMl0pOwogICAgICAgICAgaWYgKCFpbmNsdWRlTGlua0xvY2FsICYmIGFkZHJlc3MuaXNMaW5rTG9jYWwpIHJldHVybiBtYXA7CiAgICAgICAgICBpZiAoIWluY2x1ZGVMb29wYmFjayAmJiBhZGRyZXNzLmlzTG9vcGJhY2spIHJldHVybiBtYXA7CiAgICAgICAgICBtYXAucHV0SWZBYnNlbnQobmFtZSwgKCkgPT4gbmV3IF9OZXR3b3JrSW50ZXJmYWNlKG5hbWUsIGluZGV4KSk7CiAgICAgICAgICBtYXBbbmFtZV0uYWRkcmVzc2VzLmFkZChhZGRyZXNzKTsKICAgICAgICAgIHJldHVybiBtYXA7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG1hcC52YWx1ZXMudG9MaXN0KCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxfTmF0aXZlU29ja2V0Pj4gc3RhcnRDb25uZWN0KAogICAgICBob3N0LCBpbnQgcG9ydCwgc291cmNlQWRkcmVzcykgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgaWYgKHNvdXJjZUFkZHJlc3MgIT0gbnVsbCAmJiBzb3VyY2VBZGRyZXNzIGlzISBfSW50ZXJuZXRBZGRyZXNzKSB7CiAgICAgIGlmIChzb3VyY2VBZGRyZXNzIGlzIFN0cmluZykgewogICAgICAgIHNvdXJjZUFkZHJlc3MgPSBuZXcgSW50ZXJuZXRBZGRyZXNzKHNvdXJjZUFkZHJlc3MpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShob3N0KS50aGVuKChob3N0KSB7CiAgICAgIGlmIChob3N0IGlzIF9JbnRlcm5ldEFkZHJlc3MpIHJldHVybiBbaG9zdF07CiAgICAgIHJldHVybiBsb29rdXAoaG9zdCkudGhlbigoYWRkcmVzc2VzKSB7CiAgICAgICAgaWYgKGFkZHJlc3Nlcy5pc0VtcHR5KSB7CiAgICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcihudWxsLCAiRmFpbGVkIGhvc3QgbG9va3VwOiAnJGhvc3QnIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhZGRyZXNzZXM7CiAgICAgIH0pOwogICAgfSkudGhlbigoYWRkcmVzc2VzKSB7CiAgICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPF9OYXRpdmVTb2NrZXQ+KCk7CiAgICAgIHZhciBpdCA9IChhZGRyZXNzZXMgYXMgTGlzdDxJbnRlcm5ldEFkZHJlc3M+KS5pdGVyYXRvcjsKICAgICAgdmFyIGVycm9yID0gbnVsbDsKICAgICAgdmFyIGNvbm5lY3RpbmcgPSBuZXcgSGFzaE1hcCgpOwoKICAgICAgdm9pZCBjb25uZWN0TmV4dCgpIHsKICAgICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICAgIGlmIChjb25uZWN0aW5nLmlzRW1wdHkpIHsKICAgICAgICAgICAgYXNzZXJ0KGVycm9yICE9IG51bGwpOwogICAgICAgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZpbmFsIF9JbnRlcm5ldEFkZHJlc3MgYWRkcmVzcyA9IGl0LmN1cnJlbnQ7CiAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBfTmF0aXZlU29ja2V0Lm5vcm1hbCgpOwogICAgICAgIHNvY2tldC5sb2NhbEFkZHJlc3MgPSBhZGRyZXNzOwogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgaWYgKHNvdXJjZUFkZHJlc3MgPT0gbnVsbCkgewogICAgICAgICAgcmVzdWx0ID0gc29ja2V0Lm5hdGl2ZUNyZWF0ZUNvbm5lY3QoYWRkcmVzcy5faW5fYWRkciwgcG9ydCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFzc2VydChzb3VyY2VBZGRyZXNzIGlzIF9JbnRlcm5ldEFkZHJlc3MpOwogICAgICAgICAgcmVzdWx0ID0gc29ja2V0Lm5hdGl2ZUNyZWF0ZUJpbmRDb25uZWN0KAogICAgICAgICAgICAgIGFkZHJlc3MuX2luX2FkZHIsIHBvcnQsIHNvdXJjZUFkZHJlc3MuX2luX2FkZHIpOwogICAgICAgIH0KICAgICAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgICAgIC8vIEtlZXAgZmlyc3QgZXJyb3IsIGlmIHByZXNlbnQuCiAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gcmVzdWx0LmVycm9yQ29kZTsKICAgICAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBudWxsICYmIHNvY2tldC5pc0JpbmRFcnJvcihlcnJvckNvZGUpKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSBjcmVhdGVFcnJvcihyZXN1bHQsICJCaW5kIGZhaWxlZCIsIHNvdXJjZUFkZHJlc3MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVycm9yID0gY3JlYXRlRXJyb3IocmVzdWx0LCAiQ29ubmVjdGlvbiBmYWlsZWQiLCBhZGRyZXNzLCBwb3J0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29ubmVjdE5leHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUXVlcnkgdGhlIGxvY2FsIHBvcnQgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc29ja2V0LnBvcnQ7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSBjcmVhdGVFcnJvcihlLCAiQ29ubmVjdGlvbiBmYWlsZWQiLCBhZGRyZXNzLCBwb3J0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25uZWN0TmV4dCgpOwogICAgICAgICAgfQogICAgICAgICAgLy8gU2V0IHVwIHRpbWVyIGZvciB3aGVuIHdlIHNob3VsZCByZXRyeSB0aGUgbmV4dCBhZGRyZXNzCiAgICAgICAgICAvLyAoaWYgYW55KS4KICAgICAgICAgIHZhciBkdXJhdGlvbiA9CiAgICAgICAgICAgICAgYWRkcmVzcy5pc0xvb3BiYWNrID8gX3JldHJ5RHVyYXRpb25Mb29wYmFjayA6IF9yZXRyeUR1cmF0aW9uOwogICAgICAgICAgdmFyIHRpbWVyID0gbmV3IFRpbWVyKGR1cmF0aW9uLCBjb25uZWN0TmV4dCk7CiAgICAgICAgICBzZXR1cFJlc291cmNlSW5mbyhzb2NrZXQpOwoKICAgICAgICAgIGNvbm5lY3Rpbmdbc29ja2V0XSA9IHRpbWVyOwogICAgICAgICAgLy8gU2V0dXAgaGFuZGxlcnMgZm9yIHJlY2VpdmluZyB0aGUgZmlyc3Qgd3JpdGUgZXZlbnQgd2hpY2gKICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIHNvY2tldCBpcyBmdWxseSBjb25uZWN0ZWQuCiAgICAgICAgICBzb2NrZXQuc2V0SGFuZGxlcnMod3JpdGU6ICgpIHsKICAgICAgICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgICAgIHNvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShzb2NrZXQpOwogICAgICAgICAgICBjb25uZWN0aW5nLnJlbW92ZShzb2NrZXQpOwogICAgICAgICAgICBjb25uZWN0aW5nLmZvckVhY2goKHMsIHQpIHsKICAgICAgICAgICAgICB0LmNhbmNlbCgpOwogICAgICAgICAgICAgIHMuY2xvc2UoKTsKICAgICAgICAgICAgICBzLnNldEhhbmRsZXJzKCk7CiAgICAgICAgICAgICAgcy5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25uZWN0aW5nLmNsZWFyKCk7CiAgICAgICAgICB9LCBlcnJvcjogKGUpIHsKICAgICAgICAgICAgdGltZXIuY2FuY2VsKCk7CiAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwogICAgICAgICAgICAvLyBLZWVwIGZpcnN0IGVycm9yLCBpZiBwcmVzZW50LgogICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgZXJyb3IgPSBlOwogICAgICAgICAgICBjb25uZWN0aW5nLnJlbW92ZShzb2NrZXQpOwogICAgICAgICAgICBpZiAoY29ubmVjdGluZy5pc0VtcHR5KSBjb25uZWN0TmV4dCgpOwogICAgICAgICAgfSk7CiAgICAgICAgICBzb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2b2lkIG9uQ2FuY2VsKCkgewogICAgICAgIGNvbm5lY3RpbmcuZm9yRWFjaCgocywgdCkgewogICAgICAgICAgdC5jYW5jZWwoKTsKICAgICAgICAgIHMuY2xvc2UoKTsKICAgICAgICAgIHMuc2V0SGFuZGxlcnMoKTsKICAgICAgICAgIHMuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogZmFsc2UpOwogICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKICAgICAgICAgICAgZXJyb3IgPSBjcmVhdGVFcnJvcihudWxsLAogICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gYXR0ZW1wdCBjYW5jZWxsZWQsIGhvc3Q6ICR7aG9zdH0sIHBvcnQ6ICR7cG9ydH0iKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBjb25uZWN0aW5nLmNsZWFyKCk7CiAgICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIHsKICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGVycm9yKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNvbm5lY3ROZXh0KCk7CiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblRhc2s8X05hdGl2ZVNvY2tldD4uXygKICAgICAgICAgIHNvY2tldDogY29tcGxldGVyLmZ1dHVyZSwgb25DYW5jZWw6IG9uQ2FuY2VsKTsKICAgIH0pOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxfTmF0aXZlU29ja2V0PiBjb25uZWN0KAogICAgICBob3N0LCBpbnQgcG9ydCwgc291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dCkgewogICAgcmV0dXJuIHN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzKQogICAgICAgIC50aGVuKChDb25uZWN0aW9uVGFzazxfTmF0aXZlU29ja2V0PiB0YXNrKSB7CiAgICAgIEZ1dHVyZTxfTmF0aXZlU29ja2V0PiBzb2NrZXRGdXR1cmUgPSB0YXNrLnNvY2tldDsKICAgICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkgewogICAgICAgIHNvY2tldEZ1dHVyZSA9IHNvY2tldEZ1dHVyZS50aW1lb3V0KHRpbWVvdXQsIG9uVGltZW91dDogKCkgewogICAgICAgICAgdGFzay5jYW5jZWwoKTsKICAgICAgICAgIHRocm93IGNyZWF0ZUVycm9yKAogICAgICAgICAgICAgIG51bGwsICJDb25uZWN0aW9uIHRpbWVkIG91dCwgaG9zdDogJHtob3N0fSwgcG9ydDogJHtwb3J0fSIpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBzb2NrZXRGdXR1cmU7CiAgICB9KTsKICB9CgogIHN0YXRpYyBGdXR1cmU8X0ludGVybmV0QWRkcmVzcz4gX3Jlc29sdmVIb3N0KGhvc3QpIGFzeW5jIHsKICAgIGlmIChob3N0IGlzIF9JbnRlcm5ldEFkZHJlc3MpIHsKICAgICAgcmV0dXJuIGhvc3Q7CiAgICB9IGVsc2UgewogICAgICBmaW5hbCBsaXN0ID0gYXdhaXQgbG9va3VwKGhvc3QpOwogICAgICBpZiAobGlzdC5pc0VtcHR5KSB7CiAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IobnVsbCwgIkZhaWxlZCBob3N0IGxvb2t1cDogJyRob3N0JyIpOwogICAgICB9CiAgICAgIHJldHVybiBsaXN0LmZpcnN0IGFzIF9JbnRlcm5ldEFkZHJlc3M7CiAgICB9CiAgfQoKICBzdGF0aWMgRnV0dXJlPF9OYXRpdmVTb2NrZXQ+IGJpbmQoCiAgICAgIGhvc3QsIGludCBwb3J0LCBpbnQgYmFja2xvZywgYm9vbCB2Nk9ubHksIGJvb2wgc2hhcmVkKSBhc3luYyB7CiAgICBfdGhyb3dPbkJhZFBvcnQocG9ydCk7CgogICAgZmluYWwgYWRkcmVzcyA9IGF3YWl0IF9yZXNvbHZlSG9zdChob3N0KTsKCiAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTb2NrZXQubGlzdGVuKCk7CiAgICBzb2NrZXQubG9jYWxBZGRyZXNzID0gYWRkcmVzczsKICAgIHZhciByZXN1bHQgPSBzb2NrZXQubmF0aXZlQ3JlYXRlQmluZExpc3RlbigKICAgICAgICBhZGRyZXNzLl9pbl9hZGRyLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwKICAgICAgICAgIG9zRXJyb3I6IHJlc3VsdCwgYWRkcmVzczogYWRkcmVzcywgcG9ydDogcG9ydCk7CiAgICB9CiAgICBpZiAocG9ydCAhPSAwKSBzb2NrZXQubG9jYWxQb3J0ID0gcG9ydDsKICAgIHNldHVwUmVzb3VyY2VJbmZvKHNvY2tldCk7CiAgICBzb2NrZXQuY29ubmVjdFRvRXZlbnRIYW5kbGVyKCk7CiAgICByZXR1cm4gc29ja2V0OwogIH0KCiAgc3RhdGljIHZvaWQgc2V0dXBSZXNvdXJjZUluZm8oX05hdGl2ZVNvY2tldCBzb2NrZXQpIHsKICAgIHNvY2tldC5yZXNvdXJjZUluZm8gPSBuZXcgX1NvY2tldFJlc291cmNlSW5mbyhzb2NrZXQpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxfTmF0aXZlU29ja2V0PiBiaW5kRGF0YWdyYW0oCiAgICAgIGhvc3QsIGludCBwb3J0LCBib29sIHJldXNlQWRkcmVzcywgYm9vbCByZXVzZVBvcnQsIGludCB0dGwpIGFzeW5jIHsKICAgIF90aHJvd09uQmFkUG9ydChwb3J0KTsKICAgIF90aHJvd09uQmFkVHRsKHR0bCk7CgogICAgZmluYWwgYWRkcmVzcyA9IGF3YWl0IF9yZXNvbHZlSG9zdChob3N0KTsKCiAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTb2NrZXQuZGF0YWdyYW0oYWRkcmVzcyk7CiAgICB2YXIgcmVzdWx0ID0gc29ja2V0Lm5hdGl2ZUNyZWF0ZUJpbmREYXRhZ3JhbSgKICAgICAgICBhZGRyZXNzLl9pbl9hZGRyLCBwb3J0LCByZXVzZUFkZHJlc3MsIHJldXNlUG9ydCwgdHRsKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGFncmFtIHNvY2tldCIsCiAgICAgICAgICBvc0Vycm9yOiByZXN1bHQsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfQogICAgaWYgKHBvcnQgIT0gMCkgc29ja2V0LmxvY2FsUG9ydCA9IHBvcnQ7CiAgICBzZXR1cFJlc291cmNlSW5mbyhzb2NrZXQpOwogICAgcmV0dXJuIHNvY2tldDsKICB9CgogIF9OYXRpdmVTb2NrZXQuZGF0YWdyYW0odGhpcy5sb2NhbEFkZHJlc3MpCiAgICAgIDogdHlwZUZsYWdzID0gdHlwZU5vcm1hbFNvY2tldCB8IHR5cGVVZHBTb2NrZXQ7CgogIF9OYXRpdmVTb2NrZXQubm9ybWFsKCkgOiB0eXBlRmxhZ3MgPSB0eXBlTm9ybWFsU29ja2V0IHwgdHlwZVRjcFNvY2tldDsKCiAgX05hdGl2ZVNvY2tldC5saXN0ZW4oKSA6IHR5cGVGbGFncyA9IHR5cGVMaXN0ZW5pbmdTb2NrZXQgfCB0eXBlVGNwU29ja2V0IHsKICAgIGlzQ2xvc2VkV3JpdGUgPSB0cnVlOwogIH0KCiAgX05hdGl2ZVNvY2tldC5waXBlKCkgOiB0eXBlRmxhZ3MgPSB0eXBlUGlwZTsKCiAgX05hdGl2ZVNvY2tldC5fd2F0Y2hDb21tb24oaW50IGlkLCBpbnQgdHlwZSkKICAgICAgOiB0eXBlRmxhZ3MgPSB0eXBlTm9ybWFsU29ja2V0IHwgdHlwZSB7CiAgICBpc0Nsb3NlZFdyaXRlID0gdHJ1ZTsKICAgIG5hdGl2ZVNldFNvY2tldElkKGlkLCB0eXBlRmxhZ3MpOwogIH0KCiAgX05hdGl2ZVNvY2tldC53YXRjaFNpZ25hbChpbnQgaWQpCiAgICAgIDogdGhpcy5fd2F0Y2hDb21tb24oaWQsIHR5cGVJbnRlcm5hbFNpZ25hbFNvY2tldCk7CgogIF9OYXRpdmVTb2NrZXQud2F0Y2goaW50IGlkKSA6IHRoaXMuX3dhdGNoQ29tbW9uKGlkLCB0eXBlSW50ZXJuYWxTb2NrZXQpOwoKICBib29sIGdldCBpc0xpc3RlbmluZyA9PiAodHlwZUZsYWdzICYgdHlwZUxpc3RlbmluZ1NvY2tldCkgIT0gMDsKICBib29sIGdldCBpc1BpcGUgPT4gKHR5cGVGbGFncyAmIHR5cGVQaXBlKSAhPSAwOwogIGJvb2wgZ2V0IGlzSW50ZXJuYWwgPT4gKHR5cGVGbGFncyAmIHR5cGVJbnRlcm5hbFNvY2tldCkgIT0gMDsKICBib29sIGdldCBpc0ludGVybmFsU2lnbmFsID0+ICh0eXBlRmxhZ3MgJiB0eXBlSW50ZXJuYWxTaWduYWxTb2NrZXQpICE9IDA7CiAgYm9vbCBnZXQgaXNUY3AgPT4gKHR5cGVGbGFncyAmIHR5cGVUY3BTb2NrZXQpICE9IDA7CiAgYm9vbCBnZXQgaXNVZHAgPT4gKHR5cGVGbGFncyAmIHR5cGVVZHBTb2NrZXQpICE9IDA7CgogIE1hcCBfdG9KU09OKGJvb2wgcmVmKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CiAgU3RyaW5nIGdldCBfc2VydmljZVR5cGVQYXRoID0+IHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZU5hbWUgPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOwoKICBMaXN0PGludD4gcmVhZChpbnQgbGVuKSB7CiAgICBpZiAobGVuICE9IG51bGwgJiYgbGVuIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIklsbGVnYWwgbGVuZ3RoICRsZW4iKTsKICAgIH0KICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHJldHVybiBudWxsOwogICAgbGVuID0gbWluKGF2YWlsYWJsZSwgbGVuID09IG51bGwgPyBhdmFpbGFibGUgOiBsZW4pOwogICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gbnVsbDsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVSZWFkKGxlbik7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgcmVwb3J0RXJyb3IocmVzdWx0LCAiUmVhZCBmYWlsZWQiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKICAgICAgYXZhaWxhYmxlIC09IHJlc3VsdC5sZW5ndGg7CiAgICAgIC8vIFRPRE8ocmljb3cpOiBSZW1vdmUgd2hlbiB3ZSB0cmFjayBpbnRlcm5hbCBhbmQgcGlwZSB1c2VzLgogICAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICAgIHJlc291cmNlSW5mby50b3RhbFJlYWQgKz0gcmVzdWx0Lmxlbmd0aDsKICAgICAgfQogICAgfQogICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgcmVzb3VyY2VJbmZvLmRpZFJlYWQoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBEYXRhZ3JhbSByZWNlaXZlKCkgewogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgcmV0dXJuIG51bGw7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlUmVjdkZyb20oKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICByZXBvcnRFcnJvcihyZXN1bHQsICJSZWNlaXZlIGZhaWxlZCIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewogICAgICAvLyBSZWFkIHRoZSBuZXh0IGF2YWlsYWJsZS4gQXZhaWxhYmxlIGlzIG9ubHkgZm9yIHRoZSBuZXh0IGRhdGFncmFtLCBub3QKICAgICAgLy8gdGhlIHN1bSBvZiBhbGwgZGF0YWdyYW1zIHBlbmRpbmcsIHNvIHdlIG5lZWQgdG8gY2FsbCBhZnRlciBlYWNoCiAgICAgIC8vIHJlY2VpdmUuIElmIGF2YWlsYWJsZSBiZWNvbWVzID4gMCwgdGhlIF9OYXRpdmVTb2NrZXQgd2lsbCBjb250aW51ZSB0bwogICAgICAvLyBlbWl0IHJlYWQgZXZlbnRzLgogICAgICBhdmFpbGFibGUgPSBuYXRpdmVBdmFpbGFibGUoKTsKICAgICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgcmVzb3VyY2VJbmZvLnRvdGFsUmVhZCArPSByZXN1bHQuZGF0YS5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8ocmljb3cpOiBSZW1vdmUgd2hlbiB3ZSB0cmFjayBpbnRlcm5hbCBhbmQgcGlwZSB1c2VzLgogICAgYXNzZXJ0KHJlc291cmNlSW5mbyAhPSBudWxsIHx8IGlzUGlwZSB8fCBpc0ludGVybmFsIHx8IGlzSW50ZXJuYWxTaWduYWwpOwogICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgIHJlc291cmNlSW5mby5kaWRSZWFkKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgaW50IHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIGludCBvZmZzZXQsIGludCBieXRlcykgewogICAgaWYgKGJ1ZmZlciBpcyEgTGlzdCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIGlmIChvZmZzZXQgPT0gbnVsbCkgb2Zmc2V0ID0gMDsKICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgIGlmIChvZmZzZXQgPiBidWZmZXIubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUob2Zmc2V0KTsKICAgICAgfQogICAgICBieXRlcyA9IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQ7CiAgICB9CiAgICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUob2Zmc2V0KTsKICAgIGlmIChieXRlcyA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKGJ5dGVzKTsKICAgIGlmICgob2Zmc2V0ICsgYnl0ZXMpID4gYnVmZmVyLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShvZmZzZXQgKyBieXRlcyk7CiAgICB9CiAgICBpZiAob2Zmc2V0IGlzISBpbnQgfHwgYnl0ZXMgaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgdG8gd3JpdGUgb24gU29ja2V0Iik7CiAgICB9CiAgICBpZiAoaXNDbG9zaW5nIHx8IGlzQ2xvc2VkKSByZXR1cm4gMDsKICAgIGlmIChieXRlcyA9PSAwKSByZXR1cm4gMDsKICAgIF9CdWZmZXJBbmRTdGFydCBidWZmZXJBbmRTdGFydCA9CiAgICAgICAgX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YShidWZmZXIsIG9mZnNldCwgb2Zmc2V0ICsgYnl0ZXMpOwogICAgdmFyIHJlc3VsdCA9CiAgICAgICAgbmF0aXZlV3JpdGUoYnVmZmVyQW5kU3RhcnQuYnVmZmVyLCBidWZmZXJBbmRTdGFydC5zdGFydCwgYnl0ZXMpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIE9TRXJyb3Igb3NFcnJvciA9IHJlc3VsdDsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4gcmVwb3J0RXJyb3Iob3NFcnJvciwgIldyaXRlIGZhaWxlZCIpKTsKICAgICAgcmVzdWx0ID0gMDsKICAgIH0KICAgIC8vIFRoZSByZXN1bHQgbWF5IGJlIG5lZ2F0aXZlLCBpZiB3ZSBmb3JjZWQgYSBzaG9ydCB3cml0ZSBmb3IgdGVzdGluZwogICAgLy8gcHVycG9zZS4gSW4gc3VjaCBjYXNlLCBkb24ndCBtYXJrIHdyaXRlQXZhaWxhYmxlIGFzIGZhbHNlLCBhcyB3ZSBkb24ndAogICAgLy8ga25vdyBpZiB3ZSdsbCByZWNlaXZlIGFuIGV2ZW50LiBJdCdzIGJldHRlciB0byBqdXN0IHJldHJ5LgogICAgaWYgKHJlc3VsdCA+PSAwICYmIHJlc3VsdCA8IGJ5dGVzKSB7CiAgICAgIHdyaXRlQXZhaWxhYmxlID0gZmFsc2U7CiAgICB9CiAgICAvLyBOZWdhdGUgdGhlIHJlc3VsdCwgYXMgc3RhdGVkIGFib3ZlLgogICAgaWYgKHJlc3VsdCA8IDApIHJlc3VsdCA9IC1yZXN1bHQ7CiAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlIHdoZW4gd2UgdHJhY2sgaW50ZXJuYWwgYW5kIHBpcGUgdXNlcy4KICAgIGFzc2VydChyZXNvdXJjZUluZm8gIT0gbnVsbCB8fCBpc1BpcGUgfHwgaXNJbnRlcm5hbCB8fCBpc0ludGVybmFsU2lnbmFsKTsKICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICByZXNvdXJjZUluZm8uYWRkV3JpdGUocmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpbnQgc2VuZChMaXN0PGludD4gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgYnl0ZXMsIEludGVybmV0QWRkcmVzcyBhZGRyZXNzLAogICAgICBpbnQgcG9ydCkgewogICAgX3Rocm93T25CYWRQb3J0KHBvcnQpOwogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgcmV0dXJuIDA7CiAgICBfQnVmZmVyQW5kU3RhcnQgYnVmZmVyQW5kU3RhcnQgPQogICAgICAgIF9lbnN1cmVGYXN0QW5kU2VyaWFsaXphYmxlQnl0ZURhdGEoYnVmZmVyLCBvZmZzZXQsIGJ5dGVzKTsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVTZW5kVG8oYnVmZmVyQW5kU3RhcnQuYnVmZmVyLCBidWZmZXJBbmRTdGFydC5zdGFydCwKICAgICAgICBieXRlcywgKGFkZHJlc3MgYXMgX0ludGVybmV0QWRkcmVzcykuX2luX2FkZHIsIHBvcnQpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIE9TRXJyb3Igb3NFcnJvciA9IHJlc3VsdDsKICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4gcmVwb3J0RXJyb3Iob3NFcnJvciwgIlNlbmQgZmFpbGVkIikpOwogICAgICByZXN1bHQgPSAwOwogICAgfQogICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgcmVzb3VyY2VJbmZvLmFkZFdyaXRlKHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgX05hdGl2ZVNvY2tldCBhY2NlcHQoKSB7CiAgICAvLyBEb24ndCBpc3N1ZSBhY2NlcHQgaWYgd2UncmUgY2xvc2luZy4KICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHJldHVybiBudWxsOwogICAgYXNzZXJ0KGF2YWlsYWJsZSA+IDApOwogICAgYXZhaWxhYmxlLS07CiAgICB0b2tlbnMrKzsKICAgIHJldHVyblRva2VucyhsaXN0ZW5pbmdUb2tlbkJhdGNoU2l6ZSk7CiAgICB2YXIgc29ja2V0ID0gbmV3IF9OYXRpdmVTb2NrZXQubm9ybWFsKCk7CiAgICBpZiAobmF0aXZlQWNjZXB0KHNvY2tldCkgIT0gdHJ1ZSkgcmV0dXJuIG51bGw7CiAgICBzb2NrZXQubG9jYWxQb3J0ID0gbG9jYWxQb3J0OwogICAgc29ja2V0LmxvY2FsQWRkcmVzcyA9IGFkZHJlc3M7CiAgICBzZXR1cFJlc291cmNlSW5mbyhzb2NrZXQpOwogICAgLy8gVE9ETyhyaWNvdyk6IFJlbW92ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICBhc3NlcnQocmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgLy8gV2UgdHJhY2sgdGhpcyBhcyByZWFkIG9uZSBieXRlLgogICAgICByZXNvdXJjZUluZm8uYWRkUmVhZCgxKTsKICAgIH0KICAgIHJldHVybiBzb2NrZXQ7CiAgfQoKICBpbnQgZ2V0IHBvcnQgewogICAgaWYgKGxvY2FsUG9ydCAhPSAwKSByZXR1cm4gbG9jYWxQb3J0OwogICAgaWYgKGlzQ2xvc2luZyB8fCBpc0Nsb3NlZCkgdGhyb3cgY29uc3QgU29ja2V0RXhjZXB0aW9uLmNsb3NlZCgpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZUdldFBvcnQoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgdGhyb3cgcmVzdWx0OwogICAgcmV0dXJuIGxvY2FsUG9ydCA9IHJlc3VsdDsKICB9CgogIGludCBnZXQgcmVtb3RlUG9ydCB7CiAgICBpZiAoaXNDbG9zaW5nIHx8IGlzQ2xvc2VkKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlR2V0UmVtb3RlUGVlcigpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB0aHJvdyByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0WzFdOwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IGxvY2FsQWRkcmVzczsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzIHsKICAgIGlmIChpc0Nsb3NpbmcgfHwgaXNDbG9zZWQpIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIHZhciByZXN1bHQgPSBuYXRpdmVHZXRSZW1vdGVQZWVyKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHRocm93IHJlc3VsdDsKICAgIHZhciBhZGRyID0gcmVzdWx0WzBdOwogICAgdmFyIHR5cGUgPSBuZXcgSW50ZXJuZXRBZGRyZXNzVHlwZS5fZnJvbShhZGRyWzBdKTsKICAgIHJldHVybiBuZXcgX0ludGVybmV0QWRkcmVzcyhhZGRyWzFdLCBudWxsLCBhZGRyWzJdKTsKICB9CgogIHZvaWQgaXNzdWVSZWFkRXZlbnQoKSB7CiAgICBpZiAoY2xvc2VkUmVhZEV2ZW50U2VudCkgcmV0dXJuOwogICAgaWYgKHJlYWRFdmVudElzc3VlZCkgcmV0dXJuOwogICAgcmVhZEV2ZW50SXNzdWVkID0gdHJ1ZTsKICAgIHZvaWQgaXNzdWUoKSB7CiAgICAgIHJlYWRFdmVudElzc3VlZCA9IGZhbHNlOwogICAgICBpZiAoaXNDbG9zaW5nKSByZXR1cm47CiAgICAgIGlmICghc2VuZFJlYWRFdmVudHMpIHJldHVybjsKICAgICAgaWYgKGF2YWlsYWJsZSA9PSAwKSB7CiAgICAgICAgaWYgKGlzQ2xvc2VkUmVhZCAmJiAhY2xvc2VkUmVhZEV2ZW50U2VudCkgewogICAgICAgICAgaWYgKGlzQ2xvc2VkV3JpdGUpIGNsb3NlKCk7CiAgICAgICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbY2xvc2VkRXZlbnRdOwogICAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgY2xvc2VkUmVhZEV2ZW50U2VudCA9IHRydWU7CiAgICAgICAgICBoYW5kbGVyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbcmVhZEV2ZW50XTsKICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwogICAgICByZWFkRXZlbnRJc3N1ZWQgPSB0cnVlOwogICAgICBoYW5kbGVyKCk7CiAgICAgIHNjaGVkdWxlTWljcm90YXNrKGlzc3VlKTsKICAgIH0KCiAgICBzY2hlZHVsZU1pY3JvdGFzayhpc3N1ZSk7CiAgfQoKICB2b2lkIGlzc3VlV3JpdGVFdmVudCh7Ym9vbCBkZWxheWVkOiB0cnVlfSkgewogICAgaWYgKHdyaXRlRXZlbnRJc3N1ZWQpIHJldHVybjsKICAgIGlmICghd3JpdGVBdmFpbGFibGUpIHJldHVybjsKICAgIHZvaWQgaXNzdWUoKSB7CiAgICAgIHdyaXRlRXZlbnRJc3N1ZWQgPSBmYWxzZTsKICAgICAgaWYgKCF3cml0ZUF2YWlsYWJsZSkgcmV0dXJuOwogICAgICBpZiAoaXNDbG9zaW5nKSByZXR1cm47CiAgICAgIGlmICghc2VuZFdyaXRlRXZlbnRzKSByZXR1cm47CiAgICAgIHNlbmRXcml0ZUV2ZW50cyA9IGZhbHNlOwogICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbd3JpdGVFdmVudF07CiAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHJldHVybjsKICAgICAgaGFuZGxlcigpOwogICAgfQoKICAgIGlmIChkZWxheWVkKSB7CiAgICAgIHdyaXRlRXZlbnRJc3N1ZWQgPSB0cnVlOwogICAgICBzY2hlZHVsZU1pY3JvdGFzayhpc3N1ZSk7CiAgICB9IGVsc2UgewogICAgICBpc3N1ZSgpOwogICAgfQogIH0KCiAgLy8gTXVsdGlwbGV4ZXMgc29ja2V0IGV2ZW50cyB0byB0aGUgc29ja2V0IGhhbmRsZXJzLgogIHZvaWQgbXVsdGlwbGV4KE9iamVjdCBldmVudHNPYmopIHsKICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogd2hlbiBpc3N1ZSAjMzEzMDUgaXMgZml4ZWQsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNpbXBseQogICAgLy8gZGVjbGFyZSBgZXZlbnRzYCBhcyBhIGBjb3ZhcmlhbnQgaW50YCBwYXJhbWV0ZXIuCiAgICBpbnQgZXZlbnRzID0gZXZlbnRzT2JqOwogICAgZm9yIChpbnQgaSA9IGZpcnN0RXZlbnQ7IGkgPD0gbGFzdEV2ZW50OyBpKyspIHsKICAgICAgaWYgKCgoZXZlbnRzICYgKDEgPDwgaSkpICE9IDApKSB7CiAgICAgICAgaWYgKChpID09IGNsb3NlZEV2ZW50IHx8IGkgPT0gcmVhZEV2ZW50KSAmJiBpc0Nsb3NlZFJlYWQpIGNvbnRpbnVlOwogICAgICAgIGlmIChpc0Nsb3NpbmcgJiYgaSAhPSBkZXN0cm95ZWRFdmVudCkgY29udGludWU7CiAgICAgICAgaWYgKGkgPT0gY2xvc2VkRXZlbnQgJiYgIWlzTGlzdGVuaW5nICYmICFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgICAgICBpc0Nsb3NlZFJlYWQgPSB0cnVlOwogICAgICAgICAgaXNzdWVSZWFkRXZlbnQoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gd3JpdGVFdmVudCkgewogICAgICAgICAgd3JpdGVBdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgaXNzdWVXcml0ZUV2ZW50KGRlbGF5ZWQ6IGZhbHNlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gcmVhZEV2ZW50KSB7CiAgICAgICAgICBpZiAoaXNMaXN0ZW5pbmcpIHsKICAgICAgICAgICAgYXZhaWxhYmxlKys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhdmFpbGFibGUgPSBuYXRpdmVBdmFpbGFibGUoKTsKICAgICAgICAgICAgaXNzdWVSZWFkRXZlbnQoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgaGFuZGxlciA9IGV2ZW50SGFuZGxlcnNbaV07CiAgICAgICAgaWYgKGkgPT0gZGVzdHJveWVkRXZlbnQpIHsKICAgICAgICAgIGFzc2VydChpc0Nsb3NpbmcpOwogICAgICAgICAgYXNzZXJ0KCFpc0Nsb3NlZCk7CiAgICAgICAgICAvLyBUT0RPKHJpY293KTogUmVtb3ZlL3VwZGF0ZSB3aGVuIHdlIHRyYWNrIGludGVybmFsIGFuZCBwaXBlIHVzZXMuCiAgICAgICAgICBhc3NlcnQoCiAgICAgICAgICAgICAgcmVzb3VyY2VJbmZvICE9IG51bGwgfHwgaXNQaXBlIHx8IGlzSW50ZXJuYWwgfHwgaXNJbnRlcm5hbFNpZ25hbCk7CiAgICAgICAgICBpZiAocmVzb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgX1NvY2tldFJlc291cmNlSW5mby5Tb2NrZXRDbG9zZWQocmVzb3VyY2VJbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgIGNsb3NlQ29tcGxldGVyLmNvbXBsZXRlKCk7CiAgICAgICAgICBkaXNjb25uZWN0RnJvbUV2ZW50SGFuZGxlcigpOwogICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgaGFuZGxlcigpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA9PSBlcnJvckV2ZW50KSB7CiAgICAgICAgICBpZiAoIWlzQ2xvc2luZykgewogICAgICAgICAgICByZXBvcnRFcnJvcihuYXRpdmVHZXRFcnJvcigpLCAiIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghaXNDbG9zZWQpIHsKICAgICAgICAgIC8vIElmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCByaWdodCBhZnRlciBpdCdzIGFjY2VwdGVkLCB0aGVyZSdzIGEKICAgICAgICAgIC8vIGNoYW5jZSB0aGUgY2xvc2UtaGFuZGxlciBpcyBub3Qgc2V0LgogICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgaGFuZGxlcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFpc0xpc3RlbmluZykgewogICAgICB0b2tlbnMrKzsKICAgICAgcmV0dXJuVG9rZW5zKG5vcm1hbFRva2VuQmF0Y2hTaXplKTsKICAgIH0KICB9CgogIHZvaWQgcmV0dXJuVG9rZW5zKGludCB0b2tlbkJhdGNoU2l6ZSkgewogICAgaWYgKCFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgIGFzc2VydChldmVudFBvcnQgIT0gbnVsbCk7CiAgICAgIC8vIFJldHVybiBpbiBiYXRjaGVzLgogICAgICBpZiAodG9rZW5zID09IHRva2VuQmF0Y2hTaXplKSB7CiAgICAgICAgYXNzZXJ0KHRva2VucyA8ICgxIDw8IGZpcnN0Q29tbWFuZCkpOwogICAgICAgIHNlbmRUb0V2ZW50SGFuZGxlcigoMSA8PCByZXR1cm5Ub2tlbkNvbW1hbmQpIHwgdG9rZW5zKTsKICAgICAgICB0b2tlbnMgPSAwOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHNldEhhbmRsZXJzKHtyZWFkLCB3cml0ZSwgZXJyb3IsIGNsb3NlZCwgZGVzdHJveWVkfSkgewogICAgZXZlbnRIYW5kbGVyc1tyZWFkRXZlbnRdID0gcmVhZDsKICAgIGV2ZW50SGFuZGxlcnNbd3JpdGVFdmVudF0gPSB3cml0ZTsKICAgIGV2ZW50SGFuZGxlcnNbZXJyb3JFdmVudF0gPSBlcnJvcjsKICAgIGV2ZW50SGFuZGxlcnNbY2xvc2VkRXZlbnRdID0gY2xvc2VkOwogICAgZXZlbnRIYW5kbGVyc1tkZXN0cm95ZWRFdmVudF0gPSBkZXN0cm95ZWQ7CiAgfQoKICB2b2lkIHNldExpc3RlbmluZyh7cmVhZDogdHJ1ZSwgd3JpdGU6IHRydWV9KSB7CiAgICBzZW5kUmVhZEV2ZW50cyA9IHJlYWQ7CiAgICBzZW5kV3JpdGVFdmVudHMgPSB3cml0ZTsKICAgIGlmIChyZWFkKSBpc3N1ZVJlYWRFdmVudCgpOwogICAgaWYgKHdyaXRlKSBpc3N1ZVdyaXRlRXZlbnQoKTsKICAgIGlmICghZmxhZ3NTZW50ICYmICFpc0Nsb3NpbmcpIHsKICAgICAgZmxhZ3NTZW50ID0gdHJ1ZTsKICAgICAgaW50IGZsYWdzID0gMSA8PCBzZXRFdmVudE1hc2tDb21tYW5kOwogICAgICBpZiAoIWlzQ2xvc2VkUmVhZCkgZmxhZ3MgfD0gMSA8PCByZWFkRXZlbnQ7CiAgICAgIGlmICghaXNDbG9zZWRXcml0ZSkgZmxhZ3MgfD0gMSA8PCB3cml0ZUV2ZW50OwogICAgICBzZW5kVG9FdmVudEhhbmRsZXIoZmxhZ3MpOwogICAgfQogIH0KCiAgRnV0dXJlIGNsb3NlKCkgewogICAgaWYgKCFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgIHNlbmRUb0V2ZW50SGFuZGxlcigxIDw8IGNsb3NlQ29tbWFuZCk7CiAgICAgIGlzQ2xvc2luZyA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gY2xvc2VDb21wbGV0ZXIuZnV0dXJlOwogIH0KCiAgdm9pZCBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24gZGlyZWN0aW9uKSB7CiAgICBpZiAoIWlzQ2xvc2luZyAmJiAhaXNDbG9zZWQpIHsKICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKICAgICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5yZWNlaXZlOgogICAgICAgICAgc2h1dGRvd25SZWFkKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNvY2tldERpcmVjdGlvbi5zZW5kOgogICAgICAgICAgc2h1dGRvd25Xcml0ZSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTb2NrZXREaXJlY3Rpb24uYm90aDoKICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoZGlyZWN0aW9uKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBzaHV0ZG93bldyaXRlKCkgewogICAgaWYgKCFpc0Nsb3NpbmcgJiYgIWlzQ2xvc2VkKSB7CiAgICAgIGlmIChjbG9zZWRSZWFkRXZlbnRTZW50KSB7CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZW5kVG9FdmVudEhhbmRsZXIoMSA8PCBzaHV0ZG93bldyaXRlQ29tbWFuZCk7CiAgICAgIH0KICAgICAgaXNDbG9zZWRXcml0ZSA9IHRydWU7CiAgICB9CiAgfQoKICB2b2lkIHNodXRkb3duUmVhZCgpIHsKICAgIGlmICghaXNDbG9zaW5nICYmICFpc0Nsb3NlZCkgewogICAgICBpZiAoaXNDbG9zZWRXcml0ZSkgewogICAgICAgIGNsb3NlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2VuZFRvRXZlbnRIYW5kbGVyKDEgPDwgc2h1dGRvd25SZWFkQ29tbWFuZCk7CiAgICAgIH0KICAgICAgaXNDbG9zZWRSZWFkID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgc2VuZFRvRXZlbnRIYW5kbGVyKGludCBkYXRhKSB7CiAgICBpbnQgZnVsbERhdGEgPSAodHlwZUZsYWdzICYgdHlwZVR5cGVNYXNrKSB8IGRhdGE7CiAgICBhc3NlcnQoIWlzQ2xvc2luZyk7CiAgICBjb25uZWN0VG9FdmVudEhhbmRsZXIoKTsKICAgIF9FdmVudEhhbmRsZXIuX3NlbmREYXRhKHRoaXMsIGV2ZW50UG9ydC5zZW5kUG9ydCwgZnVsbERhdGEpOwogIH0KCiAgdm9pZCBjb25uZWN0VG9FdmVudEhhbmRsZXIoKSB7CiAgICBhc3NlcnQoIWlzQ2xvc2VkKTsKICAgIGlmIChldmVudFBvcnQgPT0gbnVsbCkgewogICAgICBldmVudFBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQobXVsdGlwbGV4KTsKICAgIH0KICAgIGlmICghY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyKSB7CiAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9uKAogICAgICAgICAgJ2V4dC5kYXJ0LmlvLmdldE9wZW5Tb2NrZXRzJywgX1NvY2tldFJlc291cmNlSW5mby5nZXRPcGVuU29ja2V0cyk7CiAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9uKCdleHQuZGFydC5pby5nZXRTb2NrZXRCeUlEJywKICAgICAgICAgIF9Tb2NrZXRSZXNvdXJjZUluZm8uZ2V0U29ja2V0SW5mb01hcEJ5SUQpOwoKICAgICAgY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyID0gdHJ1ZTsKICAgIH0KICB9CgogIHZvaWQgZGlzY29ubmVjdEZyb21FdmVudEhhbmRsZXIoKSB7CiAgICBhc3NlcnQoZXZlbnRQb3J0ICE9IG51bGwpOwogICAgZXZlbnRQb3J0LmNsb3NlKCk7CiAgICBldmVudFBvcnQgPSBudWxsOwogICAgLy8gTm93IHRoYXQgd2UgZG9uJ3QgdHJhY2sgdGhpcyBTb2NrZXQgYW55bW9yZSwgd2UgY2FuIGNsZWFyIHRoZSBvd25lcgogICAgLy8gZmllbGQuCiAgICBvd25lciA9IG51bGw7CiAgfQoKICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gZXJyb3IgcmVzcG9uc2UgZnJvbSBhIG5hdGl2ZSBwb3J0IGNhbGwuCiAgc3RhdGljIGJvb2wgaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICByZXR1cm4gcmVzcG9uc2UgaXMgTGlzdCAmJiByZXNwb25zZVswXSAhPSBfc3VjY2Vzc1Jlc3BvbnNlOwogIH0KCiAgLy8gQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBlcnJvci9leGNlcHRpb24gZnJvbSBkaWZmZXJlbnQgcmV0dXJuZWQKICAvLyBlcnJvciBvYmplY3RzLgogIHN0YXRpYyBjcmVhdGVFcnJvcihlcnJvciwgU3RyaW5nIG1lc3NhZ2UsCiAgICAgIFtJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnRdKSB7CiAgICBpZiAoZXJyb3IgaXMgT1NFcnJvcikgewogICAgICByZXR1cm4gbmV3IFNvY2tldEV4Y2VwdGlvbihtZXNzYWdlLAogICAgICAgICAgb3NFcnJvcjogZXJyb3IsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfSBlbHNlIGlmIChlcnJvciBpcyBMaXN0KSB7CiAgICAgIGFzc2VydChpc0Vycm9yUmVzcG9uc2UoZXJyb3IpKTsKICAgICAgc3dpdGNoIChlcnJvclswXSkgewogICAgICAgIGNhc2UgX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlOgogICAgICAgICAgcmV0dXJuIG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICAgICAgY2FzZSBfb3NFcnJvclJlc3BvbnNlOgogICAgICAgICAgcmV0dXJuIG5ldyBTb2NrZXRFeGNlcHRpb24obWVzc2FnZSwKICAgICAgICAgICAgICBvc0Vycm9yOiBuZXcgT1NFcnJvcihlcnJvclsyXSwgZXJyb3JbMV0pLAogICAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsCiAgICAgICAgICAgICAgcG9ydDogcG9ydCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBuZXcgRXhjZXB0aW9uKCJVbmtub3duIGVycm9yIik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgU29ja2V0RXhjZXB0aW9uKG1lc3NhZ2UsIGFkZHJlc3M6IGFkZHJlc3MsIHBvcnQ6IHBvcnQpOwogICAgfQogIH0KCiAgdm9pZCByZXBvcnRFcnJvcihlcnJvciwgU3RyaW5nIG1lc3NhZ2UpIHsKICAgIHZhciBlID0gY3JlYXRlRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIGFkZHJlc3MsIGxvY2FsUG9ydCk7CiAgICAvLyBJbnZva2UgdGhlIGVycm9yIGhhbmRsZXIgaWYgYW55LgogICAgaWYgKGV2ZW50SGFuZGxlcnNbZXJyb3JFdmVudF0gIT0gbnVsbCkgewogICAgICBldmVudEhhbmRsZXJzW2Vycm9yRXZlbnRdKGUpOwogICAgfQogICAgLy8gRm9yIGFsbCBlcnJvcnMgd2UgY2xvc2UgdGhlIHNvY2tldAogICAgY2xvc2UoKTsKICB9CgogIGdldE9wdGlvbihTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICBpZiAob3B0aW9uID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbiIpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZUdldE9wdGlvbihvcHRpb24uX3ZhbHVlLCBhZGRyZXNzLnR5cGUuX3ZhbHVlKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgdGhyb3cgcmVzdWx0OwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIHZhbHVlKSB7CiAgICBpZiAob3B0aW9uID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbiIpOwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZVNldE9wdGlvbihvcHRpb24uX3ZhbHVlLCBhZGRyZXNzLnR5cGUuX3ZhbHVlLCB2YWx1ZSk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHRocm93IHJlc3VsdDsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICBpZiAob3B0aW9uID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbiIpOwogICAgaWYgKG9wdGlvbi52YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJvcHRpb24udmFsdWUiKTsKCiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlR2V0UmF3T3B0aW9uKG9wdGlvbi5sZXZlbCwgb3B0aW9uLm9wdGlvbiwgb3B0aW9uLnZhbHVlKTsKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgdGhyb3cgcmVzdWx0OwogICAgcmV0dXJuIG9wdGlvbi52YWx1ZTsKICB9CgogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIGlmIChvcHRpb24gPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgib3B0aW9uIik7CiAgICBpZiAob3B0aW9uLnZhbHVlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoIm9wdGlvbi52YWx1ZSIpOwoKICAgIHZhciByZXN1bHQgPSBuYXRpdmVTZXRSYXdPcHRpb24ob3B0aW9uLmxldmVsLCBvcHRpb24ub3B0aW9uLCBvcHRpb24udmFsdWUpOwogICAgaWYgKHJlc3VsdCAhPSBudWxsKSB0aHJvdyByZXN1bHQ7CiAgfQoKICBJbnRlcm5ldEFkZHJlc3MgbXVsdGljYXN0QWRkcmVzcygKICAgICAgSW50ZXJuZXRBZGRyZXNzIGFkZHIsIE5ldHdvcmtJbnRlcmZhY2UgaW50ZXJmYWNlKSB7CiAgICAvLyBPbiBNYWMgT1MgdXNpbmcgdGhlIGludGVyZmFjZSBpbmRleCBmb3Igam9pbmluZyBJUHY0IG11bHRpY2FzdCBncm91cHMKICAgIC8vIGlzIG5vdCBzdXBwb3J0ZWQuIEhlcmUgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSBpcyBuZWVkZWQuCiAgICBpZiAoUGxhdGZvcm0uaXNNYWNPUyAmJiBhZGRyLnR5cGUgPT0gSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0KSB7CiAgICAgIGlmIChpbnRlcmZhY2UgIT0gbnVsbCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlLmFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKGludGVyZmFjZS5hZGRyZXNzZXNbaV0udHlwZSA9PSBJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjQpIHsKICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZS5hZGRyZXNzZXNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE5vIElQdjQgYWRkcmVzcyBmb3VuZCBvbiB0aGUgaW50ZXJmYWNlLgogICAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oCiAgICAgICAgICAgICJUaGUgbmV0d29yayBpbnRlcmZhY2UgZG9lcyBub3QgaGF2ZSBhbiBhZGRyZXNzICIKICAgICAgICAgICAgIm9mIHRoZSBzYW1lIGZhbWlseSBhcyB0aGUgbXVsdGljYXN0IGFkZHJlc3MiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBEZWZhdWx0IHRvIHRoZSBBTlkgYWRkcmVzcyBpZiBubyBpbnRlcmZhY2UgaXMgc3BlY2lmaWVkLgogICAgICAgIHJldHVybiBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICB2b2lkIGpvaW5NdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGFkZHIsIE5ldHdvcmtJbnRlcmZhY2UgaW50ZXJmYWNlKSB7CiAgICBfSW50ZXJuZXRBZGRyZXNzIGludGVyZmFjZUFkZHIgPSBtdWx0aWNhc3RBZGRyZXNzKGFkZHIsIGludGVyZmFjZSk7CiAgICB2YXIgaW50ZXJmYWNlSW5kZXggPSBpbnRlcmZhY2UgPT0gbnVsbCA/IDAgOiBpbnRlcmZhY2UuaW5kZXg7CiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlSm9pbk11bHRpY2FzdCgoYWRkciBhcyBfSW50ZXJuZXRBZGRyZXNzKS5faW5fYWRkciwKICAgICAgICBpbnRlcmZhY2VBZGRyPy5faW5fYWRkciwgaW50ZXJmYWNlSW5kZXgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB0aHJvdyByZXN1bHQ7CiAgfQoKICB2b2lkIGxlYXZlTXVsdGljYXN0KEludGVybmV0QWRkcmVzcyBhZGRyLCBOZXR3b3JrSW50ZXJmYWNlIGludGVyZmFjZSkgewogICAgX0ludGVybmV0QWRkcmVzcyBpbnRlcmZhY2VBZGRyID0gbXVsdGljYXN0QWRkcmVzcyhhZGRyLCBpbnRlcmZhY2UpOwogICAgdmFyIGludGVyZmFjZUluZGV4ID0gaW50ZXJmYWNlID09IG51bGwgPyAwIDogaW50ZXJmYWNlLmluZGV4OwogICAgdmFyIHJlc3VsdCA9IG5hdGl2ZUxlYXZlTXVsdGljYXN0KChhZGRyIGFzIF9JbnRlcm5ldEFkZHJlc3MpLl9pbl9hZGRyLAogICAgICAgIGludGVyZmFjZUFkZHI/Ll9pbl9hZGRyLCBpbnRlcmZhY2VJbmRleCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHRocm93IHJlc3VsdDsKICB9CgogIHZvaWQgbmF0aXZlU2V0U29ja2V0SWQoaW50IGlkLCBpbnQgdHlwZUZsYWdzKSBuYXRpdmUgIlNvY2tldF9TZXRTb2NrZXRJZCI7CiAgbmF0aXZlQXZhaWxhYmxlKCkgbmF0aXZlICJTb2NrZXRfQXZhaWxhYmxlIjsKICBuYXRpdmVSZWFkKGludCBsZW4pIG5hdGl2ZSAiU29ja2V0X1JlYWQiOwogIG5hdGl2ZVJlY3ZGcm9tKCkgbmF0aXZlICJTb2NrZXRfUmVjdkZyb20iOwogIG5hdGl2ZVdyaXRlKExpc3Q8aW50PiBidWZmZXIsIGludCBvZmZzZXQsIGludCBieXRlcykKICAgICAgbmF0aXZlICJTb2NrZXRfV3JpdGVMaXN0IjsKICBuYXRpdmVTZW5kVG8oTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGJ5dGVzLCBMaXN0PGludD4gYWRkcmVzcywKICAgICAgaW50IHBvcnQpIG5hdGl2ZSAiU29ja2V0X1NlbmRUbyI7CiAgbmF0aXZlQ3JlYXRlQ29ubmVjdChMaXN0PGludD4gYWRkciwgaW50IHBvcnQpIG5hdGl2ZSAiU29ja2V0X0NyZWF0ZUNvbm5lY3QiOwogIG5hdGl2ZUNyZWF0ZUJpbmRDb25uZWN0KExpc3Q8aW50PiBhZGRyLCBpbnQgcG9ydCwgTGlzdDxpbnQ+IHNvdXJjZUFkZHIpCiAgICAgIG5hdGl2ZSAiU29ja2V0X0NyZWF0ZUJpbmRDb25uZWN0IjsKICBib29sIGlzQmluZEVycm9yKGludCBlcnJvck51bWJlcikgbmF0aXZlICJTb2NrZXRCYXNlX0lzQmluZEVycm9yIjsKICBuYXRpdmVDcmVhdGVCaW5kTGlzdGVuKExpc3Q8aW50PiBhZGRyLCBpbnQgcG9ydCwgaW50IGJhY2tsb2csIGJvb2wgdjZPbmx5LAogICAgICBib29sIHNoYXJlZCkgbmF0aXZlICJTZXJ2ZXJTb2NrZXRfQ3JlYXRlQmluZExpc3RlbiI7CiAgbmF0aXZlQ3JlYXRlQmluZERhdGFncmFtKExpc3Q8aW50PiBhZGRyLCBpbnQgcG9ydCwgYm9vbCByZXVzZUFkZHJlc3MsCiAgICAgIGJvb2wgcmV1c2VQb3J0LCBpbnQgdHRsKSBuYXRpdmUgIlNvY2tldF9DcmVhdGVCaW5kRGF0YWdyYW0iOwogIG5hdGl2ZUFjY2VwdChfTmF0aXZlU29ja2V0IHNvY2tldCkgbmF0aXZlICJTZXJ2ZXJTb2NrZXRfQWNjZXB0IjsKICBpbnQgbmF0aXZlR2V0UG9ydCgpIG5hdGl2ZSAiU29ja2V0X0dldFBvcnQiOwogIExpc3QgbmF0aXZlR2V0UmVtb3RlUGVlcigpIG5hdGl2ZSAiU29ja2V0X0dldFJlbW90ZVBlZXIiOwogIGludCBuYXRpdmVHZXRTb2NrZXRJZCgpIG5hdGl2ZSAiU29ja2V0X0dldFNvY2tldElkIjsKICBPU0Vycm9yIG5hdGl2ZUdldEVycm9yKCkgbmF0aXZlICJTb2NrZXRfR2V0RXJyb3IiOwogIG5hdGl2ZUdldE9wdGlvbihpbnQgb3B0aW9uLCBpbnQgcHJvdG9jb2wpIG5hdGl2ZSAiU29ja2V0X0dldE9wdGlvbiI7CiAgT1NFcnJvciBuYXRpdmVHZXRSYXdPcHRpb24oaW50IGxldmVsLCBpbnQgb3B0aW9uLCBVaW50OExpc3QgZGF0YSkKICAgICAgbmF0aXZlICJTb2NrZXRfR2V0UmF3T3B0aW9uIjsKICBPU0Vycm9yIG5hdGl2ZVNldE9wdGlvbihpbnQgb3B0aW9uLCBpbnQgcHJvdG9jb2wsIHZhbHVlKQogICAgICBuYXRpdmUgIlNvY2tldF9TZXRPcHRpb24iOwogIE9TRXJyb3IgbmF0aXZlU2V0UmF3T3B0aW9uKGludCBsZXZlbCwgaW50IG9wdGlvbiwgVWludDhMaXN0IGRhdGEpCiAgICAgIG5hdGl2ZSAiU29ja2V0X1NldFJhd09wdGlvbiI7CiAgT1NFcnJvciBuYXRpdmVKb2luTXVsdGljYXN0KExpc3Q8aW50PiBhZGRyLCBMaXN0PGludD4gaW50ZXJmYWNlQWRkciwKICAgICAgaW50IGludGVyZmFjZUluZGV4KSBuYXRpdmUgIlNvY2tldF9Kb2luTXVsdGljYXN0IjsKICBib29sIG5hdGl2ZUxlYXZlTXVsdGljYXN0KExpc3Q8aW50PiBhZGRyLCBMaXN0PGludD4gaW50ZXJmYWNlQWRkciwKICAgICAgaW50IGludGVyZmFjZUluZGV4KSBuYXRpdmUgIlNvY2tldF9MZWF2ZU11bHRpY2FzdCI7Cn0KCmNsYXNzIF9SYXdTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBTdHJlYW08UmF3U29ja2V0PiBpbXBsZW1lbnRzIFJhd1NlcnZlclNvY2tldCB7CiAgZmluYWwgX05hdGl2ZVNvY2tldCBfc29ja2V0OwogIFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0PiBfY29udHJvbGxlcjsKICBSZWNlaXZlUG9ydCBfcmVmZXJlbmNlUG9ydDsKICBib29sIF92Nk9ubHk7CgogIHN0YXRpYyBGdXR1cmU8X1Jhd1NlcnZlclNvY2tldD4gYmluZCgKICAgICAgYWRkcmVzcywgaW50IHBvcnQsIGludCBiYWNrbG9nLCBib29sIHY2T25seSwgYm9vbCBzaGFyZWQpIHsKICAgIF90aHJvd09uQmFkUG9ydChwb3J0KTsKICAgIGlmIChiYWNrbG9nIDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgYmFja2xvZyAkYmFja2xvZyIpOwogICAgcmV0dXJuIF9OYXRpdmVTb2NrZXQuYmluZChhZGRyZXNzLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCkKICAgICAgICAudGhlbigoc29ja2V0KSA9PiBuZXcgX1Jhd1NlcnZlclNvY2tldChzb2NrZXQsIHY2T25seSkpOwogIH0KCiAgX1Jhd1NlcnZlclNvY2tldCh0aGlzLl9zb2NrZXQsIHRoaXMuX3Y2T25seSk7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXQ+IGxpc3Rlbih2b2lkIG9uRGF0YShSYXdTb2NrZXQgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgaWYgKF9jb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoIlN0cmVhbSB3YXMgYWxyZWFkeSBsaXN0ZW5lZCB0byIpOwogICAgfQogICAgdmFyIHpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uQ2FuY2VsOiBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSwKICAgICAgICBvblBhdXNlOiBfb25QYXVzZVN0YXRlQ2hhbmdlLAogICAgICAgIG9uUmVzdW1lOiBfb25QYXVzZVN0YXRlQ2hhbmdlKTsKICAgIF9zb2NrZXQuc2V0SGFuZGxlcnMocmVhZDogem9uZS5iaW5kQ2FsbGJhY2tHdWFyZGVkKCgpIHsKICAgICAgd2hpbGUgKF9zb2NrZXQuYXZhaWxhYmxlID4gMCkgewogICAgICAgIHZhciBzb2NrZXQgPSBfc29ja2V0LmFjY2VwdCgpOwogICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgIF9jb250cm9sbGVyLmFkZChuZXcgX1Jhd1NvY2tldChzb2NrZXQpKTsKICAgICAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHJldHVybjsKICAgICAgfQogICAgfSksIGVycm9yOiB6b25lLmJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZCgoZSkgewogICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIH0pLCBkZXN0cm95ZWQ6ICgpIHsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgaWYgKF9yZWZlcmVuY2VQb3J0ICE9IG51bGwpIHsKICAgICAgICBfcmVmZXJlbmNlUG9ydC5jbG9zZSgpOwogICAgICAgIF9yZWZlcmVuY2VQb3J0ID0gbnVsbDsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKCiAgRnV0dXJlPFJhd1NlcnZlclNvY2tldD4gY2xvc2UoKSB7CiAgICByZXR1cm4gX3NvY2tldC5jbG9zZSgpLnRoZW48UmF3U2VydmVyU29ja2V0PigoXykgewogICAgICBpZiAoX3JlZmVyZW5jZVBvcnQgIT0gbnVsbCkgewogICAgICAgIF9yZWZlcmVuY2VQb3J0LmNsb3NlKCk7CiAgICAgICAgX3JlZmVyZW5jZVBvcnQgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIF9wYXVzZSgpIHsKICAgIF9zb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogZmFsc2UpOwogIH0KCiAgdm9pZCBfcmVzdW1lKCkgewogICAgX3NvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogdHJ1ZSwgd3JpdGU6IGZhbHNlKTsKICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgX3Jlc3VtZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgfQogIH0KCiAgdm9pZCBfb25QYXVzZVN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9jb250cm9sbGVyLmlzUGF1c2VkKSB7CiAgICAgIF9wYXVzZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3Jlc3VtZSgpOwogICAgfQogIH0KCiAgdm9pZCBzZXQgX293bmVyKG93bmVyKSB7CiAgICBfc29ja2V0Lm93bmVyID0gb3duZXI7CiAgfQp9CgpjbGFzcyBfUmF3U29ja2V0IGV4dGVuZHMgU3RyZWFtPFJhd1NvY2tldEV2ZW50PiBpbXBsZW1lbnRzIFJhd1NvY2tldCB7CiAgZmluYWwgX05hdGl2ZVNvY2tldCBfc29ja2V0OwogIFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0RXZlbnQ+IF9jb250cm9sbGVyOwogIGJvb2wgX3JlYWRFdmVudHNFbmFibGVkID0gdHJ1ZTsKICBib29sIF93cml0ZUV2ZW50c0VuYWJsZWQgPSB0cnVlOwoKICAvLyBGbGFnIHRvIGhhbmRsZSBDdHJsLUQgY2xvc2luZyBvZiBzdGRpbyBvbiBNYWMgT1MuCiAgYm9vbCBfaXNNYWNPU1Rlcm1pbmFsSW5wdXQgPSBmYWxzZTsKCiAgc3RhdGljIEZ1dHVyZTxSYXdTb2NrZXQ+IGNvbm5lY3QoCiAgICAgIGhvc3QsIGludCBwb3J0LCBzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0KSB7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQpCiAgICAgICAgLnRoZW4oKHNvY2tldCkgPT4gbmV3IF9SYXdTb2NrZXQoc29ja2V0KSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPF9SYXdTb2NrZXQ+PiBzdGFydENvbm5lY3QoCiAgICAgIGhvc3QsIGludCBwb3J0LCBzb3VyY2VBZGRyZXNzKSB7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzcykKICAgICAgICAudGhlbigoQ29ubmVjdGlvblRhc2s8X05hdGl2ZVNvY2tldD4gbmF0aXZlVGFzaykgewogICAgICBmaW5hbCBGdXR1cmU8X1Jhd1NvY2tldD4gcmF3ID0gbmF0aXZlVGFzay5zb2NrZXQKICAgICAgICAgIC50aGVuKChfTmF0aXZlU29ja2V0IG5hdGl2ZVNvY2tldCkgPT4gbmV3IF9SYXdTb2NrZXQobmF0aXZlU29ja2V0KSk7CiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblRhc2s8X1Jhd1NvY2tldD4uXygKICAgICAgICAgIHNvY2tldDogcmF3LCBvbkNhbmNlbDogbmF0aXZlVGFzay5fb25DYW5jZWwpOwogICAgfSk7CiAgfQoKICBfUmF3U29ja2V0KHRoaXMuX3NvY2tldCkgewogICAgdmFyIHpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyKAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uQ2FuY2VsOiBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSwKICAgICAgICBvblBhdXNlOiBfb25QYXVzZVN0YXRlQ2hhbmdlLAogICAgICAgIG9uUmVzdW1lOiBfb25QYXVzZVN0YXRlQ2hhbmdlKTsKICAgIF9zb2NrZXQuc2V0SGFuZGxlcnMoCiAgICAgICAgcmVhZDogKCkgPT4gX2NvbnRyb2xsZXIuYWRkKFJhd1NvY2tldEV2ZW50LnJlYWQpLAogICAgICAgIHdyaXRlOiAoKSB7CiAgICAgICAgICAvLyBUaGUgd3JpdGUgZXZlbnQgaGFuZGxlciBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGJ5IHRoZQogICAgICAgICAgLy8gZXZlbnQgaGFuZGxlciB3aGVuIGl0IGZpcmVzLgogICAgICAgICAgd3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQud3JpdGUpOwogICAgICAgIH0sCiAgICAgICAgY2xvc2VkOiAoKSA9PiBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCksCiAgICAgICAgZGVzdHJveWVkOiAoKSB7CiAgICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQuY2xvc2VkKTsKICAgICAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgICAgfSwKICAgICAgICBlcnJvcjogem9uZS5iaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQoKGUpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGUpOwogICAgICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgICAgIH0pKTsKICB9CgogIGZhY3RvcnkgX1Jhd1NvY2tldC5fd3JpdGVQaXBlKCkgewogICAgdmFyIG5hdGl2ZSA9IG5ldyBfTmF0aXZlU29ja2V0LnBpcGUoKTsKICAgIG5hdGl2ZS5pc0Nsb3NlZFJlYWQgPSB0cnVlOwogICAgbmF0aXZlLmNsb3NlZFJlYWRFdmVudFNlbnQgPSB0cnVlOwogICAgcmV0dXJuIG5ldyBfUmF3U29ja2V0KG5hdGl2ZSk7CiAgfQoKICBmYWN0b3J5IF9SYXdTb2NrZXQuX3JlYWRQaXBlKGludCBmZCkgewogICAgdmFyIG5hdGl2ZSA9IG5ldyBfTmF0aXZlU29ja2V0LnBpcGUoKTsKICAgIG5hdGl2ZS5pc0Nsb3NlZFdyaXRlID0gdHJ1ZTsKICAgIGlmIChmZCAhPSBudWxsKSBfZ2V0U3RkaW9IYW5kbGUobmF0aXZlLCBmZCk7CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9SYXdTb2NrZXQobmF0aXZlKTsKICAgIGlmIChmZCAhPSBudWxsKSB7CiAgICAgIHZhciBzb2NrZXRUeXBlID0gX1N0ZElPVXRpbHMuX25hdGl2ZVNvY2tldFR5cGUocmVzdWx0Ll9zb2NrZXQpOwogICAgICByZXN1bHQuX2lzTWFjT1NUZXJtaW5hbElucHV0ID0KICAgICAgICAgIFBsYXRmb3JtLmlzTWFjT1MgJiYgc29ja2V0VHlwZSA9PSBfc3RkaW9IYW5kbGVUeXBlVGVybWluYWw7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiBsaXN0ZW4odm9pZCBvbkRhdGEoUmF3U29ja2V0RXZlbnQgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIGludCBhdmFpbGFibGUoKSA9PiBfc29ja2V0LmF2YWlsYWJsZTsKCiAgTGlzdDxpbnQ+IHJlYWQoW2ludCBsZW5dKSB7CiAgICBpZiAoX2lzTWFjT1NUZXJtaW5hbElucHV0KSB7CiAgICAgIHZhciBhdmFpbGFibGUgPSB0aGlzLmF2YWlsYWJsZSgpOwogICAgICBpZiAoYXZhaWxhYmxlID09IDApIHJldHVybiBudWxsOwogICAgICB2YXIgZGF0YSA9IF9zb2NrZXQucmVhZChsZW4pOwogICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoIDwgYXZhaWxhYmxlKSB7CiAgICAgICAgLy8gUmVhZGluZyBsZXNzIHRoYW4gYXZhaWxhYmxlIGZyb20gYSBNYWMgT1MgdGVybWluYWwgaW5kaWNhdGUgQ3RybC1ELgogICAgICAgIC8vIFRoaXMgaXMgaW50ZXJwcmV0ZWQgYXMgcmVhZCBjbG9zZWQuCiAgICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4gX2NvbnRyb2xsZXIuYWRkKFJhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWQpKTsKICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBfc29ja2V0LnJlYWQobGVuKTsKICAgIH0KICB9CgogIGludCB3cml0ZShMaXN0PGludD4gYnVmZmVyLCBbaW50IG9mZnNldCwgaW50IGNvdW50XSkgPT4KICAgICAgX3NvY2tldC53cml0ZShidWZmZXIsIG9mZnNldCwgY291bnQpOwoKICBGdXR1cmU8UmF3U29ja2V0PiBjbG9zZSgpID0+IF9zb2NrZXQuY2xvc2UoKS50aGVuPFJhd1NvY2tldD4oKF8pID0+IHRoaXMpOwoKICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pID0+IF9zb2NrZXQuc2h1dGRvd24oZGlyZWN0aW9uKTsKCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgaW50IGdldCByZW1vdGVQb3J0ID0+IF9zb2NrZXQucmVtb3RlUG9ydDsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCByZW1vdGVBZGRyZXNzID0+IF9zb2NrZXQucmVtb3RlQWRkcmVzczsKCiAgYm9vbCBnZXQgcmVhZEV2ZW50c0VuYWJsZWQgPT4gX3JlYWRFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHJlYWRFdmVudHNFbmFibGVkKGJvb2wgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSAhPSBfcmVhZEV2ZW50c0VuYWJsZWQpIHsKICAgICAgX3JlYWRFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IHdyaXRlRXZlbnRzRW5hYmxlZCA9PiBfd3JpdGVFdmVudHNFbmFibGVkOwogIHZvaWQgc2V0IHdyaXRlRXZlbnRzRW5hYmxlZChib29sIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT0gX3dyaXRlRXZlbnRzRW5hYmxlZCkgewogICAgICBfd3JpdGVFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICAgIGlmICghX2NvbnRyb2xsZXIuaXNQYXVzZWQpIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCkgPT4KICAgICAgX3NvY2tldC5zZXRPcHRpb24ob3B0aW9uLCBlbmFibGVkKTsKCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSA9PgogICAgICBfc29ja2V0LmdldFJhd09wdGlvbihvcHRpb24pOwogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pID0+IF9zb2NrZXQuc2V0UmF3T3B0aW9uKG9wdGlvbik7CgogIF9wYXVzZSgpIHsKICAgIF9zb2NrZXQuc2V0TGlzdGVuaW5nKHJlYWQ6IGZhbHNlLCB3cml0ZTogZmFsc2UpOwogIH0KCiAgdm9pZCBfcmVzdW1lKCkgewogICAgX3NvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogX3JlYWRFdmVudHNFbmFibGVkLCB3cml0ZTogX3dyaXRlRXZlbnRzRW5hYmxlZCk7CiAgfQoKICB2b2lkIF9vblBhdXNlU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgX3BhdXNlKCk7CiAgICB9IGVsc2UgewogICAgICBfcmVzdW1lKCk7CiAgICB9CiAgfQoKICB2b2lkIF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9jb250cm9sbGVyLmhhc0xpc3RlbmVyKSB7CiAgICAgIF9yZXN1bWUoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9zb2NrZXQuY2xvc2UoKTsKICAgIH0KICB9CgogIHZvaWQgc2V0IF9vd25lcihvd25lcikgewogICAgX3NvY2tldC5vd25lciA9IG93bmVyOwogIH0KfQoKQHBhdGNoCmNsYXNzIFNlcnZlclNvY2tldCB7CiAgQHBhdGNoCiAgc3RhdGljIEZ1dHVyZTxTZXJ2ZXJTb2NrZXQ+IGJpbmQoYWRkcmVzcywgaW50IHBvcnQsCiAgICAgIHtpbnQgYmFja2xvZzogMCwgYm9vbCB2Nk9ubHk6IGZhbHNlLCBib29sIHNoYXJlZDogZmFsc2V9KSB7CiAgICByZXR1cm4gX1NlcnZlclNvY2tldC5iaW5kKGFkZHJlc3MsIHBvcnQsIGJhY2tsb2csIHY2T25seSwgc2hhcmVkKTsKICB9Cn0KCmNsYXNzIF9TZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBTdHJlYW08U29ja2V0PiBpbXBsZW1lbnRzIFNlcnZlclNvY2tldCB7CiAgZmluYWwgX3NvY2tldDsKCiAgc3RhdGljIEZ1dHVyZTxfU2VydmVyU29ja2V0PiBiaW5kKAogICAgICBhZGRyZXNzLCBpbnQgcG9ydCwgaW50IGJhY2tsb2csIGJvb2wgdjZPbmx5LCBib29sIHNoYXJlZCkgewogICAgcmV0dXJuIF9SYXdTZXJ2ZXJTb2NrZXQuYmluZChhZGRyZXNzLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCkKICAgICAgICAudGhlbigoc29ja2V0KSA9PiBuZXcgX1NlcnZlclNvY2tldChzb2NrZXQpKTsKICB9CgogIF9TZXJ2ZXJTb2NrZXQodGhpcy5fc29ja2V0KTsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFNvY2tldD4gbGlzdGVuKHZvaWQgb25EYXRhKFNvY2tldCBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX3NvY2tldC5tYXA8U29ja2V0PigocmF3U29ja2V0KSA9PiBuZXcgX1NvY2tldChyYXdTb2NrZXQpKS5saXN0ZW4oCiAgICAgICAgb25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsCiAgICAgICAgb25Eb25lOiBvbkRvbmUsCiAgICAgICAgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQoKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3MgPT4gX3NvY2tldC5hZGRyZXNzOwoKICBGdXR1cmU8U2VydmVyU29ja2V0PiBjbG9zZSgpID0+CiAgICAgIF9zb2NrZXQuY2xvc2UoKS50aGVuPFNlcnZlclNvY2tldD4oKF8pID0+IHRoaXMpOwoKICB2b2lkIHNldCBfb3duZXIob3duZXIpIHsKICAgIF9zb2NrZXQuX293bmVyID0gb3duZXI7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgU29ja2V0IHsKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPFNvY2tldD4gX2Nvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgcmV0dXJuIFJhd1NvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpCiAgICAgICAgLnRoZW4oKHNvY2tldCkgPT4gbmV3IF9Tb2NrZXQoc29ja2V0KSk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IF9zdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzfSkgewogICAgcmV0dXJuIFJhd1NvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcykKICAgICAgICAudGhlbigocmF3VGFzaykgewogICAgICBGdXR1cmU8U29ja2V0PiBzb2NrZXQgPQogICAgICAgICAgcmF3VGFzay5zb2NrZXQudGhlbigocmF3U29ja2V0KSA9PiBuZXcgX1NvY2tldChyYXdTb2NrZXQpKTsKICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVGFzazxTb2NrZXQ+Ll8oCiAgICAgICAgICBzb2NrZXQ6IHNvY2tldCwgb25DYW5jZWw6IHJhd1Rhc2suX29uQ2FuY2VsKTsKICAgIH0pOwogIH0KfQoKY2xhc3MgX1NvY2tldFN0cmVhbUNvbnN1bWVyIGV4dGVuZHMgU3RyZWFtQ29uc3VtZXI8TGlzdDxpbnQ+PiB7CiAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKICBmaW5hbCBfU29ja2V0IHNvY2tldDsKICBpbnQgb2Zmc2V0OwogIExpc3Q8aW50PiBidWZmZXI7CiAgYm9vbCBwYXVzZWQgPSBmYWxzZTsKICBDb21wbGV0ZXIgc3RyZWFtQ29tcGxldGVyOwoKICBfU29ja2V0U3RyZWFtQ29uc3VtZXIodGhpcy5zb2NrZXQpOwoKICBGdXR1cmU8U29ja2V0PiBhZGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSB7CiAgICBzb2NrZXQuX2Vuc3VyZVJhd1NvY2tldFN1YnNjcmlwdGlvbigpOwogICAgc3RyZWFtQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxTb2NrZXQ+KCk7CiAgICBpZiAoc29ja2V0Ll9yYXcgIT0gbnVsbCkgewogICAgICBzdWJzY3JpcHRpb24gPSBzdHJlYW0ubGlzdGVuKChkYXRhKSB7CiAgICAgICAgYXNzZXJ0KCFwYXVzZWQpOwogICAgICAgIGFzc2VydChidWZmZXIgPT0gbnVsbCk7CiAgICAgICAgYnVmZmVyID0gZGF0YTsKICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgIHRyeSB7CiAgICAgICAgICB3cml0ZSgpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgICBkb25lKGUpOwogICAgICAgIH0KICAgICAgfSwgb25FcnJvcjogKGVycm9yLCBbc3RhY2tUcmFjZV0pIHsKICAgICAgICBzb2NrZXQuZGVzdHJveSgpOwogICAgICAgIGRvbmUoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9LCBvbkRvbmU6ICgpIHsKICAgICAgICBkb25lKCk7CiAgICAgIH0sIGNhbmNlbE9uRXJyb3I6IHRydWUpOwogICAgfQogICAgcmV0dXJuIHN0cmVhbUNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICBGdXR1cmU8U29ja2V0PiBjbG9zZSgpIHsKICAgIHNvY2tldC5fY29uc3VtZXJEb25lKCk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShzb2NrZXQpOwogIH0KCiAgdm9pZCB3cml0ZSgpIHsKICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgcmV0dXJuOwogICAgYXNzZXJ0KGJ1ZmZlciAhPSBudWxsKTsKICAgIC8vIFdyaXRlIGFzIG11Y2ggYXMgcG9zc2libGUuCiAgICBvZmZzZXQgKz0gc29ja2V0Ll93cml0ZShidWZmZXIsIG9mZnNldCwgYnVmZmVyLmxlbmd0aCAtIG9mZnNldCk7CiAgICBpZiAob2Zmc2V0IDwgYnVmZmVyLmxlbmd0aCkgewogICAgICBpZiAoIXBhdXNlZCkgewogICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgIH0KICAgICAgc29ja2V0Ll9lbmFibGVXcml0ZUV2ZW50KCk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIgPSBudWxsOwogICAgICBpZiAocGF1c2VkKSB7CiAgICAgICAgcGF1c2VkID0gZmFsc2U7CiAgICAgICAgc3Vic2NyaXB0aW9uLnJlc3VtZSgpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIGRvbmUoW2Vycm9yLCBzdGFja1RyYWNlXSkgewogICAgaWYgKHN0cmVhbUNvbXBsZXRlciAhPSBudWxsKSB7CiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICAgICAgc3RyZWFtQ29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbUNvbXBsZXRlci5jb21wbGV0ZShzb2NrZXQpOwogICAgICB9CiAgICAgIHN0cmVhbUNvbXBsZXRlciA9IG51bGw7CiAgICB9CiAgfQoKICB2b2lkIHN0b3AoKSB7CiAgICBpZiAoc3Vic2NyaXB0aW9uID09IG51bGwpIHJldHVybjsKICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKICAgIHN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICBwYXVzZWQgPSBmYWxzZTsKICAgIHNvY2tldC5fZGlzYWJsZVdyaXRlRXZlbnQoKTsKICB9Cn0KCmNsYXNzIF9Tb2NrZXQgZXh0ZW5kcyBTdHJlYW08TGlzdDxpbnQ+PiBpbXBsZW1lbnRzIFNvY2tldCB7CiAgUmF3U29ja2V0IF9yYXc7IC8vIFNldCB0byBudWxsIHdoZW4gdGhlIHJhdyBzb2NrZXQgaXMgY2xvc2VkLgogIGJvb2wgX2Nsb3NlZCA9IGZhbHNlOyAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSByYXcgc29ja2V0IGlzIGNsb3NlZC4KICBTdHJlYW1Db250cm9sbGVyPExpc3Q8aW50Pj4gX2NvbnRyb2xsZXI7CiAgYm9vbCBfY29udHJvbGxlckNsb3NlZCA9IGZhbHNlOwogIF9Tb2NrZXRTdHJlYW1Db25zdW1lciBfY29uc3VtZXI7CiAgSU9TaW5rIF9zaW5rOwogIHZhciBfc3Vic2NyaXB0aW9uOwogIHZhciBfZGV0YWNoUmVhZHk7CgogIF9Tb2NrZXQodGhpcy5fcmF3KSB7CiAgICBfY29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPExpc3Q8aW50Pj4oCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25DYW5jZWw6IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uUGF1c2U6IF9vblBhdXNlU3RhdGVDaGFuZ2UsCiAgICAgICAgb25SZXN1bWU6IF9vblBhdXNlU3RhdGVDaGFuZ2UpOwogICAgX2NvbnN1bWVyID0gbmV3IF9Tb2NrZXRTdHJlYW1Db25zdW1lcih0aGlzKTsKICAgIF9zaW5rID0gbmV3IElPU2luayhfY29uc3VtZXIpOwoKICAgIC8vIERpc2FibGUgcmVhZCBldmVudHMgdW50aWwgdGhlcmUgaXMgYSBzdWJzY3JpcHRpb24uCiAgICBfcmF3LnJlYWRFdmVudHNFbmFibGVkID0gZmFsc2U7CgogICAgLy8gRGlzYWJsZSB3cml0ZSBldmVudHMgdW50aWwgdGhlIGNvbnN1bWVyIG5lZWRzIGl0IGZvciBwZW5kaW5nIHdyaXRlcy4KICAgIF9yYXcud3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgfQoKICBmYWN0b3J5IF9Tb2NrZXQuX3dyaXRlUGlwZSgpIHsKICAgIHJldHVybiBuZXcgX1NvY2tldChuZXcgX1Jhd1NvY2tldC5fd3JpdGVQaXBlKCkpOwogIH0KCiAgZmFjdG9yeSBfU29ja2V0Ll9yZWFkUGlwZShbaW50IGZkXSkgewogICAgcmV0dXJuIG5ldyBfU29ja2V0KG5ldyBfUmF3U29ja2V0Ll9yZWFkUGlwZShmZCkpOwogIH0KCiAgLy8gTm90ZTogdGhpcyBjb2RlIHNlZW1zIGEgYml0IHN1c3BpY2lvdXMgYmVjYXVzZSBfcmF3IGNhbiBiZSBfUmF3U29ja2V0IGFuZAogIC8vIGl0IGNhbiBiZSBfUmF3U2VjdXJlU29ja2V0IGJlY2F1c2UgX1NlY3VyZVNvY2tldCBleHRlbmRzIF9Tb2NrZXQKICAvLyBhbmQgdGhlc2UgdHdvIHR5cGVzIGFyZSBpbmNvbXBhdGlibGUgYmVjYXVzZSBfUmF3U2VjdXJlU29ja2V0Ll9zb2NrZXQKICAvLyBpcyBTb2NrZXQgYW5kIG5vdCBfTmF0aXZlU29ja2V0LgogIF9OYXRpdmVTb2NrZXQgZ2V0IF9uYXRpdmVTb2NrZXQgPT4gKF9yYXcgYXMgX1Jhd1NvY2tldCkuX3NvY2tldDsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gbGlzdGVuKHZvaWQgb25EYXRhKExpc3Q8aW50PiBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgRW5jb2RpbmcgZ2V0IGVuY29kaW5nID0+IF9zaW5rLmVuY29kaW5nOwoKICB2b2lkIHNldCBlbmNvZGluZyhFbmNvZGluZyB2YWx1ZSkgewogICAgX3NpbmsuZW5jb2RpbmcgPSB2YWx1ZTsKICB9CgogIHZvaWQgd3JpdGUoT2JqZWN0IG9iaikgPT4gX3Npbmsud3JpdGUob2JqKTsKCiAgdm9pZCB3cml0ZWxuKFtPYmplY3Qgb2JqID0gIiJdKSA9PiBfc2luay53cml0ZWxuKG9iaik7CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpID0+IF9zaW5rLndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwoKICB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtzZXAgPSAiIl0pID0+IF9zaW5rLndyaXRlQWxsKG9iamVjdHMsIHNlcCk7CgogIHZvaWQgYWRkKExpc3Q8aW50PiBieXRlcykgPT4gX3NpbmsuYWRkKGJ5dGVzKTsKCiAgdm9pZCBhZGRFcnJvcihPYmplY3QgZXJyb3IsIFtTdGFja1RyYWNlIHN0YWNrVHJhY2VdKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHNlbmQgZXJyb3JzIG9uIHNvY2tldHMiKTsKICB9CgogIEZ1dHVyZSBhZGRTdHJlYW0oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtKSB7CiAgICByZXR1cm4gX3NpbmsuYWRkU3RyZWFtKHN0cmVhbSk7CiAgfQoKICBGdXR1cmUgZmx1c2goKSA9PiBfc2luay5mbHVzaCgpOwoKICBGdXR1cmUgY2xvc2UoKSA9PiBfc2luay5jbG9zZSgpOwoKICBGdXR1cmUgZ2V0IGRvbmUgPT4gX3NpbmsuZG9uZTsKCiAgdm9pZCBkZXN0cm95KCkgewogICAgLy8gRGVzdHJveSBjYW4gYWx3YXlzIGJlIGNhbGxlZCB0byBnZXQgcmlkIG9mIGEgc29ja2V0LgogICAgaWYgKF9yYXcgPT0gbnVsbCkgcmV0dXJuOwogICAgX2NvbnN1bWVyLnN0b3AoKTsKICAgIF9jbG9zZVJhd1NvY2tldCgpOwogICAgX2NvbnRyb2xsZXJDbG9zZWQgPSB0cnVlOwogICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICB9CgogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCkgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIF9yYXcuc2V0T3B0aW9uKG9wdGlvbiwgZW5hYmxlZCk7CiAgfQoKICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pIHsKICAgIGlmIChfcmF3ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9yYXcuZ2V0UmF3T3B0aW9uKG9wdGlvbik7CiAgfQoKICB2b2lkIHNldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICBfcmF3Py5zZXRSYXdPcHRpb24ob3B0aW9uKTsKICB9CgogIGludCBnZXQgcG9ydCB7CiAgICBpZiAoX3JhdyA9PSBudWxsKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICA7CiAgICByZXR1cm4gX3Jhdy5wb3J0OwogIH0KCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzIHsKICAgIGlmIChfcmF3ID09IG51bGwpIHRocm93IGNvbnN0IFNvY2tldEV4Y2VwdGlvbi5jbG9zZWQoKTsKICAgIDsKICAgIHJldHVybiBfcmF3LmFkZHJlc3M7CiAgfQoKICBpbnQgZ2V0IHJlbW90ZVBvcnQgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgdGhyb3cgY29uc3QgU29ja2V0RXhjZXB0aW9uLmNsb3NlZCgpOwogICAgOwogICAgcmV0dXJuIF9yYXcucmVtb3RlUG9ydDsKICB9CgogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzcyB7CiAgICBpZiAoX3JhdyA9PSBudWxsKSB0aHJvdyBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCk7CiAgICA7CiAgICByZXR1cm4gX3Jhdy5yZW1vdGVBZGRyZXNzOwogIH0KCiAgRnV0dXJlIF9kZXRhY2hSYXcoKSB7CiAgICBfZGV0YWNoUmVhZHkgPSBuZXcgQ29tcGxldGVyKCk7CiAgICBfc2luay5jbG9zZSgpOwogICAgcmV0dXJuIF9kZXRhY2hSZWFkeS5mdXR1cmUudGhlbigoXykgewogICAgICBhc3NlcnQoX2NvbnN1bWVyLmJ1ZmZlciA9PSBudWxsKTsKICAgICAgdmFyIHJhdyA9IF9yYXc7CiAgICAgIF9yYXcgPSBudWxsOwogICAgICByZXR1cm4gW3JhdywgX3N1YnNjcmlwdGlvbl07CiAgICB9KTsKICB9CgogIC8vIEVuc3VyZSBhIHN1YnNjcmlwdGlvbiBvbiB0aGUgcmF3IHNvY2tldC4gQm90aCB0aGUgc3RyZWFtIGFuZCB0aGUKICAvLyBjb25zdW1lciBuZWVkcyBhIHN1YnNjcmlwdGlvbiBhcyB0aGV5IHNoYXJlIHRoZSBlcnJvciBhbmQgZG9uZQogIC8vIGV2ZW50cyBmcm9tIHRoZSByYXcgc29ja2V0LgogIHZvaWQgX2Vuc3VyZVJhd1NvY2tldFN1YnNjcmlwdGlvbigpIHsKICAgIGlmIChfc3Vic2NyaXB0aW9uID09IG51bGwgJiYgX3JhdyAhPSBudWxsKSB7CiAgICAgIF9zdWJzY3JpcHRpb24gPSBfcmF3Lmxpc3Rlbihfb25EYXRhLAogICAgICAgICAgb25FcnJvcjogX29uRXJyb3IsIG9uRG9uZTogX29uRG9uZSwgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICB9CiAgfQoKICBfY2xvc2VSYXdTb2NrZXQoKSB7CiAgICB2YXIgdG1wID0gX3JhdzsKICAgIF9yYXcgPSBudWxsOwogICAgX2Nsb3NlZCA9IHRydWU7CiAgICB0bXAuY2xvc2UoKTsKICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgX2Vuc3VyZVJhd1NvY2tldFN1YnNjcmlwdGlvbigpOwogICAgICAvLyBFbmFibGUgcmVhZCBldmVudHMgZm9yIHByb3ZpZGluZyBkYXRhIHRvIHN1YnNjcmlwdGlvbi4KICAgICAgaWYgKF9yYXcgIT0gbnVsbCkgewogICAgICAgIF9yYXcucmVhZEV2ZW50c0VuYWJsZWQgPSB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBfY29udHJvbGxlckNsb3NlZCA9IHRydWU7CiAgICAgIGlmIChfcmF3ICE9IG51bGwpIHsKICAgICAgICBfcmF3LnNodXRkb3duKFNvY2tldERpcmVjdGlvbi5yZWNlaXZlKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfb25QYXVzZVN0YXRlQ2hhbmdlKCkgewogICAgaWYgKF9yYXcgIT0gbnVsbCkgewogICAgICBfcmF3LnJlYWRFdmVudHNFbmFibGVkID0gIV9jb250cm9sbGVyLmlzUGF1c2VkOwogICAgfQogIH0KCiAgdm9pZCBfb25EYXRhKGV2ZW50KSB7CiAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgIGNhc2UgUmF3U29ja2V0RXZlbnQucmVhZDoKICAgICAgICB2YXIgYnVmZmVyID0gX3Jhdy5yZWFkKCk7CiAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSBfY29udHJvbGxlci5hZGQoYnVmZmVyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBSYXdTb2NrZXRFdmVudC53cml0ZToKICAgICAgICBfY29uc3VtZXIud3JpdGUoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkOgogICAgICAgIF9jb250cm9sbGVyQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgdm9pZCBfb25Eb25lKCkgewogICAgaWYgKCFfY29udHJvbGxlckNsb3NlZCkgewogICAgICBfY29udHJvbGxlckNsb3NlZCA9IHRydWU7CiAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICB9CiAgICBfY29uc3VtZXIuZG9uZSgpOwogIH0KCiAgdm9pZCBfb25FcnJvcihlcnJvciwgc3RhY2tUcmFjZSkgewogICAgaWYgKCFfY29udHJvbGxlckNsb3NlZCkgewogICAgICBfY29udHJvbGxlckNsb3NlZCA9IHRydWU7CiAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgIH0KICAgIF9jb25zdW1lci5kb25lKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIGludCBfd3JpdGUoTGlzdDxpbnQ+IGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpID0+CiAgICAgIF9yYXcud3JpdGUoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOwoKICB2b2lkIF9lbmFibGVXcml0ZUV2ZW50KCkgewogICAgX3Jhdy53cml0ZUV2ZW50c0VuYWJsZWQgPSB0cnVlOwogIH0KCiAgdm9pZCBfZGlzYWJsZVdyaXRlRXZlbnQoKSB7CiAgICBpZiAoX3JhdyAhPSBudWxsKSB7CiAgICAgIF9yYXcud3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICB9CiAgfQoKICB2b2lkIF9jb25zdW1lckRvbmUoKSB7CiAgICBpZiAoX2RldGFjaFJlYWR5ICE9IG51bGwpIHsKICAgICAgX2RldGFjaFJlYWR5LmNvbXBsZXRlKG51bGwpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKF9yYXcgIT0gbnVsbCkgewogICAgICAgIF9yYXcuc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uLnNlbmQpOwogICAgICAgIF9kaXNhYmxlV3JpdGVFdmVudCgpOwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHNldCBfb3duZXIob3duZXIpIHsKICAgIC8vIE5vdGU6IF9yYXcgY2FuIGJlIF9SYXdTb2NrZXQgYW5kIF9SYXdTZWN1cmVTb2NrZXQgd2hpY2ggYXJlIHR3bwogICAgLy8gaW5jb21wYXRpYmxlIHR5cGVzLgogICAgKF9yYXcgYXMgZHluYW1pYykuX293bmVyID0gb3duZXI7CiAgfQp9CgpAcGF0Y2gKY2xhc3MgUmF3RGF0YWdyYW1Tb2NrZXQgewogIEBwYXRjaAogIHN0YXRpYyBGdXR1cmU8UmF3RGF0YWdyYW1Tb2NrZXQ+IGJpbmQoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtib29sIHJldXNlQWRkcmVzczogdHJ1ZSwgYm9vbCByZXVzZVBvcnQ6IGZhbHNlLCBpbnQgdHRsOiAxfSkgewogICAgcmV0dXJuIF9SYXdEYXRhZ3JhbVNvY2tldC5iaW5kKGhvc3QsIHBvcnQsIHJldXNlQWRkcmVzcywgcmV1c2VQb3J0LCB0dGwpOwogIH0KfQoKY2xhc3MgX1Jhd0RhdGFncmFtU29ja2V0IGV4dGVuZHMgU3RyZWFtPFJhd1NvY2tldEV2ZW50PgogICAgaW1wbGVtZW50cyBSYXdEYXRhZ3JhbVNvY2tldCB7CiAgX05hdGl2ZVNvY2tldCBfc29ja2V0OwogIFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0RXZlbnQ+IF9jb250cm9sbGVyOwogIGJvb2wgX3JlYWRFdmVudHNFbmFibGVkID0gdHJ1ZTsKICBib29sIF93cml0ZUV2ZW50c0VuYWJsZWQgPSB0cnVlOwoKICBfUmF3RGF0YWdyYW1Tb2NrZXQodGhpcy5fc29ja2V0KSB7CiAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgIF9jb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8UmF3U29ja2V0RXZlbnQ+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlLAogICAgICAgIG9uQ2FuY2VsOiBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSwKICAgICAgICBvblBhdXNlOiBfb25QYXVzZVN0YXRlQ2hhbmdlLAogICAgICAgIG9uUmVzdW1lOiBfb25QYXVzZVN0YXRlQ2hhbmdlKTsKICAgIF9zb2NrZXQuc2V0SGFuZGxlcnMoCiAgICAgICAgcmVhZDogKCkgPT4gX2NvbnRyb2xsZXIuYWRkKFJhd1NvY2tldEV2ZW50LnJlYWQpLAogICAgICAgIHdyaXRlOiAoKSB7CiAgICAgICAgICAvLyBUaGUgd3JpdGUgZXZlbnQgaGFuZGxlciBpcyBhdXRvbWF0aWNhbGx5IGRpc2FibGVkIGJ5IHRoZQogICAgICAgICAgLy8gZXZlbnQgaGFuZGxlciB3aGVuIGl0IGZpcmVzLgogICAgICAgICAgd3JpdGVFdmVudHNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQud3JpdGUpOwogICAgICAgIH0sCiAgICAgICAgY2xvc2VkOiAoKSA9PiBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCksCiAgICAgICAgZGVzdHJveWVkOiAoKSB7CiAgICAgICAgICBfY29udHJvbGxlci5hZGQoUmF3U29ja2V0RXZlbnQuY2xvc2VkKTsKICAgICAgICAgIF9jb250cm9sbGVyLmNsb3NlKCk7CiAgICAgICAgfSwKICAgICAgICBlcnJvcjogem9uZS5iaW5kVW5hcnlDYWxsYmFja0d1YXJkZWQoKGUpIHsKICAgICAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGUpOwogICAgICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgICAgIH0pKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8UmF3RGF0YWdyYW1Tb2NrZXQ+IGJpbmQoCiAgICAgIGhvc3QsIGludCBwb3J0LCBib29sIHJldXNlQWRkcmVzcywgYm9vbCByZXVzZVBvcnQsIGludCB0dGwpIHsKICAgIF90aHJvd09uQmFkUG9ydChwb3J0KTsKICAgIF90aHJvd09uQmFkVHRsKHR0bCk7CiAgICByZXR1cm4gX05hdGl2ZVNvY2tldC5iaW5kRGF0YWdyYW0oaG9zdCwgcG9ydCwgcmV1c2VBZGRyZXNzLCByZXVzZVBvcnQsIHR0bCkKICAgICAgICAudGhlbigoc29ja2V0KSA9PiBuZXcgX1Jhd0RhdGFncmFtU29ja2V0KHNvY2tldCkpOwogIH0KCiAgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiBsaXN0ZW4odm9pZCBvbkRhdGEoUmF3U29ja2V0RXZlbnQgZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9jb250cm9sbGVyLnN0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIEZ1dHVyZSBjbG9zZSgpID0+IF9zb2NrZXQuY2xvc2UoKS50aGVuPFJhd0RhdGFncmFtU29ja2V0PigoXykgPT4gdGhpcyk7CgogIGludCBzZW5kKExpc3Q8aW50PiBidWZmZXIsIEludGVybmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydCkgPT4KICAgICAgX3NvY2tldC5zZW5kKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgYWRkcmVzcywgcG9ydCk7CgogIERhdGFncmFtIHJlY2VpdmUoKSB7CiAgICByZXR1cm4gX3NvY2tldC5yZWNlaXZlKCk7CiAgfQoKICB2b2lkIGpvaW5NdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGdyb3VwLCBbTmV0d29ya0ludGVyZmFjZSBpbnRlcmZhY2VdKSB7CiAgICBfc29ja2V0LmpvaW5NdWx0aWNhc3QoZ3JvdXAsIGludGVyZmFjZSk7CiAgfQoKICB2b2lkIGxlYXZlTXVsdGljYXN0KEludGVybmV0QWRkcmVzcyBncm91cCwgW05ldHdvcmtJbnRlcmZhY2UgaW50ZXJmYWNlXSkgewogICAgX3NvY2tldC5sZWF2ZU11bHRpY2FzdChncm91cCwgaW50ZXJmYWNlKTsKICB9CgogIGJvb2wgZ2V0IHJlYWRFdmVudHNFbmFibGVkID0+IF9yZWFkRXZlbnRzRW5hYmxlZDsKICB2b2lkIHNldCByZWFkRXZlbnRzRW5hYmxlZChib29sIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT0gX3JlYWRFdmVudHNFbmFibGVkKSB7CiAgICAgIF9yZWFkRXZlbnRzRW5hYmxlZCA9IHZhbHVlOwogICAgICBpZiAoIV9jb250cm9sbGVyLmlzUGF1c2VkKSBfcmVzdW1lKCk7CiAgICB9CiAgfQoKICBib29sIGdldCB3cml0ZUV2ZW50c0VuYWJsZWQgPT4gX3dyaXRlRXZlbnRzRW5hYmxlZDsKICB2b2lkIHNldCB3cml0ZUV2ZW50c0VuYWJsZWQoYm9vbCB2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9IF93cml0ZUV2ZW50c0VuYWJsZWQpIHsKICAgICAgX3dyaXRlRXZlbnRzRW5hYmxlZCA9IHZhbHVlOwogICAgICBpZiAoIV9jb250cm9sbGVyLmlzUGF1c2VkKSBfcmVzdW1lKCk7CiAgICB9CiAgfQoKICBib29sIGdldCBtdWx0aWNhc3RMb29wYmFjayA9PgogICAgICBfc29ja2V0LmdldE9wdGlvbihTb2NrZXRPcHRpb24uX2lwTXVsdGljYXN0TG9vcCk7CiAgdm9pZCBzZXQgbXVsdGljYXN0TG9vcGJhY2soYm9vbCB2YWx1ZSkgPT4KICAgICAgX3NvY2tldC5zZXRPcHRpb24oU29ja2V0T3B0aW9uLl9pcE11bHRpY2FzdExvb3AsIHZhbHVlKTsKCiAgaW50IGdldCBtdWx0aWNhc3RIb3BzID0+IF9zb2NrZXQuZ2V0T3B0aW9uKFNvY2tldE9wdGlvbi5faXBNdWx0aWNhc3RIb3BzKTsKICB2b2lkIHNldCBtdWx0aWNhc3RIb3BzKGludCB2YWx1ZSkgPT4KICAgICAgX3NvY2tldC5zZXRPcHRpb24oU29ja2V0T3B0aW9uLl9pcE11bHRpY2FzdEhvcHMsIHZhbHVlKTsKCiAgTmV0d29ya0ludGVyZmFjZSBnZXQgbXVsdGljYXN0SW50ZXJmYWNlID0+IHRocm93ICJOb3QgaW1wbGVtZW50ZWQiOwogIHZvaWQgc2V0IG11bHRpY2FzdEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlIHZhbHVlKSA9PgogICAgICB0aHJvdyAiTm90IGltcGxlbWVudGVkIjsKCiAgYm9vbCBnZXQgYnJvYWRjYXN0RW5hYmxlZCA9PiBfc29ja2V0LmdldE9wdGlvbihTb2NrZXRPcHRpb24uX2lwQnJvYWRjYXN0KTsKICB2b2lkIHNldCBicm9hZGNhc3RFbmFibGVkKGJvb2wgdmFsdWUpID0+CiAgICAgIF9zb2NrZXQuc2V0T3B0aW9uKFNvY2tldE9wdGlvbi5faXBCcm9hZGNhc3QsIHZhbHVlKTsKCiAgaW50IGdldCBwb3J0ID0+IF9zb2NrZXQucG9ydDsKCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzID0+IF9zb2NrZXQuYWRkcmVzczsKCiAgX3BhdXNlKCkgewogICAgX3NvY2tldC5zZXRMaXN0ZW5pbmcocmVhZDogZmFsc2UsIHdyaXRlOiBmYWxzZSk7CiAgfQoKICB2b2lkIF9yZXN1bWUoKSB7CiAgICBfc29ja2V0LnNldExpc3RlbmluZyhyZWFkOiBfcmVhZEV2ZW50c0VuYWJsZWQsIHdyaXRlOiBfd3JpdGVFdmVudHNFbmFibGVkKTsKICB9CgogIHZvaWQgX29uUGF1c2VTdGF0ZUNoYW5nZSgpIHsKICAgIGlmIChfY29udHJvbGxlci5pc1BhdXNlZCkgewogICAgICBfcGF1c2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIF9yZXN1bWUoKTsKICAgIH0KICB9CgogIHZvaWQgX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UoKSB7CiAgICBpZiAoX2NvbnRyb2xsZXIuaGFzTGlzdGVuZXIpIHsKICAgICAgX3Jlc3VtZSgpOwogICAgfSBlbHNlIHsKICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgfQogIH0KCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSA9PgogICAgICBfc29ja2V0LmdldFJhd09wdGlvbihvcHRpb24pOwogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pID0+IF9zb2NrZXQuc2V0UmF3T3B0aW9uKG9wdGlvbik7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpEYXRhZ3JhbSBfbWFrZURh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KCk7Cn0KCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIFg1MDlDZXJ0aWZpY2F0ZSB7CiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgWDUwOUNlcnRpZmljYXRlLl8oKSA9PiBuZXcgX1g1MDlDZXJ0aWZpY2F0ZUltcGwoKTsKfQoKY2xhc3MgX1NlY3VyZVNvY2tldCBleHRlbmRzIF9Tb2NrZXQgaW1wbGVtZW50cyBTZWN1cmVTb2NrZXQgewogIF9SYXdTZWN1cmVTb2NrZXQgZ2V0IF9yYXcgPT4gc3VwZXIuX3JhdyBhcyBfUmF3U2VjdXJlU29ja2V0OwoKICBfU2VjdXJlU29ja2V0KFJhd1NlY3VyZVNvY2tldCByYXcpIDogc3VwZXIocmF3KTsKCiAgdm9pZCByZW5lZ290aWF0ZSgKICAgICAge2Jvb2wgdXNlU2Vzc2lvbkNhY2hlOiB0cnVlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZX0pIHsKICAgIF9yYXcucmVuZWdvdGlhdGUoCiAgICAgICAgdXNlU2Vzc2lvbkNhY2hlOiB1c2VTZXNzaW9uQ2FjaGUsCiAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUpOwogIH0KCiAgWDUwOUNlcnRpZmljYXRlIGdldCBwZWVyQ2VydGlmaWNhdGUgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigicGVlckNlcnRpZmljYXRlIGNhbGxlZCBvbiBkZXN0cm95ZWQgU2VjdXJlU29ja2V0Iik7CiAgICB9CiAgICByZXR1cm4gX3Jhdy5wZWVyQ2VydGlmaWNhdGU7CiAgfQoKICBTdHJpbmcgZ2V0IHNlbGVjdGVkUHJvdG9jb2wgewogICAgaWYgKF9yYXcgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgU3RhdGVFcnJvcigic2VsZWN0ZWRQcm90b2NvbCBjYWxsZWQgb24gZGVzdHJveWVkIFNlY3VyZVNvY2tldCIpOwogICAgfQogICAgcmV0dXJuIF9yYXcuc2VsZWN0ZWRQcm90b2NvbDsKICB9Cn0KCi8qKgogKiBfU2VjdXJlRmlsdGVySW1wbCB3cmFwcyBhIGZpbHRlciB0aGF0IGVuY3J5cHRzIGFuZCBkZWNyeXB0cyBkYXRhIHRyYXZlbGxpbmcKICogb3ZlciBhbiBlbmNyeXB0ZWQgc29ja2V0LiAgVGhlIGZpbHRlciBhbHNvIGhhbmRsZXMgdGhlIGhhbmRzaGFraW5nCiAqIGFuZCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uCiAqCiAqIFRoZSBmaWx0ZXIgZXhwb3NlcyBpdHMgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFzIERhcnQgb2JqZWN0cyB0aGF0CiAqIGFyZSBiYWNrZWQgYnkgYW4gZXh0ZXJuYWwgQyBhcnJheSBvZiBieXRlcywgc28gdGhhdCBib3RoIERhcnQgY29kZSBhbmQKICogbmF0aXZlIGNvZGUgY2FuIGFjY2VzcyB0aGUgc2FtZSBkYXRhLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfU2VjdXJlRmlsdGVySW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBfU2VjdXJlRmlsdGVyIHsKICAvLyBQZXJmb3JtYW5jZSBpcyBpbXByb3ZlZCBpZiBhIGZ1bGwgYnVmZmVyIG9mIHBsYWludGV4dCBmaXRzCiAgLy8gaW4gdGhlIGVuY3J5cHRlZCBidWZmZXIsIHdoZW4gZW5jcnlwdGVkLgogIC8vIFNJWkUgYW5kIEVOQ1JZUFRFRF9TSVpFIGFyZSByZWZlcmVuY2VkIGZyb20gQysrLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgZmluYWwgaW50IFNJWkUgPSA4ICogMTAyNDsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgc3RhdGljIGZpbmFsIGludCBFTkNSWVBURURfU0laRSA9IDEwICogMTAyNDsKCiAgX1NlY3VyZUZpbHRlckltcGwoKSB7CiAgICBidWZmZXJzID0gbmV3IExpc3Q8X0V4dGVybmFsQnVmZmVyPihfUmF3U2VjdXJlU29ja2V0LmJ1ZmZlckNvdW50KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX1Jhd1NlY3VyZVNvY2tldC5idWZmZXJDb3VudDsgKytpKSB7CiAgICAgIGJ1ZmZlcnNbaV0gPSBuZXcgX0V4dGVybmFsQnVmZmVyKAogICAgICAgICAgX1Jhd1NlY3VyZVNvY2tldC5faXNCdWZmZXJFbmNyeXB0ZWQoaSkgPyBFTkNSWVBURURfU0laRSA6IFNJWkUpOwogICAgfQogIH0KCiAgdm9pZCBjb25uZWN0KAogICAgICBTdHJpbmcgaG9zdE5hbWUsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIGlzX3NlcnZlciwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICBVaW50OExpc3QgcHJvdG9jb2xzKSBuYXRpdmUgIlNlY3VyZVNvY2tldF9Db25uZWN0IjsKCiAgdm9pZCBkZXN0cm95KCkgewogICAgYnVmZmVycyA9IG51bGw7CiAgICBfZGVzdHJveSgpOwogIH0KCiAgdm9pZCBfZGVzdHJveSgpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0Rlc3Ryb3kiOwoKICB2b2lkIGhhbmRzaGFrZSgpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0hhbmRzaGFrZSI7CgogIHZvaWQgcmVoYW5kc2hha2UoKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CgogIGludCBwcm9jZXNzQnVmZmVyKGludCBidWZmZXJJbmRleCkgPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOwoKICBTdHJpbmcgc2VsZWN0ZWRQcm90b2NvbCgpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X0dldFNlbGVjdGVkUHJvdG9jb2wiOwoKICB2b2lkIHJlbmVnb3RpYXRlKGJvb2wgdXNlU2Vzc2lvbkNhY2hlLCBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUpIG5hdGl2ZSAiU2VjdXJlU29ja2V0X1JlbmVnb3RpYXRlIjsKCiAgdm9pZCBpbml0KCkgbmF0aXZlICJTZWN1cmVTb2NrZXRfSW5pdCI7CgogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgcGVlckNlcnRpZmljYXRlIG5hdGl2ZSAiU2VjdXJlU29ja2V0X1BlZXJDZXJ0aWZpY2F0ZSI7CgogIHZvaWQgcmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKEZ1bmN0aW9uIGNhbGxiYWNrKQogICAgICBuYXRpdmUgIlNlY3VyZVNvY2tldF9SZWdpc3RlckJhZENlcnRpZmljYXRlQ2FsbGJhY2siOwoKICB2b2lkIHJlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFjayhGdW5jdGlvbiBoYW5kc2hha2VDb21wbGV0ZUhhbmRsZXIpCiAgICAgIG5hdGl2ZSAiU2VjdXJlU29ja2V0X1JlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFjayI7CgogIC8vIFRoaXMgaXMgYSBzZWN1cml0eSBpc3N1ZSwgYXMgaXQgZXhwb3NlcyBhIHJhdyBwb2ludGVyIHRvIERhcnQgY29kZS4KICBpbnQgX3BvaW50ZXIoKSBuYXRpdmUgIlNlY3VyZVNvY2tldF9GaWx0ZXJQb2ludGVyIjsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiZ2V0IikKICBMaXN0PF9FeHRlcm5hbEJ1ZmZlcj4gYnVmZmVyczsKfQoKQHBhdGNoCmNsYXNzIFNlY3VyaXR5Q29udGV4dCB7CiAgQHBhdGNoCiAgZmFjdG9yeSBTZWN1cml0eUNvbnRleHQoe2Jvb2wgd2l0aFRydXN0ZWRSb290czogZmFsc2V9KSB7CiAgICByZXR1cm4gbmV3IF9TZWN1cml0eUNvbnRleHQod2l0aFRydXN0ZWRSb290cyk7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgU2VjdXJpdHlDb250ZXh0IGdldCBkZWZhdWx0Q29udGV4dCB7CiAgICByZXR1cm4gX1NlY3VyaXR5Q29udGV4dC5kZWZhdWx0Q29udGV4dDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBib29sIGdldCBhbHBuU3VwcG9ydGVkID0+IHRydWU7Cn0KCmNsYXNzIF9TZWN1cml0eUNvbnRleHQgZXh0ZW5kcyBOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczEKICAgIGltcGxlbWVudHMgU2VjdXJpdHlDb250ZXh0IHsKICBfU2VjdXJpdHlDb250ZXh0KGJvb2wgd2l0aFRydXN0ZWRSb290cykgewogICAgX2NyZWF0ZU5hdGl2ZUNvbnRleHQoKTsKICAgIGlmICh3aXRoVHJ1c3RlZFJvb3RzKSB7CiAgICAgIF90cnVzdEJ1aWx0aW5Sb290cygpOwogICAgfQogIH0KCiAgdm9pZCBfY3JlYXRlTmF0aXZlQ29udGV4dCgpIG5hdGl2ZSAiU2VjdXJpdHlDb250ZXh0X0FsbG9jYXRlIjsKCiAgc3RhdGljIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBkZWZhdWx0Q29udGV4dCA9IG5ldyBfU2VjdXJpdHlDb250ZXh0KHRydWUpOwoKICB2b2lkIHVzZVByaXZhdGVLZXkoU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSAobmV3IEZpbGUoZmlsZSkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgdXNlUHJpdmF0ZUtleUJ5dGVzKGJ5dGVzLCBwYXNzd29yZDogcGFzc3dvcmQpOwogIH0KCiAgdm9pZCB1c2VQcml2YXRlS2V5Qnl0ZXMoTGlzdDxpbnQ+IGtleUJ5dGVzLCB7U3RyaW5nIHBhc3N3b3JkfSkKICAgICAgbmF0aXZlICJTZWN1cml0eUNvbnRleHRfVXNlUHJpdmF0ZUtleUJ5dGVzIjsKCiAgdm9pZCBzZXRUcnVzdGVkQ2VydGlmaWNhdGVzKFN0cmluZyBmaWxlLCB7U3RyaW5nIHBhc3N3b3JkfSkgewogICAgTGlzdDxpbnQ+IGJ5dGVzID0gKG5ldyBGaWxlKGZpbGUpKS5yZWFkQXNCeXRlc1N5bmMoKTsKICAgIHNldFRydXN0ZWRDZXJ0aWZpY2F0ZXNCeXRlcyhieXRlcywgcGFzc3dvcmQ6IHBhc3N3b3JkKTsKICB9CgogIHZvaWQgc2V0VHJ1c3RlZENlcnRpZmljYXRlc0J5dGVzKExpc3Q8aW50PiBjZXJ0Qnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9TZXRUcnVzdGVkQ2VydGlmaWNhdGVzQnl0ZXMiOwoKICB2b2lkIHVzZUNlcnRpZmljYXRlQ2hhaW4oU3RyaW5nIGZpbGUsIHtTdHJpbmcgcGFzc3dvcmR9KSB7CiAgICBMaXN0PGludD4gYnl0ZXMgPSAobmV3IEZpbGUoZmlsZSkpLnJlYWRBc0J5dGVzU3luYygpOwogICAgdXNlQ2VydGlmaWNhdGVDaGFpbkJ5dGVzKGJ5dGVzLCBwYXNzd29yZDogcGFzc3dvcmQpOwogIH0KCiAgdm9pZCB1c2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXMoTGlzdDxpbnQ+IGNoYWluQnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9Vc2VDZXJ0aWZpY2F0ZUNoYWluQnl0ZXMiOwoKICB2b2lkIHNldENsaWVudEF1dGhvcml0aWVzKFN0cmluZyBmaWxlLCB7U3RyaW5nIHBhc3N3b3JkfSkgewogICAgTGlzdDxpbnQ+IGJ5dGVzID0gKG5ldyBGaWxlKGZpbGUpKS5yZWFkQXNCeXRlc1N5bmMoKTsKICAgIHNldENsaWVudEF1dGhvcml0aWVzQnl0ZXMoYnl0ZXMsIHBhc3N3b3JkOiBwYXNzd29yZCk7CiAgfQoKICB2b2lkIHNldENsaWVudEF1dGhvcml0aWVzQnl0ZXMoTGlzdDxpbnQ+IGF1dGhDZXJ0Qnl0ZXMsIHtTdHJpbmcgcGFzc3dvcmR9KQogICAgICBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9TZXRDbGllbnRBdXRob3JpdGllc0J5dGVzIjsKCiAgdm9pZCBzZXRBbHBuUHJvdG9jb2xzKExpc3Q8U3RyaW5nPiBwcm90b2NvbHMsIGJvb2wgaXNTZXJ2ZXIpIHsKICAgIFVpbnQ4TGlzdCBlbmNvZGVkUHJvdG9jb2xzID0KICAgICAgICBTZWN1cml0eUNvbnRleHQuX3Byb3RvY29sc1RvTGVuZ3RoRW5jb2RpbmcocHJvdG9jb2xzKTsKICAgIF9zZXRBbHBuUHJvdG9jb2xzKGVuY29kZWRQcm90b2NvbHMsIGlzU2VydmVyKTsKICB9CgogIHZvaWQgX3NldEFscG5Qcm90b2NvbHMoVWludDhMaXN0IHByb3RvY29scywgYm9vbCBpc1NlcnZlcikKICAgICAgbmF0aXZlICJTZWN1cml0eUNvbnRleHRfU2V0QWxwblByb3RvY29scyI7CiAgdm9pZCBfdHJ1c3RCdWlsdGluUm9vdHMoKSBuYXRpdmUgIlNlY3VyaXR5Q29udGV4dF9UcnVzdEJ1aWx0aW5Sb290cyI7Cn0KCi8qKgogKiBfWDUwOUNlcnRpZmljYXRlSW1wbCB3cmFwcyBhbiBYNTA5IGNlcnRpZmljYXRlIG9iamVjdCBoZWxkIGJ5IHRoZSBCb3JpbmdTU0wKICogbGlicmFyeS4gSXQgZXhwb3NlcyB0aGUgZmllbGRzIG9mIHRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QuCiAqLwpjbGFzcyBfWDUwOUNlcnRpZmljYXRlSW1wbCBleHRlbmRzIE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMQogICAgaW1wbGVtZW50cyBYNTA5Q2VydGlmaWNhdGUgewogIC8vIFRoZSBuYXRpdmUgZmllbGQgbXVzdCBiZSBzZXQgbWFudWFsbHkgb24gYSBuZXcgb2JqZWN0LCBpbiBuYXRpdmUgY29kZS4KICAvLyBUaGlzIGlzIGRvbmUgYnkgV3JhcHBlZFg1MDkgaW4gc2VjdXJlX3NvY2tldC5jYy4KICBfWDUwOUNlcnRpZmljYXRlSW1wbCgpOwoKICBVaW50OExpc3QgX2NhY2hlZERlcjsKICBVaW50OExpc3QgZ2V0IF9kZXIgbmF0aXZlICJYNTA5X0RlciI7CiAgVWludDhMaXN0IGdldCBkZXIgewogICAgaWYgKF9jYWNoZWREZXIgPT0gbnVsbCkgewogICAgICBfY2FjaGVkRGVyID0gX2RlcjsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkRGVyOwogIH0KCiAgU3RyaW5nIF9jYWNoZWRQZW07CiAgU3RyaW5nIGdldCBfcGVtIG5hdGl2ZSAiWDUwOV9QZW0iOwogIFN0cmluZyBnZXQgcGVtIHsKICAgIGlmIChfY2FjaGVkUGVtID09IG51bGwpIHsKICAgICAgX2NhY2hlZFBlbSA9IF9wZW07CiAgICB9CiAgICByZXR1cm4gX2NhY2hlZFBlbTsKICB9CgogIFVpbnQ4TGlzdCBfY2FjaGVkU2hhMTsKICBVaW50OExpc3QgZ2V0IF9zaGExIG5hdGl2ZSAiWDUwOV9TaGExIjsKICBVaW50OExpc3QgZ2V0IHNoYTEgewogICAgaWYgKF9jYWNoZWRTaGExID09IG51bGwpIHsKICAgICAgX2NhY2hlZFNoYTEgPSBfc2hhMTsKICAgIH0KICAgIHJldHVybiBfY2FjaGVkU2hhMTsKICB9CgogIFN0cmluZyBnZXQgc3ViamVjdCBuYXRpdmUgIlg1MDlfU3ViamVjdCI7CiAgU3RyaW5nIGdldCBpc3N1ZXIgbmF0aXZlICJYNTA5X0lzc3VlciI7CiAgRGF0ZVRpbWUgZ2V0IHN0YXJ0VmFsaWRpdHkgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChfc3RhcnRWYWxpZGl0eSgpLAogICAgICAgIGlzVXRjOiB0cnVlKTsKICB9CgogIERhdGVUaW1lIGdldCBlbmRWYWxpZGl0eSB7CiAgICByZXR1cm4gbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKF9lbmRWYWxpZGl0eSgpLCBpc1V0YzogdHJ1ZSk7CiAgfQoKICBpbnQgX3N0YXJ0VmFsaWRpdHkoKSBuYXRpdmUgIlg1MDlfU3RhcnRWYWxpZGl0eSI7CiAgaW50IF9lbmRWYWxpZGl0eSgpIG5hdGl2ZSAiWDUwOV9FbmRWYWxpZGl0eSI7Cn0KgP0ATk48ASABBxUJNyQCAQcWCTYCAQcaGAkcPQIBPj8BMwEUIywvFio8PQQBKBhQBiEEASAYUQYiBAIBBE9GIQNISikEGjkfQC42HCQcLwEYRz0oSwYEARAXHxYlJToBExQQBAExATQBOAFIAUcBSEgBKgFNATk8AUw/AUk2ASMhAgEHGAk8MwQBCS4sBAEJKQIBOCEsHBwcBgQBQQFMATc6MwQBQTMBQDo8BAFLPAE9OjkEAUk5AT46OgQBTToBQSE/MwQBPTFIAgEETz0EPCFMNhoBGCgWHhkGFwQBFSUTHhkGFwQBGSoXHxsGGAQBLCofRRYEAR1RBAE0MAIBJmRhcnQ6aW8tcGF0Y2gvc2VjdXJlX3NvY2tldF9wYXRjaC5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9jb21tb24uZGFydI7KLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8vIENvbnN0YW50cyB1c2VkIHdoZW4gd29ya2luZyB3aXRoIG5hdGl2ZSBwb3J0cy4KLy8gVGhlc2UgbXVzdCBtYXRjaCB0aGUgY29uc3RhbnRzIGluIHJ1bnRpbWUvYmluL2RhcnR1dGlscy5oIGNsYXNzIENPYmplY3QuCmNvbnN0IGludCBfc3VjY2Vzc1Jlc3BvbnNlID0gMDsKY29uc3QgaW50IF9pbGxlZ2FsQXJndW1lbnRSZXNwb25zZSA9IDE7CmNvbnN0IGludCBfb3NFcnJvclJlc3BvbnNlID0gMjsKY29uc3QgaW50IF9maWxlQ2xvc2VkUmVzcG9uc2UgPSAzOwoKY29uc3QgaW50IF9lcnJvclJlc3BvbnNlRXJyb3JUeXBlID0gMDsKY29uc3QgaW50IF9vc0Vycm9yUmVzcG9uc2VFcnJvckNvZGUgPSAxOwpjb25zdCBpbnQgX29zRXJyb3JSZXNwb25zZU1lc3NhZ2UgPSAyOwoKLy8gRnVuY3Rpb25zIHVzZWQgdG8gcmVjZWl2ZSBleGNlcHRpb25zIGZyb20gbmF0aXZlIHBvcnRzLgpib29sIF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpID0+CiAgICByZXNwb25zZSBpcyBMaXN0ICYmIHJlc3BvbnNlWzBdICE9IF9zdWNjZXNzUmVzcG9uc2U7CgovKioKICogUmV0dXJucyBhbiBFeGNlcHRpb24gb3IgYW4gRXJyb3IKICovCl9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGF0aCkgewogIGFzc2VydChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7CiAgc3dpdGNoIChyZXNwb25zZVtfZXJyb3JSZXNwb25zZUVycm9yVHlwZV0pIHsKICAgIGNhc2UgX2lsbGVnYWxBcmd1bWVudFJlc3BvbnNlOgogICAgICByZXR1cm4gbmV3IEFyZ3VtZW50RXJyb3IoIiRtZXNzYWdlOiAkcGF0aCIpOwogICAgY2FzZSBfb3NFcnJvclJlc3BvbnNlOgogICAgICB2YXIgZXJyID0gbmV3IE9TRXJyb3IocmVzcG9uc2VbX29zRXJyb3JSZXNwb25zZU1lc3NhZ2VdLAogICAgICAgICAgcmVzcG9uc2VbX29zRXJyb3JSZXNwb25zZUVycm9yQ29kZV0pOwogICAgICByZXR1cm4gbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obWVzc2FnZSwgcGF0aCwgZXJyKTsKICAgIGNhc2UgX2ZpbGVDbG9zZWRSZXNwb25zZToKICAgICAgcmV0dXJuIG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJGaWxlIGNsb3NlZCIsIHBhdGgpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG5ldyBFeGNlcHRpb24oIlVua25vd24gZXJyb3IiKTsKICB9Cn0KCi8qKgogKiBCYXNlIGNsYXNzIGZvciBhbGwgSU8gcmVsYXRlZCBleGNlcHRpb25zLgogKi8KYWJzdHJhY3QgY2xhc3MgSU9FeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIFN0cmluZyB0b1N0cmluZygpID0+ICJJT0V4Y2VwdGlvbiI7Cn0KCi8qKgogICogQW4gW09TRXJyb3JdIG9iamVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhbiBlcnJvciBmcm9tIHRoZQogICogb3BlcmF0aW5nIHN5c3RlbS4KICAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIE9TRXJyb3IgewogIC8qKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gT1MgZXJyb3IgY29kZSBpcyBhdmFpbGFibGUuICovCiAgc3RhdGljIGNvbnN0IGludCBub0Vycm9yQ29kZSA9IC0xOwoKICAvLy8gRXJyb3IgbWVzc2FnZSBzdXBwbGllZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVGhpcyBtYXkgYmUgYG51bGxgIG9yCiAgLy8vIGVtcHR5IGlmIG5vIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgLy8vIEVycm9yIGNvZGUgc3VwcGxpZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uCiAgLy8vCiAgLy8vIFdpbGwgaGF2ZSB0aGUgdmFsdWUgW09TRXJyb3Iubm9FcnJvckNvZGVdIGlmIHRoZXJlIGlzIG5vIGVycm9yIGNvZGUKICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KICBmaW5hbCBpbnQgZXJyb3JDb2RlOwoKICAvKiogQ3JlYXRlcyBhbiBPU0Vycm9yIG9iamVjdCBmcm9tIGEgbWVzc2FnZSBhbmQgYW4gZXJyb3JDb2RlLiAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBPU0Vycm9yKFt0aGlzLm1lc3NhZ2UgPSAiIiwgdGhpcy5lcnJvckNvZGUgPSBub0Vycm9yQ29kZV0pOwoKICAvKiogQ29udmVydHMgYW4gT1NFcnJvciBvYmplY3QgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uICovCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoIk9TIEVycm9yIik7CiAgICBpZiAobWVzc2FnZS5pc05vdEVtcHR5KSB7CiAgICAgIHNiLi53cml0ZSgiOiAiKS4ud3JpdGUobWVzc2FnZSk7CiAgICAgIGlmIChlcnJvckNvZGUgIT0gbm9FcnJvckNvZGUpIHsKICAgICAgICBzYi4ud3JpdGUoIiwgZXJybm8gPSAiKS4ud3JpdGUoZXJyb3JDb2RlLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGVycm9yQ29kZSAhPSBub0Vycm9yQ29kZSkgewogICAgICBzYi4ud3JpdGUoIjogZXJybm8gPSAiKS4ud3JpdGUoZXJyb3JDb2RlLnRvU3RyaW5nKCkpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovLyBPYmplY3QgZm9yIGhvbGRpbmcgYSBidWZmZXIgYW5kIGFuIG9mZnNldC4KY2xhc3MgX0J1ZmZlckFuZFN0YXJ0IHsKICBMaXN0PGludD4gYnVmZmVyOwogIGludCBzdGFydDsKICBfQnVmZmVyQW5kU3RhcnQodGhpcy5idWZmZXIsIHRoaXMuc3RhcnQpOwp9CgovLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgTGlzdCBjYW4gYmUgc2VyaWFsaXplZCB0aHJvdWdoIGEgbmF0aXZlIHBvcnQuCi8vIE9ubHkgSW50OExpc3QgYW5kIFVpbnQ4TGlzdCBMaXN0cyBhcmUgc2VyaWFsaXplZCBkaXJlY3RseS4KLy8gQWxsIG90aGVyIGxpc3RzIGFyZSBmaXJzdCBjb3BpZWQgaW50byBhIFVpbnQ4TGlzdC4gVGhpcyBoYXMgdGhlIGFkZGVkCi8vIGJlbmVmaXQgdGhhdCBpdCBpcyBmYXN0ZXIgdG8gYWNjZXNzIGZyb20gdGhlIEMgY29kZSBhcyB3ZWxsLgpfQnVmZmVyQW5kU3RhcnQgX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YSgKICAgIExpc3Q8aW50PiBidWZmZXIsIGludCBzdGFydCwgaW50IGVuZCkgewogIGlmIChidWZmZXIgaXMgVWludDhMaXN0IHx8IGJ1ZmZlciBpcyBJbnQ4TGlzdCkgewogICAgcmV0dXJuIG5ldyBfQnVmZmVyQW5kU3RhcnQoYnVmZmVyLCBzdGFydCk7CiAgfQogIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICB2YXIgbmV3QnVmZmVyID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOwogIGludCBqID0gc3RhcnQ7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgaW50IHZhbHVlID0gYnVmZmVyW2pdOwogICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3IoIkxpc3QgZWxlbWVudCBpcyBudWxsIGF0IGluZGV4ICRqIik7CiAgICBuZXdCdWZmZXJbaV0gPSB2YWx1ZTsKICAgIGorKzsKICB9CiAgcmV0dXJuIG5ldyBfQnVmZmVyQW5kU3RhcnQobmV3QnVmZmVyLCAwKTsKfQoKY2xhc3MgX0lPQ3J5cHRvIHsKICBleHRlcm5hbCBzdGF0aWMgVWludDhMaXN0IGdldFJhbmRvbUJ5dGVzKGludCBjb3VudCk7Cn0KdwBOTjwBEQEyTCAoICMBJyknATsjOQEEJARAJi8jMxs/MDoeOw0tBAIBBC0EMiYCAQRCFgUaEEclAUw4GAEzBkohFwFEHEQBQBYqGh4nJj4IKzwGGgQCAS4YFA0sAgFHPklANCwzLwQcKRElG1AaCQQsAgESNwIBE2RhcnQ6aW8vY29tbW9uLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2RpcmVjdG9yeS5kYXJ0r6gvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIEEgcmVmZXJlbmNlIHRvIGEgZGlyZWN0b3J5IChvciBfZm9sZGVyXykgb24gdGhlIGZpbGUgc3lzdGVtLgogKgogKiBBIERpcmVjdG9yeSBpbnN0YW5jZSBpcyBhbiBvYmplY3QgaG9sZGluZyBhIFtwYXRoXSBvbiB3aGljaCBvcGVyYXRpb25zIGNhbgogKiBiZSBwZXJmb3JtZWQuIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY2FuIGJlIFthYnNvbHV0ZV0gb3IgcmVsYXRpdmUuCiAqIFlvdSBjYW4gZ2V0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IHVzaW5nIHRoZSBnZXR0ZXIgW3BhcmVudF0sCiAqIGEgcHJvcGVydHkgaW5oZXJpdGVkIGZyb20gW0ZpbGVTeXN0ZW1FbnRpdHldLgogKgogKiBJbiBhZGRpdGlvbiB0byBiZWluZyB1c2VkIGFzIGFuIGluc3RhbmNlIHRvIGFjY2VzcyB0aGUgZmlsZSBzeXN0ZW0sCiAqIERpcmVjdG9yeSBoYXMgYSBudW1iZXIgb2Ygc3RhdGljIHByb3BlcnRpZXMsIHN1Y2ggYXMgW3N5c3RlbVRlbXBdLAogKiB3aGljaCBnZXRzIHRoZSBzeXN0ZW0ncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgdGhlIGdldHRlciBhbmQgc2V0dGVyCiAqIFtjdXJyZW50XSwgd2hpY2ggeW91IGNhbiB1c2UgdG8gYWNjZXNzIG9yIGNoYW5nZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuCiAqCiAqIENyZWF0ZSBhIG5ldyBEaXJlY3Rvcnkgb2JqZWN0IHdpdGggYSBwYXRobmFtZSB0byBhY2Nlc3MgdGhlIHNwZWNpZmllZAogKiBkaXJlY3Rvcnkgb24gdGhlIGZpbGUgc3lzdGVtIGZyb20geW91ciBwcm9ncmFtLgogKgogKiAgICAgdmFyIG15RGlyID0gbmV3IERpcmVjdG9yeSgnbXlEaXInKTsKICoKICogTW9zdCBtZXRob2RzIGluIHRoaXMgY2xhc3Mgb2NjdXIgaW4gc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBwYWlycywKICogZm9yIGV4YW1wbGUsIFtjcmVhdGVdIGFuZCBbY3JlYXRlU3luY10uCiAqIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIHJlYXNvbiBmb3IgdXNpbmcgdGhlIHN5bmNocm9ub3VzIHZlcnNpb24KICogb2YgYSBtZXRob2QsIHByZWZlciB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gdG8gYXZvaWQgYmxvY2tpbmcgeW91ciBwcm9ncmFtLgogKgogKiAjIyBDcmVhdGUgYSBkaXJlY3RvcnkKICoKICogVGhlIGZvbGxvd2luZyBjb2RlIHNhbXBsZSBjcmVhdGVzIGEgZGlyZWN0b3J5IHVzaW5nIHRoZSBbY3JlYXRlXSBtZXRob2QuCiAqIEJ5IHNldHRpbmcgdGhlIGByZWN1cnNpdmVgIHBhcmFtZXRlciB0byB0cnVlLCB5b3UgY2FuIGNyZWF0ZSB0aGUKICogbmFtZWQgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIG5lY2Vzc2FyeSBwYXJlbnQgZGlyZWN0b3JpZXMsCiAqIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3QuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgdm9pZCBtYWluKCkgewogKiAgICAgICAvLyBDcmVhdGVzIGRpci8gYW5kIGRpci9zdWJkaXIvLgogKiAgICAgICBuZXcgRGlyZWN0b3J5KCdkaXIvc3ViZGlyJykuY3JlYXRlKHJlY3Vyc2l2ZTogdHJ1ZSkKICogICAgICAgICAvLyBUaGUgY3JlYXRlZCBkaXJlY3RvcnkgaXMgcmV0dXJuZWQgYXMgYSBGdXR1cmUuCiAqICAgICAgICAgLnRoZW4oKERpcmVjdG9yeSBkaXJlY3RvcnkpIHsKICogICAgICAgICAgIHByaW50KGRpcmVjdG9yeS5wYXRoKTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqICMjIExpc3QgYSBkaXJlY3RvcnkKICoKICogVXNlIHRoZSBbbGlzdF0gb3IgW2xpc3RTeW5jXSBtZXRob2RzIHRvIGdldCB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCiAqIGNvbnRhaW5lZCBieSBhIGRpcmVjdG9yeS4KICogU2V0IGByZWN1cnNpdmVgIHRvIHRydWUgdG8gcmVjdXJzaXZlbHkgbGlzdCBhbGwgc3ViZGlyZWN0b3JpZXMuCiAqIFNldCBgZm9sbG93TGlua3NgIHRvIHRydWUgdG8gZm9sbG93IHN5bWJvbGljIGxpbmtzLgogKiBUaGUgbGlzdCBtZXRob2QgcmV0dXJucyBhIFtTdHJlYW1dIHRoYXQgcHJvdmlkZXMgRmlsZVN5c3RlbUVudGl0eQogKiBvYmplY3RzLiBVc2UgdGhlIGxpc3RlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIGVhY2ggb2JqZWN0CiAqIGFzIGl0IGJlY29tZSBhdmFpbGFibGUuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgdm9pZCBtYWluKCkgewogKiAgICAgICAvLyBHZXQgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeS4KICogICAgICAgdmFyIHN5c3RlbVRlbXBEaXIgPSBEaXJlY3Rvcnkuc3lzdGVtVGVtcDsKICoKICogICAgICAgLy8gTGlzdCBkaXJlY3RvcnkgY29udGVudHMsIHJlY3Vyc2luZyBpbnRvIHN1Yi1kaXJlY3RvcmllcywKICogICAgICAgLy8gYnV0IG5vdCBmb2xsb3dpbmcgc3ltYm9saWMgbGlua3MuCiAqICAgICAgIHN5c3RlbVRlbXBEaXIubGlzdChyZWN1cnNpdmU6IHRydWUsIGZvbGxvd0xpbmtzOiBmYWxzZSkKICogICAgICAgICAubGlzdGVuKChGaWxlU3lzdGVtRW50aXR5IGVudGl0eSkgewogKiAgICAgICAgICAgcHJpbnQoZW50aXR5LnBhdGgpOwogKiAgICAgICAgIH0pOwogKiAgICAgfQogKgogKiAjIyBUaGUgdXNlIG9mIEZ1dHVyZXMKICoKICogSS9PIG9wZXJhdGlvbnMgY2FuIGJsb2NrIGEgcHJvZ3JhbSBmb3Igc29tZSBwZXJpb2Qgb2YgdGltZSB3aGlsZSBpdCB3YWl0cyBmb3IKICogdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4gVG8gYXZvaWQgdGhpcywgYWxsCiAqIG1ldGhvZHMgaW52b2x2aW5nIEkvTyBoYXZlIGFuIGFzeW5jaHJvbm91cyB2YXJpYW50IHdoaWNoIHJldHVybnMgYSBbRnV0dXJlXS4KICogVGhpcyBmdXR1cmUgY29tcGxldGVzIHdoZW4gdGhlIEkvTyBvcGVyYXRpb24gZmluaXNoZXMuIFdoaWxlIHRoZSBJL08KICogb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLCB0aGUgRGFydCBwcm9ncmFtIGlzIG5vdCBibG9ja2VkLAogKiBhbmQgY2FuIHBlcmZvcm0gb3RoZXIgb3BlcmF0aW9ucy4KICoKICogRm9yIGV4YW1wbGUsCiAqIHRoZSBbZXhpc3RzXSBtZXRob2QsIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGUgZGlyZWN0b3J5IGV4aXN0cywKICogcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgdXNpbmcgYSBGdXR1cmUuCiAqIFVzZSBgdGhlbmAgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiwgd2hpY2ggaXMgY2FsbGVkIHdoZW4KICogdGhlIHZhbHVlIGlzIHJlYWR5LgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIGZpbmFsIG15RGlyID0gbmV3IERpcmVjdG9yeSgnZGlyJyk7CiAqICAgICAgIG15RGlyLmV4aXN0cygpLnRoZW4oKGlzVGhlcmUpIHsKICogICAgICAgICBpc1RoZXJlID8gcHJpbnQoJ2V4aXN0cycpIDogcHJpbnQoJ25vbi1leGlzdGVudCcpOwogKiAgICAgICB9KTsKICogICAgIH0KICoKICoKICogSW4gYWRkaXRpb24gdG8gZXhpc3RzLCB0aGUgW3N0YXRdLCBbcmVuYW1lXSwgYW5kCiAqIG90aGVyIG1ldGhvZHMsIHJldHVybiBGdXR1cmVzLgogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogKiBbRGFydCBieSBFeGFtcGxlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZGFydC1ieS1leGFtcGxlLyNmaWxlcy1kaXJlY3Rvcmllcy1hbmQtc3ltbGlua3MpCiAqICAgcHJvdmlkZXMgYWRkaXRpb25hbCB0YXNrLW9yaWVudGVkIGNvZGUgc2FtcGxlcyB0aGF0IHNob3cgaG93IHRvIHVzZQogKiAgIHZhcmlvdXMgQVBJIGZyb20gdGhlIERpcmVjdG9yeSBjbGFzcyBhbmQgdGhlIHJlbGF0ZWQgW0ZpbGVdIGNsYXNzLgogKgogKiAqIFtJL08gZm9yIENvbW1hbmQtTGluZQogKiAgIEFwcHNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI2RhcnRpby0tLWlvLWZvci1jb21tYW5kLWxpbmUtYXBwcykKICogICBhIHNlY3Rpb24gZnJvbSBfQSBUb3VyIG9mIHRoZSBEYXJ0IExpYnJhcmllc18gY292ZXJzIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICoKICogKiBbV3JpdGUgQ29tbWFuZC1MaW5lIEFwcHNdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL3R1dG9yaWFscy9jbWRsaW5lLyksCiAqICAgYSB0dXRvcmlhbCBhYm91dCB3cml0aW5nIGNvbW1hbmQtbGluZSBhcHBzLCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dAogKiAgIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYWJzdHJhY3QgY2xhc3MgRGlyZWN0b3J5IGltcGxlbWVudHMgRmlsZVN5c3RlbUVudGl0eSB7CiAgLyoqCiAgICogR2V0cyB0aGUgcGF0aCBvZiB0aGlzIGRpcmVjdG9yeS4KICAgKi8KICBTdHJpbmcgZ2V0IHBhdGg7CgogIC8qKgogICAqIENyZWF0ZXMgYSBbRGlyZWN0b3J5XSBvYmplY3QuCiAgICoKICAgKiBJZiBbcGF0aF0gaXMgYSByZWxhdGl2ZSBwYXRoLCBpdCB3aWxsIGJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHNlZSBbRGlyZWN0b3J5LmN1cnJlbnRdKSwgd2hlbiB1c2VkLgogICAqCiAgICogSWYgW3BhdGhdIGlzIGFuIGFic29sdXRlIHBhdGgsIGl0IHdpbGwgYmUgaW1tdW5lIHRvIGNoYW5nZXMgdG8gdGhlCiAgICogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBEaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKICAgIGZpbmFsIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIG5ldyBfRGlyZWN0b3J5KHBhdGgpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5jcmVhdGVEaXJlY3RvcnkocGF0aCk7CiAgfQoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBEaXJlY3RvcnkuZnJvbVJhd1BhdGgoVWludDhMaXN0IHBhdGgpIHsKICAgIC8vIFRPRE8oYmtvbnlpKTogSGFuZGxlIG92ZXJyaWRlcy4KICAgIHJldHVybiBuZXcgX0RpcmVjdG9yeS5mcm9tUmF3UGF0aChwYXRoKTsKICB9CgogIC8qKgogICAqIENyZWF0ZSBhIERpcmVjdG9yeSBvYmplY3QgZnJvbSBhIFVSSS4KICAgKgogICAqIElmIFt1cmldIGNhbm5vdCByZWZlcmVuY2UgYSBkaXJlY3RvcnkgdGhpcyB0aHJvd3MgW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIGZhY3RvcnkgRGlyZWN0b3J5LmZyb21VcmkoVXJpIHVyaSkgPT4gbmV3IERpcmVjdG9yeSh1cmkudG9GaWxlUGF0aCgpKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGRpcmVjdG9yeSBvYmplY3QgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgd29ya2luZwogICAqIGRpcmVjdG9yeS4KICAgKi8KICBzdGF0aWMgRGlyZWN0b3J5IGdldCBjdXJyZW50IHsKICAgIGZpbmFsIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9EaXJlY3RvcnkuY3VycmVudDsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuZ2V0Q3VycmVudERpcmVjdG9yeSgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIFtVcmldIHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5J3MgbG9jYXRpb24uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgVVJJJ3Mgc2NoZW1lIGlzIGFsd2F5cyAiZmlsZSIgaWYgdGhlIGVudGl0eSdzIFtwYXRoXSBpcwogICAqIGFic29sdXRlLCBvdGhlcndpc2UgdGhlIHNjaGVtZSB3aWxsIGJlIGVtcHR5LgogICAqIFRoZSByZXR1cm5lZCBVUkkncyBwYXRoIGFsd2F5cyBlbmRzIGluIGEgc2xhc2ggKCcvJykuCiAgICovCiAgVXJpIGdldCB1cmk7CgogIC8qKgogICAqIFNldHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIERhcnQgcHJvY2VzcyBpbmNsdWRpbmcKICAgKiBhbGwgcnVubmluZyBpc29sYXRlcy4gVGhlIG5ldyB2YWx1ZSBzZXQgY2FuIGJlIGVpdGhlciBhIFtEaXJlY3RvcnldCiAgICogb3IgYSBbU3RyaW5nXS4KICAgKgogICAqIFRoZSBuZXcgdmFsdWUgaXMgcGFzc2VkIHRvIHRoZSBPUydzIHN5c3RlbSBjYWxsIHVuY2hhbmdlZCwgc28gYQogICAqIHJlbGF0aXZlIHBhdGggcGFzc2VkIGFzIHRoZSBuZXcgd29ya2luZyBkaXJlY3Rvcnkgd2lsbCBiZQogICAqIHJlc29sdmVkIGJ5IHRoZSBPUy4KICAgKgogICAqIE5vdGUgdGhhdCBzZXR0aW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIGEgc3luY2hyb25vdXMKICAgKiBvcGVyYXRpb24gYW5kIHRoYXQgaXQgY2hhbmdlcyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgKmFsbCoKICAgKiBpc29sYXRlcy4KICAgKgogICAqIFVzZSB0aGlzIHdpdGggY2FyZSAtIGVzcGVjaWFsbHkgd2hlbiB3b3JraW5nIHdpdGggYXN5bmNocm9ub3VzCiAgICogb3BlcmF0aW9ucyBhbmQgbXVsdGlwbGUgaXNvbGF0ZXMuIENoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSwKICAgKiB3aGlsZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgcGVuZGluZyBvciB3aGVuIG90aGVyIGlzb2xhdGVzCiAgICogYXJlIHdvcmtpbmcgd2l0aCB0aGUgZmlsZSBzeXN0ZW0sIGNhbiBsZWFkIHRvIHVuZXhwZWN0ZWQgcmVzdWx0cy4KICAgKi8KICBzdGF0aWMgdm9pZCBzZXQgY3VycmVudChwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIF9EaXJlY3RvcnkuY3VycmVudCA9IHBhdGg7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG92ZXJyaWRlcy5zZXRDdXJyZW50RGlyZWN0b3J5KHBhdGgpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyB0aGUgZGlyZWN0b3J5IHdpdGggdGhpcyBuYW1lLgogICAqCiAgICogSWYgW3JlY3Vyc2l2ZV0gaXMgZmFsc2UsIG9ubHkgdGhlIGxhc3QgZGlyZWN0b3J5IGluIHRoZSBwYXRoIGlzCiAgICogY3JlYXRlZC4gSWYgW3JlY3Vyc2l2ZV0gaXMgdHJ1ZSwgYWxsIG5vbi1leGlzdGluZyBwYXRoIGNvbXBvbmVudHMKICAgKiBhcmUgY3JlYXRlZC4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBub3RoaW5nIGlzIGRvbmUuCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8RGlyZWN0b3J5PjpdIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIGRpcmVjdG9yeSBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQuIElmIHRoZSBkaXJlY3RvcnkgY2Fubm90IGJlCiAgICogY3JlYXRlZCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8RGlyZWN0b3J5PiBjcmVhdGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNyZWF0ZXMgdGhlIGRpcmVjdG9yeSB3aXRoIHRoaXMgbmFtZS4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCBvbmx5IHRoZSBsYXN0IGRpcmVjdG9yeSBpbiB0aGUgcGF0aCBpcwogICAqIGNyZWF0ZWQuIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIGFsbCBub24tZXhpc3RpbmcgcGF0aCBjb21wb25lbnRzCiAgICogYXJlIGNyZWF0ZWQuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgbm90aGluZyBpcyBkb25lLgogICAqCiAgICogSWYgdGhlIGRpcmVjdG9yeSBjYW5ub3QgYmUgY3JlYXRlZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIHZvaWQgY3JlYXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CgogIC8qKgogICAqIEdldHMgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeS4KICAgKgogICAqIEdldHMgdGhlIGRpcmVjdG9yeSBwcm92aWRlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBmb3IgY3JlYXRpbmcKICAgKiB0ZW1wb3JhcnkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluLgogICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3lzdGVtIHRlbXAgZGlyZWN0b3J5IGlzIHBsYXRmb3JtLWRlcGVuZGVudCwKICAgKiBhbmQgbWF5IGJlIHNldCBieSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KICAgKi8KICBzdGF0aWMgRGlyZWN0b3J5IGdldCBzeXN0ZW1UZW1wIHsKICAgIGZpbmFsIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9EaXJlY3Rvcnkuc3lzdGVtVGVtcDsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSgpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gdGhpcyBkaXJlY3RvcnkuIEFkZGl0aW9uYWwgcmFuZG9tCiAgICogY2hhcmFjdGVycyBhcmUgYXBwZW5kZWQgdG8gW3ByZWZpeF0gdG8gcHJvZHVjZSBhIHVuaXF1ZSBkaXJlY3RvcnkKICAgKiBuYW1lLiBJZiBbcHJlZml4XSBpcyBtaXNzaW5nIG9yIG51bGwsIHRoZSBlbXB0eSBzdHJpbmcgaXMgdXNlZAogICAqIGZvciBbcHJlZml4XS4KICAgKgogICAqIFJldHVybnMgYSBbOkZ1dHVyZTxEaXJlY3Rvcnk+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgbmV3bHkKICAgKiBjcmVhdGVkIHRlbXBvcmFyeSBkaXJlY3RvcnkuCiAgICovCiAgRnV0dXJlPERpcmVjdG9yeT4gY3JlYXRlVGVtcChbU3RyaW5nIHByZWZpeF0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIHRoaXMgZGlyZWN0b3J5LgogICAqIEFkZGl0aW9uYWwgcmFuZG9tIGNoYXJhY3RlcnMgYXJlIGFwcGVuZGVkIHRvIFtwcmVmaXhdIHRvIHByb2R1Y2UKICAgKiBhIHVuaXF1ZSBkaXJlY3RvcnkgbmFtZS4gSWYgW3ByZWZpeF0gaXMgbWlzc2luZyBvciBudWxsLCB0aGUgZW1wdHkKICAgKiBzdHJpbmcgaXMgdXNlZCBmb3IgW3ByZWZpeF0uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIHRlbXBvcmFyeSBkaXJlY3RvcnkuCiAgICovCiAgRGlyZWN0b3J5IGNyZWF0ZVRlbXBTeW5jKFtTdHJpbmcgcHJlZml4XSk7CgogIEZ1dHVyZTxTdHJpbmc+IHJlc29sdmVTeW1ib2xpY0xpbmtzKCk7CgogIFN0cmluZyByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmMoKTsKCiAgLyoqCiAgICogUmVuYW1lcyB0aGlzIGRpcmVjdG9yeS4gUmV0dXJucyBhIFs6RnV0dXJlPERpcmVjdG9yeT46XSB0aGF0IGNvbXBsZXRlcwogICAqIHdpdGggYSBbRGlyZWN0b3J5XSBpbnN0YW5jZSBmb3IgdGhlIHJlbmFtZWQgZGlyZWN0b3J5LgogICAqCiAgICogSWYgbmV3UGF0aCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgdGhhdCBkaXJlY3RvcnkgaXMKICAgKiByZXBsYWNlZC4gSWYgbmV3UGF0aCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUsIHRoZSBvcGVyYXRpb24KICAgKiBmYWlscyBhbmQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPERpcmVjdG9yeT4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZW5hbWVzIHRoaXMgZGlyZWN0b3J5LiBSZXR1cm5zIGEgW0RpcmVjdG9yeV0KICAgKiBpbnN0YW5jZSBmb3IgdGhlIHJlbmFtZWQgZGlyZWN0b3J5LgogICAqCiAgICogSWYgbmV3UGF0aCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgdGhhdCBkaXJlY3RvcnkgaXMKICAgKiByZXBsYWNlZC4gSWYgbmV3UGF0aCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUgdGhlIG9wZXJhdGlvbgogICAqIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIERpcmVjdG9yeSByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIFtEaXJlY3RvcnldIGluc3RhbmNlIHdob3NlIHBhdGggaXMgdGhlIGFic29sdXRlIHBhdGggdG8gW3RoaXNdLgogICAqCiAgICogVGhlIGFic29sdXRlIHBhdGggaXMgY29tcHV0ZWQgYnkgcHJlZml4aW5nCiAgICogYSByZWxhdGl2ZSBwYXRoIHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByZXR1cm5pbmcKICAgKiBhbiBhYnNvbHV0ZSBwYXRoIHVuY2hhbmdlZC4KICAgKi8KICBEaXJlY3RvcnkgZ2V0IGFic29sdXRlOwoKICAvKioKICAgKiBMaXN0cyB0aGUgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBvZiB0aGlzIFtEaXJlY3RvcnldLgogICAqIE9wdGlvbmFsbHkgcmVjdXJzZXMgaW50byBzdWItZGlyZWN0b3JpZXMuCiAgICoKICAgKiBJZiBbZm9sbG93TGlua3NdIGlzIGZhbHNlLCB0aGVuIGFueSBzeW1ib2xpYyBsaW5rcyBmb3VuZAogICAqIGFyZSByZXBvcnRlZCBhcyBbTGlua10gb2JqZWN0cywgcmF0aGVyIHRoYW4gYXMgZGlyZWN0b3JpZXMgb3IgZmlsZXMsCiAgICogYW5kIGFyZSBub3QgcmVjdXJzZWQgaW50by4KICAgKgogICAqIElmIFtmb2xsb3dMaW5rc10gaXMgdHJ1ZSwgdGhlbiB3b3JraW5nIGxpbmtzIGFyZSByZXBvcnRlZCBhcwogICAqIGRpcmVjdG9yaWVzIG9yIGZpbGVzLCBkZXBlbmRpbmcgb24KICAgKiB0aGVpciB0eXBlLCBhbmQgbGlua3MgdG8gZGlyZWN0b3JpZXMgYXJlIHJlY3Vyc2VkIGludG8uCiAgICogQnJva2VuIGxpbmtzIGFyZSByZXBvcnRlZCBhcyBbTGlua10gb2JqZWN0cy4KICAgKiBJZiBhIHN5bWJvbGljIGxpbmsgbWFrZXMgYSBsb29wIGluIHRoZSBmaWxlIHN5c3RlbSwgdGhlbiBhIHJlY3Vyc2l2ZQogICAqIGxpc3Rpbmcgd2lsbCBub3QgZm9sbG93IGEgbGluayB0d2ljZSBpbiB0aGUKICAgKiBzYW1lIHJlY3Vyc2l2ZSBkZXNjZW50LCBidXQgd2lsbCByZXBvcnQgaXQgYXMgYSBbTGlua10KICAgKiB0aGUgc2Vjb25kIHRpbWUgaXQgaXMgc2Vlbi4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYSBzdHJlYW0gb2YgW0ZpbGVTeXN0ZW1FbnRpdHldIG9iamVjdHMKICAgKiBmb3IgdGhlIGRpcmVjdG9yaWVzLCBmaWxlcywgYW5kIGxpbmtzLgogICAqLwogIFN0cmVhbTxGaWxlU3lzdGVtRW50aXR5PiBsaXN0KAogICAgICB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlLCBib29sIGZvbGxvd0xpbmtzOiB0cnVlfSk7CgogIC8qKgogICAqIExpc3RzIHRoZSBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzIG9mIHRoaXMgW0RpcmVjdG9yeV0uCiAgICogT3B0aW9uYWxseSByZWN1cnNlcyBpbnRvIHN1Yi1kaXJlY3Rvcmllcy4KICAgKgogICAqIElmIFtmb2xsb3dMaW5rc10gaXMgZmFsc2UsIHRoZW4gYW55IHN5bWJvbGljIGxpbmtzIGZvdW5kCiAgICogYXJlIHJlcG9ydGVkIGFzIFtMaW5rXSBvYmplY3RzLCByYXRoZXIgdGhhbiBhcyBkaXJlY3RvcmllcyBvciBmaWxlcywKICAgKiBhbmQgYXJlIG5vdCByZWN1cnNlZCBpbnRvLgogICAqCiAgICogSWYgW2ZvbGxvd0xpbmtzXSBpcyB0cnVlLCB0aGVuIHdvcmtpbmcgbGlua3MgYXJlIHJlcG9ydGVkIGFzCiAgICogZGlyZWN0b3JpZXMgb3IgZmlsZXMsIGRlcGVuZGluZyBvbgogICAqIHRoZWlyIHR5cGUsIGFuZCBsaW5rcyB0byBkaXJlY3RvcmllcyBhcmUgcmVjdXJzZWQgaW50by4KICAgKiBCcm9rZW4gbGlua3MgYXJlIHJlcG9ydGVkIGFzIFtMaW5rXSBvYmplY3RzLgogICAqIElmIGEgbGluayBtYWtlcyBhIGxvb3AgaW4gdGhlIGZpbGUgc3lzdGVtLCB0aGVuIGEgcmVjdXJzaXZlCiAgICogbGlzdGluZyB3aWxsIG5vdCBmb2xsb3cgYSBsaW5rIHR3aWNlIGluIHRoZQogICAqIHNhbWUgcmVjdXJzaXZlIGRlc2NlbnQsIGJ1dCB3aWxsIHJlcG9ydCBpdCBhcyBhIFtMaW5rXQogICAqIHRoZSBzZWNvbmQgdGltZSBpdCBpcyBzZWVuLgogICAqCiAgICogUmV0dXJucyBhIFtMaXN0XSBjb250YWluaW5nIFtGaWxlU3lzdGVtRW50aXR5XSBvYmplY3RzIGZvciB0aGUKICAgKiBkaXJlY3RvcmllcywgZmlsZXMsIGFuZCBsaW5rcy4KICAgKi8KICBMaXN0PEZpbGVTeXN0ZW1FbnRpdHk+IGxpc3RTeW5jKAogICAgICB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlLCBib29sIGZvbGxvd0xpbmtzOiB0cnVlfSk7CgogIC8qKgogICAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIHRoaXMgRGlyZWN0b3J5IGluc3RhbmNlLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwp9CoFaAE5OPAERAQRAA05KPzEDR0ZKSwNJMwMrA0srR1ADGQNMRD0hAxkDFSo9PSkkDQkDFwNJHUM3RUQbAxkDFSszA0UuQS8hDwkDGQNRMVBIPiUDEEcrRBcDGQMQLSk+DQkDAzQiAxYDYUlIAxtqUQNSTBwEGjcGJgYTAQYjBUpFBUggBhwjNx0jBiwEARwyJy0EAQYrBUsGSQEGQBAGITcdIQYsBAEGPAVKMzsGDwEGRkkUBUU/GQVGQg8FREdGRwYiNx0hDgYpBAEGKwVFR0MFPkQ1BjUBBjkFRUdDBUAGLAEGJQVGKUYwBiQ3HSQGLwQBBkhHRBMFQyIGMQEGREZIIgU0Bi0BKQElAQZMPAVERTcGLAEGQSkFREQnBigBBk8FMEchBhoBBj4vBT5KIAVCKD0ySjE8IQU6LAYhOAEGPi8FPkogBUIoPTJBMTwhBUQkBiM4AQZCBhUCARZkYXJ0OmlvL2RpcmVjdG9yeS5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9kaXJlY3RvcnlfaW1wbC5kYXJ0tpovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKY2xhc3MgX0RpcmVjdG9yeSBleHRlbmRzIEZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBEaXJlY3RvcnkgewogIFN0cmluZyBfcGF0aDsKICBVaW50OExpc3QgX3Jhd1BhdGg7CgogIF9EaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHBhdGgsICdwYXRoJyk7CiAgICBfcGF0aCA9IHBhdGg7CiAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KF9wYXRoKTsKICB9CgogIF9EaXJlY3RvcnkuZnJvbVJhd1BhdGgoVWludDhMaXN0IHJhd1BhdGgpIHsKICAgIGlmIChyYXdQYXRoID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ3Jhd1BhdGggY2Fubm90IGJlIG51bGwnKTsKICAgIH0KICAgIF9yYXdQYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9OdWxsVGVybWluYXRlZFV0ZjhBcnJheShyYXdQYXRoKTsKICAgIF9wYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9TdHJpbmdGcm9tVXRmOEFycmF5KHJhd1BhdGgpOwogIH0KCiAgU3RyaW5nIGdldCBwYXRoID0+IF9wYXRoOwoKICBleHRlcm5hbCBzdGF0aWMgX2N1cnJlbnQoX05hbWVzcGFjZSBuYW1lc3BhY2UpOwogIGV4dGVybmFsIHN0YXRpYyBfc2V0Q3VycmVudChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwogIGV4dGVybmFsIHN0YXRpYyBfY3JlYXRlVGVtcChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3N5c3RlbVRlbXAoX05hbWVzcGFjZSBuYW1lc3BhY2UpOwogIGV4dGVybmFsIHN0YXRpYyBfZXhpc3RzKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CiAgZXh0ZXJuYWwgc3RhdGljIF9jcmVhdGUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKICBleHRlcm5hbCBzdGF0aWMgX2RlbGV0ZU5hdGl2ZSgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIHJlY3Vyc2l2ZSk7CiAgZXh0ZXJuYWwgc3RhdGljIF9yZW5hbWUoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgU3RyaW5nIG5ld1BhdGgpOwogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9maWxsV2l0aERpcmVjdG9yeUxpc3RpbmcoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLAogICAgICBMaXN0PEZpbGVTeXN0ZW1FbnRpdHk+IGxpc3QsCiAgICAgIFVpbnQ4TGlzdCByYXdQYXRoLAogICAgICBib29sIHJlY3Vyc2l2ZSwKICAgICAgYm9vbCBmb2xsb3dMaW5rcyk7CgogIHN0YXRpYyBEaXJlY3RvcnkgZ2V0IGN1cnJlbnQgewogICAgdmFyIHJlc3VsdCA9IF9jdXJyZW50KF9OYW1lc3BhY2UuX25hbWVzcGFjZSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiR2V0dGluZyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZhaWxlZCIsICIiLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIG5ldyBfRGlyZWN0b3J5KHJlc3VsdCk7CiAgfQoKICBzdGF0aWMgdm9pZCBzZXQgY3VycmVudChwYXRoKSB7CiAgICBVaW50OExpc3QgX3Jhd1BhdGg7CiAgICBpZiAocGF0aCBpcyBfRGlyZWN0b3J5KSB7CiAgICAgIC8vIEZvciBvdXIgaW50ZXJuYWwgRGlyZWN0b3J5IGltcGxlbWVudGF0aW9uLCBnbyBhaGVhZCBhbmQgdXNlIHRoZSByYXcKICAgICAgLy8gcGF0aC4KICAgICAgX3Jhd1BhdGggPSBwYXRoLl9yYXdQYXRoOwogICAgfSBlbHNlIGlmIChwYXRoIGlzIERpcmVjdG9yeSkgewogICAgICAvLyBGSVhNRShia29ueWkpOiBwYWNrYWdlOmZpbGUgcGFzc2VzIGluIGluc3RhbmNlcyBvZiBjbGFzc2VzIHdoaWNoIGRvCiAgICAgIC8vIG5vdCBoYXZlIF9wYXRoIGRlZmluZWQsIHNvIHdlIHdpbGwgZmFsbGJhY2sgdG8gdXNpbmcgdGhlIGV4aXN0aW5nCiAgICAgIC8vIHBhdGggU3RyaW5nIGZvciBub3cuCiAgICAgIF9yYXdQYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9VdGY4QXJyYXkocGF0aC5wYXRoKTsKICAgIH0gZWxzZSBpZiAocGF0aCBpcyBTdHJpbmcpIHsKICAgICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1V0ZjhBcnJheShwYXRoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCcke0Vycm9yLnNhZmVUb1N0cmluZyhwYXRoKX0gaXMgbm90IGEgU3RyaW5nIG9yJwogICAgICAgICAgJyBEaXJlY3RvcnknKTsKICAgIH0KICAgIGlmICghX0VtYmVkZGVyQ29uZmlnLl9tYXlDaGRpcikgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJUaGlzIGVtYmVkZGVyIGRpc2FsbG93cyBzZXR0aW5nIERpcmVjdG9yeS5jdXJyZW50Iik7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3NldEN1cnJlbnQoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICBpZiAocmVzdWx0IGlzIEFyZ3VtZW50RXJyb3IpIHRocm93IHJlc3VsdDsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICJTZXR0aW5nIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIFVyaSBnZXQgdXJpIHsKICAgIHJldHVybiBuZXcgVXJpLmRpcmVjdG9yeShwYXRoKTsKICB9CgogIEZ1dHVyZTxib29sPiBleGlzdHMoKSB7CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmRpcmVjdG9yeUV4aXN0cywgW251bGwsIF9yYXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbk9yRXJyb3JGcm9tUmVzcG9uc2UocmVzcG9uc2UsICJFeGlzdHMgZmFpbGVkIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlID09IDE7CiAgICB9KTsKICB9CgogIGJvb2wgZXhpc3RzU3luYygpIHsKICAgIHZhciByZXN1bHQgPSBfZXhpc3RzKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJFeGlzdHMgZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiAocmVzdWx0ID09IDEpOwogIH0KCiAgRGlyZWN0b3J5IGdldCBhYnNvbHV0ZSA9PiBuZXcgRGlyZWN0b3J5KF9hYnNvbHV0ZVBhdGgpOwoKICBGdXR1cmU8RGlyZWN0b3J5PiBjcmVhdGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIGV4aXN0cygpLnRoZW4oKGV4aXN0cykgewogICAgICAgIGlmIChleGlzdHMpIHJldHVybiB0aGlzOwogICAgICAgIGlmIChwYXRoICE9IHBhcmVudC5wYXRoKSB7CiAgICAgICAgICByZXR1cm4gcGFyZW50LmNyZWF0ZShyZWN1cnNpdmU6IHRydWUpLnRoZW4oKF8pIHsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZSgpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBjcmVhdGUoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgICBfSU9TZXJ2aWNlLmRpcmVjdG9yeUNyZWF0ZSwgW251bGwsIF9yYXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICAgIHRocm93IF9leGNlcHRpb25PckVycm9yRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiQ3JlYXRpb24gZmFpbGVkIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9KTsKICAgIH0KICB9CgogIHZvaWQgY3JlYXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICBpZiAoZXhpc3RzU3luYygpKSByZXR1cm47CiAgICAgIGlmIChwYXRoICE9IHBhcmVudC5wYXRoKSB7CiAgICAgICAgcGFyZW50LmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgICAgfQogICAgfQogICAgdmFyIHJlc3VsdCA9IF9jcmVhdGUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkNyZWF0aW9uIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBzdGF0aWMgRGlyZWN0b3J5IGdldCBzeXN0ZW1UZW1wID0+CiAgICAgIG5ldyBEaXJlY3RvcnkoX3N5c3RlbVRlbXAoX05hbWVzcGFjZS5fbmFtZXNwYWNlKSk7CgogIEZ1dHVyZTxEaXJlY3Rvcnk+IGNyZWF0ZVRlbXAoW1N0cmluZyBwcmVmaXhdKSB7CiAgICBwcmVmaXggPz89ICcnOwogICAgaWYgKHBhdGggPT0gJycpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkRpcmVjdG9yeS5jcmVhdGVUZW1wIGNhbGxlZCB3aXRoIGFuIGVtcHR5IHBhdGguICIKICAgICAgICAgICJUbyB1c2UgdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSwgdXNlIERpcmVjdG9yeS5zeXN0ZW1UZW1wIik7CiAgICB9CiAgICBTdHJpbmcgZnVsbFByZWZpeDsKICAgIC8vIEZJWE1FKGJrb255aSk6IGhlcmUgd2UncmUgdXNpbmcgYHBhdGhgIGRpcmVjdGx5LCB3aGljaCBtaWdodCBjYXVzZQogICAgLy8gaXNzdWVzIGlmIGl0IGlzIG5vdCBVVEYtOCBlbmNvZGVkLgogICAgaWYgKHBhdGguZW5kc1dpdGgoJy8nKSB8fCAoUGxhdGZvcm0uaXNXaW5kb3dzICYmIHBhdGguZW5kc1dpdGgoJ1xcJykpKSB7CiAgICAgIGZ1bGxQcmVmaXggPSAiJHBhdGgkcHJlZml4IjsKICAgIH0gZWxzZSB7CiAgICAgIGZ1bGxQcmVmaXggPSAiJHBhdGgke1BsYXRmb3JtLnBhdGhTZXBhcmF0b3J9JHByZWZpeCI7CiAgICB9CiAgICByZXR1cm4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmRpcmVjdG9yeUNyZWF0ZVRlbXAsCiAgICAgICAgW251bGwsIEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KGZ1bGxQcmVmaXgpXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbk9yRXJyb3JGcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ3JlYXRpb24gb2YgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmYWlsZWQiKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERpcmVjdG9yeShyZXNwb25zZSk7CiAgICB9KTsKICB9CgogIERpcmVjdG9yeSBjcmVhdGVUZW1wU3luYyhbU3RyaW5nIHByZWZpeF0pIHsKICAgIHByZWZpeCA/Pz0gJyc7CiAgICBpZiAocGF0aCA9PSAnJykgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRGlyZWN0b3J5LmNyZWF0ZVRlbXAgY2FsbGVkIHdpdGggYW4gZW1wdHkgcGF0aC4gIgogICAgICAgICAgIlRvIHVzZSB0aGUgc3lzdGVtIHRlbXAgZGlyZWN0b3J5LCB1c2UgRGlyZWN0b3J5LnN5c3RlbVRlbXAiKTsKICAgIH0KICAgIFN0cmluZyBmdWxsUHJlZml4OwogICAgLy8gRklYTUUoYmtvbnlpKTogaGVyZSB3ZSdyZSB1c2luZyBgcGF0aGAgZGlyZWN0bHksIHdoaWNoIG1pZ2h0IGNhdXNlCiAgICAvLyBpc3N1ZXMgaWYgaXQgaXMgbm90IFVURi04IGVuY29kZWQuCiAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpIHx8IChQbGF0Zm9ybS5pc1dpbmRvd3MgJiYgcGF0aC5lbmRzV2l0aCgnXFwnKSkpIHsKICAgICAgZnVsbFByZWZpeCA9ICIkcGF0aCRwcmVmaXgiOwogICAgfSBlbHNlIHsKICAgICAgZnVsbFByZWZpeCA9ICIkcGF0aCR7UGxhdGZvcm0ucGF0aFNlcGFyYXRvcn0kcHJlZml4IjsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfY3JlYXRlVGVtcCgKICAgICAgICBfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KGZ1bGxQcmVmaXgpKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICJDcmVhdGlvbiBvZiB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZhaWxlZCIsIGZ1bGxQcmVmaXgsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gbmV3IERpcmVjdG9yeShyZXN1bHQpOwogIH0KCiAgRnV0dXJlPERpcmVjdG9yeT4gX2RlbGV0ZSh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgICAgIF9JT1NlcnZpY2UuZGlyZWN0b3J5RGVsZXRlLCBbbnVsbCwgX3Jhd1BhdGgsIHJlY3Vyc2l2ZV0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25PckVycm9yRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiRGVsZXRpb24gZmFpbGVkIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgX2RlbGV0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIHZhciByZXN1bHQgPSBfZGVsZXRlTmF0aXZlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIHJlY3Vyc2l2ZSk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkRlbGV0aW9uIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBGdXR1cmU8RGlyZWN0b3J5PiByZW5hbWUoU3RyaW5nIG5ld1BhdGgpIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZGlyZWN0b3J5UmVuYW1lLCBbbnVsbCwgX3Jhd1BhdGgsIG5ld1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uT3JFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSwgIlJlbmFtZSBmYWlsZWQiKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERpcmVjdG9yeShuZXdQYXRoKTsKICAgIH0pOwogIH0KCiAgRGlyZWN0b3J5IHJlbmFtZVN5bmMoU3RyaW5nIG5ld1BhdGgpIHsKICAgIGlmIChuZXdQYXRoIGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfcmVuYW1lKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG5ld1BhdGgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJSZW5hbWUgZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiBuZXcgRGlyZWN0b3J5KG5ld1BhdGgpOwogIH0KCiAgU3RyZWFtPEZpbGVTeXN0ZW1FbnRpdHk+IGxpc3QoCiAgICAgIHtib29sIHJlY3Vyc2l2ZTogZmFsc2UsIGJvb2wgZm9sbG93TGlua3M6IHRydWV9KSB7CiAgICByZXR1cm4gbmV3IF9Bc3luY0RpcmVjdG9yeUxpc3RlcigKICAgICAgICAgICAgLy8gRklYTUUoYmtvbnlpKTogaGVyZSB3ZSdyZSB1c2luZyBgcGF0aGAgZGlyZWN0bHksIHdoaWNoIG1pZ2h0IGNhdXNlIGlzc3VlcwogICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgVVRGLTggZW5jb2RlZC4KICAgICAgICAgICAgRmlsZVN5c3RlbUVudGl0eS5fdG9VdGY4QXJyYXkoCiAgICAgICAgICAgICAgICBGaWxlU3lzdGVtRW50aXR5Ll9lbnN1cmVUcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpKSwKICAgICAgICAgICAgcmVjdXJzaXZlLAogICAgICAgICAgICBmb2xsb3dMaW5rcykKICAgICAgICAuc3RyZWFtOwogIH0KCiAgTGlzdDxGaWxlU3lzdGVtRW50aXR5PiBsaXN0U3luYygKICAgICAge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZSwgYm9vbCBmb2xsb3dMaW5rczogdHJ1ZX0pIHsKICAgIGlmIChyZWN1cnNpdmUgaXMhIGJvb2wgfHwgZm9sbG93TGlua3MgaXMhIGJvb2wpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSA8RmlsZVN5c3RlbUVudGl0eT5bXTsKICAgIF9maWxsV2l0aERpcmVjdG9yeUxpc3RpbmcoCiAgICAgICAgX05hbWVzcGFjZS5fbmFtZXNwYWNlLAogICAgICAgIHJlc3VsdCwKICAgICAgICAvLyBGSVhNRShia29ueWkpOiBoZXJlIHdlJ3JlIHVzaW5nIGBwYXRoYCBkaXJlY3RseSwgd2hpY2ggbWlnaHQgY2F1c2UgaXNzdWVzCiAgICAgICAgLy8gaWYgaXQgaXMgbm90IFVURi04IGVuY29kZWQuCiAgICAgICAgRmlsZVN5c3RlbUVudGl0eS5fdG9VdGY4QXJyYXkoCiAgICAgICAgICAgIEZpbGVTeXN0ZW1FbnRpdHkuX2Vuc3VyZVRyYWlsaW5nUGF0aFNlcGFyYXRvcnMocGF0aCkpLAogICAgICAgIHJlY3Vyc2l2ZSwKICAgICAgICBmb2xsb3dMaW5rcyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkRpcmVjdG9yeTogJyRwYXRoJyI7CgogIGJvb2wgX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkgPT4KICAgICAgcmVzcG9uc2UgaXMgTGlzdCAmJiByZXNwb25zZVswXSAhPSBfc3VjY2Vzc1Jlc3BvbnNlOwoKICBfZXhjZXB0aW9uT3JFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSwgU3RyaW5nIG1lc3NhZ2UpIHsKICAgIGFzc2VydChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7CiAgICBzd2l0Y2ggKHJlc3BvbnNlW19lcnJvclJlc3BvbnNlRXJyb3JUeXBlXSkgewogICAgICBjYXNlIF9pbGxlZ2FsQXJndW1lbnRSZXNwb25zZToKICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgICAgY2FzZSBfb3NFcnJvclJlc3BvbnNlOgogICAgICAgIHZhciBlcnIgPSBuZXcgT1NFcnJvcihyZXNwb25zZVtfb3NFcnJvclJlc3BvbnNlTWVzc2FnZV0sCiAgICAgICAgICAgIHJlc3BvbnNlW19vc0Vycm9yUmVzcG9uc2VFcnJvckNvZGVdKTsKICAgICAgICByZXR1cm4gbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obWVzc2FnZSwgcGF0aCwgZXJyKTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbmV3IEV4Y2VwdGlvbigiVW5rbm93biBlcnJvciIpOwogICAgfQogIH0KfQoKYWJzdHJhY3QgY2xhc3MgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzIHsKICBleHRlcm5hbCBmYWN0b3J5IF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyhpbnQgcG9pbnRlcik7CgogIGludCBnZXRQb2ludGVyKCk7Cn0KCmNsYXNzIF9Bc3luY0RpcmVjdG9yeUxpc3RlciB7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0RmlsZSA9IDA7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0RGlyZWN0b3J5ID0gMTsKICBzdGF0aWMgY29uc3QgaW50IGxpc3RMaW5rID0gMjsKICBzdGF0aWMgY29uc3QgaW50IGxpc3RFcnJvciA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBsaXN0RG9uZSA9IDQ7CgogIHN0YXRpYyBjb25zdCBpbnQgcmVzcG9uc2VUeXBlID0gMDsKICBzdGF0aWMgY29uc3QgaW50IHJlc3BvbnNlUGF0aCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCByZXNwb25zZUNvbXBsZXRlID0gMTsKICBzdGF0aWMgY29uc3QgaW50IHJlc3BvbnNlRXJyb3IgPSAyOwoKICBmaW5hbCBVaW50OExpc3QgcmF3UGF0aDsKICBmaW5hbCBib29sIHJlY3Vyc2l2ZTsKICBmaW5hbCBib29sIGZvbGxvd0xpbmtzOwoKICBTdHJlYW1Db250cm9sbGVyPEZpbGVTeXN0ZW1FbnRpdHk+IGNvbnRyb2xsZXI7CiAgYm9vbCBjYW5jZWxlZCA9IGZhbHNlOwogIGJvb2wgbmV4dFJ1bm5pbmcgPSBmYWxzZTsKICBib29sIGNsb3NlZCA9IGZhbHNlOwogIF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyBfb3BzOwogIENvbXBsZXRlciBjbG9zZUNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIoKTsKCiAgX0FzeW5jRGlyZWN0b3J5TGlzdGVyKHRoaXMucmF3UGF0aCwgdGhpcy5yZWN1cnNpdmUsIHRoaXMuZm9sbG93TGlua3MpIHsKICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxGaWxlU3lzdGVtRW50aXR5PigKICAgICAgICBvbkxpc3Rlbjogb25MaXN0ZW4sIG9uUmVzdW1lOiBvblJlc3VtZSwgb25DYW5jZWw6IG9uQ2FuY2VsLCBzeW5jOiB0cnVlKTsKICB9CgogIC8vIFdBUk5JTkc6CiAgLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgbmF0aXZlCiAgLy8gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgYXN5bmMgZGlyZWN0b3J5IGxpc3RlciBvcGVyYXRpb25zLiBJdCBzaG91bGQKICAvLyBvbmx5IGJlIGNhbGxlZCB0byBwYXNzIHRoZSBwb2ludGVyIHRvIHRoZSBJTyBTZXJ2aWNlLCB3aGljaCB3aWxsIGRlY3JlbWVudAogIC8vIHRoZSByZWZlcmVuY2UgY291bnQgd2hlbiBpdCBpcyBmaW5pc2hlZCB3aXRoIGl0LgogIGludCBfcG9pbnRlcigpIHsKICAgIHJldHVybiAoX29wcyA9PSBudWxsKSA/IG51bGwgOiBfb3BzLmdldFBvaW50ZXIoKTsKICB9CgogIFN0cmVhbTxGaWxlU3lzdGVtRW50aXR5PiBnZXQgc3RyZWFtID0+IGNvbnRyb2xsZXIuc3RyZWFtOwoKICB2b2lkIG9uTGlzdGVuKCkgewogICAgX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmRpcmVjdG9yeUxpc3RTdGFydCwKICAgICAgICBbbnVsbCwgcmF3UGF0aCwgcmVjdXJzaXZlLCBmb2xsb3dMaW5rc10pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChyZXNwb25zZSBpcyBpbnQpIHsKICAgICAgICBfb3BzID0gbmV3IF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyhyZXNwb25zZSk7CiAgICAgICAgbmV4dCgpOwogICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlIGlzIEVycm9yKSB7CiAgICAgICAgY29udHJvbGxlci5hZGRFcnJvcihyZXNwb25zZSwgcmVzcG9uc2Uuc3RhY2tUcmFjZSk7CiAgICAgICAgY2xvc2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvcihyZXNwb25zZSk7CiAgICAgICAgY2xvc2UoKTsKICAgICAgfQogICAgfSk7CiAgfQoKICB2b2lkIG9uUmVzdW1lKCkgewogICAgaWYgKCFuZXh0UnVubmluZykgewogICAgICBuZXh0KCk7CiAgICB9CiAgfQoKICBGdXR1cmUgb25DYW5jZWwoKSB7CiAgICBjYW5jZWxlZCA9IHRydWU7CiAgICAvLyBJZiB3ZSBhcmUgYWN0aXZlLCBidXQgbm90IHJlcXVlc3RpbmcsIGNsb3NlLgogICAgaWYgKCFuZXh0UnVubmluZykgewogICAgICBjbG9zZSgpOwogICAgfQoKICAgIHJldHVybiBjbG9zZUNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICB2b2lkIG5leHQoKSB7CiAgICBpZiAoY2FuY2VsZWQpIHsKICAgICAgY2xvc2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNvbnRyb2xsZXIuaXNQYXVzZWQgfHwgbmV4dFJ1bm5pbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHBvaW50ZXIgPSBfcG9pbnRlcigpOwogICAgaWYgKHBvaW50ZXIgPT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBuZXh0UnVubmluZyA9IHRydWU7CiAgICBfSU9TZXJ2aWNlLl9kaXNwYXRjaChfSU9TZXJ2aWNlLmRpcmVjdG9yeUxpc3ROZXh0LCBbcG9pbnRlcl0pCiAgICAgICAgLnRoZW4oKHJlc3VsdCkgewogICAgICBuZXh0UnVubmluZyA9IGZhbHNlOwogICAgICBpZiAocmVzdWx0IGlzIExpc3QpIHsKICAgICAgICBuZXh0KCk7CiAgICAgICAgYXNzZXJ0KHJlc3VsdC5sZW5ndGggJSAyID09IDApOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBhc3NlcnQoaSAlIDIgPT0gMCk7CiAgICAgICAgICBzd2l0Y2ggKHJlc3VsdFtpKytdKSB7CiAgICAgICAgICAgIGNhc2UgbGlzdEZpbGU6CiAgICAgICAgICAgICAgY29udHJvbGxlci5hZGQobmV3IEZpbGUuZnJvbVJhd1BhdGgocmVzdWx0W2ldKSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgbGlzdERpcmVjdG9yeToKICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZChuZXcgRGlyZWN0b3J5LmZyb21SYXdQYXRoKHJlc3VsdFtpXSkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGxpc3RMaW5rOgogICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKG5ldyBMaW5rLmZyb21SYXdQYXRoKHJlc3VsdFtpXSkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGxpc3RFcnJvcjoKICAgICAgICAgICAgICBlcnJvcihyZXN1bHRbaV0pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGxpc3REb25lOgogICAgICAgICAgICAgIGNhbmNlbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IobmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkludGVybmFsIGVycm9yIikpOwogICAgICB9CiAgICB9KTsKICB9CgogIHZvaWQgX2NsZWFudXAoKSB7CiAgICBjb250cm9sbGVyLmNsb3NlKCk7CiAgICBjbG9zZUNvbXBsZXRlci5jb21wbGV0ZSgpOwogICAgX29wcyA9IG51bGw7CiAgfQoKICB2b2lkIGNsb3NlKCkgewogICAgaWYgKGNsb3NlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobmV4dFJ1bm5pbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY2xvc2VkID0gdHJ1ZTsKCiAgICB2YXIgcG9pbnRlciA9IF9wb2ludGVyKCk7CiAgICBpZiAocG9pbnRlciA9PSBudWxsKSB7CiAgICAgIF9jbGVhbnVwKCk7CiAgICB9IGVsc2UgewogICAgICBfSU9TZXJ2aWNlLl9kaXNwYXRjaChfSU9TZXJ2aWNlLmRpcmVjdG9yeUxpc3RTdG9wLCBbcG9pbnRlcl0pCiAgICAgICAgICAud2hlbkNvbXBsZXRlKF9jbGVhbnVwKTsKICAgIH0KICB9CgogIHZvaWQgZXJyb3IobWVzc2FnZSkgewogICAgdmFyIGVycm9yVHlwZSA9IG1lc3NhZ2VbcmVzcG9uc2VFcnJvcl1bX2Vycm9yUmVzcG9uc2VFcnJvclR5cGVdOwogICAgaWYgKGVycm9yVHlwZSA9PSBfaWxsZWdhbEFyZ3VtZW50UmVzcG9uc2UpIHsKICAgICAgY29udHJvbGxlci5hZGRFcnJvcihuZXcgQXJndW1lbnRFcnJvcigpKTsKICAgIH0gZWxzZSBpZiAoZXJyb3JUeXBlID09IF9vc0Vycm9yUmVzcG9uc2UpIHsKICAgICAgdmFyIHJlc3BvbnNlRXJyb3JJbmZvID0gbWVzc2FnZVtyZXNwb25zZUVycm9yXTsKICAgICAgdmFyIGVyciA9IG5ldyBPU0Vycm9yKHJlc3BvbnNlRXJyb3JJbmZvW19vc0Vycm9yUmVzcG9uc2VNZXNzYWdlXSwKICAgICAgICAgIHJlc3BvbnNlRXJyb3JJbmZvW19vc0Vycm9yUmVzcG9uc2VFcnJvckNvZGVdKTsKICAgICAgdmFyIGVycm9yUGF0aCA9IG1lc3NhZ2VbcmVzcG9uc2VQYXRoXTsKICAgICAgaWYgKGVycm9yUGF0aCA9PSBudWxsKSB7CiAgICAgICAgZXJyb3JQYXRoID0gdXRmOC5kZWNvZGUocmF3UGF0aCwgYWxsb3dNYWxmb3JtZWQ6IHRydWUpOwogICAgICB9IGVsc2UgaWYgKGVycm9yUGF0aCBpcyBVaW50OExpc3QpIHsKICAgICAgICBlcnJvclBhdGggPSB1dGY4LmRlY29kZShtZXNzYWdlW3Jlc3BvbnNlUGF0aF0sIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICAgICAgfQogICAgICBjb250cm9sbGVyLmFkZEVycm9yKAogICAgICAgICAgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oIkRpcmVjdG9yeSBsaXN0aW5nIGZhaWxlZCIsIGVycm9yUGF0aCwgZXJyKSk7CiAgICB9IGVsc2UgewogICAgICBjb250cm9sbGVyLmFkZEVycm9yKG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIpKTsKICAgIH0KICB9Cn0KgcEATk48AREBQRAWARwuEjUEAS4bOQZFPgQBHAEySEg8REQhQBtAMhwjGRYZASEyHSVDBiMEASIYHk0PICRNSx47ITYNTxkGJiJABj8vHSVFBgQBECQEARopSChICBwIBAEWOx1EBhoEAToBNhUmISM7HQ4RGwoKDStKKkwKFQoGBAEtFSAhLAgGOx1GBgQBJTkBMhMWUUkGF0oqTSMNPAZITSgtQQgmCAQBLhMWUUkGF0oqTSMNPAYeSx0lSQYiBAE3KUUbKEoIEwgEAS5MHUYGBAEtKVEoSAglCAQBKR4hBkQdRAYjBAEhOSZZKytHFxkRBAEjOTYhBicfHxBVJydDExYTBAEtASU7ATwoMSUkHUEyPA8vBgQCASo6ARQCAR4hJiEiIQElJSkmARsYGgExGRwXIS4BSjlRBAEOS01QNhM2BAE8ARRAQx03ECY8EQ8ZEQgIBAEUGA4GBAEWFTQYDwYBIgQBEBQPDgYuDgYeGw4GGEIZGxwQKDIeIRs/FSBEFRs/FRwgFRsfFgwKD0gICAQBFBgfEQQBERIOBhcOBhMBHhsSDUQjBgQBGEUxMDA2SDktH0ArTggbUA1GBgQCARtkYXJ0OmlvL2RpcmVjdG9yeV9pbXBsLmRhcnQ0b3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2Jpbi9kaXJlY3RvcnlfcGF0Y2guZGFydIkuLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvbW1vbl9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBfRGlyZWN0b3J5IHsKICBAcGF0Y2gKICBzdGF0aWMgX2N1cnJlbnQoX05hbWVzcGFjZSBuYW1lc3BhY2UpIG5hdGl2ZSAiRGlyZWN0b3J5X0N1cnJlbnQiOwogIEBwYXRjaAogIHN0YXRpYyBfc2V0Q3VycmVudChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRGlyZWN0b3J5X1NldEN1cnJlbnQiOwogIEBwYXRjaAogIHN0YXRpYyBfY3JlYXRlVGVtcChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRGlyZWN0b3J5X0NyZWF0ZVRlbXAiOwogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX3N5c3RlbVRlbXAoX05hbWVzcGFjZSBuYW1lc3BhY2UpIG5hdGl2ZSAiRGlyZWN0b3J5X1N5c3RlbVRlbXAiOwogIEBwYXRjaAogIHN0YXRpYyBfZXhpc3RzKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCkKICAgICAgbmF0aXZlICJEaXJlY3RvcnlfRXhpc3RzIjsKICBAcGF0Y2gKICBzdGF0aWMgX2NyZWF0ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpCiAgICAgIG5hdGl2ZSAiRGlyZWN0b3J5X0NyZWF0ZSI7CiAgQHBhdGNoCiAgc3RhdGljIF9kZWxldGVOYXRpdmUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIHJlY3Vyc2l2ZSkKICAgICAgbmF0aXZlICJEaXJlY3RvcnlfRGVsZXRlIjsKICBAcGF0Y2gKICBzdGF0aWMgX3JlbmFtZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIFN0cmluZyBuZXdQYXRoKQogICAgICBuYXRpdmUgIkRpcmVjdG9yeV9SZW5hbWUiOwogIEBwYXRjaAogIHN0YXRpYyB2b2lkIF9maWxsV2l0aERpcmVjdG9yeUxpc3RpbmcoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLAogICAgICBMaXN0PEZpbGVTeXN0ZW1FbnRpdHk+IGxpc3QsCiAgICAgIFVpbnQ4TGlzdCByYXdQYXRoLAogICAgICBib29sIHJlY3Vyc2l2ZSwKICAgICAgYm9vbCBmb2xsb3dMaW5rcykgbmF0aXZlICJEaXJlY3RvcnlfRmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nIjsKfQoKQHBhdGNoCmNsYXNzIF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyB7CiAgQHBhdGNoCiAgZmFjdG9yeSBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHMoaW50IHBvaW50ZXIpID0+CiAgICAgIG5ldyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHNJbXBsKHBvaW50ZXIpOwp9CgpjbGFzcyBfQXN5bmNEaXJlY3RvcnlMaXN0ZXJPcHNJbXBsIGV4dGVuZHMgTmF0aXZlRmllbGRXcmFwcGVyQ2xhc3MxCiAgICBpbXBsZW1lbnRzIF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wcyB7CiAgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzSW1wbC5fKCk7CgogIGZhY3RvcnkgX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzSW1wbChpbnQgcG9pbnRlcikgPT4KICAgICAgbmV3IF9Bc3luY0RpcmVjdG9yeUxpc3Rlck9wc0ltcGwuXygpLi5fc2V0UG9pbnRlcihwb2ludGVyKTsKCiAgdm9pZCBfc2V0UG9pbnRlcihpbnQgcG9pbnRlcikKICAgICAgbmF0aXZlICJEaXJlY3RvcnlfU2V0QXN5bmNEaXJlY3RvcnlMaXN0ZXJQb2ludGVyIjsKICBpbnQgZ2V0UG9pbnRlcigpIG5hdGl2ZSAiRGlyZWN0b3J5X0dldEFzeW5jRGlyZWN0b3J5TGlzdGVyUG9pbnRlciI7Cn0KCi8vIENvcmVsaWIgJ1VyaS5iYXNlJyBpbXBsZW1lbnRhdGlvbi4KLy8gVXJpLmJhc2UgaXMgc3VzY2VwdGlibGUgdG8gY2hhbmdlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KVXJpIF91cmlCYXNlQ2xvc3VyZSgpIHsKICB2YXIgcmVzdWx0ID0gX0RpcmVjdG9yeS5fY3VycmVudChfTmFtZXNwYWNlLl9uYW1lc3BhY2UpOwogIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgIkdldHRpbmcgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmYWlsZWQiLCAiIiwgcmVzdWx0KTsKICB9CiAgcmV0dXJuIG5ldyBVcmkuZGlyZWN0b3J5KHJlc3VsdCk7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpfZ2V0VXJpQmFzZUNsb3N1cmUoKSA9PiBfdXJpQmFzZUNsb3N1cmU7CkkATk48ASABBxMJRAk+JQk+JQlRCTohCTohCVAhCUohCSkcIxkWRQIBByEJMzECAUQqJAE3QgEgOUYCASZIGDsbI0EEJAIBIikBImRhcnQ6aW8tcGF0Y2gvZGlyZWN0b3J5X3BhdGNoLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2VtYmVkZGVyX2NvbmZpZy5kYXJ0hSgvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLy8vIEVtYmVkZGVyLXNwZWNpZmljLCBmaW5lLWdyYWluZWQgZGFydDppbyBjb25maWd1cmF0aW9uLgovLy8KLy8vIFRoaXMgY2xhc3MgY29udGFpbnMgcGVyLUlzb2xhdGUgZmxhZ3MgdGhhdCBhbiBlbWJlZGRlciBjYW4gc2V0IHRvIHB1dAovLy8gZmluZS1ncmFpbmVkIGxpbWl0YXRpb25zIG9uIHdoYXQgcHJvY2Vzcy12aXNpYmxlIG9wZXJhdGlvbnMgSXNvbGF0ZXMgYXJlCi8vLyBwZXJtaXR0ZWQgdG8gdXNlIChlLmcuIGV4aXQoKSkuIEJ5IGRlZmF1bHQsIHRoZSB3aG9sZSBkYXJ0OmlvIEFQSSBpcwovLy8gZW5hYmxlZC4gV2hlbiBhIGRpc2FsbG93ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZCwgYW4gYFVuc3VwcG9ydGVkRXJyb3JgIGlzCi8vLyB0aHJvd24uCkBwcmFnbWEoJ3ZtOmVudHJ5LXBvaW50JykKYWJzdHJhY3QgY2xhc3MgX0VtYmVkZGVyQ29uZmlnIHsKICAvLy8gVGhlIElzb2xhdGUgbWF5IHNldCBEaXJlY3RvcnkuY3VycmVudC4KICBzdGF0aWMgYm9vbCBfbWF5Q2hkaXIgPSB0cnVlOwoKICAvLy8gVGhlIElzb2xhdGUgbWF5IGNhbGwgZXhpdCgpLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBzdGF0aWMgYm9vbCBfbWF5RXhpdCA9IHRydWU7CgogIC8vIFRoZSBJc29sYXRlIG1heSBzZXQgU3RkaW4uZWNob01vZGUuCiAgQHByYWdtYSgndm06ZW50cnktcG9pbnQnKQogIHN0YXRpYyBib29sIF9tYXlTZXRFY2hvTW9kZSA9IHRydWU7CgogIC8vIFRoZSBJc29sYXRlIG1heSBzZXQgU3RkaW4ubGluZU1vZGUuCiAgQHByYWdtYSgndm06ZW50cnktcG9pbnQnKQogIHN0YXRpYyBib29sIF9tYXlTZXRMaW5lTW9kZSA9IHRydWU7CgogIC8vLyBUaGUgSXNvbGF0ZSBtYXkgY2FsbCBzbGVlcCgpLgogIEBwcmFnbWEoJ3ZtOmVudHJ5LXBvaW50JykKICBzdGF0aWMgYm9vbCBfbWF5U2xlZXAgPSB0cnVlOwoKICAvLyBUT0RPKHpyYSk6IENvbnNpZGVyIGFkZGluZzoKICAvLyAtIGFuIG9wdGlvbiB0byBkaXNhbGxvdyBtb2RpZnlpbmcgU2VjdXJpdHlDb250ZXh0LmRlZmF1bHRDb250ZXh0CiAgLy8gLSBhbiBvcHRpb24gdG8gZGlzYWxsb3cgY2xvc2luZyBzdGRvdXQgYW5kIHN0ZGVyci4KfQooAE5OPAERATsESk1JUAwaIS0gASMcHwEpHCYBKRwmASQcIAEhRjgCARxkYXJ0OmlvL2VtYmVkZGVyX2NvbmZpZy5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9ldmVudGhhbmRsZXIuZGFydIFRLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmNsYXNzIF9FdmVudEhhbmRsZXIgewogIGV4dGVybmFsIHN0YXRpYyB2b2lkIF9zZW5kRGF0YShPYmplY3Qgc2VuZGVyLCBTZW5kUG9ydCBzZW5kUG9ydCwgaW50IGRhdGEpOwp9CgsATk48AREBFk4CARlkYXJ0OmlvL2V2ZW50aGFuZGxlci5kYXJ0N29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vZXZlbnRoYW5kbGVyX3BhdGNoLmRhcnSB5i8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgX0V2ZW50SGFuZGxlciB7CiAgQHBhdGNoCiAgc3RhdGljIHZvaWQgX3NlbmREYXRhKE9iamVjdCBzZW5kZXIsIFNlbmRQb3J0IHNlbmRQb3J0LCBpbnQgZGF0YSkKICAgICAgbmF0aXZlICJFdmVudEhhbmRsZXJfU2VuZERhdGEiOwoKICBzdGF0aWMgaW50IF90aW1lck1pbGxpc2Vjb25kQ2xvY2soKQogICAgICBuYXRpdmUgIkV2ZW50SGFuZGxlcl9UaW1lck1pbGxpc2Vjb25kQ2xvY2siOwp9ChEATk48ASABBxYJRCYBJjMCASVkYXJ0OmlvLXBhdGNoL2V2ZW50aGFuZGxlcl9wYXRjaC5kYXJ0KG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9maWxlLmRhcnTAAIUBLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBUaGUgbW9kZXMgaW4gd2hpY2ggYSBGaWxlIGNhbiBiZSBvcGVuZWQuCiAqLwpjbGFzcyBGaWxlTW9kZSB7CiAgLy8vIFRoZSBtb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBvbmx5IGZvciByZWFkaW5nLgogIHN0YXRpYyBjb25zdCByZWFkID0gY29uc3QgRmlsZU1vZGUuX2ludGVybmFsKDApOwogIEBEZXByZWNhdGVkKCJVc2UgcmVhZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUkVBRCA9IHJlYWQ7CgogIC8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gVGhlIGZpbGUgaXMKICAvLy8gb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QKICAvLy8gYWxyZWFkeSBleGlzdC4KICBzdGF0aWMgY29uc3Qgd3JpdGUgPSBjb25zdCBGaWxlTW9kZS5faW50ZXJuYWwoMSk7CiAgQERlcHJlY2F0ZWQoIlVzZSB3cml0ZSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgV1JJVEUgPSB3cml0ZTsKCiAgLy8vIE1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHRoZQogIC8vLyBlbmQgb2YgaXQuIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KICBzdGF0aWMgY29uc3QgYXBwZW5kID0gY29uc3QgRmlsZU1vZGUuX2ludGVybmFsKDIpOwogIEBEZXByZWNhdGVkKCJVc2UgYXBwZW5kIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBUFBFTkQgPSBhcHBlbmQ7CgogIC8vLyBNb2RlIGZvciBvcGVuaW5nIGEgZmlsZSBmb3Igd3JpdGluZyAqb25seSouIFRoZSBmaWxlIGlzCiAgLy8vIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90CiAgLy8vIGFscmVhZHkgZXhpc3QuCiAgc3RhdGljIGNvbnN0IHdyaXRlT25seSA9IGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCgzKTsKICBARGVwcmVjYXRlZCgiVXNlIHdyaXRlT25seSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgV1JJVEVfT05MWSA9IHdyaXRlT25seTsKCiAgLy8vIE1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIGZvciB3cml0aW5nICpvbmx5KiB0byB0aGUKICAvLy8gZW5kIG9mIGl0LiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCiAgc3RhdGljIGNvbnN0IHdyaXRlT25seUFwcGVuZCA9IGNvbnN0IEZpbGVNb2RlLl9pbnRlcm5hbCg0KTsKICBARGVwcmVjYXRlZCgiVXNlIHdyaXRlT25seUFwcGVuZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgV1JJVEVfT05MWV9BUFBFTkQgPSB3cml0ZU9ubHlBcHBlbmQ7CgogIGZpbmFsIGludCBfbW9kZTsKCiAgY29uc3QgRmlsZU1vZGUuX2ludGVybmFsKHRoaXMuX21vZGUpOwp9CgovLy8gVGhlIG1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIG9ubHkgZm9yIHJlYWRpbmcuCkBEZXByZWNhdGVkKCJVc2UgRmlsZU1vZGUucmVhZCBpbnN0ZWFkIikKY29uc3QgUkVBRCA9IEZpbGVNb2RlLnJlYWQ7CgovLy8gVGhlIG1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiBUaGUgZmlsZSBpcwovLy8gb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QKLy8vIGFscmVhZHkgZXhpc3QuCkBEZXByZWNhdGVkKCJVc2UgRmlsZU1vZGUud3JpdGUgaW5zdGVhZCIpCmNvbnN0IFdSSVRFID0gRmlsZU1vZGUud3JpdGU7CgovLy8gVGhlIG1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHRoZQovLy8gZW5kIG9mIGl0LiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCkBEZXByZWNhdGVkKCJVc2UgRmlsZU1vZGUuYXBwZW5kIGluc3RlYWQiKQpjb25zdCBBUFBFTkQgPSBGaWxlTW9kZS5hcHBlbmQ7CgovLy8gTW9kZSBmb3Igb3BlbmluZyBhIGZpbGUgZm9yIHdyaXRpbmcgKm9ubHkqLiBUaGUgZmlsZSBpcwovLy8gb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QKLy8vIGFscmVhZHkgZXhpc3QuCkBEZXByZWNhdGVkKCJVc2UgRmlsZU1vZGUud3JpdGVPbmx5IGluc3RlYWQiKQpjb25zdCBXUklURV9PTkxZID0gRmlsZU1vZGUud3JpdGVPbmx5OwoKLy8vIE1vZGUgZm9yIG9wZW5pbmcgYSBmaWxlIGZvciB3cml0aW5nICpvbmx5KiB0byB0aGUKLy8vIGVuZCBvZiBpdC4gVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgpARGVwcmVjYXRlZCgiVXNlIEZpbGVNb2RlLndyaXRlT25seUFwcGVuZCBpbnN0ZWFkIikKY29uc3QgV1JJVEVfT05MWV9BUFBFTkQgPSBGaWxlTW9kZS53cml0ZU9ubHlBcHBlbmQ7CgovLy8gVHlwZSBvZiBsb2NrIHdoZW4gcmVxdWVzdGluZyBhIGxvY2sgb24gYSBmaWxlLgpjbGFzcyBGaWxlTG9jayB7CiAgLy8vIFNoYXJlZCBmaWxlIGxvY2suCiAgc3RhdGljIGNvbnN0IHNoYXJlZCA9IGNvbnN0IEZpbGVMb2NrLl9pbnRlcm5hbCgxKTsKICBARGVwcmVjYXRlZCgiVXNlIHNoYXJlZCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU0hBUkVEID0gc2hhcmVkOwoKICAvLy8gRXhjbHVzaXZlIGZpbGUgbG9jay4KICBzdGF0aWMgY29uc3QgZXhjbHVzaXZlID0gY29uc3QgRmlsZUxvY2suX2ludGVybmFsKDIpOwogIEBEZXByZWNhdGVkKCJVc2UgZXhjbHVzaXZlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBFWENMVVNJVkUgPSBleGNsdXNpdmU7CgogIC8vLyBCbG9ja2luZyBzaGFyZWQgZmlsZSBsb2NrLgogIHN0YXRpYyBjb25zdCBibG9ja2luZ1NoYXJlZCA9IGNvbnN0IEZpbGVMb2NrLl9pbnRlcm5hbCgzKTsKICBARGVwcmVjYXRlZCgiVXNlIGJsb2NraW5nU2hhcmVkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBCTE9DS0lOR19TSEFSRUQgPSBibG9ja2luZ1NoYXJlZDsKCiAgLy8vIEJsb2NraW5nIGV4Y2x1c2l2ZSBmaWxlIGxvY2suCiAgc3RhdGljIGNvbnN0IGJsb2NraW5nRXhjbHVzaXZlID0gY29uc3QgRmlsZUxvY2suX2ludGVybmFsKDQpOwogIEBEZXByZWNhdGVkKCJVc2UgYmxvY2tpbmdFeGNsdXNpdmUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEJMT0NLSU5HX0VYQ0xVU0lWRSA9IGJsb2NraW5nRXhjbHVzaXZlOwoKICBmaW5hbCBpbnQgX3R5cGU7CgogIGNvbnN0IEZpbGVMb2NrLl9pbnRlcm5hbCh0aGlzLl90eXBlKTsKfQoKLyoqCiAqIEEgcmVmZXJlbmNlIHRvIGEgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW0uCiAqCiAqIEEgRmlsZSBpbnN0YW5jZSBpcyBhbiBvYmplY3QgdGhhdCBob2xkcyBhIFtwYXRoXSBvbiB3aGljaCBvcGVyYXRpb25zIGNhbgogKiBiZSBwZXJmb3JtZWQuCiAqIFlvdSBjYW4gZ2V0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIHVzaW5nIHRoZSBnZXR0ZXIgW3BhcmVudF0sCiAqIGEgcHJvcGVydHkgaW5oZXJpdGVkIGZyb20gW0ZpbGVTeXN0ZW1FbnRpdHldLgogKgogKiBDcmVhdGUgYSBuZXcgRmlsZSBvYmplY3Qgd2l0aCBhIHBhdGhuYW1lIHRvIGFjY2VzcyB0aGUgc3BlY2lmaWVkIGZpbGUgb24gdGhlCiAqIGZpbGUgc3lzdGVtIGZyb20geW91ciBwcm9ncmFtLgogKgogKiAgICAgdmFyIG15RmlsZSA9IG5ldyBGaWxlKCdmaWxlLnR4dCcpOwogKgogKiBUaGUgRmlsZSBjbGFzcyBjb250YWlucyBtZXRob2RzIGZvciBtYW5pcHVsYXRpbmcgZmlsZXMgYW5kIHRoZWlyIGNvbnRlbnRzLgogKiBVc2luZyBtZXRob2RzIGluIHRoaXMgY2xhc3MsIHlvdSBjYW4gb3BlbiBhbmQgY2xvc2UgZmlsZXMsIHJlYWQgdG8gYW5kIHdyaXRlCiAqIGZyb20gdGhlbSwgY3JlYXRlIGFuZCBkZWxldGUgdGhlbSwgYW5kIGNoZWNrIGZvciB0aGVpciBleGlzdGVuY2UuCiAqCiAqIFdoZW4gcmVhZGluZyBvciB3cml0aW5nIGEgZmlsZSwgeW91IGNhbiB1c2Ugc3RyZWFtcyAod2l0aCBbb3BlblJlYWRdKSwKICogcmFuZG9tIGFjY2VzcyBvcGVyYXRpb25zICh3aXRoIFtvcGVuXSksCiAqIG9yIGNvbnZlbmllbmNlIG1ldGhvZHMgc3VjaCBhcyBbcmVhZEFzU3RyaW5nXSwKICoKICogTW9zdCBtZXRob2RzIGluIHRoaXMgY2xhc3Mgb2NjdXIgaW4gc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBwYWlycywKICogZm9yIGV4YW1wbGUsIFtyZWFkQXNTdHJpbmddIGFuZCBbcmVhZEFzU3RyaW5nU3luY10uCiAqIFVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpZmljIHJlYXNvbiBmb3IgdXNpbmcgdGhlIHN5bmNocm9ub3VzIHZlcnNpb24KICogb2YgYSBtZXRob2QsIHByZWZlciB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gdG8gYXZvaWQgYmxvY2tpbmcgeW91ciBwcm9ncmFtLgogKgogKiAjIyBJZiBwYXRoIGlzIGEgbGluawogKgogKiBJZiBbcGF0aF0gaXMgYSBzeW1ib2xpYyBsaW5rLCByYXRoZXIgdGhhbiBhIGZpbGUsCiAqIHRoZW4gdGhlIG1ldGhvZHMgb2YgRmlsZSBvcGVyYXRlIG9uIHRoZSB1bHRpbWF0ZSB0YXJnZXQgb2YgdGhlCiAqIGxpbmssIGV4Y2VwdCBmb3IgW2RlbGV0ZV0gYW5kIFtkZWxldGVTeW5jXSwgd2hpY2ggb3BlcmF0ZSBvbgogKiB0aGUgbGluay4KICoKICogIyMgUmVhZCBmcm9tIGEgZmlsZQogKgogKiBUaGUgZm9sbG93aW5nIGNvZGUgc2FtcGxlIHJlYWRzIHRoZSBlbnRpcmUgY29udGVudHMgZnJvbSBhIGZpbGUgYXMgYSBzdHJpbmcKICogdXNpbmcgdGhlIGFzeW5jaHJvbm91cyBbcmVhZEFzU3RyaW5nXSBtZXRob2Q6CiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgbmV3IEZpbGUoJ2ZpbGUudHh0JykucmVhZEFzU3RyaW5nKCkudGhlbigoU3RyaW5nIGNvbnRlbnRzKSB7CiAqICAgICAgICAgcHJpbnQoY29udGVudHMpOwogKiAgICAgICB9KTsKICogICAgIH0KICoKICogQSBtb3JlIGZsZXhpYmxlIGFuZCB1c2VmdWwgd2F5IHRvIHJlYWQgYSBmaWxlIGlzIHdpdGggYSBbU3RyZWFtXS4KICogT3BlbiB0aGUgZmlsZSB3aXRoIFtvcGVuUmVhZF0sIHdoaWNoIHJldHVybnMgYSBzdHJlYW0gdGhhdAogKiBwcm92aWRlcyB0aGUgZGF0YSBpbiB0aGUgZmlsZSBhcyBjaHVua3Mgb2YgYnl0ZXMuCiAqIExpc3RlbiB0byB0aGUgc3RyZWFtIGZvciBkYXRhIGFuZCBwcm9jZXNzIGFzIG5lZWRlZC4KICogWW91IGNhbiB1c2UgdmFyaW91cyB0cmFuc2Zvcm1lcnMgaW4gc3VjY2Vzc2lvbiB0byBtYW5pcHVsYXRlIHRoZQogKiBkYXRhIGludG8gdGhlIHJlcXVpcmVkIGZvcm1hdCBvciB0byBwcmVwYXJlIGl0IGZvciBvdXRwdXQuCiAqCiAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBhIHN0cmVhbSB0byByZWFkIGxhcmdlIGZpbGVzLAogKiB0byBtYW5pcHVsYXRlIHRoZSBkYXRhIHdpdGggdHJhbnNmb3JtZXJzLAogKiBvciBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFub3RoZXIgQVBJLCBzdWNoIGFzIFtXZWJTb2NrZXRdcy4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqICAgICBpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CiAqICAgICBpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgZmluYWwgZmlsZSA9IG5ldyBGaWxlKCdmaWxlLnR4dCcpOwogKiAgICAgICBTdHJlYW08TGlzdDxpbnQ+PiBpbnB1dFN0cmVhbSA9IGZpbGUub3BlblJlYWQoKTsKICoKICogICAgICAgaW5wdXRTdHJlYW0KICogICAgICAgICAudHJhbnNmb3JtKHV0ZjguZGVjb2RlcikgICAgICAgLy8gRGVjb2RlIGJ5dGVzIHRvIFVURi04LgogKiAgICAgICAgIC50cmFuc2Zvcm0obmV3IExpbmVTcGxpdHRlcigpKSAvLyBDb252ZXJ0IHN0cmVhbSB0byBpbmRpdmlkdWFsIGxpbmVzLgogKiAgICAgICAgIC5saXN0ZW4oKFN0cmluZyBsaW5lKSB7ICAgICAgICAvLyBQcm9jZXNzIHJlc3VsdHMuCiAqICAgICAgICAgICAgIHByaW50KCckbGluZTogJHtsaW5lLmxlbmd0aH0gYnl0ZXMnKTsKICogICAgICAgICAgIH0sCiAqICAgICAgICAgICBvbkRvbmU6ICgpIHsgcHJpbnQoJ0ZpbGUgaXMgbm93IGNsb3NlZC4nKTsgfSwKICogICAgICAgICAgIG9uRXJyb3I6IChlKSB7IHByaW50KGUudG9TdHJpbmcoKSk7IH0pOwogKiAgICAgfQogKgogKiAjIyBXcml0ZSB0byBhIGZpbGUKICoKICogVG8gd3JpdGUgYSBzdHJpbmcgdG8gYSBmaWxlLCB1c2UgdGhlIFt3cml0ZUFzU3RyaW5nXSBtZXRob2Q6CiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgdm9pZCBtYWluKCkgewogKiAgICAgICBmaW5hbCBmaWxlbmFtZSA9ICdmaWxlLnR4dCc7CiAqICAgICAgIG5ldyBGaWxlKGZpbGVuYW1lKS53cml0ZUFzU3RyaW5nKCdzb21lIGNvbnRlbnQnKQogKiAgICAgICAgIC50aGVuKChGaWxlIGZpbGUpIHsKICogICAgICAgICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIHRoZSBmaWxlLgogKiAgICAgICAgIH0pOwogKiAgICAgfQogKgogKiBZb3UgY2FuIGFsc28gd3JpdGUgdG8gYSBmaWxlIHVzaW5nIGEgW1N0cmVhbV0uIE9wZW4gdGhlIGZpbGUgd2l0aAogKiBbb3BlbldyaXRlXSwgd2hpY2ggcmV0dXJucyBhbiBbSU9TaW5rXSB0byB3aGljaCB5b3UgY2FuIHdyaXRlIGRhdGEuCiAqIEJlIHN1cmUgdG8gY2xvc2UgdGhlIHNpbmsgd2l0aCB0aGUgW0lPU2luay5jbG9zZV0gbWV0aG9kLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICoKICogICAgIHZvaWQgbWFpbigpIHsKICogICAgICAgdmFyIGZpbGUgPSBuZXcgRmlsZSgnZmlsZS50eHQnKTsKICogICAgICAgdmFyIHNpbmsgPSBmaWxlLm9wZW5Xcml0ZSgpOwogKiAgICAgICBzaW5rLndyaXRlKCdGSUxFIEFDQ0VTU0VEICR7bmV3IERhdGVUaW1lLm5vdygpfVxuJyk7CiAqCiAqICAgICAgIC8vIENsb3NlIHRoZSBJT1NpbmsgdG8gZnJlZSBzeXN0ZW0gcmVzb3VyY2VzLgogKiAgICAgICBzaW5rLmNsb3NlKCk7CiAqICAgICB9CiAqCiAqICMjIFRoZSB1c2Ugb2YgRnV0dXJlcwogKgogKiBUbyBhdm9pZCB1bmludGVudGlvbmFsIGJsb2NraW5nIG9mIHRoZSBwcm9ncmFtLAogKiBzZXZlcmFsIG1ldGhvZHMgdXNlIGEgW0Z1dHVyZV0gdG8gcmV0dXJuIGEgdmFsdWUuIEZvciBleGFtcGxlLAogKiB0aGUgW2xlbmd0aF0gbWV0aG9kLCB3aGljaCBnZXRzIHRoZSBsZW5ndGggb2YgYSBmaWxlLCByZXR1cm5zIGEgRnV0dXJlLgogKiBVc2UgYHRoZW5gIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCB3aGVuCiAqIHRoZSB2YWx1ZSBpcyByZWFkeS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBmaW5hbCBmaWxlID0gbmV3IEZpbGUoJ2ZpbGUudHh0Jyk7CiAqCiAqICAgICAgIGZpbGUubGVuZ3RoKCkudGhlbigobGVuKSB7CiAqICAgICAgICAgcHJpbnQobGVuKTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqIEluIGFkZGl0aW9uIHRvIGxlbmd0aCwgdGhlIFtleGlzdHNdLCBbbGFzdE1vZGlmaWVkXSwgW3N0YXRdLCBhbmQKICogb3RoZXIgbWV0aG9kcywgcmV0dXJuIEZ1dHVyZXMuCiAqCiAqICMjIE90aGVyIHJlc291cmNlcwogKgogKiAqIFtEYXJ0IGJ5IEV4YW1wbGVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kYXJ0LWJ5LWV4YW1wbGUvI2ZpbGVzLWRpcmVjdG9yaWVzLWFuZC1zeW1saW5rcykKICogICBwcm92aWRlcyBhZGRpdGlvbmFsIHRhc2stb3JpZW50ZWQgY29kZSBzYW1wbGVzIHRoYXQgc2hvdyBob3cgdG8gdXNlCiAqICAgdmFyaW91cyBBUEkgZnJvbSB0aGUgRGlyZWN0b3J5IGNsYXNzIGFuZCB0aGUgcmVsYXRlZCBbRmlsZV0gY2xhc3MuCiAqCiAqICogW0kvTyBmb3IgQ29tbWFuZC1MaW5lCiAqICAgQXBwc10oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvZGFydC11cC1hbmQtcnVubmluZy9jaDAzLmh0bWwjZGFydGlvLS0taW8tZm9yLWNvbW1hbmQtbGluZS1hcHBzKQogKiAgIGEgc2VjdGlvbiBmcm9tIF9BIFRvdXIgb2YgdGhlIERhcnQgTGlicmFyaWVzXyBjb3ZlcnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgogKgogKiAqIFtXcml0ZSBDb21tYW5kLUxpbmUgQXBwc10oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvdHV0b3JpYWxzL2NtZGxpbmUvKSwKICogICBhIHR1dG9yaWFsIGFib3V0IHdyaXRpbmcgY29tbWFuZC1saW5lIGFwcHMsIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0CiAqICAgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQphYnN0cmFjdCBjbGFzcyBGaWxlIGltcGxlbWVudHMgRmlsZVN5c3RlbUVudGl0eSB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIFtGaWxlXSBvYmplY3QuCiAgICoKICAgKiBJZiBbcGF0aF0gaXMgYSByZWxhdGl2ZSBwYXRoLCBpdCB3aWxsIGJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHNlZSBbRGlyZWN0b3J5LmN1cnJlbnRdKSwgd2hlbiB1c2VkLgogICAqCiAgICogSWYgW3BhdGhdIGlzIGFuIGFic29sdXRlIHBhdGgsIGl0IHdpbGwgYmUgaW1tdW5lIHRvIGNoYW5nZXMgdG8gdGhlCiAgICogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZmFjdG9yeSBGaWxlKFN0cmluZyBwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBuZXcgX0ZpbGUocGF0aCk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmNyZWF0ZUZpbGUocGF0aCk7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgYSBGaWxlIG9iamVjdCBmcm9tIGEgVVJJLgogICAqCiAgICogSWYgW3VyaV0gY2Fubm90IHJlZmVyZW5jZSBhIGZpbGUgdGhpcyB0aHJvd3MgW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIGZhY3RvcnkgRmlsZS5mcm9tVXJpKFVyaSB1cmkpID0+IG5ldyBGaWxlKHVyaS50b0ZpbGVQYXRoKCkpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgRmlsZSBvYmplY3QgZnJvbSBhIHJhdyBwYXRoLCB0aGF0IGlzLCBhIHNlcXVlbmNlIG9mIGJ5dGVzCiAgICogYXMgcmVwcmVzZW50ZWQgYnkgdGhlIE9TLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBmYWN0b3J5IEZpbGUuZnJvbVJhd1BhdGgoVWludDhMaXN0IHJhd1BhdGgpIHsKICAgIC8vIFRPRE8oYmtvbnlpKTogSGFuZGxlIG92ZXJyaWRlcy4KICAgIHJldHVybiBuZXcgX0ZpbGUuZnJvbVJhd1BhdGgocmF3UGF0aCk7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgdGhlIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPEZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoCiAgICogdGhlIGZpbGUgd2hlbiBpdCBoYXMgYmVlbiBjcmVhdGVkLgogICAqCiAgICogSWYgW3JlY3Vyc2l2ZV0gaXMgZmFsc2UsIHRoZSBkZWZhdWx0LCB0aGUgZmlsZSBpcyBjcmVhdGVkIG9ubHkgaWYKICAgKiBhbGwgZGlyZWN0b3JpZXMgaW4gdGhlIHBhdGggZXhpc3QuIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIGFsbAogICAqIG5vbi1leGlzdGluZyBwYXRoIGNvbXBvbmVudHMgYXJlIGNyZWF0ZWQuCiAgICoKICAgKiBFeGlzdGluZyBmaWxlcyBhcmUgbGVmdCB1bnRvdWNoZWQgYnkgW2NyZWF0ZV0uIENhbGxpbmcgW2NyZWF0ZV0gb24gYW4KICAgKiBleGlzdGluZyBmaWxlIG1pZ2h0IGZhaWwgaWYgdGhlcmUgYXJlIHJlc3RyaWN0aXZlIHBlcm1pc3Npb25zIG9uCiAgICogdGhlIGZpbGUuCiAgICoKICAgKiBDb21wbGV0ZXMgdGhlIGZ1dHVyZSB3aXRoIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgRnV0dXJlPEZpbGU+IGNyZWF0ZSh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgY3JlYXRlIHRoZSBmaWxlLiBFeGlzdGluZyBmaWxlcyBhcmUgbGVmdCB1bnRvdWNoZWQKICAgKiBieSBbY3JlYXRlU3luY10uIENhbGxpbmcgW2NyZWF0ZVN5bmNdIG9uIGFuIGV4aXN0aW5nIGZpbGUgbWlnaHQgZmFpbAogICAqIGlmIHRoZXJlIGFyZSByZXN0cmljdGl2ZSBwZXJtaXNzaW9ucyBvbiB0aGUgZmlsZS4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCB0aGUgZGVmYXVsdCwgdGhlIGZpbGUgaXMgY3JlYXRlZAogICAqIG9ubHkgaWYgYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBwYXRoIGV4aXN0LgogICAqIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIGFsbCBub24tZXhpc3RpbmcgcGF0aCBjb21wb25lbnRzIGFyZSBjcmVhdGVkLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCBjcmVhdGVTeW5jKHtib29sIHJlY3Vyc2l2ZTogZmFsc2V9KTsKCiAgLyoqCiAgICogUmVuYW1lcyB0aGlzIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPEZpbGU+YCB0aGF0IGNvbXBsZXRlcwogICAqIHdpdGggYSBbRmlsZV0gaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGZpbGUuCiAgICoKICAgKiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlLCB0aGF0IGZpbGUgaXMKICAgKiByZXBsYWNlZC4gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LCB0aGUKICAgKiBvcGVyYXRpb24gZmFpbHMgYW5kIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxGaWxlPiByZW5hbWUoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlbmFtZXMgdGhpcyBmaWxlLiBSZXR1cm5zIGEgW0ZpbGVdCiAgICogaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGZpbGUuCiAgICoKICAgKiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlLCB0aGF0IGZpbGUgaXMKICAgKiByZXBsYWNlZC4gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5IHRoZQogICAqIG9wZXJhdGlvbiBmYWlscyBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICBGaWxlIHJlbmFtZVN5bmMoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBDb3B5IHRoaXMgZmlsZS4gUmV0dXJucyBhIGBGdXR1cmU8RmlsZT5gIHRoYXQgY29tcGxldGVzCiAgICogd2l0aCBhIFtGaWxlXSBpbnN0YW5jZSBmb3IgdGhlIGNvcGllZCBmaWxlLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSwgdGhhdCBmaWxlIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgdGhlCiAgICogb3BlcmF0aW9uIGZhaWxzIGFuZCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8RmlsZT4gY29weShTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgY29weSB0aGlzIGZpbGUuIFJldHVybnMgYSBbRmlsZV0KICAgKiBpbnN0YW5jZSBmb3IgdGhlIGNvcGllZCBmaWxlLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSwgdGhhdCBmaWxlIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSB0aGUKICAgKiBvcGVyYXRpb24gZmFpbHMgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICovCiAgRmlsZSBjb3B5U3luYyhTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlLiBSZXR1cm5zIGEgYEZ1dHVyZTxpbnQ+YCB0aGF0CiAgICogY29tcGxldGVzIHdpdGggdGhlIGxlbmd0aCBpbiBieXRlcy4KICAgKi8KICBGdXR1cmU8aW50PiBsZW5ndGgoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIGludCBsZW5ndGhTeW5jKCk7CgogIC8qKgogICAqIFJldHVybnMgYSBbRmlsZV0gaW5zdGFuY2Ugd2hvc2UgcGF0aCBpcyB0aGUgYWJzb2x1dGUgcGF0aCB0byBbdGhpc10uCiAgICoKICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBpcyBjb21wdXRlZCBieSBwcmVmaXhpbmcKICAgKiBhIHJlbGF0aXZlIHBhdGggd2l0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJldHVybmluZwogICAqIGFuIGFic29sdXRlIHBhdGggdW5jaGFuZ2VkLgogICAqLwogIEZpbGUgZ2V0IGFic29sdXRlOwoKLyoqCiAqIEdldCB0aGUgbGFzdC1hY2Nlc3NlZCB0aW1lIG9mIHRoZSBmaWxlLgogKgogKiBSZXR1cm5zIGEgYEZ1dHVyZTxEYXRlVGltZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUKICogZmlsZSB3YXMgbGFzdCBhY2Nlc3NlZCwgaWYgdGhlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KICoKICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAqLwogIEZ1dHVyZTxEYXRlVGltZT4gbGFzdEFjY2Vzc2VkKCk7CgovKioKICogR2V0IHRoZSBsYXN0LWFjY2Vzc2VkIHRpbWUgb2YgdGhlIGZpbGUuCiAqCiAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgZmlsZSB3YXMgbGFzdCBhY2Nlc3NlZCwKICogaWYgdGhlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gQmxvY2tzIHVudGlsIHRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0dXJuZWQKICogb3IgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgogKgogKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICovCiAgRGF0ZVRpbWUgbGFzdEFjY2Vzc2VkU3luYygpOwoKICAvKioKICAgKiBNb2RpZmllcyB0aGUgdGltZSB0aGUgZmlsZSB3YXMgbGFzdCBhY2Nlc3NlZC4KICAgKgogICAqIFJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyBvbmNlIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgdGltZSBjYW5ub3QgYmUgc2V0LgogICAqLwogIEZ1dHVyZSBzZXRMYXN0QWNjZXNzZWQoRGF0ZVRpbWUgdGltZSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgbW9kaWZpZXMgdGhlIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3QgYWNjZXNzZWQuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIHRpbWUgY2Fubm90IGJlIHNldC4KICAgKi8KICB2b2lkIHNldExhc3RBY2Nlc3NlZFN5bmMoRGF0ZVRpbWUgdGltZSk7CgovKioKICogR2V0IHRoZSBsYXN0LW1vZGlmaWVkIHRpbWUgb2YgdGhlIGZpbGUuCiAqCiAqIFJldHVybnMgYSBgRnV0dXJlPERhdGVUaW1lPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZQogKiBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkLCBpZiB0aGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgogKgogKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICovCiAgRnV0dXJlPERhdGVUaW1lPiBsYXN0TW9kaWZpZWQoKTsKCi8qKgogKiBHZXQgdGhlIGxhc3QtbW9kaWZpZWQgdGltZSBvZiB0aGUgZmlsZS4KICoKICogUmV0dXJucyB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkLAogKiBpZiB0aGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLiBCbG9ja3MgdW50aWwgdGhlIGluZm9ybWF0aW9uIGNhbiBiZSByZXR1cm5lZAogKiBvciBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCiAqCiAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogKi8KICBEYXRlVGltZSBsYXN0TW9kaWZpZWRTeW5jKCk7CgogIC8qKgogICAqIE1vZGlmaWVzIHRoZSB0aW1lIHRoZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkLgogICAqCiAgICogUmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIG9uY2UgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSB0aW1lIGNhbm5vdCBiZSBzZXQuCiAgICovCiAgRnV0dXJlIHNldExhc3RNb2RpZmllZChEYXRlVGltZSB0aW1lKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBtb2RpZmllcyB0aGUgdGltZSB0aGUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZC4KICAgKgogICAqIElmIHRoZSBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBzZXQsIHRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXS4KICAgKi8KICB2b2lkIHNldExhc3RNb2RpZmllZFN5bmMoRGF0ZVRpbWUgdGltZSk7CgogIC8qKgogICAqIE9wZW4gdGhlIGZpbGUgZm9yIHJhbmRvbSBhY2Nlc3Mgb3BlcmF0aW9ucy4gUmV0dXJucyBhCiAgICogYEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgb3BlbmVkCiAgICogcmFuZG9tIGFjY2VzcyBmaWxlLiBbUmFuZG9tQWNjZXNzRmlsZV1zIG11c3QgYmUgY2xvc2VkIHVzaW5nIHRoZQogICAqIFtSYW5kb21BY2Nlc3NGaWxlLmNsb3NlXSBtZXRob2QuCiAgICoKICAgKiBGaWxlcyBjYW4gYmUgb3BlbmVkIGluIHRocmVlIG1vZGVzOgogICAqCiAgICogW0ZpbGVNb2RlLnJlYWRdOiBvcGVuIHRoZSBmaWxlIGZvciByZWFkaW5nLgogICAqCiAgICogW0ZpbGVNb2RlLndyaXRlXTogb3BlbiB0aGUgZmlsZSBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nIGFuZAogICAqIHRydW5jYXRlIHRoZSBmaWxlIHRvIGxlbmd0aCB6ZXJvLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCB0aGUKICAgKiBmaWxlIGlzIGNyZWF0ZWQuCiAgICoKICAgKiBbRmlsZU1vZGUuYXBwZW5kXTogc2FtZSBhcyBbRmlsZU1vZGUud3JpdGVdIGV4Y2VwdCB0aGF0IHRoZSBmaWxlIGlzCiAgICogbm90IHRydW5jYXRlZC4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gb3Blbih7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUucmVhZH0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IG9wZW4gdGhlIGZpbGUgZm9yIHJhbmRvbSBhY2Nlc3Mgb3BlcmF0aW9ucy4gVGhlCiAgICogcmVzdWx0IGlzIGEgW1JhbmRvbUFjY2Vzc0ZpbGVdIG9uIHdoaWNoIHJhbmRvbSBhY2Nlc3Mgb3BlcmF0aW9ucwogICAqIGNhbiBiZSBwZXJmb3JtZWQuIE9wZW5lZCBbUmFuZG9tQWNjZXNzRmlsZV1zIG11c3QgYmUgY2xvc2VkIHVzaW5nCiAgICogdGhlIFtSYW5kb21BY2Nlc3NGaWxlLmNsb3NlXSBtZXRob2QuCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgW21vZGVdIGFyZ3VtZW50LgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgUmFuZG9tQWNjZXNzRmlsZSBvcGVuU3luYyh7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUucmVhZH0pOwoKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgaW5kZXBlbmRlbnQgW1N0cmVhbV0gZm9yIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUuCiAgICoKICAgKiBJZiBbc3RhcnRdIGlzIHByZXNlbnQsIHRoZSBmaWxlIHdpbGwgYmUgcmVhZCBmcm9tIGJ5dGUtb2Zmc2V0IFtzdGFydF0uCiAgICogT3RoZXJ3aXNlIGZyb20gdGhlIGJlZ2lubmluZyAoaW5kZXggMCkuCiAgICoKICAgKiBJZiBbZW5kXSBpcyBwcmVzZW50LCBvbmx5IHVwIHRvIGJ5dGUtaW5kZXggW2VuZF0gd2lsbCBiZSByZWFkLiBPdGhlcndpc2UsCiAgICogdW50aWwgZW5kIG9mIGZpbGUuCiAgICoKICAgKiBJbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCBzeXN0ZW0gcmVzb3VyY2VzIGFyZSBmcmVlZCwgdGhlIHN0cmVhbQogICAqIG11c3QgYmUgcmVhZCB0byBjb21wbGV0aW9uIG9yIHRoZSBzdWJzY3JpcHRpb24gb24gdGhlIHN0cmVhbSBtdXN0CiAgICogYmUgY2FuY2VsbGVkLgogICAqLwogIFN0cmVhbTxMaXN0PGludD4+IG9wZW5SZWFkKFtpbnQgc3RhcnQsIGludCBlbmRdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBpbmRlcGVuZGVudCBbSU9TaW5rXSBmb3IgdGhlIGZpbGUuIFRoZQogICAqIFtJT1NpbmtdIG11c3QgYmUgY2xvc2VkIHdoZW4gbm8gbG9uZ2VyIHVzZWQsIHRvIGZyZWUKICAgKiBzeXN0ZW0gcmVzb3VyY2VzLgogICAqCiAgICogQW4gW0lPU2lua10gZm9yIGEgZmlsZSBjYW4gYmUgb3BlbmVkIGluIHR3byBtb2RlczoKICAgKgogICAqICogW0ZpbGVNb2RlLndyaXRlXTogdHJ1bmNhdGVzIHRoZSBmaWxlIHRvIGxlbmd0aCB6ZXJvLgogICAqICogW0ZpbGVNb2RlLmFwcGVuZF06IHNldHMgdGhlIGluaXRpYWwgd3JpdGUgcG9zaXRpb24gdG8gdGhlIGVuZAogICAqICAgb2YgdGhlIGZpbGUuCiAgICoKICAgKiAgV2hlbiB3cml0aW5nIHN0cmluZ3MgdGhyb3VnaCB0aGUgcmV0dXJuZWQgW0lPU2lua10gdGhlIGVuY29kaW5nCiAgICogIHNwZWNpZmllZCB1c2luZyBbZW5jb2RpbmddIHdpbGwgYmUgdXNlZC4gVGhlIHJldHVybmVkIFtJT1NpbmtdCiAgICogIGhhcyBhbiBgZW5jb2RpbmdgIHByb3BlcnR5IHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIHRoZQogICAqICBbSU9TaW5rXSBoYXMgYmVlbiBjcmVhdGVkLgogICAqLwogIElPU2luayBvcGVuV3JpdGUoe0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLCBFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBSZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBhIGxpc3Qgb2YgYnl0ZXMuIFJldHVybnMgYQogICAqIGBGdXR1cmU8TGlzdDxpbnQ+PmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgbGlzdCBvZiBieXRlcyB0aGF0CiAgICogaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLgogICAqLwogIEZ1dHVyZTxMaXN0PGludD4+IHJlYWRBc0J5dGVzKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBsaXN0IG9mIGJ5dGVzLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgTGlzdDxpbnQ+IHJlYWRBc0J5dGVzU3luYygpOwoKICAvKioKICAgKiBSZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4KICAgKiBbRW5jb2RpbmddLgogICAqCiAgICogUmV0dXJucyBhIGBGdXR1cmU8U3RyaW5nPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgc3RyaW5nIG9uY2UKICAgKiB0aGUgZmlsZSBjb250ZW50cyBoYXMgYmVlbiByZWFkLgogICAqLwogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZyh7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBhIHN0cmluZyB1c2luZyB0aGUKICAgKiBnaXZlbiBbRW5jb2RpbmddLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgU3RyaW5nIHJlYWRBc1N0cmluZ1N5bmMoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSk7CgogIC8qKgogICAqIFJlYWQgdGhlIGVudGlyZSBmaWxlIGNvbnRlbnRzIGFzIGxpbmVzIG9mIHRleHQgdXNpbmcgdGhlIGdpdmVuCiAgICogW0VuY29kaW5nXS4KICAgKgogICAqIFJldHVybnMgYSBgRnV0dXJlPExpc3Q8U3RyaW5nPj5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhlIGxpbmVzCiAgICogb25jZSB0aGUgZmlsZSBjb250ZW50cyBoYXMgYmVlbiByZWFkLgogICAqLwogIEZ1dHVyZTxMaXN0PFN0cmluZz4+IHJlYWRBc0xpbmVzKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlYWQgdGhlIGVudGlyZSBmaWxlIGNvbnRlbnRzIGFzIGxpbmVzIG9mIHRleHQKICAgKiB1c2luZyB0aGUgZ2l2ZW4gW0VuY29kaW5nXS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIExpc3Q8U3RyaW5nPiByZWFkQXNMaW5lc1N5bmMoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSk7CgogIC8qKgogICAqIFdyaXRlIGEgbGlzdCBvZiBieXRlcyB0byBhIGZpbGUuCiAgICoKICAgKiBPcGVucyB0aGUgZmlsZSwgd3JpdGVzIHRoZSBsaXN0IG9mIGJ5dGVzIHRvIGl0LCBhbmQgY2xvc2VzIHRoZSBmaWxlLgogICAqIFJldHVybnMgYSBgRnV0dXJlPEZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMgW0ZpbGVdIG9iamVjdCBvbmNlCiAgICogdGhlIGVudGlyZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KICAgKgogICAqIEJ5IGRlZmF1bHQgW3dyaXRlQXNCeXRlc10gY3JlYXRlcyB0aGUgZmlsZSBmb3Igd3JpdGluZyBhbmQgdHJ1bmNhdGVzIHRoZQogICAqIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuIEluIG9yZGVyIHRvIGFwcGVuZCB0aGUgYnl0ZXMgdG8gYW4gZXhpc3RpbmcKICAgKiBmaWxlLCBwYXNzIFtGaWxlTW9kZS5hcHBlbmRdIGFzIHRoZSBvcHRpb25hbCBtb2RlIHBhcmFtZXRlci4KICAgKgogICAqIElmIHRoZSBhcmd1bWVudCBbZmx1c2hdIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBkYXRhIHdyaXR0ZW4gd2lsbCBiZQogICAqIGZsdXNoZWQgdG8gdGhlIGZpbGUgc3lzdGVtIGJlZm9yZSB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcy4KICAgKi8KICBGdXR1cmU8RmlsZT4gd3JpdGVBc0J5dGVzKExpc3Q8aW50PiBieXRlcywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLCBib29sIGZsdXNoOiBmYWxzZX0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHdyaXRlIGEgbGlzdCBvZiBieXRlcyB0byBhIGZpbGUuCiAgICoKICAgKiBPcGVucyB0aGUgZmlsZSwgd3JpdGVzIHRoZSBsaXN0IG9mIGJ5dGVzIHRvIGl0IGFuZCBjbG9zZXMgdGhlIGZpbGUuCiAgICoKICAgKiBCeSBkZWZhdWx0IFt3cml0ZUFzQnl0ZXNTeW5jXSBjcmVhdGVzIHRoZSBmaWxlIGZvciB3cml0aW5nIGFuZCB0cnVuY2F0ZXMKICAgKiB0aGUgZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gSW4gb3JkZXIgdG8gYXBwZW5kIHRoZSBieXRlcyB0byBhbiBleGlzdGluZwogICAqIGZpbGUsIHBhc3MgW0ZpbGVNb2RlLmFwcGVuZF0gYXMgdGhlIG9wdGlvbmFsIG1vZGUgcGFyYW1ldGVyLgogICAqCiAgICogSWYgdGhlIFtmbHVzaF0gYXJndW1lbnQgaXMgc2V0IHRvIGB0cnVlYCBkYXRhIHdyaXR0ZW4gd2lsbCBiZQogICAqIGZsdXNoZWQgdG8gdGhlIGZpbGUgc3lzdGVtIGJlZm9yZSByZXR1cm5pbmcuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICB2b2lkIHdyaXRlQXNCeXRlc1N5bmMoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICB7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsIGJvb2wgZmx1c2g6IGZhbHNlfSk7CgogIC8qKgogICAqIFdyaXRlIGEgc3RyaW5nIHRvIGEgZmlsZS4KICAgKgogICAqIE9wZW5zIHRoZSBmaWxlLCB3cml0ZXMgdGhlIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcsIGFuZCBjbG9zZXMgdGhlCiAgICogZmlsZS4gUmV0dXJucyBhIGBGdXR1cmU8RmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcyBbRmlsZV0gb2JqZWN0CiAgICogb25jZSB0aGUgZW50aXJlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgogICAqCiAgICogQnkgZGVmYXVsdCBbd3JpdGVBc1N0cmluZ10gY3JlYXRlcyB0aGUgZmlsZSBmb3Igd3JpdGluZyBhbmQgdHJ1bmNhdGVzIHRoZQogICAqIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuIEluIG9yZGVyIHRvIGFwcGVuZCB0aGUgYnl0ZXMgdG8gYW4gZXhpc3RpbmcKICAgKiBmaWxlLCBwYXNzIFtGaWxlTW9kZS5hcHBlbmRdIGFzIHRoZSBvcHRpb25hbCBtb2RlIHBhcmFtZXRlci4KICAgKgogICAqIElmIHRoZSBhcmd1bWVudCBbZmx1c2hdIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBkYXRhIHdyaXR0ZW4gd2lsbCBiZQogICAqIGZsdXNoZWQgdG8gdGhlIGZpbGUgc3lzdGVtIGJlZm9yZSB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcy4KICAgKgogICAqLwogIEZ1dHVyZTxGaWxlPiB3cml0ZUFzU3RyaW5nKFN0cmluZyBjb250ZW50cywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLAogICAgICBFbmNvZGluZyBlbmNvZGluZzogdXRmOCwKICAgICAgYm9vbCBmbHVzaDogZmFsc2V9KTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB3cml0ZSBhIHN0cmluZyB0byBhIGZpbGUuCiAgICoKICAgKiBPcGVucyB0aGUgZmlsZSwgd3JpdGVzIHRoZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGVuY29kaW5nLCBhbmQgY2xvc2VzIHRoZQogICAqIGZpbGUuCiAgICoKICAgKiBCeSBkZWZhdWx0IFt3cml0ZUFzU3RyaW5nU3luY10gY3JlYXRlcyB0aGUgZmlsZSBmb3Igd3JpdGluZyBhbmQKICAgKiB0cnVuY2F0ZXMgdGhlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuIEluIG9yZGVyIHRvIGFwcGVuZCB0aGUgYnl0ZXMKICAgKiB0byBhbiBleGlzdGluZyBmaWxlLCBwYXNzIFtGaWxlTW9kZS5hcHBlbmRdIGFzIHRoZSBvcHRpb25hbCBtb2RlCiAgICogcGFyYW1ldGVyLgogICAqCiAgICogSWYgdGhlIFtmbHVzaF0gYXJndW1lbnQgaXMgc2V0IHRvIGB0cnVlYCBkYXRhIHdyaXR0ZW4gd2lsbCBiZQogICAqIGZsdXNoZWQgdG8gdGhlIGZpbGUgc3lzdGVtIGJlZm9yZSByZXR1cm5pbmcuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICB2b2lkIHdyaXRlQXNTdHJpbmdTeW5jKFN0cmluZyBjb250ZW50cywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLAogICAgICBFbmNvZGluZyBlbmNvZGluZzogdXRmOCwKICAgICAgYm9vbCBmbHVzaDogZmFsc2V9KTsKCiAgLyoqCiAgICogR2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlLgogICAqLwogIFN0cmluZyBnZXQgcGF0aDsKfQoKLyoqCiAqIGBSYW5kb21BY2Nlc3NGaWxlYCBwcm92aWRlcyByYW5kb20gYWNjZXNzIHRvIHRoZSBkYXRhIGluIGEKICogZmlsZS4KICoKICogYFJhbmRvbUFjY2Vzc0ZpbGVgIG9iamVjdHMgYXJlIG9idGFpbmVkIGJ5IGNhbGxpbmcgdGhlCiAqIGBvcGVuYCBtZXRob2Qgb24gYSBbRmlsZV0gb2JqZWN0LgogKgogKiBBIGBSYW5kb21BY2Nlc3NGaWxlYCBoYXZlIGJvdGggYXN5bmNocm9ub3VzIGFuZCBzeW5jaHJvbm91cwogKiBtZXRob2RzLiBUaGUgYXN5bmNocm9ub3VzIG1ldGhvZHMgYWxsIHJldHVybiBhIGBGdXR1cmVgCiAqIHdoZXJlYXMgdGhlIHN5bmNocm9ub3VzIG1ldGhvZHMgd2lsbCByZXR1cm4gdGhlIHJlc3VsdCBkaXJlY3RseSwKICogYW5kIGJsb2NrIHRoZSBjdXJyZW50IGlzb2xhdGUgdW50aWwgdGhlIHJlc3VsdCBpcyByZWFkeS4KICoKICogQXQgbW9zdCBvbmUgYXN5bmNocm9ub3VzIG1ldGhvZCBjYW4gYmUgcGVuZGluZyBvbiBhIGdpdmVuIGBSYW5kb21BY2Nlc3NGaWxlYAogKiBpbnN0YW5jZSBhdCB0aGUgdGltZS4gSWYgYW4gYXN5bmNocm9ub3VzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBvbmUgaXMKICogYWxyZWFkeSBpbiBwcm9ncmVzcyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpcyB0aHJvd24uCiAqCiAqIElmIGFuIGFzeW5jaHJvbm91cyBtZXRob2QgaXMgcGVuZGluZyBpdCBpcyBhbHNvIG5vdCBwb3NzaWJsZSB0byBjYWxsIGFueQogKiBzeW5jaHJvbm91cyBtZXRob2RzLiBUaGlzIHdpbGwgYWxzbyB0aHJvdyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXS4KICovCmFic3RyYWN0IGNsYXNzIFJhbmRvbUFjY2Vzc0ZpbGUgewogIC8qKgogICAqIENsb3NlcyB0aGUgZmlsZS4gUmV0dXJucyBhIGBGdXR1cmVgIHRoYXQKICAgKiBjb21wbGV0ZXMgd2hlbiBpdCBoYXMgYmVlbiBjbG9zZWQuCiAgICovCiAgRnV0dXJlPHZvaWQ+IGNsb3NlKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgY2xvc2VzIHRoZSBmaWxlLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCBjbG9zZVN5bmMoKTsKCiAgLyoqCiAgICogUmVhZHMgYSBieXRlIGZyb20gdGhlIGZpbGUuIFJldHVybnMgYSBgRnV0dXJlPGludD5gIHRoYXQKICAgKiBjb21wbGV0ZXMgd2l0aCB0aGUgYnl0ZSwgb3Igd2l0aCAtMSBpZiBlbmQtb2YtZmlsZSBoYXMgYmVlbiByZWFjaGVkLgogICAqLwogIEZ1dHVyZTxpbnQ+IHJlYWRCeXRlKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVhZHMgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBmaWxlLiBJZiBlbmQtb2YtZmlsZQogICAqIGhhcyBiZWVuIHJlYWNoZWQgLTEgaXMgcmV0dXJuZWQuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBpbnQgcmVhZEJ5dGVTeW5jKCk7CgogIC8qKgogICAqIFJlYWRzIFtieXRlc10gYnl0ZXMgZnJvbSBhIGZpbGUgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGxpc3Qgb2YgYnl0ZXMuCiAgICovCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZChpbnQgYnl0ZXMpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlYWRzIGEgbWF4aW11bSBvZiBbYnl0ZXNdIGJ5dGVzIGZyb20gYSBmaWxlIGFuZAogICAqIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIGxpc3Qgb2YgYnl0ZXMuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBMaXN0PGludD4gcmVhZFN5bmMoaW50IGJ5dGVzKTsKCiAgLyoqCiAgICogUmVhZHMgaW50byBhbiBleGlzdGluZyBbTGlzdDxpbnQ+XSBmcm9tIHRoZSBmaWxlLiBJZiBbc3RhcnRdIGlzIHByZXNlbnQsCiAgICogdGhlIGJ5dGVzIHdpbGwgYmUgZmlsbGVkIGludG8gW2J1ZmZlcl0gZnJvbSBhdCBpbmRleCBbc3RhcnRdLCBvdGhlcndpc2UKICAgKiBpbmRleCAwLiBJZiBbZW5kXSBpcyBwcmVzZW50LCB0aGUgW2VuZF0gLSBbc3RhcnRdIGJ5dGVzIHdpbGwgYmUgcmVhZCBpbnRvCiAgICogW2J1ZmZlcl0sIG90aGVyd2lzZSB1cCB0byBbYnVmZmVyLmxlbmd0aF0uIElmIFtlbmRdID09IFtzdGFydF0gbm90aGluZwogICAqIGhhcHBlbnMuCiAgICoKICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxpbnQ+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KICAgKi8KICBGdXR1cmU8aW50PiByZWFkSW50byhMaXN0PGludD4gYnVmZmVyLCBbaW50IHN0YXJ0ID0gMCwgaW50IGVuZF0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHJlYWRzIGludG8gYW4gZXhpc3RpbmcgW0xpc3Q8aW50Pl0gZnJvbSB0aGUgZmlsZS4gSWYgW3N0YXJ0XQogICAqIGlzIHByZXNlbnQsIHRoZSBieXRlcyB3aWxsIGJlIGZpbGxlZCBpbnRvIFtidWZmZXJdIGZyb20gYXQgaW5kZXggW3N0YXJ0XSwKICAgKiBvdGhlcndpc2UgaW5kZXggMC4gIElmIFtlbmRdIGlzIHByZXNlbnQsIHRoZSBbZW5kXSAtIFtzdGFydF0gYnl0ZXMgd2lsbCBiZQogICAqIHJlYWQgaW50byBbYnVmZmVyXSwgb3RoZXJ3aXNlIHVwIHRvIFtidWZmZXIubGVuZ3RoXS4gSWYgW2VuZF0gPT0gW3N0YXJ0XQogICAqIG5vdGhpbmcgaGFwcGVucy4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIGludCByZWFkSW50b1N5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKTsKCiAgLyoqCiAgICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIGZpbGUuIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFJhbmRvbUFjY2Vzc0ZpbGUgd2hlbiB0aGUgd3JpdGUgY29tcGxldGVzLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB3cml0ZUJ5dGUoaW50IHZhbHVlKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB3cml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgZmlsZS4gUmV0dXJucyB0aGUKICAgKiBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4uCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBpbnQgd3JpdGVCeXRlU3luYyhpbnQgdmFsdWUpOwoKICAvKioKICAgKiBXcml0ZXMgZnJvbSBhIFtMaXN0PGludD5dIHRvIHRoZSBmaWxlLiBJdCB3aWxsIHJlYWQgdGhlIGJ1ZmZlciBmcm9tIGluZGV4CiAgICogW3N0YXJ0XSB0byBpbmRleCBbZW5kXS4gSWYgW3N0YXJ0XSBpcyBvbWl0dGVkLCBpdCdsbCBzdGFydCBmcm9tIGluZGV4IDAuCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgd2lsbCB3cml0ZSB0byBlbmQgb2YgW2J1ZmZlcl0uCiAgICoKICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzCiAgICogW1JhbmRvbUFjY2Vzc0ZpbGVdIHdoZW4gdGhlIHdyaXRlIGNvbXBsZXRlcy4KICAgKi8KICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gd3JpdGVGcm9tKExpc3Q8aW50PiBidWZmZXIsCiAgICAgIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgd3JpdGVzIGZyb20gYSBbTGlzdDxpbnQ+XSB0byB0aGUgZmlsZS4gSXQgd2lsbCByZWFkIHRoZQogICAqIGJ1ZmZlciBmcm9tIGluZGV4IFtzdGFydF0gdG8gaW5kZXggW2VuZF0uIElmIFtzdGFydF0gaXMgb21pdHRlZCwgaXQnbGwKICAgKiBzdGFydCBmcm9tIGluZGV4IDAuIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IHdpbGwgd3JpdGUgdG8gdGhlIGVuZCBvZgogICAqIFtidWZmZXJdLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCB3cml0ZUZyb21TeW5jKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSk7CgogIC8qKgogICAqIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgZmlsZSB1c2luZyB0aGUgZ2l2ZW4gW0VuY29kaW5nXS4gUmV0dXJucyBhCiAgICogYEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzCiAgICogUmFuZG9tQWNjZXNzRmlsZSB3aGVuIHRoZSB3cml0ZSBjb21wbGV0ZXMuCiAgICovCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHdyaXRlU3RyaW5nKFN0cmluZyBzdHJpbmcsCiAgICAgIHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHdyaXRlcyBhIHNpbmdsZSBzdHJpbmcgdG8gdGhlIGZpbGUgdXNpbmcgdGhlIGdpdmVuCiAgICogW0VuY29kaW5nXS4KICAgKgogICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgogICAqLwogIHZvaWQgd3JpdGVTdHJpbmdTeW5jKFN0cmluZyBzdHJpbmcsIHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pOwoKICAvKioKICAgKiBHZXRzIHRoZSBjdXJyZW50IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGZpbGUuIFJldHVybnMgYQogICAqIGBGdXR1cmU8aW50PmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgcG9zaXRpb24uCiAgICovCiAgRnV0dXJlPGludD4gcG9zaXRpb24oKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBnZXRzIHRoZSBjdXJyZW50IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICBpbnQgcG9zaXRpb25TeW5jKCk7CgogIC8qKgogICAqIFNldHMgdGhlIGJ5dGUgcG9zaXRpb24gaW4gdGhlIGZpbGUuIFJldHVybnMgYQogICAqIGBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT5gIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFJhbmRvbUFjY2Vzc0ZpbGUgd2hlbiB0aGUgcG9zaXRpb24gaGFzIGJlZW4gc2V0LgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHNldHMgdGhlIGJ5dGUgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICB2b2lkIHNldFBvc2l0aW9uU3luYyhpbnQgcG9zaXRpb24pOwoKICAvKioKICAgKiBUcnVuY2F0ZXMgKG9yIGV4dGVuZHMpIHRoZSBmaWxlIHRvIFtsZW5ndGhdIGJ5dGVzLiBSZXR1cm5zIGEKICAgKiBgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoaXMKICAgKiBSYW5kb21BY2Nlc3NGaWxlIHdoZW4gdGhlIHRydW5jYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB0cnVuY2F0ZShpbnQgbGVuZ3RoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSB0cnVuY2F0ZXMgKG9yIGV4dGVuZHMpIHRoZSBmaWxlIHRvIFtsZW5ndGhdIGJ5dGVzLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgdm9pZCB0cnVuY2F0ZVN5bmMoaW50IGxlbmd0aCk7CgogIC8qKgogICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4gUmV0dXJucyBhIGBGdXR1cmU8aW50PmAgdGhhdAogICAqIGNvbXBsZXRlcyB3aXRoIHRoZSBsZW5ndGggaW4gYnl0ZXMuCiAgICovCiAgRnV0dXJlPGludD4gbGVuZ3RoKCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZ2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlLgogICAqCiAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgICovCiAgaW50IGxlbmd0aFN5bmMoKTsKCiAgLyoqCiAgICogRmx1c2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgdG8gZGlzay4gUmV0dXJucyBhCiAgICogYEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPmAgdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGlzCiAgICogUmFuZG9tQWNjZXNzRmlsZSB3aGVuIHRoZSBmbHVzaCBvcGVyYXRpb24gY29tcGxldGVzLgogICAqLwogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBmbHVzaCgpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGZsdXNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHRvIGRpc2suCiAgICoKICAgKiBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgKi8KICB2b2lkIGZsdXNoU3luYygpOwoKICAvKioKICAgKiBMb2NrcyB0aGUgZmlsZSBvciBwYXJ0IG9mIHRoZSBmaWxlLgogICAqCiAgICogQnkgZGVmYXVsdCBhbiBleGNsdXNpdmUgbG9jayB3aWxsIGJlIG9idGFpbmVkLCBidXQgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbgogICAqIGJ5IHRoZSBbbW9kZV0gYXJndW1lbnQuCiAgICoKICAgKiBMb2NrcyB0aGUgYnl0ZSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gb2YgdGhlIGZpbGUsIHdpdGggdGhlCiAgICogYnl0ZSBhdCBwb3NpdGlvbiBgZW5kYCBub3QgaW5jbHVkZWQuIElmIG5vIGFyZ3VtZW50cyBhcmUKICAgKiBzcGVjaWZpZWQsIHRoZSBmdWxsIGZpbGUgaXMgbG9ja2VkLCBJZiBvbmx5IGBzdGFydGAgaXMgc3BlY2lmaWVkCiAgICogdGhlIGZpbGUgaXMgbG9ja2VkIGZyb20gYnl0ZSBwb3NpdGlvbiBgc3RhcnRgIHRvIHRoZSBlbmQgb2YgdGhlCiAgICogZmlsZSwgbm8gbWF0dGVyIGhvdyBsYXJnZSBpdCBncm93cy4gSXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhbgogICAqIGV4cGxpY2l0IHZhbHVlIG9mIGBlbmRgIHdoaWNoIGlzIHBhc3QgdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBmaWxlLgogICAqCiAgICogVG8gb2J0YWluIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIGEgZmlsZSBpdCBtdXN0IGJlIG9wZW5lZCBmb3Igd3JpdGluZy4KICAgKgogICAqIElmIFttb2RlXSBpcyBbRmlsZUxvY2suZXhjbHVzaXZlXSBvciBbRmlsZUxvY2suc2hhcmVkXSwgYW4gZXJyb3IgaXMKICAgKiBzaWduYWxlZCBpZiB0aGUgbG9jayBjYW5ub3QgYmUgb2J0YWluZWQuIElmIFttb2RlXSBpcwogICAqIFtGaWxlTG9jay5ibG9ja2luZ0V4Y2x1c2l2ZV0gb3IgW0ZpbGVMb2NrLmJsb2NraW5nU2hhcmVkXSwgdGhlCiAgICogcmV0dXJuZWQgW0Z1dHVyZV0gaXMgcmVzb2x2ZWQgb25seSB3aGVuIHRoZSBsb2NrIGhhcyBiZWVuIG9idGFpbmVkLgogICAqCiAgICogKk5PVEUqIGZpbGUgbG9ja2luZyBkb2VzIGhhdmUgc2xpZ2h0IGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGFjcm9zcwogICAqIHBsYXRmb3JtczoKICAgKgogICAqIE9uIExpbnV4IGFuZCBPUyBYIHRoaXMgdXNlcyBhZHZpc29yeSBsb2Nrcywgd2hpY2ggaGF2ZSB0aGUKICAgKiBzdXJwcmlzaW5nIHNlbWFudGljcyB0aGF0IGFsbCBsb2NrcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBmaWxlCiAgICogYXJlIHJlbW92ZWQgd2hlbiAqYW55KiBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoYXQgZmlsZSBpcyBjbG9zZWQgYnkKICAgKiB0aGUgcHJvY2Vzcy4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWN0dWFsbHkgbG9jayB0aGUgZmlsZSBmb3IKICAgKiBhY2Nlc3MuIEFsc28gbm90ZSB0aGF0IGFkdmlzb3J5IGxvY2tzIGFyZSBvbiBhIHByb2Nlc3MKICAgKiBsZXZlbC4gVGhpcyBtZWFucyB0aGF0IHNldmVyYWwgaXNvbGF0ZXMgaW4gdGhlIHNhbWUgcHJvY2VzcyBjYW4KICAgKiBvYnRhaW4gYW4gZXhjbHVzaXZlIGxvY2sgb24gdGhlIHNhbWUgZmlsZS4KICAgKgogICAqIE9uIFdpbmRvd3MgdGhlIHJlZ2lvbnMgdXNlZCBmb3IgbG9jayBhbmQgdW5sb2NrIG5lZWRzIHRvIG1hdGNoLiBJZiB0aGF0CiAgICogaXMgbm90IHRoZSBjYXNlIHVubG9ja2luZyB3aWxsIHJlc3VsdCBpbiB0aGUgT1MgZXJyb3IgIlRoZSBzZWdtZW50IGlzCiAgICogYWxyZWFkeSB1bmxvY2tlZCIuCiAgICovCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IGxvY2soCiAgICAgIFtGaWxlTG9jayBtb2RlID0gRmlsZUxvY2suZXhjbHVzaXZlLCBpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSBsb2NrcyB0aGUgZmlsZSBvciBwYXJ0IG9mIHRoZSBmaWxlLgogICAqCiAgICogQnkgZGVmYXVsdCBhbiBleGNsdXNpdmUgbG9jayB3aWxsIGJlIG9idGFpbmVkLCBidXQgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbgogICAqIGJ5IHRoZSBbbW9kZV0gYXJndW1lbnQuCiAgICoKICAgKiBMb2NrcyB0aGUgYnl0ZSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gb2YgdGhlIGZpbGUgLHdpdGggdGhlCiAgICogYnl0ZSBhdCBwb3NpdGlvbiBgZW5kYCBub3QgaW5jbHVkZWQuIElmIG5vIGFyZ3VtZW50cyBhcmUKICAgKiBzcGVjaWZpZWQsIHRoZSBmdWxsIGZpbGUgaXMgbG9ja2VkLCBJZiBvbmx5IGBzdGFydGAgaXMgc3BlY2lmaWVkCiAgICogdGhlIGZpbGUgaXMgbG9ja2VkIGZyb20gYnl0ZSBwb3NpdGlvbiBgc3RhcnRgIHRvIHRoZSBlbmQgb2YgdGhlCiAgICogZmlsZSwgbm8gbWF0dGVyIGhvdyBsYXJnZSBpdCBncm93cy4gSXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhbgogICAqIGV4cGxpY2l0IHZhbHVlIG9mIGBlbmRgIHdoaWNoIGlzIHBhc3QgdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBmaWxlLgogICAqCiAgICogVG8gb2J0YWluIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIGEgZmlsZSBpdCBtdXN0IGJlIG9wZW5lZCBmb3Igd3JpdGluZy4KICAgKgogICAqIElmIFttb2RlXSBpcyBbRmlsZUxvY2suZXhjbHVzaXZlXSBvciBbRmlsZUxvY2suc2hhcmVkXSwgYW4gZXhjZXB0aW9uIGlzCiAgICogdGhyb3duIGlmIHRoZSBsb2NrIGNhbm5vdCBiZSBvYnRhaW5lZC4gSWYgW21vZGVdIGlzCiAgICogW0ZpbGVMb2NrLmJsb2NraW5nRXhjbHVzaXZlXSBvciBbRmlsZUxvY2suYmxvY2tpbmdTaGFyZWRdLCB0aGUKICAgKiBjYWxsIHJldHVybnMgb25seSBhZnRlciB0aGUgbG9jayBoYXMgYmVlbiBvYnRhaW5lZC4KICAgKgogICAqICpOT1RFKiBmaWxlIGxvY2tpbmcgZG9lcyBoYXZlIHNsaWdodCBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciBhY3Jvc3MKICAgKiBwbGF0Zm9ybXM6CiAgICoKICAgKiBPbiBMaW51eCBhbmQgT1MgWCB0aGlzIHVzZXMgYWR2aXNvcnkgbG9ja3MsIHdoaWNoIGhhdmUgdGhlCiAgICogc3VycHJpc2luZyBzZW1hbnRpY3MgdGhhdCBhbGwgbG9ja3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZmlsZQogICAqIGFyZSByZW1vdmVkIHdoZW4gKmFueSogZmlsZSBkZXNjcmlwdG9yIGZvciB0aGF0IGZpbGUgaXMgY2xvc2VkIGJ5CiAgICogdGhlIHByb2Nlc3MuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFjdHVhbGx5IGxvY2sgdGhlIGZpbGUgZm9yCiAgICogYWNjZXNzLiBBbHNvIG5vdGUgdGhhdCBhZHZpc29yeSBsb2NrcyBhcmUgb24gYSBwcm9jZXNzCiAgICogbGV2ZWwuIFRoaXMgbWVhbnMgdGhhdCBzZXZlcmFsIGlzb2xhdGVzIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FuCiAgICogb2J0YWluIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRoZSBzYW1lIGZpbGUuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoZSByZWdpb25zIHVzZWQgZm9yIGxvY2sgYW5kIHVubG9jayBuZWVkcyB0byBtYXRjaC4gSWYgdGhhdAogICAqIGlzIG5vdCB0aGUgY2FzZSB1bmxvY2tpbmcgd2lsbCByZXN1bHQgaW4gdGhlIE9TIGVycm9yICJUaGUgc2VnbWVudCBpcwogICAqIGFscmVhZHkgdW5sb2NrZWQiLgogICAqCiAgICovCiAgdm9pZCBsb2NrU3luYygKICAgICAgW0ZpbGVMb2NrIG1vZGUgPSBGaWxlTG9jay5leGNsdXNpdmUsIGludCBzdGFydCA9IDAsIGludCBlbmQgPSAtMV0pOwoKICAvKioKICAgKiBVbmxvY2tzIHRoZSBmaWxlIG9yIHBhcnQgb2YgdGhlIGZpbGUuCiAgICoKICAgKiBVbmxvY2tzIHRoZSBieXRlIHJhbmdlIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBvZiB0aGUgZmlsZSwgd2l0aAogICAqIHRoZSBieXRlIGF0IHBvc2l0aW9uIGBlbmRgIG5vdCBpbmNsdWRlZC4gSWYgbm8gYXJndW1lbnRzIGFyZQogICAqIHNwZWNpZmllZCwgdGhlIGZ1bGwgZmlsZSBpcyB1bmxvY2tlZCwgSWYgb25seSBgc3RhcnRgIGlzCiAgICogc3BlY2lmaWVkIHRoZSBmaWxlIGlzIHVubG9ja2VkIGZyb20gYnl0ZSBwb3NpdGlvbiBgc3RhcnRgIHRvIHRoZQogICAqIGVuZCBvZiB0aGUgZmlsZS4KICAgKgogICAqICpOT1RFKiBmaWxlIGxvY2tpbmcgZG9lcyBoYXZlIHNsaWdodCBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciBhY3Jvc3MKICAgKiBwbGF0Zm9ybXM6CiAgICoKICAgKiBTZWUgW2xvY2tdIGZvciBtb3JlIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHVubG9jayhbaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgdW5sb2NrcyB0aGUgZmlsZSBvciBwYXJ0IG9mIHRoZSBmaWxlLgogICAqCiAgICogVW5sb2NrcyB0aGUgYnl0ZSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gb2YgdGhlIGZpbGUsIHdpdGgKICAgKiB0aGUgYnl0ZSBhdCBwb3NpdGlvbiBgZW5kYCBub3QgaW5jbHVkZWQuIElmIG5vIGFyZ3VtZW50cyBhcmUKICAgKiBzcGVjaWZpZWQsIHRoZSBmdWxsIGZpbGUgaXMgdW5sb2NrZWQsIElmIG9ubHkgYHN0YXJ0YCBpcwogICAqIHNwZWNpZmllZCB0aGUgZmlsZSBpcyB1bmxvY2tlZCBmcm9tIGJ5dGUgcG9zaXRpb24gYHN0YXJ0YCB0byB0aGUKICAgKiBlbmQgb2YgdGhlIGZpbGUuCiAgICoKICAgKiAqTk9URSogZmlsZSBsb2NraW5nIGRvZXMgaGF2ZSBzbGlnaHQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3IgYWNyb3NzCiAgICogcGxhdGZvcm1zOgogICAqCiAgICogU2VlIFtsb2NrU3luY10gZm9yIG1vcmUgZGV0YWlscy4KICAgKi8KICB2b2lkIHVubG9ja1N5bmMoW2ludCBzdGFydCA9IDAsIGludCBlbmQgPSAtMV0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGZvciB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUgaW5zdGFuY2UuCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nKCk7CgogIC8qKgogICAqIEdldHMgdGhlIHBhdGggb2YgdGhlIGZpbGUgdW5kZXJseWluZyB0aGlzIFJhbmRvbUFjY2Vzc0ZpbGUuCiAgICovCiAgU3RyaW5nIGdldCBwYXRoOwp9CgovKioKICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgZmlsZSBvcGVyYXRpb24gZmFpbHMuCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIEZpbGVTeXN0ZW1FeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgLyoqCiAgICogTWVzc2FnZSBkZXNjcmliaW5nIHRoZSBlcnJvci4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSBkZXRhaWxlZAogICAqIGluZm9ybWF0aW9uIGZvcm0gdGhlIHVuZGVybHlpbmcgT1MgZXJyb3IuIENoZWNrIFtvc0Vycm9yXSBmb3IKICAgKiB0aGF0IGluZm9ybWF0aW9uLgogICAqLwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICAvKioKICAgKiBUaGUgZmlsZSBzeXN0ZW0gcGF0aCBvbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuIENhbiBiZSBgbnVsbGAKICAgKiBpZiB0aGUgZXhjZXB0aW9uIGRvZXMgbm90IHJlbGF0ZSBkaXJlY3RseSB0byBhIGZpbGUgc3lzdGVtIHBhdGguCiAgICovCiAgZmluYWwgU3RyaW5nIHBhdGg7CgogIC8qKgogICAqIFRoZSB1bmRlcmx5aW5nIE9TIGVycm9yLiBDYW4gYmUgYG51bGxgIGlmIHRoZSBleGNlcHRpb24gaXMgbm90CiAgICogcmFpc2VkIGR1ZSB0byBhbiBPUyBlcnJvci4KICAgKi8KICBmaW5hbCBPU0Vycm9yIG9zRXJyb3I7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbiB3aXRoIGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UKICAgKiBbbWVzc2FnZV0sIG9wdGlvbmFsIGZpbGUgc3lzdGVtIHBhdGggW3BhdGhdIGFuZCBvcHRpb25hbCBPUyBlcnJvcgogICAqIFtvc0Vycm9yXS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgY29uc3QgRmlsZVN5c3RlbUV4Y2VwdGlvbihbdGhpcy5tZXNzYWdlID0gIiIsIHRoaXMucGF0aCA9ICIiLCB0aGlzLm9zRXJyb3JdKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgc2Iud3JpdGUoIkZpbGVTeXN0ZW1FeGNlcHRpb24iKTsKICAgIGlmIChtZXNzYWdlLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoIjogJG1lc3NhZ2UiKTsKICAgICAgaWYgKHBhdGggIT0gbnVsbCkgewogICAgICAgIHNiLndyaXRlKCIsIHBhdGggPSAnJHBhdGgnIik7CiAgICAgIH0KICAgICAgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICAgIHNiLndyaXRlKCIgKCRvc0Vycm9yKSIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiOiAkb3NFcnJvciIpOwogICAgICBpZiAocGF0aCAhPSBudWxsKSB7CiAgICAgICAgc2Iud3JpdGUoIiwgcGF0aCA9ICckcGF0aCciKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwYXRoICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIjogJHBhdGgiKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQqD9ABOTjwBEQEELAQRNDMiHAFDSxU0Ix4BPUM1JCABPksVOCcnAThDPi00ARMBKAIBMikcAUVJEyoeAT9BKyABPEkTLicBNkE0NAEzERg1JCABGzgnJgEhPSwxASRALzcBEwEoAgEELQNMEUsxA1AiAyoDTlBFA0orMgNLN0dQAxgDNUJADQMXA08xAxwZAxVGHA0JA0U+NThEPgM3LUADGR4cAxAsOgMVRFE+NRA7NQkDFgNAAxkDFSY6HywPCQNFRz0DGQMVKiY+AzcXCQMZAzNCS0QXAxkDECwDJBcNCQNEIgMWA2FJSAMbalEDUkwcBBoyBh4FSkUFSCAGHB43HR4GJwQBBiYFRgY/AQZJHwYcMCcrBAEGQygFR0QvBUtGDwVPBjABBkZKNwU/MEsFPAYsAQZAMgU8QkEGJwEGNyQFPEExBiMBBj0xBTxCQQYlAQY0IwU8QTEGIQEGPikGGAEGLwU8BhQBBkoFMEchBhUBBCsDTzwDOgQjAQQrAz5RPgM6BB8BBjMFSQU/BikBBkEFPwYrAQQrA088AzoEIwEEKwM+UT4DOgQfAQYzBUkFPwYpAQZBBUYGKwEGOz9GJgUpBTEFRkYWBUkUBkEBBkNGRyoFOAU8Bj0BBkYFTC0FTxgFR0cTBjQBBjo6FwU4BTxFFAVGRUAhBk4BBkFEIgYjAQZFBTwGHwEGPxEFRCYGOgEGRxcFPAY2AQZEEQVEKwY/AQZCIQU8BjsBBiYFSkopBU5MQgVIRgYtOwEGNAVJBU5QQgVDMgU8Bik7AQYfBU1LLgVPTEIFSEYFBi4mHxsBBi0FTQsFRUtGEAVDMgU8BiomHxsBBh8GEwIBBD4JAzolAz87RDwDUEk6A0xGBCIGLigGGAEGJAU8BhQBBj5KBhoBBkUmBTwGFgEGUAYlAQZELAU8BiEBBk5NT0wOBUsGRAEGUE9QThYFPAZAAQYxOTAGMQEGQSsFPAYgAQZPTjwFQzIGNyEBBktMSg8FPAZCAQZHOTAGNiIBBkYRBTwGQgEGOzUGGgEGPwU8BhYBBjM5NgY2AQY3BTwGJgEGQjk+BjEBBkYFPAYhAQY/KQYYAQYwBTwGFAEGOTk6BiQBBj0FPAYUAQYpBU8dBUY+RkVGSwVKBUk7REkFSRAFQEZHRTxFMAVNSxgGIUoBBjcFTx0FRj5GRUZLBUoFTTlEOQVJEAVARkdFPEUwBU1LGAUGEUoBBisFREI+RhYFSRAFIgZCAQY5BURCPkYWBUkQBSYGMgEGSQYVAQZBBhMCAQQxBBozBkZDFwYYAQZFRgYVAQZEIAYZAQZGRxAGHFABFiolHh4aJggdIQgiHhomCB8bBhoEAgERZGFydDppby9maWxlLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2lvL2ZpbGVfaW1wbC5kYXJ0wACAGy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovLyBSZWFkIHRoZSBmaWxlIGluIGJsb2NrcyBvZiBzaXplIDY0ay4KY29uc3QgaW50IF9ibG9ja1NpemUgPSA2NCAqIDEwMjQ7CgpjbGFzcyBfRmlsZVN0cmVhbSBleHRlbmRzIFN0cmVhbTxMaXN0PGludD4+IHsKICAvLyBTdHJlYW0gY29udHJvbGxlci4KICBTdHJlYW1Db250cm9sbGVyPExpc3Q8aW50Pj4gX2NvbnRyb2xsZXI7CgogIC8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1bmRlcmx5aW5nIGZpbGUuCiAgU3RyaW5nIF9wYXRoOwogIFJhbmRvbUFjY2Vzc0ZpbGUgX29wZW5lZEZpbGU7CiAgaW50IF9wb3NpdGlvbjsKICBpbnQgX2VuZDsKICBmaW5hbCBDb21wbGV0ZXIgX2Nsb3NlQ29tcGxldGVyID0gbmV3IENvbXBsZXRlcigpOwoKICAvLyBIYXMgdGhlIHN0cmVhbSBiZWVuIHBhdXNlZCBvciB1bnN1YnNjcmliZWQ/CiAgYm9vbCBfdW5zdWJzY3JpYmVkID0gZmFsc2U7CgogIC8vIElzIHRoZXJlIGEgcmVhZCBjdXJyZW50bHkgaW4gcHJvZ3Jlc3M/CiAgYm9vbCBfcmVhZEluUHJvZ3Jlc3MgPSB0cnVlOwogIGJvb2wgX2Nsb3NlZCA9IGZhbHNlOwoKICBib29sIF9hdEVuZCA9IGZhbHNlOwoKICBfRmlsZVN0cmVhbSh0aGlzLl9wYXRoLCB0aGlzLl9wb3NpdGlvbiwgdGhpcy5fZW5kKSB7CiAgICBfcG9zaXRpb24gPz89IDA7CiAgfQoKICBfRmlsZVN0cmVhbS5mb3JTdGRpbigpIDogX3Bvc2l0aW9uID0gMDsKCiAgU3RyZWFtU3Vic2NyaXB0aW9uPExpc3Q8aW50Pj4gbGlzdGVuKHZvaWQgb25EYXRhKExpc3Q8aW50PiBldmVudCksCiAgICAgIHtGdW5jdGlvbiBvbkVycm9yLCB2b2lkIG9uRG9uZSgpLCBib29sIGNhbmNlbE9uRXJyb3J9KSB7CiAgICBfc2V0dXBDb250cm9sbGVyKCk7CiAgICByZXR1cm4gX2NvbnRyb2xsZXIuc3RyZWFtLmxpc3RlbihvbkRhdGEsCiAgICAgICAgb25FcnJvcjogb25FcnJvciwgb25Eb25lOiBvbkRvbmUsIGNhbmNlbE9uRXJyb3I6IGNhbmNlbE9uRXJyb3IpOwogIH0KCiAgdm9pZCBfc2V0dXBDb250cm9sbGVyKCkgewogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxMaXN0PGludD4+KAogICAgICAgIHN5bmM6IHRydWUsCiAgICAgICAgb25MaXN0ZW46IF9zdGFydCwKICAgICAgICBvblJlc3VtZTogX3JlYWRCbG9jaywKICAgICAgICBvbkNhbmNlbDogKCkgewogICAgICAgICAgX3Vuc3Vic2NyaWJlZCA9IHRydWU7CiAgICAgICAgICByZXR1cm4gX2Nsb3NlRmlsZSgpOwogICAgICAgIH0pOwogIH0KCiAgRnV0dXJlIF9jbG9zZUZpbGUoKSB7CiAgICBpZiAoX3JlYWRJblByb2dyZXNzIHx8IF9jbG9zZWQpIHsKICAgICAgcmV0dXJuIF9jbG9zZUNvbXBsZXRlci5mdXR1cmU7CiAgICB9CiAgICBfY2xvc2VkID0gdHJ1ZTsKCiAgICB2b2lkIGRvbmUoKSB7CiAgICAgIF9jbG9zZUNvbXBsZXRlci5jb21wbGV0ZSgpOwogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgfQoKICAgIF9vcGVuZWRGaWxlLmNsb3NlKCkuY2F0Y2hFcnJvcihfY29udHJvbGxlci5hZGRFcnJvcikud2hlbkNvbXBsZXRlKGRvbmUpOwogICAgcmV0dXJuIF9jbG9zZUNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICB2b2lkIF9yZWFkQmxvY2soKSB7CiAgICAvLyBEb24ndCBzdGFydCBhIG5ldyByZWFkIGlmIG9uZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLgogICAgaWYgKF9yZWFkSW5Qcm9ncmVzcykgcmV0dXJuOwogICAgaWYgKF9hdEVuZCkgewogICAgICBfY2xvc2VGaWxlKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9yZWFkSW5Qcm9ncmVzcyA9IHRydWU7CiAgICBpbnQgcmVhZEJ5dGVzID0gX2Jsb2NrU2l6ZTsKICAgIGlmIChfZW5kICE9IG51bGwpIHsKICAgICAgcmVhZEJ5dGVzID0gbWluKHJlYWRCeXRlcywgX2VuZCAtIF9wb3NpdGlvbik7CiAgICAgIGlmIChyZWFkQnl0ZXMgPCAwKSB7CiAgICAgICAgX3JlYWRJblByb2dyZXNzID0gZmFsc2U7CiAgICAgICAgaWYgKCFfdW5zdWJzY3JpYmVkKSB7CiAgICAgICAgICBfY29udHJvbGxlci5hZGRFcnJvcihuZXcgUmFuZ2VFcnJvcigiQmFkIGVuZCBwb3NpdGlvbjogJF9lbmQiKSk7CiAgICAgICAgICBfY2xvc2VGaWxlKCk7CiAgICAgICAgICBfdW5zdWJzY3JpYmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBfb3BlbmVkRmlsZS5yZWFkKHJlYWRCeXRlcykudGhlbigoYmxvY2spIHsKICAgICAgX3JlYWRJblByb2dyZXNzID0gZmFsc2U7CiAgICAgIGlmIChfdW5zdWJzY3JpYmVkKSB7CiAgICAgICAgX2Nsb3NlRmlsZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfcG9zaXRpb24gKz0gYmxvY2subGVuZ3RoOwogICAgICBpZiAoYmxvY2subGVuZ3RoIDwgcmVhZEJ5dGVzIHx8IChfZW5kICE9IG51bGwgJiYgX3Bvc2l0aW9uID09IF9lbmQpKSB7CiAgICAgICAgX2F0RW5kID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoIV9hdEVuZCAmJiAhX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgICBfcmVhZEJsb2NrKCk7CiAgICAgIH0KICAgICAgX2NvbnRyb2xsZXIuYWRkKGJsb2NrKTsKICAgICAgaWYgKF9hdEVuZCkgewogICAgICAgIF9jbG9zZUZpbGUoKTsKICAgICAgfQogICAgfSkuY2F0Y2hFcnJvcigoZSwgcykgewogICAgICBpZiAoIV91bnN1YnNjcmliZWQpIHsKICAgICAgICBfY29udHJvbGxlci5hZGRFcnJvcihlLCBzKTsKICAgICAgICBfY2xvc2VGaWxlKCk7CiAgICAgICAgX3Vuc3Vic2NyaWJlZCA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdm9pZCBfc3RhcnQoKSB7CiAgICBpZiAoX3Bvc2l0aW9uIDwgMCkgewogICAgICBfY29udHJvbGxlci5hZGRFcnJvcihuZXcgUmFuZ2VFcnJvcigiQmFkIHN0YXJ0IHBvc2l0aW9uOiAkX3Bvc2l0aW9uIikpOwogICAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgICBfY2xvc2VDb21wbGV0ZXIuY29tcGxldGUoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZvaWQgb25SZWFkeShSYW5kb21BY2Nlc3NGaWxlIGZpbGUpIHsKICAgICAgX29wZW5lZEZpbGUgPSBmaWxlOwogICAgICBfcmVhZEluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgX3JlYWRCbG9jaygpOwogICAgfQoKICAgIHZvaWQgb25PcGVuRmlsZShSYW5kb21BY2Nlc3NGaWxlIGZpbGUpIHsKICAgICAgaWYgKF9wb3NpdGlvbiA+IDApIHsKICAgICAgICBmaWxlLnNldFBvc2l0aW9uKF9wb3NpdGlvbikudGhlbihvblJlYWR5LCBvbkVycm9yOiAoZSwgcykgewogICAgICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IoZSwgcyk7CiAgICAgICAgICBfcmVhZEluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgIF9jbG9zZUZpbGUoKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvblJlYWR5KGZpbGUpOwogICAgICB9CiAgICB9CgogICAgdm9pZCBvcGVuRmFpbGVkKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgX2NvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgX2Nsb3NlQ29tcGxldGVyLmNvbXBsZXRlKCk7CiAgICB9CgogICAgaWYgKF9wYXRoICE9IG51bGwpIHsKICAgICAgbmV3IEZpbGUoX3BhdGgpCiAgICAgICAgICAub3Blbihtb2RlOiBGaWxlTW9kZS5yZWFkKQogICAgICAgICAgLnRoZW4ob25PcGVuRmlsZSwgb25FcnJvcjogb3BlbkZhaWxlZCk7CiAgICB9IGVsc2UgewogICAgICB0cnkgewogICAgICAgIG9uT3BlbkZpbGUoX0ZpbGUuX29wZW5TdGRpb1N5bmMoMCkpOwogICAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgICAgb3BlbkZhaWxlZChlLCBzKTsKICAgICAgfQogICAgfQogIH0KfQoKY2xhc3MgX0ZpbGVTdHJlYW1Db25zdW1lciBleHRlbmRzIFN0cmVhbUNvbnN1bWVyPExpc3Q8aW50Pj4gewogIEZpbGUgX2ZpbGU7CiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IF9vcGVuRnV0dXJlOwoKICBfRmlsZVN0cmVhbUNvbnN1bWVyKHRoaXMuX2ZpbGUsIEZpbGVNb2RlIG1vZGUpIHsKICAgIF9vcGVuRnV0dXJlID0gX2ZpbGUub3Blbihtb2RlOiBtb2RlKTsKICB9CgogIF9GaWxlU3RyZWFtQ29uc3VtZXIuZnJvbVN0ZGlvKGludCBmZCkgewogICAgX29wZW5GdXR1cmUgPSBuZXcgRnV0dXJlLnZhbHVlKF9GaWxlLl9vcGVuU3RkaW9TeW5jKGZkKSk7CiAgfQoKICBGdXR1cmU8RmlsZT4gYWRkU3RyZWFtKFN0cmVhbTxMaXN0PGludD4+IHN0cmVhbSkgewogICAgQ29tcGxldGVyPEZpbGU+IGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8RmlsZT4uc3luYygpOwogICAgX29wZW5GdXR1cmUudGhlbigob3BlbmVkRmlsZSkgewogICAgICB2YXIgX3N1YnNjcmlwdGlvbjsKICAgICAgdm9pZCBlcnJvcihlLCBbU3RhY2tUcmFjZSBzdGFja1RyYWNlXSkgewogICAgICAgIF9zdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICAgICAgb3BlbmVkRmlsZS5jbG9zZSgpOwogICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGUsIHN0YWNrVHJhY2UpOwogICAgICB9CgogICAgICBfc3Vic2NyaXB0aW9uID0gc3RyZWFtLmxpc3RlbigoZCkgewogICAgICAgIF9zdWJzY3JpcHRpb24ucGF1c2UoKTsKICAgICAgICB0cnkgewogICAgICAgICAgb3BlbmVkRmlsZQogICAgICAgICAgICAgIC53cml0ZUZyb20oZCwgMCwgZC5sZW5ndGgpCiAgICAgICAgICAgICAgLnRoZW4oKF8pID0+IF9zdWJzY3JpcHRpb24ucmVzdW1lKCksIG9uRXJyb3I6IGVycm9yKTsKICAgICAgICB9IGNhdGNoIChlLCBzdGFja1RyYWNlKSB7CiAgICAgICAgICBlcnJvcihlLCBzdGFja1RyYWNlKTsKICAgICAgICB9CiAgICAgIH0sIG9uRG9uZTogKCkgewogICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZShfZmlsZSk7CiAgICAgIH0sIG9uRXJyb3I6IGVycm9yLCBjYW5jZWxPbkVycm9yOiB0cnVlKTsKICAgIH0pLmNhdGNoRXJyb3IoY29tcGxldGVyLmNvbXBsZXRlRXJyb3IpOwogICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgfQoKICBGdXR1cmU8RmlsZT4gY2xvc2UoKSA9PgogICAgICBfb3BlbkZ1dHVyZS50aGVuKChvcGVuZWRGaWxlKSA9PiBvcGVuZWRGaWxlLmNsb3NlKCkpLnRoZW4oKF8pID0+IF9maWxlKTsKfQoKLy8gQ2xhc3MgZm9yIGVuY2Fwc3VsYXRpbmcgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBmaWxlcy4KY2xhc3MgX0ZpbGUgZXh0ZW5kcyBGaWxlU3lzdGVtRW50aXR5IGltcGxlbWVudHMgRmlsZSB7CiAgU3RyaW5nIF9wYXRoOwogIFVpbnQ4TGlzdCBfcmF3UGF0aDsKCiAgX0ZpbGUoU3RyaW5nIHBhdGgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHBhdGgsICdwYXRoJyk7CiAgICBfcGF0aCA9IHBhdGg7CiAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvVXRmOEFycmF5KHBhdGgpOwogIH0KCiAgX0ZpbGUuZnJvbVJhd1BhdGgoVWludDhMaXN0IHJhd1BhdGgpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHJhd1BhdGgsICdyYXdQYXRoJyk7CiAgICBfcmF3UGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvTnVsbFRlcm1pbmF0ZWRVdGY4QXJyYXkocmF3UGF0aCk7CiAgICBfcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RvU3RyaW5nRnJvbVV0ZjhBcnJheShyYXdQYXRoKTsKICB9CgogIFN0cmluZyBnZXQgcGF0aCA9PiBfcGF0aDsKCiAgLy8gV0FSTklORzoKICAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBuYXRpdmUKICAvLyBuYW1lc3BhY2Ugb2JqZWN0LiBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgdG8gcGFzcyB0aGUgcG9pbnRlciB0byB0aGUKICAvLyBJT1NlcnZpY2UsIHdoaWNoIHdpbGwgZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgd2hlbiBpdCBpcyBmaW5pc2hlZAogIC8vIHdpdGggaXQuCiAgc3RhdGljIGludCBfbmFtZXNwYWNlUG9pbnRlcigpID0+IF9OYW1lc3BhY2UuX25hbWVzcGFjZVBvaW50ZXI7CgogIHN0YXRpYyBGdXR1cmUgX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShpbnQgcmVxdWVzdCwgTGlzdCBkYXRhKSB7CiAgICBkYXRhWzBdID0gX25hbWVzcGFjZVBvaW50ZXIoKTsKICAgIHJldHVybiBfSU9TZXJ2aWNlLl9kaXNwYXRjaChyZXF1ZXN0LCBkYXRhKTsKICB9CgogIEZ1dHVyZTxib29sPiBleGlzdHMoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmZpbGVFeGlzdHMsIFtudWxsLCBfcmF3UGF0aF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJDYW5ub3QgY2hlY2sgZXhpc3RlbmNlIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2V4aXN0cyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBib29sIGV4aXN0c1N5bmMoKSB7CiAgICB2YXIgcmVzdWx0ID0gX2V4aXN0cyhfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihyZXN1bHQsICJDYW5ub3QgY2hlY2sgZXhpc3RlbmNlIG9mIGZpbGUiLCBwYXRoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBGaWxlIGdldCBhYnNvbHV0ZSA9PiBuZXcgRmlsZShfYWJzb2x1dGVQYXRoKTsKCiAgRnV0dXJlPEZpbGU+IGNyZWF0ZSh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgdmFyIHJlc3VsdCA9CiAgICAgICAgcmVjdXJzaXZlID8gcGFyZW50LmNyZWF0ZShyZWN1cnNpdmU6IHRydWUpIDogbmV3IEZ1dHVyZS52YWx1ZShudWxsKTsKICAgIHJldHVybiByZXN1bHQKICAgICAgICAudGhlbigoXykgPT4KICAgICAgICAgICAgX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmZpbGVDcmVhdGUsIFtudWxsLCBfcmF3UGF0aF0pKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAiQ2Fubm90IGNyZWF0ZSBmaWxlIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfY3JlYXRlKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CgogIGV4dGVybmFsIHN0YXRpYyBfY3JlYXRlTGluaygKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBTdHJpbmcgdGFyZ2V0KTsKCiAgZXh0ZXJuYWwgc3RhdGljIF9saW5rVGFyZ2V0KF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CgogIHZvaWQgY3JlYXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICBwYXJlbnQuY3JlYXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9jcmVhdGUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IGNyZWF0ZSBmaWxlIiwgcGF0aCk7CiAgfQoKICBGdXR1cmU8RmlsZT4gX2RlbGV0ZSh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICByZXR1cm4gbmV3IERpcmVjdG9yeShwYXRoKS5kZWxldGUocmVjdXJzaXZlOiB0cnVlKS50aGVuKChfKSA9PiB0aGlzKTsKICAgIH0KICAgIHJldHVybiBfZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKF9JT1NlcnZpY2UuZmlsZURlbGV0ZSwgW251bGwsIF9yYXdQYXRoXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIkNhbm5vdCBkZWxldGUgZmlsZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2RlbGV0ZU5hdGl2ZShfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBleHRlcm5hbCBzdGF0aWMgX2RlbGV0ZUxpbmtOYXRpdmUoX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoKTsKCiAgdm9pZCBfZGVsZXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICByZXR1cm4gbmV3IERpcmVjdG9yeS5mcm9tUmF3UGF0aChfcmF3UGF0aCkuZGVsZXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9kZWxldGVOYXRpdmUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IGRlbGV0ZSBmaWxlIiwgcGF0aCk7CiAgfQoKICBGdXR1cmU8RmlsZT4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICBfSU9TZXJ2aWNlLmZpbGVSZW5hbWUsIFtudWxsLCBfcmF3UGF0aCwgbmV3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHJlbmFtZSBmaWxlIHRvICckbmV3UGF0aCciLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IEZpbGUobmV3UGF0aCk7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfcmVuYW1lKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKTsKCiAgZXh0ZXJuYWwgc3RhdGljIF9yZW5hbWVMaW5rKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKTsKCiAgRmlsZSByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKSB7CiAgICB2YXIgcmVzdWx0ID0gX3JlbmFtZShfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCBuZXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihyZXN1bHQsICJDYW5ub3QgcmVuYW1lIGZpbGUgdG8gJyRuZXdQYXRoJyIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBGaWxlKG5ld1BhdGgpOwogIH0KCiAgRnV0dXJlPEZpbGU+IGNvcHkoU3RyaW5nIG5ld1BhdGgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZUNvcHksIFtudWxsLCBfcmF3UGF0aCwgbmV3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IGNvcHkgZmlsZSB0byAnJG5ld1BhdGgnIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBGaWxlKG5ld1BhdGgpOwogICAgfSk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgX2NvcHkoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3Qgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpOwoKICBGaWxlIGNvcHlTeW5jKFN0cmluZyBuZXdQYXRoKSB7CiAgICB2YXIgcmVzdWx0ID0gX2NvcHkoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCwgbmV3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IGNvcHkgZmlsZSB0byAnJG5ld1BhdGgnIiwgcGF0aCk7CiAgICByZXR1cm4gbmV3IEZpbGUobmV3UGF0aCk7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gb3Blbih7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUucmVhZH0pIHsKICAgIGlmIChtb2RlICE9IEZpbGVNb2RlLnJlYWQgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS5hcHBlbmQgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlT25seSAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUud3JpdGVPbmx5QXBwZW5kKSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLmVycm9yKAogICAgICAgICAgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgZmlsZSBtb2RlIGZvciB0aGlzIG9wZXJhdGlvbicpKTsKICAgIH0KICAgIHJldHVybiBfZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZU9wZW4sIFtudWxsLCBfcmF3UGF0aCwgbW9kZS5fbW9kZV0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJDYW5ub3Qgb3BlbiBmaWxlIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBfUmFuZG9tQWNjZXNzRmlsZShyZXNwb25zZSwgcGF0aCk7CiAgICB9KTsKICB9CgogIEZ1dHVyZTxpbnQ+IGxlbmd0aCgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZUxlbmd0aEZyb21QYXRoLCBbbnVsbCwgX3Jhd1BhdGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgIkNhbm5vdCByZXRyaWV2ZSBsZW5ndGggb2YgZmlsZSIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9sZW5ndGhGcm9tUGF0aChfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgpOwoKICBpbnQgbGVuZ3RoU3luYygpIHsKICAgIHZhciByZXN1bHQgPSBfbGVuZ3RoRnJvbVBhdGgoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IHJldHJpZXZlIGxlbmd0aCBvZiBmaWxlIiwgcGF0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPERhdGVUaW1lPiBsYXN0QWNjZXNzZWQoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmZpbGVMYXN0QWNjZXNzZWQsIFtudWxsLCBfcmF3UGF0aF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHJldHJpZXZlIGFjY2VzcyB0aW1lIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChyZXNwb25zZSk7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfbGFzdEFjY2Vzc2VkKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CgogIERhdGVUaW1lIGxhc3RBY2Nlc3NlZFN5bmMoKSB7CiAgICB2YXIgbXMgPSBfbGFzdEFjY2Vzc2VkKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKG1zLCAiQ2Fubm90IHJldHJpZXZlIGFjY2VzcyB0aW1lIiwgcGF0aCk7CiAgICByZXR1cm4gbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKG1zKTsKICB9CgogIEZ1dHVyZSBzZXRMYXN0QWNjZXNzZWQoRGF0ZVRpbWUgdGltZSkgewogICAgaW50IG1pbGxpcyA9IHRpbWUubWlsbGlzZWNvbmRzU2luY2VFcG9jaDsKICAgIHJldHVybiBfZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgICAgICBfSU9TZXJ2aWNlLmZpbGVTZXRMYXN0QWNjZXNzZWQsIFtudWxsLCBfcmF3UGF0aCwgbWlsbGlzXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIkNhbm5vdCBzZXQgYWNjZXNzIHRpbWUiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0pOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIF9zZXRMYXN0QWNjZXNzZWQoCiAgICAgIF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCwgaW50IG1pbGxpcyk7CgogIHZvaWQgc2V0TGFzdEFjY2Vzc2VkU3luYyhEYXRlVGltZSB0aW1lKSB7CiAgICBpbnQgbWlsbGlzID0gdGltZS5taWxsaXNlY29uZHNTaW5jZUVwb2NoOwogICAgdmFyIHJlc3VsdCA9IF9zZXRMYXN0QWNjZXNzZWQoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCwgbWlsbGlzKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigKICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGZpbGUgYWNjZXNzIHRpbWUiLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgRnV0dXJlPERhdGVUaW1lPiBsYXN0TW9kaWZpZWQoKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZShfSU9TZXJ2aWNlLmZpbGVMYXN0TW9kaWZpZWQsIFtudWxsLCBfcmF3UGF0aF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHJldHJpZXZlIG1vZGlmaWNhdGlvbiB0aW1lIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChyZXNwb25zZSk7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfbGFzdE1vZGlmaWVkKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcmF3UGF0aCk7CgogIERhdGVUaW1lIGxhc3RNb2RpZmllZFN5bmMoKSB7CiAgICB2YXIgbXMgPSBfbGFzdE1vZGlmaWVkKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKG1zLCAiQ2Fubm90IHJldHJpZXZlIG1vZGlmaWNhdGlvbiB0aW1lIiwgcGF0aCk7CiAgICByZXR1cm4gbmV3IERhdGVUaW1lLmZyb21NaWxsaXNlY29uZHNTaW5jZUVwb2NoKG1zKTsKICB9CgogIEZ1dHVyZSBzZXRMYXN0TW9kaWZpZWQoRGF0ZVRpbWUgdGltZSkgewogICAgaW50IG1pbGxpcyA9IHRpbWUubWlsbGlzZWNvbmRzU2luY2VFcG9jaDsKICAgIHJldHVybiBfZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgICAgICBfSU9TZXJ2aWNlLmZpbGVTZXRMYXN0TW9kaWZpZWQsIFtudWxsLCBfcmF3UGF0aCwgbWlsbGlzXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZSgKICAgICAgICAgICAgcmVzcG9uc2UsICJDYW5ub3Qgc2V0IG1vZGlmaWNhdGlvbiB0aW1lIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICB9CgogIGV4dGVybmFsIHN0YXRpYyBfc2V0TGFzdE1vZGlmaWVkKAogICAgICBfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGludCBtaWxsaXMpOwoKICB2b2lkIHNldExhc3RNb2RpZmllZFN5bmMoRGF0ZVRpbWUgdGltZSkgewogICAgaW50IG1pbGxpcyA9IHRpbWUubWlsbGlzZWNvbmRzU2luY2VFcG9jaDsKICAgIHZhciByZXN1bHQgPSBfc2V0TGFzdE1vZGlmaWVkKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG1pbGxpcyk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oCiAgICAgICAgICAiRmFpbGVkIHRvIHNldCBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIGV4dGVybmFsIHN0YXRpYyBfb3BlbihfTmFtZXNwYWNlIG5hbWVzcGFjZSwgVWludDhMaXN0IHJhd1BhdGgsIGludCBtb2RlKTsKCiAgUmFuZG9tQWNjZXNzRmlsZSBvcGVuU3luYyh7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUucmVhZH0pIHsKICAgIGlmIChtb2RlICE9IEZpbGVNb2RlLnJlYWQgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS5hcHBlbmQgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlT25seSAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUud3JpdGVPbmx5QXBwZW5kKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIGZpbGUgbW9kZSBmb3IgdGhpcyBvcGVyYXRpb24nKTsKICAgIH0KICAgIHZhciBpZCA9IF9vcGVuKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgsIG1vZGUuX21vZGUpOwogICAgdGhyb3dJZkVycm9yKGlkLCAiQ2Fubm90IG9wZW4gZmlsZSIsIHBhdGgpOwogICAgcmV0dXJuIG5ldyBfUmFuZG9tQWNjZXNzRmlsZShpZCwgX3BhdGgpOwogIH0KCiAgZXh0ZXJuYWwgc3RhdGljIGludCBfb3BlblN0ZGlvKGludCBmZCk7CgogIHN0YXRpYyBSYW5kb21BY2Nlc3NGaWxlIF9vcGVuU3RkaW9TeW5jKGludCBmZCkgewogICAgdmFyIGlkID0gX29wZW5TdGRpbyhmZCk7CiAgICBpZiAoaWQgPT0gMCkgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiQ2Fubm90IG9wZW4gc3RkaW8gZmlsZSBmb3I6ICRmZCIpOwogICAgfQogICAgcmV0dXJuIG5ldyBfUmFuZG9tQWNjZXNzRmlsZShpZCwgIiIpOwogIH0KCiAgU3RyZWFtPExpc3Q8aW50Pj4gb3BlblJlYWQoW2ludCBzdGFydCwgaW50IGVuZF0pIHsKICAgIHJldHVybiBuZXcgX0ZpbGVTdHJlYW0ocGF0aCwgc3RhcnQsIGVuZCk7CiAgfQoKICBJT1Npbmsgb3BlbldyaXRlKHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwgRW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KSB7CiAgICBpZiAobW9kZSAhPSBGaWxlTW9kZS53cml0ZSAmJgogICAgICAgIG1vZGUgIT0gRmlsZU1vZGUuYXBwZW5kICYmCiAgICAgICAgbW9kZSAhPSBGaWxlTW9kZS53cml0ZU9ubHkgJiYKICAgICAgICBtb2RlICE9IEZpbGVNb2RlLndyaXRlT25seUFwcGVuZCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCBmaWxlIG1vZGUgZm9yIHRoaXMgb3BlcmF0aW9uJyk7CiAgICB9CiAgICB2YXIgY29uc3VtZXIgPSBuZXcgX0ZpbGVTdHJlYW1Db25zdW1lcih0aGlzLCBtb2RlKTsKICAgIHJldHVybiBuZXcgSU9TaW5rKGNvbnN1bWVyLCBlbmNvZGluZzogZW5jb2RpbmcpOwogIH0KCiAgRnV0dXJlPExpc3Q8aW50Pj4gcmVhZEFzQnl0ZXMoKSB7CiAgICBGdXR1cmU8TGlzdDxpbnQ+PiByZWFkRGF0YUNodW5rZWQoUmFuZG9tQWNjZXNzRmlsZSBmaWxlKSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ5dGVzQnVpbGRlcihjb3B5OiBmYWxzZSk7CiAgICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPExpc3Q8aW50Pj4oKTsKICAgICAgdm9pZCByZWFkKCkgewogICAgICAgIGZpbGUucmVhZChfYmxvY2tTaXplKS50aGVuKChkYXRhKSB7CiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkKGRhdGEpOwogICAgICAgICAgICByZWFkKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0ZXIuY29tcGxldGUoYnVpbGRlci50YWtlQnl0ZXMoKSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgb25FcnJvcjogY29tcGxldGVyLmNvbXBsZXRlRXJyb3IpOwogICAgICB9CgogICAgICByZWFkKCk7CiAgICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogICAgfQoKICAgIHJldHVybiBvcGVuKCkudGhlbigoZmlsZSkgewogICAgICByZXR1cm4gZmlsZS5sZW5ndGgoKS50aGVuKChsZW5ndGgpIHsKICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgICAgIC8vIE1heSBiZSBjaGFyYWN0ZXIgZGV2aWNlLCB0cnkgdG8gcmVhZCBpdCBpbiBjaHVua3MuCiAgICAgICAgICByZXR1cm4gcmVhZERhdGFDaHVua2VkKGZpbGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZS5yZWFkKGxlbmd0aCk7CiAgICAgIH0pLndoZW5Db21wbGV0ZShmaWxlLmNsb3NlKTsKICAgIH0pOwogIH0KCiAgTGlzdDxpbnQ+IHJlYWRBc0J5dGVzU3luYygpIHsKICAgIHZhciBvcGVuZWQgPSBvcGVuU3luYygpOwogICAgdHJ5IHsKICAgICAgTGlzdDxpbnQ+IGRhdGE7CiAgICAgIHZhciBsZW5ndGggPSBvcGVuZWQubGVuZ3RoU3luYygpOwogICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgICAvLyBNYXkgYmUgY2hhcmFjdGVyIGRldmljZSwgdHJ5IHRvIHJlYWQgaXQgaW4gY2h1bmtzLgogICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ5dGVzQnVpbGRlcihjb3B5OiBmYWxzZSk7CiAgICAgICAgZG8gewogICAgICAgICAgZGF0YSA9IG9wZW5lZC5yZWFkU3luYyhfYmxvY2tTaXplKTsKICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIGJ1aWxkZXIuYWRkKGRhdGEpOwogICAgICAgIH0gd2hpbGUgKGRhdGEubGVuZ3RoID4gMCk7CiAgICAgICAgZGF0YSA9IGJ1aWxkZXIudGFrZUJ5dGVzKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YSA9IG9wZW5lZC5yZWFkU3luYyhsZW5ndGgpOwogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfSBmaW5hbGx5IHsKICAgICAgb3BlbmVkLmNsb3NlU3luYygpOwogICAgfQogIH0KCiAgU3RyaW5nIF90cnlEZWNvZGUoTGlzdDxpbnQ+IGJ5dGVzLCBFbmNvZGluZyBlbmNvZGluZykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShieXRlcyk7CiAgICB9IGNhdGNoIChfKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKAogICAgICAgICAgIkZhaWxlZCB0byBkZWNvZGUgZGF0YSB1c2luZyBlbmNvZGluZyAnJHtlbmNvZGluZy5uYW1lfSciLCBwYXRoKTsKICAgIH0KICB9CgogIEZ1dHVyZTxTdHJpbmc+IHJlYWRBc1N0cmluZyh7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KSB7CiAgICAvLyBUT0RPKGRhcnQ6aW8pOiBJZiB0aGUgY2hhbmdlIGluIGFzeW5jIHNlbWFudGljcyB0byBydW4gc3luY2hyb25vdXNseQogICAgLy8gdW50aWwgYXdhaXQgbGFuZHMsIHRoaXMgaXMgYXMgZWZmaWNpZW50IGFzCiAgICAvLyByZXR1cm4gX3RyeURlY29kZShhd2FpdCByZWFkQXNCeXRlcygpLCBlbmNvZGluZyk7CiAgICB2YXIgc3RhY2sgPSBTdGFja1RyYWNlLmN1cnJlbnQ7CiAgICByZXR1cm4gcmVhZEFzQnl0ZXMoKS50aGVuKChieXRlcykgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBfdHJ5RGVjb2RlKGJ5dGVzLCBlbmNvZGluZyk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcihlLCBzdGFjayk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgU3RyaW5nIHJlYWRBc1N0cmluZ1N5bmMoe0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgPT4KICAgICAgX3RyeURlY29kZShyZWFkQXNCeXRlc1N5bmMoKSwgZW5jb2RpbmcpOwoKICBGdXR1cmU8TGlzdDxTdHJpbmc+PiByZWFkQXNMaW5lcyh7RW5jb2RpbmcgZW5jb2Rpbmc6IHV0Zjh9KSA9PgogICAgICByZWFkQXNTdHJpbmcoZW5jb2Rpbmc6IGVuY29kaW5nKS50aGVuKGNvbnN0IExpbmVTcGxpdHRlcigpLmNvbnZlcnQpOwoKICBMaXN0PFN0cmluZz4gcmVhZEFzTGluZXNTeW5jKHtFbmNvZGluZyBlbmNvZGluZzogdXRmOH0pID0+CiAgICAgIGNvbnN0IExpbmVTcGxpdHRlcigpLmNvbnZlcnQocmVhZEFzU3RyaW5nU3luYyhlbmNvZGluZzogZW5jb2RpbmcpKTsKCiAgRnV0dXJlPEZpbGU+IHdyaXRlQXNCeXRlcyhMaXN0PGludD4gYnl0ZXMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwgYm9vbCBmbHVzaDogZmFsc2V9KSB7CiAgICByZXR1cm4gb3Blbihtb2RlOiBtb2RlKS50aGVuKChmaWxlKSB7CiAgICAgIHJldHVybiBmaWxlLndyaXRlRnJvbShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKS50aGVuPEZpbGU+KChfKSB7CiAgICAgICAgaWYgKGZsdXNoKSByZXR1cm4gZmlsZS5mbHVzaCgpLnRoZW4oKF8pID0+IHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9KS53aGVuQ29tcGxldGUoZmlsZS5jbG9zZSk7CiAgICB9KTsKICB9CgogIHZvaWQgd3JpdGVBc0J5dGVzU3luYyhMaXN0PGludD4gYnl0ZXMsCiAgICAgIHtGaWxlTW9kZSBtb2RlOiBGaWxlTW9kZS53cml0ZSwgYm9vbCBmbHVzaDogZmFsc2V9KSB7CiAgICBSYW5kb21BY2Nlc3NGaWxlIG9wZW5lZCA9IG9wZW5TeW5jKG1vZGU6IG1vZGUpOwogICAgdHJ5IHsKICAgICAgb3BlbmVkLndyaXRlRnJvbVN5bmMoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAgICAgIGlmIChmbHVzaCkgb3BlbmVkLmZsdXNoU3luYygpOwogICAgfSBmaW5hbGx5IHsKICAgICAgb3BlbmVkLmNsb3NlU3luYygpOwogICAgfQogIH0KCiAgRnV0dXJlPEZpbGU+IHdyaXRlQXNTdHJpbmcoU3RyaW5nIGNvbnRlbnRzLAogICAgICB7RmlsZU1vZGUgbW9kZTogRmlsZU1vZGUud3JpdGUsCiAgICAgIEVuY29kaW5nIGVuY29kaW5nOiB1dGY4LAogICAgICBib29sIGZsdXNoOiBmYWxzZX0pIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiB3cml0ZUFzQnl0ZXMoZW5jb2RpbmcuZW5jb2RlKGNvbnRlbnRzKSwgbW9kZTogbW9kZSwgZmx1c2g6IGZsdXNoKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IoZSk7CiAgICB9CiAgfQoKICB2b2lkIHdyaXRlQXNTdHJpbmdTeW5jKFN0cmluZyBjb250ZW50cywKICAgICAge0ZpbGVNb2RlIG1vZGU6IEZpbGVNb2RlLndyaXRlLAogICAgICBFbmNvZGluZyBlbmNvZGluZzogdXRmOCwKICAgICAgYm9vbCBmbHVzaDogZmFsc2V9KSB7CiAgICB3cml0ZUFzQnl0ZXNTeW5jKGVuY29kaW5nLmVuY29kZShjb250ZW50cyksIG1vZGU6IG1vZGUsIGZsdXNoOiBmbHVzaCk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiRmlsZTogJyRwYXRoJyI7CgogIHN0YXRpYyB0aHJvd0lmRXJyb3IoT2JqZWN0IHJlc3VsdCwgU3RyaW5nIG1zZywgU3RyaW5nIHBhdGgpIHsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbihtc2csIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQp9CgphYnN0cmFjdCBjbGFzcyBfUmFuZG9tQWNjZXNzRmlsZU9wcyB7CiAgZXh0ZXJuYWwgZmFjdG9yeSBfUmFuZG9tQWNjZXNzRmlsZU9wcyhpbnQgcG9pbnRlcik7CgogIGludCBnZXRQb2ludGVyKCk7CiAgaW50IGNsb3NlKCk7CiAgcmVhZEJ5dGUoKTsKICByZWFkKGludCBieXRlcyk7CiAgcmVhZEludG8oTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgZW5kKTsKICB3cml0ZUJ5dGUoaW50IHZhbHVlKTsKICB3cml0ZUZyb20oTGlzdDxpbnQ+IGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgZW5kKTsKICBwb3NpdGlvbigpOwogIHNldFBvc2l0aW9uKGludCBwb3NpdGlvbik7CiAgdHJ1bmNhdGUoaW50IGxlbmd0aCk7CiAgbGVuZ3RoKCk7CiAgZmx1c2goKTsKICBsb2NrKGludCBsb2NrLCBpbnQgc3RhcnQsIGludCBlbmQpOwp9CgpjbGFzcyBfUmFuZG9tQWNjZXNzRmlsZSBpbXBsZW1lbnRzIFJhbmRvbUFjY2Vzc0ZpbGUgewogIHN0YXRpYyBib29sIF9jb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIgPSBmYWxzZTsKCiAgZmluYWwgU3RyaW5nIHBhdGg7CgogIGJvb2wgX2FzeW5jRGlzcGF0Y2hlZCA9IGZhbHNlOwogIFNlbmRQb3J0IF9maWxlU2VydmljZTsKCiAgX0ZpbGVSZXNvdXJjZUluZm8gX3Jlc291cmNlSW5mbzsKICBfUmFuZG9tQWNjZXNzRmlsZU9wcyBfb3BzOwoKICBfUmFuZG9tQWNjZXNzRmlsZShpbnQgcG9pbnRlciwgdGhpcy5wYXRoKSB7CiAgICBfb3BzID0gbmV3IF9SYW5kb21BY2Nlc3NGaWxlT3BzKHBvaW50ZXIpOwogICAgX3Jlc291cmNlSW5mbyA9IG5ldyBfRmlsZVJlc291cmNlSW5mbyh0aGlzKTsKICAgIF9tYXliZUNvbm5lY3RIYW5kbGVyKCk7CiAgfQoKICB2b2lkIF9tYXliZVBlcmZvcm1DbGVhbnVwKCkgewogICAgaWYgKGNsb3NlZCkgewogICAgICBfRmlsZVJlc291cmNlSW5mby5GaWxlQ2xvc2VkKF9yZXNvdXJjZUluZm8pOwogICAgfQogIH0KCiAgX21heWJlQ29ubmVjdEhhbmRsZXIoKSB7CiAgICBpZiAoIV9jb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIpIHsKICAgICAgLy8gVE9ETyhyaWNvdyk6IFdlIHByb2JhYmx5IG5lZWQgdG8gc2V0IHRoZXNlIGluIHNvbWUgaW5pdGlhbGl6YXRpb24gY29kZS4KICAgICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVzZSBhcmUgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIHRoZQogICAgICAvLyBvYnNlcnZhdG9yeSBldmVuIGlmIG5vIGZpbGVzIChvciBzb2NrZXRzIGZvciB0aGUgc29ja2V0IG9uZXMpIGFyZQogICAgICAvLyBvcGVuLgogICAgICByZWdpc3RlckV4dGVuc2lvbigKICAgICAgICAgICdleHQuZGFydC5pby5nZXRPcGVuRmlsZXMnLCBfRmlsZVJlc291cmNlSW5mby5nZXRPcGVuRmlsZXMpOwogICAgICByZWdpc3RlckV4dGVuc2lvbigKICAgICAgICAgICdleHQuZGFydC5pby5nZXRGaWxlQnlJRCcsIF9GaWxlUmVzb3VyY2VJbmZvLmdldEZpbGVJbmZvTWFwQnlJRCk7CiAgICAgIF9jb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXIgPSB0cnVlOwogICAgfQogIH0KCiAgRnV0dXJlPHZvaWQ+IGNsb3NlKCkgewogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVDbG9zZSwgW251bGxdLCBtYXJrQ2xvc2VkOiB0cnVlKQogICAgICAgIC50aGVuKChyZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewogICAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJDYW5ub3QgY2xvc2UgZmlsZSIsIHBhdGgpOwogICAgICB9CiAgICAgIGNsb3NlZCA9IGNsb3NlZCB8fCAocmVzdWx0ID09IDApOwogICAgICBfbWF5YmVQZXJmb3JtQ2xlYW51cCgpOwogICAgfSk7CiAgfQoKICB2b2lkIGNsb3NlU3luYygpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgdmFyIGlkID0gX29wcy5jbG9zZSgpOwogICAgaWYgKGlkID09IC0xKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJDYW5ub3QgY2xvc2UgZmlsZSIsIHBhdGgpOwogICAgfQogICAgY2xvc2VkID0gY2xvc2VkIHx8IChpZCA9PSAwKTsKICAgIF9tYXliZVBlcmZvcm1DbGVhbnVwKCk7CiAgfQoKICBGdXR1cmU8aW50PiByZWFkQnl0ZSgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlUmVhZEJ5dGUsIFtudWxsXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgInJlYWRCeXRlIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIF9yZXNvdXJjZUluZm8uYWRkUmVhZCgxKTsKICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICBpbnQgcmVhZEJ5dGVTeW5jKCkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICB2YXIgcmVzdWx0ID0gX29wcy5yZWFkQnl0ZSgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJyZWFkQnl0ZSBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRSZWFkKDEpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxMaXN0PGludD4+IHJlYWQoaW50IGJ5dGVzKSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChieXRlcywgJ2J5dGVzJyk7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVJlYWQsIFtudWxsLCBieXRlc10pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJyZWFkIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIF9yZXNvdXJjZUluZm8uYWRkUmVhZChyZXNwb25zZVsxXS5sZW5ndGgpOwogICAgICBMaXN0PGludD4gcmVzdWx0ID0gcmVzcG9uc2VbMV07CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KTsKICB9CgogIExpc3Q8aW50PiByZWFkU3luYyhpbnQgYnl0ZXMpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoYnl0ZXMsICdieXRlcycpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMucmVhZChieXRlcyk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oInJlYWRTeW5jIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICBfcmVzb3VyY2VJbmZvLmFkZFJlYWQocmVzdWx0Lmxlbmd0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPGludD4gcmVhZEludG8oTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBpZiAoKGJ1ZmZlciBpcyEgTGlzdCkgfHwKICAgICAgICAoKHN0YXJ0ICE9IG51bGwpICYmIChzdGFydCBpcyEgaW50KSkgfHwKICAgICAgICAoKGVuZCAhPSBudWxsKSAmJiAoZW5kIGlzISBpbnQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKDApOwogICAgfQogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVSZWFkSW50bywgW251bGwsIGxlbmd0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJyZWFkSW50byBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBpbnQgcmVhZCA9IHJlc3BvbnNlWzFdOwogICAgICBMaXN0PGludD4gZGF0YSA9IHJlc3BvbnNlWzJdOwogICAgICBidWZmZXIuc2V0UmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgcmVhZCwgZGF0YSk7CiAgICAgIF9yZXNvdXJjZUluZm8uYWRkUmVhZChyZWFkKTsKICAgICAgcmV0dXJuIHJlYWQ7CiAgICB9KTsKICB9CgogIGludCByZWFkSW50b1N5bmMoTGlzdDxpbnQ+IGJ1ZmZlciwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIGlmICgoYnVmZmVyIGlzISBMaXN0KSB8fAogICAgICAgICgoc3RhcnQgIT0gbnVsbCkgJiYgKHN0YXJ0IGlzISBpbnQpKSB8fAogICAgICAgICgoZW5kICE9IG51bGwpICYmIChlbmQgaXMhIGludCkpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBidWZmZXIubGVuZ3RoKTsKICAgIGlmIChlbmQgPT0gc3RhcnQpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX29wcy5yZWFkSW50byhidWZmZXIsIHN0YXJ0LCBlbmQpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJyZWFkSW50byBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgX3Jlc291cmNlSW5mby5hZGRSZWFkKHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHdyaXRlQnl0ZShpbnQgdmFsdWUpIHsKICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHZhbHVlLCAndmFsdWUnKTsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlV3JpdGVCeXRlLCBbbnVsbCwgdmFsdWVdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAid3JpdGVCeXRlIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIF9yZXNvdXJjZUluZm8uYWRkV3JpdGUoMSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICBpbnQgd3JpdGVCeXRlU3luYyhpbnQgdmFsdWUpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwodmFsdWUsICd2YWx1ZScpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMud3JpdGVCeXRlKHZhbHVlKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigid3JpdGVCeXRlIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICBfcmVzb3VyY2VJbmZvLmFkZFdyaXRlKDEpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB3cml0ZUZyb20oTGlzdDxpbnQ+IGJ1ZmZlciwKICAgICAgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBpZiAoKGJ1ZmZlciBpcyEgTGlzdCkgfHwKICAgICAgICAoKHN0YXJ0ICE9IG51bGwpICYmIChzdGFydCBpcyEgaW50KSkgfHwKICAgICAgICAoKGVuZCAhPSBudWxsKSAmJiAoZW5kIGlzISBpbnQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgdG8gd3JpdGVGcm9tIik7CiAgICB9CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBidWZmZXIubGVuZ3RoKTsKICAgIGlmIChlbmQgPT0gc3RhcnQpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUodGhpcyk7CiAgICB9CiAgICBfQnVmZmVyQW5kU3RhcnQgcmVzdWx0OwogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YShidWZmZXIsIHN0YXJ0LCBlbmQpOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gbmV3IEZ1dHVyZS5lcnJvcihlKTsKICAgIH0KCiAgICBMaXN0IHJlcXVlc3QgPSBuZXcgTGlzdCg0KTsKICAgIHJlcXVlc3RbMF0gPSBudWxsOwogICAgcmVxdWVzdFsxXSA9IHJlc3VsdC5idWZmZXI7CiAgICByZXF1ZXN0WzJdID0gcmVzdWx0LnN0YXJ0OwogICAgcmVxdWVzdFszXSA9IGVuZCAtIChzdGFydCAtIHJlc3VsdC5zdGFydCk7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVdyaXRlRnJvbSwgcmVxdWVzdCkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIndyaXRlRnJvbSBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICBfcmVzb3VyY2VJbmZvLmFkZFdyaXRlKGVuZCAtIChzdGFydCAtIHJlc3VsdC5zdGFydCkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCB3cml0ZUZyb21TeW5jKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgX2NoZWNrQXZhaWxhYmxlKCk7CiAgICBpZiAoKGJ1ZmZlciBpcyEgTGlzdCkgfHwKICAgICAgICAoKHN0YXJ0ICE9IG51bGwpICYmIChzdGFydCBpcyEgaW50KSkgfHwKICAgICAgICAoKGVuZCAhPSBudWxsKSAmJiAoZW5kIGlzISBpbnQpKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCBhcmd1bWVudHMgdG8gd3JpdGVGcm9tU3luYyIpOwogICAgfQogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgYnVmZmVyLmxlbmd0aCk7CiAgICBpZiAoZW5kID09IHN0YXJ0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9CdWZmZXJBbmRTdGFydCBidWZmZXJBbmRTdGFydCA9CiAgICAgICAgX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YShidWZmZXIsIHN0YXJ0LCBlbmQpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMud3JpdGVGcm9tKGJ1ZmZlckFuZFN0YXJ0LmJ1ZmZlciwgYnVmZmVyQW5kU3RhcnQuc3RhcnQsCiAgICAgICAgZW5kIC0gKHN0YXJ0IC0gYnVmZmVyQW5kU3RhcnQuc3RhcnQpKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigid3JpdGVGcm9tIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICBfcmVzb3VyY2VJbmZvLmFkZFdyaXRlKGVuZCAtIChzdGFydCAtIGJ1ZmZlckFuZFN0YXJ0LnN0YXJ0KSk7CiAgfQoKICBGdXR1cmU8UmFuZG9tQWNjZXNzRmlsZT4gd3JpdGVTdHJpbmcoU3RyaW5nIHN0cmluZywKICAgICAge0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZW5jb2RpbmcsICdlbmNvZGluZycpOwogICAgdmFyIGRhdGEgPSBlbmNvZGluZy5lbmNvZGUoc3RyaW5nKTsKICAgIHJldHVybiB3cml0ZUZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogIH0KCiAgdm9pZCB3cml0ZVN0cmluZ1N5bmMoU3RyaW5nIHN0cmluZywge0VuY29kaW5nIGVuY29kaW5nOiB1dGY4fSkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoZW5jb2RpbmcsICdlbmNvZGluZycpOwogICAgdmFyIGRhdGEgPSBlbmNvZGluZy5lbmNvZGUoc3RyaW5nKTsKICAgIHdyaXRlRnJvbVN5bmMoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogIH0KCiAgRnV0dXJlPGludD4gcG9zaXRpb24oKSB7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZVBvc2l0aW9uLCBbbnVsbF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJwb3NpdGlvbiBmYWlsZWQiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9KTsKICB9CgogIGludCBwb3NpdGlvblN5bmMoKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIHZhciByZXN1bHQgPSBfb3BzLnBvc2l0aW9uKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oInBvc2l0aW9uIGZhaWxlZCIsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHNldFBvc2l0aW9uKGludCBwb3NpdGlvbikgewogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVTZXRQb3NpdGlvbiwgW251bGwsIHBvc2l0aW9uXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgInNldFBvc2l0aW9uIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIHNldFBvc2l0aW9uU3luYyhpbnQgcG9zaXRpb24pIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMuc2V0UG9zaXRpb24ocG9zaXRpb24pOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXhjZXB0aW9uKCJzZXRQb3NpdGlvbiBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgRnV0dXJlPFJhbmRvbUFjY2Vzc0ZpbGU+IHRydW5jYXRlKGludCBsZW5ndGgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlVHJ1bmNhdGUsIFtudWxsLCBsZW5ndGhdKS50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICB0aHJvdyBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCAidHJ1bmNhdGUgZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgdHJ1bmNhdGVTeW5jKGludCBsZW5ndGgpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMudHJ1bmNhdGUobGVuZ3RoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigidHJ1bmNhdGUgZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIEZ1dHVyZTxpbnQ+IGxlbmd0aCgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlTGVuZ3RoLCBbbnVsbF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJsZW5ndGggZmFpbGVkIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICBpbnQgbGVuZ3RoU3luYygpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMubGVuZ3RoKCk7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24oImxlbmd0aCBmYWlsZWQiLCBwYXRoLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBmbHVzaCgpIHsKICAgIHJldHVybiBfZGlzcGF0Y2goX0lPU2VydmljZS5maWxlRmx1c2gsIFtudWxsXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgImZsdXNoIGZhaWxlZCIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIGZsdXNoU3luYygpIHsKICAgIF9jaGVja0F2YWlsYWJsZSgpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMuZmx1c2goKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigiZmx1c2ggZmFpbGVkIiwgcGF0aCwgcmVzdWx0KTsKICAgIH0KICB9CgogIHN0YXRpYyBjb25zdCBpbnQgbG9ja1VubG9jayA9IDA7CiAgLy8gc3RhdGljIGNvbnN0IGludCBsb2NrU2hhcmVkID0gMTsKICAvLyBzdGF0aWMgY29uc3QgaW50IGxvY2tFeGNsdXNpdmUgPSAyOwogIC8vIHN0YXRpYyBjb25zdCBpbnQgbG9ja0Jsb2NraW5nU2hhcmVkID0gMzsKICAvLyBzdGF0aWMgY29uc3QgaW50IGxvY2tCbG9ja2luZ0V4Y2x1c2l2ZSA9IDQ7CgogIGludCBfZmlsZUxvY2tWYWx1ZShGaWxlTG9jayBmbCkgPT4gZmwuX3R5cGU7CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiBsb2NrKAogICAgICBbRmlsZUxvY2sgbW9kZSA9IEZpbGVMb2NrLmV4Y2x1c2l2ZSwgaW50IHN0YXJ0ID0gMCwgaW50IGVuZCA9IC0xXSkgewogICAgaWYgKChtb2RlIGlzISBGaWxlTG9jaykgfHwgKHN0YXJ0IGlzISBpbnQpIHx8IChlbmQgaXMhIGludCkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoZW5kIDwgLTEpIHx8ICgoZW5kICE9IC0xKSAmJiAoc3RhcnQgPj0gZW5kKSkpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgIH0KICAgIGludCBsb2NrID0gX2ZpbGVMb2NrVmFsdWUobW9kZSk7CiAgICByZXR1cm4gX2Rpc3BhdGNoKF9JT1NlcnZpY2UuZmlsZUxvY2ssIFtudWxsLCBsb2NrLCBzdGFydCwgZW5kXSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgJ2xvY2sgZmFpbGVkJywgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIEZ1dHVyZTxSYW5kb21BY2Nlc3NGaWxlPiB1bmxvY2soW2ludCBzdGFydCA9IDAsIGludCBlbmQgPSAtMV0pIHsKICAgIGlmICgoc3RhcnQgaXMhIGludCkgfHwgKGVuZCBpcyEgaW50KSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgcmV0dXJuIF9kaXNwYXRjaChfSU9TZXJ2aWNlLmZpbGVMb2NrLCBbbnVsbCwgbG9ja1VubG9jaywgc3RhcnQsIGVuZF0pCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICd1bmxvY2sgZmFpbGVkJywgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICB9CgogIHZvaWQgbG9ja1N5bmMoCiAgICAgIFtGaWxlTG9jayBtb2RlID0gRmlsZUxvY2suZXhjbHVzaXZlLCBpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIGlmICgobW9kZSBpcyEgRmlsZUxvY2spIHx8IChzdGFydCBpcyEgaW50KSB8fCAoZW5kIGlzISBpbnQpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICBpZiAoKHN0YXJ0IDwgMCkgfHwgKGVuZCA8IC0xKSB8fCAoKGVuZCAhPSAtMSkgJiYgKHN0YXJ0ID49IGVuZCkpKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCk7CiAgICB9CiAgICBpbnQgbG9jayA9IF9maWxlTG9ja1ZhbHVlKG1vZGUpOwogICAgdmFyIHJlc3VsdCA9IF9vcHMubG9jayhsb2NrLCBzdGFydCwgZW5kKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbignbG9jayBmYWlsZWQnLCBwYXRoLCByZXN1bHQpOwogICAgfQogIH0KCiAgdm9pZCB1bmxvY2tTeW5jKFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kID0gLTFdKSB7CiAgICBfY2hlY2tBdmFpbGFibGUoKTsKICAgIGlmICgoc3RhcnQgaXMhIGludCkgfHwgKGVuZCBpcyEgaW50KSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9vcHMubG9jayhsb2NrVW5sb2NrLCBzdGFydCwgZW5kKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbigndW5sb2NrIGZhaWxlZCcsIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBib29sIGNsb3NlZCA9IGZhbHNlOwoKICAvLyBXQVJOSU5HOgogIC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIG5hdGl2ZQogIC8vIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIGZpbGUgb3BlcmF0aW9ucy4gSXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHRvCiAgLy8gcGFzcyB0aGUgcG9pbnRlciB0byB0aGUgSU8gU2VydmljZSwgd2hpY2ggd2lsbCBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZQogIC8vIGNvdW50IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdC4KICBpbnQgX3BvaW50ZXIoKSA9PiBfb3BzLmdldFBvaW50ZXIoKTsKCiAgRnV0dXJlIF9kaXNwYXRjaChpbnQgcmVxdWVzdCwgTGlzdCBkYXRhLCB7Ym9vbCBtYXJrQ2xvc2VkOiBmYWxzZX0pIHsKICAgIGlmIChjbG9zZWQpIHsKICAgICAgcmV0dXJuIG5ldyBGdXR1cmUuZXJyb3IobmV3IEZp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EUsXQyEGSCEGJS4dQgYEATMXLCEGGCEGNB1EBgQBFwEOS01MKCcBRxJNBhw7QwYWUBgVBh0aQSAIBAEbHCU8BhI6BgQCARZkYXJ0OmlvL2ZpbGVfaW1wbC5kYXJ0Nm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9maWxlX3N5c3RlbV9lbnRpdHkuZGFydMAAieovLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIFRoZSB0eXBlIG9mIGFuIGVudGl0eSBvbiB0aGUgZmlsZSBzeXN0ZW0sIHN1Y2ggYXMgYSBmaWxlLCBkaXJlY3RvcnksIG9yIGxpbmsuCiAqCiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCBieSB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGNsYXNzCiAqIHRvIGluZGljYXRlIHRoZSBvYmplY3QncyB0eXBlLgogKgogKi8KCmNsYXNzIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIHsKICBzdGF0aWMgY29uc3QgZmlsZSA9IGNvbnN0IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9pbnRlcm5hbCgwKTsKICBARGVwcmVjYXRlZCgiVXNlIGZpbGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEZJTEUgPSBmaWxlOwoKICBzdGF0aWMgY29uc3QgZGlyZWN0b3J5ID0gY29uc3QgRmlsZVN5c3RlbUVudGl0eVR5cGUuX2ludGVybmFsKDEpOwogIEBEZXByZWNhdGVkKCJVc2UgZGlyZWN0b3J5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBESVJFQ1RPUlkgPSBkaXJlY3Rvcnk7CgogIHN0YXRpYyBjb25zdCBsaW5rID0gY29uc3QgRmlsZVN5c3RlbUVudGl0eVR5cGUuX2ludGVybmFsKDIpOwogIEBEZXByZWNhdGVkKCJVc2UgbGluayBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgTElOSyA9IGxpbms7CgogIHN0YXRpYyBjb25zdCBub3RGb3VuZCA9IGNvbnN0IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9pbnRlcm5hbCgzKTsKICBARGVwcmVjYXRlZCgiVXNlIG5vdEZvdW5kIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBOT1RfRk9VTkQgPSBub3RGb3VuZDsKCiAgc3RhdGljIGNvbnN0IF90eXBlTGlzdCA9IGNvbnN0IFsKICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmZpbGUsCiAgICBGaWxlU3lzdGVtRW50aXR5VHlwZS5kaXJlY3RvcnksCiAgICBGaWxlU3lzdGVtRW50aXR5VHlwZS5saW5rLAogICAgRmlsZVN5c3RlbUVudGl0eVR5cGUubm90Rm91bmQsCiAgXTsKICBmaW5hbCBpbnQgX3R5cGU7CgogIGNvbnN0IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9pbnRlcm5hbCh0aGlzLl90eXBlKTsKCiAgc3RhdGljIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIF9sb29rdXAoaW50IHR5cGUpID0+IF90eXBlTGlzdFt0eXBlXTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBjb25zdCBbJ2ZpbGUnLCAnZGlyZWN0b3J5JywgJ2xpbmsnLCAnbm90Rm91bmQnXVtfdHlwZV07Cn0KCi8qKgogKiBBIEZpbGVTdGF0IG9iamVjdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgUE9TSVggc3RhdCgpIGZ1bmN0aW9uCiAqIG9uIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LiAgSXQgaXMgYW4gaW1tdXRhYmxlIG9iamVjdCwgcmVwcmVzZW50aW5nIHRoZQogKiBzbmFwc2hvdHRlZCB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIHN0YXQoKSBjYWxsLgogKi8KY2xhc3MgRmlsZVN0YXQgewogIC8vIFRoZXNlIG11c3QgYWdyZWUgd2l0aCBlbnVtIEZpbGVTdGF0IGluIGZpbGUuaC4KICBzdGF0aWMgY29uc3QgX3R5cGUgPSAwOwogIHN0YXRpYyBjb25zdCBfY2hhbmdlZFRpbWUgPSAxOwogIHN0YXRpYyBjb25zdCBfbW9kaWZpZWRUaW1lID0gMjsKICBzdGF0aWMgY29uc3QgX2FjY2Vzc2VkVGltZSA9IDM7CiAgc3RhdGljIGNvbnN0IF9tb2RlID0gNDsKICBzdGF0aWMgY29uc3QgX3NpemUgPSA1OwoKICBzdGF0aWMgY29uc3QgX25vdEZvdW5kID0gY29uc3QgRmlsZVN0YXQuX2ludGVybmFsTm90Rm91bmQoKTsKCiAgLyoqCiAgICogVGhlIHRpbWUgb2YgdGhlIGxhc3QgY2hhbmdlIHRvIHRoZSBkYXRhIG9yIG1ldGFkYXRhIG9mIHRoZSBmaWxlIHN5c3RlbQogICAqIG9iamVjdC4KICAgKgogICAqIE9uIFdpbmRvd3MgcGxhdGZvcm1zLCB0aGlzIGlzIGluc3RlYWQgdGhlIGZpbGUgY3JlYXRpb24gdGltZS4KICAgKi8KICBmaW5hbCBEYXRlVGltZSBjaGFuZ2VkOwoKICAvKioKICAgKiBUaGUgdGltZSBvZiB0aGUgbGFzdCBjaGFuZ2UgdG8gdGhlIGRhdGEgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdC4KICAgKi8KICBmaW5hbCBEYXRlVGltZSBtb2RpZmllZDsKCiAgLyoqCiAgICogVGhlIHRpbWUgb2YgdGhlIGxhc3QgYWNjZXNzIHRvIHRoZSBkYXRhIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICoKICAgKiBPbiBXaW5kb3dzIHBsYXRmb3JtcywgdGhpcyBtYXkgaGF2ZSAxIGRheSBncmFudWxhcml0eSwgYW5kIGJlCiAgICogb3V0IG9mIGRhdGUgYnkgYW4gaG91ci4KICAgKi8KICBmaW5hbCBEYXRlVGltZSBhY2Nlc3NlZDsKCiAgLyoqCiAgICogVGhlIHR5cGUgb2YgdGhlIG9iamVjdCAoZmlsZSwgZGlyZWN0b3J5LCBvciBsaW5rKS4KICAgKgogICAqIElmIHRoZSBjYWxsIHRvIHN0YXQoKSBmYWlscywgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3RGb3VuZC4KICAgKi8KICBmaW5hbCBGaWxlU3lzdGVtRW50aXR5VHlwZSB0eXBlOwoKICAvKioKICAgKiBUaGUgbW9kZSBvZiB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogICAqCiAgICogUGVybWlzc2lvbnMgYXJlIGVuY29kZWQgaW4gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhpcyBudW1iZXIsIGFuZCBjYW4gYmUKICAgKiBkZWNvZGVkIHVzaW5nIHRoZSBbbW9kZVN0cmluZ10gZ2V0dGVyLgogICAqLwogIGZpbmFsIGludCBtb2RlOwoKICAvKioKICAgKiBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogICAqLwogIGZpbmFsIGludCBzaXplOwoKICBGaWxlU3RhdC5faW50ZXJuYWwodGhpcy5jaGFuZ2VkLCB0aGlzLm1vZGlmaWVkLCB0aGlzLmFjY2Vzc2VkLCB0aGlzLnR5cGUsCiAgICAgIHRoaXMubW9kZSwgdGhpcy5zaXplKTsKCiAgY29uc3QgRmlsZVN0YXQuX2ludGVybmFsTm90Rm91bmQoKQogICAgICA6IGNoYW5nZWQgPSBudWxsLAogICAgICAgIG1vZGlmaWVkID0gbnVsbCwKICAgICAgICBhY2Nlc3NlZCA9IG51bGwsCiAgICAgICAgdHlwZSA9IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLm5vdEZvdW5kLAogICAgICAgIG1vZGUgPSAwLAogICAgICAgIHNpemUgPSAtMTsKCiAgZXh0ZXJuYWwgc3RhdGljIF9zdGF0U3luYyhfTmFtZXNwYWNlIG5hbWVzcGFjZSwgU3RyaW5nIHBhdGgpOwoKICAvKioKICAgKiBDYWxscyB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIHN0YXQoKSBmdW5jdGlvbiBvbiBbcGF0aF0uCiAgICoKICAgKiBSZXR1cm5zIGEgW0ZpbGVTdGF0XSBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSByZXR1cm5lZCBieSBzdGF0KCkuCiAgICogSWYgdGhlIGNhbGwgZmFpbHMsIHJldHVybnMgYSBbRmlsZVN0YXRdIG9iamVjdCB3aXRoIC50eXBlIHNldCB0bwogICAqIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLm5vdEZvdW5kIGFuZCB0aGUgb3RoZXIgZmllbGRzIGludmFsaWQuCiAgICovCiAgc3RhdGljIEZpbGVTdGF0IHN0YXRTeW5jKFN0cmluZyBwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfc3RhdFN5bmNJbnRlcm5hbChwYXRoKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuc3RhdFN5bmMocGF0aCk7CiAgfQoKICBzdGF0aWMgRmlsZVN0YXQgX3N0YXRTeW5jSW50ZXJuYWwoU3RyaW5nIHBhdGgpIHsKICAgIC8vIFRyYWlsaW5nIHBhdGggaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLgogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICBwYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdHJpbVRyYWlsaW5nUGF0aFNlcGFyYXRvcnMocGF0aCk7CiAgICB9CiAgICB2YXIgZGF0YSA9IF9zdGF0U3luYyhfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIHBhdGgpOwogICAgaWYgKGRhdGEgaXMgT1NFcnJvcikgcmV0dXJuIEZpbGVTdGF0Ll9ub3RGb3VuZDsKICAgIHJldHVybiBuZXcgRmlsZVN0YXQuX2ludGVybmFsKAogICAgICAgIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChkYXRhW19jaGFuZ2VkVGltZV0pLAogICAgICAgIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChkYXRhW19tb2RpZmllZFRpbWVdKSwKICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfYWNjZXNzZWRUaW1lXSksCiAgICAgICAgRmlsZVN5c3RlbUVudGl0eVR5cGUuX2xvb2t1cChkYXRhW190eXBlXSksCiAgICAgICAgZGF0YVtfbW9kZV0sCiAgICAgICAgZGF0YVtfc2l6ZV0pOwogIH0KCiAgLyoqCiAgICogQXN5bmNocm9ub3VzbHkgY2FsbHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBzdGF0KCkgZnVuY3Rpb24gb24gW3BhdGhdLgogICAqCiAgICogUmV0dXJucyBhIEZ1dHVyZSB3aGljaCBjb21wbGV0ZXMgd2l0aCBhIFtGaWxlU3RhdF0gb2JqZWN0IGNvbnRhaW5pbmcKICAgKiB0aGUgZGF0YSByZXR1cm5lZCBieSBzdGF0KCkuIElmIHRoZSBjYWxsIGZhaWxzLCBjb21wbGV0ZXMgdGhlIGZ1dHVyZSB3aXRoIGEKICAgKiBbRmlsZVN0YXRdIG9iamVjdCB3aXRoIGAudHlwZWAgc2V0IHRvIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLm5vdEZvdW5kIGFuZAogICAqIHRoZSBvdGhlciBmaWVsZHMgaW52YWxpZC4KICAgKi8KICBzdGF0aWMgRnV0dXJlPEZpbGVTdGF0PiBzdGF0KFN0cmluZyBwYXRoKSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfc3RhdChwYXRoKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuc3RhdChwYXRoKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8RmlsZVN0YXQ+IF9zdGF0KFN0cmluZyBwYXRoKSB7CiAgICAvLyBUcmFpbGluZyBwYXRoIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4KICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgcGF0aCA9IEZpbGVTeXN0ZW1FbnRpdHkuX3RyaW1UcmFpbGluZ1BhdGhTZXBhcmF0b3JzKHBhdGgpOwogICAgfQogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoX0lPU2VydmljZS5maWxlU3RhdCwgW251bGwsIHBhdGhdKQogICAgICAgIC50aGVuKChyZXNwb25zZSkgewogICAgICBpZiAoX2lzRXJyb3JSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICByZXR1cm4gRmlsZVN0YXQuX25vdEZvdW5kOwogICAgICB9CiAgICAgIC8vIFVud3JhcCB0aGUgcmVhbCBsaXN0IGZyb20gdGhlICJJJ20gbm90IGFuIGVycm9yIiB3cmFwcGVyLgogICAgICBMaXN0IGRhdGEgPSByZXNwb25zZVsxXTsKICAgICAgcmV0dXJuIG5ldyBGaWxlU3RhdC5faW50ZXJuYWwoCiAgICAgICAgICBuZXcgRGF0ZVRpbWUuZnJvbU1pbGxpc2Vjb25kc1NpbmNlRXBvY2goZGF0YVtfY2hhbmdlZFRpbWVdKSwKICAgICAgICAgIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChkYXRhW19tb2RpZmllZFRpbWVdKSwKICAgICAgICAgIG5ldyBEYXRlVGltZS5mcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaChkYXRhW19hY2Nlc3NlZFRpbWVdKSwKICAgICAgICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9sb29rdXAoZGF0YVtfdHlwZV0pLAogICAgICAgICAgZGF0YVtfbW9kZV0sCiAgICAgICAgICBkYXRhW19zaXplXSk7CiAgICB9KTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+ICIiIgpGaWxlU3RhdDogdHlwZSAkdHlwZQogICAgICAgICAgY2hhbmdlZCAkY2hhbmdlZAogICAgICAgICAgbW9kaWZpZWQgJG1vZGlmaWVkCiAgICAgICAgICBhY2Nlc3NlZCAkYWNjZXNzZWQKICAgICAgICAgIG1vZGUgJHttb2RlU3RyaW5nKCl9CiAgICAgICAgICBzaXplICRzaXplIiIiOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBtb2RlIHZhbHVlIGFzIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLgogICAqCiAgICogVGhlIHN0cmluZyBpcyBpbiB0aGUgZm9ybWF0ICJyd3hyd3hyd3giLCByZWZsZWN0aW5nIHRoZSB1c2VyLCBncm91cCwgYW5kCiAgICogd29ybGQgcGVybWlzc2lvbnMgdG8gcmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QsIHdpdGgKICAgKiAiLSIgcmVwbGFjaW5nIHRoZSBsZXR0ZXIgZm9yIG1pc3NpbmcgcGVybWlzc2lvbnMuICBFeHRyYSBwZXJtaXNzaW9uIGJpdHMKICAgKiBtYXkgYmUgcmVwcmVzZW50ZWQgYnkgcHJlcGVuZGluZyAiKHN1aWQpIiwgIihndWlkKSIsIGFuZC9vciAiKHN0aWNreSkiIHRvCiAgICogdGhlIG1vZGUgc3RyaW5nLgogICAqLwogIFN0cmluZyBtb2RlU3RyaW5nKCkgewogICAgdmFyIHBlcm1pc3Npb25zID0gbW9kZSAmIDB4RkZGOwogICAgdmFyIGNvZGVzID0gY29uc3QgWyctLS0nLCAnLS14JywgJy13LScsICctd3gnLCAnci0tJywgJ3IteCcsICdydy0nLCAncnd4J107CiAgICB2YXIgcmVzdWx0ID0gW107CiAgICBpZiAoKHBlcm1pc3Npb25zICYgMHg4MDApICE9IDApIHJlc3VsdC5hZGQoIihzdWlkKSAiKTsKICAgIGlmICgocGVybWlzc2lvbnMgJiAweDQwMCkgIT0gMCkgcmVzdWx0LmFkZCgiKGd1aWQpICIpOwogICAgaWYgKChwZXJtaXNzaW9ucyAmIDB4MjAwKSAhPSAwKSByZXN1bHQuYWRkKCIoc3RpY2t5KSAiKTsKICAgIHJlc3VsdAogICAgICAuLmFkZChjb2Rlc1socGVybWlzc2lvbnMgPj4gNikgJiAweDddKQogICAgICAuLmFkZChjb2Rlc1socGVybWlzc2lvbnMgPj4gMykgJiAweDddKQogICAgICAuLmFkZChjb2Rlc1twZXJtaXNzaW9ucyAmIDB4N10pOwogICAgcmV0dXJuIHJlc3VsdC5qb2luKCk7CiAgfQp9CgovKioKICogVGhlIGNvbW1vbiBzdXBlciBjbGFzcyBmb3IgW0ZpbGVdLCBbRGlyZWN0b3J5XSwgYW5kIFtMaW5rXSBvYmplY3RzLgogKgogKiBbRmlsZVN5c3RlbUVudGl0eV0gb2JqZWN0cyBhcmUgcmV0dXJuZWQgZnJvbSBkaXJlY3RvcnkgbGlzdGluZwogKiBvcGVyYXRpb25zLiBUbyBkZXRlcm1pbmUgaWYgYSBGaWxlU3lzdGVtRW50aXR5IGlzIGEgW0ZpbGVdLCBhCiAqIFtEaXJlY3RvcnldLCBvciBhIFtMaW5rXSBwZXJmb3JtIGEgdHlwZSBjaGVjazoKICoKICogICAgIGlmIChlbnRpdHkgaXMgRmlsZSkgKGVudGl0eSBhcyBGaWxlKS5yZWFkQXNTdHJpbmdTeW5jKCk7CiAqCiAqIFlvdSBjYW4gYWxzbyB1c2UgdGhlIFt0eXBlXSBvciBbdHlwZVN5bmNdIG1ldGhvZHMgdG8gZGV0ZXJtaW5lCiAqIHRoZSB0eXBlIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LgogKgogKiBNb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBvY2N1ciBpbiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHBhaXJzLAogKiBmb3IgZXhhbXBsZSwgW2V4aXN0c10gYW5kIFtleGlzdHNTeW5jXS4KICogVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgcmVhc29uIGZvciB1c2luZyB0aGUgc3luY2hyb25vdXMgdmVyc2lvbgogKiBvZiBhIG1ldGhvZCwgcHJlZmVyIHRoZSBhc3luY2hyb25vdXMgdmVyc2lvbiB0byBhdm9pZCBibG9ja2luZyB5b3VyIHByb2dyYW0uCiAqCiAqIEhlcmUncyB0aGUgZXhpc3RzIG1ldGhvZCBpbiBhY3Rpb246CiAqCiAqICAgICBlbnRpdHkuZXhpc3RzKCkudGhlbigoaXNUaGVyZSkgewogKiAgICAgICBpc1RoZXJlID8gcHJpbnQoJ2V4aXN0cycpIDogcHJpbnQoJ25vbi1leGlzdGVudCcpOwogKiAgICAgfSk7CiAqCiAqCiAqICMjIE90aGVyIHJlc291cmNlcwogKgogKiAqIFtEYXJ0IGJ5CiAqICAgRXhhbXBsZV0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RhcnQtYnktZXhhbXBsZS8jZmlsZXMtZGlyZWN0b3JpZXMtYW5kLXN5bWxpbmtzKQogKiAgIHByb3ZpZGVzIGFkZGl0aW9uYWwgdGFzay1vcmllbnRlZCBjb2RlIHNhbXBsZXMgdGhhdCBzaG93IGhvdyB0byB1c2UgdmFyaW91cwogKiAgIEFQSSBmcm9tIHRoZSBbRGlyZWN0b3J5XSBjbGFzcyBhbmQgdGhlIFtGaWxlXSBjbGFzcywgYm90aCBzdWJjbGFzc2VzIG9mCiAqICAgRmlsZVN5c3RlbUVudGl0eS4KICoKICogKiBbSS9PIGZvciBDb21tYW5kLUxpbmUKICogICBBcHBzXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNkYXJ0aW8tLS1pby1mb3ItY29tbWFuZC1saW5lLWFwcHMpLAogKiAgIGEgc2VjdGlvbiBmcm9tIF9BIFRvdXIgb2YgdGhlIERhcnQgTGlicmFyaWVzXyBjb3ZlcnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgogKgogKiAqIFtXcml0ZSBDb21tYW5kLUxpbmUgQXBwc10oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvdHV0b3JpYWxzL2NtZGxpbmUvKSwKICogICBhIHR1dG9yaWFsIGFib3V0IHdyaXRpbmcgY29tbWFuZC1saW5lIGFwcHMsIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0CiAqICAgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgogKi8KYWJzdHJhY3QgY2xhc3MgRmlsZVN5c3RlbUVudGl0eSB7CiAgU3RyaW5nIF9wYXRoOwogIFVpbnQ4TGlzdCBfcmF3UGF0aDsKCiAgU3RyaW5nIGdldCBwYXRoOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW1VyaV0gcmVwcmVzZW50aW5nIHRoZSBmaWxlIHN5c3RlbSBlbnRpdHkncyBsb2NhdGlvbi4KICAgKgogICAqIFRoZSByZXR1cm5lZCBVUkkncyBzY2hlbWUgaXMgYWx3YXlzICJmaWxlIiBpZiB0aGUgZW50aXR5J3MgW3BhdGhdIGlzCiAgICogYWJzb2x1dGUsIG90aGVyd2lzZSB0aGUgc2NoZW1lIHdpbGwgYmUgZW1wdHkuCiAgICovCiAgVXJpIGdldCB1cmkgPT4gbmV3IFVyaS5maWxlKHBhdGgpOwoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZmlsZSBzeXN0ZW0gZW50aXR5IHdpdGggdGhpcyBwYXRoIGV4aXN0cy4gUmV0dXJucwogICAqIGEgWzpGdXR1cmU8Ym9vbD46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSByZXN1bHQuCiAgICoKICAgKiBTaW5jZSBGaWxlU3lzdGVtRW50aXR5IGlzIGFic3RyYWN0LCBldmVyeSBGaWxlU3lzdGVtRW50aXR5IG9iamVjdAogICAqIGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgc3ViY2xhc3NlcyBbRmlsZV0sCiAgICogW0RpcmVjdG9yeV0sIGFuZCBbTGlua10uICBDYWxsaW5nIFtleGlzdHNdIG9uIGFuIGluc3RhbmNlIG9mIG9uZQogICAqIG9mIHRoZXNlIHN1YmNsYXNzZXMgY2hlY2tzIHdoZXRoZXIgdGhlIG9iamVjdCBleGlzdHMgaW4gdGhlIGZpbGUKICAgKiBzeXN0ZW0gb2JqZWN0IGV4aXN0cyBhbmQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSAoZmlsZSwgZGlyZWN0b3J5LAogICAqIG9yIGxpbmspLiAgVG8gY2hlY2sgd2hldGhlciBhIHBhdGggcG9pbnRzIHRvIGFuIG9iamVjdCBvbiB0aGUKICAgKiBmaWxlIHN5c3RlbSwgcmVnYXJkbGVzcyBvZiB0aGUgb2JqZWN0J3MgdHlwZSwgdXNlIHRoZSBbdHlwZV0KICAgKiBzdGF0aWMgbWV0aG9kLgogICAqCiAgICovCiAgRnV0dXJlPGJvb2w+IGV4aXN0cygpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyB3aGV0aGVyIHRoZSBmaWxlIHN5c3RlbSBlbnRpdHkgd2l0aCB0aGlzIHBhdGgKICAgKiBleGlzdHMuCiAgICoKICAgKiBTaW5jZSBGaWxlU3lzdGVtRW50aXR5IGlzIGFic3RyYWN0LCBldmVyeSBGaWxlU3lzdGVtRW50aXR5IG9iamVjdAogICAqIGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgc3ViY2xhc3NlcyBbRmlsZV0sCiAgICogW0RpcmVjdG9yeV0sIGFuZCBbTGlua10uICBDYWxsaW5nIFtleGlzdHNTeW5jXSBvbiBhbiBpbnN0YW5jZSBvZgogICAqIG9uZSBvZiB0aGVzZSBzdWJjbGFzc2VzIGNoZWNrcyB3aGV0aGVyIHRoZSBvYmplY3QgZXhpc3RzIGluIHRoZQogICAqIGZpbGUgc3lzdGVtIG9iamVjdCBleGlzdHMgYW5kIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUgKGZpbGUsCiAgICogZGlyZWN0b3J5LCBvciBsaW5rKS4gIFRvIGNoZWNrIHdoZXRoZXIgYSBwYXRoIHBvaW50cyB0byBhbiBvYmplY3QKICAgKiBvbiB0aGUgZmlsZSBzeXN0ZW0sIHJlZ2FyZGxlc3Mgb2YgdGhlIG9iamVjdCdzIHR5cGUsIHVzZSB0aGUKICAgKiBbdHlwZVN5bmNdIHN0YXRpYyBtZXRob2QuCiAgICovCiAgYm9vbCBleGlzdHNTeW5jKCk7CgogIC8qKgogICAqIFJlbmFtZXMgdGhpcyBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgICoKICAgKiBSZXR1cm5zIGEgYEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PmAgdGhhdCBjb21wbGV0ZXMgd2l0aCBhCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHldIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBmaWxlIHN5c3RlbSBlbnRpdHkuCiAgICoKICAgKiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBlbnRpdHkgb2YgdGhlIHNhbWUgdHlwZSwgdGhhdCBlbnRpdHkKICAgKiBpcyByZXBsYWNlZC4gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZW50aXR5IG9mIGEgZGlmZmVyZW50CiAgICogdHlwZSwgdGhlIG9wZXJhdGlvbiBmYWlscyBhbmQgdGhlIGZ1dHVyZSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHk+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVuYW1lcyB0aGlzIGZpbGUgc3lzdGVtIGVudGl0eS4KICAgKgogICAqIFJldHVybnMgYSBbRmlsZVN5c3RlbUVudGl0eV0gaW5zdGFuY2UgZm9yIHRoZSByZW5hbWVkIGVudGl0eS4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGVudGl0eSBvZiB0aGUgc2FtZSB0eXBlLCB0aGF0IGVudGl0eQogICAqIGlzIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBlbnRpdHkgb2YgYSBkaWZmZXJlbnQKICAgKiB0eXBlLCB0aGUgb3BlcmF0aW9uIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIEZpbGVTeXN0ZW1FbnRpdHkgcmVuYW1lU3luYyhTdHJpbmcgbmV3UGF0aCk7CgogIC8qKgogICAqIFJlc29sdmVzIHRoZSBwYXRoIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0IHJlbGF0aXZlIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICoKICAgKiBSZXNvbHZlcyBhbGwgc3ltYm9saWMgbGlua3Mgb24gdGhlIHBhdGggYW5kIHJlc29sdmVzIGFsbCBgLi5gIGFuZCBgLmAgcGF0aAogICAqIHNlZ21lbnRzLgogICAqCiAgICogW3Jlc29sdmVTeW1ib2xpY0xpbmtzXSB1c2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmF0aXZlCiAgICogZmlsZSBzeXN0ZW0gQVBJIHRvIHJlc29sdmUgdGhlIHBhdGgsIHVzaW5nIHRoZSBgcmVhbHBhdGhgIGZ1bmN0aW9uCiAgICogb24gbGludXggYW5kIE9TIFgsIGFuZCB0aGUgYEdldEZpbmFsUGF0aE5hbWVCeUhhbmRsZWAgZnVuY3Rpb24gb24KICAgKiBXaW5kb3dzLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBwb2ludCB0byBhbiBleGlzdGluZyBmaWxlIHN5c3RlbSBvYmplY3QsCiAgICogYHJlc29sdmVTeW1ib2xpY0xpbmtzYCB0aHJvd3MgYSBgRmlsZVN5c3RlbUV4Y2VwdGlvbmAuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoZSBgLi5gIHNlZ21lbnRzIGFyZSByZXNvbHZlZCBfYmVmb3JlXyByZXNvbHZpbmcgdGhlIHN5bWJvbGljCiAgICogbGluaywgYW5kIG9uIG90aGVyIHBsYXRmb3JtcyB0aGUgc3ltYm9saWMgbGlua3MgYXJlIF9yZXNvbHZlZCB0byB0aGVpcgogICAqIHRhcmdldF8gYmVmb3JlIGFwcGx5aW5nIGEgYC4uYCB0aGF0IGZvbGxvd3MuCiAgICoKICAgKiBUbyBlbnN1cmUgdGhlIHNhbWUgYmVoYXZpb3Igb24gYWxsIHBsYXRmb3JtcyByZXNvbHZlIGAuLmAgc2VnbWVudHMgYmVmb3JlCiAgICogY2FsbGluZyBgcmVzb2x2ZVN5bWJvbGljTGlua3NgLiBPbmUgd2F5IG9mIGRvaW5nIHRoaXMgaXMgd2l0aCB0aGUgYFVyaWAKICAgKiBjbGFzczoKICAgKgogICAqICAgICB2YXIgcGF0aCA9IFVyaS5wYXJzZSgnLicpLnJlc29sdmVVcmkobmV3IFVyaS5maWxlKGlucHV0KSkudG9GaWxlUGF0aCgpOwogICAqICAgICBpZiAocGF0aCA9PSAnJykgcGF0aCA9ICcuJzsKICAgKiAgICAgbmV3IEZpbGUocGF0aCkucmVzb2x2ZVN5bWJvbGljTGlua3MoKS50aGVuKChyZXNvbHZlZCkgewogICAqICAgICAgIHByaW50KHJlc29sdmVkKTsKICAgKiAgICAgfSk7CiAgICoKICAgKiBzaW5jZSBgVXJpLnJlc29sdmVgIHJlbW92ZXMgYC4uYCBzZWdtZW50cy4gVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgV2luZG93cwogICAqIGJlaGF2aW9yLgogICAqLwogIEZ1dHVyZTxTdHJpbmc+IHJlc29sdmVTeW1ib2xpY0xpbmtzKCkgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlUmVzb2x2ZVN5bWJvbGljTGlua3MsIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCAiQ2Fubm90IHJlc29sdmUgc3ltYm9saWMgbGlua3MiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9KTsKICB9CgogIC8qKgogICAqIFJlc29sdmVzIHRoZSBwYXRoIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0IHJlbGF0aXZlIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgICoKICAgKiBSZXNvbHZlcyBhbGwgc3ltYm9saWMgbGlua3Mgb24gdGhlIHBhdGggYW5kIHJlc29sdmVzIGFsbCBgLi5gIGFuZCBgLmAgcGF0aAogICAqIHNlZ21lbnRzLgogICAqCiAgICogW3Jlc29sdmVTeW1ib2xpY0xpbmtzU3luY10gdXNlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIG5hdGl2ZQogICAqIGZpbGUgc3lzdGVtIEFQSSB0byByZXNvbHZlIHRoZSBwYXRoLCB1c2luZyB0aGUgYHJlYWxwYXRoYCBmdW5jdGlvbgogICAqIG9uIGxpbnV4IGFuZCBPUyBYLCBhbmQgdGhlIGBHZXRGaW5hbFBhdGhOYW1lQnlIYW5kbGVgIGZ1bmN0aW9uIG9uCiAgICogV2luZG93cy4gSWYgdGhlIHBhdGggZG9lcyBub3QgcG9pbnQgdG8gYW4gZXhpc3RpbmcgZmlsZSBzeXN0ZW0gb2JqZWN0LAogICAqIGByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmNgIHRocm93cyBhIGBGaWxlU3lzdGVtRXhjZXB0aW9uYC4KICAgKgogICAqIE9uIFdpbmRvd3MgdGhlIGAuLmAgc2VnbWVudHMgYXJlIHJlc29sdmVkIF9iZWZvcmVfIHJlc29sdmluZyB0aGUgc3ltYm9saWMKICAgKiBsaW5rLCBhbmQgb24gb3RoZXIgcGxhdGZvcm1zIHRoZSBzeW1ib2xpYyBsaW5rcyBhcmUgX3Jlc29sdmVkIHRvIHRoZWlyCiAgICogdGFyZ2V0XyBiZWZvcmUgYXBwbHlpbmcgYSBgLi5gIHRoYXQgZm9sbG93cy4KICAgKgogICAqIFRvIGVuc3VyZSB0aGUgc2FtZSBiZWhhdmlvciBvbiBhbGwgcGxhdGZvcm1zIHJlc29sdmUgYC4uYCBzZWdtZW50cyBiZWZvcmUKICAgKiBjYWxsaW5nIGByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmNgLiBPbmUgd2F5IG9mIGRvaW5nIHRoaXMgaXMgd2l0aCB0aGUgYFVyaWAKICAgKiBjbGFzczoKICAgKgogICAqICAgICB2YXIgcGF0aCA9IFVyaS5wYXJzZSgnLicpLnJlc29sdmVVcmkobmV3IFVyaS5maWxlKGlucHV0KSkudG9GaWxlUGF0aCgpOwogICAqICAgICBpZiAocGF0aCA9PSAnJykgcGF0aCA9ICcuJzsKICAgKiAgICAgdmFyIHJlc29sdmVkID0gbmV3IEZpbGUocGF0aCkucmVzb2x2ZVN5bWJvbGljTGlua3NTeW5jKCk7CiAgICogICAgIHByaW50KHJlc29sdmVkKTsKICAgKgogICAqIHNpbmNlIGBVcmkucmVzb2x2ZWAgcmVtb3ZlcyBgLi5gIHNlZ21lbnRzLiBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSBXaW5kb3dzCiAgICogYmVoYXZpb3IuCiAgICovCiAgU3RyaW5nIHJlc29sdmVTeW1ib2xpY0xpbmtzU3luYygpIHsKICAgIHZhciByZXN1bHQgPSBfcmVzb2x2ZVN5bWJvbGljTGlua3MoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCk7CiAgICBfdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCByZXNvbHZlIHN5bWJvbGljIGxpbmtzIiwgcGF0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQ2FsbHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBzdGF0KCkgZnVuY3Rpb24gb24gdGhlIFtwYXRoXSBvZiB0aGlzCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHldLgogICAqCiAgICogSWRlbnRpY2FsIHRvIFs6RmlsZVN0YXQuc3RhdCh0aGlzLnBhdGgpOl0uCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8RmlsZVN0YXQ+Ol0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGEgcmV0dXJuZWQgYnkKICAgKiBzdGF0KCkuCiAgICoKICAgKiBJZiB0aGUgY2FsbCBmYWlscywgY29tcGxldGVzIHRoZSBmdXR1cmUgd2l0aCBhIFtGaWxlU3RhdF0gb2JqZWN0CiAgICogd2l0aCAudHlwZSBzZXQgdG8KICAgKiBGaWxlU3lzdGVtRW50aXR5VHlwZS5ub3RGb3VuZCBhbmQgdGhlIG90aGVyIGZpZWxkcyBpbnZhbGlkLgogICAqLwogIEZ1dHVyZTxGaWxlU3RhdD4gc3RhdCgpID0+IEZpbGVTdGF0LnN0YXQocGF0aCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgY2FsbHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBzdGF0KCkgZnVuY3Rpb24gb24gdGhlCiAgICogW3BhdGhdIG9mIHRoaXMgW0ZpbGVTeXN0ZW1FbnRpdHldLgogICAqCiAgICogSWRlbnRpY2FsIHRvIFs6RmlsZVN0YXQuc3RhdFN5bmModGhpcy5wYXRoKTpdLgogICAqCiAgICogUmV0dXJucyBhIFtGaWxlU3RhdF0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGEgcmV0dXJuZWQgYnkgc3RhdCgpLgogICAqCiAgICogSWYgdGhlIGNhbGwgZmFpbHMsIHJldHVybnMgYSBbRmlsZVN0YXRdIG9iamVjdCB3aXRoIC50eXBlIHNldCB0bwogICAqIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLm5vdEZvdW5kIGFuZCB0aGUgb3RoZXIgZmllbGRzIGludmFsaWQuCiAgICovCiAgRmlsZVN0YXQgc3RhdFN5bmMoKSA9PiBGaWxlU3RhdC5zdGF0U3luYyhwYXRoKTsKCiAgLyoqCiAgICogRGVsZXRlcyB0aGlzIFtGaWxlU3lzdGVtRW50aXR5XS4KICAgKgogICAqIElmIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gaXMgYSBkaXJlY3RvcnksIGFuZCBpZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwKICAgKiB0aGUgZGlyZWN0b3J5IG11c3QgYmUgZW1wdHkuIE90aGVyd2lzZSwgaWYgW3JlY3Vyc2l2ZV0gaXMgdHJ1ZSwgdGhlCiAgICogZGlyZWN0b3J5IGFuZCBhbGwgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMgYXJlCiAgICogZGVsZXRlZC4gTGlua3MgYXJlIG5vdCBmb2xsb3dlZCB3aGVuIGRlbGV0aW5nIHJlY3Vyc2l2ZWx5LiBPbmx5IHRoZSBsaW5rCiAgICogaXMgZGVsZXRlZCwgbm90IGl0cyB0YXJnZXQuCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyB0cnVlLCB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGlzIGRlbGV0ZWQgZXZlbiBpZiB0aGUgdHlwZQogICAqIG9mIHRoZSBbRmlsZVN5c3RlbUVudGl0eV0gZG9lc24ndCBtYXRjaCB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBzeXN0ZW0uCiAgICogVGhpcyBiZWhhdmlvciBhbGxvd3MgW2RlbGV0ZV0gdG8gYmUgdXNlZCB0byB1bmNvbmRpdGlvbmFsbHkgZGVsZXRlIGFueSBmaWxlCiAgICogc3lzdGVtIG9iamVjdC4KICAgKgogICAqIFJldHVybnMgYSBbOkZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PjpdIHRoYXQgY29tcGxldGVzIHdpdGggdGhpcwogICAqIFtGaWxlU3lzdGVtRW50aXR5XSB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLiBJZiB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldCiAgICogY2Fubm90IGJlIGRlbGV0ZWQsIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqLwogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5PiBkZWxldGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pID0+CiAgICAgIF9kZWxldGUocmVjdXJzaXZlOiByZWN1cnNpdmUpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGRlbGV0ZXMgdGhpcyBbRmlsZVN5c3RlbUVudGl0eV0uCiAgICoKICAgKiBJZiB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGlzIGEgZGlyZWN0b3J5LCBhbmQgaWYgW3JlY3Vyc2l2ZV0gaXMgZmFsc2UsCiAgICogdGhlIGRpcmVjdG9yeSBtdXN0IGJlIGVtcHR5LiBPdGhlcndpc2UsIGlmIFtyZWN1cnNpdmVdIGlzIHRydWUsIHRoZQogICAqIGRpcmVjdG9yeSBhbmQgYWxsIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzIGFyZQogICAqIGRlbGV0ZWQuIExpbmtzIGFyZSBub3QgZm9sbG93ZWQgd2hlbiBkZWxldGluZyByZWN1cnNpdmVseS4gT25seSB0aGUgbGluawogICAqIGlzIGRlbGV0ZWQsIG5vdCBpdHMgdGFyZ2V0LgogICAqCiAgICogSWYgW3JlY3Vyc2l2ZV0gaXMgdHJ1ZSwgdGhlIFtGaWxlU3lzdGVtRW50aXR5XSBpcyBkZWxldGVkIGV2ZW4gaWYgdGhlIHR5cGUKICAgKiBvZiB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGRvZXNuJ3QgbWF0Y2ggdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgc3lzdGVtLgogICAqIFRoaXMgYmVoYXZpb3IgYWxsb3dzIFtkZWxldGVTeW5jXSB0byBiZSB1c2VkIHRvIHVuY29uZGl0aW9uYWxseSBkZWxldGUgYW55CiAgICogZmlsZSBzeXN0ZW0gb2JqZWN0LgogICAqCiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGNhbm5vdCBiZSBkZWxldGVkLgogICAqLwogIHZvaWQgZGVsZXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgPT4gX2RlbGV0ZVN5bmMocmVjdXJzaXZlOiByZWN1cnNpdmUpOwoKICAvKioKICAgKiBTdGFydCB3YXRjaGluZyB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHldIGZvciBjaGFuZ2VzLgogICAqCiAgICogVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgcGxhdGZvcm0tZGVwZW5kZW50IGV2ZW50LWJhc2VkIEFQSXMgZm9yIHJlY2VpdmluZwogICAqIGZpbGUtc3lzdGVtIG5vdGlmaWNhdGlvbnMsIHRodXMgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgcGxhdGZvcm0uCiAgICoKICAgKiAgICogYFdpbmRvd3NgOiBVc2VzIGBSZWFkRGlyZWN0b3J5Q2hhbmdlc1dgLiBUaGUgaW1wbGVtZW50YXRpb24gb25seQogICAqICAgICBzdXBwb3J0cyB3YXRjaGluZyBkaXJlY3Rvcmllcy4gUmVjdXJzaXZlIHdhdGNoaW5nIGlzIHN1cHBvcnRlZC4KICAgKiAgICogYExpbnV4YDogVXNlcyBgaW5vdGlmeWAuIFRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB3YXRjaGluZyBib3RoCiAgICogICAgIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gUmVjdXJzaXZlIHdhdGNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICogICAgIE5vdGU6IFdoZW4gd2F0Y2hpbmcgZmlsZXMgZGlyZWN0bHksIGRlbGV0ZSBldmVudHMgbWlnaHQgbm90IGhhcHBlbgogICAqICAgICBhcyBleHBlY3RlZC4KICAgKiAgICogYE9TIFhgOiBVc2VzIGBGU0V2ZW50c2AuIFRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB3YXRjaGluZyBib3RoCiAgICogICAgIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gUmVjdXJzaXZlIHdhdGNoaW5nIGlzIHN1cHBvcnRlZC4KICAgKgogICAqIFRoZSBzeXN0ZW0gd2lsbCBzdGFydCBsaXN0ZW5pbmcgZm9yIGV2ZW50cyBvbmNlIHRoZSByZXR1cm5lZCBbU3RyZWFtXSBpcwogICAqIGJlaW5nIGxpc3RlbmVkIHRvLCBub3Qgd2hlbiB0aGUgY2FsbCB0byBbd2F0Y2hdIGlzIGlzc3VlZC4KICAgKgogICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbiBlbmRsZXNzIGJyb2FkY2FzdCBbU3RyZWFtXSwgdGhhdCBvbmx5IHN0b3BzIHdoZW4KICAgKiBvbmUgb2YgdGhlIGZvbGxvd2luZyBoYXBwZW5zOgogICAqCiAgICogICAqIFRoZSBbU3RyZWFtXSBpcyBjYW5jZWxlZCwgZS5nLiBieSBjYWxsaW5nIGBjYW5jZWxgIG9uIHRoZQogICAqICAgICAgW1N0cmVhbVN1YnNjcmlwdGlvbl0uCiAgICogICAqIFRoZSBbRmlsZVN5c3RlbUVudGl0eV0gYmVpbmcgd2F0Y2hlcywgaXMgZGVsZXRlZC4KICAgKgogICAqIFVzZSBgZXZlbnRzYCB0byBzcGVjaWZ5IHdoYXQgZXZlbnRzIHRvIGxpc3RlbiBmb3IuIFRoZSBjb25zdGFudHMgaW4KICAgKiBbRmlsZVN5c3RlbUV2ZW50XSBjYW4gYmUgb3InZWQgdG9nZXRoZXIgdG8gbWl4IGV2ZW50cy4gRGVmYXVsdCBpcwogICAqIFtGaWxlU3lzdGVtRXZlbnQuQUxMXS4KICAgKgogICAqIEEgbW92ZSBldmVudCBtYXkgYmUgcmVwb3J0ZWQgYXMgc2VwZXJhdGUgZGVsZXRlIGFuZCBjcmVhdGUgZXZlbnRzLgogICAqLwogIFN0cmVhbTxGaWxlU3lzdGVtRXZlbnQ+IHdhdGNoKAogICAgICB7aW50IGV2ZW50czogRmlsZVN5c3RlbUV2ZW50LmFsbCwgYm9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgLy8gRklYTUUoYmtvbnlpKTogZmluZCBhIHdheSB0byBkbyB0aGlzIHVzaW5nIHRoZSByYXcgcGF0aC4KICAgIGZpbmFsIFN0cmluZyB0cmltbWVkUGF0aCA9IF90cmltVHJhaWxpbmdQYXRoU2VwYXJhdG9ycyhwYXRoKTsKICAgIGZpbmFsIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9GaWxlU3lzdGVtV2F0Y2hlci5fd2F0Y2godHJpbW1lZFBhdGgsIGV2ZW50cywgcmVjdXJzaXZlKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuZnNXYXRjaCh0cmltbWVkUGF0aCwgZXZlbnRzLCByZWN1cnNpdmUpOwogIH0KCiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHk+IF9kZWxldGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwogIHZvaWQgX2RlbGV0ZVN5bmMoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICBzdGF0aWMgRnV0dXJlPGJvb2w+IF9pZGVudGljYWwoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZUlkZW50aWNhbCwgW251bGwsIHBhdGgxLCBwYXRoMl0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsCiAgICAgICAgICAgICJFcnJvciBpbiBGaWxlU3lzdGVtRW50aXR5LmlkZW50aWNhbCgkcGF0aDEsICRwYXRoMikiLCAiIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciB0d28gcGF0aHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IGluIHRoZQogICAqIGZpbGUgc3lzdGVtLgogICAqCiAgICogUmV0dXJucyBhIFs6RnV0dXJlPGJvb2w+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgcmVzdWx0LgogICAqCiAgICogQ29tcGFyaW5nIGEgbGluayB0byBpdHMgdGFyZ2V0IHJldHVybnMgZmFsc2UsIGFzIGRvZXMgY29tcGFyaW5nIHR3byBsaW5rcwogICAqIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUgdGFyZ2V0LiAgVG8gY2hlY2sgdGhlIHRhcmdldCBvZiBhIGxpbmssIHVzZQogICAqIExpbmsudGFyZ2V0IGV4cGxpY2l0bHkgdG8gZmV0Y2ggaXQuICBEaXJlY3RvcnkgbGlua3MgYXBwZWFyaW5nCiAgICogaW5zaWRlIGEgcGF0aCBhcmUgZm9sbG93ZWQsIHRob3VnaCwgdG8gZmluZCB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogICAqCiAgICogQ29tcGxldGVzIHRoZSByZXR1cm5lZCBGdXR1cmUgd2l0aCBhbiBlcnJvciBpZiBvbmUgb2YgdGhlIHBhdGhzIHBvaW50cwogICAqIHRvIGFuIG9iamVjdCB0aGF0IGRvZXMgbm90IGV4aXN0LgogICAqLwogIHN0YXRpYyBGdXR1cmU8Ym9vbD4gaWRlbnRpY2FsKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfaWRlbnRpY2FsKHBhdGgxLCBwYXRoMik7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZzZUlkZW50aWNhbChwYXRoMSwgcGF0aDIpOwogIH0KCiAgc3RhdGljIGZpbmFsIFJlZ0V4cCBfYWJzb2x1dGVXaW5kb3dzUGF0aFBhdHRlcm4gPQogICAgICBuZXcgUmVnRXhwKHInXihcXFxcfFthLXpBLVpdOlsvXFxdKScpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW2Jvb2xdIGluZGljYXRpbmcgd2hldGhlciB0aGlzIG9iamVjdCdzIHBhdGggaXMgYWJzb2x1dGUuCiAgICoKICAgKiBPbiBXaW5kb3dzLCBhIHBhdGggaXMgYWJzb2x1dGUgaWYgaXQgc3RhcnRzIHdpdGggXFxcXCBvciBhIGRyaXZlIGxldHRlcgogICAqIGJldHdlZW4gYSBhbmQgeiAodXBwZXIgb3IgbG93ZXIgY2FzZSkgZm9sbG93ZWQgYnkgOlxcIG9yIDovLgogICAqIE9uIG5vbi1XaW5kb3dzLCBhIHBhdGggaXMgYWJzb2x1dGUgaWYgaXQgc3RhcnRzIHdpdGggLy4KICAgKi8KICBib29sIGdldCBpc0Fic29sdXRlIHsKICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgcmV0dXJuIHBhdGguc3RhcnRzV2l0aChfYWJzb2x1dGVXaW5kb3dzUGF0aFBhdHRlcm4pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhdGguc3RhcnRzV2l0aCgnLycpOwogICAgfQogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIFtGaWxlU3lzdGVtRW50aXR5XSB3aG9zZSBwYXRoIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIFt0aGlzXS4KICAgKgogICAqIFRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBpcyB0aGUgdHlwZSBvZiBbdGhpc10uCiAgICoKICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBpcyBjb21wdXRlZCBieSBwcmVmaXhpbmcKICAgKiBhIHJlbGF0aXZlIHBhdGggd2l0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIHJldHVybmluZwogICAqIGFuIGFic29sdXRlIHBhdGggdW5jaGFuZ2VkLgogICAqLwogIEZpbGVTeXN0ZW1FbnRpdHkgZ2V0IGFic29sdXRlOwoKICBTdHJpbmcgZ2V0IF9hYnNvbHV0ZVBhdGggewogICAgaWYgKGlzQWJzb2x1dGUpIHJldHVybiBwYXRoOwogICAgU3RyaW5nIGN1cnJlbnQgPSBEaXJlY3RvcnkuY3VycmVudC5wYXRoOwogICAgaWYgKGN1cnJlbnQuZW5kc1dpdGgoJy8nKSB8fAogICAgICAgIChQbGF0Zm9ybS5pc1dpbmRvd3MgJiYgY3VycmVudC5lbmRzV2l0aCgnXFwnKSkpIHsKICAgICAgcmV0dXJuICckY3VycmVudCRwYXRoJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnJGN1cnJlbnQke1BsYXRmb3JtLnBhdGhTZXBhcmF0b3J9JHBhdGgnOwogICAgfQogIH0KCiAgVWludDhMaXN0IGdldCBfcmF3QWJzb2x1dGVQYXRoIHsKICAgIGlmIChpc0Fic29sdXRlKSByZXR1cm4gX3Jhd1BhdGg7CiAgICB2YXIgY3VycmVudCA9IERpcmVjdG9yeS5jdXJyZW50Ll9yYXdQYXRoLnRvTGlzdCgpOwogICAgYXNzZXJ0KGN1cnJlbnQubGFzdCA9PSAwKTsKICAgIGN1cnJlbnQucmVtb3ZlTGFzdCgpOyAvLyBSZW1vdmUgbnVsbCB0ZXJtaW5hdG9yLgogICAgaWYgKChjdXJyZW50Lmxhc3QgPT0gJy8nLmNvZGVVbml0QXQoMCkpIHx8CiAgICAgICAgKFBsYXRmb3JtLmlzV2luZG93cyAmJiAoY3VycmVudC5sYXN0ID09ICdcXCcuY29kZVVuaXRBdCgwKSkpKSB7CiAgICAgIGN1cnJlbnQuYWRkQWxsKF9yYXdQYXRoKTsKICAgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoY3VycmVudCk7CiAgICB9IGVsc2UgewogICAgICBjdXJyZW50LmFkZEFsbCh1dGY4LmVuY29kZShQbGF0Zm9ybS5wYXRoU2VwYXJhdG9yKSk7CiAgICAgIGN1cnJlbnQuYWRkQWxsKF9yYXdQYXRoKTsKICAgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoY3VycmVudCk7CiAgICB9CiAgfQoKICBzdGF0aWMgYm9vbCBfaWRlbnRpY2FsU3luYyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgdmFyIHJlc3VsdCA9IF9pZGVudGljYWxOYXRpdmUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBwYXRoMSwgcGF0aDIpOwogICAgX3Rocm93SWZFcnJvcihyZXN1bHQsICdFcnJvciBpbiBGaWxlU3lzdGVtRW50aXR5LmlkZW50aWNhbFN5bmMnKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyB3aGV0aGVyIHR3byBwYXRocyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgaW4gdGhlCiAgICogZmlsZSBzeXN0ZW0uCiAgICoKICAgKiBDb21wYXJpbmcgYSBsaW5rIHRvIGl0cyB0YXJnZXQgcmV0dXJucyBmYWxzZSwgYXMgZG9lcyBjb21wYXJpbmcgdHdvIGxpbmtzCiAgICogdGhhdCBwb2ludCB0byB0aGUgc2FtZSB0YXJnZXQuICBUbyBjaGVjayB0aGUgdGFyZ2V0IG9mIGEgbGluaywgdXNlCiAgICogTGluay50YXJnZXQgZXhwbGljaXRseSB0byBmZXRjaCBpdC4gIERpcmVjdG9yeSBsaW5rcyBhcHBlYXJpbmcKICAgKiBpbnNpZGUgYSBwYXRoIGFyZSBmb2xsb3dlZCwgdGhvdWdoLCB0byBmaW5kIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuCiAgICoKICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgb25lIG9mIHRoZSBwYXRocyBwb2ludHMgdG8gYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QKICAgKiBleGlzdC4KICAgKi8KICBzdGF0aWMgYm9vbCBpZGVudGljYWxTeW5jKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfaWRlbnRpY2FsU3luYyhwYXRoMSwgcGF0aDIpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5mc2VJZGVudGljYWxTeW5jKHBhdGgxLCBwYXRoMik7CiAgfQoKICAvKioKICAgKiBUZXN0IGlmIFt3YXRjaF0gaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IHN5c3RlbS4KICAgKgogICAqIE9TIFggMTAuNiBhbmQgYmVsb3cgaXMgbm90IHN1cHBvcnRlZC4KICAgKi8KICBzdGF0aWMgYm9vbCBnZXQgaXNXYXRjaFN1cHBvcnRlZCB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBfRmlsZVN5c3RlbVdhdGNoZXIuaXNTdXBwb3J0ZWQ7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZzV2F0Y2hJc1N1cHBvcnRlZCgpOwogIH0KCiAgLy8gVGhlIG5hdGl2ZSBtZXRob2RzIHdoaWNoIGRldGVybWluZSB0eXBlIG9mIHRoZSBGaWxlU3lzdGVtRW50aXR5IHJlcXVpcmUKICAvLyB0aGF0IHRoZSBidWZmZXIgcHJvdmlkZWQgaXMgbnVsbCB0ZXJtaW5hdGVkLgogIHN0YXRpYyBVaW50OExpc3QgX3RvVXRmOEFycmF5KFN0cmluZyBzKSA9PgogICAgICBfdG9OdWxsVGVybWluYXRlZFV0ZjhBcnJheSh1dGY4LmVuY29kZShzKSk7CgogIHN0YXRpYyBVaW50OExpc3QgX3RvTnVsbFRlcm1pbmF0ZWRVdGY4QXJyYXkoVWludDhMaXN0IGwpIHsKICAgIGlmIChsID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAobC5pc05vdEVtcHR5ICYmIGwubGFzdCAhPSAwKSB7CiAgICAgIGZpbmFsIHRtcCA9IG5ldyBVaW50OExpc3QobC5sZW5ndGggKyAxKTsKICAgICAgdG1wLnNldFJhbmdlKDAsIGwubGVuZ3RoLCBsKTsKICAgICAgcmV0dXJuIHRtcDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBsOwogICAgfQogIH0KCiAgc3RhdGljIFN0cmluZyBfdG9TdHJpbmdGcm9tVXRmOEFycmF5KFVpbnQ4TGlzdCBsKSB7CiAgICBpZiAobCA9PSBudWxsKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIFVpbnQ4TGlzdCBub25OdWxsVGVybWluYXRlZCA9IGw7CiAgICBpZiAobC5sYXN0ID09IDApIHsKICAgICAgbm9uTnVsbFRlcm1pbmF0ZWQgPSBuZXcgVWludDhMaXN0LnZpZXcobC5idWZmZXIsIDAsIGwubGVuZ3RoIC0gMSk7CiAgICB9CiAgICByZXR1cm4gdXRmOC5kZWNvZGUobm9uTnVsbFRlcm1pbmF0ZWQsIGFsbG93TWFsZm9ybWVkOiB0cnVlKTsKICB9CgogIC8qKgogICAqIEZpbmRzIHRoZSB0eXBlIG9mIGZpbGUgc3lzdGVtIG9iamVjdCB0aGF0IGEgcGF0aCBwb2ludHMgdG8uCiAgICoKICAgKiBSZXR1cm5zIGEgWzpGdXR1cmU8RmlsZVN5c3RlbUVudGl0eVR5cGU+Ol0gdGhhdCBjb21wbGV0ZXMgd2l0aCB0aGUgcmVzdWx0LgogICAqCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHlUeXBlXSBoYXMgdGhlIGNvbnN0YW50IGluc3RhbmNlcyBmaWxlLCBkaXJlY3RvcnksCiAgICogbGluaywgYW5kIG5vdEZvdW5kLiAgW3R5cGVdIHdpbGwgcmV0dXJuIGxpbmsgb25seSBpZiB0aGUgb3B0aW9uYWwKICAgKiBuYW1lZCBhcmd1bWVudCBbZm9sbG93TGlua3NdIGlzIGZhbHNlLCBhbmQgW3BhdGhdIHBvaW50cyB0byBhIGxpbmsuCiAgICogSWYgdGhlIHBhdGggZG9lcyBub3QgcG9pbnQgdG8gYSBmaWxlIHN5c3RlbSBvYmplY3QsIG9yIGFueSBvdGhlciBlcnJvcgogICAqIG9jY3VycyBpbiBsb29raW5nIHVwIHRoZSBwYXRoLCBub3RGb3VuZCBpcyByZXR1cm5lZC4gIFRoZSBvbmx5CiAgICogZXJyb3Igb3IgZXhjZXB0aW9uIHRoYXQgbWF5IGJlIHB1dCBvbiB0aGUgcmV0dXJuZWQgZnV0dXJlIGlzIEFyZ3VtZW50RXJyb3IsCiAgICogY2F1c2VkIGJ5IHBhc3NpbmcgdGhlIHdyb25nIHR5cGUgb2YgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi4KICAgKi8KICBzdGF0aWMgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHlUeXBlPiB0eXBlKFN0cmluZyBwYXRoLAogICAgICB7Ym9vbCBmb2xsb3dMaW5rczogdHJ1ZX0pIHsKICAgIHJldHVybiBfZ2V0VHlwZShfdG9VdGY4QXJyYXkocGF0aCksIGZvbGxvd0xpbmtzKTsKICB9CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZmluZHMgdGhlIHR5cGUgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0IHRoYXQgYSBwYXRoIHBvaW50cyB0by4KICAgKgogICAqIFJldHVybnMgYSBbRmlsZVN5c3RlbUVudGl0eVR5cGVdLgogICAqCiAgICogW0ZpbGVTeXN0ZW1FbnRpdHlUeXBlXSBoYXMgdGhlIGNvbnN0YW50IGluc3RhbmNlcyBmaWxlLCBkaXJlY3RvcnksCiAgICogbGluaywgYW5kIG5vdEZvdW5kLiAgW3R5cGVdIHdpbGwgcmV0dXJuIGxpbmsgb25seSBpZiB0aGUgb3B0aW9uYWwKICAgKiBuYW1lZCBhcmd1bWVudCBbZm9sbG93TGlua3NdIGlzIGZhbHNlLCBhbmQgW3BhdGhdIHBvaW50cyB0byBhIGxpbmsuCiAgICogSWYgdGhlIHBhdGggZG9lcyBub3QgcG9pbnQgdG8gYSBmaWxlIHN5c3RlbSBvYmplY3QsIG9yIGFueSBvdGhlciBlcnJvcgogICAqIG9jY3VycyBpbiBsb29raW5nIHVwIHRoZSBwYXRoLCBub3RGb3VuZCBpcyByZXR1cm5lZC4gIFRoZSBvbmx5CiAgICogZXJyb3Igb3IgZXhjZXB0aW9uIHRoYXQgbWF5IGJlIHRocm93biBpcyBBcmd1bWVudEVycm9yLAogICAqIGNhdXNlZCBieSBwYXNzaW5nIHRoZSB3cm9uZyB0eXBlIG9mIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uCiAgICovCiAgc3RhdGljIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIHR5cGVTeW5jKFN0cmluZyBwYXRoLCB7Ym9vbCBmb2xsb3dMaW5rczogdHJ1ZX0pIHsKICAgIHJldHVybiBfZ2V0VHlwZVN5bmMoX3RvVXRmOEFycmF5KHBhdGgpLCBmb2xsb3dMaW5rcyk7CiAgfQoKICAvKioKICAgKiBDaGVja3MgaWYgdHlwZShwYXRoLCBmb2xsb3dMaW5rczogZmFsc2UpIHJldHVybnMgRmlsZVN5c3RlbUVudGl0eVR5cGUubGluay4KICAgKi8KICBzdGF0aWMgRnV0dXJlPGJvb2w+IGlzTGluayhTdHJpbmcgcGF0aCkgPT4gX2lzTGlua1JhdyhfdG9VdGY4QXJyYXkocGF0aCkpOwoKICBzdGF0aWMgRnV0dXJlPGJvb2w+IF9pc0xpbmtSYXcoVWludDhMaXN0IHJhd1BhdGgpID0+IF9nZXRUeXBlKHJhd1BhdGgsIGZhbHNlKQogICAgICAudGhlbigodHlwZSkgPT4gKHR5cGUgPT0gRmlsZVN5c3RlbUVudGl0eVR5cGUubGluaykpOwoKICAvKioKICAgKiBDaGVja3MgaWYgdHlwZShwYXRoKSByZXR1cm5zIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmZpbGUuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxib29sPiBpc0ZpbGUoU3RyaW5nIHBhdGgpID0+IF9nZXRUeXBlKF90b1V0ZjhBcnJheShwYXRoKSwgdHJ1ZSkKICAgICAgLnRoZW4oKHR5cGUpID0+ICh0eXBlID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmZpbGUpKTsKCiAgLyoqCiAgICogQ2hlY2tzIGlmIHR5cGUocGF0aCkgcmV0dXJucyBGaWxlU3lzdGVtRW50aXR5VHlwZS5kaXJlY3RvcnkuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxib29sPiBpc0RpcmVjdG9yeShTdHJpbmcgcGF0aCkgPT4KICAgICAgX2dldFR5cGUoX3RvVXRmOEFycmF5KHBhdGgpLCB0cnVlKQogICAgICAgICAgLnRoZW4oKHR5cGUpID0+ICh0eXBlID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmRpcmVjdG9yeSkpOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyBpZiB0eXBlU3luYyhwYXRoLCBmb2xsb3dMaW5rczogZmFsc2UpIHJldHVybnMKICAgKiBGaWxlU3lzdGVtRW50aXR5VHlwZS5saW5rLgogICAqLwogIHN0YXRpYyBib29sIGlzTGlua1N5bmMoU3RyaW5nIHBhdGgpID0+IF9pc0xpbmtSYXdTeW5jKF90b1V0ZjhBcnJheShwYXRoKSk7CgogIHN0YXRpYyBib29sIF9pc0xpbmtSYXdTeW5jKHJhd1BhdGgpID0+CiAgICAgIChfZ2V0VHlwZVN5bmMocmF3UGF0aCwgZmFsc2UpID09IEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmxpbmspOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyBpZiB0eXBlU3luYyhwYXRoKSByZXR1cm5zCiAgICogRmlsZVN5c3RlbUVudGl0eVR5cGUuZmlsZS4KICAgKi8KICBzdGF0aWMgYm9vbCBpc0ZpbGVTeW5jKFN0cmluZyBwYXRoKSA9PgogICAgICAoX2dldFR5cGVTeW5jKF90b1V0ZjhBcnJheShwYXRoKSwgdHJ1ZSkgPT0gRmlsZVN5c3RlbUVudGl0eVR5cGUuZmlsZSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgY2hlY2tzIGlmIHR5cGVTeW5jKHBhdGgpIHJldHVybnMKICAgKiBGaWxlU3lzdGVtRW50aXR5VHlwZS5kaXJlY3RvcnkuCiAgICovCiAgc3RhdGljIGJvb2wgaXNEaXJlY3RvcnlTeW5jKFN0cmluZyBwYXRoKSA9PgogICAgICAoX2dldFR5cGVTeW5jKF90b1V0ZjhBcnJheShwYXRoKSwgdHJ1ZSkgPT0KICAgICAgICAgIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLmRpcmVjdG9yeSk7CgogIGV4dGVybmFsIHN0YXRpYyBfZ2V0VHlwZU5hdGl2ZSgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIGZvbGxvd0xpbmtzKTsKICBleHRlcm5hbCBzdGF0aWMgX2lkZW50aWNhbE5hdGl2ZSgKICAgICAgX05hbWVzcGFjZSBuYW1lc3BhY2UsIFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKTsKICBleHRlcm5hbCBzdGF0aWMgX3Jlc29sdmVTeW1ib2xpY0xpbmtzKF9OYW1lc3BhY2UgbmFtZXNwYWNlLCBVaW50OExpc3QgcGF0aCk7CgogIC8vIEZpbmRzIHRoZSBuZXh0LXRvLWxhc3QgY29tcG9uZW50IHdoZW4gZGl2aWRpbmcgYXQgcGF0aCBzZXBhcmF0b3JzLgogIHN0YXRpYyBmaW5hbCBSZWdFeHAgX3BhcmVudFJlZ0V4cCA9IFBsYXRmb3JtLmlzV2luZG93cwogICAgICA/IG5ldyBSZWdFeHAocidbXi9cXF1bL1xcXStbXi9cXF0nKQogICAgICA6IG5ldyBSZWdFeHAocidbXi9dLytbXi9dJyk7CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIGZpbmFsIHBhdGggY29tcG9uZW50IG9mIGEgcGF0aCwgdXNpbmcgdGhlIHBsYXRmb3JtJ3MKICAgKiBwYXRoIHNlcGFyYXRvciB0byBzcGxpdCB0aGUgcGF0aC4KICAgKgogICAqIFdpbGwgbm90IHJlbW92ZSB0aGUgcm9vdCBjb21wb25lbnQgb2YgYSBXaW5kb3dzIHBhdGgsIGxpa2UgIkM6XFwiIG9yCiAgICogIlxcXFxzZXJ2ZXJfbmFtZVxcIi4gSWdub3JlcyB0cmFpbGluZyBwYXRoIHNlcGFyYXRvcnMsIGFuZCBsZWF2ZXMgbm8KICAgKiB0cmFpbGluZyBwYXRoIHNlcGFyYXRvcnMuCiAgICovCiAgc3RhdGljIFN0cmluZyBwYXJlbnRPZihTdHJpbmcgcGF0aCkgewogICAgaW50IHJvb3RFbmQgPSAtMTsKICAgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChfYWJzb2x1dGVXaW5kb3dzUGF0aFBhdHRlcm4pKSB7CiAgICAgICAgLy8gUm9vdCBlbmRzIGF0IGZpcnN0IC8gb3IgXCBhZnRlciB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMuCiAgICAgICAgcm9vdEVuZCA9IHBhdGguaW5kZXhPZihuZXcgUmVnRXhwKHInWy9cXF0nKSwgMik7CiAgICAgICAgaWYgKHJvb3RFbmQgPT0gLTEpIHJldHVybiBwYXRoOwogICAgICB9IGVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aCgnXFwnKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICAgIHJvb3RFbmQgPSAwOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgIHJvb3RFbmQgPSAwOwogICAgfQogICAgLy8gSWdub3JlIHRyYWlsaW5nIHNsYXNoZXMuCiAgICAvLyBBbGwgbm9uLXRyaXZpYWwgY2FzZXMgaGF2ZSBzZXBhcmF0b3JzIGJldHdlZW4gdHdvIG5vbi1zZXBhcmF0b3JzLgogICAgaW50IHBvcyA9IHBhdGgubGFzdEluZGV4T2YoX3BhcmVudFJlZ0V4cCk7CiAgICBpZiAocG9zID4gcm9vdEVuZCkgewogICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcG9zICsgMSk7CiAgICB9IGVsc2UgaWYgKHJvb3RFbmQgPiAtMSkgewogICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcm9vdEVuZCArIDEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICcuJzsKICAgIH0KICB9CgogIC8qKgogICAqIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBbdGhpc10uCiAgICovCiAgRGlyZWN0b3J5IGdldCBwYXJlbnQgPT4gbmV3IERpcmVjdG9yeShwYXJlbnRPZihwYXRoKSk7CgogIHN0YXRpYyBGaWxlU3lzdGVtRW50aXR5VHlwZSBfZ2V0VHlwZVN5bmNIZWxwZXIoCiAgICAgIFVpbnQ4TGlzdCByYXdQYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICB2YXIgcmVzdWx0ID0gX2dldFR5cGVOYXRpdmUoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCByYXdQYXRoLCBmb2xsb3dMaW5rcyk7CiAgICBfdGhyb3dJZkVycm9yKHJlc3VsdCwgJ0Vycm9yIGdldHRpbmcgdHlwZSBvZiBGaWxlU3lzdGVtRW50aXR5Jyk7CiAgICByZXR1cm4gRmlsZVN5c3RlbUVudGl0eVR5cGUuX2xvb2t1cChyZXN1bHQpOwogIH0KCiAgc3RhdGljIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIF9nZXRUeXBlU3luYygKICAgICAgVWludDhMaXN0IHJhd1BhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9nZXRUeXBlU3luY0hlbHBlcihyYXdQYXRoLCBmb2xsb3dMaW5rcyk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZzZUdldFR5cGVTeW5jKAogICAgICAgIHV0ZjguZGVjb2RlKHJhd1BhdGgsIGFsbG93TWFsZm9ybWVkOiB0cnVlKSwgZm9sbG93TGlua3MpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gX2dldFR5cGVSZXF1ZXN0KAogICAgICBVaW50OExpc3QgcmF3UGF0aCwgYm9vbCBmb2xsb3dMaW5rcykgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlVHlwZSwgW251bGwsIHJhd1BhdGgsIGZvbGxvd0xpbmtzXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZShyZXNwb25zZSwgIkVycm9yIGdldHRpbmcgdHlwZSIsCiAgICAgICAgICAgIHV0ZjguZGVjb2RlKHJhd1BhdGgsIGFsbG93TWFsZm9ybWVkOiB0cnVlKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHlUeXBlLl9sb29rdXAocmVzcG9uc2UpOwogICAgfSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHlUeXBlPiBfZ2V0VHlwZSgKICAgICAgVWludDhMaXN0IHJhd1BhdGgsIGJvb2wgZm9sbG93TGlua3MpIHsKICAgIElPT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IElPT3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICBpZiAob3ZlcnJpZGVzID09IG51bGwpIHsKICAgICAgcmV0dXJuIF9nZXRUeXBlUmVxdWVzdChyYXdQYXRoLCBmb2xsb3dMaW5rcyk7CiAgICB9CiAgICByZXR1cm4gb3ZlcnJpZGVzLmZzZUdldFR5cGUoCiAgICAgICAgdXRmOC5kZWNvZGUocmF3UGF0aCwgYWxsb3dNYWxmb3JtZWQ6IHRydWUpLCBmb2xsb3dMaW5rcyk7CiAgfQoKICBzdGF0aWMgX3Rocm93SWZFcnJvcihPYmplY3QgcmVzdWx0LCBTdHJpbmcgbXNnLCBbU3RyaW5nIHBhdGhdKSB7CiAgICBpZiAocmVzdWx0IGlzIE9TRXJyb3IpIHsKICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obXNnLCBwYXRoLCByZXN1bHQpOwogICAgfSBlbHNlIGlmIChyZXN1bHQgaXMgQXJndW1lbnRFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgfQoKICAvLyBUT0RPKGJrb255aSk6IGZpbmQgYSB3YXkgdG8gZG8gdGhpcyB3aXRoIHJhdyBwYXRocy4KICBzdGF0aWMgU3RyaW5nIF90cmltVHJhaWxpbmdQYXRoU2VwYXJhdG9ycyhTdHJpbmcgcGF0aCkgewogICAgLy8gRG9uJ3QgaGFuZGxlIGFyZ3VtZW50IGVycm9ycyBoZXJlLgogICAgaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIHBhdGg7CiAgICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CiAgICAgIHdoaWxlIChwYXRoLmxlbmd0aCA+IDEgJiYKICAgICAgICAgIChwYXRoLmVuZHNXaXRoKFBsYXRmb3JtLnBhdGhTZXBhcmF0b3IpIHx8IHBhdGguZW5kc1dpdGgoJy8nKSkpIHsKICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKHBhdGgubGVuZ3RoID4gMSAmJiBwYXRoLmVuZHNXaXRoKFBsYXRmb3JtLnBhdGhTZXBhcmF0b3IpKSB7CiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXRoOwogIH0KCiAgLy8gVE9ETyhia29ueWkpOiBmaW5kIGEgd2F5IHRvIGRvIHRoaXMgd2l0aCByYXcgcGF0aHMuCiAgc3RhdGljIFN0cmluZyBfZW5zdXJlVHJhaWxpbmdQYXRoU2VwYXJhdG9ycyhTdHJpbmcgcGF0aCkgewogICAgLy8gRG9uJ3QgaGFuZGxlIGFyZ3VtZW50IGVycm9ycyBoZXJlLgogICAgaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIHBhdGg7CiAgICBpZiAocGF0aC5pc0VtcHR5KSBwYXRoID0gJy4nOwogICAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgewogICAgICB3aGlsZSAoIXBhdGguZW5kc1dpdGgoUGxhdGZvcm0ucGF0aFNlcGFyYXRvcikgJiYgIXBhdGguZW5kc1dpdGgoJy8nKSkgewogICAgICAgIHBhdGggPSAiJHBhdGgke1BsYXRmb3JtLnBhdGhTZXBhcmF0b3J9IjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCFwYXRoLmVuZHNXaXRoKFBsYXRmb3JtLnBhdGhTZXBhcmF0b3IpKSB7CiAgICAgICAgcGF0aCA9ICIkcGF0aCR7UGxhdGZvcm0ucGF0aFNlcGFyYXRvcn0iOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGF0aDsKICB9Cn0KCi8qKgogKiBCYXNlIGV2ZW50IGNsYXNzIGVtaXR0ZWQgYnkgW0ZpbGVTeXN0ZW1FbnRpdHkud2F0Y2hdLgogKi8KY2xhc3MgRmlsZVN5c3RlbUV2ZW50IHsKICAvKioKICAgKiBCaXRmaWVsZCBmb3IgW0ZpbGVTeXN0ZW1FbnRpdHkud2F0Y2hdLCB0byBlbmFibGUgW0ZpbGVTeXN0ZW1DcmVhdGVFdmVudF1zLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgY3JlYXRlID0gMSA8PCAwOwogIEBEZXByZWNhdGVkKCJVc2UgY3JlYXRlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgQ1JFQVRFID0gMSA8PCAwOwoKICAvKioKICAgKiBCaXRmaWVsZCBmb3IgW0ZpbGVTeXN0ZW1FbnRpdHkud2F0Y2hdLCB0byBlbmFibGUgW0ZpbGVTeXN0ZW1Nb2RpZnlFdmVudF1zLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgbW9kaWZ5ID0gMSA8PCAxOwogIEBEZXByZWNhdGVkKCJVc2UgbW9kaWZ5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTU9ESUZZID0gMSA8PCAxOwoKICAvKioKICAgKiBCaXRmaWVsZCBmb3IgW0ZpbGVTeXN0ZW1FbnRpdHkud2F0Y2hdLCB0byBlbmFibGUgW0ZpbGVTeXN0ZW1EZWxldGVFdmVudF1zLgogICAqLwogIHN0YXRpYyBjb25zdCBpbnQgZGVsZXRlID0gMSA8PCAyOwogIEBEZXByZWNhdGVkKCJVc2UgZGVsZXRlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgREVMRVRFID0gMSA8PCAyOwoKICAvKioKICAgKiBCaXRmaWVsZCBmb3IgW0ZpbGVTeXN0ZW1FbnRpdHkud2F0Y2hdLCB0byBlbmFibGUgW0ZpbGVTeXN0ZW1Nb3ZlRXZlbnRdcy4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IG1vdmUgPSAxIDw8IDM7CiAgQERlcHJlY2F0ZWQoIlVzZSBtb3ZlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgTU9WRSA9IDEgPDwgMzsKCiAgLyoqCiAgICogQml0ZmllbGQgZm9yIFtGaWxlU3lzdGVtRW50aXR5LndhdGNoXSwgZm9yIGVuYWJsaW5nIGFsbCBvZiBbY3JlYXRlXSwKICAgKiBbbW9kaWZ5XSwgW2RlbGV0ZV0gYW5kIFttb3ZlXS4KICAgKi8KICBzdGF0aWMgY29uc3QgaW50IGFsbCA9IGNyZWF0ZSB8IG1vZGlmeSB8IGRlbGV0ZSB8IG1vdmU7CiAgQERlcHJlY2F0ZWQoIlVzZSBhbGwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBBTEwgPSBjcmVhdGUgfCBtb2RpZnkgfCBkZWxldGUgfCBtb3ZlOwoKICBzdGF0aWMgY29uc3QgaW50IF9tb2RpZnlBdHRyaWJ1dGVzID0gMSA8PCA0OwogIHN0YXRpYyBjb25zdCBpbnQgX2RlbGV0ZVNlbGYgPSAxIDw8IDU7CiAgc3RhdGljIGNvbnN0IGludCBfaXNEaXIgPSAxIDw8IDY7CgogIC8qKgogICAqIFRoZSB0eXBlIG9mIGV2ZW50LiBTZWUgW0ZpbGVTeXN0ZW1FdmVudF0gZm9yIGEgbGlzdCBvZiBldmVudHMuCiAgICovCiAgZmluYWwgaW50IHR5cGU7CgogIC8qKgogICAqIFRoZSBwYXRoIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudC4KICAgKgogICAqIERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gYW5kIHRoZSBGaWxlU3lzdGVtRW50aXR5LCB0aGUgcGF0aCBtYXkgYmUKICAgKiByZWxhdGl2ZS4KICAgKi8KICBmaW5hbCBTdHJpbmcgcGF0aDsKCiAgLyoqCiAgICogSXMgYHRydWVgIGlmIHRoZSBldmVudCB0YXJnZXQgd2FzIGEgZGlyZWN0b3J5LgogICAqCiAgICogTm90ZSB0aGF0IGlmIHRoZSBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQgYnkgdGhlIHRpbWUgdGhlIGV2ZW50IGhhcyBhcnJpdmVkLAogICAqIHRoaXMgd2lsbCBhbHdheXMgYmUgYGZhbHNlYCBvbiBXaW5kb3dzLiBJbiBwYXJ0aWN1bGFyLCBpdCB3aWxsIGFsd2F5cyBiZQogICAqIGBmYWxzZWAgZm9yIGBkZWxldGVgIGV2ZW50cy4KICAgKi8KICBmaW5hbCBib29sIGlzRGlyZWN0b3J5OwoKICBGaWxlU3lzdGVtRXZlbnQuXyh0aGlzLnR5cGUsIHRoaXMucGF0aCwgdGhpcy5pc0RpcmVjdG9yeSk7Cn0KCi8qKgogKiBGaWxlIHN5c3RlbSBldmVudCBmb3IgbmV3bHkgY3JlYXRlZCBmaWxlIHN5c3RlbSBvYmplY3RzLgogKi8KY2xhc3MgRmlsZVN5c3RlbUNyZWF0ZUV2ZW50IGV4dGVuZHMgRmlsZVN5c3RlbUV2ZW50IHsKICBGaWxlU3lzdGVtQ3JlYXRlRXZlbnQuXyhwYXRoLCBpc0RpcmVjdG9yeSkKICAgICAgOiBzdXBlci5fKEZpbGVTeXN0ZW1FdmVudC5jcmVhdGUsIHBhdGgsIGlzRGlyZWN0b3J5KTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIkZpbGVTeXN0ZW1DcmVhdGVFdmVudCgnJHBhdGgnKSI7Cn0KCi8qKgogKiBGaWxlIHN5c3RlbSBldmVudCBmb3IgbW9kaWZpY2F0aW9ucyBvZiBmaWxlIHN5c3RlbSBvYmplY3RzLgogKi8KY2xhc3MgRmlsZVN5c3RlbU1vZGlmeUV2ZW50IGV4dGVuZHMgRmlsZVN5c3RlbUV2ZW50IHsKICAvKioKICAgKiBJZiB0aGUgY29udGVudCB3YXMgY2hhbmdlZCBhbmQgbm90IG9ubHkgdGhlIGF0dHJpYnV0ZXMsIFtjb250ZW50Q2hhbmdlZF0KICAgKiBpcyBgdHJ1ZWAuCiAgICovCiAgZmluYWwgYm9vbCBjb250ZW50Q2hhbmdlZDsKCiAgRmlsZVN5c3RlbU1vZGlmeUV2ZW50Ll8ocGF0aCwgaXNEaXJlY3RvcnksIHRoaXMuY29udGVudENoYW5nZWQpCiAgICAgIDogc3VwZXIuXyhGaWxlU3lzdGVtRXZlbnQubW9kaWZ5LCBwYXRoLCBpc0RpcmVjdG9yeSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+CiAgICAgICJGaWxlU3lzdGVtTW9kaWZ5RXZlbnQoJyRwYXRoJywgY29udGVudENoYW5nZWQ9JGNvbnRlbnRDaGFuZ2VkKSI7Cn0KCi8qKgogKiBGaWxlIHN5c3RlbSBldmVudCBmb3IgZGVsZXRpb24gb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICovCmNsYXNzIEZpbGVTeXN0ZW1EZWxldGVFdmVudCBleHRlbmRzIEZpbGVTeXN0ZW1FdmVudCB7CiAgRmlsZVN5c3RlbURlbGV0ZUV2ZW50Ll8ocGF0aCwgaXNEaXJlY3RvcnkpCiAgICAgIDogc3VwZXIuXyhGaWxlU3lzdGVtRXZlbnQuZGVsZXRlLCBwYXRoLCBpc0RpcmVjdG9yeSk7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJGaWxlU3lzdGVtRGVsZXRlRXZlbnQoJyRwYXRoJykiOwp9CgovKioKICogRmlsZSBzeXN0ZW0gZXZlbnQgZm9yIG1vdmluZyBvZiBmaWxlIHN5c3RlbSBvYmplY3RzLgogKi8KY2xhc3MgRmlsZVN5c3RlbU1vdmVFdmVudCBleHRlbmRzIEZpbGVTeXN0ZW1FdmVudCB7CiAgLyoqCiAgICogSWYgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaXMgYWJsZSB0byBpZGVudGlmeSB0aGUgZGVzdGluYXRpb24gb2YKICAgKiB0aGUgbW92ZWQgZmlsZSwgW2Rlc3RpbmF0aW9uXSB3aWxsIGJlIHNldC4gT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGBudWxsYC4KICAgKi8KICBmaW5hbCBTdHJpbmcgZGVzdGluYXRpb247CgogIEZpbGVTeXN0ZW1Nb3ZlRXZlbnQuXyhwYXRoLCBpc0RpcmVjdG9yeSwgdGhpcy5kZXN0aW5hdGlvbikKICAgICAgOiBzdXBlci5fKEZpbGVTeXN0ZW1FdmVudC5tb3ZlLCBwYXRoLCBpc0RpcmVjdG9yeSk7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHZhciBidWZmZXIgPSBu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Y291bnQgPSAwOwoKICBzdGF0aWMgZmluYWwgU3RvcHdhdGNoIF9zdyA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICBzdGF0aWMgZmluYWwgX3N0YXJ0VGltZSA9IG5ldyBEYXRlVGltZS5ub3coKS5taWxsaXNlY29uZHNTaW5jZUVwb2NoOwoKICBzdGF0aWMgZG91YmxlIGdldCB0aW1lc3RhbXAgPT4gX3N0YXJ0VGltZSArIF9zdy5lbGFwc2VkTWljcm9zZWNvbmRzIC8gMTAwMDsKCiAgX0lPUmVzb3VyY2VJbmZvKHRoaXMudHlwZSkgOiBpZCA9IF9JT1Jlc291cmNlSW5mby5nZXROZXh0SUQoKTsKCiAgLy8vIEdldCB0aGUgZnVsbCBzZXQgb2YgdmFsdWVzIGZvciBhIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIG5vcm1hbGx5CiAgLy8vIGxvb2tlZCB1cCBiYXNlZCBvbiBhbiBpZCBmcm9tIGEgcmVmZXJlbmNlVmFsdWVNYXAuCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IGZ1bGxWYWx1ZU1hcDsKCiAgLy8vIFRoZSByZWZlcmVuY2UgbWFwLCB1c2VkIHRvIHJldHVybiBhIGxpc3Qgb2YgdmFsdWVzLCBlLmcuLCBnZXR0aW5nCiAgLy8vIGFsbCBvcGVuIHNvY2tldHMuIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBpcyBzaGFyZWQgYW1vbmcgYWxsIHN1YmNsYXNzZXMuCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IHJlZmVyZW5jZVZhbHVlTWFwID0+IHsKICAgICAgICAvLyBUaGUgdHlwZSBmb3IgYSByZWZlcmVuY2Ugb2JqZWN0IGlzIHByZWZpeGVkIHdpdGggQCBpbiBvYnNlcnZhdG9yeS4KICAgICAgICAndHlwZSc6ICdAJHR5cGUnLAogICAgICAgICdpZCc6IGlkLAogICAgICAgICduYW1lJzogbmFtZSwKICAgICAgfTsKCiAgc3RhdGljIGludCBnZXROZXh0SUQoKSA9PiBfY291bnQrKzsKfQoKYWJzdHJhY3QgY2xhc3MgX1JlYWRXcml0ZVJlc291cmNlSW5mbyBleHRlbmRzIF9JT1Jlc291cmNlSW5mbyB7CiAgaW50IHRvdGFsUmVhZDsKICBpbnQgdG90YWxXcml0dGVuOwogIGludCByZWFkQ291bnQ7CiAgaW50IHdyaXRlQ291bnQ7CiAgZG91YmxlIGxhc3RSZWFkOwogIGRvdWJsZSBsYXN0V3JpdGU7CgogIC8vIE5vdCBhbGwgY2FsbCBzaXRlcyB1c2UgdGhpcy4gSW4gc29tZSBjYXNlcywgZS5nLiwgYSBzb2NrZXQsIGEgcmVhZCBkb2VzCiAgLy8gbm90IGFsd2F5cyBtZWFuIHRoYXQgd2UgYWN0dWFsbHkgcmVhZCBzb21lIGJ5dGVzICh3ZSBtYXkgZG8gYSByZWFkIHRvIHNlZQogIC8vIGlmIHRoZXJlIGFyZSBzb21lIGJ5dGVzIGF2YWlsYWJsZSkuCiAgdm9pZCBhZGRSZWFkKGludCBieXRlcykgewogICAgdG90YWxSZWFkICs9IGJ5dGVzOwogICAgcmVhZENvdW50Kys7CiAgICBsYXN0UmVhZCA9IF9JT1Jlc291cmNlSW5mby50aW1lc3RhbXA7CiAgfQoKICAvLyBJbiBjYXNlcyB3aGVyZSB3ZSByZWFkIGJ1dCBkaWQgbm90IG5lY2Vzc2FyaWx5IGdldCBhbnkgYnl0ZXMsIHVzZSB0aGlzIHRvCiAgLy8gdXBkYXRlIHRoZSByZWFkQ291bnQgYW5kIHRpbWVzdGFtcC4gTWFudWFsbHkgdXBkYXRlIHRvdGFsUmVhZCBpZiBhbnkgYnl0ZXMKICAvLyB3aGVyZSBhY3R1YWxseSByZWFkLgogIHZvaWQgZGlkUmVhZCgpIHsKICAgIGFkZFJlYWQoMCk7CiAgfQoKICB2b2lkIGFkZFdyaXRlKGludCBieXRlcykgewogICAgdG90YWxXcml0dGVuICs9IGJ5dGVzOwogICAgd3JpdGVDb3VudCsrOwogICAgbGFzdFdyaXRlID0gX0lPUmVzb3VyY2VJbmZvLnRpbWVzdGFtcDsKICB9CgogIF9SZWFkV3JpdGVSZXNvdXJjZUluZm8oU3RyaW5nIHR5cGUpCiAgICAgIDogdG90YWxSZWFkID0gMCwKICAgICAgICB0b3RhbFdyaXR0ZW4gPSAwLAogICAgICAgIHJlYWRDb3VudCA9IDAsCiAgICAgICAgd3JpdGVDb3VudCA9IDAsCiAgICAgICAgbGFzdFJlYWQgPSAwLjAsCiAgICAgICAgbGFzdFdyaXRlID0gMC4wLAogICAgICAgIHN1cGVyKHR5cGUpOwoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgZnVsbFZhbHVlTWFwID0+IHsKICAgICAgICAndHlwZSc6IHR5cGUsCiAgICAgICAgJ2lkJzogaWQsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICd0b3RhbFJlYWQnOiB0b3RhbFJlYWQsCiAgICAgICAgJ3RvdGFsV3JpdHRlbic6IHRvdGFsV3JpdHRlbiwKICAgICAgICAncmVhZENvdW50JzogcmVhZENvdW50LAogICAgICAgICd3cml0ZUNvdW50Jzogd3JpdGVDb3VudCwKICAgICAgICAnbGFzdFJlYWQnOiBsYXN0UmVhZCwKICAgICAgICAnbGFzdFdyaXRlJzogbGFzdFdyaXRlCiAgICAgIH07Cn0KCmNsYXNzIF9GaWxlUmVzb3VyY2VJbmZvIGV4dGVuZHMgX1JlYWRXcml0ZVJlc291cmNlSW5mbyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdHlwZSA9ICdfZmlsZSc7CgogIGZpbmFsIGZpbGU7CgogIHN0YXRpYyBNYXA8aW50LCBfRmlsZVJlc291cmNlSW5mbz4gb3BlbkZpbGVzID0KICAgICAgbmV3IE1hcDxpbnQsIF9GaWxlUmVzb3VyY2VJbmZvPigpOwoKICBfRmlsZVJlc291cmNlSW5mbyh0aGlzLmZpbGUpIDogc3VwZXIoX3R5cGUpIHsKICAgIEZpbGVPcGVuZWQodGhpcyk7CiAgfQoKICBzdGF0aWMgRmlsZU9wZW5lZChfRmlsZVJlc291cmNlSW5mbyBpbmZvKSB7CiAgICBhc3NlcnQoIW9wZW5GaWxlcy5jb250YWluc0tleShpbmZvLmlkKSk7CiAgICBvcGVuRmlsZXNbaW5mby5pZF0gPSBpbmZvOwogIH0KCiAgc3RhdGljIEZpbGVDbG9zZWQoX0ZpbGVSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KG9wZW5GaWxlcy5jb250YWluc0tleShpbmZvLmlkKSk7CiAgICBvcGVuRmlsZXMucmVtb3ZlKGluZm8uaWQpOwogIH0KCiAgc3RhdGljIEl0ZXJhYmxlPE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBnZXRPcGVuRmlsZXNMaXN0KCkgewogICAgcmV0dXJuIG5ldyBMaXN0LmZyb20ob3BlbkZpbGVzLnZhbHVlcy5tYXAoKGUpID0+IGUucmVmZXJlbmNlVmFsdWVNYXApKTsKICB9CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRPcGVuRmlsZXMoZnVuY3Rpb24sIHBhcmFtcykgewogICAgYXNzZXJ0KGZ1bmN0aW9uID09ICdleHQuZGFydC5pby5nZXRPcGVuRmlsZXMnKTsKICAgIHZhciBkYXRhID0geyd0eXBlJzogJ19vcGVuZmlsZXMnLCAnZGF0YSc6IGdldE9wZW5GaWxlc0xpc3QoKX07CiAgICB2YXIganNvblZhbHVlID0ganNvbi5lbmNvZGUoZGF0YSk7CiAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShuZXcgU2VydmljZUV4dGVuc2lvblJlc3BvbnNlLnJlc3VsdChqc29uVmFsdWUpKTsKICB9CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldEZpbGVJbmZvTWFwKCkgewogICAgcmV0dXJuIGZ1bGxWYWx1ZU1hcDsKICB9CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRGaWxlSW5mb01hcEJ5SUQoZnVuY3Rpb24sIHBhcmFtcykgewogICAgYXNzZXJ0KHBhcmFtcy5jb250YWluc0tleSgnaWQnKSk7CiAgICB2YXIgaWQgPSBpbnQucGFyc2UocGFyYW1zWydpZCddKTsKICAgIHZhciByZXN1bHQgPQogICAgICAgIG9wZW5GaWxlcy5jb250YWluc0tleShpZCkgPyBvcGVuRmlsZXNbaWRdLmdldEZpbGVJbmZvTWFwKCkgOiB7fTsKICAgIHZhciBqc29uVmFsdWUgPSBqc29uLmVuY29kZShyZXN1bHQpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWUgewogICAgcmV0dXJuICcke2ZpbGUucGF0aH0nOwogIH0KfQoKY2xhc3MgX1Byb2Nlc3NSZXNvdXJjZUluZm8gZXh0ZW5kcyBfSU9SZXNvdXJjZUluZm8gewogIHN0YXRpYyBjb25zdCBTdHJpbmcgX3R5cGUgPSAnX3Byb2Nlc3MnOwogIGZpbmFsIHByb2Nlc3M7CiAgZmluYWwgZG91YmxlIHN0YXJ0ZWRBdDsKCiAgc3RhdGljIE1hcDxpbnQsIF9Qcm9jZXNzUmVzb3VyY2VJbmZvPiBzdGFydGVkUHJvY2Vzc2VzID0KICAgICAgbmV3IE1hcDxpbnQsIF9Qcm9jZXNzUmVzb3VyY2VJbmZvPigpOwoKICBfUHJvY2Vzc1Jlc291cmNlSW5mbyh0aGlzLnByb2Nlc3MpCiAgICAgIDogc3RhcnRlZEF0ID0gX0lPUmVzb3VyY2VJbmZvLnRpbWVzdGFtcCwKICAgICAgICBzdXBlcihfdHlwZSkgewogICAgUHJvY2Vzc1N0YXJ0ZWQodGhpcyk7CiAgfQoKICBTdHJpbmcgZ2V0IG5hbWUgPT4gcHJvY2Vzcy5fcGF0aDsKCiAgdm9pZCBzdG9wcGVkKCkgewogICAgUHJvY2Vzc1N0b3BwZWQodGhpcyk7CiAgfQoKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgZnVsbFZhbHVlTWFwID0+IHsKICAgICAgICAndHlwZSc6IHR5cGUsCiAgICAgICAgJ2lkJzogaWQsCiAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICdwaWQnOiBwcm9jZXNzLnBpZCwKICAgICAgICAnc3RhcnRlZEF0Jzogc3RhcnRlZEF0LAogICAgICAgICdhcmd1bWVudHMnOiBwcm9jZXNzLl9hcmd1bWVudHMsCiAgICAgICAgJ3dvcmtpbmdEaXJlY3RvcnknOgogICAgICAgICAgICBwcm9jZXNzLl93b3JraW5nRGlyZWN0b3J5ID09IG51bGwgPyAnLicgOiBwcm9jZXNzLl93b3JraW5nRGlyZWN0b3J5LAogICAgICB9OwoKICBzdGF0aWMgUHJvY2Vzc1N0YXJ0ZWQoX1Byb2Nlc3NSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KCFzdGFydGVkUHJvY2Vzc2VzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIHN0YXJ0ZWRQcm9jZXNzZXNbaW5mby5pZF0gPSBpbmZvOwogIH0KCiAgc3RhdGljIFByb2Nlc3NTdG9wcGVkKF9Qcm9jZXNzUmVzb3VyY2VJbmZvIGluZm8pIHsKICAgIGFzc2VydChzdGFydGVkUHJvY2Vzc2VzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIHN0YXJ0ZWRQcm9jZXNzZXMucmVtb3ZlKGluZm8uaWQpOwogIH0KCiAgc3RhdGljIEl0ZXJhYmxlPE1hcDxTdHJpbmcsIGR5bmFtaWM+PiBnZXRTdGFydGVkUHJvY2Vzc2VzTGlzdCgpID0+CiAgICAgIG5ldyBMaXN0LmZyb20oc3RhcnRlZFByb2Nlc3Nlcy52YWx1ZXMubWFwKChlKSA9PiBlLnJlZmVyZW5jZVZhbHVlTWFwKSk7CgogIHN0YXRpYyBGdXR1cmU8U2VydmljZUV4dGVuc2lvblJlc3BvbnNlPiBnZXRTdGFydGVkUHJvY2Vzc2VzKAogICAgICBTdHJpbmcgZnVuY3Rpb24sIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB7CiAgICBhc3NlcnQoZnVuY3Rpb24gPT0gJ2V4dC5kYXJ0LmlvLmdldFByb2Nlc3NlcycpOwogICAgdmFyIGRhdGEgPSB7J3R5cGUnOiAnX3N0YXJ0ZWRwcm9jZXNzZXMnLCAnZGF0YSc6IGdldFN0YXJ0ZWRQcm9jZXNzZXNMaXN0KCl9OwogICAgdmFyIGpzb25WYWx1ZSA9IGpzb24uZW5jb2RlKGRhdGEpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZT4gZ2V0UHJvY2Vzc0luZm9NYXBCeUlkKAogICAgICBTdHJpbmcgZnVuY3Rpb24sIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB7CiAgICB2YXIgaWQgPSBpbnQucGFyc2UocGFyYW1zWydpZCddKTsKICAgIHZhciByZXN1bHQgPSBzdGFydGVkUHJvY2Vzc2VzLmNvbnRhaW5zS2V5KGlkKQogICAgICAgID8gc3RhcnRlZFByb2Nlc3Nlc1tpZF0uZnVsbFZhbHVlTWFwCiAgICAgICAgOiB7fTsKICAgIHZhciBqc29uVmFsdWUgPSBqc29uLmVuY29kZShyZXN1bHQpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQp9CgpjbGFzcyBfU29ja2V0UmVzb3VyY2VJbmZvIGV4dGVuZHMgX1JlYWRXcml0ZVJlc291cmNlSW5mbyB7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdGNwU3RyaW5nID0gJ1RDUCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdWRwU3RyaW5nID0gJ1VEUCc7CiAgc3RhdGljIGNvbnN0IFN0cmluZyBfdHlwZSA9ICdfc29ja2V0JzsKCiAgZmluYWwgLypfTmF0aXZlU29ja2V0fCovIHNvY2tldDsKCiAgc3RhdGljIE1hcDxpbnQsIF9Tb2NrZXRSZXNvdXJjZUluZm8+IG9wZW5Tb2NrZXRzID0KICAgICAgbmV3IE1hcDxpbnQsIF9Tb2NrZXRSZXNvdXJjZUluZm8+KCk7CgogIF9Tb2NrZXRSZXNvdXJjZUluZm8odGhpcy5zb2NrZXQpIDogc3VwZXIoX3R5cGUpIHsKICAgIFNvY2tldE9wZW5lZCh0aGlzKTsKICB9CgogIFN0cmluZyBnZXQgbmFtZSB7CiAgICBpZiAoc29ja2V0LmlzTGlzdGVuaW5nKSB7CiAgICAgIHJldHVybiAnbGlzdGVuaW5nOiR7c29ja2V0LmFkZHJlc3MuaG9zdH06JHtzb2NrZXQucG9ydH0nOwogICAgfQogICAgdmFyIHJlbW90ZSA9ICcnOwogICAgdHJ5IHsKICAgICAgdmFyIHJlbW90ZUhvc3QgPSBzb2NrZXQucmVtb3RlQWRkcmVzcy5ob3N0OwogICAgICB2YXIgcmVtb3RlUG9ydCA9IHNvY2tldC5yZW1vdGVQb3J0OwogICAgICByZW1vdGUgPSAnIC0+ICRyZW1vdGVIb3N0OiRyZW1vdGVQb3J0JzsKICAgIH0gY2F0Y2ggKGUpIHt9IC8vIGlnbm9yZWQgaWYgd2UgY2FuJ3QgZ2V0IHRoZSBpbmZvcm1hdGlvbgogICAgcmV0dXJuICcke3NvY2tldC5hZGRyZXNzLmhvc3R9OiR7c29ja2V0LnBvcnR9JHJlbW90ZSc7CiAgfQoKICBzdGF0aWMgSXRlcmFibGU8TWFwPFN0cmluZywgZHluYW1pYz4+IGdldE9wZW5Tb2NrZXRzTGlzdCgpIHsKICAgIHJldHVybiBuZXcgTGlzdC5mcm9tKG9wZW5Tb2NrZXRzLnZhbHVlcy5tYXAoKGUpID0+IGUucmVmZXJlbmNlVmFsdWVNYXApKTsKICB9CgogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldFNvY2tldEluZm9NYXAoKSB7CiAgICB2YXIgcmVzdWx0ID0gZnVsbFZhbHVlTWFwOwogICAgcmVzdWx0Wydzb2NrZXRUeXBlJ10gPSBzb2NrZXQuaXNUY3AgPyBfdGNwU3RyaW5nIDogX3VkcFN0cmluZzsKICAgIHJlc3VsdFsnbGlzdGVuaW5nJ10gPSBzb2NrZXQuaXNMaXN0ZW5pbmc7CiAgICByZXN1bHRbJ2hvc3QnXSA9IHNvY2tldC5hZGRyZXNzLmhvc3Q7CiAgICByZXN1bHRbJ3BvcnQnXSA9IHNvY2tldC5wb3J0OwogICAgaWYgKCFzb2NrZXQuaXNMaXN0ZW5pbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHRbJ3JlbW90ZUhvc3QnXSA9IHNvY2tldC5yZW1vdGVBZGRyZXNzLmhvc3Q7CiAgICAgICAgcmVzdWx0WydyZW1vdGVQb3J0J10gPSBzb2NrZXQucmVtb3RlUG9ydDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIFVEUC4KICAgICAgICByZXN1bHRbJ3JlbW90ZVBvcnQnXSA9ICdOQSc7CiAgICAgICAgcmVzdWx0WydyZW1vdGVIb3N0J10gPSAnTkEnOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRbJ3JlbW90ZVBvcnQnXSA9ICdOQSc7CiAgICAgIHJlc3VsdFsncmVtb3RlSG9zdCddID0gJ05BJzsKICAgIH0KICAgIHJlc3VsdFsnYWRkcmVzc1R5cGUnXSA9IHNvY2tldC5hZGRyZXNzLnR5cGUubmFtZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgRnV0dXJlPFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZT4gZ2V0U29ja2V0SW5mb01hcEJ5SUQoCiAgICAgIFN0cmluZyBmdW5jdGlvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHsKICAgIGFzc2VydChwYXJhbXMuY29udGFpbnNLZXkoJ2lkJykpOwogICAgdmFyIGlkID0gaW50LnBhcnNlKHBhcmFtc1snaWQnXSk7CiAgICB2YXIgcmVzdWx0ID0KICAgICAgICBvcGVuU29ja2V0cy5jb250YWluc0tleShpZCkgPyBvcGVuU29ja2V0c1tpZF0uZ2V0U29ja2V0SW5mb01hcCgpIDoge307CiAgICB2YXIganNvblZhbHVlID0ganNvbi5lbmNvZGUocmVzdWx0KTsKICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKG5ldyBTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2UucmVzdWx0KGpzb25WYWx1ZSkpOwogIH0KCiAgc3RhdGljIEZ1dHVyZTxTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2U+IGdldE9wZW5Tb2NrZXRzKGZ1bmN0aW9uLCBwYXJhbXMpIHsKICAgIGFzc2VydChmdW5jdGlvbiA9PSAnZXh0LmRhcnQuaW8uZ2V0T3BlblNvY2tldHMnKTsKICAgIHZhciBkYXRhID0geyd0eXBlJzogJ19vcGVuc29ja2V0cycsICdkYXRhJzogZ2V0T3BlblNvY2tldHNMaXN0KCl9OwogICAgdmFyIGpzb25WYWx1ZSA9IGpzb24uZW5jb2RlKGRhdGEpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUobmV3IFNlcnZpY2VFeHRlbnNpb25SZXNwb25zZS5yZXN1bHQoanNvblZhbHVlKSk7CiAgfQoKICBzdGF0aWMgU29ja2V0T3BlbmVkKF9Tb2NrZXRSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KCFvcGVuU29ja2V0cy5jb250YWluc0tleShpbmZvLmlkKSk7CiAgICBvcGVuU29ja2V0c1tpbmZvLmlkXSA9IGluZm87CiAgfQoKICBzdGF0aWMgU29ja2V0Q2xvc2VkKF9Tb2NrZXRSZXNvdXJjZUluZm8gaW5mbykgewogICAgYXNzZXJ0KG9wZW5Tb2NrZXRzLmNvbnRhaW5zS2V5KGluZm8uaWQpKTsKICAgIG9wZW5Tb2NrZXRzLnJlbW92ZShpbmZvLmlkKTsKICB9Cn0KgRwATk48AREBIRUQExkBOUcBTgFBAVE5KQFITjJOGhIWCQEmAgFAERQREhMUAU1PKRwYESoEAU9QGhMQBAEdGxIrBAEmFxoXGBgZFQEtFhIWICYgIh4fCQIBOScBDgExKQEwFgQBLi0fBAEuLB8EAT1MBAFLNEMnTQQBKhkEAVEmJhFJKU0EARQbBAIBNSoRGgE7LAElLxcaBAEkARMaBAEtFhIWHCApHFEJATU0JgQBNTMmBAFFTgE/NTRRJ00EAUE1JjIsDilNBAIBOyoqKQEjATUrATQYBAEUHkAGFQoyKi4+OwQBP04EASwfQy4qIh8MOjIUECUlCA0jIwY2EwQBQDUmJhFPKU0EAU02RydNBAEyLyEEATIuIQQCAR1kYXJ0OmlvL2lvX3Jlc291cmNlX2luZm8uZGFydC5vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vaW9fc2VydmljZS5kYXJ0iCcvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKY2xhc3MgX0lPU2VydmljZSB7CiAgLy8gVGhpcyBsaXN0IG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxpc3QgaW4gcnVudGltZS9iaW4vaW9fc2VydmljZS5oCiAgc3RhdGljIGNvbnN0IGludCBmaWxlRXhpc3RzID0gMDsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVDcmVhdGUgPSAxOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZURlbGV0ZSA9IDI7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlUmVuYW1lID0gMzsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVDb3B5ID0gNDsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVPcGVuID0gNTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVSZXNvbHZlU3ltYm9saWNMaW5rcyA9IDY7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlQ2xvc2UgPSA3OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVBvc2l0aW9uID0gODsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVTZXRQb3NpdGlvbiA9IDk7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlVHJ1bmNhdGUgPSAxMDsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVMZW5ndGggPSAxMTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVMZW5ndGhGcm9tUGF0aCA9IDEyOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUxhc3RBY2Nlc3NlZCA9IDEzOwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVNldExhc3RBY2Nlc3NlZCA9IDE0OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUxhc3RNb2RpZmllZCA9IDE1OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVNldExhc3RNb2RpZmllZCA9IDE2OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUZsdXNoID0gMTc7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlUmVhZEJ5dGUgPSAxODsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVXcml0ZUJ5dGUgPSAxOTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVSZWFkID0gMjA7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlUmVhZEludG8gPSAyMTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVXcml0ZUZyb20gPSAyMjsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVDcmVhdGVMaW5rID0gMjM7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlRGVsZXRlTGluayA9IDI0OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVJlbmFtZUxpbmsgPSAyNTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVMaW5rVGFyZ2V0ID0gMjY7CiAgc3RhdGljIGNvbnN0IGludCBmaWxlVHlwZSA9IDI3OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZUlkZW50aWNhbCA9IDI4OwogIHN0YXRpYyBjb25zdCBpbnQgZmlsZVN0YXQgPSAyOTsKICBzdGF0aWMgY29uc3QgaW50IGZpbGVMb2NrID0gMzA7CiAgc3RhdGljIGNvbnN0IGludCBzb2NrZXRMb29rdXAgPSAzMTsKICBzdGF0aWMgY29uc3QgaW50IHNvY2tldExpc3RJbnRlcmZhY2VzID0gMzI7CiAgc3RhdGljIGNvbnN0IGludCBzb2NrZXRSZXZlcnNlTG9va3VwID0gMzM7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlDcmVhdGUgPSAzNDsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeURlbGV0ZSA9IDM1OwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5RXhpc3RzID0gMzY7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlDcmVhdGVUZW1wID0gMzc7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlMaXN0U3RhcnQgPSAzODsKICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdG9yeUxpc3ROZXh0ID0gMzk7CiAgc3RhdGljIGNvbnN0IGludCBkaXJlY3RvcnlMaXN0U3RvcCA9IDQwOwogIHN0YXRpYyBjb25zdCBpbnQgZGlyZWN0b3J5UmVuYW1lID0gNDE7CiAgc3RhdGljIGNvbnN0IGludCBzc2xQcm9jZXNzRmlsdGVyID0gNDI7CgogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmUgX2Rpc3BhdGNoKGludCByZXF1ZXN0LCBMaXN0IGRhdGEpOwp9CjgATk48AREBE04jIyMjISExIiUoJiQsKi0qLSMmJyImJygoKCgiJyIiJi4tKSkpLSwrKykqATwCARdkYXJ0OmlvL2lvX3NlcnZpY2UuZGFydChvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vbGluay5kYXJ0qCMvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLyoqCiAqIFtMaW5rXSBvYmplY3RzIGFyZSByZWZlcmVuY2VzIHRvIGZpbGVzeXN0ZW0gbGlua3MuCiAqCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmFic3RyYWN0IGNsYXNzIExpbmsgaW1wbGVtZW50cyBGaWxlU3lzdGVtRW50aXR5IHsKICAvKioKICAgKiBDcmVhdGVzIGEgTGluayBvYmplY3QuCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgTGluayhTdHJpbmcgcGF0aCkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IF9MaW5rKHBhdGgpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5jcmVhdGVMaW5rKHBhdGgpOwogIH0KCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGZhY3RvcnkgTGluay5mcm9tUmF3UGF0aChVaW50OExpc3QgcmF3UGF0aCkgewogICAgLy8gVE9ETyhia29ueWkpOiBoYW5kbGUgb3ZlcnJpZGVzCiAgICByZXR1cm4gbmV3IF9MaW5rLmZyb21SYXdQYXRoKHJhd1BhdGgpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtMaW5rXSBvYmplY3QuCiAgICoKICAgKiBJZiBbcGF0aF0gaXMgYSByZWxhdGl2ZSBwYXRoLCBpdCB3aWxsIGJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZQogICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHNlZSBbRGlyZWN0b3J5LmN1cnJlbnRdKSwgd2hlbiB1c2VkLgogICAqCiAgICogSWYgW3BhdGhdIGlzIGFuIGFic29sdXRlIHBhdGgsIGl0IHdpbGwgYmUgaW1tdW5lIHRvIGNoYW5nZXMgdG8gdGhlCiAgICogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KICAgKi8KICBmYWN0b3J5IExpbmsuZnJvbVVyaShVcmkgdXJpKSA9PiBuZXcgTGluayh1cmkudG9GaWxlUGF0aCgpKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHN5bWJvbGljIGxpbmsuIFJldHVybnMgYSBbOkZ1dHVyZTxMaW5rPjpdIHRoYXQgY29tcGxldGVzIHdpdGgKICAgKiB0aGUgbGluayB3aGVuIGl0IGhhcyBiZWVuIGNyZWF0ZWQuIElmIHRoZSBsaW5rIGV4aXN0cywKICAgKiB0aGUgZnV0dXJlIHdpbGwgY29tcGxldGUgd2l0aCBhbiBlcnJvci4KICAgKgogICAqIElmIFtyZWN1cnNpdmVdIGlzIGZhbHNlLCB0aGUgZGVmYXVsdCwgdGhlIGxpbmsgaXMgY3JlYXRlZAogICAqIG9ubHkgaWYgYWxsIGRpcmVjdG9yaWVzIGluIGl0cyBwYXRoIGV4aXN0LgogICAqIElmIFtyZWN1cnNpdmVdIGlzIHRydWUsIGFsbCBub24tZXhpc3RpbmcgcGF0aAogICAqIGNvbXBvbmVudHMgYXJlIGNyZWF0ZWQuIFRoZSBkaXJlY3RvcmllcyBpbiB0aGUgcGF0aCBvZiBbdGFyZ2V0XSBhcmUKICAgKiBub3QgYWZmZWN0ZWQsIHVubGVzcyB0aGV5IGFyZSBhbHNvIGluIFtwYXRoXS4KICAgKgogICAqIE9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtLCB0aGlzIGNhbGwgd2lsbCBjcmVhdGUgYSB0cnVlIHN5bWJvbGljIGxpbmsKICAgKiBpbnN0ZWFkIG9mIGEgSnVuY3Rpb24uIEluIG9yZGVyIHRvIGNyZWF0ZSBhIHN5bWJvbGljIGxpbmsgb24gV2luZG93cywgRGFydAogICAqIG11c3QgYmUgcnVuIGluIEFkbWluaXN0cmF0b3IgbW9kZSBvciB0aGUgc3lzdGVtIG11c3QgaGF2ZSBEZXZlbG9wZXIgTW9kZQogICAqIGVuYWJsZWQsIG90aGVyd2lzZSBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSB3aWxsIGJlIHJhaXNlZCB3aXRoIAogICAqIGBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTERgIHNldCBhcyB0aGUgZXJybm8gd2hlbiB0aGlzIGNhbGwgaXMgbWFkZS4KICAgKgogICAqIE9uIG90aGVyIHBsYXRmb3JtcywgdGhlIHBvc2l4IHN5bWxpbmsoKSBjYWxsIGlzIHVzZWQgdG8gbWFrZSBhIHN5bWJvbGljCiAgICogbGluayBjb250YWluaW5nIHRoZSBzdHJpbmcgW3RhcmdldF0uICBJZiBbdGFyZ2V0XSBpcyBhIHJlbGF0aXZlIHBhdGgsCiAgICogaXQgd2lsbCBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpbmsuCiAgICovCiAgRnV0dXJlPExpbms+IGNyZWF0ZShTdHJpbmcgdGFyZ2V0LCB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgY3JlYXRlIHRoZSBsaW5rLiBDYWxsaW5nIFtjcmVhdGVTeW5jXSBvbiBhbiBleGlzdGluZyBsaW5rCiAgICogd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCiAgICoKICAgKiBJZiBbcmVjdXJzaXZlXSBpcyBmYWxzZSwgdGhlIGRlZmF1bHQsIHRoZSBsaW5rIGlzIGNyZWF0ZWQgb25seSBpZiBhbGwKICAgKiBkaXJlY3RvcmllcyBpbiBpdHMgcGF0aCBleGlzdC4gSWYgW3JlY3Vyc2l2ZV0gaXMgdHJ1ZSwgYWxsCiAgICogbm9uLWV4aXN0aW5nIHBhdGggY29tcG9uZW50cyBhcmUgY3JlYXRlZC4gVGhlIGRpcmVjdG9yaWVzIGluCiAgICogdGhlIHBhdGggb2YgW3RhcmdldF0gYXJlIG5vdCBhZmZlY3RlZCwgdW5sZXNzIHRoZXkgYXJlIGFsc28gaW4gW3BhdGhdLgogICAqCiAgICogT24gdGhlIFdpbmRvd3MgcGxhdGZvcm0sIHRoaXMgY2FsbCB3aWxsIGNyZWF0ZSBhIHRydWUgc3ltYm9saWMgbGluawogICAqIGluc3RlYWQgb2YgYSBKdW5jdGlvbi4gSW4gb3JkZXIgdG8gY3JlYXRlIGEgc3ltYm9saWMgbGluayBvbiBXaW5kb3dzLCBEYXJ0CiAgICogbXVzdCBiZSBydW4gaW4gQWRtaW5pc3RyYXRvciBtb2RlIG9yIHRoZSBzeXN0ZW0gbXVzdCBoYXZlIERldmVsb3BlciBNb2RlCiAgICogZW5hYmxlZCwgb3RoZXJ3aXNlIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIHdpbGwgYmUgcmFpc2VkIHdpdGggCiAgICogYEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRGAgc2V0IGFzIHRoZSBlcnJubyB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLgogICAqCiAgICogT24gb3RoZXIgcGxhdGZvcm1zLCB0aGUgcG9zaXggc3ltbGluaygpIGNhbGwgaXMgdXNlZCB0byBtYWtlIGEgc3ltYm9saWMKICAgKiBsaW5rIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBbdGFyZ2V0XS4gIElmIFt0YXJnZXRdIGlzIGEgcmVsYXRpdmUgcGF0aCwKICAgKiBpdCB3aWxsIGJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbGluay4KICAgKi8KICB2b2lkIGNyZWF0ZVN5bmMoU3RyaW5nIHRhcmdldCwge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pOwoKICAvKioKICAgKiBTeW5jaHJvbm91c2x5IHVwZGF0ZXMgdGhlIGxpbmsuIENhbGxpbmcgW3VwZGF0ZVN5bmNdIG9uIGEgbm9uLWV4aXN0aW5nIGxpbmsKICAgKiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KICAgKi8KICB2b2lkIHVwZGF0ZVN5bmMoU3RyaW5nIHRhcmdldCk7CgogIC8qKgogICAqIFVwZGF0ZXMgdGhlIGxpbmsuIFJldHVybnMgYSBbOkZ1dHVyZTxMaW5rPjpdIHRoYXQgY29tcGxldGVzIHdpdGggdGhlCiAgICogbGluayB3aGVuIGl0IGhhcyBiZWVuIHVwZGF0ZWQuICBDYWxsaW5nIFt1cGRhdGVdIG9uIGEgbm9uLWV4aXN0aW5nIGxpbmsKICAgKiB3aWxsIGNvbXBsZXRlIGl0cyByZXR1cm5lZCBmdXR1cmUgd2l0aCBhbiBleGNlcHRpb24uCiAgICovCiAgRnV0dXJlPExpbms+IHVwZGF0ZShTdHJpbmcgdGFyZ2V0KTsKCiAgRnV0dXJlPFN0cmluZz4gcmVzb2x2ZVN5bWJvbGljTGlua3MoKTsKCiAgU3RyaW5nIHJlc29sdmVTeW1ib2xpY0xpbmtzU3luYygpOwoKICAvKioKICAgKiBSZW5hbWVzIHRoaXMgbGluay4gUmV0dXJucyBhIGBGdXR1cmU8TGluaz5gIHRoYXQgY29tcGxldGVzCiAgICogd2l0aCBhIFtMaW5rXSBpbnN0YW5jZSBmb3IgdGhlIHJlbmFtZWQgbGluay4KICAgKgogICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGxpbmssIHRoYXQgbGluayBpcwogICAqIHJlcGxhY2VkLiBJZiBbbmV3UGF0aF0gaWRlbnRpZmllcyBhbiBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwKICAgKiB0aGUgb3BlcmF0aW9uIGZhaWxzIGFuZCB0aGUgZnV0dXJlIGNvbXBsZXRlcyB3aXRoIGFuIGV4Y2VwdGlvbi4KICAgKi8KICBGdXR1cmU8TGluaz4gcmVuYW1lKFN0cmluZyBuZXdQYXRoKTsKCiAgLyoqCiAgICogU3luY2hyb25vdXNseSByZW5hbWVzIHRoaXMgbGluay4gUmV0dXJucyBhIFtMaW5rXQogICAqIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBsaW5rLgogICAqCiAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgbGluaywgdGhhdCBsaW5rIGlzCiAgICogcmVwbGFjZWQuIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5CiAgICogdGhlIG9wZXJhdGlvbiBmYWlscyBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICBMaW5rIHJlbmFtZVN5bmMoU3RyaW5nIG5ld1BhdGgpOwoKICAvKioKICAgKiBSZXR1cm5zIGEgW0xpbmtdIGluc3RhbmNlIHdob3NlIHBhdGggaXMgdGhlIGFic29sdXRlIHBhdGggdG8gW3RoaXNdLgogICAqCiAgICogVGhlIGFic29sdXRlIHBhdGggaXMgY29tcHV0ZWQgYnkgcHJlZml4aW5nCiAgICogYSByZWxhdGl2ZSBwYXRoIHdpdGggdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCByZXR1cm5pbmcKICAgKiBhbiBhYnNvbHV0ZSBwYXRoIHVuY2hhbmdlZC4KICAgKi8KICBMaW5rIGdldCBhYnNvbHV0ZTsKCiAgLyoqCiAgICogR2V0cyB0aGUgdGFyZ2V0IG9mIHRoZSBsaW5rLiBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgY29tcGxldGVzIHdpdGgKICAgKiB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0LgogICAqCiAgICogSWYgdGhlIHJldHVybmVkIHRhcmdldCBpcyBhIHJlbGF0aXZlIHBhdGgsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZQogICAqIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaW5rLgogICAqCiAgICogSWYgdGhlIGxpbmsgZG9lcyBub3QgZXhpc3QsIG9yIGlzIG5vdCBhIGxpbmssIHRoZSBmdXR1cmUgY29tcGxldGVzIHdpdGgKICAgKiBhIEZpbGVTeXN0ZW1FeGNlcHRpb24uCiAgICovCiAgRnV0dXJlPFN0cmluZz4gdGFyZ2V0KCk7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgZ2V0cyB0aGUgdGFyZ2V0IG9mIHRoZSBsaW5rLiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSB0YXJnZXQuCiAgICoKICAgKiBJZiB0aGUgcmV0dXJuZWQgdGFyZ2V0IGlzIGEgcmVsYXRpdmUgcGF0aCwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlCiAgICogZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpbmsuCiAgICoKICAgKiBJZiB0aGUgbGluayBkb2VzIG5vdCBleGlzdCwgb3IgaXMgbm90IGEgbGluaywgdGhyb3dzIGEgRmlsZVN5c3RlbUV4Y2VwdGlvbi4KICAgKi8KICBTdHJpbmcgdGFyZ2V0U3luYygpOwp9CgpjbGFzcyBfTGluayBleHRlbmRzIEZpbGVTeXN0ZW1FbnRpdHkgaW1wbGVtZW50cyBMaW5rIHsKICBTdHJpbmcgX3BhdGg7CiAgVWludDhMaXN0IF9yYXdQYXRoOwoKICBfTGluayhTdHJpbmcgcGF0aCkgewogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwocGF0aCwgJ3BhdGgnKTsKICAgIF9wYXRoID0gcGF0aDsKICAgIF9yYXdQYXRoID0gRmlsZVN5c3RlbUVudGl0eS5fdG9VdGY4QXJyYXkocGF0aCk7CiAgfQoKICBfTGluay5mcm9tUmF3UGF0aChVaW50OExpc3QgcmF3UGF0aCkgewogICAgX3Jhd1BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b051bGxUZXJtaW5hdGVkVXRmOEFycmF5KHJhd1BhdGgpOwogICAgX3BhdGggPSBGaWxlU3lzdGVtRW50aXR5Ll90b1N0cmluZ0Zyb21VdGY4QXJyYXkocmF3UGF0aCk7CiAgfQoKICBTdHJpbmcgZ2V0IHBhdGggPT4gX3BhdGg7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJMaW5rOiAnJHBhdGgnIjsKCiAgRnV0dXJlPGJvb2w+IGV4aXN0cygpID0+IEZpbGVTeXN0ZW1FbnRpdHkuX2lzTGlua1JhdyhfcmF3UGF0aCk7CgogIGJvb2wgZXhpc3RzU3luYygpID0+IEZpbGVTeXN0ZW1FbnRpdHkuX2lzTGlua1Jhd1N5bmMoX3Jhd1BhdGgpOwoKICBMaW5rIGdldCBhYnNvbHV0ZSA9PiBuZXcgTGluay5mcm9tUmF3UGF0aChfcmF3QWJzb2x1dGVQYXRoKTsKCiAgRnV0dXJlPExpbms+IGNyZWF0ZShTdHJpbmcgdGFyZ2V0LCB7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgdmFyIHJlc3VsdCA9CiAgICAgICAgcmVjdXJzaXZlID8gcGFyZW50LmNyZWF0ZShyZWN1cnNpdmU6IHRydWUpIDogbmV3IEZ1dHVyZS52YWx1ZShudWxsKTsKICAgIHJldHVybiByZXN1bHQKICAgICAgICAudGhlbigoXykgPT4gX0ZpbGUuX2Rpc3BhdGNoV2l0aE5hbWVzcGFjZSgKICAgICAgICAgICAgX0lPU2VydmljZS5maWxlQ3JlYXRlTGluaywgW251bGwsIF9yYXdQYXRoLCB0YXJnZXRdKSkKICAgICAgICAudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZSgKICAgICAgICAgICAgcmVzcG9uc2UsICJDYW5ub3QgY3JlYXRlIGxpbmsgdG8gdGFyZ2V0ICckdGFyZ2V0JyIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CiAgfQoKICB2b2lkIGNyZWF0ZVN5bmMoU3RyaW5nIHRhcmdldCwge2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcGFyZW50LmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfRmlsZS5fY3JlYXRlTGluayhfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoLCB0YXJnZXQpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBjcmVhdGUgbGluayIsIHBhdGgpOwogIH0KCiAgdm9pZCB1cGRhdGVTeW5jKFN0cmluZyB0YXJnZXQpIHsKICAgIC8vIFRPRE8oMTI0MTQpOiBSZXBsYWNlIHdpdGggYXRvbWljIHVwZGF0ZSwgd2hlcmUgc3VwcG9ydGVkIGJ5IHBsYXRmb3JtLgogICAgLy8gQXRvbWljYWxseSBjaGFuZ2luZyBhIGxpbmsgY2FuIGJlIGRvbmUgYnkgY3JlYXRpbmcgdGhlIG5ldyBsaW5rLCB3aXRoCiAgICAvLyBhIGRpZmZlcmVudCBuYW1lLCBhbmQgdXNpbmcgdGhlIHJlbmFtZSgpIHBvc2l4IGNhbGwgdG8gbW92ZSBpdCB0bwogICAgLy8gdGhlIG9sZCBuYW1lIGF0b21pY2FsbHkuCiAgICBkZWxldGVTeW5jKCk7CiAgICBjcmVhdGVTeW5jKHRhcmdldCk7CiAgfQoKICBGdXR1cmU8TGluaz4gdXBkYXRlKFN0cmluZyB0YXJnZXQpIHsKICAgIC8vIFRPRE8oMTI0MTQpOiBSZXBsYWNlIHdpdGggYXRvbWljIHVwZGF0ZSwgd2hlcmUgc3VwcG9ydGVkIGJ5IHBsYXRmb3JtLgogICAgLy8gQXRvbWljYWxseSBjaGFuZ2luZyBhIGxpbmsgY2FuIGJlIGRvbmUgYnkgY3JlYXRpbmcgdGhlIG5ldyBsaW5rLCB3aXRoCiAgICAvLyBhIGRpZmZlcmVudCBuYW1lLCBhbmQgdXNpbmcgdGhlIHJlbmFtZSgpIHBvc2l4IGNhbGwgdG8gbW92ZSBpdCB0bwogICAgLy8gdGhlIG9sZCBuYW1lIGF0b21pY2FsbHkuCiAgICByZXR1cm4gZGVsZXRlKCkudGhlbjxMaW5rPigoXykgPT4gY3JlYXRlKHRhcmdldCkpOwogIH0KCiAgRnV0dXJlPExpbms+IF9kZWxldGUoe2Jvb2wgcmVjdXJzaXZlOiBmYWxzZX0pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnkuZnJvbVJhd1BhdGgoX3Jhd1BhdGgpCiAgICAgICAgICAuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSkKICAgICAgICAgIC50aGVuKChfKSA9PiB0aGlzKTsKICAgIH0KICAgIHJldHVybiBfRmlsZS5fZGlzcGF0Y2hXaXRoTmFtZXNwYWNlKAogICAgICAgIF9JT1NlcnZpY2UuZmlsZURlbGV0ZUxpbmssIFtudWxsLCBfcmF3UGF0aF0pLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSkgewogICAgICAgIHRocm93IF9leGNlcHRpb25Gcm9tUmVzcG9uc2UocmVzcG9uc2UsICJDYW5ub3QgZGVsZXRlIGxpbmsiLCBwYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwogIH0KCiAgdm9pZCBfZGVsZXRlU3luYyh7Ym9vbCByZWN1cnNpdmU6IGZhbHNlfSkgewogICAgaWYgKHJlY3Vyc2l2ZSkgewogICAgICByZXR1cm4gbmV3IERpcmVjdG9yeS5mcm9tUmF3UGF0aChfcmF3UGF0aCkuZGVsZXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwogICAgfQogICAgdmFyIHJlc3VsdCA9IF9GaWxlLl9kZWxldGVMaW5rTmF0aXZlKF9OYW1lc3BhY2UuX25hbWVzcGFjZSwgX3Jhd1BhdGgpOwogICAgdGhyb3dJZkVycm9yKHJlc3VsdCwgIkNhbm5vdCBkZWxldGUgbGluayIsIHBhdGgpOwogIH0KCiAgRnV0dXJlPExpbms+IHJlbmFtZShTdHJpbmcgbmV3UGF0aCkgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlUmVuYW1lTGluaywgW251bGwsIF9yYXdQYXRoLCBuZXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZSgKICAgICAgICAgICAgcmVzcG9uc2UsICJDYW5ub3QgcmVuYW1lIGxpbmsgdG8gJyRuZXdQYXRoJyIsIHBhdGgpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgTGluayhuZXdQYXRoKTsKICAgIH0pOwogIH0KCiAgTGluayByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKSB7CiAgICB2YXIgcmVzdWx0ID0gX0ZpbGUuX3JlbmFtZUxpbmsoX05hbWVzcGFjZS5fbmFtZXNwYWNlLCBfcmF3UGF0aCwgbmV3UGF0aCk7CiAgICB0aHJvd0lmRXJyb3IocmVzdWx0LCAiQ2Fubm90IHJlbmFtZSBsaW5rICckcGF0aCcgdG8gJyRuZXdQYXRoJyIpOwogICAgcmV0dXJuIG5ldyBMaW5rKG5ld1BhdGgpOwogIH0KCiAgRnV0dXJlPFN0cmluZz4gdGFyZ2V0KCkgewogICAgcmV0dXJuIF9GaWxlLl9kaXNwYXRjaFdpdGhOYW1lc3BhY2UoCiAgICAgICAgX0lPU2VydmljZS5maWxlTGlua1RhcmdldCwgW251bGwsIF9yYXdQYXRoXSkudGhlbigocmVzcG9uc2UpIHsKICAgICAgaWYgKF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbkZyb21SZXNwb25zZSgKICAgICAgICAgICAgcmVzcG9uc2UsICJDYW5ub3QgZ2V0IHRhcmdldCBvZiBsaW5rIiwgcGF0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSk7CiAgfQoKICBTdHJpbmcgdGFyZ2V0U3luYygpIHsKICAgIHZhciByZXN1bHQgPSBfRmlsZS5fbGlua1RhcmdldChfTmFtZXNwYWNlLl9uYW1lc3BhY2UsIF9yYXdQYXRoKTsKICAgIHRocm93SWZFcnJvcihyZXN1bHQsICJDYW5ub3QgcmVhZCBsaW5rIiwgcGF0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIHRocm93SWZFcnJvcihPYmplY3QgcmVzdWx0LCBTdHJpbmcgbXNnLCBbU3RyaW5nIHBhdGggPSAiIl0pIHsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUV4Y2VwdGlvbihtc2csIHBhdGgsIHJlc3VsdCk7CiAgICB9CiAgfQoKICBib29sIF9pc0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpIHsKICAgIHJldHVybiByZXNwb25zZSBpcyBMaXN0ICYmIHJlc3BvbnNlWzBdICE9IF9zdWNjZXNzUmVzcG9uc2U7CiAgfQoKICBfZXhjZXB0aW9uRnJvbVJlc3BvbnNlKHJlc3BvbnNlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBhdGgpIHsKICAgIGFzc2VydChfaXNFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSk7CiAgICBzd2l0Y2ggKHJlc3BvbnNlW19lcnJvclJlc3BvbnNlRXJyb3JUeXBlXSkgewogICAgICBjYXNlIF9pbGxlZ2FsQXJndW1lbnRSZXNwb25zZToKICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50RXJyb3IoKTsKICAgICAgY2FzZSBfb3NFcnJvclJlc3BvbnNlOgogICAgICAgIHZhciBlcnIgPSBuZXcgT1NFcnJvcihyZXNwb25zZVtfb3NFcnJvclJlc3BvbnNlTWVzc2FnZV0sCiAgICAgICAgICAgIHJlc3BvbnNlW19vc0Vycm9yUmVzcG9uc2VFcnJvckNvZGVdKTsKICAgICAgICByZXR1cm4gbmV3IEZpbGVTeXN0ZW1FeGNlcHRpb24obWVzc2FnZSwgcGF0aCwgZXJyKTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbmV3IEV4Y2VwdGlvbigiVW5rbm93biBlcnJvciIpOwogICAgfQogIH0KfQqBLgBOTjwBEQEENgMEGjIGHAYcHjcdHgYnBAEcMCYrBAEGHgVKRQVIIAY/AQZNPC0FPzAzSTMFSVBORUkFTUtLBj8BBk0eBUtAQkwFSVBORUkFTUtLBjsBBlEeBiIBBkpNOgYmASkBJQEGQDIFPEZFBicBBjckBTxFNQYjAQZKBTBHIQYVAQZHHQVGJAVNHAYbAQZQBUYkBVEGFwIBNxAWARcuEjQEASlFPgQBHAEoAUIBQgE/AUARTRIzQhsoJkcIEwgEATwVKgZNNgQBI01NSSASGAQBJ01NSSA3BAEyFTEjHgYpRyhMCBMIBAEuFU4GSzYEASgpUCgmQQggCAQBJE5GHgQBHClHKCY6CBcIBAEYRTQTBAFHHTgGBAEkQAQBQigxJSQdQTI8Dy8GBAIBEWRhcnQ6aW8vbGluay5kYXJ0Mm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9uYW1lc3BhY2VfaW1wbC5kYXJ0hH4vLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmlvOwoKLy8gRWFjaCBJc29sYXRlIG1heSBydW4gaW4gYSBkaWZmZXJlbnQgIm5hbWVzcGFjZSIsIHdoaWNoIHByb3ZpZGVzIHRoZSBzY29wZSBpbgovLyB3aGljaCBmaWxlIHBhdGhzIGFyZSByZXNvbHZlZC4KYWJzdHJhY3QgY2xhc3MgX05hbWVzcGFjZSB7CiAgLy8gVGhpcyBnZXR0ZXIgZG9lcyBub3QgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgdW5kZXJseWluZyBuYXRpdmUKICAvLyBvYmplY3QuIEl0IGNhbm5vdCBiZSBwYXNzZWQgaW4gYSBkaXNwYXRjaCBtZXNzYWdlIHRvIHRoZSBJT1NlcnZpY2UgdGhyZWFkLgogIGV4dGVybmFsIHN0YXRpYyBfTmFtZXNwYWNlIGdldCBfbmFtZXNwYWNlOwoKICAvLyBUaGlzIGdldHRlciBkb2VzIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIHVuZGVybHlpbmcgbmF0aXZlCiAgLy8gb2JqZWN0LiBJdCBtdXN0IGJlIHBhc3NlZCBpbiBhIGRpc3BhdGNoIG1lc3NhZ2UgdG8gdGhlIElPU2VydmljZSB0aHJlYWQuCiAgZXh0ZXJuYWwgc3RhdGljIGludCBnZXQgX25hbWVzcGFjZVBvaW50ZXI7CgogIC8vIFRoaXMgc2V0cyB1cCB0aGUgSXNvbGF0ZSdzIG5hbWVzcGFjZS4gSXQgc2hvdWxkIGJlIHNldCB1cCBieSB0aGUgZW1iZWRkZXIuCiAgLy8gSWYgaXQgaXMgbm90IHNldCB1cCBieSB0aGUgZW1iZWRkZXIsIHJlbGF0aXZlIHBhdGhzIHdpbGwgYmUgcmVzb2x2ZWQKICAvLyByZWxhdGl2ZSB0byB0aGUgcHJvY2VzcydzIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYW5kIGFic29sdXRlIHBhdGhzIHdpbGwKICAvLyBiZSBsZWZ0IHJlbGF0aXZlIHRvIHRoZSBmaWxlIHN5c3RlbSByb290LgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBleHRlcm5hbCBzdGF0aWMgdm9pZCBfc2V0dXBOYW1lc3BhY2UodmFyIG5hbWVzcGFjZSk7Cn0KGgBOTjwBEQFQIhxQUC0BTE4tAVBKUS8cNwIBG2RhcnQ6aW8vbmFtZXNwYWNlX2ltcGwuZGFydC1vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vb3ZlcnJpZGVzLmRhcnS6pS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgpmaW5hbCBfaW9PdmVycmlkZXNUb2tlbiA9IG5ldyBPYmplY3QoKTsKCmNvbnN0IF9hc3luY1J1blpvbmVkID0gcnVuWm9uZWQ7CgovLy8gVGhpcyBjbGFzcyBmYWNpbGl0YXRlcyBvdmVycmlkaW5nIHZhcmlvdXMgQVBJcyBvZiBkYXJ0OmlvIHdpdGggbW9jawovLy8gaW1wbGVtZW50YXRpb25zLgovLy8KLy8vIFRoaXMgYWJzdHJhY3QgYmFzZSBjbGFzcyBzaG91bGQgYmUgZXh0ZW5kZWQgd2l0aCBvdmVycmlkZXMgZm9yIHRoZQovLy8gb3BlcmF0aW9ucyBuZWVkZWQgdG8gY29uc3RydWN0IG1vY2tzLiBUaGUgaW1wbGVtZW50YXRpb25zIGluIHRoaXMgYmFzZSBjbGFzcwovLy8gZGVmYXVsdCB0byB0aGUgYWN0dWFsIGRhcnQ6aW8gaW1wbGVtZW50YXRpb24uIEZvciBleGFtcGxlOgovLy8KLy8vIGBgYAovLy8gY2xhc3MgTXlEaXJlY3RvcnkgaW1wbGVtZW50cyBEaXJlY3RvcnkgewovLy8gICAuLi4KLy8vICAgLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERpcmVjdG9yeSBpbnRlcmZhY2UKLy8vICAgLi4uCi8vLyB9Ci8vLwovLy8gbWFpbigpIHsKLy8vICAgSU9PdmVycmlkZXMucnVuWm9uZWQoKCkgewovLy8gICAgIC4uLgovLy8gICAgIC8vIE9wZXJhdGlvbnMgd2lsbCB1c2UgTXlEaXJlY3RvcnkgaW5zdGVhZCBvZiBkYXJ0OmlvJ3MgRGlyZWN0b3J5Ci8vLyAgICAgLy8gaW1wbGVtZW50YXRpb24gd2hlbmV2ZXIgRGlyZWN0b3J5IGlzIHVzZWQuCi8vLyAgICAgLi4uCi8vLyAgIH0sIGNyZWF0ZURpcmVjdG9yeTogKFN0cmluZyBwYXRoKSA9PiBuZXcgTXlEaXJlY3RvcnkocGF0aCkpOwovLy8gfQovLy8gYGBgCmFic3RyYWN0IGNsYXNzIElPT3ZlcnJpZGVzIHsKICBzdGF0aWMgSU9PdmVycmlkZXMgX2dsb2JhbDsKCiAgc3RhdGljIElPT3ZlcnJpZGVzIGdldCBjdXJyZW50IHsKICAgIHJldHVybiBab25lLmN1cnJlbnRbX2lvT3ZlcnJpZGVzVG9rZW5dID8/IF9nbG9iYWw7CiAgfQoKICAvLy8gVGhlIFtJT092ZXJyaWRlc10gdG8gdXNlIGluIHRoZSByb290IFtab25lXS4KICAvLy8KICAvLy8gVGhlc2UgYXJlIHRoZSBbSU9PdmVycmlkZXNdIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSByb290IFpvbmUsIGFuZCBpbgogIC8vLyBab25lJ3MgdGhhdCBkbyBub3Qgc2V0IFtJT092ZXJyaWRlc10gYW5kIHdob3NlIGFuY2VzdG9ycyB1cCB0byB0aGUgcm9vdAogIC8vLyBab25lIGRvIG5vdCBzZXQgW0lPT3ZlcnJpZGVzXS4KICBzdGF0aWMgc2V0IGdsb2JhbChJT092ZXJyaWRlcyBvdmVycmlkZXMpIHsKICAgIF9nbG9iYWwgPSBvdmVycmlkZXM7CiAgfQoKICAvLy8gUnVucyBbYm9keV0gaW4gYSBmcmVzaCBbWm9uZV0gdXNpbmcgdGhlIHByb3ZpZGVkIG92ZXJyaWRlcy4KICAvLy8KICAvLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb2YgSU9PdmVycmlkZXMgZm9yCiAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBkby4KICBzdGF0aWMgUiBydW5ab25lZDxSPihSIGJvZHkoKSwKICAgICAgewogICAgICAvLyBEaXJlY3RvcnkKICAgICAgRGlyZWN0b3J5IEZ1bmN0aW9uKFN0cmluZykgY3JlYXRlRGlyZWN0b3J5LAogICAgICBEaXJlY3RvcnkgRnVuY3Rpb24oKSBnZXRDdXJyZW50RGlyZWN0b3J5LAogICAgICB2b2lkIEZ1bmN0aW9uKFN0cmluZykgc2V0Q3VycmVudERpcmVjdG9yeSwKICAgICAgRGlyZWN0b3J5IEZ1bmN0aW9uKCkgZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSwKCiAgICAgIC8vIEZpbGUKICAgICAgRmlsZSBGdW5jdGlvbihTdHJpbmcpIGNyZWF0ZUZpbGUsCgogICAgICAvLyBGaWxlU3RhdAogICAgICBGdXR1cmU8RmlsZVN0YXQ+IEZ1bmN0aW9uKFN0cmluZykgc3RhdCwKICAgICAgRmlsZVN0YXQgRnVuY3Rpb24oU3RyaW5nKSBzdGF0U3luYywKCiAgICAgIC8vIEZpbGVTeXN0ZW1FbnRpdHkKICAgICAgRnV0dXJlPGJvb2w+IEZ1bmN0aW9uKFN0cmluZywgU3RyaW5nKSBmc2VJZGVudGljYWwsCiAgICAgIGJvb2wgRnVuY3Rpb24oU3RyaW5nLCBTdHJpbmcpIGZzZUlkZW50aWNhbFN5bmMsCiAgICAgIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gRnVuY3Rpb24oU3RyaW5nLCBib29sKSBmc2VHZXRUeXBlLAogICAgICBGaWxlU3lzdGVtRW50aXR5VHlwZSBGdW5jdGlvbihTdHJpbmcsIGJvb2wpIGZzZUdldFR5cGVTeW5jLAoKICAgICAgLy8gX0ZpbGVTeXN0ZW1XYXRjaGVyCiAgICAgIFN0cmVhbTxGaWxlU3lzdGVtRXZlbnQ+IEZ1bmN0aW9uKFN0cmluZywgaW50LCBib29sKSBmc1dhdGNoLAogICAgICBib29sIEZ1bmN0aW9uKCkgZnNXYXRjaElzU3VwcG9ydGVkLAoKICAgICAgLy8gTGluawogICAgICBMaW5rIEZ1bmN0aW9uKFN0cmluZykgY3JlYXRlTGluaywKCiAgICAgIC8vIFNvY2tldAogICAgICBGdXR1cmU8U29ja2V0PiBGdW5jdGlvbihkeW5hbWljLCBpbnQsCiAgICAgICAgICAgICAge2R5bmFtaWMgc291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dH0pCiAgICAgICAgICBzb2NrZXRDb25uZWN0LAogICAgICBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gRnVuY3Rpb24oZHluYW1pYywgaW50LAogICAgICAgICAgICAgIHtkeW5hbWljIHNvdXJjZUFkZHJlc3N9KQogICAgICAgICAgc29ja2V0U3RhcnRDb25uZWN0LAoKICAgICAgLy8gT3B0aW9uYWwgWm9uZSBwYXJhbWV0ZXJzCiAgICAgIFpvbmVTcGVjaWZpY2F0aW9uIHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICBGdW5jdGlvbiBvbkVycm9yfSkgewogICAgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gbmV3IF9JT092ZXJyaWRlc1Njb3BlKAogICAgICAvLyBEaXJlY3RvcnkKICAgICAgY3JlYXRlRGlyZWN0b3J5LAogICAgICBnZXRDdXJyZW50RGlyZWN0b3J5LAogICAgICBzZXRDdXJyZW50RGlyZWN0b3J5LAogICAgICBnZXRTeXN0ZW1UZW1wRGlyZWN0b3J5LAoKICAgICAgLy8gRmlsZQogICAgICBjcmVhdGVGaWxlLAoKICAgICAgLy8gRmlsZVN0YXQKICAgICAgc3RhdCwKICAgICAgc3RhdFN5bmMsCgogICAgICAvLyBGaWxlU3lzdGVtRW50aXR5CiAgICAgIGZzZUlkZW50aWNhbCwKICAgICAgZnNlSWRlbnRpY2FsU3luYywKICAgICAgZnNlR2V0VHlwZSwKICAgICAgZnNlR2V0VHlwZVN5bmMsCgogICAgICAvLyBfRmlsZVN5c3RlbVdhdGNoZXIKICAgICAgZnNXYXRjaCwKICAgICAgZnNXYXRjaElzU3VwcG9ydGVkLAoKICAgICAgLy8gTGluawogICAgICBjcmVhdGVMaW5rLAoKICAgICAgLy8gU29ja2V0CiAgICAgIHNvY2tldENvbm5lY3QsCiAgICAgIHNvY2tldFN0YXJ0Q29ubmVjdCwKICAgICk7CiAgICByZXR1cm4gX2FzeW5jUnVuWm9uZWQ8Uj4oYm9keSwKICAgICAgICB6b25lVmFsdWVzOiB7X2lvT3ZlcnJpZGVzVG9rZW46IG92ZXJyaWRlc30sCiAgICAgICAgem9uZVNwZWNpZmljYXRpb246IHpvbmVTcGVjaWZpY2F0aW9uLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IpOwogIH0KCiAgLy8vIFJ1bnMgW2JvZHldIGluIGEgZnJlc2ggW1pvbmVdIHVzaW5nIHRoZSBvdmVycmlkZXMgZm91bmQgaW4gW292ZXJyaWRlc10uCiAgLy8vCiAgLy8vIE5vdGUgdGhhdCBbb3ZlcnJpZGVzXSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGV4dGVuZHMKICAvLy8gW0lPT3ZlcnJpZGVzXS4KICBzdGF0aWMgUiBydW5XaXRoSU9PdmVycmlkZXM8Uj4oUiBib2R5KCksIElPT3ZlcnJpZGVzIG92ZXJyaWRlcywKICAgICAge1pvbmVTcGVjaWZpY2F0aW9uIHpvbmVTcGVjaWZpY2F0aW9uLCBGdW5jdGlvbiBvbkVycm9yfSkgewogICAgcmV0dXJuIF9hc3luY1J1blpvbmVkPFI+KGJvZHksCiAgICAgICAgem9uZVZhbHVlczoge19pb092ZXJyaWRlc1Rva2VuOiBvdmVycmlkZXN9LAogICAgICAgIHpvbmVTcGVjaWZpY2F0aW9uOiB6b25lU3BlY2lmaWNhdGlvbiwKICAgICAgICBvbkVycm9yOiBvbkVycm9yKTsKICB9CgogIC8vIERpcmVjdG9yeQoKICAvLy8gQ3JlYXRlcyBhIG5ldyBbRGlyZWN0b3J5XSBvYmplY3QgZm9yIHRoZSBnaXZlbiBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgbmV3IERpcmVjdG9yeSgpYCBhbmQgYG5ldyBEaXJlY3RvcnkuZnJvbVVyaSgpYC4KICBEaXJlY3RvcnkgY3JlYXRlRGlyZWN0b3J5KFN0cmluZyBwYXRoKSA9PiBuZXcgX0RpcmVjdG9yeShwYXRoKTsKCiAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyB0aGUgc3RhdGljIGdldHRlciBgRGlyZWN0b3J5LmN1cnJlbnRgCiAgRGlyZWN0b3J5IGdldEN1cnJlbnREaXJlY3RvcnkoKSA9PiBfRGlyZWN0b3J5LmN1cnJlbnQ7CgogIC8vLyBTZXRzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIGJlIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIHRoZSBzZXR0ZXIgYERpcmVjdG9yeS5jdXJyZW50YC4KICB2b2lkIHNldEN1cnJlbnREaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKICAgIF9EaXJlY3RvcnkuY3VycmVudCA9IHBhdGg7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgc3lzdGVtIHRlbXBvcmFyeSBkaXJlY3RvcnkuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRGlyZWN0b3J5LnN5c3RlbVRlbXBgLgogIERpcmVjdG9yeSBnZXRTeXN0ZW1UZW1wRGlyZWN0b3J5KCkgPT4gX0RpcmVjdG9yeS5zeXN0ZW1UZW1wOwoKICAvLyBGaWxlCgogIC8vLyBDcmVhdGVzIGEgbmV3IFtGaWxlXSBvYmplY3QgZm9yIHRoZSBnaXZlbiBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgbmV3IEZpbGUoKWAgYW5kIGBuZXcgRmlsZS5mcm9tVXJpKClgLgogIEZpbGUgY3JlYXRlRmlsZShTdHJpbmcgcGF0aCkgPT4gbmV3IF9GaWxlKHBhdGgpOwoKICAvLyBGaWxlU3RhdAoKICAvLy8gQXN5bmNocm9ub3VzbHkgcmV0dXJucyBbRmlsZVN0YXRdIGluZm9ybWF0aW9uIGZvciBbcGF0aF0uCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgRmlsZVN0YXQuc3RhdCgpYC4KICBGdXR1cmU8RmlsZVN0YXQ+IHN0YXQoU3RyaW5nIHBhdGgpIHsKICAgIHJldHVybiBGaWxlU3RhdC5fc3RhdChwYXRoKTsKICB9CgogIC8vLyBSZXR1cm5zIFtGaWxlU3RhdF0gaW5mb3JtYXRpb24gZm9yIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3RhdC5zdGF0U3luYygpYC4KICBGaWxlU3RhdCBzdGF0U3luYyhTdHJpbmcgcGF0aCkgewogICAgcmV0dXJuIEZpbGVTdGF0Ll9zdGF0U3luY0ludGVybmFsKHBhdGgpOwogIH0KCiAgLy8gRmlsZVN5c3RlbUVudGl0eQoKICAvLy8gQXN5bmNocm9ub3VzbHkgcmV0dXJucyBgdHJ1ZWAgaWYgW3BhdGgxXSBhbmQgW3BhdGgyXSBhcmUgcGF0aHMgdG8gdGhlCiAgLy8vIHNhbWUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTeXN0ZW1FbnRpdHkuaWRlbnRpY2FsYC4KICBGdXR1cmU8Ym9vbD4gZnNlSWRlbnRpY2FsKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICByZXR1cm4gRmlsZVN5c3RlbUVudGl0eS5faWRlbnRpY2FsKHBhdGgxLCBwYXRoMik7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3BhdGgxXSBhbmQgW3BhdGgyXSBhcmUgcGF0aHMgdG8gdGhlCiAgLy8vIHNhbWUgZmlsZSBzeXN0ZW0gb2JqZWN0LgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTeXN0ZW1FbnRpdHkuaWRlbnRpY2FsU3luY2AuCiAgYm9vbCBmc2VJZGVudGljYWxTeW5jKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICByZXR1cm4gRmlsZVN5c3RlbUVudGl0eS5faWRlbnRpY2FsU3luYyhwYXRoMSwgcGF0aDIpOwogIH0KCiAgLy8vIEFzeW5jaHJvbm91c2x5IHJldHVybnMgdGhlIFtGaWxlU3lzdGVtRW50aXR5VHlwZV0gZm9yIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3lzdGVtRW50aXR5LnR5cGVgLgogIEZ1dHVyZTxGaWxlU3lzdGVtRW50aXR5VHlwZT4gZnNlR2V0VHlwZShTdHJpbmcgcGF0aCwgYm9vbCBmb2xsb3dMaW5rcykgewogICAgcmV0dXJuIEZpbGVTeXN0ZW1FbnRpdHkuX2dldFR5cGVSZXF1ZXN0KHV0ZjguZW5jb2RlKHBhdGgpLCBmb2xsb3dMaW5rcyk7CiAgfQoKICAvLy8gUmV0dXJucyB0aGUgW0ZpbGVTeXN0ZW1FbnRpdHlUeXBlXSBmb3IgW3BhdGhdLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTeXN0ZW1FbnRpdHkudHlwZVN5bmNgLgogIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIGZzZUdldFR5cGVTeW5jKFN0cmluZyBwYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICByZXR1cm4gRmlsZVN5c3RlbUVudGl0eS5fZ2V0VHlwZVN5bmNIZWxwZXIodXRmOC5lbmNvZGUocGF0aCksIGZvbGxvd0xpbmtzKTsKICB9CgogIC8vIF9GaWxlU3lzdGVtV2F0Y2hlcgoKICAvLy8gUmV0dXJucyBhIFtTdHJlYW1dIG9mIFtGaWxlU3lzdGVtRXZlbnRdcy4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBGaWxlU3lzdGVtRW50aXR5LndhdGNoKClgLgogIFN0cmVhbTxGaWxlU3lzdGVtRXZlbnQ+IGZzV2F0Y2goU3RyaW5nIHBhdGgsIGludCBldmVudHMsIGJvb2wgcmVjdXJzaXZlKSB7CiAgICByZXR1cm4gX0ZpbGVTeXN0ZW1XYXRjaGVyLl93YXRjaChwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CiAgfQoKICAvLy8gUmV0dXJucyBgdHJ1ZWAgd2hlbiBbRmlsZVN5c3RlbUVudGl0eS53YXRjaF0gaXMgc3VwcG9ydGVkLgogIC8vLwogIC8vLyBXaGVuIHRoaXMgb3ZlcnJpZGUgaXMgaW5zdGFsbGVkLCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYEZpbGVTeXN0ZW1FbnRpdHkuaXNXYXRjaFN1cHBvcnRlZGAuCiAgYm9vbCBmc1dhdGNoSXNTdXBwb3J0ZWQoKSA9PiBfRmlsZVN5c3RlbVdhdGNoZXIuaXNTdXBwb3J0ZWQ7CgogIC8vIExpbmsKCiAgLy8vIFJldHVybnMgYSBuZXcgW0xpbmtdIG9iamVjdCBmb3IgdGhlIGdpdmVuIFtwYXRoXS4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8vIGBuZXcgTGluaygpYCBhbmQgYG5ldyBMaW5rLmZyb21VcmkoKWAuCiAgTGluayBjcmVhdGVMaW5rKFN0cmluZyBwYXRoKSA9PiBuZXcgX0xpbmsocGF0aCk7CgogIC8vIFNvY2tldAoKICAvLy8gQXN5bmNocm9ub3VzbHkgcmV0dXJucyBhIFtTb2NrZXRdIGNvbm5lY3RlZCB0byB0aGUgZ2l2ZW4gaG9zdCBhbmQgcG9ydC4KICAvLy8KICAvLy8gV2hlbiB0aGlzIG92ZXJyaWRlIGlzIGluc3RhbGxlZCwgdGhpcyBmdW5jdGlvbnMgb3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZgogIC8vLyBgU29ja2V0LmNvbm5lY3QoLi4uKWAuCiAgRnV0dXJlPFNvY2tldD4gc29ja2V0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3MsIER1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICByZXR1cm4gU29ja2V0Ll9jb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcywgdGltZW91dDogdGltZW91dCk7CiAgfQoKICAvLy8gQXN5bmNocm9ub3VzbHkgcmV0dXJucyBhIFtDb25uZWN0aW9uVGFza10gdGhhdCBjb25uZWN0cyB0byB0aGUgZ2l2ZW4gaG9zdAogIC8vLyBhbmQgcG9ydCB3aGVuIHN1Y2Nlc3NmdWwuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBvdmVycmlkZSBpcyBpbnN0YWxsZWQsIHRoaXMgZnVuY3Rpb25zIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLy8gYFNvY2tldC5zdGFydENvbm5lY3QoLi4uKWAuCiAgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IHNvY2tldFN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KSB7CiAgICByZXR1cm4gU29ja2V0Ll9zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyk7CiAgfQp9CgpjbGFzcyBfSU9PdmVycmlkZXNTY29wZSBleHRlbmRzIElPT3ZlcnJpZGVzIHsKICBmaW5hbCBJT092ZXJyaWRlcyBfcHJldmlvdXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwoKICAvLyBEaXJlY3RvcnkKICBEaXJlY3RvcnkgRnVuY3Rpb24oU3RyaW5nKSBfY3JlYXRlRGlyZWN0b3J5OwogIERpcmVjdG9yeSBGdW5jdGlvbigpIF9nZXRDdXJyZW50RGlyZWN0b3J5OwogIHZvaWQgRnVuY3Rpb24oU3RyaW5nKSBfc2V0Q3VycmVudERpcmVjdG9yeTsKICBEaXJlY3RvcnkgRnVuY3Rpb24oKSBfZ2V0U3lzdGVtVGVtcERpcmVjdG9yeTsKCiAgLy8gRmlsZQogIEZpbGUgRnVuY3Rpb24oU3RyaW5nKSBfY3JlYXRlRmlsZTsKCiAgLy8gRmlsZVN0YXQKICBGdXR1cmU8RmlsZVN0YXQ+IEZ1bmN0aW9uKFN0cmluZykgX3N0YXQ7CiAgRmlsZVN0YXQgRnVuY3Rpb24oU3RyaW5nKSBfc3RhdFN5bmM7CgogIC8vIEZpbGVTeXN0ZW1FbnRpdHkKICBGdXR1cmU8Ym9vbD4gRnVuY3Rpb24oU3RyaW5nLCBTdHJpbmcpIF9mc2VJZGVudGljYWw7CiAgYm9vbCBGdW5jdGlvbihTdHJpbmcsIFN0cmluZykgX2ZzZUlkZW50aWNhbFN5bmM7CiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHlUeXBlPiBGdW5jdGlvbihTdHJpbmcsIGJvb2wpIF9mc2VHZXRUeXBlOwogIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIEZ1bmN0aW9uKFN0cmluZywgYm9vbCkgX2ZzZUdldFR5cGVTeW5jOwoKICAvLyBfRmlsZVN5c3RlbVdhdGNoZXIKICBTdHJlYW08RmlsZVN5c3RlbUV2ZW50PiBGdW5jdGlvbihTdHJpbmcsIGludCwgYm9vbCkgX2ZzV2F0Y2g7CiAgYm9vbCBGdW5jdGlvbigpIF9mc1dhdGNoSXNTdXBwb3J0ZWQ7CgogIC8vIExpbmsKICBMaW5rIEZ1bmN0aW9uKFN0cmluZykgX2NyZWF0ZUxpbms7CgogIC8vIFNvY2tldAogIEZ1dHVyZTxTb2NrZXQ+IEZ1bmN0aW9uKGR5bmFtaWMsIGludCwKICAgICAge2R5bmFtaWMgc291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dH0pIF9zb2NrZXRDb25uZWN0OwogIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxTb2NrZXQ+PiBGdW5jdGlvbihkeW5hbWljLCBpbnQsIHtkeW5hbWljIHNvdXJjZUFkZHJlc3N9KQogICAgICBfc29ja2V0U3RhcnRDb25uZWN0OwoKICBfSU9PdmVycmlkZXNTY29wZSgKICAgIC8vIERpcmVjdG9yeQogICAgdGhpcy5fY3JlYXRlRGlyZWN0b3J5LAogICAgdGhpcy5fZ2V0Q3VycmVudERpcmVjdG9yeSwKICAgIHRoaXMuX3NldEN1cnJlbnREaXJlY3RvcnksCiAgICB0aGlzLl9nZXRTeXN0ZW1UZW1wRGlyZWN0b3J5LAoKICAgIC8vIEZpbGUKICAgIHRoaXMuX2NyZWF0ZUZpbGUsCgogICAgLy8gRmlsZVN0YXQKICAgIHRoaXMuX3N0YXQsCiAgICB0aGlzLl9zdGF0U3luYywKCiAgICAvLyBGaWxlU3lzdGVtRW50aXR5CiAgICB0aGlzLl9mc2VJZGVudGljYWwsCiAgICB0aGlzLl9mc2VJZGVudGljYWxTeW5jLAogICAgdGhpcy5fZnNlR2V0VHlwZSwKICAgIHRoaXMuX2ZzZUdldFR5cGVTeW5jLAoKICAgIC8vIF9GaWxlU3lzdGVtV2F0Y2hlcgogICAgdGhpcy5fZnNXYXRjaCwKICAgIHRoaXMuX2ZzV2F0Y2hJc1N1cHBvcnRlZCwKCiAgICAvLyBMaW5rCiAgICB0aGlzLl9jcmVhdGVMaW5rLAoKICAgIC8vIFNvY2tldAogICAgdGhpcy5fc29ja2V0Q29ubmVjdCwKICAgIHRoaXMuX3NvY2tldFN0YXJ0Q29ubmVjdCwKICApOwoKICAvLyBEaXJlY3RvcnkKICBAb3ZlcnJpZGUKICBEaXJlY3RvcnkgY3JlYXRlRGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7CiAgICBpZiAoX2NyZWF0ZURpcmVjdG9yeSAhPSBudWxsKSByZXR1cm4gX2NyZWF0ZURpcmVjdG9yeShwYXRoKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5jcmVhdGVEaXJlY3RvcnkocGF0aCk7CiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRGlyZWN0b3J5KHBhdGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGlyZWN0b3J5IGdldEN1cnJlbnREaXJlY3RvcnkoKSB7CiAgICBpZiAoX2dldEN1cnJlbnREaXJlY3RvcnkgIT0gbnVsbCkgcmV0dXJuIF9nZXRDdXJyZW50RGlyZWN0b3J5KCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZ2V0Q3VycmVudERpcmVjdG9yeSgpOwogICAgcmV0dXJuIHN1cGVyLmdldEN1cnJlbnREaXJlY3RvcnkoKTsKICB9CgogIEBvdmVycmlkZQogIHZvaWQgc2V0Q3VycmVudERpcmVjdG9yeShTdHJpbmcgcGF0aCkgewogICAgaWYgKF9zZXRDdXJyZW50RGlyZWN0b3J5ICE9IG51bGwpCiAgICAgIF9zZXRDdXJyZW50RGlyZWN0b3J5KHBhdGgpOwogICAgZWxzZSBpZiAoX3ByZXZpb3VzICE9IG51bGwpCiAgICAgIF9wcmV2aW91cy5zZXRDdXJyZW50RGlyZWN0b3J5KHBhdGgpOwogICAgZWxzZQogICAgICBzdXBlci5zZXRDdXJyZW50RGlyZWN0b3J5KHBhdGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRGlyZWN0b3J5IGdldFN5c3RlbVRlbXBEaXJlY3RvcnkoKSB7CiAgICBpZiAoX2dldFN5c3RlbVRlbXBEaXJlY3RvcnkgIT0gbnVsbCkgcmV0dXJuIF9nZXRTeXN0ZW1UZW1wRGlyZWN0b3J5KCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZ2V0U3lzdGVtVGVtcERpcmVjdG9yeSgpOwogICAgcmV0dXJuIHN1cGVyLmdldFN5c3RlbVRlbXBEaXJlY3RvcnkoKTsKICB9CgogIC8vIEZpbGUKICBAb3ZlcnJpZGUKICBGaWxlIGNyZWF0ZUZpbGUoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChfY3JlYXRlRmlsZSAhPSBudWxsKSByZXR1cm4gX2NyZWF0ZUZpbGUocGF0aCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuY3JlYXRlRmlsZShwYXRoKTsKICAgIHJldHVybiBzdXBlci5jcmVhdGVGaWxlKHBhdGgpOwogIH0KCiAgLy8gRmlsZVN0YXQKICBAb3ZlcnJpZGUKICBGdXR1cmU8RmlsZVN0YXQ+IHN0YXQoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChfc3RhdCAhPSBudWxsKSByZXR1cm4gX3N0YXQocGF0aCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuc3RhdChwYXRoKTsKICAgIHJldHVybiBzdXBlci5zdGF0KHBhdGgpOwogIH0KCiAgQG92ZXJyaWRlCiAgRmlsZVN0YXQgc3RhdFN5bmMoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChfc3RhdCAhPSBudWxsKSByZXR1cm4gX3N0YXRTeW5jKHBhdGgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLnN0YXRTeW5jKHBhdGgpOwogICAgcmV0dXJuIHN1cGVyLnN0YXRTeW5jKHBhdGgpOwogIH0KCiAgLy8gRmlsZVN5c3RlbUVudGl0eQogIEBvdmVycmlkZQogIEZ1dHVyZTxib29sPiBmc2VJZGVudGljYWwoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIGlmIChfZnNlSWRlbnRpY2FsICE9IG51bGwpIHJldHVybiBfZnNlSWRlbnRpY2FsKHBhdGgxLCBwYXRoMik7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZnNlSWRlbnRpY2FsKHBhdGgxLCBwYXRoMik7CiAgICByZXR1cm4gc3VwZXIuZnNlSWRlbnRpY2FsKHBhdGgxLCBwYXRoMik7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGZzZUlkZW50aWNhbFN5bmMoU3RyaW5nIHBhdGgxLCBTdHJpbmcgcGF0aDIpIHsKICAgIGlmIChfZnNlSWRlbnRpY2FsU3luYyAhPSBudWxsKSByZXR1cm4gX2ZzZUlkZW50aWNhbFN5bmMocGF0aDEsIHBhdGgyKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5mc2VJZGVudGljYWxTeW5jKHBhdGgxLCBwYXRoMik7CiAgICByZXR1cm4gc3VwZXIuZnNlSWRlbnRpY2FsU3luYyhwYXRoMSwgcGF0aDIpOwogIH0KCiAgQG92ZXJyaWRlCiAgRnV0dXJlPEZpbGVTeXN0ZW1FbnRpdHlUeXBlPiBmc2VHZXRUeXBlKFN0cmluZyBwYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICBpZiAoX2ZzZUdldFR5cGUgIT0gbnVsbCkgcmV0dXJuIF9mc2VHZXRUeXBlKHBhdGgsIGZvbGxvd0xpbmtzKTsKICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgcmV0dXJuIF9wcmV2aW91cy5mc2VHZXRUeXBlKHBhdGgsIGZvbGxvd0xpbmtzKTsKICAgIHJldHVybiBzdXBlci5mc2VHZXRUeXBlKHBhdGgsIGZvbGxvd0xpbmtzKTsKICB9CgogIEBvdmVycmlkZQogIEZpbGVTeXN0ZW1FbnRpdHlUeXBlIGZzZUdldFR5cGVTeW5jKFN0cmluZyBwYXRoLCBib29sIGZvbGxvd0xpbmtzKSB7CiAgICBpZiAoX2ZzZUdldFR5cGVTeW5jICE9IG51bGwpIHJldHVybiBfZnNlR2V0VHlwZVN5bmMocGF0aCwgZm9sbG93TGlua3MpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmZzZUdldFR5cGVTeW5jKHBhdGgsIGZvbGxvd0xpbmtzKTsKICAgIHJldHVybiBzdXBlci5mc2VHZXRUeXBlU3luYyhwYXRoLCBmb2xsb3dMaW5rcyk7CiAgfQoKICAvLyBfRmlsZVN5c3RlbVdhdGNoZXIKICBAb3ZlcnJpZGUKICBTdHJlYW08RmlsZVN5c3RlbUV2ZW50PiBmc1dhdGNoKFN0cmluZyBwYXRoLCBpbnQgZXZlbnRzLCBib29sIHJlY3Vyc2l2ZSkgewogICAgaWYgKF9mc1dhdGNoICE9IG51bGwpIHJldHVybiBfZnNXYXRjaChwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZnNXYXRjaChwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CiAgICByZXR1cm4gc3VwZXIuZnNXYXRjaChwYXRoLCBldmVudHMsIHJlY3Vyc2l2ZSk7CiAgfQoKICBAb3ZlcnJpZGUKICBib29sIGZzV2F0Y2hJc1N1cHBvcnRlZCgpIHsKICAgIGlmIChfZnNXYXRjaElzU3VwcG9ydGVkICE9IG51bGwpIHJldHVybiBfZnNXYXRjaElzU3VwcG9ydGVkKCk7CiAgICBpZiAoX3ByZXZpb3VzICE9IG51bGwpIHJldHVybiBfcHJldmlvdXMuZnNXYXRjaElzU3VwcG9ydGVkKCk7CiAgICByZXR1cm4gc3VwZXIuZnNXYXRjaElzU3VwcG9ydGVkKCk7CiAgfQoKICAvLyBMaW5rCiAgQG92ZXJyaWRlCiAgTGluayBjcmVhdGVMaW5rKFN0cmluZyBwYXRoKSB7CiAgICBpZiAoX2NyZWF0ZUxpbmsgIT0gbnVsbCkgcmV0dXJuIF9jcmVhdGVMaW5rKHBhdGgpOwogICAgaWYgKF9wcmV2aW91cyAhPSBudWxsKSByZXR1cm4gX3ByZXZpb3VzLmNyZWF0ZUxpbmsocGF0aCk7CiAgICByZXR1cm4gc3VwZXIuY3JlYXRlTGluayhwYXRoKTsKICB9CgogIC8vIFNvY2tldAogIEBvdmVycmlkZQogIEZ1dHVyZTxTb2NrZXQ+IHNvY2tldENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgaWYgKF9zb2NrZXRDb25uZWN0ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIF9zb2NrZXRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLCB0aW1lb3V0OiB0aW1lb3V0KTsKICAgIH0KICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgewogICAgICByZXR1cm4gX3ByZXZpb3VzLnNvY2tldENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpOwogICAgfQogICAgcmV0dXJuIHN1cGVyLnNvY2tldENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLCB0aW1lb3V0OiB0aW1lb3V0KTsKICB9CgogIEBvdmVycmlkZQogIEZ1dHVyZTxDb25uZWN0aW9uVGFzazxTb2NrZXQ+PiBzb2NrZXRTdGFydENvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzfSkgewogICAgaWYgKF9zb2NrZXRTdGFydENvbm5lY3QgIT0gbnVsbCkgewogICAgICByZXR1cm4gX3NvY2tldFN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKTsKICAgIH0KICAgIGlmIChfcHJldmlvdXMgIT0gbnVsbCkgewogICAgICByZXR1cm4gX3ByZXZpb3VzLnNvY2tldFN0YXJ0Q29ubmVjdChob3N0LCBwb3J0LAogICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyk7CiAgICB9CiAgICByZXR1cm4gc3VwZXIuc29ja2V0U3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MpOwogIH0KfQqB4wBOTjwBEQEoASEBSBUER1E/BAgtCjYKBgQNIAxKNgxDBggdHgEjNwQBMwZNTiUtGQQBQgZMOCEIEzIwMTMBDigBEi4qARo6NkZCARxDKgEOKAEQLDkZPCceASIrGzMTFxsbHgEOEgESDBABGhQYEhYBHA8aAQ4SARAVGgcjNC4bBAFOBkoVQkEjNC4bBAEPAT0GTzdCAS0GTyw5ATcGTyYqHwQBLgZPHj8BCgE4Bk8tMwEOAUAGTxknIQQBMQZPHSMtBAEWAUwfBk8kOjYEAT0fBk8oNjoEAUQGTx9LTQQBNQZPI0dQBAEYATAGTyJNPwQBQQZPKz8BCgE4Bk8tMwEMAU4GUB0vKyc5BAFQIAZQIkQZSwQCAS41AQ8vLS4wAQolAQ4rJwEWNzNDPwEYQCcBCiUBDChBURsBFREbHx8iAQwWARAQFAEYGBwWGgEaEx4BDBYBDhkeBQEPDCtBQygEAQwkRUMoBAEMKiYiICsJJwQBDCdLRisEAQoMITc+IwQBDgwnKzgdBAEMIy88IQQBFgw6Q0gtBAEMNktMMQQBDEtESzAEAQxHTE80BAEYDE1ETjMEAQweQ0InBAEKDCE3PiMEAQwMLysiKDsGHTE7Bis5BAEMRBknTAYdNikGTwQCARZkYXJ0OmlvL292ZXJyaWRlcy5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9pby9wbGF0Zm9ybV9pbXBsLmRhcnSWjS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgpjbGFzcyBfUGxhdGZvcm0gewogIGV4dGVybmFsIHN0YXRpYyBpbnQgX251bWJlck9mUHJvY2Vzc29ycygpOwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3BhdGhTZXBhcmF0b3IoKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9vcGVyYXRpbmdTeXN0ZW0oKTsKICBleHRlcm5hbCBzdGF0aWMgX29wZXJhdGluZ1N5c3RlbVZlcnNpb24oKTsKICBleHRlcm5hbCBzdGF0aWMgX2xvY2FsSG9zdG5hbWUoKTsKICBleHRlcm5hbCBzdGF0aWMgX2V4ZWN1dGFibGUoKTsKICBleHRlcm5hbCBzdGF0aWMgX3Jlc29sdmVkRXhlY3V0YWJsZSgpOwoKICAvKioKICAgKiBSZXRyaWV2ZSB0aGUgZW50cmllcyBvZiB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudC4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYW4gW0l0ZXJhYmxlXSBvZiBzdHJpbmdzLCB3aGVyZSBlYWNoIHN0cmluZyByZXByZXNlbnRzCiAgICogYW4gZW52aXJvbm1lbnQgZW50cnkuCiAgICoKICAgKiBFbnZpcm9ubWVudCBlbnRyaWVzIHNob3VsZCBiZSBzdHJpbmdzIGNvbnRhaW5pbmcKICAgKiBhIG5vbi1lbXB0eSBuYW1lIGFuZCBhIHZhbHVlIHNlcGFyYXRlZCBieSBhICc9JyBjaGFyYWN0ZXIuCiAgICogVGhlIG5hbWUgZG9lcyBub3QgY29udGFpbiBhICc9JyBjaGFyYWN0ZXIsCiAgICogc28gdGhlIG5hbWUgaXMgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgJz0nIGNoYXJhY3Rlci4KICAgKiBWYWx1ZXMgYXJlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0ICc9JyBjaGFyYWN0ZXIuCiAgICogQSB2YWx1ZSBtYXkgY29udGFpbiBmdXJ0aGVyICc9JyBjaGFyYWN0ZXJzLCBhbmQgaXQgbWF5IGJlIGVtcHR5LgogICAqCiAgICogUmV0dXJucyBhbiBbT1NFcnJvcl0gaWYgcmV0cmlldmluZyB0aGUgZW52aXJvbm1lbnQgZmFpbHMuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIF9lbnZpcm9ubWVudCgpOwogIGV4dGVybmFsIHN0YXRpYyBMaXN0PFN0cmluZz4gX2V4ZWN1dGFibGVBcmd1bWVudHMoKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9wYWNrYWdlUm9vdCgpOyAvLyBUT0RPKG1mYWlyaHVyc3QpOiByZW1vdmUgdGhpcwogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX3BhY2thZ2VDb25maWcoKTsKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF92ZXJzaW9uKCk7CiAgZXh0ZXJuYWwgc3RhdGljIFN0cmluZyBfbG9jYWxlTmFtZSgpOwogIGV4dGVybmFsIHN0YXRpYyBVcmkgX3NjcmlwdCgpOwoKICBzdGF0aWMgU3RyaW5nIGV4ZWN1dGFibGUgPSBfZXhlY3V0YWJsZSgpOwogIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZWRFeGVjdXRhYmxlID0gX3Jlc29sdmVkRXhlY3V0YWJsZSgpOwogIHN0YXRpYyBTdHJpbmcgcGFja2FnZVJvb3Q7IC8vIFRPRE8obWZhaXJodXJzdCk6IHJlbW92ZSB0aGlzCiAgc3RhdGljIFN0cmluZyBwYWNrYWdlQ29uZmlnID0gX3BhY2thZ2VDb25maWcoKTsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyBTdHJpbmcgRnVuY3Rpb24oKSBfbG9jYWxlQ2xvc3VyZTsKICBzdGF0aWMgU3RyaW5nIGxvY2FsZU5hbWUoKSB7CiAgICBmaW5hbCByZXN1bHQgPSAoX2xvY2FsZUNsb3N1cmUgPT0gbnVsbCkgPyBfbG9jYWxlTmFtZSgpIDogX2xvY2FsZUNsb3N1cmUoKTsKICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICB0aHJvdyByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gQ2FjaGUgdGhlIE9TIGVudmlyb25tZW50LiBUaGlzIGNhbiBiZSBhbiBPU0Vycm9yIGluc3RhbmNlIGlmCiAgLy8gcmV0cmlldmluZyB0aGUgZW52aXJvbm1lbnQgZmFpbGVkLgogIHN0YXRpYyB2YXIgLypPU0Vycm9yfE1hcDxTdHJpbmcsU3RyaW5nPiovIF9lbnZpcm9ubWVudENhY2hlOwoKICBzdGF0aWMgaW50IGdldCBudW1iZXJPZlByb2Nlc3NvcnMgPT4gX251bWJlck9mUHJvY2Vzc29ycygpOwogIHN0YXRpYyBTdHJpbmcgZ2V0IHBhdGhTZXBhcmF0b3IgPT4gX3BhdGhTZXBhcmF0b3IoKTsKICBzdGF0aWMgU3RyaW5nIGdldCBvcGVyYXRpbmdTeXN0ZW0gPT4gX29wZXJhdGluZ1N5c3RlbSgpOwogIHN0YXRpYyBVcmkgZ2V0IHNjcmlwdCA9PiBfc2NyaXB0KCk7CgogIHN0YXRpYyBTdHJpbmcgX2NhY2hlZE9TVmVyc2lvbjsKICBzdGF0aWMgU3RyaW5nIGdldCBvcGVyYXRpbmdTeXN0ZW1WZXJzaW9uIHsKICAgIGlmIChfY2FjaGVkT1NWZXJzaW9uID09IG51bGwpIHsKICAgICAgdmFyIHJlc3VsdCA9IF9vcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKCk7CiAgICAgIGlmIChyZXN1bHQgaXMgT1NFcnJvcikgewogICAgICAgIHRocm93IHJlc3VsdDsKICAgICAgfQogICAgICBfY2FjaGVkT1NWZXJzaW9uID0gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIF9jYWNoZWRPU1ZlcnNpb247CiAgfQoKICBzdGF0aWMgU3RyaW5nIGdldCBsb2NhbEhvc3RuYW1lIHsKICAgIHZhciByZXN1bHQgPSBfbG9jYWxIb3N0bmFtZSgpOwogICAgaWYgKHJlc3VsdCBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IHJlc3VsdDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldCBleGVjdXRhYmxlQXJndW1lbnRzID0+IF9leGVjdXRhYmxlQXJndW1lbnRzKCk7CgogIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBlbnZpcm9ubWVudCB7CiAgICBpZiAoX2Vudmlyb25tZW50Q2FjaGUgPT0gbnVsbCkgewogICAgICB2YXIgZW52ID0gX2Vudmlyb25tZW50KCk7CiAgICAgIGlmIChlbnYgaXMhIE9TRXJyb3IpIHsKICAgICAgICB2YXIgaXNXaW5kb3dzID0gb3BlcmF0aW5nU3lzdGVtID09ICd3aW5kb3dzJzsKICAgICAgICB2YXIgcmVzdWx0ID0gaXNXaW5kb3dzCiAgICAgICAgICAgID8gbmV3IF9DYXNlSW5zZW5zaXRpdmVTdHJpbmdNYXA8U3RyaW5nPigpCiAgICAgICAgICAgIDogbmV3IE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICBmb3IgKHZhciBzdHIgaW4gZW52KSB7CiAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBUaGUgU3RyaW5ncyByZXR1cm5lZCBieSBbX2Vudmlyb25tZW50KCldIGFyZSBleHBlY3RlZCB0byBiZQogICAgICAgICAgLy8gdmFsaWQgZW52aXJvbm1lbnQgZW50cmllcywgYnV0IGV4Y2VwdGlvbnMgaGF2ZSBiZWVuIHNlZW4KICAgICAgICAgIC8vIChlLmcuLCBhbiBlbnRyeSBvZiBqdXN0ICc9JyBoYXMgYmVlbiBzZWVuIG9uIE9TL1gpLgogICAgICAgICAgLy8gSW52YWxpZCBlbnRyaWVzIChsaW5lcyB3aXRob3V0IGEgJz0nIG9yIHdpdGggYW4gZW1wdHkgbmFtZSkKICAgICAgICAgIC8vIGFyZSBkaXNjYXJkZWQuCiAgICAgICAgICB2YXIgZXF1YWxzSW5kZXggPSBzdHIuaW5kZXhPZignPScpOwogICAgICAgICAgaWYgKGVxdWFsc0luZGV4ID4gMCkgewogICAgICAgICAgICByZXN1bHRbc3RyLnN1YnN0cmluZygwLCBlcXVhbHNJbmRleCldID0KICAgICAgICAgICAgICAgIHN0ci5zdWJzdHJpbmcoZXF1YWxzSW5kZXggKyAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2Vudmlyb25tZW50Q2FjaGUgPSBuZXcgVW5tb2RpZmlhYmxlTWFwVmlldzxTdHJpbmcsIFN0cmluZz4ocmVzdWx0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfZW52aXJvbm1lbnRDYWNoZSA9IGVudjsKICAgICAgfQogICAgfQoKICAgIGlmIChfZW52aXJvbm1lbnRDYWNoZSBpcyBPU0Vycm9yKSB7CiAgICAgIHRocm93IF9lbnZpcm9ubWVudENhY2hlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIF9lbnZpcm9ubWVudENhY2hlOwogICAgfQogIH0KCiAgc3RhdGljIFN0cmluZyBnZXQgdmVyc2lvbiA9PiBfdmVyc2lvbigpOwp9CgovLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgb24gV2luZG93cy4gSW4gb3JkZXIKLy8gdG8gcmVmbGVjdCB0aGF0IHdlIHVzZSBhIGNhc2UtaW5zZW5zaXRpdmUgc3RyaW5nIG1hcCBvbiBXaW5kb3dzLgpjbGFzcyBfQ2FzZUluc2Vuc2l0aXZlU3RyaW5nTWFwPFY+IGV4dGVuZHMgTWFwQmFzZTxTdHJpbmcsIFY+IHsKICBmaW5hbCBNYXA8U3RyaW5nLCBWPiBfbWFwID0gbmV3IE1hcDxTdHJpbmcsIFY+KCk7CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgPT4KICAgICAga2V5IGlzIFN0cmluZyAmJiBfbWFwLmNvbnRhaW5zS2V5KGtleS50b1VwcGVyQ2FzZSgpKTsKICBib29sIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSA9PiBfbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgPT4ga2V5IGlzIFN0cmluZyA/IF9tYXBba2V5LnRvVXBwZXJDYXNlKCldIDogbnVsbDsKICB2b2lkIG9wZXJhdG9yIFtdPShTdHJpbmcga2V5LCBWIHZhbHVlKSB7CiAgICBfbWFwW2tleS50b1VwcGVyQ2FzZSgpXSA9IHZhbHVlOwogIH0KCiAgViBwdXRJZkFic2VudChTdHJpbmcga2V5LCBWIGlmQWJzZW50KCkpIHsKICAgIHJldHVybiBfbWFwLnB1dElmQWJzZW50KGtleS50b1VwcGVyQ2FzZSgpLCBpZkFic2VudCk7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8U3RyaW5nLCBWPiBvdGhlcikgewogICAgb3RoZXIuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgPT4gdGhpc1trZXkudG9VcHBlckNhc2UoKV0gPSB2YWx1ZSk7CiAgfQoKICBWIHJlbW92ZShPYmplY3Qga2V5KSA9PiBrZXkgaXMgU3RyaW5nID8gX21hcC5yZW1vdmUoa2V5LnRvVXBwZXJDYXNlKCkpIDogbnVsbDsKCiAgdm9pZCBjbGVhcigpIHsKICAgIF9tYXAuY2xlYXIoKTsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoU3RyaW5nIGtleSwgViB2YWx1ZSkpIHsKICAgIF9tYXAuZm9yRWFjaChmKTsKICB9CgogIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IGtleXMgPT4gX21hcC5rZXlzOwogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgPT4gX21hcC52YWx1ZXM7CiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5sZW5ndGg7CiAgYm9vbCBnZXQgaXNFbXB0eSA9PiBfbWFwLmlzRW1wdHk7CiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBfbWFwLmlzTm90RW1wdHk7CgogIEl0ZXJhYmxlPE1hcEVudHJ5PFN0cmluZywgVj4+IGdldCBlbnRyaWVzID0+IF9tYXAuZW50cmllczsKCiAgTWFwPEsyLCBWMj4gbWFwPEsyLCBWMj4oTWFwRW50cnk8SzIsIFYyPiB0cmFuc2Zvcm0oU3RyaW5nIGtleSwgViB2YWx1ZSkpID0+CiAgICAgIF9tYXAubWFwKHRyYW5zZm9ybSk7CgogIFYgdXBkYXRlKFN0cmluZyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSkgPT4KICAgICAgX21hcC51cGRhdGUoa2V5LnRvVXBwZXJDYXNlKCksIHVwZGF0ZSwgaWZBYnNlbnQ6IGlmQWJzZW50KTsKCiAgdm9pZCB1cGRhdGVBbGwoViB1cGRhdGUoU3RyaW5nIGtleSwgViB2YWx1ZSkpIHsKICAgIF9tYXAudXBkYXRlQWxsKHVwZGF0ZSk7CiAgfQoKICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChTdHJpbmcga2V5LCBWIHZhbHVlKSkgewogICAgX21hcC5yZW1vdmVXaGVyZSh0ZXN0KTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IF9tYXAudG9TdHJpbmcoKTsKfQqAtABOTjwBEQESLSstLSQhKQEGNgVKGwU2QDA+OkYFPwYiN0orJSghASw8PjIBHCsfUB0UBhMEAUIoPwE+NzsmASItJC4fFgghBh0EASQjHRQGEwQBSQEvJSAdNh82KR8dFgxJRkFJHC4hNDAMCk0PIQgGASgfDSAGBAErAgFDREA0ASI8QU8rJQQBLDoEASZEBAFRARESBAEuFQQBKikhJCoBPQFOGwE9QgEyHAQBNRwEASgCARpkYXJ0OmlvL3BsYXRmb3JtX2ltcGwuZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvYmluL3BsYXRmb3JtX3BhdGNoLmRhcnSHdy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb21tb25fcGF0Y2guZGFydCI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfUGxhdGZvcm0gewogIEBwYXRjaAogIHN0YXRpYyBpbnQgX251bWJlck9mUHJvY2Vzc29ycygpIG5hdGl2ZSAiUGxhdGZvcm1fTnVtYmVyT2ZQcm9jZXNzb3JzIjsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9wYXRoU2VwYXJhdG9yKCkgbmF0aXZlICJQbGF0Zm9ybV9QYXRoU2VwYXJhdG9yIjsKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9vcGVyYXRpbmdTeXN0ZW0oKSBuYXRpdmUgIlBsYXRmb3JtX09wZXJhdGluZ1N5c3RlbSI7CiAgQHBhdGNoCiAgc3RhdGljIF9vcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKCkgbmF0aXZlICJQbGF0Zm9ybV9PcGVyYXRpbmdTeXN0ZW1WZXJzaW9uIjsKICBAcGF0Y2gKICBzdGF0aWMgX2xvY2FsSG9zdG5hbWUoKSBuYXRpdmUgIlBsYXRmb3JtX0xvY2FsSG9zdG5hbWUiOwogIEBwYXRjaAogIHN0YXRpYyBfZXhlY3V0YWJsZSgpIG5hdGl2ZSAiUGxhdGZvcm1fRXhlY3V0YWJsZU5hbWUiOwogIEBwYXRjaAogIHN0YXRpYyBfcmVzb2x2ZWRFeGVjdXRhYmxlKCkgbmF0aXZlICJQbGF0Zm9ybV9SZXNvbHZlZEV4ZWN1dGFibGVOYW1lIjsKICBAcGF0Y2gKICBzdGF0aWMgX2Vudmlyb25tZW50KCkgbmF0aXZlICJQbGF0Zm9ybV9FbnZpcm9ubWVudCI7CiAgQHBhdGNoCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBfZXhlY3V0YWJsZUFyZ3VtZW50cygpCiAgICAgIG5hdGl2ZSAiUGxhdGZvcm1fRXhlY3V0YWJsZUFyZ3VtZW50cyI7CiAgQHBhdGNoCiAgc3RhdGljIFN0cmluZyBfdmVyc2lvbigpIG5hdGl2ZSAiUGxhdGZvcm1fR2V0VmVyc2lvbiI7CgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX2xvY2FsZU5hbWUoKSBuYXRpdmUgIlBsYXRmb3JtX0xvY2FsZU5hbWUiOwoKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF9wYWNrYWdlUm9vdCgpID0+IFZNTGlicmFyeUhvb2tzLnBhY2thZ2VSb290U3RyaW5nOwogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgX3BhY2thZ2VDb25maWcoKSA9PiBWTUxpYnJhcnlIb29rcy5wYWNrYWdlQ29uZmlnU3RyaW5nOwoKICBAcGF0Y2gKICBzdGF0aWMgVXJpIF9zY3JpcHQoKSA9PiBWTUxpYnJhcnlIb29rcy5wbGF0Zm9ybVNjcmlwdDsKCiAgLy8gVGhpcyBzY3JpcHQgc2luZ2xldG9uIGlzIHdyaXR0ZW4gdG8gYnkgdGhlIGVtYmVkZGVyIGlmIGFwcGxpY2FibGUuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHN0YXRpYyB2b2lkIHNldCBfbmF0aXZlU2NyaXB0KFN0cmluZyBwYXRoKSB7CiAgICBWTUxpYnJhcnlIb29rcy5wbGF0Zm9ybVNjcmlwdCA9ICgoKSB7CiAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJ2h0dHA6JykgfHwKICAgICAgICAgIHBhdGguc3RhcnRzV2l0aCgnaHR0cHM6JykgfHwKICAgICAgICAgIHBhdGguc3RhcnRzV2l0aCgncGFja2FnZTonKSB8fAogICAgICAgICAgcGF0aC5zdGFydHNXaXRoKCdkYXJ0OicpIHx8CiAgICAgICAgICBwYXRoLnN0YXJ0c1dpdGgoJ2RhdGE6JykgfHwKICAgICAgICAgIHBhdGguc3RhcnRzV2l0aCgnZmlsZTonKSkgewogICAgICAgIHJldHVybiBVcmkucGFyc2UocGF0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFVyaS5iYXNlLnJlc29sdmVVcmkobmV3IFVyaS5maWxlKHBhdGgpKTsKICAgICAgfQogICAgfSk7CiAgfQp9Cj0ATk48ASABBxoSCUkJQglGCU0JOwk5CUkJNwktLQk5AQk8AQlECUgBCTkBSBwvKiYnKSYmJiAPOAgIBAIBIWRhcnQ6aW8tcGF0Y2gvcGxhdGZvcm1fcGF0Y2guZGFydCtvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vcHJvY2Vzcy5kYXJ0wABn7S8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovLyBUT0RPKGFnZXIpOiBUaGUgb25seSByZWFzb24gZm9yIHRoaXMgY2xhc3MgaXMgdGhhdCB3ZQovLyBjYW5ub3QgcGF0Y2ggYSB0b3AtbGV2ZWwgYXQgdGhpcyBwb2ludC4KY2xhc3MgX1Byb2Nlc3NVdGlscyB7CiAgZXh0ZXJuYWwgc3RhdGljIHZvaWQgX2V4aXQoaW50IHN0YXR1cyk7CiAgZXh0ZXJuYWwgc3RhdGljIHZvaWQgX3NldEV4aXRDb2RlKGludCBzdGF0dXMpOwogIGV4dGVybmFsIHN0YXRpYyBpbnQgX2dldEV4aXRDb2RlKCk7CiAgZXh0ZXJuYWwgc3RhdGljIHZvaWQgX3NsZWVwKGludCBtaWxsaXMpOwogIGV4dGVybmFsIHN0YXRpYyBpbnQgX3BpZChQcm9jZXNzIHByb2Nlc3MpOwogIGV4dGVybmFsIHN0YXRpYyBTdHJlYW08UHJvY2Vzc1NpZ25hbD4gX3dhdGNoU2lnbmFsKFByb2Nlc3NTaWduYWwgc2lnbmFsKTsKfQoKLyoqCiAqIEV4aXQgdGhlIERhcnQgVk0gcHJvY2VzcyBpbW1lZGlhdGVseSB3aXRoIHRoZSBnaXZlbiBleGl0IGNvZGUuCiAqCiAqIFRoaXMgZG9lcyBub3Qgd2FpdCBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRvIHRlcm1pbmF0ZS4gVXNpbmcKICogW2V4aXRdIGlzIHRoZXJlZm9yZSB2ZXJ5IGxpa2VseSB0byBsb3NlIGRhdGEuCiAqCiAqIFdoaWxlIGRlYnVnZ2luZywgdGhlIFZNIHdpbGwgbm90IHJlc3BlY3QgdGhlIGAtLXBhdXNlLWlzb2xhdGVzLW9uLWV4aXRgCiAqIGZsYWcgaWYgW2V4aXRdIGlzIGNhbGxlZCBhcyBpbnZva2luZyB0aGlzIG1ldGhvZCBjYXVzZXMgdGhlIERhcnQgVk0KICogcHJvY2VzcyB0byBzaHV0ZG93biBpbW1lZGlhdGVseS4gVG8gcHJvcGVybHkgYnJlYWsgb24gZXhpdCwgY29uc2lkZXIKICogY2FsbGluZyBbZGVidWdnZXJdIGZyb20gYGRhcnQ6ZGV2ZWxvcGVyYCBvciBbSXNvbGF0ZS5wYXVzZV0gZnJvbQogKiBgZGFydDppc29sYXRlYCBvbiBbSXNvbGF0ZS5jdXJyZW50XSB0byBwYXVzZSB0aGUgaXNvbGF0ZSBiZWZvcmUKICogaW52b2tpbmcgW2V4aXRdLgogKgogKiBUaGUgaGFuZGxpbmcgb2YgZXhpdCBjb2RlcyBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4KICoKICogT24gTGludXggYW5kIE9TIFggYW4gZXhpdCBjb2RlIGZvciBub3JtYWwgdGVybWluYXRpb24gd2lsbCBhbHdheXMKICogYmUgaW4gdGhlIHJhbmdlIFswLi4yNTVdLiBJZiBhbiBleGl0IGNvZGUgb3V0c2lkZSB0aGlzIHJhbmdlIGlzCiAqIHNldCB0aGUgYWN0dWFsIGV4aXQgY29kZSB3aWxsIGJlIHRoZSBsb3dlciA4IGJpdHMgbWFza2VkIG9mZiBhbmQKICogdHJlYXRlZCBhcyBhbiB1bnNpZ25lZCB2YWx1ZS4gRS5nLiB1c2luZyBhbiBleGl0IGNvZGUgb2YgLTEgd2lsbAogKiByZXN1bHQgaW4gYW4gYWN0dWFsIGV4aXQgY29kZSBvZiAyNTUgYmVpbmcgcmVwb3J0ZWQuCiAqCiAqIE9uIFdpbmRvd3MgdGhlIGV4aXQgY29kZSBjYW4gYmUgc2V0IHRvIGFueSAzMi1iaXQgdmFsdWUuIEhvd2V2ZXIKICogc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciByZXBvcnRpbmcgc3lzdGVtIGVycm9ycyBsaWtlCiAqIGNyYXNoZXMuCiAqCiAqIEJlc2lkZXMgdGhpcyB0aGUgRGFydCBleGVjdXRhYmxlIGl0c2VsZiB1c2VzIGFuIGV4aXQgY29kZSBvZiBgMjU0YAogKiBmb3IgcmVwb3J0aW5nIGNvbXBpbGUgdGltZSBlcnJvcnMgYW5kIGFuIGV4aXQgY29kZSBvZiBgMjU1YCBmb3IKICogcmVwb3J0aW5nIHJ1bnRpbWUgZXJyb3IgKHVuaGFuZGxlZCBleGNlcHRpb24pLgogKgogKiBEdWUgdG8gdGhlc2UgZmFjdHMgaXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSB1c2UgZXhpdCBjb2RlcyBpbiB0aGUKICogcmFuZ2UgWzAuLjEyN10gZm9yIGNvbW11bmljYXRpbmcgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGEgRGFydAogKiBwcm9ncmFtIHRvIHRoZSBzdXJyb3VuZGluZyBlbnZpcm9ubWVudC4gVGhpcyB3aWxsIGF2b2lkIGFueQogKiBjcm9zcy1wbGF0Zm9ybSBpc3N1ZXMuCiAqLwp2b2lkIGV4aXQoaW50IGNvZGUpIHsKICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChjb2RlLCAiY29kZSIpOwogIGlmICghX0VtYmVkZGVyQ29uZmlnLl9tYXlFeGl0KSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVGhpcyBlbWJlZGRlciBkaXNhbGxvd3MgY2FsbGluZyBkYXJ0OmlvJ3MgZXhpdCgpIik7CiAgfQogIF9Qcm9jZXNzVXRpbHMuX2V4aXQoY29kZSk7Cn0KCi8qKgogKiBTZXQgdGhlIGdsb2JhbCBleGl0IGNvZGUgZm9yIHRoZSBEYXJ0IFZNLgogKgogKiBUaGUgZXhpdCBjb2RlIGlzIGdsb2JhbCBmb3IgdGhlIERhcnQgVk0gYW5kIHRoZSBsYXN0IGFzc2lnbm1lbnQgdG8KICogZXhpdENvZGUgZnJvbSBhbnkgaXNvbGF0ZSBkZXRlcm1pbmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIERhcnQgVk0KICogb24gbm9ybWFsIHRlcm1pbmF0aW9uLgogKgogKiBEZWZhdWx0IHZhbHVlIGlzIGAwYC4KICoKICogU2VlIFtleGl0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY2hvc2UgYSB2YWx1ZSBmb3IgdGhlCiAqIGV4aXQgY29kZS4KICovCnZvaWQgc2V0IGV4aXRDb2RlKGludCBjb2RlKSB7CiAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoY29kZSwgImNvZGUiKTsKICBfUHJvY2Vzc1V0aWxzLl9zZXRFeGl0Q29kZShjb2RlKTsKfQoKLyoqCiAqIEdldCB0aGUgZ2xvYmFsIGV4aXQgY29kZSBmb3IgdGhlIERhcnQgVk0uCiAqCiAqIFRoZSBleGl0IGNvZGUgaXMgZ2xvYmFsIGZvciB0aGUgRGFydCBWTSBhbmQgdGhlIGxhc3QgYXNzaWdubWVudCB0bwogKiBleGl0Q29kZSBmcm9tIGFueSBpc29sYXRlIGRldGVybWluZXMgdGhlIGV4aXQgY29kZSBvZiB0aGUgRGFydCBWTQogKiBvbiBub3JtYWwgdGVybWluYXRpb24uCiAqCiAqIFNlZSBbZXhpdF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNob3NlIGEgdmFsdWUgZm9yIHRoZQogKiBleGl0IGNvZGUuCiAqLwppbnQgZ2V0IGV4aXRDb2RlID0+IF9Qcm9jZXNzVXRpbHMuX2dldEV4aXRDb2RlKCk7CgovKioKICogU2xlZXAgZm9yIHRoZSBkdXJhdGlvbiBzcGVjaWZpZWQgaW4gW2R1cmF0aW9uXS4KICoKICogVXNlIHRoaXMgd2l0aCBjYXJlLCBhcyBubyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBjYW4gYmUgcHJvY2Vzc2VkCiAqIGluIGEgaXNvbGF0ZSB3aGlsZSBpdCBpcyBibG9ja2VkIGluIGEgW3NsZWVwXSBjYWxsLgogKi8Kdm9pZCBzbGVlcChEdXJhdGlvbiBkdXJhdGlvbikgewogIGludCBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5pbk1pbGxpc2Vjb25kczsKICBpZiAobWlsbGlzZWNvbmRzIDwgMCkgewogICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoInNsZWVwOiBkdXJhdGlvbiBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKICB9CiAgaWYgKCFfRW1iZWRkZXJDb25maWcuX21heVNsZWVwKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiVGhpcyBlbWJlZGRlciBkaXNhbGxvd3MgY2FsbGluZyBkYXJ0OmlvJ3Mgc2xlZXAoKSIpOwogIH0KICBfUHJvY2Vzc1V0aWxzLl9zbGVlcChtaWxsaXNlY29uZHMpOwp9CgovKioKICogUmV0dXJucyB0aGUgUElEIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCiAqLwppbnQgZ2V0IHBpZCA9PiBfUHJvY2Vzc1V0aWxzLl9waWQobnVsbCk7CgovKioKICogW1Byb2Nlc3NJbmZvXSBwcm92aWRlcyBtZXRob2RzIGZvciByZXRyaWV2aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQogKiBjdXJyZW50IHByb2Nlc3MuCiAqLwpjbGFzcyBQcm9jZXNzSW5mbyB7CiAgLyoqCiAgICogVGhlIGN1cnJlbnQgcmVzaWRlbnQgc2V0IHNpemUgb2YgbWVtb3J5IGZvciB0aGUgcHJvY2Vzcy4KICAgKgogICAqIE5vdGUgdGhhdCB0aGUgbWVhbmluZyBvZiB0aGlzIGZpZWxkIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gRm9yIGV4YW1wbGUsCiAgICogc29tZSBtZW1vcnkgYWNjb3VudGVkIGZvciBoZXJlIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBwcm9jZXNzZXMsIG9yIGlmCiAgICogdGhlIHNhbWUgcGFnZSBpcyBtYXBwZWQgaW50byBhIHByb2Nlc3MncyBhZGRyZXNzIHNwYWNlLCBpdCBtYXkgYmUgY291bnRlZAogICAqIHR3aWNlLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBpbnQgZ2V0IGN1cnJlbnRSc3M7CgogIC8qKgogICAqIFRoZSBoaWdoLXdhdGVybWFyayBpbiBieXRlcyBmb3IgdGhlIHJlc2lkZW50IHNldCBzaXplIG9mIG1lbW9yeSBmb3IgdGhlCiAgICogcHJvY2Vzcy4KICAgKgogICAqIE5vdGUgdGhhdCB0aGUgbWVhbmluZyBvZiB0aGlzIGZpZWxkIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gRm9yIGV4YW1wbGUsCiAgICogc29tZSBtZW1vcnkgYWNjb3VudGVkIGZvciBoZXJlIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBwcm9jZXNzZXMsIG9yIGlmCiAgICogdGhlIHNhbWUgcGFnZSBpcyBtYXBwZWQgaW50byBhIHByb2Nlc3MncyBhZGRyZXNzIHNwYWNlLCBpdCBtYXkgYmUgY291bnRlZAogICAqIHR3aWNlLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBpbnQgZ2V0IG1heFJzczsKfQoKLyoqCiAqIE1vZGVzIGZvciBydW5uaW5nIGEgbmV3IHByb2Nlc3MuCiAqLwpjbGFzcyBQcm9jZXNzU3RhcnRNb2RlIHsKICAvLy8gTm9ybWFsIGNoaWxkIHByb2Nlc3MuCiAgc3RhdGljIGNvbnN0IG5vcm1hbCA9IGNvbnN0IFByb2Nlc3NTdGFydE1vZGUuX2ludGVybmFsKDApOwogIEBEZXByZWNhdGVkKCJVc2Ugbm9ybWFsIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBOT1JNQUwgPSBub3JtYWw7CgogIC8vLyBTdGRpbyBoYW5kbGVzIGFyZSBpbmhlcml0ZWQgYnkgdGhlIGNoaWxkIHByb2Nlc3MuCiAgc3RhdGljIGNvbnN0IGluaGVyaXRTdGRpbyA9IGNvbnN0IFByb2Nlc3NTdGFydE1vZGUuX2ludGVybmFsKDEpOwogIEBEZXByZWNhdGVkKCJVc2UgaW5oZXJpdFN0ZGlvIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJTkhFUklUX1NURElPID0gaW5oZXJpdFN0ZGlvOwoKICAvLy8gRGV0YWNoZWQgY2hpbGQgcHJvY2VzcyB3aXRoIG5vIG9wZW4gY29tbXVuaWNhdGlvbiBjaGFubmVsLgogIHN0YXRpYyBjb25zdCBkZXRhY2hlZCA9IGNvbnN0IFByb2Nlc3NTdGFydE1vZGUuX2ludGVybmFsKDIpOwogIEBEZXByZWNhdGVkKCJVc2UgZGV0YWNoZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IERFVEFDSEVEID0gZGV0YWNoZWQ7CgogIC8vLyBEZXRhY2hlZCBjaGlsZCBwcm9jZXNzIHdpdGggc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIHN0aWxsIG9wZW4KICAvLy8gZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgY2hpbGQuCiAgc3RhdGljIGNvbnN0IGRldGFjaGVkV2l0aFN0ZGlvID0gY29uc3QgUHJvY2Vzc1N0YXJ0TW9kZS5faW50ZXJuYWwoMyk7CiAgQERlcHJlY2F0ZWQoIlVzZSBkZXRhY2hlZFdpdGhTdGRpbyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgREVUQUNIRURfV0lUSF9TVERJTyA9IGRldGFjaGVkV2l0aFN0ZGlvOwoKICBzdGF0aWMgTGlzdDxQcm9jZXNzU3RhcnRNb2RlPiBnZXQgdmFsdWVzID0+IGNvbnN0IDxQcm9jZXNzU3RhcnRNb2RlPlsKICAgICAgICBub3JtYWwsCiAgICAgICAgaW5oZXJpdFN0ZGlvLAogICAgICAgIGRldGFjaGVkLAogICAgICAgIGRldGFjaGVkV2l0aFN0ZGlvCiAgICAgIF07CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgY29uc3QgWyJub3JtYWwiLCAiaW5oZXJpdFN0ZGlvIiwgImRldGFjaGVkIiwgImRldGFjaGVkV2l0aFN0ZGlvIl1bX21vZGVdOwoKICBmaW5hbCBpbnQgX21vZGU7CiAgY29uc3QgUHJvY2Vzc1N0YXJ0TW9kZS5faW50ZXJuYWwodGhpcy5fbW9kZSk7Cn0KCi8qKgogKiBUaGUgbWVhbnMgdG8gZXhlY3V0ZSBhIHByb2dyYW0uCiAqCiAqIFVzZSB0aGUgc3RhdGljIFtzdGFydF0gYW5kIFtydW5dIG1ldGhvZHMgdG8gc3RhcnQgYSBuZXcgcHJvY2Vzcy4KICogVGhlIHJ1biBtZXRob2QgZXhlY3V0ZXMgdGhlIHByb2Nlc3Mgbm9uLWludGVyYWN0aXZlbHkgdG8gY29tcGxldGlvbi4KICogSW4gY29udHJhc3QsIHRoZSBzdGFydCBtZXRob2QgYWxsb3dzIHlvdXIgY29kZSB0byBpbnRlcmFjdCB3aXRoIHRoZQogKiBydW5uaW5nIHByb2Nlc3MuCiAqCiAqICMjIFN0YXJ0IGEgcHJvY2VzcyB3aXRoIHRoZSBydW4gbWV0aG9kCiAqCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzYW1wbGUgdXNlcyB0aGUgcnVuIG1ldGhvZCB0byBjcmVhdGUgYSBwcm9jZXNzCiAqIHRoYXQgcnVucyB0aGUgVU5JWCBjb21tYW5kIGBsc2AsIHdoaWNoIGxpc3RzIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeS4KICogVGhlIHJ1biBtZXRob2QgY29tcGxldGVzIHdpdGggYSBbUHJvY2Vzc1Jlc3VsdF0gb2JqZWN0IHdoZW4gdGhlIHByb2Nlc3MKICogdGVybWluYXRlcy4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG91dHB1dCBhbmQgZXhpdCBjb2RlIGZyb20gdGhlCiAqIHByb2Nlc3MuIFRoZSBydW4gbWV0aG9kIGRvZXMgbm90IHJldHVybiBhIFByb2Nlc3Mgb2JqZWN0OyB0aGlzIHByZXZlbnRzIHlvdXIKICogY29kZSBmcm9tIGludGVyYWN0aW5nIHdpdGggdGhlIHJ1bm5pbmcgcHJvY2Vzcy4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICAvLyBMaXN0IGFsbCBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4gVU5JWC1saWtlIHN5c3RlbXMuCiAqICAgICAgIFByb2Nlc3MucnVuKCdscycsIFsnLWwnXSkudGhlbigoUHJvY2Vzc1Jlc3VsdCByZXN1bHRzKSB7CiAqICAgICAgICAgcHJpbnQocmVzdWx0cy5zdGRvdXQpOwogKiAgICAgICB9KTsKICogICAgIH0KICoKICogIyMgU3RhcnQgYSBwcm9jZXNzIHdpdGggdGhlIHN0YXJ0IG1ldGhvZAogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcyBzdGFydCB0byBjcmVhdGUgdGhlIHByb2Nlc3MuCiAqIFRoZSBzdGFydCBtZXRob2QgcmV0dXJucyBhIFtGdXR1cmVdIGZvciBhIFByb2Nlc3Mgb2JqZWN0LgogKiBXaGVuIHRoZSBmdXR1cmUgY29tcGxldGVzIHRoZSBwcm9jZXNzIGlzIHN0YXJ0ZWQgYW5kCiAqIHlvdXIgY29kZSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUKICogUHJvY2Vzczogd3JpdGluZyB0byBzdGRpbiwgbGlzdGVuaW5nIHRvIHN0ZG91dCwgYW5kIHNvIG9uLgogKgogKiBUaGUgZm9sbG93aW5nIHNhbXBsZSBzdGFydHMgdGhlIFVOSVggYGNhdGAgdXRpbGl0eSwgd2hpY2ggd2hlbiBnaXZlbiBubwogKiBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBlY2hvcyBpdHMgaW5wdXQuCiAqIFRoZSBwcm9ncmFtIHdyaXRlcyB0byB0aGUgcHJvY2VzcydzIHN0YW5kYXJkIGlucHV0IHN0cmVhbQogKiBhbmQgcHJpbnRzIGRhdGEgZnJvbSBpdHMgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqICAgICBpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBQcm9jZXNzLnN0YXJ0KCdjYXQnLCBbXSkudGhlbigoUHJvY2VzcyBwcm9jZXNzKSB7CiAqICAgICAgICAgcHJvY2Vzcy5zdGRvdXQKICogICAgICAgICAgICAgLnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpCiAqICAgICAgICAgICAgIC5saXN0ZW4oKGRhdGEpIHsgcHJpbnQoZGF0YSk7IH0pOwogKiAgICAgICAgIHByb2Nlc3Muc3RkaW4ud3JpdGVsbignSGVsbG8sIHdvcmxkIScpOwogKiAgICAgICAgIHByb2Nlc3Muc3RkaW4ud3JpdGVsbignSGVsbG8sIGdhbGF4eSEnKTsKICogICAgICAgICBwcm9jZXNzLnN0ZGluLndyaXRlbG4oJ0hlbGxvLCB1bml2ZXJzZSEnKTsKICogICAgICAgfSk7CiAqICAgICB9CiAqCiAqICMjIFN0YW5kYXJkIEkvTyBzdHJlYW1zCiAqCiAqIEFzIHNlZW4gaW4gdGhlIHByZXZpb3VzIGNvZGUgc2FtcGxlLCB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIFByb2Nlc3MncwogKiBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtIHRocm91Z2ggdGhlIGdldHRlciBbc3Rkb3V0XSwKICogYW5kIHlvdSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgUHJvY2VzcydzIHN0YW5kYXJkIGlucHV0IHN0cmVhbSB0aHJvdWdoCiAqIHRoZSBnZXR0ZXIgW3N0ZGluXS4KICogSW4gYWRkaXRpb24sIFByb2Nlc3MgcHJvdmlkZXMgYSBnZXR0ZXIgW3N0ZGVycl0gZm9yIHVzaW5nIHRoZSBQcm9jZXNzJ3MKICogc3RhbmRhcmQgZXJyb3Igc3RyZWFtLgogKgogKiBBIFByb2Nlc3MncyBzdHJlYW1zIGFyZSBkaXN0aW5jdCBmcm9tIHRoZSB0b3AtbGV2ZWwgc3RyZWFtcwogKiBmb3IgdGhlIGN1cnJlbnQgcHJvZ3JhbS4KICoKICogIyMgRXhpdCBjb2RlcwogKgogKiBDYWxsIHRoZSBbZXhpdENvZGVdIG1ldGhvZCB0byBnZXQgdGhlIGV4aXQgY29kZSBvZiB0aGUgcHJvY2Vzcy4KICogVGhlIGV4aXQgY29kZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVkIHN1Y2Nlc3NmdWxseQogKiAodXN1YWxseSBpbmRpY2F0ZWQgd2l0aCBhbiBleGl0IGNvZGUgb2YgMCkgb3Igd2l0aCBhbiBlcnJvci4KICoKICogSWYgdGhlIHN0YXJ0IG1ldGhvZCBpcyB1c2VkLCB0aGUgZXhpdENvZGUgaXMgYXZhaWxhYmxlIHRocm91Z2ggYSBmdXR1cmUKICogb24gdGhlIFByb2Nlc3Mgb2JqZWN0IChhcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdykuCiAqIElmIHRoZSBydW4gbWV0aG9kIGlzIHVzZWQsIHRoZSBleGl0Q29kZSBpcyBhdmFpbGFibGUKICogdGhyb3VnaCBhIGdldHRlciBvbiB0aGUgUHJvY2Vzc1Jlc3VsdCBpbnN0YW5jZS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBQcm9jZXNzLnN0YXJ0KCdscycsIFsnLWwnXSkudGhlbigocHJvY2VzcykgewogKiAgICAgICAgIC8vIEdldCB0aGUgZXhpdCBjb2RlIGZyb20gdGhlIG5ldyBwcm9jZXNzLgogKiAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUudGhlbigoZXhpdENvZGUpIHsKICogICAgICAgICAgIHByaW50KCdleGl0IGNvZGU6ICRleGl0Q29kZScpOwogKiAgICAgICAgIH0pOwogKiAgICAgICB9KTsKICogICAgIH0KICoKICogIyMgT3RoZXIgcmVzb3VyY2VzCiAqCiAqIFtEYXJ0IGJ5IEV4YW1wbGVdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kYXJ0LWJ5LWV4YW1wbGUvI2RhcnQtaW8tYW5kLWNvbW1hbmQtbGluZS1hcHBzKQogKiBwcm92aWRlcyBhZGRpdGlvbmFsIHRhc2stb3JpZW50ZWQgY29kZSBzYW1wbGVzIHRoYXQgc2hvdyBob3cgdG8gdXNlCiAqIHZhcmlvdXMgQVBJIGZyb20gdGhlIFtkYXJ0OmlvXSBsaWJyYXJ5LgogKi8KYWJzdHJhY3QgY2xhc3MgUHJvY2VzcyB7CiAgLyoqCiAgICogUmV0dXJucyBhIFs6RnV0dXJlOl0gd2hpY2ggY29tcGxldGVzIHdpdGggdGhlIGV4aXQgY29kZSBvZiB0aGUgcHJvY2VzcwogICAqIHdoZW4gdGhlIHByb2Nlc3MgY29tcGxldGVzLgogICAqCiAgICogVGhlIGhhbmRsaW5nIG9mIGV4aXQgY29kZXMgaXMgcGxhdGZvcm0gc3BlY2lmaWMuCiAgICoKICAgKiBPbiBMaW51eCBhbmQgT1MgWCBhIG5vcm1hbCBleGl0IGNvZGUgd2lsbCBiZSBhIHBvc2l0aXZlIHZhbHVlIGluCiAgICogdGhlIHJhbmdlIFswLi4yNTVdLiBJZiB0aGUgcHJvY2VzcyB3YXMgdGVybWluYXRlZCBkdWUgdG8gYSBzaWduYWwKICAgKiB0aGUgZXhpdCBjb2RlIHdpbGwgYmUgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgcmFuZ2UgWy0yNTUuLi0xXSwKICAgKiB3aGVyZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGV4aXQgY29kZSBpcyB0aGUgc2lnbmFsCiAgICogbnVtYmVyLiBGb3IgZXhhbXBsZSwgaWYgYSBwcm9jZXNzIGNyYXNoZXMgZHVlIHRvIGEgc2VnbWVudGF0aW9uCiAgICogdmlvbGF0aW9uIHRoZSBleGl0IGNvZGUgd2lsbCBiZSAtMTEsIGFzIHRoZSBzaWduYWwgU0lHU0VHViBoYXMgdGhlCiAgICogbnVtYmVyIDExLgogICAqCiAgICogT24gV2luZG93cyBhIHByb2Nlc3MgY2FuIHJlcG9ydCBhbnkgMzItYml0IHZhbHVlIGFzIGFuIGV4aXQKICAgKiBjb2RlLiBXaGVuIHJldHVybmluZyB0aGUgZXhpdCBjb2RlIHRoaXMgZXhpdCBjb2RlIGlzIHR1cm5lZCBpbnRvCiAgICogYSBzaWduZWQgdmFsdWUuIFNvbWUgc3BlY2lhbCB2YWx1ZXMgYXJlIHVzZWQgdG8gcmVwb3J0CiAgICogdGVybWluYXRpb24gZHVlIHRvIHNvbWUgc3lzdGVtIGV2ZW50LiBFLmcuIGlmIGEgcHJvY2VzcyBjcmFzaGVzCiAgICogZHVlIHRvIGFuIGFjY2VzcyB2aW9sYXRpb24gdGhlIDMyLWJpdCBleGl0IGNvZGUgaXMgYDB4YzAwMDAwMDVgLAogICAqIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgYXMgdGhlIG5lZ2F0aXZlIG51bWJlciBgLTEwNzM3NDE4MTlgLiBUbwogICAqIGdldCB0aGUgb3JpZ2luYWwgMzItYml0IHZhbHVlIHVzZSBgKDB4MTAwMDAwMDAwICsgZXhpdENvZGUpICYKICAgKiAweGZmZmZmZmZmYC4KICAgKgogICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IFtzdGRvdXRdIGFuZCBbc3RkZXJyXSBoYXZlIGZpbmlzaGVkIHJlcG9ydGluZwogICAqIHRoZSBidWZmZXJlZCBvdXRwdXQgb2YgdGhlIHByb2Nlc3Mgd2hlbiB0aGUgcmV0dXJuZWQgZnV0dXJlIGNvbXBsZXRlcy4KICAgKiBUbyBiZSBzdXJlIHRoYXQgYWxsIG91dHB1dCBpcyBjYXB0dXJlZCwKICAgKiB3YWl0IGZvciB0aGUgZG9uZSBldmVudCBvbiB0aGUgc3RyZWFtcy4KICAgKi8KICBGdXR1cmU8aW50PiBnZXQgZXhpdENvZGU7CgogIC8qKgogICAqIFN0YXJ0cyBhIHByb2Nlc3MgcnVubmluZyB0aGUgW2V4ZWN1dGFibGVdIHdpdGggdGhlIHNwZWNpZmllZAogICAqIFthcmd1bWVudHNdLiBSZXR1cm5zIGEgWzpGdXR1cmU8UHJvY2Vzcz46XSB0aGF0IGNvbXBsZXRlcyB3aXRoIGEKICAgKiBQcm9jZXNzIGluc3RhbmNlIHdoZW4gdGhlIHByb2Nlc3MgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CiAgICogc3RhcnRlZC4gVGhhdCBbUHJvY2Vzc10gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlCiAgICogcHJvY2Vzcy4gSWYgdGhlIHByb2Nlc3MgY2Fubm90IGJlIHN0YXJ0ZWQgdGhlIHJldHVybmVkIFtGdXR1cmVdCiAgICogY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgogICAqCiAgICogVXNlIFt3b3JraW5nRGlyZWN0b3J5XSB0byBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgcHJvY2Vzcy4gTm90ZQogICAqIHRoYXQgdGhlIGNoYW5nZSBvZiBkaXJlY3Rvcnkgb2NjdXJzIGJlZm9yZSBleGVjdXRpbmcgdGhlIHByb2Nlc3Mgb24gc29tZQogICAqIHBsYXRmb3Jtcywgd2hpY2ggbWF5IGhhdmUgaW1wYWN0IHdoZW4gdXNpbmcgcmVsYXRpdmUgcGF0aHMgZm9yIHRoZQogICAqIGV4ZWN1dGFibGUgYW5kIHRoZSBhcmd1bWVudHMuCiAgICoKICAgKiBVc2UgW2Vudmlyb25tZW50XSB0byBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIHByb2Nlc3MuIElmIG5vdAogICAqIHNldCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHBhcmVudCBwcm9jZXNzIGlzIGluaGVyaXRlZC4gQ3VycmVudGx5LCBvbmx5CiAgICogVVMtQVNDSUkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzdXBwb3J0ZWQgYW5kIGVycm9ycyBhcmUgbGlrZWx5IHRvIG9jY3VyCiAgICogaWYgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBjb2RlLXBvaW50cyBvdXRzaWRlIHRoZSBVUy1BU0NJSSByYW5nZSBpcwogICAqIHBhc3NlZCBpbi4KICAgKgogICAqIElmIFtpbmNsdWRlUGFyZW50RW52aXJvbm1lbnRdIGlzIGB0cnVlYCwgdGhlIHByb2Nlc3MncyBlbnZpcm9ubWVudCB3aWxsCiAgICogaW5jbHVkZSB0aGUgcGFyZW50IHByb2Nlc3MncyBlbnZpcm9ubWVudCwgd2l0aCBbZW52aXJvbm1lbnRdIHRha2luZwogICAqIHByZWNlZGVuY2UuIERlZmF1bHQgaXMgYHRydWVgLgogICAqCiAgICogSWYgW3J1bkluU2hlbGxdIGlzIGB0cnVlYCwgdGhlIHByb2Nlc3Mgd2lsbCBiZSBzcGF3bmVkIHRocm91Z2ggYSBzeXN0ZW0KICAgKiBzaGVsbC4gT24gTGludXggYW5kIE9TIFgsIFs6L2Jpbi9zaDpdIGlzIHVzZWQsIHdoaWxlCiAgICogWzolV0lORElSJVxzeXN0ZW0zMlxjbWQuZXhlOl0gaXMgdXNlZCBvbiBXaW5kb3dzLgogICAqCiAgICogVXNlcnMgbXVzdCByZWFkIGFsbCBkYXRhIGNvbWluZyBvbiB0aGUgW3N0ZG91dF0gYW5kIFtzdGRlcnJdCiAgICogc3RyZWFtcyBvZiBwcm9jZXNzZXMgc3RhcnRlZCB3aXRoIFs6UHJvY2Vzcy5zdGFydDpdLiBJZiB0aGUgdXNlcgogICAqIGRvZXMgbm90IHJlYWQgYWxsIGRhdGEgb24gdGhlIHN0cmVhbXMgdGhlIHVuZGVybHlpbmcgc3lzdGVtCiAgICogcmVzb3VyY2VzIHdpbGwgbm90IGJlIHJlbGVhc2VkIHNpbmNlIHRoZXJlIGlzIHN0aWxsIHBlbmRpbmcgZGF0YS4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgY29kZSB1c2VzIGBQcm9jZXNzLnN0YXJ0YCB0byBncmVwIGZvciBgbWFpbmAgaW4gdGhlCiAgICogZmlsZSBgdGVzdC5kYXJ0YCBvbiBMaW51eC4KICAgKgogICAqICAgICBQcm9jZXNzLnN0YXJ0KCdncmVwJywgWyctaScsICdtYWluJywgJ3Rlc3QuZGFydCddKS50aGVuKChwcm9jZXNzKSB7CiAgICogICAgICAgc3Rkb3V0LmFkZFN0cmVhbShwcm9jZXNzLnN0ZG91dCk7CiAgICogICAgICAgc3RkZXJyLmFkZFN0cmVhbShwcm9jZXNzLnN0ZGVycik7CiAgICogICAgIH0pOwogICAqCiAgICogSWYgW21vZGVdIGlzIFtQcm9jZXNzU3RhcnRNb2RlLm5vcm1hbF0gKHRoZSBkZWZhdWx0KSBhIGNoaWxkCiAgICogcHJvY2VzcyB3aWxsIGJlIHN0YXJ0ZWQgd2l0aCBgc3RkaW5gLCBgc3Rkb3V0YCBhbmQgYHN0ZGVycmAKICAgKiBjb25uZWN0ZWQuCiAgICoKICAgKiBJZiBgbW9kZWAgaXMgW1Byb2Nlc3NTdGFydE1vZGUuZGV0YWNoZWRdIGEgZGV0YWNoZWQgcHJvY2VzcyB3aWxsCiAgICogYmUgY3JlYXRlZC4gQSBkZXRhY2hlZCBwcm9jZXNzIGhhcyBubyBjb25uZWN0aW9uIHRvIGl0cyBwYXJlbnQsCiAgICogYW5kIGNhbiBrZWVwIHJ1bm5pbmcgb24gaXRzIG93biB3aGVuIHRoZSBwYXJlbnQgZGllcy4gVGhlIG9ubHkKICAgKiBpbmZvcm1hdGlvbiBhdmFpbGFibGUgZnJvbSBhIGRldGFjaGVkIHByb2Nlc3MgaXMgaXRzIGBwaWRgLiBUaGVyZQogICAqIGlzIG5vIGNvbm5lY3Rpb24gdG8gaXRzIGBzdGRpbmAsIGBzdGRvdXRgIG9yIGBzdGRlcnJgLCBub3Igd2lsbAogICAqIHRoZSBwcm9jZXNzJyBleGl0IGNvZGUgYmVjb21lIGF2YWlsYWJsZSB3aGVuIGl0IHRlcm1pbmF0ZXMuCiAgICoKICAgKiBJZiBgbW9kZWAgaXMgW1Byb2Nlc3NTdGFydE1vZGUuZGV0YWNoZWRXaXRoU3RkaW9dIGEgZGV0YWNoZWQKICAgKiBwcm9jZXNzIHdpbGwgYmUgY3JlYXRlZCB3aGVyZSB0aGUgYHN0ZGluYCwgYHN0ZG91dGAgYW5kIGBzdGRlcnJgCiAgICogYXJlIGNvbm5lY3RlZC4gVGhlIGNyZWF0b3IgY2FuIGNvbW11bmljYXRlIHdpdGggdGhlIGNoaWxkIHRocm91Z2gKICAgKiB0aGVzZS4gVGhlIGRldGFjaGVkIHByb2Nlc3Mgd2lsbCBrZWVwIHJ1bm5pbmcgZXZlbiBpZiB0aGVzZQogICAqIGNvbW11bmljYXRpb24gY2hhbm5lbHMgYXJlIGNsb3NlZC4gVGhlIHByb2Nlc3MnIGV4aXQgY29kZSB3aWxsCiAgICogbm90IGJlY29tZSBhdmFpbGFibGUgd2hlbiBpdCB0ZXJtaW5hdGVkLgogICAqCiAgICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGBtb2RlYCBpcyBgUHJvY2Vzc1N0YXJ0TW9kZS5ub3JtYWxgLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8UHJvY2Vzcz4gc3RhcnQoCiAgICAgIFN0cmluZyBleGVjdXRhYmxlLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICB7U3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50OiB0cnVlLAogICAgICBib29sIHJ1bkluU2hlbGw6IGZhbHNlLAogICAgICBQcm9jZXNzU3RhcnRNb2RlIG1vZGU6IFByb2Nlc3NTdGFydE1vZGUubm9ybWFsfSk7CgogIC8qKgogICAqIFN0YXJ0cyBhIHByb2Nlc3MgYW5kIHJ1bnMgaXQgbm9uLWludGVyYWN0aXZlbHkgdG8gY29tcGxldGlvbi4gVGhlCiAgICogcHJvY2VzcyBydW4gaXMgW2V4ZWN1dGFibGVdIHdpdGggdGhlIHNwZWNpZmllZCBbYXJndW1lbnRzXS4KICAgKgogICAqIFVzZSBbd29ya2luZ0RpcmVjdG9yeV0gdG8gc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHByb2Nlc3MuIE5vdGUKICAgKiB0aGF0IHRoZSBjaGFuZ2Ugb2YgZGlyZWN0b3J5IG9jY3VycyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBwcm9jZXNzIG9uIHNvbWUKICAgKiBwbGF0Zm9ybXMsIHdoaWNoIG1heSBoYXZlIGltcGFjdCB3aGVuIHVzaW5nIHJlbGF0aXZlIHBhdGhzIGZvciB0aGUKICAgKiBleGVjdXRhYmxlIGFuZCB0aGUgYXJndW1lbnRzLgogICAqCiAgICogVXNlIFtlbnZpcm9ubWVudF0gdG8gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBwcm9jZXNzLiBJZiBub3QKICAgKiBzZXQgdGhlIGVudmlyb25tZW50IG9mIHRoZSBwYXJlbnQgcHJvY2VzcyBpcyBpbmhlcml0ZWQuIEN1cnJlbnRseSwgb25seQogICAqIFVTLUFTQ0lJIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3VwcG9ydGVkIGFuZCBlcnJvcnMgYXJlIGxpa2VseSB0byBvY2N1cgogICAqIGlmIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGggY29kZS1wb2ludHMgb3V0c2lkZSB0aGUgVVMtQVNDSUkgcmFuZ2UgaXMKICAgKiBwYXNzZWQgaW4uCiAgICoKICAgKiBJZiBbaW5jbHVkZVBhcmVudEVudmlyb25tZW50XSBpcyBgdHJ1ZWAsIHRoZSBwcm9jZXNzJ3MgZW52aXJvbm1lbnQgd2lsbAogICAqIGluY2x1ZGUgdGhlIHBhcmVudCBwcm9jZXNzJ3MgZW52aXJvbm1lbnQsIHdpdGggW2Vudmlyb25tZW50XSB0YWtpbmcKICAgKiBwcmVjZWRlbmNlLiBEZWZhdWx0IGlzIGB0cnVlYC4KICAgKgogICAqIElmIFtydW5JblNoZWxsXSBpcyB0cnVlLCB0aGUgcHJvY2VzcyB3aWxsIGJlIHNwYXduZWQgdGhyb3VnaCBhIHN5c3RlbQogICAqIHNoZWxsLiBPbiBMaW51eCBhbmQgT1MgWCwgYC9iaW4vc2hgIGlzIHVzZWQsIHdoaWxlCiAgICogYCVXSU5ESVIlXHN5c3RlbTMyXGNtZC5leGVgIGlzIHVzZWQgb24gV2luZG93cy4KICAgKgogICAqIFRoZSBlbmNvZGluZyB1c2VkIGZvciBkZWNvZGluZyBgc3Rkb3V0YCBhbmQgYHN0ZGVycmAgaW50byB0ZXh0IGlzCiAgICogY29udHJvbGxlZCB0aHJvdWdoIFtzdGRvdXRFbmNvZGluZ10gYW5kIFtzdGRlcnJFbmNvZGluZ10uIFRoZQogICAqIGRlZmF1bHQgZW5jb2RpbmcgaXMgW3N5c3RlbUVuY29kaW5nXS4gSWYgYG51bGxgIGlzIHVzZWQgbm8KICAgKiBkZWNvZGluZyB3aWxsIGhhcHBlbiBhbmQgdGhlIFtQcm9jZXNzUmVzdWx0XSB3aWxsIGhvbGQgYmluYXJ5CiAgICogZGF0YS4KICAgKgogICAqIFJldHVybnMgYSBgRnV0dXJlPFByb2Nlc3NSZXN1bHQ+YCB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZQogICAqIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBwcm9jZXNzLCBpLmUuLCBleGl0IGNvZGUsIHN0YW5kYXJkIG91dCBhbmQKICAgKiBzdGFuZGFyZCBpbi4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgY29kZSB1c2VzIGBQcm9jZXNzLnJ1bmAgdG8gZ3JlcCBmb3IgYG1haW5gIGluIHRoZQogICAqIGZpbGUgYHRlc3QuZGFydGAgb24gTGludXguCiAgICoKICAgKiAgICAgUHJvY2Vzcy5ydW4oJ2dyZXAnLCBbJy1pJywgJ21haW4nLCAndGVzdC5kYXJ0J10pLnRoZW4oKHJlc3VsdCkgewogICAqICAgICAgIHN0ZG91dC53cml0ZShyZXN1bHQuc3Rkb3V0KTsKICAgKiAgICAgICBzdGRlcnIud3JpdGUocmVzdWx0LnN0ZGVycik7CiAgICogICAgIH0pOwogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8UHJvY2Vzc1Jlc3VsdD4gcnVuKAogICAgICBTdHJpbmcgZXhlY3V0YWJsZSwgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cywKICAgICAge1N0cmluZyB3b3JraW5nRGlyZWN0b3J5LAogICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudmlyb25tZW50LAogICAgICBib29sIGluY2x1ZGVQYXJlbnRFbnZpcm9ubWVudDogdHJ1ZSwKICAgICAgYm9vbCBydW5JblNoZWxsOiBmYWxzZSwKICAgICAgRW5jb2Rpbmcgc3Rkb3V0RW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nLAogICAgICBFbmNvZGluZyBzdGRlcnJFbmNvZGluZzogc3lzdGVtRW5jb2Rpbmd9KTsKCiAgLyoqCiAgICogU3RhcnRzIGEgcHJvY2VzcyBhbmQgcnVucyBpdCB0byBjb21wbGV0aW9uLiBUaGlzIGlzIGEgc3luY2hyb25vdXMKICAgKiBjYWxsIGFuZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBjaGlsZCBwcm9jZXNzIHRlcm1pbmF0ZXMuCiAgICoKICAgKiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYFByb2Nlc3MucnVuYC4KICAgKgogICAqIFJldHVybnMgYSBgUHJvY2Vzc1Jlc3VsdGAgd2l0aCB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIHByb2Nlc3MsCiAgICogaS5lLiwgZXhpdCBjb2RlLCBzdGFuZGFyZCBvdXQgYW5kIHN0YW5kYXJkIGluLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBQcm9jZXNzUmVzdWx0IHJ1blN5bmMoCiAgICAgIFN0cmluZyBleGVjdXRhYmxlLCBMaXN0PFN0cmluZz4gYXJndW1lbnRzLAogICAgICB7U3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQsCiAgICAgIGJvb2wgaW5jbHVkZVBhcmVudEVudmlyb25tZW50OiB0cnVlLAogICAgICBib29sIHJ1bkluU2hlbGw6IGZhbHNlLAogICAgICBFbmNvZGluZyBzdGRvdXRFbmNvZGluZzogc3lzdGVtRW5jb2RpbmcsCiAgICAgIEVuY29kaW5nIHN0ZGVyckVuY29kaW5nOiBzeXN0ZW1FbmNvZGluZ30pOwoKICAvKioKICAgKiBLaWxscyB0aGUgcHJvY2VzcyB3aXRoIGlkIFtwaWRdLgogICAqCiAgICogV2hlcmUgcG9zc2libGUsIHNlbmRzIHRoZSBbc2lnbmFsXSB0byB0aGUgcHJvY2VzcyB3aXRoIGlkCiAgICogYHBpZGAuIFRoaXMgaW5jbHVkZXMgTGludXggYW5kIE9TIFguIFRoZSBkZWZhdWx0IHNpZ25hbCBpcwogICAqIFtQcm9jZXNzU2lnbmFsLnNpZ3Rlcm1dIHdoaWNoIHdpbGwgbm9ybWFsbHkgdGVybWluYXRlIHRoZQogICAqIHByb2Nlc3MuCiAgICoKICAgKiBPbiBwbGF0Zm9ybXMgd2l0aG91dCBzaWduYWwgc3VwcG9ydCwgaW5jbHVkaW5nIFdpbmRvd3MsIHRoZSBjYWxsCiAgICoganVzdCB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzIHdpdGggaWQgYHBpZGAgaW4gYSBwbGF0Zm9ybSBzcGVjaWZpYwogICAqIHdheSwgYW5kIHRoZSBgc2lnbmFsYCBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgKgogICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzaWduYWwgaXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCB0byB0aGUKICAgKiBwcm9jZXNzLiBPdGhlcndpc2UgdGhlIHNpZ25hbCBjb3VsZCBub3QgYmUgc2VudCwgdXN1YWxseSBtZWFuaW5nCiAgICogdGhhdCB0aGUgcHJvY2VzcyBpcyBhbHJlYWR5IGRlYWQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGJvb2wga2lsbFBpZChpbnQgcGlkLAogICAgICBbUHJvY2Vzc1NpZ25hbCBzaWduYWwgPSBQcm9jZXNzU2lnbmFsLnNpZ3Rlcm1dKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSBvZiB0aGUgcHJvY2VzcyBhcyBhIFs6U3RyZWFtOl0uCiAgICovCiAgU3RyZWFtPExpc3Q8aW50Pj4gZ2V0IHN0ZG91dDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIG9mIHRoZSBwcm9jZXNzIGFzIGEgWzpTdHJlYW06XS4KICAgKi8KICBTdHJlYW08TGlzdDxpbnQ+PiBnZXQgc3RkZXJyOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBpbnB1dCBzdHJlYW0gb2YgdGhlIHByb2Nlc3MgYXMgYW4gW0lPU2lua10uCiAgICovCiAgSU9TaW5rIGdldCBzdGRpbjsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcHJvY2VzcyBpZCBvZiB0aGUgcHJvY2Vzcy4KICAgKi8KICBpbnQgZ2V0IHBpZDsKCiAgLyoqCiAgICogS2lsbHMgdGhlIHByb2Nlc3MuCiAgICoKICAgKiBXaGVyZSBwb3NzaWJsZSwgc2VuZHMgdGhlIFtzaWduYWxdIHRvIHRoZSBwcm9jZXNzLiBUaGlzIGluY2x1ZGVzCiAgICogTGludXggYW5kIE9TIFguIFRoZSBkZWZhdWx0IHNpZ25hbCBpcyBbUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtXQogICAqIHdoaWNoIHdpbGwgbm9ybWFsbHkgdGVybWluYXRlIHRoZSBwcm9jZXNzLgogICAqCiAgICogT24gcGxhdGZvcm1zIHdpdGhvdXQgc2lnbmFsIHN1cHBvcnQsIGluY2x1ZGluZyBXaW5kb3dzLCB0aGUgY2FsbAogICAqIGp1c3QgdGVybWluYXRlcyB0aGUgcHJvY2VzcyBpbiBhIHBsYXRmb3JtIHNwZWNpZmljIHdheSwgYW5kIHRoZQogICAqIGBzaWduYWxgIHBhcmFtZXRlciBpcyBpZ25vcmVkLgogICAqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNpZ25hbCBpcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkIHRvIHRoZQogICAqIHByb2Nlc3MuIE90aGVyd2lzZSB0aGUgc2lnbmFsIGNvdWxkIG5vdCBiZSBzZW50LCB1c3VhbGx5IG1lYW5pbmcKICAgKiB0aGF0IHRoZSBwcm9jZXNzIGlzIGFscmVhZHkgZGVhZC4KICAgKi8KICBib29sIGtpbGwoW1Byb2Nlc3NTaWduYWwgc2lnbmFsID0gUHJvY2Vzc1NpZ25hbC5zaWd0ZXJtXSk7Cn0KCi8qKgogKiBbUHJvY2Vzc1Jlc3VsdF0gcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSBub24taW50ZXJhY3RpdmUKICogcHJvY2VzcyBzdGFydGVkIHdpdGggW1Byb2Nlc3MucnVuXSBvciBbUHJvY2Vzcy5ydW5TeW5jXS4KICovCmNsYXNzIFByb2Nlc3NSZXN1bHQgewogIC8qKgogICAqIEV4aXQgY29kZSBmb3IgdGhlIHByb2Nlc3MuCiAgICoKICAgKiBTZWUgW1Byb2Nlc3MuZXhpdENvZGVdIGZvciBtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBleGl0IGNvZGUKICAgKiB2YWx1ZS4KICAgKi8KICBmaW5hbCBpbnQgZXhpdENvZGU7CgogIC8qKgogICAqIFN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBwcm9jZXNzLiBUaGUgdmFsdWUgdXNlZCBmb3IgdGhlCiAgICogYHN0ZG91dEVuY29kaW5nYCBhcmd1bWVudCB0byBgUHJvY2Vzcy5ydW5gIGRldGVybWluZXMgdGhlIHR5cGUuIElmCiAgICogYG51bGxgIHdhcyB1c2VkIHRoaXMgdmFsdWUgaXMgb2YgdHlwZSBgTGlzdDxpbnQ+YCBvdGhlcndpc2UgaXQgaXMKICAgKiBvZiB0eXBlIGBTdHJpbmdgLgogICAqLwogIGZpbmFsIHN0ZG91dDsKCiAgLyoqCiAgICogU3RhbmRhcmQgZXJyb3IgZnJvbSB0aGUgcHJvY2Vzcy4gVGhlIHZhbHVlIHVzZWQgZm9yIHRoZQogICAqIGBzdGRlcnJFbmNvZGluZ2AgYXJndW1lbnQgdG8gYFByb2Nlc3MucnVuYCBkZXRlcm1pbmVzIHRoZSB0eXBlLiBJZgogICAqIGBudWxsYCB3YXMgdXNlZCB0aGlzIHZhbHVlIGlzIG9mIHR5cGUgYExpc3Q8aW50PmAKICAgKiBvdGhlcndpc2UgaXQgaXMgb2YgdHlwZSBgU3RyaW5nYC4KICAgKi8KICBmaW5hbCBzdGRlcnI7CgogIC8qKgogICAqIFByb2Nlc3MgaWQgb2YgdGhlIHByb2Nlc3MuCiAgICovCiAgZmluYWwgaW50IHBpZDsKCiAgUHJvY2Vzc1Jlc3VsdCh0aGlzLnBpZCwgdGhpcy5leGl0Q29kZSwgdGhpcy5zdGRvdXQsIHRoaXMuc3RkZXJyKTsKfQoKLyoqCiAqIE9uIFBvc2l4IHN5c3RlbXMsIFtQcm9jZXNzU2lnbmFsXSBpcyB1c2VkIHRvIHNlbmQgYSBzcGVjaWZpYyBzaWduYWwKICogdG8gYSBjaGlsZCBwcm9jZXNzLCBzZWUgWzpQcm9jZXNzLmtpbGw6XS4KICoKICogU29tZSBbUHJvY2Vzc1NpZ25hbF1zIGNhbiBhbHNvIGJlIHdhdGNoZWQsIGFzIGEgd2F5IHRvIGludGVyY2VwdCB0aGUgZGVmYXVsdAogKiBzaWduYWwgaGFuZGxlciBhbmQgaW1wbGVtZW50IGFub3RoZXIuIFNlZSBbUHJvY2Vzc1NpZ25hbC53YXRjaF0gZm9yIG1vcmUKICogaW5mb3JtYXRpb24uCiAqLwpjbGFzcyBQcm9jZXNzU2lnbmFsIHsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdodXAgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMSwgIlNJR0hVUCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2ludCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyLCAiU0lHSU5UIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lncXVpdCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygzLCAiU0lHUVVJVCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2lsbCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXyg0LCAiU0lHSUxMIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndHJhcCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXyg1LCAiU0lHVFJBUCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2FicnQgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oNiwgIlNJR0FCUlQiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdidXMgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oNywgIlNJR0JVUyIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2ZwZSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXyg4LCAiU0lHRlBFIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lna2lsbCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXyg5LCAiU0lHS0lMTCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3VzcjEgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTAsICJTSUdVU1IxIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnc2VndiA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxMSwgIlNJR1NFR1YiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd1c3IyID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDEyLCAiU0lHVVNSMiIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3BpcGUgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTMsICJTSUdQSVBFIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnYWxybSA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxNCwgIlNJR0FMUk0iKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd0ZXJtID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDE1LCAiU0lHVEVSTSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ2NobGQgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMTcsICJTSUdDSExEIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lnY29udCA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygxOCwgIlNJR0NPTlQiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdzdG9wID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDE5LCAiU0lHU1RPUCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3RzdHAgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjAsICJTSUdUU1RQIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lndHRpbiA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyMSwgIlNJR1RUSU4iKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd0dG91ID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDIyLCAiU0lHVFRPVSIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3VyZyA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyMywgIlNJR1VSRyIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3hjcHUgPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjQsICJTSUdYQ1BVIik7CiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgc2lneGZzeiA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygyNSwgIlNJR1hGU1oiKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWd2dGFscm0gPSBjb25zdCBQcm9jZXNzU2lnbmFsLl8oMjYsICJTSUdWVEFMUk0iKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdwcm9mID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDI3LCAiU0lHUFJPRiIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3dpbmNoID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDI4LCAiU0lHV0lOQ0giKTsKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBzaWdwb2xsID0gY29uc3QgUHJvY2Vzc1NpZ25hbC5fKDI5LCAiU0lHUE9MTCIpOwogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIHNpZ3N5cyA9IGNvbnN0IFByb2Nlc3NTaWduYWwuXygzMSwgIlNJR1NZUyIpOwoKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2h1cCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdIVVAgPSBzaWdodXA7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdpbnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHSU5UID0gc2lnaW50OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lncXVpdCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdRVUlUID0gc2lncXVpdDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2lsbCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdJTEwgPSBzaWdpbGw7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd0cmFwIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1RSQVAgPSBzaWd0cmFwOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnYWJydCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdBQlJUID0gc2lnYWJydDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2J1cyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdCVVMgPSBzaWdidXM7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdmcGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHRlBFID0gc2lnZnBlOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lna2lsbCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdLSUxMID0gc2lna2lsbDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3VzcjEgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVVNSMSA9IHNpZ3VzcjE7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdzZWd2IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1NFR1YgPSBzaWdzZWd2OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndXNyMiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdVU1IyID0gc2lndXNyMjsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3BpcGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHUElQRSA9IHNpZ3BpcGU7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdhbHJtIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0FMUk0gPSBzaWdhbHJtOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndGVybSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdURVJNID0gc2lndGVybTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ2NobGQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHQ0hMRCA9IHNpZ2NobGQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdjb250IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR0NPTlQgPSBzaWdjb250OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnc3RvcCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdTVE9QID0gc2lnc3RvcDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3RzdHAgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHVFNUUCA9IHNpZ3RzdHA7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd0dGluIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1RUSU4gPSBzaWd0dGluOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lndHRvdSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdUVE9VID0gc2lndHRvdTsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3VyZyBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdVUkcgPSBzaWd1cmc7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWd4Y3B1IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1hDUFUgPSBzaWd4Y3B1OwogIEBEZXByZWNhdGVkKCJVc2Ugc2lneGZzeiBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdYRlNaID0gc2lneGZzejsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3Z0YWxybSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUHJvY2Vzc1NpZ25hbCBTSUdWVEFMUk0gPSBzaWd2dGFscm07CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdwcm9mIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQcm9jZXNzU2lnbmFsIFNJR1BST0YgPSBzaWdwcm9mOwogIEBEZXByZWNhdGVkKCJVc2Ugc2lnd2luY2ggaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHV0lOQ0ggPSBzaWd3aW5jaDsKICBARGVwcmVjYXRlZCgiVXNlIHNpZ3BvbGwgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHUE9MTCA9IHNpZ3BvbGw7CiAgQERlcHJlY2F0ZWQoIlVzZSBzaWdzeXMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFByb2Nlc3NTaWduYWwgU0lHU1lTID0gc2lnc3lzOwoKICBmaW5hbCBpbnQgX3NpZ25hbE51bWJlcjsKICBmaW5hbCBTdHJpbmcgX25hbWU7CgogIGNvbnN0IFByb2Nlc3NTaWduYWwuXyh0aGlzLl9zaWduYWxOdW1iZXIsIHRoaXMuX25hbWUpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfbmFtZTsKCiAgLyoqCiAgICogV2F0Y2ggZm9yIHByb2Nlc3Mgc2lnbmFscy4KICAgKgogICAqIFRoZSBmb2xsb3dpbmcgW1Byb2Nlc3NTaWduYWxdcyBjYW4gYmUgbGlzdGVuZWQgdG86CiAgICoKICAgKiAgICogW1Byb2Nlc3NTaWduYWwuc2lnaHVwXS4KICAgKiAgICogW1Byb2Nlc3NTaWduYWwuc2lnaW50XS4gU2lnbmFsIHNlbnQgYnkgZS5nLiBDVFJMLUMuCiAgICogICAqIFtQcm9jZXNzU2lnbmFsLnNpZ3Rlcm1dLiBOb3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCiAgICogICAqIFtQcm9jZXNzU2lnbmFsLnNpZ3VzcjFdLiBOb3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCiAgICogICAqIFtQcm9jZXNzU2lnbmFsLnNpZ3VzcjJdLiBOb3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCiAgICogICAqIFtQcm9jZXNzU2lnbmFsLnNpZ3dpbmNoXS4gTm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgogICAqCiAgICogT3RoZXIgc2lnbmFscyBhcmUgZGlzYWxsb3dlZCwgYXMgdGhleSBtYXkgYmUgdXNlZCBieSB0aGUgVk0uCiAgICoKICAgKiBBIHNpZ25hbCBjYW4gYmUgd2F0Y2hlZCBtdWx0aXBsZSB0aW1lcywgZnJvbSBtdWx0aXBsZSBpc29sYXRlcywgd2hlcmUgYWxsCiAgICogY2FsbGJhY2tzIGFyZSBpbnZva2VkIHdoZW4gc2lnbmFsZWQsIGluIG5vIHNwZWNpZmljIG9yZGVyLgogICAqLwogIFN0cmVhbTxQcm9jZXNzU2lnbmFsPiB3YXRjaCgpID0+IF9Qcm9jZXNzVXRpbHMuX3dhdGNoU2lnbmFsKHRoaXMpOwp9CgpjbGFzcyBTaWduYWxFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgZmluYWwgb3NFcnJvcjsKCiAgY29uc3QgU2lnbmFsRXhjZXB0aW9uKHRoaXMubWVzc2FnZSwgW3RoaXMub3NFcnJvcl0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICB2YXIgbXNnID0gIiI7CiAgICBpZiAob3NFcnJvciAhPSBudWxsKSB7CiAgICAgIG1zZyA9ICIsIG9zRXJyb3I6ICRvc0Vycm9yIjsKICAgIH0KICAgIHJldHVybiAiU2lnbmFsRXhjZXB0aW9uOiAkbWVzc2FnZSRtc2ciOwogIH0KfQoKY2xhc3MgUHJvY2Vzc0V4Y2VwdGlvbiBpbXBsZW1lbnRzIElPRXhjZXB0aW9uIHsKICAvKioKICAgKiBDb250YWlucyB0aGUgZXhlY3V0YWJsZSBwcm92aWRlZCBmb3IgdGhlIHByb2Nlc3MuCiAgICovCiAgZmluYWwgU3RyaW5nIGV4ZWN1dGFibGU7CgogIC8qKgogICAqIENvbnRhaW5zIHRoZSBhcmd1bWVudHMgcHJvdmlkZWQgZm9yIHRoZSBwcm9jZXNzLgogICAqLwogIGZpbmFsIExpc3Q8U3RyaW5nPiBhcmd1bWVudHM7CgogIC8qKgogICAqIENvbnRhaW5zIHRoZSBzeXN0ZW0gbWVzc2FnZSBmb3IgdGhlIHByb2Nlc3MgZXhjZXB0aW9uIGlmIGFueS4KICAgKi8KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgLyoqCiAgICogQ29udGFpbnMgdGhlIE9TIGVycm9yIGNvZGUgZm9yIHRoZSBwcm9jZXNzIGV4Y2VwdGlvbiBpZiBhbnkuCiAgICovCiAgZmluYWwgaW50IGVycm9yQ29kZTsKCiAgY29uc3QgUHJvY2Vzc0V4Y2VwdGlvbih0aGlzLmV4ZWN1dGFibGUsIHRoaXMuYXJndW1lbnRzLAogICAgICBbdGhpcy5tZXNzYWdlID0gIiIsIHRoaXMuZXJyb3JDb2RlID0gMF0pOwogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHZhciBtc2cgPSAobWVzc2FnZSA9PSBudWxsKSA/ICdPUyBlcnJvciBjb2RlOiAkZXJyb3JDb2RlJyA6IG1lc3NhZ2U7CiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cy5qb2luKCcgJyk7CiAgICByZXR1cm4gIlByb2Nlc3NFeGNlcHRpb246ICRtc2dcbiAgQ29tbWFuZDogJGV4ZWN1dGFibGUgJGFyZ3MiOwogIH0KfQqCvgBOTjwBEQE5KxYqMSYrLUwCAQRCA0oxA0tHSERDFAM0A0VDREQ4A0RGDANGQzIDRkE/GgQWLCMgPQQdAgEELQNGRRoDGQNDDgQeLCQCAQQtA0ZFGgNDDgQyAQQzA0Y3BCAuGkMEJCA+BCYCAQQrBCkBBEcUBBQGPgVNTk8MBiYBBk0OBU1OTwwGIgIBBCQEGRw9JCABOEMqLQFBPyYkAUYoSC84AUgQFhIaCRdQARMwAgEEIwNESEcUAyoDRU1LSVAzAxkDEEpCIg0JAywDOz04Iz4DSyw9NAMZHgMQOxooMTM0Ng0JAxsDTDdJF0saAz8cAxEDQ0dAA0s6ODMDGQMQNjYuLA8NCQMWA15HKwQZBkwhBTYFRkdFPUVIEAVBRjxFRkVDEgVOTC0tBhwBBkJGPUVFIgVPTkgjBVBNUU8QBU1JJAVNOjcFQkZBRwVHIAVNLS0NBUJBEAVGRURHRUEFQkZHQUQuBUAGKTEgJyseOAEGR0EFT05IIwVQTVFPEAVNSSQFSzg1BUdDQEMLBT9GEgVFIAVKKCgNBi0xICcrHi8xAQZHPQU2BUc0BikxICcrHi8xAQYmBT9APw4FRkYxBUNGJwYoNwEGSAYgAQZHBiABBkYGFAEGLAYPAQYYBUZDMAVGRSQFQ0YnBj0CAQRGPAQWBiAFQgwGFgEGPkhHFwYQAQY9SDcnBhABBiAGEQFEAgEERy0DUEwQBBZKSkxKTExKSkxNTU1NTU1NTU1NTU1LTU1RTU9NSwEkLiQuJTAkLiUwJTAkLiQuJTAlMCUwJTAlMCUwJTAlMCUwJTAlMCUwJTAkLiUwJTAnNCUwJjIlMCQuARsWATkBHgEGIAU4BSE9PDw8PQVCBU9ABkUCAS8YEQE3ARYSGyMGLAQCATAGNwYbAQY2BiABBkMGGAEGQgYXATowFkkkQwQCARRkYXJ0OmlvL3Byb2Nlc3MuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vc2VjdXJlX3NvY2tldC5kYXJ0wACsNy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuaW87CgovKioKICogQSBoaWdoLWxldmVsIGNsYXNzIGZvciBjb21tdW5pY2F0aW5nIHNlY3VyZWx5IG92ZXIgYSBUQ1Agc29ja2V0LCB1c2luZwogKiBUTFMgYW5kIFNTTC4gVGhlIFtTZWN1cmVTb2NrZXRdIGV4cG9zZXMgYm90aCBhIFtTdHJlYW1dIGFuZCBhbgogKiBbSU9TaW5rXSBpbnRlcmZhY2UsIG1ha2luZyBpdCBpZGVhbCBmb3IgdXNpbmcgdG9nZXRoZXIgd2l0aAogKiBvdGhlciBbU3RyZWFtXXMuCiAqLwphYnN0cmFjdCBjbGFzcyBTZWN1cmVTb2NrZXQgaW1wbGVtZW50cyBTb2NrZXQgewogIGV4dGVybmFsIGZhY3RvcnkgU2VjdXJlU29ja2V0Ll8oUmF3U2VjdXJlU29ja2V0IHJhd1NvY2tldCk7CgogIC8qKgogICAqIENvbnN0cnVjdHMgYSBuZXcgc2VjdXJlIGNsaWVudCBzb2NrZXQgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBnaXZlbgogICAqIFtob3N0XSBvbiBwb3J0IFtwb3J0XS4gVGhlIHJldHVybmVkIEZ1dHVyZSB3aWxsIGNvbXBsZXRlIHdpdGggYQogICAqIFtTZWN1cmVTb2NrZXRdIHRoYXQgaXMgY29ubmVjdGVkIGFuZCByZWFkeSBmb3Igc3Vic2NyaXB0aW9uLgogICAqCiAgICogVGhlIGNlcnRpZmljYXRlIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgaXMgY2hlY2tlZAogICAqIHVzaW5nIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlcyBzZXQgaW4gdGhlIFNlY3VyaXR5Q29udGV4dCBvYmplY3QuCiAgICogVGhlIGRlZmF1bHQgU2VjdXJpdHlDb250ZXh0IG9iamVjdCBjb250YWlucyBhIGJ1aWx0LWluIHNldCBvZiB0cnVzdGVkCiAgICogcm9vdCBjZXJ0aWZpY2F0ZXMgZm9yIHdlbGwta25vd24gY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMuCiAgICoKICAgKiBbb25CYWRDZXJ0aWZpY2F0ZV0gaXMgYW4gb3B0aW9uYWwgaGFuZGxlciBmb3IgdW52ZXJpZmlhYmxlIGNlcnRpZmljYXRlcy4KICAgKiBUaGUgaGFuZGxlciByZWNlaXZlcyB0aGUgW1g1MDlDZXJ0aWZpY2F0ZV0sIGFuZCBjYW4gaW5zcGVjdCBpdCBhbmQKICAgKiBkZWNpZGUgKG9yIGxldCB0aGUgdXNlciBkZWNpZGUpIHdoZXRoZXIgdG8gYWNjZXB0CiAgICogdGhlIGNvbm5lY3Rpb24gb3Igbm90LiAgVGhlIGhhbmRsZXIgc2hvdWxkIHJldHVybiB0cnVlCiAgICogdG8gY29udGludWUgdGhlIFtTZWN1cmVTb2NrZXRdIGNvbm5lY3Rpb24uCiAgICoKICAgKiBbc3VwcG9ydGVkUHJvdG9jb2xzXSBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIHByb3RvY29scyAoaW4gZGVjcmVhc2luZwogICAqIG9yZGVyIG9mIHByZWZlcmVuY2UpIHRvIHVzZSBkdXJpbmcgdGhlIEFMUE4gcHJvdG9jb2wgbmVnb3RpYXRpb24gd2l0aCB0aGUKICAgKiBzZXJ2ZXIuICBFeGFtcGxlIHZhbHVlcyBhcmUgImh0dHAvMS4xIiBvciAiaDIiLiAgVGhlIHNlbGVjdGVkIHByb3RvY29sCiAgICogY2FuIGJlIG9idGFpbmVkIHZpYSBbU2VjdXJlU29ja2V0LnNlbGVjdGVkUHJvdG9jb2xdLgogICAqCiAgICogVGhlIGFyZ3VtZW50IFt0aW1lb3V0XSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gYWxsb3dlZCB0aW1lIHRvIHdhaXQKICAgKiBmb3IgYSBjb25uZWN0aW9uIHRvIGJlIGVzdGFibGlzaGVkLiBJZiBbdGltZW91dF0gaXMgbG9uZ2VyIHRoYW4gdGhlIHN5c3RlbQogICAqIGxldmVsIHRpbWVvdXQgZHVyYXRpb24sIGEgdGltZW91dCBtYXkgb2NjdXIgc29vbmVyIHRoYW4gc3BlY2lmaWVkIGluCiAgICogW3RpbWVvdXRdLiBPbiB0aW1lb3V0LCBhIFtTb2NrZXRFeGNlcHRpb25dIGlzIHRocm93biBhbmQgYWxsIG9uZ29pbmcKICAgKiBjb25uZWN0aW9uIGF0dGVtcHRzIHRvIFtob3N0XSBhcmUgY2FuY2VsbGVkLgoKICAgKi8KICBzdGF0aWMgRnV0dXJlPFNlY3VyZVNvY2tldD4gY29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge1NlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIG9uQmFkQ2VydGlmaWNhdGUoWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29scywKICAgICAgRHVyYXRpb24gdGltZW91dH0pIHsKICAgIHJldHVybiBSYXdTZWN1cmVTb2NrZXQuY29ubmVjdChob3N0LCBwb3J0LAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgICAgICBvbkJhZENlcnRpZmljYXRlOiBvbkJhZENlcnRpZmljYXRlLAogICAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHM6IHN1cHBvcnRlZFByb3RvY29scywKICAgICAgICAgICAgdGltZW91dDogdGltZW91dCkKICAgICAgICAudGhlbigocmF3U29ja2V0KSA9PiBuZXcgU2VjdXJlU29ja2V0Ll8ocmF3U29ja2V0KSk7CiAgfQoKICAvLy8gTGlrZSBbY29ubmVjdF0sIGJ1dCByZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgd2l0aCBhCiAgLy8vIFtDb25uZWN0aW9uVGFza10gdGhhdCBjYW4gYmUgY2FuY2VsbGVkIGlmIHRoZSBbU2VjdXJlU29ja2V0XSBpcyBubwogIC8vLyBsb25nZXIgbmVlZGVkLgogIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U2VjdXJlU29ja2V0Pj4gc3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7U2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgb25CYWRDZXJ0aWZpY2F0ZShYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUpLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzfSkgewogICAgcmV0dXJuIFJhd1NlY3VyZVNvY2tldC5zdGFydENvbm5lY3QoaG9zdCwgcG9ydCwKICAgICAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZTogb25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMpCiAgICAgICAgLnRoZW4oKHJhd1N0YXRlKSB7CiAgICAgIEZ1dHVyZTxTZWN1cmVTb2NrZXQ+IHNvY2tldCA9CiAgICAgICAgICByYXdTdGF0ZS5zb2NrZXQudGhlbigocmF3U29ja2V0KSA9PiBuZXcgU2VjdXJlU29ja2V0Ll8ocmF3U29ja2V0KSk7CiAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblRhc2s8U2VjdXJlU29ja2V0Pi5fKAogICAgICAgICAgc29ja2V0OiBzb2NrZXQsIG9uQ2FuY2VsOiByYXdTdGF0ZS5fb25DYW5jZWwpOwogICAgfSk7CiAgfQoKICAvKioKICAgKiBUYWtlcyBhbiBhbHJlYWR5IGNvbm5lY3RlZCBbc29ja2V0XSBhbmQgc3RhcnRzIGNsaWVudCBzaWRlIFRMUwogICAqIGhhbmRzaGFrZSB0byBtYWtlIHRoZSBjb21tdW5pY2F0aW9uIHNlY3VyZS4gV2hlbiB0aGUgcmV0dXJuZWQKICAgKiBmdXR1cmUgY29tcGxldGVzIHRoZSBbU2VjdXJlU29ja2V0XSBoYXMgY29tcGxldGVkIHRoZSBUTFMKICAgKiBoYW5kc2hha2UuIFVzaW5nIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZQogICAqIGNvbm5lY3Rpb24gaXMgcHJlcGFyZWQgZm9yIFRMUyBoYW5kc2hha2UuCiAgICoKICAgKiBJZiB0aGUgW3NvY2tldF0gYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24sIHRoaXMgc3Vic2NyaXB0aW9uCiAgICogd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBhbmQgZXZlbnRzLiBJbiBtb3N0IGNhc2VzIGNhbGxpbmcKICAgKiBgcGF1c2VgIG9uIHRoaXMgc3Vic2NyaXB0aW9uIGJlZm9yZSBzdGFydGluZyBUTFMgaGFuZHNoYWtlIGlzCiAgICogdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLgogICAqCiAgICogVGhlIGdpdmVuIFtzb2NrZXRdIGlzIGNsb3NlZCBhbmQgbWF5IG5vdCBiZSB1c2VkIGFueW1vcmUuCiAgICoKICAgKiBJZiB0aGUgW2hvc3RdIGFyZ3VtZW50IGlzIHBhc3NlZCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGhvc3QgbmFtZQogICAqIGZvciB0aGUgVExTIGhhbmRzaGFrZS4gSWYgW2hvc3RdIGlzIG5vdCBwYXNzZWQgdGhlIGhvc3QgbmFtZSBmcm9tCiAgICogdGhlIFtzb2NrZXRdIHdpbGwgYmUgdXNlZC4gVGhlIFtob3N0XSBjYW4gYmUgZWl0aGVyIGEgW1N0cmluZ10gb3IKICAgKiBhbiBbSW50ZXJuZXRBZGRyZXNzXS4KICAgKgogICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIF9ub3RfIGNhdXNlIGEgRE5TIGhvc3QgbG9va3VwLiBJZiB0aGUKICAgKiBbaG9zdF0gcGFzc2VkIGlzIGEgW1N0cmluZ10gdGhlIFtJbnRlcm5ldEFkZHJlc3NdIGZvciB0aGUKICAgKiByZXN1bHRpbmcgW1NlY3VyZVNvY2tldF0gd2lsbCBoYXZlIHRoZSBwYXNzZWQgaW4gW2hvc3RdIGFzIGl0cwogICAqIGhvc3QgdmFsdWUgYW5kIHRoZSBpbnRlcm5ldCBhZGRyZXNzIG9mIHRoZSBhbHJlYWR5IGNvbm5lY3RlZAogICAqIHNvY2tldCBhcyBpdHMgYWRkcmVzcyB2YWx1ZS4KICAgKgogICAqIFNlZSBbY29ubmVjdF0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFyZ3VtZW50cy4KICAgKgogICAqLwogIHN0YXRpYyBGdXR1cmU8U2VjdXJlU29ja2V0PiBzZWN1cmUoU29ja2V0IHNvY2tldCwKICAgICAge2hvc3QsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIG9uQmFkQ2VydGlmaWNhdGUoWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKX0pIHsKICAgIHJldHVybiAoKHNvY2tldCBhcyBkeW5hbWljIC8qX1NvY2tldCovKS5fZGV0YWNoUmF3KCkgYXMgRnV0dXJlKQogICAgICAgIC50aGVuPFJhd1NlY3VyZVNvY2tldD4oKGRldGFjaGVkUmF3KSB7CiAgICAgIHJldHVybiBSYXdTZWN1cmVTb2NrZXQuc2VjdXJlKGRldGFjaGVkUmF3WzBdIGFzIFJhd1NvY2tldCwKICAgICAgICAgIHN1YnNjcmlwdGlvbjogZGV0YWNoZWRSYXdbMV0gYXMgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiwKICAgICAgICAgIGhvc3Q6IGhvc3QsCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZTogb25CYWRDZXJ0aWZpY2F0ZSk7CiAgICB9KS50aGVuPFNlY3VyZVNvY2tldD4oKHJhdykgPT4gbmV3IFNlY3VyZVNvY2tldC5fKHJhdykpOwogIH0KCiAgLyoqCiAgICogVGFrZXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgW3NvY2tldF0gYW5kIHN0YXJ0cyBzZXJ2ZXIgc2lkZSBUTFMKICAgKiBoYW5kc2hha2UgdG8gbWFrZSB0aGUgY29tbXVuaWNhdGlvbiBzZWN1cmUuIFdoZW4gdGhlIHJldHVybmVkCiAgICogZnV0dXJlIGNvbXBsZXRlcyB0aGUgW1NlY3VyZVNvY2tldF0gaGFzIGNvbXBsZXRlZCB0aGUgVExTCiAgICogaGFuZHNoYWtlLiBVc2luZyB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUKICAgKiBjb25uZWN0aW9uIGlzIGdvaW5nIHRvIHN0YXJ0IHRoZSBUTFMgaGFuZHNoYWtlLgogICAqCiAgICogSWYgdGhlIFtzb2NrZXRdIGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uLCB0aGlzIHN1YnNjcmlwdGlvbgogICAqIHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgYW5kIGV2ZW50cy4gSW4gbW9zdCBjYXNlcyBjYWxsaW5nCiAgICogWzpwYXVzZTpdIG9uIHRoaXMgc3Vic2NyaXB0aW9uIGJlZm9yZSBzdGFydGluZyBUTFMgaGFuZHNoYWtlIGlzCiAgICogdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLgogICAqCiAgICogSWYgc29tZSBvZiB0aGUgZGF0YSBvZiB0aGUgVExTIGhhbmRzaGFrZSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQKICAgKiBmcm9tIHRoZSBzb2NrZXQgdGhpcyBkYXRhIGNhbiBiZSBwYXNzZWQgaW4gdGhlIFtidWZmZXJlZERhdGFdCiAgICogcGFyYW1ldGVyLiBUaGlzIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIGFueSBvdGhlciBkYXRhCiAgICogYXZhaWxhYmxlIG9uIHRoZSBzb2NrZXQuCiAgICoKICAgKiBTZWUgW1NlY3VyZVNlcnZlclNvY2tldC5iaW5kXSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUKICAgKiBhcmd1bWVudHMuCiAgICoKICAgKi8KICBzdGF0aWMgRnV0dXJlPFNlY3VyZVNvY2tldD4gc2VjdXJlU2VydmVyKAogICAgICBTb2NrZXQgc29ja2V0LCBTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAge0xpc3Q8aW50PiBidWZmZXJlZERhdGEsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlLAogICAgICBMaXN0PFN0cmluZz4gc3VwcG9ydGVkUHJvdG9jb2xzfSkgewogICAgcmV0dXJuICgoc29ja2V0IGFzIGR5bmFtaWMgLypfU29ja2V0Ki8pLl9kZXRhY2hSYXcoKSBhcyBGdXR1cmUpCiAgICAgICAgLnRoZW48UmF3U2VjdXJlU29ja2V0PigoZGV0YWNoZWRSYXcpIHsKICAgICAgcmV0dXJuIFJhd1NlY3VyZVNvY2tldC5zZWN1cmVTZXJ2ZXIoZGV0YWNoZWRSYXdbMF0gYXMgUmF3U29ja2V0LCBjb250ZXh0LAogICAgICAgICAgc3Vic2NyaXB0aW9uOiBkZXRhY2hlZFJhd1sxXSBhcyBTdHJlYW1TdWJzY3JpcHRpb248UmF3U29ja2V0RXZlbnQ+LAogICAgICAgICAgYnVmZmVyZWREYXRhOiBidWZmZXJlZERhdGEsCiAgICAgICAgICByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGU6IHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZTogcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMpOwogICAgfSkudGhlbjxTZWN1cmVTb2NrZXQ+KChyYXcpID0+IG5ldyBTZWN1cmVTb2NrZXQuXyhyYXcpKTsKICB9CgogIC8qKgogICAqIEdldCB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBmb3IgYSBjb25uZWN0ZWQgU2VjdXJlU29ja2V0LiAgSWYgdGhpcwogICAqIFNlY3VyZVNvY2tldCBpcyB0aGUgc2VydmVyIGVuZCBvZiBhIHNlY3VyZSBzb2NrZXQgY29ubmVjdGlvbiwKICAgKiBbcGVlckNlcnRpZmljYXRlXSB3aWxsIHJldHVybiB0aGUgY2xpZW50IGNlcnRpZmljYXRlLCBvciBudWxsLCBpZiBubwogICAqIGNsaWVudCBjZXJ0aWZpY2F0ZSB3YXMgcmVjZWl2ZWQuICBJZiBpdCBpcyB0aGUgY2xpZW50IGVuZCwKICAgKiBbcGVlckNlcnRpZmljYXRlXSB3aWxsIHJldHVybiB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUuCiAgICovCiAgWDUwOUNlcnRpZmljYXRlIGdldCBwZWVyQ2VydGlmaWNhdGU7CgogIC8qKgogICAqIFRoZSBwcm90b2NvbCB3aGljaCB3YXMgc2VsZWN0ZWQgZHVyaW5nIEFMUE4gcHJvdG9jb2wgbmVnb3RpYXRpb24uCiAgICoKICAgKiBSZXR1cm5zIG51bGwgaWYgb25lIG9mIHRoZSBwZWVycyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIEFMUE4sIGRpZCBub3QKICAgKiBzcGVjaWZ5IGEgbGlzdCBvZiBzdXBwb3J0ZWQgQUxQTiBwcm90b2NvbHMgb3IgdGhlcmUgd2FzIG5vIGNvbW1vbgogICAqIHByb3RvY29sIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIuCiAgICovCiAgU3RyaW5nIGdldCBzZWxlY3RlZFByb3RvY29sOwoKICAvKioKICAgKiBSZW5lZ290aWF0ZSBhbiBleGlzdGluZyBzZWN1cmUgY29ubmVjdGlvbiwgcmVuZXdpbmcgdGhlIHNlc3Npb24ga2V5cwogICAqIGFuZCBwb3NzaWJseSBjaGFuZ2luZyB0aGUgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyByZXBlYXRzIHRoZSBTU0wgb3IgVExTIGhhbmRzaGFrZSwgd2l0aCBvcHRpb25zIHRoYXQgYWxsb3cgY2xlYXJpbmcKICAgKiB0aGUgc2Vzc2lvbiBjYWNoZSBhbmQgcmVxdWVzdGluZyBhIGNsaWVudCBjZXJ0aWZpY2F0ZS4KICAgKi8KICB2b2lkIHJlbmVnb3RpYXRlKAogICAgICB7Ym9vbCB1c2VTZXNzaW9uQ2FjaGU6IHRydWUsCiAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGU6IGZhbHNlfSk7Cn0KCi8qKgogKiBSYXdTZWN1cmVTb2NrZXQgcHJvdmlkZXMgYSBzZWN1cmUgKFNTTCBvciBUTFMpIG5ldHdvcmsgY29ubmVjdGlvbi4KICogQ2xpZW50IGNvbm5lY3Rpb25zIHRvIGEgc2VydmVyIGFyZSBwcm92aWRlZCBieSBjYWxsaW5nCiAqIFJhd1NlY3VyZVNvY2tldC5jb25uZWN0LiAgQSBzZWN1cmUgc2VydmVyLCBjcmVhdGVkIHdpdGgKICogW1Jhd1NlY3VyZVNlcnZlclNvY2tldF0sIGFsc28gcmV0dXJucyBSYXdTZWN1cmVTb2NrZXQgb2JqZWN0cyByZXByZXNlbnRpbmcKICogdGhlIHNlcnZlciBlbmQgb2YgYSBzZWN1cmUgY29ubmVjdGlvbi4KICogVGhlIGNlcnRpZmljYXRlIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgaXMgY2hlY2tlZAogKiB1c2luZyB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgc2V0IGluIHRoZSBTZWN1cml0eUNvbnRleHQgb2JqZWN0LgogKiBUaGUgZGVmYXVsdCBbU2VjdXJpdHlDb250ZXh0XSBvYmplY3QgY29udGFpbnMgYSBidWlsdC1pbiBzZXQgb2YgdHJ1c3RlZAogKiByb290IGNlcnRpZmljYXRlcyBmb3Igd2VsbC1rbm93biBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcy4KICovCmFic3RyYWN0IGNsYXNzIFJhd1NlY3VyZVNvY2tldCBpbXBsZW1lbnRzIFJhd1NvY2tldCB7CiAgLyoqCiAgICogQ29uc3RydWN0cyBhIG5ldyBzZWN1cmUgY2xpZW50IHNvY2tldCBhbmQgY29ubmVjdCBpdCB0byB0aGUgZ2l2ZW4KICAgKiBob3N0IG9uIHRoZSBnaXZlbiBwb3J0LiBUaGUgcmV0dXJuZWQgW0Z1dHVyZV0gaXMgY29tcGxldGVkIHdpdGggdGhlCiAgICogUmF3U2VjdXJlU29ja2V0IHdoZW4gaXQgaXMgY29ubmVjdGVkIGFuZCByZWFkeSBmb3Igc3Vic2NyaXB0aW9uLgogICAqCiAgICogVGhlIGNlcnRpZmljYXRlIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgaXMgY2hlY2tlZCB1c2luZyB0aGUgdHJ1c3RlZAogICAqIGNlcnRpZmljYXRlcyBzZXQgaW4gdGhlIFNlY3VyaXR5Q29udGV4dCBvYmplY3QgSWYgYSBjZXJ0aWZpY2F0ZSBhbmQga2V5IGFyZQogICAqIHNldCBvbiB0aGUgY2xpZW50LCB1c2luZyBbU2VjdXJpdHlDb250ZXh0LnVzZUNlcnRpZmljYXRlQ2hhaW5dIGFuZAogICAqIFtTZWN1cml0eUNvbnRleHQudXNlUHJpdmF0ZUtleV0sIGFuZCB0aGUgc2VydmVyIGFza3MgZm9yIGEgY2xpZW50CiAgICogY2VydGlmaWNhdGUsIHRoZW4gdGhhdCBjbGllbnQgY2VydGlmaWNhdGUgaXMgc2VudCB0byB0aGUgc2VydmVyLgogICAqCiAgICogW29uQmFkQ2VydGlmaWNhdGVdIGlzIGFuIG9wdGlvbmFsIGhhbmRsZXIgZm9yIHVudmVyaWZpYWJsZSBjZXJ0aWZpY2F0ZXMuCiAgICogVGhlIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIFtYNTA5Q2VydGlmaWNhdGVdLCBhbmQgY2FuIGluc3BlY3QgaXQgYW5kCiAgICogZGVjaWRlIChvciBsZXQgdGhlIHVzZXIgZGVjaWRlKSB3aGV0aGVyIHRvIGFjY2VwdAogICAqIHRoZSBjb25uZWN0aW9uIG9yIG5vdC4gIFRoZSBoYW5kbGVyIHNob3VsZCByZXR1cm4gdHJ1ZQogICAqIHRvIGNvbnRpbnVlIHRoZSBbUmF3U2VjdXJlU29ja2V0XSBjb25uZWN0aW9uLgogICAqCiAgICogW3N1cHBvcnRlZFByb3RvY29sc10gaXMgYW4gb3B0aW9uYWwgbGlzdCBvZiBwcm90b2NvbHMgKGluIGRlY3JlYXNpbmcKICAgKiBvcmRlciBvZiBwcmVmZXJlbmNlKSB0byB1c2UgZHVyaW5nIHRoZSBBTFBOIHByb3RvY29sIG5lZ290aWF0aW9uIHdpdGggdGhlCiAgICogc2VydmVyLiAgRXhhbXBsZSB2YWx1ZXMgYXJlICJodHRwLzEuMSIgb3IgImgyIi4gIFRoZSBzZWxlY3RlZCBwcm90b2NvbAogICAqIGNhbiBiZSBvYnRhaW5lZCB2aWEgW1Jhd1NlY3VyZVNvY2tldC5zZWxlY3RlZFByb3RvY29sXS4KICAgKi8KICBzdGF0aWMgRnV0dXJlPFJhd1NlY3VyZVNvY2tldD4gY29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge1NlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIG9uQmFkQ2VydGlmaWNhdGUoWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29scywKICAgICAgRHVyYXRpb24gdGltZW91dH0pIHsKICAgIF9SYXdTZWN1cmVTb2NrZXQuX3ZlcmlmeUZpZWxkcygKICAgICAgICBob3N0LCBwb3J0LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBvbkJhZENlcnRpZmljYXRlKTsKICAgIHJldHVybiBSYXdTb2NrZXQuY29ubmVjdChob3N0LCBwb3J0LCB0aW1lb3V0OiB0aW1lb3V0KS50aGVuKChzb2NrZXQpIHsKICAgICAgcmV0dXJuIHNlY3VyZShzb2NrZXQsCiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgICAgb25CYWRDZXJ0aWZpY2F0ZTogb25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sczogc3VwcG9ydGVkUHJvdG9jb2xzKTsKICAgIH0pOwogIH0KCiAgLy8vIExpa2UgW2Nvbm5lY3RdLCBidXQgcmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdpdGggYQogIC8vLyBbQ29ubmVjdGlvblRhc2tdIHRoYXQgY2FuIGJlIGNhbmNlbGxlZCBpZiB0aGUgW1Jhd1NlY3VyZVNvY2tldF0gaXMgbm8KICAvLy8gbG9uZ2VyIG5lZWRlZC4KICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFJhd1NlY3VyZVNvY2tldD4+IHN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge1NlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIG9uQmFkQ2VydGlmaWNhdGUoWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29sc30pIHsKICAgIHJldHVybiBSYXdTb2NrZXQuc3RhcnRDb25uZWN0KGhvc3QsIHBvcnQpCiAgICAgICAgLnRoZW4oKENvbm5lY3Rpb25UYXNrPFJhd1NvY2tldD4gcmF3U3RhdGUpIHsKICAgICAgRnV0dXJlPFJhd1NlY3VyZVNvY2tldD4gc29ja2V0ID0gcmF3U3RhdGUuc29ja2V0LnRoZW4oKHJhd1NvY2tldCkgewogICAgICAgIHJldHVybiBzZWN1cmUocmF3U29ja2V0LAogICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgICAgICBvbkJhZENlcnRpZmljYXRlOiBvbkJhZENlcnRpZmljYXRlLAogICAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHM6IHN1cHBvcnRlZFByb3RvY29scyk7CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25UYXNrPFJhd1NlY3VyZVNvY2tldD4uXygKICAgICAgICAgIHNvY2tldDogc29ja2V0LCBvbkNhbmNlbDogcmF3U3RhdGUuX29uQ2FuY2VsKTsKICAgIH0pOwogIH0KCiAgLyoqCiAgICogVGFrZXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgW3NvY2tldF0gYW5kIHN0YXJ0cyBjbGllbnQgc2lkZSBUTFMKICAgKiBoYW5kc2hha2UgdG8gbWFrZSB0aGUgY29tbXVuaWNhdGlvbiBzZWN1cmUuIFdoZW4gdGhlIHJldHVybmVkCiAgICogZnV0dXJlIGNvbXBsZXRlcyB0aGUgW1Jhd1NlY3VyZVNvY2tldF0gaGFzIGNvbXBsZXRlZCB0aGUgVExTCiAgICogaGFuZHNoYWtlLiBVc2luZyB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUKICAgKiBjb25uZWN0aW9uIGlzIHByZXBhcmVkIGZvciBUTFMgaGFuZHNoYWtlLgogICAqCiAgICogSWYgdGhlIFtzb2NrZXRdIGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uLCBwYXNzIHRoZSBleGlzdGluZwogICAqIHN1YnNjcmlwdGlvbiBpbiB0aGUgW3N1YnNjcmlwdGlvbl0gcGFyYW1ldGVyLiBUaGUgW3NlY3VyZV0KICAgKiBvcGVyYXRpb24gd2lsbCB0YWtlIG92ZXIgdGhlIHN1YnNjcmlwdGlvbiBieSByZXBsYWNpbmcgdGhlCiAgICogaGFuZGxlcnMgd2l0aCBpdCBvd24gc2VjdXJlIHByb2Nlc3NpbmcuIFRoZSBjYWxsZXIgbXVzdCBub3QgdG91Y2gKICAgKiB0aGlzIHN1YnNjcmlwdGlvbiBhbnltb3JlLiBQYXNzaW5nIGEgcGF1c2VkIHN1YnNjcmlwdGlvbiBpcyBhbgogICAqIGVycm9yLgogICAqCiAgICogSWYgdGhlIFtob3N0XSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBob3N0IG5hbWUKICAgKiBmb3IgdGhlIFRMUyBoYW5kc2hha2UuIElmIFtob3N0XSBpcyBub3QgcGFzc2VkIHRoZSBob3N0IG5hbWUgZnJvbQogICAqIHRoZSBbc29ja2V0XSB3aWxsIGJlIHVzZWQuIFRoZSBbaG9zdF0gY2FuIGJlIGVpdGhlciBhIFtTdHJpbmddIG9yCiAgICogYW4gW0ludGVybmV0QWRkcmVzc10uCiAgICoKICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBfbm90XyBjYXVzZSBhIEROUyBob3N0IGxvb2t1cC4gSWYgdGhlCiAgICogW2hvc3RdIHBhc3NlZCBpcyBhIFtTdHJpbmddIHRoZSBbSW50ZXJuZXRBZGRyZXNzXSBmb3IgdGhlCiAgICogcmVzdWx0aW5nIFtTZWN1cmVTb2NrZXRdIHdpbGwgaGF2ZSB0aGlzIHBhc3NlZCBpbiBbaG9zdF0gYXMgaXRzCiAgICogaG9zdCB2YWx1ZSBhbmQgdGhlIGludGVybmV0IGFkZHJlc3Mgb2YgdGhlIGFscmVhZHkgY29ubmVjdGVkCiAgICogc29ja2V0IGFzIGl0cyBhZGRyZXNzIHZhbHVlLgogICAqCiAgICogU2VlIFtjb25uZWN0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgYXJndW1lbnRzLgogICAqCiAgICovCiAgc3RhdGljIEZ1dHVyZTxSYXdTZWN1cmVTb2NrZXQ+IHNlY3VyZShSYXdTb2NrZXQgc29ja2V0LAogICAgICB7U3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiBzdWJzY3JpcHRpb24sCiAgICAgIGhvc3QsCiAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0LAogICAgICBib29sIG9uQmFkQ2VydGlmaWNhdGUoWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlKSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29sc30pIHsKICAgIHNvY2tldC5yZWFkRXZlbnRzRW5hYmxlZCA9IGZhbHNlOwogICAgc29ja2V0LndyaXRlRXZlbnRzRW5hYmxlZCA9IGZhbHNlOwogICAgcmV0dXJuIF9SYXdTZWN1cmVTb2NrZXQuY29ubmVjdCgKICAgICAgICBob3N0ICE9IG51bGwgPyBob3N0IDogc29ja2V0LmFkZHJlc3MuaG9zdCwgc29ja2V0LnBvcnQsCiAgICAgICAgaXNfc2VydmVyOiBmYWxzZSwKICAgICAgICBzb2NrZXQ6IHNvY2tldCwKICAgICAgICBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbiwKICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgIG9uQmFkQ2VydGlmaWNhdGU6IG9uQmFkQ2VydGlmaWNhdGUsCiAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMpOwogIH0KCiAgLyoqCiAgICogVGFrZXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgW3NvY2tldF0gYW5kIHN0YXJ0cyBzZXJ2ZXIgc2lkZSBUTFMKICAgKiBoYW5kc2hha2UgdG8gbWFrZSB0aGUgY29tbXVuaWNhdGlvbiBzZWN1cmUuIFdoZW4gdGhlIHJldHVybmVkCiAgICogZnV0dXJlIGNvbXBsZXRlcyB0aGUgW1Jhd1NlY3VyZVNvY2tldF0gaGFzIGNvbXBsZXRlZCB0aGUgVExTCiAgICogaGFuZHNoYWtlLiBVc2luZyB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUKICAgKiBjb25uZWN0aW9uIGlzIGdvaW5nIHRvIHN0YXJ0IHRoZSBUTFMgaGFuZHNoYWtlLgogICAqCiAgICogSWYgdGhlIFtzb2NrZXRdIGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uLCBwYXNzIHRoZSBleGlzdGluZwogICAqIHN1YnNjcmlwdGlvbiBpbiB0aGUgW3N1YnNjcmlwdGlvbl0gcGFyYW1ldGVyLiBUaGUgW3NlY3VyZVNlcnZlcl0KICAgKiBvcGVyYXRpb24gd2lsbCB0YWtlIG92ZXIgdGhlIHN1YnNjcmlwdGlvbiBieSByZXBsYWNpbmcgdGhlCiAgICogaGFuZGxlcnMgd2l0aCBpdCBvd24gc2VjdXJlIHByb2Nlc3NpbmcuIFRoZSBjYWxsZXIgbXVzdCBub3QgdG91Y2gKICAgKiB0aGlzIHN1YnNjcmlwdGlvbiBhbnltb3JlLiBQYXNzaW5nIGEgcGF1c2VkIHN1YnNjcmlwdGlvbiBpcyBhbgogICAqIGVycm9yLgogICAqCiAgICogSWYgc29tZSBvZiB0aGUgZGF0YSBvZiB0aGUgVExTIGhhbmRzaGFrZSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQKICAgKiBmcm9tIHRoZSBzb2NrZXQgdGhpcyBkYXRhIGNhbiBiZSBwYXNzZWQgaW4gdGhlIFtidWZmZXJlZERhdGFdCiAgICogcGFyYW1ldGVyLiBUaGlzIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIGFueSBvdGhlciBkYXRhCiAgICogYXZhaWxhYmxlIG9uIHRoZSBzb2NrZXQuCiAgICoKICAgKiBTZWUgW1Jhd1NlY3VyZVNlcnZlclNvY2tldC5iaW5kXSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUKICAgKiBhcmd1bWVudHMuCiAgICoKICAgKi8KICBzdGF0aWMgRnV0dXJlPFJhd1NlY3VyZVNvY2tldD4gc2VjdXJlU2VydmVyKAogICAgICBSYXdTb2NrZXQgc29ja2V0LCBTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAge1N0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXRFdmVudD4gc3Vic2NyaXB0aW9uLAogICAgICBMaXN0PGludD4gYnVmZmVyZWREYXRhLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29sc30pIHsKICAgIHNvY2tldC5yZWFkRXZlbnRzRW5hYmxlZCA9IGZhbHNlOwogICAgc29ja2V0LndyaXRlRXZlbnRzRW5hYmxlZCA9IGZhbHNlOwogICAgcmV0dXJuIF9SYXdTZWN1cmVTb2NrZXQuY29ubmVjdChzb2NrZXQuYWRkcmVzcywgc29ja2V0LnJlbW90ZVBvcnQsCiAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICBpc19zZXJ2ZXI6IHRydWUsCiAgICAgICAgc29ja2V0OiBzb2NrZXQsCiAgICAgICAgc3Vic2NyaXB0aW9uOiBzdWJzY3JpcHRpb24sCiAgICAgICAgYnVmZmVyZWREYXRhOiBidWZmZXJlZERhdGEsCiAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzOiBzdXBwb3J0ZWRQcm90b2NvbHMpOwogIH0KCiAgLyoqCiAgICogUmVuZWdvdGlhdGUgYW4gZXhpc3Rpbmcgc2VjdXJlIGNvbm5lY3Rpb24sIHJlbmV3aW5nIHRoZSBzZXNzaW9uIGtleXMKICAgKiBhbmQgcG9zc2libHkgY2hhbmdpbmcgdGhlIGNvbm5lY3Rpb24gcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgcmVwZWF0cyB0aGUgU1NMIG9yIFRMUyBoYW5kc2hha2UsIHdpdGggb3B0aW9ucyB0aGF0IGFsbG93IGNsZWFyaW5nCiAgICogdGhlIHNlc3Npb24gY2FjaGUgYW5kIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUuCiAgICovCiAgdm9pZCByZW5lZ290aWF0ZSgKICAgICAge2Jvb2wgdXNlU2Vzc2lvbkNhY2hlOiB0cnVlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZX0pOwoKICAvKioKICAgKiBHZXQgdGhlIHBlZXIgY2VydGlmaWNhdGUgZm9yIGEgY29ubmVjdGVkIFJhd1NlY3VyZVNvY2tldC4gIElmIHRoaXMKICAgKiBSYXdTZWN1cmVTb2NrZXQgaXMgdGhlIHNlcnZlciBlbmQgb2YgYSBzZWN1cmUgc29ja2V0IGNvbm5lY3Rpb24sCiAgICogW3BlZXJDZXJ0aWZpY2F0ZV0gd2lsbCByZXR1cm4gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSwgb3IgbnVsbCwgaWYgbm8KICAgKiBjbGllbnQgY2VydGlmaWNhdGUgd2FzIHJlY2VpdmVkLiAgSWYgaXQgaXMgdGhlIGNsaWVudCBlbmQsCiAgICogW3BlZXJDZXJ0aWZpY2F0ZV0gd2lsbCByZXR1cm4gdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlLgogICAqLwogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgcGVlckNlcnRpZmljYXRlOwoKICAvKioKICAgKiBUaGUgcHJvdG9jb2wgd2hpY2ggd2FzIHNlbGVjdGVkIGR1cmluZyBwcm90b2NvbCBuZWdvdGlhdGlvbi4KICAgKgogICAqIFJldHVybnMgbnVsbCBpZiBvbmUgb2YgdGhlIHBlZXJzIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3IgQUxQTiwgZGlkIG5vdAogICAqIHNwZWNpZnkgYSBsaXN0IG9mIHN1cHBvcnRlZCBBTFBOIHByb3RvY29scyBvciB0aGVyZSB3YXMgbm8gY29tbW9uCiAgICogcHJvdG9jb2wgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlci4KICAgKi8KICBTdHJpbmcgZ2V0IHNlbGVjdGVkUHJvdG9jb2w7Cn0KCi8qKgogKiBYNTA5Q2VydGlmaWNhdGUgcmVwcmVzZW50cyBhbiBTU0wgY2VydGlmaWNhdGUsIHdpdGggYWNjZXNzb3JzIHRvCiAqIGdldCB0aGUgZmllbGRzIG9mIHRoZSBjZXJ0aWZpY2F0ZS4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKYWJzdHJhY3QgY2xhc3MgWDUwOUNlcnRpZmljYXRlIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZXh0ZXJuYWwgZmFjdG9yeSBYNTA5Q2VydGlmaWNhdGUuXygpOwoKICAvLy8gVGhlIERFUiBlbmNvZGVkIGJ5dGVzIG9mIHRoZSBjZXJ0aWZpY2F0ZS4KICBVaW50OExpc3QgZ2V0IGRlcjsKCiAgLy8vIFRoZSBQRU0gZW5jb2RlZCBTdHJpbmcgb2YgdGhlIGNlcnRpZmljYXRlLgogIFN0cmluZyBnZXQgcGVtOwoKICAvLy8gVGhlIFNIQTEgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUuCiAgVWludDhMaXN0IGdldCBzaGExOwoKICBTdHJpbmcgZ2V0IHN1YmplY3Q7CiAgU3RyaW5nIGdldCBpc3N1ZXI7CiAgRGF0ZVRpbWUgZ2V0IHN0YXJ0VmFsaWRpdHk7CiAgRGF0ZVRpbWUgZ2V0IGVuZFZhbGlkaXR5Owp9CgpjbGFzcyBfRmlsdGVyU3RhdHVzIHsKICBib29sIHByb2dyZXNzID0gZmFsc2U7IC8vIFRoZSBmaWx0ZXIgcmVhZCBvciB3cm90ZSBkYXRhIHRvIHRoZSBidWZmZXJzLgogIGJvb2wgcmVhZEVtcHR5ID0gdHJ1ZTsgLy8gVGhlIHJlYWQgYnVmZmVycyBhbmQgZGVjcnlwdGlvbiBmaWx0ZXIgYXJlIGVtcHR5LgogIGJvb2wgd3JpdGVFbXB0eSA9IHRydWU7IC8vIFRoZSB3cml0ZSBidWZmZXJzIGFuZCBlbmNyeXB0aW9uIGZpbHRlciBhcmUgZW1wdHkuCiAgLy8gVGhlc2UgYXJlIHNldCBpZiBhIGJ1ZmZlciBjaGFuZ2VzIHN0YXRlIGZyb20gZW1wdHkgb3IgZnVsbC4KICBib29sIHJlYWRQbGFpbnRleHROb0xvbmdlckVtcHR5ID0gZmFsc2U7CiAgYm9vbCB3cml0ZVBsYWludGV4dE5vTG9uZ2VyRnVsbCA9IGZhbHNlOwogIGJvb2wgcmVhZEVuY3J5cHRlZE5vTG9uZ2VyRnVsbCA9IGZhbHNlOwogIGJvb2wgd3JpdGVFbmNyeXB0ZWROb0xvbmdlckVtcHR5ID0gZmFsc2U7CgogIF9GaWx0ZXJTdGF0dXMoKTsKfQoKY2xhc3MgX1Jhd1NlY3VyZVNvY2tldCBleHRlbmRzIFN0cmVhbTxSYXdTb2NrZXRFdmVudD4KICAgIGltcGxlbWVudHMgUmF3U2VjdXJlU29ja2V0IHsKICAvLyBTdGF0dXMgc3RhdGVzCiAgc3RhdGljIGNvbnN0IGludCBoYW5kc2hha2VTdGF0dXMgPSAyMDE7CiAgc3RhdGljIGNvbnN0IGludCBjb25uZWN0ZWRTdGF0dXMgPSAyMDI7CiAgc3RhdGljIGNvbnN0IGludCBjbG9zZWRTdGF0dXMgPSAyMDM7CgogIC8vIEJ1ZmZlciBpZGVudGlmaWVycy4KICAvLyBUaGVzZSBtdXN0IGFncmVlIHdpdGggdGhvc2UgaW4gdGhlIG5hdGl2ZSBDKysgaW1wbGVtZW50YXRpb24uCiAgc3RhdGljIGNvbnN0IGludCByZWFkUGxhaW50ZXh0SWQgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgd3JpdGVQbGFpbnRleHRJZCA9IDE7CiAgc3RhdGljIGNvbnN0IGludCByZWFkRW5jcnlwdGVkSWQgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgd3JpdGVFbmNyeXB0ZWRJZCA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBidWZmZXJDb3VudCA9IDQ7CgogIC8vIElzIGEgYnVmZmVyIGlkZW50aWZpZXIgZm9yIGFuIGVuY3J5cHRlZCBidWZmZXI/CiAgc3RhdGljIGJvb2wgX2lzQnVmZmVyRW5jcnlwdGVkKGludCBpZGVudGlmaWVyKSA9PgogICAgICBpZGVudGlmaWVyID49IHJlYWRFbmNyeXB0ZWRJZDsKCiAgUmF3U29ja2V0IF9zb2NrZXQ7CiAgZmluYWwgQ29tcGxldGVyPF9SYXdTZWN1cmVTb2NrZXQ+IF9oYW5kc2hha2VDb21wbGV0ZSA9CiAgICAgIG5ldyBDb21wbGV0ZXI8X1Jhd1NlY3VyZVNvY2tldD4oKTsKICBTdHJlYW1Db250cm9sbGVyPFJhd1NvY2tldEV2ZW50PiBfY29udHJvbGxlcjsKICBTdHJlYW08UmF3U29ja2V0RXZlbnQ+IF9zdHJlYW07CiAgU3RyZWFtU3Vic2NyaXB0aW9uPFJhd1NvY2tldEV2ZW50PiBfc29ja2V0U3Vic2NyaXB0aW9uOwogIExpc3Q8aW50PiBfYnVmZmVyZWREYXRhOwogIGludCBfYnVmZmVyZWREYXRhSW5kZXggPSAwOwogIGZpbmFsIEludGVybmV0QWRkcmVzcyBhZGRyZXNzOwogIGZpbmFsIGJvb2wgaXNfc2VydmVyOwogIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0OwogIGZpbmFsIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOwogIGZpbmFsIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOwogIGZpbmFsIEZ1bmN0aW9uIG9uQmFkQ2VydGlmaWNhdGU7CgogIHZhciBfc3RhdHVzID0gaGFuZHNoYWtlU3RhdHVzOwogIGJvb2wgX3dyaXRlRXZlbnRzRW5hYmxlZCA9IHRydWU7CiAgYm9vbCBfcmVhZEV2ZW50c0VuYWJsZWQgPSB0cnVlOwogIGludCBfcGF1c2VDb3VudCA9IDA7CiAgYm9vbCBfcGVuZGluZ1JlYWRFdmVudCA9IGZhbHNlOwogIGJvb2wgX3NvY2tldENsb3NlZFJlYWQgPSBmYWxzZTsgLy8gVGhlIG5ldHdvcmsgc29ja2V0IGlzIGNsb3NlZCBmb3IgcmVhZGluZy4KICBib29sIF9zb2NrZXRDbG9zZWRXcml0ZSA9IGZhbHNlOyAvLyBUaGUgbmV0d29yayBzb2NrZXQgaXMgY2xvc2VkIGZvciB3cml0aW5nLgogIGJvb2wgX2Nsb3NlZFJlYWQgPSBmYWxzZTsgLy8gVGhlIHNlY3VyZSBzb2NrZXQgaGFzIGZpcmVkIGFuIG9uQ2xvc2VkIGV2ZW50LgogIGJvb2wgX2Nsb3NlZFdyaXRlID0gZmFsc2U7IC8vIFRoZSBzZWN1cmUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZCBmb3Igd3JpdGluZy4KICAvLyBUaGUgbmV0d29yayBzb2NrZXQgaXMgZ29uZS4KICBDb21wbGV0ZXI8UmF3U2VjdXJlU29ja2V0PiBfY2xvc2VDb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFJhd1NlY3VyZVNvY2tldD4oKTsKICBfRmlsdGVyU3RhdHVzIF9maWx0ZXJTdGF0dXMgPSBuZXcgX0ZpbHRlclN0YXR1cygpOwogIGJvb2wgX2Nvbm5lY3RQZW5kaW5nID0gdHJ1ZTsKICBib29sIF9maWx0ZXJQZW5kaW5nID0gZmFsc2U7CiAgYm9vbCBfZmlsdGVyQWN0aXZlID0gZmFsc2U7CgogIF9TZWN1cmVGaWx0ZXIgX3NlY3VyZUZpbHRlciA9IG5ldyBfU2VjdXJlRmlsdGVyKCk7CiAgU3RyaW5nIF9zZWxlY3RlZFByb3RvY29sOwoKICBzdGF0aWMgRnV0dXJlPF9SYXdTZWN1cmVTb2NrZXQ+IGNvbm5lY3QoCiAgICAgIGR5bmFtaWMgLypTdHJpbmd8SW50ZXJuZXRBZGRyZXNzKi8gaG9zdCwgaW50IHJlcXVlc3RlZFBvcnQsCiAgICAgIHtib29sIGlzX3NlcnZlciwKICAgICAgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIFJhd1NvY2tldCBzb2NrZXQsCiAgICAgIFN0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXRFdmVudD4gc3Vic2NyaXB0aW9uLAogICAgICBMaXN0PGludD4gYnVmZmVyZWREYXRhLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgYm9vbCBvbkJhZENlcnRpZmljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSksCiAgICAgIExpc3Q8U3RyaW5nPiBzdXBwb3J0ZWRQcm90b2NvbHN9KSB7CiAgICBfdmVyaWZ5RmllbGRzKGhvc3QsIHJlcXVlc3RlZFBvcnQsIGlzX3NlcnZlciwgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLAogICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwgb25CYWRDZXJ0aWZpY2F0ZSk7CiAgICBpZiAoaG9zdCBpcyBJbnRlcm5ldEFkZHJlc3MpIGhvc3QgPSBob3N0Lmhvc3Q7CiAgICBJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcyA9IHNvY2tldC5hZGRyZXNzOwogICAgaWYgKGhvc3QgIT0gbnVsbCkgewogICAgICBhZGRyZXNzID0gSW50ZXJuZXRBZGRyZXNzLl9jbG9uZVdpdGhOZXdIb3N0KGFkZHJlc3MsIGhvc3QpOwogICAgfQogICAgcmV0dXJuIG5ldyBfUmF3U2VjdXJlU29ja2V0KAogICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICByZXF1ZXN0ZWRQb3J0LAogICAgICAgICAgICBpc19zZXJ2ZXIsCiAgICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICAgIHNvY2tldCwKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLAogICAgICAgICAgICBidWZmZXJlZERhdGEsCiAgICAgICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICAgICAgICBvbkJhZENlcnRpZmljYXRlLAogICAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHMpCiAgICAgICAgLl9oYW5kc2hha2VDb21wbGV0ZQogICAgICAgIC5mdXR1cmU7CiAgfQoKICBfUmF3U2VjdXJlU29ja2V0KAogICAgICB0aGlzLmFkZHJlc3MsCiAgICAgIGludCByZXF1ZXN0ZWRQb3J0LAogICAgICB0aGlzLmlzX3NlcnZlciwKICAgICAgdGhpcy5jb250ZXh0LAogICAgICB0aGlzLl9zb2NrZXQsCiAgICAgIHRoaXMuX3NvY2tldFN1YnNjcmlwdGlvbiwKICAgICAgdGhpcy5fYnVmZmVyZWREYXRhLAogICAgICB0aGlzLnJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgdGhpcy5yZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIHRoaXMub25CYWRDZXJ0aWZpY2F0ZSwKICAgICAgTGlzdDxTdHJpbmc+IHN1cHBvcnRlZFByb3RvY29scykgewogICAgY29udGV4dCA/Pz0gU2VjdXJpdHlDb250ZXh0LmRlZmF1bHRDb250ZXh0OwogICAgX2NvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxSYXdTb2NrZXRFdmVudD4oCiAgICAgICAgc3luYzogdHJ1ZSwKICAgICAgICBvbkxpc3RlbjogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UsCiAgICAgICAgb25QYXVzZTogX29uUGF1c2VTdGF0ZUNoYW5nZSwKICAgICAgICBvblJlc3VtZTogX29uUGF1c2VTdGF0ZUNoYW5nZSwKICAgICAgICBvbkNhbmNlbDogX29uU3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2UpOwogICAgX3N0cmVhbSA9IF9jb250cm9sbGVyLnN0cmVhbTsKICAgIC8vIFRocm93IGFuIEFyZ3VtZW50RXJyb3IgaWYgYW55IGZpZWxkIGlzIGludmFsaWQuICBBZnRlciB0aGlzLCBhbGwKICAgIC8vIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkIHRocm91Z2ggdGhlIGZ1dHVyZSBvciB0aGUgc3RyZWFtLgogICAgX3NlY3VyZUZpbHRlci5pbml0KCk7CiAgICBfc2VjdXJlRmlsdGVyCiAgICAgICAgLnJlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFjayhfc2VjdXJlSGFuZHNoYWtlQ29tcGxldGVIYW5kbGVyKTsKICAgIGlmIChvbkJhZENlcnRpZmljYXRlICE9IG51bGwpIHsKICAgICAgX3NlY3VyZUZpbHRlci5yZWdpc3RlckJhZENlcnRpZmljYXRlQ2FsbGJhY2soX29uQmFkQ2VydGlmaWNhdGVXcmFwcGVyKTsKICAgIH0KICAgIF9zb2NrZXQucmVhZEV2ZW50c0VuYWJsZWQgPSB0cnVlOwogICAgX3NvY2tldC53cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgIGlmIChfc29ja2V0U3Vic2NyaXB0aW9uID09IG51bGwpIHsKICAgICAgLy8gSWYgYSBjdXJyZW50IHN1YnNjcmlwdGlvbiBpcyBwcm92aWRlZCB1c2UgdGhpcyBvdGhlcndpc2UKICAgICAgLy8gY3JlYXRlIGEgbmV3IG9uZS4KICAgICAgX3NvY2tldFN1YnNjcmlwdGlvbiA9IF9zb2NrZXQubGlzdGVuKF9ldmVudERpc3BhdGNoZXIsCiAgICAgICAgICBvbkVycm9yOiBfcmVwb3J0RXJyb3IsIG9uRG9uZTogX2RvbmVIYW5kbGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChfc29ja2V0U3Vic2NyaXB0aW9uLmlzUGF1c2VkKSB7CiAgICAgICAgX3NvY2tldC5jbG9zZSgpOwogICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJTdWJzY3JpcHRpb24gcGFzc2VkIHRvIFRMUyB1cGdyYWRlIGlzIHBhdXNlZCIpOwogICAgICB9CiAgICAgIC8vIElmIHdlIGFyZSB1cGdyYWRpbmcgYSBzb2NrZXQgdGhhdCBpcyBhbHJlYWR5IGNsb3NlZCBmb3IgcmVhZCwKICAgICAgLy8gcmVwb3J0IGFuIGVycm9yIGFzIGlmIHdlIHJlY2VpdmVkIHJlYWRDbG9zZWQgZHVyaW5nIHRoZSBoYW5kc2hha2UuCiAgICAgIGR5bmFtaWMgcyA9IF9zb2NrZXQ7IC8vIENhc3QgdG8gZHluYW1pYyB0byBhdm9pZCB3YXJuaW5nLgogICAgICBpZiAocy5fc29ja2V0LmNsb3NlZFJlYWRFdmVudFNlbnQpIHsKICAgICAgICBfZXZlbnREaXNwYXRjaGVyKFJhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWQpOwogICAgICB9CiAgICAgIF9zb2NrZXRTdWJzY3JpcHRpb24KICAgICAgICAuLm9uRGF0YShfZXZlbnREaXNwYXRjaGVyKQogICAgICAgIC4ub25FcnJvcihfcmVwb3J0RXJyb3IpCiAgICAgICAgLi5vbkRvbmUoX2RvbmVIYW5kbGVyKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHZhciBlbmNvZGVkUHJvdG9jb2xzID0KICAgICAgICAgIFNlY3VyaXR5Q29udGV4dC5fcHJvdG9jb2xzVG9MZW5ndGhFbmNvZGluZyhzdXBwb3J0ZWRQcm90b2NvbHMpOwogICAgICBfc2VjdXJlRmlsdGVyLmNvbm5lY3QoCiAgICAgICAgICBhZGRyZXNzLmhvc3QsCiAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgaXNfc2VydmVyLAogICAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlIHx8IHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgIHJlcXVpcmVDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgICAgIGVuY29kZWRQcm90b2NvbHMpOwogICAgICBfc2VjdXJlSGFuZHNoYWtlKCk7CiAgICB9IGNhdGNoIChlLCBzKSB7CiAgICAgIF9yZXBvcnRFcnJvcihlLCBzKTsKICAgIH0KICB9CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxSYXdTb2NrZXRFdmVudD4gbGlzdGVuKHZvaWQgb25EYXRhKFJhd1NvY2tldEV2ZW50IGRhdGEpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgX3NlbmRXcml0ZUV2ZW50KCk7CiAgICByZXR1cm4gX3N0cmVhbS5saXN0ZW4ob25EYXRhLAogICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsIG9uRG9uZTogb25Eb25lLCBjYW5jZWxPbkVycm9yOiBjYW5jZWxPbkVycm9yKTsKICB9CgogIHN0YXRpYyB2b2lkIF92ZXJpZnlGaWVsZHMoCiAgICAgIGhvc3QsCiAgICAgIGludCByZXF1ZXN0ZWRQb3J0LAogICAgICBib29sIGlzX3NlcnZlciwKICAgICAgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLAogICAgICBGdW5jdGlvbiBvbkJhZENlcnRpZmljYXRlKSB7CiAgICBpZiAoaG9zdCBpcyEgU3RyaW5nICYmIGhvc3QgaXMhIEludGVybmV0QWRkcmVzcykgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiaG9zdCBpcyBub3QgYSBTdHJpbmcgb3IgYW4gSW50ZXJuZXRBZGRyZXNzIik7CiAgICB9CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChyZXF1ZXN0ZWRQb3J0LCAicmVxdWVzdGVkUG9ydCIpOwogICAgaWYgKHJlcXVlc3RlZFBvcnQgPCAwIHx8IHJlcXVlc3RlZFBvcnQgPiA2NTUzNSkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJyZXF1ZXN0ZWRQb3J0IGlzIG5vdCBpbiB0aGUgcmFuZ2UgMC4uNjU1MzUiKTsKICAgIH0KICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKAogICAgICAgIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwgInJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSIpOwogICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoCiAgICAgICAgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlLCAicmVxdWlyZUNsaWVudENlcnRpZmljYXRlIik7CiAgfQoKICBpbnQgZ2V0IHBvcnQgPT4gX3NvY2tldC5wb3J0OwoKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3MgPT4gX3NvY2tldC5yZW1vdGVBZGRyZXNzOwoKICBpbnQgZ2V0IHJlbW90ZVBvcnQgPT4gX3NvY2tldC5yZW1vdGVQb3J0OwoKICB2b2lkIHNldCBfb3duZXIob3duZXIpIHsKICAgIChfc29ja2V0IGFzIGR5bmFtaWMpLl9vd25lciA9IG93bmVyOwogIH0KCiAgaW50IGF2YWlsYWJsZSgpIHsKICAgIHJldHVybiBfc3RhdHVzICE9IGNvbm5lY3RlZFN0YXR1cwogICAgICAgID8gMAogICAgICAgIDogX3NlY3VyZUZpbHRlci5idWZmZXJzW3JlYWRQbGFpbnRleHRJZF0ubGVuZ3RoOwogIH0KCiAgRnV0dXJlPFJhd1NlY3VyZVNvY2tldD4gY2xvc2UoKSB7CiAgICBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24uYm90aCk7CiAgICByZXR1cm4gX2Nsb3NlQ29tcGxldGVyLmZ1dHVyZTsKICB9CgogIHZvaWQgX2NvbXBsZXRlQ2xvc2VDb21wbGV0ZXIoW1Jhd1NvY2tldCBkdW1teV0pIHsKICAgIGlmICghX2Nsb3NlQ29tcGxldGVyLmlzQ29tcGxldGVkKSBfY2xvc2VDb21wbGV0ZXIuY29tcGxldGUodGhpcyk7CiAgfQoKICB2b2lkIF9jbG9zZSgpIHsKICAgIF9jbG9zZWRXcml0ZSA9IHRydWU7CiAgICBfY2xvc2VkUmVhZCA9IHRydWU7CiAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CiAgICAgIF9zb2NrZXQuY2xvc2UoKS50aGVuKF9jb21wbGV0ZUNsb3NlQ29tcGxldGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIF9jb21wbGV0ZUNsb3NlQ29tcGxldGVyKCk7CiAgICB9CiAgICBfc29ja2V0Q2xvc2VkV3JpdGUgPSB0cnVlOwogICAgX3NvY2tldENsb3NlZFJlYWQgPSB0cnVlOwogICAgaWYgKCFfZmlsdGVyQWN0aXZlICYmIF9zZWN1cmVGaWx0ZXIgIT0gbnVsbCkgewogICAgICBfc2VjdXJlRmlsdGVyLmRlc3Ryb3koKTsKICAgICAgX3NlY3VyZUZpbHRlciA9IG51bGw7CiAgICB9CiAgICBpZiAoX3NvY2tldFN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CiAgICAgIF9zb2NrZXRTdWJzY3JpcHRpb24uY2FuY2VsKCk7CiAgICB9CiAgICBfY29udHJvbGxlci5jbG9zZSgpOwogICAgX3N0YXR1cyA9IGNsb3NlZFN0YXR1czsKICB9CgogIHZvaWQgc2h1dGRvd24oU29ja2V0RGlyZWN0aW9uIGRpcmVjdGlvbikgewogICAgaWYgKGRpcmVjdGlvbiA9PSBTb2NrZXREaXJlY3Rpb24uc2VuZCB8fAogICAgICAgIGRpcmVjdGlvbiA9PSBTb2NrZXREaXJlY3Rpb24uYm90aCkgewogICAgICBfY2xvc2VkV3JpdGUgPSB0cnVlOwogICAgICBpZiAoX2ZpbHRlclN0YXR1cy53cml0ZUVtcHR5KSB7CiAgICAgICAgX3NvY2tldC5zaHV0ZG93bihTb2NrZXREaXJlY3Rpb24uc2VuZCk7CiAgICAgICAgX3NvY2tldENsb3NlZFdyaXRlID0gdHJ1ZTsKICAgICAgICBpZiAoX2Nsb3NlZFJlYWQpIHsKICAgICAgICAgIF9jbG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGRpcmVjdGlvbiA9PSBTb2NrZXREaXJlY3Rpb24ucmVjZWl2ZSB8fAogICAgICAgIGRpcmVjdGlvbiA9PSBTb2NrZXREaXJlY3Rpb24uYm90aCkgewogICAgICBfY2xvc2VkUmVhZCA9IHRydWU7CiAgICAgIF9zb2NrZXRDbG9zZWRSZWFkID0gdHJ1ZTsKICAgICAgX3NvY2tldC5zaHV0ZG93bihTb2NrZXREaXJlY3Rpb24ucmVjZWl2ZSk7CiAgICAgIGlmIChfc29ja2V0Q2xvc2VkV3JpdGUpIHsKICAgICAgICBfY2xvc2UoKTsKICAgICAgfQogICAgfQogIH0KCiAgYm9vbCBnZXQgd3JpdGVFdmVudHNFbmFibGVkID0+IF93cml0ZUV2ZW50c0VuYWJsZWQ7CgogIHZvaWQgc2V0IHdyaXRlRXZlbnRzRW5hYmxlZChib29sIHZhbHVlKSB7CiAgICBfd3JpdGVFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICBpZiAodmFsdWUpIHsKICAgICAgVGltZXIucnVuKCgpID0+IF9zZW5kV3JpdGVFdmVudCgpKTsKICAgIH0KICB9CgogIGJvb2wgZ2V0IHJlYWRFdmVudHNFbmFibGVkID0+IF9yZWFkRXZlbnRzRW5hYmxlZDsKCiAgdm9pZCBzZXQgcmVhZEV2ZW50c0VuYWJsZWQoYm9vbCB2YWx1ZSkgewogICAgX3JlYWRFdmVudHNFbmFibGVkID0gdmFsdWU7CiAgICBfc2NoZWR1bGVSZWFkRXZlbnQoKTsKICB9CgogIExpc3Q8aW50PiByZWFkKFtpbnQgbGVuZ3RoXSkgewogICAgaWYgKGxlbmd0aCAhPSBudWxsICYmIChsZW5ndGggaXMhIGludCB8fCBsZW5ndGggPCAwKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJJbnZhbGlkIGxlbmd0aCBwYXJhbWV0ZXIgaW4gU2VjdXJlU29ja2V0LnJlYWQgKGxlbmd0aDogJGxlbmd0aCkiKTsKICAgIH0KICAgIGlmIChfY2xvc2VkUmVhZCkgewogICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCJSZWFkaW5nIGZyb20gYSBjbG9zZWQgc29ja2V0Iik7CiAgICB9CiAgICBpZiAoX3N0YXR1cyAhPSBjb25uZWN0ZWRTdGF0dXMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gX3NlY3VyZUZpbHRlci5idWZmZXJzW3JlYWRQbGFpbnRleHRJZF0ucmVhZChsZW5ndGgpOwogICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhlIHNvY2tldCwgYW5kIHNjaGVkdWxlIHRoZSBmaWx0ZXIgdG8gZW5jcnlwdCBpdC4KICBpbnQgd3JpdGUoTGlzdDxpbnQ+IGRhdGEsIFtpbnQgb2Zmc2V0LCBpbnQgYnl0ZXNdKSB7CiAgICBpZiAoYnl0ZXMgIT0gbnVsbCAmJiAoYnl0ZXMgaXMhIGludCB8fCBieXRlcyA8IDApKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKAogICAgICAgICAgIkludmFsaWQgYnl0ZXMgcGFyYW1ldGVyIGluIFNlY3VyZVNvY2tldC5yZWFkIChieXRlczogJGJ5dGVzKSIpOwogICAgfQogICAgaWYgKG9mZnNldCAhPSBudWxsICYmIChvZmZzZXQgaXMhIGludCB8fCBvZmZzZXQgPCAwKSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigKICAgICAgICAgICJJbnZhbGlkIG9mZnNldCBwYXJhbWV0ZXIgaW4gU2VjdXJlU29ja2V0LnJlYWQgKG9mZnNldDogJG9mZnNldCkiKTsKICAgIH0KICAgIGlmIChfY2xvc2VkV3JpdGUpIHsKICAgICAgX2NvbnRyb2xsZXIuYWRkRXJyb3IobmV3IFNvY2tldEV4Y2VwdGlvbigiV3JpdGluZyB0byBhIGNsb3NlZCBzb2NrZXQiKSk7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKF9zdGF0dXMgIT0gY29ubmVjdGVkU3RhdHVzKSByZXR1cm4gMDsKICAgIG9mZnNldCA/Pz0gMDsKICAgIGJ5dGVzID8/PSBkYXRhLmxlbmd0aCAtIG9mZnNldDsKCiAgICBpbnQgd3JpdHRlbiA9CiAgICAgICAgX3NlY3VyZUZpbHRlci5idWZmZXJzW3dyaXRlUGxhaW50ZXh0SWRdLndyaXRlKGRhdGEsIG9mZnNldCwgYnl0ZXMpOwogICAgaWYgKHdyaXR0ZW4gPiAwKSB7CiAgICAgIF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSA9IGZhbHNlOwogICAgfQogICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgICByZXR1cm4gd3JpdHRlbjsKICB9CgogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgcGVlckNlcnRpZmljYXRlID0+IF9zZWN1cmVGaWx0ZXIucGVlckNlcnRpZmljYXRlOwoKICBTdHJpbmcgZ2V0IHNlbGVjdGVkUHJvdG9jb2wgPT4gX3NlbGVjdGVkUHJvdG9jb2w7CgogIGJvb2wgX29uQmFkQ2VydGlmaWNhdGVXcmFwcGVyKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSkgewogICAgaWYgKG9uQmFkQ2VydGlmaWNhdGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgdmFyIHJlc3VsdCA9IG9uQmFkQ2VydGlmaWNhdGUoY2VydGlmaWNhdGUpOwogICAgaWYgKHJlc3VsdCBpcyBib29sKSByZXR1cm4gcmVzdWx0OwogICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigKICAgICAgICAib25CYWRDZXJ0aWZpY2F0ZSBjYWxsYmFjayByZXR1cm5lZCBub24tYm9vbGVhbiAkcmVzdWx0Iik7CiAgfQoKICBib29sIHNldE9wdGlvbihTb2NrZXRPcHRpb24gb3B0aW9uLCBib29sIGVuYWJsZWQpIHsKICAgIGlmIChfc29ja2V0ID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfc29ja2V0LnNldE9wdGlvbihvcHRpb24sIGVuYWJsZWQpOwogIH0KCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICByZXR1cm4gX3NvY2tldD8uZ2V0UmF3T3B0aW9uKG9wdGlvbik7CiAgfQoKICB2b2lkIHNldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKSB7CiAgICBfc29ja2V0Py5zZXRSYXdPcHRpb24ob3B0aW9uKTsKICB9CgogIHZvaWQgX2V2ZW50RGlzcGF0Y2hlcihSYXdTb2NrZXRFdmVudCBldmVudCkgewogICAgdHJ5IHsKICAgICAgaWYgKGV2ZW50ID09IFJhd1NvY2tldEV2ZW50LnJlYWQpIHsKICAgICAgICBfcmVhZEhhbmRsZXIoKTsKICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC53cml0ZSkgewogICAgICAgIF93cml0ZUhhbmRsZXIoKTsKICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKSB7CiAgICAgICAgX2Nsb3NlSGFuZGxlcigpOwogICAgICB9CiAgICB9IGNhdGNoIChlLCBzdGFja1RyYWNlKSB7CiAgICAgIF9yZXBvcnRFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgIH0KICB9CgogIHZvaWQgX3JlYWRIYW5kbGVyKCkgewogICAgX3JlYWRTb2NrZXQoKTsKICAgIF9zY2hlZHVsZUZpbHRlcigpOwogIH0KCiAgdm9pZCBfd3JpdGVIYW5kbGVyKCkgewogICAgX3dyaXRlU29ja2V0KCk7CiAgICBfc2NoZWR1bGVGaWx0ZXIoKTsKICB9CgogIHZvaWQgX2RvbmVIYW5kbGVyKCkgewogICAgaWYgKF9maWx0ZXJTdGF0dXMucmVhZEVtcHR5KSB7CiAgICAgIF9jbG9zZSgpOwogICAgfQogIH0KCiAgdm9pZCBfcmVwb3J0RXJyb3IoZSwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIGlmIChfc3RhdHVzID09IGNsb3NlZFN0YXR1cykgewogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKF9jb25uZWN0UGVuZGluZykgewogICAgICAvLyBfY29ubmVjdFBlbmRpbmcgaXMgdHJ1ZSB1bnRpbCB0aGUgaGFuZHNoYWtlIGhhcyBjb21wbGV0ZWQsIGFuZCB0aGUKICAgICAgLy8gX2hhbmRzaGFrZUNvbXBsZXRlIGZ1dHVyZSByZXR1cm5lZCBmcm9tIFNlY3VyZVNvY2tldC5jb25uZWN0IGhhcwogICAgICAvLyBjb21wbGV0ZWQuICBCZWZvcmUgdGhpcyBwb2ludCwgd2UgbXVzdCBjb21wbGV0ZSBpdCB3aXRoIGFuIGVycm9yLgogICAgICBfaGFuZHNoYWtlQ29tcGxldGUuY29tcGxldGVFcnJvcihlLCBzdGFja1RyYWNlKTsKICAgIH0gZWxzZSB7CiAgICAgIF9jb250cm9sbGVyLmFkZEVycm9yKGUsIHN0YWNrVHJhY2UpOwogICAgfQogICAgX2Nsb3NlKCk7CiAgfQoKICB2b2lkIF9jbG9zZUhhbmRsZXIoKSB7CiAgICBpZiAoX3N0YXR1cyA9PSBjb25uZWN0ZWRTdGF0dXMpIHsKICAgICAgaWYgKF9jbG9zZWRSZWFkKSByZXR1cm47CiAgICAgIF9zb2NrZXRDbG9zZWRSZWFkID0gdHJ1ZTsKICAgICAgaWYgKF9maWx0ZXJTdGF0dXMucmVhZEVtcHR5KSB7CiAgICAgICAgX2Nsb3NlZFJlYWQgPSB0cnVlOwogICAgICAgIF9jb250cm9sbGVyLmFkZChSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkKTsKICAgICAgICBpZiAoX3NvY2tldENsb3NlZFdyaXRlKSB7CiAgICAgICAgICBfY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoX3N0YXR1cyA9PSBoYW5kc2hha2VTdGF0dXMpIHsKICAgICAgX3NvY2tldENsb3NlZFJlYWQgPSB0cnVlOwogICAgICBpZiAoX2ZpbHRlclN0YXR1cy5yZWFkRW1wdHkpIHsKICAgICAgICBfcmVwb3J0RXJyb3IoCiAgICAgICAgICAgIG5ldyBIYW5kc2hha2VFeGNlcHRpb24oJ0Nvbm5lY3Rpb24gdGVybWluYXRlZCBkdXJpbmcgaGFuZHNoYWtlJyksCiAgICAgICAgICAgIG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIF9zZWN1cmVIYW5kc2hha2UoKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfc2VjdXJlSGFuZHNoYWtlKCkgewogICAgdHJ5IHsKICAgICAgX3NlY3VyZUZpbHRlci5oYW5kc2hha2UoKTsKICAgICAgX2ZpbHRlclN0YXR1cy53cml0ZUVtcHR5ID0gZmFsc2U7CiAgICAgIF9yZWFkU29ja2V0KCk7CiAgICAgIF93cml0ZVNvY2tldCgpOwogICAgICBfc2NoZWR1bGVGaWx0ZXIoKTsKICAgIH0gY2F0Y2ggKGUsIHN0YWNrVHJhY2UpIHsKICAgICAgX3JlcG9ydEVycm9yKGUsIHN0YWNrVHJhY2UpOwogICAgfQogIH0KCiAgdm9pZCByZW5lZ290aWF0ZSgKICAgICAge2Jvb2wgdXNlU2Vzc2lvbkNhY2hlOiB0cnVlLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZTogZmFsc2UsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlOiBmYWxzZX0pIHsKICAgIGlmIChfc3RhdHVzICE9IGNvbm5lY3RlZFN0YXR1cykgewogICAgICB0aHJvdyBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKAogICAgICAgICAgIkNhbGxlZCByZW5lZ290aWF0ZSBvbiBhIG5vbi1jb25uZWN0ZWQgc29ja2V0Iik7CiAgICB9CiAgICBfc2VjdXJlRmlsdGVyLnJlbmVnb3RpYXRlKAogICAgICAgIHVzZVNlc3Npb25DYWNoZSwgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUpOwogICAgX3N0YXR1cyA9IGhhbmRzaGFrZVN0YXR1czsKICAgIF9maWx0ZXJTdGF0dXMud3JpdGVFbXB0eSA9IGZhbHNlOwogICAgX3NjaGVkdWxlRmlsdGVyKCk7CiAgfQoKICB2b2lkIF9zZWN1cmVIYW5kc2hha2VDb21wbGV0ZUhhbmRsZXIoKSB7CiAgICBfc3RhdHVzID0gY29ubmVjdGVkU3RhdHVzOwogICAgaWYgKF9jb25uZWN0UGVuZGluZykgewogICAgICBfY29ubmVjdFBlbmRpbmcgPSBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICBfc2VsZWN0ZWRQcm90b2NvbCA9IF9zZWN1cmVGaWx0ZXIuc2VsZWN0ZWRQcm90b2NvbCgpOwogICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdXNlciBjb2RlIHRvIHJ1biBzeW5jaHJvbm91c2x5IGluIHRoaXMgY2FsbGJhY2suCiAgICAgICAgVGltZXIucnVuKCgpID0+IF9oYW5kc2hha2VDb21wbGV0ZS5jb21wbGV0ZSh0aGlzKSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yLCBzdGFjaykgewogICAgICAgIF9oYW5kc2hha2VDb21wbGV0ZS5jb21wbGV0ZUVycm9yKGVycm9yLCBzdGFjayk7CiAgICAgIH0KICAgIH0KICB9CgogIHZvaWQgX29uUGF1c2VTdGF0ZUNoYW5nZSgpIHsKICAgIGlmIChfY29udHJvbGxlci5pc1BhdXNlZCkgewogICAgICBfcGF1c2VDb3VudCsrOwogICAgfSBlbHNlIHsKICAgICAgX3BhdXNlQ291bnQtLTsKICAgICAgaWYgKF9wYXVzZUNvdW50ID09IDApIHsKICAgICAgICBfc2NoZWR1bGVSZWFkRXZlbnQoKTsKICAgICAgICBfc2VuZFdyaXRlRXZlbnQoKTsgLy8gQ2FuIHNlbmQgZXZlbnQgc3luY2hyb25vdXNseS4KICAgICAgfQogICAgfQoKICAgIGlmICghX3NvY2tldENsb3NlZFJlYWQgfHwgIV9zb2NrZXRDbG9zZWRXcml0ZSkgewogICAgICBpZiAoX2NvbnRyb2xsZXIuaXNQYXVzZWQpIHsKICAgICAgICBfc29ja2V0U3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3NvY2tldFN1YnNjcmlwdGlvbi5yZXN1bWUoKTsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBfb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZSgpIHsKICAgIGlmIChfY29udHJvbGxlci5oYXNMaXN0ZW5lcikgewogICAgICAvLyBUT0RPKGFqb2huc2VuKTogRG8gc29tZXRoaW5nIGhlcmU/CiAgICB9CiAgfQoKICB2b2lkIF9zY2hlZHVsZUZpbHRlcigpIHsKICAgIF9maWx0ZXJQZW5kaW5nID0gdHJ1ZTsKICAgIF90cnlGaWx0ZXIoKTsKICB9CgogIHZvaWQgX3RyeUZpbHRlcigpIHsKICAgIGlmIChfc3RhdHVzID09IGNsb3NlZFN0YXR1cykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoX2ZpbHRlclBlbmRpbmcgJiYgIV9maWx0ZXJBY3RpdmUpIHsKICAgICAgX2ZpbHRlckFjdGl2ZSA9IHRydWU7CiAgICAgIF9maWx0ZXJQZW5kaW5nID0gZmFsc2U7CiAgICAgIF9wdXNoQWxsRmlsdGVyU3RhZ2VzKCkudGhlbigoc3RhdHVzKSB7CiAgICAgICAgX2ZpbHRlclN0YXR1cyA9IHN0YXR1czsKICAgICAgICBfZmlsdGVyQWN0aXZlID0gZmFsc2U7CiAgICAgICAgaWYgKF9zdGF0dXMgPT0gY2xvc2VkU3RhdHVzKSB7CiAgICAgICAgICBfc2VjdXJlRmlsdGVyLmRlc3Ryb3koKTsKICAgICAgICAgIF9zZWN1cmVGaWx0ZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBfc29ja2V0LnJlYWRFdmVudHNFbmFibGVkID0gdHJ1ZTsKICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy53cml0ZUVtcHR5ICYmIF9jbG9zZWRXcml0ZSAmJiAhX3NvY2tldENsb3NlZFdyaXRlKSB7CiAgICAgICAgICAvLyBDaGVja3MgZm9yIGFuZCBoYW5kbGVzIGFsbCBjYXNlcyBvZiBwYXJ0aWFsbHkgY2xvc2VkIHNvY2tldHMuCiAgICAgICAgICBzaHV0ZG93bihTb2NrZXREaXJlY3Rpb24uc2VuZCk7CiAgICAgICAgICBpZiAoX3N0YXR1cyA9PSBjbG9zZWRTdGF0dXMpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy5yZWFkRW1wdHkgJiYgX3NvY2tldENsb3NlZFJlYWQgJiYgIV9jbG9zZWRSZWFkKSB7CiAgICAgICAgICBpZiAoX3N0YXR1cyA9PSBoYW5kc2hha2VTdGF0dXMpIHsKICAgICAgICAgICAgX3NlY3VyZUZpbHRlci5oYW5kc2hha2UoKTsKICAgICAgICAgICAgaWYgKF9zdGF0dXMgPT0gaGFuZHNoYWtlU3RhdHVzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEhhbmRzaGFrZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgJ0Nvbm5lY3Rpb24gdGVybWluYXRlZCBkdXJpbmcgaGFuZHNoYWtlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIF9jbG9zZUhhbmRsZXIoKTsKICAgICAgICB9CiAgICAgICAgaWYgKF9zdGF0dXMgPT0gY2xvc2VkU3RhdHVzKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChfZmlsdGVyU3RhdHVzLnByb2dyZXNzKSB7CiAgICAgICAgICBfZmlsdGVyUGVuZGluZyA9IHRydWU7CiAgICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy53cml0ZUVuY3J5cHRlZE5vTG9uZ2VyRW1wdHkpIHsKICAgICAgICAgICAgX3dyaXRlU29ja2V0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX2ZpbHRlclN0YXR1cy53cml0ZVBsYWludGV4dE5vTG9uZ2VyRnVsbCkgewogICAgICAgICAgICBfc2VuZFdyaXRlRXZlbnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChfZmlsdGVyU3RhdHVzLnJlYWRFbmNyeXB0ZWROb0xvbmdlckZ1bGwpIHsKICAgICAgICAgICAgX3JlYWRTb2NrZXQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChfZmlsdGVyU3RhdHVzLnJlYWRQbGFpbnRleHROb0xvbmdlckVtcHR5KSB7CiAgICAgICAgICAgIF9zY2hlZHVsZVJlYWRFdmVudCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKF9zdGF0dXMgPT0gaGFuZHNoYWtlU3RhdHVzKSB7CiAgICAgICAgICAgIF9zZWN1cmVIYW5kc2hha2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3RyeUZpbHRlcigpOwogICAgICB9KS5jYXRjaEVycm9yKF9yZXBvcnRFcnJvcik7CiAgICB9CiAgfQoKICBMaXN0PGludD4gX3JlYWRTb2NrZXRPckJ1ZmZlcmVkRGF0YShpbnQgYnl0ZXMpIHsKICAgIGlmIChfYnVmZmVyZWREYXRhICE9IG51bGwpIHsKICAgICAgaWYgKGJ5dGVzID4gX2J1ZmZlcmVkRGF0YS5sZW5ndGggLSBfYnVmZmVyZWREYXRhSW5kZXgpIHsKICAgICAgICBieXRlcyA9IF9idWZmZXJlZERhdGEubGVuZ3RoIC0gX2J1ZmZlcmVkRGF0YUluZGV4OwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPQogICAgICAgICAgX2J1ZmZlcmVkRGF0YS5zdWJsaXN0KF9idWZmZXJlZERhdGFJbmRleCwgX2J1ZmZlcmVkRGF0YUluZGV4ICsgYnl0ZXMpOwogICAgICBfYnVmZmVyZWREYXRhSW5kZXggKz0gYnl0ZXM7CiAgICAgIGlmIChfYnVmZmVyZWREYXRhLmxlbmd0aCA9PSBfYnVmZmVyZWREYXRhSW5kZXgpIHsKICAgICAgICBfYnVmZmVyZWREYXRhID0gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIGlmICghX3NvY2tldENsb3NlZFJlYWQpIHsKICAgICAgcmV0dXJuIF9zb2NrZXQucmVhZChieXRlcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHZvaWQgX3JlYWRTb2NrZXQoKSB7CiAgICBpZiAoX3N0YXR1cyA9PSBjbG9zZWRTdGF0dXMpIHJldHVybjsKICAgIHZhciBidWZmZXIgPSBfc2VjdXJlRmlsdGVyLmJ1ZmZlcnNbcmVhZEVuY3J5cHRlZElkXTsKICAgIGlmIChidWZmZXIud3JpdGVGcm9tU291cmNlKF9yZWFkU29ja2V0T3JCdWZmZXJlZERhdGEpID4gMCkgewogICAgICBfZmlsdGVyU3RhdHVzLnJlYWRFbXB0eSA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgX3NvY2tldC5yZWFkRXZlbnRzRW5hYmxlZCA9IGZhbHNlOwogICAgfQogIH0KCiAgdm9pZCBfd3JpdGVTb2NrZXQoKSB7CiAgICBpZiAoX3NvY2tldENsb3NlZFdyaXRlKSByZXR1cm47CiAgICB2YXIgYnVmZmVyID0gX3NlY3VyZUZpbHRlci5idWZmZXJzW3dyaXRlRW5jcnlwdGVkSWRdOwogICAgaWYgKGJ1ZmZlci5yZWFkVG9Tb2NrZXQoX3NvY2tldCkpIHsKICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGJsb2NrZWQKICAgICAgX3NvY2tldC53cml0ZUV2ZW50c0VuYWJsZWQgPSB0cnVlOwogICAgfQogIH0KCiAgLy8gSWYgYSByZWFkIGV2ZW50IHNob3VsZCBiZSBzZW50LCBhZGQgaXQgdG8gdGhlIGNvbnRyb2xsZXIuCiAgX3NjaGVkdWxlUmVhZEV2ZW50KCkgewogICAgaWYgKCFfcGVuZGluZ1JlYWRFdmVudCAmJgogICAgICAgIF9yZWFkRXZlbnRzRW5hYmxlZCAmJgogICAgICAgIF9wYXVzZUNvdW50ID09IDAgJiYKICAgICAgICBfc2VjdXJlRmlsdGVyICE9IG51bGwgJiYKICAgICAgICAhX3NlY3VyZUZpbHRlci5idWZmZXJzW3JlYWRQbGFpbnRleHRJZF0uaXNFbXB0eSkgewogICAgICBfcGVuZGluZ1JlYWRFdmVudCA9IHRydWU7CiAgICAgIFRpbWVyLnJ1bihfc2VuZFJlYWRFdmVudCk7CiAgICB9CiAgfQoKICBfc2VuZFJlYWRFdmVudCgpIHsKICAgIF9wZW5kaW5nUmVhZEV2ZW50ID0gZmFsc2U7CiAgICBpZiAoX3N0YXR1cyAhPSBjbG9zZWRTdGF0dXMgJiYKICAgICAgICBfcmVhZEV2ZW50c0VuYWJsZWQgJiYKICAgICAgICBfcGF1c2VDb3VudCA9PSAwICYmCiAgICAgICAgX3NlY3VyZUZpbHRlciAhPSBudWxsICYmCiAgICAgICAgIV9zZWN1cmVGaWx0ZXIuYnVmZmVyc1tyZWFkUGxhaW50ZXh0SWRdLmlzRW1wdHkpIHsKICAgICAgX2NvbnRyb2xsZXIuYWRkKFJhd1NvY2tldEV2ZW50LnJlYWQpOwogICAgICBfc2NoZWR1bGVSZWFkRXZlbnQoKTsKICAgIH0KICB9CgogIC8vIElmIGEgd3JpdGUgZXZlbnQgc2hvdWxkIGJlIHNlbnQsIGFkZCBpdCB0byB0aGUgY29udHJvbGxlci4KICBfc2VuZFdyaXRlRXZlbnQoKSB7CiAgICBpZiAoIV9jbG9zZWRXcml0ZSAmJgogICAgICAgIF93cml0ZUV2ZW50c0VuYWJsZWQgJiYKICAgICAgICBfcGF1c2VDb3VudCA9PSAwICYmCiAgICAgICAgX3NlY3VyZUZpbHRlciAhPSBudWxsICYmCiAgICAgICAgX3NlY3VyZUZpbHRlci5idWZmZXJzW3dyaXRlUGxhaW50ZXh0SWRdLmZyZWUgPiAwKSB7CiAgICAgIF93cml0ZUV2ZW50c0VuYWJsZWQgPSBmYWxzZTsKICAgICAgX2NvbnRyb2xsZXIuYWRkKFJhd1NvY2tldEV2ZW50LndyaXRlKTsKICAgIH0KICB9CgogIEZ1dHVyZTxfRmlsdGVyU3RhdHVzPiBfcHVzaEFsbEZpbHRlclN0YWdlcygpIHsKICAgIGJvb2wgd2FzSW5IYW5kc2hha2UgPSBfc3RhdHVzICE9IGNvbm5lY3RlZFN0YXR1czsKICAgIExpc3QgYXJncyA9IG5ldyBMaXN0KDIgKyBidWZmZXJDb3VudCAqIDIpOwogICAgYXJnc1swXSA9IF9zZWN1cmVGaWx0ZXIuX3BvaW50ZXIoKTsKICAgIGFyZ3NbMV0gPSB3YXNJbkhhbmRzaGFrZTsKICAgIHZhciBidWZzID0gX3NlY3VyZUZpbHRlci5idWZmZXJzOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJDb3VudDsgKytpKSB7CiAgICAgIGFyZ3NbMiAqIGkgKyAyXSA9IGJ1ZnNbaV0uc3RhcnQ7CiAgICAgIGFyZ3NbMiAqIGkgKyAzXSA9IGJ1ZnNbaV0uZW5kOwogICAgfQoKICAgIHJldHVybiBfSU9TZXJ2aWNlLl9kaXNwYXRjaChfSU9TZXJ2aWNlLnNzbFByb2Nlc3NGaWx0ZXIsIGFyZ3MpCiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CiAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPT0gMikgewogICAgICAgIGlmICh3YXNJbkhhbmRzaGFrZSkgewogICAgICAgICAgLy8gSWYgd2UncmUgaW4gaGFuZHNoYWtlLCB0aHJvdyBhIGhhbmRzaGFrZSBlcnJvci4KICAgICAgICAgIF9yZXBvcnRFcnJvcigKICAgICAgICAgICAgICBuZXcgSGFuZHNoYWtlRXhjZXB0aW9uKCcke3Jlc3BvbnNlWzFdfSBlcnJvciAke3Jlc3BvbnNlWzBdfScpLAogICAgICAgICAgICAgIG51bGwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBJZiB3ZSdyZSBjb25uZWN0ZWQsIHRocm93IGEgVExTIGVycm9yLgogICAgICAgICAgX3JlcG9ydEVycm9yKAogICAgICAgICAgICAgIG5ldyBUbHNFeGNlcHRpb24oJyR7cmVzcG9uc2VbMV19IGVycm9yICR7cmVzcG9uc2VbMF19JyksIG51bGwpOwogICAgICAgIH0KICAgICAgfQogICAgICBpbnQgc3RhcnQoaW50IGluZGV4KSA9PiByZXNwb25zZVsyICogaW5kZXhdOwogICAgICBpbnQgZW5kKGludCBpbmRleCkgPT4gcmVzcG9uc2VbMiAqIGluZGV4ICsgMV07CgogICAgICBfRmlsdGVyU3RhdHVzIHN0YXR1cyA9IG5ldyBfRmlsdGVyU3RhdHVzKCk7CiAgICAgIC8vIENvbXB1dGUgd3JpdGVFbXB0eSBhcyAid3JpdGUgcGxhaW50ZXh0IGJ1ZmZlciBhbmQgd3JpdGUgZW5jcnlwdGVkCiAgICAgIC8vIGJ1ZmZlciB3ZXJlIGVtcHR5IHdoZW4gd2Ugc3RhcnRlZCBhbmQgYXJlIGVtcHR5IG5vdyIuCiAgICAgIHN0YXR1cy53cml0ZUVtcHR5ID0gYnVmc1t3cml0ZVBsYWludGV4dElkXS5pc0VtcHR5ICYmCiAgICAgICAgICBzdGFydCh3cml0ZUVuY3J5cHRlZElkKSA9PSBlbmQod3JpdGVFbmNyeXB0ZWRJZCk7CiAgICAgIC8vIElmIHdlIHdlcmUgaW4gaGFuZHNoYWtlIHdoZW4gdGhpcyBzdGFydGVkLCBfd3JpdGVFbXB0eSBtYXkgYmUgZmFsc2UKICAgICAgLy8gYmVjYXVzZSB0aGUgaGFuZHNoYWtlIHdyb3RlIGRhdGEgYWZ0ZXIgd2UgY2hlY2tlZC4KICAgICAgaWYgKHdhc0luSGFuZHNoYWtlKSBzdGF0dXMud3JpdGVFbXB0eSA9IGZhbHNlOwoKICAgICAgLy8gQ29tcHV0ZSByZWFkRW1wdHkgYXMgImJvdGggcmVhZCBidWZmZXJzIHdlcmUgZW1wdHkgd2hlbiB3ZSBzdGFydGVkCiAgICAgIC8vIGFuZCBhcmUgZW1wdHkgbm93Ii4KICAgICAgc3RhdHVzLnJlYWRFbXB0eSA9IGJ1ZnNbcmVhZEVuY3J5cHRlZElkXS5pc0VtcHR5ICYmCiAgICAgICAgICBzdGFydChyZWFkUGxhaW50ZXh0SWQpID09IGVuZChyZWFkUGxhaW50ZXh0SWQpOwoKICAgICAgX0V4dGVybmFsQnVmZmVyIGJ1ZmZlciA9IGJ1ZnNbd3JpdGVQbGFpbnRleHRJZF07CiAgICAgIGludCBuZXdfc3RhcnQgPSBzdGFydCh3cml0ZVBsYWludGV4dElkKTsKICAgICAgaWYgKG5ld19zdGFydCAhPSBidWZmZXIuc3RhcnQpIHsKICAgICAgICBzdGF0dXMucHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgIGlmIChidWZmZXIuZnJlZSA9PSAwKSB7CiAgICAgICAgICBzdGF0dXMud3JpdGVQbGFpbnRleHROb0xvbmdlckZ1bGwgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBidWZmZXIuc3RhcnQgPSBuZXdfc3RhcnQ7CiAgICAgIH0KICAgICAgYnVmZmVyID0gYnVmc1tyZWFkRW5jcnlwdGVkSWRdOwogICAgICBuZXdfc3RhcnQgPSBzdGFydChyZWFkRW5jcnlwdGVkSWQpOwogICAgICBpZiAobmV3X3N0YXJ0ICE9IGJ1ZmZlci5zdGFydCkgewogICAgICAgIHN0YXR1cy5wcm9ncmVzcyA9IHRydWU7CiAgICAgICAgaWYgKGJ1ZmZlci5mcmVlID09IDApIHsKICAgICAgICAgIHN0YXR1cy5yZWFkRW5jcnlwdGVkTm9Mb25nZXJGdWxsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLnN0YXJ0ID0gbmV3X3N0YXJ0OwogICAgICB9CiAgICAgIGJ1ZmZlciA9IGJ1ZnNbd3JpdGVFbmNyeXB0ZWRJZF07CiAgICAgIGludCBuZXdfZW5kID0gZW5kKHdyaXRlRW5jcnlwdGVkSWQpOwogICAgICBpZiAobmV3X2VuZCAhPSBidWZmZXIuZW5kKSB7CiAgICAgICAgc3RhdHVzLnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICBzdGF0dXMud3JpdGVFbmNyeXB0ZWROb0xvbmdlckVtcHR5ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLmVuZCA9IG5ld19lbmQ7CiAgICAgIH0KICAgICAgYnVmZmVyID0gYnVmc1tyZWFkUGxhaW50ZXh0SWRdOwogICAgICBuZXdfZW5kID0gZW5kKHJlYWRQbGFpbnRleHRJZCk7CiAgICAgIGlmIChuZXdfZW5kICE9IGJ1ZmZlci5lbmQpIHsKICAgICAgICBzdGF0dXMucHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgIGlmIChidWZmZXIubGVuZ3RoID09IDApIHsKICAgICAgICAgIHN0YXR1cy5yZWFkUGxhaW50ZXh0Tm9Mb25nZXJFbXB0eSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlci5lbmQgPSBuZXdfZW5kOwogICAgICB9CiAgICAgIHJldHVybiBzdGF0dXM7CiAgICB9KTsKICB9Cn0KCi8qKgogKiBBIGNpcmN1bGFyIGJ1ZmZlciBiYWNrZWQgYnkgYW4gZXh0ZXJuYWwgYnl0ZSBhcnJheS4gIEFjY2Vzc2VkIGZyb20KICogYm90aCBDKysgYW5kIERhcnQgY29kZSBpbiBhbiB1bnN5bmNocm9uaXplZCB3YXksIHdpdGggb25lIHJlYWRpbmcKICogYW5kIG9uZSB3cml0aW5nLiAgQWxsIHVwZGF0ZXMgdG8gc3RhcnQgYW5kIGVuZCBhcmUgZG9uZSBieSBEYXJ0IGNvZGUuCiAqLwpjbGFzcyBfRXh0ZXJuYWxCdWZmZXIgewogIC8vIFRoaXMgd2lsbCBiZSBhbiBFeHRlcm5hbEJ5dGVBcnJheSwgYmFja2VkIGJ5IEMgYWxsb2NhdGVkIGRhdGEuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAic2V0IikKICBMaXN0PGludD4gZGF0YTsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGludCBzdGFydDsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGludCBlbmQ7CgogIGZpbmFsIHNpemU7CgogIF9FeHRlcm5hbEJ1ZmZlcih0aGlzLnNpemUpIHsKICAgIHN0YXJ0ID0gZW5kID0gc2l6ZSB+LyAyOwogIH0KCiAgdm9pZCBhZHZhbmNlU3RhcnQoaW50IGJ5dGVzKSB7CiAgICBhc3NlcnQoc3RhcnQgPiBlbmQgfHwgc3RhcnQgKyBieXRlcyA8PSBlbmQpOwogICAgc3RhcnQgKz0gYnl0ZXM7CiAgICBpZiAoc3RhcnQgPj0gc2l6ZSkgewogICAgICBzdGFydCAtPSBzaXplOwogICAgICBhc3NlcnQoc3RhcnQgPD0gZW5kKTsKICAgICAgYXNzZXJ0KHN0YXJ0IDwgc2l6ZSk7CiAgICB9CiAgfQoKICB2b2lkIGFkdmFuY2VFbmQoaW50IGJ5dGVzKSB7CiAgICBhc3NlcnQoc3RhcnQgPD0gZW5kIHx8IHN0YXJ0ID4gZW5kICsgYnl0ZXMpOwogICAgZW5kICs9IGJ5dGVzOwogICAgaWYgKGVuZCA+PSBzaXplKSB7CiAgICAgIGVuZCAtPSBzaXplOwogICAgICBhc3NlcnQoZW5kIDwgc3RhcnQpOwogICAgICBhc3NlcnQoZW5kIDwgc2l6ZSk7CiAgICB9CiAgfQoKICBib29sIGdldCBpc0VtcHR5ID0+IGVuZCA9PSBzdGFydDsKCiAgaW50IGdldCBsZW5ndGggPT4gc3RhcnQgPiBlbmQgPyBzaXplICsgZW5kIC0gc3RhcnQgOiBlbmQgLSBzdGFydDsKCiAgaW50IGdldCBsaW5lYXJMZW5ndGggPT4gc3RhcnQgPiBlbmQgPyBzaXplIC0gc3RhcnQgOiBlbmQgLSBzdGFydDsKCiAgaW50IGdldCBmcmVlID0+IHN0YXJ0ID4gZW5kID8gc3RhcnQgLSBlbmQgLSAxIDogc2l6ZSArIHN0YXJ0IC0gZW5kIC0gMTsKCiAgaW50IGdldCBsaW5lYXJGcmVlIHsKICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIHN0YXJ0IC0gZW5kIC0gMTsKICAgIGlmIChzdGFydCA9PSAwKSByZXR1cm4gc2l6ZSAtIGVuZCAtIDE7CiAgICByZXR1cm4gc2l6ZSAtIGVuZDsKICB9CgogIExpc3Q8aW50PiByZWFkKGludCBieXRlcykgewogICAgaWYgKGJ5dGVzID09IG51bGwpIHsKICAgICAgYnl0ZXMgPSBsZW5ndGg7CiAgICB9IGVsc2UgewogICAgICBieXRlcyA9IG1pbihieXRlcywgbGVuZ3RoKTsKICAgIH0KICAgIGlmIChieXRlcyA9PSAwKSByZXR1cm4gbnVsbDsKICAgIExpc3Q8aW50PiByZXN1bHQgPSBuZXcgVWludDhMaXN0KGJ5dGVzKTsKICAgIGludCBieXRlc1JlYWQgPSAwOwogICAgLy8gTG9vcCBvdmVyIHplcm8sIG9uZSwgb3IgdHdvIGxpbmVhciBkYXRhIHJhbmdlcy4KICAgIHdoaWxlIChieXRlc1JlYWQgPCBieXRlcykgewogICAgICBpbnQgdG9SZWFkID0gbWluKGJ5dGVzIC0gYnl0ZXNSZWFkLCBsaW5lYXJMZW5ndGgpOwogICAgICByZXN1bHQuc2V0UmFuZ2UoYnl0ZXNSZWFkLCBieXRlc1JlYWQgKyB0b1JlYWQsIGRhdGEsIHN0YXJ0KTsKICAgICAgYWR2YW5jZVN0YXJ0KHRvUmVhZCk7CiAgICAgIGJ5dGVzUmVhZCArPSB0b1JlYWQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgaW50IHdyaXRlKExpc3Q8aW50PiBpbnB1dERhdGEsIGludCBvZmZzZXQsIGludCBieXRlcykgewogICAgaWYgKGJ5dGVzID4gZnJlZSkgewogICAgICBieXRlcyA9IGZyZWU7CiAgICB9CiAgICBpbnQgd3JpdHRlbiA9IDA7CiAgICBpbnQgdG9Xcml0ZSA9IG1pbihieXRlcywgbGluZWFyRnJlZSk7CiAgICAvLyBMb29wIG92ZXIgemVybywgb25lLCBvciB0d28gbGluZWFyIGRhdGEgcmFuZ2VzLgogICAgd2hpbGUgKHRvV3JpdGUgPiAwKSB7CiAgICAgIGRhdGEuc2V0UmFuZ2UoZW5kLCBlbmQgKyB0b1dyaXRlLCBpbnB1dERhdGEsIG9mZnNldCk7CiAgICAgIGFkdmFuY2VFbmQodG9Xcml0ZSk7CiAgICAgIG9mZnNldCArPSB0b1dyaXRlOwogICAgICB3cml0dGVuICs9IHRvV3JpdGU7CiAgICAgIHRvV3JpdGUgPSBtaW4oYnl0ZXMgLSB3cml0dGVuLCBsaW5lYXJGcmVlKTsKICAgIH0KICAgIHJldHVybiB3cml0dGVuOwogIH0KCiAgaW50IHdyaXRlRnJvbVNvdXJjZShMaXN0PGludD4gZ2V0RGF0YShpbnQgcmVxdWVzdGVkKSkgewogICAgaW50IHdyaXR0ZW4gPSAwOwogICAgaW50IHRvV3JpdGUgPSBsaW5lYXJGcmVlOwogICAgLy8gTG9vcCBvdmVyIHplcm8sIG9uZSwgb3IgdHdvIGxpbmVhciBkYXRhIHJhbmdlcy4KICAgIHdoaWxlICh0b1dyaXRlID4gMCkgewogICAgICAvLyBTb3VyY2UgcmV0dXJucyBhdCBtb3N0IHRvV3JpdGUgYnl0ZXMsIGFuZCBpdCByZXR1cm5zIG51bGwgd2hlbiBlbXB0eS4KICAgICAgdmFyIGlucHV0RGF0YSA9IGdldERhdGEodG9Xcml0ZSk7CiAgICAgIGlmIChpbnB1dERhdGEgPT0gbnVsbCB8fCBpbnB1dERhdGEubGVuZ3RoID09IDApIGJyZWFrOwogICAgICB2YXIgbGVuID0gaW5wdXREYXRhLmxlbmd0aDsKICAgICAgZGF0YS5zZXRSYW5nZShlbmQsIGVuZCArIGxlbiwgaW5wdXREYXRhKTsKICAgICAgYWR2YW5jZUVuZChsZW4pOwogICAgICB3cml0dGVuICs9IGxlbjsKICAgICAgdG9Xcml0ZSA9IGxpbmVhckZyZWU7CiAgICB9CiAgICByZXR1cm4gd3JpdHRlbjsKICB9CgogIGJvb2wgcmVhZFRvU29ja2V0KFJhd1NvY2tldCBzb2NrZXQpIHsKICAgIC8vIExvb3Agb3ZlciB6ZXJvLCBvbmUsIG9yIHR3byBsaW5lYXIgZGF0YSByYW5nZXMuCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICB2YXIgdG9Xcml0ZSA9IGxpbmVhckxlbmd0aDsKICAgICAgaWYgKHRvV3JpdGUgPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICBpbnQgYnl0ZXMgPSBzb2NrZXQud3JpdGUoZGF0YSwgc3RhcnQsIHRvV3JpdGUpOwogICAgICBhZHZhbmNlU3RhcnQoYnl0ZXMpOwogICAgICBpZiAoYnl0ZXMgPCB0b1dyaXRlKSB7CiAgICAgICAgLy8gVGhlIHNvY2tldCBoYXMgYmxvY2tlZCB3aGlsZSB3ZSBoYXZlIGRhdGEgdG8gd3JpdGUuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICB9Cn0KCmFic3RyYWN0IGNsYXNzIF9TZWN1cmVGaWx0ZXIgewogIGV4dGVybmFsIGZhY3RvcnkgX1NlY3VyZUZpbHRlcigpOwoKICB2b2lkIGNvbm5lY3QoCiAgICAgIFN0cmluZyBob3N0TmFtZSwKICAgICAgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQsCiAgICAgIGJvb2wgaXNfc2VydmVyLAogICAgICBib29sIHJlcXVlc3RDbGllbnRDZXJ0aWZpY2F0ZSwKICAgICAgYm9vbCByZXF1aXJlQ2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIFVpbnQ4TGlzdCBwcm90b2NvbHMpOwogIHZvaWQgZGVzdHJveSgpOwogIHZvaWQgaGFuZHNoYWtlKCk7CiAgU3RyaW5nIHNlbGVjdGVkUHJvdG9jb2woKTsKICB2b2lkIHJlaGFuZHNoYWtlKCk7CiAgdm9pZCByZW5lZ290aWF0ZShib29sIHVzZVNlc3Npb25DYWNoZSwgYm9vbCByZXF1ZXN0Q2xpZW50Q2VydGlmaWNhdGUsCiAgICAgIGJvb2wgcmVxdWlyZUNsaWVudENlcnRpZmljYXRlKTsKICB2b2lkIGluaXQoKTsKICBYNTA5Q2VydGlmaWNhdGUgZ2V0IHBlZXJDZXJ0aWZpY2F0ZTsKICBpbnQgcHJvY2Vzc0J1ZmZlcihpbnQgYnVmZmVySW5kZXgpOwogIHZvaWQgcmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrKEZ1bmN0aW9uIGNhbGxiYWNrKTsKICB2b2lkIHJlZ2lzdGVySGFuZHNoYWtlQ29tcGxldGVDYWxsYmFjayhGdW5jdGlvbiBoYW5kc2hha2VDb21wbGV0ZUhhbmRsZXIpOwoKICAvLyBUaGlzIGNhbGwgbWF5IGNhdXNlIGEgcmVmZXJlbmNlIGNvdW50ZWQgcG9pbnRlciBpbiB0aGUgbmF0aXZlCiAgLy8gaW1wbGVtZW50YXRpb24gdG8gYmUgcmV0YWluZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSByZXN1bHRpbmcKICAvLyB2YWx1ZSBpcyBwYXNzZWQgdG8gdGhlIElPIHNlcnZpY2UgdGhyb3VnaCBhIGNhbGwgdG8gZGlzcGF0Y2goKS4KICBpbnQgX3BvaW50ZXIoKTsKCiAgTGlzdDxfRXh0ZXJuYWxCdWZmZXI+IGdldCBidWZmZXJzOwp9CgovKiogQSBzZWN1cmUgbmV0d29ya2luZyBleGNlcHRpb24gY2F1c2VkIGJ5IGEgZmFpbHVyZSBpbiB0aGUKICogIFRMUy9TU0wgcHJvdG9jb2wuCiAqLwpjbGFzcyBUbHNFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgZmluYWwgU3RyaW5nIHR5cGU7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgZmluYWwgT1NFcnJvciBvc0Vycm9yOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgY29uc3QgVGxzRXhjZXB0aW9uKFtTdHJpbmcgbWVzc2FnZSA9ICIiLCBPU0Vycm9yIG9zRXJyb3JdKQogICAgICA6IHRoaXMuXygiVGxzRXhjZXB0aW9uIiwgbWVzc2FnZSwgb3NFcnJvcik7CgogIGNvbnN0IFRsc0V4Y2VwdGlvbi5fKHRoaXMudHlwZSwgdGhpcy5tZXNzYWdlLCB0aGlzLm9zRXJyb3IpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSh0eXBlKTsKICAgIGlmIChtZXNzYWdlLmlzTm90RW1wdHkpIHsKICAgICAgc2Iud3JpdGUoIjogJG1lc3NhZ2UiKTsKICAgICAgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICAgIHNiLndyaXRlKCIgKCRvc0Vycm9yKSIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG9zRXJyb3IgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiOiAkb3NFcnJvciIpOwogICAgfQogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQp9CgovKioKICogQW4gZXhjZXB0aW9uIHRoYXQgaGFwcGVucyBpbiB0aGUgaGFuZHNoYWtlIHBoYXNlIG9mIGVzdGFibGlzaGluZwogKiBhIHNlY3VyZSBuZXR3b3JrIGNvbm5lY3Rpb24uCiAqLwpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIEhhbmRzaGFrZUV4Y2VwdGlvbiBleHRlbmRzIFRsc0V4Y2VwdGlvbiB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IEhhbmRzaGFrZUV4Y2VwdGlvbihbU3RyaW5nIG1lc3NhZ2UgPSAiIiwgT1NFcnJvciBvc0Vycm9yXSkKICAgICAgOiBzdXBlci5fKCJIYW5kc2hha2VFeGNlcHRpb24iLCBtZXNzYWdlLCBvc0Vycm9yKTsKfQoKLyoqCiAqIEFuIGV4Y2VwdGlvbiB0aGF0IGhhcHBlbnMgaW4gdGhlIGhhbmRzaGFrZSBwaGFzZSBvZiBlc3RhYmxpc2hpbmcKICogYSBzZWN1cmUgbmV0d29yayBjb25uZWN0aW9uLCB3aGVuIGxvb2tpbmcgdXAgb3IgdmVyaWZ5aW5nIGEKICogY2VydGlmaWNhdGUuCiAqLwpjbGFzcyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBleHRlbmRzIFRsc0V4Y2VwdGlvbiB7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIGNvbnN0IENlcnRpZmljYXRlRXhjZXB0aW9uKFtTdHJpbmcgbWVzc2FnZSA9ICIiLCBP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IF9TZXJ2aWNlT2JqZWN0IHsKICBpbnQgX19zZXJ2aWNlSWQgPSAwOwogIGludCBnZXQgX3NlcnZpY2VJZCB7CiAgICBpZiAoX19zZXJ2aWNlSWQgPT0gMCkgX19zZXJ2aWNlSWQgPSBfbmV4dFNlcnZpY2VJZCsrOwogICAgcmV0dXJuIF9fc2VydmljZUlkOwogIH0KCiAgTWFwIF90b0pTT04oYm9vbCByZWYpOwoKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlUGF0aCA9PiAiJF9zZXJ2aWNlVHlwZVBhdGgvJF9zZXJ2aWNlSWQiOwoKICBTdHJpbmcgZ2V0IF9zZXJ2aWNlVHlwZVBhdGg7CgogIFN0cmluZyBnZXQgX3NlcnZpY2VUeXBlTmFtZTsKCiAgU3RyaW5nIF9zZXJ2aWNlVHlwZShib29sIHJlZikgewogICAgaWYgKHJlZikgcmV0dXJuICJAJF9zZXJ2aWNlVHlwZU5hbWUiOwogICAgcmV0dXJuIF9zZXJ2aWNlVHlwZU5hbWU7CiAgfQp9Ch8ATk48AREBGAE5IBcXOhgEARkBPgEfAR8BIiodBAIBG2RhcnQ6aW8vc2VydmljZV9vYmplY3QuZGFydCpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vc29ja2V0LmRhcnTAAH+ULy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCi8qKgogKiBbSW50ZXJuZXRBZGRyZXNzVHlwZV0gaXMgdGhlIHR5cGUgYW4gW0ludGVybmV0QWRkcmVzc10uIEN1cnJlbnRseSwKICogSVAgdmVyc2lvbiA0IChJUHY0KSBhbmQgSVAgdmVyc2lvbiA2IChJUHY2KSBhcmUgc3VwcG9ydGVkLgogKi8KY2xhc3MgSW50ZXJuZXRBZGRyZXNzVHlwZSB7CiAgc3RhdGljIGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUgSVB2NCA9IGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUuXygwKTsKICBzdGF0aWMgY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZSBJUHY2ID0gY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZS5fKDEpOwogIHN0YXRpYyBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlIGFueSA9IGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUuXygtMSk7CgogIEBEZXByZWNhdGVkKCJVc2UgSVB2NCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZSBJUF9WNCA9IElQdjQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBJUHY2IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJbnRlcm5ldEFkZHJlc3NUeXBlIElQX1Y2ID0gSVB2NjsKICBARGVwcmVjYXRlZCgiVXNlIGFueSBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSW50ZXJuZXRBZGRyZXNzVHlwZSBBTlkgPSBhbnk7CgogIGZpbmFsIGludCBfdmFsdWU7CgogIGNvbnN0IEludGVybmV0QWRkcmVzc1R5cGUuXyh0aGlzLl92YWx1ZSk7CgogIGZhY3RvcnkgSW50ZXJuZXRBZGRyZXNzVHlwZS5fZnJvbShpbnQgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAwKSByZXR1cm4gSVB2NDsKICAgIGlmICh2YWx1ZSA9PSAxKSByZXR1cm4gSVB2NjsKICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIHR5cGU6ICR2YWx1ZSIpOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0eXBlLCBlLmcuICJJUHY0IiBvciAiSVB2NiIuCiAgICovCiAgU3RyaW5nIGdldCBuYW1lIHsKICAgIHN3aXRjaCAoX3ZhbHVlKSB7CiAgICAgIGNhc2UgLTE6CiAgICAgICAgcmV0dXJuICJBTlkiOwogICAgICBjYXNlIDA6CiAgICAgICAgcmV0dXJuICJJUHY0IjsKICAgICAgY2FzZSAxOgogICAgICAgIHJldHVybiAiSVB2NiI7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgSW50ZXJuZXRBZGRyZXNzIik7CiAgICB9CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSW50ZXJuZXRBZGRyZXNzVHlwZTogJG5hbWUiOwp9CgovKioKICogQW4gaW50ZXJuZXQgYWRkcmVzcy4KICoKICogVGhpcyBvYmplY3QgaG9sZHMgYW4gaW50ZXJuZXQgYWRkcmVzcy4gSWYgdGhpcyBpbnRlcm5ldCBhZGRyZXNzCiAqIGlzIHRoZSByZXN1bHQgb2YgYSBETlMgbG9va3VwLCB0aGUgYWRkcmVzcyBhbHNvIGhvbGRzIHRoZSBob3N0bmFtZQogKiB1c2VkIHRvIG1ha2UgdGhlIGxvb2t1cC4KICogQW4gSW50ZXJuZXQgYWRkcmVzcyBjb21iaW5lZCB3aXRoIGEgcG9ydCBudW1iZXIgcmVwcmVzZW50cyBhbgogKiBlbmRwb2ludCB0byB3aGljaCBhIHNvY2tldCBjYW4gY29ubmVjdCBvciBhIGxpc3RlbmluZyBzb2NrZXQgY2FuCiAqIGJpbmQuCiAqLwphYnN0cmFjdCBjbGFzcyBJbnRlcm5ldEFkZHJlc3MgewogIC8qKgogICAqIElQIHZlcnNpb24gNCBsb29wYmFjayBhZGRyZXNzLiBVc2UgdGhpcyBhZGRyZXNzIHdoZW4gbGlzdGVuaW5nIG9uCiAgICogb3IgY29ubmVjdGluZyB0byB0aGUgbG9vcGJhY2sgYWRhcHRlciB1c2luZyBJUCB2ZXJzaW9uIDQgKElQdjQpLgogICAqLwogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IGxvb3BiYWNrSVB2NCA9PiBMT09QQkFDS19JUF9WNDsKICBARGVwcmVjYXRlZCgiVXNlIGxvb3BiYWNrSVB2NCBpbnN0ZWFkIikKICBleHRlcm5hbCBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBMT09QQkFDS19JUF9WNDsKCiAgLyoqCiAgICogSVAgdmVyc2lvbiA2IGxvb3BiYWNrIGFkZHJlc3MuIFVzZSB0aGlzIGFkZHJlc3Mgd2hlbiBsaXN0ZW5pbmcgb24KICAgKiBvciBjb25uZWN0aW5nIHRvIHRoZSBsb29wYmFjayBhZGFwdGVyIHVzaW5nIElQIHZlcnNpb24gNiAoSVB2NikuCiAgICovCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgbG9vcGJhY2tJUHY2ID0+IExPT1BCQUNLX0lQX1Y2OwogIEBEZXByZWNhdGVkKCJVc2UgbG9vcGJhY2tJUHY2IGluc3RlYWQiKQogIGV4dGVybmFsIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IExPT1BCQUNLX0lQX1Y2OwoKICAvKioKICAgKiBJUCB2ZXJzaW9uIDQgYW55IGFkZHJlc3MuIFVzZSB0aGlzIGFkZHJlc3Mgd2hlbiBsaXN0ZW5pbmcgb24KICAgKiBhbGwgYWRhcHRlcnMgSVAgYWRkcmVzc2VzIHVzaW5nIElQIHZlcnNpb24gNCAoSVB2NCkuCiAgICovCiAgc3RhdGljIEludGVybmV0QWRkcmVzcyBnZXQgYW55SVB2NCA9PiBBTllfSVBfVjQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBhbnlJUHY0IGluc3RlYWQiKQogIGV4dGVybmFsIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IEFOWV9JUF9WNDsKCiAgLyoqCiAgICogSVAgdmVyc2lvbiA2IGFueSBhZGRyZXNzLiBVc2UgdGhpcyBhZGRyZXNzIHdoZW4gbGlzdGVuaW5nIG9uCiAgICogYWxsIGFkYXB0ZXJzIElQIGFkZHJlc3NlcyB1c2luZyBJUCB2ZXJzaW9uIDYgKElQdjYpLgogICAqLwogIHN0YXRpYyBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFueUlQdjYgPT4gQU5ZX0lQX1Y2OwogIEBEZXByZWNhdGVkKCJVc2UgYW55SVB2NiBpbnN0ZWFkIikKICBleHRlcm5hbCBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIGdldCBBTllfSVBfVjY7CgogIC8qKgogICAqIFRoZSBbdHlwZV0gb2YgdGhlIFtJbnRlcm5ldEFkZHJlc3NdIHNwZWNpZmllZCB3aGF0IElQIHByb3RvY29sLgogICAqLwogIEludGVybmV0QWRkcmVzc1R5cGUgZ2V0IHR5cGU7CgogIC8qKgogICAqIFRoZSBudW1lcmljIGFkZHJlc3Mgb2YgdGhlIGhvc3QuIEZvciBJUHY0IGFkZHJlc3NlcyB0aGlzIGlzIHVzaW5nCiAgICogdGhlIGRvdHRlZC1kZWNpbWFsIG5vdGF0aW9uLiBGb3IgSVB2NiBpdCBpcyB1c2luZyB0aGUKICAgKiBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KICAgKi8KICBTdHJpbmcgZ2V0IGFkZHJlc3M7CgogIC8qKgogICAqIFRoZSBob3N0IHVzZWQgdG8gbG9va3VwIHRoZSBhZGRyZXNzLiBJZiB0aGVyZSBpcyBubyBob3N0CiAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzIHRoaXMgcmV0dXJucyB0aGUgbnVtZXJpYyBhZGRyZXNzLgogICAqLwogIFN0cmluZyBnZXQgaG9zdDsKCiAgLyoqCiAgICogR2V0IHRoZSByYXcgYWRkcmVzcyBvZiB0aGlzIFtJbnRlcm5ldEFkZHJlc3NdLiBUaGUgcmVzdWx0IGlzIGVpdGhlciBhCiAgICogNCBvciAxNiBieXRlIGxvbmcgbGlzdC4gVGhlIHJldHVybmVkIGxpc3QgaXMgYSBjb3B5LCBtYWtpbmcgaXQgcG9zc2libGUKICAgKiB0byBjaGFuZ2UgdGhlIGxpc3Qgd2l0aG91dCBtb2RpZnlpbmcgdGhlIFtJbnRlcm5ldEFkZHJlc3NdLgogICAqLwogIExpc3Q8aW50PiBnZXQgcmF3QWRkcmVzczsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBbSW50ZXJuZXRBZGRyZXNzXSBpcyBhIGxvb3BiYWNrIGFkZHJlc3MuCiAgICovCiAgYm9vbCBnZXQgaXNMb29wYmFjazsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBbSW50ZXJuZXRBZGRyZXNzXXMgc2NvcGUgaXMgYSBsaW5rLWxvY2FsLgogICAqLwogIGJvb2wgZ2V0IGlzTGlua0xvY2FsOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFtJbnRlcm5ldEFkZHJlc3NdcyBzY29wZSBpcyBtdWx0aWNhc3QuCiAgICovCiAgYm9vbCBnZXQgaXNNdWx0aWNhc3Q7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgW0ludGVybmV0QWRkcmVzc10gZnJvbSBhIG51bWVyaWMgYWRkcmVzcy4KICAgKgogICAqIElmIHRoZSBhZGRyZXNzIGluIFthZGRyZXNzXSBpcyBub3QgYSBudW1lcmljIElQdjQKICAgKiAoZG90dGVkLWRlY2ltYWwgbm90YXRpb24pIG9yIElQdjYgKGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uKS4KICAgKiBhZGRyZXNzIFtBcmd1bWVudEVycm9yXSBpcyB0aHJvd24uCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBJbnRlcm5ldEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpOwoKICAvKioKICAgKiBQZXJmb3JtIGEgcmV2ZXJzZSBkbnMgbG9va3VwIG9uIHRoZSBbYWRkcmVzc10sIGNyZWF0aW5nIGEgbmV3CiAgICogW0ludGVybmV0QWRkcmVzc10gd2hlcmUgdGhlIGhvc3QgZmllbGQgc2V0IHRvIHRoZSByZXN1bHQuCiAgICovCiAgRnV0dXJlPEludGVybmV0QWRkcmVzcz4gcmV2ZXJzZSgpOwoKICAvKioKICAgKiBMb29rdXAgYSBob3N0LCByZXR1cm5pbmcgYSBGdXR1cmUgb2YgYSBsaXN0IG9mCiAgICogW0ludGVybmV0QWRkcmVzc11zLiBJZiBbdHlwZV0gaXMgW0ludGVybmV0QWRkcmVzc1R5cGUuQU5ZXSwgaXQKICAgKiB3aWxsIGxvb2t1cCBib3RoIElQIHZlcnNpb24gNCAoSVB2NCkgYW5kIElQIHZlcnNpb24gNiAoSVB2NikKICAgKiBhZGRyZXNzZXMuIElmIFt0eXBlXSBpcyBlaXRoZXIgW0ludGVybmV0QWRkcmVzc1R5cGUuSVB2NF0gb3IKICAgKiBbSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY2XSBpdCB3aWxsIG9ubHkgbG9va3VwIGFkZHJlc3NlcyBvZiB0aGUKICAgKiBzcGVjaWZpZWQgdHlwZS4gVGhlIG9yZGVyIG9mIHRoZSBsaXN0IGNhbiwgYW5kIG1vc3QgbGlrZWx5IHdpbGwsCiAgICogY2hhbmdlIG92ZXIgdGltZS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPExpc3Q8SW50ZXJuZXRBZGRyZXNzPj4gbG9va3VwKFN0cmluZyBob3N0LAogICAgICB7SW50ZXJuZXRBZGRyZXNzVHlwZSB0eXBlOiBJbnRlcm5ldEFkZHJlc3NUeXBlLmFueX0pOwoKICAvKioKICAgKiBDbG9uZXMgdGhlIGdpdmVuIFthZGRyZXNzXSB3aXRoIHRoZSBuZXcgW2hvc3RdLgogICAqCiAgICogVGhlIFthZGRyZXNzXSBtdXN0IGJlIGFuIFtJbnRlcm5ldEFkZHJlc3NdIHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBvbmUKICAgKiBvZiB0aGUgc3RhdGljIG1ldGhvZHMgb2YgdGhpcyBjbGFzcy4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzIF9jbG9uZVdpdGhOZXdIb3N0KAogICAgICBJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgU3RyaW5nIGhvc3QpOwp9CgovKioKICogQSBbTmV0d29ya0ludGVyZmFjZV0gcmVwcmVzZW50cyBhbiBhY3RpdmUgbmV0d29yayBpbnRlcmZhY2Ugb24gdGhlIGN1cnJlbnQKICogc3lzdGVtLiBJdCBjb250YWlucyBhIGxpc3Qgb2YgW0ludGVybmV0QWRkcmVzc11lcyB0aGF0IGFyZSBib3VuZCB0byB0aGUKICogaW50ZXJmYWNlLgogKi8KYWJzdHJhY3QgY2xhc3MgTmV0d29ya0ludGVyZmFjZSB7CiAgLyoqCiAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBbTmV0d29ya0ludGVyZmFjZV0uCiAgICovCiAgU3RyaW5nIGdldCBuYW1lOwoKICAvKioKICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBbTmV0d29ya0ludGVyZmFjZV0uCiAgICovCiAgaW50IGdldCBpbmRleDsKCiAgLyoqCiAgICogR2V0IGEgbGlzdCBvZiBbSW50ZXJuZXRBZGRyZXNzXWVzIGN1cnJlbnRseSBib3VuZCB0byB0aGlzCiAgICogW05ldHdvcmtJbnRlcmZhY2VdLgogICAqLwogIExpc3Q8SW50ZXJuZXRBZGRyZXNzPiBnZXQgYWRkcmVzc2VzOwoKICAvKioKICAgKiBXaGV0aGVyIFtsaXN0XSBpcyBzdXBwb3J0ZWQuCiAgICoKICAgKiBbbGlzdF0gaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIG9uIEFuZHJvaWQuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGJvb2wgZ2V0IGxpc3RTdXBwb3J0ZWQ7CgogIC8qKgogICAqIFF1ZXJ5IHRoZSBzeXN0ZW0gZm9yIFtOZXR3b3JrSW50ZXJmYWNlXXMuCiAgICoKICAgKiBJZiBbaW5jbHVkZUxvb3BiYWNrXSBpcyBgdHJ1ZWAsIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgaW5jbHVkZSB0aGUKICAgKiBsb29wYmFjayBkZXZpY2UuIERlZmF1bHQgaXMgYGZhbHNlYC4KICAgKgogICAqIElmIFtpbmNsdWRlTGlua0xvY2FsXSBpcyBgdHJ1ZWAsIHRoZSBsaXN0IG9mIGFkZHJlc3NlcyBvZiB0aGUgcmV0dXJuZWQKICAgKiBbTmV0d29ya0ludGVyZmFjZV1zLCBtYXkgaW5jbHVkZSBsaW5rIGxvY2FsIGFkZHJlc3Nlcy4gRGVmYXVsdCBpcyBgZmFsc2VgLgogICAqCiAgICogSWYgW3R5cGVdIGlzIGVpdGhlciBbSW50ZXJuZXRBZGRyZXNzVHlwZS5JUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3NUeXBlLklQdjZdIGl0IHdpbGwgb25seSBsb29rdXAgYWRkcmVzc2VzIG9mIHRoZQogICAqIHNwZWNpZmllZCB0eXBlLiBEZWZhdWx0IGlzIFtJbnRlcm5ldEFkZHJlc3NUeXBlLmFueV0uCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxMaXN0PE5ldHdvcmtJbnRlcmZhY2U+PiBsaXN0KAogICAgICB7Ym9vbCBpbmNsdWRlTG9vcGJhY2s6IGZhbHNlLAogICAgICBib29sIGluY2x1ZGVMaW5rTG9jYWw6IGZhbHNlLAogICAgICBJbnRlcm5ldEFkZHJlc3NUeXBlIHR5cGU6IEludGVybmV0QWRkcmVzc1R5cGUuYW55fSk7Cn0KCi8qKgogKiBBIFtSYXdTZXJ2ZXJTb2NrZXRdIHJlcHJlc2VudHMgYSBsaXN0ZW5pbmcgc29ja2V0LCBhbmQgcHJvdmlkZXMgYQogKiBzdHJlYW0gb2YgbG93LWxldmVsIFtSYXdTb2NrZXRdIG9iamVjdHMsIG9uZSBmb3IgZWFjaCBjb25uZWN0aW9uCiAqIG1hZGUgdG8gdGhlIGxpc3RlbmluZyBzb2NrZXQuCiAqCiAqIFNlZSBbUmF3U29ja2V0XSBmb3IgbW9yZSBpbmZvLgogKi8KYWJzdHJhY3QgY2xhc3MgUmF3U2VydmVyU29ja2V0IGltcGxlbWVudHMgU3RyZWFtPFJhd1NvY2tldD4gewogIC8qKgogICAqIFJldHVybnMgYSBmdXR1cmUgZm9yIGEgWzpSYXdTZXJ2ZXJTb2NrZXQ6XS4gV2hlbiB0aGUgZnV0dXJlCiAgICogY29tcGxldGVzIHRoZSBzZXJ2ZXIgc29ja2V0IGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBbYWRkcmVzc10gYW5kCiAgICogW3BvcnRdIGFuZCBoYXMgc3RhcnRlZCBsaXN0ZW5pbmcgb24gaXQuCiAgICoKICAgKiBUaGUgW2FkZHJlc3NdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbgogICAqIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbYWRkcmVzc10gaXMgYSBbU3RyaW5nXSwgW2JpbmRdIHdpbGwKICAgKiBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB1c2UgdGhlIGZpcnN0IHZhbHVlIGluIHRoZQogICAqIGxpc3QuIFRvIGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sgYWRhcHRlciwgd2hpY2ggd2lsbCBhbGxvdyBvbmx5CiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgbG9jYWwgaG9zdCwgdXNlIHRoZSB2YWx1ZQogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2XS4gVG8gYWxsb3cgZm9yIGluY29taW5nCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBuZXR3b3JrIHVzZSBlaXRoZXIgb25lIG9mIHRoZSB2YWx1ZXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjRdIG9yIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2Nl0gdG8KICAgKiBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzIG9yIHRoZSBJUCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgaW50ZXJmYWNlLgogICAqCiAgICogSWYgYW4gSVAgdmVyc2lvbiA2IChJUHY2KSBhZGRyZXNzIGlzIHVzZWQsIGJvdGggSVAgdmVyc2lvbiA2CiAgICogKElQdjYpIGFuZCB2ZXJzaW9uIDQgKElQdjQpIGNvbm5lY3Rpb25zIHdpbGwgYmUgYWNjZXB0ZWQuIFRvCiAgICogcmVzdHJpY3QgdGhpcyB0byB2ZXJzaW9uIDYgKElQdjYpIG9ubHksIHVzZSBbdjZPbmx5XSB0byBzZXQKICAgKiB2ZXJzaW9uIDYgb25seS4KICAgKgogICAqIElmIFtwb3J0XSBoYXMgdGhlIHZhbHVlIFs6MDpdIGFuIGVwaGVtZXJhbCBwb3J0IHdpbGwKICAgKiBiZSBjaG9zZW4gYnkgdGhlIHN5c3RlbS4gVGhlIGFjdHVhbCBwb3J0IHVzZWQgY2FuIGJlIHJldHJpZXZlZAogICAqIHVzaW5nIHRoZSBbOnBvcnQ6XSBnZXR0ZXIuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW2JhY2tsb2ddIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpc3RlbgogICAqIGJhY2tsb2cgZm9yIHRoZSB1bmRlcmx5aW5nIE9TIGxpc3RlbiBzZXR1cC4gSWYgW2JhY2tsb2ddIGhhcyB0aGUKICAgKiB2YWx1ZSBvZiBbOjA6XSAodGhlIGRlZmF1bHQpIGEgcmVhc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW3NoYXJlZF0gc3BlY2lmaWVzIHdoZXRoZXIgYWRkaXRpb25hbCBSYXdTZXJ2ZXJTb2NrZXQKICAgKiBvYmplY3RzIGNhbiBiaW5kIHRvIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGBhZGRyZXNzYCwgYHBvcnRgIGFuZCBgdjZPbmx5YC4KICAgKiBJZiBgc2hhcmVkYCBpcyBgdHJ1ZWAgYW5kIG1vcmUgYFJhd1NlcnZlclNvY2tldGBzIGZyb20gdGhpcyBpc29sYXRlIG9yCiAgICogb3RoZXIgaXNvbGF0ZXMgYXJlIGJvdW5kIHRvIHRoZSBwb3J0LCB0aGVuIHRoZSBpbmNvbWluZyBjb25uZWN0aW9ucyB3aWxsIGJlCiAgICogZGlzdHJpYnV0ZWQgYW1vbmcgYWxsIHRoZSBib3VuZCBgUmF3U2VydmVyU29ja2V0YHMuIENvbm5lY3Rpb25zIGNhbiBiZQogICAqIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgaXNvbGF0ZXMgdGhpcyB3YXkuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxSYXdTZXJ2ZXJTb2NrZXQ+IGJpbmQoYWRkcmVzcywgaW50IHBvcnQsCiAgICAgIHtpbnQgYmFja2xvZzogMCwgYm9vbCB2Nk9ubHk6IGZhbHNlLCBib29sIHNoYXJlZDogZmFsc2V9KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWRkcmVzcyB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzczsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBzb2NrZXQuIFRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdoZW4gdGhlIHNvY2tldAogICAqIGlzIGZ1bGx5IGNsb3NlZCBhbmQgaXMgbm8gbG9uZ2VyIGJvdW5kLgogICAqLwogIEZ1dHVyZTxSYXdTZXJ2ZXJTb2NrZXQ+IGNsb3NlKCk7Cn0KCi8qKgogKiBBIFtTZXJ2ZXJTb2NrZXRdIHJlcHJlc2VudHMgYSBsaXN0ZW5pbmcgc29ja2V0LCBhbmQgcHJvdmlkZXMgYQogKiBzdHJlYW0gb2YgW1NvY2tldF0gb2JqZWN0cywgb25lIGZvciBlYWNoIGNvbm5lY3Rpb24gbWFkZSB0byB0aGUKICogbGlzdGVuaW5nIHNvY2tldC4KICoKICogU2VlIFtTb2NrZXRdIGZvciBtb3JlIGluZm8uCiAqLwphYnN0cmFjdCBjbGFzcyBTZXJ2ZXJTb2NrZXQgaW1wbGVtZW50cyBTdHJlYW08U29ja2V0PiB7CiAgLyoqCiAgICogUmV0dXJucyBhIGZ1dHVyZSBmb3IgYSBbOlNlcnZlclNvY2tldDpdLiBXaGVuIHRoZSBmdXR1cmUKICAgKiBjb21wbGV0ZXMgdGhlIHNlcnZlciBzb2NrZXQgaXMgYm91bmQgdG8gdGhlIGdpdmVuIFthZGRyZXNzXSBhbmQKICAgKiBbcG9ydF0gYW5kIGhhcyBzdGFydGVkIGxpc3RlbmluZyBvbiBpdC4KICAgKgogICAqIFRoZSBbYWRkcmVzc10gY2FuIGVpdGhlciBiZSBhIFtTdHJpbmddIG9yIGFuCiAgICogW0ludGVybmV0QWRkcmVzc10uIElmIFthZGRyZXNzXSBpcyBhIFtTdHJpbmddLCBbYmluZF0gd2lsbAogICAqIHBlcmZvcm0gYSBbSW50ZXJuZXRBZGRyZXNzLmxvb2t1cF0gYW5kIHVzZSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlCiAgICogbGlzdC4gVG8gbGlzdGVuIG9uIHRoZSBsb29wYmFjayBhZGFwdGVyLCB3aGljaCB3aWxsIGFsbG93IG9ubHkKICAgKiBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIHRoZSBsb2NhbCBob3N0LCB1c2UgdGhlIHZhbHVlCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjRdIG9yCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjZdLiBUbyBhbGxvdyBmb3IgaW5jb21pbmcKICAgKiBjb25uZWN0aW9uIGZyb20gdGhlIG5ldHdvcmsgdXNlIGVpdGhlciBvbmUgb2YgdGhlIHZhbHVlcwogICAqIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2NF0gb3IgW0ludGVybmV0QWRkcmVzcy5hbnlJUHY2XSB0bwogICAqIGJpbmQgdG8gYWxsIGludGVyZmFjZXMgb3IgdGhlIElQIGFkZHJlc3Mgb2YgYSBzcGVjaWZpYyBpbnRlcmZhY2UuCiAgICoKICAgKiBJZiBhbiBJUCB2ZXJzaW9uIDYgKElQdjYpIGFkZHJlc3MgaXMgdXNlZCwgYm90aCBJUCB2ZXJzaW9uIDYKICAgKiAoSVB2NikgYW5kIHZlcnNpb24gNCAoSVB2NCkgY29ubmVjdGlvbnMgd2lsbCBiZSBhY2NlcHRlZC4gVG8KICAgKiByZXN0cmljdCB0aGlzIHRvIHZlcnNpb24gNiAoSVB2Nikgb25seSwgdXNlIFt2Nk9ubHldIHRvIHNldAogICAqIHZlcnNpb24gNiBvbmx5LgogICAqCiAgICogSWYgW3BvcnRdIGhhcyB0aGUgdmFsdWUgWzowOl0gYW4gZXBoZW1lcmFsIHBvcnQgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLiBUaGUgYWN0dWFsIHBvcnQgdXNlZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZQogICAqIFtwb3J0XSBnZXR0ZXIuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW2JhY2tsb2ddIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpc3RlbgogICAqIGJhY2tsb2cgZm9yIHRoZSB1bmRlcmx5aW5nIE9TIGxpc3RlbiBzZXR1cC4gSWYgW2JhY2tsb2ddIGhhcyB0aGUKICAgKiB2YWx1ZSBvZiBbOjA6XSAodGhlIGRlZmF1bHQpIGEgcmVhc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW3NoYXJlZF0gc3BlY2lmaWVzIHdoZXRoZXIgYWRkaXRpb25hbCBTZXJ2ZXJTb2NrZXQKICAgKiBvYmplY3RzIGNhbiBiaW5kIHRvIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGBhZGRyZXNzYCwgYHBvcnRgIGFuZCBgdjZPbmx5YC4KICAgKiBJZiBgc2hhcmVkYCBpcyBgdHJ1ZWAgYW5kIG1vcmUgYFNlcnZlclNvY2tldGBzIGZyb20gdGhpcyBpc29sYXRlIG9yIG90aGVyCiAgICogaXNvbGF0ZXMgYXJlIGJvdW5kIHRvIHRoZSBwb3J0LCB0aGVuIHRoZSBpbmNvbWluZyBjb25uZWN0aW9ucyB3aWxsIGJlCiAgICogZGlzdHJpYnV0ZWQgYW1vbmcgYWxsIHRoZSBib3VuZCBgU2VydmVyU29ja2V0YHMuIENvbm5lY3Rpb25zIGNhbiBiZQogICAqIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgaXNvbGF0ZXMgdGhpcyB3YXkuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIEZ1dHVyZTxTZXJ2ZXJTb2NrZXQ+IGJpbmQoYWRkcmVzcywgaW50IHBvcnQsCiAgICAgIHtpbnQgYmFja2xvZzogMCwgYm9vbCB2Nk9ubHk6IGZhbHNlLCBib29sIHNoYXJlZDogZmFsc2V9KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYWRkcmVzcyB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzczsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBzb2NrZXQuIFRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdoZW4gdGhlIHNvY2tldAogICAqIGlzIGZ1bGx5IGNsb3NlZCBhbmQgaXMgbm8gbG9uZ2VyIGJvdW5kLgogICAqLwogIEZ1dHVyZTxTZXJ2ZXJTb2NrZXQ+IGNsb3NlKCk7Cn0KCi8qKgogKiBUaGUgW1NvY2tldERpcmVjdGlvbl0gaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byBbU29ja2V0LmNsb3NlXSBhbmQKICogW1Jhd1NvY2tldC5jbG9zZV0gdG8gY2xvc2UgYSBzb2NrZXQgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24ocykuCiAqLwpjbGFzcyBTb2NrZXREaXJlY3Rpb24gewogIHN0YXRpYyBjb25zdCBTb2NrZXREaXJlY3Rpb24gcmVjZWl2ZSA9IGNvbnN0IFNvY2tldERpcmVjdGlvbi5fKDApOwogIHN0YXRpYyBjb25zdCBTb2NrZXREaXJlY3Rpb24gc2VuZCA9IGNvbnN0IFNvY2tldERpcmVjdGlvbi5fKDEpOwogIHN0YXRpYyBjb25zdCBTb2NrZXREaXJlY3Rpb24gYm90aCA9IGNvbnN0IFNvY2tldERpcmVjdGlvbi5fKDIpOwoKICBARGVwcmVjYXRlZCgiVXNlIHJlY2VpdmUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNvY2tldERpcmVjdGlvbiBSRUNFSVZFID0gcmVjZWl2ZTsKICBARGVwcmVjYXRlZCgiVXNlIHNlbmQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNvY2tldERpcmVjdGlvbiBTRU5EID0gc2VuZDsKICBARGVwcmVjYXRlZCgiVXNlIGJvdGggaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFNvY2tldERpcmVjdGlvbiBCT1RIID0gYm90aDsKCiAgZmluYWwgX3ZhbHVlOwoKICBjb25zdCBTb2NrZXREaXJlY3Rpb24uXyh0aGlzLl92YWx1ZSk7Cn0KCi8qKgogKiBUaGUgW1NvY2tldE9wdGlvbl0gaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byBbU29ja2V0LnNldE9wdGlvbl0gYW5kCiAqIFtSYXdTb2NrZXQuc2V0T3B0aW9uXSB0byBzZXQgY3VzdG9taXplIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHVuZGVybHlpbmcKICogc29ja2V0LgogKi8KY2xhc3MgU29ja2V0T3B0aW9uIHsKICAvKioKICAgKiBFbmFibGUgb3IgZGlzYWJsZSBuby1kZWxheSBvbiB0aGUgc29ja2V0LiBJZiB0Y3BOb0RlbGF5IGlzIGVuYWJsZWQsIHRoZQogICAqIHNvY2tldCB3aWxsIG5vdCBidWZmZXIgZGF0YSBpbnRlcm5hbGx5LCBidXQgaW5zdGVhZCB3cml0ZSBlYWNoIGRhdGEgY2h1bmsKICAgKiBhcyBhbiBpbmRpdmlkdWFsIFRDUCBwYWNrZXQuCiAgICoKICAgKiB0Y3BOb0RlbGF5IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCiAgICovCiAgc3RhdGljIGNvbnN0IFNvY2tldE9wdGlvbiB0Y3BOb0RlbGF5ID0gY29uc3QgU29ja2V0T3B0aW9uLl8oMCk7CiAgQERlcHJlY2F0ZWQoIlVzZSB0Y3BOb0RlbGF5IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTb2NrZXRPcHRpb24gVENQX05PREVMQVkgPSB0Y3BOb0RlbGF5OwoKICBzdGF0aWMgY29uc3QgU29ja2V0T3B0aW9uIF9pcE11bHRpY2FzdExvb3AgPSBjb25zdCBTb2NrZXRPcHRpb24uXygxKTsKICBzdGF0aWMgY29uc3QgU29ja2V0T3B0aW9uIF9pcE11bHRpY2FzdEhvcHMgPSBjb25zdCBTb2NrZXRPcHRpb24uXygyKTsKICBzdGF0aWMgY29uc3QgU29ja2V0T3B0aW9uIF9pcE11bHRpY2FzdElmID0gY29uc3QgU29ja2V0T3B0aW9uLl8oMyk7CiAgc3RhdGljIGNvbnN0IFNvY2tldE9wdGlvbiBfaXBCcm9hZGNhc3QgPSBjb25zdCBTb2NrZXRPcHRpb24uXyg0KTsKCiAgZmluYWwgX3ZhbHVlOwoKICBjb25zdCBTb2NrZXRPcHRpb24uXyh0aGlzLl92YWx1ZSk7Cn0KCi8vIE11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggZW51bSBpbiBzb2NrZXQuY2MKZW51bSBfUmF3U29ja2V0T3B0aW9ucyB7CiAgU09MX1NPQ0tFVCwgLy8gMAogIElQUFJPVE9fSVAsIC8vIDEKICBJUF9NVUxUSUNBU1RfSUYsIC8vIDIKICBJUFBST1RPX0lQVjYsIC8vIDMKICBJUFY2X01VTFRJQ0FTVF9JRiwgLy8gNAogIElQUFJPVE9fVENQLCAvLyA1CiAgSVBQUk9UT19VRFAsIC8vIDYKfQoKLy8vIFRoZSBbUmF3U29ja2V0T3B0aW9uXSBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIFtTb2NrZXQuc2V0UmF3T3B0aW9uXSBhbmQKLy8vIFtSYXdTb2NrZXQuc2V0UmF3T3B0aW9uXSB0byBzZXQgY3VzdG9taXplIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHVuZGVybHlpbmcKLy8vIHNvY2tldC4KLy8vCi8vLyBJdCBhbGxvd3MgZm9yIGZpbmUgZ3JhaW5lZCBjb250cm9sIG9mIHRoZSBzb2NrZXQgb3B0aW9ucywgYW5kIGl0cyB2YWx1ZXMgd2lsbAovLy8gYmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtJ3MgaW1wbGVtZW50YXRpb24gb2Ygc2V0c29ja29wdCBhbmQKLy8vIGdldHNvY2tvcHQuCmNsYXNzIFJhd1NvY2tldE9wdGlvbiB7CiAgLy8vIENyZWF0ZXMgYSBSYXdTb2NrZXRPcHRpb24gZm9yIGdldFJhd09wdGlvbiBhbmRTZXRSYXdPcHRpb24uCiAgLy8vCiAgLy8vIEFsbCBhcmd1bWVudHMgYXJlIHJlcXVpcmVkIGFuZCBtdXN0IG5vdCBiZSBudWxsLgogIC8vLwogIC8vLyBUaGUgbGV2ZWwgYW5kIG9wdGlvbiBhcmd1bWVudHMgY29ycmVzcG9uZCB0byBsZXZlbCBhbmQgb3B0bmFtZSBhcmd1bWVudHMKICAvLy8gb24gdGhlIGdldC9zZXRzb2Nrb3B0IG5hdGl2ZSBjYWxscy4KICAvLy8KICAvLy8gVGhlIHZhbHVlIGFyZ3VtZW50IGFuZCBpdHMgbGVuZ3RoIGNvcnJlc3BvbmQgdG8gdGhlIG9wdHZhbCBhbmQgbGVuZ3RoCiAgLy8vIGFyZ3VtZW50cyBvbiB0aGUgbmF0aXZlIGNhbGwuCiAgLy8vCiAgLy8vIEZvciBhIFtnZXRSYXdPcHRpb25dIGNhbGwsIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGEKICAvLy8gc3VjY2Vzc2Z1bCBjYWxsIChhbHRob3VnaCBpdHMgbGVuZ3RoIHdpbGwgbm90IGJlIGNoYW5nZWQpLgogIC8vLwogIC8vLyBGb3IgYSBbc2V0UmF3T3B0aW9uXSBjYWxsLCB0aGUgdmFsdWUgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBzZXQgdGhlCiAgLy8vIG9wdGlvbi4KICBjb25zdCBSYXdTb2NrZXRPcHRpb24odGhpcy5sZXZlbCwgdGhpcy5vcHRpb24sIHRoaXMudmFsdWUpOwoKICAvLy8gQ29udmVuaWVuY2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGFuIGludCBiYXNlZCBSYXdTb2NrZXRPcHRpb24uCiAgZmFjdG9yeSBSYXdTb2NrZXRPcHRpb24uZnJvbUludChpbnQgbGV2ZWwsIGludCBvcHRpb24sIGludCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgdmFsdWUgPSAwOwogICAgfQogICAgZmluYWwgVWludDhMaXN0IGxpc3QgPSBVaW50OExpc3QoNCk7CiAgICBmaW5hbCBidWZmZXIgPSBCeXRlRGF0YS52aWV3KGxpc3QuYnVmZmVyKTsKICAgIGJ1ZmZlci5zZXRJbnQzMigwLCB2YWx1ZSk7CiAgICByZXR1cm4gUmF3U29ja2V0T3B0aW9uKGxldmVsLCBvcHRpb24sIGxpc3QpOwogIH0KCiAgLy8vIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBhIGJvb2wgYmFzZWQgUmF3U29ja2V0T3B0aW9uLgogIGZhY3RvcnkgUmF3U29ja2V0T3B0aW9uLmZyb21Cb29sKGludCBsZXZlbCwgaW50IG9wdGlvbiwgYm9vbCB2YWx1ZSkgPT4KICAgICAgUmF3U29ja2V0T3B0aW9uLmZyb21JbnQobGV2ZWwsIG9wdGlvbiwgdmFsdWUgPT0gdHJ1ZSA/IDEgOiAwKTsKCiAgLy8vIFRoZSBsZXZlbCBmb3IgdGhlIG9wdGlvbiB0byBzZXQgb3IgZ2V0LgogIC8vLwogIC8vLyBTZWUgYWxzbzoKICAvLy8gICAqIFtSYXdTb2NrZXRPcHRpb24ubGV2ZWxTb2NrZXRdCiAgLy8vICAgKiBbUmF3U29ja2V0T3B0aW9uLmxldmVsSVB2NF0KICAvLy8gICAqIFtSYXdTb2NrZXRPcHRpb24ubGV2ZWxJUHY2XQogIC8vLyAgICogW1Jhd1NvY2tldE9wdGlvbi5sZXZlbFRjcF0KICAvLy8gICAqIFtSYXdTb2NrZXRPcHRpb24ubGV2ZWxVZHBdCiAgZmluYWwgaW50IGxldmVsOwoKICAvLy8gVGhlIG9wdGlvbiB0byBzZXQgb3IgZ2V0LgogIGZpbmFsIGludCBvcHRpb247CgogIC8vLyBUaGUgcmF3IGRhdGEgdG8gc2V0LCBvciB0aGUgYXJyYXkgdG8gd3JpdGUgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlIGludG8uCiAgLy8vCiAgLy8vIFRoaXMgbGlzdCBtdXN0IGJlIHRoZSBjb3JyZWN0IGxlbmd0aCBmb3IgdGhlIGV4cGVjdGVkIG9wdGlvbi4gRm9yIG1vc3QKICAvLy8gb3B0aW9ucyB0aGF0IHRha2UgaW50IG9yIGJvb2wgdmFsdWVzLCB0aGUgbGVuZ3RoIHNob3VsZCBiZSA0LiBGb3Igb3B0aW9ucwogIC8vLyB0aGF0IGV4cGVjdCBhIHN0cnVjdCAoc3VjaCBhcyBhbiBpbl9hZGRyX3QpLCB0aGUgbGVuZ3RoIHNob3VsZCBiZSB0aGUKICAvLy8gY29ycmVjdCBsZW5ndGggZm9yIHRoYXQgc3RydWN0LgogIGZpbmFsIFVpbnQ4TGlzdCB2YWx1ZTsKCiAgLy8vIFNvY2tldCBsZXZlbCBvcHRpb24gZm9yIFNPTF9TT0NLRVQuCiAgc3RhdGljIGludCBnZXQgbGV2ZWxTb2NrZXQgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLlNPTF9TT0NLRVQuaW5kZXgpOwoKICAvLy8gU29ja2V0IGxldmVsIG9wdGlvbiBmb3IgSVBQUk9UT19JUC4KICBzdGF0aWMgaW50IGdldCBsZXZlbElQdjQgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fSVAuaW5kZXgpOwoKICAvLy8gU29ja2V0IG9wdGlvbiBmb3IgSVBfTVVMVElDQVNUX0lGLgogIHN0YXRpYyBpbnQgZ2V0IElQdjRNdWx0aWNhc3RJbnRlcmZhY2UgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQX01VTFRJQ0FTVF9JRi5pbmRleCk7CgogIC8vLyBTb2NrZXQgbGV2ZWwgb3B0aW9uIGZvciBJUFBST1RPX0lQVjYuCiAgc3RhdGljIGludCBnZXQgbGV2ZWxJUHY2ID0+CiAgICAgIF9nZXRPcHRpb25WYWx1ZShfUmF3U29ja2V0T3B0aW9ucy5JUFBST1RPX0lQVjYuaW5kZXgpOwoKICAvLy8gU29ja2V0IG9wdGlvbiBmb3IgSVBWNl9NVUxUSUNBU1RfSUYuCiAgc3RhdGljIGludCBnZXQgSVB2Nk11bHRpY2FzdEludGVyZmFjZSA9PgogICAgICBfZ2V0T3B0aW9uVmFsdWUoX1Jhd1NvY2tldE9wdGlvbnMuSVBWNl9NVUxUSUNBU1RfSUYuaW5kZXgpOwoKICAvLy8gU29ja2V0IGxldmVsIG9wdGlvbiBmb3IgSVBQUk9UT19UQ1AuCiAgc3RhdGljIGludCBnZXQgbGV2ZWxUY3AgPT4KICAgICAgX2dldE9wdGlvblZhbHVlKF9SYXdTb2NrZXRPcHRpb25zLklQUFJPVE9fVENQLmluZGV4KTsKCiAgLy8vIFNvY2tldCBsZXZlbCBvcHRpb24gZm9yIElQUFJPVE9fVURQLgogIHN0YXRpYyBpbnQgZ2V0IGxldmVsVWRwID0+CiAgICAgIF9nZXRPcHRpb25WYWx1ZShfUmF3U29ja2V0T3B0aW9ucy5JUFBST1RPX1VEUC5pbmRleCk7CgogIGV4dGVybmFsIHN0YXRpYyBpbnQgX2dldE9wdGlvblZhbHVlKGludCBrZXkpOwp9CgovKioKICogRXZlbnRzIGZvciB0aGUgW1Jhd1NvY2tldF0uCiAqLwpjbGFzcyBSYXdTb2NrZXRFdmVudCB7CiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IHJlYWQgPSBjb25zdCBSYXdTb2NrZXRFdmVudC5fKDApOwogIHN0YXRpYyBjb25zdCBSYXdTb2NrZXRFdmVudCB3cml0ZSA9IGNvbnN0IFJhd1NvY2tldEV2ZW50Ll8oMSk7CiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IHJlYWRDbG9zZWQgPSBjb25zdCBSYXdTb2NrZXRFdmVudC5fKDIpOwogIHN0YXRpYyBjb25zdCBSYXdTb2NrZXRFdmVudCBjbG9zZWQgPSBjb25zdCBSYXdTb2NrZXRFdmVudC5fKDMpOwoKICBARGVwcmVjYXRlZCgiVXNlIHJlYWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IFJFQUQgPSByZWFkOwogIEBEZXByZWNhdGVkKCJVc2Ugd3JpdGUgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IFdSSVRFID0gd3JpdGU7CiAgQERlcHJlY2F0ZWQoIlVzZSByZWFkQ2xvc2VkIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSYXdTb2NrZXRFdmVudCBSRUFEX0NMT1NFRCA9IHJlYWRDbG9zZWQ7CiAgQERlcHJlY2F0ZWQoIlVzZSBjbG9zZWQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJhd1NvY2tldEV2ZW50IENMT1NFRCA9IGNsb3NlZDsKCiAgZmluYWwgaW50IF92YWx1ZTsKCiAgY29uc3QgUmF3U29ja2V0RXZlbnQuXyh0aGlzLl92YWx1ZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIGNvbnN0IFsKICAgICAgJ1Jhd1NvY2tldEV2ZW50LnJlYWQnLAogICAgICAnUmF3U29ja2V0RXZlbnQud3JpdGUnLAogICAgICAnUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZCcsCiAgICAgICdSYXdTb2NrZXRFdmVudC5jbG9zZWQnCiAgICBdW192YWx1ZV07CiAgfQp9CgovLy8gUmV0dXJuZWQgYnkgdGhlIGBzdGFydENvbm5lY3RgIG1ldGhvZHMgb24gY2xpZW50LXNpZGUgc29ja2V0IHR5cGVzIGBTYCwKLy8vIGBDb25uZWN0aW9uVGFzazxTPmAgYWxsb3dzIGNhbmNlbGxpbmcgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGEgaG9zdC4KY2xhc3MgQ29ubmVjdGlvblRhc2s8Uz4gewogIC8vLyBBIGBGdXR1cmVgIHRoYXQgY29tcGxldGVzIHdpdGggdmFsdWUgdGhhdCBgUy5jb25uZWN0KClgIHdvdWxkIHJldHVybgogIC8vLyB1bmxlc3MgW2NhbmNlbF0gaXMgY2FsbGVkIG9uIHRoaXMgW0Nvbm5lY3Rpb25UYXNrXS4KICAvLy8KICAvLy8gSWYgW2NhbmNlbF0gaXMgY2FsbGVkLCB0aGUgYEZ1dHVyZWAgY29tcGxldGVzIHdpdGggYSBbU29ja2V0RXhjZXB0aW9uXQogIC8vLyBlcnJvciB3aG9zZSBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGxlZC4KICBmaW5hbCBGdXR1cmU8Uz4gc29ja2V0OwogIGZpbmFsIHZvaWQgRnVuY3Rpb24oKSBfb25DYW5jZWw7CgogIENvbm5lY3Rpb25UYXNrLl8oe0Z1dHVyZTxTPiBzb2NrZXQsIHZvaWQgRnVuY3Rpb24oKSBvbkNhbmNlbH0pCiAgICAgIDogYXNzZXJ0KHNvY2tldCAhPSBudWxsKSwKICAgICAgICBhc3NlcnQob25DYW5jZWwgIT0gbnVsbCksCiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQsCiAgICAgICAgdGhpcy5fb25DYW5jZWwgPSBvbkNhbmNlbDsKCiAgLy8vIENhbmNlbHMgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdC4KICAvLy8KICAvLy8gVGhpcyBhbHNvIGNhdXNlcyB0aGUgW3NvY2tldF0gYEZ1dHVyZWAgdG8gY29tcGxldGUgd2l0aCBhCiAgLy8vIFtTb2NrZXRFeGNlcHRpb25dIGVycm9yLgogIHZvaWQgY2FuY2VsKCkgewogICAgX29uQ2FuY2VsKCk7CiAgfQp9CgovKioKICogVGhlIFtSYXdTb2NrZXRdIGlzIGEgbG93LWxldmVsIGludGVyZmFjZSB0byBhIHNvY2tldCwgZXhwb3NpbmcgdGhlIHJhdwogKiBldmVudHMgc2lnbmFsZWQgYnkgdGhlIHN5c3RlbS4gSXQncyBhIFtTdHJlYW1dIG9mIFtSYXdTb2NrZXRFdmVudF1zLgogKi8KYWJzdHJhY3QgY2xhc3MgUmF3U29ja2V0IGltcGxlbWVudHMgU3RyZWFtPFJhd1NvY2tldEV2ZW50PiB7CiAgLyoqCiAgICogU2V0IG9yIGdldCwgaWYgdGhlIFtSYXdTb2NrZXRdIHNob3VsZCBsaXN0ZW4gZm9yIFtSYXdTb2NrZXRFdmVudC5yZWFkXQogICAqIGV2ZW50cy4gRGVmYXVsdCBpcyBbOnRydWU6XS4KICAgKi8KICBib29sIHJlYWRFdmVudHNFbmFibGVkOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCBpZiB0aGUgW1Jhd1NvY2tldF0gc2hvdWxkIGxpc3RlbiBmb3IgW1Jhd1NvY2tldEV2ZW50LndyaXRlXQogICAqIGV2ZW50cy4gRGVmYXVsdCBpcyBbOnRydWU6XS4KICAgKiBUaGlzIGlzIGEgb25lLXNob3QgbGlzdGVuZXIsIGFuZCB3cml0ZUV2ZW50c0VuYWJsZWQgbXVzdCBiZSBzZXQKICAgKiB0byB0cnVlIGFnYWluIHRvIHJlY2VpdmUgYW5vdGhlciB3cml0ZSBldmVudC4KICAgKi8KICBib29sIHdyaXRlRXZlbnRzRW5hYmxlZDsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgaG9zdCBhbmQgcG9ydCBhbmQgcmV0dXJucyBhIFtGdXR1cmVdCiAgICogdGhhdCB3aWxsIGNvbXBsZXRlIHdpdGggZWl0aGVyIGEgW1Jhd1NvY2tldF0gb25jZSBjb25uZWN0ZWQgb3IgYW4gZXJyb3IKICAgKiBpZiB0aGUgaG9zdC1sb29rdXAgb3IgY29ubmVjdGlvbiBmYWlsZWQuCiAgICoKICAgKiBbaG9zdF0gY2FuIGVpdGhlciBiZSBhIFtTdHJpbmddIG9yIGFuIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbaG9zdF0gaXMgYQogICAqIFtTdHJpbmddLCBbY29ubmVjdF0gd2lsbCBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB0cnkKICAgKiBhbGwgcmV0dXJuZWQgW0ludGVybmV0QWRkcmVzc11lcywgdW50aWwgY29ubmVjdGVkLiBVbmxlc3MgYQogICAqIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkLCB0aGUgZXJyb3IgZnJvbSB0aGUgZmlyc3QgZmFpbGluZyBjb25uZWN0aW9uIGlzCiAgICogcmV0dXJuZWQuCiAgICoKICAgKiBUaGUgYXJndW1lbnQgW3NvdXJjZUFkZHJlc3NdIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2FsCiAgICogYWRkcmVzcyB0byBiaW5kIHdoZW4gbWFraW5nIHRoZSBjb25uZWN0aW9uLiBgc291cmNlQWRkcmVzc2AgY2FuIGVpdGhlcgogICAqIGJlIGEgYFN0cmluZ2Agb3IgYW4gYEludGVybmV0QWRkcmVzc2AuIElmIGEgYFN0cmluZ2AgaXMgcGFzc2VkIGl0IG11c3QKICAgKiBob2xkIGEgbnVtZXJpYyBJUCBhZGRyZXNzLgogICAqCiAgICogVGhlIGFyZ3VtZW50IFt0aW1lb3V0XSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG1heGltdW0gYWxsb3dlZCB0aW1lIHRvIHdhaXQKICAgKiBmb3IgYSBjb25uZWN0aW9uIHRvIGJlIGVzdGFibGlzaGVkLiBJZiBbdGltZW91dF0gaXMgbG9uZ2VyIHRoYW4gdGhlIHN5c3RlbQogICAqIGxldmVsIHRpbWVvdXQgZHVyYXRpb24sIGEgdGltZW91dCBtYXkgb2NjdXIgc29vbmVyIHRoYW4gc3BlY2lmaWVkIGluCiAgICogW3RpbWVvdXRdLiBPbiB0aW1lb3V0LCBhIFtTb2NrZXRFeGNlcHRpb25dIGlzIHRocm93biBhbmQgYWxsIG9uZ29pbmcKICAgKiBjb25uZWN0aW9uIGF0dGVtcHRzIHRvIFtob3N0XSBhcmUgY2FuY2VsbGVkLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8UmF3U29ja2V0PiBjb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzcywgRHVyYXRpb24gdGltZW91dH0pOwoKICAvLy8gTGlrZSBbY29ubmVjdF0sIGJ1dCByZXR1cm5zIGEgW0Z1dHVyZV0gdGhhdCBjb21wbGV0ZXMgd2l0aCBhCiAgLy8vIFtDb25uZWN0aW9uVGFza10gdGhhdCBjYW4gYmUgY2FuY2VsbGVkIGlmIHRoZSBbUmF3U29ja2V0XSBpcyBubwogIC8vLyBsb25nZXIgbmVlZGVkLgogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8UmF3U29ja2V0Pj4gc3RhcnRDb25uZWN0KGhvc3QsIGludCBwb3J0LAogICAgICB7c291cmNlQWRkcmVzc30pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYW5kIG5vbi1yZWFkIGJ5dGVzIGluIHRoZSBzb2NrZXQgdGhhdAogICAqIGNhbiBiZSByZWFkLgogICAqLwogIGludCBhdmFpbGFibGUoKTsKCiAgLyoqCiAgICogUmVhZCB1cCB0byBbbGVuXSBieXRlcyBmcm9tIHRoZSBzb2NrZXQuIFRoaXMgZnVuY3Rpb24gaXMKICAgKiBub24tYmxvY2tpbmcgYW5kIHdpbGwgb25seSByZXR1cm4gZGF0YSBpZiBkYXRhIGlzIGF2YWlsYWJsZS4gVGhlCiAgICogbnVtYmVyIG9mIGJ5dGVzIHJlYWQgY2FuIGJlIGxlc3MgdGhlbiBbbGVuXSBpZiBmZXdlciBieXRlcyBhcmUKICAgKiBhdmFpbGFibGUgZm9yIGltbWVkaWF0ZSByZWFkaW5nLiBJZiBubyBkYXRhIGlzIGF2YWlsYWJsZSBbOm51bGw6XQogICAqIGlzIHJldHVybmVkLgogICAqLwogIExpc3Q8aW50PiByZWFkKFtpbnQgbGVuXSk7CgogIC8qKgogICAqIFdyaXRlcyB1cCB0byBbY291bnRdIGJ5dGVzIG9mIHRoZSBidWZmZXIgZnJvbSBbb2Zmc2V0XSBidWZmZXIgb2Zmc2V0IHRvCiAgICogdGhlIHNvY2tldC4gVGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgd3JpdHRlbiBieXRlcyBpcyByZXR1cm5lZC4gVGhpcwogICAqIGZ1bmN0aW9uIGlzIG5vbi1ibG9ja2luZyBhbmQgd2lsbCBvbmx5IHdyaXRlIGRhdGEgaWYgYnVmZmVyIHNwYWNlIGlzCiAgICogYXZhaWxhYmxlIGluIHRoZSBzb2NrZXQuCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgW29mZnNldF0gaXMgMCwgYW5kIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBbY291bnRdIGlzCiAgICogWzpidWZmZXIubGVuZ3RoIC0gb2Zmc2V0Ol0uCiAgICovCiAgaW50IHdyaXRlKExpc3Q8aW50PiBidWZmZXIsIFtpbnQgb2Zmc2V0LCBpbnQgY291bnRdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcG9ydCB1c2VkIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVtb3RlIHBvcnQgY29ubmVjdGVkIHRvIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIGludCBnZXQgcmVtb3RlUG9ydDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgW0ludGVybmV0QWRkcmVzc10gdXNlZCB0byBjb25uZWN0IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgYWRkcmVzczsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVtb3RlIFtJbnRlcm5ldEFkZHJlc3NdIGNvbm5lY3RlZCB0byBieSB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3M7CgogIC8qKgogICAqIENsb3NlcyB0aGUgc29ja2V0LiBSZXR1cm5zIGEgRnV0dXJlIHRoYXQgY29tcGxldGVzIHdpdGggW3RoaXNdIHdoZW4gdGhlCiAgICogdW5kZXJseWluZyBjb25uZWN0aW9uIGlzIGNvbXBsZXRlbHkgZGVzdHJveWVkLgogICAqCiAgICogQ2FsbGluZyBbY2xvc2VdIHdpbGwgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uCiAgICogYW5kIGNhbGxpbmcgaXQgc2V2ZXJhbCB0aW1lcyBpcyBzdXBwb3J0ZWQuIENhbGxpbmcgW2Nsb3NlXSBjYW4gcmVzdWx0IGluCiAgICogYSBbUmF3U29ja2V0RXZlbnQucmVhZENsb3NlZF0gZXZlbnQuCiAgICovCiAgRnV0dXJlPFJhd1NvY2tldD4gY2xvc2UoKTsKCiAgLyoqCiAgICogU2h1dGRvd24gdGhlIHNvY2tldCBpbiB0aGUgW2RpcmVjdGlvbl0uIENhbGxpbmcgW3NodXRkb3duXSB3aWxsIG5ldmVyCiAgICogdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBjYWxsaW5nIGl0IHNldmVyYWwgdGltZXMgaXMgc3VwcG9ydGVkLiBDYWxsaW5nCiAgICogc2h1dGRvd24gd2l0aCBlaXRoZXIgW1NvY2tldERpcmVjdGlvbi5ib3RoXSBvciBbU29ja2V0RGlyZWN0aW9uLnJlY2VpdmVdCiAgICogY2FuIHJlc3VsdCBpbiBhIFtSYXdTb2NrZXRFdmVudC5yZWFkQ2xvc2VkXSBldmVudC4KICAgKi8KICB2b2lkIHNodXRkb3duKFNvY2tldERpcmVjdGlvbiBkaXJlY3Rpb24pOwoKICAvKioKICAgKiBVc2UgW3NldE9wdGlvbl0gdG8gY3VzdG9taXplIHRoZSBbUmF3U29ja2V0XS4gU2VlIFtTb2NrZXRPcHRpb25dIGZvcgogICAqIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogUmV0dXJucyBbOnRydWU6XSBpZiB0aGUgb3B0aW9uIHdhcyBzZXQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCiAgICovCiAgYm9vbCBzZXRPcHRpb24oU29ja2V0T3B0aW9uIG9wdGlvbiwgYm9vbCBlbmFibGVkKTsKCiAgLyoqCiAgICogVXNlIFtnZXRSYXdPcHRpb25dIHRvIGdldCBsb3cgbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFtSYXdTb2NrZXRdLiBTZWUKICAgKiBbUmF3U29ja2V0T3B0aW9uXSBmb3IgYXZhaWxhYmxlIG9wdGlvbnMuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBbUmF3U29ja2V0T3B0aW9uLnZhbHVlXSBvbiBzdWNjZXNzLgogICAqCiAgICogVGhyb3dzIGFuIFtPU0Vycm9yXSBvbiBmYWlsdXJlLgogICAqLwogIFVpbnQ4TGlzdCBnZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbik7CgogIC8qKgogICAqIFVzZSBbc2V0UmF3T3B0aW9uXSB0byBjdXN0b21pemUgdGhlIFtSYXdTb2NrZXRdLiBTZWUgW1Jhd1NvY2tldE9wdGlvbl0gZm9yCiAgICogYXZhaWxhYmxlIG9wdGlvbnMuCiAgICoKICAgKiBUaHJvd3MgYW4gW09TRXJyb3JdIG9uIGZhaWx1cmUuCiAgICovCiAgdm9pZCBzZXRSYXdPcHRpb24oUmF3U29ja2V0T3B0aW9uIG9wdGlvbik7Cn0KCi8qKgogKiBBIGhpZ2gtbGV2ZWwgY2xhc3MgZm9yIGNvbW11bmljYXRpbmcgb3ZlciBhIFRDUCBzb2NrZXQuCiAqCiAqIFRoZSBbU29ja2V0XSBleHBvc2VzIGJvdGggYSBbU3RyZWFtXSBhbmQgYSBbSU9TaW5rXSBpbnRlcmZhY2UsIG1ha2luZyBpdAogKiBpZGVhbCBmb3IgdXNpbmcgdG9nZXRoZXIgd2l0aCBvdGhlciBbU3RyZWFtXXMuCiAqLwphYnN0cmFjdCBjbGFzcyBTb2NrZXQgaW1wbGVtZW50cyBTdHJlYW08TGlzdDxpbnQ+PiwgSU9TaW5rIHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBob3N0IGFuZCBwb3J0IGFuZCByZXR1cm5zIGEgW0Z1dHVyZV0KICAgKiB0aGF0IHdpbGwgY29tcGxldGUgd2l0aCBlaXRoZXIgYSBbU29ja2V0XSBvbmNlIGNvbm5lY3RlZCBvciBhbiBlcnJvcgogICAqIGlmIHRoZSBob3N0LWxvb2t1cCBvciBjb25uZWN0aW9uIGZhaWxlZC4KICAgKgogICAqIFtob3N0XSBjYW4gZWl0aGVyIGJlIGEgW1N0cmluZ10gb3IgYW4gW0ludGVybmV0QWRkcmVzc10uIElmIFtob3N0XSBpcyBhCiAgICogW1N0cmluZ10sIFtjb25uZWN0XSB3aWxsIHBlcmZvcm0gYSBbSW50ZXJuZXRBZGRyZXNzLmxvb2t1cF0gYW5kIHRyeQogICAqIGFsbCByZXR1cm5lZCBbSW50ZXJuZXRBZGRyZXNzXWVzLCB1bnRpbCBjb25uZWN0ZWQuIFVubGVzcyBhCiAgICogY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQsIHRoZSBlcnJvciBmcm9tIHRoZSBmaXJzdCBmYWlsaW5nIGNvbm5lY3Rpb24gaXMKICAgKiByZXR1cm5lZC4KICAgKgogICAqIFRoZSBhcmd1bWVudCBbc291cmNlQWRkcmVzc10gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYWwKICAgKiBhZGRyZXNzIHRvIGJpbmQgd2hlbiBtYWtpbmcgdGhlIGNvbm5lY3Rpb24uIGBzb3VyY2VBZGRyZXNzYCBjYW4gZWl0aGVyCiAgICogYmUgYSBgU3RyaW5nYCBvciBhbiBgSW50ZXJuZXRBZGRyZXNzYC4gSWYgYSBgU3RyaW5nYCBpcyBwYXNzZWQgaXQgbXVzdAogICAqIGhvbGQgYSBudW1lcmljIElQIGFkZHJlc3MuCiAgICoKICAgKiBUaGUgYXJndW1lbnQgW3RpbWVvdXRdIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBhbGxvd2VkIHRpbWUgdG8gd2FpdAogICAqIGZvciBhIGNvbm5lY3Rpb24gdG8gYmUgZXN0YWJsaXNoZWQuIElmIFt0aW1lb3V0XSBpcyBsb25nZXIgdGhhbiB0aGUgc3lzdGVtCiAgICogbGV2ZWwgdGltZW91dCBkdXJhdGlvbiwgYSB0aW1lb3V0IG1heSBvY2N1ciBzb29uZXIgdGhhbiBzcGVjaWZpZWQgaW4KICAgKiBbdGltZW91dF0uIE9uIHRpbWVvdXQsIGEgW1NvY2tldEV4Y2VwdGlvbl0gaXMgdGhyb3duIGFuZCBhbGwgb25nb2luZwogICAqIGNvbm5lY3Rpb24gYXR0ZW1wdHMgdG8gW2hvc3RdIGFyZSBjYW5jZWxsZWQuCiAgICovCiAgc3RhdGljIEZ1dHVyZTxTb2NrZXQ+IGNvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSkgewogICAgZmluYWwgSU9PdmVycmlkZXMgb3ZlcnJpZGVzID0gSU9PdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gU29ja2V0Ll9jb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLCB0aW1lb3V0OiB0aW1lb3V0KTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuc29ja2V0Q29ubmVjdChob3N0LCBwb3J0LAogICAgICAgIHNvdXJjZUFkZHJlc3M6IHNvdXJjZUFkZHJlc3MsIHRpbWVvdXQ6IHRpbWVvdXQpOwogIH0KCiAgLy8vIExpa2UgW2Nvbm5lY3RdLCBidXQgcmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdpdGggYQogIC8vLyBbQ29ubmVjdGlvblRhc2tdIHRoYXQgY2FuIGJlIGNhbmNlbGxlZCBpZiB0aGUgW1NvY2tldF0gaXMgbm8KICAvLy8gbG9uZ2VyIG5lZWRlZC4KICBzdGF0aWMgRnV0dXJlPENvbm5lY3Rpb25UYXNrPFNvY2tldD4+IHN0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KSB7CiAgICBmaW5hbCBJT092ZXJyaWRlcyBvdmVycmlkZXMgPSBJT092ZXJyaWRlcy5jdXJyZW50OwogICAgaWYgKG92ZXJyaWRlcyA9PSBudWxsKSB7CiAgICAgIHJldHVybiBTb2NrZXQuX3N0YXJ0Q29ubmVjdChob3N0LCBwb3J0LCBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzKTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuc29ja2V0U3RhcnRDb25uZWN0KGhvc3QsIHBvcnQsCiAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlQWRkcmVzcyk7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgRnV0dXJlPFNvY2tldD4gX2Nvbm5lY3QoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtzb3VyY2VBZGRyZXNzLCBEdXJhdGlvbiB0aW1lb3V0fSk7CgogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8Q29ubmVjdGlvblRhc2s8U29ja2V0Pj4gX3N0YXJ0Q29ubmVjdChob3N0LCBpbnQgcG9ydCwKICAgICAge3NvdXJjZUFkZHJlc3N9KTsKCiAgLyoqCiAgICogRGVzdHJveSB0aGUgc29ja2V0IGluIGJvdGggZGlyZWN0aW9ucy4gQ2FsbGluZyBbZGVzdHJveV0gd2lsbCBtYWtlIHRoZQogICAqIHNlbmQgYSBjbG9zZSBldmVudCBvbiB0aGUgc3RyZWFtIGFuZCB3aWxsIG5vIGxvbmdlciByZWFjdCBvbiBkYXRhIGJlaW5nCiAgICogcGlwZWQgdG8gaXQuCiAgICoKICAgKiBDYWxsIFtjbG9zZV0oaW5oZXJpdGVkIGZyb20gW0lPU2lua10pIHRvIG9ubHkgY2xvc2UgdGhlIFtTb2NrZXRdCiAgICogZm9yIHNlbmRpbmcgZGF0YS4KICAgKi8KICB2b2lkIGRlc3Ryb3koKTsKCiAgLyoqCiAgICogVXNlIFtzZXRPcHRpb25dIHRvIGN1c3RvbWl6ZSB0aGUgW1Jhd1NvY2tldF0uIFNlZSBbU29ja2V0T3B0aW9uXSBmb3IKICAgKiBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFJldHVybnMgWzp0cnVlOl0gaWYgdGhlIG9wdGlvbiB3YXMgc2V0IHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAqLwogIGJvb2wgc2V0T3B0aW9uKFNvY2tldE9wdGlvbiBvcHRpb24sIGJvb2wgZW5hYmxlZCk7CgogIC8qKgogICAqIFVzZSBbZ2V0UmF3T3B0aW9uXSB0byBnZXQgbG93IGxldmVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBbUmF3U29ja2V0XS4gU2VlCiAgICogW1Jhd1NvY2tldE9wdGlvbl0gZm9yIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogUmV0dXJucyB0aGUgW1Jhd1NvY2tldE9wdGlvbi52YWx1ZV0gb24gc3VjY2Vzcy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICBVaW50OExpc3QgZ2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwoKICAvKioKICAgKiBVc2UgW3NldFJhd09wdGlvbl0gdG8gY3VzdG9taXplIHRoZSBbUmF3U29ja2V0XS4gU2VlIFtSYXdTb2NrZXRPcHRpb25dIGZvcgogICAqIGF2YWlsYWJsZSBvcHRpb25zLgogICAqCiAgICogVGhyb3dzIGFuIFtPU0Vycm9yXSBvbiBmYWlsdXJlLgogICAqLwogIHZvaWQgc2V0UmF3T3B0aW9uKFJhd1NvY2tldE9wdGlvbiBvcHRpb24pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHVzZWQgYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCBwb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZW1vdGUgcG9ydCBjb25uZWN0ZWQgdG8gYnkgdGhpcyBzb2NrZXQuCiAgICovCiAgaW50IGdldCByZW1vdGVQb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBbSW50ZXJuZXRBZGRyZXNzXSB1c2VkIHRvIGNvbm5lY3QgdGhpcyBzb2NrZXQuCiAgICovCiAgSW50ZXJuZXRBZGRyZXNzIGdldCBhZGRyZXNzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSByZW1vdGUgW0ludGVybmV0QWRkcmVzc10gY29ubmVjdGVkIHRvIGJ5IHRoaXMgc29ja2V0LgogICAqLwogIEludGVybmV0QWRkcmVzcyBnZXQgcmVtb3RlQWRkcmVzczsKCiAgRnV0dXJlIGNsb3NlKCk7CgogIEZ1dHVyZSBnZXQgZG9uZTsKfQoKLyoqCiAqIERhdGFncmFtIHBhY2thZ2UuIERhdGEgc2VuZCB0byBhbmQgcmVjZWl2ZWQgZnJvbSBkYXRhZ3JhbSBzb2NrZXRzCiAqIGNvbnRhaW5zIHRoZSBpbnRlcm5ldCBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBkZXN0aW5hdGlvbiBvciBzb3VyY2UKICogdG9nZXRlciB3aXRoIHRoZSBkYXRhLgogKi8KY2xhc3MgRGF0YWdyYW0gewogIExpc3Q8aW50PiBkYXRhOwogIEludGVybmV0QWRkcmVzcyBhZGRyZXNzOwogIGludCBwb3J0OwoKICBEYXRhZ3JhbSh0aGlzLmRhdGEsIHRoaXMuYWRkcmVzcywgdGhpcy5wb3J0KTsKfQoKLyoqCiAqIFRoZSBbUmF3RGF0YWdyYW1Tb2NrZXRdIGlzIGEgbG93LWxldmVsIGludGVyZmFjZSB0byBhbiBVRFAgc29ja2V0LAogKiBleHBvc2luZyB0aGUgcmF3IGV2ZW50cyBzaWduYWxlZCBieSB0aGUgc3lzdGVtLiBJdCdzIGEgW1N0cmVhbV0gb2YKICogW1Jhd1NvY2tldEV2ZW50XXMuCiAqCiAqIE5vdGUgdGhhdCB0aGUgZXZlbnQgW1Jhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWRdIHdpbGwgbmV2ZXIgYmUKICogcmVjZWl2ZWQgYXMgYW4gVURQIHNvY2tldCBjYW5ub3QgYmUgY2xvc2VkIGJ5IGEgcmVtb3RlIHBlZXIuCiAqLwphYnN0cmFjdCBjbGFzcyBSYXdEYXRhZ3JhbVNvY2tldCBleHRlbmRzIFN0cmVhbTxSYXdTb2NrZXRFdmVudD4gewogIC8qKgogICAqIFNldCBvciBnZXQsIGlmIHRoZSBbUmF3RGF0YWdyYW1Tb2NrZXRdIHNob3VsZCBsaXN0ZW4gZm9yCiAgICogW1Jhd1NvY2tldEV2ZW50LnJlYWRdIGV2ZW50cy4gRGVmYXVsdCBpcyBbOnRydWU6XS4KICAgKi8KICBib29sIHJlYWRFdmVudHNFbmFibGVkOwoKICAvKioKICAgKiBTZXQgb3IgZ2V0LCBpZiB0aGUgW1Jhd0RhdGFncmFtU29ja2V0XSBzaG91bGQgbGlzdGVuIGZvcgogICAqIFtSYXdTb2NrZXRFdmVudC53cml0ZV0gZXZlbnRzLiBEZWZhdWx0IGlzIFs6dHJ1ZTpdLiAgVGhpcyBpcyBhCiAgICogb25lLXNob3QgbGlzdGVuZXIsIGFuZCB3cml0ZUV2ZW50c0VuYWJsZWQgbXVzdCBiZSBzZXQgdG8gdHJ1ZQogICAqIGFnYWluIHRvIHJlY2VpdmUgYW5vdGhlciB3cml0ZSBldmVudC4KICAgKi8KICBib29sIHdyaXRlRXZlbnRzRW5hYmxlZDsKCiAgLyoqCiAgICogU2V0IG9yIGdldCwgd2hldGhlciBtdWx0aWNhc3QgdHJhZmZpYyBpcyBsb29wZWQgYmFjayB0byB0aGUgaG9zdC4KICAgKgogICAqIEJ5IGRlZmF1bHQgbXVsdGljYXN0IGxvb3BiYWNrIGlzIGVuYWJsZWQuCiAgICovCiAgYm9vbCBtdWx0aWNhc3RMb29wYmFjazsKCiAgLyoqCiAgICogU2V0IG9yIGdldCwgdGhlIG1heGltdW0gbmV0d29yayBob3BzIGZvciBtdWx0aWNhc3QgcGFja2FnZXMKICAgKiBvcmlnaW5hdGluZyBmcm9tIHRoaXMgc29ja2V0LgogICAqCiAgICogRm9yIElQdjQgdGhpcyBpcyByZWZlcnJlZCB0byBhcyBUVEwgKHRpbWUgdG8gbGl2ZSkuCiAgICoKICAgKiBCeSBkZWZhdWx0IHRoaXMgdmFsdWUgaXMgMSBjYXVzaW5nIG11bHRpY2FzdCB0cmFmZmljIHRvIHN0YXkgb24KICAgKiB0aGUgbG9jYWwgbmV0d29yay4KICAgKi8KICBpbnQgbXVsdGljYXN0SG9wczsKCiAgLyoqCiAgICogU2V0IG9yIGdldCwgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgZm9yIG91dGdvaW5nIG11bHRpY2FzdCBwYWNrYWdlcy4KICAgKgogICAqIEEgdmFsdWUgb2YgYG51bGxgaW5kaWNhdGUgdGhhdCB0aGUgc3lzdGVtIGNob29zZXMgdGhlIG5ldHdvcmsKICAgKiBpbnRlcmZhY2UgdG8gdXNlLgogICAqCiAgICogQnkgZGVmYXVsdCB0aGlzIHZhbHVlIGlzIGBudWxsYAogICAqLwogIEBEZXByZWNhdGVkKCJUaGlzIHByb3BlcnR5IGlzIG5vdCBpbXBsZW1lbnRlZC4gVXNlIGdldFJhd09wdGlvbiBhbmQgIgogICAgICAic2V0UmF3T3B0aW9uIGluc3RlYWQuIikKICBOZXR3b3JrSW50ZXJmYWNlIG11bHRpY2FzdEludGVyZmFjZTsKCiAgLyoqCiAgICogU2V0IG9yIGdldCwgd2hldGhlciBJUHY0IGJyb2FkY2FzdCBpcyBlbmFibGVkLgogICAqCiAgICogSVB2NCBicm9hZGNhc3QgbmVlZHMgdG8gYmUgZW5hYmxlZCBieSB0aGUgc2VuZGVyIGZvciBzZW5kaW5nIElQdjQKICAgKiBicm9hZGNhc3QgcGFja2FnZXMuIEJ5IGRlZmF1bHQgSVB2NCBicm9hZGNhc3QgaXMgZGlzYWJsZWQuCiAgICoKICAgKiBGb3IgSVB2NiB0aGVyZSBpcyBubyBnZW5lcmFsIGJyb2FkY2FzdCBtZWNoYW5pc20uIFVzZSBtdWx0aWNhc3QKICAgKiBpbnN0ZWFkLgogICAqLwogIGJvb2wgYnJvYWRjYXN0RW5hYmxlZDsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyByYXcgZGF0YWdyYW0gc29ja2V0IGJpbmRpbmcgaXQgdG8gYW4gYWRkcmVzcyBhbmQKICAgKiBwb3J0LgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBGdXR1cmU8UmF3RGF0YWdyYW1Tb2NrZXQ+IGJpbmQoaG9zdCwgaW50IHBvcnQsCiAgICAgIHtib29sIHJldXNlQWRkcmVzczogdHJ1ZSwgYm9vbCByZXVzZVBvcnQ6IGZhbHNlLCBpbnQgdHRsOiAxfSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBpbnQgZ2V0IHBvcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGFkZHJlc3MgdXNlZCBieSB0aGlzIHNvY2tldC4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3M7CgogIC8qKgogICAqIENsb3NlIHRoZSBkYXRhZ3JhbSBzb2NrZXQuCiAgICovCiAgdm9pZCBjbG9zZSgpOwoKICAvKioKICAgKiBTZW5kIGEgZGF0YWdyYW0uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gVGhpcyB3aWxsIGFsd2F5cyBiZSBlaXRoZXIKICAgKiB0aGUgc2l6ZSBvZiBbYnVmZmVyXSBvciBgMGAuCiAgICovCiAgaW50IHNlbmQoTGlzdDxpbnQ+IGJ1ZmZlciwgSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KTsKCiAgLyoqCiAgICogUmVjZWl2ZSBhIGRhdGFncmFtLiBJZiB0aGVyZSBhcmUgbm8gZGF0YWdyYW1zIGF2YWlsYWJsZSBgbnVsbGAgaXMKICAgKiByZXR1cm5lZC4KICAgKgogICAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZGF0YWdyYW0gdGhhdCBjYW4gYmUgcmVjZWl2ZWQgaXMgNjU1MDMgYnl0ZXMuCiAgICovCiAgRGF0YWdyYW0gcmVjZWl2ZSgpOwoKICAvKioKICAgKiBKb2luIGEgbXVsdGljYXN0IGdyb3VwLgogICAqCiAgICogSWYgYW4gZXJyb3Igb2NjdXIgd2hlbiB0cnlpbmcgdG8gam9pbiB0aGUgbXVsdGljYXN0IGdyb3VwIGFuCiAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KICAgKi8KICB2b2lkIGpvaW5NdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGdyb3VwLCBbTmV0d29ya0ludGVyZmFjZSBpbnRlcmZhY2VdKTsKCiAgLyoqCiAgICogTGVhdmUgYSBtdWx0aWNhc3QgZ3JvdXAuCiAgICoKICAgKiBJZiBhbiBlcnJvciBvY2N1ciB3aGVuIHRyeWluZyB0byBqb2luIHRoZSBtdWx0aWNhc2UgZ3JvdXAgYW4KICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgogICAqLwogIHZvaWQgbGVhdmVNdWx0aWNhc3QoSW50ZXJuZXRBZGRyZXNzIGdyb3VwLCBbTmV0d29ya0ludGVyZmFjZSBpbnRlcmZhY2VdKTsKCiAgLyoqCiAgICogVXNlIFtnZXRSYXdPcHRpb25dIHRvIGdldCBsb3cgbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFtSYXdTb2NrZXRdLiBTZWUKICAgKiBbUmF3U29ja2V0T3B0aW9uXSBmb3IgYXZhaWxhYmxlIG9wdGlvbnMuCiAgICoKICAgKiBSZXR1cm5zIFtSYXdTb2NrZXRPcHRpb24udmFsdWVdIG9uIHN1Y2Nlc3MuCiAgICoKICAgKiBUaHJvd3MgYW4gW09TRXJyb3JdIG9uIGZhaWx1cmUuCiAgICovCiAgVWludDhMaXN0IGdldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKTsKCiAgLyoqCiAgICogVXNlIFtzZXRSYXdPcHRpb25dIHRvIGN1c3RvbWl6ZSB0aGUgW1Jhd1NvY2tldF0uIFNlZSBbUmF3U29ja2V0T3B0aW9uXSBmb3IKICAgKiBhdmFpbGFibGUgb3B0aW9ucy4KICAgKgogICAqIFRocm93cyBhbiBbT1NFcnJvcl0gb24gZmFpbHVyZS4KICAgKi8KICB2b2lkIHNldFJhd09wdGlvbihSYXdTb2NrZXRPcHRpb24gb3B0aW9uKTsKfQoKY2xhc3MgU29ja2V0RXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIGZpbmFsIE9TRXJyb3Igb3NFcnJvcjsKICBmaW5hbCBJbnRlcm5ldEFkZHJlc3MgYWRkcmVzczsKICBmaW5hbCBpbnQgcG9ydDsKCiAgY29uc3QgU29ja2V0RXhjZXB0aW9uKHRoaXMubWVzc2FnZSwge3RoaXMub3NFcnJvciwgdGhpcy5hZGRyZXNzLCB0aGlzLnBvcnR9KTsKICBjb25zdCBTb2NrZXRFeGNlcHRpb24uY2xvc2VkKCkKICAgICAgOiBtZXNzYWdlID0gJ1NvY2tldCBoYXMgYmVlbiBjbG9zZWQnLAogICAgICAgIG9zRXJyb3IgPSBudWxsLAogICAgICAgIGFkZHJlc3MgPSBudWxsLAogICAgICAgIHBvcnQgPSBudWxsOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBzYi53cml0ZSgiU29ja2V0RXhjZXB0aW9uIik7CiAgICBpZiAobWVzc2FnZS5pc05vdEVtcHR5KSB7CiAgICAgIHNiLndyaXRlKCI6ICRtZXNzYWdlIik7CiAgICAgIGlmIChvc0Vycm9yICE9IG51bGwpIHsKICAgICAgICBzYi53cml0ZSgiICgkb3NFcnJvcikiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvc0Vycm9yICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIjogJG9zRXJyb3IiKTsKICAgIH0KICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsKICAgICAgc2Iud3JpdGUoIiwgYWRkcmVzcyA9ICR7YWRkcmVzcy5ob3N0fSIpOwogICAgfQogICAgaWYgKHBvcnQgIT0gbnVsbCkgewogICAgICBzYi53cml0ZSgiLCBwb3J0ID0gJHBvcnQiKTsKICAgIH0KICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KfQqD6wBOTjwBEQEERj4EHEpKSgEiMSIxIS4BFAEsATEhITUEAQY2BhQWDxYOFw4XDzwGBAE1AgEEGANDRhxBRAkEIQZHRgY9KjYBBkdGBj0qNgEGQjoGMyUxAQZCOgYzJTEBBkUGIAEGRzshBhYBBj5DBhMBBktNQQYcAQZCBhcBBkMGGAEGQAYYAQY9BTdFKAY0AQZDPwYlAQY0REJCRUYXBkQ8AQY1BUoqBjUtAgEETksOBCIGLQYTAQYuBhEBBj8ZBicBBiIFMQYqAQYvBUgqBUxQBTdFOwY3JCQ7AgEERUQhAyIEPgZBRS0FMkBHRD0nOz4/RwVCQkEVBTpEIAVHRkcRBVFRTFFMMgZCQQEGKwYQAQYuBh8BBkYtBiMCAQRCQxUDHwQ4Bj5FLQUyQEdEPSc7Pj9HBUJCQRUFR0EUBUdGRxEFTlFPS0kyBj9BAQYrBhABBi4GHwEGRi0GIAIBBEZGBBhFQkIBJTIiLCIsARABKAIBBEdKCwQVBk1PIgUoBkIoNgFISEZEARABJQIBLxkTExgVGhQUAgFOTgwEUkwQGEIGNwZPKgZMJAZNQQZKDj4BSUYZEQYpLx8xBAFJSUUBLgYQKCYmJSUTASAUAVAGTVBMJhkBKiA7ASoeOwEpK0ABLB49ASsrQgErHTwBKx08ATACAQQfBBdAQUZCASIrIy0oOCQvARQBJxYTHR4jHg8EAgFMSxpLOgZNTxojAUEgIh4jASYGQB8SEQQCAQRKSAQ9BkwiBhoBBk0iRTMGGwEGUU0uBU1JQVAPBUNMTCAFUFBKSjIGPCoBQ0YVURgBBkoSBhMBBj5GREcSBh0BBk1MSh4FTyEGOAEGKwYQAQY6BhYBBkAGHwEGRwYlAQZNNAUzTioGHQEGS0tOOAYsAQZKGAVLBjUBBlAuBTUFJQYyAQZQGAUlBi0CAQQ7A0wyBD0GUUouBU1JQVAPBUNMTCAFUFBKSjIGMCs3HSk7Bi85BAFDQxVFGTcdTQY0JwQBOioBTxgBBkxNEgVGFwYSAQZKGAVLBjUBBlAuBTUFJQYyAQZQGAUlBi0BBisGEAEGOgYWAQZABh8BBkcGJQESARMCAQRFRxoEERIbDAEwAgEERkYWA0FABEIGPjgGGgEGPkRDKwYbAQZHBS8GGgEGQSMFOQVFGAYVAQZNBUMXBSUGSB8nAQY0BUdABUUOBhkBBkQLBkFFAQYrBhABBi4GHwEGIAYQAQYWBUUiBkEBBkcPBU0GFgEGHQVCGgZLAQYeBUIaBkwBBlAuBTEFJQYyAQZQGAUlBi0CAS8YGSESAVAhLBgYFQEWKiEeHh0hCCIeBhsvBhgiBhoEAgETZGFydDppby9zb2NrZXQuZGFydClvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvaW8vc3RkaW8uZGFydLg+Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5pbzsKCmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlVGVybWluYWwgPSAwOwpjb25zdCBpbnQgX3N0ZGlvSGFuZGxlVHlwZVBpcGUgPSAxOwpjb25zdCBpbnQgX3N0ZGlvSGFuZGxlVHlwZUZpbGUgPSAyOwpjb25zdCBpbnQgX3N0ZGlvSGFuZGxlVHlwZVNvY2tldCA9IDM7CmNvbnN0IGludCBfc3RkaW9IYW5kbGVUeXBlT3RoZXIgPSA0OwoKY2xhc3MgX1N0ZFN0cmVhbSBleHRlbmRzIFN0cmVhbTxMaXN0PGludD4+IHsKICBmaW5hbCBTdHJlYW08TGlzdDxpbnQ+PiBfc3RyZWFtOwoKICBfU3RkU3RyZWFtKHRoaXMuX3N0cmVhbSk7CgogIFN0cmVhbVN1YnNjcmlwdGlvbjxMaXN0PGludD4+IGxpc3Rlbih2b2lkIG9uRGF0YShMaXN0PGludD4gZXZlbnQpLAogICAgICB7RnVuY3Rpb24gb25FcnJvciwgdm9pZCBvbkRvbmUoKSwgYm9vbCBjYW5jZWxPbkVycm9yfSkgewogICAgcmV0dXJuIF9zdHJlYW0ubGlzdGVuKG9uRGF0YSwKICAgICAgICBvbkVycm9yOiBvbkVycm9yLCBvbkRvbmU6IG9uRG9uZSwgY2FuY2VsT25FcnJvcjogY2FuY2VsT25FcnJvcik7CiAgfQp9CgovKioKICogW1N0ZGluXSBhbGxvd3MgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHJlYWRzIGZyb20gdGhlIHN0YW5kYXJkCiAqIGlucHV0IHN0cmVhbS4KICoKICogTWl4aW5nIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVhZHMgaXMgdW5kZWZpbmVkLgogKi8KY2xhc3MgU3RkaW4gZXh0ZW5kcyBfU3RkU3RyZWFtIGltcGxlbWVudHMgU3RyZWFtPExpc3Q8aW50Pj4gewogIGludCBfZmQ7CgogIFN0ZGluLl8oU3RyZWFtPExpc3Q8aW50Pj4gc3RyZWFtLCB0aGlzLl9mZCkgOiBzdXBlcihzdHJlYW0pOwoKICAvKioKICAgKiBSZWFkIGEgbGluZSBmcm9tIHN0ZGluLgogICAqCiAgICogQmxvY2tzIHVudGlsIGEgZnVsbCBsaW5lIGlzIGF2YWlsYWJsZS4KICAgKgogICAqIExpbmVzIG15IGJlIHRlcm1pbmF0ZWQgYnkgZWl0aGVyIGA8Q1I+PExGPmAgb3IgYDxMRj5gLiBPbiBXaW5kb3dzIGluIGNhc2VzCiAgICogd2hlcmUgdGhlIFtzdGRpb1R5cGVdIG9mIHN0ZGluIGlzIFtTdGRpb1R5cGUudGVybWltYWxdIHRoZSB0ZXJtaW5hdG9yIG1heQogICAqIGFsc28gYmUgYSBzaW5nbGUgYDxDUj5gLgogICAqCiAgICogSW5wdXQgYnl0ZXMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyBieSBbZW5jb2RpbmddLgogICAqIElmIFtlbmNvZGluZ10gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW3N5c3RlbUVuY29kaW5nXS4KICAgKgogICAqIElmIFtyZXRhaW5OZXdsaW5lc10gaXMgYGZhbHNlYCwgdGhlIHJldHVybmVkIFN0cmluZyB3aWxsIG5vdCBpbmNsdWRlIHRoZQogICAqIGZpbmFsIGxpbmUgdGVybWluYXRvci4gSWYgYHRydWVgLCB0aGUgcmV0dXJuZWQgU3RyaW5nIHdpbGwgaW5jbHVkZSB0aGUgbGluZQogICAqIHRlcm1pbmF0b3IuIERlZmF1bHQgaXMgYGZhbHNlYC4KICAgKgogICAqIElmIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgYWZ0ZXIgYW55IGJ5dGVzIGhhdmUgYmVlbiByZWFkIGZyb20gc3RkaW4sCiAgICogdGhhdCBkYXRhIGlzIHJldHVybmVkIHdpdGhvdXQgYSBsaW5lIHRlcm1pbmF0b3IuCiAgICogUmV0dXJucyBgbnVsbGAgaWYgbm8gYnl0ZXMgcHJlY2VkZWQgdGhlIGVuZCBvZiBpbnB1dC4KICAgKi8KICBTdHJpbmcgcmVhZExpbmVTeW5jKAogICAgICB7RW5jb2RpbmcgZW5jb2Rpbmc6IHN5c3RlbUVuY29kaW5nLCBib29sIHJldGFpbk5ld2xpbmVzOiBmYWxzZX0pIHsKICAgIGNvbnN0IENSID0gMTM7CiAgICBjb25zdCBMRiA9IDEwOwogICAgZmluYWwgTGlzdDxpbnQ+IGxpbmUgPSA8aW50PltdOwogICAgLy8gT24gV2luZG93cywgaWYgbGluZU1vZGUgaXMgZGlzYWJsZWQsIG9ubHkgQ1IgaXMgcmVjZWl2ZWQuCiAgICBib29sIGNySXNOZXdsaW5lID0gUGxhdGZvcm0uaXNXaW5kb3dzICYmCiAgICAgICAgKHN0ZGlvVHlwZShzdGRpbikgPT0gU3RkaW9UeXBlLnRlcm1pbmFsKSAmJgogICAgICAgICFsaW5lTW9kZTsKICAgIGlmIChyZXRhaW5OZXdsaW5lcykgewogICAgICBpbnQgYnl0ZTsKICAgICAgZG8gewogICAgICAgIGJ5dGUgPSByZWFkQnl0ZVN5bmMoKTsKICAgICAgICBpZiAoYnl0ZSA8IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBsaW5lLmFkZChieXRlKTsKICAgICAgfSB3aGlsZSAoYnl0ZSAhPSBMRiAmJiAhKGJ5dGUgPT0gQ1IgJiYgY3JJc05ld2xpbmUpKTsKICAgICAgaWYgKGxpbmUuaXNFbXB0eSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNySXNOZXdsaW5lKSB7CiAgICAgIC8vIENSIGFuZCBMRiBhcmUgYm90aCBsaW5lIHRlcm1pbmF0b3JzLCBuZWl0aGVyIGlzIHJldGFpbmVkLgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGludCBieXRlID0gcmVhZEJ5dGVTeW5jKCk7CiAgICAgICAgaWYgKGJ5dGUgPCAwKSB7CiAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoYnl0ZSA9PSBMRiB8fCBieXRlID09IENSKSBicmVhazsKICAgICAgICBsaW5lLmFkZChieXRlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gQ2FzZSBoYXZpbmcgdG8gaGFuZGxlIENSIExGIGFzIGEgc2luZ2xlIHVucmV0YWluZWQgbGluZSB0ZXJtaW5hdG9yLgogICAgICBvdXRlcjoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpbnQgYnl0ZSA9IHJlYWRCeXRlU3luYygpOwogICAgICAgIGlmIChieXRlID09IExGKSBicmVhazsKICAgICAgICBpZiAoYnl0ZSA9PSBDUikgewogICAgICAgICAgZG8gewogICAgICAgICAgICBieXRlID0gcmVhZEJ5dGVTeW5jKCk7CiAgICAgICAgICAgIGlmIChieXRlID09IExGKSBicmVhayBvdXRlcjsKCiAgICAgICAgICAgIGxpbmUuYWRkKENSKTsKICAgICAgICAgIH0gd2hpbGUgKGJ5dGUgPT0gQ1IpOwogICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIGFuZCBoYW5kbGUgbm9uLUNSIGNoYXJhY3Rlci4KICAgICAgICB9CiAgICAgICAgaWYgKGJ5dGUgPCAwKSB7CiAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KSByZXR1cm4gbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBsaW5lLmFkZChieXRlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShsaW5lKTsKICB9CgogIC8qKgogICAqIENoZWNrIGlmIGVjaG8gbW9kZSBpcyBlbmFibGVkIG9uIFtzdGRpbl0uCiAgICovCiAgZXh0ZXJuYWwgYm9vbCBnZXQgZWNob01vZGU7CgogIC8qKgogICAqIEVuYWJsZSBvciBkaXNhYmxlIGVjaG8gbW9kZSBvbiBbc3RkaW5dLgogICAqCiAgICogSWYgZGlzYWJsZWQsIGlucHV0IGZyb20gdG8gY29uc29sZSB3aWxsIG5vdCBiZSBlY2hvZWQuCiAgICoKICAgKiBEZWZhdWx0IGRlcGVuZHMgb24gdGhlIHBhcmVudCBwcm9jZXNzLCBidXQgdXN1YWxseSBlbmFibGVkLgogICAqCiAgICogT24gV2luZG93cyB0aGlzIG1vZGUgY2FuIG9ubHkgYmUgZW5hYmxlZCBpZiBbbGluZU1vZGVdIGlzIGVuYWJsZWQgYXMgd2VsbC4KICAgKi8KICBleHRlcm5hbCB2b2lkIHNldCBlY2hvTW9kZShib29sIGVuYWJsZWQpOwoKICAvKioKICAgKiBDaGVjayBpZiBsaW5lIG1vZGUgaXMgZW5hYmxlZCBvbiBbc3RkaW5dLgogICAqLwogIGV4dGVybmFsIGJvb2wgZ2V0IGxpbmVNb2RlOwoKICAvKioKICAgKiBFbmFibGUgb3IgZGlzYWJsZSBsaW5lIG1vZGUgb24gW3N0ZGluXS4KICAgKgogICAqIElmIGVuYWJsZWQsIGNoYXJhY3RlcnMgYXJlIGRlbGF5ZWQgdW50aWwgYSBuZXctbGluZSBjaGFyYWN0ZXIgaXMgZW50ZXJlZC4KICAgKiBJZiBkaXNhYmxlZCwgY2hhcmFjdGVycyB3aWxsIGJlIGF2YWlsYWJsZSBhcyB0eXBlZC4KICAgKgogICAqIERlZmF1bHQgZGVwZW5kcyBvbiB0aGUgcGFyZW50IHByb2Nlc3MsIGJ1dCB1c3VhbGx5IGVuYWJsZWQuCiAgICoKICAgKiBPbiBXaW5kb3dzIHRoaXMgbW9kZSBjYW4gb25seSBiZSBkaXNhYmxlZCBpZiBbZWNob01vZGVdIGlzIGRpc2FibGVkIGFzIHdlbGwuCiAgICovCiAgZXh0ZXJuYWwgdm9pZCBzZXQgbGluZU1vZGUoYm9vbCBlbmFibGVkKTsKCiAgLyoqCiAgICAqIFdoZXRoZXIgY29ubmVjdGVkIHRvIGEgdGVybWluYWwgdGhhdCBzdXBwb3J0cyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICAqCiAgICAqIE5vdCBhbGwgdGVybWluYWxzIGFyZSByZWNvZ25pemVkLCBhbmQgbm90IGFsbCByZWNvZ25pemVkIHRlcm1pbmFscyBjYW4KICAgICogcmVwb3J0IHdoZXRoZXIgdGhleSBzdXBwb3J0IEFOU0kgZXNjYXBlIHNlcXVlbmNlcywgc28gdGhpcyB2YWx1ZSBpcyBhCiAgICAqIGJlc3QtZWZmb3J0IGF0dGVtcHQgYXQgZGV0ZWN0aW5nIHRoZSBzdXBwb3J0LgogICAgKgogICAgKiBUaGUgYWN0dWFsIGVzY2FwZSBzZXF1ZW5jZSBzdXBwb3J0IG1heSBkaWZmZXIgYmV0d2VlbiB0ZXJtaW5hbHMsCiAgICAqIHdpdGggc29tZSB0ZXJtaW5hbHMgc3VwcG9ydGluZyBtb3JlIGVzY2FwZSBzZXF1ZW5jZXMgdGhhbiBvdGhlcnMsCiAgICAqIGFuZCBzb21lIHRlcm1pbmFscyBldmVuIGRpZmZlcmluZyBpbiBiZWhhdmlvciBmb3IgdGhlIHNhbWUgZXNjYXBlCiAgICAqIHNlcXVlbmNlLgogICAgKgogICAgKiBUaGUgQU5TSSBjb2xvciBzZWxlY3Rpb24gaXMgZ2VuZXJhbGx5IHN1cHBvcnRlZC4KICAgICoKICAgICogQ3VycmVudGx5LCBhIGBURVJNYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgYHh0ZXJtYAogICAgKiB3aWxsIGJlIHRha2VuIGFzIGV2aWRlbmNlIHRoYXQgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQuCiAgICAqIE9uIFdpbmRvd3MsIG9ubHkgdmVyc2lvbnMgb2YgV2luZG93cyAxMCBhZnRlciB2LjE1MTEKICAgICogKCJUSDIiLCBPUyBidWlsZCAxMDU4Nikgd2lsbCBiZSBkZXRlY3RlZCBhcyBzdXBwb3J0aW5nIHRoZSBvdXRwdXQgb2YKICAgICogQU5TSSBlc2NhcGUgc2VxdWVuY2VzLCBhbmQgb25seSB2ZXJzaW9ucyBhZnRlciB2LjE2MDcgKCJBbm5pdmVyc2FyeQogICAgKiBVcGRhdGUiLCBPUyBidWlsZCAxNDM5Mykgd2lsbCBiZSBkZXRlY3RlZCBhcyBzdXBwb3J0aW5nIHRoZSBpbnB1dCBvZgogICAgKiBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMuCiAgICAqLwogIGV4dGVybmFsIGJvb2wgZ2V0IHN1cHBvcnRzQW5zaUVzY2FwZXM7CgogIC8qKgogICAqIFN5bmNocm9ub3VzbHkgcmVhZCBhIGJ5dGUgZnJvbSBzdGRpbi4gVGhpcyBjYWxsIHdpbGwgYmxvY2sgdW50aWwgYSBieXRlIGlzCiAgICogYXZhaWxhYmxlLgogICAqCiAgICogSWYgYXQgZW5kIG9mIGZpbGUsIC0xIGlzIHJldHVybmVkLgogICAqLwogIGV4dGVybmFsIGludCByZWFkQnl0ZVN5bmMoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgdGVybWluYWwgYXR0YWNoZWQgdG8gc3RkaW4uCiAgICovCiAgYm9vbCBnZXQgaGFzVGVybWluYWwgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHN0ZGlvVHlwZSh0aGlzKSA9PSBTdGRpb1R5cGUudGVybWluYWw7CiAgICB9IG9uIEZpbGVTeXN0ZW1FeGNlcHRpb24gY2F0Y2ggKF8pIHsKICAgICAgLy8gSWYgc3RkaW9UeXBlIHRocm93cyBhIEZpbGVTeXN0ZW1FeGNlcHRpb24sIHRoZW4gaXQgaXMgbm90IGhvb2tlZCB1cCB0bwogICAgICAvLyBhIHRlcm1pbmFsLCBwcm9iYWJseSBiZWNhdXNlIGl0IGlzIGNsb3NlZCwgYnV0IGxldCBvdGhlciBleGNlcHRpb24KICAgICAgLy8gdHlwZXMgYnViYmxlIHVwLgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CgovKioKICogW1N0ZG91dF0gcmVwcmVzZW50cyB0aGUgW0lPU2lua10gZm9yIGVpdGhlciBgc3Rkb3V0YCBvciBgc3RkZXJyYC4KICoKICogSXQgcHJvdmlkZXMgYSAqYmxvY2tpbmcqIGBJT1NpbmtgLCBzbyB1c2luZyB0aGlzIHRvIHdyaXRlIHdpbGwgYmxvY2sgdW50aWwKICogdGhlIG91dHB1dCBpcyB3cml0dGVuLgogKgogKiBJbiBzb21lIHNpdHVhdGlvbnMgdGhpcyBibG9ja2luZyBiZWhhdmlvciBpcyB1bmRlc2lyYWJsZSBhcyBpdCBkb2VzIG5vdAogKiBwcm92aWRlIHRoZSBzYW1lIG5vbi1ibG9ja2luZyBiZWhhdmlvciBhcyBkYXJ0OmlvIGluIGdlbmVyYWwgZXhwb3Nlcy4KICogVXNlIHRoZSBwcm9wZXJ0eSBbbm9uQmxvY2tpbmddIHRvIGdldCBhbiBgSU9TaW5rYCB3aGljaCBoYXMgdGhlIG5vbi1ibG9ja2luZwogKiBiZWhhdmlvci4KICoKICogVGhpcyBjbGFzcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYHN0ZG91dGAgb3IgYHN0ZGVycmAgaXMKICogY29ubmVjdGVkIHRvIGEgdGVybWluYWwgYW5kIHF1ZXJ5IHNvbWUgdGVybWluYWwgcHJvcGVydGllcy4KICoKICogVGhlIFthZGRFcnJvcl0gQVBJIGlzIGluaGVyaXRlZCBmcm9tICBbU3RyZWFtU2lua10gYW5kIGNhbGxpbmcgaXQgd2lsbCByZXN1bHQKICogaW4gYW4gdW5oYW5kbGVkIGFzeW5jaHJvbm91cyBlcnJvciB1bmxlc3MgdGhlcmUgaXMgYW4gZXJyb3IgaGFuZGxlciBvbgogKiBbZG9uZV0uCiAqLwpjbGFzcyBTdGRvdXQgZXh0ZW5kcyBfU3RkU2luayBpbXBsZW1lbnRzIElPU2luayB7CiAgZmluYWwgaW50IF9mZDsKICBJT1NpbmsgX25vbkJsb2NraW5nOwoKICBTdGRvdXQuXyhJT1Npbmsgc2luaywgdGhpcy5fZmQpIDogc3VwZXIoc2luayk7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHRlcm1pbmFsIGF0dGFjaGVkIHRvIHN0ZG91dC4KICAgKi8KICBib29sIGdldCBoYXNUZXJtaW5hbCA9PiBfaGFzVGVybWluYWwoX2ZkKTsKCiAgLyoqCiAgICogR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgdGVybWluYWwuCiAgICoKICAgKiBJZiBubyB0ZXJtaW5hbCBpcyBhdHRhY2hlZCB0byBzdGRvdXQsIGEgW1N0ZG91dEV4Y2VwdGlvbl0gaXMgdGhyb3duLiBTZWUKICAgKiBbaGFzVGVybWluYWxdIGZvciBtb3JlIGluZm8uCiAgICovCiAgaW50IGdldCB0ZXJtaW5hbENvbHVtbnMgPT4gX3Rlcm1pbmFsQ29sdW1ucyhfZmQpOwoKICAvKioKICAgKiBHZXQgdGhlIG51bWJlciBvZiBsaW5lcyBvZiB0aGUgdGVybWluYWwuCiAgICoKICAgKiBJZiBubyB0ZXJtaW5hbCBpcyBhdHRhY2hlZCB0byBzdGRvdXQsIGEgW1N0ZG91dEV4Y2VwdGlvbl0gaXMgdGhyb3duLiBTZWUKICAgKiBbaGFzVGVybWluYWxdIGZvciBtb3JlIGluZm8uCiAgICovCiAgaW50IGdldCB0ZXJtaW5hbExpbmVzID0+IF90ZXJtaW5hbExpbmVzKF9mZCk7CgogIC8qKgogICAgKiBXaGV0aGVyIGNvbm5lY3RlZCB0byBhIHRlcm1pbmFsIHRoYXQgc3VwcG9ydHMgQU5TSSBlc2NhcGUgc2VxdWVuY2VzLgogICAgKgogICAgKiBOb3QgYWxsIHRlcm1pbmFscyBhcmUgcmVjb2duaXplZCwgYW5kIG5vdCBhbGwgcmVjb2duaXplZCB0ZXJtaW5hbHMgY2FuCiAgICAqIHJlcG9ydCB3aGV0aGVyIHRoZXkgc3VwcG9ydCBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMsIHNvIHRoaXMgdmFsdWUgaXMgYQogICAgKiBiZXN0LWVmZm9ydCBhdHRlbXB0IGF0IGRldGVjdGluZyB0aGUgc3VwcG9ydC4KICAgICoKICAgICogVGhlIGFjdHVhbCBlc2NhcGUgc2VxdWVuY2Ugc3VwcG9ydCBtYXkgZGlmZmVyIGJldHdlZW4gdGVybWluYWxzLAogICAgKiB3aXRoIHNvbWUgdGVybWluYWxzIHN1cHBvcnRpbmcgbW9yZSBlc2NhcGUgc2VxdWVuY2VzIHRoYW4gb3RoZXJzLAogICAgKiBhbmQgc29tZSB0ZXJtaW5hbHMgZXZlbiBkaWZmZXJpbmcgaW4gYmVoYXZpb3IgZm9yIHRoZSBzYW1lIGVzY2FwZQogICAgKiBzZXF1ZW5jZS4KICAgICoKICAgICogVGhlIEFOU0kgY29sb3Igc2VsZWN0aW9uIGlzIGdlbmVyYWxseSBzdXBwb3J0ZWQuCiAgICAqCiAgICAqIEN1cnJlbnRseSwgYSBgVEVSTWAgZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGB4dGVybWAKICAgICogd2lsbCBiZSB0YWtlbiBhcyBldmlkZW5jZSB0aGF0IEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkLgogICAgKiBPbiBXaW5kb3dzLCBvbmx5IHZlcnNpb25zIG9mIFdpbmRvd3MgMTAgYWZ0ZXIgdi4xNTExCiAgICAqICgiVEgyIiwgT1MgYnVpbGQgMTA1ODYpIHdpbGwgYmUgZGV0ZWN0ZWQgYXMgc3VwcG9ydGluZyB0aGUgb3V0cHV0IG9mCiAgICAqIEFOU0kgZXNjYXBlIHNlcXVlbmNlcywgYW5kIG9ubHkgdmVyc2lvbnMgYWZ0ZXIgdi4xNjA3ICgiQW5uaXZlcnNhcnkKICAgICogVXBkYXRlIiwgT1MgYnVpbGQgMTQzOTMpIHdpbGwgYmUgZGV0ZWN0ZWQgYXMgc3VwcG9ydGluZyB0aGUgaW5wdXQgb2YKICAgICogQU5TSSBlc2NhcGUgc2VxdWVuY2VzLgogICAgKi8KICBib29sIGdldCBzdXBwb3J0c0Fuc2lFc2NhcGVzID0+IF9zdXBwb3J0c0Fuc2lFc2NhcGVzKF9mZCk7CgogIGV4dGVybmFsIGJvb2wgX2hhc1Rlcm1pbmFsKGludCBmZCk7CiAgZXh0ZXJuYWwgaW50IF90ZXJtaW5hbENvbHVtbnMoaW50IGZkKTsKICBleHRlcm5hbCBpbnQgX3Rlcm1pbmFsTGluZXMoaW50IGZkKTsKICBleHRlcm5hbCBzdGF0aWMgYm9vbCBfc3VwcG9ydHNBbnNpRXNjYXBlcyhpbnQgZmQpOwoKICAvKioKICAgKiBHZXQgYSBub24tYmxvY2tpbmcgYElPU2lua2AuCiAgICovCiAgSU9TaW5rIGdldCBub25CbG9ja2luZyB7CiAgICBfbm9uQmxvY2tpbmcgPz89IG5ldyBJT1NpbmsobmV3IF9GaWxlU3RyZWFtQ29uc3VtZXIuZnJvbVN0ZGlvKF9mZCkpOwogICAgcmV0dXJuIF9ub25CbG9ja2luZzsKICB9Cn0KCmNsYXNzIFN0ZG91dEV4Y2VwdGlvbiBpbXBsZW1lbnRzIElPRXhjZXB0aW9uIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBmaW5hbCBPU0Vycm9yIG9zRXJyb3I7CgogIGNvbnN0IFN0ZG91dEV4Y2VwdGlvbih0aGlzLm1lc3NhZ2UsIFt0aGlzLm9zRXJyb3JdKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJTdGRvdXRFeGNlcHRpb246ICRtZXNzYWdlJHtvc0Vycm9yID09IG51bGwgPyAiIiA6ICIsICRvc0Vycm9yIn0iOwogIH0KfQoKY2xhc3MgU3RkaW5FeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgZmluYWwgT1NFcnJvciBvc0Vycm9yOwoKICBjb25zdCBTdGRpbkV4Y2VwdGlvbih0aGlzLm1lc3NhZ2UsIFt0aGlzLm9zRXJyb3JdKTsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuICJTdGRpbkV4Y2VwdGlvbjogJG1lc3NhZ2Uke29zRXJyb3IgPT0gbnVsbCA/ICIiIDogIiwgJG9zRXJyb3IifSI7CiAgfQp9CgpjbGFzcyBfU3RkQ29uc3VtZXIgaW1wbGVtZW50cyBTdHJlYW1Db25zdW1lcjxMaXN0PGludD4+IHsKICBmaW5hbCBfZmlsZTsKCiAgX1N0ZENvbnN1bWVyKGludCBmZCkgOiBfZmlsZSA9IF9GaWxlLl9vcGVuU3RkaW9TeW5jKGZkKTsKCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pIHsKICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyKCk7CiAgICB2YXIgc3ViOwogICAgc3ViID0gc3RyZWFtLmxpc3RlbigoZGF0YSkgewogICAgICB0cnkgewogICAgICAgIF9maWxlLndyaXRlRnJvbVN5bmMoZGF0YSk7CiAgICAgIH0gY2F0Y2ggKGUsIHMpIHsKICAgICAgICBzdWIuY2FuY2VsKCk7CiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoZSwgcyk7CiAgICAgIH0KICAgIH0sCiAgICAgICAgb25FcnJvcjogY29tcGxldGVyLmNvbXBsZXRlRXJyb3IsCiAgICAgICAgb25Eb25lOiBjb21wbGV0ZXIuY29tcGxldGUsCiAgICAgICAgY2FuY2VsT25FcnJvcjogdHJ1ZSk7CiAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKICB9CgogIEZ1dHVyZSBjbG9zZSgpIHsKICAgIF9maWxlLmNsb3NlU3luYygpOwogICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUoKTsKICB9Cn0KCmNsYXNzIF9TdGRTaW5rIGltcGxlbWVudHMgSU9TaW5rIHsKICBmaW5hbCBJT1NpbmsgX3Npbms7CgogIF9TdGRTaW5rKHRoaXMuX3NpbmspOwoKICBFbmNvZGluZyBnZXQgZW5jb2RpbmcgPT4gX3NpbmsuZW5jb2Rpbmc7CiAgdm9pZCBzZXQgZW5jb2RpbmcoRW5jb2RpbmcgZW5jb2RpbmcpIHsKICAgIF9zaW5rLmVuY29kaW5nID0gZW5jb2Rpbmc7CiAgfQoKICB2b2lkIHdyaXRlKG9iamVjdCkgewogICAgX3Npbmsud3JpdGUob2JqZWN0KTsKICB9CgogIHZvaWQgd3JpdGVsbihbb2JqZWN0ID0gIiJdKSB7CiAgICBfc2luay53cml0ZWxuKG9iamVjdCk7CiAgfQoKICB2b2lkIHdyaXRlQWxsKG9iamVjdHMsIFtzZXAgPSAiIl0pIHsKICAgIF9zaW5rLndyaXRlQWxsKG9iamVjdHMsIHNlcCk7CiAgfQoKICB2b2lkIGFkZChMaXN0PGludD4gZGF0YSkgewogICAgX3NpbmsuYWRkKGRhdGEpOwogIH0KCiAgdm9pZCBhZGRFcnJvcihlcnJvciwgW1N0YWNrVHJhY2Ugc3RhY2tUcmFjZV0pIHsKICAgIF9zaW5rLmFkZEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKICB9CgogIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpIHsKICAgIF9zaW5rLndyaXRlQ2hhckNvZGUoY2hhckNvZGUpOwogIH0KCiAgRnV0dXJlIGFkZFN0cmVhbShTdHJlYW08TGlzdDxpbnQ+PiBzdHJlYW0pID0+IF9zaW5rLmFkZFN0cmVhbShzdHJlYW0pOwogIEZ1dHVyZSBmbHVzaCgpID0+IF9zaW5rLmZsdXNoKCk7CiAgRnV0dXJlIGNsb3NlKCkgPT4gX3NpbmsuY2xvc2UoKTsKICBGdXR1cmUgZ2V0IGRvbmUgPT4gX3NpbmsuZG9uZTsKfQoKLy8vIFRoZSB0eXBlIG9mIG9iamVjdCBhIHN0YW5kYXJkIElPIHN0cmVhbSBpcyBhdHRhY2hlZCB0by4KY2xhc3MgU3RkaW9UeXBlIHsKICBzdGF0aWMgY29uc3QgU3RkaW9UeXBlIHRlcm1pbmFsID0gY29uc3QgU3RkaW9UeXBlLl8oInRlcm1pbmFsIik7CiAgc3RhdGljIGNvbnN0IFN0ZGlvVHlwZSBwaXBlID0gY29uc3QgU3RkaW9UeXBlLl8oInBpcGUiKTsKICBzdGF0aWMgY29uc3QgU3RkaW9UeXBlIGZpbGUgPSBjb25zdCBTdGRpb1R5cGUuXygiZmlsZSIpOwogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgb3RoZXIgPSBjb25zdCBTdGRpb1R5cGUuXygib3RoZXIiKTsKCiAgQERlcHJlY2F0ZWQoIlVzZSB0ZXJtaW5hbCBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU3RkaW9UeXBlIFRFUk1JTkFMID0gdGVybWluYWw7CiAgQERlcHJlY2F0ZWQoIlVzZSBwaXBlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgUElQRSA9IHBpcGU7CiAgQERlcHJlY2F0ZWQoIlVzZSBmaWxlIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTdGRpb1R5cGUgRklMRSA9IGZpbGU7CiAgQERlcHJlY2F0ZWQoIlVzZSBvdGhlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU3RkaW9UeXBlIE9USEVSID0gb3RoZXI7CgogIGZpbmFsIFN0cmluZyBuYW1lOwogIGNvbnN0IFN0ZGlvVHlwZS5fKHRoaXMubmFtZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlN0ZGlvVHlwZTogJG5hbWUiOwp9CgpTdGRpbiBfc3RkaW47ClN0ZG91dCBfc3Rkb3V0OwpTdGRvdXQgX3N0ZGVycjsKCi8vIFRoZXNlIG1heSBiZSBzZXQgdG8gZGlmZmVyZW50IHZhbHVlcyBieSB0aGUgZW1iZWRkZXIgYnkgY2FsbGluZwovLyBfc2V0U3RkaW9GRHMgd2hlbiBpbml0aWFsaXppbmcgZGFydDppby4KaW50IF9zdGRpbkZEID0gMDsKaW50IF9zdGRvdXRGRCA9IDE7CmludCBfc3RkZXJyRkQgPSAyOwoKQHByYWdtYSgndm06ZW50cnktcG9pbnQnLCAnY2FsbCcpCnZvaWQgX3NldFN0ZGlvRkRzKGludCBzdGRpbiwgaW50IHN0ZG91dCwgaW50IHN0ZGVycikgewogIF9zdGRpbkZEID0gc3RkaW47CiAgX3N0ZG91dEZEID0gc3Rkb3V0OwogIF9zdGRlcnJGRCA9IHN0ZGVycjsKfQoKLy8vIFRoZSBzdGFuZGFyZCBpbnB1dCBzdHJlYW0gb2YgZGF0YSByZWFkIGJ5IHRoaXMgcHJvZ3JhbS4KU3RkaW4gZ2V0IHN0ZGluIHsKICBfc3RkaW4gPz89IF9TdGRJT1V0aWxzLl9nZXRTdGRpb0lucHV0U3RyZWFtKF9zdGRpbkZEKTsKICByZXR1cm4gX3N0ZGluOwp9CgovLy8gVGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0gb2YgZGF0YSB3cml0dGVuIGJ5IHRoaXMgcHJvZ3JhbS4KLy8vCi8vLyBUaGUgYGFkZEVycm9yYCBBUEkgaXMgaW5oZXJpdGVkIGZyb20gIGBTdHJlYW1TaW5rYCBhbmQgY2FsbGluZyBpdCB3aWxsCi8vLyByZXN1bHQgaW4gYW4gdW5oYW5kbGVkIGFzeW5jaHJvbm91cyBlcnJvciB1bmxlc3MgdGhlcmUgaXMgYW4gZXJyb3IgaGFuZGxlcgovLy8gb24gYGRvbmVgLgpTdGRvdXQgZ2V0IHN0ZG91dCB7CiAgX3N0ZG91dCA/Pz0gX1N0ZElPVXRpbHMuX2dldFN0ZGlvT3V0cHV0U3RyZWFtKF9zdGRvdXRGRCk7CiAgcmV0dXJuIF9zdGRvdXQ7Cn0KCi8vLyBUaGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSBvZiBlcnJvcnMgd3JpdHRlbiBieSB0aGlzIHByb2dyYW0uCi8vLwovLy8gVGhlIGBhZGRFcnJvcmAgQVBJIGlzIGluaGVyaXRlZCBmcm9tICBgU3RyZWFtU2lua2AgYW5kIGNhbGxpbmcgaXQgd2lsbAovLy8gcmVzdWx0IGluIGFuIHVuaGFuZGxlZCBhc3luY2hyb25vdXMgZXJyb3IgdW5sZXNzIHRoZXJlIGlzIGFuIGVycm9yIGhhbmRsZXIKLy8vIG9uIGBkb25lYC4KU3Rkb3V0IGdldCBzdGRlcnIgewogIF9zdGRlcnIgPz89IF9TdGRJT1V0aWxzLl9nZXRTdGRpb091dHB1dFN0cmVhbShfc3RkZXJyRkQpOwogIHJldHVybiBfc3RkZXJyOwp9CgovLy8gRm9yIGEgc3RyZWFtLCByZXR1cm5zIHdoZXRoZXIgaXQgaXMgYXR0YWNoZWQgdG8gYSBmaWxlLCBwaXBlLCB0ZXJtaW5hbCwgb3IKLy8vIHNvbWV0aGluZyBlbHNlLgpTdGRpb1R5cGUgc3RkaW9UeXBlKG9iamVjdCkgewogIGlmIChvYmplY3QgaXMgX1N0ZFN0cmVhbSkgewogICAgb2JqZWN0ID0gb2JqZWN0Ll9zdHJlYW07CiAgfSBlbHNlIGlmIChvYmplY3QgPT0gc3Rkb3V0IHx8IG9iamVjdCA9PSBzdGRlcnIpIHsKICAgIGludCBzdGRpb2ZkID0gb2JqZWN0ID09IHN0ZG91dCA/IF9zdGRvdXRGRCA6IF9zdGRlcnJGRDsKICAgIHN3aXRjaCAoX1N0ZElPVXRpbHMuX2dldFN0ZGlvSGFuZGxlVHlwZShzdGRpb2ZkKSkgewogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbDoKICAgICAgICByZXR1cm4gU3RkaW9UeXBlLnRlcm1pbmFsOwogICAgICBjYXNlIF9zdGRpb0hhbmRsZVR5cGVQaXBlOgogICAgICAgIHJldHVybiBTdGRpb1R5cGUucGlwZTsKICAgICAgY2FzZSBfc3RkaW9IYW5kbGVUeXBlRmlsZToKICAgICAgICByZXR1cm4gU3RkaW9UeXBlLmZpbGU7CiAgICB9CiAgfQogIGlmIChvYmplY3QgaXMgX0ZpbGVTdHJlYW0pIHsKICAgIHJldHVybiBTdGRpb1R5cGUuZmlsZTsKICB9CiAgaWYgKG9iamVjdCBpcyBTb2NrZXQpIHsKICAgIGludCBzb2NrZXRUeXBlID0gX1N0ZElPVXRpbHMuX3NvY2tldFR5cGUob2JqZWN0KTsKICAgIGlmIChzb2NrZXRUeXBlID09IG51bGwpIHJldHVybiBTdGRpb1R5cGUub3RoZXI7CiAgICBzd2l0Y2ggKHNvY2tldFR5cGUpIHsKICAgICAgY2FzZSBfc3RkaW9IYW5kbGVUeXBlVGVybWluYWw6CiAgICAgICAgcmV0dXJuIFN0ZGlvVHlwZS50ZXJtaW5hbDsKICAgICAgY2FzZSBfc3RkaW9IYW5kbGVUeXBlUGlwZToKICAgICAgICByZXR1cm4gU3RkaW9UeXBlLnBpcGU7CiAgICAgIGNhc2UgX3N0ZGlvSGFuZGxlVHlwZUZpbGU6CiAgICAgICAgcmV0dXJuIFN0ZGlvVHlwZS5maWxlOwogICAgfQogIH0KICBpZiAob2JqZWN0IGlzIF9JT1NpbmtJbXBsKSB7CiAgICB0cnkgewogICAgICBpZiAob2JqZWN0Ll90YXJnZXQgaXMgX0ZpbGVTdHJlYW1Db25zdW1lcikgewogICAgICAgIHJldHVybiBTdGRpb1R5cGUuZmlsZTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBPbmx5IHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQsIF9zaW5rIG5vdCBhdmFpbGFibGUuCiAgICB9CiAgfQogIHJldHVybiBTdGRpb1R5cGUub3RoZXI7Cn0KCmNsYXNzIF9TdGRJT1V0aWxzIHsKICBleHRlcm5hbCBzdGF0aWMgX2dldFN0ZGlvT3V0cHV0U3RyZWFtKGludCBmZCk7CiAgZXh0ZXJuYWwgc3RhdGljIFN0ZGluIF9nZXRTdGRpb0lucHV0U3RyZWFtKGludCBmZCk7CgogIC8vLyBSZXR1cm5zIHRoZSBzb2NrZXQgdHlwZSBvciBgbnVsbGAgaWYgW3NvY2tldF0gaXMgbm90IGEgYnVpbHRpbiBzb2NrZXQuCiAgZXh0ZXJuYWwgc3RhdGljIGludCBfc29ja2V0VHlwZShTb2NrZXQgc29ja2V0KTsKICBleHRlcm5hbCBzdGF0aWMgX2dldFN0ZGlvSGFuZGxlVHlwZShpbnQgZmQpOwp9CoHiAE5OPAERASgkJCYlAS0jARwBRT8iSQQCAQRMEQM7BD4LAT8BBh0FLAVQTx4FOkAFTlElBUo2OwYXSRMTJEEtNBMaEAsfGBEKGDwaFQgeQxUjGCkRCi0YCA1NDRUjHxoPIykBGiA3ChgpEQoYCAYiBAEGLwYeAQYtBTwFQQVQBiwBBi8GHgEGLQVPOQVBBVIGLAEGSwZNTDQGR0hIEAY3Bk1KO0tKSx0HKQEGUBAFKAYfAQY8BhkKNClQTBoUBgQCAQRFA04aA0tJUA0DSD8DUUoLBDIRFwExAQY9Bi0BBjAFTiIGNAEGLgVOIgYwAQZLBk1MNAZHSEgQBjcGTUo7S0pLHQc9ASYpJzUBBiIGG0kZBAIBLxgZATcBFk4EAgEuGBkBNgEWTQQCAToPATsBLyUNIQwjFxYnCAcqJB4dBAETFx8EAgEjFgEYASspHwQBFxkEASAbBAEnIgQBHRUEATInBAElIwQBSSMjIQIBPBJDOzs9ASYuIiYiJiMoARUgKwIBDhAQAUMrEhMTASI3FBYWAgE8EjkRAgFABEtPDxQ8EgIBQgRLTw8UPBICAU8UHh4dNTw4JSMhHyEfBgQfGwQaNjQaJSMhHyEfBgQfCjMfCBI+BgQaAgEUMTYBTTIvAgESZGFydDppby9zdGRpby5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vY29tbW9uX3BhdGNoLmRhcnSHMC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8gTm90ZTogdGhlIFZNIGNvbmNhdGVuYXRlcyBhbGwgcGF0Y2ggZmlsZXMgaW50byBhIHNpbmdsZSBwYXRjaCBmaWxlLiBUaGlzCi8vLyBmaWxlIGlzIHRoZSBmaXJzdCBwYXRjaCBpbiAiZGFydDppbyIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBpbXBvcnRzIHVzZWQgYnkKLy8vIHBhdGNoZXMgb2YgdGhhdCBsaWJyYXJ5LiBXZSBwbGFuIHRvIGNoYW5nZSB0aGlzIHdoZW4gd2UgaGF2ZSBhIHNoYXJlZCBmcm9udAovLy8gZW5kIGFuZCBzaW1wbHkgdXNlIHBhcnRzLgoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgc2hvdyBWTUxpYnJhcnlIb29rcywgcGF0Y2g7CgppbXBvcnQgImRhcnQ6YXN5bmMiCiAgICBzaG93CiAgICAgICAgQ29tcGxldGVyLAogICAgICAgIEZ1dHVyZSwKICAgICAgICBTdHJlYW0sCiAgICAgICAgU3RyZWFtQ29uc3VtZXIsCiAgICAgICAgU3RyZWFtQ29udHJvbGxlciwKICAgICAgICBTdHJlYW1TdWJzY3JpcHRpb24sCiAgICAgICAgVGltZXIsCiAgICAgICAgWm9uZSwKICAgICAgICBzY2hlZHVsZU1pY3JvdGFzazsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBzaG93IEhhc2hNYXA7CgppbXBvcnQgImRhcnQ6Y29udmVydCIgc2hvdyBFbmNvZGluZywgdXRmODsKCmltcG9ydCAiZGFydDpkZXZlbG9wZXIiIHNob3cgcmVnaXN0ZXJFeHRlbnNpb247CgppbXBvcnQgImRhcnQ6aXNvbGF0ZSIgc2hvdyBSYXdSZWNlaXZlUG9ydCwgUmVjZWl2ZVBvcnQsIFNlbmRQb3J0OwoKaW1wb3J0ICJkYXJ0Om1hdGgiIHNob3cgbWluOwoKaW1wb3J0ICJkYXJ0Om5hdGl2ZXdyYXBwZXJzIiBzaG93IE5hdGl2ZUZpZWxkV3JhcHBlckNsYXNzMTsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIiBzaG93IFVpbnQ4TGlzdDsKCi8vLyBUaGVzZSBhcmUgdGhlIGFkZGl0aW9uYWwgcGFydHMgb2YgdGhpcyBwYXRjaCBsaWJyYXJ5OgovLyBwYXJ0ICJkaXJlY3RvcnlfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImV2ZW50aGFuZGxlcl9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZmlsZV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZmlsZV9zeXN0ZW1fZW50aXR5X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJmaWx0ZXJfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImlvX3NlcnZpY2VfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInBsYXRmb3JtX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJwcm9jZXNzX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzb2NrZXRfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInN0ZGlvX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzZWN1cmVfc29ja2V0X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJzeW5jX3NvY2tldF9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBfSU9DcnlwdG8gewogIEBwYXRjaAogIHN0YXRpYyBVaW50OExpc3QgZ2V0UmFuZG9tQnl0ZXMoaW50IGNvdW50KSBuYXRpdmUgIkNyeXB0b19HZXRSYW5kb21CeXRlcyI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQpfc2V0dXBIb29rcygpIHsKICBWTUxpYnJhcnlIb29rcy5ldmVudEhhbmRsZXJTZW5kRGF0YSA9IF9FdmVudEhhbmRsZXIuX3NlbmREYXRhOwogIFZNTGlicmFyeUhvb2tzLnRpbWVyTWlsbGlzZWNvbmRDbG9jayA9IF9FdmVudEhhbmRsZXIuX3RpbWVyTWlsbGlzZWNvbmRDbG9jazsKfQpAAE5OPAFNUFAeATQBFAkTEBAYGhwPDhsBJwErATABQgEdATwBKQE6ICMbKR0hHx4dHCQiAQcSCU0CASIQQU8CAR9kYXJ0OmlvLXBhdGNoL2NvbW1vbl9wYXRjaC5kYXJ0KG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jbGkvY2xpLmRhcnSBPy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLy8ge0BjYXRlZ29yeSBWTX0KbGlicmFyeSBkYXJ0LmNsaTsKCmltcG9ydCAnZGFydDphc3luYyc7CmltcG9ydCAnZGFydDptYXRoJzsKCnBhcnQgJ3dhaXRfZm9yLmRhcnQnOwoNAE5OPAETEgEVFAEWAQhkYXJ0OmNsaS1vcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY2xpL3dhaXRfZm9yLmRhcnSYXS8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY2xpOwoKLyoqCiAqIFN5bmNocm9ub3VzbHkgYmxvY2tzIHRoZSBjYWxsaW5nIGlzb2xhdGUgdG8gd2FpdCBmb3IgYXN5bmNocm9ub3VzIGV2ZW50cyB0bwogKiBjb21wbGV0ZS4KICoKICogSWYgdGhlIFt0aW1lb3V0XSBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQsIFt3YWl0Rm9yRXZlbnRdIHdpbGwgcmV0dXJuIGFmdGVyCiAqIHRoZSBzcGVjaWZpZWQgdGltZW91dCBldmVuIGlmIG5vIGV2ZW50cyBoYXZlIG9jY3VycmVkLgogKgogKiBUaGlzIGNhbGwgZG9lcyB0aGUgZm9sbG93aW5nOgogKiAtIHN1c3BlbmRzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGFjaywKICogLSBydW5zIHRoZSBtaWNyb3Rhc2sgcXVldWUgdW50aWwgaXQgaXMgZW1wdHksCiAqIC0gd2FpdHMgdW50aWwgdGhlIG1lc3NhZ2UgcXVldWUgaXMgbm90IGVtcHR5LAogKiAtIGhhbmRsZXMgbWVzc2FnZXMgb24gdGhlIG1lc3NhZ2UgcXVldWUsIHBsdXMgdGhlaXIgYXNzb2NpYXRlZCBtaWNyb3Rhc2tzLAogKiAgIHVudGlsIHRoZSBtZXNzYWdlIHF1ZXVlIGlzIGVtcHR5LAogKiAtIHJlc3VtZXMgdGhlIG9yaWdpbmFsIHN0YWNrLgogKgogKiBUaGlzIGZ1bmN0aW9uIGJyZWFrcyB0aGUgdXN1YWwgcHJvbWlzZSBvZmZlcmVkIGJ5IERhcnQgc2VtYW50aWNzIHRoYXQKICogbWVzc2FnZSBoYW5kbGVycyBhbmQgbWljcm90YXNrcyBydW4gdG8gY29tcGxldGlvbiBiZWZvcmUgdGhlIG5leHQgbWVzc2FnZQogKiBoYW5kbGVyIG9yIG1pY3JvdGFzayBiZWdpbnMgdG8gcnVuLiBPZiBwYXJ0aWN1bGFyIG5vdGUgaXMgdGhhdCB1c2Ugb2YgdGhpcwogKiBmdW5jdGlvbiBpbiBhIGZpbmFsbHkgYmxvY2sgd2lsbCBhbGxvdyBtaWNyb3Rhc2tzIGFuZCBtZXNzYWdlIGhhbmRsZXJzIHRvCiAqIHJ1biBiZWZvcmUgYWxsIGZpbmFsbHkgYmxvY2tzIGZvciBhbiBleGNlcHRpb24gaGF2ZSBjb21wbGV0ZWQsIHBvc3NpYmx5CiAqIGJyZWFraW5nIGludmFyaWFudHMgaW4geW91ciBwcm9ncmFtLgogKgogKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc3luY2hyb25vdXNseSB0aHJvdyB0aGUgZmlyc3QgdW5oYW5kbGVkIGV4Y2VwdGlvbiBpdAogKiBlbmNvdW50ZXJzIGluIHJ1bm5pbmcgdGhlIG1pY3JvdGFza3MgYW5kIG1lc3NhZ2UgaGFuZGxlcnMgYXMgdGhvdWdoIHRoZQogKiB0aHJvd2luZyBtaWNyb3Rhc2sgb3IgbWVzc2FnZSBoYW5kbGVyIHdhcyB0aGUgb25seSBEYXJ0IGludm9jYXRpb24gb24gdGhlCiAqIHN0YWNrLiBUaGF0IGlzLCB1bmhhbmRsZWQgZXhjZXB0aW9ucyBpbiBhIG1pY3JvdGFzayBvciBtZXNzYWdlIGhhbmRsZXIgd2lsbAogKiBza2lwIG92ZXIgc3RhY2tzIHN1c3BlbmRlZCBpbiBhIGNhbGwgdG8gW3dhaXRGb3JFdmVudF0uCiAqCiAqIENhbGxzIHRvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIG5lc3RlZC4gRWFybGllciBpbnZvY2F0aW9ucyB3aWxsIG5vdAogKiBiZSBhYmxlIHRvIGNvbXBsZXRlIHVudGlsIHN1YnNlcXVlbnQgb25lcyBkby4gTWVzc2FnZXMgdGhhdCBhcnJpdmUgYWZ0ZXIKICogYSBzdWJzZXF1ZW50IGludm9jYXRpb24gYXJlICJjb25zdW1lZCIgYnkgdGhhdCBpbnZvY2F0aW9uLCBhbmQgZG8gbm90CiAqIHVuYmxvY2sgYW4gZWFybGllciBpbnZvY2F0aW9uLiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBuZXN0aW5nIGNhbGxzIHRvCiAqIFt3YWl0Rm9yRXZlbnRdIGNhbiBsZWFkIHRvIGRlYWRsb2NrIHdoZW4gc3Vic2VxdWVudCBjYWxscyBibG9jayB0byB3YWl0IGZvcgogKiBhIGNvbmRpdGlvbiB0aGF0IGlzIG9ubHkgc2F0aXNmaWVkIGFmdGVyIGFuIGVhcmxpZXIgY2FsbCByZXR1cm5zLgogKgogKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgY2FsbCBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgc3RhbmRhbG9uZSBjb21tYW5kLWxpbmUKICogRGFydCBWTS4gRnVydGhlciwgYmVjYXVzZSBpdCBzdXNwZW5kcyB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2sgdW50aWwgdGhlCiAqIG1lc3NhZ2UgcXVldWUgaXMgZW1wdHksIGV2ZW4gd2hlbiBydW5uaW5nIGluIHRoZSBzdGFuZGFsb25lIGNvbW1hbmQtbGluZSBWTQogKiB0aGVyZSBleGlzdHMgYSByaXNrIHRoYXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YWNrIHdpbGwgYmUgc3RhcnZlZC4KICovCmV4dGVybmFsIHZvaWQgX3dhaXRGb3JFdmVudChpbnQgdGltZW91dE1pbGxpcyk7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCnZvaWQgRnVuY3Rpb24oaW50KSBfZ2V0V2FpdEZvckV2ZW50KCkgPT4gX3dhaXRGb3JFdmVudDsKCi8vIFRoaXMgc2hvdWxkIGJlIHNldCBmcm9tIEMrKyBjb2RlIGJ5IHRoZSBlbWJlZGRlciB0byB3aXJlIHVwIHdhaXRGb3IoKSB0byB0aGUKLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uLiBJbiB0aGUgc3RhbmRhbG9uZSBWTSB0aGlzIGlzIHNldCB0byBfd2FpdEZvckV2ZW50KCkKLy8gYWJvdmUuIElmIGl0IGlzIG51bGwsIGNhbGxpbmcgd2FpdEZvcigpIHdpbGwgdGhyb3cgYW4gVW5zdXBwb3J0ZWRFcnJvci4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQp2b2lkIEZ1bmN0aW9uKGludCkgX3dhaXRGb3JFdmVudENsb3N1cmU7CgpjbGFzcyBfV2FpdEZvclV0aWxzIHsKICBzdGF0aWMgdm9pZCB3YWl0Rm9yRXZlbnQoe0R1cmF0aW9uIHRpbWVvdXR9KSB7CiAgICBpZiAoX3dhaXRGb3JFdmVudENsb3N1cmUgPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigid2FpdEZvciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZW1iZWRkZXIiKTsKICAgIH0KICAgIF93YWl0Rm9yRXZlbnRDbG9zdXJlKHRpbWVvdXQgPT0gbnVsbCA/IDAgOiBtYXgoMSwgdGltZW91dC5pbk1pbGxpc2Vjb25kcykpOwogIH0KfQoKLyoqCiAqIFN1c3BlbmRzIHRoZSBzdGFjaywgcnVucyBtaWNyb3Rhc2tzLCBhbmQgaGFuZGxlcyBpbmNvbWluZyBldmVudHMgdW50aWwKICogW2Z1dHVyZV0gY29tcGxldGVzLgogKgogKiBXQVJOSU5HOiBFWFBFUklNRU5UQUwuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgogKgogKiBUaGlzIGNhbGwgZG9lcyB0aGUgZm9sbG93aW5nOgogKiAtIFdoaWxlIFtmdXR1cmVdIGlzIG5vdCBjb21wbGV0ZWQ6CiAqICAgLSBzdXNwZW5kcyB0aGUgY3VycmVudCBleGVjdXRpb24gc3RhY2ssCiAqICAgLSBydW5zIHRoZSBtaWNyb3Rhc2sgcXVldWUgdW50aWwgaXQgaXMgZW1wdHksCiAqICAgLSB3YWl0cyB1bnRpbCB0aGUgbWVzc2FnZSBxdWV1ZSBpcyBub3QgZW1wdHksCiAqICAgLSBoYW5kbGVzIG1lc3NhZ2VzIG9uIHRoZSBtZXNzYWdlIHF1ZXVlLCBwbHVzIHRoZWlyIGFzc29jaWF0ZWQgbWljcm90YXNrcywKICogICAgIHVudGlsIHRoZSBtZXNzYWdlIHF1ZXVlIGlzIGVtcHR5LAogKiAgIC0gcmVzdW1lcyB0aGUgb3JpZ2luYWwgc3RhY2suCiAqCiAqIFRoaXMgZnVuY3Rpb24gYnJlYWtzIHRoZSB1c3VhbCBwcm9taXNlIG9mZmVyZWQgYnkgRGFydCBzZW1hbnRpY3MgdGhhdAogKiBtZXNzYWdlIGhhbmRsZXJzIGFuZCBtaWNyb3Rhc2tzIHJ1biB0byBjb21wbGV0aW9uIGJlZm9yZSB0aGUgbmV4dCBtZXNzYWdlCiAqIGhhbmRsZXIgb3IgbWljcm90YXNrIGJlZ2lucyB0byBydW4uIE9mIHBhcnRpY3VsYXIgbm90ZSBpcyB0aGF0IHVzZSBvZiB0aGlzCiAqIGZ1bmN0aW9uIGluIGEgZmluYWxseSBibG9jayB3aWxsIGFsbG93IG1pY3JvdGFza3MgYW5kIG1lc3NhZ2UgaGFuZGxlcnMgdG8KICogcnVuIGJlZm9yZSBhbGwgZmluYWxseSBibG9ja3MgZm9yIGFuIGV4Y2VwdGlvbiBoYXZlIGNvbXBsZXRlZCwgcG9zc2libHkKICogYnJlYWtpbmcgaW52YXJpYW50cyBpbiB5b3VyIHByb2dyYW0uCiAqCiAqIFVzZSBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgbGFzdCByZXNvcnQgd2hlbiBpdCBpcyBub3QKICogcG9zc2libGUgdG8gY29udmVydCBhIERhcnQgcHJvZ3JhbSBlbnRpcmVseSB0byBhbiBhc3luY2hyb25vdXMgc3R5bGUgdXNpbmcKICogYGFzeW5jYCBhbmQgYGF3YWl0YC4KICoKICogSWYgdGhlIFtGdXR1cmVdIGNvbXBsZXRlcyBub3JtYWxseSwgaXRzIHJlc3VsdCBpcyByZXR1cm5lZC4gSWYgdGhlIFtGdXR1cmVdCiAqIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLCB0aGUgZXJyb3IgYW5kIHN0YWNrIHRyYWNlIGFyZSB3cmFwcGVkIGluIGFuCiAqIFtBc3luY0Vycm9yXSBhbmQgdGhyb3duLiBJZiBhIG1pY3JvdGFzayBvciBtZXNzYWdlIGhhbmRsZXIgcnVuIGR1cmluZyB0aGlzCiAqIGNhbGwgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLCB0aGF0IGV4Y2VwdGlvbiB3aWxsIGJlIHByb3BhZ2F0ZWQKICogYXMgdGhvdWdoIHRoZSBtaWNyb3Rhc2sgb3IgbWVzc2FnZSBoYW5kbGVyIHdhcyB0aGUgb25seSBEYXJ0IGludm9jYXRpb24gb24KICogdGhlIHN0YWNrLiBUaGF0IGlzLCB1bmhhbmRsZWQgZXhjZXB0aW9ucyBpbiBhIG1pY3JvdGFzayBvciBtZXNzYWdlIGhhbmRsZXIKICogd2lsbCBza2lwIG92ZXIgc3RhY2tzIHN1c3BlbmRlZCBpbiBhIGNhbGwgdG8gW3dhaXRGb3JdLgogKgogKiBJZiB0aGUgb3B0aW9uYWwgYHRpbWVvdXRgIHBhcmFtZXRlciBpcyBwYXNzZWQsIFt3YWl0Rm9yXSB0aHJvd3MgYQogKiBbVGltZW91dEV4Y2VwdGlvbl0gaWYgdGhlIFtGdXR1cmVdIGlzIG5vdCBjb21wbGV0ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQKICogcGVyaW9kLgogKgogKiBDYWxscyB0byBbd2FpdEZvcl0gbWF5IGJlIG5lc3RlZC4gRWFybGllciBpbnZvY2F0aW9ucyB3aWxsIG5vdCBjb21wbGV0ZQogKiB1bnRpbCBzdWJzZXF1ZW50IG9uZXMgZG8sIGJ1dCB0aGUgY29tcGxldGlvbiBvZiBhIHN1YnNlcXVlbnQgaW52b2NhdGlvbiB3aWxsCiAqIGNhdXNlIHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uIHRvIHdha2UgdXAgYW5kIGNoZWNrIGl0cyBbRnV0dXJlXSBmb3IKICogY29tcGxldGlvbi4KICoKICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgbmVzdGluZyBjYWxscyB0byBbd2FpdEZvcl0gY2FuIGxlYWQgdG8gZGVhZGxvY2sgaWYKICogc3Vic2VxdWVudCBjYWxscyBibG9jayB3YWl0aW5nIGZvciBhIGNvbmRpdGlvbiB0aGF0IGlzIG9ubHkgc2F0aXNmaWVkIHdoZW4KICogYW4gZWFybGllciBjYWxsIHJldHVybnMuCiAqLwpUIHdhaXRGb3I8VD4oRnV0dXJlPFQ+IGZ1dHVyZSwge0R1cmF0aW9uIHRpbWVvdXR9KSB7CiAgVCByZXN1bHQ7CiAgYm9vbCBmdXR1cmVDb21wbGV0ZWQgPSBmYWxzZTsKICBPYmplY3QgZXJyb3I7CiAgU3RhY2tUcmFjZSBzdGFja3RyYWNlOwogIGZ1dHVyZS50aGVuKChyKSB7CiAgICBmdXR1cmVDb21wbGV0ZWQgPSB0cnVlOwogICAgcmVzdWx0ID0gcjsKICB9LCBvbkVycm9yOiAoZSwgc3QpIHsKICAgIGVycm9yID0gZTsKICAgIHN0YWNrdHJhY2UgPSBzdDsKICB9KTsKCiAgU3RvcHdhdGNoIHM7CiAgaWYgKHRpbWVvdXQgIT0gbnVsbCkgewogICAgcyA9IG5ldyBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICB9CiAgVGltZXIucnVuKCgpIHt9KTsgLy8gRW51c3JlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBtZXNzYWdlLgogIHdoaWxlICghZnV0dXJlQ29tcGxldGVkICYmIChlcnJvciA9PSBudWxsKSkgewogICAgRHVyYXRpb24gcmVtYWluaW5nOwogICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkgewogICAgICBpZiAocy5lbGFwc2VkID49IHRpbWVvdXQpIHsKICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigid2FpdEZvcigpIHRpbWVkIG91dCIsIHRpbWVvdXQpOwogICAgICB9CiAgICAgIHJlbWFpbmluZyA9IHRpbWVvdXQgLSBzLmVsYXBzZWQ7CiAgICB9CiAgICBfV2FpdEZvclV0aWxzLndhaXRGb3JFdmVudCh0aW1lb3V0OiByZW1haW5pbmcpOwogIH0KICBpZiAodGltZW91dCAhPSBudWxsKSB7CiAgICBzLnN0b3AoKTsKICB9CiAgVGltZXIucnVuKCgpIHt9KTsgLy8gRW5zdXJlIHRoYXQgcHJldmlvdXMgY2FsbHMgdG8gd2FpdEZvciBhcmUgd29rZW4gdXAuCgogIGlmIChlcnJvciAhPSBudWxsKSB7CiAgICB0aHJvdyBuZXcgQXN5bmNFcnJvcihlcnJvciwgc3RhY2t0cmFjZSk7CiAgfQoKICByZXR1cm4gcmVzdWx0Owp9CoCaAE5OPAESAQRPDQNMOgMhKzExTichA0lNTk1LKANLS01POwNGTElIT0UDT09PSQQwARo4AVBOSxopARYxKE8GUAQCAQRKFwMwAyEmLTMzUCkjA0lNTk1LKANKThgDT0hOTU5OOwNFTAsDS1BHDwNLThwENQwgEBkUHBAYDxUGAQ8ZIgQ9MBgbIkQIJwY0BBkOBEsBFy0EARECARZkYXJ0OmNsaS93YWl0X2Zvci5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9iaW4vY2xpX3BhdGNoLmRhcnSBRi8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgppbXBvcnQgImRhcnQ6X2ludGVybmFsIiBzaG93IHBhdGNoOwoKQHBhdGNoCnZvaWQgX3dhaXRGb3JFdmVudChpbnQgdGltZW91dE1pbGxpcykgbmF0aXZlICJDTElfV2FpdEZvckV2ZW50IjsKCgBOTjwBJAEHQQEdZGFydDpjbGktcGF0Y2gvY2xpX3BhdGNoLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvY29yZS5kYXJ0me0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLyoqCiAqCiAqIEJ1aWx0LWluIHR5cGVzLCBjb2xsZWN0aW9ucywKICogYW5kIG90aGVyIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgZXZlcnkgRGFydCBwcm9ncmFtLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgYXV0b21hdGljYWxseSBpbXBvcnRlZC4KICoKICogU29tZSBjbGFzc2VzIGluIHRoaXMgbGlicmFyeSwKICogc3VjaCBhcyBbU3RyaW5nXSBhbmQgW251bV0sCiAqIHN1cHBvcnQgRGFydCdzIGJ1aWx0LWluIGRhdGEgdHlwZXMuCiAqIE90aGVyIGNsYXNzZXMsIHN1Y2ggYXMgW0xpc3RdIGFuZCBbTWFwXSwgcHJvdmlkZSBkYXRhIHN0cnVjdHVyZXMKICogZm9yIG1hbmFnaW5nIGNvbGxlY3Rpb25zIG9mIG9iamVjdHMuCiAqIEFuZCBzdGlsbCBvdGhlciBjbGFzc2VzIHJlcHJlc2VudCBjb21tb25seSB1c2VkIHR5cGVzIG9mIGRhdGEKICogc3VjaCBhcyBVUklzLCBkYXRlcyBhbmQgdGltZXMsIGFuZCBlcnJvcnMuCiAqCiAqICMjIE51bWJlcnMgYW5kIGJvb2xlYW5zCiAqCiAqIFtpbnRdIGFuZCBbZG91YmxlXSBwcm92aWRlIHN1cHBvcnQgZm9yIERhcnQncyBidWlsdC1pbiBudW1lcmljYWwgZGF0YSB0eXBlczoKICogaW50ZWdlcnMgYW5kIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgcmVzcGVjdGl2ZWx5LgogKiBBbiBvYmplY3Qgb2YgdHlwZSBbYm9vbF0gaXMgZWl0aGVyIHRydWUgb3IgZmFsc2UuCiAqIFZhcmlhYmxlcyBvZiB0aGVzZSB0eXBlcyBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBsaXRlcmFsczoKICoKICogICAgIGludCBtZWFuaW5nT2ZMaWZlID0gNDI7CiAqICAgICBkb3VibGUgdmFsdWVPZlBpICA9IDMuMTQxNTkyOwogKiAgICAgYm9vbCB2aXNpYmxlICAgICAgPSB0cnVlOwogKgogKiAjIyBTdHJpbmdzIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zCiAqCiAqIEEgW1N0cmluZ10gaXMgaW1tdXRhYmxlIGFuZCByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KICoKICogICAgIFN0cmluZyBzaGFrZXNwZWFyZVF1b3RlID0gIkFsbCB0aGUgd29ybGQncyBhIHN0YWdlLCAuLi4iOwogKgogKiBbU3RyaW5nQnVmZmVyXSBwcm92aWRlcyBhIHdheSB0byBjb25zdHJ1Y3Qgc3RyaW5ncyBlZmZpY2llbnRseS4KICoKICogICAgIFN0cmluZ0J1ZmZlciBtb3JlU2hha2VzcGVhcmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAqICAgICBtb3JlU2hha2VzcGVhcmUud3JpdGUoJ0FuZCBhbGwgdGhlIG1lbiBhbmQgd29tZW4gJyk7CiAqICAgICBtb3JlU2hha2VzcGVhcmUud3JpdGUoJ21lcmVseSBwbGF5ZXJzOyAuLi4nKTsKICoKICogVGhlIFN0cmluZyBhbmQgU3RyaW5nQnVmZmVyIGNsYXNzZXMgaW1wbGVtZW50IHN0cmluZyBjb25jYXRlbmF0aW9uLAogKiBpbnRlcnBvbGF0aW9uLCBhbmQgb3RoZXIgc3RyaW5nIG1hbmlwdWxhdGlvbiBmZWF0dXJlcy4KICoKICogICAgIFN0cmluZyBwaGlsb3NvcGh5ID0gJ0xpdmUgb24gJzsKICogICAgIFN0cmluZyBnZXQgcGFsaW5kcm9tZSA9PiBwaGlsb3NvcGh5ICsgcGhpbG9zb3BoeS5zcGxpdCgnJykucmV2ZXJzZWQuam9pbigpOwogKgogKiBbUmVnRXhwXSBpbXBsZW1lbnRzIERhcnQgcmVndWxhciBleHByZXNzaW9ucywKICogd2hpY2ggcHJvdmlkZSBhIGdyYW1tYXIgZm9yIG1hdGNoaW5nIHBhdHRlcm5zIHdpdGhpbiB0ZXh0LgogKiBGb3IgZXhhbXBsZSwgaGVyZSdzIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcwogKiBhIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBkaWdpdHM6CiAqCiAqICAgICB2YXIgbnVtYmVycyA9IG5ldyBSZWdFeHAocidcZCsnKTsKICoKICogRGFydCByZWd1bGFyIGV4cHJlc3Npb25zIGhhdmUgdGhlIHNhbWUgc3ludGF4IGFuZCBzZW1hbnRpY3MgYXMKICogSmF2YVNjcmlwdCByZWd1bGFyIGV4cHJlc3Npb25zLiBTZWUKICogPGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTE1LjEwPgogKiBmb3IgdGhlIHNwZWNpZmljYXRpb24gb2YgSmF2YVNjcmlwdCByZWd1bGFyIGV4cHJlc3Npb25zLgogKgogKiAjIyBDb2xsZWN0aW9ucwogKgogKiBUaGUgZGFydDpjb3JlIGxpYnJhcnkgcHJvdmlkZXMgYmFzaWMgY29sbGVjdGlvbnMsCiAqIHN1Y2ggYXMgW0xpc3RdLCBbTWFwXSwgYW5kIFtTZXRdLgogKgogKiBBIExpc3QgaXMgYW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMsIHdpdGggYSBsZW5ndGguCiAqIExpc3RzIGFyZSBzb21ldGltZXMgY2FsbGVkIGFycmF5cy4KICogVXNlIGEgTGlzdCB3aGVuIHlvdSBuZWVkIHRvIGFjY2VzcyBvYmplY3RzIGJ5IGluZGV4LgogKgogKiAgICAgTGlzdCBzdXBlcmhlcm9lcyA9IFsgJ0JhdG1hbicsICdTdXBlcm1hbicsICdIYXJyeSBQb3R0ZXInIF07CiAqCiAqIEEgU2V0IGlzIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBvYmplY3RzLgogKiBZb3UgY2Fubm90IGdldCBhbiBpdGVtIGJ5IGluZGV4IChwb3NpdGlvbikuCiAqIEFkZGluZyBhIGR1cGxpY2F0ZSBpdGVtIGhhcyBubyBlZmZlY3QuCiAqCiAqICAgICBTZXQgdmlsbGFpbnMgPSBuZXcgU2V0KCk7CiAqICAgICB2aWxsYWlucy5hZGQoJ0pva2VyJyk7CiAqICAgICB2aWxsYWlucy5hZGRBbGwoIFsnTGV4IEx1dGhlcicsICdWb2xkZW1vcnQnXSApOwogKgogKiBBIE1hcCBpcyBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiBrZXktdmFsdWUgcGFpcnMuCiAqIE1hcHMgYXJlIHNvbWV0aW1lcyBjYWxsZWQgYXNzb2NpYXRpdmUgYXJyYXlzIGJlY2F1c2UKICogbWFwcyBhc3NvY2lhdGUgYSBrZXkgdG8gc29tZSB2YWx1ZSBmb3IgZWFzeSByZXRyaWV2YWwuCiAqIEtleXMgYXJlIHVuaXF1ZS4KICogVXNlIGEgTWFwIHdoZW4geW91IG5lZWQgdG8gYWNjZXNzIG9iamVjdHMKICogYnkgYSB1bmlxdWUgaWRlbnRpZmllci4KICoKICogICAgIE1hcCBzaWRla2lja3MgPSB7ICdCYXRtYW4nOiAnUm9iaW4nLAogKiAgICAgICAgICAgICAgICAgICAgICAgJ1N1cGVybWFuJzogJ0xvaXMgTGFuZScsCiAqICAgICAgICAgICAgICAgICAgICAgICAnSGFycnkgUG90dGVyJzogJ1JvbiBhbmQgSGVybWlvbmUnIH07CiAqCiAqIEluIGFkZGl0aW9uIHRvIHRoZXNlIGNsYXNzZXMsCiAqIGRhcnQ6Y29yZSBjb250YWlucyBbSXRlcmFibGVdLAogKiBhbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGZ1bmN0aW9uYWxpdHkKICogY29tbW9uIGluIGNvbGxlY3Rpb25zIG9mIG9iamVjdHMuCiAqIEV4YW1wbGVzIGluY2x1ZGUgdGhlIGFiaWxpdHkKICogdG8gcnVuIGEgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uLAogKiB0byBhcHBseSBhIHRlc3QgdG8gZWFjaCBlbGVtZW50LAogKiB0byByZXRyaWV2ZSBhbiBvYmplY3QsIGFuZCB0byBkZXRlcm1pbmUgbGVuZ3RoLgogKgogKiBJdGVyYWJsZSBpcyBpbXBsZW1lbnRlZCBieSBMaXN0IGFuZCBTZXQsCiAqIGFuZCB1c2VkIGJ5IE1hcCBmb3IgaXRzIGtleXMgYW5kIHZhbHVlcy4KICoKICogRm9yIG90aGVyIGtpbmRzIG9mIGNvbGxlY3Rpb25zLCBjaGVjayBvdXQgdGhlCiAqIGBkYXJ0OmNvbGxlY3Rpb25gIGxpYnJhcnkuCiAqCiAqICMjIERhdGUgYW5kIHRpbWUKICoKICogVXNlIFtEYXRlVGltZV0gdG8gcmVwcmVzZW50IGEgcG9pbnQgaW4gdGltZQogKiBhbmQgW0R1cmF0aW9uXSB0byByZXByZXNlbnQgYSBzcGFuIG9mIHRpbWUuCiAqCiAqIFlvdSBjYW4gY3JlYXRlIERhdGVUaW1lIG9iamVjdHMgd2l0aCBjb25zdHJ1Y3RvcnMKICogb3IgYnkgcGFyc2luZyBhIGNvcnJlY3RseSBmb3JtYXR0ZWQgc3RyaW5nLgogKgogKiAgICAgRGF0ZVRpbWUgbm93ID0gbmV3IERhdGVUaW1lLm5vdygpOwogKiAgICAgRGF0ZVRpbWUgYmVybGluV2FsbEZlbGwgPSBuZXcgRGF0ZVRpbWUoMTk4OSwgMTEsIDkpOwogKiAgICAgRGF0ZVRpbWUgbW9vbkxhbmRpbmcgPSBEYXRlVGltZS5wYXJzZSgiMTk2OS0wNy0yMCIpOwogKgogKiBDcmVhdGUgYSBEdXJhdGlvbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgaW5kaXZpZHVhbCB0aW1lIHVuaXRzLgogKgogKiAgICAgRHVyYXRpb24gdGltZVJlbWFpbmluZyA9IG5ldyBEdXJhdGlvbihob3Vyczo1NiwgbWludXRlczoxNCk7CiAqCiAqIEluIGFkZGl0aW9uIHRvIERhdGVUaW1lIGFuZCBEdXJhdGlvbiwKICogZGFydDpjb3JlIGNvbnRhaW5zIHRoZSBbU3RvcHdhdGNoXSBjbGFzcyBmb3IgbWVhc3VyaW5nIGVsYXBzZWQgdGltZS4KICoKICogIyMgVXJpCiAqCiAqIEEgW1VyaV0gb2JqZWN0IHJlcHJlc2VudHMgYSB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIsCiAqIHdoaWNoIGlkZW50aWZpZXMgYSByZXNvdXJjZSBvbiB0aGUgd2ViLgogKgogKiAgICAgVXJpIGRhcnRsYW5nID0gVXJpLnBhcnNlKCdodHRwOi8vZGFydGxhbmcub3JnLycpOwogKgogKiAjIyBFcnJvcnMKICoKICogVGhlIFtFcnJvcl0gY2xhc3MgcmVwcmVzZW50cyB0aGUgb2NjdXJyZW5jZSBvZiBhbiBlcnJvcgogKiBkdXJpbmcgcnVudGltZS4KICogU3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBzcGVjaWZpYyBraW5kcyBvZiBlcnJvcnMuCiAqCiAqICMjIE90aGVyIGRvY3VtZW50YXRpb24KICoKICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGUgYnVpbHQtaW4gdHlwZXMsIHJlZmVyIHRvIFtCdWlsdC1pbgogKiBUeXBlc10oaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NvbnRlbnRzL2NoMDIuaHRtbCNidWlsdC1pbi10eXBlcykKICogaW4gQ2hhcHRlciAyIG9mCiAqIFtEYXJ0OiBVcCBhbmQgUnVubmluZ10oaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nLykuCiAqCiAqIEFsc28sIHNlZSBbZGFydDpjb3JlIC0gTnVtYmVycywgQ29sbGVjdGlvbnMsIFN0cmluZ3MsIGFuZAogKiBNb3JlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NoMDMuaHRtbCNkYXJ0Y29yZS0tLW51bWJlcnMtY29sbGVjdGlvbnMtc3RyaW5ncy1hbmQtbW9yZSkKICogZm9yIG1vcmUgY292ZXJhZ2Ugb2YgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UuCiAqCiAqIFRoZQogKiBbRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL3NwZWMvKQogKiBwcm92aWRlcyB0ZWNobmljYWwgZGV0YWlscy4KICoKICoge0BjYXRlZ29yeSBDb3JlfQogKi8KbGlicmFyeSBkYXJ0LmNvcmU7CgppbXBvcnQgImRhcnQ6Y29sbGVjdGlvbiI7CmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGhpZGUgU3ltYm9sLCBMaW5rZWRMaXN0LCBMaW5rZWRMaXN0RW50cnk7CmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGFzIGludGVybmFsIHNob3cgU3ltYm9sOwppbXBvcnQgImRhcnQ6Y29udmVydCIKICAgIHNob3cKICAgICAgICBhc2NpaSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgQmFzZTY0Q29kZWMsCiAgICAgICAgRW5jb2RpbmcsCiAgICAgICAgbGF0aW4xLAogICAgICAgIFN0cmluZ0NvbnZlcnNpb25TaW5rLAogICAgICAgIHV0Zjg7CmltcG9ydCAiZGFydDptYXRoIiBzaG93IFJhbmRvbTsgLy8gVXNlZCBieSBMaXN0LnNodWZmbGUuCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIiBzaG93IFVpbnQ4TGlzdCwgVWludDE2TGlzdCwgRW5kaWFuOwoKQFNpbmNlKCIyLjEiKQpleHBvcnQgImRhcnQ6YXN5bmMiIHNob3cgRnV0dXJlLCBTdHJlYW07CgpwYXJ0ICJhbm5vdGF0aW9ucy5kYXJ0IjsKcGFydCAiYmlnaW50LmRhcnQiOwpwYXJ0ICJib29sLmRhcnQiOwpwYXJ0ICJjb21wYXJhYmxlLmRhcnQiOwpwYXJ0ICJkYXRlX3RpbWUuZGFydCI7CnBhcnQgImRvdWJsZS5kYXJ0IjsKcGFydCAiZHVyYXRpb24uZGFydCI7CnBhcnQgImVycm9ycy5kYXJ0IjsKcGFydCAiZXhjZXB0aW9ucy5kYXJ0IjsKcGFydCAiZXhwYW5kby5kYXJ0IjsKcGFydCAiZnVuY3Rpb24uZGFydCI7CnBhcnQgImlkZW50aWNhbC5kYXJ0IjsKcGFydCAiaW50LmRhcnQiOwpwYXJ0ICJpbnZvY2F0aW9uLmRhcnQiOwpwYXJ0ICJpdGVyYWJsZS5kYXJ0IjsKcGFydCAiaXRlcmF0b3IuZGFydCI7CnBhcnQgImxpc3QuZGFydCI7CnBhcnQgIm1hcC5kYXJ0IjsKcGFydCAibnVsbC5kYXJ0IjsKcGFydCAibnVtLmRhcnQiOwpwYXJ0ICJvYmplY3QuZGFydCI7CnBhcnQgInBhdHRlcm4uZGFydCI7CnBhcnQgInByaW50LmRhcnQiOwpwYXJ0ICJyZWdleHAuZGFydCI7CnBhcnQgInNldC5kYXJ0IjsKcGFydCAic2luay5kYXJ0IjsKcGFydCAic3RhY2t0cmFjZS5kYXJ0IjsKcGFydCAic3RvcHdhdGNoLmRhcnQiOwpwYXJ0ICJzdHJpbmcuZGFydCI7CnBhcnQgInN0cmluZ19idWZmZXIuZGFydCI7CnBhcnQgInN0cmluZ19zaW5rLmRhcnQiOwpwYXJ0ICJzeW1ib2wuZGFydCI7CnBhcnQgInR5cGUuZGFydCI7CnBhcnQgInVyaS5kYXJ0IjsKgNIATk48AQQDIDgDKwMhHydEKEEuAxsDUEc1PgMfJSEDJgNEA0EDQwM6PDUDRzoDJ1MDMT45IwMpA0InOzwDEgM1JQM+JjgDRAM3LyoDIR43Azg4OhQtGwMsMj8DISIrJSA4JDMDLCwDMR4DFAMvLwM1LwMqPDwDQgNEAylIAwoDPCsDOQMNAzsTQAMaA1BeE04DPXYxAwdFHwMUBBMBGkIxFgkPEBUSEB4OOT0BDikBGRQSGBcUFhQYFRYXERgWFhIREhEUFRMUERIYFxQbGRQSEQEJZGFydDpjb3JlKm9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvYXJyYXkuZGFydJwNLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9MaXN0PEU+IGV4dGVuZHMgRml4ZWRMZW5ndGhMaXN0QmFzZTxFPiB7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfTGlzdCkKICBmYWN0b3J5IF9MaXN0KGxlbmd0aCkgbmF0aXZlICJMaXN0X2FsbG9jYXRlIjsKCiAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIG5hdGl2ZSAiTGlzdF9nZXRJbmRleGVkIjsKCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKSB7CiAgICBfc2V0SW5kZXhlZChpbmRleCwgdmFsdWUpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZChpbnQgaW5kZXgsIEUgdmFsdWUpIG5hdGl2ZSAiTGlzdF9zZXRJbmRleGVkIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiTGlzdF9nZXRMZW5ndGgiOwoKICBMaXN0IF9zbGljZShpbnQgc3RhcnQsIGludCBjb3VudCwgYm9vbCBuZWVkc1R5cGVBcmd1bWVudCkgewogICAgaWYgKGNvdW50IDw9IDY0KSB7CiAgICAgIGZpbmFsIHJlc3VsdCA9IG5lZWRzVHlwZUFyZ3VtZW50ID8gbmV3IF9MaXN0PEU+KGNvdW50KSA6IG5ldyBfTGlzdChjb3VudCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVzdWx0W2ldID0gdGhpc1tzdGFydCArIGldOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gX3NsaWNlSW50ZXJuYWwoc3RhcnQsIGNvdW50LCBuZWVkc1R5cGVBcmd1bWVudCk7CiAgICB9CiAgfQoKICBMaXN0IF9zbGljZUludGVybmFsKGludCBzdGFydCwgaW50IGNvdW50LCBib29sIG5lZWRzVHlwZUFyZ3VtZW50KQogICAgICBuYXRpdmUgIkxpc3Rfc2xpY2UiOwoKICAvLyBMaXN0IGludGVyZmFjZS4KICB2b2lkIHNldFJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPiB0aGlzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgaWYgKGVuZCA8IHN0YXJ0IHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGVuZCwgc3RhcnQsIHRoaXMubGVuZ3RoKTsKICAgIH0KICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuOwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBpdGVyYWJsZSkpIHsKICAgICAgTGlzdHMuY29weSh0aGlzLCBza2lwQ291bnQsIHRoaXMsIHN0YXJ0LCBsZW5ndGgpOwogICAgfSBlbHNlIGlmIChDbGFzc0lELmdldElEKGl0ZXJhYmxlKSA9PSBDbGFzc0lELmNpZEFycmF5KSB7CiAgICAgIGZpbmFsIF9MaXN0PEU+IGl0ZXJhYmxlQXNMaXN0ID0gaXRlcmFibGU7CiAgICAgIExpc3RzLmNvcHkoaXRlcmFibGVBc0xpc3QsIHNraXBDb3VudCwgdGhpcywgc3RhcnQsIGxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKGl0ZXJhYmxlIGlzIExpc3Q8RT4pIHsKICAgICAgTGlzdHMuY29weShpdGVyYWJsZSwgc2tpcENvdW50LCB0aGlzLCBzdGFydCwgbGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmFibGUuaXRlcmF0b3I7CiAgICAgIHdoaWxlIChza2lwQ291bnQgPiAwKSB7CiAgICAgICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSByZXR1cm47CiAgICAgICAgc2tpcENvdW50LS07CiAgICAgIH0KICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHJldHVybjsKICAgICAgICB0aGlzW2ldID0gaXQuY3VycmVudDsKICAgICAgfQogICAgfQogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewogICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRoaXMubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCB0aGlzLmxlbmd0aCwgImluZGV4Iik7CiAgICB9CiAgICBMaXN0PEU+IGl0ZXJhYmxlQXNMaXN0OwogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBpdGVyYWJsZSkpIHsKICAgICAgaXRlcmFibGVBc0xpc3QgPSB0aGlzOwogICAgfSBlbHNlIGlmIChDbGFzc0lELmdldElEKGl0ZXJhYmxlKSA9PSBDbGFzc0lELmNpZEFycmF5KSB7CiAgICAgIGl0ZXJhYmxlQXNMaXN0ID0gaXRlcmFibGU7CiAgICB9IGVsc2UgaWYgKGl0ZXJhYmxlIGlzIExpc3Q8RT4pIHsKICAgICAgaXRlcmFibGVBc0xpc3QgPSBpdGVyYWJsZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIHZhbHVlIGluIGl0ZXJhYmxlKSB7CiAgICAgICAgdGhpc1tpbmRleCsrXSA9IHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBsZW5ndGggPSBpdGVyYWJsZUFzTGlzdC5sZW5ndGg7CiAgICBpZiAoaW5kZXggKyBsZW5ndGggPiB0aGlzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCArIGxlbmd0aCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgTGlzdHMuY29weShpdGVyYWJsZUFzTGlzdCwgMCwgdGhpcywgaW5kZXgsIGxlbmd0aCk7CiAgfQoKICBMaXN0PEU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDxFPltdOwogICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+LndpdGhEYXRhKF9zbGljZShzdGFydCwgbGVuZ3RoLCBmYWxzZSkpOwogICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBJdGVyYWJsZSBpbnRlcmZhY2UuCgogIHZvaWQgZm9yRWFjaChmKEUgZWxlbWVudCkpIHsKICAgIGZpbmFsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBmKHRoaXNbaV0pOwogICAgfQogIH0KCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgX0ZpeGVkU2l6ZUFycmF5SXRlcmF0b3I8RT4odGhpcyk7CiAgfQoKICBFIGdldCBmaXJzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbMF07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZ2V0IGxhc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzW2xlbmd0aCAtIDFdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBFIGdldCBzaW5nbGUgewogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gdGhpc1swXTsKICAgIGlmIChsZW5ndGggPT0gMCkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci50b29NYW55KCk7CiAgfQoKICBMaXN0PEU+IHRvTGlzdCh7Ym9vbCBncm93YWJsZTogdHJ1ZX0pIHsKICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgIHZhciByZXN1bHQgPSBfc2xpY2UoMCwgbGVuZ3RoLCAhZ3Jvd2FibGUpOwogICAgICBpZiAoZ3Jvd2FibGUpIHsKICAgICAgICByZXN1bHQgPSBuZXcgX0dyb3dhYmxlTGlzdDxFPi53aXRoRGF0YShyZXN1bHQpLi5fc2V0TGVuZ3RoKGxlbmd0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8vIF9Hcm93YWJsZUxpc3Qud2l0aERhdGEgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggZW1wdHkgbGlzdC4KICAgIHJldHVybiBncm93YWJsZSA/IDxFPltdIDogbmV3IExpc3Q8RT4oMCk7CiAgfQp9CgovLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGNsYXNzIGFzIF9MaXN0LCBidXQgaXQgZG9lcyBub3QKLy8gcGVybWl0IGFueSBtb2RpZmljYXRpb24gb2YgYXJyYXkgZWxlbWVudHMgZnJvbSBEYXJ0IGNvZGUuIFdlIHVzZQovLyB0aGlzIGNsYXNzIGZvciBhcnJheXMgY29uc3RydWN0ZWQgZnJvbSBEYXJ0IGFycmF5IGxpdGVyYWxzLgovLyBUT0RPKGhhdXNuZXIpOiBXZSBzaG91bGQgY29uc2lkZXIgdGhlIHRyYWRlLW9mZnMgYmV0d2VlbiB0d28KLy8gY2xhc3NlcyAoYW5kIGlubGluZSBjYWNoZSBtaXNzZXMpIHZlcnN1cyBhIGZpZWxkIGluIHRoZSBuYXRpdmUKLy8gaW1wbGVtZW50YXRpb24gKGNoZWNrcyB3aGVuIG1vZGlmeWluZykuIFdlIHNob3VsZCBrZWVwIHdhdGNoaW5nCi8vIHRoZSBpbmxpbmUgY2FjaGUgbWlzc2VzLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9JbW11dGFibGVMaXN0PEU+IGV4dGVuZHMgVW5tb2RpZmlhYmxlTGlzdEJhc2U8RT4gewogIGZhY3RvcnkgX0ltbXV0YWJsZUxpc3QuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIkltbXV0YWJsZUFycmF5IGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk0iKTsKICB9CgogIGZhY3RvcnkgX0ltbXV0YWJsZUxpc3QuX2Zyb20oTGlzdCBmcm9tLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQogICAgICBuYXRpdmUgIkltbXV0YWJsZUxpc3RfZnJvbSI7CgogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSBuYXRpdmUgIkxpc3RfZ2V0SW5kZXhlZCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGxlbmd0aCBuYXRpdmUgIkxpc3RfZ2V0TGVuZ3RoIjsKCiAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiA8RT5bXTsKICAgIExpc3QgbGlzdCA9IG5ldyBfTGlzdChsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBsaXN0W2ldID0gdGhpc1tzdGFydCArIGldOwogICAgfQogICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PEU+LndpdGhEYXRhKGxpc3QpOwogICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBDb2xsZWN0aW9uIGludGVyZmFjZS4KCiAgdm9pZCBmb3JFYWNoKGYoRSBlbGVtZW50KSkgewogICAgZmluYWwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGYodGhpc1tpXSk7CiAgICB9CiAgfQoKICBJdGVyYXRvcjxFPiBnZXQgaXRlcmF0b3IgewogICAgcmV0dXJuIG5ldyBfRml4ZWRTaXplQXJyYXlJdGVyYXRvcjxFPih0aGlzKTsKICB9CgogIEUgZ2V0IGZpcnN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1swXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgRSBnZXQgbGFzdCB7CiAgICBpZiAobGVuZ3RoID4gMCkgcmV0dXJuIHRoaXNbbGVuZ3RoIC0gMV07CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIEUgZ2V0IHNpbmdsZSB7CiAgICBpZiAobGVuZ3RoID09IDEpIHJldHVybiB0aGlzWzBdOwogICAgaWYgKGxlbmd0aCA9PSAwKSB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLnRvb01hbnkoKTsKICB9CgogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgTGlzdCBsaXN0ID0gZ3Jvd2FibGUgPyBuZXcgX0xpc3QobGVuZ3RoKSA6IG5ldyBfTGlzdDxFPihsZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGlzdFtpXSA9IHRoaXNbaV07CiAgICAgIH0KICAgICAgaWYgKCFncm93YWJsZSkgcmV0dXJuIGxpc3Q7CiAgICAgIHZhciByZXN1bHQgPSBuZXcgX0dyb3dhYmxlTGlzdDxFPi53aXRoRGF0YShsaXN0KTsKICAgICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBncm93YWJsZSA/IDxFPltdIDogbmV3IF9MaXN0PEU+KDApOwogIH0KfQoKLy8gSXRlcmF0b3IgZm9yIGFycmF5cyB3aXRoIGZpeGVkIHNpemUuCmNsYXNzIF9GaXhlZFNpemVBcnJheUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIGZpbmFsIExpc3Q8RT4gX2FycmF5OwogIGZpbmFsIGludCBfbGVuZ3RoOyAvLyBDYWNoZSBhcnJheSBsZW5ndGggZm9yIGZhc3RlciBhY2Nlc3MuCiAgaW50IF9pbmRleDsKICBFIF9jdXJyZW50OwoKICBfRml4ZWRTaXplQXJyYXlJdGVyYXRvcihMaXN0PEU+IGFycmF5KQogICAgICA6IF9hcnJheSA9IGFycmF5LAogICAgICAgIF9sZW5ndGggPSBhcnJheS5sZW5ndGgsCiAgICAgICAgX2luZGV4ID0gMCB7CiAgICBhc3NlcnQoYXJyYXkgaXMgX0xpc3Q8RT4gfHwgYXJyYXkgaXMgX0ltbXV0YWJsZUxpc3Q8RT4pOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfaW5kZXggPj0gX2xlbmd0aCkgewogICAgICBfY3VycmVudCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIF9jdXJyZW50ID0gX2FycmF5W19pbmRleF07CiAgICBfaW5kZXgrKzsKICAgIHJldHVybiB0cnVlOwogIH0KfQqA+wBOTjwBHgEaMCkwATUBKh8EAUEBNCoBPhdRMCUIFQ0+BgQBRBsBFVEsOQYsOwYeHSU4PjBCJjwNJx4kFQgqJB4IBgQBMSxCBhwlHT4hJiENJB8IDgYoKEIGOAQBKj8eI04fEwQBGQEfICcSBgQBHTEEARAkLAQBDy0sBAERJT0qBAEqHhYxFkwIFQZCLgQCAUBEP0BCQxwaOi0gOwQBQiMBNQE0KgEqPx4jIychBjYfEwQBGwEfICcSBgQBHTEEARAkLAQBDy0sBAERJT0qBAEqHhZHKRsIIjghFQYvBAIBKDoYPg4OASkYIBU9BAEdARQdFxQGHw4RBAIBGmRhcnQ6Y29yZS1wYXRjaC9hcnJheS5kYXJ0K29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZG91YmxlLmRhcnSrDi8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRG91YmxlIGltcGxlbWVudHMgZG91YmxlIHsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZmFjdG9yeSBfRG91YmxlLmZyb21JbnRlZ2VyKGludCB2YWx1ZSkgbmF0aXZlICJEb3VibGVfZG91YmxlRnJvbUludGVnZXIiOwoKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiRG91YmxlX2hhc2hDb2RlIjsKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlIG5hdGl2ZSAiRG91YmxlX2hhc2hDb2RlIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBvcGVyYXRvciArKG51bSBvdGhlcikgewogICAgcmV0dXJuIF9hZGQob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIF9hZGQoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9hZGQiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIG9wZXJhdG9yIC0obnVtIG90aGVyKSB7CiAgICByZXR1cm4gX3N1YihvdGhlci50b0RvdWJsZSgpKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgX3N1Yihkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX3N1YiI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgb3BlcmF0b3IgKihudW0gb3RoZXIpIHsKICAgIHJldHVybiBfbXVsKG90aGVyLnRvRG91YmxlKCkpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBfbXVsKGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfbXVsIjsKCiAgaW50IG9wZXJhdG9yIH4vKG51bSBvdGhlcikgewogICAgcmV0dXJuIF90cnVuY19kaXYob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfdHJ1bmNfZGl2KGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfdHJ1bmNfZGl2IjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcikgewogICAgcmV0dXJuIF9kaXYob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIF9kaXYoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9kaXYiOwoKICBkb3VibGUgb3BlcmF0b3IgJShudW0gb3RoZXIpIHsKICAgIHJldHVybiBfbW9kdWxvKG90aGVyLnRvRG91YmxlKCkpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSBfbW9kdWxvKGRvdWJsZSBvdGhlcikgbmF0aXZlICJEb3VibGVfbW9kdWxvIjsKCiAgZG91YmxlIHJlbWFpbmRlcihudW0gb3RoZXIpIHsKICAgIHJldHVybiBfcmVtYWluZGVyKG90aGVyLnRvRG91YmxlKCkpOwogIH0KCiAgZG91YmxlIF9yZW1haW5kZXIoZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9yZW1haW5kZXIiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIG9wZXJhdG9yIC0oKSBuYXRpdmUgIkRvdWJsZV9mbGlwU2lnbkJpdCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIChvdGhlciBpcyBudW0pICYmIF9lcXVhbChvdGhlci50b0RvdWJsZSgpKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIF9lcXVhbChkb3VibGUgb3RoZXIpIG5hdGl2ZSAiRG91YmxlX2VxdWFsIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZXF1YWxUb0ludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkRvdWJsZV9lcXVhbFRvSW50ZWdlciI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yIDwobnVtIG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIgPiB0aGlzOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgb3BlcmF0b3IgPihudW0gb3RoZXIpIHsKICAgIHJldHVybiBfZ3JlYXRlclRoYW4ob3RoZXIudG9Eb3VibGUoKSk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZ3JlYXRlclRoYW4oZG91YmxlIG90aGVyKSBuYXRpdmUgIkRvdWJsZV9ncmVhdGVyVGhhbiI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID49KG51bSBvdGhlcikgewogICAgcmV0dXJuICh0aGlzID09IG90aGVyKSB8fCAodGhpcyA+IG90aGVyKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yIDw9KG51bSBvdGhlcikgewogICAgcmV0dXJuICh0aGlzID09IG90aGVyKSB8fCAodGhpcyA8IG90aGVyKTsKICB9CgogIGRvdWJsZSBfYWRkRnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl9hZGQodGhpcyk7CiAgfQoKICBkb3VibGUgX3N1YkZyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG5ldyBfRG91YmxlLmZyb21JbnRlZ2VyKG90aGVyKS5fc3ViKHRoaXMpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19Eb3VibGUiKQogIGRvdWJsZSBfbXVsRnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl9tdWwodGhpcyk7CiAgfQoKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIob3RoZXIpLl90cnVuY19kaXYodGhpcyk7CiAgfQoKICBkb3VibGUgX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG5ldyBfRG91YmxlLmZyb21JbnRlZ2VyKG90aGVyKS5fbW9kdWxvKHRoaXMpOwogIH0KCiAgZG91YmxlIF9yZW1haW5kZXJGcm9tSW50ZWdlcihpbnQgb3RoZXIpIHsKICAgIHJldHVybiBuZXcgX0RvdWJsZS5mcm9tSW50ZWdlcihvdGhlcikuX3JlbWFpbmRlcih0aGlzKTsKICB9CgogIGJvb2wgX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIoaW50IG90aGVyKQogICAgICBuYXRpdmUgIkRvdWJsZV9ncmVhdGVyVGhhbkZyb21JbnRlZ2VyIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgbmF0aXZlICJEb3VibGVfZ2V0SXNOZWdhdGl2ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzSW5maW5pdGUgbmF0aXZlICJEb3VibGVfZ2V0SXNJbmZpbml0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgZ2V0IGlzTmFOIG5hdGl2ZSAiRG91YmxlX2dldElzTmFOIjsKICBib29sIGdldCBpc0Zpbml0ZSA9PiAhaXNJbmZpbml0ZSAmJiAhaXNOYU47IC8vIENhbiBiZSBvcHRpbWl6ZWQuCgogIGRvdWJsZSBhYnMoKSB7CiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgMC4wLgogICAgaWYgKHRoaXMgPT0gMC4wKSByZXR1cm4gMC4wOwogICAgcmV0dXJuIHRoaXMgPCAwLjAgPyAtdGhpcyA6IHRoaXM7CiAgfQoKICBkb3VibGUgZ2V0IHNpZ24gewogICAgaWYgKHRoaXMgPiAwLjApIHJldHVybiAxLjA7CiAgICBpZiAodGhpcyA8IDAuMCkgcmV0dXJuIC0xLjA7CiAgICByZXR1cm4gdGhpczsgLy8gKy8tMC4wIG9yIE5hTi4KICB9CgogIGludCByb3VuZCgpID0+IHJvdW5kVG9Eb3VibGUoKS50b0ludCgpOwogIGludCBmbG9vcigpID0+IGZsb29yVG9Eb3VibGUoKS50b0ludCgpOwogIGludCBjZWlsKCkgPT4gY2VpbFRvRG91YmxlKCkudG9JbnQoKTsKICBpbnQgdHJ1bmNhdGUoKSA9PiB0cnVuY2F0ZVRvRG91YmxlKCkudG9JbnQoKTsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBfRG91YmxlKQogIGRvdWJsZSByb3VuZFRvRG91YmxlKCkgbmF0aXZlICJEb3VibGVfcm91bmQiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgZmxvb3JUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX2Zsb29yIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIF9Eb3VibGUpCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX2NlaWwiOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpIG5hdGl2ZSAiRG91YmxlX3RydW5jYXRlIjsKCiAgbnVtIGNsYW1wKG51bSBsb3dlckxpbWl0LCBudW0gdXBwZXJMaW1pdCkgewogICAgaWYgKGxvd2VyTGltaXQgaXMhIG51bSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShsb3dlckxpbWl0LCAibG93ZXJMaW1pdCIsICJub3QgYSBudW1iZXIiKTsKICAgIH0KICAgIGlmICh1cHBlckxpbWl0IGlzISBudW0pIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUodXBwZXJMaW1pdCwgInVwcGVyTGltaXQiLCAibm90IGEgbnVtYmVyIik7CiAgICB9CgogICAgaWYgKGxvd2VyTGltaXQuY29tcGFyZVRvKHVwcGVyTGltaXQpID4gMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihsb3dlckxpbWl0KTsKICAgIH0KICAgIGlmIChsb3dlckxpbWl0LmlzTmFOKSByZXR1cm4gbG93ZXJMaW1pdDsKICAgIGlmICh0aGlzLmNvbXBhcmVUbyhsb3dlckxpbWl0KSA8IDApIHJldHVybiBsb3dlckxpbWl0OwogICAgaWYgKHRoaXMuY29tcGFyZVRvKHVwcGVyTGltaXQpID4gMCkgcmV0dXJuIHVwcGVyTGltaXQ7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IHRvSW50KCkgbmF0aXZlICJEb3VibGVfdG9JbnQiOwoKICBkb3VibGUgdG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIHN0YXRpYyBjb25zdCBpbnQgQ0FDSEVfU0laRV9MT0cyID0gMzsKICBzdGF0aWMgY29uc3QgaW50IENBQ0hFX0xFTkdUSCA9IDEgPDwgKENBQ0hFX1NJWkVfTE9HMiArIDEpOwogIHN0YXRpYyBjb25zdCBpbnQgQ0FDSEVfTUFTSyA9IENBQ0hFX0xFTkdUSCAtIDE7CiAgLy8gRWFjaCBrZXkgKGRvdWJsZSkgZm9sbG93ZWQgYnkgaXRzIHRvU3RyaW5nIHJlc3VsdC4KICBzdGF0aWMgZmluYWwgTGlzdCBfY2FjaGUgPSBuZXcgTGlzdChDQUNIRV9MRU5HVEgpOwogIHN0YXRpYyBpbnQgX2NhY2hlRXZpY3RJbmRleCA9IDA7CgogIFN0cmluZyBfdG9TdHJpbmcoKSBuYXRpdmUgIkRvdWJsZV90b1N0cmluZyI7CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIHN0YXJ0aW5nIGF0IG1vc3QgcmVjZW50bHkgaW5zZXJ0ZWQuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IENBQ0hFX0xFTkdUSDsgaSArPSAyKSB7CiAgICAgIC8vIE5lZWQgJ2lkZW50aWNhbCcgdG8gaGFuZGxlIG5lZ2F0aXZlIHplcm8sIGV0Yy4KICAgICAgaWYgKGlkZW50aWNhbChfY2FjaGVbaV0sIHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIF9jYWNoZVtpICsgMV07CiAgICAgIH0KICAgIH0KICAgIC8vIFRPRE8oa29kYSk6IENvbnNpZGVyIG9wdGltaXppbmcgYWxsIHNtYWxsIGludGVncmFsIHZhbHVlcy4KICAgIGlmIChpZGVudGljYWwoMC4wLCB0aGlzKSkgewogICAgICByZXR1cm4gIjAuMCI7CiAgICB9CiAgICBTdHJpbmcgcmVzdWx0ID0gX3RvU3RyaW5nKCk7CiAgICAvLyBSZXBsYWNlIHRoZSBsZWFzdCByZWNlbnRseSBpbnNlcnRlZCBlbnRyeS4KICAgIF9jYWNoZVtfY2FjaGVFdmljdEluZGV4XSA9IHRoaXM7CiAgICBfY2FjaGVbX2NhY2hlRXZpY3RJbmRleCArIDFdID0gcmVzdWx0OwogICAgX2NhY2hlRXZpY3RJbmRleCA9IChfY2FjaGVFdmljdEluZGV4ICsgMikgJiBDQUNIRV9NQVNLOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIFN0cmluZyB0b1N0cmluZ0FzRml4ZWQoaW50IGZyYWN0aW9uRGlnaXRzKSB7CiAgICAvLyBTZWUgRUNNQVNjcmlwdC0yNjIsIDE1LjcuNC41IGZvciBkZXRhaWxzLgoKICAgIGlmIChmcmFjdGlvbkRpZ2l0cyBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgZnJhY3Rpb25EaWdpdHMsICJmcmFjdGlvbkRpZ2l0cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgLy8gU3RlcCAyLgogICAgaWYgKGZyYWN0aW9uRGlnaXRzIDwgMCB8fCBmcmFjdGlvbkRpZ2l0cyA+IDIwKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGZyYWN0aW9uRGlnaXRzLCAwLCAyMCwgImZyYWN0aW9uRGlnaXRzIik7CiAgICB9CgogICAgLy8gU3RlcCAzLgogICAgZG91YmxlIHggPSB0aGlzOwoKICAgIC8vIFN0ZXAgNC4KICAgIGlmIChpc05hTikgcmV0dXJuICJOYU4iOwoKICAgIC8vIFN0ZXAgNSBhbmQgNiBza2lwcGVkLiBXaWxsIGJlIGRlYWx0IHdpdGggYnkgbmF0aXZlIGZ1bmN0aW9uLgoKICAgIC8vIFN0ZXAgNy4KICAgIGlmICh4ID49IDFlMjEgfHwgeCA8PSAtMWUyMSkgewogICAgICByZXR1cm4geC50b1N0cmluZygpOwogICAgfQoKICAgIHJldHVybiBfdG9TdHJpbmdBc0ZpeGVkKGZyYWN0aW9uRGlnaXRzKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc0ZpeGVkKGludCBmcmFjdGlvbkRpZ2l0cykgbmF0aXZlICJEb3VibGVfdG9TdHJpbmdBc0ZpeGVkIjsKCiAgU3RyaW5nIHRvU3RyaW5nQXNFeHBvbmVudGlhbChbaW50IGZyYWN0aW9uRGlnaXRzXSkgewogICAgLy8gU2VlIEVDTUFTY3JpcHQtMjYyLCAxNS43LjQuNiBmb3IgZGV0YWlscy4KCiAgICAvLyBUaGUgRWNtYVNjcmlwdCBzcGVjaWZpY2F0aW9uIGNoZWNrcyBmb3IgTmFOIGFuZCBJbmZpbml0eSBiZWZvcmUgbG9va2luZwogICAgLy8gYXQgdGhlIGZyYWN0aW9uRGlnaXRzLiBJbiBEYXJ0IHdlIGFyZSBjb25zaXN0ZW50IHdpdGggdG9TdHJpbmdBc0ZpeGVkIGFuZAogICAgLy8gbG9vayBhdCB0aGUgZnJhY3Rpb25EaWdpdHMgZmlyc3QuCgogICAgLy8gU3RlcCA3LgogICAgaWYgKGZyYWN0aW9uRGlnaXRzICE9IG51bGwpIHsKICAgICAgaWYgKGZyYWN0aW9uRGlnaXRzIGlzISBpbnQpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgICAgZnJhY3Rpb25EaWdpdHMsICJmcmFjdGlvbkRpZ2l0cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgICB9CiAgICAgIGlmIChmcmFjdGlvbkRpZ2l0cyA8IDAgfHwgZnJhY3Rpb25EaWdpdHMgPiAyMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGZyYWN0aW9uRGlnaXRzLCAwLCAyMCwgImZyYWN0aW9uRGlnaXRzIik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaXNOYU4pIHJldHVybiAiTmFOIjsKICAgIGlmICh0aGlzID09IGRvdWJsZS5pbmZpbml0eSkgcmV0dXJuICJJbmZpbml0eSI7CiAgICBpZiAodGhpcyA9PSAtZG91YmxlLmluZmluaXR5KSByZXR1cm4gIi1JbmZpbml0eSI7CgogICAgLy8gVGhlIGRhcnQgZnVuY3Rpb24gcHJpbnRzIHRoZSBzaG9ydGVzdCByZXByZXNlbnRhdGlvbiB3aGVuIGZyYWN0aW9uRGlnaXRzCiAgICAvLyBlcXVhbHMgbnVsbC4gVGhlIG5hdGl2ZSBmdW5jdGlvbiB3YW50cyAtMSBpbnN0ZWFkLgogICAgZnJhY3Rpb25EaWdpdHMgPSAoZnJhY3Rpb25EaWdpdHMgPT0gbnVsbCkgPyAtMSA6IGZyYWN0aW9uRGlnaXRzOwoKICAgIHJldHVybiBfdG9TdHJpbmdBc0V4cG9uZW50aWFsKGZyYWN0aW9uRGlnaXRzKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc0V4cG9uZW50aWFsKGludCBmcmFjdGlvbkRpZ2l0cykKICAgICAgbmF0aXZlICJEb3VibGVfdG9TdHJpbmdBc0V4cG9uZW50aWFsIjsKCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbikgewogICAgLy8gU2VlIEVDTUFTY3JpcHQtMjYyLCAxNS43LjQuNyBmb3IgZGV0YWlscy4KCiAgICAvLyBUaGUgRWNtYVNjcmlwdCBzcGVjaWZpY2F0aW9uIGNoZWNrcyBmb3IgTmFOIGFuZCBJbmZpbml0eSBiZWZvcmUgbG9va2luZwogICAgLy8gYXQgdGhlIGZyYWN0aW9uRGlnaXRzLiBJbiBEYXJ0IHdlIGFyZSBjb25zaXN0ZW50IHdpdGggdG9TdHJpbmdBc0ZpeGVkIGFuZAogICAgLy8gbG9vayBhdCB0aGUgZnJhY3Rpb25EaWdpdHMgZmlyc3QuCgogICAgaWYgKHByZWNpc2lvbiBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHByZWNpc2lvbiwgInByZWNpc2lvbiIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgLy8gU3RlcCA4LgogICAgaWYgKHByZWNpc2lvbiA8IDEgfHwgcHJlY2lzaW9uID4gMjEpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UocHJlY2lzaW9uLCAxLCAyMSwgInByZWNpc2lvbiIpOwogICAgfQoKICAgIGlmIChpc05hTikgcmV0dXJuICJOYU4iOwogICAgaWYgKHRoaXMgPT0gZG91YmxlLmluZmluaXR5KSByZXR1cm4gIkluZmluaXR5IjsKICAgIGlmICh0aGlzID09IC1kb3VibGUuaW5maW5pdHkpIHJldHVybiAiLUluZmluaXR5IjsKCiAgICByZXR1cm4gX3RvU3RyaW5nQXNQcmVjaXNpb24ocHJlY2lzaW9uKTsKICB9CgogIFN0cmluZyBfdG9TdHJpbmdBc1ByZWNpc2lvbihpbnQgZnJhY3Rpb25EaWdpdHMpCiAgICAgIG5hdGl2ZSAiRG91YmxlX3RvU3RyaW5nQXNQcmVjaXNpb24iOwoKICAvLyBPcmRlciBpczogTmFOID4gSW5maW5pdHkgPiAuLi4gPiAwLjAgPiAtMC4wID4gLi4uID4gLUluZmluaXR5LgogIGludCBjb21wYXJlVG8obnVtIG90aGVyKSB7CiAgICBjb25zdCBpbnQgRVFVQUwgPSAwLCBMRVNTID0gLTEsIEdSRUFURVIgPSAxOwogICAgaWYgKHRoaXMgPCBvdGhlcikgewogICAgICByZXR1cm4gTEVTUzsKICAgIH0gZWxzZSBpZiAodGhpcyA+IG90aGVyKSB7CiAgICAgIHJldHVybiBHUkVBVEVSOwogICAgfSBlbHNlIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgIGlmICh0aGlzID09IDAuMCkgewogICAgICAgIGJvb2wgdGhpc0lzTmVnYXRpdmUgPSBpc05lZ2F0aXZlOwogICAgICAgIGJvb2wgb3RoZXJJc05lZ2F0aXZlID0gb3RoZXIuaXNOZWdhdGl2ZTsKICAgICAgICBpZiAodGhpc0lzTmVnYXRpdmUgPT0gb3RoZXJJc05lZ2F0aXZlKSB7CiAgICAgICAgICByZXR1cm4gRVFVQUw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzSXNOZWdhdGl2ZSA/IExFU1MgOiBHUkVBVEVSOwogICAgICB9IGVsc2UgaWYgKG90aGVyIGlzIGludCkgewogICAgICAgIC8vIENvbXBhcmUgYXMgaW50ZWdlcnMgYXMgaXQgaXMgbW9yZSBwcmVjaXNlIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzCiAgICAgICAgLy8gb3V0c2lkZSBvZiBNSU5fRVhBQ1RfSU5UX1RPX0RPVUJMRS4uTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUgcmFuZ2UuCiAgICAgICAgY29uc3QgaW50IE1BWF9FWEFDVF9JTlRfVE9fRE9VQkxFID0gOTAwNzE5OTI1NDc0MDk5MjsgLy8gMl41My4KICAgICAgICBjb25zdCBpbnQgTUlOX0VYQUNUX0lOVF9UT19ET1VCTEUgPSAtTUFYX0VYQUNUX0lOVF9UT19ET1VCTEU7CiAgICAgICAgaWYgKChNSU5fRVhBQ1RfSU5UX1RPX0RPVUJMRSA8PSBvdGhlcikgJiYKICAgICAgICAgICAgKG90aGVyIDw9IE1BWF9FWEFDVF9JTlRfVE9fRE9VQkxFKSkgewogICAgICAgICAgcmV0dXJuIEVRVUFMOwogICAgICAgIH0KICAgICAgICBjb25zdCBib29sIGxpbWl0SW50c1RvNjRCaXRzID0gKCgxIDw8IDY0KSA9PSAwKTsKICAgICAgICBpZiAobGltaXRJbnRzVG82NEJpdHMpIHsKICAgICAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCBkb3VibGUudG9JbnQoKSBjbGFtcHMKICAgICAgICAgIC8vIGRvdWJsZSB2YWx1ZSB0byBmaXQgaW50byB0aGUgTUlOX0lOVDY0Li5NQVhfSU5UNjQgcmFuZ2UuCiAgICAgICAgICAvLyBNQVhfSU5UNjQgaXMgbm90IHByZWNpc2VseSByZXByZXNlbnRhYmxlIGFzIGRvdWJsZSwgc28KICAgICAgICAgIC8vIGludGVnZXJzIG5lYXIgTUFYX0lOVDY0IGNvbXBhcmUgYXMgZXF1YWwgdG8gKE1BWF9JTlQ2NCArIDEpIHdoZW4KICAgICAgICAgIC8vIHJlcHJlc2VudGVkIGFzIGRvdWJsZXMuCiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBzaW1pbGFyIHByb2JsZW0gd2l0aCBNSU5fSU5UNjQgYXMgaXQgaXMgcHJlY2lzZWx5CiAgICAgICAgICAvLyByZXByZXNlbnRhYmxlIGFzIGRvdWJsZS4KICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgICBpZiAodGhpcyA+PSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUpIHsKICAgICAgICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0b0ludCgpLmNvbXBhcmVUbyhvdGhlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEVRVUFMOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzTmFOKSB7CiAgICAgIHJldHVybiBvdGhlci5pc05hTiA/IEVRVUFMIDogR1JFQVRFUjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE90aGVyIGlzIE5hTi4KICAgICAgcmV0dXJuIExFU1M7CiAgICB9CiAgfQp9CoFkAE5OPAEeARoiK0wBLTYBKyEjBAErMQErISMEASsxASshIwQBKzEBHykEASk6ASshIwQBKzEBISYEASs3ASApBAE9ASszASgjNwQBKDMoQgEoHxkEASgfKwQBKD8BKCAuBAEoIC4EASY2BAEmNgQBNyY2BAEoPAQBKTkEASw8BAEqLgEoNSg1KCtDAREcISYEARQgISMEASoqKDABKzArMCsuKzYBLh5PBh5PBgEwKwYtOzsRBAEpJQEWEQQBKD4yODUjAS8BFkAwOCgeCAZCIBQGITIlKzwTBAEvMQEiJT8GDzVLBgEPFQEPHQFEAQ8jGwYBLQQBTwE3MQFPUSkBDyIkJ0EIN00IBgEdNDYBUDpFATMEATQtAS4xAU9RKQEdTwYPK0EGAR00NgEsBAEyKwFEHTEYEx8WIBkqMTEYCjAhTU5HRjIyGAo5IUVGRE4lSyZGLxwMCikPFggYLA0XEwYEAgEbZGFydDpjb3JlLXBhdGNoL2RvdWJsZS5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvZnVuY3Rpb24uZGFydIcgLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9DbG9zdXJlIGltcGxlbWVudHMgRnVuY3Rpb24gewogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSBuYXRpdmUgIkNsb3N1cmVfZXF1YWxzIjsKCiAgaW50IGdldCBoYXNoQ29kZSB7CiAgICBfaGFzaCA/Pz0gX2NvbXB1dGVIYXNoKCk7CiAgICByZXR1cm4gX2hhc2g7CiAgfQoKICBfQ2xvc3VyZSBnZXQgY2FsbCA9PiB0aGlzOwoKICBfQ2xvc3VyZSBfY2xvbmUoKSBuYXRpdmUgIkNsb3N1cmVfY2xvbmUiOwoKICBpbnQgX2NvbXB1dGVIYXNoKCkgbmF0aXZlICJDbG9zdXJlX2NvbXB1dGVIYXNoIjsKCiAgLy8gTm8gaW5zdGFuY2UgZmllbGRzIHNob3VsZCBiZSBkZWNsYXJlZCBiZWZvcmUgdGhlIGZvbGxvd2luZyBmaWVsZHMgd2hvc2UKICAvLyBvZmZzZXRzIG11c3QgYmUgaWRlbnRpY2FsIGluIERhcnQgYW5kIEMrKy4KCiAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGRlY2xhcmVkIGJvdGggaW4gcmF3X29iamVjdC5oIChmb3IgZGlyZWN0IGFjY2VzcwogIC8vIGZyb20gQysrIGNvZGUpIGFuZCBhbHNvIGhlcmUgc28gdGhhdCB0aGUgb2Zmc2V0LXRvLWZpZWxkIG1hcCB1c2VkIGJ5CiAgLy8gZGVmZXJyZWQgb2JqZWN0cyBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4KICAvLyBDYXV0aW9uOiBUaGVzZSBmaWVsZHMgYXJlIG5vdCBEYXJ0IGluc3RhbmNlcywgYnV0IFZNIG9iamVjdHMuIFRoZWlyIERhcnQKICAvLyBuYW1lcyBkbyBub3QgbmVlZCB0byBtYXRjaCB0aGUgQysrIG5hbWVzLCBidXQgdGhleSBtdXN0IGJlIHByaXZhdGUuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfaW5zdGFudGlhdG9yX3R5cGVfYXJndW1lbnRzOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICB2YXIgX2Z1bmN0aW9uX3R5cGVfYXJndW1lbnRzOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICB2YXIgX2RlbGF5ZWRfdHlwZV9hcmd1bWVudHM7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfZnVuY3Rpb247CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfY29udGV4dDsKCiAgLy8gTm90ZTogX0Nsb3N1cmUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBWTSAibWFnaWNhbGx5Iiwgd2l0aG91dCBpbnZva2luZwogIC8vIGNvbnN0cnVjdG9yLiBTbywgX0Nsb3N1cmUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBuZXZlciBjb21waWxlZCBhbmQKICAvLyBkZXRlY3Rpb24gb2YgZGVmYXVsdC1pbml0aWFsaXplZCBmaWVsZHMgaXMgbm90IHBlcmZvcm1lZC4KICAvLyBBcyBhIGNvbnNlcXVlbmNlLCBWTSBpbmNvcnJlY3RseSBhc3N1bWVzIHRoYXQgX2hhc2ggZmllbGQgaXMgbm90CiAgLy8gbnVsbGFibGUgYW5kIG1heSBpbmNvcnJlY3RseSByZW1vdmUgJ2lmIChfaGFzaCA9PSBudWxsKScgaW4gZ2V0Omhhc2hDb2RlLgogIC8vIFRoaXMgaW5pdGlhbGl6ZXIgbWFrZXMgX2hhc2ggZmllbGQgbnVsbGFibGUgZXZlbiB3aXRob3V0IGNvbnN0cnVjdG9yCiAgLy8gY29tcGlsYXRpb24uCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIHZhciBfaGFzaCA9IG51bGw7Cn0KNABOTjwBHgEaJToBFR4SBAEdASwBMwFNMAFPSi9OSRwkHCAcHxwRHBABTEk/Rk9KEhwUAgEdZGFydDpjb3JlLXBhdGNoL2Z1bmN0aW9uLmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9ncm93YWJsZV9hcnJheS5kYXJ0rRIvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0dyb3dhYmxlTGlzdDxUPiBleHRlbmRzIExpc3RCYXNlPFQ+IHsKICB2b2lkIGluc2VydChpbnQgaW5kZXgsIFQgZWxlbWVudCkgewogICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IGxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIGxlbmd0aCk7CiAgICB9CiAgICBpZiAoaW5kZXggPT0gdGhpcy5sZW5ndGgpIHsKICAgICAgYWRkKGVsZW1lbnQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgb2xkTGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICAvLyBXZSBhcmUgbW9kaWZ5aW5nIHRoZSBsZW5ndGgganVzdCBiZWxvdyB0aGUgaXMtY2hlY2suIFdpdGhvdXQgdGhlIGNoZWNrCiAgICAvLyBBcnJheS5jb3B5IGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiwgbGVhdmluZyB0aGUgbGlzdCBpbiBhIGJhZCBzdGF0ZQogICAgLy8gKHdpdGggYSBsZW5ndGggdGhhdCBoYXMgYmVlbiBpbmNyZWFzZWQsIGJ1dCB3aXRob3V0IGEgbmV3IGVsZW1lbnQpLgogICAgaWYgKGluZGV4IGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGluZGV4KTsKICAgIHRoaXMubGVuZ3RoKys7CiAgICBMaXN0cy5jb3B5KHRoaXMsIGluZGV4LCB0aGlzLCBpbmRleCArIDEsIG9sZExlbmd0aCAtIGluZGV4KTsKICAgIHRoaXNbaW5kZXhdID0gZWxlbWVudDsKICB9CgogIFQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CiAgICB2YXIgcmVzdWx0ID0gdGhpc1tpbmRleF07CiAgICBpbnQgbmV3TGVuZ3RoID0gdGhpcy5sZW5ndGggLSAxOwogICAgaWYgKGluZGV4IDwgbmV3TGVuZ3RoKSB7CiAgICAgIExpc3RzLmNvcHkodGhpcywgaW5kZXggKyAxLCB0aGlzLCBpbmRleCwgbmV3TGVuZ3RoIC0gaW5kZXgpOwogICAgfQogICAgdGhpcy5sZW5ndGggPSBuZXdMZW5ndGg7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgYm9vbCByZW1vdmUoT2JqZWN0IGVsZW1lbnQpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpc1tpXSA9PSBlbGVtZW50KSB7CiAgICAgICAgcmVtb3ZlQXQoaSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgaW5zZXJ0QWxsKGludCBpbmRleCwgSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIGxlbmd0aCk7CiAgICB9CiAgICAvLyBUT0RPKGZsb2l0c2NoKTogd2UgY2FuIHByb2JhYmx5IGRldGVjdCBtb3JlIGNhc2VzLgogICAgaWYgKGl0ZXJhYmxlIGlzISBMaXN0ICYmIGl0ZXJhYmxlIGlzISBTZXQgJiYgaXRlcmFibGUgaXMhIFN1Ykxpc3RJdGVyYWJsZSkgewogICAgICBpdGVyYWJsZSA9IGl0ZXJhYmxlLnRvTGlzdCgpOwogICAgfQogICAgaW50IGluc2VydGlvbkxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aDsKICAgIC8vIFRoZXJlIG1pZ2h0IGJlIGVycm9ycyBhZnRlciB0aGUgbGVuZ3RoIGNoYW5nZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGlzdAogICAgLy8gd2lsbCBlbmQgdXAgYmVpbmcgbW9kaWZpZWQgYnV0IHRoZSBvcGVyYXRpb24gbm90IGNvbXBsZXRlLiBVbmxlc3Mgd2UKICAgIC8vIGFsd2F5cyBnbyB0aHJvdWdoIGEgInRvTGlzdCIgd2UgY2FuJ3QgcmVhbGx5IGF2b2lkIHRoYXQuCiAgICB0aGlzLmxlbmd0aCArPSBpbnNlcnRpb25MZW5ndGg7CiAgICBzZXRSYW5nZShpbmRleCArIGluc2VydGlvbkxlbmd0aCwgdGhpcy5sZW5ndGgsIHRoaXMsIGluZGV4KTsKICAgIHNldEFsbChpbmRleCwgaXRlcmFibGUpOwogIH0KCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxUPiBpdGVyYWJsZSkgewogICAgaWYgKGl0ZXJhYmxlIGlzIExpc3QpIHsKICAgICAgc2V0UmFuZ2UoaW5kZXgsIGluZGV4ICsgaXRlcmFibGUubGVuZ3RoLCBpdGVyYWJsZSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKFQgZWxlbWVudCBpbiBpdGVyYWJsZSkgewogICAgICAgIHRoaXNbaW5kZXgrK10gPSBlbGVtZW50OwogICAgICB9CiAgICB9CiAgfQoKICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgTGlzdHMuY29weSh0aGlzLCBlbmQsIHRoaXMsIHN0YXJ0LCB0aGlzLmxlbmd0aCAtIGVuZCk7CiAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIC0gKGVuZCAtIHN0YXJ0KTsKICB9CgogIExpc3Q8VD4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgdGhpcy5sZW5ndGgpOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gPFQ+W107CiAgICBMaXN0IGxpc3QgPSBuZXcgX0xpc3QobGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgbGlzdFtpXSA9IHRoaXNbc3RhcnQgKyBpXTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBuZXcgX0dyb3dhYmxlTGlzdDxUPi53aXRoRGF0YShsaXN0KTsKICAgIHJlc3VsdC5fc2V0TGVuZ3RoKGxlbmd0aCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZmFjdG9yeSBfR3Jvd2FibGVMaXN0KGludCBsZW5ndGgpIHsKICAgIHZhciBkYXRhID0gX2FsbG9jYXRlRGF0YShsZW5ndGgpOwogICAgdmFyIHJlc3VsdCA9IG5ldyBfR3Jvd2FibGVMaXN0PFQ+LndpdGhEYXRhKGRhdGEpOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmYWN0b3J5IF9Hcm93YWJsZUxpc3Qud2l0aENhcGFjaXR5KGludCBjYXBhY2l0eSkgewogICAgdmFyIGRhdGEgPSBfYWxsb2NhdGVEYXRhKGNhcGFjaXR5KTsKICAgIHJldHVybiBuZXcgX0dyb3dhYmxlTGlzdDxUPi53aXRoRGF0YShkYXRhKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0dyb3dhYmxlTGlzdCkKICBmYWN0b3J5IF9Hcm93YWJsZUxpc3Qud2l0aERhdGEoX0xpc3QgZGF0YSkgbmF0aXZlICJHcm93YWJsZUxpc3RfYWxsb2NhdGUiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBfY2FwYWNpdHkgbmF0aXZlICJHcm93YWJsZUxpc3RfZ2V0Q2FwYWNpdHkiOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBsZW5ndGggbmF0aXZlICJHcm93YWJsZUxpc3RfZ2V0TGVuZ3RoIjsKCiAgdm9pZCBzZXQgbGVuZ3RoKGludCBuZXdfbGVuZ3RoKSB7CiAgICBpbnQgb2xkX2NhcGFjaXR5ID0gX2NhcGFjaXR5OwogICAgaW50IG5ld19jYXBhY2l0eSA9IG5ld19sZW5ndGg7CiAgICBpZiAobmV3X2NhcGFjaXR5ID4gb2xkX2NhcGFjaXR5KSB7CiAgICAgIF9ncm93KG5ld19jYXBhY2l0eSk7CiAgICAgIF9zZXRMZW5ndGgobmV3X2xlbmd0aCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFdlIGFyZSBzaHJpbmtpbmcuIFBpY2sgdGhlIG1ldGhvZCB3aGljaCBoYXMgZmV3ZXIgd3JpdGVzLgogICAgLy8gSW4gdGhlIHNocmluay10by1maXQgcGF0aCwgd2Ugd3JpdGUgfG5ld19jYXBhY2l0eSArIG5ld19sZW5ndGh8IHdvcmRzCiAgICAvLyAobnVsbCBpbml0ICsgY29weSkuCiAgICAvLyBJbiB0aGUgbm9uLXNocmluay10by1maXQgcGF0aCwgd2Ugd3JpdGUgfGxlbmd0aCAtIG5ld19sZW5ndGh8IHdvcmRzCiAgICAvLyAobnVsbCBvdmVyd3JpdGUpLgogICAgZmluYWwgYm9vbCBzaG91bGRTaHJpbmtUb0ZpdCA9CiAgICAgICAgKG5ld19jYXBhY2l0eSArIG5ld19sZW5ndGgpIDwgKGxlbmd0aCAtIG5ld19sZW5ndGgpOwogICAgaWYgKHNob3VsZFNocmlua1RvRml0KSB7CiAgICAgIF9zaHJpbmsobmV3X2NhcGFjaXR5LCBuZXdfbGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSBuZXdfbGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzW2ldID0gbnVsbDsKICAgICAgfQogICAgfQogICAgX3NldExlbmd0aChuZXdfbGVuZ3RoKTsKICB9CgogIHZvaWQgX3NldExlbmd0aChpbnQgbmV3X2xlbmd0aCkgbmF0aXZlICJHcm93YWJsZUxpc3Rfc2V0TGVuZ3RoIjsKCiAgdm9pZCBfc2V0RGF0YShfTGlzdCBhcnJheSkgbmF0aXZlICJHcm93YWJsZUxpc3Rfc2V0RGF0YSI7CgogIFQgb3BlcmF0b3IgW10oaW50IGluZGV4KSBuYXRpdmUgIkdyb3dhYmxlTGlzdF9nZXRJbmRleGVkIjsKCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBUIHZhbHVlKSB7CiAgICBfc2V0SW5kZXhlZChpbmRleCwgdmFsdWUpOwogIH0KCiAgdm9pZCBfc2V0SW5kZXhlZChpbnQgaW5kZXgsIFQgdmFsdWUpIG5hdGl2ZSAiR3Jvd2FibGVMaXN0X3NldEluZGV4ZWQiOwoKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICB2b2lkIGFkZChUIHZhbHVlKSB7CiAgICB2YXIgbGVuID0gbGVuZ3RoOwogICAgaWYgKGxlbiA9PSBfY2FwYWNpdHkpIHsKICAgICAgX2dyb3coX25leHRDYXBhY2l0eShsZW4pKTsKICAgIH0KICAgIF9zZXRMZW5ndGgobGVuICsgMSk7CiAgICB0aGlzW2xlbl0gPSB2YWx1ZTsKICB9CgogIHZvaWQgYWRkQWxsKEl0ZXJhYmxlPFQ+IGl0ZXJhYmxlKSB7CiAgICB2YXIgbGVuID0gbGVuZ3RoOwogICAgZmluYWwgY2lkID0gQ2xhc3NJRC5nZXRJRChpdGVyYWJsZSk7CiAgICBmaW5hbCBpc1ZNTGlzdCA9IChjaWQgPT0gQ2xhc3NJRC5jaWRBcnJheSkgfHwKICAgICAgICAoY2lkID09IENsYXNzSUQuY2lkR3Jvd2FibGVPYmplY3RBcnJheSkgfHwKICAgICAgICAoY2lkID09IENsYXNzSUQuY2lkSW1tdXRhYmxlQXJyYXkpOwogICAgaWYgKGlzVk1MaXN0IHx8IChpdGVyYWJsZSBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSkpIHsKICAgICAgdmFyIGNhcCA9IF9jYXBhY2l0eTsKICAgICAgLy8gUHJlZ3JvdyBpZiB3ZSBrbm93IGl0ZXJhYmxlLmxlbmd0aC4KICAgICAgdmFyIGl0ZXJMZW4gPSBpdGVyYWJsZS5sZW5ndGg7CiAgICAgIHZhciBuZXdMZW4gPSBsZW4gKyBpdGVyTGVuOwogICAgICBpZiAobmV3TGVuID4gY2FwKSB7CiAgICAgICAgZG8gewogICAgICAgICAgY2FwID0gX25leHRDYXBhY2l0eShjYXApOwogICAgICAgIH0gd2hpbGUgKG5ld0xlbiA+IGNhcCk7CiAgICAgICAgX2dyb3coY2FwKTsKICAgICAgfQogICAgICBpZiAoaXNWTUxpc3QpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsKGl0ZXJhYmxlLCB0aGlzKSkgewogICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2V0TGVuZ3RoKG5ld0xlbik7CiAgICAgICAgZmluYWwgTGlzdEJhc2U8VD4gaXRlcmFibGVBc0xpc3QgPSBpdGVyYWJsZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJMZW47IGkrKykgewogICAgICAgICAgdGhpc1tsZW4rK10gPSBpdGVyYWJsZUFzTGlzdFtpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBJdGVyYXRvciBpdCA9IGl0ZXJhYmxlLml0ZXJhdG9yOwogICAgaWYgKCFpdC5tb3ZlTmV4dCgpKSByZXR1cm47CiAgICBkbyB7CiAgICAgIHdoaWxlIChsZW4gPCBfY2FwYWNpdHkpIHsKICAgICAgICBpbnQgbmV3TGVuID0gbGVuICsgMTsKICAgICAgICB0aGlzLl9zZXRMZW5ndGgobmV3TGVuKTsKICAgICAgICB0aGlzW2xlbl0gPSBpdC5jdXJyZW50OwogICAgICAgIGlmICghaXQubW92ZU5leHQoKSkgcmV0dXJuOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBuZXdMZW4pIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IodGhpcyk7CiAgICAgICAgbGVuID0gbmV3TGVuOwogICAgICB9CiAgICAgIF9ncm93KF9uZXh0Q2FwYWNpdHkoX2NhcGFjaXR5KSk7CiAgICB9IHdoaWxlICh0cnVlKTsKICB9CgogIFQgcmVtb3ZlTGFzdCgpIHsKICAgIHZhciBsZW4gPSBsZW5ndGggLSAxOwogICAgdmFyIGVsZW0gPSB0aGlzW2xlbl07CiAgICB0aGlzLmxlbmd0aCA9IGxlbjsKICAgIHJldHVybiBlbGVtOwogIH0KCiAgVCBnZXQgZmlyc3QgewogICAgaWYgKGxlbmd0aCA+IDApIHJldHVybiB0aGlzWzBdOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICBUIGdldCBsYXN0IHsKICAgIGlmIChsZW5ndGggPiAwKSByZXR1cm4gdGhpc1tsZW5ndGggLSAxXTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgVCBnZXQgc2luZ2xlIHsKICAgIGlmIChsZW5ndGggPT0gMSkgcmV0dXJuIHRoaXNbMF07CiAgICBpZiAobGVuZ3RoID09IDApIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogIH0KCiAgLy8gU2hhcmVkIGFycmF5IHVzZWQgYXMgYmFja2luZyBmb3IgbmV3IGVtcHR5IGdyb3dhYmxlIGFycmF5cy4KICBzdGF0aWMgZmluYWwgX0xpc3QgX2VtcHR5TGlzdCA9IG5ldyBfTGlzdCgwKTsKCiAgc3RhdGljIF9MaXN0IF9hbGxvY2F0ZURhdGEoaW50IGNhcGFjaXR5KSB7CiAgICBpZiAoY2FwYWNpdHkgPT0gMCkgewogICAgICAvLyBVc2Ugc2hhcmVkIGVtcHR5IGxpc3QgYXMgYmFja2luZy4KICAgICAgcmV0dXJuIF9lbXB0eUxpc3Q7CiAgICB9CiAgICAvLyBSb3VuZCB1cCBzaXplIHRvIHRoZSBuZXh0IG9kZCBudW1iZXIsIHNpbmNlIHRoaXMgaXMgZnJlZQogICAgLy8gYmVjYXVzZSBvZiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIHRoZSBHQy4KICAgIHJldHVybiBuZXcgX0xpc3QoY2FwYWNpdHkgfCAxKTsKICB9CgogIC8vIEdyb3cgZnJvbSAwIHRvIDMsIGFuZCB0aGVuIGRvdWJsZSArIDEuCiAgaW50IF9uZXh0Q2FwYWNpdHkoaW50IG9sZF9jYXBhY2l0eSkgPT4gKG9sZF9jYXBhY2l0eSAqIDIpIHwgMzsKCiAgdm9pZCBfZ3JvdyhpbnQgbmV3X2NhcGFjaXR5KSB7CiAgICB2YXIgbmV3RGF0YSA9IF9hbGxvY2F0ZURhdGEobmV3X2NhcGFjaXR5KTsKICAgIC8vIFRoaXMgaXMgYSB3b3JrLWFyb3VuZCBmb3IgZGFydGJ1Zy5jb20vMzAwOTA6IGFycmF5LWJvdW5kLWNoZWNrCiAgICAvLyBnZW5lcmFsaXphdGlvbiBjYXVzZXMgZXhjZXNzaXZlIGRlb3B0aW1pemF0aW9ucyBiZWNhdXNlIGl0CiAgICAvLyBob2lzdHMgQ2hlY2tBcnJheUJvdW5kKGksIC4uLikgb3V0IG9mIHRoZSBsb29wIGJlbG93IGFuZCB0dXJucyBpdAogICAgLy8gaW50byBDaGVja0FycmF5Qm91bmQobGVuZ3RoIC0gMSwgLi4uKS4gV2hpY2ggZGVvcHRpbWl6ZXMKICAgIC8vIGlmIGxlbmd0aCA9PSAwLiBIb3dldmVyIHRoZSBsb29wIGl0c2VsZiBkb2VzIG5vdCBleGVjdXRlCiAgICAvLyBpZiBsZW5ndGggPT0gMC4KICAgIGlmIChsZW5ndGggPiAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBuZXdEYXRhW2ldID0gdGhpc1tpXTsKICAgICAgfQogICAgfQogICAgX3NldERhdGEobmV3RGF0YSk7CiAgfQoKICB2b2lkIF9zaHJpbmsoaW50IG5ld19jYXBhY2l0eSwgaW50IG5ld19sZW5ndGgpIHsKICAgIHZhciBuZXdEYXRhID0gX2FsbG9jYXRlRGF0YShuZXdfY2FwYWNpdHkpOwogICAgLy8gVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZvciBkYXJ0YnVnLmNvbS8zMDA5MC4gU2VlIHRoZSBjb21tZW50IGluIF9ncm93LgogICAgaWYgKG5ld19sZW5ndGggPiAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3X2xlbmd0aDsgaSsrKSB7CiAgICAgICAgbmV3RGF0YVtpXSA9IHRoaXNbaV07CiAgICAgIH0KICAgIH0KICAgIF9zZXREYXRhKG5ld0RhdGEpOwogIH0KCiAgLy8gSXRlcmFibGUgaW50ZXJmYWNlLgoKICB2b2lkIGZvckVhY2goZihUIGVsZW1lbnQpKSB7CiAgICBpbnQgaW5pdGlhbExlbmd0aCA9IGxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgZih0aGlzW2ldKTsKICAgICAgaWYgKGxlbmd0aCAhPSBpbml0aWFsTGVuZ3RoKSB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkVycm9yKHRoaXMpOwogICAgfQogIH0KCiAgU3RyaW5nIGpvaW4oW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIGZpbmFsIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuICIiOwogICAgaWYgKGxlbmd0aCA9PSAxKSByZXR1cm4gIiR7dGhpc1swXX0iOwogICAgaWYgKHNlcGFyYXRvci5pc05vdEVtcHR5KSByZXR1cm4gX2pvaW5XaXRoU2VwYXJhdG9yKHNlcGFyYXRvcik7CiAgICB2YXIgaSA9IDA7CiAgICB2YXIgY29kZVVuaXRDb3VudCA9IDA7CiAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewogICAgICBmaW5hbCBlbGVtZW50ID0gdGhpc1tpXTsKICAgICAgLy8gV2hpbGUgbGlzdCBjb250YWlucyBvbmUtYnl0ZSBzdHJpbmdzLgogICAgICBpZiAoZWxlbWVudCBpcyBfT25lQnl0ZVN0cmluZykgewogICAgICAgIGNvZGVVbml0Q291bnQgKz0gZWxlbWVudC5sZW5ndGg7CiAgICAgICAgaSsrOwogICAgICAgIC8vIExvb3AgYmFjayB3aGlsZSBzdHJpbmdzIGFyZSBvbmUtYnl0ZSBzdHJpbmdzLgogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8vIE90aGVyd2lzZSwgbmV2ZXIgbG9vcCBiYWNrIHRvIHRoZSBvdXRlciBsb29wLCBhbmQKICAgICAgLy8gaGFuZGxlIHRoZSByZW1haW5pbmcgc3RyaW5ncyBiZWxvdy4KCiAgICAgIC8vIExvb3Agd2hpbGUgZWxlbWVudHMgYXJlIHN0cmluZ3MsCiAgICAgIGZpbmFsIGludCBmaXJzdE5vbk9uZUJ5dGVTdHJpbmdMaW1pdCA9IGk7CiAgICAgIHZhciBuZXh0RWxlbWVudCA9IGVsZW1lbnQ7CiAgICAgIHdoaWxlIChuZXh0RWxlbWVudCBpcyBTdHJpbmcpIHsKICAgICAgICBpKys7CiAgICAgICAgaWYgKGkgPT0gbGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2NvbmNhdFJhbmdlTmF0aXZlKHRoaXMsIDAsIGxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIG5leHRFbGVtZW50ID0gdGhpc1tpXTsKICAgICAgfQoKICAgICAgLy8gTm90IGFsbCBlbGVtZW50cyBhcmUgc3RyaW5ncywgc28gYWxsb2NhdGUgYSBuZXcgYmFja2luZyBhcnJheS4KICAgICAgZmluYWwgbGlzdCA9IG5ldyBfTGlzdChsZW5ndGgpOwogICAgICBmb3IgKGludCBjb3B5SW5kZXggPSAwOyBjb3B5SW5kZXggPCBpOyBjb3B5SW5kZXgrKykgewogICAgICAgIGxpc3RbY29weUluZGV4XSA9IHRoaXNbY29weUluZGV4XTsKICAgICAgfQogICAgICAvLyBJcyBub24temVybyBpZiBsaXN0IGNvbnRhaW5zIGEgbm9uLW9uZWJ5dGUgc3RyaW5nLgogICAgICB2YXIgb25lYnl0ZUNhbmFyeSA9IGkgLSBmaXJzdE5vbk9uZUJ5dGVTdHJpbmdMaW1pdDsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBmaW5hbCBTdHJpbmcgZWxlbWVudFN0cmluZyA9ICIkbmV4dEVsZW1lbnQiOwogICAgICAgIG9uZWJ5dGVDYW5hcnkgfD0KICAgICAgICAgICAgKENsYXNzSUQuZ2V0SUQoZWxlbWVudFN0cmluZykgXiBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpOwogICAgICAgIGxpc3RbaV0gPSBlbGVtZW50U3RyaW5nOwogICAgICAgIGNvZGVVbml0Q291bnQgKz0gZWxlbWVudFN0cmluZy5sZW5ndGg7CiAgICAgICAgaSsrOwogICAgICAgIGlmIChpID09IGxlbmd0aCkgYnJlYWs7CiAgICAgICAgbmV4dEVsZW1lbnQgPSB0aGlzW2ldOwogICAgICB9CiAgICAgIGlmIChvbmVieXRlQ2FuYXJ5ID09IDApIHsKICAgICAgICAvLyBBbGwgZWxlbWVudHMgcmV0dXJuZWQgYSBvbmUtYnl0ZSBzdHJpbmcgZnJvbSB0b1N0cmluZy4KICAgICAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2NvbmNhdEFsbChsaXN0LCBjb2RlVW5pdENvdW50KTsKICAgICAgfQogICAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2NvbmNhdFJhbmdlTmF0aXZlKGxpc3QsIDAsIGxlbmd0aCk7CiAgICB9CiAgICAvLyBBbGwgZWxlbWVudHMgd2VyZSBvbmUtYnl0ZSBzdHJpbmdzLgogICAgcmV0dXJuIF9PbmVCeXRlU3RyaW5nLl9jb25jYXRBbGwodGhpcywgY29kZVVuaXRDb3VudCk7CiAgfQoKICBTdHJpbmcgX2pvaW5XaXRoU2VwYXJhdG9yKFN0cmluZyBzZXBhcmF0b3IpIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICBidWZmZXIud3JpdGUodGhpc1swXSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgYnVmZmVyLndyaXRlKHNlcGFyYXRvcik7CiAgICAgIGJ1ZmZlci53cml0ZSh0aGlzW2ldKTsKICAgIH0KICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICB9CgogIFQgZWxlbWVudEF0KGludCBpbmRleCkgewogICAgcmV0dXJuIHRoaXNbaW5kZXhdOwogIH0KCiAgYm9vbCBnZXQgaXNFbXB0eSB7CiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT0gMDsKICB9CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIHZvaWQgY2xlYXIoKSB7CiAgICB0aGlzLmxlbmd0aCA9IDA7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBMaXN0QmFzZS5saXN0VG9TdHJpbmcodGhpcyk7CgogIEl0ZXJhdG9yPFQ+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IExpc3RJdGVyYXRvcjxUPih0aGlzKTsKICB9CgogIExpc3Q8VD4gdG9MaXN0KHtib29sIGdyb3dhYmxlOiB0cnVlfSkgewogICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgTGlzdCBsaXN0ID0gZ3Jvd2FibGUgPyBuZXcgX0xpc3QobGVuZ3RoKSA6IG5ldyBfTGlzdDxUPihsZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGlzdFtpXSA9IHRoaXNbaV07CiAgICAgIH0KICAgICAgaWYgKCFncm93YWJsZSkgcmV0dXJuIGxpc3Q7CiAgICAgIHZhciByZXN1bHQgPSBuZXcgX0dyb3dhYmxlTGlzdDxUPi53aXRoRGF0YShsaXN0KTsKICAgICAgcmVzdWx0Ll9zZXRMZW5ndGgobGVuZ3RoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiBncm93YWJsZSA/IDxUPltdIDogbmV3IExpc3Q8VD4oMCk7CiAgfQoKICBTZXQ8VD4gdG9TZXQoKSB7CiAgICByZXR1cm4gbmV3IFNldDxUPi5mcm9tKHRoaXMpOwogIH0KfQqBhgBOTjwBHgEaLSYrNAYgFA4GIU5MSzcTQRsEARoeJR1DBh0TBAEgLCAVFQgGEgQBNCc0BjpRJAYrTUxAJEEdBAExHDoNJCEIBgQBKTk7LwQBKj8eIyMnIQY2HxMEASYmNhYhBhMEATUoMAQBMU0BNDcBNDIBJCIjJxseDgZBTRtLGSM9HSkNMhgIBhwEAUMBPAE9ASofBAFJASQWFhwhBhkXBAEmFikyMyw9Gy0lIhoNJCAUCBYpNwohNSwrChAIBiUgCSAeISAkUBYIJxQEARMaGhcRBAEQJCwEAQ8tLAQBESU9KgQBQTABLRkrGQZANCQEASxBASEvRkJJQEAXFikeCAYXBAEzL04aLR4IBhcEARkBHyAnElAGBAEpJCAqRA8bGR8vJykNORIIOy0BKjAhJg0bQgofCAFIJjwrCDw6FTUZRyEvDSAfCCBCPwg+Bis7BAEwLhssHx0GHgQBGxgEARUdBAEjAREVBAE0AR0mBAEqHhZHKRsIIjghFQYuBAETIgQCASNkYXJ0OmNvcmUtcGF0Y2gvZ3Jvd2FibGVfYXJyYXkuZGFydDJvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ltbXV0YWJsZV9tYXAuZGFydJWdLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgovLy8gSW1tdXRhYmxlIG1hcCBjbGFzcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1hcCBsaXRlcmFscy4KLy8gVE9ETyhscm4pOiBFeHRlbmQgTWFwQmFzZSB3aXRoIFVubW9kaWZpYWJsZU1hcE1peGluIHdoZW4gbWl4aW5zCi8vIHN1cHBvcnQgZm9yd2FyZGluZyBjb25zdCBjb25zdHJ1Y3RvcnMuCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0ltbXV0YWJsZU1hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7CiAgZmluYWwgX0ltbXV0YWJsZUxpc3QgX2t2UGFpcnM7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBfSW1tdXRhYmxlTWFwLl9jcmVhdGUoX0ltbXV0YWJsZUxpc3Qga2V5VmFsdWVQYWlycykKICAgICAgOiBfa3ZQYWlycyA9IGtleVZhbHVlUGFpcnM7CgogIE1hcDxLMiwgVjI+IGNhc3Q8SzIsIFYyPigpID0+IE1hcC5jYXN0RnJvbTxLLCBWLCBLMiwgVjI+KHRoaXMpOwogIFYgb3BlcmF0b3IgW10oT2JqZWN0IGtleSkgewogICAgLy8gVG8gcHJlc2VydmUgdGhlIGtleS12YWx1ZSBvcmRlciBvZiB0aGUgbWFwIGxpdGVyYWwsIHRoZSBrZXlzIGFyZQogICAgLy8gbm90IHNvcnRlZC4gTmVlZCB0byBkbyBsaW5lYXIgc2VhcmNoIG9yIGltcGxlbWVudCBhbiBhZGRpdGlvbmFsCiAgICAvLyBsb29rdXAgdGFibGUuCiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9rdlBhaXJzLmxlbmd0aCAtIDE7IGkgKz0gMikgewogICAgICBpZiAoa2V5ID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIF9rdlBhaXJzW2kgKyAxXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiBfa3ZQYWlycy5sZW5ndGggPT0gMDsKICB9CgogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIGludCBnZXQgbGVuZ3RoIHsKICAgIHJldHVybiBfa3ZQYWlycy5sZW5ndGggfi8gMjsKICB9CgogIHZvaWQgZm9yRWFjaCh2b2lkIGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IF9rdlBhaXJzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIGYoX2t2UGFpcnNbaV0sIF9rdlBhaXJzW2kgKyAxXSk7CiAgICB9CiAgfQoKICBJdGVyYWJsZTxLPiBnZXQga2V5cyB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBLZXlJdGVyYWJsZTxLPih0aGlzKTsKICB9CgogIEl0ZXJhYmxlPFY+IGdldCB2YWx1ZXMgewogICAgcmV0dXJuIG5ldyBfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYWJsZTxWPih0aGlzKTsKICB9CgogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfa3ZQYWlycy5sZW5ndGg7IGkgKz0gMikgewogICAgICBpZiAoa2V5ID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgX2t2UGFpcnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaWYgKHZhbHVlID09IF9rdlBhaXJzW2ldKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIHZvaWQgb3BlcmF0b3IgW109KEsga2V5LCBWIHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiQ2Fubm90IHNldCB2YWx1ZSBpbiB1bm1vZGlmaWFibGUgTWFwIik7CiAgfQoKICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3Qgc2V0IHZhbHVlIGluIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgaWZBYnNlbnQoKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBzZXQgdmFsdWUgaW4gdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgdm9pZCBjbGVhcigpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgY2xlYXIgdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgViByZW1vdmUoT2JqZWN0IGtleSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCByZW1vdmUgZnJvbSB1bm1vZGlmaWFibGUgTWFwIik7CiAgfQoKICBJdGVyYWJsZTxNYXBFbnRyeTxLLCBWPj4gZ2V0IGVudHJpZXMgPT4KICAgICAgbmV3IF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhYmxlPEssIFY+KHRoaXMpOwoKICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IGYoSyBrZXksIFYgdmFsdWUpKSB7CiAgICB2YXIgcmVzdWx0ID0gPEsyLCBWMj57fTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2t2UGFpcnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgdmFyIGVudHJ5ID0gZihfa3ZQYWlyc1tpXSwgX2t2UGFpcnNbaSArIDFdKTsKICAgICAgcmVzdWx0W2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IG5ld0VudHJpZXMpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFYgdXBkYXRlKEsga2V5LCBWIHVwZGF0ZShWIHZhbHVlKSwge1YgaWZBYnNlbnQoKX0pIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIE1hcCIpOwogIH0KCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHByZWRpY2F0ZShLIGtleSwgViB2YWx1ZSkpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBNYXAiKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IE1hcEJhc2UubWFwVG9TdHJpbmcodGhpcyk7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBLZXlJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcEtleUl0ZXJhYmxlKHRoaXMuX21hcCk7CgogIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcjxFPihfbWFwKTsKICB9CgogIGludCBnZXQgbGVuZ3RoID0+IF9tYXAubGVuZ3RoOwp9CgpjbGFzcyBfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYWJsZTxFPiBleHRlbmRzIEVmZmljaWVudExlbmd0aEl0ZXJhYmxlPEU+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmFibGUodGhpcy5fbWFwKTsKCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yIHsKICAgIHJldHVybiBuZXcgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmF0b3I8RT4oX21hcCk7CiAgfQoKICBpbnQgZ2V0IGxlbmd0aCA9PiBfbWFwLmxlbmd0aDsKfQoKY2xhc3MgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGU8SywgVj4KICAgIGV4dGVuZHMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IHsKICBmaW5hbCBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGUodGhpcy5fbWFwKTsKCiAgSXRlcmF0b3I8TWFwRW50cnk8SywgVj4+IGdldCBpdGVyYXRvciB7CiAgICByZXR1cm4gbmV3IF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yPEssIFY+KF9tYXApOwogIH0KCiAgaW50IGdldCBsZW5ndGggPT4gX21hcC5sZW5ndGg7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKICBfSW1tdXRhYmxlTWFwIF9tYXA7CiAgaW50IF9uZXh0SW5kZXggPSAwOwogIEUgX2N1cnJlbnQ7CgogIF9JbW11dGFibGVNYXBLZXlJdGVyYXRvcih0aGlzLl9tYXApOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaW50IG5ld0luZGV4ID0gX25leHRJbmRleDsKICAgIGlmIChuZXdJbmRleCA8IF9tYXAubGVuZ3RoKSB7CiAgICAgIF9uZXh0SW5kZXggPSBuZXdJbmRleCArIDE7CiAgICAgIF9jdXJyZW50ID0gX21hcC5fa3ZQYWlyc1tuZXdJbmRleCAqIDJdOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIEUgZ2V0IGN1cnJlbnQgPT4gX2N1cnJlbnQ7Cn0KCmNsYXNzIF9JbW11dGFibGVNYXBWYWx1ZUl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIF9JbW11dGFibGVNYXAgX21hcDsKICBpbnQgX25leHRJbmRleCA9IDA7CiAgRSBfY3VycmVudDsKCiAgX0ltbXV0YWJsZU1hcFZhbHVlSXRlcmF0b3IodGhpcy5fbWFwKTsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGludCBuZXdJbmRleCA9IF9uZXh0SW5kZXg7CiAgICBpZiAobmV3SW5kZXggPCBfbWFwLmxlbmd0aCkgewogICAgICBfbmV4dEluZGV4ID0gbmV3SW5kZXggKyAxOwogICAgICBfY3VycmVudCA9IF9tYXAuX2t2UGFpcnNbbmV3SW5kZXggKiAyICsgMV07CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgX2N1cnJlbnQgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgRSBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKfQoKY2xhc3MgX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmF0b3I8SywgVj4gaW1wbGVtZW50cyBJdGVyYXRvcjxNYXBFbnRyeTxLLCBWPj4gewogIF9JbW11dGFibGVNYXAgX21hcDsKICBpbnQgX25leHRJbmRleCA9IDA7CiAgTWFwRW50cnk8SywgVj4gX2N1cnJlbnQ7CgogIF9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yKHRoaXMuX21hcCk7CgogIGJvb2wgbW92ZU5leHQoKSB7CiAgICBpbnQgbmV3SW5kZXggPSBfbmV4dEluZGV4OwogICAgaWYgKG5ld0luZGV4IDwgX21hcC5sZW5ndGgpIHsKICAgICAgX25leHRJbmRleCA9IG5ld0luZGV4ICsgMTsKICAgICAgX2N1cnJlbnQgPSBuZXcgTWFwRW50cnk8SywgVj4oCiAgICAgICAgICBfbWFwLl9rdlBhaXJzW25ld0luZGV4ICogMl0sIF9tYXAuX2t2UGFpcnNbbmV3SW5kZXggKiAyICsgMV0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIF9jdXJyZW50ID0gbnVsbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIE1hcEVudHJ5PEssIFY+IGdldCBjdXJyZW50ID0+IF9jdXJyZW50Owp9CoDeAE5OPAEeAT1DKhoxIQEcPCIBQh5IRxU3ICAIBhEEARUhBAEjARMhBAEpMycGBAEZMgQBGzQEASEzIBUIBhIEASUzIhUIBhIEASZIBAEhSAQBJ0gEARFBBAEZRwQBKjIBQB0zMycGEwQBOUUEATdFBAEtRQQBNUUEATICAUccJwEdMgQBIQIBSRwpAR00BAEhAgEnNhwpASo3BAEhAgE7FhYOAScBFB8iIS4TBhUSBAEdAgE9FhYOASkBFB8iITITBhUSBAEdAgFNFhYbASkBFB8iISVJEwYVEgQBKgIBImRhcnQ6Y29yZS1wYXRjaC9pbW11dGFibGVfbWFwLmRhcnQtb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9pbnRlZ2Vycy5kYXJ0wABYOy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKYWJzdHJhY3QgY2xhc3MgX0ludGVnZXJJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGludCB7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBudW0gb3BlcmF0b3IgKyhudW0gb3RoZXIpID0+IG90aGVyLl9hZGRGcm9tSW50ZWdlcih0aGlzKTsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIG51bSBvcGVyYXRvciAtKG51bSBvdGhlcikgPT4gb3RoZXIuX3N1YkZyb21JbnRlZ2VyKHRoaXMpOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgbnVtIG9wZXJhdG9yICoobnVtIG90aGVyKSA9PiBvdGhlci5fbXVsRnJvbUludGVnZXIodGhpcyk7CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yIH4vKG51bSBvdGhlcikgewogICAgaWYgKChvdGhlciBpcyBpbnQpICYmIChvdGhlciA9PSAwKSkgewogICAgICB0aHJvdyBjb25zdCBJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24oKTsKICAgIH0KICAgIHJldHVybiBvdGhlci5fdHJ1bmNEaXZGcm9tSW50ZWdlcih0aGlzKTsKICB9CgogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcikgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKSAvIG90aGVyLnRvRG91YmxlKCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIG51bSBvcGVyYXRvciAlKG51bSBvdGhlcikgewogICAgaWYgKChvdGhlciBpcyBpbnQpICYmIChvdGhlciA9PSAwKSkgewogICAgICB0aHJvdyBjb25zdCBJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24oKTsKICAgIH0KICAgIHJldHVybiBvdGhlci5fbW9kdWxvRnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBvcGVyYXRvciAtKCkgewogICAgcmV0dXJuIDAgLSB0aGlzOwogIH0KCiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgb3BlcmF0b3IgJihpbnQgb3RoZXIpID0+IG90aGVyLl9iaXRBbmRGcm9tSW50ZWdlcih0aGlzKTsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBvcGVyYXRvciB8KGludCBvdGhlcikgPT4gb3RoZXIuX2JpdE9yRnJvbUludGVnZXIodGhpcyk7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgb3BlcmF0b3IgXihpbnQgb3RoZXIpID0+IG90aGVyLl9iaXRYb3JGcm9tSW50ZWdlcih0aGlzKTsKCiAgbnVtIHJlbWFpbmRlcihudW0gb3RoZXIpIHsKICAgIHJldHVybiBvdGhlci5fcmVtYWluZGVyRnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfYml0QW5kRnJvbVNtaShfU21pIG90aGVyKSBuYXRpdmUgIkludGVnZXJfYml0QW5kRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9iaXRBbmRGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9iaXRBbmRGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX2JpdE9yRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfYml0T3JGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX2JpdFhvckZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX2JpdFhvckZyb21JbnRlZ2VyIjsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfc2hyRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfc2hyRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9zaGxGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9zaGxGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX2FkZEZyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX2FkZEZyb21JbnRlZ2VyIjsKICBAcHJhZ21hKCJ2bTpub24tbnVsbGFibGUtcmVzdWx0LXR5cGUiKQogIGludCBfc3ViRnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfc3ViRnJvbUludGVnZXIiOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IF9tdWxGcm9tSW50ZWdlcihpbnQgb3RoZXIpIG5hdGl2ZSAiSW50ZWdlcl9tdWxGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfdHJ1bmNEaXZGcm9tSW50ZWdlciI7CiAgQHByYWdtYSgidm06bm9uLW51bGxhYmxlLXJlc3VsdC10eXBlIikKICBpbnQgX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcikgbmF0aXZlICJJbnRlZ2VyX21vZHVsb0Zyb21JbnRlZ2VyIjsKICBpbnQgX3JlbWFpbmRlckZyb21JbnRlZ2VyKGludCBvdGhlcikgewogICAgcmV0dXJuIG90aGVyIC0gKG90aGVyIH4vIHRoaXMpICogdGhpczsKICB9CgogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yID4+KGludCBvdGhlcikgPT4gb3RoZXIuX3NockZyb21JbnRlZ2VyKHRoaXMpOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yIDw8KGludCBvdGhlcikgPT4gb3RoZXIuX3NobEZyb21JbnRlZ2VyKHRoaXMpOwoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA8KG51bSBvdGhlcikgewogICAgcmV0dXJuIG90aGVyID4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID4obnVtIG90aGVyKSB7CiAgICByZXR1cm4gb3RoZXIuX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA+PShudW0gb3RoZXIpIHsKICAgIHJldHVybiAodGhpcyA9PSBvdGhlcikgfHwgKHRoaXMgPiBvdGhlcik7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA8PShudW0gb3RoZXIpIHsKICAgIHJldHVybiAodGhpcyA9PSBvdGhlcikgfHwgKHRoaXMgPCBvdGhlcik7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZ3JlYXRlclRoYW5Gcm9tSW50ZWdlcihpbnQgb3RoZXIpCiAgICAgIG5hdGl2ZSAiSW50ZWdlcl9ncmVhdGVyVGhhbkZyb21JbnRlZ2VyIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMgbnVtKSB7CiAgICAgIHJldHVybiBvdGhlci5fZXF1YWxUb0ludGVnZXIodGhpcyk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfZXF1YWxUb0ludGVnZXIoaW50IG90aGVyKSBuYXRpdmUgIkludGVnZXJfZXF1YWxUb0ludGVnZXIiOwogIGludCBhYnMoKSB7CiAgICByZXR1cm4gdGhpcyA8IDAgPyAtdGhpcyA6IHRoaXM7CiAgfQoKICBpbnQgZ2V0IHNpZ24gewogICAgcmV0dXJuICh0aGlzID4gMCkgPyAxIDogKHRoaXMgPCAwKSA/IC0xIDogMDsKICB9CgogIGJvb2wgZ2V0IGlzRXZlbiA9PiAoKHRoaXMgJiAxKSA9PSAwKTsKICBib29sIGdldCBpc09kZCA9PiAhaXNFdmVuOwogIGJvb2wgZ2V0IGlzTmFOID0+IGZhbHNlOwogIGJvb2wgZ2V0IGlzTmVnYXRpdmUgPT4gdGhpcyA8IDA7CiAgYm9vbCBnZXQgaXNJbmZpbml0ZSA9PiBmYWxzZTsKICBib29sIGdldCBpc0Zpbml0ZSA9PiB0cnVlOwoKICBpbnQgdG9VbnNpZ25lZChpbnQgd2lkdGgpIHsKICAgIHJldHVybiB0aGlzICYgKCgxIDw8IHdpZHRoKSAtIDEpOwogIH0KCiAgaW50IHRvU2lnbmVkKGludCB3aWR0aCkgewogICAgLy8gVGhlIHZhbHVlIG9mIGJpbmFyeSBudW1iZXIgd2VpZ2h0cyBlYWNoIGJpdCBieSBhIHBvd2VyIG9mIHR3by4gIFRoZQogICAgLy8gdHdvcy1jb21wbGVtZW50IHZhbHVlIHdlaWdodHMgdGhlIHNpZ24gYml0IG5lZ2F0aXZlbHkuICBXZSBjb21wdXRlIHRoZQogICAgLy8gdmFsdWUgb2YgdGhlIG5lZ2F0aXZlIHdlaWdodGluZyBieSBpc29sYXRpbmcgdGhlIHNpZ24gYml0IHdpdGggdGhlCiAgICAvLyBjb3JyZWN0IHBvd2VyIG9mIHR3byB3ZWlnaHRpbmcgYW5kIHN1YnRyYWN0aW5nIGl0IGZyb20gdGhlIHZhbHVlIG9mIHRoZQogICAgLy8gbG93ZXIgYml0cy4KICAgIGludCBzaWduTWFzayA9IDEgPDwgKHdpZHRoIC0gMSk7CiAgICByZXR1cm4gKHRoaXMgJiAoc2lnbk1hc2sgLSAxKSkgLSAodGhpcyAmIHNpZ25NYXNrKTsKICB9CgogIGludCBjb21wYXJlVG8obnVtIG90aGVyKSB7CiAgICBjb25zdCBpbnQgRVFVQUwgPSAwLCBMRVNTID0gLTEsIEdSRUFURVIgPSAxOwogICAgaWYgKG90aGVyIGlzIGRvdWJsZSkgewogICAgICBjb25zdCBpbnQgTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUgPSA5MDA3MTk5MjU0NzQwOTkyOyAvLyAyXjUzLgogICAgICBjb25zdCBpbnQgTUlOX0VYQUNUX0lOVF9UT19ET1VCTEUgPSAtTUFYX0VYQUNUX0lOVF9UT19ET1VCTEU7CiAgICAgIGNvbnN0IGJvb2wgbGltaXRJbnRzVG82NEJpdHMgPSAoKDEgPDwgNjQpID09IDApOwogICAgICBpZiAobGltaXRJbnRzVG82NEJpdHMpIHsKICAgICAgICAvLyBXaXRoIGludGVnZXJzIGxpbWl0ZWQgdG8gNjQgYml0cywgZG91YmxlLnRvSW50KCkgY2xhbXBzCiAgICAgICAgLy8gZG91YmxlIHZhbHVlIHRvIGZpdCBpbnRvIHRoZSBNSU5fSU5UNjQuLk1BWF9JTlQ2NCByYW5nZS4KICAgICAgICAvLyBDaGVjayBpZiB0aGUgZG91YmxlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhpcyByYW5nZS4KICAgICAgICAvLyBUaGlzIGNoZWNrIGhhbmRsZXMgKy8taW5maW5pdHkgYXMgd2VsbC4KICAgICAgICBjb25zdCBkb3VibGUgbWluSW50NjRBc0RvdWJsZSA9IC05MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgLy8gTUFYX0lOVDY0IGlzIG5vdCBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZSBpbiBkb3VibGVzLCBzbwogICAgICAgIC8vIGNoZWNrIGFnYWluc3QgKE1BWF9JTlQ2NCArIDEpLgogICAgICAgIGNvbnN0IGRvdWJsZSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4LjA7CiAgICAgICAgaWYgKG90aGVyIDwgbWluSW50NjRBc0RvdWJsZSkgewogICAgICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICAgICAgfSBlbHNlIGlmIChvdGhlciA+PSBtYXhJbnQ2NFBsdXMxQXNEb3VibGUpIHsKICAgICAgICAgIHJldHVybiBMRVNTOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAob3RoZXIuaXNJbmZpbml0ZSkgewogICAgICAgICAgcmV0dXJuIG90aGVyLmlzTmVnYXRpdmUgPyBHUkVBVEVSIDogTEVTUzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG90aGVyLmlzTmFOKSB7CiAgICAgICAgcmV0dXJuIExFU1M7CiAgICAgIH0KICAgICAgaWYgKE1JTl9FWEFDVF9JTlRfVE9fRE9VQkxFIDw9IHRoaXMgJiYgdGhpcyA8PSBNQVhfRVhBQ1RfSU5UX1RPX0RPVUJMRSkgewogICAgICAgIC8vIExldCB0aGUgZG91YmxlIGltcGxlbWVudGF0aW9uIGRlYWwgd2l0aCAtMC4wLgogICAgICAgIHJldHVybiAtKG90aGVyLmNvbXBhcmVUbyh0aGlzLnRvRG91YmxlKCkpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBJZiBhYnMob3RoZXIpID4gTUFYX0VYQUNUX0lOVF9UT19ET1VCTEUsIHRoZW4gb3RoZXIgaGFzIGFuIGludGVnZXIKICAgICAgICAvLyB2YWx1ZSAobm8gYml0cyBiZWxvdyB0aGUgZGVjaW1hbCBwb2ludCkuCiAgICAgICAgb3RoZXIgPSBvdGhlci50b0ludCgpOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcyA8IG90aGVyKSB7CiAgICAgIHJldHVybiBMRVNTOwogICAgfSBlbHNlIGlmICh0aGlzID4gb3RoZXIpIHsKICAgICAgcmV0dXJuIEdSRUFURVI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gRVFVQUw7CiAgICB9CiAgfQoKICBpbnQgcm91bmQoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIGludCBmbG9vcigpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgaW50IGNlaWwoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIGludCB0cnVuY2F0ZSgpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpcy50b0RvdWJsZSgpOwogIH0KCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKSB7CiAgICByZXR1cm4gdGhpcy50b0RvdWJsZSgpOwogIH0KCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpIHsKICAgIHJldHVybiB0aGlzLnRvRG91YmxlKCk7CiAgfQoKICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpIHsKICAgIHJldHVybiB0aGlzLnRvRG91YmxlKCk7CiAgfQoKICBudW0gY2xhbXAobnVtIGxvd2VyTGltaXQsIG51bSB1cHBlckxpbWl0KSB7CiAgICBpZiAobG93ZXJMaW1pdCBpcyEgbnVtKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGxvd2VyTGltaXQsICJsb3dlckxpbWl0IiwgIm5vdCBhIG51bWJlciIpOwogICAgfQogICAgaWYgKHVwcGVyTGltaXQgaXMhIG51bSkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZSh1cHBlckxpbWl0LCAidXBwZXJMaW1pdCIsICJub3QgYSBudW1iZXIiKTsKICAgIH0KCiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGludGVnZXJzLgogICAgaWYgKGxvd2VyTGltaXQgaXMgaW50ICYmIHVwcGVyTGltaXQgaXMgaW50ICYmIGxvd2VyTGltaXQgPD0gdXBwZXJMaW1pdCkgewogICAgICBpZiAodGhpcyA8IGxvd2VyTGltaXQpIHJldHVybiBsb3dlckxpbWl0OwogICAgICBpZiAodGhpcyA+IHVwcGVyTGltaXQpIHJldHVybiB1cHBlckxpbWl0OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8vIEdlbmVyaWMgY2FzZSBpbnZvbHZpbmcgZG91YmxlcywgYW5kIGludmFsaWQgaW50ZWdlciByYW5nZXMuCiAgICBpZiAobG93ZXJMaW1pdC5jb21wYXJlVG8odXBwZXJMaW1pdCkgPiAwKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKGxvd2VyTGltaXQpOwogICAgfQogICAgaWYgKGxvd2VyTGltaXQuaXNOYU4pIHJldHVybiBsb3dlckxpbWl0OwogICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY2FyZSBmb3IgLTAuMCBmb3IgdGhlIGxvd2VyIGxpbWl0LgogICAgaWYgKHRoaXMgPCBsb3dlckxpbWl0KSByZXR1cm4gbG93ZXJMaW1pdDsKICAgIGlmICh0aGlzLmNvbXBhcmVUbyh1cHBlckxpbWl0KSA+IDApIHJldHVybiB1cHBlckxpbWl0OwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBpbnQgdG9JbnQoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX0RvdWJsZSkKICBkb3VibGUgdG9Eb3VibGUoKSB7CiAgICByZXR1cm4gbmV3IF9Eb3VibGUuZnJvbUludGVnZXIodGhpcyk7CiAgfQoKICBTdHJpbmcgdG9TdHJpbmdBc0ZpeGVkKGludCBmcmFjdGlvbkRpZ2l0cykgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzRml4ZWQoZnJhY3Rpb25EaWdpdHMpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nQXNFeHBvbmVudGlhbChbaW50IGZyYWN0aW9uRGlnaXRzXSkgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzRXhwb25lbnRpYWwoZnJhY3Rpb25EaWdpdHMpOwogIH0KCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbikgewogICAgcmV0dXJuIHRoaXMudG9Eb3VibGUoKS50b1N0cmluZ0FzUHJlY2lzaW9uKHByZWNpc2lvbik7CiAgfQoKICBzdGF0aWMgY29uc3QgX2RpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwoKICBTdHJpbmcgdG9SYWRpeFN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShyYWRpeCwgMiwgMzYsICJyYWRpeCIpOwogICAgfQogICAgaWYgKHJhZGl4ICYgKHJhZGl4IC0gMSkgPT0gMCkgewogICAgICByZXR1cm4gX3RvUG93MlN0cmluZyhyYWRpeCk7CiAgICB9CiAgICBpZiAocmFkaXggPT0gMTApIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7CiAgICBmaW5hbCBib29sIGlzTmVnYXRpdmUgPSB0aGlzIDwgMDsKICAgIGludCB2YWx1ZSA9IGlzTmVnYXRpdmUgPyAtdGhpcyA6IHRoaXM7CiAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCB0aGUgdmFsdWUKICAgICAgLy8gTUlOX0lOVDY0ID0gLTB4ODAwMDAwMDAwMDAwMDAwMCBvdmVyZmxvd3MgYXQgbmVnYXRpb246CiAgICAgIC8vIC1NSU5fSU5UNjQgPT0gTUlOX0lOVDY0LCBzbyBpdCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLgogICAgICByZXR1cm4gX21pbkludDY0VG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICB9CiAgICBMaXN0IHRlbXAgPSBuZXcgTGlzdCgpOwogICAgZG8gewogICAgICBpbnQgZGlnaXQgPSB2YWx1ZSAlIHJhZGl4OwogICAgICB2YWx1ZSB+Lz0gcmFkaXg7CiAgICAgIHRlbXAuYWRkKF9kaWdpdHMuY29kZVVuaXRBdChkaWdpdCkpOwogICAgfSB3aGlsZSAodmFsdWUgPiAwKTsKICAgIGlmIChpc05lZ2F0aXZlKSB0ZW1wLmFkZCgweDJkKTsgLy8gJy0nLgoKICAgIF9PbmVCeXRlU3RyaW5nIHN0cmluZyA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZSh0ZW1wLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMCwgaiA9IHRlbXAubGVuZ3RoOyBqID4gMDsgaSsrKSB7CiAgICAgIHN0cmluZy5fc2V0QXQoaSwgdGVtcFstLWpdKTsKICAgIH0KICAgIHJldHVybiBzdHJpbmc7CiAgfQoKICBTdHJpbmcgX3RvUG93MlN0cmluZyhpbnQgcmFkaXgpIHsKICAgIGludCB2YWx1ZSA9IHRoaXM7CiAgICBpZiAodmFsdWUgPT0gMCkgcmV0dXJuICIwIjsKICAgIGFzc2VydChyYWRpeCAmIChyYWRpeCAtIDEpID09IDApOwogICAgdmFyIG5lZ2F0aXZlID0gdmFsdWUgPCAwOwogICAgdmFyIGJpdHNQZXJEaWdpdCA9IHJhZGl4LmJpdExlbmd0aCAtIDE7CiAgICB2YXIgbGVuZ3RoID0gMDsKICAgIGlmIChuZWdhdGl2ZSkgewogICAgICB2YWx1ZSA9IC12YWx1ZTsKICAgICAgbGVuZ3RoID0gMTsKICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgIC8vIFdpdGggaW50ZWdlcnMgbGltaXRlZCB0byA2NCBiaXRzLCB0aGUgdmFsdWUKICAgICAgICAvLyBNSU5fSU5UNjQgPSAtMHg4MDAwMDAwMDAwMDAwMDAwIG92ZXJmbG93cyBhdCBuZWdhdGlvbjoKICAgICAgICAvLyAtTUlOX0lOVDY0ID09IE1JTl9JTlQ2NCwgc28gaXQgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4KICAgICAgICByZXR1cm4gX21pbkludDY0VG9SYWRpeFN0cmluZyhyYWRpeCk7CiAgICAgIH0KICAgIH0KICAgIC8vIEludGVnZXIgZGl2aXNpb24sIHJvdW5kaW5nIHVwLCB0byBmaW5kIG51bWJlciBvZiBfZGlnaXRzLgogICAgbGVuZ3RoICs9ICh2YWx1ZS5iaXRMZW5ndGggKyBiaXRzUGVyRGlnaXQgLSAxKSB+LyBiaXRzUGVyRGlnaXQ7CiAgICBfT25lQnl0ZVN0cmluZyBzdHJpbmcgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuZ3RoKTsKICAgIHN0cmluZy5fc2V0QXQoMCwgMHgyZCk7IC8vICctJy4gSXMgb3ZlcndyaXR0ZW4gaWYgbm90IG5lZ2F0aXZlLgogICAgdmFyIG1hc2sgPSByYWRpeCAtIDE7CiAgICBkbyB7CiAgICAgIHN0cmluZy5fc2V0QXQoLS1sZW5ndGgsIF9kaWdpdHMuY29kZVVuaXRBdCh2YWx1ZSAmIG1hc2spKTsKICAgICAgdmFsdWUgPj49IGJpdHNQZXJEaWdpdDsKICAgIH0gd2hpbGUgKHZhbHVlID4gMCk7CiAgICByZXR1cm4gc3RyaW5nOwogIH0KCiAgLy8vIENvbnZlcnRzIG5lZ2F0aXZlIHZhbHVlIHRvIHJhZGl4IHN0cmluZy4KICAvLy8gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIGhhbmRsZSBjb3JuZXIgY2FzZSBvZgogIC8vLyBNSU5fSU5UNjQgPSAtMHg4MDAwMDAwMDAwMDAwMDAwLgogIFN0cmluZyBfbWluSW50NjRUb1JhZGl4U3RyaW5nKGludCByYWRpeCkgewogICAgTGlzdCB0ZW1wID0gbmV3IExpc3QoKTsKICAgIGludCB2YWx1ZSA9IHRoaXM7CiAgICBhc3NlcnQodmFsdWUgPCAwKTsKICAgIGRvIHsKICAgICAgaW50IGRpZ2l0ID0gLXZhbHVlLnJlbWFpbmRlcihyYWRpeCk7CiAgICAgIHZhbHVlIH4vPSByYWRpeDsKICAgICAgdGVtcC5hZGQoX2RpZ2l0cy5jb2RlVW5pdEF0KGRpZ2l0KSk7CiAgICB9IHdoaWxlICh2YWx1ZSAhPSAwKTsKICAgIHRlbXAuYWRkKDB4MmQpOyAvLyAnLScuCgogICAgX09uZUJ5dGVTdHJpbmcgc3RyaW5nID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKHRlbXAubGVuZ3RoKTsKICAgIGZvciAoaW50IGkgPSAwLCBqID0gdGVtcC5sZW5ndGg7IGogPiAwOyBpKyspIHsKICAgICAgc3RyaW5nLl9zZXRBdChpLCB0ZW1wWy0tal0pOwogICAgfQogICAgcmV0dXJuIHN0cmluZzsKICB9CgogIC8vIFJldHVybnMgcG93KHRoaXMsIGUpICUgbS4KICBpbnQgbW9kUG93KGludCBlLCBpbnQgbSkgewogICAgaWYgKGUgaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShlLCAiZXhwb25lbnQiLCAibm90IGFuIGludGVnZXIiKTsKICAgIH0KICAgIGlmIChtIGlzISBpbnQpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUobSwgIm1vZHVsdXMiLCAibm90IGFuIGludGVnZXIiKTsKICAgIH0KICAgIGlmIChlIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZSwgMCwgbnVsbCwgImV4cG9uZW50Iik7CiAgICBpZiAobSA8PSAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShtLCAxLCBudWxsLCAibW9kdWx1cyIpOwogICAgaWYgKGUgPT0gMCkgcmV0dXJuIDE7CiAgICBpbnQgYiA9IHRoaXM7CiAgICBpZiAoYiA8IDAgfHwgYiA+IG0pIHsKICAgICAgYiAlPSBtOwogICAgfQogICAgaW50IHIgPSAxOwogICAgd2hpbGUgKGUgPiAwKSB7CiAgICAgIGlmIChlLmlzT2RkKSB7CiAgICAgICAgciA9IChyICogYikgJSBtOwogICAgICB9CiAgICAgIGUgPj49IDE7CiAgICAgIGIgPSAoYiAqIGIpICUgbTsKICAgIH0KICAgIHJldHVybiByOwogIH0KCiAgLy8gSWYgaW52IGlzIGZhbHNlLCByZXR1cm5zIGdjZCh4LCB5KS4KICAvLyBJZiBpbnYgaXMgdHJ1ZSBhbmQgZ2NkKHgsIHkpID0gMSwgcmV0dXJucyBkLCBzbyB0aGF0IGMqeCArIGQqeSA9IDEuCiAgLy8gSWYgaW52IGlzIHRydWUgYW5kIGdjZCh4LCB5KSAhPSAxLCB0aHJvd3MgRXhjZXB0aW9uKCJOb3QgY29wcmltZSIpLgogIHN0YXRpYyBpbnQgX2JpbmFyeUdjZChpbnQgeCwgaW50IHksIGJvb2wgaW52KSB7CiAgICBpbnQgcyA9IDA7CiAgICBpZiAoIWludikgewogICAgICB3aGlsZSAoeC5pc0V2ZW4gJiYgeS5pc0V2ZW4pIHsKICAgICAgICB4ID4+PSAxOwogICAgICAgIHkgPj49IDE7CiAgICAgICAgcysrOwogICAgICB9CiAgICAgIGlmICh5LmlzT2RkKSB7CiAgICAgICAgdmFyIHQgPSB4OwogICAgICAgIHggPSB5OwogICAgICAgIHkgPSB0OwogICAgICB9CiAgICB9CiAgICBmaW5hbCBib29sIGFjID0geC5pc0V2ZW47CiAgICBpbnQgdSA9IHg7CiAgICBpbnQgdiA9IHk7CiAgICBpbnQgYSA9IDEsIGIgPSAwLCBjID0gMCwgZCA9IDE7CiAgICBkbyB7CiAgICAgIHdoaWxlICh1LmlzRXZlbikgewogICAgICAgIHUgPj49IDE7CiAgICAgICAgaWYgKGFjKSB7CiAgICAgICAgICBpZiAoIWEuaXNFdmVuIHx8ICFiLmlzRXZlbikgewogICAgICAgICAgICBhICs9IHk7CiAgICAgICAgICAgIGIgLT0geDsKICAgICAgICAgIH0KICAgICAgICAgIGEgPj49IDE7CiAgICAgICAgfSBlbHNlIGlmICghYi5pc0V2ZW4pIHsKICAgICAgICAgIGIgLT0geDsKICAgICAgICB9CiAgICAgICAgYiA+Pj0gMTsKICAgICAgfQogICAgICB3aGlsZSAodi5pc0V2ZW4pIHsKICAgICAgICB2ID4+PSAxOwogICAgICAgIGlmIChhYykgewogICAgICAgICAgaWYgKCFjLmlzRXZlbiB8fCAhZC5pc0V2ZW4pIHsKICAgICAgICAgICAgYyArPSB5OwogICAgICAgICAgICBkIC09IHg7CiAgICAgICAgICB9CiAgICAgICAgICBjID4+PSAxOwogICAgICAgIH0gZWxzZSBpZiAoIWQuaXNFdmVuKSB7CiAgICAgICAgICBkIC09IHg7CiAgICAgICAgfQogICAgICAgIGQgPj49IDE7CiAgICAgIH0KICAgICAgaWYgKHUgPj0gdikgewogICAgICAgIHUgLT0gdjsKICAgICAgICBpZiAoYWMpIGEgLT0gYzsKICAgICAgICBiIC09IGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdiAtPSB1OwogICAgICAgIGlmIChhYykgYyAtPSBhOwogICAgICAgIGQgLT0gYjsKICAgICAgfQogICAgfSB3aGlsZSAodSAhPSAwKTsKICAgIGlmICghaW52KSByZXR1cm4gdiA8PCBzOwogICAgaWYgKHYgIT0gMSkgewogICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOb3QgY29wcmltZSIpOwogICAgfQogICAgaWYgKGQgPCAwKSB7CiAgICAgIGQgKz0geDsKICAgICAgaWYgKGQgPCAwKSBkICs9IHg7CiAgICB9IGVsc2UgaWYgKGQgPiB4KSB7CiAgICAgIGQgLT0geDsKICAgICAgaWYgKGQgPiB4KSBkIC09IHg7CiAgICB9CiAgICByZXR1cm4gZDsKICB9CgogIC8vIFJldHVybnMgMS90aGlzICUgbSwgd2l0aCBtID4gMC4KICBpbnQgbW9kSW52ZXJzZShpbnQgbSkgewogICAgaWYgKG0gaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShtLCAibW9kdWx1cyIsICJub3QgYW4gaW50ZWdlciIpOwogICAgfQogICAgaWYgKG0gPD0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UobSwgMSwgbnVsbCwgIm1vZHVsdXMiKTsKICAgIGlmIChtID09IDEpIHJldHVybiAwOwogICAgaW50IHQgPSB0aGlzOwogICAgaWYgKCh0IDwgMCkgfHwgKHQgPj0gbSkpIHQgJT0gbTsKICAgIGlmICh0ID09IDEpIHJldHVybiAxOwogICAgaWYgKCh0ID09IDApIHx8ICh0LmlzRXZlbiAmJiBtLmlzRXZlbikpIHsKICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm90IGNvcHJpbWUiKTsKICAgIH0KICAgIHJldHVybiBfYmluYXJ5R2NkKG0sIHQsIHRydWUpOwogIH0KCiAgLy8gUmV0dXJucyBnY2Qgb2YgYWJzKHRoaXMpIGFuZCBhYnMob3RoZXIpLgogIGludCBnY2QoaW50IG90aGVyKSB7CiAgICBpZiAob3RoZXIgaXMhIGludCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShvdGhlciwgIm90aGVyIiwgIm5vdCBhbiBpbnRlZ2VyIik7CiAgICB9CiAgICBpbnQgeCA9IHRoaXMuYWJzKCk7CiAgICBpbnQgeSA9IG90aGVyLmFicygpOwogICAgaWYgKHggPT0gMCkgcmV0dXJuIHk7CiAgICBpZiAoeSA9PSAwKSByZXR1cm4geDsKICAgIGlmICgoeCA9PSAxKSB8fCAoeSA9PSAxKSkgcmV0dXJuIDE7CiAgICByZXR1cm4gX2JpbmFyeUdjZCh4LCB5LCBmYWxzZSk7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9TbWkgZXh0ZW5kcyBfSW50ZWdlckltcGxlbWVudGF0aW9uIHsKICBmYWN0b3J5IF9TbWkuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIl9TbWkgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTSIpOwogIH0KICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRoaXM7CiAgaW50IGdldCBfaWRlbnRpdHlIYXNoQ29kZSA9PiB0aGlzOwogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgb3BlcmF0b3IgfigpIG5hdGl2ZSAiU21pX2JpdE5lZ2F0ZSI7CiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgYml0TGVuZ3RoIG5hdGl2ZSAiU21pX2JpdExlbmd0aCI7CgogIGludCBvcGVyYXRvciAmKGludCBvdGhlcikgPT4gb3RoZXIuX2JpdEFuZEZyb21TbWkodGhpcyk7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgX2JpdEFuZEZyb21TbWkoX1NtaSBvdGhlcikgbmF0aXZlICJTbWlfYml0QW5kRnJvbVNtaSI7CgogIC8qKgogICAqIFRoZSBkaWdpdHMgb2YgJzAwJywgJzAxJywgLi4uICc5OScgYXMgYSBzaW5nbGUgYXJyYXkuCiAgICoKICAgKiBHZXQgdGhlIGRpZ2l0cyBvZiBgbmAsIHdpdGggYDAgPD0gbiA8IDEwMGAsIGFzCiAgICogYF9kaWdpdFRhYmxlW24gKiAyXWAgYW5kIGBfZGlnaXRUYWJsZVtuICogMiArIDFdYC4KICAgKi8KICBzdGF0aWMgY29uc3QgX2RpZ2l0VGFibGUgPSBjb25zdCBbCiAgICAweDMwLCAweDMwLCAweDMwLCAweDMxLCAweDMwLCAweDMyLCAweDMwLCAweDMzLCAvLwogICAgMHgzMCwgMHgzNCwgMHgzMCwgMHgzNSwgMHgzMCwgMHgzNiwgMHgzMCwgMHgzNywgLy8KICAgIDB4MzAsIDB4MzgsIDB4MzAsIDB4MzksIDB4MzEsIDB4MzAsIDB4MzEsIDB4MzEsIC8vCiAgICAweDMxLCAweDMyLCAweDMxLCAweDMzLCAweDMxLCAweDM0LCAweDMxLCAweDM1LCAvLwogICAgMHgzMSwgMHgzNiwgMHgzMSwgMHgzNywgMHgzMSwgMHgzOCwgMHgzMSwgMHgzOSwgLy8KICAgIDB4MzIsIDB4MzAsIDB4MzIsIDB4MzEsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzMsIC8vCiAgICAweDMyLCAweDM0LCAweDMyLCAweDM1LCAweDMyLCAweDM2LCAweDMyLCAweDM3LCAvLwogICAgMHgzMiwgMHgzOCwgMHgzMiwgMHgzOSwgMHgzMywgMHgzMCwgMHgzMywgMHgzMSwgLy8KICAgIDB4MzMsIDB4MzIsIDB4MzMsIDB4MzMsIDB4MzMsIDB4MzQsIDB4MzMsIDB4MzUsIC8vCiAgICAweDMzLCAweDM2LCAweDMzLCAweDM3LCAweDMzLCAweDM4LCAweDMzLCAweDM5LCAvLwogICAgMHgzNCwgMHgzMCwgMHgzNCwgMHgzMSwgMHgzNCwgMHgzMiwgMHgzNCwgMHgzMywgLy8KICAgIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzUsIDB4MzQsIDB4MzYsIDB4MzQsIDB4MzcsIC8vCiAgICAweDM0LCAweDM4LCAweDM0LCAweDM5LCAweDM1LCAweDMwLCAweDM1LCAweDMxLCAvLwogICAgMHgzNSwgMHgzMiwgMHgzNSwgMHgzMywgMHgzNSwgMHgzNCwgMHgzNSwgMHgzNSwgLy8KICAgIDB4MzUsIDB4MzYsIDB4MzUsIDB4MzcsIDB4MzUsIDB4MzgsIDB4MzUsIDB4MzksIC8vCiAgICAweDM2LCAweDMwLCAweDM2LCAweDMxLCAweDM2LCAweDMyLCAweDM2LCAweDMzLCAvLwogICAgMHgzNiwgMHgzNCwgMHgzNiwgMHgzNSwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNywgLy8KICAgIDB4MzYsIDB4MzgsIDB4MzYsIDB4MzksIDB4MzcsIDB4MzAsIDB4MzcsIDB4MzEsIC8vCiAgICAweDM3LCAweDMyLCAweDM3LCAweDMzLCAweDM3LCAweDM0LCAweDM3LCAweDM1LCAvLwogICAgMHgzNywgMHgzNiwgMHgzNywgMHgzNywgMHgzNywgMHgzOCwgMHgzNywgMHgzOSwgLy8KICAgIDB4MzgsIDB4MzAsIDB4MzgsIDB4MzEsIDB4MzgsIDB4MzIsIDB4MzgsIDB4MzMsIC8vCiAgICAweDM4LCAweDM0LCAweDM4LCAweDM1LCAweDM4LCAweDM2LCAweDM4LCAweDM3LCAvLwogICAgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOSwgMHgzOSwgMHgzMCwgMHgzOSwgMHgzMSwgLy8KICAgIDB4MzksIDB4MzIsIDB4MzksIDB4MzMsIDB4MzksIDB4MzQsIDB4MzksIDB4MzUsIC8vCiAgICAweDM5LCAweDM2LCAweDM5LCAweDM3LCAweDM5LCAweDM4LCAweDM5LCAweDM5LCAvLwogIF07CgogIC8qKgogICAqIFJlc3VsdCBvZiBpbnQudG9TdHJpbmcgZm9yIC05OSwgLTk4LCAuLi4sIDk4LCA5OS4KICAgKi8KICBzdGF0aWMgY29uc3QgX3NtYWxsTG9va3VwVGFibGUgPSBjb25zdCBbCiAgICAiLTk5IiwgIi05OCIsICItOTciLCAiLTk2IiwgIi05NSIsICItOTQiLCAiLTkzIiwgIi05MiIsICItOTEiLCAiLTkwIiwgLy8KICAgICItODkiLCAiLTg4IiwgIi04NyIsICItODYiLCAiLTg1IiwgIi04NCIsICItODMiLCAiLTgyIiwgIi04MSIsICItODAiLCAvLwogICAgIi03OSIsICItNzgiLCAiLTc3IiwgIi03NiIsICItNzUiLCAiLTc0IiwgIi03MyIsICItNzIiLCAiLTcxIiwgIi03MCIsIC8vCiAgICAiLTY5IiwgIi02OCIsICItNjciLCAiLTY2IiwgIi02NSIsICItNjQiLCAiLTYzIiwgIi02MiIsICItNjEiLCAiLTYwIiwgLy8KICAgICItNTkiLCAiLTU4IiwgIi01NyIsICItNTYiLCAiLTU1IiwgIi01NCIsICItNTMiLCAiLTUyIiwgIi01MSIsICItNTAiLCAvLwogICAgIi00OSIsICItNDgiLCAiLTQ3IiwgIi00NiIsICItNDUiLCAiLTQ0IiwgIi00MyIsICItNDIiLCAiLTQxIiwgIi00MCIsIC8vCiAgICAiLTM5IiwgIi0zOCIsICItMzciLCAiLTM2IiwgIi0zNSIsICItMzQiLCAiLTMzIiwgIi0zMiIsICItMzEiLCAiLTMwIiwgLy8KICAgICItMjkiLCAiLTI4IiwgIi0yNyIsICItMjYiLCAiLTI1IiwgIi0yNCIsICItMjMiLCAiLTIyIiwgIi0yMSIsICItMjAiLCAvLwogICAgIi0xOSIsICItMTgiLCAiLTE3IiwgIi0xNiIsICItMTUiLCAiLTE0IiwgIi0xMyIsICItMTIiLCAiLTExIiwgIi0xMCIsIC8vCiAgICAiLTkiLCAiLTgiLCAiLTciLCAiLTYiLCAiLTUiLCAiLTQiLCAiLTMiLCAiLTIiLCAiLTEiLCAiMCIsIC8vCiAgICAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAvLwogICAgIjExIiwgIjEyIiwgIjEzIiwgIjE0IiwgIjE1IiwgIjE2IiwgIjE3IiwgIjE4IiwgIjE5IiwgIjIwIiwgLy8KICAgICIyMSIsICIyMiIsICIyMyIsICIyNCIsICIyNSIsICIyNiIsICIyNyIsICIyOCIsICIyOSIsICIzMCIsIC8vCiAgICAiMzEiLCAiMzIiLCAiMzMiLCAiMzQiLCAiMzUiLCAiMzYiLCAiMzciLCAiMzgiLCAiMzkiLCAiNDAiLCAvLwogICAgIjQxIiwgIjQyIiwgIjQzIiwgIjQ0IiwgIjQ1IiwgIjQ2IiwgIjQ3IiwgIjQ4IiwgIjQ5IiwgIjUwIiwgLy8KICAgICI1MSIsICI1MiIsICI1MyIsICI1NCIsICI1NSIsICI1NiIsICI1NyIsICI1OCIsICI1OSIsICI2MCIsIC8vCiAgICAiNjEiLCAiNjIiLCAiNjMiLCAiNjQiLCAiNjUiLCAiNjYiLCAiNjciLCAiNjgiLCAiNjkiLCAiNzAiLCAvLwogICAgIjcxIiwgIjcyIiwgIjczIiwgIjc0IiwgIjc1IiwgIjc2IiwgIjc3IiwgIjc4IiwgIjc5IiwgIjgwIiwgLy8KICAgICI4MSIsICI4MiIsICI4MyIsICI4NCIsICI4NSIsICI4NiIsICI4NyIsICI4OCIsICI4OSIsICI5MCIsIC8vCiAgICAiOTEiLCAiOTIiLCAiOTMiLCAiOTQiLCAiOTUiLCAiOTYiLCAiOTciLCAiOTgiLCAiOTkiIC8vCiAgXTsKCiAgLy8gUG93ZXJzIG9mIDEwIGFib3ZlIDEwMDAwMDAgYXJlIGluZGlzdGluZ3Vpc2hhYmxlIGJ5IGV5ZS4KICBzdGF0aWMgY29uc3QgaW50IF9QT1dfMTBfNyA9IDEwMDAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1BPV18xMF84ID0gMTAwMDAwMDAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1BPV18xMF85ID0gMTAwMDAwMDAwMDsKCiAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIGEgcG9zaXRpdmUgc21pLgogIC8vIE5ldmVyIGNhbGxlZCB3aXRoIG51bWJlcnMgPCAxMDAuIFRoZXNlIGFyZSBoYW5kbGVkIGJlZm9yZSBjYWxsaW5nLgogIHN0YXRpYyBpbnQgX3Bvc2l0aXZlQmFzZTEwTGVuZ3RoKHZhciBzbWkpIHsKICAgIC8vIEEgcG9zaXRpdmUgc21pIGhhcyBsZW5ndGggPD0gMTkgaWYgNjMtYml0LCAgPD0xMCBpZiAzMS1iaXQuCiAgICAvLyBBdm9pZCBjb21wYXJpbmcgYSAzMS1iaXQgc21pIHRvIGEgbm9uLXNtaS4KICAgIGlmIChzbWkgPCAxMDAwKSByZXR1cm4gMzsKICAgIGlmIChzbWkgPCAxMDAwMCkgcmV0dXJuIDQ7CiAgICBpZiAoc21pIDwgX1BPV18xMF83KSB7CiAgICAgIGlmIChzbWkgPCAxMDAwMDApIHJldHVybiA1OwogICAgICBpZiAoc21pIDwgMTAwMDAwMCkgcmV0dXJuIDY7CiAgICAgIHJldHVybiA3OwogICAgfQogICAgaWYgKHNtaSA8IF9QT1dfMTBfOCkgcmV0dXJuIDg7CiAgICBpZiAoc21pIDwgX1BPV18xMF85KSByZXR1cm4gOTsKICAgIHNtaSA9IHNtaSB+LyBfUE9XXzEwXzk7CiAgICAvLyBIYW5kbGUgbnVtYmVycyA8IDEwMCBiZWZvcmUgY2FsbGluZyByZWN1cnNpdmVseS4KICAgIGlmIChzbWkgPCAxMCkgcmV0dXJuIDEwOwogICAgaWYgKHNtaSA8IDEwMCkgcmV0dXJuIDExOwogICAgcmV0dXJuIDkgKyBfcG9zaXRpdmVCYXNlMTBMZW5ndGgoc21pKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIGlmICh0aGlzIDwgMTAwICYmIHRoaXMgPiAtMTAwKSByZXR1cm4gX3NtYWxsTG9va3VwVGFibGVbdGhpcyArIDk5XTsKICAgIGlmICh0aGlzIDwgMCkgcmV0dXJuIF9uZWdhdGl2ZVRvU3RyaW5nKHRoaXMpOwogICAgLy8gSW5zcGlyZWQgYnkgQW5kcmVpIEFsZXhhbmRyZXNjdTogIlRocmVlIE9wdGltaXphdGlvbiBUaXBzIGZvciBDKysiCiAgICAvLyBBdm9pZCBleHBlbnNpdmUgcmVtYWluZGVyIG9wZXJhdGlvbiBieSBkb2luZyBpdCBvbiBtb3JlIHRoYW4KICAgIC8vIG9uZSBkaWdpdCBhdCBhIHRpbWUuCiAgICBjb25zdCBpbnQgRElHSVRfWkVSTyA9IDB4MzA7CiAgICBpbnQgbGVuZ3RoID0gX3Bvc2l0aXZlQmFzZTEwTGVuZ3RoKHRoaXMpOwogICAgX09uZUJ5dGVTdHJpbmcgcmVzdWx0ID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKGxlbmd0aCk7CiAgICBpbnQgaW5kZXggPSBsZW5ndGggLSAxOwogICAgdmFyIHNtaSA9IHRoaXM7CiAgICBkbyB7CiAgICAgIC8vIFR3byBkaWdpdHMgYXQgYSB0aW1lLgogICAgICB2YXIgdHdvRGlnaXRzID0gc21pLnJlbWFpbmRlcigxMDApOwogICAgICBzbWkgPSBzbWkgfi8gMTAwOwogICAgICBpbnQgZGlnaXRJbmRleCA9IHR3b0RpZ2l0cyAqIDI7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXggLSAxLCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4XSk7CiAgICAgIGluZGV4IC09IDI7CiAgICB9IHdoaWxlIChzbWkgPj0gMTAwKTsKICAgIGlmIChzbWkgPCAxMCkgewogICAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJzAnLgogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBESUdJVF9aRVJPICsgc21pKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIHJlbWFpbmRlciBmb3IgdGhpcyBjYXNlLgogICAgICBpbnQgZGlnaXRJbmRleCA9IHNtaSAqIDI7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXggLSAxLCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4XSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gRmluZCB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIGEgbmVnYXRpdmUgc21pLgogIC8vIE5ldmVyIGNhbGxlZCB3aXRoIG51bWJlcnMgPiAtMTAwLiBUaGVzZSBhcmUgaGFuZGxlZCBiZWZvcmUgY2FsbGluZy4KICBzdGF0aWMgaW50IF9uZWdhdGl2ZUJhc2UxMExlbmd0aCh2YXIgbmVnU21pKSB7CiAgICAvLyBBIG5lZ2F0aXZlIHNtaSBoYXMgbGVuZ3RoIDw9IDE5IGlmIDYzLWJpdCwgPD0xMCBpZiAzMS1iaXQuCiAgICAvLyBBdm9pZCBjb21wYXJpbmcgYSAzMS1iaXQgc21pIHRvIGEgbm9uLXNtaS4KICAgIGlmIChuZWdTbWkgPiAtMTAwMCkgcmV0dXJuIDM7CiAgICBpZiAobmVnU21pID4gLTEwMDAwKSByZXR1cm4gNDsKICAgIGlmIChuZWdTbWkgPiAtX1BPV18xMF83KSB7CiAgICAgIGlmIChuZWdTbWkgPiAtMTAwMDAwKSByZXR1cm4gNTsKICAgICAgaWYgKG5lZ1NtaSA+IC0xMDAwMDAwKSByZXR1cm4gNjsKICAgICAgcmV0dXJuIDc7CiAgICB9CiAgICBpZiAobmVnU21pID4gLV9QT1dfMTBfOCkgcmV0dXJuIDg7CiAgICBpZiAobmVnU21pID4gLV9QT1dfMTBfOSkgcmV0dXJuIDk7CiAgICBuZWdTbWkgPSBuZWdTbWkgfi8gX1BPV18xMF85OwogICAgLy8gSGFuZGxlIG51bWJlcnMgPiAtMTAwIGJlZm9yZSBjYWxsaW5nIHJlY3Vyc2l2ZWx5LgogICAgaWYgKG5lZ1NtaSA+IC0xMCkgcmV0dXJuIDEwOwogICAgaWYgKG5lZ1NtaSA+IC0xMDApIHJldHVybiAxMTsKICAgIHJldHVybiA5ICsgX25lZ2F0aXZlQmFzZTEwTGVuZ3RoKG5lZ1NtaSk7CiAgfQoKICAvLyBDb252ZXJ0IGEgbmVnYXRpdmUgc21pIHRvIGEgc3RyaW5nLgogIC8vIERvZXNuJ3QgbmVnYXRlIHRoZSBzbWkgdG8gYXZvaWQgbmVnYXRpbmcgdGhlIG1vc3QgbmVnYXRpdmUgc21pLCB3aGljaAogIC8vIHdvdWxkIGJlY29tZSBhIG5vbi1zbWkuCiAgc3RhdGljIFN0cmluZyBfbmVnYXRpdmVUb1N0cmluZyhpbnQgbmVnU21pKSB7CiAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJy0nCiAgICBjb25zdCBpbnQgTUlOVVNfU0lHTiA9IDB4MmQ7CiAgICAvLyBDaGFyYWN0ZXIgY29kZSBmb3IgJzAnLgogICAgY29uc3QgaW50IERJR0lUX1pFUk8gPSAweDMwOwogICAgaWYgKG5lZ1NtaSA+IC0xMCkgewogICAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKDIpCiAgICAgICAgLi5fc2V0QXQoMCwgTUlOVVNfU0lHTikKICAgICAgICAuLl9zZXRBdCgxLCBESUdJVF9aRVJPIC0gbmVnU21pKTsKICAgIH0KICAgIGlmIChuZWdTbWkgPiAtMTAwKSB7CiAgICAgIGludCBkaWdpdEluZGV4ID0gMiAqIC1uZWdTbWk7CiAgICAgIHJldHVybiBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUoMykKICAgICAgICAuLl9zZXRBdCgwLCBNSU5VU19TSUdOKQogICAgICAgIC4uX3NldEF0KDEsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXhdKQogICAgICAgIC4uX3NldEF0KDIsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXggKyAxXSk7CiAgICB9CiAgICAvLyBOdW1iZXIgb2YgZGlnaXRzLCBub3QgaW5jbHVkaW5nIG1pbnVzLgogICAgaW50IGRpZ2l0Q291bnQgPSBfbmVnYXRpdmVCYXNlMTBMZW5ndGgobmVnU21pKTsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShkaWdpdENvdW50ICsgMSk7CiAgICByZXN1bHQuX3NldEF0KDAsIE1JTlVTX1NJR04pOyAvLyAnLScuCiAgICBpbnQgaW5kZXggPSBkaWdpdENvdW50OwogICAgZG8gewogICAgICB2YXIgdHdvRGlnaXRzID0gbmVnU21pLnJlbWFpbmRlcigxMDApOwogICAgICBuZWdTbWkgPSBuZWdTbWkgfi8gMTAwOwogICAgICBpbnQgZGlnaXRJbmRleCA9IC10d29EaWdpdHMgKiAyOwogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBfZGlnaXRUYWJsZVtkaWdpdEluZGV4ICsgMV0pOwogICAgICByZXN1bHQuX3NldEF0KGluZGV4IC0gMSwgX2RpZ2l0VGFibGVbZGlnaXRJbmRleF0pOwogICAgICBpbmRleCAtPSAyOwogICAgfSB3aGlsZSAobmVnU21pIDw9IC0xMDApOwogICAgaWYgKG5lZ1NtaSA+IC0xMCkgewogICAgICByZXN1bHQuX3NldEF0KGluZGV4LCBESUdJVF9aRVJPIC0gbmVnU21pKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIHJlbWFpbmRlciBuZWNlc3NhcnkgZm9yIHRoaXMgY2FzZS4KICAgICAgaW50IGRpZ2l0SW5kZXggPSAtbmVnU21pICogMjsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCwgX2RpZ2l0VGFibGVbZGlnaXRJbmRleCArIDFdKTsKICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCAtIDEsIF9kaWdpdFRhYmxlW2RpZ2l0SW5kZXhdKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovLyBSZXByZXNlbnRzIGludGVnZXJzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IFNtaSBidXQgZml0IGludG8gNjRiaXRzLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9NaW50IGV4dGVuZHMgX0ludGVnZXJJbXBsZW1lbnRhdGlvbiB7CiAgZmFjdG9yeSBfTWludC5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiX01pbnQgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGJ5IHRoZSBWTSIpOwogIH0KICBpbnQgZ2V0IGhhc2hDb2RlID0+IHRoaXM7CiAgaW50IGdldCBfaWRlbnRpdHlIYXNoQ29kZSA9PiB0aGlzOwogIEBwcmFnbWEoInZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZSIpCiAgaW50IG9wZXJhdG9yIH4oKSBuYXRpdmUgIk1pbnRfYml0TmVnYXRlIjsKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGdldCBiaXRMZW5ndGggbmF0aXZlICJNaW50X2JpdExlbmd0aCI7CgogIGludCBfYml0QW5kRnJvbVNtaShfU21pIG90aGVyKSA9PiBfYml0QW5kRnJvbUludGVnZXIob3RoZXIpOwp9CoK5AE5OPAEeATcpPCk8KTwBKR8qNAYtBAEhLwQBKR4qNAYrBAEpFRUEASk/KT4pPwEdLgQBKUUpSClGKUgpQilCKUIpQilCKUwpSCkrBAEpPSk9ASgfGQQBKB8wBAEoIC4EASggLgQBKCovASgjGCoGEgQBKEMOJAQBETEEASgdGyMgHQEeJgQBHEtOSk8TJTgEAR0xG0VENx9DRD8zQEMqRCgaNRcKDyA0CggZFQhQOTQPTjQfCAYYEx8WDRQGBAEQEQQBEBEEAQ8RBAETEQQBGxwEARscBAEaHAQBHhwEAS4eTwYeTwYBIk4wMBMGQzArBi1FLjsRBAEQEQQBKxYqBAEvPAQBN0IEAS47BAFBASQjOQYkIwYtJisVNUBDLAYcCSEXKxksAUMzIwYTBAEkFiAmHiwUFBYSFzdCRS4IBkFEPkQaCUEeGRMEAS84Jy0cFhcJKxcrGhwBQzMjBhMEAR8dFUYGFUUGQ0MaEhoOBg8UFRkIDxcGDgQBKUlJMg8QJRERDQgVEw8PCAYeDw8kCRkREigUFAwTIBIKEQgZERIoFBQMEyASChEIFBAYEA8QGBAIFh0SKgYRDhkYDhkGDgQBJRoVRQZDGhIlGi4qBiMEAS4XGUcGGBkaGigkBAIBGiwjSAQcJTQrNCwBOwE0PQEGOwU0OAYlNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NwUBBjcGK01NTU1NTU1NTUI6Q0NDQ0NDQ0M8BQE+KSorATpILkMyHh8bIiMQBiMjHDgdHisEARZIMkpEHCEuPhwUCR8qGCY5ORIaFCEuDSUgOTkGEwQBOkkxQjIiIx8mJxAGJyciOSEiLgQBKUsdMB4hHyEYKSAqBhkkKSAtMgYuNEYqHAktHic5ORIeGDENLyQ5OQYTBAIBThotJEkEHCUpLDQtAT8CAR1kYXJ0OmNvcmUtcGF0Y2gvaW50ZWdlcnMuZGFydDxvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2ludm9jYXRpb25fbWlycm9yX3BhdGNoLmRhcnScdS8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKLy8gTk9URTogV2hlbiBtYWtpbmcgY2hhbmdlcyB0byB0aGlzIGNsYXNzLCBwbGVhc2UgYWxzbyB1cGRhdGUKLy8gYFZtVGFyZ2V0Lmluc3RhbnRpYXRlSW52b2NhdGlvbmAgYW5kIGBWbVRhcmdldC5faW52b2NhdGlvblR5cGVgIGluCi8vIGBwa2cva2VybmVsL2xpYi90YXJnZXQvdm0uZGFydGAuCmNsYXNzIF9JbnZvY2F0aW9uTWlycm9yIGltcGxlbWVudHMgSW52b2NhdGlvbiB7CiAgLy8gQ29uc3RhbnRzIGRlc2NyaWJpbmcgdGhlIGludm9jYXRpb24ga2luZC4KICAvLyBfRklFTEQgY2Fubm90IGJlIGdlbmVyYXRlZCBieSByZWd1bGFyIGludm9jYXRpb24gbWlycm9ycy4KICBzdGF0aWMgY29uc3QgaW50IF9NRVRIT0QgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX0dFVFRFUiA9IDE7CiAgc3RhdGljIGNvbnN0IGludCBfU0VUVEVSID0gMjsKICBzdGF0aWMgY29uc3QgaW50IF9GSUVMRCA9IDM7CiAgc3RhdGljIGNvbnN0IGludCBfTE9DQUxfVkFSID0gNDsKICBzdGF0aWMgY29uc3QgaW50IF9LSU5EX1NISUZUID0gMDsKICBzdGF0aWMgY29uc3QgaW50IF9LSU5EX0JJVFMgPSAzOwogIHN0YXRpYyBjb25zdCBpbnQgX0tJTkRfTUFTSyA9ICgxIDw8IF9LSU5EX0JJVFMpIC0gMTsKCiAgLy8gVGhlc2UgdmFsdWVzLCBleGNlcHQgX0RZTkFNSUMgYW5kIF9TVVBFUiwgYXJlIG9ubHkgdXNlZCB3aGVuIHRocm93aW5nCiAgLy8gTm9TdWNoTWV0aG9kRXJyb3IgZm9yIGNvbXBpbGUtdGltZSByZXNvbHV0aW9uIGZhaWx1cmVzLgogIHN0YXRpYyBjb25zdCBpbnQgX0RZTkFNSUMgPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX1NVUEVSID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9TVEFUSUMgPSAyOwogIHN0YXRpYyBjb25zdCBpbnQgX0NPTlNUUlVDVE9SID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9UT1BfTEVWRUwgPSA0OwogIHN0YXRpYyBjb25zdCBpbnQgX0xFVkVMX1NISUZUID0gX0tJTkRfQklUUzsKICBzdGF0aWMgY29uc3QgaW50IF9MRVZFTF9CSVRTID0gMzsKICBzdGF0aWMgY29uc3QgaW50IF9MRVZFTF9NQVNLID0gKDEgPDwgX0xFVkVMX0JJVFMpIC0gMTsKCiAgLy8gQXJndW1lbnRzRGVzY3JpcHRvciBsYXlvdXQuIEtlZXAgaW4gc3luYyB3aXRoIGVudW0gaW4gZGFydF9lbnRyeS5oLgogIHN0YXRpYyBjb25zdCBpbnQgX1RZUEVfQVJHU19MRU4gPSAwOwogIHN0YXRpYyBjb25zdCBpbnQgX0NPVU5UID0gMTsKICBzdGF0aWMgY29uc3QgaW50IF9QT1NJVElPTkFMX0NPVU5UID0gMjsKICBzdGF0aWMgY29uc3QgaW50IF9GSVJTVF9OQU1FRF9FTlRSWSA9IDM7CgogIC8vIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uIG1pcnJvci4KICBTdHJpbmcgX2Z1bmN0aW9uTmFtZTsKICBMaXN0IF9hcmd1bWVudHNEZXNjcmlwdG9yOwogIExpc3QgX2FyZ3VtZW50czsKICBib29sIF9pc1N1cGVySW52b2NhdGlvbjsKICBpbnQgX2RlbGF5ZWRUeXBlQXJndW1lbnRzTGVuOwoKICAvLyBFeHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW52b2NhdGlvbiBtaXJyb3I7IHBvcHVsYXRlZCBvbiBkZW1hbmQuCiAgU3ltYm9sIF9tZW1iZXJOYW1lOwogIGludCBfdHlwZTsKICBMaXN0PFR5cGU+IF90eXBlQXJndW1lbnRzOwogIExpc3QgX3Bvc2l0aW9uYWxBcmd1bWVudHM7CiAgTWFwPFN5bWJvbCwgZHluYW1pYz4gX25hbWVkQXJndW1lbnRzOwoKICBfSW52b2NhdGlvbk1pcnJvci5fd2l0aFR5cGUodGhpcy5fbWVtYmVyTmFtZSwgdGhpcy5fdHlwZSwgdGhpcy5fdHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5fcG9zaXRpb25hbEFyZ3VtZW50cywgdGhpcy5fbmFtZWRBcmd1bWVudHMpIHsKICAgIF90eXBlQXJndW1lbnRzID8/PSBjb25zdCA8VHlwZT5bXTsKICAgIF9wb3NpdGlvbmFsQXJndW1lbnRzID8/PSBjb25zdCBbXTsKICAgIF9uYW1lZEFyZ3VtZW50cyA/Pz0gY29uc3Qge307CiAgfQoKICB2b2lkIF9zZXRNZW1iZXJOYW1lQW5kVHlwZSgpIHsKICAgIF90eXBlID8/PSAwOwogICAgaWYgKF9mdW5jdGlvbk5hbWUuc3RhcnRzV2l0aCgiZ2V0OiIpKSB7CiAgICAgIF90eXBlIHw9IF9HRVRURVI7CiAgICAgIF9tZW1iZXJOYW1lID0gbmV3IGludGVybmFsLlN5bWJvbC51bnZhbGlkYXRlZChfZnVuY3Rpb25OYW1lLnN1YnN0cmluZyg0KSk7CiAgICB9IGVsc2UgaWYgKF9mdW5jdGlvbk5hbWUuc3RhcnRzV2l0aCgic2V0OiIpKSB7CiAgICAgIF90eXBlIHw9IF9TRVRURVI7CiAgICAgIF9tZW1iZXJOYW1lID0KICAgICAgICAgIG5ldyBpbnRlcm5hbC5TeW1ib2wudW52YWxpZGF0ZWQoX2Z1bmN0aW9uTmFtZS5zdWJzdHJpbmcoNCkgKyAiPSIpOwogICAgfSBlbHNlIHsKICAgICAgX3R5cGUgfD0KICAgICAgICAgIF9pc1N1cGVySW52b2NhdGlvbiA/IChfU1VQRVIgPDwgX0xFVkVMX1NISUZUKSB8IF9NRVRIT0QgOiBfTUVUSE9EOwogICAgICBfbWVtYmVyTmFtZSA9IG5ldyBpbnRlcm5hbC5TeW1ib2wudW52YWxpZGF0ZWQoX2Z1bmN0aW9uTmFtZSk7CiAgICB9CiAgfQoKICBTeW1ib2wgZ2V0IG1lbWJlck5hbWUgewogICAgaWYgKF9tZW1iZXJOYW1lID09IG51bGwpIHsKICAgICAgX3NldE1lbWJlck5hbWVBbmRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gX21lbWJlck5hbWU7CiAgfQoKICBpbnQgZ2V0IF90eXBlQXJnc0xlbiB7CiAgICBpbnQgdHlwZUFyZ3NMZW4gPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfVFlQRV9BUkdTX0xFTl07CiAgICByZXR1cm4gdHlwZUFyZ3NMZW4gPT0gMCA/IF9kZWxheWVkVHlwZUFyZ3VtZW50c0xlbiA6IHR5cGVBcmdzTGVuOwogIH0KCiAgTGlzdDxUeXBlPiBnZXQgdHlwZUFyZ3VtZW50cyB7CiAgICBpZiAoX3R5cGVBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICBpZiAoX3R5cGVBcmdzTGVuID09IDApIHsKICAgICAgICByZXR1cm4gX3R5cGVBcmd1bWVudHMgPSBjb25zdCA8VHlwZT5bXTsKICAgICAgfQogICAgICAvLyBBIFR5cGVBcmd1bWVudHMgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIERhcnQgY2xhc3MgYW5kCiAgICAgIC8vIGNhbm5vdCBiZSBhY2Nlc3NlZCBhcyBhbiBhcnJheSBpbiBEYXJ0LiBUaGVyZWZvcmUsIHdlIG5lZWQgYSBuYXRpdmUKICAgICAgLy8gY2FsbCB0byB1bnBhY2sgdGhlIGluZGl2aWR1YWwgdHlwZXMgaW50byBhIGxpc3QuCiAgICAgIF90eXBlQXJndW1lbnRzID0gX3VucGFja1R5cGVBcmd1bWVudHMoX2FyZ3VtZW50c1swXSwgX3R5cGVBcmdzTGVuKTsKICAgIH0KICAgIHJldHVybiBfdHlwZUFyZ3VtZW50czsKICB9CgogIC8vIFVucGFjayB0aGUgZ2l2ZW4gVHlwZUFyZ3VtZW50cyBvYmplY3QgaW50byBhIG5ldyBsaXN0IG9mIGluZGl2aWR1YWwgdHlwZXMuCiAgc3RhdGljIExpc3Q8VHlwZT4gX3VucGFja1R5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cywgaW50IG51bVR5cGVBcmd1bWVudHMpCiAgICAgIG5hdGl2ZSAiSW52b2NhdGlvbk1pcnJvcl91bnBhY2tUeXBlQXJndW1lbnRzIjsKCiAgTGlzdCBnZXQgcG9zaXRpb25hbEFyZ3VtZW50cyB7CiAgICBpZiAoX3Bvc2l0aW9uYWxBcmd1bWVudHMgPT0gbnVsbCkgewogICAgICAvLyBUaGUgYXJndW1lbnQgZGVzY3JpcHRvciBjb3VudHMgdGhlIHJlY2VpdmVyLCBidXQgbm90IHRoZSB0eXBlIGFyZ3VtZW50cwogICAgICAvLyBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgaW50IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfUE9TSVRJT05BTF9DT1VOVF0gLSAxOwogICAgICBpZiAobnVtUG9zaXRpb25hbEFyZ3VtZW50cyA9PSAwKSB7CiAgICAgICAgcmV0dXJuIF9wb3NpdGlvbmFsQXJndW1lbnRzID0gY29uc3QgW107CiAgICAgIH0KICAgICAgLy8gRXhjbHVkZSByZWNlaXZlciBhbmQgdHlwZSBhcmdzIGluIHRoZSByZXR1cm5lZCBsaXN0LgogICAgICBpbnQgcmVjZWl2ZXJJbmRleCA9IF90eXBlQXJnc0xlbiA+IDAgPyAxIDogMDsKICAgICAgX3Bvc2l0aW9uYWxBcmd1bWVudHMgPSBuZXcgX0ltbXV0YWJsZUxpc3QuX2Zyb20oCiAgICAgICAgICBfYXJndW1lbnRzLCByZWNlaXZlckluZGV4ICsgMSwgbnVtUG9zaXRpb25hbEFyZ3VtZW50cyk7CiAgICB9CiAgICByZXR1cm4gX3Bvc2l0aW9uYWxBcmd1bWVudHM7CiAgfQoKICBNYXA8U3ltYm9sLCBkeW5hbWljPiBnZXQgbmFtZWRBcmd1bWVudHMgewogICAgaWYgKF9uYW1lZEFyZ3VtZW50cyA9PSBudWxsKSB7CiAgICAgIGludCBudW1Bcmd1bWVudHMgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfQ09VTlRdIC0gMTsgLy8gRXhjbHVkZSByZWNlaXZlci4KICAgICAgaW50IG51bVBvc2l0aW9uYWxBcmd1bWVudHMgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltfUE9TSVRJT05BTF9DT1VOVF0gLSAxOwogICAgICBpbnQgbnVtTmFtZWRBcmd1bWVudHMgPSBudW1Bcmd1bWVudHMgLSBudW1Qb3NpdGlvbmFsQXJndW1lbnRzOwogICAgICBpZiAobnVtTmFtZWRBcmd1bWVudHMgPT0gMCkgewogICAgICAgIHJldHVybiBfbmFtZWRBcmd1bWVudHMgPSBjb25zdCB7fTsKICAgICAgfQogICAgICBpbnQgcmVjZWl2ZXJJbmRleCA9IF90eXBlQXJnc0xlbiA+IDAgPyAxIDogMDsKICAgICAgX25hbWVkQXJndW1lbnRzID0gbmV3IE1hcDxTeW1ib2wsIGR5bmFtaWM+KCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTmFtZWRBcmd1bWVudHM7IGkrKykgewogICAgICAgIGludCBuYW1lZEVudHJ5SW5kZXggPSBfRklSU1RfTkFNRURfRU5UUlkgKyAyICogaTsKICAgICAgICBTdHJpbmcgYXJnX25hbWUgPSBfYXJndW1lbnRzRGVzY3JpcHRvcltuYW1lZEVudHJ5SW5kZXhdOwogICAgICAgIHZhciBhcmdfdmFsdWUgPSBfYXJndW1lbnRzWwogICAgICAgICAgICByZWNlaXZlckluZGV4ICsgX2FyZ3VtZW50c0Rlc2NyaXB0b3JbbmFtZWRFbnRyeUluZGV4ICsgMV1dOwogICAgICAgIF9uYW1lZEFyZ3VtZW50c1tuZXcgaW50ZXJuYWwuU3ltYm9sLnVudmFsaWRhdGVkKGFyZ19uYW1lKV0gPSBhcmdfdmFsdWU7CiAgICAgIH0KICAgICAgX25hbWVkQXJndW1lbnRzID0gbmV3IE1hcC51bm1vZGlmaWFibGUoX25hbWVkQXJndW1lbnRzKTsKICAgIH0KICAgIHJldHVybiBfbmFtZWRBcmd1bWVudHM7CiAgfQoKICBib29sIGdldCBpc01ldGhvZCB7CiAgICBpZiAoX3R5cGUgPT0gbnVsbCkgewogICAgICBfc2V0TWVtYmVyTmFtZUFuZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiAoX3R5cGUgJiBfS0lORF9NQVNLKSA9PSBfTUVUSE9EOwogIH0KCiAgYm9vbCBnZXQgaXNBY2Nlc3NvciB7CiAgICBpZiAoX3R5cGUgPT0gbnVsbCkgewogICAgICBfc2V0TWVtYmVyTmFtZUFuZFR5cGUoKTsKICAgIH0KICAgIHJldHVybiAoX3R5cGUgJiBfS0lORF9NQVNLKSAhPSBfTUVUSE9EOwogIH0KCiAgYm9vbCBnZXQgaXNHZXR0ZXIgewogICAgaWYgKF90eXBlID09IG51bGwpIHsKICAgICAgX3NldE1lbWJlck5hbWVBbmRUeXBlKCk7CiAgICB9CiAgICByZXR1cm4gKF90eXBlICYgX0tJTkRfTUFTSykgPT0gX0dFVFRFUjsKICB9CgogIGJvb2wgZ2V0IGlzU2V0dGVyIHsKICAgIGlmIChfdHlwZSA9PSBudWxsKSB7CiAgICAgIF9zZXRNZW1iZXJOYW1lQW5kVHlwZSgpOwogICAgfQogICAgcmV0dXJuIChfdHlwZSAmIF9LSU5EX01BU0spID09IF9TRVRURVI7CiAgfQoKICBfSW52b2NhdGlvbk1pcnJvcih0aGlzLl9mdW5jdGlvbk5hbWUsIHRoaXMuX2FyZ3VtZW50c0Rlc2NyaXB0b3IsCiAgICAgIHRoaXMuX2FyZ3VtZW50cywgdGhpcy5faXNTdXBlckludm9jYXRpb24sIHRoaXMuX3R5cGUsCiAgICAgIFt0aGlzLl9kZWxheWVkVHlwZUFyZ3VtZW50c0xlbiA9IDBdKTsKCiAgX0ludm9jYXRpb25NaXJyb3IuX3dpdGhvdXRUeXBlKHRoaXMuX2Z1bmN0aW9uTmFtZSwgdGhpcy5fdHlwZUFyZ3VtZW50cywKICAgICAgdGhpcy5fcG9zaXRpb25hbEFyZ3VtZW50cywgdGhpcy5fbmFtZWRBcmd1bWVudHMsIHRoaXMuX2lzU3VwZXJJbnZvY2F0aW9uLAogICAgICBbdGhpcy5fZGVsYXllZFR5cGVBcmd1bWVudHNMZW4gPSAwXSk7CgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yKFN0cmluZyBmdW5jdGlvbk5hbWUsCiAgICAgIExpc3QgYXJndW1lbnRzRGVzY3JpcHRvciwgTGlzdCBhcmd1bWVudHMsIGJvb2wgaXNTdXBlckludm9jYXRpb24sCiAgICAgIFtpbnQgdHlwZSA9IG51bGxdKSB7CiAgICByZXR1cm4gbmV3IF9JbnZvY2F0aW9uTWlycm9yKAogICAgICAgIGZ1bmN0aW9uTmFtZSwgYXJndW1lbnRzRGVzY3JpcHRvciwgYXJndW1lbnRzLCBpc1N1cGVySW52b2NhdGlvbiwgdHlwZSk7CiAgfQoKICAvLyBUaGlzIGZhY3RvcnkgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGFuIGBJbnZvY2F0aW9uYCBmb3IgYSBjbG9zdXJlIGNhbGwgd2hpY2gKICAvLyBtYXkgaGF2ZSBkZWxheWVkIHR5cGUgYXJndW1lbnRzLiBJbiB0aGF0IGNhc2UsIHRoZSBhcmd1bWVudHMgZGVzY3JpcHRvciB3aWxsCiAgLy8gaW5kaWNhdGUgMCB0eXBlIGFyZ3VtZW50cywgYnV0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIGFyZQogIC8vIHBhc3NlZCBpbiBgZGVsYXllZFR5cGVBcmd1bWVudHNMZW5gLiBJZiBhbnkgdHlwZSBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZSwKICAvLyB0aGUgdHlwZSBhcmd1bWVudHMgdmVjdG9yIHdpbGwgYmUgdGhlIGZpcnN0IGVudHJ5IGluIGBhcmd1bWVudHNgLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBfYWxsb2NhdGVJbnZvY2F0aW9uTWlycm9yRm9yQ2xvc3VyZSgKICAgICAgU3RyaW5nIGZ1bmN0aW9uTmFtZSwKICAgICAgTGlzdCBhcmd1bWVudHNEZXNjcmlwdG9yLAogICAgICBMaXN0IGFyZ3VtZW50cywKICAgICAgaW50IHR5cGUsCiAgICAgIGludCBkZWxheWVkVHlwZUFyZ3VtZW50c0xlbikgewogICAgcmV0dXJuIG5ldyBfSW52b2NhdGlvbk1pcnJvcihmdW5jdGlvbk5hbWUsIGFyZ3VtZW50c0Rlc2NyaXB0b3IsIGFyZ3VtZW50cywKICAgICAgICBmYWxzZSwgdHlwZSwgZGVsYXllZFR5cGVBcmd1bWVudHNMZW4pOwogIH0KfQqAzABOTjwBHgE/RiQwLz8gICAfIyQjNwFLPSEfICUjLiQ5AUknHyorATcYHRMbIAFMFg0dHSgBUTknJyIEASERLBhRMxgUTQ0PTUQGBAEaHx8GGAQBGTxGBAEhIh8wCE1NOkoGGwQBUE41ASEoUSJQKTAIPjQ3QgYhBAEsI1BQRSQrCDQ0NDpBJEhQCD8GHAQBFhkfBiwEARgZHwYsBAEWGR8GLAQBFhkfBiwEAUM8LAFKUCwBJDhIGyJQBAFRUkxPRyQuGyAWECVPLwQCASxkYXJ0OmNvcmUtcGF0Y2gvaW52b2NhdGlvbl9taXJyb3JfcGF0Y2guZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2xpYl9wcmVmaXguZGFydIvTLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgovLyBUaGlzIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIFZNLWludGVybmFsIGNsYXNzIExpYnJhcnlQcmVmaXguCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX0xpYnJhcnlQcmVmaXggewogIGJvb2wgX2xvYWQoKSBuYXRpdmUgIkxpYnJhcnlQcmVmaXhfbG9hZCI7CiAgT2JqZWN0IF9sb2FkRXJyb3IoKSBuYXRpdmUgIkxpYnJhcnlQcmVmaXhfbG9hZEVycm9yIjsKICBib29sIGlzTG9hZGVkKCkgbmF0aXZlICJMaWJyYXJ5UHJlZml4X2lzTG9hZGVkIjsKICBib29sIF9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZSgpCiAgICAgIG5hdGl2ZSAiTGlicmFyeVByZWZpeF9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZSI7CgogIGxvYWRMaWJyYXJ5KCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfb3V0c3RhbmRpbmdMb2FkUmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0c1tpXVswXSA9PSB0aGlzKSB7CiAgICAgICAgcmV0dXJuIF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0c1tpXVsxXS5mdXR1cmU7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxib29sPigpOwogICAgdmFyIHBhaXIgPSBuZXcgTGlzdCgpOwogICAgcGFpci5hZGQodGhpcyk7CiAgICBwYWlyLmFkZChjb21wbGV0ZXIpOwogICAgX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzLmFkZChwYWlyKTsKICAgIFRpbWVyLnJ1bigoKSB7CiAgICAgIHZhciBoYXNDb21wbGV0ZWQgPSB0aGlzLl9sb2FkKCk7CiAgICAgIC8vIExvYWRpbmcgY2FuIGNvbXBsZXRlIGltbWVkaWF0ZWx5LCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBzYW1lCiAgICAgIC8vIGxpYnJhcnkgaGFzIGJlZW4gbG9hZGVkIGVhZ2VybHkgb3IgdGhyb3VnaCBhbm90aGVyIGRlZmVycmVkCiAgICAgIC8vIHByZWZpeC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgd2UgbXVzdCBpbnZhbGlkYXRlIHRoZSBkZXBlbmRlbnQKICAgICAgLy8gY29kZSBhbmQgY29tcGxldGUgdGhlIGZ1dHVyZSBub3cgc2luY2UgdGhlcmUgd2lsbCBiZSBubyBjYWxsYmFjawogICAgICAvLyBmcm9tIHRoZSBWTS4KICAgICAgaWYgKGhhc0NvbXBsZXRlZCAmJiAhY29tcGxldGVyLmlzQ29tcGxldGVkKSB7CiAgICAgICAgX2ludmFsaWRhdGVEZXBlbmRlbnRDb2RlKCk7CiAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlKHRydWUpOwogICAgICAgIF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy5yZW1vdmUocGFpcik7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CiAgfQp9CgovLyBBIGxpc3Qgb2YgdHdvIGVsZW1lbnQgbGlzdHMuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBfTGlicmFyeVByZWZpeC4gVGhlCi8vIHNlY29uZCBlbGVtZW50IGlzIHRoZSBDb21wbGV0ZXIgZm9yIHRoZSBsb2FkIHJlcXVlc3QuCnZhciBfb3V0c3RhbmRpbmdMb2FkUmVxdWVzdHMgPSBuZXcgTGlzdDxMaXN0PigpOwoKLy8gQ2FsbGVkIGZyb20gdGhlIFZNIHdoZW4gYW4gb3V0c3RhbmRpbmcgbG9hZCByZXF1ZXN0IGhhcyBmaW5pc2hlZC4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCl9jb21wbGV0ZURlZmVycmVkTG9hZHMoKSB7CiAgLy8gRGV0ZXJtaW5lIHdoaWNoIG91dHN0YW5kaW5nIGxvYWQgcmVxdWVzdHMgaGF2ZSBjb21wbGV0ZWQgYW5kIGNvbXBsZXRlCiAgLy8gdGhlaXIgY29tcGxldGVyICh3aXRoIGFuIGVycm9yIG9yIHRydWUpLiBGb3Igb3V0c3RhbmRpbmcgbG9hZCByZXF1ZXN0cwogIC8vIHdoaWNoIGhhdmUgbm90IGNvbXBsZXRlZCwgcmVtZW1iZXIgdGhlbSBmb3IgbmV4dCB0aW1lIGluCiAgLy8gc3RpbGxPdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy4KICB2YXIgc3RpbGxPdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cyA9IG5ldyBMaXN0PExpc3Q+KCk7CgogIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBvdXRzdGFuZGluZ1JlcXVlc3RzIGJlY2F1c2UgdGhlIGNhbGwgdG8gX2xvYWQgYmVsb3cKICAvLyBtYXkgcmVjdXJzaXZlbHkgdHJpZ2dlciBhbm90aGVyIGNhbGwgdG8gfF9jb21wbGV0ZURlZmVycmVkTG9hZHN8LCB3aGljaAogIC8vIGNhbiBjYXVzZSB8X291dHN0YW5kaW5nTG9hZFJlcXVlc3RzfCB0byBiZSBtb2RpZmllZC4KICB2YXIgb3V0c3RhbmRpbmdSZXF1ZXN0cyA9IF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy50b0xpc3QoKTsKICBmb3IgKGludCBpID0gMDsgaSA8IG91dHN0YW5kaW5nUmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBwcmVmaXggPSBvdXRzdGFuZGluZ1JlcXVlc3RzW2ldWzBdOwogICAgdmFyIGNvbXBsZXRlciA9IG91dHN0YW5kaW5nUmVxdWVzdHNbaV1bMV07CiAgICB2YXIgZXJyb3IgPSBwcmVmaXguX2xvYWRFcnJvcigpOwogICAgaWYgKGNvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICAvLyBBbHJlYWR5IGNvbXBsZXRlZC4gU2tpcC4KICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlcnJvcik7CiAgICB9IGVsc2UgaWYgKHByZWZpeC5fbG9hZCgpKSB7CiAgICAgIHByZWZpeC5faW52YWxpZGF0ZURlcGVuZGVudENvZGUoKTsKICAgICAgY29tcGxldGVyLmNvbXBsZXRlKHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgc3RpbGxPdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cy5hZGQob3V0c3RhbmRpbmdSZXF1ZXN0c1tpXSk7CiAgICB9CiAgfQogIF9vdXRzdGFuZGluZ0xvYWRSZXF1ZXN0cyA9IHN0aWxsT3V0c3RhbmRpbmdMb2FkUmVxdWVzdHM7Cn0KUgBOTjwBHgFBGhcsODMiNgESQDQ2CAYBKxsUGSgTJ0VFR0oWNCQiLwgIHQQCAU05MQFFIhtLTD4jNwFMTTo/OSwvJSEiEAYZJiEpIA1ABgQ7AgEfZGFydDpjb3JlLXBhdGNoL2xpYl9wcmVmaXguZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3JlZ2V4cF9wYXRjaC5kYXJ0sLovLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCkBwYXRjaApjbGFzcyBSZWdFeHAgewogIEBwYXRjaAogIGZhY3RvcnkgUmVnRXhwKFN0cmluZyBzb3VyY2UsCiAgICAgIHtib29sIG11bHRpTGluZTogZmFsc2UsIGJvb2wgY2FzZVNlbnNpdGl2ZTogdHJ1ZX0pIHsKICAgIF9SZWdFeHBIYXNoS2V5IGtleSA9IG5ldyBfUmVnRXhwSGFzaEtleShzb3VyY2UsIG11bHRpTGluZSwgY2FzZVNlbnNpdGl2ZSk7CiAgICBfUmVnRXhwSGFzaFZhbHVlIHZhbHVlID0gX2NhY2hlW2tleV07CgogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgaWYgKF9jYWNoZS5sZW5ndGggPiBfTUFYX0NBQ0hFX1NJWkUpIHsKICAgICAgICBfUmVnRXhwSGFzaEtleSBsYXN0S2V5ID0gX3JlY2VudGx5VXNlZC5sYXN0OwogICAgICAgIF9yZWNlbnRseVVzZWQucmVtb3ZlKGxhc3RLZXkpOwogICAgICAgIF9jYWNoZS5yZW1vdmUobGFzdEtleSk7CiAgICAgIH0KCiAgICAgIHZhbHVlID0gbmV3IF9SZWdFeHBIYXNoVmFsdWUoCiAgICAgICAgICBuZXcgX1JlZ0V4cChzb3VyY2UsCiAgICAgICAgICAgICAgbXVsdGlMaW5lOiBtdWx0aUxpbmUsIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmUpLAogICAgICAgICAga2V5KTsKICAgICAgX2NhY2hlW2tleV0gPSB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlLmtleS51bmxpbmsoKTsKICAgIH0KCiAgICBhc3NlcnQodmFsdWUgIT0gbnVsbCk7CgogICAgX3JlY2VudGx5VXNlZC5hZGRGaXJzdCh2YWx1ZS5rZXkpOwogICAgYXNzZXJ0KF9yZWNlbnRseVVzZWQubGVuZ3RoID09IF9jYWNoZS5sZW5ndGgpOwoKICAgIC8vIFRPRE8oemVybnkpOiBXZSBtaWdodCBub3Qgd2FudCB0byBjYW5vbmljYWxpemUgcmVnZXhwIG9iamVjdHMuCiAgICByZXR1cm4gdmFsdWUucmVnZXhwOwogIH0KCiAgLyoqCiAgICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBSZWdFeHAtc2lnbmlmaWNhbnQgY2hhciBpbiBbdGV4dF0uCiAgICoKICAgKiBTdGFydHMgbG9va2luZyBmcm9tIFtzdGFydF0uIFJldHVybnMgYHRleHQubGVuZ3RoYCBpZiBubyBjaGFyYWN0ZXIKICAgKiBpcyBmb3VuZCB0aGF0IGhhcyBzcGVjaWFsIG1lYW5pbmcgaW4gUmVnRXhwIHN5bnRheC4KICAgKi8KICBzdGF0aWMgaW50IF9maW5kRXNjYXBlQ2hhcihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0KSB7CiAgICAvLyBUYWJsZSB3aGVyZSBlYWNoIGNoYXJhY3RlciBpbiB0aGUgcmFuZ2UgVSswMDAwIHRvIFUrMDA3ZiBpcyByZXByZXNlbnRlZAogICAgLy8gYnkgd2hldGhlciBpdCBuZWVkcyB0byBiZSBlc2NhcGVkIGluIGEgcmVnZXhwLgogICAgLy8gVGhlIFx4MDAgY2hhcmFjdGVycyBtZWFucyBlc2NhY3BlZCwgYW5kIFx4MDEgbWVhbnMgbm9uLWVzY2FwZWQuCiAgICBjb25zdCBlc2NhcGVzID0KICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKICAgICAgICAvLyAgICAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICggICApICAgKiAgICsgICAgICAgICAgIC4KICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDBceDAxXHgwMVx4MDFceDAwXHgwMFx4MDBceDAwXHgwMVx4MDFceDAwXHgwMSIKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/CiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDAiCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICAgXCAgIF0gICBeCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMFx4MDBceDAwXHgwMFx4MDEiCiAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgfCAgIH0KICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAwXHgwMFx4MDBceDAxXHgwMSI7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGludCBjaGFyID0gdGV4dC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA8PSAweDdmICYmIGVzY2FwZXMuY29kZVVuaXRBdChjaGFyKSA9PSAwKSByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiB0ZXh0Lmxlbmd0aDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB0ZXh0KSB7CiAgICBpbnQgZXNjYXBlQ2hhckluZGV4ID0gX2ZpbmRFc2NhcGVDaGFyKHRleHQsIDApOwogICAgLy8gSWYgdGhlIHRleHQgY29udGFpbnMgbm8gY2hhcmFjdGVycyBuZWVkaW5nIGVzY2FwZSwgcmV0dXJuIGl0IGRpcmVjdGx5LgogICAgaWYgKGVzY2FwZUNoYXJJbmRleCA9PSB0ZXh0Lmxlbmd0aCkgcmV0dXJuIHRleHQ7CgogICAgdmFyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGludCBwcmV2aW91c1NsaWNlRW5kSW5kZXggPSAwOwogICAgZG8gewogICAgICAvLyBDb3B5IGNoYXJhY3RlcnMgZnJvbSBwcmV2aW91cyBlc2NhcGUgdG8gY3VycmVudCBlc2NhcGUgaW50byByZXN1bHQuCiAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGhlIHByZXZpb3VzbHkgZXNjYXBlZCBjaGFyYWN0ZXIuCiAgICAgIGJ1ZmZlci53cml0ZSh0ZXh0LnN1YnN0cmluZyhwcmV2aW91c1NsaWNlRW5kSW5kZXgsIGVzY2FwZUNoYXJJbmRleCkpOwogICAgICAvLyBQcmVwYXJlIHRoZSBjdXJyZW50IGNoYXJhY3RlciB0byBiZSBlc2NhcGVkIGJ5IHByZWZpeGluZyBpdCB3aXRoIGEgJ1wnLgogICAgICBidWZmZXIud3JpdGUociJcIik7CiAgICAgIHByZXZpb3VzU2xpY2VFbmRJbmRleCA9IGVzY2FwZUNoYXJJbmRleDsKICAgICAgZXNjYXBlQ2hhckluZGV4ID0gX2ZpbmRFc2NhcGVDaGFyKHRleHQsIGVzY2FwZUNoYXJJbmRleCArIDEpOwogICAgfSB3aGlsZSAoZXNjYXBlQ2hhckluZGV4IDwgdGV4dC5sZW5ndGgpOwogICAgLy8gQ29weSB0YWlsIG9mIHN0cmluZyBpbnRvIHJlc3VsdC4KICAgIGJ1ZmZlci53cml0ZSh0ZXh0LnN1YnN0cmluZyhwcmV2aW91c1NsaWNlRW5kSW5kZXgsIGVzY2FwZUNoYXJJbmRleCkpOwogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLy8gUmVndWxhciBleHByZXNzaW9uIG9iamVjdHMgYXJlIHN0b3JlZCBpbiBhIGNhY2hlIG9mIHVwIHRvIF9NQVhfQ0FDSEVfU0laRQogIC8vIGVsZW1lbnRzIHVzaW5nIGFuIExSVSBldmljdGlvbiBzdHJhdGVneS4KICAvLyBUT0RPKHplcm55KTogRG8gbm90IGltcG9zZSBhIGZpeGVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2FjaGVkIG9iamVjdHMuCiAgLy8gT3RoZXIgcG9zc2liaWxpdGllcyBjb3VsZCBiZSBsaW1pdGluZyBieSB0aGUgc2l6ZSBvZiB0aGUgcmVnZXhwIG9iamVjdHMsCiAgLy8gb3IgaW1wb3NpbmcgYSBsb3dlciB0aW1lIGJvdW5kIGZvciB0aGUgbW9zdCByZWNlbnQgdXNlIHVuZGVyIHdoaWNoIGEgcmVnZXhwCiAgLy8gbWF5IG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgogIC8vIFRPRE8oemVybnkpOiBVc2Ugc2VsZi1zaXppbmcgY2FjaGUgc2ltaWxhciB0byBfQWNjZXNzb3JDYWNoZSBpbgogIC8vIG1pcnJvcnNfaW1wbC5kYXJ0LgogIHN0YXRpYyBjb25zdCBpbnQgX01BWF9DQUNIRV9TSVpFID0gMjU2OwogIHN0YXRpYyBmaW5hbCBNYXA8X1JlZ0V4cEhhc2hLZXksIF9SZWdFeHBIYXNoVmFsdWU+IF9jYWNoZSA9CiAgICAgIG5ldyBIYXNoTWFwPF9SZWdFeHBIYXNoS2V5LCBfUmVnRXhwSGFzaFZhbHVlPigpOwogIHN0YXRpYyBmaW5hbCBMaW5rZWRMaXN0PF9SZWdFeHBIYXNoS2V5PiBfcmVjZW50bHlVc2VkID0KICAgICAgbmV3IExpbmtlZExpc3Q8X1JlZ0V4cEhhc2hLZXk+KCk7CgogIGludCBnZXQgX2dyb3VwQ291bnQ7CiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgX2dyb3VwTmFtZXM7CiAgaW50IF9ncm91cE5hbWVJbmRleChTdHJpbmcgbmFtZSk7Cn0KCi8vIFJlcHJlc2VudHMgYm90aCBhIGtleSBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uIGNhY2hlIGFzIHdlbGwgYXMgaXRzCi8vIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIExSVSBsaXN0LgpjbGFzcyBfUmVnRXhwSGFzaEtleSBleHRlbmRzIExpbmtlZExpc3RFbnRyeTxfUmVnRXhwSGFzaEtleT4gewogIGZpbmFsIFN0cmluZyBwYXR0ZXJuOwogIGZpbmFsIGJvb2wgbXVsdGlMaW5lOwogIGZpbmFsIGJvb2wgY2FzZVNlbnNpdGl2ZTsKCiAgX1JlZ0V4cEhhc2hLZXkodGhpcy5wYXR0ZXJuLCB0aGlzLm11bHRpTGluZSwgdGhpcy5jYXNlU2Vuc2l0aXZlKTsKCiAgaW50IGdldCBoYXNoQ29kZSA9PiBwYXR0ZXJuLmhhc2hDb2RlOwogIGJvb2wgb3BlcmF0b3IgPT0odGhhdCkgewogICAgcmV0dXJuICh0aGF0IGlzIF9SZWdFeHBIYXNoS2V5KSAmJgogICAgICAgICh0aGlzLnBhdHRlcm4gPT0gdGhhdC5wYXR0ZXJuKSAmJgogICAgICAgICh0aGlzLm11bHRpTGluZSA9PSB0aGF0Lm11bHRpTGluZSkgJiYKICAgICAgICAodGhpcy5jYXNlU2Vuc2l0aXZlID09IHRoYXQuY2FzZVNlbnNpdGl2ZSk7CiAgfQp9CgovLyBSZXByZXNlbnRzIGEgdmFsdWUgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjYWNoZS4gQ29udGFpbnMgYSBwb2ludGVyCi8vIGJhY2sgdG8gdGhlIGtleSBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgTFJVIGVudHJ5LgpjbGFzcyBfUmVnRXhwSGFzaFZhbHVlIHsKICBmaW5hbCBfUmVnRXhwIHJlZ2V4cDsKICBmaW5hbCBfUmVnRXhwSGFzaEtleSBrZXk7CgogIF9SZWdFeHBIYXNoVmFsdWUodGhpcy5yZWdleHAsIHRoaXMua2V5KTsKfQoKY2xhc3MgX1JlZ0V4cE1hdGNoIGltcGxlbWVudHMgUmVnRXhwTWF0Y2ggewogIF9SZWdFeHBNYXRjaCh0aGlzLl9yZWdleHAsIHRoaXMuaW5wdXQsIHRoaXMuX21hdGNoKTsKCiAgaW50IGdldCBzdGFydCA9PiBfc3RhcnQoMCk7CiAgaW50IGdldCBlbmQgPT4gX2VuZCgwKTsKCiAgaW50IF9zdGFydChpbnQgZ3JvdXBJZHgpIHsKICAgIHJldHVybiBfbWF0Y2hbKGdyb3VwSWR4ICogX01BVENIX1BBSVIpXTsKICB9CgogIGludCBfZW5kKGludCBncm91cElkeCkgewogICAgcmV0dXJuIF9tYXRjaFsoZ3JvdXBJZHggKiBfTUFUQ0hfUEFJUikgKyAxXTsKICB9CgogIFN0cmluZyBncm91cChpbnQgZ3JvdXBJZHgpIHsKICAgIGlmIChncm91cElkeCA8IDAgfHwgZ3JvdXBJZHggPiBfcmVnZXhwLl9ncm91cENvdW50KSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnZhbHVlKGdyb3VwSWR4KTsKICAgIH0KICAgIGludCBzdGFydEluZGV4ID0gX3N0YXJ0KGdyb3VwSWR4KTsKICAgIGludCBlbmRJbmRleCA9IF9lbmQoZ3JvdXBJZHgpOwogICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpIHsKICAgICAgYXNzZXJ0KGVuZEluZGV4ID09IC0xKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gaW5wdXQuX3N1YnN0cmluZ1VuY2hlY2tlZChzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgfQoKICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGdyb3VwSWR4KSB7CiAgICByZXR1cm4gdGhpcy5ncm91cChncm91cElkeCk7CiAgfQoKICBMaXN0PFN0cmluZz4gZ3JvdXBzKExpc3Q8aW50PiBncm91cHNTcGVjKSB7CiAgICB2YXIgZ3JvdXBzTGlzdCA9IG5ldyBMaXN0PFN0cmluZz4oZ3JvdXBzU3BlYy5sZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHNTcGVjLmxlbmd0aDsgaSsrKSB7CiAgICAgIGdyb3Vwc0xpc3RbaV0gPSBncm91cChncm91cHNTcGVjW2ldKTsKICAgIH0KICAgIHJldHVybiBncm91cHNMaXN0OwogIH0KCiAgaW50IGdldCBncm91cENvdW50ID0+IF9yZWdleHAuX2dyb3VwQ291bnQ7CgogIFBhdHRlcm4gZ2V0IHBhdHRlcm4gPT4gX3JlZ2V4cDsKCiAgU3RyaW5nIG5hbWVkR3JvdXAoU3RyaW5nIG5hbWUpIHsKICAgIHZhciBpZHggPSBfcmVnZXhwLl9ncm91cE5hbWVJbmRleChuYW1lKTsKICAgIGlmIChpZHggPCAwKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIk5vdCBhIGNhcHR1cmUgZ3JvdXAgbmFtZTogJHtuYW1lfSIpOwogICAgfQogICAgcmV0dXJuIGdyb3VwKGlkeCk7CiAgfQoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBncm91cE5hbWVzIHsKICAgIHJldHVybiBfcmVnZXhwLl9ncm91cE5hbWVzOwogIH0KCiAgZmluYWwgUmVnRXhwIF9yZWdleHA7CiAgZmluYWwgU3RyaW5nIGlucHV0OwogIGZpbmFsIExpc3Q8aW50PiBfbWF0Y2g7CiAgc3RhdGljIGNvbnN0IGludCBfTUFUQ0hfUEFJUiA9IDI7Cn0KCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgX1JlZ0V4cCBpbXBsZW1lbnRzIFJlZ0V4cCB7CiAgZmFjdG9yeSBfUmVnRXhwKFN0cmluZyBwYXR0ZXJuLAogICAgICB7Ym9vbCBtdWx0aUxpbmU6IGZhbHNlLAogICAgICBib29sIGNhc2VTZW5zaXRpdmU6IHRydWV9KSBuYXRpdmUgIlJlZ0V4cF9mYWN0b3J5IjsKCiAgTWF0Y2ggZmlyc3RNYXRjaChTdHJpbmcgc3RyKSB7CiAgICBpZiAoc3RyIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cik7CiAgICBMaXN0IG1hdGNoID0gX0V4ZWN1dGVNYXRjaChzdHIsIDApOwogICAgaWYgKG1hdGNoID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gbmV3IF9SZWdFeHBNYXRjaCh0aGlzLCBzdHIsIG1hdGNoKTsKICB9CgogIEl0ZXJhYmxlPE1hdGNoPiBhbGxNYXRjaGVzKFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0cmluZyBpcyEgU3RyaW5nKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzdHJpbmcpOwogICAgaWYgKHN0YXJ0IGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0YXJ0KTsKICAgIGlmICgwID4gc3RhcnQgfHwgc3RhcnQgPiBzdHJpbmcubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBzdHJpbmcubGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBuZXcgX0FsbE1hdGNoZXNJdGVyYWJsZSh0aGlzLCBzdHJpbmcsIHN0YXJ0KTsKICB9CgogIE1hdGNoIG1hdGNoQXNQcmVmaXgoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RyaW5nIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cmluZyk7CiAgICBpZiAoc3RhcnQgaXMhIGludCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc3RhcnQpOwogICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+IHN0cmluZy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHN0cmluZy5sZW5ndGgpOwogICAgfQogICAgTGlzdDxpbnQ+IGxpc3QgPSBfRXhlY3V0ZU1hdGNoU3RpY2t5KHN0cmluZywgc3RhcnQpOwogICAgaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gbmV3IF9SZWdFeHBNYXRjaCh0aGlzLCBzdHJpbmcsIGxpc3QpOwogIH0KCiAgYm9vbCBoYXNNYXRjaChTdHJpbmcgc3RyKSB7CiAgICBpZiAoc3RyIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cik7CiAgICBMaXN0IG1hdGNoID0gX0V4ZWN1dGVNYXRjaChzdHIsIDApOwogICAgcmV0dXJuIChtYXRjaCA9PSBudWxsKSA/IGZhbHNlIDogdHJ1ZTsKICB9CgogIFN0cmluZyBzdHJpbmdNYXRjaChTdHJpbmcgc3RyKSB7CiAgICBpZiAoc3RyIGlzISBTdHJpbmcpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKHN0cik7CiAgICBMaXN0IG1hdGNoID0gX0V4ZWN1dGVNYXRjaChzdHIsIDApOwogICAgaWYgKG1hdGNoID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gc3RyLl9zdWJzdHJpbmdVbmNoZWNrZWQobWF0Y2hbMF0sIG1hdGNoWzFdKTsKICB9CgogIFN0cmluZyBnZXQgcGF0dGVybiBuYXRpdmUgIlJlZ0V4cF9nZXRQYXR0ZXJuIjsKCiAgYm9vbCBnZXQgaXNNdWx0aUxpbmUgbmF0aXZlICJSZWdFeHBfZ2V0SXNNdWx0aUxpbmUiOwoKICBib29sIGdldCBpc0Nhc2VTZW5zaXRpdmUgbmF0aXZlICJSZWdFeHBfZ2V0SXNDYXNlU2Vuc2l0aXZlIjsKCiAgaW50IGdldCBfZ3JvdXBDb3VudCBuYXRpdmUgIlJlZ0V4cF9nZXRHcm91cENvdW50IjsKCiAgLy8gUmV0dXJucyBhIExpc3QgW1N0cmluZywgaW50LCBTdHJpbmcsIGludCwgLi4uXSB3aGVyZSBlYWNoCiAgLy8gU3RyaW5nIGlzIHRoZSBuYW1lIG9mIGEgY2FwdHVyZSBncm91cCBhbmQgdGhlIGZvbGxvd2luZwogIC8vIGludCBpcyB0aGF0IGNhcHR1cmUgZ3JvdXAncyBpbmRleC4KICBMaXN0IGdldCBfZ3JvdXBOYW1lTGlzdCBuYXRpdmUgIlJlZ0V4cF9nZXRHcm91cE5hbWVNYXAiOwoKICBJdGVyYWJsZTxTdHJpbmc+IGdldCBfZ3JvdXBOYW1lcyBzeW5jKiB7CiAgICBmaW5hbCBuYW1lTGlzdCA9IF9ncm91cE5hbWVMaXN0OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lTGlzdC5sZW5ndGg7IGkgKz0gMikgewogICAgICB5aWVsZCBuYW1lTGlzdFtpXSBhcyBTdHJpbmc7CiAgICB9CiAgfQoKICBpbnQgX2dyb3VwTmFtZUluZGV4KFN0cmluZyBuYW1lKSB7CiAgICB2YXIgbmFtZUxpc3QgPSBfZ3JvdXBOYW1lTGlzdDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZUxpc3QubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgaWYgKG5hbWUgPT0gbmFtZUxpc3RbaV0pIHsKICAgICAgICByZXR1cm4gbmFtZUxpc3RbaSArIDFdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQoKICAvLyBCeXRlIG1hcCBvZiBvbmUgYnl0ZSBjaGFyYWN0ZXJzIHdpdGggYSAweGZmIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSB3b3JkCiAgLy8gY2hhcmFjdGVyIChkaWdpdCwgbGV0dGVyIG9yIHVuZGVyc2NvcmUpIGFuZCAweDAwIG90aGVyd2lzZS4KICAvLyBVc2VkIGJ5IGdlbmVyYXRlZCBSZWdFeHAgY29kZS4KICBzdGF0aWMgY29uc3QgTGlzdDxpbnQ+IF93b3JkQ2hhcmFjdGVyTWFwID0gY29uc3QgPGludD5bCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJzAnIC0gJzcnCiAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAnOCcgLSAnOScKCiAgICAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvLyAnQScgLSAnRycKICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIC8vICdIJyAtICdPJwogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJ1AnIC0gJ1cnCiAgICAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAvLyAnWCcgLSAnWicsICdfJwoKICAgIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIC8vICdhJyAtICdnJwogICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgLy8gJ2gnIC0gJ28nCiAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvLyAncCcgLSAndycKICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vICd4JyAtICd6JwogICAgLy8gTGF0aW4tMSByYW5nZQogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICBdOwoKICBMaXN0IF9FeGVjdXRlTWF0Y2goU3RyaW5nIHN0ciwgaW50IHN0YXJ0X2luZGV4KSBuYXRpdmUgIlJlZ0V4cF9FeGVjdXRlTWF0Y2giOwoKICBMaXN0IF9FeGVjdXRlTWF0Y2hTdGlja3koU3RyaW5nIHN0ciwgaW50IHN0YXJ0X2luZGV4KQogICAgICBuYXRpdmUgIlJlZ0V4cF9FeGVjdXRlTWF0Y2hTdGlja3kiOwp9CgpjbGFzcyBfQWxsTWF0Y2hlc0l0ZXJhYmxlIGV4dGVuZHMgSXRlcmFibGVCYXNlPE1hdGNoPiB7CiAgZmluYWwgX1JlZ0V4cCBfcmU7CiAgZmluYWwgU3RyaW5nIF9zdHI7CiAgZmluYWwgaW50IF9zdGFydDsKCiAgX0FsbE1hdGNoZXNJdGVyYWJsZSh0aGlzLl9yZSwgdGhpcy5fc3RyLCB0aGlzLl9zdGFydCk7CgogIEl0ZXJhdG9yPE1hdGNoPiBnZXQgaXRlcmF0b3IgPT4gbmV3IF9BbGxNYXRjaGVzSXRlcmF0b3IoX3JlLCBfc3RyLCBfc3RhcnQpOwp9CgpjbGFzcyBfQWxsTWF0Y2hlc0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8TWF0Y2g+IHsKICBmaW5hbCBTdHJpbmcgX3N0cjsKICBpbnQgX25leHRJbmRleDsKICBfUmVnRXhwIF9yZTsKICBNYXRjaCBfY3VycmVudDsKCiAgX0FsbE1hdGNoZXNJdGVyYXRvcih0aGlzLl9yZSwgdGhpcy5fc3RyLCB0aGlzLl9uZXh0SW5kZXgpOwoKICBNYXRjaCBnZXQgY3VycmVudCA9PiBfY3VycmVudDsKCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIGlmIChfcmUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBDbGVhcmVkIGFmdGVyIGEgZmFpbGVkIG1hdGNoLgogICAgaWYgKF9uZXh0SW5kZXggPD0gX3N0ci5sZW5ndGgpIHsKICAgICAgdmFyIG1hdGNoID0gX3JlLl9FeGVjdXRlTWF0Y2goX3N0ciwgX25leHRJbmRleCk7CiAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgX2N1cnJlbnQgPSBuZXcgX1JlZ0V4cE1hdGNoKF9yZSwgX3N0ciwgbWF0Y2gpOwogICAgICAgIF9uZXh0SW5kZXggPSBfY3VycmVudC5lbmQ7CiAgICAgICAgaWYgKF9uZXh0SW5kZXggPT0gX2N1cnJlbnQuc3RhcnQpIHsKICAgICAgICAgIC8vIFplcm8td2lkdGggbWF0Y2guIEFkdmFuY2UgYnkgb25lIG1vcmUuCiAgICAgICAgICBfbmV4dEluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBfY3VycmVudCA9IG51bGw7CiAgICBfcmUgPSBudWxsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KfQqBcgBOTjwBHgEHDwkgO08qARktNScgCAEkHkMQGw0aBgEbASczAUYZBAEGRQVIOQY3TzZHFEtLRUtJS0tFS0tBTDAlQwYYBAEJJjRONQElIwlNOUxRGi9ELShKHgQBTy5PTlEoRRgqPjc6KAEXJCQCAUgoPxgYHAFEASgbJyouNAQCAUpDGRgcASsCASw3AR4aAR0tBAEbMQQBHzosBicjHB4TBjwEASUhBAEuOjIsBhcEAS0BIgEjLRNABhcEASQgBAEYFhokAgEaIiIeOgEhNigZEwYvBAE/PDcuOwY5BAE4PDcuOwY5IzEEAR42KCsEASM2KBkTBjgEATEBNwE/ATUBPz0oOwErJTMjBgQBJSMzISAIBg8EAUxBJDo0NDQ0ATQ0QUEBQUFBRgFBQUFBFTQ0NDQBNDQ0NAE0NDQ0ATQ0NDQFAVABOCoCATgVFRQBOQFOAgE3FRIPEgE9ASEBFEQlNxs3Iyw0GAoVCAYVEBIEAgEhZGFydDpjb3JlLXBhdGNoL3JlZ2V4cF9wYXRjaC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvc3RhY2t0cmFjZS5kYXJ0gZgvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vLyBWTSBpbnRlcm5hbCBTdGFja1RyYWNlIGltcGxlbWVudGF0aW9uLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9TdGFja1RyYWNlIGltcGxlbWVudHMgU3RhY2tUcmFjZSB7CiAgLy8gdG9TdHJpbmcoKSBpcyBvdmVycmlkZGVuIG9uIHRoZSBDKysgc2lkZS4KfQoNAE5OPAEeASsaKi8CAR9kYXJ0OmNvcmUtcGF0Y2gvc3RhY2t0cmFjZS5kYXJ0MW9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvc3RyaW5nX3BhdGNoLmRhcnTAALbiLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7Cgpjb25zdCBpbnQgX21heEFzY2lpID0gMHg3ZjsKY29uc3QgaW50IF9tYXhMYXRpbjEgPSAweGZmOwpjb25zdCBpbnQgX21heFV0ZjE2ID0gMHhmZmZmOwpjb25zdCBpbnQgX21heFVuaWNvZGUgPSAweDEwZmZmZjsKCkBwYXRjaApjbGFzcyBTdHJpbmcgewogIEBwYXRjaAogIGZhY3RvcnkgU3RyaW5nLmZyb21DaGFyQ29kZXMoSXRlcmFibGU8aW50PiBjaGFyQ29kZXMsCiAgICAgIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgaWYgKGNoYXJDb2RlcyBpcyEgSXRlcmFibGUpCiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKGNoYXJDb2RlcywgImNoYXJDb2RlcyIpOwogICAgaWYgKHN0YXJ0IGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHN0YXJ0LCAic3RhcnQiKTsKICAgIGlmIChlbmQgIT0gbnVsbCAmJiBlbmQgaXMhIGludCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUoZW5kLCAiZW5kIik7CiAgICByZXR1cm4gX1N0cmluZ0Jhc2UuY3JlYXRlRnJvbUNoYXJDb2RlcyhjaGFyQ29kZXMsIHN0YXJ0LCBlbmQsIG51bGwpOwogIH0KCiAgQHBhdGNoCiAgZmFjdG9yeSBTdHJpbmcuZnJvbUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgaWYgKGNoYXJDb2RlID49IDApIHsKICAgICAgaWYgKGNoYXJDb2RlIDw9IDB4ZmYpIHsKICAgICAgICByZXR1cm4gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKDEpLi5fc2V0QXQoMCwgY2hhckNvZGUpOwogICAgICB9CiAgICAgIGlmIChjaGFyQ29kZSA8PSAweGZmZmYpIHsKICAgICAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2NyZWF0ZUZyb21Db2RlUG9pbnRzKAogICAgICAgICAgICBuZXcgX0xpc3QoMSkuLlswXSA9IGNoYXJDb2RlLCAwLCAxKTsKICAgICAgfQogICAgICBpZiAoY2hhckNvZGUgPD0gMHgxMGZmZmYpIHsKICAgICAgICB2YXIgbG93ID0gMHhEQzAwIHwgKGNoYXJDb2RlICYgMHgzZmYpOwogICAgICAgIGludCBiaXRzID0gY2hhckNvZGUgLSAweDEwMDAwOwogICAgICAgIHZhciBoaWdoID0gMHhEODAwIHwgKGJpdHMgPj4gMTApOwogICAgICAgIHJldHVybiBfU3RyaW5nQmFzZS5fY3JlYXRlRnJvbUNvZGVQb2ludHMoCiAgICAgICAgICAgIG5ldyBfTGlzdCgyKQogICAgICAgICAgICAgIC4uWzBdID0gaGlnaAogICAgICAgICAgICAgIC4uWzFdID0gbG93LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyKTsKICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoY2hhckNvZGUsIDAsIDB4MTBmZmZmKTsKICB9CgogIEBwYXRjaAogIGNvbnN0IGZhY3RvcnkgU3RyaW5nLmZyb21FbnZpcm9ubWVudChTdHJpbmcgbmFtZSwge1N0cmluZyBkZWZhdWx0VmFsdWV9KQogICAgICBuYXRpdmUgIlN0cmluZ19mcm9tRW52aXJvbm1lbnQiOwoKICBib29sIGdldCBfaXNPbmVCeXRlOwogIFN0cmluZyBfc3Vic3RyaW5nVW5jaGVja2VkKGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpOwp9CgovKioKICogW19TdHJpbmdCYXNlXSBjb250YWlucyBjb21tb24gbWV0aG9kcyB1c2VkIGJ5IGNvbmNyZXRlIFN0cmluZwogKiBpbXBsZW1lbnRhdGlvbnMsIGUuZy4sIF9PbmVCeXRlU3RyaW5nLgogKi8KYWJzdHJhY3QgY2xhc3MgX1N0cmluZ0Jhc2UgaW1wbGVtZW50cyBTdHJpbmcgewogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpOwoKICAvLyBDb25zdGFudHMgdXNlZCBieSByZXBsYWNlQWxsIGVuY29kaW5nIG9mIHN0cmluZyBzbGljZXMgYmV0d2VlbiBtYXRjaGVzLgogIC8vIEEgc3RyaW5nIHNsaWNlIChzdGFydCtsZW5ndGgpIGlzIGVuY29kZWQgaW4gYSBzaW5nbGUgU21pIHRvIHNhdmUgbWVtb3J5CiAgLy8gb3ZlcmhlYWQgaW4gdGhlIGNvbW1vbiBjYXNlLgogIC8vIFdlIHVzZSBmZXdlciBiaXRzIGZvciBsZW5ndGggKDExIGJpdHMpIHRoYW4gZm9yIHRoZSBzdGFydCBpbmRleCAoMTkrIGJpdHMpLgogIC8vIEZvciBsb25nIHN0cmluZ3MsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBtYW55IGxhcmdlIGluZGljZXMsCiAgLy8gYnV0IGl0J3MgdW5saWtlbHkgdG8gaGF2ZSBtYW55IGxvbmcgbGVuZ3RocyBzaW5jZSBzbGljZXMgZG9uJ3Qgb3ZlcmxhcC4KICAvLyBJZiB0aGVyZSBhcmUgZmV3IG1hdGNoZXMgaW4gYSBsb25nIHN0cmluZywgdGhlbiB0aGVyZSBhcmUgZmV3IGxvbmcgc2xpY2VzLAogIC8vIGFuZCBpZiB0aGVyZSBhcmUgbWFueSBtYXRjaGVzLCB0aGVyZSdsbCBsaWtlbHkgYmUgbWFueSBzaG9ydCBzbGljZXMuCiAgLy8KICAvLyBFbmNvZGluZyBpczogMCgoc3RhcnQgPDwgX2xlbmd0aEJpdHMpIHwgbGVuZ3RoKQoKICAvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGJ5IGxlbmd0aC4KICAvLyBUaGlzIGlzIHRoZSBzaGlmdCB1c2VkIHRvIGVuY29kZSBhbmQgZGVjb2RlIHRoZSBzdGFydCBpbmRleC4KICBzdGF0aWMgY29uc3QgaW50IF9sZW5ndGhCaXRzID0gMTE7CiAgLy8gVGhlIG1heGltYWwgYWxsb3dlZCBsZW5ndGggdmFsdWUgaW4gYW4gZW5jb2RlZCBzbGljZS4KICBzdGF0aWMgY29uc3QgaW50IF9tYXhMZW5ndGhWYWx1ZSA9ICgxIDw8IF9sZW5ndGhCaXRzKSAtIDE7CiAgLy8gTWFzayBvZiBsZW5ndGggaW4gZW5jb2RlZCBzbWkgdmFsdWUuCiAgc3RhdGljIGNvbnN0IGludCBfbGVuZ3RoTWFzayA9IF9tYXhMZW5ndGhWYWx1ZTsKICBzdGF0aWMgY29uc3QgaW50IF9zdGFydEJpdHMgPSBfbWF4VW5zaWduZWRTbWlCaXRzIC0gX2xlbmd0aEJpdHM7CiAgLy8gTWF4aW1hbCBhbGxvd2VkIHN0YXJ0IGluZGV4IHZhbHVlIGluIGFuIGVuY29kZWQgc2xpY2UuCiAgc3RhdGljIGNvbnN0IGludCBfbWF4U3RhcnRWYWx1ZSA9ICgxIDw8IF9zdGFydEJpdHMpIC0gMTsKICAvLyBXZSBwaWNrIDMwIGFzIGEgc2FmZSBsb3dlciBib3VuZCBvbiBhdmFpbGFibGUgYml0cyBpbiBhIG5lZ2F0aXZlIHNtaS4KICAvLyBUT0RPKGxybik6IENvbnNpZGVyIGFsbG93aW5nIG1vcmUgYml0cyBmb3Igc3RhcnQgb24gNjQtYml0IHN5c3RlbXMuCiAgc3RhdGljIGNvbnN0IGludCBfbWF4VW5zaWduZWRTbWlCaXRzID0gMzA7CgogIC8vIEZvciBsb25nZXIgc3RyaW5ncywgY2FsbGluZyBpbnRvIEMrKyB0byBjcmVhdGUgdGhlIHJlc3VsdCBvZiBhCiAgLy8gW3JlcGxhY2VBbGxdIGlzIGZhc3RlciB0aGFuIFtfam9pblJlcGxhY2VBbGxPbmVCeXRlUmVzdWx0XS4KICAvLyBUT0RPKGxybik6IFNlZSBpZiB0aGlzIGxpbWl0IGNhbiBiZSB0d2Vha2VkLgogIHN0YXRpYyBjb25zdCBpbnQgX21heEpvaW5SZXBsYWNlT25lQnl0ZVN0cmluZ0xlbmd0aCA9IDUwMDsKCiAgZmFjdG9yeSBfU3RyaW5nQmFzZS5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiX1N0cmluZ0Jhc2UgY2FuJ3QgYmUgaW5zdGFuaWF0ZWQiKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiU3RyaW5nX2dldEhhc2hDb2RlIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgX2lkZW50aXR5SGFzaENvZGUgbmF0aXZlICJTdHJpbmdfZ2V0SGFzaENvZGUiOwoKICBib29sIGdldCBfaXNPbmVCeXRlIHsKICAgIC8vIEFsdGVybmF0aXZlbHkgcmV0dXJuIGZhbHNlIGFuZCBvdmVycmlkZSBpdCBvbiBvbmUtYnl0ZSBzdHJpbmcgY2xhc3Nlcy4KICAgIGludCBpZCA9IENsYXNzSUQuZ2V0SUQodGhpcyk7CiAgICByZXR1cm4gaWQgPT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nIHx8CiAgICAgICAgaWQgPT0gQ2xhc3NJRC5jaWRFeHRlcm5hbE9uZUJ5dGVTdHJpbmc7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgdGhlIG1vc3QgZWZmaWNpZW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3Igc3BlY2lmaWVkCiAgICogW2NoYXJDb2Rlc10uCiAgICoKICAgKiBPbmx5IHVzZXMgdGhlIGNoYXJhY3RlciBjb2RlcyBiZXR3ZWVuIGluZGV4IFtzdGFydF0gYW5kIGluZGV4IFtlbmRdIG9mCiAgICogYGNoYXJDb2Rlc2AuIFRoZXkgbXVzdCBzYXRpc2Z5IGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBjaGFyQ29kZXMubGVuZ3RoYC4KICAgKgogICAqIFRoZSBbbGltaXRdIGlzIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBjaGFyYWN0ZXIgY29kZXMgaW4gdGhlIGl0ZXJhYmxlLgogICAqIEl0J3MgYG51bGxgIGlmIHVua25vd24uCiAgICovCiAgc3RhdGljIFN0cmluZyBjcmVhdGVGcm9tQ2hhckNvZGVzKAogICAgICBJdGVyYWJsZTxpbnQ+IGNoYXJDb2RlcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGltaXQpIHsKICAgIGlmIChzdGFydCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzdGFydCIpOwogICAgaWYgKGNoYXJDb2RlcyA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihjaGFyQ29kZXMpOwogICAgLy8gVE9ETyhzcmRqYW4pOiBBbHNvIHNraXAgY29weWluZyBvZiB3aWRlIHR5cGVkIGFycmF5cy4KICAgIGZpbmFsIGNjaWQgPSBDbGFzc0lELmdldElEKGNoYXJDb2Rlcyk7CiAgICBpZiAoKGNjaWQgIT0gQ2xhc3NJRC5jaWRBcnJheSkgJiYKICAgICAgICAoY2NpZCAhPSBDbGFzc0lELmNpZEdyb3dhYmxlT2JqZWN0QXJyYXkpICYmCiAgICAgICAgKGNjaWQgIT0gQ2xhc3NJRC5jaWRJbW11dGFibGVBcnJheSkpIHsKICAgICAgaWYgKGNoYXJDb2RlcyBpcyBVaW50OExpc3QpIHsKICAgICAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBjaGFyQ29kZXMubGVuZ3RoKTsKICAgICAgICByZXR1cm4gX2NyZWF0ZU9uZUJ5dGVTdHJpbmcoY2hhckNvZGVzLCBzdGFydCwgZW5kIC0gc3RhcnQpOwogICAgICB9IGVsc2UgaWYgKGNoYXJDb2RlcyBpcyEgVWludDE2TGlzdCkgewogICAgICAgIHJldHVybiBfY3JlYXRlU3RyaW5nRnJvbUl0ZXJhYmxlKGNoYXJDb2Rlcywgc3RhcnQsIGVuZCk7CiAgICAgIH0KICAgIH0KICAgIGludCBjb2RlQ291bnQgPSBjaGFyQ29kZXMubGVuZ3RoOwogICAgZW5kID0gUmFuZ2VFcnJvci5jaGVja1ZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgY29kZUNvdW50KTsKICAgIGZpbmFsIGxlbiA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gIiI7CiAgICBsaW1pdCA/Pz0gX3NjYW5Db2RlVW5pdHMoY2hhckNvZGVzLCBzdGFydCwgZW5kKTsKICAgIGlmIChsaW1pdCA8IDApIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoY2hhckNvZGVzKTsKICAgIH0KICAgIGlmIChsaW1pdCA8PSBfbWF4TGF0aW4xKSB7CiAgICAgIHJldHVybiBfY3JlYXRlT25lQnl0ZVN0cmluZyhjaGFyQ29kZXMsIHN0YXJ0LCBsZW4pOwogICAgfQogICAgaWYgKGxpbWl0IDw9IF9tYXhVdGYxNikgewogICAgICByZXR1cm4gX1R3b0J5dGVTdHJpbmcuX2FsbG9jYXRlRnJvbVR3b0J5dGVMaXN0KGNoYXJDb2Rlcywgc3RhcnQsIGVuZCk7CiAgICB9CiAgICAvLyBUT0RPKGxybik6IENvbnNpZGVyIHBhc3NpbmcgbGltaXQgdG8gX2NyZWF0ZUZyb21Db2RlUG9pbnRzLCBiZWNhdXNlCiAgICAvLyB0aGUgZnVuY3Rpb24gaXMgY3VycmVudGx5IGZ1bGx5IGdlbmVyaWMgYW5kIGRvZXNuJ3Qga25vdyB0aGF0IGl0cwogICAgLy8gY2hhckNvZGVzIGFyZSBub3QgYWxsIExhdGluLTEgb3IgVXRmLTE2LgogICAgcmV0dXJuIF9jcmVhdGVGcm9tQ29kZVBvaW50cyhjaGFyQ29kZXMsIHN0YXJ0LCBlbmQpOwogIH0KCiAgc3RhdGljIGludCBfc2NhbkNvZGVVbml0cyhMaXN0PGludD4gY2hhckNvZGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGludCBiaXRzID0gMDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGludCBjb2RlID0gY2hhckNvZGVzW2ldOwogICAgICBpZiAoY29kZSBpcyEgX1NtaSkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoY2hhckNvZGVzKTsKICAgICAgYml0cyB8PSBjb2RlOwogICAgfQogICAgcmV0dXJuIGJpdHM7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9jcmVhdGVTdHJpbmdGcm9tSXRlcmFibGUoCiAgICAgIEl0ZXJhYmxlPGludD4gY2hhckNvZGVzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIC8vIFRyZWF0IGNoYXJDb2RlcyBhcyBJdGVyYWJsZS4KICAgIGlmIChjaGFyQ29kZXMgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpIHsKICAgICAgaW50IGxlbmd0aCA9IGNoYXJDb2Rlcy5sZW5ndGg7CiAgICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CiAgICAgIGZpbmFsIGNoYXJDb2RlTGlzdCA9CiAgICAgICAgICBuZXcgTGlzdDxpbnQ+LmZyb20oY2hhckNvZGVzLnRha2UoZW5kKS5za2lwKHN0YXJ0KSwgZ3Jvd2FibGU6IGZhbHNlKTsKICAgICAgcmV0dXJuIGNyZWF0ZUZyb21DaGFyQ29kZXMoY2hhckNvZGVMaXN0LCAwLCBjaGFyQ29kZUxpc3QubGVuZ3RoLCBudWxsKTsKICAgIH0KICAgIC8vIERvbid0IGtub3cgbGVuZ3RoIG9mIGl0ZXJhYmxlLCBzbyBpdGVyYXRlIGFuZCBzZWUgaWYgYWxsIHRoZSB2YWx1ZXMKICAgIC8vIGFyZSB0aGVyZS4KICAgIGlmIChzdGFydCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBjaGFyQ29kZXMubGVuZ3RoKTsKICAgIHZhciBpdCA9IGNoYXJDb2Rlcy5pdGVyYXRvcjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhcnQ7IGkrKykgewogICAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgaSk7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8aW50PiBjaGFyQ29kZUxpc3Q7CiAgICBpbnQgYml0cyA9IDA7IC8vIEJpdHdpc2Utb3Igb2YgYWxsIGNoYXIgY29kZXMgaW4gbGlzdC4KICAgIGlmIChlbmQgPT0gbnVsbCkgewogICAgICB2YXIgbGlzdCA9IDxpbnQ+W107CiAgICAgIHdoaWxlIChpdC5tb3ZlTmV4dCgpKSB7CiAgICAgICAgaW50IGNvZGUgPSBpdC5jdXJyZW50OwogICAgICAgIGJpdHMgfD0gY29kZTsKICAgICAgICBsaXN0LmFkZChjb2RlKTsKICAgICAgfQogICAgICBjaGFyQ29kZUxpc3QgPSBtYWtlTGlzdEZpeGVkTGVuZ3RoPGludD4obGlzdCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoZW5kIDwgc3RhcnQpIHsKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShlbmQsIHN0YXJ0LCBjaGFyQ29kZXMubGVuZ3RoKTsKICAgICAgfQogICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CiAgICAgIGNoYXJDb2RlTGlzdCA9IG5ldyBMaXN0PGludD4obGVuKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIGlmICghaXQubW92ZU5leHQoKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoZW5kLCBzdGFydCwgc3RhcnQgKyBpKTsKICAgICAgICB9CiAgICAgICAgaW50IGNvZGUgPSBpdC5jdXJyZW50OwogICAgICAgIGJpdHMgfD0gY29kZTsKICAgICAgICBjaGFyQ29kZUxpc3RbaV0gPSBjb2RlOwogICAgICB9CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gY2hhckNvZGVMaXN0Lmxlbmd0aDsKICAgIGlmIChiaXRzIDwgMCkgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihjaGFyQ29kZXMpOwogICAgfQogICAgYm9vbCBpc09uZUJ5dGVTdHJpbmcgPSAoYml0cyA8PSBfbWF4TGF0aW4xKTsKICAgIGlmIChpc09uZUJ5dGVTdHJpbmcpIHsKICAgICAgcmV0dXJuIF9jcmVhdGVPbmVCeXRlU3RyaW5nKGNoYXJDb2RlTGlzdCwgMCwgbGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBjcmVhdGVGcm9tQ2hhckNvZGVzKGNoYXJDb2RlTGlzdCwgMCwgbGVuZ3RoLCBiaXRzKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX2NyZWF0ZU9uZUJ5dGVTdHJpbmcoTGlzdDxpbnQ+IGNoYXJDb2RlcywgaW50IHN0YXJ0LCBpbnQgbGVuKSB7CiAgICAvLyBJdCdzIGFsd2F5cyBmYXN0ZXIgdG8gZG8gdGhpcyBpbiBEYXJ0IHRoYW4gdG8gY2FsbCBpbnRvIHRoZSBydW50aW1lLgogICAgdmFyIHMgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuKTsKCiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIF9VaW50OEFycmF5Vmlldy4KICAgIGlmIChjaGFyQ29kZXMgaXMgVWludDhMaXN0KSB7CiAgICAgIGlmIChzdGFydCA+PSAwICYmIGxlbiA+PSAwKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgcy5fc2V0QXQoaSwgY2hhckNvZGVzW3N0YXJ0ICsgaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgICAgfQogICAgfQoKICAgIC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgY2FzZS4KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgcy5fc2V0QXQoaSwgY2hhckNvZGVzW3N0YXJ0ICsgaV0pOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9jcmVhdGVGcm9tQ29kZVBvaW50cyhMaXN0PGludD4gY29kZVBvaW50cywgaW50IHN0YXJ0LCBpbnQgZW5kKQogICAgICBuYXRpdmUgIlN0cmluZ0Jhc2VfY3JlYXRlRnJvbUNvZGVQb2ludHMiOwoKICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGluZGV4KSBuYXRpdmUgIlN0cmluZ19jaGFyQXQiOwoKICBpbnQgY29kZVVuaXRBdChpbnQgaW5kZXgpOyAvLyBJbXBsZW1lbnRlZCBpbiB0aGUgc3ViY2xhc3Nlcy4KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBnZXQgbGVuZ3RoIG5hdGl2ZSAiU3RyaW5nX2dldExlbmd0aCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIGdldCBpc0VtcHR5IHsKICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSAwOwogIH0KCiAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiAhaXNFbXB0eTsKCiAgU3RyaW5nIG9wZXJhdG9yICsoU3RyaW5nIG90aGVyKSBuYXRpdmUgIlN0cmluZ19jb25jYXQiOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gdGhpczsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAob3RoZXIgaXMgU3RyaW5nICYmIHRoaXMubGVuZ3RoID09IG90aGVyLmxlbmd0aCkgewogICAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIGlmICh0aGlzLmNvZGVVbml0QXQoaSkgIT0gb3RoZXIuY29kZVVuaXRBdChpKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGludCBjb21wYXJlVG8oU3RyaW5nIG90aGVyKSB7CiAgICBpbnQgdGhpc0xlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaW50IG90aGVyTGVuZ3RoID0gb3RoZXIubGVuZ3RoOwogICAgaW50IGxlbiA9ICh0aGlzTGVuZ3RoIDwgb3RoZXJMZW5ndGgpID8gdGhpc0xlbmd0aCA6IG90aGVyTGVuZ3RoOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBpbnQgdGhpc0NvZGVVbml0ID0gdGhpcy5jb2RlVW5pdEF0KGkpOwogICAgICBpbnQgb3RoZXJDb2RlVW5pdCA9IG90aGVyLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICh0aGlzQ29kZVVuaXQgPCBvdGhlckNvZGVVbml0KSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGlmICh0aGlzQ29kZVVuaXQgPiBvdGhlckNvZGVVbml0KSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzTGVuZ3RoIDwgb3RoZXJMZW5ndGgpIHJldHVybiAtMTsKICAgIGlmICh0aGlzTGVuZ3RoID4gb3RoZXJMZW5ndGgpIHJldHVybiAxOwogICAgcmV0dXJuIDA7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBfc3Vic3RyaW5nTWF0Y2hlcyhpbnQgc3RhcnQsIFN0cmluZyBvdGhlcikgewogICAgaWYgKG90aGVyLmlzRW1wdHkpIHJldHVybiB0cnVlOwogICAgZmluYWwgbGVuID0gb3RoZXIubGVuZ3RoOwogICAgaWYgKChzdGFydCA8IDApIHx8IChzdGFydCArIGxlbiA+IHRoaXMubGVuZ3RoKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmNvZGVVbml0QXQoaSArIHN0YXJ0KSAhPSBvdGhlci5jb2RlVW5pdEF0KGkpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgZW5kc1dpdGgoU3RyaW5nIG90aGVyKSB7CiAgICByZXR1cm4gX3N1YnN0cmluZ01hdGNoZXModGhpcy5sZW5ndGggLSBvdGhlci5sZW5ndGgsIG90aGVyKTsKICB9CgogIGJvb2wgc3RhcnRzV2l0aChQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgaW5kZXggPSAwXSkgewogICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IHRoaXMubGVuZ3RoKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgaWYgKHBhdHRlcm4gaXMgU3RyaW5nKSB7CiAgICAgIHJldHVybiBfc3Vic3RyaW5nTWF0Y2hlcyhpbmRleCwgcGF0dGVybik7CiAgICB9CiAgICByZXR1cm4gcGF0dGVybi5tYXRjaEFzUHJlZml4KHRoaXMsIGluZGV4KSAhPSBudWxsOwogIH0KCiAgaW50IGluZGV4T2YoUGF0dGVybiBwYXR0ZXJuLCBbaW50IHN0YXJ0ID0gMF0pIHsKICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiB0aGlzLmxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHRoaXMubGVuZ3RoLCAic3RhcnQiKTsKICAgIH0KICAgIGlmIChwYXR0ZXJuIGlzIFN0cmluZykgewogICAgICBTdHJpbmcgb3RoZXIgPSBwYXR0ZXJuOwogICAgICBpbnQgbWF4SW5kZXggPSB0aGlzLmxlbmd0aCAtIG90aGVyLmxlbmd0aDsKICAgICAgLy8gVE9ETzogVXNlIGFuIGVmZmljaWVudCBzdHJpbmcgc2VhcmNoIChlLmcuIEJNSCkuCiAgICAgIGZvciAoaW50IGluZGV4ID0gc3RhcnQ7IGluZGV4IDw9IG1heEluZGV4OyBpbmRleCsrKSB7CiAgICAgICAgaWYgKF9zdWJzdHJpbmdNYXRjaGVzKGluZGV4LCBvdGhlcikpIHsKICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgLy8gVE9ETygxMTI3Nik7IFRoaXMgaGFzIHF1YWRyYXRpYyBiZWhhdmlvciBiZWNhdXNlIG1hdGNoQXNQcmVmaXggdHJpZXMKICAgICAgLy8gdG8gZmluZCBhIGxhdGVyIG1hdGNoIHRvby4gT3B0aW1pemUgbWF0Y2hBc1ByZWZpeCB0byBhdm9pZCB0aGlzLgogICAgICBpZiAocGF0dGVybi5tYXRjaEFzUHJlZml4KHRoaXMsIGkpICE9IG51bGwpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgaW50IGxhc3RJbmRleE9mKFBhdHRlcm4gcGF0dGVybiwgW2ludCBzdGFydCA9IG51bGxdKSB7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgewogICAgICBzdGFydCA9IHRoaXMubGVuZ3RoOwogICAgfSBlbHNlIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPiB0aGlzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgdGhpcy5sZW5ndGgpOwogICAgfQogICAgaWYgKHBhdHRlcm4gaXMgU3RyaW5nKSB7CiAgICAgIFN0cmluZyBvdGhlciA9IHBhdHRlcm47CiAgICAgIGludCBtYXhJbmRleCA9IHRoaXMubGVuZ3RoIC0gb3RoZXIubGVuZ3RoOwogICAgICBpZiAobWF4SW5kZXggPCBzdGFydCkgc3RhcnQgPSBtYXhJbmRleDsKICAgICAgZm9yIChpbnQgaW5kZXggPSBzdGFydDsgaW5kZXggPj0gMDsgaW5kZXgtLSkgewogICAgICAgIGlmIChfc3Vic3RyaW5nTWF0Y2hlcyhpbmRleCwgb3RoZXIpKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA+PSAwOyBpLS0pIHsKICAgICAgLy8gVE9ETygxMTI3Nik7IFRoaXMgaGFzIHF1YWRyYXRpYyBiZWhhdmlvciBiZWNhdXNlIG1hdGNoQXNQcmVmaXggdHJpZXMKICAgICAgLy8gdG8gZmluZCBhIGxhdGVyIG1hdGNoIHRvby4gT3B0aW1pemUgbWF0Y2hBc1ByZWZpeCB0byBhdm9pZCB0aGlzLgogICAgICBpZiAocGF0dGVybi5tYXRjaEFzUHJlZml4KHRoaXMsIGkpICE9IG51bGwpIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KCiAgU3RyaW5nIHN1YnN0cmluZyhpbnQgc3RhcnRJbmRleCwgW2ludCBlbmRJbmRleF0pIHsKICAgIGVuZEluZGV4ID8/PSB0aGlzLmxlbmd0aDsKCiAgICBpZiAoKHN0YXJ0SW5kZXggPCAwKSB8fCAoc3RhcnRJbmRleCA+IHRoaXMubGVuZ3RoKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShzdGFydEluZGV4KTsKICAgIH0KICAgIGlmICgoZW5kSW5kZXggPCAwKSB8fCAoZW5kSW5kZXggPiB0aGlzLmxlbmd0aCkpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IudmFsdWUoZW5kSW5kZXgpOwogICAgfQogICAgaWYgKHN0YXJ0SW5kZXggPiBlbmRJbmRleCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShzdGFydEluZGV4KTsKICAgIH0KICAgIHJldHVybiBfc3Vic3RyaW5nVW5jaGVja2VkKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICB9CgogIFN0cmluZyBfc3Vic3RyaW5nVW5jaGVja2VkKGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKICAgIGFzc2VydChlbmRJbmRleCAhPSBudWxsKTsKICAgIGFzc2VydCgoc3RhcnRJbmRleCA+PSAwKSAmJiAoc3RhcnRJbmRleCA8PSB0aGlzLmxlbmd0aCkpOwogICAgYXNzZXJ0KChlbmRJbmRleCA+PSAwKSAmJiAoZW5kSW5kZXggPD0gdGhpcy5sZW5ndGgpKTsKICAgIGFzc2VydChzdGFydEluZGV4IDw9IGVuZEluZGV4KTsKCiAgICBpZiAoc3RhcnRJbmRleCA9PSBlbmRJbmRleCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoKHN0YXJ0SW5kZXggPT0gMCkgJiYgKGVuZEluZGV4ID09IHRoaXMubGVuZ3RoKSkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGlmICgoc3RhcnRJbmRleCArIDEpID09IGVuZEluZGV4KSB7CiAgICAgIHJldHVybiB0aGlzW3N0YXJ0SW5kZXhdOwogICAgfQogICAgcmV0dXJuIF9zdWJzdHJpbmdVbmNoZWNrZWROYXRpdmUoc3RhcnRJbmRleCwgZW5kSW5kZXgpOwogIH0KCiAgU3RyaW5nIF9zdWJzdHJpbmdVbmNoZWNrZWROYXRpdmUoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKICAgICAgbmF0aXZlICJTdHJpbmdCYXNlX3N1YnN0cmluZ1VuY2hlY2tlZCI7CgogIC8vIENoZWNrcyBmb3Igb25lLWJ5dGUgd2hpdGVzcGFjZXMgb25seS4KICBzdGF0aWMgYm9vbCBfaXNPbmVCeXRlV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIGlmIChjb2RlVW5pdCA8PSAzMikgewogICAgICByZXR1cm4gKChjb2RlVW5pdCA9PSAzMikgfHwgLy8gU3BhY2UuCiAgICAgICAgICAoKGNvZGVVbml0IDw9IDEzKSAmJiAoY29kZVVuaXQgPj0gOSkpKTsgLy8gQ1IsIExGLCBUQUIsIGV0Yy4KICAgIH0KICAgIHJldHVybiAoY29kZVVuaXQgPT0gMHg4NSkgfHwgKGNvZGVVbml0ID09IDB4QTApOyAvLyBORUwsIE5CU1AuCiAgfQoKICAvLyBDaGFyYWN0ZXJzIHdpdGggV2hpdGVzcGFjZSBwcm9wZXJ0eSAoVW5pY29kZSA2LjMpLgogIC8vIDAwMDkuLjAwMEQgICAgOyBXaGl0ZV9TcGFjZSAjIENjICAgICAgIDxjb250cm9sLTAwMDk+Li48Y29udHJvbC0wMDBEPgogIC8vIDAwMjAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIFNQQUNFCiAgLy8gMDA4NSAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgQ2MgICAgICAgPGNvbnRyb2wtMDA4NT4KICAvLyAwMEEwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgICAgICBOTy1CUkVBSyBTUEFDRQogIC8vIDE2ODAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIE9HSEFNIFNQQUNFIE1BUksKICAvLyAyMDAwLi4yMDBBICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgICAgICBFTiBRVUFELi5IQUlSIFNQQUNFCiAgLy8gMjAyOCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWmwgICAgICAgTElORSBTRVBBUkFUT1IKICAvLyAyMDI5ICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacCAgICAgICBQQVJBR1JBUEggU0VQQVJBVE9SCiAgLy8gMjAyRiAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICAgICAgTkFSUk9XIE5PLUJSRUFLIFNQQUNFCiAgLy8gMjA1RiAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICAgICAgTUVESVVNIE1BVEhFTUFUSUNBTCBTUEFDRQogIC8vIDMwMDAgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgICAgIElERU9HUkFQSElDIFNQQUNFCiAgLy8KICAvLyBCT006IDB4RkVGRgogIHN0YXRpYyBib29sIF9pc1R3b0J5dGVXaGl0ZXNwYWNlKGludCBjb2RlVW5pdCkgewogICAgaWYgKGNvZGVVbml0IDw9IDMyKSB7CiAgICAgIHJldHVybiAoY29kZVVuaXQgPT0gMzIpIHx8ICgoY29kZVVuaXQgPD0gMTMpICYmIChjb2RlVW5pdCA+PSA5KSk7CiAgICB9CiAgICBpZiAoY29kZVVuaXQgPCAweDg1KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoKGNvZGVVbml0ID09IDB4ODUpIHx8IChjb2RlVW5pdCA9PSAweEEwKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gKGNvZGVVbml0IDw9IDB4MjAwQSkKICAgICAgICA/ICgoY29kZVVuaXQgPT0gMHgxNjgwKSB8fCAoMHgyMDAwIDw9IGNvZGVVbml0KSkKICAgICAgICA6ICgoY29kZVVuaXQgPT0gMHgyMDI4KSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgyMDI5KSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgyMDJGKSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgyMDVGKSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHgzMDAwKSB8fAogICAgICAgICAgICAoY29kZVVuaXQgPT0gMHhGRUZGKSk7CiAgfQoKICBpbnQgX2ZpcnN0Tm9uV2hpdGVzcGFjZSgpIHsKICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaW50IGZpcnN0ID0gMDsKICAgIGZvciAoOyBmaXJzdCA8IGxlbjsgZmlyc3QrKykgewogICAgICBpZiAoIV9pc1doaXRlc3BhY2UodGhpcy5jb2RlVW5pdEF0KGZpcnN0KSkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZpcnN0OwogIH0KCiAgaW50IF9sYXN0Tm9uV2hpdGVzcGFjZSgpIHsKICAgIGludCBsYXN0ID0gdGhpcy5sZW5ndGggLSAxOwogICAgZm9yICg7IGxhc3QgPj0gMDsgbGFzdC0tKSB7CiAgICAgIGlmICghX2lzV2hpdGVzcGFjZSh0aGlzLmNvZGVVbml0QXQobGFzdCkpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBsYXN0OwogIH0KCiAgU3RyaW5nIHRyaW0oKSB7CiAgICBmaW5hbCBsZW4gPSB0aGlzLmxlbmd0aDsKICAgIGludCBmaXJzdCA9IF9maXJzdE5vbldoaXRlc3BhY2UoKTsKICAgIGlmIChsZW4gPT0gZmlyc3QpIHsKICAgICAgLy8gU3RyaW5nIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGludCBsYXN0ID0gX2xhc3ROb25XaGl0ZXNwYWNlKCkgKyAxOwogICAgaWYgKChmaXJzdCA9PSAwKSAmJiAobGFzdCA9PSBsZW4pKSB7CiAgICAgIC8vIFJldHVybnMgdGhpcyBzdHJpbmcgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nCiAgICAgIC8vIHdoaXRlc3BhY2VzLgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJldHVybiBfc3Vic3RyaW5nVW5jaGVja2VkKGZpcnN0LCBsYXN0KTsKICB9CgogIFN0cmluZyB0cmltTGVmdCgpIHsKICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgaW50IGZpcnN0ID0gMDsKICAgIGZvciAoOyBmaXJzdCA8IGxlbjsgZmlyc3QrKykgewogICAgICBpZiAoIV9pc1doaXRlc3BhY2UodGhpcy5jb2RlVW5pdEF0KGZpcnN0KSkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGxlbiA9PSBmaXJzdCkgewogICAgICAvLyBTdHJpbmcgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcy4KICAgICAgcmV0dXJuICIiOwogICAgfQogICAgaWYgKGZpcnN0ID09IDApIHsKICAgICAgLy8gUmV0dXJucyB0aGlzIHN0cmluZyBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcKICAgICAgLy8gd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIF9zdWJzdHJpbmdVbmNoZWNrZWQoZmlyc3QsIGxlbik7CiAgfQoKICBTdHJpbmcgdHJpbVJpZ2h0KCkgewogICAgZmluYWwgbGVuID0gdGhpcy5sZW5ndGg7CiAgICBpbnQgbGFzdCA9IGxlbiAtIDE7CiAgICBmb3IgKDsgbGFzdCA+PSAwOyBsYXN0LS0pIHsKICAgICAgaWYgKCFfaXNXaGl0ZXNwYWNlKHRoaXMuY29kZVVuaXRBdChsYXN0KSkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGxhc3QgPT0gLTEpIHsKICAgICAgLy8gU3RyaW5nIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmIChsYXN0ID09IChsZW4gLSAxKSkgewogICAgICAvLyBSZXR1cm5zIHRoaXMgc3RyaW5nIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgdHJhaWxpbmcgd2hpdGVzcGFjZXMuCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmV0dXJuIF9zdWJzdHJpbmdVbmNoZWNrZWQoMCwgbGFzdCArIDEpOwogIH0KCiAgU3RyaW5nIG9wZXJhdG9yICooaW50IHRpbWVzKSB7CiAgICBpZiAodGltZXMgPD0gMCkgcmV0dXJuICIiOwogICAgaWYgKHRpbWVzID09IDEpIHJldHVybiB0aGlzOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcyk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IHRpbWVzOyBpKyspIHsKICAgICAgYnVmZmVyLndyaXRlKHRoaXMpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgU3RyaW5nIHBhZExlZnQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKSB7CiAgICBpbnQgZGVsdGEgPSB3aWR0aCAtIHRoaXMubGVuZ3RoOwogICAgaWYgKGRlbHRhIDw9IDApIHJldHVybiB0aGlzOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICBidWZmZXIud3JpdGUocGFkZGluZyk7CiAgICB9CiAgICBidWZmZXIud3JpdGUodGhpcyk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBTdHJpbmcgcGFkUmlnaHQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKSB7CiAgICBpbnQgZGVsdGEgPSB3aWR0aCAtIHRoaXMubGVuZ3RoOwogICAgaWYgKGRlbHRhIDw9IDApIHJldHVybiB0aGlzOwogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcyk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKICAgICAgYnVmZmVyLndyaXRlKHBhZGRpbmcpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgYm9vbCBjb250YWlucyhQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnRJbmRleCA9IDBdKSB7CiAgICBpZiAocGF0dGVybiBpcyBTdHJpbmcpIHsKICAgICAgaWYgKHN0YXJ0SW5kZXggPCAwIHx8IHN0YXJ0SW5kZXggPiB0aGlzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0SW5kZXgsIDAsIHRoaXMubGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gaW5kZXhPZihwYXR0ZXJuLCBzdGFydEluZGV4KSA+PSAwOwogICAgfQogICAgcmV0dXJuIHBhdHRlcm4uYWxsTWF0Y2hlcyh0aGlzLnN1YnN0cmluZyhzdGFydEluZGV4KSkuaXNOb3RFbXB0eTsKICB9CgogIFN0cmluZyByZXBsYWNlRmlyc3QoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZW1lbnQsCiAgICAgIFtpbnQgc3RhcnRJbmRleCA9IDBdKSB7CiAgICBpZiAocGF0dGVybiBpcyEgUGF0dGVybikgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiJHtwYXR0ZXJufSBpcyBub3QgYSBQYXR0ZXJuIik7CiAgICB9CiAgICBpZiAocmVwbGFjZW1lbnQgaXMhIFN0cmluZykgewogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiJHtyZXBsYWNlbWVudH0gaXMgbm90IGEgU3RyaW5nIik7CiAgICB9CiAgICBpZiAoc3RhcnRJbmRleCBpcyEgaW50KSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCIke3N0YXJ0SW5kZXh9IGlzIG5vdCBhbiBpbnQiKTsKICAgIH0KICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoc3RhcnRJbmRleCwgMCwgdGhpcy5sZW5ndGgsICJzdGFydEluZGV4Iik7CiAgICBJdGVyYXRvciBpdGVyYXRvciA9IHN0YXJ0SW5kZXggPT0gMAogICAgICAgID8gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMpLml0ZXJhdG9yCiAgICAgICAgOiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcywgc3RhcnRJbmRleCkuaXRlcmF0b3I7CiAgICBpZiAoIWl0ZXJhdG9yLm1vdmVOZXh0KCkpIHJldHVybiB0aGlzOwogICAgTWF0Y2ggbWF0Y2ggPSBpdGVyYXRvci5jdXJyZW50OwogICAgcmV0dXJuIHJlcGxhY2VSYW5nZShtYXRjaC5zdGFydCwgbWF0Y2guZW5kLCByZXBsYWNlbWVudCk7CiAgfQoKICBTdHJpbmcgcmVwbGFjZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHJlcGxhY2VtZW50KSB7CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBlbmQgPSBSYW5nZUVycm9yLmNoZWNrVmFsaWRSYW5nZShzdGFydCwgZW5kLCBsZW5ndGgpOwogICAgYm9vbCByZXBsYWNlbWVudElzT25lQnl0ZSA9IHJlcGxhY2VtZW50Ll9pc09uZUJ5dGU7CiAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gbGVuZ3RoKSByZXR1cm4gcmVwbGFjZW1lbnQ7CiAgICBpbnQgcmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudC5sZW5ndGg7CiAgICBpbnQgdG90YWxMZW5ndGggPSBzdGFydCArIChsZW5ndGggLSBlbmQpICsgcmVwbGFjZW1lbnRMZW5ndGg7CiAgICBpZiAocmVwbGFjZW1lbnRJc09uZUJ5dGUgJiYgdGhpcy5faXNPbmVCeXRlKSB7CiAgICAgIHZhciByZXN1bHQgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUodG90YWxMZW5ndGgpOwogICAgICBpbnQgaW5kZXggPSAwOwogICAgICBpbmRleCA9IHJlc3VsdC5fc2V0UmFuZ2UoaW5kZXgsIHRoaXMsIDAsIHN0YXJ0KTsKICAgICAgaW5kZXggPSByZXN1bHQuX3NldFJhbmdlKHN0YXJ0LCByZXBsYWNlbWVudCwgMCwgcmVwbGFjZW1lbnRMZW5ndGgpOwogICAgICByZXN1bHQuX3NldFJhbmdlKGluZGV4LCB0aGlzLCBlbmQsIGxlbmd0aCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBMaXN0IHNsaWNlcyA9IFtdOwogICAgX2FkZFJlcGxhY2VTbGljZShzbGljZXMsIDAsIHN0YXJ0KTsKICAgIGlmIChyZXBsYWNlbWVudC5sZW5ndGggPiAwKSBzbGljZXMuYWRkKHJlcGxhY2VtZW50KTsKICAgIF9hZGRSZXBsYWNlU2xpY2Uoc2xpY2VzLCBlbmQsIGxlbmd0aCk7CiAgICByZXR1cm4gX2pvaW5SZXBsYWNlQWxsUmVzdWx0KAogICAgICAgIHRoaXMsIHNsaWNlcywgdG90YWxMZW5ndGgsIHJlcGxhY2VtZW50SXNPbmVCeXRlKTsKICB9CgogIHN0YXRpYyBpbnQgX2FkZFJlcGxhY2VTbGljZShMaXN0IG1hdGNoZXMsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgaWYgKGxlbmd0aCA8PSBfbWF4TGVuZ3RoVmFsdWUgJiYgc3RhcnQgPD0gX21heFN0YXJ0VmFsdWUpIHsKICAgICAgICBtYXRjaGVzLmFkZCgtKChzdGFydCA8PCBfbGVuZ3RoQml0cykgfCBsZW5ndGgpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXRjaGVzLmFkZChzdGFydCk7CiAgICAgICAgbWF0Y2hlcy5hZGQoZW5kKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxlbmd0aDsKICB9CgogIFN0cmluZyByZXBsYWNlQWxsKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIHJlcGxhY2VtZW50KSB7CiAgICBpZiAocGF0dGVybiA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJwYXR0ZXJuIik7CiAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgicmVwbGFjZW1lbnQiKTsKCiAgICBpbnQgc3RhcnRJbmRleCA9IDA7CiAgICAvLyBTdHJpbmcgZnJhZ21lbnRzIHRoYXQgcmVwbGFjZSB0aGUgdGhlIHByZWZpeCBbdGhpc10gdXAgdG8gW3N0YXJ0SW5kZXhdLgogICAgTGlzdCBtYXRjaGVzID0gW107CiAgICBpbnQgbGVuZ3RoID0gMDsgLy8gTGVuZ3RoIG9mIGFsbCBmcmFnbWVudHMuCiAgICBpbnQgcmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudC5sZW5ndGg7CgogICAgaWYgKHJlcGxhY2VtZW50TGVuZ3RoID09IDApIHsKICAgICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCBtYXRjaC5zdGFydCk7CiAgICAgICAgc3RhcnRJbmRleCA9IG1hdGNoLmVuZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCBtYXRjaC5zdGFydCk7CiAgICAgICAgbWF0Y2hlcy5hZGQocmVwbGFjZW1lbnQpOwogICAgICAgIGxlbmd0aCArPSByZXBsYWNlbWVudExlbmd0aDsKICAgICAgICBzdGFydEluZGV4ID0gbWF0Y2guZW5kOwogICAgICB9CiAgICB9CiAgICAvLyBObyBtYXRjaCwgb3IgYSB6ZXJvLWxlbmd0aCBtYXRjaCBhdCBzdGFydCB3aXRoIHplcm8tbGVuZ3RoIHJlcGxhY2VtZW50LgogICAgaWYgKHN0YXJ0SW5kZXggPT0gMCAmJiBsZW5ndGggPT0gMCkgcmV0dXJuIHRoaXM7CiAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCB0aGlzLmxlbmd0aCk7CiAgICBib29sIHJlcGxhY2VtZW50SXNPbmVCeXRlID0gcmVwbGFjZW1lbnQuX2lzT25lQnl0ZTsKICAgIGlmIChyZXBsYWNlbWVudElzT25lQnl0ZSAmJgogICAgICAgIGxlbmd0aCA8IF9tYXhKb2luUmVwbGFjZU9uZUJ5dGVTdHJpbmdMZW5ndGggJiYKICAgICAgICB0aGlzLl9pc09uZUJ5dGUpIHsKICAgICAgLy8gVE9ETyhscm4pOiBJcyB0aGVyZSBhIGN1dC1vZmYgcG9pbnQsIG9yIGlzIHJ1bnRpbWUgYWx3YXlzIGZhc3Rlcj8KICAgICAgcmV0dXJuIF9qb2luUmVwbGFjZUFsbE9uZUJ5dGVSZXN1bHQodGhpcywgbWF0Y2hlcywgbGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBfam9pblJlcGxhY2VBbGxSZXN1bHQodGhpcywgbWF0Y2hlcywgbGVuZ3RoLCByZXBsYWNlbWVudElzT25lQnl0ZSk7CiAgfQoKICAvKioKICAgKiBBcyBbX2pvaW5SZXBsYWNlQWxsUmVzdWx0XSwgYnV0IGtub3dpbmcgdGhhdCB0aGUgcmVzdWx0CiAgICogaXMgYWx3YXlzIGEgW19PbmVCeXRlU3RyaW5nXS4KICAgKi8KICBzdGF0aWMgU3RyaW5nIF9qb2luUmVwbGFjZUFsbE9uZUJ5dGVSZXN1bHQoCiAgICAgIFN0cmluZyBiYXNlLCBMaXN0IG1hdGNoZXMsIGludCBsZW5ndGgpIHsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShsZW5ndGgpOwogICAgaW50IHdyaXRlSW5kZXggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbnRyeSA9IG1hdGNoZXNbaV07CiAgICAgIGlmIChlbnRyeSBpcyBfU21pKSB7CiAgICAgICAgaW50IHNsaWNlU3RhcnQgPSBlbnRyeTsKICAgICAgICBpbnQgc2xpY2VFbmQ7CiAgICAgICAgaWYgKHNsaWNlU3RhcnQgPCAwKSB7CiAgICAgICAgICBpbnQgYml0cyA9IC1zbGljZVN0YXJ0OwogICAgICAgICAgaW50IHNsaWNlTGVuZ3RoID0gYml0cyAmIF9sZW5ndGhNYXNrOwogICAgICAgICAgc2xpY2VTdGFydCA9IGJpdHMgPj4gX2xlbmd0aEJpdHM7CiAgICAgICAgICBzbGljZUVuZCA9IHNsaWNlU3RhcnQgKyBzbGljZUxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaSsrOwogICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCB2YWxpZCBtYXRjaGVzIGxpc3RzLgogICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgc2hvcnQsIG9yIHNsaWNlRW5kIGlzIG5vdCBhbiBpbnRlZ2VyLCBvbmUgb2YKICAgICAgICAgIC8vIHRoZSBuZXh0IGZldyBsaW5lcyB3aWxsIHRocm93IGFueXdheS4KICAgICAgICAgIGFzc2VydChpIDwgbWF0Y2hlcy5sZW5ndGgpOwogICAgICAgICAgc2xpY2VFbmQgPSBtYXRjaGVzW2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBqID0gc2xpY2VTdGFydDsgaiA8IHNsaWNlRW5kOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5fc2V0QXQod3JpdGVJbmRleCsrLCBiYXNlLmNvZGVVbml0QXQoaikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBSZXBsYWNlbWVudCBpcyBhIG9uZS1ieXRlIHN0cmluZy4KICAgICAgICBTdHJpbmcgcmVwbGFjZW1lbnQgPSBlbnRyeTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlcGxhY2VtZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICByZXN1bHQuX3NldEF0KHdyaXRlSW5kZXgrKywgcmVwbGFjZW1lbnQuY29kZVVuaXRBdChqKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3NlcnQod3JpdGVJbmRleCA9PSBsZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENvbWJpbmUgdGhlIHJlc3VsdHMgb2YgYSBbcmVwbGFjZUFsbF0gbWF0Y2ggaW50byBhIG5ldyBzdHJpbmcuCiAgICoKICAgKiBUaGUgW21hdGNoZXNdIGxpc3RzIGNvbnRhaW5zIFNtaSBpbmRleCBwYWlycyByZXByZXNlbnRpbmcgc2xpY2VzIG9mCiAgICogW2Jhc2VdIGFuZCBbU3RyaW5nXXMgdG8gYmUgcHV0IGluIGJldHdlZW4gdGhlIHNsaWNlcy4KICAgKgogICAqIFRoZSB0b3RhbCBbbGVuZ3RoXSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBrbm93biwgYXMgaXMKICAgKiB3aGV0aGVyIHRoZSByZXBsYWNlbWVudCBzdHJpbmdzIGFyZSBvbmUtYnl0ZSBzdHJpbmdzLgogICAqIElmIHRoZXkgYXJlLCB0aGVuIHdlIGhhdmUgdG8gY2hlY2sgdGhlIGJhc2Ugc3RyaW5nIHNsaWNlcyB0byBrbm93CiAgICogd2hldGhlciB0aGUgcmVzdWx0IG11c3QgYmUgYSBvbmUtYnl0ZSBzdHJpbmcuCiAgICovCiAgc3RhdGljIFN0cmluZwogICAgICBfam9pblJlcGxhY2VBbGxSZXN1bHQoU3RyaW5nIGJhc2UsIExpc3QgbWF0Y2hlcywgaW50IGxlbmd0aCwKICAgICAgICAgIGJvb2wgcmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZSkKICAgICAgbmF0aXZlICJTdHJpbmdCYXNlX2pvaW5SZXBsYWNlQWxsUmVzdWx0IjsKCiAgU3RyaW5nIHJlcGxhY2VBbGxNYXBwZWQoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZShNYXRjaCBtYXRjaCkpIHsKICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInBhdHRlcm4iKTsKICAgIGlmIChyZXBsYWNlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoInJlcGxhY2UiKTsKICAgIExpc3QgbWF0Y2hlcyA9IFtdOwogICAgaW50IGxlbmd0aCA9IDA7CiAgICBpbnQgc3RhcnRJbmRleCA9IDA7CiAgICBib29sIHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGUgPSB0cnVlOwogICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgbGVuZ3RoICs9IF9hZGRSZXBsYWNlU2xpY2UobWF0Y2hlcywgc3RhcnRJbmRleCwgbWF0Y2guc3RhcnQpOwogICAgICB2YXIgcmVwbGFjZW1lbnQgPSAiJHtyZXBsYWNlKG1hdGNoKX0iOwogICAgICBtYXRjaGVzLmFkZChyZXBsYWNlbWVudCk7CiAgICAgIGxlbmd0aCArPSByZXBsYWNlbWVudC5sZW5ndGg7CiAgICAgIHJlcGxhY2VtZW50U3RyaW5nc0FyZU9uZUJ5dGUgPQogICAgICAgICAgcmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZSAmJiByZXBsYWNlbWVudC5faXNPbmVCeXRlOwogICAgICBzdGFydEluZGV4ID0gbWF0Y2guZW5kOwogICAgfQogICAgaWYgKG1hdGNoZXMuaXNFbXB0eSkgcmV0dXJuIHRoaXM7CiAgICBsZW5ndGggKz0gX2FkZFJlcGxhY2VTbGljZShtYXRjaGVzLCBzdGFydEluZGV4LCB0aGlzLmxlbmd0aCk7CiAgICBpZiAocmVwbGFjZW1lbnRTdHJpbmdzQXJlT25lQnl0ZSAmJgogICAgICAgIGxlbmd0aCA8IF9tYXhKb2luUmVwbGFjZU9uZUJ5dGVTdHJpbmdMZW5ndGggJiYKICAgICAgICB0aGlzLl9pc09uZUJ5dGUpIHsKICAgICAgcmV0dXJuIF9qb2luUmVwbGFjZUFsbE9uZUJ5dGVSZXN1bHQodGhpcywgbWF0Y2hlcywgbGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiBfam9pblJlcGxhY2VBbGxSZXN1bHQoCiAgICAgICAgdGhpcywgbWF0Y2hlcywgbGVuZ3RoLCByZXBsYWNlbWVudFN0cmluZ3NBcmVPbmVCeXRlKTsKICB9CgogIFN0cmluZyByZXBsYWNlRmlyc3RNYXBwZWQoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZShNYXRjaCBtYXRjaCksCiAgICAgIFtpbnQgc3RhcnRJbmRleCA9IDBdKSB7CiAgICBpZiAocGF0dGVybiA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJwYXR0ZXJuIik7CiAgICBpZiAocmVwbGFjZSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJyZXBsYWNlIik7CiAgICBpZiAoc3RhcnRJbmRleCA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzdGFydEluZGV4Iik7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsdWVJbkludGVydmFsKHN0YXJ0SW5kZXgsIDAsIHRoaXMubGVuZ3RoLCAic3RhcnRJbmRleCIpOwoKICAgIHZhciBtYXRjaGVzID0gcGF0dGVybi5hbGxNYXRjaGVzKHRoaXMsIHN0YXJ0SW5kZXgpLml0ZXJhdG9yOwogICAgaWYgKCFtYXRjaGVzLm1vdmVOZXh0KCkpIHJldHVybiB0aGlzOwogICAgdmFyIG1hdGNoID0gbWF0Y2hlcy5jdXJyZW50OwogICAgdmFyIHJlcGxhY2VtZW50ID0gIiR7cmVwbGFjZShtYXRjaCl9IjsKICAgIHJldHVybiByZXBsYWNlUmFuZ2UobWF0Y2guc3RhcnQsIG1hdGNoLmVuZCwgcmVwbGFjZW1lbnQpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfbWF0Y2hTdHJpbmcoTWF0Y2ggbWF0Y2gpID0+IG1hdGNoWzBdOwogIHN0YXRpYyBTdHJpbmcgX3N0cmluZ0lkZW50aXR5KFN0cmluZyBzdHJpbmcpID0+IHN0cmluZzsKCiAgU3RyaW5nIF9zcGxpdE1hcEpvaW5FbXB0eVN0cmluZygKICAgICAgU3RyaW5nIG9uTWF0Y2goTWF0Y2ggbWF0Y2gpLCBTdHJpbmcgb25Ob25NYXRjaChTdHJpbmcgbm9uTWF0Y2gpKSB7CiAgICAvLyBQYXR0ZXJuIGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogICAgaW50IGkgPSAwOwogICAgYnVmZmVyLndyaXRlKG9uTm9uTWF0Y2goIiIpKTsKICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CiAgICAgIGJ1ZmZlci53cml0ZShvbk1hdGNoKG5ldyBfU3RyaW5nTWF0Y2goaSwgdGhpcywgIiIpKSk7CiAgICAgIC8vIFNwZWNpYWwgY2FzZSB0byBhdm9pZCBzcGxpdHRpbmcgYSBzdXJyb2dhdGUgcGFpci4KICAgICAgaW50IGNvZGUgPSB0aGlzLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmICgoY29kZSAmIH4weDNGRikgPT0gMHhEODAwICYmIGxlbmd0aCA+IGkgKyAxKSB7CiAgICAgICAgLy8gTGVhZGluZyBzdXJyb2dhdGU7CiAgICAgICAgY29kZSA9IHRoaXMuY29kZVVuaXRBdChpICsgMSk7CiAgICAgICAgaWYgKChjb2RlICYgfjB4M0ZGKSA9PSAweERDMDApIHsKICAgICAgICAgIC8vIE1hdGNoaW5nIHRyYWlsaW5nIHN1cnJvZ2F0ZS4KICAgICAgICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKHRoaXMuc3Vic3RyaW5nKGksIGkgKyAyKSkpOwogICAgICAgICAgaSArPSAyOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKHRoaXNbaV0pKTsKICAgICAgaSsrOwogICAgfQogICAgYnVmZmVyLndyaXRlKG9uTWF0Y2gobmV3IF9TdHJpbmdNYXRjaChpLCB0aGlzLCAiIikpKTsKICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKCIiKSk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICBTdHJpbmcgc3BsaXRNYXBKb2luKFBhdHRlcm4gcGF0dGVybiwKICAgICAge1N0cmluZyBvbk1hdGNoKE1hdGNoIG1hdGNoKSwgU3RyaW5nIG9uTm9uTWF0Y2goU3RyaW5nIG5vbk1hdGNoKX0pIHsKICAgIGlmIChwYXR0ZXJuIGlzISBQYXR0ZXJuKSB7CiAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCIke3BhdHRlcm59IGlzIG5vdCBhIFBhdHRlcm4iKTsKICAgIH0KICAgIG9uTWF0Y2ggPz89IF9tYXRjaFN0cmluZzsKICAgIG9uTm9uTWF0Y2ggPz89IF9zdHJpbmdJZGVudGl0eTsKICAgIGlmIChwYXR0ZXJuIGlzIFN0cmluZykgewogICAgICBTdHJpbmcgc3RyaW5nUGF0dGVybiA9IHBhdHRlcm47CiAgICAgIGlmIChzdHJpbmdQYXR0ZXJuLmlzRW1wdHkpIHsKICAgICAgICByZXR1cm4gX3NwbGl0TWFwSm9pbkVtcHR5U3RyaW5nKG9uTWF0Y2gsIG9uTm9uTWF0Y2gpOwogICAgICB9CiAgICB9CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgaW50IHN0YXJ0SW5kZXggPSAwOwogICAgZm9yIChNYXRjaCBtYXRjaCBpbiBwYXR0ZXJuLmFsbE1hdGNoZXModGhpcykpIHsKICAgICAgYnVmZmVyLndyaXRlKG9uTm9uTWF0Y2godGhpcy5zdWJzdHJpbmcoc3RhcnRJbmRleCwgbWF0Y2guc3RhcnQpKSk7CiAgICAgIGJ1ZmZlci53cml0ZShvbk1hdGNoKG1hdGNoKS50b1N0cmluZygpKTsKICAgICAgc3RhcnRJbmRleCA9IG1hdGNoLmVuZDsKICAgIH0KICAgIGJ1ZmZlci53cml0ZShvbk5vbk1hdGNoKHRoaXMuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpKSk7CiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgfQoKICAvLyBDb252ZXJ0IHNpbmdsZSBvYmplY3QgdG8gc3RyaW5nLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBTdHJpbmcgX2ludGVycG9sYXRlU2luZ2xlKE9iamVjdCBvKSB7CiAgICBpZiAobyBpcyBTdHJpbmcpIHJldHVybiBvOwogICAgZmluYWwgcyA9IG8udG9TdHJpbmcoKTsKICAgIGlmIChzIGlzISBTdHJpbmcpIHsKICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iocyk7CiAgICB9CiAgICByZXR1cm4gczsKICB9CgogIC8qKgogICAqIENvbnZlcnQgYWxsIG9iamVjdHMgaW4gW3ZhbHVlc10gdG8gc3RyaW5ncyBhbmQgY29uY2F0IHRoZW0KICAgKiBpbnRvIGEgcmVzdWx0IHN0cmluZy4KICAgKiBNb2RpZmllcyB0aGUgaW5wdXQgbGlzdCBpZiBpdCBjb250YWlucyBub24tYFN0cmluZ2AgdmFsdWVzLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIHN0YXRpYyBTdHJpbmcgX2ludGVycG9sYXRlKGZpbmFsIExpc3QgdmFsdWVzKSB7CiAgICBmaW5hbCBudW1WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoOwogICAgaW50IHRvdGFsTGVuZ3RoID0gMDsKICAgIGludCBpID0gMDsKICAgIHdoaWxlIChpIDwgbnVtVmFsdWVzKSB7CiAgICAgIGZpbmFsIGUgPSB2YWx1ZXNbaV07CiAgICAgIGZpbmFsIHMgPSBlLnRvU3RyaW5nKCk7CiAgICAgIHZhbHVlc1tpXSA9IHM7CiAgICAgIGlmIChDbGFzc0lELmdldElEKHMpID09IENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZykgewogICAgICAgIHRvdGFsTGVuZ3RoICs9IHMubGVuZ3RoOwogICAgICAgIGkrKzsKICAgICAgfSBlbHNlIGlmIChzIGlzISBTdHJpbmcpIHsKICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBIYW5kbGUgcmVtYWluaW5nIGVsZW1lbnRzIHdpdGhvdXQgY2hlY2tpbmcgZm9yIG9uZS1ieXRlLW5lc3MuCiAgICAgICAgd2hpbGUgKCsraSA8IG51bVZhbHVlcykgewogICAgICAgICAgZmluYWwgZSA9IHZhbHVlc1tpXTsKICAgICAgICAgIGZpbmFsIHMgPSBlLnRvU3RyaW5nKCk7CiAgICAgICAgICB2YWx1ZXNbaV0gPSBzOwogICAgICAgICAgaWYgKHMgaXMhIFN0cmluZykgewogICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9jb25jYXRSYW5nZU5hdGl2ZSh2YWx1ZXMsIDAsIG51bVZhbHVlcyk7CiAgICAgIH0KICAgIH0KICAgIC8vIEFsbCBzdHJpbmdzIHdlcmUgb25lLWJ5dGUgc3RyaW5ncy4KICAgIHJldHVybiBfT25lQnl0ZVN0cmluZy5fY29uY2F0QWxsKHZhbHVlcywgdG90YWxMZW5ndGgpOwogIH0KCiAgSXRlcmFibGU8TWF0Y2g+IGFsbE1hdGNoZXMoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDBdKSB7CiAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID4gc3RyaW5nLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgc3RyaW5nLmxlbmd0aCwgInN0YXJ0Iik7CiAgICB9CiAgICByZXR1cm4gbmV3IF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUoc3RyaW5nLCB0aGlzLCBzdGFydCk7CiAgfQoKICBNYXRjaCBtYXRjaEFzUHJlZml4KFN0cmluZyBzdHJpbmcsIFtpbnQgc3RhcnQgPSAwXSkgewogICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+IHN0cmluZy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIHN0cmluZy5sZW5ndGgpOwogICAgfQogICAgaWYgKHN0YXJ0ICsgdGhpcy5sZW5ndGggPiBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoc3RyaW5nLmNvZGVVbml0QXQoc3RhcnQgKyBpKSAhPSB0aGlzLmNvZGVVbml0QXQoaSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBfU3RyaW5nTWF0Y2goc3RhcnQsIHN0cmluZywgdGhpcyk7CiAgfQoKICBMaXN0PFN0cmluZz4gc3BsaXQoUGF0dGVybiBwYXR0ZXJuKSB7CiAgICBpZiAoKHBhdHRlcm4gaXMgU3RyaW5nKSAmJiBwYXR0ZXJuLmlzRW1wdHkpIHsKICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBMaXN0PFN0cmluZz4odGhpcy5sZW5ndGgpOwogICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgICByZXN1bHRbaV0gPSB0aGlzW2ldOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBhdHRlcm4uYWxsTWF0Y2hlcyh0aGlzKS5pdGVyYXRvcjsKICAgIGlmIChsZW5ndGggPT0gMCAmJiBpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIC8vIEEgbWF0Y2hlZCBlbXB0eSBzdHJpbmcgaW5wdXQgcmV0dXJucyB0aGUgZW1wdHkgbGlzdC4KICAgICAgcmV0dXJuIDxTdHJpbmc+W107CiAgICB9CiAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IExpc3Q8U3RyaW5nPigpOwogICAgaW50IHN0YXJ0SW5kZXggPSAwOwogICAgaW50IHByZXZpb3VzSW5kZXggPSAwOwogICAgLy8gJ3BhdHRlcm4nIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5IGFuZCB0aGVyZWZvcmUgd2UgY2Fubm90CiAgICAvLyBjYWxsIF9zdWJzdHJpbmdVbmhjaGVja2VkIHVubGVzcyBpdCBpcyBhIHRydXN0d29ydGh5IHR5cGUgKGUuZy4gU3RyaW5nKS4KICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChzdGFydEluZGV4ID09IGxlbmd0aCB8fCAhaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICAgIHJlc3VsdC5hZGQodGhpcy5zdWJzdHJpbmcocHJldmlvdXNJbmRleCwgbGVuZ3RoKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgTWF0Y2ggbWF0Y2ggPSBpdGVyYXRvci5jdXJyZW50OwogICAgICBpZiAobWF0Y2guc3RhcnQgPT0gbGVuZ3RoKSB7CiAgICAgICAgcmVzdWx0LmFkZCh0aGlzLnN1YnN0cmluZyhwcmV2aW91c0luZGV4LCBsZW5ndGgpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpbnQgZW5kSW5kZXggPSBtYXRjaC5lbmQ7CiAgICAgIGlmIChzdGFydEluZGV4ID09IGVuZEluZGV4ICYmIGVuZEluZGV4ID09IHByZXZpb3VzSW5kZXgpIHsKICAgICAgICArK3N0YXJ0SW5kZXg7IC8vIGVtcHR5IG1hdGNoLCBhZHZhbmNlIGFuZCByZXN0YXJ0CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmVzdWx0LmFkZCh0aGlzLnN1YnN0cmluZyhwcmV2aW91c0luZGV4LCBtYXRjaC5zdGFydCkpOwogICAgICBzdGFydEluZGV4ID0gcHJldmlvdXNJbmRleCA9IGVuZEluZGV4OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIExpc3Q8aW50PiBnZXQgY29kZVVuaXRzID0+IG5ldyBDb2RlVW5pdHModGhpcyk7CgogIFJ1bmVzIGdldCBydW5lcyA9PiBuZXcgUnVuZXModGhpcyk7CgogIFN0cmluZyB0b1VwcGVyQ2FzZSgpIG5hdGl2ZSAiU3RyaW5nX3RvVXBwZXJDYXNlIjsKCiAgU3RyaW5nIHRvTG93ZXJDYXNlKCkgbmF0aXZlICJTdHJpbmdfdG9Mb3dlckNhc2UiOwoKICAvLyBDb25jYXRlbmF0ZSBbJ3N0YXJ0JywgJ2VuZCdbIGVsZW1lbnRzIG9mICdzdHJpbmdzJy4KICBzdGF0aWMgU3RyaW5nIF9jb25jYXRSYW5nZShMaXN0PFN0cmluZz4gc3RyaW5ncywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBpZiAoKGVuZCAtIHN0YXJ0KSA9PSAxKSB7CiAgICAgIHJldHVybiBzdHJpbmdzW3N0YXJ0XTsKICAgIH0KICAgIHJldHVybiBfY29uY2F0UmFuZ2VOYXRpdmUoc3RyaW5ncywgc3RhcnQsIGVuZCk7CiAgfQoKICAvLyBDYWxsIHRoaXMgbWV0aG9kIGlmIGFsbCBlbGVtZW50cyBvZiBbc3RyaW5nc10gYXJlIGtub3duIHRvIGJlIHN0cmluZ3MKICAvLyBidXQgbm90IGFsbCBhcmUga25vd24gdG8gYmUgT25lQnl0ZVN0cmluZyhzKS4KICBzdGF0aWMgU3RyaW5nIF9jb25jYXRSYW5nZU5hdGl2ZShMaXN0IHN0cmluZ3MsIGludCBzdGFydCwgaW50IGVuZCkKICAgICAgbmF0aXZlICJTdHJpbmdfY29uY2F0UmFuZ2UiOwp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9PbmVCeXRlU3RyaW5nIGV4dGVuZHMgX1N0cmluZ0Jhc2UgewogIGZhY3RvcnkgX09uZUJ5dGVTdHJpbmcuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgIl9PbmVCeXRlU3RyaW5nIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk0iKTsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiU3RyaW5nX2dldEhhc2hDb2RlIjsKCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBjb2RlVW5pdEF0KGludCBpbmRleCkgbmF0aXZlICJTdHJpbmdfY29kZVVuaXRBdCI7CgogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIHJldHVybiBfU3RyaW5nQmFzZS5faXNPbmVCeXRlV2hpdGVzcGFjZShjb2RlVW5pdCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsIGJvb2wpCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBzdXBlciA9PSBvdGhlcjsKICB9CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX09uZUJ5dGVTdHJpbmcpCiAgU3RyaW5nIF9zdWJzdHJpbmdVbmNoZWNrZWROYXRpdmUoaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKICAgICAgbmF0aXZlICJPbmVCeXRlU3RyaW5nX3N1YnN0cmluZ1VuY2hlY2tlZCI7CgogIExpc3Q8U3RyaW5nPiBfc3BsaXRXaXRoQ2hhckNvZGUoaW50IGNoYXJDb2RlKQogICAgICBuYXRpdmUgIk9uZUJ5dGVTdHJpbmdfc3BsaXRXaXRoQ2hhckNvZGUiOwoKICBMaXN0PFN0cmluZz4gc3BsaXQoUGF0dGVybiBwYXR0ZXJuKSB7CiAgICAvLyBUT0RPKHZlZ29yb3YpIGludmVzdGlnYXRlIGlmIHRoaXMgY2FuIGJlIHJld3JpdHRlbiBhcyBgaXMgX09uZUJ5dGVTdHJpbmdgCiAgICAvLyBjaGVjayB3aXRob3V0IHBlcmZvcm1hbmNlIHBlbmFsdHkuIEZyb250LWVuZCB3b3VsZCB0aGVuIHByb21vdGUKICAgIC8vIHBhdHRlcm4gdmFyaWFibGUgdG8gX09uZUJ5dGVTdHJpbmcuCiAgICBpZiAoQ2xhc3NJRC5nZXRJRChwYXR0ZXJuKSA9PSBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpIHsKICAgICAgZmluYWwgU3RyaW5nIHBhdHRlcm5Bc1N0cmluZyA9IHBhdHRlcm47CiAgICAgIGlmIChwYXR0ZXJuQXNTdHJpbmcubGVuZ3RoID09IDEpIHsKICAgICAgICByZXR1cm4gX3NwbGl0V2l0aENoYXJDb2RlKHBhdHRlcm5Bc1N0cmluZy5jb2RlVW5pdEF0KDApKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLnNwbGl0KHBhdHRlcm4pOwogIH0KCiAgLy8gQWxsIGVsZW1lbnQgb2YgJ3N0cmluZ3MnIG11c3QgYmUgT25lQnl0ZVN0cmluZ3MuCiAgc3RhdGljIF9jb25jYXRBbGwoTGlzdCBzdHJpbmdzLCBpbnQgdG90YWxMZW5ndGgpIHsKICAgIGlmICh0b3RhbExlbmd0aCA+IDEyOCkgewogICAgICAvLyBOYXRpdmUgaXMgcXVpY2tlci4KICAgICAgcmV0dXJuIF9TdHJpbmdCYXNlLl9jb25jYXRSYW5nZU5hdGl2ZShzdHJpbmdzLCAwLCBzdHJpbmdzLmxlbmd0aCk7CiAgICB9CiAgICBmaW5hbCByZXMgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUodG90YWxMZW5ndGgpOwogICAgZmluYWwgc3RyaW5nc0xlbmd0aCA9IHN0cmluZ3MubGVuZ3RoOwogICAgaW50IHJJeCA9IDA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3NMZW5ndGg7IGkrKykgewogICAgICBmaW5hbCBfT25lQnl0ZVN0cmluZyBlID0gc3RyaW5nc1tpXTsKICAgICAgZmluYWwgZUxlbmd0aCA9IGUubGVuZ3RoOwogICAgICBmb3IgKGludCBzID0gMDsgcyA8IGVMZW5ndGg7IHMrKykgewogICAgICAgIHJlcy5fc2V0QXQockl4KyssIGUuY29kZVVuaXRBdChzKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXM7CiAgfQoKICBpbnQgaW5kZXhPZihQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnQgPSAwXSkgewogICAgLy8gU3BlY2lhbGl6ZSBmb3Igc2luZ2xlIGNoYXJhY3RlciBwYXR0ZXJuLgogICAgZmluYWwgcENpZCA9IENsYXNzSUQuZ2V0SUQocGF0dGVybik7CiAgICBpZiAoKHBDaWQgPT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nKSB8fAogICAgICAgIChwQ2lkID09IENsYXNzSUQuY2lkVHdvQnl0ZVN0cmluZykgfHwKICAgICAgICAocENpZCA9PSBDbGFzc0lELmNpZEV4dGVybmFsT25lQnl0ZVN0cmluZykpIHsKICAgICAgZmluYWwgU3RyaW5nIHBhdHRlcm5Bc1N0cmluZyA9IHBhdHRlcm47CiAgICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAoKHBhdHRlcm5Bc1N0cmluZy5sZW5ndGggPT0gMSkgJiYgKHN0YXJ0ID49IDApICYmIChzdGFydCA8IGxlbikpIHsKICAgICAgICBmaW5hbCBwYXR0ZXJuQ3UwID0gcGF0dGVybkFzU3RyaW5nLmNvZGVVbml0QXQoMCk7CiAgICAgICAgaWYgKHBhdHRlcm5DdTAgPiAweEZGKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBpZiAodGhpcy5jb2RlVW5pdEF0KGkpID09IHBhdHRlcm5DdTApIHsKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmluZGV4T2YocGF0dGVybiwgc3RhcnQpOwogIH0KCiAgYm9vbCBjb250YWlucyhQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgc3RhcnQgPSAwXSkgewogICAgZmluYWwgcENpZCA9IENsYXNzSUQuZ2V0SUQocGF0dGVybik7CiAgICBpZiAoKHBDaWQgPT0gQ2xhc3NJRC5jaWRPbmVCeXRlU3RyaW5nKSB8fAogICAgICAgIChwQ2lkID09IENsYXNzSUQuY2lkVHdvQnl0ZVN0cmluZykgfHwKICAgICAgICAocENpZCA9PSBDbGFzc0lELmNpZEV4dGVybmFsT25lQnl0ZVN0cmluZykpIHsKICAgICAgZmluYWwgU3RyaW5nIHBhdHRlcm5Bc1N0cmluZyA9IHBhdHRlcm47CiAgICAgIGZpbmFsIGxlbiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAoKHBhdHRlcm5Bc1N0cmluZy5sZW5ndGggPT0gMSkgJiYgKHN0YXJ0ID49IDApICYmIChzdGFydCA8IGxlbikpIHsKICAgICAgICBmaW5hbCBwYXR0ZXJuQ3UwID0gcGF0dGVybkFzU3RyaW5nLmNvZGVVbml0QXQoMCk7CiAgICAgICAgaWYgKHBhdHRlcm5DdTAgPiAweEZGKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBpZiAodGhpcy5jb2RlVW5pdEF0KGkpID09IHBhdHRlcm5DdTApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zKHBhdHRlcm4sIHN0YXJ0KTsKICB9CgogIFN0cmluZyBvcGVyYXRvciAqKGludCB0aW1lcykgewogICAgaWYgKHRpbWVzIDw9IDApIHJldHVybiAiIjsKICAgIGlmICh0aW1lcyA9PSAxKSByZXR1cm4gdGhpczsKICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiB0aGlzOyAvLyBEb24ndCBjbG9uZSBlbXB0eSBzdHJpbmcuCiAgICBfT25lQnl0ZVN0cmluZyByZXN1bHQgPSBfT25lQnl0ZVN0cmluZy5fYWxsb2NhdGUobGVuZ3RoICogdGltZXMpOwogICAgaW50IGluZGV4ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewogICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCB0aGlzLmNvZGVVbml0QXQoaikpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHBhZExlZnQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKSB7CiAgICBpbnQgcGFkQ2lkID0gQ2xhc3NJRC5nZXRJRChwYWRkaW5nKTsKICAgIGlmICgocGFkQ2lkICE9IENsYXNzSUQuY2lkT25lQnl0ZVN0cmluZykgJiYKICAgICAgICAocGFkQ2lkICE9IENsYXNzSUQuY2lkRXh0ZXJuYWxPbmVCeXRlU3RyaW5nKSkgewogICAgICByZXR1cm4gc3VwZXIucGFkTGVmdCh3aWR0aCwgcGFkZGluZyk7CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICBpbnQgZGVsdGEgPSB3aWR0aCAtIGxlbmd0aDsKICAgIGlmIChkZWx0YSA8PSAwKSByZXR1cm4gdGhpczsKICAgIGludCBwYWRMZW5ndGggPSBwYWRkaW5nLmxlbmd0aDsKICAgIGludCByZXN1bHRMZW5ndGggPSBwYWRMZW5ndGggKiBkZWx0YSArIGxlbmd0aDsKICAgIF9PbmVCeXRlU3RyaW5nIHJlc3VsdCA9IF9PbmVCeXRlU3RyaW5nLl9hbGxvY2F0ZShyZXN1bHRMZW5ndGgpOwogICAgaW50IGluZGV4ID0gMDsKICAgIGlmIChwYWRMZW5ndGggPT0gMSkgewogICAgICBpbnQgcGFkQ2hhciA9IHBhZGRpbmcuY29kZVVuaXRBdCgwKTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCBwYWRDaGFyKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYWRMZW5ndGg7IGorKykgewogICAgICAgICAgcmVzdWx0Ll9zZXRBdChpbmRleCsrLCBwYWRkaW5nLmNvZGVVbml0QXQoaikpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHQuX3NldEF0KGluZGV4KyssIHRoaXMuY29kZVVuaXRBdChpKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgU3RyaW5nIHBhZFJpZ2h0KGludCB3aWR0aCwgW1N0cmluZyBwYWRkaW5nID0gJyAnXSkgewogICAgaW50IHBhZENpZCA9IENsYXNzSUQuZ2V0SUQocGFkZGluZyk7CiAgICBpZiAoKHBhZENpZCAhPSBDbGFzc0lELmNpZE9uZUJ5dGVTdHJpbmcpICYmCiAgICAgICAgKHBhZENpZCAhPSBDbGFzc0lELmNpZEV4dGVybmFsT25lQnl0ZVN0cmluZykpIHsKICAgICAgcmV0dXJuIHN1cGVyLnBhZFJpZ2h0KHdpZHRoLCBwYWRkaW5nKTsKICAgIH0KICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIGludCBkZWx0YSA9IHdpZHRoIC0gbGVuZ3RoOwogICAgaWYgKGRlbHRhIDw9IDApIHJldHVybiB0aGlzOwogICAgaW50IHBhZExlbmd0aCA9IHBhZGRpbmcubGVuZ3RoOwogICAgaW50IHJlc3VsdExlbmd0aCA9IGxlbmd0aCArIHBhZExlbmd0aCAqIGRlbHRhOwogICAgX09uZUJ5dGVTdHJpbmcgcmVzdWx0ID0gX09uZUJ5dGVTdHJpbmcuX2FsbG9jYXRlKHJlc3VsdExlbmd0aCk7CiAgICBpbnQgaW5kZXggPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICByZXN1bHQuX3NldEF0KGluZGV4KyssIHRoaXMuY29kZVVuaXRBdChpKSk7CiAgICB9CiAgICBpZiAocGFkTGVuZ3RoID09IDEpIHsKICAgICAgaW50IHBhZENoYXIgPSBwYWRkaW5nLmNvZGVVbml0QXQoMCk7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgrKywgcGFkQ2hhcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFkTGVuZ3RoOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5fc2V0QXQoaW5kZXgrKywgcGFkZGluZy5jb2RlVW5pdEF0KGopKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBMb3dlci1jYXNlIGNvbnZlcnNpb24gdGFibGUgZm9yIExhdGluLTEgYXMgc3RyaW5nLgogIC8vIFVwcGVyLWNhc2UgcmFuZ2VzOiAweDQxLTB4NWEgKCdBJyAtICdaJyksIDB4YzAtMHhkNiwgMHhkOC0weGRlLgogIC8vIENvbnZlcnNpb24gdG8gbG93ZXIgY2FzZSBwZXJmb3JtZWQgYnkgYWRkaW5nIDB4MjAuCiAgc3RhdGljIGNvbnN0IF9MQ19UQUJMRSA9CiAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgogICAgICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKICAgICAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3XHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCiAgICAgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzN1x4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgogICAgICAiXHg0MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjdceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKICAgICAgIlx4NzBceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3XHg3OFx4NzlceDdhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCiAgICAgICJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2N1x4NjhceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmIgogICAgICAiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzdceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKICAgICAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3XHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCiAgICAgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5N1x4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgogICAgICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTdceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKICAgICAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3XHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCiAgICAgICJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlN1x4ZThceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmIgogICAgICAiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZDdceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhkZiIKICAgICAgIlx4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3XHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCiAgICAgICJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmN1x4ZjhceGY5XHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmIjsKCiAgLy8gVXBwZXItY2FzZSBjb252ZXJzaW9uIHRhYmxlIGZvciBMYXRpbi0xIGFzIHN0cmluZy4KICAvLyBMb3dlci1jYXNlIHJhbmdlczogMHg2MS0weDdhICgnYScgLSAneicpLCAweGUwLTB4ZmYuCiAgLy8gVGhlIGNoYXJhY3RlcnMgMHhiNSAowrUpIGFuZCAweGZmICjDvykgaGF2ZSB1cHBlciBjYXNlIHZhcmlhbnRzCiAgLy8gdGhhdCBhcmUgbm90IExhdGluLTEuIFRoZXNlIGFyZSBib3RoIG1hcmtlZCBhcyAweDAwIGluIHRoZSB0YWJsZS4KICAvLyBUaGUgR2VybWFuICJzaGFycCBzIiBceGRmICjDnykgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIHR3byBjaGFyYWN0ZXJzIChTUyksCiAgLy8gYW5kIGlzIGFsc28gbWFya2VkIHdpdGggMHgwMC4KICAvLyBDb252ZXJzaW9uIHRvIGxvd2VyIGNhc2UgcGVyZm9ybWVkIGJ5IHN1YnRyYWN0aW5nIDB4MjAuCiAgc3RhdGljIGNvbnN0IF9VQ19UQUJMRSA9CiAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgogICAgICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKICAgICAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3XHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCiAgICAgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzN1x4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgogICAgICAiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDdceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKICAgICAgIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3XHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCiAgICAgICJceDYwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0N1x4NDhceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmIgogICAgICAiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTdceDU4XHg1OVx4NWFceDdiXHg3Y1x4N2RceDdlXHg3ZiIKICAgICAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3XHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCiAgICAgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5N1x4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgogICAgICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTdceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKICAgICAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHgwMFx4YjZceGI3XHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCiAgICAgICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjN1x4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIgogICAgICAiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDdceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHgwMCIKICAgICAgIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3XHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCiAgICAgICJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhmN1x4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceDAwIjsKCiAgU3RyaW5nIHRvTG93ZXJDYXNlKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZpbmFsIGMgPSB0aGlzLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjID09IF9MQ19UQUJMRS5jb2RlVW5pdEF0KGMpKSBjb250aW51ZTsKICAgICAgLy8gVXBwZXItY2FzZSBjaGFyYWN0ZXIgZm91bmQuCiAgICAgIGZpbmFsIHJlc3VsdCA9IF9hbGxvY2F0ZSh0aGlzLmxlbmd0aCk7CiAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChqLCB0aGlzLmNvZGVVbml0QXQoaikpOwogICAgICB9CiAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgdGhpcy5sZW5ndGg7IGorKykgewogICAgICAgIHJlc3VsdC5fc2V0QXQoaiwgX0xDX1RBQkxFLmNvZGVVbml0QXQodGhpcy5jb2RlVW5pdEF0KGopKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgU3RyaW5nIHRvVXBwZXJDYXNlKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZpbmFsIGMgPSB0aGlzLmNvZGVVbml0QXQoaSk7CiAgICAgIC8vIENvbnRpbnVlIGxvb3AgaWYgY2hhcmFjdGVyIGlzIHVuY2hhbmdlZCBieSB1cHBlci1jYXNlIGNvbnZlcnNpb24uCiAgICAgIGlmIChjID09IF9VQ19UQUJMRS5jb2RlVW5pdEF0KGMpKSBjb250aW51ZTsKCiAgICAgIC8vIENoZWNrIHJlc3Qgb2Ygc3RyaW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgZG8gbm90IGNvbnZlcnQgdG8KICAgICAgLy8gc2luZ2xlLWNoYXJhY3RlcnMgaW4gdGhlIExhdGluLTEgcmFuZ2UuCiAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgdGhpcy5sZW5ndGg7IGorKykgewogICAgICAgIGZpbmFsIGMgPSB0aGlzLmNvZGVVbml0QXQoaik7CiAgICAgICAgaWYgKChfVUNfVEFCTEUuY29kZVVuaXRBdChjKSA9PSAweDAwKSAmJiAoYyAhPSAweDAwKSkgewogICAgICAgICAgLy8gV2UgdXNlIHRoZSAweDAwIHZhbHVlIGZvciBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gdGhlIG51bGwgY2hhcmFjdGVyLAogICAgICAgICAgLy8gdGhhdCBkb24ndCBjb252ZXJ0IHRvIGEgc2luZ2xlIExhdGluLTEgY2hhcmFjdGVyIHdoZW4gdXBwZXItY2FzZWQuCiAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIGNhbGwgdGhlIGdlbmVyaWMgc3VwZXItY2xhc3MgbWV0aG9kLgogICAgICAgICAgcmV0dXJuIHN1cGVyLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFNvbWUgbG93ZXItY2FzZSBjaGFyYWN0ZXJzIGZvdW5kLCBidXQgYWxsIHVwcGVyLWNhc2UgdG8gc2luZ2xlIExhdGluLTEKICAgICAgLy8gY2hhcmFjdGVycy4KICAgICAgZmluYWwgcmVzdWx0ID0gX2FsbG9jYXRlKHRoaXMubGVuZ3RoKTsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKICAgICAgICByZXN1bHQuX3NldEF0KGosIHRoaXMuY29kZVVuaXRBdChqKSk7CiAgICAgIH0KICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCB0aGlzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgcmVzdWx0Ll9zZXRBdChqLCBfVUNfVEFCTEUuY29kZVVuaXRBdCh0aGlzLmNvZGVVbml0QXQoaikpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICAvLyBBbGxvY2F0ZXMgYSBzdHJpbmcgb2YgZ2l2ZW4gbGVuZ3RoLCBleHBlY3RpbmcgaXRzIGNvbnRlbnQgdG8gYmUKICAvLyBzZXQgdXNpbmcgX3NldEF0LgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgX09uZUJ5dGVTdHJpbmcpCiAgc3RhdGljIF9PbmVCeXRlU3RyaW5nIF9hbGxvY2F0ZShpbnQgbGVuZ3RoKSBuYXRpdmUgIk9uZUJ5dGVTdHJpbmdfYWxsb2NhdGUiOwoKICBzdGF0aWMgX09uZUJ5dGVTdHJpbmcgX2FsbG9jYXRlRnJvbU9uZUJ5dGVMaXN0KExpc3Q8aW50PiBsaXN0LCBpbnQgc3RhcnQsCiAgICAgIGludCBlbmQpIG5hdGl2ZSAiT25lQnl0ZVN0cmluZ19hbGxvY2F0ZUZyb21PbmVCeXRlTGlzdCI7CgogIC8vIFRoaXMgaXMgaW50ZXJuYWwgaGVscGVyIG1ldGhvZC4gQ29kZSBwb2ludCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQKICAvLyBMYXRpbjEgdmFsdWUgKDAuLjB4RkYpLCBpbmRleCBtdXN0IGJlIHZhbGlkLgogIHZvaWQgX3NldEF0KGludCBpbmRleCwgaW50IGNvZGVQb2ludCkgbmF0aXZlICJPbmVCeXRlU3RyaW5nX3NldEF0IjsKCiAgLy8gU2hvdWxkIGJlIG9wdGltaXphYmxlIHRvIGEgbWVtb3J5IG1vdmUuCiAgLy8gQWNjZXB0cyBib3RoIF9PbmVCeXRlU3RyaW5nIGFuZCBfRXh0ZXJuYWxPbmVCeXRlU3RyaW5nIGFzIGFyZ3VtZW50LgogIC8vIFJldHVybnMgaW5kZXggYWZ0ZXIgbGFzdCBjaGFyYWN0ZXIgd3JpdHRlbi4KICBpbnQgX3NldFJhbmdlKGludCBpbmRleCwgU3RyaW5nIG9uZUJ5dGVTdHJpbmcsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgYXNzZXJ0KG9uZUJ5dGVTdHJpbmcuX2lzT25lQnl0ZSk7CiAgICBhc3NlcnQoMCA8PSBzdGFydCk7CiAgICBhc3NlcnQoc3RhcnQgPD0gZW5kKTsKICAgIGFzc2VydChlbmQgPD0gb25lQnl0ZVN0cmluZy5sZW5ndGgpOwogICAgYXNzZXJ0KDAgPD0gaW5kZXgpOwogICAgYXNzZXJ0KGluZGV4ICsgKGVuZCAtIHN0YXJ0KSA8PSBsZW5ndGgpOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgX3NldEF0KGluZGV4LCBvbmVCeXRlU3RyaW5nLmNvZGVVbml0QXQoaSkpOwogICAgICBpbmRleCArPSAxOwogICAgfQogICAgcmV0dXJuIGluZGV4OwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHdvQnl0ZVN0cmluZyBleHRlbmRzIF9TdHJpbmdCYXNlIHsKICBmYWN0b3J5IF9Ud29CeXRlU3RyaW5nLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJfVHdvQnl0ZVN0cmluZyBjYW4gb25seSBiZSBhbGxvY2F0ZWQgYnkgdGhlIFZNIik7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9hbGxvY2F0ZUZyb21Ud29CeXRlTGlzdChMaXN0PGludD4gbGlzdCwgaW50IHN0YXJ0LCBpbnQgZW5kKQogICAgICBuYXRpdmUgIlR3b0J5dGVTdHJpbmdfYWxsb2NhdGVGcm9tVHdvQnl0ZUxpc3QiOwoKICBib29sIF9pc1doaXRlc3BhY2UoaW50IGNvZGVVbml0KSB7CiAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2lzVHdvQnl0ZVdoaXRlc3BhY2UoY29kZVVuaXQpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBjb2RlVW5pdEF0KGludCBpbmRleCkgbmF0aXZlICJTdHJpbmdfY29kZVVuaXRBdCI7CgogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgcmV0dXJuIHN1cGVyID09IG90aGVyOwogIH0KfQoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfRXh0ZXJuYWxPbmVCeXRlU3RyaW5nIGV4dGVuZHMgX1N0cmluZ0Jhc2UgewogIGZhY3RvcnkgX0V4dGVybmFsT25lQnl0ZVN0cmluZy5fdW5pbnN0YW50aWFibGUoKSB7CiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAiX0V4dGVybmFsT25lQnl0ZVN0cmluZyBjYW4gb25seSBiZSBhbGxvY2F0ZWQgYnkgdGhlIFZNIik7CiAgfQoKICBib29sIF9pc1doaXRlc3BhY2UoaW50IGNvZGVVbml0KSB7CiAgICByZXR1cm4gX1N0cmluZ0Jhc2UuX2lzT25lQnl0ZVdoaXRlc3BhY2UoY29kZVVuaXQpOwogIH0KCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCAiZGFydDpjb3JlI19TbWkiKQogIGludCBjb2RlVW5pdEF0KGludCBpbmRleCkgbmF0aXZlICJTdHJpbmdfY29kZVVuaXRBdCI7CgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKSB7CiAgICByZXR1cm4gc3VwZXIgPT0gb3RoZXI7CiAgfQp9CgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCmNsYXNzIF9FeHRlcm5hbFR3b0J5dGVTdHJpbmcgZXh0ZW5kcyBfU3RyaW5nQmFzZSB7CiAgZmFjdG9yeSBfRXh0ZXJuYWxUd29CeXRlU3RyaW5nLl91bmluc3RhbnRpYWJsZSgpIHsKICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICJfRXh0ZXJuYWxUd29CeXRlU3RyaW5nIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBieSB0aGUgVk0iKTsKICB9CgogIGJvb2wgX2lzV2hpdGVzcGFjZShpbnQgY29kZVVuaXQpIHsKICAgIHJldHVybiBfU3RyaW5nQmFzZS5faXNUd29CeXRlV2hpdGVzcGFjZShjb2RlVW5pdCk7CiAgfQoKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCiAgaW50IGNvZGVVbml0QXQoaW50IGluZGV4KSBuYXRpdmUgIlN0cmluZ19jb2RlVW5pdEF0IjsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIHJldHVybiBzdXBlciA9PSBvdGhlcjsKICB9Cn0KCmNsYXNzIF9TdHJpbmdNYXRjaCBpbXBsZW1lbnRzIE1hdGNoIHsKICBjb25zdCBfU3RyaW5nTWF0Y2godGhpcy5zdGFydCwgdGhpcy5pbnB1dCwgdGhpcy5wYXR0ZXJuKTsKCiAgaW50IGdldCBlbmQgPT4gc3RhcnQgKyBwYXR0ZXJuLmxlbmd0aDsKICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGcpID0+IGdyb3VwKGcpOwogIGludCBnZXQgZ3JvdXBDb3VudCA9PiAwOwoKICBTdHJpbmcgZ3JvdXAoaW50IGdyb3VwKSB7CiAgICBpZiAoZ3JvdXAgIT0gMCkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci52YWx1ZShncm91cCk7CiAgICB9CiAgICByZXR1cm4gcGF0dGVybjsKICB9CgogIExpc3Q8U3RyaW5nPiBncm91cHMoTGlzdDxpbnQ+IGdyb3VwcykgewogICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKICAgIGZvciAoaW50IGcgaW4gZ3JvdXBzKSB7CiAgICAgIHJlc3VsdC5hZGQoZ3JvdXAoZykpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZpbmFsIGludCBzdGFydDsKICBmaW5hbCBTdHJpbmcgaW5wdXQ7CiAgZmluYWwgU3RyaW5nIHBhdHRlcm47Cn0KCmNsYXNzIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUgZXh0ZW5kcyBJdGVyYWJsZTxNYXRjaD4gewogIGZpbmFsIFN0cmluZyBfaW5wdXQ7CiAgZmluYWwgU3RyaW5nIF9wYXR0ZXJuOwogIGZpbmFsIGludCBfaW5kZXg7CgogIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGUodGhpcy5faW5wdXQsIHRoaXMuX3BhdHRlcm4sIHRoaXMuX2luZGV4KTsKCiAgSXRlcmF0b3I8TWF0Y2g+IGdldCBpdGVyYXRvciA9PgogICAgICBuZXcgX1N0cmluZ0FsbE1hdGNoZXNJdGVyYXRvcihfaW5wdXQsIF9wYXR0ZXJuLCBfaW5kZXgpOwoKICBNYXRjaCBnZXQgZmlyc3QgewogICAgaW50IGluZGV4ID0gX2lucHV0LmluZGV4T2YoX3BhdHRlcm4sIF9pbmRleCk7CiAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICByZXR1cm4gbmV3IF9TdHJpbmdNYXRjaChpbmRleCwgX2lucHV0LCBfcGF0dGVybik7CiAgICB9CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9Cn0KCmNsYXNzIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxNYXRjaD4gewogIGZpbmFsIFN0cmluZyBfaW5wdXQ7CiAgZmluYWwgU3RyaW5nIF9wYXR0ZXJuOwogIGludCBfaW5kZXg7CiAgTWF0Y2ggX2N1cnJlbnQ7CgogIF9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3IodGhpcy5faW5wdXQsIHRoaXMuX3Bh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GikYLSgyEgYSBAIBGistIDsEAU02ASU3BAE0OAEoIxsEAgEaMzUgQwQBJTcEATQ4ASMbBAIBGjM1IEMEASU3BAE0OAEjGwQCASY8ASkpGwEcFikGFAQBKi4cHAYTBAETFhgCAToXGRQBRgEiPwEUMhY4BiwEAgE9FxkOEgFGARQ0FxQGMhUiFxQGJzo4HhIRBAEhAgEhZGFydDpjb3JlLXBhdGNoL3N0cmluZ19wYXRjaC5kYXJ0L29yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvdHlwZV9wYXRjaC5kYXJ0g1UvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vIFRoZXNlIERhcnQgY2xhc3NlcyBjb3JyZXNwb25kIHRvIHRoZSBWTSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLgoKLy8gRXF1aXZhbGVudCBvZiBSYXdBYnN0cmFjdFR5cGUuCmFic3RyYWN0IGNsYXNzIF9BYnN0cmFjdFR5cGUgaW1wbGVtZW50cyBUeXBlIHsKICBTdHJpbmcgdG9TdHJpbmcoKSBuYXRpdmUgIkFic3RyYWN0VHlwZV90b1N0cmluZyI7Cn0KCi8vIEVxdWl2YWxlbnQgb2YgUmF3VHlwZS4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHlwZSBleHRlbmRzIF9BYnN0cmFjdFR5cGUgewogIEBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgImRhcnQ6Y29yZSNfU21pIikKICBpbnQgZ2V0IGhhc2hDb2RlIG5hdGl2ZSAiVHlwZV9nZXRIYXNoQ29kZSI7Cn0KCi8vIEVxdWl2YWxlbnQgb2YgUmF3VHlwZVJlZi4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHlwZVJlZiBleHRlbmRzIF9BYnN0cmFjdFR5cGUge30KCi8vIEVxdWl2YWxlbnQgb2YgUmF3VHlwZVBhcmFtZXRlci4KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfVHlwZVBhcmFtZXRlciBleHRlbmRzIF9BYnN0cmFjdFR5cGUge30KHQBOTjwBHgFMASIvNAIBGhokNC4CAR0aKAEjGi4BH2RhcnQ6Y29yZS1wYXRjaC90eXBlX3BhdGNoLmRhcnQyb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi93ZWFrX3Byb3BlcnR5LmRhcnSCkC8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBfV2Vha1Byb3BlcnR5IHsKICBmYWN0b3J5IF9XZWFrUHJvcGVydHkoa2V5LCB2YWx1ZSkgPT4gX25ldyhrZXksIHZhbHVlKTsKCiAgZ2V0IGtleSA9PiBfZ2V0S2V5KCk7CiAgZ2V0IHZhbHVlID0+IF9nZXRWYWx1ZSgpOwogIHNldCB2YWx1ZSh2YWx1ZSkgPT4gX3NldFZhbHVlKHZhbHVlKTsKCiAgc3RhdGljIF9XZWFrUHJvcGVydHkgX25ldyhrZXksIHZhbHVlKSBuYXRpdmUgIldlYWtQcm9wZXJ0eV9uZXciOwoKICBfZ2V0S2V5KCkgbmF0aXZlICJXZWFrUHJvcGVydHlfZ2V0S2V5IjsKICBfZ2V0VmFsdWUoKSBuYXRpdmUgIldlYWtQcm9wZXJ0eV9nZXRWYWx1ZSI7CiAgX3NldFZhbHVlKHZhbHVlKSBuYXRpdmUgIldlYWtQcm9wZXJ0eV9zZXRWYWx1ZSI7Cn0KFgBOTjwBHgEaFjkBGBwoAUMBKi4zAgEiZGFydDpjb3JlLXBhdGNoL3dlYWtfcHJvcGVydHkuZGFydDFvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9hbm5vdGF0aW9ucy5kYXJ0o3MvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogVGhlIGFubm90YXRpb24gYEBEZXByZWNhdGVkKCdtaWdyYXRpb24nKWAgbWFya3MgYSBmZWF0dXJlIGFzIGRlcHJlY2F0ZWQuCiAqCiAqIFRoZSBhbm5vdGF0aW9uIFtkZXByZWNhdGVkXSBpcyBhIHNob3J0aGFuZCBmb3IgZGVwcmVjYXRpbmcgdW50aWwKICogYW4gdW5zcGVjaWZpZWQgIm5leHQgcmVsZWFzZSIgd2l0aG91dCBtaWdyYXRpb24gaW5zdHJ1Y3Rpb25zLgogKgogKiBUaGUgaW50ZW50IG9mIHRoZSBgQERlcHJlY2F0ZWRgIGFubm90YXRpb24gaXMgdG8gaW5mb3JtIHVzZXJzIG9mIGEgZmVhdHVyZQogKiB0aGF0IHRoZXkgc2hvdWxkIGNoYW5nZSB0aGVpciBjb2RlLCBldmVuIGlmIGl0IGlzIGN1cnJlbnRseSBzdGlsbCB3b3JraW5nCiAqIGNvcnJlY3RseS4KICoKICogQSBkZXByZWNhdGVkIGZlYXR1cmUgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgYXQgYSBsYXRlciB0aW1lLCBwb3NzaWJseQogKiBzcGVjaWZpZWQgaW4gW21lc3NhZ2VdLiBBIGRlcHJlY2F0ZWQgZmVhdHVyZSBzaG91bGQgbm90IGJlIHVzZWQsIGNvZGUgdXNpbmcKICogaXQgd2lsbCBicmVhayBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuIElmIGV4aXN0aW5nIGNvZGUgaXMgdXNpbmcgdGhlCiAqIGZlYXR1cmUgaXQgc2hvdWxkIGJlIHJld3JpdHRlbiB0byBub3QgdXNlIHRoZSBkZXByZWNhdGVkIGZlYXR1cmUuCiAqCiAqIEEgZGVwcmVjYXRlZCBmZWF0dXJlIHNob3VsZCBkb2N1bWVudCBob3cgdGhlIHNhbWUgZWZmZWN0IGNhbiBiZSBhY2hpZXZlZCBpbgogKiBbbWVzc2FnZV0sIHNvIHRoZSBwcm9ncmFtbWVyIGtub3dzIGhvdyB0byByZXdyaXRlIHRoZSBjb2RlLgogKgogKiBUaGUgYEBEZXByZWNhdGVkYCBhbm5vdGF0aW9uIGFwcGxpZXMgdG8gbGlicmFyaWVzLCB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zCiAqICh2YXJpYWJsZXMsIGdldHRlcnMsIHNldHRlcnMsIGZ1bmN0aW9ucywgY2xhc3NlcyBhbmQgdHlwZWRlZnMpLAogKiBjbGFzcy1sZXZlbCBkZWNsYXJhdGlvbnMgKHZhcmlhYmxlcywgZ2V0dGVycywgc2V0dGVycywgbWV0aG9kcywgb3BlcmF0b3JzIG9yCiAqIGNvbnN0cnVjdG9ycywgd2hldGhlciBzdGF0aWMgb3Igbm90KSwgbmFtZWQgb3B0aW9uYWwgYXJndW1lbnRzIGFuZAogKiB0cmFpbGluZyBvcHRpb25hbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCiAqCiAqIERlcHJlY2F0aW9uIGlzIHRyYW5zaXRpdmU6CiAqCiAqICAtIElmIGEgbGlicmFyeSBpcyBkZXByZWNhdGVkLCBzbyBpcyBldmVyeSBtZW1iZXIgb2YgaXQuCiAqICAtIElmIGEgY2xhc3MgaXMgZGVwcmVjYXRlZCwgc28gaXMgZXZlcnkgbWVtYmVyIG9mIGl0LgogKiAgLSBJZiBhIHZhcmlhYmxlIGlzIGRlcHJlY2F0ZWQsIHNvIGFyZSBpdHMgaW1wbGljaXQgZ2V0dGVyIGFuZCBzZXR0ZXIuCiAqCiAqCiAqIEEgdG9vbCB0aGF0IHByb2Nlc3NlcyBEYXJ0IHNvdXJjZSBjb2RlIG1heSByZXBvcnQgd2hlbjoKICoKICogLSB0aGUgY29kZSBpbXBvcnRzIGEgZGVwcmVjYXRlZCBsaWJyYXJ5LgogKiAtIHRoZSBjb2RlIGV4cG9ydHMgYSBkZXByZWNhdGVkIGxpYnJhcnksIG9yIGFueSBkZXByZWNhdGVkIG1lbWJlciBvZgogKiAgwqBhIG5vbi1kZXByZWNhdGVkIGxpYnJhcnkuCiAqIC0gdGhlIGNvZGUgcmVmZXJzIHN0YXRpY2FsbHkgdG8gYSBkZXByZWNhdGVkIGRlY2xhcmF0aW9uLgogKiAtIHRoZSBjb2RlIGR5bmFtaWNhbGx5IHVzZXMgYSBtZW1iZXIgb2YgYW4gb2JqZWN0IHdpdGggYSBzdGF0aWNhbGx5IGtub3duCiAqICAgdHlwZSwgd2hlcmUgdGhlIG1lbWJlciBpcyBkZXByZWNhdGVkIG9uIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgb2JqZWN0LgogKiAtIHRoZSBjb2RlIGR5bmFtaWNhbGx5IGNhbGxzIGEgbWV0aG9kIHdpdGggYW4gYXJndW1lbnQgd2hlcmUgdGhlCiAqICAgY29ycmVzcG9uZGluZyBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBvbiB0aGUgb2JqZWN0J3Mgc3RhdGljIHR5cGUuCiAqCiAqCiAqIElmIHRoZSBkZXByZWNhdGVkIHVzZSBpcyBpbnNpZGUgYSBsaWJyYXJ5LCBjbGFzcyBvciBtZXRob2Qgd2hpY2ggaXMgaXRzZWxmCiAqIGRlcHJlY2F0ZWQsIHRoZSB0b29sIHNob3VsZCBub3QgYm90aGVyIHRoZSB1c2VyIGFib3V0IGl0LgogKiBBIGRlcHJlY2F0ZWQgZmVhdHVyZSBpcyBleHBlY3RlZCB0byB1c2Ugb3RoZXIgZGVwcmVjYXRlZCBmZWF0dXJlcy4KICovCmNsYXNzIERlcHJlY2F0ZWQgewogIC8qKgogICAqIE1lc3NhZ2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIgd2hlbiB0aGV5IHVzZSB0aGUgZGVwcmVjYXRlZCBmZWF0dXJlLgogICAqCiAgICogVGhlIG1lc3NhZ2Ugc2hvdWxkIGV4cGxhaW4gaG93IHRvIG1pZ3JhdGUgYXdheSBmcm9tIHRoZSBmZWF0dXJlIGlmIGFuCiAgICogYWx0ZXJuYXRpdmUgaXMgYXZhaWxhYmxlLCBhbmQgd2hlbiB0aGUgZGVwcmVjYXRlZCBmZWF0dXJlIGlzIGV4cGVjdGVkIHRvIGJlCiAgICogcmVtb3ZlZC4KICAgKi8KICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgZGVwcmVjYXRpb24gYW5ub3RhdGlvbiB3aGljaCBzcGVjaWZpZXMgdGhlIG1pZ3JhdGlvbiBwYXRoIGFuZAogICAqIGV4cGlyYXRpb24gb2YgdGhlIGFubm90YXRlZCBmZWF0dXJlLgogICAqCiAgICogVGhlIFttZXNzYWdlXSBhcmd1bWVudCBzaG91bGQgYmUgcmVhZGFibGUgYnkgcHJvZ3JhbW1lcnMsIGFuZCBzaG91bGQgc3RhdGUKICAgKiBhbiBhbHRlcm5hdGl2ZSBmZWF0dXJlIChpZiBhdmFpbGFibGUpIGFzIHdlbGwgYXMgd2hlbiBhbiBhbm5vdGF0ZWQgZmVhdHVyZQogICAqIGlzIGV4cGVjdGVkIHRvIGJlIHJlbW92ZWQuCiAgICovCiAgY29uc3QgRGVwcmVjYXRlZCh0aGlzLm1lc3NhZ2UpOwoKICBARGVwcmVjYXRlZCgnVXNlIGBtZXNzYWdlYCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gRGFydCAzLjAuMCcpCiAgU3RyaW5nIGdldCBleHBpcmVzID0+IG1lc3NhZ2U7CgogIFN0cmluZyB0b1N0cmluZygpID0+ICJEZXByZWNhdGVkIGZlYXR1cmU6ICRtZXNzYWdlIjsKfQoKLyoqCiAqIE1hcmtzIGEgZmVhdHVyZSBhcyBbRGVwcmVjYXRlZF0gdW50aWwgdGhlIG5leHQgcmVsZWFzZS4KICovCmNvbnN0IERlcHJlY2F0ZWQgZGVwcmVjYXRlZCA9IERlcHJlY2F0ZWQoIm5leHQgcmVsZWFzZSIpOwoKY2xhc3MgX092ZXJyaWRlIHsKICBjb25zdCBfT3ZlcnJpZGUoKTsKfQoKLyoqCiAqIFRoZSBhbm5vdGF0aW9uIGBAb3ZlcnJpZGVgIG1hcmtzIGFuIGluc3RhbmNlIG1lbWJlciBhcyBvdmVycmlkaW5nIGEKICogc3VwZXJjbGFzcyBtZW1iZXIgd2l0aCB0aGUgc2FtZSBuYW1lLgogKgogKiBUaGUgYW5ub3RhdGlvbiBhcHBsaWVzIHRvIGluc3RhbmNlIG1ldGhvZHMsIGdldHRlcnMgYW5kIHNldHRlcnMsIGFuZCB0bwogKiBpbnN0YW5jZSBmaWVsZHMsIHdoZXJlIGl0IG1lYW5zIHRoYXQgdGhlIGltcGxpY2l0IGdldHRlciBhbmQgc2V0dGVyIG9mIHRoZQogKiBmaWVsZCBpcyBtYXJrZWQgYXMgb3ZlcnJpZGluZywgYnV0IHRoZSBmaWVsZCBpdHNlbGYgaXMgbm90LgogKgogKiBUaGUgaW50ZW50IG9mIHRoZSBgQG92ZXJyaWRlYCBub3RhdGlvbiBpcyB0byBjYXRjaCBzaXR1YXRpb25zIHdoZXJlIGEKICogc3VwZXJjbGFzcyByZW5hbWVzIGEgbWVtYmVyLCBhbmQgYW4gaW5kZXBlbmRlbnQgc3ViY2xhc3Mgd2hpY2ggdXNlZCB0bwogKiBvdmVycmlkZSB0aGUgbWVtYmVyLCBjb3VsZCBzaWxlbnRseSBjb250aW51ZSB3b3JraW5nIHVzaW5nIHRoZQogKiBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uLgogKgogKiBUaGUgZWRpdG9yLCBvciBhIHNpbWlsYXIgdG9vbCBhaW1lZCBhdCB0aGUgcHJvZ3JhbW1lciwgbWF5IHJlcG9ydCBpZiBubwogKiBkZWNsYXJhdGlvbiBvZiBhbiBhbm5vdGF0ZWQgbWVtYmVyIGlzIGluaGVyaXRlZCBieSB0aGUgY2xhc3MgZnJvbSBlaXRoZXIgYQogKiBzdXBlcmNsYXNzIG9yIGFuIGludGVyZmFjZS4KICoKICogVXNlIHRoZSBgQG92ZXJyaWRlYCBhbm5vdGF0aW9uIGp1ZGljaW91c2x5IGFuZCBvbmx5IGZvciBtZXRob2RzIHdoZXJlCiAqIHRoZSBzdXBlcmNsYXNzIGlzIG5vdCB1bmRlciB0aGUgcHJvZ3JhbW1lcidzIGNvbnRyb2wsIHRoZSBzdXBlcmNsYXNzIGlzIGluIGEKICogZGlmZmVyZW50IGxpYnJhcnkgb3IgcGFja2FnZSwgYW5kIGl0IGlzIG5vdCBjb25zaWRlcmVkIHN0YWJsZS4KICogSW4gYW55IGNhc2UsIHRoZSB1c2Ugb2YgYEBvdmVycmlkZWAgaXMgb3B0aW9uYWwuCiAqCiAqIEZvciBleGFtcGxlLCB0aGUgYW5ub3RhdGlvbiBpcyBpbnRlbnRpb25hbGx5IG5vdCB1c2VkIGluIHRoZSBEYXJ0IHBsYXRmb3JtCiAqIGxpYnJhcmllcywgc2luY2UgdGhleSBvbmx5IGRlcGVuZCBvbiB0aGVtc2VsdmVzLgogKi8KY29uc3QgT2JqZWN0IG92ZXJyaWRlID0gX092ZXJyaWRlKCk7CgovKioKICogQW4gYW5ub3RhdGlvbiBjbGFzcyB0aGF0IHdhcyB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCBvZiBEYXJ0IDIuCiAqCiAqIFNob3VsZCBub3QgYmUgdXNlZCBhbnkgbW9yZS4KICovCkBkZXByZWNhdGVkCmNsYXNzIFByb3Zpc2lvbmFsIHsKICBTdHJpbmcgZ2V0IG1lc3NhZ2UgPT4gbnVsbDsKICBjb25zdCBQcm92aXNpb25hbCh7U3RyaW5nIG1lc3NhZ2V9KTsKfQoKLyoqCiAqIEFuIGFubm90YXRpb24gdGhhdCB3YXMgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgb2YgRGFydCAyLgogKgogKiBTaG91bGQgbm90IGJlIHVzZWQgYW55IG1vcmUuCiAqLwpAZGVwcmVjYXRlZApjb25zdCBOdWxsIHByb3Zpc2lvbmFsID0gbnVsbDsKCmNsYXNzIF9Qcm94eSB7CiAgY29uc3QgX1Byb3h5KCk7Cn0KCi8qKgogKiBUaGlzIGFubm90YXRpb24gaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIERhcnQgMi4KICoKICogRGFydCAyIGhhcyBhIG1vcmUgcmVzdHJpY3RpdmUgdHlwZSBzeXN0ZW0gdGhhbiBEYXJ0IDEsIGFuZCBpdCByZXF1aXJlcwogKiBtZXRob2QgYWNjZXNzIHRvIGJlIGVpdGhlciB0aHJvdWdoIGEga25vd24gaW50ZXJmYWNlIG9yIGJ5IHVzaW5nCiAqIGR5bmFtaWMgaW52b2NhdGlvbnMuIFRoZSBvcmlnaW5hbCBpbnRlbnQgb2YgYEBwcm94eWAgKHRvIGltcGxlbWVudCBhIGNsYXNzCiAqIHRoYXQgaXNuJ3Qga25vd24gc3RhdGljYWxseSwgYXMgZG9jdW1lbnRlZCBhdCB0aGUgZW5kIG9mIHRoaXMgdGV4dCksCiAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRGFydCAyLgogKiBUbyBjb250aW51ZSB0byBwZXJmb3JtIGR5bmFtaWMgaW52b2NhdGlvbnMgb24gYW4gb2JqZWN0LAogKiBpdCBzaG91bGQgYmUgYWNjZXNzZWQgdGhyb3VnaCBhIHJlZmVyZW5jZSBvZiB0eXBlIGBkeW5hbWljYC4KICoKICogVGhlIGFubm90YXRpb24gYEBwcm94eWAgbWFya3MgYSBjbGFzcyBhcyBpbXBsZW1lbnRpbmcgbWVtYmVycyBkeW5hbWljYWxseQogKiB0aHJvdWdoIGBub1N1Y2hNZXRob2RgLgogKgogKiBUaGUgYW5ub3RhdGlvbiBhcHBsaWVzIHRvIGFueSBjbGFzcy4gSXQgaXMgaW5oZXJpdGVkIGJ5IHN1YmNsYXNzZXMgZnJvbSBib3RoCiAqIHN1cGVyY2xhc3MgYW5kIGludGVyZmFjZXMuCiAqCiAqIElmIGEgY2xhc3MgaXMgYW5ub3RhdGVkIHdpdGggYEBwcm94eWAsIG9yIGl0IGltcGxlbWVudHMgYW55IGNsYXNzIHRoYXQgaXMKICogYW5ub3RhdGVkLCB0aGVuIGFsbCBtZW1iZXIgYWNjZXNzZXMgYXJlIGFsbG93ZWQgb24gYW4gb2JqZWN0IG9mIHRoYXQgdHlwZS4KICogQXMgc3VjaCwgaXQgaXMgbm90IGEgc3RhdGljIHR5cGUgd2FybmluZyB0byBhY2Nlc3MgYW55IG1lbWJlciBvZiB0aGUgb2JqZWN0CiAqIHdoaWNoIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3MsIG9yIHRvIGNhbGwgYSBtZXRob2Qgd2l0aCBhIGRpZmZlcmVudAogKiBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGFuIGl0IGlzIGRlY2xhcmVkIHdpdGguCiAqCiAqIFRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGNoYW5nZSB3aGljaCBjbGFzc2VzIHRoZSBhbm5vdGF0ZWQgY2xhc3MgaW1wbGVtZW50cywKICogYW5kIGRvZXMgbm90IHByZXZlbnQgc3RhdGljIHdhcm5pbmdzIGZvciBhc3NpZ25pbmcgYW4gb2JqZWN0IHRvIGEgdmFyaWFibGUKICogd2l0aCBhIHN0YXRpYyB0eXBlIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgb2JqZWN0LgogKgogKiBUaGUgc3VwcHJlc3Npb24gb2Ygd2FybmluZ3Mgb25seSBhZmZlY3Qgc3RhdGljIHR5cGUgd2FybmluZ3MgYWJvdXQKICogbWVtYmVyIGFjY2Vzcy4KICogVGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgb2JqZWN0IGlzIHVuYWZmZWN0ZWQuCiAqIEl0IGlzIG5vdCBjb25zaWRlcmVkIHRvIGltcGxlbWVudCBhbnkgc3BlY2lhbCBpbnRlcmZhY2VzLAogKiBzbyBhc3NpZ25pbmcgaXQgdG8gYSB0eXBlZCB2YXJpYWJsZSBtYXkgZmFpbCBpbiBjaGVja2VkIG1vZGUsCiAqIGFuZCB0ZXN0aW5nIGl0IHdpdGggdGhlIGBpc2Agb3BlcmF0b3IKICogd2lsbCBvbmx5IHJldHVybiB0cnVlIGZvciB0eXBlcyBpdCBhY3R1YWxseSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMuCiAqIEFjY2Vzc2luZyBhIG1lbWJlciB3aGljaCBpc24ndCBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3MKICogd2lsbCBjYXVzZSB0aGUgYG5vU3VjaE1ldGhvZGAgbWV0aG9kIHRvIGJlIGNhbGxlZCBub3JtYWxseSwKICogdGhlIGBAcHJveHlgIGFubm90YXRpb24gbWVyZWx5IHN0YXRlcyB0aGUgaW50ZW50IHRvIGhhbmRsZSAoc29tZSBvZikgdGhvc2UKICogYG5vU3VjaE1ldGhvZGAgY2FsbHMgZ3JhY2VmdWxseS4KICoKICogQSBjbGFzcyB0aGF0IG1hcmtlZCBhcyBgQHByb3h5YCBzaG91bGQgb3ZlcnJpZGUgdGhlIGBub1N1Y2hNZXRob2RgCiAqIGRlY2xhcmVkIG9uIFtPYmplY3RdLgogKgogKiBUaGUgaW50ZW50IG9mIHRoZSBgQHByb3h5YCBub3RhdGlvbiBpcyB0byBjcmVhdGUgb2JqZWN0cyB0aGF0IGltcGxlbWVudCBhCiAqIHR5cGUgKG9yIG11bHRpcGxlIHR5cGVzKSB0aGF0IGFyZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLiBJZiB0aGUgdHlwZXMKICogYXJlIGtub3duIGF0IGNvbXBpbGUgdGltZSwgYSBjbGFzcyBjYW4gYmUgd3JpdHRlbiB0aGF0IGltcGxlbWVudHMgdGhlc2UKICogdHlwZXMuCiAqLwpAZGVwcmVjYXRlZApjb25zdCBPYmplY3QgcHJveHkgPSBfUHJveHkoKTsKCi8qKgogKiBBIGhpbnQgdG8gdG9vbHMuCiAqCiAqIFRvb2xzIHRoYXQgd29yayB3aXRoIERhcnQgcHJvZ3JhbXMgbWF5IGFjY2VwdCBoaW50cyB0byBndWlkZSB0aGVpciBiZWhhdmlvcgogKiBhcyBgcHJhZ21hYCBhbm5vdGF0aW9ucyBvbiBkZWNsYXJhdGlvbnMuCiAqIEVhY2ggdG9vbCBkZWNpZGVzIHdoaWNoIGhpbnRzIGl0IGFjY2VwdHMsIHdoYXQgdGhleSBtZWFuLCBhbmQgd2hldGhlciBhbmQKICogaG93IHRoZXkgYXBwbHkgdG8gc3ViLXBhcnRzIG9mIHRoZSBhbm5vdGF0ZWQgZW50aXR5LgogKgogKiBUb29scyB0aGF0IHJlY29nbml6ZSBwcmFnbWEgaGludHMgc2hvdWxkIHBpY2sgYSBwcmFnbWEgcHJlZml4IHRvIGlkZW50aWZ5CiAqIHRoZSB0b29sLiBUaGV5IHNob3VsZCByZWNvZ25pemUgYW55IGhpbnQgd2l0aCBhIFtuYW1lXSBzdGFydGluZyB3aXRoIHRoZWlyCiAqIHByZWZpeCBmb2xsb3dlZCBieSBgOmAgYXMgaWYgaXQgd2FzIGludGVuZGVkIGZvciB0aGF0IHRvb2wuIEEgaGludCB3aXRoIGEKICogcHJlZml4IGZvciBhbm90aGVyIHRvb2wgc2hvdWxkIGJlIGlnbm9yZWQgKHVubGVzcyBjb21wYXRpYmlsaXR5IHdpdGggdGhhdAogKiBvdGhlciB0b29sIGlzIGEgZ29hbCkuCiAqCiAqIEEgdG9vbCBtYXkgcmVjb2duaXplIHVucHJlZml4ZWQgbmFtZXMgYXMgd2VsbCwgaWYgdGhleSB3b3VsZCByZWNvZ25pemUgdGhhdAogKiBuYW1lIHdpdGggdGhlaXIgb3duIHByZWZpeCBpbiBmcm9udC4KICoKICogSWYgdGhlIGhpbnQgY2FuIGJlIHBhcmFtZXRlcml6ZWQsIGFuIGV4dHJhIFtvcHRpb25zXSBvYmplY3QgY2FuIGJlIGFkZGVkIGFzIHdlbGwuCiAqCiAqIEZvciBleGFtcGxlOgogKgogKiBgYGBkYXJ0CiAqIEBwcmFnbWEoJ1Rvb2w6cHJhZ21hLW5hbWUnLCBbcGFyYW0xLCBwYXJhbTIsIC4uLl0pCiAqIGNsYXNzIEZvbyB7IH0KICoKICogQHByYWdtYSgnT3RoZXJUb29sOm90aGVyLXByYWdtYScpCiAqIHZvaWQgZm9vKCkgeyB9CiAqIGBgYAogKgogKiBIZXJlIGNsYXNzIEZvbyBpcyBhbm5vdGF0ZWQgd2l0aCBhIFRvb2wgc3BlY2lmaWMgcHJhZ21hICdwcmFnbWEtbmFtZScgYW5kCiAqIGZ1bmN0aW9uIGZvbyBpcyBhbm5vdGF0ZWQgd2l0aCBhIHByYWdtYSAnb3RoZXItcHJhZ21hJyBzcGVjaWZpYyB0byBPdGhlclRvb2wuCiAqCiAqLwpAcHJhZ21hKCd2bTplbnRyeS1wb2ludCcpCmNsYXNzIHByYWdtYSB7CiAgLyoqCiAgICogVGhlIG5hbWUgb2YgdGhlIGhpbnQuCiAgICoKICAgKiBBIHN0cmluZyB0aGF0IGlzIHJlY29nbml6ZWQgYnkgb25lIG9yIG1vcmUgdG9vbHMsIG9yIHN1Y2ggYSBzdHJpbmcgcHJlZml4ZWQKICAgKiBieSBhIHRvb2wgaWRlbnRpZmllciBhbmQgYSBjb2xvbiwgd2hpY2ggaXMgb25seSByZWNvZ25pemVkIGJ5IHRoYXQKICAgKiBwYXJ0aWN1bGFyIHRvb2wuCiAgICovCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8qKiBPcHRpb25hbCBleHRyYSBkYXRhIHBhcmFtZXRlcml6aW5nIHRoZSBoaW50LiAqLwogIGZpbmFsIE9iamVjdCBvcHRpb25zOwoKICAvKiogQ3JlYXRlcyBhIGhpbnQgbmFtZWQgW25hbWVdIHdpdGggb3B0aW9uYWwgW29wdGlvbnNdLiAqLwogIGNvbnN0IGZhY3RvcnkgcHJhZ21hKFN0cmluZyBuYW1lLCBbT2JqZWN0IG9wdGlvbnNdKSA9IHByYWdtYS5fOwoKICBjb25zdCBwcmFnbWEuXyh0aGlzLm5hbWUsIFt0aGlzLm9wdGlvbnNdKTsKfQqA8gBOTjwBEwEETANEQQNOTQ4DTU9MRQNPPwNNQ1BGLAMeAzw6SgMDOwMsSB89TUxEUQMDTj1GBBMGSAVLUQ4GGAEGTCoFUFAgBiIBRiEBNwIBBDsEOgESFQIBBEcpA0tOPwNJSkIeA0tOHwNJUEI0A040BCUBBEMDIAQMFB4nAgEEPQMgBAwfAQ8SAgEEQANKRE5IHzxAA00bA1AeA01OT08yA1BONQNGEjE9QSlGOz9OJANGGQNNTUsKBAwfAQQUA08sTTgDTU5NTRoDTygDVQMQAws2EQMlEgcDTVEDBBoPBhsFUUgWBhUBNhgBPkIBLQIBGmRhcnQ6Y29yZS9hbm5vdGF0aW9ucy5kYXJ0Km9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2Jvb2wuZGFydIq9Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIFRoZSByZXNlcnZlZCB3b3JkcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZGVub3RlIG9iamVjdHMgdGhhdCBhcmUgdGhlIG9ubHkgdHdvCiAqIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgogKgogKiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQKICogYm9vbC4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgYm9vbCB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgZGVjbGFyYXRpb24gW25hbWVdLgogICAqCiAgICogVGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGRlY2xhcmF0aW9uIGlzIGB0cnVlYCBpZiB0aGUgZGVjbGFyZWQgdmFsdWUgaXMKICAgKiB0aGUgc3RyaW5nIGAidHJ1ZSJgLCBhbmQgYGZhbHNlYCBpZiB0aGUgdmFsdWUgaXMgYCJmYWxzZSJgLgogICAqCiAgICogSW4gYWxsIG90aGVyIGNhc2VzLCBpbmNsdWRpbmcgd2hlbiB0aGVyZSBpcyBubyBkZWNsYXJhdGlvbiBmb3IgYG5hbWVgLAogICAqIHRoZSByZXN1bHQgaXMgdGhlIFtkZWZhdWx0VmFsdWVdLgogICAqCiAgICogVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB3b3VsZCBiZSByZXR1cm5lZCBieToKICAgKiBgYGBkYXJ0CiAgICogKGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQobmFtZSkgPT0gInRydWUiKQogICAqICAgICA/IHRydWUKICAgKiAgICAgOiAoY29uc3QgU3RyaW5nLmZyb21FbnZpcm9ubWVudChuYW1lKSA9PSAiZmFsc2UiKQogICAqICAgICAgICAgPyBmYWxzZQogICAqICAgICAgICAgOiBkZWZhdWx0VmFsdWUKICAgKiBgYGAKICAgKiBFeGFtcGxlOgogICAqIGBgYGRhcnQKICAgKiBjb25zdCBsb2dnaW5nRmxhZyA9IGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCJsb2dnaW5nIik7CiAgICogYGBgCiAgICogSWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IHRydXRoLXN0cmluZyB0aGFuIGAidHJ1ZSJgLCB5b3UgY2FuIHVzZSB0aGUKICAgKiBbU3RyaW5nLmZyb21FbnZpcm9ubWVudF0gY29uc3RydWN0b3IgZGlyZWN0bHk6CiAgICogYGBgZGFydAogICAqIGNvbnN0IGlzTG9nZ2luZ09uID0gKGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoImxvZ2dpbmciKSA9PSAib24iKTsKICAgKiBgYGAKICAgKi8KICAvLyBUaGUgLmZyb21FbnZpcm9ubWVudCgpIGNvbnN0cnVjdG9ycyBhcmUgc3BlY2lhbCBpbiB0aGF0IHdlIGRvIG5vdCB3YW50CiAgLy8gdXNlcnMgdG8gY2FsbCB0aGVtIHVzaW5nICJuZXciLiBXZSBwcm9oaWJpdCB0aGF0IGJ5IGdpdmluZyB0aGVtIGJvZGllcwogIC8vIHRoYXQgdGhyb3csIGV2ZW4gdGhvdWdoIGNvbnN0IGNvbnN0cnVjdG9ycyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBib2RpZXMuCiAgLy8gRGlzYWJsZSB0aG9zZSBzdGF0aWMgZXJyb3JzLgogIC8vaWdub3JlOiBjb25zdF9jb25zdHJ1Y3Rvcl93aXRoX2JvZHkKICAvL2lnbm9yZTogY29uc3RfZmFjdG9yeQogIGV4dGVybmFsIGNvbnN0IGZhY3RvcnkgYm9vbC5mcm9tRW52aXJvbm1lbnQoU3RyaW5nIG5hbWUsCiAgICAgIHtib29sIGRlZmF1bHRWYWx1ZSA9IGZhbHNlfSk7CgogIGV4dGVybmFsIGludCBnZXQgaGFzaENvZGU7CgogIC8vLyBUaGUgbG9naWNhbCBjb25qdW5jdGlvbiAoImFuZCIpIG9mIHRoaXMgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGJvdGggdGhpcyBhbmQgW290aGVyXSBhcmUgYHRydWVgLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuCiAgLy9UT0RPKGxybik6IFJlbW92ZSAiYXMgYm9vbCIgaW4gRGFydCAyLgogIEBTaW5jZSgiMi4xIikKICBib29sIG9wZXJhdG9yICYoYm9vbCBvdGhlcikgPT4gKG90aGVyIGFzIGJvb2wpICYmIHRoaXM7CgogIC8vLyBUaGUgbG9naWNhbCBkaXNqdW5jdGlvbiAoImluY2x1c2l2ZSBvciIpIG9mIHRoaXMgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIGVpdGhlciB0aGlzIG9yIFtvdGhlcl0gaXMgYHRydWVgLCBhbmQgYGZhbHNlYCBvdGhlcndpc2UuCiAgQFNpbmNlKCIyLjEiKQogIGJvb2wgb3BlcmF0b3IgfChib29sIG90aGVyKSA9PiAob3RoZXIgYXMgYm9vbCkgfHwgdGhpczsKCiAgLy8vIFRoZSBsb2dpY2FsIGV4Y2x1c2l2ZSBkaXNqdW5jdGlvbiAoImV4Y2x1c2l2ZSBvciIpIG9mIHRoaXMgYW5kIFtvdGhlcl0uCiAgLy8vCiAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIGFuZCBbb3RoZXJdIGFyZSBuZWl0aGVyIGJvdGggYHRydWVgIG5vciBib3RoIGBmYWxzZWAuCiAgQFNpbmNlKCIyLjEiKQogIGJvb2wgb3BlcmF0b3IgXihib29sIG90aGVyKSA9PiAhKG90aGVyIGFzIGJvb2wpID09IHRoaXM7CgogIC8qKgogICAqIFJldHVybnMgZWl0aGVyIGAidHJ1ZSJgIGZvciBgdHJ1ZWAgYW5kIGAiZmFsc2UiYCBmb3IgYGZhbHNlYC4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gdGhpcyA/ICJ0cnVlIiA6ICJmYWxzZSI7CiAgfQp9ClEATk48ARMBBE4cA0wJBBoNBkYFTUEFTCcFNQ00EDsVHAkODUAJUDQNTAkGTExQIigaOyQBHQE7BlErEDoBRAZREDoBTgZREDsBBkMGFiQEAgETZGFydDpjb3JlL2Jvb2wuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2Jvb2xfcGF0Y2guZGFydIIMLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBib29sIHsKICBAcGF0Y2gKICBjb25zdCBmYWN0b3J5IGJvb2wuZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lLCB7Ym9vbCBkZWZhdWx0VmFsdWU6IGZhbHNlfSkKICAgICAgbmF0aXZlICJCb29sX2Zyb21FbnZpcm9ubWVudCI7CgogIEBwYXRjaAogIGludCBnZXQgaGFzaENvZGUgPT4gdGhpcyA/IDEyMzEgOiAxMjM3OwoKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlID0+IHRoaXMgPyAxMjMxIDogMTIzNzsKfQoUAE5OPAEeAQcaDQlOJQEJKgEzAgEfZGFydDpjb3JlLXBhdGNoL2Jvb2xfcGF0Y2guZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9jb21wYXJhYmxlLmRhcnSOVS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBUaGUgc2lnbmF0dXJlIG9mIGEgZ2VuZXJpYyBjb21wYXJpc29uIGZ1bmN0aW9uLgogKgogKiBBIGNvbXBhcmlzb24gZnVuY3Rpb24gcmVwcmVzZW50cyBhbiBvcmRlcmluZyBvbiBhIHR5cGUgb2Ygb2JqZWN0cy4KICogQSB0b3RhbCBvcmRlcmluZyBvbiBhIHR5cGUgbWVhbnMgdGhhdCBmb3IgdHdvIHZhbHVlcywgZWl0aGVyIHRoZXkKICogYXJlIGVxdWFsIG9yIG9uZSBpcyBncmVhdGVyIHRoYW4gdGhlIG90aGVyIChhbmQgdGhlIGxhdHRlciBtdXN0IHRoZW4gYmUKICogc21hbGxlciB0aGFuIHRoZSBmb3JtZXIpLgogKgogKiBBIFtDb21wYXJhdG9yXSBmdW5jdGlvbiByZXByZXNlbnRzIHN1Y2ggYSB0b3RhbCBvcmRlcmluZyBieSByZXR1cm5pbmcKICoKICogKiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgW2FdIGlzIHNtYWxsZXIgdGhhbiBbYl0sCiAqICogemVybyBpZiBbYV0gaXMgZXF1YWwgdG8gW2JdLCBhbmQKICogKiBhIHBvc2l0aXZlIGludGVnZXIgaWYgW2FdIGlzIGdyZWF0ZXIgdGhhbiBbYl0uCiAqLwp0eXBlZGVmIENvbXBhcmF0b3I8VD4gPSBpbnQgRnVuY3Rpb24oVCBhLCBUIGIpOwoKLyoqCiAqIEludGVyZmFjZSB1c2VkIGJ5IHR5cGVzIHRoYXQgaGF2ZSBhbiBpbnRyaW5zaWMgb3JkZXJpbmcuCiAqCiAqIFRoZSBbY29tcGFyZVRvXSBvcGVyYXRpb24gZGVmaW5lcyBhIHRvdGFsIG9yZGVyaW5nIG9mIG9iamVjdHMsCiAqIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBvcmRlcmluZyBhbmQgc29ydGluZy4KICoKICogVGhlIFtDb21wYXJhYmxlXSBpbnRlcmZhY2Ugc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIGEgdHlwZS4KICogSWYgYSB0eXBlIGNhbiBiZSBvcmRlcmVkIGluIG1vcmUgdGhhbiBvbmUgd2F5LAogKiBhbmQgbm9uZSBvZiB0aGVtIGlzIHRoZSBvYnZpb3VzIG5hdHVyYWwgb3JkZXJpbmcsCiAqIHRoZW4gaXQgbWlnaHQgYmUgYmV0dGVyIG5vdCB0byB1c2UgdGhlIFtDb21wYXJhYmxlXSBpbnRlcmZhY2UsCiAqIGFuZCB0byBwcm92aWRlIHNlcGFyYXRlIFtDb21wYXJhdG9yXXMgaW5zdGVhZC4KICoKICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgb3JkZXIgb2YgYSBbQ29tcGFyYWJsZV0gYWdyZWVzCiAqIHdpdGggaXRzIG9wZXJhdG9yIFtvcGVyYXRvciA9PV0gZXF1YWxpdHkgKGBhLmNvbXBhcmVUbyhiKSA9PSAwYCBpZmYgYGEgPT0gYmApLAogKiBidXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudC4KICogRm9yIGV4YW1wbGUsIFtkb3VibGVdIGFuZCBbRGF0ZVRpbWVdIGhhdmUgYGNvbXBhcmVUb2AgbWV0aG9kcwogKiB0aGF0IGRvIG5vdCBhZ3JlZSB3aXRoIG9wZXJhdG9yIFtvcGVyYXRvciA9PV0uCiAqIEZvciBkb3VibGVzIHRoZSBbY29tcGFyZVRvXSBtZXRob2QgaXMgbW9yZSBwcmVjaXNlIHRoYW4gdGhlIGVxdWFsaXR5LAogKiBhbmQgZm9yIFtEYXRlVGltZV0gaXQgaXMgbGVzcyBwcmVjaXNlLgogKgogKiBFeGFtcGxlczoKICoKICogICAgICAoMC4wKS5jb21wYXJlVG8oLTAuMCk7ICAvLyA9PiAxCiAqICAgICAgMC4wID09IC0wLjA7ICAgICAgICAgICAgLy8gPT4gdHJ1ZQogKiAgICAgIHZhciBkdCA9IG5ldyBEYXRlVGltZS5ub3coKTsKICogICAgICB2YXIgZHQyID0gZHQudG9VdGMoKTsKICogICAgICBkdCA9PSBkdDI7ICAgICAgICAgICAgICAvLyA9PiBmYWxzZQogKiAgICAgIGR0LmNvbXBhcmVUbyhkdDIpOyAgICAgIC8vID0+IDAKICoKICogVGhlIFtDb21wYXJhYmxlXSBpbnRlcmZhY2UgZG9lcyBub3QgaW1wbHkgdGhlIGV4aXN0ZW5jZQogKiBvZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgYDxgLCBgPD1gLCBgPmAgYW5kIGA+PWAuCiAqIFRoZXNlIHNob3VsZCBvbmx5IGJlIGRlZmluZWQKICogaWYgdGhlIG9yZGVyaW5nIGlzIGEgbGVzcy10aGFuL2dyZWF0ZXItdGhhbiBvcmRlcmluZywKICogdGhhdCBpcywgYW4gb3JkZXJpbmcgd2hlcmUgeW91IHdvdWxkIG5hdHVyYWxseQogKiB1c2UgdGhlIHdvcmRzICJsZXNzIHRoYW4iIGFib3V0IHRoZSBvcmRlciBvZiB0d28gZWxlbWVudHMuCiAqCiAqIElmIHRoZSBlcXVhbGl0eSBvcGVyYXRvciBhbmQgW2NvbXBhcmVUb10gZGlzYWdyZWUsCiAqIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBzaG91bGQgZm9sbG93IHRoZSBlcXVhbGl0eSBvcGVyYXRvciwKICogYW5kIHdpbGwgbGlrZWx5IGFsc28gZGlzYWdyZWUgd2l0aCBbY29tcGFyZVRvXS4KICogT3RoZXJ3aXNlIHRoZXkgc2hvdWxkIG1hdGNoIHRoZSBbY29tcGFyZVRvXSBtZXRob2QsCiAqIHNvIHRoYXQgYGEgPCBiYCBpZmYgYGEuY29tcGFyZVRvKGIpIDwgMGAuCiAqCiAqIFRoZSBbZG91YmxlXSBjbGFzcyBkZWZpbmVzIGNvbXBhcmlzb24gb3BlcmF0b3JzCiAqIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBlcXVhbGl0eS4KICogVGhlIG9wZXJhdG9ycyBkaWZmZXIgZnJvbSBgZG91YmxlLmNvbXBhcmVUb2Agb24gLTAuMCBhbmQgTmFOLgogKgogKiBUaGUgW0RhdGVUaW1lXSBjbGFzcyBoYXMgbm8gY29tcGFyaXNvbiBvcGVyYXRvcnMsIGluc3RlYWQgaXQgaGFzIHRoZSBtb3JlCiAqIHByZWNpc2VseSBuYW1lZCBbRGF0ZVRpbWUuaXNCZWZvcmVdIGFuZCBbRGF0ZVRpbWUuaXNBZnRlcl0uCiAqLwphYnN0cmFjdCBjbGFzcyBDb21wYXJhYmxlPFQ+IHsKICAvKioKICAgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB0byBhbm90aGVyIFtDb21wYXJhYmxlXQogICAqCiAgICogUmV0dXJucyBhIHZhbHVlIGxpa2UgYSBbQ29tcGFyYXRvcl0gd2hlbiBjb21wYXJpbmcgYHRoaXNgIHRvIFtvdGhlcl0uCiAgICogVGhhdCBpcywgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYHRoaXNgIGlzIG9yZGVyZWQgYmVmb3JlIFtvdGhlcl0sCiAgICogYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIGB0aGlzYCBpcyBvcmRlcmVkIGFmdGVyIFtvdGhlcl0sCiAgICogYW5kIHplcm8gaWYgYHRoaXNgIGFuZCBbb3RoZXJdIGFyZSBvcmRlcmVkIHRvZ2V0aGVyLgogICAqCiAgICogVGhlIFtvdGhlcl0gYXJndW1lbnQgbXVzdCBiZSBhIHZhbHVlIHRoYXQgaXMgY29tcGFyYWJsZSB0byB0aGlzIG9iamVjdC4KICAgKi8KICBpbnQgY29tcGFyZVRvKFQgb3RoZXIpOwoKICAvKioKICAgKiBBIFtDb21wYXJhdG9yXSB0aGF0IGNvbXBhcmVzIG9uZSBjb21wYXJhYmxlIHRvIGFub3RoZXIuCiAgICoKICAgKiBJdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGEuY29tcGFyZVRvKGIpYC4KICAgKgogICAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbXBhcmF0b3IKICAgKiBmb3Igb3JkZXJpbmcgY29sbGVjdGlvbnMsIGZvciBleGFtcGxlIGluIHRoZSBbTGlzdF0gc29ydCBmdW5jdGlvbi4KICAgKi8KICBzdGF0aWMgaW50IGNvbXBhcmUoQ29tcGFyYWJsZSBhLCBDb21wYXJhYmxlIGIpID0+IGEuY29tcGFyZVRvKGIpOwp9CmAATk48ARMBBDMDRkVLHQNJAzQmNAQwAQQ8A0IvA1EyNUIyAz1SIkEySSoDDQMoKyUeLCgDOzggOTI+AzZBMzctAzMmQQNNPwQfBjIFS1E8OgVNBhoBBj0FMAU9SAZEAgEZZGFydDpjb3JlL2NvbXBhcmFibGUuZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9kb3VibGUuZGFydJwRLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLy8gVE9ETzogQ29udmVydCB0aGlzIGFic3RyYWN0IGNsYXNzIGludG8gYSBjb25jcmV0ZSBjbGFzcyBkb3VibGUKLy8gdGhhdCB1c2VzIHRoZSBwYXRjaCBjbGFzcyBmdW5jdGlvbmFsaXR5IHRvIGFjY291bnQgZm9yIHRoZQovLyBkaWZmZXJlbnQgcGxhdGZvcm0gaW1wbGVtZW50YXRpb25zLgoKLyoqCiAqIEEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCiAqCiAqIFJlcHJlc2VudGF0aW9uIG9mIERhcnQgZG91YmxlcyBjb250YWluaW5nIGRvdWJsZSBzcGVjaWZpYyBjb25zdGFudHMKICogYW5kIG9wZXJhdGlvbnMgYW5kIHNwZWNpYWxpemF0aW9ucyBvZiBvcGVyYXRpb25zIGluaGVyaXRlZCBmcm9tCiAqIFtudW1dLiBEYXJ0IGRvdWJsZXMgYXJlIDY0LWJpdCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIHNwZWNpZmllZCBpbiB0aGUKICogSUVFRSA3NTQgc3RhbmRhcmQuCiAqCiAqIFRoZSBbZG91YmxlXSB0eXBlIGlzIGNvbnRhZ2lvdXMuIE9wZXJhdGlvbnMgb24gW2RvdWJsZV1zIHJldHVybgogKiBbZG91YmxlXSByZXN1bHRzLgogKgogKiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgYSBjbGFzcyB0byBhdHRlbXB0IHRvIGV4dGVuZCBvciBpbXBsZW1lbnQKICogZG91YmxlLgogKi8KYWJzdHJhY3QgY2xhc3MgZG91YmxlIGV4dGVuZHMgbnVtIHsKICBzdGF0aWMgY29uc3QgZG91YmxlIG5hbiA9IDAuMCAvIDAuMDsKICBzdGF0aWMgY29uc3QgZG91YmxlIGluZmluaXR5ID0gMS4wIC8gMC4wOwogIHN0YXRpYyBjb25zdCBkb3VibGUgbmVnYXRpdmVJbmZpbml0eSA9IC1pbmZpbml0eTsKICBzdGF0aWMgY29uc3QgZG91YmxlIG1pblBvc2l0aXZlID0gNWUtMzI0OwogIHN0YXRpYyBjb25zdCBkb3VibGUgbWF4RmluaXRlID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7CgogIGRvdWJsZSByZW1haW5kZXIobnVtIG90aGVyKTsKCiAgLyoqIEFkZGl0aW9uIG9wZXJhdG9yLiAqLwogIGRvdWJsZSBvcGVyYXRvciArKG51bSBvdGhlcik7CgogIC8qKiBTdWJ0cmFjdGlvbiBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLShudW0gb3RoZXIpOwoKICAvKiogTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuICovCiAgZG91YmxlIG9wZXJhdG9yICoobnVtIG90aGVyKTsKCiAgZG91YmxlIG9wZXJhdG9yICUobnVtIG90aGVyKTsKCiAgLyoqIERpdmlzaW9uIG9wZXJhdG9yLiAqLwogIGRvdWJsZSBvcGVyYXRvciAvKG51bSBvdGhlcik7CgogIC8qKgogICAqIFRydW5jYXRpbmcgZGl2aXNpb24gb3BlcmF0b3IuCiAgICoKICAgKiBUaGUgcmVzdWx0IG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uIGBhIH4vIGJgIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgKGEgLyBiKS50cnVuY2F0ZSgpYC4KICAgKi8KICBpbnQgb3BlcmF0b3Igfi8obnVtIG90aGVyKTsKCiAgLyoqIE5lZ2F0ZSBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLSgpOwoKICAvKiogUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbZG91YmxlXS4gKi8KICBkb3VibGUgYWJzKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGRvdWJsZSdzIG51bWVyaWNhbCB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgLTEuMCBpZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIHplcm8sCiAgICogKzEuMCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHplcm8sCiAgICogYW5kIHRoZSB2YWx1ZSBpdHNlbGYgaWYgaXQgaXMgLTAuMCwgMC4wIG9yIE5hTi4KICAgKi8KICBkb3VibGUgZ2V0IHNpZ247CgogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgY2xvc2VzdCB0byBgdGhpc2AuCiAgICoKICAgKiBSb3VuZHMgYXdheSBmcm9tIHplcm8gd2hlbiB0aGVyZSBpcyBubyBjbG9zZXN0IGludGVnZXI6CiAgICogIGAoMy41KS5yb3VuZCgpID09IDRgIGFuZCBgKC0zLjUpLnJvdW5kKCkgPT0gLTRgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgcm91bmQoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgZmxvb3IoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgaW50ZWdlciBubyBzbWFsbGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgY2VpbCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSBgdGhpc2AuCiAgICoKICAgKiBJZiBgdGhpc2AgaXMgbm90IGZpbml0ZSAoYE5hTmAgb3IgaW5maW5pdHkpLCB0aHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIGludCB0cnVuY2F0ZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIGRvdWJsZSB2YWx1ZSBjbG9zZXN0IHRvIGB0aGlzYC4KICAgKgogICAqIFJvdW5kcyBhd2F5IGZyb20gemVybyB3aGVuIHRoZXJlIGlzIG5vIGNsb3Nlc3QgaW50ZWdlcjoKICAgKiAgYCgzLjUpLnJvdW5kVG9Eb3VibGUoKSA9PSA0YCBhbmQgYCgtMy41KS5yb3VuZFRvRG91YmxlKCkgPT0gLTRgLgogICAqCiAgICogSWYgdGhpcyBpcyBhbHJlYWR5IGFuIGludGVnZXIgdmFsdWVkIGRvdWJsZSwgaW5jbHVkaW5nIGAtMC4wYCwgb3IgaXQgaXMgbm90CiAgICogYSBmaW5pdGUgdmFsdWUsIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHJvdW5kaW5nLCBgLTAuMGAgaXMgY29uc2lkZXJlZCB0byBiZSBiZWxvdyBgMC4wYCwKICAgKiBhbmQgYC0wLjBgIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkIGNsb3NlciB0byBuZWdhdGl2ZSBudW1iZXJzIHRoYW4gYDAuMGAuCiAgICogVGhpcyBtZWFucyB0aGF0IGZvciBhIHZhbHVlLCBgZGAgaW4gdGhlIHJhbmdlIGAtMC41IDwgZCA8IDAuMGAsCiAgICogdGhlIHJlc3VsdCBpcyBgLTAuMGAuCiAgICovCiAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3QgaW50ZWdlciBkb3VibGUgdmFsdWUgbm8gZ3JlYXRlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIG5vdAogICAqIGEgZmluaXRlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgd2lsbCByZXR1cm4gYDAuMGAuCiAgICovCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgaW50ZWdlciBkb3VibGUgdmFsdWUgbm8gc21hbGxlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIG5vdAogICAqIGEgZmluaXRlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgLTEuMCA8IGQgPCAwLjBgIHdpbGwgcmV0dXJuIGAtMC4wYC4KICAgKi8KICBkb3VibGUgY2VpbFRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgZG91YmxlIHZhbHVlIG9idGFpbmVkIGJ5IGRpc2NhcmRpbmcgYW55IGZyYWN0aW9uYWwKICAgKiBkaWdpdHMgZnJvbSBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGlzIGlzIGFscmVhZHkgYW4gaW50ZWdlciB2YWx1ZWQgZG91YmxlLCBpbmNsdWRpbmcgYC0wLjBgLCBvciBpdCBpcyBub3QKICAgKiBhIGZpbml0ZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLgogICAqIEEgbnVtYmVyIGBkYCBpbiB0aGUgcmFuZ2UgYC0xLjAgPCBkIDwgMC4wYCB3aWxsIHJldHVybiBgLTAuMGAsIGFuZAogICAqIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgaXQgd2lsbCByZXR1cm4gMC4wLgogICAqLwogIGRvdWJsZSB0cnVuY2F0ZVRvRG91YmxlKCk7CgogIC8qKgogICAqIFByb3ZpZGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFtkb3VibGVdIHZhbHVlLgogICAqCiAgICogVGhlIHJlcHJlc2VudGF0aW9uIGlzIGEgbnVtYmVyIGxpdGVyYWwgc3VjaCB0aGF0IHRoZSBjbG9zZXN0IGRvdWJsZSB2YWx1ZQogICAqIHRvIHRoZSByZXByZXNlbnRhdGlvbidzIG1hdGhlbWF0aWNhbCB2YWx1ZSBpcyB0aGlzIFtkb3VibGVdLgogICAqCiAgICogUmV0dXJucyAiTmFOIiBmb3IgdGhlIE5vdC1hLU51bWJlciB2YWx1ZS4KICAgKiBSZXR1cm5zICJJbmZpbml0eSIgYW5kICItSW5maW5pdHkiIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgSW5maW5pdHkuCiAgICogUmV0dXJucyAiLTAuMCIgZm9yIG5lZ2F0aXZlIHplcm8uCiAgICoKICAgKiBGb3IgYWxsIGRvdWJsZXMsIGBkYCwgY29udmVydGluZyB0byBhIHN0cmluZyBhbmQgcGFyc2luZyB0aGUgc3RyaW5nIGJhY2sKICAgKiBnaXZlcyB0aGUgc2FtZSB2YWx1ZSBhZ2FpbjogYGQgPT0gZG91YmxlLnBhcnNlKGQudG9TdHJpbmcoKSlgIChleGNlcHQgd2hlbgogICAqIGBkYCBpcyBOYU4pLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhbiBkb3VibGUgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIEFjY2VwdHMgYW4gb3B0aW9uYWwgc2lnbiAoYCtgIG9yIGAtYCkgZm9sbG93ZWQgYnkgZWl0aGVyIHRoZSBjaGFyYWN0ZXJzCiAgICogIkluZmluaXR5IiwgdGhlIGNoYXJhY3RlcnMgIk5hTiIgb3IgYSBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbi4KICAgKiBBIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIGlzIGNvbXBvc2VkIG9mIGEgbWFudGlzc2EgYW5kIGFuIG9wdGlvbmFsCiAgICogZXhwb25lbnQgcGFydC4gVGhlIG1hbnRpc3NhIGlzIGVpdGhlciBhIGRlY2ltYWwgcG9pbnQgKGAuYCkgZm9sbG93ZWQgYnkgYQogICAqIHNlcXVlbmNlIG9mIChkZWNpbWFsKSBkaWdpdHMsIG9yIGEgc2VxdWVuY2Ugb2YgZGlnaXRzCiAgICogb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgcG9pbnQgYW5kIG9wdGlvbmFsbHkgbW9yZSBkaWdpdHMuIFRoZQogICAqIChvcHRpb25hbCkgZXhwb25lbnQgcGFydCBjb25zaXN0cyBvZiB0aGUgY2hhcmFjdGVyICJlIiBvciAiRSIsIGFuIG9wdGlvbmFsCiAgICogc2lnbiwgYW5kIG9uZSBvciBtb3JlIGRpZ2l0cy4KICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBub3QgYmUgYG51bGxgLgogICAqCiAgICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkLgogICAqCiAgICogSWYgdGhlIFtzb3VyY2VdIHN0cmluZyBpcyBub3QgYSB2YWxpZCBkb3VibGUgbGl0ZXJhbCwgdGhlIFtvbkVycm9yXQogICAqIGlzIGNhbGxlZCB3aXRoIHRoZSBbc291cmNlXSBhcyBhcmd1bWVudCwgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMKICAgKiB1c2VkIGluc3RlYWQuIElmIG5vIGBvbkVycm9yYCBpcyBwcm92aWRlZCwgYSBbRm9ybWF0RXhjZXB0aW9uXQogICAqIGlzIHRocm93biBpbnN0ZWFkLgogICAqCiAgICogVGhlIFtvbkVycm9yXSBmdW5jdGlvbiBpcyBvbmx5IGludm9rZWQgaWYgW3NvdXJjZV0gaXMgYSBbU3RyaW5nXSB3aXRoIGFuCiAgICogaW52YWxpZCBmb3JtYXQuIEl0IGlzIG5vdCBpbnZva2VkIGlmIFtzb3VyY2VdIGlzIGBudWxsYC4KICAgKgogICAqIEV4YW1wbGVzIG9mIGFjY2VwdGVkIHN0cmluZ3M6CiAgICoKICAgKiAgICAgIjMuMTQiCiAgICogICAgICIgIDMuMTQgXHhBMCIKICAgKiAgICAgIjAuIgogICAqICAgICAiLjAiCiAgICogICAgICItMS5lMyIKICAgKiAgICAgIjEyMzRFKzciCiAgICogICAgICIrLjEyZS05IgogICAqICAgICAiLU5hTiIKICAgKgogICAqIFRoZSBbb25FcnJvcl0gcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KICAgKiBJbnN0ZWFkIG9mIGBkb3VibGUucGFyc2Uoc3RyaW5nLCAoc3RyaW5nKSB7IC4uLiB9KWAsCiAgICogeW91IHNob3VsZCB1c2UgYGRvdWJsZS50cnlQYXJzZShzdHJpbmcpID8/ICguLi4pYC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgZG91YmxlIHBhcnNlKFN0cmluZyBzb3VyY2UsCiAgICAgIFtAZGVwcmVjYXRlZCBkb3VibGUgb25FcnJvcihTdHJpbmcgc291cmNlKV0pOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhbiBkb3VibGUgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIExpa2UgW3BhcnNlXSBleGNlcHQgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYG51bGxgIGZvciBpbnZhbGlkIGlucHV0cwogICAqIGluc3RlYWQgb2YgdGhyb3dpbmcsIGFuZCB0aGUgW3NvdXJjZV0gbXVzdCBzdGlsbCBub3QgYmUgYG51bGxgLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBkb3VibGUgdHJ5UGFyc2UoU3RyaW5nIHNvdXJjZSk7Cn0KgNwATk48ARMBQj4nAQQtA0dDTRYDQxUDTAsEJCcsNCw7AR8BHCABHyABIiABIAEcIAEGIwVFGwYeARoXATYQAQY3BTItNQYTAQYsBT03BVAGDwEGOgVQBg8BBjcFUAYOAQY/GQVQBhIBBjkFPUcFUTcFSk9FGwYaAQZHBVE3BUpCBhoBBkQFUTcFSkQGGQEGTBkFUTcFSkg2Bh0BBjYFT0IFL0wnBU5QEgYVAQY/BU1KT087TFAjJgUxBUlGRBgFTj4FIwUQFw4OERMTEAVAOjgGLjQBBj8FTkUGMgIBFWRhcnQ6Y29yZS9kb3VibGUuZGFydCxvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9lcnJvcnMuZGFydMAAS/0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogRXJyb3Igb2JqZWN0cyB0aHJvd24gaW4gdGhlIGNhc2Ugb2YgYSBwcm9ncmFtIGZhaWx1cmUuCiAqCiAqIEFuIGBFcnJvcmAgb2JqZWN0IHJlcHJlc2VudHMgYSBwcm9ncmFtIGZhaWx1cmUgdGhhdCB0aGUgcHJvZ3JhbW1lcgogKiBzaG91bGQgaGF2ZSBhdm9pZGVkLgogKgogKiBFeGFtcGxlcyBpbmNsdWRlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aXRoIGludmFsaWQgYXJndW1lbnRzLAogKiBvciBldmVuIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMsCiAqIG9yIGNhbGxpbmcgaXQgYXQgYSB0aW1lIHdoZW4gaXQgaXMgbm90IGFsbG93ZWQuCiAqCiAqIFRoZXNlIGFyZSBub3QgZXJyb3JzIHRoYXQgYSBjYWxsZXIgc2hvdWxkIGV4cGVjdCBvciBjYXRjaCAtCiAqIGlmIHRoZXkgb2NjdXIsIHRoZSBwcm9ncmFtIGlzIGVycm9uZW91cywKICogYW5kIHRlcm1pbmF0aW5nIHRoZSBwcm9ncmFtIG1heSBiZSB0aGUgc2FmZXN0IHJlc3BvbnNlLgogKgogKiBXaGVuIGRlY2lkaW5nIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3MgYW4gZXJyb3IsCiAqIHRoZSBjb25kaXRpb25zIHdoZXJlIGl0IGhhcHBlbnMgc2hvdWxkIGJlIGNsZWFybHkgZGVzY3JpYmVkLAogKiBhbmQgdGhleSBzaG91bGQgYmUgZGV0ZWN0YWJsZSBhbmQgcHJlZGljdGFibGUsCiAqIHNvIHRoZSBwcm9ncmFtbWVyIHVzaW5nIHRoZSBmdW5jdGlvbiBjYW4gYXZvaWQgdHJpZ2dlcmluZyB0aGUgZXJyb3IuCiAqCiAqIFN1Y2ggZGVzY3JpcHRpb25zIG9mdGVuIHVzZXMgd29yZHMgbGlrZQogKiAibXVzdCIgb3IgIm11c3Qgbm90IiB0byBkZXNjcmliZSB0aGUgY29uZGl0aW9uLAogKiBhbmQgaWYgeW91IHNlZSB3b3JkcyBsaWtlIHRoYXQgaW4gYSBmdW5jdGlvbidzIGRvY3VtZW50YXRpb24sCiAqIHRoZW4gbm90IHNhdGlzZnlpbmcgdGhlIHJlcXVpcmVtZW50CiAqIGlzIHZlcnkgbGlrZWx5IHRvIGNhdXNlIGFuIGVycm9yIHRvIGJlIHRocm93bi4KICoKICogRXhhbXBsZSAoZnJvbSBbU3RyaW5nLmNvbnRhaW5zXSk6CiAqCiAqICAgICAgICBgc3RhcnRJbmRleGAgbXVzdCBub3QgYmUgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIGBsZW5ndGhgLgogKgogKiBJbiB0aGlzIGNhc2UsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGBzdGFydEluZGV4YCBpcyBuZWdhdGl2ZQogKiBvciB0b28gbGFyZ2UuCiAqCiAqIElmIHRoZSBjb25kaXRpb25zIGFyZSBub3QgZGV0ZWN0YWJsZSBiZWZvcmUgY2FsbGluZyBhIGZ1bmN0aW9uLAogKiB0aGUgY2FsbGVkIGZ1bmN0aW9uIHNob3VsZCBub3QgdGhyb3cgYW4gYEVycm9yYC4KICogSXQgbWF5IHN0aWxsIHRocm93IGEgdmFsdWUsCiAqIGJ1dCB0aGUgY2FsbGVyIHdpbGwgaGF2ZSB0byBjYXRjaCB0aGUgdGhyb3duIHZhbHVlLAogKiBlZmZlY3RpdmVseSBtYWtpbmcgaXQgYW4gYWx0ZXJuYXRpdmUgcmVzdWx0IHJhdGhlciB0aGFuIGFuIGVycm9yLgogKiBUaGUgdGhyb3duIG9iamVjdCBjYW4gY2hvb3NlIHRvIGltcGxlbWVudCBbRXhjZXB0aW9uXQogKiB0byBkb2N1bWVudCB0aGF0IGl0IHJlcHJlc2VudHMgYW4gZXhjZXB0aW9uYWwsIGJ1dCBub3QgZXJyb25lb3VzLCBvY2N1cnJlbmNlLAogKiBidXQgaXQgaGFzIG5vIG90aGVyIGVmZmVjdCB0aGFuIGRvY3VtZW50YXRpb24uCiAqCiAqIEFsbCBub24tYG51bGxgIHZhbHVlcyBjYW4gYmUgdGhyb3duIGluIERhcnQuCiAqIE9iamVjdHMgZXh0ZW5kaW5nIGBFcnJvcmAgYXJlIGhhbmRsZWQgc3BlY2lhbGx5OgogKiBUaGUgZmlyc3QgdGltZSB0aGV5IGFyZSB0aHJvd24sCiAqIHRoZSBzdGFjayB0cmFjZSBhdCB0aGUgdGhyb3cgcG9pbnQgaXMgcmVjb3JkZWQKICogYW5kIHN0b3JlZCBpbiB0aGUgZXJyb3Igb2JqZWN0LgogKiBJdCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZSBbc3RhY2tUcmFjZV0gZ2V0dGVyLgogKiBBbiBlcnJvciBvYmplY3QgdGhhdCBtZXJlbHkgaW1wbGVtZW50cyBgRXJyb3JgLCBhbmQgZG9lc24ndCBleHRlbmQgaXQsCiAqIHdpbGwgbm90IHN0b3JlIHRoZSBzdGFjayB0cmFjZSBhdXRvbWF0aWNhbGx5LgogKgogKiBFcnJvciBvYmplY3RzIGFyZSBhbHNvIHVzZWQgZm9yIHN5c3RlbSB3aWRlIGZhaWx1cmVzCiAqIGxpa2Ugc3RhY2sgb3ZlcmZsb3cgb3IgYW4gb3V0LW9mLW1lbW9yeSBzaXR1YXRpb24uCiAqCiAqIFNpbmNlIGVycm9ycyBhcmUgbm90IGNyZWF0ZWQgdG8gYmUgY2F1Z2h0LAogKiB0aGVyZSBpcyBubyBuZWVkIGZvciBzdWJjbGFzc2VzIHRvIGRpc3Rpbmd1aXNoIHRoZSBlcnJvcnMuCiAqIEluc3RlYWQgc3ViY2xhc3NlcyBoYXZlIGJlZW4gY3JlYXRlZCBpbiBvcmRlciB0byBtYWtlIGdyb3VwcwogKiBvZiByZWxhdGVkIGVycm9ycyBlYXN5IHRvIGNyZWF0ZSB3aXRoIGNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMuCiAqIEZvciBleGFtcGxlLCB0aGUgW1N0cmluZy5jb250YWluc10gbWV0aG9kIHdpbGwgdXNlIGEgW1JhbmdlRXJyb3JdCiAqIGlmIGl0cyBgc3RhcnRJbmRleGAgaXNuJ3QgaW4gdGhlIHJhbmdlIGAwLi5sZW5ndGhgLAogKiB3aGljaCBpcyBlYXNpbHkgY3JlYXRlZCBieSBgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnRJbmRleCwgMCwgbGVuZ3RoKWAuCiAqLwpjbGFzcyBFcnJvciB7CiAgRXJyb3IoKTsgLy8gUHJldmVudCB1c2UgYXMgbWl4aW4uCgogIC8qKgogICAqIFNhZmVseSBjb252ZXJ0IGEgdmFsdWUgdG8gYSBbU3RyaW5nXSBkZXNjcmlwdGlvbi4KICAgKgogICAqIFRoZSBjb252ZXJzaW9uIGlzIGd1YXJhbnRlZWQgdG8gbm90IHRocm93LCBzbyBpdCB3b24ndCB1c2UgdGhlIG9iamVjdCdzCiAgICogdG9TdHJpbmcgbWV0aG9kLgogICAqLwogIHN0YXRpYyBTdHJpbmcgc2FmZVRvU3RyaW5nKE9iamVjdCBvYmplY3QpIHsKICAgIGlmIChvYmplY3QgaXMgbnVtIHx8IG9iamVjdCBpcyBib29sIHx8IG51bGwgPT0gb2JqZWN0KSB7CiAgICAgIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKICAgIH0KICAgIGlmIChvYmplY3QgaXMgU3RyaW5nKSB7CiAgICAgIHJldHVybiBfc3RyaW5nVG9TYWZlU3RyaW5nKG9iamVjdCk7CiAgICB9CiAgICByZXR1cm4gX29iamVjdFRvU3RyaW5nKG9iamVjdCk7CiAgfQoKICAvKiogQ29udmVydCBzdHJpbmcgdG8gYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCB3aXRoIG5vIGNvbnRyb2wgY2hhcmFjdGVycy4gKi8KICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF9zdHJpbmdUb1NhZmVTdHJpbmcoU3RyaW5nIHN0cmluZyk7CgogIGV4dGVybmFsIHN0YXRpYyBTdHJpbmcgX29iamVjdFRvU3RyaW5nKE9iamVjdCBvYmplY3QpOwoKICBleHRlcm5hbCBTdGFja1RyYWNlIGdldCBzdGFja1RyYWNlOwp9CgovKioKICogRXJyb3IgdGhyb3duIGJ5IHRoZSBydW50aW1lIHN5c3RlbSB3aGVuIGFuIGFzc2VydCBzdGF0ZW1lbnQgZmFpbHMuCiAqLwpjbGFzcyBBc3NlcnRpb25FcnJvciBleHRlbmRzIEVycm9yIHsKICAvKiogTWVzc2FnZSBkZXNjcmliaW5nIHRoZSBhc3NlcnRpb24gZXJyb3IuICovCiAgZmluYWwgT2JqZWN0IG1lc3NhZ2U7CiAgQXNzZXJ0aW9uRXJyb3IoW3RoaXMubWVzc2FnZV0pOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJBc3NlcnRpb24gZmFpbGVkIjsKfQoKLyoqCiAqIEVycm9yIHRocm93biBieSB0aGUgcnVudGltZSBzeXN0ZW0gd2hlbiBhIHR5cGUgYXNzZXJ0aW9uIGZhaWxzLgogKi8KY2xhc3MgVHlwZUVycm9yIGV4dGVuZHMgQXNzZXJ0aW9uRXJyb3Ige30KCi8qKgogKiBFcnJvciB0aHJvd24gYnkgdGhlIHJ1bnRpbWUgc3lzdGVtIHdoZW4gYSBjYXN0IG9wZXJhdGlvbiBmYWlscy4KICovCmNsYXNzIENhc3RFcnJvciBleHRlbmRzIEVycm9yIHt9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byB0aHJvdyBbOm51bGw6XS4KICovCmNsYXNzIE51bGxUaHJvd25FcnJvciBleHRlbmRzIEVycm9yIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgTnVsbFRocm93bkVycm9yKCk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlRocm93IG9mIG51bGwuIjsKfQoKLyoqCiAqIEVycm9yIHRocm93biB3aGVuIGEgZnVuY3Rpb24gaXMgcGFzc2VkIGFuIHVuYWNjZXB0YWJsZSBhcmd1bWVudC4KICovCmNsYXNzIEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgLyoqIFdoZXRoZXIgdmFsdWUgd2FzIHByb3ZpZGVkLiAqLwogIGZpbmFsIGJvb2wgX2hhc1ZhbHVlOwogIC8qKiBUaGUgaW52YWxpZCB2YWx1ZS4gKi8KICBmaW5hbCBpbnZhbGlkVmFsdWU7CiAgLyoqIE5hbWUgb2YgdGhlIGludmFsaWQgYXJndW1lbnQsIGlmIGF2YWlsYWJsZS4gKi8KICBmaW5hbCBTdHJpbmcgbmFtZTsKICAvKiogTWVzc2FnZSBkZXNjcmliaW5nIHRoZSBwcm9ibGVtLiAqLwogIGZpbmFsIG1lc3NhZ2U7CgogIC8qKgogICAqIFRoZSBbbWVzc2FnZV0gZGVzY3JpYmVzIHRoZSBlcnJvbmVvdXMgYXJndW1lbnQuCiAgICoKICAgKiBFeGlzdGluZyBjb2RlIG1heSBiZSB1c2luZyBgbWVzc2FnZWAgdG8gaG9sZCB0aGUgaW52YWxpZCB2YWx1ZS4KICAgKiBJZiB0aGUgYG1lc3NhZ2VgIGlzIG5vdCBhIFtTdHJpbmddLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgdmFsdWUgaW5zdGVhZAogICAqIG9mIGEgbWVzc2FnZS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgQXJndW1lbnRFcnJvcihbdGhpcy5tZXNzYWdlXSkKICAgICAgOiBpbnZhbGlkVmFsdWUgPSBudWxsLAogICAgICAgIF9oYXNWYWx1ZSA9IGZhbHNlLAogICAgICAgIG5hbWUgPSBudWxsOwoKICAvKioKICAgKiBDcmVhdGVzIGVycm9yIGNvbnRhaW5pbmcgdGhlIGludmFsaWQgW3ZhbHVlXS4KICAgKgogICAqIEEgbWVzc2FnZSBpcyBidWlsdCBieSBzdWZmaXhpbmcgdGhlIFttZXNzYWdlXSBhcmd1bWVudCB3aXRoCiAgICogdGhlIFtuYW1lXSBhcmd1bWVudCAoaWYgcHJvdmlkZWQpIGFuZCB0aGUgdmFsdWUuIEV4YW1wbGUKICAgKgogICAqICAgICJJbnZhbGlkIGFyZ3VtZW50IChmb28pOiBudWxsIgogICAqCiAgICogVGhlIGBuYW1lYCBzaG91bGQgbWF0Y2ggdGhlIGFyZ3VtZW50IG5hbWUgb2YgdGhlIGZ1bmN0aW9uLCBidXQgaWYKICAgKiB0aGUgZnVuY3Rpb24gaXMgYSBtZXRob2QgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZSwgYW5kIGl0cyBhcmd1bWVudAogICAqIG5hbWVzIGRpZmZlciBmcm9tIHRoZSBpbnRlcmZhY2UsIGl0IG1pZ2h0IGJlIG1vcmUgdXNlZnVsIHRvIHVzZSB0aGUKICAgKiBpbnRlcmZhY2UgbWV0aG9kJ3MgYXJndW1lbnQgbmFtZSAob3IganVzdCByZW5hbWUgYXJndW1lbnRzIHRvIG1hdGNoKS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgQXJndW1lbnRFcnJvci52YWx1ZSh2YWx1ZSwgW3RoaXMubmFtZSwgdGhpcy5tZXNzYWdlXSkKICAgICAgOiBpbnZhbGlkVmFsdWUgPSB2YWx1ZSwKICAgICAgICBfaGFzVmFsdWUgPSB0cnVlOwoKICAvKioKICAgKiBDcmVhdGUgYW4gYXJndW1lbnQgZXJyb3IgZm9yIGEgYG51bGxgIGFyZ3VtZW50IHRoYXQgbXVzdCBub3QgYmUgYG51bGxgLgogICAqLwogIEFyZ3VtZW50RXJyb3Iubm90TnVsbChbdGhpcy5uYW1lXSkKICAgICAgOiBfaGFzVmFsdWUgPSBmYWxzZSwKICAgICAgICBtZXNzYWdlID0gIk11c3Qgbm90IGJlIG51bGwiLAogICAgICAgIGludmFsaWRWYWx1ZSA9IG51bGw7CgogIC8qKgogICAqIFRocm93cyBpZiBbYXJndW1lbnRdIGlzIGBudWxsYC4KICAgKi8KICBAU2luY2UoIjIuMSIpCiAgc3RhdGljIHZvaWQgY2hlY2tOb3ROdWxsKE9iamVjdCBhcmd1bWVudCwgW1N0cmluZyBuYW1lXSkgewogICAgaWYgKGFyZ3VtZW50ID09IG51bGwpIHRocm93IEFyZ3VtZW50RXJyb3Iubm90TnVsbChuYW1lKTsKICB9CgogIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRvU3RyaW5nIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3Nlcy4KICBTdHJpbmcgZ2V0IF9lcnJvck5hbWUgPT4gIkludmFsaWQgYXJndW1lbnQkeyFfaGFzVmFsdWUgPyAiKHMpIiA6ICIifSI7CiAgU3RyaW5nIGdldCBfZXJyb3JFeHBsYW5hdGlvbiA9PiAiIjsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgU3RyaW5nIG5hbWVTdHJpbmcgPSAiIjsKICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgbmFtZVN0cmluZyA9ICIgKCRuYW1lKSI7CiAgICB9CiAgICB2YXIgbWVzc2FnZSA9ICh0aGlzLm1lc3NhZ2UgPT0gbnVsbCkgPyAiIiA6ICI6ICR7dGhpcy5tZXNzYWdlfSI7CiAgICBTdHJpbmcgcHJlZml4ID0gIiRfZXJyb3JOYW1lJG5hbWVTdHJpbmckbWVzc2FnZSI7CiAgICBpZiAoIV9oYXNWYWx1ZSkgcmV0dXJuIHByZWZpeDsKICAgIC8vIElmIHdlIGtub3cgdGhlIGludmFsaWQgdmFsdWUsIHdlIGNhbiB0cnkgdG8gZGVzY3JpYmUgdGhlIHByb2JsZW0uCiAgICBTdHJpbmcgZXhwbGFuYXRpb24gPSBfZXJyb3JFeHBsYW5hdGlvbjsKICAgIFN0cmluZyBlcnJvclZhbHVlID0gRXJyb3Iuc2FmZVRvU3RyaW5nKGludmFsaWRWYWx1ZSk7CiAgICByZXR1cm4gIiRwcmVmaXgkZXhwbGFuYXRpb246ICRlcnJvclZhbHVlIjsKICB9Cn0KCi8qKgogKiBFcnJvciB0aHJvd24gZHVlIHRvIGFuIGluZGV4IGJlaW5nIG91dHNpZGUgYSB2YWxpZCByYW5nZS4KICovCmNsYXNzIFJhbmdlRXJyb3IgZXh0ZW5kcyBBcmd1bWVudEVycm9yIHsKICAvKiogVGhlIG1pbmltdW0gdmFsdWUgdGhhdCBbdmFsdWVdIGlzIGFsbG93ZWQgdG8gYXNzdW1lLiAqLwogIGZpbmFsIG51bSBzdGFydDsKICAvKiogVGhlIG1heGltdW0gdmFsdWUgdGhhdCBbdmFsdWVdIGlzIGFsbG93ZWQgdG8gYXNzdW1lLiAqLwogIGZpbmFsIG51bSBlbmQ7CgogIC8vIFRPRE8obHJuKTogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2l0aCBzdHJpbmcgdmFsdWVzLgogIC8vIEl0IGN1cnJlbnRseSBpc24ndCBpbiBhbGwgY2FzZXMuCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IFtSYW5nZUVycm9yXSB3aXRoIHRoZSBnaXZlbiBbbWVzc2FnZV0uCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIFJhbmdlRXJyb3IodmFyIG1lc3NhZ2UpCiAgICAgIDogc3RhcnQgPSBudWxsLAogICAgICAgIGVuZCA9IG51bGwsCiAgICAgICAgc3VwZXIobWVzc2FnZSk7CgogIC8qKgogICAqIENyZWF0ZSBhIG5ldyBbUmFuZ2VFcnJvcl0gd2l0aCBhIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBbdmFsdWVdLgogICAqCiAgICogQW4gb3B0aW9uYWwgW25hbWVdIGNhbiBzcGVjaWZ5IHRoZSBhcmd1bWVudCBuYW1lIHRoYXQgaGFzIHRoZQogICAqIGludmFsaWQgdmFsdWUsIGFuZCB0aGUgW21lc3NhZ2VdIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBlcnJvcgogICAqIGRlc2NyaXB0aW9uLgogICAqLwogIFJhbmdlRXJyb3IudmFsdWUobnVtIHZhbHVlLCBbU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlXSkKICAgICAgOiBzdGFydCA9IG51bGwsCiAgICAgICAgZW5kID0gbnVsbCwKICAgICAgICBzdXBlci52YWx1ZSgKICAgICAgICAgICAgdmFsdWUsIG5hbWUsIChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJWYWx1ZSBub3QgaW4gcmFuZ2UiKTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IFtSYW5nZUVycm9yXSBmb3IgYSB2YWx1ZSBiZWluZyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZS4KICAgKgogICAqIFRoZSBhbGxvd2VkIHJhbmdlIGlzIGZyb20gW21pblZhbHVlXSB0byBbbWF4VmFsdWVdLCBpbmNsdXNpdmUuCiAgICogSWYgYG1pblZhbHVlYCBvciBgbWF4VmFsdWVgIGFyZSBgbnVsbGAsIHRoZSByYW5nZSBpcyBpbmZpbml0ZSBpbgogICAqIHRoYXQgZGlyZWN0aW9uLgogICAqCiAgICogRm9yIGEgcmFuZ2UgZnJvbSAwIHRvIHRoZSBsZW5ndGggb2Ygc29tZXRoaW5nLCBlbmQgZXhjbHVzaXZlLCB1c2UKICAgKiBbUmFuZ2VFcnJvci5pbmRleF0uCiAgICoKICAgKiBBbiBvcHRpb25hbCBbbmFtZV0gY2FuIHNwZWNpZnkgdGhlIGFyZ3VtZW50IG5hbWUgdGhhdCBoYXMgdGhlCiAgICogaW52YWxpZCB2YWx1ZSwgYW5kIHRoZSBbbWVzc2FnZV0gY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVycm9yCiAgICogZGVzY3JpcHRpb24uCiAgICovCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQogIFJhbmdlRXJyb3IucmFuZ2UobnVtIGludmFsaWRWYWx1ZSwgaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsCiAgICAgIFtTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2VdKQogICAgICA6IHN0YXJ0ID0gbWluVmFsdWUsCiAgICAgICAgZW5kID0gbWF4VmFsdWUsCiAgICAgICAgc3VwZXIudmFsdWUoCiAgICAgICAgICAgIGludmFsaWRWYWx1ZSwgbmFtZSwgKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIkludmFsaWQgdmFsdWUiKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBbUmFuZ2VFcnJvcl0gc3RhdGluZyB0aGF0IFtpbmRleF0gaXMgbm90IGEgdmFsaWQgaW5kZXgKICAgKiBpbnRvIFtpbmRleGFibGVdLgogICAqCiAgICogQW4gb3B0aW9uYWwgW25hbWVdIGNhbiBzcGVjaWZ5IHRoZSBhcmd1bWVudCBuYW1lIHRoYXQgaGFzIHRoZQogICAqIGludmFsaWQgdmFsdWUsIGFuZCB0aGUgW21lc3NhZ2VdIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBlcnJvcgogICAqIGRlc2NyaXB0aW9uLgogICAqCiAgICogVGhlIFtsZW5ndGhdIGlzIHRoZSBsZW5ndGggb2YgW2luZGV4YWJsZV0gYXQgdGhlIHRpbWUgb2YgdGhlIGVycm9yLgogICAqIElmIGBsZW5ndGhgIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBpbmRleGFibGUubGVuZ3RoYC4KICAgKi8KICBmYWN0b3J5IFJhbmdlRXJyb3IuaW5kZXgoaW50IGluZGV4LCBkeW5hbWljIGluZGV4YWJsZSwKICAgICAgW1N0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZSwgaW50IGxlbmd0aF0pID0gSW5kZXhFcnJvcjsKCiAgLyoqCiAgICogQ2hlY2sgdGhhdCBhIFt2YWx1ZV0gbGllcyBpbiBhIHNwZWNpZmljIGludGVydmFsLgogICAqCiAgICogVGhyb3dzIGlmIFt2YWx1ZV0gaXMgbm90IGluIHRoZSBpbnRlcnZhbC4KICAgKiBUaGUgaW50ZXJ2YWwgaXMgZnJvbSBbbWluVmFsdWVdIHRvIFttYXhWYWx1ZV0sIGJvdGggaW5jbHVzaXZlLgogICAqLwogIHN0YXRpYyB2b2lkIGNoZWNrVmFsdWVJbkludGVydmFsKGludCB2YWx1ZSwgaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsCiAgICAgIFtTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2VdKSB7CiAgICBpZiAodmFsdWUgPCBtaW5WYWx1ZSB8fCB2YWx1ZSA+IG1heFZhbHVlKSB7CiAgICAgIHRocm93IFJhbmdlRXJyb3IucmFuZ2UodmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSwgbmFtZSwgbWVzc2FnZSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBDaGVjayB0aGF0IGEgdmFsdWUgaXMgYSB2YWxpZCBpbmRleCBpbnRvIGFuIGluZGV4YWJsZSBvYmplY3QuCiAgICoKICAgKiBUaHJvd3MgaWYgW2luZGV4XSBpcyBub3QgYSB2YWxpZCBpbmRleCBpbnRvIFtpbmRleGFibGVdLgogICAqCiAgICogQW4gaW5kZXhhYmxlIG9iamVjdCBpcyBvbmUgdGhhdCBoYXMgYSBgbGVuZ3RoYCBhbmQgYSBhbmQgaW5kZXgtb3BlcmF0b3IKICAgKiBgW11gIHRoYXQgYWNjZXB0cyBhbiBpbmRleCBpZiBgMCA8PSBpbmRleCA8IGxlbmd0aGAuCiAgICoKICAgKiBJZiBbbGVuZ3RoXSBpcyBwcm92aWRlZCwgaXQgaXMgdXNlZCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleGFibGUgb2JqZWN0LAogICAqIG90aGVyd2lzZSB0aGUgbGVuZ3RoIGlzIGZvdW5kIGFzIGBpbmRleGFibGUubGVuZ3RoYC4KICAgKi8KICBzdGF0aWMgdm9pZCBjaGVja1ZhbGlkSW5kZXgoaW50IGluZGV4LCBkeW5hbWljIGluZGV4YWJsZSwKICAgICAgW1N0cmluZyBuYW1lLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbWVzc2FnZV0pIHsKICAgIGxlbmd0aCA/Pz0gaW5kZXhhYmxlLmxlbmd0aDsKICAgIC8vIENvbXBhcmluZyB3aXRoIGAwYCBhcyByZWNlaXZlciBwcm9kdWNlcyBiZXR0ZXIgZGFydDJqcyB0eXBlIGluZmVyZW5jZS4KICAgIGlmICgwID4gaW5kZXggfHwgaW5kZXggPj0gbGVuZ3RoKSB7CiAgICAgIG5hbWUgPz89ICJpbmRleCI7CiAgICAgIHRocm93IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIGluZGV4YWJsZSwgbmFtZSwgbWVzc2FnZSwgbGVuZ3RoKTsKICAgIH0KICB9CgogIC8qKgogICAqIENoZWNrIHRoYXQgYSByYW5nZSByZXByZXNlbnRzIGEgc2xpY2Ugb2YgYW4gaW5kZXhhYmxlIG9iamVjdC4KICAgKgogICAqIFRocm93cyBpZiB0aGUgcmFuZ2UgaXMgbm90IHZhbGlkIGZvciBhbiBpbmRleGFibGUgb2JqZWN0IHdpdGgKICAgKiB0aGUgZ2l2ZW4gW2xlbmd0aF0uCiAgICogQSByYW5nZSBpcyB2YWxpZCBmb3IgYW4gaW5kZXhhYmxlIG9iamVjdCB3aXRoIGEgZ2l2ZW4gW2xlbmd0aF0KICAgKgogICAqIGlmIGAwIDw9IFtzdGFydF0gPD0gW2VuZF0gPD0gW2xlbmd0aF1gLgogICAqIEFuIGBlbmRgIG9mIGBudWxsYCBpcyBjb25zaWRlcmVkIGVxdWl2YWxlbnQgdG8gYGxlbmd0aGAuCiAgICoKICAgKiBUaGUgW3N0YXJ0TmFtZV0gYW5kIFtlbmROYW1lXSBkZWZhdWx0cyB0byBgInN0YXJ0ImAgYW5kIGAiZW5kImAsCiAgICogcmVzcGVjdGl2ZWx5LgogICAqCiAgICogUmV0dXJucyB0aGUgYWN0dWFsIGBlbmRgIHZhbHVlLCB3aGljaCBpcyBgbGVuZ3RoYCBpZiBgZW5kYCBpcyBgbnVsbGAsCiAgICogYW5kIGBlbmRgIG90aGVyd2lzZS4KICAgKi8KICBzdGF0aWMgaW50IGNoZWNrVmFsaWRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGludCBsZW5ndGgsCiAgICAgIFtTdHJpbmcgc3RhcnROYW1lLCBTdHJpbmcgZW5kTmFtZSwgU3RyaW5nIG1lc3NhZ2VdKSB7CiAgICAvLyBDb21wYXJpbmcgd2l0aCBgMGAgYXMgcmVjZWl2ZXIgcHJvZHVjZXMgYmV0dGVyIGRhcnQyanMgdHlwZSBpbmZlcmVuY2UuCiAgICAvLyBEaXR0byBgc3RhcnQgPiBlbmRgIGJlbG93LgogICAgaWYgKDAgPiBzdGFydCB8fCBzdGFydCA+IGxlbmd0aCkgewogICAgICBzdGFydE5hbWUgPz89ICJzdGFydCI7CiAgICAgIHRocm93IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIGxlbmd0aCwgc3RhcnROYW1lLCBtZXNzYWdlKTsKICAgIH0KICAgIGlmIChlbmQgIT0gbnVsbCkgewogICAgICBpZiAoc3RhcnQgPiBlbmQgfHwgZW5kID4gbGVuZ3RoKSB7CiAgICAgICAgZW5kTmFtZSA/Pz0gImVuZCI7CiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvci5yYW5nZShlbmQsIHN0YXJ0LCBsZW5ndGgsIGVuZE5hbWUsIG1lc3NhZ2UpOwogICAgICB9CiAgICAgIHJldHVybiBlbmQ7CiAgICB9CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KCiAgLyoqCiAgICogQ2hlY2sgdGhhdCBhbiBpbnRlZ2VyIHZhbHVlIGlzbid0IG5lZ2F0aXZlLgogICAqCiAgICogVGhyb3dzIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZS4KICAgKi8KICBzdGF0aWMgdm9pZCBjaGVja05vdE5lZ2F0aXZlKGludCB2YWx1ZSwgW1N0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZV0pIHsKICAgIGlmICh2YWx1ZSA8IDApIHRocm93IFJhbmdlRXJyb3IucmFuZ2UodmFsdWUsIDAsIG51bGwsIG5hbWUsIG1lc3NhZ2UpOwogIH0KCiAgU3RyaW5nIGdldCBfZXJyb3JOYW1lID0+ICJSYW5nZUVycm9yIjsKICBTdHJpbmcgZ2V0IF9lcnJvckV4cGxhbmF0aW9uIHsKICAgIGFzc2VydChfaGFzVmFsdWUpOwogICAgU3RyaW5nIGV4cGxhbmF0aW9uID0gIiI7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgewogICAgICBpZiAoZW5kICE9IG51bGwpIHsKICAgICAgICBleHBsYW5hdGlvbiA9ICI6IE5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJGVuZCI7CiAgICAgIH0KICAgICAgLy8gSWYgYm90aCBhcmUgbnVsbCwgd2UgZG9uJ3QgYWRkIGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpbWl0cy4KICAgIH0gZWxzZSBpZiAoZW5kID09IG51bGwpIHsKICAgICAgZXhwbGFuYXRpb24gPSAiOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICRzdGFydCI7CiAgICB9IGVsc2UgaWYgKGVuZCA+IHN0YXJ0KSB7CiAgICAgIGV4cGxhbmF0aW9uID0gIjogTm90IGluIHJhbmdlICRzdGFydC4uJGVuZCwgaW5jbHVzaXZlIjsKICAgIH0gZWxzZSBpZiAoZW5kIDwgc3RhcnQpIHsKICAgICAgZXhwbGFuYXRpb24gPSAiOiBWYWxpZCB2YWx1ZSByYW5nZSBpcyBlbXB0eSI7CiAgICB9IGVsc2UgewogICAgICAvLyBlbmQgPT0gc3RhcnQuCiAgICAgIGV4cGxhbmF0aW9uID0gIjogT25seSB2YWxpZCB2YWx1ZSBpcyAkc3RhcnQiOwogICAgfQogICAgcmV0dXJuIGV4cGxhbmF0aW9uOwogIH0KfQoKLyoqCiAqIEEgc3BlY2lhbGl6ZWQgW1JhbmdlRXJyb3JdIHVzZWQgd2hlbiBhbiBpbmRleCBpcyBub3QgaW4gdGhlIHJhbmdlCiAqIGAwLi5pbmRleGFibGUubGVuZ3RoLTFgLgogKgogKiBBbHNvIGNvbnRhaW5zIHRoZSBpbmRleGFibGUgb2JqZWN0LCBpdHMgbGVuZ3RoIGF0IHRoZSB0aW1lIG9mIHRoZSBlcnJvciwKICogYW5kIHRoZSBpbnZhbGlkIGluZGV4IGl0c2VsZi4KICovCmNsYXNzIEluZGV4RXJyb3IgZXh0ZW5kcyBBcmd1bWVudEVycm9yIGltcGxlbWVudHMgUmFuZ2VFcnJvciB7CiAgLyoqIFRoZSBpbmRleGFibGUgb2JqZWN0IHRoYXQgW2ludmFsaWRWYWx1ZV0gd2FzIG5vdCBhIHZhbGlkIGluZGV4IGludG8uICovCiAgZmluYWwgaW5kZXhhYmxlOwogIC8qKiBUaGUgbGVuZ3RoIG9mIFtpbmRleGFibGVdIGF0IHRoZSB0aW1lIG9mIHRoZSBlcnJvci4gKi8KICBmaW5hbCBpbnQgbGVuZ3RoOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtJbmRleEVycm9yXSBzdGF0aW5nIHRoYXQgW2ludmFsaWRWYWx1ZV0gaXMgbm90IGEgdmFsaWQgaW5kZXgKICAgKiBpbnRvIFtpbmRleGFibGVdLgogICAqCiAgICogVGhlIFtsZW5ndGhdIGlzIHRoZSBsZW5ndGggb2YgW2luZGV4YWJsZV0gYXQgdGhlIHRpbWUgb2YgdGhlIGVycm9yLgogICAqIElmIGBsZW5ndGhgIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBpbmRleGFibGUubGVuZ3RoYC4KICAgKgogICAqIFRoZSBtZXNzYWdlIGlzIHVzZWQgYXMgcGFydCBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvci4KICAgKi8KICBJbmRleEVycm9yKGludCBpbnZhbGlkVmFsdWUsIGR5bmFtaWMgaW5kZXhhYmxlLAogICAgICBbU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlLCBpbnQgbGVuZ3RoXSkKICAgICAgOiB0aGlzLmluZGV4YWJsZSA9IGluZGV4YWJsZSwKICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aCA/PyBpbmRleGFibGUubGVuZ3RoLAogICAgICAgIHN1cGVyLnZhbHVlKGludmFsaWRWYWx1ZSwgbmFtZSwKICAgICAgICAgICAgKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIkluZGV4IG91dCBvZiByYW5nZSIpOwoKICAvLyBHZXR0ZXJzIGluaGVyaXRlZCBmcm9tIFJhbmdlRXJyb3IuCiAgaW50IGdldCBzdGFydCA9PiAwOwogIGludCBnZXQgZW5kID0+IGxlbmd0aCAtIDE7CgogIFN0cmluZyBnZXQgX2Vycm9yTmFtZSA9PiAiUmFuZ2VFcnJvciI7CiAgU3RyaW5nIGdldCBfZXJyb3JFeHBsYW5hdGlvbiB7CiAgICBhc3NlcnQoX2hhc1ZhbHVlKTsKICAgIGludCBpbnZhbGlkVmFsdWUgPSB0aGlzLmludmFsaWRWYWx1ZTsKICAgIGlmIChpbnZhbGlkVmFsdWUgPCAwKSB7CiAgICAgIHJldHVybiAiOiBpbmRleCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSI7CiAgICB9CiAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuICI6IG5vIGluZGljZXMgYXJlIHZhbGlkIjsKICAgIH0KICAgIHJldHVybiAiOiBpbmRleCBzaG91bGQgYmUgbGVzcyB0aGFuICRsZW5ndGgiOwogIH0KfQoKLyoqCiAqIEVycm9yIHRocm93biB3aGVuIGNvbnRyb2wgcmVhY2hlcyB0aGUgZW5kIG9mIGEgc3dpdGNoIGNhc2UuCiAqCiAqIFRoZSBEYXJ0IHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhpcyBlcnJvciB0byBiZSB0aHJvd24gd2hlbgogKiBjb250cm9sIHJlYWNoZXMgdGhlIGVuZCBvZiBhIHN3aXRjaCBjYXNlIChleGNlcHQgdGhlIGxhc3QgY2FzZQogKiBvZiBhIHN3aXRjaCkgd2l0aG91dCBtZWV0aW5nIGEgYnJlYWsgb3Igc2ltaWxhciBlbmQgb2YgdGhlIGNvbnRyb2wKICogZmxvdy4KICovCmNsYXNzIEZhbGxUaHJvdWdoRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgRmFsbFRocm91Z2hFcnJvcigpOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBleHRlcm5hbCBGYWxsVGhyb3VnaEVycm9yLl9jcmVhdGUoU3RyaW5nIHVybCwgaW50IGxpbmUpOwoKICBleHRlcm5hbCBTdHJpbmcgdG9TdHJpbmcoKTsKfQoKLyoqCiAqIEVycm9yIHRocm93biB3aGVuIHRyeWluZyB0byBpbnN0YW50aWF0ZSBhbiBhYnN0cmFjdCBjbGFzcy4KICovCmNsYXNzIEFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIF9jbGFzc05hbWU7CiAgQWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcihTdHJpbmcgY2xhc3NOYW1lKSA6IF9jbGFzc05hbWUgPSBjbGFzc05hbWU7CgogIGV4dGVybmFsIFN0cmluZyB0b1N0cmluZygpOwp9CgovKioKICogRXJyb3IgdGhyb3duIGJ5IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFs6bm9TdWNoTWV0aG9kOl0gb24gW09iamVjdF0uCiAqLwpjbGFzcyBOb1N1Y2hNZXRob2RFcnJvciBleHRlbmRzIEVycm9yIHsKICAvKioKICAgKiBDcmVhdGUgYSBbTm9TdWNoTWV0aG9kRXJyb3JdIGNvcnJlc3BvbmRpbmcgdG8gYSBmYWlsZWQgbWV0aG9kIGNhbGwuCiAgICoKICAgKiBUaGUgW3JlY2VpdmVyXSBpcyB0aGUgcmVjZWl2ZXIgb2YgdGhlIG1ldGhvZCBjYWxsLgogICAqIFRoYXQgaXMsIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgYXR0ZW1wdGVkIGNhbGxlZC4KICAgKgogICAqIFRoZSBbaW52b2NhdGlvbl0gcmVwcmVzZW50cyB0aGUgbWV0aG9kIGNhbGwgdGhhdCBmYWlsZWQuIEl0CiAgICogc2hvdWxkIG5vdCBiZSBgbnVsbGAuCiAgICovCiAgZXh0ZXJuYWwgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24oCiAgICAgIE9iamVjdCByZWNlaXZlciwgSW52b2NhdGlvbiBpbnZvY2F0aW9uKTsKCiAgLy8gRGVwcmVjYXRlZCBjb25zdHJ1Y3RvciB0byBiZSByZW1vdmVkIGFmdGVyIGRhcnQyanMgdXBkYXRlcyB0byB0aGUgYWJvdmUuCiAgLyoqCiAgICogQ3JlYXRlIGEgW05vU3VjaE1ldGhvZEVycm9yXSBjb3JyZXNwb25kaW5nIHRvIGEgZmFpbGVkIG1ldGhvZCBjYWxsLgogICAqCiAgICogVGhlIFtyZWNlaXZlcl0gaXMgdGhlIHJlY2VpdmVyIG9mIHRoZSBtZXRob2QgY2FsbC4KICAgKiBUaGF0IGlzLCB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGF0dGVtcHRlZCBjYWxsZWQuCiAgICogSWYgdGhlIHJlY2VpdmVyIGlzIGBudWxsYCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBjYWxsIHRvIGEgdG9wLWxldmVsCiAgICogZnVuY3Rpb24gb2YgYSBsaWJyYXJ5LgogICAqCiAgICogVGhlIFttZW1iZXJOYW1lXSBpcyBhIFtTeW1ib2xdIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgY2FsbGVkIG1ldGhvZAogICAqIG9yIGFjY2Vzc29yLiBJdCBzaG91bGQgbm90IGJlIGBudWxsYC4KICAgKgogICAqIFRoZSBbcG9zaXRpb25hbEFyZ3VtZW50c10gaXMgYSBsaXN0IG9mIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHRoZQogICAqIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGguIElmIGBudWxsYCwgaXQgaXMgY29uc2lkZXJlZCBlcXVpdmFsZW50IHRvIHRoZQogICAqIGVtcHR5IGxpc3QuCiAgICoKICAgKiBUaGUgW25hbWVkQXJndW1lbnRzXSBpcyBhIG1hcCBmcm9tIFtTeW1ib2xdcyB0byB0aGUgdmFsdWVzIG9mIG5hbWVkCiAgICogYXJndW1lbnRzIHRoYXQgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGguCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGRvZXMgbm90IGhhbmRsZSB0eXBlIGFyZ3VtZW50cy4KICAgKiBUbyBpbmNsdWRlIHR5cGUgdmFyaWFibGVzLCBjcmVhdGUgYW4gW0ludm9jYXRpb25dIGFuZCB1c2UKICAgKiBbTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb25dLgogICAqLwogIEBEZXByZWNhdGVkKCJVc2UgTm9TdWNoTWV0aG9kLndpdGhJbnZvY2F0aW9uIGluc3RlYWQiKQogIGV4dGVybmFsIE5vU3VjaE1ldGhvZEVycm9yKE9iamVjdCByZWNlaXZlciwgU3ltYm9sIG1lbWJlck5hbWUsCiAgICAgIExpc3QgcG9zaXRpb25hbEFyZ3VtZW50cywgTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHMsCiAgICAgIFtAZGVwcmVjYXRlZCBMaXN0IGV4aXN0aW5nQXJndW1lbnROYW1lc10pOwoKICBleHRlcm5hbCBTdHJpbmcgdG9TdHJpbmcoKTsKfQoKLyoqCiAqIFRoZSBvcGVyYXRpb24gd2FzIG5vdCBhbGxvd2VkIGJ5IHRoZSBvYmplY3QuCiAqCiAqIFRoaXMgW0Vycm9yXSBpcyB0aHJvd24gd2hlbiBhbiBpbnN0YW5jZSBjYW5ub3QgaW1wbGVtZW50IG9uZSBvZiB0aGUgbWV0aG9kcwogKiBpbiBpdHMgc2lnbmF0dXJlLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBVbnN1cHBvcnRlZEVycm9yIGV4dGVuZHMgRXJyb3IgewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBVbnN1cHBvcnRlZEVycm9yKHRoaXMubWVzc2FnZSk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJG1lc3NhZ2UiOwp9CgovKioKICogVGhyb3duIGJ5IG9wZXJhdGlvbnMgdGhhdCBoYXZlIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldC4KICoKICogVGhpcyBbRXJyb3JdIGlzIHRocm93biBieSB1bmZpbmlzaGVkIGNvZGUgdGhhdCBoYXNuJ3QgeWV0IGltcGxlbWVudGVkCiAqIGFsbCB0aGUgZmVhdHVyZXMgaXQgbmVlZHMuCiAqCiAqIElmIGEgY2xhc3MgaXMgbm90IGludGVuZGluZyB0byBpbXBsZW1lbnQgdGhlIGZlYXR1cmUsIGl0IHNob3VsZCB0aHJvdwogKiBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaW5zdGVhZC4gVGhpcyBlcnJvciBpcyBvbmx5IGludGVuZGVkIGZvcgogKiB1c2UgZHVyaW5nIGRldmVsb3BtZW50LgogKi8KY2xhc3MgVW5pbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRXJyb3IgaW1wbGVtZW50cyBVbnN1cHBvcnRlZEVycm9yIHsKICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKICBVbmltcGxlbWVudGVkRXJyb3IoW3RoaXMubWVzc2FnZV0pOwogIFN0cmluZyB0b1N0cmluZygpID0+ICh0aGlzLm1lc3NhZ2UgIT0gbnVsbAogICAgICA/ICJVbmltcGxlbWVudGVkRXJyb3I6ICRtZXNzYWdlIgogICAgICA6ICJVbmltcGxlbWVudGVkRXJyb3IiKTsKfQoKLyoqCiAqIFRoZSBvcGVyYXRpb24gd2FzIG5vdCBhbGxvd2VkIGJ5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBvYmplY3QuCiAqCiAqIFRoaXMgaXMgYSBnZW5lcmljIGVycm9yIHVzZWQgZm9yIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgZXJyb25lb3VzCiAqIGFjdGlvbnMuIFRoZSBtZXNzYWdlIHNob3VsZCBiZSBkZXNjcmlwdGl2ZS4KICovCmNsYXNzIFN0YXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgU3RhdGVFcnJvcih0aGlzLm1lc3NhZ2UpOwogIFN0cmluZyB0b1N0cmluZygpID0+ICJCYWQgc3RhdGU6ICRtZXNzYWdlIjsKfQoKLyoqCiAqIEVycm9yIG9jY3VycmluZyB3aGVuIGEgY29sbGVjdGlvbiBpcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLgogKgogKiBTb21lIG1vZGlmaWNhdGlvbnMgbWF5IGJlIGFsbG93ZWQgZm9yIHNvbWUgY29sbGVjdGlvbnMsIHNvIGVhY2ggY29sbGVjdGlvbgogKiAoW0l0ZXJhYmxlXSBvciBzaW1pbGFyIGNvbGxlY3Rpb24gb2YgdmFsdWVzKSBzaG91bGQgZGVjbGFyZSB3aGljaCBvcGVyYXRpb25zCiAqIGFyZSBhbGxvd2VkIGR1cmluZyBhbiBpdGVyYXRpb24uCiAqLwpjbGFzcyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgLyoqIFRoZSBvYmplY3QgdGhhdCB3YXMgbW9kaWZpZWQgaW4gYW4gaW5jb21wYXRpYmxlIHdheS4gKi8KICBmaW5hbCBPYmplY3QgbW9kaWZpZWRPYmplY3Q7CgogIENvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcihbdGhpcy5tb2RpZmllZE9iamVjdF0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAobW9kaWZpZWRPYmplY3QgPT0gbnVsbCkgewogICAgICByZXR1cm4gIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIjsKICAgIH0KICAgIHJldHVybiAiQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogIgogICAgICAgICIke0Vycm9yLnNhZmVUb1N0cmluZyhtb2RpZmllZE9iamVjdCl9LiI7CiAgfQp9CgpjbGFzcyBPdXRPZk1lbW9yeUVycm9yIGltcGxlbWVudHMgRXJyb3IgewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBPdXRPZk1lbW9yeUVycm9yKCk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIk91dCBvZiBNZW1vcnkiOwoKICBTdGFja1RyYWNlIGdldCBzdGFja1RyYWNlID0+IG51bGw7Cn0KCmNsYXNzIFN0YWNrT3ZlcmZsb3dFcnJvciBpbXBsZW1lbnRzIEVycm9yIHsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgY29uc3QgU3RhY2tPdmVyZmxvd0Vycm9yKCk7CiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlN0YWNrIE92ZXJmbG93IjsKCiAgU3RhY2tUcmFjZSBnZXQgc3RhY2tUcmFjZSA9PiBudWxsOwp9CgovKioKICogRXJyb3IgdGhyb3duIHdoZW4gYSBsYXppbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGUgY2Fubm90IGJlIGluaXRpYWxpemVkLgogKgogKiBBIHN0YXRpYy9saWJyYXJ5IHZhcmlhYmxlIHdpdGggYW4gaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiBpcyBpbml0aWFsaXplZAogKiB0aGUgZmlyc3QgdGltZSBpdCBpcyByZWFkLiBJZiBldmFsdWF0aW5nIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIGNhdXNlcwogKiBhbm90aGVyIHJlYWQgb2YgdGhlIHZhcmlhYmxlLCB0aGlzIGVycm9yIGlzIHRocm93bi4KICovCmNsYXNzIEN5Y2xpY0luaXRpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgZmluYWwgU3RyaW5nIHZhcmlhYmxlTmFtZTsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvcihbdGhpcy52YXJpYWJsZU5hbWVdKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiB2YXJpYWJsZU5hbWUgPT0gbnVsbAogICAgICA/ICJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIgogICAgICA6ICJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnJHZhcmlhYmxlTmFtZScgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbiI7Cn0Kgk4ATk48ARMBBDoDRhgDPy8zAz8sOwMyQDJIAyszQScyAyUDRgNFEQNDNB83RTlRMgMwNCMyIzZKMQM4NgMuPkBERTdNBA4kAQY3BU0WBi49IAYcKgYkBAFOPQE5ASYCAQRGBCUxGCIrAgEEQwQqAQRDBCEBBDMEJhwVKQIBBEQEJCUYHBY1FSkRAQY1BUVNEwYcIB0bFQEGMwVBPgUnBUdKSUsGHDgeGgEGTQYlGyYdAQYlBhA9PQQBPUkmARYcGB8GRTYjSSw6LwQCAQQ9BCk+Ez4RAUsmBjkGHBoWFBgBBkUFQ0USBj0WFBVOAQZKBURGFQVHGQVDRRIGHEElGhgVUAEGShcFQ0USBUlABjk/AQY3BS9EBkonMEgGBAEGQwU+BU06BVA6BjwzIU4oGEcGBAEGQwVDGUQFLT4FRhMFSxoGPTxOIicdRAYXKRtGCBIGEwQBBjEFJgZLSgQBKSEXHRkZOghFHj0ePh40DRc0BhgEAgEERRwDTCEEP04TPRQBBlEXBUlABUwGMjEkMihBASgWHQEpIRcqHC0GFycGMgQCAQQ/A0BCRgkEJxYcOwEeAgEEPgQ2G04BHgIBBE8EKAZJBThDBUEbBi0vAU4GSQU4Q0scBU8rBU5LEQVJMAU2PykGOUFFMQEeAgEEMANPFQQaJxgcIjoCAQQ8A0keA0lCGwRFGCYtJx8CAQRFA0UvBCEYHC4CAQRDA05QJAQyPh8BNgEWIjoGODIEAgEqHBwoASUCASwcHikBJQIBBEoDS043BDAdHDIsPE0CARVkYXJ0OmNvcmUvZXJyb3JzLmRhcnQwb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvZXhjZXB0aW9ucy5kYXJ0l44vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovLyBFeGNlcHRpb25zIGFyZSB0aHJvd24gZWl0aGVyIGJ5IHRoZSBWTSBvciBmcm9tIERhcnQgY29kZS4KCi8qKgogKiBBIG1hcmtlciBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIGNvcmUgbGlicmFyeSBleGNlcHRpb25zLgogKgogKiBBbiBbRXhjZXB0aW9uXSBpcyBpbnRlbmRlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgYWJvdXQgYSBmYWlsdXJlLAogKiBzbyB0aGF0IHRoZSBlcnJvciBjYW4gYmUgYWRkcmVzc2VkIHByb2dyYW1tYXRpY2FsbHkuIEl0IGlzIGludGVuZGVkIHRvIGJlCiAqIGNhdWdodCwgYW5kIGl0IHNob3VsZCBjb250YWluIHVzZWZ1bCBkYXRhIGZpZWxkcy4KICoKICogQ3JlYXRpbmcgaW5zdGFuY2VzIG9mIFtFeGNlcHRpb25dIGRpcmVjdGx5IHdpdGggWzpuZXcgRXhjZXB0aW9uKCJtZXNzYWdlIik6XQogKiBpcyBkaXNjb3VyYWdlZCwgYW5kIG9ubHkgaW5jbHVkZWQgYXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSBkdXJpbmcgZGV2ZWxvcG1lbnQsCiAqIHVudGlsIHRoZSBhY3R1YWwgZXhjZXB0aW9ucyB1c2VkIGJ5IGEgbGlicmFyeSBhcmUgZG9uZS4KICovCmFic3RyYWN0IGNsYXNzIEV4Y2VwdGlvbiB7CiAgZmFjdG9yeSBFeGNlcHRpb24oW3ZhciBtZXNzYWdlXSkgPT4gX0V4Y2VwdGlvbihtZXNzYWdlKTsKfQoKLyoqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgW0V4Y2VwdGlvbl0gd2hpY2ggY2FycmllcyBhIG1lc3NhZ2UuICovCmNsYXNzIF9FeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIGZpbmFsIG1lc3NhZ2U7CgogIF9FeGNlcHRpb24oW3RoaXMubWVzc2FnZV0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICBpZiAobWVzc2FnZSA9PSBudWxsKSByZXR1cm4gIkV4Y2VwdGlvbiI7CiAgICByZXR1cm4gIkV4Y2VwdGlvbjogJG1lc3NhZ2UiOwogIH0KfQoKLyoqCiAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIHN0cmluZyBvciBzb21lIG90aGVyIGRhdGEgZG9lcyBub3QgaGF2ZSBhbiBleHBlY3RlZAogKiBmb3JtYXQgYW5kIGNhbm5vdCBiZSBwYXJzZWQgb3IgcHJvY2Vzc2VkLgogKi8KY2xhc3MgRm9ybWF0RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICAvKioKICAgKiBBIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZm9ybWF0IGVycm9yLgogICAqLwogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwoKICAvKioKICAgKiBUaGUgYWN0dWFsIHNvdXJjZSBpbnB1dCB3aGljaCBjYXVzZWQgdGhlIGVycm9yLgogICAqCiAgICogVGhpcyBpcyB1c3VhbGx5IGEgW1N0cmluZ10sIGJ1dCBjYW4gYmUgb3RoZXIgdHlwZXMgdG9vLgogICAqIElmIGl0IGlzIGEgc3RyaW5nLCBwYXJ0cyBvZiBpdCBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIFt0b1N0cmluZ10gbWVzc2FnZS4KICAgKgogICAqIFRoZSBzb3VyY2UgaXMgYG51bGxgIGlmIG9taXR0ZWQgb3IgdW5rbm93bi4KICAgKi8KICBmaW5hbCBzb3VyY2U7CgogIC8qKgogICAqIFRoZSBvZmZzZXQgaW4gW3NvdXJjZV0gd2hlcmUgdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4KICAgKgogICAqIEEgemVyby1iYXNlZCBvZmZzZXQgaW50byB0aGUgc291cmNlIHRoYXQgbWFya3MgdGhlIGZvcm1hdCBlcnJvciBjYXVzaW5nCiAgICogdGhpcyBleGNlcHRpb24gdG8gYmUgY3JlYXRlZC4gSWYgYHNvdXJjZWAgaXMgYSBzdHJpbmcsIHRoaXMgc2hvdWxkIGJlIGEKICAgKiBzdHJpbmcgaW5kZXggaW4gdGhlIHJhbmdlIGAwIDw9IG9mZnNldCA8PSBzb3VyY2UubGVuZ3RoYC4KICAgKgogICAqIElmIGlucHV0IGlzIGEgc3RyaW5nLCB0aGUgW3RvU3RyaW5nXSBtZXRob2QgbWF5IHJlcHJlc2VudCB0aGlzIG9mZnNldCBhcwogICAqIGEgbGluZSBhbmQgY2hhcmFjdGVyIHBvc2l0aW9uLiBUaGUgb2Zmc2V0IHNob3VsZCBiZSBpbnNpZGUgdGhlIHN0cmluZywKICAgKiBvciBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBNYXkgYmUgb21pdHRlZC4gSWYgcHJlc2VudCwgW3NvdXJjZV0gc2hvdWxkIGFsc28gYmUgcHJlc2VudCBpZiBwb3NzaWJsZS4KICAgKi8KICBmaW5hbCBpbnQgb2Zmc2V0OwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdEV4Y2VwdGlvbiB3aXRoIGFuIG9wdGlvbmFsIGVycm9yIFttZXNzYWdlXS4KICAgKgogICAqIE9wdGlvbmFsbHkgYWxzbyBzdXBwbHkgdGhlIGFjdHVhbCBbc291cmNlXSB3aXRoIHRoZSBpbmNvcnJlY3QgZm9ybWF0LAogICAqIGFuZCB0aGUgW29mZnNldF0gaW4gdGhlIGZvcm1hdCB3aGVyZSBhIHByb2JsZW0gd2FzIGRldGVjdGVkLgogICAqLwogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBGb3JtYXRFeGNlcHRpb24oW3RoaXMubWVzc2FnZSA9ICIiLCB0aGlzLnNvdXJjZSwgdGhpcy5vZmZzZXRdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQgZXhjZXB0aW9uLgogICAqCiAgICogVGhlIGRlc2NyaXB0aW9uIGFsd2F5cyBjb250YWlucyB0aGUgW21lc3NhZ2VdLgogICAqCiAgICogSWYgW3NvdXJjZV0gaXMgcHJlc2VudCBhbmQgaXMgYSBzdHJpbmcsIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGNvbnRhaW4KICAgKiAoYXQgbGVhc3QgYSBwYXJ0IG9mKSB0aGUgc291cmNlLgogICAqIElmIFtvZmZzZXRdIGlzIGFsc28gcHJvdmlkZWQsIHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2UgaW5jbHVkZWQgd2lsbAogICAqIGNvbnRhaW4gdGhhdCBvZmZzZXQsIGFuZCB0aGUgb2Zmc2V0IHdpbGwgYmUgbWFya2VkLgogICAqCiAgICogSWYgdGhlIHNvdXJjZSBpcyBhIHN0cmluZyBhbmQgaXQgY29udGFpbnMgYSBsaW5lIGJyZWFrIGJlZm9yZSBvZmZzZXQsCiAgICogb25seSB0aGUgbGluZSBjb250YWluaW5nIG9mZnNldCB3aWxsIGJlIGluY2x1ZGVkLCBhbmQgaXRzIGxpbmUgbnVtYmVyCiAgICogd2lsbCBhbHNvIGJlIHBhcnQgb2YgdGhlIGRlc2NyaXB0aW9uLiBMaW5lIGFuZCBjaGFyYWN0ZXIgb2Zmc2V0cyBhcmUKICAgKiAxLWJhc2VkLgogICAqLwogIFN0cmluZyB0b1N0cmluZygpIHsKICAgIFN0cmluZyByZXBvcnQgPSAiRm9ybWF0RXhjZXB0aW9uIjsKICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgIiIgIT0gbWVzc2FnZSkgewogICAgICByZXBvcnQgPSAiJHJlcG9ydDogJG1lc3NhZ2UiOwogICAgfQogICAgaW50IG9mZnNldCA9IHRoaXMub2Zmc2V0OwogICAgT2JqZWN0IG9iamVjdFNvdXJjZSA9IHRoaXMuc291cmNlOwogICAgaWYgKG9iamVjdFNvdXJjZSBpcyBTdHJpbmcpIHsKICAgICAgU3RyaW5nIHNvdXJjZSA9IG9iamVjdFNvdXJjZTsKICAgICAgaWYgKG9mZnNldCAhPSBudWxsICYmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHNvdXJjZS5sZW5ndGgpKSB7CiAgICAgICAgb2Zmc2V0ID0gbnVsbDsKICAgICAgfQogICAgICAvLyBTb3VyY2UgaXMgc3RyaW5nIGFuZCBvZmZzZXQgaXMgbnVsbCBvciB2YWxpZC4KICAgICAgaWYgKG9mZnNldCA9PSBudWxsKSB7CiAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGggPiA3OCkgewogICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCA3NSkgKyAiLi4uIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICIkcmVwb3J0XG4kc291cmNlIjsKICAgICAgfQogICAgICBpbnQgbGluZU51bSA9IDE7CiAgICAgIGludCBsaW5lU3RhcnQgPSAwOwogICAgICBib29sIHByZXZpb3VzQ2hhcldhc0NSID0gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIHsKICAgICAgICBpbnQgY2hhciA9IHNvdXJjZS5jb2RlVW5pdEF0KGkpOwogICAgICAgIGlmIChjaGFyID09IDB4MGEpIHsKICAgICAgICAgIGlmIChsaW5lU3RhcnQgIT0gaSB8fCAhcHJldmlvdXNDaGFyV2FzQ1IpIHsKICAgICAgICAgICAgbGluZU51bSsrOwogICAgICAgICAgfQogICAgICAgICAgbGluZVN0YXJ0ID0gaSArIDE7CiAgICAgICAgICBwcmV2aW91c0NoYXJXYXNDUiA9IGZhbHNlOwogICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAweDBkKSB7CiAgICAgICAgICBsaW5lTnVtKys7CiAgICAgICAgICBsaW5lU3RhcnQgPSBpICsgMTsKICAgICAgICAgIHByZXZpb3VzQ2hhcldhc0NSID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGxpbmVOdW0gPiAxKSB7CiAgICAgICAgcmVwb3J0ICs9ICIgKGF0IGxpbmUgJGxpbmVOdW0sIGNoYXJhY3RlciAke29mZnNldCAtIGxpbmVTdGFydCArIDF9KVxuIjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBvcnQgKz0gIiAoYXQgY2hhcmFjdGVyICR7b2Zmc2V0ICsgMX0pXG4iOwogICAgICB9CiAgICAgIGludCBsaW5lRW5kID0gc291cmNlLmxlbmd0aDsKICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgewogICAgICAgIGludCBjaGFyID0gc291cmNlLmNvZGVVbml0QXQoaSk7CiAgICAgICAgaWYgKGNoYXIgPT0gMHgwYSB8fCBjaGFyID09IDB4MGQpIHsKICAgICAgICAgIGxpbmVFbmQgPSBpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGludCBsZW5ndGggPSBsaW5lRW5kIC0gbGluZVN0YXJ0OwogICAgICBpbnQgc3RhcnQgPSBsaW5lU3RhcnQ7CiAgICAgIGludCBlbmQgPSBsaW5lRW5kOwogICAgICBTdHJpbmcgcHJlZml4ID0gIiI7CiAgICAgIFN0cmluZyBwb3N0Zml4ID0gIiI7CiAgICAgIGlmIChsZW5ndGggPiA3OCkgewogICAgICAgIC8vIENhbid0IHNob3cgZW50aXJlIGxpbmUuIFRyeSB0byBhbmNob3IgYXQgdGhlIG5lYXJlc3QgZW5kLCBpZgogICAgICAgIC8vIG9uZSBpcyB3aXRoaW4gcmVhY2guCiAgICAgICAgaW50IGluZGV4ID0gb2Zmc2V0IC0gbGluZVN0YXJ0OwogICAgICAgIGlmIChpbmRleCA8IDc1KSB7CiAgICAgICAgICBlbmQgPSBzdGFydCArIDc1OwogICAgICAgICAgcG9zdGZpeCA9ICIuLi4iOwogICAgICAgIH0gZWxzZSBpZiAoZW5kIC0gb2Zmc2V0IDwgNzUpIHsKICAgICAgICAgIHN0YXJ0ID0gZW5kIC0gNzU7CiAgICAgICAgICBwcmVmaXggPSAiLi4uIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTmVpdGhlciBlbmQgaXMgbmVhciwganVzdCBwaWNrIGFuIGFyZWEgYXJvdW5kIHRoZSBvZmZzZXQuCiAgICAgICAgICBzdGFydCA9IG9mZnNldCAtIDM2OwogICAgICAgICAgZW5kID0gb2Zmc2V0ICsgMzY7CiAgICAgICAgICBwcmVmaXggPSBwb3N0Zml4ID0gIi4uLiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIFN0cmluZyBzbGljZSA9IHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgIGludCBtYXJrT2Zmc2V0ID0gb2Zmc2V0IC0gc3RhcnQgKyBwcmVmaXgubGVuZ3RoOwogICAgICByZXR1cm4gIiRyZXBvcnQkcHJlZml4JHNsaWNlJHBvc3RmaXhcbiR7IiAiICogbWFya09mZnNldH1eXG4iOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIHNvdXJjZSBpcyBub3QgYSBzdHJpbmcuCiAgICAgIGlmIChvZmZzZXQgIT0gbnVsbCkgewogICAgICAgIHJlcG9ydCArPSAiIChhdCBvZmZzZXQgJG9mZnNldCkiOwogICAgICB9CiAgICAgIHJldHVybiByZXBvcnQ7CiAgICB9CiAgfQp9CgovLyBFeGNlcHRpb24gdGhyb3duIHdoZW4gZG9pbmcgaW50ZWdlciBkaXZpc2lvbiB3aXRoIGEgemVybyBkaXZpc29yLgpjbGFzcyBJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb24gewogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKICBjb25zdCBJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24oKTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiSW50ZWdlckRpdmlzaW9uQnlaZXJvRXhjZXB0aW9uIjsKfQqAugBOTjwBEwE9AQRCA1FNNQNQUDsEGzsCAUYoEQEeARYtIgQCAQRPLQQtBiwGGAEGNQU9TwUxBhABBjoFTU0/BU5MIgVOBhQBBkUFS0IGHEgBBjQFNAVKJkg5BUtLSg4GFicsJAYeJyIkRhcINxwiNAojCBcZJikpHDYXDB0lIxUdJAoIGVAPNQgjNSksFxEKCCgdGRobGUggKBocGygcGhFHHx0kCggzN0UNJRwqCBUGBAIBRTwcKjkCARlkYXJ0OmNvcmUvZXhjZXB0aW9ucy5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2Z1bmN0aW9uLmRhcnSJoS8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIGZ1bmN0aW9uIHR5cGVzLgogKgogKiBBIGZ1bmN0aW9uIHZhbHVlLCBvciBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdpdGggYSAiY2FsbCIgbWV0aG9kLCBpcyBhCiAqIHN1YnR5cGUgb2YgYSBmdW5jdGlvbiB0eXBlLCBhbmQgYXMgc3VjaCwgYSBzdWJ0eXBlIG9mIFtGdW5jdGlvbl0uCiAqLwphYnN0cmFjdCBjbGFzcyBGdW5jdGlvbiB7CiAgLyoqCiAgICogRHluYW1pY2FsbHkgY2FsbCBbZnVuY3Rpb25dIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCiAgICoKICAgKiBBY3RzIHRoZSBzYW1lIGFzIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCBwb3NpdGlvbmFsIGFyZ3VtZW50cwogICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnRzIG9mIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBhbmQKICAgKiBuYW1lZCBhcmd1bWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudHMgb2YgW25hbWVkQXJndW1lbnRzXS4KICAgKgogICAqIFRoaXMgaW5jbHVkZXMgZ2l2aW5nIHRoZSBzYW1lIGVycm9ycyBpZiBbZnVuY3Rpb25dIGlzbid0IGNhbGxhYmxlIG9yCiAgICogaWYgaXQgZXhwZWN0cyBkaWZmZXJlbnQgcGFyYW1ldGVycy4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogRnVuY3Rpb24uYXBwbHkoZm9vLCBbMSwyLDNdLCB7I2Y6IDQsICNnOiA1fSk7CiAgICogYGBgCiAgICoKICAgKiBnaXZlcyBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdCBhcwogICAqIGBgYAogICAqIGZvbygxLCAyLCAzLCBmOiA0LCBnOiA1KS4KICAgKiBgYGAKICAgKgogICAqIElmIFtwb3NpdGlvbmFsQXJndW1lbnRzXSBpcyBudWxsLCBpdCdzIGNvbnNpZGVyZWQgYW4gZW1wdHkgbGlzdC4KICAgKiBJZiBbbmFtZWRBcmd1bWVudHNdIGlzIG9taXR0ZWQgb3IgbnVsbCwgaXQgaXMgY29uc2lkZXJlZCBhbiBlbXB0eSBtYXAuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIGFwcGx5KEZ1bmN0aW9uIGZ1bmN0aW9uLCBMaXN0IHBvc2l0aW9uYWxBcmd1bWVudHMsCiAgICAgIFtNYXA8U3ltYm9sLCBkeW5hbWljPiBuYW1lZEFyZ3VtZW50c10pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGBvcGVyYXRvcj09YC4KICAgKi8KICBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKioKICAgKiBUZXN0IHdoZXRoZXIgYW5vdGhlciBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBmdW5jdGlvbi4KICAgKgogICAqIFN5c3RlbS1jcmVhdGVkIGZ1bmN0aW9uIG9iamVjdHMgYXJlIG9ubHkgZXF1YWwgdG8gb3RoZXIgZnVuY3Rpb25zLgogICAqCiAgICogVHdvIGZ1bmN0aW9uIG9iamVjdHMgYXJlIGtub3duIHRvIHJlcHJlc2VudCB0aGUgc2FtZSBmdW5jdGlvbiBpZgogICAqCiAgICogLSBJdCBpcyB0aGUgc2FtZSBvYmplY3QuIFN0YXRpYyBhbmQgdG9wLWxldmVsIGZ1bmN0aW9ucyBhcmUgY29tcGlsZSB0aW1lCiAgICogICBjb25zdGFudHMgd2hlbiB1c2VkIGFzIHZhbHVlcywgc28gcmVmZXJyaW5nIHRvIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlCiAgICogICBhbHdheXMgZ2l2ZSB0aGUgc2FtZSBvYmplY3QsCiAgICogLSBvciBpZiB0aGV5IHJlZmVyIHRvIHRoZSBzYW1lIG1lbWJlciBtZXRob2QgZXh0cmFjdGVkIGZyb20gdGhlIHNhbWUgb2JqZWN0LgogICAqICAgRXh0cmFjdGluZyBhIG1lbWJlciBtZXRob2QgYXMgYSBmdW5jdGlvbiB2YWx1ZSB0d2ljZSBnaXZlcyBlcXVhbCwgYnV0CiAgICogICBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLCBmdW5jdGlvbiB2YWx1ZXMuCiAgICoKICAgKiBGdW5jdGlvbiBleHByZXNzaW9ucyBuZXZlciBnaXZlIHJpc2UgdG8gZXF1YWwgZnVuY3Rpb24gb2JqZWN0cy4gRWFjaCB0aW1lCiAgICogYSBmdW5jdGlvbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgaXQgY3JlYXRlcyBhIG5ldyBjbG9zdXJlIHZhbHVlIHRoYXQKICAgKiBpcyBub3Qga25vd24gdG8gYmUgZXF1YWwgdG8gb3RoZXIgY2xvc3VyZXMgY3JlYXRlZCBieSB0aGUgc2FtZSBleHByZXNzaW9uLgogICAqCiAgICogQ2xhc3NlcyBpbXBsZW1lbnRpbmcgYEZ1bmN0aW9uYCBieSBoYXZpbmcgYSBgY2FsbGAgbWV0aG9kIHNob3VsZCBoYXZlIHRoZWlyCiAgICogb3duIGBvcGVyYXRvcj09YCBhbmQgYGhhc2hDb2RlYCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdC4KICAgKi8KICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7Cn0KRQBOTjwBEwEEKgNKRQQaBj8FQUBIBUopBQ4JMwkFJgkfCQVGTAZFLgEGRQYUAQY8BUgFRgVOTiRSTTMFT01QBVE+BiICARdkYXJ0OmNvcmUvZnVuY3Rpb24uZGFydClvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9pbnQuZGFydK4rLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGludGVnZXIgbnVtYmVyLgogKgogKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgaW50YCBpcyA2NC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VycwogKiB3aXRoIG9wZXJhdGlvbnMgdGhhdCB3cmFwIHRvIHRoYXQgcmFuZ2Ugb24gb3ZlcmZsb3cuCiAqCiAqICoqTm90ZToqKiBXaGVuIGNvbXBpbGluZyB0byBKYXZhU2NyaXB0LCBpbnRlZ2VycyBhcmUgcmVzdHJpY3RlZCB0byB2YWx1ZXMKICogdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBieSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KICogVGhlIGF2YWlsYWJsZSBpbnRlZ2VyIHZhbHVlcyBpbmNsdWRlIGFsbCBpbnRlZ2VycyBiZXR3ZWVuIC0yXjUzIGFuZCAyXjUzLAogKiBhbmQgc29tZSBpbnRlZ2VycyB3aXRoIGxhcmdlciBtYWduaXR1ZGUuIFRoYXQgaW5jbHVkZXMgc29tZSBpbnRlZ2VycyBsYXJnZXIKICogdGhhbiAyXjYzLgogKiBUaGUgYmVoYXZpb3Igb2YgdGhlIG9wZXJhdG9ycyBhbmQgbWV0aG9kcyBpbiB0aGUgW2ludF0KICogY2xhc3MgdGhlcmVmb3JlIHNvbWV0aW1lcyBkaWZmZXJzIGJldHdlZW4gdGhlIERhcnQgVk0gYW5kIERhcnQgY29kZQogKiBjb21waWxlZCB0byBKYXZhU2NyaXB0LiBGb3IgZXhhbXBsZSwgdGhlIGJpdHdpc2Ugb3BlcmF0b3JzIHRydW5jYXRlIHRoZWlyCiAqIG9wZXJhbmRzIHRvIDMyLWJpdCBpbnRlZ2VycyB3aGVuIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQuCiAqCiAqIENsYXNzZXMgY2Fubm90IGV4dGVuZCwgaW1wbGVtZW50LCBvciBtaXggaW4gYGludGAuCiAqLwphYnN0cmFjdCBjbGFzcyBpbnQgZXh0ZW5kcyBudW0gewogIC8qKgogICAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50IGRlY2xhcmF0aW9uIFtuYW1lXS4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgd291bGQgYmUgcmV0dXJuZWQgYnk6CiAgICogYGBgCiAgICogaW50LnRyeVBhcnNlKGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQobmFtZSwgZGVmYXVsdFZhbHVlOiAiIikpCiAgICogICAgID8/IGRlZmF1bHRWYWx1ZQogICAqIGBgYAogICAqIEV4YW1wbGU6CiAgICogYGBgCiAgICogY29uc3QgaW50LmZyb21FbnZpcm9ubWVudCgiZGVmYXVsdFBvcnQiLCBkZWZhdWx0VmFsdWU6IDgwKQogICAqIGBgYAogICAqLwogIC8vIFRoZSAuZnJvbUVudmlyb25tZW50KCkgY29uc3RydWN0b3JzIGFyZSBzcGVjaWFsIGluIHRoYXQgd2UgZG8gbm90IHdhbnQKICAvLyB1c2VycyB0byBjYWxsIHRoZW0gdXNpbmcgIm5ldyIuIFdlIHByb2hpYml0IHRoYXQgYnkgZ2l2aW5nIHRoZW0gYm9kaWVzCiAgLy8gdGhhdCB0aHJvdywgZXZlbiB0aG91Z2ggY29uc3QgY29uc3RydWN0b3JzIGFyZSBub3QgYWxsb3dlZCB0byBoYXZlIGJvZGllcy4KICAvLyBEaXNhYmxlIHRob3NlIHN0YXRpYyBlcnJvcnMuCiAgLy9pZ25vcmU6IGNvbnN0X2NvbnN0cnVjdG9yX3dpdGhfYm9keQogIC8vaWdub3JlOiBjb25zdF9mYWN0b3J5CiAgZXh0ZXJuYWwgY29uc3QgZmFjdG9yeSBpbnQuZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lLCB7aW50IGRlZmF1bHRWYWx1ZX0pOwoKICAvKioKICAgKiBCaXQtd2lzZSBhbmQgb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBib3RoIGB0aGlzYCBhbmQgW290aGVyXSBhcyBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50CiAgICogaW50ZWdlcnMsIHRoZSByZXN1bHQgaXMgYSBudW1iZXIgd2l0aCBvbmx5IHRoZSBiaXRzIHNldCB0aGF0IGFyZSBzZXQgaW4KICAgKiBib3RoIGB0aGlzYCBhbmQgW290aGVyXQogICAqCiAgICogT2YgYm90aCBvcGVyYW5kcyBhcmUgbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUsIG90aGVyd2lzZQogICAqIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLgogICAqLwogIGludCBvcGVyYXRvciAmKGludCBvdGhlcik7CgogIC8qKgogICAqIEJpdC13aXNlIG9yIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0gYXMgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudAogICAqIGludGVnZXJzLCB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbiBlaXRoZXIKICAgKiBvZiBgdGhpc2AgYW5kIFtvdGhlcl0KICAgKgogICAqIElmIGJvdGggb3BlcmFuZHMgYXJlIG5vbi1uZWdhdGl2ZSwgdGhlIHJlc3VsdCBpcyBub24tbmVnYXRpdmUsCiAgICogb3RoZXJ3aXNlIHRoZSByZXN1bHQgdXMgbmVnYXRpdmUuCiAgICovCiAgaW50IG9wZXJhdG9yIHwoaW50IG90aGVyKTsKCiAgLyoqCiAgICogQml0LXdpc2UgZXhjbHVzaXZlLW9yIG9wZXJhdG9yLgogICAqCiAgICogVHJlYXRpbmcgYm90aCBgdGhpc2AgYW5kIFtvdGhlcl0gYXMgc3VmZmljaWVudGx5IGxhcmdlIHR3bydzIGNvbXBvbmVudAogICAqIGludGVnZXJzLCB0aGUgcmVzdWx0IGlzIGEgbnVtYmVyIHdpdGggdGhlIGJpdHMgc2V0IHRoYXQgYXJlIHNldCBpbiBvbmUsCiAgICogYnV0IG5vdCBib3RoLCBvZiBgdGhpc2AgYW5kIFtvdGhlcl0KICAgKgogICAqIElmIHRoZSBvcGVyYW5kcyBoYXZlIHRoZSBzYW1lIHNpZ24sIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlLAogICAqIG90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLgogICAqLwogIGludCBvcGVyYXRvciBeKGludCBvdGhlcik7CgogIC8qKgogICAqIFRoZSBiaXQtd2lzZSBuZWdhdGUgb3BlcmF0b3IuCiAgICoKICAgKiBUcmVhdGluZyBgdGhpc2AgYXMgYSBzdWZmaWNpZW50bHkgbGFyZ2UgdHdvJ3MgY29tcG9uZW50IGludGVnZXIsCiAgICogdGhlIHJlc3VsdCBpcyBhIG51bWJlciB3aXRoIHRoZSBvcHBvc2l0ZSBiaXRzIHNldC4KICAgKgogICAqIFRoaXMgbWFwcyBhbnkgaW50ZWdlciBgeGAgdG8gYC14IC0gMWAuCiAgICovCiAgaW50IG9wZXJhdG9yIH4oKTsKCiAgLyoqCiAgICogU2hpZnQgdGhlIGJpdHMgb2YgdGhpcyBpbnRlZ2VyIHRvIHRoZSBsZWZ0IGJ5IFtzaGlmdEFtb3VudF0uCiAgICoKICAgKiBTaGlmdGluZyB0byB0aGUgbGVmdCBtYWtlcyB0aGUgbnVtYmVyIGxhcmdlciwgZWZmZWN0aXZlbHkgbXVsdGlwbHlpbmcKICAgKiB0aGUgbnVtYmVyIGJ5IGBwb3coMiwgc2hpZnRJbmRleClgLgogICAqCiAgICogVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4gSXQgbWF5IGJlIHJlbGV2YW50IHRvCiAgICogbGltaXQgaW50ZXJtZWRpYXRlIHZhbHVlcyBieSB1c2luZyB0aGUgImFuZCIgb3BlcmF0b3Igd2l0aCBhIHN1aXRhYmxlCiAgICogbWFzay4KICAgKgogICAqIEl0IGlzIGFuIGVycm9yIGlmIFtzaGlmdEFtb3VudF0gaXMgbmVnYXRpdmUuCiAgICovCiAgaW50IG9wZXJhdG9yIDw8KGludCBzaGlmdEFtb3VudCk7CgogIC8qKgogICAqIFNoaWZ0IHRoZSBiaXRzIG9mIHRoaXMgaW50ZWdlciB0byB0aGUgcmlnaHQgYnkgW3NoaWZ0QW1vdW50XS4KICAgKgogICAqIFNoaWZ0aW5nIHRvIHRoZSByaWdodCBtYWtlcyB0aGUgbnVtYmVyIHNtYWxsZXIgYW5kIGRyb3BzIHRoZSBsZWFzdAogICAqIHNpZ25pZmljYW50IGJpdHMsIGVmZmVjdGl2ZWx5IGRvaW5nIGFuIGludGVnZXIgZGl2aXNpb24gYnkKICAgKmBwb3coMiwgc2hpZnRJbmRleClgLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgW3NoaWZ0QW1vdW50XSBpcyBuZWdhdGl2ZS4KICAgKi8KICBpbnQgb3BlcmF0b3IgPj4oaW50IHNoaWZ0QW1vdW50KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGlzIGludGVnZXIgdG8gdGhlIHBvd2VyIG9mIFtleHBvbmVudF0gbW9kdWxvIFttb2R1bHVzXS4KICAgKgogICAqIFRoZSBbZXhwb25lbnRdIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBbbW9kdWx1c10gbXVzdCBiZQogICAqIHBvc2l0aXZlLgogICAqLwogIGludCBtb2RQb3coaW50IGV4cG9uZW50LCBpbnQgbW9kdWx1cyk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG1vZHVsYXIgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiB0aGlzIGludGVnZXIKICAgKiBtb2R1bG8gW21vZHVsdXNdLgogICAqCiAgICogVGhlIFttb2R1bHVzXSBtdXN0IGJlIHBvc2l0aXZlLgogICAqCiAgICogSXQgaXMgYW4gZXJyb3IgaWYgbm8gbW9kdWxhciBpbnZlcnNlIGV4aXN0cy4KICAgKi8KICBpbnQgbW9kSW52ZXJzZShpbnQgbW9kdWx1cyk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHRoaXMgaW50ZWdlciBhbmQgW290aGVyXS4KICAgKgogICAqIElmIGVpdGhlciBudW1iZXIgaXMgbm9uLXplcm8sIHRoZSByZXN1bHQgaXMgdGhlIG51bWVyaWNhbGx5IGdyZWF0ZXN0CiAgICogaW50ZWdlciBkaXZpZGluZyBib3RoIGB0aGlzYCBhbmQgYG90aGVyYC4KICAgKgogICAqIFRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBpcyBpbmRlcGVuZGVudCBvZiB0aGUgb3JkZXIsCiAgICogc28gYHguZ2NkKHkpYCBpcyAgYWx3YXlzIHRoZSBzYW1lIGFzIGB5LmdjZCh4KWAuCiAgICoKICAgKiBGb3IgYW55IGludGVnZXIgYHhgLCBgeC5nY2QoeClgIGlzIGB4LmFicygpYC4KICAgKgogICAqIElmIGJvdGggYHRoaXNgIGFuZCBgb3RoZXJgIGlzIHplcm8sIHRoZSByZXN1bHQgaXMgYWxzbyB6ZXJvLgogICAqLwogIGludCBnY2QoaW50IG90aGVyKTsKCiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGludGVnZXIgaXMgZXZlbi4gKi8KICBib29sIGdldCBpc0V2ZW47CgogIC8qKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBpbnRlZ2VyIGlzIG9kZC4gKi8KICBib29sIGdldCBpc09kZDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzdG9yZSB0aGlzIGludGVnZXIuCiAgICoKICAgKiBUaGUgbnVtYmVyIG9mIGJpdHMgZXhjbHVkZXMgdGhlIHNpZ24gYml0LCB3aGljaCBnaXZlcyB0aGUgbmF0dXJhbCBsZW5ndGgKICAgKiBmb3Igbm9uLW5lZ2F0aXZlICh1bnNpZ25lZCkgdmFsdWVzLiAgTmVnYXRpdmUgdmFsdWVzIGFyZSBjb21wbGVtZW50ZWQgdG8KICAgKiByZXR1cm4gdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYml0IHRoYXQgZGlmZmVycyBmcm9tIHRoZSBzaWduIGJpdC4KICAgKgogICAqIFRvIGZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBzdG9yZSB0aGUgdmFsdWUgYXMgYSBzaWduZWQgdmFsdWUsCiAgICogYWRkIG9uZSwgaS5lLiB1c2UgYHguYml0TGVuZ3RoICsgMWAuCiAgICogYGBgCiAgICogeC5iaXRMZW5ndGggPT0gKC14LTEpLmJpdExlbmd0aAogICAqCiAgICogMy5iaXRMZW5ndGggPT0gMjsgICAgIC8vIDAwMDAwMDExCiAgICogMi5iaXRMZW5ndGggPT0gMjsgICAgIC8vIDAwMDAwMDEwCiAgICogMS5iaXRMZW5ndGggPT0gMTsgICAgIC8vIDAwMDAwMDAxCiAgICogMC5iaXRMZW5ndGggPT0gMDsgICAgIC8vIDAwMDAwMDAwCiAgICogKC0xKS5iaXRMZW5ndGggPT0gMDsgIC8vIDExMTExMTExCiAgICogKC0yKS5iaXRMZW5ndGggPT0gMTsgIC8vIDExMTExMTEwCiAgICogKC0zKS5iaXRMZW5ndGggPT0gMjsgIC8vIDExMTExMTAxCiAgICogKC00KS5iaXRMZW5ndGggPT0gMjsgIC8vIDExMTExMTAwCiAgICogYGBgCiAgICovCiAgaW50IGdldCBiaXRMZW5ndGg7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxlYXN0IHNpZ25pZmljYW50IFt3aWR0aF0gYml0cyBvZiB0aGlzIGludGVnZXIgYXMgYQogICAqIG5vbi1uZWdhdGl2ZSBudW1iZXIgKGkuZS4gdW5zaWduZWQgcmVwcmVzZW50YXRpb24pLiAgVGhlIHJldHVybmVkIHZhbHVlIGhhcwogICAqIHplcm9zIGluIGFsbCBiaXQgcG9zaXRpb25zIGhpZ2hlciB0aGFuIFt3aWR0aF0uCiAgICogYGBgCiAgICogKC0xKS50b1Vuc2lnbmVkKDUpID09IDMxICAgLy8gMTExMTExMTEgIC0+ICAwMDAxMTExMQogICAqIGBgYAogICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGFyaXRobWV0aWMgZnJvbSBsb3cgbGV2ZWwgbGFuZ3VhZ2VzLgogICAqIEZvciBleGFtcGxlLCB0byBpbmNyZW1lbnQgYW4gOCBiaXQgcXVhbnRpdHk6CiAgICogYGBgCiAgICogcSA9IChxICsgMSkudG9VbnNpZ25lZCg4KTsKICAgKiBgYGAKICAgKiBgcWAgd2lsbCBjb3VudCBmcm9tIGAwYCB1cCB0byBgMjU1YCBhbmQgdGhlbiB3cmFwIGFyb3VuZCB0byBgMGAuCiAgICoKICAgKiBJZiB0aGUgaW5wdXQgZml0cyBpbiBbd2lkdGhdIGJpdHMgd2l0aG91dCB0cnVuY2F0aW9uLCB0aGUgcmVzdWx0IGlzIHRoZQogICAqIHNhbWUgYXMgdGhlIGlucHV0LiAgVGhlIG1pbmltdW0gd2lkdGggbmVlZGVkIHRvIGF2b2lkIHRydW5jYXRpb24gb2YgYHhgIGlzCiAgICogZ2l2ZW4gYnkgYHguYml0TGVuZ3RoYCwgaS5lLgogICAqIGBgYAogICAqIHggPT0geC50b1Vuc2lnbmVkKHguYml0TGVuZ3RoKTsKICAgKiBgYGAKICAgKi8KICBpbnQgdG9VbnNpZ25lZChpbnQgd2lkdGgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZWFzdCBzaWduaWZpY2FudCBbd2lkdGhdIGJpdHMgb2YgdGhpcyBpbnRlZ2VyLCBleHRlbmRpbmcgdGhlCiAgICogaGlnaGVzdCByZXRhaW5lZCBiaXQgdG8gdGhlIHNpZ24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRydW5jYXRpbmcgdGhlIHZhbHVlCiAgICogdG8gZml0IGluIFt3aWR0aF0gYml0cyB1c2luZyBhbiBzaWduZWQgMi1zIGNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24uICBUaGUKICAgKiByZXR1cm5lZCB2YWx1ZSBoYXMgdGhlIHNhbWUgYml0IHZhbHVlIGluIGFsbCBwb3NpdGlvbnMgaGlnaGVyIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIGBgYAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWLS1zaWduIGJpdC1WCiAgICogMTYudG9TaWduZWQoNSkgPT0gLTE2ICAgLy8gIDAwMDEwMDAwIC0+IDExMTEwMDAwCiAgICogMjM5LnRvU2lnbmVkKDUpID09IDE1ICAgLy8gIDExMTAxMTExIC0+IDAwMDAxMTExCiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgIF4KICAgKiBgYGAKICAgKiBUaGlzIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byBzaW11bGF0ZSBhcml0aG1ldGljIGZyb20gbG93IGxldmVsIGxhbmd1YWdlcy4KICAgKiBGb3IgZXhhbXBsZSwgdG8gaW5jcmVtZW50IGFuIDggYml0IHNpZ25lZCBxdWFudGl0eToKICAgKiBgYGAKICAgKiBxID0gKHEgKyAxKS50b1NpZ25lZCg4KTsKICAgKiBgYGAKICAgKiBgcWAgd2lsbCBjb3VudCBmcm9tIGAwYCB1cCB0byBgMTI3YCwgd3JhcCB0byBgLTEyOGAgYW5kIGNvdW50IGJhY2sgdXAgdG8KICAgKiBgMTI3YC4KICAgKgogICAqIElmIHRoZSBpbnB1dCB2YWx1ZSBmaXRzIGluIFt3aWR0aF0gYml0cyB3aXRob3V0IHRydW5jYXRpb24sIHRoZSByZXN1bHQgaXMKICAgKiB0aGUgc2FtZSBhcyB0aGUgaW5wdXQuICBUaGUgbWluaW11bSB3aWR0aCBuZWVkZWQgdG8gYXZvaWQgdHJ1bmNhdGlvbiBvZiBgeGAKICAgKiBpcyBgeC5iaXRMZW5ndGggKyAxYCwgaS5lLgogICAqIGBgYAogICAqIHggPT0geC50b1NpZ25lZCh4LmJpdExlbmd0aCArIDEpOwogICAqIGBgYAogICAqLwogIGludCB0b1NpZ25lZChpbnQgd2lkdGgpOwoKICAvKioKICAgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIHZhbHVlIG9mIHRoaXMgaW50ZWdlci4KICAgKgogICAqIFRoZSByZXN1bHQgb2YgbmVnYXRpbmcgYW4gaW50ZWdlciBhbHdheXMgaGFzIHRoZSBvcHBvc2l0ZSBzaWduLCBleGNlcHQKICAgKiBmb3IgemVybywgd2hpY2ggaXMgaXRzIG93biBuZWdhdGlvbi4KICAgKi8KICBpbnQgb3BlcmF0b3IgLSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIGludGVnZXIuCiAgICoKICAgKiBGb3IgYW55IGludGVnZXIgYHhgLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGB4IDwgMCA/IC14IDogeGAuCiAgICovCiAgaW50IGFicygpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoaXMgaW50ZWdlci4KICAgKgogICAqIFJldHVybnMgMCBmb3IgemVybywgLTEgZm9yIHZhbHVlcyBsZXNzIHRoYW4gemVybyBhbmQKICAgKiArMSBmb3IgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvLgogICAqLwogIGludCBnZXQgc2lnbjsKCiAgLyoqIFJldHVybnMgYHRoaXNgLiAqLwogIGludCByb3VuZCgpOwoKICAvKiogUmV0dXJucyBgdGhpc2AuICovCiAgaW50IGZsb29yKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzYC4gKi8KICBpbnQgY2VpbCgpOwoKICAvKiogUmV0dXJucyBgdGhpc2AuICovCiAgaW50IHRydW5jYXRlKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzLnRvRG91YmxlKClgLiAqLwogIGRvdWJsZSByb3VuZFRvRG91YmxlKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzLnRvRG91YmxlKClgLiAqLwogIGRvdWJsZSBmbG9vclRvRG91YmxlKCk7CgogIC8qKiBSZXR1cm5zIGB0aGlzLnRvRG91YmxlKClgLiAqLwogIGRvdWJsZSBjZWlsVG9Eb3VibGUoKTsKCiAgLyoqIFJldHVybnMgYHRoaXMudG9Eb3VibGUoKWAuICovCiAgZG91YmxlIHRydW5jYXRlVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGludGVnZXIuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIHBhcnNhYmxlIGJ5IFtwYXJzZV0uCiAgICogRm9yIGFueSBgaW50YCBgaWAsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAqIGBpID09IGludC5wYXJzZShpLnRvU3RyaW5nKCkpYC4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKTsKCiAgLyoqCiAgICogQ29udmVydHMgW3RoaXNdIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIHRoZSBnaXZlbiBbcmFkaXhdLgogICAqCiAgICogSW4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgbG93ZXItY2FzZSBsZXR0ZXJzIGFyZSB1c2VkIGZvciBkaWdpdHMgYWJvdmUKICAgKiAnOScsIHdpdGggJ2EnIGJlaW5nIDEwIGFuICd6JyBiZWluZyAzNS4KICAgKgogICAqIFRoZSBbcmFkaXhdIGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMiB0byAzNi4KICAgKi8KICBTdHJpbmcgdG9SYWRpeFN0cmluZyhpbnQgcmFkaXgpOwoKICAvKioKICAgKiBQYXJzZSBbc291cmNlXSBhcyBhLCBwb3NzaWJseSBzaWduZWQsIGludGVnZXIgbGl0ZXJhbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KICAgKgogICAqIFRoZSBbc291cmNlXSBtdXN0IGJlIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIGJhc2UtW3JhZGl4XSBkaWdpdHMsCiAgICogb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIGEgbWludXMgb3IgcGx1cyBzaWduICgnLScgb3IgJysnKS4KICAgKiBJdCBtdXN0IG5vdCBiZSBgbnVsbGAuCiAgICoKICAgKiBUaGUgW3JhZGl4XSBtdXN0IGJlIGluIHRoZSByYW5nZSAyLi4zNi4gVGhlIGRpZ2l0cyB1c2VkIGFyZQogICAqIGZpcnN0IHRoZSBkZWNpbWFsIGRpZ2l0cyAwLi45LCBhbmQgdGhlbiB0aGUgbGV0dGVycyAnYScuLid6JyB3aXRoCiAgICogdmFsdWVzIDEwIHRocm91Z2ggMzUuIEFsc28gYWNjZXB0cyB1cHBlci1jYXNlIGxldHRlcnMgd2l0aCB0aGUgc2FtZQogICAqIHZhbHVlcyBhcyB0aGUgbG93ZXItY2FzZSBvbmVzLgogICAqCiAgICogSWYgbm8gW3JhZGl4XSBpcyBnaXZlbiB0aGVuIGl0IGRlZmF1bHRzIHRvIDEwLiBJbiB0aGlzIGNhc2UsIHRoZSBbc291cmNlXQogICAqIGRpZ2l0cyBtYXkgYWxzbyBzdGFydCB3aXRoIGAweGAsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBpcyBpbnRlcnByZXRlZAogICAqIGFzIGEgaGV4YWRlY2ltYWwgaW50ZWdlciBsaXRlcmFsLAogICAqIFdoZW4gYGludGAgaXMgaW1wbGVtZW50ZWQgYnkgNjQtYml0IHNpZ25lZCBpbnRlZ2VycywKICAgKiBoZXhhZGVjaW1hbCBpbnRlZ2VyIGxpdGVyYWxzIG1heSByZXByZXNlbnQgdmFsdWVzIGxhcmdlciB0aGFuCiAgICogMjxzdXA+NjM8L3N1cD4sIGluIHdoaWNoIGNhc2UgdGhlIHZhbHVlIGlzIHBhcnNlZCBhcyBpZiBpdCBpcyBhbgogICAqICp1bnNpZ25lZCogbnVtYmVyLCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcyB0aGUgY29ycmVzcG9uZGluZwogICAqIHNpZ25lZCBpbnRlZ2VyIHZhbHVlLgogICAqCiAgICogRm9yIGFueSBpbnQgYG5gIGFuZCB2YWxpZCByYWRpeCBgcmAsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAogICAqIGBuID09IGludC5wYXJzZShuLnRvUmFkaXhTdHJpbmcociksIHJhZGl4OiByKWAuCiAgICoKICAgKiBJZiB0aGUgW3NvdXJjZV0gc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBpbnRlZ2VyIGxpdGVyYWwsCiAgICogb3B0aW9uYWxseSBwcmVmaXhlZCBieSBhIHNpZ24sIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaXMgdGhyb3duCiAgICogKHVubGVzcyB0aGUgZGVwcmVjYXRlZCBbb25FcnJvcl0gcGFyYW1ldGVyIGlzIHVzZWQsIHNlZSBiZWxvdykuCiAgICoKICAgKiBJbnN0ZWFkIG9mIHRocm93aW5nIGFuZCBpbW1lZGlhdGVseSBjYXRjaGluZyB0aGUgW0Zvcm1hdEV4Y2VwdGlvbl0sCiAgICogaW5zdGVhZCB1c2UgW3RyeVBhcnNlXSB0byBoYW5kbGUgYSBwYXJzaW5nIGVycm9yLgogICAqIEV4YW1wbGU6CiAgICogYGBgZGFydAogICAqIHZhciB2YWx1ZSA9IGludC50cnlQYXJzZSh0ZXh0KTsKICAgKiBpZiAodmFsdWUgPT0gbnVsbCkgLi4uIGhhbmRsZSB0aGUgcHJvYmxlbQogICAqIGBgYAogICAqCiAgICogVGhlIFtvbkVycm9yXSBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLgogICAqIEluc3RlYWQgb2YgYGludC5wYXJzZShzdHJpbmcsIG9uRXJyb3I6IChzdHJpbmcpID0+IC4uLilgLAogICAqIHlvdSBzaG91bGQgdXNlIGBpbnQudHJ5UGFyc2Uoc3RyaW5nKSA/PyAoLi4uKWAuCiAgICoKICAgKiBXaGVuIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIG5vdCB2YWxpZCBhbmQgW29uRXJyb3JdIGlzIHByb3ZpZGVkLAogICAqIHdoZW5ldmVyIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gd291bGQgYmUgdGhyb3duLAogICAqIFtvbkVycm9yXSBpcyBpbnN0ZWFkIGNhbGxlZCB3aXRoIFtzb3VyY2VdIGFzIGFyZ3VtZW50LAogICAqIGFuZCB0aGUgcmVzdWx0IG9mIHRoYXQgY2FsbCBpcyByZXR1cm5lZCBieSBbcGFyc2VdLgogICAqLwogIGV4dGVybmFsIHN0YXRpYyBpbnQgcGFyc2UoU3RyaW5nIHNvdXJjZSwKICAgICAge2ludCByYWRpeCwgQGRlcHJlY2F0ZWQgaW50IG9uRXJyb3IoU3RyaW5nIHNvdXJjZSl9KTsKCiAgLyoqCiAgICogUGFyc2UgW3NvdXJjZV0gYXMgYSwgcG9zc2libHkgc2lnbmVkLCBpbnRlZ2VyIGxpdGVyYWwgYW5kIHJldHVybiBpdHMgdmFsdWUuCiAgICoKICAgKiBMaWtlIFtwYXJzZV0gZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGBudWxsYCB3aGVyZSBhCiAgICogc2ltaWxhciBjYWxsIHRvIFtwYXJzZV0gd291bGQgdGhyb3cgYSBbRm9ybWF0RXhjZXB0aW9uXSwKICAgKiBhbmQgdGhlIFtzb3VyY2VdIG11c3Qgc3RpbGwgbm90IGJlIGBudWxsYC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgaW50IHRyeVBhcnNlKFN0cmluZyBzb3VyY2UsIHtpbnQgcmFkaXh9KTsKfQqBZQBOTjwBEwEEFgNLOANNTk1PDjpHTTwDNgQhBkwFNQlIGQkOCUAJBkxMUCIoGk8BBhwFTE0dBUYhBh0BBhsFTE8bBUQnBh0BBiUFTE0pBUUnBh0BBiMFRjgFLAYUAQZCBUspBUhLCwUyBiQBBkMFSEAaBTIGJAEGRwU/DwYpAQZAFwUlBTIGHwEGRgVKLwU+NgUzBUIGFgE7EwE6EgEGSAVOTk4FTSoJJQUnJycnJycnJwkGFQEGRVE1CToJUTIJIAlGBU1QIgklCQYdAQZPUVBRBQkyNjYyCVE5CR4JTgwFT1EgCScJBhsBBjAFTCoGFAEGMQVGBg0BBicFOiYGEAEZDwEZDwEZDgEZEgEkGgEkGgEkGQEkHQEGNgUxLiUGFQEGRgVQLQVDBiMBBlEFR0EcBUFHSSQFT04nOkNGRRsFQDUFRkJFBUk3Dg0lLwkFQD81BUQzPDkGKzwBBlEFQz4wBjwCARJkYXJ0OmNvcmUvaW50LmRhcnQzb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9pbnRlZ2Vyc19wYXRjaC5kYXJ0rCMvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCi8vLyBWTSBpbXBsZW1lbnRhdGlvbiBvZiBpbnQuCkBwYXRjaApjbGFzcyBpbnQgewogIEBwYXRjaAogIGNvbnN0IGZhY3RvcnkgaW50LmZyb21FbnZpcm9ubWVudChTdHJpbmcgbmFtZSwge2ludCBkZWZhdWx0VmFsdWV9KQogICAgICBuYXRpdmUgIkludGVnZXJfZnJvbUVudmlyb25tZW50IjsKCiAgaW50IF9iaXRBbmRGcm9tU21pKF9TbWkgb3RoZXIpOwogIGludCBfYml0QW5kRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBpbnQgX2JpdE9yRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBpbnQgX2JpdFhvckZyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgaW50IF9zaHJGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGludCBfc2hsRnJvbUludGVnZXIoaW50IG90aGVyKTsKCiAgc3RhdGljIGludCBfdHJ5UGFyc2VTbWkoU3RyaW5nIHN0ciwgaW50IGZpcnN0LCBpbnQgbGFzdCkgewogICAgYXNzZXJ0KGZpcnN0IDw9IGxhc3QpOwogICAgdmFyIGl4ID0gZmlyc3Q7CiAgICB2YXIgc2lnbiA9IDE7CiAgICB2YXIgYyA9IHN0ci5jb2RlVW5pdEF0KGl4KTsKICAgIC8vIENoZWNrIGZvciBsZWFkaW5nICcrJyBvciAnLScuCiAgICBpZiAoKGMgPT0gMHgyYikgfHwgKGMgPT0gMHgyZCkpIHsKICAgICAgaXgrKzsKICAgICAgc2lnbiA9IDB4MmMgLSBjOyAvLyAtMSBmb3IgJy0nLCArMSBmb3IgJysnLgogICAgICBpZiAoaXggPiBsYXN0KSB7CiAgICAgICAgcmV0dXJuIG51bGw7IC8vIEVtcHR5LgogICAgICB9CiAgICB9CiAgICB2YXIgc21pTGltaXQgPSBpczY0Qml0ID8gMTggOiA5OwogICAgaWYgKChsYXN0IC0gaXgpID49IHNtaUxpbWl0KSB7CiAgICAgIHJldHVybiBudWxsOyAvLyBNYXkgbm90IGZpdCBpbnRvIGEgU21pLgogICAgfQogICAgdmFyIHJlc3VsdCA9IDA7CiAgICBmb3IgKGludCBpID0gaXg7IGkgPD0gbGFzdDsgaSsrKSB7CiAgICAgIHZhciBjID0gMHgzMCBeIHN0ci5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoOSA8IGMpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXN1bHQgPSAxMCAqIHJlc3VsdCArIGM7CiAgICB9CiAgICByZXR1cm4gc2lnbiAqIHJlc3VsdDsKICB9CgogIEBwYXRjaAogIHN0YXRpYyBpbnQgcGFyc2UoU3RyaW5nIHNvdXJjZSwge2ludCByYWRpeCwgaW50IG9uRXJyb3IoU3RyaW5nIHNvdXJjZSl9KSB7CiAgICBpZiAoc291cmNlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgc291cmNlIG11c3Qgbm90IGJlIG51bGwiKTsKICAgIGlmIChzb3VyY2UuaXNFbXB0eSkgewogICAgICByZXR1cm4gX3Rocm93Rm9ybWF0RXhjZXB0aW9uKG9uRXJyb3IsIHNvdXJjZSwgMCwgcmFkaXgsIG51bGwpOwogICAgfQogICAgaWYgKHJhZGl4ID09IG51bGwgfHwgcmFkaXggPT0gMTApIHsKICAgICAgLy8gVHJ5IHBhcnNpbmcgaW1tZWRpYXRlbHksIHdpdGhvdXQgdHJpbW1pbmcgd2hpdGVzcGFjZS4KICAgICAgaW50IHJlc3VsdCA9IF90cnlQYXJzZVNtaShzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGggLSAxKTsKICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OwogICAgfSBlbHNlIGlmIChyYWRpeCA8IDIgfHwgcmFkaXggPiAzNikgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUmFkaXggJHJhZGl4IG5vdCBpbiByYW5nZSAyLi4zNiIpOwogICAgfQogICAgLy8gU3BsaXQgaGVyZSBzbyBpbXByb3ZlIG9kZHMgb2YgcGFyc2UgYmVpbmcgaW5saW5lZCBhbmQgdGhlIGNoZWNrcyBvbWl0dGVkLgogICAgcmV0dXJuIF9wYXJzZShzb3VyY2UsIHJhZGl4LCBvbkVycm9yKTsKICB9CgogIHN0YXRpYyBpbnQgX3BhcnNlKF9TdHJpbmdCYXNlIHNvdXJjZSwgaW50IHJhZGl4LCBvbkVycm9yKSB7CiAgICBpbnQgZW5kID0gc291cmNlLl9sYXN0Tm9uV2hpdGVzcGFjZSgpICsgMTsKICAgIGlmIChlbmQgPT0gMCkgewogICAgICByZXR1cm4gX3Rocm93Rm9ybWF0RXhjZXB0aW9uKG9uRXJyb3IsIHNvdXJjZSwgc291cmNlLmxlbmd0aCwgcmFkaXgsIG51bGwpOwogICAgfQogICAgaW50IHN0YXJ0ID0gc291cmNlLl9maXJzdE5vbldoaXRlc3BhY2UoKTsKCiAgICBpbnQgZmlyc3QgPSBzb3VyY2UuY29kZVVuaXRBdChzdGFydCk7CiAgICBpbnQgc2lnbiA9IDE7CiAgICBpZiAoZmlyc3QgPT0gMHgyYiAvKiArICovIHx8IGZpcnN0ID09IDB4MmQgLyogLSAqLykgewogICAgICBzaWduID0gMHgyYyAtIGZpcnN0OyAvLyAtMSBpZiAnLScsICsxIGlmICcrJy4KICAgICAgc3RhcnQrKzsKICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewogICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBlbmQsIHJhZGl4LCBudWxsKTsKICAgICAgfQogICAgICBmaXJzdCA9IHNvdXJjZS5jb2RlVW5pdEF0KHN0YXJ0KTsKICAgIH0KICAgIGlmIChyYWRpeCA9PSBudWxsKSB7CiAgICAgIC8vIGNoZWNrIGZvciAweCBwcmVmaXguCiAgICAgIGludCBpbmRleCA9IHN0YXJ0OwogICAgICBpZiAoZmlyc3QgPT0gMHgzMCAvKiAwICovKSB7CiAgICAgICAgaW5kZXgrKzsKICAgICAgICBpZiAoaW5kZXggPT0gZW5kKSByZXR1cm4gMDsKICAgICAgICBmaXJzdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGluZGV4KTsKICAgICAgICBpZiAoKGZpcnN0IHwgMHgyMCkgPT0gMHg3OCAvKiB4ICovKSB7CiAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgaWYgKGluZGV4ID09IGVuZCkgewogICAgICAgICAgICByZXR1cm4gX3Rocm93Rm9ybWF0RXhjZXB0aW9uKG9uRXJyb3IsIHNvdXJjZSwgaW5kZXgsIG51bGwsIG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIF9wYXJzZVJhZGl4KHNvdXJjZSwgMTYsIGluZGV4LCBlbmQsIHNpZ24sIHNpZ24gPiAwLCBvbkVycm9yKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmFkaXggPSAxMDsKICAgIH0KICAgIHJldHVybiBfcGFyc2VSYWRpeChzb3VyY2UsIHJhZGl4LCBzdGFydCwgZW5kLCBzaWduLCBmYWxzZSwgb25FcnJvcik7CiAgfQoKICBAcGF0Y2gKICBzdGF0aWMgaW50IHRyeVBhcnNlKFN0cmluZyBzb3VyY2UsIHtpbnQgcmFkaXh9KSB7CiAgICBpZiAoc291cmNlID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgc291cmNlIG11c3Qgbm90IGJlIG51bGwiKTsKICAgIGlmIChzb3VyY2UuaXNFbXB0eSkgcmV0dXJuIG51bGw7CiAgICBpZiAocmFkaXggPT0gbnVsbCB8fCByYWRpeCA9PSAxMCkgewogICAgICAvLyBUcnkgcGFyc2luZyBpbW1lZGlhdGVseSwgd2l0aG91dCB0cmltbWluZyB3aGl0ZXNwYWNlLgogICAgICBpbnQgcmVzdWx0ID0gX3RyeVBhcnNlU21pKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCAtIDEpOwogICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICB9IGVsc2UgaWYgKHJhZGl4IDwgMiB8fCByYWRpeCA+IDM2KSB7CiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJSYWRpeCAkcmFkaXggbm90IGluIHJhbmdlIDIuLjM2Iik7CiAgICB9CiAgICB0cnkgewogICAgICByZXR1cm4gX3BhcnNlKHNvdXJjZSwgcmFkaXgsIF9rTnVsbCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgc3RhdGljIE51bGwgX2tOdWxsKF8pID0+IG51bGw7CgogIHN0YXRpYyBpbnQgX3Rocm93Rm9ybWF0RXhjZXB0aW9uKG9uRXJyb3IsIHNvdXJjZSwgaW5kZXgsIHJhZGl4LCBtZXNzYWdlKSB7CiAgICBpZiAob25FcnJvciAhPSBudWxsKSByZXR1cm4gb25FcnJvcihzb3VyY2UpOwogICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKG1lc3NhZ2UsIHNvdXJjZSwgaW5kZXgpOwogICAgfQogICAgaWYgKHJhZGl4ID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBudW1iZXIiLCBzb3VyY2UsIGluZGV4KTsKICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcmFkaXgtJHJhZGl4IG51bWJlciIsIHNvdXJjZSwgaW5kZXgpOwogIH0KCiAgc3RhdGljIGludCBfcGFyc2VSYWRpeChTdHJpbmcgc291cmNlLCBpbnQgcmFkaXgsIGludCBzdGFydCwgaW50IGVuZCwgaW50IHNpZ24sCiAgICAgIGJvb2wgYWxsb3dVNjQsIG9uRXJyb3IpIHsKICAgIGludCB0YWJsZUluZGV4ID0gKHJhZGl4IC0gMikgKiA0ICsgKGlzNjRCaXQgPyAyIDogMCk7CiAgICBpbnQgYmxvY2tTaXplID0gX1BBUlNFX0xJTUlUU1t0YWJsZUluZGV4XTsKICAgIGludCBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgIGlmIChsZW5ndGggPD0gYmxvY2tTaXplKSB7CiAgICAgIF9TbWkgc21pID0gX3BhcnNlQmxvY2soc291cmNlLCByYWRpeCwgc3RhcnQsIGVuZCk7CiAgICAgIGlmIChzbWkgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBzdGFydCwgcmFkaXgsIG51bGwpOwogICAgICB9CiAgICAgIHJldHVybiBzaWduICogc21pOwogICAgfQoKICAgIC8vIE9mdGVuIGNoZWFwZXIgdGhhbjogaW50IHNtYWxsQmxvY2tTaXplID0gbGVuZ3RoICUgYmxvY2tTaXplOwogICAgLy8gYmVjYXVzZSBkaWdpdCBjb3VudCBnZW5lcmFsbHkgdGVuZHMgdG93YXJkcyBzbWFsbGVyLiByYXRoZXIKICAgIC8vIHRoYW4gbGFyZ2VyLgogICAgaW50IHNtYWxsQmxvY2tTaXplID0gbGVuZ3RoOwogICAgd2hpbGUgKHNtYWxsQmxvY2tTaXplID49IGJsb2NrU2l6ZSkgc21hbGxCbG9ja1NpemUgLT0gYmxvY2tTaXplOwogICAgaW50IHJlc3VsdCA9IDA7CiAgICBpZiAoc21hbGxCbG9ja1NpemUgPiAwKSB7CiAgICAgIGludCBibG9ja0VuZCA9IHN0YXJ0ICsgc21hbGxCbG9ja1NpemU7CiAgICAgIF9TbWkgc21pID0gX3BhcnNlQmxvY2soc291cmNlLCByYWRpeCwgc3RhcnQsIGJsb2NrRW5kKTsKICAgICAgaWYgKHNtaSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIF90aHJvd0Zvcm1hdEV4Y2VwdGlvbihvbkVycm9yLCBzb3VyY2UsIHN0YXJ0LCByYWRpeCwgbnVsbCk7CiAgICAgIH0KICAgICAgcmVzdWx0ID0gc2lnbiAqIHNtaTsKICAgICAgc3RhcnQgPSBibG9ja0VuZDsKICAgIH0KICAgIGludCBtdWx0aXBsaWVyID0gX1BBUlNFX0xJTUlUU1t0YWJsZUluZGV4ICsgMV07CiAgICBpbnQgcG9zaXRpdmVPdmVyZmxvd0xpbWl0ID0gMDsKICAgIGludCBuZWdhdGl2ZU92ZXJmbG93TGltaXQgPSAwOwogICAgdGFibGVJbmRleCA9IHRhYmxlSW5kZXggPDwgMTsgLy8gcHJlLW11bHRpcGx5IGJ5IDIgZm9yIHNpbXBsZXIgaW5kZXhpbmcKICAgIHBvc2l0aXZlT3ZlcmZsb3dMaW1pdCA9IF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXhdOwogICAgaWYgKHBvc2l0aXZlT3ZlcmZsb3dMaW1pdCA9PSAwKSB7CiAgICAgIHBvc2l0aXZlT3ZlcmZsb3dMaW1pdCA9IF9pbml0SW50NjRPdmVyZmxvd0xpbWl0cyh0YWJsZUluZGV4LCBtdWx0aXBsaWVyKTsKICAgIH0KICAgIG5lZ2F0aXZlT3ZlcmZsb3dMaW1pdCA9IF9pbnQ2NE92ZXJmbG93TGltaXRzW3RhYmxlSW5kZXggKyAxXTsKICAgIGludCBibG9ja0VuZCA9IHN0YXJ0ICsgYmxvY2tTaXplOwogICAgZG8gewogICAgICBfU21pIHNtaSA9IF9wYXJzZUJsb2NrKHNvdXJjZSwgcmFkaXgsIHN0YXJ0LCBibG9ja0VuZCk7CiAgICAgIGlmIChzbWkgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBzdGFydCwgcmFkaXgsIG51bGwpOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQgPj0gcG9zaXRpdmVPdmVyZmxvd0xpbWl0KSB7CiAgICAgICAgaWYgKChyZXN1bHQgPiBwb3NpdGl2ZU92ZXJmbG93TGltaXQpIHx8CiAgICAgICAgICAgIChzbWkgPiBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4ICsgMl0pKSB7CiAgICAgICAgICAvLyBBbHRob3VnaCB0aGUgdW5zaWduZWQgb3ZlcmZsb3cgbGltaXRzIGRvIG5vdCBkZXBlbmQgb24gdGhlCiAgICAgICAgICAvLyBwbGF0Zm9ybSwgdGhlIG11bHRpcGxpZXIgYW5kIGJsb2NrIHNpemUsIHdoaWNoIGFyZSB1c2VkIHRvCiAgICAgICAgICAvLyBjb21wdXRlIGl0LCBkby4KICAgICAgICAgIGludCBYID0gaXM2NEJpdCA/IDEgOiAwOwogICAgICAgICAgaWYgKGFsbG93VTY0ICYmCiAgICAgICAgICAgICAgIShyZXN1bHQgPj0gX2ludDY0VW5zaWduZWRPdmVyZmxvd0xpbWl0c1tYXSAmJgogICAgICAgICAgICAgICAgICAocmVzdWx0ID4gX2ludDY0VW5zaWduZWRPdmVyZmxvd0xpbWl0c1tYXSB8fAogICAgICAgICAgICAgICAgICAgICAgc21pID4gX2ludDY0VW5zaWduZWRTbWlPdmVyZmxvd0xpbWl0c1tYXSkpICYmCiAgICAgICAgICAgICAgYmxvY2tFbmQgKyBibG9ja1NpemUgPiBlbmQpIHsKICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgKiBtdWx0aXBsaWVyKSArIHNtaTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBfdGhyb3dGb3JtYXRFeGNlcHRpb24ob25FcnJvciwgc291cmNlLCBudWxsLCByYWRpeCwKICAgICAgICAgICAgICAiUG9zaXRpdmUgaW5wdXQgZXhjZWVkcyB0aGUgbGltaXQgb2YgaW50ZWdlciIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPD0gbmVnYXRpdmVPdmVyZmxvd0xpbWl0KSB7CiAgICAgICAgaWYgKChyZXN1bHQgPCBuZWdhdGl2ZU92ZXJmbG93TGltaXQpIHx8CiAgICAgICAgICAgIChzbWkgPiBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4ICsgM10pKSB7CiAgICAgICAgICByZXR1cm4gX3Rocm93Rm9ybWF0RXhjZXB0aW9uKG9uRXJyb3IsIHNvdXJjZSwgbnVsbCwgcmFkaXgsCiAgICAgICAgICAgICAgIk5lZ2F0aXZlIGlucHV0IGV4Y2VlZHMgdGhlIGxpbWl0IG9mIGludGVnZXIiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIG11bHRpcGxpZXIpICsgKHNpZ24gKiBzbWkpOwogICAgICBzdGFydCA9IGJsb2NrRW5kOwogICAgICBibG9ja0VuZCA9IHN0YXJ0ICsgYmxvY2tTaXplOwogICAgfSB3aGlsZSAoYmxvY2tFbmQgPD0gZW5kKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBQYXJzZSBibG9jayBvZiBkaWdpdHMgaW50byBhIFNtaS4KICBzdGF0aWMgX1NtaSBfcGFyc2VCbG9jayhTdHJpbmcgc291cmNlLCBpbnQgcmFkaXgsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgX1NtaSByZXN1bHQgPSAwOwogICAgaWYgKHJhZGl4IDw9IDEwKSB7CiAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgaW50IGRpZ2l0ID0gc291cmNlLmNvZGVVbml0QXQoaSkgXiAweDMwOwogICAgICAgIGlmIChkaWdpdCA+PSByYWRpeCkgcmV0dXJuIG51bGw7CiAgICAgICAgcmVzdWx0ID0gcmFkaXggKiByZXN1bHQgKyBkaWdpdDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpbnQgY2hhciA9IHNvdXJjZS5jb2RlVW5pdEF0KGkpOwogICAgICAgIGludCBkaWdpdCA9IGNoYXIgXiAweDMwOwogICAgICAgIGlmIChkaWdpdCA+IDkpIHsKICAgICAgICAgIGRpZ2l0ID0gKGNoYXIgfCAweDIwKSAtICgweDYxIC0gMTApOwogICAgICAgICAgaWYgKGRpZ2l0IDwgMTAgfHwgZGlnaXQgPj0gcmFkaXgpIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSByYWRpeCAqIHJlc3VsdCArIGRpZ2l0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gRm9yIGVhY2ggcmFkaXgsIDItMzYsIGhvdyBtYW55IGRpZ2l0cyBhcmUgZ3VhcmFudGVlZCB0byBmaXQgaW4gYSBzbWksCiAgLy8gYW5kIG1hZ25pdHVkZSBvZiBzdWNoIGEgYmxvY2sgKHJhZGl4ICoqIGRpZ2l0LWNvdW50KS4KICAvLyAzMi1iaXQgbGltaXQvbXVsdGlwbGllciBhdCAocmFkaXggLSAyKSo0LCA2NC1iaXQgbGltaXQgYXQgKHJhZGl4LTIpKjQrMgogIHN0YXRpYyBjb25zdCBfUEFSU0VfTElNSVRTID0gY29uc3QgWwogICAgMzAsIDEwNzM3NDE4MjQsIDYyLCA0NjExNjg2MDE4NDI3Mzg3OTA0LCAvLyByYWRpeDogMgogICAgMTgsIDM4NzQyMDQ4OSwgMzksIDQwNTI1NTUxNTMwMTg5NzYyNjcsCiAgICAxNSwgMTA3Mzc0MTgyNCwgMzAsIDExNTI5MjE1MDQ2MDY4NDY5NzYsCiAgICAxMiwgMjQ0MTQwNjI1LCAyNiwgMTQ5MDExNjExOTM4NDc2NTYyNSwgLy8gIHJhZGl4OiA1CiAgICAxMSwgMzYyNzk3MDU2LCAyMywgNzg5NzMwMjIzMDUzNjAyODE2LAogICAgMTAsIDI4MjQ3NTI0OSwgMjIsIDM5MDk4MjEwNDg1ODI5ODgwNDksCiAgICAxMCwgMTA3Mzc0MTgyNCwgMjAsIDExNTI5MjE1MDQ2MDY4NDY5NzYsCiAgICA5LCAzODc0MjA0ODksIDE5LCAxMzUwODUxNzE3NjcyOTkyMDg5LAogICAgOSwgMTAwMDAwMDAwMCwgMTgsIDEwMDAwMDAwMDAwMDAwMDAwMDAsIC8vICByYWRpeDogMTAKICAgIDgsIDIxNDM1ODg4MSwgMTcsIDUwNTQ0NzAyODQ5OTI5Mzc3MSwKICAgIDgsIDQyOTk4MTY5NiwgMTcsIDIyMTg2MTExMDY3NDA0MzY5OTIsCiAgICA4LCA4MTU3MzA3MjEsIDE2LCA2NjU0MTY2MDkxODMxNzk4NDEsCiAgICA3LCAxMDU0MTM1MDQsIDE2LCAyMTc3OTUzMzM3ODA5MzcxMTM2LAogICAgNywgMTcwODU5Mzc1LCAxNSwgNDM3ODkzODkwMzgwODU5Mzc1LCAvLyAgICByYWRpeDogMTUKICAgIDcsIDI2ODQzNTQ1NiwgMTUsIDExNTI5MjE1MDQ2MDY4NDY5NzYsCiAgICA3LCA0MTAzMzg2NzMsIDE1LCAyODYyNDIzMDUxNTA5ODE1NzkzLAogICAgNywgNjEyMjIwMDMyLCAxNCwgMzc0ODEzMzY3NTgyMDgxMDI0LAogICAgNywgODkzODcxNzM5LCAxNCwgNzk5MDA2Njg1NzgyODg0MTIxLAogICAgNiwgNjQwMDAwMDAsIDE0LCAxNjM4NDAwMDAwMDAwMDAwMDAwLCAvLyAgICByYWRpeDogMjAKICAgIDYsIDg1NzY2MTIxLCAxNCwgMzI0MzkxOTkzMjUyMTUwODY4MSwKICAgIDYsIDExMzM3OTkwNCwgMTMsIDI4MjgxMDA1Nzg4MzA4Mjc1MiwKICAgIDYsIDE0ODAzNTg4OSwgMTMsIDUwNDAzNjM2MTkzNjQ2NzM4MywKICAgIDYsIDE5MTEwMjk3NiwgMTMsIDg3NjQ4ODMzODQ2NTM1NzgyNCwKICAgIDYsIDI0NDE0MDYyNSwgMTMsIDE0OTAxMTYxMTkzODQ3NjU2MjUsIC8vICAgcmFkaXg6IDI1CiAgICA2LCAzMDg5MTU3NzYsIDEzLCAyNDgxMTUyODczMjAzNzM2NTc2LAogICAgNiwgMzg3NDIwNDg5LCAxMywgNDA1MjU1NTE1MzAxODk3NjI2NywKICAgIDYsIDQ4MTg5MDMwNCwgMTIsIDIzMjIxODI2NTA4OTIxMjQxNiwKICAgIDYsIDU5NDgyMzMyMSwgMTIsIDM1MzgxNDc4MzIwNTQ2OTA0MSwKICAgIDYsIDcyOTAwMDAwMCwgMTIsIDUzMTQ0MTAwMDAwMDAwMDAwMCwgLy8gICAgcmFkaXg6IDMwCiAgICA2LCA4ODc1MDM2ODEsIDEyLCA3ODc2NjI3ODM3ODg1NDk3NjEsCiAgICA2LCAxMDczNzQxODI0LCAxMiwgMTE1MjkyMTUwNDYwNjg0Njk3NiwKICAgIDUsIDM5MTM1MzkzLCAxMiwgMTY2Nzg4OTUxNDk1Mjk4NDk2MSwKICAgIDUsIDQ1NDM1NDI0LCAxMiwgMjM4NjQyMDY4MzY5MzEwMTA1NiwKICAgIDUsIDUyNTIxODc1LCAxMiwgMzM3OTIyMDUwODA1NjY0MDYyNSwgLy8gICAgcmFkaXg6IDM1CiAgICA1LCA2MDQ2NjE3NiwgMTEsIDEzMTYyMTcwMzg0MjI2NzEzNiwKICBdOwoKICBzdGF0aWMgY29uc3QgX21heEludDY0ID0gMHg3ZmZmZmZmZmZmZmZmZmZmOwogIHN0YXRpYyBjb25zdCBfbWluSW50NjQgPSAtMHg4MDAwMDAwMDAwMDAwMDAwOwoKICBzdGF0aWMgY29uc3QgX2ludDY0VW5zaWduZWRPdmVyZmxvd0xpbWl0cyA9IGNvbnN0IFsweGZmZmZmZmZmZiwgMHhmXTsKICBzdGF0aWMgY29uc3QgX2ludDY0VW5zaWduZWRTbWlPdmVyZmxvd0xpbWl0cyA9IGNvbnN0IFsKICAgIDB4ZmZmZmZmZiwKICAgIDB4ZmZmZmZmZmZmZmZmZmZmCiAgXTsKCiAgLy8vIENhbGN1bGF0aW9uIG9mIHRoZSBleHByZXNzaW9uCiAgLy8vCiAgLy8vICAgcmVzdWx0ID0gKHJlc3VsdCAqIG11bHRpcGxpZXIpICsgKHNpZ24gKiBzbWkpCiAgLy8vCiAgLy8vIGluIGBfcGFyc2VSYWRpeCgpYCBtYXkgb3ZlcmZsb3cgNjQtYml0IGludGVnZXJzLiBJbiBzdWNoIGNhc2UsCiAgLy8vIGBpbnQucGFyc2UoKWAgc2hvdWxkIHN0b3Agd2l0aCBhbiBlcnJvci4KICAvLy8KICAvLy8gVGhpcyB0YWJsZSBpcyBsYXppbHkgZmlsbGVkIHdpdGggaW50NjQgb3ZlcmZsb3cgbGltaXRzIGZvciByZXN1bHQgYW5kIHNtaS4KICAvLy8gRm9yIGVhY2ggbXVsdGlwbGllciBmcm9tIGBfUEFSU0VfTElNSVRTW3RhYmxlSW5kZXggKyAxXWAgdGhpcyB0YWJsZQogIC8vLyBjb250YWlucwogIC8vLwogIC8vLyAqIGBbdGFibGVJbmRleCoyXWAgPSBwb3NpdGl2ZSBsaW1pdCBmb3IgcmVzdWx0CiAgLy8vICogYFt0YWJsZUluZGV4KjIgKyAxXWAgPSBuZWdhdGl2ZSBsaW1pdCBmb3IgcmVzdWx0CiAgLy8vICogYFt0YWJsZUluZGV4KjIgKyAyXWAgPSBsaW1pdCBmb3Igc21pIGlmIHJlc3VsdCBpcyBleGFjdGx5IGF0IHBvc2l0aXZlIGxpbWl0CiAgLy8vICogYFt0YWJsZUluZGV4KjIgKyAzXWAgPSBsaW1pdCBmb3Igc21pIGlmIHJlc3VsdCBpcyBleGFjdGx5IGF0IG5lZ2F0aXZlIGxpbWl0CiAgc3RhdGljIGZpbmFsIEludDY0TGlzdCBfaW50NjRPdmVyZmxvd0xpbWl0cyA9CiAgICAgIG5ldyBJbnQ2NExpc3QoX1BBUlNFX0xJTUlUUy5sZW5ndGggKiAyKTsKCiAgc3RhdGljIGludCBfaW5pdEludDY0T3ZlcmZsb3dMaW1pdHMoaW50IHRhYmxlSW5kZXgsIGludCBtdWx0aXBsaWVyKSB7CiAgICBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4XSA9IF9tYXhJbnQ2NCB+LyBtdWx0aXBsaWVyOwogICAgX2ludDY0T3ZlcmZsb3dMaW1pdHNbdGFibGVJbmRleCArIDFdID0gX21pbkludDY0IH4vIG11bHRpcGxpZXI7CiAgICBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4ICsgMl0gPSBfbWF4SW50NjQucmVtYWluZGVyKG11bHRpcGxpZXIpOwogICAgX2ludDY0T3ZlcmZsb3dMaW1pdHNbdGFibGVJbmRleCArIDNdID0gLShfbWluSW50NjQucmVtYWluZGVyKG11bHRpcGxpZXIpKTsKICAgIHJldHVybiBfaW50NjRPdmVyZmxvd0xpbWl0c1t0YWJsZUluZGV4XTsKICB9Cn0KgTQATk48AR4BHgcMCUUoASIlJCUiIgE9GxQSICUmDDIXHwgGJSMuBhQnKBMVCCAGGgQBCU1QGkUGKD8/KSo/BlErBAE+LxRRBi4BKhI6NA8aSQgoBhkeGSMRJCouEx5ODE8KCBIGSQQBCTRQJSg/PykqPwYKLBITBgQBIQFNMRs5BhlCBk0EAVEgOi8eHzkZSwgZBgFEQxQhRRQeLT4ZSwgbGAY0IyNMPiZQBkImCT4ZSwgtMDxISB0jGj0/RCwwDEU+CjQwPEU+Cgg1GCQfEwQBJ0oVFyoxKSkIDSopIRkvOQopCAYTBAFLO00nOSwtOSssLSs6KisqKzorKyoqOioqKio6KysqKjoqLCoqOikFAS8wAUg5DxYFASQGNgZFLwZRSg8GNTlUVDAvAUhARExPLQQCASNkYXJ0OmNvcmUtcGF0Y2gvaW50ZWdlcnNfcGF0Y2guZGFydDBvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9pbnZvY2F0aW9uLmRhcnSVFy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBSZXByZXNlbnRhdGlvbiBvZiB0aGUgaW52b2NhdGlvbiBvZiBhIG1lbWJlciBvbiBhbiBvYmplY3QuCiAqCiAqIFRoaXMgaXMgdGhlIHR5cGUgb2Ygb2JqZWN0cyBwYXNzZWQgdG8gW09iamVjdC5ub1N1Y2hNZXRob2RdIHdoZW4KICogYW4gb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbWVtYmVyIGludm9jYXRpb24gdGhhdCB3YXMgYXR0ZW1wdGVkCiAqIG9uIGl0LgogKi8KYWJzdHJhY3QgY2xhc3MgSW52b2NhdGlvbiB7CiAgSW52b2NhdGlvbigpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGludm9jYXRpb24gY29ycmVzcG9uZGluZyB0byBhIG1ldGhvZCBpbnZvY2F0aW9uLgogICAqCiAgICogVGhlIG1ldGhvZCBpbnZvY2F0aW9uIGhhcyBubyB0eXBlIGFyZ3VtZW50cy4KICAgKiBJZiB0aGUgbmFtZWQgYXJndW1lbnRzIGFyZSBvbWl0dGVkLCB0aGV5IGRlZmF1bHQgdG8gbm8gbmFtZWQgYXJndW1lbnRzLgogICAqLwogIGZhY3RvcnkgSW52b2NhdGlvbi5tZXRob2QoCiAgICAgICAgICBTeW1ib2wgbWVtYmVyTmFtZSwgSXRlcmFibGU8T2JqZWN0PiBwb3NpdGlvbmFsQXJndW1lbnRzLAogICAgICAgICAgW01hcDxTeW1ib2wsIE9iamVjdD4gbmFtZWRBcmd1bWVudHNdKSA9PgogICAgICBfSW52b2NhdGlvbi5tZXRob2QobWVtYmVyTmFtZSwgbnVsbCwgcG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGludm9jYXRpb24gY29ycmVzcG9uZGluZyB0byBhIGdlbmVyaWMgbWV0aG9kIGludm9jYXRpb24uCiAgICoKICAgKiBJZiBbdHlwZUFyZ3VtZW50c10gaXMgYG51bGxgIG9yIGVtcHR5LCB0aGUgY29uc3RydWN0b3IgaXMgZXF1aXZhbGVudCB0bwogICAqIGNhbGxpbmcgW0ludm9jYXRpb24ubWV0aG9kXSB3aXRoIHRoZSByZW1haW5pbmcgYXJndW1lbnRzLgogICAqIEFsbCB0aGUgaW5kaXZpZHVhbCB0eXBlIGFyZ3VtZW50cyBtdXN0IGJlIG5vbi1udWxsLgogICAqCiAgICogSWYgdGhlIG5hbWVkIGFyZ3VtZW50cyBhcmUgb21pdHRlZCwgdGhleSBkZWZhdWx0IHRvIG5vIG5hbWVkIGFyZ3VtZW50cy4KICAgKi8KICBmYWN0b3J5IEludm9jYXRpb24uZ2VuZXJpY01ldGhvZChTeW1ib2wgbWVtYmVyTmFtZSwKICAgICAgICAgIEl0ZXJhYmxlPFR5cGU+IHR5cGVBcmd1bWVudHMsIEl0ZXJhYmxlPE9iamVjdD4gcG9zaXRpb25hbEFyZ3VtZW50cywKICAgICAgICAgIFtNYXA8U3ltYm9sLCBPYmplY3Q+IG5hbWVkQXJndW1lbnRzXSkgPT4KICAgICAgX0ludm9jYXRpb24ubWV0aG9kKAogICAgICAgICAgbWVtYmVyTmFtZSwgdHlwZUFyZ3VtZW50cywgcG9zaXRpb25hbEFyZ3VtZW50cywgbmFtZWRBcmd1bWVudHMpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGludm9jYXRpb24gY29ycmVzcG9uZGluZyB0byBhIGdldHRlciBpbnZvY2F0aW9uLgogICAqLwogIGZhY3RvcnkgSW52b2NhdGlvbi5nZXR0ZXIoU3ltYm9sIG5hbWUpID0gX0ludm9jYXRpb24uZ2V0dGVyOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGludm9jYXRpb24gY29ycmVzcG9uZGluZyB0byBhIHNldHRlciBpbnZvY2F0aW9uLgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBhY2NlcHRzIGFueSBbU3ltYm9sXSBhcyBbbWVtYmVyTmFtZV0sIGJ1dCByZW1lbWJlciB0aGF0CiAgICogKmFjdHVhbCBzZXR0ZXIgbmFtZXMqIGVuZCBpbiBgPWAsIHNvIHRoZSBpbnZvY2F0aW9uIGNvcnJlc3BvbmRpbmcKICAgKiB0byBgb2JqZWN0Lm1lbWJlciA9IHZhbHVlYCBpcwogICAqIGBgYGRhcnQKICAgKiBJbnZvY2F0aW9uLnNldHRlcihjb25zdCBTeW1ib2woIm1lbWJlcj0iKSwgdmFsdWUpCiAgICogYGBgCiAgICovCiAgZmFjdG9yeSBJbnZvY2F0aW9uLnNldHRlcihTeW1ib2wgbWVtYmVyTmFtZSwgT2JqZWN0IGFyZ3VtZW50KSA9CiAgICAgIF9JbnZvY2F0aW9uLnNldHRlcjsKCiAgLyoqIFRoZSBuYW1lIG9mIHRoZSBpbnZva2VkIG1lbWJlci4gKi8KICBTeW1ib2wgZ2V0IG1lbWJlck5hbWU7CgogIC8qKgogICAqIEFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiB0aGUgY2FsbC4KICAgKgogICAqIElmIHRoZSBtZW1iZXIgaXMgYSBnZXR0ZXIsIHNldHRlciBvciBvcGVyYXRvciwKICAgKiB0aGUgdHlwZSBhcmd1bWVudCBsaXN0IGlzIGFsd2F5cyBlbXB0eS4KICAgKi8KICBMaXN0PFR5cGU+IGdldCB0eXBlQXJndW1lbnRzID0+IGNvbnN0IDxUeXBlPltdOwoKICAvKioKICAgKiBBbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgcG9zaXRpb25hbCBhcmd1bWVudHMgb2YgdGhlIGNhbGwuCiAgICoKICAgKiBJZiB0aGUgbWVtYmVyIGlzIGEgZ2V0dGVyLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudHMgbGlzdCBpcwogICAqIGFsd2F5cyBlbXB0eS4KICAgKi8KICBMaXN0PGR5bmFtaWM+IGdldCBwb3NpdGlvbmFsQXJndW1lbnRzOwoKICAvKioKICAgKiBBbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgbmFtZWQgYXJndW1lbnRzIG9mIHRoZSBjYWxsLgogICAqCiAgICogSWYgdGhlIG1lbWJlciBpcyBhIGdldHRlciwgc2V0dGVyIG9yIG9wZXJhdG9yLAogICAqIHRoZSBuYW1lZCBhcmd1bWVudHMgbWFwIGlzIGFsd2F5cyBlbXB0eS4KICAgKi8KICBNYXA8U3ltYm9sLCBkeW5hbWljPiBnZXQgbmFtZWRBcmd1bWVudHM7CgogIC8qKiBXaGV0aGVyIHRoZSBpbnZvY2F0aW9uIHdhcyBhIG1ldGhvZCBjYWxsLiAqLwogIGJvb2wgZ2V0IGlzTWV0aG9kOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBpbnZvY2F0aW9uIHdhcyBhIGdldHRlciBjYWxsLgogICAqIElmIHNvLCBhbGwgdGhyZWUgdHlwZXMgb2YgYXJndW1lbnRzIGxpc3RzIGFyZSBlbXB0eS4KICAgKi8KICBib29sIGdldCBpc0dldHRlcjsKCiAgLyoqCiAgICogV2hldGhlciB0aGUgaW52b2NhdGlvbiB3YXMgYSBzZXR0ZXIgY2FsbC4KICAgKgogICAqIElmIHNvLCBbcG9zaXRpb25hbEFyZ3VtZW50c10gaGFzIGV4YWN0bHkgb25lIHBvc2l0aW9uYWwKICAgKiBhcmd1bWVudCwgW25hbWVkQXJndW1lbnRzXSBpcyBlbXB0eSwgYW5kIHR5cGVBcmd1bWVudHMgaXMKICAgKiBlbXB0eS4KICAgKi8KICBib29sIGdldCBpc1NldHRlcjsKCiAgLyoqIFdoZXRoZXIgdGhlIGludm9jYXRpb24gd2FzIGEgZ2V0dGVyIG9yIGEgc2V0dGVyIGNhbGwuICovCiAgYm9vbCBnZXQgaXNBY2Nlc3NvciA9PiBpc0dldHRlciB8fCBpc1NldHRlcjsKfQoKLyoqIEltcGxlbWVudGF0aW9uIG9mIFtJbnZvY2F0aW9uXSB1c2VkIGJ5IGl0cyBmYWN0b3J5IGNvbnN0cnVjdG9ycy4gKi8KY2xhc3MgX0ludm9jYXRpb24gaW1wbGVtZW50cyBJbnZvY2F0aW9uIHsKICBmaW5hbCBTeW1ib2wgbWVtYmVyTmFtZTsKICBmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHM7CiAgLy8gUG9zaXRpb25hbCBhcmd1bWVudHMgaXMgYG51bGxgIGZvciBnZXR0ZXJzIG9ubHkuCiAgZmluYWwgTGlzdDxPYmplY3Q+IF9wb3NpdGlvbmFsOwogIC8vIE5hbWVkIGFyZ3VtZW50cyBpcyBgbnVsbGAgZm9yIGFjY2Vzc29ycyBvbmx5LgogIGZpbmFsIE1hcDxTeW1ib2wsIE9iamVjdD4gX25hbWVkOwoKICBfSW52b2NhdGlvbi5tZXRob2QodGhpcy5tZW1iZXJOYW1lLCBJdGVyYWJsZTxUeXBlPiB0eXBlcywKICAgICAgSXRlcmFibGU8T2JqZWN0PiBwb3NpdGlvbmFsLCBNYXA8U3ltYm9sLCBPYmplY3Q+IG5hbWVkKQogICAgICA6IHR5cGVBcmd1bWVudHMgPSBfZW5zdXJlTm9uTnVsbFR5cGVzKF9tYWtlVW5tb2RpZmlhYmxlPFR5cGU+KHR5cGVzKSksCiAgICAgICAgX3Bvc2l0aW9uYWwgPSBfbWFrZVVubW9kaWZpYWJsZTxPYmplY3Q+KHBvc2l0aW9uYWwpID8/IGNvbnN0IDxPYmplY3Q+W10sCiAgICAgICAgX25hbWVkID0gKG5hbWVkID09IG51bGwgfHwgbmFtZWQuaXNFbXB0eSkKICAgICAgICAgICAgPyBjb25zdCA8U3ltYm9sLCBPYmplY3Q+e30KICAgICAgICAgICAgOiBNYXA8U3ltYm9sLCBPYmplY3Q+LnVubW9kaWZpYWJsZShuYW1lZCk7CgogIF9JbnZvY2F0aW9uLmdldHRlcih0aGlzLm1lbWJlck5hbWUpCiAgICAgIDogdHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxUeXBlPltdLAogICAgICAgIF9wb3NpdGlvbmFsID0gbnVsbCwKICAgICAgICBfbmFtZWQgPSBudWxsOwoKICBfSW52b2NhdGlvbi5zZXR0ZXIodGhpcy5tZW1iZXJOYW1lLCBPYmplY3QgYXJndW1lbnQpCiAgICAgIDogdHlwZUFyZ3VtZW50cyA9IGNvbnN0IDxUeXBlPltdLAogICAgICAgIF9wb3NpdGlvbmFsID0gTGlzdDxPYmplY3Q+LnVubW9kaWZpYWJsZShbYXJndW1lbnRdKSwKICAgICAgICBfbmFtZWQgPSBudWxsOwoKICBMaXN0PGR5bmFtaWM+IGdldCBwb3NpdGlvbmFsQXJndW1lbnRzID0+IF9wb3NpdGlvbmFsID8/IGNvbnN0IDxPYmplY3Q+W107CgogIE1hcDxTeW1ib2wsIGR5bmFtaWM+IGdldCBuYW1lZEFyZ3VtZW50cyA9PiBfbmFtZWQgPz8gY29uc3QgPFN5bWJvbCwgT2JqZWN0Pnt9OwoKICBib29sIGdldCBpc01ldGhvZCA9PiBfbmFtZWQgIT0gbnVsbDsKICBib29sIGdldCBpc0dldHRlciA9PiBfcG9zaXRpb25hbCA9PSBudWxsOwogIGJvb2wgZ2V0IGlzU2V0dGVyID0+IF9wb3NpdGlvbmFsICE9IG51bGwgJiYgX25hbWVkID09IG51bGw7CiAgYm9vbCBnZXQgaXNBY2Nlc3NvciA9PiBfbmFtZWQgPT0gbnVsbDsKCiAgLy8vIENoZWNrcyB0aGF0IHRoZSBlbGVtZW50cyBvZiBbdHlwZXNdIGFyZSBub3QgbnVsbC4KICBzdGF0aWMgTGlzdDxUeXBlPiBfZW5zdXJlTm9uTnVsbFR5cGVzKExpc3Q8VHlwZT4gdHlwZXMpIHsKICAgIGlmICh0eXBlcyA9PSBudWxsKSByZXR1cm4gY29uc3QgPFR5cGU+W107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0eXBlc1tpXSA9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgIlR5cGUgYXJndW1lbnRzIG11c3QgYmUgbm9uLW51bGwsIHdhcyBudWxsIGF0IGluZGV4ICRpLiIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHlwZXM7CiAgfQoKICBzdGF0aWMgTGlzdDxUPiBfbWFrZVVubW9kaWZpYWJsZTxUPihJdGVyYWJsZTxUPiBlbGVtZW50cykgewogICAgaWYgKGVsZW1lbnRzID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIExpc3Q8VD4udW5tb2RpZmlhYmxlKGVsZW1lbnRzKTsKICB9Cn0KgKQATk48ARMBBD4DREYKBBwQAQZBBTJNBh1DM1EBBkkFTT85BU0GNk4zGksBBkEGPwEGQQVORyMNNwkGQhoBKRkBBj0FNC0GMgEGQwVBEwYpAQY+BTQuBisBMxUBBi86BhUBBi8FPT8MBhUBPy8CAUgqGyI2IjMkATw+TVEyJzcBJigcFwE3KD0XAUwBUQEnLD4pATg8Li0eHUcIBhIEAT4nKwQCARlkYXJ0OmNvcmUvaW52b2NhdGlvbi5kYXJ0Lm9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL2l0ZXJhYmxlLmRhcnTAAGLMLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEEgY29sbGVjdGlvbiBvZiB2YWx1ZXMsIG9yICJlbGVtZW50cyIsIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseS4KICoKICogVGhlIGVsZW1lbnRzIG9mIHRoZSBpdGVyYWJsZSBhcmUgYWNjZXNzZWQgYnkgZ2V0dGluZyBhbiBbSXRlcmF0b3JdCiAqIHVzaW5nIHRoZSBbaXRlcmF0b3JdIGdldHRlciwgYW5kIHVzaW5nIGl0IHRvIHN0ZXAgdGhyb3VnaCB0aGUgdmFsdWVzLgogKiBTdGVwcGluZyB3aXRoIHRoZSBpdGVyYXRvciBpcyBkb25lIGJ5IGNhbGxpbmcgW0l0ZXJhdG9yLm1vdmVOZXh0XSwKICogYW5kIGlmIHRoZSBjYWxsIHJldHVybnMgYHRydWVgLAogKiB0aGUgaXRlcmF0b3IgaGFzIG5vdyBtb3ZlZCB0byB0aGUgbmV4dCBlbGVtZW50LAogKiB3aGljaCBpcyB0aGVuIGF2YWlsYWJsZSBhcyBbSXRlcmF0b3IuY3VycmVudF0uCiAqIElmIHRoZSBjYWxsIHJldHVybnMgYGZhbHNlYCwgdGhlcmUgYXJlIG5vIG1vcmUgZWxlbWVudHMsCiAqIGFuZCBgaXRlcmF0b3IuY3VycmVudGAgcmV0dXJucyBgbnVsbGAuCiAqCiAqIFlvdSBjYW4gY3JlYXRlIG1vcmUgdGhhbiBvbmUgaXRlcmF0b3IgZnJvbSB0aGUgc2FtZSBgSXRlcmFibGVgLgogKiBFYWNoIHRpbWUgYGl0ZXJhdG9yYCBpcyByZWFkLCBpdCByZXR1cm5zIGEgbmV3IGl0ZXJhdG9yLAogKiBhbmQgZGlmZmVyZW50IGl0ZXJhdG9ycyBjYW4gYmUgc3RlcHBlZCB0aHJvdWdoIGluZGVwZW5kZW50bHksCiAqIGVhY2ggZ2l2aW5nIGFjY2VzcyB0byBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBpdGVyYWJsZS4KICogVGhlIGl0ZXJhdG9ycyBvZiB0aGUgc2FtZSBpdGVyYWJsZSAqc2hvdWxkKiBwcm92aWRlIHRoZSBzYW1lIHZhbHVlcwogKiBpbiB0aGUgc2FtZSBvcmRlciAodW5sZXNzIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gaXMgbW9kaWZpZWQgYmV0d2VlbgogKiB0aGUgaXRlcmF0aW9ucywgd2hpY2ggc29tZSBjb2xsZWN0aW9ucyBhbGxvdykuCiAqCiAqIFlvdSBjYW4gYWxzbyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGFuIGBJdGVyYWJsZWAKICogdXNpbmcgdGhlIGZvci1pbiBsb29wIGNvbnN0cnVjdCwgd2hpY2ggdXNlcyB0aGUgYGl0ZXJhdG9yYCBnZXR0ZXIgYmVoaW5kIHRoZQogKiBzY2VuZXMuCiAqIEZvciBleGFtcGxlLCB5b3UgY2FuIGl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGtleXMgb2YgYSBbTWFwXSwKICogYmVjYXVzZSBgTWFwYCBrZXlzIGFyZSBpdGVyYWJsZS4KICoKICogICAgIE1hcCBraWRzQm9va3MgPSB7J01hdGlsZGEnOiAnUm9hbGQgRGFobCcsCiAqICAgICAgICAgICAgICAgICAgICAgICdHcmVlbiBFZ2dzIGFuZCBIYW0nOiAnRHIgU2V1c3MnLAogKiAgICAgICAgICAgICAgICAgICAgICAnV2hlcmUgdGhlIFdpbGQgVGhpbmdzIEFyZSc6ICdNYXVyaWNlIFNlbmRhayd9OwogKiAgICAgZm9yICh2YXIgYm9vayBpbiBraWRzQm9va3Mua2V5cykgewogKiAgICAgICBwcmludCgnJGJvb2sgd2FzIHdyaXR0ZW4gYnkgJHtraWRzQm9va3NbYm9va119Jyk7CiAqICAgICB9CiAqCiAqIFRoZSBbTGlzdF0gYW5kIFtTZXRdIGNsYXNzZXMgYXJlIGJvdGggYEl0ZXJhYmxlYCwKICogYXMgYXJlIG1vc3QgY2xhc3NlcyBpbiB0aGUgYGRhcnQ6Y29sbGVjdGlvbmAgbGlicmFyeS4KICoKICogU29tZSBbSXRlcmFibGVdIGNvbGxlY3Rpb25zIGNhbiBiZSBtb2RpZmllZC4KICogQWRkaW5nIGFuIGVsZW1lbnQgdG8gYSBgTGlzdGAgb3IgYFNldGAgd2lsbCBjaGFuZ2Ugd2hpY2ggZWxlbWVudHMgaXQKICogY29udGFpbnMsIGFuZCBhZGRpbmcgYSBuZXcga2V5IHRvIGEgYE1hcGAgY2hhbmdlcyB0aGUgZWxlbWVudHMgb2YgW01hcC5rZXlzXS4KICogSXRlcmF0b3JzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGNoYW5nZSB3aWxsIHByb3ZpZGUgdGhlIG5ldyBlbGVtZW50cywgYW5kIG1heQogKiBvciBtYXkgbm90IHByZXNlcnZlIHRoZSBvcmRlciBvZiBleGlzdGluZyBlbGVtZW50cwogKiAoZm9yIGV4YW1wbGUsIGEgW0hhc2hTZXRdIG1heSBjb21wbGV0ZWx5IGNoYW5nZSBpdHMgb3JkZXIgd2hlbiBhIHNpbmdsZQogKiBlbGVtZW50IGlzIGFkZGVkKS4KICoKICogQ2hhbmdpbmcgYSBjb2xsZWN0aW9uICp3aGlsZSogaXQgaXMgYmVpbmcgaXRlcmF0ZWQKICogaXMgZ2VuZXJhbGx5ICpub3QqIGFsbG93ZWQuCiAqIERvaW5nIHNvIHdpbGwgYnJlYWsgdGhlIGl0ZXJhdGlvbiwgd2hpY2ggaXMgdHlwaWNhbGx5IHNpZ25hbGxlZAogKiBieSB0aHJvd2luZyBhIFtDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3JdCiAqIHRoZSBuZXh0IHRpbWUgW0l0ZXJhdG9yLm1vdmVOZXh0XSBpcyBjYWxsZWQuCiAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIFtJdGVyYXRvci5jdXJyZW50XSBnZXR0ZXIKICogc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSB0aGUgY2hhbmdlIGluIHRoZSBjb2xsZWN0aW9uLAogKiB0aGUgYGN1cnJlbnRgIHZhbHVlIHdhcyBzZXQgYnkgdGhlIHByZXZpb3VzIGNhbGwgdG8gW0l0ZXJhdG9yLm1vdmVOZXh0XS4KICoKICogU29tZSBpdGVyYWJsZXMgY29tcHV0ZSB0aGVpciBlbGVtZW50cyBkeW5hbWljYWxseSBldmVyeSB0aW1lIHRoZXkgYXJlCiAqIGl0ZXJhdGVkLCBsaWtlIHRoZSBvbmUgcmV0dXJuZWQgYnkgW0l0ZXJhYmxlLmdlbmVyYXRlXSBvciB0aGUgaXRlcmFibGUKICogcmV0dXJuZWQgYnkgYSBgc3luYypgIGdlbmVyYXRvciBmdW5jdGlvbi4gSWYgdGhlIGNvbXB1dGF0aW9uIGRvZXNuJ3QgZGVwZW5kCiAqIG9uIG90aGVyIG9iamVjdHMgdGhhdCBtYXkgY2hhbmdlLCB0aGVuIHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2Ugc2hvdWxkIGJlCiAqIHRoZSBzYW1lIG9uZSBldmVyeSB0aW1lIGl0J3MgaXRlcmF0ZWQuCiAqCiAqIFRoZSBtZW1iZXJzIG9mIGBJdGVyYWJsZWAsIG90aGVyIHRoYW4gYGl0ZXJhdG9yYCBpdHNlbGYsCiAqIHdvcmsgYnkgbG9va2luZyBhdCB0aGUgZWxlbWVudHMgb2YgdGhlIGl0ZXJhYmxlLgogKiBUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBydW5uaW5nIHRocm91Z2ggdGhlIFtpdGVyYXRvcl0sIGJ1dCBzb21lIGNsYXNzZXMKICogbWF5IGhhdmUgbW9yZSBlZmZpY2llbnQgd2F5cyBvZiBmaW5kaW5nIHRoZSByZXN1bHQKICogKGxpa2UgW2xhc3RdIG9yIFtsZW5ndGhdIG9uIGEgW0xpc3RdLCBvciBbY29udGFpbnNdIG9uIGEgW1NldF0pLgogKgogKiBUaGUgbWV0aG9kcyB0aGF0IHJldHVybiBhbm90aGVyIGBJdGVyYWJsZWAgKGxpa2UgW21hcF0gYW5kIFt3aGVyZV0pCiAqIGFyZSBhbGwgKmxhenkqIC0gdGhleSB3aWxsIGl0ZXJhdGUgdGhlIG9yaWdpbmFsIChhcyBuZWNlc3NhcnkpCiAqIGV2ZXJ5IHRpbWUgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGlzIGl0ZXJhdGVkLCBhbmQgbm90IGJlZm9yZS4KICoKICogU2luY2UgYW4gaXRlcmFibGUgbWF5IGJlIGl0ZXJhdGVkIG1vcmUgdGhhbiBvbmNlLCBpdCdzIG5vdCByZWNvbW1lbmRlZCB0bwogKiBoYXZlIGRldGVjdGFibGUgc2lkZS1lZmZlY3RzIGluIHRoZSBpdGVyYXRvci4KICogRm9yIG1ldGhvZHMgbGlrZSBbbWFwXSBhbmQgW3doZXJlXSwgdGhlIHJldHVybmVkIGl0ZXJhYmxlIHdpbGwgZXhlY3V0ZSB0aGUKICogYXJndW1lbnQgZnVuY3Rpb24gb24gZXZlcnkgaXRlcmF0aW9uLCBzbyB0aG9zZSBmdW5jdGlvbnMgc2hvdWxkIGFsc28gbm90CiAqIGhhdmUgc2lkZSBlZmZlY3RzLgogKi8KYWJzdHJhY3QgY2xhc3MgSXRlcmFibGU8RT4gewogIC8vIFRPRE8obHJuKTogV2hlbiB3ZSBhbGxvdyBmb3J3YXJkaW5nIGNvbnN0IGNvbnN0cnVjdG9ycyB0aHJvdWdoCiAgLy8gbWl4aW4gYXBwbGljYXRpb25zLCBtYWtlIHRoaXMgY2xhc3MgaW1wbGVtZW50IFtJdGVyYWJsZU1peGluXS4KICBjb25zdCBJdGVyYWJsZSgpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGBJdGVyYWJsZWAgd2hpY2ggZ2VuZXJhdGVzIGl0cyBlbGVtZW50cyBkeW5hbWljYWxseS4KICAgKgogICAqIFRoZSBnZW5lcmF0ZWQgaXRlcmFibGUgaGFzIFtjb3VudF0gZWxlbWVudHMsCiAgICogYW5kIHRoZSBlbGVtZW50IGF0IGluZGV4IGBuYCBpcyBjb21wdXRlZCBieSBjYWxsaW5nIGBnZW5lcmF0b3IobilgLgogICAqIFZhbHVlcyBhcmUgbm90IGNhY2hlZCwgc28gZWFjaCBpdGVyYXRpb24gY29tcHV0ZXMgdGhlIHZhbHVlcyBhZ2Fpbi4KICAgKgogICAqIElmIFtnZW5lcmF0b3JdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGFuIGlkZW50aXR5IGZ1bmN0aW9uCiAgICogb24gaW50ZWdlcnMgYChpbnQgeCkgPT4geGAsIHNvIGl0IG1heSBvbmx5IGJlIG9taXR0ZWQgaWYgdGhlIHR5cGUKICAgKiBwYXJhbWV0ZXIgYWxsb3dzIGludGVnZXIgdmFsdWVzLiBUaGF0IGlzLCBpZiBbRV0gaXMgYSBzdXBlci10eXBlCiAgICogb2YgW2ludF0uCiAgICoKICAgKiBBcyBhbiBgSXRlcmFibGVgLCBgbmV3IEl0ZXJhYmxlLmdlbmVyYXRlKG4sIGdlbmVyYXRvcikpYCBpcyBlcXVpdmFsZW50IHRvCiAgICogYGNvbnN0IFswLCAuLi4sIG4gLSAxXS5tYXAoZ2VuZXJhdG9yKWAuCiAgICovCiAgZmFjdG9yeSBJdGVyYWJsZS5nZW5lcmF0ZShpbnQgY291bnQsIFtFIGdlbmVyYXRvcihpbnQgaW5kZXgpXSkgewogICAgaWYgKGNvdW50IDw9IDApIHJldHVybiBFbXB0eUl0ZXJhYmxlPEU+KCk7CiAgICByZXR1cm4gX0dlbmVyYXRvckl0ZXJhYmxlPEU+KGNvdW50LCBnZW5lcmF0b3IpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBlbXB0eSBpdGVyYWJsZS4KICAgKgogICAqIFRoZSBlbXB0eSBpdGVyYWJsZSBoYXMgbm8gZWxlbWVudHMsIGFuZCBpdGVyYXRpbmcgaXQgYWx3YXlzIHN0b3BzCiAgICogaW1tZWRpYXRlbHkuCiAgICovCiAgY29uc3QgZmFjdG9yeSBJdGVyYWJsZS5lbXB0eSgpID0gRW1wdHlJdGVyYWJsZTxFPjsKCiAgLyoqCiAgICogQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGFuIGBJdGVyYWJsZTxUPmAuCiAgICoKICAgKiBBbnkgdGltZSB0aGUgaXRlcmFibGUgd291bGQgcHJvZHVjZSBhbiBlbGVtZW50IHRoYXQgaXMgbm90IGEgW1RdLAogICAqIHRoZSBlbGVtZW50IGFjY2VzcyB3aWxsIHRocm93LiBJZiBhbGwgZWxlbWVudHMgb2YgW3NvdXJjZV0gYXJlIGFjdHVhbGx5CiAgICogaW5zdGFuY2VzIG9mIFtUXSwgb3IgaWYgb25seSBlbGVtZW50cyB0aGF0IGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1RdCiAgICogYXJlIGFjY2Vzc2VkLCB0aGVuIHRoZSByZXN1bHRpbmcgaXRlcmFibGUgY2FuIGJlIHVzZWQgYXMgYW4gYEl0ZXJhYmxlPFQ+YC4KICAgKi8KICBzdGF0aWMgSXRlcmFibGU8VD4gY2FzdEZyb208UywgVD4oSXRlcmFibGU8Uz4gc291cmNlKSA9PgogICAgICBDYXN0SXRlcmFibGU8UywgVD4oc291cmNlKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBgSXRlcmF0b3JgIHRoYXQgYWxsb3dzIGl0ZXJhdGluZyB0aGUgZWxlbWVudHMgb2YgdGhpcwogICAqIGBJdGVyYWJsZWAuCiAgICoKICAgKiBJdGVyYWJsZSBjbGFzc2VzIG1heSBzcGVjaWZ5IHRoZSBpdGVyYXRpb24gb3JkZXIgb2YgdGhlaXIgZWxlbWVudHMKICAgKiAoZm9yIGV4YW1wbGUgW0xpc3RdIGFsd2F5cyBpdGVyYXRlIGluIGluZGV4IG9yZGVyKSwKICAgKiBvciB0aGV5IG1heSBsZWF2ZSBpdCB1bnNwZWNpZmllZCAoZm9yIGV4YW1wbGUgYSBoYXNoLWJhc2VkIFtTZXRdCiAgICogbWF5IGl0ZXJhdGUgaW4gYW55IG9yZGVyKS4KICAgKgogICAqIEVhY2ggdGltZSBgaXRlcmF0b3JgIGlzIHJlYWQsIGl0IHJldHVybnMgYSBuZXcgaXRlcmF0b3IsCiAgICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgZWxlbWVudHMgYWdhaW4uCiAgICogVGhlIGl0ZXJhdG9ycyBvZiB0aGUgc2FtZSBpdGVyYWJsZSBjYW4gYmUgc3RlcHBlZCB0aHJvdWdoIGluZGVwZW5kZW50bHksCiAgICogYnV0IHNob3VsZCByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIsCiAgICogYXMgbG9uZyBhcyB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIGlzbid0IGNoYW5nZWQuCiAgICoKICAgKiBNb2RpZnlpbmcgdGhlIGNvbGxlY3Rpb24gbWF5IGNhdXNlIG5ldyBpdGVyYXRvcnMgdG8gcHJvZHVjZQogICAqIGRpZmZlcmVudCBlbGVtZW50cywgYW5kIG1heSBjaGFuZ2UgdGhlIG9yZGVyIG9mIGV4aXN0aW5nIGVsZW1lbnRzLgogICAqIEEgW0xpc3RdIHNwZWNpZmllcyBpdHMgaXRlcmF0aW9uIG9yZGVyIHByZWNpc2VseSwKICAgKiBzbyBtb2RpZnlpbmcgdGhlIGxpc3QgY2hhbmdlcyB0aGUgaXRlcmF0aW9uIG9yZGVyIHByZWRpY3RhYmx5LgogICAqIEEgaGFzaC1iYXNlZCBbU2V0XSBtYXkgY2hhbmdlIGl0cyBpdGVyYXRpb24gb3JkZXIgY29tcGxldGVseQogICAqIHdoZW4gYWRkaW5nIGEgbmV3IGVsZW1lbnQgdG8gdGhlIHNldC4KICAgKgogICAqIE1vZGlmeWluZyB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIGFmdGVyIGNyZWF0aW5nIHRoZSBuZXcgaXRlcmF0b3IKICAgKiBtYXkgY2F1c2UgYW4gZXJyb3IgdGhlIG5leHQgdGltZSBbSXRlcmF0b3IubW92ZU5leHRdIGlzIGNhbGxlZAogICAqIG9uIHRoYXQgaXRlcmF0b3IuCiAgICogQW55ICptb2RpZmlhYmxlKiBpdGVyYWJsZSBjbGFzcyBzaG91bGQgc3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIHdpbGwKICAgKiBicmVhayBpdGVyYXRpb24uCiAgICovCiAgSXRlcmF0b3I8RT4gZ2V0IGl0ZXJhdG9yOwoKICAvKioKICAgKiBQcm92aWRlcyBhIHZpZXcgb2YgdGhpcyBpdGVyYWJsZSBhcyBhbiBpdGVyYWJsZSBvZiBbUl0gaW5zdGFuY2VzLgogICAqCiAgICogSWYgdGhpcyBpdGVyYWJsZSBvbmx5IGNvbnRhaW5zIGluc3RhbmNlcyBvZiBbUl0sIGFsbCBvcGVyYXRpb25zCiAgICogd2lsbCB3b3JrIGNvcnJlY3RseS4gSWYgYW55IG9wZXJhdGlvbiB0cmllcyB0byBhY2Nlc3MgYW4gZWxlbWVudAogICAqIHRoYXQgaXMgbm90IGFuIGluc3RhbmNlIG9mIFtSXSwgdGhlIGFjY2VzcyB3aWxsIHRocm93IGluc3RlYWQuCiAgICoKICAgKiBXaGVuIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBjcmVhdGVzIGEgbmV3IG9iamVjdCB0aGF0IGRlcGVuZHMgb24KICAgKiB0aGUgdHlwZSBbUl0sIGUuZy4sIGZyb20gW3RvTGlzdF0sIGl0IHdpbGwgaGF2ZSBleGFjdGx5IHRoZSB0eXBlIFtSXS4KICAgKi8KICBJdGVyYWJsZTxSPiBjYXN0PFI+KCkgPT4gSXRlcmFibGUuY2FzdEZyb208RSwgUj4odGhpcyk7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGF6eSBjb25jYXRlbnRhdGlvbiBvZiB0aGlzIGl0ZXJhYmxlIGFuZCBbb3RoZXJdLgogICAqCiAgICogVGhlIHJldHVybmVkIGl0ZXJhYmxlIHdpbGwgcHJvdmlkZSB0aGUgc2FtZSBlbGVtZW50cyBhcyB0aGlzIGl0ZXJhYmxlLAogICAqIGFuZCwgYWZ0ZXIgdGhhdCwgdGhlIGVsZW1lbnRzIG9mIFtvdGhlcl0sIGluIHRoZSBzYW1lIG9yZGVyIGFzIGluIHRoZQogICAqIG9yaWdpbmFsIGl0ZXJhYmxlcy4KICAgKi8KICBJdGVyYWJsZTxFPiBmb2xsb3dlZEJ5KEl0ZXJhYmxlPEU+IG90aGVyKSB7CiAgICBpZiAodGhpcyBpcyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPikgewogICAgICByZXR1cm4gRm9sbG93ZWRCeUl0ZXJhYmxlPEU+LmZpcnN0RWZmaWNpZW50KHRoaXMsIG90aGVyKTsKICAgIH0KICAgIHJldHVybiBGb2xsb3dlZEJ5SXRlcmFibGU8RT4odGhpcywgb3RoZXIpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBsYXp5IFtJdGVyYWJsZV0gd2l0aCBlbGVtZW50cyB0aGF0IGFyZSBjcmVhdGVkIGJ5CiAgICogY2FsbGluZyBgZmAgb24gZWFjaCBlbGVtZW50IG9mIHRoaXMgYEl0ZXJhYmxlYCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICoKICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmlldyBvZiB0aGUgbWFwcGVkIGVsZW1lbnRzLiBBcyBsb25nIGFzIHRoZQogICAqIHJldHVybmVkIFtJdGVyYWJsZV0gaXMgbm90IGl0ZXJhdGVkIG92ZXIsIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBbZl0gd2lsbAogICAqIG5vdCBiZSBpbnZva2VkLiBUaGUgdHJhbnNmb3JtZWQgZWxlbWVudHMgd2lsbCBub3QgYmUgY2FjaGVkLiBJdGVyYXRpbmcKICAgKiBtdWx0aXBsZSB0aW1lcyBvdmVyIHRoZSByZXR1cm5lZCBbSXRlcmFibGVdIHdpbGwgaW52b2tlIHRoZSBzdXBwbGllZAogICAqIGZ1bmN0aW9uIFtmXSBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBlbGVtZW50LgogICAqCiAgICogTWV0aG9kcyBvbiB0aGUgcmV0dXJuZWQgaXRlcmFibGUgYXJlIGFsbG93ZWQgdG8gb21pdCBjYWxsaW5nIGBmYAogICAqIG9uIGFueSBlbGVtZW50IHdoZXJlIHRoZSByZXN1bHQgaXNuJ3QgbmVlZGVkLgogICAqIEZvciBleGFtcGxlLCBbZWxlbWVudEF0XSBtYXkgY2FsbCBgZmAgb25seSBvbmNlLgogICAqLwogIEl0ZXJhYmxlPFQ+IG1hcDxUPihUIGYoRSBlKSkgPT4gTWFwcGVkSXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGF6eSBbSXRlcmFibGVdIHdpdGggYWxsIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUKICAgKiBwcmVkaWNhdGUgW3Rlc3RdLgogICAqCiAgICogVGhlIG1hdGNoaW5nIGVsZW1lbnRzIGhhdmUgdGhlIHNhbWUgb3JkZXIgaW4gdGhlIHJldHVybmVkIGl0ZXJhYmxlCiAgICogYXMgdGhleSBoYXZlIGluIFtpdGVyYXRvcl0uCiAgICoKICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmlldyBvZiB0aGUgbWFwcGVkIGVsZW1lbnRzLgogICAqIEFzIGxvbmcgYXMgdGhlIHJldHVybmVkIFtJdGVyYWJsZV0gaXMgbm90IGl0ZXJhdGVkIG92ZXIsCiAgICogdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIFt0ZXN0XSB3aWxsIG5vdCBiZSBpbnZva2VkLgogICAqIEl0ZXJhdGluZyB3aWxsIG5vdCBjYWNoZSByZXN1bHRzLCBhbmQgdGh1cyBpdGVyYXRpbmcgbXVsdGlwbGUgdGltZXMgb3ZlcgogICAqIHRoZSByZXR1cm5lZCBbSXRlcmFibGVdIG1heSBpbnZva2UgdGhlIHN1cHBsaWVkCiAgICogZnVuY3Rpb24gW3Rlc3RdIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGVsZW1lbnQuCiAgICovCiAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IFdoZXJlSXRlcmFibGU8RT4odGhpcywgdGVzdCk7CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGF6eSBbSXRlcmFibGVdIHdpdGggYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSB0eXBlIFtUXS4KICAgKgogICAqIFRoZSBtYXRjaGluZyBlbGVtZW50cyBoYXZlIHRoZSBzYW1lIG9yZGVyIGluIHRoZSByZXR1cm5lZCBpdGVyYWJsZQogICAqIGFzIHRoZXkgaGF2ZSBpbiBbaXRlcmF0b3JdLgogICAqCiAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHZpZXcgb2YgdGhlIG1hcHBlZCBlbGVtZW50cy4KICAgKiBJdGVyYXRpbmcgd2lsbCBub3QgY2FjaGUgcmVzdWx0cywgYW5kIHRodXMgaXRlcmF0aW5nIG11bHRpcGxlIHRpbWVzIG92ZXIKICAgKiB0aGUgcmV0dXJuZWQgW0l0ZXJhYmxlXSBtYXkgeWllbGQgZGlmZmVyZW50IHJlc3VsdHMsCiAgICogaWYgdGhlIHVuZGVybHlpbmcgZWxlbWVudHMgY2hhbmdlIGJldHdlZW4gaXRlcmF0aW9ucy4KICAgKi8KICBJdGVyYWJsZTxUPiB3aGVyZVR5cGU8VD4oKSA9PiBXaGVyZVR5cGVJdGVyYWJsZTxUPih0aGlzKTsKCiAgLyoqCiAgICogRXhwYW5kcyBlYWNoIGVsZW1lbnQgb2YgdGhpcyBbSXRlcmFibGVdIGludG8gemVybyBvciBtb3JlIGVsZW1lbnRzLgogICAqCiAgICogVGhlIHJlc3VsdGluZyBJdGVyYWJsZSBydW5zIHRocm91Z2ggdGhlIGVsZW1lbnRzIHJldHVybmVkCiAgICogYnkgW2ZdIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhpcywgaW4gaXRlcmF0aW9uIG9yZGVyLgogICAqCiAgICogVGhlIHJldHVybmVkIFtJdGVyYWJsZV0gaXMgbGF6eSwgYW5kIGNhbGxzIFtmXSBmb3IgZWFjaCBlbGVtZW50CiAgICogb2YgdGhpcyBldmVyeSB0aW1lIGl0J3MgaXRlcmF0ZWQuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIHZhciBwYWlycyA9IFtbMSwgMl0sIFszLCA0XV07CiAgICogICAgIHZhciBmbGF0dGVuZWQgPSBwYWlycy5leHBhbmQoKHBhaXIpID0+IHBhaXIpLnRvTGlzdCgpOwogICAqICAgICBwcmludChmbGF0dGVuZWQpOyAvLyA9PiBbMSwgMiwgMywgNF07CiAgICoKICAgKiAgICAgdmFyIGlucHV0ID0gWzEsIDIsIDNdOwogICAqICAgICB2YXIgZHVwbGljYXRlZCA9IGlucHV0LmV4cGFuZCgoaSkgPT4gW2ksIGldKS50b0xpc3QoKTsKICAgKiAgICAgcHJpbnQoZHVwbGljYXRlZCk7IC8vID0+IFsxLCAxLCAyLCAyLCAzLCAzXQogICAqCiAgICovCiAgSXRlcmFibGU8VD4gZXhwYW5kPFQ+KEl0ZXJhYmxlPFQ+IGYoRSBlbGVtZW50KSkgPT4KICAgICAgRXhwYW5kSXRlcmFibGU8RSwgVD4odGhpcywgZik7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhbiBlbGVtZW50IGVxdWFsIHRvIFtlbGVtZW50XS4KICAgKgogICAqIFRoaXMgb3BlcmF0aW9uIHdpbGwgY2hlY2sgZWFjaCBlbGVtZW50IGluIG9yZGVyIGZvciBiZWluZyBlcXVhbCB0bwogICAqIFtlbGVtZW50XSwgdW5sZXNzIGl0IGhhcyBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBmaW5kIGFuIGVsZW1lbnQKICAgKiBlcXVhbCB0byBbZWxlbWVudF0uCiAgICoKICAgKiBUaGUgZXF1YWxpdHkgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBbZWxlbWVudF0gaXMgZXF1YWwgdG8gYW4gZWxlbWVudCBvZgogICAqIHRoZSBpdGVyYWJsZSBkZWZhdWx0cyB0byB0aGUgW09iamVjdC49PV0gb2YgdGhlIGVsZW1lbnQuCiAgICoKICAgKiBTb21lIHR5cGVzIG9mIGl0ZXJhYmxlIG1heSBoYXZlIGEgZGlmZmVyZW50IGVxdWFsaXR5IHVzZWQgZm9yIGl0cyBlbGVtZW50cy4KICAgKiBGb3IgZXhhbXBsZSwgYSBbU2V0XSBtYXkgaGF2ZSBhIGN1c3RvbSBlcXVhbGl0eQogICAqIChzZWUgW1NldC5pZGVudGl0eV0pIHRoYXQgaXRzIGBjb250YWluc2AgdXNlcy4KICAgKiBMaWtld2lzZSB0aGUgYEl0ZXJhYmxlYCByZXR1cm5lZCBieSBhIFtNYXAua2V5c10gY2FsbAogICAqIHNob3VsZCB1c2UgdGhlIHNhbWUgZXF1YWxpdHkgdGhhdCB0aGUgYE1hcGAgdXNlcyBmb3Iga2V5cy4KICAgKi8KICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSB7CiAgICBmb3IgKEUgZSBpbiB0aGlzKSB7CiAgICAgIGlmIChlID09IGVsZW1lbnQpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogQXBwbGllcyB0aGUgZnVuY3Rpb24gW2ZdIHRvIGVhY2ggZWxlbWVudCBvZiB0aGlzIGNvbGxlY3Rpb24gaW4gaXRlcmF0aW9uCiAgICogb3JkZXIuCiAgICovCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihFIGVsZW1lbnQpKSB7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSBmKGVsZW1lbnQpOwogIH0KCiAgLyoqCiAgICogUmVkdWNlcyBhIGNvbGxlY3Rpb24gdG8gYSBzaW5nbGUgdmFsdWUgYnkgaXRlcmF0aXZlbHkgY29tYmluaW5nIGVsZW1lbnRzCiAgICogb2YgdGhlIGNvbGxlY3Rpb24gdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIGl0ZXJhYmxlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC4KICAgKiBJZiBpdCBoYXMgb25seSBvbmUgZWxlbWVudCwgdGhhdCBlbGVtZW50IGlzIHJldHVybmVkLgogICAqCiAgICogT3RoZXJ3aXNlIHRoaXMgbWV0aG9kIHN0YXJ0cyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yLAogICAqIGFuZCB0aGVuIGNvbWJpbmVzIGl0IHdpdGggdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiBpdGVyYXRpb24gb3JkZXIsCiAgICogYXMgaWYgYnk6CiAgICoKICAgKiAgICAgRSB2YWx1ZSA9IGl0ZXJhYmxlLmZpcnN0OwogICAqICAgICBpdGVyYWJsZS5za2lwKDEpLmZvckVhY2goKGVsZW1lbnQpIHsKICAgKiAgICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIGVsZW1lbnQpOwogICAqICAgICB9KTsKICAgKiAgICAgcmV0dXJuIHZhbHVlOwogICAqCiAgICogRXhhbXBsZSBvZiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFuIGl0ZXJhYmxlOgogICAqCiAgICogICAgIGl0ZXJhYmxlLnJlZHVjZSgodmFsdWUsIGVsZW1lbnQpID0+IHZhbHVlICsgZWxlbWVudCk7CiAgICoKICAgKi8KICBFIHJlZHVjZShFIGNvbWJpbmUoRSB2YWx1ZSwgRSBlbGVtZW50KSkgewogICAgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogICAgfQogICAgRSB2YWx1ZSA9IGl0ZXJhdG9yLmN1cnJlbnQ7CiAgICB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSkgewogICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgLyoqCiAgICogUmVkdWNlcyBhIGNvbGxlY3Rpb24gdG8gYSBzaW5nbGUgdmFsdWUgYnkgaXRlcmF0aXZlbHkgY29tYmluaW5nIGVhY2gKICAgKiBlbGVtZW50IG9mIHRoZSBjb2xsZWN0aW9uIHdpdGggYW4gZXhpc3RpbmcgdmFsdWUKICAgKgogICAqIFVzZXMgW2luaXRpYWxWYWx1ZV0gYXMgdGhlIGluaXRpYWwgdmFsdWUsCiAgICogdGhlbiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgdXBkYXRlcyB0aGUgdmFsdWUgd2l0aAogICAqIGVhY2ggZWxlbWVudCB1c2luZyB0aGUgW2NvbWJpbmVdIGZ1bmN0aW9uLCBhcyBpZiBieToKICAgKgogICAqICAgICB2YXIgdmFsdWUgPSBpbml0aWFsVmFsdWU7CiAgICogICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgKiAgICAgICB2YWx1ZSA9IGNvbWJpbmUodmFsdWUsIGVsZW1lbnQpOwogICAqICAgICB9CiAgICogICAgIHJldHVybiB2YWx1ZTsKICAgKgogICAqIEV4YW1wbGUgb2YgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhbiBpdGVyYWJsZToKICAgKgogICAqICAgICBpdGVyYWJsZS5mb2xkKDAsIChwcmV2LCBlbGVtZW50KSA9PiBwcmV2ICsgZWxlbWVudCk7CiAgICoKICAgKi8KICBUIGZvbGQ8VD4oVCBpbml0aWFsVmFsdWUsIFQgY29tYmluZShUIHByZXZpb3VzVmFsdWUsIEUgZWxlbWVudCkpIHsKICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHZhbHVlID0gY29tYmluZSh2YWx1ZSwgZWxlbWVudCk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBDaGVja3Mgd2hldGhlciBldmVyeSBlbGVtZW50IG9mIHRoaXMgaXRlcmFibGUgc2F0aXNmaWVzIFt0ZXN0XS4KICAgKgogICAqIENoZWNrcyBldmVyeSBlbGVtZW50IGluIGl0ZXJhdGlvbiBvcmRlciwgYW5kIHJldHVybnMgYGZhbHNlYCBpZgogICAqIGFueSBvZiB0aGVtIG1ha2UgW3Rlc3RdIHJldHVybiBgZmFsc2VgLCBvdGhlcndpc2UgcmV0dXJucyBgdHJ1ZWAuCiAgICovCiAgYm9vbCBldmVyeShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAoIXRlc3QoZWxlbWVudCkpIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyoqCiAgICogQ29udmVydHMgZWFjaCBlbGVtZW50IHRvIGEgW1N0cmluZ10gYW5kIGNvbmNhdGVuYXRlcyB0aGUgc3RyaW5ncy4KICAgKgogICAqIEl0ZXJhdGVzIHRocm91Z2ggZWxlbWVudHMgb2YgdGhpcyBpdGVyYWJsZSwKICAgKiBjb252ZXJ0cyBlYWNoIG9uZSB0byBhIFtTdHJpbmddIGJ5IGNhbGxpbmcgW09iamVjdC50b1N0cmluZ10sCiAgICogYW5kIHRoZW4gY29uY2F0ZW5hdGVzIHRoZSBzdHJpbmdzLCB3aXRoIHRoZQogICAqIFtzZXBhcmF0b3JdIHN0cmluZyBpbnRlcmxlYXZlZCBiZXR3ZWVuIHRoZSBlbGVtZW50cy4KICAgKi8KICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgewogICAgSXRlcmF0b3I8RT4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogICAgaWYgKCFpdGVyYXRvci5tb3ZlTmV4dCgpKSByZXR1cm4gIiI7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CiAgICBpZiAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yID09ICIiKSB7CiAgICAgIGRvIHsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICBidWZmZXIud3JpdGUoc2VwYXJhdG9yKTsKICAgICAgICBidWZmZXIud3JpdGUoIiR7aXRlcmF0b3IuY3VycmVudH0iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIHdoZXRoZXIgYW55IGVsZW1lbnQgb2YgdGhpcyBpdGVyYWJsZSBzYXRpc2ZpZXMgW3Rlc3RdLgogICAqCiAgICogQ2hlY2tzIGV2ZXJ5IGVsZW1lbnQgaW4gaXRlcmF0aW9uIG9yZGVyLCBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYKICAgKiBhbnkgb2YgdGhlbSBtYWtlIFt0ZXN0XSByZXR1cm4gYHRydWVgLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KICAgKi8KICBib29sIGFueShib29sIHRlc3QoRSBlbGVtZW50KSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgW0xpc3RdIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMgW0l0ZXJhYmxlXS4KICAgKgogICAqIFRoZSBlbGVtZW50cyBhcmUgaW4gaXRlcmF0aW9uIG9yZGVyLgogICAqIFRoZSBsaXN0IGlzIGZpeGVkLWxlbmd0aCBpZiBbZ3Jvd2FibGVdIGlzIGZhbHNlLgogICAqLwogIExpc3Q8RT4gdG9MaXN0KHtib29sIGdyb3dhYmxlID0gdHJ1ZX0pIHsKICAgIHJldHVybiBMaXN0PEU+LmZyb20odGhpcywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBbU2V0XSBjb250YWluaW5nIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHRoaXMgaXRlcmFibGUuCiAgICoKICAgKiBUaGUgc2V0IG1heSBjb250YWluIGZld2VyIGVsZW1lbnRzIHRoYW4gdGhlIGl0ZXJhYmxlLAogICAqIGlmIHRoZSBpdGVyYWJsZSBjb250YWlucyBhbiBlbGVtZW50IG1vcmUgdGhhbiBvbmNlLAogICAqIG9yIGl0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGVsZW1lbnRzIHRoYXQgYXJlIGVxdWFsLgogICAqIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNldCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZQogICAqIGFzIGZvciB0aGUgaXRlcmFibGUuCiAgICovCiAgU2V0PEU+IHRvU2V0KCkgPT4gU2V0PEU+LmZyb20odGhpcyk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBbdGhpc10uCiAgICoKICAgKiBDb3VudGluZyBhbGwgZWxlbWVudHMgbWF5IGludm9sdmUgaXRlcmF0aW5nIHRocm91Z2ggYWxsIGVsZW1lbnRzIGFuZCBjYW4KICAgKiB0aGVyZWZvcmUgYmUgc2xvdy4KICAgKiBTb21lIGl0ZXJhYmxlcyBoYXZlIGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGZpbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KICAgKi8KICBpbnQgZ2V0IGxlbmd0aCB7CiAgICBhc3NlcnQodGhpcyBpcyEgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGUpOwogICAgaW50IGNvdW50ID0gMDsKICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3I7CiAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogICAgICBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIGNvdW50OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoaXMgY29sbGVjdGlvbi4KICAgKgogICAqIE1heSBiZSBjb21wdXRlZCBieSBjaGVja2luZyBpZiBgaXRlcmF0b3IubW92ZU5leHQoKWAgcmV0dXJucyBgZmFsc2VgLgogICAqLwogIGJvb2wgZ2V0IGlzRW1wdHkgPT4gIWl0ZXJhdG9yLm1vdmVOZXh0KCk7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGlzIGNvbGxlY3Rpb24uCiAgICoKICAgKiBNYXkgYmUgY29tcHV0ZWQgYnkgY2hlY2tpbmcgaWYgYGl0ZXJhdG9yLm1vdmVOZXh0KClgIHJldHVybnMgYHRydWVgLgogICAqLwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIC8qKgogICAqIFJldHVybnMgYSBsYXp5IGl0ZXJhYmxlIG9mIHRoZSBbY291bnRdIGZpcnN0IGVsZW1lbnRzIG9mIHRoaXMgaXRlcmFibGUuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgYEl0ZXJhYmxlYCBtYXkgY29udGFpbiBmZXdlciB0aGFuIGBjb3VudGAgZWxlbWVudHMsIGlmIGB0aGlzYAogICAqIGNvbnRhaW5zIGZld2VyIHRoYW4gYGNvdW50YCBlbGVtZW50cy4KICAgKgogICAqIFRoZSBlbGVtZW50cyBjYW4gYmUgY29tcHV0ZWQgYnkgc3RlcHBpbmcgdGhyb3VnaCBbaXRlcmF0b3JdIHVudGlsIFtjb3VudF0KICAgKiBlbGVtZW50cyBoYXZlIGJlZW4gc2Vlbi4KICAgKgogICAqIFRoZSBgY291bnRgIG11c3Qgbm90IGJlIG5lZ2F0aXZlLgogICAqLwogIEl0ZXJhYmxlPEU+IHRha2UoaW50IGNvdW50KSB7CiAgICByZXR1cm4gVGFrZUl0ZXJhYmxlPEU+KHRoaXMsIGNvdW50KTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBsYXp5IGl0ZXJhYmxlIG9mIHRoZSBsZWFkaW5nIGVsZW1lbnRzIHNhdGlzZnlpbmcgW3Rlc3RdLgogICAqCiAgICogVGhlIGZpbHRlcmluZyBoYXBwZW5zIGxhemlseS4gRXZlcnkgbmV3IGl0ZXJhdG9yIG9mIHRoZSByZXR1cm5lZAogICAqIGl0ZXJhYmxlIHN0YXJ0cyBpdGVyYXRpbmcgb3ZlciB0aGUgZWxlbWVudHMgb2YgYHRoaXNgLgogICAqCiAgICogVGhlIGVsZW1lbnRzIGNhbiBiZSBjb21wdXRlZCBieSBzdGVwcGluZyB0aHJvdWdoIFtpdGVyYXRvcl0gdW50aWwgYW4KICAgKiBlbGVtZW50IGlzIGZvdW5kIHdoZXJlIGB0ZXN0KGVsZW1lbnQpYCBpcyBmYWxzZS4gQXQgdGhhdCBwb2ludCwKICAgKiB0aGUgcmV0dXJuZWQgaXRlcmFibGUgc3RvcHMgKGl0cyBgbW92ZU5leHQoKWAgcmV0dXJucyBmYWxzZSkuCiAgICovCiAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgewogICAgcmV0dXJuIFRha2VXaGlsZUl0ZXJhYmxlPEU+KHRoaXMsIHRlc3QpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiBbSXRlcmFibGVdIHRoYXQgcHJvdmlkZXMgYWxsIGJ1dCB0aGUgZmlyc3QgW2NvdW50XSBlbGVtZW50cy4KICAgKgogICAqIFdoZW4gdGhlIHJldHVybmVkIGl0ZXJhYmxlIGlzIGl0ZXJhdGVkLCBpdCBzdGFydHMgaXRlcmF0aW5nIG92ZXIgYHRoaXNgLAogICAqIGZpcnN0IHNraXBwaW5nIHBhc3QgdGhlIGluaXRpYWwgW2NvdW50XSBlbGVtZW50cy4KICAgKiBJZiBgdGhpc2AgaGFzIGZld2VyIHRoYW4gYGNvdW50YCBlbGVtZW50cywgdGhlbiB0aGUgcmVzdWx0aW5nIEl0ZXJhYmxlIGlzCiAgICogZW1wdHkuCiAgICogQWZ0ZXIgdGhhdCwgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBhcmUgaXRlcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMKICAgKiBpbiB0aGlzIGl0ZXJhYmxlLgogICAqCiAgICogU29tZSBpdGVyYWJsZXMgbWF5IGJlIGFibGUgdG8gZmluZCBsYXRlciBlbGVtZW50cyB3aXRob3V0IGZpcnN0IGl0ZXJhdGluZwogICAqIHRocm91Z2ggZWFybGllciBlbGVtZW50cywgZm9yIGV4YW1wbGUgd2hlbiBpdGVyYXRpbmcgYSBbTGlzdF0uCiAgICogU3VjaCBpdGVyYWJsZXMgYXJlIGFsbG93ZWQgdG8gaWdub3JlIHRoZSBpbml0aWFsIHNraXBwZWQgZWxlbWVudHMuCiAgICoKICAgKiBUaGUgW2NvdW50XSBtdXN0IG5vdCBiZSBuZWdhdGl2ZS4KICAgKi8KICBJdGVyYWJsZTxFPiBza2lwKGludCBjb3VudCkgewogICAgcmV0dXJuIFNraXBJdGVyYWJsZTxFPih0aGlzLCBjb3VudCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGFuIGBJdGVyYWJsZWAgdGhhdCBza2lwcyBsZWFkaW5nIGVsZW1lbnRzIHdoaWxlIFt0ZXN0XSBpcyBzYXRpc2ZpZWQuCiAgICoKICAgKiBUaGUgZmlsdGVyaW5nIGhhcHBlbnMgbGF6aWx5LiBFdmVyeSBuZXcgW0l0ZXJhdG9yXSBvZiB0aGUgcmV0dXJuZWQKICAgKiBpdGVyYWJsZSBpdGVyYXRlcyBvdmVyIGFsbCBlbGVtZW50cyBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgcHJvdmlkZXMgZWxlbWVudHMgYnkgaXRlcmF0aW5nIHRoaXMgaXRlcmFibGUsCiAgICogYnV0IHNraXBwaW5nIG92ZXIgYWxsIGluaXRpYWwgZWxlbWVudHMgd2hlcmUgYHRlc3QoZWxlbWVudClgIHJldHVybnMKICAgKiB0cnVlLiBJZiBhbGwgZWxlbWVudHMgc2F0aXNmeSBgdGVzdGAgdGhlIHJlc3VsdGluZyBpdGVyYWJsZSBpcyBlbXB0eSwKICAgKiBvdGhlcndpc2UgaXQgaXRlcmF0ZXMgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlciwKICAgKiBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IGZvciB3aGljaCBgdGVzdChlbGVtZW50KWAgcmV0dXJucyBgZmFsc2VgLgogICAqLwogIEl0ZXJhYmxlPEU+IHNraXBXaGlsZShib29sIHRlc3QoRSB2YWx1ZSkpIHsKICAgIHJldHVybiBTa2lwV2hpbGVJdGVyYWJsZTxFPih0aGlzLCB0ZXN0KTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQuCiAgICoKICAgKiBUaHJvd3MgYSBbU3RhdGVFcnJvcl0gaWYgYHRoaXNgIGlzIGVtcHR5LgogICAqIE90aGVyd2lzZSByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBpdGVyYXRpb24gb3JkZXIsCiAgICogZXF1aXZhbGVudCB0byBgdGhpcy5lbGVtZW50QXQoMClgLgogICAqLwogIEUgZ2V0IGZpcnN0IHsKICAgIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3I7CiAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICByZXR1cm4gaXQuY3VycmVudDsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudC4KICAgKgogICAqIFRocm93cyBhIFtTdGF0ZUVycm9yXSBpZiBgdGhpc2AgaXMgZW1wdHkuCiAgICogT3RoZXJ3aXNlIG1heSBpdGVyYXRlIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSBsYXN0IG9uZQogICAqIHNlZW4uCiAgICogU29tZSBpdGVyYWJsZXMgbWF5IGhhdmUgbW9yZSBlZmZpY2llbnQgd2F5cyB0byBmaW5kIHRoZSBsYXN0IGVsZW1lbnQKICAgKiAoZm9yIGV4YW1wbGUgYSBsaXN0IGNhbiBkaXJlY3RseSBhY2Nlc3MgdGhlIGxhc3QgZWxlbWVudCwKICAgKiB3aXRob3V0IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBwcmV2aW91cyBvbmVzKS4KICAgKi8KICBFIGdldCBsYXN0IHsKICAgIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3I7CiAgICBpZiAoIWl0Lm1vdmVOZXh0KCkpIHsKICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICB9CiAgICBFIHJlc3VsdDsKICAgIGRvIHsKICAgICAgcmVzdWx0ID0gaXQuY3VycmVudDsKICAgIH0gd2hpbGUgKGl0Lm1vdmVOZXh0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENoZWNrcyB0aGF0IHRoaXMgaXRlcmFibGUgaGFzIG9ubHkgb25lIGVsZW1lbnQsIGFuZCByZXR1cm5zIHRoYXQgZWxlbWVudC4KICAgKgogICAqIFRocm93cyBhIFtTdGF0ZUVycm9yXSBpZiBgdGhpc2AgaXMgZW1wdHkgb3IgaGFzIG1vcmUgdGhhbiBvbmUgZWxlbWVudC4KICAgKi8KICBFIGdldCBzaW5nbGUgewogICAgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcjsKICAgIGlmICghaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgICBFIHJlc3VsdCA9IGl0LmN1cnJlbnQ7CiAgICBpZiAoaXQubW92ZU5leHQoKSkgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBzYXRpc2ZpZXMgdGhlIGdpdmVuIHByZWRpY2F0ZSBbdGVzdF0uCiAgICoKICAgKiBJdGVyYXRlcyB0aHJvdWdoIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCB0byBzYXRpc2Z5IFt0ZXN0XS4KICAgKgogICAqIElmIG5vIGVsZW1lbnQgc2F0aXNmaWVzIFt0ZXN0XSwgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgW29yRWxzZV0KICAgKiBmdW5jdGlvbiBpcyByZXR1cm5lZC4KICAgKiBJZiBbb3JFbHNlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0aHJvd2luZyBhIFtTdGF0ZUVycm9yXS4KICAgKi8KICBFIGZpcnN0V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBpZiAob3JFbHNlICE9IG51bGwpIHJldHVybiBvckVsc2UoKTsKICAgIHRocm93IEl0ZXJhYmxlRWxlbWVudEVycm9yLm5vRWxlbWVudCgpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IHRoYXQgc2F0aXNmaWVzIHRoZSBnaXZlbiBwcmVkaWNhdGUgW3Rlc3RdLgogICAqCiAgICogQW4gaXRlcmFibGUgdGhhdCBjYW4gYWNjZXNzIGl0cyBlbGVtZW50cyBkaXJlY3RseSBtYXkgY2hlY2sgaXRzCiAgICogZWxlbWVudHMgaW4gYW55IG9yZGVyIChmb3IgZXhhbXBsZSBhIGxpc3Qgc3RhcnRzIGJ5IGNoZWNraW5nIHRoZQogICAqIGxhc3QgZWxlbWVudCBhbmQgdGhlbiBtb3ZlcyB0b3dhcmRzIHRoZSBzdGFydCBvZiB0aGUgbGlzdCkuCiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgZWxlbWVudHMgaW4gaXRlcmF0aW9uIG9yZGVyLAogICAqIGNoZWNrcyBgdGVzdChlbGVtZW50KWAgZm9yIGVhY2gsCiAgICogYW5kIGZpbmFsbHkgcmV0dXJucyB0aGF0IGxhc3Qgb25lIHRoYXQgbWF0Y2hlZC4KICAgKgogICAqIElmIG5vIGVsZW1lbnQgc2F0aXNmaWVzIFt0ZXN0XSwgdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgW29yRWxzZV0KICAgKiBmdW5jdGlvbiBpcyByZXR1cm5lZC4KICAgKiBJZiBbb3JFbHNlXSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0aHJvd2luZyBhIFtTdGF0ZUVycm9yXS4KICAgKi8KICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CiAgICBFIHJlc3VsdDsKICAgIGJvb2wgZm91bmRNYXRjaGluZyA9IGZhbHNlOwogICAgZm9yIChFIGVsZW1lbnQgaW4gdGhpcykgewogICAgICBpZiAodGVzdChlbGVtZW50KSkgewogICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CiAgICAgICAgZm91bmRNYXRjaGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb3VuZE1hdGNoaW5nKSByZXR1cm4gcmVzdWx0OwogICAgaWYgKG9yRWxzZSAhPSBudWxsKSByZXR1cm4gb3JFbHNlKCk7CiAgICB0aHJvdyBJdGVyYWJsZUVsZW1lbnRFcnJvci5ub0VsZW1lbnQoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNpbmdsZSBlbGVtZW50IHRoYXQgc2F0aXNmaWVzIFt0ZXN0XS4KICAgKgogICAqIENoZWNrcyBlbGVtZW50cyB0byBzZWUgaWYgYHRlc3QoZWxlbWVudClgIHJldHVybnMgdHJ1ZS4KICAgKiBJZiBleGFjdGx5IG9uZSBlbGVtZW50IHNhdGlzZmllcyBbdGVzdF0sIHRoYXQgZWxlbWVudCBpcyByZXR1cm5lZC4KICAgKiBJZiBtb3JlIHRoYW4gb25lIG1hdGNoaW5nIGVsZW1lbnQgaXMgZm91bmQsIHRocm93cyBbU3RhdGVFcnJvcl0uCiAgICogSWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgcmV0dXJucyB0aGUgcmVzdWx0IG9mIFtvckVsc2VdLgogICAqIElmIFtvckVsc2VdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRocm93aW5nIGEgW1N0YXRlRXJyb3JdLgogICAqLwogIEUgc2luZ2xlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIHtFIG9yRWxzZSgpfSkgewogICAgRSByZXN1bHQ7CiAgICBib29sIGZvdW5kTWF0Y2hpbmcgPSBmYWxzZTsKICAgIGZvciAoRSBlbGVtZW50IGluIHRoaXMpIHsKICAgICAgaWYgKHRlc3QoZWxlbWVudCkpIHsKICAgICAgICBpZiAoZm91bmRNYXRjaGluZykgewogICAgICAgICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3IudG9vTWFueSgpOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSBlbGVtZW50OwogICAgICAgIGZvdW5kTWF0Y2hpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoZm91bmRNYXRjaGluZykgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChvckVsc2UgIT0gbnVsbCkgcmV0dXJuIG9yRWxzZSgpOwogICAgdGhyb3cgSXRlcmFibGVFbGVtZW50RXJyb3Iubm9FbGVtZW50KCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBbaW5kZXhddGggZWxlbWVudC4KICAgKgogICAqIFRoZSBbaW5kZXhdIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBsZXNzIHRoYW4gW2xlbmd0aF0uCiAgICogSW5kZXggemVybyByZXByZXNlbnRzIHRoZSBmaXJzdCBlbGVtZW50IChzbyBgaXRlcmFibGUuZWxlbWVudEF0KDApYCBpcwogICAqIGVxdWl2YWxlbnQgdG8gYGl0ZXJhYmxlLmZpcnN0YCkuCiAgICoKICAgKiBNYXkgaXRlcmF0ZSB0aHJvdWdoIHRoZSBlbGVtZW50cyBpbiBpdGVyYXRpb24gb3JkZXIsIGlnbm9yaW5nIHRoZQogICAqIGZpcnN0IFtpbmRleF0gZWxlbWVudHMgYW5kIHRoZW4gcmV0dXJuaW5nIHRoZSBuZXh0LgogICAqIFNvbWUgaXRlcmFibGVzIG1heSBoYXZlIG1vcmUgYSBlZmZpY2llbnQgd2F5IHRvIGZpbmQgdGhlIGVsZW1lbnQuCiAgICovCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChpbmRleCwgImluZGV4Iik7CiAgICBSYW5nZUVycm9yLmNoZWNrTm90TmVnYXRpdmUoaW5kZXgsICJpbmRleCIpOwogICAgaW50IGVsZW1lbnRJbmRleCA9IDA7CiAgICBmb3IgKEUgZWxlbWVudCBpbiB0aGlzKSB7CiAgICAgIGlmIChpbmRleCA9PSBlbGVtZW50SW5kZXgpIHJldHVybiBlbGVtZW50OwogICAgICBlbGVtZW50SW5kZXgrKzsKICAgIH0KICAgIHRocm93IFJhbmdlRXJyb3IuaW5kZXgoaW5kZXgsIHRoaXMsICJpbmRleCIsIG51bGwsIGVsZW1lbnRJbmRleCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIChzb21lIG9mKSB0aGUgZWxlbWVudHMgb2YgYHRoaXNgLgogICAqCiAgICogRWxlbWVudHMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZWlyIG93biBgdG9TdHJpbmdgIHJlc3VsdHMuCiAgICoKICAgKiBUaGUgZGVmYXVsdCByZXByZXNlbnRhdGlvbiBhbHdheXMgY29udGFpbnMgdGhlIGZpcnN0IHRocmVlIGVsZW1lbnRzLgogICAqIElmIHRoZXJlIGFyZSBsZXNzIHRoYW4gYSBodW5kcmVkIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZSwgaXQgYWxzbwogICAqIGNvbnRhaW5zIHRoZSBsYXN0IHR3byBlbGVtZW50cy4KICAgKgogICAqIElmIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzbid0IGFib3ZlIDgwIGNoYXJhY3RlcnMsIG1vcmUgZWxlbWVudHMgYXJlCiAgICogaW5jbHVkZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGl0ZXJhYmxlLgogICAqCiAgICogVGhlIGNvbnZlcnNpb24gbWF5IG9taXQgY2FsbGluZyBgdG9TdHJpbmdgIG9uIHNvbWUgZWxlbWVudHMgaWYgdGhleQogICAqIGFyZSBrbm93biB0byBub3Qgb2NjdXIgaW4gdGhlIG91dHB1dCwgYW5kIGl0IG1heSBzdG9wIGl0ZXJhdGluZyBhZnRlcgogICAqIGEgaHVuZHJlZCBlbGVtZW50cy4KICAgKi8KICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBJdGVyYWJsZUJhc2UuaXRlcmFibGVUb1Nob3J0U3RyaW5nKHRoaXMsICcoJywgJyknKTsKfQoKdHlwZWRlZiBfR2VuZXJhdG9yPEU+ID0gRSBGdW5jdGlvbihpbnQgaW5kZXgpOwoKY2xhc3MgX0dlbmVyYXRvckl0ZXJhYmxlPEU+IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+IHsKICAvLy8gVGhlIGxlbmd0aCBvZiB0aGUgZ2VuZXJhdGVkIGl0ZXJhYmxlLgogIGZpbmFsIGludCBsZW5ndGg7CgogIC8vLyBUaGUgZnVuY3Rpb24gbWFwcGluZyBpbmRpY2VzIHRvIHZhbHVlcy4KICBmaW5hbCBfR2VuZXJhdG9yPEU+IF9nZW5lcmF0b3I7CgogIC8vLyBDcmVhdGVzIHRoZSBnZW5lcmF0ZWQgaXRlcmFibGUuCiAgLy8vCiAgLy8vIElmIFtnZW5lcmF0b3JdIGlzIGBudWxsYCwgaXQgaXMgY2hlY2tlZCB0aGF0IGBpbnRgIGlzIGFzc2lnbmFibGUgdG8gW0VdLgogIF9HZW5lcmF0b3JJdGVyYWJsZSh0aGlzLmxlbmd0aCwgRSBnZW5lcmF0b3IoaW50IGluZGV4KSkKICAgICAgOiAvLyBUaGUgYGFzYCBiZWxvdyBpcyB1c2VkIGFzIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IGBpbnRgIGlzIGFzc2lnbmFibGUKICAgICAgICAvLyB0byBbRV0uCiAgICAgICAgX2dlbmVyYXRvciA9IChnZW5lcmF0b3IgIT0gbnVsbCkgPyBnZW5lcmF0b3IgOiBfaWQgYXMgX0dlbmVyYXRvcjxFPjsKCiAgRSBlbGVtZW50QXQoaW50IGluZGV4KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRJbmRleChpbmRleCwgdGhpcyk7CiAgICByZXR1cm4gX2dlbmVyYXRvcihpbmRleCk7CiAgfQoKICAvLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYXMgZGVmYXVsdCBfZ2VuZXJhdG9yIGZ1bmN0aW9uLgogIHN0YXRpYyBpbnQgX2lkKGludCBuKSA9PiBuOwp9CgovKioKICogQW4gSXRlcmF0b3IgdGhhdCBhbGxvd3MgbW92aW5nIGJhY2t3YXJkcyBhcyB3ZWxsIGFzIGZvcndhcmRzLgogKi8KYWJzdHJhY3QgY2xhc3MgQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogIC8qKgogICAqIE1vdmUgYmFjayB0byB0aGUgcHJldmlvdXMgZWxlbWVudC4KICAgKgogICAqIFJldHVybnMgdHJ1ZSBhbmQgdXBkYXRlcyBbY3VycmVudF0gaWYgc3VjY2Vzc2Z1bC4gUmV0dXJucyBmYWxzZQogICAqIGFuZCBzZXRzIFtjdXJyZW50XSB0byBudWxsIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGVsZW1lbnQuCiAgICovCiAgYm9vbCBtb3ZlUHJldmlvdXMoKTsKfQqCxQBOTjwBEwEETQNGSUYjMzI8KgNDPEE7R0syAztQC0EkAzE6SCo7CQM1OQMwSFFNNksWAzYfQy8wMjtMA0lKT0sqAzw0TzZEA0dCQQNNMU5MFgQdREQUAQZFBTJJSQVER0YPBU8tBkMvNAQBBiAFRxIGNQEGLQVHTU5QBjsiAQZJEQVIOUYgBT5CTjw5BUFIN0RCKwVJRBdKFgYcAQZHBUVGRAVFSwY6BkMFTEsZBi4uQAYvBAEGRUgFR05MSjYFRjM2BkEBBkYXBUghBTg+N041OQZLAQZJBUghBThOOjsGPAEGSQU/OgVFJwUOBSdALwUgQDUFBjUlAQZMBUhGGQVQPgVRNTQ7QAYiGCUGEgQBBk4MBiQoBAEGTjQFMjsFTEoPBSMuLA0XBTQFPwUGLCogLgYgIjAGEgQBBko2BS9DOgUjIywLFwU0BT4FBkUePRIEAQZFBUVHBiUeKAYRBAEGRwUxQzE6BikqKSowCy0lDSskIS0IBh4EAQZDBURFBiMeJgYSBAEGQgUqNgYrMwQBBkQFOzk5SxoGJwEGLwVOGE4GEy4THBwPBhIEAQZBBUsGLAEGRwVKBiMBBk0FUCsFTx4FJwYgKQQBBkgFRjwFSkVDBi4tBAEGTQVON08MShcFT0RIBScGICkEAQZSBUg0BUlKS0tQBi4tBAEGIAUvQSgGEB8aLgYXBAEGHwUvSQtKPzMGDx8aLgYOCRsdEwQBBk8FTAYRH0AbPRMEAQZKBUgFSRtFBjUeKQYpLAQBBkkFRUZBRiY1BUkbRQY0DiAeGxoeCAYmKSwEAQY3BT1IRkZFBjYOIB4bHTAKGh4IBiYpLAQBBiQFPkwmBUc5RwYbMDEaHjEWBkYEAQZKBT8FSkglBUouBUlLGQZLAgEvATYsFAEuIgEmBk86URNNARstHgQBOx4CAQRBBEEGKAVFQQYXAgEXZGFydDpjb3JlL2l0ZXJhYmxlLmRhcnQub3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvaXRlcmF0b3IuZGFydIjTLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGludGVyZmFjZSBmb3IgZ2V0dGluZyBpdGVtcywgb25lIGF0IGEgdGltZSwgZnJvbSBhbiBvYmplY3QuCiAqCiAqIFRoZSBmb3ItaW4gY29uc3RydWN0IHRyYW5zcGFyZW50bHkgdXNlcyBgSXRlcmF0b3JgIHRvIHRlc3QgZm9yIHRoZSBlbmQKICogb2YgdGhlIGl0ZXJhdGlvbiwgYW5kIHRvIGdldCBlYWNoIGl0ZW0gKG9yIF9lbGVtZW50XykuCiAqCiAqIElmIHRoZSBvYmplY3QgaXRlcmF0ZWQgb3ZlciBpcyBjaGFuZ2VkIGR1cmluZyB0aGUgaXRlcmF0aW9uLCB0aGUKICogYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQuCiAqCiAqIFRoZSBgSXRlcmF0b3JgIGlzIGluaXRpYWxseSBwb3NpdGlvbmVkIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudC4KICogQmVmb3JlIGFjY2Vzc2luZyB0aGUgZmlyc3QgZWxlbWVudCB0aGUgaXRlcmF0b3IgbXVzdCB0aHVzIGJlIGFkdmFuY2VkIHVzaW5nCiAqIFttb3ZlTmV4dF0gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCiAqIElmIG5vIGVsZW1lbnQgaXMgbGVmdCwgdGhlbiBbbW92ZU5leHRdIHJldHVybnMgZmFsc2UsIFtjdXJyZW50XQogKiByZXR1cm5zIGBudWxsYCwgYW5kIGFsbCBmdXJ0aGVyIGNhbGxzIHRvIFttb3ZlTmV4dF0gd2lsbCBhbHNvIHJldHVybiBmYWxzZS4KICoKICogQSB0eXBpY2FsIHVzYWdlIG9mIGFuIEl0ZXJhdG9yIGxvb2tzIGFzIGZvbGxvd3M6CiAqCiAqICAgICB2YXIgaXQgPSBvYmouaXRlcmF0b3I7CiAqICAgICB3aGlsZSAoaXQubW92ZU5leHQoKSkgewogKiAgICAgICB1c2UoaXQuY3VycmVudCk7CiAqICAgICB9CiAqCiAqICoqU2VlIGFsc286KioKICogW0l0ZXJhdGlvbl0oaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NvbnRlbnRzL2NoMDMuaHRtbCNpdGVyYXRpb24pCiAqIGluIHRoZSBbbGlicmFyeSB0b3VyXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY29udGVudHMvY2gwMy5odG1sKQogKi8KYWJzdHJhY3QgY2xhc3MgSXRlcmF0b3I8RT4gewogIC8qKgogICAqIE1vdmVzIHRvIHRoZSBuZXh0IGVsZW1lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRydWUgaWYgW2N1cnJlbnRdIGNvbnRhaW5zIHRoZSBuZXh0IGVsZW1lbnQuCiAgICogUmV0dXJucyBmYWxzZSBpZiBubyBlbGVtZW50cyBhcmUgbGVmdC4KICAgKgogICAqIEl0IGlzIHNhZmUgdG8gaW52b2tlIFttb3ZlTmV4dF0gZXZlbiB3aGVuIHRoZSBpdGVyYXRvciBpcyBhbHJlYWR5CiAgICogcG9zaXRpb25lZCBhZnRlciB0aGUgbGFzdCBlbGVtZW50LgogICAqIEluIHRoaXMgY2FzZSBbbW92ZU5leHRdIHJldHVybnMgZmFsc2UgYWdhaW4gYW5kIGhhcyBubyBlZmZlY3QuCiAgICoKICAgKiBBIGNhbGwgdG8gYG1vdmVOZXh0YCBtYXkgdGhyb3cgaWYgaXRlcmF0aW9uIGhhcyBiZWVuIGJyb2tlbiBieQogICAqIGNoYW5naW5nIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24uCiAgICovCiAgYm9vbCBtb3ZlTmV4dCgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGVsZW1lbnQuCiAgICoKICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgaXRlcmF0b3IgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZCB0byB0aGUgZmlyc3QKICAgKiBlbGVtZW50LCBvciBpZiB0aGUgaXRlcmF0b3IgaGFzIGJlZW4gbW92ZWQgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQogICAqIFtJdGVyYWJsZV0uCiAgICoKICAgKiBUaGUgYGN1cnJlbnRgIGdldHRlciBzaG91bGQga2VlcCBpdHMgdmFsdWUgdW50aWwgdGhlIG5leHQgY2FsbCB0bwogICAqIFttb3ZlTmV4dF0sIGV2ZW4gaWYgYW4gdW5kZXJseWluZyBjb2xsZWN0aW9uIGNoYW5nZXMuCiAgICogQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYG1vdmVOZXh0YCwgdGhlIHVzZXIgZG9lc24ndCBuZWVkIHRvIGNhY2hlCiAgICogdGhlIGN1cnJlbnQgdmFsdWUsIGJ1dCBjYW4ga2VlcCByZWFkaW5nIGl0IGZyb20gdGhlIGl0ZXJhdG9yLgogICAqLwogIEUgZ2V0IGN1cnJlbnQ7Cn0KQABOTjwBEwEEQgNKOgNEHANETy1DTwM0Ax4fGgkDEV5eBB0GIAU6LAVHKEQFRCkGEwEGIgVITREFRztLQwYRAgEXZGFydDpjb3JlL2l0ZXJhdG9yLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvbGlzdC5kYXJ0wABf1y8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBbiBpbmRleGFibGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHdpdGggYSBsZW5ndGguCiAqCiAqIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBpbXBsZW1lbnQgZGlmZmVyZW50IGtpbmRzIG9mIGxpc3RzLgogKiBUaGUgbW9zdCBjb21tb24ga2luZHMgb2YgbGlzdHMgYXJlOgogKgogKiAqIEZpeGVkLWxlbmd0aCBsaXN0LgogKiAgIEFuIGVycm9yIG9jY3VycyB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlIG9wZXJhdGlvbnMKICogICB0aGF0IGNhbiBjaGFuZ2UgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdC4KICoKICogKiBHcm93YWJsZSBsaXN0LiBGdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLgogKgogKiBUaGUgZGVmYXVsdCBncm93YWJsZSBsaXN0LCBhcyByZXR1cm5lZCBieSBgbmV3IExpc3QoKWAgb3IgYFtdYCwga2VlcHMKICogYW4gaW50ZXJuYWwgYnVmZmVyLCBhbmQgZ3Jvd3MgdGhhdCBidWZmZXIgd2hlbiBuZWNlc3NhcnkuIFRoaXMgZ3VhcmFudGVlcwogKiB0aGF0IGEgc2VxdWVuY2Ugb2YgW2FkZF0gb3BlcmF0aW9ucyB3aWxsIGVhY2ggZXhlY3V0ZSBpbiBhbW9ydGl6ZWQgY29uc3RhbnQKICogdGltZS4gU2V0dGluZyB0aGUgbGVuZ3RoIGRpcmVjdGx5IG1heSB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBuZXcKICogbGVuZ3RoLCBhbmQgbWF5IGNoYW5nZSB0aGUgaW50ZXJuYWwgY2FwYWNpdHkgc28gdGhhdCBhIGZvbGxvd2luZyBhZGQKICogb3BlcmF0aW9uIHdpbGwgbmVlZCB0byBpbW1lZGlhdGVseSBpbmNyZWFzZSB0aGUgYnVmZmVyIGNhcGFjaXR5LgogKiBPdGhlciBsaXN0IGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgYmVoYXZpb3IuCiAqCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBpbGx1c3RyYXRlcyB0aGF0IHNvbWUgTGlzdCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydAogKiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBBUEkuCiAqCiAqICAgICBMaXN0PGludD4gZml4ZWRMZW5ndGhMaXN0ID0gbmV3IExpc3QoNSk7CiAqICAgICBmaXhlZExlbmd0aExpc3QubGVuZ3RoID0gMDsgIC8vIEVycm9yCiAqICAgICBmaXhlZExlbmd0aExpc3QuYWRkKDQ5OSk7ICAgIC8vIEVycm9yCiAqICAgICBmaXhlZExlbmd0aExpc3RbMF0gPSA4NzsKICogICAgIExpc3Q8aW50PiBncm93YWJsZUxpc3QgPSBbMSwgMl07CiAqICAgICBncm93YWJsZUxpc3QubGVuZ3RoID0gMDsKICogICAgIGdyb3dhYmxlTGlzdC5hZGQoNDk5KTsKICogICAgIGdyb3dhYmxlTGlzdFswXSA9IDg3OwogKgogKiBMaXN0cyBhcmUgW0l0ZXJhYmxlXS4gSXRlcmF0aW9uIG9jY3VycyBvdmVyIHZhbHVlcyBpbiBpbmRleCBvcmRlci4gQ2hhbmdpbmcKICogdGhlIHZhbHVlcyBkb2VzIG5vdCBhZmZlY3QgaXRlcmF0aW9uLCBidXQgY2hhbmdpbmcgdGhlIHZhbGlkCiAqIGluZGljZXMmbWRhc2g7dGhhdCBpcywgY2hhbmdpbmcgdGhlIGxpc3QncyBsZW5ndGgmbWRhc2g7YmV0d2VlbiBpdGVyYXRpb24KICogc3RlcHMgY2F1c2VzIGEgW0NvbmN1cnJlbnRNb2RpZmljYXRpb25FcnJvcl0uIFRoaXMgbWVhbnMgdGhhdCBvbmx5IGdyb3dhYmxlCiAqIGxpc3RzIGNhbiB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3IuIElmIHRoZSBsZW5ndGggY2hhbmdlcwogKiB0ZW1wb3JhcmlseSBhbmQgaXMgcmVzdG9yZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIGl0ZXJhdGlvbiwgdGhlIGl0ZXJhdG9yCiAqIGRvZXMgbm90IGRldGVjdCBpdC4KICoKICogSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgbGlzdCdzIGxlbmd0aCAoYWRkaW5nIG9yIHJlbW92aW5nCiAqIGVsZW1lbnRzKSB3aGlsZSBhbiBvcGVyYXRpb24gb24gdGhlIGxpc3QgaXMgYmVpbmcgcGVyZm9ybWVkLAogKiBmb3IgZXhhbXBsZSBkdXJpbmcgYSBjYWxsIHRvIFtmb3JFYWNoXSBvciBbc29ydF0uCiAqIENoYW5naW5nIHRoZSBsaXN0J3MgbGVuZ3RoIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLCBlaXRoZXIgYnkgaXRlcmF0aW5nIGl0CiAqIGRpcmVjdGx5IG9yIHRocm91Z2ggaXRlcmF0aW5nIGFuIFtJdGVyYWJsZV0gdGhhdCBpcyBiYWNrZWQgYnkgdGhlIGxpc3QsIHdpbGwKICogYnJlYWsgdGhlIGl0ZXJhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIExpc3Q8RT4gaW1wbGVtZW50cyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZTxFPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgdGhlIGdpdmVuIGxlbmd0aC4KICAgKgogICAqIFRoZSBjcmVhdGVkIGxpc3QgaXMgZml4ZWQtbGVuZ3RoIGlmIFtsZW5ndGhdIGlzIHByb3ZpZGVkLgogICAqCiAgICogICAgIExpc3QgZml4ZWRMZW5ndGhMaXN0ID0gbmV3IExpc3QoMyk7CiAgICogICAgIGZpeGVkTGVuZ3RoTGlzdC5sZW5ndGg7ICAgICAvLyAzCiAgICogICAgIGZpeGVkTGVuZ3RoTGlzdC5sZW5ndGggPSAxOyAvLyBFcnJvcgogICAqCiAgICogVGhlIGxpc3QgaGFzIGxlbmd0aCAwIGFuZCBpcyBncm93YWJsZSBpZiBbbGVuZ3RoXSBpcyBvbWl0dGVkLgogICAqCiAgICogICAgIExpc3QgZ3Jvd2FibGVMaXN0ID0gbmV3IExpc3QoKTsKICAgKiAgICAgZ3Jvd2FibGVMaXN0Lmxlbmd0aDsgLy8gMDsKICAgKiAgICAgZ3Jvd2FibGVMaXN0Lmxlbmd0aCA9IDM7CiAgICoKICAgKiBUbyBjcmVhdGUgYSBncm93YWJsZSBsaXN0IHdpdGggYSBnaXZlbiBsZW5ndGgsIGp1c3QgYXNzaWduIHRoZSBsZW5ndGgKICAgKiByaWdodCBhZnRlciBjcmVhdGlvbjoKICAgKgogICAqICAgICBMaXN0IGdyb3dhYmxlTGlzdCA9IG5ldyBMaXN0KCkuLmxlbmd0aCA9IDUwMDsKICAgKgogICAqIFRoZSBbbGVuZ3RoXSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBvciBudWxsLCBpZiBpdCBpcyBwcm92aWRlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IExpc3QoW2ludCBsZW5ndGhdKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgdGhlIGdpdmVuIGxlbmd0aCB3aXRoIFtmaWxsXSBhdCBlYWNoIHBvc2l0aW9uLgogICAqCiAgICogVGhlIFtsZW5ndGhdIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KICAgKgogICAqIEV4YW1wbGU6CiAgICogYGBgZGFydAogICAqIG5ldyBMaXN0PGludD4uZmlsbGVkKDMsIDAsIGdyb3dhYmxlOiB0cnVlKTsgLy8gWzAsIDAsIDBdCiAgICogYGBgCiAgICoKICAgKiBUaGUgY3JlYXRlZCBsaXN0IGlzIGZpeGVkLWxlbmd0aCBpZiBbZ3Jvd2FibGVdIGlzIGZhbHNlICh0aGUgZGVmYXVsdCkKICAgKiBhbmQgZ3Jvd2FibGUgaWYgW2dyb3dhYmxlXSBpcyB0cnVlLgogICAqIElmIHRoZSBsaXN0IGlzIGdyb3dhYmxlLCBjaGFuZ2luZyBpdHMgbGVuZ3RoIHdpbGwgbm90IGluaXRpYWxpemUgbmV3CiAgICogZW50cmllcyB3aXRoIFtmaWxsXS4KICAgKiBBZnRlciBiZWluZyBjcmVhdGVkIGFuZCBmaWxsZWQsIHRoZSBsaXN0IGlzIG5vIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlcgogICAqIGdyb3dhYmxlIG9yIGZpeGVkLWxlbmd0aCBsaXN0IGNyZWF0ZWQgdXNpbmcgW0xpc3RdLgogICAqCiAgICogQWxsIGVsZW1lbnRzIG9mIHRoZSByZXR1cm5lZCBsaXN0IHNoYXJlIHRoZSBzYW1lIFtmaWxsXSB2YWx1ZS4KICAgKiBgYGAKICAgKiB2YXIgc2hhcmVkID0gbmV3IExpc3QuZmlsbGVkKDMsIFtdKTsKICAgKiBzaGFyZWRbMF0uYWRkKDQ5OSk7CiAgICogcHJpbnQoc2hhcmVkKTsgIC8vID0+IFtbNDk5XSwgWzQ5OV0sIFs0OTldXQogICAqIGBgYAogICAqCiAgICogWW91IGNhbiB1c2UgW0xpc3QuZ2VuZXJhdGVdIHRvIGNyZWF0ZSBhIGxpc3Qgd2l0aCBhIG5ldyBvYmplY3QgYXQKICAgKiBlYWNoIHBvc2l0aW9uLgogICAqIGBgYAogICAqIHZhciB1bmlxdWUgPSBuZXcgTGlzdC5nZW5lcmF0ZSgzLCAoXykgPT4gW10pOwogICAqIHVuaXF1ZVswXS5hZGQoNDk5KTsKICAgKiBwcmludCh1bmlxdWUpOyAvLyA9PiBbWzQ5OV0sIFtdLCBbXV0KICAgKiBgYGAKICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IExpc3QuZmlsbGVkKGludCBsZW5ndGgsIEUgZmlsbCwge2Jvb2wgZ3Jvd2FibGUgPSBmYWxzZX0pOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbGlzdCBjb250YWluaW5nIGFsbCBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIFtJdGVyYXRvcl0gb2YgW2VsZW1lbnRzXSBwcm92aWRlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLgogICAqCiAgICogQWxsIHRoZSBbZWxlbWVudHNdIHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgW0VdLgogICAqIFRoZSBgZWxlbWVudHNgIGl0ZXJhYmxlIGl0c2VsZiBtYXkgaGF2ZSBhbnkgZWxlbWVudCB0eXBlLCBzbyB0aGlzCiAgICogY29uc3RydWN0b3IgY2FuIGJlIHVzZWQgdG8gZG93bi1jYXN0IGEgYExpc3RgLCBmb3IgZXhhbXBsZSBhczoKICAgKiBgYGBkYXJ0CiAgICogTGlzdDxTdXBlclR5cGU+IHN1cGVyTGlzdCA9IC4uLjsKICAgKiBMaXN0PFN1YlR5cGU+IHN1Ykxpc3QgPQogICAqICAgICBuZXcgTGlzdDxTdWJUeXBlPi5mcm9tKHN1cGVyTGlzdC53aGVyZVR5cGU8U3ViVHlwZT4oKSk7CiAgICogYGBgCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBncm93YWJsZSBsaXN0IHdoZW4gW2dyb3dhYmxlXSBpcyB0cnVlOwogICAqIG90aGVyd2lzZSwgaXQgcmV0dXJucyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgTGlzdC5mcm9tKEl0ZXJhYmxlIGVsZW1lbnRzLCB7Ym9vbCBncm93YWJsZSA9IHRydWV9KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGxpc3QgZnJvbSBbZWxlbWVudHNdLgogICAqCiAgICogVGhlIFtJdGVyYXRvcl0gb2YgW2VsZW1lbnRzXSBwcm92aWRlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLgogICAqCiAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgZ3Jvd2FibGUgbGlzdCB3aGVuIFtncm93YWJsZV0gaXMgdHJ1ZTsKICAgKiBvdGhlcndpc2UsIGl0IHJldHVybnMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICBmYWN0b3J5IExpc3Qub2YoSXRlcmFibGU8RT4gZWxlbWVudHMsIHtib29sIGdyb3dhYmxlID0gdHJ1ZX0pID0+CiAgICAgIExpc3Q8RT4uZnJvbShlbGVtZW50cywgZ3Jvd2FibGU6IGdyb3dhYmxlKTsKCiAgLyoqCiAgICogR2VuZXJhdGVzIGEgbGlzdCBvZiB2YWx1ZXMuCiAgICoKICAgKiBDcmVhdGVzIGEgbGlzdCB3aXRoIFtsZW5ndGhdIHBvc2l0aW9ucyBhbmQgZmlsbHMgaXQgd2l0aCB2YWx1ZXMgY3JlYXRlZCBieQogICAqIGNhbGxpbmcgW2dlbmVyYXRvcl0gZm9yIGVhY2ggaW5kZXggaW4gdGhlIHJhbmdlIGAwYCAuLiBgbGVuZ3RoIC0gMWAKICAgKiBpbiBpbmNyZWFzaW5nIG9yZGVyLgogICAqCiAgICogICAgIG5ldyBMaXN0PGludD4uZ2VuZXJhdGUoMywgKGludCBpbmRleCkgPT4gaW5kZXggKiBpbmRleCk7IC8vIFswLCAxLCA0XQogICAqCiAgICogVGhlIGNyZWF0ZWQgbGlzdCBpcyBmaXhlZC1sZW5ndGggdW5sZXNzIFtncm93YWJsZV0gaXMgdHJ1ZS4KICAgKi8KICBmYWN0b3J5IExpc3QuZ2VuZXJhdGUoaW50IGxlbmd0aCwgRSBnZW5lcmF0b3IoaW50IGluZGV4KSwKICAgICAge2Jvb2wgZ3Jvd2FibGUgPSB0cnVlfSkgewogICAgTGlzdDxFPiByZXN1bHQ7CiAgICBpZiAoZ3Jvd2FibGUpIHsKICAgICAgcmVzdWx0ID0gPEU+W10uLmxlbmd0aCA9IGxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IExpc3Q8RT4obGVuZ3RoKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0W2ldID0gZ2VuZXJhdG9yKGkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgY29udGFpbmluZyBhbGwgW2VsZW1lbnRzXS4KICAgKgogICAqIFRoZSBbSXRlcmF0b3JdIG9mIFtlbGVtZW50c10gcHJvdmlkZXMgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cy4KICAgKgogICAqIEFuIHVubW9kaWZpYWJsZSBsaXN0IGNhbm5vdCBoYXZlIGl0cyBsZW5ndGggb3IgZWxlbWVudHMgY2hhbmdlZC4KICAgKiBJZiB0aGUgZWxlbWVudHMgYXJlIHRoZW1zZWx2ZXMgaW1tdXRhYmxlLCB0aGVuIHRoZSByZXN1bHRpbmcgbGlzdAogICAqIGlzIGFsc28gaW1tdXRhYmxlLgogICAqLwogIGV4dGVybmFsIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoSXRlcmFibGUgZWxlbWVudHMpOwoKICAvKioKICAgKiBBZGFwdHMgW3NvdXJjZV0gdG8gYmUgYSBgTGlzdDxUPmAuCiAgICoKICAgKiBBbnkgdGltZSB0aGUgbGlzdCB3b3VsZCBwcm9kdWNlIGFuIGVsZW1lbnQgdGhhdCBpcyBub3QgYSBbVF0sCiAgICogdGhlIGVsZW1lbnQgYWNjZXNzIHdpbGwgdGhyb3cuCiAgICoKICAgKiBBbnkgdGltZSBhIFtUXSB2YWx1ZSBpcyBhdHRlbXB0ZWQgc3RvcmVkIGludG8gdGhlIGFkYXB0ZWQgbGlzdCwKICAgKiB0aGUgc3RvcmUgd2lsbCB0aHJvdyB1bmxlc3MgdGhlIHZhbHVlIGlzIGFsc28gYW4gaW5zdGFuY2Ugb2YgW1NdLgogICAqCiAgICogSWYgYWxsIGFjY2Vzc2VkIGVsZW1lbnRzIG9mIFtzb3VyY2VdIGFyZSBhY3R1YWxseSBpbnN0YW5jZXMgb2YgW1RdLAogICAqIGFuZCBpZiBhbGwgZWxlbWVudHMgc3RvcmVkIGludG8gdGhlIHJldHVybmVkIGxpc3QgYXJlIGFjdHVhbGx5IGluc3RhbmNlCiAgICogb2YgW1NdLAogICAqIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgY2FuIGJlIHVzZWQgYXMgYSBgTGlzdDxUPmAuCiAgICovCiAgc3RhdGljIExpc3Q8VD4gY2FzdEZyb208UywgVD4oTGlzdDxTPiBzb3VyY2UpID0+IENhc3RMaXN0PFMsIFQ+KHNvdXJjZSk7CgogIC8qKgogICAqIENvcHkgYSByYW5nZSBvZiBvbmUgbGlzdCBpbnRvIGFub3RoZXIgbGlzdC4KICAgKgogICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1ldGhvZHMgbGlrZQogICAqIFtzZXRSYW5nZV0uCiAgICoKICAgKiBUaGUgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIG11c3QgYmUgYSB2YWxpZCByYW5nZSBvZiBbc291cmNlXSwKICAgKiBhbmQgdGhlcmUgbXVzdCBiZSByb29tIGZvciBgZW5kIC0gc3RhcnRgIGVsZW1lbnRzIGZyb20gcG9zaXRpb24gW2F0XS4KICAgKiBJZiBbc3RhcnRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8uCiAgICogSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gW3NvdXJjZS5sZW5ndGhdLgogICAqCiAgICogSWYgW3NvdXJjZV0gYW5kIFt0YXJnZXRdIGlzIHRoZSBzYW1lIGxpc3QsIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgdGFyZ2V0CiAgICogcmFuZ2VzIGFyZSByZXNwZWN0ZWQgc28gdGhhdCB0aGUgdGFyZ2V0IHJhbmdlIGVuZHMgdXAgY29udGFpbmluZyB0aGUKICAgKiBpbml0aWFsIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSByYW5nZS4KICAgKiBPdGhlcndpc2UgdGhlIG9yZGVyIG9mIGVsZW1lbnQgY29weWluZyBpcyBub3QgZ3VhcmFudGVlZC4KICAgKi8KICBzdGF0aWMgdm9pZCBjb3B5UmFuZ2U8VD4oTGlzdDxUPiB0YXJnZXQsIGludCBhdCwgTGlzdDxUPiBzb3VyY2UsCiAgICAgIFtpbnQgc3RhcnQsIGludCBlbmRdKSB7CiAgICBzdGFydCA/Pz0gMDsKICAgIGVuZCA9IFJhbmdlRXJyb3IuY2hlY2tWYWxpZFJhbmdlKHN0YXJ0LCBlbmQsIHNvdXJjZS5sZW5ndGgpOwogICAgaW50IGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgaWYgKHRhcmdldC5sZW5ndGggPCBhdCArIGxlbmd0aCkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKHRhcmdldCwgInRhcmdldCIsCiAgICAgICAgICAiTm90IGJpZyBlbm91Z2ggdG8gaG9sZCAkbGVuZ3RoIGVsZW1lbnRzIGF0IHBvc2l0aW9uICRhdCIpOwogICAgfQogICAgaWYgKCFpZGVudGljYWwoc291cmNlLCB0YXJnZXQpIHx8IHN0YXJ0ID49IGF0KSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB0YXJnZXRbYXQgKyBpXSA9IHNvdXJjZVtzdGFydCArIGldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGludCBpID0gbGVuZ3RoOyAtLWkgPj0gMDspIHsKICAgICAgICB0YXJnZXRbYXQgKyBpXSA9IHNvdXJjZVtzdGFydCArIGldOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBXcml0ZSB0aGUgZWxlbWVudHMgb2YgYW4gaXRlcmFibGUgaW50byBhIGxpc3QuCiAgICoKICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtZXRob2RzIGxpa2UKICAgKiBbc2V0QWxsXS4KICAgKgogICAqIFRoZSBlbGVtZW50cyBvZiBbc291cmNlXSBhcmUgd3JpdHRlbiBpbnRvIFt0YXJnZXRdIGZyb20gcG9zaXRpb24gW2F0XS4KICAgKiBUaGUgW3NvdXJjZV0gbXVzdCBub3QgY29udGFpbiBtb3JlIGVsZW1lbnRzIGFmdGVyIHdyaXRpbmcgdGhlIGxhc3QKICAgKiBwb3NpdGlvbiBvZiBbdGFyZ2V0XS4KICAgKgogICAqIElmIHRoZSBzb3VyY2UgaXMgYSBsaXN0LCB0aGUgW2NvcHlSYW5nZV0gZnVuY3Rpb24gaXMgbGlrZWx5IHRvIGJlIG1vcmUKICAgKiBlZmZpY2llbnQuCiAgICovCiAgc3RhdGljIHZvaWQgd3JpdGVJdGVyYWJsZTxUPihMaXN0PFQ+IHRhcmdldCwgaW50IGF0LCBJdGVyYWJsZTxUPiBzb3VyY2UpIHsKICAgIFJhbmdlRXJyb3IuY2hlY2tWYWx1ZUluSW50ZXJ2YWwoYXQsIDAsIHRhcmdldC5sZW5ndGgsICJhdCIpOwogICAgaW50IGluZGV4ID0gYXQ7CiAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0Lmxlbmd0aDsKICAgIGZvciAodmFyIGVsZW1lbnQgaW4gc291cmNlKSB7CiAgICAgIGlmIChpbmRleCA9PSB0YXJnZXRMZW5ndGgpIHsKICAgICAgICB0aHJvdyBJbmRleEVycm9yKHRhcmdldExlbmd0aCwgdGFyZ2V0KTsKICAgICAgfQogICAgICB0YXJnZXRbaW5kZXhdID0gZWxlbWVudDsKICAgICAgaW5kZXgrKzsKICAgIH0KICB9CgogIC8qKgogICAqIFJldHVybnMgYSB2aWV3IG9mIHRoaXMgbGlzdCBhcyBhIGxpc3Qgb2YgW1JdIGluc3RhbmNlcy4KICAgKgogICAqIElmIHRoaXMgbGlzdCBjb250YWlucyBvbmx5IGluc3RhbmNlcyBvZiBbUl0sIGFsbCByZWFkIG9wZXJhdGlvbnMKICAgKiB3aWxsIHdvcmsgY29ycmVjdGx5LiBJZiBhbnkgb3BlcmF0aW9uIHRyaWVzIHRvIGFjY2VzcyBhbiBlbGVtZW50CiAgICogdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgW1JdLCB0aGUgYWNjZXNzIHdpbGwgdGhyb3cgaW5zdGVhZC4KICAgKgogICAqIEVsZW1lbnRzIGFkZGVkIHRvIHRoZSBsaXN0IChlLmcuLCBieSB1c2luZyBbYWRkXSBvciBbYWRkQWxsXSkKICAgKiBtdXN0IGJlIGluc3RhbmNlIG9mIFtSXSB0byBiZSB2YWxpZCBhcmd1bWVudHMgdG8gdGhlIGFkZGluZyBmdW5jdGlvbiwKICAgKiBhbmQgdGhleSBtdXN0IGJlIGluc3RhbmNlcyBvZiBbRV0gYXMgd2VsbCB0byBiZSBhY2NlcHRlZCBieQogICAqIHRoaXMgbGlzdCBhcyB3ZWxsLgogICAqCiAgICogVHlwaWNhbGx5IGltcGxlbWVudGVkIGFzIGBMaXN0LmNhc3RGcm9tPEUsIFI+KHRoaXMpYC4KICAgKi8KICBMaXN0PFI+IGNhc3Q8Uj4oKTsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIFtpbmRleF0gaW4gdGhlIGxpc3QKICAgKiBvciB0aHJvd3MgYSBbUmFuZ2VFcnJvcl0gaWYgW2luZGV4XSBpcyBvdXQgb2YgYm91bmRzLgogICAqLwogIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KTsKCiAgLyoqCiAgICogU2V0cyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIFtpbmRleF0gaW4gdGhlIGxpc3QgdG8gW3ZhbHVlXQogICAqIG9yIHRocm93cyBhIFtSYW5nZUVycm9yXSBpZiBbaW5kZXhdIGlzIG91dCBvZiBib3VuZHMuCiAgICovCiAgdm9pZCBvcGVyYXRvciBbXT0oaW50IGluZGV4LCBFIHZhbHVlKTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgZmlyc3QgcG9zaXRpb24gb2YgdGhlIGxpc3QgdG8gY29udGFpbiBbdmFsdWVdLgogICAqCiAgICogRXF1aXZhbGVudCB0byBgdGhlTGlzdFswXSA9IHZhbHVlO2AuCiAgICoKICAgKiBUaGUgbGlzdCBtdXN0IGJlIG5vbi1lbXB0eS4KICAgKi8KICB2b2lkIHNldCBmaXJzdChFIHZhbHVlKTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgbGFzdCBwb3NpdGlvbiBvZiB0aGUgbGlzdCB0byBjb250YWluIFt2YWx1ZV0uCiAgICoKICAgKiBFcXVpdmFsZW50IHRvIGB0aGVMaXN0W3RoZUxpc3QubGVuZ3RoIC0gMV0gPSB2YWx1ZTtgLgogICAqCiAgICogVGhlIGxpc3QgbXVzdCBiZSBub24tZW1wdHkuCiAgICovCiAgdm9pZCBzZXQgbGFzdChFIHZhbHVlKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhpcyBsaXN0LgogICAqCiAgICogVGhlIHZhbGlkIGluZGljZXMgZm9yIGEgbGlzdCBhcmUgYDBgIHRocm91Z2ggYGxlbmd0aCAtIDFgLgogICAqLwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBDaGFuZ2VzIHRoZSBsZW5ndGggb2YgdGhpcyBsaXN0LgogICAqCiAgICogSWYgW25ld0xlbmd0aF0gaXMgZ3JlYXRlciB0aGFuCiAgICogdGhlIGN1cnJlbnQgbGVuZ3RoLCBlbnRyaWVzIGFyZSBpbml0aWFsaXplZCB0byBbOm51bGw6XS4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhlIGxpc3QgaXMgZml4ZWQtbGVuZ3RoLgogICAqLwogIHNldCBsZW5ndGgoaW50IG5ld0xlbmd0aCk7CgogIC8qKgogICAqIEFkZHMgW3ZhbHVlXSB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdCwKICAgKiBleHRlbmRpbmcgdGhlIGxlbmd0aCBieSBvbmUuCiAgICoKICAgKiBUaHJvd3MgYW4gW1Vuc3VwcG9ydGVkRXJyb3JdIGlmIHRoZSBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICB2b2lkIGFkZChFIHZhbHVlKTsKCiAgLyoqCiAgICogQXBwZW5kcyBhbGwgb2JqZWN0cyBvZiBbaXRlcmFibGVdIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LgogICAqCiAgICogRXh0ZW5kcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJ5IHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiBbaXRlcmFibGVdLgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICB2b2lkIGFkZEFsbChJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8qKgogICAqIFJldHVybnMgYW4gW0l0ZXJhYmxlXSBvZiB0aGUgb2JqZWN0cyBpbiB0aGlzIGxpc3QgaW4gcmV2ZXJzZSBvcmRlci4KICAgKi8KICBJdGVyYWJsZTxFPiBnZXQgcmV2ZXJzZWQ7CgogIC8qKgogICAqIFNvcnRzIHRoaXMgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgW2NvbXBhcmVdIGZ1bmN0aW9uLgogICAqCiAgICogVGhlIFtjb21wYXJlXSBmdW5jdGlvbiBtdXN0IGFjdCBhcyBhIFtDb21wYXJhdG9yXS4KICAgKgogICAqICAgICBMaXN0PFN0cmluZz4gbnVtYmVycyA9IFsndHdvJywgJ3RocmVlJywgJ2ZvdXInXTsKICAgKiAgICAgLy8gU29ydCBmcm9tIHNob3J0ZXN0IHRvIGxvbmdlc3QuCiAgICogICAgIG51bWJlcnMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGguY29tcGFyZVRvKGIubGVuZ3RoKSk7CiAgICogICAgIHByaW50KG51bWJlcnMpOyAgLy8gW3R3bywgZm91ciwgdGhyZWVdCiAgICoKICAgKiBUaGUgZGVmYXVsdCBMaXN0IGltcGxlbWVudGF0aW9ucyB1c2UgW0NvbXBhcmFibGUuY29tcGFyZV0gaWYKICAgKiBbY29tcGFyZV0gaXMgb21pdHRlZC4KICAgKgogICAqICAgICBMaXN0PGludD4gbnVtcyA9IFsxMywgMiwgLTExXTsKICAgKiAgICAgbnVtcy5zb3J0KCk7CiAgICogICAgIHByaW50KG51bXMpOyAgLy8gWy0xMSwgMiwgMTNdCiAgICoKICAgKiBBIFtDb21wYXJhdG9yXSBtYXkgY29tcGFyZSBvYmplY3RzIGFzIGVxdWFsIChyZXR1cm4gemVybyksIGV2ZW4gaWYgdGhleQogICAqIGFyZSBkaXN0aW5jdCBvYmplY3RzLgogICAqIFRoZSBzb3J0IGZ1bmN0aW9uIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSwgc28gZGlzdGluY3Qgb2JqZWN0cwogICAqIHRoYXQgY29tcGFyZSBhcyBlcXVhbCBtYXkgb2NjdXIgaW4gYW55IG9yZGVyIGluIHRoZSByZXN1bHQ6CiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IG51bWJlcnMgPSBbJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91ciddOwogICAqICAgICBudW1iZXJzLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoLmNvbXBhcmVUbyhiLmxlbmd0aCkpOwogICAqICAgICBwcmludChudW1iZXJzKTsgIC8vIFtvbmUsIHR3bywgZm91ciwgdGhyZWVdIE9SIFt0d28sIG9uZSwgZm91ciwgdGhyZWVdCiAgICovCiAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShFIGEsIEUgYildKTsKCiAgLyoqCiAgICogU2h1ZmZsZXMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCByYW5kb21seS4KICAgKi8KICB2b2lkIHNodWZmbGUoW1JhbmRvbSByYW5kb21dKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggb2YgW2VsZW1lbnRdIGluIHRoaXMgbGlzdC4KICAgKgogICAqIFNlYXJjaGVzIHRoZSBsaXN0IGZyb20gaW5kZXggW3N0YXJ0XSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqIFRoZSBmaXJzdCB0aW1lIGFuIG9iamVjdCBbOm86XSBpcyBlbmNvdW50ZXJlZCBzbyB0aGF0IFs6byA9PSBlbGVtZW50Ol0sCiAgICogdGhlIGluZGV4IG9mIFs6bzpdIGlzIHJldHVybmVkLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBub3RlcyA9IFsnZG8nLCAncmUnLCAnbWknLCAncmUnXTsKICAgKiAgICAgbm90ZXMuaW5kZXhPZigncmUnKTsgICAgLy8gMQogICAqICAgICBub3Rlcy5pbmRleE9mKCdyZScsIDIpOyAvLyAzCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICoKICAgKiAgICAgbm90ZXMuaW5kZXhPZignZmEnKTsgICAgLy8gLTEKICAgKi8KICBpbnQgaW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnQgPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZpcnN0IGluZGV4IGluIHRoZSBsaXN0IHRoYXQgc2F0aXNmaWVzIHRoZSBwcm92aWRlZCBbdGVzdF0uCiAgICoKICAgKiBTZWFyY2hlcyB0aGUgbGlzdCBmcm9tIGluZGV4IFtzdGFydF0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KICAgKiBUaGUgZmlyc3QgdGltZSBhbiBvYmplY3QgYG9gIGlzIGVuY291bnRlcmVkIHNvIHRoYXQgYHRlc3QobylgIGlzIHRydWUsCiAgICogdGhlIGluZGV4IG9mIGBvYCBpcyByZXR1cm5lZC4KICAgKgogICAqIGBgYAogICAqIExpc3Q8U3RyaW5nPiBub3RlcyA9IFsnZG8nLCAncmUnLCAnbWknLCAncmUnXTsKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSk7ICAgICAgIC8vIDEKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSwgMik7ICAgIC8vIDMKICAgKiBgYGAKICAgKgogICAqIFJldHVybnMgLTEgaWYgW2VsZW1lbnRdIGlzIG5vdCBmb3VuZC4KICAgKiBgYGAKICAgKiBub3Rlcy5pbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ2snKSk7ICAgIC8vIC0xCiAgICogYGBgCiAgICovCiAgaW50IGluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnQgPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxhc3QgaW5kZXggaW4gdGhlIGxpc3QgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIFt0ZXN0XS4KICAgKgogICAqIFNlYXJjaGVzIHRoZSBsaXN0IGZyb20gaW5kZXggW3N0YXJ0XSB0byAwLgogICAqIFRoZSBmaXJzdCB0aW1lIGFuIG9iamVjdCBgb2AgaXMgZW5jb3VudGVyZWQgc28gdGhhdCBgdGVzdChvKWAgaXMgdHJ1ZSwKICAgKiB0aGUgaW5kZXggb2YgYG9gIGlzIHJldHVybmVkLgogICAqCiAgICogYGBgCiAgICogTGlzdDxTdHJpbmc+IG5vdGVzID0gWydkbycsICdyZScsICdtaScsICdyZSddOwogICAqIG5vdGVzLmxhc3RJbmRleFdoZXJlKChub3RlKSA9PiBub3RlLnN0YXJ0c1dpdGgoJ3InKSk7ICAgICAgIC8vIDMKICAgKiBub3Rlcy5sYXN0SW5kZXhXaGVyZSgobm90ZSkgPT4gbm90ZS5zdGFydHNXaXRoKCdyJyksIDIpOyAgICAvLyAxCiAgICogYGBgCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICogYGBgCiAgICogbm90ZXMubGFzdEluZGV4V2hlcmUoKG5vdGUpID0+IG5vdGUuc3RhcnRzV2l0aCgnaycpKTsgICAgLy8gLTEKICAgKiBgYGAKICAgKi8KICBpbnQgbGFzdEluZGV4V2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCksIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGFzdCBpbmRleCBvZiBbZWxlbWVudF0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogU2VhcmNoZXMgdGhlIGxpc3QgYmFja3dhcmRzIGZyb20gaW5kZXggW3N0YXJ0XSB0byAwLgogICAqCiAgICogVGhlIGZpcnN0IHRpbWUgYW4gb2JqZWN0IFs6bzpdIGlzIGVuY291bnRlcmVkIHNvIHRoYXQgWzpvID09IGVsZW1lbnQ6XSwKICAgKiB0aGUgaW5kZXggb2YgWzpvOl0gaXMgcmV0dXJuZWQuCiAgICoKICAgKiAgICAgTGlzdDxTdHJpbmc+IG5vdGVzID0gWydkbycsICdyZScsICdtaScsICdyZSddOwogICAqICAgICBub3Rlcy5sYXN0SW5kZXhPZigncmUnLCAyKTsgLy8gMQogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBub3QgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIHNlYXJjaGVzIGZyb20gdGhlIGVuZCBvZiB0aGUKICAgKiBsaXN0Li9SZXR1cm5zCiAgICoKICAgKiAgICAgbm90ZXMubGFzdEluZGV4T2YoJ3JlJyk7ICAvLyAzCiAgICoKICAgKiBSZXR1cm5zIC0xIGlmIFtlbGVtZW50XSBpcyBub3QgZm91bmQuCiAgICoKICAgKiAgICAgbm90ZXMubGFzdEluZGV4T2YoJ2ZhJyk7ICAvLyAtMQogICAqLwogIGludCBsYXN0SW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnRdKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIHRoaXMgbGlzdDsKICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJlY29tZXMgemVyby4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0sIGFuZCByZXRhaW5zIGFsbCBvYmplY3RzLCBpZiB0aGlzCiAgICogaXMgYSBmaXhlZC1sZW5ndGggbGlzdC4KICAgKi8KICB2b2lkIGNsZWFyKCk7CgogIC8qKgogICAqIEluc2VydHMgdGhlIG9iamVjdCBhdCBwb3NpdGlvbiBbaW5kZXhdIGluIHRoaXMgbGlzdC4KICAgKgogICAqIFRoaXMgaW5jcmVhc2VzIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYnkgb25lIGFuZCBzaGlmdHMgYWxsIG9iamVjdHMKICAgKiBhdCBvciBhZnRlciB0aGUgaW5kZXggdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqCiAgICogQW4gZXJyb3Igb2NjdXJzIGlmIHRoZSBbaW5kZXhdIGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiBsZW5ndGguCiAgICogQW4gW1Vuc3VwcG9ydGVkRXJyb3JdIG9jY3VycyBpZiB0aGUgbGlzdCBpcyBmaXhlZC1sZW5ndGguCiAgICovCiAgdm9pZCBpbnNlcnQoaW50IGluZGV4LCBFIGVsZW1lbnQpOwoKICAvKioKICAgKiBJbnNlcnRzIGFsbCBvYmplY3RzIG9mIFtpdGVyYWJsZV0gYXQgcG9zaXRpb24gW2luZGV4XSBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBUaGlzIGluY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGJ5IHRoZSBsZW5ndGggb2YgW2l0ZXJhYmxlXSBhbmQKICAgKiBzaGlmdHMgYWxsIGxhdGVyIG9iamVjdHMgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAqCiAgICogQW4gZXJyb3Igb2NjdXJzIGlmIHRoZSBbaW5kZXhdIGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiBsZW5ndGguCiAgICogQW4gW1Vuc3VwcG9ydGVkRXJyb3JdIG9jY3VycyBpZiB0aGUgbGlzdCBpcyBmaXhlZC1sZW5ndGguCiAgICovCiAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8qKgogICAqIE92ZXJ3cml0ZXMgb2JqZWN0cyBvZiBgdGhpc2Agd2l0aCB0aGUgb2JqZWN0cyBvZiBbaXRlcmFibGVdLCBzdGFydGluZwogICAqIGF0IHBvc2l0aW9uIFtpbmRleF0gaW4gdGhpcyBsaXN0LgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gWydhJywgJ2InLCAnYyddOwogICAqICAgICBsaXN0LnNldEFsbCgxLCBbJ2JlZScsICdzZWEnXSk7CiAgICogICAgIGxpc3Quam9pbignLCAnKTsgLy8gJ2EsIGJlZSwgc2VhJwogICAqCiAgICogVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgaW5jcmVhc2UgdGhlIGxlbmd0aCBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgW2luZGV4XSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gZ3JlYXRlciB0aGFuIFtsZW5ndGhdLgogICAqCiAgICogVGhlIFtpdGVyYWJsZV0gbXVzdCBub3QgaGF2ZSBtb3JlIGVsZW1lbnRzIHRoYW4gd2hhdCBjYW4gZml0IGZyb20gW2luZGV4XQogICAqIHRvIFtsZW5ndGhdLgogICAqCiAgICogSWYgYGl0ZXJhYmxlYCBpcyBiYXNlZCBvbiB0aGlzIGxpc3QsIGl0cyB2YWx1ZXMgbWF5IGNoYW5nZSAvZHVyaW5nLyB0aGUKICAgKiBgc2V0QWxsYCBvcGVyYXRpb24uCiAgICovCiAgdm9pZCBzZXRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSk7CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgW3ZhbHVlXSBmcm9tIHRoaXMgbGlzdC4KICAgKgogICAqIFJldHVybnMgdHJ1ZSBpZiBbdmFsdWVdIHdhcyBpbiB0aGUgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IFsnaGVhZCcsICdzaG91bGRlcnMnLCAna25lZXMnLCAndG9lcyddOwogICAqICAgICBwYXJ0cy5yZW1vdmUoJ2hlYWQnKTsgLy8gdHJ1ZQogICAqICAgICBwYXJ0cy5qb2luKCcsICcpOyAgICAgLy8gJ3Nob3VsZGVycywga25lZXMsIHRvZXMnCiAgICoKICAgKiBUaGUgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgW3ZhbHVlXSB3YXMgbm90IGluIHRoZSBsaXN0LgogICAqCiAgICogICAgIC8vIE5vdGU6ICdoZWFkJyBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQuCiAgICogICAgIHBhcnRzLnJlbW92ZSgnaGVhZCcpOyAvLyBmYWxzZQogICAqICAgICBwYXJ0cy5qb2luKCcsICcpOyAgICAgLy8gJ3Nob3VsZGVycywga25lZXMsIHRvZXMnCiAgICoKICAgKiBBbiBbVW5zdXBwb3J0ZWRFcnJvcl0gb2NjdXJzIGlmIHRoZSBsaXN0IGlzIGZpeGVkLWxlbmd0aC4KICAgKi8KICBib29sIHJlbW92ZShPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBvYmplY3QgYXQgcG9zaXRpb24gW2luZGV4XSBmcm9tIHRoaXMgbGlzdC4KICAgKgogICAqIFRoaXMgbWV0aG9kIHJlZHVjZXMgdGhlIGxlbmd0aCBvZiBgdGhpc2AgYnkgb25lIGFuZCBtb3ZlcyBhbGwgbGF0ZXIgb2JqZWN0cwogICAqIGRvd24gYnkgb25lIHBvc2l0aW9uLgogICAqCiAgICogUmV0dXJucyB0aGUgcmVtb3ZlZCBvYmplY3QuCiAgICoKICAgKiBUaGUgW2luZGV4XSBtdXN0IGJlIGluIHRoZSByYW5nZSBgMCDiiaQgaW5kZXggPCBsZW5ndGhgLgogICAqCiAgICogVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpZiB0aGlzIGlzIGEgZml4ZWQtbGVuZ3RoIGxpc3QuIEluIHRoYXQgY2FzZQogICAqIHRoZSBsaXN0IGlzIG5vdCBtb2RpZmllZC4KICAgKi8KICBFIHJlbW92ZUF0KGludCBpbmRleCk7CgogIC8qKgogICAqIFBvcHMgYW5kIHJldHVybnMgdGhlIGxhc3Qgb2JqZWN0IGluIHRoaXMgbGlzdC4KICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBpcyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIEUgcmVtb3ZlTGFzdCgpOwoKICAvKioKICAgKiBSZW1vdmVzIGFsbCBvYmplY3RzIGZyb20gdGhpcyBsaXN0IHRoYXQgc2F0aXNmeSBbdGVzdF0uCiAgICoKICAgKiBBbiBvYmplY3QgWzpvOl0gc2F0aXNmaWVzIFt0ZXN0XSBpZiBbOnRlc3Qobyk6XSBpcyB0cnVlLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBudW1iZXJzID0gWydvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInXTsKICAgKiAgICAgbnVtYmVycy5yZW1vdmVXaGVyZSgoaXRlbSkgPT4gaXRlbS5sZW5ndGggPT0gMyk7CiAgICogICAgIG51bWJlcnMuam9pbignLCAnKTsgLy8gJ3RocmVlLCBmb3VyJwogICAqCiAgICogVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpZiB0aGlzIGlzIGEgZml4ZWQtbGVuZ3RoIGxpc3QuCiAgICovCiAgdm9pZCByZW1vdmVXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSB0aGlzIGxpc3QgdGhhdCBmYWlsIHRvIHNhdGlzZnkgW3Rlc3RdLgogICAqCiAgICogQW4gb2JqZWN0IFs6bzpdIHNhdGlzZmllcyBbdGVzdF0gaWYgWzp0ZXN0KG8pOl0gaXMgdHJ1ZS4KICAgKgogICAqICAgICBMaXN0PFN0cmluZz4gbnVtYmVycyA9IFsnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJ107CiAgICogICAgIG51bWJlcnMucmV0YWluV2hlcmUoKGl0ZW0pID0+IGl0ZW0ubGVuZ3RoID09IDMpOwogICAqICAgICBudW1iZXJzLmpvaW4oJywgJyk7IC8vICdvbmUsIHR3bycKICAgKgogICAqIFRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0gaWYgdGhpcyBpcyBhIGZpeGVkLWxlbmd0aCBsaXN0LgogICAqLwogIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoaXMgbGlzdCBhbmQgW290aGVyXS4KICAgKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgZm9sbG93ZWQgYnkKICAgKiB0aGUgZWxlbWVudHMgb2YgW290aGVyXS4KICAgKgogICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBhIG5vcm1hbCBncm93YWJsZSBsaXN0LgogICAqIFNvbWUgbGlzdCB0eXBlcyBtYXkgY2hvb3NlIHRvIHJldHVybiBhIGxpc3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGVtc2VsdmVzCiAgICogKHNlZSBbVWludDhMaXN0LitdKTsKICAgKi8KICBMaXN0PEU+IG9wZXJhdG9yICsoTGlzdDxFPiBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBiZXR3ZWVuIFtzdGFydF0gYW5kIFtlbmRdLgogICAqCiAgICogVGhlIG5ldyBsaXN0IGlzIGEgYExpc3Q8RT5gIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCBhdAogICAqIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW3N0YXJ0XSBhbmQgbGVzcyB0aGFuIFtlbmRdIGluIHRoZSBzYW1lCiAgICogb3JkZXIgYXMgdGhleSBvY2N1ciBpbiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwgImJsdWUiLCAib3JhbmdlIiwgInBpbmsiXTsKICAgKiBwcmludChjb2xvcnMuc3VibGlzdCgxLCAzKSk7IC8vIFtncmVlbiwgYmx1ZV0KICAgKiBgYGAKICAgKgogICAqIElmIFtlbmRdIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBbbGVuZ3RoXSBvZiB0aGlzIGxpc3QuCiAgICoKICAgKiBgYGBkYXJ0CiAgICogcHJpbnQoY29sb3JzLnN1Ymxpc3QoMSkpOyAvLyBbZ3JlZW4sIGJsdWUsIG9yYW5nZSwgcGlua10KICAgKiBgYGAKICAgKgogICAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMgbXVzdCBzYXRpc2Z5IHRoZSByZWxhdGlvbnMKICAgKiAwIOKJpCBgc3RhcnRgIOKJpCBgZW5kYCDiiaQgYHRoaXMubGVuZ3RoYAogICAqIElmIGBlbmRgIGlzIGVxdWFsIHRvIGBzdGFydGAsIHRoZW4gdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCiAgICovCiAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBbSXRlcmFibGVdIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgb2JqZWN0cyBpbiB0aGUgcmFuZ2UKICAgKiBbc3RhcnRdIGluY2x1c2l2ZSB0byBbZW5kXSBleGNsdXNpdmUuCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkIGF0IHRoZSB0aW1lCiAgICogb2YgdGhlIGNhbGwuCiAgICoKICAgKiBBIHJhbmdlIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBpcyB2YWxpZCBpZiBgMCA8PSBzdGFydCA8PSBlbmQgPD0gbGVuYCwgd2hlcmUKICAgKiBgbGVuYCBpcyB0aGlzIGxpc3QncyBgbGVuZ3RoYC4gVGhlIHJhbmdlIHN0YXJ0cyBhdCBgc3RhcnRgIGFuZCBoYXMgbGVuZ3RoCiAgICogYGVuZCAtIHN0YXJ0YC4gQW4gZW1wdHkgcmFuZ2UgKHdpdGggYGVuZCA9PSBzdGFydGApIGlzIHZhbGlkLgogICAqCiAgICogVGhlIHJldHVybmVkIFtJdGVyYWJsZV0gYmVoYXZlcyBsaWtlIGBza2lwKHN0YXJ0KS50YWtlKGVuZCAtIHN0YXJ0KWAuCiAgICogVGhhdCBpcywgaXQgZG9lcyAqbm90KiB0aHJvdyBpZiB0aGlzIGxpc3QgY2hhbmdlcyBzaXplLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBjb2xvcnMgPSBbJ3JlZCcsICdncmVlbicsICdibHVlJywgJ29yYW5nZScsICdwaW5rJ107CiAgICogICAgIEl0ZXJhYmxlPFN0cmluZz4gcmFuZ2UgPSBjb2xvcnMuZ2V0UmFuZ2UoMSwgNCk7CiAgICogICAgIHJhbmdlLmpvaW4oJywgJyk7ICAvLyAnZ3JlZW4sIGJsdWUsIG9yYW5nZScKICAgKiAgICAgY29sb3JzLmxlbmd0aCA9IDM7CiAgICogICAgIHJhbmdlLmpvaW4oJywgJyk7ICAvLyAnZ3JlZW4sIGJsdWUnCiAgICovCiAgSXRlcmFibGU8RT4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKTsKCiAgLyoqCiAgICogQ29waWVzIHRoZSBvYmplY3RzIG9mIFtpdGVyYWJsZV0sIHNraXBwaW5nIFtza2lwQ291bnRdIG9iamVjdHMgZmlyc3QsCiAgICogaW50byB0aGUgcmFuZ2UgW3N0YXJ0XSwgaW5jbHVzaXZlLCB0byBbZW5kXSwgZXhjbHVzaXZlLCBvZiB0aGUgbGlzdC4KICAgKgogICAqICAgICBMaXN0PGludD4gbGlzdDEgPSBbMSwgMiwgMywgNF07CiAgICogICAgIExpc3Q8aW50PiBsaXN0MiA9IFs1LCA2LCA3LCA4LCA5XTsKICAgKiAgICAgLy8gQ29waWVzIHRoZSA0dGggYW5kIDV0aCBpdGVtcyBpbiBsaXN0MiBhcyB0aGUgMm5kIGFuZCAzcmQgaXRlbXMKICAgKiAgICAgLy8gb2YgbGlzdDEuCiAgICogICAgIGxpc3QxLnNldFJhbmdlKDEsIDMsIGxpc3QyLCAzKTsKICAgKiAgICAgbGlzdDEuam9pbignLCAnKTsgLy8gJzEsIDgsIDksIDQnCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkLgogICAqIEEgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIGlzIHZhbGlkIGlmIGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBsZW5gLCB3aGVyZQogICAqIGBsZW5gIGlzIHRoaXMgbGlzdCdzIGBsZW5ndGhgLiBUaGUgcmFuZ2Ugc3RhcnRzIGF0IGBzdGFydGAgYW5kIGhhcyBsZW5ndGgKICAgKiBgZW5kIC0gc3RhcnRgLiBBbiBlbXB0eSByYW5nZSAod2l0aCBgZW5kID09IHN0YXJ0YCkgaXMgdmFsaWQuCiAgICoKICAgKiBUaGUgW2l0ZXJhYmxlXSBtdXN0IGhhdmUgZW5vdWdoIG9iamVjdHMgdG8gZmlsbCB0aGUgcmFuZ2UgZnJvbSBgc3RhcnRgCiAgICogdG8gYGVuZGAgYWZ0ZXIgc2tpcHBpbmcgW3NraXBDb3VudF0gb2JqZWN0cy4KICAgKgogICAqIElmIGBpdGVyYWJsZWAgaXMgdGhpcyBsaXN0LCB0aGUgb3BlcmF0aW9uIGNvcGllcyB0aGUgZWxlbWVudHMKICAgKiBvcmlnaW5hbGx5IGluIHRoZSByYW5nZSBmcm9tIGBza2lwQ291bnRgIHRvIGBza2lwQ291bnQgKyAoZW5kIC0gc3RhcnQpYCB0bwogICAqIHRoZSByYW5nZSBgc3RhcnRgIHRvIGBlbmRgLCBldmVuIGlmIHRoZSB0d28gcmFuZ2VzIG92ZXJsYXAuCiAgICoKICAgKiBJZiBgaXRlcmFibGVgIGRlcGVuZHMgb24gdGhpcyBsaXN0IGluIHNvbWUgb3RoZXIgd2F5LCBubyBndWFyYW50ZWVzIGFyZQogICAqIG1hZGUuCiAgICovCiAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBbaW50IHNraXBDb3VudCA9IDBdKTsKCiAgLyoqCiAgICogUmVtb3ZlcyB0aGUgb2JqZWN0cyBpbiB0aGUgcmFuZ2UgW3N0YXJ0XSBpbmNsdXNpdmUgdG8gW2VuZF0gZXhjbHVzaXZlLgogICAqCiAgICogVGhlIHByb3ZpZGVkIHJhbmdlLCBnaXZlbiBieSBbc3RhcnRdIGFuZCBbZW5kXSwgbXVzdCBiZSB2YWxpZC4KICAgKiBBIHJhbmdlIGZyb20gW3N0YXJ0XSB0byBbZW5kXSBpcyB2YWxpZCBpZiBgMCA8PSBzdGFydCA8PSBlbmQgPD0gbGVuYCwgd2hlcmUKICAgKiBgbGVuYCBpcyB0aGlzIGxpc3QncyBgbGVuZ3RoYC4gVGhlIHJhbmdlIHN0YXJ0cyBhdCBgc3RhcnRgIGFuZCBoYXMgbGVuZ3RoCiAgICogYGVuZCAtIHN0YXJ0YC4gQW4gZW1wdHkgcmFuZ2UgKHdpdGggYGVuZCA9PSBzdGFydGApIGlzIHZhbGlkLgogICAqCiAgICogVGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXSBpZiB0aGlzIGlzIGEgZml4ZWQtbGVuZ3RoIGxpc3QuIEluIHRoYXQgY2FzZQogICAqIHRoZSBsaXN0IGlzIG5vdCBtb2RpZmllZC4KICAgKi8KICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCk7CgogIC8qKgogICAqIFNldHMgdGhlIG9iamVjdHMgaW4gdGhlIHJhbmdlIFtzdGFydF0gaW5jbHVzaXZlIHRvIFtlbmRdIGV4Y2x1c2l2ZQogICAqIHRvIHRoZSBnaXZlbiBbZmlsbFZhbHVlXS4KICAgKgogICAqIFRoZSBwcm92aWRlZCByYW5nZSwgZ2l2ZW4gYnkgW3N0YXJ0XSBhbmQgW2VuZF0sIG11c3QgYmUgdmFsaWQuCiAgICogQSByYW5nZSBmcm9tIFtzdGFydF0gdG8gW2VuZF0gaXMgdmFsaWQgaWYgYDAgPD0gc3RhcnQgPD0gZW5kIDw9IGxlbmAsIHdoZXJlCiAgICogYGxlbmAgaXMgdGhpcyBsaXN0J3MgYGxlbmd0aGAuIFRoZSByYW5nZSBzdGFydHMgYXQgYHN0YXJ0YCBhbmQgaGFzIGxlbmd0aAogICAqIGBlbmQgLSBzdGFydGAuIEFuIGVtcHR5IHJhbmdlICh3aXRoIGBlbmQgPT0gc3RhcnRgKSBpcyB2YWxpZC4KICAgKi8KICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pOwoKICAvKioKICAgKiBSZW1vdmVzIHRoZSBvYmplY3RzIGluIHRoZSByYW5nZSBbc3RhcnRdIGluY2x1c2l2ZSB0byBbZW5kXSBleGNsdXNpdmUKICAgKiBhbmQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgW3JlcGxhY2VtZW50XSBpbiBpdHMgcGxhY2UuCiAgICoKICAgKiAgICAgTGlzdDxpbnQ+IGxpc3QgPSBbMSwgMiwgMywgNCwgNV07CiAgICogICAgIGxpc3QucmVwbGFjZVJhbmdlKDEsIDQsIFs2LCA3XSk7CiAgICogICAgIGxpc3Quam9pbignLCAnKTsgLy8gJzEsIDYsIDcsIDUnCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgcmFuZ2UsIGdpdmVuIGJ5IFtzdGFydF0gYW5kIFtlbmRdLCBtdXN0IGJlIHZhbGlkLgogICAqIEEgcmFuZ2UgZnJvbSBbc3RhcnRdIHRvIFtlbmRdIGlzIHZhbGlkIGlmIGAwIDw9IHN0YXJ0IDw9IGVuZCA8PSBsZW5gLCB3aGVyZQogICAqIGBsZW5gIGlzIHRoaXMgbGlzdCdzIGBsZW5ndGhgLiBUaGUgcmFuZ2Ugc3RhcnRzIGF0IGBzdGFydGAgYW5kIGhhcyBsZW5ndGgKICAgKiBgZW5kIC0gc3RhcnRgLiBBbiBlbXB0eSByYW5nZSAod2l0aCBgZW5kID09IHN0YXJ0YCkgaXMgdmFsaWQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIG9uIGZpeGVkLWxlbmd0aCBsaXN0cywgZXZlbiB3aGVuIFtyZXBsYWNlbWVudF0KICAgKiBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGFzIHRoZSByZXBsYWNlZCByYW5nZS4gSW4gdGhhdCBjYXNlIHVzZQogICAqIFtzZXRSYW5nZV0gaW5zdGVhZC4KICAgKi8KICB2b2lkIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPEU+IHJlcGxhY2VtZW50KTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgW01hcF0gdmlldyBvZiBgdGhpc2AuCiAgICoKICAgKiBUaGUgbWFwIHVzZXMgdGhlIGluZGljZXMgb2YgdGhpcyBsaXN0IGFzIGtleXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdHMKICAgKiBhcyB2YWx1ZXMuIFRoZSBgTWFwLmtleXNgIFtJdGVyYWJsZV0gaXRlcmF0ZXMgdGhlIGluZGljZXMgb2YgdGhpcyBsaXN0CiAgICogaW4gbnVtZXJpY2FsIG9yZGVyLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiB3b3JkcyA9IFsnZmVlJywgJ2ZpJywgJ2ZvJywgJ2Z1bSddOwogICAqICAgICBNYXA8aW50LCBTdHJpbmc+IG1hcCA9IHdvcmRzLmFzTWFwKCk7CiAgICogICAgIG1hcFswXSArIG1hcFsxXTsgICAvLyAnZmVlZmknOwogICAqICAgICBtYXAua2V5cy50b0xpc3QoKTsgLy8gWzAsIDEsIDIsIDNdCiAgICovCiAgTWFwPGludCwgRT4gYXNNYXAoKTsKfQqCygBOTjwBEwEENQNAJwMYNy0DSgNJTU9LSERHA0kdAzAtLSAoIB4dA09ATU9GTRcDT0A1UVAYBD8GKQU/BS0qLgVDBSkkIgVLGwU3BUMGJwEGRgUyBQ4NPgkFSylKGk05BUQJKhkxCQVHFAkzGSoJBk0BBi8FRgU0R0QNJh1BCQVHMAZJAQYlBUYFRzAGQzIBBiEFUEkaBU8FQQY8IBQUJw0gBicgBhMEAQY9BUYFRkcYBjkBBigFQyQFRUcFSU0NOAZLAQYxBUsRBUhLMToFTkoqPwZDHhFBHicyRgY1KSwIDSgsCAYEAQY0BUsPBUxIGwVMEAZNQRQmIiMwCB8PBgQBBj0FRkZEBUNLQRgFOwYVBjk7BhwBBkA7BikBBkAFKgUhBhsBBj8FOwUhBhoBBjEFQAYSAQYmBSQ+BT8GHQEGKyIFPwYVAQZABUxABiUBBkkGHAEGUQU4BTorPzAFQhsFKBYnBU0bS0EFQT9QBiYBBjIGIQEGOAVCTSUFOCYmBSsFJwYrAQZNBUJMIwUJNEJCCQUrCUAJBjkBBkwFMEwjBQk0RkYJBSsJRAkGOQEGNwU6BU0lBTgqBUoTBSgFKwUpBisBBikqBUQdBhABBjoFSTgFSz8GJQEGSQVLOwVLPwYzAQZLJwUuKSsFPAVEBU8SBU0ZBjABBj0FPwVGJzsFPgUzKDsFPwYdAQY8BVEbBSEFPAVPHwYZAQY0BUIGEgEGPQU+BUE6LgVCBioBBkUFPgVBOisFQgYqAQY5BUkeBT9QGgYlAQZLBUlQJwUNPjMJBUQFDT4JBUApRAYpAQZHKwVPEgVRT0MFSz0FSzk1HC0GLAEGS0oFKSxLFikrBURRT0MFTDIFQ1BBBU0LBlABBkwFRFFPQwVPHwYoAQZIHwVEUU9DBjUBBks9BSsqKgVEUU9DBU5NGQZCAQYzBVFMGQU6LygsBhcCARNkYXJ0OmNvcmUvbGlzdC5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvYXJyYXlfcGF0Y2guZGFydIl5Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgTGlzdDxFPiB7CiAgQHBhdGNoCiAgZmFjdG9yeSBMaXN0KFtpbnQgbGVuZ3RoXSkgbmF0aXZlICJMaXN0X25ldyI7CgogIEBwYXRjaAogIGZhY3RvcnkgTGlzdC5maWxsZWQoaW50IGxlbmd0aCwgRSBmaWxsLCB7Ym9vbCBncm93YWJsZTogZmFsc2V9KSB7CiAgICAvLyBBbGwgZXJyb3IgaGFuZGxpbmcgb24gdGhlIGxlbmd0aCBwYXJhbWV0ZXIgaXMgZG9uZSBhdCB0aGUgaW1wbGVtZW50YXRpb24KICAgIC8vIG9mIG5ldyBfTGlzdC4KICAgIHZhciByZXN1bHQgPSBncm93YWJsZSA/IG5ldyBfR3Jvd2FibGVMaXN0PEU+KGxlbmd0aCkgOiBuZXcgX0xpc3Q8RT4obGVuZ3RoKTsKICAgIGlmIChmaWxsICE9IG51bGwpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIHJlc3VsdFtpXSA9IGZpbGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IExpc3QuZnJvbShJdGVyYWJsZSBlbGVtZW50cywge2Jvb2wgZ3Jvd2FibGU6IHRydWV9KSB7CiAgICBpZiAoZWxlbWVudHMgaXMgRWZmaWNpZW50TGVuZ3RoSXRlcmFibGU8RT4pIHsKICAgICAgaW50IGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsKICAgICAgdmFyIGxpc3QgPSBncm93YWJsZSA/IG5ldyBfR3Jvd2FibGVMaXN0PEU+KGxlbmd0aCkgOiBuZXcgX0xpc3Q8RT4obGVuZ3RoKTsKICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAvLyBBdm9pZCBjcmVhdGluZyBpdGVyYXRvciB1bmxlc3MgbmVjZXNzYXJ5LgogICAgICAgIGludCBpID0gMDsKICAgICAgICBmb3IgKHZhciBlbGVtZW50IGluIGVsZW1lbnRzKSB7CiAgICAgICAgICBsaXN0W2krK10gPSBlbGVtZW50OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGlzdDsKICAgIH0KICAgIC8vIElmIGVsZW1lbnRzIGlzIGFuIEl0ZXJhYmxlPEU+LCB3ZSB3b24ndCBuZWVkIGEgdHlwZS10ZXN0IGZvciBlYWNoCiAgICAvLyBlbGVtZW50LiBJbiB0aGUgImNvbW1vbiBjYXNlIiB0aGF0IGVsZW1lbnRzIGlzIGFuIEl0ZXJhYmxlPEU+LCB0aGlzCiAgICAvLyByZXBsYWNlcyBhIHR5cGUtdGVzdCBvbiBldmVyeSBlbGVtZW50IHdpdGggYSBzaW5nbGUgdHlwZS10ZXN0IGJlZm9yZQogICAgLy8gc3RhcnRpbmcgdGhlIGxvb3AuCiAgICBpZiAoZWxlbWVudHMgaXMgSXRlcmFibGU8RT4pIHsKICAgICAgTGlzdDxFPiBsaXN0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4oMCk7CiAgICAgIGZvciAoRSBlIGluIGVsZW1lbnRzKSB7CiAgICAgICAgbGlzdC5hZGQoZSk7CiAgICAgIH0KICAgICAgaWYgKGdyb3dhYmxlKSByZXR1cm4gbGlzdDsKICAgICAgcmV0dXJuIG1ha2VMaXN0Rml4ZWRMZW5ndGgobGlzdCk7CiAgICB9IGVsc2UgewogICAgICBMaXN0PEU+IGxpc3QgPSBuZXcgX0dyb3dhYmxlTGlzdDxFPigwKTsKICAgICAgZm9yIChFIGUgaW4gZWxlbWVudHMpIHsKICAgICAgICBsaXN0LmFkZChlKTsKICAgICAgfQogICAgICBpZiAoZ3Jvd2FibGUpIHJldHVybiBsaXN0OwogICAgICByZXR1cm4gbWFrZUxpc3RGaXhlZExlbmd0aChsaXN0KTsKICAgIH0KICB9CgogIEBwYXRjaAogIGZhY3RvcnkgTGlzdC51bm1vZGlmaWFibGUoSXRlcmFibGUgZWxlbWVudHMpIHsKICAgIGZpbmFsIHJlc3VsdCA9IG5ldyBMaXN0PEU+LmZyb20oZWxlbWVudHMsIGdyb3dhYmxlOiBmYWxzZSk7CiAgICByZXR1cm4gbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZShyZXN1bHQpOwogIH0KCiAgLy8gRmFjdG9yeSBjb25zdHJ1Y3RpbmcgYSBtdXRhYmxlIExpc3QgZnJvbSBhIHBhcnNlciBnZW5lcmF0ZWQgTGlzdCBsaXRlcmFsLgogIC8vIFtlbGVtZW50c10gY29udGFpbnMgZWxlbWVudHMgdGhhdCBhcmUgYWxyZWFkeSB0eXBlIGNoZWNrZWQuCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgZmFjdG9yeSBMaXN0Ll9mcm9tTGl0ZXJhbChMaXN0IGVsZW1lbnRzKSB7CiAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSkgewogICAgICByZXR1cm4gbmV3IF9Hcm93YWJsZUxpc3Q8RT4oMCk7CiAgICB9CiAgICB2YXIgcmVzdWx0ID0gbmV3IF9Hcm93YWJsZUxpc3Q8RT4ud2l0aERhdGEoZWxlbWVudHMpOwogICAgcmVzdWx0Ll9zZXRMZW5ndGgoZWxlbWVudHMubGVuZ3RoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9Ck8ATk48AR4BBxAJMAEJRFAVURgpGggGEwQBCUAyJFEYNRMoHwoIEwZJS0waIy4eFQghKA0uHhUIISgGBAEJMUAuBAFPQSQtHCYGOigTBAIBIGRhcnQ6Y29yZS1wYXRjaC9hcnJheV9wYXRjaC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL21hcC5kYXJ0tGcvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycywgZnJvbSB3aGljaCB5b3UgcmV0cmlldmUgYSB2YWx1ZQogKiB1c2luZyBpdHMgYXNzb2NpYXRlZCBrZXkuCiAqCiAqIFRoZXJlIGlzIGEgZmluaXRlIG51bWJlciBvZiBrZXlzIGluIHRoZSBtYXAsCiAqIGFuZCBlYWNoIGtleSBoYXMgZXhhY3RseSBvbmUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0LgogKgogKiBNYXBzLCBhbmQgdGhlaXIga2V5cyBhbmQgdmFsdWVzLCBjYW4gYmUgaXRlcmF0ZWQuCiAqIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgZGVmaW5lZCBieSB0aGUgaW5kaXZpZHVhbCB0eXBlIG9mIG1hcC4KICogRXhhbXBsZXM6CiAqCiAqICogVGhlIHBsYWluIFtIYXNoTWFwXSBpcyB1bm9yZGVyZWQgKG5vIG9yZGVyIGlzIGd1YXJhbnRlZWQpLAogKiAqIHRoZSBbTGlua2VkSGFzaE1hcF0gaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlciwKICogKiBhbmQgYSBzb3J0ZWQgbWFwIGxpa2UgW1NwbGF5VHJlZU1hcF0gaXRlcmF0ZXMgdGhlIGtleXMgaW4gc29ydGVkIG9yZGVyLgogKgogKiBJdCBpcyBnZW5lcmFsbHkgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBtYXAgKGFkZCBvciByZW1vdmUga2V5cykgd2hpbGUKICogYW4gb3BlcmF0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZCBvbiB0aGUgbWFwLCBmb3IgZXhhbXBsZSBpbiBmdW5jdGlvbnMgY2FsbGVkCiAqIGR1cmluZyBhIFtmb3JFYWNoXSBvciBbcHV0SWZBYnNlbnRdIGNhbGwuCiAqIE1vZGlmeWluZyB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZyB0aGUga2V5cyBvciB2YWx1ZXMKICogbWF5IGFsc28gYnJlYWsgdGhlIGl0ZXJhdGlvbi4KICoKICogSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgZXF1YWxpdHkgb2Yga2V5cyAoYW5kIHRodXMgbm90CiAqIHRoZWlyIGhhc2hjb2RlKSB3aGlsZSB0aGV5IGFyZSBpbiB0aGUgbWFwLiBTb21lIHNwZWNpYWxpemVkIHN1YnR5cGVzIG1heSBiZQogKiBtb3JlIHBlcm1pc3NpdmUsIGluIHdoaWNoIGNhc2UgdGhleSBzaG91bGQgZG9jdW1lbnQgdGhpcyBiZWhhdmlvci4KICovCmFic3RyYWN0IGNsYXNzIE1hcDxLLCBWPiB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIE1hcCBpbnN0YW5jZSB3aXRoIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCBbTGlua2VkSGFzaE1hcF0uCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG5vbi1jb25zdCBtYXAgbGl0ZXJhbCBgPEssVj57fWAuCiAgICoKICAgKiBBIGBMaW5rZWRIYXNoTWFwYCByZXF1aXJlcyB0aGUga2V5cyB0byBpbXBsZW1lbnQgY29tcGF0aWJsZQogICAqIGBvcGVyYXRvcj09YCBhbmQgYGhhc2hDb2RlYCwgYW5kIGl0IGFsbG93cyBudWxsIGFzIGEga2V5LgogICAqIEl0IGl0ZXJhdGVzIGluIGtleSBpbnNlcnRpb24gb3JkZXIuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBNYXAoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIGFsbCBrZXkvdmFsdWUgcGFpcnMgb2YKICAgKiBbb3RoZXJdLgogICAqCiAgICogVGhlIGtleXMgbXVzdCBhbGwgYmUgaW5zdGFuY2VzIG9mIFtLXSBhbmQgdGhlIHZhbHVlcyBvZiBbVl0uCiAgICogVGhlIFtvdGhlcl0gbWFwIGl0c2VsZiBjYW4gaGF2ZSBhbnkgdHlwZS4KICAgKgogICAqIEEgYExpbmtlZEhhc2hNYXBgIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIGBudWxsYCBhcyBhIGtleS4KICAgKiBJdCBpdGVyYXRlcyBpbiBrZXkgaW5zZXJ0aW9uIG9yZGVyLgogICAqLwogIGZhY3RvcnkgTWFwLmZyb20oTWFwIG90aGVyKSA9IExpbmtlZEhhc2hNYXA8SywgVj4uZnJvbTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIFtMaW5rZWRIYXNoTWFwXSB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyBbb3RoZXJdLgogICAqCiAgICogQSBgTGlua2VkSGFzaE1hcGAgcmVxdWlyZXMgdGhlIGtleXMgdG8gaW1wbGVtZW50IGNvbXBhdGlibGUKICAgKiBgb3BlcmF0b3I9PWAgYW5kIGBoYXNoQ29kZWAsIGFuZCBpdCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgogICAqIEl0IGl0ZXJhdGVzIGluIGtleSBpbnNlcnRpb24gb3JkZXIuCiAgICovCiAgZmFjdG9yeSBNYXAub2YoTWFwPEssIFY+IG90aGVyKSA9IExpbmtlZEhhc2hNYXA8SywgVj4ub2Y7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gdW5tb2RpZmlhYmxlIGhhc2ggYmFzZWQgbWFwIGNvbnRhaW5pbmcgdGhlIGVudHJpZXMgb2YgW290aGVyXS4KICAgKgogICAqIFRoZSBrZXlzIG11c3QgYWxsIGJlIGluc3RhbmNlcyBvZiBbS10gYW5kIHRoZSB2YWx1ZXMgb2YgW1ZdLgogICAqIFRoZSBbb3RoZXJdIG1hcCBpdHNlbGYgY2FuIGhhdmUgYW55IHR5cGUuCiAgICoKICAgKiBUaGUgbWFwIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIGBudWxsYCBhcyBhIGtleS4KICAgKiBUaGUgY3JlYXRlZCBtYXAgaXRlcmF0ZXMga2V5cyBpbiBhIGZpeGVkIG9yZGVyLAogICAqIHByZXNlcnZpbmcgdGhlIG9yZGVyIHByb3ZpZGVkIGJ5IFtvdGhlcl0uCiAgICoKICAgKiBUaGUgcmVzdWx0aW5nIG1hcCBiZWhhdmVzIGxpa2UgdGhlIHJlc3VsdCBvZiBbTWFwLmZyb21dLAogICAqIGV4Y2VwdCB0aGF0IHRoZSBtYXAgcmV0dXJuZWQgYnkgdGhpcyBjb25zdHJ1Y3RvciBpcyBub3QgbW9kaWZpYWJsZS4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IE1hcC51bm1vZGlmaWFibGUoTWFwIG90aGVyKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpZGVudGl0eSBtYXAgd2l0aCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgW0xpbmtlZEhhc2hNYXBdLgogICAqCiAgICogQW4gaWRlbnRpdHkgbWFwIHVzZXMgW2lkZW50aWNhbF0gZm9yIGVxdWFsaXR5IGFuZCBbaWRlbnRpdHlIYXNoQ29kZV0KICAgKiBmb3IgaGFzaCBjb2RlcyBvZiBrZXlzIGluc3RlYWQgb2YgdGhlIGludHJpbnNpYyBbT2JqZWN0Lm9wZXJhdG9yPT1dIGFuZAogICAqIFtPYmplY3QuaGFzaENvZGVdIG9mIHRoZSBrZXlzLgogICAqCiAgICogVGhlIHJldHVybmVkIG1hcCBhbGxvd3MgYG51bGxgIGFzIGEga2V5LgogICAqIEl0IGl0ZXJhdGVzIGluIGtleSBpbnNlcnRpb24gb3JkZXIuCiAgICovCiAgZmFjdG9yeSBNYXAuaWRlbnRpdHkoKSA9IExpbmtlZEhhc2hNYXA8SywgVj4uaWRlbnRpdHk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBNYXAgaW5zdGFuY2UgaW4gd2hpY2ggdGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgY29tcHV0ZWQgZnJvbSB0aGUKICAgKiBbaXRlcmFibGVdLgogICAqCiAgICogVGhlIGNyZWF0ZWQgbWFwIGlzIGEgW0xpbmtlZEhhc2hNYXBdLgogICAqIEEgYExpbmtlZEhhc2hNYXBgIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIG51bGwgYXMgYSBrZXkuCiAgICogSXQgaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICAgKgogICAqIEZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIFtpdGVyYWJsZV0gdGhpcyBjb25zdHJ1Y3RvciBjb21wdXRlcyBhIGtleS92YWx1ZQogICAqIHBhaXIsIGJ5IGFwcGx5aW5nIFtrZXldIGFuZCBbdmFsdWVdIHJlc3BlY3RpdmVseS4KICAgKgogICAqIFRoZSBleGFtcGxlIGJlbG93IGNyZWF0ZXMgYSBuZXcgTWFwIGZyb20gYSBMaXN0LiBUaGUga2V5cyBvZiBgbWFwYCBhcmUKICAgKiBgbGlzdGAgdmFsdWVzIGNvbnZlcnRlZCB0byBzdHJpbmdzLCBhbmQgdGhlIHZhbHVlcyBvZiB0aGUgYG1hcGAgYXJlIHRoZQogICAqIHNxdWFyZXMgb2YgdGhlIGBsaXN0YCB2YWx1ZXM6CiAgICoKICAgKiAgICAgTGlzdDxpbnQ+IGxpc3QgPSBbMSwgMiwgM107CiAgICogICAgIE1hcDxTdHJpbmcsIGludD4gbWFwID0gbmV3IE1hcC5mcm9tSXRlcmFibGUobGlzdCwKICAgKiAgICAgICAgIGtleTogKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSwKICAgKiAgICAgICAgIHZhbHVlOiAoaXRlbSkgPT4gaXRlbSAqIGl0ZW0pOwogICAqCiAgICogICAgIG1hcFsnMSddICsgbWFwWycyJ107IC8vIDEgKyA0CiAgICogICAgIG1hcFsnMyddIC0gbWFwWycyJ107IC8vIDkgLSA0CiAgICoKICAgKiBJZiBubyB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgW2tleV0gYW5kIFt2YWx1ZV0gdGhlIGRlZmF1bHQgaXMgdGhlCiAgICogaWRlbnRpdHkgZnVuY3Rpb24uCiAgICoKICAgKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBrZXlzIGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlcyBvZiBgbWFwYAogICAqIGFyZSBgbGlzdGAgdmFsdWVzOgogICAqCiAgICogICAgIG1hcCA9IG5ldyBNYXAuZnJvbUl0ZXJhYmxlKGxpc3QpOwogICAqICAgICBtYXBbMV0gKyBtYXBbMl07IC8vIDEgKyAyCiAgICogICAgIG1hcFszXSAtIG1hcFsyXTsgLy8gMyAtIDIKICAgKgogICAqIFRoZSBrZXlzIGNvbXB1dGVkIGJ5IHRoZSBzb3VyY2UgW2l0ZXJhYmxlXSBkbyBub3QgbmVlZCB0byBiZSB1bmlxdWUuIFRoZQogICAqIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIGtleSB3aWxsIHNpbXBseSBvdmVyd3JpdGUgYW55IHByZXZpb3VzIHZhbHVlLgogICAqLwogIGZhY3RvcnkgTWFwLmZyb21JdGVyYWJsZShJdGVyYWJsZSBpdGVyYWJsZSwKICAgICAge0sga2V5KGVsZW1lbnQpLCBWIHZhbHVlKGVsZW1lbnQpfSkgPSBMaW5rZWRIYXNoTWFwPEssIFY+LmZyb21JdGVyYWJsZTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIE1hcCBpbnN0YW5jZSBhc3NvY2lhdGluZyB0aGUgZ2l2ZW4gW2tleXNdIHRvIFt2YWx1ZXNdLgogICAqCiAgICogVGhlIGNyZWF0ZWQgbWFwIGlzIGEgW0xpbmtlZEhhc2hNYXBdLgogICAqIEEgYExpbmtlZEhhc2hNYXBgIHJlcXVpcmVzIHRoZSBrZXlzIHRvIGltcGxlbWVudCBjb21wYXRpYmxlCiAgICogYG9wZXJhdG9yPT1gIGFuZCBgaGFzaENvZGVgLCBhbmQgaXQgYWxsb3dzIG51bGwgYXMgYSBrZXkuCiAgICogSXQgaXRlcmF0ZXMgaW4ga2V5IGluc2VydGlvbiBvcmRlci4KICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgaXRlcmF0ZXMgb3ZlciBba2V5c10gYW5kIFt2YWx1ZXNdIGFuZCBtYXBzIGVhY2ggZWxlbWVudCBvZgogICAqIFtrZXlzXSB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIFt2YWx1ZXNdLgogICAqCiAgICogICAgIExpc3Q8U3RyaW5nPiBsZXR0ZXJzID0gWydiJywgJ2MnXTsKICAgKiAgICAgTGlzdDxTdHJpbmc+IHdvcmRzID0gWydiYWQnLCAnY2F0J107CiAgICogICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IE1hcC5mcm9tSXRlcmFibGVzKGxldHRlcnMsIHdvcmRzKTsKICAgKiAgICAgbWFwWydiJ10gKyBtYXBbJ2MnXTsgIC8vIGJhZGNhdAogICAqCiAgICogSWYgW2tleXNdIGNvbnRhaW5zIHRoZSBzYW1lIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgdGhlIGxhc3Qgb2NjdXJyZW5jZQogICAqIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIHZhbHVlLgogICAqCiAgICogVGhlIHR3byBbSXRlcmFibGVdcyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoLgogICAqLwogIGZhY3RvcnkgTWFwLmZyb21JdGVyYWJsZXMoSXRlcmFibGU8Sz4ga2V5cywgSXRlcmFibGU8Vj4gdmFsdWVzKSA9CiAgICAgIExpbmtlZEhhc2hNYXA8SywgVj4uZnJvbUl0ZXJhYmxlczsKCiAgLyoqCiAgICogQWRhcHRzIFtzb3VyY2VdIHRvIGJlIGEgYE1hcDxLMiwgVjI+YC4KICAgKgogICAqIEFueSB0aW1lIHRoZSBzZXQgd291bGQgcHJvZHVjZSBhIGtleSBvciB2YWx1ZSB0aGF0IGlzIG5vdCBhIFtLMl0gb3IgW1YyXSwKICAgKiB0aGUgYWNjZXNzIHdpbGwgdGhyb3cuCiAgICoKICAgKiBBbnkgdGltZSBbSzJdIGtleSBvciBbVjJdIHZhbHVlIGlzIGF0dGVtcHRlZCBhZGRlZCBpbnRvIHRoZSBhZGFwdGVkIG1hcCwKICAgKiB0aGUgc3RvcmUgd2lsbCB0aHJvdyB1bmxlc3MgdGhlIGtleSBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIFtLXSBhbmQKICAgKiB0aGUgdmFsdWUgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBbVl0uCiAgICoKICAgKiBJZiBhbGwgYWNjZXNzZWQgZW50cmllcyBvZiBbc291cmNlXSBhcmUgaGF2ZSBbSzJdIGtleXMgYW5kIFtWMl0gdmFsdWVzCiAgICogYW5kIGlmIGFsbCBlbnRyaWVzIGFkZGVkIHRvIHRoZSByZXR1cm5lZCBtYXAgaGF2ZSBbS10ga2V5cyBhbmQgW1ZdXSB2YWx1ZXMsCiAgICogdGhlbiB0aGUgcmV0dXJuZWQgbWFwIGNhbiBiZSB1c2VkIGFzIGEgYE1hcDxLMiwgVjI+YC4KICAgKi8KICBzdGF0aWMgTWFwPEsyLCBWMj4gY2FzdEZyb208SywgViwgSzIsIFYyPihNYXA8SywgVj4gc291cmNlKSA9PgogICAgICBDYXN0TWFwPEssIFYsIEsyLCBWMj4oc291cmNlKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBtYXAgYW5kIGFkZHMgYWxsIGVudHJpZXMuCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IGBNYXA8SywgVj5gIHdoZXJlIGFsbCBlbnRyaWVzIG9mIFtlbnRyaWVzXQogICAqIGhhdmUgYmVlbiBhZGRlZCBpbiBpdGVyYXRpb24gb3JkZXIuCiAgICoKICAgKiBJZiBtdWx0aXBsZSBbZW50cmllc10gaGF2ZSB0aGUgc2FtZSBrZXksCiAgICogbGF0ZXIgb2NjdXJyZW5jZXMgb3ZlcndyaXRlIHRoZSBlYXJsaWVyIG9uZXMuCiAgICovCiAgZmFjdG9yeSBNYXAuZnJvbUVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IGVudHJpZXMpID0+CiAgICAgIDxLLCBWPnt9Li5hZGRFbnRyaWVzKGVudHJpZXMpOwoKICAvKioKICAgKiBQcm92aWRlcyBhIHZpZXcgb2YgdGhpcyBtYXAgYXMgaGF2aW5nIFtSS10ga2V5cyBhbmQgW1JWXSBpbnN0YW5jZXMsCiAgICogaWYgbmVjZXNzYXJ5LgogICAqCiAgICogSWYgdGhpcyBtYXAgaXMgYWxyZWFkeSBhIGBNYXA8UkssIFJWPmAsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KICAgKgogICAqIElmIHRoaXMgc2V0IGNvbnRhaW5zIG9ubHkga2V5cyBvZiB0eXBlIFtSS10gYW5kIHZhbHVlcyBvZiB0eXBlIFtSVl0sCiAgICogYWxsIHJlYWQgb3BlcmF0aW9ucyB3aWxsIHdvcmsgY29ycmVjdGx5LgogICAqIElmIGFueSBvcGVyYXRpb24gZXhwb3NlcyBhIG5vbi1bUktdIGtleSBvciBub24tW1JWXSB2YWx1ZSwKICAgKiB0aGUgb3BlcmF0aW9uIHdpbGwgdGhyb3cgaW5zdGVhZC4KICAgKgogICAqIEVudHJpZXMgYWRkZWQgdG8gdGhlIG1hcCBtdXN0IGJlIHZhbGlkIGZvciBib3RoIGEgYE1hcDxLLCBWPmAgYW5kIGEKICAgKiBgTWFwPFJLLCBSVj5gLgogICAqLwogIE1hcDxSSywgUlY+IGNhc3Q8UkssIFJWPigpOwogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgZ2l2ZW4gW3ZhbHVlXS4KICAgKgogICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgbWFwIGFyZSBlcXVhbCB0byBgdmFsdWVgCiAgICogYWNjb3JkaW5nIHRvIHRoZSBgPT1gIG9wZXJhdG9yLgogICAqLwogIGJvb2wgY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIGdpdmVuIFtrZXldLgogICAqCiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUga2V5cyBpbiB0aGUgbWFwIGFyZSBlcXVhbCB0byBga2V5YAogICAqIGFjY29yZGluZyB0byB0aGUgZXF1YWxpdHkgdXNlZCBieSB0aGUgbWFwLgogICAqLwogIGJvb2wgY29udGFpbnNLZXkoT2JqZWN0IGtleSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gW2tleV0gb3IgbnVsbCBpZiBba2V5XSBpcyBub3QgaW4gdGhlIG1hcC4KICAgKgogICAqIFNvbWUgbWFwcyBhbGxvdyBrZXlzIHRvIGhhdmUgYG51bGxgIGFzIGEgdmFsdWUuCiAgICogRm9yIHRob3NlIG1hcHMsIGEgbG9va3VwIHVzaW5nIHRoaXMgb3BlcmF0b3IgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYQogICAqIGtleSBub3QgYmVpbmcgaW4gdGhlIG1hcCBhbmQgdGhlIGtleSBoYXZpbmcgYSBgbnVsbGAgdmFsdWUuCiAgICogTWV0aG9kcyBsaWtlIFtjb250YWluc0tleV0gb3IgW3B1dElmQWJzZW50XSBjYW4gYmUgdXNlZCBpZiB0aGUgZGlzdGluY3Rpb24KICAgKiBpcyBpbXBvcnRhbnQuCiAgICovCiAgViBvcGVyYXRvciBbXShPYmplY3Qga2V5KTsKCiAgLyoqCiAgICogQXNzb2NpYXRlcyB0aGUgW2tleV0gd2l0aCB0aGUgZ2l2ZW4gW3ZhbHVlXS4KICAgKgogICAqIElmIHRoZSBrZXkgd2FzIGFscmVhZHkgaW4gdGhlIG1hcCwgaXRzIGFzc29jaWF0ZWQgdmFsdWUgaXMgY2hhbmdlZC4KICAgKiBPdGhlcndpc2UgdGhlIGtleS92YWx1ZSBwYWlyIGlzIGFkZGVkIHRvIHRoZSBtYXAuCiAgICovCiAgdm9pZCBvcGVyYXRvciBbXT0oSyBrZXksIFYgdmFsdWUpOwoKICAvKioKICAgKiBUaGUgbWFwIGVudHJpZXMgb2YgW3RoaXNdLgogICAqLwogIEl0ZXJhYmxlPE1hcEVudHJ5PEssIFY+PiBnZXQgZW50cmllczsKCiAgLyoqCiAgICogUmV0dXJucyBhIG5ldyBtYXAgd2hlcmUgYWxsIGVudHJpZXMgb2YgdGhpcyBtYXAgYXJlIHRyYW5zZm9ybWVkIGJ5CiAgICogdGhlIGdpdmVuIFtmXSBmdW5jdGlvbi4KICAgKi8KICBNYXA8SzIsIFYyPiBtYXA8SzIsIFYyPihNYXBFbnRyeTxLMiwgVjI+IGYoSyBrZXksIFYgdmFsdWUpKTsKCiAgLyoqCiAgICogQWRkcyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtuZXdFbnRyaWVzXSB0byB0aGlzIG1hcC4KICAgKgogICAqIElmIGEga2V5IG9mIFtuZXdFbnRyaWVzXSBpcyBhbHJlYWR5IGluIHRoaXMgbWFwLAogICAqIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG92ZXJ3cml0dGVuLgogICAqCiAgICogVGhlIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRvaW5nIGB0aGlzW2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZWAKICAgKiBmb3IgZWFjaCBbTWFwRW50cnldIG9mIHRoZSBpdGVyYWJsZS4KICAgKi8KICB2b2lkIGFkZEVudHJpZXMoSXRlcmFibGU8TWFwRW50cnk8SywgVj4+IG5ld0VudHJpZXMpOwoKICAvKioKICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIFtrZXldLgogICAqCiAgICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBrZXkuCiAgICoKICAgKiBJZiB0aGUga2V5IGlzIHByZXNlbnQsIGludm9rZXMgW3VwZGF0ZV0gd2l0aCB0aGUgY3VycmVudCB2YWx1ZSBhbmQgc3RvcmVzCiAgICogdGhlIG5ldyB2YWx1ZSBpbiB0aGUgbWFwLgogICAqCiAgICogSWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCBhbmQgW2lmQWJzZW50XSBpcyBwcm92aWRlZCwgY2FsbHMgW2lmQWJzZW50XQogICAqIGFuZCBhZGRzIHRoZSBrZXkgd2l0aCB0aGUgcmV0dXJuZWQgdmFsdWUgdG8gdGhlIG1hcC4KICAgKgogICAqIEl0J3MgYW4gZXJyb3IgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCBhbmQgW2lmQWJzZW50XSBpcyBub3QgcHJvdmlkZWQuCiAgICovCiAgViB1cGRhdGUoSyBrZXksIFYgdXBkYXRlKFYgdmFsdWUpLCB7ViBpZkFic2VudCgpfSk7CgogIC8qKgogICAqIFVwZGF0ZXMgYWxsIHZhbHVlcy4KICAgKgogICAqIEl0ZXJhdGVzIG92ZXIgYWxsIGVudHJpZXMgaW4gdGhlIG1hcCBhbmQgdXBkYXRlcyB0aGVtIHdpdGggdGhlIHJlc3VsdAogICAqIG9mIGludm9raW5nIFt1cGRhdGVdLgogICAqLwogIHZvaWQgdXBkYXRlQWxsKFYgdXBkYXRlKEsga2V5LCBWIHZhbHVlKSk7CgogIC8qKgogICAqIFJlbW92ZXMgYWxsIGVudHJpZXMgb2YgdGhpcyBtYXAgdGhhdCBzYXRpc2Z5IHRoZSBnaXZlbiBbcHJlZGljYXRlXS4KICAgKi8KICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgcHJlZGljYXRlKEsga2V5LCBWIHZhbHVlKSk7CgogIC8qKgogICAqIExvb2sgdXAgdGhlIHZhbHVlIG9mIFtrZXldLCBvciBhZGQgYSBuZXcgdmFsdWUgaWYgaXQgaXNuJ3QgdGhlcmUuCiAgICoKICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHRvIFtrZXldLCBpZiB0aGVyZSBpcyBvbmUuCiAgICogT3RoZXJ3aXNlIGNhbGxzIFtpZkFic2VudF0gdG8gZ2V0IGEgbmV3IHZhbHVlLCBhc3NvY2lhdGVzIFtrZXldIHRvCiAgICogdGhhdCB2YWx1ZSwgYW5kIHRoZW4gcmV0dXJucyB0aGUgbmV3IHZhbHVlLgogICAqCiAgICogICAgIE1hcDxTdHJpbmcsIGludD4gc2NvcmVzID0geydCb2InOiAzNn07CiAgICogICAgIGZvciAodmFyIGtleSBpbiBbJ0JvYicsICdSb2hhbicsICdTb3BoZW5hJ10pIHsKICAgKiAgICAgICBzY29yZXMucHV0SWZBYnNlbnQoa2V5LCAoKSA9PiBrZXkubGVuZ3RoKTsKICAgKiAgICAgfQogICAqICAgICBzY29yZXNbJ0JvYiddOyAgICAgIC8vIDM2CiAgICogICAgIHNjb3Jlc1snUm9oYW4nXTsgICAgLy8gIDUKICAgKiAgICAgc2NvcmVzWydTb3BoZW5hJ107ICAvLyAgNwogICAqCiAgICogQ2FsbGluZyBbaWZBYnNlbnRdIG11c3Qgbm90IGFkZCBvciByZW1vdmUga2V5cyBmcm9tIHRoZSBtYXAuCiAgICovCiAgViBwdXRJZkFic2VudChLIGtleSwgViBpZkFic2VudCgpKTsKCiAgLyoqCiAgICogQWRkcyBhbGwga2V5L3ZhbHVlIHBhaXJzIG9mIFtvdGhlcl0gdG8gdGhpcyBtYXAuCiAgICoKICAgKiBJZiBhIGtleSBvZiBbb3RoZXJdIGlzIGFscmVhZHkgaW4gdGhpcyBtYXAsIGl0cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KICAgKgogICAqIFRoZSBvcGVyYXRpb24gaXMgZXF1aXZhbGVudCB0byBkb2luZyBgdGhpc1trZXldID0gdmFsdWVgIGZvciBlYWNoIGtleQogICAqIGFuZCBhc3NvY2lhdGVkIHZhbHVlIGluIG90aGVyLiBJdCBpdGVyYXRlcyBvdmVyIFtvdGhlcl0sIHdoaWNoIG11c3QKICAgKiB0aGVyZWZvcmUgbm90IGNoYW5nZSBkdXJpbmcgdGhlIGl0ZXJhdGlvbi4KICAgKi8KICB2b2lkIGFkZEFsbChNYXA8SywgVj4gb3RoZXIpOwoKICAvKioKICAgKiBSZW1vdmVzIFtrZXldIGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSwgaWYgcHJlc2VudCwgZnJvbSB0aGUgbWFwLgogICAqCiAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGBrZXlgIGJlZm9yZSBpdCB3YXMgcmVtb3ZlZC4KICAgKiBSZXR1cm5zIGBudWxsYCBpZiBga2V5YCB3YXMgbm90IGluIHRoZSBtYXAuCiAgICoKICAgKiBOb3RlIHRoYXQgdmFsdWVzIGNhbiBiZSBgbnVsbGAgYW5kIGEgcmV0dXJuZWQgYG51bGxgIHZhbHVlIGRvZXNuJ3QKICAgKiBhbHdheXMgbWVhbiB0aGF0IHRoZSBrZXkgd2FzIGFic2VudC4KICAgKi8KICBWIHJlbW92ZShPYmplY3Qga2V5KTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgcGFpcnMgZnJvbSB0aGUgbWFwLgogICAqCiAgICogQWZ0ZXIgdGhpcywgdGhlIG1hcCBpcyBlbXB0eS4KICAgKi8KICB2b2lkIGNsZWFyKCk7CgogIC8qKgogICAqIEFwcGxpZXMgW2ZdIHRvIGVhY2gga2V5L3ZhbHVlIHBhaXIgb2YgdGhlIG1hcC4KICAgKgogICAqIENhbGxpbmcgYGZgIG11c3Qgbm90IGFkZCBvciByZW1vdmUga2V5cyBmcm9tIHRoZSBtYXAuCiAgICovCiAgdm9pZCBmb3JFYWNoKHZvaWQgZihLIGtleSwgViB2YWx1ZSkpOwoKICAvKioKICAgKiBUaGUga2V5cyBvZiBbdGhpc10uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgaXRlcmFibGUgaGFzIGVmZmljaWVudCBgbGVuZ3RoYCBhbmQgYGNvbnRhaW5zYCBvcGVyYXRpb25zLAogICAqIGJhc2VkIG9uIFtsZW5ndGhdIGFuZCBbY29udGFpbnNLZXldIG9mIHRoZSBtYXAuCiAgICoKICAgKiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIGRlZmluZWQgYnkgdGhlIGluZGl2aWR1YWwgYE1hcGAgaW1wbGVtZW50YXRpb24sCiAgICogYnV0IG11c3QgYmUgY29uc2lzdGVudCBiZXR3ZWVuIGNoYW5nZXMgdG8gdGhlIG1hcC4KICAgKgogICAqIE1vZGlmeWluZyB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZyB0aGUga2V5cwogICAqIG1heSBicmVhayB0aGUgaXRlcmF0aW9uLgogICAqLwogIEl0ZXJhYmxlPEs+IGdldCBrZXlzOwoKICAvKioKICAgKiBUaGUgdmFsdWVzIG9mIFt0aGlzXS4KICAgKgogICAqIFRoZSB2YWx1ZXMgYXJlIGl0ZXJhdGVkIGluIHRoZSBvcmRlciBvZiB0aGVpciBjb3JyZXNwb25kaW5nIGtleXMuCiAgICogVGhpcyBtZWFucyB0aGF0IGl0ZXJhdGluZyBba2V5c10gYW5kIFt2YWx1ZXNdIGluIHBhcmFsbGVsIHdpbGwKICAgKiBwcm92aWRlIG1hdGNoaW5nIHBhaXJzIG9mIGtleXMgYW5kIHZhbHVlcy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBpdGVyYWJsZSBoYXMgYW4gZWZmaWNpZW50IGBsZW5ndGhgIG1ldGhvZCBiYXNlZCBvbiB0aGUKICAgKiBbbGVuZ3RoXSBvZiB0aGUgbWFwLiBJdHMgW0l0ZXJhYmxlLmNvbnRhaW5zXSBtZXRob2QgaXMgYmFzZWQgb24KICAgKiBgPT1gIGNvbXBhcmlzb24uCiAgICoKICAgKiBNb2RpZnlpbmcgdGhlIG1hcCB3aGlsZSBpdGVyYXRpbmcgdGhlCiAgICogdmFsdWVzIG1heSBicmVhayB0aGUgaXRlcmF0aW9uLgogICAqLwogIEl0ZXJhYmxlPFY+IGdl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dHMpIHsKICAgIHZhciBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICAgdmFyIGxlbiA9IGVsZW1lbnRzLmxlbmd0aDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpICs9IDIpIHsKICAgICAgbWFwW2VsZW1lbnRzW2kgLSAxXV0gPSBlbGVtZW50c1tpXTsKICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IE1hcC51bm1vZGlmaWFibGUoTWFwIG90aGVyKSB7CiAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZU1hcFZpZXc8SywgVj4obmV3IE1hcDxLLCBWPi5mcm9tKG90aGVyKSk7CiAgfQoKICBAcGF0Y2gKICBmYWN0b3J5IE1hcCgpID0+IG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KCk7Cn0KIQBOTjwBHgEHEkUsTRZEJCwpHycqBhAEAQkoRQQBCS4CAR5kYXJ0OmNvcmUtcGF0Y2gvbWFwX3BhdGNoLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvbnVsbC5kYXJ0gqAvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogVGhlIHJlc2VydmVkIHdvcmQgWzpudWxsOl0gZGVub3RlcyBhbiBvYmplY3QgdGhhdCBpcyB0aGUgc29sZSBpbnN0YW5jZSBvZiAKICogdGhpcyBjbGFzcy4KICogCiAqIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGZvciBhIGNsYXNzIHRvIGF0dGVtcHQgdG8gZXh0ZW5kIG9yIGltcGxlbWVudAogKiBOdWxsLgogKi8KQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBOdWxsIHsKICBmYWN0b3J5IE51bGwuX3VuaW5zdGFudGlhYmxlKCkgewogICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcignY2xhc3MgTnVsbCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkJyk7CiAgfQoKICBleHRlcm5hbCBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIGAibnVsbCJgLiAqLwogIFN0cmluZyB0b1N0cmluZygpID0+ICJudWxsIjsKfQoaAE5OPAETAQRODwRMCQQaDSNBBAEdASYfAgETZGFydDpjb3JlL251bGwuZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL251bGxfcGF0Y2guZGFydIHOLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBOdWxsIHsKICBzdGF0aWMgY29uc3QgX0hBU0hfQ09ERSA9IDIwMTE7IC8vIFRoZSB5ZWFyIERhcnQgd2FzIGFubm91bmNlZCBhbmQgYSBwcmltZS4KCiAgQHBhdGNoCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfSEFTSF9DT0RFOwoKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlID0+IF9IQVNIX0NPREU7Cn0KEgBOTjwBHgEHGg1OAQkiASsCAR9kYXJ0OmNvcmUtcGF0Y2gvbnVsbF9wYXRjaC5kYXJ0KW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL251bS5kYXJ0wABE1i8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBbiBpbnRlZ2VyIG9yIGZsb2F0aW5nLXBvaW50IG51bWJlci4KICoKICogSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgZm9yIGFueSB0eXBlIG90aGVyIHRoYW4gW2ludF0gb3IgW2RvdWJsZV0KICogdG8gYXR0ZW1wdCB0byBleHRlbmQgb3IgaW1wbGVtZW50IG51bS4KICovCmFic3RyYWN0IGNsYXNzIG51bSBpbXBsZW1lbnRzIENvbXBhcmFibGU8bnVtPiB7CiAgLyoqCiAgICogVGVzdCB3aGV0aGVyIHRoaXMgdmFsdWUgaXMgbnVtZXJpY2FsbHkgZXF1YWwgdG8gYG90aGVyYC4KICAgKgogICAqIElmIGJvdGggb3BlcmFuZHMgYXJlIGRvdWJsZXMsIHRoZXkgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZQogICAqIHJlcHJlc2VudGF0aW9uLCBleGNlcHQgdGhhdDoKICAgKgogICAqICAgKiB6ZXJvIGFuZCBtaW51cyB6ZXJvICgwLjAgYW5kIC0wLjApIGFyZSBjb25zaWRlcmVkIGVxdWFsLiBUaGV5CiAgICogICAgIGJvdGggaGF2ZSB0aGUgbnVtZXJpY2FsIHZhbHVlIHplcm8uCiAgICogICAqIE5hTiBpcyBub3QgZXF1YWwgdG8gYW55dGhpbmcsIGluY2x1ZGluZyBOYU4uIElmIGVpdGhlciBvcGVyYW5kIGlzCiAgICogICAgIE5hTiwgdGhlIHJlc3VsdCBpcyBhbHdheXMgZmFsc2UuCiAgICoKICAgKiBJZiBvbmUgb3BlcmFuZCBpcyBhIGRvdWJsZSBhbmQgdGhlIG90aGVyIGlzIGFuIGludCwgdGhleSBhcmUgZXF1YWwgaWYKICAgKiB0aGUgZG91YmxlIGhhcyBhbiBpbnRlZ2VyIHZhbHVlIChmaW5pdGUgd2l0aCBubyBmcmFjdGlvbmFsIHBhcnQpIGFuZAogICAqIGBpZGVudGljYWwoZG91YmxlVmFsdWUudG9JbnQoKSwgaW50VmFsdWUpYCBpcyB0cnVlLgogICAqCiAgICogSWYgYm90aCBvcGVyYW5kcyBhcmUgaW50ZWdlcnMsIHRoZXkgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgZmFsc2UgaWYgYG90aGVyYCBpcyBub3QgYSBbbnVtXS4KICAgKgogICAqIE5vdGljZSB0aGF0IHRoZSBiZWhhdmlvciBmb3IgTmFOIGlzIG5vbi1yZWZsZXhpdmUuIFRoaXMgbWVhbnMgdGhhdAogICAqIGVxdWFsaXR5IG9mIGRvdWJsZSB2YWx1ZXMgaXMgbm90IGEgcHJvcGVyIGVxdWFsaXR5IHJlbGF0aW9uLCBhcyBpcwogICAqIG90aGVyd2lzZSByZXF1aXJlZCBvZiBgb3BlcmF0b3I9PWAuIFVzaW5nIE5hTiBpbiwgZS5nLiwgYSBbSGFzaFNldF0KICAgKiB3aWxsIGZhaWwgdG8gd29yay4gVGhlIGJlaGF2aW9yIGlzIHRoZSBzdGFuZGFyZCBJRUVFLTc1NCBlcXVhbGl0eSBvZgogICAqIGRvdWJsZXMuCiAgICoKICAgKiBJZiB5b3UgY2FuIGF2b2lkIE5hTiB2YWx1ZXMsIHRoZSByZW1haW5pbmcgZG91YmxlcyBkbyBoYXZlIGEgcHJvcGVyCiAgICogZXF1YWxpdHkgcmVsYXRpb24sIGFuZCBjYW4gYmUgdXNlZCBzYWZlbHkuCiAgICoKICAgKiBVc2UgW2NvbXBhcmVUb10gZm9yIGEgY29tcGFyaXNvbiB0aGF0IGRpc3Rpbmd1aXNoZXMgemVybyBhbmQgbWludXMgemVybywKICAgKiBhbmQgdGhhdCBjb25zaWRlcnMgTmFOIHZhbHVlcyBhcyBlcXVhbC4KICAgKi8KICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIGEgbnVtZXJpY2FsIHZhbHVlLgogICAqCiAgICogVGhlIGhhc2ggY29kZSBpcyBjb21wYXRpYmxlIHdpdGggZXF1YWxpdHkuIEl0IHJldHVybnMgdGhlIHNhbWUgdmFsdWUKICAgKiBmb3IgYW4gW2ludF0gYW5kIGEgW2RvdWJsZV0gd2l0aCB0aGUgc2FtZSBudW1lcmljYWwgdmFsdWUsIGFuZCB0aGVyZWZvcmUKICAgKiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIGRvdWJsZXMgemVybyBhbmQgbWludXMgemVyby4KICAgKgogICAqIE5vIGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgdGhlIGhhc2ggY29kZSBvZiBOYU4gdmFsdWVzLgogICAqLwogIGludCBnZXQgaGFzaENvZGU7CgogIC8qKgogICAqIENvbXBhcmVzIHRoaXMgdG8gYG90aGVyYC4KICAgKgogICAqIFJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIgaWYgYHRoaXNgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLCB6ZXJvIGlmIHRoZXkgYXJlCiAgICogZXF1YWwsIGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiBgdGhpc2AgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuCiAgICoKICAgKiBUaGUgb3JkZXJpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyBtZXRob2QgaXMgYSB0b3RhbCBvcmRlcmluZyBvZiBbbnVtXQogICAqIHZhbHVlcy4gQWxsIGRpc3RpbmN0IGRvdWJsZXMgYXJlIG5vbi1lcXVhbCwgYXMgYXJlIGFsbCBkaXN0aW5jdCBpbnRlZ2VycywKICAgKiBidXQgaW50ZWdlcnMgYXJlIGVxdWFsIHRvIGRvdWJsZXMgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG51bWVyaWNhbAogICAqIHZhbHVlLgogICAqCiAgICogRm9yIGRvdWJsZXMsIHRoZSBgY29tcGFyZVRvYCBvcGVyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIHBhcnRpYWwKICAgKiBvcmRlcmluZyBnaXZlbiBieSBbb3BlcmF0b3I9PV0sIFtvcGVyYXRvcjxdIGFuZCBbb3BlcmF0b3I+XS4gRm9yIGV4YW1wbGUsCiAgICogSUVFRSBkb3VibGVzIGltcG9zZSB0aGF0IGAwLjAgPT0gLTAuMGAgYW5kIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgb24KICAgKiBOYU4gcmV0dXJuIGZhbHNlLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpbXBvc2VzIGEgY29tcGxldGUgb3JkZXJpbmcgZm9yIGRvdWJsZXMuIFdoZW4gdXNpbmcKICAgKiBgY29tcGFyZVRvYCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgaG9sZDoKICAgKgogICAqIC0gQWxsIE5hTiB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwsIGFuZCBncmVhdGVyIHRoYW4gYW55IG51bWVyaWMgdmFsdWUuCiAgICogLSAtMC4wIGlzIGxlc3MgdGhhbiAwLjAgKGFuZCB0aGUgaW50ZWdlciAwKSwgYnV0IGdyZWF0ZXIgdGhhbiBhbnkgbm9uLXplcm8KICAgKiAgICBuZWdhdGl2ZSB2YWx1ZS4KICAgKiAtIE5lZ2F0aXZlIGluZmluaXR5IGlzIGxlc3MgdGhhbiBhbGwgb3RoZXIgdmFsdWVzIGFuZCBwb3NpdGl2ZSBpbmZpbml0eSBpcwogICAqICAgZ3JlYXRlciB0aGFuIGFsbCBub24tTmFOIHZhbHVlcy4KICAgKiAtIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZWlyIG51bWVyaWMgdmFsdWUuCiAgICoKICAgKiBFeGFtcGxlczoKICAgKiBgYGAKICAgKiBwcmludCgxLmNvbXBhcmVUbygyKSk7IC8vID0+IC0xCiAgICogcHJpbnQoMi5jb21wYXJlVG8oMSkpOyAvLyA9PiAxCiAgICogcHJpbnQoMS5jb21wYXJlVG8oMSkpOyAvLyA9PiAwCiAgICoKICAgKiAvLyBUaGUgZm9sbG93aW5nIGNvbXBhcmlzb25zIHlpZWxkIGRpZmZlcmVudCByZXN1bHRzIHRoYW4gdGhlCiAgICogLy8gY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9wZXJhdG9ycy4KICAgKiBwcmludCgoLTAuMCkuY29tcGFyZVRvKDAuMCkpOyAgLy8gPT4gLTEKICAgKiBwcmludChkb3VibGUubmFuLmNvbXBhcmVUbyhkb3VibGUubmFuKSk7ICAvLyA9PiAwCiAgICogcHJpbnQoZG91YmxlLmluZmluaXR5LmNvbXBhcmVUbyhkb3VibGUubmFuKSk7IC8vID0+IC0xCiAgICoKICAgKiAvLyAtMC4wLCBhbmQgTmFOIGNvbXBhcmlzb24gb3BlcmF0b3JzIGhhdmUgcnVsZXMgaW1wb3NlZCBieSB0aGUgSUVFRQogICAqIC8vIHN0YW5kYXJkLgogICAqIHByaW50KC0wLjAgPT0gMC4wKTsgLy8gPT4gdHJ1ZQogICAqIHByaW50KGRvdWJsZS5uYW4gPT0gZG91YmxlLm5hbik7ICAvLyA9PiBmYWxzZQogICAqIHByaW50KGRvdWJsZS5pbmZpbml0eSA8IGRvdWJsZS5uYW4pOyAgLy8gPT4gZmFsc2UKICAgKiBwcmludChkb3VibGUubmFuIDwgZG91YmxlLmluZmluaXR5KTsgIC8vID0+IGZhbHNlCiAgICogcHJpbnQoZG91YmxlLm5hbiA9PSBkb3VibGUuaW5maW5pdHkpOyAgLy8gPT4gZmFsc2UKICAgKiBgYGAKICAgKi8KICBpbnQgY29tcGFyZVRvKG51bSBvdGhlcik7CgogIC8qKiBBZGRpdGlvbiBvcGVyYXRvci4gKi8KICBudW0gb3BlcmF0b3IgKyhudW0gb3RoZXIpOwoKICAvKiogU3VidHJhY3Rpb24gb3BlcmF0b3IuICovCiAgbnVtIG9wZXJhdG9yIC0obnVtIG90aGVyKTsKCiAgLyoqIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLiAqLwogIG51bSBvcGVyYXRvciAqKG51bSBvdGhlcik7CgogIC8qKgogICAqIEV1Y2xpZGVhbiBtb2R1bG8gb3BlcmF0b3IuCiAgICoKICAgKiBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIEV1Y2xpZGVhbiBkaXZpc2lvbi4gVGhlIEV1Y2xpZGVhbiBkaXZpc2lvbiBvZgogICAqIHR3byBpbnRlZ2VycyBgYWAgYW5kIGBiYCB5aWVsZHMgdHdvIGludGVnZXJzIGBxYCBhbmQgYHJgIHN1Y2ggdGhhdAogICAqIGBhID09IGIgKiBxICsgcmAgYW5kIGAwIDw9IHIgPCBiLmFicygpYC4KICAgKgogICAqIFRoZSBFdWNsaWRlYW4gZGl2aXNpb24gaXMgb25seSBkZWZpbmVkIGZvciBpbnRlZ2VycywgYnV0IGNhbiBiZSBlYXNpbHkKICAgKiBleHRlbmRlZCB0byB3b3JrIHdpdGggZG91Ymxlcy4gSW4gdGhhdCBjYXNlIGByYCBtYXkgaGF2ZSBhIG5vbi1pbnRlZ2VyCiAgICogdmFsdWUsIGJ1dCBpdCBzdGlsbCB2ZXJpZmllcyBgMCA8PSByIDwgfGJ8YC4KICAgKgogICAqIFRoZSBzaWduIG9mIHRoZSByZXR1cm5lZCB2YWx1ZSBgcmAgaXMgYWx3YXlzIHBvc2l0aXZlLgogICAqCiAgICogU2VlIFtyZW1haW5kZXJdIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uLgogICAqLwogIG51bSBvcGVyYXRvciAlKG51bSBvdGhlcik7CgogIC8qKiBEaXZpc2lvbiBvcGVyYXRvci4gKi8KICBkb3VibGUgb3BlcmF0b3IgLyhudW0gb3RoZXIpOwoKICAvKioKICAgKiBUcnVuY2F0aW5nIGRpdmlzaW9uIG9wZXJhdG9yLgogICAqCiAgICogSWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBbZG91YmxlXSB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIHRydW5jYXRpbmcgZGl2aXNpb24KICAgKiBgYSB+LyBiYCBpcyBlcXVpdmFsZW50IHRvIGAoYSAvIGIpLnRydW5jYXRlKCkudG9JbnQoKWAuCiAgICoKICAgKiBJZiBib3RoIG9wZXJhbmRzIGFyZSBbaW50XXMgdGhlbiBgYSB+LyBiYCBwZXJmb3JtcyB0aGUgdHJ1bmNhdGluZwogICAqIGludGVnZXIgZGl2aXNpb24uCiAgICovCiAgaW50IG9wZXJhdG9yIH4vKG51bSBvdGhlcik7CgogIC8qKiBOZWdhdGUgb3BlcmF0b3IuICovCiAgbnVtIG9wZXJhdG9yIC0oKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cnVuY2F0aW5nIGRpdmlzaW9uIG9mIGB0aGlzYCBieSBbb3RoZXJdLgogICAqCiAgICogVGhlIHJlc3VsdCBgcmAgb2YgdGhpcyBvcGVyYXRpb24gc2F0aXNmaWVzOgogICAqIGB0aGlzID09ICh0aGlzIH4vIG90aGVyKSAqIG90aGVyICsgcmAuCiAgICogQXMgYSBjb25zZXF1ZW5jZSB0aGUgcmVtYWluZGVyIGByYCBoYXMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGl2aWRlciBgdGhpc2AuCiAgICovCiAgbnVtIHJlbWFpbmRlcihudW0gb3RoZXIpOwoKICAvKiogUmVsYXRpb25hbCBsZXNzIHRoYW4gb3BlcmF0b3IuICovCiAgYm9vbCBvcGVyYXRvciA8KG51bSBvdGhlcik7CgogIC8qKiBSZWxhdGlvbmFsIGxlc3MgdGhhbiBvciBlcXVhbCBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yIDw9KG51bSBvdGhlcik7CgogIC8qKiBSZWxhdGlvbmFsIGdyZWF0ZXIgdGhhbiBvcGVyYXRvci4gKi8KICBib29sIG9wZXJhdG9yID4obnVtIG90aGVyKTsKCiAgLyoqIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yLiAqLwogIGJvb2wgb3BlcmF0b3IgPj0obnVtIG90aGVyKTsKCiAgLyoqIFRydWUgaWYgdGhlIG51bWJlciBpcyB0aGUgZG91YmxlIE5vdC1hLU51bWJlciB2YWx1ZTsgb3RoZXJ3aXNlLCBmYWxzZS4gKi8KICBib29sIGdldCBpc05hTjsKCiAgLyoqCiAgICogVHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlOyBvdGhlcndpc2UsIGZhbHNlLgogICAqCiAgICogTmVnYXRpdmUgbnVtYmVycyBhcmUgdGhvc2UgbGVzcyB0aGFuIHplcm8sIGFuZCB0aGUgZG91YmxlIGAtMC4wYC4KICAgKi8KICBib29sIGdldCBpc05lZ2F0aXZlOwoKICAvKioKICAgKiBUcnVlIGlmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUgaW5maW5pdHkgb3IgbmVnYXRpdmUgaW5maW5pdHk7IG90aGVyd2lzZSwKICAgKiBmYWxzZS4KICAgKi8KICBib29sIGdldCBpc0luZmluaXRlOwoKICAvKioKICAgKiBUcnVlIGlmIHRoZSBudW1iZXIgaXMgZmluaXRlOyBvdGhlcndpc2UsIGZhbHNlLgogICAqCiAgICogVGhlIG9ubHkgbm9uLWZpbml0ZSBudW1iZXJzIGFyZSBOYU4sIHBvc2l0aXZlIGluZmluaXR5LCBhbmQKICAgKiBuZWdhdGl2ZSBpbmZpbml0eS4KICAgKi8KICBib29sIGdldCBpc0Zpbml0ZTsKCiAgLyoqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgW251bV0uICovCiAgbnVtIGFicygpOwoKICAvKioKICAgKiBSZXR1cm5zIG1pbnVzIG9uZSwgemVybyBvciBwbHVzIG9uZSBkZXBlbmRpbmcgb24gdGhlIHNpZ24gYW5kCiAgICogbnVtZXJpY2FsIHZhbHVlIG9mIHRoZSBudW1iZXIuCiAgICoKICAgKiBSZXR1cm5zIG1pbnVzIG9uZSBpZiB0aGUgbnVtYmVyIGlzIGxlc3MgdGhhbiB6ZXJvLAogICAqIHBsdXMgb25lIGlmIHRoZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHplcm8sCiAgICogYW5kIHplcm8gaWYgdGhlIG51bWJlciBpcyBlcXVhbCB0byB6ZXJvLgogICAqCiAgICogUmV0dXJucyBOYU4gaWYgdGhlIG51bWJlciBpcyB0aGUgZG91YmxlIE5hTiB2YWx1ZS4KICAgKgogICAqIFJldHVybnMgYSBudW1iZXIgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG51bWJlci4KICAgKiBGb3IgZG91YmxlcywgYC0wLjAuc2lnbiA9PSAtMC4wYC4KCiAgICogVGhlIHJlc3VsdCBzYXRpc2ZpZXM6CiAgICoKICAgKiAgICAgbiA9PSBuLnNpZ24gKiBuLmFicygpCiAgICoKICAgKiBmb3IgYWxsIG51bWJlcnMgYG5gIChleGNlcHQgTmFOLCBiZWNhdXNlIE5hTiBpc24ndCBgPT1gIHRvIGl0c2VsZikuCiAgICovCiAgbnVtIGdldCBzaWduOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIGNsb3Nlc3QgdG8gYHRoaXNgLgogICAqCiAgICogUm91bmRzIGF3YXkgZnJvbSB6ZXJvIHdoZW4gdGhlcmUgaXMgbm8gY2xvc2VzdCBpbnRlZ2VyOgogICAqICBgKDMuNSkucm91bmQoKSA9PSA0YCBhbmQgYCgtMy41KS5yb3VuZCgpID09IC00YC4KICAgKgogICAqIElmIGB0aGlzYCBpcyBub3QgZmluaXRlIChgTmFOYCBvciBpbmZpbml0eSksIHRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgaW50IHJvdW5kKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGdyZWF0ZXN0IGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIGB0aGlzYCBpcyBub3QgZmluaXRlIChgTmFOYCBvciBpbmZpbml0eSksIHRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgaW50IGZsb29yKCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxlYXN0IGludGVnZXIgbm8gc21hbGxlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIGB0aGlzYCBpcyBub3QgZmluaXRlIChgTmFOYCBvciBpbmZpbml0eSksIHRocm93cyBhbiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgaW50IGNlaWwoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgaW50ZWdlciBvYnRhaW5lZCBieSBkaXNjYXJkaW5nIGFueSBmcmFjdGlvbmFsCiAgICogZGlnaXRzIGZyb20gYHRoaXNgLgogICAqCiAgICogSWYgYHRoaXNgIGlzIG5vdCBmaW5pdGUgKGBOYU5gIG9yIGluZmluaXR5KSwgdGhyb3dzIGFuIFtVbnN1cHBvcnRlZEVycm9yXS4KICAgKi8KICBpbnQgdHJ1bmNhdGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZG91YmxlIGludGVnZXIgdmFsdWUgY2xvc2VzdCB0byBgdGhpc2AuCiAgICoKICAgKiBSb3VuZHMgYXdheSBmcm9tIHplcm8gd2hlbiB0aGVyZSBpcyBubyBjbG9zZXN0IGludGVnZXI6CiAgICogIGAoMy41KS5yb3VuZFRvRG91YmxlKCkgPT0gNGAgYW5kIGAoLTMuNSkucm91bmRUb0RvdWJsZSgpID09IC00YC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIGEKICAgKiBub24tZmluaXRlIGRvdWJsZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLAogICAqIGFuZCBgLTAuMGAgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgY2xvc2VyIHRvIG5lZ2F0aXZlIG51bWJlcnMgdGhhbiBgMC4wYC4KICAgKiBUaGlzIG1lYW5zIHRoYXQgZm9yIGEgdmFsdWUsIGBkYCBpbiB0aGUgcmFuZ2UgYC0wLjUgPCBkIDwgMC4wYCwKICAgKiB0aGUgcmVzdWx0IGlzIGAtMC4wYC4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZG91YmxlLgogICAqIElmIHRoaXMgaXMgYSBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VyLCB0aGUgcmVzdWx0IG1heSBiZSBhbiBpbmZpbml0ZQogICAqIGRvdWJsZS4KICAgKi8KICBkb3VibGUgcm91bmRUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBncmVhdGVzdCBkb3VibGUgaW50ZWdlciB2YWx1ZSBubyBncmVhdGVyIHRoYW4gYHRoaXNgLgogICAqCiAgICogSWYgdGhpcyBpcyBhbHJlYWR5IGFuIGludGVnZXIgdmFsdWVkIGRvdWJsZSwgaW5jbHVkaW5nIGAtMC4wYCwgb3IgaXQgaXMgYQogICAqIG5vbi1maW5pdGUgZG91YmxlIHZhbHVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KICAgKgogICAqIEZvciB0aGUgcHVycG9zZSBvZiByb3VuZGluZywgYC0wLjBgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYmVsb3cgYDAuMGAuCiAgICogQSBudW1iZXIgYGRgIGluIHRoZSByYW5nZSBgMC4wIDwgZCA8IDEuMGAgd2lsbCByZXR1cm4gYDAuMGAuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBhIGRvdWJsZS4KICAgKiBJZiB0aGlzIGlzIGEgbnVtZXJpY2FsbHkgbGFyZ2UgaW50ZWdlciwgdGhlIHJlc3VsdCBtYXkgYmUgYW4gaW5maW5pdGUKICAgKiBkb3VibGUuCiAgICovCiAgZG91YmxlIGZsb29yVG9Eb3VibGUoKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGVhc3QgZG91YmxlIGludGVnZXIgdmFsdWUgbm8gc21hbGxlciB0aGFuIGB0aGlzYC4KICAgKgogICAqIElmIHRoaXMgaXMgYWxyZWFkeSBhbiBpbnRlZ2VyIHZhbHVlZCBkb3VibGUsIGluY2x1ZGluZyBgLTAuMGAsIG9yIGl0IGlzIGEKICAgKiBub24tZmluaXRlIGRvdWJsZSB2YWx1ZSwgdGhlIHZhbHVlIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCiAgICoKICAgKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygcm91bmRpbmcsIGAtMC4wYCBpcyBjb25zaWRlcmVkIHRvIGJlIGJlbG93IGAwLjBgLgogICAqIEEgbnVtYmVyIGBkYCBpbiB0aGUgcmFuZ2UgYC0xLjAgPCBkIDwgMC4wYCB3aWxsIHJldHVybiBgLTAuMGAuCiAgICoKICAgKiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBhIGRvdWJsZS4KICAgKiBJZiB0aGlzIGlzIGEgbnVtZXJpY2FsbHkgbGFyZ2UgaW50ZWdlciwgdGhlIHJlc3VsdCBtYXkgYmUgYW4gaW5maW5pdGUKICAgKiBkb3VibGUuCiAgICovCiAgZG91YmxlIGNlaWxUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBkb3VibGUgaW50ZWdlciB2YWx1ZSBvYnRhaW5lZCBieSBkaXNjYXJkaW5nIGFueSBmcmFjdGlvbmFsCiAgICogZGlnaXRzIGZyb20gdGhlIGRvdWJsZSB2YWx1ZSBvZiBgdGhpc2AuCiAgICoKICAgKiBJZiB0aGlzIGlzIGFscmVhZHkgYW4gaW50ZWdlciB2YWx1ZWQgZG91YmxlLCBpbmNsdWRpbmcgYC0wLjBgLCBvciBpdCBpcyBhCiAgICogbm9uLWZpbml0ZSBkb3VibGUgdmFsdWUsIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqCiAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHJvdW5kaW5nLCBgLTAuMGAgaXMgY29uc2lkZXJlZCB0byBiZSBiZWxvdyBgMC4wYC4KICAgKiBBIG51bWJlciBgZGAgaW4gdGhlIHJhbmdlIGAtMS4wIDwgZCA8IDAuMGAgd2lsbCByZXR1cm4gYC0wLjBgLCBhbmQKICAgKiBpbiB0aGUgcmFuZ2UgYDAuMCA8IGQgPCAxLjBgIGl0IHdpbGwgcmV0dXJuIDAuMC4KICAgKgogICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgZG91YmxlLgogICAqIElmIHRoaXMgaXMgYSBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VyLCB0aGUgcmVzdWx0IG1heSBiZSBhbiBpbmZpbml0ZQogICAqIGRvdWJsZS4KICAgKi8KICBkb3VibGUgdHJ1bmNhdGVUb0RvdWJsZSgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoaXMgW251bV0gY2xhbXBlZCB0byBiZSBpbiB0aGUgcmFuZ2UgW2xvd2VyTGltaXRdLVt1cHBlckxpbWl0XS4KICAgKgogICAqIFRoZSBjb21wYXJpc29uIGlzIGRvbmUgdXNpbmcgW2NvbXBhcmVUb10gYW5kIHRoZXJlZm9yZSB0YWtlcyBgLTAuMGAgaW50bwogICAqIGFjY291bnQuIFRoaXMgYWxzbyBpbXBsaWVzIHRoYXQgW2RvdWJsZS5uYW5dIGlzIHRyZWF0ZWQgYXMgdGhlIG1heGltYWwKICAgKiBkb3VibGUgdmFsdWUuCiAgICoKICAgKiBUaGUgYXJndW1lbnRzIFtsb3dlckxpbWl0XSBhbmQgW3VwcGVyTGltaXRdIG11c3QgZm9ybSBhIHZhbGlkIHJhbmdlIHdoZXJlCiAgICogYGxvd2VyTGltaXQuY29tcGFyZVRvKHVwcGVyTGltaXQpIDw9IDBgLgogICAqLwogIG51bSBjbGFtcChudW0gbG93ZXJMaW1pdCwgbnVtIHVwcGVyTGltaXQpOwoKICAvKiogVHJ1bmNhdGVzIHRoaXMgW251bV0gdG8gYW4gaW50ZWdlciBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIFtpbnRdLiAqLwogIGludCB0b0ludCgpOwoKICAvKioKICAgKiBSZXR1cm4gdGhpcyBbbnVtXSBhcyBhIFtkb3VibGVdLgogICAqCiAgICogSWYgdGhlIG51bWJlciBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIFtkb3VibGVdLCBhbgogICAqIGFwcHJveGltYXRpb24gaXMgcmV0dXJuZWQuIEZvciBudW1lcmljYWxseSBsYXJnZSBpbnRlZ2VycywgdGhlCiAgICogYXBwcm94aW1hdGlvbiBtYXkgYmUgaW5maW5pdGUuCiAgICovCiAgZG91YmxlIHRvRG91YmxlKCk7CgogIC8qKgogICAqIFJldHVybnMgYSBkZWNpbWFsLXBvaW50IHN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiBgdGhpc2AuCiAgICoKICAgKiBDb252ZXJ0cyBgdGhpc2AgdG8gYSBbZG91YmxlXSBiZWZvcmUgY29tcHV0aW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICoKICAgKiBJZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYHRoaXNgIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gYDEwXjIxYCB0aGVuIHRoaXMKICAgKiBtZXRob2RzIHJldHVybnMgYW4gZXhwb25lbnRpYWwgcmVwcmVzZW50YXRpb24gY29tcHV0ZWQgYnkKICAgKiBgdGhpcy50b1N0cmluZ0FzRXhwb25lbnRpYWwoKWAuIE90aGVyd2lzZSB0aGUgcmVzdWx0CiAgICogaXMgdGhlIGNsb3Nlc3Qgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdpdGggZXhhY3RseSBbZnJhY3Rpb25EaWdpdHNdIGRpZ2l0cwogICAqIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiBJZiBbZnJhY3Rpb25EaWdpdHNdIGVxdWFscyAwIHRoZW4gdGhlIGRlY2ltYWwKICAgKiBwb2ludCBpcyBvbWl0dGVkLgogICAqCiAgICogVGhlIHBhcmFtZXRlciBbZnJhY3Rpb25EaWdpdHNdIG11c3QgYmUgYW4gaW50ZWdlciBzYXRpc2Z5aW5nOgogICAqIGAwIDw9IGZyYWN0aW9uRGlnaXRzIDw9IDIwYC4KICAgKgogICAqIEV4YW1wbGVzOgogICAqCiAgICogICAgIDEudG9TdHJpbmdBc0ZpeGVkKDMpOyAgLy8gMS4wMDAKICAgKiAgICAgKDQzMjEuMTIzNDU2NzgpLnRvU3RyaW5nQXNGaXhlZCgzKTsgIC8vIDQzMjEuMTIzCiAgICogICAgICg0MzIxLjEyMzQ1Njc4KS50b1N0cmluZ0FzRml4ZWQoNSk7ICAvLyA0MzIxLjEyMzQ2CiAgICogICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMS50b1N0cmluZ0FzRml4ZWQoMyk7ICAvLyAxMjM0NTY3ODkwMTIzNDU2ODM5NjguMDAwCiAgICogICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAudG9TdHJpbmdBc0ZpeGVkKDMpOyAvLyAxZSsyMQogICAqICAgICA1LjI1LnRvU3RyaW5nQXNGaXhlZCgwKTsgLy8gNQogICAqLwogIFN0cmluZyB0b1N0cmluZ0FzRml4ZWQoaW50IGZyYWN0aW9uRGlnaXRzKTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBleHBvbmVudGlhbCBzdHJpbmctcmVwcmVzZW50YXRpb24gb2YgYHRoaXNgLgogICAqCiAgICogQ29udmVydHMgYHRoaXNgIHRvIGEgW2RvdWJsZV0gYmVmb3JlIGNvbXB1dGluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogSWYgW2ZyYWN0aW9uRGlnaXRzXSBpcyBnaXZlbiB0aGVuIGl0IG11c3QgYmUgYW4gaW50ZWdlciBzYXRpc2Z5aW5nOgogICAqIGAwIDw9IGZyYWN0aW9uRGlnaXRzIDw9IDIwYC4gSW4gdGhpcyBjYXNlIHRoZSBzdHJpbmcgY29udGFpbnMgZXhhY3RseQogICAqIFtmcmFjdGlvbkRpZ2l0c10gYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuIE90aGVyd2lzZSwgd2l0aG91dCB0aGUgcGFyYW1ldGVyLAogICAqIHRoZSByZXR1cm5lZCBzdHJpbmcgdXNlcyB0aGUgc2hvcnRlc3QgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IGFjY3VyYXRlbHkKICAgKiByZXByZXNlbnQgW3RoaXNdLgogICAqCiAgICogSWYgW2ZyYWN0aW9uRGlnaXRzXSBlcXVhbHMgMCB0aGVuIHRoZSBkZWNpbWFsIHBvaW50IGlzIG9taXR0ZWQuCiAgICogRXhhbXBsZXM6CiAgICoKICAgKiAgICAgMS50b1N0cmluZ0FzRXhwb25lbnRpYWwoKTsgICAgICAgLy8gMWUrMAogICAqICAgICAxLnRvU3RyaW5nQXNFeHBvbmVudGlhbCgzKTsgICAgICAvLyAxLjAwMGUrMAogICAqICAgICAxMjM0NTYudG9TdHJpbmdBc0V4cG9uZW50aWFsKCk7ICAvLyAxLjIzNDU2ZSs1CiAgICogICAgIDEyMzQ1Ni50b1N0cmluZ0FzRXhwb25lbnRpYWwoMyk7IC8vIDEuMjM1ZSs1CiAgICogICAgIDEyMy50b1N0cmluZ0FzRXhwb25lbnRpYWwoMCk7ICAgIC8vIDFlKzIKICAgKi8KICBTdHJpbmcgdG9TdHJpbmdBc0V4cG9uZW50aWFsKFtpbnQgZnJhY3Rpb25EaWdpdHNdKTsKCiAgLyoqCiAgICogQ29udmVydHMgYHRoaXNgIHRvIGEgZG91YmxlIGFuZCByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdpdGgKICAgKiBleGFjdGx5IFtwcmVjaXNpb25dIHNpZ25pZmljYW50IGRpZ2l0cy4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXIgW3ByZWNpc2lvbl0gbXVzdCBiZSBhbiBpbnRlZ2VyIHNhdGlzZnlpbmc6CiAgICogYDEgPD0gcHJlY2lzaW9uIDw9IDIxYC4KICAgKgogICAqIEV4YW1wbGVzOgogICAqCiAgICogICAgIDEudG9TdHJpbmdBc1ByZWNpc2lvbigyKTsgICAgICAgLy8gMS4wCiAgICogICAgIDFlMTUudG9TdHJpbmdBc1ByZWNpc2lvbigzKTsgICAgLy8gMS4wMGUrMTUKICAgKiAgICAgMTIzNDU2Ny50b1N0cmluZ0FzUHJlY2lzaW9uKDMpOyAvLyAxLjIzZSs2CiAgICogICAgIDEyMzQ1NjcudG9TdHJpbmdBc1ByZWNpc2lvbig5KTsgLy8gMTIzNDU2Ny4wMAogICAqICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MC50b1N0cmluZ0FzUHJlY2lzaW9uKDIwKTsgLy8gMTIzNDU2Nzg5MDEyMzQ1NjcxNjgKICAgKiAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAudG9TdHJpbmdBc1ByZWNpc2lvbigxNCk7IC8vIDEuMjM0NTY3ODkwMTIzNWUrMTkKICAgKiAgICAgMC4wMDAwMDAxMjM0NS50b1N0cmluZ0FzUHJlY2lzaW9uKDE1KTsgLy8gMS4yMzQ1MDAwMDAwMDAwMGUtNwogICAqICAgICAwLjAwMDAwMTIzNDUudG9TdHJpbmdBc1ByZWNpc2lvbigxNSk7ICAvLyAwLjAwMDAwMTIzNDUwMDAwMDAwMDAwCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nQXNQcmVjaXNpb24oaW50IHByZWNpc2lvbik7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNob3J0ZXN0IHN0cmluZyB0aGF0IGNvcnJlY3RseSByZXByZXNlbnQgdGhlIGlucHV0IG51bWJlci4KICAgKgogICAqIEFsbCBbZG91YmxlXXMgaW4gdGhlIHJhbmdlIGAxMF4tNmAgKGluY2x1c2l2ZSkgdG8gYDEwXjIxYCAoZXhjbHVzaXZlKQogICAqIGFyZSBjb252ZXJ0ZWQgdG8gdGhlaXIgZGVjaW1hbCByZXByZXNlbnRhdGlvbiB3aXRoIGF0IGxlYXN0IG9uZSBkaWdpdAogICAqIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiBGb3IgYWxsIG90aGVyIGRvdWJsZXMsCiAgICogZXhjZXB0IGZvciBzcGVjaWFsIHZhbHVlcyBsaWtlIGBOYU5gIG9yIGBJbmZpbml0eWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4KICAgKiBleHBvbmVudGlhbCByZXByZXNlbnRhdGlvbiAoc2VlIFt0b1N0cmluZ0FzRXhwb25lbnRpYWxdKS4KICAgKgogICAqIFJldHVybnMgYCJOYU4iYCBmb3IgW2RvdWJsZS5uYW5dLCBgIkluZmluaXR5ImAgZm9yIFtkb3VibGUuaW5maW5pdHldLCBhbmQKICAgKiBgIi1JbmZpbml0eSJgIGZvciBbZG91YmxlLm5lZ2F0aXZlSW5maW5pdHldLgogICAqCiAgICogQW4gW2ludF0gaXMgY29udmVydGVkIHRvIGEgZGVjaW1hbCByZXByZXNlbnRhdGlvbiB3aXRoIG5vIGRlY2ltYWwgcG9pbnQuCiAgICoKICAgKiBFeGFtcGxlczoKICAgKgogICAqICAgICAoMC4wMDAwMDEpLnRvU3RyaW5nKCk7ICAvLyAiMC4wMDAwMDEiCiAgICogICAgICgwLjAwMDAwMDEpLnRvU3RyaW5nKCk7IC8vICIxZS03IgogICAqICAgICAoMTExMTExMTExMTExMTExMTExMTExLjApLnRvU3RyaW5nKCk7ICAvLyAiMTExMTExMTExMTExMTExMTEwMDAwLjAiCiAgICogICAgICgxMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCkudG9TdHJpbmcoKTsgIC8vICIxMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCIKICAgKiAgICAgKDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCkudG9TdHJpbmcoKTsgLy8gIjFlKzIxIgogICAqICAgICAoMTExMTExMTExMTExMTExMTExMTExMS4wKS50b1N0cmluZygpOyAvLyAiMS4xMTExMTExMTExMTExMTExZSsyMSIKICAgKiAgICAgMS50b1N0cmluZygpOyAvLyAiMSIKICAgKiAgICAgMTExMTExMTExMTExMTExMTExMTExLnRvU3RyaW5nKCk7ICAvLyAiMTExMTExMTExMTExMTExMTEwMDAwIgogICAqICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAudG9TdHJpbmcoKTsgIC8vICIxMDAwMDAwMDAwMDAwMDAwMDAwMDAiCiAgICogICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAudG9TdHJpbmcoKTsgLy8gIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCiAgICogICAgIDExMTExMTExMTExMTExMTExMTExMTEudG9TdHJpbmcoKTsgLy8gIjExMTExMTExMTExMTExMTExMTExMTEiCiAgICogICAgIDEuMjM0ZTUudG9TdHJpbmcoKTsgICAvLyAxMjM0MDAKICAgKiAgICAgMTIzNC41ZTYudG9TdHJpbmcoKTsgIC8vIDEyMzQ1MDAwMDAKICAgKiAgICAgMTIuMzQ1ZTY3LnRvU3RyaW5nKCk7IC8vIDEuMjM0NWUrNjgKICAgKgogICAqIE5vdGU6IHRoZSBjb252ZXJzaW9uIG1heSByb3VuZCB0aGUgb3V0cHV0IGlmIHRoZSByZXR1cm5lZCBzdHJpbmcKICAgKiBpcyBhY2N1cmF0ZSBlbm91Z2ggdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGlucHV0LW51bWJlci4KICAgKiBGb3IgZXhhbXBsZSB0aGUgbW9zdCBwcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBbZG91YmxlXSBgOWU1OWAgZXF1YWxzCiAgICogYCI4OTk5OTk5OTk5OTk5OTk5MTg3NjcyMjk0NDk3MTc2MTk5NTM4MTAxMzEyNzM2NzQ2OTA2NTYyMDY4NDgiYCwgYnV0CiAgICogdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2hvcnRlciAoYnV0IHN0aWxsIHVuaXF1ZWx5IGlkZW50aWZ5aW5nKSBgIjllNTkiYC4KICAgKgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwoKICAvKioKICAgKiBQYXJzZXMgYSBzdHJpbmcgY29udGFpbmluZyBhIG51bWJlciBsaXRlcmFsIGludG8gYSBudW1iZXIuCiAgICoKICAgKiBUaGUgbWV0aG9kIGZpcnN0IHRyaWVzIHRvIHJlYWQgdGhlIFtpbnB1dF0gYXMgaW50ZWdlciAoc2ltaWxhciB0bwogICAqIFtpbnQucGFyc2VdIHdpdGhvdXQgYSByYWRpeCkuCiAgICogSWYgdGhhdCBmYWlscywgaXQgdHJpZXMgdG8gcGFyc2UgdGhlIFtpbnB1dF0gYXMgYSBkb3VibGUgKHNpbWlsYXIgdG8KICAgKiBbZG91YmxlLnBhcnNlXSkuCiAgICogSWYgdGhhdCBmYWlscywgdG9vLCBpdCBpbnZva2VzIFtvbkVycm9yXSB3aXRoIFtpbnB1dF0sIGFuZCB0aGUgcmVzdWx0CiAgICogb2YgdGhhdCBpbnZvY2F0aW9uIGJlY29tZXMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGBwYXJzZWAuCiAgICoKICAgKiBJZiBubyBbb25FcnJvcl0gaXMgc3VwcGxpZWQsIGl0IGRlZmF1bHRzIHRvIGEgZnVuY3Rpb24gdGhhdCB0aHJvd3MgYQogICAqIFtGb3JtYXRFeGNlcHRpb25dLgogICAqCiAgICogRm9yIGFueSBudW1iZXIgYG5gLCB0aGlzIGZ1bmN0aW9uIHNhdGlzZmllcwogICAqIGBpZGVudGljYWwobiwgbnVtLnBhcnNlKG4udG9TdHJpbmcoKSkpYCAoZXhjZXB0IHdoZW4gYG5gIGlzIGEgTmFOIGBkb3VibGVgCiAgICogd2l0aCBhIHBheWxvYWQpLgogICAqCiAgICogVGhlIFtvbkVycm9yXSBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLgogICAqIEluc3RlYWQgb2YgYG51bS5wYXJzZShzdHJpbmcsIChzdHJpbmcpIHsgLi4uIH0pYCwKICAgKiB5b3Ugc2hvdWxkIHVzZSBgbnVtLnRyeVBhcnNlKHN0cmluZykgPz8gKC4uLilgLgogICAqLwogIHN0YXRpYyBudW0gcGFyc2UoU3RyaW5nIGlucHV0LCBbQGRlcHJlY2F0ZWQgbnVtIG9uRXJyb3IoU3RyaW5nIGlucHV0KV0pIHsKICAgIG51bSByZXN1bHQgPSB0cnlQYXJzZShpbnB1dCk7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CiAgICBpZiAob25FcnJvciA9PSBudWxsKSB0aHJvdyBGb3JtYXRFeGNlcHRpb24oaW5wdXQpOwogICAgcmV0dXJuIG9uRXJyb3IoaW5wdXQpOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBudW1iZXIgbGl0ZXJhbCBpbnRvIGEgbnVtYmVyLgogICAqCiAgICogTGlrZSBbcGFyc2VdIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgbnVsbGAgZm9yIGludmFsaWQgaW5wdXRzCiAgICogaW5zdGVhZCBvZiB0aHJvd2luZy4KICAgKi8KICBzdGF0aWMgbnVtIHRyeVBhcnNlKFN0cmluZyBpbnB1dCkgewogICAgU3RyaW5nIHNvdXJjZSA9IGlucHV0LnRyaW0oKTsKICAgIC8vIFRPRE8obHJuKTogT3B0aW1pemUgdG8gZGV0ZWN0IGZvcm1hdCBhbmQgcmVzdWx0IHR5cGUgaW4gb25lIGNoZWNrLgogICAgcmV0dXJuIGludC50cnlQYXJzZShzb3VyY2UpID8/IGRvdWJsZS50cnlQYXJzZShzb3VyY2UpOwogIH0KCiAgLyoqIEhlbHBlciBmdW5jdGlvbnMgZm9yIFtwYXJzZV0uICovCiAgc3RhdGljIGludCBfcmV0dXJuSW50TnVsbChTdHJpbmcgXykgPT4gbnVsbDsKICBzdGF0aWMgZG91YmxlIF9yZXR1cm5Eb3VibGVOdWxsKFN0cmluZyBfKSA9PiBudWxsOwp9CoHvAE5OPAETAQQoA0gqBDAGPgVIIgVHLUsqBUtKOQVQBS4FSEhJSg4FSTAFTi0GIgEGMAVKTjkFPwYUAQYfBVBFBUpPRwwFSk9NFwVHMAVQUBhQKEAFDwklJCQFQywtNzwFShIkMzc3OAkGHAEcHQEfHQEiHQEGIAVQSC4FTEwyBTwFQwYdARwgAQYjBVA9BUcXBh4BGhQBBkwFMSxRBhwBKB4BMR8BKx4BNB8BUBIBBjcFRwYXAQZODAYXAQY1BUEYBhUBMw0BBkMkBTgyLgU4BTcnARsFHwVJBhABBiwFPTcFUAYPAQY6BVAGDwEGNwVQBg4BBj8ZBVAGEgEGOQU9RwVPQAVKT0UbBSRLDQYaAQZHBU9ABUpCBSRLDQYaAQZEBU9ABUpEBSRLDQYZAQZMLQVPQAVKSDYFJEsNBh0BBk4FTkwTBU8uBi0BUA8BBiYFOkQkBhUBBj4FTwVOPzpPTBcFQyIFDwUpOjxRPScGLgEGPQVPBUlLUUwXBUUPBTI2ODYyBjYBBkotBT4dBQ8FMDU0N09OR0oGLQEGTAVLSzVQPwVPMgVOBQ8FLytNTTtMHkdHSEgpLS0FRj9PS1AFBhUBBkAFRyNKFks/BUoYBTFQFgVANzUGTCInNxsEAQZABU4aBiYiSjwEAScvNQIBEmRhcnQ6Y29yZS9udW0uZGFydC9vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL2NvcmVfcGF0Y2guZGFydJM6Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vLyBOb3RlOiB0aGUgVk0gY29uY2F0ZW5hdGVzIGFsbCBwYXRjaCBmaWxlcyBpbnRvIGEgc2luZ2xlIHBhdGNoIGZpbGUuIFRoaXMKLy8vIGZpbGUgaXMgdGhlIGZpcnN0IHBhdGNoIGluICJkYXJ0OmNvcmUiIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW1wb3J0cwovLy8gdXNlZCBieSBwYXRjaGVzIG9mIHRoYXQgbGlicmFyeS4gV2UgcGxhbiB0byBjaGFuZ2UgdGhpcyB3aGVuIHdlIGhhdmUgYQovLy8gc2hhcmVkIGZyb250IGVuZCBhbmQgc2ltcGx5IHVzZSBwYXJ0cy4KCmltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGFzIGludGVybmFsIHNob3cgU3ltYm9sOwoKaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIKICAgIHNob3cKICAgICAgICBDbGFzc0lELAogICAgICAgIENvZGVVbml0cywKICAgICAgICBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSwKICAgICAgICBGaXhlZExlbmd0aExpc3RCYXNlLAogICAgICAgIEl0ZXJhYmxlRWxlbWVudEVycm9yLAogICAgICAgIExpc3RJdGVyYXRvciwKICAgICAgICBMaXN0cywKICAgICAgICBQT1dFUlNfT0ZfVEVOLAogICAgICAgIFN1Ykxpc3RJdGVyYWJsZSwKICAgICAgICBVbm1vZGlmaWFibGVMaXN0QmFzZSwKICAgICAgICBpczY0Qml0LAogICAgICAgIG1ha2VGaXhlZExpc3RVbm1vZGlmaWFibGUsCiAgICAgICAgbWFrZUxpc3RGaXhlZExlbmd0aCwKICAgICAgICBwYXRjaCwKICAgICAgICB1bnNhZmVDYXN0OwoKaW1wb3J0ICJkYXJ0OmFzeW5jIiBzaG93IENvbXBsZXRlciwgRnV0dXJlLCBUaW1lcjsKCmltcG9ydCAiZGFydDpjb2xsZWN0aW9uIgogICAgc2hvdwogICAgICAgIEhhc2hNYXAsCiAgICAgICAgSXRlcmFibGVCYXNlLAogICAgICAgIExpbmtlZEhhc2hNYXAsCiAgICAgICAgTGlua2VkTGlzdCwKICAgICAgICBMaW5rZWRMaXN0RW50cnksCiAgICAgICAgTGlzdEJhc2UsCiAgICAgICAgTWFwQmFzZSwKICAgICAgICBNYXBzLAogICAgICAgIFVubW9kaWZpYWJsZU1hcEJhc2UsCiAgICAgICAgVW5tb2RpZmlhYmxlTWFwVmlldzsKCmltcG9ydCAiZGFydDpjb252ZXJ0IiBzaG93IGFzY2lpLCBFbmNvZGluZywganNvbiwgbGF0aW4xLCB1dGY4OwoKaW1wb3J0ICJkYXJ0Omlzb2xhdGUiIHNob3cgSXNvbGF0ZTsKCmltcG9ydCAiZGFydDptYXRoIiBzaG93IFJhbmRvbTsKCmltcG9ydCAiZGFydDp0eXBlZF9kYXRhIgogICAgc2hvdyBFbmRpYW4sIFVpbnQ4TGlzdCwgSW50NjRMaXN0LCBVaW50MTZMaXN0LCBVaW50MzJMaXN0OwoKLy8vIFRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBwYXJ0cyBvZiB0aGlzIHBhdGNoIGxpYnJhcnk6Ci8vIHBhcnQgImFycmF5LmRhcnQiOwovLyBwYXJ0ICJhcnJheV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiYmlnaW50X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJib29sX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJkYXRlX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJkb3VibGUuZGFydCI7Ci8vIHBhcnQgImRvdWJsZV9wYXRjaC5kYXJ0IjsKLy8gcGFydCAiZXJyb3JzX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJleHBhbmRvX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJmdW5jdGlvbi5kYXJ0IjsKLy8gcGFydCAiZnVuY3Rpb25fcGF0Y2guZGFydCI7Ci8vIHBhcnQgImdyb3dhYmxlX2FycmF5LmRhcnQiOwovLyBwYXJ0ICJpZGVudGljYWxfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImltbXV0YWJsZV9tYXAuZGFydCI7Ci8vIHBhcnQgImludGVnZXJzLmRhcnQiOwovLyBwYXJ0ICJpbnRlZ2Vyc19wYXRjaC5kYXJ0IjsKLy8gcGFydCAiaW52b2NhdGlvbl9taXJyb3JfcGF0Y2guZGFydCI7Ci8vIHBhcnQgImxpYl9wcmVmaXguZGFydCI7Ci8vIHBhcnQgIm1hcF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAibnVsbF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAib2JqZWN0X3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJyZWdleHBfcGF0Y2guZGFydCI7Ci8vIHBhcnQgInN0YWNrdHJhY2UuZGFydCI7Ci8vIHBhcnQgInN0b3B3YXRjaF9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic3RyaW5nX2J1ZmZlcl9wYXRjaC5kYXJ0IjsKLy8gcGFydCAic3RyaW5nX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ0eXBlX3BhdGNoLmRhcnQiOwovLyBwYXJ0ICJ1cmlfcGF0Y2guZGFydCI7Ci8vIHBhcnQgIndlYWtfcHJvcGVydHkuZGFydCI7CgpAcGF0Y2gKY2xhc3MgbnVtIHsKICBudW0gX2FkZEZyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgbnVtIF9zdWJGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIG51bSBfbXVsRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBpbnQgX3RydW5jRGl2RnJvbUludGVnZXIoaW50IG90aGVyKTsKICBudW0gX21vZHVsb0Zyb21JbnRlZ2VyKGludCBvdGhlcik7CiAgbnVtIF9yZW1haW5kZXJGcm9tSW50ZWdlcihpbnQgb3RoZXIpOwogIGJvb2wgX2dyZWF0ZXJUaGFuRnJvbUludGVnZXIoaW50IG90aGVyKTsKICBib29sIF9lcXVhbFRvSW50ZWdlcihpbnQgb3RoZXIpOwp9CgovLyBUaGUgbWVtYmVycyBvZiB0aGlzIGNsYXNzIGFyZSBjbG9uZWQgYW5kIGFkZGVkIHRvIGVhY2ggY2xhc3MgdGhhdAovLyByZXByZXNlbnRzIGFuIGVudW0gdHlwZS4KY2xhc3MgX0VudW1IZWxwZXIgewogIFN0cmluZyBfbmFtZTsKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfbmFtZTsKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9uYW1lLmhhc2hDb2RlOwp9CgovLyBfU3luY0l0ZXJhYmxlIGFuZCBfc3luY0l0ZXJhdG9yIGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlciB0bwovLyBpbXBsZW1lbnQgc3luYyogZ2VuZXJhdG9yIGZ1bmN0aW9ucy4gQSBzeW5jKiBnZW5lcmF0b3IgYWxsb2NhdGVzCi8vIGFuZCByZXR1cm5zIGEgbmV3IF9TeW5jSXRlcmFibGUgb2JqZWN0LgoKdHlwZWRlZiBib29sIF9TeW5jR2VuZXJhdG9yQ2FsbGJhY2s8VD4oX1N5bmNJdGVyYXRvcjxUPiBpdGVyYXRvcik7CgpjbGFzcyBfU3luY0l0ZXJhYmxlPFQ+IGV4dGVuZHMgSXRlcmFibGVCYXNlPFQ+IHsKICAvLyBfbW92ZU5leHRGbiBpcyB0aGUgY2xvc3VyaXplZCBib2R5IG9mIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24uCiAgZmluYWwgX1N5bmNHZW5lcmF0b3JDYWxsYmFjazxUPiBfbW92ZU5leHRGbjsKCiAgY29uc3QgX1N5bmNJdGVyYWJsZSh0aGlzLl9tb3ZlTmV4dEZuKTsKCiAgSXRlcmF0b3I8VD4gZ2V0IGl0ZXJhdG9yIHsKICAgIC8vIE5vdGU6IF9DbG9zdXJlLl9jbG9uZSByZXR1cm5zIF9DbG9zdXJlIHdoaWNoIGlzIG5vdCByZWxhdGVkIHRvCiAgICAvLyBfU3luY0dlbmVyYXRvckNhbGxiYWNrLCB3aGljaCBtZWFucyB3ZSBuZWVkIGV4cGxpY2l0IGNhc3QuCiAgICByZXR1cm4gbmV3IF9TeW5jSXRlcmF0b3I8VD4odW5zYWZlQ2FzdDxfU3luY0dlbmVyYXRvckNhbGxiYWNrPFQ+PigKICAgICAgICB1bnNhZmVDYXN0PF9DbG9zdXJlPihfbW92ZU5leHRGbikuX2Nsb25lKCkpKTsKICB9Cn0KCmNsYXNzIF9TeW5jSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CiAgX1N5bmNHZW5lcmF0b3JDYWxsYmFjazxUPiBfbW92ZU5leHRGbjsKICBJdGVyYXRvcjxUPiBfeWllbGRFYWNoSXRlcmF0b3I7CgogIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIHNldCBieSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIHlpZWxkIGFuZCB5aWVsZCoKICAvLyBzdGF0ZW1lbnQuCiAgVCBfY3VycmVudDsKICBJdGVyYWJsZTxUPiBfeWllbGRFYWNoSXRlcmFibGU7CgogIFQgZ2V0IGN1cnJlbnQgPT4KICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yICE9IG51bGwgPyBfeWllbGRFYWNoSXRlcmF0b3IuY3VycmVudCA6IF9jdXJyZW50OwoKICBfU3luY0l0ZXJhdG9yKHRoaXMuX21vdmVOZXh0Rm4pOwoKICBib29sIG1vdmVOZXh0KCkgewogICAgaWYgKF9tb3ZlTmV4dEZuID09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKF95aWVsZEVhY2hJdGVyYXRvciAhPSBudWxsKSB7CiAgICAgICAgaWYgKF95aWVsZEVhY2hJdGVyYXRvci5tb3ZlTmV4dCgpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yID0gbnVsbDsKICAgICAgfQogICAgICAvLyBfbW92ZU5leHRGbigpIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZXMgb2YgX3lpZWxkRWFjaEl0ZXJhYmxlCiAgICAgIC8vICBhbmQgX2N1cnJlbnQuCiAgICAgIGlmICghX21vdmVOZXh0Rm4odGhpcykpIHsKICAgICAgICBfbW92ZU5leHRGbiA9IG51bGw7CiAgICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoX3lpZWxkRWFjaEl0ZXJhYmxlICE9IG51bGwpIHsKICAgICAgICAvLyBTcGVjIG1hbmRhdGVzOiBpdCBpcyBhIGR5bmFtaWMgZXJyb3IgaWYgdGhlIGNsYXNzIG9mIFt0aGUgb2JqZWN0CiAgICAgICAgLy8gcmV0dXJuZWQgYnkgeWllbGQqXSBkb2VzIG5vdCBpbXBsZW1lbnQgSXRlcmFibGUuCiAgICAgICAgX3lpZWxkRWFjaEl0ZXJhdG9yID0gX3lpZWxkRWFjaEl0ZXJhYmxlLml0ZXJhdG9yOwogICAgICAgIF95aWVsZEVhY2hJdGVyYWJsZSA9IG51bGw7CiAgICAgICAgX2N1cnJlbnQgPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KfQoKQHBhdGNoCmNsYXNzIFN0YWNrVHJhY2UgewogIEBwYXRjaAogIHN0YXRpYyBTdGFja1RyYWNlIGdldCBjdXJyZW50IG5hdGl2ZSAiU3RhY2tUcmFjZV9jdXJyZW50IjsKfQqAsABOTjwBTUpLKwExARgJERMhHR4WDxcZHhEjHQ8UATMBGQkRFhcUGRIRDh0dAUABJAEgARk/AToWHB0bGxcdHR4ZHx8gHhkfKBsaGx0dGyAkHRsaHgEHDCIiIiclKCsjAgFFHBQQHiYCAT9EKwFDATFDLwEpAR1GQkc2BAIBMCkiAUkQDiIBE0oBIwEUHxQGEygtFwojCEQYIBwZFggoTDw6IxkSCBMGBAIBBxMJPQIBH2RhcnQ6Y29yZS1wYXRjaC9jb3JlX3BhdGNoLmRhcnQsb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvb2JqZWN0LmRhcnSQfy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIERhcnQgb2JqZWN0cy4KICoKICogQmVjYXVzZSBPYmplY3QgaXMgdGhlIHJvb3Qgb2YgdGhlIERhcnQgY2xhc3MgaGllcmFyY2h5LAogKiBldmVyeSBvdGhlciBEYXJ0IGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgT2JqZWN0LgogKgogKiBXaGVuIHlvdSBkZWZpbmUgYSBjbGFzcywgeW91IHNob3VsZCBvdmVycmlkZSBbdG9TdHJpbmddCiAqIHRvIHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuCiAqIFlvdSBtaWdodCBhbHNvIG5lZWQgdG8gZGVmaW5lIFtoYXNoQ29kZV0gYW5kIFtvcGVyYXRvciA9PV0sIGFzIGRlc2NyaWJlZCBpbiB0aGUKICogW0ltcGxlbWVudGluZyBtYXAKICoga2V5c10oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2RvY3MvZGFydC11cC1hbmQtcnVubmluZy9jaDAzLmh0bWwjaW1wbGVtZW50aW5nLW1hcC1rZXlzKQogKiBzZWN0aW9uIG9mIHRoZSBbbGlicmFyeQogKiB0b3VyXShodHRwOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY29udGVudHMvY2gwMy5odG1sKS4KICovCkBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKY2xhc3MgT2JqZWN0IHsKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFtPYmplY3RdIGluc3RhbmNlLgogICAqCiAgICogW09iamVjdF0gaW5zdGFuY2VzIGhhdmUgbm8gbWVhbmluZ2Z1bCBzdGF0ZSwgYW5kIGFyZSBvbmx5IHVzZWZ1bAogICAqIHRocm91Z2ggdGhlaXIgaWRlbnRpdHkuIEFuIFtPYmplY3RdIGluc3RhbmNlIGlzIGVxdWFsIHRvIGl0c2VsZgogICAqIG9ubHkuCiAgICovCiAgY29uc3QgT2JqZWN0KCk7CgogIC8qKgogICAqIFRoZSBlcXVhbGl0eSBvcGVyYXRvci4KICAgKgogICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhbGwgW09iamVjdF1zIGlzIHRvIHJldHVybiB0cnVlIGlmIGFuZAogICAqIG9ubHkgaWYgYHRoaXNgIGFuZCBbb3RoZXJdIGFyZSB0aGUgc2FtZSBvYmplY3QuCiAgICoKICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGVxdWFsaXR5IHJlbGF0aW9uIG9uCiAgICogYSBjbGFzcy4gVGhlIG92ZXJyaWRpbmcgbWV0aG9kIG11c3Qgc3RpbGwgYmUgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uCiAgICogVGhhdCBpcywgaXQgbXVzdCBiZToKICAgKgogICAqICAqIFRvdGFsOiBJdCBtdXN0IHJldHVybiBhIGJvb2xlYW4gZm9yIGFsbCBhcmd1bWVudHMuIEl0IHNob3VsZCBuZXZlciB0aHJvdwogICAqICAgIG9yIHJldHVybiBgbnVsbGAuCiAgICoKICAgKiAgKiBSZWZsZXhpdmU6IEZvciBhbGwgb2JqZWN0cyBgb2AsIGBvID09IG9gIG11c3QgYmUgdHJ1ZS4KICAgKgogICAqICAqIFN5bW1ldHJpYzogRm9yIGFsbCBvYmplY3RzIGBvMWAgYW5kIGBvMmAsIGBvMSA9PSBvMmAgYW5kIGBvMiA9PSBvMWAgbXVzdAogICAqICAgIGVpdGhlciBib3RoIGJlIHRydWUsIG9yIGJvdGggYmUgZmFsc2UuCiAgICoKICAgKiAgKiBUcmFuc2l0aXZlOiBGb3IgYWxsIG9iamVjdHMgYG8xYCwgYG8yYCwgYW5kIGBvM2AsIGlmIGBvMSA9PSBvMmAgYW5kCiAgICogICAgYG8yID09IG8zYCBhcmUgdHJ1ZSwgdGhlbiBgbzEgPT0gbzNgIG11c3QgYmUgdHJ1ZS4KICAgKgogICAqIFRoZSBtZXRob2Qgc2hvdWxkIGFsc28gYmUgY29uc2lzdGVudCBvdmVyIHRpbWUsCiAgICogc28gd2hldGhlciB0d28gb2JqZWN0cyBhcmUgZXF1YWwgc2hvdWxkIG9ubHkgY2hhbmdlCiAgICogaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBvYmplY3RzIHdhcyBtb2RpZmllZC4KICAgKgogICAqIElmIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBlcXVhbGl0eSBvcGVyYXRvciBpdCBzaG91bGQgb3ZlcnJpZGUKICAgKiB0aGUgW2hhc2hDb2RlXSBtZXRob2QgYXMgd2VsbCB0byBtYWludGFpbiBjb25zaXN0ZW5jeS4KICAgKi8KICBleHRlcm5hbCBib29sIG9wZXJhdG9yID09KG90aGVyKTsKCiAgLyoqCiAgICogVGhlIGhhc2ggY29kZSBmb3IgdGhpcyBvYmplY3QuCiAgICoKICAgKiBBIGhhc2ggY29kZSBpcyBhIHNpbmdsZSBpbnRlZ2VyIHdoaWNoIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSBvYmplY3QKICAgKiB0aGF0IGFmZmVjdHMgW29wZXJhdG9yID09XSBjb21wYXJpc29ucy4KICAgKgogICAqIEFsbCBvYmplY3RzIGhhdmUgaGFzaCBjb2Rlcy4KICAgKiBUaGUgZGVmYXVsdCBoYXNoIGNvZGUgcmVwcmVzZW50cyBvbmx5IHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0LAogICAqIHRoZSBzYW1lIHdheSBhcyB0aGUgZGVmYXVsdCBbb3BlcmF0b3IgPT1dIGltcGxlbWVudGF0aW9uIG9ubHkgY29uc2lkZXJzIG9iamVjdHMKICAgKiBlcXVhbCBpZiB0aGV5IGFyZSBpZGVudGljYWwgKHNlZSBbaWRlbnRpdHlIYXNoQ29kZV0pLgogICAqCiAgICogSWYgW29wZXJhdG9yID09XSBpcyBvdmVycmlkZGVuIHRvIHVzZSB0aGUgb2JqZWN0IHN0YXRlIGluc3RlYWQsCiAgICogdGhlIGhhc2ggY29kZSBtdXN0IGFsc28gYmUgY2hhbmdlZCB0byByZXByZXNlbnQgdGhhdCBzdGF0ZS4KICAgKgogICAqIEhhc2ggY29kZXMgbXVzdCBiZSB0aGUgc2FtZSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyCiAgICogYWNjb3JkaW5nIHRvIFtvcGVyYXRvciA9PV0uCiAgICogVGhlIGhhc2ggY29kZSBvZiBhbiBvYmplY3Qgc2hvdWxkIG9ubHkgY2hhbmdlIGlmIHRoZSBvYmplY3QgY2hhbmdlcwogICAqIGluIGEgd2F5IHRoYXQgYWZmZWN0cyBlcXVhbGl0eS4KICAgKiBUaGVyZSBhcmUgbm8gZnVydGhlciByZXF1aXJlbWVudHMgZm9yIHRoZSBoYXNoIGNvZGVzLgogICAqIFRoZXkgbmVlZCBub3QgYmUgY29uc2lzdGVudCBiZXR3ZWVuIGV4ZWN1dGlvbnMgb2YgdGhlIHNhbWUgcHJvZ3JhbQogICAqIGFuZCB0aGVyZSBhcmUgbm8gZGlzdHJpYnV0aW9uIGd1YXJhbnRlZXMuCiAgICoKICAgKiBPYmplY3RzIHRoYXQgYXJlIG5vdCBlcXVhbCBhcmUgYWxsb3dlZCB0byBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZSwKICAgKiBpdCBpcyBldmVuIHRlY2huaWNhbGx5IGFsbG93ZWQgdGhhdCBhbGwgaW5zdGFuY2VzIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLAogICAqIGJ1dCBpZiBjbGFzaGVzIGhhcHBlbiB0b28gb2Z0ZW4sIGl0IG1heSByZWR1Y2UgdGhlIGVmZmljaWVuY3kgb2YgaGFzaC1iYXNlZAogICAqIGRhdGEgc3RydWN0dXJlcyBsaWtlIFtIYXNoU2V0XSBvciBbSGFzaE1hcF0uCiAgICoKICAgKiBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyBbaGFzaENvZGVdLCBpdCBzaG91bGQgb3ZlcnJpZGUgdGhlCiAgICogW29wZXJhdG9yID09XSBvcGVyYXRvciBhcyB3ZWxsIHRvIG1haW50YWluIGNvbnNpc3RlbmN5LgogICAqLwogIGV4dGVybmFsIGludCBnZXQgaGFzaENvZGU7CgogIC8qKgogICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCiAgICovCiAgZXh0ZXJuYWwgU3RyaW5nIHRvU3RyaW5nKCk7CgogIC8qKgogICAqIEludm9rZWQgd2hlbiBhIG5vbi1leGlzdGVudCBtZXRob2Qgb3IgcHJvcGVydHkgaXMgYWNjZXNzZWQuCiAgICoKICAgKiBDbGFzc2VzIGNhbiBvdmVycmlkZSBbbm9TdWNoTWV0aG9kXSB0byBwcm92aWRlIGN1c3RvbSBiZWhhdmlvci4KICAgKgogICAqIElmIGEgdmFsdWUgaXMgcmV0dXJuZWQsIGl0IGJlY29tZXMgdGhlIHJlc3VsdCBvZiB0aGUgb3JpZ2luYWwgaW52b2NhdGlvbi4KICAgKgogICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHRocm93IGEgW05vU3VjaE1ldGhvZEVycm9yXS4KICAgKi8KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCiAgZXh0ZXJuYWwgZHluYW1pYyBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKTsKCiAgLyoqCiAgICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSBvYmplY3QuCiAgICovCiAgZXh0ZXJuYWwgVHlwZSBnZXQgcnVudGltZVR5cGU7Cn0KdQBOTjwBEwEEKAM7MwM7PFMVXBtPBBoPBiYFRkULBhIBBhwFRTUFRksaBVEaBT8FUS8FTDsFNTkyBUY8BiQBBiQFTi0FIkdVOwVFQQVKIUklO0gvBUhQUTIFQD0GHQEGNQYeAQZBBUUFTwU9Bhw4AQY5BiECARVkYXJ0OmNvcmUvb2JqZWN0LmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9ydW50aW1lL2xpYi9vYmplY3RfcGF0Y2guZGFydIo4Ly8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1NtaSIpCmludCBfZ2V0SGFzaChvYmopIG5hdGl2ZSAiT2JqZWN0X2dldEhhc2giOwp2b2lkIF9zZXRIYXNoKG9iaiwgaGFzaCkgbmF0aXZlICJPYmplY3Rfc2V0SGFzaCI7CgpAcGF0Y2gKQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQpjbGFzcyBPYmplY3QgewogIC8vIFRoZSBWTSBoYXMgaXRzIG93biBpbXBsZW1lbnRhdGlvbiBvZiBlcXVhbHMuCiAgQHBhdGNoCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIGJvb2wgb3BlcmF0b3IgPT0ob3RoZXIpIG5hdGl2ZSAiT2JqZWN0X2VxdWFscyI7CgogIC8vIEhlbHBlcnMgdXNlZCB0byBpbXBsZW1lbnQgaGFzaENvZGUuIElmIGEgaGFzaENvZGUgaXMgdXNlZCwgd2UgcmVtZW1iZXIgaXQKICAvLyBpbiBhIHdlYWsgdGFibGUgaW4gdGhlIFZNICgzMiBiaXQpIG9yIGluIHRoZSBoZWFkZXIgb2YgdGhlIG9iamVjdCAoNjQKICAvLyBiaXQpLiBBIG5ldyBoYXNoQ29kZSB2YWx1ZSBpcyBjYWxjdWxhdGVkIHVzaW5nIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCiAgc3RhdGljIGZpbmFsIF9oYXNoQ29kZVJuZCA9IG5ldyBSYW5kb20oKTsKCiAgc3RhdGljIGludCBfb2JqZWN0SGFzaENvZGUob2JqKSB7CiAgICB2YXIgcmVzdWx0ID0gX2dldEhhc2gob2JqKTsKICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAvLyBXZSB3YW50IHRoZSBoYXNoIHRvIGJlIGEgU21pIHZhbHVlIGdyZWF0ZXIgdGhhbiAwLgogICAgICByZXN1bHQgPSBfaGFzaENvZGVSbmQubmV4dEludCgweDQwMDAwMDAwKTsKICAgICAgZG8gewogICAgICAgIHJlc3VsdCA9IF9oYXNoQ29kZVJuZC5uZXh0SW50KDB4NDAwMDAwMDApOwogICAgICB9IHdoaWxlIChyZXN1bHQgPT0gMCk7CiAgICAgIF9zZXRIYXNoKG9iaiwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBAcGF0Y2gKICBpbnQgZ2V0IGhhc2hDb2RlID0+IF9vYmplY3RIYXNoQ29kZSh0aGlzKTsKICBpbnQgZ2V0IF9pZGVudGl0eUhhc2hDb2RlID0+IF9vYmplY3RIYXNoQ29kZSh0aGlzKTsKCiAgQHBhdGNoCiAgU3RyaW5nIHRvU3RyaW5nKCkgbmF0aXZlICJPYmplY3RfdG9TdHJpbmciOwogIC8vIEEgc3RhdGljYWxseSBkaXNwYXRjaGVkIHZlcnNpb24gb2YgT2JqZWN0LnRvU3RyaW5nLgogIHN0YXRpYyBTdHJpbmcgX3RvU3RyaW5nKG9iaikgbmF0aXZlICJPYmplY3RfdG9TdHJpbmciOwoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBkeW5hbWljIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pIHsKICAgIC8vIFRPRE8ocmVnaXMpOiBSZW1vdmUgdGVtcCBjb25zdHJ1Y3RvciBpZGVudGlmaWVyICd3aXRoSW52b2NhdGlvbicuCiAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXJyb3Iud2l0aEludm9jYXRpb24odGhpcywgaW52b2NhdGlvbik7CiAgfQoKICBAcGF0Y2gKICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsICJkYXJ0OmNvcmUjX1R5cGUiKQogIFR5cGUgZ2V0IHJ1bnRpbWVUeXBlIG5hdGl2ZSAiT2JqZWN0X3J1bnRpbWVUeXBlIjsKCiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgQHByYWdtYSgidm06ZXhhY3QtcmVzdWx0LXR5cGUiLCBib29sKQogIHN0YXRpYyBib29sIF9oYXZlU2FtZVJ1bnRpbWVUeXBlKGEsIGIpIG5hdGl2ZSAiT2JqZWN0X2hhdmVTYW1lUnVudGltZVR5cGUiOwoKICAvLyBDYWxsIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBpbmxpbmluZyBpbnN0YW5jZW9mLCB0aHVzIGNvbGxlY3RpbmcKICAvLyB0eXBlIGZlZWRiYWNrIGFuZCByZWR1Y2luZyBjb2RlIHNpemUgb2YgdW5vcHRpbWl6ZWQgY29kZS4KICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBib29sIF9pbnN0YW5jZU9mKGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGZ1bmN0aW9uVHlwZUFyZ3VtZW50cywgdHlwZSkKICAgICAgbmF0aXZlICJPYmplY3RfaW5zdGFuY2VPZiI7CgogIC8vIEdyb3VwIG9mIGZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIGZhc3Qgc2ltcGxlIGluc3RhbmNlIG9mLgogIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQogIGJvb2wgX3NpbXBsZUluc3RhbmNlT2YodHlwZSkgbmF0aXZlICJPYmplY3Rfc2ltcGxlSW5zdGFuY2VPZiI7CiAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiY2FsbCIpCiAgYm9vbCBfc2ltcGxlSW5zdGFuY2VPZlRydWUodHlwZSkgPT4gdHJ1ZTsKICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKICBib29sIF9zaW1wbGVJbnN0YW5jZU9mRmFsc2UodHlwZSkgPT4gZmFsc2U7Cn0KTABOTjwBHgEyKzIBBxoPMgkoMgFPS08sASQgFzwxCzMdHQYTBAEJLTYBCS45OQEJJDBJQgQBCTU0ASQoTgFIPyRLIgFCJEEkLCQuAgEhZGFydDpjb3JlLXBhdGNoL29iamVjdF9wYXRjaC5kYXJ0LW9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3BhdHRlcm4uZGFydI/QLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGludGVyZmFjZSBmb3IgYmFzaWMgc2VhcmNoZXMgd2l0aGluIHN0cmluZ3MuCiAqLwphYnN0cmFjdCBjbGFzcyBQYXR0ZXJuIHsKICAvLyBOT1RFOiBXaGVuIHVzaW5nICJzdGFydCIgaW5kZXggZnJvbSB0aGUgbGFuZ3VhZ2UgbGlicmFyeSwgY2FsbAogIC8vIHdpdGhvdXQgYW4gYXJndW1lbnQgaWYgc3RhcnQgaXMgemVyby4gVGhpcyBhbGxvd3MgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAvLyB3aXRoIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgb2xkZXIgaW50ZXJmYWNlIHRoYXQgZGlkbid0IGhhdmUgdGhlIHN0YXJ0CiAgLy8gaW5kZXggYXJndW1lbnQuCiAgLyoqCiAgICogTWF0Y2ggdGhpcyBwYXR0ZXJuIGFnYWluc3QgdGhlIHN0cmluZyByZXBlYXRlZGx5LgogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBwcm92aWRlZCwgbWF0Y2hpbmcgd2lsbCBzdGFydCBhdCB0aGF0IGluZGV4LgogICAqCiAgICogVGhlIHJldHVybmVkIGl0ZXJhYmxlIGxhemlseSBjb21wdXRlcyBhbGwgdGhlIG5vbi1vdmVybGFwcGluZyBtYXRjaGVzCiAgICogb2YgdGhlIHBhdHRlcm4gb24gdGhlIHN0cmluZywgb3JkZXJlZCBieSBzdGFydCBpbmRleC4KICAgKiBJZiBhIHVzZXIgb25seSByZXF1ZXN0cyB0aGUgZmlyc3QKICAgKiBtYXRjaCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGNvbXB1dGUgYWxsIHBvc3NpYmxlIG1hdGNoZXMuCiAgICoKICAgKiBUaGUgbWF0Y2hlcyBhcmUgZm91bmQgYnkgcmVwZWF0ZWRseSBmaW5kaW5nIHRoZSBmaXJzdCBtYXRjaAogICAqIG9mIHRoZSBwYXR0ZXJuIG9uIHRoZSBzdHJpbmcsIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMKICAgKiBtYXRjaCwgYW5kIGluaXRpYWxseSBzdGFydGluZyBmcm9tIGluZGV4IHplcm8uCiAgICoKICAgKiBJZiB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcgYXQgc29tZSBwb2ludCwgdGhlIG5leHQKICAgKiBtYXRjaCBpcyBmb3VuZCBieSBzdGFydGluZyBhdCB0aGUgcHJldmlvdXMgbWF0Y2gncyBlbmQgcGx1cyBvbmUuCiAgICovCiAgSXRlcmFibGU8TWF0Y2g+IGFsbE1hdGNoZXMoU3RyaW5nIHN0cmluZywgW2ludCBzdGFydCA9IDBdKTsKCiAgLyoqCiAgICogTWF0Y2ggdGhpcyBwYXR0ZXJuIGFnYWluc3QgdGhlIHN0YXJ0IG9mIGBzdHJpbmdgLgogICAqCiAgICogSWYgW3N0YXJ0XSBpcyBwcm92aWRlZCwgaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBgMGAgLi4KICAgKiBgc3RyaW5nLmxlbmd0aGAuIEluIHRoYXQgY2FzZSwgdGhpcyBwYXR0ZW4gaXMgdGVzdGVkIGFnYWluc3QgdGhlCiAgICogc3RyaW5nIGF0IHRoZSBbc3RhcnRdIHBvc2l0aW9uLiBUaGF0IGlzLCBhIFtNYXRjaF0gaXMgcmV0dXJuZWQgaWYgdGhlCiAgICogcGF0dGVybiBjYW4gbWF0Y2ggYSBwYXJ0IG9mIHRoZSBzdHJpbmcgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiBbc3RhcnRdLgogICAqIFJldHVybnMgYG51bGxgIGlmIHRoZSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2guCiAgICovCiAgTWF0Y2ggbWF0Y2hBc1ByZWZpeChTdHJpbmcgc3RyaW5nLCBbaW50IHN0YXJ0ID0gMF0pOwp9CgovKioKICogQSByZXN1bHQgZnJvbSBzZWFyY2hpbmcgd2l0aGluIGEgc3RyaW5nLgogKgogKiBBIE1hdGNoIG9yIGFuIFtJdGVyYWJsZV0gb2YgTWF0Y2ggb2JqZWN0cyBpcyByZXR1cm5lZCBmcm9tIFtQYXR0ZXJuXQogKiBtYXRjaGluZyBtZXRob2RzLgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZmluZHMgYWxsIG1hdGNoZXMgb2YgYSBbUmVnRXhwXSBpbiBhIFtTdHJpbmddCiAqIGFuZCBpdGVyYXRlcyB0aHJvdWdoIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBvZiBNYXRjaCBvYmplY3RzLgogKgogKiAgICAgUmVnRXhwIGV4cCA9IG5ldyBSZWdFeHAociIoXHcrKSIpOwogKiAgICAgU3RyaW5nIHN0ciA9ICJQYXJzZSBteSBzdHJpbmciOwogKiAgICAgSXRlcmFibGU8TWF0Y2g+IG1hdGNoZXMgPSBleHAuYWxsTWF0Y2hlcyhzdHIpOwogKiAgICAgZm9yIChNYXRjaCBtIGluIG1hdGNoZXMpIHsKICogICAgICAgU3RyaW5nIG1hdGNoID0gbS5ncm91cCgwKTsKICogICAgICAgcHJpbnQobWF0Y2gpOwogKiAgICAgfQogKgogKiBUaGUgb3V0cHV0IG9mIHRoZSBleGFtcGxlIGlzOgogKgogKiAgICAgUGFyc2UKICogICAgIG15CiAqICAgICBzdHJpbmcKICoKICogU29tZSBwYXR0ZXJucywgcmVndWxhciBleHByZXNzaW9ucyBpbiBwYXJ0aWN1bGFyLCBtYXkgcmVjb3JkIHN1YnN0cmluZ3MKICogdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIG1hdGNoaW5nLiBUaGVzZSBhcmUgY2FsbGVkIF9ncm91cHNfIGluIHRoZSBNYXRjaAogKiBvYmplY3QuIFNvbWUgcGF0dGVybnMgbWF5IG5ldmVyIGhhdmUgYW55IGdyb3VwcywgYW5kIHRoZWlyIG1hdGNoZXMgYWx3YXlzCiAqIGhhdmUgemVybyBbZ3JvdXBDb3VudF0uCiAqLwphYnN0cmFjdCBjbGFzcyBNYXRjaCB7CiAgLyoqCiAgICogUmV0dXJucyB0aGUgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSB0aGUgbWF0Y2ggc3RhcnRzLgogICAqLwogIGludCBnZXQgc3RhcnQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGluZGV4IGluIHRoZSBzdHJpbmcgYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZQogICAqIG1hdGNoLgogICAqLwogIGludCBnZXQgZW5kOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gW2dyb3VwXS4KICAgKgogICAqIElmIFtncm91cF0gaXMgMCwgcmV0dXJucyB0aGUgbWF0Y2ggb2YgdGhlIHBhdHRlcm4uCiAgICoKICAgKiBUaGUgcmVzdWx0IG1heSBiZSBgbnVsbGAgaWYgdGhlIHBhdHRlcm4gZGlkbid0IGFzc2lnbiBhIHZhbHVlIHRvIGl0CiAgICogYXMgcGFydCBvZiB0aGlzIG1hdGNoLgogICAqLwogIFN0cmluZyBncm91cChpbnQgZ3JvdXApOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gW2dyb3VwXS4KICAgKgogICAqIElmIFtncm91cF0gaXMgMCwgcmV0dXJucyB0aGUgbWF0Y2ggb2YgdGhlIHBhdHRlcm4uCiAgICoKICAgKiBTaG9ydCBhbGlhcyBmb3IgW01hdGNoLmdyb3VwXS4KICAgKi8KICBTdHJpbmcgb3BlcmF0b3IgW10oaW50IGdyb3VwKTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGdyb3VwcyB3aXRoIHRoZSBnaXZlbiBpbmRpY2VzLgogICAqCiAgICogVGhlIGxpc3QgY29udGFpbnMgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkgW2dyb3VwXSBmb3IgZWFjaCBpbmRleCBpbgogICAqIFtncm91cEluZGljZXNdLgogICAqLwogIExpc3Q8U3RyaW5nPiBncm91cHMoTGlzdDxpbnQ+IGdyb3VwSW5kaWNlcyk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjYXB0dXJlZCBncm91cHMgaW4gdGhlIG1hdGNoLgogICAqCiAgICogU29tZSBwYXR0ZXJucyBtYXkgY2FwdHVyZSBwYXJ0cyBvZiB0aGUgaW5wdXQgdGhhdCB3YXMgdXNlZCB0bwogICAqIGNvbXB1dGUgdGhlIGZ1bGwgbWF0Y2guIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjYXB0dXJlZCBncm91cHMsCiAgICogd2hpY2ggaXMgYWxzbyB0aGUgbWF4aW1hbCBhbGxvd2VkIGFyZ3VtZW50IHRvIHRoZSBbZ3JvdXBdIG1ldGhvZC4KICAgKi8KICBpbnQgZ2V0IGdyb3VwQ291bnQ7CgogIC8qKgogICAqIFRoZSBzdHJpbmcgb24gd2hpY2ggdGhpcyBtYXRjaCB3YXMgY29tcHV0ZWQuCiAgICovCiAgU3RyaW5nIGdldCBpbnB1dDsKCiAgLyoqCiAgICogVGhlIHBhdHRlcm4gdXNlZCB0byBzZWFyY2ggaW4gW2lucHV0XS4KICAgKi8KICBQYXR0ZXJuIGdldCBwYXR0ZXJuOwp9CoCFAE5OPAETAQQzBBlET0wVBjcFQAVLOydDBUFJNAVFRgY+AQY3BUdGS0wyBjcCAQQsA0gVA0dAAyonNiIkFwkDIQMNCg4DS0pNGwQXBj0GEQEGRQwGDwEGNgU4BUkcBhsBBjYFOAUkBiEBBjoFSRUGLwEGOQVDREcGFgEGMgYUAQYsBhcCARZkYXJ0OmNvcmUvcGF0dGVybi5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3JlZ2V4cC5kYXJ0k0cvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogQSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KICoKICogUmVndWxhciBleHByZXNzaW9ucyBhcmUgW1BhdHRlcm5dcywgYW5kIGNhbiBhcyBzdWNoIGJlIHVzZWQgdG8gbWF0Y2ggc3RyaW5ncwogKiBvciBwYXJ0cyBvZiBzdHJpbmdzLgogKgogKiBEYXJ0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgaGF2ZSB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcyBhcwogKiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFNlZQogKiA8aHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMTA+CiAqIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAqCiAqIFtmaXJzdE1hdGNoXSBpcyB0aGUgbWFpbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgdGhhdCBhcHBsaWVzIGEgcmVndWxhcgogKiBleHByZXNzaW9uIHRvIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBbTWF0Y2hdLiBBbGwKICogb3RoZXIgbWV0aG9kcyBpbiBbUmVnRXhwXSBjYW4gYnVpbGQgb24gaXQuCiAqCiAqIFVzZSBbYWxsTWF0Y2hlc10gdG8gbG9vayBmb3IgYWxsIG1hdGNoZXMgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gaW4KICogYSBzdHJpbmcuCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmaW5kcyBhbGwgbWF0Y2hlcyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbgogKiBhIHN0cmluZy4KICogYGBgZGFydAogKiBSZWdFeHAgZXhwID0gbmV3IFJlZ0V4cChyIihcdyspIik7CiAqIFN0cmluZyBzdHIgPSAiUGFyc2UgbXkgc3RyaW5nIjsKICogSXRlcmFibGU8TWF0Y2g+IG1hdGNoZXMgPSBleHAuYWxsTWF0Y2hlcyhzdHIpOwogKiBgYGAKICoKICogTm90ZSB0aGUgdXNlIG9mIGEgX3JhdyBzdHJpbmdfIChhIHN0cmluZyBwcmVmaXhlZCB3aXRoIGByYCkKICogaW4gdGhlIGV4YW1wbGUgYWJvdmUuIFVzZSBhIHJhdyBzdHJpbmcgdG8gdHJlYXQgZWFjaCBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcKICogYXMgYSBsaXRlcmFsIGNoYXJhY3Rlci4KICovCmFic3RyYWN0IGNsYXNzIFJlZ0V4cCBpbXBsZW1lbnRzIFBhdHRlcm4gewogIC8qKgogICAqIENvbnN0cnVjdHMgYSByZWd1bGFyIGV4cHJlc3Npb24uCiAgICoKICAgKiBUaHJvd3MgYSBbRm9ybWF0RXhjZXB0aW9uXSBpZiBbc291cmNlXSBpcyBub3QgdmFsaWQgcmVndWxhcgogICAqIGV4cHJlc3Npb24gc3ludGF4LgogICAqCiAgICogSWYgYG11bHRpTGluZWAgaXMgZW5hYmxlZCwgdGhlbiBgXmAgYW5kIGAkYCB3aWxsIG1hdGNoIHRoZSBiZWdpbm5pbmcgYW5kCiAgICogZW5kIG9mIGEgX2xpbmVfLCBpbiBhZGRpdGlvbiB0byBtYXRjaGluZyBiZWdpbm5pbmcgYW5kIGVuZCBvZiBpbnB1dCwKICAgKiByZXNwZWN0aXZlbHkuCiAgICoKICAgKiBJZiBgY2FzZVNlbnNpdGl2ZWAgaXMgZGlzYWJsZWQsIHRoZW4gY2FzZSBpcyBpZ25vcmVkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGRhcnQKICAgKiB2YXIgd29yZFBhdHRlcm4gPSBSZWdFeHAociIoXHcrKSIpOwogICAqIHZhciBicmFja2V0ZWROdW1iZXJWYWx1ZSA9IFJlZ0V4cCgiJGtleTogXFxbXFxkK1xcXSIpOwogICAqIGBgYAogICAqCiAgICogTm90aWNlIHRoZSB1c2Ugb2YgYSBfcmF3IHN0cmluZ18gaW4gdGhlIGZpcnN0IGV4YW1wbGUsIGFuZCBhIHJlZ3VsYXIKICAgKiBzdHJpbmcgaW4gdGhlIHNlY29uZC4gQmVjYXVzZSBvZiB0aGUgbWFueSBjaGFyYWN0ZXIgY2xhc3NlcyB1c2VkIGluCiAgICogcmVndWxhciBleHByZXNzaW9ucywgaXQgaXMgY29tbW9uIHRvIHVzZSBhIHJhdyBzdHJpbmcgaGVyZSwgdW5sZXNzIHN0cmluZwogICAqIGludGVycG9sYXRpb24gaXMgcmVxdWlyZWQuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBSZWdFeHAoU3RyaW5nIHNvdXJjZSwKICAgICAge2Jvb2wgbXVsdGlMaW5lID0gZmFsc2UsIGJvb2wgY2FzZVNlbnNpdGl2ZSA9IHRydWV9KTsKCiAgLyoqCiAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgW3RleHRdLgogICAqCiAgICogSWYgW3RleHRdIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBhcmUgbWVhbmluZ2Z1bCBpbiByZWd1bGFyIGV4cHJlc3Npb25zLAogICAqIHRoZSByZXN1bHRpbmcgcmVndWxhciBleHByZXNzaW9uIHdpbGwgbWF0Y2ggdGhvc2UgY2hhcmFjdGVycyBsaXRlcmFsbHkuCiAgICogSWYgW3RleHRdIGNvbnRhaW5zIG5vIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHNwZWNpYWwgbWVhbmluZyBpbiBhIHJlZ3VsYXIKICAgKiBleHByZXNzaW9uLCBpdCBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgogICAqCiAgICogVGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHNwZWNpYWwgbWVhbmluZyBpbiByZWd1bGFyIGV4cHJlc3Npb25zIGFyZToKICAgKiBgKGAsIGApYCwgYFtgLCBgXWAsIGB7YCwgYH1gLCBgKmAsIGArYCwgYD9gLCBgLmAsIGBeYCwgYCRgLCBgfGAgYW5kIGBcYC4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdGV4dCk7CgogIC8qKgogICAqIFNlYXJjaGVzIGZvciB0aGUgZmlyc3QgbWF0Y2ggb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAqIGluIHRoZSBzdHJpbmcgW2lucHV0XS4gUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gbWF0Y2guCiAgICovCiAgTWF0Y2ggZmlyc3RNYXRjaChTdHJpbmcgaW5wdXQpOwoKICAvKioKICAgKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIG9mIHRoZSBtYXRjaGVzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gb24gW2lucHV0XS4KICAgKgogICAqIElmIFtzdGFydF0gaXMgcHJvdmlkZWQsIG9ubHkgc3RhcnQgbG9va2luZyBmb3IgbWF0Y2hlcyBhdCBgc3RhcnRgLgogICAqLwogIEl0ZXJhYmxlPE1hdGNoPiBhbGxNYXRjaGVzKFN0cmluZyBpbnB1dCwgW2ludCBzdGFydCA9IDBdKTsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIGEgbWF0Y2ggaW4gdGhlIHN0cmluZyBbaW5wdXRdLgogICAqLwogIGJvb2wgaGFzTWF0Y2goU3RyaW5nIGlucHV0KTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3Qgc3Vic3RyaW5nIG1hdGNoIG9mIHRoaXMgcmVndWxhciBleHByZXNzaW9uIGluIFtpbnB1dF0uCiAgICovCiAgU3RyaW5nIHN0cmluZ01hdGNoKFN0cmluZyBpbnB1dCk7CgogIC8qKgogICAqIFRoZSBzb3VyY2UgcmVndWxhciBleHByZXNzaW9uIHN0cmluZyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGBSZWdFeHBgLgogICAqLwogIFN0cmluZyBnZXQgcGF0dGVybjsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIG11bHRpcGxlIGxpbmVzLgogICAqCiAgICogSWYgdGhlIHJlZ2V4cCBkb2VzIG1hdGNoIG11bHRpcGxlIGxpbmVzLCB0aGUgIl4iIGFuZCAiJCIgY2hhcmFjdGVycwogICAqIG1hdGNoIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBsaW5lcy4gSWYgbm90LCB0aGUgY2hhcmFjdGVyIG1hdGNoIHRoZQogICAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBpbnB1dC4KICAgKi8KICBib29sIGdldCBpc011bHRpTGluZTsKCiAgLyoqCiAgICogV2hldGhlciB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBjYXNlIHNlbnNpdGl2ZS4KICAgKgogICAqIElmIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbm90IGNhc2Ugc2Vuc2l0aXZlLCBpdCB3aWxsIG1hdGNoIGFuIGlucHV0CiAgICogbGV0dGVyIHdpdGggYSBwYXR0ZXJuIGxldHRlciBldmVuIGlmIHRoZSB0d28gbGV0dGVycyBhcmUgZGlmZmVyZW50IGNhc2UKICAgKiB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBsZXR0ZXIuCiAgICovCiAgYm9vbCBnZXQgaXNDYXNlU2Vuc2l0aXZlOwp9CgovKioKICogQSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2guCiAqCiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGFyZSBbTWF0Y2hdZXMsIGJ1dCBhbHNvIGluY2x1ZGUgdGhlIGFiaWxpdHkKICogdG8gcmV0cmlldmUgdGhlIG5hbWVzIGZvciBhbnkgbmFtZWQgY2FwdHVyZSBncm91cHMgYW5kIHRvIHJldHJpZXZlCiAqIG1hdGNoZXMgZm9yIG5hbWVkIGNhcHR1cmUgZ3JvdXBzIGJ5IG5hbWUgaW5zdGVhZCBvZiB0aGVpciBpbmRleC4KICovCmFic3RyYWN0IGNsYXNzIFJlZ0V4cE1hdGNoIGltcGxlbWVudHMgTWF0Y2ggewogIC8qKgogICAqIFRoZSBzdHJpbmcgbWF0Y2hlZCBieSB0aGUgZ3JvdXAgbmFtZWQgW25hbWVdLgogICAqCiAgICogUmV0dXJucyB0aGUgc3RyaW5nIG1hdGNoZWQgYnkgdGhlIGNhcHR1cmUgZ3JvdXAgbmFtZWQgW25hbWVdLCBvcgogICAqIGBudWxsYCBpZiBubyBzdHJpbmcgd2FzIG1hdGNoZWQgYnkgdGhhdCBjYXB0dXJlIGdyb3VwIGFzIHBhcnQgb2YKICAgKiB0aGlzIG1hdGNoLgogICAqCiAgICogVGhlIFtuYW1lXSBtdXN0IGJlIHRoZSBuYW1lIG9mIGEgbmFtZWQgY2FwdHVyZSBncm91cCBpbiB0aGUgcmVndWxhcgogICAqIGV4cHJlc3Npb24gY3JlYXRpbmcgdGhpcyBtYXRjaCAodGhhdCBpcywgdGhlIG5hbWUgbXVzdCBiZSBpbgogICAqIFtncm91cE5hbWVzXSkuCiAgICovCiAgU3RyaW5nIG5hbWVkR3JvdXAoU3RyaW5nIG5hbWUpOwoKICAvKioKICAgKiBUaGUgbmFtZXMgb2YgdGhlIGNhcHR1cmVkIGdyb3VwcyBpbiB0aGUgbWF0Y2guCiAgICovCiAgSXRlcmFibGU8U3RyaW5nPiBnZXQgZ3JvdXBOYW1lczsKfQqAmABOTjwBEwEEIQNQGANCJzs8A0k9LgNHDQNGDQsmIzIHAz9OGwQrBiYFQRgFTkoTBTsFDgUNKTwJBUpJTyAGKTwBBjcFT01NLAVKTgYuAQY8QQYiAQZOBUgGPQEGTwYfAQZOBiQBBkgGFgEGPQVJSyUGGAEGOAVNTSIGHAIBBB8DSkZEBC4GMwVGRhEFSUIUBiIBBjQGIwIBFWRhcnQ6Y29yZS9yZWdleHAuZGFydCpvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9zaW5rLmRhcnSDJi8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIGdlbmVyaWMgZGVzdGluYXRpb24gZm9yIGRhdGEuCiAqCiAqIE11bHRpcGxlIGRhdGEgdmFsdWVzIGNhbiBiZSBwdXQgaW50byBhIHNpbmssIGFuZCB3aGVuIG5vIG1vcmUgZGF0YSBpcwogKiBhdmFpbGFibGUsIHRoZSBzaW5rIHNob3VsZCBiZSBjbG9zZWQuCiAqCiAqIFRoaXMgaXMgYSBnZW5lcmljIGludGVyZmFjZSB0aGF0IG90aGVyIGRhdGEgcmVjZWl2ZXJzIGNhbiBpbXBsZW1lbnQuCiAqLwphYnN0cmFjdCBjbGFzcyBTaW5rPFQ+IHsKICAvKioKICAgKiBBZGRzIFtkYXRhXSB0byB0aGUgc2luay4KICAgKgogICAqIE11c3Qgbm90IGJlIGNhbGxlZCBhZnRlciBhIGNhbGwgdG8gW2Nsb3NlXS4KICAgKi8KICB2b2lkIGFkZChUIGRhdGEpOwoKICAvKioKICAgKiBDbG9zZXMgdGhlIHNpbmsuCiAgICoKICAgKiBUaGUgW2FkZF0gbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBhZnRlciB0aGlzIG1ldGhvZC4KICAgKgogICAqIENhbGxpbmcgdGhpcyBtZXRob2QgbW9yZSB0aGFuIG9uY2UgaXMgYWxsb3dlZCwgYnV0IGRvZXMgbm90aGluZy4KICAgKi8KICB2b2lkIGNsb3NlKCk7Cn0KIQBOTjwBEwEEIwNJKQNIBBkGHgUxBhQBBhYFPAVGBhACARNkYXJ0OmNvcmUvc2luay5kYXJ0MG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3N0YWNrdHJhY2UuZGFydIe6Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKLyoqCiAqIEFuIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgc3RhY2sgdHJhY2Ugb2JqZWN0cy4KICoKICogQSBbU3RhY2tUcmFjZV0gaXMgaW50ZW5kZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIGFib3V0IHRoZSBjYWxsCiAqIHNlcXVlbmNlIHRoYXQgdHJpZ2dlcmVkIGFuIGV4Y2VwdGlvbi4KICoKICogVGhlc2Ugb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgcnVudGltZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZQogKiB0aGVtIHByb2dyYW1tYXRpY2FsbHkuCiAqLwphYnN0cmFjdCBjbGFzcyBTdGFja1RyYWNlIHsKICBTdGFja1RyYWNlKCk7IC8vIEluIGNhc2UgZXhpc3RpbmcgY2xhc3NlcyBleHRlbmQgU3RhY2tUcmFjZS4KCiAgLyoqCiAgICogQ3JlYXRlIGEgYFN0YWNrVHJhY2VgIG9iamVjdCBmcm9tIFtzdGFja1RyYWNlU3RyaW5nXS4KICAgKgogICAqIFRoZSBjcmVhdGVkIHN0YWNrIHRyYWNlIHdpbGwgaGF2ZSBhIGB0b1N0cmluZ2AgbWV0aG9kIHJldHVybmluZwogICAqIGBzdGFja1RyYWNlU3RyaW5nYC4KICAgKgogICAqIFRoZSBgc3RhY2tUcmFjZVN0cmluZ2AgY2FuIGJlIGEgc3RyaW5nIHJldHVybmVkIGJ5IHNvbWUgb3RoZXIKICAgKiBzdGFjayB0cmFjZSwgb3IgaXQgY2FuIGJlIGFueSBzdHJpbmcgYXQgYWxsLgogICAqIElmIHRoZSBzdHJpbmcgZG9lc24ndCBsb29rIGxpa2UgYSBzdGFjayB0cmFjZSwgY29kZSB0aGF0IGludGVycHJldHMKICAgKiBzdGFjayB0cmFjZXMgaXMgbGlrZWx5IHRvIGZhaWwsIHNvIGZha2Ugc3RhY2sgdHJhY2VzIHNob3VsZCBiZSB1c2VkCiAgICogd2l0aCBjYXJlLgogICAqLwogIGZhY3RvcnkgU3RhY2tUcmFjZS5mcm9tU3RyaW5nKFN0cmluZyBzdGFja1RyYWNlU3RyaW5nKSA9IF9TdHJpbmdTdGFja1RyYWNlOwoKICAvKioKICAgKiBSZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc3RhY2sgdHJhY2UuCiAgICoKICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gd2hhdCBjYW4gYmUgYWNoaWV2ZWQgYnkgZG9pbmc6CiAgICoKICAgKiAgICAgdHJ5IHsgdGhyb3cgMDsgfSBjYXRjaCAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9CiAgICoKICAgKiBUaGUgZ2V0dGVyIGFjaGlldmVzIHRoaXMgd2l0aG91dCB0aHJvd2luZywgZXhjZXB0IG9uIHBsYXRmb3JtcyB0aGF0CiAgICogaGF2ZSBubyBvdGhlciB3YXkgdG8gZ2V0IGEgc3RhY2sgdHJhY2UuCiAgICovCiAgZXh0ZXJuYWwgc3RhdGljIFN0YWNrVHJhY2UgZ2V0IGN1cnJlbnQ7CgogIC8qKgogICAqIFJldHVybnMgYSBbU3RyaW5nXSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhY2sgdHJhY2UuCiAgICoKICAgKiBUaGUgc3RyaW5nIHJlcHJlc2VudHMgdGhlIGZ1bGwgc3RhY2sgdHJhY2Ugc3RhcnRpbmcgZnJvbQogICAqIHRoZSBwb2ludCB3aGVyZSBhIHRocm93IG9jY3VycmVkIHRvIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgY2FsbCBzZXF1ZW5jZS4KICAgKgogICAqIFRoZSBleGFjdCBmb3JtYXQgb2YgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyBub3QgZmluYWwuCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nKCk7Cn0KCmNsYXNzIF9TdHJpbmdTdGFja1RyYWNlIGltcGxlbWVudHMgU3RhY2tUcmFjZSB7CiAgZmluYWwgU3RyaW5nIF9zdGFja1RyYWNlOwogIF9TdHJpbmdTdGFja1RyYWNlKHRoaXMuX3N0YWNrVHJhY2UpOwogIFN0cmluZyB0b1N0cmluZygpID0+IF9zdGFja1RyYWNlOwp9Cj4ATk48ARMBBDgDTykDShoEHD8BBjsFRRkFQzJJSRAGTgEGOgU3BT0FSS0GKgEGOwU+TwVBBhUCATAcJyQCARlkYXJ0OmNvcmUvc3RhY2t0cmFjZS5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3N0cmluZy5kYXJ0wABx9C8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIHNlcXVlbmNlIG9mIFVURi0xNiBjb2RlIHVuaXRzLgogKgogKiBTdHJpbmdzIGFyZSBtYWlubHkgdXNlZCB0byByZXByZXNlbnQgdGV4dC4gQSBjaGFyYWN0ZXIgbWF5IGJlIHJlcHJlc2VudGVkIGJ5CiAqIG11bHRpcGxlIGNvZGUgcG9pbnRzLCBlYWNoIGNvZGUgcG9pbnQgY29uc2lzdGluZyBvZiBvbmUgb3IgdHdvIGNvZGUKICogdW5pdHMuIEZvciBleGFtcGxlIHRoZSBQYXB1YSBOZXcgR3VpbmVhIGZsYWcgY2hhcmFjdGVyIHJlcXVpcmVzIGZvdXIgY29kZQogKiB1bml0cyB0byByZXByZXNlbnQgdHdvIGNvZGUgcG9pbnRzLCBidXQgc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSBhIHNpbmdsZQogKiBjaGFyYWN0ZXI6ICLwn4e18J+HrCIuIFBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBmbGFnIGNoYXJhY3RlciBtYXkgc2hvdwogKiB0aGUgbGV0dGVycyAiUEciIGluc3RlYWQuIElmIHRoZSBjb2RlIHBvaW50cyBhcmUgc3dhcHBlZCwgaXQgaW5zdGVhZCBiZWNvbWVzCiAqIHRoZSBHdWFkZWxvdXBlIGZsYWcgIvCfh6zwn4e1IiAoIkdQIikuCiAqCiAqIEEgc3RyaW5nIGNhbiBiZSBlaXRoZXIgc2luZ2xlIG9yIG11bHRpbGluZS4gU2luZ2xlIGxpbmUgc3RyaW5ncyBhcmUKICogd3JpdHRlbiB1c2luZyBtYXRjaGluZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcywgYW5kIG11bHRpbGluZSBzdHJpbmdzIGFyZQogKiB3cml0dGVuIHVzaW5nIHRyaXBsZSBxdW90ZXMuIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCB2YWxpZCBEYXJ0IHN0cmluZ3M6CiAqCiAqICAgICAnU2luZ2xlIHF1b3Rlcyc7CiAqICAgICAiRG91YmxlIHF1b3RlcyI7CiAqICAgICAnRG91YmxlIHF1b3RlcyBpbiAic2luZ2xlIiBxdW90ZXMnOwogKiAgICAgIlNpbmdsZSBxdW90ZXMgaW4gJ2RvdWJsZScgcXVvdGVzIjsKICoKICogICAgICcnJ0EKICogICAgIG11bHRpbGluZQogKiAgICAgc3RyaW5nJycnOwogKgogKiAgICAgIiIiCiAqICAgICBBbm90aGVyCiAqICAgICBtdWx0aWxpbmUKICogICAgIHN0cmluZyIiIjsKICoKICogU3RyaW5ncyBhcmUgaW1tdXRhYmxlLiBBbHRob3VnaCB5b3UgY2Fubm90IGNoYW5nZSBhIHN0cmluZywgeW91IGNhbiBwZXJmb3JtCiAqIGFuIG9wZXJhdGlvbiBvbiBhIHN0cmluZyBhbmQgYXNzaWduIHRoZSByZXN1bHQgdG8gYSBuZXcgc3RyaW5nOgogKgogKiAgICAgdmFyIHN0cmluZyA9ICdEYXJ0IGlzIGZ1bic7CiAqICAgICB2YXIgbmV3U3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCA1KTsKICoKICogWW91IGNhbiB1c2UgdGhlIHBsdXMgKGArYCkgb3BlcmF0b3IgdG8gY29uY2F0ZW5hdGUgc3RyaW5nczoKICoKICogICAgICdEYXJ0ICcgKyAnaXMgJyArICdmdW4hJzsgLy8gJ0RhcnQgaXMgZnVuIScKICoKICogWW91IGNhbiBhbHNvIHVzZSBhZGphY2VudCBzdHJpbmcgbGl0ZXJhbHMgZm9yIGNvbmNhdGVuYXRpb246CiAqCiAqICAgICAnRGFydCAnICdpcyAnICdmdW4hJzsgICAgLy8gJ0RhcnQgaXMgZnVuIScKICoKICogWW91IGNhbiB1c2UgYCR7fWAgdG8gaW50ZXJwb2xhdGUgdGhlIHZhbHVlIG9mIERhcnQgZXhwcmVzc2lvbnMKICogd2l0aGluIHN0cmluZ3MuIFRoZSBjdXJseSBicmFjZXMgY2FuIGJlIG9taXR0ZWQgd2hlbiBldmFsdWF0aW5nIGlkZW50aWZpZXJzOgogKgogKiAgICAgc3RyaW5nID0gJ2RhcnRsYW5nJzsKICogICAgICckc3RyaW5nIGhhcyAke3N0cmluZy5sZW5ndGh9IGxldHRlcnMnOyAvLyAnZGFydGxhbmcgaGFzIDggbGV0dGVycycKICoKICogQSBzdHJpbmcgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZXF1ZW5jZSBvZiBVbmljb2RlIFVURi0xNiBjb2RlIHVuaXRzCiAqIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgW2NvZGVVbml0QXRdIG9yIHRoZSBbY29kZVVuaXRzXSBtZW1iZXJzOgogKgogKiAgICAgc3RyaW5nID0gJ0RhcnQnOwogKiAgICAgc3RyaW5nLmNvZGVVbml0QXQoMCk7IC8vIDY4CiAqICAgICBzdHJpbmcuY29kZVVuaXRzOyAgICAgLy8gWzY4LCA5NywgMTE0LCAxMTZdCiAqCiAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY29kZSB1bml0cyBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIGluZGV4CiAqIG9wZXJhdG9yOgogKgogKiAgICAgc3RyaW5nWzBdOyAgICAgICAgICAgIC8vICdEJwogKgogKiBUaGUgY2hhcmFjdGVycyBvZiBhIHN0cmluZyBhcmUgZW5jb2RlZCBpbiBVVEYtMTYuIERlY29kaW5nIFVURi0xNiwgd2hpY2gKICogY29tYmluZXMgc3Vycm9nYXRlIHBhaXJzLCB5aWVsZHMgVW5pY29kZSBjb2RlIHBvaW50cy4gRm9sbG93aW5nIGEgc2ltaWxhcgogKiB0ZXJtaW5vbG9neSB0byBHbywgd2UgdXNlIHRoZSBuYW1lICdydW5lJyBmb3IgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgYQogKiBVbmljb2RlIGNvZGUgcG9pbnQuIFVzZSB0aGUgW3J1bmVzXSBwcm9wZXJ0eSB0byBnZXQgdGhlIHJ1bmVzIG9mIGEgc3RyaW5nOgogKgogKiAgICAgc3RyaW5nLnJ1bmVzLnRvTGlzdCgpOyAvLyBbNjgsIDk3LCAxMTQsIDExNl0KICoKICogRm9yIGEgY2hhcmFjdGVyIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAocGxhbmUgMCkgdGhhdCBpcwogKiBjb21wb3NlZCBvZiBhIHN1cnJvZ2F0ZSBwYWlyLCBbcnVuZXNdIGNvbWJpbmVzIHRoZSBwYWlyIGFuZCByZXR1cm5zIGEKICogc2luZ2xlIGludGVnZXIuICBGb3IgZXhhbXBsZSwgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGZvciBhCiAqIG11c2ljYWwgRy1jbGVmICgn8J2EnicpIHdpdGggcnVuZSB2YWx1ZSAweDFEMTFFIGNvbnNpc3RzIG9mIGEgVVRGLTE2IHN1cnJvZ2F0ZQogKiBwYWlyOiBgMHhEODM0YCBhbmQgYDB4REQxRWAuIFVzaW5nIFtjb2RlVW5pdHNdIHJldHVybnMgdGhlIHN1cnJvZ2F0ZSBwYWlyLAogKiBhbmQgdXNpbmcgYHJ1bmVzYCByZXR1cm5zIHRoZWlyIGNvbWJpbmVkIHZhbHVlOgogKgogKiAgICAgdmFyIGNsZWYgPSAnXHV7MUQxMUV9JzsKICogICAgIGNsZWYuY29kZVVuaXRzOyAgICAgICAgIC8vIFsweEQ4MzQsIDB4REQxRV0KICogICAgIGNsZWYucnVuZXMudG9MaXN0KCk7ICAgIC8vIFsweDFEMTFFXQogKgogKiBUaGUgU3RyaW5nIGNsYXNzIGNhbiBub3QgYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQuIEF0dGVtcHRpbmcgdG8gZG8gc28KICogeWllbGRzIGEgY29tcGlsZS10aW1lIGVycm9yLgogKgogKiAjIyBPdGhlciByZXNvdXJjZXMKICoKICogU2VlIFtTdHJpbmdCdWZmZXJdIHRvIGVmZmljaWVudGx5IGJ1aWxkIGEgc3RyaW5nIGluY3JlbWVudGFsbHkuIFNlZQogKiBbUmVnRXhwXSB0byB3b3JrIHdpdGggcmVndWxhciBleHByZXNzaW9ucy4KICoKICogQWxzbyBzZWU6CiAqCiAqICogW0RhcnQgQ29va2Jvb2tdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2Nvb2tib29rLyNzdHJpbmdzKQogKiAgIGZvciBTdHJpbmcgZXhhbXBsZXMgYW5kIHJlY2lwZXMuCiAqICogW0RhcnQgVXAgYW5kIFJ1bm5pbmddKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI3N0cmluZ3MtYW5kLXJlZ3VsYXItZXhwcmVzc2lvbnMpCiAqLwphYnN0cmFjdCBjbGFzcyBTdHJpbmcgaW1wbGVtZW50cyBDb21wYXJhYmxlPFN0cmluZz4sIFBhdHRlcm4gewogIC8qKgogICAqIEFsbG9jYXRlcyBhIG5ldyBTdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgW2NoYXJDb2Rlc10uCiAgICoKICAgKiBUaGUgW2NoYXJDb2Rlc10gY2FuIGJlIFVURi0xNiBjb2RlIHVuaXRzIG9yIHJ1bmVzLiBJZiBhIGNoYXItY29kZSB2YWx1ZSBpcwogICAqIDE2LWJpdCwgaXQgaXMgY29waWVkIHZlcmJhdGltOgogICAqCiAgICogICAgIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhbNjhdKTsgLy8gJ0QnCiAgICoKICAgKiBJZiBhIGNoYXItY29kZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMTYtYml0cywgaXQgaXMgZGVjb21wb3NlZCBpbnRvIGEKICAgKiBzdXJyb2dhdGUgcGFpcjoKICAgKgogICAqICAgICB2YXIgY2xlZiA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlcyhbMHgxRDExRV0pOwogICAqICAgICBjbGVmLmNvZGVVbml0QXQoMCk7IC8vIDB4RDgzNAogICAqICAgICBjbGVmLmNvZGVVbml0QXQoMSk7IC8vIDB4REQxRQogICAqCiAgICogSWYgW3N0YXJ0XSBhbmQgW2VuZF0gaXMgcHJvdmlkZWQsIG9ubHkgdGhlIHZhbHVlcyBvZiBbY2hhckNvZGVzXQogICAqIGF0IHBvc2l0aW9ucyBmcm9tIGBzdGFydGAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYCwgYXJlIHVzZWQuCiAgICogVGhlIGBzdGFydGAgYW5kIGBlbmRgIHZhbHVlcyBtdXN0IHNhdGlzZnkKICAgKiBgMCA8PSBzdGFydCA8PSBlbmQgPD0gY2hhckNvZGVzLmxlbmd0aGAuCiAgICovCiAgZXh0ZXJuYWwgZmFjdG9yeSBTdHJpbmcuZnJvbUNoYXJDb2RlcyhJdGVyYWJsZTxpbnQ+IGNoYXJDb2RlcywKICAgICAgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKTsKCiAgLyoqCiAgICogQWxsb2NhdGVzIGEgbmV3IFN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBbY2hhckNvZGVdLgogICAqCiAgICogSWYgdGhlIFtjaGFyQ29kZV0gY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIFVURi0xNiBjb2RlIHVuaXQsIHRoZSBuZXcKICAgKiBzdHJpbmcgY29udGFpbnMgYSBzaW5nbGUgY29kZSB1bml0LiBPdGhlcndpc2UsIHRoZSBbbGVuZ3RoXSBpcyAyIGFuZAogICAqIHRoZSBjb2RlIHVuaXRzIGZvcm0gYSBzdXJyb2dhdGUgcGFpci4gU2VlIGRvY3VtZW50YXRpb24gZm9yCiAgICogW2Zyb21DaGFyQ29kZXNdLgogICAqCiAgICogQ3JlYXRpbmcgYSBTdHJpbmcgd2l0aCBoYWxmIG9mIGEgc3Vycm9nYXRlIHBhaXIgaXMgYWxsb3dlZC4KICAgKi8KICBleHRlcm5hbCBmYWN0b3J5IFN0cmluZy5mcm9tQ2hhckNvZGUoaW50IGNoYXJDb2RlKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbiBbbmFtZV0uCiAgICoKICAgKiBFbnZpcm9ubWVudCBkZWNsYXJhdGlvbnMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBzdXJyb3VuZGluZyBzeXN0ZW0gY29tcGlsaW5nCiAgICogb3IgcnVubmluZyB0aGUgRGFydCBwcm9ncmFtLiBEZWNsYXJhdGlvbnMgbWFwIGEgc3RyaW5nIGtleSB0byBhIHN0cmluZwogICAqIHZhbHVlLgogICAqCiAgICogSWYgW25hbWVdIGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgZW52aXJvbm1lbnQsIHRoZSByZXN1bHQgaXMgaW5zdGVhZAogICAqIFtkZWZhdWx0VmFsdWVdLgogICAqCiAgICogRXhhbXBsZSBvZiBnZXR0aW5nIGEgdmFsdWU6CiAgICoKICAgKiAgICAgY29uc3QgU3RyaW5nLmZyb21FbnZpcm9ubWVudCgiZGVmYXVsdEZsb28iLCBkZWZhdWx0VmFsdWU6ICJubyBmbG9vIikKICAgKgogICAqIEV4YW1wbGUgb2YgY2hlY2tpbmcgd2hldGhlciBhIGRlY2xhcmF0aW9uIGlzIHRoZXJlIGF0IGFsbDoKICAgKgogICAqICAgICB2YXIgaXNEZWNsYXJlZCA9IGNvbnN0IFN0cmluZy5mcm9tRW52aXJvbm1lbnQoIm1heWJlRGVjbGFyZWQiKSAhPSBudWxsOwogICAqLwogIC8vIFRoZSAuZnJvbUVudmlyb25tZW50KCkgY29uc3RydWN0b3JzIGFyZSBzcGVjaWFsIGluIHRoYXQgd2UgZG8gbm90IHdhbnQKICAvLyB1c2VycyB0byBjYWxsIHRoZW0gdXNpbmcgIm5ldyIuIFdlIHByb2hpYml0IHRoYXQgYnkgZ2l2aW5nIHRoZW0gYm9kaWVzCiAgLy8gdGhhdCB0aHJvdywgZXZlbiB0aG91Z2ggY29uc3QgY29uc3RydWN0b3JzIGFyZSBub3QgYWxsb3dlZCB0byBoYXZlIGJvZGllcy4KICAvLyBEaXNhYmxlIHRob3NlIHN0YXRpYyBlcnJvcnMuCiAgLy9pZ25vcmU6IGNvbnN0X2NvbnN0cnVjdG9yX3dpdGhfYm9keQogIC8vaWdub3JlOiBjb25zdF9mYWN0b3J5CiAgZXh0ZXJuYWwgY29uc3QgZmFjdG9yeSBTdHJpbmcuZnJvbUVudmlyb25tZW50KFN0cmluZyBuYW1lLAogICAgICB7U3RyaW5nIGRlZmF1bHRWYWx1ZX0pOwoKICAvKioKICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIgKGFzIGEgc2luZ2xlLWNvZGUtdW5pdCBbU3RyaW5nXSkgYXQgdGhlIGdpdmVuIFtpbmRleF0uCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIHJlcHJlc2VudHMgZXhhY3RseSBvbmUgVVRGLTE2IGNvZGUgdW5pdCwgd2hpY2ggbWF5IGJlCiAgICogaGFsZiBvZiBhIHN1cnJvZ2F0ZSBwYWlyLiBBIHNpbmdsZSBtZW1iZXIgb2YgYSBzdXJyb2dhdGUgcGFpciBpcyBhbgogICAqIGludmFsaWQgVVRGLTE2IHN0cmluZzoKICAgKgogICAqICAgICB2YXIgY2xlZiA9ICdcdXsxRDExRX0nOwogICAqICAgICAvLyBUaGVzZSByZXByZXNlbnQgaW52YWxpZCBVVEYtMTYgc3RyaW5ncy4KICAgKiAgICAgY2xlZlswXS5jb2RlVW5pdHM7ICAgICAgLy8gWzB4RDgzNF0KICAgKiAgICAgY2xlZlsxXS5jb2RlVW5pdHM7ICAgICAgLy8gWzB4REQxRV0KICAgKgogICAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8KICAgKiBgbmV3IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5jb2RlVW5pdEF0KGluZGV4KSlgLgogICAqLwogIFN0cmluZyBvcGVyYXRvciBbXShpbnQgaW5kZXgpOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSAxNi1iaXQgVVRGLTE2IGNvZGUgdW5pdCBhdCB0aGUgZ2l2ZW4gW2luZGV4XS4KICAgKi8KICBpbnQgY29kZVVuaXRBdChpbnQgaW5kZXgpOwoKICAvKioKICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVVRGLTE2IGNvZGUgdW5pdHMgaW4gdGhpcyBzdHJpbmcuIFRoZSBudW1iZXIKICAgKiBvZiBbcnVuZXNdIG1pZ2h0IGJlIGZld2VyLCBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3V0c2lkZQogICAqIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKHBsYW5lIDApOgogICAqCiAgICogICAgICdEYXJ0Jy5sZW5ndGg7ICAgICAgICAgIC8vIDQKICAgKiAgICAgJ0RhcnQnLnJ1bmVzLmxlbmd0aDsgICAgLy8gNAogICAqCiAgICogICAgIHZhciBjbGVmID0gJ1x1ezFEMTFFfSc7CiAgICogICAgIGNsZWYubGVuZ3RoOyAgICAgICAgICAgIC8vIDIKICAgKiAgICAgY2xlZi5ydW5lcy5sZW5ndGg7ICAgICAgLy8gMQogICAqLwogIGludCBnZXQgbGVuZ3RoOwoKICAvKioKICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgY29kZSB1bml0cyBvZiB0aGUgc3RyaW5nLgogICAqCiAgICogVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggW29wZXJhdG9yID09XS4gU3RyaW5ncyB3aXRoIHRoZSBzYW1lIHNlcXVlbmNlCiAgICogb2YgY29kZSB1bml0cyBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZS4KICAgKi8KICBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgb3RoZXIgaXMgYSBgU3RyaW5nYCB3aXRoIHRoZSBzYW1lIHNlcXVlbmNlIG9mIGNvZGUgdW5pdHMuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjb21wYXJlcyBlYWNoIGluZGl2aWR1YWwgY29kZSB1bml0IG9mIHRoZSBzdHJpbmdzLgogICAqIEl0IGRvZXMgbm90IGNoZWNrIGZvciBVbmljb2RlIGVxdWl2YWxlbmNlLgogICAqIEZvciBleGFtcGxlLCBib3RoIHRoZSBmb2xsb3dpbmcgc3RyaW5ncyByZXByZXNlbnQgdGhlIHN0cmluZyAnQW3DqWxpZScsCiAgICogYnV0IGR1ZSB0byB0aGVpciBkaWZmZXJlbnQgZW5jb2RpbmcsIGFyZSBub3QgZXF1YWw6CiAgICoKICAgKiAgICAgJ0FtXHhlOWxpZScgPT0gJ0FtZVx1ezMwMX1saWUnOyAvLyBmYWxzZQogICAqCiAgICogVGhlIGZpcnN0IHN0cmluZyBlbmNvZGVzICfDqScgYXMgYSBzaW5nbGUgdW5pY29kZSBjb2RlIHVuaXQgKGFsc28KICAgKiBhIHNpbmdsZSBydW5lKSwgd2hlcmVhcyB0aGUgc2Vjb25kIHN0cmluZyBlbmNvZGVzIGl0IGFzICdlJyB3aXRoIHRoZQogICAqIGNvbWJpbmluZyBhY2NlbnQgY2hhcmFjdGVyICfil4zMgScuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpOwoKICAvKioKICAgKiBDb21wYXJlcyB0aGlzIHN0cmluZyB0byBbb3RoZXJdLgogICAqCiAgICogUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIGB0aGlzYCBpcyBvcmRlcmVkIGJlZm9yZSBgb3RoZXJgLAogICAqIGEgcG9zaXRpdmUgdmFsdWUgaWYgYHRoaXNgIGlzIG9yZGVyZWQgYWZ0ZXIgYG90aGVyYCwKICAgKiBvciB6ZXJvIGlmIGB0aGlzYCBhbmQgYG90aGVyYCBhcmUgZXF1aXZhbGVudC4KICAgKgogICAqIFRoZSBvcmRlcmluZyBpcyB0aGUgc2FtZSBhcyB0aGUgb3JkZXJpbmcgb2YgdGhlIGNvZGUgcG9pbnRzIGF0IHRoZSBmaXJzdAogICAqIHBvc2l0aW9uIHdoZXJlIHRoZSB0d28gc3RyaW5ncyBkaWZmZXIuCiAgICogSWYgb25lIHN0cmluZyBpcyBhIHByZWZpeCBvZiB0aGUgb3RoZXIsCiAgICogdGhlbiB0aGUgc2hvcnRlciBzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgdGhlIGxvbmdlciBzdHJpbmcuCiAgICogSWYgdGhlIHN0cmluZ3MgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGNvbnRlbnQsIHRoZXkgYXJlIGVxdWl2YWxlbnQgd2l0aAogICAqIHJlZ2FyZCB0byB0aGUgb3JkZXJpbmcuCiAgICogT3JkZXJpbmcgZG9lcyBub3QgY2hlY2sgZm9yIFVuaWNvZGUgZXF1aXZhbGVuY2UuCiAgICogVGhlIGNvbXBhcmlzb24gaXMgY2FzZSBzZW5zaXRpdmUuCiAgICovCiAgaW50IGNvbXBhcmVUbyhTdHJpbmcgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJpbmcgZW5kcyB3aXRoIFtvdGhlcl0uIEZvciBleGFtcGxlOgogICAqCiAgICogICAgICdEYXJ0Jy5lbmRzV2l0aCgndCcpOyAvLyB0cnVlCiAgICovCiAgYm9vbCBlbmRzV2l0aChTdHJpbmcgb3RoZXIpOwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJpbmcgc3RhcnRzIHdpdGggYSBtYXRjaCBvZiBbcGF0dGVybl0uCiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICdEYXJ0JzsKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgoJ0QnKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUKICAgKiAgICAgc3RyaW5nLnN0YXJ0c1dpdGgobmV3IFJlZ0V4cChyJ1tBLVpdW2Etel0nKSk7IC8vIHRydWUKICAgKgogICAqIElmIFtpbmRleF0gaXMgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgc3Vic3RyaW5nIHN0YXJ0aW5nCiAgICogYXQgdGhhdCBpbmRleCBzdGFydHMgd2l0aCBhIG1hdGNoIG9mIFtwYXR0ZXJuXToKICAgKgogICAqICAgICBzdHJpbmcuc3RhcnRzV2l0aCgnYXJ0JywgMSk7ICAgICAgICAgICAgICAgICAgLy8gdHJ1ZQogICAqICAgICBzdHJpbmcuc3RhcnRzV2l0aChuZXcgUmVnRXhwKHInXHd7M30nKSk7ICAgICAgLy8gdHJ1ZQogICAqCiAgICogW2luZGV4XSBtdXN0IG5vdCBiZSBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gW2xlbmd0aF0uCiAgICoKICAgKiBBIFtSZWdFeHBdIGNvbnRhaW5pbmcgJ14nIGRvZXMgbm90IG1hdGNoIGlmIHRoZSBbaW5kZXhdIGlzIGdyZWF0ZXIgdGhhbgogICAqIHplcm8uIFRoZSBwYXR0ZXJuIHdvcmtzIG9uIHRoZSBzdHJpbmcgYXMgYSB3aG9sZSwgYW5kIGRvZXMgbm90IGV4dHJhY3QKICAgKiBhIHN1YnN0cmluZyBzdGFydGluZyBhdCBbaW5kZXhdIGZpcnN0OgogICAqCiAgICogICAgIHN0cmluZy5zdGFydHNXaXRoKG5ldyBSZWdFeHAocideYXJ0JyksIDEpOyAgICAvLyBmYWxzZQogICAqICAgICBzdHJpbmcuc3RhcnRzV2l0aChuZXcgUmVnRXhwKHInYXJ0JyksIDEpOyAgICAgLy8gdHJ1ZQogICAqLwogIGJvb2wgc3RhcnRzV2l0aChQYXR0ZXJuIHBhdHRlcm4sIFtpbnQgaW5kZXggPSAwXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBtYXRjaCBvZiBbcGF0dGVybl0gaW4gdGhpcyBzdHJpbmcsCiAgICogc3RhcnRpbmcgYXQgW3N0YXJ0XSwgaW5jbHVzaXZlOgogICAqCiAgICogICAgIHZhciBzdHJpbmcgPSAnRGFydGlzYW5zJzsKICAgKiAgICAgc3RyaW5nLmluZGV4T2YoJ2FydCcpOyAgICAgICAgICAgICAgICAgICAgIC8vIDEKICAgKiAgICAgc3RyaW5nLmluZGV4T2YobmV3IFJlZ0V4cChyJ1tBLVpdW2Etel0nKSk7IC8vIDAKICAgKgogICAqIFJldHVybnMgLTEgaWYgbm8gbWF0Y2ggaXMgZm91bmQ6CiAgICoKICAgKiAgICAgc3RyaW5nLmluZGV4T2YobmV3IFJlZ0V4cChyJ2RhcnQnKSk7ICAgICAgIC8vIC0xCiAgICoKICAgKiBbc3RhcnRdIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBub3QgZ3JlYXRlciB0aGFuIFtsZW5ndGhdLgogICAqLwogIGludCBpbmRleE9mKFBhdHRlcm4gcGF0dGVybiwgW2ludCBzdGFydF0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBtYXRjaCBbcGF0dGVybl0gaW4gdGhpcyBzdHJpbmcsIHNlYXJjaGluZwogICAqIGJhY2t3YXJkIHN0YXJ0aW5nIGF0IFtzdGFydF0sIGluY2x1c2l2ZToKICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gJ0RhcnRpc2Fucyc7CiAgICogICAgIHN0cmluZy5sYXN0SW5kZXhPZignYScpOyAgICAgICAgICAgICAgICAgICAgLy8gNgogICAqICAgICBzdHJpbmcubGFzdEluZGV4T2YobmV3IFJlZ0V4cChyJ2EocnxuKScpKTsgIC8vIDYKICAgKgogICAqIFJldHVybnMgLTEgaWYgW3BhdHRlcm5dIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0cmluZy4KICAgKgogICAqICAgICBzdHJpbmcubGFzdEluZGV4T2YobmV3IFJlZ0V4cChyJ0RBUlQnKSk7ICAgIC8vIC0xCiAgICoKICAgKiBUaGUgW3N0YXJ0XSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm90IGdyZWF0ZXIgdGhhbiBbbGVuZ3RoXS4KICAgKi8KICBpbnQgbGFzdEluZGV4T2YoUGF0dGVybiBwYXR0ZXJuLCBbaW50IHN0YXJ0XSk7CgogIC8qKgogICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN0cmluZyBpcyBlbXB0eS4KICAgKi8KICBib29sIGdldCBpc0VtcHR5OwoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJpbmcgaXMgbm90IGVtcHR5LgogICAqLwogIGJvb2wgZ2V0IGlzTm90RW1wdHk7CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIGJ5IGNvbmNhdGVuYXRpbmcgdGhpcyBzdHJpbmcgd2l0aCBbb3RoZXJdLgogICAqCiAgICogICAgICdkYXJ0JyArICdsYW5nJzsgLy8gJ2RhcnRsYW5nJwogICAqLwogIFN0cmluZyBvcGVyYXRvciArKFN0cmluZyBvdGhlcik7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyB0aGF0IGV4dGVuZHMgZnJvbSBbc3RhcnRJbmRleF0sCiAgICogaW5jbHVzaXZlLCB0byBbZW5kSW5kZXhdLCBleGNsdXNpdmUuCiAgICoKICAgKiAgICAgdmFyIHN0cmluZyA9ICdkYXJ0bGFuZyc7CiAgICogICAgIHN0cmluZy5zdWJzdHJpbmcoMSk7ICAgIC8vICdhcnRsYW5nJwogICAqICAgICBzdHJpbmcuc3Vic3RyaW5nKDEsIDQpOyAvLyAnYXJ0JwogICAqLwogIFN0cmluZyBzdWJzdHJpbmcoaW50IHN0YXJ0SW5kZXgsIFtpbnQgZW5kSW5kZXhdKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RyaW5nIHdpdGhvdXQgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICoKICAgKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYSBuZXcgc3RyaW5nIHdpdGggbm8KICAgKiBsZWFkaW5nIGFuZCBubyB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHJldHVybmVkOgogICAqIGBgYGRhcnQKICAgKiAnXHREYXJ0IGlzIGZ1blxuJy50cmltKCk7IC8vICdEYXJ0IGlzIGZ1bicKICAgKiBgYGAKICAgKiBPdGhlcndpc2UsIHRoZSBvcmlnaW5hbCBzdHJpbmcgaXRzZWxmIGlzIHJldHVybmVkOgogICAqIGBgYGRhcnQKICAgKiB2YXIgc3RyMSA9ICdEYXJ0JzsKICAgKiB2YXIgc3RyMiA9IHN0cjEudHJpbSgpOwogICAqIGlkZW50aWNhbChzdHIxLCBzdHIyKTsgICAgLy8gdHJ1ZQogICAqIGBgYAogICAqIFdoaXRlc3BhY2UgaXMgZGVmaW5lZCBieSB0aGUgVW5pY29kZSBXaGl0ZV9TcGFjZSBwcm9wZXJ0eSAoYXMgZGVmaW5lZCBpbgogICAqIHZlcnNpb24gNi4yIG9yIGxhdGVyKSBhbmQgdGhlIEJPTSBjaGFyYWN0ZXIsIDB4RkVGRi4KICAgKgogICAqIEhlcmUgaXMgdGhlIGxpc3Qgb2YgdHJpbW1lZCBjaGFyYWN0ZXJzIGFjY29yZGluZyB0byBVbmljb2RlIHZlcnNpb24gNi4zOgogICAqIGBgYAogICAqICAgICAwMDA5Li4wMDBEICAgIDsgV2hpdGVfU3BhY2UgIyBDYyAgIDxjb250cm9sLTAwMDk+Li48Y29udHJvbC0wMDBEPgogICAqICAgICAwMDIwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgIFNQQUNFCiAgICogICAgIDAwODUgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIENjICAgPGNvbnRyb2wtMDA4NT4KICAgKiAgICAgMDBBMCAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBOTy1CUkVBSyBTUEFDRQogICAqICAgICAxNjgwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgIE9HSEFNIFNQQUNFIE1BUksKICAgKiAgICAgMjAwMC4uMjAwQSAgICA7IFdoaXRlX1NwYWNlICMgWnMgICBFTiBRVUFELi5IQUlSIFNQQUNFCiAgICogICAgIDIwMjggICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpsICAgTElORSBTRVBBUkFUT1IKICAgKiAgICAgMjAyOSAgICAgICAgICA7IFdoaXRlX1NwYWNlICMgWnAgICBQQVJBR1JBUEggU0VQQVJBVE9SCiAgICogICAgIDIwMkYgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgTkFSUk9XIE5PLUJSRUFLIFNQQUNFCiAgICogICAgIDIwNUYgICAgICAgICAgOyBXaGl0ZV9TcGFjZSAjIFpzICAgTUVESVVNIE1BVEhFTUFUSUNBTCBTUEFDRQogICAqICAgICAzMDAwICAgICAgICAgIDsgV2hpdGVfU3BhY2UgIyBacyAgIElERU9HUkFQSElDIFNQQUNFCiAgICoKICAgKiAgICAgRkVGRiAgICAgICAgICA7IEJPTSAgICAgICAgICAgICAgICBaRVJPIFdJRFRIIE5PX0JSRUFLIFNQQUNFCiAgICogYGBgCiAgICogU29tZSBsYXRlciB2ZXJzaW9ucyBvZiBVbmljb2RlIGRvIG5vdCBpbmNsdWRlIFUrMDA4NSBhcyBhIHdoaXRlc3BhY2UKICAgKiBjaGFyYWN0ZXIuIFdoZXRoZXIgaXQgaXMgdHJpbW1lZCBkZXBlbmRzIG9uIHRoZSBVbmljb2RlIHZlcnNpb24KICAgKiB1c2VkIGJ5IHRoZSBzeXN0ZW0uCiAgICovCiAgU3RyaW5nIHRyaW0oKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RyaW5nIHdpdGhvdXQgYW55IGxlYWRpbmcgd2hpdGVzcGFjZS4KICAgKgogICAqIEFzIFt0cmltXSwgYnV0IG9ubHkgcmVtb3ZlcyBsZWFkaW5nIHdoaXRlc3BhY2UuCiAgICovCiAgU3RyaW5nIHRyaW1MZWZ0KCk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHN0cmluZyB3aXRob3V0IGFueSB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAqCiAgICogQXMgW3RyaW1dLCBidXQgb25seSByZW1vdmVzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICovCiAgU3RyaW5nIHRyaW1SaWdodCgpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IHN0cmluZyBieSBjb25jYXRlbmF0aW5nIHRoaXMgc3RyaW5nIHdpdGggaXRzZWxmIGEgbnVtYmVyCiAgICogb2YgdGltZXMuCiAgICoKICAgKiBUaGUgcmVzdWx0IG9mIGBzdHIgKiBuYCBpcyBlcXVpdmFsZW50IHRvCiAgICogYHN0ciArIHN0ciArIC4uLmAobiB0aW1lcylgLi4uICsgc3RyYC4KICAgKgogICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIFt0aW1lc10gaXMgemVybyBvciBuZWdhdGl2ZS4KICAgKi8KICBTdHJpbmcgb3BlcmF0b3IgKihpbnQgdGltZXMpOwoKICAvKioKICAgKiBQYWRzIHRoaXMgc3RyaW5nIG9uIHRoZSBsZWZ0IGlmIGl0IGlzIHNob3J0ZXIgdGhhbiBbd2lkdGhdLgogICAqCiAgICogUmV0dXJuIGEgbmV3IHN0cmluZyB0aGF0IHByZXBlbmRzIFtwYWRkaW5nXSBvbnRvIHRoaXMgc3RyaW5nCiAgICogb25lIHRpbWUgZm9yIGVhY2ggcG9zaXRpb24gdGhlIGxlbmd0aCBpcyBsZXNzIHRoYW4gW3dpZHRoXS4KICAgKgogICAqIElmIFt3aWR0aF0gaXMgYWxyZWFkeSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gYHRoaXMubGVuZ3RoYCwKICAgKiBubyBwYWRkaW5nIGlzIGFkZGVkLiBBIG5lZ2F0aXZlIGB3aWR0aGAgaXMgdHJlYXRlZCBhcyB6ZXJvLgogICAqCiAgICogSWYgW3BhZGRpbmddIGhhcyBsZW5ndGggZGlmZmVyZW50IGZyb20gMSwgdGhlIHJlc3VsdCB3aWxsIG5vdAogICAqIGhhdmUgbGVuZ3RoIGB3aWR0aGAuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgdGhlCiAgICogcGFkZGluZyBpcyBhIGxvbmdlciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNoYXJhY3RlciwgbGlrZQogICAqIGAiJm5ic3A7ImAgb3IgYCJcdXsxMDAwMn1gIi4KICAgKiBJbiB0aGF0IGNhc2UsIHRoZSB1c2VyIHNob3VsZCBtYWtlIHN1cmUgdGhhdCBgdGhpcy5sZW5ndGhgIGlzCiAgICogdGhlIGNvcnJlY3QgbWVhc3VyZSBvZiB0aGUgc3RyaW5ncyBsZW5ndGguCiAgICovCiAgU3RyaW5nIHBhZExlZnQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKTsKCiAgLyoqCiAgICogUGFkcyB0aGlzIHN0cmluZyBvbiB0aGUgcmlnaHQgaWYgaXQgaXMgc2hvcnRlciB0aGFuIFt3aWR0aF0uCiAgICoKICAgKiBSZXR1cm4gYSBuZXcgc3RyaW5nIHRoYXQgYXBwZW5kcyBbcGFkZGluZ10gYWZ0ZXIgdGhpcyBzdHJpbmcKICAgKiBvbmUgdGltZSBmb3IgZWFjaCBwb3NpdGlvbiB0aGUgbGVuZ3RoIGlzIGxlc3MgdGhhbiBbd2lkdGhdLgogICAqCiAgICogSWYgW3dpZHRoXSBpcyBhbHJlYWR5IHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBgdGhpcy5sZW5ndGhgLAogICAqIG5vIHBhZGRpbmcgaXMgYWRkZWQuIEEgbmVnYXRpdmUgYHdpZHRoYCBpcyB0cmVhdGVkIGFzIHplcm8uCiAgICoKICAgKiBJZiBbcGFkZGluZ10gaGFzIGxlbmd0aCBkaWZmZXJlbnQgZnJvbSAxLCB0aGUgcmVzdWx0IHdpbGwgbm90CiAgICogaGF2ZSBsZW5ndGggYHdpZHRoYC4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBjYXNlcyB3aGVyZSB0aGUKICAgKiBwYWRkaW5nIGlzIGEgbG9uZ2VyIHN0cmluZyByZXByZXNlbnRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyLCBsaWtlCiAgICogYCImbmJzcDsiYCBvciBgIlx1ezEwMDAyfWAiLgogICAqIEluIHRoYXQgY2FzZSwgdGhlIHVzZXIgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IGB0aGlzLmxlbmd0aGAgaXMKICAgKiB0aGUgY29ycmVjdCBtZWFzdXJlIG9mIHRoZSBzdHJpbmdzIGxlbmd0aC4KICAgKi8KICBTdHJpbmcgcGFkUmlnaHQoaW50IHdpZHRoLCBbU3RyaW5nIHBhZGRpbmcgPSAnICddKTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyaW5nIGNvbnRhaW5zIGEgbWF0Y2ggb2YgW290aGVyXToKICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gJ0RhcnQgc3RyaW5ncyc7CiAgICogICAgIHN0cmluZy5jb250YWlucygnRCcpOyAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUKICAgKiAgICAgc3RyaW5nLmNvbnRhaW5zKG5ldyBSZWdFeHAocidbQS1aXScpKTsgICAgLy8gdHJ1ZQogICAqCiAgICogSWYgW3N0YXJ0SW5kZXhdIGlzIHByb3ZpZGVkLCB0aGlzIG1ldGhvZCBtYXRjaGVzIG9ubHkgYXQgb3IgYWZ0ZXIgdGhhdAogICAqIGluZGV4OgogICAqCiAgICogICAgIHN0cmluZy5jb250YWlucygnWCcsIDEpOyAgICAgICAgICAgICAgICAgIC8vIGZhbHNlCiAgICogICAgIHN0cmluZy5jb250YWlucyhuZXcgUmVnRXhwKHInW0EtWl0nKSwgMSk7IC8vIGZhbHNlCiAgICoKICAgKiBbc3RhcnRJbmRleF0gbXVzdCBub3QgYmUgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIFtsZW5ndGhdLgogICAqLwogIGJvb2wgY29udGFpbnMoUGF0dGVybiBvdGhlciwgW2ludCBzdGFydEluZGV4ID0gMF0pOwoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyBpbiB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBbZnJvbV0gaW4gdGhpcyBzdHJpbmcKICAgKiBpcyByZXBsYWNlZCB3aXRoIFt0b10sIHN0YXJ0aW5nIGZyb20gW3N0YXJ0SW5kZXhdOgogICAqCiAgICogICAgICcwLjAwMDEnLnJlcGxhY2VGaXJzdChuZXcgUmVnRXhwKHInMCcpLCAnJyk7IC8vICcuMDAwMScKICAgKiAgICAgJzAuMDAwMScucmVwbGFjZUZpcnN0KG5ldyBSZWdFeHAocicwJyksICc3JywgMSk7IC8vICcwLjcwMDEnCiAgICovCiAgU3RyaW5nIHJlcGxhY2VGaXJzdChQYXR0ZXJuIGZyb20sIFN0cmluZyB0bywgW2ludCBzdGFydEluZGV4ID0gMF0pOwoKICAvKioKICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFtmcm9tXSBpbiB0aGlzIHN0cmluZy4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyaW5nLCB3aGljaCBpcyB0aGlzIHN0cmluZwogICAqIGV4Y2VwdCB0aGF0IHRoZSBmaXJzdCBtYXRjaCBvZiBbZnJvbV0sIHN0YXJ0aW5nIGZyb20gW3N0YXJ0SW5kZXhdLAogICAqIGlzIHJlcGxhY2VkIGJ5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBbcmVwbGFjZV0gd2l0aCB0aGUgbWF0Y2ggb2JqZWN0LgogICAqCiAgICogVGhlIG9wdGlvbmFsIFtzdGFydEluZGV4XSBpcyBieSBkZWZhdWx0IHNldCB0byAwLiBJZiBwcm92aWRlZCwgaXQgbXVzdCBiZQogICAqIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIGBbMCAuLiBsZW5dYCwgd2hlcmUgYGxlbmAgaXMgdGhpcyBzdHJpbmcncyBsZW5ndGguCiAgICovCiAgU3RyaW5nIHJlcGxhY2VGaXJzdE1hcHBlZChQYXR0ZXJuIGZyb20sIFN0cmluZyByZXBsYWNlKE1hdGNoIG1hdGNoKSwKICAgICAgW2ludCBzdGFydEluZGV4ID0gMF0pOwoKICAvKioKICAgKiBSZXBsYWNlcyBhbGwgc3Vic3RyaW5ncyB0aGF0IG1hdGNoIFtmcm9tXSB3aXRoIFtyZXBsYWNlXS4KICAgKgogICAqIFJldHVybnMgYSBuZXcgc3RyaW5nIGluIHdoaWNoIHRoZSBub24tb3ZlcmxhcHBpbmcgc3Vic3RyaW5ncyBtYXRjaGluZwogICAqIFtmcm9tXSAodGhlIG9uZXMgaXRlcmF0ZWQgYnkgYGZyb20uYWxsTWF0Y2hlcyh0aGlzU3RyaW5nKWApIGFyZSByZXBsYWNlZAogICAqIGJ5IHRoZSBsaXRlcmFsIHN0cmluZyBbcmVwbGFjZV0uCiAgICoKICAgKiAgICAgJ3Jlc3VtZScucmVwbGFjZUFsbChuZXcgUmVnRXhwKHInZScpLCAnw6knKTsgLy8gJ3LDqXN1bcOpJwogICAqCiAgICogTm90aWNlIHRoYXQgdGhlIFtyZXBsYWNlXSBzdHJpbmcgaXMgbm90IGludGVycHJldGVkLiBJZiB0aGUgcmVwbGFjZW1lbnQKICAgKiBkZXBlbmRzIG9uIHRoZSBtYXRjaCAoZm9yIGV4YW1wbGUgb24gYSBbUmVnRXhwXSdzIGNhcHR1cmUgZ3JvdXBzKSwgdXNlCiAgICogdGhlIFtyZXBsYWNlQWxsTWFwcGVkXSBtZXRob2QgaW5zdGVhZC4KICAgKi8KICBTdHJpbmcgcmVwbGFjZUFsbChQYXR0ZXJuIGZyb20sIFN0cmluZyByZXBsYWNlKTsKCiAgLyoqCiAgICogUmVwbGFjZSBhbGwgc3Vic3RyaW5ncyB0aGF0IG1hdGNoIFtmcm9tXSBieSBhIHN0cmluZyBjb21wdXRlZCBmcm9tIHRoZQogICAqIG1hdGNoLgogICAqCiAgICogUmV0dXJucyBhIG5ldyBzdHJpbmcgaW4gd2hpY2ggdGhlIG5vbi1vdmVybGFwcGluZyBzdWJzdHJpbmdzIHRoYXQgbWF0Y2gKICAgKiBbZnJvbV0gKHRoZSBvbmVzIGl0ZXJhdGVkIGJ5IGBmcm9tLmFsbE1hdGNoZXModGhpc1N0cmluZylgKSBhcmUgcmVwbGFjZWQKICAgKiBieSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgW3JlcGxhY2VdIG9uIHRoZSBjb3JyZXNwb25kaW5nIFtNYXRjaF0gb2JqZWN0LgogICAqCiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byByZXBsYWNlIG1hdGNoZXMgd2l0aCBuZXcgY29udGVudCB0aGF0IGRlcGVuZHMgb24gdGhlCiAgICogbWF0Y2gsIHVubGlrZSBbcmVwbGFjZUFsbF0gd2hlcmUgdGhlIHJlcGxhY2VtZW50IHN0cmluZyBpcyBhbHdheXMgdGhlIHNhbWUuCiAgICoKICAgKiBUaGUgW3JlcGxhY2VdIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBbTWF0Y2hdIGdlbmVyYXRlZAogICAqIGJ5IHRoZSBwYXR0ZXJuLCBhbmQgaXRzIHJlc3VsdCBpcyB1c2VkIGFzIHJlcGxhY2VtZW50LgogICAqCiAgICogVGhlIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cgY29udmVydHMgZWFjaCB3b3JkIGluIGEgc3RyaW5nIHRvIHNpbXBsaWZpZWQKICAgKiAncGlnIGxhdGluJyB1c2luZyBbcmVwbGFjZUFsbE1hcHBlZF06CiAgICoKICAgKiAgICAgcGlnTGF0aW4oU3RyaW5nIHdvcmRzKSA9PiB3b3Jkcy5yZXBsYWNlQWxsTWFwcGVkKAogICAqICAgICAgICAgbmV3IFJlZ0V4cChyJ1xiKFx3Kj8pKFthZWlvdV1cdyopJywgY2FzZVNlbnNpdGl2ZTogZmFsc2UpLAogICAqICAgICAgICAgKE1hdGNoIG0pID0+ICIke21bMl19JHttWzFdfSR7bVsxXS5pc0VtcHR5ID8gJ3dheScgOiAnYXknfSIpOwogICAqCiAgICogICAgIHBpZ0xhdGluKCdJIGhhdmUgYSBzZWNyZXQgbm93IScpOyAvLyAnSXdheSBhdmVoYXkgYXdheSBlY3JldHNheSBvd25heSEnCiAgICovCiAgU3RyaW5nIHJlcGxhY2VBbGxNYXBwZWQoUGF0dGVybiBmcm9tLCBTdHJpbmcgcmVwbGFjZShNYXRjaCBtYXRjaCkpOwoKICAvKioKICAgKiBSZXBsYWNlcyB0aGUgc3Vic3RyaW5nIGZyb20gW3N0YXJ0XSB0byBbZW5kXSB3aXRoIFtyZXBsYWNlbWVudF0uCiAgICoKICAgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyBlcXVpdmFsZW50IHRvOgogICAqCiAgICogICAgIHRoaXMuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIHJlcGxhY2VtZW50ICsgdGhpcy5zdWJzdHJpbmcoZW5kKQogICAqCiAgICogVGhlIFtzdGFydF0gYW5kIFtlbmRdIGluZGljZXMgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgcmFuZ2Ugb2YgdGhpcyBzdHJpbmcuCiAgICogVGhhdCBpcyBgMCA8PSBzdGFydCA8PSBlbmQgPD0gdGhpcy5sZW5ndGhgLgogICAqIElmIFtlbmRdIGlzIGBudWxsYCwgaXQgZGVmYXVsdHMgdG8gW2xlbmd0aF0uCiAgICovCiAgU3RyaW5nIHJlcGxhY2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyByZXBsYWNlbWVudCk7CgogIC8qKgogICAqIFNwbGl0cyB0aGUgc3RyaW5nIGF0IG1hdGNoZXMgb2YgW3BhdHRlcm5dIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBzdWJzdHJpbmdzLgogICAqCiAgICogRmluZHMgYWxsIHRoZSBtYXRjaGVzIG9mIGBwYXR0ZXJuYCBpbiB0aGlzIHN0cmluZywKICAgKiBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgc3Vic3RyaW5ncyBiZXR3ZWVuIHRoZSBtYXRjaGVzLgogICAqCiAgICogICAgIHZhciBzdHJpbmcgPSAiSGVsbG8gd29ybGQhIjsKICAgKiAgICAgc3RyaW5nLnNwbGl0KCIgIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIFsnSGVsbG8nLCAnd29ybGQhJ107CiAgICoKICAgKiBFbXB0eSBtYXRjaGVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgc3RyaW5ncyBhcmUgaWdub3JlZCwKICAgKiBhbmQgc28gYXJlIGVtcHR5IG1hdGNoZXMgcmlnaHQgYWZ0ZXIgYW5vdGhlciBtYXRjaC4KICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gImFiYmEiOwogICAqICAgICBzdHJpbmcuc3BsaXQobmV3IFJlZ0V4cChyImIqIikpOyAgICAgICAgLy8gWydhJywgJ2EnXQogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IFsnJywgJ2EnLCAnYScsICcnXQogICAqCiAgICogSWYgdGhpcyBzdHJpbmcgaXMgZW1wdHksIHRoZSByZXN1bHQgaXMgYW4gZW1wdHkgbGlzdCBpZiBgcGF0dGVybmAgbWF0Y2hlcwogICAqIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBpdCBpcyBgWyIiXWAgaWYgdGhlIHBhdHRlcm4gZG9lc24ndCBtYXRjaC4KICAgKgogICAqICAgICB2YXIgc3RyaW5nID0gJyc7CiAgICogICAgIHN0cmluZy5zcGxpdCgnJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbXQogICAqICAgICBzdHJpbmcuc3BsaXQoImEiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gWycnXQogICAqCiAgICogU3BsaXR0aW5nIHdpdGggYW4gZW1wdHkgcGF0dGVybiBzcGxpdHMgdGhlIHN0cmluZyBpbnRvIHNpbmdsZS1jb2RlIHVuaXQKICAgKiBzdHJpbmdzLgogICAqCiAgICogICAgIHZhciBzdHJpbmcgPSAnUHViJzsKICAgKiAgICAgc3RyaW5nLnNwbGl0KCcnKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFsnUCcsICd1JywgJ2InXQogICAqCiAgICogICAgIHN0cmluZy5jb2RlVW5pdHMubWFwKCh1bml0KSB7CiAgICogICAgICAgcmV0dXJuIG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaXQpOwogICAqICAgICB9KS50b0xpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWydQJywgJ3UnLCAnYiddCiAgICoKICAgKiBTcGxpdHRpbmcgaGFwcGVucyBhdCBVVEYtMTYgY29kZSB1bml0IGJvdW5kYXJpZXMsCiAgICogYW5kIG5vdCBhdCBydW5lIGJvdW5kYXJpZXM6CiAgICoKICAgKiAgICAgLy8gU3RyaW5nIG1hZGUgdXAgb2YgdHdvIGNvZGUgdW5pdHMsIGJ1dCBvbmUgcnVuZS4KICAgKiAgICAgc3RyaW5nID0gJ1x1ezFEMTFFfSc7CiAgICogICAgIHN0cmluZy5zcGxpdCgnJykubGVuZ3RoOyAgICAgICAgICAgICAgICAgLy8gMiBzdXJyb2dhdGUgdmFsdWVzCiAgICoKICAgKiBUbyBnZXQgYSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgaW5kaXZpZHVhbCBydW5lcyBvZiBhIHN0cmluZywKICAgKiB5b3Ugc2hvdWxkIG5vdCB1c2Ugc3BsaXQuIFlvdSBjYW4gaW5zdGVhZCBtYXAgZWFjaCBydW5lIHRvIGEgc3RyaW5nCiAgICogYXMgZm9sbG93czoKICAgKgogICAqICAgICBzdHJpbmcucnVuZXMubWFwKChydW5lKSA9PiBuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShydW5lKSkudG9MaXN0KCk7CiAgICovCiAgTGlzdDxTdHJpbmc+IHNwbGl0KFBhdHRlcm4gcGF0dGVybik7CgogIC8qKgogICAqIFNwbGl0cyB0aGUgc3RyaW5nLCBjb252ZXJ0cyBpdHMgcGFydHMsIGFuZCBjb21iaW5lcyB0aGVtIGludG8gYSBuZXcKICAgKiBzdHJpbmcuCiAgICoKICAgKiBbcGF0dGVybl0gaXMgdXNlZCB0byBzcGxpdCB0aGUgc3RyaW5nIGludG8gcGFydHMgYW5kIHNlcGFyYXRpbmcgbWF0Y2hlcy4KICAgKgogICAqIEVhY2ggbWF0Y2ggaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGJ5IGNhbGxpbmcgW29uTWF0Y2hdLiBJZiBbb25NYXRjaF0KICAgKiBpcyBvbWl0dGVkLCB0aGUgbWF0Y2hlZCBzdHJpbmcgaXMgdXNlZC4KICAgKgogICAqIEVhY2ggbm9uLW1hdGNoZWQgcGFydCBpcyBjb252ZXJ0ZWQgYnkgYSBjYWxsIHRvIFtvbk5vbk1hdGNoXS4gSWYKICAgKiBbb25Ob25NYXRjaF0gaXMgb21pdHRlZCwgdGhlIG5vbi1tYXRjaGluZyBwYXJ0IGlzIHVzZWQuCiAgICoKICAgKiBUaGVuIGFsbCB0aGUgY29udmVydGVkIHBhcnRzIGFyZSBjb21iaW5lZCBpbnRvIHRoZSByZXN1bHRpbmcgc3RyaW5nLgogICAqCiAgICogICAgICdFYXRzIHNob290cyBsZWF2ZXMnLnNwbGl0TWFwSm9pbigobmV3IFJlZ0V4cChyJ3Nob290cycpKSwKICAgKiAgICAgICAgIG9uTWF0Y2g6ICAgIChtKSA9PiAnJHttLmdyb3VwKDApfScsCiAgICogICAgICAgICBvbk5vbk1hdGNoOiAobikgPT4gJyonKTsgLy8gKnNob290cyoKICAgKi8KICBTdHJpbmcgc3BsaXRNYXBKb2luKFBhdHRlcm4gcGF0dGVybiwKICAgICAge1N0cmluZyBvbk1hdGNoKE1hdGNoIG1hdGNoKSwgU3RyaW5nIG9uTm9uTWF0Y2goU3RyaW5nIG5vbk1hdGNoKX0pOwoKICAvKioKICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIHRoZSBVVEYtMTYgY29kZSB1bml0cyBvZiB0aGlzIHN0cmluZy4KICAgKi8KICBMaXN0PGludD4gZ2V0IGNvZGVVbml0czsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBbSXRlcmFibGVdIG9mIFVuaWNvZGUgY29kZS1wb2ludHMgb2YgdGhpcyBzdHJpbmcuCiAgICoKICAgKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIHN1cnJvZ2F0ZSBwYWlycywgdGhleSBhcmUgY29tYmluZWQgYW5kIHJldHVybmVkCiAgICogYXMgb25lIGludGVnZXIgYnkgdGhpcyBpdGVyYXRvci4gVW5tYXRjaGVkIHN1cnJvZ2F0ZSBoYWx2ZXMgYXJlIHRyZWF0ZWQKICAgKiBsaWtlIHZhbGlkIDE2LWJpdCBjb2RlLXVuaXRzLgogICAqLwogIFJ1bmVzIGdldCBydW5lczsKCiAgLyoqCiAgICogQ29udmVydHMgYWxsIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcgdG8gbG93ZXIgY2FzZS4KICAgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgaW4gYWxsIGxvd2VyIGNhc2UsIHRoaXMgbWV0aG9kIHJldHVybnMgWzp0aGlzOl0uCiAgICoKICAgKiAgICAgJ0FMUEhBQkVUJy50b0xvd2VyQ2FzZSgpOyAvLyAnYWxwaGFiZXQnCiAgICogICAgICdhYmMnLnRvTG93ZXJDYXNlKCk7ICAgICAgLy8gJ2FiYycKICAgKgogICAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgVW5pY29kZSBtYXBwaW5nIGFuZCB0aHVzIG9ubHkKICAgKiB3b3JrcyBpbiBzb21lIGxhbmd1YWdlcy4KICAgKi8KICAvLyBUT0RPKGZsb2l0c2NoKTogZG9jdW1lbnQgYmV0dGVyLiAoU2VlIEVjbWFTY3JpcHQgZm9yIGRlc2NyaXB0aW9uKS4KICBTdHJpbmcgdG9Mb3dlckNhc2UoKTsKCiAgLyoqCiAgICogQ29udmVydHMgYWxsIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJpbmcgdG8gdXBwZXIgY2FzZS4KICAgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgaW4gYWxsIHVwcGVyIGNhc2UsIHRoaXMgbWV0aG9kIHJldHVybnMgWzp0aGlzOl0uCiAgICoKICAgKiAgICAgJ2FscGhhYmV0Jy50b1VwcGVyQ2FzZSgpOyAvLyAnQUxQSEFCRVQnCiAgICogICAgICdBQkMnLnRvVXBwZXJDYXNlKCk7ICAgICAgLy8gJ0FCQycKICAgKgogICAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgVW5pY29kZSBtYXBwaW5nIGFuZCB0aHVzIG9ubHkKICAgKiB3b3JrcyBpbiBzb21lIGxhbmd1YWdlcy4KICAgKi8KICAvLyBUT0RPKGZsb2l0c2NoKTogZG9jdW1lbnQgYmV0dGVyLiAoU2VlIEVjbWFTY3JpcHQgZm9yIGRlc2NyaXB0aW9uKS4KICBTdHJpbmcgdG9VcHBlckNhc2UoKTsKfQoKLyoqCiAqIFRoZSBydW5lcyAoaW50ZWdlciBVbmljb2RlIGNvZGUgcG9pbnRzKSBvZiBhIFtTdHJpbmddLgogKi8KY2xhc3MgUnVuZXMgZXh0ZW5kcyBJdGVyYWJsZTxpbnQ+IHsKICBmaW5hbCBTdHJpbmcgc3RyaW5nOwogIFJ1bmVzKHRoaXMuc3RyaW5nKTsKCiAgUnVuZUl0ZXJhdG9yIGdldCBpdGVyYXRvciA9PiBSdW5lSXRlcmF0b3Ioc3RyaW5nKTsKCiAgaW50IGdldCBsYXN0IHsKICAgIGlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcignTm8gZWxlbWVudHMuJyk7CiAgICB9CiAgICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgIGludCBjb2RlID0gc3RyaW5nLmNvZGVVbml0QXQobGVuZ3RoIC0gMSk7CiAgICBpZiAoX2lzVHJhaWxTdXJyb2dhdGUoY29kZSkgJiYgc3RyaW5nLmxlbmd0aCA+IDEpIHsKICAgICAgaW50IHByZXZpb3VzQ29kZSA9IHN0cmluZy5jb2RlVW5pdEF0KGxlbmd0aCAtIDIpOwogICAgICBpZiAoX2lzTGVhZFN1cnJvZ2F0ZShwcmV2aW91c0NvZGUpKSB7CiAgICAgICAgcmV0dXJuIF9jb21iaW5lU3Vycm9nYXRlUGFpcihwcmV2aW91c0NvZGUsIGNvZGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9Cn0KCi8vIElzIHRoZW4gY29kZSAoYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcikgYSBVVEYtMTYgbGVhZCBzdXJyb2dhdGUuCmJvb2wgX2lzTGVhZFN1cnJvZ2F0ZShpbnQgY29kZSkgPT4gKGNvZGUgJiAweEZDMDApID09IDB4RDgwMDsKCi8vIElzIHRoZW4gY29kZSAoYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcikgYSBVVEYtMTYgdHJhaWwgc3Vycm9nYXRlLgpib29sIF9pc1RyYWlsU3Vycm9nYXRlKGludCBjb2RlKSA9PiAoY29kZSAmIDB4RkMwMCkgPT0gMHhEQzAwOwoKLy8gQ29tYmluZSBhIGxlYWQgYW5kIGEgdHJhaWwgc3Vycm9nYXRlIHZhbHVlIGludG8gYSBzaW5nbGUgY29kZSBwb2ludC4KaW50IF9jb21iaW5lU3Vycm9nYXRlUGFpcihpbnQgc3RhcnQsIGludCBlbmQpIHsKICByZXR1cm4gMHgxMDAwMCArICgoc3RhcnQgJiAweDNGRikgPDwgMTApICsgKGVuZCAmIDB4M0ZGKTsKfQoKLyoqIFtJdGVyYXRvcl0gZm9yIHJlYWRpbmcgcnVuZXMgKGludGVnZXIgVW5pY29kZSBjb2RlIHBvaW50cykgb3V0IG9mIGEgRGFydAogICogc3RyaW5nLgogICovCmNsYXNzIFJ1bmVJdGVyYXRvciBpbXBsZW1lbnRzIEJpZGlyZWN0aW9uYWxJdGVyYXRvcjxpbnQ+IHsKICAvKiogU3RyaW5nIGJlaW5nIGl0ZXJhdGVkLiAqLwogIGZpbmFsIFN0cmluZyBzdHJpbmc7CiAgLyoqIFBvc2l0aW9uIGJlZm9yZSB0aGUgY3VycmVudCBjb2RlIHBvaW50LiAqLwogIGludCBfcG9zaXRpb247CiAgLyoqIFBvc2l0aW9uIGFmdGVyIHRoZSBjdXJyZW50IGNvZGUgcG9pbnQuICovCiAgaW50IF9uZXh0UG9zaXRpb247CiAgLyoqCiAgICogQ3VycmVudCBjb2RlIHBvaW50LgogICAqCiAgICogSWYgdGhlIGl0ZXJhdG9yIGhhcyBoaXQgZWl0aGVyIGVuZCwgdGhlIFtfY3VycmVudENvZGVQb2ludF0gaXMgbnVsbAogICAqIGFuZCBbOiBfcG9zaXRpb24gPT0gX25leHRQb3NpdGlvbiA6XS4KICAgKi8KICBpbnQgX2N1cnJlbnRDb2RlUG9pbnQ7CgogIC8qKiBDcmVhdGUgYW4gaXRlcmF0b3IgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuICovCiAgUnVuZUl0ZXJhdG9yKFN0cmluZyBzdHJpbmcpCiAgICAgIDogdGhpcy5zdHJpbmcgPSBzdHJpbmcsCiAgICAgICAgX3Bvc2l0aW9uID0gMCwKICAgICAgICBfbmV4dFBvc2l0aW9uID0gMDsKCiAgLyoqCiAgICogQ3JlYXRlIGFuIGl0ZXJhdG9yIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBbaW5kZXhddGggY29kZSB1bml0IG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBXaGVuIGNyZWF0ZWQsIHRoZXJlIGlzIG5vIFtjdXJyZW50XSB2YWx1ZS4KICAgKiBBIFttb3ZlTmV4dF0gd2lsbCB1c2UgdGhlIHJ1bmUgc3RhcnRpbmcgYXQgW2luZGV4XSB0aGUgY3VycmVudCB2YWx1ZSwKICAgKiBhbmQgYSBbbW92ZVByZXZpb3VzXSB3aWxsIHVzZSB0aGUgcnVuZSBlbmRpbmcganVzdCBiZWZvcmUgW2luZGV4XSBhcyB0aGUKICAgKiB0aGUgY3VycmVudCB2YWx1ZS4KICAgKgogICAqIFRoZSBbaW5kZXhdIHBvc2l0aW9uIG11c3Qgbm90IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpci4KICAgKi8KICBSdW5lSXRlcmF0b3IuYXQoU3RyaW5nIHN0cmluZywgaW50IGluZGV4KQogICAgICA6IHN0cmluZyA9IHN0cmluZywKICAgICAgICBfcG9zaXRpb24gPSBpbmRleCwKICAgICAgICBfbmV4dFBvc2l0aW9uID0gaW5kZXggewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbChpbmRleCwgMCwgc3RyaW5nLmxlbmd0aCk7CiAgICBfY2hlY2tTcGxpdFN1cnJvZ2F0ZShpbmRleCk7CiAgfQoKICAvKiogVGhyb3cgYW4gZXJyb3IgaWYgdGhlIGluZGV4IGlzIGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpci4gKi8KICB2b2lkIF9jaGVja1NwbGl0U3Vycm9nYXRlKGludCBpbmRleCkgewogICAgaWYgKGluZGV4ID4gMCAmJgogICAgICAgIGluZGV4IDwgc3RyaW5nLmxlbmd0aCAmJgogICAgICAgIF9pc0xlYWRTdXJyb2dhdGUoc3RyaW5nLmNvZGVVbml0QXQoaW5kZXggLSAxKSkgJiYKICAgICAgICBfaXNUcmFpbFN1cnJvZ2F0ZShzdHJpbmcuY29kZVVuaXRBdChpbmRleCkpKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0luZGV4IGluc2lkZSBzdXJyb2dhdGUgcGFpcjogJGluZGV4Jyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBydW5lIGluIHRoZSBzdHJpbmcuCiAgICoKICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIFtjdXJyZW50XSBydW5lIGlzIG51bGwuCiAgICovCiAgaW50IGdldCByYXdJbmRleCA9PiAoX3Bvc2l0aW9uICE9IF9uZXh0UG9zaXRpb24pID8gX3Bvc2l0aW9uIDogbnVsbDsKCiAgLyoqCiAgICogUmVzZXRzIHRoZSBpdGVyYXRvciB0byB0aGUgcnVuZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBTZXR0aW5nIGEgbmVnYXRpdmUgW3Jhd0luZGV4XSwgb3Igb25lIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bwogICAqIFs6c3RyaW5nLmxlbmd0aDpdLAogICAqIGlzIGFuIGVycm9yLiBTbyBpcyBzZXR0aW5nIGl0IGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpci4KICAgKgogICAqIFNldHRpbmcgdGhlIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlbiBzdHJpbmcgd2lsbCBzZXQgW2N1cnJlbnRdIHRvIG51bGwuCiAgICovCiAgdm9pZCBzZXQgcmF3SW5kZXgoaW50IHJhd0luZGV4KSB7CiAgICBSYW5nZUVycm9yLmNoZWNrVmFsaWRJbmRleChyYXdJbmRleCwgc3RyaW5nLCAicmF3SW5kZXgiKTsKICAgIHJlc2V0KHJhd0luZGV4KTsKICAgIG1vdmVOZXh0KCk7CiAgfQoKICAvKioKICAgKiBSZXNldHMgdGhlIGl0ZXJhdG9yIHRvIHRoZSBnaXZlbiBpbmRleCBpbnRvIHRoZSBzdHJpbmcuCiAgICoKICAgKiBBZnRlciB0aGlzIHRoZSBbY3VycmVudF0gdmFsdWUgaXMgdW5zZXQuCiAgICogWW91IG11c3QgY2FsbCBbbW92ZU5leHRdIG1ha2UgdGhlIHJ1bmUgYXQgdGhlIHBvc2l0aW9uIGN1cnJlbnQsCiAgICogb3IgW21vdmVQcmV2aW91c10gZm9yIHRoZSBsYXN0IHJ1bmUgYmVmb3JlIHRoZSBwb3NpdGlvbi4KICAgKgogICAqIFNldHRpbmcgYSBuZWdhdGl2ZSBbcmF3SW5kZXhdLCBvciBvbmUgZ3JlYXRlciB0aGFuIFs6c3RyaW5nLmxlbmd0aDpdLAogICAqIGlzIGFuIGVycm9yLiBTbyBpcyBzZXR0aW5nIGl0IGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpci4KICAgKi8KICB2b2lkIHJlc2V0KFtpbnQgcmF3SW5kZXggPSAwXSkgewogICAgUmFuZ2VFcnJvci5jaGVja1ZhbHVlSW5JbnRlcnZhbChyYXdJbmRleCwgMCwgc3RyaW5nLmxlbmd0aCwgInJhd0luZGV4Iik7CiAgICBfY2hlY2tTcGxpdFN1cnJvZ2F0ZShyYXdJbmRleCk7CiAgICBfcG9zaXRpb24gPSBfbmV4dFBvc2l0aW9uID0gcmF3SW5kZXg7CiAgICBfY3VycmVudENvZGVQb2ludCA9IG51bGw7CiAgfQoKICAvKiogVGhlIHJ1bmUgKGludGVnZXIgVW5pY29kZSBjb2RlIHBvaW50KSBzdGFydGluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbgogICAqICB0aGUgc3RyaW5nLgogICAqLwogIGludCBnZXQgY3VycmVudCA9PiBfY3VycmVudENvZGVQb2ludDsKCiAgLyoqCiAgICogVGhlIG51bWJlciBvZiBjb2RlIHVuaXRzIGNvbXByaXNpbmcgdGhlIGN1cnJlbnQgcnVuZS4KICAgKgogICAqIFJldHVybnMgemVybyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHJ1bmUgKFtjdXJyZW50XSBpcyBudWxsKS4KICAgKi8KICBpbnQgZ2V0IGN1cnJlbnRTaXplID0+IF9uZXh0UG9zaXRpb24gLSBfcG9zaXRpb247CgogIC8qKgogICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgcnVuZS4KICAgKgogICAqIEZvciBydW5lcyBvdXRzaWRlIHRoZSBiYXNpYyBtdWx0aWxpbmd1YWwgcGxhbmUsIHRoaXMgd2lsbCBiZQogICAqIGEgU3RyaW5nIG9mIGxlbmd0aCAyLCBjb250YWluaW5nIHR3byBjb2RlIHVuaXRzLgogICAqCiAgICogUmV0dXJucyBudWxsIGlmIFtjdXJyZW50XSBpcyBudWxsLgogICAqLwogIFN0cmluZyBnZXQgY3VycmVudEFzU3RyaW5nIHsKICAgIGlmIChfcG9zaXRpb24gPT0gX25leHRQb3NpdGlvbikgcmV0dXJuIG51bGw7CiAgICBpZiAoX3Bvc2l0aW9uICsgMSA9PSBfbmV4dFBvc2l0aW9uKSByZXR1cm4gc3RyaW5nW19wb3NpdGlvbl07CiAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhfcG9zaXRpb24sIF9uZXh0UG9zaXRpb24pOwogIH0KCiAgYm9vbCBtb3ZlTmV4dCgpIHsKICAgIF9wb3NpdGlvbiA9IF9uZXh0UG9zaXRpb247CiAgICBpZiAoX3Bvc2l0aW9uID09IHN0cmluZy5sZW5ndGgpIHsKICAgICAgX2N1cnJlbnRDb2RlUG9pbnQgPSBudWxsOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpbnQgY29kZVVuaXQgPSBzdHJpbmcuY29kZVVuaXRBdChfcG9zaXRpb24pOwogICAgaW50IG5leHRQb3NpdGlvbiA9IF9wb3NpdGlvbiArIDE7CiAgICBpZiAoX2lzTGVhZFN1cnJvZ2F0ZShjb2RlVW5pdCkgJiYgbmV4dFBvc2l0aW9uIDwgc3RyaW5nLmxlbmd0aCkgewogICAgICBpbnQgbmV4dENvZGVVbml0ID0gc3RyaW5nLmNvZGVVbml0QXQobmV4dFBvc2l0aW9uKTsKICAgICAgaWYgKF9pc1RyYWlsU3Vycm9nYXRlKG5leHRDb2RlVW5pdCkpIHsKICAgICAgICBfbmV4dFBvc2l0aW9uID0gbmV4dFBvc2l0aW9uICsgMTsKICAgICAgICBfY3VycmVudENvZGVQb2ludCA9IF9jb21iaW5lU3Vycm9nYXRlUGFpcihjb2RlVW5pdCwgbmV4dENvZGVVbml0KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgX25leHRQb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKICAgIF9jdXJyZW50Q29kZVBvaW50ID0gY29kZVVuaXQ7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGJvb2wgbW92ZVByZXZpb3VzKCkgewogICAgX25leHRQb3NpdGlvbiA9IF9wb3NpdGlvbjsKICAgIGlmIChfcG9zaXRpb24gPT0gMCkgewogICAgICBfY3VycmVudENvZGVQb2ludCA9IG51bGw7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGludCBwb3NpdGlvbiA9IF9wb3NpdGlvbiAtIDE7CiAgICBpbnQgY29kZVVuaXQgPSBzdHJpbmcuY29kZVVuaXRBdChwb3NpdGlvbik7CiAgICBpZiAoX2lzVHJhaWxTdXJyb2dhdGUoY29kZVVuaXQpICYmIHBvc2l0aW9uID4gMCkgewogICAgICBpbnQgcHJldkNvZGVVbml0ID0gc3RyaW5nLmNvZGVVbml0QXQocG9zaXRpb24gLSAxKTsKICAgICAgaWYgKF9pc0xlYWRTdXJyb2dhdGUocHJldkNvZGVVbml0KSkgewogICAgICAgIF9wb3NpdGlvbiA9IHBvc2l0aW9uIC0gMTsKICAgICAgICBfY3VycmVudENvZGVQb2ludCA9IF9jb21iaW5lU3Vycm9nYXRlUGFpcihwcmV2Q29kZVVuaXQsIGNvZGVVbml0KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgX3Bvc2l0aW9uID0gcG9zaXRpb247CiAgICBfY3VycmVudENvZGVQb2ludCA9IGNvZGVVbml0OwogICAgcmV0dXJuIHRydWU7CiAgfQp9CoM/AE5OPAETAQQkA1BHTUtQUCYDR01KAxgYKysDDBESAwsPERIDT0MDIy8DPwMzA0ADMgNCUAMcSwNGQwMYIzMDSw0DJANMTUtOAzQDSkk9UE4zAx8zLANMIAMWA0cuAw0DRiZ4BD8GOwVQJAUwBUsVBTknJwVGRy8uBkEhAQY6BVBKQRYFQQY2AQZFBU9MDAVJFQUhBU4FQAVRBkxMUCIoGj0eAQZPBU9JHAUhNC0tBSI4BiEBBj8GHQEGHwVISi0FJiYFISYmBhIBBkQFSywGFAEGTwVEMEw5BTIFRkomBiIBBiYFQzozBU4sLUJMHTYnBh8BBkEFJwYfAQZDBR4/PwVKNQU/PwU8BU1MLAVAPwY1AQZKJQUjOTkFJgU6BUEGLQEGUC4FIzo6BUAFOwVFBjEBBisGFAEGLwYXAQZFBSgGIwEGSioFIi4qBjQBBkUFUTUNMAk4DRgdJwlOOgVOCUsyOzs9QDtAQkY+BUYJSkUZBhEBBjgFNQYVAQY5BTYGFgEGTA8FLiwFPQYgAQZBBUJBBUNBBUNBRiJDMAY1AQZCBUJBBUNBBUNBRiJDMAY2AQY+BSY7OwVMDAU8PAVBBjYBBlE4BUFGBkYBBjwFMEhLBU9QBkcdAQY/BUtOJgVBBU1MLAYzAQZMDAVNTk0FTlEFQTwFTSsFO0hLBVEGRgEGRgUpBUYFTjEyBj8BBlEFOEEFJkkFSDkFHj9LBU9GBRo3OQVNDgUdRAUnMUQFNyEFPB9IBUtJEQVNBicBBkkNBU4FTC0FRj0FSgVEMTIGJ0oBBksGGwEGQgVMTSMGEwEGO08FMSwFTx4GSBgBBjtPBTEsBU8eBkgYAgEEOgQkFxYBNQERHigGIC44OCw6CAYRBAIBRT4BRj8BSDA8AgFNDAU7IBcxETAVBhkFSSsGGQFHHh4XGwEGUQUwS04YBUkGLBkbID4hBAFLKRUhOjdCBgQBBkYFMQZHAQZLBUQYRgVQBiQ+FRAEAQY9BS5FPgVLRgYjTSQqHgQBUBIGKAEGOwVDBjQBBisFQjYFKAYfMUI3BAEUHyYgFAYxJkY6LSpLFQgGIiIRBAEYHxogFAYiMDc6LCJLFQgGGiIRBAIBFWRhcnQ6Y29yZS9zdHJpbmcuZGFydDNvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9zdHJpbmdfYnVmZmVyLmRhcnSF6i8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpwYXJ0IG9mIGRhcnQuY29yZTsKCi8qKgogKiBBIGNsYXNzIGZvciBjb25jYXRlbmF0aW5nIHN0cmluZ3MgZWZmaWNpZW50bHkuCiAqCiAqIEFsbG93cyBmb3IgdGhlIGluY3JlbWVudGFsIGJ1aWxkaW5nIG9mIGEgc3RyaW5nIHVzaW5nIHdyaXRlKigpIG1ldGhvZHMuCiAqIFRoZSBzdHJpbmdzIGFyZSBjb25jYXRlbmF0ZWQgdG8gYSBzaW5nbGUgc3RyaW5nIG9ubHkgd2hlbiBbdG9TdHJpbmddIGlzCiAqIGNhbGxlZC4KICovCmNsYXNzIFN0cmluZ0J1ZmZlciBpbXBsZW1lbnRzIFN0cmluZ1NpbmsgewogIC8qKiBDcmVhdGVzIHRoZSBzdHJpbmcgYnVmZmVyIHdpdGggYW4gaW5pdGlhbCBjb250ZW50LiAqLwogIGV4dGVybmFsIFN0cmluZ0J1ZmZlcihbT2JqZWN0IGNvbnRlbnQgPSAiIl0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBhY2N1bXVsYXRlZCBzbyBmYXIuCiAgICogVGhpcyBpcyBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLgogICAqLwogIGV4dGVybmFsIGludCBnZXQgbGVuZ3RoOwoKICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBidWZmZXIgaXMgZW1wdHkuIFRoaXMgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbi4gKi8KICBib29sIGdldCBpc0VtcHR5ID0+IGxlbmd0aCA9PSAwOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBub3QgZW1wdHkuIFRoaXMgaXMgYSBjb25zdGFudC10aW1lCiAgICogb3BlcmF0aW9uLgogICAqLwogIGJvb2wgZ2V0IGlzTm90RW1wdHkgPT4gIWlzRW1wdHk7CgogIC8vLyBBZGRzIHRoZSBjb250ZW50cyBvZiBbb2JqXSwgY29udmVydGVkIHRvIGEgc3RyaW5nLCB0byB0aGUgYnVmZmVyLgogIGV4dGVybmFsIHZvaWQgd3JpdGUoT2JqZWN0IG9iaik7CgogIC8vLyBBZGRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgW2NoYXJDb2RlXSB0byB0aGUgYnVmZmVyLgogIGV4dGVybmFsIHZvaWQgd3JpdGVDaGFyQ29kZShpbnQgY2hhckNvZGUpOwoKICBleHRlcm5hbCB2b2lkIHdyaXRlQWxsKEl0ZXJhYmxlIG9iamVjdHMsIFtTdHJpbmcgc2VwYXJhdG9yID0gIiJdKTsKCiAgZXh0ZXJuYWwgdm9pZCB3cml0ZWxuKFtPYmplY3Qgb2JqID0gIiJdKTsKCiAgLyoqCiAgICogQ2xlYXJzIHRoZSBzdHJpbmcgYnVmZmVyLgogICAqLwogIGV4dGVybmFsIHZvaWQgY2xlYXIoKTsKCiAgLy8vIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBhcyBhIGNvbmNhdGVuYXRlZCBzdHJpbmcuCiAgZXh0ZXJuYWwgU3RyaW5nIHRvU3RyaW5nKCk7Cn0KNABOTjwBEwEEMgNLSwsEKzwwAQZJKAYbAVEjAQZGEAYjAUgjAUItAUUBLAEGHwYZAT8eAgEcZGFydDpjb3JlL3N0cmluZ19idWZmZXIuZGFydDhvcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3N0cmluZ19idWZmZXJfcGF0Y2guZGFydJZaLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIHBhcnQgb2YgImNvcmVfcGF0Y2guZGFydCI7CgpAcGF0Y2gKY2xhc3MgU3RyaW5nQnVmZmVyIHsKICBzdGF0aWMgY29uc3QgaW50IF9CVUZGRVJfU0laRSA9IDY0OwogIHN0YXRpYyBjb25zdCBpbnQgX1BBUlRTX1RPX0NPTVBBQ1QgPSAxMjg7CiAgc3RhdGljIGNvbnN0IGludCBfUEFSVFNfVE9fQ09NUEFDVF9TSVpFX0xJTUlUID0gX1BBUlRTX1RPX0NPTVBBQ1QgKiA4OwoKICAvKioKICAgKiBXaGVuIHN0cmluZ3MgYXJlIHdyaXR0ZW4gdG8gdGhlIHN0cmluZyBidWZmZXIsIHdlIGFkZCB0aGVtIHRvIGEKICAgKiBsaXN0IG9mIHN0cmluZyBwYXJ0cy4KICAgKi8KICBMaXN0PFN0cmluZz4gX3BhcnRzOwoKICAvKioKICAgICogVG90YWwgbnVtYmVyIG9mIGNvZGUgdW5pdHMgaW4gdGhlIHN0cmluZyBwYXJ0cy4gRG9lcyBub3QgaW5jbHVkZQogICAgKiB0aGUgY29kZSB1bml0cyBhZGRlZCB0byB0aGUgYnVmZmVyLgogICAgKi8KICBpbnQgX3BhcnRzQ29kZVVuaXRzID0gMDsKCiAgLyoqCiAgICogVG8gcHJlc2VydmUgbWVtb3J5LCB3ZSBzb21ldGltZXMgY29tcGFjdCB0aGUgcGFydHMuIFRoaXMgY29tYmluZXMKICAgKiBzZXZlcmFsIHNtYWxsZXIgcGFydHMgaW50byBhIHNpbmdsZSBsYXJnZXIgcGFydCB0byBjdXQgZG93biBvbiB0aGUKICAgKiBjb3N0IHRoYXQgY29tZXMgZnJvbSB0aGUgcGVyLW9iamVjdCBtZW1vcnkgb3ZlcmhlYWQuIFdlIGtlZXAgdHJhY2sKICAgKiBvZiB0aGUgbGFzdCBpbmRleCB3aGVyZSB3ZSBlbmRlZCBvdXIgY29tcGFjdGlvbiBhbmQgdGhlIG51bWJlciBvZgogICAqIGNvZGUgdW5pdHMgYWRkZWQgc2luY2UgdGhlIGxhc3QgY29tcGFjdGlvbi4KICAgKi8KICBpbnQgX3BhcnRzQ29tcGFjdGlvbkluZGV4ID0gMDsKICBpbnQgX3BhcnRzQ29kZVVuaXRzU2luY2VDb21wYWN0aW9uID0gMDsKCiAgLyoqCiAgICogVGhlIGJ1ZmZlciBpcyB1c2VkIHRvIGJ1aWxkIHVwIGEgc3RyaW5nIGZyb20gY29kZSB1bml0cy4gSXQgaXMKICAgKiB1c2VkIHdoZW4gd3JpdGluZyBzaG9ydCBzdHJpbmdzIG9yIGluZGl2aWR1YWwgY2hhciBjb2RlcyB0byB0aGUKICAgKiBidWZmZXIuIFRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGRlbWFuZC4KICAgKi8KICBVaW50MTZMaXN0IF9idWZmZXI7CiAgaW50IF9idWZmZXJQb3NpdGlvbiA9IDA7CgogIC8qKgogICAqIENvbGxlY3RzIHRoZSBhcHByb3hpbWF0ZSBtYXhpbWFsIG1hZ25pdHVkZSBvZiB0aGUgY29kZSB1bml0cyBhZGRlZAogICAqIHRvIHRoZSBidWZmZXIuCiAgICoKICAgKiBUaGUgdmFsdWUgb2YgZWFjaCBhZGRlZCBjb2RlIHVuaXQgaXMgb3InZWQgd2l0aCB0aGlzIHZhcmlhYmxlLCBzbyB0aGUKICAgKiBtb3N0IHNpZ25pZmljYW50IGJpdCBzZXQgaW4gYW55IGNvZGUgdW5pdCBpcyBhbHNvIHNldCBpbiB0aGlzIHZhbHVlLgogICAqIElmIGJlbG93IDI1NiwgdGhlIHN0cmluZyBpbiB0aGUgYnVmZmVyIGlzIGEgTGF0aW4tMSBzdHJpbmcuCiAgICovCiAgaW50IF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSA9IDA7CgogIC8vLyBDcmVhdGVzIHRoZSBzdHJpbmcgYnVmZmVyIHdpdGggYW4gaW5pdGlhbCBjb250ZW50LgogIEBwYXRjaAogIFN0cmluZ0J1ZmZlcihbT2JqZWN0IGNvbnRlbnQgPSAiIl0pIHsKICAgIHdyaXRlKGNvbnRlbnQpOwogIH0KCiAgQHBhdGNoCiAgaW50IGdldCBsZW5ndGggPT4gX3BhcnRzQ29kZVVuaXRzICsgX2J1ZmZlclBvc2l0aW9uOwoKICBAcGF0Y2gKICB2b2lkIHdyaXRlKE9iamVjdCBvYmopIHsKICAgIFN0cmluZyBzdHIgPSAnJG9iaic7CiAgICBpZiAoc3RyLmlzRW1wdHkpIHJldHVybjsKICAgIF9jb25zdW1lQnVmZmVyKCk7CiAgICBfYWRkUGFydChzdHIpOwogIH0KCiAgQHBhdGNoCiAgdm9pZCB3cml0ZUNoYXJDb2RlKGludCBjaGFyQ29kZSkgewogICAgaWYgKGNoYXJDb2RlIDw9IDB4RkZGRikgewogICAgICBpZiAoY2hhckNvZGUgPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoY2hhckNvZGUsIDAsIDB4MTBGRkZGKTsKICAgICAgfQogICAgICBfZW5zdXJlQ2FwYWNpdHkoMSk7CiAgICAgIF9idWZmZXJbX2J1ZmZlclBvc2l0aW9uKytdID0gY2hhckNvZGU7CiAgICAgIF9idWZmZXJDb2RlVW5pdE1hZ25pdHVkZSB8PSBjaGFyQ29kZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjaGFyQ29kZSA+IDB4MTBGRkZGKSB7CiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoY2hhckNvZGUsIDAsIDB4MTBGRkZGKTsKICAgICAgfQogICAgICBfZW5zdXJlQ2FwYWNpdHkoMik7CiAgICAgIGludCBiaXRzID0gY2hhckNvZGUgLSAweDEwMDAwOwogICAgICBfYnVmZmVyW19idWZmZXJQb3NpdGlvbisrXSA9IDB4RDgwMCB8IChiaXRzID4+IDEwKTsKICAgICAgX2J1ZmZlcltfYnVmZmVyUG9zaXRpb24rK10gPSAweERDMDAgfCAoYml0cyAmIDB4M0ZGKTsKICAgICAgX2J1ZmZlckNvZGVVbml0TWFnbml0dWRlIHw9IDB4RkZGRjsKICAgIH0KICB9CgogIEBwYXRjaAogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pIHsKICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb2JqZWN0cy5pdGVyYXRvcjsKICAgIGlmICghaXRlcmF0b3IubW92ZU5leHQoKSkgcmV0dXJuOwogICAgaWYgKHNlcGFyYXRvci5pc0VtcHR5KSB7CiAgICAgIGRvIHsKICAgICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgfSB3aGlsZSAoaXRlcmF0b3IubW92ZU5leHQoKSk7CiAgICB9IGVsc2UgewogICAgICB3cml0ZShpdGVyYXRvci5jdXJyZW50KTsKICAgICAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKICAgICAgICB3cml0ZShzZXBhcmF0b3IpOwogICAgICAgIHdyaXRlKGl0ZXJhdG9yLmN1cnJlbnQpOwogICAgICB9CiAgICB9CiAgfQoKICBAcGF0Y2gKICB2b2lkIHdyaXRlbG4oW09iamVjdCBvYmogPSAiIl0pIHsKICAgIHdyaXRlKG9iaik7CiAgICB3cml0ZSgiXG4iKTsKICB9CgogIC8qKiBNYWtlcyB0aGUgYnVmZmVyIGVtcHR5LiAqLwogIEBwYXRjaAogIHZvaWQgY2xlYXIoKSB7CiAgICBfcGFydHMgPSBudWxsOwogICAgX3BhcnRzQ29kZVVuaXRzID0gX2J1ZmZlclBvc2l0aW9uID0gX2J1ZmZlckNvZGVVbml0TWFnbml0dWRlID0gMDsKICB9CgogIC8qKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiBidWZmZXIgYXMgYSBzdHJpbmcuICovCiAgQHBhdGNoCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgX2NvbnN1bWVCdWZmZXIoKTsKICAgIHJldHVybiAoX3BhcnRzQ29kZVVuaXRzID09IDApCiAgICAgICAgPyAiIgogICAgICAgIDogX1N0cmluZ0Jhc2UuX2NvbmNhdFJhbmdlKF9wYXJ0cywgMCwgX3BhcnRzLmxlbmd0aCk7CiAgfQoKICAvKiogRW5zdXJlcyB0aGF0IHRoZSBidWZmZXIgaGFzIGVub3VnaCBjYXBhY2l0eSB0byBhZGQgbiBjb2RlIHVuaXRzLiAqLwogIHZvaWQgX2Vuc3VyZUNhcGFjaXR5KGludCBuKSB7CiAgICBpZiAoX2J1ZmZlciA9PSBudWxsKSB7CiAgICAgIF9idWZmZXIgPSBuZXcgVWludDE2TGlzdChfQlVGRkVSX1NJWkUpOwogICAgfSBlbHNlIGlmIChfYnVmZmVyUG9zaXRpb24gKyBuID4gX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgX2NvbnN1bWVCdWZmZXIoKTsKICAgIH0KICB9CgogIC8qKgogICAqIENvbnN1bWVzIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIgYnkgdHVybmluZyBpdCBpbnRvIGEgc3RyaW5nCiAgICogYW5kIGFkZGluZyBpdCBhcyBhIHBhcnQuIEFmdGVyIGNhbGxpbmcgdGhpcyB0aGUgYnVmZmVyIHBvc2l0aW9uCiAgICogd2lsbCBiZSByZXNldCB0byB6ZXJvLgogICAqLwogIHZvaWQgX2NvbnN1bWVCdWZmZXIoKSB7CiAgICBpZiAoX2J1ZmZlclBvc2l0aW9uID09IDApIHJldHVybjsKICAgIGJvb2wgaXNMYXRpbjEgPSBfYnVmZmVyQ29kZVVuaXRNYWduaXR1ZGUgPD0gMHhGRjsKICAgIFN0cmluZyBzdHIgPSBfY3JlYXRlKF9idWZmZXIsIF9idWZmZXJQb3NpdGlvbiwgaXNMYXRpbjEpOwogICAgX2J1ZmZlclBvc2l0aW9uID0gX2J1ZmZlckNvZGVVbml0TWFnbml0dWRlID0gMDsKICAgIF9hZGRQYXJ0KHN0cik7CiAgfQoKICAvKioKICAgKiBBZGRzIGEgbmV3IHBhcnQgdG8gdGhpcyBzdHJpbmcgYnVmZmVyIGFuZCBrZWVwcyB0cmFjayBvZiBob3cKICAgKiBtYW55IGNvZGUgdW5pdHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcGFydHMuCiAgICovCiAgdm9pZCBfYWRkUGFydChTdHJpbmcgc3RyKSB7CiAgICBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aDsKICAgIF9wYXJ0c0NvZGVVbml0cyArPSBsZW5ndGg7CiAgICBfcGFydHNDb2RlVW5pdHNTaW5jZUNvbXBhY3Rpb24gKz0gbGVuZ3RoOwoKICAgIGlmIChfcGFydHMgPT0gbnVsbCkgewogICAgICAvLyBFbXBpcmljYWxseSB0aGlzIGlzIGEgZ29vZCBjYXBhY2l0eSB0byBtaW5pbWl6ZSB0b3RhbCBieXRlcyBhbGxvY2F0ZWQuCiAgICAgIF9wYXJ0cyA9IG5ldyBfR3Jvd2FibGVMaXN0LndpdGhDYXBhY2l0eSgxMCkuLmFkZChzdHIpOwogICAgfSBlbHNlIHsKICAgICAgX3BhcnRzLmFkZChzdHIpOwogICAgICBpbnQgcGFydHNTaW5jZUNvbXBhY3Rpb24gPSBfcGFydHMubGVuZ3RoIC0gX3BhcnRzQ29tcGFjdGlvbkluZGV4OwogICAgICBpZiAocGFydHNTaW5jZUNvbXBhY3Rpb24gPT0gX1BBUlRTX1RPX0NPTVBBQ1QpIHsKICAgICAgICBfY29tcGFjdCgpOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wYWN0cyB0aGUgbGFzdCBOIHBhcnRzIGlmIHRoZWlyIGF2ZXJhZ2Ugc2l6ZSBhbGxvd3MgdXMgdG8gc2F2ZSBhCiAgICogbG90IG9mIG1lbW9yeSBieSB0dXJuaW5nIHRoZW0gYWxsIGludG8gYSBzaW5nbGUgcGFydC4KICAgKi8KICB2b2lkIF9jb21wYWN0KCkgewogICAgaWYgKF9wYXJ0c0NvZGVVbml0c1NpbmNlQ29tcGFjdGlvbiA8IF9QQVJUU19UT19DT01QQUNUX1NJWkVfTElNSVQpIHsKICAgICAgU3RyaW5nIGNvbXBhY3RlZCA9IF9TdHJpbmdCYXNlLl9jb25jYXRSYW5nZSgKICAgICAgICAgIF9wYXJ0cywKICAgICAgICAgIF9wYXJ0c0NvbXBhY3Rpb25JbmRleCwgLy8gU3RhcnQKICAgICAgICAgIF9wYXJ0c0NvbXBhY3Rpb25JbmRleCArIF9QQVJUU19UT19DT01QQUNUIC8vIEVuZAogICAgICAgICAgKTsKICAgICAgX3BhcnRzLmxlbmd0aCA9IF9wYXJ0cy5sZW5ndGggLSBfUEFSVFNfVE9fQ09NUEFDVDsKICAgICAgX3BhcnRzLmFkZChjb21wYWN0ZWQpOwogICAgfQogICAgX3BhcnRzQ29kZVVuaXRzU2luY2VDb21wYWN0aW9uID0gMDsKICAgIF9wYXJ0c0NvbXBhY3Rpb25JbmRleCA9IF9wYXJ0cy5sZW5ndGg7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgYSBbU3RyaW5nXSBmcm9tIHRoZSBVRlQtMTYgY29kZSB1bml0cyBpbiBidWZmZXIuCiAgICovCiAgc3RhdGljIFN0cmluZyBfY3JlYXRlKFVpbnQxNkxpc3QgYnVmZmVyLCBpbnQgbGVuZ3RoLCBib29sIGlzTGF0aW4xKQogICAgICBuYXRpdmUgIlN0cmluZ0J1ZmZlcl9jcmVhdGVTdHJpbmdGcm9tVWludDE2QXJyYXkiOwp9CoDGAE5OPAEeAQcVJixJAQZFGwYXAQZHKgcbAQZHSEhHMQYhKgEGREUwBhYbAQZIFAVLSkEGJAE5CSgUBAEJNwEJGxkdFhMEAQklHho7CBotLA0hOwgaJTo8KgYEAQk9KiYdCyElDR8kGiEIBgQBCSQQEQQBIQkRE0YEATUJFhYiDT4EAUogGy43GAYEAQZERRwGGiY2PjQTBAEGQjEGHh0fLgEaUD0NF0g3FAgGBAEGSTsGFEkzEio7DTkdBigrBAEGPQZGOQIBKGRhcnQ6Y29yZS1wYXRjaC9zdHJpbmdfYnVmZmVyX3BhdGNoLmRhcnQxb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvc3RyaW5nX3NpbmsuZGFydIN3Ly8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnBhcnQgb2YgZGFydC5jb3JlOwoKYWJzdHJhY3QgY2xhc3MgU3RyaW5nU2luayB7CiAgLyoqCiAgICogQ29udmVydHMgW29ial0gdG8gYSBTdHJpbmcgYnkgaW52b2tpbmcgW09iamVjdC50b1N0cmluZ10gYW5kIAogICAqIGFkZHMgdGhlIHJlc3VsdCB0byBgdGhpc2AuCiAgICovCiAgdm9pZCB3cml0ZShPYmplY3Qgb2JqKTsKCiAgLyoqCiAgICogSXRlcmF0ZXMgb3ZlciB0aGUgZ2l2ZW4gW29iamVjdHNdIGFuZCBbd3JpdGVdcyB0aGVtIGluIHNlcXVlbmNlLgogICAqLwogIHZvaWQgd3JpdGVBbGwoSXRlcmFibGUgb2JqZWN0cywgW1N0cmluZyBzZXBhcmF0b3IgPSAiIl0pOwoKICAvKioKICAgKiBDb252ZXJ0cyBbb2JqXSB0byBhIFN0cmluZyBieSBpbnZva2luZyBbT2JqZWN0LnRvU3RyaW5nXSBhbmQgCiAgICogYWRkcyB0aGUgcmVzdWx0IHRvIGB0aGlzYCwgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgogICAqLwogIHZvaWQgd3JpdGVsbihbT2JqZWN0IG9iaiA9ICIiXSk7CgogIC8qKgogICAqIFdyaXRlcyB0aGUgW2NoYXJDb2RlXSB0byBgdGhpc2AuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGB3cml0ZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSkpYC4KICAgKi8KICB2b2lkIHdyaXRlQ2hhckNvZGUoaW50IGNoYXJDb2RlKTsKfQohAE5OPAETARwGQyAGGgEGRgY8AQZDNwYjAQYmBU4GJAIBGmRhcnQ6Y29yZS9zdHJpbmdfc2luay5kYXJ0LG9yZy1kYXJ0bGFuZy1zZGs6Ly8vc2RrL2xpYi9jb3JlL3N5bWJvbC5kYXJ0jlYvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovLy8gT3BhcXVlIG5hbWUgdXNlZCBieSBtaXJyb3JzLCBpbnZvY2F0aW9ucyBhbmQgW0Z1bmN0aW9uLmFwcGx5XS4KYWJzdHJhY3QgY2xhc3MgU3ltYm9sIHsKICAvKiogVGhlIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYW1lIG9mIHRoZSB1bmFyeSBtaW51cyBvcGVyYXRvci4gKi8KICBzdGF0aWMgY29uc3QgU3ltYm9sIHVuYXJ5TWludXMgPSBTeW1ib2woInVuYXJ5LSIpOwoKICAvKioKICAgKiBUaGUgZW1wdHkgc3ltYm9sLgogICAqCiAgICogVGhlIGVtcHR5IHN5bWJvbCBpcyB0aGUgbmFtZSBvZiBsaWJyYXJpZXMgd2l0aCBubyBsaWJyYXJ5IGRlY2xhcmF0aW9uLAogICAqIGFuZCB0aGUgYmFzZS1uYW1lIG9mIHRoZSB1bm5hbWVkIGNvbnN0cnVjdG9yLgogICAqLwogIHN0YXRpYyBjb25zdCBTeW1ib2wgZW1wdHkgPSBTeW1ib2woIiIpOwoKICAvKioKICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFtTeW1ib2xdIHJlcHJlc2VudGluZyB0aGUgcHJvdmlkZWQgbmFtZS4KICAgKgogICAqIFRoZSBuYW1lIG11c3QgYmUgYSB2YWxpZCBwdWJsaWMgRGFydCBtZW1iZXIgbmFtZSwKICAgKiBwdWJsaWMgY29uc3RydWN0b3IgbmFtZSwgb3IgbGlicmFyeSBuYW1lLCBvcHRpb25hbGx5IHF1YWxpZmllZC4KICAgKgogICAqIEEgcXVhbGlmaWVkIG5hbWUgaXMgYSB2YWxpZCBuYW1lIHByZWNlZGVkIGJ5IGEgcHVibGljIGlkZW50aWZpZXIgbmFtZQogICAqIGFuZCBhICdgLmAnLCBlLmcuLCBgZm9vLmJhci5iYXo9YCBpcyBhIHF1YWxpZmllZCB2ZXJzaW9uIG9mIGBiYXo9YC4KICAgKiBUaGF0IG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIFtuYW1lXSBTdHJpbmcgbXVzdCBiZSBlaXRoZXIKICAgKgogICAqICogYSB2YWxpZCBwdWJsaWMgRGFydCBpZGVudGlmaWVyCiAgICogICAodGhhdCBpcywgYW4gaWRlbnRpZmllciBub3Qgc3RhcnRpbmcgd2l0aCAiYF9gIiksCiAgICogKiBzdWNoIGFuIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgIj0iIChhIHNldHRlciBuYW1lKSwKICAgKiAqIHRoZSBuYW1lIG9mIGEgZGVjbGFyYWJsZSBvcGVyYXRvcgogICAqICAgKG9uZSBvZiAiYCtgIiwgImAtYCIsICJgKmAiLCAiYC9gIiwgImAlYCIsICJgfi9gIiwgImAmYCIsICJgfGAiLAogICAqICAgImBeYCIsICJgfmAiLCAiYDw8YCIsICJgPj5gIiwgImA8YCIsICJgPD1gIiwgImA+YCIsICJgPj1gIiwgImA9PWAiLAogICAqICAgImBbXWAiLCAiYFtdPWAiLCBvciAiYHVuYXJ5LWAiKSwKICAgKiAqIGFueSBvZiB0aGUgYWJvdmUgcHJlY2VkZWQgYnkgYW55IG51bWJlciBvZiBxdWFsaWZpZXJzLAogICAqICAgd2hlcmUgYSBxdWFsaWZpZXIgaXMgYSBub24tcHJpdmF0ZSBpZGVudGlmaWVyIGZvbGxvd2VkIGJ5ICdgLmAnLAogICAqICogb3IgdGhlIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQgbmFtZSBvZiBhIGxpYnJhcnkgd2l0aCBubyBsaWJyYXJ5CiAgICogICBuYW1lIGRlY2xhcmF0aW9uKS4KICAgKgogICAqIFN5bWJvbCBpbnN0YW5jZXMgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIFtuYW1lXSBhcmUgZXF1YWwsCiAgICogYnV0IG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwsIGJ1dCBzeW1ib2xzIGNyZWF0ZWQgYXMgY29tcGlsZS10aW1lCiAgICogY29uc3RhbnRzIGFyZSBjYW5vbmljYWxpemVkLCBhcyBhbGwgb3RoZXIgY29uc3RhbnQgb2JqZWN0IGNyZWF0aW9ucy4KICAgKgogICAqIGBgYGRhcnQKICAgKiBhc3NlcnQobmV3IFN5bWJvbCgiZm9vIikgPT0gbmV3IFN5bWJvbCgiZm9vIikpOwogICAqIGFzc2VydChpZGVudGljYWwoY29uc3QgU3ltYm9sKCJmb28iKSwgY29uc3QgU3ltYm9sKCJmb28iKSkpOwogICAqIGBgYAogICAqCiAgICogSWYgW25hbWVdIGlzIGEgc2luZ2xlIGlkZW50aWZpZXIgdGhhdCBkb2VzIG5vdCBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUsCiAgICogb3IgaXQgaXMgYSBxdWFsaWZpZWQgaWRlbnRpZmllciwKICAgKiBvciBpdCBpcyBhbiBvcGVyYXRvciBuYW1lIGRpZmZlcmVudCBmcm9tIGB1bmFyeS1gLAogICAqIHRoZW4gdGhlIHJlc3VsdCBvZiBgY29uc3QgU3ltYm9sKG5hbWUpYCBpcyB0aGUgc2FtZSBpbnN0YW5jZSB0aGF0CiAgICogdGhlIHN5bWJvbCBsaXRlcmFsIGNyZWF0ZWQgYnkgcHJlZml4aW5nIGAjYCB0byB0aGUgY29udGVudCBvZiBbbmFtZV0KICAgKiB3b3VsZCBldmFsdWF0ZSB0by4KICAgKgogICAqIGBgYGRhcnQKICAgKiBhc3NlcnQobmV3IFN5bWJvbCgiZm9vIikgPT0gI2Zvbyk7CiAgICogYXNzZXJ0KG5ldyBTeW1ib2woIltdPSIpID09ICNbXT1dKTsKICAgKiBhc3NlcnQobmV3IFN5bWJvbCgiZm9vLmJhciIpID09ICNmb28uYmFyKTsKICAgKiBhc3NlcnQoaWRlbnRpY2FsKGNvbnN0IFN5bWJvbCgiZm9vIiksICNmb28pKTsKICAgKiBhc3NlcnQoaWRlbnRpY2FsKGNvbnN0IFN5bWJvbCgiW109IiksICNbXT1dKSk7CiAgICogYXNzZXJ0KGlkZW50aWNhbChjb25zdCBTeW1ib2woImZvby5iYXIiKSwgI2Zvby5iYXIpKTsKICAgKiBgYGAKICAgKgogICAqIFRoaXMgY29uc3RydWN0b3IgY2Fubm90IGNyZWF0ZSBhIFtTeW1ib2xdIGluc3RhbmNlIHRoYXQgaXMgZXF1YWwgdG8KICAgKiBhIHByaXZhdGUgc3ltYm9sIGxpdGVyYWwgbGlrZSBgI19mb29gLgogICAqIGBgYGRhcnQKICAgKiBjb25zdCBTeW1ib2woIl9mb28iKSAvLyBJbnZhbGlkCiAgICogYGBgCiAgICoKICAgKiBUaGUgY3JlYXRlZCBpbnN0YW5jZSBvdmVycmlkZXMgW09iamVjdC49PV0uCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgbm9uLW5vcm1hdGl2ZToKICAgKgogICAqIENyZWF0aW5nIG5vbi1jb25zdCBTeW1ib2wgaW5zdGFuY2VzIG1heSByZXN1bHQgaW4gbGFyZ2VyIG91dHB1dC4gIElmCiAgICogcG9zc2libGUsIHVzZSBgTWlycm9yc1VzZWRgIGZyb20gImRhcnQ6bWlycm9ycyIgdG8gc3BlY2lmeSB3aGljaCBuYW1lcwogICAqIG1pZ2h0IGJlIHBhc3NlZCB0byB0aGlzIGNvbnN0cnVjdG9yLgogICAqLwogIGNvbnN0IGZhY3RvcnkgU3ltYm9sKFN0cmluZyBuYW1lKSA9IGludGVybmFsLlN5bWJvbDsKCiAgLyoqCiAgICogUmV0dXJucyBhIGhhc2ggY29kZSBjb21wYXRpYmxlIHdpdGggW29wZXJhdG9yPT1dLgogICAqCiAgICogRXF1YWwgc3ltYm9scyBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZS4KICAgKi8KICBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvKioKICAgKiBTeW1ib2xzIGFyZSBlcXVhbCB0byBvdGhlciBzeW1ib2xzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBtZW1iZXIgbmFtZS4KICAgKgogICAqIFF1YWxpZmllZCBtZW1iZXIgbmFtZXMsIGxpa2UgYCNmb28uYmFyYCBhcmUgZXF1YWwgb25seSBpZiB0aGV5IGhhdmUgdGhlCiAgICogc2FtZSBpZGVudGlmaWVycyBiZWZvcmUgdGhlIHNhbWUgZmluYWwgbWVtYmVyIG5hbWUuCiAgICovCiAgYm9vbCBvcGVyYXRvciA9PShvdGhlcik7Cn0KYwBOTjwBEwFDGEs1AQYXBUwzBioBBj8FN0UFS0lFBSY5OylISyg+SEoaBT5ISgUNNUIJBU4mOEdKGAUNKCkwMzQ7CQVJLA0lCQUxBSoFSkwqBjcBBjcFLAYUAQZRBU05BhsCARVkYXJ0OmNvcmUvc3ltYm9sLmRhcnQqb3JnLWRhcnRsYW5nLXNkazovLy9zZGsvbGliL2NvcmUvdHlwZS5kYXJ0gTEvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovKioKICogUnVudGltZSByZXByZXNlbnRhdGlvbiBvZiBhIHR5cGUuCiAqLwphYnN0cmFjdCBjbGFzcyBUeXBlIHt9CgwATk48ARMBBCUEFwETZGFydDpjb3JlL3R5cGUuZGFydClvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS91cmkuZGFydMACgLUvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovLyBGcmVxdWVudGx5IHVzZWQgY2hhcmFjdGVyIGNvZGVzLgpjb25zdCBpbnQgX1NQQUNFID0gMHgyMDsKY29uc3QgaW50IF9QRVJDRU5UID0gMHgyNTsKY29uc3QgaW50IF9BTVBFUlNBTkQgPSAweDI2Owpjb25zdCBpbnQgX1BMVVMgPSAweDJCOwpjb25zdCBpbnQgX0RPVCA9IDB4MkU7CmNvbnN0IGludCBfU0xBU0ggPSAweDJGOwpjb25zdCBpbnQgX0NPTE9OID0gMHgzQTsKY29uc3QgaW50IF9FUVVBTFMgPSAweDNkOwpjb25zdCBpbnQgX1VQUEVSX0NBU0VfQSA9IDB4NDE7CmNvbnN0IGludCBfVVBQRVJfQ0FTRV9aID0gMHg1QTsKY29uc3QgaW50IF9MRUZUX0JSQUNLRVQgPSAweDVCOwpjb25zdCBpbnQgX0JBQ0tTTEFTSCA9IDB4NUM7CmNvbnN0IGludCBfUklHSFRfQlJBQ0tFVCA9IDB4NUQ7CmNvbnN0IGludCBfTE9XRVJfQ0FTRV9BID0gMHg2MTsKY29uc3QgaW50IF9MT1dFUl9DQVNFX0YgPSAweDY2Owpjb25zdCBpbnQgX0xPV0VSX0NBU0VfWiA9IDB4N0E7Cgpjb25zdCBTdHJpbmcgX2hleERpZ2l0cyA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKCi8qKgogKiBBIHBhcnNlZCBVUkksIHN1Y2ggYXMgYSBVUkwuCiAqCiAqICoqU2VlIGFsc286KioKICoKICogKiBbVVJJc11bdXJpc10gaW4gdGhlIFtsaWJyYXJ5IHRvdXJdW2xpYnRvdXJdCiAqICogW1JGQy0zOTg2XShodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2KQogKgogKiBbdXJpc106IGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9kb2NzL2RhcnQtdXAtYW5kLXJ1bm5pbmcvY2gwMy5odG1sI3VyaXMKICogW2xpYnRvdXJdOiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvZG9jcy9kYXJ0LXVwLWFuZC1ydW5uaW5nL2NvbnRlbnRzL2NoMDMuaHRtbAogKi8KYWJzdHJhY3QgY2xhc3MgVXJpIHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBuYXR1cmFsIGJhc2UgVVJJIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KICAgKgogICAqIFdoZW4gcnVubmluZyBpbiBhIGJyb3dzZXIgdGhpcyBpcyB0aGUgY3VycmVudCBVUkwgb2YgdGhlIGN1cnJlbnQgcGFnZQogICAqIChmcm9tIGB3aW5kb3cubG9jYXRpb24uaHJlZmApLgogICAqCiAgICogV2hlbiBub3QgcnVubmluZyBpbiBhIGJyb3dzZXIgdGhpcyBpcyB0aGUgZmlsZSBVUkkgcmVmZXJlbmNpbmcKICAgKiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KICAgKi8KICBleHRlcm5hbCBzdGF0aWMgVXJpIGdldCBiYXNlOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IFVSSSBmcm9tIGl0cyBjb21wb25lbnRzLgogICAqCiAgICogRWFjaCBjb21wb25lbnQgaXMgc2V0IHRocm91Z2ggYSBuYW1lZCBhcmd1bWVudC4gQW55IG51bWJlciBvZgogICAqIGNvbXBvbmVudHMgY2FuIGJlIHByb3ZpZGVkLiBUaGUgW3BhdGhdIGFuZCBbcXVlcnldIGNvbXBvbmVudHMgY2FuIGJlIHNldAogICAqIHVzaW5nIGVpdGhlciBvZiB0d28gZGlmZmVyZW50IG5hbWVkIGFyZ3VtZW50cy4KICAgKgogICAqIFRoZSBzY2hlbWUgY29tcG9uZW50IGlzIHNldCB0aHJvdWdoIFtzY2hlbWVdLiBUaGUgc2NoZW1lIGlzCiAgICogbm9ybWFsaXplZCB0byBhbGwgbG93ZXJjYXNlIGxldHRlcnMuIElmIHRoZSBzY2hlbWUgaXMgb21pdHRlZCBvciBlbXB0eSwKICAgKiB0aGUgVVJJIHdpbGwgbm90IGhhdmUgYSBzY2hlbWUgcGFydC4KICAgKgogICAqIFRoZSB1c2VyIGluZm8gcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaAogICAqIFt1c2VySW5mb10uIEl0IGRlZmF1bHRzIHRvIHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIHdpbGwgYmUgb21pdHRlZAogICAqIGZyb20gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJLgogICAqCiAgICogVGhlIGhvc3QgcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaAogICAqIFtob3N0XS4gVGhlIGhvc3QgY2FuIGVpdGhlciBiZSBhIGhvc3RuYW1lLCBhbiBJUHY0IGFkZHJlc3Mgb3IgYW4KICAgKiBJUHY2IGFkZHJlc3MsIGNvbnRhaW5lZCBpbiAnWycgYW5kICddJy4gSWYgdGhlIGhvc3QgY29udGFpbnMgYQogICAqICc6JyBjaGFyYWN0ZXIsIHRoZSAnWycgYW5kICddJyBhcmUgYWRkZWQgaWYgbm90IGFscmVhZHkgcHJvdmlkZWQuCiAgICogVGhlIGhvc3QgaXMgbm9ybWFsaXplZCB0byBhbGwgbG93ZXJjYXNlIGxldHRlcnMuCiAgICoKICAgKiBUaGUgcG9ydCBwYXJ0IG9mIHRoZSBhdXRob3JpdHkgY29tcG9uZW50IGlzIHNldCB0aHJvdWdoCiAgICogW3BvcnRdLgogICAqIElmIFtwb3J0XSBpcyBvbWl0dGVkIG9yIGBudWxsYCwgaXQgaW1wbGllcyB0aGUgZGVmYXVsdCBwb3J0IGZvcgogICAqIHRoZSBVUkkncyBzY2hlbWUsIGFuZCBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgdGhhdCBwb3J0IGV4cGxpY2l0bHkuCiAgICogVGhlIHJlY29nbml6ZWQgc2NoZW1lcywgYW5kIHRoZWlyIGRlZmF1bHQgcG9ydHMsIGFyZSAiaHR0cCIgKDgwKSBhbmQKICAgKiAiaHR0cHMiICg0NDMpLiBBbGwgb3RoZXIgc2NoZW1lcyBhcmUgY29uc2lkZXJlZCBhcyBoYXZpbmcgemVybyBhcyB0aGUKICAgKiBkZWZhdWx0IHBvcnQuCiAgICoKICAgKiBJZiBhbnkgb2YgYHVzZXJJbmZvYCwgYGhvc3RgIG9yIGBwb3J0YCBhcmUgcHJvdmlkZWQsCiAgICogdGhlIFVSSSBoYXMgYW4gYXV0aG9yaXR5IGFjY29yZGluZyB0byBbaGFzQXV0aG9yaXR5XS4KICAgKgogICAqIFRoZSBwYXRoIGNvbXBvbmVudCBpcyBzZXQgdGhyb3VnaCBlaXRoZXIgW3BhdGhdIG9yCiAgICogW3BhdGhTZWdtZW50c10uCiAgICogV2hlbiBbcGF0aF0gaXMgdXNlZCwgaXQgc2hvdWxkIGJlIGEgdmFsaWQgVVJJIHBhdGgsCiAgICogYnV0IGludmFsaWQgY2hhcmFjdGVycywgZXhjZXB0IHRoZSBnZW5lcmFsIGRlbGltaXRlcnMgJzovQFtdPyMnLAogICAqIHdpbGwgYmUgZXNjYXBlZCBpZiBuZWNlc3NhcnkuCiAgICogV2hlbiBbcGF0aFNlZ21lbnRzXSBpcyB1c2VkLCBlYWNoIG9mIHRoZSBwcm92aWRlZCBzZWdtZW50cwogICAqIGlzIGZpcnN0IHBlcmNlbnQtZW5jb2RlZCBhbmQgdGhlbiBqb2luZWQgdXNpbmcgdGhlIGZvcndhcmQgc2xhc2gKICAgKiBzZXBhcmF0b3IuCiAgICoKICAgKiBUaGUgcGVyY2VudC1lbmNvZGluZyBvZiB0aGUgcGF0aCBzZWdtZW50cyBlbmNvZGVzIGFsbAogICAqIGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzIGFuZCB0aGUgZm9sbG93aW5nCiAgICogbGlzdCBvZiBjaGFyYWN0ZXJzOiBgISQmJygpKissOz06QGAuIElmIHRoZSBvdGhlciBjb21wb25lbnRzCiAgICogbmVjZXNzaXRhdGUgYW4gYWJzb2x1dGUgcGF0aCwgYSBsZWFkaW5nIHNsYXNoIGAvYCBpcyBwcmVwZW5kZWQgaWYKICAgKiBub3QgYWxyZWFkeSB0aGVyZS4KICAgKgogICAqIFRoZSBxdWVyeSBjb21wb25lbnQgaXMgc2V0IHRocm91Z2ggZWl0aGVyIFtxdWVyeV0gb3IgW3F1ZXJ5UGFyYW1ldGVyc10uCiAgICogV2hlbiBbcXVlcnldIGlzIHVzZWQsIHRoZSBwcm92aWRlZCBzdHJpbmcgc2hvdWxkIGJlIGEgdmFsaWQgVVJJIHF1ZXJ5LAogICAqIGJ1dCBpbnZhbGlkIGNoYXJhY3RlcnMsIG90aGVyIHRoYW4gZ2VuZXJhbCBkZWxpbWl0ZXJzLAogICAqIHdpbGwgYmUgZXNjYXBlZCBpZiBuZWNlc3NhcnkuCiAgICogV2hlbiBbcXVlcnlQYXJhbWV0ZXJzXSBpcyB1c2VkIHRoZSBxdWVyeSBpcyBidWlsdCBmcm9tIHRoZQogICAqIHByb3ZpZGVkIG1hcC4gRWFjaCBrZXkgYW5kIHZhbHVlIGluIHRoZSBtYXAgaXMgcGVyY2VudC1lbmNvZGVkCiAgICogYW5kIGpvaW5lZCB1c2luZyBlcXVhbCBhbmQgYW1wZXJzYW5kIGNoYXJhY3RlcnMuCiAgICogQSB2YWx1ZSBpbiB0aGUgbWFwIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nLCBvciBhbiBbSXRlcmFibGVdIG9mIHN0cmluZ3MsCiAgICogd2hlcmUgdGhlIGxhdHRlciBjb3JyZXNwb25kcyB0byBtdWx0aXBsZSB2YWx1ZXMgZm9yIHRoZSBzYW1lIGtleS4KICAgKgogICAqIFRoZSBwZXJjZW50LWVuY29kaW5nIG9mIHRoZSBrZXlzIGFuZCB2YWx1ZXMgZW5jb2RlcyBhbGwgY2hhcmFjdGVycwogICAqIGV4Y2VwdCBmb3IgdGhlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycywgYW5kIHJlcGxhY2VzIHNwYWNlcyB3aXRoIGArYC4KICAgKiBJZiBgcXVlcnlgIGlzIHRoZSBlbXB0eSBzdHJpbmcsIGl0IGlzIGVxdWl2YWxlbnQgdG8gb21pdHRpbmcgaXQuCiAgICogVG8gaGF2ZSBhbiBhY3R1YWwgZW1wdHkgcXVlcnkgcGFydCwKICAgKiB1c2UgYW4gZW1wdHkgbWFwIGZvciBgcXVlcnlQYXJhbWV0ZXJzYC4KICAgKgogICAqIElmIGJvdGggYHF1ZXJ5YCBhbmQgYHF1ZXJ5UGFyYW1ldGVyc2AgYXJlIG9taXR0ZWQgb3IgYG51bGxgLAogICAqIHRoZSBVUkkgaGFzIG5vIHF1ZXJ5IHBhcnQuCiAgICoKICAgKiBUaGUgZnJhZ21lbnQgY29tcG9uZW50IGlzIHNldCB0aHJvdWdoIFtmcmFnbWVudF0uCiAgICogSXQgc2hvdWxkIGJlIGEgdmFsaWQgVVJJIGZyYWdtZW50LCBidXQgaW52YWxpZCBjaGFyYWN0ZXJzIG90aGVyIHRoYW4KICAgKiBnZW5lcmFsIGRlbGltaXRlcnMsIGFyZSBlc2NhcGVkIGlmIG5lY2Vzc2FyeS4KICAgKiBJZiBgZnJhZ21lbnRgIGlzIG9taXR0ZWQgb3IgYG51bGxgLCB0aGUgVVJJIGhhcyBubyBmcmFnbWVudCBwYXJ0LgogICAqLwogIGZhY3RvcnkgVXJpKAogICAgICB7U3RyaW5nIHNjaGVtZSwKICAgICAgU3RyaW5nIHVzZXJJbmZvLAogICAgICBTdHJpbmcgaG9zdCwKICAgICAgaW50IHBvcnQsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywKICAgICAgU3RyaW5nIHF1ZXJ5LAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycywKICAgICAgU3RyaW5nIGZyYWdtZW50fSkgPSBfVXJpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IGBodHRwYCBVUkkgZnJvbSBhdXRob3JpdHksIHBhdGggYW5kIHF1ZXJ5LgogICAqCiAgICogRXhhbXBsZXM6CiAgICoKICAgKiBgYGAKICAgKiAvLyBodHRwOi8vZXhhbXBsZS5vcmcvcGF0aD9xPWRhcnQuCiAgICogbmV3IFVyaS5odHRwKCJleGFtcGxlLm9yZyIsICIvcGF0aCIsIHsgInEiIDogImRhcnQiIH0pOwogICAqCiAgICogLy8gaHR0cDovL3VzZXI6cGFzc0Bsb2NhbGhvc3Q6ODA4MAogICAqIG5ldyBVcmkuaHR0cCgidXNlcjpwYXNzQGxvY2FsaG9zdDo4MDgwIiwgIiIpOwogICAqCiAgICogLy8gaHR0cDovL2V4YW1wbGUub3JnL2ElMjBiCiAgICogbmV3IFVyaS5odHRwKCJleGFtcGxlLm9yZyIsICJhIGIiKTsKICAgKgogICAqIC8vIGh0dHA6Ly9leGFtcGxlLm9yZy9hJTI1MkYKICAgKiBuZXcgVXJpLmh0dHAoImV4YW1wbGUub3JnIiwgIi9hJTJGIik7CiAgICogYGBgCiAgICoKICAgKiBUaGUgYHNjaGVtZWAgaXMgYWx3YXlzIHNldCB0byBgaHR0cGAuCiAgICoKICAgKiBUaGUgYHVzZXJJbmZvYCwgYGhvc3RgIGFuZCBgcG9ydGAgY29tcG9uZW50cyBhcmUgc2V0IGZyb20gdGhlCiAgICogW2F1dGhvcml0eV0gYXJndW1lbnQuIElmIGBhdXRob3JpdHlgIGlzIGBudWxsYCBvciBlbXB0eSwKICAgKiB0aGUgY3JlYXRlZCBgVXJpYCBoYXMgbm8gYXV0aG9yaXR5LCBhbmQgaXNuJ3QgZGlyZWN0bHkgdXNhYmxlCiAgICogYXMgYW4gSFRUUCBVUkwsIHdoaWNoIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBob3N0LgogICAqCiAgICogVGhlIGBwYXRoYCBjb21wb25lbnQgaXMgc2V0IGZyb20gdGhlIFt1bmVuY29kZWRQYXRoXQogICAqIGFyZ3VtZW50LiBUaGUgcGF0aCBwYXNzZWQgbXVzdCBub3QgYmUgZW5jb2RlZCBhcyB0aGlzIGNvbnN0cnVjdG9yCiAgICogZW5jb2RlcyB0aGUgcGF0aC4KICAgKgogICAqIFRoZSBgcXVlcnlgIGNvbXBvbmVudCBpcyBzZXQgZnJvbSB0aGUgb3B0aW9uYWwgW3F1ZXJ5UGFyYW1ldGVyc10KICAgKiBhcmd1bWVudC4KICAgKi8KICBmYWN0b3J5IFVyaS5odHRwKFN0cmluZyBhdXRob3JpdHksIFN0cmluZyB1bmVuY29kZWRQYXRoLAogICAgICBbTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnNdKSA9IF9VcmkuaHR0cDsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBgaHR0cHNgIFVSSSBmcm9tIGF1dGhvcml0eSwgcGF0aCBhbmQgcXVlcnkuCiAgICoKICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHRoZSBzYW1lIGFzIFtVcmkuaHR0cF0gZXhjZXB0IGZvciB0aGUgc2NoZW1lCiAgICogd2hpY2ggaXMgc2V0IHRvIGBodHRwc2AuCiAgICovCiAgZmFjdG9yeSBVcmkuaHR0cHMoU3RyaW5nIGF1dGhvcml0eSwgU3RyaW5nIHVuZW5jb2RlZFBhdGgsCiAgICAgIFtNYXA8U3RyaW5nLCBTdHJpbmc+IHF1ZXJ5UGFyYW1ldGVyc10pID0gX1VyaS5odHRwczsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIFVSSSBmcm9tIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIGZpbGUgcGF0aC4KICAgKgogICAqIFRoZSBmaWxlIHBhdGggaXMgcGFzc2VkIGluIFtwYXRoXS4KICAgKgogICAqIFRoaXMgcGF0aCBpcyBpbnRlcnByZXRlZCB1c2luZyBlaXRoZXIgV2luZG93cyBvciBub24tV2luZG93cwogICAqIHNlbWFudGljcy4KICAgKgogICAqIFdpdGggbm9uLVdpbmRvd3Mgc2VtYW50aWNzIHRoZSBzbGFzaCAoYC9gKSBpcyB1c2VkIHRvIHNlcGFyYXRlCiAgICogcGF0aCBzZWdtZW50cyBpbiB0aGUgaW5wdXQgW3BhdGhdLgogICAqCiAgICogV2l0aCBXaW5kb3dzIHNlbWFudGljcywgYmFja3NsYXNoIChgXGApIGFuZCBmb3J3YXJkLXNsYXNoIChgL2ApCiAgICogYXJlIHVzZWQgdG8gc2VwYXJhdGUgcGF0aCBzZWdtZW50cyBpbiB0aGUgaW5wdXQgW3BhdGhdLAogICAqIGV4Y2VwdCBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBgXFw/XGAgaW4gd2hpY2ggY2FzZQogICAqIG9ubHkgYmFja3NsYXNoIChgXGApIHNlcGFyYXRlcyBwYXRoIHNlZ21lbnRzIGluIFtwYXRoXS4KICAgKgogICAqIElmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGEgcGF0aCBzZXBhcmF0b3IsIGFuIGFic29sdXRlIFVSSSAod2l0aCB0aGUKICAgKiBgZmlsZWAgc2NoZW1lIGFuZCBhbiBlbXB0eSBhdXRob3JpdHkpIGlzIGNyZWF0ZWQuCiAgICogT3RoZXJ3aXNlIGEgcmVsYXRpdmUgVVJJIHJlZmVyZW5jZSB3aXRoIG5vIHNjaGVtZSBvciBhdXRob3JpdHkgaXMgY3JlYXRlZC4KICAgKiBPbmUgZXhjZXB0aW9uIGZyb20gdGhpcyBydWxlIGlzIHRoYXQgd2hlbiBXaW5kb3dzIHNlbWFudGljcyBpcyB1c2VkCiAgICogYW5kIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGEgZHJpdmUgbGV0dGVyIGZvbGxvd2VkIGJ5IGEgY29sb24gKCI6IikgYW5kIGEKICAgKiBwYXRoIHNlcGFyYXRvciwgdGhlbiBhbiBhYnNvbHV0ZSBVUkkgaXMgY3JlYXRlZC4KICAgKgogICAqIFRoZSBkZWZhdWx0IGZvciB3aGV0aGVyIHRvIHVzZSBXaW5kb3dzIG9yIG5vbi1XaW5kb3dzIHNlbWFudGljcwogICAqIGRldGVybWluZWQgZnJvbSB0aGUgcGxhdGZvcm0gRGFydCBpcyBydW5uaW5nIG9uLiBXaGVuIHJ1bm5pbmcgaW4KICAgKiB0aGUgc3RhbmRhbG9uZSBWTSwgdGhpcyBpcyBkZXRlY3RlZCBieSB0aGUgVk0gYmFzZWQgb24gdGhlCiAgICogb3BlcmF0aW5nIHN5c3RlbS4gV2hlbiBydW5uaW5nIGluIGEgYnJvd3NlciBub24tV2luZG93cyBzZW1hbnRpY3MKICAgKiBpcyBhbHdheXMgdXNlZC4KICAgKgogICAqIFRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHdoaWNoIHNlbWFudGljcyB0byB1c2UgcGFzcwogICAqIGEgdmFsdWUgZm9yIFt3aW5kb3dzXS4gUGFzc2luZyBgdHJ1ZWAgd2lsbCB1c2UgV2luZG93cwogICAqIHNlbWFudGljcyBhbmQgcGFzc2luZyBgZmFsc2VgIHdpbGwgdXNlIG5vbi1XaW5kb3dzIHNlbWFudGljcy4KICAgKgogICAqIEV4YW1wbGVzIHVzaW5nIG5vbi1XaW5kb3dzIHNlbWFudGljczoKICAgKgogICAqIGBgYAogICAqIC8vIHh4eC95eXkKICAgKiBuZXcgVXJpLmZpbGUoInh4eC95eXkiLCB3aW5kb3dzOiBmYWxzZSk7CiAgICoKICAgKiAvLyB4eHgveXl5LwogICAqIG5ldyBVcmkuZmlsZSgieHh4L3l5eS8iLCB3aW5kb3dzOiBmYWxzZSk7CiAgICoKICAgKiAvLyBmaWxlOi8vL3h4eC95eXkKICAgKiBuZXcgVXJpLmZpbGUoIi94eHgveXl5Iiwgd2luZG93czogZmFsc2UpOwogICAqCiAgICogLy8gZmlsZTovLy94eHgveXl5LwogICAqIG5ldyBVcmkuZmlsZSgiL3h4eC95eXkvIiwgd2luZG93czogZmFsc2UpOwogICAqCiAgICogLy8gQyUzQQogICAqIG5ldyBVcmkuZmlsZSgiQzoiLCB3aW5kb3dzOiBmYWxzZSk7CiAgICogYGBgCiAgICoKICAgKiBFeGFtcGxlcyB1c2luZyBXaW5kb3dzIHNlbWFudGljczoKICAgKgogICAqIGBgYAogICAqIC8vIHh4eC95eXkKICAgKiBuZXcgVXJpLmZpbGUociJ4eHhceXl5Iiwgd2luZG93czogdHJ1ZSk7CiAgICoKICAgKiAvLyB4eHgveXl5LwogICAqIG5ldyBVcmkuZmlsZShyInh4eFx5eXlcIiwgd2luZG93czogdHJ1ZSk7CiAgICoKICAgKiBmaWxlOi8vL3h4eC95eXkKICAgKiBuZXcgVXJpLmZpbGUociJceHh4XHl5eSIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogZmlsZTovLy94eHgveXl5LwogICAqIG5ldyBVcmkuZmlsZShyIlx4eHhceXl5LyIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogLy8gZmlsZTovLy9DOi94eHgveXl5CiAgICogbmV3IFVyaS5maWxlKHIiQzpceHh4XHl5eSIsIHdpbmRvd3M6IHRydWUpOwogICAqCiAgICogLy8gVGhpcyB0aHJvd3MgYW4gZXJyb3IuIEEgcGF0aCB3aXRoIGEgZHJpdmUgbGV0dGVyLCBidXQgbm8gZm9sbG93aW5nCiAgICogLy8gcGF0aCwgaXMgbm90IGFsbG93ZWQuCiAgICogbmV3IFVyaS5maWxlKHIiQzoiLCB3aW5kb3dzOiB0cnVlKTsKICAgKgogICAqIC8vIFRoaXMgdGhyb3dzIGFuIGVycm9yLiBBIHBhdGggd2l0aCBhIGRyaXZlIGxldHRlciBpcyBub3QgYWJzb2x1dGUuCiAgICogbmV3IFVyaS5maWxlKHIiQzp4eHhceXl5Iiwgd2luZG93czogdHJ1ZSk7CiAgICoKICAgKiAvLyBmaWxlOi8vc2VydmVyL3NoYXJlL2ZpbGUKICAgKiBuZXcgVXJpLmZpbGUociJcXHNlcnZlclxzaGFyZVxmaWxlIiwgd2luZG93czogdHJ1ZSk7CiAgICogYGBgCiAgICoKICAgKiBJZiB0aGUgcGF0aCBwYXNzZWQgaXMgbm90IGEgdmFsaWQgZmlsZSBwYXRoLCBhbiBlcnJvciBpcyB0aHJvd24uCiAgICovCiAgZmFjdG9yeSBVcmkuZmlsZShTdHJpbmcgcGF0aCwge2Jvb2wgd2luZG93c30pID0gX1VyaS5maWxlOwoKICAvKioKICAgKiBMaWtlIFtVcmkuZmlsZV0gZXhjZXB0IHRoYXQgYSBub24tZW1wdHkgVVJJIHBhdGggZW5kcyBpbiBhIHNsYXNoLgogICAqCiAgICogSWYgW3BhdGhdIGlzIG5vdCBlbXB0eSwgYW5kIGl0IGRvZXNuJ3QgZW5kIGluIGEgZGlyZWN0b3J5IHNlcGFyYXRvciwKICAgKiB0aGVuIGEgc2xhc2ggaXMgYWRkZWQgdG8gdGhlIHJldHVybmVkIFVSSSdzIHBhdGguCiAgICogSW4gYWxsIG90aGVyIGNhc2VzLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIHJldHVybmVkIGJ5IGBVcmkuZmlsZWAuCiAgICovCiAgZmFjdG9yeSBVcmkuZGlyZWN0b3J5KFN0cmluZyBwYXRoLCB7Ym9vbCB3aW5kb3dzfSkgPSBfVXJpLmRpcmVjdG9yeTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGBkYXRhOmAgVVJJIGNvbnRhaW5pbmcgdGhlIFtjb250ZW50XSBzdHJpbmcuCiAgICoKICAgKiBDb252ZXJ0cyB0aGUgY29udGVudCB0byBhIGJ5dGVzIHVzaW5nIFtlbmNvZGluZ10gb3IgdGhlIGNoYXJzZXQgc3BlY2lmaWVkCiAgICogaW4gW3BhcmFtZXRlcnNdIChkZWZhdWx0aW5nIHRvIFVTLUFTQ0lJIGlmIG5vdCBzcGVjaWZpZWQgb3IgdW5yZWNvZ25pemVkKSwKICAgKiB0aGVuIGVuY29kZXMgdGhlIGJ5dGVzIGludG8gdGhlIHJlc3VsdGluZyBkYXRhIFVSSS4KICAgKgogICAqIERlZmF1bHRzIHRvIGVuY29kaW5nIHVzaW5nIHBlcmNlbnQtZW5jb2RpbmcgKGFueSBub24tQVNDSUkgb3Igbm9uLVVSSS12YWxpZAogICAqIGJ5dGVzIGlzIHJlcGxhY2VkIGJ5IGEgcGVyY2VudCBlbmNvZGluZykuIElmIFtiYXNlNjRdIGlzIHRydWUsIHRoZSBieXRlcwogICAqIGFyZSBpbnN0ZWFkIGVuY29kZWQgdXNpbmcgW2Jhc2U2NF0uCiAgICoKICAgKiBJZiBbZW5jb2RpbmddIGlzIG5vdCBwcm92aWRlZCBhbmQgW3BhcmFtZXRlcnNdIGhhcyBhIGBjaGFyc2V0YCBlbnRyeSwKICAgKiB0aGF0IG5hbWUgaXMgbG9va2VkIHVwIHVzaW5nIFtFbmNvZGluZy5nZXRCeU5hbWVdLAogICAqIGFuZCBpZiB0aGUgbG9va3VwIHJldHVybnMgYW4gZW5jb2RpbmcsIHRoYXQgZW5jb2RpbmcgaXMgdXNlZCB0byBjb252ZXJ0CiAgICogW2NvbnRlbnRdIHRvIGJ5dGVzLgogICAqIElmIHByb3ZpZGluZyBib3RoIGFuIFtlbmNvZGluZ10gYW5kIGEgY2hhcnNldCBpbiBbcGFyYW1ldGVyc10sIHRoZXkgc2hvdWxkCiAgICogYWdyZWUsIG90aGVyd2lzZSBkZWNvZGluZyB3b24ndCBiZSBhYmxlIHRvIHVzZSB0aGUgY2hhcnNldCBwYXJhbWV0ZXIKICAgKiB0byBkZXRlcm1pbmUgdGhlIGVuY29kaW5nLgogICAqCiAgICogSWYgW21pbWVUeXBlXSBhbmQvb3IgW3BhcmFtZXRlcnNdIGFyZSBzdXBwbGllZCwgdGhleSBhcmUgYWRkZWQgdG8gdGhlCiAgICogY3JlYXRlZCBVUkkuIElmIGFueSBvZiB0aGVzZSBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGFsbG93ZWQKICAgKiBpbiB0aGUgZGF0YSBVUkksIHRoZSBjaGFyYWN0ZXIgaXMgcGVyY2VudC1lc2NhcGVkLiBJZiB0aGUgY2hhcmFjdGVyIGlzCiAgICogbm9uLUFTQ0lJLCBpdCBpcyBmaXJzdCBVVEYtOCBlbmNvZGVkIGFuZCB0aGVuIHRoZSBieXRlcyBhcmUgcGVyY2VudAogICAqIGVuY29kZWQuIEFuIG9taXR0ZWQgW21pbWVUeXBlXSBpbiBhIGRhdGEgVVJJIG1lYW5zIGB0ZXh0L3BsYWluYCwganVzdAogICAqIGFzIGFuIG9taXR0ZWQgYGNoYXJzZXRgIHBhcmFtZXRlciBkZWZhdWx0cyB0byBtZWFuaW5nIGBVUy1BU0NJSWAuCiAgICoKICAgKiBUbyByZWFkIHRoZSBjb250ZW50IGJhY2ssIHVzZSBbVXJpRGF0YS5jb250ZW50QXNTdHJpbmddLgogICAqLwogIGZhY3RvcnkgVXJpLmRhdGFGcm9tU3RyaW5nKFN0cmluZyBjb250ZW50LAogICAgICB7U3RyaW5nIG1pbWVUeXBlLAogICAgICBFbmNvZGluZyBlbmNvZGluZywKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAogICAgICBib29sIGJhc2U2NCA9IGZhbHNlfSkgewogICAgVXJpRGF0YSBkYXRhID0gVXJpRGF0YS5mcm9tU3RyaW5nKGNvbnRlbnQsCiAgICAgICAgbWltZVR5cGU6IG1pbWVUeXBlLAogICAgICAgIGVuY29kaW5nOiBlbmNvZGluZywKICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLAogICAgICAgIGJhc2U2NDogYmFzZTY0KTsKICAgIHJldHVybiBkYXRhLnVyaTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBgZGF0YTpgIFVSSSBjb250YWluaW5nIGFuIGVuY29kaW5nIG9mIFtieXRlc10uCiAgICoKICAgKiBEZWZhdWx0cyB0byBCYXNlNjQgZW5jb2RpbmcgdGhlIGJ5dGVzLCBidXQgaWYgW3BlcmNlbnRFbmNvZGVkXQogICAqIGlzIGB0cnVlYCwgdGhlIGJ5dGVzIHdpbGwgaW5zdGVhZCBiZSBwZXJjZW50IGVuY29kZWQgKGFueSBub24tQVNDSUkKICAgKiBvciBub24tdmFsaWQtQVNDSUktY2hhcmFjdGVyIGJ5dGUgaXMgcmVwbGFjZWQgYnkgYSBwZXJjZW50IGVuY29kaW5nKS4KICAgKgogICAqIFRvIHJlYWQgdGhlIGJ5dGVzIGJhY2ssIHVzZSBbVXJpRGF0YS5jb250ZW50QXNCeXRlc10uCiAgICoKICAgKiBJdCBkZWZhdWx0cyB0byBoYXZpbmcgdGhlIG1pbWUtdHlwZSBgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtYC4KICAgKiBUaGUgW21pbWVUeXBlXSBhbmQgW3BhcmFtZXRlcnNdIGFyZSBhZGRlZCB0byB0aGUgY3JlYXRlZCBVUkkuCiAgICogSWYgYW55IG9mIHRoZXNlIGNvbnRhaW4gY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgYWxsb3dlZAogICAqIGluIHRoZSBkYXRhIFVSSSwgdGhlIGNoYXJhY3RlciBpcyBwZXJjZW50LWVzY2FwZWQuIElmIHRoZSBjaGFyYWN0ZXIgaXMKICAgKiBub24tQVNDSUksIGl0IGlzIGZpcnN0IFVURi04IGVuY29kZWQgYW5kIHRoZW4gdGhlIGJ5dGVzIGFyZSBwZXJjZW50CiAgICogZW5jb2RlZC4KICAgKi8KICBmYWN0b3J5IFVyaS5kYXRhRnJvbUJ5dGVzKExpc3Q8aW50PiBieXRlcywKICAgICAge21pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsCiAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKICAgICAgcGVyY2VudEVuY29kZWQgPSBmYWxzZX0pIHsKICAgIFVyaURhdGEgZGF0YSA9IFVyaURhdGEuZnJvbUJ5dGVzKGJ5dGVzLAogICAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZSwKICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLAogICAgICAgIHBlcmNlbnRFbmNvZGVkOiBwZXJjZW50RW5jb2RlZCk7CiAgICByZXR1cm4gZGF0YS51cmk7CiAgfQoKICAvKioKICAgKiBUaGUgc2NoZW1lIGNvbXBvbmVudCBvZiB0aGUgVVJJLgogICAqCiAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIHNjaGVtZSBjb21wb25lbnQuCiAgICoKICAgKiBBIFVSSSBzY2hlbWUgaXMgY2FzZSBpbnNlbnNpdGl2ZS4KICAgKiBUaGUgcmV0dXJuZWQgc2NoZW1lIGlzIGNhbm9uaWNhbGl6ZWQgdG8gbG93ZXJjYXNlIGxldHRlcnMuCiAgICovCiAgU3RyaW5nIGdldCBzY2hlbWU7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGF1dGhvcml0eSBjb21wb25lbnQuCiAgICoKICAgKiBUaGUgYXV0aG9yaXR5IGlzIGZvcm1hdHRlZCBmcm9tIHRoZSBbdXNlckluZm9dLCBbaG9zdF0gYW5kIFtwb3J0XQogICAqIHBhcnRzLgogICAqCiAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGF1dGhvcml0eSBjb21wb25lbnQuCiAgICovCiAgU3RyaW5nIGdldCBhdXRob3JpdHk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHVzZXIgaW5mbyBwYXJ0IG9mIHRoZSBhdXRob3JpdHkgY29tcG9uZW50LgogICAqCiAgICogUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIHVzZXIgaW5mbyBpbiB0aGUKICAgKiBhdXRob3JpdHkgY29tcG9uZW50LgogICAqLwogIFN0cmluZyBnZXQgdXNlckluZm87CgogIC8qKgogICAqIFJldHVybnMgdGhlIGhvc3QgcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudC4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBhdXRob3JpdHkgY29tcG9uZW50IGFuZAogICAqIGhlbmNlIG5vIGhvc3QuCiAgICoKICAgKiBJZiB0aGUgaG9zdCBpcyBhbiBJUCB2ZXJzaW9uIDYgYWRkcmVzcywgdGhlIHN1cnJvdW5kaW5nIGBbYCBhbmQgYF1gIGlzCiAgICogcmVtb3ZlZC4KICAgKgogICAqIFRoZSBob3N0IHN0cmluZyBpcyBjYXNlLWluc2Vuc2l0aXZlLgogICAqIFRoZSByZXR1cm5lZCBob3N0IG5hbWUgaXMgY2Fub25pY2FsaXplZCB0byBsb3dlci1jYXNlCiAgICogd2l0aCB1cHBlci1jYXNlIHBlcmNlbnQtZXNjYXBlcy4KICAgKi8KICBTdHJpbmcgZ2V0IGhvc3Q7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHBvcnQgcGFydCBvZiB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudC4KICAgKgogICAqIFJldHVybnMgdGhlIGRlZmF1bHQgcG9ydCBpZiB0aGVyZSBpcyBubyBwb3J0IG51bWJlciBpbiB0aGUgYXV0aG9yaXR5CiAgICogY29tcG9uZW50LiBUaGF0J3MgODAgZm9yIGh0dHAsIDQ0MyBmb3IgaHR0cHMsIGFuZCAwIGZvciBldmVyeXRoaW5nIGVsc2UuCiAgICovCiAgaW50IGdldCBwb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwYXRoIGNvbXBvbmVudC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBwYXRoIGlzIGVuY29kZWQuIFRvIGdldCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBkZWNvZGVkCiAgICogcGF0aCB1c2UgW3BhdGhTZWdtZW50c10uCiAgICoKICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gcGF0aCBjb21wb25lbnQuCiAgICovCiAgU3RyaW5nIGdldCBwYXRoOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBxdWVyeSBjb21wb25lbnQuIFRoZSByZXR1cm5lZCBxdWVyeSBpcyBlbmNvZGVkLiBUbyBnZXQKICAgKiBkaXJlY3QgYWNjZXNzIHRvIHRoZSBkZWNvZGVkIHF1ZXJ5IHVzZSBbcXVlcnlQYXJhbWV0ZXJzXS4KICAgKgogICAqIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcyBubyBxdWVyeSBjb21wb25lbnQuCiAgICovCiAgU3RyaW5nIGdldCBxdWVyeTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBjb21wb25lbnQuCiAgICoKICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gZnJhZ21lbnQgaWRlbnRpZmllcgogICAqIGNvbXBvbmVudC4KICAgKi8KICBTdHJpbmcgZ2V0IGZyYWdtZW50OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBVUkkgcGF0aCBzcGxpdCBpbnRvIGl0cyBzZWdtZW50cy4gRWFjaCBvZiB0aGUgc2VnbWVudHMgaW4gdGhlCiAgICogcmV0dXJuZWQgbGlzdCBoYXZlIGJlZW4gZGVjb2RlZC4gSWYgdGhlIHBhdGggaXMgZW1wdHkgdGhlIGVtcHR5IGxpc3Qgd2lsbAogICAqIGJlIHJldHVybmVkLiBBIGxlYWRpbmcgc2xhc2ggYC9gIGRvZXMgbm90IGFmZmVjdCB0aGUgc2VnbWVudHMgcmV0dXJuZWQuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgbGlzdCBpcyB1bm1vZGlmaWFibGUgYW5kIHdpbGwgdGhyb3cgW1Vuc3VwcG9ydGVkRXJyb3JdIG9uIGFueQogICAqIGNhbGxzIHRoYXQgd291bGQgbXV0YXRlIGl0LgogICAqLwogIExpc3Q8U3RyaW5nPiBnZXQgcGF0aFNlZ21lbnRzOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBVUkkgcXVlcnkgc3BsaXQgaW50byBhIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCiAgICogc3BlY2lmaWVkIGZvciBGT1JNIHBvc3QgaW4gdGhlIFtIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBzZWN0aW9uCiAgICogMTcuMTMuNF0oaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuNCAiSFRNTCA0LjAxIHNlY3Rpb24gMTcuMTMuNCIpLgogICAqIEVhY2gga2V5IGFuZCB2YWx1ZSBpbiB0aGUgcmV0dXJuZWQgbWFwIGhhcyBiZWVuIGRlY29kZWQuCiAgICogSWYgdGhlcmUgaXMgbm8gcXVlcnkgdGhlIGVtcHR5IG1hcCBpcyByZXR1cm5lZC4KICAgKgogICAqIEtleXMgaW4gdGhlIHF1ZXJ5IHN0cmluZyB0aGF0IGhhdmUgbm8gdmFsdWUgYXJlIG1hcHBlZCB0byB0aGUKICAgKiBlbXB0eSBzdHJpbmcuCiAgICogSWYgYSBrZXkgb2NjdXJzIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBxdWVyeSBzdHJpbmcsIGl0IGlzIG1hcHBlZCB0bwogICAqIGFuIGFyYml0cmFyeSBjaG9pY2Ugb2YgcG9zc2libGUgdmFsdWUuCiAgICogVGhlIFtxdWVyeVBhcmFtZXRlcnNBbGxdIGdldHRlciBjYW4gcHJvdmlkZSBhIG1hcAogICAqIHRoYXQgbWFwcyBrZXlzIHRvIGFsbCBvZiB0aGVpciB2YWx1ZXMuCiAgICoKICAgKiBUaGUgcmV0dXJuZWQgbWFwIGlzIHVubW9kaWZpYWJsZS4KICAgKi8KICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBxdWVyeVBhcmFtZXRlcnM7CgogIC8qKgogICAqIFJldHVybnMgdGhlIFVSSSBxdWVyeSBzcGxpdCBpbnRvIGEgbWFwIGFjY29yZGluZyB0byB0aGUgcnVsZXMKICAgKiBzcGVjaWZpZWQgZm9yIEZPUk0gcG9zdCBpbiB0aGUgW0hUTUwgNC4wMSBzcGVjaWZpY2F0aW9uIHNlY3Rpb24KICAgKiAxNy4xMy40XShodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMy40ICJIVE1MIDQuMDEgc2VjdGlvbiAxNy4xMy40IikuCiAgICogRWFjaCBrZXkgYW5kIHZhbHVlIGluIHRoZSByZXR1cm5lZCBtYXAgaGFzIGJlZW4gZGVjb2RlZC4gSWYgdGhlcmUgaXMgbm8KICAgKiBxdWVyeSB0aGUgZW1wdHkgbWFwIGlzIHJldHVybmVkLgogICAqCiAgICogS2V5cyBhcmUgbWFwcGVkIHRvIGxpc3RzIG9mIHRoZWlyIHZhbHVlcy4gSWYgYSBrZXkgb2NjdXJzIG9ubHkgb25jZSwKICAgKiBpdHMgdmFsdWUgaXMgYSBzaW5nbGV0b24gbGlzdC4gSWYgYSBrZXkgb2NjdXJzIHdpdGggbm8gdmFsdWUsIHRoZQogICAqIGVtcHR5IHN0cmluZyBpcyB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhhdCBvY2N1cnJlbmNlLgogICAqCiAgICogVGhlIHJldHVybmVkIG1hcCBhbmQgdGhlIGxpc3RzIGl0IGNvbnRhaW5zIGFyZSB1bm1vZGlmaWFibGUuCiAgICovCiAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXQgcXVlcnlQYXJhbWV0ZXJzQWxsOwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBpcyBhYnNvbHV0ZS4KICAgKgogICAqIEEgVVJJIGlzIGFuIGFic29sdXRlIFVSSSBpbiB0aGUgc2Vuc2Ugb2YgUkZDIDM5ODYgaWYgaXQgaGFzIGEgc2NoZW1lCiAgICogYW5kIG5vIGZyYWdtZW50LgogICAqLwogIGJvb2wgZ2V0IGlzQWJzb2x1dGU7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgVVJJIGhhcyBhIFtzY2hlbWVdIGNvbXBvbmVudC4KICAgKi8KICBib29sIGdldCBoYXNTY2hlbWUgPT4gc2NoZW1lLmlzTm90RW1wdHk7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgVVJJIGhhcyBhbiBbYXV0aG9yaXR5XSBjb21wb25lbnQuCiAgICovCiAgYm9vbCBnZXQgaGFzQXV0aG9yaXR5OwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYW4gZXhwbGljaXQgcG9ydC4KICAgKgogICAqIElmIHRoZSBwb3J0IG51bWJlciBpcyB0aGUgZGVmYXVsdCBwb3J0IG51bWJlcgogICAqICh6ZXJvIGZvciB1bnJlY29nbml6ZWQgc2NoZW1lcywgd2l0aCBodHRwICg4MCkgYW5kIGh0dHBzICg0NDMpIGJlaW5nCiAgICogcmVjb2duaXplZCksCiAgICogdGhlbiB0aGUgcG9ydCBpcyBtYWRlIGltcGxpY2l0IGFuZCBvbWl0dGVkIGZyb20gdGhlIFVSSS4KICAgKi8KICBib29sIGdldCBoYXNQb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYSBxdWVyeSBwYXJ0LgogICAqLwogIGJvb2wgZ2V0IGhhc1F1ZXJ5OwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYSBmcmFnbWVudCBwYXJ0LgogICAqLwogIGJvb2wgZ2V0IGhhc0ZyYWdtZW50OwoKICAvKioKICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIFVSSSBoYXMgYW4gZW1wdHkgcGF0aC4KICAgKi8KICBib29sIGdldCBoYXNFbXB0eVBhdGg7CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciB0aGUgVVJJIGhhcyBhbiBhYnNvbHV0ZSBwYXRoIChzdGFydGluZyB3aXRoICcvJykuCiAgICovCiAgYm9vbCBnZXQgaGFzQWJzb2x1dGVQYXRoOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIFVSSSBpbiB0aGUgZm9ybSBzY2hlbWU6Ly9ob3N0OnBvcnQgZm9yIHRoZQogICAqIHNjaGVtZXMgaHR0cCBhbmQgaHR0cHMuCiAgICoKICAgKiBJdCBpcyBhbiBlcnJvciBpZiB0aGUgc2NoZW1lIGlzIG5vdCAiaHR0cCIgb3IgImh0dHBzIiwgb3IgaWYgdGhlIGhvc3QgbmFtZQogICAqIGlzIG1pc3Npbmcgb3IgZW1wdHkuCiAgICoKICAgKiBTZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvV0QtaHRtbDUtMjAxMTA0MDUvb3JpZ2luLTAuaHRtbCNvcmlnaW4KICAgKi8KICBTdHJpbmcgZ2V0IG9yaWdpbjsKCiAgLy8vIFdoZXRoZXIgdGhlIHNjaGVtZSBvZiB0aGlzIFtVcmldIGlzIFtzY2hlbWVdLgogIC8vLwogIC8vLyBUaGUgW3NjaGVtZV0gc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmV0dXJuZWQgYnkgW1VyaS5zY2hlbWVdLAogIC8vLyBidXQgZG9lc24ndCBoYXZlIHRvIGJlIGNhc2Utbm9ybWFsaXplZCB0byBsb3dlci1jYXNlIGNoYXJhY3RlcnMuCiAgLy8vCiAgLy8vIEV4YW1wbGU6CiAgLy8vIGBgYGRhcnQKICAvLy8gdmFyIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tLyIpOwogIC8vLyBwcmludCh1cmkuaXNTY2hlbWUoIkhUVFAiKSk7ICAvLyBQcmludHMgdHJ1ZS4KICAvLy8gYGBgCiAgLy8vCiAgLy8vIEEgYG51bGxgIG9yIGVtcHR5IFtzY2hlbWVdIHN0cmluZyBtYXRjaGVzIGEgVVJJIHdpdGggbm8gc2NoZW1lCiAgLy8vIChvbmUgd2hlcmUgW2hhc1NjaGVtZV0gcmV0dXJucyBmYWxzZSkuCiAgYm9vbCBpc1NjaGVtZShTdHJpbmcgc2NoZW1lKTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSS4KICAgKgogICAqIFRoZSByZXR1cm5lZCBwYXRoIGhhcyBlaXRoZXIgV2luZG93cyBvciBub24tV2luZG93cwogICAqIHNlbWFudGljcy4KICAgKgogICAqIEZvciBub24tV2luZG93cyBzZW1hbnRpY3MgdGhlIHNsYXNoICgiLyIpIGlzIHVzZWQgdG8gc2VwYXJhdGUKICAgKiBwYXRoIHNlZ21lbnRzLgogICAqCiAgICogRm9yIFdpbmRvd3Mgc2VtYW50aWNzIHRoZSBiYWNrc2xhc2ggKCJcXCIpIHNlcGFyYXRvciBpcyB1c2VkIHRvCiAgICogc2VwYXJhdGUgcGF0aCBzZWdtZW50cy4KICAgKgogICAqIElmIHRoZSBVUkkgaXMgYWJzb2x1dGUgdGhlIHBhdGggc3RhcnRzIHdpdGggYSBwYXRoIHNlcGFyYXRvcgogICAqIHVubGVzcyBXaW5kb3dzIHNlbWFudGljcyBpcyB1c2VkIGFuZCB0aGUgZmlyc3QgcGF0aCBzZWdtZW50IGlzIGEKICAgKiBkcml2ZSBsZXR0ZXIuIFdoZW4gV2luZG93cyBzZW1hbnRpY3MgaXMgdXNlZCBhIGhvc3QgY29tcG9uZW50IGluCiAgICogdGhlIHVyaSBpbiBpbnRlcnByZXRlZCBhcyBhIGZpbGUgc2VydmVyIGFuZCBhIFVOQyBwYXRoIGlzCiAgICogcmV0dXJuZWQuCiAgICoKICAgKiBUaGUgZGVmYXVsdCBmb3Igd2hldGhlciB0byB1c2UgV2luZG93cyBvciBub24tV2luZG93cyBzZW1hbnRpY3MKICAgKiBkZXRlcm1pbmVkIGZyb20gdGhlIHBsYXRmb3JtIERhcnQgaXMgcnVubmluZyBvbi4gV2hlbiBydW5uaW5nIGluCiAgICogdGhlIHN0YW5kYWxvbmUgVk0gdGhpcyBpcyBkZXRlY3RlZCBieSB0aGUgVk0gYmFzZWQgb24gdGhlCiAgICogb3BlcmF0aW5nIHN5c3RlbS4gV2hlbiBydW5uaW5nIGluIGEgYnJvd3NlciBub24tV2luZG93cyBzZW1hbnRpY3MKICAgKiBpcyBhbHdheXMgdXNlZC4KICAgKgogICAqIFRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHdoaWNoIHNlbWFudGljcyB0byB1c2UgcGFzcwogICAqIGEgdmFsdWUgZm9yIFt3aW5kb3dzXS4gUGFzc2luZyBgdHJ1ZWAgd2lsbCB1c2UgV2luZG93cwogICAqIHNlbWFudGljcyBhbmQgcGFzc2luZyBgZmFsc2VgIHdpbGwgdXNlIG5vbi1XaW5kb3dzIHNlbWFudGljcy4KICAgKgogICAqIElmIHRoZSBVUkkgZW5kcyB3aXRoIGEgc2xhc2ggKGkuZS4gdGhlIGxhc3QgcGF0aCBjb21wb25lbnQgaXMKICAgKiBlbXB0eSkgdGhlIHJldHVybmVkIGZpbGUgcGF0aCB3aWxsIGFsc28gZW5kIHdpdGggYSBzbGFzaC4KICAgKgogICAqIFdpdGggV2luZG93cyBzZW1hbnRpY3MgVVJJcyBzdGFydGluZyB3aXRoIGEgZHJpdmUgbGV0dGVyIGNhbm5vdAogICAqIGJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRyaXZlIG9uIHRoZSBkZXNpZ25hdGVkIGRyaXZlLiBUaGF0IGlzCiAgICogZm9yIHRoZSBVUkkgYGZpbGU6Ly8vYzphYmNgIGNhbGxpbmcgYHRvRmlsZVBhdGhgIHdpbGwgdGhyb3cgYXMgYQogICAqIHBhdGggc2VnbWVudCBjYW5ub3QgY29udGFpbiBjb2xvbiBvbiBXaW5kb3dzLgogICAqCiAgICogRXhhbXBsZXMgdXNpbmcgbm9uLVdpbmRvd3Mgc2VtYW50aWNzIChyZXN1bHRpbmcgb2YgY2FsbGluZwogICAqIHRvRmlsZVBhdGggaW4gY29tbWVudCk6CiAgICoKICAgKiAgICAgVXJpLnBhcnNlKCJ4eHgveXl5Iik7ICAvLyB4eHgveXl5CiAgICogICAgIFVyaS5wYXJzZSgieHh4L3l5eS8iKTsgIC8vIHh4eC95eXkvCiAgICogICAgIFVyaS5wYXJzZSgiZmlsZTovLy94eHgveXl5Iik7ICAvLyAveHh4L3l5eQogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8veHh4L3l5eS8iKTsgIC8vIC94eHgveXl5LwogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8vQzoiKTsgIC8vIC9DOgogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly8vQzphIik7ICAvLyAvQzphCiAgICoKICAgKiBFeGFtcGxlcyB1c2luZyBXaW5kb3dzIHNlbWFudGljcyAocmVzdWx0aW5nIFVSSSBpbiBjb21tZW50KToKICAgKgogICAqICAgICBVcmkucGFyc2UoInh4eC95eXkiKTsgIC8vIHh4eFx5eXkKICAgKiAgICAgVXJpLnBhcnNlKCJ4eHgveXl5LyIpOyAgLy8geHh4XHl5eVwKICAgKiAgICAgVXJpLnBhcnNlKCJmaWxlOi8vL3h4eC95eXkiKTsgIC8vIFx4eHhceXl5CiAgICogICAgIFVyaS5wYXJzZSgiZmlsZTovLy94eHgveXl5LyIpOyAgLy8gXHh4eFx5eXlcCiAgICogICAgIFVyaS5wYXJzZSgiZmlsZTovLy9DOi94eHgveXl5Iik7ICAvLyBDOlx4eHhceXl5CiAgICogICAgIFVyaS5wYXJzZSgiZmlsZTpDOnh4eC95eXkiKTsgIC8vIFRocm93cyBhcyBhIHBhdGggc2VnbWVudAogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgY29udGFpbiBjb2xvbiBvbiBXaW5kb3dzLgogICAqICAgICBVcmkucGFyc2UoImZpbGU6Ly9zZXJ2ZXIvc2hhcmUvZmlsZSIpOyAgLy8gXFxzZXJ2ZXJcc2hhcmVcZmlsZQogICAqCiAgICogSWYgdGhlIFVSSSBpcyBub3QgYSBmaWxlIFVSSSBjYWxsaW5nIHRoaXMgdGhyb3dzCiAgICogW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqCiAgICogSWYgdGhlIFVSSSBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgZmlsZSBwYXRoIGNhbGxpbmcgdGhpcyB0aHJvd3MKICAgKiBbVW5zdXBwb3J0ZWRFcnJvcl0uCiAgICovCiAgLy8gVE9ETyhscm4pOiBEZXByZWNhdGUgYW5kIG1vdmUgZnVuY3Rpb25hbGl0eSB0byBGaWxlIGNsYXNzIG9yIHNpbWlsYXIuCiAgLy8gVGhlIGNvcmUgbGlicmFyaWVzIHNob3VsZCBub3Qgd29ycnkgYWJvdXQgdGhlIHBsYXRmb3JtLgogIFN0cmluZyB0b0ZpbGVQYXRoKHtib29sIHdpbmRvd3N9KTsKCiAgLyoqCiAgICogQWNjZXNzIHRoZSBzdHJ1Y3R1cmUgb2YgYSBgZGF0YTpgIFVSSS4KICAgKgogICAqIFJldHVybnMgYSBbVXJpRGF0YV0gb2JqZWN0IGZvciBgZGF0YTpgIFVSSXMgYW5kIGBudWxsYCBmb3IgYWxsIG90aGVyCiAgICogVVJJcy4KICAgKiBUaGUgW1VyaURhdGFdIG9iamVjdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIG1lZGlhIHR5cGUgYW5kIGRhdGEKICAgKiBvZiBhIGBkYXRhOmAgVVJJLgogICAqLwogIFVyaURhdGEgZ2V0IGRhdGE7CgogIC8vLyBSZXR1cm5zIGEgaGFzaCBjb2RlIGNvbXB1dGVkIGFzIGB0b1N0cmluZygpLmhhc2hDb2RlYC4KICAvLy8KICAvLy8gVGhpcyBndWFyYW50ZWVzIHRoYXQgVVJJcyB3aXRoIHRoZSBzYW1lIG5vcm1hbGl6ZWQKICBpbnQgZ2V0IGhhc2hDb2RlOwoKICAvLy8gQSBVUkkgaXMgZXF1YWwgdG8gYW5vdGhlciBVUkkgd2l0aCB0aGUgc2FtZSBub3JtYWxpemVkIHJlcHJlc2VudGF0aW9uLgogIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG90aGVyKTsKCiAgLy8vIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkkuCiAgU3RyaW5nIHRvU3RyaW5nKCk7CgogIC8qKgogICAqIFJldHVybnMgYSBuZXcgYFVyaWAgYmFzZWQgb24gdGhpcyBvbmUsIGJ1dCB3aXRoIHNvbWUgcGFydHMgcmVwbGFjZWQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBbbmV3IFVyaV0gY29uc3RydWN0b3IsCiAgICogYW5kIHRoZXkgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nLgogICAqCiAgICogQXQgbW9zdCBvbmUgb2YgW3BhdGhdIGFuZCBbcGF0aFNlZ21lbnRzXSBtdXN0IGJlIHByb3ZpZGVkLgogICAqIExpa2V3aXNlLCBhdCBtb3N0IG9uZSBvZiBbcXVlcnldIGFuZCBbcXVlcnlQYXJhbWV0ZXJzXSBtdXN0IGJlIHByb3ZpZGVkLgogICAqCiAgICogRWFjaCBwYXJ0IHRoYXQgaXMgbm90IHByb3ZpZGVkIHdpbGwgZGVmYXVsdCB0byB0aGUgY29ycmVzcG9uZGluZwogICAqIHZhbHVlIGZyb20gdGhpcyBgVXJpYCBpbnN0ZWFkLgogICAqCiAgICogVGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gW1VyaS5yZXNvbHZlXSB3aGljaCBvdmVycmlkZXMgaW4gYQogICAqIGhpZXJhcmNoaWNhbCBtYW5uZXIsCiAgICogYW5kIGNhbiBpbnN0ZWFkIHJlcGxhY2UgZWFjaCBwYXJ0IG9mIGEgYFVyaWAgaW5kaXZpZHVhbGx5LgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqICAgICBVcmkgdXJpMSA9IFVyaS5wYXJzZSgiYTovL2JAYzo0L2QvZT9mI2ciKTsKICAgKiAgICAgVXJpIHVyaTIgPSB1cmkxLnJlcGxhY2Uoc2NoZW1lOiAiQSIsIHBhdGg6ICJEL0UvRSIsIGZyYWdtZW50OiAiRyIpOwogICAqICAgICBwcmludCh1cmkyKTsgIC8vIHByaW50cyAiYTovL2JAYzo0L0QvRS9FP2YjRyIKICAgKgogICAqIFRoaXMgbWV0aG9kIGFjdHMgc2ltaWxhcmx5IHRvIHVzaW5nIHRoZSBgbmV3IFVyaWAgY29uc3RydWN0b3Igd2l0aAogICAqIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0YWtlbiBmcm9tIHRoaXMgYFVyaWAuIEV4YW1wbGU6CiAgICoKICAgKiAgICAgVXJpIHVyaTMgPSBuZXcgVXJpKAogICAqICAgICAgICAgc2NoZW1lOiAiQSIsCiAgICogICAgICAgICB1c2VySW5mbzogdXJpMS51c2VySW5mbywKICAgKiAgICAgICAgIGhvc3Q6IHVyaTEuaG9zdCwKICAgKiAgICAgICAgIHBvcnQ6IHVyaTEucG9ydCwKICAgKiAgICAgICAgIHBhdGg6ICJEL0UvRSIsCiAgICogICAgICAgICBxdWVyeTogdXJpMS5xdWVyeSwKICAgKiAgICAgICAgIGZyYWdtZW50OiAiRyIpOwogICAqICAgICBwcmludCh1cmkzKTsgIC8vIHByaW50cyAiYTovL2JAYzo0L0QvRS9FP2YjRyIKICAgKiAgICAgcHJpbnQodXJpMiA9PSB1cmkzKTsgIC8vIHByaW50cyB0cnVlLgogICAqCiAgICogVXNpbmcgdGhpcyBtZXRob2QgY2FuIGJlIHNlZW4gYXMgYSBzaG9ydGhhbmQgZm9yIHRoZSBgVXJpYCBjb25zdHJ1Y3RvcgogICAqIGNhbGwgYWJvdmUsIGJ1dCBtYXkgYWxzbyBiZSBzbGlnaHRseSBmYXN0ZXIgYmVjYXVzZSB0aGUgcGFydHMgdGFrZW4KICAgKiBmcm9tIHRoaXMgYFVyaWAgbmVlZCBub3QgYmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkgYWdhaW4uCiAgICovCiAgVXJpIHJlcGxhY2UoCiAgICAgIHtTdHJpbmcgc2NoZW1lLAogICAgICBTdHJpbmcgdXNlckluZm8sCiAgICAgIFN0cmluZyBob3N0LAogICAgICBpbnQgcG9ydCwKICAgICAgU3RyaW5nIHBhdGgsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcGF0aFNlZ21lbnRzLAogICAgICBTdHJpbmcgcXVlcnksCiAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWMgLypTdHJpbmd8SXRlcmFibGU8U3RyaW5nPiovID4gcXVlcnlQYXJhbWV0ZXJzLAogICAgICBTdHJpbmcgZnJhZ21lbnR9KTsKCiAgLyoqCiAgICogUmV0dXJucyBhIGBVcmlgIHRoYXQgZGlmZmVycyBmcm9tIHRoaXMgb25seSBpbiBub3QgaGF2aW5nIGEgZnJhZ21lbnQuCiAgICoKICAgKiBJZiB0aGlzIGBVcmlgIGRvZXMgbm90IGhhdmUgYSBmcmFnbWVudCwgaXQgaXMgaXRzZWxmIHJldHVybmVkLgogICAqLwogIFVyaSByZW1vdmVGcmFnbWVudCgpOwoKICAvKioKICAgKiBSZXNvbHZlIFtyZWZlcmVuY2VdIGFzIGFuIFVSSSByZWxhdGl2ZSB0byBgdGhpc2AuCiAgICoKICAgKiBGaXJzdCB0dXJuIFtyZWZlcmVuY2VdIGludG8gYSBVUkkgdXNpbmcgW1VyaS5wYXJzZV0uIFRoZW4gcmVzb2x2ZSB0aGUKICAgKiByZXN1bHRpbmcgVVJJIHJlbGF0aXZlIHRvIGB0aGlzYC4KICAgKgogICAqIFJldHVybnMgdGhlIHJlc29sdmVkIFVSSS4KICAgKgogICAqIFNlZSBbcmVzb2x2ZVVyaV0gZm9yIGRldGFpbHMuCiAgICovCiAgVXJpIHJlc29sdmUoU3RyaW5nIHJlZmVyZW5jZSk7CgogIC8qKgogICAqIFJlc29sdmUgW3JlZmVyZW5jZV0gYXMgYW4gVVJJIHJlbGF0aXZlIHRvIGB0aGlzYC4KICAgKgogICAqIFJldHVybnMgdGhlIHJlc29sdmVkIFVSSS4KICAgKgogICAqIFRoZSBhbGdvcml0aG0gIlRyYW5zZm9ybSBSZWZlcmVuY2UiIGZvciByZXNvbHZpbmcgYSByZWZlcmVuY2UgaXMgZGVzY3JpYmVkCiAgICogaW4gW1JGQy0zOTg2IFNlY3Rpb24gNV0oaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTUgIlJGQy0xMTIzIikuCiAgICoKICAgKiBVcGRhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYmFzZSBVUkkgaXMganVzdCBhIHJlbGF0aXZlIHBhdGggLQogICAqIHRoYXQgaXM6IHdoZW4gaXQgaGFzIG5vIHNjaGVtZSBhbmQgbm8gYXV0aG9yaXR5IGFuZCB0aGUgcGF0aCBkb2VzIG5vdCBzdGFydAogICAqIHdpdGggYSBzbGFzaC4KICAgKiBJbiB0aGF0IGNhc2UsIHRoZSBwYXRocyBhcmUgY29tYmluZWQgd2l0aG91dCByZW1vdmluZyBsZWFkaW5nICIuLiIsIGFuZAogICAqIGFuIGVtcHR5IHBhdGggaXMgbm90IGNvbnZlcnRlZCB0byAiLyIuCiAgICovCiAgVXJpIHJlc29sdmVVcmkoVXJpIHJlZmVyZW5jZSk7CgogIC8qKgogICAqIFJldHVybnMgYSBVUkkgd2hlcmUgdGhlIHBhdGggaGFzIGJlZW4gbm9ybWFsaXplZC4KICAgKgogICAqIEEgbm9ybWFsaXplZCBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYC5gIHNlZ21lbnRzIG9yIG5vbi1sZWFkaW5nIGAuLmAKICAgKiBzZWdtZW50cy4KICAgKiBPbmx5IGEgcmVsYXRpdmUgcGF0aCB3aXRoIG5vIHNjaGVtZSBvciBhdXRob3JpdHkgbWF5IGNvbnRhaW4KICAgKiBsZWFkaW5nIGAuLmAgc2VnbWVudHMsCiAgICogYSBwYXRoIHRoYXQgc3RhcnRzIHdpdGggYC9gIHdpbGwgYWxzbyBkcm9wIGFueSBsZWFkaW5nIGAuLmAgc2VnbWVudHMuCiAgICoKICAgKiBUaGlzIHVzZXMgdGhlIHNhbWUgbm9ybWFsaXphdGlvbiBzdHJhdGVneSBhcyBgbmV3IFVyaSgpLnJlc29sdmUodGhpcylgLgogICAqCiAgICogRG9lcyBub3QgY2hhbmdlIGFueSBwYXJ0IG9mIHRoZSBVUkkgZXhjZXB0IHRoZSBwYXRoLgogICAqCiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYFVyaWAgYWx3YXlzIG5vcm1hbGl6ZXMgcGF0aHMsIHNvIGNhbGxpbmcKICAgKiB0aGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QuCiAgICovCiAgVXJpIG5vcm1hbGl6ZVBhdGgoKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBgVXJpYCBvYmplY3QgYnkgcGFyc2luZyBhIFVSSSBzdHJpbmcuCiAgICoKICAgKiBJZiBbc3RhcnRdIGFuZCBbZW5kXSBhcmUgcHJvdmlkZWQsIHRoZXkgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgc3Vic3RyaW5nCiAgICogb2YgW3VyaV0sIGFuZCBvbmx5IHRoZSBzdWJzdHJpbmcgZnJvbSBgc3RhcnRgIHRvIGBlbmRgIGlzIHBhcnNlZCBhcyBhIFVSSS4KICAgKgogICAqIFRoZSBbdXJpXSBtdXN0IG5vdCBiZSBgbnVsbGAuCiAgICogSWYgdGhlIFt1cmldIHN0cmluZyBpcyBub3QgdmFsaWQgYXMgYSBVUkkgb3IgVVJJIHJlZmVyZW5jZSwKICAgKiBhIFtGb3JtYXRFeGNlcHRpb25dIGlzIHRocm93bi4KICAgKi8KICBzdGF0aWMgVXJpIHBhcnNlKFN0cmluZyB1cmksIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgLy8gVGhpcyBwYXJzaW5nIHdpbGwgbm90IHZhbGlkYXRlIHBlcmNlbnQtZW5jb2RpbmcsIElQdjYsIGV0Yy4KICAgIC8vIFdoZW4gZG9uZSBzcGxpdHRpbmcgaW50byBwYXJ0cywgaXQgd2lsbCBjYWxsLCBlLmcuLCBbX21ha2VGcmFnbWVudF0KICAgIC8vIHRvIGRvIHRoZSBmaW5hbCBwYXJzaW5nLgogICAgLy8KICAgIC8vIEltcG9ydGFudCBwYXJ0cyBvZiB0aGUgUkZDIDM5ODYgdXNlZCBoZXJlOgogICAgLy8gVVJJICAgICAgICAgICA9IHNjaGVtZSAiOiIgaGllci1wYXJ0IFsgIj8iIHF1ZXJ5IF0gWyAiIyIgZnJhZ21lbnQgXQogICAgLy8KICAgIC8vIGhpZXItcGFydCAgICAgPSAiLy8iIGF1dGhvcml0eSBwYXRoLWFiZW1wdHkKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLWFic29sdXRlCiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1yb290bGVzcwogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtZW1wdHkKICAgIC8vCiAgICAvLyBVUkktcmVmZXJlbmNlID0gVVJJIC8gcmVsYXRpdmUtcmVmCiAgICAvLwogICAgLy8gYWJzb2x1dGUtVVJJICA9IHNjaGVtZSAiOiIgaGllci1wYXJ0IFsgIj8iIHF1ZXJ5IF0KICAgIC8vCiAgICAvLyByZWxhdGl2ZS1yZWYgID0gcmVsYXRpdmUtcGFydCBbICI/IiBxdWVyeSBdIFsgIiMiIGZyYWdtZW50IF0KICAgIC8vCiAgICAvLyByZWxhdGl2ZS1wYXJ0ID0gIi8vIiBhdXRob3JpdHkgcGF0aC1hYmVtcHR5CiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1hYnNvbHV0ZQogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtbm9zY2hlbWUKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLWVtcHR5CiAgICAvLwogICAgLy8gc2NoZW1lICAgICAgICA9IEFMUEhBICooIEFMUEhBIC8gRElHSVQgLyAiKyIgLyAiLSIgLyAiLiIgKQogICAgLy8KICAgIC8vIGF1dGhvcml0eSAgICAgPSBbIHVzZXJpbmZvICJAIiBdIGhvc3QgWyAiOiIgcG9ydCBdCiAgICAvLyB1c2VyaW5mbyAgICAgID0gKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiApCiAgICAvLyBob3N0ICAgICAgICAgID0gSVAtbGl0ZXJhbCAvIElQdjRhZGRyZXNzIC8gcmVnLW5hbWUKICAgIC8vIHBvcnQgICAgICAgICAgPSAqRElHSVQKICAgIC8vIHJlZy1uYW1lICAgICAgPSAqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zICkKICAgIC8vCiAgICAvLyBwYXRoICAgICAgICAgID0gcGF0aC1hYmVtcHR5ICAgIDsgYmVnaW5zIHdpdGggIi8iIG9yIGlzIGVtcHR5CiAgICAvLyAgICAgICAgICAgICAgIC8gcGF0aC1hYnNvbHV0ZSAgIDsgYmVnaW5zIHdpdGggIi8iIGJ1dCBub3QgIi8vIgogICAgLy8gICAgICAgICAgICAgICAvIHBhdGgtbm9zY2hlbWUgICA7IGJlZ2lucyB3aXRoIGEgbm9uLWNvbG9uIHNlZ21lbnQKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLXJvb3RsZXNzICAgOyBiZWdpbnMgd2l0aCBhIHNlZ21lbnQKICAgIC8vICAgICAgICAgICAgICAgLyBwYXRoLWVtcHR5ICAgICAgOyB6ZXJvIGNoYXJhY3RlcnMKICAgIC8vCiAgICAvLyBwYXRoLWFiZW1wdHkgID0gKiggIi8iIHNlZ21lbnQgKQogICAgLy8gcGF0aC1hYnNvbHV0ZSA9ICIvIiBbIHNlZ21lbnQtbnogKiggIi8iIHNlZ21lbnQgKSBdCiAgICAvLyBwYXRoLW5vc2NoZW1lID0gc2VnbWVudC1uei1uYyAqKCAiLyIgc2VnbWVudCApCiAgICAvLyBwYXRoLXJvb3RsZXNzID0gc2VnbWVudC1ueiAqKCAiLyIgc2VnbWVudCApCiAgICAvLyBwYXRoLWVtcHR5ICAgID0gMDxwY2hhcj4KICAgIC8vCiAgICAvLyBzZWdtZW50ICAgICAgID0gKnBjaGFyCiAgICAvLyBzZWdtZW50LW56ICAgID0gMSpwY2hhcgogICAgLy8gc2VnbWVudC1uei1uYyA9IDEqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIkAiICkKICAgIC8vICAgICAgICAgICAgICAgOyBub24temVyby1sZW5ndGggc2VnbWVudCB3aXRob3V0IGFueSBjb2xvbiAiOiIKICAgIC8vCiAgICAvLyBwY2hhciAgICAgICAgID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIgogICAgLy8KICAgIC8vIHF1ZXJ5ICAgICAgICAgPSAqKCBwY2hhciAvICIvIiAvICI/IiApCiAgICAvLwogICAgLy8gZnJhZ21lbnQgICAgICA9ICooIHBjaGFyIC8gIi8iIC8gIj8iICkKICAgIGVuZCA/Pz0gdXJpLmxlbmd0aDsKCiAgICAvLyBTcGVjaWFsIGNhc2UgZGF0YTpVUklzLiBJZ25vcmUgY2FzZSB3aGVuIHRlc3RpbmcuCiAgICBpZiAoZW5kID49IHN0YXJ0ICsgNSkgewogICAgICBpbnQgZGF0YURlbHRhID0gX3N0YXJ0c1dpdGhEYXRhKHVyaSwgc3RhcnQpOwogICAgICBpZiAoZGF0YURlbHRhID09IDApIHsKICAgICAgICAvLyBUaGUgY2FzZSBpcyByaWdodC4KICAgICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IHVyaS5sZW5ndGgpIHVyaSA9IHVyaS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgICAgcmV0dXJuIFVyaURhdGEuX3BhcnNlKHVyaSwgNSwgbnVsbCkudXJpOwogICAgICB9IGVsc2UgaWYgKGRhdGFEZWx0YSA9PSAweDIwKSB7CiAgICAgICAgcmV0dXJuIFVyaURhdGEuX3BhcnNlKHVyaS5zdWJzdHJpbmcoc3RhcnQgKyA1LCBlbmQpLCAwLCBudWxsKS51cmk7CiAgICAgIH0KICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBVUkkgZG9lc24ndCBzdGFydCB3aXRoICJkYXRhOiIgb3IgYW55IGNhc2UgdmFyaWFudCBvZiBpdC4KICAgIH0KCiAgICAvLyBUaGUgZm9sbG93aW5nIGluZGV4LW5vcm1hbGl6YXRpb24gYmVsb25ncyB3aXRoIHRoZSBzY2FubmluZywgYnV0IGlzCiAgICAvLyBlYXNpZXIgdG8gZG8gaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSBleHRyYWN0ZWQgdmFyaWFibGVzIGZyb20gdGhlCiAgICAvLyBpbmRpY2VzIGxpc3QuCiAgICB2YXIgaW5kaWNlcyA9IExpc3Q8aW50Pig4KTsKCiAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGVhY2ggcG9zaXRpb24uCiAgICAvLyBUaGUgdmFsdWUgd2lsbCBlaXRoZXIgYmUgY29ycmVjdCBpbiBzb21lIGNhc2VzIHdoZXJlIGl0IGlzbid0IHNldAogICAgLy8gYnkgdGhlIHNjYW5uZXIsIG9yIGl0IGlzIGNsZWFybHkgcmVjb2duaXphYmxlIGFzIGFuIHVuc2V0IHZhbHVlLgogICAgaW5kaWNlcwogICAgICAuLlswXSA9IDAKICAgICAgLi5bX3NjaGVtZUVuZEluZGV4XSA9IHN0YXJ0IC0gMQogICAgICAuLltfaG9zdFN0YXJ0SW5kZXhdID0gc3RhcnQgLSAxCiAgICAgIC4uW19ub3RTaW1wbGVJbmRleF0gPSBzdGFydCAtIDEKICAgICAgLi5bX3BvcnRTdGFydEluZGV4XSA9IHN0YXJ0CiAgICAgIC4uW19wYXRoU3RhcnRJbmRleF0gPSBzdGFydAogICAgICAuLltfcXVlcnlTdGFydEluZGV4XSA9IGVuZAogICAgICAuLltfZnJhZ21lbnRTdGFydEluZGV4XSA9IGVuZDsKICAgIHZhciBzdGF0ZSA9IF9zY2FuKHVyaSwgc3RhcnQsIGVuZCwgX3VyaVN0YXJ0LCBpbmRpY2VzKTsKICAgIC8vIFNvbWUgc3RhdGVzIHRoYXQgc2hvdWxkIGJlIG5vbi1zaW1wbGUsIGJ1dCB0aGUgVVJJIGVuZGVkIGVhcmx5LgogICAgLy8gUGF0aHMgdGhhdCBlbmQgYXQgYSAiLi4iIG11c3QgYmUgbm9ybWFsaXplZCB0byBlbmQgaW4gIi4uLyIuCiAgICBpZiAoc3RhdGUgPj0gX25vblNpbXBsZUVuZFN0YXRlcykgewogICAgICBpbmRpY2VzW19ub3RTaW1wbGVJbmRleF0gPSBlbmQ7CiAgICB9CiAgICBpbnQgc2NoZW1lRW5kID0gaW5kaWNlc1tfc2NoZW1lRW5kSW5kZXhdOwogICAgaWYgKHNjaGVtZUVuZCA+PSBzdGFydCkgewogICAgICAvLyBSZXNjYW4gdGhlIHNjaGVtZSBwYXJ0IG5vdyB0aGF0IHdlIGtub3cgaXQncyBub3QgYSBwYXRoLgogICAgICBzdGF0ZSA9IF9zY2FuKHVyaSwgc3RhcnQsIHNjaGVtZUVuZCwgX3NjaGVtZVN0YXJ0LCBpbmRpY2VzKTsKICAgICAgaWYgKHN0YXRlID09IF9zY2hlbWVTdGFydCkgewogICAgICAgIC8vIEVtcHR5IHNjaGVtZS4KICAgICAgICBpbmRpY2VzW19ub3RTaW1wbGVJbmRleF0gPSBzY2hlbWVFbmQ7CiAgICAgIH0KICAgIH0KICAgIC8vIFRoZSByZXR1cm5lZCBwb3NpdGlvbnMgYXJlIGxpbWl0ZWQgYnkgdGhlIHNjYW5uZXJzIGFiaWxpdHkgdG8gd3JpdGUgb25seQogICAgLy8gb25lIHBvc2l0aW9uIHBlciBjaGFyYWN0ZXIsIGFuZCBvbmx5IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgLy8gU2Nhbm5pbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB3ZSBvbmx5IGtub3cgd2hldGhlciBzb21ldGhpbmcgaXMgYSBzY2hlbWUKICAgIC8vIG9yIGEgcGF0aCB3aGVuIHdlIHNlZSBhIGA6YCBvciBgL2AsIGFuZCBsaWtld2lzZSB3ZSBvbmx5IGtub3cgaWYgdGhlIGZpcnN0CiAgICAvLyBgL2AgaXMgcGFydCBvZiB0aGUgcGF0aCBvciBpcyBsZWFkaW5nIGFuIGF1dGhvcml0eSBjb21wb25lbnQgd2hlbiB3ZSBzZWUKICAgIC8vIHRoZSBuZXh0IGNoYXJhY3Rlci4KCiAgICBpbnQgaG9zdFN0YXJ0ID0gaW5kaWNlc1tfaG9zdFN0YXJ0SW5kZXhdICsgMTsKICAgIGludCBwb3J0U3RhcnQgPSBpbmRpY2VzW19wb3J0U3RhcnRJbmRleF07CiAgICBpbnQgcGF0aFN0YXJ0ID0gaW5kaWNlc1tfcGF0aFN0YXJ0SW5kZXhdOwogICAgaW50IHF1ZXJ5U3RhcnQgPSBpbmRpY2VzW19xdWVyeVN0YXJ0SW5kZXhdOwogICAgaW50IGZyYWdtZW50U3RhcnQgPSBpbmRpY2VzW19mcmFnbWVudFN0YXJ0SW5kZXhdOwoKICAgIC8vIFdlIG1heSBkaXNjb3ZlciBzY2hlbWUgd2hpbGUgaGFuZGxpbmcgc3BlY2lhbCBjYXNlcy4KICAgIFN0cmluZyBzY2hlbWU7CgogICAgLy8gRGVyaXZlIHNvbWUgcG9zaXRpb25zIHRoYXQgd2VyZW4ndCBzZXQgdG8gbm9ybWFsaXplIHRoZSBpbmRpY2VzLgogICAgaWYgKGZyYWdtZW50U3RhcnQgPCBxdWVyeVN0YXJ0KSBxdWVyeVN0YXJ0ID0gZnJhZ21lbnRTdGFydDsKICAgIC8vIElmIHBhdGhTdGFydCBpc24ndCBzZXQgKGl0J3MgYmVmb3JlIHNjaGVtZSBlbmQgb3IgaG9zdCBzdGFydCksIHRoZW4KICAgIC8vIHRoZSBwYXRoIGlzIGVtcHR5LCBvciB0aGVyZSBpcyBubyBhdXRob3JpdHkgcGFydCBhbmQgdGhlIHBhdGgKICAgIC8vIHN0YXJ0cyB3aXRoIGEgbm9uLXNpbXBsZSBjaGFyYWN0ZXIuCiAgICBpZiAocGF0aFN0YXJ0IDwgaG9zdFN0YXJ0KSB7CiAgICAgIC8vIFRoZXJlIGlzIGFuIGF1dGhvcml0eSwgYnV0IG5vIHBhdGguIFRoZSBwYXRoIHdvdWxkIHN0YXJ0IHdpdGggYC9gCiAgICAgIC8vIGlmIGl0IHdhcyB0aGVyZS4KICAgICAgcGF0aFN0YXJ0ID0gcXVlcnlTdGFydDsKICAgIH0gZWxzZSBpZiAocGF0aFN0YXJ0IDw9IHNjaGVtZUVuZCkgewogICAgICAvLyBUaGVyZSBpcyBhIHNjaGVtZSwgYnV0IG5vIGF1dGhvcml0eS4KICAgICAgcGF0aFN0YXJ0ID0gc2NoZW1lRW5kICsgMTsKICAgIH0KICAgIC8vIElmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSB3aXRoIG5vIHBvcnQsIHNldCB0aGUgcG9ydCBwb3NpdGlvbgogICAgLy8gdG8gYmUgYXQgdGhlIGVuZCBvZiB0aGUgYXV0aG9yaXR5IChlcXVhbCB0byBwYXRoU3RhcnQpLgogICAgLy8gVGhpcyBhbHNvIGhhbmRsZXMgYSAiOiIgaW4gYSB1c2VyLWluZm8gY29tcG9uZW50IGluY29ycmVjdGx5IHNldHRpbmcKICAgIC8vIHRoZSBwb3J0IHN0YXJ0IHBvc2l0aW9uLgogICAgaWYgKHBvcnRTdGFydCA8IGhvc3RTdGFydCkgcG9ydFN0YXJ0ID0gcGF0aFN0YXJ0OwoKICAgIGFzc2VydChob3N0U3RhcnQgPT0gc3RhcnQgfHwgc2NoZW1lRW5kIDw9IGhvc3RTdGFydCk7CiAgICBhc3NlcnQoaG9zdFN0YXJ0IDw9IHBvcnRTdGFydCk7CiAgICBhc3NlcnQoc2NoZW1lRW5kIDw9IHBhdGhTdGFydCk7CiAgICBhc3NlcnQocG9ydFN0YXJ0IDw9IHBhdGhTdGFydCk7CiAgICBhc3NlcnQocGF0aFN0YXJ0IDw9IHF1ZXJ5U3RhcnQpOwogICAgYXNzZXJ0KHF1ZXJ5U3RhcnQgPD0gZnJhZ21lbnRTdGFydCk7CgogICAgYm9vbCBpc1NpbXBsZSA9IGluZGljZXNbX25vdFNpbXBsZUluZGV4XSA8IHN0YXJ0OwoKICAgIGlmIChpc1NpbXBsZSkgewogICAgICAvLyBDaGVjay9kbyBub3JtYWxpemF0aW9ucyB0aGF0IHdlcmVuJ3QgZGV0ZWN0ZWQgYnkgdGhlIHNjYW5uZXIuCiAgICAgIC8vIFRoaXMgaW5jbHVkZXMgcmVtb3ZhbCBvZiBlbXB0eSBwb3J0IG9yIHVzZXJJbmZvLAogICAgICAvLyBvciBzY2hlbWUgc3BlY2lmaWMgcG9ydCBhbmQgcGF0aCBub3JtYWxpemF0aW9ucy4KICAgICAgaWYgKGhvc3RTdGFydCA+IHNjaGVtZUVuZCArIDMpIHsKICAgICAgICAvLyBBbHdheXMgYmUgbm9uLXNpbXBsZSBpZiBVUkkgY29udGFpbnMgdXNlci1pbmZvLgogICAgICAgIC8vIFRoZSBzY2FubmVyIGRvZXNuJ3Qgc2V0IHRoZSBub3Qtc2ltcGxlIHBvc2l0aW9uIGluIHRoaXMgY2FzZSBiZWNhdXNlCiAgICAgICAgLy8gaXQncyBzZXR0aW5nIHRoZSBob3N0LXN0YXJ0IHBvc2l0aW9uIGluc3RlYWQuCiAgICAgICAgaXNTaW1wbGUgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChwb3J0U3RhcnQgPiBzdGFydCAmJiBwb3J0U3RhcnQgKyAxID09IHBhdGhTdGFydCkgewogICAgICAgIC8vIElmIHRoZSBwb3J0IGlzIGVtcHR5LCBpdCBzaG91bGQgYmUgb21pdHRlZC4KICAgICAgICAvLyBQYXRob2xvZ2ljYWwgY2FzZSwgZG9uJ3QgYm90aGVyIGNvcnJlY3RpbmcgaXQuCiAgICAgICAgaXNTaW1wbGUgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChxdWVyeVN0YXJ0IDwgZW5kICYmCiAgICAgICAgICAgICAgKHF1ZXJ5U3RhcnQgPT0gcGF0aFN0YXJ0ICsgMiAmJgogICAgICAgICAgICAgICAgICB1cmkuc3RhcnRzV2l0aCgiLi4iLCBwYXRoU3RhcnQpKSB8fAogICAgICAgICAgKHF1ZXJ5U3RhcnQgPiBwYXRoU3RhcnQgKyAyICYmCiAgICAgICAgICAgICAgdXJpLnN0YXJ0c1dpdGgoIi8uLiIsIHF1ZXJ5U3RhcnQgLSAzKSkpIHsKICAgICAgICAvLyBUaGUgcGF0aCBlbmRzIGluIGEgIi4uIiBzZWdtZW50LiBUaGlzIHNob3VsZCBiZSBub3JtYWxpemVkIHRvICIuLi8iLgogICAgICAgIC8vIFdlIGRpZG4ndCBkZXRlY3QgdGhpcyB3aGlsZSBzY2FubmluZyBiZWNhdXNlIGEgcXVlcnkgb3IgZnJhZ21lbnQgd2FzCiAgICAgICAgLy8gZGV0ZWN0ZWQgYXQgdGhlIHNhbWUgdGltZSAod2hpY2ggaXMgd2h5IHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGlzCiAgICAgICAgLy8gaWYgdGhlcmUgaXMgc29tZXRoaW5nIGFmdGVyIHRoZSBwYXRoKS4KICAgICAgICBpc1NpbXBsZSA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZXJlIGFyZSBhIGZldyBzY2hlbWUtYmFzZWQgbm9ybWFsaXphdGlvbnMgdGhhdAogICAgICAgIC8vIHRoZSBzY2FubmVyIGNvdWxkbid0IGNoZWNrLgogICAgICAgIC8vIFRoYXQgbWVhbnMgdGhhdCB0aGUgaW5wdXQgaXMgdmVyeSBjbG9zZSB0byBzaW1wbGUsIHNvIGp1c3QgZG8KICAgICAgICAvLyB0aGUgbm9ybWFsaXphdGlvbnMuCiAgICAgICAgaWYgKHNjaGVtZUVuZCA9PSBzdGFydCArIDQpIHsKICAgICAgICAgIC8vIERvIHNjaGVtZSBiYXNlZCBub3JtYWxpemF0aW9ucyBmb3IgZmlsZSwgaHR0cC4KICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiZmlsZSIsIHN0YXJ0KSkgewogICAgICAgICAgICBzY2hlbWUgPSAiZmlsZSI7CiAgICAgICAgICAgIGlmIChob3N0U3RhcnQgPD0gc3RhcnQpIHsKICAgICAgICAgICAgICAvLyBGaWxlIFVSSXMgc2hvdWxkIGhhdmUgYW4gYXV0aG9yaXR5LgogICAgICAgICAgICAgIC8vIFBhdGhzIGFmdGVyIGFuIGF1dGhvcml0eSBzaG91bGQgYmUgYWJzb2x1dGUuCiAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtZUF1dGggPSAiZmlsZTovLyI7CiAgICAgICAgICAgICAgaW50IGRlbHRhID0gMjsKICAgICAgICAgICAgICBpZiAoIXVyaS5zdGFydHNXaXRoKCIvIiwgcGF0aFN0YXJ0KSkgewogICAgICAgICAgICAgICAgc2NoZW1lQXV0aCA9ICJmaWxlOi8vLyI7CiAgICAgICAgICAgICAgICBkZWx0YSA9IDM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVyaSA9IHNjaGVtZUF1dGggKyB1cmkuc3Vic3RyaW5nKHBhdGhTdGFydCwgZW5kKTsKICAgICAgICAgICAgICBzY2hlbWVFbmQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgaG9zdFN0YXJ0ID0gNzsKICAgICAgICAgICAgICBwb3J0U3RhcnQgPSA3OwogICAgICAgICAgICAgIHBhdGhTdGFydCA9IDc7CiAgICAgICAgICAgICAgcXVlcnlTdGFydCArPSBkZWx0YSAtIHN0YXJ0OwogICAgICAgICAgICAgIGZyYWdtZW50U3RhcnQgKz0gZGVsdGEgLSBzdGFydDsKICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICAgZW5kID0gdXJpLmxlbmd0aDsKICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoU3RhcnQgPT0gcXVlcnlTdGFydCkgewogICAgICAgICAgICAgIC8vIFVyaSBoYXMgYXV0aG9yaXR5IGFuZCBlbXB0eSBwYXRoLiBBZGQgIi8iIGFzIHBhdGguCiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDAgJiYgZW5kID09IHVyaS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5yZXBsYWNlUmFuZ2UocGF0aFN0YXJ0LCBxdWVyeVN0YXJ0LCAiLyIpOwogICAgICAgICAgICAgICAgcXVlcnlTdGFydCArPSAxOwogICAgICAgICAgICAgICAgZnJhZ21lbnRTdGFydCArPSAxOwogICAgICAgICAgICAgICAgZW5kICs9IDE7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVyaSA9ICIke3VyaS5zdWJzdHJpbmcoc3RhcnQsIHBhdGhTdGFydCl9LyIKICAgICAgICAgICAgICAgICAgICAiJHt1cmkuc3Vic3RyaW5nKHF1ZXJ5U3RhcnQsIGVuZCl9IjsKICAgICAgICAgICAgICAgIHNjaGVtZUVuZCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIGhvc3RTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIHBvcnRTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIHBhdGhTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnQgKz0gMSAtIHN0YXJ0OwogICAgICAgICAgICAgICAgZnJhZ21lbnRTdGFydCArPSAxIC0gc3RhcnQ7CiAgICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICAgICBlbmQgPSB1cmkubGVuZ3RoOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aCgiaHR0cCIsIHN0YXJ0KSkgewogICAgICAgICAgICBzY2hlbWUgPSAiaHR0cCI7CiAgICAgICAgICAgIC8vIEhUVFAgVVJJcyBzaG91bGQgbm90IGhhdmUgYW4gZXhwbGljaXQgcG9ydCBvZiA4MC4KICAgICAgICAgICAgaWYgKHBvcnRTdGFydCA+IHN0YXJ0ICYmCiAgICAgICAgICAgICAgICBwb3J0U3RhcnQgKyAzID09IHBhdGhTdGFydCAmJgogICAgICAgICAgICAgICAgdXJpLnN0YXJ0c1dpdGgoIjgwIiwgcG9ydFN0YXJ0ICsgMSkpIHsKICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCAmJiBlbmQgPT0gdXJpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdXJpID0gdXJpLnJlcGxhY2VSYW5nZShwb3J0U3RhcnQsIHBhdGhTdGFydCwgIiIpOwogICAgICAgICAgICAgICAgcGF0aFN0YXJ0IC09IDM7CiAgICAgICAgICAgICAgICBxdWVyeVN0YXJ0IC09IDM7CiAgICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0IC09IDM7CiAgICAgICAgICAgICAgICBlbmQgLT0gMzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZyhzdGFydCwgcG9ydFN0YXJ0KSArCiAgICAgICAgICAgICAgICAgICAgdXJpLnN1YnN0cmluZyhwYXRoU3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICBzY2hlbWVFbmQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBob3N0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBwb3J0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgICBwYXRoU3RhcnQgLT0gMyArIHN0YXJ0OwogICAgICAgICAgICAgICAgcXVlcnlTdGFydCAtPSAzICsgc3RhcnQ7CiAgICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0IC09IDMgKyBzdGFydDsKICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgICAgICAgIGVuZCA9IHVyaS5sZW5ndGg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzY2hlbWVFbmQgPT0gc3RhcnQgKyA1ICYmIHVyaS5zdGFydHNXaXRoKCJodHRwcyIsIHN0YXJ0KSkgewogICAgICAgICAgc2NoZW1lID0gImh0dHBzIjsKICAgICAgICAgIC8vIEhUVFBTIFVSSXMgc2hvdWxkIG5vdCBoYXZlIGFuIGV4cGxpY2l0IHBvcnQgb2YgNDQzLgogICAgICAgICAgaWYgKHBvcnRTdGFydCA+IHN0YXJ0ICYmCiAgICAgICAgICAgICAgcG9ydFN0YXJ0ICsgNCA9PSBwYXRoU3RhcnQgJiYKICAgICAgICAgICAgICB1cmkuc3RhcnRzV2l0aCgiNDQzIiwgcG9ydFN0YXJ0ICsgMSkpIHsKICAgICAgICAgICAgaWYgKHN0YXJ0ID09IDAgJiYgZW5kID09IHVyaS5sZW5ndGgpIHsKICAgICAgICAgICAgICB1cmkgPSB1cmkucmVwbGFjZVJhbmdlKHBvcnRTdGFydCwgcGF0aFN0YXJ0LCAiIik7CiAgICAgICAgICAgICAgcGF0aFN0YXJ0IC09IDQ7CiAgICAgICAgICAgICAgcXVlcnlTdGFydCAtPSA0OwogICAgICAgICAgICAgIGZyYWdtZW50U3RhcnQgLT0gNDsKICAgICAgICAgICAgICBlbmQgLT0gMzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKHN0YXJ0LCBwb3J0U3RhcnQpICsKICAgICAgICAgICAgICAgICAgdXJpLnN1YnN0cmluZyhwYXRoU3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgc2NoZW1lRW5kIC09IHN0YXJ0OwogICAgICAgICAgICAgIGhvc3RTdGFydCAtPSBzdGFydDsKICAgICAgICAgICAgICBwb3J0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgICAgICAgcGF0aFN0YXJ0IC09IDQgKyBzdGFydDsKICAgICAgICAgICAgICBxdWVyeVN0YXJ0IC09IDQgKyBzdGFydDsKICAgICAgICAgICAgICBmcmFnbWVudFN0YXJ0IC09IDQgKyBzdGFydDsKICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgICAgZW5kID0gdXJpLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChpc1NpbXBsZSkgewogICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IHVyaS5sZW5ndGgpIHsKICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgICAgIHNjaGVtZUVuZCAtPSBzdGFydDsKICAgICAgICBob3N0U3RhcnQgLT0gc3RhcnQ7CiAgICAgICAgcG9ydFN0YXJ0IC09IHN0YXJ0OwogICAgICAgIHBhdGhTdGFydCAtPSBzdGFydDsKICAgICAgICBxdWVyeVN0YXJ0IC09IHN0YXJ0OwogICAgICAgIGZyYWdtZW50U3RhcnQgLT0gc3RhcnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIF9TaW1wbGVVcmkodXJpLCBzY2hlbWVFbmQsIGhvc3RTdGFydCwgcG9ydFN0YXJ0LCBwYXRoU3RhcnQsCiAgICAgICAgICBxdWVyeVN0YXJ0LCBmcmFnbWVudFN0YXJ0LCBzY2hlbWUpOwogICAgfQoKICAgIHJldHVybiBfVXJpLm5vdFNpbXBsZSh1cmksIHN0YXJ0LCBlbmQsIHNjaGVtZUVuZCwgaG9zdFN0YXJ0LCBwb3J0U3RhcnQsCiAgICAgICAgcGF0aFN0YXJ0LCBxdWVyeVN0YXJ0LCBmcmFnbWVudFN0YXJ0LCBzY2hlbWUpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBgVXJpYCBvYmplY3QgYnkgcGFyc2luZyBhIFVSSSBzdHJpbmcuCiAgICoKICAgKiBJZiBbc3RhcnRdIGFuZCBbZW5kXSBhcmUgcHJvdmlkZWQsIHRoZXkgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgc3Vic3RyaW5nCiAgICogb2YgW3VyaV0sIGFuZCBvbmx5IHRoZSBzdWJzdHJpbmcgZnJvbSBgc3RhcnRgIHRvIGBlbmRgIGlzIHBhcnNlZCBhcyBhIFVSSS4KICAgKiBUaGUgW3VyaV0gbXVzdCBub3QgYmUgYG51bGxgLgogICAqCiAgICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIFt1cmldIHN0cmluZyBpcyBub3QgdmFsaWQgYXMgYSBVUkkgb3IgVVJJIHJlZmVyZW5jZS4KICAgKi8KICBzdGF0aWMgVXJpIHRyeVBhcnNlKFN0cmluZyB1cmksIFtpbnQgc3RhcnQgPSAwLCBpbnQgZW5kXSkgewogICAgLy8gVE9ETzogT3B0aW1pemUgdG8gYXZvaWQgdGhyb3dpbmctYW5kLXJlY2F0Y2hpbmcuCiAgICB0cnkgewogICAgICByZXR1cm4gcGFyc2UodXJpLCBzdGFydCwgZW5kKTsKICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICAvKioKICAgKiBFbmNvZGUgdGhlIHN0cmluZyBbY29tcG9uZW50XSB1c2luZyBwZXJjZW50LWVuY29kaW5nIHRvIG1ha2UgaXQKICAgKiBzYWZlIGZvciBsaXRlcmFsIHVzZSBhcyBhIFVSSSBjb21wb25lbnQuCiAgICoKICAgKiBBbGwgY2hhcmFjdGVycyBleGNlcHQgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZAogICAqIHRoZSBjaGFyYWN0ZXJzIGAtXy4hfionKClgIGFyZSBwZXJjZW50LWVuY29kZWQuIFRoaXMgaXMgdGhlCiAgICogc2V0IG9mIGNoYXJhY3RlcnMgc3BlY2lmaWVkIGluIFJGQyAyMzk2IGFuZCB0aGUgd2hpY2ggaXMKICAgKiBzcGVjaWZpZWQgZm9yIHRoZSBlbmNvZGVVcmlDb21wb25lbnQgaW4gRUNNQS0yNjIgdmVyc2lvbiA1LjEuCiAgICoKICAgKiBXaGVuIG1hbnVhbGx5IGVuY29kaW5nIHBhdGggc2VnbWVudHMgb3IgcXVlcnkgY29tcG9uZW50cyByZW1lbWJlcgogICAqIHRvIGVuY29kZSBlYWNoIHBhcnQgc2VwYXJhdGVseSBiZWZvcmUgYnVpbGRpbmcgdGhlIHBhdGggb3IgcXVlcnkKICAgKiBzdHJpbmcuCiAgICoKICAgKiBGb3IgZW5jb2RpbmcgdGhlIHF1ZXJ5IHBhcnQgY29uc2lkZXIgdXNpbmcKICAgKiBbZW5jb2RlUXVlcnlDb21wb25lbnRdLgogICAqCiAgICogVG8gYXZvaWQgdGhlIG5lZWQgZm9yIGV4cGxpY2l0bHkgZW5jb2RpbmcgdXNlIHRoZSBbcGF0aFNlZ21lbnRzXQogICAqIGFuZCBbcXVlcnlQYXJhbWV0ZXJzXSBvcHRpb25hbCBuYW1lZCBhcmd1bWVudHMgd2hlbiBjb25zdHJ1Y3RpbmcKICAgKiBhIFtVcmldLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZW5jb2RlQ29tcG9uZW50KFN0cmluZyBjb21wb25lbnQpIHsKICAgIHJldHVybiBfVXJpLl91cmlFbmNvZGUoX1VyaS5fdW5yZXNlcnZlZDIzOTZUYWJsZSwgY29tcG9uZW50LCB1dGY4LCBmYWxzZSk7CiAgfQoKICAvKioKICAgKiBFbmNvZGUgdGhlIHN0cmluZyBbY29tcG9uZW50XSBhY2NvcmRpbmcgdG8gdGhlIEhUTUwgNC4wMSBydWxlcwogICAqIGZvciBlbmNvZGluZyB0aGUgcG9zdGluZyBvZiBhIEhUTUwgZm9ybSBhcyBhIHF1ZXJ5IHN0cmluZwogICAqIGNvbXBvbmVudC4KICAgKgogICAqIEVuY29kZSB0aGUgc3RyaW5nIFtjb21wb25lbnRdIGFjY29yZGluZyB0byB0aGUgSFRNTCA0LjAxIHJ1bGVzCiAgICogZm9yIGVuY29kaW5nIHRoZSBwb3N0aW5nIG9mIGEgSFRNTCBmb3JtIGFzIGEgcXVlcnkgc3RyaW5nCiAgICogY29tcG9uZW50LgoKICAgKiBUaGUgY29tcG9uZW50IGlzIGZpcnN0IGVuY29kZWQgdG8gYnl0ZXMgdXNpbmcgW2VuY29kaW5nXS4KICAgKiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgW3V0ZjhdIGVuY29kaW5nLCB3aGljaCBwcmVzZXJ2ZXMgYWxsCiAgICogdGhlIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBuZWVkIGVuY29kaW5nLgoKICAgKiBUaGVuIHRoZSByZXN1bHRpbmcgYnl0ZXMgYXJlICJwZXJjZW50LWVuY29kZWQiLiBUaGlzIHRyYW5zZm9ybXMKICAgKiBzcGFjZXMgKFUrMDAyMCkgdG8gYSBwbHVzIHNpZ24gKCcrJykgYW5kIGFsbCBieXRlcyB0aGF0IGFyZSBub3QKICAgKiB0aGUgQVNDSUkgZGVjaW1hbCBkaWdpdHMsIGxldHRlcnMgb3Igb25lIG9mICctLl9+JyBhcmUgd3JpdHRlbiBhcwogICAqIGEgcGVyY2VudCBzaWduICclJyBmb2xsb3dlZCBieSB0aGUgdHdvLWRpZ2l0IGhleGFkZWNpbWFsCiAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJ5dGUuCgogICAqIE5vdGUgdGhhdCB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgd2hpY2ggYXJlIHBlcmNlbnQtZW5jb2RlZCBpcyBhCiAgICogc3VwZXJzZXQgb2Ygd2hhdCBIVE1MIDQuMDEgcmVxdWlyZXMsIHNpbmNlIGl0IHJlZmVycyB0byBSRkMgMTczOAogICAqIGZvciByZXNlcnZlZCBjaGFyYWN0ZXJzLgogICAqCiAgICogV2hlbiBtYW51YWxseSBlbmNvZGluZyBxdWVyeSBjb21wb25lbnRzIHJlbWVtYmVyIHRvIGVuY29kZSBlYWNoCiAgICogcGFydCBzZXBhcmF0ZWx5IGJlZm9yZSBidWlsZGluZyB0aGUgcXVlcnkgc3RyaW5nLgogICAqCiAgICogVG8gYXZvaWQgdGhlIG5lZWQgZm9yIGV4cGxpY2l0bHkgZW5jb2RpbmcgdGhlIHF1ZXJ5IHVzZSB0aGUKICAgKiBbcXVlcnlQYXJhbWV0ZXJzXSBvcHRpb25hbCBuYW1lZCBhcmd1bWVudHMgd2hlbiBjb25zdHJ1Y3RpbmcgYQogICAqIFtVcmldLgogICAqCiAgICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzLjQuMiBmb3IgbW9yZQogICAqIGRldGFpbHMuCiAgICovCiAgc3RhdGljIFN0cmluZyBlbmNvZGVRdWVyeUNvbXBvbmVudChTdHJpbmcgY29tcG9uZW50LAogICAgICB7RW5jb2RpbmcgZW5jb2RpbmcgPSB1dGY4fSkgewogICAgcmV0dXJuIF9VcmkuX3VyaUVuY29kZShfVXJpLl91bnJlc2VydmVkVGFibGUsIGNvbXBvbmVudCwgZW5jb2RpbmcsIHRydWUpOwogIH0KCiAgLyoqCiAgICogRGVjb2RlcyB0aGUgcGVyY2VudC1lbmNvZGluZyBpbiBbZW5jb2RlZENvbXBvbmVudF0uCiAgICoKICAgKiBOb3RlIHRoYXQgZGVjb2RpbmcgYSBVUkkgY29tcG9uZW50IG1pZ2h0IGNoYW5nZSBpdHMgbWVhbmluZyBhcwogICAqIHNvbWUgb2YgdGhlIGRlY29kZWQgY2hhcmFjdGVycyBjb3VsZCBiZSBjaGFyYWN0ZXJzIHdpdGggYXJlCiAgICogZGVsaW1pdGVycyBmb3IgYSBnaXZlbiBVUkkgY29tcG9uZW50IHR5cGUuIEFsd2F5cyBzcGxpdCBhIFVSSQogICAqIGNvbXBvbmVudCB1c2luZyB0aGUgZGVsaW1pdGVycyBmb3IgdGhlIGNvbXBvbmVudCBiZWZvcmUgZGVjb2RpbmcKICAgKiB0aGUgaW5kaXZpZHVhbCBwYXJ0cy4KICAgKgogICAqIEZvciBoYW5kbGluZyB0aGUgW3BhdGhdIGFuZCBbcXVlcnldIGNvbXBvbmVudHMgY29uc2lkZXIgdXNpbmcKICAgKiBbcGF0aFNlZ21lbnRzXSBhbmQgW3F1ZXJ5UGFyYW1ldGVyc10gdG8gZ2V0IHRoZSBzZXBhcmF0ZWQgYW5kCiAgICogZGVjb2RlZCBjb21wb25lbnQuCiAgICovCiAgc3RhdGljIFN0cmluZyBkZWNvZGVDb21wb25lbnQoU3RyaW5nIGVuY29kZWRDb21wb25lbnQpIHsKICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUoCiAgICAgICAgZW5jb2RlZENvbXBvbmVudCwgMCwgZW5jb2RlZENvbXBvbmVudC5sZW5ndGgsIHV0ZjgsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIERlY29kZXMgdGhlIHBlcmNlbnQtZW5jb2RpbmcgaW4gW2VuY29kZWRDb21wb25lbnRdLCBjb252ZXJ0aW5nCiAgICogcGx1c2VzIHRvIHNwYWNlcy4KICAgKgogICAqIEl0IHdpbGwgY3JlYXRlIGEgYnl0ZS1saXN0IG9mIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMsIGFuZCB0aGVuIHVzZQogICAqIFtlbmNvZGluZ10gdG8gZGVjb2RlIHRoZSBieXRlLWxpc3QgdG8gYSBTdHJpbmcuIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzCiAgICogVVRGLTguCiAgICovCiAgc3RhdGljIFN0cmluZyBkZWNvZGVRdWVyeUNvbXBvbmVudChTdHJpbmcgZW5jb2RlZENvbXBvbmVudCwKICAgICAge0VuY29kaW5nIGVuY29kaW5nID0gdXRmOH0pIHsKICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUoCiAgICAgICAgZW5jb2RlZENvbXBvbmVudCwgMCwgZW5jb2RlZENvbXBvbmVudC5sZW5ndGgsIGVuY29kaW5nLCB0cnVlKTsKICB9CgogIC8qKgogICAqIEVuY29kZSB0aGUgc3RyaW5nIFt1cmldIHVzaW5nIHBlcmNlbnQtZW5jb2RpbmcgdG8gbWFrZSBpdAogICAqIHNhZmUgZm9yIGxpdGVyYWwgdXNlIGFzIGEgZnVsbCBVUkkuCiAgICoKICAgKiBBbGwgY2hhcmFjdGVycyBleGNlcHQgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZAogICAqIHRoZSBjaGFyYWN0ZXJzIGAhIyQmJygpKissLS4vOjs9P0BffmAgYXJlIHBlcmNlbnQtZW5jb2RlZC4gVGhpcwogICAqIGlzIHRoZSBzZXQgb2YgY2hhcmFjdGVycyBzcGVjaWZpZWQgaW4gaW4gRUNNQS0yNjIgdmVyc2lvbiA1LjEgZm9yCiAgICogdGhlIGVuY29kZVVSSSBmdW5jdGlvbiAuCiAgICovCiAgc3RhdGljIFN0cmluZyBlbmNvZGVGdWxsKFN0cmluZyB1cmkpIHsKICAgIHJldHVybiBfVXJpLl91cmlFbmNvZGUoX1VyaS5fZW5jb2RlRnVsbFRhYmxlLCB1cmksIHV0ZjgsIGZhbHNlKTsKICB9CgogIC8qKgogICAqIERlY29kZXMgdGhlIHBlcmNlbnQtZW5jb2RpbmcgaW4gW3VyaV0uCiAgICoKICAgKiBOb3RlIHRoYXQgZGVjb2RpbmcgYSBmdWxsIFVSSSBtaWdodCBjaGFuZ2UgaXRzIG1lYW5pbmcgYXMgc29tZSBvZgogICAqIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMgY291bGQgYmUgcmVzZXJ2ZWQgY2hhcmFjdGVycy4gSW4gbW9zdAogICAqIGNhc2VzIGFuIGVuY29kZWQgVVJJIHNob3VsZCBiZSBwYXJzZWQgaW50byBjb21wb25lbnRzIHVzaW5nCiAgICogW1VyaS5wYXJzZV0gYmVmb3JlIGRlY29kaW5nIHRoZSBzZXBhcmF0ZSBjb21wb25lbnRzLgogICAqLwogIHN0YXRpYyBTdHJpbmcgZGVjb2RlRnVsbChTdHJpbmcgdXJpKSB7CiAgICByZXR1cm4gX1VyaS5fdXJpRGVjb2RlKHVyaSwgMCwgdXJpLmxlbmd0aCwgdXRmOCwgZmFsc2UpOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgW3F1ZXJ5XSBzcGxpdCBpbnRvIGEgbWFwIGFjY29yZGluZyB0byB0aGUgcnVsZXMKICAgKiBzcGVjaWZpZWQgZm9yIEZPUk0gcG9zdCBpbiB0aGUgW0hUTUwgNC4wMSBzcGVjaWZpY2F0aW9uIHNlY3Rpb24KICAgKiAxNy4xMy40XShodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMy40ICJIVE1MIDQuMDEgc2VjdGlvbiAxNy4xMy40IikuCiAgICogRWFjaCBrZXkgYW5kIHZhbHVlIGluIHRoZSByZXR1cm5lZCBtYXAgaGFzIGJlZW4gZGVjb2RlZC4gSWYgdGhlIFtxdWVyeV0KICAgKiBpcyB0aGUgZW1wdHkgc3RyaW5nIGFuIGVtcHR5IG1hcCBpcyByZXR1cm5lZC4KICAgKgogICAqIEtleXMgaW4gdGhlIHF1ZXJ5IHN0cmluZyB0aGF0IGhhdmUgbm8gdmFsdWUgYXJlIG1hcHBlZCB0byB0aGUKICAgKiBlbXB0eSBzdHJpbmcuCiAgICoKICAgKiBFYWNoIHF1ZXJ5IGNvbXBvbmVudCB3aWxsIGJlIGRlY29kZWQgdXNpbmcgW2VuY29kaW5nXS4gVGhlIGRlZmF1bHQgZW5jb2RpbmcKICAgKiBpcyBVVEYtOC4KICAgKi8KICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBzcGxpdFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeSwKICAgICAge0VuY29kaW5nIGVuY29kaW5nID0gdXRmOH0pIHsKICAgIHJldHVybiBxdWVyeS5zcGxpdCgiJiIpLmZvbGQoe30sIChtYXAsIGVsZW1lbnQpIHsKICAgICAgaW50IGluZGV4ID0gZWxlbWVudC5pbmRleE9mKCI9Iik7CiAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgIGlmIChlbGVtZW50ICE9ICIiKSB7CiAgICAgICAgICBtYXBbZGVjb2RlUXVlcnlDb21wb25lbnQoZWxlbWVudCwgZW5jb2Rpbmc6IGVuY29kaW5nKV0gPSAiIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaW5kZXggIT0gMCkgewogICAgICAgIHZhciBrZXkgPSBlbGVtZW50LnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKICAgICAgICBtYXBbZGVjb2RlUXVlcnlDb21wb25lbnQoa2V5LCBlbmNvZGluZzogZW5jb2RpbmcpXSA9CiAgICAgICAgICAgIGRlY29kZVF1ZXJ5Q29tcG9uZW50KHZhbHVlLCBlbmNvZGluZzogZW5jb2RpbmcpOwogICAgICB9CiAgICAgIHJldHVybiBtYXA7CiAgICB9KTsKICB9CgogIC8qKgogICAqIFBhcnNlIHRoZSBbaG9zdF0gYXMgYW4gSVAgdmVyc2lvbiA0IChJUHY0KSBhZGRyZXNzLCByZXR1cm5pbmcgdGhlIGFkZHJlc3MKICAgKiBhcyBhIGxpc3Qgb2YgNCBieXRlcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZyBlbmRpYW4pLgogICAqCiAgICogVGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgW2hvc3RdIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcwogICAqIHJlcHJlc2VudGF0aW9uLgogICAqLwogIHN0YXRpYyBMaXN0PGludD4gcGFyc2VJUHY0QWRkcmVzcyhTdHJpbmcgaG9zdCkgPT4KICAgICAgX3BhcnNlSVB2NEFkZHJlc3MoaG9zdCwgMCwgaG9zdC5sZW5ndGgpOwoKICAvLy8gSW1wbGVtZW50YXRpb24gb2YgW3BhcnNlSVB2NEFkZHJlc3NdIHRoYXQgY2FuIHdvcmsgb24gYSBzdWJzdHJpbmcuCiAgc3RhdGljIExpc3Q8aW50PiBfcGFyc2VJUHY0QWRkcmVzcyhTdHJpbmcgaG9zdCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICB2b2lkIGVycm9yKFN0cmluZyBtc2csIGludCBwb3NpdGlvbikgewogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oJ0lsbGVnYWwgSVB2NCBhZGRyZXNzLCAkbXNnJywgaG9zdCwgcG9zaXRpb24pOwogICAgfQoKICAgIHZhciByZXN1bHQgPSBVaW50OExpc3QoNCk7CiAgICBpbnQgcGFydEluZGV4ID0gMDsKICAgIGludCBwYXJ0U3RhcnQgPSBzdGFydDsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGludCBjaGFyID0gaG9zdC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciAhPSBfRE9UKSB7CiAgICAgICAgaWYgKGNoYXIgXiAweDMwID4gOSkgewogICAgICAgICAgLy8gRmFpbCBvbiBhIG5vbi1kaWdpdCBjaGFyYWN0ZXIuCiAgICAgICAgICBlcnJvcigiaW52YWxpZCBjaGFyYWN0ZXIiLCBpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHBhcnRJbmRleCA9PSAzKSB7CiAgICAgICAgICBlcnJvcignSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cycsIGkpOwogICAgICAgIH0KICAgICAgICBpbnQgcGFydCA9IGludC5wYXJzZShob3N0LnN1YnN0cmluZyhwYXJ0U3RhcnQsIGkpKTsKICAgICAgICBpZiAocGFydCA+IDI1NSkgewogICAgICAgICAgZXJyb3IoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi4yNTUiLCBwYXJ0U3RhcnQpOwogICAgICAgIH0KICAgICAgICByZXN1bHRbcGFydEluZGV4KytdID0gcGFydDsKICAgICAgICBwYXJ0U3RhcnQgPSBpICsgMTsKICAgICAgfQogICAgfQoKICAgIGlmIChwYXJ0SW5kZXggIT0gMykgewogICAgICBlcnJvcignSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cycsIGVuZCk7CiAgICB9CgogICAgaW50IHBhcnQgPSBpbnQucGFyc2UoaG9zdC5zdWJzdHJpbmcocGFydFN0YXJ0LCBlbmQpKTsKICAgIGlmIChwYXJ0ID4gMjU1KSB7CiAgICAgIGVycm9yKCJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IiwgcGFydFN0YXJ0KTsKICAgIH0KICAgIHJlc3VsdFtwYXJ0SW5kZXhdID0gcGFydDsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogUGFyc2UgdGhlIFtob3N0XSBhcyBhbiBJUCB2ZXJzaW9uIDYgKElQdjYpIGFkZHJlc3MsIHJldHVybmluZyB0aGUgYWRkcmVzcwogICAqIGFzIGEgbGlzdCBvZiAxNiBieXRlcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGJpZyBlbmRpYW4pLgogICAqCiAgICogVGhyb3dzIGEgW0Zvcm1hdEV4Y2VwdGlvbl0gaWYgW2hvc3RdIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcwogICAqIHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogQWN0cyBvbiB0aGUgc3Vic3RyaW5nIGZyb20gW3N0YXJ0XSB0byBbZW5kXS4gSWYgW2VuZF0gaXMgb21pdHRlZCwgaXQKICAgKiBkZWZhdWx0cyBvdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBTb21lIGV4YW1wbGVzIG9mIElQdjYgYWRkcmVzc2VzOgogICAqICAqIDo6MQogICAqICAqIEZFREM6QkE5ODo3NjU0OjMyMTA6RkVEQzpCQTk4Ojc2NTQ6MzIxMAogICAqICAqIDNmZmU6MmEwMDoxMDA6NzAzMTo6MQogICAqICAqIDo6RkZGRjoxMjkuMTQ0LjUyLjM4CiAgICogICogMjAxMDo4MzZCOjQxNzk6OjgzNkI6NDE3OQogICAqLwogIHN0YXRpYyBMaXN0PGludD4gcGFyc2VJUHY2QWRkcmVzcyhTdHJpbmcgaG9zdCwgW2ludCBzdGFydCA9IDAsIGludCBlbmRdKSB7CiAgICBlbmQgPz89IGhvc3QubGVuZ3RoOwogICAgLy8gQW4gSVB2NiBhZGRyZXNzIGNvbnNpc3RzIG9mIGV4YWN0bHkgOCBwYXJ0cyBvZiAxLTQgaGV4IGRpZ2l0cywgc2VwYXJhdGVkCiAgICAvLyBieSBgOmAncywgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CiAgICAvLwogICAgLy8gIC0gT25lIChhbmQgb25seSBvbmUpIHdpbGRjYXJkIChgOjpgKSBtYXkgYmUgcHJlc2VudCwgcmVwcmVzZW50aW5nIGEgZmlsbAogICAgLy8gICAgb2YgMCdzLiBUaGUgSVB2NiBgOjpgIGlzIHRodXMgMTYgYnl0ZXMgb2YgYDBgLgogICAgLy8gIC0gVGhlIGxhc3QgdHdvIHBhcnRzIG1heSBiZSByZXBsYWNlZCBieSBhbiBJUHY0ICJkb3R0ZWQtcXVhZCIgYWRkcmVzcy4KCiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlcG9ydGluZyBhIGJhZGx5IGZvcm1hdHRlZCBJUHY2IGFkZHJlc3MuCiAgICB2b2lkIGVycm9yKFN0cmluZyBtc2csIFtwb3NpdGlvbl0pIHsKICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCdJbGxlZ2FsIElQdjYgYWRkcmVzcywgJG1zZycsIGhvc3QsIHBvc2l0aW9uKTsKICAgIH0KCiAgICAvLyBQYXJzZSBhIGhleCBibG9jay4KICAgIGludCBwYXJzZUhleChpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gNCkgewogICAgICAgIGVycm9yKCdhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2YgNCBoZXggZGlnaXRzJywgc3RhcnQpOwogICAgICB9CiAgICAgIGludCB2YWx1ZSA9IGludC5wYXJzZShob3N0LnN1YnN0cmluZyhzdGFydCwgZW5kKSwgcmFkaXg6IDE2KTsKICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDB4RkZGRikgewogICAgICAgIGVycm9yKCdlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgYDB4MC4uMHhGRkZGYCcsIHN0YXJ0KTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CgogICAgaWYgKGhvc3QubGVuZ3RoIDwgMikgZXJyb3IoJ2FkZHJlc3MgaXMgdG9vIHNob3J0Jyk7CiAgICBMaXN0PGludD4gcGFydHMgPSBbXTsKICAgIGJvb2wgd2lsZGNhcmRTZWVuID0gZmFsc2U7CiAgICAvLyBTZXQgaWYgc2VlaW5nIGEgIi4iLCBzdWdnZXN0aW5nIHRoYXQgdGhlcmUgaXMgYW4gSVB2NCBhZGRyZXNzLgogICAgYm9vbCBzZWVuRG90ID0gZmFsc2U7CiAgICBpbnQgcGFydFN0YXJ0ID0gc3RhcnQ7CiAgICAvLyBQYXJzZSBhbGwgcGFydHMsIGV4Y2VwdCBhIHBvdGVudGlhbCBsYXN0IG9uZS4KICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGludCBjaGFyID0gaG9zdC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA9PSBfQ09MT04pIHsKICAgICAgICBpZiAoaSA9PSBzdGFydCkgewogICAgICAgICAgLy8gSWYgd2Ugc2VlIGEgYDpgIGluIHRoZSBiZWdpbm5pbmcsIGV4cGVjdCB3aWxkY2FyZC4KICAgICAgICAgIGkrKzsKICAgICAgICAgIGlmIChob3N0LmNvZGVVbml0QXQoaSkgIT0gX0NPTE9OKSB7CiAgICAgICAgICAgIGVycm9yKCdpbnZhbGlkIHN0YXJ0IGNvbG9uLicsIGkpOwogICAgICAgICAgfQogICAgICAgICAgcGFydFN0YXJ0ID0gaTsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPT0gcGFydFN0YXJ0KSB7CiAgICAgICAgICAvLyBXaWxkY2FyZC4gV2Ugb25seSBhbGxvdyBvbmUuCiAgICAgICAgICBpZiAod2lsZGNhcmRTZWVuKSB7CiAgICAgICAgICAgIGVycm9yKCdvbmx5IG9uZSB3aWxkY2FyZCBgOjpgIGlzIGFsbG93ZWQnLCBpKTsKICAgICAgICAgIH0KICAgICAgICAgIHdpbGRjYXJkU2VlbiA9IHRydWU7CiAgICAgICAgICBwYXJ0cy5hZGQoLTEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBGb3VuZCBhIHNpbmdsZSBjb2xvbi4gUGFyc2UgW3BhcnRTdGFydC4uaV0gYXMgYSBoZXggZW50cnkuCiAgICAgICAgICBwYXJ0cy5hZGQocGFyc2VIZXgocGFydFN0YXJ0LCBpKSk7CiAgICAgICAgfQogICAgICAgIHBhcnRTdGFydCA9IGkgKyAxOwogICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gX0RPVCkgewogICAgICAgIHNlZW5Eb3QgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAocGFydHMubGVuZ3RoID09IDApIGVycm9yKCd0b28gZmV3IHBhcnRzJyk7CiAgICBib29sIGF0RW5kID0gKHBhcnRTdGFydCA9PSBlbmQpOwogICAgYm9vbCBpc0xhc3RXaWxkY2FyZCA9IChwYXJ0cy5sYXN0ID09IC0xKTsKICAgIGlmIChhdEVuZCAmJiAhaXNMYXN0V2lsZGNhcmQpIHsKICAgICAgZXJyb3IoJ2V4cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YCcsIGVuZCk7CiAgICB9CiAgICBpZiAoIWF0RW5kKSB7CiAgICAgIGlmICghc2VlbkRvdCkgewogICAgICAgIHBhcnRzLmFkZChwYXJzZUhleChwYXJ0U3RhcnQsIGVuZCkpOwogICAgICB9IGVsc2UgewogICAgICAgIExpc3Q8aW50PiBsYXN0ID0gX3BhcnNlSVB2NEFkZHJlc3MoaG9zdCwgcGFydFN0YXJ0LCBlbmQpOwogICAgICAgIHBhcnRzLmFkZChsYXN0WzBdIDw8IDggfCBsYXN0WzFdKTsKICAgICAgICBwYXJ0cy5hZGQobGFzdFsyXSA8PCA4IHwgbGFzdFszXSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh3aWxkY2FyZFNlZW4pIHsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDcpIHsKICAgICAgICBlcnJvcignYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRzJyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGFydHMubGVuZ3RoICE9IDgpIHsKICAgICAgZXJyb3IoJ2FuIGFkZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMnKTsKICAgIH0KICAgIExpc3Q8aW50PiBieXRlcyA9IFVpbnQ4TGlzdCgxNik7CiAgICBmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IHZhbHVlID0gcGFydHNbaV07CiAgICAgIGlmICh2YWx1ZSA9PSAtMSkgewogICAgICAgIGludCB3aWxkQ2FyZExlbmd0aCA9IDkgLSBwYXJ0cy5sZW5ndGg7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3aWxkQ2FyZExlbmd0aDsgaisrKSB7CiAgICAgICAgICBieXRlc1tpbmRleF0gPSAwOwogICAgICAgICAgYnl0ZXNbaW5kZXggKyAxXSA9IDA7CiAgICAgICAgICBpbmRleCArPSAyOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBieXRlc1tpbmRleF0gPSB2YWx1ZSA+PiA4OwogICAgICAgIGJ5dGVzW2luZGV4ICsgMV0gPSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgaW5kZXggKz0gMjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ5dGVzOwogIH0KfQoKY2xhc3MgX1VyaSBpbXBsZW1lbnRzIFVyaSB7CiAgLy8gV2UgcmVwcmVzZW50IHRoZSBtaXNzaW5nIHNjaGVtZSBhcyBhbiBlbXB0eSBzdHJpbmcuCiAgLy8gQSB2YWxpZCBzY2hlbWUgY2Fubm90IGJlIGVtcHR5LgogIGZpbmFsIFN0cmluZyBzY2hlbWU7CgogIC8qKgogICAqIFRoZSB1c2VyLWluZm8gcGFydCBvZiB0aGUgYXV0aG9yaXR5LgogICAqCiAgICogRG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiBlbXB0eSB1c2VyLWluZm8gYW5kIGFuIGFic2VudCBvbmUuCiAgICogVGhlIHZhbHVlIGlzIGFsd2F5cyBub24tbnVsbC4KICAgKiBJcyBjb25zaWRlcmVkIGFic2VudCBpZiBbX2hvc3RdIGlzIGBudWxsYC4KICAgKi8KICBmaW5hbCBTdHJpbmcgX3VzZXJJbmZvOwoKICAvKioKICAgKiBUaGUgaG9zdCBuYW1lIG9mIHRoZSBVUkkuCiAgICoKICAgKiBTZXQgdG8gYG51bGxgIGlmIHRoZXJlIGlzIG5vIGF1dGhvcml0eSBpbiB0aGUgVVJJLgogICAqIFRoZSBob3N0IG5hbWUgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IHBhcnQgb2YgYW4gYXV0aG9yaXR5LCBzbyB3ZSB1c2UKICAgKiBpdCB0byBtYXJrIHdoZXRoZXIgYW4gYXV0aG9yaXR5IHBhcnQgd2FzIHByZXNlbnQgb3Igbm90LgogICAqLwogIGZpbmFsIFN0cmluZyBfaG9zdDsKCiAgLyoqCiAgICogVGhlIHBvcnQgbnVtYmVyIHBhcnQgb2YgdGhlIGF1dGhvcml0eS4KICAgKgogICAqIFRoZSBwb3J0LiBTZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBwb3J0LiBOb3JtYWxpemVkIHRvIG51bGwgaWYKICAgKiB0aGUgcG9ydCBpcyB0aGUgZGVmYXVsdCBwb3J0IGZvciB0aGUgc2NoZW1lLgogICAqLwogIGludCBfcG9ydDsKCiAgLyoqCiAgICogVGhlIHBhdGggb2YgdGhlIFVSSS4KICAgKgogICAqIEFsd2F5cyBub24tbnVsbC4KICAgKi8KICBmaW5hbCBTdHJpbmcgcGF0aDsKCiAgLy8gVGhlIHF1ZXJ5IGNvbnRlbnQsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcXVlcnkuCiAgZmluYWwgU3RyaW5nIF9xdWVyeTsKCiAgLy8gVGhlIGZyYWdtZW50IGNvbnRlbnQsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gZnJhZ21lbnQuCiAgZmluYWwgU3RyaW5nIF9mcmFnbWVudDsKCiAgLyoqCiAgICogQ2FjaGUgdGhlIGNvbXB1dGVkIHJldHVybiB2YWx1ZSBvZiBbcGF0aFNlZ21lbnRzXS4KICAgKi8KICBMaXN0PFN0cmluZz4gX3BhdGhTZWdtZW50czsKCiAgLyoqCiAgICogQ2FjaGUgb2YgdGhlIGZ1bGwgbm9ybWFsaXplZCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkkuCiAgICovCiAgU3RyaW5nIF90ZXh0OwoKICAvKioKICAgKiBDYWNoZSBvZiB0aGUgaGFzaENvZGUgb2YgW190ZXh0XS4KICAgKgogICAqIElzIG51bGwgdW50aWwgY29tcHV0ZWQuCiAgICovCiAgaW50IF9oYXNoQ29kZUNhY2hlOwoKICAvKioKICAgKiBDYWNoZSB0aGUgY29tcHV0ZWQgcmV0dXJuIHZhbHVlIG9mIFtxdWVyeVBhcmFtZXRlcnNdLgogICAqLwogIE1hcDxTdHJpbmcsIFN0cmluZz4gX3F1ZXJ5UGFyYW1ldGVyczsKICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IF9xdWVyeVBhcmFtZXRlckxpc3RzOwoKICAvLy8gSW50ZXJuYWwgbm9uLXZlcmlmeWluZyBjb25zdHJ1Y3Rvci4gT25seSBjYWxsIHdpdGggdmFsaWRhdGVkIGFyZ3VtZW50cy4KICAvLy8KICAvLy8gVGhlIGNvbXBvbmVudHMgbXVzdCBiZSBwcm9wZXJseSBub3JtYWxpemVkLgogIC8vLwogIC8vLyBVc2UgYG51bGxgIGZvciBbX2hvc3RdIGlmIHRoZXJlIGlzIG5vIGF1dGhvcml0eS4gSW4gdGhhdCBjYXNlLCBhbHdheXMKICAvLy8gcGFzcyBgbnVsbGAgZm9yIFtfcG9ydF0gYW5kIFtfdXNlckluZm9dIGFzIHdlbGwuCiAgLy8vCiAgLy8vIFVzZSBgbnVsbGAgZm9yIFtfcG9ydF0sIFtfdXNlckluZm9dLCBbX3F1ZXJ5XSBhbmQgW19mcmFnbWVudF0gaWYgdGhlcmUgaXMKICAvLy8gY29tcG9uZW50IG9mIHRoYXQgdHlwZS4KICAvLy8KICAvLy8gVGhlIFtwYXRoXSBhbmQgW3NjaGVtZV0gYXJlIG5ldmVyIGVtcHR5LgogIF9VcmkuX2ludGVybmFsKHRoaXMuc2NoZW1lLCB0aGlzLl91c2VySW5mbywgdGhpcy5faG9zdCwgdGhpcy5fcG9ydCwgdGhpcy5wYXRoLAogICAgICB0aGlzLl9xdWVyeSwgdGhpcy5fZnJhZ21lbnQpOwoKICAvLy8gQ3JlYXRlIGEgW19VcmldIGZyb20gcGFydHMgb2YgW3VyaV0uCiAgLy8vCiAgLy8vIFRoZSBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIHN0YXJ0L2VuZCBvZiBwYXJ0aWN1bGFyIGNvbXBvbmVudHMgb2YgdGhlIFVSSS4KICAvLy8gVGhlIFtzY2hlbWVdIG1heSBjb250YWluIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5vcm1hbGl6ZWQgc2NoZW1lCiAgLy8vIGNvbXBvbmVudCBpZiBvbmUgaGFzIGFscmVhZHkgYmVlbiBkaXNjb3ZlcmVkLgogIGZhY3RvcnkgX1VyaS5ub3RTaW1wbGUoCiAgICAgIFN0cmluZyB1cmksCiAgICAgIGludCBzdGFydCwKICAgICAgaW50IGVuZCwKICAgICAgaW50IHNjaGVtZUVuZCwKICAgICAgaW50IGhvc3RTdGFydCwKICAgICAgaW50IHBvcnRTdGFydCwKICAgICAgaW50IHBhdGhTdGFydCwKICAgICAgaW50IHF1ZXJ5U3RhcnQsCiAgICAgIGludCBmcmFnbWVudFN0YXJ0LAogICAgICBTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lID09IG51bGwpIHsKICAgICAgc2NoZW1lID0gIiI7CiAgICAgIGlmIChzY2hlbWVFbmQgPiBzdGFydCkgewogICAgICAgIHNjaGVtZSA9IF9tYWtlU2NoZW1lKHVyaSwgc3RhcnQsIHNjaGVtZUVuZCk7CiAgICAgIH0gZWxzZSBpZiAoc2NoZW1lRW5kID09IHN0YXJ0KSB7CiAgICAgICAgX2ZhaWwodXJpLCBzdGFydCwgIkludmFsaWQgZW1wdHkgc2NoZW1lIik7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyB1c2VySW5mbyA9ICIiOwogICAgU3RyaW5nIGhvc3Q7CiAgICBpbnQgcG9ydDsKICAgIGlmIChob3N0U3RhcnQgPiBzdGFydCkgewogICAgICBpbnQgdXNlckluZm9TdGFydCA9IHNjaGVtZUVuZCArIDM7CiAgICAgIGlmICh1c2VySW5mb1N0YXJ0IDwgaG9zdFN0YXJ0KSB7CiAgICAgICAgdXNlckluZm8gPSBfbWFrZVVzZXJJbmZvKHVyaSwgdXNlckluZm9TdGFydCwgaG9zdFN0YXJ0IC0gMSk7CiAgICAgIH0KICAgICAgaG9zdCA9IF9tYWtlSG9zdCh1cmksIGhvc3RTdGFydCwgcG9ydFN0YXJ0LCBmYWxzZSk7CiAgICAgIGlmIChwb3J0U3RhcnQgKyAxIDwgcGF0aFN0YXJ0KSB7CiAgICAgICAgLy8gU2hvdWxkIHRocm93IGJlY2F1c2UgaW52YWxpZC4KICAgICAgICBwb3J0ID0gaW50LnBhcnNlKHVyaS5zdWJzdHJpbmcocG9ydFN0YXJ0ICsgMSwgcGF0aFN0YXJ0KSwgb25FcnJvcjogKF8pIHsKICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBwb3J0IiwgdXJpLCBwb3J0U3RhcnQgKyAxKTsKICAgICAgICB9KTsKICAgICAgICBwb3J0ID0gX21ha2VQb3J0KHBvcnQsIHNjaGVtZSk7CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyBwYXRoID0KICAgICAgICBfbWFrZVBhdGgodXJpLCBwYXRoU3RhcnQsIHF1ZXJ5U3RhcnQsIG51bGwsIHNjaGVtZSwgaG9zdCAhPSBudWxsKTsKICAgIFN0cmluZyBxdWVyeTsKICAgIGlmIChxdWVyeVN0YXJ0IDwgZnJhZ21lbnRTdGFydCkgewogICAgICBxdWVyeSA9IF9tYWtlUXVlcnkodXJpLCBxdWVyeVN0YXJ0ICsgMSwgZnJhZ21lbnRTdGFydCwgbnVsbCk7CiAgICB9CiAgICBTdHJpbmcgZnJhZ21lbnQ7CiAgICBpZiAoZnJhZ21lbnRTdGFydCA8IGVuZCkgewogICAgICBmcmFnbWVudCA9IF9tYWtlRnJhZ21lbnQodXJpLCBmcmFnbWVudFN0YXJ0ICsgMSwgZW5kKTsKICAgIH0KICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbChzY2hlbWUsIHVzZXJJbmZvLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOwogIH0KCiAgLy8vIEltcGxlbWVudGF0aW9uIG9mIFtVcmkuVXJpXS4KICBmYWN0b3J5IF9VcmkoCiAgICAgIHtTdHJpbmcgc2NoZW1lLAogICAgICBTdHJpbmcgdXNlckluZm8sCiAgICAgIFN0cmluZyBob3N0LAogICAgICBpbnQgcG9ydCwKICAgICAgU3RyaW5nIHBhdGgsCiAgICAgIEl0ZXJhYmxlPFN0cmluZz4gcGF0aFNlZ21lbnRzLAogICAgICBTdHJpbmcgcXVlcnksCiAgICAgIE1hcDxTdHJpbmcsIGR5bmFtaWMgLypTdHJpbmd8SXRlcmFibGU8U3RyaW5nPiovID4gcXVlcnlQYXJhbWV0ZXJzLAogICAgICBTdHJpbmcgZnJhZ21lbnR9KSB7CiAgICBzY2hlbWUgPSBfbWFrZVNjaGVtZShzY2hlbWUsIDAsIF9zdHJpbmdPck51bGxMZW5ndGgoc2NoZW1lKSk7CiAgICB1c2VySW5mbyA9IF9tYWtlVXNlckluZm8odXNlckluZm8sIDAsIF9zdHJpbmdPck51bGxMZW5ndGgodXNlckluZm8pKTsKICAgIGhvc3QgPSBfbWFrZUhvc3QoaG9zdCwgMCwgX3N0cmluZ09yTnVsbExlbmd0aChob3N0KSwgZmFsc2UpOwogICAgLy8gU3BlY2lhbCBjYXNlIHRoaXMgY29uc3RydWN0b3IgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgaWYgKHF1ZXJ5ID09ICIiKSBxdWVyeSA9IG51bGw7CiAgICBxdWVyeSA9IF9tYWtlUXVlcnkocXVlcnksIDAsIF9zdHJpbmdPck51bGxMZW5ndGgocXVlcnkpLCBxdWVyeVBhcmFtZXRlcnMpOwogICAgZnJhZ21lbnQgPSBfbWFrZUZyYWdtZW50KGZyYWdtZW50LCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKGZyYWdtZW50KSk7CiAgICBwb3J0ID0gX21ha2VQb3J0KHBvcnQsIHNjaGVtZSk7CiAgICBib29sIGlzRmlsZSA9IChzY2hlbWUgPT0gImZpbGUiKTsKICAgIGlmIChob3N0ID09IG51bGwgJiYgKHVzZXJJbmZvLmlzTm90RW1wdHkgfHwgcG9ydCAhPSBudWxsIHx8IGlzRmlsZSkpIHsKICAgICAgaG9zdCA9ICIiOwogICAgfQogICAgYm9vbCBoYXNBdXRob3JpdHkgPSAoaG9zdCAhPSBudWxsKTsKICAgIHBhdGggPSBfbWFrZVBhdGgoCiAgICAgICAgcGF0aCwgMCwgX3N0cmluZ09yTnVsbExlbmd0aChwYXRoKSwgcGF0aFNlZ21lbnRzLCBzY2hlbWUsIGhhc0F1dGhvcml0eSk7CiAgICBpZiAoc2NoZW1lLmlzRW1wdHkgJiYgaG9zdCA9PSBudWxsICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICBib29sIGFsbG93U2NoZW1lID0gc2NoZW1lLmlzTm90RW1wdHkgfHwgaG9zdCAhPSBudWxsOwogICAgICBwYXRoID0gX25vcm1hbGl6ZVJlbGF0aXZlUGF0aChwYXRoLCBhbGxvd1NjaGVtZSk7CiAgICB9IGVsc2UgewogICAgICBwYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKHBhdGgpOwogICAgfQogICAgaWYgKGhvc3QgPT0gbnVsbCAmJiBwYXRoLnN0YXJ0c1dpdGgoIi8vIikpIHsKICAgICAgaG9zdCA9ICIiOwogICAgfQogICAgcmV0dXJuIF9VcmkuX2ludGVybmFsKHNjaGVtZSwgdXNlckluZm8sIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCk7CiAgfQoKICAvLy8gSW1wbGVtZW50YXRpb24gb2YgW1VyaS5odHRwXS4KICBmYWN0b3J5IF9VcmkuaHR0cChTdHJpbmcgYXV0aG9yaXR5LCBTdHJpbmcgdW5lbmNvZGVkUGF0aCwKICAgICAgW01hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzXSkgewogICAgcmV0dXJuIF9tYWtlSHR0cFVyaSgiaHR0cCIsIGF1dGhvcml0eSwgdW5lbmNvZGVkUGF0aCwgcXVlcnlQYXJhbWV0ZXJzKTsKICB9CgogIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVXJpLmh0dHBzXS4KICBmYWN0b3J5IF9VcmkuaHR0cHMoU3RyaW5nIGF1dGhvcml0eSwgU3RyaW5nIHVuZW5jb2RlZFBhdGgsCiAgICAgIFtNYXA8U3RyaW5nLCBTdHJpbmc+IHF1ZXJ5UGFyYW1ldGVyc10pIHsKICAgIHJldHVybiBfbWFrZUh0dHBVcmkoImh0dHBzIiwgYXV0aG9yaXR5LCB1bmVuY29kZWRQYXRoLCBxdWVyeVBhcmFtZXRlcnMpOwogIH0KCiAgU3RyaW5nIGdldCBhdXRob3JpdHkgewogICAgaWYgKCFoYXNBdXRob3JpdHkpIHJldHVybiAiIjsKICAgIHZhciBzYiA9IFN0cmluZ0J1ZmZlcigpOwogICAgX3dyaXRlQXV0aG9yaXR5KHNiKTsKICAgIHJldHVybiBzYi50b1N0cmluZygpOwogIH0KCiAgU3RyaW5nIGdldCB1c2VySW5mbyA9PiBfdXNlckluZm87CgogIFN0cmluZyBnZXQgaG9zdCB7CiAgICBpZiAoX2hvc3QgPT0gbnVsbCkgcmV0dXJuICIiOwogICAgaWYgKF9ob3N0LnN0YXJ0c1dpdGgoJ1snKSkgewogICAgICByZXR1cm4gX2hvc3Quc3Vic3RyaW5nKDEsIF9ob3N0Lmxlbmd0aCAtIDEpOwogICAgfQogICAgcmV0dXJuIF9ob3N0OwogIH0KCiAgaW50IGdldCBwb3J0IHsKICAgIGlmIChfcG9ydCA9PSBudWxsKSByZXR1cm4gX2RlZmF1bHRQb3J0KHNjaGVtZSk7CiAgICByZXR1cm4gX3BvcnQ7CiAgfQoKICAvLyBUaGUgZGVmYXVsdCBwb3J0IGZvciB0aGUgc2NoZW1lIG9mIHRoaXMgVXJpLgogIHN0YXRpYyBpbnQgX2RlZmF1bHRQb3J0KFN0cmluZyBzY2hlbWUpIHsKICAgIGlmIChzY2hlbWUgPT0gImh0dHAiKSByZXR1cm4gODA7CiAgICBpZiAoc2NoZW1lID09ICJodHRwcyIpIHJldHVybiA0NDM7CiAgICByZXR1cm4gMDsKICB9CgogIFN0cmluZyBnZXQgcXVlcnkgPT4gX3F1ZXJ5ID8/ICIiOwoKICBTdHJpbmcgZ2V0IGZyYWdtZW50ID0+IF9mcmFnbWVudCA/PyAiIjsKCiAgYm9vbCBpc1NjaGVtZShTdHJpbmcgc2NoZW1lKSB7CiAgICBTdHJpbmcgdGhpc1NjaGVtZSA9IHRoaXMuc2NoZW1lOwogICAgaWYgKHNjaGVtZSA9PSBudWxsKSByZXR1cm4gdGhpc1NjaGVtZS5pc0VtcHR5OwogICAgaWYgKHNjaGVtZS5sZW5ndGggIT0gdGhpc1NjaGVtZS5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfY29tcGFyZVNjaGVtZShzY2hlbWUsIHRoaXNTY2hlbWUpOwogIH0KCiAgLy8vIENvbXBhcmVzIHNjaGVtZSBjaGFyYWN0ZXJzIGluIFtzY2hlbWVdIGFuZCBhdCB0aGUgc3RhcnQgb2YgW3VyaV0uCiAgLy8vCiAgLy8vIFJldHVybnMgYHRydWVgIGlmIFtzY2hlbWVdIHJlcHJlc2VudHMgdGhlIHNhbWUgc2NoZW1lIGFzIHRoZSBzdGFydCBvZgogIC8vLyBbdXJpXS4gVGhhdCBtZWFucyBoYXZpbmcgdGhlIHNhbWUgY2hhcmFjdGVycywgYnV0IHBvc3NpYmx5IGRpZmZlcmVudCBjYXNlCiAgLy8vIGZvciBsZXR0ZXJzLgogIC8vLwogIC8vLyBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgdGhhdCB0aGUgY2hhcmFjdGVycyBhcmUgdmFsaWQgVVJJIHNjaGVtZQogIC8vLyBjaGFyYWN0ZXJzLiBUaGUgW3VyaV0gaXMgYXNzdW1lZCB0byBiZSB2YWxpZCwgc28gaWYgW3NjaGVtZV0gbWF0Y2hlcwogIC8vLyBpdCwgaXQgaGFzIHRvIGJlIHZhbGlkIHRvby4KICAvLy8KICAvLy8gVGhlIGxlbmd0aCBzaG91bGQgYmUgdGVzdGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sCiAgLy8vIHNvIHRoZSBzY2hlbWUgcGFydCBvZiBbdXJpXSBpcyBrbm93biB0byBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBbc2NoZW1lXS4KICBzdGF0aWMgYm9vbCBfY29tcGFyZVNjaGVtZShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgdXJpKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtZS5sZW5ndGg7IGkrKykgewogICAgICBpbnQgc2NoZW1lQ2hhciA9IHNjaGVtZS5jb2RlVW5pdEF0KGkpOwogICAgICBpbnQgdXJpQ2hhciA9IHVyaS5jb2RlVW5pdEF0KGkpOwogICAgICBpbnQgZGVsdGEgPSBzY2hlbWVDaGFyIF4gdXJpQ2hhcjsKICAgICAgaWYgKGRlbHRhICE9IDApIHsKICAgICAgICBpZiAoZGVsdGEgPT0gMHgyMCkgewogICAgICAgICAgLy8gTWlnaHQgYmUgYSBjYXNlIGRpZmZlcmVuY2UuCiAgICAgICAgICBpbnQgbG93ZXJDaGFyID0gdXJpQ2hhciB8IGRlbHRhOwogICAgICAgICAgaWYgKDB4NjEgLyphKi8gPD0gbG93ZXJDaGFyICYmIGxvd2VyQ2hhciA8PSAweDdhIC8qeiovKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8gUmVwb3J0IGEgcGFyc2UgZmFpbHVyZS4KICBzdGF0aWMgdm9pZCBfZmFpbChTdHJpbmcgdXJpLCBpbnQgaW5kZXgsIFN0cmluZyBtZXNzYWdlKSB7CiAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24obWVzc2FnZSwgdXJpLCBpbmRleCk7CiAgfQoKICBzdGF0aWMgVXJpIF9tYWtlSHR0cFVyaShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgYXV0aG9yaXR5LCBTdHJpbmcgdW5lbmNvZGVkUGF0aCwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnMpIHsKICAgIHZhciB1c2VySW5mbyA9ICIiOwogICAgU3RyaW5nIGhvc3Q7CiAgICBpbnQgcG9ydDsKCiAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwgJiYgYXV0aG9yaXR5LmlzTm90RW1wdHkpIHsKICAgICAgdmFyIGhvc3RTdGFydCA9IDA7CiAgICAgIC8vIFNwbGl0IG9mZiB0aGUgdXNlciBpbmZvLgogICAgICBib29sIGhhc1VzZXJJbmZvID0gZmFsc2U7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aG9yaXR5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgaW50IGF0U2lnbiA9IDB4NDA7CiAgICAgICAgaWYgKGF1dGhvcml0eS5jb2RlVW5pdEF0KGkpID09IGF0U2lnbikgewogICAgICAgICAgaGFzVXNlckluZm8gPSB0cnVlOwogICAgICAgICAgdXNlckluZm8gPSBhdXRob3JpdHkuc3Vic3RyaW5nKDAsIGkpOwogICAgICAgICAgaG9zdFN0YXJ0ID0gaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGhvc3RFbmQgPSBob3N0U3RhcnQ7CiAgICAgIGlmIChob3N0U3RhcnQgPCBhdXRob3JpdHkubGVuZ3RoICYmCiAgICAgICAgICBhdXRob3JpdHkuY29kZVVuaXRBdChob3N0U3RhcnQpID09IF9MRUZUX0JSQUNLRVQpIHsKICAgICAgICAvLyBJUHY2IGhvc3QuCiAgICAgICAgZm9yICg7IGhvc3RFbmQgPCBhdXRob3JpdHkubGVuZ3RoOyBob3N0RW5kKyspIHsKICAgICAgICAgIGlmIChhdXRob3JpdHkuY29kZVVuaXRBdChob3N0RW5kKSA9PSBfUklHSFRfQlJBQ0tFVCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChob3N0RW5kID09IGF1dGhvcml0eS5sZW5ndGgpIHsKICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAiSW52YWxpZCBJUHY2IGhvc3QgZW50cnkuIiwgYXV0aG9yaXR5LCBob3N0U3RhcnQpOwogICAgICAgIH0KICAgICAgICBVcmkucGFyc2VJUHY2QWRkcmVzcyhhdXRob3JpdHksIGhvc3RTdGFydCArIDEsIGhvc3RFbmQpOwogICAgICAgIGhvc3RFbmQrKzsgLy8gU2tpcCB0aGUgY2xvc2luZyBicmFja2V0LgogICAgICAgIGlmIChob3N0RW5kICE9IGF1dGhvcml0eS5sZW5ndGggJiYKICAgICAgICAgICAgYXV0aG9yaXR5LmNvZGVVbml0QXQoaG9zdEVuZCkgIT0gX0NPTE9OKSB7CiAgICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZW5kIG9mIGF1dGhvcml0eSIsIGF1dGhvcml0eSwgaG9zdEVuZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFNwbGl0IGhvc3QgYW5kIHBvcnQuCiAgICAgIGJvb2wgaGFzUG9ydCA9IGZhbHNlOwogICAgICBmb3IgKDsgaG9zdEVuZCA8IGF1dGhvcml0eS5sZW5ndGg7IGhvc3RFbmQrKykgewogICAgICAgIGlmIChhdXRob3JpdHkuY29kZVVuaXRBdChob3N0RW5kKSA9PSBfQ09MT04pIHsKICAgICAgICAgIHZhciBwb3J0U3RyaW5nID0gYXV0aG9yaXR5LnN1YnN0cmluZyhob3N0RW5kICsgMSk7CiAgICAgICAgICAvLyBXZSBhbGxvdyB0aGUgZW1wdHkgcG9ydCAtIGZhbGxpbmcgYmFjayB0byBpbml0aWFsIHZhbHVlLgogICAgICAgICAgaWYgKHBvcnRTdHJpbmcuaXNOb3RFbXB0eSkgcG9ydCA9IGludC5wYXJzZShwb3J0U3RyaW5nKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBob3N0ID0gYXV0aG9yaXR5LnN1YnN0cmluZyhob3N0U3RhcnQsIGhvc3RFbmQpOwogICAgfQogICAgcmV0dXJuIFVyaSgKICAgICAgICBzY2hlbWU6IHNjaGVtZSwKICAgICAgICB1c2VySW5mbzogdXNlckluZm8sCiAgICAgICAgaG9zdDogaG9zdCwKICAgICAgICBwb3J0OiBwb3J0LAogICAgICAgIHBhdGhTZWdtZW50czogdW5lbmNvZGVkUGF0aC5zcGxpdCgiLyIpLAogICAgICAgIHF1ZXJ5UGFyYW1ldGVyczogcXVlcnlQYXJhbWV0ZXJzKTsKICB9CgogIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVXJpLmZpbGVdLgogIGZhY3RvcnkgX1VyaS5maWxlKFN0cmluZyBwYXRoLCB7Ym9vbCB3aW5kb3dzfSkgewogICAgd2luZG93cyA9ICh3aW5kb3dzID09IG51bGwpID8gX1VyaS5faXNXaW5kb3dzIDogd2luZG93czsKICAgIHJldHVybiB3aW5kb3dzCiAgICAgICAgPyBfbWFrZVdpbmRvd3NGaWxlVXJsKHBhdGgsIGZhbHNlKQogICAgICAgIDogX21ha2VGaWxlVXJpKHBhdGgsIGZhbHNlKTsKICB9CgogIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBbVXJpLmRpcmVjdG9yeV0uCiAgZmFjdG9yeSBfVXJpLmRpcmVjdG9yeShTdHJpbmcgcGF0aCwge2Jvb2wgd2luZG93c30pIHsKICAgIHdpbmRvd3MgPSAod2luZG93cyA9PSBudWxsKSA/IF9VcmkuX2lzV2luZG93cyA6IHdpbmRvd3M7CiAgICByZXR1cm4gd2luZG93cyA/IF9tYWtlV2luZG93c0ZpbGVVcmwocGF0aCwgdHJ1ZSkgOiBfbWFrZUZpbGVVcmkocGF0aCwgdHJ1ZSk7CiAgfQoKICAvLy8gVXNlZCBpbnRlcm5hbGx5IGluIHBhdGgtcmVsYXRlZCBjb25zdHJ1Y3RvcnMuCiAgZXh0ZXJuYWwgc3RhdGljIGJvb2wgZ2V0IF9pc1dpbmRvd3M7CgogIHN0YXRpYyBfY2hlY2tOb25XaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVycygKICAgICAgTGlzdDxTdHJpbmc+IHNlZ21lbnRzLCBib29sIGFyZ3VtZW50RXJyb3IpIHsKICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpIHsKICAgICAgaWYgKHNlZ21lbnQuY29udGFpbnMoIi8iKSkgewogICAgICAgIGlmIChhcmd1bWVudEVycm9yKSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJJbGxlZ2FsIHBhdGggY2hhcmFjdGVyICRzZWdtZW50Iik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgJHNlZ21lbnQiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgc3RhdGljIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKAogICAgICBMaXN0PFN0cmluZz4gc2VnbWVudHMsIGJvb2wgYXJndW1lbnRFcnJvciwKICAgICAgW2ludCBmaXJzdFNlZ21lbnQgPSAwXSkgewogICAgZm9yICh2YXIgc2VnbWVudCBpbiBzZWdtZW50cy5za2lwKGZpcnN0U2VnbWVudCkpIHsKICAgICAgaWYgKHNlZ21lbnQuY29udGFpbnMoUmVnRXhwKHInWyIqLzo8Pj9cXHxdJykpKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50RXJyb3IpIHsKICAgICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIklsbGVnYWwgY2hhcmFjdGVyIGluIHBhdGgiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDogJHNlZ21lbnQiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHN0YXRpYyBfY2hlY2tXaW5kb3dzRHJpdmVMZXR0ZXIoaW50IGNoYXJDb2RlLCBib29sIGFyZ3VtZW50RXJyb3IpIHsKICAgIGlmICgoX1VQUEVSX0NBU0VfQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBfVVBQRVJfQ0FTRV9aKSB8fAogICAgICAgIChfTE9XRVJfQ0FTRV9BIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IF9MT1dFUl9DQVNFX1opKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChhcmd1bWVudEVycm9yKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAiSWxsZWdhbCBkcml2ZSBsZXR0ZXIgIiArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiSWxsZWdhbCBkcml2ZSBsZXR0ZXIgIiArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpKTsKICAgIH0KICB9CgogIHN0YXRpYyBfbWFrZUZpbGVVcmkoU3RyaW5nIHBhdGgsIGJvb2wgc2xhc2hUZXJtaW5hdGVkKSB7CiAgICBjb25zdCBTdHJpbmcgc2VwID0gIi8iOwogICAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdChzZXApOwogICAgaWYgKHNsYXNoVGVybWluYXRlZCAmJiBzZWdtZW50cy5pc05vdEVtcHR5ICYmIHNlZ21lbnRzLmxhc3QuaXNOb3RFbXB0eSkgewogICAgICBzZWdtZW50cy5hZGQoIiIpOyAvLyBFeHRyYSBzZXBhcmF0b3IgYXQgZW5kLgogICAgfQogICAgaWYgKHBhdGguc3RhcnRzV2l0aChzZXApKSB7CiAgICAgIC8vIEFic29sdXRlIGZpbGU6Ly8gVVJJLgogICAgICByZXR1cm4gVXJpKHNjaGVtZTogImZpbGUiLCBwYXRoU2VnbWVudHM6IHNlZ21lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlbGF0aXZlIFVSSS4KICAgICAgcmV0dXJuIFVyaShwYXRoU2VnbWVudHM6IHNlZ21lbnRzKTsKICAgIH0KICB9CgogIHN0YXRpYyBfbWFrZVdpbmRvd3NGaWxlVXJsKFN0cmluZyBwYXRoLCBib29sIHNsYXNoVGVybWluYXRlZCkgewogICAgaWYgKHBhdGguc3RhcnRzV2l0aChyIlxcP1wiKSkgewogICAgICBpZiAocGF0aC5zdGFydHNXaXRoKHIiVU5DXCIsIDQpKSB7CiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZVJhbmdlKDAsIDcsIHInXCcpOwogICAgICB9IGVsc2UgewogICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyg0KTsKICAgICAgICBpZiAocGF0aC5sZW5ndGggPCAzIHx8CiAgICAgICAgICAgIHBhdGguY29kZVVuaXRBdCgxKSAhPSBfQ09MT04gfHwKICAgICAgICAgICAgcGF0aC5jb2RlVW5pdEF0KDIpICE9IF9CQUNLU0xBU0gpIHsKICAgICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoCiAgICAgICAgICAgICAgciJXaW5kb3dzIHBhdGhzIHdpdGggXFw/XCBwcmVmaXggbXVzdCBiZSBhYnNvbHV0ZSIpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZUFsbCgiLyIsIHInXCcpOwogICAgfQogICAgY29uc3QgU3RyaW5nIHNlcCA9IHInXCc7CiAgICBpZiAocGF0aC5sZW5ndGggPiAxICYmIHBhdGguY29kZVVuaXRBdCgxKSA9PSBfQ09MT04pIHsKICAgICAgX2NoZWNrV2luZG93c0RyaXZlTGV0dGVyKHBhdGguY29kZVVuaXRBdCgwKSwgdHJ1ZSk7CiAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAyIHx8IHBhdGguY29kZVVuaXRBdCgyKSAhPSBfQkFDS1NMQVNIKSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiV2luZG93cyBwYXRocyB3aXRoIGRyaXZlIGxldHRlciBtdXN0IGJlIGFic29sdXRlIik7CiAgICAgIH0KICAgICAgLy8gQWJzb2x1dGUgZmlsZTovL0M6LyBVUkkuCiAgICAgIHZhciBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcCk7CiAgICAgIGlmIChzbGFzaFRlcm1pbmF0ZWQgJiYgcGF0aFNlZ21lbnRzLmxhc3QuaXNOb3RFbXB0eSkgewogICAgICAgIHBhdGhTZWdtZW50cy5hZGQoIiIpOyAvLyBFeHRyYSBzZXBhcmF0b3IgYXQgZW5kLgogICAgICB9CiAgICAgIF9jaGVja1dpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHBhdGhTZWdtZW50cywgdHJ1ZSwgMSk7CiAgICAgIHJldHVybiBVcmkoc2NoZW1lOiAiZmlsZSIsIHBhdGhTZWdtZW50czogcGF0aFNlZ21lbnRzKTsKICAgIH0KCiAgICBpZiAocGF0aC5zdGFydHNXaXRoKHNlcCkpIHsKICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChzZXAsIDEpKSB7CiAgICAgICAgLy8gQWJzb2x1dGUgZmlsZTovLyBVUkkgd2l0aCBob3N0LgogICAgICAgIGludCBwYXRoU3RhcnQgPSBwYXRoLmluZGV4T2YocidcJywgMik7CiAgICAgICAgU3RyaW5nIGhvc3RQYXJ0ID0KICAgICAgICAgICAgKHBhdGhTdGFydCA8IDApID8gcGF0aC5zdWJzdHJpbmcoMikgOiBwYXRoLnN1YnN0cmluZygyLCBwYXRoU3RhcnQpOwogICAgICAgIFN0cmluZyBwYXRoUGFydCA9IChwYXRoU3RhcnQgPCAwKSA/ICIiIDogcGF0aC5zdWJzdHJpbmcocGF0aFN0YXJ0ICsgMSk7CiAgICAgICAgdmFyIHBhdGhTZWdtZW50cyA9IHBhdGhQYXJ0LnNwbGl0KHNlcCk7CiAgICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMocGF0aFNlZ21lbnRzLCB0cnVlKTsKICAgICAgICBpZiAoc2xhc2hUZXJtaW5hdGVkICYmIHBhdGhTZWdtZW50cy5sYXN0LmlzTm90RW1wdHkpIHsKICAgICAgICAgIHBhdGhTZWdtZW50cy5hZGQoIiIpOyAvLyBFeHRyYSBzZXBhcmF0b3IgYXQgZW5kLgogICAgICAgIH0KICAgICAgICByZXR1cm4gVXJpKHNjaGVtZTogImZpbGUiLCBob3N0OiBob3N0UGFydCwgcGF0aFNlZ21lbnRzOiBwYXRoU2VnbWVudHMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEFic29sdXRlIGZpbGU6Ly8gVVJJLgogICAgICAgIHZhciBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcCk7CiAgICAgICAgaWYgKHNsYXNoVGVybWluYXRlZCAmJiBwYXRoU2VnbWVudHMubGFzdC5pc05vdEVtcHR5KSB7CiAgICAgICAgICBwYXRoU2VnbWVudHMuYWRkKCIiKTsgLy8gRXh0cmEgc2VwYXJhdG9yIGF0IGVuZC4KICAgICAgICB9CiAgICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMocGF0aFNlZ21lbnRzLCB0cnVlKTsKICAgICAgICByZXR1cm4gVXJpKHNjaGVtZTogImZpbGUiLCBwYXRoU2VnbWVudHM6IHBhdGhTZWdtZW50cyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlbGF0aXZlIFVSSS4KICAgICAgdmFyIHBhdGhTZWdtZW50cyA9IHBhdGguc3BsaXQoc2VwKTsKICAgICAgX2NoZWNrV2luZG93c1BhdGhSZXNlcnZlZENoYXJhY3RlcnMocGF0aFNlZ21lbnRzLCB0cnVlKTsKICAgICAgaWYgKHNsYXNoVGVybWluYXRlZCAmJgogICAgICAgICAgcGF0aFNlZ21lbnRzLmlzTm90RW1wdHkgJiYKICAgICAgICAgIHBhdGhTZWdtZW50cy5sYXN0LmlzTm90RW1wdHkpIHsKICAgICAgICBwYXRoU2VnbWVudHMuYWRkKCIiKTsgLy8gRXh0cmEgc2VwYXJhdG9yIGF0IGVuZC4KICAgICAgfQogICAgICByZXR1cm4gVXJpKHBhdGhTZWdtZW50czogcGF0aFNlZ21lbnRzKTsKICAgIH0KICB9CgogIFVyaSByZXBsYWNlKAogICAgICB7U3RyaW5nIHNjaGVtZSwKICAgICAgU3RyaW5nIHVzZXJJbmZvLAogICAgICBTdHJpbmcgaG9zdCwKICAgICAgaW50IHBvcnQsCiAgICAgIFN0cmluZyBwYXRoLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywKICAgICAgU3RyaW5nIHF1ZXJ5LAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycywKICAgICAgU3RyaW5nIGZyYWdtZW50fSkgewogICAgLy8gU2V0IHRvIHRydWUgaWYgdGhlIHNjaGVtZSBoYXMgKHBvdGVudGlhbGx5KSBjaGFuZ2VkLgogICAgLy8gSW4gdGhhdCBjYXNlLCB0aGUgZGVmYXVsdCBwb3J0IG1heSBhbHNvIGhhdmUgY2hhbmdlZCBhbmQgd2UgbmVlZAogICAgLy8gdG8gY2hlY2sgZXZlbiB0aGUgZXhpc3RpbmcgcG9ydC4KICAgIGJvb2wgc2NoZW1lQ2hhbmdlZCA9IGZhbHNlOwogICAgaWYgKHNjaGVtZSAhPSBudWxsKSB7CiAgICAgIHNjaGVtZSA9IF9tYWtlU2NoZW1lKHNjaGVtZSwgMCwgc2NoZW1lLmxlbmd0aCk7CiAgICAgIHNjaGVtZUNoYW5nZWQgPSAoc2NoZW1lICE9IHRoaXMuc2NoZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjaGVtZSA9IHRoaXMuc2NoZW1lOwogICAgfQogICAgYm9vbCBpc0ZpbGUgPSAoc2NoZW1lID09ICJmaWxlIik7CiAgICBpZiAodXNlckluZm8gIT0gbnVsbCkgewogICAgICB1c2VySW5mbyA9IF9tYWtlVXNlckluZm8odXNlckluZm8sIDAsIHVzZXJJbmZvLmxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICB1c2VySW5mbyA9IHRoaXMuX3VzZXJJbmZvOwogICAgfQogICAgaWYgKHBvcnQgIT0gbnVsbCkgewogICAgICBwb3J0ID0gX21ha2VQb3J0KHBvcnQsIHNjaGVtZSk7CiAgICB9IGVsc2UgewogICAgICBwb3J0ID0gdGhpcy5fcG9ydDsKICAgICAgaWYgKHNjaGVtZUNoYW5nZWQpIHsKICAgICAgICAvLyBUaGUgZGVmYXVsdCBwb3J0IG1pZ2h0IGhhdmUgY2hhbmdlZC4KICAgICAgICBwb3J0ID0gX21ha2VQb3J0KHBvcnQsIHNjaGVtZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChob3N0ICE9IG51bGwpIHsKICAgICAgaG9zdCA9IF9tYWtlSG9zdChob3N0LCAwLCBob3N0Lmxlbmd0aCwgZmFsc2UpOwogICAgfSBlbHNlIGlmICh0aGlzLmhhc0F1dGhvcml0eSkgewogICAgICBob3N0ID0gdGhpcy5faG9zdDsKICAgIH0gZWxzZSBpZiAodXNlckluZm8uaXNOb3RFbXB0eSB8fCBwb3J0ICE9IG51bGwgfHwgaXNGaWxlKSB7CiAgICAgIGhvc3QgPSAiIjsKICAgIH0KCiAgICBib29sIGhhc0F1dGhvcml0eSA9IGhvc3QgIT0gbnVsbDsKICAgIGlmIChwYXRoICE9IG51bGwgfHwgcGF0aFNlZ21lbnRzICE9IG51bGwpIHsKICAgICAgcGF0aCA9IF9tYWtlUGF0aChwYXRoLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHBhdGgpLCBwYXRoU2VnbWVudHMsIHNjaGVtZSwKICAgICAgICAgIGhhc0F1dGhvcml0eSk7CiAgICB9IGVsc2UgewogICAgICBwYXRoID0gdGhpcy5wYXRoOwogICAgICBpZiAoKGlzRmlsZSB8fCAoaGFzQXV0aG9yaXR5ICYmICFwYXRoLmlzRW1wdHkpKSAmJgogICAgICAgICAgIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgcGF0aCA9ICIvIiArIHBhdGg7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocXVlcnkgIT0gbnVsbCB8fCBxdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBxdWVyeSA9IF9tYWtlUXVlcnkocXVlcnksIDAsIF9zdHJpbmdPck51bGxMZW5ndGgocXVlcnkpLCBxdWVyeVBhcmFtZXRlcnMpOwogICAgfSBlbHNlIHsKICAgICAgcXVlcnkgPSB0aGlzLl9xdWVyeTsKICAgIH0KCiAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkgewogICAgICBmcmFnbWVudCA9IF9tYWtlRnJhZ21lbnQoZnJhZ21lbnQsIDAsIGZyYWdtZW50Lmxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICBmcmFnbWVudCA9IHRoaXMuX2ZyYWdtZW50OwogICAgfQoKICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbChzY2hlbWUsIHVzZXJJbmZvLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOwogIH0KCiAgVXJpIHJlbW92ZUZyYWdtZW50KCkgewogICAgaWYgKCF0aGlzLmhhc0ZyYWdtZW50KSByZXR1cm4gdGhpczsKICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbChzY2hlbWUsIF91c2VySW5mbywgX2hvc3QsIF9wb3J0LCBwYXRoLCBfcXVlcnksIG51bGwpOwogIH0KCiAgTGlzdDxTdHJpbmc+IGdldCBwYXRoU2VnbWVudHMgewogICAgdmFyIHJlc3VsdCA9IF9wYXRoU2VnbWVudHM7CiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7CgogICAgdmFyIHBhdGhUb1NwbGl0ID0gcGF0aDsKICAgIGlmIChwYXRoVG9TcGxpdC5pc05vdEVtcHR5ICYmIHBhdGhUb1NwbGl0LmNvZGVVbml0QXQoMCkgPT0gX1NMQVNIKSB7CiAgICAgIHBhdGhUb1NwbGl0ID0gcGF0aFRvU3BsaXQuc3Vic3RyaW5nKDEpOwogICAgfQogICAgcmVzdWx0ID0gKHBhdGhUb1NwbGl0ID09ICIiKQogICAgICAgID8gY29uc3QgPFN0cmluZz5bXQogICAgICAgIDogTGlzdDxTdHJpbmc+LnVubW9kaWZpYWJsZSgKICAgICAgICAgICAgcGF0aFRvU3BsaXQuc3BsaXQoIi8iKS5tYXAoVXJpLmRlY29kZUNvbXBvbmVudCkpOwogICAgX3BhdGhTZWdtZW50cyA9IHJlc3VsdDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBxdWVyeVBhcmFtZXRlcnMgewogICAgX3F1ZXJ5UGFyYW1ldGVycyA/Pz0KICAgICAgICBVbm1vZGlmaWFibGVNYXBWaWV3PFN0cmluZywgU3RyaW5nPihVcmkuc3BsaXRRdWVyeVN0cmluZyhxdWVyeSkpOwogICAgcmV0dXJuIF9xdWVyeVBhcmFtZXRlcnM7CiAgfQoKICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldCBxdWVyeVBhcmFtZXRlcnNBbGwgewogICAgaWYgKF9xdWVyeVBhcmFtZXRlckxpc3RzID09IG51bGwpIHsKICAgICAgTWFwIHF1ZXJ5UGFyYW1ldGVyTGlzdHMgPSBfc3BsaXRRdWVyeVN0cmluZ0FsbChxdWVyeSk7CiAgICAgIGZvciAodmFyIGtleSBpbiBxdWVyeVBhcmFtZXRlckxpc3RzLmtleXMpIHsKICAgICAgICBxdWVyeVBhcmFtZXRlckxpc3RzW2tleV0gPQogICAgICAgICAgICBMaXN0PFN0cmluZz4udW5tb2RpZmlhYmxlKHF1ZXJ5UGFyYW1ldGVyTGlzdHNba2V5XSk7CiAgICAgIH0KICAgICAgX3F1ZXJ5UGFyYW1ldGVyTGlzdHMgPQogICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pi51bm1vZGlmaWFibGUocXVlcnlQYXJhbWV0ZXJMaXN0cyk7CiAgICB9CiAgICByZXR1cm4gX3F1ZXJ5UGFyYW1ldGVyTGlzdHM7CiAgfQoKICBVcmkgbm9ybWFsaXplUGF0aCgpIHsKICAgIFN0cmluZyBwYXRoID0gX25vcm1hbGl6ZVBhdGgodGhpcy5wYXRoLCBzY2hlbWUsIGhhc0F1dGhvcml0eSk7CiAgICBpZiAoaWRlbnRpY2FsKHBhdGgsIHRoaXMucGF0aCkpIHJldHVybiB0aGlzOwogICAgcmV0dXJuIHRoaXMucmVwbGFjZShwYXRoOiBwYXRoKTsKICB9CgogIHN0YXRpYyBpbnQgX21ha2VQb3J0KGludCBwb3J0LCBTdHJpbmcgc2NoZW1lKSB7CiAgICAvLyBQZXJmb3JtIHNjaGVtZSBzcGVjaWZpYyBub3JtYWxpemF0aW9uLgogICAgaWYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0ID09IF9kZWZhdWx0UG9ydChzY2hlbWUpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBwb3J0OwogIH0KCiAgLyoqCiAgICogQ2hlY2sgYW5kIG5vcm1hbGl6ZSBhIGhvc3QgbmFtZS4KICAgKgogICAqIElmIHRoZSBob3N0IG5hbWUgc3RhcnRzIGFuZCBlbmRzIHdpdGggJ1snIGFuZCAnXScsIGl0IGlzIGNvbnNpZGVyZWQgYW4KICAgKiBJUHY2IGFkZHJlc3MuIElmIFtzdHJpY3RJUHY2XSBpcyBmYWxzZSwgdGhlIGFkZHJlc3MgaXMgYWxzbyBjb25zaWRlcmVkCiAgICogYW4gSVB2NiBhZGRyZXNzIGlmIGl0IGNvbnRhaW5zIGFueSAnOicgY2hhcmFjdGVyLgogICAqCiAgICogSWYgaXQgaXMgbm90IGFuIElQdjYgYWRkcmVzcywgaXQgaXMgY2FzZS0gYW5kIGVzY2FwZS1ub3JtYWxpemVkLgogICAqIFRoaXMgZXNjYXBlcyBhbGwgY2hhcmFjdGVycyBub3QgdmFsaWQgaW4gYSByZWctbmFtZSwKICAgKiBhbmQgY29udmVydHMgYWxsIG5vbi1lc2NhcGUgdXBwZXItY2FzZSBsZXR0ZXJzIHRvIGxvd2VyLWNhc2UuCiAgICovCiAgc3RhdGljIFN0cmluZyBfbWFrZUhvc3QoU3RyaW5nIGhvc3QsIGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBzdHJpY3RJUHY2KSB7CiAgICAvLyBUT0RPKGxybik6IFNob3VsZCB3ZSBub3JtYWxpemUgSVB2NiBhZGRyZXNzZXMgYWNjb3JkaW5nIHRvIFJGQyA1OTUyPwogICAgaWYgKGhvc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gIiI7CiAgICAvLyBIb3N0IGlzIGFuIElQdjYgYWRkcmVzcyBpZiBpdCBzdGFydHMgd2l0aCAnWycgb3IgY29udGFpbnMgYSBjb2xvbi4KICAgIGlmIChob3N0LmNvZGVVbml0QXQoc3RhcnQpID09IF9MRUZUX0JSQUNLRVQpIHsKICAgICAgaWYgKGhvc3QuY29kZVVuaXRBdChlbmQgLSAxKSAhPSBfUklHSFRfQlJBQ0tFVCkgewogICAgICAgIF9mYWlsKGhvc3QsIHN0YXJ0LCAnTWlzc2luZyBlbmQgYF1gIHRvIG1hdGNoIGBbYCBpbiBob3N0Jyk7CiAgICAgIH0KICAgICAgVXJpLnBhcnNlSVB2NkFkZHJlc3MoaG9zdCwgc3RhcnQgKyAxLCBlbmQgLSAxKTsKICAgICAgLy8gUkZDIDU5NTIgcmVxdWlyZXMgaGV4IGRpZ2l0cyB0byBiZSBsb3dlciBjYXNlLgogICAgICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudG9Mb3dlckNhc2UoKTsKICAgIH0KICAgIGlmICghc3RyaWN0SVB2NikgewogICAgICAvLyBUT0RPKGxybik6IHNraXAgaWYgdG9vIHNob3J0IHRvIGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzPwogICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgIGlmIChob3N0LmNvZGVVbml0QXQoaSkgPT0gX0NPTE9OKSB7CiAgICAgICAgICBVcmkucGFyc2VJUHY2QWRkcmVzcyhob3N0LCBzdGFydCwgZW5kKTsKICAgICAgICAgIHJldHVybiAnWyRob3N0XSc7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gX25vcm1hbGl6ZVJlZ05hbWUoaG9zdCwgc3RhcnQsIGVuZCk7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNSZWdOYW1lQ2hhcihpbnQgY2hhcikgewogICAgcmV0dXJuIGNoYXIgPCAxMjcgJiYgKF9yZWdOYW1lVGFibGVbY2hhciA+PiA0XSAmICgxIDw8IChjaGFyICYgMHhmKSkpICE9IDA7CiAgfQoKICAvKioKICAgKiBWYWxpZGF0ZXMgYW5kIGRvZXMgY2FzZS0gYW5kIHBlcmNlbnQtZW5jb2Rpbmcgbm9ybWFsaXphdGlvbi4KICAgKgogICAqIFRoZSBbaG9zdF0gbXVzdCBiZSBhbiBSRkMzOTg2ICJyZWctbmFtZSIuIEl0IGlzIGNvbnZlcnRlZAogICAqIHRvIGxvd2VyIGNhc2UsIGFuZCBwZXJjZW50IGVzY2FwZXMgYXJlIGNvbnZlcnRlZCB0byBlaXRoZXIKICAgKiBsb3dlciBjYXNlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycyBvciB1cHBlciBjYXNlIGVzY2FwZXMuCiAgICovCiAgc3RhdGljIFN0cmluZyBfbm9ybWFsaXplUmVnTmFtZShTdHJpbmcgaG9zdCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICBTdHJpbmdCdWZmZXIgYnVmZmVyOwogICAgaW50IHNlY3Rpb25TdGFydCA9IHN0YXJ0OwogICAgaW50IGluZGV4ID0gc3RhcnQ7CiAgICAvLyBXaGV0aGVyIGFsbCBjaGFyYWN0ZXJzIGJldHdlZW4gc2VjdGlvblN0YXJ0IGFuZCBpbmRleCBhcmUgbm9ybWFsaXplZCwKICAgIGJvb2wgaXNOb3JtYWxpemVkID0gdHJ1ZTsKCiAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKICAgICAgaW50IGNoYXIgPSBob3N0LmNvZGVVbml0QXQoaW5kZXgpOwogICAgICBpZiAoY2hhciA9PSBfUEVSQ0VOVCkgewogICAgICAgIC8vIFRoZSBfcmVnTmFtZVRhYmxlIGNvbnRhaW5zICIlIiwgc28gd2UgY2hlY2sgdGhhdCBmaXJzdC4KICAgICAgICBTdHJpbmcgcmVwbGFjZW1lbnQgPSBfbm9ybWFsaXplRXNjYXBlKGhvc3QsIGluZGV4LCB0cnVlKTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCAmJiBpc05vcm1hbGl6ZWQpIHsKICAgICAgICAgIGluZGV4ICs9IDM7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyID8/PSBTdHJpbmdCdWZmZXIoKTsKICAgICAgICBTdHJpbmcgc2xpY2UgPSBob3N0LnN1YnN0cmluZyhzZWN0aW9uU3RhcnQsIGluZGV4KTsKICAgICAgICBpZiAoIWlzTm9ybWFsaXplZCkgc2xpY2UgPSBzbGljZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGJ1ZmZlci53cml0ZShzbGljZSk7CiAgICAgICAgaW50IHNvdXJjZUxlbmd0aCA9IDM7CiAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKICAgICAgICAgIHJlcGxhY2VtZW50ID0gaG9zdC5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMyk7CiAgICAgICAgfSBlbHNlIGlmIChyZXBsYWNlbWVudCA9PSAiJSIpIHsKICAgICAgICAgIHJlcGxhY2VtZW50ID0gIiUyNSI7CiAgICAgICAgICBzb3VyY2VMZW5ndGggPSAxOwogICAgICAgIH0KICAgICAgICBidWZmZXIud3JpdGUocmVwbGFjZW1lbnQpOwogICAgICAgIGluZGV4ICs9IHNvdXJjZUxlbmd0aDsKICAgICAgICBzZWN0aW9uU3RhcnQgPSBpbmRleDsKICAgICAgICBpc05vcm1hbGl6ZWQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKF9pc1JlZ05hbWVDaGFyKGNoYXIpKSB7CiAgICAgICAgaWYgKGlzTm9ybWFsaXplZCAmJiBfVVBQRVJfQ0FTRV9BIDw9IGNoYXIgJiYgX1VQUEVSX0NBU0VfWiA+PSBjaGFyKSB7CiAgICAgICAgICAvLyBQdXQgaW5pdGlhbCBzbGljZSBpbiBidWZmZXIgYW5kIGNvbnRpbnVlIGluIG5vbi1ub3JtYWxpemVkIG1vZGUKICAgICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICBpZiAoc2VjdGlvblN0YXJ0IDwgaW5kZXgpIHsKICAgICAgICAgICAgYnVmZmVyLndyaXRlKGhvc3Quc3Vic3RyaW5nKHNlY3Rpb25TdGFydCwgaW5kZXgpKTsKICAgICAgICAgICAgc2VjdGlvblN0YXJ0ID0gaW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgICBpc05vcm1hbGl6ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaW5kZXgrKzsKICAgICAgfSBlbHNlIGlmIChfaXNHZW5lcmFsRGVsaW1pdGVyKGNoYXIpKSB7CiAgICAgICAgX2ZhaWwoaG9zdCwgaW5kZXgsICJJbnZhbGlkIGNoYXJhY3RlciIpOwogICAgICB9IGVsc2UgewogICAgICAgIGludCBzb3VyY2VMZW5ndGggPSAxOwogICAgICAgIGlmICgoY2hhciAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChpbmRleCArIDEpIDwgZW5kKSB7CiAgICAgICAgICBpbnQgdGFpbCA9IGhvc3QuY29kZVVuaXRBdChpbmRleCArIDEpOwogICAgICAgICAgaWYgKCh0YWlsICYgMHhGQzAwKSA9PSAweERDMDApIHsKICAgICAgICAgICAgY2hhciA9IDB4MTAwMDAgfCAoKGNoYXIgJiAweDNmZikgPDwgMTApIHwgKHRhaWwgJiAweDNmZik7CiAgICAgICAgICAgIHNvdXJjZUxlbmd0aCA9IDI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ1ZmZlciA/Pz0gU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgU3RyaW5nIHNsaWNlID0gaG9zdC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBpbmRleCk7CiAgICAgICAgaWYgKCFpc05vcm1hbGl6ZWQpIHNsaWNlID0gc2xpY2UudG9Mb3dlckNhc2UoKTsKICAgICAgICBidWZmZXIud3JpdGUoc2xpY2UpOwogICAgICAgIGJ1ZmZlci53cml0ZShfZXNjYXBlQ2hhcihjaGFyKSk7CiAgICAgICAgaW5kZXggKz0gc291cmNlTGVuZ3RoOwogICAgICAgIHNlY3Rpb25TdGFydCA9IGluZGV4OwogICAgICB9CiAgICB9CiAgICBpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBob3N0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICAgIGlmIChzZWN0aW9uU3RhcnQgPCBlbmQpIHsKICAgICAgU3RyaW5nIHNsaWNlID0gaG9zdC5zdWJzdHJpbmcoc2VjdGlvblN0YXJ0LCBlbmQpOwogICAgICBpZiAoIWlzTm9ybWFsaXplZCkgc2xpY2UgPSBzbGljZS50b0xvd2VyQ2FzZSgpOwogICAgICBidWZmZXIud3JpdGUoc2xpY2UpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgLyoqCiAgICogVmFsaWRhdGVzIHNjaGVtZSBjaGFyYWN0ZXJzIGFuZCBkb2VzIGNhc2Utbm9ybWFsaXphdGlvbi4KICAgKgogICAqIFNjaGVtZXMgYXJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLiBUaGV5IGNhbm5vdCBjb250YWluIGVzY2FwZXMuCiAgICovCiAgc3RhdGljIFN0cmluZyBfbWFrZVNjaGVtZShTdHJpbmcgc2NoZW1lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGlmIChzdGFydCA9PSBlbmQpIHJldHVybiAiIjsKICAgIGZpbmFsIGludCBmaXJzdENvZGVVbml0ID0gc2NoZW1lLmNvZGVVbml0QXQoc3RhcnQpOwogICAgaWYgKCFfaXNBbHBoYWJldGljQ2hhcmFjdGVyKGZpcnN0Q29kZVVuaXQpKSB7CiAgICAgIF9mYWlsKHNjaGVtZSwgc3RhcnQsICJTY2hlbWUgbm90IHN0YXJ0aW5nIHdpdGggYWxwaGFiZXRpYyBjaGFyYWN0ZXIiKTsKICAgIH0KICAgIGJvb2wgY29udGFpbnNVcHBlckNhc2UgPSBmYWxzZTsKICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGZpbmFsIGludCBjb2RlVW5pdCA9IHNjaGVtZS5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoIV9pc1NjaGVtZUNoYXJhY3Rlcihjb2RlVW5pdCkpIHsKICAgICAgICBfZmFpbChzY2hlbWUsIGksICJJbGxlZ2FsIHNjaGVtZSBjaGFyYWN0ZXIiKTsKICAgICAgfQogICAgICBpZiAoX1VQUEVSX0NBU0VfQSA8PSBjb2RlVW5pdCAmJiBjb2RlVW5pdCA8PSBfVVBQRVJfQ0FTRV9aKSB7CiAgICAgICAgY29udGFpbnNVcHBlckNhc2UgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBzY2hlbWUgPSBzY2hlbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgaWYgKGNvbnRhaW5zVXBwZXJDYXNlKSBzY2hlbWUgPSBzY2hlbWUudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiBfY2Fub25pY2FsaXplU2NoZW1lKHNjaGVtZSk7CiAgfQoKICAvLyBDYW5vbmljYWxpemUgYSBmZXcgb2Z0ZW4tdXNlZCBzY2hlbWUgc3RyaW5ncy4KICAvLwogIC8vIFRoaXMgaW1wcm92ZXMgbWVtb3J5IHVzYWdlIGFuZCBtYWtlcyBjb21wYXJpc29uIGZhc3Rlci4KICBzdGF0aWMgU3RyaW5nIF9jYW5vbmljYWxpemVTY2hlbWUoU3RyaW5nIHNjaGVtZSkgewogICAgaWYgKHNjaGVtZSA9PSAiaHR0cCIpIHJldHVybiAiaHR0cCI7CiAgICBpZiAoc2NoZW1lID09ICJmaWxlIikgcmV0dXJuICJmaWxlIjsKICAgIGlmIChzY2hlbWUgPT0gImh0dHBzIikgcmV0dXJuICJodHRwcyI7CiAgICBpZiAoc2NoZW1lID09ICJwYWNrYWdlIikgcmV0dXJuICJwYWNrYWdlIjsKICAgIHJldHVybiBzY2hlbWU7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9tYWtlVXNlckluZm8oU3RyaW5nIHVzZXJJbmZvLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgIGlmICh1c2VySW5mbyA9PSBudWxsKSByZXR1cm4gIiI7CiAgICByZXR1cm4gX25vcm1hbGl6ZU9yU3Vic3RyaW5nKHVzZXJJbmZvLCBzdGFydCwgZW5kLCBfdXNlcmluZm9UYWJsZSk7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9tYWtlUGF0aChTdHJpbmcgcGF0aCwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICBJdGVyYWJsZTxTdHJpbmc+IHBhdGhTZWdtZW50cywgU3RyaW5nIHNjaGVtZSwgYm9vbCBoYXNBdXRob3JpdHkpIHsKICAgIGJvb2wgaXNGaWxlID0gKHNjaGVtZSA9PSAiZmlsZSIpOwogICAgYm9vbCBlbnN1cmVMZWFkaW5nU2xhc2ggPSBpc0ZpbGUgfHwgaGFzQXV0aG9yaXR5OwogICAgaWYgKHBhdGggPT0gbnVsbCAmJiBwYXRoU2VnbWVudHMgPT0gbnVsbCkgcmV0dXJuIGlzRmlsZSA/ICIvIiA6ICIiOwogICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoU2VnbWVudHMgIT0gbnVsbCkgewogICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdCb3RoIHBhdGggYW5kIHBhdGhTZWdtZW50cyBzcGVjaWZpZWQnKTsKICAgIH0KICAgIFN0cmluZyByZXN1bHQ7CiAgICBpZiAocGF0aCAhPSBudWxsKSB7CiAgICAgIHJlc3VsdCA9IF9ub3JtYWxpemVPclN1YnN0cmluZyhwYXRoLCBzdGFydCwgZW5kLCBfcGF0aENoYXJPclNsYXNoVGFibGUsCiAgICAgICAgICBlc2NhcGVEZWxpbWl0ZXJzOiB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IHBhdGhTZWdtZW50cwogICAgICAgICAgLm1hcCgocykgPT4gX3VyaUVuY29kZShfcGF0aENoYXJUYWJsZSwgcywgdXRmOCwgZmFsc2UpKQogICAgICAgICAgLmpvaW4oIi8iKTsKICAgIH0KICAgIGlmIChyZXN1bHQuaXNFbXB0eSkgewogICAgICBpZiAoaXNGaWxlKSByZXR1cm4gIi8iOwogICAgfSBlbHNlIGlmIChlbnN1cmVMZWFkaW5nU2xhc2ggJiYgIXJlc3VsdC5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgcmVzdWx0ID0gIi8iICsgcmVzdWx0OwogICAgfQogICAgcmVzdWx0ID0gX25vcm1hbGl6ZVBhdGgocmVzdWx0LCBzY2hlbWUsIGhhc0F1dGhvcml0eSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8vIFBlcmZvcm1zIHBhdGggbm9ybWFsaXphdGlvbiAocmVtb3ZlIGRvdCBzZWdtZW50cykgb24gYSBwYXRoLgogIC8vLwogIC8vLyBJZiB0aGUgVVJJIGhhcyBuZWl0aGVyIHNjaGVtZSBub3IgYXV0aG9yaXR5LCBpdCdzIGNvbnNpZGVyZWQgYQogIC8vLyAicHVyZSBwYXRoIiBhbmQgbm9ybWFsaXphdGlvbiB3b24ndCByZW1vdmUgbGVhZGluZyAiLi4iIHNlZ21lbnRzLgogIC8vLyBPdGhlcndpc2UgaXQgZm9sbG93cyB0aGUgUkZDIDM5ODYgInJlbW92ZSBkb3Qgc2VnbWVudHMiIGFsZ29yaXRobS4KICBzdGF0aWMgU3RyaW5nIF9ub3JtYWxpemVQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgc2NoZW1lLCBib29sIGhhc0F1dGhvcml0eSkgewogICAgaWYgKHNjaGVtZS5pc0VtcHR5ICYmICFoYXNBdXRob3JpdHkgJiYgIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgIHJldHVybiBfbm9ybWFsaXplUmVsYXRpdmVQYXRoKHBhdGgsIHNjaGVtZS5pc05vdEVtcHR5IHx8IGhhc0F1dGhvcml0eSk7CiAgICB9CiAgICByZXR1cm4gX3JlbW92ZURvdFNlZ21lbnRzKHBhdGgpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfbWFrZVF1ZXJ5KFN0cmluZyBxdWVyeSwgaW50IHN0YXJ0LCBpbnQgZW5kLAogICAgICBNYXA8U3RyaW5nLCBkeW5hbWljIC8qU3RyaW5nfEl0ZXJhYmxlPFN0cmluZz4qLyA+IHF1ZXJ5UGFyYW1ldGVycykgewogICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignQm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZCcpOwogICAgICB9CiAgICAgIHJldHVybiBfbm9ybWFsaXplT3JTdWJzdHJpbmcocXVlcnksIHN0YXJ0LCBlbmQsIF9xdWVyeUNoYXJUYWJsZSwKICAgICAgICAgIGVzY2FwZURlbGltaXRlcnM6IHRydWUpOwogICAgfQogICAgaWYgKHF1ZXJ5UGFyYW1ldGVycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICB2YXIgcmVzdWx0ID0gU3RyaW5nQnVmZmVyKCk7CiAgICB2YXIgc2VwYXJhdG9yID0gIiI7CgogICAgdm9pZCB3cml0ZVBhcmFtZXRlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKICAgICAgcmVzdWx0LndyaXRlKHNlcGFyYXRvcik7CiAgICAgIHNlcGFyYXRvciA9ICImIjsKICAgICAgcmVzdWx0LndyaXRlKFVyaS5lbmNvZGVRdWVyeUNvbXBvbmVudChrZXkpKTsKICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuaXNOb3RFbXB0eSkgewogICAgICAgIHJlc3VsdC53cml0ZSgiPSIpOwogICAgICAgIHJlc3VsdC53cml0ZShVcmkuZW5jb2RlUXVlcnlDb21wb25lbnQodmFsdWUpKTsKICAgICAgfQogICAgfQoKICAgIHF1ZXJ5UGFyYW1ldGVycy5mb3JFYWNoKChrZXksIHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlIGlzIFN0cmluZykgewogICAgICAgIHdyaXRlUGFyYW1ldGVyKGtleSwgdmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIEl0ZXJhYmxlIHZhbHVlcyA9IHZhbHVlOwogICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIGluIHZhbHVlcykgewogICAgICAgICAgd3JpdGVQYXJhbWV0ZXIoa2V5LCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIHN0YXRpYyBTdHJpbmcgX21ha2VGcmFnbWVudChTdHJpbmcgZnJhZ21lbnQsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgaWYgKGZyYWdtZW50ID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIF9ub3JtYWxpemVPclN1YnN0cmluZyhmcmFnbWVudCwgc3RhcnQsIGVuZCwgX3F1ZXJ5Q2hhclRhYmxlLAogICAgICAgIGVzY2FwZURlbGltaXRlcnM6IHRydWUpOwogIH0KCiAgLyoqCiAgICogUGVyZm9ybXMgUkZDIDM5ODYgUGVyY2VudC1FbmNvZGluZyBOb3JtYWxpemF0aW9uLgogICAqCiAgICogUmV0dXJucyBhIHJlcGxhY2VtZW50IHN0cmluZyB0aGF0IHNob3VsZCBiZSByZXBsYWNlIHRoZSBvcmlnaW5hbCBlc2NhcGUuCiAgICogUmV0dXJucyBudWxsIGlmIG5vIHJlcGxhY2VtZW50IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBlc2NhcGUgaXMKICAgKiBub3QgZm9yIGFuIHVucmVzZXJ2ZWQgY2hhcmFjdGVyIGFuZCBpcyBhbHJlYWR5IG5vbi1sb3dlci1jYXNlLgogICAqCiAgICogUmV0dXJucyAiJSIgaWYgdGhlIGVzY2FwZSBpcyBpbnZhbGlkIChub3QgdHdvIHZhbGlkIGhleCBkaWdpdHMgZm9sbG93aW5nCiAgICogdGhlIHBlcmNlbnQgc2lnbikuIFRoZSBjYWxsaW5nIGNvZGUgc2hvdWxkIHJlcGxhY2UgdGhlIHBlcmNlbnQKICAgKiBzaWduIHdpdGggIiUyNSIsIGJ1dCBsZWF2ZSB0aGUgZm9sbG93aW5nIHR3byBjaGFyYWN0ZXJzIHVubW9kaWZpZWQuCiAgICoKICAgKiBJZiBbbG93ZXJDYXNlXSBpcyB0cnVlLCBhIHNpbmdsZSBjaGFyYWN0ZXIgcmV0dXJuZWQgaXMgYWx3YXlzIGxvd2VyIGNhc2UsCiAgICovCiAgc3RhdGljIFN0cmluZyBfbm9ybWFsaXplRXNjYXBlKFN0cmluZyBzb3VyY2UsIGludCBpbmRleCwgYm9vbCBsb3dlckNhc2UpIHsKICAgIGFzc2VydChzb3VyY2UuY29kZVVuaXRBdChpbmRleCkgPT0gX1BFUkNFTlQpOwogICAgaWYgKGluZGV4ICsgMiA+PSBzb3VyY2UubGVuZ3RoKSB7CiAgICAgIHJldHVybiAiJSI7IC8vIE1hcmtzIHRoZSBlc2NhcGUgYXMgaW52YWxpZC4KICAgIH0KICAgIGludCBmaXJzdERpZ2l0ID0gc291cmNlLmNvZGVVbml0QXQoaW5kZXggKyAxKTsKICAgIGludCBzZWNvbmREaWdpdCA9IHNvdXJjZS5jb2RlVW5pdEF0KGluZGV4ICsgMik7CiAgICBpbnQgZmlyc3REaWdpdFZhbHVlID0gaGV4RGlnaXRWYWx1ZShmaXJzdERpZ2l0KTsKICAgIGludCBzZWNvbmREaWdpdFZhbHVlID0gaGV4RGlnaXRWYWx1ZShzZWNvbmREaWdpdCk7CiAgICBpZiAoZmlyc3REaWdpdFZhbHVlIDwgMCB8fCBzZWNvbmREaWdpdFZhbHVlIDwgMCkgewogICAgICByZXR1cm4gIiUiOyAvLyBNYXJrcyB0aGUgZXNjYXBlIGFzIGludmFsaWQuCiAgICB9CiAgICBpbnQgdmFsdWUgPSBmaXJzdERpZ2l0VmFsdWUgKiAxNiArIHNlY29uZERpZ2l0VmFsdWU7CiAgICBpZiAoX2lzVW5yZXNlcnZlZENoYXIodmFsdWUpKSB7CiAgICAgIGlmIChsb3dlckNhc2UgJiYgX1VQUEVSX0NBU0VfQSA8PSB2YWx1ZSAmJiBfVVBQRVJfQ0FTRV9aID49IHZhbHVlKSB7CiAgICAgICAgdmFsdWUgfD0gMHgyMDsKICAgICAgfQogICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSk7CiAgICB9CiAgICBpZiAoZmlyc3REaWdpdCA+PSBfTE9XRVJfQ0FTRV9BIHx8IHNlY29uZERpZ2l0ID49IF9MT1dFUl9DQVNFX0EpIHsKICAgICAgLy8gRWl0aGVyIGRpZ2l0IGlzIGxvd2VyIGNhc2UuCiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDMpLnRvVXBwZXJDYXNlKCk7CiAgICB9CiAgICAvLyBFc2NhcGUgaXMgcmV0YWluZWQsIGFuZCBpcyBhbHJlYWR5IG5vbi1sb3dlciBjYXNlLCBzbyByZXR1cm4gbnVsbCB0bwogICAgLy8gcmVwcmVzZW50ICJubyByZXBsYWNlbWVudCBuZWNlc3NhcnkiLgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBzdGF0aWMgU3RyaW5nIF9lc2NhcGVDaGFyKGludCBjaGFyKSB7CiAgICBhc3NlcnQoY2hhciA8PSAweDEwZmZmZik7IC8vIEl0J3MgYSB2YWxpZCB1bmljb2RlIGNvZGUgcG9pbnQuCiAgICBMaXN0PGludD4gY29kZVVuaXRzOwogICAgaWYgKGNoYXIgPCAweDgwKSB7CiAgICAgIC8vIEFTQ0lJLCBhIHNpbmdsZSBwZXJjZW50IGVuY29kZWQgc2VxdWVuY2UuCiAgICAgIGNvZGVVbml0cyA9IExpc3QoMyk7CiAgICAgIGNvZGVVbml0c1swXSA9IF9QRVJDRU5UOwogICAgICBjb2RlVW5pdHNbMV0gPSBfaGV4RGlnaXRzLmNvZGVVbml0QXQoY2hhciA+PiA0KTsKICAgICAgY29kZVVuaXRzWzJdID0gX2hleERpZ2l0cy5jb2RlVW5pdEF0KGNoYXIgJiAweGYpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRG8gVVRGLTggZW5jb2Rpbmcgb2YgY2hhcmFjdGVyLCB0aGVuIHBlcmNlbnQgZW5jb2RlIGJ5dGVzLgogICAgICBpbnQgZmxhZyA9IDB4YzA7IC8vIFRoZSBoaWdoLWJpdCBtYXJrZXJzIG9uIHRoZSBmaXJzdCBieXRlIG9mIFVURi04LgogICAgICBpbnQgZW5jb2RlZEJ5dGVzID0gMjsKICAgICAgaWYgKGNoYXIgPiAweDdmZikgewogICAgICAgIGZsYWcgPSAweGUwOwogICAgICAgIGVuY29kZWRCeXRlcyA9IDM7CiAgICAgICAgaWYgKGNoYXIgPiAweGZmZmYpIHsKICAgICAgICAgIGVuY29kZWRCeXRlcyA9IDQ7CiAgICAgICAgICBmbGFnID0gMHhmMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29kZVVuaXRzID0gTGlzdCgzICogZW5jb2RlZEJ5dGVzKTsKICAgICAgaW50IGluZGV4ID0gMDsKICAgICAgd2hpbGUgKC0tZW5jb2RlZEJ5dGVzID49IDApIHsKICAgICAgICBpbnQgYnl0ZSA9ICgoY2hhciA+PiAoNiAqIGVuY29kZWRCeXRlcykpICYgMHgzZikgfCBmbGFnOwogICAgICAgIGNvZGVVbml0c1tpbmRleF0gPSBfUEVSQ0VOVDsKICAgICAgICBjb2RlVW5pdHNbaW5kZXggKyAxXSA9IF9oZXhEaWdpdHMuY29kZVVuaXRBdChieXRlID4+IDQpOwogICAgICAgIGNvZGVVbml0c1tpbmRleCArIDJdID0gX2hleERpZ2l0cy5jb2RlVW5pdEF0KGJ5dGUgJiAweGYpOwogICAgICAgIGluZGV4ICs9IDM7CiAgICAgICAgZmxhZyA9IDB4ODA7IC8vIEZvbGxvd2luZyBieXRlcyBoYXZlIG9ubHkgaGlnaCBiaXQgc2V0LgogICAgICB9CiAgICB9CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZVVuaXRzKTsKICB9CgogIC8qKgogICAqIE5vcm1hbGl6ZXMgdXNpbmcgW19ub3JtYWxpemVdIG9yIHJldHVybnMgc3Vic3RyaW5nIG9mIG9yaWdpbmFsLgogICAqCiAgICogSWYgW19ub3JtYWxpemVdIHJldHVybnMgYG51bGxgIChvcmlnaW5hbCBjb250ZW50IGlzIGFscmVhZHkgbm9ybWFsaXplZCksCiAgICogdGhpcyBtZXRob2RzIHJldHVybnMgdGhlIHN1YnN0cmluZyBpZiBbY29tcG9uZW50XSBmcm9tIFtzdGFydF0gdG8gW2VuZF0uCiAgICovCiAgc3RhdGljIFN0cmluZyBfbm9ybWFsaXplT3JTdWJzdHJpbmcoCiAgICAgIFN0cmluZyBjb21wb25lbnQsIGludCBzdGFydCwgaW50IGVuZCwgTGlzdDxpbnQ+IGNoYXJUYWJsZSwKICAgICAge2Jvb2wgZXNjYXBlRGVsaW1pdGVycyA9IGZhbHNlfSkgewogICAgcmV0dXJuIF9ub3JtYWxpemUoY29tcG9uZW50LCBzdGFydCwgZW5kLCBjaGFyVGFibGUsCiAgICAgICAgICAgIGVzY2FwZURlbGltaXRlcnM6IGVzY2FwZURlbGltaXRlcnMpID8/CiAgICAgICAgY29tcG9uZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKICB9CgogIC8qKgogICAqIFJ1bnMgdGhyb3VnaCBjb21wb25lbnQgY2hlY2tpbmcgdGhhdCBlYWNoIGNoYXJhY3RlciBpcyB2YWxpZCBhbmQKICAgKiBub3JtYWxpemUgcGVyY2VudCBlc2NhcGVzLgogICAqCiAgICogVXNlcyBbY2hhclRhYmxlXSB0byBjaGVjayBpZiBhIG5vbi1gJWAgY2hhcmFjdGVyIGlzIGFsbG93ZWQuCiAgICogRWFjaCBgJWAgY2hhcmFjdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMuCiAgICogSWYgdGhlIGhleC1kaWdpdHMgYXJlIGxvd2VyIGNhc2UgbGV0dGVycywgdGhleSBhcmUgY29udmVydGVkIHRvCiAgICogdXBwZXIgY2FzZS4KICAgKgogICAqIFJldHVybnMgYG51bGxgIGlmIHRoZSBvcmlnaW5hbCBjb250ZW50IHdhcyBhbHJlYWR5IG5vcm1hbGl6ZWQuCiAgICovCiAgc3RhdGljIFN0cmluZyBfbm9ybWFsaXplKAogICAgICBTdHJpbmcgY29tcG9uZW50LCBpbnQgc3RhcnQsIGludCBlbmQsIExpc3Q8aW50PiBjaGFyVGFibGUsCiAgICAgIHtib29sIGVzY2FwZURlbGltaXRlcnMgPSBmYWxzZX0pIHsKICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7CiAgICBpbnQgc2VjdGlvblN0YXJ0ID0gc3RhcnQ7CiAgICBpbnQgaW5kZXggPSBzdGFydDsKICAgIC8vIExvb3Agd2hpbGUgY2hhcmFjdGVycyBhcmUgdmFsaWQgYW5kIGVzY2FwZXMgY29ycmVjdCBhbmQgdXBwZXItY2FzZS4KICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewogICAgICBpbnQgY2hhciA9IGNvbXBvbmVudC5jb2RlVW5pdEF0KGluZGV4KTsKICAgICAgaWYgKGNoYXIgPCAxMjcgJiYgKGNoYXJUYWJsZVtjaGFyID4+IDRdICYgKDEgPDwgKGNoYXIgJiAweDBmKSkpICE9IDApIHsKICAgICAgICBpbmRleCsrOwogICAgICB9IGVsc2UgewogICAgICAgIFN0cmluZyByZXBsYWNlbWVudDsKICAgICAgICBpbnQgc291cmNlTGVuZ3RoOwogICAgICAgIGlmIChjaGFyID09IF9QRVJDRU5UKSB7CiAgICAgICAgICByZXBsYWNlbWVudCA9IF9ub3JtYWxpemVFc2NhcGUoY29tcG9uZW50LCBpbmRleCwgZmFsc2UpOwogICAgICAgICAgLy8gUmV0dXJucyBudWxsIGlmIHdlIHNob3VsZCBrZWVwIHRoZSBleGlzdGluZyBlc2NhcGUuCiAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICBpbmRleCArPSAzOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJldHVybnMgIiUiIGlmIHdlIHNob3VsZCBlc2NhcGUgdGhlIGV4aXN0aW5nIHBlcmNlbnQuCiAgICAgICAgICBpZiAoIiUiID09IHJlcGxhY2VtZW50KSB7CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIiUyNSI7CiAgICAgICAgICAgIHNvdXJjZUxlbmd0aCA9IDE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzb3VyY2VMZW5ndGggPSAzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWVzY2FwZURlbGltaXRlcnMgJiYgX2lzR2VuZXJhbERlbGltaXRlcihjaGFyKSkgewogICAgICAgICAgX2ZhaWwoY29tcG9uZW50LCBpbmRleCwgIkludmFsaWQgY2hhcmFjdGVyIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNvdXJjZUxlbmd0aCA9IDE7CiAgICAgICAgICBpZiAoKGNoYXIgJiAweEZDMDApID09IDB4RDgwMCkgewogICAgICAgICAgICAvLyBQb3NzaWJsZSBsZWFkIHN1cnJvZ2F0ZS4KICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGVuZCkgewogICAgICAgICAgICAgIGludCB0YWlsID0gY29tcG9uZW50LmNvZGVVbml0QXQoaW5kZXggKyAxKTsKICAgICAgICAgICAgICBpZiAoKHRhaWwgJiAweEZDMDApID09IDB4REMwMCkgewogICAgICAgICAgICAgICAgLy8gVGFpbCBzdXJyb2dhdGUuCiAgICAgICAgICAgICAgICBzb3VyY2VMZW5ndGggPSAyOwogICAgICAgICAgICAgICAgY2hhciA9IDB4MTAwMDAgfCAoKGNoYXIgJiAweDNmZikgPDwgMTApIHwgKHRhaWwgJiAweDNmZik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXBsYWNlbWVudCA9IF9lc2NhcGVDaGFyKGNoYXIpOwogICAgICAgIH0KICAgICAgICBidWZmZXIgPz89IFN0cmluZ0J1ZmZlcigpOwogICAgICAgIGJ1ZmZlci53cml0ZShjb21wb25lbnQuc3Vic3RyaW5nKHNlY3Rpb25TdGFydCwgaW5kZXgpKTsKICAgICAgICBidWZmZXIud3JpdGUocmVwbGFjZW1lbnQpOwogICAgICAgIGluZGV4ICs9IHNvdXJjZUxlbmd0aDsKICAgICAgICBzZWN0aW9uU3RhcnQgPSBpbmRleDsKICAgICAgfQogICAgfQogICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHNlY3Rpb25TdGFydCA8IGVuZCkgewogICAgICBidWZmZXIud3JpdGUoY29tcG9uZW50LnN1YnN0cmluZyhzZWN0aW9uU3RhcnQsIGVuZCkpOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzU2NoZW1lQ2hhcmFjdGVyKGludCBjaCkgewogICAgcmV0dXJuIGNoIDwgMTI4ICYmICgoX3NjaGVtZVRhYmxlW2NoID4+IDRdICYgKDEgPDwgKGNoICYgMHgwZikpKSAhPSAwKTsKICB9CgogIHN0YXRpYyBib29sIF9pc0dlbmVyYWxEZWxpbWl0ZXIoaW50IGNoKSB7CiAgICByZXR1cm4gY2ggPD0gX1JJR0hUX0JSQUNLRVQgJiYKICAgICAgICAoKF9nZW5EZWxpbWl0ZXJzVGFibGVbY2ggPj4gNF0gJiAoMSA8PCAoY2ggJiAweDBmKSkpICE9IDApOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBVUkkgaXMgYWJzb2x1dGUuCiAgICovCiAgYm9vbCBnZXQgaXNBYnNvbHV0ZSA9PiBzY2hlbWUgIT0gIiIgJiYgZnJhZ21lbnQgPT0gIiI7CgogIFN0cmluZyBfbWVyZ2VQYXRocyhTdHJpbmcgYmFzZSwgU3RyaW5nIHJlZmVyZW5jZSkgewogICAgLy8gT3B0aW1pemUgZm9yIHRoZSBjYXNlOiBhYnNvbHV0ZSBiYXNlLCByZWZlcmVuY2UgYmVnaW5uaW5nIHdpdGggIi4uLyIuCiAgICBpbnQgYmFja0NvdW50ID0gMDsKICAgIGludCByZWZTdGFydCA9IDA7CiAgICAvLyBDb3VudCBudW1iZXIgb2YgIi4uLyIgYXQgYmVnaW5uaW5nIG9mIHJlZmVyZW5jZS4KICAgIHdoaWxlIChyZWZlcmVuY2Uuc3RhcnRzV2l0aCgiLi4vIiwgcmVmU3RhcnQpKSB7CiAgICAgIHJlZlN0YXJ0ICs9IDM7CiAgICAgIGJhY2tDb3VudCsrOwogICAgfQoKICAgIC8vIERyb3AgbGFzdCBzZWdtZW50IC0gZXZlcnl0aGluZyBhZnRlciBsYXN0ICcvJyBvZiBiYXNlLgogICAgaW50IGJhc2VFbmQgPSBiYXNlLmxhc3RJbmRleE9mKCcvJyk7CiAgICAvLyBEcm9wIGV4dHJhIHNlZ21lbnRzIGZvciBlYWNoIGxlYWRpbmcgIi4uLyIgb2YgcmVmZXJlbmNlLgogICAgd2hpbGUgKGJhc2VFbmQgPiAwICYmIGJhY2tDb3VudCA+IDApIHsKICAgICAgaW50IG5ld0VuZCA9IGJhc2UubGFzdEluZGV4T2YoJy8nLCBiYXNlRW5kIC0gMSk7CiAgICAgIGlmIChuZXdFbmQgPCAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaW50IGRlbHRhID0gYmFzZUVuZCAtIG5ld0VuZDsKICAgICAgLy8gSWYgd2Ugc2VlIGEgIi4iIG9yICIuLiIgc2VnbWVudCBpbiBiYXNlLCBzdG9wIGhlcmUgYW5kIGxldAogICAgICAvLyBfcmVtb3ZlRG90U2VnbWVudHMgaGFuZGxlIGl0LgogICAgICBpZiAoKGRlbHRhID09IDIgfHwgZGVsdGEgPT0gMykgJiYKICAgICAgICAgIGJhc2UuY29kZVVuaXRBdChuZXdFbmQgKyAxKSA9PSBfRE9UICYmCiAgICAgICAgICAoZGVsdGEgPT0gMiB8fCBiYXNlLmNvZGVVbml0QXQobmV3RW5kICsgMikgPT0gX0RPVCkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBiYXNlRW5kID0gbmV3RW5kOwogICAgICBiYWNrQ291bnQtLTsKICAgIH0KICAgIHJldHVybiBiYXNlLnJlcGxhY2VSYW5nZSgKICAgICAgICBiYXNlRW5kICsgMSwgbnVsbCwgcmVmZXJlbmNlLnN1YnN0cmluZyhyZWZTdGFydCAtIDMgKiBiYWNrQ291bnQpKTsKICB9CgogIC8vLyBNYWtlIGEgZ3Vlc3MgYXQgd2hldGhlciBhIHBhdGggY29udGFpbnMgYSBgLi5gIG9yIGAuYCBzZWdtZW50LgogIC8vLwogIC8vLyBUaGlzIGlzIGEgcHJpbWl0aXZlIHRlc3QgdGhhdCBjYW4gY2F1c2UgZmFsc2UgcG9zaXRpdmVzLgogIC8vLyBJdCdzIG9ubHkgdXNlZCB0byBhdm9pZCBhIG1vcmUgZXhwZW5zaXZlIG9wZXJhdGlvbiBpbiB0aGUgY2FzZSB3aGVyZQogIC8vLyBpdCdzIG5vdCBuZWNlc3NhcnkuCiAgc3RhdGljIGJvb2wgX21heUNvbnRhaW5Eb3RTZWdtZW50cyhTdHJpbmcgcGF0aCkgewogICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnLicpKSByZXR1cm4gdHJ1ZTsKICAgIGludCBpbmRleCA9IHBhdGguaW5kZXhPZigiLy4iKTsKICAgIHJldHVybiBpbmRleCAhPSAtMTsKICB9CgogIC8vLyBSZW1vdmVzICcuJyBhbmQgJy4uJyBzZWdtZW50cyBmcm9tIGEgcGF0aC4KICAvLy8KICAvLy8gRm9sbG93cyB0aGUgUkZDIDI5ODYgInJlbW92ZSBkb3Qgc2VnbWVudHMiIGFsZ29yaXRobS4KICAvLy8gVGhpcyBhbGdvcml0aG0gaXMgb25seSB1c2VkIG9uIHBhdGhzIG9mIFVSSXMgd2l0aCBhIHNjaGVtZSwKICAvLy8gYW5kIGl0IHRyZWF0cyB0aGUgcGF0aCBhcyBpZiBpdCBpcyBhYnNvbHV0ZSAobGVhZGluZyAnLi4nIGFyZSByZW1vdmVkKS4KICBzdGF0aWMgU3RyaW5nIF9yZW1vdmVEb3RTZWdtZW50cyhTdHJpbmcgcGF0aCkgewogICAgaWYgKCFfbWF5Q29udGFpbkRvdFNlZ21lbnRzKHBhdGgpKSByZXR1cm4gcGF0aDsKICAgIGFzc2VydChwYXRoLmlzTm90RW1wdHkpOyAvLyBBbiBlbXB0eSBwYXRoIHdvdWxkIG5vdCBoYXZlIGRvdCBzZWdtZW50cy4KICAgIExpc3Q8U3RyaW5nPiBvdXRwdXQgPSBbXTsKICAgIGJvb2wgYXBwZW5kU2xhc2ggPSBmYWxzZTsKICAgIGZvciAoU3RyaW5nIHNlZ21lbnQgaW4gcGF0aC5zcGxpdCgiLyIpKSB7CiAgICAgIGFwcGVuZFNsYXNoID0gZmFsc2U7CiAgICAgIGlmIChzZWdtZW50ID09ICIuLiIpIHsKICAgICAgICBpZiAob3V0cHV0LmlzTm90RW1wdHkpIHsKICAgICAgICAgIG91dHB1dC5yZW1vdmVMYXN0KCk7CiAgICAgICAgICBpZiAob3V0cHV0LmlzRW1wdHkpIHsKICAgICAgICAgICAgb3V0cHV0LmFkZCgiIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFwcGVuZFNsYXNoID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICgiLiIgPT0gc2VnbWVudCkgewogICAgICAgIGFwcGVuZFNsYXNoID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdXRwdXQuYWRkKHNlZ21lbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAoYXBwZW5kU2xhc2gpIG91dHB1dC5hZGQoIiIpOwogICAgcmV0dXJuIG91dHB1dC5qb2luKCIvIik7CiAgfQoKICAvLy8gUmVtb3ZlcyBhbGwgYC5gIHNlZ21lbnRzIGFuZCBhbnkgbm9uLWxlYWRpbmcgYC4uYCBzZWdtZW50cy4KICAvLy8KICAvLy8gSWYgdGhlIHBhdGggc3RhcnRzIHdpdGggc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIHNjaGVtZSwKICAvLy8gYW5kIFthbGxvd1NjaGVtZV0gaXMgZmFsc2UsIHRoZSBjb2xvbiBpcyBlc2NhcGVkLgogIC8vLwogIC8vLyBSZW1vdmluZyB0aGUgIi4uIiBmcm9tIGEgImJhci9mb28vLi4iIHNlcXVlbmNlIHJlc3VsdHMgaW4gImJhci8iCiAgLy8vICh0cmFpbGluZyAiLyIpLiBJZiB0aGUgZW50aXJlIHBhdGggaXMgcmVtb3ZlZCAoYmVjYXVzZSBpdCBjb250YWlucyBhcwogIC8vLyBtYW55ICIuLiIgc2VnbWVudHMgYXMgcmVhbCBzZWdtZW50cyksIHRoZSByZXN1bHQgaXMgIi4vIi4KICAvLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhbiBlbXB0eSBzdHJpbmcsIHdoaWNoIHJlcHJlc2VudHMgIm5vIHBhdGgiLAogIC8vLyB3aGVuIHlvdSByZXNvbHZlIGl0IGFnYWluc3QgYSBiYXNlIFVSSSB3aXRoIGEgcGF0aCB3aXRoIGEgbm9uLWVtcHR5CiAgLy8vIGZpbmFsIHNlZ21lbnQuCiAgc3RhdGljIFN0cmluZyBfbm9ybWFsaXplUmVsYXRpdmVQYXRoKFN0cmluZyBwYXRoLCBib29sIGFsbG93U2NoZW1lKSB7CiAgICBhc3NlcnQoIXBhdGguc3RhcnRzV2l0aCgnLycpKTsgLy8gT25seSBnZXQgY2FsbGVkIGZvciByZWxhdGl2ZSBwYXRocy4KICAgIGlmICghX21heUNvbnRhaW5Eb3RTZWdtZW50cyhwYXRoKSkgewogICAgICBpZiAoIWFsbG93U2NoZW1lKSBwYXRoID0gX2VzY2FwZVNjaGVtZShwYXRoKTsKICAgICAgcmV0dXJuIHBhdGg7CiAgICB9CiAgICBhc3NlcnQocGF0aC5pc05vdEVtcHR5KTsgLy8gQW4gZW1wdHkgcGF0aCB3b3VsZCBub3QgaGF2ZSBkb3Qgc2VnbWVudHMuCiAgICBMaXN0PFN0cmluZz4gb3V0cHV0ID0gW107CiAgICBib29sIGFwcGVuZFNsYXNoID0gZmFsc2U7CiAgICBmb3IgKFN0cmluZyBzZWdtZW50IGluIHBhdGguc3BsaXQoIi8iKSkgewogICAgICBhcHBlbmRTbGFzaCA9IGZhbHNlOwogICAgICBpZiAoIi4uIiA9PSBzZWdtZW50KSB7CiAgICAgICAgaWYgKCFvdXRwdXQuaXNFbXB0eSAmJiBvdXRwdXQubGFzdCAhPSAiLi4iKSB7CiAgICAgICAgICBvdXRwdXQucmVtb3ZlTGFzdCgpOwogICAgICAgICAgYXBwZW5kU2xhc2ggPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXRwdXQuYWRkKCIuLiIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICgiLiIgPT0gc2VnbWVudCkgewogICAgICAgIGFwcGVuZFNsYXNoID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdXRwdXQuYWRkKHNlZ21lbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAob3V0cHV0LmlzRW1wdHkgfHwgKG91dHB1dC5sZW5ndGggPT0gMSAmJiBvdXRwdXRbMF0uaXNFbXB0eSkpIHsKICAgICAgcmV0dXJuICIuLyI7CiAgICB9CiAgICBpZiAoYXBwZW5kU2xhc2ggfHwgb3V0cHV0Lmxhc3QgPT0gJy4uJykgb3V0cHV0LmFkZCgiIik7CiAgICBpZiAoIWFsbG93U2NoZW1lKSBvdXRwdXRbMF0gPSBfZXNjYXBlU2NoZW1lKG91dHB1dFswXSk7CiAgICByZXR1cm4gb3V0cHV0LmpvaW4oIi8iKTsKICB9CgogIC8vLyBJZiBbcGF0aF0gc3RhcnRzIHdpdGggYSB2YWxpZCBzY2hlbWUsIGVzY2FwZSB0aGUgcGVyY2VudC4KICBzdGF0aWMgU3RyaW5nIF9lc2NhcGVTY2hlbWUoU3RyaW5nIHBhdGgpIHsKICAgIGlmIChwYXRoLmxlbmd0aCA+PSAyICYmIF9pc0FscGhhYmV0aWNDaGFyYWN0ZXIocGF0aC5jb2RlVW5pdEF0KDApKSkgewogICAgICBmb3IgKGludCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBpbnQgY2hhciA9IHBhdGguY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY2hhciA9PSBfQ09MT04pIHsKICAgICAgICAgIHJldHVybiAiJHtwYXRoLnN1YnN0cmluZygwLCBpKX0lM0Eke3BhdGguc3Vic3RyaW5nKGkgKyAxKX0iOwogICAgICAgIH0KICAgICAgICBpZiAoY2hhciA+IDEyNyB8fAogICAgICAgICAgICAoKF9zY2hlbWVUYWJsZVtjaGFyID4+IDRdICYgKDEgPDwgKGNoYXIgJiAweDBmKSkpID09IDApKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXRoOwogIH0KCiAgVXJpIHJlc29sdmUoU3RyaW5nIHJlZmVyZW5jZSkgewogICAgcmV0dXJuIHJlc29sdmVVcmkoVXJpLnBhcnNlKHJlZmVyZW5jZSkpOwogIH0KCiAgVXJpIHJlc29sdmVVcmkoVXJpIHJlZmVyZW5jZSkgewogICAgLy8gRnJvbSBSRkMgMzk4Ni4KICAgIFN0cmluZyB0YXJnZXRTY2hlbWU7CiAgICBTdHJpbmcgdGFyZ2V0VXNlckluZm8gPSAiIjsKICAgIFN0cmluZyB0YXJnZXRIb3N0OwogICAgaW50IHRhcmdldFBvcnQ7CiAgICBTdHJpbmcgdGFyZ2V0UGF0aDsKICAgIFN0cmluZyB0YXJnZXRRdWVyeTsKICAgIGlmIChyZWZlcmVuY2Uuc2NoZW1lLmlzTm90RW1wdHkpIHsKICAgICAgdGFyZ2V0U2NoZW1lID0gcmVmZXJlbmNlLnNjaGVtZTsKICAgICAgaWYgKHJlZmVyZW5jZS5oYXNBdXRob3JpdHkpIHsKICAgICAgICB0YXJnZXRVc2VySW5mbyA9IHJlZmVyZW5jZS51c2VySW5mbzsKICAgICAgICB0YXJnZXRIb3N0ID0gcmVmZXJlbmNlLmhvc3Q7CiAgICAgICAgdGFyZ2V0UG9ydCA9IHJlZmVyZW5jZS5oYXNQb3J0ID8gcmVmZXJlbmNlLnBvcnQgOiBudWxsOwogICAgICB9CiAgICAgIHRhcmdldFBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHMocmVmZXJlbmNlLnBhdGgpOwogICAgICBpZiAocmVmZXJlbmNlLmhhc1F1ZXJ5KSB7CiAgICAgICAgdGFyZ2V0UXVlcnkgPSByZWZlcmVuY2UucXVlcnk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldFNjaGVtZSA9IHRoaXMuc2NoZW1lOwogICAgICBpZiAocmVmZXJlbmNlLmhhc0F1dGhvcml0eSkgewogICAgICAgIHRhcmdldFVzZXJJbmZvID0gcmVmZXJlbmNlLnVzZXJJbmZvOwogICAgICAgIHRhcmdldEhvc3QgPSByZWZlcmVuY2UuaG9zdDsKICAgICAgICB0YXJnZXRQb3J0ID0KICAgICAgICAgICAgX21ha2VQb3J0KHJlZmVyZW5jZS5oYXNQb3J0ID8gcmVmZXJlbmNlLnBvcnQgOiBudWxsLCB0YXJnZXRTY2hlbWUpOwogICAgICAgIHRhcmdldFBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHMocmVmZXJlbmNlLnBhdGgpOwogICAgICAgIGlmIChyZWZlcmVuY2UuaGFzUXVlcnkpIHRhcmdldFF1ZXJ5ID0gcmVmZXJlbmNlLnF1ZXJ5OwogICAgICB9IGVsc2UgewogICAgICAgIHRhcmdldFVzZXJJbmZvID0gdGhpcy5fdXNlckluZm87CiAgICAgICAgdGFyZ2V0SG9zdCA9IHRoaXMuX2hvc3Q7CiAgICAgICAgdGFyZ2V0UG9ydCA9IHRoaXMuX3BvcnQ7CiAgICAgICAgaWYgKHJlZmVyZW5jZS5wYXRoID09ICIiKSB7CiAgICAgICAgICB0YXJnZXRQYXRoID0gdGhpcy5wYXRoOwogICAgICAgICAgaWYgKHJlZmVyZW5jZS5oYXNRdWVyeSkgewogICAgICAgICAgICB0YXJnZXRRdWVyeSA9IHJlZmVyZW5jZS5xdWVyeTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRhcmdldFF1ZXJ5ID0gdGhpcy5fcXVlcnk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChyZWZlcmVuY2UuaGFzQWJzb2x1dGVQYXRoKSB7CiAgICAgICAgICAgIHRhcmdldFBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHMocmVmZXJlbmNlLnBhdGgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgUkZDIDM5ODYgYmVoYXZpb3IgZm9yIG1lcmdpbmcuCiAgICAgICAgICAgIGlmICh0aGlzLmhhc0VtcHR5UGF0aCkgewogICAgICAgICAgICAgIGlmICghdGhpcy5oYXNBdXRob3JpdHkpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNTY2hlbWUpIHsKICAgICAgICAgICAgICAgICAgLy8gS2VlcCB0aGUgcGF0aCByZWxhdGl2ZSBpZiBubyBzY2hlbWUgb3IgYXV0aG9yaXR5LgogICAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gcmVmZXJlbmNlLnBhdGg7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGVhZGluZyBkb3Qtc2VnbWVudHMgaWYgdGhlIHBhdGggaXMgcHV0CiAgICAgICAgICAgICAgICAgIC8vIGJlbmVhdGggYSBzY2hlbWUuCiAgICAgICAgICAgICAgICAgIHRhcmdldFBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHMocmVmZXJlbmNlLnBhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBSRkMgYWxnb3JpdGhtIGZvciBiYXNlIHdpdGggYXV0aG9yaXR5IGFuZCBlbXB0eSBwYXRoLgogICAgICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IF9yZW1vdmVEb3RTZWdtZW50cygiLyIgKyByZWZlcmVuY2UucGF0aCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBtZXJnZWRQYXRoID0gX21lcmdlUGF0aHModGhpcy5wYXRoLCByZWZlcmVuY2UucGF0aCk7CiAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzU2NoZW1lIHx8IHRoaXMuaGFzQXV0aG9yaXR5IHx8IHRoaXMuaGFzQWJzb2x1dGVQYXRoKSB7CiAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKG1lcmdlZFBhdGgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBOb24tUkZDIDM5ODYgYmVoYXZpb3IuCiAgICAgICAgICAgICAgICAvLyBJZiBib3RoIGJhc2UgYW5kIHJlZmVyZW5jZSBhcmUgcmVsYXRpdmUgcGF0aHMsCiAgICAgICAgICAgICAgICAvLyBhbGxvdyB0aGUgbWVyZ2VkIHBhdGggdG8gc3RhcnQgd2l0aCAiLi4iLgogICAgICAgICAgICAgICAgLy8gVGhlIFJGQyBvbmx5IHNwZWNpZmllcyB0aGUgY2FzZSB3aGVyZSB0aGUgYmFzZSBoYXMgYSBzY2hlbWUuCiAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gX25vcm1hbGl6ZVJlbGF0aXZlUGF0aCgKICAgICAgICAgICAgICAgICAgICBtZXJnZWRQYXRoLCB0aGlzLmhhc1NjaGVtZSB8fCB0aGlzLmhhc0F1dGhvcml0eSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVmZXJlbmNlLmhhc1F1ZXJ5KSB0YXJnZXRRdWVyeSA9IHJlZmVyZW5jZS5xdWVyeTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIFN0cmluZyBmcmFnbWVudCA9IHJlZmVyZW5jZS5oYXNGcmFnbWVudCA/IHJlZmVyZW5jZS5mcmFnbWVudCA6IG51bGw7CiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwodGFyZ2V0U2NoZW1lLCB0YXJnZXRVc2VySW5mbywgdGFyZ2V0SG9zdCwgdGFyZ2V0UG9ydCwKICAgICAgICB0YXJnZXRQYXRoLCB0YXJnZXRRdWVyeSwgZnJhZ21lbnQpOwogIH0KCiAgYm9vbCBnZXQgaGFzU2NoZW1lID0+IHNjaGVtZS5pc05vdEVtcHR5OwoKICBib29sIGdldCBoYXNBdXRob3JpdHkgPT4gX2hvc3QgIT0gbnVsbDsKCiAgYm9vbCBnZXQgaGFzUG9ydCA9PiBfcG9ydCAhPSBudWxsOwoKICBib29sIGdldCBoYXNRdWVyeSA9PiBfcXVlcnkgIT0gbnVsbDsKCiAgYm9vbCBnZXQgaGFzRnJhZ21lbnQgPT4gX2ZyYWdtZW50ICE9IG51bGw7CgogIGJvb2wgZ2V0IGhhc0VtcHR5UGF0aCA9PiBwYXRoLmlzRW1wdHk7CgogIGJvb2wgZ2V0IGhhc0Fic29sdXRlUGF0aCA9PiBwYXRoLnN0YXJ0c1dpdGgoJy8nKTsKCiAgU3RyaW5nIGdldCBvcmlnaW4gewogICAgaWYgKHNjaGVtZSA9PSAiIikgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKCJDYW5ub3QgdXNlIG9yaWdpbiB3aXRob3V0IGEgc2NoZW1lOiAkdGhpcyIpOwogICAgfQogICAgaWYgKHNjaGVtZSAhPSAiaHR0cCIgJiYgc2NoZW1lICE9ICJodHRwcyIpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigKICAgICAgICAgICJPcmlnaW4gaXMgb25seSBhcHBsaWNhYmxlIHNjaGVtZXMgaHR0cCBhbmQgaHR0cHM6ICR0aGlzIik7CiAgICB9CiAgICBpZiAoX2hvc3QgPT0gbnVsbCB8fCBfaG9zdCA9PSAiIikgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKAogICAgICAgICAgIkEgJHNjaGVtZTogVVJJIHNob3VsZCBoYXZlIGEgbm9uLWVtcHR5IGhvc3QgbmFtZTogJHRoaXMiKTsKICAgIH0KICAgIGlmIChfcG9ydCA9PSBudWxsKSByZXR1cm4gIiRzY2hlbWU6Ly8kX2hvc3QiOwogICAgcmV0dXJuICIkc2NoZW1lOi8vJF9ob3N0OiRfcG9ydCI7CiAgfQoKICBTdHJpbmcgdG9GaWxlUGF0aCh7Ym9vbCB3aW5kb3dzfSkgewogICAgaWYgKHNjaGVtZSAhPSAiIiAmJiBzY2hlbWUgIT0gImZpbGUiKSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAkc2NoZW1lIFVSSSIpOwogICAgfQogICAgaWYgKHF1ZXJ5ICE9ICIiKSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoCiAgICAgICAgICAiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50Iik7CiAgICB9CiAgICBpZiAoZnJhZ21lbnQgIT0gIiIpIHsKICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBmcmFnbWVudCBjb21wb25lbnQiKTsKICAgIH0KICAgIHdpbmRvd3MgPz89IF9pc1dpbmRvd3M7CiAgICByZXR1cm4gd2luZG93cyA/IF90b1dpbmRvd3NGaWxlUGF0aCh0aGlzKSA6IF90b0ZpbGVQYXRoKCk7CiAgfQoKICBTdHJpbmcgX3RvRmlsZVBhdGgoKSB7CiAgICBpZiAoaGFzQXV0aG9yaXR5ICYmIGhvc3QgIT0gIiIpIHsKICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJDYW5ub3QgZXh0cmFjdCBhIG5vbi1XaW5kb3dzIGZpbGUgcGF0aCBmcm9tIGEgZmlsZSBVUkkgIgogICAgICAgICAgIndpdGggYW4gYXV0aG9yaXR5Iik7CiAgICB9CiAgICAvLyBVc2UgcGF0aCBzZWdtZW50cyB0byBoYXZlIGFueSBlc2NhcGVzIHVuZXNjYXBlZC4KICAgIHZhciBwYXRoU2VnbWVudHMgPSB0aGlzLnBhdGhTZWdtZW50czsKICAgIF9jaGVja05vbldpbmRvd3NQYXRoUmVzZXJ2ZWRDaGFyYWN0ZXJzKHBhdGhTZWdtZW50cywgZmFsc2UpOwogICAgdmFyIHJlc3VsdCA9IFN0cmluZ0J1ZmZlcigpOwogICAgaWYgKGhhc0Fic29sdXRlUGF0aCkgcmVzdWx0LndyaXRlKCIvIik7CiAgICByZXN1bHQud3JpdGVBbGwocGF0aFNlZ21lbnRzLCAiLyIpOwogICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogIH0KCiAgc3RhdGljIFN0cmluZyBfdG9XaW5kb3dzRmlsZVBhdGgoVXJpIHVyaSkgewogICAgYm9vbCBoYXNEcml2ZUxldHRlciA9IGZhbHNlOwogICAgdmFyIHNlZ21lbnRzID0gdXJpLnBhdGhTZWdtZW50czsKICAgIGlmIChzZWdtZW50cy5sZW5ndGggPiAwICYmCiAgICAgICAgc2VnbWVudHNbMF0ubGVuZ3RoID09IDIgJiYKICAgICAgICBzZWdtZW50c1swXS5jb2RlVW5pdEF0KDEpID09IF9DT0xPTikgewogICAgICBfY2hlY2tXaW5kb3dzRHJpdmVMZXR0ZXIoc2VnbWVudHNbMF0uY29kZVVuaXRBdCgwKSwgZmFsc2UpOwogICAgICBfY2hlY2tXaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVycyhzZWdtZW50cywgZmFsc2UsIDEpOwogICAgICBoYXNEcml2ZUxldHRlciA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBfY2hlY2tXaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVycyhzZWdtZW50cywgZmFsc2UsIDApOwogICAgfQogICAgdmFyIHJlc3VsdCA9IFN0cmluZ0J1ZmZlcigpOwogICAgaWYgKHVyaS5oYXNBYnNvbHV0ZVBhdGggJiYgIWhhc0RyaXZlTGV0dGVyKSByZXN1bHQud3JpdGUociJcIik7CiAgICBpZiAodXJpLmhhc0F1dGhvcml0eSkgewogICAgICB2YXIgaG9zdCA9IHVyaS5ob3N0OwogICAgICBpZiAoaG9zdC5pc05vdEVtcHR5KSB7CiAgICAgICAgcmVzdWx0LndyaXRlKHIiXCIpOwogICAgICAgIHJlc3VsdC53cml0ZShob3N0KTsKICAgICAgICByZXN1bHQud3JpdGUociJcIik7CiAgICAgIH0KICAgIH0KICAgIHJlc3VsdC53cml0ZUFsbChzZWdtZW50cywgciJcIik7CiAgICBpZiAoaGFzRHJpdmVMZXR0ZXIgJiYgc2VnbWVudHMubGVuZ3RoID09IDEpIHJlc3VsdC53cml0ZShyIlwiKTsKICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9CgogIGJvb2wgZ2V0IF9pc1BhdGhBYnNvbHV0ZSB7CiAgICByZXR1cm4gcGF0aCAhPSBudWxsICYmIHBhdGguc3RhcnRzV2l0aCgnLycpOwogIH0KCiAgdm9pZCBfd3JpdGVBdXRob3JpdHkoU3RyaW5nU2luayBzcykgewogICAgaWYgKF91c2VySW5mby5pc05vdEVtcHR5KSB7CiAgICAgIHNzLndyaXRlKF91c2VySW5mbyk7CiAgICAgIHNzLndyaXRlKCJAIik7CiAgICB9CiAgICBpZiAoX2hvc3QgIT0gbnVsbCkgc3Mud3JpdGUoX2hvc3QpOwogICAgaWYgKF9wb3J0ICE9IG51bGwpIHsKICAgICAgc3Mud3JpdGUoIjoiKTsKICAgICAgc3Mud3JpdGUoX3BvcnQpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWNjZXNzIHRoZSBzdHJ1Y3R1cmUgb2YgYSBgZGF0YTpgIFVSSS4KICAgKgogICAqIFJldHVybnMgYSBbVXJpRGF0YV0gb2JqZWN0IGZvciBgZGF0YTpgIFVSSXMgYW5kIGBudWxsYCBmb3IgYWxsIG90aGVyCiAgICogVVJJcy4KICAgKiBUaGUgW1VyaURhdGFdIG9iamVjdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIG1lZGlhIHR5cGUgYW5kIGRhdGEKICAgKiBvZiBhIGBkYXRhOmAgVVJJLgogICAqLwogIFVyaURhdGEgZ2V0IGRhdGEgPT4gKHNjaGVtZSA9PSAiZGF0YSIpID8gVXJpRGF0YS5mcm9tVXJpKHRoaXMpIDogbnVsbDsKCiAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIF90ZXh0ID8/PSBfaW5pdGlhbGl6ZVRleHQoKTsKICB9CgogIFN0cmluZyBfaW5pdGlhbGl6ZVRleHQoKSB7CiAgICBhc3NlcnQoX3RleHQgPT0gbnVsbCk7CiAgICBTdHJpbmdCdWZmZXIgc2IgPSBTdHJpbmdCdWZmZXIoKTsKICAgIGlmIChzY2hlbWUuaXNOb3RFbXB0eSkgc2IuLndyaXRlKHNjaGVtZSkuLndyaXRlKCI6Iik7CiAgICBpZiAoaGFzQXV0aG9yaXR5IHx8IChzY2hlbWUgPT0gImZpbGUiKSkgewogICAgICAvLyBGaWxlIFVSSVMgYWx3YXlzIGhhdmUgdGhlIGF1dGhvcml0eSwgZXZlbiBpZiBpdCBpcyBlbXB0eS4KICAgICAgLy8gVGhlIGVtcHR5IFVSSSBtZWFucyAibG9jYWxob3N0Ii4KICAgICAgc2Iud3JpdGUoIi8vIik7CiAgICAgIF93cml0ZUF1dGhvcml0eShzYik7CiAgICB9CiAgICBzYi53cml0ZShwYXRoKTsKICAgIGlmIChfcXVlcnkgIT0gbnVsbCkgc2IuLndyaXRlKCI/IikuLndyaXRlKF9xdWVyeSk7CiAgICBpZiAoX2ZyYWdtZW50ICE9IG51bGwpIHNiLi53cml0ZSgiIyIpLi53cml0ZShfZnJhZ21lbnQpOwogICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgfQoKICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgaWYgKGlkZW50aWNhbCh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIG90aGVyIGlzIFVyaSAmJgogICAgICAgIHNjaGVtZSA9PSBvdGhlci5zY2hlbWUgJiYKICAgICAgICBoYXNBdXRob3JpdHkgPT0gb3RoZXIuaGFzQXV0aG9yaXR5ICYmCiAgICAgICAgdXNlckluZm8gPT0gb3RoZXIudXNlckluZm8gJiYKICAgICAgICBob3N0ID09IG90aGVyLmhvc3QgJiYKICAgICAgICBwb3J0ID09IG90aGVyLnBvcnQgJiYKICAgICAgICBwYXRoID09IG90aGVyLnBhdGggJiYKICAgICAgICBoYXNRdWVyeSA9PSBvdGhlci5oYXNRdWVyeSAmJgogICAgICAgIHF1ZXJ5ID09IG90aGVyLnF1ZXJ5ICYmCiAgICAgICAgaGFzRnJhZ21lbnQgPT0gb3RoZXIuaGFzRnJhZ21lbnQgJiYKICAgICAgICBmcmFnbWVudCA9PSBvdGhlci5mcmFnbWVudDsKICB9CgogIGludCBnZXQgaGFzaENvZGUgewogICAgcmV0dXJuIF9oYXNoQ29kZUNhY2hlID8/PSB0b1N0cmluZygpLmhhc2hDb2RlOwogIH0KCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBfY3JlYXRlTGlzdCgpID0+IDxTdHJpbmc+W107CgogIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IF9zcGxpdFF1ZXJ5U3RyaW5nQWxsKFN0cmluZyBxdWVyeSwKICAgICAge0VuY29kaW5nIGVuY29kaW5nID0gdXRmOH0pIHsKICAgIHZhciByZXN1bHQgPSA8U3RyaW5nLCBMaXN0PFN0cmluZz4+e307CiAgICBpbnQgaSA9IDA7CiAgICBpbnQgc3RhcnQgPSAwOwogICAgaW50IGVxdWFsc0luZGV4ID0gLTE7CgogICAgdm9pZCBwYXJzZVBhaXIoaW50IHN0YXJ0LCBpbnQgZXF1YWxzSW5kZXgsIGludCBlbmQpIHsKICAgICAgU3RyaW5nIGtleTsKICAgICAgU3RyaW5nIHZhbHVlOwogICAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm47CiAgICAgIGlmIChlcXVhbHNJbmRleCA8IDApIHsKICAgICAgICBrZXkgPSBfdXJpRGVjb2RlKHF1ZXJ5LCBzdGFydCwgZW5kLCBlbmNvZGluZywgdHJ1ZSk7CiAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBrZXkgPSBfdXJpRGVjb2RlKHF1ZXJ5LCBzdGFydCwgZXF1YWxzSW5kZXgsIGVuY29kaW5nLCB0cnVlKTsKICAgICAgICB2YWx1ZSA9IF91cmlEZWNvZGUocXVlcnksIGVxdWFsc0luZGV4ICsgMSwgZW5kLCBlbmNvZGluZywgdHJ1ZSk7CiAgICAgIH0KICAgICAgcmVzdWx0LnB1dElmQWJzZW50KGtleSwgX2NyZWF0ZUxpc3QpLmFkZCh2YWx1ZSk7CiAgICB9CgogICAgd2hpbGUgKGkgPCBxdWVyeS5sZW5ndGgpIHsKICAgICAgaW50IGNoYXIgPSBxdWVyeS5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY2hhciA9PSBfRVFVQUxTKSB7CiAgICAgICAgaWYgKGVxdWFsc0luZGV4IDwgMCkgZXF1YWxzSW5kZXggPSBpOwogICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gX0FNUEVSU0FORCkgewogICAgICAgIHBhcnNlUGFpcihzdGFydCwgZXF1YWxzSW5kZXgsIGkpOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgICAgZXF1YWxzSW5kZXggPSAtMTsKICAgICAgfQogICAgICBpKys7CiAgICB9CiAgICBwYXJzZVBhaXIoc3RhcnQsIGVxdWFsc0luZGV4LCBpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBleHRlcm5hbCBzdGF0aWMgU3RyaW5nIF91cmlFbmNvZGUoTGlzdDxpbnQ+IGNhbm9uaWNhbFRhYmxlLCBTdHJpbmcgdGV4dCwKICAgICAgRW5jb2RpbmcgZW5jb2RpbmcsIGJvb2wgc3BhY2VUb1BsdXMpOwoKICAvKioKICAgKiBDb252ZXJ0IGEgYnl0ZSAoMiBjaGFyYWN0ZXIgaGV4IHNlcXVlbmNlKSBpbiBzdHJpbmcgW3NdIHN0YXJ0aW5nCiAgICogYXQgcG9zaXRpb24gW3Bvc10gdG8gaXRzIG9yZGluYWwgdmFsdWUKICAgKi8KICBzdGF0aWMgaW50IF9oZXhDaGFyUGFpclRvQnl0ZShTdHJpbmcgcywgaW50IHBvcykgewogICAgaW50IGJ5dGUgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgdmFyIGNoYXJDb2RlID0gcy5jb2RlVW5pdEF0KHBvcyArIGkpOwogICAgICBpZiAoMHgzMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDM5KSB7CiAgICAgICAgYnl0ZSA9IGJ5dGUgKiAxNiArIGNoYXJDb2RlIC0gMHgzMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBDaGVjayByYW5nZXMgQS1GICgweDQxLTB4NDYpIGFuZCBhLWYgKDB4NjEtMHg2NikuCiAgICAgICAgY2hhckNvZGUgfD0gMHgyMDsKICAgICAgICBpZiAoMHg2MSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDY2KSB7CiAgICAgICAgICBieXRlID0gYnl0ZSAqIDE2ICsgY2hhckNvZGUgLSAweDU3OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJJbnZhbGlkIFVSTCBlbmNvZGluZyIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGJ5dGU7CiAgfQoKICAvKioKICAgKiBVcmktZGVjb2RlIGEgcGVyY2VudC1lbmNvZGVkIHN0cmluZy4KICAgKgogICAqIEl0IHVuZXNjYXBlcyB0aGUgc3RyaW5nIFt0ZXh0XSBhbmQgcmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgSmF2YVNjcmlwdC1mdW5jdGlvbiBgZGVjb2RlVVJJYC4KICAgKgogICAqIElmIFtwbHVzVG9TcGFjZV0gaXMgYHRydWVgLCBwbHVzIGNoYXJhY3RlcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3BhY2VzLgogICAqCiAgICogVGhlIGRlY29kZXIgd2lsbCBjcmVhdGUgYSBieXRlLWxpc3Qgb2YgdGhlIHBlcmNlbnQtZW5jb2RlZCBwYXJ0cywgYW5kIHRoZW4KICAgKiBkZWNvZGUgdGhlIGJ5dGUtbGlzdCB1c2luZyBbZW5jb2RpbmddLiBUaGUgZGVmYXVsdCBlbmNvZGluZ3MgVVRGLTguCiAgICovCiAgc3RhdGljIFN0cmluZyBfdXJpRGVjb2RlKAogICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBFbmNvZGluZyBlbmNvZGluZywgYm9vbCBwbHVzVG9TcGFjZSkgewogICAgYXNzZXJ0KDAgPD0gc3RhcnQpOwogICAgYXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CiAgICBhc3NlcnQoZW5kIDw9IHRleHQubGVuZ3RoKTsKICAgIGFzc2VydChlbmNvZGluZyAhPSBudWxsKTsKICAgIC8vIEZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYW55IGNoYXJhY3RlcnMgd2hpY2ggbmVlZCBzcGVjaWFsIGhhbmRsaW5nLgogICAgYm9vbCBzaW1wbGUgPSB0cnVlOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNvZGVVbml0ID0gdGV4dC5jb2RlVW5pdEF0KGkpOwogICAgICBpZiAoY29kZVVuaXQgPiAxMjcgfHwKICAgICAgICAgIGNvZGVVbml0ID09IF9QRVJDRU5UIHx8CiAgICAgICAgICAocGx1c1RvU3BhY2UgJiYgY29kZVVuaXQgPT0gX1BMVVMpKSB7CiAgICAgICAgc2ltcGxlID0gZmFsc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIExpc3Q8aW50PiBieXRlczsKICAgIGlmIChzaW1wbGUpIHsKICAgICAgaWYgKHV0ZjggPT0gZW5jb2RpbmcgfHwgbGF0aW4xID09IGVuY29kaW5nIHx8IGFzY2lpID09IGVuY29kaW5nKSB7CiAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgICB9IGVsc2UgewogICAgICAgIGJ5dGVzID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkuY29kZVVuaXRzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBieXRlcyA9IExpc3QoKTsKICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICB2YXIgY29kZVVuaXQgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgICAgaWYgKGNvZGVVbml0ID4gMTI3KSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJJbGxlZ2FsIHBlcmNlbnQgZW5jb2RpbmcgaW4gVVJJIik7CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlVW5pdCA9PSBfUEVSQ0VOVCkgewogICAgICAgICAgaWYgKGkgKyAzID4gdGV4dC5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcignVHJ1bmNhdGVkIFVSSScpOwogICAgICAgICAgfQogICAgICAgICAgYnl0ZXMuYWRkKF9oZXhDaGFyUGFpclRvQnl0ZSh0ZXh0LCBpICsgMSkpOwogICAgICAgICAgaSArPSAyOwogICAgICAgIH0gZWxzZSBpZiAocGx1c1RvU3BhY2UgJiYgY29kZVVuaXQgPT0gX1BMVVMpIHsKICAgICAgICAgIGJ5dGVzLmFkZChfU1BBQ0UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBieXRlcy5hZGQoY29kZVVuaXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShieXRlcyk7CiAgfQoKICBzdGF0aWMgYm9vbCBfaXNBbHBoYWJldGljQ2hhcmFjdGVyKGludCBjb2RlVW5pdCkgewogICAgdmFyIGxvd2VyQ2FzZSA9IGNvZGVVbml0IHwgMHgyMDsKICAgIHJldHVybiAoX0xPV0VSX0NBU0VfQSA8PSBsb3dlckNhc2UgJiYgbG93ZXJDYXNlIDw9IF9MT1dFUl9DQVNFX1opOwogIH0KCiAgc3RhdGljIGJvb2wgX2lzVW5yZXNlcnZlZENoYXIoaW50IGNoYXIpIHsKICAgIHJldHVybiBjaGFyIDwgMTI3ICYmCiAgICAgICAgKChfdW5yZXNlcnZlZFRhYmxlW2NoYXIgPj4gNF0gJiAoMSA8PCAoY2hhciAmIDB4MGYpKSkgIT0gMCk7CiAgfQoKICAvLyBUYWJsZXMgb2YgY2hhci1jb2RlcyBvcmdhbml6ZWQgYXMgYSBiaXQgdmVjdG9yIG9mIDEyOCBiaXRzIHdoZXJlCiAgLy8gZWFjaCBiaXQgaW5kaWNhdGUgd2hldGhlciBhIGNoYXJhY3RlciBjb2RlIG9uIHRoZSAwLTEyNyBuZWVkcyB0bwogIC8vIGJlIGVzY2FwZWQgb3Igbm90LgoKICAvLyBUaGUgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzIG9mIFJGQyAzOTg2LgogIHN0YXRpYyBjb25zdCBfdW5yZXNlcnZlZFRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0uCiAgICAweDYwMDAsIC8vIDB4MjAgLSAweDJmICAwMDAwMDAwMDAwMDAwMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5CiAgICAweDAzZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBUaGUgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzIG9mIFJGQyAyMzk2LgogIHN0YXRpYyBjb25zdCBfdW5yZXNlcnZlZDIzOTZUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAgICAnKCkqICAtLgogICAgMHg2NzgyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDAwMDExMTEwMDExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gVGFibGUgb2YgcmVzZXJ2ZWQgY2hhcmFjdGVycyBzcGVjaWZpZWQgYnkgRUNNQVNjcmlwdCA1LgogIHN0YXRpYyBjb25zdCBfZW5jb2RlRnVsbFRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgIyQgJicoKSorLC0uLwogICAgMHhmZmRhLCAvLyAweDIwIC0gMHgyZiAgMDEwMTEwMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OTo7ID0gPwogICAgMHhhZmZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTExMDEwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgQEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZmLCAvLyAweDQwIC0gMHg0ZiAgMTExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBzY2hlbWUuCiAgc3RhdGljIGNvbnN0IF9zY2hlbWVUYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAtLgogICAgMHg2ODAwLCAvLyAweDIwIC0gMHgyZiAgMDAwMDAwMDAwMDAxMDExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZlLCAvLyAweDQwIC0gMHg0ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVoKICAgIDB4MDdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6CiAgICAweDA3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIHNjaGVtZSBleGNlcHQgZm9yIHVwcGVyIGNhc2UgbGV0dGVycy4KICBzdGF0aWMgY29uc3QgX3NjaGVtZUxvd2VyVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLS4KICAgIDB4NjgwMCwgLy8gMHgyMCAtIDB4MmYgIDAwMDAwMDAwMDAwMTAxMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODkKICAgIDB4MDNmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTEwMDAwMDAKICAgIC8vCiAgICAweDAwMDAsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMTExMTExMTExCiAgICAvLwogICAgMHgwMDAwLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXoKICAgIDB4MDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBTdWIgZGVsaW1pdGVyIGNoYXJhY3RlcnMgY29tYmluZWQgd2l0aCB1bnJlc2VydmVkIGFzIG9mIDM5ODYuCiAgLy8gc3ViLWRlbGltcyAgPSAiISIgLyAiJCIgLyAiJiIgLyAiJyIgLyAiKCIgLyAiKSIKICAvLyAgICAgICAgIC8gIioiIC8gIisiIC8gIiwiIC8gIjsiIC8gIj0iCiAgLy8gUkZDIDM5ODYgc2VjdGlvbiAyLjMuCiAgLy8gdW5yZXNlcnZlZCAgPSBBTFBIQSAvIERJR0lUIC8gIi0iIC8gIi4iIC8gIl8iIC8gIn4iCiAgc3RhdGljIGNvbnN0IF9zdWJEZWxpbWl0ZXJzVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAgJCAmJygpKissLS4KICAgIDB4N2ZkMiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAxMDExMTExMTExMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODkgOyA9CiAgICAweDJiZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMDEwMTAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBHZW5lcmFsIGRlbGltaXRlciBjaGFyYWN0ZXJzLCBSRkMgMzk4NiBzZWN0aW9uIDIuMi4KICAvLyBnZW4tZGVsaW1zICA9ICI6IiAvICIvIiAvICI/IiAvICIjIiAvICJbIiAvICJdIiAvICJAIgogIC8vCiAgc3RhdGljIGNvbnN0IF9nZW5EZWxpbWl0ZXJzVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAvCiAgICAweDgwMDgsIC8vIDB4MjAgLSAweDJmICAwMDAxMDAwMDAwMDAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA/CiAgICAweDg0MDAsIC8vIDB4MzAgLSAweDNmICAwMDAwMDAwMDAwMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBACiAgICAweDAwMDEsIC8vIDB4NDAgLSAweDRmICAxMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgXQogICAgMHgyODAwLCAvLyAweDUwIC0gMHg1ZiAgMDAwMDAwMDAwMDAxMDEwMAogICAgLy8KICAgIDB4MDAwMCwgLy8gMHg2MCAtIDB4NmYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vCiAgICAweDAwMDAsIC8vIDB4NzAgLSAweDdmICAwMDAwMDAwMDAwMDAwMDAwCiAgXTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSB1c2VyaW5mbyBhcyBvZiBSRkMgMzk4Ni4KICAvLyBSRkMgMzk4NiBBcHBlbmRpeCBBCiAgLy8gdXNlcmluZm8gPSAqKCB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gJzonKQogIHN0YXRpYyBjb25zdCBfdXNlcmluZm9UYWJsZSA9IDxpbnQ+WwogICAgLy8gICAgICAgICAgICAgICAgICAgICBMU0IgICAgICAgICAgICBNU0IKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIDB4MDAwMCwgLy8gMHgxMCAtIDB4MWYgIDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAhICAkICYnKCkqKywtLgogICAgMHg3ZmQyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDEwMTExMTExMTExMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OTo7ID0KICAgIDB4MmZmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTExMTAxMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFBRUlNUVVZXWFlaICAgIF8KICAgIDB4ODdmZiwgLy8gMHg1MCAtIDB4NWYgIDExMTExMTExMTExMDAwMDEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBhYmNkZWZnaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExMTExMTExMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHBxcnN0dXZ3eHl6ICAgfgogICAgMHg0N2ZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTExMTEwMDAxMAogIF07CgogIC8vIENoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgcmVnLW5hbWUgYXMgb2YgUkZDIDM5ODYuCiAgLy8gUkZDIDM5ODYgQXBwZW5kaXggQQogIC8vIHJlZy1uYW1lID0gKiggdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyApCiAgc3RhdGljIGNvbnN0IF9yZWdOYW1lVGFibGUgPSA8aW50PlsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgTVNCCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CiAgICAweDAwMDAsIC8vIDB4MDAgLSAweDBmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgISAgJCUmJygpKissLS4KICAgIDB4N2ZmMiwgLy8gMHgyMCAtIDB4MmYgIDAxMDAxMTExMTExMTExMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3ODkgOyA9CiAgICAweDJiZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMTExMDEwMTAwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgQUJDREVGR0hJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIHBhdGggYXMgb2YgUkZDIDM5ODYuCiAgLy8gUkZDIDM5ODYgc2VjdGlvbiAzLjMuCiAgLy8gcGNoYXIgPSB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIjoiIC8gIkAiCiAgc3RhdGljIGNvbnN0IF9wYXRoQ2hhclRhYmxlID0gPGludD5bCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uCiAgICAweDdmZDIsIC8vIDB4MjAgLSAweDJmICAwMTAwMTAxMTExMTExMTEwCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2Nzg5OjsgPQogICAgMHgyZmZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTExMDEwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgQEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZmLCAvLyAweDQwIC0gMHg0ZiAgMTExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIHRoZSBwYXRoIGFzIG9mIFJGQyAzOTg2LgogIC8vIFJGQyAzOTg2IHNlY3Rpb24gMy4zICphbmQqIHNsYXNoLgogIHN0YXRpYyBjb25zdCBfcGF0aENoYXJPclNsYXNoVGFibGUgPSBbCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uLwogICAgMHhmZmQyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDEwMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OTo7ID0KICAgIDB4MmZmZiwgLy8gMHgzMCAtIDB4M2YgIDExMTExMTExMTExMTAxMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIEBBQkNERUZHSElKS0xNTk8KICAgIDB4ZmZmZiwgLy8gMHg0MCAtIDB4NGYgIDExMTExMTExMTExMTExMTEKCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWV1hZWiAgICBfCiAgICAweDg3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMTExMTAwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYWJjZGVmZ2hpamtsbW5vCiAgICAweGZmZmUsIC8vIDB4NjAgLSAweDZmICAwMTExMTExMTExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2d3h5eiAgIH4KICAgIDB4NDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExMTExMDAwMTAKICBdOwoKICAvLyBDaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIHF1ZXJ5IGFzIG9mIFJGQyAzOTg2LgogIC8vIFJGQyAzOTg2IHNlY3Rpb24gMy40LgogIC8vIHF1ZXJ5ID0gKiggcGNoYXIgLyAiLyIgLyAiPyIgKQogIHN0YXRpYyBjb25zdCBfcXVlcnlDaGFyVGFibGUgPSBbCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExTQiAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfAogICAgMHgwMDAwLCAvLyAweDAwIC0gMHgwZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgMHgwMDAwLCAvLyAweDEwIC0gMHgxZiAgMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQgJicoKSorLC0uLwogICAgMHhmZmQyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDEwMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgMDEyMzQ1Njc4OTo7ID0gPwogICAgMHhhZmZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTExMTExMDEwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgQEFCQ0RFRkdISUpLTE1OTwogICAgMHhmZmZmLCAvLyAweDQwIC0gMHg0ZiAgMTExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVldYWVogICAgXwogICAgMHg4N2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTExMTEwMDAwMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmdoaWprbG1ubwogICAgMHhmZmZlLCAvLyAweDYwIC0gMHg2ZiAgMDExMTExMTExMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dnd4eXogICB+CiAgICAweDQ3ZmYsIC8vIDB4NzAgLSAweDdmICAxMTExMTExMTExMTAwMDEwCiAgXTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGF0YSBVUkkKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgogKiBBIHdheSB0byBhY2Nlc3MgdGhlIHN0cnVjdHVyZSBvZiBhIGBkYXRhOmAgVVJJLgogKgogKiBEYXRhIFVSSXMgYXJlIG5vbi1oaWVyYXJjaGljYWwgVVJJcyB0aGF0IGNhbiBjb250YWluIGFueSBiaW5hcnkgZGF0YS4KICogVGhleSBhcmUgZGVmaW5lZCBieSBbUkZDIDIzOTddKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMzk3KS4KICoKICogVGhpcyBjbGFzcyBhbGxvd3MgcGFyc2luZyB0aGUgVVJJIHRleHQgYW5kIGV4dHJhY3RpbmcgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUKICogVVJJLCBhcyB3ZWxsIGFzIGJ1aWxkaW5nIHRoZSBVUkkgdGV4dCBmcm9tIHN0cnVjdHVyZWQgcGFydHMuCiAqLwpjbGFzcyBVcmlEYXRhIHsKICBzdGF0aWMgY29uc3QgaW50IF9ub1NjaGVtZSA9IC0xOwogIC8qKgogICAqIENvbnRhaW5zIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBgZGF0YTpgIFVSSSwgd2l0aCBvciB3aXRob3V0IGEKICAgKiBsZWFkaW5nIGBkYXRhOmAuCiAgICoKICAgKiBJZiBbX3NlcGFyYXRvckluZGljZXNdIHN0YXJ0cyB3aXRoIGA0YCAodGhlIGluZGV4IG9mIHRoZSBgOmApLCB0aGVuCiAgICogdGhlcmUgaXMgYSBsZWFkaW5nIGBkYXRhOmAsIG90aGVyd2lzZSBbX3NlcGFyYXRvckluZGljZXNdIHN0YXJ0cyB3aXRoCiAgICogYC0xYC4KICAgKi8KICBmaW5hbCBTdHJpbmcgX3RleHQ7CgogIC8qKgogICAqIExpc3Qgb2YgdGhlIHNlcGFyYXRvcnMgKCc7JywgJz0nIGFuZCAnLCcpIGluIHRoZSB0ZXh0LgogICAqCiAgICogU3RhcnRzIHdpdGggdGhlIGluZGV4IG9mIHRoZSBgOmAgaW4gYGRhdGE6YCBvZiB0aGUgbWltZVR5cGUuCiAgICogVGhhdCBpcyBhbHdheXMgZWl0aGVyIC0xIG9yIDQsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGBfdGV4dGAgaW5jbHVkZXMgdGhlCiAgICogYGRhdGE6YCBzY2hlbWUgb3Igbm90LgogICAqCiAgICogVGhlIGZpcnN0IHNwZXBhcmF0b3IgZW5kcyB0aGUgbWltZSB0eXBlLiBXZSBkb24ndCBib3RoZXIgd2l0aCBmaW5kaW5nCiAgICogdGhlICcvJyBpbnNpZGUgdGhlIG1pbWUgdHlwZS4KICAgKgogICAqIEVhY2ggdHdvIHNlcGFyYXRvcnMgYWZ0ZXIgdGhhdCBtYXJrcyBhIHBhcmFtZXRlciBrZXkgYW5kIHZhbHVlLgogICAqCiAgICogSWYgdGhlcmUgaXMgYSBzaW5nbGUgc2VwYXJhdG9yIGxlZnQsIGl0IGVuZHMgdGhlICJiYXNlNjQiIG1hcmtlci4KICAgKgogICAqIFNvIHRoZSBmb2xsb3dpbmcgc2VwYXJhdG9ycyBhcmUgZm91bmQgZm9yIGEgdGV4dDoKICAgKiBgYGAKICAgKiBkYXRhOnRleHQvcGxhaW47Zm9vPWJhcjtiYXNlNjQsQVJHTEVCQVJHTEU9CiAgICogICAgIF4gICAgICAgICAgXiAgIF4gICBeICAgICAgXgogICAqIGBgYAogICAqLwogIGZpbmFsIExpc3Q8aW50PiBfc2VwYXJhdG9ySW5kaWNlczsKCiAgLyoqCiAgICogQ2FjaGUgb2YgdGhlIHJlc3VsdCByZXR1cm5lZCBieSBbdXJpXS4KICAgKi8KICBVcmkgX3VyaUNhY2hlOwoKICBVcmlEYXRhLl8odGhpcy5fdGV4dCwgdGhpcy5fc2VwYXJhdG9ySW5kaWNlcywgdGhpcy5fdXJpQ2FjaGUpOwoKICAvLyBBdm9pZCBzaGFkb3dpbmcgYnkgYXJndW1lbnQuCiAgc3RhdGljIGNvbnN0IEJhc2U2NENvZGVjIF9iYXNlNjQgPSBiYXNlNjQ7CgogIC8qKgogICAqIENyZWF0ZXMgYSBgZGF0YTpgIFVSSSBjb250YWluaW5nIHRoZSBbY29udGVudF0gc3RyaW5nLgogICAqCiAgICogRXF1aXZhbGVudCB0byBgbmV3IFVyaS5kYXRhRnJvbVN0cmluZyguLi4pLmRhdGFgLCBidXQgbWF5CiAgICogYmUgbW9yZSBlZmZpY2llbnQgaWYgdGhlIFt1cmldIGl0c2VsZiBpc24ndCB1c2VkLgogICAqLwogIGZhY3RvcnkgVXJpRGF0YS5mcm9tU3RyaW5nKFN0cmluZyBjb250ZW50LAogICAgICB7U3RyaW5nIG1pbWVUeXBlLAogICAgICBFbmNvZGluZyBlbmNvZGluZywKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAogICAgICBib29sIGJhc2U2NCA9IGZhbHNlfSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwogICAgTGlzdDxpbnQ+IGluZGljZXMgPSBbX25vU2NoZW1lXTsKICAgIFN0cmluZyBjaGFyc2V0TmFtZTsKICAgIFN0cmluZyBlbmNvZGluZ05hbWU7CiAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSBjaGFyc2V0TmFtZSA9IHBhcmFtZXRlcnNbImNoYXJzZXQiXTsKICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CiAgICAgIGlmIChjaGFyc2V0TmFtZSAhPSBudWxsKSB7CiAgICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZy5nZXRCeU5hbWUoY2hhcnNldE5hbWUpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNoYXJzZXROYW1lID09IG51bGwpIHsKICAgICAgLy8gTm9uLW51bGwgb25seSBpZiBwYXJhbWV0ZXJzIGRvZXMgbm90IGNvbnRhaW4gImNoYXJzZXQiLgogICAgICBlbmNvZGluZ05hbWUgPSBlbmNvZGluZy5uYW1lOwogICAgfQogICAgZW5jb2RpbmcgPz89IGFzY2lpOwogICAgX3dyaXRlVXJpKG1pbWVUeXBlLCBlbmNvZGluZ05hbWUsIHBhcmFtZXRlcnMsIGJ1ZmZlciwgaW5kaWNlcyk7CiAgICBpbmRpY2VzLmFkZChidWZmZXIubGVuZ3RoKTsKICAgIGlmIChiYXNlNjQpIHsKICAgICAgYnVmZmVyLndyaXRlKCc7YmFzZTY0LCcpOwogICAgICBpbmRpY2VzLmFkZChidWZmZXIubGVuZ3RoIC0gMSk7CiAgICAgIGJ1ZmZlci53cml0ZShlbmNvZGluZy5mdXNlKF9iYXNlNjQpLmVuY29kZShjb250ZW50KSk7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoJywnKTsKICAgICAgX3VyaUVuY29kZUJ5dGVzKF91cmljVGFibGUsIGVuY29kaW5nLmVuY29kZShjb250ZW50KSwgYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiBVcmlEYXRhLl8oYnVmZmVyLnRvU3RyaW5nKCksIGluZGljZXMsIG51bGwpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGBkYXRhOmAgVVJJIGNvbnRhaW5pbmcgYW4gZW5jb2Rpbmcgb2YgW2J5dGVzXS4KICAgKgogICAqIEVxdWl2YWxlbnQgdG8gYG5ldyBVcmkuZGF0YUZyb21CeXRlcyguLi4pLmRhdGFgLCBidXQgbWF5CiAgICogYmUgbW9yZSBlZmZpY2llbnQgaWYgdGhlIFt1cmldIGl0c2VsZiBpc24ndCB1c2VkLgogICAqLwogIGZhY3RvcnkgVXJpRGF0YS5mcm9tQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzLAogICAgICB7bWltZVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAogICAgICBwZXJjZW50RW5jb2RlZCA9IGZhbHNlfSkgewogICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwogICAgTGlzdDxpbnQ+IGluZGljZXMgPSBbX25vU2NoZW1lXTsKICAgIF93cml0ZVVyaShtaW1lVHlwZSwgbnVsbCwgcGFyYW1ldGVycywgYnVmZmVyLCBpbmRpY2VzKTsKICAgIGluZGljZXMuYWRkKGJ1ZmZlci5sZW5ndGgpOwogICAgaWYgKHBlcmNlbnRFbmNvZGVkKSB7CiAgICAgIGJ1ZmZlci53cml0ZSgnLCcpOwogICAgICBfdXJpRW5jb2RlQnl0ZXMoX3VyaWNUYWJsZSwgYnl0ZXMsIGJ1ZmZlcik7CiAgICB9IGVsc2UgewogICAgICBidWZmZXIud3JpdGUoJztiYXNlNjQsJyk7CiAgICAgIGluZGljZXMuYWRkKGJ1ZmZlci5sZW5ndGggLSAxKTsKICAgICAgX2Jhc2U2NC5lbmNvZGVyCiAgICAgICAgICAuc3RhcnRDaHVua2VkQ29udmVyc2lvbihTdHJpbmdDb252ZXJzaW9uU2luay5mcm9tU3RyaW5nU2luayhidWZmZXIpKQogICAgICAgICAgLmFkZFNsaWNlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgsIHRydWUpOwogICAgfQoKICAgIHJldHVybiBVcmlEYXRhLl8oYnVmZmVyLnRvU3RyaW5nKCksIGluZGljZXMsIG51bGwpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlcyBhIGBEYXRhVXJpYCBmcm9tIGEgW1VyaV0gd2hpY2ggbXVzdCBoYXZlIGBkYXRhYCBhcyBbVXJpLnNjaGVtZV0uCiAgICoKICAgKiBUaGUgW3VyaV0gbXVzdCBoYXZlIHNjaGVtZSBgZGF0YWAgYW5kIG5vIGF1dGhvcml0eSBvciBmcmFnbWVudCwKICAgKiBhbmQgdGhlIHBhdGggKGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBxdWVyeSwgaWYgdGhlcmUgaXMgb25lKSBtdXN0IGJlIHZhbGlkCiAgICogYXMgZGF0YSBVUkkgY29udGVudCB3aXRoIHRoZSBzYW1lIHJ1bGVzIGFzIFtwYXJzZV0uCiAgICovCiAgZmFjdG9yeSBVcmlEYXRhLmZyb21VcmkoVXJpIHVyaSkgewogICAgaWYgKHVyaS5zY2hlbWUgIT0gImRhdGEiKSB7CiAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUodXJpLCAidXJpIiwgIlNjaGVtZSBtdXN0IGJlICdkYXRhJyIpOwogICAgfQogICAgaWYgKHVyaS5oYXNBdXRob3JpdHkpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZSh1cmksICJ1cmkiLCAiRGF0YSB1cmkgbXVzdCBub3QgaGF2ZSBhdXRob3JpdHkiKTsKICAgIH0KICAgIGlmICh1cmkuaGFzRnJhZ21lbnQpIHsKICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZSgKICAgICAgICAgIHVyaSwgInVyaSIsICJEYXRhIHVyaSBtdXN0IG5vdCBoYXZlIGEgZnJhZ21lbnQgcGFydCIpOwogICAgfQogICAgaWYgKCF1cmkuaGFzUXVlcnkpIHsKICAgICAgcmV0dXJuIF9wYXJzZSh1cmkucGF0aCwgMCwgdXJpKTsKICAgIH0KICAgIC8vIEluY2x1ZGVzIHBhdGggYW5kIHF1ZXJ5IChhbmQgbGVhZGluZyAiZGF0YToiKS4KICAgIHJldHVybiBfcGFyc2UoIiR1cmkiLCA1LCB1cmkpOwogIH0KCiAgLyoqCiAgICogV3JpdGVzIHRoZSBpbml0aWFsIHBhcnQgb2YgYSBgZGF0YTpgIHVyaSwgZnJvbSBhZnRlciB0aGUgImRhdGE6IgogICAqIHVudGlsIGp1c3QgYmVmb3JlIHRoZSAnLCcgYmVmb3JlIHRoZSBkYXRhLCBvciBiZWZvcmUgYSBgO2Jhc2U2NCxgCiAgICogbWFya2VyLgogICAqCiAgICogT2YgYW4gW2luZGljZXNdIGxpc3QgaXMgcGFzc2VkLCBzZXBhcmF0b3IgaW5kaWNlcyBhcmUgc3RvcmVkIGluIHRoYXQKICAgKiBsaXN0LgogICAqLwogIHN0YXRpYyB2b2lkIF93cml0ZVVyaShTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBjaGFyc2V0TmFtZSwKICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBMaXN0IGluZGljZXMpIHsKICAgIGlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlID09ICJ0ZXh0L3BsYWluIikgewogICAgICBtaW1lVHlwZSA9ICIiOwogICAgfQogICAgaWYgKG1pbWVUeXBlLmlzRW1wdHkgfHwgaWRlbnRpY2FsKG1pbWVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKICAgICAgYnVmZmVyLndyaXRlKG1pbWVUeXBlKTsgLy8gQ29tbW9uIGNhc2VzIG5lZWQgbm8gZXNjYXBpbmcuCiAgICB9IGVsc2UgewogICAgICBpbnQgc2xhc2hJbmRleCA9IF92YWxpZGF0ZU1pbWVUeXBlKG1pbWVUeXBlKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPCAwKSB7CiAgICAgICAgdGhyb3cgQXJndW1lbnRFcnJvci52YWx1ZShtaW1lVHlwZSwgIm1pbWVUeXBlIiwgIkludmFsaWQgTUlNRSB0eXBlIik7CiAgICAgIH0KICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZSgKICAgICAgICAgIF90b2tlbkNoYXJUYWJsZSwgbWltZVR5cGUuc3Vic3RyaW5nKDAsIHNsYXNoSW5kZXgpLCB1dGY4LCBmYWxzZSkpOwogICAgICBidWZmZXIud3JpdGUoIi8iKTsKICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZSgKICAgICAgICAgIF90b2tlbkNoYXJUYWJsZSwgbWltZVR5cGUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKSwgdXRmOCwgZmFsc2UpKTsKICAgIH0KICAgIGlmIChjaGFyc2V0TmFtZSAhPSBudWxsKSB7CiAgICAgIGlmIChpbmRpY2VzICE9IG51bGwpIHsKICAgICAgICBpbmRpY2VzLi5hZGQoYnVmZmVyLmxlbmd0aCkuLmFkZChidWZmZXIubGVuZ3RoICsgOCk7CiAgICAgIH0KICAgICAgYnVmZmVyLndyaXRlKCI7Y2hhcnNldD0iKTsKICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZShfdG9rZW5DaGFyVGFibGUsIGNoYXJzZXROYW1lLCB1dGY4LCBmYWxzZSkpOwogICAgfQogICAgcGFyYW1ldGVycz8uZm9yRWFjaCgoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoa2V5LmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKCIiLCAiUGFyYW1ldGVyIG5hbWVzIG11c3Qgbm90IGJlIGVtcHR5Iik7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlLmlzRW1wdHkpIHsKICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKAogICAgICAgICAgICAiIiwgIlBhcmFtZXRlciB2YWx1ZXMgbXVzdCBub3QgYmUgZW1wdHkiLCAncGFyYW1ldGVyc1siJGtleSJdJyk7CiAgICAgIH0KICAgICAgaWYgKGluZGljZXMgIT0gbnVsbCkgaW5kaWNlcy5hZGQoYnVmZmVyLmxlbmd0aCk7CiAgICAgIGJ1ZmZlci53cml0ZSgnOycpOwogICAgICAvLyBFbmNvZGUgYW55IG5vbi1SRkMyMDQ1LXRva2VuIGNoYXJhY3RlciBhbmQgYm90aCAnJScgYW5kICcjJy4KICAgICAgYnVmZmVyLndyaXRlKF9VcmkuX3VyaUVuY29kZShfdG9rZW5DaGFyVGFibGUsIGtleSwgdXRmOCwgZmFsc2UpKTsKICAgICAgaWYgKGluZGljZXMgIT0gbnVsbCkgaW5kaWNlcy5hZGQoYnVmZmVyLmxlbmd0aCk7CiAgICAgIGJ1ZmZlci53cml0ZSgnPScpOwogICAgICBidWZmZXIud3JpdGUoX1VyaS5fdXJpRW5jb2RlKF90b2tlbkNoYXJUYWJsZSwgdmFsdWUsIHV0ZjgsIGZhbHNlKSk7CiAgICB9KTsKICB9CgogIC8qKgogICAqIENoZWNrcyBtaW1lVHlwZSBpcyB2YWxpZC1pc2ggKGB0b2tlbiAnLycgdG9rZW5gKS4KICAgKgogICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzbGFzaCwgb3IgLTEgaWYgdGhlIG1pbWUgdHlwZSBpcyBub3QKICAgKiBjb25zaWRlcmVkIHZhbGlkLgogICAqCiAgICogQ3VycmVudGx5IG9ubHkgbG9va3MgZm9yIHNsYXNoZXMsIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHdpbGwgYmUKICAgKiBwZXJjZW50LWVuY29kZWQgYXMgVVRGLTggaWYgbmVjZXNzYXJ5LgogICAqLwogIHN0YXRpYyBpbnQgX3ZhbGlkYXRlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CiAgICBpbnQgc2xhc2hJbmRleCA9IC0xOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lVHlwZS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hhciA9IG1pbWVUeXBlLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyICE9IF9TTEFTSCkgY29udGludWU7CiAgICAgIGlmIChzbGFzaEluZGV4IDwgMCkgewogICAgICAgIHNsYXNoSW5kZXggPSBpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiBzbGFzaEluZGV4OwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgc3RyaW5nIGFzIGEgYGRhdGFgIFVSSS4KICAgKgogICAqIFRoZSBzdHJpbmcgbXVzdCBoYXZlIHRoZSBmb3JtYXQ6CiAgICoKICAgKiBgYGAKICAgKiAnZGF0YTonICh0eXBlICcvJyBzdWJ0eXBlKT8gKCc7JyBhdHRyaWJ1dGUgJz0nIHZhbHVlKSogKCc7YmFzZTY0Jyk/ICcsJyBkYXRhCiAgICogYGBgYAogICAqCiAgICogd2hlcmUgYHR5cGVgLCBgc3VidHlwZWAsIGBhdHRyaWJ1dGVgIGFuZCBgdmFsdWVgIGFyZSBzcGVjaWZpZWQgaW4gUkZDLTIwNDUsCiAgICogYW5kIGBkYXRhYCBpcyBhIHNlcXVlbmNlIG9mIFVSSS1jaGFyYWN0ZXJzIChSRkMtMjM5NiBgdXJpY2ApLgogICAqCiAgICogVGhpcyBtZWFucyB0aGF0IGFsbCB0aGUgY2hhcmFjdGVycyBtdXN0IGJlIEFTQ0lJLCBidXQgdGhlIFVSSSBtYXkgY29udGFpbgogICAqIHBlcmNlbnQtZXNjYXBlcyBmb3Igbm9uLUFTQ0lJIGJ5dGUgdmFsdWVzIHRoYXQgbmVlZCBhbiBpbnRlcnByZXRhdGlvbgogICAqIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuCiAgICoKICAgKiBQYXJzaW5nIGNoZWNrcyB0aGF0IEJhc2U2NCBlbmNvZGVkIGRhdGEgaXMgdmFsaWQsIGFuZCBpdCBub3JtYWxpemVzIGl0CiAgICogdG8gdXNlIHRoZSBkZWZhdWx0IEJhc2U2NCBhbHBoYWJldCBhbmQgdG8gdXNlIHBhZGRpbmcuCiAgICogTm9uLUJhc2U2NCBkYXRhIGlzIGVzY2FwZWQgdXNpbmcgcGVyY2VudC1lc2NhcGVzIGFzIG5lY2Vzc2FyeSB0byBtYWtlCiAgICogaXQgdmFsaWQsIGFuZCBleGlzdGluZyBlc2NhcGVzIGFyZSBjYXNlIG5vcm1hbGl6ZWQuCiAgICoKICAgKiBBY2Nlc3NpbmcgdGhlIGluZGl2aWR1YWwgcGFydHMgbWF5IGZhaWwgbGF0ZXIgaWYgdGhleSB0dXJuIG91dCB0byBoYXZlCiAgICogY29udGVudCB0aGF0IGNhbid0IGJlIGRlY29kZWQgc3VjY2Vzc2Z1bGx5IGFzIGEgc3RyaW5nLCBmb3IgZXhhbXBsZSBpZgogICAqIGV4aXN0aW5nIHBlcmNlbnQgZXNjYXBlcyByZXByZXNlbnQgYnl0ZXMgdGhhdCBjYW5ub3QgYmUgZGVjb2RlZAogICAqIGJ5IHRoZSBjaG9zZW4gW0VuY29kaW5nXSAoc2VlIFtjb250ZW50QXNTdHJpbmddKS4KICAgKgogICAqIEEgW0Zvcm1hdEV4Y2VwdGlvbl0gaXMgdGhyb3duIGlmIFt1cmldIGlzIG5vdCBhIHZhbGlkIGRhdGEgVVJJLgogICAqLwogIHN0YXRpYyBVcmlEYXRhIHBhcnNlKFN0cmluZyB1cmkpIHsKICAgIGlmICh1cmkubGVuZ3RoID49IDUpIHsKICAgICAgaW50IGRhdGFEZWx0YSA9IF9zdGFydHNXaXRoRGF0YSh1cmksIDApOwogICAgICBpZiAoZGF0YURlbHRhID09IDApIHsKICAgICAgICAvLyBFeGFjdCBtYXRjaCBvbiAiZGF0YToiLgogICAgICAgIHJldHVybiBfcGFyc2UodXJpLCA1LCBudWxsKTsKICAgICAgfQogICAgICBpZiAoZGF0YURlbHRhID09IDB4MjApIHsKICAgICAgICAvLyBTdGFydHMgd2l0aCBhIG5vbi1ub3JtYWxpemVkICJkYXRhIiBzY2hlbWUgY29udGFpbmluZyB1cHBlci1jYXNlCiAgICAgICAgLy8gbGV0dGVycy4gUGFyc2UgYW55d2F5LCBidXQgdGhyb3cgYXdheSB0aGUgc2NoZW1lLgogICAgICAgIHJldHVybiBfcGFyc2UodXJpLnN1YnN0cmluZyg1KSwgMCwgbnVsbCk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiRG9lcyBub3Qgc3RhcnQgd2l0aCAnZGF0YTonIiwgdXJpLCAwKTsKICB9CgogIC8qKgogICAqIFRoZSBbVXJpXSB0aGF0IHRoaXMgYFVyaURhdGFgIGlzIGdpdmluZyBhY2Nlc3MgdG8uCiAgICoKICAgKiBSZXR1cm5zIGEgYFVyaWAgd2l0aCBzY2hlbWUgYGRhdGFgIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBkYXRhIFVSSQogICAqIGFzIHBhdGguCiAgICovCiAgVXJpIGdldCB1cmkgewogICAgaWYgKF91cmlDYWNoZSAhPSBudWxsKSByZXR1cm4gX3VyaUNhY2hlOwogICAgU3RyaW5nIHBhdGggPSBfdGV4dDsKICAgIFN0cmluZyBxdWVyeTsKICAgIGludCBjb2xvbkluZGV4ID0gX3NlcGFyYXRvckluZGljZXNbMF07CiAgICBpbnQgcXVlcnlJbmRleCA9IF90ZXh0LmluZGV4T2YoJz8nLCBjb2xvbkluZGV4ICsgMSk7CiAgICBpbnQgZW5kID0gX3RleHQubGVuZ3RoOwogICAgaWYgKHF1ZXJ5SW5kZXggPj0gMCkgewogICAgICBxdWVyeSA9IF9VcmkuX25vcm1hbGl6ZU9yU3Vic3RyaW5nKAogICAgICAgICAgX3RleHQsIHF1ZXJ5SW5kZXggKyAxLCBlbmQsIF9VcmkuX3F1ZXJ5Q2hhclRhYmxlKTsKICAgICAgZW5kID0gcXVlcnlJbmRleDsKICAgIH0KICAgIHBhdGggPSBfVXJpLl9ub3JtYWxpemVPclN1YnN0cmluZygKICAgICAgICBfdGV4dCwgY29sb25JbmRleCArIDEsIGVuZCwgX1VyaS5fcGF0aENoYXJPclNsYXNoVGFibGUpOwogICAgX3VyaUNhY2hlID0gX0RhdGFVcmkodGhpcywgcGF0aCwgcXVlcnkpOwogICAgcmV0dXJuIF91cmlDYWNoZTsKICB9CgogIC8qKgogICAqIFRoZSBNSU1FIHR5cGUgb2YgdGhlIGRhdGEgVVJJLgogICAqCiAgICogQSBkYXRhIFVSSSBjb25zaXN0cyBvZiBhICJtZWRpYSB0eXBlIiBmb2xsb3dlZCBieSBkYXRhLgogICAqIFRoZSBtZWRpYSB0eXBlIHN0YXJ0cyB3aXRoIGEgTUlNRSB0eXBlIGFuZCBjYW4gYmUgZm9sbG93ZWQgYnkKICAgKiBleHRyYSBwYXJhbWV0ZXJzLgogICAqIElmIHRoZSBNSU1FIHR5cGUgcmVwcmVzZW50YXRpb24gaW4gdGhlIFVSSSB0ZXh0IGNvbnRhaW5zIFVSSSBlc2NhcGVzLAogICAqIHRoZXkgYXJlIHVuZXNjYXBlZCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLgogICAqIElmIHRoZSB2YWx1ZSBjb250YWluIG5vbi1BU0NJSSBwZXJjZW50IGVzY2FwZXMsIHRoZXkgYXJlIGRlY29kZWQgYXMgVVRGLTguCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIGRhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LEhlbGxvJTIwV29ybGQhCiAgICoKICAgKiBUaGlzIGRhdGEgVVJJIGhhcyB0aGUgbWVkaWEgdHlwZSBgdGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04YCwgd2hpY2ggaXMgdGhlCiAgICogTUlNRSB0eXBlIGB0ZXh0L3BsYWluYCB3aXRoIHRoZSBwYXJhbWV0ZXIgYGNoYXJzZXRgIHdpdGggdmFsdWUgYHV0Zi04YC4KICAgKiBTZWUgW1JGQyAyMDQ1XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjA0NSkgZm9yIG1vcmUgZGV0YWlsLgogICAqCiAgICogSWYgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRhdGEgVVJJIGlzIGVtcHR5LCBpdCBkZWZhdWx0cyB0byBgdGV4dC9wbGFpbmAuCiAgICovCiAgU3RyaW5nIGdldCBtaW1lVHlwZSB7CiAgICBpbnQgc3RhcnQgPSBfc2VwYXJhdG9ySW5kaWNlc1swXSArIDE7CiAgICBpbnQgZW5kID0gX3NlcGFyYXRvckluZGljZXNbMV07CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gInRleHQvcGxhaW4iOwogICAgcmV0dXJuIF9VcmkuX3VyaURlY29kZShfdGV4dCwgc3RhcnQsIGVuZCwgdXRmOCwgZmFsc2UpOwogIH0KCiAgLyoqCiAgICogVGhlIGNoYXJzZXQgcGFyYW1ldGVyIG9mIHRoZSBtZWRpYSB0eXBlLgogICAqCiAgICogSWYgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1lZGlhIHR5cGUgY29udGFpbnMgYSBgY2hhcnNldGAgcGFyYW1ldGVyCiAgICogdGhlbiB0aGlzIHJldHVybnMgaXRzIHZhbHVlLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgVVMtQVNDSUlgLAogICAqIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGRhdGEgVVJJcy4KICAgKiBJZiB0aGUgdmFsdWUgY29udGFpbiBub24tQVNDSUkgcGVyY2VudCBlc2NhcGVzLCB0aGV5IGFyZSBkZWNvZGVkIGFzIFVURi04LgogICAqCiAgICogSWYgdGhlIE1JTUUgdHlwZSByZXByZXNlbnRhdGlvbiBpbiB0aGUgVVJJIHRleHQgY29udGFpbnMgVVJJIGVzY2FwZXMsCiAgICogdGhleSBhcmUgdW5lc2NhcGVkIGluIHRoZSByZXR1cm5lZCBzdHJpbmcuCiAgICovCiAgU3RyaW5nIGdldCBjaGFyc2V0IHsKICAgIGludCBwYXJhbWV0ZXJTdGFydCA9IDE7CiAgICBpbnQgcGFyYW1ldGVyRW5kID0gX3NlcGFyYXRvckluZGljZXMubGVuZ3RoIC0gMTsgLy8gVGhlICcsJyBiZWZvcmUgZGF0YS4KICAgIGlmIChpc0Jhc2U2NCkgewogICAgICAvLyBUaGVyZSBpcyBhICI7YmFzZTY0IiBzZXBhcmF0b3IsIHNvIHN1YnRyYWN0IG9uZSBmb3IgdGhhdCBhcyB3ZWxsLgogICAgICBwYXJhbWV0ZXJFbmQgLT0gMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBwYXJhbWV0ZXJTdGFydDsgaSA8IHBhcmFtZXRlckVuZDsgaSArPSAyKSB7CiAgICAgIHZhciBrZXlTdGFydCA9IF9zZXBhcmF0b3JJbmRpY2VzW2ldICsgMTsKICAgICAgdmFyIGtleUVuZCA9IF9zZXBhcmF0b3JJbmRpY2VzW2kgKyAxXTsKICAgICAgaWYgKGtleUVuZCA9PSBrZXlTdGFydCArIDcgJiYgX3RleHQuc3RhcnRzV2l0aCgiY2hhcnNldCIsIGtleVN0YXJ0KSkgewogICAgICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUoCiAgICAgICAgICAgIF90ZXh0LCBrZXlFbmQgKyAxLCBfc2VwYXJhdG9ySW5kaWNlc1tpICsgMl0sIHV0ZjgsIGZhbHNlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICJVUy1BU0NJSSI7CiAgfQoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBkYXRhIGlzIEJhc2U2NCBlbmNvZGVkIG9yIG5vdC4KICAgKi8KICBib29sIGdldCBpc0Jhc2U2NCA9PiBfc2VwYXJhdG9ySW5kaWNlcy5sZW5ndGguaXNPZGQ7CgogIC8qKgogICAqIFRoZSBjb250ZW50IHBhcnQgb2YgdGhlIGRhdGEgVVJJLCBhcyBpdHMgYWN0dWFsIHJlcHJlc2VudGF0aW9uLgogICAqCiAgICogVGhpcyBzdHJpbmcgbWF5IGNvbnRhaW4gcGVyY2VudCBlc2NhcGVzLgogICAqLwogIFN0cmluZyBnZXQgY29udGVudFRleHQgPT4gX3RleHQuc3Vic3RyaW5nKF9zZXBhcmF0b3JJbmRpY2VzLmxhc3QgKyAxKTsKCiAgLyoqCiAgICogVGhlIGNvbnRlbnQgcGFydCBvZiB0aGUgZGF0YSBVUkkgYXMgYnl0ZXMuCiAgICoKICAgKiBJZiB0aGUgZGF0YSBpcyBCYXNlNjQgZW5jb2RlZCwgaXQgd2lsbCBiZSBkZWNvZGVkIHRvIGJ5dGVzLgogICAqCiAgICogSWYgdGhlIGRhdGEgaXMgbm90IEJhc2U2NCBlbmNvZGVkLCBpdCB3aWxsIGJlIGRlY29kZWQgYnkgdW5lc2NhcGluZwogICAqIHBlcmNlbnQtZXNjYXBlZCBjaGFyYWN0ZXJzIGFuZCByZXR1cm5pbmcgYnl0ZSB2YWx1ZXMgb2YgZWFjaCB1bmVzY2FwZWQKICAgKiBjaGFyYWN0ZXIuIFRoZSBieXRlcyB3aWxsIG5vdCBiZSwgZS5nLiwgVVRGLTggZGVjb2RlZC4KICAgKi8KICBVaW50OExpc3QgY29udGVudEFzQnl0ZXMoKSB7CiAgICBTdHJpbmcgdGV4dCA9IF90ZXh0OwogICAgaW50IHN0YXJ0ID0gX3NlcGFyYXRvckluZGljZXMubGFzdCArIDE7CiAgICBpZiAoaXNCYXNlNjQpIHsKICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVyLmNvbnZlcnQodGV4dCwgc3RhcnQpOwogICAgfQoKICAgIC8vIE5vdCBiYXNlNjQsIGRvIHBlcmNlbnQtZGVjb2RpbmcgYW5kIHJldHVybiB0aGUgcmVtYWluaW5nIGJ5dGVzLgogICAgLy8gQ29tcHV0ZSByZXN1bHQgc2l6ZS4KICAgIGNvbnN0IGludCBwZXJjZW50ID0gMHgyNTsKICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCAtIHN0YXJ0OwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY29kZVVuaXQgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjb2RlVW5pdCA9PSBwZXJjZW50KSB7CiAgICAgICAgaSArPSAyOwogICAgICAgIGxlbmd0aCAtPSAyOwogICAgICB9CiAgICB9CiAgICAvLyBGaWxsIHJlc3VsdCBhcnJheS4KICAgIFVpbnQ4TGlzdCByZXN1bHQgPSBVaW50OExpc3QobGVuZ3RoKTsKICAgIGlmIChsZW5ndGggPT0gdGV4dC5sZW5ndGgpIHsKICAgICAgcmVzdWx0LnNldFJhbmdlKDAsIGxlbmd0aCwgdGV4dC5jb2RlVW5pdHMsIHN0YXJ0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGludCBpbmRleCA9IDA7CiAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjb2RlVW5pdCA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgaWYgKGNvZGVVbml0ICE9IHBlcmNlbnQpIHsKICAgICAgICByZXN1bHRbaW5kZXgrK10gPSBjb2RlVW5pdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaSArIDIgPCB0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgaW50IGJ5dGUgPSBwYXJzZUhleEJ5dGUodGV4dCwgaSArIDEpOwogICAgICAgICAgaWYgKGJ5dGUgPj0gMCkgewogICAgICAgICAgICByZXN1bHRbaW5kZXgrK10gPSBieXRlOwogICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgcGVyY2VudCBlc2NhcGUiLCB0ZXh0LCBpKTsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGluZGV4ID09IHJlc3VsdC5sZW5ndGgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8qKgogICAqIFJldHVybnMgYSBzdHJpbmcgY3JlYXRlZCBmcm9tIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIFVSSS4KICAgKgogICAqIElmIHRoZSBjb250ZW50IGlzIEJhc2U2NCBlbmNvZGVkLCBpdCB3aWxsIGJlIGRlY29kZWQgdG8gYnl0ZXMgYW5kIHRoZW4KICAgKiBkZWNvZGVkIHRvIGEgc3RyaW5nIHVzaW5nIFtlbmNvZGluZ10uCiAgICogSWYgZW5jb2RpbmcgaXMgb21pdHRlZCwgdGhlIHZhbHVlIG9mIGEgYGNoYXJzZXRgIHBhcmFtZXRlciBpcyB1c2VkCiAgICogaWYgaXQgaXMgcmVjb2duaXplZCBieSBbRW5jb2RpbmcuZ2V0QnlOYW1lXSwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIHRvCiAgICogdGhlIFthc2NpaV0gZW5jb2RpbmcsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciBkYXRhIFVSSXMKICAgKiB0aGF0IGRvIG5vdCBzcGVjaWZ5IGFuIGVuY29kaW5nLgogICAqCiAgICogSWYgdGhlIGNvbnRlbnQgaXMgbm90IEJhc2U2NCBlbmNvZGVkLCBpdCB3aWxsIGZpcnN0IGhhdmUgcGVyY2VudC1lc2NhcGVzCiAgICogY29udmVydGVkIHRvIGJ5dGVzIGFuZCB0aGVuIHRoZSBjaGFyYWN0ZXIgY29kZXMgYW5kIGJ5dGUgdmFsdWVzIGFyZQogICAqIGRlY29kZWQgdXNpbmcgW2VuY29kaW5nXS4KICAgKi8KICBTdHJpbmcgY29udGVudEFzU3RyaW5nKHtFbmNvZGluZyBlbmNvZGluZ30pIHsKICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CiAgICAgIHZhciBjaGFyc2V0ID0gdGhpcy5jaGFyc2V0OyAvLyBSZXR1cm5zICJVUy1BU0NJSSIgaWYgbm90IHByZXNlbnQuCiAgICAgIGVuY29kaW5nID0gRW5jb2RpbmcuZ2V0QnlOYW1lKGNoYXJzZXQpOwogICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewogICAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIlVua25vd24gY2hhcnNldDogJGNoYXJzZXQiKTsKICAgICAgfQogICAgfQogICAgU3RyaW5nIHRleHQgPSBfdGV4dDsKICAgIGludCBzdGFydCA9IF9zZXBhcmF0b3JJbmRpY2VzLmxhc3QgKyAxOwogICAgaWYgKGlzQmFzZTY0KSB7CiAgICAgIHZhciBjb252ZXJ0ZXIgPSBiYXNlNjQuZGVjb2Rlci5mdXNlKGVuY29kaW5nLmRlY29kZXIpOwogICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQodGV4dC5zdWJzdHJpbmcoc3RhcnQpKTsKICAgIH0KICAgIHJldHVybiBfVXJpLl91cmlEZWNvZGUodGV4dCwgc3RhcnQsIHRleHQubGVuZ3RoLCBlbmNvZGluZywgZmFsc2UpOwogIH0KCiAgLyoqCiAgICogQSBtYXAgcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZWRpYSB0eXBlLgogICAqCiAgICogQSBkYXRhIFVSSSBtYXkgY29udGFpbiBwYXJhbWV0ZXJzIGJldHdlZW4gdGhlIE1JTUUgdHlwZSBhbmQgdGhlCiAgICogZGF0YS4gVGhpcyBjb252ZXJ0cyB0aGVzZSBwYXJhbWV0ZXJzIHRvIGEgbWFwIGZyb20gcGFyYW1ldGVyIG5hbWUKICAgKiB0byBwYXJhbWV0ZXIgdmFsdWUuCiAgICogVGhlIG1hcCBvbmx5IGNvbnRhaW5zIHBhcmFtZXRlcnMgdGhhdCBhY3R1YWxseSBvY2N1ciBpbiB0aGUgVVJJLgogICAqIFRoZSBgY2hhcnNldGAgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUgZXZlbiBpZiBpdCBkb2Vzbid0IG9jY3VyCiAgICogaW4gdGhlIFVSSSwgd2hpY2ggaXMgcmVmbGVjdGVkIGJ5IHRoZSBbY2hhcnNldF0gZ2V0dGVyLiBUaGlzIG1lYW5zIHRoYXQKICAgKiBbY2hhcnNldF0gbWF5IHJldHVybiBhIHZhbHVlIGV2ZW4gaWYgYHBhcmFtZXRlcnNbImNoYXJzZXQiXWAgaXMgYG51bGxgLgogICAqCiAgICogSWYgdGhlIHZhbHVlcyBjb250YWluIG5vbi1BU0NJSSB2YWx1ZXMgb3IgcGVyY2VudCBlc2NhcGVzLAogICAqIHRoZXkgYXJlIGRlY29kZWQgYXMgVVRGLTguCiAgICovCiAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgcGFyYW1ldGVycyB7CiAgICB2YXIgcmVzdWx0ID0gPFN0cmluZywgU3RyaW5nPnt9OwogICAgZm9yIChpbnQgaSA9IDM7IGkgPCBfc2VwYXJhdG9ySW5kaWNlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICB2YXIgc3RhcnQgPSBfc2VwYXJhdG9ySW5kaWNlc1tpIC0gMl0gKyAxOwogICAgICB2YXIgZXF1YWxzID0gX3NlcGFyYXRvckluZGljZXNbaSAtIDFdOwogICAgICB2YXIgZW5kID0gX3NlcGFyYXRvckluZGljZXNbaV07CiAgICAgIFN0cmluZyBrZXkgPSBfVXJpLl91cmlEZWNvZGUoX3RleHQsIHN0YXJ0LCBlcXVhbHMsIHV0ZjgsIGZhbHNlKTsKICAgICAgU3RyaW5nIHZhbHVlID0gX1VyaS5fdXJpRGVjb2RlKF90ZXh0LCBlcXVhbHMgKyAxLCBlbmQsIHV0ZjgsIGZhbHNlKTsKICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgVXJpRGF0YSBfcGFyc2UoU3RyaW5nIHRleHQsIGludCBzdGFydCwgVXJpIHNvdXJjZVVyaSkgewogICAgYXNzZXJ0KHN0YXJ0ID09IDAgfHwgc3RhcnQgPT0gNSk7CiAgICBhc3NlcnQoKHN0YXJ0ID09IDUpID09IHRleHQuc3RhcnRzV2l0aCgiZGF0YToiKSk7CgogICAgLy8vIENoYXJhY3RlciBjb2Rlcy4KICAgIGNvbnN0IGludCBjb21tYSA9IDB4MmM7CiAgICBjb25zdCBpbnQgc2xhc2ggPSAweDJmOwogICAgY29uc3QgaW50IHNlbWljb2xvbiA9IDB4M2I7CiAgICBjb25zdCBpbnQgZXF1YWxzID0gMHgzZDsKICAgIExpc3Q8aW50PiBpbmRpY2VzID0gW3N0YXJ0IC0gMV07CiAgICBpbnQgc2xhc2hJbmRleCA9IC0xOwogICAgdmFyIGNoYXI7CiAgICBpbnQgaSA9IHN0YXJ0OwogICAgZm9yICg7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGNoYXIgPSB0ZXh0LmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyID09IGNvbW1hIHx8IGNoYXIgPT0gc2VtaWNvbG9uKSBicmVhazsKICAgICAgaWYgKGNoYXIgPT0gc2xhc2gpIHsKICAgICAgICBpZiAoc2xhc2hJbmRleCA8IDApIHsKICAgICAgICAgIHNsYXNoSW5kZXggPSBpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBNSU1FIHR5cGUiLCB0ZXh0LCBpKTsKICAgICAgfQogICAgfQogICAgaWYgKHNsYXNoSW5kZXggPCAwICYmIGkgPiBzdGFydCkgewogICAgICAvLyBBbiBlbXB0eSBNSU1FIHR5cGUgaXMgYWxsb3dlZCwgYnV0IGlmIG5vbi1lbXB0eSBpdCBtdXN0IGNvbnRhaW4KICAgICAgLy8gZXhhY3RseSBvbmUgc2xhc2guCiAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBNSU1FIHR5cGUiLCB0ZXh0LCBpKTsKICAgIH0KICAgIHdoaWxlIChjaGFyICE9IGNvbW1hKSB7CiAgICAgIC8vIFBhcnNlIHBhcmFtZXRlcnMgYW5kL29yICJiYXNlNjQiLgogICAgICBpbmRpY2VzLmFkZChpKTsKICAgICAgaSsrOwogICAgICBpbnQgZXF1YWxzSW5kZXggPSAtMTsKICAgICAgZm9yICg7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2hhciA9IHRleHQuY29kZVVuaXRBdChpKTsKICAgICAgICBpZiAoY2hhciA9PSBlcXVhbHMpIHsKICAgICAgICAgIGlmIChlcXVhbHNJbmRleCA8IDApIGVxdWFsc0luZGV4ID0gaTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gc2VtaWNvbG9uIHx8IGNoYXIgPT0gY29tbWEpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZXF1YWxzSW5kZXggPj0gMCkgewogICAgICAgIGluZGljZXMuYWRkKGVxdWFsc0luZGV4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBIYXZlIHRvIGJlIGZpbmFsICJiYXNlNjQiLgogICAgICAgIHZhciBsYXN0U2VwYXJhdG9yID0gaW5kaWNlcy5sYXN0OwogICAgICAgIGlmIChjaGFyICE9IGNvbW1hIHx8CiAgICAgICAgICAgIGkgIT0gbGFzdFNlcGFyYXRvciArIDcgLyogImJhc2U2NCwiLmxlbmd0aCAqLyB8fAogICAgICAgICAgICAhdGV4dC5zdGFydHNXaXRoKCJiYXNlNjQiLCBsYXN0U2VwYXJhdG9yICsgMSkpIHsKICAgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigiRXhwZWN0aW5nICc9JyIsIHRleHQsIGkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaW5kaWNlcy5hZGQoaSk7CiAgICBib29sIGlzQmFzZTY0ID0gaW5kaWNlcy5sZW5ndGguaXNPZGQ7CiAgICBpZiAoaXNCYXNlNjQpIHsKICAgICAgdGV4dCA9IGJhc2U2NC5ub3JtYWxpemUodGV4dCwgaSArIDEsIHRleHQubGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFZhbGlkYXRlICJkYXRhIiBwYXJ0LCBtdXN0IG9ubHkgY29udGFpbiBSRkMgMjM5NiAndXJpYycgY2hhcmFjdGVycwogICAgICAvLyAocmVzZXJ2ZWQsIHVucmVzZXJ2ZWQsIG9yIGVzY2FwZSBzZXF1ZW5jZXMpLgogICAgICAvLyBOb3JtYWxpemUgdG8gdGhpcyAodGhyb3dzIG9uIGEgZnJhZ21lbnQgc2VwYXJhdG9yKS4KICAgICAgdmFyIGRhdGEgPSBfVXJpLl9ub3JtYWxpemUodGV4dCwgaSArIDEsIHRleHQubGVuZ3RoLCBfdXJpY1RhYmxlLAogICAgICAgICAgZXNjYXBlRGVsaW1pdGVyczogdHJ1ZSk7CiAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlUmFuZ2UoaSArIDEsIHRleHQubGVuZ3RoLCBkYXRhKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFVyaURhdGEuXyh0ZXh0LCBpbmRpY2VzLCBzb3VyY2VVcmkpOwogIH0KCiAgLyoqCiAgICogTGlrZSBbVXJpLl91cmlFbmNvZGVdIGJ1dCB0YWtlcyB0aGUgaW5wdXQgYXMgYnl0ZXMsIG5vdCBhIHN0cmluZy4KICAgKgogICAqIEVuY29kZXMgaW50byBbYnVmZmVyXSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGl0cyBvd24gYnVmZmVyLgogICAqLwogIHN0YXRpYyB2b2lkIF91cmlFbmNvZGVCeXRlcygKICAgICAgTGlzdDxpbnQ+IGNhbm9uaWNhbFRhYmxlLCBMaXN0PGludD4gYnl0ZXMsIFN0cmluZ1NpbmsgYnVmZmVyKSB7CiAgICAvLyBFbmNvZGUgdGhlIHN0cmluZyBpbnRvIGJ5dGVzIHRoZW4gZ2VuZXJhdGUgYW4gQVNDSUkgb25seSBzdHJpbmcKICAgIC8vIGJ5IHBlcmNlbnQgZW5jb2Rpbmcgc2VsZWN0ZWQgYnl0ZXMuCiAgICBpbnQgYnl0ZU9yID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaW50IGJ5dGUgPSBieXRlc1tpXTsKICAgICAgYnl0ZU9yIHw9IGJ5dGU7CiAgICAgIGlmIChieXRlIDwgMTI4ICYmCiAgICAgICAgICAoKGNhbm9uaWNhbFRhYmxlW2J5dGUgPj4gNF0gJiAoMSA8PCAoYnl0ZSAmIDB4MGYpKSkgIT0gMCkpIHsKICAgICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShieXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXIud3JpdGVDaGFyQ29kZShfUEVSQ0VOVCk7CiAgICAgICAgYnVmZmVyLndyaXRlQ2hhckNvZGUoX2hleERpZ2l0cy5jb2RlVW5pdEF0KGJ5dGUgPj4gNCkpOwogICAgICAgIGJ1ZmZlci53cml0ZUNoYXJDb2RlKF9oZXhEaWdpdHMuY29kZVVuaXRBdChieXRlICYgMHgwZikpOwogICAgICB9CiAgICB9CiAgICBpZiAoKGJ5dGVPciAmIH4weEZGKSAhPSAwKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYnl0ZSA9IGJ5dGVzW2ldOwogICAgICAgIGlmIChieXRlIDwgMCB8fCBieXRlID4gMjU1KSB7CiAgICAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yLnZhbHVlKGJ5dGUsICJub24tYnl0ZSB2YWx1ZSIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4KICAgICAgKF9zZXBhcmF0b3JJbmRpY2VzWzBdID09IF9ub1NjaGVtZSkgPyAiZGF0YTokX3RleHQiIDogX3RleHQ7CgogIC8vIFRhYmxlIG9mIHRoZSBgdG9rZW5gIGNoYXJhY3RlcnMgb2YgUkZDIDIwNDUgaW4gYSBVUkkuCiAgLy8KICAvLyBBIHRva2VuIGlzIGFueSBVUy1BU0NJSSBjaGFyYWN0ZXIgZXhjZXB0IFNQQUNFLCBjb250cm9sIGNoYXJhY3RlcnMgYW5kCiAgLy8gYHRzcGVjaWFsYCBjaGFyYWN0ZXJzLiBUaGUgYHRzcGVjaWFsYCBjYXRlZ29yeSBpczoKICAvLyAnKCcsICcpJywgJzwnLCAnPicsICdAJywgJywnLCAnOycsICc6JywgJ1wnLCAnIicsICcvJywgJ1ssICddJywgJz8nLCAnPScuCiAgLy8KICAvLyBJbiBhIGRhdGEgVVJJLCB3ZSBhbHNvIG5lZWQgdG8gZXNjYXBlICclJyBhbmQgJyMnIGNoYXJhY3RlcnMuCiAgc3RhdGljIGNvbnN0IF90b2tlbkNoYXJUYWJsZSA9IFsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwIDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMCAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICEgICQgJicgICAqKyAtLgogICAgMHg2Y2QyLCAvLyAweDIwIC0gMHgyZiAgMDEwMDEwMTEgMDAxMTAxMTAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDAxMjM0NTY3IDg5CiAgICAweDAzZmYsIC8vIDB4MzAgLSAweDNmICAxMTExMTExMSAxMTAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIEFCQ0RFRkcgSElKS0xNTk8KICAgIDB4ZmZmZSwgLy8gMHg0MCAtIDB4NGYgIDAxMTExMTExIDExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBQUVJTVFVWVyBYWVogICBeXwogICAgMHhjN2ZmLCAvLyAweDUwIC0gMHg1ZiAgMTExMTExMTEgMTExMDAwMTEKICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGBhYmNkZWZnIGhpamtsbW5vCiAgICAweGZmZmYsIC8vIDB4NjAgLSAweDZmICAxMTExMTExMSAxMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgcHFyc3R1dncgeHl6e3x9fgogICAgMHg3ZmZmLCAvLyAweDcwIC0gMHg3ZiAgMTExMTExMTEgMTExMTExMTAKICBdOwoKICAvLyBBbGwgbm9uLWVzY2FwZSBSRkMtMjM5NiB1cmljIGNoYXJhY3RlcnMuCiAgLy8KICAvLyAgdXJpYyAgICAgICAgPSAgcmVzZXJ2ZWQgfCB1bnJlc2VydmVkIHwgZXNjYXBlZAogIC8vICByZXNlcnZlZCAgICA9ICAiOyIgfCAiLyIgfCAiPyIgfCAiOiIgfCAiQCIgfCAiJiIgfCAiPSIgfCAiKyIgfCAiJCIgfCAiLCIKICAvLyAgdW5yZXNlcnZlZCAgPSAgYWxwaGFudW0gfCBtYXJrCiAgLy8gIG1hcmsgICAgICAgID0gICItIiB8ICJfIiB8ICIuIiB8ICIhIiB8ICJ+IiB8ICIqIiB8ICInIiB8ICIoIiB8ICIpIgogIC8vCiAgLy8gVGhpcyBpcyB0aGUgc2FtZSBjaGFyYWN0ZXJzIGFzIGluIGEgVVJJIHF1ZXJ5ICh3aGljaCBpcyBVUkkgcGNoYXIgcGx1cyAnPycpCiAgc3RhdGljIGNvbnN0IF91cmljVGFibGUgPSBfVXJpLl9xdWVyeUNoYXJUYWJsZTsKCiAgLy8gQ2hhcmFjdGVycyBhbGxvd2VkIGluIGJhc2UtNjQgZW5jb2RpbmcgKGFscGhhbnVtZXJpYywgJy8nLCAnKycgYW5kICc9JykuCiAgc3RhdGljIGNvbnN0IF9iYXNlNjRUYWJsZSA9IFsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgTFNCICAgICAgICAgICAgIE1TQgogICAgLy8gICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKICAgIDB4MDAwMCwgLy8gMHgwMCAtIDB4MGYgIDAwMDAwMDAwIDAwMDAwMDAwCiAgICAweDAwMDAsIC8vIDB4MTAgLSAweDFmICAwMDAwMDAwMCAwMDAwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIC8KICAgIDB4ODgwMCwgLy8gMHgyMCAtIDB4MmYgIDAwMDAwMDAwIDAwMDEwMDAxCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAwMTIzNDU2NyA4OQogICAgMHgwM2ZmLCAvLyAweDMwIC0gMHgzZiAgMTExMTExMTEgMTEwMDAwMDAKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBBQkNERUZHIEhJSktMTU5PCiAgICAweGZmZmUsIC8vIDB4NDAgLSAweDRmICAwMTExMTExMSAxMTExMTExMQogICAgLy8gICAgICAgICAgICAgICAgICAgICAgUFFSU1RVVlcgWFlaCiAgICAweDA3ZmYsIC8vIDB4NTAgLSAweDVmICAxMTExMTExMSAxMTEwMDAwMAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFiY2RlZmcgaGlqa2xtbm8KICAgIDB4ZmZmZSwgLy8gMHg2MCAtIDB4NmYgIDAxMTExMTExIDExMTExMTExCiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBwcXJzdHV2dyB4eXoKICAgIDB4MDdmZiwgLy8gMHg3MCAtIDB4N2YgIDExMTExMTExIDExMTAwMDAwCiAgXTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29uc3RhbnRzIHVzZWQgdG8gcmVhZCB0aGUgc2Nhbm5lciByZXN1bHQuCi8vIFRoZSBpbmRpY2VzIHBvaW50cyBpbnRvIHRoZSB0YWJsZSBmaWxsZWQgYnkgW19zY2FuXSB3aGljaCBjb250YWlucwovLyByZWNvZ25pemVkIHBvc2l0aW9ucyBpbiB0aGUgc2Nhbm5lZCBVUkkuCi8vIFRoZSBgMGAgaW5kZXggaXMgb25seSB1c2VkIGludGVybmFsbHkuCgovLy8gSW5kZXggb2YgdGhlIHBvc2l0aW9uIG9mIHRoYXQgYDpgIGFmdGVyIGEgc2NoZW1lLgpjb25zdCBpbnQgX3NjaGVtZUVuZEluZGV4ID0gMTsKCi8vLyBJbmRleCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBqdXN0IGJlZm9yZSB0aGUgaG9zdCBuYW1lLgpjb25zdCBpbnQgX2hvc3RTdGFydEluZGV4ID0gMjsKCi8vLyBJbmRleCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGA6YCBiZWZvcmUgYSBwb3J0IHZhbHVlLgpjb25zdCBpbnQgX3BvcnRTdGFydEluZGV4ID0gMzsKCi8vLyBJbmRleCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHBhdGguCmNvbnN0IGludCBfcGF0aFN0YXJ0SW5kZXggPSA0OwoKLy8vIEluZGV4IG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgYD9gIGJlZm9yZSBhIHF1ZXJ5Lgpjb25zdCBpbnQgX3F1ZXJ5U3RhcnRJbmRleCA9IDU7CgovLy8gSW5kZXggb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBgI2AgYmVmb3JlIGEgZnJhZ21lbnQuCmNvbnN0IGludCBfZnJhZ21lbnRTdGFydEluZGV4ID0gNjsKCi8vLyBJbmRleCBvZiBhIHBvc2l0aW9uIHdoZXJlIHRoZSBVUkkgd2FzIGRldGVybWluZWQgdG8gYmUgIm5vbi1zaW1wbGUiLgpjb25zdCBpbnQgX25vdFNpbXBsZUluZGV4ID0gNzsKCi8vIEluaXRpYWwgc3RhdGUgZm9yIHNjYW5uZXIuCmNvbnN0IGludCBfdXJpU3RhcnQgPSAwMDsKCi8vIElmIHNjYW5uaW5nIG9mIGEgVVJJIHRlcm1pbmF0ZXMgaW4gdGhpcyBzdGF0ZSBvciBhYm92ZSwKLy8gY29uc2lkZXIgdGhlIFVSSSBub24tc2ltcGxlCmNvbnN0IGludCBfbm9uU2ltcGxlRW5kU3RhdGVzID0gMTQ7CgovLyBJbml0aWFsIHN0YXRlIGZvciBzY2hlbWUgdmFsaWRhdGlvbi4KY29uc3QgaW50IF9zY2hlbWVTdGFydCA9IDIwOwoKLy8vIFRyYW5zaXRpb24gdGFibGVzIHVzZWQgdG8gc2NhbiBhIFVSSSB0byBkZXRlcm1pbmUgaXRzIHN0cnVjdHVyZS4KLy8vCi8vLyBUaGUgdGFibGVzIHJlcHJlc2VudCBhIHN0YXRlIG1hY2hpbmUgd2l0aCBvdXRwdXQuCi8vLwovLy8gVG8gc2NhbiB0aGUgVVJJLCBzdGFydCBpbiB0aGUgW191cmlTdGFydF0gc3RhdGUsIHRoZW4gcmVhZCBlYWNoIGNoYXJhY3RlcgovLy8gb2YgdGhlIFVSSSBpbiBvcmRlciwgZnJvbSBzdGFydCB0byBlbmQsIGFuZCBmb3IgZWFjaCBjaGFyYWN0ZXIgcGVyZm9ybSBhCi8vLyB0cmFuc2l0aW9uIHRvIGEgbmV3IHN0YXRlIHdoaWxlIHdyaXRpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgb3V0cHV0Ci8vLyBidWZmZXIgYXQgYSBkZXNpZ25hdGVkIGluZGV4LgovLy8KLy8vIEVhY2ggc3RhdGUsIHJlcHJlc2VudGVkIGJ5IGFuIGludGVnZXIgd2hpY2ggaXMgYW4gaW5kZXggaW50bwovLy8gW19zY2FubmVyVGFibGVzXSwgaGFzIGEgc2V0IG9mIHRyYW5zaXRpb25zLCBvbmUgZm9yIGVhY2ggY2hhcmFjdGVyLgovLy8gVGhlIHRyYW5zaXRpb25zIGFyZSBlbmNvZGVkIGFzIGEgNS1iaXQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG5leHQgc3RhdGUKLy8vIGFuZCBhIDMtYml0IGluZGV4IGludG8gdGhlIG91dHB1dCB0YWJsZS4KLy8vCi8vLyBGb3IgVVJJIHNjYW5uaW5nLCBvbmx5IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDAyMCB0aHJvdWdoIFUrMDA3RSBhcmUKLy8vIGludGVyZXN0aW5nLCBhbGwgY2hhcmFjdGVycyBvdXRzaWRlIHRoYXQgcmFuZ2UgYXJlIHRyZWF0ZWQgdGhlIHNhbWUuCi8vLyBUaGUgdGFibGVzIG9ubHkgY29udGFpbiA5NiBlbnRyaWVzLCByZXByZXNlbnRpbmcgdGhhdCBjaGFyYWN0ZXJzIGluIHRoZQovLy8gaW50ZXJlc3RpbmcgcmFuZ2UsIHBsdXMgb25lIG1vcmUgdG8gcmVwcmVzZW50IGFsbCB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UuCi8vLyBUaGUgY2hhcmFjdGVyIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBvbmUgYFVpbnQ4TGlzdGAgcGVyIHN0YXRlLCB3aXRoIHRoZQovLy8gdHJhbnNpdGlvbiBmb3IgYSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gYGNoYXJhY3RlciBeIDB4NjBgLAovLy8gd2hpY2ggbWFwcyB0aGUgcmFuZ2UgVSswMDIwIC4uIFUrMDA3RiBpbnRvIHBvc2l0aW9ucyAwIC4uIDk1LgovLy8gQWxsIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBtYXBwZWQgdG8gcG9zaXRpb24gMzEgKGAweDdmIF4gMHg2MGApIHdoaWNoCi8vLyByZXByZXNlbnRzIHRoZSB0cmFuc2l0aW9uIGZvciBhbGwgcmVtYWluaW5nIGNoYXJhY3RlcnMuCmZpbmFsIExpc3Q8VWludDhMaXN0PiBfc2Nhbm5lclRhYmxlcyA9IF9jcmVhdGVUYWJsZXMoKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29kZSB0byBjcmVhdGUgdGhlIFVSSSBzY2FubmVyIHRhYmxlLgoKLy8vIENyZWF0ZXMgdGhlIHRhYmxlcyBmb3IgW19zY2FubmVyVGFibGVzXSB1c2VkIGJ5IFtVcmkucGFyc2VdLgovLy8KLy8vIFNlZSBbX3NjYW5uZXJUYWJsZXNdIGZvciB0aGUgZ2VuZXJhdGVkIGZvcm1hdC4KLy8vCi8vLyBUaGUgY29uY3JldGUgdGFibGVzIGFyZSBjaG9zZW4gYXMgYSB0cmFkZS1vZmYgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHN0YXRlcwovLy8gbmVlZGVkIGFuZCB0aGUgcHJlY2lzaW9uIG9mIHRoZSByZXN1bHQuCi8vLyBUaGlzIGFsbG93cyBkZWZpbml0ZWx5IHJlY29nbml6aW5nIHRoZSBnZW5lcmFsIHN0cnVjdHVyZSBvZiB0aGUgVVJJCi8vLyAocHJlc2VuY2UgYW5kIGxvY2F0aW9uIG9mIHNjaGVtZSwgdXNlci1pbmZvLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSBhbmQKLy8vIGZyYWdtZW50KSB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIGRldGVjdGluZyB0aGF0IHNvbWUgY29tcG9uZW50cyBhcmUgbm90Ci8vLyBpbiBjYW5vbmljYWwgZm9ybSAoYW55dGhpbmcgY29udGFpbmluZyBhIGAlYCwgYSBob3N0LW5hbWUgY29udGFpbmluZyBhCi8vLyBjYXBpdGFsIGxldHRlcikuIFNpbmNlIHRoZSBzY2FubmVyIGRvZXNuJ3Qga25vdyB3aGV0aGVyIHNvbWV0aGluZyBpcyBhCi8vLyBzY2hlbWUgb3IgYSBwYXRoIHVudGlsIGl0IHNlZXMgYDpgLCBvciB1c2VyLWluZm8gb3IgaG9zdCB1bnRpbCBpdCBzZWVzCi8vLyBhIGBAYCwgYSBzZWNvbmQgcGFzcyBpcyBuZWVkZWQgdG8gdmFsaWRhdGUgdGhlIHNjaGVtZSBhbmQgYW55IHVzZXItaW5mbwovLy8gaXMgY29uc2lkZXJlZCBub24tY2Fub25pY2FsIGJ5IGRlZmF1bHQuCi8vLwovLy8gVGhlIHN0YXRlcyAoc3RhcnRpbmcgZnJvbSBbX3VyaVN0YXJ0XSkgd3JpdGUgcG9zaXRpb25zIHdoaWxlIHNjYW5uaW5nCi8vLyBhIHN0cmluZyBmcm9tIGBzdGFydGAgdG8gYGVuZGAgYXMgZm9sbG93czoKLy8vCi8vLyAtIFtfc2NoZW1lRW5kSW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYHN0YXJ0LTFgLgovLy8gICBJZiB0aGUgVVJJIGhhcyBhIHNjaGVtZSwgaXQgaXMgc2V0IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgYDpgIGFmdGVyCi8vLyAgIHRoZSBzY2hlbWUuCi8vLyAtIFtfaG9zdFN0YXJ0SW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYHN0YXJ0IC0gMWAuCi8vLyAgIElmIHRoZSBVUkkgaGFzIGFuIGF1dGhvcml0eSwgaXQgaXMgc2V0IHRvIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZQovLy8gICBob3N0IG5hbWUgLSBlaXRoZXIgdGhlIHNlY29uZCBgL2AgaW4gdGhlIGAvL2AgbGVhZGluZyB0aGUgYXV0aG9yaXR5LAovLy8gICBvciB0aGUgYEBgIGFmdGVyIGEgdXNlci1pbmZvLiBDb21wYXJpbmcgdGhpcyB2YWx1ZSB0byB0aGUgc2NoZW1lIGVuZAovLy8gICBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBkZXRlY3QgdGhhdCB0aGVyZSBpcyBhIHVzZXItaW5mbyBjb21wb25lbnQuCi8vLyAtIFtfcG9ydFN0YXJ0SW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYHN0YXJ0YC4KLy8vICAgU2V0IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBgOmAgaW4gYW4gYXV0aG9yaXR5LCBhbmQgdW5jaGFuZ2VkCi8vLyAgIGlmIHRoZXJlIGlzIG5vIGF1dGhvcml0eSBvciBubyBgOmAgaW4gYW4gYXV0aG9yaXR5LgovLy8gICBJZiB0aGlzIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBob3N0IHN0YXJ0LCB0aGVyZSBpcyBhIHBvcnQsIG90aGVyd2lzZSBpdAovLy8gICBpcyBqdXN0IG1hcmtpbmcgYSBjb2xvbiBpbiB0aGUgdXNlci1pbmZvIGNvbXBvbmVudC4KLy8vIC0gW19wYXRoU3RhcnRJbmRleF06IFNob3VsZCBiZSBpbml0aWFsaXplZCB0byBgc3RhcnRgLgovLy8gICBJcyBzZXQgdG8gdGhlIGZpcnN0IHBhdGggY2hhcmFjdGVyIHVubGVzcyB0aGUgcGF0aCBpcyBlbXB0eS4KLy8vICAgSWYgdGhlIHBhdGggaXMgZW1wdHksIHRoZSBwb3NpdGlvbiBpcyBlaXRoZXIgdW5jaGFuZ2VkIChgc3RhcnRgKSBvcgovLy8gICB0aGUgZmlyc3Qgc2xhc2ggb2YgYW4gYXV0aG9yaXR5LiBTbywgaWYgdGhlIHBhdGggc3RhcnQgaXMgYmVmb3JlIGEKLy8vICAgaG9zdCBzdGFydCBvciBzY2hlbWUgZW5kLCB0aGUgcGF0aCBpcyBlbXB0eS4KLy8vIC0gW19xdWVyeVN0YXJ0SW5kZXhdOiBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gYGVuZGAuCi8vLyAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgYD9gIGxlYWRpbmcgYSBxdWVyeSBpZiB0aGUgVVJJIGNvbnRhaW5zIGEgcXVlcnkuCi8vLyAtIFtfZnJhZ21lbnRTdGFydEluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBlbmRgLgovLy8gICBUaGUgcG9zaXRpb24gb2YgdGhlIGAjYCBsZWFkaW5nIGEgZnJhZ21lbnQgaWYgdGhlIFVSSSBjb250YWlucyBhIGZyYWdtZW50LgovLy8gLSBbX25vdFNpbXBsZUluZGV4XTogU2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBzdGFydCAtIDFgLgovLy8gICBTZXQgdG8gYW5vdGhlciB2YWx1ZSBpZiB0aGUgVVJJIGlzIGNvbnNpZGVyZWQgIm5vdCBzaW1wbGUiLgovLy8gICBUaGlzIGlzIGVsYWJvcmF0ZWQgYmVsb3cuCi8vLwovLy8gIyBTaW1wbGUgVVJJcwovLy8gQSBVUkkgaXMgY29uc2lkZXJlZCAic2ltcGxlIiBpZiBpdCBpcyBpbiBhIG5vcm1hbGl6ZWQgZm9ybSBjb250YWluaW5nIG5vCi8vLyBlc2NhcGVzLiBUaGlzIGFsbG93cyB1cyB0byBza2lwIG5vcm1hbGl6YXRpb24gYW5kIGNoZWNraW5nIHdoZXRoZXIgZXNjYXBlcwovLy8gYXJlIHZhbGlkLCBhbmQgdG8gZXh0cmFjdCBjb21wb25lbnRzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdW5lc2NhcGluZy4KLy8vCi8vLyBUaGUgc2Nhbm5lciBjb21wdXRlcyBhIGNvbnNlcnZhdGl2ZSBhcHByb3hpbWF0aW9uIG9mIGJlaW5nICJzaW1wbGUiLgovLy8gSXQgcmVqZWN0cyBhbnkgVVJJIHdpdGggYW4gZXNjYXBlLCB3aXRoIGEgdXNlci1pbmZvIGNvbXBvbmVudCAobWFpbmx5Ci8vLyBiZWNhdXNlIHRoZXkgYXJlIHJhcmUgYW5kIHdvdWxkIGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc3RhdGVzIGluIHRoZQovLy8gc2Nhbm5lciBzaWduaWZpY2FudGx5KSwgd2l0aCBhbiBJUFY2IGhvc3Qgb3Igd2l0aCBhIGNhcGl0YWwgbGV0dGVyIGluCi8vLyB0aGUgc2NoZW1lIG9yIGhvc3QgbmFtZSAodGhlIHNjaGVtZSBpcyBoYW5kbGVkIGluIGEgc2Vjb25kIHNjYW4gdXNpbmcKLy8vIGEgc2VwYXJhdGUgdHdvLXN0YXRlIHRhYmxlKS4KLy8vIEZ1cnRoZXIsIHBhdGhzIGNvbnRhaW5pbmcgYC4uYCBvciBgLmAgcGF0aCBzZWdtZW50cyBhcmUgY29uc2lkZXJlZAovLy8gbm9uLXNpbXBsZSBleGNlcHQgZm9yIHB1cmUgcmVsYXRpdmUgcGF0aHMgKG5vIHNjaGVtZSBvciBhdXRob3JpdHkpIHN0YXJ0aW5nCi8vLyB3aXRoIGEgc2VxdWVuY2Ugb2YgIi4uLyIgc2VnbWVudHMuCi8vLwovLy8gVGhlIHRyYW5zaXRpb24gdGFibGVzIGNhbm5vdCBkZXRlY3QgYSB0cmFpbGluZyAiLi4iIGluIHRoZSBwYXRoLAovLy8gZm9sbG93ZWQgYnkgYSBxdWVyeSBvciBmcmFnbWVudCwgYmVjYXVzZSB0aGUgc2VnbWVudCBpcyBub3Qga25vd24gdG8gYmUKLy8vIGNvbXBsZXRlIHVudGlsIHdlIGFyZSBwYXN0IGl0LCBhbmQgd2UgdGhlbiBuZWVkIHRvIHN0b3JlIHRoZSBxdWVyeS9mcmFnbWVudAovLy8gc3RhcnQgaW5zdGVhZC4gVGhpcyBjYXN0IGlzIGNoZWNrZWQgbWFudWFsbHkgcG9zdC1zY2FubmluZyAoc3VjaCBhIHBhdGgKLy8vIG5lZWRzIHRvIGJlIG5vcm1hbGl6ZWQgdG8gZW5kIGluICIuLi8iLCBzbyB0aGUgVVJJIHNob3VsZG4ndCBiZSBjb25zaWRlcmVkCi8vLyBzaW1wbGUpLgpMaXN0PFVpbnQ4TGlzdD4gX2NyZWF0ZVRhYmxlcygpIHsKICAvLyBUT0RPKGxybik6IFVzZSBhIHByZWNvbXB1dGVkIHRhYmxlLgoKICAvLyBUb3RhbCBudW1iZXIgb2Ygc3RhdGVzIGZvciB0aGUgc2Nhbm5lci4KICBjb25zdCBpbnQgc3RhdGVDb3VudCA9IDIyOwoKICAvLyBTdGF0ZXMgdXNlZCB0byBzY2FuIGEgVVJJIGZyb20gc2NyYXRjaC4KICBjb25zdCBpbnQgc2NoZW1lT3JQYXRoID0gMDE7CiAgY29uc3QgaW50IGF1dGhPclBhdGggPSAwMjsKICBjb25zdCBpbnQgYXV0aE9yUGF0aFNsYXNoID0gMDM7CiAgY29uc3QgaW50IHVpbmZvT3JIb3N0MCA9IDA0OwogIGNvbnN0IGludCB1aW5mb09ySG9zdCA9IDA1OwogIGNvbnN0IGludCB1aW5mb09yUG9ydDAgPSAwNjsKICBjb25zdCBpbnQgdWluZm9PclBvcnQgPSAwNzsKICBjb25zdCBpbnQgaXB2Nkhvc3QgPSAwODsKICBjb25zdCBpbnQgcmVsUGF0aFNlZyA9IDA5OwogIGNvbnN0IGludCBwYXRoU2VnID0gMTA7CiAgY29uc3QgaW50IHBhdGggPSAxMTsKICBjb25zdCBpbnQgcXVlcnkgPSAxMjsKICBjb25zdCBpbnQgZnJhZ21lbnQgPSAxMzsKICBjb25zdCBpbnQgc2NoZW1lT3JQYXRoRG90ID0gMTQ7CiAgY29uc3QgaW50IHNjaGVtZU9yUGF0aERvdDIgPSAxNTsKICBjb25zdCBpbnQgcmVsUGF0aFNlZ0RvdCA9IDE2OwogIGNvbnN0IGludCByZWxQYXRoU2VnRG90MiA9IDE3OwogIGNvbnN0IGludCBwYXRoU2VnRG90ID0gMTg7CiAgY29uc3QgaW50IHBhdGhTZWdEb3QyID0gMTk7CgogIC8vIFN0YXRlcyB1c2VkIHRvIHZhbGlkYXRlIGEgc2NoZW1lIGFmdGVyIGl0cyBlbmQgcG9zaXRpb24gaGFzIGJlZW4gZm91bmQuCiAgY29uc3QgaW50IHNjaGVtZTAgPSBfc2NoZW1lU3RhcnQ7CiAgY29uc3QgaW50IHNjaGVtZSA9IDIxOwoKICAvLyBDb25zdGFudHMgZW5jb2RpbmcgdGhlIHdyaXRlLWluZGV4IGZvciB0aGUgc3RhdGUgdHJhbnNpdGlvbiBpbnRvIHRoZSB0b3AgNQogIC8vIGJpdHMgb2YgYSBieXRlLgogIGNvbnN0IGludCBzY2hlbWVFbmQgPSBfc2NoZW1lRW5kSW5kZXggPDwgNTsKICBjb25zdCBpbnQgaG9zdFN0YXJ0ID0gX2hvc3RTdGFydEluZGV4IDw8IDU7CiAgY29uc3QgaW50IHBvcnRTdGFydCA9IF9wb3J0U3RhcnRJbmRleCA8PCA1OwogIGNvbnN0IGludCBwYXRoU3RhcnQgPSBfcGF0aFN0YXJ0SW5kZXggPDwgNTsKICBjb25zdCBpbnQgcXVlcnlTdGFydCA9IF9xdWVyeVN0YXJ0SW5kZXggPDwgNTsKICBjb25zdCBpbnQgZnJhZ21lbnRTdGFydCA9IF9mcmFnbWVudFN0YXJ0SW5kZXggPDwgNTsKICBjb25zdCBpbnQgbm90U2ltcGxlID0gX25vdFNpbXBsZUluZGV4IDw8IDU7CgogIC8vLyBUaGUgYHVucmVzZXJ2ZWRgIGNoYXJhY3RlcnMgb2YgUkZDIDM5ODYuCiAgY29uc3QgdW5yZXNlcnZlZCA9CiAgICAgICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34iOwoKICAvLy8gVGhlIGBzdWItZGVsaW1gIGNoYXJhY3RlcnMgb2YgUkZDIDM5ODYuCiAgY29uc3Qgc3ViRGVsaW1zID0gciIhJCYnKCkqKyw7PSI7CiAgLy8gVGhlIGBwY2hhcmAgY2hhcmFjdGVycyBvZiBSRkMgMzk4NjogY2hhcmFjdGVycyB0aGF0IG1heSBvY2N1ciBpbiBhIHBhdGgsCiAgLy8gZXhjbHVkaW5nIGVzY2FwZXMuCiAgY29uc3QgcGNoYXIgPSAiJHVucmVzZXJ2ZWQkc3ViRGVsaW1zIjsKCiAgdmFyIHRhYmxlcyA9IExpc3Q8VWludDhMaXN0Pi5nZW5lcmF0ZShzdGF0ZUNvdW50LCAoXykgPT4gVWludDhMaXN0KDk2KSk7CgogIC8vIEhlbHBlciBmdW5jdGlvbiB3aGljaCBpbml0aWFsaXplIHRoZSB0YWJsZSBmb3IgW3N0YXRlXSB3aXRoIGEgZGVmYXVsdAogIC8vIHRyYW5zaXRpb24gYW5kIHJldHVybnMgdGhlIHRhYmxlLgogIFVpbnQ4TGlzdCBidWlsZChzdGF0ZSwgZGVmYXVsdFRyYW5zaXRpb24pID0+CiAgICAgIHRhYmxlc1tzdGF0ZV0uLmZpbGxSYW5nZSgwLCA5NiwgZGVmYXVsdFRyYW5zaXRpb24pOwoKICAvLyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggc2V0cyB0aGUgdHJhbnNpdGlvbiBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gW2NoYXJzXQogIC8vIHRvIFt0cmFuc2l0aW9uXSBpbiB0aGUgW3RhcmdldF0gdGFibGUuCiAgLy8gVGhlIFtjaGFyc10gc3RyaW5nIG11c3QgY29udGFpbiBvbmx5IGNoYXJhY3RlcnMgaW4gdGhlIFUrMDAyMCAuLiBVKzAwN0UKICAvLyByYW5nZS4KICB2b2lkIHNldENoYXJzKFVpbnQ4TGlzdCB0YXJnZXQsIFN0cmluZyBjaGFycywgaW50IHRyYW5zaXRpb24pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBjaGFycy5jb2RlVW5pdEF0KGkpOwogICAgICB0YXJnZXRbY2hhciBeIDB4NjBdID0gdHJhbnNpdGlvbjsKICAgIH0KICB9CgogIC8vLyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggc2V0cyB0aGUgdHJhbnNpdGlvbiBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlCiAgLy8vIHJhbmdlIGZyb20gYHJhbmdlWzBdYCB0byBgcmFuZ2VbMV1gIHRvIFt0cmFuc2l0aW9uXSBpbiB0aGUgW3RhcmdldF0gdGFibGUuCiAgLy8vCiAgLy8vIFRoZSBbcmFuZ2VdIG11c3QgYmUgYSB0d28tY2hhcmFjdGVyIHN0cmluZyB3aGVyZSBib3RoIGNoYXJhY3RlcnMgYXJlIGluCiAgLy8vIHRoZSBVKzAwMjAgLi4gVSswMDdFIHJhbmdlIGFuZCB0aGUgZm9ybWVyIGNoYXJhY3RlciBtdXN0IGhhdmUgYSBsb3dlcgogIC8vLyBjb2RlIHBvaW50IHRoYW4gdGhlIGxhdHRlci4KICB2b2lkIHNldFJhbmdlKFVpbnQ4TGlzdCB0YXJnZXQsIFN0cmluZyByYW5nZSwgaW50IHRyYW5zaXRpb24pIHsKICAgIGZvciAoaW50IGkgPSByYW5nZS5jb2RlVW5pdEF0KDApLCBuID0gcmFuZ2UuY29kZVVuaXRBdCgxKTsgaSA8PSBuOyBpKyspIHsKICAgICAgdGFyZ2V0W2kgXiAweDYwXSA9IHRyYW5zaXRpb247CiAgICB9CiAgfQoKICAvLyBDcmVhdGUgdGhlIHRyYW5zaXRpb25zIGZvciBlYWNoIHN0YXRlLgogIHZhciBiOwoKICAvLyBWYWxpZGF0ZSBhcyBwYXRoLCBpZiBpdCBpcyBhIHNjaGVtZSwgd2UgaGFuZGxlIGl0IGxhdGVyLgogIGIgPSBidWlsZChfdXJpU3RhcnQsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHNjaGVtZU9yUGF0aCk7CiAgc2V0Q2hhcnMoYiwgIi4iLCBzY2hlbWVPclBhdGhEb3QpOwogIHNldENoYXJzKGIsICI6IiwgYXV0aE9yUGF0aCB8IHNjaGVtZUVuZCk7IC8vIEhhbmRsZSBsYXRlci4KICBzZXRDaGFycyhiLCAiLyIsIGF1dGhPclBhdGhTbGFzaCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHNjaGVtZU9yUGF0aERvdCwgc2NoZW1lT3JQYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgc2NoZW1lT3JQYXRoKTsKICBzZXRDaGFycyhiLCAiLiIsIHNjaGVtZU9yUGF0aERvdDIpOwogIHNldENoYXJzKGIsICc6JywgYXV0aE9yUGF0aCB8IHNjaGVtZUVuZCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQoc2NoZW1lT3JQYXRoRG90Miwgc2NoZW1lT3JQYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgc2NoZW1lT3JQYXRoKTsKICBzZXRDaGFycyhiLCAiJSIsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgJzonLCBhdXRoT3JQYXRoIHwgc2NoZW1lRW5kKTsKICBzZXRDaGFycyhiLCAiLyIsIHJlbFBhdGhTZWcpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChzY2hlbWVPclBhdGgsIHNjaGVtZU9yUGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHNjaGVtZU9yUGF0aCk7CiAgc2V0Q2hhcnMoYiwgJzonLCBhdXRoT3JQYXRoIHwgc2NoZW1lRW5kKTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChhdXRoT3JQYXRoLCBwYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgcGF0aCB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBhdXRoT3JQYXRoU2xhc2ggfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICIuIiwgcGF0aFNlZ0RvdCB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKGF1dGhPclBhdGhTbGFzaCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIvIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLiIsIHBhdGhTZWdEb3QpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZCh1aW5mb09ySG9zdDAsIHVpbmZvT3JIb3N0IHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgdWluZm9Pckhvc3QpOwogIHNldFJhbmdlKGIsICJBWiIsIHVpbmZvT3JIb3N0IHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiOiIsIHVpbmZvT3JQb3J0MCB8IHBvcnRTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIkAiLCB1aW5mb09ySG9zdDAgfCBob3N0U3RhcnQpOwogIHNldENoYXJzKGIsICJbIiwgaXB2Nkhvc3QgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHVpbmZvT3JIb3N0LCB1aW5mb09ySG9zdCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHVpbmZvT3JIb3N0KTsKICBzZXRSYW5nZShiLCAiQVoiLCB1aW5mb09ySG9zdCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIjoiLCB1aW5mb09yUG9ydDAgfCBwb3J0U3RhcnQpOwogIHNldENoYXJzKGIsICJAIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZCh1aW5mb09yUG9ydDAsIHVpbmZvT3JQb3J0IHwgbm90U2ltcGxlKTsKICBzZXRSYW5nZShiLCAiMTkiLCB1aW5mb09yUG9ydCk7CiAgc2V0Q2hhcnMoYiwgIkAiLCB1aW5mb09ySG9zdDAgfCBob3N0U3RhcnQpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IHBhdGhTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHVpbmZvT3JQb3J0LCB1aW5mb09yUG9ydCB8IG5vdFNpbXBsZSk7CiAgc2V0UmFuZ2UoYiwgIjA5IiwgdWluZm9PclBvcnQpOwogIHNldENoYXJzKGIsICJAIiwgdWluZm9Pckhvc3QwIHwgaG9zdFN0YXJ0KTsKICBzZXRDaGFycyhiLCAiLyIsIHBhdGhTZWcgfCBwYXRoU3RhcnQpOwogIHNldENoYXJzKGIsICI/IiwgcXVlcnkgfCBxdWVyeVN0YXJ0KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChpcHY2SG9zdCwgaXB2Nkhvc3QpOwogIHNldENoYXJzKGIsICJdIiwgdWluZm9Pckhvc3QpOwoKICBiID0gYnVpbGQocmVsUGF0aFNlZywgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcmVsUGF0aFNlZ0RvdCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQocmVsUGF0aFNlZ0RvdCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcmVsUGF0aFNlZ0RvdDIpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHJlbFBhdGhTZWdEb3QyLCBwYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgcGF0aCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCByZWxQYXRoU2VnKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7IC8vIFRoaXMgc2hvdWxkIGJlIG5vbi1zaW1wbGUuCiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOyAvLyBUaGlzIHNob3VsZCBiZSBub24tc2ltcGxlLgoKICBiID0gYnVpbGQocGF0aFNlZywgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcGF0aFNlZ0RvdCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQocGF0aFNlZ0RvdCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIuIiwgcGF0aFNlZ0RvdDIpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHBhdGhTZWdEb3QyLCBwYXRoIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCBwY2hhciwgcGF0aCk7CiAgc2V0Q2hhcnMoYiwgIi8iLCBwYXRoU2VnIHwgbm90U2ltcGxlKTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5IHwgcXVlcnlTdGFydCk7CiAgc2V0Q2hhcnMoYiwgIiMiLCBmcmFnbWVudCB8IGZyYWdtZW50U3RhcnQpOwoKICBiID0gYnVpbGQocGF0aCwgcGF0aCB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHBhdGgpOwogIHNldENoYXJzKGIsICIvIiwgcGF0aFNlZyk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBxdWVyeSB8IHF1ZXJ5U3RhcnQpOwogIHNldENoYXJzKGIsICIjIiwgZnJhZ21lbnQgfCBmcmFnbWVudFN0YXJ0KTsKCiAgYiA9IGJ1aWxkKHF1ZXJ5LCBxdWVyeSB8IG5vdFNpbXBsZSk7CiAgc2V0Q2hhcnMoYiwgcGNoYXIsIHF1ZXJ5KTsKICBzZXRDaGFycyhiLCAiPyIsIHF1ZXJ5KTsKICBzZXRDaGFycyhiLCAiIyIsIGZyYWdtZW50IHwgZnJhZ21lbnRTdGFydCk7CgogIGIgPSBidWlsZChmcmFnbWVudCwgZnJhZ21lbnQgfCBub3RTaW1wbGUpOwogIHNldENoYXJzKGIsIHBjaGFyLCBmcmFnbWVudCk7CiAgc2V0Q2hhcnMoYiwgIj8iLCBmcmFnbWVudCk7CgogIC8vIEEgc2VwYXJhdGUgdHdvLXN0YXRlIHZhbGlkYXRvciBmb3IgbG93ZXItY2FzZSBzY2hlbWUgbmFtZXMuCiAgLy8gQW55IG5vbi1zY2hlbWUgY2hhcmFjdGVyIG9yIHVwcGVyLWNhc2UgbGV0dGVyIGlzIG1hcmtlZCBhcyBub24tc2ltcGxlLgogIGIgPSBidWlsZChzY2hlbWUwLCBzY2hlbWUgfCBub3RTaW1wbGUpOwogIHNldFJhbmdlKGIsICJheiIsIHNjaGVtZSk7CgogIGIgPSBidWlsZChzY2hlbWUsIHNjaGVtZSB8IG5vdFNpbXBsZSk7CiAgc2V0UmFuZ2UoYiwgImF6Iiwgc2NoZW1lKTsKICBzZXRSYW5nZShiLCAiMDkiLCBzY2hlbWUpOwogIHNldENoYXJzKGIsICIrLS4iLCBzY2hlbWUpOwoKICByZXR1cm4gdGFibGVzOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDb2RlIHRoYXQgdXNlcyB0aGUgVVJJIHNjYW5uZXIgdGFibGUuCgovLy8gU2NhbiBhIHN0cmluZyB1c2luZyB0aGUgW19zY2FubmVyVGFibGVzXSBzdGF0ZSBtYWNoaW5lLgovLy8KLy8vIFNjYW5zIFt1cmldIGZyb20gW3N0YXJ0XSB0byBbZW5kXSwgc3RhcnRpbmcgaW4gc3RhdGUgW3N0YXRlXSBhbmQKLy8vIHdyaXRpbmcgb3V0cHV0IGludG8gW2luZGljZXNdLgovLy8KLy8vIFJldHVybnMgdGhlIGZpbmFsIHN0YXRlLgppbnQgX3NjYW4oU3RyaW5nIHVyaSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc3RhdGUsIExpc3Q8aW50PiBpbmRpY2VzKSB7CiAgdmFyIHRhYmxlcyA9IF9zY2FubmVyVGFibGVzOwogIGFzc2VydChlbmQgPD0gdXJpLmxlbmd0aCk7CiAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgIHZhciB0YWJsZSA9IHRhYmxlc1tzdGF0ZV07CiAgICAvLyBYb3Igd2l0aCAweDYwIHRvIG1vdmUgcmFuZ2UgMHgyMC0weDdmIGludG8gMHgwMC0weDVmCiAgICBpbnQgY2hhciA9IHVyaS5jb2RlVW5pdEF0KGkpIF4gMHg2MDsKICAgIC8vIFVzZSAweDFmIChuZWUgMHg3ZikgdG8gcmVwcmVzZW50IGFsbCB1bmhhbmRsZWQgY2hhcmFjdGVycy4KICAgIGlmIChjaGFyID4gMHg1ZikgY2hhciA9IDB4MWY7CiAgICBpbnQgdHJhbnNpdGlvbiA9IHRhYmxlW2NoYXJdOwogICAgc3RhdGUgPSB0cmFuc2l0aW9uICYgMHgxZjsKICAgIGluZGljZXNbdHJhbnNpdGlvbiA+PiA1XSA9IGk7CiAgfQogIHJldHVybiBzdGF0ZTsKfQoKY2xhc3MgX1NpbXBsZVVyaSBpbXBsZW1lbnRzIFVyaSB7CiAgZmluYWwgU3RyaW5nIF91cmk7CiAgZmluYWwgaW50IF9zY2hlbWVFbmQ7CiAgZmluYWwgaW50IF9ob3N0U3RhcnQ7CiAgZmluYWwgaW50IF9wb3J0U3RhcnQ7CiAgZmluYWwgaW50IF9wYXRoU3RhcnQ7CiAgZmluYWwgaW50IF9xdWVyeVN0YXJ0OwogIGZpbmFsIGludCBfZnJhZ21lbnRTdGFydDsKCiAgLy8vIFRoZSBzY2hlbWUgaXMgb2Z0ZW4gdXNlZCB0byBkaXN0aW5ndWlzaCBVUklzLgogIC8vLyBUbyBtYWtlIGNvbXBhcmlzb25zIG1vcmUgZWZmaWNpZW50LCB3ZSBjYWNoZSB0aGUgdmFsdWUsIGFuZAogIC8vLyBjYW5vbmljYWxpemUgYSBmZXcga25vd24gdHlwZXMuCiAgU3RyaW5nIF9zY2hlbWVDYWNoZTsKICBpbnQgX2hhc2hDb2RlQ2FjaGU7CgogIF9TaW1wbGVVcmkoCiAgICAgIHRoaXMuX3VyaSwKICAgICAgdGhpcy5fc2NoZW1lRW5kLAogICAgICB0aGlzLl9ob3N0U3RhcnQsCiAgICAgIHRoaXMuX3BvcnRTdGFydCwKICAgICAgdGhpcy5fcGF0aFN0YXJ0LAogICAgICB0aGlzLl9xdWVyeVN0YXJ0LAogICAgICB0aGlzLl9mcmFnbWVudFN0YXJ0LAogICAgICB0aGlzLl9zY2hlbWVDYWNoZSk7CgogIGJvb2wgZ2V0IGhhc1NjaGVtZSA9PiBfc2NoZW1lRW5kID4gMDsKICBib29sIGdldCBoYXNBdXRob3JpdHkgPT4gX2hvc3RTdGFydCA+IDA7CiAgYm9vbCBnZXQgaGFzVXNlckluZm8gPT4gX2hvc3RTdGFydCA+IF9zY2hlbWVFbmQgKyA0OwogIGJvb2wgZ2V0IGhhc1BvcnQgPT4gX2hvc3RTdGFydCA+IDAgJiYgX3BvcnRTdGFydCArIDEgPCBfcGF0aFN0YXJ0OwogIGJvb2wgZ2V0IGhhc1F1ZXJ5ID0+IF9xdWVyeVN0YXJ0IDwgX2ZyYWdtZW50U3RhcnQ7CiAgYm9vbCBnZXQgaGFzRnJhZ21lbnQgPT4gX2ZyYWdtZW50U3RhcnQgPCBfdXJpLmxlbmd0aDsKCiAgYm9vbCBnZXQgX2lzRmlsZSA9PiBfc2NoZW1lRW5kID09IDQgJiYgX3VyaS5zdGFydHNXaXRoKCJmaWxlIik7CiAgYm9vbCBnZXQgX2lzSHR0cCA9PiBfc2NoZW1lRW5kID09IDQgJiYgX3VyaS5zdGFydHNXaXRoKCJodHRwIik7CiAgYm9vbCBnZXQgX2lzSHR0cHMgPT4gX3NjaGVtZUVuZCA9PSA1ICYmIF91cmkuc3RhcnRzV2l0aCgiaHR0cHMiKTsKICBib29sIGdldCBfaXNQYWNrYWdlID0+IF9zY2hlbWVFbmQgPT0gNyAmJiBfdXJpLnN0YXJ0c1dpdGgoInBhY2thZ2UiKTsKCiAgLy8vIExpa2UgW2lzU2NoZW1lXSBidXQgZXhwZWN0cyBhcmd1bWVudCB0byBiZSBjYXNlIG5vcm1hbGl6ZWQuCiAgYm9vbCBfaXNTY2hlbWUoU3RyaW5nIHNjaGVtZSkgPT4KICAgICAgX3NjaGVtZUVuZCA9PSBzY2hlbWUubGVuZ3RoICYmIF91cmkuc3RhcnRzV2l0aChzY2hlbWUpOwoKICBib29sIGdldCBoYXNBYnNvbHV0ZVBhdGggPT4gX3VyaS5zdGFydHNXaXRoKCIvIiwgX3BhdGhTdGFydCk7CiAgYm9vbCBnZXQgaGFzRW1wdHlQYXRoID0+IF9wYXRoU3RhcnQgPT0gX3F1ZXJ5U3RhcnQ7CgogIGJvb2wgZ2V0IGlzQWJzb2x1dGUgPT4gaGFzU2NoZW1lICYmICFoYXNGcmFnbWVudDsKCiAgYm9vbCBpc1NjaGVtZShTdHJpbmcgc2NoZW1lKSB7CiAgICBpZiAoc2NoZW1lID09IG51bGwgfHwgc2NoZW1lLmlzRW1wdHkpIHJldHVybiBfc2NoZW1lRW5kIDwgMDsKICAgIGlmIChzY2hlbWUubGVuZ3RoICE9IF9zY2hlbWVFbmQpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBfVXJpLl9jb21wYXJlU2NoZW1lKHNjaGVtZSwgX3VyaSk7CiAgfQoKICBTdHJpbmcgZ2V0IHNjaGVtZSB7CiAgICBpZiAoX3NjaGVtZUVuZCA8PSAwKSByZXR1cm4gIiI7CiAgICBpZiAoX3NjaGVtZUNhY2hlICE9IG51bGwpIHJldHVybiBfc2NoZW1lQ2FjaGU7CiAgICBpZiAoX2lzSHR0cCkgewogICAgICBfc2NoZW1lQ2FjaGUgPSAiaHR0cCI7CiAgICB9IGVsc2UgaWYgKF9pc0h0dHBzKSB7CiAgICAgIF9zY2hlbWVDYWNoZSA9ICJodHRwcyI7CiAgICB9IGVsc2UgaWYgKF9pc0ZpbGUpIHsKICAgICAgX3NjaGVtZUNhY2hlID0gImZpbGUiOwogICAgfSBlbHNlIGlmIChfaXNQYWNrYWdlKSB7CiAgICAgIF9zY2hlbWVDYWNoZSA9ICJwYWNrYWdlIjsKICAgIH0gZWxzZSB7CiAgICAgIF9zY2hlbWVDYWNoZSA9IF91cmkuc3Vic3RyaW5nKDAsIF9zY2hlbWVFbmQpOwogICAgfQogICAgcmV0dXJuIF9zY2hlbWVDYWNoZTsKICB9CgogIFN0cmluZyBnZXQgYXV0aG9yaXR5ID0+CiAgICAgIF9ob3N0U3RhcnQgPiAwID8gX3VyaS5zdWJzdHJpbmcoX3NjaGVtZUVuZCArIDMsIF9wYXRoU3RhcnQpIDogIiI7CiAgU3RyaW5nIGdldCB1c2VySW5mbyA9PiAoX2hvc3RTdGFydCA+IF9zY2hlbWVFbmQgKyAzKQogICAgICA/IF91cmkuc3Vic3RyaW5nKF9zY2hlbWVFbmQgKyAzLCBfaG9zdFN0YXJ0IC0gMSkKICAgICAgOiAiIjsKICBTdHJpbmcgZ2V0IGhvc3QgPT4KICAgICAgX2hvc3RTdGFydCA+IDAgPyBfdXJpLnN1YnN0cmluZyhfaG9zdFN0YXJ0LCBfcG9ydFN0YXJ0KSA6ICIiOwogIGludCBnZXQgcG9ydCB7CiAgICBpZiAoaGFzUG9ydCkgcmV0dXJuIGludC5wYXJzZShfdXJpLnN1YnN0cmluZyhfcG9ydFN0YXJ0ICsgMSwgX3BhdGhTdGFydCkpOwogICAgaWYgKF9pc0h0dHApIHJldHVybiA4MDsKICAgIGlmIChfaXNIdHRwcykgcmV0dXJuIDQ0MzsKICAgIHJldHVybiAwOwogIH0KCiAgU3RyaW5nIGdldCBwYXRoID0+IF91cmkuc3Vic3RyaW5nKF9wYXRoU3RhcnQsIF9xdWVyeVN0YXJ0KTsKICBTdHJpbmcgZ2V0IHF1ZXJ5ID0+IChfcXVlcnlTdGFydCA8IF9mcmFnbWVudFN0YXJ0KQogICAgICA/IF91cmkuc3Vic3RyaW5nKF9xdWVyeVN0YXJ0ICsgMSwgX2ZyYWdtZW50U3RhcnQpCiAgICAgIDogIiI7CiAgU3RyaW5nIGdldCBmcmFnbWVudCA9PgogICAgICAoX2ZyYWdtZW50U3RhcnQgPCBfdXJpLmxlbmd0aCkgPyBfdXJpLnN1YnN0cmluZyhfZnJhZ21lbnRTdGFydCArIDEpIDogIiI7CgogIFN0cmluZyBnZXQgb3JpZ2luIHsKICAgIC8vIENoZWNrIG9yaWdpbmFsIGJlaGF2aW9yIC0gVzNDIHNwZWMgaXMgd29ua3khCiAgICBib29sIGlzSHR0cCA9IF9pc0h0dHA7CiAgICBpZiAoX3NjaGVtZUVuZCA8IDApIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigiQ2Fubm90IHVzZSBvcmlnaW4gd2l0aG91dCBhIHNjaGVtZTogJHRoaXMiKTsKICAgIH0KICAgIGlmICghaXNIdHRwICYmICFfaXNIdHRwcykgewogICAgICB0aHJvdyBTdGF0ZUVycm9yKAogICAgICAgICAgIk9yaWdpbiBpcyBvbmx5IGFwcGxpY2FibGUgdG8gc2NoZW1lcyBodHRwIGFuZCBodHRwczogJHRoaXMiKTsKICAgIH0KICAgIGlmIChfaG9zdFN0YXJ0ID09IF9wb3J0U3RhcnQpIHsKICAgICAgdGhyb3cgU3RhdGVFcnJvcigKICAgICAgICAgICJBICRzY2hlbWU6IFVSSSBzaG91bGQgaGF2ZSBhIG5vbi1lbXB0eSBob3N0IG5hbWU6ICR0aGlzIik7CiAgICB9CiAgICBpZiAoX2hvc3RTdGFydCA9PSBfc2NoZW1lRW5kICsgMykgewogICAgICByZXR1cm4gX3VyaS5zdWJzdHJpbmcoMCwgX3BhdGhTdGFydCk7CiAgICB9CiAgICAvLyBOZWVkIHRvIGRyb3AgYW5vbi1lbXB0eSB1c2VySW5mby4KICAgIHJldHVybiBfdXJpLnN1YnN0cmluZygwLCBfc2NoZW1lRW5kICsgMykgKwogICAgICAgIF91cmkuc3Vic3RyaW5nKF9ob3N0U3RhcnQsIF9wYXRoU3RhcnQpOwogIH0KCiAgTGlzdDxTdHJpbmc+IGdldCBwYXRoU2VnbWVudHMgewogICAgaW50IHN0YXJ0ID0gX3BhdGhTdGFydDsKICAgIGludCBlbmQgPSBfcXVlcnlTdGFydDsKICAgIGlmIChfdXJpLnN0YXJ0c1dpdGgoIi8iLCBzdGFydCkpIHN0YXJ0Kys7CiAgICBpZiAoc3RhcnQgPT0gZW5kKSByZXR1cm4gY29uc3QgPFN0cmluZz5bXTsKICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IFtdOwogICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGNoYXIgPSBfdXJpLmNvZGVVbml0QXQoaSk7CiAgICAgIGlmIChjaGFyID09IF9TTEFTSCkgewogICAgICAgIHBhcnRzLmFkZChfdXJpLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0KICAgIHBhcnRzLmFkZChfdXJpLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CiAgICByZXR1cm4gTGlzdDxTdHJpbmc+LnVubW9kaWZpYWJsZShwYXJ0cyk7CiAgfQoKICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldCBxdWVyeVBhcmFtZXRlcnMgewogICAgaWYgKCFoYXNRdWVyeSkgcmV0dXJuIGNvbnN0IDxTdHJpbmcsIFN0cmluZz57fTsKICAgIHJldHVybiBVbm1vZGlmaWFibGVNYXBWaWV3PFN0cmluZywgU3RyaW5nPihVcmkuc3BsaXRRdWVyeVN0cmluZyhxdWVyeSkpOwogIH0KCiAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXQgcXVlcnlQYXJhbWV0ZXJzQWxsIHsKICAgIGlmICghaGFzUXVlcnkpIHJldHVybiBjb25zdCA8U3RyaW5nLCBMaXN0PFN0cmluZz4+e307CiAgICBNYXAgcXVlcnlQYXJhbWV0ZXJMaXN0cyA9IF9VcmkuX3NwbGl0UXVlcnlTdHJpbmdBbGwocXVlcnkpOwogICAgZm9yICh2YXIga2V5IGluIHF1ZXJ5UGFyYW1ldGVyTGlzdHMua2V5cykgewogICAgICBxdWVyeVBhcmFtZXRlckxpc3RzW2tleV0gPQogICAgICAgICAgTGlzdDxTdHJpbmc+LnVubW9kaWZpYWJsZShxdWVyeVBhcmFtZXRlckxpc3RzW2tleV0pOwogICAgfQogICAgcmV0dXJuIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4udW5tb2RpZmlhYmxlKHF1ZXJ5UGFyYW1ldGVyTGlzdHMpOwogIH0KCiAgYm9vbCBfaXNQb3J0KFN0cmluZyBwb3J0KSB7CiAgICBpbnQgcG9ydERpZ2l0U3RhcnQgPSBfcG9ydFN0YXJ0ICsgMTsKICAgIHJldHVybiBwb3J0RGlnaXRTdGFydCArIHBvcnQubGVuZ3RoID09IF9wYXRoU3RhcnQgJiYKICAgICAgICBfdXJpLnN0YXJ0c1dpdGgocG9ydCwgcG9ydERpZ2l0U3RhcnQpOwogIH0KCiAgVXJpIG5vcm1hbGl6ZVBhdGgoKSA9PiB0aGlzOwoKICBVcmkgcmVtb3ZlRnJhZ21lbnQoKSB7CiAgICBpZiAoIWhhc0ZyYWdtZW50KSByZXR1cm4gdGhpczsKICAgIHJldHVybiBfU2ltcGxlVXJpKF91cmkuc3Vic3RyaW5nKDAsIF9mcmFnbWVudFN0YXJ0KSwgX3NjaGVtZUVuZCwgX2hvc3RTdGFydCwKICAgICAgICBfcG9ydFN0YXJ0LCBfcGF0aFN0YXJ0LCBfcXVlcnlTdGFydCwgX2ZyYWdtZW50U3RhcnQsIF9zY2hlbWVDYWNoZSk7CiAgfQoKICBVcmkgcmVwbGFjZSgKICAgICAge1N0cmluZyBzY2hlbWUsCiAgICAgIFN0cmluZyB1c2VySW5mbywKICAgICAgU3RyaW5nIGhvc3QsCiAgICAgIGludCBwb3J0LAogICAgICBTdHJpbmcgcGF0aCwKICAgICAgSXRlcmFibGU8U3RyaW5nPiBwYXRoU2VnbWVudHMsCiAgICAgIFN0cmluZyBxdWVyeSwKICAgICAgTWFwPFN0cmluZywgZHluYW1pYyAvKlN0cmluZ3xJdGVyYWJsZTxTdHJpbmc+Ki8gPiBxdWVyeVBhcmFtZXRlcnMsCiAgICAgIFN0cmluZyBmcmFnbWVudH0pIHsKICAgIGJvb2wgc2NoZW1lQ2hhbmdlZCA9IGZhbHNlOwogICAgaWYgKHNjaGVtZSAhPSBudWxsKSB7CiAgICAgIHNjaGVtZSA9IF9VcmkuX21ha2VTY2hlbWUoc2NoZW1lLCAwLCBzY2hlbWUubGVuZ3RoKTsKICAgICAgc2NoZW1lQ2hhbmdlZCA9ICFfaXNTY2hlbWUoc2NoZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHNjaGVtZSA9IHRoaXMuc2NoZW1lOwogICAgfQogICAgYm9vbCBpc0ZpbGUgPSAoc2NoZW1lID09ICJmaWxlIik7CiAgICBpZiAodXNlckluZm8gIT0gbnVsbCkgewogICAgICB1c2VySW5mbyA9IF9VcmkuX21ha2VVc2VySW5mbyh1c2VySW5mbywgMCwgdXNlckluZm8ubGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAoX2hvc3RTdGFydCA+IDApIHsKICAgICAgdXNlckluZm8gPSBfdXJpLnN1YnN0cmluZyhfc2NoZW1lRW5kICsgMywgX2hvc3RTdGFydCk7CiAgICB9IGVsc2UgewogICAgICB1c2VySW5mbyA9ICIiOwogICAgfQogICAgaWYgKHBvcnQgIT0gbnVsbCkgewogICAgICBwb3J0ID0gX1VyaS5fbWFrZVBvcnQocG9ydCwgc2NoZW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHBvcnQgPSB0aGlzLmhhc1BvcnQgPyB0aGlzLnBvcnQgOiBudWxsOwogICAgICBpZiAoc2NoZW1lQ2hhbmdlZCkgewogICAgICAgIC8vIFRoZSBkZWZhdWx0IHBvcnQgbWlnaHQgaGF2ZSBjaGFuZ2VkLgogICAgICAgIHBvcnQgPSBfVXJpLl9tYWtlUG9ydChwb3J0LCBzY2hlbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoaG9zdCAhPSBudWxsKSB7CiAgICAgIGhvc3QgPSBfVXJpLl9tYWtlSG9zdChob3N0LCAwLCBob3N0Lmxlbmd0aCwgZmFsc2UpOwogICAgfSBlbHNlIGlmIChfaG9zdFN0YXJ0ID4gMCkgewogICAgICBob3N0ID0gX3VyaS5zdWJzdHJpbmcoX2hvc3RTdGFydCwgX3BvcnRTdGFydCk7CiAgICB9IGVsc2UgaWYgKHVzZXJJbmZvLmlzTm90RW1wdHkgfHwgcG9ydCAhPSBudWxsIHx8IGlzRmlsZSkgewogICAgICBob3N0ID0gIiI7CiAgICB9CgogICAgYm9vbCBoYXNBdXRob3JpdHkgPSBob3N0ICE9IG51bGw7CiAgICBpZiAocGF0aCAhPSBudWxsIHx8IHBhdGhTZWdtZW50cyAhPSBudWxsKSB7CiAgICAgIHBhdGggPSBfVXJpLl9tYWtlUGF0aChwYXRoLCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHBhdGgpLCBwYXRoU2VnbWVudHMsCiAgICAgICAgICBzY2hlbWUsIGhhc0F1dGhvcml0eSk7CiAgICB9IGVsc2UgewogICAgICBwYXRoID0gX3VyaS5zdWJzdHJpbmcoX3BhdGhTdGFydCwgX3F1ZXJ5U3RhcnQpOwogICAgICBpZiAoKGlzRmlsZSB8fCAoaGFzQXV0aG9yaXR5ICYmICFwYXRoLmlzRW1wdHkpKSAmJgogICAgICAgICAgIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgcGF0aCA9ICIvIiArIHBhdGg7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocXVlcnkgIT0gbnVsbCB8fCBxdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICBxdWVyeSA9IF9VcmkuX21ha2VRdWVyeSgKICAgICAgICAgIHF1ZXJ5LCAwLCBfc3RyaW5nT3JOdWxsTGVuZ3RoKHF1ZXJ5KSwgcXVlcnlQYXJhbWV0ZXJzKTsKICAgIH0gZWxzZSBpZiAoX3F1ZXJ5U3RhcnQgPCBfZnJhZ21lbnRTdGFydCkgewogICAgICBxdWVyeSA9IF91cmkuc3Vic3RyaW5nKF9xdWVyeVN0YXJ0ICsgMSwgX2ZyYWdtZW50U3RhcnQpOwogICAgfQoKICAgIGlmIChmcmFnbWVudCAhPSBudWxsKSB7CiAgICAgIGZyYWdtZW50ID0gX1VyaS5fbWFrZUZyYWdtZW50KGZyYWdtZW50LCAwLCBmcmFnbWVudC5sZW5ndGgpOwogICAgfSBlbHNlIGlmIChfZnJhZ21lbnRTdGFydCA8IF91cmkubGVuZ3RoKSB7CiAgICAgIGZyYWdtZW50ID0gX3VyaS5zdWJzdHJpbmcoX2ZyYWdtZW50U3RhcnQgKyAxKTsKICAgIH0KCiAgICByZXR1cm4gX1VyaS5faW50ZXJuYWwoc2NoZW1lLCB1c2VySW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50KTsKICB9CgogIFVyaSByZXNvbHZlKFN0cmluZyByZWZlcmVuY2UpIHsKICAgIHJldHVybiByZXNvbHZlVXJpKFVyaS5wYXJzZShyZWZlcmVuY2UpKTsKICB9CgogIFVyaSByZXNvbHZlVXJpKFVyaSByZWZlcmVuY2UpIHsKICAgIGlmIChyZWZlcmVuY2UgaXMgX1NpbXBsZVVyaSkgewogICAgICByZXR1cm4gX3NpbXBsZU1lcmdlKHRoaXMsIHJlZmVyZW5jZSk7CiAgICB9CiAgICByZXR1cm4gX3RvTm9uU2ltcGxlKCkucmVzb2x2ZVVyaShyZWZlcmVuY2UpOwogIH0KCiAgLy8gTWVyZ2UgdHdvIHNpbXBsZSBVUklzLiBUaGlzIHNob3VsZCBhbHdheXMgcmVzdWx0IGluIGEgcHJlZml4IG9mCiAgLy8gb25lIGNvbmNhdGVuYXRlZCB3aXRoIGEgc3VmZml4IG9mIHRoZSBvdGhlciwgcG9zc2libHkgd2l0aCBhIGAvYCBpbgogIC8vIHRoZSBtaWRkbGUgb2YgdHdvIG1lcmdlZCBwYXRocywgd2hpY2ggaXMgYWdhaW4gc2ltcGxlLgogIC8vIEluIGEgZmV3IGNhc2VzLCB0aGVyZSBtaWdodCBiZSBhIG5lZWQgZm9yIGV4dHJhIG5vcm1hbGl6YXRpb24sIHdoZW4KICAvLyByZXNvbHZpbmcgb24gdG9wIG9mIGEga25vd24gc2NoZW1lLgogIFVyaSBfc2ltcGxlTWVyZ2UoX1NpbXBsZVVyaSBiYXNlLCBfU2ltcGxlVXJpIHJlZikgewogICAgaWYgKHJlZi5oYXNTY2hlbWUpIHJldHVybiByZWY7CiAgICBpZiAocmVmLmhhc0F1dGhvcml0eSkgewogICAgICBpZiAoIWJhc2UuaGFzU2NoZW1lKSByZXR1cm4gcmVmOwogICAgICBib29sIGlzU2ltcGxlID0gdHJ1ZTsKICAgICAgaWYgKGJhc2UuX2lzRmlsZSkgewogICAgICAgIGlzU2ltcGxlID0gIXJlZi5oYXNFbXB0eVBhdGg7CiAgICAgIH0gZWxzZSBpZiAoYmFzZS5faXNIdHRwKSB7CiAgICAgICAgaXNTaW1wbGUgPSAhcmVmLl9pc1BvcnQoIjgwIik7CiAgICAgIH0gZWxzZSBpZiAoYmFzZS5faXNIdHRwcykgewogICAgICAgIGlzU2ltcGxlID0gIXJlZi5faXNQb3J0KCI0NDMiKTsKICAgICAgfQogICAgICBpZiAoaXNTaW1wbGUpIHsKICAgICAgICB2YXIgZGVsdGEgPSBiYXNlLl9zY2hlbWVFbmQgKyAxOwogICAgICAgIHZhciBuZXdVcmkgPSBiYXNlLl91cmkuc3Vic3RyaW5nKDAsIGJhc2UuX3NjaGVtZUVuZCArIDEpICsKICAgICAgICAgICAgcmVmLl91cmkuc3Vic3RyaW5nKHJlZi5fc2NoZW1lRW5kICsgMSk7CiAgICAgICAgcmV0dXJuIF9TaW1wbGVVcmkoCiAgICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgICAgICByZWYuX2hvc3RTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX3BvcnRTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX3BhdGhTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX3F1ZXJ5U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgcmVmLl9mcmFnbWVudFN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIHdpbGwgcmVxdWlyZSBub3JtYWxpemF0aW9uLCBzbyB1c2UgdGhlIF9VcmkgaW1wbGVtZW50YXRpb24uCiAgICAgICAgcmV0dXJuIF90b05vblNpbXBsZSgpLnJlc29sdmVVcmkocmVmKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlZi5oYXNFbXB0eVBhdGgpIHsKICAgICAgaWYgKHJlZi5oYXNRdWVyeSkgewogICAgICAgIGludCBkZWx0YSA9IGJhc2UuX3F1ZXJ5U3RhcnQgLSByZWYuX3F1ZXJ5U3RhcnQ7CiAgICAgICAgdmFyIG5ld1VyaSA9IGJhc2UuX3VyaS5zdWJzdHJpbmcoMCwgYmFzZS5fcXVlcnlTdGFydCkgKwogICAgICAgICAgICByZWYuX3VyaS5zdWJzdHJpbmcocmVmLl9xdWVyeVN0YXJ0KTsKICAgICAgICByZXR1cm4gX1NpbXBsZVVyaSgKICAgICAgICAgICAgbmV3VXJpLAogICAgICAgICAgICBiYXNlLl9zY2hlbWVFbmQsCiAgICAgICAgICAgIGJhc2UuX2hvc3RTdGFydCwKICAgICAgICAgICAgYmFzZS5fcG9ydFN0YXJ0LAogICAgICAgICAgICBiYXNlLl9wYXRoU3RhcnQsCiAgICAgICAgICAgIHJlZi5fcXVlcnlTdGFydCArIGRlbHRhLAogICAgICAgICAgICByZWYuX2ZyYWdtZW50U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lQ2FjaGUpOwogICAgICB9CiAgICAgIGlmIChyZWYuaGFzRnJhZ21lbnQpIHsKICAgICAgICBpbnQgZGVsdGEgPSBiYXNlLl9mcmFnbWVudFN0YXJ0IC0gcmVmLl9mcmFnbWVudFN0YXJ0OwogICAgICAgIHZhciBuZXdVcmkgPSBiYXNlLl91cmkuc3Vic3RyaW5nKDAsIGJhc2UuX2ZyYWdtZW50U3RhcnQpICsKICAgICAgICAgICAgcmVmLl91cmkuc3Vic3RyaW5nKHJlZi5fZnJhZ21lbnRTdGFydCk7CiAgICAgICAgcmV0dXJuIF9TaW1wbGVVcmkoCiAgICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgICAgICBiYXNlLl9ob3N0U3RhcnQsCiAgICAgICAgICAgIGJhc2UuX3BvcnRTdGFydCwKICAgICAgICAgICAgYmFzZS5fcGF0aFN0YXJ0LAogICAgICAgICAgICBiYXNlLl9xdWVyeVN0YXJ0LAogICAgICAgICAgICByZWYuX2ZyYWdtZW50U3RhcnQgKyBkZWx0YSwKICAgICAgICAgICAgYmFzZS5fc2NoZW1lQ2FjaGUpOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlLnJlbW92ZUZyYWdtZW50KCk7CiAgICB9CiAgICBpZiAocmVmLmhhc0Fic29sdXRlUGF0aCkgewogICAgICB2YXIgZGVsdGEgPSBiYXNlLl9wYXRoU3RhcnQgLSByZWYuX3BhdGhTdGFydDsKICAgICAgdmFyIG5ld1VyaSA9IGJhc2UuX3VyaS5zdWJzdHJpbmcoMCwgYmFzZS5fcGF0aFN0YXJ0KSArCiAgICAgICAgICByZWYuX3VyaS5zdWJzdHJpbmcocmVmLl9wYXRoU3RhcnQpOwogICAgICByZXR1cm4gX1NpbXBsZVVyaSgKICAgICAgICAgIG5ld1VyaSwKICAgICAgICAgIGJhc2UuX3NjaGVtZUVuZCwKICAgICAgICAgIGJhc2UuX2hvc3RTdGFydCwKICAgICAgICAgIGJhc2UuX3BvcnRTdGFydCwKICAgICAgICAgIGJhc2UuX3BhdGhTdGFydCwKICAgICAgICAgIHJlZi5fcXVlcnlTdGFydCArIGRlbHRhLAogICAgICAgICAgcmVmLl9mcmFnbWVudFN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICBiYXNlLl9zY2hlbWVDYWNoZSk7CiAgICB9CiAgICBpZiAoYmFzZS5oYXNFbXB0eVBhdGggJiYgYmFzZS5oYXNBdXRob3JpdHkpIHsKICAgICAgLy8gcmVmIGhhcyByZWxhdGl2ZSBub24tZW1wdHkgcGF0aC4KICAgICAgLy8gQWRkIGEgIi8iIGluIGZyb250LCB0aGVuIGxlYWRpbmcgIi8uLi8iIHNlZ21lbnRzIGFyZSBmb2xkZWQgdG8gIi8iLgogICAgICBpbnQgcmVmU3RhcnQgPSByZWYuX3BhdGhTdGFydDsKICAgICAgd2hpbGUgKHJlZi5fdXJpLnN0YXJ0c1dpdGgoIi4uLyIsIHJlZlN0YXJ0KSkgewogICAgICAgIHJlZlN0YXJ0ICs9IDM7CiAgICAgIH0KICAgICAgdmFyIGRlbHRhID0gYmFzZS5fcGF0aFN0YXJ0IC0gcmVmU3RhcnQgKyAxOwogICAgICB2YXIgbmV3VXJpID0gIiR7YmFzZS5fdXJpLnN1YnN0cmluZygwLCBiYXNlLl9wYXRoU3RhcnQpfS8iCiAgICAgICAgICAiJHtyZWYuX3VyaS5zdWJzdHJpbmcocmVmU3RhcnQpfSI7CiAgICAgIHJldHVybiBfU2ltcGxlVXJpKAogICAgICAgICAgbmV3VXJpLAogICAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgICAgYmFzZS5faG9zdFN0YXJ0LAogICAgICAgICAgYmFzZS5fcG9ydFN0YXJ0LAogICAgICAgICAgYmFzZS5fcGF0aFN0YXJ0LAogICAgICAgICAgcmVmLl9xdWVyeVN0YXJ0ICsgZGVsdGEsCiAgICAgICAgICByZWYuX2ZyYWdtZW50U3RhcnQgKyBkZWx0YSwKICAgICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICAgIH0KICAgIC8vIE1lcmdlIHBhdGhzLgoKICAgIC8vIFRoZSBSRkMgMzk4NiBhbGdvcml0aG0gbWVyZ2VzIHRoZSBiYXNlIHBhdGggd2l0aG91dCBpdHMgZmluYWwgc2VnbWVudAogICAgLy8gKGFueXRoaW5nIGFmdGVyIHRoZSBmaW5hbCAiLyIsIG9yIGV2ZXJ5dGhpbmcgaWYgdGhlIGJhc2UgcGF0aCBkb2Vzbid0CiAgICAvLyBjb250YWluIGFueSAiLyIpLCBhbmQgdGhlIHJlZmVyZW5jZSBwYXRoLgogICAgLy8gVGhlbiBpdCByZW1vdmVzICIuIiBhbmQgIi4uIiBzZWdtZW50cyB1c2luZyB0aGUgcmVtb3ZlLWRvdC1zZWdtZW50CiAgICAvLyBhbGdvcml0aG0uCiAgICAvLyBUaGlzIGNvZGUgY29tYmluZXMgdGhlIHR3byBzdGVwcy4gSXQgaXMgc2ltcGxpZmllZCBieSBrbm93aW5nIHRoYXQKICAgIC8vIHRoZSBiYXNlIHBhdGggY29udGFpbnMgbm8gIi4iIG9yICIuLiIgc2VnbWVudHMsIGFuZCB0aGUgcmVmZXJlbmNlCiAgICAvLyBwYXRoIGNhbiBvbmx5IGNvbnRhaW4gbGVhZGluZyAiLi4iIHNlZ21lbnRzLgoKICAgIFN0cmluZyBiYXNlVXJpID0gYmFzZS5fdXJpOwogICAgU3RyaW5nIHJlZlVyaSA9IHJlZi5fdXJpOwogICAgaW50IGJhc2VTdGFydCA9IGJhc2UuX3BhdGhTdGFydDsKICAgIGludCBiYXNlRW5kID0gYmFzZS5fcXVlcnlTdGFydDsKICAgIHdoaWxlIChiYXNlVXJpLnN0YXJ0c1dpdGgoIi4uLyIsIGJhc2VTdGFydCkpIGJhc2VTdGFydCArPSAzOwogICAgaW50IHJlZlN0YXJ0ID0gcmVmLl9wYXRoU3RhcnQ7CiAgICBpbnQgcmVmRW5kID0gcmVmLl9xdWVyeVN0YXJ0OwoKICAgIC8vLyBDb3VudCBvZiBsZWFkaW5nICIuLiIgc2VnbWVudHMgaW4gcmVmZXJlbmNlIHBhdGguCiAgICAvLy8gVGhlIGNvdW50IGlzIGRlY3JlbWVudGVkIHdoZW4gdGhlIHNlZ21lbnQgaXMgbWF0Y2hlZCB3aXRoIGEKICAgIC8vLyBzZWdtZW50IG9mIHRoZSBiYXNlIHBhdGgsIGFuZCBib3RoIGFyZSB0aGVuIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LgogICAgaW50IGJhY2tDb3VudCA9IDA7CgogICAgLy8vIENvdW50ICIuLi8iIHNlZ21lbnRzIGFuZCBhZHZhbmNlIGByZWZTdGFydGAgdG8gYWZ0ZXIgdGhlIHNlZ21lbnRzLgogICAgd2hpbGUgKHJlZlN0YXJ0ICsgMyA8PSByZWZFbmQgJiYgcmVmVXJpLnN0YXJ0c1dpdGgoIi4uLyIsIHJlZlN0YXJ0KSkgewogICAgICByZWZTdGFydCArPSAzOwogICAgICBiYWNrQ291bnQgKz0gMTsKICAgIH0KCiAgICAvLyBFeHRyYSBzbGFzaCBpbnNlcnRlZCBiZXR3ZWVuIGJhc2UgYW5kIHJlZmVyZW5jZSBwYXRoIHBhcnRzIGlmCiAgICAvLyB0aGUgYmFzZSBwYXRoIGNvbnRhaW5zIGFueSBzbGFzaGVzLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS4KICAgIC8vIChXZSBjb3VsZCB1c2UgYSBzbGFzaCBmcm9tIHRoZSBiYXNlIHBhdGggaW4gbW9zdCBjYXNlcywgYnV0IG5vdCBpZgogICAgLy8gd2UgcmVtb3ZlIHRoZSBlbnRpcmUgYmFzZSBwYXRoKS4KICAgIFN0cmluZyBpbnNlcnQgPSAiIjsKCiAgICAvLy8gUmVtb3ZlIHNlZ21lbnRzIGZyb20gdGhlIGJhc2UgcGF0aC4KICAgIC8vLyBTdGFydCB3aXRoIHRoZSBzZWdtZW50IHRyYWlsaW5nIHRoZSBsYXN0IHNsYXNoLAogICAgLy8vIHRoZW4gcmVtb3ZlIHNlZ21lbnRzIGZvciBlYWNoIGxlYWRpbmcgIi4uLyIgc2VnbWVudAogICAgLy8vIGZyb20gdGhlIHJlZmVyZW5jZSBwYXRoLCBvciBhcyBtYW55IG9mIHRoZW0gYXMgYXJlIGF2YWlsYWJsZS4KICAgIHdoaWxlIChiYXNlRW5kID4gYmFzZVN0YXJ0KSB7CiAgICAgIGJhc2VFbmQtLTsKICAgICAgaW50IGNoYXIgPSBiYXNlVXJpLmNvZGVVbml0QXQoYmFzZUVuZCk7CiAgICAgIGlmIChjaGFyID09IF9TTEFTSCkgewogICAgICAgIGluc2VydCA9ICIvIjsKICAgICAgICBpZiAoYmFja0NvdW50ID09IDApIGJyZWFrOwogICAgICAgIGJhY2tDb3VudC0tOwogICAgICB9CiAgICB9CgogICAgaWYgKGJhc2VFbmQgPT0gYmFzZVN0YXJ0ICYmICFiYXNlLmhhc1NjaGVtZSAmJiAhYmFzZS5oYXNBYnNvbHV0ZVBhdGgpIHsKICAgICAgLy8gSWYgdGhlIGJhc2UgaXMgKmp1c3QqIGEgcmVsYXRpdmUgcGF0aCAobm8gc2NoZW1lIG9yIGF1dGhvcml0eSksCiAgICAgIC8vIHRoZW4gbWVyZ2luZyB3aXRoIGFub3RoZXIgcmVsYXRpdmUgcGF0aCBkb2Vzbid0IGZvbGxvdyB0aGUKICAgICAgLy8gUkZDLTM5ODYgYmVoYXZpb3IuCiAgICAgIC8vIERvbid0IG5lZWQgdG8gY2hlY2sgYGJhc2UuaGFzQXV0aG9yaXR5YCBzaW5jZSB0aGUgYmFzZSBwYXRoIGlzCiAgICAgIC8vIG5vbi1lbXB0eSAtIGlmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSwgYSBub24tZW1wdHkgcGF0aCBpcyBhYnNvbHV0ZS4KCiAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIHN0YXJ0IG9mIHRoZSBiYXNlIHBhdGgsIGFuZCB3YW50IHRvIHN0YXkgcmVsYXRpdmUsCiAgICAgIC8vIHNvIGRvbid0IGluc2VydCBhIHNsYXNoLgogICAgICBpbnNlcnQgPSAiIjsKICAgICAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgc3RhcnQgb2YgdGhlIGJhc2UgcGF0aCB3aXRoIG1vcmUgIi4uLyIgbGVmdCBvdmVyCiAgICAgIC8vIGluIHRoZSByZWZlcmVuY2UgcGF0aCwgaW5jbHVkZSB0aG9zZSBzZWdtZW50cyBpbiB0aGUgcmVzdWx0LgogICAgICByZWZTdGFydCAtPSBiYWNrQ291bnQgKiAzOwogICAgfQoKICAgIHZhciBkZWx0YSA9IGJhc2VFbmQgLSByZWZTdGFydCArIGluc2VydC5sZW5ndGg7CiAgICB2YXIgbmV3VXJpID0gIiR7YmFzZS5fdXJpLnN1YnN0cmluZygwLCBiYXNlRW5kKX0kaW5zZXJ0IgogICAgICAgICIke3JlZi5fdXJpLnN1YnN0cmluZyhyZWZTdGFydCl9IjsKCiAgICByZXR1cm4gX1NpbXBsZVVyaSgKICAgICAgICBuZXdVcmksCiAgICAgICAgYmFzZS5fc2NoZW1lRW5kLAogICAgICAgIGJhc2UuX2hvc3RTdGFydCwKICAgICAgICBiYXNlLl9wb3J0U3RhcnQsCiAgICAgICAgYmFzZS5fcGF0aFN0YXJ0LAogICAgICAgIHJlZi5fcXVlcnlTdGFydCArIGRlbHRhLAogICAgICAgIHJlZi5fZnJhZ21lbnRTdGFydCArIGRlbHRhLAogICAgICAgIGJhc2UuX3NjaGVtZUNhY2hlKTsKICB9CgogIFN0cmluZyB0b0ZpbGVQYXRoKHtib29sIHdpbmRvd3N9KSB7CiAgICBpZiAoX3NjaGVtZUVuZCA+PSAwICYmICFfaXNGaWxlKSB7CiAgICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAkc2NoZW1lIFVSSSIpOwogICAgfQogICAgaWYgKF9xdWVyeVN0YXJ0IDwgX3VyaS5sZW5ndGgpIHsKICAgICAgaWYgKF9xdWVyeVN0YXJ0IDwgX2ZyYWdtZW50U3RhcnQpIHsKICAgICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgICAiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50Iik7CiAgICAgIH0KICAgICAgdGhyb3cgVW5zdXBwb3J0ZWRFcnJvcigKICAgICAgICAgICJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBmcmFnbWVudCBjb21wb25lbnQiKTsKICAgIH0KICAgIHdpbmRvd3MgPz89IF9VcmkuX2lzV2luZG93czsKICAgIHJldHVybiB3aW5kb3dzID8gX1VyaS5fdG9XaW5kb3dzRmlsZVBhdGgodGhpcykgOiBfdG9GaWxlUGF0aCgpOwogIH0KCiAgU3RyaW5nIF90b0ZpbGVQYXRoKCkgewogICAgaWYgKF9ob3N0U3RhcnQgPCBfcG9ydFN0YXJ0KSB7CiAgICAgIC8vIEhhcyBhdXRob3JpdHkgYW5kIG5vbi1lbXB0eSBob3N0LgogICAgICB0aHJvdyBVbnN1cHBvcnRlZEVycm9yKAogICAgICAgICAgIkNhbm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSAiCiAgICAgICAgICAid2l0aCBhbiBhdXRob3JpdHkiKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnBhdGg7CiAgfQoKICBVcmlEYXRhIGdldCBkYXRhIHsKICAgIGFzc2VydChzY2hlbWUgIT0gImRhdGEiKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgaW50IGdldCBoYXNoQ29kZSA9PiBfaGFzaENvZGVDYWNoZSA/Pz0gX3VyaS5oYXNoQ29kZTsKCiAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgIGlmIChpZGVudGljYWwodGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBvdGhlciBpcyBVcmkgJiYgX3VyaSA9PSBvdGhlci50b1N0cmluZygpOwogIH0KCiAgVXJpIF90b05vblNpbXBsZSgpIHsKICAgIHJldHVybiBfVXJpLl9pbnRlcm5hbCgKICAgICAgICB0aGlzLnNjaGVtZSwKICAgICAgICB0aGlzLnVzZXJJbmZvLAogICAgICAgIHRoaXMuaGFzQXV0aG9yaXR5ID8gdGhpcy5ob3N0IDogbnVsbCwKICAgICAgICB0aGlzLmhhc1BvcnQgPyB0aGlzLnBvcnQgOiBudWxsLAogICAgICAgIHRoaXMucGF0aCwKICAgICAgICB0aGlzLmhhc1F1ZXJ5ID8gdGhpcy5xdWVyeSA6IG51bGwsCiAgICAgICAgdGhpcy5oYXNGcmFnbWVudCA/IHRoaXMuZnJhZ21lbnQgOiBudWxsKTsKICB9CgogIFN0cmluZyB0b1N0cmluZygpID0+IF91cmk7Cn0KCi8vLyBTcGVjaWFsIFtfVXJpXSBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgW1VyaURhdGFdLgpjbGFzcyBfRGF0YVVyaSBleHRlbmRzIF9VcmkgewogIGZpbmFsIFVyaURhdGEgX2RhdGE7CgogIF9EYXRhVXJpKHRoaXMuX2RhdGEsIFN0cmluZyBwYXRoLCBTdHJpbmcgcXVlcnkpCiAgICAgIDogc3VwZXIuX2ludGVybmFsKCJkYXRhIiwgbnVsbCwgbnVsbCwgbnVsbCwgcGF0aCwgcXVlcnksIG51bGwpOwoKICBVcmlEYXRhIGdldCBkYXRhID0+IF9kYXRhOwp9CgovLy8gQ2hlY2tzIHdoZXRoZXIgW3RleHRdIHN0YXJ0cyB3aXRoICJkYXRhOiIgYXQgcG9zaXRpb24gW3N0YXJ0XS4KLy8vCi8vLyBUaGUgdGV4dCBtdXN0IGJlIGxvbmcgZW5vdWdoIHRvIGFsbG93IHJlYWRpbmcgZml2ZSBjaGFyYWN0ZXJzCi8vLyBmcm9tIHRoZSBbc3RhcnRdIHBvc2l0aW9uLgovLy8KLy8vIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSB3aGljaCBpcyB6ZXJvIGlmIHRleHQgc3RhcnRzIHdpdGggYWxsLWxvd2VyY2FzZQovLy8gImRhdGE6IiBhbmQgMHgyMCBpZiB0aGUgdGV4dCBzdGFydHMgd2l0aCAiZGF0YToiIHRoYXQgaXNuJ3QgYWxsIGxvd2VyLWNhc2UuCi8vLyBBbGwgb3RoZXIgdmFsdWVzIG1lYW5zIHRoZSB0ZXh0IHN0YXJ0cyB3aXRoIHNvbWUgb3RoZXIgY2hhcmFjdGVyLgppbnQgX3N0YXJ0c1dpdGhEYXRhKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQpIHsKICAvLyBNdWx0aXBseSBieSAzIHRvIGF2b2lkIGEgbm9uLWNvbG9uIGNoYXJhY3RlciBtYWtpbmcgZGVsdGEgYmUgMHgyMC4KICBpbnQgZGVsdGEgPSAodGV4dC5jb2RlVW5pdEF0KHN0YXJ0ICsgNCkgXiBfQ09MT04pICogMzsKICBkZWx0YSB8PSB0ZXh0LmNvZGVVbml0QXQoc3RhcnQpIF4gMHg2NCAvKmQqLzsKICBkZWx0YSB8PSB0ZXh0LmNvZGVVbml0QXQoc3RhcnQgKyAxKSBeIDB4NjEgLyphKi87CiAgZGVsdGEgfD0gdGV4dC5jb2RlVW5pdEF0KHN0YXJ0ICsgMikgXiAweDc0IC8qdCovOwogIGRlbHRhIHw9IHRleHQuY29kZVVuaXRBdChzdGFydCArIDMpIF4gMHg2MSAvKmEqLzsKICByZXR1cm4gZGVsdGE7Cn0KCi8vLyBIZWxwZXIgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcsIG9yIGAwYCBmb3IgYG51bGxgLgppbnQgX3N0cmluZ09yTnVsbExlbmd0aChTdHJpbmcgcykgPT4gKHMgPT0gbnVsbCkgPyAwIDogcy5sZW5ndGg7CpIqAE5OPAETASQZGx0YFxkZGiAgIB0hICAgAS4BBCADEQMxNANMUwQVBjwFSyQFRCQGIAEGLAVDTjQFQU0qBUJIMAU9RkRHNgU9DUVKSksTBTo7BTgVOUYjQEYQBTtHQkcYBU1MPCNARDZORwVISUYpLQVCIAU3SjNHBg8WFxMQEyUUSSABBj4FDwUJKD0FKDMFISkFIisJBSsFQz5DNwU6RxcFRg8GOzoBBj8FRh4GPDsBBkQFKAVCEAVEKAVFPTk9BUk3UElNNgVFRkBHFQVIPEMFKwUJEC4FES8FGC8FGTAFDSkJBScFCRAuBREvBRUvBRYwBRsxBUseKQVKMAUhOgkFRgY9AQZHBUo3SwZHAQY8BU9QOQVRTikFSzhNGVBKIAVLSkxJS0cFPgYtGBkmHi8cHCAZFQQBBj4FRElLBTsFRUM9TEkOBi0uJiEsHCApFQQBBiYFPwUnQAYVAQYmBUcMBUIGGAEGPAU+GgYXAQY3BUUUBUwOBSo7JgYTAQY3BUpOBhABBiEFRx4FPQYTAQZIPwU+BhQBBjAFQRAGFwEGT09NBVAhBiEBBkNFaj41BUMTSSw3LAUnBisBBkNFak0mBUpHPAVCBjQBBioFShYGFwEGNwYrAQY7BhkBBjMFM0oSPgYUAQYvBhUBBjIGGAEGMAYZAQZHBhwBBkodBVAaBUsGFQE0BktHBg8OMjQKBkUtIAEGLAU5EAVDFAVFHQVCRkY/DwVFRj9HFQVIPEMFQz8FRUdGMwVAHQUrLTQ2KiwFQgUrLTQ2OUNLSAU2GQVHGQZLPSUBBiwFSgtIFwYUAT0GORQBTSIBPxUBBkoFSSUFQE4FRiQFRhpABQ4FNE03BUg7BR0aJh4eHCAdNy8FTEk9Bg8WFxMQEyUUSRkBBksFRAYYAQY3BUsnBR8FIwYhAQY3BR8FUFcFTVETTSwGIQEGNwVJD0IcSwVNBToFTSIGFwEGOQVMUAUjQSQGO0NLIAcySwczJSUiByoHOgdEBzMlJSIHQgc6SDseQgdFRkk/OQcoOzYzIAceH0lFB0kHLgcuGAE5HDMcHkwxJksIUQYBS04VIAEtSUgMECYmJiIiISU8R0QoJgYuHkJDIxkuCAZQQk9SUBsBMi4uMDYBPBMBSEBLRSshSxoeKS4hBkQ/TCA2ATokJCQlKQE2ARRHOjonO1A5GkQ3OholLjYpOFBQTjIaDzwnSR8mPC8dJjU+LR01KRsQQCIdHR0rLhkgMkQ1RCEkGhc8OSQkJCQpLBsiEA42HUElLjc1QiAhJBoXODMkJCQoKSwbIhAODE8cQSMsNjNAHh8iGBU2MSIiIiYnKhkgDgwKCAYBFCspHBwcHB0gCEkuBgFMNwQBBjkFTFAjBVAGPjgKJRsTBgQBBkUuBUdBPkMFR0YNBTAdBUZGDgY0TwQBBkQ/EAVEPxABP0AuAUVFRz4hAURGHgVFNwVBRAwFTw4GNyROBAEGOQVEQUNGGwVDQxgGOxxEBAEGRBcFSE0MBj4kHEcEAQY/KQVHRUceBilFBAEGLAVHQkE6Bik9BAEGQUVqTTMFQxMFUQ8GPCQ2KBkdRwofLzI9PQgSCAQBBk8+BUYVBjQvAUlIK0sGAR8XGyglGh8sKQoPHkMKPBpFCiQbCAYBGkEGAToWQQYeARMEAQZPPwVGFQVKKAUmDDAeHSIGTRlQMAdROU8BRSlLBgEaJx1RCEQpSQgUBgE4Gh9GGhs1KCUcGkAPLi4MGQoeKh47DB8ZEUgtChshGAgGMyUuJDQGEhYtD0IrKwgGGB5JCCRLBiU4HBkvMxwgFgoPIykUCAYSBAIBHDklFwEGKgVIIzAGGgEGHwU4ST4GFgEGLAVGMgYNAQYaBRYGFQE2FwE8GgEGOAYeAQZCBhABBicFHQYWAQY7BigyAU4GMgZMNwZQHgYvUSQBKwZQSTQaEhEPFRUVFRYZFxoTHzUnMwgGGhEOHSknRQg6JylRRQwoCAYSSxImRAYVHz0GUAQBIxAWFxMQEyUUSRpCSkFCI09KJCZLEQYoFlFDPDgNJwYxEQZQBAEkPC9MBAElPS9NBAEZIh0ZGgQBJAEUIiEzBhIEARE0EgQBMislJw4EASQBKgEhJTM6LwQBSAZMUBMGS0siBkBQOi4tJygYHSkrRBYMChYIBhEEAR09MAQBUS0XEQ4BNRkiIDMhMR4wHREKCB8qPhY4RgorIUEKQTArN1EKCB4cNjc9RkMRCgg2BhAYHBQUMCsEASQzPRMrJQQBKTg9UQQBNCcBMTMhIx1CEUUKCAgEAS4xIDc3HTwRSQoIBgQBRkREDgYZG0QNHkQGBAE7HCROMwYgHzoNFyoGBAFCJCkuDyIfLDAfQwoIDSkGHTs6QlEIIio9OQhCPgYBICUrLxpQUDBBPzsKUA8hLD87CkFACA0XKj8dJSo5CC4GBAEPFhcTEBMlFEkaPEgoIBo2Lw0cBiYcPg0hBhgmDRkbMCgIBhg1JBlAEQYBJjBRGQ0YOSMbCAYBNFENGwYBHD4NIQYBUAQBGShQBAEiICcBHEkuBiEbJT4cEwQBLBlKHQQBNSg9MiNBCB1HBiEEARhDMSUEATIuQxEEAQYmBUxMNwVGOkMGTkwjIUozOEQINjg3BhdCKiwyHAoIBjAEASlQBAEGQgU/QD0GRRkeF00eARopHkNCMxYUCiM8OB0eIzopHxwKIx8eHSlOTSUmPyIMIAoRLjEPHj4xK0YeDAojPDgdKR8eCAY7Hjg2GwYeBAEGPgVHBkEhODJNBiQoMSs2CEQiCAYrOigEATMFPTUpKSsvEwQBRSVIBAE7SSY2SDBDBhMYTiMNHEIWBhoeQB0GOxMEAUMGRUhJUEROBiUEAT1LGSVJCEcjBi4BIRgBNB8XMy8bNwgGASsuJA8hJyYKCAgeBAFFJ0ghBAEGNwVOR0QFTkRJBU8GTTImMgYzNDU3NzIGOSRLFwgpBkclPwZMLREEAShCGRczGx83OA1ESxwaFRodHBcKCCoVJEElQUIUQAgGLAQBBkUFTk4GJ0EpODMpBAEGRiAFQjxFEQVEBhxBKRkeF0saLk4RDxwaIENBJRgWDEMkIR4THgxFOBEcKygjOi8jIkoQDgwrCiNAIx8eCAYaEwYePAYeBAErTAQBLCNEBAEGKgY5ATZNFxY4NBUTBgE+KUArNxgPCCREJygxQQ8IGBMGHksEAUUGP0saNCskGAQBMQY8Qk4yNEseHi4bHSEfIBwMChwjHA8dCAYlHQQBQgZCOAZHTEBKShVISik0EwZLHh4uGx02Hx4RHAojHA8dCAZHEwY8PB0EAUAtSi4nHkcKGkcRCggGEQQBIi0EASIWGSAXFBcYJyckLSVACDcgJwgNIiQtJRVQOT8PKSEhJCIkKxMnDBErPRM6JSgnRy8ZRCdDEhdJRxAVR1E9FypCPVA1RhAODEEKCAZJUCwEASsBKgElAScBLQEpATQBFhhFBjEYRgYoGEYGMiYEASYsTwYXHksGGh5OBhw/BAEZJh5EIAY4KkEhLCgeBAEuISUfIy9CPx0NPwYhRBwbHRwcHAgGJUQeBAEdMQQBKCAbFQYoGRUXBgQBBiwFSgtIFwZJARYoBAEdGyY6LkMqFhsGFDc9GgQBIy0bIi4mHh4eJiAsJAQBFTMEATMBRiQrDxMaAToSFCAdPRQPRUkINwYBHyYdLicqFxoICwYmEwQBSywBBkYsBjUSIiwyLA89GjQuETcKCAYRBAEGKgVGBUYFTgVQSQYcThgaIB5QGCgpHCIwGA8IBhUSSSsPNggNFiorHkIKJCUyDDYSNx0RHwoIBiMEATUlRwQBLBlFBAFGRhgBLCkuLS0tLC0nLS0tLS0tLSwtBQEsLS4tLS0sLSctLS0tLS0tLC0FAT0pLi0tLS0tLS0tLS0tLS0sLQUBJyUuLS0tLC0nLS0tKC0tLSgtBQFBKi4tLS0sLSctBy0HLS0tKC0FAUM1Kxs5LC4tLS0sLSstLS0tLS0tLC0FATk7BSwuLS0tLS0tLR4tKy0HLQctBQE4GUAnLi0tLSwtKy0tLS0tLS0sLQUBOBk7Ji4tLS0sLSstLS0tLS0tLC0FATQbPycuLS0tLC0rLS0tLS0tLSwtBQE0JykuLS0tLS0rLS0tAS0tLS0sLQUBNRskIy4tLS0tLS0tLS0tLS0tLC0FAgFIDEgBBDMDSUgDUUAEECMGQxYFSUsLBhYBBjwFQk4cBUsjBUUFRwU3CTElCQYlAQYsBhEBQQEiLQEGPAU/NwYtGBkmHiolGBlBHCE0CCZBJAYYRCASICY8DRlFBjgEAQY+BT43Bi0uJiEqJTwgGhkyDSAmFk8zBgE4BAEGTgVFTzkGJSBGBhxRBhshQQYZJwY2IwQBBkZHDQVKCwY9SzgVBk9ADTQcTggkTRkkTgYfHT0IIVAGJxlMCBsjTQg3GUZINxlKCAQBBjcFQxcFRCwGMhkwKSQcGBIIEQYXBAEGJgUmBQlSCgVRQwVPSzIFTDxLOQVMTEU3BUUGJRsvHCMlCB9MPTIIBkIEAQY4BUoOBhAtGRIrORwbKj0YBidBLRYEAQYkBT1DF0swUAUOBTYFT01KBU4GGCokKzwEAQYuBUhDMVAFSzAGFxxNFEsZBj0vLU0gRwgGFwQBBjAGNwEGRQUuBkkBBjAFQQVJTDwGHxksFDIGAUccHiYwKSEQFQgGGiohORUGEzApISQPIzAbJBQWDApCCAYkEwQBBkAFTCtIS0cmBU5JHwYwHEguHj0IBhksFD03BkcEAQY6BUVHGUZKTU0FQCAGJyU8MC0mR0sbBhMEAUEmNgEZHBwgHSUZDhMjITUbHhoUCj0IBidJHDsGHCsWCxwlIx4wOREKCB4iDyYqHT09OwoPCAYUKhQ5DUw2PUcjGjwIBjAEAQZHBT8GH0ZHKxQtGxYYRyQPKEBCCAYhLx0mPQoIBgQBF0MBOwVMOE8FQyMvLi4uLS4oLi4uLi4uLi0uBQEuBTVPJUkFUTIBTiAvLi4uLi4oLi4uKS4uLikuBQIBSC5GLCoBNh8BRh8BOh8BPB8BNSABOCMBSR8BHhoBOx8kASgdAUUENgROTVEiBEFITy0ETUlMUEw/Qk08OAFKKQFBBDMETyxITUxLS0tMLARKLwQ9ShI/SUtLSjtJOk46O0NKSTM6Sz1RP0IgBBJNT0wESUpJSkohR1AnBEVMUExPDSIpAS0dAS0fHSIfHh8eGx0aFxgbIiMgIR0eAU0kGQFQFS4uLi4wNi4BLxVMAS4kThgpAUsBSycvOgFNLE0MQi0mKAYEAUpRBk5MIkJOJQYEASwJAT4yJCU9JSguATgkJiwpKC4BOSQuLCAoLgE1JCwdKC4BKygxLCguATAcLiAoLgE0Iy4uLiopKC4BMyMuLi4pKC4BNCIuKSguATMiLikoLgEhIQErHCMpKC4BLhwkKSguAS8cIEZMASgcICkoLgErHCEpKC4BLBwpKC4BJRwdKC4BJx0bLgEtIB4BQUwqHQEpHR0eARECAUgpATwERSMEHUofHSYfPClCIiIfIgQQAgEiFRgYGBgZHAE0QiYXFgEOERcXFxcYGxoBKCs3RTU4AUJCREgBQiM+AUA2ATQBIUEzLgQBFiQzEx0bHhodHSANNAYZBAEaSDc3DBVEEU8cHg4EAT41OAwZUAEWNBsaRQYgGEkGJBhGBigsBikvMAQBIhwbLi8dKCUcLRcIBistBAEsNE0EATU6QDAhPwZIBAEeKTkvBAEfARkjUUwEAQ8WFxMQEyUUSRogGjsqDRwGJhxDIT0NFQYYKw0uGzAtCAYYOiE1QBEGASYwTiENNjkjGwgGATQfQi8/BgEcQy81BgFQBAEiLQQBIiMsBjEEAUVJPEkpNiMcJxwaJiEnIigIFilDNBsUHSQkJCUoIA9MLwgGHBo4QDEbFB0dHR0lKCAIHT5DNBsUHR0dHR4oIAgkBh80PS4ZEhsbGxsjJh4GMipNJTUXCDJBLRkSGxsbGyMmHgYUAU1NMUoSSkk0ASAeJSRBIyIBOkRNFwFLSxUWBgFFREooGAEsODxGIhEuHBYjFQgGAUxJRBxITQFLIhNMRiEGATQ9KwEXEBkZGRkhJBwEASYnTwYlKiBNCB5OBiFEBAEZIyseRCAGFgQBFR4RBAE4ASMtNQQBFxsVFy4pEysyBAEdAgE3HhcBMkYBHQIBQwRCHwRNUEYuSDkwNDQ0EAIBSUEBEmRhcnQ6Y29yZS91cmkuZGFydC5vcmctZGFydGxhbmctc2RrOi8vL3J1bnRpbWUvbGliL3VyaV9wYXRjaC5kYXJ0iakvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gcGFydCBvZiAiY29yZV9wYXRjaC5kYXJ0IjsKCnR5cGVkZWYgVXJpIF9VcmlCYXNlQ2xvc3VyZSgpOwoKVXJpIF91bnN1cHBvcnRlZFVyaUJhc2UoKSB7CiAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIidVcmkuYmFzZScgaXMgbm90IHN1cHBvcnRlZCIpOwp9CgovLyBfdXJpQmFzZUNsb3N1cmUgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBlbWJlZGRlciB0byBzdXBwbHkgYSBkaWZmZXJlbnQKLy8gdmFsdWUgZm9yIFVyaS5iYXNlLgpAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCl9VcmlCYXNlQ2xvc3VyZSBfdXJpQmFzZUNsb3N1cmUgPSBfdW5zdXBwb3J0ZWRVcmlCYXNlOwoKQHBhdGNoCmNsYXNzIFVyaSB7CiAgQHBhdGNoCiAgc3RhdGljIFVyaSBnZXQgYmFzZSA9PiBfdXJpQmFzZUNsb3N1cmUoKTsKfQoKLy8vIFZNIGltcGxlbWVudGF0aW9uIG9mIFVyaS4KQHBhdGNoCmNsYXNzIF9VcmkgewogIHN0YXRpYyBmaW5hbCBib29sIF9pc1dpbmRvd3NDYWNoZWQgPSBfaXNXaW5kb3dzUGxhdGZvcm07CgogIHN0YXRpYyBib29sIGdldCBfaXNXaW5kb3dzUGxhdGZvcm0gbmF0aXZlICJVcmlfaXNXaW5kb3dzUGxhdGZvcm0iOwoKICBAcGF0Y2gKICBzdGF0aWMgYm9vbCBnZXQgX2lzV2luZG93cyA9PiBfaXNXaW5kb3dzQ2FjaGVkOwoKICBAcGF0Y2gKICBzdGF0aWMgU3RyaW5nIF91cmlFbmNvZGUoTGlzdDxpbnQ+IGNhbm9uaWNhbFRhYmxlLCBTdHJpbmcgdGV4dCwKICAgICAgRW5jb2RpbmcgZW5jb2RpbmcsIGJvb2wgc3BhY2VUb1BsdXMpIHsKICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSB0ZXh0IHdpbGwgYmUgY2hhbmdlZCBieSBlbmNvZGluZy4KICAgIGludCBpID0gMDsKICAgIGlmIChpZGVudGljYWwoZW5jb2RpbmcsIHV0ZjgpIHx8CiAgICAgICAgaWRlbnRpY2FsKGVuY29kaW5nLCBsYXRpbjEpIHx8CiAgICAgICAgaWRlbnRpY2FsKGVuY29kaW5nLCBhc2NpaSkpIHsKICAgICAgLy8gRW5jb2RpbmcgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbCBzdHJpbmcuCiAgICAgIC8vIEZpbmQgZmlyc3QgY2hhcmFjdGVyIHRoYXQgbmVlZHMgZW5jb2RpbmcuCiAgICAgIGZvciAoOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjaGFyID0gdGV4dC5jb2RlVW5pdEF0KGkpOwogICAgICAgIGlmIChjaGFyID49IDEyOCB8fAogICAgICAgICAgICBjYW5vbmljYWxUYWJsZVtjaGFyID4+IDRdICYgKDEgPDwgKGNoYXIgJiAweDBmKSkgPT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaSA9PSB0ZXh0Lmxlbmd0aCkgcmV0dXJuIHRleHQ7CgogICAgLy8gRW5jb2RlIHRoZSBzdHJpbmcgaW50byBieXRlcyB0aGVuIGdlbmVyYXRlIGFuIEFTQ0lJIG9ubHkgc3RyaW5nCiAgICAvLyBieSBwZXJjZW50IGVuY29kaW5nIHNlbGVjdGVkIGJ5dGVzLgogICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CiAgICAgIHJlc3VsdC53cml0ZUNoYXJDb2RlKHRleHQuY29kZVVuaXRBdChqKSk7CiAgICB9CgogICAgLy8gVE9ETyhscm4pOiBJcyB0aGVyZSBhIHdheSB0byBvbmx5IGVuY29kZSBmcm9tIGluZGV4IGkgYW5kIGZvcndhcmRzLgogICAgdmFyIGJ5dGVzID0gZW5jb2RpbmcuZW5jb2RlKHRleHQpOwogICAgZm9yICg7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewogICAgICBpbnQgYnl0ZSA9IGJ5dGVzW2ldOwogICAgICBpZiAoYnl0ZSA8IDEyOCAmJgogICAgICAgICAgKChjYW5vbmljYWxUYWJsZVtieXRlID4+IDRdICYgKDEgPDwgKGJ5dGUgJiAweDBmKSkpICE9IDApKSB7CiAgICAgICAgcmVzdWx0LndyaXRlQ2hhckNvZGUoYnl0ZSk7CiAgICAgIH0gZWxzZSBpZiAoc3BhY2VUb1BsdXMgJiYgYnl0ZSA9PSBfU1BBQ0UpIHsKICAgICAgICByZXN1bHQud3JpdGVDaGFyQ29kZShfUExVUyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgU3RyaW5nIGhleERpZ2l0cyA9ICcwMTIzNDU2Nzg5QUJDREVGJzsKICAgICAgICByZXN1bHQKICAgICAgICAgIC4ud3JpdGVDaGFyQ29kZShfUEVSQ0VOVCkKICAgICAgICAgIC4ud3JpdGVDaGFyQ29kZShoZXhEaWdpdHMuY29kZVVuaXRBdChieXRlID4+IDQpKQogICAgICAgICAgLi53cml0ZUNoYXJDb2RlKGhleERpZ2l0cy5jb2RlVW5pdEF0KGJ5dGUgJiAweDBmKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICB9Cn0KUgBOTjwBHgEfARw9AgFMFxo3AQcMCSwCAR4HDTsBRQEJMgEJQi08DyUnJjozJScbRREKCAYnAUcrLiIwBgFLJyQbGEckMiUPNQ8kOz4IBh4EAgEeZGFydDpjb3JlLXBhdGNoL3VyaV9wYXRjaC5kYXJ0NG9yZy1kYXJ0bGFuZy1zZGs6Ly8vcnVudGltZS9saWIvaWRlbnRpY2FsX3BhdGNoLmRhcnSB0i8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBwYXJ0IG9mICJjb3JlX3BhdGNoLmRhcnQiOwoKQHBhdGNoCkBwcmFnbWEoInZtOmV4YWN0LXJlc3VsdC10eXBlIiwgYm9vbCkKYm9vbCBpZGVudGljYWwoT2JqZWN0IGEsIE9iamVjdCBiKSBuYXRpdmUgIklkZW50aWNhbF9jb21wYXJpc29uIjsKCkBwYXRjaApAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKaW50IGlkZW50aXR5SGFzaENvZGUoT2JqZWN0IG9iamVjdCkgPT4gb2JqZWN0Ll9pZGVudGl0eUhhc2hDb2RlOwoPAE5OPAEeAQcmQgEHIkEBJGRhcnQ6Y29yZS1wYXRjaC9pZGVudGljYWxfcGF0Y2guZGFydCtvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvY29yZS9wcmludC5kYXJ0gcQvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQovLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQovLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKcGFydCBvZiBkYXJ0LmNvcmU7CgovLy8gUHJpbnRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QgdG8gdGhlIGNvbnNvbGUuCnZvaWQgcHJpbnQoT2JqZWN0IG9iamVjdCkgewogIFN0cmluZyBsaW5lID0gIiRvYmplY3QiOwogIGlmIChwcmludFRvWm9uZSA9PSBudWxsKSB7CiAgICBwcmludFRvQ29uc29sZShsaW5lKTsKICB9IGVsc2UgewogICAgcHJpbnRUb1pvbmUobGluZSk7CiAgfQp9ChEATk48ARMBQRwbHRoLFwQCARRkYXJ0OmNvcmUvcHJpbnQuZGFydCtvcmctZGFydGxhbmctc2RrOi8vL3Nkay9saWIvX2h0dHAvaHR0cC5kYXJ0wAEU7C8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgpsaWJyYXJ5IGRhcnQuX2h0dHA7CgppbXBvcnQgJ2RhcnQ6YXN5bmMnOwppbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicKICAgIHNob3cKICAgICAgICBIYXNoTWFwLAogICAgICAgIEhhc2hTZXQsCiAgICAgICAgUXVldWUsCiAgICAgICAgTGlzdFF1ZXVlLAogICAgICAgIExpbmtlZExpc3QsCiAgICAgICAgTGlua2VkTGlzdEVudHJ5LAogICAgICAgIFVubW9kaWZpYWJsZU1hcFZpZXc7CmltcG9ydCAnZGFydDpjb252ZXJ0JzsKaW1wb3J0ICdkYXJ0OmRldmVsb3BlcicgaGlkZSBsb2c7CmltcG9ydCAnZGFydDpfaW50ZXJuYWwnIHNob3cgU2luY2UsIEh0dHBTdGF0dXM7CmltcG9ydCAnZGFydDptYXRoJzsKaW1wb3J0ICdkYXJ0OmlvJzsKaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOwoKcGFydCAnY3J5cHRvLmRhcnQnOwpwYXJ0ICdodHRwX2RhdGUuZGFydCc7CnBhcnQgJ2h0dHBfaGVhZGVycy5kYXJ0JzsKcGFydCAnaHR0cF9pbXBsLmRhcnQnOwpwYXJ0ICdodHRwX3BhcnNlci5kYXJ0JzsKcGFydCAnaHR0cF9zZXNzaW9uLmRhcnQnOwpwYXJ0ICdvdmVycmlkZXMuZGFydCc7CnBhcnQgJ3dlYnNvY2tldC5kYXJ0JzsKcGFydCAnd2Vic29ja2V0X2ltcGwuZGFydCc7CgovKioKICogQSBzZXJ2ZXIgdGhhdCBkZWxpdmVycyBjb250ZW50LCBzdWNoIGFzIHdlYiBwYWdlcywgdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wuCiAqCiAqIFRoZSBIdHRwU2VydmVyIGlzIGEgW1N0cmVhbV0gdGhhdCBwcm92aWRlcyBbSHR0cFJlcXVlc3RdIG9iamVjdHMuIEVhY2gKICogSHR0cFJlcXVlc3QgaGFzIGFuIGFzc29jaWF0ZWQgW0h0dHBSZXNwb25zZV0gb2JqZWN0LgogKiBUaGUgc2VydmVyIHJlc3BvbmRzIHRvIGEgcmVxdWVzdCBieSB3cml0aW5nIHRvIHRoYXQgSHR0cFJlc3BvbnNlIG9iamVjdC4KICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBiaW5kIGFuIEh0dHBTZXJ2ZXIgdG8gYW4gSVB2NgogKiBbSW50ZXJuZXRBZGRyZXNzXSBvbiBwb3J0IDgwICh0aGUgc3RhbmRhcmQgcG9ydCBmb3IgSFRUUCBzZXJ2ZXJzKQogKiBhbmQgaG93IHRvIGxpc3RlbiBmb3IgcmVxdWVzdHMuCiAqIFBvcnQgODAgaXMgdGhlIGRlZmF1bHQgSFRUUCBwb3J0LiBIb3dldmVyLCBvbiBtb3N0IHN5c3RlbXMgYWNjZXNzaW5nCiAqIHRoaXMgcmVxdWlyZXMgc3VwZXItdXNlciBwcml2aWxlZ2VzLiBGb3IgbG9jYWwgdGVzdGluZyBjb25zaWRlcgogKiB1c2luZyBhIG5vbi1yZXNlcnZlZCBwb3J0ICgxMDI0IGFuZCBhYm92ZSkuCiAqCiAqICAgICBpbXBvcnQgJ2RhcnQ6aW8nOwogKgogKiAgICAgbWFpbigpIHsKICogICAgICAgSHR0cFNlcnZlcgogKiAgICAgICAgICAgLmJpbmQoSW50ZXJuZXRBZGRyZXNzLmFueUlQdjYsIDgwKQogKiAgICAgICAgICAgLnRoZW4oKHNlcnZlcikgewogKiAgICAgICAgICAgICBzZXJ2ZXIubGlzdGVuKChIdHRwUmVxdWVzdCByZXF1ZXN0KSB7CiAqICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZS53cml0ZSgnSGVsbG8sIHdvcmxkIScpOwogKiAgICAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICogICAgICAgICAgICAgfSk7CiAqICAgICAgICAgICB9KTsKICogICAgIH0KICoKICogSW5jb21wbGV0ZSByZXF1ZXN0cywgaW4gd2hpY2ggYWxsIG9yIHBhcnQgb2YgdGhlIGhlYWRlciBpcyBtaXNzaW5nLCBhcmUKICogaWdub3JlZCwgYW5kIG5vIGV4Y2VwdGlvbnMgb3IgSHR0cFJlcXVlc3Qgb2JqZWN0cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGVtLgogKiBMaWtld2lzZSwgd2hlbiB3cml0aW5nIHRvIGFuIEh0dHBSZXNwb25zZSwgYW55IFtTb2NrZXRdIGV4Y2VwdGlvbnMgYXJlCiAqIGlnbm9yZWQgYW5kIGFueSBmdXR1cmUgd3JpdGVzIGFyZSBpZ25vcmVkLgogKgogKiBUaGUgSHR0cFJlcXVlc3QgZXhwb3NlcyB0aGUgcmVxdWVzdCBoZWFkZXJzIGFuZCBwcm92aWRlcyB0aGUgcmVxdWVzdCBib2R5LAogKiBpZiBpdCBleGlzdHMsIGFzIGEgU3RyZWFtIG9mIGRhdGEuIElmIHRoZSBib2R5IGlzIHVucmVhZCwgaXQgaXMgZHJhaW5lZAogKiB3aGVuIHRoZSBzZXJ2ZXIgd3JpdGVzIHRvIHRoZSBIdHRwUmVzcG9uc2Ugb3IgY2xvc2VzIGl0LgogKgogKiAjIyBCaW5kIHdpdGggYSBzZWN1cmUgSFRUUFMgY29ubmVjdGlvbgogKgogKiBVc2UgW2JpbmRTZWN1cmVdIHRvIGNyZWF0ZSBhbiBIVFRQUyBzZXJ2ZXIuCiAqCiAqIFRoZSBzZXJ2ZXIgcHJlc2VudHMgYSBjZXJ0aWZpY2F0ZSB0byB0aGUgY2xpZW50LiBUaGUgY2VydGlmaWNhdGUKICogY2hhaW4gYW5kIHRoZSBwcml2YXRlIGtleSBhcmUgc2V0IGluIHRoZSBbU2VjdXJpdHlDb250ZXh0XQogKiBvYmplY3QgdGhhdCBpcyBwYXNzZWQgdG8gW2JpbmRTZWN1cmVdLgogKgogKiAgICAgaW1wb3J0ICdkYXJ0OmlvJzsKICogICAgIGltcG9ydCAiZGFydDppc29sYXRlIjsKICoKICogICAgIG1haW4oKSB7CiAqICAgICAgIFNlY3VyaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFNlY3VyaXR5Q29udGV4dCgpOwogKiAgICAgICB2YXIgY2hhaW4gPQogKiAgICAgICAgICAgUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoJ2NlcnRpZmljYXRlcy9zZXJ2ZXJfY2hhaW4ucGVtJykKICogICAgICAgICAgIC50b0ZpbGVQYXRoKCk7CiAqICAgICAgIHZhciBrZXkgPQogKiAgICAgICAgICAgUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoJ2NlcnRpZmljYXRlcy9zZXJ2ZXJfa2V5LnBlbScpCiAqICAgICAgICAgICAudG9GaWxlUGF0aCgpOwogKiAgICAgICBjb250ZXh0LnVzZUNlcnRpZmljYXRlQ2hhaW4oY2hhaW4pOwogKiAgICAgICBjb250ZXh0LnVzZVByaXZhdGVLZXkoa2V5LCBwYXNzd29yZDogJ2RhcnRkYXJ0Jyk7CiAqCiAqICAgICAgIEh0dHBTZXJ2ZXIKICogICAgICAgICAgIC5iaW5kU2VjdXJlKEludGVybmV0QWRkcmVzcy5hbnlJUHY2LAogKiAgICAgICAgICAgICAgICAgICAgICAgNDQzLAogKiAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkKICogICAgICAgICAgIC50aGVuKChzZXJ2ZXIpIHsKICogICAgICAgICAgICAgc2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoJ0hlbGxvLCB3b3JsZCEnKTsKICogICAgICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAqICAgICAgICAgICAgIH0pOwogKiAgICAgICAgICAgfSk7CiAqICAgICB9CiAqCiAqICBUaGUgY2VydGlmaWNhdGVzIGFuZCBrZXlzIGFyZSBQRU0gZmlsZXMsIHdoaWNoIGNhbiBiZSBjcmVhdGVkIGFuZAogKiAgbWFuYWdlZCB3aXRoIHRoZSB0b29scyBpbiBPcGVuU1NMLgogKgogKiAjIyBDb25uZWN0IHRvIGEgc2VydmVyIHNvY2tldAogKgogKiBZb3UgY2FuIHVzZSB0aGUgW2xpc3Rlbk9uXSBjb25zdHJ1Y3RvciB0byBhdHRhY2ggYW4gSFRUUCBzZXJ2ZXIgdG8KICogYSBbU2VydmVyU29ja2V0XS4KICoKICogICAgIGltcG9ydCAnZGFydDppbyc7CiAqCiAqICAgICBtYWluKCkgewogKiAgICAgICBTZXJ2ZXJTb2NrZXQuYmluZChJbnRlcm5ldEFkZHJlc3MuYW55SVB2NiwgODApCiAqICAgICAgICAgLnRoZW4oKHNlcnZlclNvY2tldCkgewogKiAgICAgICAgICAgSHR0cFNlcnZlciBodHRwc2VydmVyID0gbmV3IEh0dHBTZXJ2ZXIubGlzdGVuT24oc2VydmVyU29ja2V0KTsKICogICAgICAgICAgIHNlcnZlclNvY2tldC5saXN0ZW4oKFNvY2tldCBzb2NrZXQpIHsKICogICAgICAgICAgICAgc29ja2V0LndyaXRlKCdIZWxsbywgY2xpZW50LicpOwogKiAgICAgICAgICAgfSk7CiAqICAgICAgICAgfSk7CiAqICAgICB9CiAqCiAqICMjIE90aGVyIHJlc291cmNlcwogKgogKiAqIEh0dHBTZXJ2ZXIgaXMgYSBTdHJlYW0uIFJlZmVyIHRvIHRoZSBbU3RyZWFtXSBjbGFzcyBmb3IgaW5mb3JtYXRpb24KICogYWJvdXQgdGhlIHN0cmVhbWluZyBxdWFsaXRpZXMgb2YgYW4gSHR0cFNlcnZlci4KICogUGF1c2luZyB0aGUgc3Vic2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0sIHBhdXNlcyBhdCB0aGUgT1MgbGV2ZWwuCiAqCiAqICogVGhlIFtzaGVsZl0oaHR0cHM6Ly9wdWIuZGFydGxhbmcub3JnL3BhY2thZ2VzL3NoZWxmKQogKiBwYWNrYWdlIG9uIHB1Yi5kYXJ0bGFuZy5vcmcgY29udGFpbnMgYSBzZXQgb2YgaGlnaC1sZXZlbCBjbGFzc2VzIHRoYXQsCiAqIHRvZ2V0aGVyIHdpdGggdGhpcyBjbGFzcywgbWFrZXMgaXQgZWFzeSB0byBwcm92aWRlIGNvbnRlbnQgdGhyb3VnaCBIVFRQCiAqIHNlcnZlcnMuCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwU2VydmVyIGltcGxlbWVudHMgU3RyZWFtPEh0dHBSZXF1ZXN0PiB7CiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYFNlcnZlcmAgaGVhZGVyIGZvciBhbGwgcmVzcG9uc2VzCiAgICogZ2VuZXJhdGVkIGJ5IHRoaXMgW0h0dHBTZXJ2ZXJdLgogICAqCiAgICogSWYgW3NlcnZlckhlYWRlcl0gaXMgYG51bGxgLCBubyBgU2VydmVyYCBoZWFkZXIgd2lsbCBiZSBhZGRlZCB0byBlYWNoCiAgICogcmVzcG9uc2UuCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgbnVsbGAuCiAgICovCiAgU3RyaW5nIHNlcnZlckhlYWRlcjsKCiAgLyoqCiAgICogRGVmYXVsdCBzZXQgb2YgaGVhZGVycyBhZGRlZCB0byBhbGwgcmVzcG9uc2Ugb2JqZWN0cy4KICAgKgogICAqIEJ5IGRlZmF1bHQgdGhlIGZvbGxvd2luZyBoZWFkZXJzIGFyZSBpbiB0aGlzIHNldDoKICAgKgogICAqICAgICBDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKICAgKiAgICAgWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lOCiAgICogICAgIFgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYKICAgKiAgICAgWC1YU1MtUHJvdGVjdGlvbjogMTsgbW9kZT1ibG9jawogICAqCiAgICogSWYgdGhlIGBTZXJ2ZXJgIGhlYWRlciBpcyBhZGRlZCBoZXJlIGFuZCB0aGUgYHNlcnZlckhlYWRlcmAgaXMgc2V0IGFzCiAgICogd2VsbCB0aGVuIHRoZSB2YWx1ZSBvZiBgc2VydmVySGVhZGVyYCB0YWtlcyBwcmVjZWRlbmNlLgogICAqLwogIEh0dHBIZWFkZXJzIGdldCBkZWZhdWx0UmVzcG9uc2VIZWFkZXJzOwoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBbSHR0cFNlcnZlcl0gc2hvdWxkIGNvbXByZXNzIHRoZSBjb250ZW50LCBpZiBwb3NzaWJsZS4KICAgKgogICAqIFRoZSBjb250ZW50IGNhbiBvbmx5IGJlIGNvbXByZXNzZWQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgdXNpbmcKICAgKiBjaHVua2VkIFRyYW5zZmVyLUVuY29kaW5nIGFuZCB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYXMgYGd6aXBgCiAgICogYXMgYW4gYWNjZXB0ZWQgZW5jb2RpbmcgaW4gdGhlIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIuCiAgICoKICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgIChjb21wcmVzc2lvbiBkaXNhYmxlZCkuCiAgICogVG8gZW5hYmxlLCBzZXQgYGF1dG9Db21wcmVzc2AgdG8gYHRydWVgLgogICAqLwogIGJvb2wgYXV0b0NvbXByZXNzOwoKICAvKioKICAgKiBHZXRzIG9yIHNldHMgdGhlIHRpbWVvdXQgdXNlZCBmb3IgaWRsZSBrZWVwLWFsaXZlIGNvbm5lY3Rpb25zLiBJZiBubwogICAqIGZ1cnRoZXIgcmVxdWVzdCBpcyBzZWVuIHdpdGhpbiBbaWRsZVRpbWVvdXRdIGFmdGVyIHRoZSBwcmV2aW91cyByZXF1ZXN0IHdhcwogICAqIGNvbXBsZXRlZCwgdGhlIGNvbm5lY3Rpb24gaXMgZHJvcHBlZC4KICAgKgogICAqIERlZmF1bHQgaXMgMTIwIHNlY29uZHMuCiAgICoKICAgKiBOb3RlIHRoYXQgaXQgbWF5IHRha2UgdXAgdG8gYDIgKiBpZGxlVGltZW91dGAgYmVmb3JlIGEgaWRsZSBjb25uZWN0aW9uIGlzCiAgICogYWJvcnRlZC4KICAgKgogICAqIFRvIGRpc2FibGUsIHNldCBbaWRsZVRpbWVvdXRdIHRvIGBudWxsYC4KICAgKi8KICBEdXJhdGlvbiBpZGxlVGltZW91dDsKCiAgLyoqCiAgICogU3RhcnRzIGxpc3RlbmluZyBmb3IgSFRUUCByZXF1ZXN0cyBvbiB0aGUgc3BlY2lmaWVkIFthZGRyZXNzXSBhbmQKICAgKiBbcG9ydF0uCiAgICoKICAgKiBUaGUgW2FkZHJlc3NdIGNhbiBlaXRoZXIgYmUgYSBbU3RyaW5nXSBvciBhbgogICAqIFtJbnRlcm5ldEFkZHJlc3NdLiBJZiBbYWRkcmVzc10gaXMgYSBbU3RyaW5nXSwgW2JpbmRdIHdpbGwKICAgKiBwZXJmb3JtIGEgW0ludGVybmV0QWRkcmVzcy5sb29rdXBdIGFuZCB1c2UgdGhlIGZpcnN0IHZhbHVlIGluIHRoZQogICAqIGxpc3QuIFRvIGxpc3RlbiBvbiB0aGUgbG9vcGJhY2sgYWRhcHRlciwgd2hpY2ggd2lsbCBhbGxvdyBvbmx5CiAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgbG9jYWwgaG9zdCwgdXNlIHRoZSB2YWx1ZQogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0XSBvcgogICAqIFtJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY2XS4gVG8gYWxsb3cgZm9yIGluY29taW5nCiAgICogY29ubmVjdGlvbiBmcm9tIHRoZSBuZXR3b3JrIHVzZSBlaXRoZXIgb25lIG9mIHRoZSB2YWx1ZXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmFueUlQdjRdIG9yIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2Nl0gdG8KICAgKiBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzIG9yIHRoZSBJUCBhZGRyZXNzIG9mIGEgc3BlY2lmaWMgaW50ZXJmYWNlLgogICAqCiAgICogSWYgYW4gSVAgdmVyc2lvbiA2IChJUHY2KSBhZGRyZXNzIGlzIHVzZWQsIGJvdGggSVAgdmVyc2lvbiA2CiAgICogKElQdjYpIGFuZCB2ZXJzaW9uIDQgKElQdjQpIGNvbm5lY3Rpb25zIHdpbGwgYmUgYWNjZXB0ZWQuIFRvCiAgICogcmVzdHJpY3QgdGhpcyB0byB2ZXJzaW9uIDYgKElQdjYpIG9ubHksIHVzZSBbdjZPbmx5XSB0byBzZXQKICAgKiB2ZXJzaW9uIDYgb25seS4gSG93ZXZlciwgaWYgdGhlIGFkZHJlc3MgaXMKICAgKiBbSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2Nl0sIG9ubHkgSVAgdmVyc2lvbiA2IChJUHY2KSBjb25uZWN0aW9ucwogICAqIHdpbGwgYmUgYWNjZXB0ZWQuCiAgICoKICAgKiBJZiBbcG9ydF0gaGFzIHRoZSB2YWx1ZSBbOjA6XSBhbiBlcGhlbWVyYWwgcG9ydCB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uIFRoZSBhY3R1YWwgcG9ydCB1c2VkIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlCiAgICogW3BvcnRdIGdldHRlci4KICAgKgogICAqIFRoZSBvcHRpb25hbCBhcmd1bWVudCBbYmFja2xvZ10gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGlzdGVuCiAgICogYmFja2xvZyBmb3IgdGhlIHVuZGVybHlpbmcgT1MgbGlzdGVuIHNldHVwLiBJZiBbYmFja2xvZ10gaGFzIHRoZQogICAqIHZhbHVlIG9mIFs6MDpdICh0aGUgZGVmYXVsdCkgYSByZWFzb25hYmxlIHZhbHVlIHdpbGwgYmUgY2hvc2VuIGJ5CiAgICogdGhlIHN5c3RlbS4KICAgKgogICAqIFRoZSBvcHRpb25hbCBhcmd1bWVudCBbc2hhcmVkXSBzcGVjaWZpZXMgd2hldGhlciBhZGRpdGlvbmFsIEh0dHBTZXJ2ZXIKICAgKiBvYmplY3RzIGNhbiBiaW5kIHRvIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGBhZGRyZXNzYCwgYHBvcnRgIGFuZCBgdjZPbmx5YC4KICAgKiBJZiBgc2hhcmVkYCBpcyBgdHJ1ZWAgYW5kIG1vcmUgYEh0dHBTZXJ2ZXJgcyBmcm9tIHRoaXMgaXNvbGF0ZSBvciBvdGhlcgogICAqIGlzb2xhdGVzIGFyZSBib3VuZCB0byB0aGUgcG9ydCwgdGhlbiB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgd2lsbCBiZQogICAqIGRpc3RyaWJ1dGVkIGFtb25nIGFsbCB0aGUgYm91bmQgYEh0dHBTZXJ2ZXJgcy4gQ29ubmVjdGlvbnMgY2FuIGJlCiAgICogZGlzdHJpYnV0ZWQgb3ZlciBtdWx0aXBsZSBpc29sYXRlcyB0aGlzIHdheS4KICAgKi8KICBzdGF0aWMgRnV0dXJlPEh0dHBTZXJ2ZXI+IGJpbmQoYWRkcmVzcywgaW50IHBvcnQsCiAgICAgICAgICB7aW50IGJhY2tsb2c6IDAsIGJvb2wgdjZPbmx5OiBmYWxzZSwgYm9vbCBzaGFyZWQ6IGZhbHNlfSkgPT4KICAgICAgX0h0dHBTZXJ2ZXIuYmluZChhZGRyZXNzLCBwb3J0LCBiYWNrbG9nLCB2Nk9ubHksIHNoYXJlZCk7CgogIC8qKgogICAqIFRoZSBbYWRkcmVzc10gY2FuIGVpdGhlciBiZSBhIFtTdHJpbmddIG9yIGFuCiAgICogW0ludGVybmV0QWRkcmVzc10uIElmIFthZGRyZXNzXSBpcyBhIFtTdHJpbmddLCBbYmluZF0gd2lsbAogICAqIHBlcmZvcm0gYSBbSW50ZXJuZXRBZGRyZXNzLmxvb2t1cF0gYW5kIHVzZSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlCiAgICogbGlzdC4gVG8gbGlzdGVuIG9uIHRoZSBsb29wYmFjayBhZGFwdGVyLCB3aGljaCB3aWxsIGFsbG93IG9ubHkKICAgKiBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIHRoZSBsb2NhbCBob3N0LCB1c2UgdGhlIHZhbHVlCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjRdIG9yCiAgICogW0ludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjZdLiBUbyBhbGxvdyBmb3IgaW5jb21pbmcKICAgKiBjb25uZWN0aW9uIGZyb20gdGhlIG5ldHdvcmsgdXNlIGVpdGhlciBvbmUgb2YgdGhlIHZhbHVlcwogICAqIFtJbnRlcm5ldEFkZHJlc3MuYW55SVB2NF0gb3IgW0ludGVybmV0QWRkcmVzcy5hbnlJUHY2XSB0bwogICAqIGJpbmQgdG8gYWxsIGludGVyZmFjZXMgb3IgdGhlIElQIGFkZHJlc3Mgb2YgYSBzcGVjaWZpYyBpbnRlcmZhY2UuCiAgICoKICAgKiBJZiBhbiBJUCB2ZXJzaW9uIDYgKElQdjYpIGFkZHJlc3MgaXMgdXNlZCwgYm90aCBJUCB2ZXJzaW9uIDYKICAgKiAoSVB2NikgYW5kIHZlcnNpb24gNCAoSVB2NCkgY29ubmVjdGlvbnMgd2lsbCBiZSBhY2NlcHRlZC4gVG8KICAgKiByZXN0cmljdCB0aGlzIHRvIHZlcnNpb24gNiAoSVB2Nikgb25seSwgdXNlIFt2Nk9ubHldIHRvIHNldAogICAqIHZlcnNpb24gNiBvbmx5LgogICAqCiAgICogSWYgW3BvcnRdIGhhcyB0aGUgdmFsdWUgWzowOl0gYW4gZXBoZW1lcmFsIHBvcnQgd2lsbCBiZSBjaG9zZW4gYnkKICAgKiB0aGUgc3lzdGVtLiBUaGUgYWN0dWFsIHBvcnQgdXNlZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZQogICAqIFtwb3J0XSBnZXR0ZXIuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW2JhY2tsb2ddIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpc3RlbgogICAqIGJhY2tsb2cgZm9yIHRoZSB1bmRlcmx5aW5nIE9TIGxpc3RlbiBzZXR1cC4gSWYgW2JhY2tsb2ddIGhhcyB0aGUKICAgKiB2YWx1ZSBvZiBbOjA6XSAodGhlIGRlZmF1bHQpIGEgcmVhc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNob3NlbiBieQogICAqIHRoZSBzeXN0ZW0uCiAgICoKICAgKiBJZiBbcmVxdWVzdENsaWVudENlcnRpZmljYXRlXSBpcyB0cnVlLCB0aGUgc2VydmVyIHdpbGwKICAgKiByZXF1ZXN0IGNsaWVudHMgdG8gYXV0aGVudGljYXRlIHdpdGggYSBjbGllbnQgY2VydGlmaWNhdGUuCiAgICogVGhlIHNlcnZlciB3aWxsIGFkdmVydGlzZSB0aGUgbmFtZXMgb2YgdHJ1c3RlZCBpc3N1ZXJzIG9mIGNsaWVudAogICAqIGNlcnRpZmljYXRlcywgZ2V0dGluZyB0aGVtIGZyb20gYSBbU2VjdXJpdHlDb250ZXh0XSwgd2hlcmUgdGhleSBoYXZlIGJlZW4KICAgKiBzZXQgdXNpbmcgW1NlY3VyaXR5Q29udGV4dC5zZXRDbGllbnRBdXRob3JpdGllc10uCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgW3NoYXJlZF0gc3BlY2lmaWVzIHdoZXRoZXIgYWRkaXRpb25hbCBIdHRwU2VydmVyCiAgICogb2JqZWN0cyBjYW4gYmluZCB0byB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBgYWRkcmVzc2AsIGBwb3J0YCBhbmQgYHY2T25seWAuCiAgICogSWYgYHNoYXJlZGAgaXMgYHRydWVgIGFuZCBtb3JlIGBIdHRwU2VydmVyYHMgZnJvbSB0aGlzIGlzb2xhdGUgb3Igb3RoZXIKICAgKiBpc29sYXRlcyBhcmUgYm91bmQgdG8gdGhlIHBvcnQsIHRoZW4gdGhlIGluY29taW5nIGNvbm5lY3Rpb25zIHdpbGwgYmUKICAgKiBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhlIGJvdW5kIGBIdHRwU2VydmVyYHMuIENvbm5lY3Rpb25zIGNhbiBiZQogICAqIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgaXNvbGF0ZXMgdGhpcyB3YXkuCiAgICovCgogIHN0YXRpYyBGdXR1cmU8SHR0cFNlcnZlcj4gYmluZFNlY3VyZSgKICAgICAgICAgIGFkZHJlc3MsIGludCBwb3J0LCBTZWN1cml0eUNvbnRleHQgY29udGV4dCwKICAgICAgICAgIHtpbnQgYmFja2xvZzogMCwKICAgICAgICAgIGJvb2wgdjZPbmx5OiBmYWxzZSwKICAgICAgICAgIGJvb2wgcmVxdWVzdENsaWVudENlcnRpZmljYXRlOiBmYWxzZSwKICAgICAgICAgIGJvb2wgc2hhcmVkOiBmYWxzZX0pID0+CiAgICAgIF9IdHRwU2VydmVyLmJpbmRTZWN1cmUoYWRkcmVzcywgcG9ydCwgY29udGV4dCwgYmFja2xvZywgdjZPbmx5LAogICAgICAgICAgcmVxdWVzdENsaWVudENlcnRpZmljYXRlLCBzaGFyZWQpOwoKICAvKioKICAgKiBBdHRhY2hlcyB0aGUgSFRUUCBzZXJ2ZXIgdG8gYW4gZXhpc3RpbmcgW1NlcnZlclNvY2tldF0uIFdoZW4gdGhlCiAgICogW0h0dHBTZXJ2ZXJdIGlzIGNsb3NlZCwgdGhlIFtIdHRwU2VydmVyXSB3aWxsIGp1c3QgZGV0YWNoIGl0c2VsZiwKICAgKiBjbG9zaW5nIGN1cnJlbnQgY29ubmVjdGlvbnMgYnV0IG5vdCBjbG9zaW5nIFtzZXJ2ZXJTb2NrZXRdLgogICAqLwogIGZhY3RvcnkgSHR0cFNlcnZlci5saXN0ZW5PbihTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSA9PgogICAgICBuZXcgX0h0dHBTZXJ2ZXIubGlzdGVuT24oc2VydmVyU29ja2V0KTsKCiAgLyoqCiAgICogUGVybWFuZW50bHkgc3RvcHMgdGhpcyBbSHR0cFNlcnZlcl0gZnJvbSBsaXN0ZW5pbmcgZm9yIG5ldwogICAqIGNvbm5lY3Rpb25zLiAgVGhpcyBjbG9zZXMgdGhlIFtTdHJlYW1dIG9mIFtIdHRwUmVxdWVzdF1zIHdpdGggYQogICAqIGRvbmUgZXZlbnQuIFRoZSByZXR1cm5lZCBmdXR1cmUgY29tcGxldGVzIHdoZW4gdGhlIHNlcnZlciBpcwogICAqIHN0b3BwZWQuIEZvciBhIHNlcnZlciBzdGFydGVkIHVzaW5nIFtiaW5kXSBvciBbYmluZFNlY3VyZV0gdGhpcwogICAqIG1lYW5zIHRoYXQgdGhlIHBvcnQgbGlzdGVuZWQgb24gbm8gbG9uZ2VyIGluIHVzZS4KICAgKgogICAqIElmIFtmb3JjZV0gaXMgYHRydWVgLCBhY3RpdmUgY29ubmVjdGlvbnMgd2lsbCBiZSBjbG9zZWQgaW1tZWRpYXRlbHkuCiAgICovCiAgRnV0dXJlIGNsb3NlKHtib29sIGZvcmNlOiBmYWxzZX0pOwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwb3J0IHRoYXQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24uIFRoaXMgY2FuIGJlCiAgICogdXNlZCB0byBnZXQgdGhlIGFjdHVhbCBwb3J0IHVzZWQgd2hlbiBhIHZhbHVlIG9mIDAgZm9yIFs6cG9ydDpdIGlzCiAgICogc3BlY2lmaWVkIGluIHRoZSBbYmluZF0gb3IgW2JpbmRTZWN1cmVdIGNhbGwuCiAgICovCiAgaW50IGdldCBwb3J0OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24uIFRoaXMgY2FuIGJlCiAgICogdXNlZCB0byBnZXQgdGhlIGFjdHVhbCBhZGRyZXNzIHVzZWQsIHdoZW4gdGhlIGFkZHJlc3MgaXMgZmV0Y2hlZCBieQogICAqIGEgbG9va3VwIGZyb20gYSBob3N0bmFtZS4KICAgKi8KICBJbnRlcm5ldEFkZHJlc3MgZ2V0IGFkZHJlc3M7CgogIC8qKgogICAqIFNldHMgdGhlIHRpbWVvdXQsIGluIHNlY29uZHMsIGZvciBzZXNzaW9ucyBvZiB0aGlzIFtIdHRwU2VydmVyXS4KICAgKiBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIDIwIG1pbnV0ZXMuCiAgICovCiAgc2V0IHNlc3Npb25UaW1lb3V0KGludCB0aW1lb3V0KTsKCiAgLyoqCiAgICogUmV0dXJucyBhbiBbSHR0cENvbm5lY3Rpb25zSW5mb10gb2JqZWN0IHN1bW1hcml6aW5nIHRoZSBudW1iZXIgb2YKICAgKiBjdXJyZW50IGNvbm5lY3Rpb25zIGhhbmRsZWQgYnkgdGhlIHNlcnZlci4KICAgKi8KICBIdHRwQ29ubmVjdGlvbnNJbmZvIGNvbm5lY3Rpb25zSW5mbygpOwp9CgovKioKICogU3VtbWFyeSBzdGF0aXN0aWNzIGFib3V0IGFuIFtIdHRwU2VydmVyXXMgY3VycmVudCBzb2NrZXQgY29ubmVjdGlvbnMuCiAqLwpjbGFzcyBIdHRwQ29ubmVjdGlvbnNJbmZvIHsKICAvKioKICAgKiBUb3RhbCBudW1iZXIgb2Ygc29ja2V0IGNvbm5lY3Rpb25zLgogICAqLwogIGludCB0b3RhbCA9IDA7CgogIC8qKgogICAqIE51bWJlciBvZiBhY3RpdmUgY29ubmVjdGlvbnMgd2hlcmUgYWN0dWFsIHJlcXVlc3QvcmVzcG9uc2UKICAgKiBwcm9jZXNzaW5nIGlzIGFjdGl2ZS4KICAgKi8KICBpbnQgYWN0aXZlID0gMDsKCiAgLyoqCiAgICogTnVtYmVyIG9mIGlkbGUgY29ubmVjdGlvbnMgaGVsZCBieSBjbGllbnRzIGFzIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuCiAgICovCiAgaW50IGlkbGUgPSAwOwoKICAvKioKICAgKiBOdW1iZXIgb2YgY29ubmVjdGlvbnMgd2hpY2ggYXJlIHByZXBhcmluZyB0byBjbG9zZS4gTm90ZTogVGhlc2UKICAgKiBjb25uZWN0aW9ucyBhcmUgYWxzbyBwYXJ0IG9mIHRoZSBbOmFjdGl2ZTpdIGNvdW50IGFzIHRoZXkgbWlnaHQKICAgKiBzdGlsbCBiZSBzZW5kaW5nIGRhdGEgdG8gdGhlIGNsaWVudCBiZWZvcmUgZmluYWxseSBjbG9zaW5nLgogICAqLwogIGludCBjbG9zaW5nID0gMDsKfQoKLyoqCiAqIEhlYWRlcnMgZm9yIEhUVFAgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KICoKICogSW4gc29tZSBzaXR1YXRpb25zLCBoZWFkZXJzIGFyZSBpbW11dGFibGU6CiAqCiAqICogSHR0cFJlcXVlc3QgYW5kIEh0dHBDbGllbnRSZXNwb25zZSBhbHdheXMgaGF2ZSBpbW11dGFibGUgaGVhZGVycy4KICoKICogKiBIdHRwUmVzcG9uc2UgYW5kIEh0dHBDbGllbnRSZXF1ZXN0IGhhdmUgaW1tdXRhYmxlIGhlYWRlcnMKICogICBmcm9tIHRoZSBtb21lbnQgdGhlIGJvZHkgaXMgd3JpdHRlbiB0by4KICoKICogSW4gdGhlc2Ugc2l0dWF0aW9ucywgdGhlIG11dGF0aW5nIG1ldGhvZHMgdGhyb3cgZXhjZXB0aW9ucy4KICoKICogRm9yIGFsbCBvcGVyYXRpb25zIG9uIEhUVFAgaGVhZGVycyB0aGUgaGVhZGVyIG5hbWUgaXMKICogY2FzZS1pbnNlbnNpdGl2ZS4KICoKICogVG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGhlYWRlciB1c2UgdGhlIGBzZXQoKWAgbWV0aG9kOgogKgogKiAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChIdHRwSGVhZGVycy5jYWNoZUNvbnRyb2xIZWFkZXIsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICdtYXgtYWdlPTM2MDAsIG11c3QtcmV2YWxpZGF0ZScpOwogKgogKiBUbyByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBoZWFkZXIgdXNlIHRoZSBgdmFsdWUoKWAgbWV0aG9kOgogKgogKiAgICAgcHJpbnQocmVxdWVzdC5oZWFkZXJzLnZhbHVlKEh0dHBIZWFkZXJzLnVzZXJBZ2VudEhlYWRlcikpOwogKgogKiBBbiBIdHRwSGVhZGVycyBvYmplY3QgaG9sZHMgYSBsaXN0IG9mIHZhbHVlcyBmb3IgZWFjaCBuYW1lCiAqIGFzIHRoZSBzdGFuZGFyZCBhbGxvd3MuIEluIG1vc3QgY2FzZXMgYSBuYW1lIGhvbGRzIG9ubHkgYSBzaW5nbGUgdmFsdWUsCiAqIFRoZSBtb3N0IGNvbW1vbiBtb2RlIG9mIG9wZXJhdGlvbiBpcyB0byB1c2UgYHNldCgpYCBmb3Igc2V0dGluZyBhIHZhbHVlLAogKiBhbmQgYHZhbHVlKClgIGZvciByZXRyaWV2aW5nIGEgdmFsdWUuCiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwSGVhZGVycyB7CiAgc3RhdGljIGNvbnN0IGFjY2VwdEhlYWRlciA9ICJhY2NlcHQiOwogIHN0YXRpYyBjb25zdCBhY2NlcHRDaGFyc2V0SGVhZGVyID0gImFjY2VwdC1jaGFyc2V0IjsKICBzdGF0aWMgY29uc3QgYWNjZXB0RW5jb2RpbmdIZWFkZXIgPSAiYWNjZXB0LWVuY29kaW5nIjsKICBzdGF0aWMgY29uc3QgYWNjZXB0TGFuZ3VhZ2VIZWFkZXIgPSAiYWNjZXB0LWxhbmd1YWdlIjsKICBzdGF0aWMgY29uc3QgYWNjZXB0UmFuZ2VzSGVhZGVyID0gImFjY2VwdC1yYW5nZXMiOwogIHN0YXRpYyBjb25zdCBhZ2VIZWFkZXIgPSAiYWdlIjsKICBzdGF0aWMgY29uc3QgYWxsb3dIZWFkZXIgPSAiYWxsb3ciOwogIHN0YXRpYyBjb25zdCBhdXRob3JpemF0aW9uSGVhZGVyID0gImF1dGhvcml6YXRpb24iOwogIHN0YXRpYyBjb25zdCBjYWNoZUNvbnRyb2xIZWFkZXIgPSAiY2FjaGUtY29udHJvbCI7CiAgc3RhdGljIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSAiY29ubmVjdGlvbiI7CiAgc3RhdGljIGNvbnN0IGNvbnRlbnRFbmNvZGluZ0hlYWRlciA9ICJjb250ZW50LWVuY29kaW5nIjsKICBzdGF0aWMgY29uc3QgY29udGVudExhbmd1YWdlSGVhZGVyID0gImNvbnRlbnQtbGFuZ3VhZ2UiOwogIHN0YXRpYyBjb25zdCBjb250ZW50TGVuZ3RoSGVhZGVyID0gImNvbnRlbnQtbGVuZ3RoIjsKICBzdGF0aWMgY29uc3QgY29udGVudExvY2F0aW9uSGVhZGVyID0gImNvbnRlbnQtbG9jYXRpb24iOwogIHN0YXRpYyBjb25zdCBjb250ZW50TUQ1SGVhZGVyID0gImNvbnRlbnQtbWQ1IjsKICBzdGF0aWMgY29uc3QgY29udGVudFJhbmdlSGVhZGVyID0gImNvbnRlbnQtcmFuZ2UiOwogIHN0YXRpYyBjb25zdCBjb250ZW50VHlwZUhlYWRlciA9ICJjb250ZW50LXR5cGUiOwogIHN0YXRpYyBjb25zdCBkYXRlSGVhZGVyID0gImRhdGUiOwogIHN0YXRpYyBjb25zdCBldGFnSGVhZGVyID0gImV0YWciOwogIHN0YXRpYyBjb25zdCBleHBlY3RIZWFkZXIgPSAiZXhwZWN0IjsKICBzdGF0aWMgY29uc3QgZXhwaXJlc0hlYWRlciA9ICJleHBpcmVzIjsKICBzdGF0aWMgY29uc3QgZnJvbUhlYWRlciA9ICJmcm9tIjsKICBzdGF0aWMgY29uc3QgaG9zdEhlYWRlciA9ICJob3N0IjsKICBzdGF0aWMgY29uc3QgaWZNYXRjaEhlYWRlciA9ICJpZi1tYXRjaCI7CiAgc3RhdGljIGNvbnN0IGlmTW9kaWZpZWRTaW5jZUhlYWRlciA9ICJpZi1tb2RpZmllZC1zaW5jZSI7CiAgc3RhdGljIGNvbnN0IGlmTm9uZU1hdGNoSGVhZGVyID0gImlmLW5vbmUtbWF0Y2giOwogIHN0YXRpYyBjb25zdCBpZlJhbmdlSGVhZGVyID0gImlmLXJhbmdlIjsKICBzdGF0aWMgY29uc3QgaWZVbm1vZGlmaWVkU2luY2VIZWFkZXIgPSAiaWYtdW5tb2RpZmllZC1zaW5jZSI7CiAgc3RhdGljIGNvbnN0IGxhc3RNb2RpZmllZEhlYWRlciA9ICJsYXN0LW1vZGlmaWVkIjsKICBzdGF0aWMgY29uc3QgbG9jYXRpb25IZWFkZXIgPSAibG9jYXRpb24iOwogIHN0YXRpYyBjb25zdCBtYXhGb3J3YXJkc0hlYWRlciA9ICJtYXgtZm9yd2FyZHMiOwogIHN0YXRpYyBjb25zdCBwcmFnbWFIZWFkZXIgPSAicHJhZ21hIjsKICBzdGF0aWMgY29uc3QgcHJveHlBdXRoZW50aWNhdGVIZWFkZXIgPSAicHJveHktYXV0aGVudGljYXRlIjsKICBzdGF0aWMgY29uc3QgcHJveHlBdXRob3JpemF0aW9uSGVhZGVyID0gInByb3h5LWF1dGhvcml6YXRpb24iOwogIHN0YXRpYyBjb25zdCByYW5nZUhlYWRlciA9ICJyYW5nZSI7CiAgc3RhdGljIGNvbnN0IHJlZmVyZXJIZWFkZXIgPSAicmVmZXJlciI7CiAgc3RhdGljIGNvbnN0IHJldHJ5QWZ0ZXJIZWFkZXIgPSAicmV0cnktYWZ0ZXIiOwogIHN0YXRpYyBjb25zdCBzZXJ2ZXJIZWFkZXIgPSAic2VydmVyIjsKICBzdGF0aWMgY29uc3QgdGVIZWFkZXIgPSAidGUiOwogIHN0YXRpYyBjb25zdCB0cmFpbGVySGVhZGVyID0gInRyYWlsZXIiOwogIHN0YXRpYyBjb25zdCB0cmFuc2ZlckVuY29kaW5nSGVhZGVyID0gInRyYW5zZmVyLWVuY29kaW5nIjsKICBzdGF0aWMgY29uc3QgdXBncmFkZUhlYWRlciA9ICJ1cGdyYWRlIjsKICBzdGF0aWMgY29uc3QgdXNlckFnZW50SGVhZGVyID0gInVzZXItYWdlbnQiOwogIHN0YXRpYyBjb25zdCB2YXJ5SGVhZGVyID0gInZhcnkiOwogIHN0YXRpYyBjb25zdCB2aWFIZWFkZXIgPSAidmlhIjsKICBzdGF0aWMgY29uc3Qgd2FybmluZ0hlYWRlciA9ICJ3YXJuaW5nIjsKICBzdGF0aWMgY29uc3Qgd3d3QXV0aGVudGljYXRlSGVhZGVyID0gInd3dy1hdXRoZW50aWNhdGUiOwoKICBARGVwcmVjYXRlZCgiVXNlIGFjY2VwdEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQUNDRVBUID0gYWNjZXB0SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgYWNjZXB0Q2hhcnNldEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQUNDRVBUX0NIQVJTRVQgPSBhY2NlcHRDaGFyc2V0SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgYWNjZXB0RW5jb2RpbmdIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFDQ0VQVF9FTkNPRElORyA9IGFjY2VwdEVuY29kaW5nSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgYWNjZXB0TGFuZ3VhZ2VIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFDQ0VQVF9MQU5HVUFHRSA9IGFjY2VwdExhbmd1YWdlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgYWNjZXB0UmFuZ2VzSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBQ0NFUFRfUkFOR0VTID0gYWNjZXB0UmFuZ2VzSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgYWdlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBBR0UgPSBhZ2VIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBhbGxvd0hlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQUxMT1cgPSBhbGxvd0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGF1dGhvcml6YXRpb25IZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEFVVEhPUklaQVRJT04gPSBhdXRob3JpemF0aW9uSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY2FjaGVDb250cm9sSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDQUNIRV9DT05UUk9MID0gY2FjaGVDb250cm9sSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgY29ubmVjdGlvbkhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ09OTkVDVElPTiA9IGNvbm5lY3Rpb25IZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb250ZW50RW5jb2RpbmdIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTlRFTlRfRU5DT0RJTkcgPSBjb250ZW50RW5jb2RpbmdIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb250ZW50TGFuZ3VhZ2VIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTlRFTlRfTEFOR1VBR0UgPSBjb250ZW50TGFuZ3VhZ2VIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb250ZW50TGVuZ3RoSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX0xFTkdUSCA9IGNvbnRlbnRMZW5ndGhIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb250ZW50TG9jYXRpb25IZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTlRFTlRfTE9DQVRJT04gPSBjb250ZW50TG9jYXRpb25IZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb250ZW50TUQ1SGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBDT05URU5UX01ENSA9IGNvbnRlbnRNRDVIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb250ZW50UmFuZ2VIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IENPTlRFTlRfUkFOR0UgPSBjb250ZW50UmFuZ2VIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBjb250ZW50VHlwZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ09OVEVOVF9UWVBFID0gY29udGVudFR5cGVIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBkYXRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBEQVRFID0gZGF0ZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGV0YWdIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEVUQUcgPSBldGFnSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgZXhwZWN0SGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBFWFBFQ1QgPSBleHBlY3RIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBleHBpcmVzSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBFWFBJUkVTID0gZXhwaXJlc0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGZyb21IZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IEZST00gPSBmcm9tSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgaG9zdEhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgSE9TVCA9IGhvc3RIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBpZk1hdGNoSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9NQVRDSCA9IGlmTWF0Y2hIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBpZk1vZGlmaWVkU2luY2VIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IElGX01PRElGSUVEX1NJTkNFID0gaWZNb2RpZmllZFNpbmNlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgaWZOb25lTWF0Y2hIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IElGX05PTkVfTUFUQ0ggPSBpZk5vbmVNYXRjaEhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGlmUmFuZ2VIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IElGX1JBTkdFID0gaWZSYW5nZUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBJRl9VTk1PRElGSUVEX1NJTkNFID0gaWZVbm1vZGlmaWVkU2luY2VIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBsYXN0TW9kaWZpZWRIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IExBU1RfTU9ESUZJRUQgPSBsYXN0TW9kaWZpZWRIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSBsb2NhdGlvbkhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgTE9DQVRJT04gPSBsb2NhdGlvbkhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIG1heEZvcndhcmRzSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBNQVhfRk9SV0FSRFMgPSBtYXhGb3J3YXJkc0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHByYWdtYUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgUFJBR01BID0gcHJhZ21hSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgcHJveHlBdXRoZW50aWNhdGVIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFBST1hZX0FVVEhFTlRJQ0FURSA9IHByb3h5QXV0aGVudGljYXRlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgcHJveHlBdXRob3JpemF0aW9uSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBQUk9YWV9BVVRIT1JJWkFUSU9OID0gcHJveHlBdXRob3JpemF0aW9uSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgcmFuZ2VIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJBTkdFID0gcmFuZ2VIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSByZWZlcmVySGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBSRUZFUkVSID0gcmVmZXJlckhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHJldHJ5QWZ0ZXJIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJFVFJZX0FGVEVSID0gcmV0cnlBZnRlckhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHNlcnZlckhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgU0VSVkVSID0gc2VydmVySGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgdGVIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFRFID0gdGVIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB0cmFpbGVySGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBUUkFJTEVSID0gdHJhaWxlckhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHRyYW5zZmVyRW5jb2RpbmdIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFRSQU5TRkVSX0VOQ09ESU5HID0gdHJhbnNmZXJFbmNvZGluZ0hlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHVwZ3JhZGVIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFVQR1JBREUgPSB1cGdyYWRlSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgdXNlckFnZW50SGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBVU0VSX0FHRU5UID0gdXNlckFnZW50SGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2UgdmFyeUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgVkFSWSA9IHZhcnlIZWFkZXI7CiAgQERlcHJlY2F0ZWQoIlVzZSB2aWFIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFZJQSA9IHZpYUhlYWRlcjsKICBARGVwcmVjYXRlZCgiVXNlIHdhcm5pbmdIZWFkZXIgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFdBUk5JTkcgPSB3YXJuaW5nSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2Ugd3d3QXV0aGVudGljYXRlSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBXV1dfQVVUSEVOVElDQVRFID0gd3d3QXV0aGVudGljYXRlSGVhZGVyOwoKICAvLyBDb29raWUgaGVhZGVycyBmcm9tIFJGQyA2MjY1LgogIHN0YXRpYyBjb25zdCBjb29raWVIZWFkZXIgPSAiY29va2llIjsKICBzdGF0aWMgY29uc3Qgc2V0Q29va2llSGVhZGVyID0gInNldC1jb29raWUiOwoKICBARGVwcmVjYXRlZCgiVXNlIGNvb2tpZUhlYWRlciBpbnN0ZWFkIikKICBzdGF0aWMgY29uc3QgQ09PS0lFID0gY29va2llSGVhZGVyOwogIEBEZXByZWNhdGVkKCJVc2Ugc2V0Q29va2llSGVhZGVyIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBTRVRfQ09PS0lFID0gc2V0Q29va2llSGVhZGVyOwoKICBzdGF0aWMgY29uc3QgZ2VuZXJhbEhlYWRlcnMgPSBjb25zdCBbCiAgICBjYWNoZUNvbnRyb2xIZWFkZXIsCiAgICBjb25uZWN0aW9uSGVhZGVyLAogICAgZGF0ZUhlYWRlciwKICAgIHByYWdtYUhlYWRlciwKICAgIHRyYWlsZXJIZWFkZXIsCiAgICB0cmFuc2ZlckVuY29kaW5nSGVhZGVyLAogICAgdXBncmFkZUhlYWRlciwKICAgIHZpYUhlYWRlciwKICAgIHdhcm5pbmdIZWFkZXIKICBdOwoKICBARGVwcmVjYXRlZCgiVXNlIGdlbmVyYWxIZWFkZXJzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBHRU5FUkFMX0hFQURFUlMgPSBnZW5lcmFsSGVhZGVyczsKCiAgc3RhdGljIGNvbnN0IGVudGl0eUhlYWRlcnMgPSBjb25zdCBbCiAgICBhbGxvd0hlYWRlciwKICAgIGNvbnRlbnRFbmNvZGluZ0hlYWRlciwKICAgIGNvbnRlbnRMYW5ndWFnZUhlYWRlciwKICAgIGNvbnRlbnRMZW5ndGhIZWFkZXIsCiAgICBjb250ZW50TG9jYXRpb25IZWFkZXIsCiAgICBjb250ZW50TUQ1SGVhZGVyLAogICAgY29udGVudFJhbmdlSGVhZGVyLAogICAgY29udGVudFR5cGVIZWFkZXIsCiAgICBleHBpcmVzSGVhZGVyLAogICAgbGFzdE1vZGlmaWVkSGVhZGVyCiAgXTsKCiAgQERlcHJlY2F0ZWQoIlVzZSBlbnRpdHlIZWFkZXJzIGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBFTlRJVFlfSEVBREVSUyA9IGVudGl0eUhlYWRlcnM7CgogIHN0YXRpYyBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBjb25zdCBbCiAgICBhY2NlcHRSYW5nZXNIZWFkZXIsCiAgICBhZ2VIZWFkZXIsCiAgICBldGFnSGVhZGVyLAogICAgbG9jYXRpb25IZWFkZXIsCiAgICBwcm94eUF1dGhlbnRpY2F0ZUhlYWRlciwKICAgIHJldHJ5QWZ0ZXJIZWFkZXIsCiAgICBzZXJ2ZXJIZWFkZXIsCiAgICB2YXJ5SGVhZGVyLAogICAgd3d3QXV0aGVudGljYXRlSGVhZGVyCiAgXTsKCiAgQERlcHJlY2F0ZWQoIlVzZSByZXNwb25zZUhlYWRlcnMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJFU1BPTlNFX0hFQURFUlMgPSByZXNwb25zZUhlYWRlcnM7CgogIHN0YXRpYyBjb25zdCByZXF1ZXN0SGVhZGVycyA9IGNvbnN0IFsKICAgIGFjY2VwdEhlYWRlciwKICAgIGFjY2VwdENoYXJzZXRIZWFkZXIsCiAgICBhY2NlcHRFbmNvZGluZ0hlYWRlciwKICAgIGFjY2VwdExhbmd1YWdlSGVhZGVyLAogICAgYXV0aG9yaXphdGlvbkhlYWRlciwKICAgIGV4cGVjdEhlYWRlciwKICAgIGZyb21IZWFkZXIsCiAgICBob3N0SGVhZGVyLAogICAgaWZNYXRjaEhlYWRlciwKICAgIGlmTW9kaWZpZWRTaW5jZUhlYWRlciwKICAgIGlmTm9uZU1hdGNoSGVhZGVyLAogICAgaWZSYW5nZUhlYWRlciwKICAgIGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyLAogICAgbWF4Rm9yd2FyZHNIZWFkZXIsCiAgICBwcm94eUF1dGhvcml6YXRpb25IZWFkZXIsCiAgICByYW5nZUhlYWRlciwKICAgIHJlZmVyZXJIZWFkZXIsCiAgICB0ZUhlYWRlciwKICAgIHVzZXJBZ2VudEhlYWRlcgogIF07CgogIEBEZXByZWNhdGVkKCJVc2UgcmVxdWVzdEhlYWRlcnMgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IFJFUVVFU1RfSEVBREVSUyA9IHJlcXVlc3RIZWFkZXJzOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBkYXRlLiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSB3aWxsCiAgICogcmVmbGVjdCB0aGUgJ2RhdGUnIGhlYWRlci4KICAgKi8KICBEYXRlVGltZSBkYXRlOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBleHBpcnkgZGF0ZS4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2lsbAogICAqIHJlZmxlY3QgdGhlICdleHBpcmVzJyBoZWFkZXIuCiAgICovCiAgRGF0ZVRpbWUgZXhwaXJlczsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgImlmLW1vZGlmaWVkLXNpbmNlIiBkYXRlLiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSB3aWxsCiAgICogcmVmbGVjdCB0aGUgImlmLW1vZGlmaWVkLXNpbmNlIiBoZWFkZXIuCiAgICovCiAgRGF0ZVRpbWUgaWZNb2RpZmllZFNpbmNlOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBob3N0IHBhcnQgb2YgdGhlICdob3N0JyBoZWFkZXIgZm9yIHRoZQogICAqIGNvbm5lY3Rpb24uCiAgICovCiAgU3RyaW5nIGhvc3Q7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHBvcnQgcGFydCBvZiB0aGUgJ2hvc3QnIGhlYWRlciBmb3IgdGhlCiAgICogY29ubmVjdGlvbi4KICAgKi8KICBpbnQgcG9ydDsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgY29udGVudCB0eXBlLiBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgdHlwZSBpbiB0aGUKICAgKiBoZWFkZXIgd2lsbCBvbmx5IGJlIHVwZGF0ZWQgaWYgdGhpcyBmaWVsZCBpcyBzZXQKICAgKiBkaXJlY3RseS4gTXV0YXRpbmcgdGhlIHJldHVybmVkIGN1cnJlbnQgdmFsdWUgd2lsbCBoYXZlIG5vCiAgICogZWZmZWN0LgogICAqLwogIENvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBjb250ZW50IGxlbmd0aCBoZWFkZXIgdmFsdWUuCiAgICovCiAgaW50IGNvbnRlbnRMZW5ndGg7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBoZWFkZXIgdmFsdWUuCiAgICovCiAgYm9vbCBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBoZWFkZXIgdmFsdWUuCiAgICovCiAgYm9vbCBjaHVua2VkVHJhbnNmZXJFbmNvZGluZzsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoZSBoZWFkZXIgbmFtZWQgW25hbWVdLiBJZiB0aGVyZQogICAqIGlzIG5vIGhlYWRlciB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBbOm51bGw6XSB3aWxsIGJlIHJldHVybmVkLgogICAqLwogIExpc3Q8U3RyaW5nPiBvcGVyYXRvciBbXShTdHJpbmcgbmFtZSk7CgogIC8qKgogICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdGhlIHZhbHVlIGZvciBhIHNpbmdsZSB2YWx1ZWQgaGVhZGVyLiBJZgogICAqIHRoZXJlIGlzIG5vIGhlYWRlciB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBbOm51bGw6XSB3aWxsIGJlCiAgICogcmV0dXJuZWQuIElmIHRoZSBoZWFkZXIgaGFzIG1vcmUgdGhhbiBvbmUgdmFsdWUgYW4gZXhjZXB0aW9uIGlzCiAgICogdGhyb3duLgogICAqLwogIFN0cmluZyB2YWx1ZShTdHJpbmcgbmFtZSk7CgogIC8qKgogICAqIEFkZHMgYSBoZWFkZXIgdmFsdWUuIFRoZSBoZWFkZXIgbmFtZWQgW25hbWVdIHdpbGwgaGF2ZSB0aGUgdmFsdWUKICAgKiBbdmFsdWVdIGFkZGVkIHRvIGl0cyBsaXN0IG9mIHZhbHVlcy4gU29tZSBoZWFkZXJzIGFyZSBzaW5nbGUKICAgKiB2YWx1ZWQsIGFuZCBmb3IgdGhlc2UgYWRkaW5nIGEgdmFsdWUgd2lsbCByZXBsYWNlIHRoZSBwcmV2aW91cwogICAqIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgb2YgdHlwZSBEYXRlVGltZSBhIEhUVFAgZGF0ZSBmb3JtYXQgd2lsbCBiZQogICAqIGFwcGxpZWQuIElmIHRoZSB2YWx1ZSBpcyBhIFs6TGlzdDpdIGVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdCB3aWxsCiAgICogYmUgYWRkZWQgc2VwYXJhdGVseS4gRm9yIGFsbCBvdGhlciB0eXBlcyB0aGUgZGVmYXVsdCBbOnRvU3RyaW5nOl0KICAgKiBtZXRob2Qgd2lsbCBiZSB1c2VkLgogICAqLwogIHZvaWQgYWRkKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOwoKICAvKioKICAgKiBTZXRzIGEgaGVhZGVyLiBUaGUgaGVhZGVyIG5hbWVkIFtuYW1lXSB3aWxsIGhhdmUgYWxsIGl0cyB2YWx1ZXMKICAgKiBjbGVhcmVkIGJlZm9yZSB0aGUgdmFsdWUgW3ZhbHVlXSBpcyBhZGRlZCBhcyBpdHMgdmFsdWUuCiAgICovCiAgdm9pZCBzZXQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSk7CgogIC8qKgogICAqIFJlbW92ZXMgYSBzcGVjaWZpYyB2YWx1ZSBmb3IgYSBoZWFkZXIgbmFtZS4gU29tZSBoZWFkZXJzIGhhdmUKICAgKiBzeXN0ZW0gc3VwcGxpZWQgdmFsdWVzIGFuZCBmb3IgdGhlc2UgdGhlIHN5c3RlbSBzdXBwbGllZCB2YWx1ZXMKICAgKiB3aWxsIHN0aWxsIGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3IgdGhlIGhlYWRlci4KICAgKi8KICB2b2lkIHJlbW92ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKCiAgLyoqCiAgICogUmVtb3ZlcyBhbGwgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGhlYWRlciBuYW1lLiBTb21lIGhlYWRlcnMKICAgKiBoYXZlIHN5c3RlbSBzdXBwbGllZCB2YWx1ZXMgYW5kIGZvciB0aGVzZSB0aGUgc3lzdGVtIHN1cHBsaWVkCiAgICogdmFsdWVzIHdpbGwgc3RpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGZvciB0aGUKICAgKiBoZWFkZXIuCiAgICovCiAgdm9pZCByZW1vdmVBbGwoU3RyaW5nIG5hbWUpOwoKICAvKioKICAgKiBFbnVtZXJhdGVzIHRoZSBoZWFkZXJzLCBhcHBseWluZyB0aGUgZnVuY3Rpb24gW2ZdIHRvIGVhY2gKICAgKiBoZWFkZXIuIFRoZSBoZWFkZXIgbmFtZSBwYXNzZWQgaW4gWzpuYW1lOl0gd2lsbCBiZSBhbGwgbG93ZXIKICAgKiBjYXNlLgogICAqLwogIHZvaWQgZm9yRWFjaCh2b2lkIGYoU3RyaW5nIG5hbWUsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpKTsKCiAgLyoqCiAgICogRGlzYWJsZXMgZm9sZGluZyBmb3IgdGhlIGhlYWRlciBuYW1lZCBbbmFtZV0gd2hlbiBzZW5kaW5nIHRoZSBIVFRQCiAgICogaGVhZGVyLiBCeSBkZWZhdWx0LCBtdWx0aXBsZSBoZWFkZXIgdmFsdWVzIGFyZSBmb2xkZWQgaW50byBhCiAgICogc2luZ2xlIGhlYWRlciBsaW5lIGJ5IHNlcGFyYXRpbmcgdGhlIHZhbHVlcyB3aXRoIGNvbW1hcy4gVGhlCiAgICogJ3NldC1jb29raWUnIGhlYWRlciBoYXMgZm9sZGluZyBkaXNhYmxlZCBieSBkZWZhdWx0LgogICAqLwogIHZvaWQgbm9Gb2xkaW5nKFN0cmluZyBuYW1lKTsKCiAgLyoqCiAgICogUmVtb3ZlIGFsbCBoZWFkZXJzLiBTb21lIGhlYWRlcnMgaGF2ZSBzeXN0ZW0gc3VwcGxpZWQgdmFsdWVzIGFuZAogICAqIGZvciB0aGVzZSB0aGUgc3lzdGVtIHN1cHBsaWVkIHZhbHVlcyB3aWxsIHN0aWxsIGJlIGFkZGVkIHRvIHRoZQogICAqIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGZvciB0aGUgaGVhZGVyLgogICAqLwogIHZvaWQgY2xlYXIoKTsKfQoKLyoqCiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgaGVhZGVyIHZhbHVlIGluIHRoZSBmb3JtOgogKgogKiAgIFs6dmFsdWU7IHBhcmFtZXRlcjE9dmFsdWUxOyBwYXJhbWV0ZXIyPXZhbHVlMjpdCiAqCiAqIFtIZWFkZXJWYWx1ZV0gY2FuIGJlIHVzZWQgdG8gY29udmVuaWVudGx5IGJ1aWxkIGFuZCBwYXJzZSBoZWFkZXIKICogdmFsdWVzIG9uIHRoaXMgZm9ybS4KICoKICogVG8gYnVpbGQgYW4gWzphY2NlcHRzOl0gaGVhZGVyIHdpdGggdGhlIHZhbHVlCiAqCiAqICAgICB0ZXh0L3BsYWluOyBxPTAuMywgdGV4dC9odG1sCiAqCiAqIHVzZSBjb2RlIGxpa2UgdGhpczoKICoKICogICAgIEh0dHBDbGllbnRSZXF1ZXN0IHJlcXVlc3QgPSAuLi47CiAqICAgICB2YXIgdiA9IG5ldyBIZWFkZXJWYWx1ZSgidGV4dC9wbGFpbiIsIHsicSI6ICIwLjMifSk7CiAqICAgICByZXF1ZXN0LmhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLmFjY2VwdEhlYWRlciwgdik7CiAqICAgICByZXF1ZXN0LmhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLmFjY2VwdEhlYWRlciwgInRleHQvaHRtbCIpOwogKgogKiBUbyBwYXJzZSB0aGUgaGVhZGVyIHZhbHVlcyB1c2UgdGhlIFs6cGFyc2U6XSBzdGF0aWMgbWV0aG9kLgogKgogKiAgICAgSHR0cFJlcXVlc3QgcmVxdWVzdCA9IC4uLjsKICogICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSByZXF1ZXN0LmhlYWRlcnNbSHR0cEhlYWRlcnMuYWNjZXB0SGVhZGVyXTsKICogICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgewogKiAgICAgICBIZWFkZXJWYWx1ZSB2ID0gSGVhZGVyVmFsdWUucGFyc2UodmFsdWUpOwogKiAgICAgICAvLyBVc2Ugdi52YWx1ZSBhbmQgdi5wYXJhbWV0ZXJzCiAqICAgICB9KTsKICoKICogQW4gaW5zdGFuY2Ugb2YgW0hlYWRlclZhbHVlXSBpcyBpbW11dGFibGUuCiAqLwphYnN0cmFjdCBjbGFzcyBIZWFkZXJWYWx1ZSB7CiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBoZWFkZXIgdmFsdWUgb2JqZWN0IHNldHRpbmcgdGhlIHZhbHVlIGFuZCBwYXJhbWV0ZXJzLgogICAqLwogIGZhY3RvcnkgSGVhZGVyVmFsdWUoW1N0cmluZyB2YWx1ZSA9ICIiLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnNdKSB7CiAgICByZXR1cm4gbmV3IF9IZWFkZXJWYWx1ZSh2YWx1ZSwgcGFyYW1ldGVycyk7CiAgfQoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IGhlYWRlciB2YWx1ZSBvYmplY3QgZnJvbSBwYXJzaW5nIGEgaGVhZGVyIHZhbHVlCiAgICogc3RyaW5nIHdpdGggYm90aCB2YWx1ZSBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycy4KICAgKi8KICBzdGF0aWMgSGVhZGVyVmFsdWUgcGFyc2UoU3RyaW5nIHZhbHVlLAogICAgICB7U3RyaW5nIHBhcmFtZXRlclNlcGFyYXRvcjogIjsiLAogICAgICBTdHJpbmcgdmFsdWVTZXBhcmF0b3I6IG51bGwsCiAgICAgIGJvb2wgcHJlc2VydmVCYWNrc2xhc2g6IGZhbHNlfSkgewogICAgcmV0dXJuIF9IZWFkZXJWYWx1ZS5wYXJzZSh2YWx1ZSwKICAgICAgICBwYXJhbWV0ZXJTZXBhcmF0b3I6IHBhcmFtZXRlclNlcGFyYXRvciwKICAgICAgICB2YWx1ZVNlcGFyYXRvcjogdmFsdWVTZXBhcmF0b3IsCiAgICAgICAgcHJlc2VydmVCYWNrc2xhc2g6IHByZXNlcnZlQmFja3NsYXNoKTsKICB9CgogIC8qKgogICAqIEdldHMgdGhlIGhlYWRlciB2YWx1ZS4KICAgKi8KICBTdHJpbmcgZ2V0IHZhbHVlOwoKICAvKioKICAgKiBHZXRzIHRoZSBtYXAgb2YgcGFyYW1ldGVycy4KICAgKgogICAqIFRoaXMgbWFwIGNhbm5vdCBiZSBtb2RpZmllZC4gSW52b2tpbmcgYW55IG9wZXJhdGlvbiB3aGljaCB3b3VsZAogICAqIG1vZGlmeSB0aGUgbWFwIHdpbGwgdGhyb3cgW1Vuc3VwcG9ydGVkRXJyb3JdLgogICAqLwogIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IHBhcmFtZXRlcnM7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gdGhlIGZvcm06CiAgICoKICAgKiAgICAgdmFsdWU7IHBhcmFtZXRlcjE9dmFsdWUxOyBwYXJhbWV0ZXIyPXZhbHVlMgogICAqLwogIFN0cmluZyB0b1N0cmluZygpOwp9CgphYnN0cmFjdCBjbGFzcyBIdHRwU2Vzc2lvbiBpbXBsZW1lbnRzIE1hcCB7CiAgLyoqCiAgICogR2V0cyB0aGUgaWQgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uCiAgICovCiAgU3RyaW5nIGdldCBpZDsKCiAgLyoqCiAgICogRGVzdHJveXMgdGhlIHNlc3Npb24uIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIHNlc3Npb24gYW5kIGFueSBmdXJ0aGVyCiAgICogY29ubmVjdGlvbnMgd2l0aCB0aGlzIGlkIHdpbGwgYmUgZ2l2ZW4gYSBuZXcgaWQgYW5kIHNlc3Npb24uCiAgICovCiAgdm9pZCBkZXN0cm95KCk7CgogIC8qKgogICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgdGltZWQgb3V0LgogICAqLwogIHZvaWQgc2V0IG9uVGltZW91dCh2b2lkIGNhbGxiYWNrKCkpOwoKICAvKioKICAgKiBJcyB0cnVlIGlmIHRoZSBzZXNzaW9uIGhhcyBub3QgYmVlbiBzZW50IHRvIHRoZSBjbGllbnQgeWV0LgogICAqLwogIGJvb2wgZ2V0IGlzTmV3Owp9CgovKioKICogUmVwcmVzZW50YXRpb24gb2YgYSBjb250ZW50IHR5cGUuIEFuIGluc3RhbmNlIG9mIFtDb250ZW50VHlwZV0gaXMKICogaW1tdXRhYmxlLgogKi8KYWJzdHJhY3QgY2xhc3MgQ29udGVudFR5cGUgaW1wbGVtZW50cyBIZWFkZXJWYWx1ZSB7CiAgLyoqCiAgICogQ29udGVudCB0eXBlIGZvciBwbGFpbiB0ZXh0IHVzaW5nIFVURi04IGVuY29kaW5nLgogICAqCiAgICogICAgIHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKICAgKi8KICBzdGF0aWMgZmluYWwgdGV4dCA9IG5ldyBDb250ZW50VHlwZSgidGV4dCIsICJwbGFpbiIsIGNoYXJzZXQ6ICJ1dGYtOCIpOwogIEBEZXByZWNhdGVkKCJVc2UgdGV4dCBpbnN0ZWFkIikKICBzdGF0aWMgZmluYWwgVEVYVCA9IHRleHQ7CgogIC8qKgogICAqICBDb250ZW50IHR5cGUgZm9yIEhUTUwgdXNpbmcgVVRGLTggZW5jb2RpbmcuCiAgICoKICAgKiAgICAgdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04CiAgICovCiAgc3RhdGljIGZpbmFsIGh0bWwgPSBuZXcgQ29udGVudFR5cGUoInRleHQiLCAiaHRtbCIsIGNoYXJzZXQ6ICJ1dGYtOCIpOwogIEBEZXByZWNhdGVkKCJVc2UgaHRtbCBpbnN0ZWFkIikKICBzdGF0aWMgZmluYWwgSFRNTCA9IGh0bWw7CgogIC8qKgogICAqICBDb250ZW50IHR5cGUgZm9yIEpTT04gdXNpbmcgVVRGLTggZW5jb2RpbmcuCiAgICoKICAgKiAgICAgYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOAogICAqLwogIHN0YXRpYyBmaW5hbCBqc29uID0gbmV3IENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgY2hhcnNldDogInV0Zi04Iik7CiAgQERlcHJlY2F0ZWQoIlVzZSBqc29uIGluc3RlYWQiKQogIHN0YXRpYyBmaW5hbCBKU09OID0ganNvbjsKCiAgLyoqCiAgICogIENvbnRlbnQgdHlwZSBmb3IgYmluYXJ5IGRhdGEuCiAgICoKICAgKiAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCiAgICovCiAgc3RhdGljIGZpbmFsIGJpbmFyeSA9IG5ldyBDb250ZW50VHlwZSgiYXBwbGljYXRpb24iLCAib2N0ZXQtc3RyZWFtIik7CiAgQERlcHJlY2F0ZWQoIlVzZSBiaW5hcnkgaW5zdGVhZCIpCiAgc3RhdGljIGZpbmFsIEJJTkFSWSA9IGJpbmFyeTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBjb250ZW50IHR5cGUgb2JqZWN0IHNldHRpbmcgdGhlIHByaW1hcnkgdHlwZSBhbmQKICAgKiBzdWIgdHlwZS4gVGhlIGNoYXJzZXQgYW5kIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBjYW4gYWxzbyBiZSBzZXQKICAgKiB1c2luZyBbY2hhcnNldF0gYW5kIFtwYXJhbWV0ZXJzXS4gSWYgY2hhcnNldCBpcyBwYXNzZWQgYW5kCiAgICogW3BhcmFtZXRlcnNdIGNvbnRhaW5zIGNoYXJzZXQgYXMgd2VsbCB0aGUgcGFzc2VkIFtjaGFyc2V0XSB3aWxsCiAgICogb3ZlcnJpZGUgdGhlIHZhbHVlIGluIHBhcmFtZXRlcnMuIEtleXMgcGFzc2VkIGluIHBhcmFtZXRlcnMgd2lsbCBiZQogICAqIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLiBUaGUgYGNoYXJzZXRgIGVudHJ5LCB3aGV0aGVyIHBhc3NlZCBhcyBgY2hhcnNldGAKICAgKiBvciBpbiBgcGFyYW1ldGVyc2AsIHdpbGwgaGF2ZSBpdHMgdmFsdWUgY29udmVydGVkIHRvIGxvd2VyLWNhc2UuCiAgICovCiAgZmFjdG9yeSBDb250ZW50VHlwZShTdHJpbmcgcHJpbWFyeVR5cGUsIFN0cmluZyBzdWJUeXBlLAogICAgICB7U3RyaW5nIGNoYXJzZXQsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyc30pIHsKICAgIHJldHVybiBuZXcgX0NvbnRlbnRUeXBlKHByaW1hcnlUeXBlLCBzdWJUeXBlLCBjaGFyc2V0LCBwYXJhbWV0ZXJzKTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgY29udGVudCB0eXBlIG9iamVjdCBmcm9tIHBhcnNpbmcgYSBDb250ZW50LVR5cGUKICAgKiBoZWFkZXIgdmFsdWUuIEFzIHByaW1hcnkgdHlwZSwgc3ViIHR5cGUgYW5kIHBhcmFtZXRlciBuYW1lcyBhbmQKICAgKiB2YWx1ZXMgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZSBhbGwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgY29udmVydGVkCiAgICogdG8gbG93ZXIgY2FzZS4gUGFyc2luZyB0aGlzIHN0cmluZwogICAqCiAgICogICAgIHRleHQvaHRtbDsgY2hhcnNldD11dGYtOAogICAqCiAgICogd2lsbCBjcmVhdGUgYSBjb250ZW50IHR5cGUgb2JqZWN0IHdpdGggcHJpbWFyeSB0eXBlIFs6dGV4dDpdLCBzdWIKICAgKiB0eXBlIFs6aHRtbDpdIGFuZCBwYXJhbWV0ZXIgWzpjaGFyc2V0Ol0gd2l0aCB2YWx1ZSBbOnV0Zi04Ol0uCiAgICovCiAgc3RhdGljIENvbnRlbnRUeXBlIHBhcnNlKFN0cmluZyB2YWx1ZSkgewogICAgcmV0dXJuIF9Db250ZW50VHlwZS5wYXJzZSh2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBHZXRzIHRoZSBtaW1lLXR5cGUsIHdpdGhvdXQgYW55IHBhcmFtZXRlcnMuCiAgICovCiAgU3RyaW5nIGdldCBtaW1lVHlwZTsKCiAgLyoqCiAgICogR2V0cyB0aGUgcHJpbWFyeSB0eXBlLgogICAqLwogIFN0cmluZyBnZXQgcHJpbWFyeVR5cGU7CgogIC8qKgogICAqIEdldHMgdGhlIHN1YiB0eXBlLgogICAqLwogIFN0cmluZyBnZXQgc3ViVHlwZTsKCiAgLyoqCiAgICogR2V0cyB0aGUgY2hhcmFjdGVyIHNldC4KICAgKi8KICBTdHJpbmcgZ2V0IGNoYXJzZXQ7Cn0KCi8qKgogKiBSZXByZXNlbnRhdGlvbiBvZiBhIGNvb2tpZS4gRm9yIGNvb2tpZXMgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciBhcwogKiBDb29raWUgaGVhZGVyIHZhbHVlcyBvbmx5IFs6bmFtZTpdIGFuZCBbOnZhbHVlOl0gZmllbGRzIHdpbGwgYmUKICogc2V0LiBXaGVuIGJ1aWxkaW5nIGEgY29va2llIGZvciB0aGUgJ3NldC1jb29raWUnIGhlYWRlciBpbiB0aGUgc2VydmVyCiAqIGFuZCB3aGVuIHJlY2VpdmluZyBjb29raWVzIGluIHRoZSBjbGllbnQgYXMgJ3NldC1jb29raWUnIGhlYWRlcnMgYWxsCiAqIGZpZWxkcyBjYW4gYmUgdXNlZC4KICovCmFic3RyYWN0IGNsYXNzIENvb2tpZSB7CiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgbmFtZS4KICAgKi8KICBTdHJpbmcgbmFtZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgdmFsdWUuCiAgICovCiAgU3RyaW5nIHZhbHVlOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBleHBpcnkgZGF0ZS4KICAgKi8KICBEYXRlVGltZSBleHBpcmVzOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXggYWdlLiBBIHZhbHVlIG9mIFs6MDpdIG1lYW5zIGRlbGV0ZSBjb29raWUKICAgKiBub3cuCiAgICovCiAgaW50IG1heEFnZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgZG9tYWluLgogICAqLwogIFN0cmluZyBkb21haW47CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgdGhlIHBhdGguCiAgICovCiAgU3RyaW5nIHBhdGg7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgd2hldGhlciB0aGlzIGNvb2tpZSBpcyBzZWN1cmUuCiAgICovCiAgYm9vbCBzZWN1cmU7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgd2hldGhlciB0aGlzIGNvb2tpZSBpcyBIVFRQIG9ubHkuCiAgICovCiAgYm9vbCBodHRwT25seTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIG5ldyBjb29raWUgb3B0aW9uYWxseSBzZXR0aW5nIHRoZSBuYW1lIGFuZCB2YWx1ZS4KICAgKgogICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIG9mIGBodHRwT25seWAgd2lsbCBiZSBzZXQgdG8gYHRydWVgLgogICAqLwogIGZhY3RvcnkgQ29va2llKFtTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlXSkgPT4gbmV3IF9Db29raWUobmFtZSwgdmFsdWUpOwoKICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IGNvb2tpZSBieSBwYXJzaW5nIGEgaGVhZGVyIHZhbHVlIGZyb20gYSAnc2V0LWNvb2tpZScKICAgKiBoZWFkZXIuCiAgICovCiAgZmFjdG9yeSBDb29raWUuZnJvbVNldENvb2tpZVZhbHVlKFN0cmluZyB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBfQ29va2llLmZyb21TZXRDb29raWVWYWx1ZSh2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb29raWUuIFRoZQogICAqIHN0cmluZyByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZCBmb3IgZm9yIHNldHRpbmcgdGhlIENvb2tpZSBvcgogICAqICdzZXQtY29va2llJyBoZWFkZXJzCiAgICovCiAgU3RyaW5nIHRvU3RyaW5nKCk7Cn0KCi8qKgogKiBBIHNlcnZlci1zaWRlIG9iamVjdAogKiB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50IG9mIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBIVFRQIHJlcXVlc3QuCiAqCiAqIF9fTm90ZV9fOiBDaGVjayBvdXQgdGhlCiAqIFtodHRwX3NlcnZlcl0oaHR0cHM6Ly9wdWIuZGFydGxhbmcub3JnL3BhY2thZ2VzL2h0dHBfc2VydmVyKQogKiBwYWNrYWdlLCB3aGljaCBtYWtlcyB3b3JraW5nIHdpdGggdGhlIGxvdy1sZXZlbAogKiBkYXJ0OmlvIEhUVFAgc2VydmVyIHN1YnN5c3RlbSBlYXNpZXIuCiAqCiAqIGBIdHRwUmVxdWVzdGAgb2JqZWN0cyBhcmUgZ2VuZXJhdGVkIGJ5IGFuIFtIdHRwU2VydmVyXSwKICogd2hpY2ggbGlzdGVucyBmb3IgSFRUUCByZXF1ZXN0cyBvbiBhIHNwZWNpZmljIGhvc3QgYW5kIHBvcnQuCiAqIEZvciBlYWNoIHJlcXVlc3QgcmVjZWl2ZWQsIHRoZSBIdHRwU2VydmVyLCB3aGljaCBpcyBhIFtTdHJlYW1dLAogKiBnZW5lcmF0ZXMgYW4gYEh0dHBSZXF1ZXN0YCBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIHN0cmVhbS4KICoKICogQW4gYEh0dHBSZXF1ZXN0YCBvYmplY3QgZGVsaXZlcnMgdGhlIGJvZHkgY29udGVudCBvZiB0aGUgcmVxdWVzdAogKiBhcyBhIHN0cmVhbSBvZiBieXRlIGxpc3RzLgogKiBUaGUgb2JqZWN0IGFsc28gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3QsCiAqIHN1Y2ggYXMgdGhlIG1ldGhvZCwgVVJJLCBhbmQgaGVhZGVycy4KICoKICogSW4gdGhlIGZvbGxvd2luZyBjb2RlLCBhbiBIdHRwU2VydmVyIGxpc3RlbnMKICogZm9yIEhUVFAgcmVxdWVzdHMuIFdoZW4gdGhlIHNlcnZlciByZWNlaXZlcyBhIHJlcXVlc3QsCiAqIGl0IHVzZXMgdGhlIEh0dHBSZXF1ZXN0IG9iamVjdCdzIGBtZXRob2RgIHByb3BlcnR5IHRvIGRpc3BhdGNoIHJlcXVlc3RzLgogKgogKiAgICAgZmluYWwgSE9TVCA9IEludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjQ7CiAqICAgICBmaW5hbCBQT1JUID0gODA7CiAqCiAqICAgICBIdHRwU2VydmVyLmJpbmQoSE9TVCwgUE9SVCkudGhlbigoX3NlcnZlcikgewogKiAgICAgICBfc2VydmVyLmxpc3RlbigoSHR0cFJlcXVlc3QgcmVxdWVzdCkgewogKiAgICAgICAgIHN3aXRjaCAocmVxdWVzdC5tZXRob2QpIHsKICogICAgICAgICAgIGNhc2UgJ0dFVCc6CiAqICAgICAgICAgICAgIGhhbmRsZUdldFJlcXVlc3QocmVxdWVzdCk7CiAqICAgICAgICAgICAgIGJyZWFrOwogKiAgICAgICAgICAgY2FzZSAnUE9TVCc6CiAqICAgICAgICAgICAgIC4uLgogKiAgICAgICAgIH0KICogICAgICAgfSwKICogICAgICAgb25FcnJvcjogaGFuZGxlRXJyb3IpOyAgICAvLyBsaXN0ZW4oKSBmYWlsZWQuCiAqICAgICB9KS5jYXRjaEVycm9yKGhhbmRsZUVycm9yKTsKICoKICogQW4gSHR0cFJlcXVlc3Qgb2JqZWN0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYXNzb2NpYXRlZCBbSHR0cFJlc3BvbnNlXQogKiBvYmplY3QgdGhyb3VnaCB0aGUgcmVzcG9uc2UgcHJvcGVydHkuCiAqIFRoZSBzZXJ2ZXIgd3JpdGVzIGl0cyByZXNwb25zZSB0byB0aGUgYm9keSBvZiB0aGUgSHR0cFJlc3BvbnNlIG9iamVjdC4KICogRm9yIGV4YW1wbGUsIGhlcmUncyBhIGZ1bmN0aW9uIHRoYXQgcmVzcG9uZHMgdG8gYSByZXF1ZXN0OgogKgogKiAgICAgdm9pZCBoYW5kbGVHZXRSZXF1ZXN0KEh0dHBSZXF1ZXN0IHJlcSkgewogKiAgICAgICBIdHRwUmVzcG9uc2UgcmVzID0gcmVxLnJlc3BvbnNlOwogKiAgICAgICByZXMud3JpdGUoJ1JlY2VpdmVkIHJlcXVlc3QgJHtyZXEubWV0aG9kfTogJHtyZXEudXJpLnBhdGh9Jyk7CiAqICAgICAgIHJlcy5jbG9zZSgpOwogKiAgICAgfQogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cFJlcXVlc3QgaW1wbGVtZW50cyBTdHJlYW08TGlzdDxpbnQ+PiB7CiAgLyoqCiAgICogVGhlIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0IGJvZHkuCiAgICoKICAgKiBJZiB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdCBib2R5IGlzIG5vdCBrbm93biBpbiBhZHZhbmNlLAogICAqIHRoaXMgdmFsdWUgaXMgLTEuCiAgICovCiAgaW50IGdldCBjb250ZW50TGVuZ3RoOwoKICAvKioKICAgKiBUaGUgbWV0aG9kLCBzdWNoIGFzICdHRVQnIG9yICdQT1NUJywgZm9yIHRoZSByZXF1ZXN0LgogICAqLwogIFN0cmluZyBnZXQgbWV0aG9kOwoKICAvKioKICAgKiBUaGUgVVJJIGZvciB0aGUgcmVxdWVzdC4KICAgKgogICAqIFRoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQogICAqIHBhdGggYW5kIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIHJlcXVlc3QuCiAgICovCiAgVXJpIGdldCB1cmk7CgogIC8qKgogICAqIFRoZSByZXF1ZXN0ZWQgVVJJIGZvciB0aGUgcmVxdWVzdC4KICAgKgogICAqIFRoZSByZXR1cm5lZCBVUkkgaXMgcmVjb25zdHJ1Y3RlZCBieSB1c2luZyBodHRwLWhlYWRlciBmaWVsZHMsIHRvIGFjY2VzcwogICAqIG90aGVyd2lzZSBsb3N0IGluZm9ybWF0aW9uLCBlLmcuIGhvc3QgYW5kIHNjaGVtZS4KICAgKgogICAqIFRvIHJlY29uc3RydWN0IHRoZSBzY2hlbWUsIGZpcnN0ICdYLUZvcndhcmRlZC1Qcm90bycgaXMgY2hlY2tlZCwgYW5kIHRoZW4KICAgKiBmYWxsaW5nIGJhY2sgdG8gc2VydmVyIHR5cGUuCiAgICoKICAgKiBUbyByZWNvbnN0cnVjdCB0aGUgaG9zdCwgZmlyc3QgJ1gtRm9yd2FyZGVkLUhvc3QnIGlzIGNoZWNrZWQsIHRoZW4gJ0hvc3QnCiAgICogYW5kIGZpbmFsbHkgY2FsbGluZyBiYWNrIHRvIHNlcnZlci4KICAgKi8KICBVcmkgZ2V0IHJlcXVlc3RlZFVyaTsKCiAgLyoqCiAgICogVGhlIHJlcXVlc3QgaGVhZGVycy4KICAgKgogICAqIFRoZSByZXR1cm5lZCBbSHR0cEhlYWRlcnNdIGFyZSBpbW11dGFibGUuCiAgICovCiAgSHR0cEhlYWRlcnMgZ2V0IGhlYWRlcnM7CgogIC8qKgogICAqIFRoZSBjb29raWVzIGluIHRoZSByZXF1ZXN0LCBmcm9tIHRoZSBDb29raWUgaGVhZGVycy4KICAgKi8KICBMaXN0PENvb2tpZT4gZ2V0IGNvb2tpZXM7CgogIC8qKgogICAqIFRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3RhdGUgc2lnbmFsZWQgYnkgdGhlIGNsaWVudC4KICAgKi8KICBib29sIGdldCBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKCiAgLyoqCiAgICogVGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSBvZiB0aGUgY2xpZW50IG1ha2luZyB0aGUgcmVxdWVzdC4KICAgKgogICAqIFRoaXMgdmFsdWUgaXMgbnVsbCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYSBzZWN1cmUgVExTIG9yIFNTTCBjb25uZWN0aW9uLAogICAqIG9yIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgcmVxdWVzdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZSwgb3IgaWYgdGhlIGNsaWVudAogICAqIGRvZXMgbm90IHByb3ZpZGUgb25lLgogICAqLwogIFg1MDlDZXJ0aWZpY2F0ZSBnZXQgY2VydGlmaWNhdGU7CgogIC8qKgogICAqIFRoZSBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gcmVxdWVzdC4KICAgKgogICAqIElmIHRoZSBzZXNzaW9uIGlzCiAgICogYmVpbmcgaW5pdGlhbGl6ZWQgYnkgdGhpcyBjYWxsLCBbOmlzTmV3Ol0gaXMgdHJ1ZSBmb3IgdGhlIHJldHVybmVkCiAgICogc2Vzc2lvbi4KICAgKiBTZWUgW0h0dHBTZXJ2ZXIuc2Vzc2lvblRpbWVvdXRdIG9uIGhvdyB0byBjaGFuZ2UgZGVmYXVsdCB0aW1lb3V0LgogICAqLwogIEh0dHBTZXNzaW9uIGdldCBzZXNzaW9uOwoKICAvKioKICAgKiBUaGUgSFRUUCBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgaW4gdGhlIHJlcXVlc3QsCiAgICogZWl0aGVyICIxLjAiIG9yICIxLjEiLgogICAqLwogIFN0cmluZyBnZXQgcHJvdG9jb2xWZXJzaW9uOwoKICAvKioKICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uCiAgICoKICAgKiBSZXR1cm5zIFs6bnVsbDpdIGlmIHRoZSBzb2NrZXQgaXMgbm90IGF2YWlsYWJsZS4KICAgKi8KICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvOwoKICAvKioKICAgKiBUaGUgW0h0dHBSZXNwb25zZV0gb2JqZWN0LCB1c2VkIGZvciBzZW5kaW5nIGJhY2sgdGhlIHJlc3BvbnNlIHRvIHRoZQogICAqIGNsaWVudC4KICAgKgogICAqIElmIHRoZSBbY29udGVudExlbmd0aF0gb2YgdGhlIGJvZHkgaXNuJ3QgMCwgYW5kIHRoZSBib2R5IGlzbid0IGJlaW5nIHJlYWQsCiAgICogYW55IHdyaXRlIGNhbGxzIG9uIHRoZSBbSHR0cFJlc3BvbnNlXSBhdXRvbWF0aWNhbGx5IGRyYWluIHRoZSByZXF1ZXN0CiAgICogYm9keS4KICAgKi8KICBIdHRwUmVzcG9uc2UgZ2V0IHJlc3BvbnNlOwp9CgovKioKICogQW4gSFRUUCByZXNwb25zZSwgd2hpY2ggcmV0dXJucyB0aGUgaGVhZGVycyBhbmQgZGF0YQogKiBmcm9tIHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudCBpbiByZXNwb25zZSB0byBhbiBIVFRQIHJlcXVlc3QuCiAqCiAqIEV2ZXJ5IEh0dHBSZXF1ZXN0IG9iamVjdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGFzc29jaWF0ZWQgW0h0dHBSZXNwb25zZV0KICogb2JqZWN0IHRocm91Z2ggdGhlIGByZXNwb25zZWAgcHJvcGVydHkuCiAqIFRoZSBzZXJ2ZXIgc2VuZHMgaXRzIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgYnkgd3JpdGluZyB0byB0aGUKICogSHR0cFJlc3BvbnNlIG9iamVjdC4KICoKICogIyMgV3JpdGluZyB0aGUgcmVzcG9uc2UKICoKICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIFtJT1NpbmtdLgogKiBBZnRlciB0aGUgaGVhZGVyIGhhcyBiZWVuIHNldCB1cCwgdGhlIG1ldGhvZHMKICogZnJvbSBJT1NpbmssIHN1Y2ggYXMgYHdyaXRlbG4oKWAsIGNhbiBiZSB1c2VkIHRvIHdyaXRlCiAqIHRoZSBib2R5IG9mIHRoZSBIVFRQIHJlc3BvbnNlLgogKiBVc2UgdGhlIGBjbG9zZSgpYCBtZXRob2QgdG8gY2xvc2UgdGhlIHJlc3BvbnNlIGFuZCBzZW5kIGl0IHRvIHRoZSBjbGllbnQuCiAqCiAqICAgICBzZXJ2ZXIubGlzdGVuKChIdHRwUmVxdWVzdCByZXF1ZXN0KSB7CiAqICAgICAgIHJlcXVlc3QucmVzcG9uc2Uud3JpdGUoJ0hlbGxvLCB3b3JsZCEnKTsKICogICAgICAgcmVxdWVzdC5yZXNwb25zZS5jbG9zZSgpOwogKiAgICAgfSk7CiAqCiAqIFdoZW4gb25lIG9mIHRoZSBJT1NpbmsgbWV0aG9kcyBpcyB1c2VkIGZvciB0aGUKICogZmlyc3QgdGltZSwgdGhlIHJlcXVlc3QgaGVhZGVyIGlzIHNlbnQuIENhbGxpbmcgYW55IG1ldGhvZHMgdGhhdAogKiBjaGFuZ2UgdGhlIGhlYWRlciBhZnRlciBpdCBpcyBzZW50IHRocm93cyBhbiBleGNlcHRpb24uCiAqCiAqICMjIFNldHRpbmcgdGhlIGhlYWRlcnMKICoKICogVGhlIEh0dHBSZXNwb25zZSBvYmplY3QgaGFzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgZm9yIHNldHRpbmcgdXAKICogdGhlIEhUVFAgaGVhZGVycyBvZiB0aGUgcmVzcG9uc2UuCiAqIFdoZW4gd3JpdGluZyBzdHJpbmcgZGF0YSB0aHJvdWdoIHRoZSBJT1NpbmssIHRoZSBlbmNvZGluZyB1c2VkCiAqIGlzIGRldGVybWluZWQgZnJvbSB0aGUgImNoYXJzZXQiIHBhcmFtZXRlciBvZiB0aGUKICogIkNvbnRlbnQtVHlwZSIgaGVhZGVyLgogKgogKiAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gLi4uCiAqICAgICByZXNwb25zZS5oZWFkZXJzLmNvbnRlbnRUeXBlCiAqICAgICAgICAgPSBuZXcgQ29udGVudFR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iLCBjaGFyc2V0OiAidXRmLTgiKTsKICogICAgIHJlc3BvbnNlLndyaXRlKC4uLik7ICAvLyBTdHJpbmdzIHdyaXR0ZW4gd2lsbCBiZSBVVEYtOCBlbmNvZGVkLgogKgogKiBJZiBubyBjaGFyc2V0IGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IG9mIElTTy04ODU5LTEgKExhdGluIDEpIHdpbGwKICogYmUgdXNlZC4KICoKICogICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IC4uLgogKiAgICAgcmVzcG9uc2UuaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuY29udGVudFR5cGVIZWFkZXIsICJ0ZXh0L3BsYWluIik7CiAqICAgICByZXNwb25zZS53cml0ZSguLi4pOyAgLy8gU3RyaW5ncyB3cml0dGVuIHdpbGwgYmUgSVNPLTg4NTktMSBlbmNvZGVkLgogKgogKiBBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHlvdSB1c2UgdGhlIGB3cml0ZSgpYCBtZXRob2QKICogd2hpbGUgYW4gdW5zdXBwb3J0ZWQgY29udGVudC10eXBlIGlzIHNldC4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBSZXNwb25zZSBpbXBsZW1lbnRzIElPU2luayB7CiAgLy8gVE9ETyhham9obnNlbik6IEFkZCBkb2N1bWVudGF0aW9uIG9mIGhvdyB0byBwaXBlIGEgZmlsZSB0byB0aGUgcmVzcG9uc2UuCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgY29udGVudCBsZW5ndGggb2YgdGhlIHJlc3BvbnNlLiBJZiB0aGUgc2l6ZSBvZgogICAqIHRoZSByZXNwb25zZSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSBzZXQgdGhlIGNvbnRlbnQgbGVuZ3RoIHRvCiAgICogLTEsIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQgaWYgbm90IHNldC4KICAgKi8KICBpbnQgY29udGVudExlbmd0aDsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgc3RhdHVzIGNvZGUuIEFueSBpbnRlZ2VyIHZhbHVlIGlzIGFjY2VwdGVkLiBGb3IKICAgKiB0aGUgb2ZmaWNpYWwgSFRUUCBzdGF0dXMgY29kZXMgdXNlIHRoZSBmaWVsZHMgZnJvbQogICAqIFtIdHRwU3RhdHVzXS4gSWYgbm8gc3RhdHVzIGNvZGUgaXMgZXhwbGljaXRseSBzZXQgdGhlIGRlZmF1bHQKICAgKiB2YWx1ZSBbSHR0cFN0YXR1cy5va10gaXMgdXNlZC4KICAgKgogICAqIFRoZSBzdGF0dXMgY29kZSBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGJvZHkgaXMgd3JpdHRlbgogICAqIHRvLiBTZXR0aW5nIHRoZSBzdGF0dXMgY29kZSBhZnRlciB3cml0aW5nIHRvIHRoZSByZXNwb25zZSBib2R5IG9yCiAgICogY2xvc2luZyB0aGUgcmVzcG9uc2Ugd2lsbCB0aHJvdyBhIGBTdGF0ZUVycm9yYC4KICAgKi8KICBpbnQgc3RhdHVzQ29kZTsKCiAgLyoqCiAgICogR2V0cyBhbmQgc2V0cyB0aGUgcmVhc29uIHBocmFzZS4gSWYgbm8gcmVhc29uIHBocmFzZSBpcyBleHBsaWNpdGx5CiAgICogc2V0IGEgZGVmYXVsdCByZWFzb24gcGhyYXNlIGlzIHByb3ZpZGVkLgogICAqCiAgICogVGhlIHJlYXNvbiBwaHJhc2UgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBib2R5IGlzIHdyaXR0ZW4KICAgKiB0by4gU2V0dGluZyB0aGUgcmVhc29uIHBocmFzZSBhZnRlciB3cml0aW5nIHRvIHRoZSByZXNwb25zZSBib2R5CiAgICogb3IgY2xvc2luZyB0aGUgcmVzcG9uc2Ugd2lsbCB0aHJvdyBhIGBTdGF0ZUVycm9yYC4KICAgKi8KICBTdHJpbmcgcmVhc29uUGhyYXNlOwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3RhdGUuIFRoZSBpbml0aWFsIHZhbHVlCiAgICogb2YgdGhpcyBwcm9wZXJ0eSBpcyB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlIGZyb20gdGhlCiAgICogcmVxdWVzdC4KICAgKi8KICBib29sIHBlcnNpc3RlbnRDb25uZWN0aW9uOwoKICAvKioKICAgKiBTZXQgYW5kIGdldCB0aGUgW2RlYWRsaW5lXSBmb3IgdGhlIHJlc3BvbnNlLiBUaGUgZGVhZGxpbmUgaXMgdGltZWQgZnJvbSB0aGUKICAgKiB0aW1lIGl0J3Mgc2V0LiBTZXR0aW5nIGEgbmV3IGRlYWRsaW5lIHdpbGwgb3ZlcnJpZGUgYW55IHByZXZpb3VzIGRlYWRsaW5lLgogICAqIFdoZW4gYSBkZWFkbGluZSBpcyBleGNlZWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgY2xvc2VkIGFuZCBhbnkgZnVydGhlcgogICAqIGRhdGEgaWdub3JlZC4KICAgKgogICAqIFRvIGRpc2FibGUgYSBkZWFkbGluZSwgc2V0IHRoZSBbZGVhZGxpbmVdIHRvIGBudWxsYC4KICAgKgogICAqIFRoZSBbZGVhZGxpbmVdIGlzIGBudWxsYCBieSBkZWZhdWx0LgogICAqLwogIER1cmF0aW9uIGRlYWRsaW5lOwoKICAvKioKICAgKiBHZXRzIG9yIHNldHMgaWYgdGhlIFtIdHRwUmVzcG9uc2VdIHNob3VsZCBidWZmZXIgb3V0cHV0LgogICAqCiAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuCiAgICoKICAgKiBfX05vdGVfXzogRGlzYWJsaW5nIGJ1ZmZlcmluZyBvZiB0aGUgb3V0cHV0IGNhbiByZXN1bHQgaW4gdmVyeSBwb29yCiAgICogcGVyZm9ybWFuY2UsIHdoZW4gd3JpdGluZyBtYW55IHNtYWxsIGNodW5rcy4KICAgKi8KICBib29sIGJ1ZmZlck91dHB1dDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgcmVzcG9uc2UgaGVhZGVycy4KICAgKgogICAqIFRoZSByZXNwb25zZSBoZWFkZXJzIGNhbiBiZSBtb2RpZmllZCB1bnRpbCB0aGUgcmVzcG9uc2UgYm9keSBpcwogICAqIHdyaXR0ZW4gdG8gb3IgY2xvc2VkLiBBZnRlciB0aGF0IHRoZXkgYmVjb21lIGltbXV0YWJsZS4KICAgKi8KICBIdHRwSGVhZGVycyBnZXQgaGVhZGVyczsKCiAgLyoqCiAgICogQ29va2llcyB0byBzZXQgaW4gdGhlIGNsaWVudCAoaW4gdGhlICdzZXQtY29va2llJyBoZWFkZXIpLgogICAqLwogIExpc3Q8Q29va2llPiBnZXQgY29va2llczsKCiAgLyoqCiAgICogUmVzcG9uZCB3aXRoIGEgcmVkaXJlY3QgdG8gW2xvY2F0aW9uXS4KICAgKgogICAqIFRoZSBVUkkgaW4gW2xvY2F0aW9uXSBzaG91bGQgYmUgYWJzb2x1dGUsIGJ1dCB0aGVyZSBhcmUgbm8gY2hlY2tzCiAgICogdG8gZW5mb3JjZSB0aGF0LgogICAqCiAgICogQnkgZGVmYXVsdCB0aGUgSFRUUCBzdGF0dXMgY29kZSBgSHR0cFN0YXR1cy5tb3ZlZFRlbXBvcmFyaWx5YAogICAqIChgMzAyYCkgaXMgdXNlZCBmb3IgdGhlIHJlZGlyZWN0LCBidXQgYW4gYWx0ZXJuYXRpdmUgb25lIGNhbiBiZQogICAqIHNwZWNpZmllZCB1c2luZyB0aGUgW3N0YXR1c10gYXJndW1lbnQuCiAgICoKICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gY2FsbCBgY2xvc2VgLCBhbmQgdGhlIHJldHVybmVkIGZ1dHVyZSBpcwogICAqIHRoZSBmdXR1cmUgcmV0dXJuZWQgYnkgYGNsb3NlYC4KICAgKi8KICBGdXR1cmUgcmVkaXJlY3QoVXJpIGxvY2F0aW9uLCB7aW50IHN0YXR1czogSHR0cFN0YXR1cy5tb3ZlZFRlbXBvcmFyaWx5fSk7CgogIC8qKgogICAqIERldGFjaGVzIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBmcm9tIHRoZSBIVFRQIHNlcnZlci4gV2hlbiB0aGUKICAgKiBzb2NrZXQgaXMgZGV0YWNoZWQgdGhlIEhUVFAgc2VydmVyIHdpbGwgbm8gbG9uZ2VyIHBlcmZvcm0gYW55CiAgICogb3BlcmF0aW9ucyBvbiBpdC4KICAgKgogICAqIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCB3aGVuIGEgSFRUUCB1cGdyYWRlIHJlcXVlc3QgaXMgcmVjZWl2ZWQKICAgKiBhbmQgdGhlIGNvbW11bmljYXRpb24gc2hvdWxkIGNvbnRpbnVlIHdpdGggYSBkaWZmZXJlbnQgcHJvdG9jb2wuCiAgICoKICAgKiBJZiBbd3JpdGVIZWFkZXJzXSBpcyBgdHJ1ZWAsIHRoZSBzdGF0dXMgbGluZSBhbmQgW2hlYWRlcnNdIHdpbGwgYmUgd3JpdHRlbgogICAqIHRvIHRoZSBzb2NrZXQgYmVmb3JlIGl0J3MgZGV0YWNoZWQuIElmIGBmYWxzZWAsIHRoZSBzb2NrZXQgaXMgZGV0YWNoZWQKICAgKiBpbW1lZGlhdGVseSwgd2l0aG91dCBhbnkgZGF0YSB3cml0dGVuIHRvIHRoZSBzb2NrZXQuIERlZmF1bHQgaXMgYHRydWVgLgogICAqLwogIEZ1dHVyZTxTb2NrZXQ+IGRldGFjaFNvY2tldCh7Ym9vbCB3cml0ZUhlYWRlcnM6IHRydWV9KTsKCiAgLyoqCiAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uIFJldHVybnMgWzpudWxsOl0gaWYgdGhlCiAgICogc29ja2V0IGlzIG5vdCBhdmFpbGFibGUuCiAgICovCiAgSHR0cENvbm5lY3Rpb25JbmZvIGdldCBjb25uZWN0aW9uSW5mbzsKfQoKLyoqCiAqIEEgY2xpZW50IHRoYXQgcmVjZWl2ZXMgY29udGVudCwgc3VjaCBhcyB3ZWIgcGFnZXMsIGZyb20KICogYSBzZXJ2ZXIgdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wuCiAqCiAqIEh0dHBDbGllbnQgY29udGFpbnMgYSBudW1iZXIgb2YgbWV0aG9kcyB0byBzZW5kIGFuIFtIdHRwQ2xpZW50UmVxdWVzdF0KICogdG8gYW4gSHR0cCBzZXJ2ZXIgYW5kIHJlY2VpdmUgYW4gW0h0dHBDbGllbnRSZXNwb25zZV0gYmFjay4KICogRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZSBbZ2V0XSwgW2dldFVybF0sIFtwb3N0XSwgYW5kIFtwb3N0VXJsXSBtZXRob2RzCiAqIGZvciBHRVQgYW5kIFBPU1QgcmVxdWVzdHMsIHJlc3BlY3RpdmVseS4KICoKICogIyMgTWFraW5nIGEgc2ltcGxlIEdFVCByZXF1ZXN0OiBhbiBleGFtcGxlCiAqCiAqIEEgYGdldFVybGAgcmVxdWVzdCBpcyBhIHR3by1zdGVwIHByb2Nlc3MsIHRyaWdnZXJlZCBieSB0d28gW0Z1dHVyZV1zLgogKiBXaGVuIHRoZSBmaXJzdCBmdXR1cmUgY29tcGxldGVzIHdpdGggYSBbSHR0cENsaWVudFJlcXVlc3RdLCB0aGUgdW5kZXJseWluZwogKiBuZXR3b3JrIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQsIGJ1dCBubyBkYXRhIGhhcyBiZWVuIHNlbnQuCiAqIEluIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIGZpcnN0IGZ1dHVyZSwgdGhlIEhUVFAgaGVhZGVycyBhbmQgYm9keQogKiBjYW4gYmUgc2V0IG9uIHRoZSByZXF1ZXN0LiBFaXRoZXIgdGhlIGZpcnN0IHdyaXRlIHRvIHRoZSByZXF1ZXN0IG9iamVjdAogKiBvciBhIGNhbGwgdG8gW2Nsb3NlXSBzZW5kcyB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyLgogKgogKiBXaGVuIHRoZSBIVFRQIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciwKICogdGhlIHNlY29uZCBmdXR1cmUsIHdoaWNoIGlzIHJldHVybmVkIGJ5IGNsb3NlLAogKiBjb21wbGV0ZXMgd2l0aCBhbiBbSHR0cENsaWVudFJlc3BvbnNlXSBvYmplY3QuCiAqIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaGVhZGVycyBhbmQgYm9keSBvZiB0aGUgcmVzcG9uc2UuCiAqIFRoZSBib2R5IGlzIGF2YWlsYWJsZSBhcyBhIHN0cmVhbSBpbXBsZW1lbnRlZCBieSBIdHRwQ2xpZW50UmVzcG9uc2UuCiAqIElmIGEgYm9keSBpcyBwcmVzZW50LCBpdCBtdXN0IGJlIHJlYWQuIE90aGVyd2lzZSwgaXQgbGVhZHMgdG8gcmVzb3VyY2UKICogbGVha3MuIENvbnNpZGVyIHVzaW5nIFtIdHRwQ2xpZW50UmVzcG9uc2UuZHJhaW5dIGlmIHRoZSBib2R5IGlzIHVudXNlZC4KICoKICogICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICogICAgIGNsaWVudC5nZXRVcmwoVXJpLnBhcnNlKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpKQogKiAgICAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CiAqICAgICAgICAgICAvLyBPcHRpb25hbGx5IHNldCB1cCBoZWFkZXJzLi4uCiAqICAgICAgICAgICAvLyBPcHRpb25hbGx5IHdyaXRlIHRvIHRoZSByZXF1ZXN0IG9iamVjdC4uLgogKiAgICAgICAgICAgLy8gVGhlbiBjYWxsIGNsb3NlLgogKiAgICAgICAgICAgLi4uCiAqICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5jbG9zZSgpOwogKiAgICAgICAgIH0pCiAqICAgICAgICAgLnRoZW4oKEh0dHBDbGllbnRSZXNwb25zZSByZXNwb25zZSkgewogKiAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVzcG9uc2UuCiAqICAgICAgICAgICAuLi4KICogICAgICAgICB9KTsKICoKICogVGhlIGZ1dHVyZSBmb3IgW0h0dHBDbGllbnRSZXF1ZXN0XSBpcyBjcmVhdGVkIGJ5IG1ldGhvZHMgc3VjaCBhcwogKiBbZ2V0VXJsXSBhbmQgW29wZW5dLgogKgogKiAjIyBIVFRQUyBjb25uZWN0aW9ucwogKgogKiBBbiBIdHRwQ2xpZW50IGNhbiBtYWtlIEhUVFBTIHJlcXVlc3RzLCBjb25uZWN0aW5nIHRvIGEgc2VydmVyIHVzaW5nCiAqIHRoZSBUTFMgKFNTTCkgc2VjdXJlIG5ldHdvcmtpbmcgcHJvdG9jb2wuIENhbGxpbmcgW2dldFVybF0gd2l0aCBhbgogKiBodHRwczogc2NoZW1lIHdpbGwgd29yayBhdXRvbWF0aWNhbGx5LCBpZiB0aGUgc2VydmVyJ3MgY2VydGlmaWNhdGUgaXMKICogc2lnbmVkIGJ5IGEgcm9vdCBDQSAoY2VydGlmaWNhdGUgYXV0aG9yaXR5KSBvbiB0aGUgZGVmYXVsdCBsaXN0IG9mCiAqIHdlbGwta25vd24gdHJ1c3RlZCBDQXMsIGNvbXBpbGVkIGJ5IE1vemlsbGEuCiAqCiAqIFRvIGFkZCBhIGN1c3RvbSB0cnVzdGVkIGNlcnRpZmljYXRlIGF1dGhvcml0eSwgb3IgdG8gc2VuZCBhIGNsaWVudAogKiBjZXJ0aWZpY2F0ZSB0byBzZXJ2ZXJzIHRoYXQgcmVxdWVzdCBvbmUsIHBhc3MgYSBbU2VjdXJpdHlDb250ZXh0XSBvYmplY3QKICogYXMgdGhlIG9wdGlvbmFsIGBjb250ZXh0YCBhcmd1bWVudCB0byB0aGUgYEh0dHBDbGllbnRgIGNvbnN0cnVjdG9yLgogKiBUaGUgZGVzaXJlZCBzZWN1cml0eSBvcHRpb25zIGNhbiBiZSBzZXQgb24gdGhlIFtTZWN1cml0eUNvbnRleHRdIG9iamVjdC4KICoKICogIyMgSGVhZGVycwogKgogKiBBbGwgSHR0cENsaWVudCByZXF1ZXN0cyBzZXQgdGhlIGZvbGxvd2luZyBoZWFkZXIgYnkgZGVmYXVsdDoKICoKICogICAgIEFjY2VwdC1FbmNvZGluZzogZ3ppcAogKgogKiBUaGlzIGFsbG93cyB0aGUgSFRUUCBzZXJ2ZXIgdG8gdXNlIGd6aXAgY29tcHJlc3Npb24gZm9yIHRoZSBib2R5IGlmCiAqIHBvc3NpYmxlLiBJZiB0aGlzIGJlaGF2aW9yIGlzIG5vdCBkZXNpcmVkIHNldCB0aGUKICogYEFjY2VwdC1FbmNvZGluZ2AgaGVhZGVyIHRvIHNvbWV0aGluZyBlbHNlLgogKiBUbyB0dXJuIG9mZiBnemlwIGNvbXByZXNzaW9uIG9mIHRoZSByZXNwb25zZSwgY2xlYXIgdGhpcyBoZWFkZXI6CiAqCiAqICAgICAgcmVxdWVzdC5oZWFkZXJzLnJlbW92ZUFsbChIdHRwSGVhZGVycy5hY2NlcHRFbmNvZGluZ0hlYWRlcikKICoKICogIyMgQ2xvc2luZyB0aGUgSHR0cENsaWVudAogKgogKiBUaGUgSHR0cENsaWVudCBzdXBwb3J0cyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBjYWNoZXMgbmV0d29yawogKiBjb25uZWN0aW9ucyB0byByZXVzZSB0aGVtIGZvciBtdWx0aXBsZSByZXF1ZXN0cyB3aGVuZXZlcgogKiBwb3NzaWJsZS4gVGhpcyBtZWFucyB0aGF0IG5ldHdvcmsgY29ubmVjdGlvbnMgY2FuIGJlIGtlcHQgb3BlbiBmb3IKICogc29tZSB0aW1lIGFmdGVyIGEgcmVxdWVzdCBoYXMgY29tcGxldGVkLiBVc2UgSHR0cENsaWVudC5jbG9zZQogKiB0byBmb3JjZSB0aGUgSHR0cENsaWVudCBvYmplY3QgdG8gc2h1dCBkb3duIGFuZCB0byBjbG9zZSB0aGUgaWRsZQogKiBuZXR3b3JrIGNvbm5lY3Rpb25zLgogKgogKiAjIyBUdXJuaW5nIHByb3hpZXMgb24gYW5kIG9mZgogKgogKiBCeSBkZWZhdWx0IHRoZSBIdHRwQ2xpZW50IHVzZXMgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlCiAqIGZyb20gdGhlIGVudmlyb25tZW50LCBzZWUgW2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudF0uIFRvIHR1cm4gb2ZmCiAqIHRoZSB1c2Ugb2YgcHJveGllcyBzZXQgdGhlIFtmaW5kUHJveHldIHByb3BlcnR5IHRvCiAqIFs6bnVsbDpdLgogKgogKiAgICAgSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwogKiAgICAgY2xpZW50LmZpbmRQcm94eSA9IG51bGw7CiAqLwphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50IHsKICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRIdHRwUG9ydCA9IDgwOwogIEBEZXByZWNhdGVkKCJVc2UgZGVmYXVsdEh0dHBQb3J0IGluc3RlYWQiKQogIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9IVFRQX1BPUlQgPSBkZWZhdWx0SHR0cFBvcnQ7CgogIHN0YXRpYyBjb25zdCBpbnQgZGVmYXVsdEh0dHBzUG9ydCA9IDQ0MzsKICBARGVwcmVjYXRlZCgiVXNlIGRlZmF1bHRIdHRwc1BvcnQgaW5zdGVhZCIpCiAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0hUVFBTX1BPUlQgPSBkZWZhdWx0SHR0cHNQb3J0OwoKICAvLy8gR2V0cyBhbmQgc2V0cyB0aGUgaWRsZSB0aW1lb3V0IG9mIG5vbi1hY3RpdmUgcGVyc2lzdGVudCAoa2VlcC1hbGl2ZSkKICAvLy8gY29ubmVjdGlvbnMuCiAgLy8vCiAgLy8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IHNlY29uZHMuCiAgRHVyYXRpb24gaWRsZVRpbWVvdXQ7CgogIC8vLyBHZXRzIGFuZCBzZXRzIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQuCiAgLy8vCiAgLy8vIFdoZW4gY29ubmVjdGluZyB0byBhIG5ldyBob3N0IGV4Y2VlZHMgdGhpcyB0aW1lb3V0LCBhIFtTb2NrZXRFeGNlcHRpb25dCiAgLy8vIGlzIHRocm93bi4gVGhlIHRpbWVvdXQgYXBwbGllcyBvbmx5IHRvIGNvbm5lY3Rpb25zIGluaXRpYXRlZCBhZnRlciB0aGUKICAvLy8gdGltZW91dCBpcyBzZXQuCiAgLy8vCiAgLy8vIFdoZW4gdGhpcyBpcyBgbnVsbGAsIHRoZSBPUyBkZWZhdWx0IHRpbWVvdXQgaXMgdXNlZC4gVGhlIGRlZmF1bHQgaXMKICAvLy8gYG51bGxgLgogIER1cmF0aW9uIGNvbm5lY3Rpb25UaW1lb3V0OwoKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXZlIGNvbm5lY3Rpb25zLCB0byBhIHNpbmdsZSBob3N0LgogICAqCiAgICogSW5jcmVhc2luZyB0aGlzIG51bWJlciBtYXkgbG93ZXIgcGVyZm9ybWFuY2UgYW5kIHRha2UgdXAgdW53YW50ZWQKICAgKiBzeXN0ZW0gcmVzb3VyY2VzLgogICAqCiAgICogVG8gZGlzYWJsZSwgc2V0IHRvIGBudWxsYC4KICAgKgogICAqIERlZmF1bHQgaXMgYG51bGxgLgogICAqLwogIGludCBtYXhDb25uZWN0aW9uc1Blckhvc3Q7CgogIC8qKgogICAqIEdldHMgYW5kIHNldHMgd2hldGhlciB0aGUgYm9keSBvZiBhIHJlc3BvbnNlIHdpbGwgYmUgYXV0b21hdGljYWxseQogICAqIHVuY29tcHJlc3NlZC4KICAgKgogICAqIFRoZSBib2R5IG9mIGFuIEhUVFAgcmVzcG9uc2UgY2FuIGJlIGNvbXByZXNzZWQuIEluIG1vc3QKICAgKiBzaXR1YXRpb25zIHByb3ZpZGluZyB0aGUgdW4tY29tcHJlc3NlZCBib2R5IGlzIG1vc3QKICAgKiBjb252ZW5pZW50LiBUaGVyZWZvcmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gdW4tY29tcHJlc3MgdGhlCiAgICogYm9keS4gSG93ZXZlciBpbiBzb21lIHNpdHVhdGlvbnMgKGUuZy4gaW1wbGVtZW50aW5nIGEgdHJhbnNwYXJlbnQKICAgKiBwcm94eSkga2VlcGluZyB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSBpcyByZXF1aXJlZC4KICAgKgogICAqIE5PVEU6IEhlYWRlcnMgaW4gdGhlIHJlc3BvbnNlIGFyZSBuZXZlciBtb2RpZmllZC4gVGhpcyBtZWFucwogICAqIHRoYXQgd2hlbiBhdXRvbWF0aWMgdW4tY29tcHJlc3Npb24gaXMgdHVybmVkIG9uIHRoZSB2YWx1ZSBvZiB0aGUKICAgKiBoZWFkZXIgYENvbnRlbnQtTGVuZ3RoYCB3aWxsIHJlZmxlY3QgdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwKICAgKiBjb21wcmVzc2VkIGJvZHkuIExpa2V3aXNlIHRoZSBoZWFkZXIgYENvbnRlbnQtRW5jb2RpbmdgIHdpbGwgYWxzbwogICAqIGhhdmUgdGhlIG9yaWdpbmFsIHZhbHVlIGluZGljYXRpbmcgY29tcHJlc3Npb24uCiAgICoKICAgKiBOT1RFOiBBdXRvbWF0aWMgdW4tY29tcHJlc3Npb24gaXMgb25seSBwZXJmb3JtZWQgaWYgdGhlCiAgICogYENvbnRlbnQtRW5jb2RpbmdgIGhlYWRlciB2YWx1ZSBpcyBgZ3ppcGAuCiAgICoKICAgKiBUaGlzIHZhbHVlIGFmZmVjdHMgYWxsIHJlc3BvbnNlcyBwcm9kdWNlZCBieSB0aGlzIGNsaWVudCBhZnRlciB0aGUKICAgKiB2YWx1ZSBpcyBjaGFuZ2VkLgogICAqCiAgICogVG8gZGlzYWJsZSwgc2V0IHRvIGBmYWxzZWAuCiAgICoKICAgKiBEZWZhdWx0IGlzIGB0cnVlYC4KICAgKi8KICBib29sIGF1dG9VbmNvbXByZXNzOwoKICAvLy8gR2V0cyBhbmQgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYFVzZXItQWdlbnRgIGhlYWRlciBmb3IgYWxsIHJlcXVlc3RzCiAgLy8vIGdlbmVyYXRlZCBieSB0aGlzIFtIdHRwQ2xpZW50XS4KICAvLy8KICAvLy8gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYERhcnQvPHZlcnNpb24+IChkYXJ0OmlvKWAuCiAgLy8vCiAgLy8vIElmIHRoZSB1c2VyQWdlbnQgaXMgc2V0IHRvIGBudWxsYCwgbm8gZGVmYXVsdCBgVXNlci1BZ2VudGAgaGVhZGVyIHdpbGwgYmUKICAvLy8gYWRkZWQgdG8gZWFjaCByZXF1ZXN0LgogIFN0cmluZyB1c2VyQWdlbnQ7CgogIGZhY3RvcnkgSHR0cENsaWVudCh7U2VjdXJpdHlDb250ZXh0IGNvbnRleHR9KSB7CiAgICBIdHRwT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IEh0dHBPdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gbmV3IF9IdHRwQ2xpZW50KGNvbnRleHQpOwogICAgfQogICAgcmV0dXJuIG92ZXJyaWRlcy5jcmVhdGVIdHRwQ2xpZW50KGNvbnRleHQpOwogIH0KCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24uCiAgICoKICAgKiBUaGUgSFRUUCBtZXRob2QgdG8gdXNlIGlzIHNwZWNpZmllZCBpbiBbbWV0aG9kXSwgdGhlIHNlcnZlciBpcwogICAqIHNwZWNpZmllZCB1c2luZyBbaG9zdF0gYW5kIFtwb3J0XSwgYW5kIHRoZSBwYXRoIChpbmNsdWRpbmcKICAgKiBhIHBvc3NpYmxlIHF1ZXJ5KSBpcyBzcGVjaWZpZWQgdXNpbmcgW3BhdGhdLgogICAqIFRoZSBwYXRoIG1heSBhbHNvIGNvbnRhaW4gYSBVUkkgZnJhZ21lbnQsIHdoaWNoIHdpbGwgYmUgaWdub3JlZC4KICAgKgogICAqIFRoZSBgSG9zdGAgaGVhZGVyIGZvciB0aGUgcmVxdWVzdCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgW2hvc3RdOltwb3J0XQogICAqIChpZiBbaG9zdF0gaXMgYW4gSVAgYWRkcmVzcywgaXQgd2lsbCBzdGlsbCBiZSB1c2VkIGluIHRoZSBgSG9zdGAgaGVhZGVyKS4KICAgKiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRocm91Z2ggdGhlIFtIdHRwQ2xpZW50UmVxdWVzdF0gaW50ZXJmYWNlIGJlZm9yZQogICAqIHRoZSByZXF1ZXN0IGlzIHNlbnQuCiAgICoKICAgKiBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgc2VxdWVuY2Ugb2YgZXZlbnRzIGR1cmluZyBhbgogICAqIEhUVFAgdHJhbnNhY3Rpb24sIGFuZCB0aGUgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgZnV0dXJlcywgc2VlCiAgICogdGhlIG92ZXJhbGwgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGNsYXNzIFtIdHRwQ2xpZW50XS4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IG9wZW4oCiAgICAgIFN0cmluZyBtZXRob2QsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbi4KICAgKgogICAqIFRoZSBIVFRQIG1ldGhvZCBpcyBzcGVjaWZpZWQgaW4gW21ldGhvZF0gYW5kIHRoZSBVUkwgdG8gdXNlIGluCiAgICogW3VybF0uCiAgICoKICAgKiBUaGUgYEhvc3RgIGhlYWRlciBmb3IgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlCiAgICogW1VyaS5ob3N0XTpbVXJpLnBvcnRdIGZyb20gW3VybF0gKGlmIFt1cmwuaG9zdF0gaXMgYW4gSVAgYWRkcmVzcywgaXQgd2lsbAogICAqIHN0aWxsIGJlIHVzZWQgaW4gdGhlIGBIb3N0YCBoZWFkZXIpLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRocm91Z2ggdGhlCiAgICogW0h0dHBDbGllbnRSZXF1ZXN0XSBpbnRlcmZhY2UgYmVmb3JlIHRoZSByZXF1ZXN0IGlzIHNlbnQuCiAgICoKICAgKiBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgc2VxdWVuY2Ugb2YgZXZlbnRzIGR1cmluZyBhbgogICAqIEhUVFAgdHJhbnNhY3Rpb24sIGFuZCB0aGUgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgZnV0dXJlcywgc2VlCiAgICogdGhlIG92ZXJhbGwgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGNsYXNzIFtIdHRwQ2xpZW50XS4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IG9wZW5VcmwoU3RyaW5nIG1ldGhvZCwgVXJpIHVybCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBHRVQgbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nCiAgICogW3BhdGhdLgogICAqCiAgICogU2VlIFtvcGVuXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGdldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIEdFVCBtZXRob2QuCiAgICoKICAgKiBUaGUgVVJMIHRvIHVzZSBpcyBzcGVjaWZpZWQgaW4gW3VybF0uCiAgICoKICAgKiBTZWUgW29wZW5VcmxdIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gZ2V0VXJsKFVyaSB1cmwpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgUE9TVCBtZXRob2QuCiAgICoKICAgKiBUaGUgc2VydmVyIGlzIHNwZWNpZmllZCB1c2luZyBbaG9zdF0gYW5kIFtwb3J0XSwgYW5kIHRoZSBwYXRoCiAgICogKGluY2x1ZGluZyBhIHBvc3NpYmxlIHF1ZXJ5KSBpcyBzcGVjaWZpZWQgdXNpbmcKICAgKiBbcGF0aF0uCiAgICoKICAgKiBTZWUgW29wZW5dIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gcG9zdChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFBPU1QgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IHBvc3RVcmwoVXJpIHVybCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBQVVQgbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nIFtwYXRoXS4KICAgKgogICAqIFNlZSBbb3Blbl0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwdXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgcGF0aCk7CgogIC8qKgogICAqIE9wZW5zIGEgSFRUUCBjb25uZWN0aW9uIHVzaW5nIHRoZSBQVVQgbWV0aG9kLgogICAqCiAgICogVGhlIFVSTCB0byB1c2UgaXMgc3BlY2lmaWVkIGluIFt1cmxdLgogICAqCiAgICogU2VlIFtvcGVuVXJsXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IHB1dFVybChVcmkgdXJsKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIERFTEVURSBtZXRob2QuCiAgICoKICAgKiBUaGUgc2VydmVyIGlzIHNwZWNpZmllZCB1c2luZyBbaG9zdF0gYW5kIFtwb3J0XSwgYW5kIHRoZSBwYXRoCiAgICogKGluY2x1ZGluZyBhIHBvc3NpYmxlIHF1ZXJ5KSBpcyBzcGVjaWZpZWQgdXNpbmcgW3BhdGhdLgogICAqCiAgICogU2VlIFtvcGVuXSBmb3IgZGV0YWlscy4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlcXVlc3Q+IGRlbGV0ZShTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIERFTEVURSBtZXRob2QuCiAgICoKICAgKiBUaGUgVVJMIHRvIHVzZSBpcyBzcGVjaWZpZWQgaW4gW3VybF0uCiAgICoKICAgKiBTZWUgW29wZW5VcmxdIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gZGVsZXRlVXJsKFVyaSB1cmwpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgUEFUQ0ggbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nIFtwYXRoXS4KICAgKgogICAqIFNlZSBbb3Blbl0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwYXRjaChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIFBBVENIIG1ldGhvZC4KICAgKgogICAqIFRoZSBVUkwgdG8gdXNlIGlzIHNwZWNpZmllZCBpbiBbdXJsXS4KICAgKgogICAqIFNlZSBbb3BlblVybF0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBwYXRjaFVybChVcmkgdXJsKTsKCiAgLyoqCiAgICogT3BlbnMgYSBIVFRQIGNvbm5lY3Rpb24gdXNpbmcgdGhlIEhFQUQgbWV0aG9kLgogICAqCiAgICogVGhlIHNlcnZlciBpcyBzcGVjaWZpZWQgdXNpbmcgW2hvc3RdIGFuZCBbcG9ydF0sIGFuZCB0aGUgcGF0aAogICAqIChpbmNsdWRpbmcgYSBwb3NzaWJsZSBxdWVyeSkgaXMgc3BlY2lmaWVkIHVzaW5nIFtwYXRoXS4KICAgKgogICAqIFNlZSBbb3Blbl0gZm9yIGRldGFpbHMuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PiBoZWFkKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHBhdGgpOwoKICAvKioKICAgKiBPcGVucyBhIEhUVFAgY29ubmVjdGlvbiB1c2luZyB0aGUgSEVBRCBtZXRob2QuCiAgICoKICAgKiBUaGUgVVJMIHRvIHVzZSBpcyBzcGVjaWZpZWQgaW4gW3VybF0uCiAgICoKICAgKiBTZWUgW29wZW5VcmxdIGZvciBkZXRhaWxzLgogICAqLwogIEZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD4gaGVhZFVybChVcmkgdXJsKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBzaXRlIGlzIHJlcXVlc3RpbmcKICAgKiBhdXRoZW50aWNhdGlvbi4gVGhlIFVSTCByZXF1ZXN0ZWQgYW5kIHRoZSBzZWN1cml0eSByZWFsbSBmcm9tIHRoZQogICAqIHNlcnZlciBhcmUgcGFzc2VkIGluIHRoZSBhcmd1bWVudHMgW3VybF0gYW5kIFtyZWFsbV0uCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIFtGdXR1cmVdIHdoaWNoIHNob3VsZCBjb21wbGV0ZSB3aGVuIHRoZQogICAqIGF1dGhlbnRpY2F0aW9uIGhhcyBiZWVuIHJlc29sdmVkLiBJZiBjcmVkZW50aWFscyBjYW5ub3QgYmUKICAgKiBwcm92aWRlZCB0aGUgW0Z1dHVyZV0gc2hvdWxkIGNvbXBsZXRlIHdpdGggWzpmYWxzZTpdLiBJZgogICAqIGNyZWRlbnRpYWxzIGFyZSBhdmFpbGFibGUgdGhlIGZ1bmN0aW9uIHNob3VsZCBhZGQgdGhlc2UgdXNpbmcKICAgKiBbYWRkQ3JlZGVudGlhbHNdIGJlZm9yZSBjb21wbGV0aW5nIHRoZSBbRnV0dXJlXSB3aXRoIHRoZSB2YWx1ZQogICAqIFs6dHJ1ZTpdLgogICAqCiAgICogSWYgdGhlIFtGdXR1cmVdIGNvbXBsZXRlcyB3aXRoIFs6dHJ1ZTpdIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmV0cmllZAogICAqIHVzaW5nIHRoZSB1cGRhdGVkIGNyZWRlbnRpYWxzLCBob3dldmVyLCB0aGUgcmV0cmllZCByZXF1ZXN0IHdpbGwgbm90CiAgICogY2FycnkgdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF5bG9hZC4gT3RoZXJ3aXNlIHJlc3BvbnNlIHByb2Nlc3Npbmcgd2lsbAogICAqIGNvbnRpbnVlIG5vcm1hbGx5LgogICAqCiAgICogSWYgaXQgaXMga25vd24gdGhhdCB0aGUgcmVtb3RlIHNlcnZlciByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiBmb3IgYWxsCiAgICogcmVxdWVzdHMsIGl0IGlzIGFkdmlzYWJsZSB0byB1c2UgW2FkZENyZWRlbnRpYWxzXSBkaXJlY3RseSwgb3IgbWFudWFsbHkKICAgKiBzZXQgdGhlIGAnYXV0aG9yaXphdGlvbidgIGhlYWRlciBvbiB0aGUgcmVxdWVzdCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAgKiBvZiBhIGZhaWxlZCByZXF1ZXN0LCBvciBpc3N1ZXMgZHVlIHRvIG1pc3NpbmcgcmVxdWVzdCBwYXlsb2FkIG9uIHJldHJpZWQKICAgKiByZXF1ZXN0LgogICAqLwogIHNldCBhdXRoZW50aWNhdGUoRnV0dXJlPGJvb2w+IGYoVXJpIHVybCwgU3RyaW5nIHNjaGVtZSwgU3RyaW5nIHJlYWxtKSk7CgogIC8qKgogICAqIEFkZCBjcmVkZW50aWFscyB0byBiZSB1c2VkIGZvciBhdXRob3JpemluZyBIVFRQIHJlcXVlc3RzLgogICAqLwogIHZvaWQgYWRkQ3JlZGVudGlhbHMoVXJpIHVybCwgU3RyaW5nIHJlYWxtLCBIdHRwQ2xpZW50Q3JlZGVudGlhbHMgY3JlZGVudGlhbHMpOwoKICAvKioKICAgKiBTZXRzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHJlc29sdmUgdGhlIHByb3h5IHNlcnZlciB0byBiZSB1c2VkIGZvcgogICAqIG9wZW5pbmcgYSBIVFRQIGNvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBbdXJsXS4gSWYgdGhpcwogICAqIGZ1bmN0aW9uIGlzIG5vdCBzZXQsIGRpcmVjdCBjb25uZWN0aW9ucyB3aWxsIGFsd2F5cyBiZSB1c2VkLgogICAqCiAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSBbZl0gbXVzdCBiZSBpbiB0aGUgZm9ybWF0IHVzZWQgYnkgYnJvd3NlcgogICAqIFBBQyAocHJveHkgYXV0by1jb25maWcpIHNjcmlwdHMuIFRoYXQgaXMgZWl0aGVyCiAgICoKICAgKiAgICAgIkRJUkVDVCIKICAgKgogICAqIGZvciB1c2luZyBhIGRpcmVjdCBjb25uZWN0aW9uIG9yCiAgICoKICAgKiAgICAgIlBST1hZIGhvc3Q6cG9ydCIKICAgKgogICAqIGZvciB1c2luZyB0aGUgcHJveHkgc2VydmVyIFs6aG9zdDpdIG9uIHBvcnQgWzpwb3J0Ol0uCiAgICoKICAgKiBBIGNvbmZpZ3VyYXRpb24gY2FuIGNvbnRhaW4gc2V2ZXJhbCBjb25maWd1cmF0aW9uIGVsZW1lbnRzCiAgICogc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMsIGUuZy4KICAgKgogICAqICAgICAiUFJPWFkgaG9zdDpwb3J0OyBQUk9YWSBob3N0Mjpwb3J0MjsgRElSRUNUIgogICAqCiAgICogVGhlIHN0YXRpYyBmdW5jdGlvbiBbZmluZFByb3h5RnJvbUVudmlyb25tZW50XSBvbiB0aGlzIGNsYXNzIGNhbgogICAqIGJlIHVzZWQgdG8gaW1wbGVtZW50IHByb3h5IHNlcnZlciByZXNvbHZpbmcgYmFzZWQgb24gZW52aXJvbm1lbnQKICAgKiB2YXJpYWJsZXMuCiAgICovCiAgc2V0IGZpbmRQcm94eShTdHJpbmcgZihVcmkgdXJsKSk7CgogIC8qKgogICAqIEZ1bmN0aW9uIGZvciByZXNvbHZpbmcgdGhlIHByb3h5IHNlcnZlciB0byBiZSB1c2VkIGZvciBhIEhUVFAKICAgKiBjb25uZWN0aW9uIGZyb20gdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIHRocm91Z2gKICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCiAgICoKICAgKiBUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgdGFrZW4gaW50byBhY2NvdW50OgogICAqCiAgICogICAgIGh0dHBfcHJveHkKICAgKiAgICAgaHR0cHNfcHJveHkKICAgKiAgICAgbm9fcHJveHkKICAgKiAgICAgSFRUUF9QUk9YWQogICAqICAgICBIVFRQU19QUk9YWQogICAqICAgICBOT19QUk9YWQogICAqCiAgICogWzpodHRwX3Byb3h5Ol0gYW5kIFs6SFRUUF9QUk9YWTpdIHNwZWNpZnkgdGhlIHByb3h5IHNlcnZlciB0byB1c2UgZm9yCiAgICogaHR0cDovLyB1cmxzLiBVc2UgdGhlIGZvcm1hdCBbOmhvc3RuYW1lOnBvcnQ6XS4gSWYgbm8gcG9ydCBpcyB1c2VkIGEKICAgKiBkZWZhdWx0IG9mIDEwODAgd2lsbCBiZSB1c2VkLiBJZiBib3RoIGFyZSBzZXQgdGhlIGxvd2VyIGNhc2Ugb25lIHRha2VzCiAgICogcHJlY2VkZW5jZS4KICAgKgogICAqIFs6aHR0cHNfcHJveHk6XSBhbmQgWzpIVFRQU19QUk9YWTpdIHNwZWNpZnkgdGhlIHByb3h5IHNlcnZlciB0byB1c2UgZm9yCiAgICogaHR0cHM6Ly8gdXJscy4gVXNlIHRoZSBmb3JtYXQgWzpob3N0bmFtZTpwb3J0Ol0uIElmIG5vIHBvcnQgaXMgdXNlZCBhCiAgICogZGVmYXVsdCBvZiAxMDgwIHdpbGwgYmUgdXNlZC4gSWYgYm90aCBhcmUgc2V0IHRoZSBsb3dlciBjYXNlIG9uZSB0YWtlcwogICAqIHByZWNlZGVuY2UuCiAgICoKICAgKiBbOm5vX3Byb3h5Ol0gYW5kIFs6Tk9fUFJPWFk6XSBzcGVjaWZ5IGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBwb3N0Zml4ZXMgb2YgaG9zdG5hbWVzIGZvciB3aGljaCBub3QgdG8gdXNlIHRoZSBwcm94eQogICAqIHNlcnZlci4gRS5nLiB0aGUgdmFsdWUgImxvY2FsaG9zdCwxMjcuMC4wLjEiIHdpbGwgbWFrZSByZXF1ZXN0cwogICAqIHRvIGJvdGggImxvY2FsaG9zdCIgYW5kICIxMjcuMC4wLjEiIG5vdCB1c2UgYSBwcm94eS4gSWYgYm90aCBhcmUgc2V0CiAgICogdGhlIGxvd2VyIGNhc2Ugb25lIHRha2VzIHByZWNlZGVuY2UuCiAgICoKICAgKiBUbyBhY3RpdmF0ZSB0aGlzIHdheSBvZiByZXNvbHZpbmcgcHJveGllcyBhc3NpZ24gdGhpcyBmdW5jdGlvbiB0bwogICAqIHRoZSBbZmluZFByb3h5XSBwcm9wZXJ0eSBvbiB0aGUgW0h0dHBDbGllbnRdLgogICAqCiAgICogICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICAgKiAgICAgY2xpZW50LmZpbmRQcm94eSA9IEh0dHBDbGllbnQuZmluZFByb3h5RnJvbUVudmlyb25tZW50OwogICAqCiAgICogSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQgeW91IGNhbiB1c2UgYQogICAqIGRpZmZlcmVudCBvbmUgYnkgd3JhcHBpbmcgdGhlIGZ1bmN0aW9uLgogICAqCiAgICogICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKICAgKiAgICAgY2xpZW50LmZpbmRQcm94eSA9ICh1cmwpIHsKICAgKiAgICAgICByZXR1cm4gSHR0cENsaWVudC5maW5kUHJveHlGcm9tRW52aXJvbm1lbnQoCiAgICogICAgICAgICAgIHVybCwgZW52aXJvbm1lbnQ6IHsiaHR0cF9wcm94eSI6IC4uLiwgIm5vX3Byb3h5IjogLi4ufSk7CiAgICogICAgIH0KICAgKgogICAqIElmIGEgcHJveHkgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gaXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlCiAgICogdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcyB3ZWxsLiBVc2UgdGhlIGZvcm1hdAogICAqIFs6dXNlcm5hbWU6cGFzc3dvcmRAaG9zdG5hbWU6cG9ydDpdIHRvIGluY2x1ZGUgdGhlIHVzZXJuYW1lIGFuZAogICAqIHBhc3N3b3JkLiBBbHRlcm5hdGl2ZWx5IHRoZSBBUEkgW2FkZFByb3h5Q3JlZGVudGlhbHNdIGNhbiBiZSB1c2VkCiAgICogdG8gc2V0IGNyZWRlbnRpYWxzIGZvciBwcm94aWVzIHdoaWNoIHJlcXVpcmUgYXV0aGVudGljYXRpb24uCiAgICovCiAgc3RhdGljIFN0cmluZyBmaW5kUHJveHlGcm9tRW52aXJvbm1lbnQoVXJpIHVybCwKICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnR9KSB7CiAgICBIdHRwT3ZlcnJpZGVzIG92ZXJyaWRlcyA9IEh0dHBPdmVycmlkZXMuY3VycmVudDsKICAgIGlmIChvdmVycmlkZXMgPT0gbnVsbCkgewogICAgICByZXR1cm4gX0h0dHBDbGllbnQuX2ZpbmRQcm94eUZyb21FbnZpcm9ubWVudCh1cmwsIGVudmlyb25tZW50KTsKICAgIH0KICAgIHJldHVybiBvdmVycmlkZXMuZmluZFByb3h5RnJvbUVudmlyb25tZW50KHVybCwgZW52aXJvbm1lbnQpOwogIH0KCiAgLyoqCiAgICogU2V0cyB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBwcm94eSBpcyByZXF1ZXN0aW5nCiAgICogYXV0aGVudGljYXRpb24uIEluZm9ybWF0aW9uIG9uIHRoZSBwcm94eSBpbiB1c2UgYW5kIHRoZSBzZWN1cml0eQogICAqIHJlYWxtIGZvciB0aGUgYXV0aGVudGljYXRpb24gYXJlIHBhc3NlZCBpbiB0aGUgYXJndW1lbnRzIFtob3N0XSwKICAgKiBbcG9ydF0gYW5kIFtyZWFsbV0uCiAgICoKICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIFtGdXR1cmVdIHdoaWNoIHNob3VsZCBjb21wbGV0ZSB3aGVuIHRoZQogICAqIGF1dGhlbnRpY2F0aW9uIGhhcyBiZWVuIHJlc29sdmVkLiBJZiBjcmVkZW50aWFscyBjYW5ub3QgYmUKICAgKiBwcm92aWRlZCB0aGUgW0Z1dHVyZV0gc2hvdWxkIGNvbXBsZXRlIHdpdGggWzpmYWxzZTpdLiBJZgogICAqIGNyZWRlbnRpYWxzIGFyZSBhdmFpbGFibGUgdGhlIGZ1bmN0aW9uIHNob3VsZCBhZGQgdGhlc2UgdXNpbmcKICAgKiBbYWRkUHJveHlDcmVkZW50aWFsc10gYmVmb3JlIGNvbXBsZXRpbmcgdGhlIFtGdXR1cmVdIHdpdGggdGhlIHZhbHVlCiAgICogWzp0cnVlOl0uCiAgICoKICAgKiBJZiB0aGUgW0Z1dHVyZV0gY29tcGxldGVzIHdpdGggWzp0cnVlOl0gdGhlIHJlcXVlc3Qgd2lsbCBiZSByZXRyaWVkCiAgICogdXNpbmcgdGhlIHVwZGF0ZWQgY3JlZGVudGlhbHMuIE90aGVyd2lzZSByZXNwb25zZSBwcm9jZXNzaW5nIHdpbGwKICAgKiBjb250aW51ZSBub3JtYWxseS4KICAgKi8KICBzZXQgYXV0aGVudGljYXRlUHJveHkoCiAgICAgIEZ1dHVyZTxib29sPiBmKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHNjaGVtZSwgU3RyaW5nIHJlYWxtKSk7CgogIC8qKgogICAqIEFkZCBjcmVkZW50aWFscyB0byBiZSB1c2VkIGZvciBhdXRob3JpemluZyBIVFRQIHByb3hpZXMuCiAgICovCiAgdm9pZCBhZGRQcm94eUNyZWRlbnRpYWxzKAogICAgICBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyByZWFsbSwgSHR0cENsaWVudENyZWRlbnRpYWxzIGNyZWRlbnRpYWxzKTsKCiAgLyoqCiAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBkZWNpZGUgd2hldGhlciB0byBhY2NlcHQgYSBzZWN1cmUgY29ubmVjdGlvbgogICAqIHdpdGggYSBzZXJ2ZXIgY2VydGlmaWNhdGUgdGhhdCBjYW5ub3QgYmUgYXV0aGVudGljYXRlZCBieSBhbnkgb2Ygb3VyCiAgICogdHJ1c3RlZCByb290IGNlcnRpZmljYXRlcy4KICAgKgogICAqIFdoZW4gYW4gc2VjdXJlIEhUVFAgcmVxdWVzdCBpZiBtYWRlLCB1c2luZyB0aGlzIEh0dHBDbGllbnQsIGFuZCB0aGUKICAgKiBzZXJ2ZXIgcmV0dXJucyBhIHNlcnZlciBjZXJ0aWZpY2F0ZSB0aGF0IGNhbm5vdCBiZSBhdXRoZW50aWNhdGVkLCB0aGUKICAgKiBjYWxsYmFjayBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgW1g1MDlDZXJ0aWZpY2F0ZV0gb2JqZWN0IGFuZAogICAqIHRoZSBzZXJ2ZXIncyBob3N0bmFtZSBhbmQgcG9ydC4gIElmIHRoZSB2YWx1ZSBvZiBbYmFkQ2VydGlmaWNhdGVDYWxsYmFja10KICAgKiBpcyBbOm51bGw6XSwgdGhlIGJhZCBjZXJ0aWZpY2F0ZSBpcyByZWplY3RlZCwgYXMgaWYgdGhlIGNhbGxiYWNrCiAgICogcmV0dXJuZWQgWzpmYWxzZTpdCiAgICoKICAgKiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLCB0aGUgc2VjdXJlIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQgYW5kIHRoZQogICAqIFs6RnV0dXJlPEh0dHBDbGllbnRSZXF1ZXN0PjpdIHRoYXQgd2FzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgbWFraW5nIHRoZQogICAqIHJlcXVlc3QgY29tcGxldGVzIHdpdGggYSB2YWxpZCBIdHRwUmVxdWVzdCBvYmplY3QuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zCiAgICogZmFsc2UsIHRoZSBbOkZ1dHVyZTxIdHRwQ2xpZW50UmVxdWVzdD46XSBjb21wbGV0ZXMgd2l0aCBhbiBleGNlcHRpb24uCiAgICoKICAgKiBJZiBhIGJhZCBjZXJ0aWZpY2F0ZSBpcyByZWNlaXZlZCBvbiBhIGNvbm5lY3Rpb24gYXR0ZW1wdCwgdGhlIGxpYnJhcnkgY2FsbHMKICAgKiB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgdGhlIHZhbHVlIG9mIGJhZENlcnRpZmljYXRlQ2FsbGJhY2sgYXQgdGhlIHRpbWUKICAgKiB0aGUgcmVxdWVzdCBpcyBtYWRlLCBldmVuIGlmIHRoZSB2YWx1ZSBvZiBiYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrCiAgICogaGFzIGNoYW5nZWQgc2luY2UgdGhlbi4KICAgKi8KICBzZXQgYmFkQ2VydGlmaWNhdGVDYWxsYmFjaygKICAgICAgYm9vbCBjYWxsYmFjayhYNTA5Q2VydGlmaWNhdGUgY2VydCwgU3RyaW5nIGhvc3QsIGludCBwb3J0KSk7CgogIC8vLyBTaHV0cyBkb3duIHRoZSBIVFRQIGNsaWVudC4KICAvLy8KICAvLy8gSWYgW2ZvcmNlXSBpcyBgZmFsc2VgICh0aGUgZGVmYXVsdCkgdGhlIFtIdHRwQ2xpZW50XSB3aWxsIGJlIGtlcHQgYWxpdmUKICAvLy8gdW50aWwgYWxsIGFjdGl2ZSBjb25uZWN0aW9ucyBhcmUgZG9uZS4gSWYgW2ZvcmNlXSBpcyBgdHJ1ZWAgYW55IGFjdGl2ZQogIC8vLyBjb25uZWN0aW9ucyB3aWxsIGJlIGNsb3NlZCB0byBpbW1lZGlhdGVseSByZWxlYXNlIGFsbCByZXNvdXJjZXMuIFRoZXNlCiAgLy8vIGNsb3NlZCBjb25uZWN0aW9ucyB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgZXZlbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2xpZW50CiAgLy8vIHdhcyBzaHV0IGRvd24uIEluIGJvdGggY2FzZXMgdHJ5aW5nIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uIGFmdGVyCiAgLy8vIGNhbGxpbmcgW2Nsb3NlXSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KICB2b2lkIGNsb3NlKHtib29sIGZvcmNlOiBmYWxzZX0pOwp9CgovKioKICogSFRUUCByZXF1ZXN0IGZvciBhIGNsaWVudCBjb25uZWN0aW9uLgogKgogKiBUbyBzZXQgdXAgYSByZXF1ZXN0LCBzZXQgdGhlIGhlYWRlcnMgdXNpbmcgdGhlIGhlYWRlcnMgcHJvcGVydHkKICogcHJvdmlkZWQgaW4gdGhpcyBjbGFzcyBhbmQgd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QuCiAqIEh0dHBDbGllbnRSZXF1ZXN0IGlzIGFuIFtJT1NpbmtdLiBVc2UgdGhlIG1ldGhvZHMgZnJvbSBJT1NpbmssCiAqIHN1Y2ggYXMgd3JpdGVDaGFyQ29kZSgpLCB0byB3cml0ZSB0aGUgYm9keSBvZiB0aGUgSFRUUAogKiByZXF1ZXN0LiBXaGVuIG9uZSBvZiB0aGUgSU9TaW5rIG1ldGhvZHMgaXMgdXNlZCBmb3IgdGhlIGZpcnN0CiAqIHRpbWUsIHRoZSByZXF1ZXN0IGhlYWRlciBpcyBzZW50LiBDYWxsaW5nIGFueSBtZXRob2RzIHRoYXQKICogY2hhbmdlIHRoZSBoZWFkZXIgYWZ0ZXIgaXQgaXMgc2VudCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogKgogKiBXaGVuIHdyaXRpbmcgc3RyaW5nIGRhdGEgdGhyb3VnaCB0aGUgW0lPU2lua10gdGhlCiAqIGVuY29kaW5nIHVzZWQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSAiY2hhcnNldCIgcGFyYW1ldGVyIG9mCiAqIHRoZSAiQ29udGVudC1UeXBlIiBoZWFkZXIuCiAqCiAqICAgICBIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0ID0gLi4uCiAqICAgICByZXF1ZXN0LmhlYWRlcnMuY29udGVudFR5cGUKICogICAgICAgICA9IG5ldyBDb250ZW50VHlwZSgiYXBwbGljYXRpb24iLCAianNvbiIsIGNoYXJzZXQ6ICJ1dGYtOCIpOwogKiAgICAgcmVxdWVzdC53cml0ZSguLi4pOyAgLy8gU3RyaW5ncyB3cml0dGVuIHdpbGwgYmUgVVRGLTggZW5jb2RlZC4KICoKICogSWYgbm8gY2hhcnNldCBpcyBwcm92aWRlZCB0aGUgZGVmYXVsdCBvZiBJU08tODg1OS0xIChMYXRpbiAxKSBpcwogKiBiZSB1c2VkLgogKgogKiAgICAgSHR0cENsaWVudFJlcXVlc3QgcmVxdWVzdCA9IC4uLgogKiAgICAgcmVxdWVzdC5oZWFkZXJzLmFkZChIdHRwSGVhZGVycy5jb250ZW50VHlwZUhlYWRlciwgInRleHQvcGxhaW4iKTsKICogICAgIHJlcXVlc3Qud3JpdGUoLi4uKTsgIC8vIFN0cmluZ3Mgd3JpdHRlbiB3aWxsIGJlIElTTy04ODU5LTEgZW5jb2RlZC4KICoKICogQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB5b3UgdXNlIGFuIHVuc3VwcG9ydGVkIGVuY29kaW5nIGFuZCB0aGUKICogYHdyaXRlKClgIG1ldGhvZCBiZWluZyB1c2VkIHRha2VzIGEgc3RyaW5nIHBhcmFtZXRlci4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBDbGllbnRSZXF1ZXN0IGltcGxlbWVudHMgSU9TaW5rIHsKICAvKioKICAgKiBHZXRzIGFuZCBzZXRzIHRoZSByZXF1ZXN0ZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN0YXRlLgogICAqCiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWzp0cnVlOl0uCiAgICovCiAgYm9vbCBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKCiAgLyoqCiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gWzp0cnVlOl0gaWYgdGhpcyByZXF1ZXN0IHNob3VsZAogICAqIGF1dG9tYXRpY2FsbHkgZm9sbG93IHJlZGlyZWN0cy4gVGhlIGRlZmF1bHQgaXMgWzp0cnVlOl0uCiAgICoKICAgKiBBdXRvbWF0aWMgcmVkaXJlY3Qgd2lsbCBvbmx5IGhhcHBlbiBmb3IgIkdFVCIgYW5kICJIRUFEIiByZXF1ZXN0cwogICAqIGFuZCBvbmx5IGZvciB0aGUgc3RhdHVzIGNvZGVzIFs6SHR0cFN0YXR1cy5tb3ZlZFBlcm1hbmVudGx5Ol0KICAgKiAoMzAxKSwgWzpIdHRwU3RhdHVzLmZvdW5kOl0gKDMwMiksCiAgICogWzpIdHRwU3RhdHVzLm1vdmVkVGVtcG9yYXJpbHk6XSAoMzAyLCBhbGlhcyBmb3IKICAgKiBbOkh0dHBTdGF0dXMuZm91bmQ6XSksIFs6SHR0cFN0YXR1cy5zZWVPdGhlcjpdICgzMDMpIGFuZAogICAqIFs6SHR0cFN0YXR1cy50ZW1wb3JhcnlSZWRpcmVjdDpdICgzMDcpLiBGb3IKICAgKiBbOkh0dHBTdGF0dXMuc2VlT3RoZXI6XSAoMzAzKSBhdXRvbWF0aWMgcmVkaXJlY3Qgd2lsbCBhbHNvIGhhcHBlbgogICAqIGZvciAiUE9TVCIgcmVxdWVzdHMgd2l0aCB0aGUgbWV0aG9kIGNoYW5nZWQgdG8gIkdFVCIgd2hlbgogICAqIGZvbGxvd2luZyB0aGUgcmVkaXJlY3QuCiAgICoKICAgKiBBbGwgaGVhZGVycyBhZGRlZCB0byB0aGUgcmVxdWVzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZWRpcmVjdGlvbgogICAqIHJlcXVlc3QocykuIEhvd2V2ZXIsIGFueSBib2R5IHNlbmQgd2l0aCB0aGUgcmVxdWVzdCB3aWxsIG5vdCBiZQogICAqIHBhcnQgb2YgdGhlIHJlZGlyZWN0aW9uIHJlcXVlc3QocykuCiAgICovCiAgYm9vbCBmb2xsb3dSZWRpcmVjdHM7CgogIC8qKgogICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHMgdG8gZm9sbG93CiAgICogd2hlbiBbZm9sbG93UmVkaXJlY3RzXSBpcyBgdHJ1ZWAuIElmIHRoaXMgbnVtYmVyIGlzIGV4Y2VlZGVkCiAgICogYW4gZXJyb3IgZXZlbnQgd2lsbCBiZSBhZGRlZCB3aXRoIGEgW1JlZGlyZWN0RXhjZXB0aW9uXS4KICAgKgogICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuCiAgICovCiAgaW50IG1heFJlZGlyZWN0czsKCiAgLyoqCiAgICogVGhlIG1ldGhvZCBvZiB0aGUgcmVxdWVzdC4KICAgKi8KICBTdHJpbmcgZ2V0IG1ldGhvZDsKCiAgLyoqCiAgICogVGhlIHVyaSBvZiB0aGUgcmVxdWVzdC4KICAgKi8KICBVcmkgZ2V0IHVyaTsKCiAgLy8vIEdldHMgYW5kIHNldHMgdGhlIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LgogIC8vLwogIC8vLyBJZiB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdCBpcyBub3Qga25vd24gaW4gYWR2YW5jZSBzZXQgY29udGVudCBsZW5ndGggdG8KICAvLy8gLTEsIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQuCiAgaW50IGNvbnRlbnRMZW5ndGg7CgogIC8qKgogICAqIEdldHMgb3Igc2V0cyBpZiB0aGUgW0h0dHBDbGllbnRSZXF1ZXN0XSBzaG91bGQgYnVmZmVyIG91dHB1dC4KICAgKgogICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLgogICAqCiAgICogX19Ob3RlX186IERpc2FibGluZyBidWZmZXJpbmcgb2YgdGhlIG91dHB1dCBjYW4gcmVzdWx0IGluIHZlcnkgcG9vcgogICAqIHBlcmZvcm1hbmNlLCB3aGVuIHdyaXRpbmcgbWFueSBzbWFsbCBjaHVua3MuCiAgICovCiAgYm9vbCBidWZmZXJPdXRwdXQ7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNsaWVudCByZXF1ZXN0IGhlYWRlcnMuCiAgICoKICAgKiBUaGUgY2xpZW50IHJlcXVlc3QgaGVhZGVycyBjYW4gYmUgbW9kaWZpZWQgdW50aWwgdGhlIGNsaWVudAogICAqIHJlcXVlc3QgYm9keSBpcyB3cml0dGVuIHRvIG9yIGNsb3NlZC4gQWZ0ZXIgdGhhdCB0aGV5IGJlY29tZQogICAqIGltbXV0YWJsZS4KICAgKi8KICBIdHRwSGVhZGVycyBnZXQgaGVhZGVyczsKCiAgLyoqCiAgICogQ29va2llcyB0byBwcmVzZW50IHRvIHRoZSBzZXJ2ZXIgKGluIHRoZSAnY29va2llJyBoZWFkZXIpLgogICAqLwogIExpc3Q8Q29va2llPiBnZXQgY29va2llczsKCiAgLy8vIEEgW0h0dHBDbGllbnRSZXNwb25zZV0gZnV0dXJlIHRoYXQgd2lsbCBjb21wbGV0ZSBvbmNlIHRoZSByZXNwb25zZSBpcwogIC8vLyBhdmFpbGFibGUuCiAgLy8vCiAgLy8vIElmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUgdGhlIHJlc3BvbnNlIGlzIGF2YWlsYWJsZSwgdGhpcyBmdXR1cmUgd2lsbAogIC8vLyBjb21wbGV0ZSB3aXRoIGFuIGVycm9yLgogIEZ1dHVyZTxIdHRwQ2xpZW50UmVzcG9uc2U+IGdldCBkb25lOwoKICAvKioKICAgKiBDbG9zZSB0aGUgcmVxdWVzdCBmb3IgaW5wdXQuIFJldHVybnMgdGhlIHZhbHVlIG9mIFtkb25lXS4KICAgKi8KICBGdXR1cmU8SHR0cENsaWVudFJlc3BvbnNlPiBjbG9zZSgpOwoKICAvLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uCiAgLy8vCiAgLy8vIFJldHVybnMgWzpudWxsOl0gaWYgdGhlIHNvY2tldCBpcyBub3QgYXZhaWxhYmxlLgogIEh0dHBDb25uZWN0aW9uSW5mbyBnZXQgY29ubmVjdGlvbkluZm87Cn0KCi8qKgogKiBIVFRQIHJlc3BvbnNlIGZvciBhIGNsaWVudCBjb25uZWN0aW9uLgogKgogKiBUaGUgYm9keSBvZiBhIFtIdHRwQ2xpZW50UmVzcG9uc2VdIG9iamVjdCBpcyBhCiAqIFtTdHJlYW1dIG9mIGRhdGEgZnJvbSB0aGUgc2VydmVyLiBMaXN0ZW4gdG8gdGhlIGJvZHkgdG8gaGFuZGxlCiAqIHRoZSBkYXRhIGFuZCBiZSBub3RpZmllZCB3aGVuIHRoZSBlbnRpcmUgYm9keSBpcyByZWNlaXZlZC4KICoKICogICAgIG5ldyBIdHRwQ2xpZW50KCkuZ2V0KCdsb2NhbGhvc3QnLCA4MCwgJy9maWxlLnR4dCcpCiAqICAgICAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSA9PiByZXF1ZXN0LmNsb3NlKCkpCiAqICAgICAgICAgIC50aGVuKChIdHRwQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKICogICAgICAgICAgICByZXNwb25zZS50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKS5saXN0ZW4oKGNvbnRlbnRzKSB7CiAqICAgICAgICAgICAgICAvLyBoYW5kbGUgZGF0YQogKiAgICAgICAgICAgIH0pOwogKiAgICAgICAgICB9KTsKICovCmFic3RyYWN0IGNsYXNzIEh0dHBDbGllbnRSZXNwb25zZSBpbXBsZW1lbnRzIFN0cmVhbTxMaXN0PGludD4+IHsKICAvKioKICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZS4KICAgKgogICAqIFRoZSBzdGF0dXMgY29kZSBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGJvZHkgaXMgd3JpdHRlbgogICAqIHRvLiBTZXR0aW5nIHRoZSBzdGF0dXMgY29kZSBhZnRlciB3cml0aW5nIHRvIHRoZSBib2R5IHdpbGwgdGhyb3cKICAgKiBhIGBTdGF0ZUVycm9yYC4KICAgKi8KICBpbnQgZ2V0IHN0YXR1c0NvZGU7CgogIC8qKgogICAqIFJldHVybnMgdGhlIHJlYXNvbiBwaHJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgY29kZS4KICAgKgogICAqIFRoZSByZWFzb24gcGhyYXNlIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYm9keSBpcyB3cml0dGVuCiAgICogdG8uIFNldHRpbmcgdGhlIHJlYXNvbiBwaHJhc2UgYWZ0ZXIgd3JpdGluZyB0byB0aGUgYm9keSB3aWxsIHRocm93CiAgICogYSBgU3RhdGVFcnJvcmAuCiAgICovCiAgU3RyaW5nIGdldCByZWFzb25QaHJhc2U7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSByZXNwb25zZSBib2R5LiBSZXR1cm5zIC0xIGlmIHRoZSBzaXplIG9mCiAgICogdGhlIHJlc3BvbnNlIGJvZHkgaXMgbm90IGtub3duIGluIGFkdmFuY2UuCiAgICoKICAgKiBJZiB0aGUgY29udGVudCBsZW5ndGggbmVlZHMgdG8gYmUgc2V0LCBpdCBtdXN0IGJlIHNldCBiZWZvcmUgdGhlCiAgICogYm9keSBpcyB3cml0dGVuIHRvLiBTZXR0aW5nIHRoZSBjb250ZW50IGxlbmd0aCBhZnRlciB3cml0aW5nIHRvIHRoZSBib2R5CiAgICogd2lsbCB0aHJvdyBhIGBTdGF0ZUVycm9yYC4KICAgKi8KICBpbnQgZ2V0IGNvbnRlbnRMZW5ndGg7CgogIC8qKgogICAqIEdldHMgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdGF0ZSByZXR1cm5lZCBieSB0aGUgc2VydmVyLgogICAqCiAgICogSWYgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdGF0ZSBuZWVkcyB0byBiZSBzZXQsIGl0IG11c3QgYmUKICAgKiBzZXQgYmVmb3JlIHRoZSBib2R5IGlzIHdyaXR0ZW4gdG8uIFNldHRpbmcgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdGF0ZQogICAqIGFmdGVyIHdyaXRpbmcgdG8gdGhlIGJvZHkgd2lsbCB0aHJvdyBhIGBTdGF0ZUVycm9yYC4KICAgKi8KICBib29sIGdldCBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKCiAgLyoqCiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzdGF0dXMgY29kZSBpcyBvbmUgb2YgdGhlIG5vcm1hbCByZWRpcmVjdAogICAqIGNvZGVzIFtIdHRwU3RhdHVzLm1vdmVkUGVybWFuZW50bHldLCBbSHR0cFN0YXR1cy5mb3VuZF0sCiAgICogW0h0dHBTdGF0dXMubW92ZWRUZW1wb3JhcmlseV0sIFtIdHRwU3RhdHVzLnNlZU90aGVyXSBhbmQKICAgKiBbSHR0cFN0YXR1cy50ZW1wb3JhcnlSZWRpcmVjdF0uCiAgICovCiAgYm9vbCBnZXQgaXNSZWRpcmVjdDsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc2VyaWVzIG9mIHJlZGlyZWN0cyB0aGlzIGNvbm5lY3Rpb24gaGFzIGJlZW4gdGhyb3VnaC4gVGhlCiAgICogbGlzdCB3aWxsIGJlIGVtcHR5IGlmIG5vIHJlZGlyZWN0cyB3ZXJlIGZvbGxvd2VkLiBbcmVkaXJlY3RzXSB3aWxsIGJlCiAgICogdXBkYXRlZCBib3RoIGluIHRoZSBjYXNlIG9mIGFuIGF1dG9tYXRpYyBhbmQgYSBtYW51YWwgcmVkaXJlY3QuCiAgICovCiAgTGlzdDxSZWRpcmVjdEluZm8+IGdldCByZWRpcmVjdHM7CgogIC8qKgogICAqIFJlZGlyZWN0cyB0aGlzIGNvbm5lY3Rpb24gdG8gYSBuZXcgVVJMLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IKICAgKiBbbWV0aG9kXSBpcyB0aGUgbWV0aG9kIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LiBUaGUgZGVmYXVsdCB2YWx1ZQogICAqIGZvciBbdXJsXSBpcyB0aGUgdmFsdWUgb2YgdGhlIFtIdHRwSGVhZGVycy5sb2NhdGlvbkhlYWRlcl0gaGVhZGVyIG9mCiAgICogdGhlIGN1cnJlbnQgcmVzcG9uc2UuIEFsbCBib2R5IGRhdGEgbXVzdCBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZQogICAqIGN1cnJlbnQgcmVzcG9uc2UgYmVmb3JlIGNhbGxpbmcgW3JlZGlyZWN0XS4KICAgKgogICAqIEFsbCBoZWFkZXJzIGFkZGVkIHRvIHRoZSByZXF1ZXN0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlZGlyZWN0aW9uCiAgICogcmVxdWVzdC4gSG93ZXZlciwgYW55IGJvZHkgc2VudCB3aXRoIHRoZSByZXF1ZXN0IHdpbGwgbm90IGJlCiAgICogcGFydCBvZiB0aGUgcmVkaXJlY3Rpb24gcmVxdWVzdC4KICAgKgogICAqIElmIFtmb2xsb3dMb29wc10gaXMgc2V0IHRvIFs6dHJ1ZTpdLCByZWRpcmVjdCB3aWxsIGZvbGxvdyB0aGUgcmVkaXJlY3QsCiAgICogZXZlbiBpZiB0aGUgVVJMIHdhcyBhbHJlYWR5IHZpc2l0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFs6ZmFsc2U6XS4KICAgKgogICAqIFRoZSBtZXRob2Qgd2lsbCBpZ25vcmUgW0h0dHBDbGllbnRSZXF1ZXN0Lm1heFJlZGlyZWN0c10KICAgKiBhbmQgd2lsbCBhbHdheXMgcGVyZm9ybSB0aGUgcmVkaXJlY3QuCiAgICovCiAgRnV0dXJlPEh0dHBDbGllbnRSZXNwb25zZT4gcmVkaXJlY3QoCiAgICAgIFtTdHJpbmcgbWV0aG9kLCBVcmkgdXJsLCBib29sIGZvbGxvd0xvb3BzXSk7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNsaWVudCByZXNwb25zZSBoZWFkZXJzLgogICAqCiAgICogVGhlIGNsaWVudCByZXNwb25zZSBoZWFkZXJzIGFyZSBpbW11dGFibGUuCiAgICovCiAgSHR0cEhlYWRlcnMgZ2V0IGhlYWRlcnM7CgogIC8qKgogICAqIERldGFjaCB0aGUgdW5kZXJseWluZyBzb2NrZXQgZnJvbSB0aGUgSFRUUCBjbGllbnQuIFdoZW4gdGhlCiAgICogc29ja2V0IGlzIGRldGFjaGVkIHRoZSBIVFRQIGNsaWVudCB3aWxsIG5vIGxvbmdlciBwZXJmb3JtIGFueQogICAqIG9wZXJhdGlvbnMgb24gaXQuCiAgICoKICAgKiBUaGlzIGlzIG5vcm1hbGx5IHVzZWQgd2hlbiBhIEhUVFAgdXBncmFkZSBpcyBuZWdvdGlhdGVkIGFuZCB0aGUKICAgKiBjb21tdW5pY2F0aW9uIHNob3VsZCBjb250aW51ZSB3aXRoIGEgZGlmZmVyZW50IHByb3RvY29sLgogICAqLwogIEZ1dHVyZTxTb2NrZXQ+IGRldGFjaFNvY2tldCgpOwoKICAvKioKICAgKiBDb29raWVzIHNldCBieSB0aGUgc2VydmVyIChmcm9tIHRoZSAnc2V0LWNvb2tpZScgaGVhZGVyKS4KICAgKi8KICBMaXN0PENvb2tpZT4gZ2V0IGNvb2tpZXM7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNlcnRpZmljYXRlIG9mIHRoZSBIVFRQUyBzZXJ2ZXIgcHJvdmlkaW5nIHRoZSByZXNwb25zZS4KICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGEgc2VjdXJlIFRMUyBvciBTU0wgY29ubmVjdGlvbi4KICAgKi8KICBYNTA5Q2VydGlmaWNhdGUgZ2V0IGNlcnRpZmljYXRlOwoKICAvKioKICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbGllbnQgY29ubmVjdGlvbi4gUmV0dXJucyBbOm51bGw6XSBpZiB0aGUgc29ja2V0CiAgICogaXMgbm90IGF2YWlsYWJsZS4KICAgKi8KICBIdHRwQ29ubmVjdGlvbkluZm8gZ2V0IGNvbm5lY3Rpb25JbmZvOwp9CgphYnN0cmFjdCBjbGFzcyBIdHRwQ2xpZW50Q3JlZGVudGlhbHMge30KCi8qKgogKiBSZXByZXNlbnRzIGNyZWRlbnRpYWxzIGZvciBiYXNpYyBhdXRoZW50aWNhdGlvbi4KICovCmFic3RyYWN0IGNsYXNzIEh0dHBDbGllbnRCYXNpY0NyZWRlbnRpYWxzIGV4dGVuZHMgSHR0cENsaWVudENyZWRlbnRpYWxzIHsKICBmYWN0b3J5IEh0dHBDbGllbnRCYXNpY0NyZWRlbnRpYWxzKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSA9PgogICAgICBuZXcgX0h0dHBDbGllbnRCYXNpY0NyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCk7Cn0KCi8qKgogKiBSZXByZXNlbnRzIGNyZWRlbnRpYWxzIGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24uIERpZ2VzdAogKiBhdXRoZW50aWNhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igc2VydmVycyB1c2luZyB0aGUgTUQ1CiAqIGFsZ29yaXRobSBhbmQgcXVhbGl0eSBvZiBwcm90ZWN0aW9uIChxb3ApIG9mIGVpdGhlciAibm9uZSIgb3IKICogImF1dGgiLgogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cENsaWVudERpZ2VzdENyZWRlbnRpYWxzIGV4dGVuZHMgSHR0cENsaWVudENyZWRlbnRpYWxzIHsKICBmYWN0b3J5IEh0dHBDbGllbnREaWdlc3RDcmVkZW50aWFscyhTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgPT4KICAgICAgbmV3IF9IdHRwQ2xpZW50RGlnZXN0Q3JlZGVudGlhbHModXNlcm5hbWUsIHBhc3N3b3JkKTsKfQoKLyoqCiAqIEluZm9ybWF0aW9uIGFib3V0IGFuIFtIdHRwUmVxdWVzdF0sIFtIdHRwUmVzcG9uc2VdLCBbSHR0cENsaWVudFJlcXVlc3RdLCBvcgogKiBbSHR0cENsaWVudFJlc3BvbnNlXSBjb25uZWN0aW9uLgogKi8KYWJzdHJhY3QgY2xhc3MgSHR0cENvbm5lY3Rpb25JbmZvIHsKICBJbnRlcm5ldEFkZHJlc3MgZ2V0IHJlbW90ZUFkZHJlc3M7CiAgaW50IGdldCByZW1vdGVQb3J0OwogIGludCBnZXQgbG9jYWxQb3J0Owp9CgovKioKICogUmVkaXJlY3QgaW5mb3JtYXRpb24uCiAqLwphYnN0cmFjdCBjbGFzcyBSZWRpcmVjdEluZm8gewogIC8qKgogICAqIFJldHVybnMgdGhlIHN0YXR1cyBjb2RlIHVzZWQgZm9yIHRoZSByZWRpcmVjdC4KICAgKi8KICBpbnQgZ2V0IHN0YXR1c0NvZGU7CgogIC8qKgogICAqIFJldHVybnMgdGhlIG1ldGhvZCB1c2VkIGZvciB0aGUgcmVkaXJlY3QuCiAgICovCiAgU3RyaW5nIGdldCBtZXRob2Q7CgogIC8qKgogICAqIFJldHVybnMgdGhlIGxvY2F0aW9uIGZvciB0aGUgcmVkaXJlY3QuCiAgICovCiAgVXJpIGdldCBsb2NhdGlvbjsKfQoKLyoqCiAqIFdoZW4gZGV0YWNoaW5nIGEgc29ja2V0IGZyb20gZWl0aGVyIHRoZSBbOkh0dHBTZXJ2ZXI6XSBvciB0aGUKICogWzpIdHRwQ2xpZW50Ol0gZHVlIHRvIGEgSFRUUCBjb25uZWN0aW9uIHVwZ3JhZGUgdGhlcmUgbWlnaHQgYmUKICogdW5wYXJzZWQgZGF0YSBhbHJlYWR5IHJlYWQgZnJvbSB0aGUgc29ja2V0LiBUaGlzIHVucGFyc2VkIGRhdGEKICogdG9nZXRoZXIgd2l0aCB0aGUgZGV0YWNoZWQgc29ja2V0IGlzIHJldHVybmVkIGluIGFuIGluc3RhbmNlIG9mCiAqIHRoaXMgY2xhc3MuCiAqLwphYnN0cmFjdCBjbGFzcyBEZXRhY2hlZFNvY2tldCB7CiAgU29ja2V0IGdldCBzb2NrZXQ7CiAgTGlzdDxpbnQ+IGdldCB1bnBhcnNlZERhdGE7Cn0KCmNsYXNzIEh0dHBFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbiB7CiAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CiAgZmluYWwgVXJpIHVyaTsKCiAgY29uc3QgSHR0cEV4Y2VwdGlvbih0aGlzLm1lc3NhZ2UsIHt0aGlzLnVyaX0pOwoKICBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICB2YXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKS4ud3JpdGUoJ0h0dHBFeGNlcHRpb246ICcpLi53cml0ZShtZXNzYWdlKTsKICAgIGlmICh1cmkgIT0gbnVsbCkgewogICAgICBiLndyaXRlKCcsIHVyaSA9ICR1cmknKTsKICAgIH0KICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CiAgfQp9CgpjbGFzcyBSZWRpcmVjdEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEh0dHBFeGNlcHRpb24gewogIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogIGZpbmFsIExpc3Q8UmVkaXJlY3RJbmZvPiByZWRpcmVjdHM7CgogIGNvbnN0IFJlZGlyZWN0RXhjZXB0aW9uKHRoaXMubWVzc2FnZSwgdGhpcy5yZWRpcmVjdHMpOwoKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiUmVkaXJlY3RFeGNlcHRpb246ICRtZXNzYWdlIjsKCiAgVXJpIGdldCB1cmkgPT4gcmVkaXJlY3RzLmxhc3QubG9jYXRpb247Cn0KiFEATk48ARQBFRkJEREPExQZHRciMBQSGgEUFxoXGRoXFxwBBE8DSjhMREUjSEMvAxkDEBQwHjU6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i7eDwYxdg8GMXoPBjF+DwYG1g8E/g8GCTIO/i+qDyIu3g8mMYIPJjGGDyIIXg7+LtoPNi7eDzoxig86CMYPNggaDzYFlg82CB4PNgjiDzYI0g82CN4PNjD+Dv4vrg9gABIxjg9qL0IPbi7eD3ITKg9yMZIPcjGWD3IG1g9yBh4PcgiaD2ovqg+OL94Pji7eD5Yxmg9qLtoPnggWD54u3g+mCQ4PpgmuD6Yxng+mMaIPpjGmD2ovrg+8ABIxqg/GL0IPyi7eD84xBg/GLtoP1ggaD9YFlg/WCB4P1gjiD9YI0g/WCN4P1jD+D8Yvqg/2CF4Pxi+uD/wAEjGuEAYvQhAKLt4QDgiaEA4xshAOCWoQBi+qEB4HshAGLtoQJgweECYu3hAuMbYQLgkuEC4G7hAuCTIQJgjeEAYvrhBEABIxuhBOL6oQUi/eEE4u2hBaCBYQTi+uEGAAEjG+EGovQhBuLt4QchMqEGovqhB6L94Qai7aEIIIFhCCLt4Qigj+EIoxwhCKMcYQijHKEGovrhCcABIxzhCmL0IQqi7eEK4xBhCuCJoQpi7aELou3hC+Bn4QvgaCEL4JEhC+CRYQvgkOEL4xwhC+McYQvjHKEKYvrhDgABIx0hDqL0IQ7i7eEPIx1hDqLtoQ+i7eEP4xwhDqL64RBAASMdoRDi9CERIu3hEWMd4RDi7aER4u3hEiMcIRDi+uESgAEjHiETIvQhE2Lt4ROjHmETIu2hFCLt4RRjHCETIvrhFMABIx6hFWL0IRWi7eEV4x3hFeMdYRVi7aEWou3hFuMcYRVi+uEXQAEjHuEX4vQhGCLt4RhjHyEX4u2hGOLt4Rkgj+EZIxwhF+L64RnAASMfYRpi9CEaou3hGuMfoRpi+qEbYu3hG6Mf4RujHyEboRVhGmMAIRyi7eEc4x/hHOMfIRzhFWEaYvrhHcABIyAhHmL0IR6i7eEe4x1hHmLtoR9i7eEfoxwhHmL64SAAASMgYSCi9CEg4u3hISMfISCi7aEhou3hIeCP4SHjHCEgovrhIoABIyChIyL0ISNi7eEjox1hIyLtoSQi7eEkYI/hJGMcISMi+uElAAEjIOElovQhJeLt4SYjISEmIL2hJaLtoSbi7eEnII/hJyMcISWi+uEnwAEjIWEoYvQhKKLt4SjhCGEoYu2hKWA44SlgY+EpYIahKGL64SpAASMhoSri9CErIu3hK2Mh4StgiaEq4vqhLCLt4SxjIiEq4u2hLOLt4S0gZ+EtIGghLSCPYS0gkSEtIJFhLSCQ4S0jHCEtIxxhLSMcoSri+uEvgAEjImEwIvQhMGLt4TCjIqEwIu2hMSMRITAi+uExgAEjIuEyIvQhMmLt4TKjIqEyoxBhMiL6oTNi/eEyIu2hM+CBYTIi+uE0QAEjIyE04vQhNSLt4TVjHCE1YxxhNWMcoTVhCGE04vqhNqLt4TbglaE04u2hN2A44TdgY+E3YIahNOL64ThAASMjYTji7aE5IxEhOOL64TmAASMjoToi9CE6Yu3hOqMj4Toi7aE7IxEhOiL64TuAASMkITwi9CE8Yu3hPKCa4Twi7aE9IxEhPCL64T2AASMkYT4i9CE+Yu3hPqCa4T6jEGE+Iu2hP2CBYT4i+uE/wAEgnuFAYwJhQIAhQKFRoUBi7aFBYHHhQWCN4UFi7eFCIVAhQiMkoUBi+qFC4yThQuMlASCfIUOi9CFD4FKhQ+BkIUOi7aFEoJ9hQ6L6oUUjJWFFYD6hQ6MAIUXjJWFGID6hQ6L64UaAASCfoUci9CFHYFehR2Cf4Uci+uFIAAEjJaFIovQhSOLt4UkjCSFIowJhSYAhSaDdIUii+qFKYH2hSmBx4UpgcGFKYHFhSmB3IUpgdiFKYJShSmBkoUpgeWFKYyXhSmMmIUpi5yFKYyZBIyahTeL0IU4gfaFOIHHhTiBwYU4gcWFOIHchTiB2IU4glKFOIGShTiB5YU4jJeFOIyYhTiLnIU4jJmFN4vrhUYABIKAhUiLtoVJgfaFSYHHhUmBwYVJgcWFSYHchUmB2IVJglKFSYGShUmB5YVJjJeFSYyYhUmLnIVJjJmFSIvrhVcABIKBhVmL0IVajJuFWou3hVyCgoVZi+qFXoHshV6BXYVegoOFWYu2hWKB9oVigfmFYoyZhWKBx4VigcGFYoHFhWKCZ4VigmKFYoJlhWKB3IVigdiFYoJShWKCiIVijJyFYoydhWKCiYVigoqFYoyehWKBkoVigeWFYoyXhWKMmIVii5yFYou3hXqCi4V6goyFYoKNhVmL64V+i7eFf4C3BIyfhYGL0IWCi7eFg4yghYGLtoWFgfaFhYHHhYWBwYWFgcWFhYHchYWB2IWFglKFhYGShYWB5YWFjJeFhYyYhYWLnIWFjJmFgYvrhZMABIKPhZWL6oWWi7eFl4yhhZeMooWXjKOFl4ykhZeMpYWXjKaFl4ynhZeCkIWXhUCFl4yShZeGXYWXjKiFl4yphZeMqoWXgv6FloFdhZWLtoWogfmFlYvrhaoABIyrhayL0IWti7eFroyhha6MooWujKOFroykha6MpYWujKaFroynha6CkIWuhUCFroySha6GXYWujKiFroypha6MrIWugv6FrYFdhayL6oW/i7eFwIyqhb+Cg4Wsi7aFw4JnhcOCYoXDgmWFw4KIhcOMnIXDjJ2Fw4KJhcOCioXDjJ6Fw4KNhcOB9oXDjJmFw4HHhcOBwYXDgcWFw4HchcOB2IXDglKFw4GShcOB5YXDjJeFw4yYhcOLnIWsi+uF2wAEgpGF3YvQhd6Lt4XfjK2F34yuhd2L6oXii7eF44yhheOMooXjjKOF44ykheOMpYXjjKaF44ynheOCkIXjhUCF44ySheOGXYXjjKiF44ypheOC/oXjjKqF4oFdheKCg4Xdi7aF9YJnhfWCYoX1gmWF9YKIhfWMnIX1jJ2F9YKJhfWCioX1jJ6F9YKNhfWB9oX1jJmF9YHHhfWBwYX1gcWF9YHchfWB2IX1glKF9YGShfWB5YX1jJeF9YyYhfWLnIXdi+uGDQAAjK+GD4u4hhCC04YQgteGEILYhg+L0IYUjK+GFYywhhWDooYPi7aGGIyvhhkJhhmDpIYZg6WGGYOmhhmDp4YZjLGGGYyyhg+C2YYhi9CGIoyvhiOMs4YjgtuGI4LchiOC3YYhi+qGKIIJhiiCT4Yog4qGKINHhiiC3oYhi7aGLoLfhi6C44Yugo2GLoLlhi6MtIYujLWGLoLnhi6C6YYujFmGLoyvhjiC6oY4guaGOILwhjiMtoYhi+uGPQCGD4L1hj+L0IZAjK+GQYL2hkGC94ZBgviGP4u2hkWC34ZFgo2GRYLlhkWMtIZFgumGRYyvhkuMtoY/i+uGTQCGD4L7hk+LtoZQgt+GUIKNhlCC5YZQjLSGUILphlCMr4ZWjLaGT4vrhlgAhg+C/IZai9CGW4KOhluA/4ZbgkCGW4GKhlqL64ZgAIYPgv2GYovQhmOMr4Zkgv6GYovqhmaCCYZmgk+GZoOKhmKL64ZqAIYPjLeGbIvqhm2DAYZsi7aGb4MChm+C54ZvjDaGbIvrhnMAhg+C/4Z1i+qGdoMBhnWLtoZ4gwKGeILnhnWL64Z7AIYPgwOGfYvQhn6Mr4Z/gv6Gf4MEhn+DBYZ/gwaGfYu2hoSDB4Z9i+uGhgCGD4y4hoiL6oaJgeyGiIvrhosAhg+DCIaNi+qGjoHsho2L64aQAIYPjLmGkovQhpOMr4aUjLOGlILchpSC24aUgt2Gkou2hpmMr4aagvaGmoL3hpqMuoaajLuGmoy8hpqC5oaagvCGmoy9hpqMvoaZgwKGmYy/hpmA44aZjLWGmYLphpmMwIaZjMGGmYzChpmMWYaSi+qGrYMBhq2CCYatgk+GrYOKhq2Dfoatg2yGkovrhrQAhg+Mw4a2i7aGt4yvhriC94a4gvaGuIy9hriMvoa2i+uGvQCGD4zEhr+L0IbAjK+GwYNXhsGDWIbBgviGv4u2hsWC6YbFgwKGxYy/hsWMxYbFjMCGxYyvhsuC9obLgveGy4y9hsuMvoa/i+uG0ACGD4zGhtKL0IbTgo6G04JAhtOBiobSi7aG14LphtKL64bZAIYPjMeG24vQhtyMr4bdjMiG3YLdht2DBYbdgW+G3YKChtuLtobjgweG24vqhuWB7Ibbi+uG5wCGD4MJhumL0IbqjK+G64MFhuuDCobrgwuG64MMhuuDDYbpi+uG8QCGD4MPhvOL6ob0jK+G9YMFhvWDCob1gwuG9YMMhvWDDYbzjACG+4yvhvyDBYb8gwqG/IMLhvyDDIb8gw2G84vrhwIAhg+DHocEi9CHBYyvhwaMyYcGjMqHBozLhwaMzIcEi7aHC4yvhwyDH4cMgyOHDIMqhwyDLIcMgy2HDIzNhwyDMIcEi+qHFIyvhxWDL4cUggmHBIvrhxgAhg+DM4cai7aHG4yvhxyC94ccgvaHGovrhx8Ahg+DNIchi7aHIoyvhyOC94cjgvaHIYvrhyYAhg+DNYcoi+uHKQCHKIvqhyuDR4crjM6HK4IJhyuCT4crg4qHK4LehyiLtocygo2HMoLlhzKC6YcyjFmHMow1hzKC54cyjLWHMoLjhzKMtIcyjM+HMozQhzKDAIcyjNGHMozBhzKC34cygn2GD4M2h0OL64dEAIdDi7aHRoyvh0eC94dHgvaHR4Mwh0eDN4dHgziHR4M6h0eDPIdHgz6HR4NEh0aMWYdGguWHRoy0h0aC6YdGgt+HRoKNh0aC44dGgueHQ4vqh1mMr4dagy+HWYIJh1mC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ieuMwonrjFmJ64w1ieuDbYnrjPKJ64zzieuM9InrgguJ64Q+ieuM9YnrjPaJ64ONieuFI4nrg9iJ64l1ieuM94nriXeJ64z4ieuM+YnrjPqJ64z7ieuM/Inrgn2J4owAiiGDfoohg2yJ4ovriiQAhg+DlIomi7aKJ4OViieMr4ophTyKKYz9iimM/oomi+uKLQCGD4Obii+L6oowg0eKMIzOijCCCYowgk+KMIOKijCC3oovi7aKN4KNijeC5Yo3gumKN4xZijeMNYo3gueKN4y1ijeC44o3jLSKN4zPijeM0Io3gwCKN4zRijeMwYo3gt+KN4J9ii+L64pIAIYPh5eKSovriksAikqLtopNguWKTYy1ik2M0YpNjFmKTYLpik2MwYpNjLSKTYzPik2M0IYPjP+KV4vQiliMr4pZgv6KV4vqiluCCYpbgk+KW4OKiluDfopbjD6KW4NsiluDAYpXi+uKYwCGD40AimWL0IpmjK+KZ40BimeC/opngoKKZYu2imuDB4pli+qKbYHsimWL64pvAIYPg5yKcYu2inKC5YpyjLWKcozRinKMWYpygumKcozBinKMtIpyjM+KcozQinGL64p8AIYPg52KfovQin+Mr4qAgv6Kfou2ioKMNYqCgo2KgoLlioKMtYqCjFmKgoy0ioKC34qCguOKgoLnioKC6YqCgn2KgozRioKDAIqCjM+KgozQioKMwYp+i+qKk4JPipODioqTggmKk4NHipOC3oqTjM6KfovripoAhg+Dnoqci+uKnQCKnIu2ip+C5YqfjLWKn4zRip+MWYqfgumKn4zBip+MtIqfjM+Kn4zQhg+DoIqpi7aKqow1iqmL64qsAIYPhpuKrovQiq+Mr4qwjCSKrowJirIAirKDdIqyjOGKrou2iraMKoq2jDWKtoUfiraDbYq2g3mKto0CiraA44q2gumKtoy1iraMwYq2jMKKtoxZhg+NA4rDi9CKxIyvisWNBIrFjQWKw4u2isiMr4rJjQaKyYN9isOL64rMAIYPjQeKzovQis+IHIrOi7aK0Y0IitGNCYrRgumK0Y0KitGNC4rOi+uK1wCGD40MitmL0IrajK+K240NitmLtordjK+K3o0Oit6ND4rejRCK3oy7it2NC4rdjQqK2YvqiuWMr4rmjRGK2YvriugAhg+NEorqi7aK640IiuuNCYrrjK+K7oy7iu6NDorrgumK6ovrivIAhg+NE4r0i7aK9YyvivaNDor2jLuK9IvqivmMr4r6jRGK9IvrivwAhg+NFIr+i9CK/4yviwCNFYsAgtuK/owJiwODdIsDjOGK/ou2iwaMNYsGjQKLBoN5iwaA44sGjLWLBoNtiwaFH4sGgumLBoyviw+M8IsGjMGLBozCiwaNFosGjReLBoxZiwaNGIsGgn2K/ovqixiCCYsYg36LGINsixiMPosYgk+LGIMBiv6L64sfAIYPjRmLIYvQiyKMr4sjjRWLI40aiyOCgoshi7aLJ4MHiyGL6ospgeyLIYvriysAhg+GnIsti9CLLoyviy+Ms4svg1uLL40biy+NHIsvgt2LLYwJizWDdIs1jOGLLYu2iziMNYs4gueLOIOJiziEwYs4gOOLOIy1iziC6Ys4jK+LQIy8i0CNHYtAjR6LQI0fi0CBn4tAjLuLQIgOi0CNIItAjSGLOIzBiziMwos4jFmLOIJ9iziNAos4g3mLOIUfiziDbYsti+qLUoMBi1KCT4tSggmLUoN+i1KDbItSjD6LLYvri1kAhg+NIotbi9CLXIyvi12NDYtdiU2LXYLdi12GCItdgoKLW4vqi2OB7Itbi7aLZYMHi1uL64tnAIYPjSOLaYu2i2qA44tqgwKLaoy/i2qC6YtqjDaLaow1i2qM1YtqjNaLaoxZi2qMtYtqjMCLaozXi2qMwYtqjMKLaozFi2qM2ItqjNmLaozai2qEwYtqgwCLaoJ9i2qMLItqjC+LaoLni2qMMotqjDOLaow0i2qEuItqjAyLaoOMi2qMOItqg4uLaow5i2qMO4tqjDyLaow9i2qDiYtpi+qLkIMBi5CCCYuQgk+LkIOKi5CMPouQg36LkINsi2mL64uYAIYPjSSLmovri5sAi5qLtoudgOOLnYMCi52Mv4udgumLnYw2i52MNYudjNWLnYzWi52MWYudjLWLnYzAi52M14udjMGLnYzCi52MxYudjNiLnYzZi52M2oudhMGLnYMAi52CfYudjCyLnYwvi52C54udjDKLnYwzi52MNIudhLiLnYwMi52DjIudjDiLnYOLi52MOYudjDuLnYw8i52MPYudg4mLmovqi8ODAYvDggmLw4JPi8ODiovDjD6Lw4N+i8ODbIYPjSWLy4u2i8yNJovLi+uLzgCGD40ni9CLtovRjK+L0oy9i9KMvovRjDWL0Yzai9GM2YvRjDaL0YzVi9GM1ovRjFmL0Yy1i9GMwIvRjNeL0YzBi9GMwovRjMWL0YzYi9GEwYvRgwCL0YJ9i9GMLIvRjC+L0YLni9GMMovRjDOL0Yw0i9GEuIvRjAyL0YOMi9GMOIvRg4uL0Yw5i9GMO4vRjDyL0Yw9i9GDiYvQi+qL9oJPi/aDiov2jD6L9oN+i/aDbIvQi+uL/ACGD40oi/6L0Iv/jK+MAIL+i/6LtowCjK+MA4y9jAOMvowCgwKMAoy/jAKA44wCjFmMAoy1jAKMwIwCjNeMAozBjAKMwowCgumL/ovqjBCDAYwQggmL/ovrjBMAhg+NKYwVi9CMFoKOjBaNKowWjSuMFYvrjBoAhg+NLIwci9CMHYD/jByL64wfAIYPjS2MIYvQjCKMr4wjjHyMI4LdjCONLowhi+qMJ4yvjCiNL4wojTCMKI0xjCiC+Iwog3iMKI0yjCGMAIwvjK+MMI0vjCGLtowyjK+MM40zjDONNIwzjTWMM402jDOMu4wzjTeMM404jCGL64w7AIYPg6GMPYu2jD6C+ow9i+uMQACGD405jEKL64xDAIxCi+qMRYNHjEWMzoxFggmMRYJPjEWDioxFgt6MQou2jEyCjYxMguWMTILpjEyMWYxMjDWMTILnjEyMtYxMguOMTIy0jEyMz4xMjNCMTIMAjEyM0YxMjMGMTILfjEyCfYYPjTqMXYvQjF6Mr4xfjS+MX40wjF+NMYxfgviMXYwJjGSDdIxkjOGMZIwojGSM4oxdi7aMaYyvjGqNM4xpgo2MaYLpjGmC5YxpjLSMaYy1jGmC54xpjFmMaYLfjGmC44xpjTuMaYqkjGmNPIxpjT2MXYvqjHmCT4x5g4qMeYIJjHmDR4x5gt6MXYvrjH8AjH+Mr4yBhT6GD40+jIOL0IyEjK+MhY0/jIWNQIyFgt2MhY0ujIWNQYyDi+qMi4HsjIOLtoyNjK+Mjo1CjI6NQ4yOjUSMjYMHjIOL64yTAIyTjUWGD41GjJaL0IyXjK+MmI0/jJaL6oyaggmMmoJPjJqDAYyWi7aMnow2jJaL64ygAIYPjUeMoovQjKOMr4ykgv6MoovqjKaCCYymgk+MpoMBjKKL64yqAIYPjUiMrIu2jK2Mr4yujUSMrIvrjLAAhg+NSYyyi7aMs4yvjLSNRIyyi+uMtgCGD41KjLiLtoy5jK+Muo1EjLiL64y8AIy8jUWGD41LjL+L64zAAIy/i7aMwow1jMKDAIzCjCyMwozWjMKML4zCjNWMwoMCjMKC54zCjDKMwowzjMKMNIzChLiMwowMjMKEwYzCjDaMwoOMjMKMOIzCg4uMwow5jMKMO4zCjDyMwow9jMKDiYzCgn2Mv4vqjNuCCYzbgk+M24OKjNuDfozbg2yM24w+hg+NTIzii+uM4wCM4ou2jOWA44zlgwKM5Yy/jOWC6YzljDaM5Yw1jOWM1YzljNaM5YxZjOWMtYzljMCM5YzXjOWMwYzljMKM5YzFjOWM2IzljNmM5YzajOWEwYzlgwCM5YJ9jOWMLIzljC+M5YLnjOWMMozljDOM5Yw0jOWEuIzljAyM5YOMjOWMOIzlg4uM5Yw5jOWMO4zljDyM5Yw9jOWDiYzii+qNC4MBjQuCCY0Lgk+NC4OKjQuMPo0Lg36NC4Nshg+NTY0Ti9CNFIyvjRWNL40VjTCNFY0xjRWC+I0TjAmNGoN0jRqM4Y0Ti7aNHYyvjR6MvY0ejTONHo1OjR6NT40djDWNHYMCjR2A440dgumNHYy1jR2MwI0djNeNHYy/jR2M2Y0djNqNHYzYjR2MWY0djDaNHYJ9jROL6o0xgwGNMYIJjTGCT40xg4qNMYN+jTGDbI0xjD6NE4vrjTkAAI1QjTuL0I08h5iNPI1QjT6NUY0+jVKNPo1TjT6NVI0+jVWNPo1WjT6NV40+jViNPo1ZjT6NWo0+jVuNPo1cjT6NXY08h52NPI1ejTyNX408h5mNPIeajTyNYI08jWGNPIaYjTuLto1UjVCNVY1ijVWNY41VhGWNVYRnjVWEaI1VhGmNVYRsjVSNZI1UjWWNVI1mjVSNZ41UjWiNO41pjWKL0I1jjVCNZIP3jWSEMo1ii7aNZ4PojWeNao1ii+uNagCNO41rjWyLto1tjWyNbY1tjW2Nbo1tjW+NbY1wjW2NcY1tjXKNbY1zjW2NdI1tjXWNbY12jWyL6o15gbONbIvrjXsAjTuNd419i9CNfo14jX6NeY1+go6NfoD/jX2Lto2DjXqNg417jYONbI2DjW2Ng41ujYONb42DjXCNg41xjYONco2DjXONg410jYONdY2DjXaNfYvqjZGBs419i+uNkwCNO418jZWL0I2WjX2NlYu2jZiNdY2YjXKNlYvqjZuBs42Vi+uNnQCNO41+jZ+L0I2gjX+NoI2AjaCDgI2gggmNn4vqjaWIBY2fi7aNp41QjaiNgY2njYKNp42DjaeNhI2njYWNn4vrja4AjTuNho2wi9CNsY2HjbGNiI2xjYmNsY2KjbGNi42xjYyNsY2NjbGNjo2xjY+NsY2QjbGNkY2xjZKNsY2TjbGNlI2xjZWNsY2WjbGNl42xjZiNsY2ZjbGNmo2xjZuNsY2cjbGNnY2xjZ6NsY2fjbGNoI2xjaGNsY2ijbGNo42xjaSNsY2ljbGNpo2xjaeNsY2ojbGNqY2xjaqNsY2rjbGNrI2xja2NsY2ujbGNr42xjbCNsY2xjbGNso2xjbONsY20jbGNtY2xjbaNsY23jbGNuI2xjbmNsY26jbGNu42xjbyNsY29jbGNvo2xjb+NsY3AjbGNwY2xjcKNsY3DjbGNxI2xjcWNsY3GjbGNx42xjciNsY3JjbGNyo2xjcuNsY3MjbGNzY2xjc6NsY3PjbGN0I2xjdGNsY3SjbGN042xjdSNsY3VjbGN1o2xjdeNsYHkjbGBtI2xjdiNsY3ZjbGDco2wi7aOCI3ajgiN244IghqOCI3cjgiN3Y4Ijd6OCI3fjgiN4I4IjeGOCI2DjgiNhI4IjYWOCI3ijgiN444IjeSOCI3ljgiN5o4IioqOCI3njgiN6I4IjemOCI3qjgiN644IjeyOCI3tjgiN7o4Ije+OCI3wjgiN8Y4IjfKOCI3zjgiN9I4IjfWNsIvqjiqBs44qjfaOKo33jbCMAI4ujfeNsIvrjjAAjTuN+I4yi9COM433jjON9o4yi7aONo3cjjaNg442jd6ONo3gjjaN3442jeGONo3djjaNhY4yi+uOPwCNO435jkGL0I5CjVCOQ436jkOD945DhCGOQYu2jkeNUI5IjfuOR438jkeA445HghqOR439jkGL645OAI07jf6OUIvQjlGN/45RjgCOUY4BjlGOAo5RjgOOUY29jlGOBI5RjgWOUY4GjlGOB45RjgiOUY4JjlGOCo5RjguOUY4MjlGODY5Rjg6OUY4PjlGOEI5RjhGOUYNyjlGCCY5RjdmOUYq4jlGENY5Qi7aOa44SjmuOE45rjVCObo4Ujm6IDo5rjfyOa4J9jlCL645zAI07jhWOdYvQjnaENY52jfeOdo32jnWLto56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NKIQjAyiEIw7ohCMPKIQjD2iEIOJohCA46IQjLWiEIz5ohCM+6IQjPKiEIl1ohCJd6IQg22iEIz6ohCMwaIQjMKiEIQ+ohCM/KIQg42iBIwAoj6DfqI+g2ybzVWiQYu2okKCjaJCguWiQpELokWFpKJCg9iiQYvqokiFmqJBi+uiSgCbzZEvokyL66JNAKJMi+qiT4Waok+Fm6JPg3KiT4zuok+DAaJPg36iT4Nsok+MPqJMi7aiWJELolmFpKJYjNaiWIzVoliMNaJYjPeiWIz4oliCC6JYgwKiWIzzoliFI6JYjCyiWIOMoliMOKJYg4uiWIw5oliM9KJYjPWiWITBoliMNqJYgueiWIwyoliMM6JYgwCiWIwvoliMNKJYjAyiWIw7oliMPKJYjD2iWIOJoliA46JYjLWiWIz5oliM+6JYjPKiWIl1oliJd6JYg22iWIz6oliMwaJYjMKiWIQ+oliM/KJYg42iTIwAooaDfqKGg2ybzVaiiYu2ooqCjaKKguWiipELoo2FpKKNheiijYXpooqD2KKJi+qikoWaoomL66KUAJvNkTCilovropcAopaL6qKZhZqimYWbopmDcqKZjO6imYMBopmDfqKZg2yimYw+opaLtqKikQuio4WkoqKM1qKijNWioow1oqKM96KijPiiooILoqKDAqKijPOiooUjoqKMLKKig4yioow4oqKDi6KijDmiooz0oqKM9aKihMGioow2oqKC56KijDKioowzoqKDAKKijC+ioow0oqKMDKKijDuioow8oqKMPaKig4miooDjoqKMtaKijPmiooz7oqKM8qKiiXWiool3oqKDbaKijPqioozBoqKMwqKihD6iooz8oqKDjaKWjACi0IN+otCDbJvNV6LTi7ai1IKNotSC5aLUkQui14WkoteF66LXheyi1IPYotOL6qLchZqi04vrot4Am82RMaLgi+ui4QCi4IvqouOFmqLjhZui44NyouOM7qLjgwGi44N+ouODbKLjjD6i4Iu2ouyRC6LthaSi7IzWouyM1aLsjDWi7Iz3ouyM+KLsggui7IMCouyM86LshSOi7IwsouyDjKLsjDii7IOLouyMOaLsjPSi7Iz1ouyEwaLsjDai7ILnouyMMqLsjDOi7IMAouyML6LsjDSi7IwMouyMO6LsjDyi7Iw9ouyDiaLsgOOi7Iy1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g4wvpoOMNKaDjAymg4w7poOMPKaDjD2mg4OJpoOA46aDjLWmg4z5poOM+6aDjPKmg4l1poOJd6aDg22mg4z6poOMwaaDjMKmg4Q+poOM/KaDg42md4wAprGDfqaxg2ybzWamtIwJprUAprSLtqa3go2mt4LlpreRC6a6haSmt4PYprSL6qa9hZqbzZFYpr+L66bAAKa/i+qmwoWapsKFm6bCg3KmwozupsKDAabCg36mwoNspsKMPqa/i7amy5ELpsyFpKbLjNamy4zVpsuMNabLjPemy4z4psuCC6bLgwKmy4zzpsuFI6bLjCymy4OMpsuMOKbLg4umy4w5psuM9KbLjPWmy4TBpsuMNqbLguemy4wypsuMM6bLgwCmy4wvpsuMNKbLjAymy4w7psuMPKbLjD2my4OJpsuA46bLjLWmy4z5psuM+6bLjPKmy4l1psuJd6bLg22my4z6psuMwabLjMKmy4Q+psuM/KbLg42mv4wApvmDfqb5g2ybzWem/IwJpv0ApvyLtqb/go2m/4Llpv+FI6b/kQunA4Wkpv+D2Kb8i+qnBoWam82RWacIi+unCQCnCIvqpwuFmqcLhZunC4NypwuM7qcLgwGnC4N+pwuDbKcLjD6nCIu2pxSRC6cVhaSnFIzWpxSM1acUjDWnFIz3pxSM+KcUggunFIMCpxSM86cUhSOnFIwspxSDjKcUjDinFIOLpxSMOacUjPSnFIz1pxSEwacUjDanFILnpxSMMqcUjDOnFIMApxSML6cUjDSnFIwMpxSMO6cUjDynFIw9pxSDiacUgOOnFIy1pxSM+acUjPunFIzypxSJdacUiXenFINtpxSM+qcUjMGnFIzCpxSEPqcUjPynFIONpwiMAKdCg36nQoNsm81op0WMCadGAKdFi7anSIKNp0iC5adIhSOnSJELp0yFpKdIg9inRYvqp0+FmpvNkVqnUYvrp1IAp1GL6qdUhZqnVIWbp1SDcqdUjO6nVIMBp1SDfqdUg2ynVIw+p1GLtqddkQunXoWkp12M1qddjNWnXYw1p12M96ddjPinXYILp12DAqddjPOnXYUjp12MLKddg4ynXYw4p12Di6ddjDmnXYz0p12M9addhMGnXYw2p12C56ddjDKnXYwzp12DAKddjC+nXYw0p12MDKddjDunXYw8p12MPaddg4mnXYDjp12Mtadd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1aqykdaqspHXqrKR2KqykdmqspHaqrKR26qykdyqspHdqrKR3qqykd+qspHgqrKR4aqykeKqspHjqrKR5KqykeWqspHmqrKR56qykeiqspHpqrKR6qqykeuqspHsqrKR7aqyke6qspHvqrKR8KqykfGqspHyqrKR86qykfSqspH1qrKR9qqykfeqspH4qrKR+aqykfqqspH7qrKR/Kqykf2qspH+qrKR/6qykgCqspIBqrKSAqqykgOqspIEqrKSBaqykgaqspIHqrKSCKqykgmqspIKqrKSC6qykgyqspINqrKSDqqykg+qspIQqrKSEaqykhKqspITqrKSFKqykhWqspIWqrKSF6qykhiqspIZqrKSGqqykhuqspIcqrKSHaqykh6qspIfqrKSIKqykiGqspIiqrKSI6qykiSqspIlqrKSJqqykieqspIoqrKSKaqykiqqspIrqrKSLKqyki2qspIuqrKSL6qykjCqspIxqrKSMqqykjOqspI0qrKSNaqykjaqspI3qrKSOKqykjmqspI6qrKSO6qykjyqspI9qrKSPqqykj+qspJAqrKSQaqykkKqspJDqrKSRKqykkWqspJGqrKSR6qykkiqspJJqrKSSqqykkuqspJMqrKSTaqykk6qspJPqrKSUKqyklGqspJSqrKSU6qyklSqspJVqrKSVqqykleqspJYqrKSWaqyklqqspJbqrKSXKqykl2qspJeqrKSX6qykmCqspJhqrKSYqqykmOqspJkqrKSZaqykmaqspJnqrKSaKqykmmqspJqqrKSa6qykmyqspJtqrKSbqqykm+qspJwqrKScaqyknKqspJzqrKSdKqyknWqspJ2qrKSd6qykniqsYwJq7MAq7OSeauzknqrs5J7q7OSfKqxi7aruYILq7mDQau5guKruYMpq7mGaau5kTqruZE7q7mRPKu5kT2ruZE+q7mRP6u5kUCruZFBq7mRQqu5jPOruZFDq7mRRKu5kUWruZFGq7mRR6u5hYKruYV4q7mQAKu5kUiruZFJqrGL6qvTgpir05AQq9ORSqvTkUur05FMm82GOavZi9Cr2pF5q9qReqvakXur2pF8q9qRfavakX6r2pF/q9qRgKvakYGr2pGCq9qRg6vakYSr2pGFq9qRhqvakYer2pGIq9qRiavakYqr2pGLq9qRjKvakY2r2pGOq9qRj6vakZCr2pGRq9qRkqvakZOr2pGUq9qRlavakZar2pGXq9qRmKvakZmr2pGaq9qRm6vakZyr2pGdq9qRnqvakZ+r2pGgq9qRoavakaKr2pGjq9qRpKvakaWr2pGmq9qRp6vakair2pGpq9qRqqvakaur2pGsq9qRravaka6r2pGvq9qRsKvakbGr2pGyq9qRs6vakbSr2pG1q9qRtqvakber2pG4q9qRuavakbqr2pG7q9qRvKvakb2r2pG+q9qRv6vakcCr2pHBq9qRwqvakcOr2pHEq9qRxavakcar2pHHq9qRyKvakcmr2pHKq9qRy6vakcyr2pHNq9qRzqvakc+r2pHQq9qR0avakdKr2pHTq9qR1KvakdWr2pHWq9qR16vakdir2pHZq9qR2qvakdur2pHcq9qR3avakd6r2pHfq9qR4KvakeGr2pHiq9qR46vakeSr2pHlq9qR5qvakeer2pHoq9qR6avakeqr2pHrq9qR7Kvake2r2pHuq9qR76vakfCr2pHxq9qR8qvakfOr2pH0q9qR9avakfar2pH3q9qR+Kvakfmr2pH6q9qR+6vakfyr2pH9q9qR/qvakf+r2pIAq9qSAavakgKr2pIDq9qSBKvakgWr2pIGq9qSB6vakgir2pIJq9qSCqvakgur2pIMq9qSDavakg6r2pIPq9qSEKvakhGr2pISq9qSE6vakhSr2pIVq9qSFqvakher2pIYq9qSGavakhqr2pIbq9qSHKvakh2r2pIeq9qSH6vakiCr2pIhq9qSIqvakiOr2pIkq9qSJavakiar2pInq9qSKKvakimr2pIqq9qSK6vakiyr2pItq9qSLqvaki+r2pIwq9qSMavakjKr2pIzq9qSNKvakjWr2pI2q9qSN6vakjir2pI5q9qSOqvakjur2pI8q9qSPavakj6r2pI/q9qSQKvakkGr2pJCq9qSQ6vakkSr2pJFq9qSRqvakker2pJIq9qSSavakkqr2pJLq9qSTKvakk2r2pJOq9qST6vaklCr2pJRq9qSUqvaklOr2pJUq9qSVavaklar2pJXq9qSWKvaklmr2pJaq9qSW6vaklyr2pJdq9qSXqvakl+r2pJgq9qSYavakmKr2pJjq9qSZKvakmWr2pJmq9qSZ6vakmir2pJpq9qSaqvakmur2pJsq9qSbavakm6r2pJvq9qScKvaknGr2pJyq9qSc6vaknSr2pJ1q9qSdqvakner2pJ4q9mMCazbAKzbgPms25J9q9mLtqzfgZms34F9rN+BmKzfggus34LirN+M86zfkUOs35FErN+RRazfkUas35FHrN+RTazfkU6s35FPrN+RUKzfkVGr2YvqrPCCmKzwkBCs8JFKrPCRS6zwkUys8JFSrPCRU6zwkVSs8JFVm82GOqz6jAms+wCs+5J5rPuSeqz7kn6s+ou2rQCCC60Ag0GtAILirQCDKa0AhmmtAJFArQCRQa0AkUKtAJFErQCRRa0AhYKtAIV4rQCQAKz6i+qtDoKYrQ6QEK0OkUybzZJ/rRKL0K0TkQutFIMLrRKL6q0WhZ+tEou2rRiFqq0YkRWtGJEWrRiRGK0YkRetGJEarRiRGa0YkRytGJEbrRiRIK0YkR2tGJEerRiRH60YkSGtGJEUrRKL660oAJvNkoCtKovQrSuRC60sgwutKou2rS6RX60ukWCtLpFhrS6RYq0ukWOtLpFkrS6RZa0ukWatLpFnrS6RaK0ukWmtLpFqrS6Ra60ukWytLpFtrS6Rbq0ukW+tLpFwrS6Rca0ukXKtLpELrUOSga0qi+qtRYWarUWFm61FhZ+tRYNyrSqL661KAJvNkoKtTIvqrU2RC61Og3ytToMLrU2CCa1NhZqtTYWbrU2Fn61Ng3KtTIu2rVaCja1Mi+utWACbzZKDrVqL661bAK1ai+qtXZELrV6DfK1egwutXYIJrV2Fmq1dhZutXYWfrV2Dcq1ai7atZoKNm82ShK1oi9CtaZELrWqDfK1oi+utbACbzZKFrW6L661vAK1ui+qtcZELrXKDfK1ygwutcYIJrXGFmq1xhZutcYWfrXGDcq1ui7ateoKNm82Shq18i9CtfZELrX6DfK18i+utgACbzZKHrYKL662DAK2Ci+qthZELrYaDfK2GgwuthYIJrYWFmq2FhZuthYWfrYWDcq2Ci7atjoKNm82SiK2Qi9CtkZELrZKDfK2Qi+utlACbzZKJrZaL662XAK2Wi+qtmZELrZqDfK2agwutmYIJrZmFmq2ZhZutmYWfrZmDcq2Wi7atooKNm82Siq2ki9CtpZELraaDfK2ki+utqACbzZKLraqL662rAK2qi+qtrZELra6DfK2ugwutrYIJra2Fmq2thZutrYWfra2Dcq2qi7attoKNm82SjK24i9CtuZELrbqDfK24i+utvACbzZKNrb6L662/AK2+i+qtwZELrcKDfK3CgwutwYIJrcGFmq3BhZutwYWfrcGDcq2+i7atyoKNm82Sjq3Mi9CtzZELrc6DfK3Mi+ut0ACbzZKPrdKL663TAK3Si+qt1ZELrdaDfK3Wgwut1YIJrdWFmq3VhZut1YWfrdWDcq3Si7at3oKNm82SkK3gi9Ct4ZELreKDfK3gi+ut5ACbzZKRreaL663nAK3mi+qt6ZELreqDfK3qgwut6YIJremFmq3phZut6YWfremDcq3mi7at8oKNm82Skq30i9Ct9ZELrfaDfK30i+ut+ACbzZKTrfqL6637AK36i+qt/ZELrf6DfK3+gwut/YIJrf2Fmq39hZut/YWfrf2Dcq36i7auBoKNm82SlK4Ii9CuCZELrgqDfK4Ii+uuDACbzZKVrg6L664PAK4Oi+quEZELrhKDfK4SgwuuEYIJrhGFmq4RhZuuEYWfrhGDcq4Oi7auGoKNm82Slq4ci9CuHZELrh6DfK4ci+uuIACbzZKXriKL664jAK4ii+quJZELriaDfK4mgwuuJYIJriWFmq4lhZuuJYWfriWDcq4ii7auLoKNm82SmK4wi9CuMZELrjKDfK4wi+uuNACbzZKZrjaL6643AK42i+quOZELrjqDfK46gwuuOYIJrjmFmq45hZuuOYWfrjmDcq42i7auQoKNm82Smq5Ei9CuRZELrkaDfK5Ei+uuSACbzZKbrkqL665LAK5Ki+quTZELrk6DfK5OgwuuTYIJrk2Fmq5NhZuuTYWfrk2Dcq5Ki7auVoKNm82SnK5Yi9CuWZELrlqDfK5Yi+uuXACbzZKdrl6L665fAK5ei+quYZELrmKDfK5igwuuYYIJrmGFmq5hhZuuYYWfrmGDcq5ei7auaoKNm82Snq5si9CubZELrm6DfK5si+uucAAAkp+ucovQrnOSn650da50d650ea50e650fa50f650gIGudICDrnSSoK50kqGudICFrnSAh650kqKudI1UrnSNVa50kqOudJKkrnSSpa50kqaudJKnrnSSqK50kqmudJKqrnSSq650kqyudJKtrnSSrq50kq+udJKwrnSSsa50krKudJKzrnOStK5zkrWuc5K2rnKLtq6Ykp+umYZkrpmGaq6ZhmuumYZirpmSt66ZkriumZK5rpmSuq6ZkruumZK8rpmSva6Zkr6umZK/rpmSwK6ZksGumZLCrpmSw66ZksSumZLFrpmSxq6ZkseumZLIrpmSya6ZksqumJLLrpiSzK6Yks2umJLOrpiSz66YktCumJLRrpiS0q6YktOumJLUrpiS1a6YgRuucpLWrr6L0K6/gp6uv4Zgrr+G066+i7auw4Nwrr6L667FAK5ykteux4vQrsiS2K7IktmuyJLarseLtq7MktuuzJKfrs6S3K7Okt2ux4vrrtEArnKS3q7Ti9Cu1JLfrtSGX67UhmCu1JLgrtSS4a7Ti+uu2gCucpLirtyL0K7dkuOu3ZKfrt+S5K7fhleu34ZYrt+S5a7fhlmu35Lmrt+S567fkuiu35Lprt+S6q7fkuuu3ZLfrt2S7K7ci7au7ZLtru2S7q7tku+u7ZLwru2S8a7tkp+u84CMrvOS8q7zkvOu85L0rvOS9a7zkvau3IvqrvqSn677kveu+pL4rtyL667+AK5ykvmvAIvQrwGS+q8BkvuvAZL8rwGS/a8BhtKvAIu2rweS/q8Hkv+vB5MArweEZq8Ai+uvDACucpMBrw6L0K8PkwKvD4dBrw6Ltq8Skv6vEpMArxKEZq8Oi+uvFgCucpMDrxiL0K8ZkwSvGZMFrxmSn68ckwavHHevHHWvHH2vHHuvHJMHrxiL6q8jkwivI5MJrxiLtq8mkp+vJ5MKryeTC68nkwyvJ5MNryaTDq8mku+vJpMPrxiL668vAACTEK8xi7ivMpMRrzKTEq8ykxOvMpMUrzKTFa8ykxavMpMXrzKTGK8ykxmvMpMarzKTG68ykxyvMpMdrzGL0K9AhlSvQJMer0CTH69AkyCvQJMhr0CTIq9AkyOvQI7Gr0CTJK9AjsevQJMlr0CTJq9AkyevQJMor0CTKa9AkyqvQJMrr0CTLK9Aky2vQJMur0CTL69AkzCvQJMxr0CTMq9AkzOvQJM0r0CTEK9bkzWvW5M2r0CTN68xi7avX5MQr2CTOK9gkzmvYJM6r2CTO69gkzyvYJM9r2CTPq9gkz+vYJNAr2CTQa9gk0KvYJNDr1+TRK9fk0WvX5NGr1+TR69fk0ivX5NJr1+TSq9fk0uvX5NMr1+Aia9fk02vMYvqr3iTTq8xk0+veou2r3uS7696i+uvfQCvMZNQr3+L0K+Ak1Gv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lFSyLZRVsi2UVrItlFeyLZRYsi2UWbItlFqyLZRbsi2UXLItlF2yLZResi2UX7ItlGCyLZRhsi2UYrItlGOyLZRksi2UZbItlGayLZRnsi2UaLItlGmyLZRqsi2Ua7ItlGyyLZRtsi2UbrItlG+yLZRwsi2UcbItlHKyLZRzsi2UdLItlHWyLZR2si2T27JTlHeyU5R4si2BfLItht+yLYbgsi2G4bIthuKyLYbjsi2G5LIthuWyLYbmsi2G57IthuiyLYbpsi2G6rIthuuyLYbssi2G7bIthu6yLYbvsi2G8LIthvGyLYbysi2G87Isi7aybIy/smyUebJslHqybJR7smyUfLJsk9uycpR9snKO1LJsjESybJR+smyUf7JshtSybJSAsmyDcLJsN7JslIGybIb/smyHAbJshwOybIcJsmyHDLJshw+ybIIasmyTD7JslIKybJSDsmyHC7JshxKybIcHsmyUhLJslIWybIb7smyUhrJslIeybJSIsmyUibJslIqybJSLsmyUjLJslI2ybIcGsmyG+rJslI6ybJSPsmyUkLJslJGybJSSsmyUk7JslJSybJSVsmyUlrJslJeybJSYsmyUmbJshwiybJSasmyUm7JslJyybJSdsmyUnrJslJ+yLIvqsqqG9LKqhvWyqob2sqqG97KqlKCyqpShsqqT27KxlE+ysZRQsqqFbbKqlKKyqoSMsqqUo7Isi+uyuJSksriUpbK4ggWyuIwwsriT27K9lKayuJSnsriUqLDmlKmywYvQssKT27LDhxmyw4GHssOUqrLDlKuywYu2ssiMRLLIggWyyIIassiT27LMhyGyzIcgssyHHbLMhx6ywYvqstGFbbLRhIyywYwAstST27LVkHaywYvrstcAsOaHGLLZi9Cy2pPbstuHGbLbgYey24castuHG7Lbhxyy2Yu2suGUfLLhlHuy4YIFsuGG6rLhhtSy4YNwsuGCGrLhkw+y4ZSHsuGUiLLhlImy4ZPbsu2HIbLthyCy7Ycesu2HHbLZjAmy8pPbsvOUrLLzlK2y2YvqsvaFbbL2lKKy9oSMsvaUo7L2lK6y9ocfstmMALL9lK6y/Ycfsv2T27MAkHay2YvrswIAsOaUr7MEi9CzBZPbswaHGbMEi7azCIxEswiCBbMIghqzBIvqswyFbbMMhIyzBIwAsw+T27MQkHazBIvrsxIAsOaUsLMUi9CzFYGGsxWG0rMVhAezFYNysxWUsbMVlLKzFIu2sxyL9LMcghqzHINwsxyL/7MclLOzFIvrsyIAsOaUtLMki9CzJZPbsyaUtbMmlLazJoGHsyaUt7MmlLizJoQhsyaCJrMmlLmzJIwJsy+T27MwlKyzMJStsySL6rMzk9uzNJS6szOK37Mzi/+zM4VtszOEjLMzlKKzM5SjsySLtrM8ggWzPINwszyKA7M8g9KzPINuszyA47M8gY+zPIv0szyEUbM8ghqzPJS7szyUh7M8lIizPJSJszyT27NLlLyzS5S9s0uUvrNLhx2zS4ces0uCS7NLgkyzS4G7s0uUv7NLlMCzS5TBs0uUwrMkjACzWIrfs1iT27NakHazJIvrs1wAsOaUw7Nei9CzX5Pbs2CHGbNggYezYIcas2CHG7Nei7azZYxEs2WCBbNlghqzZTezZZSAs2WUi7NllIyzZZPbs22HIbNthyCzbYces22HHbNllIizZZSJs16L6rN0lK6zdIcfs3SUxLN0lMWzdJTGs3SUx7N0hW2zdISMs16MALN9lK6zfYcfs32UxLN9lMWzfZTGs32Ux7Nei+uzhACw5pTIs4aL6rOHk9uziJS1s4eUybOHlMqzhou2s4yUy7OGi+uzjgCw5oCas5CL0LORgJuzkYCds5GAn7OQi7azlZR8s5WUu7OVk9uzmJTMs5iUzbOVlM6zlZTPs5WU0LOVlMqzlZTLs5WS7bOVlNGzlZTSs5CL6rOjlMmzkIvrs6UAsOaU07Oni9CzqJTUs6eLtrOqk9uzq5TVs6uU1rOrlNezqpTYs6qU2bOqlNqzqpTbs6qU3LOqlN2zqpTes6qU37OqlOCzp4vrs7gAsOaHI7O6i9Czu5Pbs7yHJLO8hyWzvIcms7qL6rPAk9uzwZThs8GU4rPBlOOzwJTks8CU5bPAlOazwJTns8CU6LPAlOmzwJTqs7qLtrPMk9uzzZTrs82U7LO6i+uz0ACw5pTts9KL0LPTk9uz1IcZs9KLtrPWlO6z1obqs9aU77PWlPCz1pTxs9aTD7PWlPKz0ovqs96EjLPehW2z3pSjs96UorPSi+uz4wCw5pTzs+WL67PmALDmlPSz6IvQs+mBfLPphuCz6Ybis+mG6bPphuiz6Ybys+iLtrPwlO6z8JTvs/CUhbPwjL+z8JTw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tZ+L6rW+hmW1n4vrtcAAsOaArrXCi9C1w4UFtcOGZbXDhzy1wou2tceCfbXCi+u1yQCw5pWStcuL0LXMk9u1zYGHtc2HMLXNlZO1zYYItc2JTbXNlZS1zZWVtc2VlrXNlLa1zZWXtcuLtrXYggW12JPbtdqVmLXalZm12pWatdqEu7XLi+u13wC135WbsOaVnLXii9C145PbteSVnbXklZ614ou2teeL9LXnghq14ovrteoAteqVn7Dmhz+17YvQte6T27XvhzC174cxte2L6rXyhmW18pU8te2LtrX1k9u19obMtfaHQLX2lUm19oDNtfaVoLX2laG19pVNtfaVSrX2laK19pVOtfaVS7X2laO19pWktfaVpbX2laa19pWntfaVqLX2lam19o78tfaVqrX2lau19pWstfWVULX1lVG19ZU9tfWVPrX1lUO19ZVEtfWEqbX1lXC19Y8ItfWCCbX1lXG19ZVytfWVc7X1lXS19ZV1tfWVdrX1lXe19ZV4tfWVebX1lXq19ZV7tfWVfLX1lX219ZV+tfWVf7X1lYC19ZWBtfWVgrX1lYO19ZWEtfWVhbX1lYa19YJ9tfWVrbXti+u2LwC2L4CjsOaHRLYyjAm2MwC2Mou2tjWUC7Y1ghq2NZQMtjWG1LY1lA22NY6ItjWUDrY1iuG2NZQPtjWUELY1ggm2NYRRtjWUEbDmla62Q4vQtkST27ZFla+2RZWwtkWVsbZFlCa2RZVhtkSGZbZElbK2RIcNtkOLtrZOk9u2T5Wztk+VtLZPlbW2T5TNtk+HYbZPlPW2ToIatk6U77ZOlAy2TpWItk6G1LZOlPG2TpQNtk6U8LZOjoi2TpWJtk6UDrZOlPK2ToP/tk6VirZOiuG2TpWLtk6UD7ZOlYy2TpQQtk6VjbZOggm2TpVxtk6EUbZOlY62TpQRtk6VkLZOlY+2TpWRtkOL67ZyALDmlba2dIvQtnWK1bZ1lbe2dYsStnWVuLZ1lbm2dZW6tnWPLLZ1j2a2dZPbtn6Vu7Z+iSG2dIu2toGT27aClby2gYJ9tnSL67aFk9u2hoU+sOaVvbaIi9C2iZPbtoqJIbaKlb62ipW/toqVwLaKlCi2ipXBtoqVwraJlcO2iZXEtomVxbaJhtm2iY5mtomDJraIi7a2mJPbtpmVxraZlce2mZXItpiVybaYlcq2mIJ9tpiVy7aIi+u2oZPbtqKFPrailcyw5odFtqWL0Lamk9u2p4cwtqeHMbanlc22p5XOtqWL6rashmW2rIZgtqyVz7aslTy2rJPbtrGV0LaxldG2rJXStqyBXbali7a2tpVQtraVUba2lUO2tpVEtraVQba2lUK2tpXKtraVyba2ldO2tpXUtraUqLa2k9u2wpVNtsKVTrbCldW2wpXWtsKHRrbCh0e2wodJtsKV17bCldi2wpXZtsKV2rbCldu2wpXctsKV3bbCld62wpXftsKV4LbCleG2wpXitraLmra2leO2tobZtraV5La2leW2tosMtraV5ra2lee2tpXotraV6ba2leq2pYvrtuEAsOaV67bji9C25JU9tuSV7Lbkle225JXutuSV07bkle+25JXwtuSV8bbklfK25JXztuST27bvlfS275X1tu+V9rbkhtm25IZltuSV5rbji+u29pPbtveAt7Dmlfe2+Yu2tvqCfbb5i+u2/JPbtv2At7Dmlfi2/4vQtwCV+bb/i7a3AoJ9tv+L67cEk9u3BYC3sOaV+rcHi7a3CIJ9tweL67cKk9u3C4C3sOaV+7cNi9C3DpX8tw2LtrcQgn23DYvrtxKT27cTgLew5pX9txWL0LcWk9u3F4U8txeUFbcXhzC3F5X+txeV/7cXlgC3F5YBtxWLtrcfk9u3IJQZtyCGz7cggl63IJQWtyCUF7cglBi3IJYCtyCWA7cglgS3IJYFtyCWBrcglge3IJYItyCWCbcglgq3IJYLtxWL6rcxk9u3MoxBtzGWDLcVi+u3NZPbtzaAt7Dmh0u3OIvQtzmG2bc5gZe3OZPbtzyMfLc8lg23PJYOtziL6rdAhLO3QJYPt0CWELdAh0y3OIu2t0WWEbc4i+u3RwCw5odNt0mL0LdKhv23SpYSt0qWE7dKlhS3SpYVt0qWFrdJi7a3UZYXt1GG/rdRlhi3SYvqt1WWELdJi+u3VwCw5pYZt1mL0Ldak9u3W4kht1qK1bdalhq3WYu2t1+WG7dflhy3X5Ydt1+WHrdflh+3X5Ygt1mL6rdmhLO3WYvrt2gAsOaWIbdqi9C3a5Pbt2yJIbdrlB23a5Yit2uWI7dqi+q3cYSzt3GWELdqi7a3dJYkt3SWJbd0lia3dJYnt3SWKLd0lim3aovrt3sAsOaHTrd9i9C3fpPbt3+WKrd/liu3f4kht36G0rd+h0+3fYvqt4WEs7d9i7a3h4dQt4eHUbeHh1K3h4dVt4eWLLeHh1e3fYvrt44AsOaWLbeQi9C3kYrft5CMCbeTALeQi7a3lYDjt5WDcLeVg263lYoDt5WD0reVgY+3lYv0t5WEUbeVghq3kIvqt5+L/7Dmli63oYvQt6KT27ejjEu3o5Yvt6OWMLejljG3o4JWt6OWMrejgdS3oYu2t6uA47ergY+3q4v0t6uEUberghq3q5Pbt7GWM7exljS3sZY1t6GL6re1i/+3tZPbt7eBh7ehi+u3uQCw5pY2t7uL0Le8k9u3vZY3t72WOLe7i+q3wIrft7uMALfCit+3u4u2t8SDcLfEg263xIoDt8SD0re7i+u3yQCw5odZt8uL0LfMk9u3zYdat82FNLfNh1u3zYdct82FPLfMljm3zJY6t8yWO7fMljy3zJY9t8yWPrfMlj+3zJZAt8yWQbfMlkK3zJZDt8yWRLfMlkW3zJZGt8yWR7fMlki3zJZJt8yWSrfMlku3zJZMt8yWTbfMlk63zJZPt8yWULfMllG3zJZSt8yWU7fMllS3zJZVt8yWVrfMlle3zJZYt8yWWbfMllq3zJZbt8yWXLfMll23zJZet8yWX7fMlmC3zJZht8yWYrfMlmO3y4u2t/6T27f/h123/4det/+HX7f/h2G3y4vruAQAsOaAr7gGjAm4BwC4B4CjuAeTwrgGi7a4C5U9uAuVPrgLlmS4C4zPuAuVQbgLlUK4C5VDuAuVRLgLge+4C5ZluAaL6rgWlTyw5odkuBiL0LgZk9u4GocwuBqHMbgYi+q4HYZluB2VPLgYi7a4IIJ9uCCVULgglVG4IJU9uCCVPrgglmS4IIzPuCCT27golU24KJVOuCiHiLgoh4m4IJVDuCCVRLggge+4IJZluCCVrbgYi+u4MgC4MoCjsOaAsLg1i+q4NpPbuDeGy7g3hsy4NYu2uDqT27g7gLG4NYvruD0AsOaHZrg/i9C4QJPbuEGHZ7g/i+q4Q4HsuD+MALhFlma4P4u2uEeL6bhHlme4R4cuuEeWaLhHlmm4R5ZquEeHO7hHlcq4R5XJuEeWa7hHlmy4R5ZtuEeWbrhHlm+4R5ZwuEeHY7hHlnG4R5ZyuD+L67haALDmlnO4XIvQuF2T27hegXC4XpZ0uF6Wdbhelna4XpZ3uF6WeLhelci4XpXGuF6Webhelnq4XpZ7uF6WfLheln24XpZ+uF6VoLheln+4XpaAuFyLtrhwhy64cJZouHCWabhwlmq4cIc7uHCVyrhwlcm4cJZruHCWbLhwlm24cJZuuHCWb7hwlnC4cIdjuHCWcbhwlnK4XIvruIEAsOaWgbiDi9C4hJPbuIWWgriFloO4hZaEuIWWhbiFloa4hZaHuISWiLiElom4hJaKuISWi7iEloy4hJaNuIOL6riSlo64kpaPuJKWkLiSlpG4kpaSuJKWk7iSlpS4kpaVuJKWlriSlpe4kpaYuJKGcLiSj9+4koS1uIOL67ihALDmgLK4o4vQuKSWlbiklpa4pIZwuKSP37ikk9u4qYC0uKmWmbiplpq4o4wAuK2T27iugLO4o4u2uLCT27ixloK4sZaDuLGWhLixloW4sZaGuLGWm7ixlpy4sZQnuLGWnbixhlm4sZLmuLGWh7ixlp64sZafuLCWkLiji+q4wZaOuMGWj7jBlpG4wZaXuMGWkrjBlpO4wZaYuMGWlLjBhLW4o4vruMsAsOaWoLjNi9C4zpPbuM+C/rjNi7a40YLfuNGC47jRgo240YLluNGMtLjRjLW40YLpuNGMWbjRgue40YMAuNGMz7jRjNC40YzBuNGCfbjNi+q44INHuOCC3rjgggm44IJPuOCDirjgjM64zYvruOcAsOaHa7jpi7a46pPbuOuWobjrh2y465NruOuWorjrlqO465akuOuWpbjrlqa46YvruPQAsOaWp7j2i7a495PbuPiWqLj4lqm49ovquPuWqrj7lqu49ovruP4AsOaWrLkAi9C5AZSluQGWrbkBlq65AZavuQGWsLkBlrG5AZayuQGWs7kBk9u5CpQouQCL6rkMgt65AIu2uQ6CfbkAi+u5EJPbuRGFPrDmlrS5E4vquRSUB7kUh465FIePuRSHjbkUlAi5E4u2uRqAu7kagce5Gpa1uRqWtrkaj9q5E4vruSAAsOaWt7kii9C5I5QHuSOHjrkjh4+5I5QIuSKL67koALDmh225KovQuSuWuLkrlrm5K5a6uSuWu7krlry5K5a9uSuWvrkrlr+5K5bAuSuWwbkrlsK5K5bDuSuWxLkrlsW5K5bGuSuWx7krlsi5K5bJuSuWyrkrlsu5K5bMuSuWzbkrls65K5bPuSuW0LkrltG5K5bSuSuW07krltS5K5bVuSuW1rkrlte5K5bYuSuW2bkrltq5K5bbuSuW3Lkrlt25K5beuSuW37krluC5K5bhuSuW4rkrluO5K5bkuSuW5bkrlua5K5bnuSuW6Lkrlum5K5bquSuW67krluy5K5btuSuW7rkrlu+5K5bwuSuW8bkrk9u5ZobQuWaE2Lkqi7a5aYJ9uWmUqLkqi+u5bJPbuW2At7Dmh265b4vQuXCFBblwhzy5b4u2uXOCfblvi+u5dQCw5pbyuXeL0Ll4lpW5eIk6uXiFBbl4hyi5d4u2uX2Cfbl3i+u5fwCw5pbzuYGL0LmCk9u5g4cZuYGLtrmFjES5hYIFuYWCGrmBi+q5iYVtuYmEjLmBjAC5jJPbuY2QdrmBi+u5j5PbuZCAt7DmlvS5kovQuZOT27mUhxm5lIGHuZSCJrmUgN65lJS2uZOW9bmTlva5k5b3uZKLtrmdjES5nYIFuZ2CGrmdk9u5oYJLuaGHHrmhhx25kovquaWFbbmlhIy5kowAuaiT27mpkHa5kovruauT27msgLew5pb4ua6MCbmvk9u5sIC3ua6LtrmylHy5spR7ubKQFLmylvm5spTLua6L6rm4lMm5uJTKsOaW+rm7i7a5vJR8ubyUe7m8kBS5vJb5ubyUy7m7i+q5wpTJucKUyrm7i+u5xQCw5oC2uceMCbnIk9u5yYC3uceL6rnLlOS5y5TlucuU5rnLlOe5y5ToucuU6bnLlOqw5pb7udOL0LnUlvy51Jb9udSW/rnUlv+51JcAudSXAbnUlwK504vrudwAsOaXA7nei9C535cEud+XBbnflwa535cHud+XCLnflwm535cKud+XC7nfk9u56IcZueiXDLnogYe56IxBueiXDbnolw656JcPueiXELnohxu56IcaueiXEbnolxK56JcTueiXFLnolxW56JcWueiVlLnolxe56JcYueiXGbnolxq56JcbueiXHLnfhIy535cdud+XHrnflvW535b2ud+XH7nei7a6BpPbugeXILoHlyG6B5ciugeCPboHlyO6B5ckugeXJboHlya6B5cnugeXKLoHlym6B5cqugeXK7oHhx66B4cdugeXLLoHly26B5cuugeXL7oHlzC6B5cxugeXMroHlzO6B5c0ugaUfLoGggW6BobqugaCGroGkw+6BobUugaDcLoGlIe6BpSIugaUiboGlMu53ovquiuFbborlKO6K5SiuiuHH7orlK66K5TJuiuUyrnejAC6M5PbujSQdrozhx+6M5Suud6L67o4ALDmgLq6OovQujuAuLo7gLu6O4C9ujuDJro6i7a6QJc1ukCXNrpAhtS6QINwukCXN7pAlzi6OovqukeCT7pHggm6R5c5ukePBLpHlzq6Oovruk0AsOaHcbpPjAm6UAC6T4u2ulKUfLpSlLu6UpTOulKUyrpSlM+6UpTLulKS7bpSlNC6UpTRulKU0rpSk9u6XZTNuk+L6rpflMm6X4CfsOaAv7pii9C6Y4bZumOFBbpjhzy6You2umeCfbpii+u6aQC6aZPbumuAt7DmgMC6bYvrum4AsOaAwbpwi+u6cQCw5pc7unOMCbp0ALpzi+q6dpTUunaXPLpzi7a6eZTYunmU2bp5lNq6eZTbunmU3Lp5lN26eZTeunmU37p5lOC6eZPbuoOXPbqDlz6w5odyuoaL0LqHk9u6iJRMuoaL6rqKk9u6i5RNuouUTrqLlE+6i5RQuoaLtrqQk9u6kY7UupGUUbqGi+u6lACw5odzupaL0LqXh3W6l4d2upeMDLqXlz+6l5dAupeHdLqXk9u6noRVupaMCbqgk9u6oYfGupaL6rqjhLO6lou2uqWCfbqWi+u6p5PbuqiAt7Dmh3m6qovququUP7qrl0G6q5RAuquXQrqrlEG6q5dDuquUQrqrl0S6q4bZuquEjLqrisK6q5RDuquURLqrlEW6q5RGuqqMCbq7ALqqi7a6vZRHur2Mv7q9k9u6wJRIsOaXRbrCi7a6w5PbusSXRrrDg4C6wovquseEs7rHguG6x5RLuseXR7rCi+u6zACw5pdIus6LtrrPjES6z4Iaus6L6rrShW260oSMus6L67rVALDml0m614u2utiMRLrYghq614vqutuFbbrbhIy614vrut4AsOaXSrrgi9C64ZSAuuE3uuGXS7rhl0y64ZdNuuGXTrrhk9u66IRVuuCL67rqk9u664C3sOaXT7rti9C67pdQuu6XUbruk9u68ZdSuvGXU7rxl1S68ZdVuvGEVbrti+u695PbuviAt7Dml1a6+ovQuvuC4br7k9u6/YTYuvuC3rr7l1e6+5dYuvuXWbr7l1q6+5dbuvuXXLr7l126+ou2uweCfbr6i+u7CQCw5pdeuwuL0LsMk9u7DZdfuwyJ9bsMl2C7DID/uwuLtrsSk9u7E5dhuxOXYrsLjAm7FpdjuxaXZLsLi+q7GZdluxmXZrsZl2e7GZdouxmXabsZl2q7GZdruwuL67shALDmh3q7I4vQuySG1Lskg3C7JJdsuySHDbskk/K7JJPzuySXbbskl267JJPbuy2EVbsji7a7L4J9uyOL67sxk9u7MoC3sOaXb7s0i9C7NYbSuzWT27s3gkO7NIu2uzmCN7s0i+u7O5PbuzyAt7Dmh3+7PovQuz+Urrs/hx+7Pou2u0KUfLtClHu7Qobqu0KG1LtCg3C7QoIau0KTD7tClIe7QpSIu0KUibs+i+q7TYVtu02UortNhIy7TZSjuz6L67tSALDml3C7VIu2u1WUfLtVlHu7VZPbu1iXcbtYl3K7VZS7u1WUh7tVlIi7VZSJu1WCGrtUi+q7YIVtu2CUortghIy7YJSju2CL/7tUi+u7ZgCw5oeAu2iL0LtpgLi7aYSMu2mFbbtoi+u7bQCw5pdzu2+L0LtwlK67cIcfu3CUxLtwlMW7cJTGu3CUx7tvi7a7d4xEu3eCGrt3N7t3lIC7d5SLu3eUjLt3lIi7d5SJu2+L6ruAhW27gISMu2+L67uDALDml3S7hYvQu4aFBbuGhzy7hoSMu4aFbbuFi7a7i4J9u4WL67uNALuNhw2w5pd1u5CL0LuRk9u7koxBu5CLtruUggW7kIvru5YAsOaXdruYi9C7mZPbu5qXd7uYi7a7nJPbu52XeLudl3m7nZd6u52Xe7udl3y7nZd9u5yXfruclYi7mIvqu6aXf7uml4C7ppeBu6aXgruYjAC7q5d/u6uXgLuYi+u7rpPbu6+At7Dml4O7sYvQu7KT27uzl3e7s5eEu7GLtru2k9u7t5eFu7eXhru3l4e7t5eIu7eXibu3l4q7t5d9u7GL6ru/l4K7v5eLu7+XjLu/l4G7v5eNu7GL67vFk9u7xoC3sOaXjrvIi9C7yYUFu8mHPLvIi7a7zIJ9u8iL67vOALDml4+70IvQu9GFBbvRhzy70Iu2u9SCfbvQi+u71gCw5peQu9iL0LvZk9u72pWdu9iLtrvci/S73IIau9iL67vfALDml5G74YvQu+KT27vjhCG74Yvqu+WK37vli/+74YwAu+iK37vhi7a76oNwu+qKA7vqg2676oDju+qBj7vqg9K76ov0u+qEUbvqghq74Yvru/QAsOaXkrv2i9C795eTu/eMMLv3itW794JBu/eXlLv3l5W795W3u/eXlrv3hLO79ou2vAGCfbv2i+u8A5PbvASAt7Dml5e8Bou2vAeT27wIl5i8CJeZvAiXmrwIl5u8CJecvAaL67wOALDml528EIvqvBGEs7wRg+e8EYRPvBCLtrwVg+W8FYQzvBCL67wYALDml568Gou2vBuD6LwbjWq8G5PbvB6Xn7wai+u8IACw5pegvCKL0Lwjk9u8JIQhvCKLtrwmghq8JoDjvCaN/Lwii+u8KgCw5pehvCyLtrwtg+i8LY1qvC2T27wwl6K8LIvrvDIAsOaXo7w0i9C8NZPbvDaEIbw0i7a8OIIavDiA47w0i+u8OwCw5pekvD2Ltrw+lO68PobqvD6U77w+lPC8PpTxvD6TD7w+lPK8PYvqvEaFbbxGlKK8RoSMvEaUo7w9i+u8SwAAl6W8TYvQvE6XpbxPgMi8TYu2vFGXpbxSh5K8UoDHvFGXprxNl6e8Vou2vFeXqLxWi+u8WQAAjJW8W4u4vFyXqbxch7q8XJeqvFyXq7xbi9C8YYyVvGKLj7xil6y8YpetvGKXrrxil6+8YoEZvGKSo7xil7C8YpexvGKXsrxikqW8YpezvGKSprxil7S8Ype1vGKXtrxil7e8Ype4vGKXubxil7q8Ype7vGKXvLxil728Ype+vGKXv7xil8C8YpfBvGKXwrxil8O8YpfEvGKXxbxil8a8YpfHvGKLkLxhl8i8YZEJvGGXybxhl8q8W4u2vImMlbyKl8u8ipfMvIqXzbyKgRe8iouTvIqLlbyKi5i8ioRnvIqXzryKhGm8ioudvIqLqbyKi6q8iourvImLmryJgRi8iYucvFuXz7yci9C8nYyVvJ6E2Lyci7a8oIJ9vJyL6ryigkC8nIvrvKQAvFuX0Lymi9C8p4yVvKiX0bymi+q8qoMBvKaL67ysALxbl9K8rovQvK+Mlbywl9G8sJfTvLCCgrywl9S8rovqvLWB7Lyui7a8t4MHvK6L67y5ALxbgMq8u4wJvLwAvLuLtry+go28voLlvL6MlbzBh728wYfAvMGHwry+hSO8voz8vL6EPry+gue8voTBvLuL6rzKggm8yoMBvMqDfrzKg2y8yow+vFuAy7zQjAm80YyVvNKQ67zSh8a80Iu2vNWCjbzVhD681YLnvNWEwbzQi+q82oIJvNqDAbzag3682oNsvNqMPrxbh8i84IvQvOGMlbzihge84oN3vOKDBbzigoK84IvqvOeB7Lzgi7a86YMHvOCL67zrALxbl9W87YvQvO6Mlbzvl9a875fXvO+X2Lzvl9m875favO+X27zvl9y875fdvO+X3rzvl9+875fgvO+X4bzvl+K875fjvO+X5Lzvl+W875fmvO+X57zvl+i875fpvO+X6rzvhRm875frvO+X7Lzvl+2875fuvO+X77zuknq87pfwvO6X8bzti7a9DoqKvQ6Mlb0Ql/K9EJfzvRCX9L0Qine9EJf1vRCLTr0Ql/a9EJf3vRCX+L0Ql/m9EJf6vRCX+70Ql/y9EJf9vRCX/r0Ql/+9EJgAvRCYAb0QmAK9EJgDvRCYBL0QmAW9EJgGvRCYB70QmAi9EJgJvRCYCr0QmAu9EJgMvRCYDb0QmA69EJgPvRCYEL0QmBG9EJgSvRCYE70QmBS9DoNBvQ6RQb0Ogu69DoMovQ6YFb0OgX29DoGZvQ6BmL0OgZq9DoILvQ6C4r0Ogym9DoF+vQ6FLL0OiCu9DoZpvQ6BhL0OgdC9DoLvvQ6B070Og9W9Do/5vQ6YFr0OmBe9DpgYvQ6YGb0OmBq9DpgbvQ6Hz70Ogn29DoRgvO2L6r1VjJW9VpgcvVWCQL1VgyK9VYpwvVWIO71ViDy9VYg/vVWYHbztjAm9X4N0vV+Mlb1hmB69YZgfvO2L671kjJW9ZYC3vWWYILxbmCG9aIvqvWmMlb1qmCK9aIu2vWyMlb1tjme9bYfTvW2YI71tmCS9aIvrvXIAvFuYJb10i9C9dYyVvXaYJr12mCK9dpgnvXaYKL12mCm9dpgqvXaYK712mCy9dpgtvXaYLr12mC+9dIu2vYKMlb2DmDC9g5gxvYOYMr2Djme9g5gkvYOYM72DmCO9g4fTvXSL672MALxbmDS9jovQvY+Mlb2QmCa9kJgivZCYNb2QmDa9kJg3vZCYOL2QmCi9kJg5vY6Ltr2ZjJW9mo5nvZqYJL2amDO9mpgjvZqH072Oi+u9oAC8W4DMvaKL0L2jmDq9o5g7vaOYPL2jjJW9p4fJvaeHyr2ijAm9qofLvaKL6r2sgkC9rIyVva6Hzr2siD+9rIfivayH5L2shA29rIpwvaKLtr21ggu9tYyVvbeBn723h9G9t4fTvbeH1b23mA69t5g9vbeYPr23h9e9t4fZvbeH2723h929t4fevbeH3723iCa9t4gnvbeILL23h+C9t4fmvbeYP723mEC9t5hBvbWC4r21gym9tYUsvbWGab21g9W9tYgrvbWDQb21gX69tYGEvbWC7721gdO9tYHQvbWRQb21mEK9tZhDvbWYRL21lBC9tZhFvbWYRr21mEe9tZhIvbWRQr21mBu9tYfPvbWCfb21mEm9tZhKvbWYS721mBW8W4DOveqL0L3rjJW97IfpveyH6r3sh+u97IfsveuFBb3qi7a98oyVvfOAz73zh++984DQvfKCfb3qi+q9+IyVvfmH8r3qi+u9+4yVvfyAzbxbgNG9/ou2vf+Mlb4AgM+9/4J9vf6L674DjJW+BIDNvFuA0r4Gi9C+B4yVvgiH6r4Ih+u+CIfsvgiH/b4Gi7a+DYJ9vgaL674PjJW+EIDNvFuA074Si9C+E4yVvhSH/r4Si7a+FoJ9vhKL674YALxbgNS+GovQvhuMlb4ch/2+Gou2vh6Cfb4ai+u+IAC8W5hMviKL0L4jjJW+JITYviKLtr4mgn2+IovrvigAvFuA1b4qi9C+K4yVviyA1r4sgNi+LIDaviyA3L4sgN6+LIDgviqLtr4zgX6+M4yVvjWNTr41iAG+KovqvjiCQL44gWi+KovrvjsAvFuA4r49i9C+PoyVvj+IA749i7a+QYz5vkGM+r5Bgum+QYz7vkGM/L5BjPa+QYQ+vkGMlb5Jh8W+SYgSvkmHvb5JiBi+SYgWvkmIDr5JiBC+SYgavkGCjb5BguW+QYDjvkGMtb5Bg22+QYLnvkGEuL5Bg4m+QYxZvkGCfb5BhMG+QYw2vj2MCb5eAL5eiAS+XogGvj2L6r5ijJW+Y4gIvmKCCb5ig36+YoNsvmKMPr5igk++YoOKvmKDAb49jAC+bIIJvFuA5L5ui9C+b4yVvnCIIr5ui7a+cow1vnKCjb5ygue+coLfvnKC475yguW+coy1vnKMtL5yjFm+coLpvnKDAL5yjNG+cozPvnKM0L5yjMG+coJ9vm6L6r6Dgk++g4OKvoOCCb6Dg0e+g4LevoOMzr5ui+u+ioyVvouAzbxbmE2+jYvQvo6Mlb6Pgv6+jYvqvpGDAb6Rggm+jYvrvpQAvFuYTr6Wi9C+l4yVvpiC/r6Wi+q+moMBvpqCCb6Wi+u+nQC8W5hPvp+L0L6gjJW+oYL+vp+L6r6jgwG+o4IJvp+L676mALxbmFC+qIvQvqmMlb6qgv6+qolcvqqCgr6oi7a+roMHvqiL6r6wgey+qIvrvrIAvFuYUb60i9C+tYyVvraC/r62iVy+toKCvrSLtr66gwe+tIvqvryB7L60i+u+vgC8W5hSvsCL0L7BjJW+woL+vsKJXL7CgoK+wIu2vsaDB77Ai+q+yIHsvsCL677KALxbiCW+zIvQvs2Mlb7Ol+q+zIu2vtCCC77QguK+0IMpvtCFLL7Qhmm+0IPVvtCDQb7QgX2+0IGZvtCBmL7QiCu+0IyVvtyISb7ciCi+3IgpvtyIKr7ciDC+3IgyvtyH3b7ch96+3IffvtyIJr7ciCe+3IgsvtyH4L7ch9m+3Ig+vtyIQL7cmBK+0IMovtCC7r7QgYS+0ILvvtCB077QgdC+0IF+vtCRQb7QmBm+0JgavtCYFb7QmEK+0JhDvtCYRL7QlBC+0JhFvtCYRr7QmEe+0JhIvtCRQr7QmBu+0IfPvtCYSb7QmEq+0JhLvtCEYL7QmBa+0JgXvtCYGL7Mi+q/C4pwvwuIO78LiDy/C4fkvwuIP78Lh+K/C4QNvsyL678TALxbgOW/FYvQvxaMlb8XmFO/F5hUvxeYVb8XmFa/F5hXvxWMCb8djJW/HpDrvxWL6r8ggkC/IIyVvyKHzr8ggyK/FYu2vyWBmr8lgX2/JYyVvyiISb8oiEu/KIkVvyiJF78lgn28W4Dmvy6MCb8vjJW/MJDrvy6L6r8ygkC/MoyVvzSHzr8ygyK/Lou2vzeBmr83jJW/OYhJvFuA6L87i9C/PIyVvz2YWL89mFm/PZhavz2YW789mFy/PZhdvz2YXr89mF+/PZhgvz2YYb89mGK/PZhjvz2YZL89mGW/PZhmvz2YZ789mGi/PZhpvz2Yar89mGu/PYkbvz2JHL89iR2/PYkevz2JH789iSC/PYkhvz2JIr89iSO/PYkkvzuLtr9cjJW/XYklv12JLL9dgOe/XYDpvzuL6r9iiSi/YoyVv2SJKb9iiSu/Yokvv2KJMr9imGy/Yphtv2KQR79ikFS/O4vrv22Mlb9ugQS/bphuv20AvFuA6r9yi7a/c4yVv3SJPb90iT+/dIlBv3OYb79zkMK/covrv3oAvFuJQ798i9C/fYlEv32JRb99iUa/fIvqv4GCQL98i7a/g4F+v3yL67+FALxbiUi/h4vQv4iJSb+Igo6/h4vrv4sAvFuJSr+Ni9C/joyVv4+JS7+PiUy/j5hwv46D5r+Ni+q/lIC7v5SAvb+UmHG/lIlEv5SYcr+Ni7a/moyVv5uEu7+biU2/molPv5qCjb+amHO/mph0v42L67+iALxbgOu/pIvQv6WMlb+mmHW/pIwJv6gAv6SLtr+qmHa/qolTv6qJdL+qmHe/qph4v6qMlb+wmHm/sIlVv7CYer+ki+q/tIlEv7SYe7+0mHy/tIyVv7iJUL+4mH2/uJh+vFuJWL+8i9C/vYyVv76JWb++iVq/voS7v7yL6r/CgwG/vIvrv8QAvFuJW7/Gi9C/x4yVv8iJWr/IiVy/yIlZv8iCgr/Gi+q/zYHsv8aLtr/Pgwe/xovrv9EAvFuA7L/Ti+u/1AC8W4Duv9aL0L/XjJW/2Jh/v9iYgL/YmIG/2JiCv9iYg7/YmIS/2JiFv9aLtr/gjJW/4Ylev+GJZr/hiWm/4Ylsv+GJbb/hiXO/4YlRv+GJeL/hiXq/4Yl7v+GJfL/hiX2/4YmCv+GJhL/hiYi/4ZiGv+GYh7/hmIi/4YDtv+GA77/hiZK/4YmUv+CJYb/ggo2/4IPPv+CCC7/ggn2/4IF+v+CYFb/ghmy/4ISAv+CJdb/giXe/4IPRv+CH9L/gmIm/4JiKv+CDKb/gmIu/4JiMv+CDAr/gmI2/4IPYv+CGZ7/gmI6/4JiPv+CYkL/giVO/4Il0v+CJjL/giY6/4ImQv9aMCcAAQBaMlcAAQBeQ67/Wi+rAAEAZgkDAAEAZjJXAAEAbh87AAEAbiWDAAEAZggnAAEAZgk/AAEAZg4rAAEAZhDTAAEAZmJG8W4DwwABAI4vQwABAJIyVwABAJZiSwABAJZiTwABAI4wJwABAKIyVwABAKZDrwABAI4vqwABAK4JAwABAI4u2wABALYPPwABALYyVwABAL4lewABAL4l4wABAL4mYwABAL4mbwABAL4mlwABAL5iUwABAL4hDwABAL4WcwABALYF+wABALYmMwABALYl1wABALYMCwABALYMpwABALZiLwABALZiMwABALYmQwABALYmOvFuA8cAAQEGMCcAAQEKMlcAAQEOQ68AAQEGLtsAAQEWMlcAAQEaJqsAAQEaJXsAAQEWDz8AAQEWBfrxbgPLAAEBLjAnAAEBMjJXAAEBNkOvAAEBLi7bAAEBPjJXAAEBQiV7AAEBPg8/AAEBPgX68W4DzwABAVIwJwABAVYyVwABAVpDrwABAVIu2wABAWIyVwABAWYlewABAWIPPwABAWIF+vFuJrMAAQF2L0MAAQF6Au8AAQF6D5sAAQF6JRMAAQF2L6sAAQGKAvcAAQGKYccAAQF2LtsAAQGWCjcAAQGWJT8AAQGWYc8AAQF2L68AAQGkAvFuJrsAAQGuL0MAAQGyMlcAAQG2Jr8AAQG2JsMAAQG2DBcAAQGuL6sAAQHGDAcAAQHGDfsAAQGuL68AAQHQAvFuJscAAQHaL0MAAQHeMlcAAQHiJr8AAQHiJsMAAQHiDBcAAQHiCgsAAQHaLtsAAQH2DB8AAQHaL6sAAQH+B7MAAQHaL68AAQIEAvFuJssAAQIOLtsAAQISCfcAAQIOL68AAQIYAvFuA9MAAQIiL6sAAQImCQMAAQIiL68AAQIsAvFuA9cAAQI2L68AAQI4AvFuA9sAAQJCL68AAQJEAvFuA98AAQJOMCcAAQJQAwABAk4vqwABAloKOwABAloD/wABAk4wAwABAmYD/wABAk4u2wABAm4yVwABAnJiVwABAnJiWwABAnI1EwABAnIHNvFuJtcAAQKGL0MAAQKKFBcAAQKGL6sAAQKSYl8AAQKGLtsAAQKaCfcAAQKGL68AAQKgAvFuYmMAAQKqL68AAQKsAvFuYmcAAQK2L6sAAQK6FBcAAQK2L68AAQLAAvFuYmsAAQLKL68AAQLMAvFuA+MAAQLWL0MAAQLaEs8AAQLaJtsAAQLaMlcAAQLmMJMAAQLWMCcAAQLsAwABAtYvrwABAvYyVwABAvoC3vFuYm8AAQMCL6sAAQMGSesAAQMGX8MAAQMGX8cAAQMGDIsAAQMGKcMAAQMGIO8AAQMGIPMAAQMGIP8AAQMGYHcAAQMCLtsAAQMuKisAAQMuYnMAAQMuRQcAAQMuDQcAAQMuCC8AAQMuC4sAAQMuDKcAAQMuGacAAQMuFLMAAQMuD1cAAQMuIK8AAQMuC7sAAQMuDKMAAQMuBfcAAQMuBmcAAQMuBmMAAQMuBmsAAQMuBhMAAQMuB0MAAQMuC78AAQMuB08AAQMuYFcAAQMuP+cAAQMuYFsAAQMuYF8AAQMuYGMAAQMuYGcAAQMuYGsAAQMuYG8AAQMuHz8AAQMuCfcAAQMuEYMAAQMCMCcAAQOyDdLxbgPnAAEDui+rAAEDvjJXAAEDwh87AAEDvgkDAAEDujAnAAEDzmJ3AAEDui7bAAED1gX3AAED1gZnAAED1gZjAAED1gn28W4m3wABA+ou2wABA+5gVwABA+5iewABA+ovrwABA/gC8W5ifwABBAIvQwABBAYyVwABBApigwABBApihwABBApiiwABBApijwABBApikwABBApilwABBApimwABBApinwABBApiowABBApipwABBApiqwABBAoRVwABBApirwABBApiswABBAZitwABBAZiuwABBAZivwABBAZiwwABBAZixwABBAZiywABBAZizwABBAZi0wABBAZi1wABBAZi2wABBAZi3wABBAZi4wABBAZi5wABBAZi6wABBAZi7wABBAZi8wABBAZi9wABBAZi+wABBAZi/wABBAZjAwABBAZjBwABBAZjCwABBAIu2wABBJ4yVwABBKJjDwABBKJjEwABBKJjFwABBKJjGwABBKJjHwABBKJjIwABBKJjJwABBKJjKwABBKJjLwABBKJjMwABBKJjNwABBKJjOwABBKJjPwABBKJjQwABBKJjRwABBKJjSwABBKJjTwABBKJjUwABBKJjVwABBJ4qKwABBJ5icwABBJ4F+wABBJ5jWwABBJ5jXwABBJ5jYwABBJ5gVwABBJ5jZwABBJ5jawABBJ4J9wABBJ5jbwABBJ4DjwABBJ5jcwABBJ4zawABBAIvqwABBSoyVwABBS4qvwABBS5jdwABBSoJAwABBSpjewABBSpjfwABBSpjgwABBSpjhwABBSpjiwABBSpjjwABBSpjkwABBSpjlwABBSpjmwABBSoUpwABBSpjnwABBSpjowABBSpjpwABBAIvrwABBXADAAEFcmOrAAEFchUPAAEFcmOvAAEFcmOzAAEFcjJXAAEFimO3AAEFihT7AAEFimO68W4m4wABBZovQwABBZ5jvwABBZ5jwwABBZ5jxwABBZ5jywABBZ5jzwABBZou2wABBbYyVwABBbpj0wABBbpj1wABBbopywABBbYgrwABBbYILwABBbYLiwABBbYMpwABBbYPVwABBbYZpwABBbYUswABBbYNBwABBbZFBwABBbZhCwABBbZhDwABBbZhEwABBbZQQwABBbZhFwABBbZhGwABBbZhHwABBbZhIwABBbYJ9wABBbYqKwABBbZicwABBZovqwABBhopwwABBZovrwABBiAC8W5j2wABBiovQwABBi5j3wABBi5j4wABBi5j5wABBi5j6wABBi5j7wABBi5j8wABBi5j9wABBi5j+wABBi5j/wABBi5kAwABBi5kBwABBi5kCwABBi5kDwABBi5kEwABBi5kFwABBi5J6wABBi4yVwABBnJkGwABBiou2wABBnoILwABBnoLiwABBnoMpwABBnoUswABBnoGEwABBnoLvwABBnoHQwABBnoHTwABBnoF+wABBnpgVwABBnoJ9wABBnpFBwABBnoNBwABBiovqwABBrJkHwABBrJkIwABBrJkJwABBrJkKwABBrJkLwABBrJkMwABBrIJAwABBrIg/wABBiovrwABBtQDAAEG1jJXAAEG3mQ28W4D8wABBuYvQwABBuoyVwABBu4D6wABBuYu2wABBvYm5wABBvYyVwABBv4m6wABBv4m7wABBuYvqwABBwoGQwABBuYvrwABBxAC8W4m8wABBxovQwABBx4UFwABBxou2wABByYJ9wABBxovrwABBywC8W4m9wABBzYvrwABBzgC8W4m+wABB0IvrwABB0QC8W4D9wABB04u2wABB1IJ9wABB04vrwABB1gC8W4D+wABB2IvQwABB2YyVwABB2onAwABB2YnBwABB2YSzwABB2YUFwABB2Iu2wABB34nEwABB34J9wABB2IvqwABB4oyVwABB44nFwABB44nIwABB2IvrwABB5gDAAEHmgP/AAEHmicK8W4EAwABB6ovQwABB64C7wABB64C9wABB64yVwABB7owkwABB6owJwABB8ILhwABB6ou2wABB8pkOwABB8pkPwABB8onQwABB8onTwABB6ovqwABB94yVwABB+InFwABB+InIwABB6ovrwABB+wDAAEH7gP/AAEH7gQG8W4nbwABB/4vQwABCAIncwABCAIIJwABB/4vqwABCA4C7wABCA4C9wABCA4yVwABCBonFwABCBonIwABB/4vrwABCCQC8W4ECwABCC4vQwABCDIyVwABCDYfqwABCDYfrwABCC4u2wABCEIyVwABCEYDPwABCEIJ9wABCC4vrwABCFADAAEIUjJXAAEIWgM28W4EDwABCGIvQwABCGYyVwABCGofqwABCGofrwABCGoniwABCGIu2wABCHoyVwABCH4DPwABCHoJ9wABCGIvrwABCIoyVwABCI4DNwABCIgC8W4EFwABCJovQwABCJ4yVwABCKIkgwABCKIkdwABCKIkkwABCKInmwABCKInnwABCKInowABCKInpwABCJou2wABCMIyVwABCMZkQwABCMYDPwABCMZkRwABCMYnvwABCMYnwwABCMYn0wABCMIJ9wABCJovrwABCOYyVwABCOoEEwABCOYnswABCOQC8W4EGwABCPovQwABCP4UFwABCPou2wABCQYyVwABCQoDPwABCQYJ9wABCPovrwABCRQC8W5kSwABCR4vQwABCSIUFwABCR4u2wABCSoJ9wABCR4vrwABCTAC8W4ouwABCTovQwABCT4UFwABCTou2wABCUYJ9wABCTovrwABCUwC8W4owwABCVYvQwABCVooxwABCVYu2wABCWIJ9wABCVYvrwABCWgC8W4EHwABCXIu2wABCXYJ9wABCXIvqwABCX4GQwABCX4yVwABCYYD6wABCXIwAwABCY4yVwABCZID6wABCXIvrwABCZgC8W4EIwABCaIu2wABCaYJ9wABCaIvqwABCa4GQwABCa4yVwABCbYD6wABCaIwAwABCb4yVwABCcID6wABCaIvrwABCcgC8W4EJwABCdIvQwABCdYo2wABCdIu2wABCd4yVwABCeIDPwABCd4J9wABCdIvrwABCewC8W4o6wABCfYwJwABCfgC8W4o7wABCgIvQwABCgYUFwABCgIu2wABCg4J9wABCgIvrwABChQC8W4EKwABCh4vQwABCiIUFwABCiIHWwABCiIQHwABCh4u2wABCjIJ9wABCh4vrwABCjgC8W4ELwABCkIu2wABCkYJ9wABCkIvrwABCkwC8W5kTwABClYvQwABCloyVwABCl5kUwABCl5kVwABCl4MLwABCl4UZwABCloSzwABClYu2wABCnYyVwABCnoM3wABCnpkWwABCnYJ9wABCnYKNwABCnYLlwABClYvqwABCpIyVwABCpZXBwABCpZkXwABClYvrwABCqAC8W4pMwABCqou2wABCq4yVwABCrJkYwABCq5BwwABCq4F+wABCqovqwABCsIJAwABCqovrwABCsgC8W4pNwABCtIvQwABCtYyVwABCtpkZwABC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y5QQwABDy5hFwABDy5hGwABDy5hHwABDy5hIwABDy5FCwABDy5gbwABDy4fPwABDy5hJwABDy5hKwABDy5hLwABDy4J9wABDy4qKwABDy5icwABDyovqwABD94JAwABD94fkwABD94g/wABD94fiwABD94QNwABD94pwwABDyovrwABD/gC8W4EQwABEAIvQwABEAYyVwABEAoqVwABEAIu2wABEBIyVwABEBYqWwABEBYfmwABEBYERwABEBYESwABEBYETwABEBYEUwABEBYEVwABEBIF+wABEBIJ9wABEBIEWwABEAIvqwABEEIyVwABEEYfOwABEEIJAwABEEIoRwABEAIvrwABEFQC8W4qgwABEF4u2wABEGIlTwABEGIl0wABEF4vrwABEGwC8W4qhwABEHYvqwABEHoC7wABEHoC9wABEHphxwABEHoPmwABEHolEwABEHYu2wABEJIlPwABEJIKNwABEJJhzwABEHYvrwABEKAC8W4qiwABEKovQwABEK4yVwABELJkvwABELIfJwABELIqjwABEKou2wABEMIyVwABEMZkwwABEMZh5wABEMJkxwABEMJh2wABEMIlTwABEMJh3wABEMJh4wABEKovqwABEOYyVwABEOolQwABEOph+wABEOYlEwABEOZh7wABEOZh8wABEKowJwABEQAC8W4qlwABEQou2wABEQ5h0wABEQovqwABERZhywABEQovrwABERwC8W5kywABESYvQwABESoyVwABES4wkwABESYwJwABETQDAAERNjODAAERNg3TAAERNjOHAAERJi7bAAERSjCrAAERSjDXAAERSgwLAAERSgOPAAERSjLXAAERSgunAAERSjL/AAERSjMDAAERSjNfAAERSjMHAAERSjMLAAERSjMXAAERSjNnAAERSjNjAAERSjNrAAERSjFnAAERSjDbAAERJi+rAAERkgwG8W4qmwABEZou2wABEZ4DjwABEZ4IawABEZovrwABEagC8W4qnwABEbIvQwABEbYyVwABEbowkwABEbIwJwABEcJkzwABEbIvqwABEcoHswABEbIu2wABEdIJ9wABEbIvrwABEdgC8W5k0wABEeIvQwABEeYyVwABEeoD6wABEeIu2wABEfIJ9wABEeIvrwABEfgC8W5k1wABEgIvQwABEgYyVwABEgpfgwABEgpk2wABEgoS7wABEgpk3wABEgIu2wABEh4yVwABEiJk4wABEiJk5wABEiJjuwABEh4C7wABEh5SzwABEh5k6wABEgIvqwABEj5k7wABEj5k8wABEj5k9wABEj5k+wABEj5k/wABEj5lAwABEgIvrwABElgC8W4qowABEmIvqwABEmYyVwABEmolgwABEmYIJwABEmYJAwABEmYJPwABEmYOKwABEmYQ0wABEmZiRwABEmIu2wABEooyVwABEo4lRwABEooKNwABEooPPwABEooF+wABEopgVwABEooZswABEooSAwABEool1wABEool3wABEooILwABEooPRwABEoof0wABEopiJwABEopiKwABEooMpwABEopiLwABEopiMwABEooMCwABEopiNwABEopiPwABEooZnwABEopiOwABEooPYwABEoomMwABEopiQwABEoomQwABEoomOwABEmIwJwABEv4qpwABEv4qqwABEv5idvFuZQcAARMOL0MAARMSEJsAARMOL6sAARMaDAcAARMaDbMAARMOL68AARMkAvFuZQsAARMuL0MAARMyEJsAARMyMlcAARM6GCMAARM6ZQ8AARM6ZRMAARMuLtsAARNKMlcAARNOZRcAARNKZOsAARNKDB8AARNKZJ8AARMuL6sAARNiZRsAARNiB7MAARNiZR8AARNiZSMAARMuMAMAARN2ZRsAARMuL68AARN8AwABE35lJvFuKrsAAROKL0MAAROOMlcAAROSZSsAAROSZS8AAROSZTMAAROSKr8AAROSKsMAAROSKscAAROSKssAAROSEPcAAROSKs8AAROSKtMAAROKLtsAARO+MlcAARPCKtsAARPCKt8AARPCKucAARPCKu8AARPCAzcAARO+DcMAARO+D0sAARO+DbsAARO+KA8AARO+MWcAARO+CfcAAROKL6sAARPyCCcAARPyCT8AARPyDisAAROKL68AARQAAvFuKvsAARQKLtsAARQODcMAARQODbsAARQOKA8AARQOD0sAARQKL68AARQgAvFuCxMAARQqL0MAARQuZTcAARQuMJcAARQuMlcAARQ6MJMAARQqMCcAARRAAwABFCovqwABFEoJAwABFCou2wABFFIF+vFuKv8AARRaL68AARRcAvFuKwMAARRmL0MAARRqMlcAARRuMJMAARRmL6sAARR2JhcAARR2GfsAARR2ZTsAARR2KwcAARR2KwsAARR2FbcAARR2GZcAARR2Kw8AARR2KxMAARR2LCsAARR2LC8AARR2ZT8AARR2Vz8AARR2LZ8AARR2KxcAARR2KxsAARR2Kx8AARR2KyMAARR2LZsAARR2KycAARR2ZUMAARR2AuMAARR2CQMAARRmMCcAARTUAwABFNYrawABFNYrbwABFNYrVwABFNYsSwABFNZlRwABFNZlSwABFGYu2wABFPZlTwABFPZlUwABFPYF+wABFPYJ9wABFPYqtwABFPZlVwABFPYZ1wABFPYZ2wABFPZlWwABFPYqKwABFPZicwABFPZlXwABFPYrdwABFPZlYwABFPZlZwABFPZlawABFPZlbwABFPZlcwABFPZldwABFPYyVwABFUYrgwABFPYrpvFuK+sAARVSL0MAARVWMlcAARVaK+8AARVaK/MAARVaG18AARVZ1wABFVor9wABFVor+wABFVor/wABFVosAwABFVosBwABFVosCwABFVosDwABFVplewABFVplfwABFVplgwABFVplhwABFVpliwABFVpljwABFVplkwABFVpllwABFVplmwABFVplnwABFVplowABFVplpwABFVYZ+wABFVYZlwABFVIvqwABFcIyVwABFcYsEwABFcX/AAEVxmWrAAEVwmU7AAEVwisHAAEVwisLAAEVwhW3AAEVwisPAAEVwisTAAEVwiwrAAEVwiwvAAEVwmU/AAEVwlc/AAEVwi2fAAEVwisXAAEVwisbAAEVwisfAAEVwisjAAEVwi2bAAEVwisnAAEVwmVDAAEVwgLjAAEVwgkDAAEVUjAnAAEWJiwbAAEWJAMAARYmK2sAARYmK28AARYmK1cAARYmLEsAARVSLtsAARZCMlcAARZGLD8AARZGZa8AARZGLEMAARZGZbMAARZGZbcAARZGLE8AARZGLG8AARZGLHcAARZGLH8AARZGLJsAARZGLJ8AARZGLKsAARZGLK8AARZGLMcAARZGLNsAARZGLN8AARZGLOMAARZGLPMAARZGLPcAARZGLQMAARZGLQcAARZGLR8AARZGLTMAARZGLTsAARZGLT8AARZGLUcAARZGLUsAARZGLWMAARZGLWsAARZGLXMAARZGLXsAARZGZbsAARZGZb8AARZGLacAARZGLa8AARZGFpMAARZGZcMAARZGLbsAARZGZccAARZGZcsAARZGLcsAARZGLc8AARZCZU8AARZCKrcAARZCZVcAARZCZVsAARZCGdcAARZCGdsAARZCZVMAARZCCfcAARZCBfsAARVSL68AARcWMlcAARcaFPrxbi3TAAEXIi9DAAEXJjJXAAEXKmXPAAEXKiwDAAEXKi3XAAEXKi3bAAEXKmXTAAEXKmXXAAEXKmXbAAEXKmXfAAEXIjAnAAEXTmTPAAEXTmXjAAEXTk8LAAEXIi7bAAEXXjJXAAEXYmXnAAEXYmXrAAEXYinLAAEXYmXvAAEXXiorAAEXXmXzAAEXXmX3AAEXXgn3AAEXIi+rAAEXhhmDAAEXhk3vAAEXhmX7AAEXhi3/AAEXhmX/AAEXhhHnAAEXIi+vAAEXojJXAAEXpgLe8W4uAwABF64vQwABF7IyVwABF7YuBwABF7YuCwABF7YuDwABF7YuEwABF7YuFwABF7YuGwABF7YuHwABF7YuIwABF7YsBwABF64vqwABF94tnwABF94rFwABF95mAwABF94rGwABF94rHwABF94rIwABF94yVwABF/ouJwABF/ouKwABF/ouLwABF/ouMwABF94rJwABF94tmwABF95XPwABF94Z+wABF95lOwABF94rBwABF94rCwABF94VtwABF94ZlwABF94rDwABF94rEwABF95lQwABF94sKwABF94sLwABF95lPwABF94C4wABF94JAwABF64u2wABGFIyVwABGFZmBwABGFZmCwABGFZmDwABGFZluwABGFYuNwABGFJlTwABGFJlWwABGFJlVwABGFIqtwABGFIZ1wABGFIZ2wABGFJlUwABGFIF+wABGFIJ9wABF64vrwABGJAC8W4uOwABGJovQwABGJ4yVwABGKIMLwABGJovqwABGKoC4wABGJovrwABGLAAAmYTAAEYui7jAAEYvmYXAAEYvmYbAAEYvmYfAAEYui9DAAEYzmYTAAEY0mYjAAEY0mYnAAEY0mYrAAEY0mYvAAEY0k+XAAEY0mYzAAEY0mY3AAEY0mY7AAEY0k+TAAEY0mY/AAEY0mZDAAEY0mZHAAEY0mZLAAEY0mZPAAEYui7bAAEZDmYTAAEZEmZTAAEYumZXAAEZGi9DAAEZHmZbAAEZHmZfAAEZHmZjAAEZGi+rAAEZLmZnAAEZLhW3AAEZLhIzAAEZGi7bAAEZPjETAAEZPmZrAAEZPghrAAEZPmZvAAEZGjAnAAEZUmZzAAEZGjADAAEZWmZ3AAEYumZ7AAEZYi9DAAEZZmZ/AAEZZmaDAAEZZmaHAAEZZmaLAAEZYi+vAAEZeAMAARi6Zo8AARmCL0MAARmGZpMAARmGZpcAARmGZpsAARmGZp8AARmGZqMAARmGZqcAARmGZqsAARmGZq8AARmGZrMAARmGZrcAARmGZrsAARmGZr8AARmGZsMAARmGZscAARmGZssAARmGZs8AARmGZtMAARmGZtcAARmGZtsAARmGZt8AARmGZuMAARmGZucAARmGZusAARmGZu8AARmGZvMAARmGZvcAARmGZvsAARmGZv8AARmGZwMAARmGZwcAARmGZwsAARmGZw8AARmGZxMAARmGZxcAARmGZxsAARmGZx8AARmGZyMAARmGZlsAARmGZycAARmGZysAARmGZy8AARmGZzMAARmGZzcAARmGZzsAARmGZz8AARmGZ0MAARmGZ0cAARmGZ0sAARmGZ08AARmGZ1MAARmGZ1cAARmGZ1sAARmGZ18AARmGZ2MAARmGZ2cAARmGZ2sAARmGZ28AARmGZ3MAARmGZ3cAARmGZ3sAARmGZ38AARmGZ4MAARmGZ4cAARmGZ4sAARmGZ48AARmGZ5MAARmGZ5cAARmGZ5sAARmGZ58AARmGZ6MAARmGZ6cAARmGZ6sAARmGZ68AARmGZ7MAARmGZ7cAARmGZ7sAARmGZ78AARmGZ8MAARmGZ8cAARmGZ8sAARmGZ88AARmGZ9MAARmGZ9cAARmGZ9sAARmGZ98AARmGZ+MAARmGZ+cAARmGZ+sAARmGZ+8AARmGZ/MAARmGZ/cAARmGZ/sAARmGZ/8AARmGaAMAARmGaAcAARmGaAsAARmGaA8AARmGaBMAARmGaBcAARmGaBsAARmGaB8AARmGaCMAARmGaCcAARmGaCsAARmGaC8AARmGaDMAARmGaDcAARmGYl8AARmGaDsAARmGKwsAARmGFbcAARmGaD8AARmGaEMAARmGaEcAARmGaEsAARmCLtsAARtWCjcAARtWA/8AARtWA48AARtWG1cAARtWC6cAARtWMwMAARtWC58AARtWaE8AARtWMWcAARmCL68AARt8AwABGLpoUwABG4YwJwABG4gDAAEbhi7bAAEbkiorAAEbkgn3AAEbhi+rAAEbngP/AAEbnhHnAAEYumhXAAEbqi+rAAEbrgZfAAEbrmhbAAEbqi7bAAEbulLvAAEbqjADAAEbwmhfAAEbqi+vAAEbyAMAARi6aGMAARvSL0MAARvWLcMAARvWaGcAARvWaGsAARvWaG8AARvWHmcAARvWaHMAARvWaHcAARvWaHsAARvSMCcAARv4AwABG9Iu2wABHAIqKwABG9IvqwABHApN7wABHApofwABHApogwABHApl+wABGLpohwABHB4vQwABHCISzwABHCID/wABHCJiXwABHCJoiwABHCJojwABHCIZlwABHCJAUwABHCJokwABHB4wJwABHEQDAAEcRmiXAAEcHi7bAAEcUgn3AAEYumibAAEcWi+rAAEcXmhDAAEcXhHjAAEcXhmDAAEcXmifAAEcXmijAAEcXminAAEcXmhHAAEcXmirAAEcXmivAAEcXmizAAEcXmi3AAEcXhofAAEcWi+vAAEckAMAARi6aLsAARyaL0MAARyeaEMAARyeaL8AARyeaMMAARyeaEcAARyeaMcAARyeaMsAARyaL6sAARy6aKMAARy6aKcAARy6aLcAARyaLtsAARzKaM8AARzKaNMAARyaL68AARzUAwABGLpo1wABHN4vQwABHOJo2wABHOJo3wABHOJo4wABHOJo5wABHOJmYwABHOJo6wABHOJo7wABHOJo8wABHOJo9wABHN4wJwABHQgDAAEc3i7bAAEdEjwjAAEdEmj7AAEdEhyLAAEdEmj/AAEdEkwDAAEdEmkDAAEdEmkHAAEdEmkLAAEdEldPAAEdEmkPAAEdEgS3AAEdEmkTAAEdEmkXAAEdEmkbAAEdEmkfAAEdEmkjAAEdEmknAAEdEghrAAEc3jADAAEdXmkrAAEdXmkvAAEdXmkzAAEdXmk3AAEYumk7AAEdci9DAAEddmhHAAEddmk/AAEddmlDAAEddmhDAAEddmjLAAEdci+rAAEdjhHjAAEdjhmDAAEdjmijAAEdjminAAEdji//AAEdjmi3AAEdci7bAAEdqghrAAEdci+vAAEdsAMAARi6aUcAAR26L6sAAR2+aL8AAR2+aMMAAR2+aEMAAR2+aEcAAR2+aUsAAR2+aU8AAR2+aKMAAR2+aKcAAR2+aKsAAR2+aLcAAR26LtsAAR3qaM8AAR3qaNMAAR26L68AAR30AwABGLppUwABHf4vrwABHgADAAEYumlXAAEeCjAnAAEeDAMAARi6aVsAAR4WMCcAAR4YAwABGLppXwABHiIvqwABHiZSjwABHiZSiwABHiYbowABHiIvrwABHjQDAAEYumljAAEePi+rAAEeQmi/AAEeQhHjAAEeQkFnAAEePi+vAAEeUAMAARi6aWcAAR5aL6sAAR5eG0sAAR5eaWsAAR5aL68AAR5oAwABGLppbwABHnIvQwABHnYUFwABHnYZgwABHnIu2wABHoIJ9wABHnIvrwABHogDAAEYumlzAAEeki9DAAEelhQXAAEelmlPAAEeki7bAAEeogn3AAEeki+rAAEeqhmDAAEeki+vAAEesAMAARi6aXcAAR66L0MAAR6+aXsAAR6+aX8AAR6+aYMAAR6+aYcAAR6+ZhMAAR7SaYsAAR7SaY8AAR7SaZMAAR7SaZcAAR66LtsAAR7mVCMAAR7maZsAAR7maZ8AAR7maaMAAR66L68AAR74AwABGLoMewABHwIvQwABHwZmEwABHwpppwABHwppqwABHwpprwABHwppswABHwpptwABHwppuwABHwppvwABHwppwwABHwIu2wABHy4DjwABHy4IawABHy5CSwABHy5mEwABHz5pxwABHz5pywABHz5pzwABHz5p0wABHz5p1wABHz5p2wABHz5p3wABHz5p4wABHz5p5wABHwIvqwABH2Yp6wABHwIvrwABH2wDAAEYumnrAAEfdi9DAAEfemYTAAEffmnvAAEffmnzAAEfdi7bAAEfikJLAAEfimYTAAEfkmnHAAEfdi+vAAEfmAMAARi6afcAAR+iL0MAAR+mZhMAAR+qafsAAR+iLtsAAR+yQksAAR+yZhMAAR+6accAAR+iL68AAR/AAwABGLpp/wABH8ou2wABH85qAwABH84qKwABH85mEwABH9pqBwABH8ovrwABH+ADAAEYumoLAAEf6i9DAAEf7mYTAAEf8moPAAEf8moTAAEf8moXAAEf8mobAAEf8mofAAEf8mojAAEf8htfAAEf8dcAAR/yaicAAR/uaLMAAR/qLtsAASAeCjcAASAeA/8AASAeA48AASAeZhMAASAuaisAASAuBn8AASAuai8AASAuajMAASAuajcAASAuajsAASAuaj8AASAuakMAASAuakcAASAuaksAASAuak8AASAuMyMAASAualMAASAualcAASAualsAASAuHXsAASAual8AASAuamMAASAuamcAASAuamsAASAeG1cAASAeC6cAASAeMwMAASAeC58AASAeaE8AASAeMWcAASAeCfcAAR/qL6sAASCeaEcAASCeaEMAASCeaEsAASCeKwsAASCeFbcAASCeaDsAASCeaDcAASCeYl8AASCeaD8AAR/qMAMAASDGaEcAASDGaEMAASDGaEsAASDGKwsAASDGFbcAASDGaDsAASDGaDcAASDGYl8AASDGaD8AAR/qL68AASDsAwABGLpqbwABIPYvQwABIPpmEwABIP4RVwABIP5CmwABIP5qcwABIPYu2wABIQ4qKwABIQ5mEwABIRZqdwABIRYpywABIQ4J9wABIPYvqwABISYD/wABISYR5wABIPYvrwABITADAAEYump7AAEhOi9DAAEhPmYTAAEhQmp/AAEhQmqDAAEhOi7bAAEhTiorAAEhOi+rAAEhVk3vAAEhVmh/AAEhVmiDAAEhVmX7AAEhOi+vAAEhaAMAASFqZhMAASFyAt8AARi6aocAASF6L0MAASF+Es8AASF+A/8AASF+Yl8AASF+aIsAASF+aI8AASF+GZcAASF+aJMAASF+QFMAASF6LtsAASGiZhMAASGmaosAASGmao8AASGiCfcAASF6L68AASG0AwABIbZolwABGLodywABIcIvQwABIcZmEwABIcpRMwABIcIvqwABIdJmEwABIdZRNwABIdZROwABIdZRPwABIdZRQwABIcIu2wABIepmEwABIe47UwABIe5RRwABIcIvrwABIfgDAAEYulQDAAEiAi9DAAEiBmYTAAEiCmqTAAEiCiAPAAEiCg3fAAEiChD3AAEiAi7bAAEiHgOPAAEiHlP3AAEiHmYTAAEiKiA7AAEiKlQLAAEiHlP7AAEiHlP/AAEiHjFnAAEiAi+rAAEiQggnAAEiQgk/AAEiQg4rAAEiAi+vAAEiUAMAARi6apcAASJaL0MAASJeZhMAASJiapsAASJiap8AASJiMQcAASJeaqMAASJeaKMAASJeaqcAASJeaL8AASJeaMMAASJeEeMAASJeGYMAASJeaqsAASJaL6sAASKSaq8AASKSarMAASJaLtsAASKeCBcAASKeCGsAASJaL68AASKoAwABGLpqtwABIrIvQwABIrZmEwABIrpquwABIrpqvwABIrIvqwABIsZopwABIsZoowABIsZoswABIsZoQwABIsZoRwABIrIvrwABItwDAAEYumrDAAEi5i9DAAEi6hofAAEi6mYTAAEi8mrHAAEi8mrLAAEi8mrPAAEi8mrTAAEi5i7bAAEjBggXAAEi5i+rAAEjDhmDAAEjDmifAAEjDhHjAAEjDmivAAEjDmi3AAEjDmirAAEi5i+vAAEjKAMAARi6atcAASMyL0MAASM2ZhMAASM6SosAASM6atsAASMyL6sAASNGaU8AASNGaL8AASNGaMMAASNGaKsAASNGaKcAASNGaUsAASNGaLcAASNGZhMAASNmat8AASNmauMAASMyLtsAASNyaM8AASNyCBcAASNyaNMAASNyZhMAASOCaucAASMyL68AASOIAwABGLpYuwABI5IvQwABI5ZmEwABI5oxLwABI5pYvwABI5pYwwABI5pYxwABI5oJWwABI5pYywABI5oHUwABI5Iu2wABI7oDjwABI7oGPwABI7ov0wABI7oRRwABI7oIawABI7pmEwABI9JYzwABI9JY0wABI9JY1wABI5IvqwABI+Iv/wABI+JmEwABI+oGHwABI5IvrwABI/ADAAEYuljbAAEj+i9DAAEj/mYTAAEkAljfAAEkAljjAAEj+i+rAAEkDit/AAEj+jADAAEkFit/AAEj+i7bAAEkHg3DAAEkHg27AAEkHigPAAEkHg9LAAEj+i+vAAEkMAMAARi6ausAASQ6L0MAASQ+ZhMAASRCau8AASRCavMAASRCLgcAASRCavcAASQ+aKMAASQ6L6sAASRaaEMAASRaaEcAASRaaMsAASRaK38AASRaZhMAASRuavsAASQ6MAMAASR2aEMAASR2aEcAASR2aMsAASQ6LtsAASSGA48AASSGDcMAASSGZhMAASSSav8AASQ6L68AASSYAwABGLprAwABJKIvQwABJKZmEwABJKprBwABJKprCwABJKpqvwABJKpq2wABJKprDwABJKprEwABJKIvqwABJMZmEwABJMpq+wABJMZopwABJMZovwABJMZowwABJMZotwABJMZoxwABJKIwAwABJOZovwABJOZowwABJOZoxwABJKIu2wABJPZozwABJPZo0wABJPZmEwABJQJq/wABJQJrFwABJKIvrwABJQwDAAEYumsbAAElFi9DAAElGhHjAAElGhmDAAElGminAAElGmYTAAElKkqLAAElKmsfAAElKmsjAAElKmsnAAElKmsrAAElKmsvAAElKmszAAElKms3AAElFi+rAAElTi//AAElTmlDAAElTmk/AAElTmi3AAElFi7bAAElYghrAAElYmYTAAElams7AAElagbvAAElams/AAElamr/AAElFjADAAElfmlDAAElfmk/AAElFi+vAAEliAMAARi6a0MAASWSL0MAASWWZhMAASWaa0cAASWSLtsAASWiA48AASWiN/MAASWiCGsAASWSL68AASWwAwABGLprSwABJbovQwABJb5mEwABJcJrTwABJcJrUwABJcJYvwABJcIQ9wABJcIN3wABJcJrVwABJcJrWwABJcJrXwABJcJrYwABJcJrZwABJcJrawABJcJrbwABJcJrcwABJcJrdwABJb4bSwABJb5rewABJb5rfwABJb5rgwABJb5oQwABJb5rhwABJbou2wABJhZriwABJhYv0wABJhYIawABJhZrjwABJhZmEwABJiprkwABJiprlwABJio4XwABJiprmwABJbovqwABJj4v/wABJbowAwABJkZPwwABJbovrwABJkwDAAEYumufAAEmVi9DAAEmWgo7AAEmWmYTAAEmYhxnAAEmYmujAAEmYgN7AAEmYmunAAEmYgibAAEmYkqLAAEmYmurAAEmYmuvAAEmYmuzAAEmYmu3AAEmYmu7AAEmWhw3AAEmVi7bAAEmlN8AASaWaNMAASaWUu8AASaWCGsAASaWa78AASaWa8MAASaWa8cAASaWa8sAASZWL6sAASa6aLcAASZWL68AASbAAwABGLprzwABJsovQwABJs5r0wABJs5fKwABJsovrwABJtgDAAEYumvXAAEm4i9DAAEm5go7AAEm5isLAAEm5hW3AAEm5mvbAAEm5lx7AAEm5mYTAAEm/mvfAAEm/mvjAAEm/mvnAAEm/gk7AAEm/mvrAAEm4i+rAAEnFgk/AAEnFmvvAAEnFmvzAAEm4i7bAAEnJmv3AAEnJmYTAAEnLmv7AAEnJmv/AAEnJmwDAAEnJmwHAAEnJghrAAEnJlHzAAEm4i+vAAEnSAMAARi6bAsAASdSL0MAASdWZhMAASdabA8AASdabBMAASdabBcAASdabBsAASdabB8AASdaA3sAASdaaucAASdabCMAASdabCcAASdabCsAASdabC8AASdabDMAASdWaOsAASdWaO8AASdWaPMAASdWaPcAASdSL6sAASeeZmMAASdSMAMAASemZmMAASemaTcAASemaSsAASemaTMAASemaS8AASdSLtsAASe+PCMAASe+aPsAASe+HIsAASe+aP8AASe+TAMAASe+aQMAASe+aQcAASe+aQsAASe+V08AASe+aQ8AASe+aRcAASe+aRsAASe+BLcAASe+aRMAASe+CGsAASe+aR8AASe+aScAASe+ZhMAASgGbDcAASgGbDsAASgGbD8AASgGbEMAASgGbEcAASgGbEsAASgGbE8AASgGbFMAASgGbFcAASgGbFsAASgGbF8AASgGbGMAASgGbGcAASdSL68AASg8AwABGLpsawABKEYvrwABKEgDAAEoRi9DAAEoUmYTAAEoVlEzAAEoRi+rAAEoXmYTAAEoYlE3AAEoYlE7AAEoYlE/AAEoYlFDAAEoRi7bAAEodmYTAAEoejtTAAEoelFHAAEYumxvAAEohi9DAAEoimYTAAEojmxzAAEojmx3AAEojmx7AAEojmx/AAEojmyDAAEojhxnAAEojmrHAAEojmunAAEojP8AASiOCJsAASiObIcAASiOa7sAASiGLtsAASjCbIsAASjCUu8AASjCaNMAASjCZhMAASjSO1MAASiGL6sAASjabI8AASjaaLcAASjaZhMAASjmbJMAASjmbJcAASjmbJsAASjmbJ8AASjmUT8AASjmUUMAASiGL68AASkAAwABGLpsowABKQovrwABKQwDAAEpDi7fAAEpFhT7AAEpCi9DAAEpHmYTAAEpIlEzAAEpCi+rAAEpKmYTAAEpLlE3AAEpLlE7AAEpLlE/AAEpLlFDAAEpCi7bAAEpQmYTAAEpRjtTAAEpRlFHAAEYumynAAEpUi9DAAEpVmYTAAEpWmyrAAEpWmwrAAEpWmuvAAEpWmyvAAEpWmyzAAEpWmy3AAEpWmy7AAEpWmy/AAEpWgYfAAEpVmZbAAEpVmZnAAEpVmZfAAEpVhw3AAEpUi7bAAEpkjETAAEpkmZrAAEpkmYTAAEpnmzDAAEpnlbPAAEpnmzHAAEpnmxDAAEpnmzLAAEpnmzPAAEpnjtTAAEpkggXAAEpkghrAAEpkmZvAAEpUi+rAAEpymZjAAEpyhW3AAEpyhIzAAEpymYTAAEp2mzTAAEp2lE/AAEp2lFDAAEpUjADAAEp6mZjAAEp6mZ3AAEpUi+vAAEp9mYTAAEp+gLfAAEp9mZzAAEYumzXAAEqBi9DAAEqCmzbAAEqCmzfAAEqCmzjAAEqBi+vAAEqGAMAASoabOcAARi6YmsAASomL0MAASoqKwsAASoqFbcAASoqbOsAASoqbO8AASoqbPMAASomL6sAASpCbPcAASomL68AASpIAwABKkps5wABGLps+wABKlYvQwABKlpSjwABKlpSiwABKlobowABKlYu2wABKmpU9wABKlYvrwABKnADAAEYumz/AAEqei9DAAEqfmYTAAEqgmq7AAEqghxnAAEqei7bAAEqjggXAAEqjg3DAAEqjigPAAEqjg9LAAEqjg27AAEqjgOPAAEqjgY/AAEqji/TAAEqjlLvAAEqjhFHAAEqjghrAAEqjlIfAAEqjlIjAAEqjlInAAEqjmYTAAEqyjtTAAEqei+rAAEq0it/AAEq0i//AAEq0hW3AAEq0hIzAAEq0lKPAAEq0lKLAAEqejADAAEq7it/AAEqei+vAAEq9AMAARi6bQMAASr+L0MAASsCZhMAASsGbQcAASsCbQsAASsCbQ8AASsCbRMAASr+MCcAASsaZM8AASr+LtsAASsiCfcAASr+L68AASsoAwABGLptFwABKzIvQwABKzZtGwABKzZtHwABKzZtIwABKzZtJwABKzZtKwABKzZtLwABKzZtMwABKzZtNwABKzIvqwABK1oZ+wABKzIu2wABK2JtOwABKzIvrwABK2gDAAEYum0/AAErci9DAAErdhmDAAErci7bAAErfm1DAAErfm07AAErci+vAAEriAMAARi6bUcAASuSL0MAASuWKwsAASuWFbcAASuSLtsAASuibUMAASuibTsAASuSL68AASusAwABGLptSwABK7YvqwABK7oZ+wABK7Yu2wABK8JtOwABK8JtTwABK7YvrwABK8wDAAEYum1TAAEr1i9DAAEr2mzrAAEr2mzvAAEr1i+rAAEr5hn7AAEr1i7bAAEr7m1XAAEr7m07AAEr7m1PAAEr1i+vAAEr/AMAARi6bVsAASwGL0MAASwKbOsAASwKbO8AASwGL6sAASwWGfsAASwGLtsAASwebVcAASwebTsAASwebU8AASwGL68AASwsAwABGLptXwABLDYvQwABLDpovwABLDoR4wABLDpBZwABLDYvrwABLEgDAAEYum1jAAEsUi9DAAEsVm1nAAEsVm1rAAEsVm1vAAEsVm1zAAEsVgUjAAEsVm13AAEsVm17AAEsUi+vAAEsdAMAARi6bX8AASx+L0MAASyCbYMAASyCaYMAASyCaX8AASyCbYcAASyCbYsAASyCNpsAASyCbY8AASyCNqcAASyCbZMAASyCbZcAASyCNrMAASyCbZsAASyCbZ8AASx+L68AASy4AwABGLptowABLMIvQwABLMZtpwABLMZtqwABLMZtrwABLMZtswABLMZttwABLMZtuwABLMZtvwABLMZtwwABLMZtxwABLMZtywABLMZtzwABLMZt0wABLMZt1wABLMZt2wABLMZt3wABLMZt4wABLMZt5wABLMZt6wABLMZt7wABLMZt8wABLMZt9wABLMZt+wABLMZt/wABLMZuAwABLMZuBwABLMZduwABLMZuCwABLMZuDwABLMZuEwABLMIvrwABLTwDAAEYum4XAAEtRi9DAAEtSm4bAAEtSm1vAAEtSm1zAAEtRi+vAAEtWAMAARi6bh8AAS1iL0MAAS1mbhsAAS1mbiMAAS1mbicAAS1iL68AAS10AwABGLpuKwABLX4vQwABLYJmEwABLYYImwABLYZuLwABLYYIkwABLYZcRwABLYZuMwABLYZuNwABLX4vqwABLaIIXwABLX4u2wABLaow/wABLaoI3wABLaoIGwABLaoIHwABLaoFlwABLaoI4wABLaoI0wABLapmEwABLcpuOwABLX4vrwABLdADAAEYum4/AAEt2i9DAAEt3gYbAAEt3m5DAAEt2i7bAAEt6ggXAAEt2i+vAAEt8AMAARi6bkcAAS36L0MAAS3+ZhMAAS4CbksAAS4CEPcAAS4CDBcAAS4Cbk8AAS4A/wABLgJuUwABLgJuVwABLgJrBwABLgJuWwABLgJuXwABLgJuYwABLgJuZwABLgJuawABLgJubwABLgJqmwABLgJqHwABLgJucwABLgJudwABLgJuewABLgJufwABLgJqDwABLgJquwABLgJcNwABLgJugwABLgJuhwABLgIGHwABLgJuiwABLfowJwABLnJujwABLnJukwABLfou2wABLn4IFwABLn5ulwABLn5mEwABLoopywABLopumwABLopunwABLooJLwABLooJMwABLopuowABLopupwABLopuqwABLopurwABLopuswABLoputwABLopuuwABLopuvwABLopuwwABLopuxwABLopuywABLopuzwABLopcowABLn5u0wABLn5u1wABLfovqwABLt4S1wABLt5u2wABLt5qrwABLt5u3wABLt5oRwABLfowAwABLvZu4wABLfovrwABLv5mEwABLwIC3wABGLpu5wABLwovQwABLw5mEwABLxJu6wABLxJu7wABLxJu8wABLxJu9wABLxJs0wABLxJu+wABLxIFvwABLxIMLwABLw4GXwABLwou2wABLzpS7wABLzpmEwABL0Ju/wABLzoLjwABLzoLfwABLzoKNwABLzoLlwABLzoy0wABLzoy1wABLzoLpwABLzoxZwABLzoLnwABLzozRwABLzoMAwABLzozBwABLzow1wABLzozPwABLzozQwABLzoJ9wABLwovqwABL4pvAwABL4poWwABL4ozOwABL4oNHwABL4oLewABL4oIJwABL4oJPwABL4oOKwABLwowAwABL65oXwABLwovrwABL7QDAAEYum8HAAEvvi9DAAEvwmYTAAEvxm8LAAEvxm8PAAEvxjRvAAEvxjRzAAEvxm8TAAEvvi7bAAEv3m8XAAEv3m8bAAEv3m8fAAEv3ghrAAEv3mYTAAEv8m8jAAEv8m8nAAEv8m8rAAEv8m8vAAEv8m8zAAEv8m83AAEvvjADAAEwDmZ3AAEvvi+vAAEwFAMAARi6bzsAATAeL0MAATAiZhMAATAmHZ8AATAeL6sAATAuB7MAATAeMAMAATA2WZsAATAeLtsAATA+L6cAATA+bz8AATA+b0MAATA+aSMAATAeL68AATBQAwABGLpvRwABMFovQwABMF5mEwABMGIFwwABMGJvSwABMGJsZwABMFou2wABMHJvQwABMHJpIwABMFovrwABMHwDAAEYum9PAAEwhi9DAAEwim9TAAEwim9XAAEwim9bAAEwim9fAAEwim9jAAEwim9nAAEwim9rAAEwim9vAAEwim9zAAEwim93AAEwim97AAEwij0XAAEwim9/AAEwim+DAAEwim+HAAEwim+LAAEwim+PAAEwim+TAAEwim+XAAEwim+bAAEwim+fAAEwim+jAAEwim+nAAEwim+rAAEwij3XAAEwim+vAAEwhi+vAAEw9AMAARi6b7MAATD+L0MAATECb7cAATECb7sAATECb78AATECb8MAATECb8cAATECb8sAATECb88AATECb9MAATECb9cAATD+LtsAATEqZhMAATEub9sAATEub98AATEub+MAATD+L68AATE8AwABGLpv5wABMUYwJwABMUgDAAExRi7bAAExUm7fAAExUm/rAAEYum/vAAExXi9DAAExYm/zAAExYjwjAAExYmaLAAExYhw3AAExYm/3AAExYm/7AAExYm//AAExYl27AAExYnADAAExXi7bAAExilHzAAExighrAAExigOPAAExii/TAAExinAHAAExXjAnAAExonALAAExXi+rAAExqnAPAAExqnATAAExqnAXAAExqnAbAAExqnAfAAExqmj3AAExXjADAAExxmj3AAExXi+vAAExzAMAARi6cCMAATHWL0MAATHaFBcAATHWLtsAATHiCfcAATHWL68AATHoAwABGLpwJwABMfIvQwABMfZwKwABMfZoZwABMfZoewABMfIvrwABMgQDAAEYunAvAAEyDi9DAAEyEnAzAAEyEmhnAAEyEmh7AAEyEnA3AAEyEnA7AAEyEnA/AAEyEnBDAAEyEnBHAAEyEnBLAAEyEnBPAAEyEnBTAAEyEnBXAAEyEnBbAAEyEnBfAAEyEnBjAAEyEnBnAAEyDi+vAAEyVAMAARi6cGsAATJeL0MAATJiG08AATJeL68AATJoAwABGLpwbwABMnIvQwABMnZwcwABMnZUMwABMnIu2wABMoIJ9wABMnIvrwABMogDAAEYunB3AAEyki9DAAEylm2nAAEylnB7AAEylnB/AAEylnCDAAEylnCHAAEyll27AAEylm4PAAEylnCLAAEylnCPAAEylnCTAAEylnCXAAEylnCbAAEylmYTAAEyyP8AATLKcJ8AATLKcKMAATLKcKcAATLKDXMAATLKcKsAATLKcK8AATLKcLMAATLKcLcAATLKcLsAATLKcL8AATLKOUcAATLKcMMAATLKcMcAATLKcMsAATLKcM8AATKWcBsAATKWcB8AATKSLtsAATMWMRMAATMWBj8AATMWCGsAATMWA48AATMWZhMAATMqcNMAATMqcNcAATMqcNsAATMqcN8AATMqcOMAATMqcOcAATMqcOsAATMqcO8AATKSL68AATNMAwABGLpw8wABM1YvQwABM1pPIwABM1YvrwABM2ADAAEYunD3AAEzai9DAAEzbk8jAAEzai+vAAEzdAMAARi6cPsAATN+L0MAATOCZhMAATOGBh8AATOGcP8AATOGcQMAATN+LtsAATOWMRMAATOWZhMAATOebrMAATOecQcAATOecQsAATOecQ8AATN+L68AATOwAwABGLpxEwABM7ovQwABM75vywABM75vxwABM75vzwABM75v0wABM75xFwABM74RPwABM74PnwABM7ou2wABM95mEwABM+JxGwABM+JxHwABM95xIwABM95xJwABM7ovrwABM/QDAAEYunErAAEz/i9DAAE0AnEvAAE0AmYTAAE0CjlHAAE0CnEzAAEz/i7bAAE0FjETAAE0FgOPAAE0FgY/AAE0FghrAAE0FnE3AAE0FnE7AAEz/i+vAAE0MAMAARi6cT8AATQ6L0MAATQ+cS8AATQ+G0sAATQ+ZhMAATRKBh8AATRKCJsAATRKcUMAATRKUtsAATRKVlMAATRKBYcAATQ6LtsAATRmZhMAATRqCa8AATRqCRMAATRqCRcAATRqCXsAATRqcUcAATRqcUsAATRmL9MAATRmCGsAATRmA48AATRmcU8AATQ6L68AATSUAwABGLpxUwABNJ4vrwABNKADAAE0oi7fAAE0qhT7AAE0ni9DAAE0smYTAAE0tlEzAAE0ni+rAAE0vmYTAAE0wlE3AAE0wlE7AAE0wlE/AAE0wlFDAAE0ni7bAAE01mYTAAE02jtTAAE02lFHAAEYunFXAAE05i9DAAE06mYTAAE07nFbAAE07gYfAAE07gibAAE07hCHAAE07hxnAAE07nDDAAE07nFfAAE07nFjAAE07nFnAAE07nFrAAE07nFvAAE07nFzAAE07lLjAAE07nF3AAE07nF7AAE07nF/AAE07nDPAAE07kqLAAE06lQ/AAE06nGDAAE06nAXAAE05i7bAAE1RlHzAAE1RnGHAAE1RggXAAE1RgOPAAE1RnAHAAE1RgY/AAE1Ri/TAAE1RghrAAE1RmYTAAE1agj3AAE1ajtTAAE1anGLAAE05i+rAAE1enADAAE1enAPAAE1enATAAE1enAbAAE1enAfAAE1e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RAAAWM4AAAxMAABZMAAADFoAAFlGAAAMYAAAWVAAAAxjAABZgwAADG4AAFnNAAAMeAAAWd4AAAyAAABZ7wAADIwAAFpfAAAMlwAAWnAAAAyfAABargAADKQAAFsIAAAMtAAAWyUAAAy3AABbOQAADL0AAFuPAAAMwwAAW6EAAAzLAABbtwAADNEAAFvIAAAM2QAAW9kAAAzeAABb7gAADOMAAFwrAAAM6gAAXDMAAAztAABcOAAADPIAAFxeAAAM9wAAXH8AAAz/AABcjQAADQcAAFySAAANDAAAXPIAAA0WAABdHAAADSUAAF0qAAANLQAAXS8AAA0yAABdrgAADTwAAF3hAAANRAAAXe8AAA1MAABd9AAADVEAAF6dAAANYAAAXx4AAA1oAABfKgAADW4AAF8yAAANcQAAXzcAAA12AABfXQAADXsAAF+FAAANgwAAX80AAA2IAABf4gAADZIAAGADAAANlwAAYD4AAA2cAABgsgAADaMAAGDaAAANqwAAYQ4AAA2wAABhGwAADbMAAGEjAAANtgAAYS0AAA29AABhQQAADcQAAGGXAAANzgAAYkYAAA3WAABigQAADdsAAGKUAAAN4QAAYtQAAA3pAABi6wAADe8AAGLwAAAN9wAAYwMAAA4CAABjCAAADgUAAGNJAAAOEAAAY9IAAA4dAABj+gAADiUAAGQuAAAOKgAAZHwAAA4xAABkpAAADjkAAGTYAAAOPgAAZpMAAA5FAABmmAAADkoAAGcPAAAOVAAAZxQAAA5ZAABncwAADmAAAGd4AAAOZQAAaHgAAA52AABofQAADnsAAGjmAAAOhQAAaOsAAA6KAABpPwAADpEAAGlEAAAOlgAAankAAA6qAABqfgAADrAAAGrqAAAOtQAAau8AAA66AABq9AAADsEAAGuaAAAO0QAAa7QAAA7WAABtBQAADvAAAG0KAAAO9gAAbU0AAA8DAABtUgAADwYAAG2VAAAPEwAAbZoAAA8WAABw7gAADzsAAHECAAAPQAAAcRYAAA9FAABxiQAAD1MAAHHAAAAPZQAAcdQAAA9oAABx5QAAD3AAAHHrAAAPcwAAce4AAA94AAByDAAAD4QAAHIPAAAPhwAAcoUAAA+TAAByjAAAD5YAAHKPAAAPmwAAczQAAA+qAABzOwAAD60AAHM+AAAPsgAAc4oAAA+4AABzkQAAD7sAAHOUAAAPwAAAdDAAAA/MAAB0NwAAD88AAHQ6AAAP1AAAdH8AAA/aAAB0hQAAD+QAAHTVAAAP6QAAdNsAAA/zAAB1KwAAD/gAAHUxAAAQAgAAdYEAABAHAAB1hwAAEBEAAHXXAAAQFgAAdd0AABAgAAB2LQAAECUAAHYzAAAQLwAAdoIAABA0AAB2hQAAEDwAAHbJAAAQQQAAdswAABBJAAB3EgAAEE4AAHcgAAAQWwAAdzUAABBhAAB3OAAAEGkAAHdvAAAQbwAAd3UAABB5AAB3vwAAEH8AAHfFAAAQggAAd8gAABCHAAB36AAAEIwAAHf0AAAQlAAAd/cAABCZAAB4DQAAEJ8AAHgXAAAQrgAAeCMAABCxAAB4KgAAELQAAHhpAAAQvgAAeHoAABDGAAB4iwAAEM4AAHiXAAAQ3QAAeK4AABDgAAB5DgAAEOkAAHkfAAAQ8QAAeSsAABD5AAB5SQAAEP4AAHmSAAARBAAAeaMAABEMAAB5sgAAERQAAHm4AAARFwAAebsAABEcAAB52wAAESEAAHnnAAARKQAAefcAABEuAAB6twAAETYAAHrNAAARQQAAeusAABFOAAB7AgAAEVEAAHsfAAARVgAAeysAABFeAAB7MQAAEWEAAHs0AAARZgAAe1UAABFrAAB7YQAAEXoAAHtkAAARfQAAe6gAABGHAAB7uAAAEY8AAHvIAAARlwAAe+UAABGfAAB77wAAEacAAHv1AAARqgAAe/gAABGvAAB8FgAAEbQAAHwZAAARuQAAfCoAABG/AAB8PgAAEcIAAHxHAAARxwAAfFQAABHMAAB8cgAAEdIAAHzFAAAR2wAAfNUAABHjAAB85QAAEesAAH0CAAAR8wAAfS0AABH7AAB9OAAAEgMAAH1HAAASCwAAfU0AABIOAAB9UAAAEhMAAH18AAASGAAAfaIAABIeAAB9pQAAEiMAAH3qAAASKQAAfgEAABIsAAB+BAAAEjEAAH4bAAASNwAAfjcAABI9AAB+QAAAEkIAAH5NAAASRwAAfm0AABJNAAB+eQAAElUAAH5/AAASWAAAfoIAABJdAAB+oAAAEmIAAH61AAASbAAAftMAABJ3AAB+5QAAEoAAAH7oAAAShQAAfykAABKRAAB/YgAAEpcAAH9yAAASnwAAf4IAABKnAAB/sgAAEq8AAH/BAAAStwAAf8cAABK6AAB/ygAAEr8AAH/XAAASxAAAf9oAABLJAACAFAAAEs4AAIAXAAAS0wAAgCUAABLZAACAMgAAEtwAAIA7AAAS4QAAgEgAABLmAACAZgAAEuwAAIB0AAAS8QAAgHoAABL0AACAfQAAEvkAAICiAAATAwAAgMAAABMOAACA0gAAExcAAIDVAAATHAAAgTEAABMmAACBTgAAEy4AAIFYAAATNgAAgV4AABM5AACBYQAAEz4AAIGRAAATRgAAgZoAABNLAACBpwAAE1AAAIHFAAATVgAAggsAABNhAACCHQAAE2kAAIInAAATcQAAgioAABN5AACCOgAAE38AAIJDAAAThAAAglAAABOJAACCcQAAE48AAIJ7AAATlwAAgocAABOfAACCkAAAE6QAAIKdAAATqQAAgsYAABOvAACC0gAAE74AAILwAAATwQAAgvwAABPJAACDHQAAE9MAAIMjAAAT1gAAgyYAABPbAACDUAAAE+AAAINgAAAT5QAAg24AABPqAACDdwAAE+8AAIOEAAAT9AAAg7QAABP6AACDvwAAFAIAAIPLAAAUEQAAg84AABQUAACFcAAAFDEAAIWaAAAUNwAAh9oAABRTAACH7gAAFFYAAIjvAAAUaAAAiQMAABRtAACJDQAAFHAAAImIAAAUegAAixEAABSGAACLFgAAFI4AAItqAAAUlAAAi28AABScAACL0AAAFKYAAIvjAAAUrgAAi/sAABS2AACMCQAAFL4AAIwOAAAUxgAAjDcAABTMAACMjQAAFM8AAIyYAAAU1QAAjLIAABTYAACM3QAAFOcAAIz2AAAU6gAAjTwAABTuAACNRwAAFPYAAI50AAAVAAAAjs4AABULAACO5gAAFQ4AAI7uAAAVEQAAjwYAABUUAACPEwAAFRcAAI9rAAAVHgAAj5EAABUmAACPnAAAFSkAAI/CAAAVMQAAj9oAABU0AACRDQAAFUUAAJFHAAAVSAAAkc0AABVTAACa0wAAFZQAAJrdAAAVmgAAnHcAABWsAACdgAAAFcAAAJ65AAAV3QAAn1MAABXjAACfywAAFekAAKBeAAAV7wAApp0AABZTAACnmAAAFmUAAKhAAAAWdQAAqH0AABZ6AACopQAAFoAAAKjCAAAWgwAArDsAABaoAACsmAAAFq4AAK1GAAAWvwAArXQAABbYAACujwAAFvAAAK9MAAAXCQAAr3EAABcPAACvfQAAFxIAAK+LAAAXGwAAr68AABcmAACwbQAAFzQAALCPAAAXPwAAsJ8AABdFAACwywAAF00AALDsAAAXUgAAsPkAABdaAACxuAAAF3IAALJsAAAXegAAuFYAABgiAAC4jwAAGCoAALi6AAAYLwAAvLIAABhBAAC85AAAGEYAALznAAAYTgAAvaQAABhWAAC9zAAAGF4AAL3PAAAYYwAAvgMAABhpAAC+PQAAGHMAAL5jAAAYggAAvpAAABiFAAC+8AAAGIwAAL8JAAAYkgAAvy0AABiYAAC/UAAAGKAAAL97AAAYpQAAv7cAABi0AAC/5AAAGLcAAMBhAAAYwAAAwIkAABjIAADAjAAAGM0AAMDAAAAY0wAAwPoAABjdAADBIAAAGOwAAMFFAAAY7wAAwVwAABjyAADB4AAAGP0AAMH5AAAZAwAAwicAABkLAADCVQAAGRAAAMK1AAAZJgAAwtcAABkzAADC+QAAGTYAAMMIAAAZRgAAw4IAABlKAADDpgAAGU8AAMO/AAAZVQAAw+MAABlbAADEBgAAGWMAAMQxAAAZaAAAxHcAABl7AADEhQAAGX4AAMSZAAAZgQAAxKgAABmJAADE0gAAGY4AAMVKAAAZlwAAxXIAABmfAADFdQAAGaQAAMWpAAAZqgAAxggAABm0AADGQAAAGcYAAMZiAAAZ0wAAxoYAABnWAADGjgAAGdkAAMaRAAAZ3gAAxqkAABnjAADGtAAAGegAAMa3AAAZ7QAAxuYAABnyAADHiAAAGg0AAMeLAAAaEAAAx6EAABoWAADHtwAAGiYAAMfDAAAaKQAAyIMAABo+AADIoAAAGlMAAMjRAAAaVgAAyNQAABpbAADI6gAAGmAAAMj+AAAaYwAAyQEAABprAADJGwAAGnAAAMkeAAAadQAAyUoAABp6AADJWgAAGn8AAMllAAAahAAAyWgAABqJAADJ0QAAGo8AAMnqAAAalQAAygkAABqbAADKZgAAGqMAAMqJAAAaqwAAyrQAABqwAADK/gAAGroAAMtHAAAaxAAAy2IAABrTAADLbgAAGtYAAMuOAAAa6wAAy8IAABr4AADOHwAAGwkAAM5HAAAbEQAAzkoAABsWAADOfgAAGxwAAM7mAAAbLQAAzxMAABswAADPuwAAGzcAAM/jAAAbPwAAz+YAABtEAADQGgAAG0oAANCCAAAbWwAA0KcAABteAADQvgAAG2EAANFHAAAbagAA0WAAABtwAADRjgAAG3gAANG8AAAbfQAA0iQAABuOAADSPwAAG5sAANJhAAAbngAA0nAAABuuAADTPQAAG7IAANNlAAAbugAA02gAABu/AADTnAAAG8UAANP7AAAbzwAA1DsAABvcAADUXQAAG+kAANSBAAAb7AAA1IkAABvvAADUjAAAG/QAANSkAAAb+QAA1K8AABv+AADUsgAAHAMAANThAAAcCAAA1fcAABwOAADWHwAAHBYAANYiAAAcGwAA1lYAABwhAADWkAAAHCsAANa7AAAcOgAA1t8AABw9AADXXAAAHEYAANeEAAAcTgAA14cAABxTAADXuwAAHFkAANggAAAcbwAA2DwAABxyAADYUwAAHHUAANjXAAAcgAAA2PAAAByGAADZHgAAHI4AANlMAAAckwAA2bEAABypAADZygAAHLYAANnsAAAcuQAA2fsAABzJAADanQAAHM8AANrFAAAc1wAA2sgAABzcAADa/AAAHOIAANtbAAAc7AAA25gAABz+AADbsQAAHQsAANvVAAAdDgAA290AAB0RAADb4AAAHRYAANv4AAAdGwAA3AMAAB0gAADcBgAAHSUAANw1AAAdKgAA3l4AAB09AADeYQAAHUIAAN83AAAdSQAA33cAAB1PAADfegAAHVcAAOCMAAAdawAA4NMAAB1xAADg1gAAHXkAAODlAAAdfgAA4OgAAB2DAADhDQAAHYgAAOEtAAAdjQAA4WYAAB2YAADhkAAAHbAAAOGoAAAdwAAA4c4AAB3DAADh0QAAHckAAOHwAAAdzgAA4hIAAB3UAADiHQAAHdkAAOJAAAAd4QAA4l8AAB3mAADilgAAHfAAAOKeAAAd8wAA4rYAAB4FAADizgAAHggAAOOpAAAeDQAA48YAAB4TAADn0AAAHkgAAOfTAAAeTQAA5/gAAB5YAADn+wAAHl0AAOgEAAAeYgAA6CoAAB5nAADoLQAAHmwAAOg2AAAecQAA6OAAAB5/AADo9QAAHocAAOkKAAAejAAA6RkAAB6RAADprAAAHp4AAOmvAAAeowAA6i0AAB6uAADs3QAAHrwAAOzgAAAewQAA7OMAAB7GAADs/QAAHswAAO00AAAe0gAA7TcAAB7aAADtcQAAHuAAAO10AAAe6AAA7XcAAB7tAADtkQAAHvMAAO2jAAAe+QAA7a4AAB7+AADtsQAAHwQAAO3BAAAfCgAA7csAAB8QAADt1QAAHxYAAO3lAAAfHAAA7fAAAB8hAADt8wAAHyYAAO32AAAfLAAA7hEAAB8yAADuFAAAHzcAAO4pAAAfPQAA7jMAAB9DAADumwAAH1QAAO6tAAAfXgAA7tgAAB9jAADu9QAAH2sAAO8QAAAfcQAA7yIAAB90AADvPgAAH3oAAO9KAAAffQAA71kAAB+AAADvhAAAH4oAAO+nAAAfkgAA78kAAB+XAADwAgAAH6sAAPAdAAAfrgAA8CwAAB+zAADwcwAAH7kAAPCDAAAfvwAA8IYAAB/FAADwmgAAH8sAAPCdAAAf0wAA8LgAAB/ZAADwyAAAH94AAPDLAAAf5AAA8O0AAB/qAADw+AAAH/AAAPEXAAAf8wAA8ToAAB/7AADxUgAAIAoAAPFfAAAgDQAA8WIAACASAADxhAAAIBgAAPGHAAAgHQAA8ZYAACAjAADyDQAAIC0AAPIQAAAgNQAA8h8AACA7AADyIgAAIEEAAPI6AAAgRwAA8kkAACBWAADyZwAAIFkAAPJ9AAAgYQAA8owAACBpAADytQAAIG4AAPK4AAAgcwAA8s4AACB5AADy/QAAIIYAAPMAAAAgiwAA8xYAACCRAADzNwAAIJ0AAPM6AAAgoAAA81UAACCmAADzawAAIKwAAPNzAAAgrwAA85wAACC7AADznwAAIL4AAPO6AAAgxAAA89AAACDKAADz2AAAIM0AAPRpAAAg2gAA9I0AACDfAAD01wAAIOYAAPT0AAAg6wAA9PcAACDwAAD1XgAAIQAAAPWWAAAhCAAA9bYAACENAAD15AAAIRUAAPX+AAAhGgAA9hAAACEiAAD2EwAAIScAAPY5AAAhLQAA9noAACE0AAD2fQAAITkAAPadAAAhPwAA9rIAACFHAAD2xgAAIUwAAPcnAAAhUgAA9yoAACFYAAD3SQAAIV4AAPd8AAAhZQAA950AACF1AAD3ygAAIXoAAPfiAAAhiQAA9+UAACGMAAD4GAAAIZIAAPgtAAAhoQAA+JsAACGlAAD4ngAAIasAAPi9AAAhsQAA+OEAACG2AAD5BQAAIbsAAPk4AAAhwgAA+X8AACHKAAD5ggAAIc8AAPnyAAAh3wAA+hAAACHkAAD6PgAAIewAAPpYAAAh8QAA+moAACH5AAD6bQAAIf4AAPqTAAAiBAAA+pYAACIJAAD6pQAAIg8AAPrrAAAiFgAA+u4AACIbAAD7DQAAIiEAAPtVAAAiLQAA+18AACIzAAD7tQAAIjkAAPvXAAAiQwAA/EcAACJKAAD8SgAAIlAAAPxrAAAiVgAA/G4AACJcAAD8fwAAImIAAPyWAAAiagAA/LoAACJ4AAD8ygAAInsAAP0UAAAifgAA/R4AACKEAAD9KAAAIooAAP1wAAAijwAA/XoAACKVAAD9hAAAIpsAAP5hAAAioAAA/mQAACKlAAD+cwAAIqsAAP7SAAAivAAA/uYAACLCAAD+6QAAIsoAAQCPAAAi2AABAKwAACLeAAEAyQAAIuMAAQDnAAAi6QABAPMAACLsAAEFoQAAIvYAAQWkAAAi+wABBacAACMAAAEFwQAAIwUAAQX4AAAjCwABBfsAACMTAAEGNQAAIxkAAQY4AAAjIQABBjsAACMmAAEGVQAAIywAAQZnAAAjMQABBnIAACM2AAEGdQAAIzwAAQaFAAAjQgABBo8AACNHAAEGmQAAI00AAQapAAAjUgABBrQAACNXAAEGtwAAI1wAAQa6AAAjYgABBtUAACNoAAEG2AAAI20AAQbtAAAjcgABBvcAACN4AAEHXwAAI4cAAQdxAAAjkQABB5wAACOWAAEHuQAAI54AAQfUAAAjpAABB+YAACOnAAEIAgAAI60AAQgOAAAjsAABCB0AACOzAAEISAAAI70AAQhrAAAjxQABCI0AACPKAAEIxgAAI94AAQjhAAAj4QABCPAAACPmAAEJNwAAI+wAAQlHAAAj8gABCUoAACP4AAEJXgAAI/4AAQlhAAAkBgABCXwAACQLAAEJjAAAJBAAAQmPAAAkFgABCbEAACQcAAEJvAAAJCEAAQnbAAAkJAABCf4AACQsAAEKFgAAJDsAAQojAAAkPgABCiYAACRDAAEKSAAAJEkAAQpLAAAkTgABCloAACRUAAEK0QAAJF4AAQrUAAAkZgABCuMAACRrAAEK5gAAJHEAAQr+AAAkdwABCw0AACSGAAELKwAAJIkAAQtBAAAkkQABC1AAACSZAAELeQAAJJ4AAQt8AAAkowABC5IAACSoAAELwQAAJLUAAQvEAAAkugABC9oAACTAAAEL+wAAJMwAAQv+AAAkzwABDBkAACTVAAEMLwAAJNoAAQw3AAAk3QABDGAAACTpAAEMYwAAJOwAAQx+AAAk8gABDJQAACT3AAEMnAAAJPoAAQ0tAAAlBwABDVEAACUMAAENmwAAJRMAAQ24AAAlGAABDbsAACUdAAEOIgAAJS0AAQ5aAAAlNQABDnoAACU6AAEOqAAAJUIAAQ7CAAAlRwABDtQAACVPAAEO1wAAJVQAAQ79AAAlWgABDz4AACVhAAEPQQAAJWYAAQ9hAAAlbAABD3YAACV0AAEPigAAJXkAAQ/rAAAlfwABD+4AACWFAAEQDQAAJYsAARBAAAAlkgABEGEAACWhAAEQjgAAJaYAARCmAAAltQABEKkAACW4AAEQ3AAAJb4AARDxAAAlzQABEV8AACXRAAERYgAAJdcAARGBAAAl3QABEaUAACXiAAERyQAAJecAARH8AAAl7gABEkMAACX1AAESRgAAJfoAARK2AAAmCgABEtQAACYPAAETAgAAJhcAARMcAAAmHAABEy4AACYkAAETMQAAJikAARNXAAAmLwABE1oAACY0AAETaQAAJjoAAROvAAAmQQABE7IAACZGAAET0QAAJkwAARQZAAAmWAABFCMAACZeAAEUeQAAJmQAARSbAAAmbgABFQsAACZ1AAEVDgAAJnsAARUvAAAmgQABFTIAACaHAAEVQwAAJo0AARVaAAAmlQABFX4AACajAAEVjgAAJqYAARXYAAAmqQABFeIAACavAAEV7AAAJrQAARY0AAAmuQABFj4AACa/AAEWSAAAJsQAARc3AAAmzAABFzoAACbRAAEXSQAAJtYAAReoAAAm5wABF7wAACbtAAEXvwAAJvUAARrdAAAnDQABGuAAACcSAAEa4wAAJxcAARr9AAAnHAABGzQAACciAAEbNwAAJyoAARtxAAAnMAABG3QAACc4AAEbdwAAJz0AARuRAAAnQwABG6MAACdIAAEbrgAAJ00AARuxAAAnUwABG8EAACdZAAEbywAAJ14AARvVAAAnZAABG+UAACdpAAEb8AAAJ24AARvzAAAncwABG/YAACd5AAEcEQAAJ38AARwUAAAnhAABHCkAACeJAAEcMwAAJ48AARybAAAnngABHK0AACeoAAEc2AAAJ60AARz1AAAntQABHRAAACe7AAEdIgAAJ74AAR0+AAAnxAABHUoAACfHAAEdWQAAJ8oAAR2EAAAn1AABHacAACfcAAEdyQAAJ+EAAR4CAAAn9QABHh0AACf4AAEeLAAAJ/0AAR5zAAAoAwABHoMAACgJAAEehgAAKA8AAR6aAAAoFQABHp0AACgdAAEeuAAAKCIAAR7IAAAoJwABHssAACgtAAEe7QAAKDMAAR74AAAoOAABHxcAACg7AAEfOgAAKEMAAR9SAAAoUgABH18AAChVAAEfYgAAKFoAAR+EAAAoYAABH4cAAChlAAEflgAAKGsAASANAAAodQABIBAAACh9AAEgHwAAKIIAASAiAAAoiAABIDoAACiOAAEgSQAAKJ0AASBnAAAooAABIH0AACioAAEgjAAAKLAAASC1AAAotQABILgAACi6AAEgzgAAKL8AASD9AAAozAABIQAAACjRAAEhFgAAKNcAASE3AAAo4wABIToAACjmAAEhVQAAKOwAASFrAAAo8QABIXMAACj0AAEhnAAAKQAAASGfAAApAwABIboAACkJAAEh0AAAKQ4AASHYAAApEQABImkAACkeAAEijQAAKSMAASLXAAApKgABIvQAACkvAAEi9wAAKTQAASNeAAApRAABI5YAAClMAAEjtgAAKVEAASPkAAApWQABI/4AACleAAEkEAAAKWYAASQTAAApawABJDkAAClxAAEkegAAKXgAASR9AAApfQABJJ0AACmDAAEksgAAKYsAASTGAAApkAABJScAACmWAAElKgAAKZwAASVJAAApogABJXwAACmpAAElnQAAKbgAASXKAAApvQABJeIAACnMAAEl5QAAKc8AASYYAAAp1QABJi0AACnkAAEmmwAAKegAASaeAAAp7gABJr0AACn0AAEm4QAAKfkAAScFAAAp/gABJzgAACoFAAEnfwAAKgwAASeCAAAqEQABJ/IAACohAAEoEAAAKiYAASg+AAAqLgABKFgAACozAAEoagAAKjsAAShtAAAqQAABKJMAACpGAAEolgAAKksAASilAAAqUQABKOsAACpYAAEo7gAAKl0AASkNAAAqYwABKVUAACpvAAEpXwAAKnUAASm1AAAqewABKdcAACqFAAEqRwAAKowAASpKAAAqkgABKmsAACqYAAEqbgAAKp4AASp/AAAqpAABKpYAACqsAAEqugAAKroAASrKAAAqvQABKxQAACrAAAErHgAAKsYAASsoAAAqywABK3AAACrQAAEregAAKtYAASuEAAAq2wABLHMAACrjAAEsdgAAKugAASyFAAAq7QABLOQAACr+AAEs+AAAKwQAASz7AAArDAABMTwAACtEAAExRgAAK0kAATFQAAArTwABMVoAACtUAAExZAAAK1kAATGaAAArYQABM1MAACuPAAEzZAAAK5QAATNuAAArmgABM4sAACufAAEznQAAK6QAATOlAAArpwABM6gAACusAAEztwAAK7EAATPJAAArtwABM8wAACu/AAEz2wAAK8QAATPzAAArzgABM/0AACvUAAE0AAAAK9kAATQPAAAr3wABNCIAACvkAAE0JQAAK+wAATQ0AAAr8QABNEYAACv9AAE0VwAALAAAATRaAAAsBQABNGkAACwLAAE0gwAALBcAATgIAAAsYgABOCAAACxsAAE4egAALH0AATi5AAAsigABONUAACyQAAE46wAALJgAATkVAAAsnwABOTsAACymAAE6GAAALMUAATo1AAAszQABOl4AACzZAAE6egAALN8AATqNAAAs5wABOqwAACzuAAE/iAAALU0AAT+TAAAtUgABP6sAAC1fAAE/9AAALWsAAUAWAAAteAABQJEAAC19AAFAwgAALYIAAUDjAAAtigABQRQAAC2QAAFBNQAALZgAAUE4AAAtngABQXAAAC2kAAFBcwAALawAAUHeAAAtwgABQg0AAC3IAAFCFQAALcsAAUIYAAAt0AABQjAAAC3YAAFCRAAALdsAAUJqAAAt6wABQngAAC3xAAFCkgAALfsAAUKkAAAt/gABQqwAAC4BAAFCrwAALgYAAULYAAAuCwABQv0AAC4UAAFDFQAALhoAAUMtAAAuIAABQ0UAAC4mAAFDdwAALi4AAUOFAAAuOwABQ5gAAC4+AAFDoAAALkEAAUOjAAAuRgABQ+oAAC5PAAFD8gAALlIAAUP1AAAuVwABRA0AAC5fAAFEEAAALmIAAUQkAAAuaAABREMAAC5xAAFERgAALnQAAURaAAAuegABRG0AAC6AAAFEdQAALoMAAUR4AAAuiAABRJAAAC6QAAFEngAALpYAAUSsAAAunAABRMQAAC6fAAFEzwAALq4AAUTsAAAutgABRPoAAC7DAAFGFAAALt4AAUYoAAAu4wABRnAAAC7pAAFGpAAALvAAAUanAAAu+AABRrYAAC79AAFGuQAALwIAAUblAAAvCAABRugAAC8QAAFG+AAALxYAAUcLAAAvIwABRxUAAC8pAAFHGAAALy8AAUcqAAAvPAABRzwAAC8/AAFHSAAAL0kAAUdUAAAvTAABR2QAAC9ZAAFHbAAAL1wAAUdvAAAvYgABSFIAAC90AAFIfwAAL4IAAUiCAAAvhwABSUsAAC+QAAFJjAAAL5sAAUsbAAAvtwABSz4AAC+/AAFNgwAAL9wAAU2dAAAv5AABTgsAAC/rAAFOLQAAL/IAAU5JAAAv+QABTmEAADAAAAFOggAAMAcAAU6kAAAwEwABTsAAADAZAAFO1gAAMCEAAVDBAAAwMQABURQAADBBAAFRZgAAMEcAAVGsAAAwUQABUecAADBYAAFSIgAAMF4AAVTeAAAwdAABVQEAADB8AAFWIwAAMIoAAVYyAAAwkgABVk0AADCbAAFWdgAAMKUAAVcmAAAwtAABV0UAADC8AAFXpQAAMNQAAVfIAAAw2QABV9cAADDeAAFX2gAAMOMAAVgKAAAw6wABWHQAADD1AAFYgwAAMP0AAVi0AAAxAgABWNAAADEHAAFZBgAAMQwAAVk4AAAxFgABWUcAADEeAAFZZgAAMS4AAVmlAAAxMwABWcEAADE4AAFZ0AAAMT0AAVnTAAAxQgABWh4AADFKAAFaNAAAMU8AAVqiAAAxXAABWroAADFhAAFa3gAAMWkAAVrtAAAxcQABWvAAADF2AAFbKQAAMXsAAVtQAAAxgwABW18AADGIAAFbYgAAMY0AAVtlAAAxlQABW58AADGaAAFbtQAAMaoAAVwBAAAxrwABXBAAADG0AAFcEwAAMbkAAVwWAAAxvgABXCsAADHGAAFcRQAAMc4AAVx3AAAx0wABXIYAADHbAAFciQAAMeAAAVzHAAAx5gABXNYAADHrAAFc/wAAMfAAAV0eAAAx+AABXSEAADIAAAFdTgAAMgYAAV1dAAAyCwABXWAAADIQAAFdYwAAMhgAAV3FAAAyIgABXdQAADInAAFeFwAAMjwAAV42AAAyTAABXlIAADJaAAFgswAAMm8AAWEqAAAyegABYUcAADJ/AAFhfwAAMoQAAWH/AAAyjwABYj0AADKUAAFiYgAAMpwAAWJlAAAypAABYroAADKrAAFi1AAAMrAAAWL9AAAyuAABYxcAADK9AAFjKgAAMsIAAWNCAAAyygABY2sAADLSAAFjiwAAMtgAAWOtAAAy4AABY80AADLoAAFj9AAAMvAAAWQZAAAy+AABZDgAADMAAAFkbwAAMwUAAWSuAAAzDAABZOwAADMRAAFlBgAAMxYAAWUwAAAzHgABZYMAADMrAAFlkgAAMzIAAWW8AAAzOQABZi4AADNFAAFmPQAAM0wAAWZnAAAzUwABZq4AADNbAAFm0AAAM2IAAWbTAAAzZwABZtYAADNsAAFm2QAAM3EAAWcNAAAzeAABZ0oAADOAAAFnZAAAM4gAAWeEAAAzjwABZ58AADOUAAFn5QAAM5sAAWgDAAAzoAABaGUAADOoAAFofwAAM60AAWi8AAAztQABaN0AADO9AAFo+wAAM8QAAWmlAAAz1gABaagAADPeAAFp/AAAM+MAAWn/AAAz6wABalEAADPwAAFvBgAANA8AAW8JAAA0FQABcToAADQfAAFxWAAANCcAAXLvAAA0RAABcxsAADRUAAFzHgAANFkAAXM6AAA0YgABc4YAADRsAAFztAAANHQAAXSpAAA0kAABdLMAADSYAAF3HgAANKwAAXc4AAA0tAABd1IAADS5AAF31AAANL8AAXgCAAA0xwABeC0AADTPAAF4ggAANNcAAXiyAAA03wABeNMAADTnAAF49QAANO8AAXkpAAA09AABeUMAADT5AAF5gQAANP4AAXm2AAA1AwABeesAADUIAAF6IAAANQ0AAXpVAAA1EgABenoAADUXAAF6lQAANRwAAXqwAAA1IQABessAADUmAAF65QAANS8AAXsPAAA1NAABeyQAADU7AAF7TgAANUEAAXtzAAA1SQABe54AADVRAAF7wAAANVkAAXv0AAA1XgABfA4AADVjAAF8KQAANWgAAXxGAAA1bQABfGIAADV1AAF8fgAANXoAAXyiAAA1ggABfR8AADWIAAF9MgAANZAAAX03AAA1lgABfVgAADWcAAF9iwAANaYAAX2QAAA1qwABfc4AADW4AAF90wAANb0AAX4sAAA1xAABfjEAADXMAAF+VwAANdcAAX5cAAA12gABfoIAADXgAAF+hwAANeUAAX7ZAAA17AABfvgAADX0AAF/QgAANfkAAX93AAA2AQABf4UAADYEAAF/2wAANgkAAYBmAAA2EgABgKgAADYcAAGA3QAANiYAAYEWAAA2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GgAARuMAAf4pAABG6QAB/joAAEbuAAH+jQAARvUAAf6QAABG+gAB/pMAAEb/AAH+lgAARwUAAf6+AABHFAAB/s4AAEcXAAH+2AAARxwAAf7oAABHIgAB/y0AAEcmAAH/TwAARy4AAf9nAABHMwAB/2oAAEc7AAH/mgAAR0AAAgAUAABHSAACAEUAAEdNAAIAcwAAR1AAAgCCAABHWAACAJIAAEddAAIAlQAAR2UAAgCYAABHagACAJsAAEdvAAIA3AAAR3UAAgDfAABHegACAP8AAEeAAAIBDgAAR4gAAgEeAABHjQACASEAAEeVAAIBJAAAR5oAAgEnAABHnwACAWgAAEelAAIBawAAR6oAAgGpAABHtQACAhIAAEe+AAICKAAAR8EAAgI2AABHxAACAkkAAEfHAAICYQAAR9MAAgJkAABH1gACAncAAEfcAAICmQAAR+gAAgKcAABH6wACAq8AAEfxAAIDAwAAR/gAAgMGAABH/QACAyEAAEgFAAIDcwAASAoAAgN2AABIDwACA80AAEgWAAID0AAASBsAAgQnAABIIgACBCoAAEgnAAIGtAAASGoAAgc3AABIeAACB6sAAEiGAAIHrgAASIsAAggNAABIkAACCTkAAEigAAIJPAAASKUAAglLAABIqgACCWQAAEivAAIJiQAASLcAAgmMAABIvAACCZsAAEjBAAIJ1QAASMcAAgnrAABIzAACCe4AAEjUAAIKBgAASNkAAgoOAABI3AACChEAAEjhAAIKIAAASOYAAgo0AABI6wACCoAAAEj1AAIKwAAASQIAAgrjAABJCAACCvcAAEkQAAILWwAASSMAAgviAABJNgACC+8AAElBAAIL8gAASUkAAgv1AABJTgACDCUAAElXAAIMNgAASWYAAgyMAABJcwACDP0AAEmDAAINPgAASZYAAg1qAABJoQACDW0AAEmmAAIOMwAAScUAAg5AAABJ0AACDkMAAEnYAAIORgAASd0AAg52AABJ5gACDocAAEn1AAIOzQAASfkAAg7aAABKBAACDt0AAEoMAAIO4AAAShEAAg8WAABKFwACDycAAEomAAIPhAAASiwAAg+xAABKPwACD7QAAEpHAAIP9QAASk0AAhAEAABKVQACECEAAEpbAAIQQwAASmAAAhDuAABKdQACEWgAAEqEAAIRoQAASowAAhHnAABKkQACEf4AAEqYAAISRwAASp0AAhKIAABKpAACE5MAAErKAAITqQAASs8AAhO4AABK1wACE9UAAErdAAIT9wAASuIAAhSmAABK7wACFKkAAEr3AAIWdAAASzIAAhasAABLOwACGF0AAEtLAAIb9wAAS2MAAh/oAABLhgACIE0AAEuYAAIgXQAAS5sAAiBxAABLqAACIJcAAEurAAIg4gAAS7gAAiEPAABLuwACIhoAAEvMAAIiHQAAS9EAAiQOAABL3wACJCUAAEvnAAIkRAAAS+8AAiSPAABL9wACJKEAAEwBAAIkzgAATAYAAiTmAABMDwACJQcAAEwSAAIlPAAATBcAAiVVAABMHgACJXkAAEwhAAIlnQAATCYAAiWgAABMLgACJaMAAEwzAAImfwAATDoAAiaYAABMRAACJ54AAExWAAInugAATFsAAifWAABMYAACJ/IAAExlAAIo9wAATG4AAikhAABMdgACLOUAAEyEAAItJAAATI8AAjSHAABMpgACNIwAAEyrAAI01QAATLAAAjVHAABMuQACNVMAAEy8AAI17QAATMkAAjXyAABMzgACNfcAAEzTAAI2OwAATNgAAjZOAABM3QACNoIAAEzlAAI3dwAATOgAAjd8AABM7QACQScAAE1uAAJBPQAATXYAAkFZAABNfgACQWgAAE2GAAJBkgAATYwAAkGoAABNkgACQeUAAE2aAAJCAwAATZ8AAkIGAABNpwACQk4AAE2vAAJCmAAATbcAAkLBAABNxQACQtkAAE3NAAJC7wAATdgAAkM9AABN3gACQ0AAAE3mAAJDQwAATekAAkNYAABN7wACQ1sAAE30AAJDfAAATfwAAkOJAABOAgACQ6UAAE4KAAJDvAAAThAAAkO/AABOFQACRBoAAE4mAAJEMAAATjEAAkSqAABOOQACRNAAAE5BAAJFEQAATlEAAkVSAABOVgACRXgAAE5eAAJFswAATmgAAkZNAABObQACRoQAAE51AAJGhwAATn0AAkjsAABOmgACSO8AAE6iAAJJEQAATqoAAkkUAABOrwACSaoAAE69AAJJxAAATsMAAkqjAABO3gACSsgAAE7kAAJK6wAATuwAAkvMAABO9wACS+YAAE7/AAJL+QAATwcAAkwxAABPDQACTJoAAE8WAAJMtAAATx4AAkzHAABPJgACTPoAAE8sAAJOVgAATzwAAk5wAABPRAACToMAAE9MAAJOuwAAT1IAAk8kAABPWwACTz4AAE9jAAJPUQAAT2sAAk+EAABPcQACUOAAAE+BAAJQ+gAAT4kAAlENAABPkQACUUUAAE+XAAJRrgAAT6AAAlHIAABPqAACUdsAAE+wAAJSDgAAT7YAAlNqAABPxgACU4QAAE/OAAJTlwAAT9YAAlPPAABP3AACVDgAAE/lAAJUUgAAT+0AAlRlAABP9QACVJgAAE/7AAJVdwAAUA8AAlWVAABQFQACVckAAFAaAAJVzgAAUB8AAlXdAABQJQACV4UAAFAzAAJXkgAAUDkAAlgFAABQQwACWBIAAFBIAAJY4gAAUFAAAlj8AABQWAACWQ8AAFBgAAJZRwAAUGYAAlmwAABQbwACWcoAAFB3AAJZ3QAAUH8AAloQAABQhQACWu8AAFCZAAJbDQAAUJ8AAltBAABQpAACW0YAAFCpAAJbVQAAUK8AAlz9AABQvQACXQoAAFDDAAJdfQAAUM0AAl2KAABQ0gACXk4AAFDaAAJeaAAAUOIAAl57AABQ6gACXrMAAFDwAAJfHAAAUPgAAl82AABRAAACX0kAAFEIAAJffAAAUQ4AAmCKAABRHgACYJcAAFEjAAJhCgAAUS0AAmEXAABRMgACYdcAAFE6AAJh8QAAUUIAAmIEAABRSgACYjwAAFFQAAJipQAAUVgAAmK/AABRYAACYtIAAFFoAAJjBQAAUW4AAmQTAABRfgACZCAAAFGDAAJkkwAAUY0AAmSgAABRkgACZWAAAFGaAAJlegAAUaIAAmWNAABRqgACZcUAAFGwAAJmLgAAUbgAAmZIAABRwAACZlsAAFHIAAJmjgAAUc4AAmeRAABR3AACZ54AAFHhAAJoEQAAUesAAmgeAABR8AACaN4AAFH4AAJo+AAAUgAAAmkLAABSCAACaUMAAFIOAAJprAAAUhYAAmnGAABSHgACadkAAFImAAJqDAAAUiwAAmsPAABSOgACaxwAAFI/AAJrjwAAUkkAAmucAABSTgACbHoAAFJeAAJskAAAUmYAAmysAABSbgACbLsAAFJ2AAJs5QAAUnwAAmz7AABSggACbTgAAFKKAAJtVgAAUo8AAm1ZAABSlwACbaEAAFKfAAJt7wAAUqcAAm4YAABStQACbjAAAFK9AAJuRgAAUsgAAm6UAABSzgACbpcAAFLWAAJumgAAUtkAAm6vAABS3wACbrIAAFLkAAJu0wAAUuwAAm7gAABS8gACbvwAAFL6AAJvEwAAUwAAAm8WAABTBQACb3EAAFMWAAJviwAAUyEAAnAbAABTKQACcEkAAFMxAAJwmAAAU0QAAnDnAABTSQACcRUAAFNRAAJxXAAAU1wAAnISAABTYQACclUAAFNpAAJyWgAAU3EAAnVJAABTjwACdU4AAFOXAAJ1dgAAU6AAAnV7AABTpQACdi0AAFOzAAJ2TQAAU7kAAnahAABTywACd1wAAFPZAAJ3iwAAU98AAne2AABT5wACeKEAAFPyAAJ4uwAAU/oAAnjOAABUAgACeQYAAFQIAAJ5bwAAVBEAAnmJAABUGQACeZwAAFQhAAJ5zwAAVCcAAnrSAABUNQACet8AAFQ7AAJ7UgAAVEYAAntfAABUSwACfCsAAFRTAAJ8RQAAVFsAAnxYAABUYwACfJAAAFRpAAJ8+QAAVHIAAn0TAABUegACfSYAAFSCAAJ9WQAAVIgAAn5cAABUlgACfmkAAFScAAJ+3AAAVKcAAn7pAABUrAACf9UAAFS8AAJ/7wAAVMQAAoARAABUzAACgCQAAFTUAAKAVgAAVNoAAoB0AABU4AACgL8AAFToAAKA5QAAVO0AAoDqAABU9QACgUIAAFT9AAKBpAAAVQUAAoGpAABVDQACgdcAAFUWAAKB8wAAVR4AAoIPAABVKQACgmsAAFUvAAKCcAAAVTcAAoJ1AABVOgACgowAAFVAAAKCkQAAVUUAAoKkAABVSgACgrgAAFVQAAKCxwAAVVYAAoLaAABVWwACgukAAFVhAAKDBgAAVWcAAoMLAABVbAACgx4AAFVxAAKDegAAVYAAAoOWAABViwACg+0AAFWRAAKEIAAAVZcAAoROAABVnwAChGwAAFWtAAKEnQAAVbUAAoTsAABVugAChRoAAFXCAAKFOAAAVcoAAoVOAABVzwAChWEAAFXVAAKGEwAAVdoAAoZWAABV4gAChlsAAFXqAAKJNAAAVggAAok5AABWEAACiWEAAFYZAAKJZgAAVh4AAooWAABWLAACijYAAFYyAAKKiAAAVkMAAotBAABWUQACi3AAAFZXAAKLmwAAVl8AAoyEAABWagACjJ4AAFZyAAKMsQAAVnoAAozpAABWgAACjVAAAFaJAAKNagAAVpEAAo19AABWmQACjbAAAFafAAKOsQAAVq0AAo6+AABWswACjy8AAFa+AAKPPAAAVsMAApAoAABW0wACkEIAAFbbAAKQZAAAVuMAApB3AABW6wACkKkAAFbxAAKQxwAAVvcAApESAABW/wACkTgAAFcEAAKRPQAAVwwAApGVAABXFAACkfcAAFccAAKR/AAAVyQAApIqAABXLQACkkYAAFc1AAKSYgAAV0AAApK+AABXRgACksMAAFdOAAKSyAAAV1EAApLfAABXVwACkuQAAFdcAAKS9wAAV2EAApMLAABXZwACkxoAAFdtAAKTLQAAV3IAApM8AABXeAACk1kAAFd+AAKTXgAAV4MAApNxAABXiAACk80AAFeXAAKT6QAAV6IAApRAAABXqAAClHMAAFeuAAKUoQAAV7YAApS/AABXxAAClPAAAFfMAAKVPwAAV9EAApVtAABX2QAClYsAAFfhAAKVoQAAV+YAApW0AABX7AAClmYAAFfxAAKWqQAAV/kAApauAABYAQACmYcAAFgfAAKZjAAAWCcAApm0AABYMAACmbkAAFg1AAKaaQAAWEMAApqJAABYSQACmtsAAFhaAAKblAAAWGgAApvDAABYbgACm+4AAFh2AAKc1wAAWIEAApzxAABYiQACnQQAAFiRAAKdPAAAWJcAAp2jAABYoAACnb0AAFioAAKd0AAAWLAAAp4DAABYtgACnwQAAFjEAAKfEQAAWMoAAp+CAABY1QACn48AAFjaAAKgewAAWOoAAqCVAABY8gACoLcAAFj6AAKgygAAWQIAAqD8AABZCAACoRoAAFkOAAKhZQAAWRYAAqGLAABZGwACoZAAAFkjAAKh6AAAWSsAAqJKAABZMwACok8AAFk7AAKifQAAWUQAAqKZAABZTAACorUAAFlXAAKjEQAAWV0AAqMWAABZZQACoxsAAFloAAKjMgAAWW4AAqM3AABZcwACo0oAAFl4AAKjXgAAWX4AAqNtAABZhAACo4AAAFmJAAKjjwAAWY8AAqOsAABZlQACo7EAAFmaAAKjxAAAWZ8AAqQgAABZrgACpDwAAFm5AAKkkwAAWb8AAqTGAABZxQACpPQAAFnNAAKlEgAAWdsAAqVDAABZ4wACpZIAAFnoAAKlwAAAWfAAAqXeAABZ+AACpfQAAFn9AAKmBwAAWgMAAqa5AABaCAACpvwAAFoQAAKnAQAAWhgAAqnaAABaNgACqd8AAFo+AAKqBwAAWkcAAqoMAABaTAACqrwAAFpaAAKq3AAAWmAAAqsuAABacQACq+cAAFp/AAKsFgAAWoUAAqxBAABajQACrSoAAFqYAAKtRAAAWqAAAq1XAABaqAACrY8AAFquAAKt9gAAWrcAAq4QAABavwACriMAAFrHAAKuVgAAWs0AAq9XAABa2wACr2QAAFrhAAKv1QAAWuwAAq/iAABa8QACsKIAAFr5AAKwvAAAWwEAArDPAABbCQACsQcAAFsPAAKxcAAAWxgAArGKAABbIAACsZ0AAFsoAAKx0AAAWy4AArMhAABbPAACszsAAFtEAAKzTgAAW0wAArOGAABbUgACs+8AAFtbAAK0CQAAW2MAArQcAABbawACtE8AAFtxAAK1qwAAW4EAArXFAABbiQACtdgAAFuRAAK2EAAAW5cAArZ5AABboAACtpMAAFuoAAK2pgAAW7AAArbZAABbtgACuCkAAFvGAAK4QwAAW84AArhWAABb1gACuI4AAFvcAAK49wAAW+UAArkRAABb7QACuSQAAFv1AAK5VwAAW/sAArplAABcCwACunIAAFwRAAK65QAAXBsAArryAABcIAACu7IAAFwoAAK7zAAAXDAAArvfAABcOAACvBcAAFw+AAK8gAAAXEcAAryaAABcTwACvK0AAFxXAAK84AAAXF0AAr3uAABcbQACvfsAAFxzAAK+bgAAXH0AAr57AABcggACvzsAAFyKAAK/VQAAXJIAAr9oAABcmgACv6AAAFygAALACQAAXKgAAsAjAABcsAACwDYAAFy4AALAaQAAXL4AAsF3AABczgACwYQAAFzTAALB9wAAXN0AAsIEAABc4gACwsQAAFzqAALC3gAAXPIAAsLxAABc+gACwykAAF0AAALDkgAAXQgAAsOsAABdEAACw78AAF0YAALD8gAAXR4AAsUAAABdLgACxQ0AAF0zAALFgAAAXT0AAsWNAABdQgACxk0AAF1KAALGZwAAXVIAAsZ6AABdWgACxrIAAF1gAALHGwAAXWgAAsc1AABdcAACx0gAAF14AALHewAAXX4AAsh+AABdjAACyIsAAF2RAALI/gAAXZsAAskLAABdoAACycsAAF2oAALJ5QAAXbAAAsn4AABduAACyjAAAF2+AALKmQAAXcYAAsqzAABdzgACysYAAF3WAALK+QAAXdwAAsv8AABd6gACzAkAAF3vAALMfAAAXfkAAsyJAABd/gACzUkAAF4GAALNYwAAXg4AAs12AABeFgACza4AAF4cAALOFwAAXiUAAs4xAABeLQACzkQAAF41AALOdwAAXjsAAs96AABeSQACz4cAAF5PAALP+gAAXloAAtAHAABeXwAC0McAAF5nAALQ4QAAXm8AAtD0AABedwAC0SwAAF59AALRlQAAXoYAAtGvAABejgAC0cIAAF6WAALR9QAAXpwAAtL4AABeqgAC0wUAAF6wAALTeAAAXrsAAtOFAABewAAC1EMAAF7IAALUXQAAXtAAAtRwAABe2AAC1KgAAF7eAALVDwAAXucAAtUpAABe7wAC1TwAAF73AALVbwAAXv0AAtZwAABfCwAC1n0AAF8RAALW7gAAXxwAAtb7AABfIQAC17kAAF8pAALX0wAAXzEAAtfmAABfOQAC2B4AAF8/AALYhQAAX0gAAtifAABfUAAC2LIAAF9YAALY5QAAX14AAtnmAABfbAAC2fMAAF9yAALaZAAAX30AAtpxAABfggAC2y8AAF+KAALbSQAAX5IAAttcAABfmgAC25QAAF+gAALb+wAAX6kAAtwVAABfsQAC3CgAAF+5AALcWwAAX78AAt1cAABfzQAC3WkAAF/TAALd2gAAX94AAt3nAABf4wAC4O4AAGABAALhUAAAYAcAAuFVAABgDAAC4XEAAGARAALhhAAAYBkAAuGYAABgJgAC4acAAGApAALhyQAAYC4AAuHnAABgMQAC4fEAAGA0AALiAAAAYEEAAuJGAABgRAAC4rgAAGBHAALivQAAYE0AAuXDAABgZwAC5cYAAGBvAALl6AAAYHcAAuXrAABgfAAC5oEAAGCKAALmmwAAYJAAAud6AABgqwAC558AAGCxAALnwgAAYLkAAuiTAABgxAAC6K0AAGDMAALowAAAYNQAAuj4AABg2gAC6P0AAGDgAALpEAAAYOUAAukVAABg6gAC6SQAAGDwAALpnwAAYPgAAum5AABhAAAC6cwAAGEIAALp/wAAYQ4AAuoEAABhEwAC6hcAAGEYAALqHAAAYR0AAuorAABhIwAC6/YAAGE3AALsEAAAYT8AAuwjAABhRwAC7FsAAGFNAALsYAAAYVMAAuxzAABh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4QADIWIAAGftAAMhZwAAZ/UAAyGEAABn+wADIY8AAGgBAAMhlAAAaAYAAyJEAABoFAADImQAAGgaAAMinAAAaB8AAyK2AABoLgADI28AAGg8AAMjngAAaEIAAyPJAABoSgADI+UAAGhSAAMkogAAaFoAAyS8AABoYgADJM8AAGhqAAMlBwAAaHAAAyUMAABodgADJR8AAGh7AAMlJAAAaIAAAyUzAABohgADJawAAGiOAAMlxgAAaJYAAyXZAABongADJgwAAGikAAMmEQAAaKkAAyYkAABorgADJikAAGizAAMmOAAAaLkAAymMAABoyAADKkUAAGjTAAMrggAAaOMAAyufAABo7AADK7MAAGjxAAMs6wAAaQAAAzWSAABpJAADNaUAAGksAAM1zQAAaTEAAzXgAABpNgADNyAAAGlFAAM3RgAAaU0AAzleAABpawADOZsAAGlzAAM52AAAaXsAAzndAABpgwADOiUAAGmIAAM/QwAAadkAAz9GAABp3gADQPAAAGoAAANBHQAAagMAA0EwAABqDQADQUwAAGoQAANBcgAAahgAA0GSAABqGwADQlgAAGotAANCfwAAajIAA0KCAABqOgADQpwAAGpHAANDPQAAalQAA0NfAABqXgADQ2IAAGpmAANDjQAAanMAA0OwAABqewADQ9UAAGp+AANEMAAAaoMAA0WNAABqqQADRaUAAGqzAANFvQAAar0AA0YBAABqxwADRmwAAGrWAANH9gAAaw0AA0lhAABrNQADTGQAAGtMAANMxwAAa1AAA0ziAABrUgADUDkAAGuLAANQnAAAa48AA1C3AABrkQADVBoAAGunAANUHQAAa68AA1QuAABrtQADVDEAAGu9AANUNAAAa8IAA1RwAABr0wADVHMAAGvYAANUjwAAa+cAA1SSAABr7AADVLIAAGvyAANUtQAAa/oAA1TUAABsAAADVNcAAGwFAANU8AAAbBAAA1UUAABsIwADVU8AAGwoAANVUgAAbC0AA1VhAABsMwADVYcAAGxGAANV9QAAbE4AA1YUAABsUwADVhcAAGxbAANWGgAAbGEAA1Y+AABsbwADVkEAAGxyAANZLgAAbKsAA1muAABsswADWdcAAGy7AANZ2gAAbMAAA1n4AABswwADWnIAAGzGAANa2QAAbNAAA1r/AABs1QADWysAAGzgAANbQwAAbOwAA1tGAABs8QADW1UAAGz0AANbjwAAbQIAA1uyAABtDAADW8YAAG0UAANdPwAAbSgAA11FAABtMwADXdsAAG0+AANeEwAAbUQAA14lAABtTwADXkoAAG1SAANeaQAAbVcAA16UAABtZQADXwkAAG1oAANfGwAAbXMAA184AABtdgADX1oAAG19AANfXQAAbYIAA197AABtigADX+YAAG2OAANf8QAAbZEAA1/0AABtlAADYRMAAG3GAANihAAAbhQAA2LkAABuGQADY0QAAG4eAANjpAAAbiMAA2QtAABuMwADZHQAAG47AANkfwAAbkMAA2SqAABuTQADZM4AAG5XAANlHQAAbmEAA2VNAABuZgADZZYAAG5wAANlpAAAbnMAA2WpAABueAADZeoAAG6CAANmAAAAbooAA2YLAABukgADZhYAAG6aAANmNAAAbqcAA2ZWAABurwADZtoAAG6+AANm8AAAbsYAA2b7AABuzgADZwYAAG7WAANnJAAAbuMAA2dBAABu7QADZ6YAAG71AANn4QAAbvsAA2f3AABvAwADaAkAAG8LAANoOwAAbw4AA2hLAABvEQADaGIAAG8ZAANofQAAbyYAA2iaAABvKwADaKYAAG8zAANotwAAbzsAA2jCAABvQwADaOAAAG9IAANo5QAAb00AA2kqAABvWAADaWIAAG9cAANpZwAAb2EAA2msAABvbAADaj4AAG92AANqVQAAb34AA2qNAABvhgADap4AAG+JAANqtAAAb5EAA2rLAABvmQADat0AAG+hAANq9wAAb6QAA2r8AABvqQADa2cAAG+1AANsJAAAb7wAA2xRAABvxAADbHMAAG/JAANsiwAAb9MAA2y9AABv2AADbOEAAG/gAANtBQAAb+gAA20cAABv8AADbSgAAG/4AANtWgAAcAAAA21/AABwCAADbYsAAHAQAANtlwAAcBgAA22kAABwIAADbbAAAHAjAANtygAAcCgAA23wAABwMAADbfwAAHAzAANuGQAAcDgAA25DAABwQAADblAAAHBIAANuWAAAcEsAA25dAABwUAADbncAAHBVAANuhQAAcFgAA26bAABwXQADbr8AAHBiAANuxAAAcGcAA27mAABwbQADbwwAAHB1AANvIQAAcH0AA28+AABwigADb1QAAHCSAANvXwAAcJoAA29qAABwogADb4gAAHCvAANvtAAAcLcAA2/CAABwvwADb84AAHDHAANv0wAAcMwAA2/mAABw0gADcDYAAHDdAANwYQAAcOUAA3BuAABw7QADcHkAAHDyAANwkwAAcPgAA3DdAABxBgADcOoAAHEOAANw8gAAcREAA3D3AABxFgADcQ8AAHEbAANxawAAcSQAA3F3AABxLAADcYoAAHE5AANxrQAAcT8AA3GyAABxRwADcdIAAHFMAANx1wAAcVQAA3HmAABxWQADchAAAHFeAANyGwAAcWMAA3IgAABxaAADckEAAHFtAANyVAAAcXIAA3LtAABxfQADcvIAAHGAAANzGwAAcY0AA3MgAABxkAADc0kAAHGdAANzTgAAcaAAA3N3AABxrQADc3wAAHGwAANzpQAAcb0AA3OqAABxwAADdCcAAHHRAAN0SAAAcdQAA3SEAABx1wADdK8AAHHcAAN0xQAAceEAA3TRAABx6QADdN4AAHHxAAN0/AAAcfQAA3UeAABx+QADdTIAAHIBAAN1RQAAcgYAA3VsAAByCwADdYAAAHITAAN1kwAAchgAA3W1AAByHQADdgQAAHIjAAN2EAAAcisAA3YdAAByMwADdigAAHI4AAN2RwAAcj0AA3ZZAAByQAADdl4AAHJGAAN2wgAAck8AA3bnAAByVAADdvsAAHJcAAN3GwAAcmEAA3cgAAByZwADd3IAAHJuAAN3jwAAcnsAA3enAABygQADeGgAAHKSAAN4hwAAcpgAA3iMAABynQADeJ8AAHKjAAN4qwAAcqYAA3k1AABysgADeUcAAHK3AAN5YQAAcsIAA3lmAAByxwADeZsAAHLNAAN5oAAActIAA3nXAABy2AADe9EAAHL/AAN8JwAAcwQAA3wsAABzCQADfF0AAHMWAAN8YgAAcxsAA3ygAABzHgADfKwAAHMoAAN8sQAAcy0AA3zuAABzNwADfPMAAHM8AAN9MQAAc0YAA302AABzSwADfVUAAHNOAAN9WgAAc1MAA31wAABzVgADfa0AAHNbAAN9sgAAc2AAA33QAABzYwADfdUAAHNoAAN+kQAAc3QAA36WAABzegADfpsAAHOAAAN/EQAAc4QAA38WAABziQADf3gAAHOVAAN/mQAAc50AA3/mAABzpwADf+sAAHOsAAOAKAAAc7cAA4B9AABzyQADgIIAAHPOAAOAuQAAc9EAA4C+AABz1gADgQ0AAHPcAAOBEgAAc+EAA4FjAABz7QADgXYAAHP3AAOBigAAc/8AA4GlAAB0AgADgaoAAHQKAAOBuwAAdA0AA4H8AAB0EwADggEAAHQYAAOCSgAAdB8AA4JPAAB0JAADgmMAAHQqAAOCcQAAdDIAA4KyAAB0OwADgrcAAHRDAAOCygAAdEYAA4LdAAB0SwADgyAAAHRRAAODJQAAdFkAA4M4AAB0XAADg0sAAHRhAAODUAAAdGYAA4POAAB0bgADg/sAAHR1AAOF5gAAdJcAA4YAAAB0ngADhgMAAHSoAAOGMAAAdKsAA4ZPAAB0sgADhl4AAHS5AAOGeAAAdMEAA4azAAB0xgADhtIAAHTNAAOG5AAAdNQAA4cJAAB03gADh0QAAHTjAAOHYwAAdOoAA4d1AAB08QADh5cAAHT2AAOJXgAAdQsAA4lwAAB1DgADiYAAAHUUAAOJ8QAAdRwAA4oMAAB1HwADiloAAHUiAAOKzwAAdSkAA464AAB1UwADjtgAAHVaAAOO3QAAdWQAA47wAAB1ZwADjwwAAHVuAAOPJgAAdXYAA48+AAB1eQADj1oAAHWAAAOPeAAAdYgAA4+QAAB1jgADj6wAAHWVAAOPygAAdZ0AA4/iAAB1owADj/4AAHWqAAOQGAAAdbIAA5AwAAB1tQADkEwAAHW8AAOQagAAdcQAA5CCAAB1xwADkJ4AAHXOAAOQtAAAddEAA5FnAAB12gADkXkAAHXdAAOR4AAAdeMAA5H7AAB15gADkkkAAHXpAAOSxwAAdfsAA5MuAAB2BgADk0kAAHYPAAOTrQAAdhcAA5QPAAB2GwADlTIAAHYwAAOVvwAAdjsAA5XVAAB2QwADlhYAAHZRAAOWPAAAdlwAA5cZAAB2aQADl2YAAHZ6AAOXkgAAdoUAA5kYAAB2jAADmqIAAHanAAObfAAAdrcAA51IAAB24AADnVUAAHbpAAOdkwAAdu8AA53AAAB2/wADngIAAHcCAAOeMgAAdwoAA541AAB3EgADnooAAHcXAAOfDwAAdygAA5++AAB3NQADoB8AAHdOAAOgZgAAd1gAA6CUAAB3WwADoJcAAHdjAAOgwQAAd2gAA6KHAAB3fAADopkAAHd/AAOi6gAAd4UAA6MFAAB3iAADo1MAAHeLAAOjjAAAd48AA6UQAAB3nAADppQAAHexAAOmrAAAd7sAA6bEAAB3xQADptwAAHfPAAOm9AAAd9kAA6cMAAB34wADqVAAAHgIAAOpfQAAeA0AA6mXAAB4EAADrMEAAHgnAAOs1AAAeC4AA6zoAAB4NgADrO0AAHhAAAOtAAAAeEMAA60cAAB4SgADrTYAAHhSAAOtTgAAeFgAA61qAAB4XwADrYgAAHhnAAOtoAAAeG0AA628AAB4dAADrdIAAHh3AAOvzgAAeIIAA7BfAAB4hgADsRAAAHiOAAOxLAAAeJMAA7zCAAB46AADvagAAHj5AAO+FQAAeQcAA74kAAB5DwADvj8AAHkVAAO+VwAAeR8AA75tAAB5IgADvnYAAHknAAO+qAAAeSwAA7+HAAB5SAADv50AAHlQAAO/rAAAeVgAA7/RAAB5XgADv98AAHlkAAO/+wAAeWwAA8AKAAB5dAADwDUAAHl6AAPATgAAeYAAA8BsAAB5hQADwMAAAHmSAAPBiwAAeaAAA8GeAAB5pgADwbkAAHmuAAPB2gAAebYAA8IJAAB5uwADwiwAAHnDAAPCRwAAecgAA8JhAAB51wADwnUAAHnaAAPC9wAAeeUAA8MPAAB56wADwy0AAHnwAAPDbgAAefsAA8OSAAB6AAADxBoAAHoFAAPEHQAAeg0AA8Q0AAB6EwADxD0AAHoYAAPEQAAAeh0AA8YDAAB6MgADxhsAAHo4AAPGOQAAej0AA8aQAAB6SAADxrMAAHpQAAPGywAAelwAA8bhAAB6XwADxuoAAHpkAAPHOwAAemwAA8fDAAB6cQADx8YAAHp5AAPH3QAAen8AA8fmAAB6hAADx+kAAHqJAAPJZAAAep8AA8mXAAB6owADyZoAAHqrAAPJqQAAerAAA8m7AAB6vQADyc0AAHrHAAPJ2AAAesoAA8nnAAB6zwADyfkAAHrUAAPKAQAAetcAA8oEAAB63AADy3AAAHrsAAPMFwAAevwAA8wiAAB7AgADzPgAAHsUAAPNAwAAexkAA82wAAB7JAADzvgAAHs9AAPPoAAAe00AA8+0AAB7VQAD0AkAAHteAAPQHQAAe2YAA9BpAAB7cQAD0MAAAHt9AAPRIQAAe4kAA9INAAB7lQAD0hcAAHudAAPSsQAAe6gAA9LWAAB7sAAD0vgAAHu6AAPTHQAAe8IAA9MqAAB7ygAD03kAAHvUAAPT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vgAAiIYABDLlAACIkAAEMwoAAIiaAAQzLAAAiJ8ABDMvAACIpAAEM4gAAIirAAQ06gAAiMMABDUAAACIywAENQ8AAIjTAAQ1PAAAiNsABDbzAACI9QAENv0AAIj7AAQ3BwAAiP4ABDgpAACJFgAEOF8AAIkiAAQ4fQAAiSgABDiAAACJMAAEOI8AAIk1AAQ4kgAAiT0ABDi6AACJQAAEOL0AAIlFAAQ4zgAAiUsABDjYAACJTgAEOQEAAIlYAAQ5EQAAiVsABDkbAACJYQAEOT8AAIlkAAQ5RwAAiWcABDlKAACJagAEOWIAAIl1AAQ5cQAAiXoABDl0AACJfQAEOYwAAImDAAQ5lAAAiYYABDmXAACJiwAEObcAAImQAAQ5wwAAiZMABDshAACJmQAEOzsAAImkAAQ7twAAibUABDwzAACJxQAEPE4AAInQAAQ8aQAAidsABDzrAACJ8AAEPZQAAIn6AAQ9sgAAif8ABD4jAACKDgAEPlQAAIoWAAQ+qQAAiiMABD+tAACKLwAEP9AAAIo3AARAQQAAijwABEE7AACKSgAEQZgAAIpVAARCDgAAimIABEIxAACKagAEQx0AAIp+AARDOQAAio4ABEN2AACKkQAEQ9AAAIqcAAREHAAAiqQABEQ/AACKrAAERIwAAIq2AARE0AAAirsABEU0AACKzgAERXEAAIrWAARGZwAAiuwABEZ9AACK9AAERqgAAIr8AARGywAAiwQABEbjAACLCQAERw8AAIsTAARHVQAAixgABEd4AACLIAAER5AAAIslAARHtwAAiywABEkXAACLOAAESRoAAItAAARJWgAAi0gABEo0AACLWgAESjcAAItiAARKRgAAi2oABEpzAACLcgAESpEAAIt6AARKtAAAi4IABErPAACLhwAES3MAAIudAARLmAAAi6cABEusAACLrwAES8IAAIu3AARLxQAAi78ABEvlAACLxAAETBAAAIvMAARMMwAAi9QABExOAACL2QAETFoAAIvkAARMfQAAi+kABEzhAACL9wAETOwAAIv/AARM7wAAjAQABEz+AACMDAAETWsAAIwaAARNgQAAjCIABE2QAACMKgAETbcAAIwyAARN2wAAjDoABE4HAACMRwAETnwAAIxZAAROkgAAjGEABE6hAACMaQAETsgAAIxxAARPFwAAjHkABE8aAACMfgAETykAAIyGAARPWAAAjI4ABE97AACMlgAET5UAAIybAARPwwAAjKMABE/sAACMqAAET/sAAIywAARQEgAAjLgABFAwAACMwgAEUGcAAIzMAARQ4QAAjN4ABFDvAACM5gAEUQUAAIzuAARRFAAAjPYABFE7AACM/gAEUYcAAI0GAARRigAAjQsABFGZAACNEwAEUbEAAI0bAARR9gAAjSMABFITAACNKwAEUi0AAI0wAARSWwAAjTgABFKEAACNPQAEUqEAAI1FAARSvwAAjU8ABFL2AACNWQAEU2wAAI1kAARTgQAAjWwABFOXAACNdAAEU6YAAI18AART0gAAjYQABFPoAACNjAAEU/cAAI2UAARUIgAAjZwABFRaAACNpAAEVNYAAI2vAARU7AAAjbcABFT7AACNvwAEVREAAI3HAARVJwAAjc8ABFU2AACN1wAEVUsAAI3fAARVuwAAjfYABFXVAACN/gAEVdgAAI4GAARWBAAAjgsABFa3AACOGAAEVtQAAI4gAARW7AAAjigABFcDAACOMAAEVx8AAI44AARXNwAAjkAABFeGAACOSwAEV6MAAI5TAARXuwAAjlsABFfSAACOYwAEV+wAAI5rAARYDQAAjnMABFglAACOewAEWEcAAI6DAARYXwAAjosABFh3AACOkwAEWJMAAI6bAARYqwAAjqMABFjDAACOqwAEWNsAAI6zAARY8wAAjrsABFkLAACOwwAEWWEAAI7MAARZgQAAjtQABFmkAACO3AAEWikAAI7qAARaLAAAju8ABFpHAACO9wAEWmQAAI7/AARa6QAAjw0ABFsCAACPFQAEWxMAAI8aAARbRgAAjyIABFtJAACPJwAEW2YAAI8sAARbfAAAjzQABFujAACPPAAEXDcAAI9IAARcUQAAj1AABFxkAACPWAAEXJMAAI9gAARc5QAAj2gABFzqAACPcgAEXP0AAI94AARdkwAAj4AABF3kAACPigAEXl4AAI+eAARehQAAj6YABF6KAACPqwAEXp0AAI+wAARe5gAAj7UABF8+AACPxAAEX3kAAI/LAARfsAAAj9IABGA4AACP2QAEYD0AAI/hAARgXQAAj/AABGFHAACP+AAEYW0AAI/9AARhjgAAkAUABGGzAACQDQAEYdoAAJAcAARh7QAAkCEABGHyAACQJgAEYfcAAJArAARiQAAAkDcABGJiAACQQwAEYugAAJBTAARjHQAAkF0ABGOkAACQZwAEY70AAJBvAARj8AAAkHcABGQVAACQfgAEZJYAAJCFAARkuwAAkIwABGUFAACQmgAEZTAAAJCfAARljwAAkKkABGW6AACQsQAEZekAAJC4AARmDgAAkMAABGY1AACQygAEZloAAJDSAARndAAAkO0ABGeHAACQ9QAEZ6oAAJD7AARn1AAAkQAABGhDAACRBQAEaHEAAJENAARozAAAkRQABGj9AACRGQAEaSwAAJEeAARpRgAAkSMABGlZAACRKwAEaYwAAJExAARp1AAAkTYABGoEAACRPgAEaiIAAJFDAARqYQAAkUoABGrsAACRUgAEawEAAJFaAARrJQAAkWIABGtDAACRZwAEa4IAAJFuAARrywAAkXYABG4KAACRjQAEbrgAAJGcAARu7gAAkaoABG8BAACRrwAEbyQAAJG3AARvewAAkbwABG+JAACRxAAEcS8AAJHWAARxSQAAkd4ABHFcAACR5gAEcZMAAJHuAARyMAAAkfsABHJKAACSAwAEcl0AAJILAARylAAAkhMABHKvAACSGwAEcrQAAJIjAARyxwAAkigABHLdAACSMAAEcxgAAJI4AARzKwAAkkAABHNGAACSSAAEc2cAAJJNAARzfwAAklgABHOqAACSXQAEdFcAAJJrAAR0nAAAkngABHTDAACSgAAEdNYAAJKIAAR08QAAkpAABHUNAACSoAAEdSkAAJKjAAR1aAAAkqgABHWJAACSsAAEdY4AAJK6AAR1swAAksQABHXNAACSzAAEdlsAAJLZAAR2fgAAkuEABHaZAACS9gAEdqwAAJL5AAR2+QAAkwAABHcYAACTDwAEd0IAAJMhAAR3VQAAkyQABHeWAACTKwAEd7AAAJMyAAR30gAAkzoABHf/AACTQgAEeCAAAJNSAAR4MwAAk1UABHhHAACTXAAEeWgAAJNtAAR5bQAAk3UABHmhAACTegAEfZUAAJOlAAR97wAAk7MABH30AACTuwAEfhsAAJPDAAR+KAAAk8oABH67AACT1gAEf4YAAJPpAAR/sQAAk/EABIAeAACT9gAEgEwAAJP+AASAegAAlAYABICYAACUCwAEgNcAAJQSAASA9wAAlBcABIG0AACUKgAEgdQAAJQ1AASB9AAAlEAABIJRAACUSwAEgmQAAJRTAASCaQAAlFsABIKJAACUYwAEgqMAAJRrAASC2QAAlHMABIL3AACUewAEgxoAAJSDAASDTQAAlIgABIN4AACUkAAEg5gAAJSVAASDnQAAlJ0ABIPhAACUpQAEhKAAAJS2AASEwAAAlMEABITgAACUzAAEhTsAAJTXAASFeQAAlOEABIWTAACU6QAEhjQAAJTzAASGXwAAlPsABIaHAACVAAAEhzYAAJUQAASHXQAAlRgABIeRAACVIAAEh6IAAJUoAASH1QAAlTcABIglAACVPAAEiFAAAJVEAASIhQAAlUkABIiwAACVUQAEiMwAAJVWAASJCwAAlV0ABIknAACVYgAEiaAAAJVrAASJswAAlXMABInOAACVewAEif0AAJWAAASKGwAAlYgABIouAACVkAAEin0AAJWdAASKpAAAlaUABIrPAACVrQAEiusAAJWyAASLCQAAlbkABItJAACVwQAEi1wAAJXJAASLdwAAldEABIuTAACV1gAEi7EAAJXdAASLxwAAleUABIxMAACV7gAEjF8AAJX2AASMegAAlf4ABIypAACWAwAEjMcAAJYLAASM2gAAlhMABI0sAACWGwAEjT8AAJYjAASNWgAAlisABI2IAACWMAAEjacAAJY4AASNrAAAlkAABI3dAACWSAAEji0AAJZVAASOVAAAll0ABI5/AACWZQAEjpsAAJZqAASOuQAAlnEABI75AACWeQAEjwwAAJaBAASPJwAAlokABI9DAACWjgAEj2EAAJaVAASPdwAAlp0ABJDIAACWsQAEkOgAAJa7AASRCwAAlsMABJE2AACWywAEkUkAAJbTAASRbAAAltsABJGPAACW4wAEkZQAAJbrAASRpwAAlvAABJHSAACW9QAEkg4AAJb9AASSOQAAlwUABJJVAACXCgAEkpsAAJcUAASYnQAAl2gABJiiAACXbQAEmLMAAJd0AASYuAAAl3wABJkUAACXigAEmXQAAJeYAASZsgAAl6AABJsdAACXwQAEmysAAJfIAASbOQAAl9IABJyuAACX9wAEnLMAAJf/AAScuAAAmAQABJzLAACYCwAEnNAAAJgTAASc7gAAmB0ABJzzAACYJQAEnQ8AAJgsAASdPgAAmDMABJ1RAACYOgAEnV8AAJhEAASddwAAmEsABJ2TAACYUwAEnZ0AAJhYAASdogAAmF0ABJ2nAACYZQAEncsAAJhsAASd9QAAmHEABJ4IAACYdgAEng0AAJh+AASeJwAAmIgABJ5GAACYjQAEnlQAAJiUAASebAAAmJ4ABJ5/AACYpgAEnpwAAJitAASetwAAmLIABJ8LAACYtwAEo+YAAJjRAASn5AAAmO8ABKhpAACY/wAEqI8AAJkEAASosAAAmQ4ABKjOAACZEwAEqQ8AAJkYAASpWwAAmSIABKxOAACZWQAErGQAAJlhAASs9QAAmXMABK0RAACZewAErf4AAJmUAASulAAAmZwABK68AACZqwAErtoAAJm3AASvAAAAmb4ABK8RAACZyAAErzcAAJnPAASvRAAAmdQABK9HAACZ3AAEr1YAAJnjAASvdgAAmeoABK+DAACZ7wAEr5MAAJn0AASvlgAAmfwABK+lAACaAwAEr9IAAJoKAASxsgAAmi8ABLHWAACaOQAEsegAAJo+AASyDQAAmksABLI3AACaUgAEs1oAAJpcAASzaQAAmmEABLSpAACabAAEtLsAAJpxAAS0ygAAmnYABLbbAACaqgAEuUEAAJrDAAS5ggAAms4ABLmuAACa2QAEud8AAJreAAS68QAAmvQABLs5AACbAAAEu2wAAJsPAAS7lwAAmxkABLwcAACbKAAEvFQAAJs0AAS8cwAAmz4ABLyNAACbQwAEvKUAAJtLAAS82AAAm1QABL0CAACbYwAEvR8AAJtvAAS9YAAAm3kABL14AACbgQAEvZEAAJuIAAS9vQAAm48ABL3VAACblgAEvgMAAJudAAS+MQAAm6cABL8/AACbtgAEv2UAAJu7AAS/pQAAm8IABL/eAACbyQAEv/AAAJvOAATAJAAAm9UABMB5AACb3wAEwJIAAJvkAATA2gAAm+sABMD6AACb8gAEwVYAAJv3AATBdgAAm/4ABMHxAACcAwAEwjMAAJwKAATCZQAAnA8ABMKbAACcFgAEwukAAJwbAATDZwAAnCIABMOHAACcKQAEw7EAAJwwAATEGgAAnDUABMQ+AACcOgAExIAAAJxBAATEnAAAnEkABMT5AACcUAAExTEAAJxXAATF0wAAnGAABMX3AACcagAExhkAAJxvAATGNwAAnHcABMZ2AACcgAAExp8AAJyKAATG4wAAnJEABMcyAACcngAEx08AAJymAATHgQAAnK0ABMeEAACcswAEx6gAAJy9AATHqwAAnMIABMeuAACcxwAEx/kAAJzRAATH/AAAnNYABMglAACc3gAEyH8AAJzmAATIggAAnOkABMitAACc9gAEyOEAAJ0BAATJDAAAnQgABMk4AACdEwAEyVIAAJ0YAATJagAAnSAABMmDAACdJwAEyb4AAJ0uAATKAQAAnTUABMoEAACdOAAEykQAAJ1FAATKcAAAnVAABMqKAACdVQAEyqIAAJ1dAATKuwAAnWQABMsMAACdawAEyw8AAJ1uAATLfgAAnXsABMuWAACdgwAEy68AAJ2KAATL3QAAnZEABMv1AACdmAAEzCUAAJ2fAATMWQAAnaQABMxsAACdqQAEzG8AAJ2uAATMxwAAnbsABMzdAACdwwAEzP4AAJ3LAATNcwAAndUABM2qAACd3wAEze4AAJ3mAATOKQAAne0ABM47AACd8gAEzmsAAJ35AATOsgAAngMABM7JAACeCAAEzwkAAJ4PAATPIwAAnhYABM91AACeGwAEz48AAJ4iAATP+gAAnicABNA2AACeLgAE0GAAAJ4zAATQkAAAnjoABNDQAACePwAE0RgAAJ5GAATROAAAnk4ABNFUAACeVQAE0XYAAJ5cAATRiwAAnmEABNHHAACeaQAE0eUAAJ5uAATSJwAAnnoABNJGAACegQAE0nAAAJ6IAATSiAAAnpAABNKvAACelwAE0s8AAJ6fAATS/QAAnqYABNNJAACesgAE03sAAJ65AATUpwAAnsIABNWPAACe0wAE1ncAAJ7eAATWfAAAnugABNa3AACe7wAE164AAJ73AATYNwAAnwIABNmJAACfDQAE2hIAAJ8YAATbcgAAnykABNuVAACfLgAE3NQAAJ9EAATc1wAAn04ABNz/AACfWAAE3kkAAJ9oAATeYAAAn20ABN5qAACfdwAE3pEAAJ98AATeqwAAn4EABN7EAACfiAAE3xsAAJ+SAATfMQAAn5oABN9AAACfogAE334AAJ+vAATfgQAAn7cABN+nAACfvwAE36oAAJ/EAATgLQAAn8sABOBQAACf0wAE4JQAAJ/bAATgswAAn+MABODhAACf6wAE4P8AAJ/wAAThIAAAn/UABOFCAACf/QAE4V8AAKACAAThgQAAoAcABOGgAACgDwAE4cAAAKAUAAThwwAAoBkABOH7AACgHgAE4hEAAKAjAATiPQAAoCgABOJoAACgMAAE4nkAAKA4AATilwAAoEAABOLgAACgSAAE4vkAAKBQAATjOAAAoFgABOOkAACgXQAE480AAKBlAATj6wAAoGoABOQOAACgcgAE5DUAAKB3AATkOAAAoH8ABORsAACghAAE5JsAAKCJAATkugAAoI4ABOT0AACgkwAE5SkAAKCaAATlLAAAoJ8ABOVOAACgpAAE5ZIAAKCsAATl0wAAoLgABOdGAACgxAAE50kAAKDJAATpBQAAoNQABOl5AACg3wAE6ZAAAKDnAATpsAAAoO8ABOnNAACg9AAE6eYAAKD5AATqLAAAoQYABOovAAChDgAE6o0AAKETAATqswAAoRsABOrbAAChIAAE6woAAKEoAATrMgAAoTAABOs1AAChNQAE62IAAKE6AATr2AAAoUIABOvbAAChRwAE6/0AAKFMAATsMAAAoVYABOxZAAChXgAE7KkAAKFmAATswAAAoW4ABOzgAAChdgAE7P4AAKF7AATtFgAAoYAABO21AAChkgAE7dUAAKGaAATt7QAAoZ8ABO4yAAChqgAE7jUAAKGyAATuYQAAobcABO55AAChvAAE7ukAAKHIAATxRgAAofgABPFJAACh/QAE8UwAAKICAATxkwAAogwABPHGAACiEQAE8pAAAKIlAATy8gAAoi8ABPNMAACiOQAE8/sAAKJIAAT0OgAAok0ABPRSAACiUgAE9JQAAKJXAAT0sgAAolwABPUXAACiawAE9SYAAKJzAAT1TwAAongABPXxAACihwAE9hYAAKKPAAT2NgAAopcABPZHAACinwAE9lYAAKKnAAT2oQAAorEABPayAACiuQAE9t8AAKK+AAT28AAAosYABPccAACiywAE9y0AAKLTAAT3lwAAouEABPf7AACi6AAE+CAAAKLwAAT4QAAAovgABPhRAACjAAAE+GAAAKMIAAT4uQAAoxEABPjdAACjFgAE+R4AAKMbAAT53gAAoycABPoQAACjLwAE+jMAAKM3AAT6WQAAozwABPqGAACjRAAE+rMAAKNMAAT6tgAAo1EABPsBAACjVgAE+yQAAKNeAAT7dAAAo2YABPuNAACjawAE+60AAKNzAAT7sAAAo3gABPvLAACjfQAE++UAAKOCAAT7/AAAo4oABPwqAACjkgAE/C0AAKOXAAT8rQAAo6EABPzDAACj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DgAFTmsAAKwTAAVOkAAArBgABU64AACsHQAFTucAAKwkAAVPHQAArCsABU9IAACsMAAFT3MAAKw1AAVPnwAArDoABU/NAACsPwAFT+IAAKxEAAVQCwAArEkABVAgAACsTgAFUFMAAKxTAAVQbQAArFsABVD+AACscQAFUToAAKx9AAVRZwAArIoABVGMAACskgAFUcUAAKyZAAVR6wAArJ4ABVIRAACsowAFUjYAAKyoAAVSWwAArK0ABVJgAACssgAFUo8AAKy5AAVSygAArMAABVL1AACsxQAFUyAAAKzKAAVTTAAArM8ABVNhAACs1AAFU4oAAKzZAAVTnwAArN4ABVPIAACs4wAFU90AAKzoAAVUEAAArO0ABVQ/AACs+gAFVF8AAKz/AAVU8AAArRUABVUsAACtIQAFVVkAAK0uAAVVfgAArTYABVW3AACtPQAFVd0AAK1CAAVWAwAArUcABVYoAACtTAAFVk0AAK1RAAVWUgAArVYABVaBAACtXQAFVrwAAK1kAAVW5wAArWkABVcSAACtbgAFVz4AAK1zAAVXUwAArXgABVd8AACtfQAFV5EAAK2CAAVXugAArYcABVfPAACtjAAFWAIAAK2RAAVYMQAArZkABVhLAACtoQAFWF4AAK2pAAVYgwAArbEABVi3AACtuAAFWOIAAK29AAVZDQAArcIABVk5AACtxwAFWWcAAK3MAAVZlQAArdEABVx/AACt5QAFXKoAAK3tAAVc/wAArfUABV0sAACt/QAFXTEAAK4FAAVdhQAArhcABV3iAACuLgAFXhIAAK41AAVeVQAArk0ABV6SAACuUgAFXswAAK5XAAVe6wAArlwABV9IAACucwAFX3gAAK56AAVfuQAArpIABWCMAACuoAAFYZcAAK6oAAVhnAAArrAABWIMAACuxQAFYkEAAK7MAAViWwAArtQABWKxAACu6gAFYrYAAK7yAAVjeQAArwgABWOnAACvEAAFY/8AAK8YAAVkLAAAryAABWRcAACvKAAFZH0AAK8tAAVk/gAAr0YABWVmAACvZwAFZXkAAK9sAAVlkQAAr3wABWXfAACvkgAFZf8AAK+XAAVmOAAAr58ABWY9AACvpwAFZokAAK+7AAVmxAAAr8gABWbdAACvywAFZ1oAAK/pAAVn4QAAsA0ABWf0AACwEgAFZ/kAALAXAAVn/gAAsBwABWgqAACwIgAFaFAAALAzAAVoYwAAsDgABWhoAACwPQAFaG0AALBCAAVomQAAsEgABWjUAACwTgAFaNkAALBWAAVpGwAAsGoABWkgAACwcgAFaa8AALCJAAVpxAAAsJEABWnoAACwlwAFahgAALCcAAVqVQAAsKYABWp/AACwqwAFaosAALCwAAVqvgAAsLYABWruAACwvgAFawwAALDOAAVrMwAAsN4ABWtIAACw4wAFa3QAALDoAAVrkgAAsPgABWuyAACw/QAFa9QAALENAAVr6QAAsRIABWwxAACxGQAFcJcAALFbAAVxdAAAsWgABXGqAACxcAAFccgAALF1AAVyGAAAsX0ABXJsAACxggAFcnEAALGKAAVytgAAsZEABXLJAACxmAAFcz0AALGdAAVz/wAAsakABXREAACxsQAFdIAAALG2AAV0xQAAsb4ABXgVAACyBgAFeOUAALIdAAV5FQAAsiwABXlGAACyNgAFeeIAALJKAAV6lwAAslQABXriAACyXgAFewkAALJjAAV7DgAAsm0ABXsxAACycgAFezYAALJ5AAV7SgAAsn4ABXtPAACygwAFe1QAALKLAAV7fwAAspAABXvKAACymgAFe/QAALKkAAV8CAAAsqkABXz2AACyugAFfWkAALK/AAWBnQAAsxoABYHCAACzIgAFgegAALMqAAWCDQAAszIABYJcAACzOgAFgpkAALM/AAWDdAAAs04ABYO2AACzYwAFhHMAALN8AAWElQAAs4YABYS9AACzkAAFhOcAALOXAAWFBwAAs54ABYUMAACzpgAFhS0AALOuAAWFYwAAs7kABYW8AACzxAAFheAAALPLAAWF5QAAs9MABYYFAACz2wAFhmkAALPpAAWGbgAAs/EABYaPAACz+QAFhykAALQEAAWHqAAAtB4ABYfTAAC0KAAFiD0AALQ0AAWIVgAAtDwABYhvAAC0QwAFiKsAALRKAAWIxgAAtFIABYjZAAC0WQAFiWIAALReAAWKHAAAtHgABYsRAAC0lwAFjMEAALTOAAWM8AAAtNYABY00AAC04QAFjUwAALTsAAWNvAAAtPEABY3VAAC09gAFjfoAALT7AAWOYgAAtQIABY6NAAC1CgAFjq0AALUPAAWPqgAAtRwABY/GAAC1JAAFj9AAALUuAAWP7AAAtTMABZAPAAC1OAAFkQwAALVDAAWRaQAAtU4ABZH5AAC1WwAFkmQAALVlAAWSxAAAtWwABZMoAAC1eAAFk0QAALV/AAWTogAAtYkABZPPAAC1kAAFlD4AALWaAAWUYwAAtaIABZTGAAC1rwAFlOoAALW3AAWU/QAAtb4ABZVWAAC1xQAFlcsAALXPAAWV/QAAtdkABZYCAAC14QAFllYAALXpAAWWeQAAte4ABZZ+AAC19gAFlrgAALX8AAWWvQAAtgEABZbMAAC2BgAFlwIAALYNAAWXfQAAthgABZfdAAC2HwAFmAEAALYmAAWYOQAAti0ABZiTAAC2NwAFmMMAALY+AAWY+QAAtkYABZlWAAC2TQAFmf0AALZZAAWa0wAAtmkABZr+AAC2cQAFm5UAALZ+AAWbugAAtoYABZv2AAC2jgAFoOMAALbbAAWhJAAAtuUABaFOAAC27wAFohsAALb5AAWiPAAAtwMABaJ1AAC3DQAFpHAAALcvAAWknwAAtzYABaTwAAC3QgAFpQkAALdMAAWlJQAAt1MABaa2AAC3ewAFp/wAALeSAAWoRgAAt50ABahLAAC3pQAFqGkAALeqAAWotAAAt7UABaj4AAC3vQAFqWoAALfGAAWphAAAt84ABam8AAC31gAFqcEAALfbAAWqHAAAt+UABapBAAC37QAFqnEAALf1AAWqrwAAt/oABarUAAC4AgAFqwUAALgKAAWrIQAAuBEABauWAAC4GAAFq9cAALggAAWsEAAAuDYABaw2AAC4RAAFrEoAALhHAAWsYAAAuE8ABayEAAC4XwAFrJgAALhiAAWtAwAAuGwABa09AAC4dAAFrY8AALh/AAWtwgAAuIQABa3QAAC4jAAFrgkAALiRAAWuEwAAuJgABa4mAAC4nQAFrmUAALitAAWukwAAuLsABa6mAAC4vgAFrr8AALjDAAWu1QAAuMsABa75AAC42wAFrwwAALjeAAWvJQAAuOMABa9pAAC47QAFsJsAALj8AAWxrAAAuQ8ABbIKAAC5GgAFsigAALkiAAWyMgAAuSwABbJFAAC5MQAFsmoAALk2AAWysgAAuT0ABbLyAAC5QgAFs3EAALlPAAWzlgAAuVQABbQ+AAC5YwAFtHgAALltAAW0fQAAuXUABbTRAAC5fQAFtPQAALmCAAW0+QAAuYoABbVAAAC5kAAFtUUAALmVAAW1VAAAuZoABbWMAAC5oQAFtg0AALmsAAW2IAAAubMABbZQAAC5ugAFtn0AALnBAAW24AAAucsABbcEAAC50wAFtxcAALnaAAW3sAAAueQABbfNAAC57AAFt9cAALn2AAW38wAAufsABbgWAAC6AAAFuCEAALoFAAW4mwAAug0ABbjBAAC6FQAFuMsAALofAAW45wAAuiQABbkKAAC6KQAFucQAALoxAAW59AAAujsABboXAAC6QAAFukMAALpFAAW6ZQAAukwABbp/AAC6VAAFuq0AALpcAAW6wwAAumMABbrmAAC6aAAFuxsAALpwAAW7RAAAunUABbteAAC6fQAFu3gAALqFAAW7kAAAupAABbvGAAC6lQAFu+AAALqdAAW7+AAAuqgABbxSAAC6rQAFvHEAALqyAAW8hAAAurkABbyeAAC6vgAFvLEAALrFAAW8xAAAusoABb01AAC6zwAFvY0AALrbAAW9oAAAuuMABb4mAAC67QAFvuIAALr8AAW++QAAuwQABb8WAAC7CQAFvy0AALscAAW/WQAAuyEABb+EAAC7NgAFv7QAALtGAAW/1QAAu0sABcBFAAC7VQAFwMgAALtkAAXBYgAAu24ABcGGAAC7eAAFwaEAALuFAAXBxQAAu4gABcHrAAC7mAAFwgsAALudAAXCNgAAu7IABcJdAAC7twAFwnMAALu/AAXCeAAAu8cABcKYAAC7zQAFwp0AALvXAAXC3QAAu+EABcL/AAC77wAFwyoAALv/AAXDSgAAvAQABcNwAAC8CQAFw9UAALwOAAXD2gAAvBYABcQ9AAC8JgAFxFAAALwuAAXEcwAAvDYABcTHAAC8PgAFxPkAALxGAAXFHgAAvE0ABcUxAAC8VAAFxVYAALxZAAXFcQAAvGEABcV7AAC8awAFxZcAALxwAAXFugAAvHUABcXFAAC8egAFxlUAALyBAAXHJwAAvIwABchpAAC8pwAFyYsAALy/AAXJowAAvMQABcm7AAC8yQAFyf4AALzVAAXKTwAAvN8ABcqsAAC86QAFysAAALzzAAXK1AAAvP0ABctFAAC9BwAFy4EAAL0MAAXLjgAAvRMABcu6AAC9GAAFy8cAAL0iAAXL1AAAvSwABcwkAAC9NgAFzDEAAL1AAAXNQgAAvVQABc1HAAC9XgAFzZYAAL1oAAXN7AAAvXIABc5BAAC9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hgAADAkAAFagAAAMEQAAVq8AAAwWAABXPwAADCcAAFeVAAAMKQAAV9wAAAwuAABX9AAADDYAAFhCAAAMPgAAWKoAAAxHAABYzgAADE8AAFkrAAAMVQAAWTAAAAxdAABZUAAADGYAAFlbAAAMawAAWYMAAAxxAABZtQAADHUAAFnNAAAMewAAWd4AAAyDAABZ7wAADI8AAFo9AAAMkgAAWl8AAAyaAABacAAADKIAAFquAAAMpwAAWrMAAAysAABa2gAADK8AAFslAAAMugAAWzkAAAzAAABbjwAADMYAAFuhAAAMzgAAW7cAAAzUAABbyAAADNwAAFvZAAAM4QAAW+4AAAzmAABcMwAADPAAAFw4AAAM9QAAXF4AAAz6AABcfwAADQIAAFyNAAANCgAAXJIAAA0PAABc2wAADRMAAFzyAAANGQAAXRwAAA0oAABdKgAADTAAAF0vAAANNQAAXZUAAA05AABdrgAADT8AAF3hAAANRwAAXe8AAA1PAABd9AAADVQAAF5hAAANWAAAXn0AAA1bAABenQAADWMAAF8eAAANawAAXzIAAA10AABfNwAADXkAAF9dAAANfgAAX7QAAA2GAABf4gAADZUAAGADAAANmgAAYIMAAA2gAABgsgAADaYAAGD2AAANrgAAYSMAAA25AABhKAAADbsAAGEtAAANwAAAYTwAAA3CAABhQQAADccAAGGSAAANyQAAYbMAAA3RAABiRgAADdkAAGKBAAAN3gAAYs8AAA3kAABi1AAADewAAGLrAAAN8gAAYvAAAA36AABjCAAADggAAGMkAAAOCwAAY0kAAA4TAABjtwAADhoAAGPSAAAOIAAAZA0AAA4oAABkYQAADi4AAGR8AAAONAAAZLcAAA48AABmgAAADkIAAGaTAAAOSAAAZpgAAA5NAABm+gAADlEAAGcPAAAOVwAAZxQAAA5cAABncwAADmMAAGd4AAAOaAAAaGUAAA5sAABoeAAADnkAAGh9AAAOfgAAaNEAAA6CAABo5gAADogAAGjrAAAOjQAAaT8AAA6UAABpRAAADpkAAGmYAAAOnAAAadQAAA6fAABqPwAADqIAAGpbAAAOpQAAankAAA6tAABqfgAADrMAAGrqAAAOuAAAau8AAA6/AABq9AAADsQAAGtYAAAOxwAAa5AAAA7MAABrmgAADtQAAGu0AAAO2QAAbAAAAA7bAABsPAAADt4AAGxdAAAO4AAAbHkAAA7jAABtBQAADvMAAG0KAAAO+QAAbVIAAA8JAABtmgAADxkAAHAWAAAPHAAAcEQAAA8hAABwVQAADyUAAHBaAAAPKAAAcGwAAA8rAABwgAAADy8AAHC9AAAPMwAAcNUAAA82AABw7gAADz4AAHECAAAPQwAAcRYAAA9IAABxcQAAD0sAAHGGAAAPTgAAcYkAAA9WAABxpQAAD1kAAHHUAAAPawAAcesAAA92AABx7gAAD3sAAHIPAAAPigAAclQAAA+OAAByjAAAD5kAAHKPAAAPngAAcsoAAA+iAABy3gAAD6UAAHM7AAAPsAAAcz4AAA+1AABzkQAAD74AAHOUAAAPwwAAdAcAAA/HAAB0NwAAD9IAAHQ6AAAP1wAAdH8AAA/dAAB0ggAAD+IAAHSFAAAP5wAAdNUAAA/sAAB02AAAD/EAAHTbAAAP9gAAdSsAAA/7AAB1LgAAEAAAAHUxAAAQBQAAdYEAABAKAAB1hAAAEA8AAHWHAAAQFAAAddcAABAZAAB12gAAEB4AAHXdAAAQIwAAdi0AABAoAAB2MAAAEC0AAHYzAAAQMgAAdoIAABA3AAB2hQAAED8AAHbJAAAQRAAAdswAABBMAAB3EgAAEFEAAHcdAAAQVgAAdyAAABBeAAB3NQAAEGQAAHc4AAAQbAAAd28AABByAAB3cgAAEHcAAHd1AAAQfAAAd8UAABCFAAB3yAAAEIoAAHfoAAAQjwAAd/QAABCXAAB39wAAEJwAAHgNAAAQogAAeCoAABC3AAB4VwAAELsAAHhpAAAQwQAAeHoAABDJAAB4iwAAENEAAHiuAAAQ4wAAePkAABDmAAB5DgAAEOwAAHkfAAAQ9AAAeSsAABD8AAB5SQAAEQEAAHmSAAARBwAAeaMAABEPAAB5uAAAERoAAHm7AAARHwAAedsAABEkAAB55wAAESwAAHn3AAARMQAAepAAABE0AAB6twAAETkAAHrKAAARPAAAes0AABFEAAB7AgAAEVQAAHsfAAARWQAAezEAABFkAAB7NAAAEWkAAHtVAAARbgAAe2QAABGAAAB7lgAAEYQAAHuoAAARigAAe7gAABGSAAB7yAAAEZoAAHvlAAARogAAe/UAABGtAAB7+AAAEbIAAHwWAAARtwAAfBkAABG8AAB8RAAAEcUAAHxHAAARygAAfFQAABHPAAB8cgAAEdUAAHyxAAAR2AAAfMUAABHeAAB81QAAEeYAAHzlAAAR7gAAfQIAABH2AAB9LQAAEf4AAH04AAASBgAAfU0AABIRAAB9UAAAEhYAAH18AAASGwAAfaIAABIhAAB9pQAAEiYAAH4BAAASLwAAfgQAABI0AAB+GwAAEjoAAH49AAASQAAAfkAAABJFAAB+TQAAEkoAAH5tAAASUAAAfn8AABJbAAB+ggAAEmAAAH6gAAASZQAAfrIAABJnAAB+tQAAEm8AAH7LAAAScgAAftMAABJ6AAB+3AAAEn0AAH7lAAASgwAAfugAABKIAAB/KQAAEpQAAH9iAAASmgAAf3IAABKiAAB/ggAAEqoAAH+yAAASsgAAf8cAABK9AAB/ygAAEsIAAH/XAAASxwAAf9oAABLMAACAFAAAEtEAAIAXAAAS1gAAgDgAABLfAACAOwAAEuQAAIBIAAAS6QAAgGYAABLvAACAegAAEvcAAIB9AAAS/AAAgJ8AABL+AACAogAAEwYAAIC4AAATCQAAgMAAABMRAACAyQAAExQAAIDSAAATGgAAgNUAABMfAACBMQAAEykAAIFOAAATMQAAgV4AABM8AACBYQAAE0EAAIGXAAATSQAAgZoAABNOAACBpwAAE1MAAIHFAAATWQAAgfcAABNcAACCCwAAE2QAAIIdAAATbAAAgicAABN0AACCKgAAE3wAAIJAAAATggAAgkMAABOHAACCUAAAE4wAAIJxAAATkgAAgnsAABOaAACCjQAAE6IAAIKQAAATpwAAgp0AABOsAACCxgAAE7IAAILwAAATxAAAgvwAABPOAACDIwAAE9kAAIMmAAAT3gAAg1AAABPjAACDYAAAE+gAAIN0AAAT7QAAg3cAABPyAACDhAAAE/cAAIO0AAAT/QAAg78AABQFAACDzgAAFBcAAISCAAAUGgAAhJYAABQgAACFJwAAFCcAAIVOAAAULAAAhXAAABQ0AACFmgAAFDoAAIYxAAAUPQAAhzYAABRBAACHbQAAFEUAAIfDAAAUSQAAh+4AABRZAACIOAAAFF0AAIh8AAAUYQAAiNoAABRlAACI7wAAFGsAAIkNAAAUcwAAiXMAABR3AACJiAAAFH0AAIn7AAAUgAAAimMAABSCAACLEQAAFIkAAIsWAAAUkQAAi2oAABSXAACLbwAAFJ8AAIu1AAAUowAAi9AAABSpAACL4wAAFLEAAIv7AAAUuQAAjAkAABTBAACMDgAAFMkAAIyNAAAU0gAAjLIAABTbAACNPAAAFPEAAI5vAAAU+wAAjrAAABUEAACOyQAAFQYAAI9TAAAVGwAAj2sAABUhAACPvQAAFSwAAJB0AAAVPQAAkKwAABVBAACRRwAAFU0AAJF4AAAVTwAAkc0AABVYAACSCQAAFVoAAJJrAAAVXQAAknsAABVhAACS0wAAFWUAAJMTAAAVaAAAmGwAABVrAACYggAAFW4AAJimAAAVcwAAmLkAABV4AACY2wAAFXsAAJkqAAAVfgAAmT4AABWBAACalgAAFYcAAJqzAAAVigAAmskAABWPAACa0wAAFZcAAJrdAAAVnQAAm/8AABWhAACcEgAAFaYAAJx3AAAVrwAAnPMAABWyAACdBgAAFbcAAJ2AAAAVwwAAnd0AABXGAACd/QAAFckAAJ4XAAAVzAAAnioAABXRAACeuQAAFeAAAJ9TAAAV5gAAn8sAABXsAACgXgAAFfIAAKDzAAAV9gAAoXQAABX6AAChfgAAFf8AAKIHAAAWCAAAojIAABYLAACiPAAAFhAAAKLlAAAWHAAAowcAABYfAACjIAAAFiIAAKMqAAAWJwAApTgAABY5AACl9QAAFj0AAKYFAAAWQAAAphUAABZDAACmJQAAFkYAAKZrAAAWSwAApm4AABZQAACmnQAAFlYAAKagAAAWWAAAp28AABZdAACncgAAFmIAAKeYAAAWaAAAp5sAABZqAACnzwAAFm0AAKhAAAAWeAAAqH0AABZ9AACowgAAFoYAAKk4AAAWiQAAqTsAABaOAACpbwAAFpMAAKqnAAAWnQAAq+4AABaiAACr/QAAFqUAAKw7AAAWqwAArJgAABaxAACtFgAAFrQAAK0ZAAAWuQAArT0AABa8AACtRgAAFsIAAK1XAAAWxQAArVoAABbKAACtzwAAFtsAAK3SAAAW4AAArksAABbjAACuTgAAFugAAK5zAAAW6wAArpIAABbzAACu5QAAFvYAAK7oAAAW+wAArw4AABb+AACvNwAAFwEAAK86AAAXBgAAr1gAABcMAACvfQAAFxUAAK+AAAAXGAAAr44AABceAACvrAAAFyEAAK+vAAAXKQAAsBoAABcsAACwIwAAFy8AALBtAAAXNwAAsIAAABc6AACwjwAAF0IAALCfAAAXSAAAsMsAABdQAACw7AAAF1UAALDvAAAXVwAAsPkAABddAACw/AAAF18AALFZAAAXYgAAsbgAABd1AACxvQAAF3cAALJsAAAXfQAAsnEAABd/AACy5QAAF4IAALLyAAAXhwAAsv8AABeMAACzFwAAF48AALNUAAAXkgAAs4sAABeXAAC0CwAAF5wAALRNAAAXnwAAtFoAABekAAC0ZwAAF6kAALSPAAAXrAAAtJQAABexAAC02wAAF7kAALVhAAAXwQAAtW4AABfGAAC1ewAAF8sAALWzAAAXzgAAtbgAABfTAAC2CAAAF94AALaiAAAX6QAAtq8AABfuAAC2vAAAF/MAALbJAAAX9gAAtusAABf5AAC3BAAAF/wAALcJAAAYAQAAt2IAABgPAAC4IwAAGB0AALhWAAAYJQAAuI8AABgtAAC4ugAAGDIAALv5AAAYNAAAvA4AABg3AAC8LQAAGDsAALxJAAAYPgAAvLIAABhEAAC85AAAGEkAALznAAAYUQAAvXoAABhUAAC9pAAAGFkAAL29AAAYXAAAvcwAABhhAAC9zwAAGGYAAL4DAAAYbAAAviIAABhuAAC+PQAAGHYAAL5MAAAYewAAvmAAABh9AAC+kAAAGIgAAL7wAAAYjwAAvwkAABiVAAC/LQAAGJsAAL9QAAAYowAAv3sAABioAAC/mgAAGKoAAL+0AAAYrwAAv+QAABi6AADANwAAGL4AAMBhAAAYwwAAwHoAABjGAADAiQAAGMsAAMCMAAAY0AAAwMAAABjWAADA3wAAGNgAAMD6AAAY4AAAwQkAABjlAADBHQAAGOcAAMFcAAAY9QAAwYwAABj5AADBtgAAGPsAAMHgAAAZAAAAwfkAABkGAADCGAAAGQkAAMInAAAZDgAAwlUAABkTAADCdAAAGRUAAMKPAAAZGgAAwp4AABkfAADCsgAAGSEAAML5AAAZOQAAw4IAABlNAADDpgAAGVIAAMO/AAAZWAAAw+MAABleAADEBgAAGWYAAMQxAAAZawAAxFAAABltAADEmQAAGYQAAMSoAAAZjAAAxNIAABmRAADFIAAAGZUAAMVKAAAZmgAAxWMAABmdAADFcgAAGaIAAMV1AAAZpwAAxakAABmtAADF3QAAGa8AAMYIAAAZtwAAxhoAABm6AADGKQAAGb8AAMY9AAAZwQAAxo4AABncAADGkQAAGeEAAMaxAAAZ5gAAxrQAABnrAADGtwAAGfAAAMdbAAAZ9gAAx3AAABn4AADHiwAAGhMAAMehAAAaGQAAx8MAABosAADH8gAAGjAAAMgKAAAaMwAAyBcAABo1AADIJAAAGjgAAMgvAAAaOgAAyDoAABo8AADIgwAAGkEAAMjRAAAaWQAAyNQAABpeAADI/gAAGmYAAMkBAAAabgAAyRsAABpzAADJHgAAGngAAMlKAAAafQAAyWIAABqCAADJZQAAGocAAMloAAAajAAAydEAABqSAADJ6gAAGpgAAMoJAAAangAAyjgAABqgAADKZgAAGqYAAMqJAAAargAAyrQAABqzAADK0wAAGrUAAMr+AAAavQAAyxsAABrAAADLOAAAGsIAAMtHAAAaxwAAy24AABrZAADNBQAAGv4AAM06AAAbAwAAzh8AABsMAADOOAAAGw8AAM5HAAAbFAAAzkoAABsZAADOfgAAGx8AAM6dAAAbIQAAzrgAABsmAADOxwAAGysAAM8TAAAbMwAAz7sAABs6AADP1AAAGz0AAM/jAAAbQgAAz+YAABtHAADQGgAAG00AANA5AAAbTwAA0FQAABtUAADQYwAAG1kAANC+AAAbZAAA0O4AABtoAADRRwAAG20AANFgAAAbcwAA0X8AABt2AADRjgAAG3sAANG8AAAbgAAA0dsAABuCAADR9gAAG4cAANIFAAAbjAAA0mEAABuhAADTPQAAG7UAANNWAAAbuAAA02UAABu9AADTaAAAG8IAANOcAAAbyAAA09AAABvKAADT+wAAG9IAANQNAAAb1QAA1BwAABvaAADUiQAAG/IAANSMAAAb9wAA1KwAABv8AADUrwAAHAEAANSyAAAcBgAA1c0AABwMAADV9wAAHBEAANYQAAAcFAAA1h8AABwZAADWIgAAHB4AANZWAAAcJAAA1nUAABwmAADWkAAAHC4AANafAAAcMwAA1rMAABw1AADW3wAAHEAAANcyAAAcRAAA11wAABxJAADXdQAAHEwAANeEAAAcUQAA14cAABxWAADXuwAAHFwAANfaAAAcXgAA1/UAABxjAADYBAAAHGgAANgYAAAcagAA2FMAABx4AADYgwAAHHwAANitAAAcfgAA2NcAAByDAADY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XAABCtEAACRhAAEK1AAAJGkAAQrjAAAkbgABCuYAACR0AAEK/gAAJHoAAQsrAAAkjAABC0EAACSUAAELUAAAJJwAAQt5AAAkoQABC3wAACSmAAELkgAAJKsAAQuVAAAksAABC8EAACS4AAELxAAAJL0AAQvaAAAkwwABC/4AACTSAAEMGQAAJNgAAQw3AAAk4AABDGMAACTvAAEMfgAAJPUAAQycAAAk/QABDO4AACUAAAEM+wAAJQIAAQ0IAAAlBAABDS0AACUKAAENUQAAJQ8AAQ11AAAlEQABDZsAACUWAAENuAAAJRsAAQ27AAAlIAABDdoAACUjAAEN/gAAJSgAAQ4iAAAlMAABDloAACU4AAEOegAAJT0AAQ6oAAAlRQABDsIAACVKAAEO1AAAJVIAAQ7XAAAlVwABDv0AACVdAAEPHgAAJV8AAQ8+AAAlZAABD0EAACVpAAEPYQAAJW8AAQ92AAAldwABD4oAACV8AAEP6wAAJYIAAQ/uAAAliAABEA0AACWOAAEQMQAAJZAAARBAAAAllQABEGEAACWkAAEQjgAAJakAARCpAAAluwABENwAACXBAAERXwAAJdQAARFiAAAl2gABEYEAACXgAAERpQAAJeUAARHJAAAl6gABEe0AACXsAAER/AAAJfEAARIdAAAl8wABEkMAACX4AAESRgAAJf0AARJlAAAmAAABEogAACYFAAEStgAAJg0AARLUAAAmEgABEwIAACYaAAETHAAAJh8AARMuAAAmJwABEzEAACYsAAETVwAAJjIAARNaAAAmNwABE2kAACY9AAETkAAAJj8AAROvAAAmRAABE7IAACZJAAET0QAAJk8AARQRAAAmUwABFBkAACZbAAEUIwAAJmEAARR5AAAmZwABFJMAACZpAAEUmwAAJnEAARULAAAmeAABFQ4AACZ+AAEVLwAAJoQAARUyAAAmigABFUMAACaQAAEVWgAAJpgAARXYAAAmrAABFeIAACayAAEV7AAAJrcAARY0AAAmvAABFj4AACbCAAEWSAAAJscAARbjAAAmyQABFzcAACbPAAEXOgAAJtQAARdJAAAm2QABF3cAACbdAAEXhgAAJuAAARegAAAm4gABF6gAACbqAAEXvAAAJvAAARe/AAAm+AABGDUAACb6AAEYkgAAJv4AARjeAAAnAQABGdEAACcGAAEaiwAAJwoAARrdAAAnEAABGuAAACcVAAEa4wAAJxoAARr9AAAnHwABGzQAACclAAEbNwAAJy0AARtxAAAnMwABG3QAACc7AAEbdwAAJ0AAARuRAAAnRgABG6MAACdLAAEbrgAAJ1AAARuxAAAnVgABG8EAACdcAAEbywAAJ2EAARvVAAAnZwABG+UAACdsAAEb8AAAJ3EAARvzAAAndgABG/YAACd8AAEcEQAAJ4IAARwUAAAnhwABHCkAACeMAAEcMwAAJ5IAARxfAAAnlQABHGwAACeXAAEceQAAJ5kAARyIAAAnnAABHJsAACehAAEcngAAJ6YAARytAAAnqwABHNgAACewAAEc/QAAJ7gAAR0qAAAnwQABHVkAACfPAAEdhAAAJ9cAAR2nAAAn3wABHckAACfkAAEd6AAAJ+YAAR4dAAAn+wABHiwAACgAAAEeewAAKAYAAR6DAAAoDAABHoYAACgSAAEemgAAKBgAAR6dAAAoIAABHsAAACglAAEeyAAAKCoAAR7LAAAoMAABHu0AACg2AAEfFwAAKD4AAR86AAAoRgABH18AAChYAAEfYgAAKF0AAR+EAAAoYwABH4cAAChoAAEflgAAKG4AAR/rAAAocQABH/gAAChzAAEgDQAAKHgAASAQAAAogAABIB8AACiFAAEgIgAAKIsAASA6AAAokQABIGcAACijAAEgfQAAKKsAASCMAAAoswABILUAACi4AAEguAAAKL0AASDOAAAowgABINEAACjHAAEg/QAAKM8AASEAAAAo1AABIRYAACjaAAEhOgAAKOkAASFVAAAo7wABIXMAACj3AAEhnwAAKQYAASG6AAApDAABIdgAACkUAAEiKgAAKRcAASI3AAApGQABIkQAACkbAAEiaQAAKSEAASKNAAApJgABIrEAACkoAAEi1wAAKS0AASL0AAApMgABIvcAACk3AAEjFgAAKToAASM6AAApPwABI14AAClHAAEjlgAAKU8AASO2AAApVAABI+QAAClcAAEj/gAAKWEAASQQAAApaQABJBMAACluAAEkOQAAKXQAASRaAAApdgABJHoAACl7AAEkfQAAKYAAASSdAAAphgABJLIAACmOAAEkxgAAKZMAASUnAAApmQABJSoAACmfAAElSQAAKaUAASVtAAAppwABJXwAACmsAAElnQAAKbsAASXKAAApwAABJeUAACnSAAEmGAAAKdgAASabAAAp6wABJp4AACnxAAEmvQAAKfcAASbhAAAp/AABJwUAACoBAAEnKQAAKgMAASc4AAAqCAABJ1kAACoKAAEnfwAAKg8AASeCAAAqFAABJ6EAACoXAAEnxAAAKhwAASfyAAAqJAABKBAAACopAAEoPgAAKjEAAShYAAAqNgABKGoAACo+AAEobQAAKkMAASiTAAAqSQABKJYAACpOAAEopQAAKlQAASjMAAAqVgABKOsAACpbAAEo7gAAKmAAASkNAAAqZgABKU0AACpqAAEpVQAAKnIAASlfAAAqeAABKbUAACp+AAEpzwAAKoAAASnXAAAqiAABKkcAACqPAAEqSgAAKpUAASprAAAqmwABKm4AACqhAAEqfwAAKqcAASqWAAAqrwABKxQAACrDAAErHgAAKskAASsoAAAqzgABK3AAACrTAAEregAAKtkAASuEAAAq3gABLB8AACrgAAEscwAAKuYAASx2AAAq6wABLIUAACrwAAEsswAAKvQAASzCAAAq9wABLNwAACr5AAEs5AAAKwEAASz4AAArBwABLPsAACsPAAEtvwAAKxQAAS3wAAArGQABLzsAACshAAEv/QAAKycAATAPAAArKgABMCUAACsuAAEwOQAAKzEAATBNAAArNAABMHoAACs4AAEwhQAAKzoAATCUAAArPQABMKEAACs/AAEwrgAAK0EAATE8AAArRwABMUYAACtMAAExUAAAK1IAATFaAAArVwABMWQAACtcAAExlwAAK18AATGaAAArZAABMeUAACtmAAEx9wAAK2kAATINAAArbQABMiEAACtwAAEyNQAAK3MAATJJAAArdwABMocAACt7AAEykgAAK30AATKhAAArgAABMq4AACuCAAEyuwAAK4QAATMKAAArhwABM1AAACuKAAEzUwAAK5IAATNkAAArlwABM24AACudAAEziwAAK6IAATOlAAArqgABM6gAACuvAAEztwAAK7QAATPJAAArugABM8wAACvCAAEz2wAAK8cAATPrAAAryQABM/MAACvRAAEz/QAAK9cAATQAAAAr3AABNA8AACviAAE0IgAAK+cAATQlAAAr7wABNDQAACv0AAE0VwAALAMAATRaAAAsCAABNGkAACwOAAE1GwAALBoAATU4AAAsHwABNVIAACwkAAE1egAALCkAATWUAAAsLgABNa4AACwzAAE19AAALDgAATYWAAAsPQABNlQAACxCAAE2kQAALEcAATbIAAAsTAABN6sAACxRAAE3ugAALFMAATfQAAAsWAABN/IAACxdAAE4CAAALGcAATggAAAscQABOHoAACyAAAE4fQAALIIAATixAAAshQABOLwAACyNAAE41QAALJMAATjYAAAslQABOOsAACydAAE5FQAALKQAATk7AAAsqwABOYMAACytAAE5kgAALK8AATmoAAAstAABOcoAACy5AAE6GAAALMgAATobAAAsygABOjUAACzSAAE6VgAALNQAATphAAAs3AABOnoAACziAAE6fQAALOQAATqNAAAs7AABOqwAACzzAAE7WgAALPUAATt5AAAs+gABO5UAACz/AAE7wQAALQQAATvhAAAtCQABPAEAAC0OAAE8VQAALRMAATx9AAAtGAABPMUAAC0dAAE9CgAALSIAAT1JAAAtJwABPiEAAC0sAAE+7AAALTgAAT8BAAAtOwABPxYAAC0+AAE/dwAALUMAAT+IAAAtUAABP5MAAC1VAAE/2QAALWMAAT/xAAAtZgABP/QAAC1uAAFAFgAALXsAAUCRAAAtgAABQMIAAC2FAAFA4wAALY0AAUEUAAAtkwABQTUAAC2bAAFBOAAALaEAAUFwAAAtpwABQXMAAC2vAAFBpwAALbIAAUGyAAAttQABQb4AAC24AAFB2wAALb0AAUHeAAAtxQABQhUAAC3OAAFCGAAALdMAAUJEAAAt3gABQk8AAC3jAAFCrAAALgQAAUKvAAAuCQABQtgAAC4OAAFDaAAALikAAUN3AAAuMQABQ6AAAC5EAAFDowAALkkAAUPZAAAuTAABQ/IAAC5VAAFD9QAALloAAUQQAAAuZQABRCQAAC5rAAFERgAALncAAURaAAAufQABRHUAAC6GAAFEeAAALosAAUTEAAAuogABRN0AAC6xAAFE7AAALrkAAUVrAAAuxgABRYEAAC7KAAFFlQAALs0AAUWoAAAu0QABRb4AAC7VAAFF6wAALtsAAUYUAAAu4QABRigAAC7mAAFGcAAALuwAAUakAAAu8wABRqcAAC77AAFGtgAALwAAAUa5AAAvBQABRuUAAC8LAAFG6AAALxMAAUb4AAAvGQABRwMAAC8eAAFHCwAALyYAAUcVAAAv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kwABdLMAADSbAAF05wAANKAAAXVCAAA0pQABdwEAADSqAAF3HgAANK8AAXc4AAA0twABd1IAADS8AAF31AAANMQAAXgCAAA0ygABeC0AADTSAAF4XAAANNQAAXiCAAA02gABeLIAADTiAAF40wAANOoAAXj1AAA08gABeSkAADT3AAF5QwAANPwAAXmBAAA1AQABebYAADUGAAF56wAANQsAAXogAAA1EAABelUAADUVAAF6egAANRoAAXqVAAA1HwABerAAADUkAAF6ywAANSkAAXrWAAA1KwABeuAAADUtAAF65QAANTIAAXsPAAA1NwABexoAADU5AAF7JAAANT4AAXtOAAA1RAABe3MAADVMAAF7ngAANVQAAXvAAAA1XAABe/QAADVhAAF8DgAANWYAAXwpAAA1awABfEYAADVwAAF8YgAANXgAAXx+AAA1fQABfKIAADWFAAF9HwAANYsAAX0yAAA1kwABfTcAADWZAAF9WAAANZ8AAX14AAA1oQABfYsAADWpAAF9kAAANa4AAX3OAAA1uwABfdMAADXAAAF+LAAANccAAX4xAAA1zwABfk0AADXSAAF+XAAANd0AAX6CAAA14wABfocAADXoAAF+2QAANe8AAX74AAA19wABf0IAADX8AAF/hQAANgcAAYBCAAA2DQABgGYAADYVAAGAkAAANhcAAYCoAAA2HwABgMUAADYhAAGA3QAANikAAYD6AAA2KwABgRYAADYzAAGBSQAANjgAAYFbAAA2PQABgXoAADZCAAGBrwAANkcAAYHzAAA2TAABgjoAADZRAAGCcAAANlMAAYKSAAA2WwABgvQAADZeAAGDCwAANmMAAYMhAAA2ZQABgzgAADZtAAGDeQAANnIAAYOMAAA2dwABg68AADZ9AAGDywAANoIAAYPdAAA2hwABhA4AADaMAAGERgAANo8AAYRmAAA2kQABhH0AADaZAAGEqwAANpsAAYS2AAA2oQABhLsAADajAAGFrwAANrIAAYYXAAA2wQABhl4AADbGAAGGnwAANssAAYayAAA20wABhtUAADbZAAGG8QAANt4AAYcWAAA24wABhycAADboAAGHUQAANu0AAYdjAAA28gABh24AADb3AAGHgQAANvwAAYejAAA3AQABiJUAADcDAAGI0AAANwkAAYjfAAA3DgABiTsAADcTAAGJ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JQAARpgAAf00AABGngAB/UcAAEagAAH9hQAARroAAf28AABGwwAB/b8AAEbLAAH96AAARtAAAf4AAABG1QAB/hoAAEbmAAH+KQAARuwAAf6CAABG8gAB/o0AAEb4AAH+kAAARv0AAf6TAABHAgAB/pYAAEcIAAH+zgAARxoAAf7YAABHHwAB/y0AAEcpAAH/TwAARzEAAf9nAABHNgAB/2oAAEc+AAH/mgAAR0MAAgAIAABHRgACADkAAEdLAAIAcwAAR1MAAgCCAABHWwACAJIAAEdgAAIAlQAAR2gAAgCYAABHbQACAJsAAEdyAAIA3AAAR3gAAgDfAABHfQACAP8AAEeDAAIBDgAAR4sAAgEeAABHkAACASEAAEeYAAIBJAAAR50AAgEnAABHogACAWgAAEeoAAIBawAAR60AAgGKAABHsAACAakAAEe4AAIB7wAAR7sAAgJkAABH2QACApwAAEfuAAIC7wAAR/UAAgMDAABH+wACAwYAAEgAAAIDFQAASAMAAgNbAABICAACA3MAAEgNAAIDdgAASBIAAgO1AABIFAACA80AAEgZAAID0AAASB4AAgQPAABIIAACBCcAAEglAAIEKgAASCoAAgSmAABILAACBMEAAEgvAAIE1AAASDIAAgTnAABINQACBPwAAEg3AAIFDwAASDoAAgUiAABIPQACBTcAAEg/AAIFTAAASEQAAgVgAABISAACBXQAAEhLAAIFiAAASE4AAgWtAABIVQACBcEAAEhYAAIF/wAASFsAAgYMAABIXQACBhkAAEhfAAIGWQAASGQAAgamAABIZgACBrEAAEhoAAIGtAAASG0AAga3AABIbwACBxMAAEhxAAIHIAAASHMAAgc3AABIewACB48AAEiBAAIHqwAASIkAAgeuAABIjgACCA0AAEiTAAIISAAASJUAAgh4AABIlwACCK4AAEiaAAII3gAASJwAAgk5AABIowACCTwAAEioAAIJSwAASK0AAglkAABIsgACCYkAAEi6AAIJjAAASL8AAgmbAABIxAACCd0AAEjKAAIJ6wAASM8AAgnuAABI1wACCg4AAEjfAAIKEQAASOQAAgogAABI6QACCn0AAEjwAAIKgAAASPgAAgqaAABI+gACCp0AAEj/AAIKwwAASQUAAgrjAABJCwACCuYAAEkNAAIK9wAASRMAAgr6AABJGAACCzwAAEkbAAILPwAASSAAAgtbAABJJgACC14AAEkoAAILrgAASSsAAgu7AABJLgACC74AAEkzAAIL4gAASTkAAgvlAABJPgACC+8AAElEAAIL8gAASUwAAgv4AABJUQACDAgAAElUAAIMJQAASVoAAgwoAABJXAACDFkAAElpAAIM2QAASXYAAgzpAABJewACDOwAAEmAAAIM/QAASYYAAg0AAABJiwACDQ8AAEmOAAINEgAASZMAAg0+AABJmQACDUEAAEmeAAINagAASaQAAg1wAABJqQACDYMAAEmsAAINhgAASbEAAg2YAABJswACDacAAEm4AAIOAAAASboAAg4PAABJvQACDhIAAEnCAAIOMwAAScgAAg42AABJzQACDkAAAEnTAAIOQwAASdsAAg5JAABJ4AACDlkAAEnjAAIOdgAASekAAg55AABJ6wACDs0AAEn8AAIO0AAASgEAAg7aAABKBwACDt0AAEoPAAIO4wAAShQAAg8WAABKGgACDxkAAEocAAIPbAAASikAAg+EAABKLwACD4cAAEo0AAIPkQAASjcAAg+UAABKPAACD7EAAEpCAAIPtAAASkoAAg/1AABKUAACEAQAAEpYAAIQIQAASl4AAhBDAABKYwACEHMAAEplAAIQdgAASmoAAhCdAABKbQACELwAAEpwAAIQ7gAASngAAhDxAABKfQACERYAAEp/AAIRTwAASoIAAhFoAABKhwACEaEAAEqPAAIR5wAASpQAAhHqAABKlgACEf4AAEqbAAISRwAASqAAAhJKAABKogACEogAAEqnAAISiwAASqkAAhLMAABKrAACEt4AAEqxAAIS4QAASrYAAhNJAABKuQACE5MAAErNAAITqQAAStIAAhO4AABK2gACE9UAAErgAAIT9wAASuUAAhRpAABK5wACFJAAAErsAAIUpgAASvIAAhSpAABK+gACFMcAAEr9AAIU9AAASwIAAhVCAABLBQACFVcAAEsHAAIVWgAASwwAAhWEAABLEAACFccAAEsTAAIVygAASxgAAhXpAABLHAACFicAAEsfAAIWKgAASyQAAhZAAABLJwACFkMAAEssAAIWXAAASy8AAhZ0AABLNQACFncAAEs4AAIWrAAASz4AAhavAABLQAACFy8AAEtDAAIXSwAAS0YAAhiTAABLTgACGKUAAEtRAAIYrgAAS1QAAhj3AABLWgACGosAAEtdAAIb7QAAS2AAAh03AABLZgACHUsAAEtrAAIdpwAAS3AAAh/QAABLgQACIBsAAEuJAAIgQQAAS44AAiBdAABLngACIJcAAEuuAAIgsQAAS7AAAiDYAABLtQACIQ8AAEu+AAIiGgAAS88AAiIdAABL1AACI0YAAEvYAAIj9AAAS90AAiQOAABL4gACJCUAAEvqAAIkRAAAS/IAAiSPAABL+gACJJIAAEv/AAIkoQAATAQAAiTOAABMCQACJOAAAEwLAAIk4wAATA0AAiUHAABMFQACJTwAAEwaAAIlUgAATBwAAiV5AABMJAACJZ0AAEwpAAIloAAATDEAAiWjAABMNgACJhkAAEw4AAImfwAATD0AAiaCAABMPwACJpUAAExCAAImmwAATEcAAicZAABMSgACJ0sAAExPAAInYAAATFQAAieeAABMWQACJ7oAAExeAAIn1gAATGMAAifyAABMaAACKIMAAExqAAIojgAATGwAAij3AABMcQACKSEAAEx5AAIqAwAATH4AAizlAABMhwACLOgAAEyMAAItJAAATJIAAi2PAABMmQACLZwAAEybAAIttAAATJ0AAi3BAABMnwACLc4AAEyiAAI0hwAATKkAAjTQAABMrgACNT0AAEy0AAI1lAAATMAAAjWrAABMwgACNcsAAEzEAAI17QAATMwAAjXyAABM0QACNfcAAEzWAAI2OwAATNsAAjZOAABM4AACNngAAEziAAI3dwAATOsAAjd8AABM8AACN4sAAEzzAAI4VQAATPcAAjibAABM+gACOKoAAEz8AAI4+AAATP8AAjk+AABNAgACOU0AAE0EAAI5mwAATQcAAjnhAABNCgACOfAAAE0MAAI6PgAATQ8AAjqEAABNEgACOpMAAE0UAAI61QAATRcAAjsbAABNGgACOyoAAE0cAAI7bAAATR8AAjuyAABNIgACO8EAAE0kAAI8AwAATScAAjxJAABNKgACPFgAAE0sAAI8mgAATS8AAjzgAABNMgACPO8AAE00AAI9PQAATTcAAj2DAABNOgACPZIAAE08AAI94AAATUAAAj4mAABNQwACPjUAAE1FAAI+gwAATUkAAj7HAABNTAACPtYAAE1OAAI/IgAATVIAAj9mAABNVQACP3UAAE1XAAI/tQAATVsAAj/5AABNXgACQAgAAE1gAAJA2wAATWQAAkDoAABNZwACQPUAAE1pAAJBCAAATWsAAkEnAABNcQACQT0AAE15AAJBWQAATYEAAkFoAABNiQACQZIAAE2PAAJBqAAATZUAAkHlAABNnQACQgMAAE2iAAJCBgAATaoAAkIJAABNrAACQk4AAE2yAAJCmAAATboAAkKbAABNvwACQqgAAE3CAAJCwQAATcgAAkLZAABN0AACQtwAAE3VAAJC7wAATdsAAkM9AABN4QACQ0MAAE3sAAJDWAAATfIAAkNbAABN9wACQ2oAAE35AAJDfAAATf8AAkOJAABOBQACQ5gAAE4HAAJDqAAATg0AAkO8AABOEwACQ78AAE4YAAJDzgAAThoAAkPgAABOHQACQ/MAAE4gAAJD/QAATiMAAkQaAABOKQACRB0AAE4uAAJEMAAATjQAAkSBAABONwACRKoAAE48AAJE0AAATkQAAkURAABOVAACRVIAAE5ZAAJFeAAATmEAAkWkAABOZgACRbMAAE5rAAJGTQAATnAAAkZQAABOcgACRoQAAE54AAJGhwAAToAAAkanAABOggACRxAAAE6GAAJHYgAATokAAkgdAABOjQACSFMAAE6QAAJIbQAATpIAAkifAABOlQACSOwAAE6dAAJI7wAATqUAAkkIAABOqAACSREAAE6tAAJJFAAATrIAAklZAABOtgACSWYAAE65AAJJkgAATrsAAkmqAABOwAACScQAAE7GAAJJ9AAATsgAAkpWAABO1gACSmMAAE7ZAAJKcAAATtwAAkqjAABO4QACSsgAAE7nAAJK6wAATu8AAkuuAABO9QACS8wAAE76AAJL5gAATwIAAkv5AABPCgACTDEAAE8QAAJMcQAATxQAAkyaAABPGQACTLQAAE8hAAJMxwAATykAAkz6AABPLwACTRAAAE8xAAJNkQAATzQAAk2tAABPNgACTjgAAE86AAJOVgAATz8AAk5wAABPRwACToMAAE9PAAJOuwAAT1UAAk77AABPWQACTyQAAE9eAAJPPgAAT2YAAk9RAABPbgACT4QAAE90AAJPmgAAT3YAAlAbAABPeQACUDcAAE97AAJQwgAAT38AAlDgAABPhAACUPoAAE+MAAJRDQAAT5QAAlFFAABPmgACUYUAAE+eAAJRrgAAT6MAAlHIAABPqwACUdsAAE+zAAJSDgAAT7kAAlIkAABPuwACUqUAAE++AAJSwQAAT8AAAlNMAABPxAACU2oAAE/JAAJThAAAT9EAAlOXAABP2QACU88AAE/fAAJUDwAAT+MAAlQ4AABP6AACVFIAAE/wAAJUZQAAT/gAAlSYAABP/gACVK4AAFAAAAJU7AAAUAMAAlT7AABQBgACVQoAAFAIAAJVGwAAUAoAAlVZAABQDQACVXcAAFASAAJVlQAAUBgAAlXJAABQHQACVc4AAFAiAAJV3QAAUCgAAlcOAABQKwACVyoAAFAtAAJXZwAAUDEAAleFAABQNgACV5IAAFA8AAJX4QAAUD8AAlfwAABQQQACWAUAAFBGAAJYEgAAUEsAAljEAABQTgACWOIAAFBTAAJY/AAAUFsAAlkPAABQYwACWUcAAFBpAAJZhwAAUG0AAlmwAABQcgACWcoAAFB6AAJZ3QAAUIIAAloQAABQiAACWiYAAFCKAAJaZAAAUI0AAlpzAABQkAACWoIAAFCSAAJakwAAUJQAAlrRAABQlwACWu8AAFCcAAJbDQAAUKIAAltBAABQpwACW0YAAFCsAAJbVQAAULIAAlyGAABQtQACXKIAAFC3AAJc3wAAULsAAlz9AABQwAACXQoAAFDGAAJdWQAAUMkAAl1oAABQywACXX0AAFDQAAJdigAAUNUAAl4wAABQ2AACXk4AAFDdAAJeaAAAUOUAAl57AABQ7QACXrMAAFDzAAJe8wAAUPYAAl8cAABQ+wACXzYAAFEDAAJfSQAAUQsAAl98AABREQACX5IAAFETAAJgEwAAURYAAmAvAABRGAACYGwAAFEcAAJgigAAUSEAAmCXAABRJgACYOYAAFEpAAJg9QAAUSsAAmEKAABRMAACYRcAAFE1AAJhuQAAUTgAAmHXAABRPQACYfEAAFFFAAJiBAAAUU0AAmI8AABRUwACYnwAAFFWAAJipQAAUVsAAmK/AABRYwACYtIAAFFrAAJjBQAAUXEAAmMbAABRcwACY5wAAFF2AAJjuAAAUXgAAmP1AABRfAACZBMAAFGBAAJkIAAAUYYAAmRvAABRiQACZH4AAFGLAAJkkwAAUZAAAmSgAABRlQACZUIAAFGYAAJlYAAAUZ0AAmV6AABRpQACZY0AAFGtAAJlxQAAUbMAAmYFAABRtgACZi4AAFG7AAJmSAAAUcMAAmZbAABRywACZo4AAFHRAAJnGgAAUdQAAmc2AABR1gACZ3MAAFHaAAJnkQAAUd8AAmeeAABR5AACZ+0AAFHnAAJn/AAAUekAAmgRAABR7gACaB4AAFHzAAJowAAAUfYAAmjeAABR+wACaPgAAFIDAAJpCwAAUgsAAmlDAABSEQACaYMAAFIUAAJprAAAUhkAAmnGAABSIQACadkAAFIpAAJqDAAAUi8AAmqYAABSMgACarQAAFI0AAJq8QAAUjgAAmsPAABSPQACaxwAAFJCAAJrawAAUkUAAmt6AABSRwACa48AAFJMAAJrnAAAUlEAAmwuAABSVAACbDsAAFJXAAJsSAAAUlkAAmxbAABSWwACbHoAAFJhAAJskAAAUmkAAmysAABScQACbLsAAFJ5AAJs5QAAUn8AAmz7AABShQACbTgAAFKNAAJtVgAAUpIAAm1ZAABSmgACbVwAAFKcAAJtoQAAUqIAAm3vAABSqgACbfIAAFKvAAJt/wAAUrIAAm4YAABSuAACbjAAAFLAAAJuMwAAUsUAAm5GAABSywACbpQAAFLRAAJumgAAUtwAAm6vAABS4gACbrIAAFLnAAJuwQAAUukAAm7TAABS7wACbuAAAFL1AAJu7wAAUvcAAm7/AABS/QACbxMAAFMDAAJvFgAAUwgAAm8lAABTCgACbzcAAFMNAAJvSgAAUxAAAm9UAABTEwACb3EAAFMZAAJvdgAAUx4AAm+LAABTJAACb+gAAFMnAAJwGwAAUywAAnBJAABTNAACcIUAAFNBAAJwmAAAU0cAAnDnAABTTAACcRUAAFNUAAJxSQAAU1kAAnFcAABTXwACchIAAFNkAAJyFwAAU2YAAnJVAABTbAACcloAAFN0AAJygAAAU3YAAnMFAABTegACc2kAAFN9AAJ0SAAAU4EAAnSMAABThAACdKoAAFOGAAJ06gAAU4oAAnVJAABTkgACdU4AAFOaAAJ1awAAU50AAnV2AABTowACdXsAAFOoAAJ10AAAU6wAAnXfAABTrwACdg8AAFOxAAJ2LQAAU7YAAnZNAABTvAACdocAAFO+AAJ2oQAAU84AAncDAABT0QACdxIAAFPUAAJ3IQAAU9cAAndcAABT3AACd4sAAFPiAAJ3tgAAU+oAAniDAABT8AACeKEAAFP1AAJ4uwAAU/0AAnjOAABUBQACeQYAAFQLAAJ5RgAAVA8AAnlvAABUFAACeYkAAFQcAAJ5nAAAVCQAAnnPAABUKgACelsAAFQtAAJ6dwAAVC8AAnq0AABUMwACetIAAFQ4AAJ63wAAVD4AAnsuAABUQQACez0AAFRDAAJ7UgAAVEkAAntfAABUTgACfA0AAFRRAAJ8KwAAVFYAAnxFAABUXgACfFgAAFRmAAJ8kAAAVGwAAnzQAABUcAACfPkAAFR1AAJ9EwAAVH0AAn0mAABUhQACfVkAAFSLAAJ95QAAVI4AAn4BAABUkAACfj4AAFSUAAJ+XAAAVJkAAn5pAABUnwACfrgAAFSiAAJ+xwAAVKQAAn7cAABUqgACfukAAFSvAAJ/gQAAVLIAAn+QAABUtQACf58AAFS3AAJ/sgAAVLkAAn/VAABUvwACf+8AAFTHAAKAEQAAVM8AAoAkAABU1wACgFYAAFTdAAKAdAAAVOMAAoC/AABU6wACgOUAAFTwAAKA6gAAVPgAAoDvAABU+gACgUIAAFUAAAKBpAAAVQgAAoGpAABVEAACgbgAAFUTAAKB1wAAVRkAAoHzAABVIQACgfgAAFUmAAKCDwAAVSwAAoJrAABVMgACgnUAAFU9AAKCjAAAVUMAAoKRAABVSAACgqQAAFVNAAKCuAAAVVMAAoLHAABVWQACgtoAAFVeAAKC7gAAVWQAAoMGAABVagACgwsAAFVvAAKDHgAAVXQAAoMyAABVdwACg0kAAFV6AAKDVQAAVX0AAoN6AABVgwACg38AAFWIAAKDlgAAVY4AAoPtAABVlAAChCAAAFWaAAKETgAAVaIAAoRsAABVsAAChIoAAFWyAAKEnQAAVbgAAoTsAABVvQAChRoAAFXFAAKFOAAAVc0AAoVOAABV0gAChWEAAFXYAAKGEwAAVd0AAoYYAABV3wAChlYAAFXlAAKGWwAAVe0AAoaBAABV7wAChwYAAFXzAAKHZgAAVfYAAog7AABV+gACiH0AAFX9AAKImQAAVf8AAojZAABWAwACiTQAAFYLAAKJOQAAVhMAAolWAABWFgACiWEAAFYcAAKJZgAAViEAAom7AABWJQACicoAAFYoAAKJ+AAAVioAAooWAABWLwACijYAAFY1AAKKbgAAVjcAAoqIAABWRgACiuoAAFZJAAKK+QAAVkwAAosIAABWTwACi0EAAFZUAAKLcAAAVloAAoubAABWYgACjGgAAFZoAAKMhAAAVm0AAoyeAABWdQACjLEAAFZ9AAKM6QAAVoMAAo0pAABWhwACjVAAAFaMAAKNagAAVpQAAo19AABWnAACjbAAAFaiAAKOPAAAVqUAAo5YAABWpwACjpUAAFarAAKOsQAAVrAAAo6+AABWtgACjw0AAFa5AAKPHAAAVrsAAo8vAABWwQACjzwAAFbGAAKP1AAAVskAAo/jAABWzAACj/IAAFbOAAKQBQAAVtAAApAoAABW1gACkEIAAFbeAAKQZAAAVuYAApB3AABW7gACkKkAAFb0AAKQxwAAVvoAApESAABXAgACkTgAAFcHAAKRPQAAVw8AApFCAABXEQACkZUAAFcXAAKR9wAAVx8AApH8AABXJwACkgsAAFcqAAKSKgAAVzAAApJGAABXOAACkksAAFc9AAKSYgAAV0MAApK+AABXSQACksgAAFdUAAKS3wAAV1oAApLkAABXXwACkvcAAFdkAAKTCwAAV2oAApMaAABXcAACky0AAFd1AAKTQQAAV3sAApNZAABXgQACk14AAFeGAAKTcQAAV4sAApOFAABXjgACk5wAAFeRAAKTqAAAV5QAApPNAABXmgACk9IAAFefAAKT6QAAV6UAApRAAABXqwAClHMAAFexAAKUoQAAV7kAApS/AABXxwAClN0AAFfJAAKU8AAAV88AApU/AABX1AAClW0AAFfcAAKViwAAV+QAApWhAABX6QAClbQAAFfvAAKWZgAAV/QAApZrAABX9gAClqkAAFf8AAKWrgAAWAQAApbUAABYBgACl1kAAFgKAAKXuQAAWA0AApiOAABYEQACmNAAAFgUAAKY7AAAWBYAApksAABYGgACmYcAAFgiAAKZjAAAWCoAApmpAABYLQACmbQAAFgzAAKZuQAAWDgAApoOAABYPAACmh0AAFg/AAKaSwAAWEEAApppAABYRgACmokAAFhMAAKawQAAWE4AAprbAABYXQACmz0AAFhgAAKbTAAAWGMAAptbAABYZgACm5QAAFhrAAKbwwAAWHEAApvuAABYeQACnLsAAFh/AAKc1wAAWIQAApzxAABYjAACnQQAAFiUAAKdPAAAWJoAAp18AABYngACnaMAAFijAAKdvQAAWKsAAp3QAABYswACngMAAFi5AAKejwAAWLwAAp6rAABYvgACnugAAFjCAAKfBAAAWMcAAp8RAABYzQACn2AAAFjQAAKfbwAAWNIAAp+CAABY2AACn48AAFjdAAKgJwAAWOAAAqA2AABY4wACoEUAAFjlAAKgWAAAWOcAAqB7AABY7QACoJUAAFj1AAKgtwAAWP0AAqDKAABZBQACoPwAAFkLAAKhGgAAWREAAqFlAABZGQACoYsAAFkeAAKhkAAAWSYAAqGVAABZKAACoegAAFkuAAKiSgAAWTYAAqJPAABZPgACol4AAFlBAAKifQAAWUcAAqKZAABZTwACop4AAFlUAAKitQAAWVoAAqMRAABZYAACoxsAAFlrAAKjMgAAWXEAAqM3AABZdgACo0oAAFl7AAKjXgAAWYEAAqNtAABZhwACo4AAAFmMAAKjlAAAWZIAAqOsAABZmAACo7EAAFmdAAKjxAAAWaIAAqPYAABZpQACo+8AAFmoAAKj+wAAWasAAqQgAABZsQACpCUAAFm2AAKkPAAAWbwAAqSTAABZwgACpMYAAFnIAAKk9AAAWdAAAqUSAABZ3gACpTAAAFngAAKlQwAAWeYAAqWSAABZ6wACpcAAAFnzAAKl3gAAWfsAAqX0AABaAAACpgcAAFoGAAKmuQAAWgsAAqa+AABaDQACpvwAAFoTAAKnAQAAWhsAAqcnAABaHQACp6wAAFohAAKoDAAAWiQAAqjhAABaKAACqSMAAForAAKpPwAAWi0AAql/AABaMQACqdoAAFo5AAKp3wAAWkEAAqn8AABaRAACqgcAAFpKAAKqDAAAWk8AAqphAABaUwACqnAAAFpWAAKqngAAWlgAAqq8AABaXQACqtwAAFpjAAKrFAAAWmUAAqsuAABadAACq5AAAFp3AAKrnwAAWnoAAquuAABafQACq+cAAFqCAAKsFgAAWogAAqxBAABakAACrQ4AAFqWAAKtKgAAWpsAAq1EAABaowACrVcAAFqrAAKtjwAAWrEAAq3PAABatQACrfYAAFq6AAKuEAAAWsIAAq4jAABaygACrlYAAFrQAAKu4gAAWtMAAq7+AABa1QACrzsAAFrZAAKvVwAAWt4AAq9kAABa5AACr7MAAFrnAAKvwgAAWukAAq/VAABa7wACr+IAAFr0AAKwhAAAWvcAArCiAABa/AACsLwAAFsEAAKwzwAAWwwAArEHAABbEgACsUcAAFsWAAKxcAAAWxsAArGKAABbIwACsZ0AAFsrAAKx0AAAWzEAArJcAABbNAACsngAAFs2AAKzAwAAWzoAArMhAABbPwACszsAAFtHAAKzTgAAW08AArOGAABbVQACs8YAAFtZAAKz7wAAW14AArQJAABbZgACtBwAAFtuAAK0TwAAW3QAArRlAABbdgACtOYAAFt5AAK1AgAAW3sAArWNAABbfwACtasAAFuEAAK1xQAAW4wAArXYAABblAACthAAAFuaAAK2UAAAW54AArZ5AABbowACtpMAAFurAAK2pgAAW7MAArbZAABbuQACtu8AAFu7AAK3cAAAW74AAreMAABbwAACuAsAAFvEAAK4KQAAW8kAArhDAABb0QACuFYAAFvZAAK4jgAAW98AArjOAABb4wACuPcAAFvoAAK5EQAAW/AAArkkAABb+AACuVcAAFv+AAK5bQAAXAAAArnuAABcAwACugoAAFwFAAK6RwAAXAkAArplAABcDgACunIAAFwUAAK6wQAAXBcAArrQAABcGQACuuUAAFweAAK68gAAXCMAAruUAABcJgACu7IAAFwrAAK7zAAAXDMAArvfAABcOwACvBcAAFxBAAK8VwAAXEUAAryAAABcSgACvJoAAFxSAAK8rQAAXFoAArzgAABcYAACvPYAAFxiAAK9dwAAXGUAAr2TAABcZwACvdAAAFxrAAK97gAAXHAAAr37AABcdgACvkoAAFx5AAK+WQAAXHsAAr5uAABcgAACvnsAAFyFAAK/HQAAXIgAAr87AABcjQACv1UAAFyVAAK/aAAAXJ0AAr+gAABcowACv+AAAFymAALACQAAXKsAAsAjAABcswACwDYAAFy7AALAaQAAXMEAAsB/AABcwwACwQAAAFzGAALBHAAAXMgAAsFZAABczAACwXcAAFzRAALBhAAAXNYAAsHTAABc2QACweIAAFzbAALB9wAAXOAAAsIEAABc5QACwqYAAFzoAALCxAAAXO0AAsLeAABc9QACwvEAAFz9AALDKQAAXQMAAsNpAABdBgACw5IAAF0LAALDrAAAXRMAAsO/AABdGwACw/IAAF0hAALECAAAXSMAAsSJAABdJgACxKUAAF0oAALE4gAAXSwAAsUAAABdMQACxQ0AAF02AALFXAAAXTkAAsVrAABdOwACxYAAAF1AAALFjQAAXUUAAsYvAABdSAACxk0AAF1NAALGZwAAXVUAAsZ6AABdXQACxrIAAF1jAALG8gAAXWYAAscbAABdawACxzUAAF1zAALHSAAAXXsAAsd7AABdgQACyAcAAF2EAALIIwAAXYYAAshgAABdigACyH4AAF2PAALIiwAAXZQAAsjaAABdlwACyOkAAF2ZAALI/gAAXZ4AAskLAABdowACya0AAF2mAALJywAAXasAAsnlAABdswACyfgAAF27AALKMAAAXcEAAspwAABdxAACypkAAF3JAALKswAAXdEAAsrGAABd2QACyvkAAF3fAALLhQAAXeIAAsuhAABd5AACy94AAF3oAALL/AAAXe0AAswJAABd8gACzFgAAF31AALMZwAAXfcAAsx8AABd/AACzIkAAF4BAALNKwAAXgQAAs1JAABeCQACzWMAAF4RAALNdgAAXhkAAs2uAABeHwACze4AAF4jAALOFwAAXigAAs4xAABeMAACzkQAAF44AALOdwAAXj4AAs8DAABeQQACzx8AAF5DAALPXAAAXkcAAs96AABeTAACz4cAAF5SAALP1gAAXlUAAs/lAABeVwACz/oAAF5dAALQBwAAXmIAAtCpAABeZQAC0McAAF5qAALQ4QAAXnIAAtD0AABeegAC0SwAAF6AAALRbAAAXoQAAtGVAABeiQAC0a8AAF6RAALRwgAAXpkAAtH1AABenwAC0oEAAF6iAALSnQAAXqQAAtLaAABeqAAC0vgAAF6tAALTBQAAXrMAAtNUAABetgAC02MAAF64AALTeAAAXr4AAtOFAABewwAC1CcAAF7GAALUQwAAXssAAtRdAABe0wAC1HAAAF7bAALUqAAAXuEAAtToAABe5QAC1Q8AAF7qAALVKQAAXvIAAtU8AABe+gAC1W8AAF8AAALV+wAAXwMAAtYXAABfBQAC1lQAAF8JAALWcAAAXw4AAtZ9AABfFAAC1swAAF8XAALW2wAAXxkAAtbuAABfHwAC1vsAAF8kAALXnQAAXycAAte5AABfLAAC19MAAF80AALX5gAAXzwAAtgeAABfQgAC2F4AAF9GAALYhQAAX0sAAtifAABfUwAC2LIAAF9bAALY5QAAX2EAAtlxAABfZAAC2Y0AAF9mAALZygAAX2oAAtnmAABfbwAC2fMAAF91AALaQgAAX3gAAtpRAABfegAC2mQAAF+AAALacQAAX4UAAtsTAABf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zQADKisAAGjQAAMqRQAAaNYAAypgAABo2AADKwUAAGjbAAMrSQAAaN0AAyt4AABo4AADK4IAAGjmAAMrnwAAaO8AAyuzAABo9AADLGgAAGj3AAMsowAAaPkAAyywAABo/AADLMcAAGj+AAMs6wAAaQMAAy2gAABpBgADLj0AAGkIAAMu2gAAaQoAAy93AABpDAADMBQAAGkOAAMwsQAAaRAAAzFOAABpEgADMesAAGkUAAMyiAAAaRYAAzMjAABpGAADM74AAGkaAAM0WQAAaRwAAzU7AABpHgADNUoAAGkgAAM1bAAAaSIAAzWSAABpJwADNaUAAGkvAAM1zQAAaTQAAzXgAABpOQADNjcAAGk7AAM2VQAAaT0AAzaVAABpPwADNrMAAGlBAAM3AwAAaUMAAzcgAABpSAADN0YAAGlQAAM3owAAaVUAAzfBAABpVwADOAMAAGlZAAM4IQAAaVsAAzhnAABpXQADOIUAAGlfAAM4xQAAaWEAAzjjAABpYwADOScAAGllAAM5NgAAaWcAAzlFAABpaQADOV4AAGluAAM5mwAAaXYAAznYAABpfgADOd0AAGmGAAM6JQAAaYsAAzwuAABpjQADPGYAAGmPAAM8ggAAaZQAAzyeAABpmQADPLoAAGmeAAM81wAAaaMAAz0OAABpqAADPSwAAGmtAAM9ugAAabIAAz3KAABptQADPhQAAGm4AAM+dAAAabsAAz6JAABpwAADPp4AAGnFAAM+uQAAacgAAz7WAABpygADPv4AAGnPAAM/EgAAadQAAz9DAABp3AADP0YAAGnhAAM/SQAAaeMAAz9MAABp5QADQFYAAGnoAANAfQAAaesAA0CAAABp8AADQJgAAGnyAANAmwAAafcAA0DNAABp+gADQOYAAGn9AANBHQAAagYAA0FMAABqEwADQU8AAGoVAANBkgAAah4AA0HGAABqIQADQiQAAGojAANCJwAAaigAA0J/AABqNQADQoIAAGo/AANCmQAAakIAA0MLAABqSgADQw4AAGpPAANDPQAAalkAA0NfAABqYQADQ2IAAGprAANDigAAam4AA0OtAABqdgADRDAAAGqGAANEowAAaosAA0S4AABqkAADRN4AAGqVAANE8wAAapoAA0VTAABqnwADRWgAAGqkAANFjQAAaq4AA0WlAABquAADRb0AAGrCAANGAQAAaswAA0YEAABq0QADRmwAAGrbAANGbwAAauAAA0Z5AABq5QADRqIAAGrqAANGwQAAau8AA0csAABq9AADR0EAAGr5AANHZAAAav4AA0dnAABrAwADR80AAGsIAANH9gAAaxIAA0f5AABrFwADSEMAAGscAANIrwAAayEAA0jSAABrJgADSNUAAGsrAANJOAAAazAAA0lhAABrOgADSWQAAGs/AANJiwAAa0QAA0tcAABrSQADTGQAAGtOAANM4gAAa1QAA00dAABrVwADTTYAAGtcAANNdAAAa18AA02LAABrZAADTY4AAGtpAANNpQAAa2wAA06WAABrbwADTroAAGt0AANO3wAAa3kAA08lAABrfgADT5cAAGuBAANPxQAAa4YAA1A5AABrjQADULcAAGuTAANTSgAAa5cAA1NpAABrmwADU4gAAGufAANTpQAAa6IAA1QCAABrpQADVBoAAGuqAANUHQAAa7IAA1QuAABruAADVDEAAGvAAANUNAAAa8UAA1RmAABrxwADVHAAAGvWAANUcwAAa9sAA1SPAABr6gADVJIAAGvvAANUsgAAa/UAA1S1AABr/QADVNQAAGwDAANU1wAAbAgAA1TtAABsCwADVPAAAGwTAANVFAAAbCYAA1VPAABsKwADVVIAAGwwAANVYQAAbDYAA1WHAABsSQADVdMAAGxMAANV9QAAbFEAA1YUAABsVgADVhcAAGxeAANWGgAAbGQAA1ZBAABsdQADVr8AAGx4AANXJgAAbHsAA1dlAABsfgADV9cAAGyBAANYGQAAbIQAA1gcAABsiQADWDQAAGyMAANYRQAAbI8AA1hUAABskQADWIMAAGyUAANYiwAAbJYAA1jKAABsmQADWPEAAGygAANZGwAAbKYAA1k2AABsrgADWasAAGyxAANZrgAAbLYAA1nXAABsvgADWnIAAGzJAANapgAAbMsAA1rZAABs0wADWv8AAGzYAANbDgAAbN0AA1srAABs4wADW0MAAGzvAANbVQAAbPcAA1uMAABs/QADW48AAG0FAANbrwAAbQoAA1uyAABtDwADXAQAAG0XAANcggAAbRwAA1zOAABtIwADXT8AAG0rAANdQgAAbTAAA13GAABtNwADXckAAG08AANd2wAAbUEAA14TAABtRwADXiIAAG1MAANeSgAAbVUAA15pAABtWgADXmwAAG1fAANekQAAbWIAA18JAABtawADXxgAAG1wAANfOAAAbXkAA19XAABtewADX1oAAG2AAANfXQAAbYUAA194AABthwADX/QAAG2XAANgewAAbZoAA2COAABtoAADYKEAAG2mAANgtAAAbawAA2DHAABtsgADYNoAAG24AANg7AAAbbwAA2D2AABtvwADYQoAAG3DAANhEwAAbckAA2EsAABtywADYT0AAG3PAANhUAAAbdUAA2FiAABt2AADYXUAAG3cAANhhQAAbd8AA2GYAABt4gADYasAAG3lAANhvgAAbesAA2HRAABt8QADYeQAAG33AANh9wAAbf0AA2IKAABuAwADYh0AAG4IAANiLgAAbg4AA2KEAABuFwADYuQAAG4cAANjRAAAbiEAA2OkAABuJgADY+4AAG4pAANkEwAAbi4AA2QtAABuNgADZHQAAG4+AANkfwAAbkYAA2SbAABuSwADZKoAAG5QAANktQAAblIAA2TOAABuWgADZO0AAG5cAANlHQAAbmQAA2VNAABuaQADZXoAAG5rAANlpAAAbnYAA2WpAABuewADZeUAAG59AANl6gAAboUAA2YAAABujQADZgsAAG6VAANmFgAAbp0AA2YvAABuogADZjQAAG6qAANmVgAAbrIAA2aNAAButwADZtUAAG65AANm2gAAbsEAA2bwAABuyQADZvsAAG7RAANnBgAAbtkAA2cfAABu3gADZyQAAG7mAANnPAAAbusAA2dBAABu8AADZ6YAAG74AANn4QAAbv4AA2f3AABvBgADaEsAAG8UAANoYgAAbxwAA2h4AABvIQADaH0AAG8pAANomgAAby4AA2imAABvNgADaLcAAG8+AANowgAAb0YAA2jgAABvSwADaOUAAG9QAANpCQAAb1MAA2liAABvXwADaWcAAG9kAANpiwAAb2cAA2odAABvcQADaj4AAG95AANqVQAAb4EAA2qeAABvjAADarQAAG+UAANqywAAb5wAA2r3AABvpwADavwAAG+sAANrIAAAb68AA2wkAABvvwADbFEAAG/HAANscwAAb8wAA2x4AABv0QADbIsAAG/WAANsvQAAb9sAA2zhAABv4wADbQUAAG/rAANtHAAAb/MAA20oAABv+wADbVoAAHADAANtfwAAcAsAA22LAABwEwADbZcAAHAbAANtsAAAcCYAA23KAABwKwADbfwAAHA2AANuGQAAcDsAA25DAABwQwADblgAAHBOAANuXQAAcFMAA26FAABwWwADbpsAAHBgAANuvwAAcGUAA27EAABwagADbuYAAHBwAANvDAAAcHgAA28hAABwgAADbzkAAHCFAANvPgAAcI0AA29UAABwlQADb18AAHCdAANvagAAcKUAA2+DAABwqgADb4gAAHCyAANvtAAAcLoAA2/OAABwygADb9MAAHDPAANv5gAAcNUAA2/6AABw1wADcDYAAHDgAANwYQAAcOgAA3BuAABw8AADcHkAAHD1AANwkwAAcPsAA3ClAABxAAADcN0AAHEJAANw8gAAcRQAA3D3AABxGQADcQ8AAHEeAANxUAAAcSEAA3FrAABxJwADcXcAAHEvAANxhQAAcTQAA3GKAABxPAADca0AAHFCAANxsgAAcUoAA3HSAABxTwADcdcAAHFXAANx5gAAcVwAA3IQAABxYQADchsAAHFmAANyIAAAcWsAA3JBAABxcAADcvIAAHGDAANzIAAAcZMAA3NOAABxowADc3wAAHGzAANzqgAAccMAA3P6AABxxwADdA4AAHHMAAN0hAAAcdoAA3SvAABx3wADdMUAAHHkAAN00QAAcewAA3T8AABx9wADdR4AAHH8AAN1MgAAcgQAA3VFAAByCQADdWwAAHIOAAN1gAAAchYAA3WTAAByGwADdbUAAHIgAAN2BAAAciYAA3YQAAByLgADdh0AAHI2AAN2KAAAcjsAA3ZZAAByQwADdl4AAHJJAAN2kwAAck0AA3bCAAByUgADducAAHJXAAN2+wAAcl8AA3cbAAByZAADdyAAAHJqAAN3cgAAcnEAA3eKAABydgADd48AAHJ+AAN3rwAAcoQAA3fNAAByhwADeGMAAHKNAAN4aAAAcpUAA3iHAABymwADeIwAAHKgAAN43QAAcqoAA3joAAByrQADeTUAAHK1AAN5RwAAcroAA3lcAAByvQADeWEAAHLFAAN5ZgAAcsoAA3mbAABy0AADeaAAAHLVAAN51wAActsAA3pEAABy3wADewUAAHLiAAN7NgAAcucAA3tPAABy7QADe2gAAHLzAAN7pAAAcvkAA3vJAABy/AADe9sAAHMCAAN8JwAAcwcAA3wsAABzDAADfF0AAHMZAAN8rAAAcysAA3zuAABzOgADfTEAAHNJAAN9VQAAc1EAA31wAABzWQADfa0AAHNeAAN90AAAc2YAA33VAABzawADfmoAAHNvAAN+kQAAc3cAA36WAABzfQADfxEAAHOHAAN/FgAAc4wAA39NAABzkAADf3gAAHOYAAN/mQAAc6AAA3+sAABzogADf+YAAHOqAAN/6wAAc68AA4AOAABzsgADgCgAAHO6AAOALQAAc78AA4B9AABzzAADgLkAAHPUAAOAvgAAc9kAA4ENAABz3wADgRIAAHPkAAOBSQAAc+gAA4FjAABz8gADgXYAAHP6AAOBpQAAdAUAA4G7AAB0EAADgfwAAHQWAAOCAQAAdBsAA4JKAAB0IgADgk8AAHQnAAOCYwAAdC0AA4JxAAB0NQADgrIAAHQ+AAOCygAAdEkAA4LdAAB0TgADgyAAAHRUAAODOAAAdF8AA4NLAAB0ZAADg1AAAHRpAAODswAAdGwAA4POAAB0cQADg+AAAHRzAAOD+wAAdHgAA4QNAAB0egADhFIAAHSAAAOEZQAAdIYAA4R6AAB0jAADhRwAAHSTAAOF5gAAdJwAA4YAAAB0owADhjAAAHSwAAOGTwAAdLcAA4Z1AAB0vAADhngAAHTEAAOGswAAdMsAA4bSAAB00gADhuQAAHTXAAOHBgAAdNkAA4cJAAB04QADh0QAAHToAAOHYwAAdO8AA4d1AAB09AADh5cAAHT7AAOIJAAAdP0AA4gsAAB1AgADiFwAAHUHAAOJeAAAdREAA4nGAAB1FwADipIAAHUlAAOLBwAAdSwAA4slAAB1MQADi0MAAHU2AAOLYQAAdTsAA4ymAAB1QAADjK4AAHVFAAOM3gAAdUoAA42sAAB1TgADjrgAAHVYAAOO2AAAdV8AA47wAAB1bAADjyEAAHVxAAOPPgAAdX4AA49zAAB1gwADj3gAAHWLAAOPkAAAdZMAA4/FAAB1mAADj8oAAHWgAAOP4gAAdagAA5ATAAB1rQADkDAAAHW6AAOQZQAAdb8AA5CCAAB1zAADkLQAAHXWAAORgQAAdeAAA5J9AAB17AADkqEAAHXuAAOSrgAAdfEAA5LHAAB1/gADktcAAHYAAAOS6QAAdgIAA5MuAAB2CQADkzEAAHYMAAOThQAAdhIAA5SMAAB2HgADlKEAAHYkAAOVHgAAdioAA5UyAAB2MwADlZYAAHY2AAOVvwAAdj4AA5XVAAB2RgADldoAAHZLAAOWDAAAdk4AA5YWAAB2VAADlhsAAHZWAAOWPAAAdl8AA5ZQAAB2YQADltYAAHZkAAOXGQAAdmwAA5ceAAB2cQADl0kAAHZ0AAOXUwAAdncAA5dmAAB2fQADl2sAAHZ/AAOXkgAAdogAA5i2AAB2igADmRgAAHaRAAOZGwAAdpMAA5nnAAB2lgADmhIAAHabAAOaRwAAdp0AA5pgAAB2ogADmqIAAHaqAAOawAAAdqwAA5sXAAB2rwADm3wAAHa6AAObmgAAdrwAA5vTAAB2vwADm/kAAHbEAAOcJwAAdsYAA5xvAAB2yAADnIoAAHbLAAOcnQAAds4AA5zNAAB20QADnOAAAHbTAAOdHgAAdtUAA50hAAB22gADnTkAAHbdAAOdSAAAduMAA51LAAB25gADnVgAAHbsAAOdkwAAdvIAA52WAAB29wADngIAAHcFAAOeBQAAdwcAA54yAAB3DQADnjUAAHcVAAOeigAAdxoAA56NAAB3HAADnswAAHcfAAOezwAAdyQAA575AAB3JgADnw8AAHcrAAOfTwAAdy0AA59cAAB3MAADn48AAHczAAOfvgAAdzgAA5/BAAB3OgADn/AAAHc9AAOgHwAAd1EAA6CUAAB3XgADoJcAAHdmAAOgwQAAd2sAA6FUAAB3bgADoVwAAHdzAAOhjAAAd3gAA6KhAAB3ggADpAEAAHeSAAOkNwAAd5UAA6TBAAB3lwADpRAAAHefAAOlEwAAd6QAA6UdAAB3pwADpTcAAHesAAOmlAAAd7YAA6asAAB3wAADpsQAAHfKAAOm3AAAd9QAA6b0AAB33gADpwwAAHfoAAOnUAAAd+0AA6fOAAB38gADp9sAAHf1AAOn+wAAd/cAA6gIAAB3+gADqEIAAHf8AAOoTwAAd/8AA6jTAAB4AQADqOkAAHgEAAOpUAAAeAsAA6spAAB4EwADq1UAAHgaAAOsEQAAeB4AA6wvAAB4IwADrMEAAHgsAAOs1AAAeDEAA6zoAAB4OwADrQAAAHhIAAOtMQAAeE0AA602AAB4VQADrU4AAHhdAAOtgwAAeGIAA62IAAB4agADraAAAHhyAAOt0gAAeHwAA6+PAAB4fgADsMAAAHiJAAOxEAAAeJEAA7EsAAB4lgADsb0AAHiaAAOx0QAAeJ4AA7IfAAB4oQADsiwAAHikAAOyeQAAeKYAA7KRAAB4qQADsp8AAHisAAOyvgAAeLEAA7LXAAB4swADsvAAAHi1AAOznwAAeLcAA7PaAAB4ugADtIoAAHi/AAO0kgAAeMIAA7YJAAB4xQADtmUAAHjKAAO2hQAAeM8AA7emAAB41AADvD8AAHjZAAO8dQAAeNwAA7ykAAB43wADvQQAAHjsAAO9cwAAeO8AA72AAAB48gADvY0AAHj0AAO9qAAAePwAA73XAAB5AQADveoAAHkEAAO+FQAAeQoAA74kAAB5EgADvj8AAHkYAAO+bQAAeSUAA752AAB5KgADvqgAAHkvAAO+8QAAeTIAA77+AAB5NQADvwsAAHk3AAO/PgAAeT0AA79LAAB5QAADv1gAAHlCAAO/aQAAeUUAA7+HAAB5SwADv50AAHlTAAO/rAAAeVsAA7/RAAB5YQADv98AAHlnAAO/+wAAeW8AA8AKAAB5dwADwDUAAHl9AAPATgAAeYMAA8BsAAB5iAADwIkAAHmNAAPAwAAAeZUAA8DDAAB5mgADwNgAAHmdAAPBiwAAeaMAA8GeAAB5qQADwbkAAHmxAAPB2gAAebkAA8IJAAB5vgADwiwAAHnGAAPCRwAAecsAA8KoAAB53gADwrUAAHnhAAPC3wAAeeMAA8L3AAB56AADww8AAHnuAAPDLQAAefMAA8NfAAB5+AADw24AAHn+AAPDkgAAegMAA8QaAAB6CAADxB0AAHoQAAPENAAAehYAA8Q9AAB6GwADxEAAAHogAAPFCQAAeiMAA8UWAAB6JQADxVAAAHooAAPFtAAAeisAA8XBAAB6LgADxesAAHowAAPGAwAAejUAA8YbAAB6OwADxjkAAHpAAAPGawAAekUAA8aQAAB6SwADxrMAAHpTAAPG4QAAemIAA8bqAAB6ZwADxx4AAHppAAPHOwAAem8AA8fDAAB6dAADx8YAAHp8AAPH3QAAeoIAA8fmAAB6hwADx+kAAHqMAAPIWgAAeo8AA8hyAAB6kgADyIYAAHqWAAPIxgAAepoAA8kcAAB6nAADyZcAAHqmAAPJmgAAeq4AA8mpAAB6swADydgAAHrNAAPJ5wAAetIAA8oBAAB62gADygQAAHrfAAPKVwAAeuEAA8ptAAB65AADyoAAAHrnAAPKxQAAeukAA8twAAB67wADy3sAAHryAAPL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PwAAiq8ABERaAACKsQAERIwAAIq5AARE0AAAir4ABEUhAACKywAERTQAAIrRAARFcQAAitkABEWfAACK3gAERg0AAIrjAARGGgAAiuUABEY/AACK5wAERmcAAIrvAARGfQAAivcABEaoAACK/wAERssAAIsHAARG4wAAiw4ABEb7AACLEAAERw8AAIsWAARHVQAAixsABEd4AACLIwAER5AAAIsqAARHtwAAiy8ABEggAACLMQAESC0AAIszAARIZQAAizYABEkXAACLOwAESRoAAItFAARJWgAAi00ABEoHAACLVQAESjQAAItdAARKNwAAi2cABEpGAACLbwAESnMAAIt3AARKkQAAi30ABEq0AACLhQAESs8AAIuKAARK0gAAi48ABErqAACLkgAES00AAIuWAARLWgAAi5gABEtzAACLogAES5gAAIusAARLrAAAi7IABEvCAACLugAES8UAAIvCAARL5QAAi8kABEwQAACLzwAETDMAAIvXAARMTgAAi9wABExRAACL4QAETFoAAIvnAARMfQAAi+4ABEzHAACL8gAETOEAAIv6AARM7AAAjAIABEzvAACMCQAETP4AAIwRAARNPAAAjBUABE1rAACMHQAETYEAAIwlAARNkAAAjC8ABE23AACMNwAETdsAAIw9AAROBAAAjEIABE4HAACMTAAETk0AAIxSAAROWgAAjFcABE58AACMXAAETpIAAIxkAAROoQAAjG4ABE7IAACMdgAETxcAAIx8AARPGgAAjIMABE8pAACMiwAET1gAAIyRAARPewAAjJkABE+VAACMngAET8MAAIymAARP7AAAjKsABE/7AACMtQAEUBIAAIy7AARQLQAAjL0ABFAwAACMxwAEUGcAAIzPAARQlAAAjNIABFChAACM1wAEUMIAAIzZAARQ4QAAjOMABFDvAACM6QAEUQUAAIzxAARRFAAAjPsABFE7AACNAwAEUYcAAI0JAARRigAAjRAABFGZAACNGAAEUbEAAI0eAARR9gAAjSYABFITAACNLgAEUi0AAI0zAARSWwAAjTsABFKEAACNQAAEUqEAAI1IAARSvAAAjUoABFK/AACNVAAEUvYAAI1cAARTUAAAjV8ABFNsAACNaQAEU4EAAI1vAARTlwAAjXcABFOmAACNgQAEU9IAAI2HAART6AAAjY8ABFP3AACNmQAEVCIAAI2fAARUWgAAjacABFS6AACNqgAEVNYAAI2yAARU7AAAjboABFT7AACNxAAEVREAAI3KAARVJwAAjdIABFU2AACN3AAEVUsAAI3iAARVbgAAjecABFWWAACN7AAEVawAAI3xAARVuwAAjfsABFXVAACOAQAEVdgAAI4JAARWBAAAjg4ABFZeAACOEQAEVmsAAI4TAARWngAAjhUABFa3AACOGwAEVtQAAI4jAARW7AAAjisABFcDAACOMwAEVx8AAI47AARXNwAAjkMABFdtAACOSAAEV4YAAI5OAARXowAAjlYABFe7AACOXgAEV9IAAI5mAARX7AAAjm4ABFgNAACOdgAEWCUAAI5+AARYRwAAjoYABFhfAACOjgAEWHcAAI6WAARYkwAAjp4ABFirAACOpgAEWMMAAI6uAARY2wAAjrYABFjzAACOvgAEWQsAAI7GAARZYQAAjtEABFmBAACO1wAEWaQAAI7fAARZvwAAjuEABFnKAACO5gAEWikAAI7tAARaLAAAjvQABFpHAACO+gAEWmQAAI8CAARafwAAjwQABFqKAACPCQAEWukAAI8SAARbAgAAjxgABFsTAACPHQAEW0YAAI8lAARbSQAAjyoABFtmAACPLwAEW3wAAI83AARbowAAjz8ABFvoAACPQgAEW/cAAI9FAARcNwAAj0sABFxRAACPUwAEXGQAAI9dAARckwAAj2UABFzlAACPbQAEXOoAAI91AARc/QAAj30ABF2TAACPhQAEXakAAI+IAARd5AAAj48ABF4AAACPlAAEXhoAAI+ZAAReXgAAj6MABF6FAACPqQAEXooAAI+uAARenQAAj7MABF7mAACPugAEXwkAAI+/AARfPgAAj8kABF95AACP0AAEX7AAAI/XAARgOAAAj9wABGA9AACP5gAEYF0AAI/zAARg/AAAj/UABGFHAACP+wAEYW0AAJAAAARhjgAAkAgABGGzAACQEAAEYdoAAJAfAARh7QAAkCQABGHyAACQKQAEYfcAAJAuAARiQAAAkDoABGJiAACQRgAEYrwAAJBJAARiywAAkE4ABGLoAACQWAAEYx0AAJBiAARjpAAAkGwABGO9AACQcgAEY/AAAJB8AARkFQAAkIEABGQoAACQgwAEZJYAAJCKAARkuwAAkI8ABGTOAACQkQAEZQUAAJCdAARlMAAAkKIABGV1AACQpAAEZY8AAJCsAARlugAAkLQABGXNAACQtgAEZekAAJC9AARmDgAAkMUABGY1AACQzQAEZloAAJDXAARmcAAAkNwABGblAACQ4QAEZvQAAJDjAARnBQAAkOYABGcwAACQ6AAEZ3QAAJDwAARnhwAAkPgABGeqAACQ/gAEZ9QAAJEDAARoQwAAkQgABGhxAACREAAEaJwAAJESAARozAAAkRcABGj9AACRHAAEaSwAAJEhAARpRgAAkSYABGlZAACRLgAEaYwAAJE0AARp1AAAkTkABGoEAACRQQAEaiIAAJFIAARqYQAAkU0ABGqBAACRTwAEauwAAJFVAARrAQAAkV8ABGslAACRZQAEa0MAAJFsAARrggAAkXEABGuiAACRcwAEa8sAAJF5AARsNAAAkX4ABGxDAACRgAAEbFQAAJGDAARsYwAAkYUABG3JAACRigAEbgoAAJGQAARuuAAAkZ8ABG69AACRpAAEbtYAAJGnAARu7gAAka0ABG8BAACRtAAEbyQAAJG6AARvewAAkb8ABG+JAACRxwAEcPQAAJHRAARxAwAAkdMABHEvAACR2QAEcUkAAJHhAARxXAAAkesABHGTAACR8wAEcfsAAJH3AARyCgAAkfkABHIwAACR/gAEckoAAJIGAARyXQAAkhAABHKUAACSGAAEcq8AAJIeAARytAAAkiYABHLHAACSLQAEct0AAJI1AARzGAAAkjsABHMrAACSRQAEc0YAAJJLAARzZwAAklAABHNsAACSVQAEc38AAJJbAARzqgAAkmIABHQfAACSZgAEdFcAAJJwAAR0jQAAknUABHScAACSfQAEdMMAAJKDAAR01gAAko0ABHTxAACSkwAEdSkAAJKmAAR1aAAAkq0ABHWJAACStQAEdY4AAJK/AAR1swAAkscABHXNAACS0QAEdhIAAJLWAAR2WwAAktwABHZ+AACS5gAEdqwAAJL+AAR2+QAAkwUABHcTAACTCgAEdxgAAJMUAAR3VQAAkykABHeWAACTMAAEd7AAAJM1AAR30gAAkz0ABHf/AACTRQAEeDMAAJNaAAR4RwAAk2EABHknAACTZQAEeTwAAJNoAAR5SwAAk2sABHloAACTcAAEeW0AAJN4AAR5oQAAk30ABHowAACTfwAEej8AAJOCAAR7vAAAk4UABHv9AACTiAAEfBsAAJOLAAR8ggAAk5EABHzWAACTlwAEfOUAAJOZAAR9LQAAk5wABH1yAACToAAEfZUAAJOoAAR9mgAAk60ABH2zAACTsAAEfe8AAJO2AAR99AAAk8AABH4bAACTyAAEfigAAJPPAAR+TgAAk9IABH6iAACT1AAEfrsAAJPZAAR+8gAAk94ABH8bAACT4QAEf0QAAJPmAAR/hgAAk+wABH+xAACT9AAEgB4AAJP7AASATAAAlAEABIB6AACUCQAEgJgAAJQQAASA1wAAlBUABID3AACUHAAEgVcAAJQgAASBZgAAlCUABIGZAACUJwAEgbQAAJQtAASBxwAAlDIABIHUAACUOAAEgecAAJQ9AASB9AAAlEMABIIHAACUSAAEglEAAJRQAASCZAAAlFYABIJpAACUYAAEgokAAJRmAASCowAAlG4ABILZAACUeAAEgvcAAJR+AASDGgAAlIYABINNAACUiwAEg3gAAJSTAASDmAAAlJgABIOdAACUogAEg+EAAJSoAASD+QAAlKoABIRDAACUrQAEhFIAAJSwAASEhQAAlLMABISgAACUuQAEhLMAAJS+AASEwAAAlMQABITTAACUyQAEhOAAAJTPAASE8wAAlNQABIU7AACU3AAEhVYAAJTfAASFeQAAlOQABIWTAACU7AAEhckAAJTxAASGNAAAlPYABIZfAACU/gAEhocAAJUFAASGzwAAlQgABIcZAACVDgAEhzYAAJUTAASHXQAAlRsABIeRAACVJQAEh6IAAJUtAASHyQAAlTIABIfVAACVOgAEiCUAAJU/AASIUAAAlUcABIiFAACVTAAEiLAAAJVUAASIzAAAlVsABIkLAACVYAAEiScAAJVnAASJoAAAlW4ABImzAACVeAAEic4AAJV+AASJ/QAAlYUABIobAACViwAEii4AAJWVAASKcQAAlZgABIp9AACVogAEiqQAAJWoAASKzwAAlbAABIrrAACVtwAEiwkAAJW+AASLSQAAlcQABItcAACVzgAEi3cAAJXUAASLkwAAldsABIuxAACV4gAEi8cAAJXqAASMTAAAlfEABIxfAACV+wAEjHoAAJYBAASMqQAAlggABIzHAACWDgAEjNoAAJYYAASNLAAAlh4ABI0/AACWKAAEjVoAAJYuAASNiAAAljUABI2nAACWOwAEjawAAJZFAASN3QAAlksABI4hAACWUAAEji0AAJZaAASOVAAAlmAABI5/AACWaAAEjpsAAJZvAASOuQAAlnYABI75AACWfAAEjwwAAJaGAASPJwAAlowABI9DAACWkwAEj2EAAJaaAASPdwAAlqIABI/uAACWpQAEkDYAAJaoAASQggAAlqsABJCgAACWrQAEkK8AAJavAASQyAAAlrYABJDoAACWvgAEkQsAAJbGAASRNgAAls4ABJFJAACW2AAEkWwAAJbeAASRjwAAluYABJGUAACW7gAEkacAAJbzAASR0gAAlvoABJIOAACXAAAEkjkAAJcIAASSVQAAlw8ABJJrAACXEQAEkpsAAJcXAASTfgAAlxkABJONAACXGwAEk84AAJceAAST7AAAlyEABJQ8AACXJwAElKUAAJcqAASVKgAAlzAABJVIAACXMwAElZgAAJc5AASV9QAAlzwABJZ2AACXQgAElpQAAJdFAASW5AAAl0sABJdBAACXTgAEl5EAAJdTAASXqQAAl1YABJfBAACXWQAEl/4AAJdfAASYDQAAl2EABJgcAACXYwAEmJ0AAJdrAASYogAAl3IABJizAACXeQAEmLgAAJeBAASY+AAAl4cABJkUAACXjwAEmVYAAJeVAASZdAAAl5sABJmyAACXpQAEmfkAAJeqAASaEwAAl60ABJotAACXswAEmmwAAJe3AASaewAAl7kABJqKAACXvgAEmx0AAJfGAASbKwAAl80ABJs5AACX1wAEm4AAAJfaAASbmgAAl90ABJu0AACX4wAEm84AAJfmAAScDgAAl+wABJwdAACX7gAEnCwAAJfzAAScrgAAl/oABJyzAACYAgAEnLgAAJgJAAScywAAmBAABJzQAACYGAAEnO4AAJgiAASc8wAAmCoABJ05AACYMQAEnT4AAJg4AASdUQAAmD8ABJ1fAACYSQAEnXcAAJhOAASdnQAAmFsABJ2iAACYYgAEnacAAJhqAASd9QAAmHQABJ4IAACYewAEng0AAJiDAASeRgAAmJIABJ5UAACYmQAEnmwAAJihAASefwAAmKsABJ6cAACYsAAEnwsAAJi8AASigQAAmMMABKMsAACYxwAEo8wAAJjMAASj5gAAmNQABKWAAACY1wAEpuQAAJjgAASnZgAAmOUABKeDAACY6gAEp+QAAJj0AASoZgAAmPoABKitAACZCQAEqQ8AAJkdAASpuQAAmScABKnNAACZKgAEqlMAAJktAASqYAAAmS8ABKp1AACZNAAEqrwAAJk5AASrlQAAmT4ABKvbAACZQwAEq+gAAJlFAASr9QAAmUcABKwCAACZSgAErBcAAJlPAASsLAAAmVQABKxOAACZXAAErGQAAJlkAASsgwAAmWkABKzaAACZbgAErPUAAJl2AAStEQAAmX4ABK0wAACZgwAErb8AAJmIAAStzAAAmYoABK3hAACZjwAErf4AAJmXAASulAAAmaEABK65AACZpgAErrwAAJmwAASu1wAAmbIABK7aAACZvAAErw4AAJnDAASvEQAAmc0ABK9EAACZ1wAEr0cAAJnhAASvVgAAmegABK+TAACZ9wAEr5YAAJoBAASvpQAAmggABLAfAACaDwAEsC8AAJoSAASwXgAAmhUABLBrAACaFwAEsHQAAJoZAASwiQAAmh4ABLCeAACaIwAEsQAAAJooAASxMQAAmioABLGyAACaNAAEsegAAJpBAASyCgAAmkYABLINAACaUAAEsokAAJpYAASzvAAAmmcABLUGAACaewAEtRwAAJqBAAS1NAAAmocABLVRAACajQAEtX8AAJqUAAS1kwAAmpgABLaBAACangAEtrYAAJqjAAS2ywAAmqgABLbbAACarQAEtt4AAJqvAAS28wAAmrIABLceAACatQAEtzMAAJq6AAS3iQAAmrwABLeWAACavgAEuSEAAJrBAAS5QQAAmsYABLlEAACayAAEuVkAAJrLAAS5ggAAmtEABLmRAACa1gAEua4AAJrcAAS53wAAmuEABLqVAACa7wAEuu4AAJryAAS68QAAmvkABLs2AACa/gAEuzkAAJsFAAS7aQAAmwoABLtsAACbFAAEu5cAAJseAAS8GQAAmyMABLwcAACbLQAEvFEAAJsyAAS8VAAAmzkABLxzAACbQQAEvI0AAJtGAAS8pQAAm1AABLzVAACbUgAEvNgAAJtZAAS8/wAAm14ABL0CAACbaAAEvRwAAJttAAS9HwAAm3QABL1gAACbfAAEvXgAAJuGAAS9kQAAm40ABL29AACblAAEvdUAAJubAAS+AwAAm6AABL4uAACbogAEvjEAAJusAAS/PAAAm7EABL9lAACbwAAEv6UAAJvHAAS/8AAAm9MABMA4AACb2gAEwJIAAJvpAATA2gAAm/AABMFWAACb/AAEwfEAAJwIAATCZQAAnBQABMLpAACcIAAEw2cAAJwnAATDhwAAnC4ABMQ+AACcPwAExIAAAJxEAATEnAAAnE4ABMT5AACcVQAExTEAAJxcAATFzgAAnF4ABMXTAACcZQAExfcAAJxtAATGGQAAnHIABMY3AACcfAAExnEAAJx+AATGdgAAnIUABMafAACcjwAExuMAAJyWAATHLwAAnJkABMcyAACcowAEx08AAJyrAATHgQAAnLAABMeEAACcuAAEx6UAAJy7AATHqAAAnMAABMerAACcxQAEx64AAJzMAATH9gAAnM8ABMf5AACc1AAEx/wAAJzbAATIJQAAnOEABMiCAACc7gAEyJcAAJzxAATIrQAAnPkABMiwAACc/gAEyOEAAJ0GAATJDAAAnQsABMkbAACdEAAEyTgAAJ0WAATJUgAAnRsABMlqAACdJQAEyYMAAJ0sAATJvgAAnTMABMoEAACdPQAEyigAAJ1AAATKRAAAnUgABMpTAACdTQAEynAAAJ1TAATKigAAnVgABMqiAACdYgAEyrsAAJ1pAATLDwAAnXMABMsjAACddgAEy34AAJ1+AATLlgAAnYgABMuvAACdjwAEy90AAJ2WAATL9QAAnZ0ABMwlAACdogAEzGwAAJ2sAATMbwAAnbMABMyTAACdtgAEzMcAAJ2+AATM3QAAncYABMz+AACdzgAEzXAAAJ3QAATNkAAAndoABM2qAACd5AAEze4AAJ3rAATOOwAAnfcABM59AACd/gAEzskAAJ4NAATPCQAAnhQABM91AACeIAAEz/oAAJ4sAATQYAAAnjgABNDQAACeRAAE0RgAAJ5JAATROAAAnlMABNFUAACeWgAE0YsAAJ5kAATR5QAAnnMABNIPAACedQAE0icAAJ5/AATSRgAAnoYABNJwAACeiwAE0ogAAJ6VAATSrwAAnpoABNLPAACepAAE0v0AAJ6rAATTLwAAnq0ABNNJAACetwAE03sAAJ6+AATU4AAAnscABNUdAACezQAE1cgAAJ7YAATWBQAAntsABNZ3AACe4wAE1nwAAJ7tAATWtwAAnvQABNeuAACe/AAE1+AAAJ7+AATYNwAAnwcABNh0AACfCQAE2YkAAJ8SAATZuwAAnxQABNoSAACfHQAE2k8AAJ8fAATbbQAAnyQABNvxAACfMwAE3EsAAJ84AATcdgAAnz4ABNzUAACfSQAE3NcAAJ9TAATdWQAAn18ABN5GAACfYwAE3mAAAJ9yAATeqwAAn4YABN8EAACfjQAE3xsAAJ+VAATfMQAAn50ABN9AAACfpwAE32QAAJ+qAATffgAAn7IABN+BAACfvAAE36cAAJ/CAATfqgAAn8kABOAtAACfzgAE4FAAAJ/WAATgdgAAn9gABOCUAACf3gAE4LMAAJ/mAATg4QAAn+4ABOD/AACf8wAE4SAAAJ/4AAThQgAAoAAABOFfAACgBQAE4YEAAKAKAAThoAAAoBIABOHAAACgFwAE4cMAAKAcAATh+wAAoCEABOIRAACgJgAE4j0AAKAtAATiaAAAoDMABOJ5AACgPQAE4pcAAKBDAATivwAAoEUABOLgAACgSwAE4vkAAKBTAATjOAAAoFsABOOkAACgYAAE480AAKBoAATj6wAAoG0ABOQOAACgdQAE5DUAAKB6AATkOAAAoIIABORsAACghwAE5JsAAKCMAATkugAAoJEABOT0AACgmAAE5SkAAKCdAATlLAAAoKIABOVOAACgqQAE5ZIAAKCxAATltAAAoLMABOXTAACguwAE5ykAAKC+AATnPgAAoMEABOdGAACgxwAE50kAAKDMAATo4QAAoM8ABOjuAACg0gAE6QUAAKDXAATpWgAAoNwABOl5AACg4gAE6ZAAAKDqAATpsAAAoPIABOnNAACg9wAE6eYAAKD8AATqGgAAoQEABOosAAChCQAE6i8AAKERAATqjQAAoRYABOqzAAChHgAE6tsAAKEjAATq5QAAoSUABOsKAAChKwAE6zIAAKEzAATrNQAAoTgABOtiAAChPQAE66oAAKE/AATr2AAAoUUABOvbAAChSgAE6/0AAKFPAATsGAAAoVQABOwwAAChWwAE7FkAAKFhAATsfAAAoWMABOypAAChaQAE7MAAAKFxAATs4AAAoXkABOz+AAChfgAE7RYAAKGDAATtNwAAoYgABO1oAAChigAE7YUAAKGNAATttQAAoZUABO3VAAChnQAE7e0AAKGiAATuFgAAoacABO4yAAChrQAE7jUAAKG1AATuYQAAoboABO55AAChvwAE7poAAKHEAATuwQAAocYABO7pAAChywAE7xcAAKHQAATvigAAodIABO+TAACh1QAE76kAAKHaAATv6AAAoeAABPA9AACh5QAE8OQAAKHqAATw8QAAoe0ABPD+AACh7wAE8QsAAKHxAATxGAAAofMABPFGAACh+wAE8UkAAKIAAATxTAAAogUABPFyAACiBwAE8ZMAAKIPAATxxgAAohQABPHkAACiFgAE8hIAAKIbAATyPAAAoh4ABPJXAACiIwAE8pAAAKIoAATyygAAoioABPLyAACiMgAE8yQAAKI0AATzTAAAojwABPN2AACiPgAE86IAAKJBAATzvQAAokYABPP7AACiSwAE9DoAAKJQAAT0UgAAolUABPSUAACiWgAE9LIAAKJfAAT0tQAAomEABPTQAACiZAAE9PIAAKJpAAT1FwAAom4ABPUaAACicAAE9SYAAKJ2AAT1TwAAonsABPV+AACifQAE9aoAAKKAAAT1xQAAooUABPXxAACiigAE9hYAAKKSAAT2NgAAopoABPZHAACiogAE9koAAKKkAAT2VgAAoqoABPaFAACirAAE9qEAAKK0AAT2sgAAorwABPbfAACiwQAE9vAAAKLJAAT3HAAAos4ABPctAACi1gAE91cAAKLYAAT3WgAAot0ABPeUAACi3wAE95cAAKLkAAT30wAAouYABPf7AACi6wAE+CAAAKLzAAT4QAAAovsABPhRAACjAwAE+FQAAKMFAAT4YAAAowsABPiDAACjDQAE+LYAAKMPAAT4uQAAoxQABPjdAACjGQAE+R4AAKMeAAT5lAAAoyAABPmhAACjIwAE+a4AAKMlAAT53gAAoyoABPoQAACjMgAE+jMAAKM6AAT6WQAAoz8ABPpcAACjQQAE+oYAAKNHAAT6swAAo08ABPq2AACjVAAE+wEAAKNZAAT7JAAAo2EABPtKAACjYwAE+3QAAKNpAAT7jQAAo24ABPutAACjdgAE+7AAAKN7AAT7ywAAo4AABPvlAACjhQAE+/wAAKONAAT8KgAAo5UABPwtAACjmgAE/IkAAKOcAAT8rQAAo6QABPywAACjpgAE/MMAAKOsAAT85wAAo7QABPzqAACjtgAE/PYAAKO8AAT9CwAAo8EABP0vAACjyQAE/TIAAKPLAAT9PgAAo9EABP1fAACj1gAE/YQAAKPeAAT9hwAAo+AABP2TAACj5gAE/bQAAKPrAAT9twAAo/AABP3pAACj9QAE/ewAAKP3AAUANAAAo/oABQBwAACj/QAFAJsAAKQHAAUAsQAApAwABQDYAACkDgAFAO4AAKQTAAUBFQAApBgABQEnAACkHQAFASoAAKQkAAUBSgAApCcABQFvAACkLwAFAYUAAKQ3AAUBwgAApDwABQNLAACkPwAFA7YAAKRCAAUD6AAApEoABQP2AACkUAAFBC8AAKRaAAUERQAApGQABQRjAACkbgAFBIsAAKR2AAUEogAApH0ABQTNAACkhQAFBOQAAKSPAAUFAAAApJYABQUsAACkoAAFBdsAAKSiAAUF6AAApKQABQYGAACkrAAFBlIAAKSxAAUGVQAApLkABQahAACkwQAFCWgAAKTHAAUJfgAApMwABQmdAACkzwAFCboAAKTVAAUJywAApNcABQobAACk2gAFCisAAKTcAAUKcgAApOEABQqiAACk4wAFCrUAAKTmAAUK0wAApOwABQtSAACk+wAFC7AAAKT9AAUMPwAApQwABQzvAAClGwAFDQ8AAKUeAAUNngAApSYABQ3FAAClLAAFDegAAKU0AAUOcAAApUkABRILAAClTAAFEikAAKVOAAUSTQAApVQABRJwAAClXAAFEqoAAKVrAAUTRwAApW0ABRPFAAClbwAFG/MAAKVyAAUcCAAApXUABRxZAACleAAFHHoAAKV6AAUcjQAApX0ABRysAAClhQAFHK8AAKWHAAUczgAApY0ABRzRAACljwAFHUkAAKWSAAUfeQAApZkABSIhAAClnQAFIjAAAKWfAAUiowAApaIABSKxAAClpwAFIsYAAKWsAAUjOgAApbEABSNUAACluQAFI1cAAKXBAAUjigAApcYABSONAAClyQAFI5kAAKXWAAUjnAAApdgABSPfAACl2wAFJC8AAKXtAAUkMgAApfIABSRKAACl9QAFJGUAAKYEAAUkaAAApgYABSR0AACmDAAFJIYAAKYSAAUkiQAAphoABSSMAACmHAAFJJwAAKYiAAUkugAApicABSY7AACmKgAFJlAAAKYsAAUmzwAApi4ABSdYAACmMwAFJ3EAAKY4AAUniwAApkAABSe1AACmRQAFJ8kAAKZPAAUn8QAAplQABSgpAACmWQAFKGcAAKZrAAUokQAApnMABSieAACmdQAFKMkAAKZ6AAUo8QAApn8ABSj+AACmhAAFKTYAAKaGAAUuyQAApqEABS7nAACmpQAFLv8AAKaoAAUv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EAAArPIABVQsAACs9QAFVD8AAKz9AAVUXwAArQQABVSaAACtCQAFVLwAAK0OAAVUwQAArRMABVTwAACtGgAFVQYAAK0fAAVVLAAArSQABVVGAACtKQAFVVkAAK0zAAVVfgAArTsABVW3AACtQAAFVd0AAK1FAAVWAwAArUoABVYoAACtTwAFVk0AAK1UAAVWUgAArVsABVaBAACtYgAFVrwAAK1nAAVW5wAArWwABVcSAACtcQAFVz4AAK12AAVXUwAArXsABVd8AACtgAAFV5EAAK2FAAVXugAArYoABVfPAACtjwAFWAIAAK2WAAVYMQAArZwABVhLAACtpAAFWF4AAK2uAAVYgwAArbYABVi3AACtuwAFWOIAAK3AAAVZDQAArcUABVk5AACtygAFWWcAAK3PAAVZlQAArdQABVojAACt1gAFWswAAK3bAAVbXgAArd4ABVttAACt4AAFXCEAAK3iAAVcfwAAregABVyqAACt8AAFXNgAAK3yAAVc/wAArfgABV0sAACuAAAFXTEAAK4IAAVdhQAArhoABV3WAACuLAAFXeIAAK4zAAVeEgAArjgABV5VAACuUAAFXpIAAK5VAAVezAAArloABV7rAACuXwAFXzwAAK5xAAVfSAAArngABV94AACufQAFX7kAAK6VAAVgKwAArpcABWBCAACumQAFYGoAAK6bAAVgjAAArqUABWGXAACuqwAFYZwAAK6zAAViAAAArsMABWIMAACuygAFYkEAAK7PAAViWwAArtcABWKxAACu7QAFYrYAAK73AAVjeQAArwsABWOnAACvEwAFY9cAAK8VAAVj/wAArxsABWQsAACvIwAFZFwAAK8rAAVkfQAArzAABWSCAACvNQAFZP4AAK9JAAVlZgAAr2oABWV5AACvbwAFZZEAAK9/AAVl3wAAr5UABWX/AACvmgAFZjgAAK+iAAVmPQAAr6oABWaJAACvvgAFZr8AAK/DAAVm3QAAr84ABWdaAACv7AAFZ7YAAK//AAVn4QAAsBAABWf0AACwFQAFZ/kAALAaAAVn/gAAsB8ABWgqAACwJQAFaFAAALA2AAVoYwAAsDsABWhoAACwQAAFaG0AALBFAAVomQAAsEsABWjUAACwUQAFaNkAALBZAAVpGwAAsG0ABWkgAACwdQAFaXUAALCGAAVprwAAsIwABWnEAACwlAAFaegAALCaAAVqGAAAsJ8ABWpAAACwoQAFalUAALCpAAVqfwAAsK4ABWqLAACwswAFar4AALC5AAVq7gAAsMEABWsMAACw0QAFazMAALDhAAVrSAAAsOYABWt0AACw6wAFa5IAALD7AAVrsgAAsQAABWvUAACxEAAFa+kAALEVAAVsBAAAsRcABWwxAACxHAAFbOkAALEeAAVtAAAAsSMABW1WAACxKwAFbb8AALExAAVt/QAAsTgABW4ZAACxPAAFbkAAALFCAAVuwwAAsUgABW/TAACxSgAFb+IAALFNAAVwAAAAsU8ABXBLAACxUQAFcGgAALFWAAVwlwAAsV4ABXDyAACxYwAFcXQAALFrAAVxqgAAsXMABXHIAACxeAAFchgAALGAAAVybAAAsYUABXJxAACxjQAFcqoAALGPAAVytgAAsZYABXLJAACxmwAFcz0AALGgAAVzYgAAsaIABXPOAACxpAAFc/8AALGsAAV0RAAAsbQABXSAAACxuQAFdMUAALHBAAV1dQAAscMABXWMAACxyAAFdboAALHNAAV10QAAsdIABXYFAACx1wAFdhwAALHcAAV2OgAAseEABXZ5AACx5gAFdq4AALHpAAV24wAAsewABXb+AACx7wAFd0QAALH0AAV3hQAAsfcABXemAACx+gAFd9gAALH8AAV3+QAAsgEABXgVAACyCwAFeCsAALIQAAV4cwAAshUABXisAACyGgAFeOUAALIiAAV4+gAAsicABXkVAACyMQAFeUYAALI7AAV5XAAAskAABXnIAACyRQAFeeIAALJPAAV63QAAslkABXsJAACyaAAFezEAALJ3AAV7SgAAsoEABXtPAACyiAAFe8UAALKVAAV7ygAAsp8ABXvoAACyoQAFfAgAALKuAAV8XgAAsrAABXyHAACytQAFfdQAALLEAAV94wAAssYABX5fAACyywAFfokAALLQAAV+ogAAstUABX7WAACy2gAFfu0AALLfAAV/QQAAsuQABX9rAACy6QAFf4QAALLuAAV/uAAAsvMABX/PAACy+AAFgBwAALL9AAWAZAAAswIABYBzAACzBwAFgM8AALMKAAWA4gAAsw8ABYFzAACzEgAFgYIAALMVAAWBnQAAsx0ABYHCAACzJQAFgegAALMtAAWCDQAAszUABYJcAACzPQAFgpkAALNCAAWC/QAAs0QABYNfAACzSQAFg3QAALNTAAWDtgAAs2gABYPiAACzbQAFhAcAALNyAAWEWgAAs3cABYRzAACzgQAFhJUAALOLAAWEvQAAs5UABYTnAACznAAFhQcAALOhAAWFDAAAs6sABYUtAACzsQAFhTIAALO2AAWFYwAAs7wABYVoAACzwQAFhbwAALPJAAWF4AAAs84ABYXlAACz2AAFhgUAALPeAAWGCgAAs+MABYZIAACz5gAFhmkAALPsAAWGbgAAs/YABYaPAACz/AAFhpQAALQBAAWHKQAAtAkABYeFAAC0GQAFh6gAALQjAAWH0wAAtC0ABYgNAAC0MgAFiD0AALQ3AAWIVgAAtEEABYhvAAC0SAAFiKsAALRNAAWIxgAAtFcABYjZAAC0XAAFiWIAALRjAAWJpQAAtHMABYocAAC0fQAFincAALSNAAWK/AAAtJIABYsRAAC0nAAFi1QAALSsAAWLmAAAtLEABYvGAAC0swAFi+AAALS4AAWL8wAAtL0ABYxgAAC0wAAFjG8AALTCAAWMfgAAtMQABYybAAC0yQAFjMEAALTRAAWM8AAAtNkABYz1AAC03gAFjTQAALTkAAWNOQAAtOkABY1MAAC07wAFjbwAALT0AAWN1QAAtPkABY36AAC1AAAFjmIAALUFAAWOjQAAtQ0ABY6tAAC1EgAFjrIAALUXAAWPiwAAtRoABY+qAAC1HwAFj8YAALUnAAWPywAAtSwABY/QAAC1MQAFj+wAALU2AAWQDwAAtTsABZAaAAC1PQAFkIQAALU/AAWQkwAAtUEABZEMAAC1RgAFkUMAALVLAAWRaQAAtVEABZHIAAC1VgAFkfkAALVeAAWSGwAAtWAABZJkAAC1agAFksQAALVxAAWTAAAAtXMABZMoAAC1fQAFk0QAALWCAAWTZwAAtYQABZOiAAC1jgAFk88AALWTAAWUFQAAtZUABZQ+AAC1nQAFlGMAALWlAAWUiwAAtaoABZTGAAC1sgAFlOoAALW8AAWU/QAAtcMABZVWAAC1yAAFlXQAALXKAAWVywAAtdIABZXQAAC11wAFlf0AALXcAAWWAgAAteQABZZDAAC15gAFllYAALXsAAWWeQAAtfEABZZ+AAC1+QAFlrgAALX/AAWWvQAAtgQABZbMAAC2CQAFltEAALYLAAWXAgAAthAABZc0AAC2EwAFl30AALYdAAWX3QAAtiQABZgBAAC2KwAFmDkAALYwAAWYdAAAtjIABZiTAAC2PAAFmMMAALZBAAWY+QAAtksABZlWAAC2UgAFmdEAALZUAAWZ4AAAtlcABZn9AAC2XAAFmjoAALZhAAWaYQAAtmQABZrTAAC2bAAFmv4AALZ0AAWbLAAAtnYABZtTAAC2eQAFm5UAALaBAAWbugAAtokABZv2AAC2kwAFnLYAALaVAAWc4AAAtpoABZ0KAAC2nwAFnTQAALakAAWdowAAtqkABZ2yAAC2qwAFnc8AALatAAWebAAAtrIABZ57AAC2tAAFnq4AALa2AAWe2QAAtrsABZ8hAAC2wAAFnzsAALbFAAWfdwAAtsoABZ+SAAC2zwAFn9oAALbUAAWgTwAAttkABaDjAAC24AAFoSQAALbqAAWhTgAAtvIABaH8AAC29AAFohsAALb+AAWiPAAAtwgABaJ1AAC3EgAFouwAALcXAAWi+wAAtxkABaMKAAC3GwAFoy8AALcgAAWjUAAAtyUABaPLAAC3KgAFpHAAALc0AAWknwAAtzsABaTUAAC3PQAFpPAAALdHAAWlCQAAt1EABaUlAAC3WAAFpVcAALdaAAWlpwAAt1wABaa2AAC3gAAFpwkAALeCAAWnGAAAt4QABac1AAC3hgAFp9QAALeLAAWn4wAAt40ABaf8AAC3lQAFqAEAALeaAAWoRgAAt6AABahLAAC3qAAFqGkAALevAAWooQAAt7IABai0AAC3uAAFqOUAALe6AAWo+AAAt8AABakpAAC3wgAFqVAAALfEAAWpagAAt8kABamEAAC30QAFqbwAALfZAAWpwQAAt94ABanzAAC34AAFqhwAALfoAAWqQQAAt/AABapxAAC3+AAFqq8AALf9AAWq1AAAuAUABasFAAC4DwAFqyEAALgUAAWrfQAAuBYABauWAAC4GwAFq9cAALgjAAWr/gAAuCgABaxKAAC4TAAFrGAAALhSAAWsmAAAuGcABayuAAC4agAFrQMAALhvAAWtPQAAuHcABa2AAAC4fAAFrY8AALiCAAWtwgAAuIcABa3QAAC4jwAFrgkAALiUAAWuDgAAuJYABa4TAAC4mwAFriYAALigAAWupgAAuMEABa6/AAC4yAAFrtUAALjOAAWvDAAAuOEABa8lAAC46AAFrzsAALjrAAWvaQAAuPAABa/1AAC48gAFsAQAALj0AAWwGgAAuPcABbCbAAC5AQAFsQwAALkDAAWxGwAAuQUABbEqAAC5BwAFsUAAALkKAAWxrAAAuRIABbHjAAC5FwAFsgoAALkdAAWyKAAAuSUABbItAAC5KgAFsjIAALkvAAWyRQAAuTQABbJqAAC5OQAFsnUAALk7AAWysgAAuUAABbLyAAC5RQAFs0oAALlKAAWzcQAAuVIABbOWAAC5WQAFs+4AALleAAW0PgAAuWYABbRDAAC5awAFtHgAALlwAAW0fQAAuXgABbS+AAC5egAFtNEAALmAAAW09AAAuYUABbT5AAC5jQAFtUAAALmTAAW1RQAAuZgABbVUAAC5nQAFtVkAALmfAAW1jAAAuaQABbXWAAC5pwAFtg0AALmxAAW2IAAAubgABbZQAAC5vwAFtn0AALnEAAW2uAAAucYABbbgAAC5zgAFtwQAALnYAAW3FwAAud8ABbeRAAC54QAFt7AAALnnAAW3zQAAue8ABbfSAAC59AAFt9cAALn5AAW38wAAuf4ABbgWAAC6AwAFuCEAALoIAAW4fAAAugsABbibAAC6EAAFuMEAALoYAAW4xgAAuh0ABbjLAAC6IgAFuOcAALonAAW5CgAAuiwABbkVAAC6LgAFucQAALo2AAW59AAAuj4ABboXAAC6QwAFukMAALpKAAW6ZQAAuk8ABbp/AAC6VwAFuq0AALphAAW6wwAAumYABbrmAAC6awAFuxsAALpzAAW7RAAAungABbteAAC6gAAFu3gAALqIAAW7fQAAuo0ABbuQAAC6kwAFu8YAALqYAAW74AAAuqAABbvlAAC6pQAFu/gAALqrAAW8UgAAurAABbxxAAC6twAFvIQAALq8AAW8ngAAusMABbyxAAC6yAAFvMQAALrNAAW9NQAAutQABb1rAAC62QAFvY0AALreAAW9oAAAuuYABb3/AAC66AAFviYAALryAAW+wAAAuvcABb7iAAC6/wAFvvkAALsHAAW/FgAAuwwABb8tAAC7HwAFv1kAALsmAAW/hAAAuzkABb+0AAC7SQAFv9UAALtOAAXAKwAAu1AABcBFAAC7WgAFwG8AALtfAAXAyAAAu2kABcFiAAC7cwAFwYYAALt7AAXBnAAAu4AABcHFAAC7iwAFwesAALubAAXCCwAAu6IABcI2AAC7tQAFwl0AALu6AAXCcwAAu8IABcJ4AAC7ygAFwpgAALvSAAXCnQAAu9oABcLYAAC73AAFwv8AALvyAAXDKgAAvAIABcNKAAC8BwAFw3AAALwMAAXD1QAAvBEABcPaAAC8GwAFw/oAALweAAXEBgAAvCMABcQ9AAC8KQAFxFAAALwzAAXEcwAAvDkABcShAAC8OwAFxMcAALxBAAXE+QAAvEsABcUeAAC8UgAFxTEAALxXAAXFVgAAvFwABcVxAAC8ZAAFxXYAALxpAAXFewAAvG4ABcWXAAC8cwAFxboAALx4AAXFxQAAvH0ABcZVAAC8hgAFxycAALyRAAXHawAAvJYABcfIAAC8mwAFx9wAALygAAXIKAAAvKIABch6AAC8rAAFyNYAALyxAAXI4wAAvLMABcj3AAC8uAAFyUwAALy6AAXJuwAAvM4ABcnNAAC80AAFyg8AALzaAAXKZAAAvOQABcqsAAC87gAFysAAALz4AAXK1AAAvQIABctFAAC9CgAFy4EAAL0RAAXLugAAvR0ABcvHAAC9JwAFy9QAAL0xAAXMJAAAvTsABcwxAAC9RQAFzEMAAL1KAAXMigAAvU8ABc1CAAC9WQAFzZEAAL1jAAXN5wAAvW0ABc3sAAC9dwAFzjwAAL15AAXOkgAAvYMABc7nAAC9kgAFzzUAAL2hAAXPfwAAvawABc+YAAC9tgAFz7QAAL3FAAXP2wAAvdEABc/9AAC90wAF0BwAAL3iAAXQSQAAvekABdBOAAC98wAF0GkAAL36AAXQhQAAvgEABdCYAAC+CAAF0P8AAL4QAAXRHwAAvh8ABdF3AAC+IgAF0cMAAL4xAAXR+wAAvkAABdInAAC+TAAF0k8AAL5TAAXSXAAAvlgABdJ9AAC+ZwAF0pkAAL5uAAXStgAAvnUABdLgAAC+fAAF0x8AAL6LAAXTQgAAvpIABdN1AAC+mQAF07QAAL6oAAXT1wAAvq8ABdQKAAC+uwAF1GkAAL6+AAXUqgAAvsMABdThAAC+0gAF1OYAAL7cAAXU9wAAvuEABdUYAAC+5gAF1U8AAL7wAAXVhgAAvvoABdWLAAC/BAAF1ZwAAL8GAAXVvQAAvwgABdX0AAC/FwAF1fkAAL8hAAXWCgAAvyYABdYrAAC/KwAF1mIAAL86AAXWZwAAv0QABdZ4AAC/SQAF1pkAAL9OAAXX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owAB+AoAAEXBAAH4VAAARccAAfkLAABF3AAB+TQAAEXdAAH5XQAARd4AAfnIAABF4gAB+eAAAEXlAAH6zQAARgQAAfseAABGEAAB/C8AAEZcAAH8hwAARmUAAf5LAABG8QAB/vkAAEclAAH/wwAAR0UAAgHFAABHugACAtAAAEf0AAIFTAAASEcAAgVgAABISgACBXQAAEhNAAIFiAAASFMAAgWcAABIVAACBa0AAEhXAAIFwQAASFoAAgj3AABInwACCbAAAEjGAAIKVgAASO8AAhfPAABLSQACGC4AAEtKAAIYrgAAS1cAAhi+AABLWAACGM4AAEtZAAIjLAAAS9cAAiOuAABL2wACI9cAAEvcAAIrDwAATIMAAi0sAABMlwACLWkAAEyYAAIzhwAATKUAAjTnAABMswACNW0AAEy/AAI4GQAATPYAAjhrAABM+QACOLwAAEz+AAI5DgAATQEAAjlfAABNBgACObEAAE0JAAI6AgAATQ4AAjpUAABNEQACOqUAAE0WAAI66wAATRkAAjs8AABNHgACO4IAAE0hAAI70wAATSYAAjwZAABNKQACPGoAAE0uAAI8sAAATTEAAj0BAABNNgACPVMAAE05AAI9pAAATT8AAj32AABNQgACPkcAAE1IAAI+lwAATUsAAj7mAABNUQACPzYAAE1UAAI/hQAATVoAAj/JAABNXQACQL4AAE1jAAJG8wAAToUAAkdFAABOiAACR9QAAE6MAAJINgAATo8AAkiCAABOlAACSTwAAE61AAJKOQAATtUAAkt7AABO9AACTEoAAE8TAAJNaAAATzMAAk4FAABPOQACTtQAAE9YAAJP8gAAT3gAAlCPAABPfgACUV4AAE+dAAJSfAAAT70AAlMZAABPwwACU+gAAE/iAAJUxQAAUAIAAlblAABQKgACVz4AAFAwAAJXuAAAUD4AAliRAABQTQACWWAAAFBsAAJaPQAAUIwAAlxdAABQtAACXLYAAFC6AAJdMAAAUMgAAl4JAABQ1wACXswAAFD1AAJf6gAAURUAAmBDAABRGwACYL0AAFEoAAJhkgAAUTcAAmJVAABRVQACY3MAAFF1AAJjzAAAUXsAAmRGAABRiAACZRsAAFGXAAJl3gAAUbUAAmbxAABR0wACZ0oAAFHZAAJnxAAAUeYAAmiZAABR9QACaVwAAFITAAJqbwAAUjEAAmrIAABSNwACa0IAAFJEAAJsDQAAUlMAAnLeAABTeQACc0IAAFN8AAJz8QAAU4AAAnRlAABTgwACdMMAAFOJAAJ1qQAAU6sAAnbcAABT0AACeFAAAFPvAAJ5HwAAVA4AAnoyAABULAACeosAAFQyAAJ7BQAAVEAAAnvaAABUUAACfKkAAFRvAAJ9vAAAVI0AAn4VAABUkwACfo8AAFShAAJ/WgAAVLEAAobfAABV8gAChz8AAFX1AAKH5gAAVfkAAohWAABV/AACiLIAAFYCAAKJlAAAViQAAorDAABWSAACjDUAAFZnAAKNAgAAVoYAAo4TAABWpAACjmwAAFaqAAKO5AAAVrgAAo+tAABWyAAClzIAAFgJAAKXkgAAWAwAApg5AABYEAACmKkAAFgTAAKZBQAAWBkAApnnAABYOwACmxYAAFhfAAKciAAAWH4AAp1VAABYnQACnmYAAFi7AAKevwAAWMEAAp83AABYzwACoAAAAFjfAAKnhQAAWiAAAqflAABaIwACqIwAAFonAAKo/AAAWioAAqlYAABaMAACqjoAAFpSAAKraQAAWnYAAqzbAABalQACragAAFq0AAKuuQAAWtIAAq8SAABa2AACr4oAAFrmAAKwXQAAWvYAArEgAABbFQACsjMAAFszAAKy0AAAWzkAArOfAABbWAACtL0AAFt4AAK1WgAAW34AArYpAABbnQACt0cAAFu9AAK35AAAW8MAArinAABb4gACucUAAFwCAAK6HgAAXAgAArqYAABcFgACu20AAFwlAAK8MAAAXEQAAr1OAABcZAACvacAAFxqAAK+IQAAXHgAAr72AABchwACv7kAAFylAALA1wAAXMUAAsEwAABcywACwaoAAFzYAALCfwAAXOcAAsNCAABdBQACxGAAAF0lAALEuQAAXSsAAsUzAABdOAACxggAAF1HAALGywAAXWUAAsfeAABdgwACyDcAAF2JAALIsQAAXZYAAsmGAABdpQACykkAAF3DAALLXAAAXeEAAsu1AABd5wACzC8AAF30AALNBAAAXgMAAs3HAABeIgACztoAAF5AAALPMwAAXkYAAs+tAABeVAAC0IIAAF5kAALRRQAAXoMAAtJYAABeoQAC0rEAAF6nAALTKwAAXrUAAtQAAABexQAC1MEAAF7kAALV0gAAXwIAAtYrAABfCAAC1qMAAF8WAALXdgAAXyYAAtg3AABfRQAC2UgAAF9jAALZoQAAX2kAAtoZAABfdwAC2uwAAF+HAALbrQAAX6YAAty+AABfxAAC3RcAAF/KAALdjwAAX9gAAt5kAABf6AAC3uoAAF/rAALfZAAAX+4AAt/jAABf8wAC3/8AAF/3AALgFwAAX/oAAuAvAABf+wAC4Q0AAGAGAALjygAAYFIAAuQcAABgVQAC5KsAAGBZAALlDQAAYFwAAuVZAABgYQAC5hMAAGCCAALnEAAAYKIAAuhOAABgwQAC6U8AAGD1AALqqwAAYSoAAuuxAABhNAAC7LIAAGFoAALuDgAAYZ0AAu6vAABhowAC77AAAGHXAALxDAAAYgwAAvGpAABiEgAC8qoAAGJGAAL0BgAAYnsAAvSjAABigQAC9aQAAGK1AAL3AAAAYuoAAvedAABi8AAC+J4AAGMjAAL5+gAAY1gAAvqXAABjXgAC+5gAAGORAAL89AAAY8YAAv2RAABjzAAC/pIAAGP/AAL/4wAAZDIAAwCAAABkOAADAYEAAGRrAAMC0gAAZJ4AAwNlAABkpAADA8kAAGSnAAMEeAAAZKsAAwTsAABkrgADBUoAAGS0AAMGMAAAZNYAAwdjAABk+wADCNMAAGUaAAMJ1AAAZU4AAwslAABlgQADC8IAAGWHAAMMwwAAZbsAAw4UAABl7gADDqcAAGX0AAMPBwAAZfcAAw+uAABl+wADEB4AAGX+AAMQegAAZgcAAxFcAABmLAADEosAAGZTAAMT+QAAZncAAxT4AABmqwADFkcAAGbeAAMW2gAAZuQAAxc6AABm5wADF+EAAGbrAAMYUQAAZu4AAxitAABm9wADGY8AAGccAAMavgAAZ0MAAxwsAABnZwADHSsAAGebAAMeegAAZ84AAx8NAABn1AADH20AAGfXAAMgFAAAZ9sAAyCEAABn3gADIOAAAGfnAAMhwgAAaAwAAyLxAABoMwADJF8AAGhXAAMlXgAAaIsAAyatAABovgADUv4AAGuWAANTSgAAa5oAA1NpAABrngADU4gAAGuhAANT4wAAa6QAA1W0AABsSwADWMoAAGyeAANY2gAAbJ8AA1jxAABspQADWXQAAGywAANbZAAAbPwAA1wEAABtGQADXCcAAG0aAANccAAAbRsAA1yCAABtIQADXJYAAG0iAANdfAAAbTYAA1+1AABtjQADYHsAAG2fAANgjgAAbaUAA2ChAABtqwADYLQAAG2xAANgxwAAbbcAA2DaAABtuwADYPYAAG3CAANhLAAAbc4AA2E9AABt1AADYVAAAG3XAANhYgAAbdsAA2F1AABt3gADYYUAAG3hAANhmAAAbeQAA2GrAABt6gADYb4AAG3wAANh0QAAbfYAA2HkAABt/AADYfcAAG4CAANiHQAAbg0AA2IuAABuEwADY8cAAG4oAANnsAAAbvoAA2n1AABvcAADa54AAG+7AANxKQAAcSAAA3JhAABxdQADc9IAAHHGAAN1zQAAciIAA3ZsAAByTAADd0QAAHJtAAN4NQAAcowAA3i2AAByqQADeeUAAHLdAAN6FgAAct4AA3pWAABy4QADewUAAHLlAAN7GwAAcuYAA3s2AABy7AADe08AAHLyAAN7aAAAcvgAA34GAABzbgADft0AAHODAAN/JgAAc48AA4EiAABz5wADgc0AAHQSAAOCGwAAdB4AA4J/AAB0OgADgu0AAHRQAAOEDQAAdH8AA4RSAAB0hQADhGUAAHSLAAOEegAAdJEAA4UKAAB0kgADhRwAAHSVAAOFpQAAdJYAA4jyAAB1CQADiQcAAHUKAAOKoAAAdSgAA42AAAB1TAADjZYAAHVNAAONrAAAdVEAA45nAAB1UgADkPsAAHXYAAOREAAAddkAA5MAAAB2BQADk9IAAHYaAAOUjAAAdiMAA5ShAAB2KQADohsAAHd6AAOiMAAAd3sAA6NdAAB3jgADqNMAAHgDAAOo6QAAeAYAA6j9AAB4BwADqykAAHgYAAOrPwAAeBkAA6tVAAB4HQADrHAAAHgmAAOvjwAAeIEAA7AwAAB4hQADsMAAAHiMAAOw2gAAeI0AA7GhAAB4mQADsb0AAHidAAOx0QAAeKAAA7xRAAB42wADvIcAAHjeAAO83gAAeOsAA71UAAB47gADvssAAHkxAAO/IQAAeTwAA8KLAAB53QADxSwAAHonAAPFlwAAeioAA8haAAB6kQADyHIAAHqVAAPIhgAAepgAA8iaAAB6mQADyW4AAHqiAAPLLwAAeusAA8uSAAB69QADy9YAAHr5AAPMOQAAewgAA8x9AAB7DAADzMEAAHsQAAPNGgAAex8AA81eAAB7IwADzdkAAHsvAAPOHQAAezMAA85hAAB7NgADzrcAAHs8AAPPGgAAe0gAA89eAAB7TAADz8cAAHtdAAPQMAAAe24AA9CHAAB7egAD0N4AAHuGAAPRPwAAe5IAA9IfAAB7pQAD0koAAHumAAPSdwAAe6cAA9SeAAB8BQAD1LIAAHwGAAPUxgAAfAkAA9TaAAB8DAAD1O4AAHwNAAPX1AAAfC8AA9ohAAB8cwAD2oMAAHx0AAPalwAAfHcAA9qrAAB8egAD2r8AAHx7AAPbaAAAfHwAA9u/AAB8gAAD3CAAAHyBAAPckgAAfIcAA9ysAAB8iAAD3R8AAHyOAAPdOQAAfI8AA91TAAB8kAAD3W0AAHyRAAPdhwAAfJIAA92hAAB8kwAD3b0AAHyUAAPejgAAfKgAA98jAAB8rwAD4uIAAH0XAAPkjwAAfXEAA+TFAAB9dAAD5PsAAH14AAPlMQAAfXsAA+WIAAB9iAAD5ckAAH2LAAPmngAAfb4AA+gPAAB+BQAD6GkAAH4TAAPpZwAAfkwAA+pwAAB+ewAD7xwAAH89AAPwOAAAf3wAA/DxAAB/mgAD8V4AAH+bAAPz6gAAf98AA/RWAAB/4AAD9e8AAIBGAAP24AAAgIQAA/erAACAuAAD9/UAAIC8AAP4awAAgL0AA/jBAACAwAAD+RcAAIDDAAP5bQAAgMYAA/oGAACA1gAD+p8AAIDmAAP67wAAgOwAA/tFAACA9AAD+5sAAID6AAP78QAAgQIAA/w/AACBCgAD/IMAAIENAAP8xwAAgRAAA/0LAACBEwAD/U8AAIEWAAP9kwAAgRkAA/3XAACBHAAD/hsAAIEfAAP+XwAAgSIAA/6jAACBJQAD/ucAAIEoAAP/ZAAAgToAA/+6AACBQgAEABAAAIFKAAQAZgAAgVAABAC+AACBVgAEAScAAIFnAAQBkAAAgXgABAHUAACBewAEAk0AAIGBAAQDLgAAgZoABANsAACBngAEBrQAAIJOAAQJiwAAgtwABAzZAACDTQAEDUMAAINOAAQNjwAAg1MABBBMAACDqgAEHrwAAIXeAAQfPgAAhd8ABB/UAACF6AAEH+gAAIXpAAQf/gAAheoABCAUAACF8AAEICgAAIXzAAQgPAAAhfcABCBQAACF+gAEIGQAAIX7AAQgfgAAhfwABCCUAACF/QAEIwoAAIYtAAQs1QAAh6EABC0CAACHogAELS8AAIejAAQtiwAAh6kABC2dAACHrwAELa8AAIe1AAQuagAAh9UABC9RAACIJwAEL2EAAIgrAAQv7gAAiDUABDACAACINgAEMBQAAIg3AAQxFAAAiEUABDGBAACIUQAEMfwAAIhiAAQzUQAAiKcABDREAACIvwAENZcAAIjjAAQ2FQAAiOkABDYnAACI6gAENjsAAIjuAAQ3QgAAiQQABDdWAACJBwAEN2oAAIkLAAQ3fAAAiQ8ABDgzAACJHAAESEEAAIs1AARJZAAAi1IABEmcAACLUwAESccAAItUAARLJAAAi5UABEyqAACL8QAETR0AAIwUAAROLgAAjFEABFB1AACM0QAEUwQAAI1eAARUdgAAjakABFY4AACOEAAEWSoAAI7LAARZ8gAAjukABFqyAACPDAAEW78AAI9BAARdIQAAj38ABGKTAACQSAAEcMsAAJHQAARx0gAAkfYABHP2AACSZQAEeJAAAJNjAAR4xwAAk2QABHuAAACThAAEe9IAAJOHAAR8LwAAk5AABHyYAACTlgAEfPsAAJObAAR9SQAAk58ABIEuAACUHwAEhBoAAJSsAASG8AAAlQ0ABIlUAACVagAEjAAAAJXtAASQBAAAlqcABJBXAACWqgAEk6MAAJcdAASUAAAAlyYABJRSAACXKQAElP8AAJcvAASVXAAAlzgABJWuAACXOwAElksAAJdBAASWqAAAl0oABJb6AACXTQAEl5EAAJdVAASXqQAAl1gABJfBAACXXgAEmM8AAJeGAASZLQAAl5QABJn5AACXrAAEmhMAAJeyAASaLQAAl7YABJuAAACX3AAEm5oAAJfiAASbtAAAl+UABJvOAACX6wAEnHcAAJf2AASfSwAAmMEABKG1AACYwgAEooEAAJjGAASlLAAAmNYABKWAAACY3AAEpZYAAJjdAASlpgAAmN4ABKW6AACY3wAEqCkAAJj5AASpuQAAmSkABKnNAACZLAAEsB8AAJoRAASwLwAAmhQABLJzAACaVwAEsokAAJpaAASzIAAAmlsABLOmAACaZgAEs7wAAJppAASz0gAAmmoABLRwAACaawAEtQYAAJqAAAS1HAAAmoYABLU0AACajAAEtVEAAJqSAAS1aQAAmpMABLV/AACalwAEtZMAAJqdAAS6qQAAmvEABMb9AACcmAAE0+0AAJ7AAATUaAAAnsEABNTgAACezAAE1VAAAJ7SAATVyAAAntoABNZAAACe3QAE10EAAJ72AATYBwAAnwEABNkcAACfDAAE2eIAAJ8XAATaswAAnyIABNs2AACfIwAE3EsAAJ89AATcqQAAn0MABN01AACfXQAE3UkAAJ9eAATdWQAAn2EABN4HAACfYgAE5moAAKC9AAUDAQAApD4ABQOWAACkQQAFB6IAAKTGAAUWOAAApXEABR3kAACllAAFHjkAAKWVAAUefAAApZYABR69AACllwAFHv4AAKWYAAUfhQAApZsABR+7AAClnAAFLskAAKakAAUu5wAApqcABS7/AACmqwAFLxcAAKauAAUvLwAAprIABS9FAACmtQAFL10AAKa4AAUv2wAApsAABTCmAACnAgAFMYUAAKdBAAUzOgAAp80ABTUaAACoYwAFNa4AAKh8AAU4oQAAqUAABTnsAACpegAFOlYAAKmLAAVtBwAAsSgABW0gAACxKQAFbTsAALEqAAVtVgAAsS0ABW1wAACxLgAFbYkAALEvAAVtpAAAsTAABW2/AACxNgAFbeEAALE3AAVt/QAAsTsABW4ZAACxQQAFbkAAALFHAAW5RAAAujAABcYNAAC8gAAFxnsAALyLAAXPUwAAvasABdCrAAC+CgAF0UEAAL4hAAXUIgAAvr0ABd85AADAxwAF31QAAMDLAAXfdQAAwNEABeq7AADCmgAF65IAAMK3AAXrrQAAwroABevIAADCvQAF6+MAAMLAAAXr/gAAwsMABewZAADCxgAF7DQAAMLJAAXsTwAAwsoABexqAADCzgAF90MAAMVkAAX4oAAAxZgABflbAADFqAAF+kcAAMX2AAX7CgAAxgEAAAR8AAAcaQAAAAAAAAAAAAAAAQAAAAacagAaMkhjfICYgLCAxoDUgNyA44DtgPuBCIEMgRGBFoEbgSCBJoEsgTKBOIE9gUOBR4FVgWOBaoFvgXeBgIGYgbGBx4Hege+CAYIRgiKCMoJDglSCZoJ2gouCroK7gsmC2ILrgvmDB4MUgxiDLYNJg2yDfYOZg6aDsYO3g76DxYPVg+CD5IPtg/eECIQShB2EJ4QyhDyER4RThF+EbYR5hIeEmYSshMaE2YTthQCFFIUnhTuFUIVlhXyFkYWohbKFuoXEhdKF4YX3hgaGFoYlhjWGRIZUhmWGdoaJhpqGrYa6hr+Gx4bMhtKG1YbZhuOG7ocAhxOHJ4c8h0aHUYdbh2aHcod/h4yHmoeoh7eHu4fLh9+H7of9iA6IF4ghiCuINohOiFyIb4h5iISIkYifiLCItIi5iMeI1ojdiOWI7Ij1iQCJCIkRiSCJL4k/iU6JXolniXGJdYmIiYyJlomlia6Ju4nJidiJ54noieyJ8YoAigWKC4oOihKKHoowikSKVopoin+KjIqYiqiKvIrRitaK5IrrivKLAYsKixyLJoswiz6LT4tXi3OLkIuoi8GL2Ivwi/mMA4wLjBSMGYwfjCyML4w8jECMRYxejG+MkoygjKeMsozEjM+M24zpjPeNDY0jjSiNMI0+jUuNUY1VjWCNbI1xjYCNjY2SjZyNoY2xjdCN2Y3qjfqOCo4cjjWORI5ijm6Oco51jnmOf46Tjp6Or47EjtqO5o78jwyPG48rjy+PM49Dj1CPYo9wj3+Pjo+cj6WPrI+2j8KP0I/dj+OP7Y/7kACQB5ATkB2QMpA/kFOQXpBskHGQgZChkLOQvpDOkOWQ8JEGkRaRJpE+kUiRUZFqkXKRgJGBkYKRkpGXkaSRspHEkdyR8JH8kgiSFJIVkiaSKZI7kj2SP5JDkkeSX5JjkmmSbZJukoKSjJKSkpqSnpKlkqaSqJKskreSxZLXkt+S9ZMAkwWTDpMbkyKTMJNCk1yTZJNsk36Tj5Oek6mTsZOyk7STw5PLk9ST45Pvk/CT/5QLlBaUUJRYlFyUapSTlMGUypTSlNyU55T0lP6VDpUUlVCVUpVTlVSVVZVilW6VfJWalZ6Vp5XGldGV2ZXfleqV8ZX9lgaWCpYUliyWOpZJllyWapZzloKWj5aVlpqWn5arlreWw5bSltqW4pbslv+XD5calyaXLpc+l0iXU5dcl26XcZd4l4CXkpebl6SXrZe/l86X0Jfal+WX55fwl/uYAZgMmCGYOJg5mEWYVZhomH2Yg5iPmJ6Yp5izmLuYzJjdmOaY95j9mQ6ZHpklmSmZPJlCmUOZU5llmXGZhpmOmaGZsZnFmdSZ25n1mgOaEZokmi+aQppLml2aeZp/moWai5qRmp6apJqpmqqavJrFmtOa3ZrumwObE5sZmyCbKJsxmzmbRJtJm06baZuDm42bmZumm7ObyJvZm+Gb7Jv7nAicFpwknCucP5xHnFWcc5yZnKqcuZzCnOac85z5nQqdGJ0enSOdQJ1enXSdiZ2PnaCds527ncCd153gneid8Z4Anh+eKZ43nlOeWp5hnm6edp59noWej56lntWfEZ8bnySfM58+n0mfUp9an2mfd59+n4yfk5+hn7Cfu5/En9Sf3J/mn/Of/qAIoBGgHqAloC2gOaBGoFKgaaB3oIKgkaCZoKOgtKDFoNWg2qDkoOyg+aEBoQ2hEaEZoSKhK6EzoTyhRaFRoWShfKGCoYihiqGNoZKhpKGtobqhx6Hcoe2iBKIQohGiKaI1ojuiR6JOoleibaKNopWiuqLdovejGqMhoy6jQ6NPo5KjvKPKo8+j4qP4pACkHqQspDekSqRapGuke6STpJukqKSwpLOkwKTOpOSk86UCpQqlFKUapSClMKU9pUqlV6VkpXiljKWcpaWlrqW4pcClz6XYpdml2qXbpeKl7KX0pfWmAqYKphymIqYtpjSmOaY6pkemSKZLplSmW6ZgpmamcqaCpo2mmKaappumoqasprWmvqbIptam3abmpu+m96b7pwunGKcopyynQadEp0ynVKdkp2qncKd2p36nk6ehp6qnr6e4p8SnzKfXp+uoBqgcqDKoQKhZqHKogaiWqKuoxKjdqPmpFakeqTKpO6lEqU2pWalhqWmpbal3qXmpeqmFqY2pl6mhqauptKnEqcup1qnwqg2qOap5qoCqhaqMqpyqo6qqqrWqzKrWquKq6Krsqu2q/Kr9qv+rA6sFq0+rtKu2q7iry6wBrEusn60RrS6tYq2qrfyuF64grieuKK44rj6uQq5Jrk6uXq5jrmmuc66IrpCuna6erqyura6yrrWuuq6+rsiu0K7Srteu667xrv6vAq8Drw2vFK8aryKvL686rz+vRq9Lr1qvXq+Ir5OvnK+vr7yvy6/Rr+uv9K/+sAKwBrAPsBOwFLAVsB2wKbAysDmwRLBFsEqwS7BNsE6wVrBrsHKwpLDCsNWw3rDvsPaxBLEUsSexPrFAsVGxX7FqsXKxebGFsZKxm7GlsbKxvrHIsdOx57H+sgiyFrIjsjOyPLJHslmyb7J3soGyjrKZsqGyqrK0sryy/LMLsxezLrM6s0KzRrNQs1yzZbNys4WzjrOPs66zr7O7s8iz07PctBy0H7RJtH20irSStKC0sLS1tLu0wLTHtM6017TftPm1CrUPtRy1JrUstVy1kbWStaG1v7XItdC13LXntfK1+LYItg22G7YmtjC2QLZItlO2WbZhtnO2ebaEto+2mraotrK2ura+tsO2x7bIttG22LbgtuG247bvtvy3BbcHtwm3Hrcqtzq3Rbdbt2C3abdvt3a3gbeHt9G307fVt9a32Lfbt/e3/rgCuA24FrgluCu4NLhCuE24WbhkuG+4e7iGuJW4nLijuK+4u7jBuM+42bjmuPa5ArkGuQm5FLkcuSe5L7k/uUi5T7lguWW5eLmEuY+5lbmjua65vbncuea57rn7ugW6Cboeuiu6Qrppumu6iLqbuqG6sbrButa62rreuvS6+br7uwm7EbsYuya7NLtBu027Wrtxu3e7gbuZu6C7rLuzu8S7y7vVu9m77bwLvBu8NLxGvGG8abx5vIm8nbykvK+8try/vM+83bzmvOq8+b0CvQy9Fb0gvS29Mb1AvUy9YL11vYi9mb2svcC91r3tvf6+C74Zvh6+Ir4lvi2+ML44vjm+Rr5MvlW+Yb5lvmi+b76GvpK+lr6lvq6+tL7Avsm+1L7dvuW+677zvv+/Db8Pvyy/Or9Dv1W/XL9pv3K/fL+Cv5K/pr+7v86/78AAQAPAAEAlwABAR8AAQFDAAEBVwABAYMAAQGjAAEBqwABAccAAQHfAAECLwABAnMAAQJ/AAECgwABAocAAQKLAAECpwABAuMAAQM/AAEDSwABA3MAAQObAAEEDwABBGMAAQSvAAEE0wABBPMAAQWfAAEFvwABBecAAQYzAAEGdwABBtcAAQcLAAEHHwABBzcAAQdPAAEHZwABB7MAAQgjAAEIUwABCLcAAQk/AAEJewABCasAAQnnAAEKLwABCmcAAQqjAAEKvwABCvMAAQtHAAELswABC98AAQxHAAEMfwABDJ8AAQzTAAEM7wABDVMAAQ3PAAEOTwABDosAAQ6nAAEO2wABDycAAQ+LAAEP8wABEBsAARAvAAEQTwABEGsAARB/AAEQrwABENMAARD/AAERJwABEVMAARFvAAERjwABEasAARG/AAER4wABEgsAARIjAAESOwABEkcAARJ3AAESfwABErsAARL7AAETEwABEycAARNjAAETmwABE7sAARPrAAEUDwABFF8AARSnAAEUywABFPcAARUrAAEVUwABFV8AARVzAAEVlwABFbMAARXjAAEWEwABFjcAARZDAAEWawABFosAARarAAEWrwABFvcAARc/AAEXiwABF78AARgLAAEYYwABGI8AARi3AAEYvwABGNsAARkHAAEZSwABGVcAARmTAAEZxwABGhMAARpnAAEahwABGuMAARsfAAEbSwABG4cAARvTAAEcGwABHGcAAR0DAAEduwABHeMAAR4LAAEebwABHtMAAR9PAAEfdwABH58AAR/HAAEf9wABICcAASA3AAEgWwABIK8AASDXAAEhAwABITsAASFPAAEhdwABIZ8AASHfAAEh+wABIgcAASIvAAEinwABIrMAASLbAAEjGwABIysAASNbAAEjowABI8cAASPTAAEj1wABJAcAASRXAAEkrwABJOMAASUXAAElSwABJWcAASV7AAElkwABJa8AASXrAAEmIwABJmsAASaXAAEm5wABJysAASc7AAEnfwABJ7MAASf3AAEoZwABKJ8AASjnAAEpGwABKT8AASmHAAEptwABKesAASorAAEqPwABKlsAASqPAAEquwABKt8AASsfAAErawABK68AASv7AAEsJwABLE8AASyPAAEsrwABLPMAAS0TAAEtVwABLXsAAS3DAAEt5wABLi8AAS5TAAEumwABLr8AAS8HAAEvLwABL3sAAS+jAAEv7wABMBMAATBbAAEwfwABMMcAATDvAAExOwABMWMAATGvAAEx0wABMhsAATI/AAEyhwABMq8AATL7AAEzIwABM28AATObAAEz3wABNC8AATRbAAE0qwABNNcAATUnAAE1UwABNaMAATXXAAE2LwABNmMAATa7AAE25wABNzcAATdjAAE3swABN+cAATg/AAE4cwABOMsAATlXAAE5kwABObsAATnjAAE6BwABOi8AATpvAAE6rwABOtMAATsXAAE7WwABO5sAATvbAAE8HwABPGMAATyjAAE84wABPScAAT1rAAE+DwABPlcAAT6fAAE+5wABPy8AAT/nAAFANwABQIcAAUEvAAFBdwABQb8AAUJ3AAFCxwABQxcAAUNLAAFDdwABQ6sAAUPzAAFECwABRC8AAURDAAFEcwABRKsAAUTTAAFFPwABRZsAAUYHAAFGVwABRwcAAUeHAAFITwABSSsAAUn3AAFK0wABS0sAAUtzAAFLlwABS8sAAUwHAAFMKwABTEsAAUynAAFMxwABTOcAAU1HAAFNVwABTZcAAU4TAAFONwABTpcAAU77AAFPWwABT78AAU/jAAFQQwABUGsAAVDPAAFQ+wABUWMAAVGPAAFR9wABUisAAVKbAAFSxwABUy8AAVNjAAFT0wABU/cAAVQTAAFUNwABVE8AAVRfAAFUewABVJsAAVTXAAFU9wABVRsAAVU7AAFVYwABVYcAAVWzAAFV2wABVgsAAVY3AAFWYwABVp8AAVbHAAFW8wABVxsAAVdTAAFXowABV/cAAVgnAAFYcwABWLcAAVj/AAFZGwABWVcAAVmbAAFZxwABWfcAAVoPAAFaPwABWosAAVqjAAFa6wABWvcAAVsDAAFbhwABW5cAAVufAAFb7wABW/8AAVwjAAFcSwABXE8AAVxTAAFckwABXOcAAV0HAAFdEwABXX8AAV3bAAFeBwABXl8AAV5zAAFehwABXp8AAV67AAFe4wABXxsAAV9jAAFflwABX/cAAWB7AAFgqwABYNcAAWDvAAFhJwABYY8AAWG3AAFh/wABYiMAAWKHAAFi1wABYzMAAWNTAAFjpwABZEcAAWSjAAFlSwABZasAAWXTAAFmnwABZrsAAWdXAAFn7wABaBcAAWgvAAFoMwABaGsAAWjLAAFo5wABaPcAAWkjAAFpPwABaVMAAWl3AAFpgwABaasAAWnzAAFqHwABanMAAWqrAAFq9wABa0cAAWuLAAFrrwABa+cAAWxDAAFslwABbMcAAW0DAAFtJwABbXMAAW2rAAFt3wABbicAAW5XAAFuuwABbwMAAW9XAAFvowABb88AAW/3AAFwUwABcJMAAXC/AAFw+wABcRMAAXE7AAFxYwABcYMAAXGzAAFx3wABchsAAXJ7AAFyuwABcvsAAXMfAAFzSwABc5sAAXPHAAF0FwABdD8AAXSDAAF0xwABdN8AAXT7AAF1LwABdYMAAXWbAAF1rwABdb8AAXXLAAF2CwABdh8AAXY/AAF2TwABdpMAAXafAAF3BwABd+cAAXgbAAF4PwABeG8AAXi7AAF47wABeScAAXlbAAF5fwABeaMAAXnHAAF56wABehsAAXo/AAF6VwABeo8AAXrLAAF7BwABe0cAAXt/AAF73wABfA8AAXwjAAF8TwABfGcAAXyPAAF8zwABfNsAAX0XAAF9PwABfWsAAX2XAAF9uwABfdcAAX4PAAF+IwABfl8AAX57AAF+nwABfsMAAX7bAAF/FwABf38AAX+3AAF/5wABgB8AAYBnAAGAkwABgKsAAYDPAAGA/wABgRMAAYEzAAGBhwABge8AAYJTAAGCkwABgr8AAYL7AAGDIwABgz8AAYOHAAGD0wABhCcAAYSPAAGE2wABhSMAAYU/AAGFVwABhWMAAYWzAAGF2wABhgMAAYYvAAGGWwABhn8AAYaHAAGGpwABhs8AAYb3AAGHGwABh1cAAYd/AAGHkwABh7MAAYfPAAGIJwABiGsAAYibAAGIzwABiScAAYmvAAGKAwABihsAAYpDAAGKXwABiocAAYqPAAGKowABivsAAYsXAAGLjwABi6sAAYv7AAGMOwABjGsAAYzTAAGM1wABjS8AAY1zAAGNrwABjfMAAY5LAAGOlwABjsMAAY8LAAGPSwABj5sAAY+zAAGP1wABkA8AAZA/AAGQbwABkH8AAZCnAAGQ2wABkQsAAZE3AAGRewABkZ8AAZHHAAGR7wABkhMAAZI/AAGSZwABknsAAZKXAAGSwwABkt8AAZL/AAGTEwABkycAAZNbAAGTqwABk98AAZQbAAGURwABlIsAAZS/AAGU9wABlUMAAZVPAAGVXwABlW8AAZXLAAGWHwABllsAAZaTAAGW3wABly8AAZeTAAGX5wABmAsAAZgrAAGYcwABmLcAAZjXAAGY+wABmR8AAZm/AAGZ2wABmhsAAZpzAAGafwABmqsAAZrfAAGa8wABmwsAAZsjAAGbQwABm3cAAZurAAGb6wABnB8AAZxDAAGcUwABnJ8AAZyzAAGcwwABnNsAAZznAAGc/wABnRcAAZ1nAAGdkwABnbcAAZ3zAAGeKwABnlcAAZ6LAAGetwABnvMAAZ8jAAGfVwABn48AAZ+vAAGf6wABoAsAAaAvAAGgTwABoHsAAaCrAAGg1wABoPsAAaE3AAGhbwABoZsAAaHjAAGiIwABokcAAaJnAAGiowABotcAAaMTAAGjPwABo3sAAaOzAAGjywABpA8AAaRHAAGkbwABpKcAAaTPAAGk4wABpSsAAaWHAAGlnwABpd8AAaYLAAGmawABpqcAAabrAAGnCwABpzMAAadDAAGnawABp3sAAaejAAGnywABqAsAAagjAAGoUwABqI8AAajjAAGpEwABqVsAAamXAAGp0wABqg8AAaprAAGq3wABqwcAAatXAAGrawABq6cAAavLAAGsBwABrBMAAaxTAAGsYwABrHcAAayTAAGsywABrPsAAa0nAAGtgwABracAAa3fAAGuDwABrh8AAa4rAAGuUwABrmcAAa7PAAGu2wABrvMAAa8TAAGvRwABr2sAAa97AAGvuwABr/MAAbAjAAGwbwABsJcAAbDHAAGw5wABsQcAAbFbAAGxfwABsd8AAbI3AAGyXwABso8AAbK/AAGy0wABsxcAAbMzAAGziwABs6sAAbP7AAG0VwABtLMAAbTnAAG09wABtSsAAbVHAAG1jwABtcMAAbXfAAG2RwABtnMAAbaXAAG2ywABtv8AAbcfAAG3UwABt+MAAbg7AAG4iwABuNMAAbkbAAG5XwABuacAAbnLAAG6HwABuoMAAbrjAAG7RwABu4MAAbvbAAG8FwABvG8AAbzHAAG9HwABvXcAAb3jAAG+RwABvr8AAb8XAAG/LwABv0MAAb9XAAG/iwABv7MAAcALAAHAGwABwKsAAcDDAAHAxwABwOcAAcEXAAHBSwABwX8AAcG3AAHB+wABwk8AAcJbAAHCZwABwnMAAcJ/AAHCiwABwpcAAcKjAAHCrwABwrsAAcLHAAHC0wABwt8AAcLrAAHC9wABwwMAAcMPAAHDGwABwycAAcMzAAHDPwABw0sAAcNXAAHDYwABw28AAcN7AAHDhwABw5MAAcOfAAHDqwABw7cAAcPDAAHDzwABw9sAAcPnAAHD8wABw/8AAcQLAAHEFwABxCMAAcQvAAHEOwABxEcAAcRTAAHEXwABxGsAAcR3AAHEgwABxI8AAcSbAAHEpwABxLMAAcS/AAHEywABxNcAAcTjAAHE7wABxPsAAcUHAAHFEwABxR8AAcUrAAHFNwABxUMAAcVPAAHFWwABxWcAAcVzAAHFfwABxYsAAcWXAAHFowABxa8AAcW7AAHFxwABxdMAAcXfAAHF6wABxfcAAcYDAAHGDwABxhsAAcYnAAHGMwABxj8AAcZLAAHGVwABxmMAAcZvAAHGewABxocAAcaTAAHGmwABxqMAAcarAAHGswABxrsAAcbDAAHGywABxtMAAcbbAAHG3wABxuMAAcbnAAHG6wABxu8AAcbzAAHG9wABxvsAAcb/AAHHBwABxw8AAccXAAHHHwABxycAAccvAAHHNwABxz8AAcdHAAHHTwABx1cAAcdfAAHHZwABx28AAcd3AAHHfwABx4cAAcePAAHHlwABx58AAcenAAHHrwABx7cAAce/AAHHxwABx88AAcfXAAHH3wABx+cAAcfvAAHH9wABx/8AAcgHAAHIDwAByBcAAcgfAAHIJwAByC8AAcg3AAHIPwAByEcAAchPAAHIVwAByF8AAchnAAHIbwAByHcAAch/AAHIhwAByI8AAciXAAHInwAByKcAAcivAAHItwAByL8AAcjHAAHIzwAByNcAAcjfAAHI5wAByO8AAcj3AAHI/wAByQcAAckPAAHJFwAByR8AAcknAAHJLwAByTcAAck/AAHJRwAByU8AAclXAAHJXwAByWcAAclvAAHJdwAByX8AAcmHAAHJjwAByZcAAcmfAAHJpwABya8AAcm3AAHJvwAByccAAcnPAAHJ8wAByhsAAcpvAAHKhwAByssAAcrzAAHLKwABy2MAAcuXAAHL5wABzA8AAcxXAAHMtwABzOMAAcz3AAHNLwABzX8AAc27AAHODwABzh8AAc4vAAHOVwABzocAAc6zAAHO5wABzzcAAc/HAAHQBwAB0FMAAdCrAAHQ3wAB0RcAAdFHAAHRiwAB0ccAAdHnAAHSCwAB0jsAAdKHAAHSqwAB0u8AAdNLAAHTXwAB06cAAdPPAAHUKwAB1IsAAdUfAAHVVwAB1XMAAdWXAAHVywAB1dsAAdYbAAHWMwAB1mMAAdZ/AAHWlwAB1qcAAdbHAAHW2wAB1wcAAddTAAHXiwAB17MAAdgDAAHYNwAB2IMAAdivAAHY+wAB2QcAAdkXAAHZYwAB2YsAAdmfAAHZ0wAB2hsAAdpDAAHajwAB2rMAAdrHAAHa1wAB2vsAAdszAAHbQwAB21MAAdu3AAHb5wAB3CMAAdxzAAHcxwAB3UMAAd1rAAHdnwAB3d8AAd4TAAHeVwAB3osAAd6nAAHexwAB3vMAAd9XAAHfywAB4BsAAeBrAAHgtwAB4P8AAeFPAAHhkwAB4b8AAeHXAAHiFwAB4jMAAeKjAAHiswAB4tsAAeMHAAHjWwAB49cAAeRHAAHkawAB5H8AAeSzAAHk3wAB5ScAAeVTAAHlmwAB5csAAeXnAAHmLwAB5ncAAea7AAHnOwAB54MAAef/AAHoOwAB6GMAAehvAAHoowAB6K8AAejLAAHo2wAB6QMAAekXAAHvFwAB9QsAAfUvAAH1hwAB9dMAAfX3AAH2KwAB9osAAfcfAAH3TwAB91MAAfe3AAH3zwAB9+8AAfhTAAH4hwAB+NsAAfkbAAH5QwAB+V8AAfmHAAH5nwAB+c8AAfobAAH6VwAB+o8AAfqzAAH61wAB+w8AAfszAAH7YwAB+38AAfu/AAH77wAB/BcAAfxXAAH8YwAB/KcAAfzPAAH8+wAB/SMAAf1rAAH9iwAB/asAAf3fAAH+GwAB/j8AAf5bAAH+mwAB/wsAAf+HAAH/wwAB/8sAAf/3AAIAZwACAL8AAgDnAAIBCwACAVMAAgHDAAICGwACAosAAgMbAAIDQwACA8sAAgPjAAID/wACBFcAAgR7AAIEpwACBOcAAgUjAAIFVwACBY8AAgWvAAIF1wACBh8AAgZ/AAIHIwACB0sAAgeDAAIHzwACB+MAAgizAAII5wACCRsAAglLAAIJqwACCcsAAgnjAAIJ+wACCjsAAgpbAAIKdwACCsMAAgrzAAILDwACC48AAgufAAILpwACC/sAAgybAAIMwwACDR8AAg1jAAIOPwACDtMAAg8XAAIPfwACD5sAAg/HAAIQDwACEGcAAhB/AAIQrwACEMcAAhDvAAIROwACEUMAAhGDAAIRqwACEdMAAhHjAAISFwACEjsAAhKHAAISrwACEusAAhL3AAITNwACE1cAAhNnAAITpwACE9cAAhQDAAIUHwACFDsAAhRTAAIUrwACFNcAAhUDAAIVbwACFacAAhZLAAIW8wACFycAAhdfAAIXjwACGFMAAhi3AAIZIwACGUcAAhlvAAIZmwACGbMAAhnjAAIZ/wACGiMAAhpnAAIajwACGr8AAhrHAAIbAwACGx8AAhs7AAIbTwACG3cAAht/AAIbrwACG88AAhvbAAIcKwACHFMAAhyfAAIc6wACHTcAAh2DAAIdywACHhcAAh5jAAIerwACHvcAAh9DAAIfiwACH9cAAiAfAAIgawACILMAAiD7AAIhRwACIZMAAiHbAAIiIwACImsAAiK3AAIi/wACI0cAAiOPAAIj1wACJCMAAiRvAAIkuwACJQMAAiUzAAIlOwACJUsAAiVrAAIlgwACJdcAAiYPAAImRwACJmMAAiaPAAImrwACJtcAAib7AAInMwACJ1MAAid7AAInzwACKCMAAignAAIoUwACKJ8AAilLAAIp9wACKiMAAiqDAAIqzwACKx8AAitLAAIrXwACK8sAAivjAAIsLwACLFcAAix3AAIslwACLLcAAizbAAItCwACLRcAAi1HAAItgwACLY8AAi3LAAIuMwACLncAAi7bAAIvNwACL2sAAi+nAAIv7wACMAsAAjAfAAIwNwACMGsAAjCHAAIwswACMMMAAjDrAAIxAwACMTcAAjFnAAIxcwACMYMAAjGfAAIxzwACMecAAjIjAAIydwACMu8AAjMrAAIziwACM6cAAjPjAAI0GwACNDsAAjRbAAI0qwACNMsAAjTvAAI1jwACNbcAAjXHAAI10wACNfMAAjYDAAI2FwACNjcAAjZnAAI2gwACNqMAAjbPAAI3CwACNy8AAjdTAAI3bwACN5MAAje3AAI32wACN/8AAjgnAAI4WwACOHsAAjiHAAI4lwACOL8AAjjbAAI47wACOQ8AAjkfAAI5MwACOT8AAjmPAAI5swACOdMAAjoXAAI6NwACOo8AAjqzAAI61wACOxsAAjvHAAI71wACPGsAAjyrAAI9AwACPSMAAj3/AAI+uwACPwsAAj87AAI/VwACP6cAAkArAAJAXwACQHMAAkCrAAJBIwACQfsAAkLjAAJDGwACQysAAkNrAAJDjwACQ6cAAkPLAAJD/wACRBMAAkRLAAJEiwACRNsAAkUjAAJFdwACRZsAAkXrAAJGHwACRk8AAkZ/AAJGuwACRtMAAkb/AAJHBwACRzcAAkdLAAJHZwACR4sAAkgXAAJINwACSGsAAkibAAJItwACSOcAAklLAAJJtwACShcAAkprAAJKmwACStcAAksjAAJLMwACS0MAAkv/AAJMvwACTN8AAkz/AAJNIwACTUcAAk1vAAJN/wACTjcAAk57AAJOqwACTtsAAk8LAAJPFwACT1sAAk+HAAJPuwACUG8AAlCzAAJREwACUV8AAlGTAAJRtwACUf8AAlKPAAJSzwACUwcAAlMvAAJTzwACVAcAAlQ7AAJUewACVJ8AAlTHAAJU8wACVS8AAlVvAAJVmwACVdsAAlXrAAJWGwACVisAAlZ/AAJWowACVssAAlcTAAJXGwACV2cAAleTAAJXtwACV9cAAlfjAAJX/wACWBcAAlhvAAJYdwACWL8AAljrAAJZQwACWUsAAll/AAJZiwACWbsAAlnzAAJaGwACWkMAAlprAAJalwACWscAAlrrAAJbEwACW08AAltXAAJbkwACW5cAAlubAAJbwwACW/sAAlwLAAJcNwACXI8AAlzTAAJc7wACXTMAAl1XAAJdfwACXacAAl3LAAJd8wACXjcAAl5jAAJelwACXssAAl7rAAJfEwACXyMAAl9LAAJfcwACX5sAAl/DAAJf7wACYCcAAmBXAAJgcwACYI8AAmCvAAJg1wACYQcAAmEnAAJhhwACYb8AAmIvAAJiewACYpsAAmLTAAJi8wACYysAAmM7AAJjhwACY/MAAmQXAAJkZwACZHsAAmSvAAJkxwACZNsAAmUfAAJlPwACZVMAAmV7AAJmrwACZrcAAma/AAJmxwACZtMAAmbnAAJnIwACZ28AAmeXAAJnwwACZ/sAAmg/AAJodwACaLcAAmj7AAJpMwACaX8AAmrTAAJq8wACaxsAAms/AAJrjwACa8cAAmwDAAJsSwACbIMAAmyrAAJs1wACbSsAAm2DAAJt1wACbjcAAm6fAAJuxwACbwMAAm9DAAJvnwACcA8AAnCDAAJw0wACcRsAAnGDAAJxswACcd8AAnH7AAJyOwACcl8AAnJ3AAJyzwACcxsAAnODAAJz/wACdC8AAnRrAAJ04wACdTsAAnV3AAJ11wACdhMAAnZnAAJ2zwACdzsAAneDAAJ3wwACeCMAAnhLAAJ4ewACeJ8AAnjDAAJ44wACeQMAAnk3AAJ5XwACeZMAAnmzAAJ58wACejsAAnqPAAJ6qwACeu8AAnsTAAJ7RwACe4cAAnuzAAJ77wACfCMAAnyLAAJ83wACfRcAAn1LAAJ9iwACfZsAAn27AAJ+KwACfmsAAn6nAAJ+0wACfuMAAn83AAJ/PwACf28AAn+XAAJ/uwACf8sAAn/XAAJ/7wACgAsAAoAzAAKAUwACgG8AAoCvAAKAzwACgPMAAoEXAAKBSwACgYsAAoGzAAKB1wACghcAAoJTAAKCnwACguMAAoMjAAKDdwACg6sAAoPXAAKEAwAChDsAAoRvAAKEgwAChKsAAoTXAAKFBwAChUcAAoVnAAKFqwAChb8AAoXfAAKGCwAChiMAAoYzAAKGVwAChm8AAoZ/AAKGkwAChqMAAoa3AAKGywAChu8AAocTAAKHMwACh1sAAod/AAKHqwACh8MAAofjAAKICwACiCcAAohXAAKIdwACiIcAAoi/AAKJKwACiW8AAomrAAKKCwACilMAAopvAAKKqwACiucAAosnAAKLfwACi8sAAowjAAKMawACjLMAAoz7AAKNSwACjZsAAo23AAKODwACjiMAAo5rAAKOqwACjwcAAo8vAAKPVwACj3MAAo+PAAKPvwACj+MAApArAAKQawACkKsAApD/AAKRSwACkZMAApHfAAKSUwACko8AApK3AAKS+wACkysAApNvAAKTmwACk8sAApP3AAKUawAClJsAApSvAAKU1wAClP8AApUzAAKVTwAClZcAApXDAAKV2wACljsAApZrAAKWfwAClr8AApbrAAKXKwACl2cAApeLAAKXzwACmFcAApiXAAKYywACmSMAAplPAAKZjwACmdMAApo3AAKajwACmqMAApsbAAKbewACm8sAApvbAAKb+wACnB8AApxjAAKcjwACnNsAApzrAAKdMwACnUMAAp2HAAKdzwACnjMAAp5nAAKeqwACnrsAAp7fAAKfBwACn0sAAp+jAAKf/wACoDcAAqBLAAKgmwACoL8AAqDrAAKhIwACoUMAAqF3AAKhswACohMAAqJPAAKiiwACos8AAqL7AAKjEwACozsAAqOHAAKj0wACo/MAAqQXAAKkMwACpGMAAqR/AAKktwACpM8AAqTzAAKlHwACpUsAAqWLAAKlwwACpe8AAqYjAAKmYwACpnMAAqa/AAKnCwACpzsAAqdvAAKnowACp78AAqfXAAKn+wACqCMAAqjfAAKqBwACq1MAAqt7AAKrnwACq8MAAqvXAAKsBwACrC8AAqyDAAKstwACrf8AAq5zAAKu3wACrv8AAq8HAAKvOwACr2cAAq+bAAKv1wACsEsAArBrAAKwowACsL8AArDTAAKxBwACsTMAArFjAAKxgwACsacAArHDAAKx7wACsf8AArIbAAKyLwACsk8AArJ7AAKyowACstsAArLzAAKzEwACszcAArNPAAKztwACtAsAArRfAAK0swACtMcAArTjAAK1DwACtUMAArVnAAK1ewACtdMAArXrAAK2BwACtjsAArZfAAK2uwACttMAArcfAAK3OwACt1sAArd7AAK33wACuEcAAriLAAK4rwACuNcAArj7AAK5KwACuZMAArm7AAK5zwACueMAAroPAAK6QwACuosAArq7AAK62wACuyMAArtDAAK7owACu78AArvrAAK8CwACvEsAAryDAAK8kwACvKcAArzrAAK9EwACvT8AAr1TAAK9awACvZcAAr2rAAK9ywACveMAAr4HAAK+KwACvlcAAr5vAAK+8wACvyMAAr9DAAK/dwACv6sAAr/zAALABwACwCsAAsBbAALAtwACwPcAAsEbAALBNwACwYsAAsHnAALCOwACwpcAAsLvAALDhwACxEMAAsRzAALEiwACxK8AAsTfAALFBwACxTcAAsVjAALFbwACxXsAAsW3AALF8wACxjcAAsZ3AALGwwACxxcAAsdjAALHrwACx9MAAsf7AALIdwACyNMAAskDAALJKwACyVsAAsmXAALJxwACye8AAsoXAALKVwACyq8AAsrjAALLEwACy0MAAstrAALLkwACy78AAsvvAALMIwACzEcAAsxvAALMnwACzL8AAs0HAALNGwACzVsAAs2PAALNvwACzg8AAs4rAALOXwACzosAAs7LAALPCwACz0MAAs9nAALPhwACz7MAAs/7AALQHwAC0E8AAtCDAALQrwAC0PMAAtEzAALRXwAC0YsAAtGvAALRwwAC0ecAAtIPAALSQwAC0mcAAtKrAALS7wAC0zMAAtN7AALTuwAC1AMAAtRLAALUkwAC1M8AAtTzAALU/wAC1RsAAtVXAALVewAC1Y8AAtWjAALVswAC1ccAAtXbAALWCwAC1h8AAtY3AALWTwAC1mMAAtZ7AALWmwAC1r8AAtbfAALW9wAC1w8AAtcnAALXPwAC11cAAtdvAALXhwAC158AAte3AALXzwAC1+cAAtf/AALYJwAC2F8AAtibAALY1wAC2QcAAtknAALZRwAC2WsAAtmHAALZuwAC2c8AAtn3AALaIwAC2k8AAtpzAALamwAC2q8AAtrzAALbNwAC22sAAtujAALbwwAC2+MAAtwHAALcIwAC3F8AAtyPAALcpwAC3NcAAtz7AALdKwAC3UcAAt2DAALdrwAC3esAAt4rAALeTwAC3n8AAt7HAALfDwAC31sAAt+PAALfswAC39sAAt//AALgRwAC4HMAAuCfAALg5wAC4TMAAuF3AALhtwAC4e8AAuI7AALifwAC4qsAAuK7AALi2wAC4u8AAuMzAALjiwAC46cAAuPbAALj+wAC5CMAAuRnAALkpwAC5NcAAuT7AALlLwAC5VsAAuV/AALlrwAC5ecAAuYTAALmRwAC5oMAAua7AALm/wAC50sAAud7AALnswAC5+sAAug7AALogwAC6L8AAujrAALpCwAC6UcAAumXAALpuwAC6g8AAuo7AALqawAC6s8AAusjAALrXwAC648AAuwHAALsKwAC7IcAAuyjAALs2wAC7RcAAu1fAALtiwAC7bMAAu3fAALuAwAC7jMAAu5bAALuhwAC7rcAAu7jAALvHwAC74sAAu+3AALv/wAC8FsAAvCzAALw5wAC8QcAAvEnAALxLwAC8TcAAvFrAALxhwAC8aMAAvH3AALyQwAC8ncAAvKzAALy7wAC8zMAAvNfAALzpwAC88cAAvQPAAL0PwAC9JcAAvTXAAL1GwAC9WsAAvWrAAL1/wAC9ksAAvZ7AAL23wAC9wcAAvc3AAL3RwAC92cAAveTAAL3rwAC9+cAAvf/AAL4OwAC+HcAAvinAAL4ywAC+QMAAvkrAAL5UwAC+XsAAvmnAAL5wwAC+ecAAvoTAAL6OwAC+ksAAvprAAL6pwAC+sMAAvrvAAL7FwAC+1MAAvubAAL7xwAC/BMAAvw/AAL8fwAC/JsAAvzrAAL9FwAC/TsAAv1HAAL9YwAC/ZsAAv27AAL9zwAC/ecAAv4LAAL+IwAC/jsAAv5TAAL+awAC/oMAAv6bAAL+6wAC/wsAAv9LAAL/owAC//cAAwAbAAMBMwADAZsAAwHPAAMCAwADAksAAwKHAAMCywADAxsAAwOTAAMDwwADBAcAAwQ/AAMEYwADBLsAAwTzAAMFIwADBWsAAwW3AAMGVwADBpcAAwavAAMHDwADB3MAAwfXAAMIIwADCGsAAwjDAAMJDwADCXMAAwpTAAMKkwADCq8AAwrnAAMLNwADC4sAAwvXAAMMBwADDDsAAwxvAAMMpwADDN8AAw0HAAMNPwADDYMAAw3fAAMOOwADDp8AAw7fAAMPLwADD2sAAw+jAAMP6wADECsAAxB7AAMQuwADEQcAAxEnAAMRQwADEWcAAxF7AAMRpwADEd8AAxIbAAMSYwADEqsAAxLfAAMTFwADE1sAAxOfAAMT4wADFCsAAxRLAAMUfwADFKcAAxTTAAMU7wADFQ8AAxUvAAMVVwADFYcAAxW7AAMWBwADFjcAAxZnAAMWiwADFqcAAxbDAAMXAwADFzMAAxdDAAMXWwADF28AAxd/AAMXnwADF7cAAxfbAAMYAwADGC8AAxhPAAMYfwADGJsAAxi3AAMYzwADGN8AAxkHAAMZMwADGVMAAxlvAAMZlwADGbsAAxnPAAMZ3wADGf8AAxoXAAMaMwADGkcAAxpnAAMakwADGqsAAxrbAAMa7wADGw8AAxs3AAMbRwADG18AAxuvAAMb5wADG/cAAxwvAAMccwADHK8AAx0PAAMdTwADHXsAAx3LAAMd5wADHgcAAx4rAAMecwADHpsAAx6jAAMevwADHt8AAx9LAAMfbwADH58AAx/XAAMgAwADID8AAyBXAAMgkwADINMAAyDnAAMhJwADIUcAAyFzAAMhkwADIdcAAyIbAAMiQwADInMAAyKvAAMi0wADIvMAAyMzAAMjZwADI9MAAyQLAAMkKwADJDsAAyRzAAMkuwADJQ8AAyVTAAMlowADJhMAAyZXAAMmnwADJusAAycDAAMnQwADJ38AAyfPAAMoCwADKHcAAyjzAAMpWwADKacAAynzAAMqKwADKlMAAyqbAAMq0wADKy8AAyuDAAMrzwADK/8AAywrAAMsnwADLQcAAy0nAAMtcwADLXsAAy2XAAMttwADLisAAy5TAAMuhwADLsMAAy8DAAMvRwADL1sAAy+fAAMvwwADL/MAAzAXAAMwXwADMIsAAzC7AAMw+wADMR8AAzFDAAMxiwADMcMAAzI3AAMycwADMpMAAzKjAAMy3wADMysAAzOLAAMz2wADNDMAAzSvAAM09wADNTcAAzWLAAM1xwADNfMAAzY/AAM2ewADNuMAAzdXAAM3rwADN/MAAzgjAAM4UwADOMMAAzlrAAM5nwADOb8AAznbAAM5/wADOj8AAzp7AAM6lwADOrsAAzrvAAM7JwADO2sAAzubAAM7wwADPC8AAzxfAAM8hwADPMsAAzz3AAM9JwADPU8AAz27AAM96wADPi8AAz5bAAM+kwADPxcAAz9fAAM/nwADP9MAA0AXAANAMwADQIMAA0CvAANAywADQR8AA0E3AANBhwADQesAA0IPAANCKwADQmMAA0KvAANC5wADQy8AA0NfAANDhwADQ9MAA0QHAANEVwADRIsAA0SvAANE3wADRR8AA0VfAANFfwADRccAA0XvAANGGwADRj8AA0ZrAANGowADRsMAA0bnAANHBwADRx8AA0c7AANHTwADR2MAA0eHAANHqwADR9MAA0f7AANIKwADSGcAA0irAANI2wADSRMAA0k3AANJVwADSYsAA0nTAANKJwADSmsAA0p/AANKnwADSuMAA0szAANLawADS3sAA0uLAANLywADTBcAA0w7AANMbwADTIcAA0yzAANM4wADTQcAA00XAANNIwADTTcAA01PAANNVwADTXMAA02HAANNrwADTb8AA03bAANN8wADTgMAA04TAANOIwADTjcAA05LAANOXwADTnMAA06DAANOswADTscAA07TAANO3wADTusAA073AANPBwADTxcAA08nAANPNwADT0MAA09rAANPkwADT7MAA0/bAANQAwADUCsAA1BLAANQfwADUKMAA1DfAANQ+wADUQ8AA1EjAANRNwADUTsAA1FjAANRpwADUcsAA1HjAANSGwADUicAA1I7AANSUwADUmsAA1KHAANSpwADUtMAA1L7AANTIwADU08AA1OTAANTxwADU+sAA1QTAANUUwADVGsAA1SHAANUtwADVM8AA1TXAANVKwADVXsAA1WfAANVwwADVfMAA1YXAANWYwADVn8AA1avAANW2wADVysAA1dzAANXnwADV78AA1fnAANYBwADWCsAA1hHAANYiwADWMcAA1kDAANZMwADWX8AA1mrAANZzwADWesAA1oLAANaUwADWnsAA1qbAANauwADWuMAA1sPAANbSwADW3MAA1unAANb7wADXEsAA1ybAANcwwADXSMAA11LAANdawADXY8AA13DAANd/wADXicAA15HAANeZwADXssAA17zAANfDwADXysAA19HAANfgwADX7MAA1/7AANgIwADYD8AA2BzAANgpwADYL8AA2DfAANg/wADYR8AA2FvAANhnwADYcMAA2HzAANiPwADYlMAA2KTAANi0wADYwsAA2NPAANjewADY5MAA2O7AANkMwADZIcAA2S7AANk8wADZUMAA2WDAANlmwADZesAA2ZDAANmdwADZq8AA2bHAANnBwADZzsAA2d3AANnywADaDsAA2hjAANonwADaLMAA2jnAANpIwADaVMAA2mHAANp2wADaicAA2pTAANqfwADarcAA2rnAANrEwADazsAA2uTAANr1wADbEsAA2x7AANs2wADbRcAA21nAANtrwADbhsAA25vAANuzwADbxcAA29DAANvbwADb5sAA2/DAANwPwADcLsAA3EzAANxjwADce8AA3IbAANyQwADcqcAA3MjAANzbwADc5MAA3OzAANz7wADdDcAA3SDAAN06wADdTcAA3WHAAN1+wADdi8AA3aDAAN2rwADds8AA3b3AAN3FwADd0sAA3d3AAN3uwADeBMAA3g/AAN4VwADeG8AA3i3AAN43wADeQcAA3lHAAN5awADeYcAA3mjAAN50wADefsAA3o3AAN6dwADeqcAA3rLAAN68wADe0cAA3uTAAN79wADfFcAA3ynAAN89wADfUcAA32bAAN95wADfj8AA35zAAN+xwADfw8AA38vAAN/fwADf8MAA4APAAOAXwADgKsAA4EDAAOBQwADgX8AA4GvAAOB2wADggcAA4IrAAOCQwADgncAA4K7AAOC6wADgyMAA4NXAAODiwADg+cAA4QnAAOETwADhHsAA4TDAAOFCwADhT8AA4VvAAOFpwADheMAA4YbAAOGNwADhmMAA4aTAAOGvwADhtsAA4b3AAOHIwADh0MAA4d3AAOHswADh9MAA4fzAAOIEwADiDMAA4hfAAOIiwADiLcAA4kLAAOJMwADiVsAA4mjAAOJzwADif8AA4orAAOKWwADiocAA4q3AAOK6wADix8AA4tbAAOLjwADi8sAA4v/AAOMjwADjTsAA43LAAOOXwADju8AA4+DAAOQEwADkKcAA5FLAAOR+wADkq8AA5N/AAOUMwADlOsAA5WfAAOWVwADlwsAA5fDAAOYiwADmVMAA5ovAAOa+wADm9cAA5v3AAOcMwADnF8AA5ynAAOcuwADnNsAA5zvAAOc+wADnQ8AA503AAOdSwADnV8AA51zAAOdhwADna8AA53nAAOd6wADne8AA54PAAOeMwADnlcAA557AAOenwADnrcAA57LAAOe3wADnvMAA58HAAOfuwADoIsAA6E/AAOh9wADoqsAA6NjAAOkFwADpM8AA6WXAAOlswADpc8AA6XvAAOmDwADpi8AA6ZPAAOmcwADppcAA6a3AAOm1wADpvsAA6cfAAOnPwADp18AA6eDAAOnpwADp88AA6f3AAOoHwADqEcAA6h3AAOopwADqNsAA6jnAAOo/wADqTsAA6lLAAOpWwADqWsAA6l7AAOpiwADqZsAA6mrAAOpuwADqcsAA6nbAAOp6wADqfsAA6oLAAOqGwADqisAA6o7AAOqSwADqlsAA6prAAOqewADqosAA6qbAAOqqwADqrsAA6rLAAOq2wADqusAA6r7AAOrCwADqxsAA6srAAOrOwADq0sAA6tbAAOrawADq3sAA6uLAAOrmwADq6sAA6u7AAOrywADq9sAA6vrAAOr+wADrAsAA6wbAAOsKwADrDsAA6xLAAOsWwADrGsAA6x7AAOsiwADrJsAA6yrAAOsuwADrMsAA6zbAAOs6wADrPsAA60LAAOtGwADrSsAA607AAOtSwADrVsAA61rAAOtewADrYsAA62bAAOtqwADrbsAA63LAAOt2wADresAA637AAOuCwADrhsAA64rAAOuOwADrksAA65bAAOuawADrnsAA66LAAOumwADrqsAA667AAOuywADrtsAA67rAAOu+wADrwsAA68bAAOvKwADrzsAA69LAAOvWwADr2sAA697AAOviwADr5sAA6+rAAOvuwADr8sAA6/bAAOv6wADr/sAA7ALAAOwGwADsCsAA7A7AAOwSwADsFsAA7BrAAOwewADsIsAA7CbAAOwqwADsLsAA7DLAAOw2wADsOsAA7D7AAOxCwADsRsAA7ErAAOxOwADsUsAA7FbAAOxawADsXsAA7GLAAOxmwADsasAA7G7AAOxywADsdsAA7HrAAOx+wADsgsAA7IbAAOyKwADsjsAA7JLAAOyWwADsmsAA7J7AAOyiwADspsAA7KrAAOyuwADsssAA7LbAAOy6wADsvsAA7MLAAOzGwADsysAA7M7AAOzSwADs1sAA7NrAAOzewADs4sAA7ObAAOzqwADs7sAA7PLAAOz2wADs+sAA7P7AAO0CwADtBsAA7QrAAO0OwADtEsAA7RbAAO0awADtHsAA7SLAAO0mwADtKsAA7S7AAO0ywADtNsAA7TrAAO0+wADtQsAA7UbAAO1KwADtTsAA7VLAAO1WwADtWsAA7V7AAO1iwADtZsAA7WrAAO1uwADtcsAA7XbAAO16wADtfsAA7YLAAO2GwADtisAA7Y7AAO2SwADtlsAA7ZrAAO2ewADtosAA7abAAO2qwADtrsAA7bLAAO22wADtusAA7b7AAO3CwADtxsAA7crAAO3OwADt0sAA7dbAAO3awADt3sAA7eLAAO3mwADt6sAA7e7AAO3ywADt9sAA7frAAO3+wADuAsAA7gbAAO4KwADuDsAA7hLAAO4WwADuGsAA7h7AAO4iwADuJsAA7irAAO4uwADuMsAA7jbAAO46wADuPsAA7kLAAO5GwADuSsAA7k7AAO5TwADuV8AA7mbAAO5zwADuhMAA7pHAAO6rwADuw8AA7s/AAO7lwADvK8AA70TAAO+JwADvocAA7+7AAPAOwADwVcAA8G/AAPC1wADwzsAA8RXAAPEvwADxdcAA8Y7AAPHVwADx78AA8jXAAPJOwADylsAA8rHAAPL7wADzGMAA82LAAPN/wADzx8AA8+LAAPQqwAD0RcAA9FbAAPRpwAD0hMAA9I/AAPSVwAD0msAA9J7AAPSkwAD0qMAA9MDAAPTWwAD05sAA9PbAAPUGwAD1F8AA9SrAAPVCwAD1XMAA9XTAAPWKwAD1osAA9ajAAPW0wAD1xcAA9drAAPX2wAD1/8AA9gjAAPYUwAD2IMAA9jbAAPZIwAD2WcAA9mrAAPZ/wAD2kMAA9qbAAPa5wAD2y8AA9trAAPbmwAD278AA9wXAAPcOwAD3HcAA9yjAAPc3wAD3TMAA913AAPduwAD3hcAA95XAAPemwAD3v8AA99fAAPfjwAD378AA9/zAAPgKwAD4FMAA+CHAAPgxwAD4QMAA+EvAAPhNwAD4WMAA+GLAAPh0wAD4fcAA+ILAAPiPwAD4ncAA+KjAAPi4wAD4ycAA+N3AAPjqwAD4/cAA+QHAAPkRwAD5GMAA+SrAAPk8wAD5TsAA+WfAAPl5wAD5jMAA+aDAAPmuwAD5xMAA+dPAAPnjwAD5/MAA+g7AAPobwAD6JcAA+jfAAPo7wAD6TMAA+lvAAPphwAD6b8AA+oHAAPqJwAD6kMAA+pfAAPqkwAD6tMAA+sDAAPrZwAD66MAA+u/AAPr3wAD7BsAA+xnAAPsrwAD7OsAA+0/AAPtgwAD7ccAA+4jAAPuYwAD7qcAA+9DAAPvpwAD8AcAA/BTAAPwiwAD8MsAA/EXAAPxQwAD8X8AA/G7AAPx8wAD8jMAA/KDAAPy4wAD8zMAA/OLAAPz2wAD9A8AA/RbAAP0qwAD9QsAA/VvAAP1uwAD9icAA/aHAAP24wAD9ycAA/dfAAP3ewAD96MAA/fXAAP4OwAD+McAA/lPAAP5hwAD+ccAA/nnAAP6AwAD+j8AA/p7AAP6swAD+u8AA/tTAAP7qwAD/BsAA/xTAAP8rwAD/QsAA/1jAAP9kwAD/ccAA/4bAAP+MwAD/n8AA/7XAAP/AwAD/ysAA/9fAAP/gwAD/6cAA//jAAQAAwAEACcABABrAAQAqwAEAM8ABADzAAQBMwAEAXMABAGPAAQBywAEAe8ABAIDAAQCOwAEAnMABAKbAAQCzwAEAx8ABAN3AAQDywAEBBsABAQvAAQEhwAEBQ8ABAVDAAQFdwAEBasABAXfAAQGBwAEBkcABAazAAQG6wAEBy8ABAdnAAQHlwAEB8sABAffAAQH/wAECBcABAgzAAQIWwAECHcABAiXAAQIzwAECPMABAkbAAQJUwAECX8ABAmrAAQJvwAECdMABAnrAAQKDwAEClsABAqPAAQKywAECvMABAsjAAQLUwAEC4sABAvHAAQMBwAEDEMABAxnAAQMwwAEDSsABA2XAAQOCwAEDmMABA6/AAQO9wAEDw8ABA8zAAQPbwAED48ABA+7AAQP8wAEEC8ABBBXAAQQdwAEEKMABBDrAAQRVwAEEYcABBGzAAQRzwAEEf8ABBIfAAQSOwAEElMABBJrAAQSjwAEErsABBMDAAQTOwAEE6sABBP7AAQUDwAEFEMABBR3AAQUlwAEFMMABBUDAAQVTwAEFa8ABBX3AAQWOwAEFl8ABBZ7AAQWowAEFtcABBcjAAQXOwAEF2MABBd/AAQXswAEF9sABBhfAAQYiwAEGK8ABBi/AAQY0wAEGP8ABBkfAAQZMwAEGUcABBljAAQZlwAEGdcABBojAAQagwAEGuMABBtDAAQbXwAEG58ABBv/AAQcPwAEHIsABBznAAQdSwAEHacABB3PAAQeBwAEHj8ABB6fAAQe7wAEHz8ABB+XAAQf6wAEIAMABCAfAAQgOwAEIEsABCBbAAQgawAEIHsABCCLAAQgnwAEILcABCDfAAQhIwAEIVsABCGXAAQh+wAEIm8ABCKrAAQi4wAEIx8ABCNXAAQj3wAEJDsABCSHAAQk2wAEJS8ABCU/AAQlUwAEJXcABCWXAAQlowAEJhMABCY/AAQmZwAEJocABCanAAQmywAEJvcABCcXAAQnJwAEJ1cABCdvAAQn0wAEJ+sABCgXAAQoRwAEKHcABCizAAQpDwAEKYsABCm3AAQp0wAEKfcABCo/AAQqhwAEKqcABCrrAAQrNwAEK5sABCvLAAQr/wAELC8ABCxDAAQscwAELIsABCyrAAQszwAELRcABC1jAAQtrwAELesABC4fAAQuXwAELqcABC7/AAQvMwAEL18ABC+PAAQvowAEL/MABDBDAAQwfwAEMLsABDD3AAQxMwAEMWMABDGTAAQxrwAEMcsABDHzAAQyGwAEMkcABDJzAAQyjwAEMtMABDLnAAQzKwAEM08ABDN7AAQzowAEM9MABDQTAAQ0UwAENIMABDSnAAQ0zwAENPcABDUjAAQ1WwAENYMABDWnAAQ1zwAENf8ABDZLAAQ2mwAENuMABDcvAAQ3XwAEN4sABDfHAAQ37wAEOC8ABDh7AAQ4mwAEOMsABDjvAAQ5EwAEOUsABDmbAAQ5zwAEOgMABDpLAAQ6qwAEOusABDs/AAQ7kwAEO+MABDwTAAQ8QwAEPJMABDzvAAQ9JwAEPX8ABD2zAAQ96wAEPhsABD43AAQ+ZwAEPqsABD7bAAQ+9wAEPw8ABD9DAAQ/cwAEP68ABD/bAAQ//wAEQCMABEBTAARAgwAEQMMABED3AARBLwAEQXMABEGrAARB1wAEQgcABEJTAARCrwAEQtsABEMzAARDkwAEQ8MABEP3AAREQwAERIcABETDAARFCwAERUcABEWPAARF2wAERisABEY/AARGUwAERnsABEavAARGzwAERucABEcXAARHQwAER1cABEeXAARHzwAER+sABEgTAARINwAESHsABEivAARJAwAESRsABElXAARJZwAESYMABEmTAARJrwAESfMABEoXAARKRwAESnsABEqXAARKvwAESy8ABEtrAARLgwAES8cABEwPAARMQwAETIsABEzPAARNAwAETUsABE2LAARNvwAETfsABE47AAROZwAETocABE6nAAROywAETvcABE8rAARPowAEUCcABFBnAARQnwAEUO8ABFEzAARRewAEUa8ABFH3AARSTwAEUrsABFMHAARTZwAEU7cABFQbAARUWwAEVGsABFR7AARUjwAEVJsABFSnAARUtwAEVNMABFTrAARVHwAEVUsABFWDAARVswAEVgcABFYzAARWVwAEVocABFanAARW2wAEV28ABFfPAARYCwAEWFsABFi3AARY8wAEWSsABFlzAARZvwAEWe8ABFoLAARaLwAEWksABFqbAARavwAEWu8ABFsjAARbPwAEW2sABFunAARbywAEXAMABFwrAARcXwAEXJsABFzPAARdCwAEXU8ABF2bAARduwAEXd8ABF3/AAReIwAEXlMABF6HAAReswAEXucABF8TAARfRwAEX4MABF/HAARgBwAEYEsABGCXAARg6wAEYRcABGFHAARhewAEYbMABGHvAARiLwAEYlMABGJzAARikwAEYrsABGLHAARi7wAEYw8ABGMzAARjXwAEY4sABGO/AARj8wAEZCcABGR/AARk1wAEZQMABGUfAARlXwAEZZ8ABGXLAARl4wAEZgsABGYrAARmQwAEZmsABGaTAARmywAEZxsABGd7AARnkwAEZ7sABGfbAARoBwAEaDMABGhfAARoewAEaK8ABGjLAARpLwAEaUsABGl3AARp6wAEagMABGorAARqiwAEat8ABGr/AARrMwAEa1MABGt3AARrlwAEa8cABGv3AARsNwAEbGsABGyPAARsuwAEbNsABG0HAARtFwAEbTcABG1bAARtewAEbZ8ABG3bAARt+wAEbhMABG4rAARuTwAEbnMABG6rAARu5wAEbysABG9zAARvkwAEb7sABG/rAARwKwAEcGcABHCzAARw4wAEcSMABHFfAARxqwAEccsABHHrAARyDwAEcjsABHJ3AARypwAEcucABHMTAARzTwAEc38ABHO/AARz8wAEdDcABHR3AAR0pwAEdNsABHUXAAR1RwAEdYMABHWzAAR11wAEdfcABHYPAAR2NwAEdmMABHaPAAR2ywAEdv8ABHc7AAR3UwAEd5MABHe7AAR34wAEeAMABHhPAAR4YwAEeI8ABHizAAR43wAEeQsABHlPAAR5ewAEeY8ABHnLAAR5/wAEej8ABHpzAAR6swAEetsABHsTAAR7OwAEe2sABHuvAAR8EwAEfFMABHyDAAR8qwAEfPsABH1LAAR9gwAEfdMABH3jAAR+BwAEfhcABH4nAAR+SwAEfmcABH6HAAR+twAEfusABH8fAAR/MwAEf1cABH9zAAR/kwAEf7MABH/XAASAGwAEgC8ABIBPAASAXwAEgIcABIDLAASBNwAEgWsABIGTAASBxwAEggcABIJHAASCXwAEgocABIKvAASC5wAEgw8ABINHAASDfwAEg78ABIQTAASEWwAEhIsABITHAASE5wAEhRsABIWHAASF+wAEhi8ABIZPAASGZwAEhpMABIa7AASG4wAEhx8ABIc/AASHewAEh5MABIerAASHwwAEh9sABIfrAASH+wAEiAcABIgTAASIVwAEiIMABIibAASI7wAEiUMABIl7AASJzwAEihsABIpHAASKjwAEiqsABIrTAASLAwAEi1MABIuTAASLzwAEjAsABIw7AASMbwAEjJcABIzHAASM8wAEjSMABI07AASNZwAEjXMABI2bAASNvwAEje8ABI4TAASOQwAEjmcABI6PAASOrwAEjtMABI7vAASPDwAEj1MABI93AASPnwAEj8cABJAHAASQNwAEkG8ABJC3AASRBwAEkSsABJFrAASRhwAEkb8ABJH3AASSUwAEkp8ABJLzAASTGwAEk0MABJNzAASTiwAEk8cABJP/AASUSwAElJsABJS7AASU6wAElTMABJV7AASVpwAElcsABJYLAASWMwAEllsABJaDAASWqwAElssABJbrAASXSwAEl28ABJefAASX2wAEmAsABJgzAASYewAEmLsABJkHAASZRwAEmZMABJm3AASZ5wAEmhsABJo7AASaawAEmp8ABJrXAASbDwAEm0cABJt/AASbnwAEm9MABJvzAAScEwAEnEMABJyTAASc3wAEnRsABJ1XAASdkwAEnd8ABJ4nAASeawAEnq8ABJ7rAASfKwAEn1MABJ97AASfkwAEn9sABKAnAASgcwAEoMsABKD7AAShOwAEoWMABKGbAAShtwAEof8ABKIzAASiewAEor8ABKL/AASjTwAEo58ABKP7AASkJwAEpFsABKSfAASkywAEpQcABKUnAASlcwAEpasABKX3AASmFwAEpmMABKabAASm2wAEpzcABKdvAASnjwAEp6sABKfHAASn6wAEqA8ABKgjAASoRwAEqI8ABKjDAASo6wAEqScABKl/AASpswAEqd8ABKoHAASqTwAEqmcABKqzAASq9wAEqzcABKtjAASrrwAEq/8ABKwrAASsRwAErKsABKzLAASs+wAErSsABK1DAAStUwAErYMABK2vAAStywAErfcABK4fAASuNwAErncABK6PAASuvwAErvMABK8TAASvMwAEr3cABK/DAASv3wAEr/sABLAXAASwSwAEsGMABLB7AASwlwAEsK8ABLDLAASw5wAEsP8ABLEXAASxMwAEsU8ABLFrAASxhwAEsaMABLG/AASx2wAEsfcABLITAASyLwAEsksABLJnAASygwAEspsABLK3AASy0wAEsvcABLMTAASzMwAEs08ABLNnAASzfwAEs5cABLOzAASzywAEs+cABLQDAAS0GwAEtDMABLRPAAS0awAEtIcABLSjAAS0vwAEtNsABLT3AAS1EwAEtS8ABLVLAAS1ZwAEtYMABLWfAAS1twAEtdMABLXvAAS2EwAEti8ABLZPAAS2awAEtoMABLbDAAS3CwAEt18ABLe/AAS4HwAEuGcABLiXAAS4xwAEuQMABLk3AAS5VwAEuXsABLmjAAS6CwAEunMABLrXAAS7QwAEu4MABLu/AAS7+wAEvCsABLxnAAS8pwAEvOMABL0jAAS9TwAEvZcABL3jAAS+FwAEvl8ABL57AAS+pwAEvusABL8vAAS/dwAEv6MABL/TAATABwAEwEMABMB7AATArwAEwOMABMEnAATBSwAEwWcABMGnAATB7wAEwiMABMJ/AATC3wAEwx8ABMNPAATDgwAEw7MABMPjAATEFwAExFcABMTTAATFDwAExTcABMWbAATFxwAExfcABMY/AATGdwAExrMABMcDAATHMwAEx1sABMeXAATHxwAEx/cABMgfAATIWwAEyI8ABMj3AATJmwAEya8ABMnDAATJ+wAEyjMABMpXAATKewAEyrsABMrzAATLJwAEy2MABMuTAATLzwAEy98ABMv7AATMCwAEzBsABMxLAATMcwAEzJ8ABMzfAATNHwAEzVcABM2HAATNywAEzfMABM4bAATOVwAEzocABM7LAATO9wAEzyMABM9fAATPkwAEz6sABM//AATQOwAE0FcABNB3AATQowAE0McABNEfAATRQwAE0ZsABNG7AATR2wAE0gMABNIvAATSRwAE0n8ABNKXAATStwAE0usABNMvAATTawAE05MABNOnAATTswAE09cABNQHAATUKwAE1FsABNR/AATUzwAE1P8ABNUfAATVPwAE1YsABNW3AATVzwAE1f8ABNYzAATWcwAE1rcABNbnAATXJwAE118ABNebAATXzwAE1/sABNg3AATYbwAE2J8ABNi/AATY4wAE2QMABNkjAATZMwAE2UcABNlzAATZtwAE2gsABNpbAATahwAE2tMABNsLAATbZwAE25sABNwHAATcYwAE3JMABNz/AATdTwAE3W8ABN2LAATdvwAE3e8ABN5HAATebwAE3pcABN67AATe4wAE3wcABN8zAATfUwAE33sABN+PAATfpwAE38MABN/3AATgKwAE4F8ABOCHAATgvwAE4PMABOEnAAThWwAE4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X8ABTmrAAU5zwAFOesABTobAAU6QwAFOnsABTrTAAU7FwAFOzMABTtTAAU7iwAFO8cABTwbAAU8WwAFPKcABTzfAAU9PwAFPZ8ABT3vAAU+PwAFPnsABT6jAAU+0wAFPwMABT8vAAU/hwAFP68ABT/rAAVACwAFQEMABUCPAAVAowAFQLsABUDLAAVA5wAFQRMABUFDAAVBjwAFQd8ABUIvAAVCdwAFQpsABULHAAVDEwAFQ1sABUObAAVD7wAFREMABUSPAAVE4wAFRSMABUVrAAVFrwAFRdcABUX/AAVGLwAFRmMABUaLAAVGswAFRucABUc7AAVHfwAFR7MABUgPAAVIVwAFSI8ABUjTAAVJAwAFSV8ABUm/AAVJ6wAFSh8ABUpfAAVKfwAFSrMABUsLAAVLPwAFS3sABUujAAVLxwAFS/sABUxPAAVMZwAFTJ8ABUzbAAVNFwAFTUsABU1XAAVNawAFTZ8ABU3TAAVN+wAFTjsABU57AAVOswAFTvMABU8fAAVPUwAFT4MABU+TAAVPowAFT7sABU/XAAVP5wAFT/cABVAXAAVQWwAFUI8ABVCvAAVQ+wAFUS8ABVFPAAVRfwAFUZcABVHfAAVSKwAFUj8ABVJbAAVShwAFUp8ABVKnAAVSwwAFUwcABVMjAAVTSwAFU1sABVNnAAVTgwAFU8MABVPzAAVULwAFVEcABVRvAAVUpwAFVOMABVUXAAVVTwAFVYsABVXLAAVWAwAFVj8ABVZPAAVWiwAFVrcABVbrAAVXOwAFV5cABVe7AAVX5wAFWBMABVgnAAVYSwAFWHcABViHAAVYlwAFWKcABVi3AAVYzwAFWOcABVkTAAVZLwAFWUcABVlfAAVZdwAFWZcABVnfAAVaCwAFWjsABVpXAAVacwAFWp8ABVq7AAVa9wAFWy8ABVtfAAVbhwAFW7cABVvXAAVcBwAFXCcABVxXAAVcfwAFXLsABVz/AAVdPwAFXYcABV3LAAVeHwAFXlcABV57AAVelwAFXq8ABV7LAAVe1wAFXu8ABV8TAAVfMwAFX0MABV9fAAVflwAFX/cABWBDAAVgcwAFYJcABWDbAAVhMwAFYXcABWGzAAVh4wAFYisABWJTAAVidwAFYssABWMzAAVjnwAFY+cABWQXAAVkTwAFZH8ABWSzAAVk9wAFZScABWUzAAVlOwAFZUMABWVvAAVlnwAFZesABWYbAAVmKwAFZlMABWaHAAVm0wAFZxcABWdfAAVnmwAFZ9MABWgDAAVoNwAFaD8ABWhzAAVonwAFaLcABWjXAAVo8wAFaSsABWlfAAVpjwAFaa8ABWnjAAVp8wAFafsABWoDAAVqFwAFah8ABWo/AAVqVwAFapcABWrHAAVq5wAFawcABWtLAAVrgwAFa9cABWw3AAVsiwAFbKcABWzrAAVtOwAFbVsABW2HAAVt0wAFbfMABW4rAAVuZwAFbosABW6/AAVvAwAFby8ABW9HAAVvewAFb7MABW/rAAVwGwAFcHcABXC7AAVw6wAFcRsABXE7AAVxVwAFcacABXHLAAVx8wAFcicABXJjAAVymwAFcssABXLrAAVzHwAFc1cABXN3AAVzwwAFc+cABXQHAAV0NwAFdGMABXSfAAV0vwAFdPMABXU/AAV1bwAFdc8ABXYbAAV2TwAFdp8ABXbPAAV3AwAFdycABXdzAAV3owAFd9cABXgDAAV4NwAFeFsABXiTAAV41wAFeR8ABXlzAAV5uwAFedMABXn3AAV6NwAFemsABXqzAAV63wAFewsABXs/AAV7XwAFe5MABXvrAAV8HwAFfE8ABXyjAAV81wAFfOsABX0PAAV9LwAFfVsABX2fAAV9zwAFffcABX4vAAV+SwAFfmsABX6bAAV+vwAFfu8ABX8jAAV/UwAFf6cABX/XAAWAAwAFgCMABYBLAAWAdwAFgM8ABYEDAAWBRwAFgWMABYGHAAWBrwAFgesABYITAAWCVwAFgncABYKLAAWCpwAFgtcABYMDAAWDHwAFg0MABYNjAAWDlwAFg8cABYQHAAWERwAFhHMABYSTAAWE2wAFhSMABYVTAAWFlwAFhd8ABYYHAAWGNwAFhpMABYb3AAWHFwAFh2MABYenAAWH6wAFiDcABYh7AAWIywAFiQMABYlDAAWJlwAFid8ABYo7AAWKnwAFi1sABYuXAAWLswAFi8cABYvnAAWMCwAFjDsABYxfAAWMfwAFjK8ABYzTAAWM7wAFjRcABY1DAAWNywAFjfcABY4XAAWOcwAFjqcABY7XAAWPHwAFj18ABY/LAAWQAwAFkCcABZBTAAWQjwAFkNsABZELAAWRPwAFkVsABZFzAAWRkwAFkbMABZHTAAWSDwAFklsABZKXAAWS6wAFkwcABZMjAAWTNwAFk08ABZN/AAWTqwAFk78ABZPPAAWT2wAFk+8ABZQTAAWUHwAFlEcABZRrAAWUqwAFlMcABZULAAWVYwAFlZsABZYHAAWWOwAFlqsABZbfAAWW9wAFlwcABZcnAAWXPwAFl1cABZdbAAWXjwAFl7MABZe7AAWXwwAFl+cABZf3AAWYBwAFmBMABZg7AAWYTwAFmGcABZh7AAWY9wAFmUsABZmXAAWZ1wAFmjsABZqHAAWa6wAFm1cABZunAAWb1wAFnAcABZxPAAWcfwAFnPcABZ1XAAWdiwAFneMABZ47AAWeYwAFnrMABZ73AAWfRwAFn5cABZ+nAAWfxwAFn+MABaAjAAWgUwAFoIMABaCzAAWgzwAFoO8ABaFrAAWhlwAFocMABaHrAAWiMwAFoocABaK3AAWi4wAFoxcABaNPAAWjkwAFo8MABaQHAAWkIwAFpHcABaSnAAWk1wAFpQcABaVPAAWlbwAFpacABaXrAAWmBwAFpjMABaZvAAWmowAFptsABacTAAWnPwAFp18ABad3AAWnrwAFp98ABagPAAWoWwAFqJsABaj3AAWpEwAFqU8ABamLAAWpwwAFqgsABapDAAWqgwAFqq8ABarLAAWq4wAFqxMABas7AAWrUwAFq3cABau3AAWrywAFq+8ABawPAAWsWwAFrH8ABay7AAWs0wAFrQ8ABa03AAWtawAFrZMABa3bAAWuNwAFrmsABa6XAAWuvwAFrvMABa9DAAWvgwAFr88ABbATAAWwTwAFsIMABbCnAAWw2wAFsRcABbFHAAWxhwAFscMABbIfAAWyWwAFso8ABbLzAAWzIwAFs1sABbODAAWzuwAFs/sABbQvAAW0dwAFtLcABbUfAAW1XwAFtZsABbYHAAW2OwAFtoMABbbLAAW25wAFtx8ABbcrAAW3hwAFt+MABbgvAAW4ewAFuJcABbkDAAW5awAFuZ8ABbnvAAW6LwAFulMABbp7AAW6owAFurMABbrPAAW6/wAFuysABbtzAAW7mwAFu8MABbvjAAW8BwAFvDMABbx7AAW8zwAFvN8ABb0fAAW9TwAFvXcABb2fAAW9xwAFve8ABb4XAAW+KwAFvjsABb5LAAW+cwAFvpsABb7DAAW+6wAFvxMABb9LAAW/rwAFv9sABcBPAAXAcwAFwJMABcCjAAXAvwAFwMsABcDbAAXA6wAFwPsABcETAAXBIwAFwU8ABcFrAAXBhwAFwc8ABcIzAAXCiwAFwscABcMTAAXDPwAFw3MABcOTAAXDswAFw88ABcP7AAXEHwAFxFMABcSTAAXE0wAFxQ8ABcVfAAXFlwAFxc8ABcYzAAXGdwAFxqcABcbHAAXHGwAFx18ABcfLAAXH8wAFyCsABchjAAXIuwAFyRMABcmHAAXJqwAFyeMABcoDAAXKLwAFyncABcqnAAXK6wAFyv8ABcsrAAXLvwAFy/cABcwjAAXMTwAFzH8ABcynAAXM1wAFzQsABc0zAAXNZwAFzaMABc3PAAXOGwAFzoMABc7XAAXPAwAFz4MABc/fAAXQQwAF0J8ABdEfAAXRrX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXJfYXN5bmNTdGFyTW92ZU5leHRIZWxwZXJfY29tcGxldGVPbkFzeW5jUmV0dXJuX2NsZWFyQXN5bmNUaHJlYWRTdGFja1RyYWNlX3NldEFzeW5jVGhyZWFkU3RhY2tUcmFjZV9zZXRTY2hlZHVsZUltbWVkaWF0ZUNsb3N1cmVfZW5zdXJlU2NoZWR1bGVJbW1lZGlhdGVfSW50ZXJuYWxMaW5rZWRIYXNoTWFwX3JlaGFzaE9iamVjdHNfVXNlclRhZ1BvaW50ZXJOYXRpdmVUeXBlX05hdGl2ZUludGVnZXJfTmF0aXZlRG91YmxlSW50OEludDE2SW50MzJJbnQ2NFVpbnQ4VWludDE2VWludDMyVWludDY0SW50UHRyRmxvYXREb3VibGVWb2lkTmF0aXZlRnVuY3Rpb25EeW5hbWljTGlicmFyeUNsYXNzSURnZXRJRGNpZEFycmF5Y2lkQXJyYXk9Y2lkRXh0ZXJuYWxPbmVCeXRlU3RyaW5nY2lkRXh0ZXJuYWxPbmVCeXRlU3RyaW5nPWNpZEdyb3dhYmxlT2JqZWN0QXJyYXljaWRHcm93YWJsZU9iamVjdEFycmF5PWNpZEltbXV0YWJsZUFycmF5Y2lkSW1tdXRhYmxlQXJyYXk9Y2lkT25lQnl0ZVN0cmluZ2NpZE9uZUJ5dGVTdHJpbmc9Y2lkVHdvQnl0ZVN0cmluZ2NpZFR3b0J5dGVTdHJpbmc9Y2lkVWludDhBcnJheVZpZXdjaWRVaW50OEFycmF5Vmlldz1fY2xhc3NSYW5nZUNoZWNrX3ByZXBlbmRUeXBlQXJndW1lbnRzX2JvdW5kc0NoZWNrRm9yUGFydGlhbEluc3RhbnRpYXRpb25fcHJpbnRDbG9zdXJlX3ByaW50Q2xvc3VyZT1fQ2FwYWJpbGl0eUltcGxfUmF3UmVjZWl2ZVBvcnRJbXBsX2xvb2t1cEhhbmRsZXJfaGFuZGxlTWVzc2FnZV9TZW5kUG9ydEltcGxzZW5kSXNvbGF0ZVNwYXduRXhjZXB0aW9uX3J1blBlbmRpbmdJbW1lZGlhdGVDYWxsYmFja19nZXRJc29sYXRlU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlX3N0YXJ0TWFpbklzb2xhdGVfZ2V0U3RhcnRNYWluSXNvbGF0ZUZ1bmN0aW9uX3N0YXJ0SXNvbGF0ZV9zZXR1cEhvb2tzX3N0YXRlX3N0YXRlPV9SYW5kb21fTWlycm9yUmVmZXJlbmNlX0J5dGVCdWZmZXJfTmV3X0ludDhMaXN0X1VpbnQ4TGlzdF9VaW50OENsYW1wZWRMaXN0X0ludDE2TGlzdF9VaW50MTZMaXN0X0ludDMyTGlzdF9VaW50MzJMaXN0X0ludDY0TGlzdF9VaW50NjRMaXN0X0Zsb2F0MzJMaXN0X0Zsb2F0NjRMaXN0X0Zsb2F0MzJ4NExpc3RfSW50MzJ4NExpc3RfRmxvYXQ2NHgyTGlzdF9FeHRlcm5hbEludDhBcnJheV9FeHRlcm5hbFVpbnQ4QXJyYXlfRXh0ZXJuYWxVaW50OENsYW1wZWRBcnJheV9FeHRlcm5hbEludDE2QXJyYXlfRXh0ZXJuYWxVaW50MTZBcnJheV9FeHRlcm5hbEludDMyQXJyYXlfRXh0ZXJuYWxVaW50MzJBcnJheV9FeHRlcm5hbEludDY0QXJyYXlfRXh0ZXJuYWxVaW50NjRBcnJheV9FeHRlcm5hbEZsb2F0MzJBcnJheV9FeHRlcm5hbEZsb2F0NjRBcnJheV9FeHRlcm5hbEZsb2F0MzJ4NEFycmF5X0V4dGVybmFsSW50MzJ4NEFycmF5X0V4dGVybmFsRmxvYXQ2NHgyQXJyYXlfRmxvYXQzMng0X0ludDMyeDRfRmxvYXQ2NHgyX0ludDhBcnJheVZpZXdfVWludDhBcnJheVZpZXdfVWludDhDbGFtcGVkQXJyYXlWaWV3X0ludDE2QXJyYXlWaWV3X1VpbnQxNkFycmF5Vmlld19JbnQzMkFycmF5Vmlld19VaW50MzJBcnJheVZpZXdfSW50NjRBcnJheVZpZXdfVWludDY0QXJyYXlWaWV3X0Zsb2F0MzJBcnJheVZpZXdfRmxvYXQ2NEFycmF5Vmlld19GbG9hdDMyeDRBcnJheVZpZXdfSW50MzJ4NEFycmF5Vmlld19GbG9hdDY0eDJBcnJheVZpZXdfQnl0ZURhdGFWaWV3X3ZpZXdCeXRlRGF0YV9wb3J0X3BvcnQ9X2lwX2lwPV9hdXRvU3RhcnRfYXV0b1N0YXJ0PV9hdXRoQ29kZXNEaXNhYmxlZF9hdXRoQ29kZXNEaXNhYmxlZD1fb3JpZ2luQ2hlY2tEaXNhYmxlZF9vcmlnaW5DaGVja0Rpc2FibGVkPV9pc1dpbmRvd3NfaXNXaW5kb3dzPV9pc0Z1Y2hzaWFfaXNGdWNoc2lhPV9zaWduYWxXYXRjaF9zaWduYWxXYXRjaD1fdHJhY2VMb2FkaW5nX3RyYWNlTG9hZGluZz1fZGV0ZXJtaW5pc3RpY19kZXRlcm1pbmlzdGljPWJvb3RfZ2V0UHJpbnRDbG9zdXJlX3NldFdvcmtpbmdEaXJlY3Rvcnlfc2V0UGFja2FnZVJvb3Rfc2V0UGFja2FnZXNNYXBfcmVzb2x2ZVNjcmlwdFVyaV9sb2FkUG9ydF9sb2FkUG9ydD1faXNvbGF0ZUlkX2lzb2xhdGVJZD1fUmFuZG9tQWNjZXNzRmlsZU9wc0ltcGxfTmFtZXNwYWNlSW1wbF9Qcm9jZXNzU3RhcnRTdGF0dXNfZXJyb3JDb2RlX2Vycm9yQ29kZT1fZXJyb3JNZXNzYWdlX2Vycm9yTWVzc2FnZT1fU2VjdXJlRmlsdGVySW1wbFNJWkVTSVpFPUVOQ1JZUFRFRF9TSVpFRU5DUllQVEVEX1NJWkU9YnVmZmVyc2J1ZmZlcnM9T1NFcnJvckRpcmVjdG9yeWZyb21SYXdQYXRoX21heUV4aXRfbWF5RXhpdD1fRW1iZWRkZXJDb25maWdfbWF5U2V0RWNob01vZGVfbWF5U2V0RWNob01vZGU9X21heVNldExpbmVNb2RlX21heVNldExpbmVNb2RlPV9tYXlTbGVlcF9tYXlTbGVlcD1GaWxlRmlsZVN5c3RlbUV4Y2VwdGlvbkxpbmtfTmFtZXNwYWNlX3NldHVwTmFtZXNwYWNlX1BsYXRmb3JtX25hdGl2ZVNjcmlwdF9sb2NhbGVDbG9zdXJlX2xvY2FsZUNsb3N1cmU9WDUwOUNlcnRpZmljYXRlX2RhdGFkYXRhPV9FeHRlcm5hbEJ1ZmZlcnN0YXJ0c3RhcnQ9ZW5kZW5kPVRsc0V4Y2VwdGlvbkhhbmRzaGFrZUV4Y2VwdGlvbkNlcnRpZmljYXRlRXhjZXB0aW9uX2dldFVyaUJhc2VDbG9zdXJlX21ha2VVaW50OExpc3RWaWV3X2dldFdhdGNoU2lnbmFsSW50ZXJuYWxfbWFrZURhdGFncmFtX3NldFN0ZGlvRkRzX2dldFdhaXRGb3JFdmVudF93YWl0Rm9yRXZlbnRDbG9zdXJlX3dhaXRGb3JFdmVudENsb3N1cmU9X0xpc3RfSW1tdXRhYmxlTGlzdF9Eb3VibGVfY3JlYXRlX0Fzc2VydGlvbkVycm9yX3Rocm93TmV3X2V2YWx1YXRlQXNzZXJ0aW9uX1R5cGVFcnJvcl9DYXN0RXJyb3JfSW50ZXJuYWxFcnJvcl9Db21waWxlVGltZUVycm9yX0Nsb3N1cmVfaW5zdGFudGlhdG9yX3R5cGVfYXJndW1lbnRzX2luc3RhbnRpYXRvcl90eXBlX2FyZ3VtZW50cz1fZnVuY3Rpb25fdHlwZV9hcmd1bWVudHNfZnVuY3Rpb25fdHlwZV9hcmd1bWVudHM9X2RlbGF5ZWRfdHlwZV9hcmd1bWVudHNfZGVsYXllZF90eXBlX2FyZ3VtZW50cz1fZnVuY3Rpb25fZnVuY3Rpb249X2NvbnRleHRfY29udGV4dD1faGFzaF9oYXNoPV9Hcm93YWJsZUxpc3RhZGRfSW1tdXRhYmxlTWFwX1NtaV9NaW50X2FsbG9jYXRlSW52b2NhdGlvbk1pcnJvcl9JbnZvY2F0aW9uTWlycm9yX2FsbG9jYXRlSW52b2NhdGlvbk1pcnJvckZvckNsb3N1cmVfTGlicmFyeVByZWZpeF9SZWdFeHBfU3RhY2tUcmFjZV9pbnRlcnBvbGF0ZVNpbmdsZV9TdHJpbmdCYXNlX2ludGVycG9sYXRlX09uZUJ5dGVTdHJpbmdfVHdvQnl0ZVN0cmluZ19FeHRlcm5hbE9uZUJ5dGVTdHJpbmdfRXh0ZXJuYWxUd29CeXRlU3RyaW5nX1R5cGVfVHlwZVJlZl9UeXBlUGFyYW1ldGVyX1dlYWtQcm9wZXJ0eXByYWdtYWJvb2xfc3RhY2tUcmFjZV9zdGFja1RyYWNlPUVycm9yTnVsbFRocm93bkVycm9yQXJndW1lbnRFcnJvcnZhbHVlUmFuZ2VFcnJvcnJhbmdlRmFsbFRocm91Z2hFcnJvckFic3RyYWN0Q2xhc3NJbnN0YW50aWF0aW9uRXJyb3Jfd2l0aFR5cGVOb1N1Y2hNZXRob2RFcnJvclVuc3VwcG9ydGVkRXJyb3JPdXRPZk1lbW9yeUVycm9yU3RhY2tPdmVyZmxvd0Vycm9yQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvckZvcm1hdEV4Y2VwdGlvbkludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbl9mcm9tTGl0ZXJhbExpc3RNYXBOdWxsT2JqZWN0X2hhdmVTYW1lUnVudGltZVR5cGVfaW5zdGFuY2VPZl9zaW1wbGVJbnN0YW5jZU9mX3NpbXBsZUluc3RhbmNlT2ZUcnVlX3NpbXBsZUluc3RhbmNlT2ZGYWxzZW5vU3VjaE1ldGhvZF9jb21wbGV0ZURlZmVycmVkTG9hZHNpZGVudGl0eUhhc2hDb2RlX3VyaUJhc2VDbG9zdXJlX3VyaUJhc2VDbG9zdXJlPW1haW5hcmdzOmFzeW5jX2NvbXBsZXRlcjpyZXR1cm5fdmFsdWU6YXN5bmNfc3RhY2tfdHJhY2U6YXN5bmNfb3BfdGhlbjphc3luY19vcF9lcnJvcjphd2FpdF9qdW1wX3Zhcjphd2FpdF9jdHhfdmFyOmFzeW5jX29wOnJlc3VsdDpleGNlcHRpb246c3RhY2tfdHJhY2VIZWxsbywg5LiW55WMLmNvbXBsZXRlRXJyb3JmdXR1cmVkYXJ0LmFzeW5jVk1MaWJyYXJ5SG9va3NwYXRjaEhhc2hNYXBJdGVyYWJsZUJhc2VDYXN0U3RyZWFtQ2FzdFN0cmVhbVRyYW5zZm9ybWVyRW1wdHlJdGVyYXRvckl0ZXJhYmxlRWxlbWVudEVycm9ycHJpbnRUb1pvbmVwcmludFRvQ29uc29sZVNpbmNlYXN5bmNfZXJyb3IuZGFydGJyb2FkY2FzdF9zdHJlYW1fY29udHJvbGxlci5kYXJ0ZGVmZXJyZWRfbG9hZC5kYXJ0ZnV0dXJlLmRhcnRmdXR1cmVfaW1wbC5kYXJ0c2NoZWR1bGVfbWljcm90YXNrLmRhcnRzdHJlYW0uZGFydHN0cmVhbV9jb250cm9sbGVyLmRhcnRzdHJlYW1faW1wbC5kYXJ0c3RyZWFtX3BpcGUuZGFydHN0cmVhbV90cmFuc2Zvcm1lcnMuZGFydHRpbWVyLmRhcnR6b25lLmRhcnRfU2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlY2FsbGJhY2tfRnV0dXJlT25WYWx1ZVNUX0Z1dHVyZUVycm9yVGVzdGVycm9yX0Z1dHVyZUFjdGlvbl9Bc3luY0NhbGxiYWNrQ29udHJvbGxlckNhbGxiYWNrQ29udHJvbGxlckNhbmNlbENhbGxiYWNrX05vdGlmaWNhdGlvbkhhbmRsZXJfRGF0YUhhbmRsZXJfRG9uZUhhbmRsZXJab25lQ2FsbGJhY2tSWm9uZVVuYXJ5Q2FsbGJhY2thcmdab25lQmluYXJ5Q2FsbGJhY2tUMVQyYXJnMWFyZzJTY2hlZHVsZU1pY3JvdGFza0hhbmRsZXJzZWxmcGFyZW50em9uZWZfQXN5bmNBd2FpdENvbXBsZXRlcl9jb21wbGV0ZXJpc1N5bmNjb21wbGV0ZXRoZW5vbkVycm9yZXN0Y2FsbGlzQ29tcGxldGVkdm06ZW50cnktcG9pbnRfU2NoZWR1bGVJbW1lZGlhdGVfY2xvc3VyZV9Ccm9hZGNhc3RTdWJzY3JpcHRpb25fZXZlbnRTdGF0ZV9uZXh0X3ByZXZpb3VzX2V4cGVjdHNFdmVudGV2ZW50SWRfdG9nZ2xlRXZlbnRJZF9yZW1vdmVBZnRlckZpcmluZ19Ccm9hZGNhc3RTdHJlYW1Db250cm9sbGVyb25MaXN0ZW5vbkNhbmNlbF9maXJzdFN1YnNjcmlwdGlvbl9sYXN0U3Vic2NyaXB0aW9uX2FkZFN0cmVhbVN0YXRlX2RvbmVGdXR1cmVpc0Nsb3NlZCY9PV9oYXNPbmVMaXN0ZW5lcl9pc0VtcHR5X2lzRmlyaW5nX2lzQWRkaW5nU3RyZWFtX21heUFkZEV2ZW50PF9yZW1vdmVMaXN0ZW5lcnN1YnNjcmlwdGlvbl9jb250cm9sbGVyQXR0ZW1wdCB0byBleGVjdXRlIGNvZGUgcmVtb3ZlZCBieSBEYXJ0IEFPVCBjb21waWxlciAoVEZBKXByZXZpb3VzbmV4dF9hZGRFdmVudEVycm9yQ2Fubm90IGFkZCBuZXcgZXZlbnRzIGFmdGVyIGNhbGxpbmcgY2xvc2VDYW5ub3QgYWRkIG5ldyBldmVudHMgd2hpbGUgZG9pbmcgYW4gYWRkU3RyZWFtX3NlbmREYXRhYWRkRXJyb3JzdGFja1RyYWNlcmVwbGFjZW1lbnRlcnJvckNhbGxiYWNrX3NlbmRFcnJvcl9mb3JFYWNoTGlzdGVuZXJhY3Rpb25DYW5ub3QgZmlyZSBuZXcgZXZlbnQuIENvbnRyb2xsZXIgaXMgYWxyZWFkeSBmaXJpbmcgYW4gZXZlbnRpZF58fl9jYWxsT25DYW5jZWxfbWF5Q29tcGxldGVfYXN5bmNDb21wbGV0ZV9TeW5jQnJvYWRjYXN0U3RyZWFtQ29udHJvbGxlcl9hZGRfYWRkRXJyb3JfQXN5bmNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyX2FkZFBlbmRpbmdGdXR1cmVPckZ1dHVyZV9udWxsRnV0dXJlb25WYWx1ZXdoZW5Db21wbGV0ZUNvbXBsZXRlcnN5bmNfQ29tcGxldGVyRnV0dXJlIGFscmVhZHkgY29tcGxldGVkX2NvbXBsZXRlRXJyb3JfQXN5bmNDb21wbGV0ZXJfYXN5bmNDb21wbGV0ZUVycm9yX1N5bmNDb21wbGV0ZXJfY29tcGxldGVfRnV0dXJlTGlzdGVuZXJfbmV4dExpc3RlbmVycmVzdWx0c3RhdGVfem9uZWhhbmRsZXNWYWx1ZWhhbmRsZXNFcnJvcmhhc0Vycm9yVGVzdGhhbmRsZXNDb21wbGV0ZV9vblZhbHVlX29uRXJyb3JfZXJyb3JUZXN0X3doZW5Db21wbGV0ZUFjdGlvbmhhc0Vycm9yQ2FsbGJhY2toYW5kbGVWYWx1ZXNvdXJjZVJlc3VsdHJ1blVuYXJ5bWF0Y2hlc0Vycm9yVGVzdGFzeW5jRXJyb3JoYW5kbGVFcnJvcnJ1bkJpbmFyeWhhbmRsZVdoZW5Db21wbGV0ZXJ1bl9GdXR1cmVfYXdhaXRlcl9yZXN1bHRPckxpc3RlbmVyc2ltbWVkaWF0ZXpvbmVWYWx1ZV9zZXRWYWx1ZV9pc1BlbmRpbmdDb21wbGV0ZV9tYXlBZGRMaXN0ZW5lcjw9X2lzQ2hhaW5lZF9pc0NvbXBsZXRlPj1faGFzRXJyb3Jfc2V0Q2hhaW5lZHNvdXJjZWN1cnJlbnRab25lcmVnaXN0ZXJVbmFyeUNhbGxiYWNrX3RoZW5Ob1pvbmVSZWdpc3RyYXRpb25FX2FkZExpc3RlbmVycmVnaXN0ZXJDYWxsYmFja19zZXRQZW5kaW5nQ29tcGxldGVfY2xlYXJQZW5kaW5nQ29tcGxldGVfZXJyb3JfY2hhaW5Tb3VyY2Vfc2V0RXJyb3JPYmplY3Rfc2V0RXJyb3JfY2xvbmVSZXN1bHRsaXN0ZW5lcnNjaGVkdWxlTWljcm90YXNrX3ByZXBlbmRMaXN0ZW5lcnNsaXN0ZW5lcnNleGlzdGluZ0xpc3RlbmVyc2N1cnNvcl9yZXZlcnNlTGlzdGVuZXJzX3JlbW92ZUxpc3RlbmVyc2N1cnJlbnRwcmV2X2NoYWluRm9yZWlnbkZ1dHVyZXRhcmdldHNfY2hhaW5Db3JlRnV0dXJlX2NvbXBsZXRlV2l0aFZhbHVlX2NoYWluRnV0dXJlX3Byb3BhZ2F0ZVRvTGlzdGVuZXJzaGFzRXJyb3JoYW5kbGVVbmNhdWdodEVycm9ybGlzdGVuZXJIYXNFcnJvcmxpc3RlbmVyVmFsdWVPckVycm9yaW5TYW1lRXJyb3Jab25lb2xkWm9uZWhhbmRsZVdoZW5Db21wbGV0ZUNhbGxiYWNrY29tcGxldGVSZXN1bHRvcmlnaW5hbFNvdXJjZWhhbmRsZVZhbHVlQ2FsbGJhY2tjaGFpblNvdXJjZV9Bc3luY0NhbGxiYWNrRW50cnlfQXN5bmNSdW5fc2NoZWR1bGVJbW1lZGlhdGVNaWNyb3Rhc2tzIGFyZSBub3Qgc3VwcG9ydGVkU3RyZWFtbGlzdGVub25EYXRhb25Eb25lY2FuY2VsT25FcnJvcmxlbmd0aGNvdW50K1N0cmVhbVN1YnNjcmlwdGlvbkV2ZW50U2lua1N0cmVhbUNvbnN1bWVyU3RyZWFtU2lua1N0cmVhbVRyYW5zZm9ybWVyU3RyZWFtVHJhbnNmb3JtZXJCYXNlU3RyZWFtQ29udHJvbGxlcnN0cmVhbW9uUGF1c2VvblJlc3VtZWJyb2FkY2FzdGlzUGF1c2VkaGFzTGlzdGVuZXJldmVudGNsb3NlU3luY2hyb25vdXNTdHJlYW1Db250cm9sbGVyX1N0cmVhbUNvbnRyb2xsZXJMaWZlY3ljbGVfc3Vic2NyaWJlX3JlY29yZFBhdXNlX3JlY29yZFJlc3VtZV9yZWNvcmRDYW5jZWxfU3RyZWFtQ29udHJvbGxlckJhc2VfU3RyZWFtQ29udHJvbGxlcl92YXJEYXRhX2lzQ2FuY2VsZWRfaXNJbml0aWFsU3RhdGVfc3Vic2NyaXB0aW9uX2lzSW5wdXRQYXVzZWRfcGVuZGluZ0V2ZW50c3ZhckRhdGFfZW5zdXJlUGVuZGluZ0V2ZW50c2FkZFN0YXRlX2JhZEV2ZW50U3RhdGVDYW5ub3QgYWRkIGV2ZW50IGFmdGVyIGNsb3NpbmdDYW5ub3QgYWRkIGV2ZW50IHdoaWxlIGFkZGluZyBhIHN0cmVhbV9lbnN1cmVEb25lRnV0dXJlX2Nsb3NlVW5jaGVja2VkX3NlbmREb25lU3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gbGlzdGVuZWQgdG8ucGVuZGluZ0V2ZW50c3Jlc3VtZV9zZXRQZW5kaW5nRXZlbnRzX2d1YXJkQ2FsbGJhY2tjYW5jZWxwYXVzZV9TeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoX0FzeW5jU3RyZWFtQ29udHJvbGxlckRpc3BhdGNoX0FzeW5jU3RyZWFtQ29udHJvbGxlcl9TeW5jU3RyZWFtQ29udHJvbGxlcl9jbG9zZV9Db250cm9sbGVyU3RyZWFtX2NyZWF0ZVN1YnNjcmlwdGlvbmhhc2hDb2Rlb3RoZXJfQ29udHJvbGxlclN1YnNjcmlwdGlvbl9vbkNhbmNlbF9vblBhdXNlX29uUmVzdW1lX0FkZFN0cmVhbVN0YXRlX1N0cmVhbUNvbnRyb2xsZXJBZGRTdHJlYW1TdGF0ZV9FdmVudFNpbmtfRXZlbnREaXNwYXRjaF9CdWZmZXJpbmdTdHJlYW1TdWJzY3JpcHRpb25fb25EYXRhX29uRG9uZV9jYW5jZWxGdXR1cmVfcGVuZGluZ2lzRW1wdHlzY2hlZHVsZWhhbmRsZURhdGFyZWdpc3RlckJpbmFyeUNhbGxiYWNraGFuZGxlRXJyb3IgY2FsbGJhY2sgbXVzdCB0YWtlIGVpdGhlciBhbiBPYmplY3QgKHRoZSBlcnJvciksIG9yIGJvdGggYW4gT2JqZWN0ICh0aGUgZXJyb3IpIGFuZCBhIFN0YWNrVHJhY2UuaGFuZGxlRG9uZV9pc0Nsb3NlZF93YWl0c0ZvckNhbmNlbF9pbkNhbGxiYWNrX2hhc1BlbmRpbmdfaXNQYXVzZWRfY2FuRmlyZV9tYXlSZXN1bWVJbnB1dF9jYW5jZWxPbkVycm9yX2NhbmNlbGNhbmNlbFNjaGVkdWxlcGVuZGluZ3dhc0lucHV0UGF1c2VkcnVuVW5hcnlHdWFyZGVkX2NoZWNrU3RhdGVzZW5kRXJyb3JydW5CaW5hcnlHdWFyZGVkc2VuZERvbmVydW5HdWFyZGVkaXNJbnB1dFBhdXNlZF9TdHJlYW1JbXBsX2dlbmVyYXRvcl9vbkxpc3Rlbl9EZWxheWVkRXZlbnRwZXJmb3JtZGlzcGF0Y2hfRGVsYXllZERhdGFfRGVsYXllZEVycm9yX0RlbGF5ZWREb25lTm8gZXZlbnRzIGFmdGVyIGEgZG9uZS5fUGVuZGluZ0V2ZW50c2lzU2NoZWR1bGVkX2V2ZW50U2NoZWR1bGVkb2xkU3RhdGVoYW5kbGVOZXh0X1N0cmVhbUltcGxFdmVudHNmaXJzdFBlbmRpbmdFdmVudGxhc3RQZW5kaW5nRXZlbnRUaW1lckFzeW5jRXJyb3J0b1N0cmluZ19ab25lRnVuY3Rpb25mdW5jdGlvblpvbmVEZWxlZ2F0ZVpvbmVfY3VycmVudGVycm9yWm9uZW90aGVyWm9uZWFyZ3VtZW50YXJndW1lbnQxYXJndW1lbnQyYmluZENhbGxiYWNrYmluZENhbGxiYWNrR3VhcmRlZGJpbmRVbmFyeUNhbGxiYWNrR3VhcmRlZF9lbnRlcl9sZWF2ZVtda2V5X1pvbmVfc2NoZWR1bGVNaWNyb3Rhc2tfUm9vdFpvbmVfbmV4dENhbGxiYWNrX2xhc3RDYWxsYmFja19sYXN0UHJpb3JpdHlDYWxsYmFja19pc0luQ2FsbGJhY2tMb29wX2FzeW5jVGhlbldyYXBwZXJIZWxwZXJjb250aW51YXRpb254X2FzeW5jRXJyb3JXcmFwcGVySGVscGVyX2F3YWl0SGVscGVyb2JqZWN0dGhlbkNhbGxiYWNrYXdhaXRlcmNvbXBsZXRlcl9hc3luY1N0YWNrVHJhY2VIZWxwZXJTdGFja1RyYWNlX2FzeW5jU3RhY2tUcmFjZUhlbHBlcmFzeW5jX29wU3RhY2tUcmFjZV9jbGVhckFzeW5jVGhyZWFkU3RhY2tUcmFjZVN0YWNrVHJhY2Vfc2V0QXN5bmNUaHJlYWRTdGFja1RyYWNlX21vdmVOZXh0RGVidWdnZXJTdGVwQ2hlY2tBc3luY1N0YXJNb3ZlTmV4dF9kZWJ1Z2dlclN0ZXBDaGVja2Nsb3N1cmVfbm9uTnVsbEVycm9yX3JlZ2lzdGVyRXJyb3JIYW5kbGVyZXJyb3JIYW5kbGVyRXJyb3IgaGFuZGxlciBtdXN0IGFjY2VwdCBvbmUgT2JqZWN0IG9yIG9uZSBPYmplY3QgYW5kIGEgU3RhY2tUcmFjZSBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm4gYSBhIHZhbGlkIHJlc3VsdF9taWNyb3Rhc2tMb29wZW50cnlfc3RhcnRNaWNyb3Rhc2tMb29wX3NjaGVkdWxlQXN5bmNDYWxsYmFja25ld0VudHJ5X3NjaGVkdWxlUHJpb3JpdHlBc3luY0NhbGxiYWNraW1wbGVtZW50YXRpb25fcnVuR3VhcmRlZG5vdGlmaWNhdGlvbkhhbmRsZXJfbnVsbERhdGFIYW5kbGVyX251bGxFcnJvckhhbmRsZXJfbnVsbERvbmVIYW5kbGVyX3Jvb3RIYW5kbGVVbmNhdWdodEVycm9yX3JldGhyb3dBc3luY19yZXRocm93X3Jvb3RSdW5vbGRfcm9vdFJ1blVuYXJ5X3Jvb3RSdW5CaW5hcnlfcm9vdFNjaGVkdWxlTWljcm90YXNraGFzRXJyb3JIYW5kbGVyZGFydC5jb2xsZWN0aW9uaW50ZXJuYWxVaW50MzJMaXN0U3ltYm9sUmFuZG9tY29sbGVjdGlvbnMuZGFydGhhc2hfbWFwLmRhcnRoYXNoX3NldC5kYXJ0aXRlcmFibGUuZGFydGl0ZXJhdG9yLmRhcnRsaW5rZWRfaGFzaF9tYXAuZGFydGxpbmtlZF9oYXNoX3NldC5kYXJ0bGlua2VkX2xpc3QuZGFydGxpc3QuZGFydG1hcHMuZGFydHF1ZXVlLmRhcnRzZXQuZGFydHNwbGF5X3RyZWUuZGFydF9FcXVhbGl0eUthYl9IYXNoZXJfUHJlZGljYXRlX0hhc2hNYXBWX2VsZW1lbnRDb3VudF9idWNrZXRzX21vZGlmaWNhdGlvbkNvdW50dmFsdWVzY29udGFpbnNLZXlidWNrZXRzaW5kZXgtY29udGFpbnNWYWx1ZWlbXT1fYWRkRW50cnlmb3JFYWNoc3RhbXByZW1vdmVfcmVtb3ZlRW50cnlwcmV2aW91c0luQnVja2V0YnVja2V0SW5kZXhuZXdFbGVtZW50czw8Pl9yZXNpemVvbGRCdWNrZXRzb2xkTGVuZ3RobmV3TGVuZ3RobmV3QnVja2V0c19DdXN0b21IYXNoTWFwX2VxdWFsc19oYXNoQ29kZV92YWxpZEtleXZhbGlkS2V5dGVzdF9JZGVudGl0eUhhc2hNYXBfSGFzaE1hcEVudHJ5X0hhc2hNYXBJdGVyYWJsZV9tYXBfSGFzaE1hcFZhbHVlSXRlcmFibGVtYXBpdGVyYXRvcmNvbnRhaW5zX0hhc2hNYXBJdGVyYXRvcl9zdGFtcF9pbmRleF9lbnRyeW1vdmVOZXh0X0hhc2hNYXBWYWx1ZUl0ZXJhdG9yX0hhc2hGaWVsZEJhc2VfaGFzaE1hc2tfZGF0YV91c2VkRGF0YV9kZWxldGVkS2V5c2RhdGFTaXplX0hhc2hWTUJhc2V2bTpleGFjdC1yZXN1bHQtdHlwZWRhcnQ6dHlwZWRfZGF0YSNfVWludDMyTGlzdExpbmtlZEhhc2hNYXBfZ2V0SW5kZXhMaW5rZWRIYXNoTWFwX3NldEluZGV4ZGFydDpjb3JlI19TbWlMaW5rZWRIYXNoTWFwX2dldEhhc2hNYXNrTGlua2VkSGFzaE1hcF9zZXRIYXNoTWFza2RhcnQ6Y29yZSNfTGlzdExpbmtlZEhhc2hNYXBfZ2V0RGF0YUxpbmtlZEhhc2hNYXBfc2V0RGF0YUxpbmtlZEhhc2hNYXBfZ2V0VXNlZERhdGFMaW5rZWRIYXNoTWFwX3NldFVzZWREYXRhTGlua2VkSGFzaE1hcF9nZXREZWxldGVkS2V5c0xpbmtlZEhhc2hNYXBfc2V0RGVsZXRlZEtleXNfSGFzaEJhc2VfaW5kZXhTaXplVG9IYXNoTWFza2luZGV4U2l6ZWluZGV4Qml0c2JpdExlbmd0aF9oYXNoUGF0dGVybmZ1bGxIYXNoaGFzaE1hc2tzaXplbWFza2VkSGFzaD4+Kl9maXJzdFByb2Jlc2l6ZU1hc2tfbmV4dFByb2JlX2lzRGVsZXRlZGtleU9yVmFsdWVfY2hlY2tTdW1faXNNb2RpZmllZFNpbmNlb2xkRGF0YW9sZENoZWNrU3VtX09wZXJhdG9yRXF1YWxzQW5kSGFzaENvZGVfSWRlbnRpY2FsQW5kSWRlbnRpdHlIYXNoQ29kZV9fSW50ZXJuYWxMaW5rZWRIYXNoTWFwJl9IYXNoVk1CYXNlJk1hcE1peGluX19JbnRlcm5hbExpbmtlZEhhc2hNYXAmX0hhc2hWTUJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbl9yZWhhc2hfaW5pdG9sZFVzZWRfcmVnZW5lcmF0ZUluZGV4dG1wVXNlZF9pbnNlcnRoYXNoUGF0dGVybl9maW5kVmFsdWVPckluc2VydFBvaW50bWF4RW50cmllc2ZpcnN0RGVsZXRlZHVuYXJ5LXBhaXJkX2dldFZhbHVlT3JEYXRhdmtpa2V5c3ZpX19JbnRlcm5hbExpbmtlZEhhc2hNYXAmX0hhc2hWTUJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbiZfSGFzaEJhc2VfX0ludGVybmFsTGlua2VkSGFzaE1hcCZfSGFzaFZNQmFzZSZNYXBNaXhpbiZfTGlua2VkSGFzaE1hcE1peGluJl9IYXNoQmFzZSZfT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZWUxZTJfTGlua2VkSGFzaE1hcE1peGluX19Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwJl9IYXNoRmllbGRCYXNlJk1hcE1peGluX19Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoTWFwJl9IYXNoRmllbGRCYXNlJk1hcE1peGluJl9MaW5rZWRIYXNoTWFwTWl4aW5fX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hNYXAmX0hhc2hGaWVsZEJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbiZfSGFzaEJhc2VfX0NvbXBhY3RMaW5rZWRJZGVudGl0eUhhc2hNYXAmX0hhc2hGaWVsZEJhc2UmTWFwTWl4aW4mX0xpbmtlZEhhc2hNYXBNaXhpbiZfSGFzaEJhc2UmX0lkZW50aWNhbEFuZElkZW50aXR5SGFzaENvZGVfQ29tcGFjdExpbmtlZElkZW50aXR5SGFzaE1hcF9fQ29tcGFjdExpbmtlZEN1c3RvbUhhc2hNYXAmX0hhc2hGaWVsZEJhc2UmTWFwTWl4aW5fX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoTWFwJl9IYXNoRmllbGRCYXNlJk1hcE1peGluJl9MaW5rZWRIYXNoTWFwTWl4aW5fX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoTWFwJl9IYXNoRmllbGRCYXNlJk1hcE1peGluJl9MaW5rZWRIYXNoTWFwTWl4aW4mX0hhc2hCYXNlX0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoTWFwX2VxdWFsaXR5X2hhc2hlcm9fQ29tcGFjdEl0ZXJhYmxlX3RhYmxlX2xlbl9vZmZzZXRfc3RlcF9Db21wYWN0SXRlcmF0b3J0YWJsZWVxdWFsc2lzVmFsaWRLZXlpdGVyYWJsZVRvU2hvcnRTdHJpbmdpdGVyYWJsZWxlZnREZWxpbWl0ZXIocmlnaHREZWxpbWl0ZXIpKC4uLikuLi5wYXJ0c2xhc3RyZW1vdmVMYXN0d3JpdGVBbGwsIHdyaXRlaXRlcmFibGVUb0Z1bGxTdHJpbmdidWZmZXJMaW5rZWRIYXNoTWFwZnJvbWtMaW5rZWRMaXN0X2xlbmd0aF9maXJzdGFkZEZpcnN0X2luc2VydEJlZm9yZXVwZGF0ZUZpcnN0X2xpc3RfdW5saW5rZmlyc3RObyBzdWNoIGVsZW1lbnRsaXN0TGlua2VkTGlzdEVudHJ5IGlzIGFscmVhZHkgaW4gYSBMaW5rZWRMaXN0cHJlZGVjZXNzb3JzdWNjZXNzb3JfTGlua2VkTGlzdEl0ZXJhdG9yX3Zpc2l0ZWRGaXJzdExpbmtlZExpc3RFbnRyeXVubGlua19MaXN0QmFzZSZPYmplY3QmTGlzdE1peGluZWxlbWVudEF0aXNOb3RFbXB0eXNraXB0YWtlZmlsbFJhbmdlZmlsbFtdTGlzdEJhc2VsaXN0VG9TdHJpbmdMaXN0TWl4aW5NYXBCYXNlbWFwVG9TdHJpbmdtey4uLn17OiB9TWFwTWl4aW5fVW5tb2RpZmlhYmxlTWFwTWl4aW5NYXBWaWV3X1VubW9kaWZpYWJsZU1hcFZpZXcmTWFwVmlldyZfVW5tb2RpZmlhYmxlTWFwTWl4aW5DYW5ub3QgbW9kaWZ5IHVubW9kaWZpYWJsZSBtYXBVbm1vZGlmaWFibGVNYXBWaWV3X1R5cGVUZXN0X3RvU3RyaW5nVmlzaXRpbmdvYmplY3RzX2RlZmF1bHRFcXVhbHNfZGVmYXVsdEhhc2hDb2RlX2lzVG9TdHJpbmdWaXNpdGluZ19pdGVyYWJsZVBhcnRzVG9TdHJpbmdzaXRwZW51bHRpbWF0ZVN0cmluZ3VsdGltYXRlU3RyaW5ncGVudWx0aW1hdGV1bHRpbWF0ZWVsaXNpb25kYXJ0LmNvbnZlcnRQT1dFUlNfT0ZfVEVOVWludDhMaXN0VWludDE2TGlzdENhc3RDb252ZXJ0ZXJwYXJzZUhleEJ5dGVhc2NpaS5kYXJ0YmFzZTY0LmRhcnRieXRlX2NvbnZlcnNpb24uZGFydGNodW5rZWRfY29udmVyc2lvbi5kYXJ0Y29kZWMuZGFydGNvbnZlcnRlci5kYXJ0ZW5jb2RpbmcuZGFydGh0bWxfZXNjYXBlLmRhcnRqc29uLmRhcnRsYXRpbjEuZGFydGxpbmVfc3BsaXR0ZXIuZGFydHN0cmluZ19jb252ZXJzaW9uLmRhcnR1dGYuZGFydEFzY2lpQ29kZWNfYWxsb3dJbnZhbGlkQmFzZTY0Q29kZWNfZW5jb2Rlcm5vcm1hbGl6ZXNsaWNlU3RhcnRhbHBoYWJldEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9pbnZlcnNlQWxwaGFiZXRmaXJzdFBhZGRpbmdmaXJzdFBhZGRpbmdTb3VyY2VJbmRleHBhZGRpbmdDb3VudHNsaWNlRW5kY2hhcmNvZGVVbml0QXRvcmlnaW5hbENoYXJzdWJzdHJpbmd3cml0ZUNoYXJDb2RlSW52YWxpZCBiYXNlNjQgZGF0YWVuZExlbmd0aCVJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggPXJlcGxhY2VSYW5nZV9jaGVja1BhZGRpbmdzb3VyY2VJbmRleHNvdXJjZUVuZEludmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiBmb3VyLCBpcyBJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScgbm90IGF0IHRoZSBlbmRJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCBtb3JlIHRoYW4gdHdvICc9JyBjaGFyYWN0ZXJzQmFzZTY0RW5jb2Rlcl91cmxTYWZlX0Jhc2U2NERlY29kZXJfaW52ZXJzZUFscGhhYmV0Q29kZWNlbmNvZGVpbnB1dGVuY29kZXJjb252ZXJ0Q29udmVydGVyRW5jb2RpbmdKc29uVW5zdXBwb3J0ZWRPYmplY3RFcnJvcnVuc3VwcG9ydGVkT2JqZWN0Y2F1c2VwYXJ0aWFsUmVzdWx0c2FmZVN0cmluZ3ByZWZpeENvbnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkOkNvbnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IEpzb25DeWNsaWNFcnJvckN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lmeUpzb25Db2RlY19yZXZpdmVyX3RvRW5jb2RhYmxldG9FbmNvZGFibGVKc29uRW5jb2RlcmluZGVudF9Kc29uU3RyaW5naWZpZXJfc2Vlbl9wYXJ0aWFsUmVzdWx0d3JpdGVTdHJpbmdjaGFyYWN0ZXJzd3JpdGVTdHJpbmdTbGljZWNoYXJDb2Rld3JpdGVOdW1iZXJudW1iZXJoZXhEaWdpdHdyaXRlU3RyaW5nQ29udGVudG9mZnNldF9jaGVja0N5Y2xlX3JlbW92ZVNlZW53cml0ZU9iamVjdHdyaXRlSnNvblZhbHVlY3VzdG9tSnNvbmlzRmluaXRldHJ1ZWZhbHNlbnVsbCJ3cml0ZUxpc3RzdWNjZXNzd3JpdGVNYXAse31rZXlWYWx1ZUxpc3RhbGxTdHJpbmdLZXlzc2VwYXJhdG9yLCIiOl9Kc29uUHJldHR5UHJpbnRNaXhpbl9pbmRlbnRMZXZlbHdyaXRlSW5kZW50YXRpb25pbmRlbnRMZXZlbF9Kc29uU3RyaW5nU3RyaW5naWZpZXJfc2lua3N0cmluZ2lmeW91dHB1dHByaW50T25zdHJpbmdpZmllcnN0cmluZ19fSnNvblN0cmluZ1N0cmluZ2lmaWVyUHJldHR5Jl9Kc29uU3RyaW5nU3RyaW5naWZpZXImX0pzb25QcmV0dHlQcmludE1peGluWwosCgp7CiI6IF9Kc29uU3RyaW5nU3RyaW5naWZpZXJQcmV0dHlfaW5kZW50c2lua0xhdGluMUNvZGVjVXRmOENvZGVjX2FsbG93TWFsZm9ybWVkZGVjb2RlY29kZVVuaXRzYWxsb3dNYWxmb3JtZWRVdGY4RW5jb2RlcnN0cmluZ0xlbmd0aGVuZFBvc2l0aW9uX2ZpbGxCdWZmZXJsYXN0Q29kZVVuaXR3YXNDb21iaW5lZF93cml0ZVN1cnJvZ2F0ZV9idWZmZXJzdWJsaXN0X2J1ZmZlckluZGV4X1V0ZjhFbmNvZGVyX2NhcnJ5d2l0aEJ1ZmZlclNpemVidWZmZXJTaXplX2NyZWF0ZUJ1ZmZlcmxlYWRpbmdTdXJyb2dhdGVuZXh0Q29kZVVuaXRydW5lc3Ryc3RyaW5nSW5kZXhjb2RlVW5pdFV0ZjhEZWNvZGVyb25lQnl0ZXNpc0ZpcnN0Q2hhcmFjdGVyZmlyc3RQYXJ0ZGVjb2Rlcl9pc0ZpcnN0Q2hhcmFjdGVyZmx1c2hfY29udmVydEludGVyY2VwdGVkX1V0ZjhEZWNvZGVyX3N0cmluZ1NpbmtfdmFsdWVfZXhwZWN0ZWRVbml0c19leHRyYVVuaXRzaGFzUGFydGlhbElucHV0VW5maW5pc2hlZCBVVEYtOCBvY3RldCBzZXF1ZW5jZXN0YXJ0SW5kZXhlbmRJbmRleGV4cGVjdGVkVW5pdHNleHRyYVVuaXRzdW5pdEJhZCBVVEYtOCBlbmNvZGluZyAweHRvUmFkaXhTdHJpbmdPdmVybG9uZyBlbmNvZGluZyBvZiAweENoYXJhY3RlciBvdXRzaWRlIHZhbGlkIFVuaWNvZGUgcmFuZ2U6IDB4TmVnYXRpdmUgVVRGLTggY29kZSB1bml0OiAtMHhfZGVmYXVsdFRvRW5jb2RhYmxldG9Kc29uX2lzTGVhZFN1cnJvZ2F0ZV9pc1RhaWxTdXJyb2dhdGVfY29tYmluZVN1cnJvZ2F0ZVBhaXJsZWFkdGFpbF9zY2FuT25lQnl0ZUNoYXJhY3RlcnN1bml0c3RvZGFydC5kZXZlbG9wZXJTZW5kUG9ydElzb2xhdGVSYXdSZWNlaXZlUG9ydGV4dGVuc2lvbi5kYXJ0cHJvZmlsZXIuZGFydHNlcnZpY2UuZGFydHRpbWVsaW5lLmRhcnRTZXJ2aWNlRXh0ZW5zaW9uSGFuZGxlcm1ldGhvZHBhcmFtZXRlcnNTZXJ2aWNlRXh0ZW5zaW9uUmVzcG9uc2VfcmVzdWx0X2Vycm9yRGV0YWlsVXNlclRhZ3JlZ2lzdGVyRXh0ZW5zaW9uaGFuZGxlcnN0YXJ0c1dpdGhleHQuTXVzdCBiZWdpbiB3aXRoIGV4dC5FeHRlbnNpb24gYWxyZWFkeSByZWdpc3RlcmVkOiBfbG9va3VwRXh0ZW5zaW9uRGV2ZWxvcGVyX2xvb2t1cEV4dGVuc2lvbl9yZWdpc3RlckV4dGVuc2lvbkRldmVsb3Blcl9yZWdpc3RlckV4dGVuc2lvbmRhcnQuZmZpbmF0aXZlX3R5cGUuZGFydGFubm90YXRpb25zLmRhcnRkeW5hbWljX2xpYnJhcnkuZGFydGFkZHJlc3NGZmlfYWRkcmVzc1Vuc2l6ZWRnZXRIYW5kbGVGZmlfZGxfZ2V0SGFuZGxlZGFydC5faW50ZXJuYWxJbnQzMkxpc3Rjb3JlYXN5bmNfY2FzdC5kYXJ0Y2FzdC5kYXJ0cHJpbnQuZGFydHNvcnQuZGFydHN5bWJvbC5kYXJ0X1ByaW50Q2xvc3VyZWxpbmVfVHJhbnNmb3JtYXRpb250aW1lckZhY3RvcnlldmVudEhhbmRsZXJTZW5kRGF0YXRpbWVyTWlsbGlzZWNvbmRDbG9ja3Jlc291cmNlUmVhZEFzQnl0ZXNwYWNrYWdlUm9vdFN0cmluZ3BhY2thZ2VDb25maWdTdHJpbmdwYWNrYWdlUm9vdFVyaUZ1dHVyZXBhY2thZ2VDb25maWdVcmlGdXR1cmVyZXNvbHZlUGFja2FnZVVyaUZ1dHVyZV9jb21wdXRlU2NyaXB0VXJpX2NhY2hlZFNjcmlwdHBsYXRmb3JtU2NyaXB0TGlzdHNjb3B5c3Jjc3JjU3RhcnRkc3Rkc3RTdGFydGpDbGFzc0lEX2dldElEX1BhdGNoQ29kZVVuaXRzRXh0ZXJuYWxOYW1lbmFtZTIuMnZlcnNpb25FZmZpY2llbnRMZW5ndGhJdGVyYWJsZUxpc3RJdGVyYWJsZWpvaW5TdWJMaXN0SXRlcmFibGVfaXRlcmFibGVfc3RhcnRfZW5kT3JMZW5ndGhfZW5kSW5kZXhfc3RhcnRJbmRleHJlYWxJbmRleG5ld1N0YXJ0dG9MaXN0Z3Jvd2FibGVMaXN0SXRlcmF0b3JNYXBwZWRJdGVyYWJsZV9mRWZmaWNpZW50TGVuZ3RoTWFwcGVkSXRlcmFibGVNYXBwZWRJdGVyYXRvcl9pdGVyYXRvck1hcHBlZExpc3RJdGVyYWJsZV9zb3VyY2VFbXB0eUl0ZXJhYmxlbm9FbGVtZW50Tm8gZWxlbWVudHRvb0Zld1RvbyBmZXcgZWxlbWVudHNGaXhlZExlbmd0aExpc3RNaXhpblVubW9kaWZpYWJsZUxpc3RNaXhpbkZpeGVkTGVuZ3RoTGlzdEJhc2VDYW5ub3QgYWRkIHRvIGEgZml4ZWQtbGVuZ3RoIGxpc3RVbm1vZGlmaWFibGVMaXN0QmFzZUNhbm5vdCBtb2RpZnkgYW4gdW5tb2RpZmlhYmxlIGxpc3RDYW5ub3QgYWRkIHRvIGFuIHVubW9kaWZpYWJsZSBsaXN0ZmlsbFZhbHVlX25hbWV1bnZhbGlkYXRlZFN5bWJvbCgiIilnZXROYW1lc3ltYm9sY29tcHV0ZVVubWFuZ2xlZE5hbWVhZGRfc2V0dGVyX3N1ZmZpeHBvczpALmlzNjRCaXRfaW5xdWlyZUlzNjRCaXRJbnRlcm5hbF9pbnF1aXJlSXM2NEJpdGNpZGxvd2VyTGltaXR1cHBlckxpbWl0SW50ZXJuYWxfcHJlcGVuZFR5cGVBcmd1bWVudHNmdW5jdGlvblR5cGVBcmd1bWVudHNwYXJlbnRUeXBlQXJndW1lbnRzcGFyZW50TGVudG90YWxMZW5JbnRlcm5hbF9ib3VuZHNDaGVja0ZvclBhcnRpYWxJbnN0YW50aWF0aW9udHlwZUFyZ3N1bnNhZmVDYXN0SW50ZXJuYWxfdW5zYWZlQ2FzdF91bnN1cHBvcnRlZFByaW50J3ByaW50JyBpcyBub3Qgc3VwcG9ydGVkaGV4RGlnaXRWYWx1ZWRpZ2l0bGV0dGVyZGlnaXQxZGlnaXQybWFrZUxpc3RGaXhlZExlbmd0aEludGVybmFsX21ha2VMaXN0Rml4ZWRMZW5ndGhncm93YWJsZUxpc3RtYWtlRml4ZWRMaXN0VW5tb2RpZmlhYmxlSW50ZXJuYWxfbWFrZUZpeGVkTGlzdFVubW9kaWZpYWJsZWZpeGVkTGVuZ3RoTGlzdGRhcnQuaXNvbGF0ZWNhcGFiaWxpdHkuZGFydF9JbW1lZGlhdGVDYWxsYmFja19VbmFyeUZ1bmN0aW9uX0JpbmFyeUZ1bmN0aW9ubWVzc2FnZV9nZXRfaGFzaGNvZGVDYXBhYmlsaXR5SW1wbF9lcXVhbHNDYXBhYmlsaXR5SW1wbF9nZXRfaGFzaGNvZGVfaGFuZGxlck1hcFJhd1JlY2VpdmVQb3J0SW1wbF9mYWN0b3J5X2Nsb3NlSW50ZXJuYWxzZW5kUG9ydF9nZXRfc2VuZHBvcnRfZ2V0X2lkUmF3UmVjZWl2ZVBvcnRJbXBsX2dldF9pZFJhd1JlY2VpdmVQb3J0SW1wbF9nZXRfc2VuZHBvcnRSYXdSZWNlaXZlUG9ydEltcGxfY2xvc2VJbnRlcm5hbF9pbml0SGFuZGxlck1hcHRlbXBNYXBfc2VuZEludGVybmFsU2VuZFBvcnRJbXBsX2dldF9pZFNlbmRQb3J0SW1wbF9nZXRfaGFzaGNvZGVTZW5kUG9ydEltcGxfc2VuZEludGVybmFsX19UaW1lckhlYXBfdXNlZGluaXRTaXplaXNGaXJzdHRpbWVyX2luZGV4T3JOZXh0X2J1YmJsZVVwcmVtb3ZlRmlyc3RfY29tcGFyZVRvX2J1YmJsZURvd25uZXdMaXN0c2V0UmFuZ2VfcGFyZW50X3N3YXBsZWZ0SW5kZXhyaWdodEluZGV4bmV3ZXN0c2Vjb25kdG1wX3BhcmVudEluZGV4fi9fbGVmdENoaWxkSW5kZXhfcmlnaHRDaGlsZEluZGV4X1RpbWVyX2hlYXBfZmlyc3RaZXJvVGltZXJfbGFzdFplcm9UaW1lcl9pZENvdW50X3JlY2VpdmVQb3J0X3NlbmRQb3J0X3NjaGVkdWxlZFdha2V1cFRpbWVfaGFuZGxpbmdDYWxsYmFja3NfY2FsbGJhY2tfd2FrZXVwVGltZV9taWxsaVNlY29uZHNfcmVwZWF0aW5nX2lkX3RpY2tfaW50ZXJuYWxfbmV4dElkX2NyZWF0ZVRpbWVybWlsbGlTZWNvbmRzcmVwZWF0aW5nbm93d2FrZXVwVGltZV9lbnF1ZXVlcGVyaW9kaWNjX2FkdmFuY2VXYWtldXBUaW1lX25vdGlmeVplcm9IYW5kbGVyX3F1ZXVlRnJvbVplcm9FdmVudHBlbmRpbmdUaW1lcnNfbm90aWZ5RXZlbnRIYW5kbGVyX3F1ZXVlRnJvbVRpbWVvdXRFdmVudGN1cnJlbnRUaW1lX3J1blRpbWVyc21zb3ZlcmR1ZW1pc3NlZFRpY2tzaW1tZWRpYXRlQ2FsbGJhY2ttc2dfc2NoZWR1bGVXYWtldXBfY2FuY2VsV2FrZXVwX2NyZWF0ZVRpbWVySGFuZGxlcl9zaHV0ZG93blRpbWVySGFuZGxlcl9mYWN0b3J5SXNvbGF0ZVNwYXduRXhjZXB0aW9uOiBfY3VycmVudElzb2xhdGVjb250cm9sUG9ydHBhdXNlQ2FwYWJpbGl0eXRlcm1pbmF0ZUNhcGFiaWxpdHlfZ2V0Q3VycmVudElzb2xhdGVwb3J0QW5kQ2FwYWJpbGl0aWVzX2dldFBvcnRBbmRDYXBhYmlsaXRpZXNPZkN1cnJlbnRJc29sYXRlSXNvbGF0ZV9nZXRQb3J0QW5kQ2FwYWJpbGl0aWVzT2ZDdXJyZW50SXNvbGF0ZW5ld0hhbmRsZXJDYXBhYmlsaXR5X3BlbmRpbmdJbW1lZGlhdGVDYWxsYmFja19pc29sYXRlU2NoZWR1bGVJbW1lZGlhdGVfcmVtb3ZlUGVuZGluZ0ltbWVkaWF0ZUNhbGxiYWNrZW50cnlQb2ludHBhcmVudFBvcnRpc1NwYXduVXJpY2FwYWJpbGl0aWVzcmVhZHlNZXNzYWdlcG9ydGRhcnQubWF0aGplbmtpbnNfc21pX2hhc2guZGFydHBvaW50LmRhcnRyYW5kb20uZGFydHJlY3RhbmdsZS5kYXJ0X3Bybmdfd2l0aFN0YXRlX25leHRTdGF0ZVJhbmRvbV9uZXh0U3RhdGVuZXh0SW50bWF4NDI5NDk2NzI5Nk11c3QgYmUgcG9zaXRpdmUgYW5kIDw9IDJeMzJybmQzMl9zZXR1cFNlZWRSYW5kb21fc2V0dXBTZWVkc2VlZF9pbml0aWFsU2VlZFJhbmRvbV9pbml0aWFsU2VlZF9uZXh0U2VlZG1pbm5kYXJ0Lm1pcnJvcnNVbm1vZGlmaWFibGVMaXN0Vmlld01pcnJvclJlZmVyZW5jZV9lcXVhbHNkYXJ0LnByb2ZpbGVyRGFydCBTREsgMS4xMmdldEN1cnJlbnRUYWdDb3VudGVyR2F1Z2VNZXRyaWNNZXRyaWNzZGFydC50eXBlZF9kYXRhRXhwYW5kSXRlcmFibGVGb2xsb3dlZEJ5SXRlcmFibGVMaXN0TWFwVmlld1JldmVyc2VkTGlzdEl0ZXJhYmxlU2tpcFdoaWxlSXRlcmFibGVTb3J0VGFrZVdoaWxlSXRlcmFibGVXaGVyZUl0ZXJhYmxlV2hlcmVUeXBlSXRlcmFibGV1bm1vZGlmaWFibGVfdHlwZWRfZGF0YS5kYXJ0X1R5cGVkTGlzdEJhc2VlbGVtZW50U2l6ZUluQnl0ZXNvZmZzZXRJbkJ5dGVzX3NldFJhbmdlVHlwZWREYXRhX3NldFJhbmdlc3RhcnRJbkJ5dGVzbGVuZ3RoSW5CeXRlc3N0YXJ0RnJvbUluQnl0ZXN0b0NpZGZyb21DaWRfSW50TGlzdE1peGluX2NyZWF0ZUxpc3Rza2lwQ291bnRfRG91YmxlTGlzdE1peGluX0Zsb2F0MzJ4NExpc3RNaXhpbl9JbnQzMng0TGlzdE1peGluX0Zsb2F0NjR4Mkxpc3RNaXhpbmFzVWludDhMaXN0X1R5cGVkTGlzdFR5cGVkRGF0YV9sZW5ndGhfZ2V0SW50OFR5cGVkRGF0YV9HZXRJbnQ4X3NldEludDhUeXBlZERhdGFfU2V0SW50OF9nZXRVaW50OFR5cGVkRGF0YV9HZXRVaW50OF9zZXRVaW50OFR5cGVkRGF0YV9TZXRVaW50OF9nZXRJbnQxNlR5cGVkRGF0YV9HZXRJbnQxNl9zZXRJbnQxNlR5cGVkRGF0YV9TZXRJbnQxNl9nZXRVaW50MTZUeXBlZERhdGFfR2V0VWludDE2X3NldFVpbnQxNlR5cGVkRGF0YV9TZXRVaW50MTZfZ2V0SW50MzJUeXBlZERhdGFfR2V0SW50MzJfc2V0SW50MzJUeXBlZERhdGFfU2V0SW50MzJfZ2V0VWludDMyVHlwZWREYXRhX0dldFVpbnQzMl9zZXRVaW50MzJUeXBlZERhdGFfU2V0VWludDMyX2dldEludDY0VHlwZWREYXRhX0dldEludDY0X3NldEludDY0VHlwZWREYXRhX1NldEludDY0X2dldFVpbnQ2NFR5cGVkRGF0YV9HZXRVaW50NjRfc2V0VWludDY0VHlwZWREYXRhX1NldFVpbnQ2NF9nZXRGbG9hdDMyZGFydDpjb3JlI19Eb3VibGVUeXBlZERhdGFfR2V0RmxvYXQzMl9zZXRGbG9hdDMyVHlwZWREYXRhX1NldEZsb2F0MzJfZ2V0RmxvYXQ2NFR5cGVkRGF0YV9HZXRGbG9hdDY0X3NldEZsb2F0NjRUeXBlZERhdGFfU2V0RmxvYXQ2NF9nZXRGbG9hdDMyeDRUeXBlZERhdGFfR2V0RmxvYXQzMng0X3NldEZsb2F0MzJ4NFR5cGVkRGF0YV9TZXRGbG9hdDMyeDRfZ2V0SW50MzJ4NFR5cGVkRGF0YV9HZXRJbnQzMng0X3NldEludDMyeDRUeXBlZERhdGFfU2V0SW50MzJ4NF9nZXRGbG9hdDY0eDJUeXBlZERhdGFfR2V0RmxvYXQ2NHgyX3NldEZsb2F0NjR4MlR5cGVkRGF0YV9TZXRGbG9hdDY0eDJfX0ludDhMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbmZyb21Bc1R5cGVkTGlzdGZyb21Bc0xpc3R0ZW1wQnVmZmVyb3RoZXJMaXN0b3RoZXJTdGFydF9nZXRJbmRleGVkSW50MTZfc2V0SW5kZXhlZEludDE2Ynl0ZVN0YXJ0X2dldEluZGV4ZWRVaW50MTZfc2V0SW5kZXhlZFVpbnQxNl9nZXRJbmRleGVkSW50MzJfc2V0SW5kZXhlZEludDMyX2dldEluZGV4ZWRVaW50MzJfc2V0SW5kZXhlZFVpbnQzMl9nZXRJbmRleGVkSW50NjRfc2V0SW5kZXhlZEludDY0X2dldEluZGV4ZWRVaW50NjRfc2V0SW5kZXhlZFVpbnQ2NF9fRmxvYXQzMkxpc3QmX1R5cGVkTGlzdCZfRG91YmxlTGlzdE1peGluX2dldEluZGV4ZWRGbG9hdDMyX3NldEluZGV4ZWRGbG9hdDMyX2dldEluZGV4ZWRGbG9hdDY0X3NldEluZGV4ZWRGbG9hdDY0X19GbG9hdDMyeDRMaXN0Jl9UeXBlZExpc3QmX0Zsb2F0MzJ4NExpc3RNaXhpbl9nZXRJbmRleGVkRmxvYXQzMng0X3NldEluZGV4ZWRGbG9hdDMyeDRfX0ludDMyeDRMaXN0Jl9UeXBlZExpc3QmX0ludDMyeDRMaXN0TWl4aW5fZ2V0SW5kZXhlZEludDMyeDRfc2V0SW5kZXhlZEludDMyeDRfX0Zsb2F0NjR4Mkxpc3QmX1R5cGVkTGlzdCZfRmxvYXQ2NHgyTGlzdE1peGluX2dldEluZGV4ZWRGbG9hdDY0eDJfc2V0SW5kZXhlZEZsb2F0NjR4MkZsb2F0MzJ4NF9zdWJJbnQzMng0X3N1YkZsb2F0NjR4Ml9zdWJfVHlwZWRMaXN0SXRlcmF0b3JfYXJyYXlfcG9zaXRpb25hcnJheW5leHRQb3NpdGlvbl9UeXBlZExpc3RWaWV3X3R5cGVkRGF0YXZtOm5vbi1udWxsYWJsZS1yZXN1bHQtdHlwZVR5cGVkRGF0YVZpZXdfdHlwZWREYXRhVHlwZWREYXRhVmlld19vZmZzZXRJbkJ5dGVzVHlwZWREYXRhVmlld19sZW5ndGhfX0ludDhBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpblR5cGVkRGF0YVZpZXdfVWludDhBcnJheVZpZXdfbmV3X19GbG9hdDMyQXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9Eb3VibGVMaXN0TWl4aW5fX0Zsb2F0MzJ4NEFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfRmxvYXQzMng0TGlzdE1peGluX19JbnQzMng0QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnQzMng0TGlzdE1peGluX19GbG9hdDY0eDJBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0Zsb2F0NjR4Mkxpc3RNaXhpblR5cGVkRGF0YVZpZXdfQnl0ZURhdGFWaWV3X25ld0J5dGVCdWZmZXJUeXBlZERhdGFfVHlwZWRJbnRMaXN0X1R5cGVkRmxvYXRMaXN0dHlwZWREYXRhSW50OExpc3RUeXBlZERhdGFfSW50OEFycmF5X25ld2Zyb21MaXN0ZWxlbWVudHNUeXBlZERhdGFfVWludDhBcnJheV9uZXd2aWV3VWludDhDbGFtcGVkTGlzdFR5cGVkRGF0YV9VaW50OENsYW1wZWRBcnJheV9uZXdJbnQxNkxpc3RUeXBlZERhdGFfSW50MTZBcnJheV9uZXdUeXBlZERhdGFfVWludDE2QXJyYXlfbmV3VHlwZWREYXRhX0ludDMyQXJyYXlfbmV3VHlwZWREYXRhX1VpbnQzMkFycmF5X25ld0ludDY0TGlzdFR5cGVkRGF0YV9JbnQ2NEFycmF5X25ld1VpbnQ2NExpc3RUeXBlZERhdGFfVWludDY0QXJyYXlfbmV3RmxvYXQzMkxpc3RUeXBlZERhdGFfRmxvYXQzMkFycmF5X25ld0Zsb2F0NjRMaXN0VHlwZWREYXRhX0Zsb2F0NjRBcnJheV9uZXdGbG9hdDMyeDRMaXN0VHlwZWREYXRhX0Zsb2F0MzJ4NEFycmF5X25ld0ludDMyeDRMaXN0VHlwZWREYXRhX0ludDMyeDRBcnJheV9uZXdGbG9hdDY0eDJMaXN0VHlwZWREYXRhX0Zsb2F0NjR4MkFycmF5X25ld0Zsb2F0MzJ4NEludDMyeDRGbG9hdDY0eDJfdG9JbnRtYXNrX3RvSW50OF90b1VpbnQ4X3RvQ2xhbXBlZFVpbnQ4X3RvSW50MTZfdG9VaW50MTZfdG9JbnQzMjQyOTQ5NjcyOTVfdG9VaW50MzJfcmFuZ2VDaGVja2xpc3RMZW5ndGh2bXNlcnZpY2VfaW9sb2FkZXIuZGFydHNlcnZlci5kYXJ0ZGFydC5fdm1zZXJ2aWNlYXNzZXQuZGFydGNsaWVudC5kYXJ0ZGV2ZnMuZGFydGNvbnN0YW50cy5kYXJ0cnVubmluZ19pc29sYXRlLmRhcnRydW5uaW5nX2lzb2xhdGVzLmRhcnRtZXNzYWdlLmRhcnRtZXNzYWdlX3JvdXRlci5kYXJ0bmFtZWRfbG9va3VwLmRhcnRpc29sYXRlQ29udHJvbFBvcnRidWlsdGluX3NldHVwQ29tcGxldGVkX3dvcmtpbmdEaXJlY3Rvcnlfcm9vdFNjcmlwdF9wYWNrYWdlUm9vdF9sb2dJZF9wcmludFN0cmluZ0J1aWx0aW5fUHJpbnRTdHJpbmdfcHJpbnRfbWFrZUxvYWRlclJlcXVlc3R0YWd1cmlTZXJ2aWNlIGlzb2xhdGUgaXMgbm90IGF2YWlsYWJsZS5fbG9nKiBfc2FuaXRpemVXaW5kb3dzUGF0aHBhdGhmaXhlZFBhdGhyZXBsYWNlQWxsXC9fdHJpbVdpbmRvd3NQYXRoX2VuZm9yY2VUcmFpbGluZ1NsYXNoZW5kc1dpdGhjd2RTZXR0aW5nIHdvcmtpbmcgZGlyZWN0b3J5OiBXb3JraW5nIGRpcmVjdG9yeSBVUkk6IHBhY2thZ2VSb290U2V0dGluZyBwYWNrYWdlIHJvb3Q6IGZpbGU6aHR0cDpodHRwczpyZXNvbHZlcmVzb2x2ZVVyaXBhY2thZ2VSb290U3RyUGFja2FnZSByb290IFVSSTogcGFja2FnZXNQYXJhbVJlc29sdmluZyBwYWNrYWdlcyBtYXA6IE5vIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgc2V0LnBhY2thZ2VzTmFtZXBhY2thZ2VzVXJpc2NoZW1lcGFja2FnZXNVcmlTdHJSZXNvbHZlZCBwYWNrYWdlcyBtYXAgdG86IHNjcmlwdE5hbWVSZXNvbHZpbmcgc2NyaXB0OiBzY3JpcHRVcmlSZXNvbHZlZCBlbnRyeSBwb2ludCB0bzogX3Jlc291cmNlUmVhZEFzQnl0ZXM6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMHJlc3BvbnNlX2dldFBhY2thZ2VSb290RnV0dXJlUmVxdWVzdCBmb3IgcGFja2FnZSByb290IGZyb20gdXNlciBjb2RlLl9nZXRQYWNrYWdlQ29uZmlnRnV0dXJlUmVxdWVzdCBmb3IgcGFja2FnZSBjb25maWcgZnJvbSB1c2VyIGNvZGUuX3Jlc29sdmVQYWNrYWdlVXJpRnV0dXJlcGFja2FnZVVyaVJlcXVlc3QgZm9yIHBhY2thZ2UgVXJpIHJlc29sdXRpb24gZnJvbSB1c2VyIGNvZGU6IHBhY2thZ2VOb24tcGFja2FnZSBVcmksIHJldHVybmluZyB1bm1vZGlmaWVkOiBFeGNlcHRpb24gd2hlbiByZXNvbHZpbmcgcGFja2FnZSBVUkk6IFJlc29sdmVkICcnIHRvICcnbmF0aXZld3JhcHBlcnNOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczFkYXJ0LmlvdXRmOFJlY2VpdmVQb3J0SGFzaFNldFF1ZXVlTGlzdFF1ZXVlbG9nSHR0cFN0YXR1c2J5dGVzX2J1aWxkZXIuZGFydGNvbW1vbi5kYXJ0ZGF0YV90cmFuc2Zvcm1lci5kYXJ0ZGlyZWN0b3J5LmRhcnRkaXJlY3RvcnlfaW1wbC5kYXJ0ZW1iZWRkZXJfY29uZmlnLmRhcnRldmVudGhhbmRsZXIuZGFydGZpbGUuZGFydGZpbGVfaW1wbC5kYXJ0ZmlsZV9zeXN0ZW1fZW50aXR5LmRhcnRpb19yZXNvdXJjZV9pbmZvLmRhcnRpb19zaW5rLmRhcnRpb19zZXJ2aWNlLmRhcnRsaW5rLmRhcnRuYW1lc3BhY2VfaW1wbC5kYXJ0b3ZlcnJpZGVzLmRhcnRwbGF0Zm9ybS5kYXJ0cGxhdGZvcm1faW1wbC5kYXJ0cHJvY2Vzcy5kYXJ0c2VjdXJlX3NlcnZlcl9zb2NrZXQuZGFydHNlY3VyZV9zb2NrZXQuZGFydHNlY3VyaXR5X2NvbnRleHQuZGFydHNlcnZpY2Vfb2JqZWN0LmRhcnRzb2NrZXQuZGFydHN0ZGlvLmRhcnRzdHJpbmdfdHJhbnNmb3JtZXIuZGFydHN5bmNfc29ja2V0LmRhcnRGaWxlX0xlbmd0aF9JT1NlcnZpY2VQb3J0c19wb3J0c19mcmVlUG9ydHNfdXNlZFBvcnRzX2dldFBvcnRmb3JSZXF1ZXN0SWRfcmV0dXJuUG9ydF9uZXdTZXJ2aWNlUG9ydElPU2VydmljZV9OZXdTZXJ2aWNlUG9ydF9jYWNoZWROYW1lc3BhY2VOYW1lc3BhY2VfQ3JlYXRlbmFtZXNwYWNlX2dldFBvaW50ZXJOYW1lc3BhY2VfR2V0UG9pbnRlcl9nZXREZWZhdWx0TmFtZXNwYWNlX0dldERlZmF1bHRfbmFtZXNwYWNlX25hbWVzcGFjZVBvaW50ZXJfU2lnbmFsQ29udHJvbGxlcnNpZ25hbF9saXN0ZW5fc2lnbmFsTnVtYmVyRmFpbGVkIHRvIGxpc3RlbiBmb3Igc29ja2V0Ynl0ZXNyZWFkc2V0X0ludGVybmV0QWRkcmVzc19ob3N0X2luX2FkZHJ0eXBlSW50ZXJuZXRBZGRyZXNzKCcnLCBfTmF0aXZlU29ja2V0TmF0aXZlV3JhcHBlcl9fTmF0aXZlU29ja2V0Jl9OYXRpdmVTb2NrZXROYXRpdmVXcmFwcGVyJl9TZXJ2aWNlT2JqZWN0X05hdGl2ZVNvY2tldGlzQ2xvc2luZ2lzQ2xvc2VkUmVhZGNsb3NlZFJlYWRFdmVudFNlbnRpc0Nsb3NlZFdyaXRlY2xvc2VDb21wbGV0ZXJldmVudEhhbmRsZXJzZXZlbnRQb3J0ZmxhZ3NTZW50dHlwZUZsYWdzbG9jYWxQb3J0bG9jYWxBZGRyZXNzYXZhaWxhYmxldG9rZW5zc2VuZFJlYWRFdmVudHNyZWFkRXZlbnRJc3N1ZWRzZW5kV3JpdGVFdmVudHN3cml0ZUV2ZW50SXNzdWVkd3JpdGVBdmFpbGFibGVjb25uZWN0ZWRSZXNvdXJjZUhhbmRsZXJyZXNvdXJjZUluZm9vd25lcmlzTGlzdGVuaW5naXNQaXBlaXNJbnRlcm5hbGlzSW50ZXJuYWxTaWduYWxsZW5JbGxlZ2FsIGxlbmd0aCBuYXRpdmVSZWFkcmVwb3J0RXJyb3JSZWFkIGZhaWxlZHRvdGFsUmVhZGRpZFJlYWRpc3N1ZVJlYWRFdmVudGlzc3VlaXNzdWVXcml0ZUV2ZW50ZGVsYXllZG11bHRpcGxleGV2ZW50c09iamV2ZW50c25hdGl2ZUF2YWlsYWJsZWRpc2Nvbm5lY3RGcm9tRXZlbnRIYW5kbGVybmF0aXZlR2V0RXJyb3JyZXR1cm5Ub2tlbnN0b2tlbkJhdGNoU2l6ZXNlbmRUb0V2ZW50SGFuZGxlcnNldEhhbmRsZXJzY2xvc2VkZGVzdHJveWVkc2V0TGlzdGVuaW5nZmxhZ3NmdWxsRGF0YWNvbm5lY3RUb0V2ZW50SGFuZGxlcmV4dC5kYXJ0LmlvLmdldE9wZW5Tb2NrZXRzZXh0LmRhcnQuaW8uZ2V0U29ja2V0QnlJRFNvY2tldF9BdmFpbGFibGVTb2NrZXRfUmVhZFNvY2tldF9HZXRFcnJvcl9SYXdTb2NrZXRfc29ja2V0X3JlYWRFdmVudHNFbmFibGVkX3dyaXRlRXZlbnRzRW5hYmxlZF9pc01hY09TVGVybWluYWxJbnB1dF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlX29uUGF1c2VTdGF0ZUNoYW5nZXdyaXRlRXZlbnRzRW5hYmxlZF9yZXN1bWVfcGF1c2VnZXRfWDUwOUNlcnRpZmljYXRlSW1wbF9jYWNoZWREZXJfY2FjaGVkUGVtX2NhY2hlZFNoYTFJT0V4Y2VwdGlvbmVycm9yQ29kZXNiT1MgRXJyb3IsIGVycm5vID0gOiBlcnJubyA9IG92ZXJyaWRlc2NyZWF0ZURpcmVjdG9yeV9EaXJlY3RvcnlfcGF0aF9yYXdQYXRocmF3UGF0aHJhd1BhdGggY2Fubm90IGJlIG51bGxEaXJlY3RvcnlfQ3VycmVudERpcmVjdG9yeTogJ19FdmVudEhhbmRsZXJfdGltZXJNaWxsaXNlY29uZENsb2NrRXZlbnRIYW5kbGVyX1RpbWVyTWlsbGlzZWNvbmRDbG9ja0V2ZW50SGFuZGxlcl9TZW5kRGF0YXNlbmRlcmNyZWF0ZUZpbGVvc0Vycm9yLCBwYXRoID0gJyAoX0ZpbGVfZGlzcGF0Y2hXaXRoTmFtZXNwYWNlcmVxdWVzdENhbm5vdCByZXRyaWV2ZSBsZW5ndGggb2YgZmlsZUZpbGU6ICdfUmFuZG9tQWNjZXNzRmlsZU9wc0ZpbGVTeXN0ZW1FbnRpdHlfdG9VdGY4QXJyYXlfdG9OdWxsVGVybWluYXRlZFV0ZjhBcnJheWxfdG9TdHJpbmdGcm9tVXRmOEFycmF5bm9uTnVsbFRlcm1pbmF0ZWRfSU9SZXNvdXJjZUluZm9yZWZlcmVuY2VWYWx1ZU1hcF9SZWFkV3JpdGVSZXNvdXJjZUluZm9fU29ja2V0UmVzb3VyY2VJbmZvb3BlblNvY2tldHNnZXRPcGVuU29ja2V0c0xpc3RnZXRTb2NrZXRJbmZvTWFwZ2V0U29ja2V0SW5mb01hcEJ5SURwYXJhbXNqc29uVmFsdWVnZXRPcGVuU29ja2V0c19vcGVuc29ja2V0c1NvY2tldENsb3NlZGluZm9fSU9TZXJ2aWNlX3NlcnZpY2VQb3J0c19yZXBseVRvUG9ydF9tZXNzYWdlTWFwX2Vuc3VyZUluaXRpYWxpemVfZmluYWxpemVfZ2V0TmV4dElkMjE0NzQ4MzY0N19kaXNwYXRjaHNlcnZpY2VQb3J0Y3JlYXRlTGlua19MaW5rTGluazogJ0lPT3ZlcnJpZGVzX2dsb2JhbHBhY2thZ2U6ZGFydDpkYXRhOl9Qcm9jZXNzVXRpbHNfd2F0Y2hTaWduYWxJbnRlcm5hbFByb2Nlc3NTaWduYWxTaWduYWxFeGNlcHRpb24sIG9zRXJyb3I6IFNpZ25hbEV4Y2VwdGlvbjogX1NlY3VyZUZpbHRlcl9TZXJ2aWNlT2JqZWN0SW50ZXJuZXRBZGRyZXNzVHlwZUFOWUlQdjRJUHY2SW52YWxpZCBJbnRlcm5ldEFkZHJlc3NJbnRlcm5ldEFkZHJlc3NUeXBlOiBJbnRlcm5ldEFkZHJlc3NSYXdTb2NrZXRFdmVudFJhd1NvY2tldEV2ZW50LnJlYWRSYXdTb2NrZXRFdmVudC53cml0ZVJhd1NvY2tldEV2ZW50LnJlYWRDbG9zZWRSYXdTb2NrZXRFdmVudC5jbG9zZWRSYXdTb2NrZXREYXRhZ3JhbV9zaWduYWxDb250cm9sbGVyc19pb092ZXJyaWRlc1Rva2VuX3N0ZGluRkRfc3Rkb3V0RkRfc3RkZXJyRkRHZXR0aW5nIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZmFpbGVkaW5fYWRkcl9pc0Vycm9yUmVzcG9uc2VfZXhjZXB0aW9uRnJvbVJlc3BvbnNlZXJyRmlsZSBjbG9zZWRVbmtub3duIGVycm9yc3RkaW5zdGRvdXRzdGRlcnJkYXJ0LmNsaXdhaXRfZm9yLmRhcnRfd2FpdEZvckV2ZW50Q0xJX1dhaXRGb3JFdmVudHRpbWVvdXRNaWxsaXNkYXJ0LmNvcmVNYXBzVW5tb2RpZmlhYmxlTWFwQmFzZWFzY2lpanNvbmxhdGluMTIuMUVuZGlhbmJhc2U2NFN0cmluZ0NvbnZlcnNpb25TaW5rYmlnaW50LmRhcnRib29sLmRhcnRjb21wYXJhYmxlLmRhcnRkYXRlX3RpbWUuZGFydGRvdWJsZS5kYXJ0ZHVyYXRpb24uZGFydGVycm9ycy5kYXJ0ZXhjZXB0aW9ucy5kYXJ0ZXhwYW5kby5kYXJ0ZnVuY3Rpb24uZGFydGlkZW50aWNhbC5kYXJ0aW50LmRhcnRpbnZvY2F0aW9uLmRhcnRtYXAuZGFydG51bGwuZGFydG51bS5kYXJ0b2JqZWN0LmRhcnRwYXR0ZXJuLmRhcnRyZWdleHAuZGFydHNpbmsuZGFydHN0YWNrdHJhY2UuZGFydHN0b3B3YXRjaC5kYXJ0c3RyaW5nLmRhcnRzdHJpbmdfYnVmZmVyLmRhcnRzdHJpbmdfc2luay5kYXJ0dHlwZS5kYXJ0dXJpLmRhcnRfVXJpQmFzZUNsb3N1cmVMaXN0X2FsbG9jYXRlTGlzdF9nZXRJbmRleGVkX3NldEluZGV4ZWRMaXN0X3NldEluZGV4ZWRMaXN0X2dldExlbmd0aF9zbGljZW5lZWRzVHlwZUFyZ3VtZW50X3NsaWNlSW50ZXJuYWxMaXN0X3NsaWNlaXRlcmFibGVBc0xpc3Rfc2V0TGVuZ3RoX2Zyb21JbW11dGFibGVMaXN0X2Zyb21fRml4ZWRTaXplQXJyYXlJdGVyYXRvcl9jYWNoZV9jYWNoZUV2aWN0SW5kZXhmcm9tSW50ZWdlckRvdWJsZV9kb3VibGVGcm9tSW50ZWdlckRvdWJsZV9oYXNoQ29kZV9pZGVudGl0eUhhc2hDb2RldG9Eb3VibGVEb3VibGVfYWRkX3N1YkRvdWJsZV9zdWJfbXVsRG91YmxlX211bF90cnVuY19kaXZEb3VibGVfdHJ1bmNfZGl2X2VxdWFsRG91YmxlX2VxdWFsX2VxdWFsVG9JbnRlZ2VyRG91YmxlX2VxdWFsVG9JbnRlZ2VyX2dyZWF0ZXJUaGFuRG91YmxlX2dyZWF0ZXJUaGFuX2FkZEZyb21JbnRlZ2VyX3N1YkZyb21JbnRlZ2VyX211bEZyb21JbnRlZ2VyX2dyZWF0ZXJUaGFuRnJvbUludGVnZXJEb3VibGVfZ3JlYXRlclRoYW5Gcm9tSW50ZWdlcmlzSW5maW5pdGVEb3VibGVfZ2V0SXNJbmZpbml0ZWlzTmFORG91YmxlX2dldElzTmFOX3RvU3RyaW5nRG91YmxlX3RvU3RyaW5nMC4wX2ZhaWxlZEFzc2VydGlvbl91cmxfbGluZV9jb2x1bW5hc3NlcnRpb25TdGFydGFzc2VydGlvbkVuZF9kb1Rocm93TmV3QXNzZXJ0aW9uRXJyb3JfdGhyb3dOZXdjb25kaXRpb25fbWVzc2FnZVN0cmluZ2lzIG5vdCB0cnVlLnRyaW0nOiBjb2x1bW5JbmZvIHBvcyAnOiBGYWlsZWQgYXNzZXJ0aW9uOiBsaW5lIHVybGNvbHVtbmVycm9yTXNnaXMgYXNzaWduYWJsZV9lcnJvck1zZ19tc2dJbnRlcm5hbEVycm9yOiAnQ2xvc3VyZV9lcXVhbHNfY29tcHV0ZUhhc2hDbG9zdXJlX2NvbXB1dGVIYXNoX2VtcHR5TGlzdHdpdGhDYXBhY2l0eWNhcGFjaXR5d2l0aERhdGFHcm93YWJsZUxpc3RfYWxsb2NhdGVfY2FwYWNpdHlHcm93YWJsZUxpc3RfZ2V0Q2FwYWNpdHlHcm93YWJsZUxpc3RfZ2V0TGVuZ3RobmV3X2xlbmd0aG9sZF9jYXBhY2l0eW5ld19jYXBhY2l0eV9ncm93c2hvdWxkU2hyaW5rVG9GaXRfc2hyaW5rR3Jvd2FibGVMaXN0X3NldExlbmd0aF9zZXREYXRhR3Jvd2FibGVMaXN0X3NldERhdGFHcm93YWJsZUxpc3RfZ2V0SW5kZXhlZEdyb3dhYmxlTGlzdF9zZXRJbmRleGVkX25leHRDYXBhY2l0eWVsZW1fYWxsb2NhdGVEYXRhbmV3RGF0YV9qb2luV2l0aFNlcGFyYXRvcmNvZGVVbml0Q291bnRlbGVtZW50Zmlyc3ROb25PbmVCeXRlU3RyaW5nTGltaXRuZXh0RWxlbWVudGNvcHlJbmRleG9uZWJ5dGVDYW5hcnllbGVtZW50U3RyaW5nX2t2UGFpcnNrZXlWYWx1ZVBhaXJzQ2Fubm90IHNldCB2YWx1ZSBpbiB1bm1vZGlmaWFibGUgTWFwX0ludGVnZXJJbXBsZW1lbnRhdGlvbl90cnVuY0RpdkZyb21JbnRlZ2VyX21vZHVsb0Zyb21JbnRlZ2VyX2JpdEFuZEZyb21JbnRlZ2VyX2JpdE9yRnJvbUludGVnZXJfYml0WG9yRnJvbUludGVnZXJyZW1haW5kZXJfcmVtYWluZGVyRnJvbUludGVnZXJJbnRlZ2VyX2JpdEFuZEZyb21JbnRlZ2VySW50ZWdlcl9iaXRPckZyb21JbnRlZ2VySW50ZWdlcl9iaXRYb3JGcm9tSW50ZWdlcl9zaHJGcm9tSW50ZWdlckludGVnZXJfc2hyRnJvbUludGVnZXJfc2hsRnJvbUludGVnZXJJbnRlZ2VyX3NobEZyb21JbnRlZ2VySW50ZWdlcl9hZGRGcm9tSW50ZWdlckludGVnZXJfc3ViRnJvbUludGVnZXJJbnRlZ2VyX211bEZyb21JbnRlZ2VySW50ZWdlcl90cnVuY0RpdkZyb21JbnRlZ2VySW50ZWdlcl9tb2R1bG9Gcm9tSW50ZWdlckludGVnZXJfZ3JlYXRlclRoYW5Gcm9tSW50ZWdlckludGVnZXJfZXF1YWxUb0ludGVnZXJpc0V2ZW5pc09kZHJhZGl4X3RvUG93MlN0cmluZ2lzTmVnYXRpdmVfbWluSW50NjRUb1JhZGl4U3RyaW5ndGVtcDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5el9zZXRBdDBuZWdhdGl2ZWJpdHNQZXJEaWdpdFNtaV9iaXROZWdhdGVTbWlfYml0TGVuZ3RoX2JpdEFuZEZyb21TbWlTbWlfYml0QW5kRnJvbVNtaV9wb3NpdGl2ZUJhc2UxMExlbmd0aHNtaS05OS05OC05Ny05Ni05NS05NC05My05Mi05MS05MC04OS04OC04Ny04Ni04NS04NC04My04Mi04MS04MC03OS03OC03Ny03Ni03NS03NC03My03Mi03MS03MC02OS02OC02Ny02Ni02NS02NC02My02Mi02MS02MC01OS01OC01Ny01Ni01NS01NC01My01Mi01MS01MC00OS00OC00Ny00Ni00NS00NC00My00Mi00MS00MC0zOS0zOC0zNy0zNi0zNS0zNC0zMy0zMi0zMS0zMC0yOS0yOC0yNy0yNi0yNS0yNC0yMy0yMi0yMS0yMC0xOS0xOC0xNy0xNi0xNS0xNC0xMy0xMi0xMS0xMC05LTgtNy02LTUtNC0zLTItMTEyMzQ1Njc4OTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OXR3b0RpZ2l0c2RpZ2l0SW5kZXhfbmVnYXRpdmVCYXNlMTBMZW5ndGhuZWdTbWlfbmVnYXRpdmVUb1N0cmluZ2RpZ2l0Q291bnRNaW50X2JpdE5lZ2F0ZU1pbnRfYml0TGVuZ3RoX2Z1bmN0aW9uTmFtZV9hcmd1bWVudHNEZXNjcmlwdG9yX2FyZ3VtZW50c19pc1N1cGVySW52b2NhdGlvbl9kZWxheWVkVHlwZUFyZ3VtZW50c0xlbl9tZW1iZXJOYW1lX3R5cGVfdHlwZUFyZ3VtZW50c19wb3NpdGlvbmFsQXJndW1lbnRzX25hbWVkQXJndW1lbnRzX3NldE1lbWJlck5hbWVBbmRUeXBlZ2V0OnNldDptZW1iZXJOYW1lX3R5cGVBcmdzTGVudHlwZUFyZ3NMZW50eXBlQXJndW1lbnRzX3VucGFja1R5cGVBcmd1bWVudHNJbnZvY2F0aW9uTWlycm9yX3VucGFja1R5cGVBcmd1bWVudHNudW1UeXBlQXJndW1lbnRzcG9zaXRpb25hbEFyZ3VtZW50c251bVBvc2l0aW9uYWxBcmd1bWVudHNyZWNlaXZlckluZGV4bmFtZWRBcmd1bWVudHNudW1Bcmd1bWVudHNudW1OYW1lZEFyZ3VtZW50c25hbWVkRW50cnlJbmRleGFyZ19uYW1lYXJnX3ZhbHVlZnVuY3Rpb25OYW1lYXJndW1lbnRzRGVzY3JpcHRvcmFyZ3VtZW50c2lzU3VwZXJJbnZvY2F0aW9uZGVsYXllZFR5cGVBcmd1bWVudHNMZW5fbG9hZExpYnJhcnlQcmVmaXhfbG9hZF9sb2FkRXJyb3JMaWJyYXJ5UHJlZml4X2xvYWRFcnJvcl9pbnZhbGlkYXRlRGVwZW5kZW50Q29kZUxpYnJhcnlQcmVmaXhfaW52YWxpZGF0ZURlcGVuZGVudENvZGVfUmVnRXhwSGFzaEtleXBhdHRlcm5tdWx0aUxpbmVjYXNlU2Vuc2l0aXZldGhhdF9SZWdFeHBIYXNoVmFsdWVyZWdleHBfUmVnRXhwTWF0Y2hfcmVnZXhwX21hdGNoX2VuZGdyb3VwSWR4Z3JvdXBfZ3JvdXBDb3VudF9zdWJzdHJpbmdVbmNoZWNrZWRSZWdFeHBfZmFjdG9yeWFsbE1hdGNoZXNSZWdFeHBfZ2V0R3JvdXBDb3VudF9FeGVjdXRlTWF0Y2hSZWdFeHBfRXhlY3V0ZU1hdGNoc3RhcnRfaW5kZXhfQWxsTWF0Y2hlc0l0ZXJhYmxlX3JlX3N0cl9BbGxNYXRjaGVzSXRlcmF0b3JfbmV4dEluZGV4bWF0Y2hfaXNXaGl0ZXNwYWNlU3RyaW5nX2dldEhhc2hDb2RlX2lzT25lQnl0ZWNyZWF0ZUZyb21DaGFyQ29kZXNjaGFyQ29kZXNsaW1pdGNjaWRjb2RlQ291bnRfc2NhbkNvZGVVbml0c2JpdHNjb2RlX2NyZWF0ZVN0cmluZ0Zyb21JdGVyYWJsZWNoYXJDb2RlTGlzdGlzT25lQnl0ZVN0cmluZ19jcmVhdGVPbmVCeXRlU3RyaW5nX2NyZWF0ZUZyb21Db2RlUG9pbnRzU3RyaW5nQmFzZV9jcmVhdGVGcm9tQ29kZVBvaW50c2NvZGVQb2ludHNTdHJpbmdfY2hhckF0U3RyaW5nX2dldExlbmd0aFN0cmluZ19jb25jYXRfc3Vic3RyaW5nTWF0Y2hlc21hdGNoQXNQcmVmaXhpbmRleE9mbWF4SW5kZXhsYXN0SW5kZXhPZl9zdWJzdHJpbmdVbmNoZWNrZWROYXRpdmVTdHJpbmdCYXNlX3N1YnN0cmluZ1VuY2hlY2tlZF9pc09uZUJ5dGVXaGl0ZXNwYWNlX2lzVHdvQnl0ZVdoaXRlc3BhY2VfZmlyc3ROb25XaGl0ZXNwYWNlX2xhc3ROb25XaGl0ZXNwYWNlcmVwbGFjZW1lbnRJc09uZUJ5dGVyZXBsYWNlbWVudExlbmd0aHRvdGFsTGVuZ3Roc2xpY2VzX2FkZFJlcGxhY2VTbGljZW1hdGNoZXNfam9pblJlcGxhY2VBbGxPbmVCeXRlUmVzdWx0YmFzZXdyaXRlSW5kZXhzbGljZUxlbmd0aF9qb2luUmVwbGFjZUFsbFJlc3VsdFN0cmluZ0Jhc2Vfam9pblJlcGxhY2VBbGxSZXN1bHRyZXBsYWNlbWVudFN0cmluZ3NBcmVPbmVCeXRlbnVtVmFsdWVzc3BsaXRwcmV2aW91c0luZGV4dG9VcHBlckNhc2VTdHJpbmdfdG9VcHBlckNhc2V0b0xvd2VyQ2FzZVN0cmluZ190b0xvd2VyQ2FzZV9jb25jYXRSYW5nZXN0cmluZ3NfY29uY2F0UmFuZ2VOYXRpdmVTdHJpbmdfY29uY2F0UmFuZ2VTdHJpbmdfY29kZVVuaXRBdE9uZUJ5dGVTdHJpbmdfc3Vic3RyaW5nVW5jaGVja2VkX3NwbGl0V2l0aENoYXJDb2RlT25lQnl0ZVN0cmluZ19zcGxpdFdpdGhDaGFyQ29kZXBhdHRlcm5Bc1N0cmluZ19jb25jYXRBbGxyZXNzdHJpbmdzTGVuZ3Rockl4ZUxlbmd0aHBDaWRwYXR0ZXJuQ3UwdGltZXMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6W1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8KAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsOXw7jDucO6w7vDvMO9w77Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w78AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVp7fH1+f8KAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrQAwrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DngDDgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw7fDmMOZw5rDm8Ocw53DngBfYWxsb2NhdGVPbmVCeXRlU3RyaW5nX2FsbG9jYXRlT25lQnl0ZVN0cmluZ19zZXRBdGNvZGVQb2ludG9uZUJ5dGVTdHJpbmdfYWxsb2NhdGVGcm9tVHdvQnl0ZUxpc3RUd29CeXRlU3RyaW5nX2FsbG9jYXRlRnJvbVR3b0J5dGVMaXN0X1N0cmluZ01hdGNoZ19TdHJpbmdBbGxNYXRjaGVzSXRlcmFibGVfaW5wdXRfcGF0dGVybl9TdHJpbmdBbGxNYXRjaGVzSXRlcmF0b3JfQWJzdHJhY3RUeXBlQWJzdHJhY3RUeXBlX3RvU3RyaW5nVHlwZV9nZXRIYXNoQ29kZURlcHJlY2F0ZWRvcHRpb25zQ29tcGFyYWJsZWRvdWJsZXNhZmVUb1N0cmluZ19zdHJpbmdUb1NhZmVTdHJpbmdfb2JqZWN0VG9TdHJpbmdBc3NlcnRpb25FcnJvclR5cGVFcnJvckNhc3RFcnJvclRocm93IG9mIG51bGwuX2hhc1ZhbHVlaW52YWxpZFZhbHVlbm90TnVsbE11c3Qgbm90IGJlIG51bGxjaGVja05vdE51bGxfZXJyb3JOYW1lSW52YWxpZCBhcmd1bWVudChzKV9lcnJvckV4cGxhbmF0aW9ubmFtZVN0cmluZ2V4cGxhbmF0aW9uZXJyb3JWYWx1ZVZhbHVlIG5vdCBpbiByYW5nZW1pblZhbHVlbWF4VmFsdWVJbnZhbGlkIHZhbHVlY2hlY2tWYWxpZFJhbmdlc3RhcnROYW1lZW5kTmFtZWNoZWNrTm90TmVnYXRpdmU6IE5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDogTm90IGluIHJhbmdlIC4uLCBpbmNsdXNpdmU6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5OiBPbmx5IHZhbGlkIHZhbHVlIGlzIEluZGV4RXJyb3JpbmRleGFibGVJbmRleCBvdXQgb2YgcmFuZ2U6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0aXZlOiBubyBpbmRpY2VzIGFyZSB2YWxpZDogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAnOiBTd2l0Y2ggY2FzZSBmYWxsLXRocm91Z2ggYXQgbGluZSBfY2xhc3NOYW1lQ2Fubm90IGluc3RhbnRpYXRlIGFic3RyYWN0IGNsYXNzIF91cmwgJycgbGluZSBfZXhpc3RpbmdBcmd1bWVudE5hbWVzX3JlY2VpdmVyX2ludm9jYXRpb25faW52b2NhdGlvbl90eXBlaW52b2NhdGlvbl90eXBlYXJndW1lbnROYW1lc3dpdGhJbnZvY2F0aW9ucmVjZWl2ZXJpbnZvY2F0aW9uX05hbWVkQXJndW1lbnRzTWFwX2V4aXN0aW5nTWV0aG9kU2lnbmF0dXJlTm9TdWNoTWV0aG9kRXJyb3JfZXhpc3RpbmdNZXRob2RTaWduYXR1cmVtZXRob2ROYW1laW52b2NhdGlvblR5cGVfdG9TdHJpbmdEZXByZWNhdGVkbGV2ZWxOb1N1Y2hNZXRob2RFcnJvcjogQ2Fubm90IGFzc2lnbiB0byBmaW5hbCB2YXJpYWJsZSAnYXJndW1lbnRDb3VudGFyZ3NfbWlzbWF0Y2hhcmdzX21lc3NhZ2Ugd2l0aCBtYXRjaGluZyBhcmd1bWVudHN0eXBlX3N0cmdldHRlcnNldHRlcmdldHRlciBvciBzZXR0ZXJ2YXJpYWJsZW1zZ19idWZOb1N1Y2hNZXRob2RFcnJvcjogaXNfdHlwZV9jYWxsd3JpdGVsblRoZSBudWxsIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgVGhlICAnJyB3YXMgY2FsbGVkIG9uIG51bGwuQ2xvc3VyZSBjYWxsIHdpdGggbWlzbWF0Y2hlZCBhcmd1bWVudHM6IGZ1bmN0aW9uICdBdHRlbXB0ZWQgdG8gdXNlIHR5cGUgJycgYXMgYSBmdW5jdGlvbi4gU2luY2UgdHlwZXMgZG8gbm90IGRlZmluZSBhIG1ldGhvZCAnY2FsbCcsIHRoaXMgaXMgbm90IHBvc3NpYmxlLiBEaWQgeW91IGludGVuZCB0byBjYWxsIHRoZSAgY29uc3RydWN0b3IgYW5kIGZvcmdldCB0aGUgJ25ldycgb3BlcmF0b3I/Q2xhc3MgJ3J1bnRpbWVUeXBlJyBoYXMgbm8gaW5zdGFuY2UgU3VwZXIgY2xhc3Mgb2YgY2xhc3MgJycgaGFzIG5vIGluc3RhbmNlIHN1cGVyLk5vIHN0YXRpYyBkZWNsYXJlZCBpbiBjbGFzcyAnJy5ObyBjb25zdHJ1Y3RvciAnIGRlY2xhcmVkIGluIGNsYXNzICduZXcgTm8gdG9wLWxldmVsIGRlY2xhcmVkLlJlY2VpdmVyOiB0b3AtbGV2ZWxSZWNlaXZlcjogVHJpZWQgY2FsbGluZzogID0gZm9ybWFsUGFyYW1ldGVycwpGb3VuZDoga2luZHR5cGVBcmd1bWVudHNCdWZhcmd1bWVudHNCdWZleGlzdGluZ1NpZ2FyZ3NNc2draW5kQnVmbXNnQnVmVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBTdGF0ZUVycm9yQmFkIHN0YXRlOiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXJyb3Jtb2RpZmllZE9iamVjdENvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogT3V0IG9mIE1lbW9yeVN0YWNrIE92ZXJmbG93dmFyaWFibGVOYW1lUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvblJlYWRpbmcgc3RhdGljIHZhcmlhYmxlICcnIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb25FeGNlcHRpb25fRXhjZXB0aW9uRXhjZXB0aW9uOiByZXBvcnRvYmplY3RTb3VyY2VsaW5lTnVtbGluZVN0YXJ0cHJldmlvdXNDaGFyV2FzQ1IgKGF0IGxpbmUgLCBjaGFyYWN0ZXIgKQogKGF0IGNoYXJhY3RlciBsaW5lRW5kcG9zdGZpeHNsaWNlbWFya09mZnNldF4KIChhdCBvZmZzZXQgRnVuY3Rpb25pbnRfaW50NjRPdmVyZmxvd0xpbWl0czEwNzM3NDE4MjQ0NjExNjg2MDE4NDI3Mzg3OTA0NDA1MjU1NTE1MzAxODk3NjI2NzExNTI5MjE1MDQ2MDY4NDY5NzYxNDkwMTE2MTE5Mzg0NzY1NjI1Nzg5NzMwMjIzMDUzNjAyODE2MzkwOTgyMTA0ODU4Mjk4ODA0OTEzNTA4NTE3MTc2NzI5OTIwODkxMDAwMDAwMDAwMDAwMDAwMDAwNTA1NDQ3MDI4NDk5MjkzNzcxMjIxODYxMTEwNjc0MDQzNjk5MjY2NTQxNjYwOTE4MzE3OTg0MTIxNzc5NTMzMzc4MDkzNzExMzY0Mzc4OTM4OTAzODA4NTkzNzUyODYyNDIzMDUxNTA5ODE1NzkzMzc0ODEzMzY3NTgyMDgxMDI0Nzk5MDA2Njg1NzgyODg0MTIxMTYzODQwMDAwMDAwMDAwMDAwMDMyNDM5MTk5MzI1MjE1MDg2ODEyODI4MTAwNTc4ODMwODI3NTI1MDQwMzYzNjE5MzY0NjczODM4NzY0ODgzMzg0NjUzNTc4MjQyNDgxMTUyODczMjAzNzM2NTc2MjMyMjE4MjY1MDg5MjEyNDE2MzUzODE0NzgzMjA1NDY5MDQxNTMxNDQxMDAwMDAwMDAwMDAwNzg3NjYyNzgzNzg4NTQ5NzYxMTY2Nzg4OTUxNDk1Mjk4NDk2MTIzODY0MjA2ODM2OTMxMDEwNTYzMzc5MjIwNTA4MDU2NjQwNjI1MTMxNjIxNzAzODQyMjY3MTM2X3RyeVBhcnNlU21paXhzaWduc21pTGltaXRfcGFyc2VfdGhyb3dGb3JtYXRFeGNlcHRpb25JbnZhbGlkIG51bWJlckludmFsaWQgcmFkaXgtIG51bWJlcl9wYXJzZVJhZGl4YWxsb3dVNjR0YWJsZUluZGV4YmxvY2tTaXplc21hbGxCbG9ja1NpemVibG9ja0VuZG11bHRpcGxpZXJwb3NpdGl2ZU92ZXJmbG93TGltaXRuZWdhdGl2ZU92ZXJmbG93TGltaXRYNjg3MTk0NzY3MzUxMTUyOTIxNTA0NjA2ODQ2OTc1UG9zaXRpdmUgaW5wdXQgZXhjZWVkcyB0aGUgbGltaXQgb2YgaW50ZWdlck5lZ2F0aXZlIGlucHV0IGV4Y2VlZHMgdGhlIGxpbWl0IG9mIGludGVnZXJfcGFyc2VCbG9ja19pbml0SW50NjRPdmVyZmxvd0xpbWl0czkyMjMzNzIwMzY4NTQ3NzU4MDctOTIyMzM3MjAzNjg1NDc3NTgwOHNoaWZ0QW1vdW50cGFyc2VUaGUgc291cmNlIG11c3Qgbm90IGJlIG51bGxSYWRpeCAgbm90IGluIHJhbmdlIDIuLjM2SW52b2NhdGlvbkl0ZXJhYmxlSXRlcmF0b3JnZW5lcmF0ZWdlbmVyYXRvcnVubW9kaWZpYWJsZW51bV9oYXNoQ29kZVJuZF9vYmplY3RIYXNoQ29kZW9iak9iamVjdF90b1N0cmluZ09iamVjdF9oYXZlU2FtZVJ1bnRpbWVUeXBlT2JqZWN0X2luc3RhbmNlT2ZpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzT2JqZWN0X3NpbXBsZUluc3RhbmNlT2ZPYmplY3RfZXF1YWxzZGFydDpjb3JlI19UeXBlT2JqZWN0X3J1bnRpbWVUeXBlUGF0dGVybk1hdGNoUmVnRXhwX3JlY2VudGx5VXNlZGxhc3RLZXlSZWdFeHBNYXRjaFNpbmtTdGFja1RyYWNlU3RyaW5nZnJvbUNoYXJDb2Rlc2Zyb21DaGFyQ29kZWxvd2hpZ2hyZXBsYWNlU3RyaW5nQnVmZmVyX3BhcnRzX3BhcnRzQ29kZVVuaXRzX3BhcnRzQ29tcGFjdGlvbkluZGV4X3BhcnRzQ29kZVVuaXRzU2luY2VDb21wYWN0aW9uX2J1ZmZlclBvc2l0aW9uX2J1ZmZlckNvZGVVbml0TWFnbml0dWRlY29udGVudF9lbnN1cmVDYXBhY2l0eV9jb25zdW1lQnVmZmVyaXNMYXRpbjFfYWRkUGFydHBhcnRzU2luY2VDb21wYWN0aW9uX2NvbXBhY3Rjb21wYWN0ZWRTdHJpbmdCdWZmZXJfY3JlYXRlU3RyaW5nRnJvbVVpbnQxNkFycmF5U3RyaW5nU2lua1R5cGVVcml1c2VySW5mb2hvc3RxdWVyeWZyYWdtZW50aGFzQXV0aG9yaXR5aGFzUG9ydGhhc1F1ZXJ5aGFzRnJhZ21lbnRoYXNBYnNvbHV0ZVBhdGhyZWZlcmVuY2VkYXRhRGVsdGFpbmRpY2Vzc2NoZW1lRW5kaG9zdFN0YXJ0cG9ydFN0YXJ0cGF0aFN0YXJ0cXVlcnlTdGFydGZyYWdtZW50U3RhcnRpc1NpbXBsZS8uLmZpbGVzY2hlbWVBdXRoZmlsZTovL2RlbHRhZmlsZTovLy9odHRwaHR0cHM0NDNlbmNvZGVRdWVyeUNvbXBvbmVudGNvbXBvbmVudGVuY29kaW5nX3BhcnNlSVB2NEFkZHJlc3Nwb3NpdGlvbklsbGVnYWwgSVB2NCBhZGRyZXNzLCBwYXJ0SW5kZXhwYXJ0U3RhcnRpbnZhbGlkIGNoYXJhY3RlcklQdjQgYWRkcmVzcyBzaG91bGQgY29udGFpbiBleGFjdGx5IDQgcGFydHNwYXJ0ZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAuLjI1NXBhcnNlSVB2NkFkZHJlc3NJbGxlZ2FsIElQdjYgYWRkcmVzcywgcGFyc2VIZXhhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2YgNCBoZXggZGlnaXRzZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZGRmBhZGRyZXNzIGlzIHRvbyBzaG9ydHdpbGRjYXJkU2VlbnNlZW5Eb3RpbnZhbGlkIHN0YXJ0IGNvbG9uLm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxsb3dlZHRvbyBmZXcgcGFydHNhdEVuZGlzTGFzdFdpbGRjYXJkZXhwZWN0ZWQgYSBwYXJ0IGFmdGVyIGxhc3QgYDpgYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRzYW4gYWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQgbXVzdCBjb250YWluIGV4YWN0bHkgOCBwYXJ0c3dpbGRDYXJkTGVuZ3RoX1VyaV9pc1dpbmRvd3NDYWNoZWRfdXNlckluZm9fcXVlcnlfZnJhZ21lbnRfcGF0aFNlZ21lbnRzX3RleHRfaGFzaENvZGVDYWNoZV9xdWVyeVBhcmFtZXRlcnNfcXVlcnlQYXJhbWV0ZXJMaXN0c19pc1dpbmRvd3NQbGF0Zm9ybVVyaV9pc1dpbmRvd3NQbGF0Zm9ybW5vdFNpbXBsZUludmFsaWQgZW1wdHkgc2NoZW1ldXNlckluZm9TdGFydEludmFsaWQgcG9ydHBhdGhTZWdtZW50c3F1ZXJ5UGFyYW1ldGVyc2lzRmlsZWFsbG93U2NoZW1lLy9fZGVmYXVsdFBvcnRfZmFpbHdpbmRvd3NkaXJlY3RvcnlfY2hlY2tXaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVyc3NlZ21lbnRzYXJndW1lbnRFcnJvcmZpcnN0U2VnbWVudHNlZ21lbnRbIiovOjw+P1xcfF1JbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0aDogX2NoZWNrV2luZG93c0RyaXZlTGV0dGVySWxsZWdhbCBkcml2ZSBsZXR0ZXIgX21ha2VGaWxlVXJpc2xhc2hUZXJtaW5hdGVkX21ha2VXaW5kb3dzRmlsZVVybFxcP1xVTkNcV2luZG93cyBwYXRocyB3aXRoIFxcP1wgcHJlZml4IG11c3QgYmUgYWJzb2x1dGVXaW5kb3dzIHBhdGhzIHdpdGggZHJpdmUgbGV0dGVyIG11c3QgYmUgYWJzb2x1dGVob3N0UGFydHBhdGhQYXJ0X21ha2VQb3J0X21ha2VIb3N0c3RyaWN0SVB2Nk1pc3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9zdF9pc1JlZ05hbWVDaGFyX25vcm1hbGl6ZVJlZ05hbWVzZWN0aW9uU3RhcnRpc05vcm1hbGl6ZWRzb3VyY2VMZW5ndGglMjVJbnZhbGlkIGNoYXJhY3Rlcl9tYWtlU2NoZW1lZmlyc3RDb2RlVW5pdFNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0aCBhbHBoYWJldGljIGNoYXJhY3RlcmNvbnRhaW5zVXBwZXJDYXNlSWxsZWdhbCBzY2hlbWUgY2hhcmFjdGVyX2Nhbm9uaWNhbGl6ZVNjaGVtZV9tYWtlVXNlckluZm9fbWFrZVBhdGhlbnN1cmVMZWFkaW5nU2xhc2hCb3RoIHBhdGggYW5kIHBhdGhTZWdtZW50cyBzcGVjaWZpZWRlc2NhcGVEZWxpbWl0ZXJzX25vcm1hbGl6ZVBhdGhfbWFrZVF1ZXJ5Qm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZHdyaXRlUGFyYW1ldGVyX21ha2VGcmFnbWVudF9ub3JtYWxpemVFc2NhcGVsb3dlckNhc2VmaXJzdERpZ2l0c2Vjb25kRGlnaXRmaXJzdERpZ2l0VmFsdWVzZWNvbmREaWdpdFZhbHVlX2VzY2FwZUNoYXIwMTIzNDU2Nzg5QUJDREVGZmxhZ2VuY29kZWRCeXRlc2J5dGVfbm9ybWFsaXplT3JTdWJzdHJpbmdjaGFyVGFibGVfbm9ybWFsaXplX2lzU2NoZW1lQ2hhcmFjdGVyY2hfaXNHZW5lcmFsRGVsaW1pdGVyX21lcmdlUGF0aHNiYWNrQ291bnRyZWZTdGFydC4uL2Jhc2VFbmRuZXdFbmRfbWF5Q29udGFpbkRvdFNlZ21lbnRzLy5fcmVtb3ZlRG90U2VnbWVudHNhcHBlbmRTbGFzaF9ub3JtYWxpemVSZWxhdGl2ZVBhdGguL19lc2NhcGVTY2hlbWUlM0F0YXJnZXRTY2hlbWV0YXJnZXRVc2VySW5mb3RhcmdldEhvc3R0YXJnZXRQb3J0dGFyZ2V0UGF0aHRhcmdldFF1ZXJ5aGFzRW1wdHlQYXRoaGFzU2NoZW1lbWVyZ2VkUGF0aF93cml0ZUF1dGhvcml0eXNzX2luaXRpYWxpemVUZXh0PyNfdXJpRW5jb2RlY2Fub25pY2FsVGFibGV0ZXh0c3BhY2VUb1BsdXNfaXNBbHBoYWJldGljQ2hhcmFjdGVyX2lzVW5yZXNlcnZlZENoYXJVcmlEYXRhX3NlcGFyYXRvckluZGljZXNfdXJpQ2FjaGVjb2xvbkluZGV4cXVlcnlJbmRleHNvdXJjZVVyaXNsYXNoSW5kZXhJbnZhbGlkIE1JTUUgdHlwZWVxdWFsc0luZGV4bGFzdFNlcGFyYXRvckV4cGVjdGluZyAnPSdpc0Jhc2U2NF9TaW1wbGVVcmlfdXJpX3NjaGVtZUVuZF9ob3N0U3RhcnRfcG9ydFN0YXJ0X3BhdGhTdGFydF9xdWVyeVN0YXJ0X2ZyYWdtZW50U3RhcnRfc2NoZW1lQ2FjaGVfaXNGaWxlX2lzSHR0cF9pc0h0dHBzX2lzUGFja2FnZV90b05vblNpbXBsZV9EYXRhVXJpX291dHN0YW5kaW5nTG9hZFJlcXVlc3RzX3NjYW5uZXJUYWJsZXNzdGlsbE91dHN0YW5kaW5nTG9hZFJlcXVlc3Rzb3V0c3RhbmRpbmdSZXF1ZXN0c19nZXRIYXNoT2JqZWN0X2dldEhhc2hfc2V0SGFzaE9iamVjdF9zZXRIYXNoaGFzaF91bnN1cHBvcnRlZFVyaUJhc2UnVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWRpZGVudGljYWxJZGVudGljYWxfY29tcGFyaXNvbnByaW50X2NyZWF0ZVRhYmxlc3RhYmxlc2J1aWxkZGVmYXVsdFRyYW5zaXRpb25zZXRDaGFyc2NoYXJzdHJhbnNpdGlvbjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LS5ffiEkJicoKSorLDs9QVowOWF6Ky0uX3NjYW5fc3RhcnRzV2l0aERhdGFfc3RyaW5nT3JOdWxsTGVuZ3RoZGFydC5faHR0cGNyeXB0by5kYXJ0aHR0cF9kYXRlLmRhcnRodHRwX2hlYWRlcnMuZGFydGh0dHBfaW1wbC5kYXJ0aHR0cF9wYXJzZXIuZGFydGh0dHBfc2Vzc2lvbi5kYXJ0d2Vic29ja2V0LmRhcnR3ZWJzb2NrZXRfaW1wbC5kYXJ0ZmlsZTovLy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvY3NrYXUvc3JjL3Rlc3RfbWF0cml4L3Nkay90b29scy9ib3RzL2RhcnRfYW90X3Rlc3QuZGFydEBtZXRob2RzZGFydDphc3luY0B0eXBlZGVmc19UaW1lckZhY3RvcnlDbG9zdXJlX1RpbWVyQ2FsbGJhY2tfRXZlbnRHZW5lcmF0b3JfQnJvYWRjYXN0Q2FsbGJhY2tfRXJyb3JDYWxsYmFja19FcnJvclRlc3RfU2lua01hcHBlcl9UcmFuc2Zvcm1EYXRhSGFuZGxlcl9UcmFuc2Zvcm1FcnJvckhhbmRsZXJfVHJhbnNmb3JtRG9uZUhhbmRsZXJfU3Vic2NyaXB0aW9uVHJhbnNmb3JtZXJIYW5kbGVVbmNhdWdodEVycm9ySGFuZGxlclJ1bkhhbmRsZXJSdW5VbmFyeUhhbmRsZXJSdW5CaW5hcnlIYW5kbGVyUmVnaXN0ZXJDYWxsYmFja0hhbmRsZXJSZWdpc3RlclVuYXJ5Q2FsbGJhY2tIYW5kbGVyUmVnaXN0ZXJCaW5hcnlDYWxsYmFja0hhbmRsZXJFcnJvckNhbGxiYWNrSGFuZGxlckNyZWF0ZVRpbWVySGFuZGxlckNyZWF0ZVBlcmlvZGljVGltZXJIYW5kbGVyUHJpbnRIYW5kbGVyRm9ya0hhbmRsZXJAZmllbGRzX2xvYWRlZExpYnJhcmllc19yb290Wm9uZV9mYXRhbF9hc3luY1N0YXJMaXN0ZW5IZWxwZXJfaW52b2tlRXJyb3JIYW5kbGVyX2NvbXBsZXRlV2l0aEVycm9yQ2FsbGJhY2tfYXN5bmNDb21wbGV0ZVdpdGhFcnJvckNhbGxiYWNrX3J1blVzZXJDb2RlX2NhbmNlbEFuZEVycm9yX2NhbmNlbEFuZEVycm9yV2l0aFJlcGxhY2VtZW50X2NhbmNlbEFuZEVycm9yQ2xvc3VyZV9jYW5jZWxBbmRWYWx1ZV9hZGRFcnJvcldpdGhSZXBsYWNlbWVudF9wYXJlbnREZWxlZ2F0ZV9yb290UmVnaXN0ZXJDYWxsYmFja19yb290UmVnaXN0ZXJVbmFyeUNhbGxiYWNrX3Jvb3RSZWdpc3RlckJpbmFyeUNhbGxiYWNrX3Jvb3RFcnJvckNhbGxiYWNrX3Jvb3RDcmVhdGVUaW1lcl9yb290Q3JlYXRlUGVyaW9kaWNUaW1lcl9yb290UHJpbnRfcHJpbnRUb1pvbmVfcm9vdEZvcmtfcnVuWm9uZWRydW5ab25lZEBnZXR0ZXJzQGNvbnN0cnVjdG9yc2NvbnRyb2xsZXJhc3luY1N0YXJCb2R5aXNBZGRpbmdvbkxpc3RlblJlY2VpdmVkaXNTdXNwZW5kZWRBdFlpZWxkY2FuY2VsbGF0aW9uQ29tcGxldGVycnVuQm9keXNjaGVkdWxlR2VuZXJhdG9yYWRkU3RyZWFtX1RpbWVyRmFjdG9yeV9Ccm9hZGNhc3RTdHJlYW1pc0Jyb2FkY2FzdF9TVEFURV9FVkVOVF9JRF9TVEFURV9GSVJJTkdfU1RBVEVfUkVNT1ZFX0FGVEVSX0ZJUklOR19zZXRSZW1vdmVBZnRlckZpcmluZ19TVEFURV9JTklUSUFMX1NUQVRFX0NMT1NFRF9TVEFURV9BRERTVFJFQU1kb25lQHNldHRlcnNfQXNCcm9hZGNhc3RTdHJlYW1Db250cm9sbGVyX2FkZFBlbmRpbmdFdmVudERlZmVycmVkTGlicmFyeWxpYnJhcnlOYW1lbG9hZERlZmVycmVkTG9hZEV4Y2VwdGlvbl9zX2ZhbHNlRnV0dXJlQGZhY3Rvcmllc21pY3JvdGFza3dhaXRhbnlfa1RydWVkb1doaWxlY2F0Y2hFcnJvcmFzU3RyZWFtdGltZW91dFRpbWVvdXRFeGNlcHRpb25kdXJhdGlvbm1hc2tWYWx1ZW1hc2tFcnJvcm1hc2tUZXN0RXJyb3JtYXNrV2hlbmNvbXBsZXRlc3RhdGVDaGFpbnN0YXRlVGhlbnN0YXRlVGhlbk9uZXJyb3JzdGF0ZUNhdGNoZXJyb3JzdGF0ZUNhdGNoZXJyb3JUZXN0c3RhdGVXaGVuY29tcGxldGVfc3RhdGVJbmNvbXBsZXRlX3N0YXRlUGVuZGluZ0NvbXBsZXRlX3N0YXRlQ2hhaW5lZF9zdGF0ZVZhbHVlX3N0YXRlRXJyb3JpbW1lZGlhdGVFcnJvcl9yZWRpcmVjdGluZyNlbXB0eWZyb21GdXR1cmVmcm9tRnV0dXJlc2Zyb21JdGVyYWJsZWV2ZW50VHJhbnNmb3JtZWRjYXN0RnJvbWFzQnJvYWRjYXN0U3RyZWFtd2hlcmVhc3luY01hcGFzeW5jRXhwYW5kZXhwYW5kcGlwZXRyYW5zZm9ybXJlZHVjZWZvbGRldmVyeWNhc3R0b1NldGRyYWludGFrZVdoaWxlc2tpcFdoaWxlZGlzdGluY3RmaXJzdFdoZXJlbGFzdFdoZXJlc2luZ2xlV2hlcmVzaW5nbGVhc0Z1dHVyZVN0cmVhbVZpZXdfc3RyZWFtZnJvbUhhbmRsZXJzZnJvbUJpbmRiaW5kU3RyZWFtSXRlcmF0b3JfQ29udHJvbGxlckV2ZW50U2lua1dyYXBwZXJfU1RBVEVfU1VCU0NSSUJFRF9TVEFURV9DQU5DRUxFRF9TVEFURV9TVUJTQ1JJUFRJT05fTUFTS19TdHJlYW1TaW5rV3JhcHBlcl90YXJnZXRhZGRTdHJlYW1GdXR1cmVhZGRTdWJzY3JpcHRpb25tYWtlRXJyb3JIYW5kbGVyX1NUQVRFX0NBTkNFTF9PTl9FUlJPUl9TVEFURV9JTlBVVF9QQVVTRURfU1RBVEVfV0FJVF9GT1JfQ0FOQ0VMX1NUQVRFX0lOX0NBTExCQUNLX1NUQVRFX0hBU19QRU5ESU5HX1NUQVRFX1BBVVNFX0NPVU5UX2RlY3JlbWVudFBhdXNlQ291bnRfR2VuZXJhdGVkU3RyZWFtSW1wbF9pc1VzZWRfSXRlcmFibGVQZW5kaW5nRXZlbnRzY2xlYXJfU1RBVEVfVU5TQ0hFRFVMRURfU1RBVEVfU0NIRURVTEVEX0RvbmVTdHJlYW1TdWJzY3JpcHRpb25fRE9ORV9TRU5UX1NDSEVEVUxFRF9QQVVTRURfaXNTZW50X2lzU2NoZWR1bGVkX3NjaGVkdWxlX0FzQnJvYWRjYXN0U3RyZWFtX29uTGlzdGVuSGFuZGxlcl9vbkNhbmNlbEhhbmRsZXJfaXNTdWJzY3JpcHRpb25QYXVzZWRfY2FuY2VsU3Vic2NyaXB0aW9uX3BhdXNlU3Vic2NyaXB0aW9uX3Jlc3VtZVN1YnNjcmlwdGlvbl9Ccm9hZGNhc3RTdWJzY3JpcHRpb25XcmFwcGVyX1N0cmVhbUl0ZXJhdG9yX3N0YXRlRGF0YV9pbml0aWFsaXplT3JEb25lX0VtcHR5U3RyZWFtX0ZvcndhcmRpbmdTdHJlYW1faGFuZGxlRGF0YV9oYW5kbGVFcnJvcl9oYW5kbGVEb25lX0ZvcndhcmRpbmdTdHJlYW1TdWJzY3JpcHRpb25fV2hlcmVTdHJlYW1fdGVzdF9NYXBTdHJlYW1fdHJhbnNmb3JtX0V4cGFuZFN0cmVhbV9leHBhbmRfSGFuZGxlRXJyb3JTdHJlYW1fVGFrZVN0cmVhbV9jb3VudF9TdGF0ZVN0cmVhbVN1YnNjcmlwdGlvbl9zaGFyZWRTdGF0ZV9mbGFnX1Rha2VXaGlsZVN0cmVhbV9Ta2lwU3RyZWFtX1NraXBXaGlsZVN0cmVhbV9EaXN0aW5jdFN0cmVhbV9TRU5USU5FTF9FdmVudFNpbmtXcmFwcGVyX1NpbmtUcmFuc2Zvcm1lclN0cmVhbVN1YnNjcmlwdGlvbl90cmFuc2Zvcm1lclNpbmtfaXNTdWJzY3JpYmVkX1N0cmVhbVNpbmtUcmFuc2Zvcm1lcl9zaW5rTWFwcGVyX0JvdW5kU2lua1N0cmVhbV9IYW5kbGVyRXZlbnRTaW5rX1N0cmVhbUhhbmRsZXJUcmFuc2Zvcm1lcl9TdHJlYW1CaW5kVHJhbnNmb3JtZXJfYmluZF9TdHJlYW1TdWJzY3JpcHRpb25UcmFuc2Zvcm1lcl9Cb3VuZFN1YnNjcmlwdGlvblN0cmVhbV9jcmVhdGVQZXJpb2RpY1RpbWVydGlja2lzQWN0aXZlZGFydDpjb3JlWm9uZVNwZWNpZmljYXRpb25jcmVhdGVUaW1lcmNyZWF0ZVBlcmlvZGljVGltZXJmb3JrX1pvbmVTcGVjaWZpY2F0aW9ucm9vdGJpbmRVbmFyeUNhbGxiYWNrYmluZEJpbmFyeUNhbGxiYWNrYmluZEJpbmFyeUNhbGxiYWNrR3VhcmRlZF9ab25lRGVsZWdhdGVfZGVsZWdhdGlvblRhcmdldF9ydW5fcnVuVW5hcnlfcnVuQmluYXJ5X3JlZ2lzdGVyQ2FsbGJhY2tfcmVnaXN0ZXJVbmFyeUNhbGxiYWNrX3JlZ2lzdGVyQmluYXJ5Q2FsbGJhY2tfZXJyb3JDYWxsYmFja19mb3JrX2hhbmRsZVVuY2F1Z2h0RXJyb3JfZGVsZWdhdGVfQ3VzdG9tWm9uZV9kZWxlZ2F0ZUNhY2hlX3Jvb3RNYXBfcm9vdERlbGVnYXRlZGFydDpjb2xsZWN0aW9uX01PRElGSUNBVElPTl9DT1VOVF9NQVNLX2R5bmFtaWNDb21wYXJlX2RlZmF1bHRDb21wYXJlX0lOSVRJQUxfQ0FQQUNJVFlwdXRJZkFic2VudGFkZEFsbF9uZXdLZXlTZXRfSGFzaE1hcEtleUl0ZXJhYmxlX0hhc2hNYXBLZXlJdGVyYXRvcl9IYXNoU2V0X25ld0VtcHR5X3JlbW92ZV9maWx0ZXJXaGVyZV9uZXdTZXRfbmV3U2ltaWxhclNldGxvb2t1cHJlbW92ZUFsbHJlbW92ZVdoZXJlcmV0YWluV2hlcmVfSWRlbnRpdHlIYXNoU2V0X0N1c3RvbUhhc2hTZXRjb250YWluc0FsbF9IYXNoU2V0RW50cnlfSGFzaFNldEl0ZXJhdG9yX3NldF9JTklUSUFMX0lOREVYX0JJVFNfSU5JVElBTF9JTkRFWF9TSVpFX1VOVVNFRF9QQUlSX0RFTEVURURfUEFJUl9zZXREZWxldGVkQXRlbnRyaWVzdXBkYXRldXBkYXRlQWxsYWRkRW50cmllc19fQ29tcGFjdExpbmtlZEhhc2hTZXQmX0hhc2hGaWVsZEJhc2UmX0hhc2hCYXNlX19Db21wYWN0TGlua2VkSGFzaFNldCZfSGFzaEZpZWxkQmFzZSZfSGFzaEJhc2UmX09wZXJhdG9yRXF1YWxzQW5kSGFzaENvZGVfX0NvbXBhY3RMaW5rZWRIYXNoU2V0Jl9IYXNoRmllbGRCYXNlJl9IYXNoQmFzZSZfT3BlcmF0b3JFcXVhbHNBbmRIYXNoQ29kZSZTZXRNaXhpbmZvbGxvd2VkQnl3aGVyZVR5cGVyZXRhaW5BbGx1bmlvbmludGVyc2VjdGlvbmRpZmZlcmVuY2VfQ29tcGFjdExpbmtlZEhhc2hTZXRfZ2V0S2V5T3JEYXRhX19Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoU2V0Jl9Db21wYWN0TGlua2VkSGFzaFNldCZfSWRlbnRpY2FsQW5kSWRlbnRpdHlIYXNoQ29kZV9Db21wYWN0TGlua2VkSWRlbnRpdHlIYXNoU2V0X0NvbXBhY3RMaW5rZWRDdXN0b21IYXNoU2V0aWRlbnRpdHlvZmZyb21JdGVyYWJsZXNmcm9tRW50cmllc0l0ZXJhYmxlTWl4aW5IYXNOZXh0SXRlcmF0b3JfSEFTX05FWFRfQU5EX05FWFRfSU5fQ1VSUkVOVF9OT19ORVhUX05PVF9NT1ZFRF9ZRVRoYXNOZXh0X21vdmVMaW5rZWRIYXNoU2V0aW5zZXJ0QWZ0ZXJpbnNlcnRCZWZvcmVyZXZlcnNlZF9jbG9zZUdhcF9maWx0ZXJfY29tcGFyZUFueXNvcnRzaHVmZmxlYXNNYXBnZXRSYW5nZXJlbW92ZVJhbmdlaW5kZXhXaGVyZWxhc3RJbmRleFdoZXJlaW5zZXJ0cmVtb3ZlQXRpbnNlcnRBbGxzZXRBbGxfZmlsbE1hcFdpdGhNYXBwZWRJdGVyYWJsZV9maWxsTWFwV2l0aEl0ZXJhYmxlc19NYXBCYXNlVmFsdWVJdGVyYWJsZV9NYXBCYXNlVmFsdWVJdGVyYXRvcl9rZXlzYWRkTGFzdF9Eb3VibGVMaW5rX3ByZXZpb3VzTGlua19uZXh0TGlua19saW5rRG91YmxlTGlua2VkUXVldWVFbnRyeWFwcGVuZHByZXBlbmRwcmV2aW91c0VudHJ5bmV4dEVudHJ5X0RvdWJsZUxpbmtlZFF1ZXVlRW50cnlfcXVldWVfYXNOb25TZW50aW5lbEVudHJ5X2FwcGVuZF9wcmVwZW5kX2VsZW1lbnRfRG91YmxlTGlua2VkUXVldWVFbGVtZW50X0RvdWJsZUxpbmtlZFF1ZXVlU2VudGluZWxEb3VibGVMaW5rZWRRdWV1ZV9zZW50aW5lbGZpcnN0RW50cnlsYXN0RW50cnlmb3JFYWNoRW50cnlfRG91YmxlTGlua2VkUXVldWVJdGVyYXRvcl9uZXh0RW50cnlfaGVhZF90YWlsX2lzUG93ZXJPZjJfbmV4dFBvd2VyT2YyX2NoZWNrTW9kaWZpY2F0aW9uX3dyaXRlVG9MaXN0X3ByZUdyb3dfTGlzdFF1ZXVlSXRlcmF0b3JTZXRNaXhpbl9TZXRCYXNlJk9iamVjdCZTZXRNaXhpblNldEJhc2VzZXRUb1N0cmluZ19TZXRCYXNlX1VubW9kaWZpYWJsZVNldF9TcGxheVRyZWVOb2RlbGVmdHJpZ2h0X1NwbGF5VHJlZU1hcE5vZGVfU3BsYXlUcmVlX3NwbGF5Q291bnRfcm9vdF9kdW1teV9jb21wYXJhdG9yX2xhc3RfY29tcGFyZV9zcGxheV9zcGxheU1pbl9zcGxheU1heF9hZGROZXdSb290X2NsZWFyX1NwbGF5VHJlZU1hcCZfU3BsYXlUcmVlJk1hcE1peGluU3BsYXlUcmVlTWFwZmlyc3RLZXlsYXN0S2V5QmVmb3JlZmlyc3RLZXlBZnRlcl9TcGxheVRyZWVJdGVyYXRvcl90cmVlX3dvcmtMaXN0X2N1cnJlbnROb2RlX2ZpbmRMZWZ0TW9zdERlc2NlbmRlbnRfcmVidWlsZFdvcmtMaXN0X2dldFZhbHVlc3RhcnRBdF9TcGxheVRyZWVLZXlJdGVyYWJsZV9TcGxheVRyZWVWYWx1ZUl0ZXJhYmxlX1NwbGF5VHJlZUtleUl0ZXJhdG9yX1NwbGF5VHJlZVZhbHVlSXRlcmF0b3JfU3BsYXlUcmVlTm9kZUl0ZXJhdG9yX1NwbGF5VHJlZVNldCZfU3BsYXlUcmVlJkl0ZXJhYmxlTWl4aW5fU3BsYXlUcmVlU2V0Jl9TcGxheVRyZWUmSXRlcmFibGVNaXhpbiZTZXRNaXhpblNwbGF5VHJlZVNldF9jbG9uZV9jb3B5Tm9kZWRhcnQ6Y29udmVydF9hc2NpaU1hc2tfcGFkZGluZ0NoYXJfbGF0aW4xTWFza19MRl9DUl9PTkVfQllURV9MSU1JVF9UV09fQllURV9MSU1JVF9USFJFRV9CWVRFX0xJTUlUX0ZPVVJfQllURV9MSU1JVF9TVVJST0dBVEVfVEFHX01BU0tfU1VSUk9HQVRFX1ZBTFVFX01BU0tfTEVBRF9TVVJST0dBVEVfTUlOX1RBSUxfU1VSUk9HQVRFX01JTmJhc2U2NFVybGh0bWxFc2NhcGV1bmljb2RlUmVwbGFjZW1lbnRDaGFyYWN0ZXJSdW5ldW5pY29kZUJvbUNoYXJhY3RlclJ1bmVfcGFyc2VEb3VibGVfcGFyc2VKc29uYmFzZTY0RW5jb2RlYmFzZTY0VXJsRW5jb2RlYmFzZTY0RGVjb2RlanNvbkVuY29kZWpzb25EZWNvZGVfSnNvblV0ZjhEZWNvZGVyc3RhcnRDaHVua2VkQ29udmVyc2lvbl9Kc29uTGlzdGVuZXJoYW5kbGVTdHJpbmdoYW5kbGVOdW1iZXJoYW5kbGVCb29saGFuZGxlTnVsbGJlZ2luT2JqZWN0cHJvcGVydHlOYW1lcHJvcGVydHlWYWx1ZWVuZE9iamVjdGJlZ2luQXJyYXlhcnJheUVsZW1lbnRlbmRBcnJheV9CdWlsZEpzb25MaXN0ZW5lcnN0YWNrY3VycmVudENvbnRhaW5lcnB1c2hDb250YWluZXJwb3BDb250YWluZXJfUmV2aXZlckpzb25MaXN0ZW5lcnJldml2ZXJfTnVtYmVyQnVmZmVybWluQ2FwYWNpdHlrRGVmYXVsdE92ZXJoZWFkX2luaXRpYWxDYXBhY2l0eWVuc3VyZUNhcGFjaXR5Z2V0U3RyaW5ncGFyc2VOdW1wYXJzZURvdWJsZV9DaHVua2VkSnNvblBhcnNlclRPUF9MRVZFTElOU0lERV9BUlJBWUlOU0lERV9PQkpFQ1RBRlRFUl9DT0xPTkFMTE9XX1NUUklOR19NQVNLQUxMT1dfVkFMVUVfTUFTS0FMTE9XX1ZBTFVFU1RSSU5HX09OTFlOT19WQUxVRVNFTVBUWU5PTl9FTVBUWUVNUFRZX01BU0tTVEFURV9JTklUSUFMU1RBVEVfRU5EU1RBVEVfQVJSQVlfRU1QVFlTVEFURV9BUlJBWV9WQUxVRVNUQVRFX0FSUkFZX0NPTU1BU1RBVEVfT0JKRUNUX0VNUFRZU1RBVEVfT0JKRUNUX0tFWVNUQVRFX09CSkVDVF9DT0xPTlNUQVRFX09CSkVDVF9WQUxVRVNUQVRFX09CSkVDVF9DT01NQVZBTFVFX1JFQURfQklUU0JBQ0tTUEFDRVRBQk5FV0xJTkVDQVJSSUFHRV9SRVRVUk5GT1JNX0ZFRURTUEFDRVFVT1RFUExVU0NPTU1BTUlOVVNERUNJTUFMUE9JTlRTTEFTSENIQVJfMENIQVJfOUNPTE9OQ0hBUl9FTEJSQUNLRVRCQUNLU0xBU0hSQlJBQ0tFVENIQVJfYUNIQVJfYkNIQVJfZUNIQVJfZkNIQVJfbENIQVJfbkNIQVJfckNIQVJfc0NIQVJfdENIQVJfdUxCUkFDRVJCUkFDRU5PX1BBUlRJQUxQQVJUSUFMX1NUUklOR1BBUlRJQUxfTlVNRVJBTFBBUlRJQUxfS0VZV09SRE1BU0tfUEFSVElBTE5VTV9TSUdOTlVNX1pFUk9OVU1fRElHSVROVU1fRE9UTlVNX0RPVF9ESUdJVE5VTV9FTlVNX0VfU0lHTk5VTV9FX0RJR0lUTlVNX1NVQ0NFU1NTVFJfUExBSU5TVFJfRVNDQVBFU1RSX1VTVFJfVV9DT1VOVF9TSElGVFNUUl9VX1ZBTFVFX1NISUZUS1dEX1RZUEVfTUFTS0tXRF9UWVBFX1NISUZUS1dEX05VTExLV0RfVFJVRUtXRF9GQUxTRUtXRF9CT01LV0RfQ09VTlRfU0hJRlRUV09fQklUX01BU0tzdGF0ZXNwYXJ0aWFsU3RhdGVzYXZlU3RhdGVyZXN0b3JlU3RhdGVnZXRDaGFyY29weUNoYXJzVG9MaXN0YmVnaW5TdHJpbmdhZGRDaGFyVG9TdHJpbmdhZGRTbGljZVRvU3RyaW5nZW5kU3RyaW5ncGFyc2VQYXJ0aWFscGFyc2VQYXJ0aWFsTnVtYmVycGFyc2VQYXJ0aWFsU3RyaW5ncGFyc2VQYXJ0aWFsS2V5d29yZHBhcnNlSGV4RGlnaXRwYXJzZVRydWVwYXJzZUZhbHNlcGFyc2VOdWxscGFyc2VLZXl3b3JkUHJlZml4cGFyc2VTdHJpbmdjaHVua1N0cmluZ2NodW5rU3RyaW5nRXNjYXBlVXBhcnNlU3RyaW5nVG9CdWZmZXJwYXJzZVN0cmluZ0VzY2FwZWJlZ2luQ2h1bmtOdW1iZXJhZGROdW1iZXJDaHVua2NvbnRpbnVlQ2h1bmtOdW1iZXJmaW5pc2hDaHVua051bWJlcnBhcnNlTnVtYmVyZmFpbGNodW5rRW5kY2h1bmtfSnNvblN0cmluZ1BhcnNlcl9Kc29uU3RyaW5nRGVjb2RlclNpbmtfcGFyc2VyX2NyZWF0ZVBhcnNlcmFkZFNsaWNlYXNVdGY4U2lua19VdGY4U3RyaW5nQnVmZmVySU5JVElBTF9DQVBBQ0lUWU1BU0tfVFdPX0JJVE1BU0tfU0laRVNISUZUX01JU1NJTkdTSElGVF9WQUxVRU1BWF9BU0NJSU1BWF9UV09fQllURU1BWF9USFJFRV9CWVRFTUFYX1VOSUNPREVNQVNLX1RXT19CWVRFTUFTS19USFJFRV9CWVRFTUFTS19GT1VSX0JZVEVNQVNLX0NPTlRJTlVFX1RBR01BU0tfQ09OVElOVUVfVkFMVUVDT05USU5VRV9UQUdMRUFEX1NVUlJPR0FURVRBSUxfU1VSUk9HQVRFU0hJRlRfSElHSF9TVVJST0dBVEVNQVNLX0xPV19TVVJST0dBVEVhZGRDb250aW51YXRpb25hZGRDaGFyQ29kZV90bzE2Qml0X0pzb25VdGY4UGFyc2VyX0pzb25VdGY4RGVjb2RlclNpbmtfYWRkQ2h1bmtfVW5pY29kZVN1YnNldEVuY29kZXJfc3Vic2V0TWFza0FzY2lpRW5jb2Rlcl9Vbmljb2RlU3Vic2V0RW5jb2RlclNpbmtfVW5pY29kZVN1YnNldERlY29kZXJfY29udmVydEludmFsaWRBc2NpaURlY29kZXJfRXJyb3JIYW5kbGluZ0FzY2lpRGVjb2RlclNpbmtfdXRmOFNpbmtfU2ltcGxlQXNjaWlEZWNvZGVyU2lua3VybFNhZmVfQmFzZTY0RW5jb2Rlcl9iYXNlNjRBbHBoYWJldF9iYXNlNjRVcmxBbHBoYWJldF92YWx1ZVNoaWZ0X2NvdW50TWFza19zaXhCaXRNYXNrX2FscGhhYmV0X2VuY29kZVN0YXRlX3N0YXRlQml0c19zdGF0ZUNvdW50Y3JlYXRlQnVmZmVyZW5jb2RlQ2h1bmt3cml0ZUZpbmFsQ2h1bmtfQnVmZmVyQ2FjaGluZ0Jhc2U2NEVuY29kZXJidWZmZXJDYWNoZV9CYXNlNjRFbmNvZGVyU2lua19Bc2NpaUJhc2U2NEVuY29kZXJTaW5rX1V0ZjhCYXNlNjRFbmNvZGVyU2lua0Jhc2U2NERlY29kZXJfaW52YWxpZF9wYWRkaW5nX19fcF9jaGFyX3BlcmNlbnRfY2hhcl8zX2NoYXJfZF9lbmNvZGVDaGFyYWN0ZXJTdGF0ZV9lbmNvZGVQYWRkaW5nU3RhdGVfc3RhdGVQYWRkaW5nX2hhc1NlZW5QYWRkaW5nX2FsbG9jYXRlQnVmZmVyX3RyaW1QYWRkaW5nQ2hhcnNkZWNvZGVDaHVua19CYXNlNjREZWNvZGVyU2lua19kZWNvZGVyQnl0ZUNvbnZlcnNpb25TaW5rd2l0aENhbGxiYWNrQnl0ZUNvbnZlcnNpb25TaW5rQmFzZV9CeXRlQWRhcHRlclNpbmtfQnl0ZUNhbGxiYWNrU2lua19JTklUSUFMX0JVRkZFUl9TSVpFX3JvdW5kVG9Qb3dlck9mMkNodW5rZWRDb252ZXJzaW9uU2lua19TaW1wbGVDYWxsYmFja1NpbmtfYWNjdW11bGF0ZWRfQ29udmVydGVyU3RyZWFtRXZlbnRTaW5rX2V2ZW50U2lua19jaHVua2VkU2lua2Z1c2VpbnZlcnRlZF9GdXNlZENvZGVjX3NlY29uZF9JbnZlcnRlZENvZGVjX2NvZGVjX0Z1c2VkQ29udmVydGVyX25hbWVUb0VuY29kaW5nZGVjb2RlU3RyZWFtZ2V0QnlOYW1lSHRtbEVzY2FwZU1vZGVlc2NhcGVMdEd0ZXNjYXBlUXVvdGVzY2FwZUFwb3Nlc2NhcGVTbGFzaHVua25vd25hdHRyaWJ1dGVzcUF0dHJpYnV0ZUh0bWxFc2NhcGVtb2RlX2NvbnZlcnRfSHRtbEVzY2FwZVNpbmtfZXNjYXBld2l0aFJldml2ZXJ3aXRoSW5kZW50SnNvblV0ZjhFbmNvZGVyX2RlZmF1bHRCdWZmZXJTaXplX2J1ZmZlclNpemVERUZBVUxUX0JVRkZFUl9TSVpFX3V0ZjhFbmNvZGVfSnNvbkVuY29kZXJTaW5rX2lzRG9uZV9Kc29uVXRmOEVuY29kZXJTaW5rSnNvbkRlY29kZXJiYWNrc3BhY2V0YWJuZXdsaW5lY2FycmlhZ2VSZXR1cm5mb3JtRmVlZHF1b3RlY2hhcl8wYmFja3NsYXNoY2hhcl9iY2hhcl9mY2hhcl9uY2hhcl9yY2hhcl90Y2hhcl91X0pzb25VdGY4U3RyaW5naWZpZXJhZGRDaHVua3dyaXRlQXNjaWlTdHJpbmd3cml0ZU11bHRpQnl0ZUNoYXJDb2Rld3JpdGVGb3VyQnl0ZUNoYXJDb2Rld3JpdGVCeXRlX19Kc29uVXRmOFN0cmluZ2lmaWVyUHJldHR5Jl9Kc29uVXRmOFN0cmluZ2lmaWVyJl9Kc29uUHJldHR5UHJpbnRNaXhpbl9Kc29uVXRmOFN0cmluZ2lmaWVyUHJldHR5TGF0aW4xRW5jb2RlckxhdGluMURlY29kZXJfTGF0aW4xRGVjb2RlclNpbmtfYWRkU2xpY2VUb1NpbmtfY2hlY2tWYWxpZExhdGluMV9yZXBvcnRJbnZhbGlkTGF0aW4xX0xhdGluMUFsbG93SW52YWxpZERlY29kZXJTaW5rTGluZVNwbGl0dGVyX0xpbmVTcGxpdHRlclNpbmtfc2tpcExlYWRpbmdMRl9hZGRMaW5lc19MaW5lU3BsaXR0ZXJFdmVudFNpbmtmcm9tU3RyaW5nU2lua2FzU3RyaW5nU2lua0Nsb3NhYmxlU3RyaW5nU2lua19DbG9zYWJsZVN0cmluZ1NpbmtfU3RyaW5nQ29udmVyc2lvblNpbmtBc1N0cmluZ1NpbmtBZGFwdGVyX01JTl9TVFJJTkdfU0laRV9mbHVzaFN0cmluZ0NvbnZlcnNpb25TaW5rQmFzZVN0cmluZ0NvbnZlcnNpb25TaW5rTWl4aW5fU3RyaW5nU2lua0NvbnZlcnNpb25TaW5rX1N0cmluZ0NhbGxiYWNrU2lua19TdHJpbmdBZGFwdGVyU2lua19VdGY4U3RyaW5nU2lua0FkYXB0ZXJfVXRmOENvbnZlcnNpb25TaW5rX0RFRkFVTFRfQllURV9CVUZGRVJfU0laRV9fVXRmOEVuY29kZXJTaW5rJl9VdGY4RW5jb2RlciZTdHJpbmdDb252ZXJzaW9uU2lua01peGluX1V0ZjhFbmNvZGVyU2lua19MSU1JVFNkYXJ0OmRldmVsb3BlclRpbWVsaW5lU3luY0Z1bmN0aW9uVGltZWxpbmVBc3luY0Z1bmN0aW9uX25leHRTZXF1ZW5jZU51bWJlcl9oYXNUaW1lbGluZV9ydW5FeHRlbnNpb25fcG9zdFJlc3BvbnNlX2dldEN1cnJlbnRUYWdfZ2V0RGVmYXVsdFRhZ19wb3N0RXZlbnRfZ2V0U2VydmVySW5mb193ZWJTZXJ2ZXJDb250cm9sX2dldFNlcnZpY2VNYWpvclZlcnNpb25fZ2V0U2VydmljZU1pbm9yVmVyc2lvbl9nZXRJc29sYXRlSURGcm9tU2VuZFBvcnRfYXJndW1lbnRzQXNKc29uX2lzRGFydFN0cmVhbUVuYWJsZWRfZ2V0TmV4dEFzeW5jSWRfZ2V0VHJhY2VDbG9ja19nZXRUaHJlYWRDcHVDbG9ja19yZXBvcnRUYXNrRXZlbnRfcmVwb3J0Q29tcGxldGVFdmVudF9yZXBvcnRGbG93RXZlbnRfcmVwb3J0SW5zdGFudEV2ZW50ZGVidWdnZXJpbnNwZWN0cG9zdEV2ZW50bGFiZWxtYWtlQ3VycmVudGtJbnZhbGlkUGFyYW1za0V4dGVuc2lvbkVycm9ya0V4dGVuc2lvbkVycm9yTWF4a0V4dGVuc2lvbkVycm9yTWluaW52YWxpZFBhcmFtc2V4dGVuc2lvbkVycm9yZXh0ZW5zaW9uRXJyb3JNYXhleHRlbnNpb25FcnJvck1pbl9lcnJvckNvZGVNZXNzYWdlX3ZhbGlkYXRlRXJyb3JDb2RlX2lzRXJyb3JNQVhfVVNFUl9UQUdTZGVmYXVsdFRhZ2Rlc2NyaXB0aW9uX3RvSlNPTl9tZXRyaWNzcmVnaXN0ZXJkZXJlZ2lzdGVyX3ByaW50TWV0cmljX3ByaW50TWV0cmljc1NlcnZpY2VQcm90b2NvbEluZm9tYWpvclZlcnNpb25taW5vclZlcnNpb25zZXJ2ZXJVcmlTZXJ2aWNlZ2V0SW5mb2NvbnRyb2xXZWJTZXJ2ZXJnZXRJc29sYXRlSURGbG93X2JlZ2luYmVnaW5zdGVwVGltZWxpbmVfc3RhY2tzdGFydFN5bmNmaW5pc2hTeW5jaW5zdGFudFN5bmN0aW1lU3luY1RpbWVsaW5lVGFza190YXNrSWRpbnN0YW50ZmluaXNocGFzc3dpdGhUYXNrSWRfQXN5bmNCbG9ja2NhdGVnb3J5X2ZpbmlzaF9TeW5jQmxvY2tfc3RhcnRDcHVfZmxvd2Zsb3dkYXJ0OmZmaXN0cnVjdHVuc2l6ZWRfb3BlbmFsbG9jYXRlZnJvbUFkZHJlc3NzaXplT2Zmcm9tRnVuY3Rpb25zdG9yZW9mZnNldEJ5YXNGdW5jdGlvbmZyZWVTdHJ1Y3REYXJ0UmVwcmVzZW50YXRpb25PZmxvb2t1cEZ1bmN0aW9ub3BlbmRhcnQ6X2ludGVybmFsX0VsZW1lbnRQcmVkaWNhdGVfRXhwYW5kRnVuY3Rpb25fY2xhc3NSYW5nZUNoZWNrTmVnYXRpdmVfZ3Jvd1JlZ0V4cFN0YWNrX2NoZWNrQ291bnRleHRyYWN0VHlwZUFyZ3VtZW50c19zdHJpbmdzdHJpbmdPZmNvbnRpbnVlX3N3aXRjaGluZ1Byb3RvY29sc3Byb2Nlc3Npbmdva2NyZWF0ZWRhY2NlcHRlZG5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbm5vQ29udGVudHJlc2V0Q29udGVudHBhcnRpYWxDb250ZW50bXVsdGlTdGF0dXNhbHJlYWR5UmVwb3J0ZWRpbVVzZWRtdWx0aXBsZUNob2ljZXNtb3ZlZFBlcm1hbmVudGx5Zm91bmRtb3ZlZFRlbXBvcmFyaWx5c2VlT3RoZXJub3RNb2RpZmllZHVzZVByb3h5dGVtcG9yYXJ5UmVkaXJlY3RwZXJtYW5lbnRSZWRpcmVjdGJhZFJlcXVlc3R1bmF1dGhvcml6ZWRwYXltZW50UmVxdWlyZWRmb3JiaWRkZW5ub3RGb3VuZG1ldGhvZE5vdEFsbG93ZWRub3RBY2NlcHRhYmxlcHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkcmVxdWVzdFRpbWVvdXRjb25mbGljdGdvbmVsZW5ndGhSZXF1aXJlZHByZWNvbmRpdGlvbkZhaWxlZHJlcXVlc3RFbnRpdHlUb29MYXJnZXJlcXVlc3RVcmlUb29Mb25ndW5zdXBwb3J0ZWRNZWRpYVR5cGVyZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlZXhwZWN0YXRpb25GYWlsZWRtaXNkaXJlY3RlZFJlcXVlc3R1bnByb2Nlc3NhYmxlRW50aXR5bG9ja2VkZmFpbGVkRGVwZW5kZW5jeXVwZ3JhZGVSZXF1aXJlZHByZWNvbmRpdGlvblJlcXVpcmVkdG9vTWFueVJlcXVlc3RzcmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlY29ubmVjdGlvbkNsb3NlZFdpdGhvdXRSZXNwb25zZXVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zY2xpZW50Q2xvc2VkUmVxdWVzdGludGVybmFsU2VydmVyRXJyb3Jub3RJbXBsZW1lbnRlZGJhZEdhdGV3YXlzZXJ2aWNlVW5hdmFpbGFibGVnYXRld2F5VGltZW91dGh0dHBWZXJzaW9uTm90U3VwcG9ydGVkdmFyaWFudEFsc29OZWdvdGlhdGVzaW5zdWZmaWNpZW50U3RvcmFnZWxvb3BEZXRlY3RlZG5vdEV4dGVuZGVkbmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWRuZXR3b3JrQ29ubmVjdFRpbWVvdXRFcnJvckNPTlRJTlVFU1dJVENISU5HX1BST1RPQ09MU09LQ1JFQVRFREFDQ0VQVEVETk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT05OT19DT05URU5UUkVTRVRfQ09OVEVOVFBBUlRJQUxfQ09OVEVOVE1VTFRJUExFX0NIT0lDRVNNT1ZFRF9QRVJNQU5FTlRMWUZPVU5ETU9WRURfVEVNUE9SQVJJTFlTRUVfT1RIRVJOT1RfTU9ESUZJRURVU0VfUFJPWFlURU1QT1JBUllfUkVESVJFQ1RCQURfUkVRVUVTVFVOQVVUSE9SSVpFRFBBWU1FTlRfUkVRVUlSRURGT1JCSURERU5OT1RfRk9VTkRNRVRIT0RfTk9UX0FMTE9XRUROT1RfQUNDRVBUQUJMRVBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEUkVRVUVTVF9USU1FT1VUQ09ORkxJQ1RHT05FTEVOR1RIX1JFUVVJUkVEUFJFQ09ORElUSU9OX0ZBSUxFRFJFUVVFU1RfRU5USVRZX1RPT19MQVJHRVJFUVVFU1RfVVJJX1RPT19MT05HVU5TVVBQT1JURURfTUVESUFfVFlQRVJFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEVFWFBFQ1RBVElPTl9GQUlMRURVUEdSQURFX1JFUVVJUkVESU5URVJOQUxfU0VSVkVSX0VSUk9STk9UX0lNUExFTUVOVEVEQkFEX0dBVEVXQVlTRVJWSUNFX1VOQVZBSUxBQkxFR0FURVdBWV9USU1FT1VUSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURURORVRXT1JLX0NPTk5FQ1RfVElNRU9VVF9FUlJPUkNhc3RTdHJlYW1TdWJzY3JpcHRpb25fQ2FzdEl0ZXJhYmxlQmFzZUNhc3RJdGVyYXRvckNhc3RJdGVyYWJsZV9FZmZpY2llbnRMZW5ndGhDYXN0SXRlcmFibGVfX0Nhc3RMaXN0QmFzZSZfQ2FzdEl0ZXJhYmxlQmFzZSZMaXN0TWl4aW5fQ2FzdExpc3RCYXNlQ2FzdExpc3RDYXN0U2V0X2VtcHR5U2V0X2RlZmF1bHRFbXB0eVNldF9jb25kaXRpb25hbEFkZENhc3RNYXBDYXN0UXVldWVXaGVyZUl0ZXJhdG9yRXhwYW5kSXRlcmF0b3JfY3VycmVudEV4cGFuc2lvblRha2VJdGVyYWJsZV90YWtlQ291bnRFZmZpY2llbnRMZW5ndGhUYWtlSXRlcmFibGVUYWtlSXRlcmF0b3JfcmVtYWluaW5nVGFrZVdoaWxlSXRlcmF0b3JfaXNGaW5pc2hlZFNraXBJdGVyYWJsZV9za2lwQ291bnRFZmZpY2llbnRMZW5ndGhTa2lwSXRlcmFibGVTa2lwSXRlcmF0b3JTa2lwV2hpbGVJdGVyYXRvcl9oYXNTa2lwcGVkZmlyc3RFZmZpY2llbnRFZmZpY2llbnRMZW5ndGhGb2xsb3dlZEJ5SXRlcmFibGVGb2xsb3dlZEJ5SXRlcmF0b3JfY3VycmVudEl0ZXJhdG9yX25leHRJdGVyYWJsZVdoZXJlVHlwZUl0ZXJhdG9ydG9vTWFueV9MaXN0SW5kaWNlc0l0ZXJhYmxlX2JhY2tlZExpc3RfdmFsdWVzVW5tb2RpZmlhYmxlTGlzdEVycm9yY2hhbmdlTm9uR3Jvd2FibGVMaXN0RXJyb3JfSU5TRVJUSU9OX1NPUlRfVEhSRVNIT0xEc29ydFJhbmdlX2RvU29ydF9pbnNlcnRpb25Tb3J0X2R1YWxQaXZvdFF1aWNrc29ydHJlc2VydmVkV29yZFJFcHVibGljSWRlbnRpZmllclJFaWRlbnRpZmllclJFb3BlcmF0b3JSRXB1YmxpY1N5bWJvbFBhdHRlcm5zeW1ib2xQYXR0ZXJudmFsaWRhdGVQdWJsaWNTeW1ib2xpc1ZhbGlkU3ltYm9sdmFsaWRhdGVkZGFydDppc29sYXRlX051bGxhcnlGdW5jdGlvbl9SZWNlaXZlUG9ydEltcGxfcmF3UG9ydGZyb21SYXdSZWNlaXZlUG9ydF9sZWZ0Q2hpbGRfcmlnaHRDaGlsZF9OT19USU1FUl9aRVJPX0VWRU5UX1RJTUVPVVRfRVZFTlRfSURfTUFTS19pc0luSGVhcF9yb290VXJpX1BBVVNFX1JFU1VNRV9QSU5HX0tJTExfQUREX0VYSVRfREVMX0VYSVRfQUREX0VSUk9SX0RFTF9FUlJPUl9FUlJPUl9GQVRBTGJlZm9yZU5leHRFdmVudF9wYWNrYWdlU3VwcG9ydGVkX3NwYXduQ29tbW9uX3NwYXduRnVuY3Rpb25fc3Bhd25Vcmlfc2VuZE9PQl9nZXREZWJ1Z05hbWVfZ2V0Q3VycmVudFJvb3RVcmlfZ2V0Q3VycmVudFJvb3RVcmlTdHJyZXNvbHZlUGFja2FnZVVyaXNwYXduc3Bhd25VcmlhZGRPbkV4aXRMaXN0ZW5lcnJlbW92ZU9uRXhpdExpc3RlbmVyc2V0RXJyb3JzRmF0YWxraWxscGluZ2FkZEVycm9yTGlzdGVuZXJyZW1vdmVFcnJvckxpc3RlbmVyZGVidWdOYW1lcGFja2FnZUNvbmZpZ2Vycm9yc1JlbW90ZUVycm9yX2Rlc2NyaXB0aW9uZGFydDptYXRobG4xMGxuMmxvZzJlbG9nMTBlcGlzcXJ0MV8yc3FydDJfZG91YmxlUG93X3Bvd19pbnRQb3dfYXRhbjJfc2luX2Nvc190YW5fYWNvc19hc2luX2F0YW5fc3FydF9leHBfY2xhbXBUb1plcm9hdGFuMnBvd3NpbmNvc3RhbmFjb3Nhc2luYXRhbnNxcnRleHBfa1NUQVRFX0xPX2tTVEFURV9ISV9QT1cyXzMyX1BPVzJfNTNfRF9QT1cyXzI3X0RuZXh0RG91YmxlbmV4dEJvb2xfU2VjdXJlUmFuZG9tX2dldEJ5dGVzX0plbmtpbnNTbWlIYXNoY29tYmluZWhhc2gyaGFzaDRQb2ludHlkaXN0YW5jZVRvc3F1YXJlZERpc3RhbmNlVG9tYWduaXR1ZGVzZWN1cmVfUmVjdGFuZ2xlQmFzZXRvcHdpZHRoaGVpZ2h0Ym90dG9tdG9wTGVmdHRvcFJpZ2h0Ym90dG9tUmlnaHRib3R0b21MZWZ0aW50ZXJzZWN0c2JvdW5kaW5nQm94Y29udGFpbnNSZWN0YW5nbGVjb250YWluc1BvaW50UmVjdGFuZ2xlZnJvbVBvaW50c011dGFibGVSZWN0YW5nbGVfd2lkdGhfaGVpZ2h0ZGFydDptaXJyb3JzX2RpcnR5X25fY29tcHV0ZVF1YWxpZmllZE5hbWVfbWFrZVNpZ25hdHVyZVN0cmluZ19sb2NhdGlvbl9tZXRhZGF0YV9zdWJ0eXBlVGVzdF9hc1NldHRlcmN1cnJlbnRNaXJyb3JTeXN0ZW1yZWZsZWN0cmVmbGVjdENsYXNzcmVmbGVjdFR5cGVfSW50ZXJuYWxNaXJyb3JFcnJvcl9Mb2NhbE1pcnJvclN5c3RlbWR5bmFtaWNUeXBldm9pZFR5cGVfbGlicmFyaWVzX2lzb2xhdGVsaWJyYXJpZXNpc29sYXRlX2NvbXB1dGVMaWJyYXJpZXNfY29tcHV0ZUlzb2xhdGVfU291cmNlTG9jYXRpb25fTG9jYWxNaXJyb3JfTG9jYWxJc29sYXRlTWlycm9ycm9vdExpYnJhcnlpc0N1cnJlbnRsb2FkVXJpX2xvYWRVcmlfU3ludGhldGljQWNjZXNzb3JzaW1wbGVOYW1laXNHZXR0ZXJpc1N0YXRpY2lzVG9wTGV2ZWxpc1N5bnRoZXRpY2lzUmVndWxhck1ldGhvZGlzT3BlcmF0b3Jpc0NvbnN0cnVjdG9yaXNDb25zdENvbnN0cnVjdG9yaXNHZW5lcmF0aXZlQ29uc3RydWN0b3Jpc0ZhY3RvcnlDb25zdHJ1Y3RvcmlzRXh0ZXJuYWxpc1JlZGlyZWN0aW5nQ29uc3RydWN0b3Jpc0Fic3RyYWN0aXNTZXR0ZXJpc1ByaXZhdGVxdWFsaWZpZWROYW1lY29uc3RydWN0b3JOYW1lcmV0dXJuVHlwZWxvY2F0aW9ubWV0YWRhdGFfU3ludGhldGljU2V0dGVyUGFyYW1ldGVyaXNPcHRpb25hbGlzTmFtZWRpc0NvbnN0aXNGaW5hbGhhc0RlZmF1bHRWYWx1ZWRlZmF1bHRWYWx1ZV9Mb2NhbE9iamVjdE1pcnJvcl9yZWZsZWN0ZWVfaW52b2tlX2ludm9rZUdldHRlcl9pbnZva2VTZXR0ZXJpbnZva2VnZXRGaWVsZHNldEZpZWxkZGVsZWdhdGVfTG9jYWxJbnN0YW5jZU1pcnJvcmhhc1JlZmxlY3RlZXJlZmxlY3RlZV9jb21wdXRlVHlwZV9Mb2NhbENsb3N1cmVNaXJyb3JhcHBseV9jb21wdXRlRnVuY3Rpb25fTG9jYWxUeXBlTWlycm9yX3JlZmxlY3RlZFR5cGVfTG9jYWxDbGFzc01pcnJvcl9zaW1wbGVOYW1lX293bmVyX2lzR2VuZXJpY19pc1RyYW5zZm9ybWVkTWl4aW5BcHBsaWNhdGlvbl9pc0dlbmVyaWNEZWNsYXJhdGlvbl9pbnN0YW50aWF0b3JfcXVhbGlmaWVkTmFtZV90cnVlU3VwZXJjbGFzc0ZpZWxkX3N1cGVyaW50ZXJmYWNlc19taXhpbl9jYWNoZWRTdGF0aWNNZW1iZXJzX2NhY2hlZEluc3RhbmNlTWVtYmVyc19kZWNsYXJhdGlvbnNfdHlwZVZhcmlhYmxlc2lzRW51bWhhc1JlZmxlY3RlZFR5cGVyZWZsZWN0ZWRUeXBlX3RydWVTdXBlcmNsYXNzX21peGluQXBwbGljYXRpb25OYW1lX2lzQW5vbnltb3VzTWl4aW5BcHBsaWNhdGlvbnN1cGVyY2xhc3NzdXBlcmludGVyZmFjZXNtaXhpbnN0YXRpY01lbWJlcnNpbnN0YW5jZU1lbWJlcnNkZWNsYXJhdGlvbnN0eXBlVmFyaWFibGVzaXNPcmlnaW5hbERlY2xhcmF0aW9ub3JpZ2luYWxEZWNsYXJhdGlvbm5ld0luc3RhbmNlaXNTdWJ0eXBlT2Zpc0Fzc2lnbmFibGVUb2lzU3ViY2xhc3NPZl9saWJyYXJ5VXJpX3N1cGVydHlwZV9zdXBlcnR5cGVJbnN0YW50aWF0ZWRfbmF0aXZlSW50ZXJmYWNlc19uYXRpdmVJbnRlcmZhY2VzSW5zdGFudGlhdGVkX25hdGl2ZU1peGluX25hdGl2ZU1peGluSW5zdGFudGlhdGVkX2NvbXB1dGVNZW1iZXJzX2NvbXB1dGVDb25zdHJ1Y3RvcnNfaW52b2tlQ29uc3RydWN0b3JfQ2xhc3NNaXJyb3JfdHlwZV92YXJpYWJsZXNfY29tcHV0ZVR5cGVBcmd1bWVudHNfTG9jYWxGdW5jdGlvblR5cGVNaXJyb3JfZnVuY3Rpb25SZWZsZWN0ZWVfY2FsbE1ldGhvZF9yZXR1cm5UeXBlX3BhcmFtZXRlcnNjYWxsTWV0aG9kX0Z1bmN0aW9uVHlwZU1pcnJvcl9jYWxsX21ldGhvZF9GdW5jdGlvblR5cGVNaXJyb3JfcmV0dXJuX3R5cGVfRnVuY3Rpb25UeXBlTWlycm9yX3BhcmFtZXRlcnNfTG9jYWxEZWNsYXJhdGlvbk1pcnJvcl9Mb2NhbFR5cGVWYXJpYWJsZU1pcnJvcl91cHBlckJvdW5kdXBwZXJCb3VuZF9UeXBlVmFyaWFibGVNaXJyb3Jfb3duZXJfVHlwZVZhcmlhYmxlTWlycm9yX3VwcGVyX2JvdW5kX0xvY2FsVHlwZWRlZk1pcnJvcl9yZWZlcmVudHJlZmVyZW50X25hdGl2ZVJlZmVyZW50X25hdGl2ZURlY2xhcmF0aW9uX0xvY2FsTGlicmFyeU1pcnJvcl9jYWNoZWRMaWJyYXJ5RGVwZW5kZW5jaWVzbGlicmFyeURlcGVuZGVuY2llc19saWJyYXJ5RGVwZW5kZW5jaWVzX0xvY2FsTGlicmFyeURlcGVuZGVuY3lNaXJyb3Jzb3VyY2VMaWJyYXJ5X3RhcmdldE1pcnJvck9yUHJlZml4Y29tYmluYXRvcnNpc0ltcG9ydGlzRGVmZXJyZWRpc0V4cG9ydHRhcmdldExpYnJhcnlsb2FkTGlicmFyeV90cnlVcGdyYWRlUHJlZml4X0xvY2FsQ29tYmluYXRvck1pcnJvcmlkZW50aWZpZXJzaXNTaG93aXNIaWRlX0xvY2FsTWV0aG9kTWlycm9yX2tpbmRGbGFnc19vcGVyYXRvcnNfY29uc3RydWN0b3JOYW1la0Fic3RyYWN0a0dldHRlcmtTZXR0ZXJrQ29uc3RydWN0b3JrQ29uc3RDdG9ya0dlbmVyYXRpdmVDdG9ya1JlZGlyZWN0aW5nQ3RvcmtGYWN0b3J5Q3RvcmtFeHRlcm5hbGtTeW50aGV0aWNfcGF0Y2hDb25zdHJ1Y3Rvck5hbWVfTWV0aG9kTWlycm9yX293bmVyX01ldGhvZE1pcnJvcl9yZXR1cm5fdHlwZV9NZXRob2RNaXJyb3JfcGFyYW1ldGVyc19NZXRob2RNaXJyb3Jfc291cmNlX0xvY2FsVmFyaWFibGVNaXJyb3JfVmFyaWFibGVNaXJyb3JfdHlwZV9Mb2NhbFBhcmFtZXRlck1pcnJvcl91bm1pcnJvcmVkTWV0YWRhdGFfZGVmYXVsdFZhbHVlUmVmbGVjdGVlX2RlZmF1bHRWYWx1ZV9QYXJhbWV0ZXJNaXJyb3JfdHlwZV9TcGVjaWFsVHlwZU1pcnJvcl9NaXJyb3JzX2N1cnJlbnRNaXJyb3JTeXN0ZW1fZGVjbGFyYXRpb25DYWNoZV9pbnN0YW50aWF0aW9uQ2FjaGVtYWtlTG9jYWxDbGFzc01pcnJvcm1ha2VMb2NhbFR5cGVNaXJyb3JpbnN0YW50aWF0ZUdlbmVyaWNUeXBlX2luc3RhbnRpYXRlVHlwZV91bmluc3RhbnRpYWJsZU1pcnJvclN5c3RlbV9tYW5nbGVOYW1lZmluZExpYnJhcnlnZXRTeW1ib2xNaXJyb3JJc29sYXRlTWlycm9yRGVjbGFyYXRpb25NaXJyb3JPYmplY3RNaXJyb3JJbnN0YW5jZU1pcnJvckNsb3N1cmVNaXJyb3JMaWJyYXJ5TWlycm9yTGlicmFyeURlcGVuZGVuY3lNaXJyb3JDb21iaW5hdG9yTWlycm9yVHlwZU1pcnJvckNsYXNzTWlycm9yRnVuY3Rpb25UeXBlTWlycm9yVHlwZVZhcmlhYmxlTWlycm9yVHlwZWRlZk1pcnJvck1ldGhvZE1pcnJvclZhcmlhYmxlTWlycm9yUGFyYW1ldGVyTWlycm9yU291cmNlTG9jYXRpb25Db21tZW50dHJpbW1lZFRleHRpc0RvY0NvbW1lbnRNaXJyb3JzVXNlZHN5bWJvbHN0YXJnZXRzbWV0YVRhcmdldHNvdmVycmlkZWRhcnQ6cHJvZmlsZXJkYXJ0OnR5cGVkX2RhdGFfY29udlUzMl9jb252VTY0X2NvbnZGMzJfY29udkY2NF9ieXRlU3dhcDE2X2J5dGVTd2FwMzJfYnl0ZVN3YXA2NF9vZmZzZXRBbGlnbm1lbnRDaGVja2FzQnl0ZURhdGFhc0ludDhMaXN0YXNVaW50OENsYW1wZWRMaXN0YXNJbnQxNkxpc3Rhc1VpbnQxNkxpc3Rhc0ludDMyTGlzdGFzVWludDMyTGlzdGFzSW50NjRMaXN0YXNVaW50NjRMaXN0YXNGbG9hdDMyTGlzdGFzRmxvYXQ2NExpc3Rhc0Zsb2F0MzJ4NExpc3Rhc0ludDMyeDRMaXN0YXNGbG9hdDY0eDJMaXN0X3NldENvZGVVbml0c19fVWludDhMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fVWludDhDbGFtcGVkTGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX0ludDE2TGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX1VpbnQxNkxpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19JbnQzMkxpc3QmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19VaW50MzJMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fSW50NjRMaXN0Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fVWludDY0TGlzdCZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX0Zsb2F0NjRMaXN0Jl9UeXBlZExpc3QmX0RvdWJsZUxpc3RNaXhpbl9fRXh0ZXJuYWxJbnQ4QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbFVpbnQ4QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbFVpbnQ4Q2xhbXBlZEFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fRXh0ZXJuYWxJbnQxNkFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fRXh0ZXJuYWxVaW50MTZBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX0V4dGVybmFsSW50MzJBcnJheSZfVHlwZWRMaXN0Jl9JbnRMaXN0TWl4aW5fX0V4dGVybmFsVWludDMyQXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbEludDY0QXJyYXkmX1R5cGVkTGlzdCZfSW50TGlzdE1peGluX19FeHRlcm5hbFVpbnQ2NEFycmF5Jl9UeXBlZExpc3QmX0ludExpc3RNaXhpbl9fRXh0ZXJuYWxGbG9hdDMyQXJyYXkmX1R5cGVkTGlzdCZfRG91YmxlTGlzdE1peGluX19FeHRlcm5hbEZsb2F0NjRBcnJheSZfVHlwZWRMaXN0Jl9Eb3VibGVMaXN0TWl4aW5fX0V4dGVybmFsRmxvYXQzMng0QXJyYXkmX1R5cGVkTGlzdCZfRmxvYXQzMng0TGlzdE1peGluX19FeHRlcm5hbEludDMyeDRBcnJheSZfVHlwZWRMaXN0Jl9JbnQzMng0TGlzdE1peGluX19FeHRlcm5hbEZsb2F0NjR4MkFycmF5Jl9UeXBlZExpc3QmX0Zsb2F0NjR4Mkxpc3RNaXhpbmxlc3NUaGFubGVzc1RoYW5PckVxdWFsZ3JlYXRlclRoYW5ncmVhdGVyVGhhbk9yRXF1YWxlcXVhbG5vdEVxdWFsc2NhbGVhYnNjbGFtcHNodWZmbGVNaXh3aXRoWHdpdGhZd2l0aFp3aXRoV3JlY2lwcm9jYWxyZWNpcHJvY2FsU3FydHp3c2lnbk1hc2t3aXRoRmxhZ1h3aXRoRmxhZ1l3aXRoRmxhZ1p3aXRoRmxhZ1dzZWxlY3RmbGFnWGZsYWdZZmxhZ1pmbGFnV19fVWludDhBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9fVWludDhDbGFtcGVkQXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fX0ludDE2QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fX1VpbnQxNkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluX19JbnQzMkFycmF5VmlldyZfVHlwZWRMaXN0VmlldyZfSW50TGlzdE1peGluX19VaW50MzJBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9fSW50NjRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0ludExpc3RNaXhpbl9fVWludDY0QXJyYXlWaWV3Jl9UeXBlZExpc3RWaWV3Jl9JbnRMaXN0TWl4aW5fX0Zsb2F0NjRBcnJheVZpZXcmX1R5cGVkTGlzdFZpZXcmX0RvdWJsZUxpc3RNaXhpbmdldEludDhzZXRJbnQ4Z2V0VWludDhzZXRVaW50OGdldEludDE2c2V0SW50MTZnZXRVaW50MTZzZXRVaW50MTZnZXRJbnQzMnNldEludDMyZ2V0VWludDMyc2V0VWludDMyZ2V0SW50NjRzZXRJbnQ2NGdldFVpbnQ2NHNldFVpbnQ2NGdldEZsb2F0MzJzZXRGbG9hdDMyZ2V0RmxvYXQ2NHNldEZsb2F0NjRnZXRGbG9hdDMyeDRzZXRGbG9hdDMyeDRfbGl0dGxlRW5kaWFuYmlnbGl0dGxlYnl0ZXNQZXJFbGVtZW50eHh4eHh4eHl4eHh6eHh4d3h4eXh4eHl5eHh5enh4eXd4eHp4eHh6eXh4enp4eHp3eHh3eHh4d3l4eHd6eHh3d3h5eHh4eXh5eHl4enh5eHd4eXl4eHl5eXh5eXp4eXl3eHl6eHh5enl4eXp6eHl6d3h5d3h4eXd5eHl3enh5d3d4enh4eHp4eXh6eHp4enh3eHp5eHh6eXl4enl6eHp5d3h6enh4enp5eHp6enh6end4end4eHp3eXh6d3p4end3eHd4eHh3eHl4d3h6eHd4d3h3eXh4d3l5eHd5enh3eXd4d3p4eHd6eXh3enp4d3p3eHd3eHh3d3l4d3d6eHd3d3l4eHh5eHh5eXh4enl4eHd5eHl4eXh5eXl4eXp5eHl3eXh6eHl4enl5eHp6eXh6d3l4d3h5eHd5eXh3enl4d3d5eXh4eXl4eXl5eHp5eXh3eXl5eHl5eXl5eXl6eXl5d3l5enh5eXp5eXl6enl5end5eXd4eXl3eXl5d3p5eXd3eXp4eHl6eHl5enh6eXp4d3l6eXh5enl5eXp5enl6eXd5enp4eXp6eXl6enp5enp3eXp3eHl6d3l5end6eXp3d3l3eHh5d3h5eXd4enl3eHd5d3l4eXd5eXl3eXp5d3l3eXd6eHl3enl5d3p6eXd6d3l3d3h5d3d5eXd3enl3d3d6eHh4enh4eXp4eHp6eHh3enh5eHp4eXl6eHl6enh5d3p4enh6eHp5enh6enp4end6eHd4enh3eXp4d3p6eHd3enl4eHp5eHl6eXh6enl4d3p5eXh6eXl5enl5enp5eXd6eXp4enl6eXp5enp6eXp3enl3eHp5d3l6eXd6enl3d3p6eHh6enh5enp4enp6eHd6enl4enp5eXp6eXp6enl3enp6eHp6enl6enp6enp6d3p6d3h6end5enp3enp6d3d6d3h4end4eXp3eHp6d3h3end5eHp3eXl6d3l6end5d3p3enh6d3p5end6enp3end6d3d4end3eXp3d3p6d3d3d3h4eHd4eHl3eHh6d3h4d3d4eXh3eHl5d3h5end4eXd3eHp4d3h6eXd4enp3eHp3d3h3eHd4d3l3eHd6d3h3d3d5eHh3eXh5d3l4end5eHd3eXl4d3l5eXd5eXp3eXl3d3l6eHd5enl3eXp6d3l6d3d5d3h3eXd5d3l3end5d3d3enh4d3p4eXd6eHp3enh3d3p5eHd6eXl3enl6d3p5d3d6enh3enp5d3p6end6end3end4d3p3eXd6d3p3end3d3d4eHd3eHl3d3h6d3d4d3d3eXh3d3l5d3d5end3eXd3d3p4d3d6eXd3enp3d3p3d3d3eHd3d3l3d3d6d3d3d3NwbGF0emVyb2Zyb21JbnQzMng0Qml0c2Zyb21GbG9hdDY0eDJmcm9tRmxvYXQzMng0Qml0c2Zyb21GbG9hdDMyeDRVbm1vZGlmaWFibGVCeXRlQnVmZmVyVmlld1VubW9kaWZpYWJsZUJ5dGVEYXRhVmlld191bnN1cHBvcnRlZF9Vbm1vZGlmaWFibGVMaXN0TWl4aW5fVW5tb2RpZmlhYmxlVWludDhMaXN0VmlldyZVbm1vZGlmaWFibGVMaXN0QmFzZSZfVW5tb2RpZmlhYmxlTGlzdE1peGluVW5tb2RpZmlhYmxlVWludDhMaXN0Vmlld19Vbm1vZGlmaWFibGVJbnQ4TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDhMaXN0Vmlld19Vbm1vZGlmaWFibGVVaW50OENsYW1wZWRMaXN0VmlldyZVbm1vZGlmaWFibGVMaXN0QmFzZSZfVW5tb2RpZmlhYmxlTGlzdE1peGluVW5tb2RpZmlhYmxlVWludDhDbGFtcGVkTGlzdFZpZXdfVW5tb2RpZmlhYmxlVWludDE2TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQxNkxpc3RWaWV3X1VubW9kaWZpYWJsZUludDE2TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDE2TGlzdFZpZXdfVW5tb2RpZmlhYmxlVWludDMyTGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQzMkxpc3RWaWV3X1VubW9kaWZpYWJsZUludDMyTGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDMyTGlzdFZpZXdfVW5tb2RpZmlhYmxlVWludDY0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZVVpbnQ2NExpc3RWaWV3X1VubW9kaWZpYWJsZUludDY0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUludDY0TGlzdFZpZXdfVW5tb2RpZmlhYmxlSW50MzJ4NExpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVJbnQzMng0TGlzdFZpZXdfVW5tb2RpZmlhYmxlRmxvYXQzMng0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUZsb2F0MzJ4NExpc3RWaWV3X1VubW9kaWZpYWJsZUZsb2F0NjR4Mkxpc3RWaWV3JlVubW9kaWZpYWJsZUxpc3RCYXNlJl9Vbm1vZGlmaWFibGVMaXN0TWl4aW5Vbm1vZGlmaWFibGVGbG9hdDY0eDJMaXN0Vmlld19Vbm1vZGlmaWFibGVGbG9hdDMyTGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUZsb2F0MzJMaXN0Vmlld19Vbm1vZGlmaWFibGVGbG9hdDY0TGlzdFZpZXcmVW5tb2RpZmlhYmxlTGlzdEJhc2UmX1VubW9kaWZpYWJsZUxpc3RNaXhpblVubW9kaWZpYWJsZUZsb2F0NjRMaXN0Vmlld2RhcnQ6dm1zZXJ2aWNlX2lvX3NpZ25hbFN1YnNjcmlwdGlvbl9yZWdpc3RlclNpZ25hbEhhbmRsZXJUaW1lcl9odHRwQ2xpZW50X1NQQUNFX0hBU0hfRE9UX0NPTE9OX0RFTF9pbnZhbGlkUGFja2FnZU5hbWVDaGFyc19EYXJ0X2tDYW5vbmljYWxpemVVcmxfRGFydF9rU2NyaXB0VGFnX0RhcnRfa1NvdXJjZVRhZ19EYXJ0X2tJbXBvcnRUYWdfRGFydF9rSW5pdExvYWRlcl9EYXJ0X2tSZXNvdXJjZUxvYWRfRGFydF9rR2V0UGFja2FnZVJvb3RVcmlfRGFydF9rR2V0UGFja2FnZUNvbmZpZ1VyaV9EYXJ0X2tSZXNvbHZlUGFja2FnZVVyaV9EYXJ0X2tJbXBvcnRFeHRlbnNpb25fRGFydF9rUmVzb2x2ZUFzRmlsZVBhdGhzZXJ2ZXJzZXJ2ZXJGdXR1cmVzaWxlbnRPYnNlcnZhdG9yeV9zZW5kUmVzb3VyY2VSZXNwb25zZV9zZW5kRXh0ZW5zaW9uSW1wb3J0UmVzcG9uc2VfbG9hZEh0dHBfbG9hZEZpbGVfbG9hZERhdGFVcmlfbG9hZFBhY2thZ2VfaGFuZGxlUmVzb3VyY2VSZXF1ZXN0X3BhcnNlUGFja2FnZXNGaWxlX2xvYWRQYWNrYWdlc0ZpbGVfZmluZFBhY2thZ2VzRmlsZV9sb2FkSHR0cFBhY2thZ2VzRmlsZV9sb2FkUGFja2FnZXNEYXRhX2hhbmRsZVBhY2thZ2VzUmVxdWVzdF9wcm9jZXNzTG9hZFJlcXVlc3Rfbm90aWZ5U2VydmVyU3RhdGVfbGF6eVNlcnZlckJvb3RfY2xlYXJGdXR1cmVfb25TaWduYWxfcmVnaXN0ZXJTaWduYWxIYW5kbGVyX3NodXRkb3duc2h1dGRvd25Mb2FkZXJzc2VydmVyUHJpbnRjbGVhbnVwQ2FsbGJhY2tjcmVhdGVUZW1wRGlyQ2FsbGJhY2tkZWxldGVEaXJDYWxsYmFja3dyaXRlRmlsZUNhbGxiYWNrd3JpdGVTdHJlYW1GaWxlQ2FsbGJhY2tyZWFkRmlsZUNhbGxiYWNrbGlzdEZpbGVzQ2FsbGJhY2tzZXJ2ZXJJbmZvcm1hdGlvbkNhbGxiYWNrd2ViU2VydmVyQ29udHJvbENhbGxiYWNrUGVuZGluZ1dyaXRlV3JpdGVMaW1pdGVycGVuZGluZ1dyaXRlc2tNYXhPcGVuV3JpdGVzb3BlbldyaXRlc3NjaGVkdWxlV3JpdGVfbWF5YmVXcml0ZUZpbGVzX3dyaXRlQ29tcGxldGVkRmlsZVJlcXVlc3RzcHJlc29sdmVkVXJpbGlicmFyeVVybElzb2xhdGVMb2FkZXJTdGF0ZWlzb2xhdGVJZF9kZWFkX3BhY2thZ2VFcnJvcl9wYWNrYWdlQ29uZmlnX3BhY2thZ2VNYXBfbWF4RmlsZVJlcXVlc3RzX2ZpbGVSZXF1ZXN0UXVldWVfcGVuZGluZ1BhY2thZ2VMb2Fkc19wYWNrYWdlc1BvcnRjdXJyZW50RmlsZVJlcXVlc3RzaW5pdHVwZGF0ZVBhY2thZ2VNYXBjbGVhbnVwZW5xdWV1ZUZpbGVSZXF1ZXN0ZGVxdWV1ZUZpbGVSZXF1ZXN0X3NldFBhY2thZ2VzQ29uZmlnX3RyaWdnZXJQYWNrYWdlUmVzb2x1dGlvbl9yZXNvbHZlUGFja2FnZVVyaV9yZXF1ZXN0UGFja2FnZXNNYXBfaGFuZGxlUGFja2FnZXNSZXBseV9wYWNrYWdlc1JlYWR5c2hvdWxkSXNzdWVGaWxlUmVxdWVzdFdlYlNvY2tldENsaWVudFBBUlNFX0VSUk9SX0NPREVCSU5BUllfTUVTU0FHRV9FUlJPUl9DT0RFTk9UX01BUF9FUlJPUl9DT0RFSURfRVJST1JfQ09ERWRpc2Nvbm5lY3RvbldlYlNvY2tldE1lc3NhZ2Vwb3N0SHR0cFJlcXVlc3RDbGllbnRqc29uQ29udGVudFR5cGVTZXJ2ZXJXRUJTT0NLRVRfUEFUSFJPT1RfUkVESVJFQ1RfUEFUSF9zZXJ2aWNlX3NlcnZlcnJ1bm5pbmdzZXJ2ZXJBZGRyZXNzX2lzQWxsb3dlZE9yaWdpbl9vcmlnaW5DaGVja19jaGVja0F1dGhUb2tlbkFuZEdldFBhdGhfcmVxdWVzdEhhbmRsZXJzdGFydHVwc2h1dGRvd25kYXJ0Ol92bXNlcnZpY2VTZXJ2ZXJTdGFydENhbGxiYWNrU2VydmVyU3RvcENhbGxiYWNrQ2xlYW51cENhbGxiYWNrQ3JlYXRlVGVtcERpckNhbGxiYWNrRGVsZXRlRGlyQ2FsbGJhY2tXcml0ZUZpbGVDYWxsYmFja1dyaXRlU3RyZWFtRmlsZUNhbGxiYWNrUmVhZEZpbGVDYWxsYmFja0xpc3RGaWxlc0NhbGxiYWNrU2VydmVySW5mb3JtYW1lc3NhZ2Vfcm91dGVydGlvbkNhbGxiYWNrU2VydmVySW5mb3JtYXRpb25DYWxsYmFja1dlYlNlcnZlckNvbnRyb2xDYWxsYmFja0NsaWVudFNlcnZpY2VIYW5kbGVzY3JpcHRMb2FkUG9ydHNlcnZpY2VBdXRoVG9rZW5pc29sYXRlRW1iZWRkZXJEYXRha1BhcnNlRXJyb3JrSW52YWxpZFJlcXVlc3RrTWV0aG9kTm90Rm91bmRrSW50ZXJuYWxFcnJvcmtGZWF0dXJlRGlzYWJsZWRrQ2Fubm90QWRkQnJlYWtwb2ludGtTdHJlYW1BbHJlYWR5U3Vic2NyaWJlZGtTdHJlYW1Ob3RTdWJzY3JpYmVka0lzb2xhdGVNdXN0QmVSdW5uYWJsZWtJc29sYXRlTXVzdEJlUGF1c2Vka0Nhbm5vdFJlc3VtZWtJc29sYXRlSXNSZWxvYWRpbmdrSXNvbGF0ZVJlbG9hZEJhcnJlZGtJc29sYXRlTXVzdEhhdmVSZWxvYWRlZGtTZXJ2aWNlQWxyZWFkeVJlZ2lzdGVyZWRrU2VydmljZURpc2FwcGVhcmVka0V4cHJlc3Npb25Db21waWxhdGlvbkVycm9ya0ZpbGVTeXN0ZW1BbHJlYWR5RXhpc3Rza0ZpbGVTeXN0ZW1Eb2VzTm90RXhpc3RrRmlsZURvZXNOb3RFeGlzdF9lcnJvck1lc3NhZ2VzX2Fzc2V0c3Nob3J0RGVsYXlfZGVjb2RlQXNzZXRzX2VuY29kZURldkZTRGlzYWJsZWRFcnJvcl9lbmNvZGVGaWxlU3lzdGVtQWxyZWFkeUV4aXN0c0Vycm9yX2VuY29kZUZpbGVTeXN0ZW1Eb2VzTm90RXhpc3RFcnJvcl9tYWtlQXV0aFRva2VuX3JlZ2lzdGVySXNvbGF0ZV9vblN0YXJ0X29uRXhpdF92bUxpc3RlblN0cmVhbV92bUNhbmNlbFN0cmVhbV9yZXF1ZXN0QXNzZXRzX3NwYXduVXJpTm90aWZ5c2VuZElzb2xhdGVTZXJ2aWNlTWVzc2FnZXNlbmRSb290U2VydmljZU1lc3NhZ2VzZW5kT2JqZWN0Um9vdFNlcnZpY2VNZXNzYWdlZW5jb2RlUnBjRXJyb3JlbmNvZGVNaXNzaW5nUGFyYW1FcnJvcmVuY29kZUludmFsaWRQYXJhbUVycm9yZW5jb2RlQ29tcGlsYXRpb25FcnJvcmVuY29kZVJlc3VsdGVuY29kZVN1Y2Nlc3NvblNlcnZlckFkZHJlc3NDaGFuZ2Vhc3NldHNJc29sYXRlRW1iZWRkZXJEYXRhVk1TZXJ2aWNlRW1iZWRkZXJIb29rc3NlcnZlclN0YXJ0c2VydmVyU3RvcGNyZWF0ZVRlbXBEaXJkZWxldGVEaXJ3cml0ZUZpbGV3cml0ZVN0cmVhbUZpbGVyZWFkRmlsZWxpc3RGaWxlc3NlcnZlckluZm9ybWF0aW9ud2ViU2VydmVyQ29udHJvbFZNU2VydmljZV9pbnN0YW5jZV9zZXJ2aWNlUmVxdWVzdHNzZXJ2aWNlTmFtZXNwYWNlY2xpZW50c3J1bm5pbmdJc29sYXRlc2lzRXhpdGluZ2RldmZza1NlcnZpY2VTdHJlYW1zZXJ2aWNlU3RyZWFtc19hZGRDbGllbnRfcmVtb3ZlQ2xpZW50X2V2ZW50TWVzc2FnZUhhbmRsZXJfY29udHJvbE1lc3NhZ2VIYW5kbGVyX3NlcnZlck1lc3NhZ2VIYW5kbGVyX2hhbmRsZU5hdGl2ZVJwY0NhbGxfZXhpdF9pc0FueUNsaWVudFN1YnNjcmliZWRfZmluZEZpcnN0Q2xpZW50VGhhdEhhbmRsZXNTZXJ2aWNlX3N0cmVhbUxpc3Rlbl9zdHJlYW1DYW5jZWxfaGFzTmFtZXNwYWNlX2dldE5hbWVzcGFjZV9nZXRNZXRob2RfcmVnaXN0ZXJTZXJ2aWNlX3NlbmRTZXJ2aWNlUmVnaXN0ZXJlZEV2ZW50X2hhbmRsZVNlcnZpY2Vfcm91dGVSZXF1ZXN0SW1wbG1lc3NhZ2VIYW5kbGVycm91dGVSZXF1ZXN0cm91dGVSZXNwb25zZUFzc2V0bWltZVR5cGVDbGllbnRzZXJ2aWNlc2VuZEV2ZW50c3N0cmVhbXNzZXJ2aWNlc3NlcnZpY2VIYW5kbGVzb25SZXF1ZXN0b25SZXNwb25zZW9uTm90aWZpY2F0aW9uX0ZpbGVTeXN0ZW1yZXNvbHZlUGF0aHRvTWFwRGV2RlNfZnNNYXBfcnBjTmFtZXNzaG91bGRIYW5kbGVNZXNzYWdlaGFuZGxlTWVzc2FnZWhhbmRsZVB1dFN0cmVhbV9saXN0RGV2RlNfY3JlYXRlRGV2RlNfZGVsZXRlRGV2RlNfcmVhZERldkZTRmlsZV93cml0ZURldkZTRmlsZV93cml0ZURldkZTRmlsZXNfbGlzdERldkZTRmlsZXNDb25zdGFudHNTRVJWSUNFX0VYSVRfTUVTU0FHRV9JRElTT0xBVEVfU1RBUlRVUF9NRVNTQUdFX0lESVNPTEFURV9TSFVURE9XTl9NRVNTQUdFX0lEV0VCX1NFUlZFUl9DT05UUk9MX01FU1NBR0VfSURTRVJWRVJfSU5GT19NRVNTQUdFX0lETUVUSE9EX0NBTExfRlJPTV9OQVRJVkVSdW5uaW5nSXNvbGF0ZXBvcnRJZHNlcnZpY2VJZFJ1bm5pbmdJc29sYXRlc2lzb2xhdGVzX3Jvb3RQb3J0SWRpc29sYXRlU3RhcnR1cGlzb2xhdGVTaHV0ZG93bl9FdmFsdWF0b3JfbWVzc2FnZV9idWlsZFNjb3BlX2NvbXBpbGVFeHByZXNzaW9uX2V2YWx1YXRlQ29tcGlsZWRFeHByZXNzaW9uX3NldHVwUGFyYW1zTWVzc2FnZVR5cGVSZXF1ZXN0Tm90aWZpY2F0aW9uUmVzcG9uc2VNZXNzYWdlY2xpZW50c2VyaWFsY29tcGxldGVkZnJvbUpzb25ScGNfbWV0aG9kTmFtZUZyb21VcmlfbWFrZUFsbFN0cmluZ19tZXRob2ROZWVkc09iamVjdFBhcmFtZXRlcnNfc2V0UmVzcG9uc2VGcm9tUG9ydHRvVXJpZm9yd2FyZFRvSnNvbnNlbmRUb0lzb2xhdGVzZW5kVG9WTXNldFJlc3BvbnNlc2V0RXJyb3JSZXNwb25zZV9mcm9tSnNvblJwY1JlcXVlc3RfZnJvbUpzb25ScGNOb3RpZmljYXRpb25fZnJvbUpzb25ScGNSZXN1bHRfZnJvbUpzb25ScGNFcnJvcmZvck1ldGhvZGZyb21Vcmlmb3JJc29sYXRlTWVzc2FnZVJvdXRlclJlc3BvbnNlUGF5bG9hZEtpbmRCaW5hcnlVdGY4U3RyaW5ncGF5bG9hZGludGVybmFsRXJyb3JkZWNvZGVKc29uX05hbWVkTG9va3VwJk9iamVjdCZJdGVyYWJsZU1peGluTmFtZWRMb29rdXBfZWxlbWVudHNfaWRza2V5T2ZJZEdlbmVyYXRvcnByb2xvZ3VlX2ZyZWVuZXdJZHJlbGVhc2VkYXJ0Ol9idWlsdGluX2ZpbGVQYXRoRnJvbVVyaWRhcnQ6bmF0aXZld3JhcHBlcnNOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczJOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczNOYXRpdmVGaWVsZFdyYXBwZXJDbGFzczRkYXJ0OmlvX3N1Y2Nlc3NSZXNwb25zZV9pbGxlZ2FsQXJndW1lbnRSZXNwb25zZV9vc0Vycm9yUmVzcG9uc2VfZmlsZUNsb3NlZFJlc3BvbnNlX2Vycm9yUmVzcG9uc2VFcnJvclR5cGVfb3NFcnJvclJlc3BvbnNlRXJyb3JDb2RlX29zRXJyb3JSZXNwb25zZU1lc3NhZ2VfYmxvY2tTaXplX2FzeW5jUnVuWm9uZWRfbmV4dFNlcnZpY2VJZF9zdGRpb0hhbmRsZVR5cGVUZXJtaW5hbF9zdGRpb0hhbmRsZVR5cGVQaXBlX3N0ZGlvSGFuZGxlVHlwZUZpbGVfc3RkaW9IYW5kbGVUeXBlU29ja2V0X3N0ZGlvSGFuZGxlVHlwZU90aGVyX3N0ZGluX3N0ZG91dF9zdGRlcnJ6bGliWkxJQmd6aXBHWklQUkVBRFdSSVRFQVBQRU5EV1JJVEVfT05MWVdSSVRFX09OTFlfQVBQRU5Ec3lzdGVtRW5jb2RpbmdTWVNURU1fRU5DT0RJTkdfcnVuTm9uSW50ZXJhY3RpdmVQcm9jZXNzX3J1bk5vbkludGVyYWN0aXZlUHJvY2Vzc1N5bmNfdGhyb3dPbkJhZFBvcnRfdGhyb3dPbkJhZFR0bF9nZXRTdGRpb0hhbmRsZV9nZXRTb2NrZXRUeXBlX2Vuc3VyZUZhc3RBbmRTZXJpYWxpemFibGVCeXRlRGF0YV92YWxpZGF0ZVpMaWJXaW5kb3dCaXRzX3ZhbGlkYXRlWkxpYmVMZXZlbF92YWxpZGF0ZVpMaWJNZW1MZXZlbF92YWxpZGF0ZVpMaWJTdHJhdGVneWV4aXRzbGVlcHN0ZGlvVHlwZWV4aXRDb2RlcGlkX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzSW1wbF9zZXRQb2ludGVyZ2V0UG9pbnRlcnJlYWRCeXRlcmVhZEludG93cml0ZUZyb21zZXRQb3NpdGlvbnRydW5jYXRlbG9ja19XYXRjaGVyUGF0aHBhdGhJZF9Jbm90aWZ5RmlsZVN5c3RlbVdhdGNoZXJfaWRNYXBfbmV3V2F0Y2hlcl9kb25lV2F0Y2hlcl9wYXRoV2F0Y2hlZF9wYXRoV2F0Y2hlZEVuZF9XaW4zMkZpbGVTeXN0ZW1XYXRjaGVyX0ZTRXZlbnRTdHJlYW1GaWxlU3lzdGVtV2F0Y2hlcl9GaWx0ZXJJbXBscHJvY2Vzc3Byb2Nlc3NlZF9aTGliSW5mbGF0ZUZpbHRlcl9aTGliRGVmbGF0ZUZpbHRlcm1heFBvcnRzX3NldFNpZ25hbEhhbmRsZXJfY2xlYXJTaWduYWxIYW5kbGVyX1Byb2Nlc3NJbXBsTmF0aXZlV3JhcHBlcl9Qcm9jZXNzSW1wbF9yZXNvdXJjZUluZm9fZW52aXJvbm1lbnRfbW9kZV9leGl0SGFuZGxlcl9lbmRlZF9zdGFydGVkX2V4aXRDb2RlX3N0ZGluTmF0aXZlU29ja2V0X3N0ZG91dE5hdGl2ZVNvY2tldF9zdGRlcnJOYXRpdmVTb2NrZXRfbW9kZUlzQXR0YWNoZWRfbW9kZUhhc1N0ZGlvX2dldFNoZWxsQ29tbWFuZF9nZXRTaGVsbEFyZ3VtZW50c193aW5kb3dzQXJndW1lbnRFc2NhcGVfaW50RnJvbUJ5dGVzX3J1bkFuZFdhaXRfc3RhcnROYXRpdmVfd2FpdF9hZGRyZXNzTG9vcGJhY2tJUHY0X2FkZHJlc3NMb29wYmFja0lQdjZfYWRkcmVzc0FueUlQdjRfYWRkcmVzc0FueUlQdjZfSVB2NEFkZHJMZW5ndGhfSVB2NkFkZHJMZW5ndGhsb29wYmFja0lQdjRsb29wYmFja0lQdjZhbnlJUHY0YW55SVB2NnJhd0FkZHJlc3Npc0xvb3BiYWNraXNMaW5rTG9jYWxpc011bHRpY2FzdHJldmVyc2VfY2xvbmVXaXRoTmV3SG9zdGZpeGVkX05ldHdvcmtJbnRlcmZhY2VhZGRyZXNzZXNfX3NlcnZpY2VJZF9zZXJ2aWNlSWRfc2VydmljZVBhdGhfc2VydmljZVR5cGVQYXRoX3NlcnZpY2VUeXBlTmFtZV9zZXJ2aWNlVHlwZXJlYWRFdmVudHdyaXRlRXZlbnRlcnJvckV2ZW50Y2xvc2VkRXZlbnRkZXN0cm95ZWRFdmVudGZpcnN0RXZlbnRsYXN0RXZlbnRldmVudENvdW50Y2xvc2VDb21tYW5kc2h1dGRvd25SZWFkQ29tbWFuZHNodXRkb3duV3JpdGVDb21tYW5kcmV0dXJuVG9rZW5Db21tYW5kc2V0RXZlbnRNYXNrQ29tbWFuZGZpcnN0Q29tbWFuZGxhc3RDb21tYW5kbGlzdGVuaW5nU29ja2V0cGlwZVNvY2tldHR5cGVOb3JtYWxTb2NrZXR0eXBlTGlzdGVuaW5nU29ja2V0dHlwZVBpcGV0eXBlVHlwZU1hc2t0Y3BTb2NrZXR1ZHBTb2NrZXRpbnRlcm5hbFNvY2tldGludGVybmFsU2lnbmFsU29ja2V0dHlwZVRjcFNvY2tldHR5cGVVZHBTb2NrZXR0eXBlSW50ZXJuYWxTb2NrZXR0eXBlSW50ZXJuYWxTaWduYWxTb2NrZXR0eXBlUHJvdG9jb2xNYXNraG9zdE5hbWVMb29rdXBNZXNzYWdlbGlzdEludGVyZmFjZXNNZXNzYWdlcmV2ZXJzZUxvb2t1cE1lc3NhZ2Vwcm90b2NvbElQdjRwcm90b2NvbElQdjZub3JtYWxUb2tlbkJhdGNoU2l6ZWxpc3RlbmluZ1Rva2VuQmF0Y2hTaXplX3JldHJ5RHVyYXRpb25fcmV0cnlEdXJhdGlvbkxvb3BiYWNrcmV2ZXJzZUxvb2t1cGxpc3RJbnRlcmZhY2Vzc3RhcnRDb25uZWN0Y29ubmVjdF9yZXNvbHZlSG9zdHNldHVwUmVzb3VyY2VJbmZvYmluZERhdGFncmFtcmVjZWl2ZWFjY2VwdHNodXRkb3duV3JpdGVzaHV0ZG93blJlYWRpc0Vycm9yUmVzcG9uc2VjcmVhdGVFcnJvcmdldE9wdGlvbnNldE9wdGlvbmdldFJhd09wdGlvbnNldFJhd09wdGlvbm11bHRpY2FzdEFkZHJlc3Nqb2luTXVsdGljYXN0bGVhdmVNdWx0aWNhc3RuYXRpdmVTZXRTb2NrZXRJZG5hdGl2ZVJlY3ZGcm9tbmF0aXZlV3JpdGVuYXRpdmVTZW5kVG9uYXRpdmVDcmVhdGVDb25uZWN0bmF0aXZlQ3JlYXRlQmluZENvbm5lY3Rpc0JpbmRFcnJvcm5hdGl2ZUNyZWF0ZUJpbmRMaXN0ZW5uYXRpdmVDcmVhdGVCaW5kRGF0YWdyYW1uYXRpdmVBY2NlcHRuYXRpdmVHZXRQb3J0bmF0aXZlR2V0UmVtb3RlUGVlcm5hdGl2ZUdldFNvY2tldElkbmF0aXZlR2V0T3B0aW9ubmF0aXZlR2V0UmF3T3B0aW9ubmF0aXZlU2V0T3B0aW9ubmF0aXZlU2V0UmF3T3B0aW9ubmF0aXZlSm9pbk11bHRpY2FzdG5hdGl2ZUxlYXZlTXVsdGljYXN0aXNUY3Bpc1VkcHJlbW90ZVBvcnRyZW1vdGVBZGRyZXNzZGF0YWdyYW1ub3JtYWxfd2F0Y2hDb21tb253YXRjaFNpZ25hbHdhdGNoX1Jhd1NlcnZlclNvY2tldF9yZWZlcmVuY2VQb3J0X3Y2T25seV93cml0ZVBpcGVfcmVhZFBpcGVyZWFkRXZlbnRzRW5hYmxlZF9TZXJ2ZXJTb2NrZXRfU29ja2V0U3RyZWFtQ29uc3VtZXJwYXVzZWRzdHJlYW1Db21wbGV0ZXJzdG9wX1NvY2tldF9yYXdfY2xvc2VkX2NvbnRyb2xsZXJDbG9zZWRfY29uc3VtZXJfZGV0YWNoUmVhZHlfbmF0aXZlU29ja2V0ZGVzdHJveV9kZXRhY2hSYXdfZW5zdXJlUmF3U29ja2V0U3Vic2NyaXB0aW9uX2Nsb3NlUmF3U29ja2V0X3dyaXRlX2VuYWJsZVdyaXRlRXZlbnRfZGlzYWJsZVdyaXRlRXZlbnRfY29uc3VtZXJEb25lX1Jhd0RhdGFncmFtU29ja2V0bXVsdGljYXN0TG9vcGJhY2ttdWx0aWNhc3RIb3BzbXVsdGljYXN0SW50ZXJmYWNlYnJvYWRjYXN0RW5hYmxlZF9TZWN1cmVTb2NrZXRwZWVyQ2VydGlmaWNhdGVzZWxlY3RlZFByb3RvY29scmVuZWdvdGlhdGVfZGVzdHJveV9wb2ludGVyaGFuZHNoYWtlcmVoYW5kc2hha2Vwcm9jZXNzQnVmZmVycmVnaXN0ZXJCYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrcmVnaXN0ZXJIYW5kc2hha2VDb21wbGV0ZUNhbGxiYWNrX1NlY3VyaXR5Q29udGV4dGRlZmF1bHRDb250ZXh0X2NyZWF0ZU5hdGl2ZUNvbnRleHRfc2V0QWxwblByb3RvY29sc190cnVzdEJ1aWx0aW5Sb290c3VzZVByaXZhdGVLZXl1c2VQcml2YXRlS2V5Qnl0ZXNzZXRUcnVzdGVkQ2VydGlmaWNhdGVzc2V0VHJ1c3RlZENlcnRpZmljYXRlc0J5dGVzdXNlQ2VydGlmaWNhdGVDaGFpbnVzZUNlcnRpZmljYXRlQ2hhaW5CeXRlc3NldENsaWVudEF1dGhvcml0aWVzc2V0Q2xpZW50QXV0aG9yaXRpZXNCeXRlc3NldEFscG5Qcm90b2NvbHNfZGVyX3BlbV9zaGExZGVycGVtc2hhMXN1YmplY3Rpc3N1ZXJzdGFydFZhbGlkaXR5ZW5kVmFsaWRpdHlfc3RhcnRWYWxpZGl0eV9lbmRWYWxpZGl0eV9SYXdTeW5jaHJvbm91c1NvY2tldGNvbm5lY3RTeW5jY2xvc2VTeW5jcmVhZEludG9TeW5jcmVhZFN5bmN3cml0ZUZyb21TeW5jX05hdGl2ZVN5bmNocm9ub3VzU29ja2V0TmF0aXZlV3JhcHBlcl9OYXRpdmVTeW5jaHJvbm91c1NvY2tldF9jaGVja0F2YWlsYWJsZV9uYXRpdmVMb29rdXBSZXF1ZXN0bmF0aXZlQ3JlYXRlQ29ubmVjdFN5bmNuYXRpdmVDbG9zZVN5bmNuYXRpdmVSZWFkSW50b25hdGl2ZVNodXRkb3duUmVhZG5hdGl2ZVNodXRkb3duV3JpdGVCeXRlc0J1aWxkZXJhZGRCeXRldGFrZUJ5dGVzdG9CeXRlc19Db3B5aW5nQnl0ZXNCdWlsZGVyX2luaXRTaXplX3BvdzJyb3VuZHVwX0J5dGVzQnVpbGRlcl9jaHVua3Nub0Vycm9yQ29kZV9CdWZmZXJBbmRTdGFydF9JT0NyeXB0b2dldFJhbmRvbUJ5dGVzWkxpYk9wdGlvbm1pbldpbmRvd0JpdHNNSU5fV0lORE9XX0JJVFNtYXhXaW5kb3dCaXRzTUFYX1dJTkRPV19CSVRTZGVmYXVsdFdpbmRvd0JpdHNERUZBVUxUX1dJTkRPV19CSVRTbWluTGV2ZWxNSU5fTEVWRUxtYXhMZXZlbE1BWF9MRVZFTGRlZmF1bHRMZXZlbERFRkFVTFRfTEVWRUxtaW5NZW1MZXZlbE1JTl9NRU1fTEVWRUxtYXhNZW1MZXZlbE1BWF9NRU1fTEVWRUxkZWZhdWx0TWVtTGV2ZWxERUZBVUxUX01FTV9MRVZFTHN0cmF0ZWd5RmlsdGVyZWRTVFJBVEVHWV9GSUxURVJFRHN0cmF0ZWd5SHVmZm1hbk9ubHlTVFJBVEVHWV9IVUZGTUFOX09OTFlzdHJhdGVneVJsZVNUUkFURUdZX1JMRXN0cmF0ZWd5Rml4ZWRTVFJBVEVHWV9GSVhFRHN0cmF0ZWd5RGVmYXVsdFNUUkFURUdZX0RFRkFVTFRaTGliQ29kZWNtZW1MZXZlbHN0cmF0ZWd5d2luZG93Qml0c3Jhd2RpY3Rpb25hcnlfZGVmYXVsdEdaaXBDb2RlY1pMaWJFbmNvZGVyWkxpYkRlY29kZXJSYXdaTGliRmlsdGVyZGVmbGF0ZUZpbHRlcmluZmxhdGVGaWx0ZXJfbWFrZVpMaWJEZWZsYXRlRmlsdGVyX21ha2VaTGliSW5mbGF0ZUZpbHRlcl9CdWZmZXJTaW5rYnVpbGRlcl9aTGliRW5jb2RlclNpbmtfWkxpYkRlY29kZXJTaW5rX0ZpbHRlclNpbmtfZW1wdHlzeXN0ZW1UZW1wYWJzb2x1dGVjcmVhdGVjcmVhdGVTeW5jY3JlYXRlVGVtcGNyZWF0ZVRlbXBTeW5jcmVzb2x2ZVN5bWJvbGljTGlua3NyZXNvbHZlU3ltYm9saWNMaW5rc1N5bmNyZW5hbWVyZW5hbWVTeW5jbGlzdFN5bmNfc2V0Q3VycmVudF9jcmVhdGVUZW1wX3N5c3RlbVRlbXBfZXhpc3RzX2RlbGV0ZU5hdGl2ZV9yZW5hbWVfZmlsbFdpdGhEaXJlY3RvcnlMaXN0aW5nX2RlbGV0ZV9kZWxldGVTeW5jX2V4Y2VwdGlvbk9yRXJyb3JGcm9tUmVzcG9uc2VleGlzdHNleGlzdHNTeW5jX0FzeW5jRGlyZWN0b3J5TGlzdGVyT3BzX0FzeW5jRGlyZWN0b3J5TGlzdGVybGlzdEZpbGVsaXN0RGlyZWN0b3J5bGlzdExpbmtsaXN0RXJyb3JsaXN0RG9uZXJlc3BvbnNlVHlwZXJlc3BvbnNlUGF0aHJlc3BvbnNlQ29tcGxldGVyZXNwb25zZUVycm9ycmVjdXJzaXZlZm9sbG93TGlua3NjYW5jZWxlZG5leHRSdW5uaW5nX29wc19jbGVhbnVwX21heUNoZGlyRmlsZU1vZGV3cml0ZU9ubHl3cml0ZU9ubHlBcHBlbmRGaWxlTG9ja3NoYXJlZFNIQVJFRGV4Y2x1c2l2ZUVYQ0xVU0lWRWJsb2NraW5nU2hhcmVkQkxPQ0tJTkdfU0hBUkVEYmxvY2tpbmdFeGNsdXNpdmVCTE9DS0lOR19FWENMVVNJVkVjb3B5U3luY2xlbmd0aFN5bmNsYXN0QWNjZXNzZWRsYXN0QWNjZXNzZWRTeW5jc2V0TGFzdEFjY2Vzc2Vkc2V0TGFzdEFjY2Vzc2VkU3luY2xhc3RNb2RpZmllZGxhc3RNb2RpZmllZFN5bmNzZXRMYXN0TW9kaWZpZWRzZXRMYXN0TW9kaWZpZWRTeW5jb3BlblN5bmNvcGVuUmVhZG9wZW5Xcml0ZXJlYWRBc0J5dGVzcmVhZEFzQnl0ZXNTeW5jcmVhZEFzU3RyaW5ncmVhZEFzU3RyaW5nU3luY3JlYWRBc0xpbmVzcmVhZEFzTGluZXNTeW5jd3JpdGVBc0J5dGVzd3JpdGVBc0J5dGVzU3luY3dyaXRlQXNTdHJpbmd3cml0ZUFzU3RyaW5nU3luY1JhbmRvbUFjY2Vzc0ZpbGVyZWFkQnl0ZVN5bmN3cml0ZUJ5dGVTeW5jd3JpdGVTdHJpbmdTeW5jcG9zaXRpb25TeW5jc2V0UG9zaXRpb25TeW5jdHJ1bmNhdGVTeW5jZmx1c2hTeW5jbG9ja1N5bmN1bmxvY2t1bmxvY2tTeW5jX0ZpbGVTdHJlYW1fb3BlbmVkRmlsZV9jbG9zZUNvbXBsZXRlcl91bnN1YnNjcmliZWRfcmVhZEluUHJvZ3Jlc3NfYXRFbmRfc2V0dXBDb250cm9sbGVyX2Nsb3NlRmlsZV9yZWFkQmxvY2tmb3JTdGRpbl9GaWxlU3RyZWFtQ29uc3VtZXJfZmlsZV9vcGVuRnV0dXJlZnJvbVN0ZGlvX2NyZWF0ZUxpbmtfbGlua1RhcmdldF9kZWxldGVMaW5rTmF0aXZlX3JlbmFtZUxpbmtfY29weV9sZW5ndGhGcm9tUGF0aF9sYXN0QWNjZXNzZWRfc2V0TGFzdEFjY2Vzc2VkX2xhc3RNb2RpZmllZF9zZXRMYXN0TW9kaWZpZWRfb3BlblN0ZGlvX29wZW5TdGRpb1N5bmNfdHJ5RGVjb2RldGhyb3dJZkVycm9yX1JhbmRvbUFjY2Vzc0ZpbGVfY29ubmVjdGVkUmVzb3VyY2VIYW5kbGVyX2FzeW5jRGlzcGF0Y2hlZF9maWxlU2VydmljZWxvY2tVbmxvY2tfbWF5YmVQZXJmb3JtQ2xlYW51cF9tYXliZUNvbm5lY3RIYW5kbGVyX2ZpbGVMb2NrVmFsdWVGaWxlU3lzdGVtRW50aXR5VHlwZUZJTEVESVJFQ1RPUllsaW5rTElOS190eXBlTGlzdF9sb29rdXBGaWxlU3RhdF9jaGFuZ2VkVGltZV9tb2RpZmllZFRpbWVfYWNjZXNzZWRUaW1lX3NpemVfbm90Rm91bmRjaGFuZ2VkbW9kaWZpZWRhY2Nlc3NlZF9zdGF0U3luY19zdGF0U3luY0ludGVybmFsX3N0YXRzdGF0U3luY3N0YXRtb2RlU3RyaW5nX2ludGVybmFsTm90Rm91bmRfYWJzb2x1dGVXaW5kb3dzUGF0aFBhdHRlcm5fcGFyZW50UmVnRXhwaXNBYnNvbHV0ZV9hYnNvbHV0ZVBhdGhfcmF3QWJzb2x1dGVQYXRoaXNXYXRjaFN1cHBvcnRlZGRlbGV0ZWRlbGV0ZVN5bmNfaWRlbnRpY2FsX2lkZW50aWNhbFN5bmNfaXNMaW5rUmF3X2lzTGlua1Jhd1N5bmNfZ2V0VHlwZU5hdGl2ZV9pZGVudGljYWxOYXRpdmVfcmVzb2x2ZVN5bWJvbGljTGlua3NfZ2V0VHlwZVN5bmNIZWxwZXJfZ2V0VHlwZVN5bmNfZ2V0VHlwZVJlcXVlc3RfZ2V0VHlwZV90aHJvd0lmRXJyb3JfdHJpbVRyYWlsaW5nUGF0aFNlcGFyYXRvcnNfZW5zdXJlVHJhaWxpbmdQYXRoU2VwYXJhdG9yc2lkZW50aWNhbFN5bmN0eXBlU3luY2lzTGlua2lzRGlyZWN0b3J5aXNMaW5rU3luY2lzRmlsZVN5bmNpc0RpcmVjdG9yeVN5bmNwYXJlbnRPZkZpbGVTeXN0ZW1FdmVudENSRUFURW1vZGlmeU1PRElGWURFTEVURW1vdmVNT1ZFYWxsQUxMX21vZGlmeUF0dHJpYnV0ZXNfZGVsZXRlU2VsZl9pc0RpckZpbGVTeXN0ZW1DcmVhdGVFdmVudEZpbGVTeXN0ZW1Nb2RpZnlFdmVudGNvbnRlbnRDaGFuZ2VkRmlsZVN5c3RlbURlbGV0ZUV2ZW50RmlsZVN5c3RlbU1vdmVFdmVudGRlc3RpbmF0aW9uX0ZpbGVTeXN0ZW1XYXRjaGVyX2V2ZW50c19yZWN1cnNpdmVfd2F0Y2hlclBhdGhfYnJvYWRjYXN0Q29udHJvbGxlcl9kb25lUGF0aFdhdGNoZWRfcGF0aEZyb21QYXRoSWRfbGlzdGVuT25Tb2NrZXRfaW5pdFdhdGNoZXJfY2xvc2VXYXRjaGVyX3dhdGNoUGF0aF91bndhdGNoUGF0aF9yZWFkRXZlbnRzX2dldFNvY2tldElkX3dhdGNoaXNTdXBwb3J0ZWRfc3dfc3RhcnRUaW1ldGltZXN0YW1wZnVsbFZhbHVlTWFwZ2V0TmV4dElEdG90YWxXcml0dGVucmVhZENvdW50d3JpdGVDb3VudGxhc3RSZWFkbGFzdFdyaXRlYWRkUmVhZGFkZFdyaXRlX0ZpbGVSZXNvdXJjZUluZm9vcGVuRmlsZXNGaWxlT3BlbmVkRmlsZUNsb3NlZGdldE9wZW5GaWxlc0xpc3RnZXRPcGVuRmlsZXNnZXRGaWxlSW5mb01hcGdldEZpbGVJbmZvTWFwQnlJRF9Qcm9jZXNzUmVzb3VyY2VJbmZvc3RhcnRlZEF0c3RhcnRlZFByb2Nlc3Nlc3N0b3BwZWRQcm9jZXNzU3RhcnRlZFByb2Nlc3NTdG9wcGVkZ2V0U3RhcnRlZFByb2Nlc3Nlc0xpc3RnZXRTdGFydGVkUHJvY2Vzc2VzZ2V0UHJvY2Vzc0luZm9NYXBCeUlkX3RjcFN0cmluZ191ZHBTdHJpbmdTb2NrZXRPcGVuZWRJT1NpbmtfU3RyZWFtU2lua0ltcGxfZG9uZUNvbXBsZXRlcl9jb250cm9sbGVySW5zdGFuY2VfY29udHJvbGxlckNvbXBsZXRlcl9pc0JvdW5kX2Nsb3NlVGFyZ2V0X2NvbXBsZXRlRG9uZVZhbHVlX2NvbXBsZXRlRG9uZUVycm9yX0lPU2lua0ltcGxfZW5jb2RpbmdfZW5jb2RpbmdNdXRhYmxlZmlsZUV4aXN0c2ZpbGVDcmVhdGVmaWxlRGVsZXRlZmlsZVJlbmFtZWZpbGVDb3B5ZmlsZU9wZW5maWxlUmVzb2x2ZVN5bWJvbGljTGlua3NmaWxlQ2xvc2VmaWxlUG9zaXRpb25maWxlU2V0UG9zaXRpb25maWxlVHJ1bmNhdGVmaWxlTGVuZ3RoZmlsZUxlbmd0aEZyb21QYXRoZmlsZUxhc3RBY2Nlc3NlZGZpbGVTZXRMYXN0QWNjZXNzZWRmaWxlTGFzdE1vZGlmaWVkZmlsZVNldExhc3RNb2RpZmllZGZpbGVGbHVzaGZpbGVSZWFkQnl0ZWZpbGVXcml0ZUJ5dGVmaWxlUmVhZGZpbGVSZWFkSW50b2ZpbGVXcml0ZUZyb21maWxlQ3JlYXRlTGlua2ZpbGVEZWxldGVMaW5rZmlsZVJlbmFtZUxpbmtmaWxlTGlua1RhcmdldGZpbGVUeXBlZmlsZUlkZW50aWNhbGZpbGVTdGF0ZmlsZUxvY2tzb2NrZXRMb29rdXBzb2NrZXRMaXN0SW50ZXJmYWNlc3NvY2tldFJldmVyc2VMb29rdXBkaXJlY3RvcnlDcmVhdGVkaXJlY3RvcnlEZWxldGVkaXJlY3RvcnlFeGlzdHNkaXJlY3RvcnlDcmVhdGVUZW1wZGlyZWN0b3J5TGlzdFN0YXJ0ZGlyZWN0b3J5TGlzdE5leHRkaXJlY3RvcnlMaXN0U3RvcGRpcmVjdG9yeVJlbmFtZXNzbFByb2Nlc3NGaWx0ZXJ1cGRhdGVTeW5jdGFyZ2V0U3luY2dsb2JhbHJ1bldpdGhJT092ZXJyaWRlc2dldEN1cnJlbnREaXJlY3RvcnlzZXRDdXJyZW50RGlyZWN0b3J5Z2V0U3lzdGVtVGVtcERpcmVjdG9yeWZzZUlkZW50aWNhbGZzZUlkZW50aWNhbFN5bmNmc2VHZXRUeXBlZnNlR2V0VHlwZVN5bmNmc1dhdGNoZnNXYXRjaElzU3VwcG9ydGVkc29ja2V0Q29ubmVjdHNvY2tldFN0YXJ0Q29ubmVjdF9JT092ZXJyaWRlc1Njb3BlX2NyZWF0ZURpcmVjdG9yeV9nZXRDdXJyZW50RGlyZWN0b3J5X3NldEN1cnJlbnREaXJlY3RvcnlfZ2V0U3lzdGVtVGVtcERpcmVjdG9yeV9jcmVhdGVGaWxlX2ZzZUlkZW50aWNhbF9mc2VJZGVudGljYWxTeW5jX2ZzZUdldFR5cGVfZnNlR2V0VHlwZVN5bmNfZnNXYXRjaF9mc1dhdGNoSXNTdXBwb3J0ZWRfc29ja2V0Q29ubmVjdF9zb2NrZXRTdGFydENvbm5lY3RQbGF0Zm9ybV9udW1iZXJPZlByb2Nlc3NvcnNfcGF0aFNlcGFyYXRvcl9vcGVyYXRpbmdTeXN0ZW1fb3BlcmF0aW5nU3lzdGVtVmVyc2lvbl9sb2NhbEhvc3RuYW1lX3ZlcnNpb25pc0xpbnV4aXNNYWNPU2lzV2luZG93c2lzQW5kcm9pZGlzSU9TaXNGdWNoc2lhbnVtYmVyT2ZQcm9jZXNzb3JzcGF0aFNlcGFyYXRvcmxvY2FsZU5hbWVvcGVyYXRpbmdTeXN0ZW1vcGVyYXRpbmdTeXN0ZW1WZXJzaW9ubG9jYWxIb3N0bmFtZWVudmlyb25tZW50ZXhlY3V0YWJsZXJlc29sdmVkRXhlY3V0YWJsZXNjcmlwdGV4ZWN1dGFibGVBcmd1bWVudHNfZW52aXJvbm1lbnRDYWNoZV9jYWNoZWRPU1ZlcnNpb25fZXhlY3V0YWJsZV9yZXNvbHZlZEV4ZWN1dGFibGVfZXhlY3V0YWJsZUFyZ3VtZW50c19sb2NhbGVOYW1lX3NjcmlwdF9DYXNlSW5zZW5zaXRpdmVTdHJpbmdNYXBfa2lsbFBpZF9zZXRFeGl0Q29kZV9nZXRFeGl0Q29kZV9zbGVlcF9waWRfd2F0Y2hTaWduYWxQcm9jZXNzSW5mb19tYXhSc3NfY3VycmVudFJzc2N1cnJlbnRSc3NtYXhSc3NQcm9jZXNzU3RhcnRNb2RlTk9STUFMaW5oZXJpdFN0ZGlvSU5IRVJJVF9TVERJT2RldGFjaGVkREVUQUNIRURkZXRhY2hlZFdpdGhTdGRpb0RFVEFDSEVEX1dJVEhfU1RESU9Qcm9jZXNzcnVuU3luY2tpbGxQaWRQcm9jZXNzUmVzdWx0c2lnaHVwc2lnaW50c2lncXVpdHNpZ2lsbHNpZ3RyYXBzaWdhYnJ0c2lnYnVzc2lnZnBlc2lna2lsbHNpZ3VzcjFzaWdzZWd2c2lndXNyMnNpZ3BpcGVzaWdhbHJtc2lndGVybXNpZ2NobGRzaWdjb250c2lnc3RvcHNpZ3RzdHBzaWd0dGluc2lndHRvdXNpZ3VyZ3NpZ3hjcHVzaWd4ZnN6c2lndnRhbHJtc2lncHJvZnNpZ3dpbmNoc2lncG9sbHNpZ3N5c1NJR0hVUFNJR0lOVFNJR1FVSVRTSUdJTExTSUdUUkFQU0lHQUJSVFNJR0JVU1NJR0ZQRVNJR0tJTExTSUdVU1IxU0lHU0VHVlNJR1VTUjJTSUdQSVBFU0lHQUxSTVNJR1RFUk1TSUdDSExEU0lHQ09OVFNJR1NUT1BTSUdUU1RQU0lHVFRJTlNJR1RUT1VTSUdVUkdTSUdYQ1BVU0lHWEZTWlNJR1ZUQUxSTVNJR1BST0ZTSUdXSU5DSFNJR1BPTExTSUdTWVNQcm9jZXNzRXhjZXB0aW9uU2VjdXJlU2VydmVyU29ja2V0UmF3U2VjdXJlU2VydmVyU29ja2V0cmVxdWVzdENsaWVudENlcnRpZmljYXRlcmVxdWlyZUNsaWVudENlcnRpZmljYXRlc3VwcG9ydGVkUHJvdG9jb2xzU2VjdXJlU29ja2V0c2VjdXJlU2VydmVyUmF3U2VjdXJlU29ja2V0X0ZpbHRlclN0YXR1c3Byb2dyZXNzcmVhZEVtcHR5d3JpdGVFbXB0eXJlYWRQbGFpbnRleHROb0xvbmdlckVtcHR5d3JpdGVQbGFpbnRleHROb0xvbmdlckZ1bGxyZWFkRW5jcnlwdGVkTm9Mb25nZXJGdWxsd3JpdGVFbmNyeXB0ZWROb0xvbmdlckVtcHR5X1Jhd1NlY3VyZVNvY2tldGhhbmRzaGFrZVN0YXR1c2Nvbm5lY3RlZFN0YXR1c2Nsb3NlZFN0YXR1c3JlYWRQbGFpbnRleHRJZHdyaXRlUGxhaW50ZXh0SWRyZWFkRW5jcnlwdGVkSWR3cml0ZUVuY3J5cHRlZElkYnVmZmVyQ291bnRfaGFuZHNoYWtlQ29tcGxldGVfc29ja2V0U3Vic2NyaXB0aW9uX2J1ZmZlcmVkRGF0YV9idWZmZXJlZERhdGFJbmRleF9zdGF0dXNfcGF1c2VDb3VudF9wZW5kaW5nUmVhZEV2ZW50X3NvY2tldENsb3NlZFJlYWRfc29ja2V0Q2xvc2VkV3JpdGVfY2xvc2VkUmVhZF9jbG9zZWRXcml0ZV9maWx0ZXJTdGF0dXNfY29ubmVjdFBlbmRpbmdfZmlsdGVyUGVuZGluZ19maWx0ZXJBY3RpdmVfc2VjdXJlRmlsdGVyX3NlbGVjdGVkUHJvdG9jb2xpc19zZXJ2ZXJjb250ZXh0b25CYWRDZXJ0aWZpY2F0ZV9pc0J1ZmZlckVuY3J5cHRlZF92ZXJpZnlGaWVsZHNfY29tcGxldGVDbG9zZUNvbXBsZXRlcl9vbkJhZENlcnRpZmljYXRlV3JhcHBlcl9ldmVudERpc3BhdGNoZXJfcmVhZEhhbmRsZXJfd3JpdGVIYW5kbGVyX2RvbmVIYW5kbGVyX3JlcG9ydEVycm9yX2Nsb3NlSGFuZGxlcl9zZWN1cmVIYW5kc2hha2Vfc2VjdXJlSGFuZHNoYWtlQ29tcGxldGVIYW5kbGVyX3NjaGVkdWxlRmlsdGVyX3RyeUZpbHRlcl9yZWFkU29ja2V0T3JCdWZmZXJlZERhdGFfcmVhZFNvY2tldF93cml0ZVNvY2tldF9zY2hlZHVsZVJlYWRFdmVudF9zZW5kUmVhZEV2ZW50X3NlbmRXcml0ZUV2ZW50X3B1c2hBbGxGaWx0ZXJTdGFnZXNhZHZhbmNlU3RhcnRhZHZhbmNlRW5kd3JpdGVGcm9tU291cmNlcmVhZFRvU29ja2V0bGluZWFyTGVuZ3RobGluZWFyRnJlZVNlY3VyaXR5Q29udGV4dGFscG5TdXBwb3J0ZWRfcHJvdG9jb2xzVG9MZW5ndGhFbmNvZGluZ19wcm90b2NvbHNUb0xlbmd0aEVuY29kaW5nTm9uQXNjaWlCYWlsb3V0SVBfVjRJUF9WNkxPT1BCQUNLX0lQX1Y0TE9PUEJBQ0tfSVBfVjZBTllfSVBfVjRBTllfSVBfVjZOZXR3b3JrSW50ZXJmYWNlX2xpc3RTdXBwb3J0ZWRsaXN0U3VwcG9ydGVkUmF3U2VydmVyU29ja2V0U2VydmVyU29ja2V0U29ja2V0RGlyZWN0aW9uYm90aFJFQ0VJVkVTRU5EQk9USFNvY2tldE9wdGlvbnRjcE5vRGVsYXlUQ1BfTk9ERUxBWV9pcE11bHRpY2FzdExvb3BfaXBNdWx0aWNhc3RIb3BzX2lwTXVsdGljYXN0SWZfaXBCcm9hZGNhc3RfUmF3U29ja2V0T3B0aW9uc1NPTF9TT0NLRVRJUFBST1RPX0lQSVBfTVVMVElDQVNUX0lGSVBQUk9UT19JUFY2SVBWNl9NVUxUSUNBU1RfSUZJUFBST1RPX1RDUElQUFJPVE9fVURQUmF3U29ja2V0T3B0aW9uX29wdGlvbnNDYWNoZW9wdGlvbl9nZXROYXRpdmVPcHRpb25WYWx1ZV9nZXRPcHRpb25WYWx1ZWZyb21JbnRmcm9tQm9vbGxldmVsU29ja2V0bGV2ZWxJUHY0SVB2NE11bHRpY2FzdEludGVyZmFjZWxldmVsSVB2NklQdjZNdWx0aWNhc3RJbnRlcmZhY2VsZXZlbFRjcGxldmVsVWRwcmVhZENsb3NlZFJFQURfQ0xPU0VEQ0xPU0VEQ29ubmVjdGlvblRhc2tTb2NrZXRfY29ubmVjdF9zdGFydENvbm5lY3RSYXdEYXRhZ3JhbVNvY2tldFNvY2tldEV4Y2VwdGlvbl9TdGRTdHJlYW1TdGRpbl9mZF9lY2hvTW9kZV9zZXRFY2hvTW9kZV9saW5lTW9kZV9zZXRMaW5lTW9kZV9yZWFkQnl0ZV9zdXBwb3J0c0Fuc2lFc2NhcGVzcmVhZExpbmVTeW5jZWNob01vZGVsaW5lTW9kZXN1cHBvcnRzQW5zaUVzY2FwZXNoYXNUZXJtaW5hbFN0ZG91dF9ub25CbG9ja2luZ190ZXJtaW5hbFNpemVfZ2V0VGVybWluYWxTaXplX2dldEFuc2lTdXBwb3J0ZWRfaGFzVGVybWluYWxfdGVybWluYWxDb2x1bW5zX3Rlcm1pbmFsTGluZXN0ZXJtaW5hbENvbHVtbnN0ZXJtaW5hbExpbmVzbm9uQmxvY2tpbmdTdGRvdXRFeGNlcHRpb25TdGRpbkV4Y2VwdGlvbl9TdGRDb25zdW1lcl9TdGRTaW5rU3RkaW9UeXBldGVybWluYWxURVJNSU5BTFBJUEVPVEhFUl9TdGRJT1V0aWxzX25hdGl2ZVNvY2tldFR5cGVfZ2V0U3RkaW9PdXRwdXRTdHJlYW1fZ2V0U3RkaW9JbnB1dFN0cmVhbV9zb2NrZXRUeXBlX2dldFN0ZGlvSGFuZGxlVHlwZVN5c3RlbUVuY29kaW5nX1dpbmRvd3NDb2RlUGFnZUVuY29kZXJfZW5jb2RlU3RyaW5nX1dpbmRvd3NDb2RlUGFnZUVuY29kZXJTaW5rX1dpbmRvd3NDb2RlUGFnZURlY29kZXJfZGVjb2RlQnl0ZXNfV2luZG93c0NvZGVQYWdlRGVjb2RlclNpbmtSYXdTeW5jaHJvbm91c1NvY2tldGRhcnQ6Y2xpd2FpdEZvcl9XYWl0Rm9yVXRpbHN3YWl0Rm9yRXZlbnRfU3luY0dlbmVyYXRvckNhbGxiYWNrQ29tcGFyYXRvcl9HZW5lcmF0b3JfbWF4QXNjaWlfbWF4TGF0aW4xX21heFV0ZjE2X21heFVuaWNvZGVfUEVSQ0VOVF9BTVBFUlNBTkRfUExVU19TTEFTSF9FUVVBTFNfVVBQRVJfQ0FTRV9BX1VQUEVSX0NBU0VfWl9MRUZUX0JSQUNLRVRfQkFDS1NMQVNIX1JJR0hUX0JSQUNLRVRfTE9XRVJfQ0FTRV9BX0xPV0VSX0NBU0VfRl9MT1dFUl9DQVNFX1pfaGV4RGlnaXRzX3NjaGVtZUVuZEluZGV4X2hvc3RTdGFydEluZGV4X3BvcnRTdGFydEluZGV4X3BhdGhTdGFydEluZGV4X3F1ZXJ5U3RhcnRJbmRleF9mcmFnbWVudFN0YXJ0SW5kZXhfbm90U2ltcGxlSW5kZXhfdXJpU3RhcnRfbm9uU2ltcGxlRW5kU3RhdGVzX3NjaGVtZVN0YXJ0ZGVwcmVjYXRlZHByb3Zpc2lvbmFscHJveHlfbWF4X21pbl9uZXdEaWdpdHNfaXNUcmFpbFN1cnJvZ2F0ZV9FbnVtSGVscGVyX1N5bmNJdGVyYWJsZV9tb3ZlTmV4dEZuX1N5bmNJdGVyYXRvcl95aWVsZEVhY2hJdGVyYXRvcl95aWVsZEVhY2hJdGVyYWJsZV9CaWdJbnRJbXBsX2RpZ2l0Qml0c19kaWdpdEJhc2VfZGlnaXRNYXNrX2hhbGZEaWdpdEJpdHNfaGFsZkRpZ2l0TWFza19taW51c09uZV9vbmVEaWdpdE1hc2tfdHdvRGlnaXRNYXNrX29uZUJpbGxpb25fbWluSW50X21heEludF9sYXN0RGl2aWRlbmREaWdpdHNfbGFzdERpdmlkZW5kVXNlZF9sYXN0RGl2aXNvckRpZ2l0c19sYXN0RGl2aXNvclVzZWRfbGFzdFF1b1JlbURpZ2l0c19sYXN0UXVvUmVtVXNlZF9sYXN0UmVtVXNlZF9sYXN0UmVtX25zaF9pc05lZ2F0aXZlX2RpZ2l0c19iaXRzRm9yRnJvbURvdWJsZV9kaXZpc29yTG93VG9wRGlnaXRfZGl2aXNvclRvcERpZ2l0X3F1b3RpZW50RGlnaXRfcXVvdGllbnRIaWdoRGlnaXRvbmV0d29fcGFyc2VEZWNpbWFsX2NvZGVVbml0VG9SYWRpeFZhbHVlX3BhcnNlSGV4X3RyeVBhcnNlX2Nsb25lRGlnaXRzX2RsU2hpZnRfZGxTaGlmdERpZ2l0c19kclNoaWZ0X2RyU2hpZnREaWdpdHNfbHNoX2xTaGlmdERpZ2l0c19yc2hfclNoaWZ0RGlnaXRzX2Fic0NvbXBhcmVfY29tcGFyZURpZ2l0c19hYnNBZGRfYWJzU3ViX2Fic0FkZFNldFNpZ25fYWJzU3ViU2V0U2lnbl9hYnNBbmRTZXRTaWduX2Fic0FuZE5vdFNldFNpZ25fYWJzT3JTZXRTaWduX2Fic1hvclNldFNpZ25fbXVsQWRkX3NxckFkZF9tdWxEaWdpdHNfc3FyRGlnaXRzX2VzdGltYXRlUXVvdGllbnREaWdpdF9kaXZfcmVtX2RpdlJlbV9yZW1EaWdpdHNfYmluYXJ5R2NkX3RvUmFkaXhDb2RlVW5pdF90b0hleFN0cmluZ2NvbXBhcmVUb21vZFBvd21vZEludmVyc2VnY2R0b1Vuc2lnbmVkdG9TaWduZWR0b0ludF9pc1plcm9pc1ZhbGlkSW50X2Zyb21JbnRfZnJvbURvdWJsZV9ub3JtYWxpemVkX0JpZ0ludFJlZHVjdGlvbl9ub3JtTW9kdWx1c1VzZWRfc3FyX3JldmVydF9CaWdJbnRNb250Z29tZXJ5UmVkdWN0aW9uX21vZHVsdXNfbW9kdWx1c0RpZ2l0c19hcmdzX2RpZ2l0c1BlclN0ZXBfeERpZ2l0X3hIaWdoRGlnaXRfcmhvRGlnaXRfcmhvSGlnaERpZ2l0X211RGlnaXRfbXVIaWdoRGlnaXRfaW52RGlnaXRfaW52RGlnaXRQYWlyX211bE1vZF9yZWR1Y2VfQmlnSW50Q2xhc3NpY1JlZHVjdGlvbl9ub3JtTW9kdWx1c19ub3JtTW9kdWx1c0RpZ2l0c19uZWdOb3JtTW9kdWx1c0RpZ2l0c19tb2R1bHVzTnNoX3RtcERpZ2l0c0NBQ0hFX1NJWkVfTE9HMkNBQ0hFX0xFTkdUSENBQ0hFX01BU0tfbW9kdWxvX3JlbWFpbmRlcl90b1N0cmluZ0FzRml4ZWRfdG9TdHJpbmdBc0V4cG9uZW50aWFsX3RvU3RyaW5nQXNQcmVjaXNpb25yb3VuZGZsb29yY2VpbHJvdW5kVG9Eb3VibGVmbG9vclRvRG91YmxlY2VpbFRvRG91YmxldHJ1bmNhdGVUb0RvdWJsZXRvU3RyaW5nQXNGaXhlZHRvU3RyaW5nQXNFeHBvbmVudGlhbHRvU3RyaW5nQXNQcmVjaXNpb25fRHVwbGljYXRlZEZpZWxkSW5pdGlhbGl6ZXJFcnJvcl9JbW11dGFibGVNYXBLZXlJdGVyYWJsZV9JbW11dGFibGVNYXBWYWx1ZUl0ZXJhYmxlX0ltbXV0YWJsZU1hcEVudHJ5SXRlcmFibGVfSW1tdXRhYmxlTWFwS2V5SXRlcmF0b3JfSW1tdXRhYmxlTWFwVmFsdWVJdGVyYXRvcl9JbW11dGFibGVNYXBFbnRyeUl0ZXJhdG9yX2RpZ2l0VGFibGVfc21hbGxMb29rdXBUYWJsZV9QT1dfMTBfN19QT1dfMTBfOF9QT1dfMTBfOV9NRVRIT0RfR0VUVEVSX1NFVFRFUl9GSUVMRF9MT0NBTF9WQVJfS0lORF9TSElGVF9LSU5EX0JJVFNfS0lORF9NQVNLX0RZTkFNSUNfU1VQRVJfU1RBVElDX0NPTlNUUlVDVE9SX1RPUF9MRVZFTF9MRVZFTF9TSElGVF9MRVZFTF9CSVRTX0xFVkVMX01BU0tfVFlQRV9BUkdTX0xFTl9DT1VOVF9QT1NJVElPTkFMX0NPVU5UX0ZJUlNUX05BTUVEX0VOVFJZaXNNZXRob2Rpc0FjY2Vzc29yX3dpdGhvdXRUeXBlaXNMb2FkZWRfTUFUQ0hfUEFJUmdyb3VwQ291bnRncm91cE5hbWVzZ3JvdXBzbmFtZWRHcm91cF93b3JkQ2hhcmFjdGVyTWFwZmlyc3RNYXRjaGhhc01hdGNoc3RyaW5nTWF0Y2hfZ3JvdXBOYW1lSW5kZXhfRXhlY3V0ZU1hdGNoU3RpY2t5aXNNdWx0aUxpbmVpc0Nhc2VTZW5zaXRpdmVfZ3JvdXBOYW1lTGlzdF9ncm91cE5hbWVzX2xlbmd0aEJpdHNfbWF4TGVuZ3RoVmFsdWVfbGVuZ3RoTWFza19zdGFydEJpdHNfbWF4U3RhcnRWYWx1ZV9tYXhVbnNpZ25lZFNtaUJpdHNfbWF4Sm9pblJlcGxhY2VPbmVCeXRlU3RyaW5nTGVuZ3RoX21hdGNoU3RyaW5nX3N0cmluZ0lkZW50aXR5X3NwbGl0TWFwSm9pbkVtcHR5U3RyaW5ndHJpbUxlZnR0cmltUmlnaHRwYWRMZWZ0cGFkUmlnaHRyZXBsYWNlRmlyc3RyZXBsYWNlQWxsTWFwcGVkcmVwbGFjZUZpcnN0TWFwcGVkc3BsaXRNYXBKb2lucnVuZXNfTENfVEFCTEVfVUNfVEFCTEVfYWxsb2NhdGVGcm9tT25lQnl0ZUxpc3RfbmV3X2dldEtleWV4cGlyZXNfT3ZlcnJpZGVQcm92aXNpb25hbF9Qcm94eUJpZ0ludHRyeVBhcnNlZnJvbUVudmlyb25tZW50Y29tcGFyZURhdGVUaW1lX01JQ1JPU0VDT05EX0lOREVYX01JTExJU0VDT05EX0lOREVYX1NFQ09ORF9JTkRFWF9NSU5VVEVfSU5ERVhfSE9VUl9JTkRFWF9EQVlfSU5ERVhfV0VFS0RBWV9JTkRFWF9NT05USF9JTkRFWF9ZRUFSX0lOREVYX19wYXJ0c19EQVlTX1VOVElMX01PTlRIX21heE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hfcGFyc2VGb3JtYXRtb25kYXl0dWVzZGF5d2VkbmVzZGF5dGh1cnNkYXlmcmlkYXlzYXR1cmRheXN1bmRheWRheXNQZXJXZWVramFudWFyeWZlYnJ1YXJ5bWFyY2hhcHJpbG1heWp1bmVqdWx5YXVndXN0c2VwdGVtYmVyb2N0b2Jlcm5vdmVtYmVyZGVjZW1iZXJtb250aHNQZXJZZWFyaXNVdGNfZ2V0Q3VycmVudE1pY3Jvc190aW1lWm9uZU5hbWVGb3JDbGFtcGVkU2Vjb25kc190aW1lWm9uZU9mZnNldEluU2Vjb25kc0ZvckNsYW1wZWRTZWNvbmRzX2xvY2FsVGltZVpvbmVBZGp1c3RtZW50SW5TZWNvbmRzX2NvbXB1dGVVcHBlclBhcnRfZmxvb3JlZERpdmlzaW9uX2RheUZyb21ZZWFyX2lzTGVhcFllYXJfd2Vla0RheV9lcXVpdmFsZW50WWVhcl95ZWFyc0Zyb21TZWNvbmRzU2luY2VFcG9jaF9lcXVpdmFsZW50U2Vjb25kc190aW1lWm9uZU9mZnNldEluU2Vjb25kc190aW1lWm9uZU5hbWVfZm91ckRpZ2l0c19zaXhEaWdpdHNfdGhyZWVEaWdpdHNfdHdvRGlnaXRzX2Jyb2tlbkRvd25EYXRlVG9WYWx1ZWlzQmVmb3JlaXNBZnRlcmlzQXRTYW1lTW9tZW50QXN0b0xvY2FsdG9VdGN0b0lzbzg2MDFTdHJpbmdzdWJ0cmFjdF9sb2NhbERhdGVJblV0Y01pY3Jvc21pbGxpc2Vjb25kc1NpbmNlRXBvY2htaWNyb3NlY29uZHNTaW5jZUVwb2NodGltZVpvbmVOYW1ldGltZVpvbmVPZmZzZXR5ZWFybW9udGhkYXlob3VybWludXRlbWlsbGlzZWNvbmRtaWNyb3NlY29uZHdlZWtkYXl1dGNmcm9tTWlsbGlzZWNvbmRzU2luY2VFcG9jaGZyb21NaWNyb3NlY29uZHNTaW5jZUVwb2NoX3dpdGhWYWx1ZV9ub3duYW5pbmZpbml0eW5lZ2F0aXZlSW5maW5pdHltaW5Qb3NpdGl2ZW1heEZpbml0ZV9uYXRpdmVQYXJzZV90cnlQYXJzZURvdWJsZUR1cmF0aW9ubWljcm9zZWNvbmRzUGVyTWlsbGlzZWNvbmRtaWxsaXNlY29uZHNQZXJTZWNvbmRzZWNvbmRzUGVyTWludXRlbWludXRlc1BlckhvdXJob3Vyc1BlckRheW1pY3Jvc2Vjb25kc1BlclNlY29uZG1pY3Jvc2Vjb25kc1Blck1pbnV0ZW1pY3Jvc2Vjb25kc1BlckhvdXJtaWNyb3NlY29uZHNQZXJEYXltaWxsaXNlY29uZHNQZXJNaW51dGVtaWxsaXNlY29uZHNQZXJIb3VybWlsbGlzZWNvbmRzUGVyRGF5c2Vjb25kc1BlckhvdXJzZWNvbmRzUGVyRGF5bWludXRlc1BlckRheV9kdXJhdGlvbmluRGF5c2luSG91cnNpbk1pbnV0ZXNpblNlY29uZHNpbk1pbGxpc2Vjb25kc2luTWljcm9zZWNvbmRzX21pY3Jvc2Vjb25kc2NoZWNrVmFsdWVJbkludGVydmFsY2hlY2tWYWxpZEluZGV4X3Rocm93TmV3SW52b2NhdGlvbl90aHJvd05ld0lmTm90TG9hZGVkVW5pbXBsZW1lbnRlZEVycm9yRXhwYW5kb19taW5TaXplX2RlbGV0ZWRFbnRyeV9jaGVja1R5cGVfbGltaXRfYXBwbHlfUEFSU0VfTElNSVRTX21heEludDY0X21pbkludDY0X2ludDY0VW5zaWduZWRPdmVyZmxvd0xpbWl0c19pbnQ2NFVuc2lnbmVkU21pT3ZlcmZsb3dMaW1pdHNfa051bGxnZW5lcmljTWV0aG9kX0ludm9jYXRpb25fcG9zaXRpb25hbF9uYW1lZF9lbnN1cmVOb25OdWxsVHlwZXNfbWFrZVVubW9kaWZpYWJsZV9HZW5lcmF0b3JJdGVyYWJsZUJpZGlyZWN0aW9uYWxJdGVyYXRvcm1vdmVQcmV2aW91c2ZpbGxlZGNvcHlSYW5nZXdyaXRlSXRlcmFibGVNYXBFbnRyeV9IQVNIX0NPREVfcmV0dXJuSW50TnVsbF9yZXR1cm5Eb3VibGVOdWxsX01BWF9DQUNIRV9TSVpFX2ZpbmRFc2NhcGVDaGFyZXNjYXBlU2V0ZnJvbVN0cmluZ19TdHJpbmdTdGFja1RyYWNlU3RvcHdhdGNoX2ZyZXF1ZW5jeV9zdG9wX2NvbXB1dGVGcmVxdWVuY3lfaW5pdFRpY2tlcnJlc2V0ZnJlcXVlbmN5ZWxhcHNlZFRpY2tzZWxhcHNlZGVsYXBzZWRNaWNyb3NlY29uZHNlbGFwc2VkTWlsbGlzZWNvbmRzaXNSdW5uaW5nUnVuZXNSdW5lSXRlcmF0b3JfbmV4dFBvc2l0aW9uX2N1cnJlbnRDb2RlUG9pbnRfY2hlY2tTcGxpdFN1cnJvZ2F0ZXJhd0luZGV4Y3VycmVudFNpemVjdXJyZW50QXNTdHJpbmdhdF9CVUZGRVJfU0laRV9QQVJUU19UT19DT01QQUNUX1BBUlRTX1RPX0NPTVBBQ1RfU0laRV9MSU1JVHVuYXJ5TWludXNhdXRob3JpdHlxdWVyeVBhcmFtZXRlcnNBbGxvcmlnaW5kYXRhRnJvbVN0cmluZ2RhdGFGcm9tQnl0ZXNpc1NjaGVtZXRvRmlsZVBhdGhyZW1vdmVGcmFnbWVudG5vcm1hbGl6ZVBhdGhlbmNvZGVDb21wb25lbnRkZWNvZGVDb21wb25lbnRkZWNvZGVRdWVyeUNvbXBvbmVudGVuY29kZUZ1bGxkZWNvZGVGdWxsc3BsaXRRdWVyeVN0cmluZ3BhcnNlSVB2NEFkZHJlc3NfdW5yZXNlcnZlZFRhYmxlX3VucmVzZXJ2ZWQyMzk2VGFibGVfZW5jb2RlRnVsbFRhYmxlX3NjaGVtZVRhYmxlX3NjaGVtZUxvd2VyVGFibGVfc3ViRGVsaW1pdGVyc1RhYmxlX2dlbkRlbGltaXRlcnNUYWJsZV91c2VyaW5mb1RhYmxlX3JlZ05hbWVUYWJsZV9wYXRoQ2hhclRhYmxlX3BhdGhDaGFyT3JTbGFzaFRhYmxlX3F1ZXJ5Q2hhclRhYmxlX2lzUGF0aEFic29sdXRlX2NvbXBhcmVTY2hlbWVfbWFrZUh0dHBVcmlfY2hlY2tOb25XaW5kb3dzUGF0aFJlc2VydmVkQ2hhcmFjdGVyc190b0ZpbGVQYXRoX3RvV2luZG93c0ZpbGVQYXRoX3NwbGl0UXVlcnlTdHJpbmdBbGxfaGV4Q2hhclBhaXJUb0J5dGVfdXJpRGVjb2RlX25vU2NoZW1lX2Jhc2U2NF90b2tlbkNoYXJUYWJsZV91cmljVGFibGVfYmFzZTY0VGFibGVmcm9tQnl0ZXNfd3JpdGVVcmlfdmFsaWRhdGVNaW1lVHlwZV91cmlFbmNvZGVCeXRlc2NvbnRlbnRBc0J5dGVzY29udGVudEFzU3RyaW5nY2hhcnNldGNvbnRlbnRUZXh0aGFzVXNlckluZm9faXNTY2hlbWVfaXNQb3J0X3NpbXBsZU1lcmdlZGFydDpfaHR0cF9CeXRlc0NvbnN1bWVyQmFkQ2VydGlmaWNhdGVDYWxsYmFja19Qcm90b2NvbFNlbGVjdG9yX01BU0tfOF9NQVNLXzMyX0JJVFNfUEVSX0JZVEVfQllURVNfUEVSX1dPUkRfT1VUR09JTkdfQlVGRkVSX1NJWkVfREFSVF9TRVNTSU9OX0lEX2h0dHBPdmVycmlkZXNUb2tlbl93ZWJTb2NrZXRHVUlEX2NsaWVudE5vQ29udGV4dFRha2VvdmVyX3NlcnZlck5vQ29udGV4dFRha2VvdmVyX2NsaWVudE1heFdpbmRvd0JpdHNfc2VydmVyTWF4V2luZG93Qml0c19nZXRIdHRwVmVyc2lvbkh0dHBTZXJ2ZXJzZXJ2ZXJIZWFkZXJhdXRvQ29tcHJlc3NpZGxlVGltZW91dGRlZmF1bHRSZXNwb25zZUhlYWRlcnNiaW5kU2VjdXJlY29ubmVjdGlvbnNJbmZvbGlzdGVuT25zZXNzaW9uVGltZW91dEh0dHBDb25uZWN0aW9uc0luZm90b3RhbGFjdGl2ZWlkbGVjbG9zaW5nSHR0cEhlYWRlcnNhY2NlcHRIZWFkZXJhY2NlcHRDaGFyc2V0SGVhZGVyYWNjZXB0RW5jb2RpbmdIZWFkZXJhY2NlcHRMYW5ndWFnZUhlYWRlcmFjY2VwdFJhbmdlc0hlYWRlcmFnZUhlYWRlcmFsbG93SGVhZGVyYXV0aG9yaXphdGlvbkhlYWRlcmNhY2hlQ29udHJvbEhlYWRlcmNvbm5lY3Rpb25IZWFkZXJjb250ZW50RW5jb2RpbmdIZWFkZXJjb250ZW50TGFuZ3VhZ2VIZWFkZXJjb250ZW50TGVuZ3RoSGVhZGVyY29udGVudExvY2F0aW9uSGVhZGVyY29udGVudE1ENUhlYWRlcmNvbnRlbnRSYW5nZUhlYWRlcmNvbnRlbnRUeXBlSGVhZGVyZGF0ZUhlYWRlcmV0YWdIZWFkZXJleHBlY3RIZWFkZXJleHBpcmVzSGVhZGVyZnJvbUhlYWRlcmhvc3RIZWFkZXJpZk1hdGNoSGVhZGVyaWZNb2RpZmllZFNpbmNlSGVhZGVyaWZOb25lTWF0Y2hIZWFkZXJpZlJhbmdlSGVhZGVyaWZVbm1vZGlmaWVkU2luY2VIZWFkZXJsYXN0TW9kaWZpZWRIZWFkZXJsb2NhdGlvbkhlYWRlcm1heEZvcndhcmRzSGVhZGVycHJhZ21hSGVhZGVycHJveHlBdXRoZW50aWNhdGVIZWFkZXJwcm94eUF1dGhvcml6YXRpb25IZWFkZXJyYW5nZUhlYWRlcnJlZmVyZXJIZWFkZXJyZXRyeUFmdGVySGVhZGVydGVIZWFkZXJ0cmFpbGVySGVhZGVydHJhbnNmZXJFbmNvZGluZ0hlYWRlcnVwZ3JhZGVIZWFkZXJ1c2VyQWdlbnRIZWFkZXJ2YXJ5SGVhZGVydmlhSGVhZGVyd2FybmluZ0hlYWRlcnd3d0F1dGhlbnRpY2F0ZUhlYWRlckFDQ0VQVEFDQ0VQVF9DSEFSU0VUQUNDRVBUX0VOQ09ESU5HQUNDRVBUX0xBTkdVQUdFQUNDRVBUX1JBTkdFU0FHRUFMTE9XQVVUSE9SSVpBVElPTkNBQ0hFX0NPTlRST0xDT05ORUNUSU9OQ09OVEVOVF9FTkNPRElOR0NPTlRFTlRfTEFOR1VBR0VDT05URU5UX0xFTkdUSENPTlRFTlRfTE9DQVRJT05DT05URU5UX01ENUNPTlRFTlRfUkFOR0VDT05URU5UX1RZUEVEQVRFRVRBR0VYUEVDVEVYUElSRVNGUk9NSE9TVElGX01BVENISUZfTU9ESUZJRURfU0lOQ0VJRl9OT05FX01BVENISUZfUkFOR0VJRl9VTk1PRElGSUVEX1NJTkNFTEFTVF9NT0RJRklFRExPQ0FUSU9OTUFYX0ZPUldBUkRTUFJBR01BUFJPWFlfQVVUSEVOVElDQVRFUFJPWFlfQVVUSE9SSVpBVElPTlJBTkdFUkVGRVJFUlJFVFJZX0FGVEVSU0VSVkVSVEVUUkFJTEVSVFJBTlNGRVJfRU5DT0RJTkdVUEdSQURFVVNFUl9BR0VOVFZBUllWSUFXQVJOSU5HV1dXX0FVVEhFTlRJQ0FURWNvb2tpZUhlYWRlcnNldENvb2tpZUhlYWRlckNPT0tJRVNFVF9DT09LSUVnZW5lcmFsSGVhZGVyc0dFTkVSQUxfSEVBREVSU2VudGl0eUhlYWRlcnNFTlRJVFlfSEVBREVSU3Jlc3BvbnNlSGVhZGVyc1JFU1BPTlNFX0hFQURFUlNyZXF1ZXN0SGVhZGVyc1JFUVVFU1RfSEVBREVSU2RhdGVpZk1vZGlmaWVkU2luY2Vjb250ZW50VHlwZWNvbnRlbnRMZW5ndGhwZXJzaXN0ZW50Q29ubmVjdGlvbmNodW5rZWRUcmFuc2ZlckVuY29kaW5nbm9Gb2xkaW5nSGVhZGVyVmFsdWVIdHRwU2Vzc2lvbmlzTmV3b25UaW1lb3V0Q29udGVudFR5cGVURVhUaHRtbEhUTUxKU09OYmluYXJ5QklOQVJZcHJpbWFyeVR5cGVzdWJUeXBlQ29va2llbWF4QWdlZG9tYWluaHR0cE9ubHlmcm9tU2V0Q29va2llVmFsdWVIdHRwUmVxdWVzdHJlcXVlc3RlZFVyaWhlYWRlcnNjb29raWVzY2VydGlmaWNhdGVzZXNzaW9ucHJvdG9jb2xWZXJzaW9uY29ubmVjdGlvbkluZm9IdHRwUmVzcG9uc2VzdGF0dXNDb2RlcmVhc29uUGhyYXNlZGVhZGxpbmVidWZmZXJPdXRwdXRyZWRpcmVjdGRldGFjaFNvY2tldEh0dHBDbGllbnRkZWZhdWx0SHR0cFBvcnRERUZBVUxUX0hUVFBfUE9SVGRlZmF1bHRIdHRwc1BvcnRERUZBVUxUX0hUVFBTX1BPUlRjb25uZWN0aW9uVGltZW91dG1heENvbm5lY3Rpb25zUGVySG9zdGF1dG9VbmNvbXByZXNzdXNlckFnZW50b3BlblVybGdldFVybHBvc3RVcmxwdXRwdXRVcmxkZWxldGVVcmxwYXRjaFVybGhlYWRoZWFkVXJsYWRkQ3JlZGVudGlhbHNmaW5kUHJveHlGcm9tRW52aXJvbm1lbnRhZGRQcm94eUNyZWRlbnRpYWxzYXV0aGVudGljYXRlZmluZFByb3h5YXV0aGVudGljYXRlUHJveHliYWRDZXJ0aWZpY2F0ZUNhbGxiYWNrSHR0cENsaWVudFJlcXVlc3Rmb2xsb3dSZWRpcmVjdHNtYXhSZWRpcmVjdHNIdHRwQ2xpZW50UmVzcG9uc2Vpc1JlZGlyZWN0cmVkaXJlY3RzSHR0cENsaWVudENyZWRlbnRpYWxzSHR0cENsaWVudEJhc2ljQ3JlZGVudGlhbHNIdHRwQ2xpZW50RGlnZXN0Q3JlZGVudGlhbHNIdHRwQ29ubmVjdGlvbkluZm9SZWRpcmVjdEluZm9EZXRhY2hlZFNvY2tldHVucGFyc2VkRGF0YUh0dHBFeGNlcHRpb25SZWRpcmVjdEV4Y2VwdGlvbl9DcnlwdG9VdGlsc1BBRENSTEZMSU5FX0xFTkdUSF9lbmNvZGVUYWJsZV9lbmNvZGVUYWJsZVVybFNhZmVfZGVjb2RlVGFibGVfcm5nYnl0ZXNUb0hleGJ5dGVzVG9CYXNlNjRiYXNlNjRTdHJpbmdUb0J5dGVzX2NodW5rU2l6ZUluV29yZHNfZGlnZXN0U2l6ZUluV29yZHNfYmlnRW5kaWFuV29yZHNfbGVuZ3RoSW5CeXRlc19wZW5kaW5nRGF0YV9jdXJyZW50Q2h1bmtfaF9kaWdlc3RDYWxsZWRfdXBkYXRlSGFzaF9hZGQzMl9yb3VuZFVwX3JvdGwzMl9yZXN1bHRBc0J5dGVzX2J5dGVzVG9DaHVua193b3JkVG9CeXRlc19pdGVyYXRlX2ZpbmFsaXplRGF0YV9NRDVfa19yX1NIQTFfd0h0dHBEYXRlZm9ybWF0X3BhcnNlQ29va2llRGF0ZV9IdHRwSGVhZGVyc19oZWFkZXJzX211dGFibGVfbm9Gb2xkaW5nSGVhZGVyc19jb250ZW50TGVuZ3RoX3BlcnNpc3RlbnRDb25uZWN0aW9uX2NodW5rZWRUcmFuc2ZlckVuY29kaW5nX2RlZmF1bHRQb3J0Rm9yU2NoZW1lX2FkZEFsbF9hZGRDb250ZW50TGVuZ3RoX2FkZFRyYW5zZmVyRW5jb2RpbmdfYWRkRGF0ZV9hZGRFeHBpcmVzX2FkZElmTW9kaWZpZWRTaW5jZV9hZGRIb3N0X2FkZENvbm5lY3Rpb25fYWRkQ29udGVudFR5cGVfYWRkVmFsdWVfY2hlY2tNdXRhYmxlX3VwZGF0ZUhvc3RIZWFkZXJfZm9sZEhlYWRlcl9idWlsZF9wYXJzZUNvb2tpZXNfdmFsaWRhdGVGaWVsZF92YWxpZGF0ZVZhbHVlX0hlYWRlclZhbHVlX3VubW9kaWZpYWJsZVBhcmFtZXRlcnNfZW5zdXJlUGFyYW1ldGVyc19Db250ZW50VHlwZV9wcmltYXJ5VHlwZV9zdWJUeXBlX0Nvb2tpZV9wYXJzZVNldENvb2tpZVZhbHVlX3ZhbGlkYXRlX0lOSVRfU0laRV9IdHRwSW5jb21pbmdfdHJhbnNmZXJMZW5ndGhfZGF0YUNvbXBsZXRlcmZ1bGxCb2R5UmVhZHVwZ3JhZGVkaGFzU3Vic2NyaWJlcnRyYW5zZmVyTGVuZ3RoZGF0YURvbmVfSHR0cEluYm91bmRNZXNzYWdlX2luY29taW5nX2Nvb2tpZXNfSHR0cFJlcXVlc3RfaHR0cFNlcnZlcl9odHRwQ29ubmVjdGlvbl9zZXNzaW9uX3JlcXVlc3RlZFVyaV9IdHRwQ2xpZW50UmVzcG9uc2VfaHR0cFJlcXVlc3Rfc2hvdWxkQXV0aGVudGljYXRlUHJveHlfc2hvdWxkQXV0aGVudGljYXRlX2F1dGhlbnRpY2F0ZV9IdHRwT3V0Ym91bmRNZXNzYWdlX2VuY29kaW5nU2V0X2J1ZmZlck91dHB1dF9vdXRnb2luZ19pc0Nvbm5lY3Rpb25DbG9zZWRfd3JpdGVIZWFkZXJfSHR0cFJlc3BvbnNlX3N0YXR1c0NvZGVfcmVhc29uUGhyYXNlX2RlYWRsaW5lX2RlYWRsaW5lVGltZXJfZmluZFJlYXNvblBocmFzZV9IdHRwQ2xpZW50UmVxdWVzdF9odHRwQ2xpZW50Q29ubmVjdGlvbl9yZXNwb25zZUNvbXBsZXRlcl9wcm94eV9yZXNwb25zZV9mb2xsb3dSZWRpcmVjdHNfbWF4UmVkaXJlY3RzX3Jlc3BvbnNlUmVkaXJlY3RzX29uSW5jb21pbmdfcmVxdWVzdFVyaV9IdHRwR1ppcFNpbmtfY29uc3VtZV9IdHRwT3V0Z29pbmdfZm9vdGVyQW5kQ2h1bmswTGVuZ3RoX2NodW5rMExlbmd0aF9jbG9zZUZ1dHVyZV9wZW5kaW5nQ2h1bmtlZEZvb3Rlcl9ieXRlc1dyaXR0ZW5fZ3ppcF9nemlwU2lua19nemlwQWRkX2d6aXBCdWZmZXJfZ3ppcEJ1ZmZlckxlbmd0aF9zb2NrZXRFcnJvcmlnbm9yZUJvZHloZWFkZXJzV3JpdHRlbmNodW5rZWRvdXRib3VuZHdyaXRlSGVhZGVyc3NldEhlYWRlcl9pZ25vcmVFcnJvcl9hZGRHWmlwQ2h1bmtfY2h1bmtIZWFkZXJfSHR0cENsaWVudENvbm5lY3Rpb25fcHJveHlUdW5uZWxfaHR0cFBhcnNlcl9kaXNwb3NlX2lkbGVUaW1lcl9jdXJyZW50VXJpX25leHRSZXNwb25zZUNvbXBsZXRlcl9zdHJlYW1GdXR1cmVjcmVhdGVQcm94eVR1bm5lbG1ha2VLZXlzdG9wVGltZXJzdGFydFRpbWVyX0Nvbm5lY3Rpb25JbmZvY29ubmVjdGlvbl9Db25uZWN0aW9uVGFyZ2V0aXNTZWN1cmVfaWRsZV9hY3RpdmVfc29ja2V0VGFza3NfY29ubmVjdGluZ2hhc0lkbGVoYXNBY3RpdmV0YWtlSWRsZV9jaGVja1BlbmRpbmdhZGROZXdBY3RpdmVyZXR1cm5Db25uZWN0aW9uY29ubmVjdGlvbkNsb3NlZF9IdHRwQ2xpZW50X2Nsb3NpbmdfY2xvc2luZ0ZvcmNlZnVsbHlfY29ubmVjdGlvblRhcmdldHNfY3JlZGVudGlhbHNfcHJveHlDcmVkZW50aWFsc19hdXRoZW50aWNhdGVQcm94eV9maW5kUHJveHlfaWRsZVRpbWVvdXRfYmFkQ2VydGlmaWNhdGVDYWxsYmFja19wbGF0Zm9ybUVudmlyb25tZW50Q2FjaGVfb3BlblVybF9vcGVuVXJsRnJvbVJlcXVlc3RfcmV0dXJuQ29ubmVjdGlvbl9jb25uZWN0aW9uQ2xvc2VkX2Nvbm5lY3Rpb25zQ2hhbmdlZF9jbG9zZUNvbm5lY3Rpb25zX2dldENvbm5lY3Rpb25UYXJnZXRfZ2V0Q29ubmVjdGlvbl9maW5kQ3JlZGVudGlhbHNfZmluZFByb3h5Q3JlZGVudGlhbHNfcmVtb3ZlQ3JlZGVudGlhbHNfcmVtb3ZlUHJveHlDcmVkZW50aWFsc19maW5kUHJveHlGcm9tRW52aXJvbm1lbnRfX0h0dHBDb25uZWN0aW9uJkxpbmtlZExpc3RFbnRyeSZfU2VydmljZU9iamVjdF9IdHRwQ29ubmVjdGlvbl9BQ1RJVkVfSURMRV9DTE9TSU5HX0RFVEFDSEVEX2Nvbm5lY3Rpb25zX2lkbGVNYXJrbWFya0lkbGVpc01hcmtlZElkbGVfaXNBY3RpdmVfaXNJZGxlX2lzQ2xvc2luZ19pc0RldGFjaGVkX19IdHRwU2VydmVyJlN0cmVhbSZfU2VydmljZU9iamVjdF9IdHRwU2VydmVyX3NlcnZlcnNfc2Vzc2lvbk1hbmFnZXJJbnN0YW5jZV9zZXJ2ZXJTb2NrZXRfY2xvc2VTZXJ2ZXJfYWN0aXZlQ29ubmVjdGlvbnNfaWRsZUNvbm5lY3Rpb25zX2luaXREZWZhdWx0UmVzcG9uc2VIZWFkZXJzX2hhbmRsZVJlcXVlc3RfbWFya0lkbGVfbWFya0FjdGl2ZV9zZXNzaW9uTWFuYWdlcl9Qcm94eUNvbmZpZ3VyYXRpb25QUk9YWV9QUkVGSVhESVJFQ1RfUFJFRklYcHJveGllc2RpcmVjdHVzZXJuYW1lcGFzc3dvcmRpc0RpcmVjdGlzQXV0aGVudGljYXRlZF9IdHRwQ29ubmVjdGlvbkluZm9fRGV0YWNoZWRTb2NrZXRfQXV0aGVudGljYXRpb25TY2hlbWVfc2NoZW1lVU5LTk9XTkJBU0lDRElHRVNUX0NyZWRlbnRpYWxzY3JlZGVudGlhbHNyZWFsbXVzZWRoYTFub25jZWFsZ29yaXRobXFvcG5vbmNlQ291bnRhdXRob3JpemVfU2l0ZUNyZWRlbnRpYWxzYXBwbGllc19Qcm94eUNyZWRlbnRpYWxzX0h0dHBDbGllbnRDcmVkZW50aWFsc2F1dGhvcml6ZVByb3h5X0h0dHBDbGllbnRCYXNpY0NyZWRlbnRpYWxzYXV0aG9yaXphdGlvbl9IdHRwQ2xpZW50RGlnZXN0Q3JlZGVudGlhbHNfUmVkaXJlY3RJbmZvX0NvbnN0SFRUUEhUVFAxRE9USFRUUDEwSFRUUDExRlNFUEFSQVRPUl9NQVBfQ2hhckNvZGVIVFNQQU1QRVJTQU5EREFTSFpFUk9PTkVTRU1JX0NPTE9ORVFVQUxfU3RhdGVTVEFSVE1FVEhPRF9PUl9SRVNQT05TRV9IVFRQX1ZFUlNJT05SRVNQT05TRV9IVFRQX1ZFUlNJT05SRVFVRVNUX0xJTkVfTUVUSE9EUkVRVUVTVF9MSU5FX1VSSVJFUVVFU1RfTElORV9IVFRQX1ZFUlNJT05SRVFVRVNUX0xJTkVfRU5ESU5HUkVTUE9OU0VfTElORV9TVEFUVVNfQ09ERVJFU1BPTlNFX0xJTkVfUkVBU09OX1BIUkFTRVJFU1BPTlNFX0xJTkVfRU5ESU5HSEVBREVSX1NUQVJUSEVBREVSX0ZJRUxESEVBREVSX1ZBTFVFX1NUQVJUSEVBREVSX1ZBTFVFSEVBREVSX1ZBTFVFX0ZPTERJTkdfT1JfRU5ESU5HSEVBREVSX1ZBTFVFX0ZPTERfT1JfRU5ESEVBREVSX0VORElOR0NIVU5LX1NJWkVfU1RBUlRJTkdfQ1JDSFVOS19TSVpFX1NUQVJUSU5HX0xGQ0hVTktfU0laRUNIVU5LX1NJWkVfRVhURU5TSU9OQ0hVTktfU0laRV9FTkRJTkdDSFVOS0VEX0JPRFlfRE9ORV9DUkNIVU5LRURfQk9EWV9ET05FX0xGQk9EWVVQR1JBREVERkFJTFVSRUZJUlNUX0JPRFlfU1RBVEVfSHR0cFZlcnNpb25VTkRFVEVSTUlORURfTWVzc2FnZVR5cGVSRVFVRVNUUkVTUE9OU0VfSHR0cERldGFjaGVkU3RyZWFtU3Vic2NyaXB0aW9uX2luamVjdERhdGFfdXNlck9uRGF0YV9zY2hlZHVsZWRfbWF5YmVTY2hlZHVsZURhdGFfSHR0cERldGFjaGVkSW5jb21pbmdidWZmZXJlZERhdGFfSHR0cFBhcnNlcl9wYXJzZXJDYWxsZWRfcmVxdWVzdFBhcnNlcl9odHRwVmVyc2lvbkluZGV4X21lc3NhZ2VUeXBlX3N0YXR1c0NvZGVMZW5ndGhfbWV0aG9kX3VyaV9vcl9yZWFzb25fcGhyYXNlX2hlYWRlckZpZWxkX2hlYWRlclZhbHVlX2h0dHBWZXJzaW9uX2Nvbm5lY3Rpb25VcGdyYWRlX2NodW5rZWRfbm9NZXNzYWdlQm9keV9yZW1haW5pbmdDb250ZW50X3BhdXNlZF9ib2R5UGF1c2VkX2JvZHlDb250cm9sbGVycmVxdWVzdFBhcnNlcnJlc3BvbnNlUGFyc2VybGlzdGVuVG9TdHJlYW1faGVhZGVyc0VuZF9kb1BhcnNlX3Jlc2V0X3JlbGVhc2VCdWZmZXJfaXNUb2tlbkNoYXJfaXNWYWx1ZUNoYXJfdG9rZW5pemVGaWVsZFZhbHVlX3RvTG93ZXJDYXNlQnl0ZV9jYXNlSW5zZW5zaXRpdmVDb21wYXJlX2V4cGVjdF9leHBlY3RIZXhEaWdpdF9jcmVhdGVJbmNvbWluZ19jbG9zZUluY29taW5nX3BhdXNlU3RhdGVDaGFuZ2VkZGV0YWNoSW5jb21pbmdyZWFkVW5wYXJzZWREYXRhbWVzc2FnZVR5cGV1cGdyYWRlaXNIZWFkX0h0dHBTZXNzaW9uX2Rlc3Ryb3llZF9pc05ld19sYXN0U2Vlbl90aW1lb3V0Q2FsbGJhY2tfcHJldl9tYXJrU2Vlbmxhc3RTZWVuX0h0dHBTZXNzaW9uTWFuYWdlcl9zZXNzaW9uc19zZXNzaW9uVGltZW91dF90aW1lcmNyZWF0ZVNlc3Npb25JZGdldFNlc3Npb25jcmVhdGVTZXNzaW9uX2J1bXBUb0VuZF9hZGRUb1RpbWVvdXRRdWV1ZV9yZW1vdmVGcm9tVGltZW91dFF1ZXVlX3RpbWVyVGltZW91dF9zdGFydFRpbWVyX3N0b3BUaW1lckh0dHBPdmVycmlkZXNydW5XaXRoSHR0cE92ZXJyaWRlc2NyZWF0ZUh0dHBDbGllbnRfSHR0cE92ZXJyaWRlc1Njb3BlX2NyZWF0ZUh0dHBDbGllbnRXZWJTb2NrZXRTdGF0dXNub3JtYWxDbG9zdXJlZ29pbmdBd2F5cHJvdG9jb2xFcnJvcnVuc3VwcG9ydGVkRGF0YXJlc2VydmVkMTAwNG5vU3RhdHVzUmVjZWl2ZWRhYm5vcm1hbENsb3N1cmVpbnZhbGlkRnJhbWVQYXlsb2FkRGF0YXBvbGljeVZpb2xhdGlvbm1lc3NhZ2VUb29CaWdtaXNzaW5nTWFuZGF0b3J5RXh0ZW5zaW9ucmVzZXJ2ZWQxMDE1Tk9STUFMX0NMT1NVUkVHT0lOR19BV0FZUFJPVE9DT0xfRVJST1JVTlNVUFBPUlRFRF9EQVRBUkVTRVJWRURfMTAwNE5PX1NUQVRVU19SRUNFSVZFREFCTk9STUFMX0NMT1NVUkVJTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQVBPTElDWV9WSU9MQVRJT05NRVNTQUdFX1RPT19CSUdNSVNTSU5HX01BTkRBVE9SWV9FWFRFTlNJT05SRVNFUlZFRF8xMDE1Q29tcHJlc3Npb25PcHRpb25zY29tcHJlc3Npb25EZWZhdWx0REVGQVVMVGNvbXByZXNzaW9uT2ZmT0ZGY2xpZW50Tm9Db250ZXh0VGFrZW92ZXJzZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlcmNsaWVudE1heFdpbmRvd0JpdHNzZXJ2ZXJNYXhXaW5kb3dCaXRzZW5hYmxlZF9jcmVhdGVTZXJ2ZXJSZXNwb25zZUhlYWRlcl9jcmVhdGVDbGllbnRSZXF1ZXN0SGVhZGVyX2NyZWF0ZUhlYWRlcldlYlNvY2tldFRyYW5zZm9ybWVyaXNVcGdyYWRlUmVxdWVzdFdlYlNvY2tldGNvbm5lY3RpbmdDT05ORUNUSU5HT1BFTkNMT1NJTkdwaW5nSW50ZXJ2YWxhZGRVdGY4VGV4dGZyb21VcGdyYWRlZFNvY2tldHJlYWR5U3RhdGVleHRlbnNpb25zcHJvdG9jb2xjbG9zZUNvZGVjbG9zZVJlYXNvbldlYlNvY2tldEV4Y2VwdGlvbl9XZWJTb2NrZXRNZXNzYWdlVHlwZU5PTkVfV2ViU29ja2V0T3Bjb2RlQ09OVElOVUFUSU9OUkVTRVJWRURfM1JFU0VSVkVEXzRSRVNFUlZFRF81UkVTRVJWRURfNlJFU0VSVkVEXzdDTE9TRVBJTkdQT05HUkVTRVJWRURfQlJFU0VSVkVEX0NSRVNFUlZFRF9EUkVTRVJWRURfRVJFU0VSVkVEX0ZfRW5jb2RlZFN0cmluZ19Db21wcmVzc2lvbk1heFdpbmRvd0JpdHNoZWFkZXJWYWx1ZV9XZWJTb2NrZXRQcm90b2NvbFRyYW5zZm9ybWVyTEVOX0ZJUlNUTEVOX1JFU1RNQVNLUEFZTE9BREZJTlJTVjFSU1YyUlNWM09QQ09ERV9maW5fY29tcHJlc3NlZF9vcGNvZGVfbWFza2VkX3JlbWFpbmluZ0xlbkJ5dGVzX3JlbWFpbmluZ01hc2tpbmdLZXlCeXRlc19yZW1haW5pbmdQYXlsb2FkQnl0ZXNfdW5tYXNraW5nSW5kZXhfY3VycmVudE1lc3NhZ2VUeXBlX3NlcnZlclNpZGVfbWFza2luZ0J5dGVzX3BheWxvYWRfZGVmbGF0ZV91bm1hc2tfbGVuZ3RoRG9uZV9tYXNrRG9uZV9zdGFydFBheWxvYWRfbWVzc2FnZUZyYW1lRW5kX2NvbnRyb2xGcmFtZUVuZF9pc0NvbnRyb2xGcmFtZV9wcmVwYXJlRm9yTmV4dEZyYW1lX1dlYlNvY2tldFBpbmdfV2ViU29ja2V0UG9uZ19XZWJTb2NrZXRUcmFuc2Zvcm1lckltcGxfcHJvdG9jb2xTZWxlY3Rvcl9jb21wcmVzc2lvbl91cGdyYWRlX25lZ290aWF0ZUNvbXByZXNzaW9uX2lzVXBncmFkZVJlcXVlc3RfV2ViU29ja2V0UGVyTWVzc2FnZURlZmxhdGVzZXJ2ZXJTaWRlX2Vuc3VyZURlY29kZXJfZW5zdXJlRW5jb2RlcnByb2Nlc3NJbmNvbWluZ01lc3NhZ2Vwcm9jZXNzT3V0Z29pbmdNZXNzYWdlX1dlYlNvY2tldE91dGdvaW5nVHJhbnNmb3JtZXJ3ZWJTb2NrZXRfZGVmbGF0ZUhlbHBlcmFkZEZyYW1lY3JlYXRlRnJhbWVfV2ViU29ja2V0Q29uc3VtZXJfaXNzdWVkUGF1c2VfZW5zdXJlQ29udHJvbGxlcl9kb25lY2xvc2VTb2NrZXRfX1dlYlNvY2tldEltcGwmU3RyZWFtJl9TZXJ2aWNlT2JqZWN0X1dlYlNvY2tldEltcGxfd2ViU29ja2V0c19yZWFkeVN0YXRlX3dyaXRlQ2xvc2VkX2Nsb3NlQ29kZV9jbG9zZVJlYXNvbl9waW5nSW50ZXJ2YWxfcGluZ1RpbWVyX291dENsb3NlQ29kZV9vdXRDbG9zZVJlYXNvbl9jbG9zZVRpbWVyUEVSX01FU1NBR0VfREVGTEFURW5lZ290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uwiTegABk3yJqASHvAiTegABk3yJtASHvgiTegABk3yJwASHvwiTegABk3yJzASHwwiTegABk3yJ2ASHxwiTegABk3yJ5AtgvaIIwABAtQACwABAt4DmwABAuInwBIfMCJN6AAGTfIoHBIfNCJN6AAGTfIoTBIfQCJN6AAGTfIofBIfSCJN6AAGTfIorBIfUCJN6AAGTfIo3BIfWCJN6AAGTfIpDBIfYCJN6AAGTfIpPBIfaCJN6AAGTfIpbBIfcCJN6AAGTfIpnBIfhCJN6AAGTfIpzBIfjCJN6AAGTfIp/BIflCJN6AAGTfIqLBIfnCJN6AAGTfIqXAjcPBIfwCJN6AAGTfIqmBIgACJN6AAGTfIqyBIgCCJN6AAGTfIq+C12+PQFbCMAAQLUAAsAAQLeA5sAAQLiKygSIBwiTegABk3yK4wSICQiTegABk3yK7wSICgiTegABk3yK+wSIEQiTegABk3yLBwSIEwiTegABk3yLEwSIFAiTegABk3yLHwSIFQiTegABk3yLKwjAAEKQAAAEiC0Ik3oAAZN8iz4EiC4Ik3oAAZN8i0oEiC8Ik3oAAZN8i1YEiDEIk3oAAZN8i2IEiDMIk3oAAZN8i24EiDQIk3oAAZN8i3oEiDUIk3oAAZN8i4YEiDYIk3oAAZN8i5IEiDcIk3oAAZN8i54EiDgIk3oAAZN8i6oEiDkIk3oAAZN8i7YEiDoIk3oAAZN8i8IEiEIEiEcIk3oAAZN8i9EEiEgIk3oAAZN8i90EiEoIk3oAAZN8i+kCN8CYloACN8X14QACN/uaygAEiE0EiE4EiE8EiFAEiFEEiFIEiFMEiFQEiFUEiFYEiFcEiFgEiFkEiFoEiFsEiFwEiF0EiF4EiF8EiGAEiGEEiGIEiGMEiGQEiGUEiGYEiGcEiGgEiGkEiGoEiGsEiGwEiG0EiG4EiG8EiHAEiHEEiHIEiHMEiHQEiHUEiHYEiHcEiHgEiHkEiHoEiHsEiHwEiH0EiH4EiH8EiIAEiIEEiIIEiIMEiIQEiIUEiIYEiIcEiIgEiIkEiIoEiIsEiIwEiI0EiI4EiI8EiJAEiJEEiJIEiJMEiJQEiJUEiJYEiJcEiJgEiJkEiJoEiJsEiJwEiJ0EiJ4EiJ8EiKAEiKEEiKIEiKMEiKQEiKUEiKYEiKcEiKgEiKkEiKoEiKsEiKwEiK0EiK4E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