docs: function encodeResponse(doc, action, input) {
      // Envelope tag
      doc.startElement('soap:Envelope');
      doc.writeAttribute('xmlns:soap', 'http://schemas.xmlsoap.org/soap/envelope/');
      doc.writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
      doc.writeAttribute('xmlns:xsd', 'http://www.w3.org/');
      doc.writeAttribute('xmlns:n2', 'http://www.betfair.com/publicapi/types/exchange/v5/');
  
      // Body tag
      doc.startElement('soap:Body');
  
      // action tag
      doc.startElement('n:' + action);
      // schema is always exchange
      doc.writeAttribute('xmlns:n',
              "http://www.betfair.com/publicapi/v5/BFExchangeService/");
  
      // request tag
      doc.startElement('n:Result');
  
      // header
      encodeHeader(doc, input);
  
      // errorCode
      doc.startElement('errorCode').writeAttribute('xsi:type', 'n2:APIErrorEnum');
      doc.text(input.errorCode);
      doc.endElement();
  
      // minorErrorCode
      doc.startElement('minorErrorCode').writeAttribute('xsi:null', '1');
      doc.endElement();
  
      // request content (actual request data)
      switch (action) {
      case 'placeBets':
          encodePlaceBets(doc, input);
          break;
      case 'updateBets':
          encodePlaceBets(doc, input);
          break;
      case 'cancelBets':
          encodeCancelBets(doc, input);
          break;
      case 'getMUBets':
          encodeGetMUBets(doc, input);
          break;
      case 'getCurrentBets':
          encodeGetCurrentBets(doc, input);
          break;
      case 'getMarketProfitAndLoss':
          encodeGetMarketProfitAndLoss(doc, input);
          break;
      }
  
      doc.endElement(); // request
      doc.endElement(); // action
      doc.endElement(); // body
      doc.endElement(); // envelope
  }