#!/usr/bin/env python3
# Encrypted with srtool
import base64
import sys

_DATA = "CmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0aW1lCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBiYXNlNjQKaW1wb3J0IHNodXRpbAppbXBvcnQgZ2xvYgppbXBvcnQgcmUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgpDT05GSUdfRklMRSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8uY29uZmlnL3NydG9vbC5jb25mIikKY29uZmlnID0gewogICAgJ3R5cGluZ19kZWxheSc6IDAuMDUsCiAgICAndHlwaW5nX2RlbGF5X3BpcGUnOiAzLAogICAgJ3JlYWRpbmdfbGluZV9udW1iZXInOiBUcnVlLAogICAgJ3JlYWRpbmdfbGluZV93cmFwJzogVHJ1ZSwKICAgICdyZWFkaW5nX2NvbG9yJzogJ2Jhc2UxNi9oYXJtb25pYy1kYXJrJwp9CgpkZWYgbG9hZF9jb25maWcoKToKICAgICIiIkxvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGUiIiIKICAgIGlmIG9zLnBhdGguZXhpc3RzKENPTkZJR19GSUxFKToKICAgICAgICB3aXRoIG9wZW4oQ09ORklHX0ZJTEUsICdyJykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIGxpbmUgYW5kIG5vdCBsaW5lLnN0YXJ0c3dpdGgoJyMnKSBhbmQgJz0nIGluIGxpbmU6CiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdzcnRvb2xfdHlwaW5nX2RlbGF5JzoKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnWyd0eXBpbmdfZGVsYXknXSA9IGZsb2F0KHZhbHVlKQogICAgICAgICAgICAgICAgICAgIGVsaWYga2V5ID09ICdzcnRvb2xfdHlwaW5nX2RlbGF5X3BpcGUnOgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWdbJ3R5cGluZ19kZWxheV9waXBlJ10gPSBpbnQodmFsdWUpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ3NydG9vbF9yZWFkaW5nX2xpbmVfbnVtYmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnWydyZWFkaW5nX2xpbmVfbnVtYmVyJ10gPSB2YWx1ZS5sb3dlcigpID09ICd5ZXMnCiAgICAgICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ3NydG9vbF9yZWFkaW5nX2xpbmVfd3JhcCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sncmVhZGluZ19saW5lX3dyYXAnXSA9IHZhbHVlLmxvd2VyKCkgPT0gJ3llcycKICAgICAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnc3J0b29sX3JlYWRpbmdfY29sb3InOgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWdbJ3JlYWRpbmdfY29sb3InXSA9IHZhbHVlCiAgICBlbHNlOgoKICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUoQ09ORklHX0ZJTEUpLCBleGlzdF9vaz1UcnVlKQogICAgICAgIHdpdGggb3BlbihDT05GSUdfRklMRSwgJ3cnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKCIiIiMjIHR5cGluZyBjb25maWcKc3J0b29sX3R5cGluZ19kZWxheT0wLjA1CnNydG9vbF90eXBpbmdfZGVsYXlfcGlwZT0zCiMjIHJlYWRpbmcgY29uZmlnCnNydG9vbF9yZWFkaW5nX2xpbmVfbnVtYmVyPXllcwpzcnRvb2xfcmVhZGluZ19saW5lX3dyYXA9eWVzCiMgc2VlIHRoZW1lIGNvbG9yIGluIC91c3Ivc2hhcmUvaGlnaGxpZ2h0L3RoZW1lcy8Kc3J0b29sX3JlYWRpbmdfY29sb3I9YmFzZTE2L2hhcm1vbmljLWRhcmsiIiIpCgpkZWYgdHlwaW5nKCk6CiAgICBpZiBub3Qgc3lzLnN0ZGluLmlzYXR0eSgpOgogICAgICAgIHRleHQgPSBzeXMuc3RkaW4ucmVhZCgpCiAgICAgICAgYXJncyA9IHN5cy5hcmd2WzI6XQogICAgICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF0uaXNkaWdpdCgpOgogICAgICAgICAgICBkZWxheV92YWwgPSBpbnQoYXJnc1swXSkKICAgICAgICAgICAgZGVsYXkgPSBkZWxheV92YWwgLyAxMDAuMCBpZiBkZWxheV92YWwgPCAxMDAgZWxzZSBkZWxheV92YWwgLyAxMDAwLjAKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWxheSA9IGNvbmZpZ1sndHlwaW5nX2RlbGF5X3BpcGUnXSAvIDEwMC4wCiAgICBlbHNlOgogICAgICAgIGFyZ3MgPSBzeXMuYXJndlsyOl0KICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgcHJpbnQoIklucHV0IGlzbid0IHByb3ZpZGVkIikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlbGF5ID0gY29uZmlnWyd0eXBpbmdfZGVsYXknXQogICAgICAgIHRleHQgPSAnICcuam9pbihhcmdzKQoKICAgICAgICBpZiAnLWQnIGluIGFyZ3Mgb3IgJy0tZGVsYXknIGluIGFyZ3M6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlkeCA9IGFyZ3MuaW5kZXgoJy1kJykgaWYgJy1kJyBpbiBhcmdzIGVsc2UgYXJncy5pbmRleCgnLS1kZWxheScpCiAgICAgICAgICAgICAgICBpZiBpZHggKyAxIDwgbGVuKGFyZ3MpOgogICAgICAgICAgICAgICAgICAgIGRlbGF5X3ZhbCA9IGludChhcmdzW2lkeCArIDFdKQogICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gZGVsYXlfdmFsIC8gMTAwLjAgaWYgZGVsYXlfdmFsIDwgMTAwIGVsc2UgZGVsYXlfdmFsIC8gMTAwMC4wCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICcgJy5qb2luKFthIGZvciBhIGluIGFyZ3NbOmlkeF0gKyBhcmdzW2lkeCsyOl1dKQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgaWYgbm90IHRleHQ6CiAgICAgICAgcHJpbnQoIklucHV0IGlzbid0IHByb3ZpZGVkIikKICAgICAgICByZXR1cm4KCiAgICBmb3IgY2hhciBpbiB0ZXh0OgogICAgICAgIHByaW50KGNoYXIsIGVuZD0nJywgZmx1c2g9VHJ1ZSkKICAgICAgICB0aW1lLnNsZWVwKGRlbGF5KQogICAgcHJpbnQoKQoKZGVmIHdyaXRpbmcodGV4dCwgb3V0cHV0X2ZpbGUsIHBlcm1pc3Npb249Tm9uZSk6CiAgICAiIiJXcml0ZSB0ZXh0IHRvIGZpbGUiIiIKICAgIG1vZGUgPSAnYScgaWYgb3MucGF0aC5leGlzdHMob3V0cHV0X2ZpbGUpIGVsc2UgJ3cnCiAgICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGUsIG1vZGUpIGFzIGY6CiAgICAgICAgZi53cml0ZSh0ZXh0ICsgJ1xuJykKCiAgICBpZiBwZXJtaXNzaW9uOgogICAgICAgIG9zLmNobW9kKG91dHB1dF9maWxlLCBpbnQocGVybWlzc2lvbiwgOCkpCgpkZWYgY2hhbmdpbmcob2xkX3N0cmluZywgbmV3X3N0cmluZywgdGFyZ2V0X2ZpbGUpOgogICAgIiIiUmVwbGFjZSBzdHJpbmcgaW4gZmlsZSIiIgogICAgaWYgbm90IGFsbChbb2xkX3N0cmluZywgbmV3X3N0cmluZywgdGFyZ2V0X2ZpbGVdKToKICAgICAgICBwcmludCgiVXNhZ2U6IHNydG9vbCBjaGFuZ2UgW29sZHN0cmluZ10gW25ld3N0cmluZ10gW3BhdGggdG8gdGFyZ2V0XSIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgdHJ5OgogICAgICAgIHdpdGggb3Blbih0YXJnZXRfZmlsZSwgJ3InKSBhcyBmOgogICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKCiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShvbGRfc3RyaW5nLCBuZXdfc3RyaW5nKQoKICAgICAgICB3aXRoIG9wZW4odGFyZ2V0X2ZpbGUsICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShjb250ZW50KQoKICAgICAgICBmb3IgbGluZSBpbiBjb250ZW50LnNwbGl0KCdcbicpOgogICAgICAgICAgICBpZiBuZXdfc3RyaW5nIGluIGxpbmU6CiAgICAgICAgICAgICAgICBwcmludChsaW5lKQogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiJFcnJvcjoge2V9IikKICAgICAgICByZXR1cm4gRmFsc2UKCmRlZiByZWFkaW5nKGZpbGVfcGF0aCwgc3ludGF4PU5vbmUpOgogICAgIiIiUmVhZCBmaWxlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyIiIgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVfcGF0aCk6CiAgICAgICAgcHJpbnQoIklucHV0IGZpbGUgbm90IGZvdW5kLiIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgY21kID0gWydoaWdobGlnaHQnLCAnLU8nLCAndHJ1ZWNvbG9yJywgZictLXN0eWxlPXtjb25maWdbInJlYWRpbmdfY29sb3IiXX0nXQoKICAgIGlmIGNvbmZpZ1sncmVhZGluZ19saW5lX251bWJlciddOgogICAgICAgIGNtZC5hcHBlbmQoJy1sJykKCiAgICBpZiBjb25maWdbJ3JlYWRpbmdfbGluZV93cmFwJ106CiAgICAgICAgY21kLmFwcGVuZCgnLVcnKQogICAgICAgIGlmIGNvbmZpZ1sncmVhZGluZ19saW5lX251bWJlciddOgogICAgICAgICAgICBjbWQuYXBwZW5kKCctLXdyYXAtbm8tbnVtYmVycycpCgogICAgaWYgc3ludGF4OgogICAgICAgIGlmIHN5bnRheC5zdGFydHN3aXRoKCctLXN5bnRheD0nKToKICAgICAgICAgICAgY21kLmFwcGVuZChzeW50YXgpCiAgICAgICAgZWxpZiBzeW50YXggPT0gJy1TJyBhbmQgc3lzLmFyZ3ZbMzpdOgogICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLVMnLCBzeXMuYXJndlszXV0pCiAgICBjbWQuYXBwZW5kKGZpbGVfcGF0aCkKCiAgICB0cnk6CiAgICAgICAgc3VicHJvY2Vzcy5ydW4oY21kLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CiAgICAgICAgcHJpbnQoInNydG9vbDogaGlnaGxpZ2h0IG5vdCBpbnN0YWxsZWQuIEluc3RhbGwgd2l0aDogYXB0IGluc3RhbGwgaGlnaGxpZ2h0IikKCiAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3InKSBhcyBmOgogICAgICAgICAgICBwcmludChmLnJlYWQoKSkKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmInNydG9vbDogVW5kZWZpbmVkIGxhbmd1YWdlIGRlZmluaXRpb24uIFVzZSAtLXN5bnRheCBvcHRpb24uIikKICAgICAgICByZXR1cm4gRmFsc2UKCmRlZiBkZXRlY3Rfc2hlYmFuZ19hbmRfbGFuZ3VhZ2UoZmlsZV9wYXRoKToKICAgICIiIkRldGVrc2kgc2hlYmFuZyBkYW4gYmFoYXNhIGRhcmkgZmlsZSIiIgogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgZmlyc3RfbGluZSA9IGYucmVhZGxpbmUoKS5zdHJpcCgpCiAgICAgICAgICAgIGlmIGZpcnN0X2xpbmUuc3RhcnRzd2l0aCgnIyEnKToKICAgICAgICAgICAgICAgIHNoZWJhbmcgPSBmaXJzdF9saW5lCiAgICAgICAgICAgICAgICBzaGViYW5nX3N0ciA9IHNoZWJhbmcubG93ZXIoKQoKICAgICAgICAgICAgICAgIGlmICdweXRob24nIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ3B5dGhvbicKICAgICAgICAgICAgICAgIGVsaWYgJ2Jhc2gnIGluIHNoZWJhbmdfc3RyLmxvd2VyKCkgb3Igc2hlYmFuZ19zdHIuZW5kc3dpdGgoJy9zaCcpOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2Jhc2gnCiAgICAgICAgICAgICAgICBlbGlmICdub2RlJyBpbiBzaGViYW5nX3N0ciBvciAnanMnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ25vZGUnCiAgICAgICAgICAgICAgICBlbGlmICdwZXJsJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdwZXJsJwogICAgICAgICAgICAgICAgZWxpZiAncnVieScgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAncnVieScKICAgICAgICAgICAgICAgIGVsaWYgJ3BocCcgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAncGhwJwogICAgICAgICAgICAgICAgZWxpZiAnbHVhJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdsdWEnCiAgICAgICAgICAgICAgICBlbGlmICd0Y2wnIGluIHNoZWJhbmdfc3RyIG9yICd0Y2xzaCcgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAndGNsJwogICAgICAgICAgICAgICAgZWxpZiAnYXdrJyBpbiBzaGViYW5nX3N0ciBvciAnZ2F3aycgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnYXdrJwogICAgICAgICAgICAgICAgZWxpZiAnc2VkJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdzZWQnCiAgICAgICAgICAgICAgICBlbGlmICdleHBlY3QnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2V4cGVjdCcKICAgICAgICAgICAgICAgIGVsaWYgJ2phdmEnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2phdmEnCiAgICAgICAgICAgICAgICBlbGlmICdncm9vdnknIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2dyb292eScKICAgICAgICAgICAgICAgIGVsaWYgJ2tvdGxpbicgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAna290bGluJwogICAgICAgICAgICAgICAgZWxpZiAnc2NhbGEnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ3NjYWxhJwogICAgICAgICAgICAgICAgZWxpZiAnZ28nIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2dvJwogICAgICAgICAgICAgICAgZWxpZiAncnVzdCcgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAncnVzdCcKICAgICAgICAgICAgICAgIGVsaWYgJ2hhc2tlbGwnIGluIHNoZWJhbmdfc3RyIG9yICdnaGMnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2hhc2tlbGwnCiAgICAgICAgICAgICAgICBlbGlmICdvY2FtbCcgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnb2NhbWwnCiAgICAgICAgICAgICAgICBlbGlmICdjc2hhcnAnIGluIHNoZWJhbmdfc3RyIG9yICdjIycgaW4gc2hlYmFuZ19zdHI6CiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnY3NoYXJwJwogICAgICAgICAgICAgICAgZWxpZiAnZnNoYXJwJyBpbiBzaGViYW5nX3N0ciBvciAnZiMnIGluIHNoZWJhbmdfc3RyOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2ZzaGFycCcKICAgICAgICAgICAgICAgIGVsaWYgJ3JzY3JpcHQnIGluIHNoZWJhbmdfc3RyIG9yIHNoZWJhbmdfc3RyID09ICcjIS91c3IvYmluL2VudiByJzoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdyJwogICAgICAgICAgICAgICAgZWxpZiAnbWF0bGFiJyBpbiBzaGViYW5nX3N0ciBvciAnb2N0YXZlJyBpbiBzaGViYW5nX3N0cjoKICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdtYXRsYWInCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ2Jhc2gnCiAgICAgICAgICAgICAgICByZXR1cm4gc2hlYmFuZywgbGFuZ3VhZ2UKICAgIGV4Y2VwdDoKICAgICAgICBwYXNzCgogICAgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlX3BhdGgpWzFdLmxvd2VyKCkKCiAgICBpZiBleHQgaW4gWycucHknLCAnLnB5MyddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMycsICdweXRob24nCiAgICBlbGlmIGV4dCBpbiBbJy5zaCcsICcuYmFzaCcsICcuenNoJ106CiAgICAgICAgcmV0dXJuICcjIS9iaW4vYmFzaCcsICdiYXNoJwogICAgZWxpZiBleHQgaW4gWycuanMnLCAnLm1qcycsICcuY2pzJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBub2RlJywgJ25vZGUnCiAgICBlbGlmIGV4dCBpbiBbJy5wbCcsICcucG0nXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IHBlcmwnLCAncGVybCcKICAgIGVsaWYgZXh0IGluIFsnLnJiJywgJy5yYncnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IHJ1YnknLCAncnVieScKICAgIGVsaWYgZXh0IGluIFsnLnBocCcsICcucGhwMycsICcucGhwNCcsICcucGhwNScsICcucGhwNycsICcucGhwOCddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgcGhwJywgJ3BocCcKICAgIGVsaWYgZXh0IGluIFsnLmx1YSddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgbHVhJywgJ2x1YScKICAgIGVsaWYgZXh0IGluIFsnLnRjbCddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgdGNsc2gnLCAndGNsJwogICAgZWxpZiBleHQgaW4gWycuYXdrJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBhd2snLCAnYXdrJwogICAgZWxpZiBleHQgaW4gWycuc2VkJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBzZWQnLCAnc2VkJwogICAgZWxpZiBleHQgaW4gWycuZXhwJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBleHBlY3QnLCAnZXhwZWN0JwogICAgZWxpZiBleHQgaW4gWycuamF2YScsICcuY2xhc3MnLCAnLmphciddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgamF2YScsICdqYXZhJwogICAgZWxpZiBleHQgaW4gWycuZ3Jvb3Z5JywgJy5ndnknLCAnLmd5JywgJy5nc2gnXToKICAgICAgICByZXR1cm4gJyMhL3Vzci9iaW4vZW52IGdyb292eScsICdncm9vdnknCiAgICBlbGlmIGV4dCBpbiBbJy5rdCcsICcua3RzJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBrb3RsaW4nLCAna290bGluJwogICAgZWxpZiBleHQgaW4gWycuc2NhbGEnLCAnLnNjJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBzY2FsYScsICdzY2FsYScKICAgIGVsaWYgZXh0IGluIFsnLmdvJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBnbycsICdnbycKICAgIGVsaWYgZXh0IGluIFsnLnJzJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBydXN0JywgJ3J1c3QnCiAgICBlbGlmIGV4dCBpbiBbJy5ocycsICcubGhzJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBydW5oYXNrZWxsJywgJ2hhc2tlbGwnCiAgICBlbGlmIGV4dCBpbiBbJy5tbCcsICcubWxpJywgJy5tbGwnLCAnLm1seSddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgb2NhbWwnLCAnb2NhbWwnCiAgICBlbGlmIGV4dCBpbiBbJy5jcyddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgY3NoYXJwJywgJ2NzaGFycCcKICAgIGVsaWYgZXh0IGluIFsnLmZzJ106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBmc2hhcnAnLCAnZnNoYXJwJwogICAgZWxpZiBleHQgaW4gWycucicsICcuUiddOgogICAgICAgIHJldHVybiAnIyEvdXNyL2Jpbi9lbnYgUnNjcmlwdCcsICdyJwogICAgZWxpZiBleHQgaW4gWycubScsICcub2N0J106CiAgICAgICAgcmV0dXJuICcjIS91c3IvYmluL2VudiBvY3RhdmUnLCAnbWF0bGFiJwogICAgZWxpZiBleHQgaW4gWycuaHRtbCcsICcuaHRtJ106CiAgICAgICAgcmV0dXJuICc8IURPQ1RZUEUgaHRtbD4nLCAnaHRtbCcKICAgIGVsaWYgZXh0IGluIFsnLnhtbCcsICcueHNkJywgJy54c2wnLCAnLnhzbHQnXToKICAgICAgICByZXR1cm4gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+JywgJ3htbCcKICAgIGVsaWYgZXh0IGluIFsnLmpzb24nXToKICAgICAgICByZXR1cm4gJycsICdqc29uJwogICAgZWxpZiBleHQgaW4gWycueWFtbCcsICcueW1sJ106CiAgICAgICAgcmV0dXJuICcnLCAneWFtbCcKICAgIGVsaWYgZXh0IGluIFsnLnRvbWwnXToKICAgICAgICByZXR1cm4gJycsICd0b21sJwogICAgZWxpZiBleHQgaW4gWycubWQnLCAnLm1hcmtkb3duJ106CiAgICAgICAgcmV0dXJuICcnLCAnbWFya2Rvd24nCiAgICBlbGlmIGV4dCBpbiBbJy5zcWwnXToKICAgICAgICByZXR1cm4gJycsICdzcWwnCiAgICBlbGlmIGV4dCBpbiBbJy50ZicsICcudGZ2YXJzJ106CiAgICAgICAgcmV0dXJuICcnLCAndGVycmFmb3JtJwogICAgZWxzZToKICAgICAgICByZXR1cm4gTm9uZSwgJ2Jhc2gnCgpkZWYgZW5jcnlwdGluZyhpbnB1dF9maWxlLCBvdXRwdXRfZmlsZT1Ob25lKToKICAgICIiIkVuY3J5cHQgc2NyaXB0IC0gTXVsdGktbGFuZ3VhZ2UgZGVuZ2FuIHNoZWJhbmcgcHJlc2VydmF0aW9uIiIiCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW5wdXRfZmlsZSk6CiAgICAgICAgcHJpbnQoIklucHV0IGZpbGUgbm90IGZvdW5kLiIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgaWYgb3V0cHV0X2ZpbGUgaXMgTm9uZToKICAgICAgICBpZiAnLW8nIGluIHN5cy5hcmd2IG9yICctLW91dHB1dCcgaW4gc3lzLmFyZ3Y6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlkeCA9IHN5cy5hcmd2LmluZGV4KCctbycpIGlmICctbycgaW4gc3lzLmFyZ3YgZWxzZSBzeXMuYXJndi5pbmRleCgnLS1vdXRwdXQnKQogICAgICAgICAgICAgICAgaWYgaWR4ICsgMSA8IGxlbihzeXMuYXJndik6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBzeXMuYXJndltpZHggKyAxXQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIG91dHB1dF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGJhY2t1cF9kaXIgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlL1RyYXNoL2ZpbGVzIikKICAgICAgICAgICAgb3MubWFrZWRpcnMoYmFja3VwX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgc2h1dGlsLmNvcHkyKGlucHV0X2ZpbGUsIGJhY2t1cF9kaXIpCiAgICAgICAgICAgIHByaW50KGYiWypdIEJhY2t1cCBzYXZlZCB0byB7YmFja3VwX2Rpcn0iKQogICAgICAgICAgICBvdXRwdXRfZmlsZSA9IGlucHV0X2ZpbGUKCiAgICB3aXRoIG9wZW4oaW5wdXRfZmlsZSwgJ3JiJykgYXMgZjoKICAgICAgICByYXdfY29udGVudCA9IGYucmVhZCgpCgogICAgc2hlYmFuZyA9IGInJwogICAgY29udGVudCA9IHJhd19jb250ZW50CiAgICBpZiByYXdfY29udGVudC5zdGFydHN3aXRoKGInIyEnKToKICAgICAgICBuZXdsaW5lX3BvcyA9IHJhd19jb250ZW50LmZpbmQoYidcbicpCiAgICAgICAgaWYgbmV3bGluZV9wb3MgIT0gLTE6CiAgICAgICAgICAgIHNoZWJhbmcgPSByYXdfY29udGVudFs6bmV3bGluZV9wb3NdCiAgICAgICAgICAgIGNvbnRlbnQgPSByYXdfY29udGVudFtuZXdsaW5lX3BvcysxOl0KCiAgICBsYW5ndWFnZSA9ICdweXRob24nCiAgICBzaGViYW5nX3N0ciA9IHNoZWJhbmcuZGVjb2RlKCkgaWYgc2hlYmFuZyBlbHNlICcnCgogICAgaWYgJ3B5dGhvbicgaW4gc2hlYmFuZ19zdHIubG93ZXIoKToKICAgICAgICBsYW5ndWFnZSA9ICdweXRob24nCiAgICBlbGlmICdiYXNoJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpIG9yIHNoZWJhbmdfc3RyLmVuZHN3aXRoKCcvc2gnKToKICAgICAgICBsYW5ndWFnZSA9ICdiYXNoJwogICAgZWxpZiAnbm9kZScgaW4gc2hlYmFuZ19zdHIubG93ZXIoKSBvciAnanMnIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAnbm9kZScKICAgIGVsaWYgJ3BlcmwnIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAncGVybCcKICAgIGVsaWYgJ3J1YnknIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAncnVieScKICAgIGVsaWYgJ3BocCcgaW4gc2hlYmFuZ19zdHIubG93ZXIoKToKICAgICAgICBsYW5ndWFnZSA9ICdwaHAnCiAgICBlbGlmICdsdWEnIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAnbHVhJwogICAgZWxpZiAndGNsJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpIG9yICd0Y2xzaCcgaW4gc2hlYmFuZ19zdHIubG93ZXIoKToKICAgICAgICBsYW5ndWFnZSA9ICd0Y2wnCiAgICBlbGlmICdhd2snIGluIHNoZWJhbmdfc3RyLmxvd2VyKCkgb3IgJ2dhd2snIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAnYXdrJwogICAgZWxpZiAnc2VkJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ3NlZCcKICAgIGVsaWYgJ2V4cGVjdCcgaW4gc2hlYmFuZ19zdHIubG93ZXIoKToKICAgICAgICBsYW5ndWFnZSA9ICdleHBlY3QnCiAgICBlbGlmICdqYXZhJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ2phdmEnCiAgICBlbGlmICdncm9vdnknIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAnZ3Jvb3Z5JwogICAgZWxpZiAna290bGluJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ2tvdGxpbicKICAgIGVsaWYgJ3NjYWxhJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ3NjYWxhJwogICAgZWxpZiAnZ28nIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAnZ28nCiAgICBlbGlmICdydXN0JyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ3J1c3QnCiAgICBlbGlmICdoYXNrZWxsJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpIG9yICdnaGMnIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAnaGFza2VsbCcKICAgIGVsaWYgJ29jYW1sJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ29jYW1sJwogICAgZWxpZiAnY3NoYXJwJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpIG9yICdjIycgaW4gc2hlYmFuZ19zdHIubG93ZXIoKToKICAgICAgICBsYW5ndWFnZSA9ICdjc2hhcnAnCiAgICBlbGlmICdmc2hhcnAnIGluIHNoZWJhbmdfc3RyLmxvd2VyKCkgb3IgJ2YjJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ2ZzaGFycCcKICAgIGVsaWYgJ3JzY3JpcHQnIGluIHNoZWJhbmdfc3RyLmxvd2VyKCkgb3IgJ3InIGluIHNoZWJhbmdfc3RyLmxvd2VyKCk6CiAgICAgICAgbGFuZ3VhZ2UgPSAncicKICAgIGVsaWYgJ21hdGxhYicgaW4gc2hlYmFuZ19zdHIubG93ZXIoKSBvciAnb2N0YXZlJyBpbiBzaGViYW5nX3N0ci5sb3dlcigpOgogICAgICAgIGxhbmd1YWdlID0gJ21hdGxhYicKICAgIGVsc2U6CiAgICAgICAgbGFuZ3VhZ2UgPSAnYmFzaCcKCiAgICBlbmNvZGVkID0gYmFzZTY0LmI2NGVuY29kZShjb250ZW50KS5kZWNvZGUoKQoKICAgIHRlbXBsYXRlcyA9IHsKICAgICAgICAncHl0aG9uJzogJycne3NoZWJhbmd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCmltcG9ydCBiYXNlNjQKaW1wb3J0IHN5cwoKX0RBVEEgPSAie2VuY29kZWR9IgoKdHJ5OgogICAgX2RlY29kZWQgPSBiYXNlNjQuYjY0ZGVjb2RlKF9EQVRBKQogICAgZXhlYyhfZGVjb2RlZCkKZXhjZXB0IEV4Y2VwdGlvbiBhcyBfZToKICAgIHByaW50KGYiRXJyb3I6IHt7X2V9fSIpCiAgICBzeXMuZXhpdCgxKQonJycsCgogICAgICAgICdiYXNoJzogJycne3NoZWJhbmd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCl9EQVRBPSJ7ZW5jb2RlZH0iCl9ERUNPREVEPSQoZWNobyAiJF9EQVRBIiB8IGJhc2U2NCAtZCkKZXZhbCAiJF9ERUNPREVEIgonJycsCgogICAgICAgICdub2RlJzogJycne3NoZWJhbmd9Ci8vIEVuY3J5cHRlZCB3aXRoIHNydG9vbApjb25zdCBfREFUQSA9ICJ7ZW5jb2RlZH0iOwpjb25zdCBfREVDT0RFRCA9IEJ1ZmZlci5mcm9tKF9EQVRBLCAnYmFzZTY0JykudG9TdHJpbmcoKTsKZXZhbChfREVDT0RFRCk7CicnJywKCiAgICAgICAgJ3BlcmwnOiAnJyd7c2hlYmFuZ30KIyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKdXNlIE1JTUU6OkJhc2U2NDsKbXkgJF9EQVRBID0gIntlbmNvZGVkfSI7Cm15ICRfREVDT0RFRCA9IGRlY29kZV9iYXNlNjQoJF9EQVRBKTsKZXZhbCgkX0RFQ09ERUQpOwonJycsCgogICAgICAgICdydWJ5JzogJycne3NoZWJhbmd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCnJlcXVpcmUgJ2Jhc2U2NCcKX0RBVEEgPSAie2VuY29kZWR9IgpfREVDT0RFRCA9IEJhc2U2NC5kZWNvZGU2NChfREFUQSkKZXZhbChfREVDT0RFRCkKJycnLAoKICAgICAgICAncGhwJzogJycne3NoZWJhbmd9Cjw/cGhwCi8vIEVuY3J5cHRlZCB3aXRoIHNydG9vbAokX0RBVEEgPSAie2VuY29kZWR9IjsKJF9ERUNPREVEID0gYmFzZTY0X2RlY29kZSgkX0RBVEEpOwpldmFsKCRfREVDT0RFRCk7Cj8+CicnJywKCiAgICAgICAgJ2x1YSc6ICcnJ3tzaGViYW5nfQotLSBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKbG9jYWwgYmFzZTY0ID0gcmVxdWlyZSgiYmFzZTY0IikKbG9jYWwgX0RBVEEgPSAie2VuY29kZWR9Igpsb2NhbCBfREVDT0RFRCA9IGJhc2U2NC5kZWNvZGUoX0RBVEEpCmxvYWQoX0RFQ09ERUQpKCkKJycnLAoKICAgICAgICAndGNsJzogJycne3NoZWJhbmd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCnBhY2thZ2UgcmVxdWlyZSBiYXNlNjQKc2V0IF9EQVRBICJ7ZW5jb2RlZH0iCnNldCBfREVDT0RFRCBbYmFzZTY0OjpkZWNvZGUgJF9EQVRBXQpldmFsICRfREVDT0RFRAonJycsCgogICAgICAgICdhd2snOiAnJyd7c2hlYmFuZ30KIyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKQkVHSU4gewogICAgX0RBVEEgPSAie2VuY29kZWR9IgogICAgX0RFQ09ERUQgPSAiIgogICAgZm9yKGk9MTtpPD1sZW5ndGgoX0RBVEEpO2krKykgewogICAgICAgIF9ERUNPREVEID0gX0RFQ09ERUQgc3ByaW50ZigiJWMiLCBpbmRleCgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsIHN1YnN0cihfREFUQSxpLDEpKS0xKQogICAgfQogICAgc3lzdGVtKF9ERUNPREVEKQp9CicnJywKCiAgICAgICAgJ3NlZCc6ICcnJ3tzaGViYW5nfQojIEVuY3J5cHRlZCB3aXRoIHNydG9vbApfREFUQT0ie2VuY29kZWR9IgpfREVDT0RFRD0kKGVjaG8gIiRfREFUQSIgfCBiYXNlNjQgLWQpCmV2YWwgIiRfREVDT0RFRCIKJycnLAoKICAgICAgICAnZXhwZWN0JzogJycne3NoZWJhbmd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCnNldCBfREFUQSAie2VuY29kZWR9IgpzZXQgX0RFQ09ERUQgW2V4ZWMgZWNobyAkX0RBVEEgfCBiYXNlNjQgLWRdCmV2YWwgJF9ERUNPREVECicnJywKCiAgICAgICAgJ2phdmEnOiAnJyd7c2hlYmFuZ30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCmltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwppbXBvcnQgamF2YXguc2NyaXB0Lio7CgpwdWJsaWMgY2xhc3MgRGVjcnlwdG9yIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFN0cmluZyBfREFUQSA9ICJ7ZW5jb2RlZH0iOwogICAgICAgIGJ5dGVbXSBfREVDT0RFRCA9IEJhc2U2NC5nZXREZWNvZGVyKCkuZGVjb2RlKF9EQVRBKTsKICAgICAgICBTdHJpbmcgX1NDUklQVCA9IG5ldyBTdHJpbmcoX0RFQ09ERUQpOwoKICAgICAgICBTY3JpcHRFbmdpbmVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpOwogICAgICAgIFNjcmlwdEVuZ2luZSBlbmdpbmUgPSBtYW5hZ2VyLmdldEVuZ2luZUJ5TmFtZSgianMiKTsKICAgICAgICBlbmdpbmUuZXZhbChfU0NSSVBUKTsKICAgIH0KfQonJycsCgogICAgICAgICdncm9vdnknOiAnJyd7c2hlYmFuZ30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCmRlZiBfREFUQSA9ICJ7ZW5jb2RlZH0iCmRlZiBfREVDT0RFRCA9IF9EQVRBLmRlY29kZUJhc2U2NCgpCmV2YWx1YXRlKF9ERUNPREVEKQonJycsCgogICAgICAgICdrb3RsaW4nOiAnJyd7c2hlYmFuZ30KLy8gRW5jcnlwdGVkIHdpdGggc3J0b29sCmltcG9ydCBqYXZhLnV0aWwuQmFzZTY0CgpmdW4gbWFpbigpIHsKICAgIHZhbCBfREFUQSA9ICJ7ZW5jb2RlZH0iCiAgICB2YWwgX0RFQ09ERUQgPSBCYXNlNjQuZ2V0RGVjb2RlcigpLmRlY29kZShfREFUQSkKICAgIHZhbCBfU0NSSVBUID0gU3RyaW5nKF9ERUNPREVEKQogICAgdmFsIGVuZ2luZSA9IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyKCkuZ2V0RW5naW5lQnlFeHRlbnNpb24oImt0cyIpCiAgICBlbmdpbmUuZXZhbChfU0NSSVBUKQp9CicnJywKCiAgICAgICAgJ3NjYWxhJzogJycne3NoZWJhbmd9Ci8vIEVuY3J5cHRlZCB3aXRoIHNydG9vbApvYmplY3QgRGVjcnlwdG9yIGV4dGVuZHMgQXBwIHsKICB2YWwgX0RBVEEgPSAie2VuY29kZWR9IgogIHZhbCBfREVDT0RFRCA9IG5ldyBTdHJpbmcoamF2YS51dGlsLkJhc2U2NC5nZXREZWNvZGVyKCkuZGVjb2RlKF9EQVRBKSkKICBzY2FsYS50b29scy5uc2MuaW50ZXJwcmV0ZXIuSUxvb3AucnVuKF9ERUNPREVEKQp9CicnJywKCiAgICAgICAgJ2dvJzogJycne3NoZWJhbmd9Ci8vIEVuY3J5cHRlZCB3aXRoIHNydG9vbApwYWNrYWdlIG1haW4KCmltcG9ydCAoCiAgICAiZW5jb2RpbmcvYmFzZTY0IgogICAgIm9zL2V4ZWMiCikKCmZ1bmMgbWFpbigpIHsKICAgIF9EQVRBIDo9ICJ7ZW5jb2RlZH0iCiAgICBfREVDT0RFRCwgXyA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlU3RyaW5nKF9EQVRBKQogICAgZXhlYy5Db21tYW5kKCJzaCIsICItYyIsIHN0cmluZyhfREVDT0RFRCkpLlJ1bigpCn0KJycnLAoKICAgICAgICAncnVzdCc6ICcnJ3tzaGViYW5nfQovLyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKdXNlIGJhc2U2NDo6ZGVjb2RlOwp1c2Ugc3RkOjpwcm9jZXNzOjpDb21tYW5kOwoKZm4gbWFpbigpIHsKICAgIGxldCBfREFUQSA9ICJ7ZW5jb2RlZH0iOwogICAgbGV0IF9ERUNPREVEID0gZGVjb2RlKF9EQVRBKS51bndyYXAoKTsKICAgIGxldCBfU0NSSVBUID0gU3RyaW5nOjpmcm9tX3V0ZjgoX0RFQ09ERUQpLnVud3JhcCgpOwogICAgQ29tbWFuZDo6bmV3KCJzaCIpLmFyZygiLWMiKS5hcmcoJl9TQ1JJUFQpLnN0YXR1cygpLnVud3JhcCgpOwp9CicnJywKCiAgICAgICAgJ2hhc2tlbGwnOiAnJyd7c2hlYmFuZ30KLS0gRW5jcnlwdGVkIHdpdGggc3J0b29sCmltcG9ydCBDb2RlYy5CaW5hcnkuQmFzZTY0CmltcG9ydCBTeXN0ZW0uUHJvY2VzcwoKbWFpbiA9IGRvCiAgICBsZXQgX0RBVEEgPSAie2VuY29kZWR9IgogICAgbGV0IF9ERUNPREVEID0gZGVjb2RlIF9EQVRBCiAgICBzeXN0ZW0gX0RFQ09ERUQKJycnLAoKICAgICAgICAnb2NhbWwnOiAnJyd7c2hlYmFuZ30KKCogRW5jcnlwdGVkIHdpdGggc3J0b29sICopCmxldCBfREFUQSA9ICJ7ZW5jb2RlZH0iCmxldCBfREVDT0RFRCA9IEJhc2U2NC5kZWNvZGUgX0RBVEEKbGV0IF9TQ1JJUFQgPSBTdHJpbmcub2ZfYnl0ZXMgX0RFQ09ERUQKbGV0IF8gPSBUb3Bsb29wLmV4ZWN1dGVfcGhyYXNlIF9TQ1JJUFQKJycnLAoKICAgICAgICAnY3NoYXJwJzogJycne3NoZWJhbmd9Ci8vIEVuY3J5cHRlZCB3aXRoIHNydG9vbAp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5UZXh0OwoKY2xhc3MgRGVjcnlwdG9yIHsKICAgIHN0YXRpYyB2b2lkIE1haW4oKSB7CiAgICAgICAgc3RyaW5nIF9EQVRBID0gIntlbmNvZGVkfSI7CiAgICAgICAgYnl0ZVtdIF9ERUNPREVEID0gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKF9EQVRBKTsKICAgICAgICBzdHJpbmcgX1NDUklQVCA9IEVuY29kaW5nLlVURjguR2V0U3RyaW5nKF9ERUNPREVEKTsKICAgICAgICBTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5TdGFydCgicG93ZXJzaGVsbCIsICQiLWMgXCJ7X1NDUklQVH1cIiIpOwogICAgfQp9CicnJywKCiAgICAgICAgJ2ZzaGFycCc6ICcnJ3tzaGViYW5nfQovLyBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKb3BlbiBTeXN0ZW0Kb3BlbiBTeXN0ZW0uVGV4dAoKbGV0IF9EQVRBID0gIntlbmNvZGVkfSIKbGV0IF9ERUNPREVEID0gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKF9EQVRBKQpsZXQgX1NDUklQVCA9IEVuY29kaW5nLlVURjguR2V0U3RyaW5nKF9ERUNPREVEKQpTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5TdGFydCgicG93ZXJzaGVsbCIsICQiLWMgXCJ7X1NDUklQVH1cIiIpIHw+IGlnbm9yZQonJycsCgogICAgICAgICdyJzogJycne3NoZWJhbmd9CiMgRW5jcnlwdGVkIHdpdGggc3J0b29sCl9EQVRBIDwtICJ7ZW5jb2RlZH0iCl9ERUNPREVEIDwtIGJhc2U2NGRlY29kZShfREFUQSkKZXZhbChwYXJzZSh0ZXh0ID0gX0RFQ09ERUQpKQonJycsCgogICAgICAgICdtYXRsYWInOiAnJyd7c2hlYmFuZ30KJSBFbmNyeXB0ZWQgd2l0aCBzcnRvb2wKX0RBVEEgPSAne2VuY29kZWR9JzsKX0RFQ09ERUQgPSBtYXRsYWIubmV0LmJhc2U2NGRlY29kZShfREFUQSk7CmV2YWwoY2hhcihfREVDT0RFRCcpKTsKJycnLAogICAgfQoKICAgIHRlbXBsYXRlID0gdGVtcGxhdGVzLmdldChsYW5ndWFnZSwgdGVtcGxhdGVzWydiYXNoJ10pCgogICAgc2hlYmFuZ19zdHIgPSBzaGViYW5nLmRlY29kZSgpIGlmIHNoZWJhbmcgZWxzZSAnJwogICAgZmluYWxfY29udGVudCA9IHRlbXBsYXRlLmZvcm1hdChzaGViYW5nPXNoZWJhbmdfc3RyLCBlbmNvZGVkPWVuY29kZWQpCgogICAgd2l0aCBvcGVuKG91dHB1dF9maWxlLCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShmaW5hbF9jb250ZW50KQoKICAgIHBlcm1pc3Npb24gPSBvY3Qob3Muc3RhdChpbnB1dF9maWxlKS5zdF9tb2RlKVstMzpdCiAgICBvcy5jaG1vZChvdXRwdXRfZmlsZSwgaW50KHBlcm1pc3Npb24sIDgpKQoKICAgIHByaW50KGYiWytdIEVuY3J5cHRlZDoge2lucHV0X2ZpbGV9IC0+IHtvdXRwdXRfZmlsZX0iKQogICAgcHJpbnQoZiJbK10gTGFuZ3VhZ2U6IHtsYW5ndWFnZS51cHBlcigpfSIpCiAgICBpZiBzaGViYW5nX3N0cjoKICAgICAgICBwcmludChmIlsrXSBTaGViYW5nOiB7c2hlYmFuZ19zdHJ9IikKICAgIHJldHVybiBUcnVlCgoKZGVmIGRlY3J5cHRpbmcoaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGU9Tm9uZSk6CiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW5wdXRfZmlsZSk6CiAgICAgICAgcHJpbnQoIklucHV0IGZpbGUgbm90IGZvdW5kLiIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgaWYgb3V0cHV0X2ZpbGUgaXMgTm9uZToKICAgICAgICBpZiAnLW8nIGluIHN5cy5hcmd2IG9yICctLW91dHB1dCcgaW4gc3lzLmFyZ3Y6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlkeCA9IHN5cy5hcmd2LmluZGV4KCctbycpIGlmICctbycgaW4gc3lzLmFyZ3YgZWxzZSBzeXMuYXJndi5pbmRleCgnLS1vdXRwdXQnKQogICAgICAgICAgICAgICAgaWYgaWR4ICsgMSA8IGxlbihzeXMuYXJndik6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBzeXMuYXJndltpZHggKyAxXQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIG91dHB1dF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGJhY2t1cF9kaXIgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlL1RyYXNoL2ZpbGVzIikKICAgICAgICAgICAgb3MubWFrZWRpcnMoYmFja3VwX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgc2h1dGlsLmNvcHkyKGlucHV0X2ZpbGUsIGJhY2t1cF9kaXIpCiAgICAgICAgICAgIHByaW50KGYiWypdIEJhY2t1cCBzYXZlZCB0byB7YmFja3VwX2Rpcn0iKQogICAgICAgICAgICBvdXRwdXRfZmlsZSA9IGlucHV0X2ZpbGUKCgogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihpbnB1dF9maWxlLCAncicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQoKICAgICAgICBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xuJykKICAgICAgICBzaGViYW5nID0gJycKICAgICAgICBpZiBsaW5lcyBhbmQgbGluZXNbMF0uc3RhcnRzd2l0aCgnIyEnKToKICAgICAgICAgICAgc2hlYmFuZyA9IGxpbmVzWzBdCiAgICAgICAgZWxpZiBsaW5lcyBhbmQgbGluZXNbMF0uc3RhcnRzd2l0aCgnPD94bWwnKToKICAgICAgICAgICAgc2hlYmFuZyA9IGxpbmVzWzBdCiAgICAgICAgZWxpZiBsaW5lcyBhbmQgbGluZXNbMF0uc3RhcnRzd2l0aCgnPCFET0NUWVBFJyk6CiAgICAgICAgICAgIHNoZWJhbmcgPSBsaW5lc1swXQoKICAgICAgICBpbXBvcnQgcmUKICAgICAgICBlbmNvZGVkID0gTm9uZQoKICAgICAgICBwYXR0ZXJucyA9IFsKICAgICAgICAgICAgcidfREFUQSA9ICIoW14iXSspIicsCiAgICAgICAgICAgIHInX0RBVEE9IihbXiJdKykiJywKICAgICAgICAgICAgcidjb25zdCBfREFUQSA9ICIoW14iXSspIicsCiAgICAgICAgICAgIHInbXkgJF9EQVRBID0gIihbXiJdKykiJywKICAgICAgICAgICAgcidcJF9EQVRBID0gIihbXiJdKykiJywKICAgICAgICAgICAgcidzZXQgX0RBVEEgIihbXiJdKykiJywKICAgICAgICAgICAgcidfREFUQSA9ICIoW14iXSspIicsCiAgICAgICAgICAgIHIndmFsIF9EQVRBID0gIihbXiJdKykiJywKICAgICAgICAgICAgcidsZXQgX0RBVEEgPSAiKFteIl0rKSInLAogICAgICAgICAgICByJ3N0cmluZyBfREFUQSA9ICIoW14iXSspIicsCiAgICAgICAgICAgIHInX0RBVEEgPC0gIihbXiJdKykiJywKICAgICAgICAgICAgcidkYXRhOiAiKFteIl0rKSInLAogICAgICAgICAgICByJ2RhdGEgPSAiKFteIl0rKSInLAogICAgICAgICAgICByJzxkYXRhPjwhXFtDREFUQVxbKFteXF1dKylcXVxdPicsCiAgICAgICAgICAgIHInYGBgYmFzZTY0XHMrKFteYF0rKWBgYCcsCiAgICAgICAgICAgIHInZW5jcnlwdGVkX2RhdGEgPSAiKFteIl0rKSInLAogICAgICAgIF0KCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHBhdHRlcm4sIGNvbnRlbnQsIHJlLkRPVEFMTCkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBlbmNvZGVkID0gbWF0Y2guZ3JvdXAoMSkuc3RyaXAoKQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgaWYgbm90IGVuY29kZWQ6CiAgICAgICAgICAgIHByaW50KCJFcnJvcjogQ291bGQgbm90IGZpbmQgZW5jb2RlZCBkYXRhIikKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGRlY29kZWQgPSBiYXNlNjQuYjY0ZGVjb2RlKGVuY29kZWQpCgogICAgICAgIGlmIGRlY29kZWQuc3RhcnRzd2l0aChiJyMhJykgb3IgZGVjb2RlZC5zdGFydHN3aXRoKGInPD94bWwnKSBvciBkZWNvZGVkLnN0YXJ0c3dpdGgoYic8IURPQ1RZUEUnKToKICAgICAgICAgICAgZmluYWxfY29udGVudCA9IGRlY29kZWQKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzaGViYW5nOgogICAgICAgICAgICAgICAgZmluYWxfY29udGVudCA9IChzaGViYW5nICsgJ1xuJykuZW5jb2RlKCkgKyBkZWNvZGVkCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmaW5hbF9jb250ZW50ID0gZGVjb2RlZAoKICAgICAgICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGUsICd3YicpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoZmluYWxfY29udGVudCkKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW5wdXRfZmlsZSk6CiAgICAgICAgICAgIHBlcm1pc3Npb24gPSBvY3Qob3Muc3RhdChpbnB1dF9maWxlKS5zdF9tb2RlKVstMzpdCiAgICAgICAgICAgIG9zLmNobW9kKG91dHB1dF9maWxlLCBpbnQocGVybWlzc2lvbiwgOCkpCgogICAgICAgIHByaW50KGYiWytdIERlY3J5cHRlZDoge2lucHV0X2ZpbGV9IC0+IHtvdXRwdXRfZmlsZX0iKQogICAgICAgIGlmIHNoZWJhbmc6CiAgICAgICAgICAgIHByaW50KGYiWytdIFNoZWJhbmcgcmVzdG9yZWQ6IHtzaGViYW5nfSIpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiJFcnJvciBkZWNyeXB0aW5nOiB7ZX0iKQogICAgICAgIHJldHVybiBGYWxzZQoKZGVmIHN3YXBwaW5nKGZpbGUxLCBmaWxlMik6CiAgICAiIiJTd2FwIHR3byBmaWxlcyIiIgogICAgaWYgbm90IGFsbChbZmlsZTEsIGZpbGUyXSk6CiAgICAgICAgcHJpbnQoIklucHV0IGZpbGVzIG5vdCBzcGVjaWZpZWQiKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlMSk6CiAgICAgICAgcHJpbnQoZiJJbnB1dCBmaWxlIHtmaWxlMX0gbm90IGZvdW5kLiIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgdGVtcF9maWxlID0gInNyOTEiCiAgICBzaHV0aWwubW92ZShmaWxlMSwgdGVtcF9maWxlKQogICAgc2h1dGlsLm1vdmUoZmlsZTIsIGZpbGUxKQogICAgc2h1dGlsLm1vdmUodGVtcF9maWxlLCBmaWxlMikKICAgIHJldHVybiBUcnVlCgpkZWYgcmVzaXplX21lZGlhKGZpbGVzLCByZXNvLCBmb3JtYXRfdHlwZSwgb3V0cHV0X2ZpbGU9Tm9uZSk6CiAgICAiIiJSZXNpemUgaW1hZ2VzLCB2aWRlb3MsIG9yIGF1ZGlvIiIiCiAgICBpZiBmb3JtYXRfdHlwZSA9PSAnaW1hZ2UnOgogICAgICAgIGZvciBpbWcgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbWcpOgogICAgICAgICAgICAgICAgcHJpbnQoZiJJbnB1dCBmaWxlIHtpbWd9IG5vdCBmb3VuZCIpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGU6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ2NvbnZlcnQnLCBpbWcsICctcmVzaXplJywgcmVzbywgb3V0cHV0X2ZpbGVdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydjb252ZXJ0JywgaW1nLCAnLXJlc2l6ZScsIHJlc28sIGltZ10pCgogICAgZWxpZiBmb3JtYXRfdHlwZSA9PSAndmlkZW8nOgogICAgICAgIGZvciB2aWRlbyBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHZpZGVvKToKICAgICAgICAgICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7dmlkZW99IG5vdCBmb3VuZCIpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGU6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ2ZmbXBlZycsICctaScsIHZpZGVvLCAnLXZmJywgZidzY2FsZT17cmVzb30nLCBvdXRwdXRfZmlsZV0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0ZW1wX2ZpbGUgPSBmInNydG9vbF97dmlkZW99IgogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydmZm1wZWcnLCAnLWknLCB2aWRlbywgJy12ZicsIGYnc2NhbGU9e3Jlc299JywgdGVtcF9maWxlXSkKICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKHRlbXBfZmlsZSwgdmlkZW8pCgogICAgZWxpZiBmb3JtYXRfdHlwZSA9PSAnYXVkaW8nOgogICAgICAgIGZvciBhdWRpbyBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGF1ZGlvKToKICAgICAgICAgICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7YXVkaW99IG5vdCBmb3VuZCIpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGU6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ2ZmbXBlZycsICctaScsIGF1ZGlvLCAnLWI6YScsIGYne3Jlc299SycsIG91dHB1dF9maWxlXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRlbXBfZmlsZSA9IGYic3J0b29sX3thdWRpb30iCiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ2ZmbXBlZycsICctaScsIGF1ZGlvLCAnLWI6YScsIGYne3Jlc299SycsIHRlbXBfZmlsZV0pCiAgICAgICAgICAgICAgICBzaHV0aWwubW92ZSh0ZW1wX2ZpbGUsIGF1ZGlvKQoKICAgIHJldHVybiBUcnVlCgpkZWYgcmVuYW1lX2V4dGVuc2lvbihmaWxlcywgbmV3X2V4dCk6CiAgICBmb3IgZmlsZSBpbiBmaWxlczoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZSk6CiAgICAgICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7ZmlsZX0gbm90IGZvdW5kLiIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGJhc2UgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpWzBdCiAgICAgICAgb3MucmVuYW1lKGZpbGUsIGYie2Jhc2V9LntuZXdfZXh0fSIpCiAgICByZXR1cm4gVHJ1ZQoKZGVmIGNvbnZlcnRfdmlkZW8oZmlsZXMsIGJpdHJhdGUsIGZvcm1hdF9vdXQpOgogICAgaWYgbm90IGZpbGVzOgogICAgICAgIHByaW50KCJVc2FnZTogc3J0b29sIGNvbnZlcnQgW2lucHV0XSBbYml0cmF0ZV0gW2Zvcm1hdF0iKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGlmIGJpdHJhdGUgPiAzMjA6CiAgICAgICAgcHJpbnQoImJpdHJhdGUgaXMgdG9vIGhpZ2ggYmV5b25kIDMyMCIpCgogICAgZm9yIHZpZGVvIGluIGZpbGVzOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh2aWRlbyk6CiAgICAgICAgICAgIHByaW50KGYiSW5wdXQgZmlsZSB7dmlkZW99IG5vdCBmb3VuZCIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGJhc2UgPSBvcy5wYXRoLnNwbGl0ZXh0KHZpZGVvKVswXQogICAgICAgIHN1YnByb2Nlc3MucnVuKFsnZmZtcGVnJywgJy1pJywgdmlkZW8sICctYjphJywgZid7Yml0cmF0ZX1LJywgZid7YmFzZX0ue2Zvcm1hdF9vdXR9J10pCiAgICByZXR1cm4gVHJ1ZQoKZGVmIGV4ZWNfc2NyaXB0KHNjcmlwdCk6CiAgICBpZiBub3Qgc2NyaXB0OgogICAgICAgIHByaW50KCJTY3JpcHQgaXNuJ3Qgc3BlY2lmaWVkIikKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzY3JpcHQpOgogICAgICAgIHByaW50KCJJbnB1dCBzY3JpcHQgbm90IGZvdW5kIikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBvcy5jaG1vZChzY3JpcHQsIDBvNzU1KQogICAgc3VicHJvY2Vzcy5ydW4oWycuLycgKyBzY3JpcHRdKQogICAgcmV0dXJuIFRydWUKCmRlZiBjaGVja19zaGl6dWt1KCk6CiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oWyd3aGljaCcsICdzaGl6dWt1J10sIGNhcHR1cmVfb3V0cHV0PVRydWUsIGNoZWNrPVRydWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXR1cm5jb2RlID09IDAgYW5kIGxlbihyZXN1bHQuc3Rkb3V0LnN0cmlwKCkpID4gMAogICAgZXhjZXB0OgogICAgICAgIHJldHVybiBGYWxzZQoKZGVmIGlucHV0X3RleHQodGV4dCk6CiAgICBpZiBub3QgY2hlY2tfc2hpenVrdSgpOgogICAgICAgIHByaW50KCJzaGl6dWt1IG11c3QgYmUgaW5zdGFsbGVkIGluIHRlcm11eCIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgdGV4dCA9IHRleHQucmVwbGFjZSgnICcsICclcycpCiAgICBzdWJwcm9jZXNzLnJ1bihbJ3NoaXp1a3UnLCAnLWMnLCAnaW5wdXQnLCAndGV4dCcsIHRleHRdLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgcmV0dXJuIFRydWUKCmRlZiBpbnB1dF9rZXlldmVudChrZXkpOgogICAgaWYgbm90IGNoZWNrX3NoaXp1a3UoKToKICAgICAgICBwcmludCgic2hpenVrdSBtdXN0IGJlIGluc3RhbGxlZCBpbiB0ZXJtdXgiKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGlmIG5vdCBrZXkuaXNkaWdpdCgpOgogICAgICAgIHByaW50KCJLZXkgbXVzdCBiZSBhIG51bWJlciIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgc3VicHJvY2Vzcy5ydW4oWydzaGl6dWt1JywgJy1jJywgJ2lucHV0JywgJ2tleWV2ZW50Jywga2V5XSwgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkKICAgIHJldHVybiBUcnVlCgpkZWYgaW5wdXRfc3dpcGUoc3dpcGVfYXJncyk6CiAgICBpZiBub3QgY2hlY2tfc2hpenVrdSgpOgogICAgICAgIHByaW50KCJzaGl6dWt1IG11c3QgYmUgaW5zdGFsbGVkIGluIHRlcm11eCIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgaWYgbm90IGFsbChhcmcuaXNkaWdpdCgpIGZvciBhcmcgaW4gc3dpcGVfYXJncyk6CiAgICAgICAgcHJpbnQoIlN3aXBlIG11c3QgYmUgbnVtYmVycyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgc3VicHJvY2Vzcy5ydW4oWydzaGl6dWt1JywgJy1jJywgJ2lucHV0JywgJ3N3aXBlJ10gKyBsaXN0KHN3aXBlX2FyZ3MpLCBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMKQogICAgcmV0dXJuIFRydWUKCmRlZiBpbnB1dF9rZXljb21ibyhrZXlzKToKICAgIGlmIG5vdCBjaGVja19zaGl6dWt1KCk6CiAgICAgICAgcHJpbnQoInNoaXp1a3UgbXVzdCBiZSBpbnN0YWxsZWQgaW4gdGVybXV4IikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBpZiBub3QgYWxsKGtleS5pc2RpZ2l0KCkgZm9yIGtleSBpbiBrZXlzKToKICAgICAgICBwcmludCgiS2V5cyBtdXN0IGJlIG51bWJlcnMiKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIHN1YnByb2Nlc3MucnVuKFsnc2hpenVrdScsICctYycsICdpbnB1dCcsICdrZXljb21iaW5hdGlvbiddICsgbGlzdChrZXlzKSwgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkKICAgIHJldHVybiBUcnVlCgpkZWYgbWFpbigpOgogICAgbG9hZF9jb25maWcoKQoKICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgogICAgICAgIHNob3dfaGVscCgpCiAgICAgICAgcmV0dXJuCgogICAgY29tbWFuZCA9IHN5cy5hcmd2WzFdCiAgICBhcmdzID0gc3lzLmFyZ3ZbMjpdCgogICAgaWYgY29tbWFuZCA9PSAndHlwZSc6CiAgICAgICAgdHlwaW5nKCkKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ3dyaXRlJzoKICAgICAgICBvdXRwdXRfZmlsZSA9IE5vbmUKICAgICAgICBwZXJtaXNzaW9uID0gTm9uZQogICAgICAgIHRleHQgPSAnJwoKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgYXJnIGluIFsnLW8nLCAnLS1vdXRwdXQnXSBhbmQgaSArIDEgPCBsZW4oYXJncyk6CiAgICAgICAgICAgICAgICBvdXRwdXRfZmlsZSA9IGFyZ3NbaSArIDFdCiAgICAgICAgICAgICAgICBpZiBpICsgMiA8IGxlbihhcmdzKToKICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gYXJnc1tpICsgMl0KICAgICAgICAgICAgICAgIHRleHQgPSAnICcuam9pbihhcmdzWzppXSkKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIG5vdCBvdXRwdXRfZmlsZToKICAgICAgICAgICAgcHJpbnQoIk91dHB1dCBpc24ndCBzcGVjaWZpZWQiKQogICAgICAgICAgICBwcmludCgiVXNhZ2U6IHNydG9vbCB3cml0ZSBbdGV4dF0gLW8gW291dHB1dF0gW3Blcm1pc3Npb25dIikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHdyaXRpbmcodGV4dCwgb3V0cHV0X2ZpbGUsIHBlcm1pc3Npb24pCgogICAgZWxpZiBjb21tYW5kID09ICdjaGFuZ2UnOgogICAgICAgIGlmIGxlbihhcmdzKSA+PSAzOgogICAgICAgICAgICBjaGFuZ2luZyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KCJVc2FnZTogc3J0b29sIGNoYW5nZSBbb2xkc3RyaW5nXSBbbmV3c3RyaW5nXSBbcGF0aCB0byB0YXJnZXRdIikKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ3JlYWQnOgogICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgIHN5bnRheCA9IE5vbmUKICAgICAgICAgICAgaWYgJy0tc3ludGF4PScgaW4gJyAnLmpvaW4oYXJncyk6CiAgICAgICAgICAgICAgICBmb3IgYSBpbiBhcmdzOgogICAgICAgICAgICAgICAgICAgIGlmIGEuc3RhcnRzd2l0aCgnLS1zeW50YXg9Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCA9IGEKICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5yZW1vdmUoYSkKICAgICAgICAgICAgZWxpZiAnLVMnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBzeW50YXggPSAnLVMnCiAgICAgICAgICAgIHJlYWRpbmcoYXJnc1swXSwgc3ludGF4KQoKICAgIGVsaWYgY29tbWFuZCA9PSAnZW5jcnlwdCc6CiAgICAgICAgaWYgbGVuKGFyZ3MpID49IDE6CiAgICAgICAgICAgIGVuY3J5cHRpbmcoYXJnc1swXSwgYXJnc1sxXSBpZiBsZW4oYXJncykgPiAxIGVsc2UgTm9uZSkKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2RlY3J5cHQnOgogICAgICAgIGlmIGxlbihhcmdzKSA+PSAxOgogICAgICAgICAgICBkZWNyeXB0aW5nKGFyZ3NbMF0sIGFyZ3NbMV0gaWYgbGVuKGFyZ3MpID4gMSBlbHNlIE5vbmUpCgogICAgZWxpZiBjb21tYW5kID09ICdzd2FwJzoKICAgICAgICBpZiBsZW4oYXJncykgPj0gMjoKICAgICAgICAgICAgc3dhcHBpbmcoYXJnc1swXSwgYXJnc1sxXSkKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2V4ZWMnOgogICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgIGV4ZWNfc2NyaXB0KGFyZ3NbMF0pCgogICAgZWxpZiBjb21tYW5kID09ICdyZXNpemUnOgogICAgICAgIGlmIGxlbihhcmdzKSA8IDM6CiAgICAgICAgICAgIHNob3dfcmVzaXplX2hlbHAoKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZm9ybWF0X3R5cGUgPSBOb25lCiAgICAgICAgaWYgYXJnc1swXSBpbiBbJy1pJywgJy0taW1hZ2UnXToKICAgICAgICAgICAgZm9ybWF0X3R5cGUgPSAnaW1hZ2UnCiAgICAgICAgZWxpZiBhcmdzWzBdIGluIFsnLXYnLCAnLS12aWRlbyddOgogICAgICAgICAgICBmb3JtYXRfdHlwZSA9ICd2aWRlbycKICAgICAgICBlbGlmIGFyZ3NbMF0gaW4gWyctYScsICctLWF1ZGlvJ106CiAgICAgICAgICAgIGZvcm1hdF90eXBlID0gJ2F1ZGlvJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNob3dfcmVzaXplX2hlbHAoKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZmlsZXMgPSBbYXJnc1sxXV0gaWYgYXJnc1sxXSAhPSAnIioiJyBlbHNlIGdsb2IuZ2xvYignKicpCiAgICAgICAgcmVzbyA9IGFyZ3NbMl0KCiAgICAgICAgb3V0cHV0X2ZpbGUgPSBOb25lCiAgICAgICAgaWYgbGVuKGFyZ3MpID4gNCBhbmQgYXJnc1szXSBpbiBbJy1vJywgJy0tb3V0cHV0J106CiAgICAgICAgICAgIG91dHB1dF9maWxlID0gYXJnc1s0XQoKICAgICAgICByZXNpemVfbWVkaWEoZmlsZXMsIHJlc28sIGZvcm1hdF90eXBlLCBvdXRwdXRfZmlsZSkKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ3JlbmFtZSc6CiAgICAgICAgaWYgbGVuKGFyZ3MpIDwgMjoKICAgICAgICAgICAgc2hvd19yZW5hbWVfaGVscCgpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBhcmdzWzFdIGluIFsnLW8nLCAnLS1vdXRwdXQnXToKICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID49IDM6CiAgICAgICAgICAgICAgICBvcy5yZW5hbWUoYXJnc1swXSwgYXJnc1syXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlcyA9IFthcmdzWzBdXSBpZiBhcmdzWzBdICE9ICciKiInIGVsc2UgZ2xvYi5nbG9iKCcqJykKICAgICAgICAgICAgcmVuYW1lX2V4dGVuc2lvbihmaWxlcywgYXJnc1sxXSkKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2NvbnZlcnQnOgogICAgICAgIGlmIGxlbihhcmdzKSA+PSAzOgogICAgICAgICAgICBmaWxlcyA9IFthcmdzWzBdXSBpZiBhcmdzWzBdICE9ICciKiInIGVsc2UgZ2xvYi5nbG9iKCcqJykKICAgICAgICAgICAgY29udmVydF92aWRlbyhmaWxlcywgaW50KGFyZ3NbMV0pLCBhcmdzWzJdKQoKICAgIGVsaWYgY29tbWFuZCA9PSAndGV4dCc6CiAgICAgICAgaWYgYXJnczoKICAgICAgICAgICAgaW5wdXRfdGV4dCgnICcuam9pbihhcmdzKSkKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2tleWV2ZW50JzoKICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICBpbnB1dF9rZXlldmVudChhcmdzWzBdKQoKICAgIGVsaWYgY29tbWFuZCA9PSAnc3dpcGUnOgogICAgICAgIGlmIGxlbihhcmdzKSA+PSA0OgogICAgICAgICAgICBpbnB1dF9zd2lwZShhcmdzWzo0XSkKCiAgICBlbGlmIGNvbW1hbmQgPT0gJ2tleWNvbWJvJzoKICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICBpbnB1dF9rZXljb21ibyhhcmdzKQoKICAgIGVsaWYgY29tbWFuZCBpbiBbJy12JywgJy0tdmVyc2lvbiddOgogICAgICAgIHByaW50KCIxLjQuNC1TUiIpCgogICAgZWxzZToKICAgICAgICBzaG93X2hlbHAoKQoKZGVmIHNob3dfaGVscCgpOgogICAgcHJpbnQoIiIiVXNhZ2U6IHNydG9vbCBbY29tbWFuZHNdIFtvcHRpb25zXQoKQ29tbWFuZHM6CiAgICB0eXBlIFt0ZXh0XSBbb3B0aW9uc10gICAgICAgICA6IHR5cGUgYSB0ZXh0CiAgICByZWFkIFtmaWxlXSAgICAgICAgICAgICAgICAgICA6IHJlYWQgYSBmaWxlCiAgICB3cml0ZSBbdGV4dF0gICAgICAgICAgICAgICAgICA6IHdyaXRlIGEgdGV4dAogICAgZXhlYyBbc2NyaXB0XSAgICAgICAgICAgICAgICAgOiBleGVjdXRlIGEgc2NyaXB0CiAgICBzd2FwIFtmaWxlMV0gW2ZpbGUyXSAgICAgICAgICA6IHN3YXAgY29udGVudHMgb2YgdGhlIGZpbGUKICAgIHJlc2l6ZSBbb3B0aW9uc10gICAgICAgICAgICAgIDogcmVzaXplIG1lZGlhIHJlc29sdXRpb24KICAgIHJlbmFtZSBbZmlsZTFdIFtmb3JtYXRdICAgICAgIDogcmVuYW1lIGV4dGVuc2lvbiBvZiBmaWxlCiAgICBjaGFuZ2UgW29sZHN0cl0gW25ld3N0cl0gICAgICA6IGNoYW5nZSB2YWx1ZSBvZiB0aGUgc3RyaW5nCiAgICBjb252ZXJ0IFtvcHRpb25zXSAgICAgICAgICAgICA6IGNvbnZlcnQgdmlkZW8gdG8gYXVkaW8KICAgIGVuY3J5cHQgW2lucHV0XSBbb3V0cHV0XSAgICAgIDogZW5jcnlwdCBhIHNjcmlwdAogICAgZGVjcnlwdCBbaW5wdXRdIFtvdXRwdXRdICAgICAgOiBkZWNyeXB0IGEgc2NyaXB0CgpJbnB1dCBjb21tYW5kczogKGRlcGVuZHM6IHNoaXp1a3UpCiAgICB0ZXh0IFt0ZXh0XSAgICAgICAgICAgICAgICAgICA6IGlucHV0IHRleHQgdG8gdGVybWluYWwKICAgIHN3aXBlIFt4MV0gW3kxXSBbeDJdIFt5Ml0gICAgIDogZW11bGF0ZSBzd2lwZSB0byBkZXZpY2UKICAgIGtleWV2ZW50IFtrZXldICAgICAgICAgICAgICAgIDogZW11bGF0ZSBrZXlldmVudCB0byBkZXZpY2UKICAgIGtleWNvbWJvIFtrZXkxXSBba2V5Ml0gICAgICAgIDogZW11bGF0ZSBrZXljb21iaW5hdGlvbiB0byBkZXZpY2UKCk9wdGlvbnM6CiAgICAtZCwgLS1kZWxheSAgICAgICAgICAgICAgICAgICA6IHR5cGluZyBkZWxheSAoMS4uOTkpCiAgICAtcywgLS1zeW50YXg9PHR5cGV8cGF0aD4gICAgICA6IHJlYWQgc3ludGF4CiAgICAtbywgLS1vdXRwdXQgICAgICAgICAgICAgICAgICA6IHdyaXRlIG91dHB1dAogICAgLXYsIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgOiBzaG93IHZlcnNpb24KICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICAgIDogc2hvdyBoZWxwIHNjcmVlbgoKQXV0aG9yOiBBcmllLVNSOTEKZm9yIG1vcmUgaW5mb3JtYXRpb24gdmlzaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9BcmllU1I5MQoiIiIpCgpkZWYgc2hvd19yZXNpemVfaGVscCgpOgogICAgcHJpbnQoIiIiVXNhZ2U6IHNydG9vbCByZXNpemUgW29wdGlvbnNdIFtpbnB1dF0gW3Jlc29sdXRpb25dIC1vIFtvdXRwdXRdCiAgICAgICBzcnRvb2wgcmVzaXplIFtvcHRpb25zXSBbaW5wdXRdIFtyZXNvbHV0aW9uXQogICAgICAgc3J0b29sIHJlc2l6ZSBbb3B0aW9uc10gWyIqIl0gW3Jlc29sdXRpb25dIDogKHVzZSBxdW90ZXMgaWYgbW9yZSB0aGFuIG9uZSBpbnB1dCkKCk9wdGlvbnM6CiAgICAtaSwgLS1pbWFnZSAgICAgICAgICAgICAgICAgICA6IHJlc2l6ZSBpbWFnZSByZXNvbHV0aW9uCiAgICAtdiwgLS12aWRlbyAgICAgICAgICAgICAgICAgICA6IHJlc2l6ZSB2aWRlbyByZXNvbHV0aW9uCiAgICAtYSwgLS1hdWRpbyAgICAgICAgICAgICAgICAgICA6IHJlc2l6ZSBhdWRpbyBiaXRyYXRlICgxMjguLjMyMCkKICAgIC1vLCAtLW91dHB1dCAgICAgICAgICAgICAgICAgIDogcmVuYW1lIG91dHB1dCAob25seSBmb3Igb25lIGlucHV0KQoiIiIpCgpkZWYgc2hvd19yZW5hbWVfaGVscCgpOgogICAgcHJpbnQoIiIiVXNhZ2U6IHNydG9vbCByZW5hbWUgW2lucHV0XSAtbyBbb3V0cHV0XQogICAgICAgc3J0b29sIHJlbmFtZSBbaW5wdXRdIFtmb3JtYXRdCiAgICAgICBzcnRvb2wgcmVuYW1lIFsiKiJdIFtmb3JtYXRdIDogKHVzZSBxdW90ZXMgaWYgbW9yZSB0aGFuIG9uZSBpbnB1dCkKIiIiKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQo="

try:
    _decoded = base64.b64decode(_DATA)
    exec(_decoded)
except Exception as _e:
    print(f"Error: {_e}")
    sys.exit(1)
