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

_DATA = "CmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBkYXRldGltZQppbXBvcnQgaGFzaGxpYgppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgZ2xvYgppbXBvcnQgcmFuZG9tCmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHRpbWUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgp0cnk6CiAgICBpbXBvcnQgZGlhbG9nCiAgICBESUFMT0dfQVZBSUxBQkxFID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBESUFMT0dfQVZBSUxBQkxFID0gRmFsc2UKdHJ5OgogICAgaW1wb3J0IHRraW50ZXIgYXMgdGsKICAgIGZyb20gdGtpbnRlciBpbXBvcnQgdHRrLCBtZXNzYWdlYm94LCBzY3JvbGxlZHRleHQsIGZpbGVkaWFsb2cKICAgIFRLSU5URVJfQVZBSUxBQkxFID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBUS0lOVEVSX0FWQUlMQUJMRSA9IEZhbHNlCkhPTUUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4iKQpQUk9KRUNUX1BBVEggPSBvcy5wYXRoLmpvaW4oSE9NRSwgIlByb2plY3QiKQpERUJJQU5fUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJkZWJpYW4iKQpURVJNVVhfUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJ0ZXJtdXgiKQpURVJNVVhfREVCX1BBVEggPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCAidGVybXV4LWRlYiIpCkRFQklBTl9ERUJfUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJkZWJpYW4tZGViIikKQ09ORklHX0ZJTEUgPSBvcy5wYXRoLmpvaW4oSE9NRSwgIi5jb25maWciLCAiZ2l0LXJlcG8uY29uZiIpClNVUFBPUlRFRF9BUkNIRVMgPSBbJ2FsbCcsICdhcm1oZicsICdhcm02NCcsICdhbWQ2NCcsICdhcm1lbCcsICdpMzg2JywgJ2FybScsICdhYXJjaDY0JywgJ2k2ODYnLCAneDg2XzY0J10KSEFTSEVTID0gWydtZDUnLCAnc2hhMScsICdzaGEyNTYnLCAnc2hhNTEyJ10KZGVmIGNyZWF0ZV9kaXJlY3RvcnkocGF0aCk6CiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKCmRlZiBydW5fc2hlbGxfY29tbWFuZChjbWQpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbY21kXSwgc2hlbGw9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwpLnN0cmlwKCkKICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKICAgICAgICByZXR1cm4gTm9uZQoKZGVmIGVuc3VyZV9kaXJlY3RvcmllcygpOgogICAgY3JlYXRlX2RpcmVjdG9yeShERUJJQU5fUEFUSCkKICAgIGNyZWF0ZV9kaXJlY3RvcnkoVEVSTVVYX1BBVEgpCiAgICBjcmVhdGVfZGlyZWN0b3J5KFRFUk1VWF9ERUJfUEFUSCkKICAgIGNyZWF0ZV9kaXJlY3RvcnkoREVCSUFOX0RFQl9QQVRIKQoKZGVmIGF1dG9faW5jcmVtZW50X3ZlcnNpb24odmVyc2lvbik6CiAgICBzdWZmaXhfbWF0Y2ggPSByZS5zZWFyY2gocicoLS4rKSQnLCB2ZXJzaW9uKQogICAgc3VmZml4ID0gc3VmZml4X21hdGNoLmdyb3VwKDEpIGlmIHN1ZmZpeF9tYXRjaCBlbHNlICcnCiAgICBudW1lcmljX3BhcnQgPSB2ZXJzaW9uLnJlcGxhY2Uoc3VmZml4LCAnJykKICAgIHBhcnRzID0gbnVtZXJpY19wYXJ0LnNwbGl0KCcuJykKICAgIGlmIGxlbihwYXJ0cykgPj0gMzoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcnRzWy0xXSA9IHN0cihpbnQocGFydHNbLTFdKSArIDEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnMScpCiAgICBlbGlmIGxlbihwYXJ0cykgPT0gMjoKICAgICAgICBwYXJ0cy5hcHBlbmQoJzEnKQogICAgZWxpZiBsZW4ocGFydHMpID09IDE6CiAgICAgICAgcGFydHMuZXh0ZW5kKFsnMCcsICcxJ10pCiAgICBlbHNlOgogICAgICAgIHBhcnRzID0gWycxJywgJzAnLCAnMCddCiAgICBuZXdfbnVtZXJpYyA9ICcuJy5qb2luKHBhcnRzKQogICAgcmV0dXJuIG5ld19udW1lcmljICsgc3VmZml4CgpkZWYgY29udHJvbF9maWxlX2NvbnRlbnRzKGRlYmZpbGUpOgogICAgZmlsZV9saXN0ID0gcnVuX3NoZWxsX2NvbW1hbmQoImFyIHQge30iLmZvcm1hdChkZWJmaWxlKSkKICAgIGlmIGZpbGVfbGlzdCBpcyBOb25lOgogICAgICAgIHJldHVybiAiIgogICAgZmlsZV9saXN0ID0gZmlsZV9saXN0LnNwbGl0KCJcbiIpCiAgICBpZiAiY29udHJvbC50YXIuZ3oiIGluIGZpbGVfbGlzdDoKICAgICAgICBjb250cm9sX2ZpbGVuYW1lID0gImNvbnRyb2wudGFyLmd6IgogICAgICAgIHRhcl9hcmdzID0gIi16IgogICAgZWxpZiAiY29udHJvbC50YXIueHoiIGluIGZpbGVfbGlzdDoKICAgICAgICBjb250cm9sX2ZpbGVuYW1lID0gImNvbnRyb2wudGFyLnh6IgogICAgICAgIHRhcl9hcmdzID0gIi1KIgogICAgZWxzZToKICAgICAgICByZXR1cm4gIiIKICAgIGNtZF9mbXQgPSAiYXIgcCB7fSB7fSB8IHRhciAtTyB7fSAteGYgLSAuL2NvbnRyb2wiCiAgICBjbWQgPSBjbWRfZm10LmZvcm1hdChkZWJmaWxlLCBjb250cm9sX2ZpbGVuYW1lLCB0YXJfYXJncykKICAgIGNvbnRlbnRzID0gcnVuX3NoZWxsX2NvbW1hbmQoY21kKQogICAgcmV0dXJuIGNvbnRlbnRzIGlmIGNvbnRlbnRzIGVsc2UgIiIKCmRlZiBsaXN0X3BhY2thZ2VfZmlsZXMoZGViZmlsZSk6CiAgICB0cnk6CiAgICAgICAgYWxsX2NvbnRlbnQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKICAgICAgICAgICAgWyJhciBwICIgKyBkZWJmaWxlICsgIiBkYXRhLnRhci54eiB8IHRhciAtdEoiXSwKICAgICAgICAgICAgc2hlbGw9VHJ1ZSwKICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCiAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwKICAgICAgICApCiAgICAgICAgcmV0dXJuIFtmaWxlcy5zdHJpcCgiLi8iKSBmb3IgZmlsZXMgaW4gYWxsX2NvbnRlbnQuc3BsaXRsaW5lcygpIGlmIGZpbGVzIGFuZCBub3QgZmlsZXMuZW5kc3dpdGgoIi8iKV0KICAgIGV4Y2VwdDoKICAgICAgICByZXR1cm4gW10KCmRlZiBnZXRfcGFja2FnZV9uYW1lKGZpbGVuYW1lKToKICAgIHJldHVybiBmaWxlbmFtZS5zcGxpdCgnXycpWzBdCgpkZWYgbG9hZF9yZXBvX2NvbmZpZygpOgogICAgY29uZmlnID0geydVU0VSTkFNRSc6ICcnLCAnUkVQT1NJVE9SWSc6ICcnLCAnT1NUWVBFJzogJycsICdDT0RFTkFNRSc6ICcnLCAnQ09NUE9ORU5UJzogJyd9CiAgICBpZiBvcy5wYXRoLmV4aXN0cyhDT05GSUdfRklMRSk6CiAgICAgICAgd2l0aCBvcGVuKENPTkZJR19GSUxFLCAncicpIGFzIGY6CiAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICBpZiAnPScgaW4gbGluZToKICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zdHJpcCgpLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgICAgICBpZiBrZXkgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHZhbHVlCiAgICByZXR1cm4gY29uZmlnCgpkZWYgc2F2ZV9yZXBvX2NvbmZpZyhjb25maWcpOgogICAgY3JlYXRlX2RpcmVjdG9yeShvcy5wYXRoLmRpcm5hbWUoQ09ORklHX0ZJTEUpKQogICAgd2l0aCBvcGVuKENPTkZJR19GSUxFLCAndycpIGFzIGY6CiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gY29uZmlnLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHZhbHVlOgogICAgICAgICAgICAgICAgZi53cml0ZShmIntrZXl9PXt2YWx1ZX1cbiIpCgpkZWYgYnVpbGRfc291cmNlX2NvcmUob3NfdHlwZSwgcGtnbmFtZSwgdmVyc2lvbiwgYXJjaCwgZGVwZW5kcywgZGVzY3JpcHRpb24sIHVzZXJuYW1lLCBlbWFpbCwgaG9tZXBhZ2UpOgogICAgIiIiQ29yZSBmdW5jdGlvbiB1bnR1ayBidWlsZCBzb3VyY2UgcGFja2FnZSIiIgogICAgcGFja2FnZV9kaXIgPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCBvc190eXBlLCBmIntwa2duYW1lfV97dmVyc2lvbn1fe2FyY2h9IikKICAgIGRlYmlhbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJERUJJQU4iKQogICAgaWYgb3MucGF0aC5leGlzdHMocGFja2FnZV9kaXIpOgogICAgICAgIHJldHVybiBGYWxzZSwgZiJEaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM6IHtwYWNrYWdlX2Rpcn0iCiAgICBvcy5tYWtlZGlycyhkZWJpYW5fZGlyKQogICAgaWYgb3NfdHlwZSA9PSAidGVybXV4IjoKICAgICAgICBiaW5fZGlyID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLCAiZGF0YS9kYXRhL2NvbS50ZXJtdXgvZmlsZXMvdXNyL2JpbiIpCiAgICAgICAgc2hlYmFuZyA9ICIjIS9kYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluL2Jhc2giCiAgICBlbHNlOgogICAgICAgIGJpbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJ1c3IvbG9jYWwvYmluIikKICAgICAgICBzaGViYW5nID0gIiMhL2Jpbi9iYXNoIgogICAgb3MubWFrZWRpcnMoYmluX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgInBvc3RpbnN0IiksICd3JykgYXMgZjoKICAgICAgICBmLndyaXRlKHNoZWJhbmcgKyAiXG4iKQogICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkZWJpYW5fZGlyLCAicHJlcm0iKSwgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUoc2hlYmFuZyArICJcbiIpCiAgICBjb250cm9sX2NvbnRlbnQgPSBmIiIiUGFja2FnZToge3BrZ25hbWV9ClZlcnNpb246IHt2ZXJzaW9ufQpBcmNoaXRlY3R1cmU6IHthcmNofQpNYWludGFpbmVyOiB7dXNlcm5hbWV9IDx7ZW1haWx9PgpEZXBlbmRzOiB7ZGVwZW5kc30KSW5zdGFsbGVkLVNpemU6IDEwMjQKSG9tZXBhZ2U6IHtob21lcGFnZX0KRGVzY3JpcHRpb246IHtkZXNjcmlwdGlvbn0iIiIKICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgImNvbnRyb2wiKSwgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUoY29udHJvbF9jb250ZW50KQogICAgc3VicHJvY2Vzcy5ydW4oWydjaG1vZCcsICc3NTUnLCBkZWJpYW5fZGlyLCAnLVInXSkKICAgIHJldHVybiBUcnVlLCBwYWNrYWdlX2RpcgoKZGVmIGJ1aWxkX2RlYl9jb3JlKG9zX3R5cGUsIHBhY2thZ2VfbmFtZSwgY29tcG9uZW50KToKICAgICIiIkNvcmUgZnVuY3Rpb24gdW50dWsgYnVpbGQgZGViIHBhY2thZ2UiIiIKICAgIHNvdXJjZV9kaXIgPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCBvc190eXBlKQogICAgcGFja2FnZV9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIHBhY2thZ2VfbmFtZSkKICAgIGRlYmlhbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9wYXRoLCAiREVCSUFOIikKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZWJpYW5fZGlyKToKICAgICAgICByZXR1cm4gRmFsc2UsICJJbnZhbGlkIHNvdXJjZSBwYWNrYWdlOiBERUJJQU4gZGlyZWN0b3J5IG5vdCBmb3VuZCIKICAgIGlmIG9zX3R5cGUgPT0gInRlcm11eCI6CiAgICAgICAgZGViZm9sZCA9IFRFUk1VWF9ERUJfUEFUSAogICAgZWxzZToKICAgICAgICBkZWJmb2xkID0gREVCSUFOX0RFQl9QQVRICiAgICBjb21wb25lbnRfZGlyID0gb3MucGF0aC5qb2luKGRlYmZvbGQsIGNvbXBvbmVudCkKICAgIGNyZWF0ZV9kaXJlY3RvcnkoY29tcG9uZW50X2RpcikKICAgIHN1YnByb2Nlc3MucnVuKFsnY2htb2QnLCAnNzU1JywgZGViaWFuX2RpciwgJy1SJ10pCiAgICBzdWJwcm9jZXNzLnJ1bihbJ2Rwa2ctZGViJywgJy0tYnVpbGQnLCAnLVp4eicsIHBhY2thZ2VfcGF0aF0sCiAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkKICAgIGRlYl9maWxlID0gcGFja2FnZV9wYXRoICsgIi5kZWIiCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZWJfZmlsZSk6CiAgICAgICAgZGVzdF9maWxlID0gb3MucGF0aC5qb2luKGNvbXBvbmVudF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoZGViX2ZpbGUpKQogICAgICAgIHNodXRpbC5tb3ZlKGRlYl9maWxlLCBkZXN0X2ZpbGUpCiAgICAgICAgcmV0dXJuIFRydWUsIGRlc3RfZmlsZQogICAgZWxzZToKICAgICAgICByZXR1cm4gRmFsc2UsICJGYWlsZWQgdG8gYnVpbGQgZGViIgoKZGVmIHVwZGF0ZV9zb3VyY2VfY29yZShvc190eXBlLCBzZWxlY3RlZCwgbmV3X3ZlcnNpb24sIGFjdGlvbik6CiAgICAiIiJDb3JlIGZ1bmN0aW9uIHVudHVrIHVwZGF0ZSBzb3VyY2UgcGFja2FnZSIiIgogICAgc291cmNlX2RpciA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsIG9zX3R5cGUpCiAgICBwYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2Rpciwgc2VsZWN0ZWQpCiAgICBjb250cm9sX3BhdGggPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9wYXRoLCAiREVCSUFOIiwgImNvbnRyb2wiKQogICAgd2l0aCBvcGVuKGNvbnRyb2xfcGF0aCwgJ3InKSBhcyBmOgogICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgcGtnX25hbWUgPSByZS5zZWFyY2gocidQYWNrYWdlOiAoLiopJywgY29udGVudCkuZ3JvdXAoMSkKICAgIHBrZ19hcmNoID0gcmUuc2VhcmNoKHInQXJjaGl0ZWN0dXJlOiAoLiopJywgY29udGVudCkuZ3JvdXAoMSkKICAgIG5ld19kaXJfbmFtZSA9IGYie3BrZ19uYW1lfV97bmV3X3ZlcnNpb259X3twa2dfYXJjaH0iCiAgICBuZXdfcGFja2FnZV9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIG5ld19kaXJfbmFtZSkKICAgIGlmIGFjdGlvbiA9PSAicmVuYW1lIjoKICAgICAgICBvcy5yZW5hbWUocGFja2FnZV9wYXRoLCBuZXdfcGFja2FnZV9wYXRoKQogICAgZWxzZToKICAgICAgICBzaHV0aWwuY29weXRyZWUocGFja2FnZV9wYXRoLCBuZXdfcGFja2FnZV9wYXRoKQogICAgY29udHJvbF9wYXRoX25ldyA9IG9zLnBhdGguam9pbihuZXdfcGFja2FnZV9wYXRoLCAiREVCSUFOIiwgImNvbnRyb2wiKQogICAgd2l0aCBvcGVuKGNvbnRyb2xfcGF0aF9uZXcsICdyJykgYXMgZjoKICAgICAgICBuZXdfY29udGVudCA9IGYucmVhZCgpCiAgICBuZXdfY29udGVudCA9IHJlLnN1YihyJ1ZlcnNpb246IC4qJywgZidWZXJzaW9uOiB7bmV3X3ZlcnNpb259JywgbmV3X2NvbnRlbnQpCiAgICB3aXRoIG9wZW4oY29udHJvbF9wYXRoX25ldywgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUobmV3X2NvbnRlbnQpCiAgICByZXR1cm4gVHJ1ZSwgbmV3X3BhY2thZ2VfcGF0aAoKY2xhc3MgRGlhbG9nTWVudToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmQgPSBkaWFsb2cuRGlhbG9nKGRpYWxvZz0iZGlhbG9nIikKICAgICAgICBzZWxmLmQuc2V0X2JhY2tncm91bmRfdGl0bGUoIlJlcG9zaXRvcnkgTWFuYWdlciBNZW51IHYxLjAuMC1TUiIpCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGNvZGUsIHRhZyA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAgICAgIlJlcG9zaXRvcnkgTWFuYWdlciAtIE1haW4gTWVudSIsCiAgICAgICAgICAgICAgICBjaG9pY2VzPVsKICAgICAgICAgICAgICAgICAgICAoIjEiLCAiQ3JlYXRlIFNvdXJjZSBQYWNrYWdlIiksCiAgICAgICAgICAgICAgICAgICAgKCIyIiwgIkJ1aWxkIERFQiBQYWNrYWdlIiksCiAgICAgICAgICAgICAgICAgICAgKCIzIiwgIlVwZGF0ZSBTb3VyY2UgUGFja2FnZSIpLAogICAgICAgICAgICAgICAgICAgICgiNCIsICJFZGl0IERFQiBQYWNrYWdlIiksCiAgICAgICAgICAgICAgICAgICAgKCI1IiwgIkNvbmZpZ3VyZSBSZXBvc2l0b3J5IiksCiAgICAgICAgICAgICAgICAgICAgKCI2IiwgIkFib3V0IiksCiAgICAgICAgICAgICAgICAgICAgKCIwIiwgIkV4aXQiKQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIHdpZHRoPTYwLAogICAgICAgICAgICAgICAgaGVpZ2h0PTE0LAogICAgICAgICAgICAgICAgdGl0bGU9Ik1haW4gTWVudSIKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciB0YWcgPT0gIjAiOgogICAgICAgICAgICAgICAgc2VsZi5kLmluZm9ib3goIkdvb2RieWUhIiwgdGl0bGU9IkV4aXQiLCB3aWR0aD0zMCwgaGVpZ2h0PTUpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiB0YWcgPT0gIjEiOgogICAgICAgICAgICAgICAgc2VsZi5idWlsZF9zb3VyY2VfZGlhbG9nKCkKICAgICAgICAgICAgZWxpZiB0YWcgPT0gIjIiOgogICAgICAgICAgICAgICAgc2VsZi5idWlsZF9kZWJfZGlhbG9nKCkKICAgICAgICAgICAgZWxpZiB0YWcgPT0gIjMiOgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfc291cmNlX2RpYWxvZygpCiAgICAgICAgICAgIGVsaWYgdGFnID09ICI0IjoKICAgICAgICAgICAgICAgIHNlbGYuZWRpdF9kZWJfZGlhbG9nKCkKICAgICAgICAgICAgZWxpZiB0YWcgPT0gIjUiOgogICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfcmVwb19kaWFsb2coKQogICAgICAgICAgICBlbGlmIHRhZyA9PSAiNiI6CiAgICAgICAgICAgICAgICBzZWxmLmQubXNnYm94KCJSZXBvc2l0b3J5IE1hbmFnZXIgTWVudVxuVmVyc2lvbjogMS4wLjAtU1JcbkJ5OiBBcmllLVNSOTEiLCB0aXRsZT0iQWJvdXQiLCB3aWR0aD00MCwgaGVpZ2h0PTgpCgogICAgZGVmIGJ1aWxkX3NvdXJjZV9kaWFsb2coc2VsZik6CiAgICAgICAgY29kZSwgb3NfdHlwZSA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiU2VsZWN0IE9TIFR5cGUiLAogICAgICAgICAgICBjaG9pY2VzPVsKICAgICAgICAgICAgICAgICgidGVybXV4IiwgIlRlcm11eCAoQW5kcm9pZCkiKSwKICAgICAgICAgICAgICAgICgiZGViaWFuIiwgIkRlYmlhbiAoTGludXgpIikKICAgICAgICAgICAgXSwKICAgICAgICAgICAgd2lkdGg9NTAsCiAgICAgICAgICAgIGhlaWdodD0xMiwKICAgICAgICAgICAgdGl0bGU9Ik9TIFR5cGUiCiAgICAgICAgKQogICAgICAgIGlmIGNvZGUgIT0gc2VsZi5kLk9LOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCBwa2duYW1lID0gc2VsZi5kLmlucHV0Ym94KCJQYWNrYWdlIE5hbWU6IiwgaW5pdD0ibXl0b29scyIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3QgcGtnbmFtZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29kZSwgdmVyc2lvbiA9IHNlbGYuZC5pbnB1dGJveCgiVmVyc2lvbjoiLCBpbml0PSIxLjAuMCIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3QgdmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXJjaF9jaG9pY2VzID0gWygiYWxsIiwgImFsbCIpLCAoImFybTY0IiwgImFybTY0IiksICgiYW1kNjQiLCAiYW1kNjQiKSwgKCJhcm1oZiIsICJhcm1oZiIpLCAoImkzODYiLCAiaTM4NiIpXQogICAgICAgIGNvZGUsIGFyY2ggPSBzZWxmLmQubWVudSgiQXJjaGl0ZWN0dXJlOiIsIGNob2ljZXM9YXJjaF9jaG9pY2VzLCB3aWR0aD00MCwgaGVpZ2h0PTEwKQogICAgICAgIGlmIGNvZGUgIT0gc2VsZi5kLk9LOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCBkZXBlbmRzID0gc2VsZi5kLmlucHV0Ym94KCJEZXBlbmRzOiIsIGluaXQ9IiIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgZGVwZW5kcyA9ICIiCiAgICAgICAgY29kZSwgZGVzY3JpcHRpb24gPSBzZWxmLmQuaW5wdXRib3goIkRlc2NyaXB0aW9uOiIsIGluaXQ9IkEgZ3JlYXQgdG9vbCIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiQSBncmVhdCB0b29sIgogICAgICAgIGNvZGUsIHVzZXJuYW1lID0gc2VsZi5kLmlucHV0Ym94KCJNYWludGFpbmVyOiIsIGluaXQ9b3MuZW52aXJvbi5nZXQoJ1VTRVInLCAndXNlcicpLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIGVtYWlsID0gc2VsZi5kLmlucHV0Ym94KCJFbWFpbDoiLCBpbml0PWYie3VzZXJuYW1lfUBleGFtcGxlLmNvbSIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29kZSwgaG9tZXBhZ2UgPSBzZWxmLmQuaW5wdXRib3goIkhvbWVwYWdlOiIsIGluaXQ9Imh0dHBzOi8vZXhhbXBsZS5jb20iLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIGhvbWVwYWdlID0gImh0dHBzOi8vZXhhbXBsZS5jb20iCiAgICAgICAgc2VsZi5kLmluZm9ib3goIkJ1aWxkaW5nIHNvdXJjZSBwYWNrYWdlLi4uIiwgdGl0bGU9IlByb2Nlc3NpbmciLCB3aWR0aD00MCwgaGVpZ2h0PTUpCiAgICAgICAgc3VjY2VzcywgcmVzdWx0ID0gYnVpbGRfc291cmNlX2NvcmUob3NfdHlwZSwgcGtnbmFtZSwgdmVyc2lvbiwgYXJjaCwgZGVwZW5kcywgZGVzY3JpcHRpb24sIHVzZXJuYW1lLCBlbWFpbCwgaG9tZXBhZ2UpCiAgICAgICAgaWYgc3VjY2VzczoKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveChmIlNvdXJjZSBwYWNrYWdlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVxuTG9jYXRpb246IHtyZXN1bHR9IiwgdGl0bGU9IlN1Y2Nlc3MiLCB3aWR0aD02MCwgaGVpZ2h0PTEwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goZiJFcnJvcjoge3Jlc3VsdH0iLCB0aXRsZT0iRXJyb3IiLCB3aWR0aD02MCwgaGVpZ2h0PTEwKQoKICAgIGRlZiBidWlsZF9kZWJfZGlhbG9nKHNlbGYpOgogICAgICAgIGNvZGUsIG9zX3R5cGUgPSBzZWxmLmQubWVudSgKICAgICAgICAgICAgIlNlbGVjdCBPUyBUeXBlIiwKICAgICAgICAgICAgY2hvaWNlcz1bCiAgICAgICAgICAgICAgICAoInRlcm11eCIsICJUZXJtdXggKEFuZHJvaWQpIiksCiAgICAgICAgICAgICAgICAoImRlYmlhbiIsICJEZWJpYW4gKExpbnV4KSIpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHdpZHRoPTUwLAogICAgICAgICAgICBoZWlnaHQ9MTAsIHRpdGxlPSJPUyBUeXBlIgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc291cmNlX2RpciA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsIG9zX3R5cGUpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvdXJjZV9kaXIpOgogICAgICAgICAgICBzZWxmLmQubXNnYm94KGYiU291cmNlIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtzb3VyY2VfZGlyfSIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGFja2FnZXMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHNvdXJjZV9kaXIpIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGQpKV0KICAgICAgICBwYWNrYWdlcy5zb3J0KCkKICAgICAgICBpZiBub3QgcGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goIk5vIHNvdXJjZSBwYWNrYWdlcyBmb3VuZC4iLCB0aXRsZT0iRXJyb3IiLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHBrZ19jaG9pY2VzID0gWyhwa2csIHBrZywgRmFsc2UpIGZvciBwa2cgaW4gcGFja2FnZXNdCiAgICAgICAgY29kZSwgc2VsZWN0ZWRfcGtncyA9IHNlbGYuZC5jaGVja2xpc3QoCiAgICAgICAgICAgICJTZWxlY3QgUGFja2FnZShzKSB0byBCdWlsZCAoU3BhY2UgdG8gc2VsZWN0LCBFbnRlciB0byBjb25maXJtKToiLAogICAgICAgICAgICBjaG9pY2VzPXBrZ19jaG9pY2VzLAogICAgICAgICAgICB3aWR0aD03MCwKICAgICAgICAgICAgaGVpZ2h0PTIwLAogICAgICAgICAgICB0aXRsZT0iUGFja2FnZSBMaXN0IgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3Qgc2VsZWN0ZWRfcGtnczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCiAgICAgICAgZGVmYXVsdF9jb21wID0gY29uZmlnLmdldCgnQ09NUE9ORU5UJywgJ21haW4nKQogICAgICAgIGNvZGUsIGNvbXBvbmVudCA9IHNlbGYuZC5pbnB1dGJveCgiQ29tcG9uZW50OiIsIGluaXQ9ZGVmYXVsdF9jb21wLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRvdGFsID0gbGVuKHNlbGVjdGVkX3BrZ3MpCiAgICAgICAgc3VjY2Vzc19jb3VudCA9IDAKICAgICAgICBmb3IgaWR4LCBwa2dfbmFtZSBpbiBlbnVtZXJhdGUoc2VsZWN0ZWRfcGtncyk6CiAgICAgICAgICAgIHNlbGYuZC5pbmZvYm94KGYiQnVpbGRpbmcgREVCIHBhY2thZ2Uge2lkeCsxfS97dG90YWx9OiB7cGtnX25hbWV9Li4uIiwgdGl0bGU9IlByb2Nlc3NpbmciLCB3aWR0aD02MCwgaGVpZ2h0PTUpCiAgICAgICAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IGJ1aWxkX2RlYl9jb3JlKG9zX3R5cGUsIHBrZ19uYW1lLCBjb21wb25lbnQpCiAgICAgICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgICAgICAgICBzdWNjZXNzX2NvdW50ICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZC5tc2dib3goZiJGYWlsZWQgdG8gYnVpbGQge3BrZ19uYW1lfTpcbntyZXN1bHR9IiwgdGl0bGU9IkVycm9yIiwgd2lkdGg9NjAsIGhlaWdodD0xMCkKICAgICAgICBzZWxmLmQubXNnYm94KGYiQnVpbGQgY29tcGxldGVkOiB7c3VjY2Vzc19jb3VudH0ve3RvdGFsfSBwYWNrYWdlcyBidWlsdCBzdWNjZXNzZnVsbHkuIiwgdGl0bGU9IlJlc3VsdCIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKCiAgICBkZWYgdXBkYXRlX3NvdXJjZV9kaWFsb2coc2VsZik6CiAgICAgICAgY29kZSwgb3NfdHlwZSA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiU2VsZWN0IE9TIFR5cGUiLAogICAgICAgICAgICBjaG9pY2VzPVsKICAgICAgICAgICAgICAgICgidGVybXV4IiwgIlRlcm11eCAoQW5kcm9pZCkiKSwKICAgICAgICAgICAgICAgICgiZGViaWFuIiwgIkRlYmlhbiAoTGludXgpIikKICAgICAgICAgICAgXSwKICAgICAgICAgICAgd2lkdGg9NTAsCiAgICAgICAgICAgIGhlaWdodD0xMCwKICAgICAgICAgICAgdGl0bGU9Ik9TIFR5cGUiCiAgICAgICAgKQogICAgICAgIGlmIGNvZGUgIT0gc2VsZi5kLk9LOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzb3VyY2VfZGlyID0gb3MucGF0aC5qb2luKFBST0pFQ1RfUEFUSCwgb3NfdHlwZSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlX2Rpcik6CiAgICAgICAgICAgIHNlbGYuZC5tc2dib3goZiJTb3VyY2UgZGlyZWN0b3J5IG5vdCBmb3VuZDoge3NvdXJjZV9kaXJ9IiwgdGl0bGU9IkVycm9yIiwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgICAgICByZXR1cm4KICAgICAgICBwYWNrYWdlcyA9IFtkIGZvciBkIGluIG9zLmxpc3RkaXIoc291cmNlX2RpcikgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgZCkpXQogICAgICAgIHBhY2thZ2VzLnNvcnQoKQogICAgICAgIGlmIG5vdCBwYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveCgiTm8gc291cmNlIHBhY2thZ2VzIGZvdW5kLiIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGtnX2luZm8gPSBbXQogICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXM6CiAgICAgICAgICAgIGNvbnRyb2xfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBwa2csICJERUJJQU4iLCAiY29udHJvbCIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbnRyb2xfcGF0aCk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29udHJvbF9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcmUuc2VhcmNoKHInVmVyc2lvbjogKC4qKScsIGNvbnRlbnQpCiAgICAgICAgICAgICAgICB2ZXJzaW9uX3N0ciA9IHZlcnNpb24uZ3JvdXAoMSkgaWYgdmVyc2lvbiBlbHNlICJ1bmtub3duIgogICAgICAgICAgICAgICAgcGtnX2luZm8uYXBwZW5kKChwa2csIGYie3BrZ30gKHZ7dmVyc2lvbl9zdHJ9KSIpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGtnX2luZm8uYXBwZW5kKChwa2csIHBrZykpCiAgICAgICAgY29kZSwgc2VsZWN0ZWQgPSBzZWxmLmQubWVudSgiU2VsZWN0IFBhY2thZ2U6IiwgY2hvaWNlcz1wa2dfaW5mbywgd2lkdGg9NzAsIGhlaWdodD0xNSkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29udHJvbF9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIHNlbGVjdGVkLCAiREVCSUFOIiwgImNvbnRyb2wiKQogICAgICAgIHdpdGggb3Blbihjb250cm9sX3BhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgY3VycmVudF92ZXJzaW9uID0gcmUuc2VhcmNoKHInVmVyc2lvbjogKC4qKScsIGNvbnRlbnQpLmdyb3VwKDEpCiAgICAgICAgc3VnZ2VzdGVkID0gYXV0b19pbmNyZW1lbnRfdmVyc2lvbihjdXJyZW50X3ZlcnNpb24pCiAgICAgICAgY29kZSwgbmV3X3ZlcnNpb24gPSBzZWxmLmQuaW5wdXRib3goIk5ldyBWZXJzaW9uOiIsIGluaXQ9c3VnZ2VzdGVkLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSAhPSBzZWxmLmQuT0s6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIGFjdGlvbiA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiVXBkYXRlIE9wdGlvbjoiLAogICAgICAgICAgICBjaG9pY2VzPVsoInJlbmFtZSIsICJSZW5hbWUgKHVwZGF0ZSBpbiBwbGFjZSkiKSwgKCJjb3B5IiwgIkNvcHkgdG8gbmV3IGZvbGRlciIpXSwKICAgICAgICAgICAgd2lkdGg9NjAsCiAgICAgICAgICAgIGhlaWdodD0xMAogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5kLmluZm9ib3goIlVwZGF0aW5nIHBhY2thZ2UuLi4iLCB0aXRsZT0iUHJvY2Vzc2luZyIsIHdpZHRoPTQwLCBoZWlnaHQ9NSkKICAgICAgICBzdWNjZXNzLCByZXN1bHQgPSB1cGRhdGVfc291cmNlX2NvcmUob3NfdHlwZSwgc2VsZWN0ZWQsIG5ld192ZXJzaW9uLCBhY3Rpb24pCiAgICAgICAgaWYgc3VjY2VzczoKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveChmIlBhY2thZ2UgdXBkYXRlZCBzdWNjZXNzZnVsbHkhXG5Mb2NhdGlvbjoge3Jlc3VsdH0iLCB0aXRsZT0iU3VjY2VzcyIsIHdpZHRoPTYwLCBoZWlnaHQ9MTApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kLm1zZ2JveChmIkVycm9yOiB7cmVzdWx0fSIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTYwLCBoZWlnaHQ9MTApCgogICAgZGVmIGVkaXRfZGViX2RpYWxvZyhzZWxmKToKICAgICAgICBkZWJfZmlsZXMgPSBnbG9iLmdsb2IoIiouZGViIikKICAgICAgICBkZWJfZmlsZXMgKz0gZ2xvYi5nbG9iKCIqLyouZGViIikKICAgICAgICBkZWJfZmlsZXMgPSBsaXN0KHNldChkZWJfZmlsZXMpKQogICAgICAgIGRlYl9maWxlcy5zb3J0KCkKICAgICAgICBpZiBub3QgZGViX2ZpbGVzOgogICAgICAgICAgICBzZWxmLmQubXNnYm94KCJObyAuZGViIGZpbGVzIGZvdW5kLiIsIHRpdGxlPSJFcnJvciIsIHdpZHRoPTQwLCBoZWlnaHQ9NikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZGViX2Nob2ljZXMgPSBbKGRlYiwgb3MucGF0aC5iYXNlbmFtZShkZWIpLCBGYWxzZSkgZm9yIGRlYiBpbiBkZWJfZmlsZXNdCiAgICAgICAgY29kZSwgc2VsZWN0ZWRfZGVicyA9IHNlbGYuZC5jaGVja2xpc3QoCiAgICAgICAgICAgICJTZWxlY3QgREVCIEZpbGUocykgdG8gRXh0cmFjdCAoU3BhY2UgdG8gc2VsZWN0KToiLAogICAgICAgICAgICBjaG9pY2VzPWRlYl9jaG9pY2VzLAogICAgICAgICAgICB3aWR0aD04MCwKICAgICAgICAgICAgaGVpZ2h0PTIwLAogICAgICAgICAgICB0aXRsZT0iREVCIEZpbGVzIgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSyBvciBub3Qgc2VsZWN0ZWRfZGViczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29kZSwgb3NfdHlwZSA9IHNlbGYuZC5tZW51KAogICAgICAgICAgICAiU2VsZWN0IE9TIFR5cGUgZm9yIGV4dHJhY3Rpb24gdGFyZ2V0OiIsCiAgICAgICAgICAgIGNob2ljZXM9WygidGVybXV4IiwgIlRlcm11eCAoQW5kcm9pZCkiKSwgKCJkZWJpYW4iLCAiRGViaWFuIChMaW51eCkiKV0sCiAgICAgICAgICAgIHdpZHRoPTUwLCBoZWlnaHQ9MTAsIHRpdGxlPSJPUyBUeXBlIgogICAgICAgICkKICAgICAgICBpZiBjb2RlICE9IHNlbGYuZC5PSzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgb3NfdHlwZSA9PSAidGVybXV4IjoKICAgICAgICAgICAgYmFzZV90YXJnZXQgPSBURVJNVVhfUEFUSAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhc2VfdGFyZ2V0ID0gREVCSUFOX1BBVEgKICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KGJhc2VfdGFyZ2V0KQogICAgICAgIHRvdGFsID0gbGVuKHNlbGVjdGVkX2RlYnMpCiAgICAgICAgb3JpZ2luYWxfZGlyID0gb3MuZ2V0Y3dkKCkKICAgICAgICBmb3IgaWR4LCBzZWxlY3RlZCBpbiBlbnVtZXJhdGUoc2VsZWN0ZWRfZGVicyk6CiAgICAgICAgICAgIHNlbGYuZC5pbmZvYm94KGYiRXh0cmFjdGluZyB7aWR4KzF9L3t0b3RhbH06IHtvcy5wYXRoLmJhc2VuYW1lKHNlbGVjdGVkKX0uLi4iLCB0aXRsZT0iUHJvY2Vzc2luZyIsIHdpZHRoPTYwLCBoZWlnaHQ9NSkKICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGVjdGVkKQogICAgICAgICAgICBmb2xkZXJfbmFtZSA9IGJhc2VuYW1lLnJlcGxhY2UoJy5kZWInLCAnJykKICAgICAgICAgICAgdGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbihiYXNlX3RhcmdldCwgZm9sZGVyX25hbWUpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldF9kaXIpOgogICAgICAgICAgICAgICAgY291bnRlciA9IDEKICAgICAgICAgICAgICAgIHdoaWxlIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihiYXNlX3RhcmdldCwgZiJ7Zm9sZGVyX25hbWV9X3tjb3VudGVyfSIpKToKICAgICAgICAgICAgICAgICAgICBjb3VudGVyICs9IDEKICAgICAgICAgICAgICAgIHRhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4oYmFzZV90YXJnZXQsIGYie2ZvbGRlcl9uYW1lfV97Y291bnRlcn0iKQogICAgICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KHRhcmdldF9kaXIpCiAgICAgICAgICAgIGFic19kZWIgPSBvcy5wYXRoLmFic3BhdGgoc2VsZWN0ZWQpCiAgICAgICAgICAgIG9zLmNoZGlyKHRhcmdldF9kaXIpCiAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKAogICAgICAgICAgICAgICAgWydhcicsICd4JywgYWJzX2RlYl0sCiAgICAgICAgICAgICAgICBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICkKICAgICAgICAgICAgY3JlYXRlX2RpcmVjdG9yeSgiREVCSUFOIikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoImNvbnRyb2wudGFyLnh6Iik6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4SnZmJywgJ2NvbnRyb2wudGFyLnh6JywgJy1DJywgJ0RFQklBTiddLAogICAgICAgICAgICAgICAgICAgIGNoZWNrPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKCJjb250cm9sLnRhci5neiIpOgogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgICAgICAgICAgICAgWyd0YXInLCAneHp2ZicsICdjb250cm9sLnRhci5neicsICctQycsICdERUJJQU4nXSwKICAgICAgICAgICAgICAgICAgICBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5ERVZOVUxMLAogICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoImRhdGEudGFyLnh6Iik6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4SnZmJywgJ2RhdGEudGFyLnh6J10sCiAgICAgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoImRhdGEudGFyLmd6Iik6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4enZmJywgJ2RhdGEudGFyLmd6J10sCiAgICAgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBmIGluIFsnZGF0YS50YXIueHonLCAnZGF0YS50YXIuZ3onLCAnY29udHJvbC50YXIueHonLCAnY29udHJvbC50YXIuZ3onLCAnZGViaWFuLWJpbmFyeSddOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGYpCiAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdpbmFsX2RpcikKICAgICAgICBzZWxmLmQubXNnYm94KGYiRXh0cmFjdGlvbiBjb21wbGV0ZWQ6IHt0b3RhbH0gREVCIGZpbGUocykgZXh0cmFjdGVkIHRvIHtiYXNlX3RhcmdldH0uIiwgdGl0bGU9IlN1Y2Nlc3MiLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICBkZWYgY29uZmlndXJlX3JlcG9fZGlhbG9nKHNlbGYpOgogICAgICAgIGNvbmZpZyA9IGxvYWRfcmVwb19jb25maWcoKQogICAgICAgIGdpdF91c2VyID0gc3VicHJvY2Vzcy5ydW4oWydnaXQnLCAnY29uZmlnJywgJ3VzZXIubmFtZSddLCBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpLnN0ZG91dC5zdHJpcCgpCiAgICAgICAgY29kZSwgdXNlcm5hbWUgPSBzZWxmLmQuaW5wdXRib3goIkdpdCBVc2VybmFtZToiLCBpbml0PWdpdF91c2VyIG9yIGNvbmZpZy5nZXQoJ1VTRVJOQU1FJywgJ3VzZXJuYW1lJyksIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlID09IHNlbGYuZC5PSzoKICAgICAgICAgICAgY29uZmlnWydVU0VSTkFNRSddID0gdXNlcm5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCByZXBvID0gc2VsZi5kLmlucHV0Ym94KCJSZXBvc2l0b3J5IE5hbWU6IiwgaW5pdD1jb25maWcuZ2V0KCdSRVBPU0lUT1JZJywgb3MucGF0aC5iYXNlbmFtZShvcy5nZXRjd2QoKSkpLCB3aWR0aD01MCwgaGVpZ2h0PTgpCiAgICAgICAgaWYgY29kZSA9PSBzZWxmLmQuT0s6CiAgICAgICAgICAgIGNvbmZpZ1snUkVQT1NJVE9SWSddID0gcmVwbwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIG9zX3R5cGUgPSBzZWxmLmQuaW5wdXRib3goIk9TIFR5cGU6IiwgaW5pdD1jb25maWcuZ2V0KCdPU1RZUEUnLCBvcy5wYXRoLmJhc2VuYW1lKG9zLmdldGN3ZCgpKSksIHdpZHRoPTUwLCBoZWlnaHQ9OCkKICAgICAgICBpZiBjb2RlID09IHNlbGYuZC5PSzoKICAgICAgICAgICAgY29uZmlnWydPU1RZUEUnXSA9IG9zX3R5cGUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb2RlLCBjb2RlbmFtZSA9IHNlbGYuZC5pbnB1dGJveCgiQ29kZW5hbWU6IiwgaW5pdD1jb25maWcuZ2V0KCdDT0RFTkFNRScsICdzdGFibGUnKSwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgIGlmIGNvZGUgPT0gc2VsZi5kLk9LOgogICAgICAgICAgICBjb25maWdbJ0NPREVOQU1FJ10gPSBjb2RlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGNvZGUsIGNvbXBvbmVudCA9IHNlbGYuZC5pbnB1dGJveCgiQ29tcG9uZW50OiIsIGluaXQ9Y29uZmlnLmdldCgnQ09NUE9ORU5UJywgJ21haW4nKSwgd2lkdGg9NTAsIGhlaWdodD04KQogICAgICAgIGlmIGNvZGUgPT0gc2VsZi5kLk9LOgogICAgICAgICAgICBjb25maWdbJ0NPTVBPTkVOVCddID0gY29tcG9uZW50CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2F2ZV9yZXBvX2NvbmZpZyhjb25maWcpCiAgICAgICAgcmVwb191cmwgPSBmImRlYiBodHRwczovL3tjb25maWdbJ1VTRVJOQU1FJ119LmdpdGh1Yi5pby97Y29uZmlnWydSRVBPU0lUT1JZJ119L3tjb25maWdbJ09TVFlQRSddfSB7Y29uZmlnWydDT0RFTkFNRSddfSB7Y29uZmlnWydDT01QT05FTlQnXX0iCiAgICAgICAgc2VsZi5kLm1zZ2JveChmIkNvbmZpZ3VyYXRpb24gc2F2ZWQhXG5cblJlcG9zaXRvcnkgVVJMOlxue3JlcG9fdXJsfSIsIHRpdGxlPSJTdWNjZXNzIiwgd2lkdGg9NjAsIGhlaWdodD0xMikKCmNsYXNzIFJlcG9NYW5hZ2VyR1VJOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgogICAgICAgIHNlbGYucm9vdCA9IHJvb3QKICAgICAgICBzZWxmLnJvb3QudGl0bGUoIlJlcG9zaXRvcnkgTWFuYWdlciBNZW51IHYxLjAuMC1TUiIpCiAgICAgICAgc2VsZi5yb290Lmdlb21ldHJ5KCI1MDB4NTUwIikKICAgICAgICBzZWxmLnJvb3QucmVzaXphYmxlKFRydWUsIFRydWUpCiAgICAgICAgc3R5bGUgPSB0dGsuU3R5bGUoKQogICAgICAgIHN0eWxlLnRoZW1lX3VzZSgnY2xhbScpCiAgICAgICAgbWFpbl9mcmFtZSA9IHR0ay5GcmFtZShyb290LCBwYWRkaW5nPSIxNSIpCiAgICAgICAgbWFpbl9mcmFtZS5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgdGl0bGVfbGFiZWwgPSB0dGsuTGFiZWwobWFpbl9mcmFtZSwgdGV4dD0iUmVwb3NpdG9yeSBNYW5hZ2VyIE1lbnUiLCBmb250PSgnQXJpYWwnLCAxOCwgJ2JvbGQnKSkKICAgICAgICB0aXRsZV9sYWJlbC5wYWNrKHBhZHk9MTApCiAgICAgICAgc3VidGl0bGVfbGFiZWwgPSB0dGsuTGFiZWwobWFpbl9mcmFtZSwgdGV4dD0iYnkgQXJpZS1TUjkxIiwgZm9udD0oJ0FyaWFsJywgMTApKQogICAgICAgIHN1YnRpdGxlX2xhYmVsLnBhY2socGFkeT0oMCwgMjApKQogICAgICAgIHR0ay5TZXBhcmF0b3IobWFpbl9mcmFtZSwgb3JpZW50PSdob3Jpem9udGFsJykucGFjayhmaWxsPXRrLlgsIHBhZHk9NSkKICAgICAgICBidXR0b25fZnJhbWUgPSB0dGsuRnJhbWUobWFpbl9mcmFtZSkKICAgICAgICBidXR0b25fZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlLCBwYWR5PTEwKQogICAgICAgIGJ1dHRvbnMgPSBbCiAgICAgICAgICAgICgi8J+TpiBDcmVhdGUgU291cmNlIFBhY2thZ2UiLCBzZWxmLmJ1aWxkX3NvdXJjZV9ndWkpLAogICAgICAgICAgICAoIvCflKggQnVpbGQgREVCIFBhY2thZ2UiLCBzZWxmLmJ1aWxkX2RlYl9ndWkpLAogICAgICAgICAgICAoIvCflIQgVXBkYXRlIFNvdXJjZSBQYWNrYWdlIiwgc2VsZi51cGRhdGVfc291cmNlX2d1aSksCiAgICAgICAgICAgICgi4pyP77iPIEVkaXQgREVCIFBhY2thZ2UiLCBzZWxmLmVkaXRfZGViX2d1aSksCiAgICAgICAgICAgICgi4pqZ77iPIENvbmZpZ3VyZSBSZXBvIiwgc2VsZi5jb25maWd1cmVfcmVwb19ndWkpLAogICAgICAgICAgICAoIuKEue+4jyBBYm91dCIsIHNlbGYuc2hvd19hYm91dCksCiAgICAgICAgICAgICgi8J+aqiBFeGl0Iiwgc2VsZi5leGl0X2FwcCkKICAgICAgICBdCiAgICAgICAgZm9yIGksICh0ZXh0LCBjb21tYW5kKSBpbiBlbnVtZXJhdGUoYnV0dG9ucyk6CiAgICAgICAgICAgIHJvdyA9IGkgLy8gMgogICAgICAgICAgICBjb2wgPSBpICUgMgogICAgICAgICAgICBidG4gPSB0dGsuQnV0dG9uKGJ1dHRvbl9mcmFtZSwgdGV4dD10ZXh0LCBjb21tYW5kPWNvbW1hbmQsIHdpZHRoPTI4KQogICAgICAgICAgICBidG4uZ3JpZChyb3c9cm93LCBjb2x1bW49Y29sLCBwYWR4PTEwLCBwYWR5PTgsIHN0aWNreT0iZXciKQogICAgICAgIGJ1dHRvbl9mcmFtZS5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCiAgICAgICAgYnV0dG9uX2ZyYW1lLmNvbHVtbmNvbmZpZ3VyZSgxLCB3ZWlnaHQ9MSkKICAgICAgICBzZWxmLnN0YXR1c192YXIgPSB0ay5TdHJpbmdWYXIoKQogICAgICAgIHNlbGYuc3RhdHVzX3Zhci5zZXQoIlJlYWR5IikKICAgICAgICBzdGF0dXNfYmFyID0gdHRrLkxhYmVsKHJvb3QsIHRleHR2YXJpYWJsZT1zZWxmLnN0YXR1c192YXIsIHJlbGllZj10ay5TVU5LRU4sIGFuY2hvcj10ay5XKQogICAgICAgIHN0YXR1c19iYXIucGFjayhzaWRlPXRrLkJPVFRPTSwgZmlsbD10ay5YKQogICAgICAgIHNlbGYucHJvZ3Jlc3NfdmFyID0gdGsuSW50VmFyKCkKICAgICAgICBzZWxmLnByb2dyZXNzX2JhciA9IHR0ay5Qcm9ncmVzc2Jhcihyb290LCB2YXJpYWJsZT1zZWxmLnByb2dyZXNzX3ZhciwgbWF4aW11bT0xMDApCiAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIucGFjayhzaWRlPXRrLkJPVFRPTSwgZmlsbD10ay5YKQogICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnBhY2tfZm9yZ2V0KCkKICAgIGRlZiB1cGRhdGVfc3RhdHVzKHNlbGYsIG1lc3NhZ2UpOgogICAgICAgIHNlbGYuc3RhdHVzX3Zhci5zZXQobWVzc2FnZSkKICAgICAgICBzZWxmLnJvb3QudXBkYXRlX2lkbGV0YXNrcygpCiAgICBkZWYgc2hvd19wcm9ncmVzcyhzZWxmLCBzaG93PVRydWUsIHZhbHVlPTApOgogICAgICAgIGlmIHNob3c6CiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnBhY2soc2lkZT10ay5CT1RUT00sIGZpbGw9dGsuWCkKICAgICAgICAgICAgc2VsZi5wcm9ncmVzc192YXIuc2V0KHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnBhY2tfZm9yZ2V0KCkKICAgICAgICBzZWxmLnJvb3QudXBkYXRlX2lkbGV0YXNrcygpCiAgICBkZWYgcnVuX2luX3RocmVhZChzZWxmLCBmdW5jLCAqYXJncyk6CiAgICAgICAgZGVmIHdyYXBwZXIoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfc3RhdHVzKCJSdW5uaW5nLi4uIikKICAgICAgICAgICAgICAgIHNlbGYuc2hvd19wcm9ncmVzcyhUcnVlLCAwKQogICAgICAgICAgICAgICAgZnVuYygqYXJncykKICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX3N0YXR1cygiUmVhZHkiKQogICAgICAgICAgICAgICAgc2VsZi5zaG93X3Byb2dyZXNzKEZhbHNlKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9zdGF0dXMoIkVycm9yIikKICAgICAgICAgICAgICAgIHNlbGYuc2hvd19wcm9ncmVzcyhGYWxzZSkKICAgICAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsIHN0cihlKSkKICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD13cmFwcGVyKQogICAgICAgIHRocmVhZC5kYWVtb24gPSBUcnVlCiAgICAgICAgdGhyZWFkLnN0YXJ0KCkKICAgIGRlZiBnZXRfaW5wdXQoc2VsZiwgdGl0bGUsIHByb21wdCwgZGVmYXVsdD0iIik6CiAgICAgICAgZGlhbG9nID0gdGsuVG9wbGV2ZWwoc2VsZi5yb290KQogICAgICAgIGRpYWxvZy50aXRsZSh0aXRsZSkKICAgICAgICBkaWFsb2cuZ2VvbWV0cnkoIjQ1MHgxODAiKQogICAgICAgIGRpYWxvZy50cmFuc2llbnQoc2VsZi5yb290KQogICAgICAgIGRpYWxvZy5ncmFiX3NldCgpCiAgICAgICAgcmVzdWx0ID0gdGsuU3RyaW5nVmFyKHZhbHVlPWRlZmF1bHQpCiAgICAgICAgdHRrLkxhYmVsKGRpYWxvZywgdGV4dD1wcm9tcHQsIGZvbnQ9KCdBcmlhbCcsIDEwKSkucGFjayhwYWR5PTE1KQogICAgICAgIGVudHJ5ID0gdHRrLkVudHJ5KGRpYWxvZywgdGV4dHZhcmlhYmxlPXJlc3VsdCwgd2lkdGg9NTAsIGZvbnQ9KCdBcmlhbCcsIDEwKSkKICAgICAgICBlbnRyeS5wYWNrKHBhZHk9MTAsIHBhZHg9MjAsIGZpbGw9dGsuWCkKICAgICAgICBlbnRyeS5mb2N1cygpCiAgICAgICAgZW50cnkuc2VsZWN0X3JhbmdlKDAsIHRrLkVORCkKICAgICAgICBkZWYgb25fb2soKToKICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQogICAgICAgIGRlZiBvbl9jYW5jZWwoKToKICAgICAgICAgICAgcmVzdWx0LnNldCgiIikKICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQogICAgICAgIGJ0bl9mcmFtZSA9IHR0ay5GcmFtZShkaWFsb2cpCiAgICAgICAgYnRuX2ZyYW1lLnBhY2socGFkeT0xNSkKICAgICAgICB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0iT0siLCBjb21tYW5kPW9uX29rLCB3aWR0aD0xMCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICAgICAgdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IkNhbmNlbCIsIGNvbW1hbmQ9b25fY2FuY2VsLCB3aWR0aD0xMCkucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICAgICAgZGlhbG9nLmJpbmQoJzxSZXR1cm4+JywgbGFtYmRhIGU6IG9uX29rKCkpCiAgICAgICAgZGlhbG9nLmJpbmQoJzxFc2NhcGU+JywgbGFtYmRhIGU6IG9uX2NhbmNlbCgpKQogICAgICAgIGRpYWxvZy53YWl0X3dpbmRvdygpCiAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXQoKQogICAgZGVmIHNlbGVjdF9vcyhzZWxmKToKICAgICAgICBkaWFsb2cgPSB0ay5Ub3BsZXZlbChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLnRpdGxlKCJTZWxlY3QgT1MgVHlwZSIpCiAgICAgICAgZGlhbG9nLmdlb21ldHJ5KCIzMDB4MjAwIikKICAgICAgICBkaWFsb2cudHJhbnNpZW50KHNlbGYucm9vdCkKICAgICAgICBkaWFsb2cuZ3JhYl9zZXQoKQogICAgICAgIHJlc3VsdCA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0iZGViaWFuIikKICAgICAgICB0dGsuTGFiZWwoZGlhbG9nLCB0ZXh0PSJTZWxlY3QgT3BlcmF0aW5nIFN5c3RlbToiLCBmb250PSgnQXJpYWwnLCAxMSwgJ2JvbGQnKSkucGFjayhwYWR5PTIwKQogICAgICAgIHR0ay5SYWRpb2J1dHRvbihkaWFsb2csIHRleHQ9IkRlYmlhbiAoTGludXgpIiwgdmFyaWFibGU9cmVzdWx0LCB2YWx1ZT0iZGViaWFuIikucGFjayhwYWR5PTUpCiAgICAgICAgdHRrLlJhZGlvYnV0dG9uKGRpYWxvZywgdGV4dD0iVGVybXV4IChBbmRyb2lkKSIsIHZhcmlhYmxlPXJlc3VsdCwgdmFsdWU9InRlcm11eCIpLnBhY2socGFkeT01KQogICAgICAgIGRlZiBvbl9vaygpOgogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgdHRrLkJ1dHRvbihkaWFsb2csIHRleHQ9Ik9LIiwgY29tbWFuZD1vbl9vaywgd2lkdGg9MTApLnBhY2socGFkeT0yMCkKICAgICAgICBkaWFsb2cud2FpdF93aW5kb3coKQogICAgICAgIHJldHVybiByZXN1bHQuZ2V0KCkKICAgIGRlZiBzZWxlY3RfcGFja2FnZShzZWxmLCBwYWNrYWdlcywgdGl0bGU9IlNlbGVjdCBQYWNrYWdlIik6CiAgICAgICAgaWYgbm90IHBhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGRpYWxvZyA9IHRrLlRvcGxldmVsKHNlbGYucm9vdCkKICAgICAgICBkaWFsb2cudGl0bGUodGl0bGUpCiAgICAgICAgZGlhbG9nLmdlb21ldHJ5KCI1MDB4NDAwIikKICAgICAgICBkaWFsb2cudHJhbnNpZW50KHNlbGYucm9vdCkKICAgICAgICBkaWFsb2cuZ3JhYl9zZXQoKQogICAgICAgIHJlc3VsdCA9IHRrLlN0cmluZ1ZhcigpCiAgICAgICAgdHRrLkxhYmVsKGRpYWxvZywgdGV4dD10aXRsZSwgZm9udD0oJ0FyaWFsJywgMTEsICdib2xkJykpLnBhY2socGFkeT0xMCkKICAgICAgICBmcmFtZSA9IHR0ay5GcmFtZShkaWFsb2cpCiAgICAgICAgZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlLCBwYWR4PTIwLCBwYWR5PTEwKQogICAgICAgIHNjcm9sbGJhciA9IHR0ay5TY3JvbGxiYXIoZnJhbWUpCiAgICAgICAgc2Nyb2xsYmFyLnBhY2soc2lkZT10ay5SSUdIVCwgZmlsbD10ay5ZKQogICAgICAgIGxpc3Rib3ggPSB0ay5MaXN0Ym94KGZyYW1lLCB5c2Nyb2xsY29tbWFuZD1zY3JvbGxiYXIuc2V0LCBmb250PSgnQXJpYWwnLCAxMCkpCiAgICAgICAgbGlzdGJveC5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUpCiAgICAgICAgc2Nyb2xsYmFyLmNvbmZpZyhjb21tYW5kPWxpc3Rib3gueXZpZXcpCiAgICAgICAgZm9yIGksIHBrZyBpbiBlbnVtZXJhdGUocGFja2FnZXMsIDEpOgogICAgICAgICAgICBsaXN0Ym94Lmluc2VydCh0ay5FTkQsIGYie2l9LiB7cGtnfSIpCiAgICAgICAgZGVmIG9uX3NlbGVjdCgpOgogICAgICAgICAgICBzZWxlY3Rpb24gPSBsaXN0Ym94LmN1cnNlbGVjdGlvbigpCiAgICAgICAgICAgIGlmIHNlbGVjdGlvbjoKICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQocGFja2FnZXNbc2VsZWN0aW9uWzBdXSkKICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQogICAgICAgIGRlZiBvbl9kb3VibGVfY2xpY2soZXZlbnQpOgogICAgICAgICAgICBvbl9zZWxlY3QoKQogICAgICAgIGxpc3Rib3guYmluZCgnPERvdWJsZS1CdXR0b24tMT4nLCBvbl9kb3VibGVfY2xpY2spCiAgICAgICAgYnRuX2ZyYW1lID0gdHRrLkZyYW1lKGRpYWxvZykKICAgICAgICBidG5fZnJhbWUucGFjayhwYWR5PTEwKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJTZWxlY3QiLCBjb21tYW5kPW9uX3NlbGVjdCwgd2lkdGg9MTIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJDYW5jZWwiLCBjb21tYW5kPWRpYWxvZy5kZXN0cm95LCB3aWR0aD0xMikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICAgICAgZGlhbG9nLndhaXRfd2luZG93KCkKICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgpCgogICAgZGVmIHNlbGVjdF9tdWx0aXBsZShzZWxmLCBpdGVtcywgdGl0bGU9IlNlbGVjdCBJdGVtKHMpIik6CiAgICAgICAgaWYgbm90IGl0ZW1zOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBkaWFsb2cgPSB0ay5Ub3BsZXZlbChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLnRpdGxlKHRpdGxlKQogICAgICAgIGRpYWxvZy5nZW9tZXRyeSgiNjAweDUwMCIpCiAgICAgICAgZGlhbG9nLnRyYW5zaWVudChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLmdyYWJfc2V0KCkKICAgICAgICB0dGsuTGFiZWwoZGlhbG9nLCB0ZXh0PXRpdGxlLCBmb250PSgnQXJpYWwnLCAxMSwgJ2JvbGQnKSkucGFjayhwYWR5PTEwKQogICAgICAgIGZyYW1lID0gdHRrLkZyYW1lKGRpYWxvZykKICAgICAgICBmcmFtZS5wYWNrKGZpbGw9dGsuQk9USCwgZXhwYW5kPVRydWUsIHBhZHg9MjAsIHBhZHk9MTApCiAgICAgICAgc2Nyb2xsYmFyID0gdHRrLlNjcm9sbGJhcihmcmFtZSkKICAgICAgICBzY3JvbGxiYXIucGFjayhzaWRlPXRrLlJJR0hULCBmaWxsPXRrLlkpCiAgICAgICAgbGlzdGJveCA9IHRrLkxpc3Rib3goZnJhbWUsIHlzY3JvbGxjb21tYW5kPXNjcm9sbGJhci5zZXQsIGZvbnQ9KCdBcmlhbCcsIDEwKSwgc2VsZWN0bW9kZT10ay5NVUxUSVBMRSkKICAgICAgICBsaXN0Ym94LnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSkKICAgICAgICBzY3JvbGxiYXIuY29uZmlnKGNvbW1hbmQ9bGlzdGJveC55dmlldykKICAgICAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUoaXRlbXMsIDEpOgogICAgICAgICAgICBsaXN0Ym94Lmluc2VydCh0ay5FTkQsIGYie2l9LiB7aXRlbX0iKQogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgZGVmIG9uX3NlbGVjdCgpOgogICAgICAgICAgICBzZWxlY3Rpb25zID0gbGlzdGJveC5jdXJzZWxlY3Rpb24oKQogICAgICAgICAgICBmb3IgaWR4IGluIHNlbGVjdGlvbnM6CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW1zW2lkeF0pCiAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKICAgICAgICBkZWYgb25fY2FuY2VsKCk6CiAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKICAgICAgICBidG5fZnJhbWUgPSB0dGsuRnJhbWUoZGlhbG9nKQogICAgICAgIGJ0bl9mcmFtZS5wYWNrKHBhZHk9MTApCiAgICAgICAgdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IlNlbGVjdCIsIGNvbW1hbmQ9b25fc2VsZWN0LCB3aWR0aD0xMikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICAgICAgdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IkNhbmNlbCIsIGNvbW1hbmQ9b25fY2FuY2VsLCB3aWR0aD0xMikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICAgICAgZGlhbG9nLndhaXRfd2luZG93KCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGJ1aWxkX3NvdXJjZV9ndWkoc2VsZik6CiAgICAgICAgIiIiQnVpbGQgc291cmNlIHBhY2thZ2UgZGVuZ2FuIGZvcm0gd2luZG93IHNlcGVydGkgY29uZmlndXJlIHJlcG8iIiIKICAgICAgICBkaWFsb2cgPSB0ay5Ub3BsZXZlbChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLnRpdGxlKCJDcmVhdGUgU291cmNlIFBhY2thZ2UiKQogICAgICAgIGRpYWxvZy5nZW9tZXRyeSgiNTAweDYwMCIpCiAgICAgICAgZGlhbG9nLnRyYW5zaWVudChzZWxmLnJvb3QpCiAgICAgICAgZGlhbG9nLmdyYWJfc2V0KCkKICAgICAgICB0dGsuTGFiZWwoZGlhbG9nLCB0ZXh0PSJDcmVhdGUgU291cmNlIFBhY2thZ2UiLCBmb250PSgnQXJpYWwnLCAxNCwgJ2JvbGQnKSkucGFjayhwYWR5PTE1KQogICAgICAgIGZyYW1lID0gdHRrLkZyYW1lKGRpYWxvZywgcGFkZGluZz0iMjAiKQogICAgICAgIGZyYW1lLnBhY2soZmlsbD10ay5CT1RILCBleHBhbmQ9VHJ1ZSkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9Ik9TIFR5cGU6IikuZ3JpZChyb3c9MCwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgb3NfdmFyID0gdGsuU3RyaW5nVmFyKHZhbHVlPSJkZWJpYW4iKQogICAgICAgIG9zX2ZyYW1lID0gdHRrLkZyYW1lKGZyYW1lKQogICAgICAgIG9zX2ZyYW1lLmdyaWQocm93PTAsIGNvbHVtbj0xLCBzdGlja3k9dGsuVywgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5SYWRpb2J1dHRvbihvc19mcmFtZSwgdGV4dD0iRGViaWFuIChMaW51eCkiLCB2YXJpYWJsZT1vc192YXIsIHZhbHVlPSJkZWJpYW4iKS5wYWNrKHNpZGU9dGsuTEVGVCkKICAgICAgICB0dGsuUmFkaW9idXR0b24ob3NfZnJhbWUsIHRleHQ9IlRlcm11eCAoQW5kcm9pZCkiLCB2YXJpYWJsZT1vc192YXIsIHZhbHVlPSJ0ZXJtdXgiKS5wYWNrKHNpZGU9dGsuTEVGVCwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IkFyY2hpdGVjdHVyZToiKS5ncmlkKHJvdz0xLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBhcmNoX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0iYWxsIikKICAgICAgICBkZWYgdXBkYXRlX2FyY2hfbGlzdCgqYXJncyk6CiAgICAgICAgICAgIGlmIG9zX3Zhci5nZXQoKSA9PSAiZGViaWFuIjoKICAgICAgICAgICAgICAgIGFyY2hfdmFsdWVzID0gWyJhbGwiLCAiYW1kNjQiLCAiYXJtNjQiLCAiYXJtaGYiLCAiaTM4NiJdCiAgICAgICAgICAgICAgICBhcmNoX3Zhci5zZXQoImFsbCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmNoX3ZhbHVlcyA9IFsiYWxsIiwgImFhcmNoNjQiLCAiYXJtIiwgImk2ODYiLCAieDg2XzY0Il0KICAgICAgICAgICAgICAgIGFyY2hfdmFyLnNldCgiYWxsIikKICAgICAgICAgICAgYXJjaF9jb21ib1sndmFsdWVzJ10gPSBhcmNoX3ZhbHVlcwogICAgICAgIGFyY2hfY29tYm8gPSB0dGsuQ29tYm9ib3goZnJhbWUsIHRleHR2YXJpYWJsZT1hcmNoX3ZhciwgdmFsdWVzPVsiYWxsIiwgImFtZDY0IiwgImFybTY0IiwgImFybWhmIiwgImkzODYiXSwgd2lkdGg9MjcpCiAgICAgICAgYXJjaF9jb21iby5ncmlkKHJvdz0xLCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIGFyY2hfY29tYm8uc3RhdGUoWydyZWFkb25seSddKQogICAgICAgIG9zX3Zhci50cmFjZV9hZGQoJ3dyaXRlJywgdXBkYXRlX2FyY2hfbGlzdCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IlBhY2thZ2UgTmFtZToiKS5ncmlkKHJvdz0yLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBwa2duYW1lX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0ibXl0b29scyIpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9cGtnbmFtZV92YXIsIHdpZHRoPTMwKS5ncmlkKHJvdz0yLCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iVmVyc2lvbjoiKS5ncmlkKHJvdz0zLCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICB2ZXJzaW9uX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0iMS4wLjAiKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPXZlcnNpb25fdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9MywgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IkRlcGVuZHM6IikuZ3JpZChyb3c9NCwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgZGVwZW5kc192YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9IiIpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9ZGVwZW5kc192YXIsIHdpZHRoPTMwKS5ncmlkKHJvdz00LCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iRGVzY3JpcHRpb246IikuZ3JpZChyb3c9NSwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgZGVzY192YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9IkEgZ3JlYXQgdG9vbCIpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9ZGVzY192YXIsIHdpZHRoPTMwKS5ncmlkKHJvdz01LCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iTWFpbnRhaW5lcjoiKS5ncmlkKHJvdz02LCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICB1c2VybmFtZV92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9b3MuZW52aXJvbi5nZXQoJ1VTRVInLCAndXNlcicpKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPXVzZXJuYW1lX3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTYsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJFbWFpbDoiKS5ncmlkKHJvdz03LCBjb2x1bW49MCwgc3RpY2t5PXRrLlcsIHBhZHk9NSkKICAgICAgICBlbWFpbF92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9ZiJ7b3MuZW52aXJvbi5nZXQoJ1VTRVInLCAndXNlcicpfUBleGFtcGxlLmNvbSIpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9ZW1haWxfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9NywgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IkhvbWVwYWdlOiIpLmdyaWQocm93PTgsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIGhvbWVwYWdlX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT0iaHR0cHM6Ly9leGFtcGxlLmNvbSIpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9aG9tZXBhZ2VfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9OCwgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICBwcm9ncmVzc192YXIgPSB0ay5JbnRWYXIoKQogICAgICAgIHByb2dyZXNzX2JhciA9IHR0ay5Qcm9ncmVzc2JhcihkaWFsb2csIHZhcmlhYmxlPXByb2dyZXNzX3ZhciwgbWF4aW11bT0xMDApCiAgICAgICAgcHJvZ3Jlc3NfYmFyLnBhY2soc2lkZT10ay5CT1RUT00sIGZpbGw9dGsuWCwgcGFkeD0yMCwgcGFkeT0xMCkKICAgICAgICBwcm9ncmVzc19iYXIucGFja19mb3JnZXQoKQogICAgICAgIGRlZiB1cGRhdGVfcHJvZ3Jlc3ModmFsdWUpOgogICAgICAgICAgICBwcm9ncmVzc192YXIuc2V0KHZhbHVlKQogICAgICAgICAgICBkaWFsb2cudXBkYXRlX2lkbGV0YXNrcygpCiAgICAgICAgZGVmIGRvX2J1aWxkKCk6CiAgICAgICAgICAgIHNhdmVfYnRuLmNvbmZpZyhzdGF0ZT10ay5ESVNBQkxFRCkKICAgICAgICAgICAgY2FuY2VsX2J0bi5jb25maWcoc3RhdGU9dGsuRElTQUJMRUQpCiAgICAgICAgICAgIHByb2dyZXNzX2Jhci5wYWNrKHNpZGU9dGsuQk9UVE9NLCBmaWxsPXRrLlgsIHBhZHg9MjAsIHBhZHk9MTApCiAgICAgICAgICAgIHVwZGF0ZV9wcm9ncmVzcygxMCkKICAgICAgICAgICAgb3NfdHlwZSA9IG9zX3Zhci5nZXQoKQogICAgICAgICAgICBwa2duYW1lID0gcGtnbmFtZV92YXIuZ2V0KCkKICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25fdmFyLmdldCgpCiAgICAgICAgICAgIGFyY2ggPSBhcmNoX3Zhci5nZXQoKQogICAgICAgICAgICBkZXBlbmRzID0gZGVwZW5kc192YXIuZ2V0KCkKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjX3Zhci5nZXQoKQogICAgICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lX3Zhci5nZXQoKQogICAgICAgICAgICBlbWFpbCA9IGVtYWlsX3Zhci5nZXQoKQogICAgICAgICAgICBob21lcGFnZSA9IGhvbWVwYWdlX3Zhci5nZXQoKQogICAgICAgICAgICBpZiBub3QgcGtnbmFtZSBvciBub3QgdmVyc2lvbjoKICAgICAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsICJQYWNrYWdlIE5hbWUgYW5kIFZlcnNpb24gYXJlIHJlcXVpcmVkISIpCiAgICAgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgdXBkYXRlX3Byb2dyZXNzKDMwKQogICAgICAgICAgICBkZWYgcnVuX2J1aWxkKCk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcywgcmVzdWx0ID0gYnVpbGRfc291cmNlX2NvcmUob3NfdHlwZSwgcGtnbmFtZSwgdmVyc2lvbiwgYXJjaCwgZGVwZW5kcywgZGVzY3JpcHRpb24sIHVzZXJuYW1lLCBlbWFpbCwgaG9tZXBhZ2UpCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmFmdGVyKDAsIGxhbWJkYTogdXBkYXRlX3Byb2dyZXNzKDEwMCkpCiAgICAgICAgICAgICAgICAgICAgaWYgc3VjY2VzczoKICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmFmdGVyKDAsIGxhbWJkYTogbWVzc2FnZWJveC5zaG93aW5mbygiU3VjY2VzcyIsIGYiU291cmNlIHBhY2thZ2UgY3JlYXRlZCFcbkxvY2F0aW9uOiB7cmVzdWx0fSIpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5hZnRlcigwLCBsYW1iZGE6IG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsIHJlc3VsdCkpCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmFmdGVyKDAsIGRpYWxvZy5kZXN0cm95KQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5hZnRlcigwLCBsYW1iZGE6IG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsIHN0cihlKSkpCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmFmdGVyKDAsIGRpYWxvZy5kZXN0cm95KQogICAgICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW5fYnVpbGQpCiAgICAgICAgICAgIHRocmVhZC5kYWVtb24gPSBUcnVlCiAgICAgICAgICAgIHRocmVhZC5zdGFydCgpCiAgICAgICAgZGVmIG9uX2NhbmNlbCgpOgogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgYnRuX2ZyYW1lID0gdHRrLkZyYW1lKGRpYWxvZykKICAgICAgICBidG5fZnJhbWUucGFjayhwYWR5PTIwKQogICAgICAgIHNhdmVfYnRuID0gdHRrLkJ1dHRvbihidG5fZnJhbWUsIHRleHQ9IkNyZWF0ZSIsIGNvbW1hbmQ9ZG9fYnVpbGQsIHdpZHRoPTEyKQogICAgICAgIHNhdmVfYnRuLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIGNhbmNlbF9idG4gPSB0dGsuQnV0dG9uKGJ0bl9mcmFtZSwgdGV4dD0iQ2FuY2VsIiwgY29tbWFuZD1vbl9jYW5jZWwsIHdpZHRoPTEyKQogICAgICAgIGNhbmNlbF9idG4ucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICAgICAgZGlhbG9nLmJpbmQoJzxSZXR1cm4+JywgbGFtYmRhIGU6IGRvX2J1aWxkKCkpCiAgICAgICAgZGlhbG9nLmJpbmQoJzxFc2NhcGU+JywgbGFtYmRhIGU6IG9uX2NhbmNlbCgpKQoKICAgIGRlZiBidWlsZF9kZWJfZ3VpKHNlbGYpOgogICAgICAgIG9zX3R5cGUgPSBzZWxmLnNlbGVjdF9vcygpCiAgICAgICAgaWYgbm90IG9zX3R5cGU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNvdXJjZV9kaXIgPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCBvc190eXBlKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2VfZGlyKToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIkVycm9yIiwgZiJTb3VyY2UgZGlyZWN0b3J5IG5vdCBmb3VuZDoge3NvdXJjZV9kaXJ9IikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGFja2FnZXMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHNvdXJjZV9kaXIpIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGQpKV0KICAgICAgICBwYWNrYWdlcy5zb3J0KCkKICAgICAgICBpZiBub3QgcGFja2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsICJObyBzb3VyY2UgcGFja2FnZXMgZm91bmQiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxlY3RlZCA9IHNlbGYuc2VsZWN0X211bHRpcGxlKHBhY2thZ2VzLCAiU2VsZWN0IFBhY2thZ2UocykgdG8gQnVpbGQgKEN0cmwrQ2xpY2sgZm9yIG11bHRpcGxlKSIpCiAgICAgICAgaWYgbm90IHNlbGVjdGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBjb25maWcgPSBsb2FkX3JlcG9fY29uZmlnKCkKICAgICAgICBjb21wb25lbnQgPSBzZWxmLmdldF9pbnB1dCgiQ29tcG9uZW50IiwgIkNvbXBvbmVudCBmb2xkZXI6IiwgY29uZmlnLmdldCgnQ09NUE9ORU5UJywgJ21haW4nKSkKICAgICAgICBzZWxmLnJ1bl9pbl90aHJlYWQoc2VsZi5fYnVpbGRfZGViX211bHRpLCBvc190eXBlLCBzZWxlY3RlZCwgY29tcG9uZW50KQoKICAgIGRlZiBfYnVpbGRfZGViX211bHRpKHNlbGYsIG9zX3R5cGUsIHBhY2thZ2VfbmFtZXMsIGNvbXBvbmVudCk6CiAgICAgICAgdG90YWwgPSBsZW4ocGFja2FnZV9uYW1lcykKICAgICAgICBzdWNjZXNzX2NvdW50ID0gMAogICAgICAgIGZvciBpZHgsIHBrZyBpbiBlbnVtZXJhdGUocGFja2FnZV9uYW1lcyk6CiAgICAgICAgICAgIHNlbGYudXBkYXRlX3N0YXR1cyhmIkJ1aWxkaW5nIHtpZHgrMX0ve3RvdGFsfToge3BrZ30iKQogICAgICAgICAgICBzZWxmLnNob3dfcHJvZ3Jlc3MoVHJ1ZSwgaW50KChpZHgrMSkvdG90YWwqMTAwKSkKICAgICAgICAgICAgc3VjY2VzcywgXyA9IGJ1aWxkX2RlYl9jb3JlKG9zX3R5cGUsIHBrZywgY29tcG9uZW50KQogICAgICAgICAgICBpZiBzdWNjZXNzOgogICAgICAgICAgICAgICAgc3VjY2Vzc19jb3VudCArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtZXNzYWdlYm94LnNob3dlcnJvcigiRXJyb3IiLCBmIkZhaWxlZCB0byBidWlsZCB7cGtnfSIpCiAgICAgICAgc2VsZi5zaG93X3Byb2dyZXNzKEZhbHNlKQogICAgICAgIHNlbGYudXBkYXRlX3N0YXR1cygiUmVhZHkiKQogICAgICAgIG1lc3NhZ2Vib3guc2hvd2luZm8oIlJlc3VsdCIsIGYiQnVpbHQge3N1Y2Nlc3NfY291bnR9L3t0b3RhbH0gcGFja2FnZXMgc3VjY2Vzc2Z1bGx5LiIpCgogICAgZGVmIHVwZGF0ZV9zb3VyY2VfZ3VpKHNlbGYpOgogICAgICAgIG9zX3R5cGUgPSBzZWxmLnNlbGVjdF9vcygpCiAgICAgICAgaWYgbm90IG9zX3R5cGU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNvdXJjZV9kaXIgPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCBvc190eXBlKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2VfZGlyKToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIkVycm9yIiwgZiJTb3VyY2UgZGlyZWN0b3J5IG5vdCBmb3VuZDoge3NvdXJjZV9kaXJ9IikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgcGFja2FnZXMgPSBbZCBmb3IgZCBpbiBvcy5saXN0ZGlyKHNvdXJjZV9kaXIpIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGQpKV0KICAgICAgICBwYWNrYWdlcy5zb3J0KCkKICAgICAgICBpZiBub3QgcGFja2FnZXM6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2Vycm9yKCJFcnJvciIsICJObyBzb3VyY2UgcGFja2FnZXMgZm91bmQiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxlY3RlZCA9IHNlbGYuc2VsZWN0X3BhY2thZ2UocGFja2FnZXMsICJTZWxlY3QgUGFja2FnZSB0byBVcGRhdGUiKQogICAgICAgIGlmIG5vdCBzZWxlY3RlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29udHJvbF9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIHNlbGVjdGVkLCAiREVCSUFOIiwgImNvbnRyb2wiKQogICAgICAgIHdpdGggb3Blbihjb250cm9sX3BhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgY3VycmVudF92ZXJzaW9uID0gcmUuc2VhcmNoKHInVmVyc2lvbjogKC4qKScsIGNvbnRlbnQpLmdyb3VwKDEpCiAgICAgICAgc3VnZ2VzdGVkID0gYXV0b19pbmNyZW1lbnRfdmVyc2lvbihjdXJyZW50X3ZlcnNpb24pCiAgICAgICAgbmV3X3ZlcnNpb24gPSBzZWxmLmdldF9pbnB1dCgiTmV3IFZlcnNpb24iLCAiRW50ZXIgbmV3IHZlcnNpb246Iiwgc3VnZ2VzdGVkKQogICAgICAgIGlmIG5vdCBuZXdfdmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYWN0aW9uID0gInJlbmFtZSIgaWYgbWVzc2FnZWJveC5hc2t5ZXNubygiVXBkYXRlIE9wdGlvbiIsICJSZW5hbWUgc291cmNlIGZvbGRlciAodXBkYXRlIGluIHBsYWNlKT8iKSBlbHNlICJjb3B5IgogICAgICAgIHNlbGYucnVuX2luX3RocmVhZChzZWxmLl91cGRhdGVfc291cmNlLCBvc190eXBlLCBzZWxlY3RlZCwgbmV3X3ZlcnNpb24sIGFjdGlvbikKICAgIGRlZiBfdXBkYXRlX3NvdXJjZShzZWxmLCBvc190eXBlLCBzZWxlY3RlZCwgbmV3X3ZlcnNpb24sIGFjdGlvbik6CiAgICAgICAgc3VjY2VzcywgcmVzdWx0ID0gdXBkYXRlX3NvdXJjZV9jb3JlKG9zX3R5cGUsIHNlbGVjdGVkLCBuZXdfdmVyc2lvbiwgYWN0aW9uKQogICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgICAgIG1lc3NhZ2Vib3guc2hvd2luZm8oIlN1Y2Nlc3MiLCBmIlBhY2thZ2UgdXBkYXRlZCFcbkxvY2F0aW9uOiB7cmVzdWx0fSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIkVycm9yIiwgcmVzdWx0KQoKICAgIGRlZiBlZGl0X2RlYl9ndWkoc2VsZik6CiAgICAgICAgZGViX2ZpbGVzID0gZ2xvYi5nbG9iKCIqLmRlYiIpCiAgICAgICAgZGViX2ZpbGVzICs9IGdsb2IuZ2xvYigiKi8qLmRlYiIpCiAgICAgICAgZGViX2ZpbGVzID0gbGlzdChzZXQoZGViX2ZpbGVzKSkKICAgICAgICBkZWJfZmlsZXMuc29ydCgpCiAgICAgICAgaWYgbm90IGRlYl9maWxlczoKICAgICAgICAgICAgbWVzc2FnZWJveC5zaG93ZXJyb3IoIkVycm9yIiwgIk5vIC5kZWIgZmlsZXMgZm91bmQiKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxlY3RlZCA9IHNlbGYuc2VsZWN0X211bHRpcGxlKGRlYl9maWxlcywgIlNlbGVjdCBERUIgRmlsZShzKSB0byBFeHRyYWN0IikKICAgICAgICBpZiBub3Qgc2VsZWN0ZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIG9zX3R5cGUgPSBzZWxmLnNlbGVjdF9vcygpCiAgICAgICAgaWYgbm90IG9zX3R5cGU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG9zX3R5cGUgPT0gInRlcm11eCI6CiAgICAgICAgICAgIGJhc2VfdGFyZ2V0ID0gVEVSTVVYX1BBVEgKICAgICAgICBlbHNlOgogICAgICAgICAgICBiYXNlX3RhcmdldCA9IERFQklBTl9QQVRICiAgICAgICAgY3JlYXRlX2RpcmVjdG9yeShiYXNlX3RhcmdldCkKICAgICAgICBzZWxmLnJ1bl9pbl90aHJlYWQoc2VsZi5fZWRpdF9kZWJfbXVsdGksIHNlbGVjdGVkLCBiYXNlX3RhcmdldCkKCiAgICBkZWYgX2VkaXRfZGViX211bHRpKHNlbGYsIGRlYl9maWxlcywgYmFzZV90YXJnZXQpOgogICAgICAgIG9yaWdpbmFsX2RpciA9IG9zLmdldGN3ZCgpCiAgICAgICAgdG90YWwgPSBsZW4oZGViX2ZpbGVzKQogICAgICAgIGZvciBpZHgsIGRlYiBpbiBlbnVtZXJhdGUoZGViX2ZpbGVzKToKICAgICAgICAgICAgc2VsZi51cGRhdGVfc3RhdHVzKGYiRXh0cmFjdGluZyB7aWR4KzF9L3t0b3RhbH06IHtvcy5wYXRoLmJhc2VuYW1lKGRlYil9IikKICAgICAgICAgICAgc2VsZi5zaG93X3Byb2dyZXNzKFRydWUsIGludCgoaWR4KzEpL3RvdGFsKjEwMCkpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGFic19kZWIgPSBvcy5wYXRoLmFic3BhdGgoZGViKQogICAgICAgICAgICAgICAgcHJpbnQoZiJERUJVRzogZGViID0ge2RlYn0iKQogICAgICAgICAgICAgICAgcHJpbnQoZiJERUJVRzogYWJzX2RlYiA9IHthYnNfZGVifSIpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYWJzX2RlYik6CiAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGRlYikKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhiYXNlbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGFic19kZWIgPSBvcy5wYXRoLmFic3BhdGgoYmFzZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGYiREVCVUc6IEZvdW5kIGFzIHthYnNfZGVifSIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRmlsZU5vdEZvdW5kRXJyb3IoZiJGaWxlIG5vdCBmb3VuZDoge2RlYn0iKQogICAgICAgICAgICAgICAgZm9sZGVyX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGRlYikucmVwbGFjZSgnLmRlYicsICcnKQogICAgICAgICAgICAgICAgdGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbihiYXNlX3RhcmdldCwgZm9sZGVyX25hbWUpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXRfZGlyKToKICAgICAgICAgICAgICAgICAgICBjb3VudGVyID0gMQogICAgICAgICAgICAgICAgICAgIHdoaWxlIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihiYXNlX3RhcmdldCwgZiJ7Zm9sZGVyX25hbWV9X3tjb3VudGVyfSIpKToKICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciArPSAxCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbihiYXNlX3RhcmdldCwgZiJ7Zm9sZGVyX25hbWV9X3tjb3VudGVyfSIpCiAgICAgICAgICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KHRhcmdldF9kaXIpCiAgICAgICAgICAgICAgICBvcy5jaGRpcih0YXJnZXRfZGlyKQogICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5ydW4oWydhcicsICd4JywgYWJzX2RlYl0sIGNoZWNrPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkKICAgICAgICAgICAgICAgIGNyZWF0ZV9kaXJlY3RvcnkoIkRFQklBTiIpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygiY29udHJvbC50YXIueHoiKToKICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgWyd0YXInLCAneEp2ZicsICdjb250cm9sLnRhci54eicsICctQycsICdERUJJQU4nXSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLkRFVk5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKCJjb250cm9sLnRhci5neiIpOgogICAgICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKAogICAgICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4enZmJywgJ2NvbnRyb2wudGFyLmd6JywgJy1DJywgJ0RFQklBTiddLAogICAgICAgICAgICAgICAgICAgICAgICBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCJkYXRhLnRhci54eiIpOgogICAgICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MucnVuKAogICAgICAgICAgICAgICAgICAgICAgICBbJ3RhcicsICd4SnZmJywgJ2RhdGEudGFyLnh6J10sCiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5ERVZOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5ERVZOVUxMCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cygiZGF0YS50YXIuZ3oiKToKICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLnJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgWyd0YXInLCAneHp2ZicsICdkYXRhLnRhci5neiddLAogICAgICAgICAgICAgICAgICAgICAgICBjaGVjaz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBjbGVhbnVwIGluIFsnZGF0YS50YXIueHonLCAnZGF0YS50YXIuZ3onLCAnY29udHJvbC50YXIueHonLCAnY29udHJvbC50YXIuZ3onLCAnZGViaWFuLWJpbmFyeSddOgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNsZWFudXApOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoY2xlYW51cCkKICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdpbmFsX2RpcikKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgcHJpbnQoZiJFeHRyYWN0aW9uIHdhcm5pbmcgZm9yIHtkZWJ9OiB7ZX0iKQogICAgICAgICAgICAgICAgb3MuY2hkaXIob3JpZ2luYWxfZGlyKQogICAgICAgIHNlbGYuc2hvd19wcm9ncmVzcyhGYWxzZSkKICAgICAgICBzZWxmLnVwZGF0ZV9zdGF0dXMoIlJlYWR5IikKICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCJTdWNjZXNzIiwgZiJFeHRyYWN0ZWQge3RvdGFsfSBERUIgZmlsZShzKSB0byB7YmFzZV90YXJnZXR9LiIpCgogICAgZGVmIGNvbmZpZ3VyZV9yZXBvX2d1aShzZWxmKToKICAgICAgICBjb25maWcgPSBsb2FkX3JlcG9fY29uZmlnKCkKICAgICAgICBnaXRfdXNlciA9IHN1YnByb2Nlc3MucnVuKFsnZ2l0JywgJ2NvbmZpZycsICd1c2VyLm5hbWUnXSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgdGV4dD1UcnVlKS5zdGRvdXQuc3RyaXAoKQogICAgICAgIGRpYWxvZyA9IHRrLlRvcGxldmVsKHNlbGYucm9vdCkKICAgICAgICBkaWFsb2cudGl0bGUoIlJlcG9zaXRvcnkgQ29uZmlndXJhdGlvbiIpCiAgICAgICAgZGlhbG9nLmdlb21ldHJ5KCI1MDB4NDUwIikKICAgICAgICBkaWFsb2cudHJhbnNpZW50KHNlbGYucm9vdCkKICAgICAgICBkaWFsb2cuZ3JhYl9zZXQoKQogICAgICAgIHR0ay5MYWJlbChkaWFsb2csIHRleHQ9IlJlcG9zaXRvcnkgQ29uZmlndXJhdGlvbiIsIGZvbnQ9KCdBcmlhbCcsIDE0LCAnYm9sZCcpKS5wYWNrKHBhZHk9MTUpCiAgICAgICAgZnJhbWUgPSB0dGsuRnJhbWUoZGlhbG9nLCBwYWRkaW5nPSIyMCIpCiAgICAgICAgZnJhbWUucGFjayhmaWxsPXRrLkJPVEgsIGV4cGFuZD1UcnVlKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iR2l0IFVzZXJuYW1lOiIpLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIHVzZXJuYW1lX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT1naXRfdXNlciBvciBjb25maWcuZ2V0KCdVU0VSTkFNRScsICd1c2VybmFtZScpKQogICAgICAgIHR0ay5FbnRyeShmcmFtZSwgdGV4dHZhcmlhYmxlPXVzZXJuYW1lX3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTAsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJSZXBvc2l0b3J5IE5hbWU6IikuZ3JpZChyb3c9MSwgY29sdW1uPTAsIHN0aWNreT10ay5XLCBwYWR5PTUpCiAgICAgICAgcmVwb192YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9Y29uZmlnLmdldCgnUkVQT1NJVE9SWScsIG9zLnBhdGguYmFzZW5hbWUob3MuZ2V0Y3dkKCkpKSkKICAgICAgICB0dGsuRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT1yZXBvX3Zhciwgd2lkdGg9MzApLmdyaWQocm93PTEsIGNvbHVtbj0xLCBwYWR5PTUsIHBhZHg9MTApCiAgICAgICAgdHRrLkxhYmVsKGZyYW1lLCB0ZXh0PSJPUyBUeXBlOiIpLmdyaWQocm93PTIsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIG9zX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT1jb25maWcuZ2V0KCdPU1RZUEUnLCAnZGViaWFuJykpCiAgICAgICAgdHRrLkVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9b3NfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9MiwgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICB0dGsuTGFiZWwoZnJhbWUsIHRleHQ9IkNvZGVuYW1lOiIpLmdyaWQocm93PTMsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIGNvZGVuYW1lX3ZhciA9IHRrLlN0cmluZ1Zhcih2YWx1ZT1jb25maWcuZ2V0KCdDT0RFTkFNRScsICdzdGFibGUnKSkKICAgICAgICB0dGsuRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT1jb2RlbmFtZV92YXIsIHdpZHRoPTMwKS5ncmlkKHJvdz0zLCBjb2x1bW49MSwgcGFkeT01LCBwYWR4PTEwKQogICAgICAgIHR0ay5MYWJlbChmcmFtZSwgdGV4dD0iQ29tcG9uZW50OiIpLmdyaWQocm93PTQsIGNvbHVtbj0wLCBzdGlja3k9dGsuVywgcGFkeT01KQogICAgICAgIGNvbXBvbmVudF92YXIgPSB0ay5TdHJpbmdWYXIodmFsdWU9Y29uZmlnLmdldCgnQ09NUE9ORU5UJywgJ21haW4nKSkKICAgICAgICB0dGsuRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT1jb21wb25lbnRfdmFyLCB3aWR0aD0zMCkuZ3JpZChyb3c9NCwgY29sdW1uPTEsIHBhZHk9NSwgcGFkeD0xMCkKICAgICAgICBkZWYgc2F2ZV9jb25maWcoKToKICAgICAgICAgICAgY29uZmlnWydVU0VSTkFNRSddID0gdXNlcm5hbWVfdmFyLmdldCgpCiAgICAgICAgICAgIGNvbmZpZ1snUkVQT1NJVE9SWSddID0gcmVwb192YXIuZ2V0KCkKICAgICAgICAgICAgY29uZmlnWydPU1RZUEUnXSA9IG9zX3Zhci5nZXQoKQogICAgICAgICAgICBjb25maWdbJ0NPREVOQU1FJ10gPSBjb2RlbmFtZV92YXIuZ2V0KCkKICAgICAgICAgICAgY29uZmlnWydDT01QT05FTlQnXSA9IGNvbXBvbmVudF92YXIuZ2V0KCkKICAgICAgICAgICAgc2F2ZV9yZXBvX2NvbmZpZyhjb25maWcpCiAgICAgICAgICAgIHJlcG9fdXJsID0gZiJkZWIgaHR0cHM6Ly97Y29uZmlnWydVU0VSTkFNRSddfS5naXRodWIuaW8ve2NvbmZpZ1snUkVQT1NJVE9SWSddfS97Y29uZmlnWydPU1RZUEUnXX0ge2NvbmZpZ1snQ09ERU5BTUUnXX0ge2NvbmZpZ1snQ09NUE9ORU5UJ119IgogICAgICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCJTdWNjZXNzIiwgZiJDb25maWd1cmF0aW9uIHNhdmVkIVxuXG5SZXBvc2l0b3J5IFVSTDpcbntyZXBvX3VybH0iKQogICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCiAgICAgICAgYnRuX2ZyYW1lID0gdHRrLkZyYW1lKGRpYWxvZykKICAgICAgICBidG5fZnJhbWUucGFjayhwYWR5PTIwKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJTYXZlIiwgY29tbWFuZD1zYXZlX2NvbmZpZywgd2lkdGg9MTIpLnBhY2soc2lkZT10ay5MRUZULCBwYWR4PTEwKQogICAgICAgIHR0ay5CdXR0b24oYnRuX2ZyYW1lLCB0ZXh0PSJDYW5jZWwiLCBjb21tYW5kPWRpYWxvZy5kZXN0cm95LCB3aWR0aD0xMikucGFjayhzaWRlPXRrLkxFRlQsIHBhZHg9MTApCiAgICBkZWYgc2hvd19hYm91dChzZWxmKToKICAgICAgICBtZXNzYWdlYm94LnNob3dpbmZvKCJBYm91dCIsICJSZXBvc2l0b3J5IE1hbmFnZXIgTWVudSB2MS4wLjAtU1JcbkJ5OiBBcmllLVNSOTEiKQogICAgZGVmIGV4aXRfYXBwKHNlbGYpOgogICAgICAgIGlmIG1lc3NhZ2Vib3guYXNreWVzbm8oIkV4aXQiLCAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGV4aXQ/Iik6CiAgICAgICAgICAgIHNlbGYucm9vdC5kZXN0cm95KCkKCmRlZiBzaG93X3ZlcnNpb24oKToKICAgIHByaW50KCIxLjAuMC1TUiIpCgpkZWYgc2hvd19oZWxwKCk6CiAgICBoZWxwX3RleHQgPSAiIiIKWytdIFJlcG9zaXRvcnkgTWFuYWdlciBNZW51IGJ5IEFyaWUtU1I5MQpVc2FnZTogcmVwby1tYW5hZ2VyLW1lbnUgW21vZGVdCk1vZGVzOgogICAgLS1kaWFsb2cgICAgOiBSdW4gaW4gRGlhbG9nIG1vZGUKICAgIC0tZ3VpICAgICAgIDogUnVuIGluIEdVSSBtb2RlCk9wdGlvbnM6CiAgICAtdiwgLS12ZXJzaW9uCiAgICAtaCwgLS1oZWxwICA6IFNob3cgdGhpcyBoZWxwIHNjcmVlbgpmb3IgbW9yZSBpbmZvIHZpc2l0OiBodHRwczovL2dpdGh1Yi5jb20vQXJpZVNSOTEvdXNlcjkxLXJlcG8KIiIiCiAgICBwcmludChoZWxwX3RleHQpCgpkZWYgbWFpbigpOgogICAgZW5zdXJlX2RpcmVjdG9yaWVzKCkKICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgogICAgICAgIHNob3dfaGVscCgpCiAgICAgICAgcmV0dXJuCiAgICBvcHRpb24gPSBzeXMuYXJndlsxXQogICAgaWYgb3B0aW9uID09ICctLWRpYWxvZyc6CiAgICAgICAgaWYgRElBTE9HX0FWQUlMQUJMRToKICAgICAgICAgICAgZGlhbG9nX21lbnUgPSBEaWFsb2dNZW51KCkKICAgICAgICAgICAgZGlhbG9nX21lbnUucnVuKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCgiWyFdIHB5dGhvbjMtZGlhbG9nIG5vdCBpbnN0YWxsZWQuIEluc3RhbGwgd2l0aDogc3VkbyBhcHQgaW5zdGFsbCBweXRob24zLWRpYWxvZyIpCiAgICAgICAgICAgIHByaW50KCJbK10gSWYgeW91IHVzaW5nIHRlcm11eCB0cnk6IHBpcCBpbnN0YWxsIHB5dGhvbmRpYWxvZyIpCiAgICBlbGlmIG9wdGlvbiA9PSAnLS1ndWknOgogICAgICAgIGlmIFRLSU5URVJfQVZBSUxBQkxFOgogICAgICAgICAgICByb290ID0gdGsuVGsoKQogICAgICAgICAgICBhcHAgPSBSZXBvTWFuYWdlckdVSShyb290KQogICAgICAgICAgICByb290Lm1haW5sb29wKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCgiWyFdIFRraW50ZXIgbm90IGF2YWlsYWJsZS4gSW5zdGFsbCB3aXRoOiBzdWRvIGFwdCBpbnN0YWxsIHB5dGhvbjMtdGsiKQogICAgICAgICAgICBwcmludCgiWytdIElmIHlvdSB1c2luZyB0ZXJtdXggdHJ5OiBhcHQgaW5zdGFsbCBweXRob24tdGtpbnRlciIpCiAgICAgICAgICAgIHByaW50KCJbKl0gVXNpbmcgZGlhbG9nIG1vZGUiKQogICAgICAgICAgICB0aW1lLnNsZWVwKDEpCiAgICAgICAgICAgIGlmIG5vdCBvcy5lbnZpcm9uLmdldCgiRElTUExBWSIpIGFuZCBESUFMT0dfQVZBSUxBQkxFOgogICAgICAgICAgICAgICAgZGlhbG9nX21lbnUgPSBEaWFsb2dNZW51KCkKICAgICAgICAgICAgICAgIGRpYWxvZ19tZW51LnJ1bigpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgiWyFdIE5laXRoZXIgR1VJIG9yIERpYWxvZyBhdmFpbGFibGUuIFBsZWFzZSBpbnN0YWxsIHJlcXVpcmVkIHBhY2thZ2VzLiIpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy12JywgJy0tdmVyc2lvbiddOgogICAgICAgIHNob3dfdmVyc2lvbigpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy1oJywgJy0taGVscCddOgogICAgICAgIHNob3dfaGVscCgpCiAgICBlbHNlOgogICAgICAgIHNob3dfaGVscCgpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdHJ5OgogICAgICAgIG1haW4oKQogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIHByaW50KCJcblshXSBQcm9ncmFtIGNhbmNlbGVkLiIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiJcblshXSBFcnJvcjoge2V9IikK"

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