code: public String decode(String encodedStr) {
      String[] suppliedBits = encodedStr.split(ARGUMENT_PLACE_HOLDER, -1);
      String originalStr = originalToNewNameMap.get(suppliedBits[0]);
      if (originalStr == null) {
        return encodedStr; // Failed to decode.
      }
      String[] originalBits = originalStr.split(ARGUMENT_PLACE_HOLDER, -1);
      StringBuilder sb = new StringBuilder(originalBits[0]);
      for (int i = 1; i < Math.max(originalBits.length, suppliedBits.length); i++) {
        // Replace missing bits with "-". Shouldn't happen except that we aren't
        // escaping the replacement token at the moment.
        sb.append(i < suppliedBits.length ? suppliedBits[i] : "-");
        sb.append(i < originalBits.length ? originalBits[i] : "-");
      }
      return sb.toString();
    }
docs: Decodes an encoded string from the JS Compiler ReplaceStrings pass.
  
  <p>An original string with args might look like this:
  <pre>  Error('Some ' + arg1 + ' error ' + arg2 + ' message.');</pre>
  Which gets replaced with:
  <pre>  Error('key' + '`' + arg1 + '`' + arg2);</pre>
  Where ` is the argument place holder. The replacement mapping would be:
  <pre>  key → 'Some ` error ` message.'</pre>
  Where key is some arbitrary replacement string. An encoded string,
  with args, from the client will look like:
  <pre>  'key`arg1`arg2'</pre>
  
  @param encodedStr An encoded string.
  @return The decoded string, or the encoded string if it fails to decode.
  @see com.google.javascript.jscomp.ReplaceStrings