IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBnZXRjb21taXRzIHtyYXJnc30gewogICAgZ2xvYmFsIGNvbW1pdHMgY29tbWZkIHBoYXNlIGNhbnYgbWFpbmZvbnQgZW52CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvciBsZWZ0b3ZlcgoKICAgICMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgogICAgc2V0IGdpdGRpciBbZ2l0ZGlyXQogICAgaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkZ2l0ZGlyXX0gewoJZXJyb3JfcG9wdXAgIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKCWV4aXQgMQogICAgfQogICAgc2V0IGNvbW1pdHMge30KICAgIHNldCBwaGFzZSBnZXRjb21taXRzCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciAkc3RhcnRtc2VjcyArIDEwMF0KICAgIHNldCBuY211cGRhdGUgMQogICAgaWYgW2NhdGNoIHsKCXNldCBwYXJzZV9hcmdzIFtjb25jYXQgLS1kZWZhdWx0IEhFQUQgJHJhcmdzXQoJc2V0IHBhcnNlZF9hcmdzIFtzcGxpdCBbZXZhbCBleGVjIGdpdC1yZXYtcGFyc2UgJHBhcnNlX2FyZ3NdICJcbiJdCiAgICB9XSB7CgkjIGlmIGdpdC1yZXYtcGFyc2UgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4uLgoJaWYgeyRyYXJncyA9PSB7fX0gewoJICAgIHNldCByYXJncyBIRUFECgl9CglzZXQgcGFyc2VkX2FyZ3MgJHJhcmdzCiAgICB9CiAgICBpZiBbY2F0Y2ggewoJc2V0IGNvbW1mZCBbb3BlbiAifGdpdC1yZXYtbGlzdCAtLWhlYWRlciAtLXRvcG8tb3JkZXIgLS1wYXJlbnRzICRwYXJzZWRfYXJncyIgcl0KICAgIH0gZXJyXSB7CglwdXRzIHN0ZGVyciAiRXJyb3IgZXhlY3V0aW5nIGdpdC1yZXYtbGlzdDogJGVyciIKCWV4aXQgMQogICAgfQogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGxmCiAgICBmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgJGNhbnYgZGVsZXRlIGFsbAogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAp9Cgpwcm9jIGdldGNvbW1pdGxpbmVzIHtjb21tZmR9ICB7CiAgICBnbG9iYWwgY29tbWl0cyBwYXJlbnRzIGNkYXRlIGNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBoYXNlIGNvbW1pdGluZm8gbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIGxlZnRvdmVyCgogICAgc2V0IHN0dWZmIFtyZWFkICRjb21tZmRdCiAgICBpZiB7JHN0dWZmID09IHt9fSB7CglpZiB7IVtlb2YgJGNvbW1mZF19IHJldHVybgoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDEKCWlmIHshW2NhdGNoIHtjbG9zZSAkY29tbWZkfSBlcnJdfSB7CgkgICAgYWZ0ZXIgaWRsZSBmaW5pc2hjb21taXRzCgkgICAgcmV0dXJuCgl9CglpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJICAgIHNldCBlcnIgXAp7R2l0azogZXJyb3IgcmVhZGluZyBjb21taXRzOiBiYWQgYXJndW1lbnRzIHRvIGdpdC1yZXYtbGlzdC4KKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0LXJldi1saXN0CnRvIGFsbG93IHNlbGVjdGlvbiBvZiBjb21taXRzIHRvIGJlIGRpc3BsYXllZC4pfQoJfSBlbHNlIHsKCSAgICBzZXQgZXJyICJFcnJvciByZWFkaW5nIGNvbW1pdHM6ICRlcnIiCgl9CgllcnJvcl9wb3B1cCAkZXJyCglleGl0IDEKICAgIH0KICAgIHNldCBzdGFydCAwCiAgICB3aGlsZSAxIHsKCXNldCBpIFtzdHJpbmcgZmlyc3QgIlwwIiAkc3R1ZmYgJHN0YXJ0XQoJaWYgeyRpIDwgMH0gewoJICAgIGFwcGVuZCBsZWZ0b3ZlciBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIHJldHVybgoJfQoJc2V0IGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IFtleHByIHskaSAtIDF9XV0KCWlmIHskc3RhcnQgPT0gMH0gewoJICAgIHNldCBjbWl0ICIkbGVmdG92ZXIkY21pdCIKCSAgICBzZXQgbGVmdG92ZXIge30KCX0KCXNldCBzdGFydCBbZXhwciB7JGkgKyAxfV0KCXNldCBqIFtzdHJpbmcgZmlyc3QgIlxuIiAkY21pdF0KCXNldCBvayAwCglpZiB7JGogPj0gMH0gewoJICAgIHNldCBpZHMgW3N0cmluZyByYW5nZSAkY21pdCAwIFtleHByIHskaiAtIDF9XV0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYgeyFbcmVnZXhwIHteWzAtOWEtZl17NDB9JH0gJGlkXX0gewoJCSAgICBzZXQgb2sgMAoJCSAgICBicmVhawoJCX0KCSAgICB9Cgl9CglpZiB7ISRva30gewoJICAgIHNldCBzaG9ydGNtaXQgJGNtaXQKCSAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNob3J0Y21pdF0gPiA4MH0gewoJCXNldCBzaG9ydGNtaXQgIltzdHJpbmcgcmFuZ2UgJHNob3J0Y21pdCAwIDgwXS4uLiIKCSAgICB9CgkgICAgZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1yZXYtbGlzdCBvdXRwdXQ6IHskc2hvcnRjbWl0fSIKCSAgICBleGl0IDEKCX0KCXNldCBpZCBbbGluZGV4ICRpZHMgMF0KCXNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCWxhcHBlbmQgY29tbWl0cyAkaWQKCXNldCBjb21taXRsaXN0ZWQoJGlkKSAxCglwYXJzZWNvbW1pdCAkaWQgJGNtaXQgMSBbbHJhbmdlICRpZHMgMSBlbmRdCglkcmF3Y29tbWl0ICRpZAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCSAgICBkb3VwZGF0ZSAxCgl9Cgl3aGlsZSB7JHJlZGlzcGxheWluZ30gewoJICAgIHNldCByZWRpc3BsYXlpbmcgMAoJICAgIGlmIHskc3RvcHBlZCA9PSAxfSB7CgkJc2V0IHN0b3BwZWQgMAoJCXNldCBwaGFzZSAiZ2V0Y29tbWl0cyIKCQlmb3JlYWNoIGlkICRjb21taXRzIHsKCQkgICAgZHJhd2NvbW1pdCAkaWQKCQkgICAgaWYgeyRzdG9wcGVkfSBicmVhawoJCSAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJCQlkb3VwZGF0ZSAxCgkJICAgIH0KCQl9CgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIGRvdXBkYXRlIHtyZWFkaW5nfSB7CiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cyBuY211cGRhdGUKCiAgICBpZiB7JHJlYWRpbmd9IHsKCWZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlIHt9CiAgICB9CiAgICB1cGRhdGUKICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KICAgIGlmIHskbnVtY29tbWl0cyA8IDEwMH0gewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxfV0KICAgIH0gZWxzZWlmIHskbnVtY29tbWl0cyA8IDEwMDAwfSB7CglzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDEwfV0KICAgIH0gZWxzZSB7CglzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDEwMH1dCiAgICB9CiAgICBpZiB7JHJlYWRpbmd9IHsKCWZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlIFtsaXN0IGdldGNvbW1pdGxpbmVzICRjb21tZmRdCiAgICB9Cn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIFtjYXRjaCB7c2V0IGNvbnRlbnRzIFtleGVjIGdpdC1jYXQtZmlsZSBjb21taXQgJGlkXX1dIHJldHVybgogICAgcGFyc2Vjb21taXQgJGlkICRjb250ZW50cyAwIHt9Cn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZCBvbGRzfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjaGlsZHJlbiBuY2hpbGRyZW4gcGFyZW50cyBucGFyZW50cyBjZGF0ZSBuY2xlZnQKCiAgICBzZXQgaW5oZHIgMQogICAgc2V0IGNvbW1lbnQge30KICAgIHNldCBoZWFkbGluZSB7fQogICAgc2V0IGF1bmFtZSB7fQogICAgc2V0IGF1ZGF0ZSB7fQogICAgc2V0IGNvbW5hbWUge30KICAgIHNldCBjb21kYXRlIHt9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBuY2hpbGRyZW4oJGlkKV19IHsKCXNldCBjaGlsZHJlbigkaWQpIHt9CglzZXQgbmNoaWxkcmVuKCRpZCkgMAoJc2V0IG5jbGVmdCgkaWQpIDAKICAgIH0KICAgIHNldCBwYXJlbnRzKCRpZCkgJG9sZHMKICAgIHNldCBucGFyZW50cygkaWQpIFtsbGVuZ3RoICRvbGRzXQogICAgZm9yZWFjaCBwICRvbGRzIHsKCWlmIHshW2luZm8gZXhpc3RzIG5jaGlsZHJlbigkcCldfSB7CgkgICAgc2V0IGNoaWxkcmVuKCRwKSBbbGlzdCAkaWRdCgkgICAgc2V0IG5jaGlsZHJlbigkcCkgMQoJICAgIHNldCBuY2xlZnQoJHApIDEKCX0gZWxzZWlmIHtbbHNlYXJjaCAtZXhhY3QgJGNoaWxkcmVuKCRwKSAkaWRdIDwgMH0gewoJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHApICRpZAoJICAgIGluY3IgbmNoaWxkcmVuKCRwKQoJICAgIGluY3IgbmNsZWZ0KCRwKQoJfQogICAgfQogICAgZm9yZWFjaCBsaW5lIFtzcGxpdCAkY29udGVudHMgIlxuIl0gewoJaWYgeyRpbmhkcn0gewoJICAgIGlmIHskbGluZSA9PSB7fX0gewoJCXNldCBpbmhkciAwCgkgICAgfSBlbHNlIHsKCQlzZXQgdGFnIFtsaW5kZXggJGxpbmUgMF0KCQlpZiB7JHRhZyA9PSAiYXV0aG9yIn0gewoJCSAgICBzZXQgeCBbZXhwciB7W2xsZW5ndGggJGxpbmVdIC0gMn1dCgkJICAgIHNldCBhdWRhdGUgW2xpbmRleCAkbGluZSAkeF0KCQkgICAgc2V0IGF1bmFtZSBbbHJhbmdlICRsaW5lIDEgW2V4cHIgeyR4IC0gMX1dXQoJCX0gZWxzZWlmIHskdGFnID09ICJjb21taXR0ZXIifSB7CgkJICAgIHNldCB4IFtleHByIHtbbGxlbmd0aCAkbGluZV0gLSAyfV0KCQkgICAgc2V0IGNvbWRhdGUgW2xpbmRleCAkbGluZSAkeF0KCQkgICAgc2V0IGNvbW5hbWUgW2xyYW5nZSAkbGluZSAxIFtleHByIHskeCAtIDF9XV0KCQl9CgkgICAgfQoJfSBlbHNlIHsKCSAgICBpZiB7JGNvbW1lbnQgPT0ge319IHsKCQlzZXQgaGVhZGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQoJICAgIH0gZWxzZSB7CgkJYXBwZW5kIGNvbW1lbnQgIlxuIgoJICAgIH0KCSAgICBpZiB7ISRsaXN0ZWR9IHsKCQkjIGdpdC1yZXYtbGlzdCBpbmRlbnRzIHRoZSBjb21tZW50IGJ5IDQgc3BhY2VzOwoJCSMgaWYgd2UgZ290IHRoaXMgdmlhIGdpdC1jYXQtZmlsZSwgYWRkIHRoZSBpbmRlbnRhdGlvbgoJCWFwcGVuZCBjb21tZW50ICIgICAgIgoJICAgIH0KCSAgICBhcHBlbmQgY29tbWVudCAkbGluZQoJfQogICAgfQogICAgaWYgeyRhdWRhdGUgIT0ge319IHsKCXNldCBhdWRhdGUgW2Nsb2NrIGZvcm1hdCAkYXVkYXRlIC1mb3JtYXQgIiVZLSVtLSVkICVIOiVNOiVTIl0KICAgIH0KICAgIGlmIHskY29tZGF0ZSAhPSB7fX0gewoJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKCXNldCBjb21kYXRlIFtjbG9jayBmb3JtYXQgJGNvbWRhdGUgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQogICAgfQogICAgc2V0IGNvbW1pdGluZm8oJGlkKSBbbGlzdCAkaGVhZGxpbmUgJGF1bmFtZSAkYXVkYXRlIFwKCQkJICAgICAkY29tbmFtZSAkY29tZGF0ZSAkY29tbWVudF0KfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKCiAgICBzZXQgdGFncyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZiBbZ2l0ZGlyXS9yZWZzL3RhZ3MvKl0KICAgIGZvcmVhY2ggZiAkdGFncyB7CgljYXRjaCB7CgkgICAgc2V0IGZkIFtvcGVuICRmIHJdCgkgICAgc2V0IGxpbmUgW3JlYWQgJGZkXQoJICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCQlzZXQgZGlyZWN0IFtmaWxlIHRhaWwgJGZdCgkJc2V0IHRhZ2lkcygkZGlyZWN0KSAkaWQKCQlsYXBwZW5kIGlkdGFncygkaWQpICRkaXJlY3QKCQlzZXQgdGFnYmxvYiBbZXhlYyBnaXQtY2F0LWZpbGUgdGFnICRpZF0KCQlzZXQgY29udGVudHMgW3NwbGl0ICR0YWdibG9iICJcbiJdCgkJc2V0IG9iaiB7fQoJCXNldCB0eXBlIHt9CgkJc2V0IHRhZyB7fQoJCWZvcmVhY2ggbCAkY29udGVudHMgewoJCSAgICBpZiB7JGwgPT0ge319IGJyZWFrCgkJICAgIHN3aXRjaCAtLSBbbGluZGV4ICRsIDBdIHsKCQkJIm9iamVjdCIge3NldCBvYmogW2xpbmRleCAkbCAxXX0KCQkJInR5cGUiIHtzZXQgdHlwZSBbbGluZGV4ICRsIDFdfQoJCQkidGFnIiB7c2V0IHRhZyBbc3RyaW5nIHJhbmdlICRsIDQgZW5kXX0KCQkgICAgfQoJCX0KCQlpZiB7JG9iaiAhPSB7fSAmJiAkdHlwZSA9PSAiY29tbWl0IiAmJiAkdGFnICE9IHt9fSB7CgkJICAgIHNldCB0YWdpZHMoJHRhZykgJG9iagoJCSAgICBsYXBwZW5kIGlkdGFncygkb2JqKSAkdGFnCgkJICAgIHNldCB0YWdjb250ZW50cygkdGFnKSAkdGFnYmxvYgoJCX0KCSAgICB9CgkgICAgY2xvc2UgJGZkCgl9CiAgICB9CiAgICBzZXQgaGVhZHMgW2dsb2IgLW5vY29tcGxhaW4gLXR5cGVzIGYgW2dpdGRpcl0vcmVmcy9oZWFkcy8qXQogICAgZm9yZWFjaCBmICRoZWFkcyB7CgljYXRjaCB7CgkgICAgc2V0IGZkIFtvcGVuICRmIHJdCgkgICAgc2V0IGxpbmUgW3JlYWQgJGZkIDQwXQoJICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCQlzZXQgaGVhZCBbZmlsZSB0YWlsICRmXQoJCXNldCBoZWFkaWRzKCRoZWFkKSAkbGluZQoJCWxhcHBlbmQgaWRoZWFkcygkbGluZSkgJGhlYWQKCSAgICB9CgkgICAgY2xvc2UgJGZkCgl9CiAgICB9CiAgICByZWFkb3RoZXJyZWZzIHJlZnMge30ge3RhZ3MgaGVhZHN9Cn0KCnByb2MgcmVhZG90aGVycmVmcyB7YmFzZSBkbmFtZSBleGNsfSB7CiAgICBnbG9iYWwgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnMKCiAgICBzZXQgZ2l0IFtnaXRkaXJdCiAgICBzZXQgZmlsZXMgW2dsb2IgLW5vY29tcGxhaW4gLXR5cGVzIGYgW2ZpbGUgam9pbiAkZ2l0ICRiYXNlICpdXQogICAgZm9yZWFjaCBmICRmaWxlcyB7CgljYXRjaCB7CgkgICAgc2V0IGZkIFtvcGVuICRmIHJdCgkgICAgc2V0IGxpbmUgW3JlYWQgJGZkIDQwXQoJICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCQlzZXQgbmFtZSAiJGRuYW1lW2ZpbGUgdGFpbCAkZl0iCgkJc2V0IG90aGVycmVmaWRzKCRuYW1lKSAkaWQKCQlsYXBwZW5kIGlkb3RoZXJyZWZzKCRpZCkgJG5hbWUKCSAgICB9CgkgICAgY2xvc2UgJGZkCgl9CiAgICB9CiAgICBzZXQgZGlycyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZCBbZmlsZSBqb2luICRnaXQgJGJhc2UgKl1dCiAgICBmb3JlYWNoIGQgJGRpcnMgewoJc2V0IGRpciBbZmlsZSB0YWlsICRkXQoJaWYge1tsc2VhcmNoIC1leGFjdCAkZXhjbCAkZGlyXSA+PSAwfSBjb250aW51ZQoJcmVhZG90aGVycmVmcyBbZmlsZSBqb2luICRiYXNlICRkaXJdICIkZG5hbWUkZGlyLyIge30KICAgIH0KfQoKcHJvYyBlcnJvcl9wb3B1cCBtc2cgewogICAgc2V0IHcgLmVycm9yCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCiAgICB0a3dhaXQgd2luZG93ICR3Cn0KCnByb2MgbWFrZXdpbmRvdyB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0IHRleHRmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IGdhdWR5ZGlmZiBtZXJnZW1heAoKICAgIG1lbnUgLmJhcgogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkZpbGUiIC1tZW51IC5iYXIuZmlsZQogICAgbWVudSAuYmFyLmZpbGUKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlcmVhZCByZWZlcmVuY2VzIiAtY29tbWFuZCByZXJlYWRyZWZzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIG1lbnUgLmJhci5oZWxwCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiSGVscCIgLW1lbnUgLmJhci5oZWxwCiAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dCBnaXRrIiAtY29tbWFuZCBhYm91dAogICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGdlb21ldHJ5KGNhbnYxKV19IHsKCXNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIgNDUgKiAkY2hhcnNwY10KCXNldCBnZW9tZXRyeShjYW52MikgW2V4cHIgMzAgKiAkY2hhcnNwY10KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgMTUgKiAkY2hhcnNwY10KCXNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgMjUgKiAkbGluZXNwYyArIDRdCglzZXQgZ2VvbWV0cnkoY3RleHR3KSA4MAoJc2V0IGdlb21ldHJ5KGN0ZXh0aCkgMzAKCXNldCBnZW9tZXRyeShjZmxpc3R3KSAzMAogICAgfQogICAgcGFuZWR3aW5kb3cgLmN0b3AgLW9yaWVudCB2ZXJ0aWNhbAogICAgaWYge1tpbmZvIGV4aXN0cyBnZW9tZXRyeSh3aWR0aCldfSB7CgkuY3RvcCBjb25mIC13aWR0aCAkZ2VvbWV0cnkod2lkdGgpIC1oZWlnaHQgJGdlb21ldHJ5KGhlaWdodCkKCXNldCB0ZXh0aCBbZXhwciB7JGdlb21ldHJ5KGhlaWdodCkgLSAkZ2VvbWV0cnkoY2FudmgpIC0gNTZ9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0aCkgW2V4cHIgeygkdGV4dGggLSA4KSAvCgkJCQkgICAgW2ZvbnQgbWV0cmljcyAkdGV4dGZvbnQgLWxpbmVzcGFjZV19XQogICAgfQogICAgZnJhbWUgLmN0b3AudG9wCiAgICBmcmFtZSAuY3RvcC50b3AuYmFyCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHNldCBjc2Nyb2xsIC5jdG9wLnRvcC5jc2IKICAgIHNjcm9sbGJhciAkY3Njcm9sbCAtY29tbWFuZCB7YWxsY2FudnMgeXZpZXd9IC1oaWdobGlnaHR0aGlja25lc3MgMAogICAgcGFjayAkY3Njcm9sbCAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYW5lZHdpbmRvdyAuY3RvcC50b3AuY2xpc3QgLW9yaWVudCBob3Jpem9udGFsIC1zYXNocGFkIDAgLWhhbmRsZXNpemUgNAogICAgcGFjayAuY3RvcC50b3AuY2xpc3QgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcCBhZGQgLmN0b3AudG9wCiAgICBzZXQgY2FudiAuY3RvcC50b3AuY2xpc3QuY2FudgogICAgY2FudmFzICRjYW52IC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYxKSBcCgktYmcgd2hpdGUgLWJkIDAgXAoJLXlzY3JvbGxpbmNyICRsaW5lc3BjIC15c2Nyb2xsY29tbWFuZCAiJGNzY3JvbGwgc2V0IgogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudgogICAgc2V0IGNhbnYyIC5jdG9wLnRvcC5jbGlzdC5jYW52MgogICAgY2FudmFzICRjYW52MiAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MikgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjIKICAgIHNldCBjYW52MyAuY3RvcC50b3AuY2xpc3QuY2FudjMKICAgIGNhbnZhcyAkY2FudjMgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjMpIFwKCS1iZyB3aGl0ZSAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYzCiAgICBiaW5kIC5jdG9wLnRvcC5jbGlzdCA8Q29uZmlndXJlPiB7cmVzaXplY2xpc3RwYW5lcyAlVyAld30KCiAgICBzZXQgc2hhMWVudHJ5IC5jdG9wLnRvcC5iYXIuc2hhMQogICAgc2V0IGVudHJpZXMgJHNoYTFlbnRyeQogICAgc2V0IHNoYTFidXQgLmN0b3AudG9wLmJhci5zaGExbGFiZWwKICAgIGJ1dHRvbiAkc2hhMWJ1dCAtdGV4dCAiU0hBMSBJRDogIiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IFwKCS1jb21tYW5kIGdvdG9jb21taXQgLXdpZHRoIDgKICAgICRzaGExYnV0IGNvbmYgLWRpc2FibGVkZm9yZWdyb3VuZCBbJHNoYTFidXQgY2dldCAtZm9yZWdyb3VuZF0KICAgIHBhY2sgLmN0b3AudG9wLmJhci5zaGExbGFiZWwgLXNpZGUgbGVmdAogICAgZW50cnkgJHNoYTFlbnRyeSAtd2lkdGggNDAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgc2hhMXN0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIHNoYTFzdHJpbmcgd3JpdGUgc2hhMWNoYW5nZQogICAgcGFjayAkc2hhMWVudHJ5IC1zaWRlIGxlZnQgLXBhZHkgMgoKICAgIGltYWdlIGNyZWF0ZSBiaXRtYXAgYm0tbGVmdCAtZGF0YSB7CgkjZGVmaW5lIGxlZnRfd2lkdGggMTYKCSNkZWZpbmUgbGVmdF9oZWlnaHQgMTYKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxlZnRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MGUsIDB4MDAsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MGUsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDM4LCAweDAwLCAweDcwLCAweDAwLCAweGUwLCAweDAwLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGltYWdlIGNyZWF0ZSBiaXRtYXAgYm0tcmlnaHQgLWRhdGEgewoJI2RlZmluZSByaWdodF93aWR0aCAxNgoJI2RlZmluZSByaWdodF9oZWlnaHQgMTYKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJpZ2h0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ODAsIDB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MWMsCgkweDAwLCAweDM4LCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDAwLCAweDM4LCAweDAwLCAweDFjLAoJMHgwMCwgMHgwZSwgMHgwMCwgMHgwNywgMHg4MCwgMHgwMywgMHhjMCwgMHgwMX07CiAgICB9CiAgICBidXR0b24gLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1pbWFnZSBibS1sZWZ0IC1jb21tYW5kIGdvYmFjayBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIubGVmdGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IC1pbWFnZSBibS1yaWdodCAtY29tbWFuZCBnb2ZvcncgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQoKICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmZpbmRidXQgLXRleHQgIkZpbmQiIC1jb21tYW5kIGRvZmluZAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmRidXQgLXNpZGUgbGVmdAogICAgc2V0IGZpbmRzdHJpbmcge30KICAgIHNldCBmc3RyaW5nIC5jdG9wLnRvcC5iYXIuZmluZHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRmc3RyaW5nCiAgICBlbnRyeSAkZnN0cmluZyAtd2lkdGggMzAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgZmluZHN0cmluZwogICAgcGFjayAkZnN0cmluZyAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4CiAgICBzZXQgZmluZHR5cGUgRXhhY3QKICAgIHNldCBmaW5kdHlwZW1lbnUgW3RrX29wdGlvbk1lbnUgLmN0b3AudG9wLmJhci5maW5kdHlwZSBcCgkJCSAgZmluZHR5cGUgRXhhY3QgSWduQ2FzZSBSZWdleHBdCiAgICBzZXQgZmluZGxvYyAiQWxsIGZpZWxkcyIKICAgIHRrX29wdGlvbk1lbnUgLmN0b3AudG9wLmJhci5maW5kbG9jIGZpbmRsb2MgIkFsbCBmaWVsZHMiIEhlYWRsaW5lIFwKCUNvbW1lbnRzIEF1dGhvciBDb21taXR0ZXIgRmlsZXMgUGlja2F4ZQogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmRsb2MgLXNpZGUgcmlnaHQKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kdHlwZSAtc2lkZSByaWdodAogICAgIyBmb3IgbWFraW5nIHN1cmUgdHlwZT09RXhhY3Qgd2hlbmV2ZXIgbG9jPT1QaWNrYXhlCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgZmluZGxvYyB3cml0ZSBmaW5kbG9jY2hhbmdlCgogICAgcGFuZWR3aW5kb3cgLmN0b3AuY2RldCAtb3JpZW50IGhvcml6b250YWwKICAgIC5jdG9wIGFkZCAuY3RvcC5jZGV0CiAgICBmcmFtZSAuY3RvcC5jZGV0LmxlZnQKICAgIHNldCBjdGV4dCAuY3RvcC5jZGV0LmxlZnQuY3RleHQKICAgIHRleHQgJGN0ZXh0IC1iZyB3aGl0ZSAtc3RhdGUgZGlzYWJsZWQgLWZvbnQgJHRleHRmb250IFwKCS13aWR0aCAkZ2VvbWV0cnkoY3RleHR3KSAtaGVpZ2h0ICRnZW9tZXRyeShjdGV4dGgpIFwKCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5sZWZ0LnNiIHNldCIgLXdyYXAgbm9uZQogICAgc2Nyb2xsYmFyIC5jdG9wLmNkZXQubGVmdC5zYiAtY29tbWFuZCAiJGN0ZXh0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY3RleHQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5sZWZ0CgogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0gLWJhY2sgIiNhYWFhYWEiCiAgICBpZiB7JGdhdWR5ZGlmZn0gewoJJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWJhY2sgYmx1ZSAtZm9yZSB3aGl0ZQoJJGN0ZXh0IHRhZyBjb25mIGQwIC1iYWNrICIjZmY4MDgwIgoJJGN0ZXh0IHRhZyBjb25mIGQxIC1iYWNrIGdyZWVuCiAgICB9IGVsc2UgewoJJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmUgYmx1ZQoJJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIHJlZAoJJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlICIjMDBhMDAwIgoJJGN0ZXh0IHRhZyBjb25mIG0wIC1mb3JlIHJlZAoJJGN0ZXh0IHRhZyBjb25mIG0xIC1mb3JlIGJsdWUKCSRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgoJJGN0ZXh0IHRhZyBjb25mIG0zIC1mb3JlIHB1cnBsZQoJJGN0ZXh0IHRhZyBjb25mIG00IC1mb3JlIGJyb3duCgkkY3RleHQgdGFnIGNvbmYgbW1heCAtZm9yZSBkYXJrZ3JleQoJc2V0IG1lcmdlbWF4IDUKCSRjdGV4dCB0YWcgY29uZiBtcmVzdWx0IC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCgkkY3RleHQgdGFnIGNvbmYgbXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQoJJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdwogICAgfQoKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQKICAgIHNldCBjZmxpc3QgLmN0b3AuY2RldC5yaWdodC5jZmlsZXMKICAgIGxpc3Rib3ggJGNmbGlzdCAtYmcgd2hpdGUgLXNlbGVjdG1vZGUgZXh0ZW5kZWQgLXdpZHRoICRnZW9tZXRyeShjZmxpc3R3KSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQucmlnaHQuc2Igc2V0IgogICAgc2Nyb2xsYmFyIC5jdG9wLmNkZXQucmlnaHQuc2IgLWNvbW1hbmQgIiRjZmxpc3QgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQucmlnaHQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY2ZsaXN0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wLmNkZXQgYWRkIC5jdG9wLmNkZXQucmlnaHQKICAgIGJpbmQgLmN0b3AuY2RldCA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQoKICAgIHBhY2sgLmN0b3AgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiYWxsY2FudnMgc2NhbiBtYXJrIDAgJXkiCiAgICBiaW5kYWxsIDxCMi1Nb3Rpb24+ICJhbGxjYW52cyBzY2FuIGRyYWd0byAwICV5IgogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxLZXktUmlnaHQ+ICJnb2ZvcnciCiAgICBiaW5kIC4gPEtleS1MZWZ0PiAiZ29iYWNrIgogICAgYmluZCAuIDxLZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktRGVsZXRlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1CYWNrU3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LXNwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSBwICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgbiAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgeiAiZ29iYWNrIgogICAgYmluZGtleSB4ICJnb2ZvcnciCiAgICBiaW5ka2V5IGkgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBrICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSBqICJnb2JhY2siCiAgICBiaW5ka2V5IGwgImdvZm9ydyIKICAgIGJpbmRrZXkgYiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgZCAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxOCB1bml0cyIKICAgIGJpbmRrZXkgdSAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMTggdW5pdHMiCiAgICBiaW5ka2V5IC8ge2ZpbmRuZXh0IDF9CiAgICBiaW5ka2V5IDxLZXktUmV0dXJuPiB7ZmluZG5leHQgMH0KICAgIGJpbmRrZXkgPyBmaW5kcHJldgogICAgYmluZGtleSBmIG5leHRmaWxlCiAgICBiaW5kIC4gPENvbnRyb2wtcT4gZG9xdWl0CiAgICBiaW5kIC4gPENvbnRyb2wtZj4gZG9maW5kCiAgICBiaW5kIC4gPENvbnRyb2wtZz4ge2ZpbmRuZXh0IDB9CiAgICBiaW5kIC4gPENvbnRyb2wtcj4gZmluZHByZXYKICAgIGJpbmQgLiA8Q29udHJvbC1lcXVhbD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxDb250cm9sLUtQX1N1YnRyYWN0PiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kICRjZmxpc3QgPDxMaXN0Ym94U2VsZWN0Pj4gbGlzdGJveHNlbAogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgY3VydGV4dGN1cnNvciAkdGV4dGN1cnNvcgoKICAgIHNldCByb3djdHhtZW51IC5yb3djdHhtZW51CiAgICBtZW51ICRyb3djdHhtZW51IC10ZWFyb2ZmIDAKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiB0aGlzIC0+IHNlbGVjdGVkIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDB9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAxfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSB0YWciIC1jb21tYW5kIG1rdGFnCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIldyaXRlIGNvbW1pdCB0byBmaWxlIiAtY29tbWFuZCB3cml0ZWNvbW1pdAp9CgojIHdoZW4gd2UgbWFrZSBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9wbGV2ZWwsIG1ha2Ugc3VyZQojIGl0IGRvZXNuJ3QgZ2V0IHRyaWdnZXJlZCB3aGVuIHRoYXQga2V5IGlzIHByZXNzZWQgaW4gdGhlCiMgZmluZCBzdHJpbmcgZW50cnkgd2lkZ2V0Lgpwcm9jIGJpbmRrZXkge2V2IHNjcmlwdH0gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGJpbmQgLiAkZXYgJHNjcmlwdAogICAgc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgJGV2XQogICAgaWYgeyRlc2NyaXB0ID09IHt9fSB7CglzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSA8S2V5Pl0KICAgIH0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgliaW5kICRlICRldiAiJGVzY3JpcHQ7IGJyZWFrIgogICAgfQp9CgojIHNldCB0aGUgZm9jdXMgYmFjayB0byB0aGUgdG9wbGV2ZWwgZm9yIGFueSBjbGljayBvdXRzaWRlCiMgdGhlIGVudHJ5IHdpZGdldHMKcHJvYyBjbGljayB7d30gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CglpZiB7JHcgPT0gJGV9IHJldHVybgogICAgfQogICAgZm9jdXMgLgp9Cgpwcm9jIHNhdmVzdHVmZiB7d30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250CiAgICBnbG9iYWwgc3R1ZmZzYXZlZCBmaW5kbWVyZ2VmaWxlcyBnYXVkeWRpZmYgbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBtYXh3aWR0aAoKICAgIGlmIHskc3R1ZmZzYXZlZH0gcmV0dXJuCiAgICBpZiB7IVt3aW5mbyB2aWV3YWJsZSAuXX0gcmV0dXJuCiAgICBjYXRjaCB7CglzZXQgZiBbb3BlbiAifi8uZ2l0ay1uZXciIHddCglwdXRzICRmIFtsaXN0IHNldCBtYWluZm9udCAkbWFpbmZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB0ZXh0Zm9udCAkdGV4dGZvbnRdCglwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCglwdXRzICRmIFtsaXN0IHNldCBnYXVkeWRpZmYgJGdhdWR5ZGlmZl0KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heGdyYXBocGN0ICRtYXhncmFwaHBjdF0KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KCXB1dHMgJGYgInNldCBnZW9tZXRyeSh3aWR0aCkgW3dpbmZvIHdpZHRoIC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnZdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnYyXS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgW3dpbmZvIHdpZHRoICRjYW52M10tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudmgpIFtleHByIFt3aW5mbyBoZWlnaHQgJGNhbnZdLTJdIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY3RleHRdIC0gOCkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgJHRleHRmb250ICIwIl19XQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGN0ZXh0dykgJHdpZCIKCXNldCB3aWQgW2V4cHIgeyhbd2luZm8gd2lkdGggJGNmbGlzdF0gLSAxMSkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgWyRjZmxpc3QgY2dldCAtZm9udF0gIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgJHdpZCIKCWNsb3NlICRmCglmaWxlIHJlbmFtZSAtZm9yY2UgIn4vLmdpdGstbmV3IiAifi8uZ2l0ayIKICAgIH0KICAgIHNldCBzdHVmZnNhdmVkIDEKfQoKcHJvYyByZXNpemVjbGlzdHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglzZXQgczEgWyR3aW4gc2FzaCBjb29yZCAxXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdy8yIC0gMil9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCR3KjUvNiAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMSAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCAzMH0gewoJCXNldCBzYXNoMCAzMAoJICAgIH0KCSAgICBpZiB7JHNhc2gxIDwgJHNhc2gwICsgMjB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgJHNhc2gwICsgMjBdCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CgkJc2V0IHNhc2gxIFtleHByICR3IC0gMTBdCgkJaWYgeyRzYXNoMCA+ICRzYXNoMSAtIDIwfSB7CgkJICAgIHNldCBzYXNoMCBbZXhwciAkc2FzaDEgLSAyMF0KCQl9CgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCgkkd2luIHNhc2ggcGxhY2UgMSAkc2FzaDEgW2xpbmRleCAkczEgMV0KICAgIH0KICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdwp9Cgpwcm9jIHJlc2l6ZWNkZXRwYW5lcyB7d2luIHd9IHsKICAgIGdsb2JhbCBvbGR3aWR0aAogICAgaWYgW2luZm8gZXhpc3RzIG9sZHdpZHRoKCR3aW4pXSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgJHcgLSAxNV0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KICAgIH0KICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdwp9Cgpwcm9jIGFsbGNhbnZzIGFyZ3MgewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGV2YWwgJGNhbnYgJGFyZ3MKICAgIGV2YWwgJGNhbnYyICRhcmdzCiAgICBldmFsICRjYW52MyAkYXJncwp9Cgpwcm9jIGJpbmRhbGwge2V2ZW50IGFjdGlvbn0gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGJpbmQgJGNhbnYgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYyICRldmVudCAkYWN0aW9uCiAgICBiaW5kICRjYW52MyAkZXZlbnQgJGFjdGlvbgp9Cgpwcm9jIGFib3V0IHt9IHsKICAgIHNldCB3IC5hYm91dAogICAgaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CglyYWlzZSAkdwoJcmV0dXJuCiAgICB9CiAgICB0b3BsZXZlbCAkdwogICAgd20gdGl0bGUgJHcgIkFib3V0IGdpdGsiCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgewpHaXRrIHZlcnNpb24gMS4yCgpDb3B5cmlnaHQgqSAyMDA1IFBhdWwgTWFja2VycmFzCgpVc2UgYW5kIHJlZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlfSBcCgkgICAgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCnByb2MgYXNzaWduY29sb3Ige2lkfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjb2xvcm1hcCBjb21tY29sb3JzIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRzIG5wYXJlbnRzIGNoaWxkcmVuIG5jaGlsZHJlbgogICAgZ2xvYmFsIGNvcm5lcmNyb3NzaW5ncyBjcm9zc2luZ3MKCiAgICBpZiBbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV0gcmV0dXJuCiAgICBzZXQgbmNvbG9ycyBbbGxlbmd0aCAkY29sb3JzXQogICAgaWYgeyRucGFyZW50cygkaWQpIDw9IDEgJiYgJG5jaGlsZHJlbigkaWQpID09IDF9IHsKCXNldCBjaGlsZCBbbGluZGV4ICRjaGlsZHJlbigkaWQpIDBdCglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkgICAgJiYgJG5wYXJlbnRzKCRjaGlsZCkgPT0gMX0gewoJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYmFkY29sb3JzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXX0gewoJZm9yZWFjaCB4ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMge30KCX0KICAgIH0KICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJaWYge1tpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV19IHsKCSAgICBmb3JlYWNoIHggJGNyb3NzaW5ncygkaWQpIHsKCQlpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCQl9CgkgICAgfQoJICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJCXNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCSAgICB9Cgl9CglzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICB9CgkgICAgaWYge1tpbmZvIGV4aXN0cyBwYXJlbnRzKCRjaGlsZCldfSB7CgkJZm9yZWFjaCBwICRwYXJlbnRzKCRjaGlsZCkgewoJCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRwKV0KCQkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKV0gPCAwfSB7CgkJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkcCkKCQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzICRvcmlnYmFkCgl9CiAgICB9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbmNvbG9yc30ge2luY3IgaX0gewoJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCglpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBuZXh0Y29sb3IgMAoJfQoJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKICAgIH0KICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCn0KCnByb2MgaW5pdGdyYXBoIHt9IHsKICAgIGdsb2JhbCBjYW52eSBjYW52eTAgbGluZW5vIG51bWNvbW1pdHMgbmV4dGNvbG9yIGxpbmVzcGMKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIG5jaGlsZHJlbiBuY2xlZnQKICAgIGdsb2JhbCBkaXNwbGlzdCBuaHlwZXJzcGFjZQoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIGNhdGNoIHt1bnNldCBtYWlubGluZX0KICAgIGNhdGNoIHt1bnNldCBtYWlubGluZWFycm93fQogICAgY2F0Y2gge3Vuc2V0IHNpZGVsaW5lc30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIG5jaGlsZHJlbl0gewoJc2V0IG5jbGVmdCgkaWQpICRuY2hpbGRyZW4oJGlkKQogICAgfQogICAgc2V0IGRpc3BsaXN0IHt9CiAgICBzZXQgbmh5cGVyc3BhY2UgMAp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIDEiCn0KCnByb2MgZHJhd2xpbmVzIHtpZCB4dHJhfSB7CiAgICBnbG9iYWwgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMgbHRoaWNrbmVzcyBjb2xvcm1hcCBjYW52CgogICAgJGNhbnYgZGVsZXRlIGxpbmVzLiRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRtYWlubGluZSgkaWQpIFwKCQkgICAtd2lkdGggW2V4cHIgeygkeHRyYSArIDEpICogJGx0aGlja25lc3N9XSBcCgkJICAgLWZpbGwgJGNvbG9ybWFwKCRpZCkgLXRhZ3MgbGluZXMuJGlkIFwKCQkgICAtYXJyb3cgJG1haW5saW5lYXJyb3coJGlkKV0KCSRjYW52IGxvd2VyICR0CgliaW5kbGluZSAkdCAkaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7Cglmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkgICAgc2V0IGNvb3JkcyBbbGluZGV4ICRscyAwXQoJICAgIHNldCB0aGljayBbbGluZGV4ICRscyAxXQoJICAgIHNldCBhcnJvdyBbbGluZGV4ICRscyAyXQoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC1maWxsICRjb2xvcm1hcCgkaWQpIFwKCQkgICAgICAgLXdpZHRoIFtleHByIHsoJHRoaWNrICsgJHh0cmEpICogJGx0aGlja25lc3N9XSBcCgkJICAgICAgIC1hcnJvdyAkYXJyb3cgLXRhZ3MgbGluZXMuJGlkXQoJICAgICRjYW52IGxvd2VyICR0CgkgICAgYmluZGxpbmUgJHQgJGlkCgl9CiAgICB9Cn0KCiMgbGV2ZWwgaGVyZSBpcyBhbiBpbmRleCBpbiBkaXNwbGlzdApwcm9jIGRyYXdjb21taXRsaW5lIHtsZXZlbH0gewogICAgZ2xvYmFsIHBhcmVudHMgY2hpbGRyZW4gbnBhcmVudHMgZGlzcGxpc3QKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG1haW5mb250IG5hbWVmb250IGNhbnZ5IGxpbmVzcGMKICAgIGdsb2JhbCBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcgY29tbWl0aW5mbwogICAgZ2xvYmFsIGNvbG9ybWFwIG51bWNvbW1pdHMgY3VycmVudHBhcmVudHMgZHVwcGFyZW50cwogICAgZ2xvYmFsIGlkdGFncyBpZGxpbmUgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxpbmVubyBsdGhpY2tuZXNzIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHJvd3RleHR4IGlkcG9zIGxhc3R1c2UgZGlzcGxpc3QKICAgIGdsb2JhbCBvbGRubGluZXMgb2xkZGxldmVsIG9sZGRpc3BsaXN0CgogICAgaW5jciBudW1jb21taXRzCiAgICBpbmNyIGxpbmVubwogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsaXN0ICRsZXZlbF0KICAgIHNldCBsYXN0dXNlKCRpZCkgJGxpbmVubwogICAgc2V0IGxpbmVpZCgkbGluZW5vKSAkaWQKICAgIHNldCBpZGxpbmUoJGlkKSAkbGluZW5vCiAgICBzZXQgb2ZpbGwgW2V4cHIge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV0/ICJibHVlIjogIndoaXRlIn1dCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglyZWFkY29tbWl0ICRpZAoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJICAgIHNldCBjb21taXRpbmZvKCRpZCkgeyJObyBjb21taXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIn0KCSAgICBzZXQgbnBhcmVudHMoJGlkKSAwCgl9CiAgICB9CiAgICBhc3NpZ25jb2xvciAkaWQKICAgIHNldCBjdXJyZW50cGFyZW50cyB7fQogICAgc2V0IGR1cHBhcmVudHMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldICYmIFtpbmZvIGV4aXN0cyBwYXJlbnRzKCRpZCldfSB7Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkY3VycmVudHBhcmVudHMgJHBdIDwgMH0gewoJCWxhcHBlbmQgY3VycmVudHBhcmVudHMgJHAKCSAgICB9IGVsc2UgewoJCSMgcmVtZW1iZXIgdGhhdCB0aGlzIHBhcmVudCB3YXMgbGlzdGVkIHR3aWNlCgkJbGFwcGVuZCBkdXBwYXJlbnRzICRwCgkgICAgfQoJfQogICAgfQogICAgc2V0IHggW3hjb29yZCAkbGV2ZWwgJGxldmVsICRsaW5lbm9dCiAgICBzZXQgeTEgJGNhbnZ5CiAgICBzZXQgY2FudnkgW2V4cHIgJGNhbnZ5ICsgJGxpbmVzcGNdCiAgICBhbGxjYW52cyBjb25mIC1zY3JvbGxyZWdpb24gXAoJW2xpc3QgMCAwIDAgW2V4cHIgJHkxICsgMC41ICogJGxpbmVzcGMgKyAyXV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCWxhcHBlbmQgbWFpbmxpbmUoJGlkKSAkeCAkeTEKCWlmIHskbWFpbmxpbmVhcnJvdygkaWQpIG5lICJub25lIn0gewoJICAgIHNldCBtYWlubGluZSgkaWQpIFt0cmltZGlhZ3N0YXJ0ICRtYWlubGluZSgkaWQpXQoJfQogICAgfQogICAgZHJhd2xpbmVzICRpZCAwCiAgICBzZXQgb3JhZCBbZXhwciB7JGxpbmVzcGMgLyAzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgb3ZhbCBbZXhwciAkeCAtICRvcmFkXSBbZXhwciAkeTEgLSAkb3JhZF0gXAoJICAgICAgIFtleHByICR4ICsgJG9yYWQgLSAxXSBbZXhwciAkeTEgKyAkb3JhZCAtIDFdIFwKCSAgICAgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDFdCiAgICAkY2FudiByYWlzZSAkdAogICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQogICAgc2V0IHh0IFt4Y29vcmQgW2xsZW5ndGggJGRpc3BsaXN0XSAkbGV2ZWwgJGxpbmVub10KICAgIGlmIHtbbGxlbmd0aCAkY3VycmVudHBhcmVudHNdID4gMn0gewoJc2V0IHh0IFtleHByIHskeHQgKyAoW2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSAtIDIpICogJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHJvd3RleHR4KCRsaW5lbm8pICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5MV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldCgl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeTFdCiAgICB9CiAgICBzZXQgaGVhZGxpbmUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDBdCiAgICBzZXQgbmFtZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KICAgIHNldCBkYXRlIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAyXQogICAgc2V0IGxpbmVodGFnKCRsaW5lbm8pIFskY2FudiBjcmVhdGUgdGV4dCAkeHQgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJG1haW5mb250IF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRsaW5lbm8pIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRsaW5lbm8pIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRuYW1lIC1mb250ICRuYW1lZm9udF0KICAgIHNldCBsaW5lZHRhZygkbGluZW5vKSBbJGNhbnYzIGNyZWF0ZSB0ZXh0IDMgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnRdCgogICAgc2V0IG9sZGRsZXZlbCAkbGV2ZWwKICAgIHNldCBvbGRkaXNwbGlzdCAkZGlzcGxpc3QKICAgIHNldCBvbGRubGluZXMgW2xsZW5ndGggJGRpc3BsaXN0XQp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGlkbGluZSByb3d0ZXh0eAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByICR5MSAtIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IHliIFtleHByICR5dCArICRsaW5lc3BjIC0gMV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgJHggKyAkZGVsdGFdCglzZXQgeHIgW2V4cHIgJHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3NdCglpZiB7W2luY3IgbnRhZ3MgLTFdID49IDB9IHsKCSAgICAjIGRyYXcgYSB0YWcKCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgJHl0ICsgJGRlbHRhXSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgJHliIC0gJGRlbHRhXSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkaWRsaW5lKCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciAkeGwgLSAkZGVsdGEvMl0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCgl9CglzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyBcCgkJICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRhZy4kaWRdCglpZiB7JG50YWdzID49IDB9IHsKCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCX0KICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyBub3RlY3Jvc3NpbmdzIHtpZCBsbyBoaSBjb3JuZXJ9IHsKICAgIGdsb2JhbCBvbGRkaXNwbGlzdCBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzCgogICAgZm9yIHtzZXQgaSAkbG99IHtbaW5jciBpXSA8ICRoaX0ge30gewoJc2V0IHAgW2xpbmRleCAkb2xkZGlzcGxpc3QgJGldCglpZiB7JHAgPT0ge319IGNvbnRpbnVlCglpZiB7JGkgPT0gJGNvcm5lcn0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfSBlbHNlIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKIyBpdCBzZWVtcyBUayBjYW4ndCBkcmF3IGFycm93cyBvbiB0aGUgZW5kIG9mIGRpYWdvbmFsIGxpbmUgc2VnbWVudHMuLi4KcHJvYyB0cmltZGlhZ2VuZCB7bGluZX0gewogICAgd2hpbGUge1tsbGVuZ3RoICRsaW5lXSA+IDR9IHsKCXNldCB4MSBbbGluZGV4ICRsaW5lIGVuZC0zXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgZW5kLTJdCglzZXQgeDIgW2xpbmRleCAkbGluZSBlbmQtMV0KCXNldCB5MiBbbGluZGV4ICRsaW5lIGVuZF0KCWlmIHsoJHgxID09ICR4MikgIT0gKCR5MSA9PSAkeTIpfSBicmVhawoJc2V0IGxpbmUgW2xyZXBsYWNlICRsaW5lIGVuZC0xIGVuZF0KICAgIH0KICAgIHJldHVybiAkbGluZQp9Cgpwcm9jIHRyaW1kaWFnc3RhcnQge2xpbmV9IHsKICAgIHdoaWxlIHtbbGxlbmd0aCAkbGluZV0gPiA0fSB7CglzZXQgeDEgW2xpbmRleCAkbGluZSAwXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgMV0KCXNldCB4MiBbbGluZGV4ICRsaW5lIDJdCglzZXQgeTIgW2xpbmRleCAkbGluZSAzXQoJaWYgeygkeDEgPT0gJHgyKSAhPSAoJHkxID09ICR5Mil9IGJyZWFrCglzZXQgbGluZSBbbHJlcGxhY2UgJGxpbmUgMCAxXQogICAgfQogICAgcmV0dXJuICRsaW5lCn0KCnByb2MgZHJhd3NsYW50cyB7aWQgbmVlZG9uc2NyZWVuIG5vaHN9IHsKICAgIGdsb2JhbCBjYW52IG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzCiAgICBnbG9iYWwgY2FudngwIGNhbnZ5IHhzcGMxIHhzcGMyIGx0aGlja25lc3MKICAgIGdsb2JhbCBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgbHRoaWNrbmVzcyBsaW5lc3BjIGNhbnZ5IGNvbG9ybWFwIGxpbmVubyBnZW9tZXRyeQogICAgZ2xvYmFsIG1heGdyYXBocGN0IG1heHdpZHRoCiAgICBnbG9iYWwgZGlzcGxpc3Qgb25zY3JlZW4gbGFzdHVzZQogICAgZ2xvYmFsIHBhcmVudHMgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgb2xkbmxpbmVzIG9sZGRsZXZlbCBvbGRkaXNwbGlzdAogICAgZ2xvYmFsIG5oeXBlcnNwYWNlIG51bWNvbW1pdHMgbm5ld3BhcmVudHMKCiAgICBpZiB7JGxpbmVubyA8IDB9IHsKCWxhcHBlbmQgZGlzcGxpc3QgJGlkCglzZXQgb25zY3JlZW4oJGlkKSAxCglyZXR1cm4gMAogICAgfQoKICAgIHNldCB5MSBbZXhwciB7JGNhbnZ5IC0gJGxpbmVzcGN9XQogICAgc2V0IHkyICRjYW52eQoKICAgICMgd29yayBvdXQgd2hhdCB3ZSBuZWVkIHRvIGdldCBiYWNrIG9uIHNjcmVlbgogICAgc2V0IHJlaW5zIHt9CiAgICBpZiB7JG9uc2NyZWVuKCRpZCkgPCAwfSB7CgkjIG5leHQgdG8gZG8gaXNuJ3QgZGlzcGxheWVkLCBiZXR0ZXIgZ2V0IGl0IG9uIHNjcmVlbi4uLgoJbGFwcGVuZCByZWlucyBbbGlzdCAkaWQgMF0KICAgIH0KICAgICMgbWFrZSBzdXJlIGFsbCB0aGUgcHJldmlvdXMgY29tbWl0cydzIHBhcmVudHMgYXJlIG9uIHRoZSBzY3JlZW4KICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgbGFwcGVuZCByZWlucyBbbGlzdCAkcCAwXQoJfQogICAgfQogICAgIyBicmluZyBiYWNrIGFueXRoaW5nIHJlcXVlc3RlZCBieSBjYWxsZXIKICAgIGlmIHskbmVlZG9uc2NyZWVuIG5lIHt9fSB7CglsYXBwZW5kIHJlaW5zICRuZWVkb25zY3JlZW4KICAgIH0KCiAgICAjIHRyeSB0aGUgc2hvcnRjdXQKICAgIGlmIHskY3VycmVudHBhcmVudHMgPT0gJGlkICYmICRvbnNjcmVlbigkaWQpID09IDAgJiYgJHJlaW5zIGVxIHt9fSB7CglzZXQgZGxldmVsICRvbGRkbGV2ZWwKCXNldCB4IFt4Y29vcmQgJGRsZXZlbCAkZGxldmVsICRsaW5lbm9dCglzZXQgbWFpbmxpbmUoJGlkKSBbbGlzdCAkeCAkeTFdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIG5vbmUKCXNldCBsYXN0dXNlKCRpZCkgJGxpbmVubwoJc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGRsZXZlbCAkZGxldmVsICRpZF0KCXNldCBvbnNjcmVlbigkaWQpIDEKCXNldCB4c3BjMShbZXhwciB7JGxpbmVubyArIDF9XSkgJHhzcGMxKCRsaW5lbm8pCglyZXR1cm4gJGRsZXZlbAogICAgfQoKICAgICMgdXBkYXRlIGRpc3BsaXN0CiAgICBzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCiAgICBzZXQgaiAkb2xkZGxldmVsCiAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCXNldCBsYXN0dXNlKCRwKSAkbGluZW5vCglpZiB7JG9uc2NyZWVuKCRwKSA9PSAwfSB7CgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCAkaiAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDEKCSAgICBpbmNyIGoKCX0KICAgIH0KICAgIGlmIHskb25zY3JlZW4oJGlkKSA9PSAwfSB7CglsYXBwZW5kIGRpc3BsaXN0ICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMQogICAgfQoKICAgICMgcmVtb3ZlIHRoZSBudWxsIGVudHJ5IGlmIHByZXNlbnQKICAgIHNldCBudWxsZW50cnkgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCB7fV0KICAgIGlmIHskbnVsbGVudHJ5ID49IDB9IHsKCXNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRudWxsZW50cnkgJG51bGxlbnRyeV0KICAgIH0KCiAgICAjIGJyaW5nIGJhY2sgdGhlIG9uZXMgd2UgbmVlZCBub3cgKGlmIHdlIGRpZCBpdCBlYXJsaWVyCiAgICAjIGl0IHdvdWxkIGNoYW5nZSBkaXNwbGlzdCBhbmQgaW52YWxpZGF0ZSBvbGRkbGV2ZWwpCiAgICBmb3JlYWNoIHBpICRyZWlucyB7CgkjIHRlc3QgYWdhaW4gaW4gY2FzZSBvZiBkdXBsaWNhdGVzIGluIHJlaW5zCglzZXQgcCBbbGluZGV4ICRwaSAwXQoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgc2V0IG9uc2NyZWVuKCRwKSAxCgkgICAgc2V0IGxhc3R1c2UoJHApICRsaW5lbm8KCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0IFtsaW5kZXggJHBpIDFdICRwXQoJICAgIGluY3Igbmh5cGVyc3BhY2UgLTEKCX0KICAgIH0KCiAgICBzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KCiAgICAjIHNlZSBpZiB3ZSBuZWVkIHRvIG1ha2UgYW55IGxpbmVzIGp1bXAgb2ZmIGludG8gaHlwZXJzcGFjZQogICAgc2V0IGRpc3BsIFtsbGVuZ3RoICRkaXNwbGlzdF0KICAgIGlmIHskZGlzcGwgPiAkbWF4d2lkdGh9IHsKCXNldCBhZ2VzIHt9Cglmb3JlYWNoIHggJGRpc3BsaXN0IHsKCSAgICBsYXBwZW5kIGFnZXMgW2xpc3QgJGxhc3R1c2UoJHgpICR4XQoJfQoJc2V0IGFnZXMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRhZ2VzXQoJc2V0IGsgMAoJd2hpbGUgeyRkaXNwbCA+ICRtYXh3aWR0aH0gewoJICAgIHNldCB1c2UgW2xpbmRleCAkYWdlcyAkayAwXQoJICAgIHNldCB2aWN0aW0gW2xpbmRleCAkYWdlcyAkayAxXQoJICAgIGlmIHskdXNlID49ICRsaW5lbm8gLSA1fSBicmVhawoJICAgIGluY3IgawoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHZpY3RpbV0gPj0gMH0gY29udGludWUKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICR2aWN0aW1dCgkgICAgc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGkgJGldCgkgICAgc2V0IG9uc2NyZWVuKCR2aWN0aW0pIC0xCgkgICAgaW5jciBuaHlwZXJzcGFjZQoJICAgIGluY3IgZGlzcGwgLTEKCSAgICBpZiB7JGkgPCAkbnVsbGVudHJ5fSB7CgkJaW5jciBudWxsZW50cnkgLTEKCSAgICB9CgkgICAgc2V0IHggW2xpbmRleCAkbWFpbmxpbmUoJHZpY3RpbSkgZW5kLTFdCgkgICAgbGFwcGVuZCBtYWlubGluZSgkdmljdGltKSAkeCAkeTEKCSAgICBzZXQgbGluZSBbdHJpbWRpYWdlbmQgJG1haW5saW5lKCR2aWN0aW0pXQoJICAgIHNldCBhcnJvdyAibGFzdCIKCSAgICBpZiB7JG1haW5saW5lYXJyb3coJHZpY3RpbSkgbmUgIm5vbmUifSB7CgkJc2V0IGxpbmUgW3RyaW1kaWFnc3RhcnQgJGxpbmVdCgkJc2V0IGFycm93ICJib3RoIgoJICAgIH0KCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkdmljdGltKSBbbGlzdCAkbGluZSAxICRhcnJvd10KCSAgICB1bnNldCBtYWlubGluZSgkdmljdGltKQoJfQogICAgfQoKICAgIHNldCBkbGV2ZWwgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgogICAgIyBJZiB3ZSBhcmUgcmVkdWNpbmcsIHB1dCBpbiBhIG51bGwgZW50cnkKICAgIGlmIHskZGlzcGwgPCAkb2xkbmxpbmVzfSB7CgkjIGRvZXMgdGhlIG5leHQgbGluZSBsb29rIGxpa2UgYSBtZXJnZT8KCSMgaS5lLiBkb2VzIGl0IGhhdmUgPiAxIG5ldyBwYXJlbnQ/CglpZiB7JG5uZXdwYXJlbnRzKCRpZCkgPiAxfSB7CgkgICAgc2V0IGkgW2V4cHIgeyRkbGV2ZWwgKyAxfV0KCX0gZWxzZWlmIHskbm5ld3BhcmVudHMoW2xpbmRleCAkb2xkZGlzcGxpc3QgJG9sZGRsZXZlbF0pID09IDB9IHsKCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgaWYgeyRudWxsZW50cnkgPj0gMCAmJiAkbnVsbGVudHJ5IDwgJGl9IHsKCQlpbmNyIGkgLTEKCSAgICB9Cgl9IGVsc2VpZiB7JG51bGxlbnRyeSA+PSAwfSB7CgkgICAgc2V0IGkgJG51bGxlbnRyeQoJICAgIHdoaWxlIHskaSA8ICRkaXNwbAoJCSAgICYmIFtsaW5kZXggJG9sZGRpc3BsaXN0ICRpXSA9PSBbbGluZGV4ICRkaXNwbGlzdCAkaV19IHsKCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBpZiB7JGRsZXZlbCA+PSAkaX0gewoJCWluY3IgaQoJICAgIH0KCX0KCWlmIHskaSA8ICRkaXNwbH0gewoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgJGkge31dCgkgICAgaW5jciBkaXNwbAoJICAgIGlmIHskZGxldmVsID49ICRpfSB7CgkJaW5jciBkbGV2ZWwKCSAgICB9Cgl9CiAgICB9CgogICAgIyBkZWNpZGUgb24gdGhlIGxpbmUgc3BhY2luZyBmb3IgdGhlIG5leHQgbGluZQogICAgc2V0IGxqIFtleHByIHskbGluZW5vICsgMX1dCiAgICBzZXQgbWF4dyBbZXhwciB7JG1heGdyYXBocGN0ICogJGdlb21ldHJ5KGNhbnYxKSAvIDEwMH1dCiAgICBpZiB7JGRpc3BsIDw9IDEgfHwgJGNhbnZ4MCArICRkaXNwbCAqICR4c3BjMiA8PSAkbWF4d30gewoJc2V0IHhzcGMxKCRsaikgJHhzcGMyCiAgICB9IGVsc2UgewoJc2V0IHhzcGMxKCRsaikgW2V4cHIgeygkbWF4dyAtICRjYW52eDAgLSAkeHNwYzIpIC8gKCRkaXNwbCAtIDEpfV0KCWlmIHskeHNwYzEoJGxqKSA8ICRsdGhpY2tuZXNzfSB7CgkgICAgc2V0IHhzcGMxKCRsaikgJGx0aGlja25lc3MKCX0KICAgIH0KCiAgICBmb3JlYWNoIGlkaSAkcmVpbnMgewoJc2V0IGlkIFtsaW5kZXggJGlkaSAwXQoJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCglzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCXNldCBtYWlubGluZSgkaWQpIFtsaXN0ICR4aiAkeTJdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIGZpcnN0CiAgICB9CgogICAgc2V0IGkgLTEKICAgIGZvcmVhY2ggaWQgJG9sZGRpc3BsaXN0IHsKCWluY3IgaQoJaWYgeyRpZCA9PSB7fX0gY29udGludWUKCWlmIHskb25zY3JlZW4oJGlkKSA8PSAwfSBjb250aW51ZQoJc2V0IHhpIFt4Y29vcmQgJGkgJG9sZGRsZXZlbCAkbGluZW5vXQoJaWYgeyRpID09ICRvbGRkbGV2ZWx9IHsKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRwXQoJCXNldCBjb29yZHMgW2xpc3QgJHhpICR5MV0KCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlpZiB7JHhqIDwgJHhpIC0gJGxpbmVzcGN9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW2V4cHIgeyR4aiArICRsaW5lc3BjfV0gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGogJGkgW2V4cHIgeyRqICsgMX1dCgkJfSBlbHNlaWYgeyR4aiA+ICR4aSArICRsaW5lc3BjfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByIHskeGogLSAkbGluZXNwY31dICR5MQoJCSAgICBub3RlY3Jvc3NpbmdzICRwICRpICRqIFtleHByIHskaiAtIDF9XQoJCX0KCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkdXBwYXJlbnRzICRwXSA+PSAwfSB7CgkJICAgICMgZHJhdyBhIGRvdWJsZS13aWR0aCBsaW5lIHRvIGluZGljYXRlIHRoZSBkb3VibGVkIHBhcmVudAoJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJICAgIGxhcHBlbmQgc2lkZWxpbmVzKCRwKSBbbGlzdCAkY29vcmRzIDIgbm9uZV0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlzZXQgbWFpbmxpbmUoJHApIFtsaXN0ICR4aiAkeTJdCgkJCXNldCBtYWlubGluZWFycm93KCRwKSBub25lCgkJICAgIH0KCQl9IGVsc2UgewoJCSAgICAjIG5vcm1hbCBjYXNlLCBubyBwYXJlbnQgZHVwbGljYXRlZAoJCSAgICBzZXQgeWIgJHkyCgkJICAgIHNldCBkeCBbZXhwciB7YWJzKCR4aSAtICR4ail9XQoJCSAgICBpZiB7MCAmJiAkZHggPCAkbGluZXNwY30gewoJCQlzZXQgeWIgW2V4cHIgeyR5MSArICRkeH1dCgkJICAgIH0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlpZiB7JHhpICE9ICR4an0gewoJCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5YgoJCQl9CgkJCXNldCBtYWlubGluZSgkcCkgJGNvb3JkcwoJCQlzZXQgbWFpbmxpbmVhcnJvdygkcCkgbm9uZQoJCSAgICB9IGVsc2UgewoJCQlsYXBwZW5kIGNvb3JkcyAkeGogJHliCgkJCWlmIHskeWIgPCAkeTJ9IHsKCQkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkJfQoJCQlsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAxIG5vbmVdCgkJICAgIH0KCQl9CgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgaiAkaQoJICAgIGlmIHtbbGluZGV4ICRkaXNwbGlzdCAkaV0gIT0gJGlkfSB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgkgICAgfQoJICAgIGlmIHskaiAhPSAkaSB8fCAkeHNwYzEoJGxpbmVubykgIT0gJHhzcGMxKCRsaikKCQl8fCAoJG9sZGRsZXZlbCA8ICRpICYmICRpIDwgJGRsZXZlbCkKCQl8fCAoJGRsZXZlbCA8ICRpICYmICRpIDwgJG9sZGRsZXZlbCl9IHsKCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlsYXBwZW5kIG1haW5saW5lKCRpZCkgJHhpICR5MSAkeGogJHkyCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRkbGV2ZWwKfQoKIyBzZWFyY2ggZm9yIHggaW4gYSBsaXN0IG9mIGxpc3RzCnByb2MgbGxzZWFyY2gge2xsaXN0IHh9IHsKICAgIHNldCBpIDAKICAgIGZvcmVhY2ggbCAkbGxpc3QgewoJaWYgeyRsID09ICR4IHx8IFtsc2VhcmNoIC1leGFjdCAkbCAkeF0gPj0gMH0gewoJICAgIHJldHVybiAkaQoJfQoJaW5jciBpCiAgICB9CiAgICByZXR1cm4gLTEKfQoKcHJvYyBkcmF3bW9yZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIG5jbXVwZGF0ZSBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc3RvcHBlZCBuaHlwZXJzcGFjZSBwYXJlbnRzIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIG1heHdpZHRoIG9uc2NyZWVuIGRpc3BsaXN0IGN1cnJlbnRwYXJlbnRzIG9sZGRsZXZlbAoKICAgIHNldCBuIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCiAgICB3aGlsZSB7JG51bWNvbW1pdHMgPCAkbn0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbnVtY29tbWl0c10KCXNldCBjdHhlbmQgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQoJaWYgeyEkcmVhZGluZyAmJiAkY3R4ZW5kID4gJG59IHsKCSAgICBzZXQgY3R4ZW5kICRuCgl9CglzZXQgZGxpc3Qge30KCWlmIHskbnVtY29tbWl0cyA+IDB9IHsKCSAgICBzZXQgZGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJCWlmIHskb25zY3JlZW4oJHApID09IDB9IHsKCQkgICAgc2V0IGRsaXN0IFtsaW5zZXJ0ICRkbGlzdCAkaSAkcF0KCQkgICAgaW5jciBpCgkJfQoJICAgIH0KCX0KCXNldCBub2hzIHt9CglzZXQgcmVpbnMge30KCXNldCBpc2ZhdCBbZXhwciB7W2xsZW5ndGggJGRsaXN0XSA+ICRtYXh3aWR0aH1dCglpZiB7JG5oeXBlcnNwYWNlID4gMCB8fCAkaXNmYXR9IHsKCSAgICBpZiB7JGN0eGVuZCA+ICRufSBicmVhawoJICAgICMgd29yayBvdXQgd2hhdCB0byBicmluZyBiYWNrIGFuZAoJICAgICMgd2hhdCB3ZSB3YW50IHRvIGRvbid0IHdhbnQgdG8gc2VuZCBpbnRvIGh5cGVyc3BhY2UKCSAgICBzZXQgcm9vbSAxCgkgICAgZm9yIHtzZXQgayAkbnVtY29tbWl0c30geyRrIDwgJGN0eGVuZH0ge2luY3Iga30gewoJCXNldCB4IFtsaW5kZXggJGRpc3BsYXlvcmRlciAka10KCQlzZXQgaSBbbGxzZWFyY2ggJGRsaXN0ICR4XQoJCWlmIHskaSA8IDB9IHsKCQkgICAgc2V0IGkgW2xsZW5ndGggJGRsaXN0XQoJCSAgICBsYXBwZW5kIGRsaXN0ICR4CgkJfQoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHhdIDwgMH0gewoJCSAgICBsYXBwZW5kIG5vaHMgJHgKCQl9CgkJaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHgpIDwgMCAmJiAkcm9vbX0gewoJCSAgICBzZXQgcmVpbnMgW2xpc3QgJHggJGldCgkJfQoJCXNldCBuZXdwIHt9CgkJaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJHgpXX0gewoJCSAgICBzZXQgcmlnaHQgMAoJCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJHgpIHsKCQkJaWYge1tsbHNlYXJjaCAkZGxpc3QgJHBdIDwgMH0gewoJCQkgICAgbGFwcGVuZCBuZXdwICRwCgkJCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICRwXSA8IDB9IHsKCQkJCWxhcHBlbmQgbm9ocyAkcAoJCQkgICAgfQoJCQkgICAgaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHApIDwgMCAmJiAkcm9vbX0gewoJCQkJc2V0IHJlaW5zIFtsaXN0ICRwIFtleHByIHskaSArICRyaWdodH1dXQoJCQkgICAgfQoJCQl9CgkJCXNldCByaWdodCAxCgkJICAgIH0KCQl9CgkJc2V0IGwgW2xpbmRleCAkZGxpc3QgJGldCgkJaWYge1tsbGVuZ3RoICRsXSA9PSAxfSB7CgkJICAgIHNldCBsICRuZXdwCgkJfSBlbHNlIHsKCQkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRsICR4XQoJCSAgICBzZXQgbCBbY29uY2F0IFtscmVwbGFjZSAkbCAkaiAkal0gJG5ld3BdCgkJfQoJCXNldCBkbGlzdCBbbHJlcGxhY2UgJGRsaXN0ICRpICRpICRsXQoJCWlmIHskcm9vbSAmJiAkaXNmYXQgJiYgW2xsZW5ndGggJG5ld3BdIDw9IDF9IHsKCQkgICAgc2V0IHJvb20gMAoJCX0KCSAgICB9Cgl9CgoJc2V0IGRsZXZlbCBbZHJhd3NsYW50cyAkaWQgJHJlaW5zICRub2hzXQoJZHJhd2NvbW1pdGxpbmUgJGRsZXZlbAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGUKCSAgICAmJiAkbnVtY29tbWl0cyA+PSAkbmNtdXBkYXRlfSB7CgkgICAgZG91cGRhdGUgJHJlYWRpbmcKCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgl9CiAgICB9Cn0KCiMgbGV2ZWwgaGVyZSBpcyBhbiBpbmRleCBpbiB0b2RvCnByb2MgdXBkYXRldG9kbyB7bGV2ZWwgbm9zaG9ydGN1dH0gewogICAgZ2xvYmFsIG5jbGVmdCB0b2RvIG5uZXdwYXJlbnRzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBhcmVudHMgb25zY3JlZW4KCiAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCiAgICBzZXQgb2xkcyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRvbGRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIG9sZHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7ISRub3Nob3J0Y3V0ICYmIFtsbGVuZ3RoICRvbGRzXSA9PSAxfSB7CglzZXQgcCBbbGluZGV4ICRvbGRzIDBdCglpZiB7JG5jbGVmdCgkcCkgPT0gMSAmJiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdIDwgMH0gewoJICAgIHNldCBuY2xlZnQoJHApIDAKCSAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbCAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDAKCSAgICBzZXQgbm5ld3BhcmVudHMoJGlkKSAxCgkgICAgcmV0dXJuIDAKCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbF0KICAgIHNldCBpICRsZXZlbAogICAgc2V0IG4gMAogICAgZm9yZWFjaCBwICRvbGRzIHsKCWluY3IgbmNsZWZ0KCRwKSAtMQoJc2V0IGsgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXQoJaWYgeyRrIDwgMH0gewoJICAgIHNldCB0b2RvIFtsaW5zZXJ0ICR0b2RvICRpICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMAoJICAgIGluY3IgaQoJICAgIGluY3IgbgoJfQogICAgfQogICAgc2V0IG5uZXdwYXJlbnRzKCRpZCkgJG4KCiAgICByZXR1cm4gMQp9Cgpwcm9jIGRlY2lkZW5leHQge3tub3JlYWQgMH19IHsKICAgIGdsb2JhbCBuY2xlZnQgdG9kbwogICAgZ2xvYmFsIGRhdGVtb2RlIGNkYXRlCiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICMgY2hvb3NlIHdoaWNoIG9uZSB0byBkbyBuZXh0IHRpbWUgYXJvdW5kCiAgICBzZXQgdG9kb2wgW2xsZW5ndGggJHRvZG9dCiAgICBzZXQgbGV2ZWwgLTEKICAgIHNldCBsYXRlc3Qge30KICAgIGZvciB7c2V0IGsgJHRvZG9sfSB7W2luY3IgayAtMV0gPj0gMH0ge30gewoJc2V0IHAgW2xpbmRleCAkdG9kbyAka10KCWlmIHskbmNsZWZ0KCRwKSA9PSAwfSB7CgkgICAgaWYgeyRkYXRlbW9kZX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJCSAgICBpZiB7JG5vcmVhZH0gewoJCQlyZXR1cm4ge30KCQkgICAgfQoJCSAgICByZWFkY29tbWl0ICRwCgkJfQoJCWlmIHskbGF0ZXN0ID09IHt9IHx8ICRjZGF0ZSgkcCkgPiAkbGF0ZXN0fSB7CgkJICAgIHNldCBsZXZlbCAkawoJCSAgICBzZXQgbGF0ZXN0ICRjZGF0ZSgkcCkKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgbGV2ZWwgJGsKCQlicmVhawoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbGV2ZWwgPCAwfSB7CglpZiB7JHRvZG8gIT0ge319IHsKCSAgICBwdXRzICJFUlJPUjogbm9uZSBvZiB0aGUgcGVuZGluZyBjb21taXRzIGNhbiBiZSBkb25lIHlldDoiCgkgICAgZm9yZWFjaCBwICR0b2RvIHsKCQlwdXRzICIgICRwICgkbmNsZWZ0KCRwKSkiCgkgICAgfQoJfQoJcmV0dXJuIC0xCiAgICB9CgogICAgcmV0dXJuICRsZXZlbAp9Cgpwcm9jIGRyYXdjb21taXQge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgdG9kbyBuY2hpbGRyZW4gZGF0ZW1vZGUgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIG51bWNvbW1pdHMgbmNtdXBkYXRlIGRpc3BsYXlvcmRlciB0b2RvIG9uc2NyZWVuCgogICAgaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CglzZXQgcGhhc2UgaW5jcmRyYXcKCXNldCBkaXNwbGF5b3JkZXIge30KCXNldCB0b2RvIHt9Cglpbml0Z3JhcGgKICAgIH0KICAgIGlmIHskbmNoaWxkcmVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCB0b2RvICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMAogICAgfQogICAgc2V0IGxldmVsIFtkZWNpZGVuZXh0IDFdCiAgICBpZiB7JGxldmVsID09IHt9IHx8ICRpZCAhPSBbbGluZGV4ICR0b2RvICRsZXZlbF19IHsKCXJldHVybgogICAgfQogICAgd2hpbGUgMSB7CglsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCWlmIHtbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXX0gewoJICAgIHNldCBsZXZlbCBbZGVjaWRlbmV4dCAxXQoJICAgIGlmIHskbGV2ZWwgPT0ge319IGJyZWFrCgl9CglzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV19IHsKCSAgICBicmVhawoJfQogICAgfQogICAgZHJhd21vcmUgMQp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlCiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCSRjYW52IGRlbGV0ZSBhbGwKCSRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJObyBjb21taXRzIHNlbGVjdGVkIiBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwoJc2V0IHBoYXNlIHt9CiAgICB9IGVsc2UgewoJZHJhd3Jlc3QKICAgIH0KICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2MgZHJhd2dyYXBoIHt9IHsKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3MgbmNtdXBkYXRlCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG9uc2NyZWVuCgogICAgaWYgeyRkaXNwbGF5b3JkZXIgPT0ge319IHJldHVybgogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGluaXRncmFwaAogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCXNldCBvbnNjcmVlbigkaWQpIDAKICAgIH0KICAgIGRyYXdtb3JlIDAKfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgcGhhc2Ugc3RvcHBlZCByZWRpc3BsYXlpbmcgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGF0ZW1vZGUgdG9kbyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZQogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcwoKICAgIHNldCBsZXZlbCBbZGVjaWRlbmV4dF0KICAgIGlmIHskbGV2ZWwgPj0gMH0gewoJc2V0IHBoYXNlIGRyYXdncmFwaAoJd2hpbGUgMSB7CgkgICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgc2V0IGhhcmQgW3VwZGF0ZXRvZG8gJGxldmVsICRkYXRlbW9kZV0KCSAgICBpZiB7JGhhcmR9IHsKCQlzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCgkJaWYgeyRsZXZlbCA8IDB9IGJyZWFrCgkgICAgfQoJfQoJZHJhd21vcmUgMAogICAgfQogICAgc2V0IHBoYXNlIHt9CiAgICBzZXQgZHJhd21zZWNzIFtleHByIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc2Vjc10KICAgICNwdXRzICJvdmVyYWxsICRkcmF3bXNlY3MgbXMgZm9yICRudW1jb21taXRzIGNvbW1pdHMiCiAgICBpZiB7JHJlZGlzcGxheWluZ30gewoJaWYgeyRzdG9wcGVkID09IDAgJiYgW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCSAgICBzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAoJfQoJaWYgeyRzdG9wcGVkID09IDF9IHsKCSAgICBzZXQgc3RvcHBlZCAwCgkgICAgYWZ0ZXIgaWRsZSBkcmF3Z3JhcGgKCX0gZWxzZSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgl9CiAgICB9Cn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByICRqKyRmb3VuZHN0cmxlbi0xXV0KCSAgICBzZXQgaSBbZXhwciAkaiArICRmb3VuZHN0cmxlbl0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7fSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbwogICAgZ2xvYmFsIG51bWNvbW1pdHMgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgY2FudiBjYW52MiBjYW52MyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCgogICAgc3RvcGZpbmRwcm9jCiAgICB1bm1hcmttYXRjaGVzCiAgICBmb2N1cyAuCiAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQogICAgaWYgeyRmaW5kbG9jID09ICJQaWNrYXhlIn0gewoJZmluZHBhdGNoZXMKCXJldHVybgogICAgfQogICAgaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCXNldCBmb3VuZHN0cmluZyBbc3RyaW5nIHRvbG93ZXIgJGZpbmRzdHJpbmddCiAgICB9IGVsc2UgewoJc2V0IGZvdW5kc3RyaW5nICRmaW5kc3RyaW5nCiAgICB9CiAgICBzZXQgZm91bmRzdHJsZW4gW3N0cmluZyBsZW5ndGggJGZpbmRzdHJpbmddCiAgICBpZiB7JGZvdW5kc3RybGVuID09IDB9IHJldHVybgogICAgaWYgeyRmaW5kbG9jID09ICJGaWxlcyJ9IHsKCWZpbmRmaWxlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgb2xkc2VsIC0xCiAgICB9IGVsc2UgewoJc2V0IG9sZHNlbCAkc2VsZWN0ZWRsaW5lCiAgICB9CiAgICBzZXQgZGlkc2VsIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnR9CiAgICBmb3Ige3NldCBsIDB9IHskbCA8ICRudW1jb21taXRzfSB7aW5jciBsfSB7CglzZXQgaWQgJGxpbmVpZCgkbCkKCXNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKCXNldCBkb2VzbWF0Y2ggMAoJZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CgkgICAgaWYgeyRmaW5kbG9jICE9ICJBbGwgZmllbGRzIiAmJiAkZmluZGxvYyAhPSAkdHl9IHsKCQljb250aW51ZQoJICAgIH0KCSAgICBzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCgkgICAgaWYgeyRtYXRjaGVzID09IHt9fSBjb250aW51ZQoJICAgIHNldCBkb2VzbWF0Y2ggMQoJICAgIGlmIHskdHkgPT0gIkhlYWRsaW5lIn0gewoJCW1hcmttYXRjaGVzICRjYW52ICRsICRmICRsaW5laHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiQXV0aG9yIn0gewoJCW1hcmttYXRjaGVzICRjYW52MiAkbCAkZiAkbGluZW50YWcoJGwpICRtYXRjaGVzICRuYW1lZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CgkJbWFya21hdGNoZXMgJGNhbnYzICRsICRmICRsaW5lZHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfQoJfQoJaWYgeyRkb2VzbWF0Y2h9IHsKCSAgICBsYXBwZW5kIG1hdGNoaW5nbGluZXMgJGwKCSAgICBpZiB7ISRkaWRzZWwgJiYgJGwgPiAkb2xkc2VsfSB7CgkJZmluZHNlbGVjdGxpbmUgJGwKCQlzZXQgZGlkc2VsIDEKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG1hdGNoaW5nbGluZXMgPT0ge319IHsKCWJlbGwKICAgIH0gZWxzZWlmIHshJGRpZHNlbH0gewoJZmluZHNlbGVjdGxpbmUgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXQogICAgfQp9Cgpwcm9jIGZpbmRzZWxlY3RsaW5lIHtsfSB7CiAgICBnbG9iYWwgZmluZGxvYyBjb21tZW50ZW5kIGN0ZXh0CiAgICBzZWxlY3RsaW5lICRsIDEKICAgIGlmIHskZmluZGxvYyA9PSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgPT0gIkNvbW1lbnRzIn0gewoJIyBoaWdobGlnaHQgdGhlIG1hdGNoZXMgaW4gdGhlIGNvbW1lbnRzCglzZXQgZiBbJGN0ZXh0IGdldCAxLjAgJGNvbW1lbnRlbmRdCglzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCglmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCSAgICBzZXQgZW5kIFtleHByIFtsaW5kZXggJG1hdGNoIDFdICsgMV0KCSAgICAkY3RleHQgdGFnIGFkZCBmb3VuZCAiMS4wICsgJHN0YXJ0IGMiICIxLjAgKyAkZW5kIGMiCgl9CiAgICB9Cn0KCnByb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWlmIHskcmVzdGFydH0gewoJICAgIGRvZmluZAoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPiAkc2VsZWN0ZWRsaW5lfSB7CgkgICAgZmluZHNlbGVjdGxpbmUgJGwKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGJlbGwKfQoKcHJvYyBmaW5kcHJldiB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7Cglkb2ZpbmQKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgcHJldiB7fQogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+PSAkc2VsZWN0ZWRsaW5lfSBicmVhawoJc2V0IHByZXYgJGwKICAgIH0KICAgIGlmIHskcHJldiAhPSB7fX0gewoJZmluZHNlbGVjdGxpbmUgJHByZXYKICAgIH0gZWxzZSB7CgliZWxsCiAgICB9Cn0KCnByb2MgZmluZGxvY2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGZpbmRsb2MgZmluZHR5cGUgZmluZHR5cGVtZW51CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglzZXQgZmluZHR5cGUgRXhhY3QKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDEgLXN0YXRlICRzdGF0ZQogICAgJGZpbmR0eXBlbWVudSBlbnRyeWNvbmYgMiAtc3RhdGUgJHN0YXRlCn0KCnByb2Mgc3RvcGZpbmRwcm9jIHt7ZG9uZSAwfX0gewogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZSBmaW5kaWRzCiAgICBnbG9iYWwgY3RleHQgZmluZG9sZGN1cnNvciBwaGFzZSBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcwoKICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kcHJvY3BpZF19IHsKCWlmIHshJGRvbmV9IHsKCSAgICBjYXRjaCB7ZXhlYyBraWxsICRmaW5kcHJvY3BpZH0KCX0KCWNhdGNoIHtjbG9zZSAkZmluZHByb2NmaWxlfQoJdW5zZXQgZmluZHByb2NwaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZGlucHJvZ3Jlc3NdfSB7Cgl1bnNldCBmaW5kaW5wcm9ncmVzcwoJaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CgkgICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgoJICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKCX0KICAgIH0KfQoKcHJvYyBmaW5kcGF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgZmluZHN0cmluZyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZQogICAgZ2xvYmFsIGZpbmRkaWRzZWwgY3RleHQgbGluZWlkIGZpbmRpbnByb2dyZXNzCiAgICBnbG9iYWwgZmluZGluc2VydHBvcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICAjIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgaWRzIHRvIHNlYXJjaCwgc3RhcnRpbmcgYXQgdGhlIG9uZQogICAgIyBhZnRlciB0aGUgc2VsZWN0ZWQgbGluZSAoaWYgYW55KQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCAkc2VsZWN0ZWRsaW5lCiAgICB9IGVsc2UgewoJc2V0IGwgLTEKICAgIH0KICAgIHNldCBpbnB1dGlkcyB7fQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnVtY29tbWl0c30ge2luY3IgaX0gewoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJYXBwZW5kIGlucHV0aWRzICRsaW5laWQoJGwpICJcbiIKICAgIH0KCiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1zIC1yIC1TJGZpbmRzdHJpbmcgXAoJCQkgPDwgJGlucHV0aWRzXSByXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBmaW5kcHJvY2ZpbGUgJGYKICAgIHNldCBmaW5kcHJvY3BpZCBbcGlkICRmXQogICAgZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmIHJlYWRhYmxlIHJlYWRmaW5kcHJvYwogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKfQoKcHJvYyByZWFkZmluZHByb2Mge30gewogICAgZ2xvYmFsIGZpbmRwcm9jZmlsZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgaWRsaW5lIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcwoKICAgIHNldCBuIFtnZXRzICRmaW5kcHJvY2ZpbGUgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRmaW5kcHJvY2ZpbGVdfSB7CgkgICAgc3RvcGZpbmRwcm9jIDEKCSAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgkJYmVsbAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCWVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtZGlmZi10cmVlIG91dHB1dDogJGxpbmUiCglzdG9wZmluZHByb2MKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglwdXRzIHN0ZGVyciAic3B1cmlvdXMgaWQ6ICRpZCIKCXJldHVybgogICAgfQogICAgc2V0IGwgJGlkbGluZSgkaWQpCiAgICBpbnNlcnRtYXRjaCAkbCAkaWQKfQoKcHJvYyBpbnNlcnRtYXRjaCB7bCBpZH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcyBmaW5kZGlkc2VsCgogICAgaWYgeyRmaW5kaW5zZXJ0cG9zID09ICJlbmQifSB7CglpZiB7JG1hdGNoaW5nbGluZXMgIT0ge30gJiYgJGwgPCBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdfSB7CgkgICAgc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgMCAkbF0KCSAgICBzZXQgZmluZGluc2VydHBvcyAxCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJfQogICAgfSBlbHNlIHsKCXNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzICRmaW5kaW5zZXJ0cG9zICRsXQoJaW5jciBmaW5kaW5zZXJ0cG9zCiAgICB9CiAgICBtYXJraGVhZGxpbmUgJGwgJGlkCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSAkbAoJc2V0IGZpbmRkaWRzZWwgMQogICAgfQp9Cgpwcm9jIGZpbmRmaWxlcyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMgbGluZWlkIGN0ZXh0CiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRkaWRzZWwgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzIGZpbmRzdGFydGxpbmUgZmluZGluc2VydHBvcwogICAgZ2xvYmFsIHRyZWVkaWZmcyBmZGlmZmlkcyBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgMX1dCiAgICB9IGVsc2UgewoJc2V0IGwgMAogICAgfQogICAgc2V0IGZmaWxlbGluZSAkbAogICAgc2V0IGZpbmRzdGFydGxpbmUgJGwKICAgIHNldCBkaWZmc25lZWRlZCB7fQogICAgc2V0IGZkaWZmc25lZWRlZCB7fQogICAgd2hpbGUgMSB7CglzZXQgaWQgJGxpbmVpZCgkbCkKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCQlpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoW2xpc3QgJGlkICRwXSldfSB7CgkJICAgIGFwcGVuZCBkaWZmc25lZWRlZCAiJGlkICRwXG4iCgkJICAgIGxhcHBlbmQgZmRpZmZzbmVlZGVkIFtsaXN0ICRpZCAkcF0KCQl9CgkgICAgfQoJfQoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawogICAgfQoKICAgICMgc3RhcnQgb2ZmIGEgZ2l0LWRpZmYtdHJlZSBwcm9jZXNzIGlmIG5lZWRlZAogICAgaWYgeyRkaWZmc25lZWRlZCBuZSB7fX0gewoJaWYge1tjYXRjaCB7CgkgICAgc2V0IGRmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtLXN0ZGluIDw8ICRkaWZmc25lZWRlZF0gcl0KCX0gZXJyIF19IHsKCSAgICBlcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCgkgICAgcmV0dXJuCgl9CgljYXRjaCB7dW5zZXQgZmRpZmZpZHN9CglzZXQgZmRpZmZwb3MgMAoJZmNvbmZpZ3VyZSAkZGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZGYgcmVhZGFibGUgW2xpc3QgcmVhZGZpbGVkaWZmcyAkZGZdCiAgICB9CgogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgc2V0IGZpbmRpbnNlcnRwb3MgZW5kCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAwXQogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKICAgIGZpbmRjb250IFtsaXN0ICRpZCAkcF0KICAgIHVwZGF0ZQp9Cgpwcm9jIHJlYWRmaWxlZGlmZnMge2RmfSB7CiAgICBnbG9iYWwgZmluZGlkcyBmZGlmZmlkcyBmZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRkZl19IHsKCSAgICBkb25lZmlsZWRpZmYKCSAgICBpZiB7W2NhdGNoIHtjbG9zZSAkZGZ9IGVycl19IHsKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkVycm9yIGluIGdpdC1kaWZmLXRyZWU6ICRlcnIiCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXX0gewoJCXNldCBpZHMgJGZpbmRpZHMKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkNvdWxkbid0IGZpbmQgZGlmZnMgZm9yIHskaWRzfSIKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgXChmcm9tIChbMC05YS1mXXs0MH0pXCl9ICRsaW5lIG1hdGNoIGlkIHBdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IHN0cmluZyBvZiBkaWZmcwoJZG9uZWZpbGVkaWZmCglzZXQgZmRpZmZpZHMgW2xpc3QgJGlkICRwXQoJc2V0IGZkaWZmcyB7fQogICAgfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggIjoqIiAkbGluZV19IHsKCWxhcHBlbmQgZmRpZmZzIFtsaW5kZXggJGxpbmUgNV0KICAgIH0KfQoKcHJvYyBkb25lZmlsZWRpZmYge30gewogICAgZ2xvYmFsIGZkaWZmaWRzIGZkaWZmcyB0cmVlZGlmZnMgZmluZGlkcwogICAgZ2xvYmFsIGZkaWZmc25lZWRlZCBmZGlmZnBvcwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmRpZmZpZHNdfSB7Cgl3aGlsZSB7W2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10gbmUgJGZkaWZmaWRzCgkgICAgICAgJiYgJGZkaWZmcG9zIDwgW2xsZW5ndGggJGZkaWZmc25lZWRlZF19IHsKCSAgICAjIGdpdC1kaWZmLXRyZWUgZG9lc24ndCBvdXRwdXQgYW55dGhpbmcgZm9yIGEgY29tbWl0CgkgICAgIyB3aGljaCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZwoJICAgIHNldCBudWxsaWRzIFtsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdCgkgICAgc2V0IHRyZWVkaWZmcygkbnVsbGlkcykge30KCSAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdICYmICRudWxsaWRzIGVxICRmaW5kaWRzfSB7CgkJdW5zZXQgZmluZGlkcwoJCWZpbmRjb250ICRudWxsaWRzCgkgICAgfQoJICAgIGluY3IgZmRpZmZwb3MKCX0KCWluY3IgZmRpZmZwb3MKCglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGZkaWZmaWRzKV19IHsKCSAgICBzZXQgdHJlZWRpZmZzKCRmZGlmZmlkcykgJGZkaWZmcwoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkZmRpZmZpZHMgZXEgJGZpbmRpZHN9IHsKCSAgICB1bnNldCBmaW5kaWRzCgkgICAgZmluZGNvbnQgJGZkaWZmaWRzCgl9CiAgICB9Cn0KCnByb2MgZmluZGNvbnQge2lkc30gewogICAgZ2xvYmFsIGZpbmRpZHMgdHJlZWRpZmZzIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZHN0YXJ0bGluZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgbGluZWlkIG51bWNvbW1pdHMgbWF0Y2hpbmdsaW5lcyBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQogICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCiAgICBzZXQgcGkgW2xzZWFyY2ggLWV4YWN0ICRwYXJlbnRzKCRpZCkgJHBdCiAgICBzZXQgbCAkZmZpbGVsaW5lCiAgICB3aGlsZSAxIHsKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCQlzZXQgZmluZGlkcyAkaWRzCgkJc2V0IGZmaWxlbGluZSAkbAoJCXJldHVybgoJICAgIH0KCSAgICBzZXQgZG9lc21hdGNoIDAKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkJc2V0IHggW2ZpbmRtYXRjaGVzICRmXQoJCWlmIHskeCAhPSB7fX0gewoJCSAgICBzZXQgZG9lc21hdGNoIDEKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJICAgIGlmIHskZG9lc21hdGNofSB7CgkJaW5zZXJ0bWF0Y2ggJGwgJGlkCgkJc2V0IHBpICRucGFyZW50cygkaWQpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgcGkgJG5wYXJlbnRzKCRpZCkKCX0KCWlmIHtbaW5jciBwaV0gPj0gJG5wYXJlbnRzKCRpZCl9IHsKCSAgICBzZXQgcGkgMAoJICAgIGlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJCXNldCBsIDAKCSAgICB9CgkgICAgaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawoJICAgIHNldCBpZCAkbGluZWlkKCRsKQoJfQoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwaV0KCXNldCBpZHMgW2xpc3QgJGlkICRwXQogICAgfQogICAgc3RvcGZpbmRwcm9jCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgliZWxsCiAgICB9Cn0KCiMgbWFyayBhIGNvbW1pdCBhcyBtYXRjaGluZyBieSBwdXR0aW5nIGEgeWVsbG93IGJhY2tncm91bmQKIyBiZWhpbmQgdGhlIGhlYWRsaW5lCnByb2MgbWFya2hlYWRsaW5lIHtsIGlkfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBsaW5laHRhZyBjb21taXRpbmZvCgogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdCAkYmJveCAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KICAgICRjYW52IGxvd2VyICR0Cn0KCiMgbWFyayB0aGUgYml0cyBvZiBhIGhlYWRsaW5lLCBhdXRob3Igb3IgZGF0ZSB0aGF0IG1hdGNoIGEgZmluZCBzdHJpbmcKcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250fSB7CiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkdGFnXQogICAgc2V0IHgwIFtsaW5kZXggJGJib3ggMF0KICAgIHNldCB5MCBbbGluZGV4ICRiYm94IDFdCiAgICBzZXQgeTEgW2xpbmRleCAkYmJveCAzXQogICAgZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CglzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCXNldCBlbmQgW2xpbmRleCAkbWF0Y2ggMV0KCWlmIHskc3RhcnQgPiAkZW5kfSBjb250aW51ZQoJc2V0IHhvZmYgW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciAkc3RhcnQtMV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciAkZW5kXV1dCglzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgW2V4cHIgJHgwKyR4b2ZmXSAkeTAgW2V4cHIgJHgwKyR4bGVuKzJdICR5MSBcCgkJICAgLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCgkkY2FudiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIHVubWFya21hdGNoZXMge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGlkcwogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9Cn0KCnByb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgY3RleHQgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIHNldCBsICIuLi4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KICAgIH0KICAgIHJldHVybiAiJHAgKCRsKSIKfQoKIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECiMgdGhhdCB3ZSBrbm93IGFib3V0IGJlIGEgY2xpY2thYmxlIGxpbmsuCnByb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0fSB7CiAgICBnbG9iYWwgY3RleHQgaWRsaW5lIGxpbmtudW0KCiAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJHRleHQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KICAgIGZvcmVhY2ggbCAkbGlua3MgewoJc2V0IHMgW2xpbmRleCAkbCAwXQoJc2V0IGUgW2xpbmRleCAkbCAxXQoJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQoJaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRsaW5raWQpXX0gY29udGludWUKCWluY3IgZQoJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGFkZCBsaW5rJGxpbmtudW0gIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gW2xpc3Qgc2VsZWN0bGluZSAkaWRsaW5lKCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyBzZWxlY3RsaW5lIHtsIGlzbmV3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4KICAgIGdsb2JhbCBjZmxpc3QgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzIGlkbGluZSBsaW5rbnVtCgogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICBub3JtYWxsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laWQoJGwpXSB8fCAhW2luZm8gZXhpc3RzIGxpbmVodGFnKCRsKV19IHJldHVybgogICAgJGNhbnYgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52IGxvd2VyICR0CiAgICAkY2FudjIgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYyIGNyZWF0ZSByZWN0IFskY2FudjIgYmJveCAkbGluZW50YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MiBsb3dlciAkdAogICAgJGNhbnYzIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MyBjcmVhdGUgcmVjdCBbJGNhbnYzIGJib3ggJGxpbmVkdGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjMgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjMgbG93ZXIgJHQKICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIFtsaW5kZXggJHdub3cgMF0gKiAkeW1heF0KICAgIHNldCB3Ym90IFtleHByIFtsaW5kZXggJHdub3cgMV0gKiAkeW1heF0KICAgIHNldCB3aCBbZXhwciB7JHdib3QgLSAkd3RvcH1dCiAgICBzZXQgbmV3dG9wICR3dG9wCiAgICBpZiB7JHl0b3AgPCAkd3RvcH0gewoJaWYgeyR5Ym90IDwgJHd0b3B9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgJHl0b3AKCSAgICBpZiB7JG5ld3RvcCA+ICR3dG9wIC0gJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCAtICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9IGVsc2VpZiB7JHlib3QgPiAkd2JvdH0gewoJaWYgeyR5dG9wID4gJHdib3R9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5Ym90IC0gJHdofV0KCSAgICBpZiB7JG5ld3RvcCA8ICR3dG9wICsgJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG5ld3RvcCAhPSAkd3RvcH0gewoJaWYgeyRuZXd0b3AgPCAwfSB7CgkgICAgc2V0IG5ld3RvcCAwCgl9CglhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgJG5ld3RvcCAqIDEuMCAvICR5bWF4XQogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzZWxlY3RsaW5lICRsIDBdCiAgICB9CgogICAgc2V0IHNlbGVjdGVkbGluZSAkbAoKICAgIHNldCBpZCAkbGluZWlkKCRsKQogICAgc2V0IGN1cnJlbnRpZCAkaWQKICAgICRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICAkc2hhMWVudHJ5IGluc2VydCAwICRpZAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gZnJvbSAwCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiB0byBlbmQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgIHNldCBsaW5rbnVtIDAKICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4wIDAuMAogICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4wIGxlZnQKICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gIFtsaW5kZXggJGluZm8gMl1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJDb21taXR0ZXI6IFtsaW5kZXggJGluZm8gM10gIFtsaW5kZXggJGluZm8gNF1cbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KIAogICAgc2V0IGNvbW1lbnQge30KICAgIGlmIHtbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGFwcGVuZCBjb21tZW50ICJQYXJlbnQ6IFtjb21taXRfZGVzY3JpcHRvciAkcF1cbiIKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCWZvcmVhY2ggYyAkY2hpbGRyZW4oJGlkKSB7CgkgICAgYXBwZW5kIGNvbW1lbnQgIkNoaWxkOiAgW2NvbW1pdF9kZXNjcmlwdG9yICRjXVxuIgoJfQogICAgfQogICAgYXBwZW5kIGNvbW1lbnQgIlxuIgogICAgYXBwZW5kIGNvbW1lbnQgW2xpbmRleCAkaW5mbyA1XQoKICAgICMgbWFrZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBTSEExIElEIGJlIGEgY2xpY2thYmxlIGxpbmsKICAgIGFwcGVuZHdpdGhsaW5rcyAkY29tbWVudAoKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJDb21tZW50cyIKICAgIGlmIHskbnBhcmVudHMoJGlkKSA9PSAxfSB7CglzdGFydGRpZmYgW2NvbmNhdCAkaWQgJHBhcmVudHMoJGlkKV0KICAgIH0gZWxzZWlmIHskbnBhcmVudHMoJGlkKSA+IDF9IHsKCW1lcmdlZGlmZiAkaWQKICAgIH0KfQoKcHJvYyBzZWxuZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByICRzZWxlY3RlZGxpbmUgKyAkZGlyXQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgdW5zZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKCiAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQogICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAp9Cgpwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRjbWR9IHsKCXJldHVybgogICAgfQoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGNtZF0KICAgIH0gZWxzZSB7CglsYXBwZW5kIGhpc3RvcnkgJGNtZAogICAgfQogICAgaW5jciBoaXN0b3J5aW5kZXgKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfSBlbHNlIHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQogICAgLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGdvYmFjayB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCWluY3IgaGlzdG9yeWluZGV4IC0xCglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCglldmFsICRjbWQKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA8PSAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnb2Zvcncge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSAkaGlzdG9yeWluZGV4XQoJaW5jciBoaXN0b3J5aW5kZXgKCWV2YWwgJGNtZAoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPj0gW2xsZW5ndGggJGhpc3RvcnldfSB7CgkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgbWVyZ2VkaWZmIHtpZH0gewogICAgZ2xvYmFsIHBhcmVudHMgZGlmZm1lcmdlaWQgZGlmZm1lcmdlZ2NhIG1lcmdlZmlsZWxpc3QgZGlmZnBpbmRleAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmcGluZGV4IC0xCiAgICBzZXQgZGlmZm1lcmdlZ2NhIFtmaW5kZ2NhICRwYXJlbnRzKCRpZCldCiAgICBpZiB7W2luZm8gZXhpc3RzIG1lcmdlZmlsZWxpc3QoJGlkKV19IHsKCWlmIHskbWVyZ2VmaWxlbGlzdCgkaWQpIG5lIHt9fSB7CgkgICAgc2hvd21lcmdlZGlmZgoJfQogICAgfSBlbHNlIHsKCWNvbnRtZXJnZWRpZmYge30KICAgIH0KfQoKcHJvYyBmaW5kZ2NhIHtpZHN9IHsKICAgIHNldCBnY2Ege30KICAgIGZvcmVhY2ggaWQgJGlkcyB7CglpZiB7JGdjYSBlcSB7fX0gewoJICAgIHNldCBnY2EgJGlkCgl9IGVsc2UgewoJICAgIGlmIHtbY2F0Y2ggewoJCXNldCBnY2EgW2V4ZWMgZ2l0LW1lcmdlLWJhc2UgJGdjYSAkaWRdCgkgICAgfSBlcnJdfSB7CgkJcmV0dXJuIHt9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRnY2EKfQoKcHJvYyBjb250bWVyZ2VkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmcGluZGV4IHBhcmVudHMgbnBhcmVudHMgZGlmZm1lcmdlZ2NhCiAgICBnbG9iYWwgdHJlZWRpZmZzIG1lcmdlZmlsZWxpc3QgZGlmZmlkcyB0cmVlcGVuZGluZwoKICAgICMgZGlmZiB0aGUgY2hpbGQgYWdhaW5zdCBlYWNoIG9mIHRoZSBwYXJlbnRzLCBhbmQgZGlmZgogICAgIyBlYWNoIG9mIHRoZSBwYXJlbnRzIGFnYWluc3QgdGhlIEdDQS4KICAgIHdoaWxlIDEgewoJaWYge1tsaW5kZXggJGlkcyAwXSA9PSAkZGlmZm1lcmdlaWQgJiYgJGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJICAgIHNldCBpZHMgW2xpc3QgW2xpbmRleCAkaWRzIDFdICRkaWZmbWVyZ2VnY2FdCgl9IGVsc2UgewoJICAgIGlmIHtbaW5jciBkaWZmcGluZGV4XSA+PSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKX0gYnJlYWsKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJGRpZmZwaW5kZXhdCgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCgl9CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CgkgICAgc2V0IGRpZmZpZHMgJGlkcwoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJCWdldHRyZWVkaWZmcyAkaWRzCgkgICAgfQoJICAgIHJldHVybgoJfQogICAgfQoKICAgICMgSWYgYSBmaWxlIGluIHNvbWUgcGFyZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBhbmQgYWxzbwogICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgR0NBLCB0aGVuIGl0J3MgaW50ZXJlc3RpbmcuCiAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBHQ0EsIHRoZW4gYSBmaWxlIGlzIGludGVyZXN0aW5nIGlmIGl0IGlzCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBpbiBhbGwgdGhlIHBhcmVudHMuCiAgICBpZiB7JGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJc2V0IGZpbGVzIHt9Cglmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CgkgICAgc2V0IGdjYWRpZmZzICR0cmVlZGlmZnMoW2xpc3QgJHAgJGRpZmZtZXJnZWdjYV0pCgkgICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkgewoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGZpbGVzICRmXSA8IDAKCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRnY2FkaWZmcyAkZl0gPj0gMH0gewoJCSAgICBsYXBwZW5kIGZpbGVzICRmCgkJfQoJICAgIH0KCX0KCXNldCBmaWxlcyBbbHNvcnQgJGZpbGVzXQogICAgfSBlbHNlIHsKCXNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAwXQoJc2V0IGZpbGVzICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkKCWZvciB7c2V0IGkgMX0geyRpIDwgJG5wYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJiYgJGZpbGVzIG5lIHt9fSB7aW5jciBpfSB7CgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpICRpXQoJICAgIHNldCBkZiAkdHJlZWRpZmZzKFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0pCgkgICAgc2V0IG5mIHt9CgkgICAgZm9yZWFjaCBmICRmaWxlcyB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZGYgJGZdID49IDB9IHsKCQkgICAgbGFwcGVuZCBuZiAkZgoJCX0KCSAgICB9CgkgICAgc2V0IGZpbGVzICRuZgoJfQogICAgfQoKICAgIHNldCBtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZpbGVzCiAgICBpZiB7JGZpbGVzIG5lIHt9fSB7CglzaG93bWVyZ2VkaWZmCiAgICB9Cn0KCnByb2Mgc2hvd21lcmdlZGlmZiB7fSB7CiAgICBnbG9iYWwgY2ZsaXN0IGRpZmZtZXJnZWlkIG1lcmdlZmlsZWxpc3QgcGFyZW50cwogICAgZ2xvYmFsIGRpZmZvcHRzIGRpZmZpbmh1bmsgY3VycmVudGZpbGUgY3VycmVudGh1bmsgZmlsZWxpbmVzCiAgICBnbG9iYWwgZGlmZmJsb2NrZWQgZ3JvdXBmaWxlbGFzdCBtZXJnZWZkcyBncm91cGZpbGVudW0gZ3JvdXBodW5rcwoKICAgIHNldCBmaWxlcyAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpCiAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBmbGlzdCB7fQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRmaWxlfQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRodW5rfQogICAgY2F0Y2gge3Vuc2V0IGZpbGVsaW5lc30KICAgIGNhdGNoIHt1bnNldCBncm91cGZpbGVudW19CiAgICBjYXRjaCB7dW5zZXQgZ3JvdXBodW5rc30KICAgIHNldCBncm91cGZpbGVsYXN0IC0xCiAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CglzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtcCAkcCAkZGlmZm1lcmdlaWRdCglzZXQgY21kIFtjb25jYXQgJGNtZCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQoJaWYge1tjYXRjaCB7c2V0IGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIGRpZmZzOiAkZXJyIgoJICAgIGZvcmVhY2ggZiAkZmxpc3QgewoJCWNhdGNoIHtjbG9zZSAkZn0KCSAgICB9CgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGZsaXN0ICRmCglzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0KCXNldCBtZXJnZWZkcygkaWRzKSAkZgoJc2V0IGRpZmZpbmh1bmsoJGlkcykgMAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIDAKCWZjb25maWd1cmUgJGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRmICRpZHMgJGRpZmZtZXJnZWlkXQogICAgfQp9Cgpwcm9jIGdldG1lcmdlZGlmZmxpbmUge2YgaWRzIGlkfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZmluaHVuayBkaWZmb2xkbGluZXMgZGlmZm5ld2xpbmVzCiAgICBnbG9iYWwgY3VycmVudGZpbGUgY3VycmVudGh1bmsKICAgIGdsb2JhbCBkaWZmb2xkc3RhcnQgZGlmZm5ld3N0YXJ0IGRpZmZvbGRsbm8gZGlmZm5ld2xubwogICAgZ2xvYmFsIGRpZmZibG9ja2VkIG1lcmdlZmlsZWxpc3QKICAgIGdsb2JhbCBub2xkbGluZXMgbm5ld2xpbmVzIGRpZmZsY291bnRzIGZpbGVsaW5lcwoKICAgIHNldCBuIFtnZXRzICRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGZdfSByZXR1cm4KICAgIH0KCiAgICBpZiB7IShbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdICYmICRkaWZmbWVyZ2VpZCA9PSAkaWQpfSB7CglpZiB7JG4gPCAwfSB7CgkgICAgY2xvc2UgJGYKCX0KCXJldHVybgogICAgfQoKICAgIGlmIHskZGlmZmluaHVuaygkaWRzKSAhPSAwfSB7CglzZXQgZmkgJGN1cnJlbnRmaWxlKCRpZHMpCglpZiB7JG4gPiAwICYmIFtyZWdleHAge15bLSsgXFxdfSAkbGluZSBtYXRjaF19IHsKCSAgICAjIGNvbnRpbnVpbmcgYW4gZXhpc3RpbmcgaHVuawoJICAgIHNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCgkgICAgaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIgIn0gewoJCXNldCBmaWxlbGluZXMoJHAsJGZpLCRkaWZmb2xkbG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm9sZGxubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIrIiB8fCAkbWF0Y2ggZXEgIiAifSB7CgkJc2V0IGZpbGVsaW5lcygkaWQsJGZpLCRkaWZmbmV3bG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm5ld2xubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIgIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgXAoJCQlbbGlzdCAkbm9sZGxpbmVzKCRpZHMpICRubmV3bGluZXMoJGlkcyldCgkJICAgIHNldCBub2xkbGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAxCgkJfQoJCWluY3Igbm9sZGxpbmVzKCRpZHMpCgkgICAgfSBlbHNlaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIrIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCQkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkJICAgIHNldCBubmV3bGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAyCgkJfQoJCWlmIHskbWF0Y2ggZXEgIi0ifSB7CgkJICAgIGluY3Igbm9sZGxpbmVzKCRpZHMpCgkJfSBlbHNlIHsKCQkgICAgaW5jciBubmV3bGluZXMoJGlkcykKCQl9CgkgICAgfQoJICAgICMgYW5kIGlmIGl0J3MgXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBsaW5lLCB0aGVuIHdoYXQ/CgkgICAgcmV0dXJuCgl9CgkjIGVuZCBvZiBhIGh1bmsKCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxICYmICRub2xkbGluZXMoJGlkcykgIT0gMH0gewoJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCX0gZWxzZWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyCgkJICAmJiAoJG5vbGRsaW5lcygkaWRzKSAhPSAwIHx8ICRubmV3bGluZXMoJGlkcykgIT0gMCl9IHsKCSAgICBsYXBwZW5kIGRpZmZsY291bnRzKCRpZHMpIFtsaXN0ICRub2xkbGluZXMoJGlkcykgJG5uZXdsaW5lcygkaWRzKV0KCX0KCXNldCBjdXJyZW50aHVuaygkaWRzKSBbbGlzdCAkY3VycmVudGZpbGUoJGlkcykgXAoJCQkJICAgJGRpZmZvbGRzdGFydCgkaWRzKSAkZGlmZm5ld3N0YXJ0KCRpZHMpIFwKCQkJCSAgICRkaWZmb2xkbG5vKCRpZHMpICRkaWZmbmV3bG5vKCRpZHMpIFwKCQkJCSAgICRkaWZmbGNvdW50cygkaWRzKV0KCXNldCBkaWZmaW5odW5rKCRpZHMpIDAKCSMgLTEgPSBuZWVkIHRvIGJsb2NrLCAwID0gdW5ibG9ja2VkLCAxID0gaXMgYmxvY2tlZAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIC0xCglwcm9jZXNzaHVua3MKCWlmIHskZGlmZmJsb2NrZWQoJGlkcykgPT0gLTF9IHsKCSAgICBmaWxlZXZlbnQgJGYgcmVhZGFibGUge30KCSAgICBzZXQgZGlmZmJsb2NrZWQoJGlkcykgMQoJfQogICAgfQoKICAgIGlmIHskbiA8IDB9IHsKCSMgZW9mCglpZiB7ISRkaWZmYmxvY2tlZCgkaWRzKX0gewoJICAgIGNsb3NlICRmCgkgICAgc2V0IGN1cnJlbnRmaWxlKCRpZHMpIFtsbGVuZ3RoICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCgkgICAgc2V0IGN1cnJlbnRodW5rKCRpZHMpIFtsaXN0ICRjdXJyZW50ZmlsZSgkaWRzKSAwIDAgMCAwIHt9XQoJICAgIHByb2Nlc3NodW5rcwoJfQogICAgfSBlbHNlaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiL30gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCXNldCBjdXJyZW50ZmlsZSgkaWRzKSBcCgkgICAgW2xzZWFyY2ggLWV4YWN0ICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZuYW1lXQogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHtbaW5mbyBleGlzdHMgY3VycmVudGZpbGUoJGlkcyldICYmICRjdXJyZW50ZmlsZSgkaWRzKSA+PSAwfSB7CgkgICAgIyBzdGFydCBvZiBhIG5ldyBodW5rCgkgICAgaWYgeyRmMWwgPT0gMCAmJiAkZjFjID09IDB9IHsKCQlzZXQgZjFsIDEKCSAgICB9CgkgICAgaWYgeyRmMmwgPT0gMCAmJiAkZjJjID09IDB9IHsKCQlzZXQgZjJsIDEKCSAgICB9CgkgICAgc2V0IGRpZmZpbmh1bmsoJGlkcykgMQoJICAgIHNldCBkaWZmb2xkc3RhcnQoJGlkcykgJGYxbAoJICAgIHNldCBkaWZmbmV3c3RhcnQoJGlkcykgJGYybAoJICAgIHNldCBkaWZmb2xkbG5vKCRpZHMpICRmMWwKCSAgICBzZXQgZGlmZm5ld2xubygkaWRzKSAkZjJsCgkgICAgc2V0IGRpZmZsY291bnRzKCRpZHMpIHt9CgkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkgICAgc2V0IG5uZXdsaW5lcygkaWRzKSAwCgl9CiAgICB9Cn0KCnByb2MgcHJvY2Vzc2h1bmtzIHt9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBwYXJlbnRzIG5wYXJlbnRzIGN1cnJlbnRodW5rCiAgICBnbG9iYWwgbWVyZ2VmaWxlbGlzdCBkaWZmYmxvY2tlZCBtZXJnZWZkcwogICAgZ2xvYmFsIGdyb3VwaHVua3MgZ3JvdXBsaW5lc3RhcnQgZ3JvdXBsaW5lZW5kIGdyb3VwZmlsZW51bQoKICAgIHNldCBuZmlsZXMgW2xsZW5ndGggJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KICAgIHdoaWxlIDEgewoJc2V0IGZpICRuZmlsZXMKCXNldCBsbm8gMAoJIyBsb29rIGZvciB0aGUgZWFybGllc3QgaHVuawoJZm9yZWFjaCBwICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgewoJICAgIHNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwXQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRodW5rKCRpZHMpXX0gcmV0dXJuCgkgICAgc2V0IGkgW2xpbmRleCAkY3VycmVudGh1bmsoJGlkcykgMF0KCSAgICBzZXQgbCBbbGluZGV4ICRjdXJyZW50aHVuaygkaWRzKSAyXQoJICAgIGlmIHskaSA8ICRmaSB8fCAoJGkgPT0gJGZpICYmICRsIDwgJGxubyl9IHsKCQlzZXQgZmkgJGkKCQlzZXQgbG5vICRsCgkJc2V0IHBpICRwCgkgICAgfQoJfQoKCWlmIHskZmkgPCAkbmZpbGVzfSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBpXQoJICAgIHNldCBodW5rICRjdXJyZW50aHVuaygkaWRzKQoJICAgIHVuc2V0IGN1cnJlbnRodW5rKCRpZHMpCgkgICAgaWYgeyRkaWZmYmxvY2tlZCgkaWRzKSA+IDB9IHsKCQlmaWxlZXZlbnQgJG1lcmdlZmRzKCRpZHMpIHJlYWRhYmxlIFwKCQkgICAgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWVyZ2VmZHMoJGlkcykgJGlkcyAkZGlmZm1lcmdlaWRdCgkgICAgfQoJICAgIHNldCBkaWZmYmxvY2tlZCgkaWRzKSAwCgoJICAgIGlmIHtbaW5mbyBleGlzdHMgZ3JvdXBmaWxlbnVtXSAmJiAkZ3JvdXBmaWxlbnVtID09ICRmaQoJCSYmICRsbm8gPD0gJGdyb3VwbGluZWVuZH0gewoJCSMgYWRkIHRoaXMgaHVuayB0byB0aGUgcGVuZGluZyBncm91cAoJCWxhcHBlbmQgZ3JvdXBodW5rcygkcGkpICRodW5rCgkJc2V0IGVuZGxuIFtsaW5kZXggJGh1bmsgNF0KCQlpZiB7JGVuZGxuID4gJGdyb3VwbGluZWVuZH0gewoJCSAgICBzZXQgZ3JvdXBsaW5lZW5kICRlbmRsbgoJCX0KCQljb250aW51ZQoJICAgIH0KCX0KCgkjIHN1Y2NlZWRpbmcgc3R1ZmYgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBncm91cCwgc28KCSMgcHJvY2VzcyB0aGUgZ3JvdXAgbm93CglpZiB7W2luZm8gZXhpc3RzIGdyb3VwZmlsZW51bV19IHsKCSAgICBwcm9jZXNzZ3JvdXAKCSAgICB1bnNldCBncm91cGZpbGVudW0KCSAgICB1bnNldCBncm91cGh1bmtzCgl9CgoJaWYgeyRmaSA+PSAkbmZpbGVzfSBicmVhawoKCSMgc3RhcnQgYSBuZXcgZ3JvdXAKCXNldCBncm91cGZpbGVudW0gJGZpCglzZXQgZ3JvdXBodW5rcygkcGkpIFtsaXN0ICRodW5rXQoJc2V0IGdyb3VwbGluZXN0YXJ0ICRsbm8KCXNldCBncm91cGxpbmVlbmQgW2xpbmRleCAkaHVuayA0XQogICAgfQp9Cgpwcm9jIHByb2Nlc3Nncm91cCB7fSB7CiAgICBnbG9iYWwgZ3JvdXBmaWxlbGFzdCBncm91cGZpbGVudW0gZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG1lcmdlZmlsZWxpc3QgZGlmZm1lcmdlaWQgY3RleHQgZmlsZWxpbmVzCiAgICBnbG9iYWwgcGFyZW50cyBkaWZmbWVyZ2VpZCBkaWZmb2Zmc2V0CiAgICBnbG9iYWwgZ3JvdXBodW5rcyBncm91cGxpbmVzdGFydCBncm91cGxpbmVlbmQgbnBhcmVudHMKICAgIGdsb2JhbCBtZXJnZW1heAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBmICRncm91cGZpbGVudW0KICAgIGlmIHskZ3JvdXBmaWxlbGFzdCAhPSAkZn0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGRpZmZmaWxlc3RhcnQoJGYpICRoZXJlCglzZXQgbWFyayBmbWFyay5bZXhwciB7JGYgKyAxfV0KCSRjdGV4dCBtYXJrIHNldCAkbWFyayAkaGVyZQoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSAkbWFyayBsZWZ0CglzZXQgaGVhZGVyIFtsaW5kZXggJG1lcmdlZmlsZWxpc3QoJGlkKSAkZl0KCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZ3JvdXBmaWxlbGFzdCAkZgoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIHNldCBkaWZmb2Zmc2V0KCRwKSAwCgl9CiAgICB9CgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkBAIiBtc2VwCiAgICBzZXQgbmxpbmVzIFtleHByIHskZ3JvdXBsaW5lZW5kIC0gJGdyb3VwbGluZXN0YXJ0fV0KICAgIHNldCBldmVudHMge30KICAgIHNldCBwbnVtIDAKICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCXNldCBzdGFydGxpbmUgW2V4cHIgeyRncm91cGxpbmVzdGFydCArICRkaWZmb2Zmc2V0KCRwKX1dCglzZXQgb2wgJHN0YXJ0bGluZQoJc2V0IG5sICRncm91cGxpbmVzdGFydAoJaWYge1tpbmZvIGV4aXN0cyBncm91cGh1bmtzKCRwKV19IHsKCSAgICBmb3JlYWNoIGggJGdyb3VwaHVua3MoJHApIHsKCQlzZXQgbCBbbGluZGV4ICRoIDJdCgkJaWYgeyRubCA8ICRsfSB7CgkJICAgIGZvciB7fSB7JG5sIDwgJGx9IHtpbmNyIG5sfSB7CgkJCXNldCBmaWxlbGluZXMoJHAsJGYsJG9sKSAkZmlsZWxpbmVzKCRpZCwkZiwkbmwpCgkJCWluY3Igb2wKCQkgICAgfQoJCX0KCQlmb3JlYWNoIGNodW5rIFtsaW5kZXggJGggNV0gewoJCSAgICBpZiB7W2xsZW5ndGggJGNodW5rXSA9PSAyfSB7CgkJCXNldCBvbGMgW2xpbmRleCAkY2h1bmsgMF0KCQkJc2V0IG5sYyBbbGluZGV4ICRjaHVuayAxXQoJCQlzZXQgbm5sIFtleHByIHskbmwgKyAkbmxjfV0KCQkJbGFwcGVuZCBldmVudHMgW2xpc3QgJG5sICRubmwgJHBudW0gJG9sYyAkbmxjXQoJCQlpbmNyIG9sICRvbGMKCQkJc2V0IG5sICRubmwKCQkgICAgfSBlbHNlIHsKCQkJaW5jciBvbCBbbGluZGV4ICRjaHVuayAwXQoJCQlpbmNyIG5sIFtsaW5kZXggJGNodW5rIDBdCgkJICAgIH0KCQl9CgkgICAgfQoJfQoJaWYgeyRubCA8ICRncm91cGxpbmVlbmR9IHsKCSAgICBmb3Ige30geyRubCA8ICRncm91cGxpbmVlbmR9IHtpbmNyIG5sfSB7CgkJc2V0IGZpbGVsaW5lcygkcCwkZiwkb2wpICRmaWxlbGluZXMoJGlkLCRmLCRubCkKCQlpbmNyIG9sCgkgICAgfQoJfQoJc2V0IG5saW5lcyBbZXhwciB7JG9sIC0gJHN0YXJ0bGluZX1dCgkkY3RleHQgaW5zZXJ0IGVuZCAiIC0kc3RhcnRsaW5lLCRubGluZXMiIG1zZXAKCWluY3IgcG51bQogICAgfQoKICAgIHNldCBubGluZXMgW2V4cHIgeyRncm91cGxpbmVlbmQgLSAkZ3JvdXBsaW5lc3RhcnR9XQogICAgJGN0ZXh0IGluc2VydCBlbmQgIiArJGdyb3VwbGluZXN0YXJ0LCRubGluZXMgQEBcbiIgbXNlcAoKICAgIHNldCBldmVudHMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRldmVudHNdCiAgICBzZXQgbmV2ZW50cyBbbGxlbmd0aCAkZXZlbnRzXQogICAgc2V0IG5tZXJnZSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKQogICAgc2V0IGwgJGdyb3VwbGluZXN0YXJ0CiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRuZXZlbnRzfSB7c2V0IGkgJGp9IHsKCXNldCBubCBbbGluZGV4ICRldmVudHMgJGkgMF0KCXdoaWxlIHskbCA8ICRubH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iCgkgICAgaW5jciBsCgl9CglzZXQgZSBbbGluZGV4ICRldmVudHMgJGldCglzZXQgZW5sIFtsaW5kZXggJGUgMV0KCXNldCBqICRpCglzZXQgYWN0aXZlIHt9Cgl3aGlsZSAxIHsKCSAgICBzZXQgcG51bSBbbGluZGV4ICRlIDJdCgkgICAgc2V0IG9sYyBbbGluZGV4ICRlIDNdCgkgICAgc2V0IG5sYyBbbGluZGV4ICRlIDRdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXX0gewoJCXNldCBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCQlsYXBwZW5kIGFjdGl2ZSAkcG51bQoJICAgIH0gZWxzZSB7CgkJaW5jciBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCSAgICB9CgkgICAgaWYge1tpbmNyIGpdID49ICRuZXZlbnRzfSBicmVhawoJICAgIHNldCBlIFtsaW5kZXggJGV2ZW50cyAkal0KCSAgICBpZiB7W2xpbmRleCAkZSAwXSA+PSAkZW5sfSBicmVhawoJICAgIGlmIHtbbGluZGV4ICRlIDFdID4gJGVubH0gewoJCXNldCBlbmwgW2xpbmRleCAkZSAxXQoJICAgIH0KCX0KCXNldCBubGMgW2V4cHIgeyRlbmwgLSAkbH1dCglzZXQgbmNvbCBtcmVzdWx0CglzZXQgYmVzdHBuIC0xCglpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZSAtIDF9IHsKCSAgICAjIG5vIGRpZmYgZm9yIG9uZSBvZiB0aGUgcGFyZW50cywgaS5lLiBpdCdzIGlkZW50aWNhbAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV19IHsKCQkgICAgaWYgeyRwbnVtIDwgJG1lcmdlbWF4fSB7CgkJCWxhcHBlbmQgbmNvbCBtJHBudW0KCQkgICAgfSBlbHNlIHsKCQkJbGFwcGVuZCBuY29sIG1tYXgKCQkgICAgfQoJCSAgICBicmVhawoJCX0KCSAgICB9Cgl9IGVsc2VpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZX0gewoJICAgICMgYWxsIHBhcmVudHMgYXJlIGRpZmZlcmVudCwgc2VlIGlmIG9uZSBpcyB2ZXJ5IHNpbWlsYXIKCSAgICBzZXQgYmVzdHNpbSAzMAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCXNldCBzaW0gW3NpbWlsYXJpdHkgJHBudW0gJGwgJG5sYyAkZiBcCgkJCSAgICAgW2xyYW5nZSAkZXZlbnRzICRpIFtleHByIHskai0xfV1dXQoJCWlmIHskc2ltID4gJGJlc3RzaW19IHsKCQkgICAgc2V0IGJlc3RzaW0gJHNpbQoJCSAgICBzZXQgYmVzdHBuICRwbnVtCgkJfQoJICAgIH0KCSAgICBpZiB7JGJlc3RwbiA+PSAwfSB7CgkJbGFwcGVuZCBuY29sIG0kYmVzdHBuCgkgICAgfQoJfQoJc2V0IHBudW0gLTEKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpbmNyIHBudW0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldIHx8ICRwbnVtID09ICRiZXN0cG59IGNvbnRpbnVlCgkgICAgc2V0IG9sYyBbZXhwciB7JG5sYyArICRkZWx0YSgkcG51bSl9XQoJICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQoJICAgIGluY3IgZGlmZm9mZnNldCgkcCkgJGRlbHRhKCRwbnVtKQoJICAgIHVuc2V0IGRlbHRhKCRwbnVtKQoJICAgIGZvciB7fSB7JG9sYyA+IDB9IHtpbmNyIG9sYyAtMX0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICItJGZpbGVsaW5lcygkcCwkZiwkb2wpXG4iIG0kcG51bQoJCWluY3Igb2wKCSAgICB9Cgl9CglzZXQgZW5kbCBbZXhwciB7JGwgKyAkbmxjfV0KCWlmIHskYmVzdHBuID49IDB9IHsKCSAgICAjIHNob3cgdGhpcyBwcmV0dHkgbXVjaCBhcyBhIG5vcm1hbCBkaWZmCgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRiZXN0cG5dCgkgICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCgkgICAgaW5jciBkaWZmb2Zmc2V0KCRwKSAkZGVsdGEoJGJlc3RwbikKCSAgICB1bnNldCBkZWx0YSgkYmVzdHBuKQoJICAgIGZvciB7c2V0IGsgJGl9IHskayA8ICRqfSB7aW5jciBrfSB7CgkJc2V0IGUgW2xpbmRleCAkZXZlbnRzICRrXQoJCWlmIHtbbGluZGV4ICRlIDJdICE9ICRiZXN0cG59IGNvbnRpbnVlCgkJc2V0IG5sIFtsaW5kZXggJGUgMF0KCQlzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCQlmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgkJfQoJCXNldCBjIFtsaW5kZXggJGUgM10KCQlmb3Ige30geyRjID4gMH0ge2luY3IgYyAtMX0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiLSRmaWxlbGluZXMoJHAsJGYsJG9sKVxuIiBtJGJlc3RwbgoJCSAgICBpbmNyIG9sCgkJfQoJCXNldCBubCBbbGluZGV4ICRlIDFdCgkJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiKyRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIiBtcmVzdWx0CgkJfQoJICAgIH0KCX0KCWZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgl9CiAgICB9CiAgICB3aGlsZSB7JGwgPCAkZ3JvdXBsaW5lZW5kfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiICRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIgoJaW5jciBsCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBzaW1pbGFyaXR5IHtwbnVtIGwgbmxjIGYgZXZlbnRzfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgcGFyZW50cyBkaWZmb2Zmc2V0IGZpbGVsaW5lcwoKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkcG51bV0KICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQogICAgc2V0IGVuZGwgW2V4cHIgeyRsICsgJG5sY31dCiAgICBzZXQgc2FtZSAwCiAgICBzZXQgZGlmZiAwCiAgICBmb3JlYWNoIGUgJGV2ZW50cyB7CglpZiB7W2xpbmRleCAkZSAyXSAhPSAkcG51bX0gY29udGludWUKCXNldCBubCBbbGluZGV4ICRlIDBdCglzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCSAgICBpbmNyIHNhbWUgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJICAgIGluY3Igc2FtZQoJfQoJc2V0IG9jIFtsaW5kZXggJGUgM10KCWZvciB7fSB7JG9jID4gMH0ge2luY3Igb2MgLTF9IHsKCSAgICBpbmNyIGRpZmYgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkcCwkZiwkb2wpXQoJICAgIGluY3IgZGlmZgoJICAgIGluY3Igb2wKCX0KCXNldCBubCBbbGluZGV4ICRlIDFdCglmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkgICAgaW5jciBkaWZmIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCSAgICBpbmNyIGRpZmYKCX0KICAgIH0KICAgIGZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJaW5jciBzYW1lIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCWluY3Igc2FtZQogICAgfQogICAgaWYgeyRzYW1lID09IDB9IHsKCXJldHVybiAwCiAgICB9CiAgICByZXR1cm4gW2V4cHIgezIwMCAqICRzYW1lIC8gKDIgKiAkc2FtZSArICRkaWZmKX1dCn0KCnByb2Mgc3RhcnRkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZyBkaWZmbWVyZ2VpZAoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJICAgIGdldHRyZWVkaWZmcyAkaWRzCgl9CiAgICB9IGVsc2UgewoJYWRkdG9jZmxpc3QgJGlkcwogICAgfQp9Cgpwcm9jIGFkZHRvY2ZsaXN0IHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgY2ZsaXN0CiAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGYKICAgIH0KICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiBwYXJlbnRzIHRyZWVwZW5kaW5nCiAgICBzZXQgdHJlZXBlbmRpbmcgJGlkcwogICAgc2V0IHRyZWVkaWZmIHt9CiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gInxnaXQtZGlmZi10cmVlIC1yICRpZCIgcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGlkcyAhPSAkZGlmZmlkc30gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfSBlbHNlIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJCWNvbnRtZXJnZWRpZmYgJGlkcwoJICAgIH0gZWxzZSB7CgkJYWRkdG9jZmxpc3QgJGlkcwoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtcCAtQyAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZuZXh0aGVhZCBkaWZmbmV4dG5vdGUgZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwogICAgZ2xvYmFsIGdhdWR5ZGlmZgoKICAgIHNldCBuIFtnZXRzICRiZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRiZGZdfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCglzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGhlYWRlciAkbmV3bmFtZQoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRmbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkgICAgaW5jciBpCgkgICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkgICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0Cgl9CglpZiB7JG5ld25hbWUgIT0gJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRuZXduYW1lXQoJICAgIGlmIHskaSA+PSAwfSB7CgkJc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkJaW5jciBpCgkJJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0CgkgICAgfQoJfQoJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgoJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZGlmZmluaGRyIDEKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteKC0tLXxcK1wrXCspfSAkbGluZV19IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHskZ2F1ZHlkaWZmfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0IiBodW5rc2VwCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAgICAkZjFsICAgICIgZDAgIiAgICAkZjJsICAgICIgZDEKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICAgICRyZXN0IFxuIiBodW5rc2VwCgl9IGVsc2UgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCgl9CglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICBpZiB7JGdhdWR5ZGlmZn0gewoJCXNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkJc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCgl9IGVsc2VpZiB7JGRpZmZpbmhkciB8fCAkeCA9PSAiXFwifSB7CgkgICAgIyBlLmcuICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0gZWxzZSB7CgkgICAgIyBTb21ldGhpbmcgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUKCSAgICBpZiB7JGN1cmRpZmZ0YWcgIT0gIkNvbW1lbnRzIn0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCQlzZXQgY3VyZGlmZnRhZyBDb21tZW50cwoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJaW5jciBuZXh0dXBkYXRlIDEwMAoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUge30KCXVwZGF0ZQoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgImdldGJsb2JkaWZmbGluZSAkYmRmIHskaWRzfSIKICAgIH0KfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yIHtzZXQgaSAwfSB7W2luZm8gZXhpc3RzIGRpZmZmaWxlc3RhcnQoJGkpXX0ge2luY3IgaX0gewoJaWYge1skY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPiAkaGVyZV19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBwb3NdCgkJfHwgWyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA8ICRwb3NdfSB7CgkJc2V0IHBvcyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBvc119IHsKCSRjdGV4dCB5dmlldyAkcG9zCiAgICB9Cn0KCnByb2MgbGlzdGJveHNlbCB7fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IGN1cnJlbnRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgc2VsIFtsc29ydCBbJGNmbGlzdCBjdXJzZWxlY3Rpb25dXQogICAgaWYgeyRzZWwgZXEge319IHJldHVybgogICAgc2V0IGZpcnN0IFtsaW5kZXggJHNlbCAwXQogICAgY2F0Y2ggeyRjdGV4dCB5dmlldyBmbWFyay4kZmlyc3R9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciAzICsgMC41ICogJGxpbmVzcGNdCiAgICBzZXQgY2FudngwIFtleHByIDMgKyAwLjUgKiAkbGluZXNwY10KICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgc2V0IHhzcGMxKDApICRsaW5lc3BjCiAgICBzZXQgeHNwYzIgJGxpbmVzcGMKfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIHBoYXNlCiAgICBpZiB7JHN0b3BwZWQgPiAxfSByZXR1cm4KICAgIGlmIHskcGhhc2UgPT0gImdldGNvbW1pdHMifSByZXR1cm4KICAgIHNldCByZWRpc3BsYXlpbmcgMQogICAgaWYgeyRwaGFzZSA9PSAiZHJhd2dyYXBoIiB8fCAkcGhhc2UgPT0gImluY3JkcmF3In0gewoJc2V0IHN0b3BwZWQgMQogICAgfSBlbHNlIHsKCWRyYXdncmFwaAogICAgfQp9Cgpwcm9jIGluY3Jmb250IHtpbmN9IHsKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCB0ZXh0Zm9udCBjdGV4dCBjYW52IHBoYXNlCiAgICBnbG9iYWwgc3RvcHBlZCBlbnRyaWVzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbWFpbmZvbnQgW2xyZXBsYWNlICRtYWluZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG1haW5mb250IDFdICsgJGluY31dXQogICAgc2V0IG5hbWVmb250IFtscmVwbGFjZSAkbmFtZWZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRuYW1lZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgkkZSBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHsKCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIHJlZGlzcGxheQp9Cgpwcm9jIGNsZWFyc2hhMSB7fSB7CiAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hhMXN0cmluZ10gPT0gNDB9IHsKCSRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICB9Cn0KCnByb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBzaGExYnV0CiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1skc2hhMWJ1dCBjZ2V0IC1zdGF0ZV0gPT0gJHN0YXRlfSByZXR1cm4KICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIG5vcm1hbCAtcmVsaWVmIHJhaXNlZCAtdGV4dCAiR290bzogIgogICAgfSBlbHNlIHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgogICAgfQp9Cgpwcm9jIGdvdG9jb21taXQge30gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIGlkbGluZSB0YWdpZHMKICAgIGdsb2JhbCBsaW5laWQgbnVtY29tbWl0cwoKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGxpbmVpZCgkbCldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkbGluZWlkKCRsKQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpIDEKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWciCiAgICB9CiAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgp9Cgpwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjb21taXRpbmZvIGNhbnYKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSByZXR1cm4KICAgIHNldCBob3ZlcnggJHgKICAgIHNldCBob3ZlcnkgJHkKICAgIHNldCBob3ZlcmlkICRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCiAgICB9CiAgICBzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgICRjYW52IGRlbGV0ZSBob3Zlcgp9Cgpwcm9jIGxpbmVtb3Rpb24ge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCXNldCBob3ZlcnggJHgKCXNldCBob3ZlcnkgJHkKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCX0KCXNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgfQp9Cgpwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKICAgIGdsb2JhbCBob3ZlcmlkIGhvdmVydGltZXIgY2FudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CgkkY2FudiBkZWxldGUgaG92ZXIKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCSAgICB1bnNldCBob3ZlcnRpbWVyCgl9Cgl1bnNldCBob3ZlcmlkCiAgICB9Cn0KCnByb2MgbGluZWhvdmVyIHt9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBtYWluZm9udAoKICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHggW2V4cHIgeyRob3ZlcnggKyAyICogJGxpbmVzcGN9XQogICAgc2V0IHkgW2V4cHIgeyRob3ZlcnkgKyAkeWZyYWMgKiAkeW1heCAtICRsaW5lc3BjIC8gMn1dCiAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MCBbZXhwciB7JHkgLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHgxIFtleHByIHskeCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XSArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0YW5nbGUgJHgwICR5MCAkeDEgJHkxIFwKCSAgICAgICAtZmlsbCBcI2ZmZmY4MCAtb3V0bGluZSBibGFjayAtd2lkdGggMSAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHggJHkgLWFuY2hvciBudyAtdGV4dCAkdGV4dCAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgY2xpY2tpc29uYXJyb3cge2lkIHl9IHsKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcyBsdGhpY2tuZXNzCgogICAgc2V0IHRocmVzaCBbZXhwciB7MiAqICRsdGhpY2tuZXNzICsgNn1dCiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglpZiB7JG1haW5saW5lYXJyb3coJGlkKSBuZSAibm9uZSJ9IHsKCSAgICBpZiB7YWJzKFtsaW5kZXggJG1haW5saW5lKCRpZCkgMV0gLSAkeSkgPCAkdGhyZXNofSB7CgkJcmV0dXJuICJ1cCIKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgYXJyb3cgW2xpbmRleCAkbHMgMl0KCSAgICBpZiB7JGFycm93IGVxICJmaXJzdCIgfHwgJGFycm93IGVxICJib3RoIn0gewoJCWlmIHthYnMoW2xpbmRleCAkY29vcmRzIDFdIC0gJHkpIDwgJHRocmVzaH0gewoJCSAgICByZXR1cm4gInVwIgoJCX0KCSAgICB9CgkgICAgaWYgeyRhcnJvdyBlcSAibGFzdCIgfHwgJGFycm93IGVxICJib3RoIn0gewoJCWlmIHthYnMoW2xpbmRleCAkY29vcmRzIGVuZF0gLSAkeSkgPCAkdGhyZXNofSB7CgkJICAgIHJldHVybiAiZG93biIKCQl9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgYXJyb3dqdW1wIHtpZCBkaXJuIHl9IHsKICAgIGdsb2JhbCBtYWlubGluZSBzaWRlbGluZXMgY2FudgoKICAgIHNldCB5dCB7fQogICAgaWYgeyRkaXJuIGVxICJkb3duIn0gewoJaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJICAgIHNldCB5MSBbbGluZGV4ICRtYWlubGluZSgkaWQpIDFdCgkgICAgaWYgeyR5MSA+ICR5fSB7CgkJc2V0IHl0ICR5MQoJICAgIH0KCX0KCWlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7CgkgICAgZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJCXNldCB5MSBbbGluZGV4ICRscyAwIDFdCgkJaWYgeyR5MSA+ICR5ICYmICgkeXQgZXEge30gfHwgJHkxIDwgJHl0KX0gewoJCSAgICBzZXQgeXQgJHkxCgkJfQoJICAgIH0KCX0KICAgIH0gZWxzZSB7CglpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJICAgIGZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCQlzZXQgeTEgW2xpbmRleCAkbHMgMCBlbmRdCgkJaWYgeyR5MSA8ICR5ICYmICgkeXQgZXEge30gfHwgJHkxID4gJHl0KX0gewoJCSAgICBzZXQgeXQgJHkxCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskeXQgZXEge319IHJldHVybgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4IDw9IDB9IHJldHVybgogICAgc2V0IHZpZXcgWyRjYW52IHl2aWV3XQogICAgc2V0IHlzcGFuIFtleHByIHtbbGluZGV4ICR2aWV3IDFdIC0gW2xpbmRleCAkdmlldyAwXX1dCiAgICBzZXQgeWZyYWMgW2V4cHIgeyR5dCAvICR5bWF4IC0gJHlzcGFuIC8gMn1dCiAgICBpZiB7JHlmcmFjIDwgMH0gewoJc2V0IHlmcmFjIDAKICAgIH0KICAgICRjYW52IHl2aWV3IG1vdmV0byAkeWZyYWMKfQoKcHJvYyBsaW5lY2xpY2sge3ggeSBpZCBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdGluZm8gY2hpbGRyZW4gY2ZsaXN0IGNhbnYgdGhpY2tlcmxpbmUKCiAgICB1bm1hcmttYXRjaGVzCiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgIyBkcmF3IHRoaXMgbGluZSB0aGlja2VyIHRoYW4gbm9ybWFsCiAgICBkcmF3bGluZXMgJGlkIDEKICAgIHNldCB0aGlja2VybGluZSAkaWQKICAgIGlmIHskaXNuZXd9IHsKCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCWlmIHskeW1heCBlcSB7fX0gcmV0dXJuCglzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCglzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICB9CiAgICBzZXQgZGlybiBbY2xpY2tpc29uYXJyb3cgJGlkICR5XQogICAgaWYgeyRkaXJuIG5lIHt9fSB7CglhcnJvd2p1bXAgJGlkICRkaXJuICR5CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3QgbGluZWNsaWNrICR4ICR5ICRpZCAwXQogICAgfQogICAgIyBmaWxsIHRoZSBkZXRhaWxzIHBhbmUgd2l0aCBpbmZvIGFib3V0IHRoaXMgbGluZQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50Olx0IgogICAgJGN0ZXh0IGluc2VydCBlbmQgJGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJGlkXQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0W2xpbmRleCAkaW5mbyAyXVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkaWQpXX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuQ2hpbGRyZW46IgoJc2V0IGkgMAoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaW5jciBpCgkgICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGNoaWxkKQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0IgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICRjaGlsZCBbbGlzdCBsaW5rIGxpbmskaV0KCSAgICAkY3RleHQgdGFnIGJpbmQgbGluayRpIDwxPiBbbGlzdCBzZWxieWlkICRjaGlsZF0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF0iCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0RGF0ZTpcdFtsaW5kZXggJGluZm8gMl1cbiIKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCn0KCnByb2Mgbm9ybWFsbGluZSB7fSB7CiAgICBnbG9iYWwgdGhpY2tlcmxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdfSB7CglkcmF3bGluZXMgJHRoaWNrZXJsaW5lIDAKCXVuc2V0IHRoaWNrZXJsaW5lCiAgICB9Cn0KCnByb2Mgc2VsYnlpZCB7aWR9IHsKICAgIGdsb2JhbCBpZGxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglzZWxlY3RsaW5lICRpZGxpbmUoJGlkKSAxCiAgICB9Cn0KCnByb2MgbXN0aW1lIHt9IHsKICAgIGdsb2JhbCBzdGFydG1zdGltZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc3RhcnRtc3RpbWVdfSB7CglzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiUuM2YiIFtleHByIHsoW2Nsb2NrIGNsaWNrIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXN0aW1lKSAvIDEwMDAuMH1dXQp9Cgpwcm9jIHJvd21lbnUge3ggeSBpZH0gewogICAgZ2xvYmFsIHJvd2N0eG1lbnUgaWRsaW5lIHNlbGVjdGVkbGluZSByb3dtZW51aWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICRpZGxpbmUoJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAwIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMiAtc3RhdGUgJHN0YXRlCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKfQoKcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKICAgIGdsb2JhbCByb3dtZW51aWQgc2VsZWN0ZWRsaW5lIGxpbmVpZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyRkaXJufSB7CglzZXQgb2xkaWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQoJc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIH0gZWxzZSB7CglzZXQgb2xkaWQgJHJvd21lbnVpZAoJc2V0IG5ld2lkICRsaW5laWQoJHNlbGVjdGVkbGluZSkKICAgIH0KICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KICAgIGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkCn0KCnByb2MgZG9zZWxkaWZmIHtvbGRpZCBuZXdpZH0gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdAogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4wIDAuMAogICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4wIGxlZnQKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIlRvcCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICIKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkb2xkaWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkb2xkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cblRvICAgIgogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsxIDwxPiBbbGlzdCBzZWxieWlkICRuZXdpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRuZXdpZCBbbGlzdCBsaW5rIGxpbmsxXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgIHN0YXJ0ZGlmZiBbbGlzdCAkbmV3aWQgJG9sZGlkXQp9Cgpwcm9jIG1rcGF0Y2gge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJyZW50aWQgY29tbWl0aW5mbyBwYXRjaHRvcCBwYXRjaG51bQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRpZF19IHJldHVybgogICAgc2V0IG9sZGlkICRjdXJyZW50aWQKICAgIHNldCBvbGRoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIHNldCBuZXdoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgc2V0IHRvcCAucGF0Y2gKICAgIHNldCBwYXRjaHRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiR2VuZXJhdGUgcGF0Y2giCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mcm9tIC10ZXh0ICJGcm9tOiIKICAgIGVudHJ5ICR0b3AuZnJvbXNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9tc2hhMSBpbnNlcnQgMCAkb2xkaWQKICAgICR0b3AuZnJvbXNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5mcm9tICR0b3AuZnJvbXNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmZyb21oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbWhlYWQgaW5zZXJ0IDAgJG9sZGhlYWQKICAgICR0b3AuZnJvbWhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmZyb21oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50byAtdGV4dCAiVG86IgogICAgZW50cnkgJHRvcC50b3NoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b3NoYTEgaW5zZXJ0IDAgJG5ld2lkCiAgICAkdG9wLnRvc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLnRvICR0b3AudG9zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC50b2hlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b2hlYWQgaW5zZXJ0IDAgJG5ld2hlYWQKICAgICR0b3AudG9oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC50b2hlYWQgLXN0aWNreSB3CiAgICBidXR0b24gJHRvcC5yZXYgLXRleHQgIlJldmVyc2UiIC1jb21tYW5kIG1rcGF0Y2hyZXYgLXBhZHggNQogICAgZ3JpZCAkdG9wLnJldiB4IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAicGF0Y2gkcGF0Y2hudW0ucGF0Y2giXQogICAgaW5jciBwYXRjaG51bQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkdlbmVyYXRlIiAtY29tbWFuZCBta3BhdGNoZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rcGF0Y2hjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIG1rcGF0Y2hyZXYge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG9sZGhlYWQgWyRwYXRjaHRvcC5mcm9taGVhZCBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IG5ld2hlYWQgWyRwYXRjaHRvcC50b2hlYWQgZ2V0XQogICAgZm9yZWFjaCBlIFtsaXN0IGZyb21zaGExIGZyb21oZWFkIHRvc2hhMSB0b2hlYWRdIFwKCSAgICB2IFtsaXN0ICRuZXdpZCAkbmV3aGVhZCAkb2xkaWQgJG9sZGhlYWRdIHsKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSBub3JtYWwKCSRwYXRjaHRvcC4kZSBkZWxldGUgMCBlbmQKCSRwYXRjaHRvcC4kZSBpbnNlcnQgMCAkdgoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICB9Cn0KCnByb2MgbWtwYXRjaGdvIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgZm5hbWUgWyRwYXRjaHRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIGdpdC1kaWZmLXRyZWUgLXAgJG9sZGlkICRuZXdpZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyBwYXRjaDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWtwYXRjaGNhbiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rdGFnIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgbWt0YWd0b3AgY29tbWl0aW5mbwoKICAgIHNldCB0b3AgLm1ha2V0YWcKICAgIHNldCBta3RhZ3RvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiQ3JlYXRlIHRhZyIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50bGFiIC10ZXh0ICJUYWcgbmFtZToiCiAgICBlbnRyeSAkdG9wLnRhZyAtd2lkdGggNjAKICAgIGdyaWQgJHRvcC50bGFiICR0b3AudGFnIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBta3RhZ2dvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3RhZ2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnRhZwp9Cgpwcm9jIGRvbWt0YWcge30gewogICAgZ2xvYmFsIG1rdGFndG9wIGVudiB0YWdpZHMgaWR0YWdzCgogICAgc2V0IGlkIFskbWt0YWd0b3Auc2hhMSBnZXRdCiAgICBzZXQgdGFnIFskbWt0YWd0b3AudGFnIGdldF0KICAgIGlmIHskdGFnID09IHt9fSB7CgllcnJvcl9wb3B1cCAiTm8gdGFnIG5hbWUgc3BlY2lmaWVkIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkdGFnKV19IHsKCWVycm9yX3BvcHVwICJUYWcgXCIkdGFnXCIgYWxyZWFkeSBleGlzdHMiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbY2F0Y2ggewoJc2V0IGRpciBbZ2l0ZGlyXQoJc2V0IGZuYW1lIFtmaWxlIGpvaW4gJGRpciAicmVmcy90YWdzIiAkdGFnXQoJc2V0IGYgW29wZW4gJGZuYW1lIHddCglwdXRzICRmICRpZAoJY2xvc2UgJGYKICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHRhZzogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCB0YWdpZHMoJHRhZykgJGlkCiAgICBsYXBwZW5kIGlkdGFncygkaWQpICR0YWcKICAgIHJlZHJhd3RhZ3MgJGlkCn0KCnByb2MgcmVkcmF3dGFncyB7aWR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIGlkbGluZSBpZHBvcyBzZWxlY3RlZGxpbmUKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHJldHVybgogICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKICAgIHNldCB4dCBbZXZhbCBkcmF3dGFncyAkaWQgJGlkcG9zKCRpZCldCiAgICAkY2FudiBjb29yZHMgJGxpbmVodGFnKCRpZGxpbmUoJGlkKSkgJHh0IFtsaW5kZXggJGlkcG9zKCRpZCkgMl0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID09ICRpZGxpbmUoJGlkKX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBta3RhZ2NhbiB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkbWt0YWd0b3B9CiAgICB1bnNldCBta3RhZ3RvcAp9Cgpwcm9jIG1rdGFnZ28ge30gewogICAgZG9ta3RhZwogICAgbWt0YWdjYW4KfQoKcHJvYyB3cml0ZWNvbW1pdCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHdyY29tdG9wIGNvbW1pdGluZm8gd3Jjb21jbWQKCiAgICBzZXQgdG9wIC53cml0ZWNvbW1pdAogICAgc2V0IHdyY29tdG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJXcml0ZSBjb21taXQgdG8gZmlsZSIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5jbGFiIC10ZXh0ICJDb21tYW5kOiIKICAgIGVudHJ5ICR0b3AuY21kIC13aWR0aCA2MCAtdGV4dHZhcmlhYmxlIHdyY29tY21kCiAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB3cmNvbWNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2Mgd3Jjb21nbyB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KICAgIHNldCBjbWQgImVjaG8gJGlkIHwgWyR3cmNvbXRvcC5jbWQgZ2V0XSIKICAgIHNldCBmbmFtZSBbJHdyY29tdG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciB3cml0aW5nIGNvbW1pdDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2Mgd3Jjb21jYW4ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyBsaXN0cmVmcyB7aWR9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCB4IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IHggJGlkdGFncygkaWQpCiAgICB9CiAgICBzZXQgeSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeSAkaWRoZWFkcygkaWQpCiAgICB9CiAgICBzZXQgeiB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHogJGlkb3RoZXJyZWZzKCRpZCkKICAgIH0KICAgIHJldHVybiBbbGlzdCAkeCAkeSAkel0KfQoKcHJvYyByZXJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIHRhZ2lkcyBoZWFkaWRzIG90aGVycmVmaWRzCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICBmb3JlYWNoIHYge3RhZ2lkcyBpZHRhZ3MgaGVhZGlkcyBpZGhlYWRzIG90aGVycmVmaWRzIGlkb3RoZXJyZWZzfSB7CgljYXRjaCB7dW5zZXQgJHZ9CiAgICB9CiAgICByZWFkcmVmcwogICAgc2V0IHJlZmlkcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRyZWZpZHMgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCQlbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV1dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJc2V0IHYgW2xpc3RyZWZzICRpZF0KCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXSB8fCAkcmVmKCRpZCkgIT0gJHZ9IHsKCSAgICByZWRyYXd0YWdzICRpZAoJfQogICAgfQp9Cgpwcm9jIHNob3d0YWcge3RhZyBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgc2V0IGxpbmtudW0gMAogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCXNldCB0ZXh0ICR0YWdjb250ZW50cygkdGFnKQogICAgfSBlbHNlIHsKCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAp9Cgpwcm9jIGRvcXVpdCB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZAogICAgc2V0IHN0b3BwZWQgMTAwCiAgICBkZXN0cm95IC4KfQoKIyBkZWZhdWx0cy4uLgpzZXQgZGF0ZW1vZGUgMApzZXQgYm9sZG5hbWVzIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQpzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgZ2F1ZHlkaWZmIDAKc2V0IG1heGdyYXBocGN0IDUwCnNldCBtYXh3aWR0aCAxNgoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9CgpzZXQgbmFtZWZvbnQgJG1haW5mb250CmlmIHskYm9sZG5hbWVzfSB7CiAgICBsYXBwZW5kIG5hbWVmb250IGJvbGQKfQoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWIiIHsgc2V0IGJvbGRuYW1lcyAxIH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMAoKc2V0IHN0b3BwZWQgMApzZXQgcmVkaXNwbGF5aW5nIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwpyZWFkcmVmcwpnZXRjb21taXRzICRyZXZ0cmVlYXJncwo=