code: function addMissingAreas(areas) {
          areas = areas.slice();
  
          // two circle intersections that aren't defined
          var ids = [], pairs = {}, i, j, a, b;
          for (i = 0; i < areas.length; ++i) {
              var area = areas[i];
              if (area.sets.length == 1) {
                  ids.push(area.sets[0]);
              } else if (area.sets.length == 2) {
                  a = area.sets[0];
                  b = area.sets[1];
                  pairs[[a, b]] = true;
                  pairs[[b, a]] = true;
              }
          }
          ids.sort(function(a, b) { return a > b; });
  
          for (i = 0; i < ids.length; ++i) {
              a = ids[i];
              for (j = i + 1; j < ids.length; ++j) {
                  b = ids[j];
                  if (!([a, b] in pairs)) {
                      areas.push({'sets': [a, b],
                                  'size': 0});
                  }
              }
          }
          return areas;
      }
docs: Missing pair-wise intersection area data can cause problems:
  treating as an unknown means that sets will be laid out overlapping,
  which isn't what people expect. To reflect that we want disjoint sets
  here, set the overlap to 0 for all missing pairwise set intersections