text: d3.tip=function(){var direction=d3_tip_direction,offset=d3_tip_offset,html=d3_tip_html,node=initNode(),svg=null,point=null,target=null
  function tip(vis){svg=getSVGNode(vis)
  point=svg.createSVGPoint()
  document.body.appendChild(node)}
  tip.show=function(){var args=Array.prototype.slice.call(arguments)
  if(args[args.length-1]instanceof SVGElement)target=args.pop()
  var content=html.apply(this,args),poffset=offset.apply(this,args),dir=direction.apply(this,args),nodel=d3.select(node),i=0,coords
  nodel.html(content).style({opacity:1,'pointer-events':'all'})
  while(i--)nodel.classed(directions[i],!1)
  coords=direction_callbacks.get(dir).apply(this)
  nodel.classed(dir,!0).style({top:(coords.top+poffset[0])+'px',left:(coords.left+poffset[1])+'px'})
  return tip}
  tip.hide=function(){nodel=d3.select(node)
  nodel.style({opacity:0,'pointer-events':'none'})
  return tip}
  tip.attr=function(n,v){if(arguments.length<2&&typeof n==='string'){return d3.select(node).attr(n)}else{var args=Array.prototype.slice.call(arguments)
  d3.selection.prototype.attr.apply(d3.select(node),args)}
  return tip}
  tip.style=function(n,v){if(arguments.length<2&&typeof n==='string'){return d3.select(node).style(n)}else{var args=Array.prototype.slice.call(arguments)
  d3.selection.prototype.style.apply(d3.select(node),args)}
  return tip}
  tip.direction=function(v){if(!arguments.length)return direction
  direction=v==null?v:d3.functor(v)
  return tip}
  tip.offset=function(v){if(!arguments.length)return offset
  offset=v==null?v:d3.functor(v)
  return tip}
  tip.html=function(v){if(!arguments.length)return html
  html=v==null?v:d3.functor(v)
  return tip}
  function d3_tip_direction(){return'n'}
  function d3_tip_offset(){return[0,0]}
  function d3_tip_html(){return' '}
  var direction_callbacks=d3.map({n:direction_n,s:direction_s,e:direction_e,w:direction_w,nw:direction_nw,ne:direction_ne,sw:direction_sw,se:direction_se}),directions=direction_callbacks.keys()
  function direction_n(){var bbox=getScreenBBox()
  return{top:bbox.n.y-node.offsetHeight,left:bbox.n.x-node.offsetWidth/2}}
  function direction_s(){var bbox=getScreenBBox()
  return{top:bbox.s.y,left:bbox.s.x-node.offsetWidth/2}}
  function direction_e(){var bbox=getScreenBBox()
  return{top:bbox.e.y-node.offsetHeight/2,left:bbox.e.x}}
  function direction_w(){var bbox=getScreenBBox()
  return{top:bbox.w.y-node.offsetHeight/2,left:bbox.w.x-node.offsetWidth}}
  function direction_nw(){var bbox=getScreenBBox()
  return{top:bbox.nw.y-node.offsetHeight,left:bbox.nw.x-node.offsetWidth}}
  function direction_ne(){var bbox=getScreenBBox()
  return{top:bbox.ne.y-node.offsetHeight,left:bbox.ne.x}}
  function direction_sw(){var bbox=getScreenBBox()
  return{top:bbox.sw.y,left:bbox.sw.x-node.offsetWidth}}
  function direction_se(){var bbox=getScreenBBox()
  return{top:bbox.se.y,left:bbox.e.x}}
  function initNode(){var node=d3.select(document.createElement('div'))
  node.style({position:'absolute',opacity:0,pointerEvents:'none',boxSizing:'border-box'})
  return node.node()}
  function getSVGNode(el){el=el.node()
  if(el.tagName.toLowerCase()=='svg')
  return el
  return el.ownerSVGElement}
  function getScreenBBox(){var targetel=target||d3.event.target,bbox={},matrix=targetel.getScreenCTM(),tbbox=targetel.getBBox(),width=tbbox.width,height=tbbox.height,x=tbbox.x,y=tbbox.y,scrollTop=document.documentElement.scrollTop||document.body.scrollTop,scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft
  point.x=x+scrollLeft
  point.y=y+scrollTop
  bbox.nw=point.matrixTransform(matrix)
  point.x+=width
  bbox.ne=point.matrixTransform(matrix)
  point.y+=height
  bbox.se=point.matrixTransform(matrix)
  point.x-=width
  bbox.sw=point.matrixTransform(matrix)
  point.y-=height/2
  bbox.w=point.matrixTransform(matrix)
  point.x+=width
  bbox.e=point.matrixTransform(matrix)
  point.x-=width/2
  point.y-=height/2
  bbox.n=point.matrixTransform(matrix)
  point.y+=height
  bbox.s=point.matrixTransform(matrix)
  return bbox}
  return tip}
  