IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBnZXRjb21taXRzIHtyYXJnc30gewogICAgZ2xvYmFsIGNvbW1pdHMgY29tbWZkIHBoYXNlIGNhbnYgbWFpbmZvbnQgZW52CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvciBsZWZ0b3ZlcgoKICAgICMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgogICAgc2V0IGdpdGRpciBbZ2l0ZGlyXQogICAgaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkZ2l0ZGlyXX0gewoJZXJyb3JfcG9wdXAgIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKCWV4aXQgMQogICAgfQogICAgc2V0IGNvbW1pdHMge30KICAgIHNldCBwaGFzZSBnZXRjb21taXRzCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciAkc3RhcnRtc2VjcyArIDEwMF0KICAgIHNldCBuY211cGRhdGUgMQogICAgaWYgW2NhdGNoIHsKCXNldCBwYXJzZV9hcmdzIFtjb25jYXQgLS1kZWZhdWx0IEhFQUQgJHJhcmdzXQoJc2V0IHBhcnNlZF9hcmdzIFtzcGxpdCBbZXZhbCBleGVjIGdpdC1yZXYtcGFyc2UgJHBhcnNlX2FyZ3NdICJcbiJdCiAgICB9XSB7CgkjIGlmIGdpdC1yZXYtcGFyc2UgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4uLgoJaWYgeyRyYXJncyA9PSB7fX0gewoJICAgIHNldCByYXJncyBIRUFECgl9CglzZXQgcGFyc2VkX2FyZ3MgJHJhcmdzCiAgICB9CiAgICBpZiBbY2F0Y2ggewoJc2V0IGNvbW1mZCBbb3BlbiAifGdpdC1yZXYtbGlzdCAtLWhlYWRlciAtLXRvcG8tb3JkZXIgLS1wYXJlbnRzICRwYXJzZWRfYXJncyIgcl0KICAgIH0gZXJyXSB7CglwdXRzIHN0ZGVyciAiRXJyb3IgZXhlY3V0aW5nIGdpdC1yZXYtbGlzdDogJGVyciIKCWV4aXQgMQogICAgfQogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGxmCiAgICBmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgJGNhbnYgZGVsZXRlIGFsbAogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAp9Cgpwcm9jIGdldGNvbW1pdGxpbmVzIHtjb21tZmR9ICB7CiAgICBnbG9iYWwgY29tbWl0cyBwYXJlbnRzIGNkYXRlIGNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBoYXNlIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzdG9wcGVkIHJlZGlzcGxheWluZyBsZWZ0b3ZlcgoKICAgIHNldCBzdHVmZiBbcmVhZCAkY29tbWZkXQogICAgaWYgeyRzdHVmZiA9PSB7fX0gewoJaWYgeyFbZW9mICRjb21tZmRdfSByZXR1cm4KCSMgc2V0IGl0IGJsb2NraW5nIHNvIHdlIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIHRlcm1pbmF0ZQoJZmNvbmZpZ3VyZSAkY29tbWZkIC1ibG9ja2luZyAxCglpZiB7IVtjYXRjaCB7Y2xvc2UgJGNvbW1mZH0gZXJyXX0gewoJICAgIGFmdGVyIGlkbGUgZmluaXNoY29tbWl0cwoJICAgIHJldHVybgoJfQoJaWYge1tzdHJpbmcgcmFuZ2UgJGVyciAwIDRdID09ICJ1c2FnZSJ9IHsKCSAgICBzZXQgZXJyIFwKe0dpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0czogYmFkIGFyZ3VtZW50cyB0byBnaXQtcmV2LWxpc3QuCihOb3RlOiBhcmd1bWVudHMgdG8gZ2l0ayBhcmUgcGFzc2VkIHRvIGdpdC1yZXYtbGlzdAp0byBhbGxvdyBzZWxlY3Rpb24gb2YgY29tbWl0cyB0byBiZSBkaXNwbGF5ZWQuKX0KCX0gZWxzZSB7CgkgICAgc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzOiAkZXJyIgoJfQoJZXJyb3JfcG9wdXAgJGVycgoJZXhpdCAxCiAgICB9CiAgICBzZXQgc3RhcnQgMAogICAgd2hpbGUgMSB7CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcMCIgJHN0dWZmICRzdGFydF0KCWlmIHskaSA8IDB9IHsKCSAgICBhcHBlbmQgbGVmdG92ZXIgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IGVuZF0KCSAgICByZXR1cm4KCX0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBbZXhwciB7JGkgLSAxfV1dCglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAiJGxlZnRvdmVyJGNtaXQiCgkgICAgc2V0IGxlZnRvdmVyIHt9Cgl9CglzZXQgc3RhcnQgW2V4cHIgeyRpICsgMX1dCglzZXQgaiBbc3RyaW5nIGZpcnN0ICJcbiIgJGNtaXRdCglzZXQgb2sgMAoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgc2V0IG9rIDEKCSAgICBmb3JlYWNoIGlkICRpZHMgewoJCWlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglzZXQgb2xkcyBbbHJhbmdlICRpZHMgMSBlbmRdCglzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRjbWl0IFtleHByIHskaiArIDF9XSBlbmRdCglsYXBwZW5kIGNvbW1pdHMgJGlkCglzZXQgY29tbWl0bGlzdGVkKCRpZCkgMQoJcGFyc2Vjb21taXQgJGlkICRjbWl0IDEgW2xyYW5nZSAkaWRzIDEgZW5kXQoJZHJhd2NvbW1pdCAkaWQKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CgkgICAgZG91cGRhdGUgMQoJfQoJd2hpbGUgeyRyZWRpc3BsYXlpbmd9IHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCSAgICBpZiB7JHN0b3BwZWQgPT0gMX0gewoJCXNldCBzdG9wcGVkIDAKCQlzZXQgcGhhc2UgImdldGNvbW1pdHMiCgkJZm9yZWFjaCBpZCAkY29tbWl0cyB7CgkJICAgIGRyYXdjb21taXQgJGlkCgkJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCQkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQkJZG91cGRhdGUgMQoJCSAgICB9CgkJfQoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlIG51bWNvbW1pdHMgbmNtdXBkYXRlCgogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSB7fQogICAgfQogICAgdXBkYXRlCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCiAgICBpZiB7JG51bWNvbW1pdHMgPCAxMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMX1dCiAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPCAxMDAwMH0gewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCiAgICB9IGVsc2UgewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMDB9XQogICAgfQogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgfQp9Cgpwcm9jIHJlYWRjb21taXQge2lkfSB7CiAgICBpZiBbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQtY2F0LWZpbGUgY29tbWl0ICRpZF19XSByZXR1cm4KICAgIHBhcnNlY29tbWl0ICRpZCAkY29udGVudHMgMCB7fQp9Cgpwcm9jIHBhcnNlY29tbWl0IHtpZCBjb250ZW50cyBsaXN0ZWQgb2xkc30gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgbnBhcmVudHMgY2RhdGUgbmNsZWZ0CgogICAgc2V0IGluaGRyIDEKICAgIHNldCBjb21tZW50IHt9CiAgICBzZXQgaGVhZGxpbmUge30KICAgIHNldCBhdW5hbWUge30KICAgIHNldCBhdWRhdGUge30KICAgIHNldCBjb21uYW1lIHt9CiAgICBzZXQgY29tZGF0ZSB7fQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGlkKSB7fQoJc2V0IG5jaGlsZHJlbigkaWQpIDAKCXNldCBuY2xlZnQoJGlkKSAwCiAgICB9CiAgICBzZXQgcGFyZW50cygkaWQpICRvbGRzCiAgICBzZXQgbnBhcmVudHMoJGlkKSBbbGxlbmd0aCAkb2xkc10KICAgIGZvcmVhY2ggcCAkb2xkcyB7CglpZiB7IVtpbmZvIGV4aXN0cyBuY2hpbGRyZW4oJHApXX0gewoJICAgIHNldCBjaGlsZHJlbigkcCkgW2xpc3QgJGlkXQoJICAgIHNldCBuY2hpbGRyZW4oJHApIDEKCSAgICBzZXQgbmNsZWZ0KCRwKSAxCgl9IGVsc2VpZiB7W2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGlkXSA8IDB9IHsKCSAgICBsYXBwZW5kIGNoaWxkcmVuKCRwKSAkaWQKCSAgICBpbmNyIG5jaGlsZHJlbigkcCkKCSAgICBpbmNyIG5jbGVmdCgkcCkKCX0KICAgIH0KICAgIHNldCBoZHJlbmQgW3N0cmluZyBmaXJzdCAiXG5cbiIgJGNvbnRlbnRzXQogICAgaWYgeyRoZHJlbmQgPCAwfSB7CgkjIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KCXNldCBoZHJlbmQgW3N0cmluZyBsZW5ndGggJGNvbnRlbnRzXQogICAgfQogICAgc2V0IGhlYWRlciBbc3RyaW5nIHJhbmdlICRjb250ZW50cyAwIFtleHByIHskaGRyZW5kIC0gMX1dXQogICAgc2V0IGNvbW1lbnQgW3N0cmluZyByYW5nZSAkY29udGVudHMgW2V4cHIgeyRoZHJlbmQgKyAyfV0gZW5kXQogICAgZm9yZWFjaCBsaW5lIFtzcGxpdCAkaGVhZGVyICJcbiJdIHsKCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJaWYgeyR0YWcgPT0gImF1dGhvciJ9IHsKCSAgICBzZXQgYXVkYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGF1bmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9IGVsc2VpZiB7JHRhZyA9PSAiY29tbWl0dGVyIn0gewoJICAgIHNldCBjb21kYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGNvbW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfQogICAgfQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICAjIHRha2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1lbnQgYXMgdGhlIGhlYWRsaW5lCiAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJGNvbW1lbnRdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbSBbc3RyaW5nIHJhbmdlICRjb21tZW50IDAgJGldXQogICAgfQogICAgaWYgeyEkbGlzdGVkfSB7CgkjIGdpdC1yZXYtbGlzdCBpbmRlbnRzIHRoZSBjb21tZW50IGJ5IDQgc3BhY2VzOwoJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCglzZXQgbmV3Y29tbWVudCB7fQoJZm9yZWFjaCBsaW5lIFtzcGxpdCAkY29tbWVudCAiXG4iXSB7CgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIiAgICAiCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgJGxpbmUKCX0KCXNldCBjb21tZW50ICRuZXdjb21tZW50CiAgICB9CiAgICBpZiB7JGNvbWRhdGUgIT0ge319IHsKCXNldCBjZGF0ZSgkaWQpICRjb21kYXRlCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyB0YWdjb250ZW50cwoKICAgIHNldCB0YWdzIFtnbG9iIC1ub2NvbXBsYWluIC10eXBlcyBmIFtnaXRkaXJdL3JlZnMvdGFncy8qXQogICAgZm9yZWFjaCBmICR0YWdzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmRdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBkaXJlY3QgW2ZpbGUgdGFpbCAkZl0KCQlzZXQgdGFnaWRzKCRkaXJlY3QpICRpZAoJCWxhcHBlbmQgaWR0YWdzKCRpZCkgJGRpcmVjdAoJCXNldCB0YWdibG9iIFtleGVjIGdpdC1jYXQtZmlsZSB0YWcgJGlkXQoJCXNldCBjb250ZW50cyBbc3BsaXQgJHRhZ2Jsb2IgIlxuIl0KCQlzZXQgb2JqIHt9CgkJc2V0IHR5cGUge30KCQlzZXQgdGFnIHt9CgkJZm9yZWFjaCBsICRjb250ZW50cyB7CgkJICAgIGlmIHskbCA9PSB7fX0gYnJlYWsKCQkgICAgc3dpdGNoIC0tIFtsaW5kZXggJGwgMF0gewoJCQkib2JqZWN0IiB7c2V0IG9iaiBbbGluZGV4ICRsIDFdfQoJCQkidHlwZSIge3NldCB0eXBlIFtsaW5kZXggJGwgMV19CgkJCSJ0YWciIHtzZXQgdGFnIFtzdHJpbmcgcmFuZ2UgJGwgNCBlbmRdfQoJCSAgICB9CgkJfQoJCWlmIHskb2JqICE9IHt9ICYmICR0eXBlID09ICJjb21taXQiICYmICR0YWcgIT0ge319IHsKCQkgICAgc2V0IHRhZ2lkcygkdGFnKSAkb2JqCgkJICAgIGxhcHBlbmQgaWR0YWdzKCRvYmopICR0YWcKCQkgICAgc2V0IHRhZ2NvbnRlbnRzKCR0YWcpICR0YWdibG9iCgkJfQoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHNldCBoZWFkcyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZiBbZ2l0ZGlyXS9yZWZzL2hlYWRzLypdCiAgICBmb3JlYWNoIGYgJGhlYWRzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBoZWFkIFtmaWxlIHRhaWwgJGZdCgkJc2V0IGhlYWRpZHMoJGhlYWQpICRsaW5lCgkJbGFwcGVuZCBpZGhlYWRzKCRsaW5lKSAkaGVhZAoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHJlYWRvdGhlcnJlZnMgcmVmcyB7fSB7dGFncyBoZWFkc30KfQoKcHJvYyByZWFkb3RoZXJyZWZzIHtiYXNlIGRuYW1lIGV4Y2x9IHsKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcwoKICAgIHNldCBnaXQgW2dpdGRpcl0KICAgIHNldCBmaWxlcyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZiBbZmlsZSBqb2luICRnaXQgJGJhc2UgKl1dCiAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBuYW1lICIkZG5hbWVbZmlsZSB0YWlsICRmXSIKCQlzZXQgb3RoZXJyZWZpZHMoJG5hbWUpICRpZAoJCWxhcHBlbmQgaWRvdGhlcnJlZnMoJGlkKSAkbmFtZQoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHNldCBkaXJzIFtnbG9iIC1ub2NvbXBsYWluIC10eXBlcyBkIFtmaWxlIGpvaW4gJGdpdCAkYmFzZSAqXV0KICAgIGZvcmVhY2ggZCAkZGlycyB7CglzZXQgZGlyIFtmaWxlIHRhaWwgJGRdCglpZiB7W2xzZWFyY2ggLWV4YWN0ICRleGNsICRkaXJdID49IDB9IGNvbnRpbnVlCglyZWFkb3RoZXJyZWZzIFtmaWxlIGpvaW4gJGJhc2UgJGRpcl0gIiRkbmFtZSRkaXIvIiB7fQogICAgfQp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QgdGV4dGZvbnQKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kdHlwZW1lbnUgZmluZGxvYyBmaW5kc3RyaW5nIGZzdHJpbmcgZ2VvbWV0cnkKICAgIGdsb2JhbCBlbnRyaWVzIHNoYTFlbnRyeSBzaGExc3RyaW5nIHNoYTFidXQKICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IgY3VydGV4dGN1cnNvcgogICAgZ2xvYmFsIHJvd2N0eG1lbnUgZ2F1ZHlkaWZmIG1lcmdlbWF4CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciA0NSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciAzMCAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciAxNSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciAyNSAqICRsaW5lc3BjICsgNF0KCXNldCBnZW9tZXRyeShjdGV4dHcpIDgwCglzZXQgZ2VvbWV0cnkoY3RleHRoKSAzMAoJc2V0IGdlb21ldHJ5KGNmbGlzdHcpIDMwCiAgICB9CiAgICBwYW5lZHdpbmRvdyAuY3RvcCAtb3JpZW50IHZlcnRpY2FsCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KHdpZHRoKV19IHsKCS5jdG9wIGNvbmYgLXdpZHRoICRnZW9tZXRyeSh3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoaGVpZ2h0KQoJc2V0IHRleHRoIFtleHByIHskZ2VvbWV0cnkoaGVpZ2h0KSAtICRnZW9tZXRyeShjYW52aCkgLSA1Nn1dCglzZXQgZ2VvbWV0cnkoY3RleHRoKSBbZXhwciB7KCR0ZXh0aCAtIDgpIC8KCQkJCSAgICBbZm9udCBtZXRyaWNzICR0ZXh0Zm9udCAtbGluZXNwYWNlXX1dCiAgICB9CiAgICBmcmFtZSAuY3RvcC50b3AKICAgIGZyYW1lIC5jdG9wLnRvcC5iYXIKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iZyB3aGl0ZSAtYmQgMCBcCgkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICIkY3Njcm9sbCBzZXQiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC5jdG9wLnRvcC5jbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MykgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjMKICAgIGJpbmQgLmN0b3AudG9wLmNsaXN0IDxDb25maWd1cmU+IHtyZXNpemVjbGlzdHBhbmVzICVXICV3fQoKICAgIHNldCBzaGExZW50cnkgLmN0b3AudG9wLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlciBGaWxlcyBQaWNrYXhlCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CiAgICAjIGZvciBtYWtpbmcgc3VyZSB0eXBlPT1FeGFjdCB3aGVuZXZlciBsb2M9PVBpY2theGUKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRsb2NjaGFuZ2UKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJnIHdoaXRlIC1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LmxlZnQuc2Igc2V0IiAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKCiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtYmFjayBibHVlIC1mb3JlIHdoaXRlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWJhY2sgIiNmZjgwODAiCgkkY3RleHQgdGFnIGNvbmYgZDEgLWJhY2sgZ3JlZW4KICAgIH0gZWxzZSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBibHVlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgIiMwMGEwMDAiCgkkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQoJJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCgkkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCgkkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KCSRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CglzZXQgbWVyZ2VtYXggNQoJJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KCSRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCgkkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CiAgICB9CgogICAgZnJhbWUgLmN0b3AuY2RldC5yaWdodAogICAgc2V0IGNmbGlzdCAuY3RvcC5jZGV0LnJpZ2h0LmNmaWxlcwogICAgbGlzdGJveCAkY2ZsaXN0IC1iZyB3aGl0ZSAtc2VsZWN0bW9kZSBleHRlbmRlZCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5yaWdodC5zYiBzZXQiCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5yaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5yaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJhbGxjYW52cyBzY2FuIG1hcmsgMCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImFsbGNhbnZzIHNjYW4gZHJhZ3RvIDAgJXkiCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPEtleS1SaWdodD4gImdvZm9ydyIKICAgIGJpbmQgLiA8S2V5LUxlZnQ+ICJnb2JhY2siCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8S2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSB6ICJnb2JhY2siCiAgICBiaW5ka2V5IHggImdvZm9ydyIKICAgIGJpbmRrZXkgaSAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IGogImdvYmFjayIKICAgIGJpbmRrZXkgbCAiZ29mb3J3IgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKICAgIGJpbmQgLiA8Q29udHJvbC1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8Q29udHJvbC1yPiBmaW5kcHJldgogICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgJGNmbGlzdCA8PExpc3Rib3hTZWxlY3Q+PiBsaXN0Ym94c2VsCiAgICBiaW5kIC4gPERlc3Ryb3k+IHtzYXZlc3R1ZmYgJVd9CiAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCiAgICBiaW5kICRmc3RyaW5nIDxLZXktUmV0dXJuPiBkb2ZpbmQKICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAogICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKCiAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0Cn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWlmIHskdyA9PSAkZX0gcmV0dXJuCiAgICB9CiAgICBmb2N1cyAuCn0KCnByb2Mgc2F2ZXN0dWZmIHt3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIGdhdWR5ZGlmZiBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGdhdWR5ZGlmZiAkZ2F1ZHlkaWZmXQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4d2lkdGggJG1heHdpZHRoXQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHdpZHRoKSBbd2luZm8gd2lkdGggLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGhlaWdodCkgW3dpbmZvIGhlaWdodCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIFt3aW5mbyB3aWR0aCAkY2Fudl0tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIFt3aW5mbyB3aWR0aCAkY2FudjJdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnYzXS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgW3dpbmZvIGhlaWdodCAkY2Fudl0tMl0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciAkc2FzaDAgKyAyMF0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgJHcgLSAxMF0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByICRzYXNoMSAtIDIwXQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciAkdyAtIDE1XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjb21tY29sb3JzIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRzIG5wYXJlbnRzIGNoaWxkcmVuIG5jaGlsZHJlbgogICAgZ2xvYmFsIGNvcm5lcmNyb3NzaW5ncyBjcm9zc2luZ3MKCiAgICBpZiBbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV0gcmV0dXJuCiAgICBzZXQgbmNvbG9ycyBbbGxlbmd0aCAkY29sb3JzXQogICAgaWYgeyRucGFyZW50cygkaWQpIDw9IDEgJiYgJG5jaGlsZHJlbigkaWQpID09IDF9IHsKCXNldCBjaGlsZCBbbGluZGV4ICRjaGlsZHJlbigkaWQpIDBdCglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkgICAgJiYgJG5wYXJlbnRzKCRjaGlsZCkgPT0gMX0gewoJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYmFkY29sb3JzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXX0gewoJZm9yZWFjaCB4ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMge30KCX0KICAgIH0KICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJaWYge1tpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV19IHsKCSAgICBmb3JlYWNoIHggJGNyb3NzaW5ncygkaWQpIHsKCQlpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCQl9CgkgICAgfQoJICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJCXNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCSAgICB9Cgl9CglzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICB9CgkgICAgaWYge1tpbmZvIGV4aXN0cyBwYXJlbnRzKCRjaGlsZCldfSB7CgkJZm9yZWFjaCBwICRwYXJlbnRzKCRjaGlsZCkgewoJCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRwKV0KCQkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKV0gPCAwfSB7CgkJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkcCkKCQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzICRvcmlnYmFkCgl9CiAgICB9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbmNvbG9yc30ge2luY3IgaX0gewoJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCglpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBuZXh0Y29sb3IgMAoJfQoJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKICAgIH0KICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCn0KCnByb2MgaW5pdGdyYXBoIHt9IHsKICAgIGdsb2JhbCBjYW52eSBjYW52eTAgbGluZW5vIG51bWNvbW1pdHMgbmV4dGNvbG9yIGxpbmVzcGMKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIG5jaGlsZHJlbiBuY2xlZnQKICAgIGdsb2JhbCBkaXNwbGlzdCBuaHlwZXJzcGFjZQoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIGNhdGNoIHt1bnNldCBtYWlubGluZX0KICAgIGNhdGNoIHt1bnNldCBtYWlubGluZWFycm93fQogICAgY2F0Y2gge3Vuc2V0IHNpZGVsaW5lc30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIG5jaGlsZHJlbl0gewoJc2V0IG5jbGVmdCgkaWQpICRuY2hpbGRyZW4oJGlkKQogICAgfQogICAgc2V0IGRpc3BsaXN0IHt9CiAgICBzZXQgbmh5cGVyc3BhY2UgMAp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIDEiCn0KCnByb2MgZHJhd2xpbmVzIHtpZCB4dHJhIGRlbG9sZH0gewogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzIGx0aGlja25lc3MgY29sb3JtYXAgY2FudgoKICAgIGlmIHskZGVsb2xkfSB7CgkkY2FudiBkZWxldGUgbGluZXMuJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJG1haW5saW5lKCRpZCkgXAoJCSAgIC13aWR0aCBbZXhwciB7KCR4dHJhICsgMSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAtZmlsbCAkY29sb3JtYXAoJGlkKSAtdGFncyBsaW5lcy4kaWQgXAoJCSAgIC1hcnJvdyAkbWFpbmxpbmVhcnJvdygkaWQpXQoJJGNhbnYgbG93ZXIgJHQKCWJpbmRsaW5lICR0ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCWZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCSAgICBzZXQgY29vcmRzIFtsaW5kZXggJGxzIDBdCgkgICAgc2V0IHRoaWNrIFtsaW5kZXggJGxzIDFdCgkgICAgc2V0IGFycm93IFtsaW5kZXggJGxzIDJdCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLWZpbGwgJGNvbG9ybWFwKCRpZCkgXAoJCSAgICAgICAtd2lkdGggW2V4cHIgeygkdGhpY2sgKyAkeHRyYSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAgICAgLWFycm93ICRhcnJvdyAtdGFncyBsaW5lcy4kaWRdCgkgICAgJGNhbnYgbG93ZXIgJHQKCSAgICBiaW5kbGluZSAkdCAkaWQKCX0KICAgIH0KfQoKIyBsZXZlbCBoZXJlIGlzIGFuIGluZGV4IGluIGRpc3BsaXN0CnByb2MgZHJhd2NvbW1pdGxpbmUge2xldmVsfSB7CiAgICBnbG9iYWwgcGFyZW50cyBjaGlsZHJlbiBucGFyZW50cyBkaXNwbGlzdAogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbWFpbmZvbnQgbmFtZWZvbnQgY2FudnkgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29sb3JtYXAgbnVtY29tbWl0cyBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgaWR0YWdzIGlkbGluZSBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcm93dGV4dHggaWRwb3MgbGFzdHVzZSBkaXNwbGlzdAogICAgZ2xvYmFsIG9sZG5saW5lcyBvbGRkbGV2ZWwgb2xkZGlzcGxpc3QKCiAgICBpbmNyIG51bWNvbW1pdHMKICAgIGluY3IgbGluZW5vCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxpc3QgJGxldmVsXQogICAgc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCiAgICBzZXQgbGluZWlkKCRsaW5lbm8pICRpZAogICAgc2V0IGlkbGluZSgkaWQpICRsaW5lbm8KICAgIHNldCBvZmlsbCBbZXhwciB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXT8gImJsdWUiOiAid2hpdGUifV0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJICAgIHNldCBucGFyZW50cygkaWQpIDAKCX0KICAgIH0KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IGN1cnJlbnRwYXJlbnRzIHt9CiAgICBzZXQgZHVwcGFyZW50cyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV0gJiYgW2luZm8gZXhpc3RzIHBhcmVudHMoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjdXJyZW50cGFyZW50cyAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjdXJyZW50cGFyZW50cyAkcAoJICAgIH0gZWxzZSB7CgkJIyByZW1lbWJlciB0aGF0IHRoaXMgcGFyZW50IHdhcyBsaXN0ZWQgdHdpY2UKCQlsYXBwZW5kIGR1cHBhcmVudHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgeCBbeGNvb3JkICRsZXZlbCAkbGV2ZWwgJGxpbmVub10KICAgIHNldCB5MSAkY2FudnkKICAgIHNldCBjYW52eSBbZXhwciAkY2FudnkgKyAkbGluZXNwY10KICAgIGFsbGNhbnZzIGNvbmYgLXNjcm9sbHJlZ2lvbiBcCglbbGlzdCAwIDAgMCBbZXhwciAkeTEgKyAwLjUgKiAkbGluZXNwYyArIDJdXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJaWYgeyRtYWlubGluZWFycm93KCRpZCkgbmUgIm5vbmUifSB7CgkgICAgc2V0IG1haW5saW5lKCRpZCkgW3RyaW1kaWFnc3RhcnQgJG1haW5saW5lKCRpZCldCgl9CiAgICB9CiAgICBkcmF3bGluZXMgJGlkIDAgMAogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgJHggLSAkb3JhZF0gW2V4cHIgJHkxIC0gJG9yYWRdIFwKCSAgICAgICBbZXhwciAkeCArICRvcmFkIC0gMV0gW2V4cHIgJHkxICsgJG9yYWQgLSAxXSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxXQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCB4dCBbeGNvb3JkIFtsbGVuZ3RoICRkaXNwbGlzdF0gJGxldmVsICRsaW5lbm9dCiAgICBpZiB7W2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSA+IDJ9IHsKCXNldCB4dCBbZXhwciB7JHh0ICsgKFtsbGVuZ3RoICRjdXJyZW50cGFyZW50c10gLSAyKSAqICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCByb3d0ZXh0eCgkbGluZW5vKSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeTFdCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXQoJfHwgW2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeHQgW2RyYXd0YWdzICRpZCAkeCAkeHQgJHkxXQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IG5hbWUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDFdCiAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlICRkYXRlXQogICAgc2V0IGxpbmVodGFnKCRsaW5lbm8pIFskY2FudiBjcmVhdGUgdGV4dCAkeHQgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJG1haW5mb250IF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRsaW5lbm8pIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRsaW5lbm8pIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRuYW1lIC1mb250ICRuYW1lZm9udF0KICAgIHNldCBsaW5lZHRhZygkbGluZW5vKSBbJGNhbnYzIGNyZWF0ZSB0ZXh0IDMgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnRdCgogICAgc2V0IG9sZGRsZXZlbCAkbGV2ZWwKICAgIHNldCBvbGRkaXNwbGlzdCAkZGlzcGxpc3QKICAgIHNldCBvbGRubGluZXMgW2xsZW5ndGggJGRpc3BsaXN0XQp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGlkbGluZSByb3d0ZXh0eAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByICR5MSAtIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IHliIFtleHByICR5dCArICRsaW5lc3BjIC0gMV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgJHggKyAkZGVsdGFdCglzZXQgeHIgW2V4cHIgJHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3NdCglpZiB7W2luY3IgbnRhZ3MgLTFdID49IDB9IHsKCSAgICAjIGRyYXcgYSB0YWcKCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgJHl0ICsgJGRlbHRhXSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgJHliIC0gJGRlbHRhXSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkaWRsaW5lKCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciAkeGwgLSAkZGVsdGEvMl0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCgl9CglzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyBcCgkJICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRhZy4kaWRdCglpZiB7JG50YWdzID49IDB9IHsKCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCX0KICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyBub3RlY3Jvc3NpbmdzIHtpZCBsbyBoaSBjb3JuZXJ9IHsKICAgIGdsb2JhbCBvbGRkaXNwbGlzdCBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzCgogICAgZm9yIHtzZXQgaSAkbG99IHtbaW5jciBpXSA8ICRoaX0ge30gewoJc2V0IHAgW2xpbmRleCAkb2xkZGlzcGxpc3QgJGldCglpZiB7JHAgPT0ge319IGNvbnRpbnVlCglpZiB7JGkgPT0gJGNvcm5lcn0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfSBlbHNlIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKIyBpdCBzZWVtcyBUayBjYW4ndCBkcmF3IGFycm93cyBvbiB0aGUgZW5kIG9mIGRpYWdvbmFsIGxpbmUgc2VnbWVudHMuLi4KcHJvYyB0cmltZGlhZ2VuZCB7bGluZX0gewogICAgd2hpbGUge1tsbGVuZ3RoICRsaW5lXSA+IDR9IHsKCXNldCB4MSBbbGluZGV4ICRsaW5lIGVuZC0zXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgZW5kLTJdCglzZXQgeDIgW2xpbmRleCAkbGluZSBlbmQtMV0KCXNldCB5MiBbbGluZGV4ICRsaW5lIGVuZF0KCWlmIHsoJHgxID09ICR4MikgIT0gKCR5MSA9PSAkeTIpfSBicmVhawoJc2V0IGxpbmUgW2xyZXBsYWNlICRsaW5lIGVuZC0xIGVuZF0KICAgIH0KICAgIHJldHVybiAkbGluZQp9Cgpwcm9jIHRyaW1kaWFnc3RhcnQge2xpbmV9IHsKICAgIHdoaWxlIHtbbGxlbmd0aCAkbGluZV0gPiA0fSB7CglzZXQgeDEgW2xpbmRleCAkbGluZSAwXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgMV0KCXNldCB4MiBbbGluZGV4ICRsaW5lIDJdCglzZXQgeTIgW2xpbmRleCAkbGluZSAzXQoJaWYgeygkeDEgPT0gJHgyKSAhPSAoJHkxID09ICR5Mil9IGJyZWFrCglzZXQgbGluZSBbbHJlcGxhY2UgJGxpbmUgMCAxXQogICAgfQogICAgcmV0dXJuICRsaW5lCn0KCnByb2MgZHJhd3NsYW50cyB7aWQgbmVlZG9uc2NyZWVuIG5vaHN9IHsKICAgIGdsb2JhbCBjYW52IG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzCiAgICBnbG9iYWwgY2FudngwIGNhbnZ5IHhzcGMxIHhzcGMyIGx0aGlja25lc3MKICAgIGdsb2JhbCBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgbHRoaWNrbmVzcyBsaW5lc3BjIGNhbnZ5IGNvbG9ybWFwIGxpbmVubyBnZW9tZXRyeQogICAgZ2xvYmFsIG1heGdyYXBocGN0IG1heHdpZHRoCiAgICBnbG9iYWwgZGlzcGxpc3Qgb25zY3JlZW4gbGFzdHVzZQogICAgZ2xvYmFsIHBhcmVudHMgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgb2xkbmxpbmVzIG9sZGRsZXZlbCBvbGRkaXNwbGlzdAogICAgZ2xvYmFsIG5oeXBlcnNwYWNlIG51bWNvbW1pdHMgbm5ld3BhcmVudHMKCiAgICBpZiB7JGxpbmVubyA8IDB9IHsKCWxhcHBlbmQgZGlzcGxpc3QgJGlkCglzZXQgb25zY3JlZW4oJGlkKSAxCglyZXR1cm4gMAogICAgfQoKICAgIHNldCB5MSBbZXhwciB7JGNhbnZ5IC0gJGxpbmVzcGN9XQogICAgc2V0IHkyICRjYW52eQoKICAgICMgd29yayBvdXQgd2hhdCB3ZSBuZWVkIHRvIGdldCBiYWNrIG9uIHNjcmVlbgogICAgc2V0IHJlaW5zIHt9CiAgICBpZiB7JG9uc2NyZWVuKCRpZCkgPCAwfSB7CgkjIG5leHQgdG8gZG8gaXNuJ3QgZGlzcGxheWVkLCBiZXR0ZXIgZ2V0IGl0IG9uIHNjcmVlbi4uLgoJbGFwcGVuZCByZWlucyBbbGlzdCAkaWQgMF0KICAgIH0KICAgICMgbWFrZSBzdXJlIGFsbCB0aGUgcHJldmlvdXMgY29tbWl0cydzIHBhcmVudHMgYXJlIG9uIHRoZSBzY3JlZW4KICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgbGFwcGVuZCByZWlucyBbbGlzdCAkcCAwXQoJfQogICAgfQogICAgIyBicmluZyBiYWNrIGFueXRoaW5nIHJlcXVlc3RlZCBieSBjYWxsZXIKICAgIGlmIHskbmVlZG9uc2NyZWVuIG5lIHt9fSB7CglsYXBwZW5kIHJlaW5zICRuZWVkb25zY3JlZW4KICAgIH0KCiAgICAjIHRyeSB0aGUgc2hvcnRjdXQKICAgIGlmIHskY3VycmVudHBhcmVudHMgPT0gJGlkICYmICRvbnNjcmVlbigkaWQpID09IDAgJiYgJHJlaW5zIGVxIHt9fSB7CglzZXQgZGxldmVsICRvbGRkbGV2ZWwKCXNldCB4IFt4Y29vcmQgJGRsZXZlbCAkZGxldmVsICRsaW5lbm9dCglzZXQgbWFpbmxpbmUoJGlkKSBbbGlzdCAkeCAkeTFdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIG5vbmUKCXNldCBsYXN0dXNlKCRpZCkgJGxpbmVubwoJc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGRsZXZlbCAkZGxldmVsICRpZF0KCXNldCBvbnNjcmVlbigkaWQpIDEKCXNldCB4c3BjMShbZXhwciB7JGxpbmVubyArIDF9XSkgJHhzcGMxKCRsaW5lbm8pCglyZXR1cm4gJGRsZXZlbAogICAgfQoKICAgICMgdXBkYXRlIGRpc3BsaXN0CiAgICBzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCiAgICBzZXQgaiAkb2xkZGxldmVsCiAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCXNldCBsYXN0dXNlKCRwKSAkbGluZW5vCglpZiB7JG9uc2NyZWVuKCRwKSA9PSAwfSB7CgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCAkaiAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDEKCSAgICBpbmNyIGoKCX0KICAgIH0KICAgIGlmIHskb25zY3JlZW4oJGlkKSA9PSAwfSB7CglsYXBwZW5kIGRpc3BsaXN0ICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMQogICAgfQoKICAgICMgcmVtb3ZlIHRoZSBudWxsIGVudHJ5IGlmIHByZXNlbnQKICAgIHNldCBudWxsZW50cnkgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCB7fV0KICAgIGlmIHskbnVsbGVudHJ5ID49IDB9IHsKCXNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRudWxsZW50cnkgJG51bGxlbnRyeV0KICAgIH0KCiAgICAjIGJyaW5nIGJhY2sgdGhlIG9uZXMgd2UgbmVlZCBub3cgKGlmIHdlIGRpZCBpdCBlYXJsaWVyCiAgICAjIGl0IHdvdWxkIGNoYW5nZSBkaXNwbGlzdCBhbmQgaW52YWxpZGF0ZSBvbGRkbGV2ZWwpCiAgICBmb3JlYWNoIHBpICRyZWlucyB7CgkjIHRlc3QgYWdhaW4gaW4gY2FzZSBvZiBkdXBsaWNhdGVzIGluIHJlaW5zCglzZXQgcCBbbGluZGV4ICRwaSAwXQoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgc2V0IG9uc2NyZWVuKCRwKSAxCgkgICAgc2V0IGxhc3R1c2UoJHApICRsaW5lbm8KCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0IFtsaW5kZXggJHBpIDFdICRwXQoJICAgIGluY3Igbmh5cGVyc3BhY2UgLTEKCX0KICAgIH0KCiAgICBzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KCiAgICAjIHNlZSBpZiB3ZSBuZWVkIHRvIG1ha2UgYW55IGxpbmVzIGp1bXAgb2ZmIGludG8gaHlwZXJzcGFjZQogICAgc2V0IGRpc3BsIFtsbGVuZ3RoICRkaXNwbGlzdF0KICAgIGlmIHskZGlzcGwgPiAkbWF4d2lkdGh9IHsKCXNldCBhZ2VzIHt9Cglmb3JlYWNoIHggJGRpc3BsaXN0IHsKCSAgICBsYXBwZW5kIGFnZXMgW2xpc3QgJGxhc3R1c2UoJHgpICR4XQoJfQoJc2V0IGFnZXMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRhZ2VzXQoJc2V0IGsgMAoJd2hpbGUgeyRkaXNwbCA+ICRtYXh3aWR0aH0gewoJICAgIHNldCB1c2UgW2xpbmRleCAkYWdlcyAkayAwXQoJICAgIHNldCB2aWN0aW0gW2xpbmRleCAkYWdlcyAkayAxXQoJICAgIGlmIHskdXNlID49ICRsaW5lbm8gLSA1fSBicmVhawoJICAgIGluY3IgawoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHZpY3RpbV0gPj0gMH0gY29udGludWUKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICR2aWN0aW1dCgkgICAgc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGkgJGldCgkgICAgc2V0IG9uc2NyZWVuKCR2aWN0aW0pIC0xCgkgICAgaW5jciBuaHlwZXJzcGFjZQoJICAgIGluY3IgZGlzcGwgLTEKCSAgICBpZiB7JGkgPCAkbnVsbGVudHJ5fSB7CgkJaW5jciBudWxsZW50cnkgLTEKCSAgICB9CgkgICAgc2V0IHggW2xpbmRleCAkbWFpbmxpbmUoJHZpY3RpbSkgZW5kLTFdCgkgICAgbGFwcGVuZCBtYWlubGluZSgkdmljdGltKSAkeCAkeTEKCSAgICBzZXQgbGluZSBbdHJpbWRpYWdlbmQgJG1haW5saW5lKCR2aWN0aW0pXQoJICAgIHNldCBhcnJvdyAibGFzdCIKCSAgICBpZiB7JG1haW5saW5lYXJyb3coJHZpY3RpbSkgbmUgIm5vbmUifSB7CgkJc2V0IGxpbmUgW3RyaW1kaWFnc3RhcnQgJGxpbmVdCgkJc2V0IGFycm93ICJib3RoIgoJICAgIH0KCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkdmljdGltKSBbbGlzdCAkbGluZSAxICRhcnJvd10KCSAgICB1bnNldCBtYWlubGluZSgkdmljdGltKQoJfQogICAgfQoKICAgIHNldCBkbGV2ZWwgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgogICAgIyBJZiB3ZSBhcmUgcmVkdWNpbmcsIHB1dCBpbiBhIG51bGwgZW50cnkKICAgIGlmIHskZGlzcGwgPCAkb2xkbmxpbmVzfSB7CgkjIGRvZXMgdGhlIG5leHQgbGluZSBsb29rIGxpa2UgYSBtZXJnZT8KCSMgaS5lLiBkb2VzIGl0IGhhdmUgPiAxIG5ldyBwYXJlbnQ/CglpZiB7JG5uZXdwYXJlbnRzKCRpZCkgPiAxfSB7CgkgICAgc2V0IGkgW2V4cHIgeyRkbGV2ZWwgKyAxfV0KCX0gZWxzZWlmIHskbm5ld3BhcmVudHMoW2xpbmRleCAkb2xkZGlzcGxpc3QgJG9sZGRsZXZlbF0pID09IDB9IHsKCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgaWYgeyRudWxsZW50cnkgPj0gMCAmJiAkbnVsbGVudHJ5IDwgJGl9IHsKCQlpbmNyIGkgLTEKCSAgICB9Cgl9IGVsc2VpZiB7JG51bGxlbnRyeSA+PSAwfSB7CgkgICAgc2V0IGkgJG51bGxlbnRyeQoJICAgIHdoaWxlIHskaSA8ICRkaXNwbAoJCSAgICYmIFtsaW5kZXggJG9sZGRpc3BsaXN0ICRpXSA9PSBbbGluZGV4ICRkaXNwbGlzdCAkaV19IHsKCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBpZiB7JGRsZXZlbCA+PSAkaX0gewoJCWluY3IgaQoJICAgIH0KCX0KCWlmIHskaSA8ICRkaXNwbH0gewoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgJGkge31dCgkgICAgaW5jciBkaXNwbAoJICAgIGlmIHskZGxldmVsID49ICRpfSB7CgkJaW5jciBkbGV2ZWwKCSAgICB9Cgl9CiAgICB9CgogICAgIyBkZWNpZGUgb24gdGhlIGxpbmUgc3BhY2luZyBmb3IgdGhlIG5leHQgbGluZQogICAgc2V0IGxqIFtleHByIHskbGluZW5vICsgMX1dCiAgICBzZXQgbWF4dyBbZXhwciB7JG1heGdyYXBocGN0ICogJGdlb21ldHJ5KGNhbnYxKSAvIDEwMH1dCiAgICBpZiB7JGRpc3BsIDw9IDEgfHwgJGNhbnZ4MCArICRkaXNwbCAqICR4c3BjMiA8PSAkbWF4d30gewoJc2V0IHhzcGMxKCRsaikgJHhzcGMyCiAgICB9IGVsc2UgewoJc2V0IHhzcGMxKCRsaikgW2V4cHIgeygkbWF4dyAtICRjYW52eDAgLSAkeHNwYzIpIC8gKCRkaXNwbCAtIDEpfV0KCWlmIHskeHNwYzEoJGxqKSA8ICRsdGhpY2tuZXNzfSB7CgkgICAgc2V0IHhzcGMxKCRsaikgJGx0aGlja25lc3MKCX0KICAgIH0KCiAgICBmb3JlYWNoIGlkaSAkcmVpbnMgewoJc2V0IGlkIFtsaW5kZXggJGlkaSAwXQoJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCglzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCXNldCBtYWlubGluZSgkaWQpIFtsaXN0ICR4aiAkeTJdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIGZpcnN0CiAgICB9CgogICAgc2V0IGkgLTEKICAgIGZvcmVhY2ggaWQgJG9sZGRpc3BsaXN0IHsKCWluY3IgaQoJaWYgeyRpZCA9PSB7fX0gY29udGludWUKCWlmIHskb25zY3JlZW4oJGlkKSA8PSAwfSBjb250aW51ZQoJc2V0IHhpIFt4Y29vcmQgJGkgJG9sZGRsZXZlbCAkbGluZW5vXQoJaWYgeyRpID09ICRvbGRkbGV2ZWx9IHsKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRwXQoJCXNldCBjb29yZHMgW2xpc3QgJHhpICR5MV0KCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlpZiB7JHhqIDwgJHhpIC0gJGxpbmVzcGN9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW2V4cHIgeyR4aiArICRsaW5lc3BjfV0gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGogJGkgW2V4cHIgeyRqICsgMX1dCgkJfSBlbHNlaWYgeyR4aiA+ICR4aSArICRsaW5lc3BjfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByIHskeGogLSAkbGluZXNwY31dICR5MQoJCSAgICBub3RlY3Jvc3NpbmdzICRwICRpICRqIFtleHByIHskaiAtIDF9XQoJCX0KCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkdXBwYXJlbnRzICRwXSA+PSAwfSB7CgkJICAgICMgZHJhdyBhIGRvdWJsZS13aWR0aCBsaW5lIHRvIGluZGljYXRlIHRoZSBkb3VibGVkIHBhcmVudAoJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJICAgIGxhcHBlbmQgc2lkZWxpbmVzKCRwKSBbbGlzdCAkY29vcmRzIDIgbm9uZV0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlzZXQgbWFpbmxpbmUoJHApIFtsaXN0ICR4aiAkeTJdCgkJCXNldCBtYWlubGluZWFycm93KCRwKSBub25lCgkJICAgIH0KCQl9IGVsc2UgewoJCSAgICAjIG5vcm1hbCBjYXNlLCBubyBwYXJlbnQgZHVwbGljYXRlZAoJCSAgICBzZXQgeWIgJHkyCgkJICAgIHNldCBkeCBbZXhwciB7YWJzKCR4aSAtICR4ail9XQoJCSAgICBpZiB7MCAmJiAkZHggPCAkbGluZXNwY30gewoJCQlzZXQgeWIgW2V4cHIgeyR5MSArICRkeH1dCgkJICAgIH0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlpZiB7JHhpICE9ICR4an0gewoJCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5YgoJCQl9CgkJCXNldCBtYWlubGluZSgkcCkgJGNvb3JkcwoJCQlzZXQgbWFpbmxpbmVhcnJvdygkcCkgbm9uZQoJCSAgICB9IGVsc2UgewoJCQlsYXBwZW5kIGNvb3JkcyAkeGogJHliCgkJCWlmIHskeWIgPCAkeTJ9IHsKCQkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkJfQoJCQlsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAxIG5vbmVdCgkJICAgIH0KCQl9CgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgaiAkaQoJICAgIGlmIHtbbGluZGV4ICRkaXNwbGlzdCAkaV0gIT0gJGlkfSB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgkgICAgfQoJICAgIGlmIHskaiAhPSAkaSB8fCAkeHNwYzEoJGxpbmVubykgIT0gJHhzcGMxKCRsaikKCQl8fCAoJG9sZGRsZXZlbCA8ICRpICYmICRpIDwgJGRsZXZlbCkKCQl8fCAoJGRsZXZlbCA8ICRpICYmICRpIDwgJG9sZGRsZXZlbCl9IHsKCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlsYXBwZW5kIG1haW5saW5lKCRpZCkgJHhpICR5MSAkeGogJHkyCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRkbGV2ZWwKfQoKIyBzZWFyY2ggZm9yIHggaW4gYSBsaXN0IG9mIGxpc3RzCnByb2MgbGxzZWFyY2gge2xsaXN0IHh9IHsKICAgIHNldCBpIDAKICAgIGZvcmVhY2ggbCAkbGxpc3QgewoJaWYgeyRsID09ICR4IHx8IFtsc2VhcmNoIC1leGFjdCAkbCAkeF0gPj0gMH0gewoJICAgIHJldHVybiAkaQoJfQoJaW5jciBpCiAgICB9CiAgICByZXR1cm4gLTEKfQoKcHJvYyBkcmF3bW9yZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIG5jbXVwZGF0ZSBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc3RvcHBlZCBuaHlwZXJzcGFjZSBwYXJlbnRzIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIG1heHdpZHRoIG9uc2NyZWVuIGRpc3BsaXN0IGN1cnJlbnRwYXJlbnRzIG9sZGRsZXZlbAoKICAgIHNldCBuIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCiAgICB3aGlsZSB7JG51bWNvbW1pdHMgPCAkbn0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbnVtY29tbWl0c10KCXNldCBjdHhlbmQgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQoJaWYgeyEkcmVhZGluZyAmJiAkY3R4ZW5kID4gJG59IHsKCSAgICBzZXQgY3R4ZW5kICRuCgl9CglzZXQgZGxpc3Qge30KCWlmIHskbnVtY29tbWl0cyA+IDB9IHsKCSAgICBzZXQgZGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJCWlmIHskb25zY3JlZW4oJHApID09IDB9IHsKCQkgICAgc2V0IGRsaXN0IFtsaW5zZXJ0ICRkbGlzdCAkaSAkcF0KCQkgICAgaW5jciBpCgkJfQoJICAgIH0KCX0KCXNldCBub2hzIHt9CglzZXQgcmVpbnMge30KCXNldCBpc2ZhdCBbZXhwciB7W2xsZW5ndGggJGRsaXN0XSA+ICRtYXh3aWR0aH1dCglpZiB7JG5oeXBlcnNwYWNlID4gMCB8fCAkaXNmYXR9IHsKCSAgICBpZiB7JGN0eGVuZCA+ICRufSBicmVhawoJICAgICMgd29yayBvdXQgd2hhdCB0byBicmluZyBiYWNrIGFuZAoJICAgICMgd2hhdCB3ZSB3YW50IHRvIGRvbid0IHdhbnQgdG8gc2VuZCBpbnRvIGh5cGVyc3BhY2UKCSAgICBzZXQgcm9vbSAxCgkgICAgZm9yIHtzZXQgayAkbnVtY29tbWl0c30geyRrIDwgJGN0eGVuZH0ge2luY3Iga30gewoJCXNldCB4IFtsaW5kZXggJGRpc3BsYXlvcmRlciAka10KCQlzZXQgaSBbbGxzZWFyY2ggJGRsaXN0ICR4XQoJCWlmIHskaSA8IDB9IHsKCQkgICAgc2V0IGkgW2xsZW5ndGggJGRsaXN0XQoJCSAgICBsYXBwZW5kIGRsaXN0ICR4CgkJfQoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHhdIDwgMH0gewoJCSAgICBsYXBwZW5kIG5vaHMgJHgKCQl9CgkJaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHgpIDwgMCAmJiAkcm9vbX0gewoJCSAgICBzZXQgcmVpbnMgW2xpc3QgJHggJGldCgkJfQoJCXNldCBuZXdwIHt9CgkJaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJHgpXX0gewoJCSAgICBzZXQgcmlnaHQgMAoJCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJHgpIHsKCQkJaWYge1tsbHNlYXJjaCAkZGxpc3QgJHBdIDwgMH0gewoJCQkgICAgbGFwcGVuZCBuZXdwICRwCgkJCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICRwXSA8IDB9IHsKCQkJCWxhcHBlbmQgbm9ocyAkcAoJCQkgICAgfQoJCQkgICAgaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHApIDwgMCAmJiAkcm9vbX0gewoJCQkJc2V0IHJlaW5zIFtsaXN0ICRwIFtleHByIHskaSArICRyaWdodH1dXQoJCQkgICAgfQoJCQl9CgkJCXNldCByaWdodCAxCgkJICAgIH0KCQl9CgkJc2V0IGwgW2xpbmRleCAkZGxpc3QgJGldCgkJaWYge1tsbGVuZ3RoICRsXSA9PSAxfSB7CgkJICAgIHNldCBsICRuZXdwCgkJfSBlbHNlIHsKCQkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRsICR4XQoJCSAgICBzZXQgbCBbY29uY2F0IFtscmVwbGFjZSAkbCAkaiAkal0gJG5ld3BdCgkJfQoJCXNldCBkbGlzdCBbbHJlcGxhY2UgJGRsaXN0ICRpICRpICRsXQoJCWlmIHskcm9vbSAmJiAkaXNmYXQgJiYgW2xsZW5ndGggJG5ld3BdIDw9IDF9IHsKCQkgICAgc2V0IHJvb20gMAoJCX0KCSAgICB9Cgl9CgoJc2V0IGRsZXZlbCBbZHJhd3NsYW50cyAkaWQgJHJlaW5zICRub2hzXQoJZHJhd2NvbW1pdGxpbmUgJGRsZXZlbAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGUKCSAgICAmJiAkbnVtY29tbWl0cyA+PSAkbmNtdXBkYXRlfSB7CgkgICAgZG91cGRhdGUgJHJlYWRpbmcKCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgl9CiAgICB9Cn0KCiMgbGV2ZWwgaGVyZSBpcyBhbiBpbmRleCBpbiB0b2RvCnByb2MgdXBkYXRldG9kbyB7bGV2ZWwgbm9zaG9ydGN1dH0gewogICAgZ2xvYmFsIG5jbGVmdCB0b2RvIG5uZXdwYXJlbnRzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBhcmVudHMgb25zY3JlZW4KCiAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCiAgICBzZXQgb2xkcyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRvbGRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIG9sZHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7ISRub3Nob3J0Y3V0ICYmIFtsbGVuZ3RoICRvbGRzXSA9PSAxfSB7CglzZXQgcCBbbGluZGV4ICRvbGRzIDBdCglpZiB7JG5jbGVmdCgkcCkgPT0gMSAmJiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdIDwgMH0gewoJICAgIHNldCBuY2xlZnQoJHApIDAKCSAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbCAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDAKCSAgICBzZXQgbm5ld3BhcmVudHMoJGlkKSAxCgkgICAgcmV0dXJuIDAKCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbF0KICAgIHNldCBpICRsZXZlbAogICAgc2V0IG4gMAogICAgZm9yZWFjaCBwICRvbGRzIHsKCWluY3IgbmNsZWZ0KCRwKSAtMQoJc2V0IGsgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXQoJaWYgeyRrIDwgMH0gewoJICAgIHNldCB0b2RvIFtsaW5zZXJ0ICR0b2RvICRpICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMAoJICAgIGluY3IgaQoJICAgIGluY3IgbgoJfQogICAgfQogICAgc2V0IG5uZXdwYXJlbnRzKCRpZCkgJG4KCiAgICByZXR1cm4gMQp9Cgpwcm9jIGRlY2lkZW5leHQge3tub3JlYWQgMH19IHsKICAgIGdsb2JhbCBuY2xlZnQgdG9kbwogICAgZ2xvYmFsIGRhdGVtb2RlIGNkYXRlCiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICMgY2hvb3NlIHdoaWNoIG9uZSB0byBkbyBuZXh0IHRpbWUgYXJvdW5kCiAgICBzZXQgdG9kb2wgW2xsZW5ndGggJHRvZG9dCiAgICBzZXQgbGV2ZWwgLTEKICAgIHNldCBsYXRlc3Qge30KICAgIGZvciB7c2V0IGsgJHRvZG9sfSB7W2luY3IgayAtMV0gPj0gMH0ge30gewoJc2V0IHAgW2xpbmRleCAkdG9kbyAka10KCWlmIHskbmNsZWZ0KCRwKSA9PSAwfSB7CgkgICAgaWYgeyRkYXRlbW9kZX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJCSAgICBpZiB7JG5vcmVhZH0gewoJCQlyZXR1cm4ge30KCQkgICAgfQoJCSAgICByZWFkY29tbWl0ICRwCgkJfQoJCWlmIHskbGF0ZXN0ID09IHt9IHx8ICRjZGF0ZSgkcCkgPiAkbGF0ZXN0fSB7CgkJICAgIHNldCBsZXZlbCAkawoJCSAgICBzZXQgbGF0ZXN0ICRjZGF0ZSgkcCkKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgbGV2ZWwgJGsKCQlicmVhawoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbGV2ZWwgPCAwfSB7CglpZiB7JHRvZG8gIT0ge319IHsKCSAgICBwdXRzICJFUlJPUjogbm9uZSBvZiB0aGUgcGVuZGluZyBjb21taXRzIGNhbiBiZSBkb25lIHlldDoiCgkgICAgZm9yZWFjaCBwICR0b2RvIHsKCQlwdXRzICIgICRwICgkbmNsZWZ0KCRwKSkiCgkgICAgfQoJfQoJcmV0dXJuIC0xCiAgICB9CgogICAgcmV0dXJuICRsZXZlbAp9Cgpwcm9jIGRyYXdjb21taXQge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgdG9kbyBuY2hpbGRyZW4gZGF0ZW1vZGUgbmV4dHVwZGF0ZSByZXZsaXN0b3JkZXIKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZSBkaXNwbGF5b3JkZXIgdG9kbyBvbnNjcmVlbiBwYXJlbnRzCgogICAgaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CglzZXQgcGhhc2UgaW5jcmRyYXcKCXNldCBkaXNwbGF5b3JkZXIge30KCXNldCB0b2RvIHt9Cglpbml0Z3JhcGgKICAgIH0KICAgIGlmIHskbmNoaWxkcmVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCB0b2RvICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMAogICAgfQogICAgaWYgeyRyZXZsaXN0b3JkZXJ9IHsKCXNldCBsZXZlbCBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJGlkXQoJaWYgeyRsZXZlbCA8IDB9IHsKCSAgICBlcnJvcl9wb3B1cCAib29wcywgJGlkIGlzbid0IGluIHRvZG8iCgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKCXVwZGF0ZXRvZG8gJGxldmVsIDAKICAgIH0gZWxzZSB7CglzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCWlmIHskbGV2ZWwgPT0ge30gfHwgJGlkICE9IFtsaW5kZXggJHRvZG8gJGxldmVsXX0gewoJICAgIHJldHVybgoJfQoJd2hpbGUgMSB7CgkgICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgaWYge1t1cGRhdGV0b2RvICRsZXZlbCAkZGF0ZW1vZGVdfSB7CgkJc2V0IGxldmVsIFtkZWNpZGVuZXh0IDFdCgkJaWYgeyRsZXZlbCA9PSB7fX0gYnJlYWsKCSAgICB9CgkgICAgc2V0IGlkIFtsaW5kZXggJHRvZG8gJGxldmVsXQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXX0gewoJCWJyZWFrCgkgICAgfQoJfQogICAgfQogICAgZHJhd21vcmUgMQp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlCiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCSRjYW52IGRlbGV0ZSBhbGwKCSRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJObyBjb21taXRzIHNlbGVjdGVkIiBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwoJc2V0IHBoYXNlIHt9CiAgICB9IGVsc2UgewoJZHJhd3Jlc3QKICAgIH0KICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2MgZHJhd2dyYXBoIHt9IHsKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3MgbmNtdXBkYXRlCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG9uc2NyZWVuCgogICAgaWYgeyRkaXNwbGF5b3JkZXIgPT0ge319IHJldHVybgogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGluaXRncmFwaAogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCXNldCBvbnNjcmVlbigkaWQpIDAKICAgIH0KICAgIGRyYXdtb3JlIDAKfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgcGhhc2Ugc3RvcHBlZCByZWRpc3BsYXlpbmcgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGF0ZW1vZGUgdG9kbyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZQogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcyByZXZsaXN0b3JkZXIKCiAgICBpZiB7ISRyZXZsaXN0b3JkZXJ9IHsKCXNldCBsZXZlbCBbZGVjaWRlbmV4dF0KCWlmIHskbGV2ZWwgPj0gMH0gewoJICAgIHNldCBwaGFzZSBkcmF3Z3JhcGgKCSAgICB3aGlsZSAxIHsKCQlsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCQlzZXQgaGFyZCBbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXQoJCWlmIHskaGFyZH0gewoJCSAgICBzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCgkJICAgIGlmIHskbGV2ZWwgPCAwfSBicmVhawoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBkcmF3bW9yZSAwCiAgICBzZXQgcGhhc2Uge30KICAgIHNldCBkcmF3bXNlY3MgW2V4cHIgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzXQogICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKICAgIGlmIHskcmVkaXNwbGF5aW5nfSB7CglpZiB7JHN0b3BwZWQgPT0gMCAmJiBbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJICAgIHNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCgl9CglpZiB7JHN0b3BwZWQgPT0gMX0gewoJICAgIHNldCBzdG9wcGVkIDAKCSAgICBhZnRlciBpZGxlIGRyYXdncmFwaAoJfSBlbHNlIHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCX0KICAgIH0KfQoKcHJvYyBmaW5kbWF0Y2hlcyB7Zn0gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCiAgICBpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CglzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZm91bmRzdHJpbmcgJGZdCiAgICB9IGVsc2UgewoJaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgc3RyIFtzdHJpbmcgdG9sb3dlciAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IHN0ciAkZgoJfQoJc2V0IG1hdGNoZXMge30KCXNldCBpIDAKCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZm91bmRzdHJpbmcgJHN0ciAkaV1dID49IDB9IHsKCSAgICBsYXBwZW5kIG1hdGNoZXMgW2xpc3QgJGogW2V4cHIgJGorJGZvdW5kc3RybGVuLTFdXQoJICAgIHNldCBpIFtleHByICRqICsgJGZvdW5kc3RybGVuXQoJfQogICAgfQogICAgcmV0dXJuICRtYXRjaGVzCn0KCnByb2MgZG9maW5kIHt9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kbG9jIGZpbmRzdHJpbmcgbWFya2VkbWF0Y2hlcyBjb21taXRpbmZvCiAgICBnbG9iYWwgbnVtY29tbWl0cyBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCBjYW52IGNhbnYyIGNhbnYzIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4KCiAgICBzdG9wZmluZHByb2MKICAgIHVubWFya21hdGNoZXMKICAgIGZvY3VzIC4KICAgIHNldCBtYXRjaGluZ2xpbmVzIHt9CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglmaW5kcGF0Y2hlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJc2V0IGZvdW5kc3RyaW5nIFtzdHJpbmcgdG9sb3dlciAkZmluZHN0cmluZ10KICAgIH0gZWxzZSB7CglzZXQgZm91bmRzdHJpbmcgJGZpbmRzdHJpbmcKICAgIH0KICAgIHNldCBmb3VuZHN0cmxlbiBbc3RyaW5nIGxlbmd0aCAkZmluZHN0cmluZ10KICAgIGlmIHskZm91bmRzdHJsZW4gPT0gMH0gcmV0dXJuCiAgICBpZiB7JGZpbmRsb2MgPT0gIkZpbGVzIn0gewoJZmluZGZpbGVzCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBvbGRzZWwgLTEKICAgIH0gZWxzZSB7CglzZXQgb2xkc2VsICRzZWxlY3RlZGxpbmUKICAgIH0KICAgIHNldCBkaWRzZWwgMAogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudH0KICAgIGZvciB7c2V0IGwgMH0geyRsIDwgJG51bWNvbW1pdHN9IHtpbmNyIGx9IHsKCXNldCBpZCAkbGluZWlkKCRsKQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJbWFya21hdGNoZXMgJGNhbnYgJGwgJGYgJGxpbmVodGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJBdXRob3IifSB7CgkJbWFya21hdGNoZXMgJGNhbnYyICRsICRmICRsaW5lbnRhZygkbCkgJG1hdGNoZXMgJG5hbWVmb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiRGF0ZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIgW2xpbmRleCAkbWF0Y2ggMV0gKyAxXQoJICAgICRjdGV4dCB0YWcgYWRkIGZvdW5kICIxLjAgKyAkc3RhcnQgYyIgIjEuMCArICRlbmQgYyIKCX0KICAgIH0KfQoKcHJvYyBmaW5kbmV4dCB7cmVzdGFydH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJaWYgeyRyZXN0YXJ0fSB7CgkgICAgZG9maW5kCgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+ICRzZWxlY3RlZGxpbmV9IHsKCSAgICBmaW5kc2VsZWN0bGluZSAkbAoJICAgIHJldHVybgoJfQogICAgfQogICAgYmVsbAp9Cgpwcm9jIGZpbmRwcmV2IHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWRvZmluZAoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBwcmV2IHt9CiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID49ICRzZWxlY3RlZGxpbmV9IGJyZWFrCglzZXQgcHJldiAkbAogICAgfQogICAgaWYgeyRwcmV2ICE9IHt9fSB7CglmaW5kc2VsZWN0bGluZSAkcHJldgogICAgfSBlbHNlIHsKCWJlbGwKICAgIH0KfQoKcHJvYyBmaW5kbG9jY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgZmluZGxvYyBmaW5kdHlwZSBmaW5kdHlwZW1lbnUKICAgIGlmIHskZmluZGxvYyA9PSAiUGlja2F4ZSJ9IHsKCXNldCBmaW5kdHlwZSBFeGFjdAoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgJGZpbmR0eXBlbWVudSBlbnRyeWNvbmYgMSAtc3RhdGUgJHN0YXRlCiAgICAkZmluZHR5cGVtZW51IGVudHJ5Y29uZiAyIC1zdGF0ZSAkc3RhdGUKfQoKcHJvYyBzdG9wZmluZHByb2Mge3tkb25lIDB9fSB7CiAgICBnbG9iYWwgZmluZHByb2NwaWQgZmluZHByb2NmaWxlIGZpbmRpZHMKICAgIGdsb2JhbCBjdGV4dCBmaW5kb2xkY3Vyc29yIHBoYXNlIG1haW5jdXJzb3IgdGV4dGN1cnNvcgogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzCgogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRwcm9jcGlkXX0gewoJaWYgeyEkZG9uZX0gewoJICAgIGNhdGNoIHtleGVjIGtpbGwgJGZpbmRwcm9jcGlkfQoJfQoJY2F0Y2gge2Nsb3NlICRmaW5kcHJvY2ZpbGV9Cgl1bnNldCBmaW5kcHJvY3BpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kaW5wcm9ncmVzc119IHsKCXVuc2V0IGZpbmRpbnByb2dyZXNzCglpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCSAgICAuIGNvbmZpZyAtY3Vyc29yICRtYWluY3Vyc29yCgkgICAgc2V0dGV4dGN1cnNvciAkdGV4dGN1cnNvcgoJfQogICAgfQp9Cgpwcm9jIGZpbmRwYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBmaW5kc3RyaW5nIHNlbGVjdGVkbGluZSBudW1jb21taXRzCiAgICBnbG9iYWwgZmluZHByb2NwaWQgZmluZHByb2NmaWxlCiAgICBnbG9iYWwgZmluZGRpZHNlbCBjdGV4dCBsaW5laWQgZmluZGlucHJvZ3Jlc3MKICAgIGdsb2JhbCBmaW5kaW5zZXJ0cG9zCgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHJldHVybgoKICAgICMgbWFrZSBhIGxpc3Qgb2YgYWxsIHRoZSBpZHMgdG8gc2VhcmNoLCBzdGFydGluZyBhdCB0aGUgb25lCiAgICAjIGFmdGVyIHRoZSBzZWxlY3RlZCBsaW5lIChpZiBhbnkpCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBsICRzZWxlY3RlZGxpbmUKICAgIH0gZWxzZSB7CglzZXQgbCAtMQogICAgfQogICAgc2V0IGlucHV0aWRzIHt9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRudW1jb21taXRzfSB7aW5jciBpfSB7CglpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgbCAwCgl9CglhcHBlbmQgaW5wdXRpZHMgJGxpbmVpZCgkbCkgIlxuIgogICAgfQoKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGYgW29wZW4gW2xpc3QgfCBnaXQtZGlmZi10cmVlIC0tc3RkaW4gLXMgLXIgLVMkZmluZHN0cmluZyBcCgkJCSA8PCAkaW5wdXRpZHNdIHJdCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBzdGFydGluZyBzZWFyY2ggcHJvY2VzczogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCBmaW5kaW5zZXJ0cG9zIGVuZAogICAgc2V0IGZpbmRwcm9jZmlsZSAkZgogICAgc2V0IGZpbmRwcm9jcGlkIFtwaWQgJGZdCiAgICBmY29uZmlndXJlICRmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGYgcmVhZGFibGUgcmVhZGZpbmRwcm9jCiAgICBzZXQgZmluZGRpZHNlbCAwCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXR0ZXh0Y3Vyc29yIHdhdGNoCiAgICBzZXQgZmluZGlucHJvZ3Jlc3MgMQp9Cgpwcm9jIHJlYWRmaW5kcHJvYyB7fSB7CiAgICBnbG9iYWwgZmluZHByb2NmaWxlIGZpbmRkaWRzZWwKICAgIGdsb2JhbCBpZGxpbmUgbWF0Y2hpbmdsaW5lcyBmaW5kaW5zZXJ0cG9zCgogICAgc2V0IG4gW2dldHMgJGZpbmRwcm9jZmlsZSBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGZpbmRwcm9jZmlsZV19IHsKCSAgICBzdG9wZmluZHByb2MgMQoJICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCQliZWxsCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1kaWZmLXRyZWUgb3V0cHV0OiAkbGluZSIKCXN0b3BmaW5kcHJvYwoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXB1dHMgc3RkZXJyICJzcHVyaW91cyBpZDogJGlkIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbCAkaWRsaW5lKCRpZCkKICAgIGluc2VydG1hdGNoICRsICRpZAp9Cgpwcm9jIGluc2VydG1hdGNoIHtsIGlkfSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmaW5kaW5zZXJ0cG9zIGZpbmRkaWRzZWwKCiAgICBpZiB7JGZpbmRpbnNlcnRwb3MgPT0gImVuZCJ9IHsKCWlmIHskbWF0Y2hpbmdsaW5lcyAhPSB7fSAmJiAkbCA8IFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF19IHsKCSAgICBzZXQgbWF0Y2hpbmdsaW5lcyBbbGluc2VydCAkbWF0Y2hpbmdsaW5lcyAwICRsXQoJICAgIHNldCBmaW5kaW5zZXJ0cG9zIDEKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgl9CiAgICB9IGVsc2UgewoJc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgJGZpbmRpbnNlcnRwb3MgJGxdCglpbmNyIGZpbmRpbnNlcnRwb3MKICAgIH0KICAgIG1hcmtoZWFkbGluZSAkbCAkaWQKICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lICRsCglzZXQgZmluZGRpZHNlbCAxCiAgICB9Cn0KCnByb2MgZmluZGZpbGVzIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cyBsaW5laWQgY3RleHQKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZGRpZHNlbCBwYXJlbnRzIG5wYXJlbnRzCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MgZmluZHN0YXJ0bGluZSBmaW5kaW5zZXJ0cG9zCiAgICBnbG9iYWwgdHJlZWRpZmZzIGZkaWZmaWRzIGZkaWZmc25lZWRlZCBmZGlmZnBvcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHJldHVybgoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAxfV0KICAgIH0gZWxzZSB7CglzZXQgbCAwCiAgICB9CiAgICBzZXQgZmZpbGVsaW5lICRsCiAgICBzZXQgZmluZHN0YXJ0bGluZSAkbAogICAgc2V0IGRpZmZzbmVlZGVkIHt9CiAgICBzZXQgZmRpZmZzbmVlZGVkIHt9CiAgICB3aGlsZSAxIHsKCXNldCBpZCAkbGluZWlkKCRsKQoJaWYgeyRmaW5kbWVyZ2VmaWxlcyB8fCAkbnBhcmVudHMoJGlkKSA9PSAxfSB7CgkgICAgZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcyhbbGlzdCAkaWQgJHBdKV19IHsKCQkgICAgYXBwZW5kIGRpZmZzbmVlZGVkICIkaWQgJHBcbiIKCQkgICAgbGFwcGVuZCBmZGlmZnNuZWVkZWQgW2xpc3QgJGlkICRwXQoJCX0KCSAgICB9Cgl9CglpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgbCAwCgl9CglpZiB7JGwgPT0gJGZpbmRzdGFydGxpbmV9IGJyZWFrCiAgICB9CgogICAgIyBzdGFydCBvZmYgYSBnaXQtZGlmZi10cmVlIHByb2Nlc3MgaWYgbmVlZGVkCiAgICBpZiB7JGRpZmZzbmVlZGVkIG5lIHt9fSB7CglpZiB7W2NhdGNoIHsKCSAgICBzZXQgZGYgW29wZW4gW2xpc3QgfCBnaXQtZGlmZi10cmVlIC1yIC0tc3RkaW4gPDwgJGRpZmZzbmVlZGVkXSByXQoJfSBlcnIgXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciBzdGFydGluZyBzZWFyY2ggcHJvY2VzczogJGVyciIKCSAgICByZXR1cm4KCX0KCWNhdGNoIHt1bnNldCBmZGlmZmlkc30KCXNldCBmZGlmZnBvcyAwCglmY29uZmlndXJlICRkZiAtYmxvY2tpbmcgMAoJZmlsZWV2ZW50ICRkZiByZWFkYWJsZSBbbGlzdCByZWFkZmlsZWRpZmZzICRkZl0KICAgIH0KCiAgICBzZXQgZmluZGRpZHNlbCAwCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBpZCAkbGluZWlkKCRsKQogICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpIDBdCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXR0ZXh0Y3Vyc29yIHdhdGNoCiAgICBzZXQgZmluZGlucHJvZ3Jlc3MgMQogICAgZmluZGNvbnQgW2xpc3QgJGlkICRwXQogICAgdXBkYXRlCn0KCnByb2MgcmVhZGZpbGVkaWZmcyB7ZGZ9IHsKICAgIGdsb2JhbCBmaW5kaWRzIGZkaWZmaWRzIGZkaWZmcwoKICAgIHNldCBuIFtnZXRzICRkZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGRmXX0gewoJICAgIGRvbmVmaWxlZGlmZgoJICAgIGlmIHtbY2F0Y2gge2Nsb3NlICRkZn0gZXJyXX0gewoJCXN0b3BmaW5kcHJvYwoJCWJlbGwKCQllcnJvcl9wb3B1cCAiRXJyb3IgaW4gZ2l0LWRpZmYtdHJlZTogJGVyciIKCSAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdfSB7CgkJc2V0IGlkcyAkZmluZGlkcwoJCXN0b3BmaW5kcHJvYwoJCWJlbGwKCQllcnJvcl9wb3B1cCAiQ291bGRuJ3QgZmluZCBkaWZmcyBmb3IgeyRpZHN9IgoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge14oWzAtOWEtZl17NDB9KSBcKGZyb20gKFswLTlhLWZdezQwfSlcKX0gJGxpbmUgbWF0Y2ggaWQgcF19IHsKCSMgc3RhcnQgb2YgYSBuZXcgc3RyaW5nIG9mIGRpZmZzCglkb25lZmlsZWRpZmYKCXNldCBmZGlmZmlkcyBbbGlzdCAkaWQgJHBdCglzZXQgZmRpZmZzIHt9CiAgICB9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCAiOioiICRsaW5lXX0gewoJbGFwcGVuZCBmZGlmZnMgW2xpbmRleCAkbGluZSA1XQogICAgfQp9Cgpwcm9jIGRvbmVmaWxlZGlmZiB7fSB7CiAgICBnbG9iYWwgZmRpZmZpZHMgZmRpZmZzIHRyZWVkaWZmcyBmaW5kaWRzCiAgICBnbG9iYWwgZmRpZmZzbmVlZGVkIGZkaWZmcG9zCgogICAgaWYge1tpbmZvIGV4aXN0cyBmZGlmZmlkc119IHsKCXdoaWxlIHtbbGluZGV4ICRmZGlmZnNuZWVkZWQgJGZkaWZmcG9zXSBuZSAkZmRpZmZpZHMKCSAgICAgICAmJiAkZmRpZmZwb3MgPCBbbGxlbmd0aCAkZmRpZmZzbmVlZGVkXX0gewoJICAgICMgZ2l0LWRpZmYtdHJlZSBkb2Vzbid0IG91dHB1dCBhbnl0aGluZyBmb3IgYSBjb21taXQKCSAgICAjIHdoaWNoIGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nCgkgICAgc2V0IG51bGxpZHMgW2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10KCSAgICBzZXQgdHJlZWRpZmZzKCRudWxsaWRzKSB7fQoJICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZGlkc10gJiYgJG51bGxpZHMgZXEgJGZpbmRpZHN9IHsKCQl1bnNldCBmaW5kaWRzCgkJZmluZGNvbnQgJG51bGxpZHMKCSAgICB9CgkgICAgaW5jciBmZGlmZnBvcwoJfQoJaW5jciBmZGlmZnBvcwoKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkZmRpZmZpZHMpXX0gewoJICAgIHNldCB0cmVlZGlmZnMoJGZkaWZmaWRzKSAkZmRpZmZzCgl9CglpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdICYmICRmZGlmZmlkcyBlcSAkZmluZGlkc30gewoJICAgIHVuc2V0IGZpbmRpZHMKCSAgICBmaW5kY29udCAkZmRpZmZpZHMKCX0KICAgIH0KfQoKcHJvYyBmaW5kY29udCB7aWRzfSB7CiAgICBnbG9iYWwgZmluZGlkcyB0cmVlZGlmZnMgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGZmaWxlbGluZSBmaW5kc3RhcnRsaW5lIGZpbmRkaWRzZWwKICAgIGdsb2JhbCBsaW5laWQgbnVtY29tbWl0cyBtYXRjaGluZ2xpbmVzIGZpbmRpbnByb2dyZXNzCiAgICBnbG9iYWwgZmluZG1lcmdlZmlsZXMKCiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIHNldCBwaSBbbHNlYXJjaCAtZXhhY3QgJHBhcmVudHMoJGlkKSAkcF0KICAgIHNldCBsICRmZmlsZWxpbmUKICAgIHdoaWxlIDEgewoJaWYgeyRmaW5kbWVyZ2VmaWxlcyB8fCAkbnBhcmVudHMoJGlkKSA9PSAxfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJCXNldCBmaW5kaWRzICRpZHMKCQlzZXQgZmZpbGVsaW5lICRsCgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCBkb2VzbWF0Y2ggMAoJICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZHMpIHsKCQlzZXQgeCBbZmluZG1hdGNoZXMgJGZdCgkJaWYgeyR4ICE9IHt9fSB7CgkJICAgIHNldCBkb2VzbWF0Y2ggMQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaWYgeyRkb2VzbWF0Y2h9IHsKCQlpbnNlcnRtYXRjaCAkbCAkaWQKCQlzZXQgcGkgJG5wYXJlbnRzKCRpZCkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBwaSAkbnBhcmVudHMoJGlkKQoJfQoJaWYge1tpbmNyIHBpXSA+PSAkbnBhcmVudHMoJGlkKX0gewoJICAgIHNldCBwaSAwCgkgICAgaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkJc2V0IGwgMAoJICAgIH0KCSAgICBpZiB7JGwgPT0gJGZpbmRzdGFydGxpbmV9IGJyZWFrCgkgICAgc2V0IGlkICRsaW5laWQoJGwpCgl9CglzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgJHBpXQoJc2V0IGlkcyBbbGlzdCAkaWQgJHBdCiAgICB9CiAgICBzdG9wZmluZHByb2MKICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCWJlbGwKICAgIH0KfQoKIyBtYXJrIGEgY29tbWl0IGFzIG1hdGNoaW5nIGJ5IHB1dHRpbmcgYSB5ZWxsb3cgYmFja2dyb3VuZAojIGJlaGluZCB0aGUgaGVhZGxpbmUKcHJvYyBtYXJraGVhZGxpbmUge2wgaWR9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGxpbmVodGFnIGNvbW1pdGluZm8KCiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0ICRiYm94IC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQogICAgJGNhbnYgbG93ZXIgJHQKfQoKIyBtYXJrIHRoZSBiaXRzIG9mIGEgaGVhZGxpbmUsIGF1dGhvciBvciBkYXRlIHRoYXQgbWF0Y2ggYSBmaW5kIHN0cmluZwpwcm9jIG1hcmttYXRjaGVzIHtjYW52IGwgc3RyIHRhZyBtYXRjaGVzIGZvbnR9IHsKICAgIHNldCBiYm94IFskY2FudiBiYm94ICR0YWddCiAgICBzZXQgeDAgW2xpbmRleCAkYmJveCAwXQogICAgc2V0IHkwIFtsaW5kZXggJGJib3ggMV0KICAgIHNldCB5MSBbbGluZGV4ICRiYm94IDNdCiAgICBmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCXNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJc2V0IGVuZCBbbGluZGV4ICRtYXRjaCAxXQoJaWYgeyRzdGFydCA+ICRlbmR9IGNvbnRpbnVlCglzZXQgeG9mZiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByICRzdGFydC0xXV1dCglzZXQgeGxlbiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByICRlbmRdXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciAkeDArJHhvZmZdICR5MCBbZXhwciAkeDArJHhsZW4rMl0gJHkxIFwKCQkgICAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KCSRjYW52IGxvd2VyICR0CiAgICB9Cn0KCnByb2MgdW5tYXJrbWF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmaW5kaWRzCiAgICBhbGxjYW52cyBkZWxldGUgbWF0Y2hlcwogICAgY2F0Y2gge3Vuc2V0IG1hdGNoaW5nbGluZXN9CiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KfQoKcHJvYyBzZWxjYW52bGluZSB7dyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnZ5MCBjdGV4dCBsaW5lc3BjCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIHJvd3RleHR4CiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgc2V0IGwgW2V4cHIge2ludCgoJHkgLSAkY2FudnkwKSAvICRsaW5lc3BjICsgMC41KX1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9CiAgICBpZiB7JHcgZXEgJGNhbnZ9IHsKCWlmIHshW2luZm8gZXhpc3RzIHJvd3RleHR4KCRsKV0gfHwgJHggPCAkcm93dGV4dHgoJGwpfSByZXR1cm4KICAgIH0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIGNvbW1pdF9kZXNjcmlwdG9yIHtwfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbwogICAgc2V0IGwgIi4uLiIKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CglzZXQgbCBbbGluZGV4ICRjb21taXRpbmZvKCRwKSAwXQogICAgfQogICAgcmV0dXJuICIkcCAoJGwpIgp9CgojIGFwcGVuZCBzb21lIHRleHQgdG8gdGhlIGN0ZXh0IHdpZGdldCwgYW5kIG1ha2UgYW55IFNIQTEgSUQKIyB0aGF0IHdlIGtub3cgYWJvdXQgYmUgYSBjbGlja2FibGUgbGluay4KcHJvYyBhcHBlbmR3aXRobGlua3Mge3RleHR9IHsKICAgIGdsb2JhbCBjdGV4dCBpZGxpbmUgbGlua251bQoKICAgIHNldCBzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkdGV4dAogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgc2V0IGxpbmtzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lIHtbMC05YS1mXXs0MH19ICR0ZXh0XQogICAgZm9yZWFjaCBsICRsaW5rcyB7CglzZXQgcyBbbGluZGV4ICRsIDBdCglzZXQgZSBbbGluZGV4ICRsIDFdCglzZXQgbGlua2lkIFtzdHJpbmcgcmFuZ2UgJHRleHQgJHMgJGVdCglpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGxpbmtpZCldfSBjb250aW51ZQoJaW5jciBlCgkkY3RleHQgdGFnIGFkZCBsaW5rICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYWRkIGxpbmskbGlua251bSAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGJpbmQgbGluayRsaW5rbnVtIDwxPiBbbGlzdCBzZWxlY3RsaW5lICRpZGxpbmUoJGxpbmtpZCkgMV0KCWluY3IgbGlua251bQogICAgfQogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQp9Cgpwcm9jIHNlbGVjdGxpbmUge2wgaXNuZXd9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNvbW1pdGluZm8gc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50cyBucGFyZW50cyBjaGlsZHJlbgogICAgZ2xvYmFsIGNmbGlzdCBjdXJyZW50aWQgc2hhMWVudHJ5CiAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MgaWRsaW5lIGxpbmtudW0KCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIG5vcm1hbGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIGxpbmVpZCgkbCldIHx8ICFbaW5mbyBleGlzdHMgbGluZWh0YWcoJGwpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYgbG93ZXIgJHQKICAgICRjYW52MiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYyIGxvd2VyICR0CiAgICAkY2FudjMgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYzIGNyZWF0ZSByZWN0IFskY2FudjMgYmJveCAkbGluZWR0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MyBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MyBsb3dlciAkdAogICAgc2V0IHkgW2V4cHIgeyRjYW52eTAgKyAkbCAqICRsaW5lc3BjfV0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIHNldCB5dG9wIFtleHByIHskeSAtICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeWJvdCBbZXhwciB7JHkgKyAkbGluZXNwYyArIDF9XQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIgW2xpbmRleCAkd25vdyAwXSAqICR5bWF4XQogICAgc2V0IHdib3QgW2V4cHIgW2xpbmRleCAkd25vdyAxXSAqICR5bWF4XQogICAgc2V0IHdoIFtleHByIHskd2JvdCAtICR3dG9wfV0KICAgIHNldCBuZXd0b3AgJHd0b3AKICAgIGlmIHskeXRvcCA8ICR3dG9wfSB7CglpZiB7JHlib3QgPCAkd3RvcH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCAkeXRvcAoJICAgIGlmIHskbmV3dG9wID4gJHd0b3AgLSAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wIC0gJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0gZWxzZWlmIHskeWJvdCA+ICR3Ym90fSB7CglpZiB7JHl0b3AgPiAkd2JvdH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHlib3QgLSAkd2h9XQoJICAgIGlmIHskbmV3dG9wIDwgJHd0b3AgKyAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbmV3dG9wICE9ICR3dG9wfSB7CglpZiB7JG5ld3RvcCA8IDB9IHsKCSAgICBzZXQgbmV3dG9wIDAKCX0KCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciAkbmV3dG9wICogMS4wIC8gJHltYXhdCiAgICB9CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkICRsaW5laWQoJGwpCiAgICBzZXQgY3VycmVudGlkICRpZAogICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiBmcm9tIDAKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgc2V0IGxpbmtudW0gMAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gICRkYXRlXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDRdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgJGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KIAogICAgc2V0IGNvbW1lbnQge30KICAgIGlmIHtbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGFwcGVuZCBjb21tZW50ICJQYXJlbnQ6IFtjb21taXRfZGVzY3JpcHRvciAkcF1cbiIKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCWZvcmVhY2ggYyAkY2hpbGRyZW4oJGlkKSB7CgkgICAgYXBwZW5kIGNvbW1lbnQgIkNoaWxkOiAgW2NvbW1pdF9kZXNjcmlwdG9yICRjXVxuIgoJfQogICAgfQogICAgYXBwZW5kIGNvbW1lbnQgIlxuIgogICAgYXBwZW5kIGNvbW1lbnQgW2xpbmRleCAkaW5mbyA1XQoKICAgICMgbWFrZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBTSEExIElEIGJlIGEgY2xpY2thYmxlIGxpbmsKICAgIGFwcGVuZHdpdGhsaW5rcyAkY29tbWVudAoKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJDb21tZW50cyIKICAgIGlmIHskbnBhcmVudHMoJGlkKSA9PSAxfSB7CglzdGFydGRpZmYgW2NvbmNhdCAkaWQgJHBhcmVudHMoJGlkKV0KICAgIH0gZWxzZWlmIHskbnBhcmVudHMoJGlkKSA+IDF9IHsKCW1lcmdlZGlmZiAkaWQKICAgIH0KfQoKcHJvYyBzZWxuZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByICRzZWxlY3RlZGxpbmUgKyAkZGlyXQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgdW5zZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKCiAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQogICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAp9Cgpwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRjbWR9IHsKCXJldHVybgogICAgfQoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGNtZF0KICAgIH0gZWxzZSB7CglsYXBwZW5kIGhpc3RvcnkgJGNtZAogICAgfQogICAgaW5jciBoaXN0b3J5aW5kZXgKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfSBlbHNlIHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQogICAgLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGdvYmFjayB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCWluY3IgaGlzdG9yeWluZGV4IC0xCglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCglldmFsICRjbWQKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA8PSAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnb2Zvcncge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSAkaGlzdG9yeWluZGV4XQoJaW5jciBoaXN0b3J5aW5kZXgKCWV2YWwgJGNtZAoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPj0gW2xsZW5ndGggJGhpc3RvcnldfSB7CgkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgbWVyZ2VkaWZmIHtpZH0gewogICAgZ2xvYmFsIHBhcmVudHMgZGlmZm1lcmdlaWQgZGlmZm1lcmdlZ2NhIG1lcmdlZmlsZWxpc3QgZGlmZnBpbmRleAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmcGluZGV4IC0xCiAgICBzZXQgZGlmZm1lcmdlZ2NhIFtmaW5kZ2NhICRwYXJlbnRzKCRpZCldCiAgICBpZiB7W2luZm8gZXhpc3RzIG1lcmdlZmlsZWxpc3QoJGlkKV19IHsKCWlmIHskbWVyZ2VmaWxlbGlzdCgkaWQpIG5lIHt9fSB7CgkgICAgc2hvd21lcmdlZGlmZgoJfQogICAgfSBlbHNlIHsKCWNvbnRtZXJnZWRpZmYge30KICAgIH0KfQoKcHJvYyBmaW5kZ2NhIHtpZHN9IHsKICAgIHNldCBnY2Ege30KICAgIGZvcmVhY2ggaWQgJGlkcyB7CglpZiB7JGdjYSBlcSB7fX0gewoJICAgIHNldCBnY2EgJGlkCgl9IGVsc2UgewoJICAgIGlmIHtbY2F0Y2ggewoJCXNldCBnY2EgW2V4ZWMgZ2l0LW1lcmdlLWJhc2UgJGdjYSAkaWRdCgkgICAgfSBlcnJdfSB7CgkJcmV0dXJuIHt9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRnY2EKfQoKcHJvYyBjb250bWVyZ2VkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmcGluZGV4IHBhcmVudHMgbnBhcmVudHMgZGlmZm1lcmdlZ2NhCiAgICBnbG9iYWwgdHJlZWRpZmZzIG1lcmdlZmlsZWxpc3QgZGlmZmlkcyB0cmVlcGVuZGluZwoKICAgICMgZGlmZiB0aGUgY2hpbGQgYWdhaW5zdCBlYWNoIG9mIHRoZSBwYXJlbnRzLCBhbmQgZGlmZgogICAgIyBlYWNoIG9mIHRoZSBwYXJlbnRzIGFnYWluc3QgdGhlIEdDQS4KICAgIHdoaWxlIDEgewoJaWYge1tsaW5kZXggJGlkcyAwXSA9PSAkZGlmZm1lcmdlaWQgJiYgJGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJICAgIHNldCBpZHMgW2xpc3QgW2xpbmRleCAkaWRzIDFdICRkaWZmbWVyZ2VnY2FdCgl9IGVsc2UgewoJICAgIGlmIHtbaW5jciBkaWZmcGluZGV4XSA+PSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKX0gYnJlYWsKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJGRpZmZwaW5kZXhdCgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCgl9CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CgkgICAgc2V0IGRpZmZpZHMgJGlkcwoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJCWdldHRyZWVkaWZmcyAkaWRzCgkgICAgfQoJICAgIHJldHVybgoJfQogICAgfQoKICAgICMgSWYgYSBmaWxlIGluIHNvbWUgcGFyZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBhbmQgYWxzbwogICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgR0NBLCB0aGVuIGl0J3MgaW50ZXJlc3RpbmcuCiAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBHQ0EsIHRoZW4gYSBmaWxlIGlzIGludGVyZXN0aW5nIGlmIGl0IGlzCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBpbiBhbGwgdGhlIHBhcmVudHMuCiAgICBpZiB7JGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJc2V0IGZpbGVzIHt9Cglmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CgkgICAgc2V0IGdjYWRpZmZzICR0cmVlZGlmZnMoW2xpc3QgJHAgJGRpZmZtZXJnZWdjYV0pCgkgICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkgewoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGZpbGVzICRmXSA8IDAKCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRnY2FkaWZmcyAkZl0gPj0gMH0gewoJCSAgICBsYXBwZW5kIGZpbGVzICRmCgkJfQoJICAgIH0KCX0KCXNldCBmaWxlcyBbbHNvcnQgJGZpbGVzXQogICAgfSBlbHNlIHsKCXNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAwXQoJc2V0IGZpbGVzICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkKCWZvciB7c2V0IGkgMX0geyRpIDwgJG5wYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJiYgJGZpbGVzIG5lIHt9fSB7aW5jciBpfSB7CgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpICRpXQoJICAgIHNldCBkZiAkdHJlZWRpZmZzKFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0pCgkgICAgc2V0IG5mIHt9CgkgICAgZm9yZWFjaCBmICRmaWxlcyB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZGYgJGZdID49IDB9IHsKCQkgICAgbGFwcGVuZCBuZiAkZgoJCX0KCSAgICB9CgkgICAgc2V0IGZpbGVzICRuZgoJfQogICAgfQoKICAgIHNldCBtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZpbGVzCiAgICBpZiB7JGZpbGVzIG5lIHt9fSB7CglzaG93bWVyZ2VkaWZmCiAgICB9Cn0KCnByb2Mgc2hvd21lcmdlZGlmZiB7fSB7CiAgICBnbG9iYWwgY2ZsaXN0IGRpZmZtZXJnZWlkIG1lcmdlZmlsZWxpc3QgcGFyZW50cwogICAgZ2xvYmFsIGRpZmZvcHRzIGRpZmZpbmh1bmsgY3VycmVudGZpbGUgY3VycmVudGh1bmsgZmlsZWxpbmVzCiAgICBnbG9iYWwgZGlmZmJsb2NrZWQgZ3JvdXBmaWxlbGFzdCBtZXJnZWZkcyBncm91cGZpbGVudW0gZ3JvdXBodW5rcwoKICAgIHNldCBmaWxlcyAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpCiAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBmbGlzdCB7fQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRmaWxlfQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRodW5rfQogICAgY2F0Y2gge3Vuc2V0IGZpbGVsaW5lc30KICAgIGNhdGNoIHt1bnNldCBncm91cGZpbGVudW19CiAgICBjYXRjaCB7dW5zZXQgZ3JvdXBodW5rc30KICAgIHNldCBncm91cGZpbGVsYXN0IC0xCiAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CglzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtcCAkcCAkZGlmZm1lcmdlaWRdCglzZXQgY21kIFtjb25jYXQgJGNtZCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQoJaWYge1tjYXRjaCB7c2V0IGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIGRpZmZzOiAkZXJyIgoJICAgIGZvcmVhY2ggZiAkZmxpc3QgewoJCWNhdGNoIHtjbG9zZSAkZn0KCSAgICB9CgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGZsaXN0ICRmCglzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0KCXNldCBtZXJnZWZkcygkaWRzKSAkZgoJc2V0IGRpZmZpbmh1bmsoJGlkcykgMAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIDAKCWZjb25maWd1cmUgJGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRmICRpZHMgJGRpZmZtZXJnZWlkXQogICAgfQp9Cgpwcm9jIGdldG1lcmdlZGlmZmxpbmUge2YgaWRzIGlkfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZmluaHVuayBkaWZmb2xkbGluZXMgZGlmZm5ld2xpbmVzCiAgICBnbG9iYWwgY3VycmVudGZpbGUgY3VycmVudGh1bmsKICAgIGdsb2JhbCBkaWZmb2xkc3RhcnQgZGlmZm5ld3N0YXJ0IGRpZmZvbGRsbm8gZGlmZm5ld2xubwogICAgZ2xvYmFsIGRpZmZibG9ja2VkIG1lcmdlZmlsZWxpc3QKICAgIGdsb2JhbCBub2xkbGluZXMgbm5ld2xpbmVzIGRpZmZsY291bnRzIGZpbGVsaW5lcwoKICAgIHNldCBuIFtnZXRzICRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGZdfSByZXR1cm4KICAgIH0KCiAgICBpZiB7IShbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdICYmICRkaWZmbWVyZ2VpZCA9PSAkaWQpfSB7CglpZiB7JG4gPCAwfSB7CgkgICAgY2xvc2UgJGYKCX0KCXJldHVybgogICAgfQoKICAgIGlmIHskZGlmZmluaHVuaygkaWRzKSAhPSAwfSB7CglzZXQgZmkgJGN1cnJlbnRmaWxlKCRpZHMpCglpZiB7JG4gPiAwICYmIFtyZWdleHAge15bLSsgXFxdfSAkbGluZSBtYXRjaF19IHsKCSAgICAjIGNvbnRpbnVpbmcgYW4gZXhpc3RpbmcgaHVuawoJICAgIHNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCgkgICAgaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIgIn0gewoJCXNldCBmaWxlbGluZXMoJHAsJGZpLCRkaWZmb2xkbG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm9sZGxubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIrIiB8fCAkbWF0Y2ggZXEgIiAifSB7CgkJc2V0IGZpbGVsaW5lcygkaWQsJGZpLCRkaWZmbmV3bG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm5ld2xubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIgIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgXAoJCQlbbGlzdCAkbm9sZGxpbmVzKCRpZHMpICRubmV3bGluZXMoJGlkcyldCgkJICAgIHNldCBub2xkbGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAxCgkJfQoJCWluY3Igbm9sZGxpbmVzKCRpZHMpCgkgICAgfSBlbHNlaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIrIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCQkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkJICAgIHNldCBubmV3bGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAyCgkJfQoJCWlmIHskbWF0Y2ggZXEgIi0ifSB7CgkJICAgIGluY3Igbm9sZGxpbmVzKCRpZHMpCgkJfSBlbHNlIHsKCQkgICAgaW5jciBubmV3bGluZXMoJGlkcykKCQl9CgkgICAgfQoJICAgICMgYW5kIGlmIGl0J3MgXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBsaW5lLCB0aGVuIHdoYXQ/CgkgICAgcmV0dXJuCgl9CgkjIGVuZCBvZiBhIGh1bmsKCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxICYmICRub2xkbGluZXMoJGlkcykgIT0gMH0gewoJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCX0gZWxzZWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyCgkJICAmJiAoJG5vbGRsaW5lcygkaWRzKSAhPSAwIHx8ICRubmV3bGluZXMoJGlkcykgIT0gMCl9IHsKCSAgICBsYXBwZW5kIGRpZmZsY291bnRzKCRpZHMpIFtsaXN0ICRub2xkbGluZXMoJGlkcykgJG5uZXdsaW5lcygkaWRzKV0KCX0KCXNldCBjdXJyZW50aHVuaygkaWRzKSBbbGlzdCAkY3VycmVudGZpbGUoJGlkcykgXAoJCQkJICAgJGRpZmZvbGRzdGFydCgkaWRzKSAkZGlmZm5ld3N0YXJ0KCRpZHMpIFwKCQkJCSAgICRkaWZmb2xkbG5vKCRpZHMpICRkaWZmbmV3bG5vKCRpZHMpIFwKCQkJCSAgICRkaWZmbGNvdW50cygkaWRzKV0KCXNldCBkaWZmaW5odW5rKCRpZHMpIDAKCSMgLTEgPSBuZWVkIHRvIGJsb2NrLCAwID0gdW5ibG9ja2VkLCAxID0gaXMgYmxvY2tlZAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIC0xCglwcm9jZXNzaHVua3MKCWlmIHskZGlmZmJsb2NrZWQoJGlkcykgPT0gLTF9IHsKCSAgICBmaWxlZXZlbnQgJGYgcmVhZGFibGUge30KCSAgICBzZXQgZGlmZmJsb2NrZWQoJGlkcykgMQoJfQogICAgfQoKICAgIGlmIHskbiA8IDB9IHsKCSMgZW9mCglpZiB7ISRkaWZmYmxvY2tlZCgkaWRzKX0gewoJICAgIGNsb3NlICRmCgkgICAgc2V0IGN1cnJlbnRmaWxlKCRpZHMpIFtsbGVuZ3RoICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCgkgICAgc2V0IGN1cnJlbnRodW5rKCRpZHMpIFtsaXN0ICRjdXJyZW50ZmlsZSgkaWRzKSAwIDAgMCAwIHt9XQoJICAgIHByb2Nlc3NodW5rcwoJfQogICAgfSBlbHNlaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiL30gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCXNldCBjdXJyZW50ZmlsZSgkaWRzKSBcCgkgICAgW2xzZWFyY2ggLWV4YWN0ICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZuYW1lXQogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHtbaW5mbyBleGlzdHMgY3VycmVudGZpbGUoJGlkcyldICYmICRjdXJyZW50ZmlsZSgkaWRzKSA+PSAwfSB7CgkgICAgIyBzdGFydCBvZiBhIG5ldyBodW5rCgkgICAgaWYgeyRmMWwgPT0gMCAmJiAkZjFjID09IDB9IHsKCQlzZXQgZjFsIDEKCSAgICB9CgkgICAgaWYgeyRmMmwgPT0gMCAmJiAkZjJjID09IDB9IHsKCQlzZXQgZjJsIDEKCSAgICB9CgkgICAgc2V0IGRpZmZpbmh1bmsoJGlkcykgMQoJICAgIHNldCBkaWZmb2xkc3RhcnQoJGlkcykgJGYxbAoJICAgIHNldCBkaWZmbmV3c3RhcnQoJGlkcykgJGYybAoJICAgIHNldCBkaWZmb2xkbG5vKCRpZHMpICRmMWwKCSAgICBzZXQgZGlmZm5ld2xubygkaWRzKSAkZjJsCgkgICAgc2V0IGRpZmZsY291bnRzKCRpZHMpIHt9CgkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkgICAgc2V0IG5uZXdsaW5lcygkaWRzKSAwCgl9CiAgICB9Cn0KCnByb2MgcHJvY2Vzc2h1bmtzIHt9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBwYXJlbnRzIG5wYXJlbnRzIGN1cnJlbnRodW5rCiAgICBnbG9iYWwgbWVyZ2VmaWxlbGlzdCBkaWZmYmxvY2tlZCBtZXJnZWZkcwogICAgZ2xvYmFsIGdyb3VwaHVua3MgZ3JvdXBsaW5lc3RhcnQgZ3JvdXBsaW5lZW5kIGdyb3VwZmlsZW51bQoKICAgIHNldCBuZmlsZXMgW2xsZW5ndGggJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KICAgIHdoaWxlIDEgewoJc2V0IGZpICRuZmlsZXMKCXNldCBsbm8gMAoJIyBsb29rIGZvciB0aGUgZWFybGllc3QgaHVuawoJZm9yZWFjaCBwICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgewoJICAgIHNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwXQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRodW5rKCRpZHMpXX0gcmV0dXJuCgkgICAgc2V0IGkgW2xpbmRleCAkY3VycmVudGh1bmsoJGlkcykgMF0KCSAgICBzZXQgbCBbbGluZGV4ICRjdXJyZW50aHVuaygkaWRzKSAyXQoJICAgIGlmIHskaSA8ICRmaSB8fCAoJGkgPT0gJGZpICYmICRsIDwgJGxubyl9IHsKCQlzZXQgZmkgJGkKCQlzZXQgbG5vICRsCgkJc2V0IHBpICRwCgkgICAgfQoJfQoKCWlmIHskZmkgPCAkbmZpbGVzfSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBpXQoJICAgIHNldCBodW5rICRjdXJyZW50aHVuaygkaWRzKQoJICAgIHVuc2V0IGN1cnJlbnRodW5rKCRpZHMpCgkgICAgaWYgeyRkaWZmYmxvY2tlZCgkaWRzKSA+IDB9IHsKCQlmaWxlZXZlbnQgJG1lcmdlZmRzKCRpZHMpIHJlYWRhYmxlIFwKCQkgICAgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWVyZ2VmZHMoJGlkcykgJGlkcyAkZGlmZm1lcmdlaWRdCgkgICAgfQoJICAgIHNldCBkaWZmYmxvY2tlZCgkaWRzKSAwCgoJICAgIGlmIHtbaW5mbyBleGlzdHMgZ3JvdXBmaWxlbnVtXSAmJiAkZ3JvdXBmaWxlbnVtID09ICRmaQoJCSYmICRsbm8gPD0gJGdyb3VwbGluZWVuZH0gewoJCSMgYWRkIHRoaXMgaHVuayB0byB0aGUgcGVuZGluZyBncm91cAoJCWxhcHBlbmQgZ3JvdXBodW5rcygkcGkpICRodW5rCgkJc2V0IGVuZGxuIFtsaW5kZXggJGh1bmsgNF0KCQlpZiB7JGVuZGxuID4gJGdyb3VwbGluZWVuZH0gewoJCSAgICBzZXQgZ3JvdXBsaW5lZW5kICRlbmRsbgoJCX0KCQljb250aW51ZQoJICAgIH0KCX0KCgkjIHN1Y2NlZWRpbmcgc3R1ZmYgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBncm91cCwgc28KCSMgcHJvY2VzcyB0aGUgZ3JvdXAgbm93CglpZiB7W2luZm8gZXhpc3RzIGdyb3VwZmlsZW51bV19IHsKCSAgICBwcm9jZXNzZ3JvdXAKCSAgICB1bnNldCBncm91cGZpbGVudW0KCSAgICB1bnNldCBncm91cGh1bmtzCgl9CgoJaWYgeyRmaSA+PSAkbmZpbGVzfSBicmVhawoKCSMgc3RhcnQgYSBuZXcgZ3JvdXAKCXNldCBncm91cGZpbGVudW0gJGZpCglzZXQgZ3JvdXBodW5rcygkcGkpIFtsaXN0ICRodW5rXQoJc2V0IGdyb3VwbGluZXN0YXJ0ICRsbm8KCXNldCBncm91cGxpbmVlbmQgW2xpbmRleCAkaHVuayA0XQogICAgfQp9Cgpwcm9jIHByb2Nlc3Nncm91cCB7fSB7CiAgICBnbG9iYWwgZ3JvdXBmaWxlbGFzdCBncm91cGZpbGVudW0gZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG1lcmdlZmlsZWxpc3QgZGlmZm1lcmdlaWQgY3RleHQgZmlsZWxpbmVzCiAgICBnbG9iYWwgcGFyZW50cyBkaWZmbWVyZ2VpZCBkaWZmb2Zmc2V0CiAgICBnbG9iYWwgZ3JvdXBodW5rcyBncm91cGxpbmVzdGFydCBncm91cGxpbmVlbmQgbnBhcmVudHMKICAgIGdsb2JhbCBtZXJnZW1heAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBmICRncm91cGZpbGVudW0KICAgIGlmIHskZ3JvdXBmaWxlbGFzdCAhPSAkZn0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGRpZmZmaWxlc3RhcnQoJGYpICRoZXJlCglzZXQgbWFyayBmbWFyay5bZXhwciB7JGYgKyAxfV0KCSRjdGV4dCBtYXJrIHNldCAkbWFyayAkaGVyZQoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSAkbWFyayBsZWZ0CglzZXQgaGVhZGVyIFtsaW5kZXggJG1lcmdlZmlsZWxpc3QoJGlkKSAkZl0KCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZ3JvdXBmaWxlbGFzdCAkZgoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIHNldCBkaWZmb2Zmc2V0KCRwKSAwCgl9CiAgICB9CgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkBAIiBtc2VwCiAgICBzZXQgbmxpbmVzIFtleHByIHskZ3JvdXBsaW5lZW5kIC0gJGdyb3VwbGluZXN0YXJ0fV0KICAgIHNldCBldmVudHMge30KICAgIHNldCBwbnVtIDAKICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCXNldCBzdGFydGxpbmUgW2V4cHIgeyRncm91cGxpbmVzdGFydCArICRkaWZmb2Zmc2V0KCRwKX1dCglzZXQgb2wgJHN0YXJ0bGluZQoJc2V0IG5sICRncm91cGxpbmVzdGFydAoJaWYge1tpbmZvIGV4aXN0cyBncm91cGh1bmtzKCRwKV19IHsKCSAgICBmb3JlYWNoIGggJGdyb3VwaHVua3MoJHApIHsKCQlzZXQgbCBbbGluZGV4ICRoIDJdCgkJaWYgeyRubCA8ICRsfSB7CgkJICAgIGZvciB7fSB7JG5sIDwgJGx9IHtpbmNyIG5sfSB7CgkJCXNldCBmaWxlbGluZXMoJHAsJGYsJG9sKSAkZmlsZWxpbmVzKCRpZCwkZiwkbmwpCgkJCWluY3Igb2wKCQkgICAgfQoJCX0KCQlmb3JlYWNoIGNodW5rIFtsaW5kZXggJGggNV0gewoJCSAgICBpZiB7W2xsZW5ndGggJGNodW5rXSA9PSAyfSB7CgkJCXNldCBvbGMgW2xpbmRleCAkY2h1bmsgMF0KCQkJc2V0IG5sYyBbbGluZGV4ICRjaHVuayAxXQoJCQlzZXQgbm5sIFtleHByIHskbmwgKyAkbmxjfV0KCQkJbGFwcGVuZCBldmVudHMgW2xpc3QgJG5sICRubmwgJHBudW0gJG9sYyAkbmxjXQoJCQlpbmNyIG9sICRvbGMKCQkJc2V0IG5sICRubmwKCQkgICAgfSBlbHNlIHsKCQkJaW5jciBvbCBbbGluZGV4ICRjaHVuayAwXQoJCQlpbmNyIG5sIFtsaW5kZXggJGNodW5rIDBdCgkJICAgIH0KCQl9CgkgICAgfQoJfQoJaWYgeyRubCA8ICRncm91cGxpbmVlbmR9IHsKCSAgICBmb3Ige30geyRubCA8ICRncm91cGxpbmVlbmR9IHtpbmNyIG5sfSB7CgkJc2V0IGZpbGVsaW5lcygkcCwkZiwkb2wpICRmaWxlbGluZXMoJGlkLCRmLCRubCkKCQlpbmNyIG9sCgkgICAgfQoJfQoJc2V0IG5saW5lcyBbZXhwciB7JG9sIC0gJHN0YXJ0bGluZX1dCgkkY3RleHQgaW5zZXJ0IGVuZCAiIC0kc3RhcnRsaW5lLCRubGluZXMiIG1zZXAKCWluY3IgcG51bQogICAgfQoKICAgIHNldCBubGluZXMgW2V4cHIgeyRncm91cGxpbmVlbmQgLSAkZ3JvdXBsaW5lc3RhcnR9XQogICAgJGN0ZXh0IGluc2VydCBlbmQgIiArJGdyb3VwbGluZXN0YXJ0LCRubGluZXMgQEBcbiIgbXNlcAoKICAgIHNldCBldmVudHMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRldmVudHNdCiAgICBzZXQgbmV2ZW50cyBbbGxlbmd0aCAkZXZlbnRzXQogICAgc2V0IG5tZXJnZSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKQogICAgc2V0IGwgJGdyb3VwbGluZXN0YXJ0CiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRuZXZlbnRzfSB7c2V0IGkgJGp9IHsKCXNldCBubCBbbGluZGV4ICRldmVudHMgJGkgMF0KCXdoaWxlIHskbCA8ICRubH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iCgkgICAgaW5jciBsCgl9CglzZXQgZSBbbGluZGV4ICRldmVudHMgJGldCglzZXQgZW5sIFtsaW5kZXggJGUgMV0KCXNldCBqICRpCglzZXQgYWN0aXZlIHt9Cgl3aGlsZSAxIHsKCSAgICBzZXQgcG51bSBbbGluZGV4ICRlIDJdCgkgICAgc2V0IG9sYyBbbGluZGV4ICRlIDNdCgkgICAgc2V0IG5sYyBbbGluZGV4ICRlIDRdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXX0gewoJCXNldCBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCQlsYXBwZW5kIGFjdGl2ZSAkcG51bQoJICAgIH0gZWxzZSB7CgkJaW5jciBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCSAgICB9CgkgICAgaWYge1tpbmNyIGpdID49ICRuZXZlbnRzfSBicmVhawoJICAgIHNldCBlIFtsaW5kZXggJGV2ZW50cyAkal0KCSAgICBpZiB7W2xpbmRleCAkZSAwXSA+PSAkZW5sfSBicmVhawoJICAgIGlmIHtbbGluZGV4ICRlIDFdID4gJGVubH0gewoJCXNldCBlbmwgW2xpbmRleCAkZSAxXQoJICAgIH0KCX0KCXNldCBubGMgW2V4cHIgeyRlbmwgLSAkbH1dCglzZXQgbmNvbCBtcmVzdWx0CglzZXQgYmVzdHBuIC0xCglpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZSAtIDF9IHsKCSAgICAjIG5vIGRpZmYgZm9yIG9uZSBvZiB0aGUgcGFyZW50cywgaS5lLiBpdCdzIGlkZW50aWNhbAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV19IHsKCQkgICAgaWYgeyRwbnVtIDwgJG1lcmdlbWF4fSB7CgkJCWxhcHBlbmQgbmNvbCBtJHBudW0KCQkgICAgfSBlbHNlIHsKCQkJbGFwcGVuZCBuY29sIG1tYXgKCQkgICAgfQoJCSAgICBicmVhawoJCX0KCSAgICB9Cgl9IGVsc2VpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZX0gewoJICAgICMgYWxsIHBhcmVudHMgYXJlIGRpZmZlcmVudCwgc2VlIGlmIG9uZSBpcyB2ZXJ5IHNpbWlsYXIKCSAgICBzZXQgYmVzdHNpbSAzMAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCXNldCBzaW0gW3NpbWlsYXJpdHkgJHBudW0gJGwgJG5sYyAkZiBcCgkJCSAgICAgW2xyYW5nZSAkZXZlbnRzICRpIFtleHByIHskai0xfV1dXQoJCWlmIHskc2ltID4gJGJlc3RzaW19IHsKCQkgICAgc2V0IGJlc3RzaW0gJHNpbQoJCSAgICBzZXQgYmVzdHBuICRwbnVtCgkJfQoJICAgIH0KCSAgICBpZiB7JGJlc3RwbiA+PSAwfSB7CgkJbGFwcGVuZCBuY29sIG0kYmVzdHBuCgkgICAgfQoJfQoJc2V0IHBudW0gLTEKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpbmNyIHBudW0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldIHx8ICRwbnVtID09ICRiZXN0cG59IGNvbnRpbnVlCgkgICAgc2V0IG9sYyBbZXhwciB7JG5sYyArICRkZWx0YSgkcG51bSl9XQoJICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQoJICAgIGluY3IgZGlmZm9mZnNldCgkcCkgJGRlbHRhKCRwbnVtKQoJICAgIHVuc2V0IGRlbHRhKCRwbnVtKQoJICAgIGZvciB7fSB7JG9sYyA+IDB9IHtpbmNyIG9sYyAtMX0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICItJGZpbGVsaW5lcygkcCwkZiwkb2wpXG4iIG0kcG51bQoJCWluY3Igb2wKCSAgICB9Cgl9CglzZXQgZW5kbCBbZXhwciB7JGwgKyAkbmxjfV0KCWlmIHskYmVzdHBuID49IDB9IHsKCSAgICAjIHNob3cgdGhpcyBwcmV0dHkgbXVjaCBhcyBhIG5vcm1hbCBkaWZmCgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRiZXN0cG5dCgkgICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCgkgICAgaW5jciBkaWZmb2Zmc2V0KCRwKSAkZGVsdGEoJGJlc3RwbikKCSAgICB1bnNldCBkZWx0YSgkYmVzdHBuKQoJICAgIGZvciB7c2V0IGsgJGl9IHskayA8ICRqfSB7aW5jciBrfSB7CgkJc2V0IGUgW2xpbmRleCAkZXZlbnRzICRrXQoJCWlmIHtbbGluZGV4ICRlIDJdICE9ICRiZXN0cG59IGNvbnRpbnVlCgkJc2V0IG5sIFtsaW5kZXggJGUgMF0KCQlzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCQlmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgkJfQoJCXNldCBjIFtsaW5kZXggJGUgM10KCQlmb3Ige30geyRjID4gMH0ge2luY3IgYyAtMX0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiLSRmaWxlbGluZXMoJHAsJGYsJG9sKVxuIiBtJGJlc3RwbgoJCSAgICBpbmNyIG9sCgkJfQoJCXNldCBubCBbbGluZGV4ICRlIDFdCgkJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiKyRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIiBtcmVzdWx0CgkJfQoJICAgIH0KCX0KCWZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgl9CiAgICB9CiAgICB3aGlsZSB7JGwgPCAkZ3JvdXBsaW5lZW5kfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiICRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIgoJaW5jciBsCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBzaW1pbGFyaXR5IHtwbnVtIGwgbmxjIGYgZXZlbnRzfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgcGFyZW50cyBkaWZmb2Zmc2V0IGZpbGVsaW5lcwoKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkcG51bV0KICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQogICAgc2V0IGVuZGwgW2V4cHIgeyRsICsgJG5sY31dCiAgICBzZXQgc2FtZSAwCiAgICBzZXQgZGlmZiAwCiAgICBmb3JlYWNoIGUgJGV2ZW50cyB7CglpZiB7W2xpbmRleCAkZSAyXSAhPSAkcG51bX0gY29udGludWUKCXNldCBubCBbbGluZGV4ICRlIDBdCglzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCSAgICBpbmNyIHNhbWUgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJICAgIGluY3Igc2FtZQoJfQoJc2V0IG9jIFtsaW5kZXggJGUgM10KCWZvciB7fSB7JG9jID4gMH0ge2luY3Igb2MgLTF9IHsKCSAgICBpbmNyIGRpZmYgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkcCwkZiwkb2wpXQoJICAgIGluY3IgZGlmZgoJICAgIGluY3Igb2wKCX0KCXNldCBubCBbbGluZGV4ICRlIDFdCglmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkgICAgaW5jciBkaWZmIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCSAgICBpbmNyIGRpZmYKCX0KICAgIH0KICAgIGZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJaW5jciBzYW1lIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCWluY3Igc2FtZQogICAgfQogICAgaWYgeyRzYW1lID09IDB9IHsKCXJldHVybiAwCiAgICB9CiAgICByZXR1cm4gW2V4cHIgezIwMCAqICRzYW1lIC8gKDIgKiAkc2FtZSArICRkaWZmKX1dCn0KCnByb2Mgc3RhcnRkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZyBkaWZmbWVyZ2VpZAoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJICAgIGdldHRyZWVkaWZmcyAkaWRzCgl9CiAgICB9IGVsc2UgewoJYWRkdG9jZmxpc3QgJGlkcwogICAgfQp9Cgpwcm9jIGFkZHRvY2ZsaXN0IHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgY2ZsaXN0CiAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGYKICAgIH0KICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiBwYXJlbnRzIHRyZWVwZW5kaW5nCiAgICBzZXQgdHJlZXBlbmRpbmcgJGlkcwogICAgc2V0IHRyZWVkaWZmIHt9CiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gInxnaXQtZGlmZi10cmVlIC1yICRpZCIgcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGlkcyAhPSAkZGlmZmlkc30gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfSBlbHNlIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJCWNvbnRtZXJnZWRpZmYgJGlkcwoJICAgIH0gZWxzZSB7CgkJYWRkdG9jZmxpc3QgJGlkcwoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtcCAtQyAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZuZXh0aGVhZCBkaWZmbmV4dG5vdGUgZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwogICAgZ2xvYmFsIGdhdWR5ZGlmZgoKICAgIHNldCBuIFtnZXRzICRiZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRiZGZdfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCglzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGhlYWRlciAkbmV3bmFtZQoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRmbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkgICAgaW5jciBpCgkgICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkgICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0Cgl9CglpZiB7JG5ld25hbWUgIT0gJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRuZXduYW1lXQoJICAgIGlmIHskaSA+PSAwfSB7CgkJc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkJaW5jciBpCgkJJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0CgkgICAgfQoJfQoJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgoJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZGlmZmluaGRyIDEKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteKC0tLXxcK1wrXCspfSAkbGluZV19IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHskZ2F1ZHlkaWZmfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0IiBodW5rc2VwCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAgICAkZjFsICAgICIgZDAgIiAgICAkZjJsICAgICIgZDEKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICAgICRyZXN0IFxuIiBodW5rc2VwCgl9IGVsc2UgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCgl9CglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICBpZiB7JGdhdWR5ZGlmZn0gewoJCXNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkJc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCgl9IGVsc2VpZiB7JGRpZmZpbmhkciB8fCAkeCA9PSAiXFwifSB7CgkgICAgIyBlLmcuICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0gZWxzZSB7CgkgICAgIyBTb21ldGhpbmcgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUKCSAgICBpZiB7JGN1cmRpZmZ0YWcgIT0gIkNvbW1lbnRzIn0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCQlzZXQgY3VyZGlmZnRhZyBDb21tZW50cwoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJaW5jciBuZXh0dXBkYXRlIDEwMAoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUge30KCXVwZGF0ZQoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgImdldGJsb2JkaWZmbGluZSAkYmRmIHskaWRzfSIKICAgIH0KfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yIHtzZXQgaSAwfSB7W2luZm8gZXhpc3RzIGRpZmZmaWxlc3RhcnQoJGkpXX0ge2luY3IgaX0gewoJaWYge1skY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPiAkaGVyZV19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBwb3NdCgkJfHwgWyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA8ICRwb3NdfSB7CgkJc2V0IHBvcyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBvc119IHsKCSRjdGV4dCB5dmlldyAkcG9zCiAgICB9Cn0KCnByb2MgbGlzdGJveHNlbCB7fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IGN1cnJlbnRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgc2VsIFtsc29ydCBbJGNmbGlzdCBjdXJzZWxlY3Rpb25dXQogICAgaWYgeyRzZWwgZXEge319IHJldHVybgogICAgc2V0IGZpcnN0IFtsaW5kZXggJHNlbCAwXQogICAgY2F0Y2ggeyRjdGV4dCB5dmlldyBmbWFyay4kZmlyc3R9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciAzICsgMC41ICogJGxpbmVzcGNdCiAgICBzZXQgY2FudngwIFtleHByIDMgKyAwLjUgKiAkbGluZXNwY10KICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgc2V0IHhzcGMxKDApICRsaW5lc3BjCiAgICBzZXQgeHNwYzIgJGxpbmVzcGMKfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIHBoYXNlCiAgICBpZiB7JHN0b3BwZWQgPiAxfSByZXR1cm4KICAgIGlmIHskcGhhc2UgPT0gImdldGNvbW1pdHMifSByZXR1cm4KICAgIHNldCByZWRpc3BsYXlpbmcgMQogICAgaWYgeyRwaGFzZSA9PSAiZHJhd2dyYXBoIiB8fCAkcGhhc2UgPT0gImluY3JkcmF3In0gewoJc2V0IHN0b3BwZWQgMQogICAgfSBlbHNlIHsKCWRyYXdncmFwaAogICAgfQp9Cgpwcm9jIGluY3Jmb250IHtpbmN9IHsKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCB0ZXh0Zm9udCBjdGV4dCBjYW52IHBoYXNlCiAgICBnbG9iYWwgc3RvcHBlZCBlbnRyaWVzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbWFpbmZvbnQgW2xyZXBsYWNlICRtYWluZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG1haW5mb250IDFdICsgJGluY31dXQogICAgc2V0IG5hbWVmb250IFtscmVwbGFjZSAkbmFtZWZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRuYW1lZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgkkZSBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHsKCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIHJlZGlzcGxheQp9Cgpwcm9jIGNsZWFyc2hhMSB7fSB7CiAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hhMXN0cmluZ10gPT0gNDB9IHsKCSRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICB9Cn0KCnByb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBzaGExYnV0CiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1skc2hhMWJ1dCBjZ2V0IC1zdGF0ZV0gPT0gJHN0YXRlfSByZXR1cm4KICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIG5vcm1hbCAtcmVsaWVmIHJhaXNlZCAtdGV4dCAiR290bzogIgogICAgfSBlbHNlIHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgogICAgfQp9Cgpwcm9jIGdvdG9jb21taXQge30gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIGlkbGluZSB0YWdpZHMKICAgIGdsb2JhbCBsaW5laWQgbnVtY29tbWl0cwoKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGxpbmVpZCgkbCldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkbGluZWlkKCRsKQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpIDEKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWciCiAgICB9CiAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgp9Cgpwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjb21taXRpbmZvIGNhbnYKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSByZXR1cm4KICAgIHNldCBob3ZlcnggJHgKICAgIHNldCBob3ZlcnkgJHkKICAgIHNldCBob3ZlcmlkICRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCiAgICB9CiAgICBzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgICRjYW52IGRlbGV0ZSBob3Zlcgp9Cgpwcm9jIGxpbmVtb3Rpb24ge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCXNldCBob3ZlcnggJHgKCXNldCBob3ZlcnkgJHkKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCX0KCXNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgfQp9Cgpwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKICAgIGdsb2JhbCBob3ZlcmlkIGhvdmVydGltZXIgY2FudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CgkkY2FudiBkZWxldGUgaG92ZXIKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCSAgICB1bnNldCBob3ZlcnRpbWVyCgl9Cgl1bnNldCBob3ZlcmlkCiAgICB9Cn0KCnByb2MgbGluZWhvdmVyIHt9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBtYWluZm9udAoKICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHggW2V4cHIgeyRob3ZlcnggKyAyICogJGxpbmVzcGN9XQogICAgc2V0IHkgW2V4cHIgeyRob3ZlcnkgKyAkeWZyYWMgKiAkeW1heCAtICRsaW5lc3BjIC8gMn1dCiAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MCBbZXhwciB7JHkgLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHgxIFtleHByIHskeCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XSArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0YW5nbGUgJHgwICR5MCAkeDEgJHkxIFwKCSAgICAgICAtZmlsbCBcI2ZmZmY4MCAtb3V0bGluZSBibGFjayAtd2lkdGggMSAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHggJHkgLWFuY2hvciBudyAtdGV4dCAkdGV4dCAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgY2xpY2tpc29uYXJyb3cge2lkIHl9IHsKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcyBsdGhpY2tuZXNzCgogICAgc2V0IHRocmVzaCBbZXhwciB7MiAqICRsdGhpY2tuZXNzICsgNn1dCiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglpZiB7JG1haW5saW5lYXJyb3coJGlkKSBuZSAibm9uZSJ9IHsKCSAgICBpZiB7YWJzKFtsaW5kZXggJG1haW5saW5lKCRpZCkgMV0gLSAkeSkgPCAkdGhyZXNofSB7CgkJcmV0dXJuICJ1cCIKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgYXJyb3cgW2xpbmRleCAkbHMgMl0KCSAgICBpZiB7JGFycm93IGVxICJmaXJzdCIgfHwgJGFycm93IGVxICJib3RoIn0gewoJCWlmIHthYnMoW2xpbmRleCAkY29vcmRzIDFdIC0gJHkpIDwgJHRocmVzaH0gewoJCSAgICByZXR1cm4gInVwIgoJCX0KCSAgICB9CgkgICAgaWYgeyRhcnJvdyBlcSAibGFzdCIgfHwgJGFycm93IGVxICJib3RoIn0gewoJCWlmIHthYnMoW2xpbmRleCAkY29vcmRzIGVuZF0gLSAkeSkgPCAkdGhyZXNofSB7CgkJICAgIHJldHVybiAiZG93biIKCQl9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgYXJyb3dqdW1wIHtpZCBkaXJuIHl9IHsKICAgIGdsb2JhbCBtYWlubGluZSBzaWRlbGluZXMgY2FudgoKICAgIHNldCB5dCB7fQogICAgaWYgeyRkaXJuIGVxICJkb3duIn0gewoJaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJICAgIHNldCB5MSBbbGluZGV4ICRtYWlubGluZSgkaWQpIDFdCgkgICAgaWYgeyR5MSA+ICR5fSB7CgkJc2V0IHl0ICR5MQoJICAgIH0KCX0KCWlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7CgkgICAgZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJCXNldCB5MSBbbGluZGV4ICRscyAwIDFdCgkJaWYgeyR5MSA+ICR5ICYmICgkeXQgZXEge30gfHwgJHkxIDwgJHl0KX0gewoJCSAgICBzZXQgeXQgJHkxCgkJfQoJICAgIH0KCX0KICAgIH0gZWxzZSB7CglpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJICAgIGZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCQlzZXQgeTEgW2xpbmRleCAkbHMgMCBlbmRdCgkJaWYgeyR5MSA8ICR5ICYmICgkeXQgZXEge30gfHwgJHkxID4gJHl0KX0gewoJCSAgICBzZXQgeXQgJHkxCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskeXQgZXEge319IHJldHVybgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4IDw9IDB9IHJldHVybgogICAgc2V0IHZpZXcgWyRjYW52IHl2aWV3XQogICAgc2V0IHlzcGFuIFtleHByIHtbbGluZGV4ICR2aWV3IDFdIC0gW2xpbmRleCAkdmlldyAwXX1dCiAgICBzZXQgeWZyYWMgW2V4cHIgeyR5dCAvICR5bWF4IC0gJHlzcGFuIC8gMn1dCiAgICBpZiB7JHlmcmFjIDwgMH0gewoJc2V0IHlmcmFjIDAKICAgIH0KICAgICRjYW52IHl2aWV3IG1vdmV0byAkeWZyYWMKfQoKcHJvYyBsaW5lY2xpY2sge3ggeSBpZCBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdGluZm8gY2hpbGRyZW4gY2ZsaXN0IGNhbnYgdGhpY2tlcmxpbmUKCiAgICB1bm1hcmttYXRjaGVzCiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgIyBkcmF3IHRoaXMgbGluZSB0aGlja2VyIHRoYW4gbm9ybWFsCiAgICBkcmF3bGluZXMgJGlkIDEgMQogICAgc2V0IHRoaWNrZXJsaW5lICRpZAogICAgaWYgeyRpc25ld30gewoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJaWYgeyR5bWF4IGVxIHt9fSByZXR1cm4KCXNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KCXNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIH0KICAgIHNldCBkaXJuIFtjbGlja2lzb25hcnJvdyAkaWQgJHldCiAgICBpZiB7JGRpcm4gbmUge319IHsKCWFycm93anVtcCAkaWQgJGRpcm4gJHkKCXJldHVybgogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBsaW5lY2xpY2sgJHggJHkgJGlkIDBdCiAgICB9CiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkaWRdCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0JGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJcbkNoaWxkcmVuOiIKCXNldCBpIDAKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGluY3IgaQoJICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRjaGlsZCkKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdCIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAkY2hpbGQgW2xpc3QgbGluayBsaW5rJGldCgkgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmskaSA8MT4gW2xpc3Qgc2VsYnlpZCAkY2hpbGRdCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXSIKCSAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0RGF0ZTpcdCRkYXRlXG4iCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAp9Cgpwcm9jIG5vcm1hbGxpbmUge30gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXX0gewoJZHJhd2xpbmVzICR0aGlja2VybGluZSAwIDEKCXVuc2V0IHRoaWNrZXJsaW5lCiAgICB9Cn0KCnByb2Mgc2VsYnlpZCB7aWR9IHsKICAgIGdsb2JhbCBpZGxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglzZWxlY3RsaW5lICRpZGxpbmUoJGlkKSAxCiAgICB9Cn0KCnByb2MgbXN0aW1lIHt9IHsKICAgIGdsb2JhbCBzdGFydG1zdGltZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc3RhcnRtc3RpbWVdfSB7CglzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiUuM2YiIFtleHByIHsoW2Nsb2NrIGNsaWNrIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXN0aW1lKSAvIDEwMDAuMH1dXQp9Cgpwcm9jIHJvd21lbnUge3ggeSBpZH0gewogICAgZ2xvYmFsIHJvd2N0eG1lbnUgaWRsaW5lIHNlbGVjdGVkbGluZSByb3dtZW51aWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICRpZGxpbmUoJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAwIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMiAtc3RhdGUgJHN0YXRlCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKfQoKcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKICAgIGdsb2JhbCByb3dtZW51aWQgc2VsZWN0ZWRsaW5lIGxpbmVpZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyRkaXJufSB7CglzZXQgb2xkaWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQoJc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIH0gZWxzZSB7CglzZXQgb2xkaWQgJHJvd21lbnVpZAoJc2V0IG5ld2lkICRsaW5laWQoJHNlbGVjdGVkbGluZSkKICAgIH0KICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KICAgIGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkCn0KCnByb2MgZG9zZWxkaWZmIHtvbGRpZCBuZXdpZH0gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdAogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4wIDAuMAogICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4wIGxlZnQKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIlRvcCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICIKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkb2xkaWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkb2xkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cblRvICAgIgogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsxIDwxPiBbbGlzdCBzZWxieWlkICRuZXdpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRuZXdpZCBbbGlzdCBsaW5rIGxpbmsxXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgIHN0YXJ0ZGlmZiBbbGlzdCAkbmV3aWQgJG9sZGlkXQp9Cgpwcm9jIG1rcGF0Y2gge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJyZW50aWQgY29tbWl0aW5mbyBwYXRjaHRvcCBwYXRjaG51bQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRpZF19IHJldHVybgogICAgc2V0IG9sZGlkICRjdXJyZW50aWQKICAgIHNldCBvbGRoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIHNldCBuZXdoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgc2V0IHRvcCAucGF0Y2gKICAgIHNldCBwYXRjaHRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiR2VuZXJhdGUgcGF0Y2giCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mcm9tIC10ZXh0ICJGcm9tOiIKICAgIGVudHJ5ICR0b3AuZnJvbXNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9tc2hhMSBpbnNlcnQgMCAkb2xkaWQKICAgICR0b3AuZnJvbXNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5mcm9tICR0b3AuZnJvbXNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmZyb21oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbWhlYWQgaW5zZXJ0IDAgJG9sZGhlYWQKICAgICR0b3AuZnJvbWhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmZyb21oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50byAtdGV4dCAiVG86IgogICAgZW50cnkgJHRvcC50b3NoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b3NoYTEgaW5zZXJ0IDAgJG5ld2lkCiAgICAkdG9wLnRvc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLnRvICR0b3AudG9zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC50b2hlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b2hlYWQgaW5zZXJ0IDAgJG5ld2hlYWQKICAgICR0b3AudG9oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC50b2hlYWQgLXN0aWNreSB3CiAgICBidXR0b24gJHRvcC5yZXYgLXRleHQgIlJldmVyc2UiIC1jb21tYW5kIG1rcGF0Y2hyZXYgLXBhZHggNQogICAgZ3JpZCAkdG9wLnJldiB4IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAicGF0Y2gkcGF0Y2hudW0ucGF0Y2giXQogICAgaW5jciBwYXRjaG51bQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkdlbmVyYXRlIiAtY29tbWFuZCBta3BhdGNoZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rcGF0Y2hjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIG1rcGF0Y2hyZXYge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG9sZGhlYWQgWyRwYXRjaHRvcC5mcm9taGVhZCBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IG5ld2hlYWQgWyRwYXRjaHRvcC50b2hlYWQgZ2V0XQogICAgZm9yZWFjaCBlIFtsaXN0IGZyb21zaGExIGZyb21oZWFkIHRvc2hhMSB0b2hlYWRdIFwKCSAgICB2IFtsaXN0ICRuZXdpZCAkbmV3aGVhZCAkb2xkaWQgJG9sZGhlYWRdIHsKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSBub3JtYWwKCSRwYXRjaHRvcC4kZSBkZWxldGUgMCBlbmQKCSRwYXRjaHRvcC4kZSBpbnNlcnQgMCAkdgoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICB9Cn0KCnByb2MgbWtwYXRjaGdvIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgZm5hbWUgWyRwYXRjaHRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIGdpdC1kaWZmLXRyZWUgLXAgJG9sZGlkICRuZXdpZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyBwYXRjaDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWtwYXRjaGNhbiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rdGFnIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgbWt0YWd0b3AgY29tbWl0aW5mbwoKICAgIHNldCB0b3AgLm1ha2V0YWcKICAgIHNldCBta3RhZ3RvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiQ3JlYXRlIHRhZyIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50bGFiIC10ZXh0ICJUYWcgbmFtZToiCiAgICBlbnRyeSAkdG9wLnRhZyAtd2lkdGggNjAKICAgIGdyaWQgJHRvcC50bGFiICR0b3AudGFnIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBta3RhZ2dvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3RhZ2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnRhZwp9Cgpwcm9jIGRvbWt0YWcge30gewogICAgZ2xvYmFsIG1rdGFndG9wIGVudiB0YWdpZHMgaWR0YWdzCgogICAgc2V0IGlkIFskbWt0YWd0b3Auc2hhMSBnZXRdCiAgICBzZXQgdGFnIFskbWt0YWd0b3AudGFnIGdldF0KICAgIGlmIHskdGFnID09IHt9fSB7CgllcnJvcl9wb3B1cCAiTm8gdGFnIG5hbWUgc3BlY2lmaWVkIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkdGFnKV19IHsKCWVycm9yX3BvcHVwICJUYWcgXCIkdGFnXCIgYWxyZWFkeSBleGlzdHMiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbY2F0Y2ggewoJc2V0IGRpciBbZ2l0ZGlyXQoJc2V0IGZuYW1lIFtmaWxlIGpvaW4gJGRpciAicmVmcy90YWdzIiAkdGFnXQoJc2V0IGYgW29wZW4gJGZuYW1lIHddCglwdXRzICRmICRpZAoJY2xvc2UgJGYKICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHRhZzogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCB0YWdpZHMoJHRhZykgJGlkCiAgICBsYXBwZW5kIGlkdGFncygkaWQpICR0YWcKICAgIHJlZHJhd3RhZ3MgJGlkCn0KCnByb2MgcmVkcmF3dGFncyB7aWR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIGlkbGluZSBpZHBvcyBzZWxlY3RlZGxpbmUKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHJldHVybgogICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKICAgIHNldCB4dCBbZXZhbCBkcmF3dGFncyAkaWQgJGlkcG9zKCRpZCldCiAgICAkY2FudiBjb29yZHMgJGxpbmVodGFnKCRpZGxpbmUoJGlkKSkgJHh0IFtsaW5kZXggJGlkcG9zKCRpZCkgMl0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID09ICRpZGxpbmUoJGlkKX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBta3RhZ2NhbiB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkbWt0YWd0b3B9CiAgICB1bnNldCBta3RhZ3RvcAp9Cgpwcm9jIG1rdGFnZ28ge30gewogICAgZG9ta3RhZwogICAgbWt0YWdjYW4KfQoKcHJvYyB3cml0ZWNvbW1pdCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHdyY29tdG9wIGNvbW1pdGluZm8gd3Jjb21jbWQKCiAgICBzZXQgdG9wIC53cml0ZWNvbW1pdAogICAgc2V0IHdyY29tdG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJXcml0ZSBjb21taXQgdG8gZmlsZSIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5jbGFiIC10ZXh0ICJDb21tYW5kOiIKICAgIGVudHJ5ICR0b3AuY21kIC13aWR0aCA2MCAtdGV4dHZhcmlhYmxlIHdyY29tY21kCiAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB3cmNvbWNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2Mgd3Jjb21nbyB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KICAgIHNldCBjbWQgImVjaG8gJGlkIHwgWyR3cmNvbXRvcC5jbWQgZ2V0XSIKICAgIHNldCBmbmFtZSBbJHdyY29tdG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciB3cml0aW5nIGNvbW1pdDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2Mgd3Jjb21jYW4ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyBsaXN0cmVmcyB7aWR9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCB4IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IHggJGlkdGFncygkaWQpCiAgICB9CiAgICBzZXQgeSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeSAkaWRoZWFkcygkaWQpCiAgICB9CiAgICBzZXQgeiB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHogJGlkb3RoZXJyZWZzKCRpZCkKICAgIH0KICAgIHJldHVybiBbbGlzdCAkeCAkeSAkel0KfQoKcHJvYyByZXJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIHRhZ2lkcyBoZWFkaWRzIG90aGVycmVmaWRzCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICBmb3JlYWNoIHYge3RhZ2lkcyBpZHRhZ3MgaGVhZGlkcyBpZGhlYWRzIG90aGVycmVmaWRzIGlkb3RoZXJyZWZzfSB7CgljYXRjaCB7dW5zZXQgJHZ9CiAgICB9CiAgICByZWFkcmVmcwogICAgc2V0IHJlZmlkcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRyZWZpZHMgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCQlbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV1dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJc2V0IHYgW2xpc3RyZWZzICRpZF0KCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXSB8fCAkcmVmKCRpZCkgIT0gJHZ9IHsKCSAgICByZWRyYXd0YWdzICRpZAoJfQogICAgfQp9Cgpwcm9jIHNob3d0YWcge3RhZyBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgc2V0IGxpbmtudW0gMAogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCXNldCB0ZXh0ICR0YWdjb250ZW50cygkdGFnKQogICAgfSBlbHNlIHsKCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAp9Cgpwcm9jIGRvcXVpdCB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZAogICAgc2V0IHN0b3BwZWQgMTAwCiAgICBkZXN0cm95IC4KfQoKcHJvYyBmb3JtYXRkYXRlIHtkfSB7CiAgICBnbG9iYWwgaG91cnMgbmhvdXJzIHRmZAoKICAgIHNldCBociBbZXhwciB7JGQgLyAzNjAwfV0KICAgIHNldCBtcyBbZXhwciB7JGQgJSAzNjAwfV0KICAgIGlmIHshW2luZm8gZXhpc3RzIGhvdXJzKCRocildfSB7CglzZXQgaG91cnMoJGhyKSBbY2xvY2sgZm9ybWF0ICRkIC1mb3JtYXQgIiVZLSVtLSVkICVIIl0KCXNldCBuaG91cnMoJGhyKSAwCiAgICB9CiAgICBpbmNyIG5ob3VycygkaHIpCiAgICBzZXQgbWluc2VjIFtmb3JtYXQgIiUuMmQ6JS4yZCIgW2V4cHIgeyRtcy82MH1dIFtleHByIHskbXMlNjB9XV0KICAgIHJldHVybiAiJGhvdXJzKCRocik6JG1pbnNlYyIKfQoKIyBkZWZhdWx0cy4uLgpzZXQgZGF0ZW1vZGUgMApzZXQgYm9sZG5hbWVzIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQpzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgZ2F1ZHlkaWZmIDAKc2V0IG1heGdyYXBocGN0IDUwCnNldCBtYXh3aWR0aCAxNgpzZXQgcmV2bGlzdG9yZGVyIDAKCnNldCBjb2xvcnMge2dyZWVuIHJlZCBibHVlIG1hZ2VudGEgZGFya2dyZXkgYnJvd24gb3JhbmdlfQoKY2F0Y2gge3NvdXJjZSB+Ly5naXRrfQoKc2V0IG5hbWVmb250ICRtYWluZm9udAppZiB7JGJvbGRuYW1lc30gewogICAgbGFwcGVuZCBuYW1lZm9udCBib2xkCn0KCnNldCByZXZ0cmVlYXJncyB7fQpmb3JlYWNoIGFyZyAkYXJndiB7CiAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkYXJnIHsKCSJeJCIgeyB9CgkiXi1iIiB7IHNldCBib2xkbmFtZXMgMSB9CgkiXi1kIiB7IHNldCBkYXRlbW9kZSAxIH0KCSJeLXIiIHsgc2V0IHJldmxpc3RvcmRlciAxIH0KCWRlZmF1bHQgewoJICAgIGxhcHBlbmQgcmV2dHJlZWFyZ3MgJGFyZwoJfQogICAgfQp9CgpzZXQgaGlzdG9yeSB7fQpzZXQgaGlzdG9yeWluZGV4IDAKCnNldCBzdG9wcGVkIDAKc2V0IHJlZGlzcGxheWluZyAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cKcmVhZHJlZnMKZ2V0Y29tbWl0cyAkcmV2dHJlZWFyZ3MK