IyEvYmluL3NoCiN1c2c6IHdhbl9pcHY0IGxpbmt1cCBwc3dhbgogCnBhdGhfc2g9YG52IGdldCBwYXRoX3NoYAouICRwYXRoX3NoL2dsb2JhbC5zaAoKI8jrss7W0NPQY19pZNTyyejWw6Osw7vT0NTy1sPB46Os08PT2sno1sOy38LUwrfTybHtusUKaWYgWyAiLSQzIiA9PSAiLSIgXTsgdGhlbgogICAgY19pZD0iMCIKZWxzZQogICAgY19pZD0kMwpmaQpkZWZfY2lkPWBudiBnZXQgZGVmYXVsdF9jaWRgCgoju/HIoc34wufJ6LG4w/sKZ2V0X3dhbl9pZigpCnsKCWNhc2UgJDEgaW4gCgkicHN3YW4iKQoJCXdhbl9pZj0iJHBzd2FuX25hbWUiJDIgOzsKCSJldGh3YW4iKQoJCXdhbl9pZj0kZXRod2FuX2lmIDs7Cgkid2lmaXdhbiIpCgkJd2FuX2lmPSR3aWZpd2FuX2lmIDs7CQkKCWVzYWMKCQoJbXR1PWBudiBnZXQgbXR1YAoJaWZjb25maWcgJHdhbl9pZiBtdHUgJG10dQp9CiPJ6NbDuaTX99e0zKwg1f3U2sGsvdOjumNvbm5lY3Qg0tHBrL3To7p3b3JraW5nINLRts+/qqO6ZGVhZApzdGF0ZV9zZXQoKQp7CglpZiBbICItJHdhbl9uYW1lIiA9PSAiLXdpZml3YW4iIF07IHRoZW4KCQludiBzZXQgd2lmaV9zdGF0ZT0id29ya2luZyIJCgllbGlmIFsgIi0kd2FuX25hbWUiID09ICItZXRod2FuIiBdOyB0aGVuCgkJbnYgc2V0IHJqNDVfc3RhdGU9IndvcmtpbmciCQkKCWZpCn0KI7j5vt3N+L/ayse38dPD09rG1c2oyc/N4s34o6zIt7aoyse38dDo0qq3os/7z6K4+Hp0ZV9yb3V0ZXIKbXNnX3p0ZV9yb3V0ZXIoKQp7CglpZiBbICItJGNfaWQiID09ICItMCIgLW8gIi0kY19pZCIgPT0gIi0kZGVmX2NpZCIgXTsgdGhlbgoJCShyb3V0ZXJfbXNnX3Byb3h5IGlwdjQgd2FuX2lwdjQuc2ggPj4gJHRlc3RfbG9nIDI+JjEgfHwgZWNobyAiRXJyb3I6IHJvdXRlcl9tc2dfcHJveHkgaXB2NCB3YW5faXB2NC5zaCBmYWlsZWQuIiA+PiAkdGVzdF9sb2cpICYKCWZpCn0KCmxpbmt1cCgpCnsKCSMkMSA6cHN3YW4gLyB1c2J3YW4gLyBldGh3YW4gLyB3aWZpd2FuCgl3YW5fbmFtZT0kMQoJd2FuX21vZGU9YG52IGdldCAkd2FuX25hbWUiX21vZGUiYAoJCgkju/HIoXdhbl9pZrHkwb8KCWdldF93YW5faWYgJDEgJDIKCQoJaWYgWyAiLSR3YW5fbW9kZSIgPT0gIi1zdGF0aWMiIF07IHRoZW4KCQl3YW5faXA9YG52IGdldCAic3RhdGljXyIkd2FuX25hbWUiX2lwImAKCQl3YW5fZ3c9YG52IGdldCAic3RhdGljXyIkd2FuX25hbWUiX2d3ImAKCQl3YW5fcHJpZG5zPWBudiBnZXQgInN0YXRpY18iJHdhbl9uYW1lIl9wcmlkbnMiYAoJCXdhbl9zZWNkbnM9YG52IGdldCAic3RhdGljXyIkd2FuX25hbWUiX3NlY2RucyJgCgkJd2FuX25tPWBudiBnZXQgInN0YXRpY18iJHdhbl9uYW1lIl9ubSJgCgkJaWYgWyAiLSR3YW5fbmFtZSIgIT0gIi13aWZpd2FuIiBdOyB0aGVuCgkJCWlmY29uZmlnICR3YW5faWYgZG93biAyPj4kdGVzdF9sb2cKCQkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkd2FuX2lmIGRvd24gZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICAgICAgICAgIGZpCgkJCWlmY29uZmlnICR3YW5faWYgJHdhbl9pcCB1cCAyPj4kdGVzdF9sb2cKCQkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkd2FuX2lmICR3YW5faXAgdXAgZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICAgICAgICAgIGZpCgkJZmkKCQlpZiBbICItJHdhbl9uYW1lIiA9PSAiLWV0aHdhbiIgXTsgdGhlbgoJCQludiBzZXQgZXRoX2N1cm1vZGU9InN0YXRpYyIKCQkJI3JqNDW+ssysway906Osudix1bOsyrG8xsqxxvcKCQkJKHJvdXRlcl9tc2dfcHJveHkgZGVsX3RpbWVyIGV0aHdhbiA+PiAkdGVzdF9sb2cgMj4mMSB8fCBlY2hvICJFcnJvcjogcm91dGVyX21zZ19wcm94eSBkZWxfdGltZXIgZmFpbGVkLiIgPj4gJHRlc3RfbG9nKSAmCgkJZmkJCQoJCQoJCSPJ6NbDzfjC58nosbjXtMysserWvs6qd29ya2luZwkKCQlzdGF0ZV9zZXQKCQkjc2V0IGlwoaJnd6GiZG5zIHRvIG52CgkJbnYgc2V0ICR3YW5faWYiX2lwIj0kd2FuX2lwCgkJbnYgc2V0ICR3YW5faWYiX2d3Ij0kd2FuX2d3CgkJbnYgc2V0ICR3YW5faWYiX3ByaWRucyI9JHdhbl9wcmlkbnMKCQludiBzZXQgJHdhbl9pZiJfc2VjZG5zIj0kd2FuX3NlY2RucwoJCgkJd2FuX3ByaT1gbnYgZ2V0ICQxIl9wcmlvcml0eSJgCgkJcnRfbnVtPWBleHByICR3YW5fcHJpIFwqIDEwICsgJGNfaWRgCgkJaXAgcnVsZSBhZGQgZnJvbSAkd2FuX2lwIHRhYmxlICRydF9udW0gMj4+JHRlc3RfbG9nCgkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgZWNobyAiRXJyb3I6IGlwIHJ1bGUgYWRkIGZyb20gJHdhbl9pcCB0YWJsZSAkcnRfbnVtIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgICAgIGZpCgkJaXAgcm91dGUgYWRkIGRlZmF1bHQgdmlhICR3YW5fZ3cgdGFibGUgJHJ0X251bSAyPj4kdGVzdF9sb2cKCQlpZiBbICQ/IC1uZSAwIF07dGhlbgoJICAgICAgICBlY2hvICJFcnJvcjogaXAgcm91dGUgYWRkIGRlZmF1bHQgdmlhICR3YW5fZ3cgdGFibGUgJHJ0X251bSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICBmaQoJCWlwIHJvdXRlIGZsdXNoIGNhY2hlIDI+PiR0ZXN0X2xvZwoJCWlmIFsgJD8gLW5lIDAgXTt0aGVuCgkgICAgICAgIGVjaG8gIkVycm9yOiBpcCByb3V0ZSBmbHVzaCBjYWNoZSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICBmaQogICAgICAgCgkJI2luIHRoaXMgcHJveHkgLHdlIHNlbmQgbXNnIHRvIHp0ZV9tYWluY3RybCAKCQltc2dfenRlX3JvdXRlcgoJICAgCgkjIHBzd2FuIFBEUCAJIAoJZWxpZiBbICItJHdhbl9tb2RlIiA9PSAiLXBkcCIgXTsgdGhlbgoJCXBzd2FuX2lwPWBudiBnZXQgJHdhbl9pZiJfaXAiYAoJCXBzd2FuX2d3PWBudiBnZXQgJHdhbl9pZiJfZ3ciYAoJCXBzd2FuX3ByaWRucz1gbnYgZ2V0ICR3YW5faWYiX3ByaWRucyJgCgkJcHN3YW5fc2VjZG5zPWBudiBnZXQgJHdhbl9pZiJfc2VjZG5zImAKCQlwc3dhbl9ubT1gbnYgZ2V0ICR3YW5faWYiX25tImAKCQkKCQkjaWZjb25maWcgJHdhbl9pZiBkb3duIDI+PiR0ZXN0X2xvZwoJCWlmY29uZmlnICR3YW5faWYgJHBzd2FuX2lwIG5ldG1hc2sgMjU1LjI1NS4yNTUuMCB1cCAyPj4kdGVzdF9sb2cKCQlpZiBbICQ/IC1uZSAwIF07dGhlbgoJICAgICAgICBlY2hvICJFcnJvcjogaWZjb25maWcgJHdhbl9pZiAkcHN3YW5faXAgdXAgZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICAgICAgZmkKCQkKCQlwc3dhbl9wcmk9YG52IGdldCBwc3dhbl9wcmlvcml0eWAKCQlydF9udW09YGV4cHIgJHBzd2FuX3ByaSBcKiAxMCArICRjX2lkYAoJCWlwIHJ1bGUgYWRkIGZyb20gJHBzd2FuX2lwIHRhYmxlICRydF9udW0gMj4+JHRlc3RfbG9nCgkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgZWNobyAiRXJyb3I6IGlwIHJ1bGUgYWRkIGZyb20gJHBzd2FuX2lwIHRhYmxlICRydF9udW0gZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICAgICAgZmkKCQlpcCByb3V0ZSBhZGQgZGVmYXVsdCB2aWEgJHBzd2FuX2d3IHRhYmxlICRydF9udW0gMj4+JHRlc3RfbG9nCgkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgZWNobyAiRXJyb3I6IGlwIHJvdXRlIGFkZCBkZWZhdWx0IHZpYSAkcHN3YW5fZ3cgdGFibGUgJHJ0X251bSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICBmaQoJCWlwIHJvdXRlIGZsdXNoIGNhY2hlIDI+PiR0ZXN0X2xvZwoJCWlmIFsgJD8gLW5lIDAgXTt0aGVuCgkgICAgICAgIGVjaG8gIkVycm9yOiBpcCByb3V0ZSBmbHVzaCBjYWNoZSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICBmaQoJCSAgICAgIAoJCW1zZ196dGVfcm91dGVyCgkKCWVsaWYgWyAiLSR3YW5fbW9kZSIgPT0gIi1hdXRvIiBdOyB0aGVuCgkJcHBwb2VfdXNlcj1gbnYgZ2V0IHBwcG9lX3VzZXJuYW1lYAoJCXBwcG9lX3Bhc3M9YG52IGdldCBwcHBvZV9jY2AKCQl1ZGhjcGNfa2lsbAoJCXBwcG9lX2tpbGwKCQkKCQlpZiBbICItJHdhbl9uYW1lIiA9PSAiLWV0aHdhbiIgXTsgdGhlbgoJCQludiBzZXQgZXRoX2N1cm1vZGU9IiIKCQlmaQkKCQlpZiBbICItJHdhbl9uYW1lIiAhPSAiLXdpZml3YW4iIF07IHRoZW4KCQkJaWZjb25maWcgJHdhbl9pZiBkb3duIDI+PiR0ZXN0X2xvZwoJCSAgICBpZiBbICQ/IC1uZSAwIF07dGhlbgoJICAgICAgICAgICAgZWNobyAiRXJyb3I6IGlmY29uZmlnICR3YW5faWYgZG93biBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICAgICAgZmkKCQkJaWZjb25maWcgJHdhbl9pZiB1cCAyPj4kdGVzdF9sb2cKCQkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkd2FuX2lmIHVwIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgICAgICAgICBmaQoJCWZpCgkJCiAgICAJaWYgWyAiLSR7cHBwb2VfdXNlcn0iID0gIi0iIC1hICItJHtwcHBvZV9wYXNzfSIgPSAiLSIgXTt0aGVuCgkJICAgIGVjaG8gImF1dG8gd2FuX21vZGU6IHBwcG9lX3VzZXIgaXMgJHtwcHBvZV91c2VyfSwgcHBwb2VfcGFzcyBpcyAke3BwcG9lX3Bhc3N9LCBzbyBzdGFydCBkaGNwIGNsaWVudC4gIiA+PiAkdGVzdF9sb2cKCQkJdWRoY3BjIC1pICR3YW5faWYgLXMgJHBhdGhfc2gvdWRoY3BjLnNoICYKCQllbHNlCgkJCXNoICRwYXRoX3NoL3BwcG9lX2RhaWwuc2ggY29ubmVjdAkKCQlmaQoJCQoJZWxpZiBbICItJHdhbl9tb2RlIiA9PSAiLWRoY3AiIF07IHRoZW4KCQl1ZGhjcGNfa2lsbAoJCXBwcG9lX2tpbGwKCQkKCQlpZiBbICItJHdhbl9uYW1lIiA9PSAiLXBzd2FuIiBdOyB0aGVuCgkJICAgIGlmY29uZmlnICR3YW5faWYgYXJwIDI+PiR0ZXN0X2xvZwoJCQlpZiBbICQ/IC1uZSAwIF07dGhlbgoJICAgICAgICAgICAgZWNobyAiRXJyb3I6IGlmY29uZmlnICR3YW5faWYgYXJwIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgICAgICAgICBmaQoJCWZpCgkJCgkJaWYgWyAiLSR3YW5fbmFtZSIgPT0gIi1ldGh3YW4iIF07IHRoZW4KCQkJbnYgc2V0IGV0aF9jdXJtb2RlPSJkaGNwIgoJCWZpCQoJCQoJCWlmIFsgIi0kd2FuX25hbWUiICE9ICItd2lmaXdhbiIgXTsgdGhlbgoJCQlpZmNvbmZpZyAkd2FuX2lmIGRvd24gMj4+JHRlc3RfbG9nCgkJCWlmIFsgJD8gLW5lIDAgXTt0aGVuCgkgICAgICAgICAgICBlY2hvICJFcnJvcjogaWZjb25maWcgJHdhbl9pZiBkb3duIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgICAgICAgICBmaQoJCQlpZmNvbmZpZyAkd2FuX2lmIHVwIDI+PiR0ZXN0X2xvZwoJCQlpZiBbICQ/IC1uZSAwIF07dGhlbgoJICAgICAgICAgICAgZWNobyAiRXJyb3I6IGlmY29uZmlnICR3YW5faWYgdXAgZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICAgICAgICAgIGZpCgkJZmkKCQl1ZGhjcGMgLWkgJHdhbl9pZiAtcyAkcGF0aF9zaC91ZGhjcGMuc2ggJgkJCgkKCWVsaWYgWyAiLSR3YW5fbW9kZSIgPT0gIi1wcHBvZSIgXTsgdGhlbgoJCXVkaGNwY19raWxsCgkJcHBwb2Vfa2lsbAoJCQoJCWlmIFsgIi0kd2FuX25hbWUiID09ICItZXRod2FuIiBdOyB0aGVuCgkJCW52IHNldCBldGhfY3VybW9kZT0icHBwb2UiCgkJZmkJCgkJCgkJaWYgWyAiLSR3YW5fbmFtZSIgIT0gIi13aWZpd2FuIiBdOyB0aGVuCgkJCWlmY29uZmlnICR3YW5faWYgZG93biAyPj4kdGVzdF9sb2cKCQkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkd2FuX2lmIGRvd24gZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICAgICAgICAgIGZpCgkJCWlmY29uZmlnICR3YW5faWYgdXAgMj4+JHRlc3RfbG9nCgkJCWlmIFsgJD8gLW5lIDAgXTt0aGVuCgkgICAgICAgICAgICBlY2hvICJFcnJvcjogaWZjb25maWcgJHdhbl9pZiB1cCBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICAgICAgZmkKCQlmaQoJCXNoICRwYXRoX3NoL3BwcG9lX2RhaWwuc2ggY29ubmVjdAkKCWZpCgkKfQoKZGVsX2RlZmF1bHRfd2FuKCkKewoJZGVmYXVsdF93YW5fbmFtZT1gbnYgZ2V0IGRlZmF1bHRfd2FuX25hbWVgCglpZiBbICIkMSIgPT0gIiRkZWZhdWx0X3dhbl9uYW1lIiBdOyB0aGVuCgkJbnYgc2V0IGRlZmF1bHRfd2FuX25hbWU9IiIKCQludiBzZXQgZGVmYXVsdF93YW5fcmVsPSIiCglmaQp9CgpsaW5rZG93bigpCnsKCXdhbl9uYW1lPSQxCglnZXRfd2FuX2lmICQxICQyCgoJdWRoY3BjX2tpbGwKCXBwcG9lX2tpbGwKCQoJI2lmIFsgIi0kY19pZCIgPT0gIi0wIiAtbyAiLSRjX2lkIiA9PSAiLSRkZWZfY2lkIiBdOyB0aGVuCgkJI2VjaG8gMCA+IC9wcm9jL3N5cy9uZXQvaXB2NC9pcF9mb3J3YXJkCgkjZmkKCQoJaWZjb25maWcgJHdhbl9pZiAwLjAuMC4wIDI+PiR0ZXN0X2xvZwoJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICBlY2hvICJFcnJvcjogaWZjb25maWcgJHdhbl9pZiAwLjAuMC4wIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgZmkKCWlmIFsgIiR3YW5fbmFtZSIgPT0gIndpZml3YW4iIF07IHRoZW4KCQllY2hvICR3YW5faWYgPiAvcHJvYy9uZXQvZGV2X2Rvd24KCWVsc2UKCQlpZmNvbmZpZyAkd2FuX2lmIGRvd24gMj4+JHRlc3RfbG9nCgkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgZWNobyAiRXJyb3I6IGlmY29uZmlnICR3YW5faWYgZG93biBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICBmaQoJZmkKCXdhbl9pcD1gbnYgZ2V0ICR3YW5faWYiX2lwImAKCXdhbl9ndz1gbnYgZ2V0ICR3YW5faWYiX2d3ImAKCQoJcm91dGUgZGVsIGRlZmF1bHQgZ3cgJHdhbl9ndyBkZXYgJHdhbl9pZiAKCSNpZiBbICQ/IC1uZSAwIF07dGhlbgoJIyAgICBlY2hvICJFcnJvcjogcm91dGUgZGVsIGRlZmF1bHQgZ3cgJHdhbl9ndyBkZXYgJHdhbl9pZiBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICNmaQoJCQoJI2RlbCBwb2xpY3kgcm91dGVyCgl3YW5fcHJpPWBudiBnZXQgJDEiX3ByaW9yaXR5ImAKCXJ0X251bT1gZXhwciAkd2FuX3ByaSBcKiAxMCArICRjX2lkYAoJaXAgcnVsZSBkZWwgZnJvbSAkd2FuX2lwIHRhYmxlICRydF9udW0gCgkjaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSMgICAgZWNobyAiRXJyb3I6IGlwIHJ1bGUgZGVsIGZyb20gJHdhbl9pcCB0YWJsZSAkcnRfbnVtIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgI2ZpCglpcCByb3V0ZSBkZWwgZGVmYXVsdCB2aWEgJHdhbl9ndyB0YWJsZSAkcnRfbnVtIAoJI2lmIFsgJD8gLW5lIDAgXTt0aGVuCgkjICAgIGVjaG8gIkVycm9yOiBpcCByb3V0ZSBkZWwgZGVmYXVsdCB2aWEgJHdhbl9ndyB0YWJsZSAkcnRfbnVtIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgI2ZpCgkKCSN3YW5faXBhZGTQ6NKqysrF5AoJaWYgWyAiJHdhbl9pZiIgPT0gIiRkZWZ3YW5faWYiIF07IHRoZW4KCQludiBzZXQgd2FuX2lwYWRkcj0iIgoJZmkKCW52IHNldCAkd2FuX2lmIl9pcCI9MC4wLjAuMAoJbnYgc2V0ICR3YW5faWYiX25tIj0wLjAuMC4wCgludiBzZXQgJHdhbl9pZiJfZ3ciPTAuMC4wLjAKCW52IHNldCAkd2FuX2lmIl9wcmlkbnMiPTAuMC4wLjAKCW52IHNldCAkd2FuX2lmIl9zZWNkbnMiPTAuMC4wLjAKCXBkcF90eXBlPWBudiBnZXQgInBkcF9hY3RfdHlwZSIkZGVmX2NpZGAKCWlmIFsgIiQyIiA9PSAiJGRlZl9jaWQiIC1hICItJHBkcF90eXBlIiAhPSAiLUlQdjR2NiIgXTsgdGhlbgoJCW52IHNldCBkZWZhdWx0X2NpZD0iIgoJZmkKCWRlbF9kZWZhdWx0X3dhbiAkd2FuX2lmIAoJbXNnX3p0ZV9yb3V0ZXIgCgp9CgplY2hvICJJbmZvOiB3YW5faXB2NC5zaCAkMSAkMiAkMyBzdGFydCIgPj4gJHRlc3RfbG9nCmlmIFsgIiQxIiA9PSAibGlua3VwIiBdOyB0aGVuCglsaW5rdXAgJDIgJDMKCQplbGlmIFsgIiQxIiA9PSAibGlua2Rvd24iIF07IHRoZW4KCWlmIFsgIi0kMiIgPT0gIi1wc3dhbiIgXTsgdGhlbgoJCXRjX3RiZi5zaCBkb3duICRkZWZfY2lkCglmaQoJbGlua2Rvd24gJDIgJDMJCmZp