#include <string>
#include <vector>
#include <iostream>
#include <stdlib.h>
class StringUtilities {
public:
typedef std::vector<std::string> Strings;
static std::string GetEnvVariable(const std::string& var) {
std::string ret;
#ifdef WIN32
char *pValue = NULL;
size_t len;
errno_t err = _dupenv_s(&pValue, &len, var.c_str());
if (!pValue || err) {
return ret;
}
ret = pValue;
free(pValue);
#else
const char* pValue = getenv(var.c_str());
if (pValue) {
ret = pValue;
}
#endif
return ret;
}
static std::string ExpandEnviornmentVariable(const std::string& s) {
std::size_t start = s.find("${");
std::size_t lastEnd = 0;
std::string ret;
while (start != std::string::npos) {
std::size_t end = s.find("}", start + 2);
if (end == std::string::npos) {
break;
}
ret.append(s.substr(lastEnd, start - lastEnd));
ret.append(GetEnvVariable(s.substr(start + 2, end - start - 2)));
lastEnd = end + 1;
start = s.find("${", lastEnd);
}
ret.append(s.substr(lastEnd));
return ret;
}
static Strings Split(const std::string& str, const std::string& delim, bool bCompress = true) {
std::size_t start = 0;
std::size_t found = str.find_first_of(delim, start);
Strings ret;
while (found != std::string::npos) {
if (start < found || bCompress == false) {
ret.push_back(str.substr(start, found - start));
}
start = found + 1;
found = str.find_first_of(delim, start);
}
std::string ins(str.begin() + start, str.end());
if (start < str.length()) {
ret.push_back(str.substr(start));
}
return ret;
}
static std::string Replace(const std::string& str, const std::string& from, const std::string to, int occurence = 0, bool every = false) {
typedef std::string::size_type(std::string::*pFind)(const std::string& str, std::string::size_type pos) const;
pFind find = &std::string::find;
std::size_t start = 0;
int inc = 1, count = 0;
std::string ret = str;
if (occurence < 0)
{
find = &std::string::rfind;
start = str.length();
inc = -1;
occurence *= -1;
}
std::size_t found = ((ret).*(find))(from, start);
while (found != std::string::npos)
{
count++;
if (count == occurence || occurence == 0)
{
ret.replace(found, from.length(), to);
if (occurence != 0 && !every) {
return ret;
}
else if (every) {
count = 0;
std::cout << "count = " << count << std::endl;
}
}
std::cout << "Replacing count = " << count << " start = " << start << " foudn =" << found << std::endl;
start = found + (from.length()*inc);
found = ((ret).*(find))(from, start);
}
return ret;
}
};
int main() {
StringUtilities::Strings test;
std::string str;
str = "|Abcd|${test}:blah|||${path}|bbb|sdf|${pathext}|${TEMP}";
std::cout << "=======" << str << std::endl;
str = StringUtilities::ExpandEnviornmentVariable(str);
std::cout << "=======" << str << std::endl;
test = StringUtilities::Split(str, ";|");
for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
std::cout << *it << std::endl;
}
str = "test";
test = StringUtilities::Split(str, ";");
std::cout << "=======" << str << std::endl;
for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
std::cout << *it << std::endl;
}
str = "";
test = StringUtilities::Split(str, ";");
std::cout << "=======" << str << std::endl;
for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
std::cout << *it << std::endl;
}
str = ":::;;;;;:::::";
test = StringUtilities::Split(str, ";");
std::cout << "=======" << str << std::endl;
for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
std::cout << *it << std::endl;
}
str = "test;;;;";
test = StringUtilities::Split(str, ";");
std::cout << "=======" << str << std::endl;
for (StringUtilities::Strings::iterator it = test.begin(); it != test.end(); it++) {
std::cout << *it << std::endl;
}
str = "|Abcd|${test}:blah|||${test}|bbb|sdf|${test}|${test}";
std::cout << "=======" << StringUtilities::Replace(str, "dddd", "") << std::endl;
std::cout << "ReplaceALL " << StringUtilities::Replace(str, "${test}", "Sanjay") << std::endl;
std::cout << "StringUtilities::Replace 1 " << StringUtilities::Replace(str, "${test}", "Sanjay", 1) << std::endl;
std::cout << "StringUtilities::Replace 2 " << StringUtilities::Replace(str, "${test}", "Sanjay", 2) << std::endl;
std::cout << "StringUtilities::Replace 3 " << StringUtilities::Replace(str, "${test}", "Sanjay", 3) << std::endl;
std::cout << "StringUtilities::Replace 4 " << StringUtilities::Replace(str, "${test}", "Sanjay", 4) << std::endl;
std::cout << "StringUtilities::Replace -1 " << StringUtilities::Replace(str, "${test}", "Sanjay", -1) << std::endl;
std::cout << "StringUtilities::Replace -2 " << StringUtilities::Replace(str, "${test}", "Sanjay", -2) << std::endl;
std::cout << "StringUtilities::Replace -3 " << StringUtilities::Replace(str, "${test}", "Sanjay", -3) << std::endl;
std::cout << "StringUtilities::Replace -4 " << StringUtilities::Replace(str, "${test}", "Sanjay", -4) << std::endl;
std::cout << "StringUtilities::Replace 1 " << StringUtilities::Replace(str, "${test}", "Sanjay", 1, true) << std::endl;
std::cout << "StringUtilities::Replace 2 " << StringUtilities::Replace(str, "${test}", "Sanjay", 2, true) << std::endl;
std::cout << "StringUtilities::Replace 3 " << StringUtilities::Replace(str, "${test}", "Sanjay", 3, true) << std::endl;
std::cout << "StringUtilities::Replace 4 " << StringUtilities::Replace(str, "${test}", "Sanjay", 4, true) << std::endl;
std::cout << "StringUtilities::Replace -1 " << StringUtilities::Replace(str, "${test}", "Sanjay", -1, true) << std::endl;
std::cout << "StringUtilities::Replace -2 " << StringUtilities::Replace(str, "${test}", "Sanjay", -2, true) << std::endl;
std::cout << "StringUtilities::Replace -3 " << StringUtilities::Replace(str, "${test}", "Sanjay", -3, true) << std::endl;
std::cout << "StringUtilities::Replace -4 " << StringUtilities::Replace(str, "${test}", "Sanjay", -4, true) << std::endl;
}
CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGxpYi5oPgpjbGFzcyBTdHJpbmdVdGlsaXRpZXMgewpwdWJsaWM6Cgl0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTdHJpbmdzOwoJc3RhdGljIHN0ZDo6c3RyaW5nIEdldEVudlZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YXIpIHsKCQlzdGQ6OnN0cmluZyByZXQ7CiNpZmRlZiBXSU4zMgoJCWNoYXIgKnBWYWx1ZSA9IE5VTEw7CgkJc2l6ZV90IGxlbjsKCQllcnJub190IGVyciA9IF9kdXBlbnZfcygmcFZhbHVlLCAmbGVuLCB2YXIuY19zdHIoKSk7CgkJaWYgKCFwVmFsdWUgfHwgZXJyKSB7CgkJCXJldHVybiByZXQ7CgkJfQoJCXJldCA9IHBWYWx1ZTsKCQlmcmVlKHBWYWx1ZSk7CiNlbHNlCgkJY29uc3QgY2hhciogcFZhbHVlID0gZ2V0ZW52KHZhci5jX3N0cigpKTsKCQlpZiAocFZhbHVlKSB7CgkJCXJldCA9IHBWYWx1ZTsKCQl9CiNlbmRpZgoJCXJldHVybiByZXQ7Cgl9CglzdGF0aWMgc3RkOjpzdHJpbmcgRXhwYW5kRW52aW9ybm1lbnRWYXJpYWJsZShjb25zdCBzdGQ6OnN0cmluZyYgcykgewoJCXN0ZDo6c2l6ZV90IHN0YXJ0ID0gcy5maW5kKCIkeyIpOwoJCXN0ZDo6c2l6ZV90IGxhc3RFbmQgPSAwOwoJCXN0ZDo6c3RyaW5nIHJldDsKCQl3aGlsZSAoc3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKCQkJc3RkOjpzaXplX3QgZW5kID0gcy5maW5kKCJ9Iiwgc3RhcnQgKyAyKTsKCQkJaWYgKGVuZCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0LmFwcGVuZChzLnN1YnN0cihsYXN0RW5kLCBzdGFydCAtIGxhc3RFbmQpKTsKCQkJcmV0LmFwcGVuZChHZXRFbnZWYXJpYWJsZShzLnN1YnN0cihzdGFydCArIDIsIGVuZCAtIHN0YXJ0IC0gMikpKTsKCQkJbGFzdEVuZCA9IGVuZCArIDE7CgkJCXN0YXJ0ID0gcy5maW5kKCIkeyIsIGxhc3RFbmQpOwoJCX0KCQlyZXQuYXBwZW5kKHMuc3Vic3RyKGxhc3RFbmQpKTsKCQlyZXR1cm4gcmV0OwoJfQoJc3RhdGljIFN0cmluZ3MgU3BsaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIGRlbGltLCBib29sIGJDb21wcmVzcyA9IHRydWUpIHsKCQlzdGQ6OnNpemVfdCBzdGFydCA9IDA7CgkJc3RkOjpzaXplX3QgZm91bmQgPSBzdHIuZmluZF9maXJzdF9vZihkZWxpbSwgc3RhcnQpOwoJCVN0cmluZ3MgcmV0OwoJCXdoaWxlIChmb3VuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewoJCQlpZiAoc3RhcnQgPCBmb3VuZCB8fCBiQ29tcHJlc3MgPT0gZmFsc2UpIHsKCQkJCXJldC5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydCwgZm91bmQgLSBzdGFydCkpOwoJCQl9CgkJCXN0YXJ0ID0gZm91bmQgKyAxOwoJCQlmb3VuZCA9IHN0ci5maW5kX2ZpcnN0X29mKGRlbGltLCBzdGFydCk7CgkJfQoJCXN0ZDo6c3RyaW5nIGlucyhzdHIuYmVnaW4oKSArIHN0YXJ0LCBzdHIuZW5kKCkpOwoJCWlmIChzdGFydCA8IHN0ci5sZW5ndGgoKSkgewoJCQlyZXQucHVzaF9iYWNrKHN0ci5zdWJzdHIoc3RhcnQpKTsKCQl9CgkJcmV0dXJuIHJldDsKCX0KCXN0YXRpYyBzdGQ6OnN0cmluZyBSZXBsYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tLCBjb25zdCBzdGQ6OnN0cmluZyB0bywgaW50IG9jY3VyZW5jZSA9IDAsIGJvb2wgZXZlcnkgPSBmYWxzZSkgewoJCXR5cGVkZWYgc3RkOjpzdHJpbmc6OnNpemVfdHlwZShzdGQ6OnN0cmluZzo6KnBGaW5kKShjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcykgY29uc3Q7CgkJcEZpbmQgZmluZCA9ICZzdGQ6OnN0cmluZzo6ZmluZDsKCQlzdGQ6OnNpemVfdCBzdGFydCA9IDA7CgkJaW50IGluYyA9IDEsIGNvdW50ID0gMDsKCQlzdGQ6OnN0cmluZyByZXQgPSBzdHI7CgkJaWYgKG9jY3VyZW5jZSA8IDApCgkJewoJCQlmaW5kID0gJnN0ZDo6c3RyaW5nOjpyZmluZDsKCQkJc3RhcnQgPSBzdHIubGVuZ3RoKCk7CgkJCWluYyA9IC0xOwoJCQlvY2N1cmVuY2UgKj0gLTE7CgkJfQoJCXN0ZDo6c2l6ZV90IGZvdW5kID0gKChyZXQpLiooZmluZCkpKGZyb20sIHN0YXJ0KTsKCQl3aGlsZSAoZm91bmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCgkJewoJCQljb3VudCsrOwoJCQlpZiAoY291bnQgPT0gb2NjdXJlbmNlIHx8IG9jY3VyZW5jZSA9PSAwKQoJCQl7CgkJCQlyZXQucmVwbGFjZShmb3VuZCwgZnJvbS5sZW5ndGgoKSwgdG8pOwoJCQkJaWYgKG9jY3VyZW5jZSAhPSAwICYmICFldmVyeSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgkJCQllbHNlIGlmIChldmVyeSkgewoJCQkJCWNvdW50ID0gMDsKCQkJCQlzdGQ6OmNvdXQgPDwgImNvdW50ID0gIiA8PCBjb3VudCA8PCBzdGQ6OmVuZGw7CgkJCQl9CgkJCX0KCQkJCXN0ZDo6Y291dCA8PCAiUmVwbGFjaW5nIGNvdW50ID0gIiA8PCBjb3VudCA8PCAiIHN0YXJ0ID0gIiA8PCBzdGFydCA8PCAiIGZvdWRuID0iIDw8IGZvdW5kIDw8IHN0ZDo6ZW5kbDsKCQkJc3RhcnQgPSBmb3VuZCArIChmcm9tLmxlbmd0aCgpKmluYyk7CgkJCWZvdW5kID0gKChyZXQpLiooZmluZCkpKGZyb20sIHN0YXJ0KTsKCQl9CgkJcmV0dXJuIHJldDsKCX0KfTsKaW50IG1haW4oKSB7CglTdHJpbmdVdGlsaXRpZXM6OlN0cmluZ3MgdGVzdDsKCXN0ZDo6c3RyaW5nIHN0cjsKCXN0ciA9ICJ8QWJjZHwke3Rlc3R9OmJsYWh8fHwke3BhdGh9fGJiYnxzZGZ8JHtwYXRoZXh0fXwke1RFTVB9IjsKCXN0ZDo6Y291dCA8PCAiPT09PT09PSIgPDwgc3RyIDw8IHN0ZDo6ZW5kbDsKCXN0ciA9IFN0cmluZ1V0aWxpdGllczo6RXhwYW5kRW52aW9ybm1lbnRWYXJpYWJsZShzdHIpOwoJc3RkOjpjb3V0IDw8ICI9PT09PT09IiA8PCBzdHIgPDwgc3RkOjplbmRsOwoJdGVzdCA9IFN0cmluZ1V0aWxpdGllczo6U3BsaXQoc3RyLCAiO3wiKTsKCWZvciAoU3RyaW5nVXRpbGl0aWVzOjpTdHJpbmdzOjppdGVyYXRvciBpdCA9IHRlc3QuYmVnaW4oKTsgaXQgIT0gdGVzdC5lbmQoKTsgaXQrKykgewoJCXN0ZDo6Y291dCA8PCAqaXQgPDwgc3RkOjplbmRsOwoJfQoJc3RyID0gInRlc3QiOwoJdGVzdCA9IFN0cmluZ1V0aWxpdGllczo6U3BsaXQoc3RyLCAiOyIpOwoJc3RkOjpjb3V0IDw8ICI9PT09PT09IiA8PCBzdHIgPDwgc3RkOjplbmRsOwoJZm9yIChTdHJpbmdVdGlsaXRpZXM6OlN0cmluZ3M6Oml0ZXJhdG9yIGl0ID0gdGVzdC5iZWdpbigpOyBpdCAhPSB0ZXN0LmVuZCgpOyBpdCsrKSB7CgkJc3RkOjpjb3V0IDw8ICppdCA8PCBzdGQ6OmVuZGw7Cgl9CglzdHIgPSAiIjsKCXRlc3QgPSBTdHJpbmdVdGlsaXRpZXM6OlNwbGl0KHN0ciwgIjsiKTsKCXN0ZDo6Y291dCA8PCAiPT09PT09PSIgPDwgc3RyIDw8IHN0ZDo6ZW5kbDsKCWZvciAoU3RyaW5nVXRpbGl0aWVzOjpTdHJpbmdzOjppdGVyYXRvciBpdCA9IHRlc3QuYmVnaW4oKTsgaXQgIT0gdGVzdC5lbmQoKTsgaXQrKykgewoJCXN0ZDo6Y291dCA8PCAqaXQgPDwgc3RkOjplbmRsOwoJfQoJc3RyID0gIjo6Ojs7Ozs7Ojo6OjoiOwoJdGVzdCA9IFN0cmluZ1V0aWxpdGllczo6U3BsaXQoc3RyLCAiOyIpOwoJc3RkOjpjb3V0IDw8ICI9PT09PT09IiA8PCBzdHIgPDwgc3RkOjplbmRsOwoJZm9yIChTdHJpbmdVdGlsaXRpZXM6OlN0cmluZ3M6Oml0ZXJhdG9yIGl0ID0gdGVzdC5iZWdpbigpOyBpdCAhPSB0ZXN0LmVuZCgpOyBpdCsrKSB7CgkJc3RkOjpjb3V0IDw8ICppdCA8PCBzdGQ6OmVuZGw7Cgl9CglzdHIgPSAidGVzdDs7OzsiOwoJdGVzdCA9IFN0cmluZ1V0aWxpdGllczo6U3BsaXQoc3RyLCAiOyIpOwoJc3RkOjpjb3V0IDw8ICI9PT09PT09IiA8PCAgc3RyIDw8IHN0ZDo6ZW5kbDsKCWZvciAoU3RyaW5nVXRpbGl0aWVzOjpTdHJpbmdzOjppdGVyYXRvciBpdCA9IHRlc3QuYmVnaW4oKTsgaXQgIT0gdGVzdC5lbmQoKTsgaXQrKykgewoJCXN0ZDo6Y291dCA8PCAqaXQgPDwgc3RkOjplbmRsOwoJfQoKCXN0ciA9ICJ8QWJjZHwke3Rlc3R9OmJsYWh8fHwke3Rlc3R9fGJiYnxzZGZ8JHt0ZXN0fXwke3Rlc3R9IjsKCXN0ZDo6Y291dCA8PCAiPT09PT09PSIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgImRkZGQiLCAiIikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJSZXBsYWNlQUxMICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IikgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2UgMSAiIDw8IFN0cmluZ1V0aWxpdGllczo6UmVwbGFjZShzdHIsICIke3Rlc3R9IiwgIlNhbmpheSIsIDEpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlIDIgIiA8PCBTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2Uoc3RyLCAiJHt0ZXN0fSIsICJTYW5qYXkiLCAyKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIlN0cmluZ1V0aWxpdGllczo6UmVwbGFjZSAzICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IiwgMykgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2UgNCAiIDw8IFN0cmluZ1V0aWxpdGllczo6UmVwbGFjZShzdHIsICIke3Rlc3R9IiwgIlNhbmpheSIsIDQpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlIC0xICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IiwgLTEpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlIC0yICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IiwgLTIpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlIC0zICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IiwgLTMpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlIC00ICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IiwgLTQpIDw8IHN0ZDo6ZW5kbDsKCglzdGQ6OmNvdXQgPDwgIlN0cmluZ1V0aWxpdGllczo6UmVwbGFjZSAxICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IiwgMSwgdHJ1ZSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2UgMiAiIDw8IFN0cmluZ1V0aWxpdGllczo6UmVwbGFjZShzdHIsICIke3Rlc3R9IiwgIlNhbmpheSIsIDIsIHRydWUpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlIDMgIiA8PCBTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2Uoc3RyLCAiJHt0ZXN0fSIsICJTYW5qYXkiLCAzLCB0cnVlKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIlN0cmluZ1V0aWxpdGllczo6UmVwbGFjZSA0ICIgPDwgU3RyaW5nVXRpbGl0aWVzOjpSZXBsYWNlKHN0ciwgIiR7dGVzdH0iLCAiU2FuamF5IiwgNCwgdHJ1ZSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2UgLTEgIiA8PCBTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2Uoc3RyLCAiJHt0ZXN0fSIsICJTYW5qYXkiLCAtMSwgdHJ1ZSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2UgLTIgIiA8PCBTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2Uoc3RyLCAiJHt0ZXN0fSIsICJTYW5qYXkiLCAtMiwgdHJ1ZSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2UgLTMgIiA8PCBTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2Uoc3RyLCAiJHt0ZXN0fSIsICJTYW5qYXkiLCAtMywgdHJ1ZSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2UgLTQgIiA8PCBTdHJpbmdVdGlsaXRpZXM6OlJlcGxhY2Uoc3RyLCAiJHt0ZXN0fSIsICJTYW5qYXkiLCAtNCwgdHJ1ZSkgPDwgc3RkOjplbmRsOwp9Cg==