# cnk_section_tree 0.3.3 # Section Tree # Christian Nowak # http://www.cnowak.de # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTY6ImNua19zZWN0aW9uX3RyZWUiO3M6NjoiYXV0aG9yIjtzOjE1OiJDaHJpc3RpYW4gTm93YWsiO3M6MTA6ImF1dGhvcl91cmkiO3M6MjA6Imh0dHA6Ly93d3cuY25vd2FrLmRlIjtzOjc6InZlcnNpb24iO3M6NToiMC4zLjMiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjEyOiJTZWN0aW9uIFRyZWUiO3M6NDoiaGVscCI7czowOiIiO3M6NDoiY29kZSI7czoyNDcwMjoiaWYoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKSANCnsNCglhZGRfcHJpdnMoJ2Nua19zZWN0aW9uX3RyZWUnLCcxLDInKTsgLy8gVE9ETzogcHJpdnMgY2hlY2tlbg0KCXJlZ2lzdGVyX3RhYignZXh0ZW5zaW9ucycsICdjbmtfc2VjdGlvbl90cmVlJywgInNlY3Rpb24gdHJlZSIpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdjbmtfc2VjdGlvbl90cmVlJywgJ2Nua19zZWN0aW9uX3RyZWUnKTsNCglyZWdpc3Rlcl9jYWxsYmFjaygnY25rX3NlY3Rpb25fbGlzdCcsICdzZWN0aW9uJywgJycpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdjbmtfYXJ0aWNsZV92aWV3JywgJ2FydGljbGUnLCAnJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ2Nua19zZWN0aW9uX2NyZWF0ZScsICdzZWN0aW9uJywgJ3NlY3Rpb25fY3JlYXRlJyk7DQovLyAgcmVnaXN0ZXJfY2FsbGJhY2soJ2Nua19zZWN0aW9uX2RlbGV0ZScsICdzZWN0aW9uJywgJ3NlY3Rpb25fZGVsZXRlJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ2Nua19zZWN0aW9uX3NhdmUnLCAnc2VjdGlvbicsICdzZWN0aW9uX3NhdmUnKTsNCg0KCSRjbmtfdHJlZSA9IE5VTEw7DQoJJGNua19hcnRpY2xlX2NvdW50X29uID0gRkFMU0U7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlUQUc6IHNlY3Rpb24gbGlzdA0KLy8NCi8vICBQQVJBTUVURVJTOg0KLy8NCi8vCSAgfCphY3RpdmVfc2VjdGlvbl9hcnRpY2xlcyogDQovLyAgICAgfCB3aGV0aGVyIHRvIHNob3cgYXJ0aWNsZSBsaXN0IG9mIGFjdGl2ZSBzZWN0aW9uIG9yIG5vdCB8KHkgOyBkZWZhdWx0OiBuKXwNCi8vICAgIHwqYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9vcmRlcl9ieSogDQovLyAgICAgfCBvcmRlciBhcnRpY2xlIGxpc3QgYnkgfChwb3N0ZWQgOyBsYXN0bW9kIDsgdGl0bGUgOyBkZWZhdWx0OiBwb3N0ZWQpfA0KLy8gICAgfCphY3RpdmVfc2VjdGlvbl9hcnRpY2xlX29yZGVyKiANCi8vICAgICB8IG9yZGVyIGFydGljbGUgbGlzdCBkaXJlY3Rpb24gfChhc2MgOyBkZXNjIDsgZGVmYXVsdDogYXNjKXwNCi8vICAgIHwqYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9tYXhfY291bnQqDQovLyAgICAgfCBsaW1pdCBhcnRpY2xlcyBjb3VudCB8KGludGVnZXIgOyBkZWZhdWx0OiA1KXwNCi8vICAgIHwqZXhjbHVkZV9zZWN0aW9ucyoNCi8vICAgICB8IGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNlY3Rpb24gbmFtZXMgdGhhdCBzaG91bGQgbm90IHNob3cgdXAgaW4gdGhlIHRyZWUuDQovLyAgICAgICBzdWJzZWN0aW9ucyBvZiBleGNsdWRlZCBzZWN0aW9ucyB3b24ndCBzaG93IHVwIGVpdGhlciB8KG5hbWUxLG5hbWUyIDsgZGVmYXVsdDogTlVMTCl8DQovLyAgICB8KnN0YXJ0X3NlY3Rpb24qDQovLyAgICAgfCBuYW1lIG9mIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgZXhjbHVzaXZlbHkuIHN1YnNlY3Rpb25zIHdpbGwgYWxzbyBiZSByZW5kZXJlZCB8KHN0cmluZyA7IGRlZmF1bHQ6IE5VTEwpfA0KLy8gICAgfCpjc3NfaWQqDQovLyAgICAgfCBpZCBwcm9wZXJ0eSBvZiB0aGUgdG9wLWxldmVsIHVsIHRhZyB8KHN0cmluZyA7IGRlZmF1bHQ6IE5VTEwpfA0KLy8gICAgfCpjc3NfYWN0aXZlX2NsYXNzKg0KLy8gICAgIHwgY2xhc3MgcHJvcGVydHkgb2YgYWN0aXZlIHNlY3Rpb24gZWxlbWVudCB8KHN0cmluZyA7IGRlZmF1bHQ6IGNua19hY3RpdmVfc2VjdGlvbil8DQovLyAgICB8KnNob3dfYXJ0aWNsZV9jb3VudCoNCi8vICAgICB8IHNob3cgbnVtYmVyIG9mIGFydGljbGVzIHdpdGggc3RhdHVzIDQgZm9yIGV2ZXJ5IHNlY3Rpb24uIHwoeSA7IGRlZmF1bHQgbil8DQovLyAgICB8KnNob3dfYXJ0aWNsZV9jb3VudF9ib3R0b20qDQovLyAgICAgfCBzaG93IG51bWJlciBvZiBhcnRpY2xlcyB3aXRoIHN0YXR1cyA0IG9ubHkgZm9yIGJvdHRvbSBzZWN0aW9ucyB8KHkgOyBkZWZhdWx0IG4pfA0KLy8gICAgfCpleGNsdWRlX2VtcHRpZXMqDQovLyAgICAgfCBkb24ndCBzaG93IHNlY3Rpb25zLCB3aGljaCBoYXZlIG5vIGFydGljbGVzIHdpdGggc3RhdHVzIDQgYXNzaWduZWQgdG8gaXQgfCh5IDsgZGVmYXVsdCBuKXwNCi8vICAgIHwqdXJsX3BhdHRlcm5fc2VjdGlvbioNCi8vICAgICB8IGRlZmluZXMgdGhlIGhyZWYgYXR0cmlidXRlIG9mIHNlY3Rpb24gbGlua3MuICVzIGlzIHRoZSBzZWN0aW9uIG5hbWUsICV1IGlzIHNpdGVfcm9vdF91cmwgfChzdHJpbmcgOyBkZWZhdWx0IE5VTEwpfA0KLy8gICAgfCp1cmxfcGF0dGVybl9hcnRpY2xlKg0KLy8gICAgIHwgZGVmaW5lcyB0aGUgaHJlZiBhdHRyaWJ1dGUgb2YgYXJ0aWNsZSBsaW5rcy4gDQovLyAgICAgICAlcyBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgc2VjdGlvbiBuYW1lLCAlYSBpcyBhcnRpY2xlIGlkLCAldCBpcyBhcnRpY2xlIHVybF90aXRsZSwgJXUgaXMgc2l0ZV9yb290X3VybCB8KHN0cmluZyA7IGRlZmF1bHQgTlVMTCl8DQovLwkgIHwqc2VjdGlvbl9hcHBlbmRfaG10bCoNCi8vCSAgIHwgYXBwZW5kcyB5b3VyIGlucHV0IHN0cmluZyByaWdodCBhZnRlciB0aGUgY2xvc2luZyBhIHRhZyBhbmQgYmVmb3JlIHRoZSBjbG9zaW5nIGxpIHRhZyBvZiBhIHNlY3Rpb24gDQovLwkJIHNhbWUgcGxhY2Vob2xkZXIgYXMgdXJsX3BhdHRlcm5fc2VjdGlvbiB8KHN0cmluZyA7IGRlZmF1bHQgTlVMTCl8DQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gY25rX3NlY19saXN0KCRhdHRzKSANCnsNCglnbG9iYWwgJGNua190cmVlLCAkcHJlZnMsICRzLCAkaXNfYXJ0aWNsZV9saXN0LCAkaWQ7DQoNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQknYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZXMnID0+ICd5JywNCgkJJ2FjdGl2ZV9zZWN0aW9uX2FydGljbGVfb3JkZXJfYnknID0+ICdwb3N0ZWQnLA0KCQknYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9vcmRlcicgPT4gJ2FzYycsDQoJCSdhY3RpdmVfc2VjdGlvbl9hcnRpY2xlX21heF9jb3VudCcgPT4gNSwNCgkJJ2V4Y2x1ZGVfc2VjdGlvbnMnID0+ICcnLA0KCQknc3RhcnRfc2VjdGlvbicgPT4gJycsDQoJCSdjc3NfaWQnID0+ICcnLA0KCQknY3NzX2FjdGl2ZV9jbGFzcycgPT4gJ2Nua19hY3RpdmVfc2VjdGlvbicsDQoJCSdzaG93X2FydGljbGVfY291bnQnID0+ICduJywNCgkJJ3Nob3dfYXJ0aWNsZV9jb3VudF9ib3R0b20nID0+ICduJywNCgkJJ2V4Y2x1ZGVfZW1wdGllcycgPT4gJ24nLA0KCQkndXJsX3BhdHRlcm5fc2VjdGlvbicgPT4gJycsDQoJCSd1cmxfcGF0dGVybl9hcnRpY2xlJyA9PiAnJywNCgkJJ3NlY3Rpb25fYXBwZW5kX2h0bWwnID0+ICcnDQoJKSwgJGF0dHMpKTsNCgkNCgkkc2VjdGlvbl9leGNsdWRlcyA9IGV4cGxvZGUoJywnLCBzdHJ0b2xvd2VyKCRleGNsdWRlX3NlY3Rpb25zKSk7IC8vVE9ETzogc3RyaXAgd2hpdGVzcGFjZXMNCgkNCgkvLyBjcmVhdGUgYXJ0aWNsZSBvcmRlciBjbGF1c2UNCglzd2l0Y2goc3RydG9sb3dlcigkYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9vcmRlcl9ieSkpIHsNCgkJY2FzZSAncG9zdGVkJzoNCgkJCSRhY3RpdmVfc2VjdGlvbl9hcnRpY2xlX29yZGVyX2J5ID0gJ1Bvc3RlZCc7DQoJCQlicmVhazsNCgkJY2FzZSAnbGFzdG1vZCc6DQoJCQkkYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9vcmRlcl9ieSA9ICdMYXN0TW9kJzsNCgkJCWJyZWFrOw0KCQljYXNlICd0aXRsZSc6DQoJCQkkYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9vcmRlcl9ieSA9ICdUaXRsZSc7DQoJCQlicmVhazsNCgkJZGVmYXVsdDoNCgkJCSRhY3RpdmVfc2VjdGlvbl9hcnRpY2xlX29yZGVyX2J5ID0gJ1Bvc3RlZCc7DQoJfQ0KDQoJJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfb3JkZXJfY2xhdXNlID0gKHN0cnRvbG93ZXIoJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfb3JkZXIpID09ICdhc2MnKT8nYXNjJzonZGVzYyc7DQoNCgkkYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9tYXhfY291bnQgPSBpbnR2YWwoJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfbWF4X2NvdW50KT9pbnR2YWwoJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfbWF4X2NvdW50KTo1Ow0KDQoJJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfb3JkZXJfY2xhdXNlID0gIiBvcmRlciBieSAiLiRhY3RpdmVfc2VjdGlvbl9hcnRpY2xlX29yZGVyX2J5LiIgIi4kYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9vcmRlci4iIGxpbWl0IDAsICIuJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfbWF4X2NvdW50Ow0KDQoJaWYgKCRzaG93X2FydGljbGVfY291bnQgPT0gJ3knIHx8ICRzaG93X2FydGljbGVfY291bnRfYm90dG9tID09ICd5JyB8fCAkZXhjbHVkZV9lbXB0aWVzID09ICd5JykgDQoJew0KCQkkY291bnRfYXJ0aWNsZXMgPSAneSc7DQoJfQ0KCWVsc2UNCgl7DQoJCSRjb3VudF9hcnRpY2xlcyA9ICduJzsNCgl9DQoJICANCgljbmtfc3RfZ2V0X3RyZWUoJHN0YXJ0X3NlY3Rpb24sICRjb3VudF9hcnRpY2xlcyk7DQoJDQoJLy9lY2hvICI8Q05PX0RFQlVHPjxwcmU+Ii5wcmludF9yKCRjbmtfdHJlZSkuIjwvcHJlPjwvQ05PX0RFQlVHPiI7DQoNCgkkb3Blbl9saXN0ID0gYXJyYXkoKTsNCg0KCSRyZXMgPSAnPGRpdiBpZD0iY25rX3NlY19saXN0Ij48dWwgaWQ9ImNua19zZWNfdHJlZSIgJy4odHJpbSgkY3NzX2lkKT8naWQ9IicuJGNzc19pZC4nIic6JycpLic+JzsNCgkNCgkkc3RyaXBfbGV2ZWwgPSAtMTsNCg0KCWZvciAoJGk9MDsgJGkgPCBjb3VudCgkY25rX3RyZWUpOyAkaSsrKSANCgl7DQoJCWlmICgkY25rX3RyZWVbJGldWyduYW1lJ10gIT0gJ2RlZmF1bHQnKSANCgkJew0KCQkJZXh0cmFjdCgkY25rX3RyZWVbJGldKTsNCg0KCQkJLy8gY2xvc2Ugb3BlbiBsaXN0cw0KDQoJCQl3aGlsZSAoY291bnQoJG9wZW5fbGlzdCkgJiYgJG9wZW5fbGlzdFtjb3VudCgkb3Blbl9saXN0KS0xXSA+PSAkbGV2ZWwpIA0KCQkJew0KCQkJCWFycmF5X3BvcCgkb3Blbl9saXN0KTsNCg0KCQkJCSRyZXMgLj0gJzwvdWw+JzsNCg0KCQkJCWlmICgkYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZXMgPT0gJ3knICYmIHN0cnRvbG93ZXIoJHMpID09IHN0cnRvbG93ZXIoJG5hbWUpICYmICRpc19hcnRpY2xlX2xpc3QgPT09IHRydWUpIA0KCQkJCXsNCgkJCQkJJHJlcyAuPSBjbmtfYWN0aXZlX2FydGljbGVfbGlzdCgkbmFtZSwgJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfb3JkZXJfY2xhdXNlLCAkdXJsX3BhdHRlcm5fYXJ0aWNsZSk7DQoJCQkJfQ0KDQoJCQkJJHJlcyAuPSAnPC9saT4nOw0KCQkJfQ0KCQkJDQoJCQlpZiAoJHN0cmlwX2xldmVsID4gLTEgJiYgJGxldmVsIDw9ICRzdHJpcF9sZXZlbCkNCgkJCXsNCgkJCQkvLyB3aGVuIHdlIGxlYXZlIHRoZSBleGNsdWRlZCBjaGlsZHJlbiBhcnJheSwgd2UgY2FuIHJlbmRlciBzZWN0aW9ucyBhZ2Fpbg0KCQkJCSRzdHJpcF9sZXZlbCA9IC0xOw0KCQkJfQ0KCQkJDQoJCQlpZiAoJHN0cmlwX2xldmVsID4gLTEgfHwgKCRleGNsdWRlX2VtcHRpZXMgPT0gJ3knICYmICRjaGlsZHJlbiA9PSAwICYmICRhcnRpY2xlX2NvdW50ID09IDApIHx8IChpc19hcnJheSgkc2VjdGlvbl9leGNsdWRlcykgJiYgaW5fYXJyYXkoc3RydG9sb3dlcigkbmFtZSksICRzZWN0aW9uX2V4Y2x1ZGVzKSkpDQoJCQl7DQoJCQkJLy8gaWYgc2VjdGlvbiBpcyBleGNsdWRlZCwgc3Vic2VjdGlvbnMgc2hvdWxkIG5vdCBzaG93IHVwIGVpdGhlcg0KCQkJCS8vZWNobyAiPENOT19ERUJVRz4iLiRuYW1lLicgLSAnLiRjaGlsZHJlbi4nIC0gJy4kYXJ0aWNsZV9jb3VudC4iPC9DTk9fREVCVUc+IjsNCgkJCQkNCgkJCQlpZiAoJHN0cmlwX2xldmVsIDwgMCkgJHN0cmlwX2xldmVsID0gJGxldmVsOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRzZWFyY2ggPSBhcnJheSgnJXMnLCAnJXUnKTsNCgkJCQkkcmVwbGFjZW1lbnQgPSBhcnJheSgkbmFtZSwgJHByZWZzWydzaXRldXJsJ10pOw0KCQkJCQkNCgkJCQlpZiAoc3RydG9sb3dlcigkcykgIT0gc3RydG9sb3dlcigkbmFtZSkpIA0KCQkJCXsNCgkJCQkJLy8gVE9ETzogbW92ZSBoYXJkY29kZWQgaHJlZiB1cmwgdG8gcGF0dGVybiAoaW4gcmVzcGVjdCBvZiBmcmllbmRseSB1cmxzKQ0KCQkJCQ0KCQkJCQkkcmVzIC49ICc8bGk+PGEgaHJlZj0iJy4odHJpbSgkdXJsX3BhdHRlcm5fc2VjdGlvbik/c3RyX3JlcGxhY2UoJHNlYXJjaCwgJHJlcGxhY2VtZW50LCAkdXJsX3BhdHRlcm5fc2VjdGlvbik6J2h0dHA6Ly8nLiRwcmVmc1snc2l0ZXVybCddLicvJy4kbmFtZSkuJyI+Jy5nVHh0KCR0aXRsZSk7DQoJCQkJCQ0KCQkJCQlpZiAoJGFydGljbGVfY291bnQgPiAwICYmICgkc2hvd19hcnRpY2xlX2NvdW50ID09ICd5JyB8fCAoJHNob3dfYXJ0aWNsZV9jb3VudF9ib3R0b20gPT0gJ3knICYmICRjaGlsZHJlbiA9PSAwKSkpICRyZXMgLj0gJyAoJy4kYXJ0aWNsZV9jb3VudC4nKSc7IC8vVE9ETzogc3BlY2lmeSB3cmFwIHRhZyBmb3IgY291bnQNCgkJCQkJDQoJCQkJCSRyZXMgLj0gJzwvYT4nLnN0cl9yZXBsYWNlKCRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHNlY3Rpb25fYXBwZW5kX2h0bWwpOw0KCQkJCX0gDQoJCQkJZWxzZSANCgkJCQl7DQoJCQkJCSRyZXMgLj0gJzxsaSBjbGFzcz0iJy4kY3NzX2FjdGl2ZV9jbGFzcy4nIj4nLmdUeHQoJHRpdGxlKS5zdHJfcmVwbGFjZSgkc2VhcmNoLCAkcmVwbGFjZW1lbnQsICRzZWN0aW9uX2FwcGVuZF9odG1sKTsNCgkJCQl9DQoNCgkJCQlpZiAoJGNoaWxkcmVuID4gMCkgDQoJCQkJew0KCQkJCQkkcmVzIC49ICc8dWw+JzsNCg0KCQkJCQlhcnJheV9wdXNoKCRvcGVuX2xpc3QsICRsZXZlbCk7DQoNCgkJCQl9IA0KCQkJCWVsc2UgDQoJCQkJew0KCQkJCQlpZiAoJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVzID09ICd5JyAmJiBzdHJ0b2xvd2VyKCRzKSA9PSBzdHJ0b2xvd2VyKCRuYW1lKSAmJiAkaXNfYXJ0aWNsZV9saXN0ID09PSB0cnVlKSANCgkJCQkJew0KCQkJCQkJJHJlcyAuPSBjbmtfYWN0aXZlX2FydGljbGVfbGlzdCgkbmFtZSwgJGFjdGl2ZV9zZWN0aW9uX2FydGljbGVfb3JkZXJfY2xhdXNlLCAkdXJsX3BhdHRlcm5fYXJ0aWNsZSk7DQoJCQkJCX0NCg0KCQkJCQkkcmVzIC49ICc8L2xpPic7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoJLy8gY2xvc2UgcmVtYWluaW5nIG9wZW4gbGlzdHMNCg0KCXdoaWxlIChjb3VudCgkb3Blbl9saXN0KSAmJiAkb3Blbl9saXN0W2NvdW50KCRvcGVuX2xpc3QpLTFdID49ICRsZXZlbCkgDQoJew0KCQlhcnJheV9wb3AoJG9wZW5fbGlzdCk7DQoNCgkJJHJlcyAuPSAnPC91bD4nOw0KDQoJCWlmICgkYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZXMgPT0gJ3knICYmIHN0cnRvbG93ZXIoJHMpID09IHN0cnRvbG93ZXIoJG5hbWUpICYmICRpc19hcnRpY2xlX2xpc3QgPT09IHRydWUpIA0KCQl7DQoJCQkkcmVzIC49IGNua19hY3RpdmVfYXJ0aWNsZV9saXN0KCRuYW1lLCAkYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZV9vcmRlcl9jbGF1c2UsICR1cmxfcGF0dGVybl9hcnRpY2xlKTsNCgkJfQ0KDQoJCSRyZXMgLj0gJzwvbGk+JzsNCgl9DQoNCglyZXR1cm4gJHJlcy4nPC91bD48L2Rpdj4nOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGdlbmVyYXRlcyBhcnRpY2xlIGxpc3QgZm9yIGFjdGl2ZSBzZWN0aW9uDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gY25rX2FjdGl2ZV9hcnRpY2xlX2xpc3QoJHNlY3Rpb25fbmFtZSwgJG9yZGVyLCAkdXJsX3BhdHRlcm5fYXJ0aWNsZSkgDQp7DQoJZ2xvYmFsICRwcmVmcywgJGlkOw0KDQoJLy9lY2hvICI8Q05PX0RFQlVHPiIuJGlkLiI8L0NOT19ERUJVRz4iOw0KDQoJJHJlcyA9ICc8dWw+JzsNCgkNCgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoImlkLCB0aXRsZSwgdXJsX3RpdGxlIiwidGV4dHBhdHRlcm4iLCAibG93ZXIoc2VjdGlvbik9JyIuc3RydG9sb3dlcigkc2VjdGlvbl9uYW1lKS4iJyBhbmQgc3RhdHVzID0gNCAiLiRvcmRlcik7DQoNCgl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIA0KCXsNCg0KCQkvLyAgICBpZiAoJGlkICE9IHN0cnRvbG93ZXIoJG5hbWUpKSB7DQoJCQ0KCQkkc2VhcmNoID0gYXJyYXkoJyVzJywgJyVhJywgJyV0JywgJyV1Jyk7DQoJCSRyZXBsYWNlbWVudCA9IGFycmF5KCRzZWN0aW9uX25hbWUsICRhWydpZCddLCAkYVsndXJsX3RpdGxlJ10sICRwcmVmc1snc2l0ZXVybCddKTsNCg0KCQkkcmVzIC49ICc8bGk+PGEgaHJlZj0iJy4odHJpbSgkdXJsX3BhdHRlcm5fYXJ0aWNsZSk/c3RyX3JlcGxhY2UoJHNlYXJjaCwgJHJlcGxhY2VtZW50LCAkdXJsX3BhdHRlcm5fYXJ0aWNsZSk6J2h0dHA6Ly8nLiRwcmVmc1snc2l0ZXVybCddLicvJy4kc2VjdGlvbl9uYW1lLicvJy4kYVsnaWQnXS4nLycuJGFbJ3VybF90aXRsZSddKS4nIj4nLmdUeHQoJGFbJ3RpdGxlJ10pLic8L2E+PC9saT4nOyAvLyBUT0RPOiBtb3ZlIGhhcmRjb2RlZCB1cmwgdG8gcGF0dGVybg0KDQoJCS8vICAgIH0gZWxzZSB7DQoNCgkJLy8gICAgICAkcmVzIC49ICc8bGkgaWQ9IicuJGFjdGl2ZV9pZC4nIj4nLmdUeHQoJHRpdGxlKTsNCg0KCQkvLyAgICB9DQoNCgl9DQoNCglyZXR1cm4gJHJlcy4nPC91bD4nOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IHNlbmQgaG9va3MgdG8gY29ycmVjdCBmdW5jdGlvbnMNCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc2VjdGlvbl90cmVlKCRldmVudCwgJHN0ZXApIA0Kew0KCWlmKCEkc3RlcCBvciAhaW5fYXJyYXkoJHN0ZXAsIGFycmF5KCAnY25rX3N0X2luc3RhbGwnLCAnY25rX3N0X2RlaW5zdGFsbCcsICdjbmtfc2VjdGlvbl9kZWxldGUnKSkpIHsNCg0KCQljbmtfc3RfY29uZmlndXJlKCk7DQoNCgl9IA0KCWVsc2UgDQoJew0KCQkkc3RlcCgpOw0KCX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vCUZ1bmN0aW9uOiBzYXZlcyBzZWN0aW9ucw0KLy8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIGNua19zZWN0aW9uX3NhdmUoKSANCnsNCglnbG9iYWwgJGNua190cmVlOw0KDQoJLy8gUmVhZCB0aGUgYnVmZmVyIGFuZCBlbmQgYnVmZmVyaW5nDQoJb2JfZW5kX2NsZWFuKCk7DQoNCgkvLyBSZXN0YXJ0IGJ1ZmZlcmluZywgdG8gbWFrZSBzdXJlLCB0aGF0IG90aGVyIHBsdWdpbnMgY2FuIHVzZSB0aGUgYnVmZmVyIHRvbw0KCW9iX3N0YXJ0KCk7DQoNCgkvLyBnZXQgc2VjdGlvbg0KCSRvbGRfbmFtZSA9IHBzKCdvbGRfbmFtZScpOw0KCSRuYW1lID0gc2FuaXRpemVGb3JVcmwocHMoJ25hbWUnKSk7DQoJJHBhcmVudCA9IHBzKCdwYXJlbnQnKTsNCgkkb2xkX3BhcmVudCA9IHBzKCdvbGRfcGFyZW50Jyk7DQoJJGNoaWxkcmVuID0gcHMoJ2NoaWxkcmVuJyk7DQoNCgkvLyBpZiBuYW1lIHdhcyBjaGFuZ2VkIHRvIGFuIGV4aXN0aW5nIG9uZSwgZG9uJ3QgdXBkYXRlLCBvdGhlcndpc2UgZml4IHRyZWUNCg0KCWlmICgkb2xkX25hbWUgJiYgKHN0cnRvbG93ZXIoJG5hbWUpICE9IHN0cnRvbG93ZXIoJG9sZF9uYW1lKSkpIA0KCXsNCgkJJGNoayA9IGZldGNoKCduYW1lJywndHhwX3NlY3Rpb24nLCduYW1lJywkb2xkX25hbWUpOw0KDQoJCWlmICgkY2hrKSANCgkJew0KCQkJJG1lc3NhZ2UgPSBnVHh0KCdzZWN0aW9uX25hbWVfYWxyZWFkeV9leGlzdHMnLCBhcnJheSgne25hbWV9JyA9PiAkbmFtZSkpOw0KDQoJCQlzZWNfc2VjdGlvbl9saXN0KCRtZXNzYWdlKTsNCg0KCQkJcmV0dXJuOw0KCQl9IA0KCQllbHNlIA0KCQl7DQoJCQlzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCAicGFyZW50PSciLiRuYW1lLiInIiwgInBhcmVudD0nIi4kb2xkX25hbWUuIiciKTsNCgkJfQ0KCX0NCg0KCS8vIGlmIHBhcmVudCBjaGFuZ2VkLCB1cGRhdGUNCg0KCWlmICgkcGFyZW50ICE9ICRvbGRfcGFyZW50KSANCgl7DQoJCS8vIGlmIG5vZGUgaGFzIGNoaWxkcmVuIG1vdmUgY29tcGxldGUgc3VidHJlZQ0KDQoJCWlmICgkY2hpbGRyZW4gPiAwKSANCgkJew0KCQkJY25rX3N0X21vdmVfc3VidHJlZSgkbmFtZSwgJHBhcmVudCk7DQoJCX0gDQoJCWVsc2UgDQoJCXsNCgkJCWNua19zdF9tb3ZlX25vZGUoJG5hbWUsICRwYXJlbnQpOw0KCQl9DQoJfQ0KDQoJJG1lc3NhZ2UgPSBnVHh0KCdzZWN0aW9uX3VwZGF0ZWQnLCBhcnJheSgne25hbWV9JyA9PiAkbmFtZSkpOw0KDQoJJGNua190cmVlID0gTlVMTDsNCg0KCXNlY19zZWN0aW9uX2xpc3QoJG1lc3NhZ2UpOw0KDQoJY25rX3NlY3Rpb25fbGlzdCgpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGRlbGV0ZXMgc2VjdGlvbiAoYW5kIGFsc28gYWxsIHN1YnNlY3Rpb25zKQ0KLy8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIGNua19zZWN0aW9uX2RlbGV0ZSgpIA0Kew0KCSRuYW1lID0gcHMoJ25hbWUnKTsNCg0KCSRuID0gc2FmZV9yb3coIioiLCAidHhwX3NlY3Rpb24iLCAibmFtZT0nIi4kbmFtZS4iJyIpOw0KDQoJLy8gZGVsZXRlIGFsbCBzdWJub2RlcyBvciBhZGQgdGhlbSB0byB0aGUgcGFyZW50IG9mIHRoZSBkZWxldGVkIG5vZGU/DQoNCglpZiAoKCRuWydyZ3QnXSAtICRuWydsZnQnXSkgPiAxKSANCgl7DQoJCS8vIGFzayB3aGVyZSB0byBhcHBlbmQgc3VidHJlZSBvciBpZiBpdCBzaG91bGQgYmUgZGVsZXRlZA0KDQoJCS8vcGFnZXRvcChnVHh0KCdzZWN0aW9ucycpKTsNCg0KCQkvLyBmb3Igbm93IGp1c3QgZGVsZXRlIHdob2xlIHN1YnRyZWUNCg0KCQkkd2lkdGggPSAkblsncmd0J10gLSAkblsnbGZ0J10gKyAxOw0KDQoJCXNhZmVfZGVsZXRlKCd0eHBfc2VjdGlvbicsICJsZnQgYmV0d2VlbiAiLiRuWydsZnQnXS4iIEFORCAiLiRuWydyZ3QnXSk7DQoNCgkJc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwicmd0PXJndC0iLiR3aWR0aCwgInJndCA+ICIuJG5bJ3JndCddKTsNCg0KCQlzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCJsZnQ9bGZ0LSIuJHdpZHRoLCAibGZ0ID4gIi4kblsncmd0J10pOw0KCX0gDQoJZWxzZSANCgl7DQoJCXNhZmVfZGVsZXRlKCd0eHBfc2VjdGlvbicsICJuYW1lID0gJyIuJG5hbWUuIiciKTsNCg0KCQlzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCJyZ3Q9cmd0LTIiLCAicmd0ID4gIi4kblsncmd0J10pOw0KDQoJCXNhZmVfdXBkYXRlKCJ0eHBfc2VjdGlvbiIsImxmdD1sZnQtMiIsICJsZnQgPiAiLiRuWydyZ3QnXSk7DQoJfQ0KDQoJJG1lc3NhZ2UgPSBnVHh0KCdzZWN0aW9uX2RlbGV0ZWQnLCBhcnJheSgne25hbWV9JyA9PiAkbmFtZSkpOw0KDQoJaGVhZGVyKCJMb2NhdGlvbjogP2V2ZW50PXNlY3Rpb24mbWVzc2FnZT0iLnVybGVuY29kZSgkbWVzc2FnZSkpOyBleGl0Ow0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGNyZWF0ZXMgbmV3IHNlY3Rpb24NCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc2VjdGlvbl9jcmVhdGUoKSANCnsNCgkvLyBnZXQgbmFtZQ0KCSRuYW1lID0gc2FuaXRpemVGb3JVcmwocHMoJ25hbWUnKSk7DQoNCgkvLyBpZiBuZXcgc2VjdGlvbiB3YXMgY3JlYXRlZCwgYWRkIHRvIG5vZGUgdG8gZGVmYXVsdA0KICANCgkkY2hrID0gc2FmZV9maWVsZCgnbmFtZScsJ3R4cF9zZWN0aW9uJywibmFtZT0nIi4kbmFtZS4iJyBhbmQgbGZ0IGlzIG51bGwiKTsNCg0KCWlmICgkY2hrKSBjbmtfc3RfYWRkX25vZGUoJG5hbWUsICdkZWZhdWx0Jyk7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlGdW5jdGlvbjogYWRkcyBhZGRpdGlvbmFsIGZvcm0gZWxlbWVudHMgdG8gc2VjdGlvbiB2aWV3DQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gY25rX3NlY3Rpb25fbGlzdCgpIA0Kew0KCS8vIFJlYWQgdGhlIGJ1ZmZlciBhbmQgZW5kIGJ1ZmZlcmluZw0KCSRidWZmZXIgPSBvYl9nZXRfY2xlYW4oKTsNCg0KCS8vIFJlc3RhcnQgYnVmZmVyaW5nLCB0byBtYWtlIHN1cmUsIHRoYXQgb3RoZXIgcGx1Z2lucyBjYW4gdXNlIHRoZSBidWZmZXIgdG9vDQoJb2Jfc3RhcnQoKTsNCgkNCgkvLyBhZGQgdHJlZSBqYXZhc2NyaXB0IGFuZCBjc3MNCgkkc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCgkJCQkJZnVuY3Rpb24gY25rX21vdmVfdXAoc2VjdGlvbikNCgkJCQkJew0KCQkJCQkJLy8gbm90aGluZw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlmdW5jdGlvbiBjbmtfbW92ZV9kb3duKHNlY3Rpb24pDQoJCQkJCXsNCgkJCQkJCS8vIG5vdGhpbmcNCgkJCQkJfQ0KCQkJCTwvc2NyaXB0Pg0KCQkJCTxzdHlsZT4NCgkJCQkJI2Nua19zZWNfbGlzdCBsaQ0KCQkJCQl7DQoJCQkJCQltYXJnaW46IDRweCAwcHggNHB4IDEwcHggIWltcG9ydGFudDsNCgkJCQkJfQ0KCQkJCTwvc3R5bGU+JzsNCgkJCQkNCgkkYnVmZmVyID0gc3RyX3JlcGxhY2UoJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpxdWVyeS5qcyI+PC9zY3JpcHQ+JywgJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpxdWVyeS5qcyI+PC9zY3JpcHQ+Jy4kc2NyaXB0LCAkYnVmZmVyKTsNCgkNCgkvLyBhZGQgc2VjdGlvbiB0cmVlIG5hdmlnYXRpb24gYWJvdmUgZm9ybQ0KCSRtb3ZlX2xpbmtzID0gJyc7IC8vJyA8YSBocmVmPSJqYXZhc2NyaXB0OmNua19tb3ZlX3VwKFwnJXNcJyk7Ij51PC9hPiA8YSBocmVmPSJqYXZhc2NyaXB0OmNua19tb3ZlX2Rvd24oXCclc1wnKTsiPmQ8L2E+JzsNCgkkbmF2aWdhdGlvbiA9IGNua19zZWNfbGlzdChhcnJheSgnYWN0aXZlX3NlY3Rpb25fYXJ0aWNsZXMnID0+ICduJywgJ3VybF9wYXR0ZXJuX3NlY3Rpb24nID0+ICcjc2VjdGlvbi0lcycsICdzZWN0aW9uX2FwcGVuZF9odG1sJyA9PiAkbW92ZV9saW5rcykpOw0KCSRidWZmZXIgPSBzdHJfcmVwbGFjZSgnPC9oMT4nLCAnPC9oMT4nLiRuYXZpZ2F0aW9uLCAkYnVmZmVyKTsNCg0KCS8vIHJlcGxhY2UgZGVsZXRlIGV2ZW50DQoJJGJ1ZmZlciA9IHN0cl9yZXBsYWNlKCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJldmVudCIgdmFsdWU9InNlY3Rpb24iIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3RlcCIgdmFsdWU9InNlY3Rpb25fZGVsZXRlIiAvPicsICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJldmVudCIgdmFsdWU9ImNua19zZWN0aW9uX3RyZWUiIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3RlcCIgdmFsdWU9ImNua19zZWN0aW9uX2RlbGV0ZSIgLz4nLCAkYnVmZmVyKTsNCg0KCS8vIGluc2VydCBzZWN0aW9uIHRyZWUgY29kZQ0KDQoJJHBhdHRlcm4gPSAnIyg8dHI+PHRkIGNvbHNwYW49IjIiIGNsYXNzPSJub2xpbmUiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IiIgdmFsdWU9Ii4qIiBjbGFzcz0ic21hbGxlcmJveCIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJldmVudCIgdmFsdWU9InNlY3Rpb24iIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3RlcCIgdmFsdWU9InNlY3Rpb25fc2F2ZSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvbGRfbmFtZSIgdmFsdWU9IiguKikiIC8+KSNtJzsNCg0KCSRpbnNlcnQgPSAnY25rX3N0X2Ryb3Bkb3duJzsNCgkkYnVmZmVyID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCRwYXR0ZXJuLCAkaW5zZXJ0LCAkYnVmZmVyKTsNCg0KCWVjaG8gJGJ1ZmZlcjsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vCUZ1bmN0aW9uOiByZXBsYWNlcyBzZWN0aW9uIGRyb3Bkb3duIHdpdGggc2VjdGlvbiB0cmVlDQovLwkJCSAgaW4gd3JpdGUgdGFiDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gY25rX2FydGljbGVfdmlldygpIA0Kew0KDQoJLy8gUmVhZCB0aGUgYnVmZmVyIGFuZCBlbmQgYnVmZmVyaW5nDQoJJGJ1ZmZlciA9IG9iX2dldF9jbGVhbigpOw0KDQoJLy8gUmVzdGFydCBidWZmZXJpbmcsIHRvIG1ha2Ugc3VyZSwgdGhhdCBvdGhlciBwbHVnaW5zIGNhbiB1c2UgdGhlIGJ1ZmZlciB0b28NCglvYl9zdGFydCgpOw0KDQoJLy8gcmVwbGFjZSBzZWN0aW9uIGRyb3Bkb3duDQoNCgkkcGF0dGVybiA9ICcjKDxzZWxlY3QgaWQ9InNlY3Rpb24iIG5hbWU9IlNlY3Rpb24iLio8b3B0aW9uIHZhbHVlPSIoLiopIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPi4qPC9zZWxlY3Q+KSNzJzsNCg0KCSRpbnNlcnQgPSAnY25rX3N0X2Ryb3Bkb3duX2FydGljbGUnOw0KCSRidWZmZXIgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHBhdHRlcm4sICRpbnNlcnQsICRidWZmZXIpOw0KDQoJZWNobyAkYnVmZmVyOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGNua19hcnRpY2xlX3ZpZXcoKSBoZWxwZXIgZnVuY3Rpb24NCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc3RfZHJvcGRvd25fYXJ0aWNsZSgkbWF0Y2hlcykgDQp7DQoJZ2xvYmFsICRjbmtfdHJlZTsNCiAgDQoJY25rX3N0X2dldF90cmVlKCk7DQoNCgkkcmVzID0gJzxzZWxlY3QgaWQ9InNlY3Rpb24iIG5hbWU9IlNlY3Rpb24iIGNsYXNzPSJsaXN0Ij4nOw0KDQoJZm9yICgkaT0wOyAkaSA8IGNvdW50KCRjbmtfdHJlZSk7ICRpKyspIA0KCXsNCgkJZXh0cmFjdCgkY25rX3RyZWVbJGldKTsNCg0KCQkkcmVzIC49ICc8b3B0aW9uIHZhbHVlPSInLiRuYW1lLiciICcuKChzdHJ0b2xvd2VyKCRuYW1lKT09c3RydG9sb3dlcigkbWF0Y2hlc1syXSkpPydzZWxlY3RlZD0ic2VsZWN0ZWQiJzonJykuJz4nLmNua19zdF9zcGFjZXMoJGxldmVsKS5nVHh0KCR0aXRsZSkuJzwvb3B0aW9uPic7DQoJfQ0KDQoJJHJlcyAuPSAnPC9zZWxlY3Q+JzsNCg0KCXJldHVybiAkcmVzOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGNua19zZWN0aW9uX2xpc3QoKSBoZWxwZXIgZnVuY3Rpb24NCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc3RfZHJvcGRvd24oJG1hdGNoZXMpIA0Kew0KCWdsb2JhbCAkY25rX3RyZWU7DQogIA0KCWNua19zdF9nZXRfdHJlZSgpOw0KDQoJJG5vZGUgPSBjbmtfc3RfZ2V0X25vZGUoJG1hdGNoZXNbMl0pOw0KCSRzZWNfcGFyZW50ID0gJG5vZGVbJ3BhcmVudCddOw0KCSRzdG9wX3JndCA9IDA7DQoNCgkkcmVzID0gJzx0cj48dGQgY2xhc3M9Im5vbGluZSIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyI+UGFyZW50OiA8L3RkPgk8dGQgY2xhc3M9Im5vbGluZSI+PHNlbGVjdCBuYW1lPSJwYXJlbnQiIGNsYXNzPSJsaXN0Ij4nOw0KDQoJZm9yICgkaT0wOyAkaSA8IGNvdW50KCRjbmtfdHJlZSk7ICRpKyspIA0KCXsNCgkJZXh0cmFjdCgkY25rX3RyZWVbJGldKTsNCg0KCQkvLyBkb24ndCBzaG93IHRoZSBub2RlIGl0c2VsZiBvciBpdCdzIGNoaWxkcmVuDQoNCgkJaWYgKCRzdG9wX3JndCA8ICRyZ3QpIA0KCQl7DQoJCQlpZiAoJG5hbWUgIT0gJG1hdGNoZXNbMl0pIA0KCQkJew0KCQkJCSRyZXMgLj0gJzxvcHRpb24gdmFsdWU9IicuJG5hbWUuJyIgJy4oKCRuYW1lPT0kc2VjX3BhcmVudCk/J3NlbGVjdGVkPSJzZWxlY3RlZCInOicnKS4nPicuY25rX3N0X3NwYWNlcygkbGV2ZWwpLmdUeHQoJHRpdGxlKS4nPC9vcHRpb24+JzsNCgkJCX0gDQoJCQllbHNlIA0KCQkJew0KCQkJCSRzdG9wX3JndCA9ICRyZ3Q7DQoJCQl9DQoJCX0NCgl9DQoNCgkkcmVzIC49ICc8L3NlbGVjdD48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaGlsZHJlbiIgdmFsdWU9IicuJG5vZGVbJ2NoaWxkcmVuJ10uJyIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvbGRfcGFyZW50IiB2YWx1ZT0iJy4kc2VjX3BhcmVudC4nIiAvPjwvdGQ+PC90cj4nOw0KCSRyZXMgLj0gJzx0cj48dGQgY2xhc3M9Im5vbGluZSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vbGluZSI+PGEgaHJlZj0iI2Nua19zZWNfbGlzdCI+XiBnbyB1cCB0byB0cmVlPC9hPjwvdGQ+PC90cj4nLiRtYXRjaGVzWzFdOw0KCQ0KCXJldHVybiAkcmVzOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGludGVybmFsIG5lc3RlZCBzZXQgZnVuY3Rpb24gdG8gZ2V0IGEgbm9kZQ0KLy8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIGNua19zdF9nZXRfbm9kZSgkY2hpbGRfbmFtZSkgDQp7DQoJZ2xvYmFsICRjbmtfdHJlZTsNCiAgDQoJY25rX3N0X2dldF90cmVlKCk7DQoNCgkkaSA9IDA7DQoNCglmb3IoJGk9MDsgJGkgPCBjb3VudCgkY25rX3RyZWUpOyAkaSsrKSANCgl7DQoJCWlmICgkY25rX3RyZWVbJGldWyduYW1lJ10gPT0gJGNoaWxkX25hbWUpIHJldHVybiAkY25rX3RyZWVbJGldOw0KCX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vCUZ1bmN0aW9uOiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdG8gaW5kZW50IHN0cmluZ3MNCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc3Rfc3BhY2VzKCRjb3VudCkgDQp7DQoJJHN0ciA9ICcnOw0KDQoJZm9yICgkaT0wOyAkaSA8ICRjb3VudDsgJGkrKykgJHN0ciAuPSAnLSc7DQoNCglyZXR1cm4gJHN0ci4nICc7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlGdW5jdGlvbjogaW50ZXJuYWwgbmVzdGVkIHNldCBmdW5jdGlvbiB0byBnZXQgdGhlIHRyZWUNCi8vCQkJICBvciBhIHN1YnRyZWUgc3BlY2lmaWVkIGJ5IHBhcmVudF9ub2RlDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gY25rX3N0X2dldF90cmVlKCRwYXJlbnRfbm9kZSA9ICcnLCAkY291bnRfYXJ0aWNsZXMgPSAnbicpIA0Kew0KCWdsb2JhbCAkY25rX3RyZWU7DQoNCglpZiAoJGNua190cmVlID09PSBOVUxMIHx8ICRwYXJlbnRfbm9kZSAhPSAkY25rX3RyZWVbMF1bJ25hbWUnXSB8fCAoIWlzc2V0KCRjbmtfdHJlZVswXVsnYXJ0aWNsZV9jb3VudCddKSAmJiAkY291bnRfYXJ0aWNsZXMgPT0gJ3knKSkgDQoJew0KCQkkY25rX3RyZWUgPSBhcnJheSgpOw0KCQkNCgkJJHNxbF9maWVsZHMgPSAicy5uYW1lLCBzLnRpdGxlLCBzLnBhcmVudCwgcy5sZXZlbCwgcy5sZnQsIHMucmd0IjsNCgkJDQoJCWlmICgkcGFyZW50X25vZGUgIT0gJycpDQoJCXsNCgkJCSRzcWxfdGFibGVzID0gc2FmZV9wZngoJ3R4cF9zZWN0aW9uJykuIiBzIExFRlQgSk9JTiAiLnNhZmVfcGZ4KCd0eHBfc2VjdGlvbicpLiIgcCBPTiBzLmxmdCA+PSBwLmxmdCBBTkQgcy5yZ3QgPD0gcC5yZ3QiOw0KCQkJJHNxbF93aGVyZSA9ICJsb3dlcihwLm5hbWUpID0gJyIuc3RydG9sb3dlcigkcGFyZW50X25vZGUpLiInIEdST1VQIEJZIHMubGZ0IGFzYyI7IC8vIFRPRE86IGVzY2FwZSBwYXJlbnQgbm9kZQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHNxbF90YWJsZXMgPSBzYWZlX3BmeCgndHhwX3NlY3Rpb24nKS4iIHMiOw0KCQkJJHNxbF93aGVyZSA9ICIxPTEgR1JPVVAgQlkgcy5sZnQgYXNjIjsNCgkJfQ0KCQkNCgkJaWYgKCRjb3VudF9hcnRpY2xlcyA9PSAneScpDQoJCXsJDQoJCQkkc3FsX2ZpZWxkcyAuPSAiLCBjb3VudChhLnNlY3Rpb24pIEFTIGFydGljbGVfY291bnQiOw0KCQkJJHNxbF90YWJsZXMgLj0gIiBMRUZUIEpPSU4gdHhwNDA1dGV4dHBhdHRlcm4gYSBPTiBhLnNlY3Rpb24gPSBzLm5hbWUgQU5EIGEuc3RhdHVzID0gNCI7DQoJCQkkc3FsX3doZXJlID0gJHNxbF93aGVyZS4iLCBzLm5hbWUiOw0KCQl9DQoNCgkJJHJzID0gc2FmZV9xdWVyeSgiU0VMRUNUICIuJHNxbF9maWVsZHMuIiBGUk9NICIuJHNxbF90YWJsZXMuIiBXSEVSRSAiLiRzcWxfd2hlcmUpOw0KDQoJCXdoaWxlICgkYSA9IG5leHRSb3coJHJzKSkgDQoJCXsNCgkJCSRhWydjaGlsZHJlbiddID0gKCRhWydyZ3QnXSAtICRhWydsZnQnXSAtIDEpIC8gMjsNCgkJCQ0KCQkJaWYgKCFpc3NldCgkYVsnYXJ0aWNsZV9jb3VudCddKSkgJGFbJ2FydGljbGVfY291bnQnXSA9IDA7DQoJCQkNCgkJCWFycmF5X3B1c2goJGNua190cmVlLCAkYSk7DQoJCX0NCgl9DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlGdW5jdGlvbjogUHJpbnRzIG91dCBjb25maWd1cmF0aW9uIG1lbnUNCi8vDQovLyAgVE9ETzogTWFrZSBwcmV0dHkhDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gY25rX3N0X2NvbmZpZ3VyZSgkbWVzc2FnZT0nJykgDQp7DQoJcGFnZXRvcCgnU2VjdGlvbiBUcmVlIENvbmZpZ3VyYXRpb24nLCAkbWVzc2FnZSk7DQoNCgllY2hvICI8YSBocmVmPVwiP2V2ZW50PWNua19zZWN0aW9uX3RyZWUmIzM4O3N0ZXA9Y25rX3N0X2luc3RhbGxcIj5JbnN0YWxsPC9hPiI7DQoJZWNobyAiPGJyIC8+PGJyIC8+IjsNCgllY2hvICI8YSBocmVmPVwiP2V2ZW50PWNua19zZWN0aW9uX3RyZWUmIzM4O3N0ZXA9Y25rX3N0X2RlaW5zdGFsbFwiPkRlaW5zdGFsbDwvYT4iOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGluc3RhbGwNCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc3RfaW5zdGFsbCgkbWVzc2FnZT0nJykgDQp7DQoJcGFnZXRvcCgnU2VjdGlvbiBUcmVlIENvbmZpZ3VyYXRpb24nLCAkbWVzc2FnZSk7DQoNCgkkcmVzID0gdHJ1ZTsNCg0KCS8vIGFkZCBjb2x1bW5zDQoNCglpZiAoIXNhZmVfcXVlcnkoIkFMVEVSIFRBQkxFICIuc2FmZV9wZngoInR4cF9zZWN0aW9uIikuIiBBREQgcGFyZW50IFZBUkNIQVIoMTI4KTsiKSkgJHJlcyA9IGZhbHNlOw0KCWlmICghc2FmZV9xdWVyeSgiQUxURVIgVEFCTEUgIi5zYWZlX3BmeCgidHhwX3NlY3Rpb24iKS4iIEFERCBsZXZlbCBUSU5ZSU5UOyIpKSAkcmVzID0gZmFsc2U7DQoJaWYgKCFzYWZlX3F1ZXJ5KCJBTFRFUiBUQUJMRSAiLnNhZmVfcGZ4KCJ0eHBfc2VjdGlvbiIpLiIgQUREIGxmdCBJTlQoMTIpOyIpKSAkcmVzID0gZmFsc2U7DQoJaWYgKCFzYWZlX3F1ZXJ5KCJBTFRFUiBUQUJMRSAiLnNhZmVfcGZ4KCJ0eHBfc2VjdGlvbiIpLiIgQUREIHJndCBJTlQoMTIpOyIpKSAkcmVzID0gZmFsc2U7DQoNCgkvLyB1cGRhdGUgcm9vdA0KDQoJaWYgKCFzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCJsZXZlbD0wLCBsZnQ9MSwgcmd0PTIiLCAibmFtZT0nZGVmYXVsdCciKSkgJHJlcyA9IGZhbHNlOw0KDQoJLy8gZ2V0IG90aGVyIHNlY3Rpb25zIGFuZCBhZGQgdG8gcm9vdA0KDQoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCJuYW1lIiwidHhwX3NlY3Rpb24iLCAibGZ0IGlzIG51bGwiKTsNCg0KCXdoaWxlICgkYSA9IG5leHRSb3coJHJzKSkgDQoJew0KCQlleHRyYWN0KCRhKTsNCg0KCQlpZiAoIWNua19zdF9hZGRfbm9kZSgkbmFtZSwgJ2RlZmF1bHQnKSkgJHJlcyA9IGZhbHNlOw0KCX0NCg0KCWlmICgkcmVzKSANCgl7DQoJCWVjaG8gIkluc3RhbGxhdGlvbiB3YXMgc3VjY2Vzc2Z1bCEiOw0KCX0gDQoJZWxzZSANCgl7DQoJCWVjaG8gIkluc3RhbGxhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwhIjsNCgl9DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlGdW5jdGlvbjogZGVpbnN0YWxsDQovLw0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gY25rX3N0X2RlaW5zdGFsbCgkbWVzc2FnZT0nJykgDQp7DQoJcGFnZXRvcCgnU2VjdGlvbiBUcmVlIENvbmZpZ3VyYXRpb24nLCAkbWVzc2FnZSk7DQoNCgkkcmVzID0gdHJ1ZTsNCg0KCS8vIHJlbW92ZSBjb2x1bW5zDQoNCglpZiAoIXNhZmVfcXVlcnkoIkFMVEVSIFRBQkxFICIuc2FmZV9wZngoInR4cF9zZWN0aW9uIikuIiBEUk9QIENPTFVNTiBwYXJlbnQ7IikpICRyZXMgPSBmYWxzZTsNCglpZiAoIXNhZmVfcXVlcnkoIkFMVEVSIFRBQkxFICIuc2FmZV9wZngoInR4cF9zZWN0aW9uIikuIiBEUk9QIENPTFVNTiBsZXZlbDsiKSkgJHJlcyA9IGZhbHNlOw0KCWlmICghc2FmZV9xdWVyeSgiQUxURVIgVEFCTEUgIi5zYWZlX3BmeCgidHhwX3NlY3Rpb24iKS4iIERST1AgQ09MVU1OIGxmdDsiKSkgJHJlcyA9IGZhbHNlOw0KCWlmICghc2FmZV9xdWVyeSgiQUxURVIgVEFCTEUgIi5zYWZlX3BmeCgidHhwX3NlY3Rpb24iKS4iIERST1AgQ09MVU1OIHJndDsiKSkgJHJlcyA9IGZhbHNlOw0KDQoJaWYgKCRyZXMpIA0KCXsNCgkJZWNobyAiRGVpbnN0YWxsYXRpb24gd2FzIHN1Y2Nlc3NmdWwhIjsNCgl9IA0KCWVsc2UgDQoJew0KCQllY2hvICJEZWluc3RhbGxhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwhIjsNCgl9DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlGdW5jdGlvbjogaW50ZXJuYWwgbmVzdGVkIHNldCBmdW5jdGlvbiB0byBhZGQgYSBub2RlDQovLwkJCSAgY3VycmVudGx5IHJlZGlyZWN0cyB0byBjbmtfc3RfYWRkX25vZGVfZW5kKCkNCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc3RfYWRkX25vZGUoJG5vZGVfbmFtZSwgJHBhcmVudF9uYW1lKSANCnsNCglyZXR1cm4gY25rX3N0X2FkZF9ub2RlX2VuZCgkbm9kZV9uYW1lLCAkcGFyZW50X25hbWUpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGludGVybmFsIG5lc3RlZCBzZXQgZnVuY3Rpb24gdG8gYWRkIGEgbm9kZSBhdA0KLy8JCQkgIGxhc3QgcG9zaXRpb24gd2l0aGluIHRoZSBwYXJlbnQgbm9kZQ0KLy8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIGNua19zdF9hZGRfbm9kZV9lbmQoJG5vZGVfbmFtZSwgJHBhcmVudF9uYW1lKSANCnsNCgkvLyBnZXQgcGFyZW50IHJndA0KDQoJJHAgPSBzYWZlX3JvdygibGV2ZWwsIHJndCIsICJ0eHBfc2VjdGlvbiIsICJuYW1lPSciLiRwYXJlbnRfbmFtZS4iJyIpOw0KDQoJLy8gdXBkYXRlIHBhcmVudHMNCg0KCWlmICghc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwicmd0PXJndCsyIiwgInJndCA+PSAiLiRwWydyZ3QnXSkpIHJldHVybiBmYWxzZTsNCg0KCWlmICghc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwibGZ0PWxmdCsyIiwgImxmdCA+ICIuJHBbJ3JndCddKSkgcmV0dXJuIGZhbHNlOw0KDQoJLy8gdXBkYXRlIG5vZGUNCg0KCWlmICghc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwicGFyZW50PSciLiRwYXJlbnRfbmFtZS4iJywgbGV2ZWw9Ii4kcFsnbGV2ZWwnXS4iKzEsIGxmdD0iLiRwWydyZ3QnXS4iLCByZ3Q9Ii4kcFsncmd0J10uIisxIiwgIm5hbWUgPSAnIi4kbm9kZV9uYW1lLiInIikpIHJldHVybiBmYWxzZTsNCg0KCXJldHVybiB0cnVlOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8JRnVuY3Rpb246IGludGVybmFsIG5lc3RlZCBzZXQgZnVuY3Rpb24gdG8gbW92ZSBhIG5vZGUNCi8vDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBjbmtfc3RfbW92ZV9ub2RlKCRub2RlX25hbWUsICRwYXJlbnRfbmFtZSkgDQp7DQoNCgkkbiA9IHNhZmVfcm93KCJyZ3QiLCAidHhwX3NlY3Rpb24iLCAibmFtZT0nIi4kbm9kZV9uYW1lLiInIik7DQoNCglpZiAoY25rX3N0X2FkZF9ub2RlX2VuZCgkbm9kZV9uYW1lLCAkcGFyZW50X25hbWUpID09PSB0cnVlKSANCgl7DQoJCWlmICghc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwicmd0PXJndC0yIiwgInJndCA+ICIuJG5bJ3JndCddKSkgcmV0dXJuIGZhbHNlOw0KDQoJCWlmICghc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwibGZ0PWxmdC0yIiwgImxmdCA+ICIuJG5bJ3JndCddKSkgcmV0dXJuIGZhbHNlOw0KDQoJCXJldHVybiB0cnVlOw0KCX0gDQoJZWxzZSANCgl7DQoJCXJldHVybiBmYWxzZTsNCgl9DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vDQovLwlGdW5jdGlvbjogaW50ZXJuYWwgbmVzdGVkIHNldCBmdW5jdGlvbiB0byBtb3ZlIGEgc3VidHJlZQ0KLy8NCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIGNua19zdF9tb3ZlX3N1YnRyZWUoJG5vZGVfbmFtZSwgJHBhcmVudF9uYW1lKSANCnsNCgkkbiA9IHNhZmVfcm93KCJyZ3QsIGxmdCwgbGV2ZWwiLCAidHhwX3NlY3Rpb24iLCAibmFtZT0nIi4kbm9kZV9uYW1lLiInIik7DQoNCgkkcCA9IHNhZmVfcm93KCJyZ3QsIGxmdCwgbGV2ZWwiLCAidHhwX3NlY3Rpb24iLCAibmFtZT0nIi4kcGFyZW50X25hbWUuIiciKTsNCg0KCSR3aWR0aCA9ICRuWydyZ3QnXSAtICRuWydsZnQnXSArIDE7DQoNCgkkbGV2ZWxfZGlmZiA9ICRwWydsZXZlbCddIC0gJG5bJ2xldmVsJ10gKyAxOw0KDQoJJGRpZmYgPSAkcFsncmd0J10gLSAkblsnbGZ0J107DQoNCgkvLyBsZXQncyBmaXJzdCB1cGRhdGUgcGFyZW50IGluZm9ybWF0aW9uIG9mIHRoZSBhbmNob3Igbm9kZQ0KDQoJaWYgKCFzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCJwYXJlbnQ9JyIuJHBhcmVudF9uYW1lLiInIiwgIm5hbWUgPSAnIi4kbm9kZV9uYW1lLiInIikpIHJldHVybiBmYWxzZTsNCg0KCS8vIGNyZWF0ZSBwbGFjZSBmb3Igc3VidHJlZQ0KDQoJaWYgKCFzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCJyZ3Q9cmd0KyIuJHdpZHRoLCAicmd0ID49ICIuJHBbJ3JndCddKSkgcmV0dXJuIGZhbHNlOw0KDQoJaWYgKCFzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCJsZnQ9bGZ0KyIuJHdpZHRoLCAibGZ0ID4gIi4kcFsncmd0J10pKSByZXR1cm4gZmFsc2U7DQoNCglpZiAoJHBbJ2xmdCddIDwgJG5bJ2xmdCddKSANCgl7DQoJCSRuWydsZnQnXSA9ICRuWydsZnQnXSArICR3aWR0aDsNCg0KCQkkblsncmd0J10gPSAkblsncmd0J10gKyAkd2lkdGg7DQoNCgkJJGRpZmYgPSAkZGlmZiAtICR3aWR0aDsNCgl9DQoNCgkvLyBtb3ZlIHN1YnRyZWUNCg0KCWlmICghc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwibGZ0ID0gbGZ0ICsgKCIuJGRpZmYuIiksIHJndCA9IHJndCArICgiLiRkaWZmLiIpLCBsZXZlbD1sZXZlbCsoIi4kbGV2ZWxfZGlmZi4iKSIsICJsZnQgYmV0d2VlbiAiLiRuWydsZnQnXS4iIEFORCAiLiRuWydyZ3QnXSkpIHJldHVybiBmYWxzZTsNCg0KCS8vIGNsb3NlIGhvbGUNCg0KCWlmICghc2FmZV91cGRhdGUoInR4cF9zZWN0aW9uIiwicmd0PXJndC0iLiR3aWR0aCwgInJndCA+ICIuJG5bJ3JndCddKSkgcmV0dXJuIGZhbHNlOw0KDQoJaWYgKCFzYWZlX3VwZGF0ZSgidHhwX3NlY3Rpb24iLCJsZnQ9bGZ0LSIuJHdpZHRoLCAibGZ0ID4gIi4kblsncmd0J10pKSByZXR1cm4gZmFsc2U7DQp9IjtzOjQ6InR5cGUiO3M6MToiMSI7czozOiJtZDUiO3M6MzI6ImM3OTk4MWI0NzJiYTc0MDM3NTRkNTQ0ZjUxNTE4ZjJmIjt9