text: function SVGContainer(src) {
      this.src = src;
      this.image = null;
      var self = this;
  
      this.promise = this.hasFabric().then(function() {
          return (self.isInline(src) ? Promise.resolve(self.inlineFormatting(src)) : XHR(src));
      }).then(function(svg) {
          return new Promise(function(resolve) {
              html2canvas.fabric.loadSVGFromString(svg, self.createCanvas.call(self, resolve));
          });
      });
  }
  
  SVGContainer.prototype.hasFabric = function() {
      return !html2canvas.fabric ? Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")) : Promise.resolve();
  };
  
  SVGContainer.prototype.inlineFormatting = function(src) {
      return (/^data:image\/svg\+xml;base64,/.test(src)) ? this.decode64(this.removeContentType(src)) : this.removeContentType(src);
  };
  
  SVGContainer.prototype.removeContentType = function(src) {
      return src.replace(/^data:image\/svg\+xml(;base64)?,/,'');
  };
  
  SVGContainer.prototype.isInline = function(src) {
      return (/^data:image\/svg\+xml/i.test(src));
  };
  
  SVGContainer.prototype.createCanvas = function(resolve) {
      var self = this;
      return function (objects, options) {
          var canvas = new html2canvas.fabric.StaticCanvas('c');
          self.image = canvas.lowerCanvasEl;
          canvas
              .setWidth(options.width)
              .setHeight(options.height)
              .add(html2canvas.fabric.util.groupSVGElements(objects, options))
              .renderAll();
          resolve(canvas.lowerCanvasEl);
      };
  };
  
  SVGContainer.prototype.decode64 = function(str) {
      return (typeof(window.atob) === "function") ? window.atob(str) : decode64(str);
  };
  
  /*
   * base64-arraybuffer
   * https://github.com/niklasvh/base64-arraybuffer
   *
   * Copyright (c) 2012 Niklas von Hertzen
   * Licensed under the MIT license.
   */
  
  function decode64(base64) {
      var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var len = base64.length, i, encoded1, encoded2, encoded3, encoded4, byte1, byte2, byte3;
  
      var output = "";
  
      for (i = 0; i < len; i+=4) {
          encoded1 = chars.indexOf(base64[i]);
          encoded2 = chars.indexOf(base64[i+1]);
          encoded3 = chars.indexOf(base64[i+2]);
          encoded4 = chars.indexOf(base64[i+3]);
  
          byte1 = (encoded1 << 2) | (encoded2 >> 4);
          byte2 = ((encoded2 & 15) << 4) | (encoded3 >> 2);
          byte3 = ((encoded3 & 3) << 6) | encoded4;
          if (encoded3 === 64) {
              output += String.fromCharCode(byte1);
          } else if (encoded4 === 64 || encoded4 === -1) {
              output += String.fromCharCode(byte1, byte2);
          } else{
              output += String.fromCharCode(byte1, byte2, byte3);
          }
      }
  
      return output;
  }
  