IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkezErJEB9IgoKIyBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdldGNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgY29tbWl0cyBjb21tZmQgcGhhc2UgY2FudiBtYWluZm9udCBlbnYKICAgIGdsb2JhbCBzdGFydG1zZWNzIG5leHR1cGRhdGUKICAgIGdsb2JhbCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IgbGVmdG92ZXIKCiAgICAjIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4KICAgIGlmIHtbaW5mbyBleGlzdHMgZW52KEdJVF9ESVIpXX0gewoJc2V0IGdpdGRpciAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJc2V0IGdpdGRpciAiLmdpdCIKICAgIH0KICAgIGlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKCWVycm9yX3BvcHVwICJDYW5ub3QgZmluZCB0aGUgZ2l0IGRpcmVjdG9yeSBcIiRnaXRkaXJcIi4iCglleGl0IDEKICAgIH0KICAgIHNldCBjb21taXRzIHt9CiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBpZiBbY2F0Y2ggewoJc2V0IHBhcnNlX2FyZ3MgW2NvbmNhdCAtLWRlZmF1bHQgSEVBRCAkcmFyZ3NdCglzZXQgcGFyc2VkX2FyZ3MgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1wYXJzZSAkcGFyc2VfYXJnc10gIlxuIl0KICAgIH1dIHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIGlmIFtjYXRjaCB7CglzZXQgY29tbWZkIFtvcGVuICJ8Z2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciAkcGFyc2VkX2FyZ3MiIHJdCiAgICB9IGVycl0gewoJcHV0cyBzdGRlcnIgIkVycm9yIGV4ZWN1dGluZyBnaXQtcmV2LWxpc3Q6ICRlcnIiCglleGl0IDEKICAgIH0KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgZmNvbmZpZ3VyZSAkY29tbWZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKICAgIGZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlICJnZXRjb21taXRsaW5lcyAkY29tbWZkIgogICAgJGNhbnYgZGVsZXRlIGFsbAogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgJGN0ZXh0IGNvbmZpZyAtY3Vyc29yIHdhdGNoCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2NvbW1mZH0gIHsKICAgIGdsb2JhbCBjb21taXRzIHBhcmVudHMgY2RhdGUgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBoYXNlIGNvbW1pdGluZm8gbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIGxlZnRvdmVyCgogICAgc2V0IHN0dWZmIFtyZWFkICRjb21tZmRdCiAgICBpZiB7JHN0dWZmID09IHt9fSB7CglpZiB7IVtlb2YgJGNvbW1mZF19IHJldHVybgoJIyB0aGlzIHdvcmtzIGFyb3VuZCB3aGF0IGlzIGFwcGFyZW50bHkgYSBidWcgaW4gVGNsLi4uCglmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDEKCWlmIHshW2NhdGNoIHtjbG9zZSAkY29tbWZkfSBlcnJdfSB7CgkgICAgYWZ0ZXIgaWRsZSBmaW5pc2hjb21taXRzCgkgICAgcmV0dXJuCgl9CglpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJICAgIHNldCBlcnIgXAp7R2l0azogZXJyb3IgcmVhZGluZyBjb21taXRzOiBiYWQgYXJndW1lbnRzIHRvIGdpdC1yZXYtbGlzdC4KKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0LXJldi1saXN0CnRvIGFsbG93IHNlbGVjdGlvbiBvZiBjb21taXRzIHRvIGJlIGRpc3BsYXllZC4pfQoJfSBlbHNlIHsKCSAgICBzZXQgZXJyICJFcnJvciByZWFkaW5nIGNvbW1pdHM6ICRlcnIiCgl9CgllcnJvcl9wb3B1cCAkZXJyCglleGl0IDEKICAgIH0KICAgIHNldCBzdGFydCAwCiAgICB3aGlsZSAxIHsKCXNldCBpIFtzdHJpbmcgZmlyc3QgIlwwIiAkc3R1ZmYgJHN0YXJ0XQoJaWYgeyRpIDwgMH0gewoJICAgIGFwcGVuZCBsZWZ0b3ZlciBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIHJldHVybgoJfQoJc2V0IGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IFtleHByIHskaSAtIDF9XV0KCWlmIHskc3RhcnQgPT0gMH0gewoJICAgIHNldCBjbWl0ICIkbGVmdG92ZXIkY21pdCIKCSAgICBzZXQgbGVmdG92ZXIge30KCX0KCXNldCBzdGFydCBbZXhwciB7JGkgKyAxfV0KCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pXG59ICRjbWl0IG1hdGNoIGlkXX0gewoJICAgIHNldCBzaG9ydGNtaXQgJGNtaXQKCSAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNob3J0Y21pdF0gPiA4MH0gewoJCXNldCBzaG9ydGNtaXQgIltzdHJpbmcgcmFuZ2UgJHNob3J0Y21pdCAwIDgwXS4uLiIKCSAgICB9CgkgICAgZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1yZXYtbGlzdCBvdXRwdXQ6IHskc2hvcnRjbWl0fSIKCSAgICBleGl0IDEKCX0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJGNtaXQgNDEgZW5kXQoJbGFwcGVuZCBjb21taXRzICRpZAoJc2V0IGNvbW1pdGxpc3RlZCgkaWQpIDEKCXBhcnNlY29tbWl0ICRpZCAkY21pdCAxCglkcmF3Y29tbWl0ICRpZAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCSAgICBkb3VwZGF0ZQoJfQoJd2hpbGUgeyRyZWRpc3BsYXlpbmd9IHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCSAgICBpZiB7JHN0b3BwZWQgPT0gMX0gewoJCXNldCBzdG9wcGVkIDAKCQlzZXQgcGhhc2UgImdldGNvbW1pdHMiCgkJZm9yZWFjaCBpZCAkY29tbWl0cyB7CgkJICAgIGRyYXdjb21taXQgJGlkCgkJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCQkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQkJZG91cGRhdGUKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZG91cGRhdGUge30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlCgogICAgaW5jciBuZXh0dXBkYXRlIDEwMAogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUge30KICAgIHVwZGF0ZQogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgImdldGNvbW1pdGxpbmVzICRjb21tZmQiCn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIFtjYXRjaCB7c2V0IGNvbnRlbnRzIFtleGVjIGdpdC1jYXQtZmlsZSBjb21taXQgJGlkXX1dIHJldHVybgogICAgcGFyc2Vjb21taXQgJGlkICRjb250ZW50cyAwCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgbnBhcmVudHMgY2RhdGUgbmNsZWZ0CgogICAgc2V0IGluaGRyIDEKICAgIHNldCBjb21tZW50IHt9CiAgICBzZXQgaGVhZGxpbmUge30KICAgIHNldCBhdW5hbWUge30KICAgIHNldCBhdWRhdGUge30KICAgIHNldCBjb21uYW1lIHt9CiAgICBzZXQgY29tZGF0ZSB7fQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGlkKSB7fQoJc2V0IG5jaGlsZHJlbigkaWQpIDAKCXNldCBuY2xlZnQoJGlkKSAwCiAgICB9CiAgICBzZXQgcGFyZW50cygkaWQpIHt9CiAgICBzZXQgbnBhcmVudHMoJGlkKSAwCiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb250ZW50cyAiXG4iXSB7CglpZiB7JGluaGRyfSB7CgkgICAgaWYgeyRsaW5lID09IHt9fSB7CgkJc2V0IGluaGRyIDAKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJCWlmIHskdGFnID09ICJwYXJlbnQifSB7CgkJICAgIHNldCBwIFtsaW5kZXggJGxpbmUgMV0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCQkJc2V0IGNoaWxkcmVuKCRwKSB7fQoJCQlzZXQgbmNoaWxkcmVuKCRwKSAwCgkJCXNldCBuY2xlZnQoJHApIDAKCQkgICAgfQoJCSAgICBsYXBwZW5kIHBhcmVudHMoJGlkKSAkcAoJCSAgICBpbmNyIG5wYXJlbnRzKCRpZCkKCQkgICAgIyBzb21ldGltZXMgd2UgZ2V0IGEgY29tbWl0IHRoYXQgbGlzdHMgYSBwYXJlbnQgdHdpY2UuLi4KCQkgICAgaWYgeyRsaXN0ZWQgJiYgW2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGlkXSA8IDB9IHsKCQkJbGFwcGVuZCBjaGlsZHJlbigkcCkgJGlkCgkJCWluY3IgbmNoaWxkcmVuKCRwKQoJCQlpbmNyIG5jbGVmdCgkcCkKCQkgICAgfQoJCX0gZWxzZWlmIHskdGFnID09ICJhdXRob3IifSB7CgkJICAgIHNldCB4IFtleHByIHtbbGxlbmd0aCAkbGluZV0gLSAyfV0KCQkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBbZXhwciB7JHggLSAxfV1dCgkJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCQkgICAgc2V0IHggW2V4cHIge1tsbGVuZ3RoICRsaW5lXSAtIDJ9XQoJCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgW2V4cHIgeyR4IC0gMX1dXQoJCX0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHskY29tbWVudCA9PSB7fX0gewoJCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCgkgICAgfSBlbHNlIHsKCQlhcHBlbmQgY29tbWVudCAiXG4iCgkgICAgfQoJICAgIGlmIHshJGxpc3RlZH0gewoJCSMgZ2l0LXJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCgkJYXBwZW5kIGNvbW1lbnQgIiAgICAiCgkgICAgfQoJICAgIGFwcGVuZCBjb21tZW50ICRsaW5lCgl9CiAgICB9CiAgICBpZiB7JGF1ZGF0ZSAhPSB7fX0gewoJc2V0IGF1ZGF0ZSBbY2xvY2sgZm9ybWF0ICRhdWRhdGUgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQoJc2V0IGNvbWRhdGUgW2Nsb2NrIGZvcm1hdCAkY29tZGF0ZSAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcwogICAgc2V0IHRhZ3MgW2dsb2IgLW5vY29tcGxhaW4gLXR5cGVzIGYgLmdpdC9yZWZzL3RhZ3MvKl0KICAgIGZvcmVhY2ggZiAkdGFncyB7CgljYXRjaCB7CgkgICAgc2V0IGZkIFtvcGVuICRmIHJdCgkgICAgc2V0IGxpbmUgW3JlYWQgJGZkXQoJICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCQlzZXQgZGlyZWN0IFtmaWxlIHRhaWwgJGZdCgkJc2V0IHRhZ2lkcygkZGlyZWN0KSAkaWQKCQlsYXBwZW5kIGlkdGFncygkaWQpICRkaXJlY3QKCQlzZXQgY29udGVudHMgW3NwbGl0IFtleGVjIGdpdC1jYXQtZmlsZSB0YWcgJGlkXSAiXG4iXQoJCXNldCBvYmoge30KCQlzZXQgdHlwZSB7fQoJCXNldCB0YWcge30KCQlmb3JlYWNoIGwgJGNvbnRlbnRzIHsKCQkgICAgaWYgeyRsID09IHt9fSBicmVhawoJCSAgICBzd2l0Y2ggLS0gW2xpbmRleCAkbCAwXSB7CgkJCSJvYmplY3QiIHtzZXQgb2JqIFtsaW5kZXggJGwgMV19CgkJCSJ0eXBlIiB7c2V0IHR5cGUgW2xpbmRleCAkbCAxXX0KCQkJInRhZyIge3NldCB0YWcgW3N0cmluZyByYW5nZSAkbCA0IGVuZF19CgkJICAgIH0KCQl9CgkJaWYgeyRvYmogIT0ge30gJiYgJHR5cGUgPT0gImNvbW1pdCIgJiYgJHRhZyAhPSB7fX0gewoJCSAgICBzZXQgdGFnaWRzKCR0YWcpICRvYmoKCQkgICAgbGFwcGVuZCBpZHRhZ3MoJG9iaikgJHRhZwoJCX0KCSAgICB9CgkgICAgY2xvc2UgJGZkCgl9CiAgICB9CiAgICBzZXQgaGVhZHMgW2dsb2IgLW5vY29tcGxhaW4gLXR5cGVzIGYgLmdpdC9yZWZzL2hlYWRzLypdCiAgICBmb3JlYWNoIGYgJGhlYWRzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBoZWFkIFtmaWxlIHRhaWwgJGZdCgkJc2V0IGhlYWRpZHMoJGhlYWQpICRsaW5lCgkJbGFwcGVuZCBpZGhlYWRzKCRsaW5lKSAkaGVhZAoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KfQoKcHJvYyBlcnJvcl9wb3B1cCBtc2cgewogICAgc2V0IHcgLmVycm9yCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCiAgICB0a3dhaXQgd2luZG93ICR3Cn0KCnByb2MgbWFrZXdpbmRvdyB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0IHRleHRmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIGZzdHJpbmcgZ2VvbWV0cnkKICAgIGdsb2JhbCBlbnRyaWVzIHNoYTFlbnRyeSBzaGExc3RyaW5nIHNoYTFidXQKICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUXVpdCIgLWNvbW1hbmQgZG9xdWl0CiAgICBtZW51IC5iYXIuaGVscAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkhlbHAiIC1tZW51IC5iYXIuaGVscAogICAgLmJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgZ2l0ayIgLWNvbW1hbmQgYWJvdXQKICAgIC4gY29uZmlndXJlIC1tZW51IC5iYXIKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBnZW9tZXRyeShjYW52MSldfSB7CglzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIDQ1ICogJGNoYXJzcGNdCglzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIDMwICogJGNoYXJzcGNdCglzZXQgZ2VvbWV0cnkoY2FudjMpIFtleHByIDE1ICogJGNoYXJzcGNdCglzZXQgZ2VvbWV0cnkoY2FudmgpIFtleHByIDI1ICogJGxpbmVzcGMgKyA0XQoJc2V0IGdlb21ldHJ5KGN0ZXh0dykgODAKCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCglzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgMzAKICAgIH0KICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkod2lkdGgpXX0gewoJLmN0b3AgY29uZiAtd2lkdGggJGdlb21ldHJ5KHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShoZWlnaHQpCglzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KCXNldCBnZW9tZXRyeShjdGV4dGgpIFtleHByIHsoJHRleHRoIC0gOCkgLwoJCQkJICAgIFtmb250IG1ldHJpY3MgJHRleHRmb250IC1saW5lc3BhY2VdfV0KICAgIH0KICAgIGZyYW1lIC5jdG9wLnRvcAogICAgZnJhbWUgLmN0b3AudG9wLmJhcgogICAgcGFjayAuY3RvcC50b3AuYmFyIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBzZXQgY3Njcm9sbCAuY3RvcC50b3AuY3NiCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFuZWR3aW5kb3cgLmN0b3AudG9wLmNsaXN0IC1vcmllbnQgaG9yaXpvbnRhbCAtc2FzaHBhZCAwIC1oYW5kbGVzaXplIDQKICAgIHBhY2sgLmN0b3AudG9wLmNsaXN0IC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AgYWRkIC5jdG9wLnRvcAogICAgc2V0IGNhbnYgLmN0b3AudG9wLmNsaXN0LmNhbnYKICAgIGNhbnZhcyAkY2FudiAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MSkgXAoJLWJnIHdoaXRlIC1iZCAwIFwKCS15c2Nyb2xsaW5jciAkbGluZXNwYyAteXNjcm9sbGNvbW1hbmQgIiRjc2Nyb2xsIHNldCIKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYKICAgIHNldCBjYW52MiAuY3RvcC50b3AuY2xpc3QuY2FudjIKICAgIGNhbnZhcyAkY2FudjIgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjIpIFwKCS1iZyB3aGl0ZSAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYyCiAgICBzZXQgY2FudjMgLmN0b3AudG9wLmNsaXN0LmNhbnYzCiAgICBjYW52YXMgJGNhbnYzIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MwogICAgYmluZCAuY3RvcC50b3AuY2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CgogICAgc2V0IHNoYTFlbnRyeSAuY3RvcC50b3AuYmFyLnNoYTEKICAgIHNldCBlbnRyaWVzICRzaGExZW50cnkKICAgIHNldCBzaGExYnV0IC5jdG9wLnRvcC5iYXIuc2hhMWxhYmVsCiAgICBidXR0b24gJHNoYTFidXQgLXRleHQgIlNIQTEgSUQ6ICIgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCBcCgktY29tbWFuZCBnb3RvY29tbWl0IC13aWR0aCA4CiAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuc2hhMWxhYmVsIC1zaWRlIGxlZnQKICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKICAgIHBhY2sgJHNoYTFlbnRyeSAtc2lkZSBsZWZ0IC1wYWR5IDIKICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmZpbmRidXQgLXRleHQgIkZpbmQiIC1jb21tYW5kIGRvZmluZAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmRidXQgLXNpZGUgbGVmdAogICAgc2V0IGZpbmRzdHJpbmcge30KICAgIHNldCBmc3RyaW5nIC5jdG9wLnRvcC5iYXIuZmluZHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRmc3RyaW5nCiAgICBlbnRyeSAkZnN0cmluZyAtd2lkdGggMzAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgZmluZHN0cmluZwogICAgcGFjayAkZnN0cmluZyAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4CiAgICBzZXQgZmluZHR5cGUgRXhhY3QKICAgIHRrX29wdGlvbk1lbnUgLmN0b3AudG9wLmJhci5maW5kdHlwZSBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cAogICAgc2V0IGZpbmRsb2MgIkFsbCBmaWVsZHMiCiAgICB0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZGxvYyBmaW5kbG9jICJBbGwgZmllbGRzIiBIZWFkbGluZSBcCglDb21tZW50cyBBdXRob3IgQ29tbWl0dGVyCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CgogICAgcGFuZWR3aW5kb3cgLmN0b3AuY2RldCAtb3JpZW50IGhvcml6b250YWwKICAgIC5jdG9wIGFkZCAuY3RvcC5jZGV0CiAgICBmcmFtZSAuY3RvcC5jZGV0LmxlZnQKICAgIHNldCBjdGV4dCAuY3RvcC5jZGV0LmxlZnQuY3RleHQKICAgIHRleHQgJGN0ZXh0IC1iZyB3aGl0ZSAtc3RhdGUgZGlzYWJsZWQgLWZvbnQgJHRleHRmb250IFwKCS13aWR0aCAkZ2VvbWV0cnkoY3RleHR3KSAtaGVpZ2h0ICRnZW9tZXRyeShjdGV4dGgpIFwKCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5sZWZ0LnNiIHNldCIKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LmxlZnQuc2IgLWNvbW1hbmQgIiRjdGV4dCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5sZWZ0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGN0ZXh0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wLmNkZXQgYWRkIC5jdG9wLmNkZXQubGVmdAoKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtYmFjayBibHVlIC1mb3JlIHdoaXRlCiAgICAkY3RleHQgdGFnIGNvbmYgZDAgLWJhY2sgIiNmZjgwODAiCiAgICAkY3RleHQgdGFnIGNvbmYgZDEgLWJhY2sgZ3JlZW4KICAgICRjdGV4dCB0YWcgY29uZiBmb3VuZCAtYmFjayB5ZWxsb3cKCiAgICBmcmFtZSAuY3RvcC5jZGV0LnJpZ2h0CiAgICBzZXQgY2ZsaXN0IC5jdG9wLmNkZXQucmlnaHQuY2ZpbGVzCiAgICBsaXN0Ym94ICRjZmxpc3QgLWJnIHdoaXRlIC1zZWxlY3Rtb2RlIGV4dGVuZGVkIC13aWR0aCAkZ2VvbWV0cnkoY2ZsaXN0dykgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LnJpZ2h0LnNiIHNldCIKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1jb21tYW5kICIkY2ZsaXN0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGNmbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LnJpZ2h0CiAgICBiaW5kIC5jdG9wLmNkZXQgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNkZXRwYW5lcyAlVyAld30KCiAgICBwYWNrIC5jdG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQoKICAgIGJpbmRhbGwgPDE+IHtzZWxjYW52bGluZSAlVyAleCAleX0KICAgICNiaW5kYWxsIDxCMS1Nb3Rpb24+IHtzZWxjYW52bGluZSAlVyAleCAleX0KICAgIGJpbmRhbGwgPEJ1dHRvblJlbGVhc2UtND4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtNSB1bml0cyIKICAgIGJpbmRhbGwgPEJ1dHRvblJlbGVhc2UtNT4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCA1IHVuaXRzIgogICAgYmluZGFsbCA8Mj4gImFsbGNhbnZzIHNjYW4gbWFyayAwICV5IgogICAgYmluZGFsbCA8QjItTW90aW9uPiAiYWxsY2FudnMgc2NhbiBkcmFndG8gMCAleSIKICAgIGJpbmQgLiA8S2V5LVVwPiAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5kIC4gPEtleS1Eb3duPiAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmQgLiA8S2V5LVByaW9yPiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZCAuIDxLZXktTmV4dD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LURlbGV0ZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1zcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgcCAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IGIgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IGQgIiRjdGV4dCB5dmlldyBzY3JvbGwgMTggdW5pdHMiCiAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgogICAgYmluZGtleSAvIGZpbmRuZXh0CiAgICBiaW5ka2V5ID8gZmluZHByZXYKICAgIGJpbmRrZXkgZiBuZXh0ZmlsZQogICAgYmluZCAuIDxDb250cm9sLXE+IGRvcXVpdAogICAgYmluZCAuIDxDb250cm9sLWY+IGRvZmluZAogICAgYmluZCAuIDxDb250cm9sLWc+IGZpbmRuZXh0CiAgICBiaW5kIC4gPENvbnRyb2wtcj4gZmluZHByZXYKICAgIGJpbmQgLiA8Q29udHJvbC1lcXVhbD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxDb250cm9sLUtQX1N1YnRyYWN0PiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kICRjZmxpc3QgPDxMaXN0Ym94U2VsZWN0Pj4gbGlzdGJveHNlbAogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0Cn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWlmIHskdyA9PSAkZX0gcmV0dXJuCiAgICB9CiAgICBmb2N1cyAuCn0KCnByb2Mgc2F2ZXN0dWZmIHt3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkCiAgICBpZiB7JHN0dWZmc2F2ZWR9IHJldHVybgogICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgogICAgY2F0Y2ggewoJc2V0IGYgW29wZW4gIn4vLmdpdGstbmV3IiB3XQoJcHV0cyAkZiAic2V0IG1haW5mb250IHskbWFpbmZvbnR9IgoJcHV0cyAkZiAic2V0IHRleHRmb250IHskdGV4dGZvbnR9IgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHdpZHRoKSBbd2luZm8gd2lkdGggLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGhlaWdodCkgW3dpbmZvIGhlaWdodCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIFt3aW5mbyB3aWR0aCAkY2Fudl0tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIFt3aW5mbyB3aWR0aCAkY2FudjJdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnYzXS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgW3dpbmZvIGhlaWdodCAkY2Fudl0tMl0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciAkc2FzaDAgKyAyMF0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgJHcgLSAxMF0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByICRzYXNoMSAtIDIwXQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciAkdyAtIDE1XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvIGNvbG9ybWFwIGNvbW1jb2xvcnMgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29ybmVyY3Jvc3NpbmdzIGNyb3NzaW5ncwoKICAgIGlmIFtpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPD0gMSAmJiAkbmNoaWxkcmVuKCRpZCkgPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGNoaWxkcmVuKCRpZCkgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiAkbnBhcmVudHMoJGNoaWxkKSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldfSB7Cglmb3JlYWNoIHggJGNvcm5lcmNyb3NzaW5ncygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyB7fQoJfQogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CglpZiB7W2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXX0gewoJICAgIGZvcmVhY2ggeCAkY3Jvc3NpbmdzKCRpZCkgewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJCX0KCSAgICB9CgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJICAgIH0KCX0KCXNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGNoaWxkKV19IHsKCQlmb3JlYWNoIHAgJHBhcmVudHMoJGNoaWxkKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBpbml0Z3JhcGgge30gewogICAgZ2xvYmFsIGNhbnZ5IGNhbnZ5MCBsaW5lbm8gbnVtY29tbWl0cyBsdGhpY2tuZXNzIG5leHRjb2xvciBsaW5lc3BjCiAgICBnbG9iYWwgbWFpbmxpbmUgc2lkZWxpbmVzCiAgICBnbG9iYWwgbmNoaWxkcmVuIG5jbGVmdAoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgY2F0Y2gge3Vuc2V0IG1haW5saW5lfQogICAgY2F0Y2gge3Vuc2V0IHNpZGVsaW5lc30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIG5jaGlsZHJlbl0gewoJc2V0IG5jbGVmdCgkaWQpICRuY2hpbGRyZW4oJGlkKQogICAgfQp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIgp9Cgpwcm9jIGRyYXdjb21taXRsaW5lIHtsZXZlbH0gewogICAgZ2xvYmFsIHBhcmVudHMgY2hpbGRyZW4gbnBhcmVudHMgbmNoaWxkcmVuIHRvZG8KICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG1haW5mb250IG5hbWVmb250IGNhbnZ4MCBjYW52eSBsaW5lc3BjCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIGNvbW1pdGluZm8KICAgIGdsb2JhbCBjb2xvcm1hcCBudW1jb21taXRzIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBvbGRsZXZlbCBvbGRubGluZXMgb2xkdG9kbwogICAgZ2xvYmFsIGlkdGFncyBpZGxpbmUgaWRoZWFkcwogICAgZ2xvYmFsIGxpbmVubyBsdGhpY2tuZXNzIG1haW5saW5lIHNpZGVsaW5lcwogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCByb3d0ZXh0eCBpZHBvcwoKICAgIGluY3IgbnVtY29tbWl0cwogICAgaW5jciBsaW5lbm8KICAgIHNldCBpZCBbbGluZGV4ICR0b2RvICRsZXZlbF0KICAgIHNldCBsaW5laWQoJGxpbmVubykgJGlkCiAgICBzZXQgaWRsaW5lKCRpZCkgJGxpbmVubwogICAgc2V0IG9maWxsIFtleHByIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJcmVhZGNvbW1pdCAkaWQKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CgkgICAgc2V0IG5wYXJlbnRzKCRpZCkgMAoJfQogICAgfQogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgY3VycmVudHBhcmVudHMge30KICAgIHNldCBkdXBwYXJlbnRzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXSAmJiBbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGN1cnJlbnRwYXJlbnRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIGN1cnJlbnRwYXJlbnRzICRwCgkgICAgfSBlbHNlIHsKCQkjIHJlbWVtYmVyIHRoYXQgdGhpcyBwYXJlbnQgd2FzIGxpc3RlZCB0d2ljZQoJCWxhcHBlbmQgZHVwcGFyZW50cyAkcAoJICAgIH0KCX0KICAgIH0KICAgIHNldCB4IFtleHByICRjYW52eDAgKyAkbGV2ZWwgKiAkbGluZXNwY10KICAgIHNldCB5MSAkY2FudnkKICAgIHNldCBjYW52eSBbZXhwciAkY2FudnkgKyAkbGluZXNwY10KICAgIGFsbGNhbnZzIGNvbmYgLXNjcm9sbHJlZ2lvbiBcCglbbGlzdCAwIDAgMCBbZXhwciAkeTEgKyAwLjUgKiAkbGluZXNwYyArIDJdXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRtYWlubGluZSgkaWQpIFwKCQkgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgJGNvbG9ybWFwKCRpZCldCgkkY2FudiBsb3dlciAkdAoJYmluZGxpbmUgJHQgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgdGhpY2sgW2xpbmRleCAkbHMgMV0KCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtZmlsbCAkY29sb3JtYXAoJGlkKSBcCgkJICAgICAgIC13aWR0aCBbZXhwciB7JHRoaWNrICogJGx0aGlja25lc3N9XV0KCSAgICAkY2FudiBsb3dlciAkdAoJICAgIGJpbmRsaW5lICR0ICRpZAoJfQogICAgfQogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgJHggLSAkb3JhZF0gW2V4cHIgJHkxIC0gJG9yYWRdIFwKCSAgICAgICBbZXhwciAkeCArICRvcmFkIC0gMV0gW2V4cHIgJHkxICsgJG9yYWQgLSAxXSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxXQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCB4dCBbZXhwciAkY2FudngwICsgW2xsZW5ndGggJHRvZG9dICogJGxpbmVzcGNdCiAgICBpZiB7W2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSA+IDJ9IHsKCXNldCB4dCBbZXhwciB7JHh0ICsgKFtsbGVuZ3RoICRjdXJyZW50cGFyZW50c10gLSAyKSAqICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCByb3d0ZXh0eCgkbGluZW5vKSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeTFdCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IHh0IFtkcmF3dGFncyAkaWQgJHggJHh0ICR5MV0KICAgIH0KICAgIHNldCBoZWFkbGluZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMF0KICAgIHNldCBuYW1lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAxXQogICAgc2V0IGRhdGUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDJdCiAgICBzZXQgbGluZWh0YWcoJGxpbmVubykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRoZWFkbGluZSAtZm9udCAkbWFpbmZvbnQgXQogICAgJGNhbnYgYmluZCAkbGluZWh0YWcoJGxpbmVubykgPEJ1dHRvbi0zPiAicm93bWVudSAlWCAlWSAkaWQiCiAgICBzZXQgbGluZW50YWcoJGxpbmVubykgWyRjYW52MiBjcmVhdGUgdGV4dCAzICR5MSAtYW5jaG9yIHcgXAoJCQkgICAgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5hbWVmb250XQogICAgc2V0IGxpbmVkdGFnKCRsaW5lbm8pIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udF0KfQoKcHJvYyBkcmF3dGFncyB7aWQgeCB4dCB5MX0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzCiAgICBnbG9iYWwgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY2FudiBtYWluZm9udAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgbWFya3MgJGlkdGFncygkaWQpCglzZXQgbnRhZ3MgW2xsZW5ndGggJG1hcmtzXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkaGVhZHMoJGlkKV0KICAgIH0KICAgIGlmIHskbWFya3MgZXEge319IHsKCXJldHVybiAkeHQKICAgIH0KCiAgICBzZXQgZGVsdGEgW2V4cHIge2ludCgwLjUgKiAoJGxpbmVzcGMgLSAkbHRoaWNrbmVzcykpfV0KICAgIHNldCB5dCBbZXhwciAkeTEgLSAwLjUgKiAkbGluZXNwY10KICAgIHNldCB5YiBbZXhwciAkeXQgKyAkbGluZXNwYyAtIDFdCiAgICBzZXQgeHZhbHMge30KICAgIHNldCB3dmFscyB7fQogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHsKCXNldCB3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRhZ10KCWxhcHBlbmQgeHZhbHMgJHh0CglsYXBwZW5kIHd2YWxzICR3aWQKCXNldCB4dCBbZXhwciB7JHh0ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzICsgJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICR4ICR5MSBbbGluZGV4ICR4dmFscyBlbmRdICR5MSBcCgkgICAgICAgLXdpZHRoICRsdGhpY2tuZXNzIC1maWxsIGJsYWNrIC10YWdzIHRhZy4kaWRdCiAgICAkY2FudiBsb3dlciAkdAogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHggJHh2YWxzIHdpZCAkd3ZhbHMgewoJc2V0IHhsIFtleHByICR4ICsgJGRlbHRhXQoJc2V0IHhyIFtleHByICR4ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzXQoJaWYge1tpbmNyIG50YWdzIC0xXSA+PSAwfSB7CgkgICAgIyBkcmF3IGEgdGFnCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgJHl0ICsgJGRlbHRhXSAkeGwgJHl0XAoJCSR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByICR5YiAtICRkZWx0YV0gXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQKCSAgICBzZXQgeGwgW2V4cHIgJHhsIC0gJGRlbHRhLzJdCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggJHl0ICR4ciAkeXQgJHhyICR5YiAkeCAkeWIgXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIGdyZWVuIC10YWdzIHRhZy4kaWQKCX0KCSRjYW52IGNyZWF0ZSB0ZXh0ICR4bCAkeTEgLWFuY2hvciB3IC10ZXh0ICR0YWcgXAoJICAgIC1mb250ICRtYWluZm9udCAtdGFncyB0YWcuJGlkCiAgICB9CiAgICByZXR1cm4gJHh0Cn0KCnByb2MgdXBkYXRldG9kbyB7bGV2ZWwgbm9zaG9ydGN1dH0gewogICAgZ2xvYmFsIGN1cnJlbnRwYXJlbnRzIG5jbGVmdCB0b2RvCiAgICBnbG9iYWwgbWFpbmxpbmUgb2xkbGV2ZWwgb2xkdG9kbyBvbGRubGluZXMKICAgIGdsb2JhbCBjYW52eDAgY2FudnkgbGluZXNwYyBtYWlubGluZQogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICBzZXQgb2xkbGV2ZWwgJGxldmVsCiAgICBzZXQgb2xkdG9kbyAkdG9kbwogICAgc2V0IG9sZG5saW5lcyBbbGxlbmd0aCAkdG9kb10KICAgIGlmIHshJG5vc2hvcnRjdXQgJiYgW2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSA9PSAxfSB7CglzZXQgcCBbbGluZGV4ICRjdXJyZW50cGFyZW50cyAwXQoJaWYgeyRuY2xlZnQoJHApID09IDEgJiYgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXSA8IDB9IHsKCSAgICBzZXQgbmNsZWZ0KCRwKSAwCgkgICAgc2V0IHggW2V4cHIgJGNhbnZ4MCArICRsZXZlbCAqICRsaW5lc3BjXQoJICAgIHNldCB5IFtleHByICRjYW52eSAtICRsaW5lc3BjXQoJICAgIHNldCBtYWlubGluZSgkcCkgW2xpc3QgJHggJHldCgkgICAgc2V0IHRvZG8gW2xyZXBsYWNlICR0b2RvICRsZXZlbCAkbGV2ZWwgJHBdCgkgICAgcmV0dXJuIDAKCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbF0KICAgIHNldCBpICRsZXZlbAogICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CglpbmNyIG5jbGVmdCgkcCkgLTEKCXNldCBrIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkcF0KCWlmIHskayA8IDB9IHsKCSAgICBzZXQgdG9kbyBbbGluc2VydCAkdG9kbyAkaSAkcF0KCSAgICBpbmNyIGkKCX0KICAgIH0KICAgIHJldHVybiAxCn0KCnByb2Mgbm90ZWNyb3NzaW5ncyB7aWQgbG8gaGkgY29ybmVyfSB7CiAgICBnbG9iYWwgb2xkdG9kbyBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzCgogICAgZm9yIHtzZXQgaSAkbG99IHtbaW5jciBpXSA8ICRoaX0ge30gewoJc2V0IHAgW2xpbmRleCAkb2xkdG9kbyAkaV0KCWlmIHskcCA9PSB7fX0gY29udGludWUKCWlmIHskaSA9PSAkY29ybmVyfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcAoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJHApXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWRdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWQKCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIGRyYXdzbGFudHMge30gewogICAgZ2xvYmFsIGNhbnYgbWFpbmxpbmUgc2lkZWxpbmVzIGNhbnZ4MCBjYW52eSBsaW5lc3BjCiAgICBnbG9iYWwgb2xkbGV2ZWwgb2xkdG9kbyB0b2RvIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBsdGhpY2tuZXNzIGxpbmVzcGMgY2FudnkgY29sb3JtYXAKCiAgICBzZXQgeTEgW2V4cHIgJGNhbnZ5IC0gJGxpbmVzcGNdCiAgICBzZXQgeTIgJGNhbnZ5CiAgICBzZXQgaSAtMQogICAgZm9yZWFjaCBpZCAkb2xkdG9kbyB7CglpbmNyIGkKCWlmIHskaWQgPT0ge319IGNvbnRpbnVlCglzZXQgeGkgW2V4cHIgeyRjYW52eDAgKyAkaSAqICRsaW5lc3BjfV0KCWlmIHskaSA9PSAkb2xkbGV2ZWx9IHsKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdCgkJc2V0IGNvb3JkcyBbbGlzdCAkeGkgJHkxXQoJCXNldCB4aiBbZXhwciB7JGNhbnZ4MCArICRqICogJGxpbmVzcGN9XQoJCWlmIHskaiA8ICRpIC0gMX0gewoJCSAgICBsYXBwZW5kIGNvb3JkcyBbZXhwciAkeGogKyAkbGluZXNwY10gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGogJGkgW2V4cHIgeyRqICsgMX1dCgkJfSBlbHNlaWYgeyRqID4gJGkgKyAxfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByICR4aiAtICRsaW5lc3BjXSAkeTEKCQkgICAgbm90ZWNyb3NzaW5ncyAkcCAkaSAkaiBbZXhwciB7JGogLSAxfV0KCQl9CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZHVwcGFyZW50cyAkcF0gPj0gMH0gewoJCSAgICAjIGRyYXcgYSBkb3VibGUtd2lkdGggbGluZSB0byBpbmRpY2F0ZSB0aGUgZG91YmxlZCBwYXJlbnQKCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5MgoJCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAyXQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYWlubGluZSgkcCldfSB7CgkJCXNldCBtYWlubGluZSgkcCkgW2xpc3QgJHhqICR5Ml0KCQkgICAgfQoJCX0gZWxzZSB7CgkJICAgICMgbm9ybWFsIGNhc2UsIG5vIHBhcmVudCBkdXBsaWNhdGVkCgkJICAgIGlmIHshW2luZm8gZXhpc3RzIG1haW5saW5lKCRwKV19IHsKCQkJaWYgeyRpICE9ICRqfSB7CgkJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJCX0KCQkJc2V0IG1haW5saW5lKCRwKSAkY29vcmRzCgkJICAgIH0gZWxzZSB7CgkJCWxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkJbGFwcGVuZCBzaWRlbGluZXMoJHApIFtsaXN0ICRjb29yZHMgMV0KCQkgICAgfQoJCX0KCSAgICB9Cgl9IGVsc2VpZiB7W2xpbmRleCAkdG9kbyAkaV0gIT0gJGlkfSB7CgkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRpZF0KCSAgICBzZXQgeGogW2V4cHIgeyRjYW52eDAgKyAkaiAqICRsaW5lc3BjfV0KCSAgICBsYXBwZW5kIG1haW5saW5lKCRpZCkgJHhpICR5MSAkeGogJHkyCgl9CiAgICB9Cn0KCnByb2MgZGVjaWRlbmV4dCB7e25vcmVhZCAwfX0gewogICAgZ2xvYmFsIHBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuIG5jbGVmdCB0b2RvCiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBtYWluZm9udCBuYW1lZm9udCBjYW52eDAgY2FudnkgbGluZXNwYwogICAgZ2xvYmFsIGRhdGVtb2RlIGNkYXRlCiAgICBnbG9iYWwgY29tbWl0aW5mbwogICAgZ2xvYmFsIGN1cnJlbnRwYXJlbnRzIG9sZGxldmVsIG9sZG5saW5lcyBvbGR0b2RvCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MKCiAgICAjIHJlbW92ZSB0aGUgbnVsbCBlbnRyeSBpZiBwcmVzZW50CiAgICBzZXQgbnVsbGVudHJ5IFtsc2VhcmNoIC1leGFjdCAkdG9kbyB7fV0KICAgIGlmIHskbnVsbGVudHJ5ID49IDB9IHsKCXNldCB0b2RvIFtscmVwbGFjZSAkdG9kbyAkbnVsbGVudHJ5ICRudWxsZW50cnldCiAgICB9CgogICAgIyBjaG9vc2Ugd2hpY2ggb25lIHRvIGRvIG5leHQgdGltZSBhcm91bmQKICAgIHNldCB0b2RvbCBbbGxlbmd0aCAkdG9kb10KICAgIHNldCBsZXZlbCAtMQogICAgc2V0IGxhdGVzdCB7fQogICAgZm9yIHtzZXQgayAkdG9kb2x9IHtbaW5jciBrIC0xXSA+PSAwfSB7fSB7CglzZXQgcCBbbGluZGV4ICR0b2RvICRrXQoJaWYgeyRuY2xlZnQoJHApID09IDB9IHsKCSAgICBpZiB7JGRhdGVtb2RlfSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CgkJICAgIGlmIHskbm9yZWFkfSB7CgkJCXJldHVybiB7fQoJCSAgICB9CgkJICAgIHJlYWRjb21taXQgJHAKCQl9CgkJaWYgeyRsYXRlc3QgPT0ge30gfHwgJGNkYXRlKCRwKSA+ICRsYXRlc3R9IHsKCQkgICAgc2V0IGxldmVsICRrCgkJICAgIHNldCBsYXRlc3QgJGNkYXRlKCRwKQoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBsZXZlbCAkawoJCWJyZWFrCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRsZXZlbCA8IDB9IHsKCWlmIHskdG9kbyAhPSB7fX0gewoJICAgIHB1dHMgIkVSUk9SOiBub25lIG9mIHRoZSBwZW5kaW5nIGNvbW1pdHMgY2FuIGJlIGRvbmUgeWV0OiIKCSAgICBmb3JlYWNoIHAgJHRvZG8gewoJCXB1dHMgIiAgJHAgKCRuY2xlZnQoJHApKSIKCSAgICB9Cgl9CglyZXR1cm4gLTEKICAgIH0KCiAgICAjIElmIHdlIGFyZSByZWR1Y2luZywgcHV0IGluIGEgbnVsbCBlbnRyeQogICAgaWYgeyR0b2RvbCA8ICRvbGRubGluZXN9IHsKCWlmIHskbnVsbGVudHJ5ID49IDB9IHsKCSAgICBzZXQgaSAkbnVsbGVudHJ5CgkgICAgd2hpbGUgeyRpIDwgJHRvZG9sCgkJICAgJiYgW2xpbmRleCAkb2xkdG9kbyAkaV0gPT0gW2xpbmRleCAkdG9kbyAkaV19IHsKCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBpICRvbGRsZXZlbAoJICAgIGlmIHskbGV2ZWwgPj0gJGl9IHsKCQlpbmNyIGkKCSAgICB9Cgl9CglpZiB7JGkgPCAkdG9kb2x9IHsKCSAgICBzZXQgdG9kbyBbbGluc2VydCAkdG9kbyAkaSB7fV0KCSAgICBpZiB7JGxldmVsID49ICRpfSB7CgkJaW5jciBsZXZlbAoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkbGV2ZWwKfQoKcHJvYyBkcmF3Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIHBoYXNlIHRvZG8gbmNoaWxkcmVuIGRhdGVtb2RlIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzdGFydGNvbW1pdHMKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCXNldCBwaGFzZSBpbmNyZHJhdwoJc2V0IHRvZG8gJGlkCglzZXQgc3RhcnRjb21taXRzICRpZAoJaW5pdGdyYXBoCglkcmF3Y29tbWl0bGluZSAwCgl1cGRhdGV0b2RvIDAgJGRhdGVtb2RlCiAgICB9IGVsc2UgewoJaWYgeyRuY2hpbGRyZW4oJGlkKSA9PSAwfSB7CgkgICAgbGFwcGVuZCB0b2RvICRpZAoJICAgIGxhcHBlbmQgc3RhcnRjb21taXRzICRpZAoJfQoJc2V0IGxldmVsIFtkZWNpZGVuZXh0IDFdCglpZiB7JGxldmVsID09IHt9IHx8ICRpZCAhPSBbbGluZGV4ICR0b2RvICRsZXZlbF19IHsKCSAgICByZXR1cm4KCX0KCXdoaWxlIDEgewoJICAgIGRyYXdzbGFudHMKCSAgICBkcmF3Y29tbWl0bGluZSAkbGV2ZWwKCSAgICBpZiB7W3VwZGF0ZXRvZG8gJGxldmVsICRkYXRlbW9kZV19IHsKCQlzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCQlpZiB7JGxldmVsID09IHt9fSBicmVhawoJICAgIH0KCSAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldfSB7CgkJYnJlYWsKCSAgICB9CgkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQlkb3VwZGF0ZQoJCWlmIHskc3RvcHBlZH0gYnJlYWsKCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZmluaXNoY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgcGhhc2UKICAgIGdsb2JhbCBzdGFydGNvbW1pdHMKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvcgoKICAgIGlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJJGNhbnYgZGVsZXRlIGFsbAoJJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiIFwKCSAgICAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dGl0ZW1zCglzZXQgcGhhc2Uge30KICAgIH0gZWxzZSB7CglkcmF3c2xhbnRzCglzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCglkcmF3cmVzdCAkbGV2ZWwgW2xsZW5ndGggJHN0YXJ0Y29tbWl0c10KICAgIH0KICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKICAgICRjdGV4dCBjb25maWcgLWN1cnNvciAkdGV4dGN1cnNvcgp9Cgpwcm9jIGRyYXdncmFwaCB7fSB7CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBzdGFydG1zZWNzIHN0YXJ0Y29tbWl0cyB0b2RvCgogICAgaWYgeyRzdGFydGNvbW1pdHMgPT0ge319IHJldHVybgogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBpbml0Z3JhcGgKICAgIHNldCB0b2RvIFtsaW5kZXggJHN0YXJ0Y29tbWl0cyAwXQogICAgZHJhd3Jlc3QgMCAxCn0KCnByb2MgZHJhd3Jlc3Qge2xldmVsIHN0YXJ0aXh9IHsKICAgIGdsb2JhbCBwaGFzZSBzdG9wcGVkIHJlZGlzcGxheWluZyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBkYXRlbW9kZSBjdXJyZW50cGFyZW50cyB0b2RvCiAgICBnbG9iYWwgbnVtY29tbWl0cwogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcyBzdGFydGNvbW1pdHMgaWRsaW5lCgogICAgaWYgeyRsZXZlbCA+PSAwfSB7CglzZXQgcGhhc2UgZHJhd2dyYXBoCglzZXQgc3RhcnRpZCBbbGluZGV4ICRzdGFydGNvbW1pdHMgJHN0YXJ0aXhdCglzZXQgc3RhcnRsaW5lIC0xCglpZiB7JHN0YXJ0aWQgIT0ge319IHsKCSAgICBzZXQgc3RhcnRsaW5lICRpZGxpbmUoJHN0YXJ0aWQpCgl9Cgl3aGlsZSAxIHsKCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgkgICAgZHJhd2NvbW1pdGxpbmUgJGxldmVsCgkgICAgc2V0IGhhcmQgW3VwZGF0ZXRvZG8gJGxldmVsICRkYXRlbW9kZV0KCSAgICBpZiB7JG51bWNvbW1pdHMgPT0gJHN0YXJ0bGluZX0gewoJCWxhcHBlbmQgdG9kbyAkc3RhcnRpZAoJCXNldCBoYXJkIDEKCQlpbmNyIHN0YXJ0aXgKCQlzZXQgc3RhcnRpZCBbbGluZGV4ICRzdGFydGNvbW1pdHMgJHN0YXJ0aXhdCgkJc2V0IHN0YXJ0bGluZSAtMQoJCWlmIHskc3RhcnRpZCAhPSB7fX0gewoJCSAgICBzZXQgc3RhcnRsaW5lICRpZGxpbmUoJHN0YXJ0aWQpCgkJfQoJICAgIH0KCSAgICBpZiB7JGhhcmR9IHsKCQlzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCgkJaWYgeyRsZXZlbCA8IDB9IGJyZWFrCgkJZHJhd3NsYW50cwoJICAgIH0KCSAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJCXVwZGF0ZQoJCWluY3IgbmV4dHVwZGF0ZSAxMDAKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgcGhhc2Uge30KICAgIHNldCBkcmF3bXNlY3MgW2V4cHIgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzXQogICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKICAgIGlmIHskcmVkaXNwbGF5aW5nfSB7CglpZiB7JHN0b3BwZWQgPT0gMCAmJiBbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJICAgIHNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZQoJfQoJaWYgeyRzdG9wcGVkID09IDF9IHsKCSAgICBzZXQgc3RvcHBlZCAwCgkgICAgYWZ0ZXIgaWRsZSBkcmF3Z3JhcGgKCX0gZWxzZSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgl9CiAgICB9Cn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByICRqKyRmb3VuZHN0cmxlbi0xXV0KCSAgICBzZXQgaSBbZXhwciAkaiArICRmb3VuZHN0cmxlbl0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7fSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbwogICAgZ2xvYmFsIG51bWNvbW1pdHMgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgY2FudiBjYW52MiBjYW52MyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCiAgICB1bm1hcmttYXRjaGVzCiAgICBmb2N1cyAuCiAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudH0KICAgIGlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CglzZXQgZm91bmRzdHJpbmcgW3N0cmluZyB0b2xvd2VyICRmaW5kc3RyaW5nXQogICAgfSBlbHNlIHsKCXNldCBmb3VuZHN0cmluZyAkZmluZHN0cmluZwogICAgfQogICAgc2V0IGZvdW5kc3RybGVuIFtzdHJpbmcgbGVuZ3RoICRmaW5kc3RyaW5nXQogICAgaWYgeyRmb3VuZHN0cmxlbiA9PSAwfSByZXR1cm4KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBvbGRzZWwgLTEKICAgIH0gZWxzZSB7CglzZXQgb2xkc2VsICRzZWxlY3RlZGxpbmUKICAgIH0KICAgIHNldCBkaWRzZWwgMAogICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJc2V0IGlkICRsaW5laWQoJGwpCglzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCglzZXQgZG9lc21hdGNoIDAKCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJICAgIGlmIHskZmluZGxvYyAhPSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgIT0gJHR5fSB7CgkJY29udGludWUKCSAgICB9CgkgICAgc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJICAgIGlmIHskbWF0Y2hlcyA9PSB7fX0gY29udGludWUKCSAgICBzZXQgZG9lc21hdGNoIDEKCSAgICBpZiB7JHR5ID09ICJIZWFkbGluZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjIgJGwgJGYgJGxpbmVudGFnKCRsKSAkbWF0Y2hlcyAkbmFtZWZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJEYXRlIn0gewoJCW1hcmttYXRjaGVzICRjYW52MyAkbCAkZiAkbGluZWR0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0KCX0KCWlmIHskZG9lc21hdGNofSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgkgICAgaWYgeyEkZGlkc2VsICYmICRsID4gJG9sZHNlbH0gewoJCWZpbmRzZWxlY3RsaW5lICRsCgkJc2V0IGRpZHNlbCAxCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRtYXRjaGluZ2xpbmVzID09IHt9fSB7CgliZWxsCiAgICB9IGVsc2VpZiB7ISRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lIFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF0KICAgIH0KfQoKcHJvYyBmaW5kc2VsZWN0bGluZSB7bH0gewogICAgZ2xvYmFsIGZpbmRsb2MgY29tbWVudGVuZCBjdGV4dAogICAgc2VsZWN0bGluZSAkbAogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIgW2xpbmRleCAkbWF0Y2ggMV0gKyAxXQoJICAgICRjdGV4dCB0YWcgYWRkIGZvdW5kICIxLjAgKyAkc3RhcnQgYyIgIjEuMCArICRlbmQgYyIKCX0KICAgIH0KfQoKcHJvYyBmaW5kbmV4dCB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7Cglkb2ZpbmQKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIG1hcmttYXRjaGVzIHtjYW52IGwgc3RyIHRhZyBtYXRjaGVzIGZvbnR9IHsKICAgIHNldCBiYm94IFskY2FudiBiYm94ICR0YWddCiAgICBzZXQgeDAgW2xpbmRleCAkYmJveCAwXQogICAgc2V0IHkwIFtsaW5kZXggJGJib3ggMV0KICAgIHNldCB5MSBbbGluZGV4ICRiYm94IDNdCiAgICBmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCXNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJc2V0IGVuZCBbbGluZGV4ICRtYXRjaCAxXQoJaWYgeyRzdGFydCA+ICRlbmR9IGNvbnRpbnVlCglzZXQgeG9mZiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByICRzdGFydC0xXV1dCglzZXQgeGxlbiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByICRlbmRdXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciAkeDArJHhvZmZdICR5MCBbZXhwciAkeDArJHhsZW4rMl0gJHkxIFwKCQkgICAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KCSRjYW52IGxvd2VyICR0CiAgICB9Cn0KCnByb2MgdW5tYXJrbWF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcwogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIHJvd3RleHR4CiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgc2V0IGwgW2V4cHIge2ludCgoJHkgLSAkY2FudnkwKSAvICRsaW5lc3BjICsgMC41KX1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9CiAgICBpZiB7JHcgZXEgJGNhbnZ9IHsKCWlmIHshW2luZm8gZXhpc3RzIHJvd3RleHR4KCRsKV0gfHwgJHggPCAkcm93dGV4dHgoJGwpfSByZXR1cm4KICAgIH0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwKfQoKcHJvYyBzZWxlY3RsaW5lIHtsfSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBjZmxpc3QgY3VycmVudGlkIHNoYTFlbnRyeSBkaWZmaWRzCiAgICBnbG9iYWwgY29tbWVudGVuZCBzZWVuZmlsZSBpZHRhZ3MKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgaWYgeyFbaW5mbyBleGlzdHMgbGluZWlkKCRsKV0gfHwgIVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CiAgICBzZXQgeSBbZXhwciB7JGNhbnZ5MCArICRsICogJGxpbmVzcGN9XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHl0b3AgW2V4cHIgeyR5IC0gJGxpbmVzcGMgLSAxfV0KICAgIHNldCB5Ym90IFtleHByIHskeSArICRsaW5lc3BjICsgMX1dCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciBbbGluZGV4ICR3bm93IDBdICogJHltYXhdCiAgICBzZXQgd2JvdCBbZXhwciBbbGluZGV4ICR3bm93IDFdICogJHltYXhdCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByICRuZXd0b3AgKiAxLjAgLyAkeW1heF0KICAgIH0KICAgIHNldCBzZWxlY3RlZGxpbmUgJGwKCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICBzZXQgZGlmZmlkcyBbY29uY2F0ICRpZCAkcGFyZW50cygkaWQpXQogICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiBmcm9tIDAKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgW2xpbmRleCAkaW5mbyAyXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgW2xpbmRleCAkaW5mbyA0XVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJUYWdzOiIKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkaW5mbyA1XQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIkNvbW1lbnRzIgogICAgaWYgeyRucGFyZW50cygkaWQpID09IDF9IHsKCXN0YXJ0ZGlmZgogICAgfQogICAgY2F0Y2gge3Vuc2V0IHNlZW5maWxlfQp9Cgpwcm9jIHN0YXJ0ZGlmZiB7fSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGRpZmZpZHMgdHJlZXBlbmRpbmcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGRpZmZpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgl9CiAgICB9IGVsc2UgewoJYWRkdG9jZmxpc3QgJGRpZmZpZHMKICAgIH0KfQoKcHJvYyBzZWxuZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByICRzZWxlY3RlZGxpbmUgKyAkZGlyXQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbAp9Cgpwcm9jIGFkZHRvY2ZsaXN0IHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIHRyZWVkaWZmcyBjZmxpc3QKICAgIGlmIHskaWRzICE9ICRkaWZmaWRzfSB7CglnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCXJldHVybgogICAgfQogICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoJGlkcykgewoJJGNmbGlzdCBpbnNlcnQgZW5kICRmCiAgICB9CiAgICBnZXRibG9iZGlmZnMgJGlkcwp9Cgpwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIHBhcmVudHMgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmZzKCRpZHMpIHt9CiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gInxnaXQtZGlmZi10cmVlIC1yICRwICRpZCIgcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSAiZ2V0dHJlZWRpZmZsaW5lICRnZHRmIHskaWRzfSIKfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIHRyZWVwZW5kaW5nCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJdW5zZXQgdHJlZXBlbmRpbmcKCWFkZHRvY2ZsaXN0ICRpZHMKCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZnMoJGlkcykgJGZpbGUKfQoKcHJvYyBnZXRibG9iZGlmZnMge2lkc30gewogICAgZ2xvYmFsIGRpZmZvcHRzIGJsb2JkaWZmZmQgZW52IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmaW5kZXggZGlmZmZpbGVzdGFydCBuZXh0dXBkYXRlCgogICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQogICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgaWYgW2NhdGNoIHtzZXQgYmRmIFtvcGVuICJ8Z2l0LWRpZmYtdHJlZSAtciAtcCAkcCAkaWQiIHJdfSBlcnJdIHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIGZjb25maWd1cmUgJGJkZiAtYmxvY2tpbmcgMAogICAgc2V0IGJsb2JkaWZmZmQoJGlkcykgJGJkZgogICAgc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKICAgIHNldCBjdXJ0YWdzdGFydCAwLjAKICAgIHNldCBkaWZmaW5kZXggMAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldGJsb2JkaWZmbGluZSB7YmRmIGlkc30gewogICAgZ2xvYmFsIGRpZmZpZHMgYmxvYmRpZmZmZCBjdGV4dCBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0IHNlZW5maWxlCiAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmaW5kZXggZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUKCiAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkYmRmXX0gewoJICAgIGNsb3NlICRiZGYKCSAgICBpZiB7JGlkcyA9PSAkZGlmZmlkcyAmJiAkYmRmID09ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJCXNldCBzZWVuZmlsZSgkY3VyZGlmZnRhZykgMQoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyRpZHMgIT0gJGRpZmZpZHMgfHwgJGJkZiAhPSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7Xi0tLVsgXHRdKyhbXi9dKSovKC4qKX0gJGxpbmUgbWF0Y2ggczEgZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCXNldCBzZWVuZmlsZSgkY3VyZGlmZnRhZykgMQoJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCXNldCBoZWFkZXIgJGZuYW1lCglpZiB7W2luZm8gZXhpc3RzIGRpZmZuZXh0aGVhZF19IHsKCSAgICBzZXQgZm5hbWUgJGRpZmZuZXh0aGVhZAoJICAgIHNldCBoZWFkZXIgIiRkaWZmbmV4dGhlYWQgKCRkaWZmbmV4dG5vdGUpIgoJICAgIHVuc2V0IGRpZmZuZXh0aGVhZAoJfQoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGRpZmZmaWxlc3RhcnQoJGRpZmZpbmRleCkgJGhlcmUKCWluY3IgZGlmZmluZGV4CgkjIHN0YXJ0IG1hcmsgbmFtZXMgYXQgZm1hcmsuMSBmb3IgZmlyc3QgZmlsZQoJJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRkaWZmaW5kZXggJGhlcmUKCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuJGRpZmZpbmRleCBsZWZ0CglzZXQgY3VyZGlmZnRhZyAiZjokZm5hbWUiCgkkY3RleHQgdGFnIGRlbGV0ZSAkY3VyZGlmZnRhZwoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKICAgIH0gZWxzZWlmIHtbc3RyaW5nIHJhbmdlICRsaW5lIDAgMl0gPT0gIisrKyJ9IHsKCSMgbm8gbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHRoaXMKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteQ3JlYXRlZDogKC4qKSBcKChtb2RlOiAqWzAtN10qKVwpfSAkbGluZSBtYXRjaCBmbiBtXX0gewoJc2V0IGRpZmZuZXh0aGVhZCAkZm4KCXNldCBkaWZmbmV4dG5vdGUgImNyZWF0ZWQsIG1vZGUgJG0iCiAgICB9IGVsc2VpZiB7W3N0cmluZyByYW5nZSAkbGluZSAwIDhdID09ICJEZWxldGVkOiAifSB7CglzZXQgZGlmZm5leHRoZWFkIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdCglzZXQgZGlmZm5leHRub3RlICJkZWxldGVkIgogICAgfSBlbHNlaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiL30gJGxpbmUgbWF0Y2ggZm5dfSB7CgkjIHNhdmUgdGhlIGZpbGVuYW1lIGluIGNhc2UgdGhlIG5leHQgdGhpbmcgaXMgIm5ldyBmaWxlIG1vZGUgLi4uIgoJc2V0IGRpZmZuZXh0aGVhZCAkZm4KCXNldCBkaWZmbmV4dG5vdGUgIm1vZGlmaWVkIgogICAgfSBlbHNlaWYge1tyZWdleHAge15uZXcgZmlsZSBtb2RlIChbMC03XSspfSAkbGluZSBtYXRjaCBtXX0gewoJc2V0IGRpZmZuZXh0bm90ZSAibmV3IGZpbGUsIG1vZGUgJG0iCiAgICB9IGVsc2VpZiB7W3N0cmluZyByYW5nZSAkbGluZSAwIDExXSA9PSAiZGVsZXRlZCBmaWxlIn0gewoJc2V0IGRpZmZuZXh0bm90ZSAiZGVsZXRlZCIKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteQEAgLShbMC05XSspLChbMC05XSspIFwrKFswLTldKyksKFswLTldKykgQEAoLiopfSBcCgkJICAgJGxpbmUgbWF0Y2ggZjFsIGYxYyBmMmwgZjJjIHJlc3RdfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXHQiIGh1bmtzZXAKCSRjdGV4dCBpbnNlcnQgZW5kICIgICAgJGYxbCAgICAiIGQwICIgICAgJGYybCAgICAiIGQxCgkkY3RleHQgaW5zZXJ0IGVuZCAiICAgICRyZXN0IFxuIiBodW5rc2VwCiAgICB9IGVsc2UgewoJc2V0IHggW3N0cmluZyByYW5nZSAkbGluZSAwIDBdCglpZiB7JHggPT0gIi0iIHx8ICR4ID09ICIrIn0gewoJICAgIHNldCB0YWcgW2V4cHIgeyR4ID09ICIrIn1dCgkgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZCR0YWcKCX0gZWxzZWlmIHskeCA9PSAiICJ9IHsKCSAgICBzZXQgbGluZSBbc3RyaW5nIHJhbmdlICRsaW5lIDEgZW5kXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgoJfSBlbHNlaWYgeyR4ID09ICJcXCJ9IHsKCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfSBlbHNlIHsKCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCQlzZXQgc2VlbmZpbGUoJGN1cmRpZmZ0YWcpIDEKCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJCXNldCBjdXJkaWZmdGFnIENvbW1lbnRzCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgfQp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3Ige3NldCBpIDB9IHtbaW5mbyBleGlzdHMgZGlmZmZpbGVzdGFydCgkaSldfSB7aW5jciBpfSB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA+ICRoZXJlXX0gewoJICAgICRjdGV4dCB5dmlldyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICBicmVhawoJfQogICAgfQp9Cgpwcm9jIGxpc3Rib3hzZWwge30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCBjdXJyZW50aWQgdHJlZWRpZmZzIHNlZW5maWxlCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBzZWwgW2xzb3J0IFskY2ZsaXN0IGN1cnNlbGVjdGlvbl1dCiAgICBpZiB7JHNlbCBlcSB7fX0gcmV0dXJuCiAgICBzZXQgZmlyc3QgW2xpbmRleCAkc2VsIDBdCiAgICBjYXRjaCB7JGN0ZXh0IHl2aWV3IGZtYXJrLiRmaXJzdH0KfQoKcHJvYyBzZXRjb29yZHMge30gewogICAgZ2xvYmFsIGxpbmVzcGMgY2hhcnNwYyBjYW52eDAgY2FudnkwIG1haW5mb250CiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciAzICsgMC41ICogJGxpbmVzcGNdCiAgICBzZXQgY2FudngwIFtleHByIDMgKyAwLjUgKiAkbGluZXNwY10KfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBzdG9wcGVkIHJlZGlzcGxheWluZyBwaGFzZQogICAgaWYgeyRzdG9wcGVkID4gMX0gcmV0dXJuCiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gcmV0dXJuCiAgICBzZXQgcmVkaXNwbGF5aW5nIDEKICAgIGlmIHskcGhhc2UgPT0gImRyYXdncmFwaCIgfHwgJHBoYXNlID09ICJpbmNyZHJhdyJ9IHsKCXNldCBzdG9wcGVkIDEKICAgIH0gZWxzZSB7CglkcmF3Z3JhcGgKICAgIH0KfQoKcHJvYyBpbmNyZm9udCB7aW5jfSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgdGV4dGZvbnQgc2VsZWN0ZWRsaW5lIGN0ZXh0IGNhbnYgcGhhc2UKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgbmFtZWZvbnQgW2xyZXBsYWNlICRuYW1lZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG5hbWVmb250IDFdICsgJGluY31dXQogICAgc2V0IHRleHRmb250IFtscmVwbGFjZSAkdGV4dGZvbnQgMSAxIFtleHByIHtbbGluZGV4ICR0ZXh0Zm9udCAxXSArICRpbmN9XV0KICAgIHNldGNvb3JkcwogICAgJGN0ZXh0IGNvbmYgLWZvbnQgJHRleHRmb250CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCSRlIGNvbmYgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gewoJJGNhbnYgaXRlbWNvbmYgdGV4dGl0ZW1zIC1mb250ICRtYWluZm9udAogICAgfQogICAgcmVkaXNwbGF5Cn0KCnByb2MgY2xlYXJzaGExIHt9IHsKICAgIGdsb2JhbCBzaGExZW50cnkgc2hhMXN0cmluZwogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaGExc3RyaW5nXSA9PSA0MH0gewoJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgIH0KfQoKcHJvYyBzaGExY2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIHNoYTFidXQKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgogICAgaWYgeyRzdGF0ZSA9PSAibm9ybWFsIn0gewoJJHNoYTFidXQgY29uZiAtc3RhdGUgbm9ybWFsIC1yZWxpZWYgcmFpc2VkIC10ZXh0ICJHb3RvOiAiCiAgICB9IGVsc2UgewoJJHNoYTFidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IC10ZXh0ICJTSEExIElEOiAiCiAgICB9Cn0KCnByb2MgZ290b2NvbW1pdCB7fSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgaWRsaW5lIHRhZ2lkcwogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2UgewoJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglzZWxlY3RsaW5lICRpZGxpbmUoJGlkKQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQwfSR9ICRzaGExc3RyaW5nXX0gewoJc2V0IHR5cGUgIlNIQTEgaWQiCiAgICB9IGVsc2UgewoJc2V0IHR5cGUgIlRhZyIKICAgIH0KICAgIGVycm9yX3BvcHVwICIkdHlwZSAkc2hhMXN0cmluZyBpcyBub3Qga25vd24iCn0KCnByb2MgbGluZWVudGVyIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHJldHVybgogICAgc2V0IGhvdmVyeCAkeAogICAgc2V0IGhvdmVyeSAkeQogICAgc2V0IGhvdmVyaWQgJGlkCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CglhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKICAgIH0KICAgIHNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCn0KCnByb2MgbGluZW1vdGlvbiB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJc2V0IGhvdmVyeCAkeAoJc2V0IGhvdmVyeSAkeQoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJfQoJc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICB9Cn0KCnByb2MgbGluZWxlYXZlIHtpZH0gewogICAgZ2xvYmFsIGhvdmVyaWQgaG92ZXJ0aW1lciBjYW52CgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCSRjYW52IGRlbGV0ZSBob3ZlcgoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJICAgIHVuc2V0IGhvdmVydGltZXIKCX0KCXVuc2V0IGhvdmVyaWQKICAgIH0KfQoKcHJvYyBsaW5laG92ZXIge30gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY2FudiBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjb21taXRpbmZvIG1haW5mb250CgogICAgc2V0IHRleHQgW2xpbmRleCAkY29tbWl0aW5mbygkaG92ZXJpZCkgMF0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeCBbZXhwciB7JGhvdmVyeCArIDIgKiAkbGluZXNwY31dCiAgICBzZXQgeSBbZXhwciB7JGhvdmVyeSArICR5ZnJhYyAqICR5bWF4IC0gJGxpbmVzcGMgLyAyfV0KICAgIHNldCB4MCBbZXhwciB7JHggLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkwIFtleHByIHskeSAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeDEgW2V4cHIgeyR4ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MSBbZXhwciB7JHkgKyAkbGluZXNwYyArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3RhbmdsZSAkeDAgJHkwICR4MSAkeTEgXAoJICAgICAgIC1maWxsIFwjZmZmZjgwIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxIC10YWdzIGhvdmVyXQogICAgJGNhbnYgcmFpc2UgJHQKICAgIHNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeCAkeSAtYW5jaG9yIG53IC10ZXh0ICR0ZXh0IC10YWdzIGhvdmVyXQogICAgJGNhbnYgcmFpc2UgJHQKfQoKcHJvYyBsaW5lY2xpY2sge3ggeSBpZH0gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdGluZm8gY2hpbGRyZW4gY2ZsaXN0IGNhbnYKCiAgICB1bm1hcmttYXRjaGVzCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgICMgZmlsbCB0aGUgZGV0YWlscyBwYW5lIHdpdGggaW5mbyBhYm91dCB0aGlzIGxpbmUKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgJGN0ZXh0IGluc2VydCBlbmQgIlBhcmVudDpcbiAiCiAgICBjYXRjaCB7ZGVzdHJveSAkY3RleHQuJGlkfQogICAgYnV0dG9uICRjdGV4dC4kaWQgLXRleHQgIkdvOiIgLWNvbW1hbmQgInNlbGJ5aWQgJGlkIiBcCgktcGFkeCA0IC1wYWR5IDAKICAgICRjdGV4dCB3aW5kb3cgY3JlYXRlIGVuZCAtd2luZG93ICRjdGV4dC4kaWQgLWFsaWduIGNlbnRlcgogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0W2xpbmRleCAkaW5mbyAwXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0RGF0ZTpcdFtsaW5kZXggJGluZm8gMl1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdElEOlx0JGlkXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglmb3JlYWNoIGNoaWxkICRjaGlsZHJlbigkaWQpIHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gIgoJICAgIGNhdGNoIHtkZXN0cm95ICRjdGV4dC4kY2hpbGR9CgkgICAgYnV0dG9uICRjdGV4dC4kY2hpbGQgLXRleHQgIkdvOiIgLWNvbW1hbmQgInNlbGJ5aWQgJGNoaWxkIiBcCgkJLXBhZHggNCAtcGFkeSAwCgkgICAgJGN0ZXh0IHdpbmRvdyBjcmVhdGUgZW5kIC13aW5kb3cgJGN0ZXh0LiRjaGlsZCAtYWxpZ24gY2VudGVyCgkgICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGNoaWxkKQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdFtsaW5kZXggJGluZm8gMF0iCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAp9Cgpwcm9jIHNlbGJ5aWQge2lkfSB7CiAgICBnbG9iYWwgaWRsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJc2VsZWN0bGluZSAkaWRsaW5lKCRpZCkKICAgIH0KfQoKcHJvYyBtc3RpbWUge30gewogICAgZ2xvYmFsIHN0YXJ0bXN0aW1lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGFydG1zdGltZV19IHsKCXNldCBzdGFydG1zdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICB9CiAgICByZXR1cm4gW2Zvcm1hdCAiJS4zZiIgW2V4cHIgeyhbY2xvY2sgY2xpY2sgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc3RpbWUpIC8gMTAwMC4wfV1dCn0KCnByb2Mgcm93bWVudSB7eCB5IGlkfSB7CiAgICBnbG9iYWwgcm93Y3R4bWVudSBpZGxpbmUgc2VsZWN0ZWRsaW5lIHJvd21lbnVpZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgJGlkbGluZSgkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDAgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMSAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAyIC1zdGF0ZSAkc3RhdGUKICAgIHNldCByb3dtZW51aWQgJGlkCiAgICB0a19wb3B1cCAkcm93Y3R4bWVudSAkeCAkeQp9Cgpwcm9jIGRpZmZ2c3NlbCB7ZGlybn0gewogICAgZ2xvYmFsIHJvd21lbnVpZCBzZWxlY3RlZGxpbmUgbGluZWlkCiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgZGlmZmlkcyBjb21taXRpbmZvCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAkb2xkaWRcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cblRvICAgJG5ld2lkXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgc2V0IGRpZmZpZHMgW2xpc3QgJG5ld2lkICRvbGRpZF0KICAgIHN0YXJ0ZGlmZgp9Cgpwcm9jIG1rcGF0Y2gge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJyZW50aWQgY29tbWl0aW5mbyBwYXRjaHRvcCBwYXRjaG51bQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRpZF19IHJldHVybgogICAgc2V0IG9sZGlkICRjdXJyZW50aWQKICAgIHNldCBvbGRoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIHNldCBuZXdoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgc2V0IHRvcCAucGF0Y2gKICAgIHNldCBwYXRjaHRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiR2VuZXJhdGUgcGF0Y2giCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mcm9tIC10ZXh0ICJGcm9tOiIKICAgIGVudHJ5ICR0b3AuZnJvbXNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9tc2hhMSBpbnNlcnQgMCAkb2xkaWQKICAgICR0b3AuZnJvbXNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5mcm9tICR0b3AuZnJvbXNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmZyb21oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbWhlYWQgaW5zZXJ0IDAgJG9sZGhlYWQKICAgICR0b3AuZnJvbWhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmZyb21oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50byAtdGV4dCAiVG86IgogICAgZW50cnkgJHRvcC50b3NoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b3NoYTEgaW5zZXJ0IDAgJG5ld2lkCiAgICAkdG9wLnRvc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLnRvICR0b3AudG9zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC50b2hlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b2hlYWQgaW5zZXJ0IDAgJG5ld2hlYWQKICAgICR0b3AudG9oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC50b2hlYWQgLXN0aWNreSB3CiAgICBidXR0b24gJHRvcC5yZXYgLXRleHQgIlJldmVyc2UiIC1jb21tYW5kIG1rcGF0Y2hyZXYgLXBhZHggNQogICAgZ3JpZCAkdG9wLnJldiB4IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAicGF0Y2gkcGF0Y2hudW0ucGF0Y2giXQogICAgaW5jciBwYXRjaG51bQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkdlbmVyYXRlIiAtY29tbWFuZCBta3BhdGNoZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rcGF0Y2hjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIG1rcGF0Y2hyZXYge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG9sZGhlYWQgWyRwYXRjaHRvcC5mcm9taGVhZCBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IG5ld2hlYWQgWyRwYXRjaHRvcC50b2hlYWQgZ2V0XQogICAgZm9yZWFjaCBlIFtsaXN0IGZyb21zaGExIGZyb21oZWFkIHRvc2hhMSB0b2hlYWRdIFwKCSAgICB2IFtsaXN0ICRuZXdpZCAkbmV3aGVhZCAkb2xkaWQgJG9sZGhlYWRdIHsKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSBub3JtYWwKCSRwYXRjaHRvcC4kZSBkZWxldGUgMCBlbmQKCSRwYXRjaHRvcC4kZSBpbnNlcnQgMCAkdgoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICB9Cn0KCnByb2MgbWtwYXRjaGdvIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgZm5hbWUgWyRwYXRjaHRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIGdpdC1kaWZmLXRyZWUgLXAgJG9sZGlkICRuZXdpZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyBwYXRjaDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWtwYXRjaGNhbiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rdGFnIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgbWt0YWd0b3AgY29tbWl0aW5mbwoKICAgIHNldCB0b3AgLm1ha2V0YWcKICAgIHNldCBta3RhZ3RvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiQ3JlYXRlIHRhZyIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50bGFiIC10ZXh0ICJUYWcgbmFtZToiCiAgICBlbnRyeSAkdG9wLnRhZyAtd2lkdGggNjAKICAgIGdyaWQgJHRvcC50bGFiICR0b3AudGFnIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBta3RhZ2dvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3RhZ2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnRhZwp9Cgpwcm9jIGRvbWt0YWcge30gewogICAgZ2xvYmFsIG1rdGFndG9wIGVudiB0YWdpZHMgaWR0YWdzCiAgICBnbG9iYWwgaWRwb3MgaWRsaW5lIGxpbmVodGFnIGNhbnYgc2VsZWN0ZWRsaW5lCgogICAgc2V0IGlkIFskbWt0YWd0b3Auc2hhMSBnZXRdCiAgICBzZXQgdGFnIFskbWt0YWd0b3AudGFnIGdldF0KICAgIGlmIHskdGFnID09IHt9fSB7CgllcnJvcl9wb3B1cCAiTm8gdGFnIG5hbWUgc3BlY2lmaWVkIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkdGFnKV19IHsKCWVycm9yX3BvcHVwICJUYWcgXCIkdGFnXCIgYWxyZWFkeSBleGlzdHMiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbY2F0Y2ggewoJc2V0IGRpciAiLmdpdCIKCWlmIHtbaW5mbyBleGlzdHMgZW52KEdJVF9ESVIpXX0gewoJICAgIHNldCBkaXIgJGVudihHSVRfRElSKQoJfQoJc2V0IGZuYW1lIFtmaWxlIGpvaW4gJGRpciAicmVmcy90YWdzIiAkdGFnXQoJc2V0IGYgW29wZW4gJGZuYW1lIHddCglwdXRzICRmICRpZAoJY2xvc2UgJGYKICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHRhZzogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCB0YWdpZHMoJHRhZykgJGlkCiAgICBsYXBwZW5kIGlkdGFncygkaWQpICR0YWcKICAgICRjYW52IGRlbGV0ZSB0YWcuJGlkCiAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQogICAgJGNhbnYgY29vcmRzICRsaW5laHRhZygkaWRsaW5lKCRpZCkpICR4dCBbbGluZGV4ICRpZHBvcygkaWQpIDJdCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHNlbGVjdGVkbGluZSA9PSAkaWRsaW5lKCRpZCl9IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZQogICAgfQp9Cgpwcm9jIG1rdGFnY2FuIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRta3RhZ3RvcH0KICAgIHVuc2V0IG1rdGFndG9wCn0KCnByb2MgbWt0YWdnbyB7fSB7CiAgICBkb21rdGFnCiAgICBta3RhZ2Nhbgp9Cgpwcm9jIHdyaXRlY29tbWl0IHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAoKICAgIHNldCB0b3AgLndyaXRlY29tbWl0CiAgICBzZXQgd3Jjb210b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmNsYWIgLXRleHQgIkNvbW1hbmQ6IgogICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKICAgIGdyaWQgJHRvcC5jbGFiICR0b3AuY21kIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgImNvbW1pdC1bc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA2XSJdCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiV3JpdGUiIC1jb21tYW5kIHdyY29tZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHdyY29tY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyB3cmNvbWdvIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIHNldCBpZCBbJHdyY29tdG9wLnNoYTEgZ2V0XQogICAgc2V0IGNtZCAiZWNobyAkaWQgfCBbJHdyY29tdG9wLmNtZCBnZXRdIgogICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAkY21kID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHdyaXRpbmcgY29tbWl0OiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyB3cmNvbWNhbiB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIGRvcXVpdCB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZAogICAgc2V0IHN0b3BwZWQgMTAwCiAgICBkZXN0cm95IC4KfQoKIyBkZWZhdWx0cy4uLgpzZXQgZGF0ZW1vZGUgMApzZXQgYm9sZG5hbWVzIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9CgpzZXQgbmFtZWZvbnQgJG1haW5mb250CmlmIHskYm9sZG5hbWVzfSB7CiAgICBsYXBwZW5kIG5hbWVmb250IGJvbGQKfQoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWIiIHsgc2V0IGJvbGRuYW1lcyAxIH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCnNldCBzdG9wcGVkIDAKc2V0IHJlZGlzcGxheWluZyAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cKcmVhZHJlZnMKZ2V0Y29tbWl0cyAkcmV2dHJlZWFyZ3MK