Browse files

Wish I had commited this prior to messing up some regexp

  • Loading branch information...
1 parent ce0c289 commit aa378fa443e6ed0fd130e0b71e8a66331928cab8 @zmaril committed Feb 4, 2012
Showing with 42,677 additions and 15 deletions.
  1. +1 −0 #mpg#
  2. +25 −0 css/tipsy.css
  3. +19 −0 css/tree.css
  4. +8 −14 index.html
  5. +4,762 −0 js/libs/d3.js
  6. +1,881 −0 js/libs/d3.layout.js
  7. +241 −0 js/libs/jquery.tipsy.js
  8. +66 −1 js/script.js
  9. +3 −0 mbostock-d3-0a6ad07/.gitignore
  10. 0 mbostock-d3-0a6ad07/.gitmodules
  11. +4 −0 mbostock-d3-0a6ad07/.npmignore
  12. +26 −0 mbostock-d3-0a6ad07/LICENSE
  13. +271 −0 mbostock-d3-0a6ad07/Makefile
  14. +51 −0 mbostock-d3-0a6ad07/README.md
  15. +984 −0 mbostock-d3-0a6ad07/d3.chart.js
  16. +1 −0 mbostock-d3-0a6ad07/d3.chart.min.js
  17. +92 −0 mbostock-d3-0a6ad07/d3.csv.js
  18. +1 −0 mbostock-d3-0a6ad07/d3.csv.min.js
  19. +938 −0 mbostock-d3-0a6ad07/d3.geo.js
  20. +1 −0 mbostock-d3-0a6ad07/d3.geo.min.js
  21. +835 −0 mbostock-d3-0a6ad07/d3.geom.js
  22. +1 −0 mbostock-d3-0a6ad07/d3.geom.min.js
  23. +4,762 −0 mbostock-d3-0a6ad07/d3.js
  24. +1,881 −0 mbostock-d3-0a6ad07/d3.layout.js
  25. +1 −0 mbostock-d3-0a6ad07/d3.layout.min.js
  26. +2 −0 mbostock-d3-0a6ad07/d3.min.js
  27. +726 −0 mbostock-d3-0a6ad07/d3.time.js
  28. +1 −0 mbostock-d3-0a6ad07/d3.time.min.js
  29. +168 −0 mbostock-d3-0a6ad07/examples/albers/albers.html
  30. +48 −0 mbostock-d3-0a6ad07/examples/area/area-radial.html
  31. +113 −0 mbostock-d3-0a6ad07/examples/area/area.html
  32. +50 −0 mbostock-d3-0a6ad07/examples/axis/axis-alternating.html
  33. +68 −0 mbostock-d3-0a6ad07/examples/axis/axis-ggplot2.html
  34. +117 −0 mbostock-d3-0a6ad07/examples/axis/axis-multiples.html
  35. +63 −0 mbostock-d3-0a6ad07/examples/axis/axis-orientations.html
  36. +153 −0 mbostock-d3-0a6ad07/examples/axis/axis-transition.html
  37. +21 −0 mbostock-d3-0a6ad07/examples/azimuthal/azimuthal.css
  38. +99 −0 mbostock-d3-0a6ad07/examples/azimuthal/azimuthal.html
  39. +29 −0 mbostock-d3-0a6ad07/examples/azimuthal/azimuthal.js
  40. +223 −0 mbostock-d3-0a6ad07/examples/bar/bar-hierarchy.html
  41. +101 −0 mbostock-d3-0a6ad07/examples/bar/bar.html
  42. +53 −0 mbostock-d3-0a6ad07/examples/bar/sample-data.csv
  43. +159 −0 mbostock-d3-0a6ad07/examples/bonne/bonne.html
  44. +4 −0 mbostock-d3-0a6ad07/examples/box/box.css
  45. +19 −0 mbostock-d3-0a6ad07/examples/box/box.html
  46. +68 −0 mbostock-d3-0a6ad07/examples/box/box.js
  47. +92 −0 mbostock-d3-0a6ad07/examples/brush/brush-ordinal.html
  48. +92 −0 mbostock-d3-0a6ad07/examples/brush/brush-x.html
  49. +91 −0 mbostock-d3-0a6ad07/examples/brush/brush-y.html
  50. +98 −0 mbostock-d3-0a6ad07/examples/brush/brush.html
  51. +8 −0 mbostock-d3-0a6ad07/examples/bubble/bubble.css
  52. +14 −0 mbostock-d3-0a6ad07/examples/bubble/bubble.html
  53. +46 −0 mbostock-d3-0a6ad07/examples/bubble/bubble.js
  54. +10 −0 mbostock-d3-0a6ad07/examples/bullet/bullet.css
  55. +18 −0 mbostock-d3-0a6ad07/examples/bullet/bullet.html
  56. +53 −0 mbostock-d3-0a6ad07/examples/bullet/bullet.js
  57. +7 −0 mbostock-d3-0a6ad07/examples/bullet/bullets.json
  58. +9 −0 mbostock-d3-0a6ad07/examples/bundle/bundle-radial.css
  59. +15 −0 mbostock-d3-0a6ad07/examples/bundle/bundle-radial.html
  60. +50 −0 mbostock-d3-0a6ad07/examples/bundle/bundle-radial.js
  61. +14 −0 mbostock-d3-0a6ad07/examples/bundle/bundle-treemap.css
  62. +16 −0 mbostock-d3-0a6ad07/examples/bundle/bundle-treemap.html
  63. +53 −0 mbostock-d3-0a6ad07/examples/bundle/bundle-treemap.js
  64. +49 −0 mbostock-d3-0a6ad07/examples/bundle/packages.js
  65. +35 −0 mbostock-d3-0a6ad07/examples/button.css
  66. +15 −0 mbostock-d3-0a6ad07/examples/calendar/calendar.css
  67. +120 −0 mbostock-d3-0a6ad07/examples/calendar/dji-area.html
  68. +5,233 −0 mbostock-d3-0a6ad07/examples/calendar/dji.csv
  69. +15 −0 mbostock-d3-0a6ad07/examples/calendar/dji.html
  70. +69 −0 mbostock-d3-0a6ad07/examples/calendar/dji.js
  71. +5,231 −0 mbostock-d3-0a6ad07/examples/calendar/vix.csv
  72. +15 −0 mbostock-d3-0a6ad07/examples/calendar/vix.html
  73. +69 −0 mbostock-d3-0a6ad07/examples/calendar/vix.js
  74. +20 −0 mbostock-d3-0a6ad07/examples/cartogram/cartogram.css
  75. +15 −0 mbostock-d3-0a6ad07/examples/cartogram/cartogram.html
  76. +51 −0 mbostock-d3-0a6ad07/examples/cartogram/cartogram.js
  77. +9 −0 mbostock-d3-0a6ad07/examples/cartogram/demers.css
  78. +16 −0 mbostock-d3-0a6ad07/examples/cartogram/demers.html
  79. +79 −0 mbostock-d3-0a6ad07/examples/cartogram/demers.js
  80. +9 −0 mbostock-d3-0a6ad07/examples/cartogram/dorling.css
  81. +16 −0 mbostock-d3-0a6ad07/examples/cartogram/dorling.html
  82. +80 −0 mbostock-d3-0a6ad07/examples/cartogram/dorling.js
  83. +109 −0 mbostock-d3-0a6ad07/examples/chord/chord-flare.html
  84. +9 −0 mbostock-d3-0a6ad07/examples/chord/chord.css
  85. +14 −0 mbostock-d3-0a6ad07/examples/chord/chord.html
  86. +98 −0 mbostock-d3-0a6ad07/examples/chord/chord.js
  87. +51 −0 mbostock-d3-0a6ad07/examples/choropleth/choropleth-area.html
  88. +46 −0 mbostock-d3-0a6ad07/examples/choropleth/choropleth-bounds.html
  89. +16 −0 mbostock-d3-0a6ad07/examples/choropleth/choropleth.css
  90. +15 −0 mbostock-d3-0a6ad07/examples/choropleth/choropleth.html
  91. +38 −0 mbostock-d3-0a6ad07/examples/choropleth/choropleth.js
  92. +1 −0 mbostock-d3-0a6ad07/examples/choropleth/unemployment.json
  93. +23 −0 mbostock-d3-0a6ad07/examples/clock/clock.css
  94. +17 −0 mbostock-d3-0a6ad07/examples/clock/clock.html
  95. +87 −0 mbostock-d3-0a6ad07/examples/clock/clock.js
  96. +14 −0 mbostock-d3-0a6ad07/examples/cluster/cluster-radial.html
  97. +39 −0 mbostock-d3-0a6ad07/examples/cluster/cluster-radial.js
  98. +15 −0 mbostock-d3-0a6ad07/examples/cluster/cluster.css
  99. +14 −0 mbostock-d3-0a6ad07/examples/cluster/cluster.html
  100. +39 −0 mbostock-d3-0a6ad07/examples/cluster/cluster.js
  101. +108 −0 mbostock-d3-0a6ad07/examples/contour/contour.html
  102. +109 −0 mbostock-d3-0a6ad07/examples/crimea/crimea-stacked-area.html
  103. +98 −0 mbostock-d3-0a6ad07/examples/crimea/crimea-stacked-bar.html
  104. +24 −0 mbostock-d3-0a6ad07/examples/crimea/crimea.csv
  105. +83 −0 mbostock-d3-0a6ad07/examples/custom/custom.html
  106. +13 −0 mbostock-d3-0a6ad07/examples/data/README.md
  107. +8 −0 mbostock-d3-0a6ad07/examples/data/faithful.json
  108. +222 −0 mbostock-d3-0a6ad07/examples/data/flare-imports.json
  109. +380 −0 mbostock-d3-0a6ad07/examples/data/flare.json
  110. +101 −0 mbostock-d3-0a6ad07/examples/data/morley.csv
  111. +2 −0 mbostock-d3-0a6ad07/examples/data/sample.csv
  112. +5 −0 mbostock-d3-0a6ad07/examples/data/sample.html
  113. +1 −0 mbostock-d3-0a6ad07/examples/data/sample.json
  114. +1 −0 mbostock-d3-0a6ad07/examples/data/sample.txt
  115. +4 −0 mbostock-d3-0a6ad07/examples/data/sample.xml
  116. +807 −0 mbostock-d3-0a6ad07/examples/data/stocks.csv
  117. +1,709 −0 mbostock-d3-0a6ad07/examples/data/unemployment.csv
  118. +1 −0 mbostock-d3-0a6ad07/examples/data/us-borders.json
  119. +3,216 −0 mbostock-d3-0a6ad07/examples/data/us-counties.json
  120. +54 −0 mbostock-d3-0a6ad07/examples/data/us-state-centroids.json
  121. +54 −0 mbostock-d3-0a6ad07/examples/data/us-states.json
  122. +179 −0 mbostock-d3-0a6ad07/examples/data/world-countries.json
  123. +44 −0 mbostock-d3-0a6ad07/examples/delaunay/delaunay.html
  124. +124 −0 mbostock-d3-0a6ad07/examples/donut/donut.html
  125. +103 −0 mbostock-d3-0a6ad07/examples/dot/dot.html
  126. +44 −0 mbostock-d3-0a6ad07/examples/drag/drag.html
  127. +10 −0 mbostock-d3-0a6ad07/examples/force/README
  128. +70 −0 mbostock-d3-0a6ad07/examples/force/force-bounds.html
  129. +249 −0 mbostock-d3-0a6ad07/examples/force/force-cluster.html
  130. +144 −0 mbostock-d3-0a6ad07/examples/force/force-collapsible.html
  131. +118 −0 mbostock-d3-0a6ad07/examples/force/force-dynamic.html
  132. +104 −0 mbostock-d3-0a6ad07/examples/force/force-map.html
  133. +68 −0 mbostock-d3-0a6ad07/examples/force/force-multi-foci.html
  134. +9 −0 mbostock-d3-0a6ad07/examples/force/force.css
  135. +14 −0 mbostock-d3-0a6ad07/examples/force/force.html
  136. +50 −0 mbostock-d3-0a6ad07/examples/force/force.js
  137. +1 −0 mbostock-d3-0a6ad07/examples/force/miserables.json
  138. +78 −0 mbostock-d3-0a6ad07/examples/great-arc/great-arc.html
  139. +60 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-data-key.html
  140. +75 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-data-nested-key.html
  141. +77 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-data-nested.html
  142. +46 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-data.html
  143. +53 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-event.html
  144. +25 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-node-key.html
  145. +25 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-order.html
  146. +75 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-sort.html
  147. +41 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-transform.html
  148. +43 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-transition-undefined.html
  149. +47 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-transition.html
  150. +64 −0 mbostock-d3-0a6ad07/examples/hello-world/hello-webkit-transition.html
  151. +29 −0 mbostock-d3-0a6ad07/examples/hello-world/select-enter-add.html
  152. +20 −0 mbostock-d3-0a6ad07/examples/hello-world/selectAll-enter-add.html
  153. +80 −0 mbostock-d3-0a6ad07/examples/histogram/histogram.html
  154. +9 −0 mbostock-d3-0a6ad07/examples/horizon/horizon.css
  155. +25 −0 mbostock-d3-0a6ad07/examples/horizon/horizon.html
  156. +43 −0 mbostock-d3-0a6ad07/examples/horizon/horizon.js
  157. +1 −0 mbostock-d3-0a6ad07/examples/horizon/unemployment.json
  158. +75 −0 mbostock-d3-0a6ad07/examples/hull/hull.html
  159. +9 −0 mbostock-d3-0a6ad07/examples/kde/kde.css
  160. +14 −0 mbostock-d3-0a6ad07/examples/kde/kde.html
  161. +40 −0 mbostock-d3-0a6ad07/examples/kde/kde.js
  162. +22 −0 mbostock-d3-0a6ad07/examples/line/line.css
  163. +11 −0 mbostock-d3-0a6ad07/examples/line/line.html
  164. +63 −0 mbostock-d3-0a6ad07/examples/line/line.js
  165. +116 −0 mbostock-d3-0a6ad07/examples/marimekko/marimekko.html
  166. +18 −0 mbostock-d3-0a6ad07/examples/marimekko/marimekko.json
  167. +169 −0 mbostock-d3-0a6ad07/examples/marker/marker.html
  168. +133 −0 mbostock-d3-0a6ad07/examples/mercator/mercator.html
  169. +53 −0 mbostock-d3-0a6ad07/examples/moire/moire.html
  170. +70 −0 mbostock-d3-0a6ad07/examples/node-canvas/us-counties.js
  171. +15 −0 mbostock-d3-0a6ad07/examples/pack/pack.css
  172. +14 −0 mbostock-d3-0a6ad07/examples/pack/pack.html
  173. +33 −0 mbostock-d3-0a6ad07/examples/pack/pack.js
  174. +407 −0 mbostock-d3-0a6ad07/examples/parallel/cars.csv
  175. +134 −0 mbostock-d3-0a6ad07/examples/parallel/parallel.html
  176. +59 −0 mbostock-d3-0a6ad07/examples/partition/partition-icicle-zoom.html
  177. +45 −0 mbostock-d3-0a6ad07/examples/partition/partition-icicle.html
  178. +72 −0 mbostock-d3-0a6ad07/examples/partition/partition-sunburst-zoom.html
  179. +21 −0 mbostock-d3-0a6ad07/examples/partition/partition-sunburst.html
  180. +72 −0 mbostock-d3-0a6ad07/examples/partition/partition-sunburst.js
  181. +69 −0 mbostock-d3-0a6ad07/examples/pie/pie-transition.html
  182. +51 −0 mbostock-d3-0a6ad07/examples/pie/pie.html
  183. +28 −0 mbostock-d3-0a6ad07/examples/population/population.css
Sorry, we could not display the entire diff because too many files (639) changed.
View
1 #mpg#
@@ -0,0 +1 @@
+{'names': ['pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg'], 'children': [{'names': ['solipsist', 'drx', 'kevincjemison', 'balsam', 'mindstab', 'VladRussian', 'jcr', 'rquantz', 'lrobb', 'vyrotek', 'pg', 'bermanoid', 'mpakes', 'pierrefar', 'sungam', 'munin', 'amirnathoo', 'boyter', 'prawn', 'channelmeter', 'arvinjoar', 'littlegiantcap', 'lien', 'larrys', 'Sukotto', 'grizzlylazer', 'forinti', 'abiekatz', 'abstractbill', 'joshfraser', 'Fixnum', 'impendia', 'mooneater', 'DanielBMarkham', 'pg', 'pg', 'HSO', 'fbuilesv', 'saygt', 'abbasmehdi', 'ceejayoz', 'sskates', 'Holmes', 'flipside', 'ajtaylor', 'Fliko', 'cperciva', 'ColinWright', 'gms', 'ccollins', 'forgetcolor', 'ths', 'tptacek', 'dustinupdyke', 'recoiledsnake', 'indexzero', 'ramanujan', 'brudgers', 'Shenglong', 'Sandman', 'badclient', 'rgrieselhuber', 'wj', 'jmathai', 'hristov', 'halostatue', 'nodesocket', 'cperciva', 'staunch', 'acabal', 'negrera', 'amirmc', 'veyron', 'tokenadult', 'diego', 'veyron', 'nextparadigms', 'FredBrach', 'diego', 'anactofgod', 'AndyNemmity', 'lsb', 'spxdcz', 'lsb', 'jbail', 'RuchitGarg', 'kruipen', 'portman', 'lallysingh', 'yequalsx', 'zck', 'rickmb', 'rdl', 'tptacek', 'aspir', 'alabut', 'ghshephard', 'keeptrying', 'cletus', 'pg', 'MostAwesomeDude', 'JoelSutherland', 'jonjenk', 'tptacek', 'codyrobbins', 'unalone', 'malandrew', 'thiefmaster', 'pg', 'Eliezer', 'blauwbilgorgel', 'rdl', 'egiva', 'portman', 'oldstrangers', 'tptacek', 'sixtofour', 'amirmc', 'startupfounder', 'konaaceo', 'orijing', 'benatkin', 'foxit', 'ivankirigin', 'tansey', 'jwr', 'chugger', 'ColinWright', 'pg', 'gasull', 'akkartik', 'fredwilson', 'nadam', 'tokenadult', 'zach', 'kul', 'amirmc', 'tgriesser', 'tc', 'ntoshev', 'staunch', 'lukeholder', 'tptacek', 'whenisayUH', 'pg', 'replicatorblog', 'noamsml', 'nextparadigms', 'kls', 'abbasmehdi', 'nostromo', 'teej', 'pg', 'cletus', 'auston', 'tallanvor', 'fredwilson', 'jdunck', 'jsdalton', 'nicholasjbs', 'marcomonteiro', 'kaiuhl', 'staunch', 'spenrose', 'joshfraser', 'Fixnum', 'impendia', 'mooneater', 'DanielBMarkham', 'pg', 'pg', 'betterlabs', 'Shenglong', 'Skeletor', 'pg', 'nirvana', 'Natsu', 'biot', 'bkmartin', 'mhartl', 'brc', 'Joakal', 'tptacek', 'ryanwaggoner', 'donall', 'maukdaddy', 'nicholasjbs', 'klbarry', 'chromedude', 'fourspace', 'davelnewton', 'mikeash', 'lordlicorice', 'htsh', 'ryanwaggoner', 'jpdoctor', 'blhack', 'burgerbrain', 'eps', 'fredwilson', 'mapgrep', 'OstiaAntica', 'eru', 'dforeman', 'Impossible', 'ccollins', 'dbingham', 'pitdesi', 'pedalpete', 'felipemnoa', 'benhoyt', 'amirmc'], 'children': [{'names': ['pg', 'pg', 'pg', 'pg', 'pg', 'tlb', 'peterarmstrong', 'brlewis', 'jfoster', 'adrianwaj', 'gwern', 'pg', 'pg', 'sskates', 'pg', 'jackpirate', 'genieyclo', 'pg', 'vorg', 'pg', 'wisty', 'tptacek', 'eggbrain', 'pg', 'andres', 'pg', 'crag', 'brudgers', 'pg', 'chromedude', 'pg', 'pg', 'pg', 'pg', 'pg', 'tptacek', 'cleverjake', 'defen', 'foxit', 'pg', 'pg', 'redthrowaway', 'pg', 'Jgrubb', 'davewiner', 'pg', 'jfarmer', 'GFischer', 'pg', 'brlewis', 'pg', 'justinchen', 'pg', 'aneth', 'bartonfink', 'pg', 'pg', 'SoftwareMaven', 'dxbydt', 'marksbren', 'pg', 'vidarh', 'jbooth', 'nl', 'stonemetal', 'jpdoctor', 'pg', 'shasta', 'pg', 'nl', 'pg', 'earl', 'pg', 'darklajid', 'smokeyj', 'moe', 'Hitchhiker', 'gasull', 'redthrowaway', 'Hitchhiker', 'jprobert', 'pg', 'pg', 'pg', 'benologist', 'SamReidHughes', 'genieyclo', 'pg', 'vorg', 'pg', 'rohern', 'pg', 'pg', 'pg', 'pg', 'glimcat', 'GFischer', 'pg', 'keeptrying', 'kristiandupont', 'bendoernberg', 'nbashaw', 'fourspace', 'avree', 'jerfelix', 'DanLivesHere', 'pg', 'kelnos', 'Natsu', 'pg', 'pg', 'pg', 'ridruejo', 'pg', 'pg', 'pg', 'mapgrep'], 'children': [{'names': ['mindstab', 'drx', 'solipsist', 'jcr', 'lrobb', 'vyrotek', 'officemonkey', 'bl', 'thaumaturgy', 'prawn', 'cambwiese', 'siglesias', 'lwhi', 'Rayzar', 'srdev', 'cperciva', 'fredwilson', 'tptacek', 'dredmorbius', 'iamelgringo', 'ditojim', 'jrosenblatt', 'pg', 'tikhonj', 'VMG', 'foxit', 'chargrilled', 'lsb', 'jbail', 'pron', 'rickmb', 'tptacek', 'TeMPOraL', 'kbutler', 'tptacek', 'unalone', 'zbruhnke', 'noblethrasher', 'gwern', 'bermanoid', 'konaaceo', 'akkartik', 'fredwilson', 'illumen', 'rudyfink', 'rhizome', 'pbhjpbhj', 'fredwilson', 'Joakal', 'bjoernlasseh', 'joelprocrast', 'jpr', 'siglesias', 'lwhi', 'csallen', 'tptacek', 'bkmartin', 'jaekwon', 'nicholasjbs', 'bigohms', 'chromedude', 'tibbon', 'mikehoward', 'htsh', 'ryanwaggoner', 'glimcat', 'vizzah', 'thrill', 'ridruejo', 'abiekatz', 'quadhome'], 'children': [{'names': ['pg', 'harj', 'huxley', 'pg', 'abbasmehdi', 'pg', 'philwelch', 'vorg', 'pg', 'gruseom', 'tptacek', 'crag', 'pg', 'carbocation', 'aswanson', 'DanHulton', 'pg', 'huhtenberg', 'angrycoder', 'pg', 'jrockway', 'tptacek', 'pg', 'trewq', 'bartonfink', 'firebones', 'jbooth', 'stonemetal', 'dagw', 'sukuriant', 'pg', 'pg', 'philwelch', 'vorg', 'abbasmehdi', 'pg', 'pg', 'pg', 'chc', 'pg', 'pg', 'pg', 'pg'], 'children': [{'names': ['mindstab', 'count', 'officemonkey', 'thaumaturgy', 'cambwiese', 'impendia', 'Rayzar', 'gujk', 'credo', 'gaustin', 'chargrilled', 'esrauch', 'jbail', 'pron', 'jrockway', 'rooshdi', 'WalterBright', 'amirmc', 'impendia', 'csallen', 'tptacek', 'llambda', 'htsh'], 'children': [{'names': ['phaus', 'adbge', 'moldbug', 'grandinj', 'pg', 'eugenejen', 'slaven', 'jrockway', 'DanielRibeiro', 'abbasmehdi', 'billpatrianakos'], 'children': [{'names': ['astine', 'MatthewPhillips', 'indexzero', 'thenextcorner', 'rooshdi', 'csallen', 'chc'], 'children': [{'names': ['thristian', 'phaus', 'pg', 'DanielRibeiro'], 'children': [{'names': ['indexzero', 'yuhong'], 'children': [{'names': ['pg'], 'children': None}, {'names': ['lotharbot'], 'children': None}]}]}, {'names': ['JangoSteve'], 'children': None}, {'names': ['lambda'], 'children': None}, {'names': ['gcr'], 'children': [{'names': ['alttag'], 'children': None}]}, {'names': ['ricardobeat'], 'children': None}, {'names': ['dennisgorelik'], 'children': None}]}, {'names': ['rmc'], 'children': None}]}, {'names': ['projectileboy', 'RobertKohr', 'gruseom', 'temphn', 'dextorious'], 'children': [{'names': ['dodedo', 'thaumaturgy'], 'children': None}]}]}, {'names': ['arethuza', 'impendia', 'iamelgringo', 'balsam', 'pilsetnieks', 'vyrotek', 'SoftwareMaven', 'chipsy', 'wtallis'], 'children': [{'names': ['nl', 'jaekwon', 'htsh'], 'children': [{'names': ['siglesias', 'cheez'], 'children': [{'names': ['skore'], 'children': None}]}]}]}, {'names': ['IsaacSchlueter', 'eaurouge', 'namank', 'bjoernlasseh', 'jaekwon'], 'children': [{'names': ['carbocation', 'kfalter'], 'children': [{'names': ['namank'], 'children': None}]}]}, {'names': ['dodedo'], 'children': None}, {'names': ['gcb'], 'children': None}, {'names': ['gcb'], 'children': None}]}, {'names': ['enneff', 'yesbabyyes', 'tptacek', 'Goladus', 'proexploit', 'mickdarling', 'rhizome', 'unalone', 'konaaceo', 'bfe', 'Goladus', 'proexploit', 'ebaysucks', 'icey', 'htsh', 'YuriNiyazov'], 'children': [{'names': ['siglesias', 'mindstab', 'kbutler', 'dirtyaura', 'siglesias', 'ljlolel'], 'children': [{'names': ['jodrellblank', 'rhizome', 'maxmarmer', 'jodrellblank', 'YuriNiyazov'], 'children': [{'names': ['siglesias', 'siglesias', 'ljlolel'], 'children': [{'names': ['Goladus', 'Goladus'], 'children': [{'names': ['siglesias', 'siglesias'], 'children': [{'names': ['jodrellblank', 'jodrellblank'], 'children': [{'names': ['siglesias', 'siglesias'], 'children': [{'names': ['jodrellblank', 'jodrellblank'], 'children': None}, {'names': ['Goladus', 'Goladus'], 'children': None}]}]}]}]}]}]}, {'names': ['Volpe', 'Volpe'], 'children': [{'names': ['Goladus', 'Goladus'], 'children': None}]}]}, {'names': ['ryanwaggoner'], 'children': [{'names': ['pg'], 'children': None}, {'names': ['YuriNiyazov'], 'children': None}]}]}, {'names': ['sraut', 'ithought', 'juiceandjuice', 'dextorious'], 'children': [{'names': ['Maxious', 'puredemo'], 'children': None}, {'names': ['htsh'], 'children': [{'names': ['dextorious'], 'children': None}]}]}, {'names': ['jasonwatkinspdx'], 'children': None}, {'names': ['imgabe'], 'children': [{'names': ['mindstab'], 'children': [{'names': ['imgabe'], 'children': None}]}]}]}, {'names': ['antr', 'mbesto', 'zem', 'moldbug', 'abbasmehdi', 'derrida', 'indexzero', 'frasertimo', 'breck', 'rbanffy', 'DanBC', 'sanjiallblue', 'shutej', 'hristiank', 'myoder', 'thiefmaster', 'nhaehnle', 'tptacek', 'pbiggar', 'JoeAltmaier', 'derrida', 'nowarninglabel', 'wnight', 'jamesbritt', 'gizmo', 'swalsh'], 'children': [{'names': ['samstave', 'omouse', 'edanm', 'pg', 'swombat', 'foxit', 'yummyfajitas', 'bhousel', 'redthrowaway', 'brianl', 'nirvana', 'technomancy'], 'children': [{'names': ['GHFigs', 'zem', 'away', 'Ives', 'nhaehnle', 'nowarninglabel', 'wnight'], 'children': [{'names': ['samstave', 'pg', 'veyron', 'palish'], 'children': [{'names': ['GHFigs', 'PLejeck', 'chc', 'nowarninglabel'], 'children': [{'names': ['vannevar', 'pg', 'samstave'], 'children': None}]}, {'names': ['away'], 'children': None}]}, {'names': ['RussRomStanBety', 'puredemo'], 'children': [{'names': ['staunch', 'nowarninglabel'], 'children': [{'names': ['PLejeck'], 'children': None}]}]}]}, {'names': ['nandemo', 'breck'], 'children': None}]}, {'names': ['stephenson', 'beatle', 'OstiaAntica'], 'children': [{'names': ['antr', 'nhaehnle'], 'children': [{'names': ['stephenson'], 'children': [{'names': ['dataangel'], 'children': None}, {'names': ['danssig'], 'children': None}]}]}]}]}, {'names': ['sporkologist', 'impendia', 'TheIronYuppie', 'EGreg', 'ChrisNorstrom', 'robotresearcher', 'HSO', 'Someone', 'impendia', 'oldstrangers', 'zackattack', 'AznHisoka'], 'children': [{'names': ['eCa', 'SomeOtherGuy', 'GHFigs'], 'children': [{'names': ['oldstrangers', 'sporkologist'], 'children': None}]}, {'names': ['rohern'], 'children': [{'names': ['oldstrangers'], 'children': [{'names': ['nirvana'], 'children': [{'names': ['oldstrangers'], 'children': None}]}]}]}]}, {'names': ['forensic', 'middayc', 'janj', 'sidi'], 'children': [{'names': ['wanorris'], 'children': [{'names': ['OstiaAntica'], 'children': None}, {'names': ['forensic'], 'children': [{'names': ['yummyfajitas'], 'children': [{'names': ['forensic'], 'children': [{'names': ['yummyfajitas'], 'children': [{'names': ['Aylw'], 'children': [{'names': ['yummyfajitas'], 'children': None}]}]}]}]}, {'names': ['sgoranson'], 'children': [{'names': ['cwp'], 'children': None}, {'names': ['notahacker'], 'children': None}, {'names': ['arethuza'], 'children': None}]}, {'names': ['jgesture'], 'children': None}]}, {'names': ['msutherl'], 'children': [{'names': ['dpatru'], 'children': [{'names': ['Klinky'], 'children': None}]}]}, {'names': ['jberryman'], 'children': [{'names': ['jberryman'], 'children': [{'names': ['pyre'], 'children': None}, {'names': ['brycecolquitt'], 'children': None}]}, {'names': ['Roboprog'], 'children': None}]}]}, {'names': ['kevinpet'], 'children': [{'names': ['forensic'], 'children': [{'names': ['jgesture'], 'children': None}, {'names': ['OstiaAntica'], 'children': None}]}]}]}, {'names': ['rdl', 'vannevar', 'raldi'], 'children': [{'names': ['rdl'], 'children': None}, {'names': ['steventruong'], 'children': None}]}, {'names': ['steventruong', 'richcollins', 'nirvana'], 'children': [{'names': ['andrewfong'], 'children': None}]}, {'names': ['jimmyjim', 'specialist', 'deea'], 'children': [{'names': ['intenex'], 'children': None}]}, {'names': ['ascendant', 'kul', 'marcanthonyrosa'], 'children': None}, {'names': ['jasonallen', 'robalex'], 'children': [{'names': ['csallen'], 'children': None}, {'names': ['puredemo'], 'children': None}]}, {'names': ['projectileboy', 'pajop'], 'children': None}, {'names': ['nirvana', 'Yipster'], 'children': [{'names': ['temphn'], 'children': None}]}, {'names': ['davidjrodriguez'], 'children': None}, {'names': ['MBlume'], 'children': None}]}, {'names': ['nsmartt', 'greyfade', 'revorad', 'runningdogx', 'colonelxc', 'alanning', 'rbarooah', 'harryh', 'gtani', 'tptacek', 'Cushman', 'InclinedPlane', 'daleharvey', 'chc', 'ctwk', 'zbruhnke', 'bignoggins', 'dpritchett', 'YuriNiyazov', 'wanorris', 'myoder', 'blacksmythe', 'baddox', 'ellyagg', 'cjy', 'AndyNemmity', 'konaaceo', 'watmough', 'ajross', 'studentnnrob', 'byrneseyeview', 'daveungerer', 'dantheman', 'puredemo', 'ColinHayhurst', 'sadlyNess', 'rbarooah', 'earbitscom', 'kongqiu', 'jbooth', 'herbacidal'], 'children': [{'names': ['pg', 'ricardobeat', 'mindstab', 'quanticle', 'tlammens', 'jeffool', 'DavidChouinard', 'tptacek', 'joshes', 'thiefmaster', 'pbhjpbhj', 'jimbokun', 'frossie', 'whenisayUH', 'pg', 'mixmax', 'pg', 'pg'], 'children': [{'names': ['zohebv', 'spamizbad', 'ctwk', 'jasonkolb', 'pg', 'zck', 'rayiner', 'anamax', 'byrneseyeview', 'waqf', 'zohebv', 'vl'], 'children': [{'names': ['sokoloff', 'mcartyem', 'sokoloff', 'tptacek'], 'children': [{'names': ['zohebv', 'ctwk', 'zohebv', 'chunkybacon'], 'children': [{'names': ['Confusion', 'Confusion'], 'children': [{'names': ['wisty', 'wisty'], 'children': None}, {'names': ['zohebv', 'zohebv'], 'children': None}, {'names': ['zohebv', 'zohebv'], 'children': None}]}, {'names': ['fauigerzigerk', 'fauigerzigerk'], 'children': None}]}, {'names': ['Ingaz', 'Ingaz'], 'children': None}]}, {'names': ['robryan', 'robryan', 'robg'], 'children': [{'names': ['wnight', 'wnight'], 'children': [{'names': ['zohebv', 'zohebv'], 'children': [{'names': ['wnight', 'wnight'], 'children': None}]}, {'names': ['roblev', 'roblev'], 'children': [{'names': ['sharjeel', 'sharjeel'], 'children': None}, {'names': ['wnight', 'wnight'], 'children': None}]}]}]}, {'names': ['vl'], 'children': None}, {'names': ['nivertech'], 'children': [{'names': ['nivertech'], 'children': None}]}]}, {'names': ['ryanwaggoner', 'kragen', 'rbarooah', 'dagw', 'ericd', 'rbarooah', 'YuriNiyazov'], 'children': [{'names': ['whenisayUH', 'lazerwalker', 'tptacek'], 'children': [{'names': ['ericd'], 'children': None}]}]}, {'names': ['realitygrill', 'bignoggins', 'baddox', 'blacksmythe', 'shareme'], 'children': [{'names': ['treeform', 'dannyr'], 'children': [{'names': ['smilliken'], 'children': [{'names': ['reissbaker'], 'children': [{'names': ['ido'], 'children': [{'names': ['treeform'], 'children': None}]}]}]}]}]}, {'names': ['Cushman', 'sukuriant'], 'children': [{'names': ['realitygrill'], 'children': None}]}, {'names': ['barumrho', 'HeyLaughingBoy'], 'children': None}, {'names': ['marknutter'], 'children': [{'names': ['furyofantares'], 'children': [{'names': ['marknutter'], 'children': None}]}]}, {'names': ['jng'], 'children': None}]}, {'names': ['jamesgatz', 'statictype', 'jbail', 'MostAwesomeDude', 'ippisl', 'ahlatimer', 'pbhjpbhj'], 'children': [{'names': ['ryanwaggoner', 'jamesgatz', 'YuriNiyazov', 'gensym'], 'children': [{'names': ['MostAwesomeDude', 'andrewflnr'], 'children': None}]}, {'names': ['glhaynes'], 'children': None}, {'names': ['wazoox'], 'children': [{'names': ['robryan'], 'children': None}]}, {'names': ['klochner'], 'children': None}]}, {'names': ['EvanKelly', 'steins'], 'children': None}]}, {'names': ['shmerl', 'zapnap', 'Goladus', 'FreakLegion', 'nickzoic', 'FaceKicker', 'physicslover', 'wvenable', 'nicholasjbs', 'damoncali', 'chc', 'lionhearted', 'nicholasjbs', 'pbreit', 'fleitz', 'pseudonym', 'Goladus', 'klochner', 'Hitchhiker'], 'children': [{'names': ['solipsist', 'wnight', 'jarek', 'ypcx', 'thiefmaster', 'jfager', 'leot', 'fleitz', 'wnight'], 'children': [{'names': ['Roboprog', 'TeMPOraL', 'wvenable', 'phaus', 'yummyfajitas'], 'children': [{'names': ['ericd', 'yummyfajitas'], 'children': [{'names': ['leot'], 'children': None}]}]}, {'names': ['wtallis'], 'children': None}, {'names': ['praptak'], 'children': None}]}, {'names': ['dchest', 'viraptor', 'watmough', 'vacri'], 'children': [{'names': ['blahedo', 'kahirsch'], 'children': [{'names': ['wazoox', 'dchest'], 'children': [{'names': ['watmough'], 'children': None}]}, {'names': ['watmough'], 'children': None}]}, {'names': ['kulkarnic'], 'children': [{'names': ['evandena'], 'children': None}]}, {'names': ['jeltz'], 'children': [{'names': ['djeikyb'], 'children': [{'names': ['jeltz'], 'children': None}]}, {'names': ['nikropht'], 'children': None}]}, {'names': ['Tichy'], 'children': [{'names': ['dchest'], 'children': [{'names': ['jackowayed'], 'children': [{'names': ['dchest'], 'children': None}]}]}]}]}, {'names': ['FreakLegion'], 'children': None}, {'names': ['jaylevitt'], 'children': [{'names': ['pg'], 'children': [{'names': ['jaylevitt'], 'children': None}]}, {'names': ['nkurz'], 'children': None}]}, {'names': ['jQueryIsAwesome'], 'children': None}]}, {'names': ['mikeknoop', 'pwim', 'bootload', 'ColinHayhurst', 'nilsbunger', 'nantes', 'twakefield', 'anamax', 'Someone', 'rdl', 'wvenable', 'pwim', 'thomasgerbe', 'vaksel'], 'children': [{'names': ['GHFigs', 'pg', 'wallflower', 'forensic', 'pseudonym', 'pg', 'pg'], 'children': [{'names': ['OstiaAntica', 'zackattack', 'FireBeyond', 'zackattack', 'rdl'], 'children': [{'names': ['chunkybacon', 'forensic'], 'children': [{'names': ['mathattack'], 'children': None}]}]}, {'names': ['anamax'], 'children': None}]}, {'names': ['staunch', 'rdouble'], 'children': None}, {'names': ['jgw'], 'children': [{'names': ['dorianj'], 'children': None}]}]}, {'names': ['zethraeus', 'hasenj', 'edwardhotchkiss', 'temphn', 'bbuffone', 'comedian', 'vacri', 'hasenj', 'mathattack'], 'children': [{'names': ['jonnathanson', 'bobwebb', 'msellout', 'redthrowaway', 'Corrado', 'temphn'], 'children': [{'names': ['palish', 'jimbokun', 'MissBridgit'], 'children': None}, {'names': ['rdl'], 'children': [{'names': ['rdl'], 'children': None}]}, {'names': ['mathattack'], 'children': None}]}, {'names': ['dshah', 'mncolinlee', 'lsc', 'abrahamsen'], 'children': [{'names': ['vacri'], 'children': [{'names': ['eddmc'], 'children': None}]}, {'names': ['waqf'], 'children': [{'names': ['pestaa'], 'children': None}]}]}]}, {'names': ['tdfx', 'egiva', 'achompas', 'FluidDjango', 'egiva'], 'children': [{'names': ['thebrokencube'], 'children': None}]}, {'names': ['Shenglong', 'vesrin', 'cma', 'pbhjpbhj', 'vesrin'], 'children': [{'names': ['Unseelie', 'barmstrong'], 'children': [{'names': ['cma'], 'children': None}]}]}, {'names': ['Anechoic', 'schiptsov', 'schiptsov'], 'children': [{'names': ['evandena'], 'children': [{'names': ['wwweston'], 'children': None}]}]}, {'names': ['bobergstrom'], 'children': [{'names': ['libraryatnight'], 'children': [{'names': ['chirayuk'], 'children': [{'names': ['hobbes'], 'children': None}]}]}, {'names': ['treitnauer'], 'children': None}]}]}, {'names': ['malandrew', 'gerggerg', 'whycombine', 'pangrams', 'InclinedPlane', 'absconditus', 'rayval', 'jwallaceparker', 'wheels', 'astine', 'dabent', 'OpenAlgorithm', 'pg', 'jseliger', 'jsomers', 'jseliger', 'jonpaul', 'enra', 'brudgers', 'vailripper', 'dpritchett', 'Hitchhiker', 'abbasmehdi', 'LVB', 'frankdenbow', 'tpatke', 'Hitchhiker', 'johnnybgoode', 'Confusion', 'collint', 'ronnier', 'SureTheyDo', 'kschua', 'kenjackson', 'gizmo', 'redthrowaway', 'lhnz', 'joelhaus', 'Natsu', 'harshreality', 'TomOfTTB', 'fvryan', 'Aloisius', 'brador', 'zeratul', 'cageface', 'dpritchett', 'bradhe', 'staunch', 'tansey', 'Hitchhiker', 'tptacek', 'myoder', 'blacksmythe', 'tryitnow', 'dxbydt', 'yahelc', 'kds', 'jholman', 'cperciva', 'magitam', 'Mithrandir', 'gbog', 'dgregd', 'jpdoctor', 'jules', 'gahahaha', 'donalddesantis', 'jbooth', 'danssig', 'hkarthik', 'bravura', 'csomar', 'rms', 'dougaitken', 'andrewjshults', 'dabent', 'mkramlich', 'feral', 'hammock', 'Hitchhiker', 'rdl', 'jedberg', 'iconfinder', 'moeffju', 'jsomers', 'jseliger', 'Hitchhiker', 'tansey', 'oldstrangers', 'mfjordvald', 'brlewis', 'noodle', 'bhoung', 'jbermudes', 'drieddust', 'foxit', 'spoiledtechie', 'akharris', 'startupcto', 'rglover', 'robmueller', 'Natsu', 'dicroce', 'jcr', 'chunkybacon', 'bootload', 'zbruhnke', 'jrodgers', 'silverlake', 'ktrgardiner', 'Creyels'], 'children': [{'names': ['tptacek', 'tuna', 'pg', 'alexhaefner', 'lotharbot', 'pg', 'brlewis', 'pg', 'tptacek', 'rbanffy', 'tpatke', 'timjahn', 'arvinjoar', 'pg', 'pg', 'pg', 'pg', 'pg', 'chc', 'neworbit', 'pg', 'pg', 'pg', 'benatkin', 'ajross', 'amirmc', 'pg', 'bermanoid', 'efsavage', 'monopede', 'boyter', 'pg', 'pg', 'tokenadult', 'earbitscom', 'pg', 'pg', 'seanwoods', 'JangoSteve', 'pg', 'pg', 'pg', 'pg', 'tptacek', 'pg', 'davidbalbert', 'pg', 'MatthewB', 'pg', 'pg', 'toyg', 'kajecounterhack', 'pg', 'davedx'], 'children': [{'names': ['wheels', 'absconditus', 'joshuahays', 'pg', 'dolphenstein', 'dpritchett', 'Cushman', 'ronnier', 'larrys', 'gizmo', 'nantes', 'TomOfTTB', 'Aloisius', 'robryan', 'marshray', 'DanielBMarkham', 'euroclydon', 'thebigshane', 'philwelch', 'jules', 'jbooth', 'dougaitken', 'tung', 'bjoernlasseh', 'pg', 'jseliger', 'oldstrangers', 'noodle', 'blantonl', 'rglover', 'robmueller', 'Natsu', 'DilipJ'], 'children': [{'names': ['bascule', 'pg', 'mortenjorck', 'tptacek', 'Symmetry', 'SureTheyDo', 'PLejeck', 'Natsu', 'lrobb', 'prostoalex', 'ajross', 'DanielRibeiro', 'bermanoid', 'pg', 'aaronbrethorst', 'pg', 'pg', 'nicholasjbs'], 'children': [{'names': ['divtxt', 'Willwhatley', 'definitions', 'dpritchett', 'larrys', 'TomOfTTB', 'robryan', 'keeperofdakeys', 'Willwhatley', 'Isofarro'], 'children': [{'names': ['bascule', 'pg', 'gujk', 'tptacek', 'dcosson', 'pg'], 'children': [{'names': ['pilif', 'drusenko'], 'children': [{'names': ['bascule', 'codenerdz'], 'children': [{'names': ['drusenko', 'bascule'], 'children': None}]}, {'names': ['SimHacker'], 'children': None}]}]}, {'names': ['marshray', 'Natsu'], 'children': [{'names': ['pufuwozu'], 'children': None}]}, {'names': ['rdl'], 'children': None}, {'names': ['grout'], 'children': None}]}, {'names': ['DanielRibeiro'], 'children': [{'names': ['palish'], 'children': [{'names': ['DanielRibeiro'], 'children': [{'names': ['jvdongen'], 'children': None}]}]}]}, {'names': ['llambda'], 'children': None}]}, {'names': ['SureTheyDo', 'gbog', 'ithought', 'smanek', 'brador', 'phillmv', 'Unseelie', 'gbog', 'wavephorm'], 'children': [{'names': ['iwwr', 'robryan', 'larrys', 'pg'], 'children': [{'names': ['DuncanIdaho', 'phillmv'], 'children': None}, {'names': ['lancelee', 'khafra'], 'children': None}]}, {'names': ['jakeweineberg', 'gbog'], 'children': None}]}, {'names': ['abbasmehdi', 'minwcnt', 'khafra', 'vl'], 'children': [{'names': ['larrys'], 'children': None}]}, {'names': ['CHsurfer', 'ekianjo'], 'children': None}]}, {'names': ['slyall', 'rooshdi', 'drusenko', 'bubbleRefuge', 'fady', 'nnash', 'kmfrk', 'tansey', 'kamaal', 'wglb', 'minikomi', 'adrianscott', 'ForrestN', 'peterjs'], 'children': [{'names': ['SkyMarshal', 'rbanffy', 'moe', 'mixmax'], 'children': [{'names': ['tansey'], 'children': [{'names': ['pbhjpbhj'], 'children': [{'names': ['tansey'], 'children': None}]}]}, {'names': ['DanBC'], 'children': None}, {'names': ['riffraff'], 'children': [{'names': ['gwillen'], 'children': None}]}]}, {'names': ['gujk'], 'children': [{'names': ['rooshdi'], 'children': None}]}]}, {'names': ['jQueryIsAwesome', 'peterb', 'kenjackson', 'dlss', 'gbog', 'jasonlotito', 'kansando'], 'children': [{'names': ['gyardley', 'tansey', 'JangoSteve'], 'children': [{'names': ['Hitchhiker', 'gujk', 'saurik'], 'children': [{'names': ['tansey'], 'children': None}]}, {'names': ['pbhjpbhj', 'grandalf'], 'children': [{'names': ['akavi'], 'children': [{'names': ['pbhjpbhj'], 'children': None}]}]}, {'names': ['dlss'], 'children': None}]}, {'names': ['dextorious'], 'children': [{'names': ['dextorious'], 'children': None}]}]}, {'names': ['redthrowaway'], 'children': [{'names': ['ars'], 'children': [{'names': ['redthrowaway'], 'children': [{'names': ['ars'], 'children': [{'names': ['redthrowaway'], 'children': None}]}]}]}, {'names': ['mirkules'], 'children': [{'names': ['gruseom'], 'children': None}]}]}, {'names': ['staunch'], 'children': [{'names': ['Udo'], 'children': None}]}, {'names': ['grandalf'], 'children': None}, {'names': ['morrow'], 'children': [{'names': ['cpeterso'], 'children': None}]}, {'names': ['biot'], 'children': None}, {'names': ['Hitchhiker'], 'children': [{'names': ['tansey'], 'children': [{'names': ['adbge'], 'children': [{'names': ['cpeterso'], 'children': None}]}, {'names': ['Hitchhiker'], 'children': [{'names': ['anthonyb'], 'children': None}]}, {'names': ['knowtheory'], 'children': None}, {'names': ['pbhjpbhj'], 'children': None}]}]}, {'names': ['kevinalexbrown'], 'children': [{'names': ['alttag'], 'children': None}]}, {'names': ['davidw'], 'children': None}, {'names': ['PaulHoule'], 'children': [{'names': ['Udo'], 'children': None}]}, {'names': ['dhimes'], 'children': None}, {'names': ['SkyMarshal'], 'children': None}, {'names': ['ary'], 'children': None}, {'names': ['recoiledsnake'], 'children': None}, {'names': ['russell'], 'children': None}, {'names': ['Havoc'], 'children': None}, {'names': ['llambda'], 'children': None}, {'names': ['csl'], 'children': None}]}, {'names': ['adolfosousa', 'tlb', 'wgx', 'sskates', 'Shengster', 'malbs', 'MrMan', 'Timothee', 'IdeaVentura', 'andrewljohnson', 'natep', 'paul', 'robryan', 'pasbesoin', 'bfung', 'gbog', 'achompas', 'jacoblyles', 'llambda', 'rohern', 'InclinedPlane'], 'children': [{'names': ['absconditus', 'malandrew', 'metaprinter', 'ootachi', 'TomOfTTB', 'benatkin', 'cpeterso', 'ramanujan', 'mynegation', 'barrkel', 'feral'], 'children': [{'names': ['petercooper', 'tlb', 'natep', 'gbog', 'jpulgarin'], 'children': [{'names': ['patrickk', 'davidw'], 'children': [{'names': ['gbog'], 'children': [{'names': ['tuhin'], 'children': [{'names': ['gbog'], 'children': None}]}]}]}]}, {'names': ['officemonkey', 'phil', 'mustpax'], 'children': [{'names': ['TomOfTTB', 'metaprinter'], 'children': [{'names': ['DanBC'], 'children': None}, {'names': ['joelrunyon'], 'children': [{'names': ['TomOfTTB'], 'children': [{'names': ['Natsu'], 'children': None}]}]}, {'names': ['olozano'], 'children': [{'names': ['TomOfTTB'], 'children': [{'names': ['keen'], 'children': [{'names': ['stickfigure'], 'children': None}]}]}]}, {'names': ['ramblerman'], 'children': None}]}]}, {'names': ['artursapek', 'Mamady'], 'children': [{'names': ['TomOfTTB'], 'children': [{'names': ['artursapek'], 'children': [{'names': ['TomOfTTB'], 'children': [{'names': ['artursapek'], 'children': None}]}]}]}]}, {'names': ['kenjackson', 'joelrunyon'], 'children': [{'names': ['olozano', 'metaprinter'], 'children': [{'names': ['felipebueno'], 'children': None}]}, {'names': ['TomOfTTB'], 'children': [{'names': ['joelrunyon'], 'children': None}]}]}, {'names': ['olozano'], 'children': None}]}, {'names': ['orenmazor', 'mwsherman', 'chc'], 'children': None}, {'names': ['dredmorbius'], 'children': [{'names': ['gbog'], 'children': [{'names': ['mvts'], 'children': None}, {'names': ['dredmorbius'], 'children': None}]}]}, {'names': ['koenigdavidmj'], 'children': [{'names': ['sjwright'], 'children': None}, {'names': ['gbog'], 'children': [{'names': ['koenigdavidmj'], 'children': None}]}]}, {'names': ['matthewlehner'], 'children': None}, {'names': ['chugger'], 'children': [{'names': ['gbog'], 'children': [{'names': ['chugger'], 'children': [{'names': ['gbog'], 'children': [{'names': ['mung'], 'children': [{'names': ['gbog'], 'children': None}]}, {'names': ['chugger'], 'children': None}]}]}]}]}]}, {'names': ['ashishgandhi', 'chugger', 'Cushman', 'polyfractal', 'bermanoid', 'HerraBRE', 'jrockway', 'achompas', 'Bud', 'iaskwhy', 'jjcm', 'soham'], 'children': [{'names': ['TomOfTTB', 'seabee', 'Aloisius', 'dxbydt', 'achompas'], 'children': [{'names': ['achompas', 'HerraBRE', 'tripzilch', 'iaskwhy'], 'children': [{'names': ['Unseelie', 'achompas'], 'children': [{'names': ['jules', 'achompas'], 'children': None}, {'names': ['iaskwhy'], 'children': None}]}, {'names': ['achompas'], 'children': None}]}]}, {'names': ['untog'], 'children': [{'names': ['HerraBRE'], 'children': None}]}]}, {'names': ['wahnfrieden', 'kalvin', 'pbreit', 'ken', 'ChristianMarks'], 'children': None}, {'names': ['Natsu', 'robotresearcher', 'pseudonym', 'obtu'], 'children': [{'names': ['nextparadigms', 'vacri'], 'children': [{'names': ['ctwk'], 'children': None}]}, {'names': ['TomOfTTB'], 'children': [{'names': ['Natsu'], 'children': [{'names': ['TomOfTTB'], 'children': None}, {'names': ['JumpCrisscross'], 'children': None}]}, {'names': ['marcamillion'], 'children': [{'names': ['TomOfTTB'], 'children': [{'names': ['timknauf'], 'children': [{'names': ['TomOfTTB'], 'children': None}]}, {'names': ['Natsu'], 'children': [{'names': ['TomOfTTB'], 'children': [{'names': ['Natsu'], 'children': None}]}]}]}]}, {'names': ['zotz'], 'children': None}]}]}, {'names': ['radagaisus', 'mcn', 'kls', 'andrewem'], 'children': None}, {'names': ['meow', 'oconnore'], 'children': [{'names': ['TomOfTTB', 'JangoSteve'], 'children': [{'names': ['equalarrow'], 'children': None}]}]}, {'names': ['temphn', 'jasonwilk'], 'children': [{'names': ['TomOfTTB'], 'children': None}]}, {'names': ['nookiemonster', 'arctangent'], 'children': [{'names': ['TomOfTTB'], 'children': [{'names': ['JumpCrisscross'], 'children': None}]}]}, {'names': ['pbhjpbhj', 'Tichy'], 'children': None}, {'names': ['nl'], 'children': None}, {'names': ['cmars'], 'children': None}]}, {'names': ['pnathan', 'didntdrinkjuice', 'yason', 'jedberg', 'eaurouge', 'YuriNiyazov', 'stbullard', 'hyperbovine', 'Hitchhiker', 'Peroni', 'nassosdim', 'msumpter', 'xarien', 'strmpnk', 'rdl', 'trimbo', 'chipsy', 'badclient', 'ryandvm', 'hedgehog', 'podperson', 'citricsquid', 'ojbyrne', 'oldstrangers', 'algoshift', 'ChuckMcM', 'amored', 'markerdmann', 'paganel', 'staunch', 'antirez', 'esk', 'vidarh', 'msluyter', 'davidwparker', 'jbooth', 'YuriNiyazov', 'shareme', 'gallerytungsten', 'mattmanser', 'dpapathanasiou', 'cabalamat', 'zeratul', 'wicknicks', 'JangoSteve', 'mseebach', 'sbashyal', 'YuriNiyazov', 'DanielRibeiro', 'wavephorm', 'iamelgringo', 'pornel', 'staunch', 'trotsky', 'easp', 'balloot', 'marcamillion', 'absconditus', 'rokhayakebe', 'earbitscom', 'benrpeters', 'akkartik', 'nikcub', 'weebro'], 'children': [{'names': ['theorique', 'pg', 'impendia', 'pg', 'Jerky', 'pg', 'steventruong', 'pg', 'atarian', 'tomhoward', 'johngalt', 'potatolicious', 'mnoire', 'postnihilism', 'jhuni', 'pg', 'achompas', 'raldi', 'pbhjpbhj', 'salem', 'pg', 'tokenadult', 'eliben', 'DeusExMachina', 'PLejeck', 'pg', 'pg', 'pg', 'pg', 'pg', 'pg', 'bigohms', 'eatenbyagrue', 'htsh', 'pg', 'pg'], 'children': [{'names': ['baddox', 'pg', 'trimbo', 'SureTheyDo', 'jfarmer', 'oldstrangers', 'alanfalcon', 'sachinag', 'raldi', 'rdl', 'dkersten', 'samstave', 'staunch', 'ryanwaggoner', 'pg', 'absconditus', 'earbitscom'], 'children': [{'names': ['tptacek', 'jlind', 'kragen', 'philwelch', 'Macsenour', 'achompas', 'matthodan', 'samstave', 'pg', 'htsh', 'RichardBennett'], 'children': [{'names': ['sachinag', 'trimbo', 'pg', 'dkersten', 'bfe'], 'children': [{'names': ['steins', 'gbog', 'samstave'], 'children': [{'names': ['achompas'], 'children': None}]}]}, {'names': ['Estragon'], 'children': None}]}, {'names': ['extension', 'Natsu'], 'children': None}, {'names': ['thebrokencube'], 'children': [{'names': ['alanfalcon'], 'children': None}]}, {'names': ['logn'], 'children': None}, {'names': ['ctwk'], 'children': None}, {'names': ['mkramlich'], 'children': None}, {'names': ['potatolicious'], 'children': None}, {'names': ['Irfaan'], 'children': [{'names': ['cschwarm'], 'children': None}, {'names': ['JumpCrisscross'], 'children': [{'names': ['Irfaan'], 'children': [{'names': ['JumpCrisscross'], 'children': None}]}]}]}]}, {'names': ['strmpnk', 'pnathan', 'DilipJ', 'tlb', 'entangld', 'Kavan'], 'children': [{'names': ['pg', 'pg', 'achompas'], 'children': [{'names': ['illumen', 'Irfaan', 'strmpnk'], 'children': [{'names': ['achompas'], 'children': None}]}]}]}, {'names': ['Irfaan', 'IdeaVentura', 'viraptor', 'wavephorm'], 'children': [{'names': ['vidarh', 'pg'], 'children': [{'names': ['Irfaan', 'Hitchhiker'], 'children': [{'names': ['samstave', 'vidarh'], 'children': [{'names': ['Hitchhiker'], 'children': [{'names': ['samstave'], 'children': None}]}, {'names': ['Hitchhiker'], 'children': [{'names': ['samstave'], 'children': None}]}]}]}, {'names': ['wavephorm'], 'children': [{'names': ['webwright'], 'children': None}]}]}, {'names': ['bfe'], 'children': [{'names': ['wavephorm'], 'children': [{'names': ['Shenglong'], 'children': None}]}]}]}]}, {'names': ['storborg', 'forensic', 'pg', 'btilly', 'shawndrost', 'tptacek', 'forensic', 'coffeemug', 'jey'], 'children': [{'names': ['polshaw', 'bulletsvshumans', 'strmpnk', 'JangoSteve', 'earbitscom'], 'children': [{'names': ['JangoSteve', 'Roboprog'], 'children': None}]}, {'names': ['tptacek', 'vacri'], 'children': [{'names': ['jey'], 'children': [{'names': ['earbitscom'], 'children': [{'names': ['jey'], 'children': [{'names': ['jey'], 'children': None}, {'names': ['earbitscom'], 'children': [{'names': ['jey'], 'children': None}]}]}]}, {'names': ['RichardBennett'], 'children': None}]}]}]}, {'names': ['ohyes', 'hadronzoo', 'Typhon', 'bfe'], 'children': [{'names': ['Roboprog', 'stretchwithme', 'Quiark'], 'children': [{'names': ['anamax'], 'children': [{'names': ['cellularmitosis'], 'children': [{'names': ['iskander'], 'children': None}]}, {'names': ['madh'], 'children': None}]}]}, {'names': ['MetallicCloud'], 'children': None}]}, {'names': ['nkassis', 'ippisl', 'jasontan'], 'children': [{'names': ['SoftwareMaven', 'nvarsj'], 'children': None}]}, {'names': ['gabaix'], 'children': None}, {'names': ['DanBC'], 'children': [{'names': ['whatusername'], 'children': None}]}, {'names': ['marquis'], 'children': [{'names': ['nkassis'], 'children': [{'names': ['underwater'], 'children': [{'names': ['vidarh'], 'children': None}, {'names': ['landhar'], 'children': None}]}]}]}, {'names': ['pearle'], 'children': [{'names': ['natesm'], 'children': [{'names': ['pearle'], 'children': [{'names': ['eru'], 'children': [{'names': ['marshray'], 'children': [{'names': ['eru'], 'children': [{'names': ['marshray'], 'children': None}]}]}, {'names': ['pearle'], 'children': [{'names': ['eru'], 'children': None}]}]}]}]}, {'names': ['InclinedPlane'], 'children': None}]}]}, {'names': ['tibbon', 'projectileboy', 'larrys', 'moldbug', 'shoham', 'DigitalBison', 'mathattack', 'llambda', 'ilaksh', 'mcantelon', 'abiekatz', 'abiekatz', 'zachinglis', 'tzm', 'tlammens', 'pathdependent', 'bitwize', 'sampsonjs', 'benjlang', 'NelsonMinar', 'stevefarnworth', 'jeffool', 'dpapathanasiou', 'gujk', 'olefoo', 'joshcrews', 'shinykitten', 'klbarry', 'callmeed', 'haberman', 'eliben', 'mixmax', 'brlewis', 'Yhippa', 'shoham', 'rmc', 'Hitchhiker', 'lbrandy', 'tomcreighton', 'praptak', 'blantonl', 'deedorgreed', 'fduran', 'prakster', 'pasbesoin', 'adlep', 'Liu', 'joshuamarch'], 'children': [{'names': ['arctangent', 'aik', 'bomatson', 'SamReidHughes', 'wanorris', 'pg', 'krausejj', 'jasongullickson', 'polyfractal', 'pg', 'OstiaAntica', 'ajross', 'wahnfrieden', 'pg', 'pbhjpbhj', 'tptacek', 'rohern', 'pg'], 'children': [{'names': ['storborg', 'randomdata', 'abiekatz', 'brlewis', 'bane', 'arethuza', 'yummyfajitas', 'dantheman', 'joshu', 'blantonl'], 'children': [{'names': ['wanorris', 'namank', 'iand', 'tptacek', 'jayliew'], 'children': [{'names': ['joshu', 'einhverfr'], 'children': [{'names': ['tptacek'], 'children': None}]}]}, {'names': ['setzer'], 'children': None}]}, {'names': ['abiekatz', 'rayiner', 'drumdance', 'joebadmo', 'klbarry', 'gabrielroth', 'sraut'], 'children': [{'names': ['yummyfajitas', 'wanorris', 'pg'], 'children': [{'names': ['vadiml', 'einhverfr'], 'children': None}]}]}, {'names': ['kristofferR', 'tlammens', 'bambax'], 'children': [{'names': ['rahoulb', 'Fliko'], 'children': None}, {'names': ['Someone'], 'children': None}, {'names': ['nostromo'], 'children': [{'names': ['waqf'], 'children': [{'names': ['nostromo'], 'children': None}]}, {'names': ['hrktb'], 'children': [{'names': ['jrockway'], 'children': None}]}]}]}, {'names': ['beatle'], 'children': None}, {'names': ['Peaker'], 'children': None}]}, {'names': ['cooldeal', 'diffeomorph', 'zohebv', 'sliverstorm', 'jonnathanson', 'simonw'], 'children': [{'names': ['spazcat'], 'children': None}]}, {'names': ['jrockway', 'palish', 'fpgeek', 'rdouble'], 'children': [{'names': ['wanorris', 'eurohacker', 'landhar'], 'children': [{'names': ['randomdata'], 'children': None}]}, {'names': ['kabdib'], 'children': [{'names': ['tdfx'], 'children': [{'names': ['kabdib'], 'children': None}]}]}, {'names': ['Permit'], 'children': None}, {'names': ['cynest'], 'children': [{'names': ['palish'], 'children': [{'names': ['palish'], 'children': [{'names': ['Fliko'], 'children': None}, {'names': ['rayiner'], 'children': None}]}]}]}, {'names': ['brackin'], 'children': None}, {'names': ['robryan'], 'children': None}]}, {'names': ['chugger', 'ZeroGravitas'], 'children': [{'names': ['brc'], 'children': [{'names': ['Hitchhiker'], 'children': [{'names': ['ceejayoz'], 'children': [{'names': ['gujk'], 'children': [{'names': ['ceejayoz'], 'children': None}, {'names': ['eitland'], 'children': None}]}]}]}, {'names': ['kamkha'], 'children': None}, {'names': ['chugger'], 'children': [{'names': ['brc'], 'children': None}, {'names': ['danielharan'], 'children': None}, {'names': ['vidarh'], 'children': None}, {'names': ['glassx'], 'children': None}]}, {'names': ['ilamont'], 'children': [{'names': ['ilamont'], 'children': [{'names': ['uxp'], 'children': [{'names': ['bomanbot'], 'children': None}, {'names': ['gujk'], 'children': None}]}]}]}]}, {'names': ['ippisl'], 'children': [{'names': ['joelhooks'], 'children': None}, {'names': ['eupharis'], 'children': [{'names': ['ippisl'], 'children': None}]}]}, {'names': ['srdev'], 'children': [{'names': ['cas'], 'children': [{'names': ['srdev'], 'children': None}]}]}, {'names': ['vidar'], 'children': None}, {'names': ['Tsagadai'], 'children': [{'names': ['gujk'], 'children': None}]}, {'names': ['danssig'], 'children': [{'names': ['ceejayoz'], 'children': None}]}, {'names': ['tomkarlo'], 'children': None}]}]}, {'names': ['timtadh', 'Hexx', 'mcteapot', 'rbranson', 'Flenser', 'amnigos', 'jesusabdullah', 'nkurz', 'littlegiantcap', 'csomar', 'hr', 'erichocean', 'adrianpike', 'mikikian', 'gaelian', 'stouset', 'iloveyouocean', 'jfager', 'wanorris', 'Jabbles', 'Hyena', 'flocial', 'michaeldhopkins', 'TeMPOraL', 'adbge', 'volida', 'startupcto', 'biznickman', 'tmsh', 'MatthewPhillips', 'fizx', 'zby', 'arkitaip', 'RichardBennett', 'gsivil', 'iuguy'], 'children': [{'names': ['tptacek', 'untog', 'angstrom', 'pg', 'swombat', 'fredBuddemeyer', 'hasanove', 'tptacek', 'ahi', 'redthrowaway', 'jacquesm', 'CamperBob'], 'children': [{'names': ['btilly', 'adrianpike', 'jesusabdullah', 'dkarl', 'baddox', 'adbge', 'thomasgerbe', 'rvkennedy'], 'children': [{'names': ['redthrowaway', 'hasanove', 'kongqiu'], 'children': None}, {'names': ['babblefrog'], 'children': [{'names': ['yummyfajitas'], 'children': None}]}]}, {'names': ['HSO', 'robryan', 'nwatson', 'johnfn', 'frankwong'], 'children': [{'names': ['georgemcbay', 'jgesture'], 'children': None}]}, {'names': ['nodemaker', 'TeMPOraL'], 'children': [{'names': ['nodemaker'], 'children': None}]}, {'names': ['powertower'], 'children': None}]}, {'names': ['btilly', 'groggles', 'perokreco', 'viggity', 'MaxGabriel', 'freejack'], 'children': [{'names': ['andylei', 'chime', 'dctoedt', 'watmough'], 'children': [{'names': ['viggity'], 'children': None}, {'names': ['viggity'], 'children': None}]}]}, {'names': ['startupcto', 'gopi', 'biznickman'], 'children': [{'names': ['DavidSJ', 'tptacek'], 'children': [{'names': ['fleitz'], 'children': [{'names': ['cperciva'], 'children': None}]}, {'names': ['startupcto'], 'children': None}]}, {'names': ['ridiculous'], 'children': None}]}]}, {'names': ['DavidSJ', 'zackzackzack', 'ajpiano', 'tlogan', 'FredBrach', 'llambda', 'bootload', 'ImprovedSilence', 'jvandenbroeck', 'RossM', 'arohner', 'nhaehnle', 'SeanLuke', 'brlewis', 'TorKlingberg', 'walter', 'waterlesscloud', 'morsch', 'chunkybacon', 'sajid', 'kongqiu', 'viveksec', 'rwhitman', 'bcjordan', 'mathattack', 'bernieklein'], 'children': [{'names': ['rhizome', 'alessioalex', 'Confusion', 'SoftwareMaven', 'notahacker', 'dkarl', 'pg', 'irrumator', 'nodata', 'solipsist', 'yonasb'], 'children': [{'names': ['kreek', 'billpaetzke', 'cpeterso', 'bryanlarsen'], 'children': None}, {'names': ['kongqiu', 'saurik'], 'children': [{'names': ['irrumator'], 'children': [{'names': ['chrisbennet'], 'children': [{'names': ['pm'], 'children': None}]}]}]}, {'names': ['bryanh'], 'children': [{'names': ['eddmc'], 'children': [{'names': ['graeme'], 'children': None}]}]}, {'names': ['morsch'], 'children': [{'names': ['karlzt'], 'children': None}]}, {'names': ['knuthsprotege'], 'children': None}, {'names': ['alanl'], 'children': None}, {'names': ['gruseom'], 'children': None}, {'names': ['karlzt'], 'children': None}]}, {'names': ['andylei', 'jpwagner', 'Roboprog', 'jacobquick', 'simplyinfinity'], 'children': [{'names': ['SkyMarshal'], 'children': [{'names': ['tptacek'], 'children': None}, {'names': ['andylei'], 'children': [{'names': ['pbreit'], 'children': [{'names': ['andylei'], 'children': [{'names': ['puredemo'], 'children': None}]}]}]}]}]}]}, {'names': ['eli', 'timlindinct', 'tzm', 'EGreg', 'Historiopode', 'thaumaturgy', 'pragmatic', 'trevelyan', 'flipside', 'ronnier', 'wavephorm', 'skeptical', 'thomasgerbe', 'cconroy', 'jakeweineberg', 'yeikow'], 'children': [{'names': ['pg', 'SWtechie', 'trevelyan', 'pg', 'brlewis'], 'children': [{'names': ['mixmax', 'suivix', 'bmelton'], 'children': None}, {'names': ['recoiledsnake'], 'children': None}]}, {'names': ['davidwparker', 'frossie'], 'children': [{'names': ['pbhjpbhj', 'Vivtek'], 'children': None}]}, {'names': ['pbhjpbhj'], 'children': None}]}, {'names': ['runevault', 'cbs', 'mbesto', 'kelnos', 'btilly', 'Steko', 'femto', 'Sukotto', 'intellection', 'johngalt', 'scottallison'], 'children': [{'names': ['hkmurakami', 'cpeterso'], 'children': [{'names': ['runevault'], 'children': None}]}]}, {'names': ['kenjackson', 'away', 'flatline', 'ivankirigin', 'Steko', 'bodegajed', 'pdenya', 'WiseWeasel', 'husky'], 'children': [{'names': ['ramblerman', 'minikomi', 'dogwelder', 'tokenadult', 'castewart'], 'children': [{'names': ['polshaw', 'kenjackson', 'puredemo'], 'children': [{'names': ['WiseWeasel', 'brlewis'], 'children': None}]}, {'names': ['dereg'], 'children': None}]}, {'names': ['brlewis', 'rmc'], 'children': None}, {'names': ['afdssfda'], 'children': [{'names': ['pdenya'], 'children': None}]}]}, {'names': ['gvb', 'tansey', 'gsharm', 'omouse', 'watmough', 'burke', 'lwat', 'sthartle'], 'children': [{'names': ['wallflower', 'jemfinch'], 'children': [{'names': ['pbhjpbhj', 'jarek'], 'children': [{'names': ['jemfinch'], 'children': [{'names': ['vacri'], 'children': None}, {'names': ['pbhjpbhj'], 'children': None}]}]}]}, {'names': ['Goladus'], 'children': None}]}, {'names': ['danielharan', 'recampbell', 'RyanMcGreal', 'auxbuss', 'abbasmehdi', 'csantini'], 'children': [{'names': ['SoftwarePatent', 'startupcomment', 'EdSkrillex'], 'children': None}, {'names': ['dogwelder'], 'children': None}, {'names': ['forensic'], 'children': None}]}, {'names': ['jeffjarvis', 'aschoen', 'jshen', 'michaelochurch', 'davidw'], 'children': [{'names': ['chipsy'], 'children': None}]}, {'names': ['AdamTReineke', 'rbanffy', 'joshklein', 'pbhjpbhj', 'zallarak'], 'children': [{'names': ['tsotha', 'InclinedPlane', 'vacri', 'csallen'], 'children': [{'names': ['ajross', 'InclinedPlane'], 'children': [{'names': ['marshray', 'tsotha'], 'children': [{'names': ['InclinedPlane'], 'children': None}]}, {'names': ['cellularmitosis'], 'children': None}]}, {'names': ['Roboprog', 'AdamTReineke'], 'children': [{'names': ['egiva'], 'children': None}]}]}, {'names': ['sitkack'], 'children': None}]}, {'names': ['rjstatic', 'joebadmo', 'Hyena', 'johnohara', 'radicalbyte'], 'children': None}, {'names': ['pbreit', 'polshaw', 'cHalgan', 'samstave', 'damoncali'], 'children': None}, {'names': ['trunnell', 'zwischenzug', 'davidu', 'jessriedel', 'Sato'], 'children': [{'names': ['jgesture'], 'children': None}, {'names': ['lukesandberg'], 'children': None}]}, {'names': ['byrneseyeview', 'cma', 'philwelch', 'Cushman'], 'children': [{'names': ['pg'], 'children': [{'names': ['chc'], 'children': None}]}, {'names': ['wmf'], 'children': [{'names': ['vacri'], 'children': None}]}]}, {'names': ['dennisgorelik', 'bluedanieru', 'sabat'], 'children': None}, {'names': ['kqueue', 'msellout', 'jonkelly'], 'children': [{'names': ['rkudeshi'], 'children': None}]}, {'names': ['jemfinch', 'eru', 'Iv'], 'children': None}, {'names': ['reinhardt', 'zallarak', 'phuff'], 'children': [{'names': ['SoftwareMaven'], 'children': None}]}, {'names': ['vaksel', 'beefman', 'eande'], 'children': [{'names': ['baddox', 'scarmig'], 'children': [{'names': ['OWaz'], 'children': None}]}, {'names': ['csomar'], 'children': [{'names': ['polshaw'], 'children': [{'names': ['jgesture'], 'children': None}]}, {'names': ['nfriedly'], 'children': None}]}]}, {'names': ['cosgroveb', 'Duff'], 'children': None}, {'names': ['cpeterso', 'pauljonas'], 'children': [{'names': ['tokenadult'], 'children': None}]}, {'names': ['brudgers', 'dmarinoc'], 'children': [{'names': ['rpwilcox'], 'children': None}]}, {'names': ['Unseelie'], 'children': None}, {'names': ['RoboTeddy'], 'children': None}, {'names': ['Vitaly'], 'children': None}, {'names': ['curt'], 'children': None}, {'names': ['troystribling'], 'children': [{'names': ['randomdata'], 'children': None}]}, {'names': ['Detrus'], 'children': None}, {'names': ['cwb'], 'children': None}, {'names': ['systems'], 'children': None}, {'names': ['jtwb'], 'children': None}, {'names': ['threnody'], 'children': None}, {'names': ['BuddhaSource'], 'children': None}, {'names': ['moe'], 'children': None}, {'names': ['xal'], 'children': None}, {'names': ['bulletsvshumans'], 'children': None}, {'names': ['spiantino'], 'children': None}, {'names': ['natmaster'], 'children': [{'names': ['raldi'], 'children': None}]}, {'names': ['clistctrl'], 'children': [{'names': ['randomdata'], 'children': [{'names': ['clistctrl'], 'children': None}]}]}]}
View
25 css/tipsy.css
@@ -0,0 +1,25 @@
+.tipsy { font-size: 10px; position: absolute; padding: 5px; z-index: 100000; }
+ .tipsy-inner { background-color: #000; color: #FFF; max-width: 200px; padding: 5px 8px 4px 8px; text-align: center; }
+
+ /* Rounded corners */
+ .tipsy-inner { border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
+
+ /* Uncomment for shadow */
+ /*.tipsy-inner { box-shadow: 0 0 5px #000000; -webkit-box-shadow: 0 0 5px #000000; -moz-box-shadow: 0 0 5px #000000; }*/
+
+ .tipsy-arrow { position: absolute; width: 0; height: 0; line-height: 0; border: 5px dashed #000; }
+
+ /* Rules to colour arrows */
+ .tipsy-arrow-n { border-bottom-color: #000; }
+ .tipsy-arrow-s { border-top-color: #000; }
+ .tipsy-arrow-e { border-left-color: #000; }
+ .tipsy-arrow-w { border-right-color: #000; }
+
+ .tipsy-n .tipsy-arrow { top: 0px; left: 50%; margin-left: -5px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent; }
+ .tipsy-nw .tipsy-arrow { top: 0; left: 10px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent;}
+ .tipsy-ne .tipsy-arrow { top: 0; right: 10px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent;}
+ .tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
+ .tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
+ .tipsy-se .tipsy-arrow { bottom: 0; right: 10px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
+ .tipsy-e .tipsy-arrow { right: 0; top: 50%; margin-top: -5px; border-left-style: solid; border-right: none; border-top-color: transparent; border-bottom-color: transparent; }
+ .tipsy-w .tipsy-arrow { left: 0; top: 50%; margin-top: -5px; border-right-style: solid; border-left: none; border-top-color: transparent; border-bottom-color: transparent; }
View
19 css/tree.css
@@ -0,0 +1,19 @@
+.node circle {
+ fill: #fff;
+ stroke: black;
+ stroke-width: 1.5px;
+}
+
+.node {
+ font: 10px sans-serif;
+}
+
+svg {
+ background: #F60
+}
+
+.link {
+ fill: none;
+ stroke: #ccc;
+ stroke-width: 1.5px;
+}
View
22 index.html
@@ -21,13 +21,16 @@
<!-- Place favicon.ico and apple-touch-icon.png in the root directory: mathiasbynens.be/notes/touch-icons -->
<link rel="stylesheet" href="css/style.css">
+ <link rel="stylesheet" href="css/tree.css">
+ <link rel="stylesheet" href="css/tipsy.css">
<!-- More ideas for your <head> here: h5bp.com/d/head-Tips -->
<!-- All JavaScript at the bottom, except this Modernizr build.
Modernizr enables HTML5 elements & feature detects for optimal performance.
Create your own custom Modernizr build: www.modernizr.com/download/ -->
<script src="js/libs/modernizr-2.0.6.min.js"></script>
+
</head>
<body>
@@ -38,7 +41,7 @@
</header>
<div role="main">
-
+ <div id="chart"></div>
</div>
<footer>
@@ -55,18 +58,9 @@
<!-- scripts concatenated and minified via build script -->
<script defer src="js/plugins.js"></script>
<script defer src="js/script.js"></script>
- <!-- end scripts -->
-
-
- <!-- Asynchronous Google Analytics snippet. Change UA-XXXXX-X to be your site's ID.
- mathiasbynens.be/notes/async-analytics-snippet -->
- <script>
- var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
- (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
- g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
- s.parentNode.insertBefore(g,s)}(document,'script'));
- </script>
-
-
+ <script type="text/javascript" src="js/libs/d3.js"></script>
+ <script type="text/javascript" src="js/libs/d3.layout.js"></script>
+ <script src="js/libs/jquery.tipsy.js"></script>
+ <!-- end scripts -->
</body>
</html>
View
4,762 js/libs/d3.js
4,762 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
1,881 js/libs/d3.layout.js
@@ -0,0 +1,1881 @@
+(function(){d3.layout = {};
+// Implements hierarchical edge bundling using Holten's algorithm. For each
+// input link, a path is computed that travels through the tree, up the parent
+// hierarchy to the least common ancestor, and then back down to the destination
+// node. Each path is simply an array of nodes.
+d3.layout.bundle = function() {
+ return function(links) {
+ var paths = [],
+ i = -1,
+ n = links.length;
+ while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
+ return paths;
+ };
+};
+
+function d3_layout_bundlePath(link) {
+ var start = link.source,
+ end = link.target,
+ lca = d3_layout_bundleLeastCommonAncestor(start, end),
+ points = [start];
+ while (start !== lca) {
+ start = start.parent;
+ points.push(start);
+ }
+ var k = points.length;
+ while (end !== lca) {
+ points.splice(k, 0, end);
+ end = end.parent;
+ }
+ return points;
+}
+
+function d3_layout_bundleAncestors(node) {
+ var ancestors = [],
+ parent = node.parent;
+ while (parent != null) {
+ ancestors.push(node);
+ node = parent;
+ parent = parent.parent;
+ }
+ ancestors.push(node);
+ return ancestors;
+}
+
+function d3_layout_bundleLeastCommonAncestor(a, b) {
+ if (a === b) return a;
+ var aNodes = d3_layout_bundleAncestors(a),
+ bNodes = d3_layout_bundleAncestors(b),
+ aNode = aNodes.pop(),
+ bNode = bNodes.pop(),
+ sharedNode = null;
+ while (aNode === bNode) {
+ sharedNode = aNode;
+ aNode = aNodes.pop();
+ bNode = bNodes.pop();
+ }
+ return sharedNode;
+}
+d3.layout.chord = function() {
+ var chord = {},
+ chords,
+ groups,
+ matrix,
+ n,
+ padding = 0,
+ sortGroups,
+ sortSubgroups,
+ sortChords;
+
+ function relayout() {
+ var subgroups = {},
+ groupSums = [],
+ groupIndex = d3.range(n),
+ subgroupIndex = [],
+ k,
+ x,
+ x0,
+ i,
+ j;
+
+ chords = [];
+ groups = [];
+
+ // Compute the sum.
+ k = 0, i = -1; while (++i < n) {
+ x = 0, j = -1; while (++j < n) {
+ x += matrix[i][j];
+ }
+ groupSums.push(x);
+ subgroupIndex.push(d3.range(n));
+ k += x;
+ }
+
+ // Sort groups…
+ if (sortGroups) {
+ groupIndex.sort(function(a, b) {
+ return sortGroups(groupSums[a], groupSums[b]);
+ });
+ }
+
+ // Sort subgroups…
+ if (sortSubgroups) {
+ subgroupIndex.forEach(function(d, i) {
+ d.sort(function(a, b) {
+ return sortSubgroups(matrix[i][a], matrix[i][b]);
+ });
+ });
+ }
+
+ // Convert the sum to scaling factor for [0, 2pi].
+ // TODO Allow start and end angle to be specified.
+ // TODO Allow padding to be specified as percentage?
+ k = (2 * Math.PI - padding * n) / k;
+
+ // Compute the start and end angle for each group and subgroup.
+ // Note: Opera has a bug reordering object literal properties!
+ x = 0, i = -1; while (++i < n) {
+ x0 = x, j = -1; while (++j < n) {
+ var di = groupIndex[i],
+ dj = subgroupIndex[di][j],
+ v = matrix[di][dj],
+ a0 = x,
+ a1 = x += v * k;
+ subgroups[di + "-" + dj] = {
+ index: di,
+ subindex: dj,
+ startAngle: a0,
+ endAngle: a1,
+ value: v
+ };
+ }
+ groups.push({
+ index: di,
+ startAngle: x0,
+ endAngle: x,
+ value: (x - x0) / k
+ });
+ x += padding;
+ }
+
+ // Generate chords for each (non-empty) subgroup-subgroup link.
+ i = -1; while (++i < n) {
+ j = i - 1; while (++j < n) {
+ var source = subgroups[i + "-" + j],
+ target = subgroups[j + "-" + i];
+ if (source.value || target.value) {
+ chords.push(source.value < target.value
+ ? {source: target, target: source}
+ : {source: source, target: target});
+ }
+ }
+ }
+
+ if (sortChords) resort();
+ }
+
+ function resort() {
+ chords.sort(function(a, b) {
+ return sortChords(
+ (a.source.value + a.target.value) / 2,
+ (b.source.value + b.target.value) / 2);
+ });
+ }
+
+ chord.matrix = function(x) {
+ if (!arguments.length) return matrix;
+ n = (matrix = x) && matrix.length;
+ chords = groups = null;
+ return chord;
+ };
+
+ chord.padding = function(x) {
+ if (!arguments.length) return padding;
+ padding = x;
+ chords = groups = null;
+ return chord;
+ };
+
+ chord.sortGroups = function(x) {
+ if (!arguments.length) return sortGroups;
+ sortGroups = x;
+ chords = groups = null;
+ return chord;
+ };
+
+ chord.sortSubgroups = function(x) {
+ if (!arguments.length) return sortSubgroups;
+ sortSubgroups = x;
+ chords = null;
+ return chord;
+ };
+
+ chord.sortChords = function(x) {
+ if (!arguments.length) return sortChords;
+ sortChords = x;
+ if (chords) resort();
+ return chord;
+ };
+
+ chord.chords = function() {
+ if (!chords) relayout();
+ return chords;
+ };
+
+ chord.groups = function() {
+ if (!groups) relayout();
+ return groups;
+ };
+
+ return chord;
+};
+// A rudimentary force layout using Gauss-Seidel.
+d3.layout.force = function() {
+ var force = {},
+ event = d3.dispatch("tick"),
+ size = [1, 1],
+ drag,
+ alpha,
+ friction = .9,
+ linkDistance = d3_layout_forceLinkDistance,
+ linkStrength = d3_layout_forceLinkStrength,
+ charge = -30,
+ gravity = .1,
+ theta = .8,
+ interval,
+ nodes = [],
+ links = [],
+ distances,
+ strengths,
+ charges;
+
+ function repulse(node) {
+ return function(quad, x1, y1, x2, y2) {
+ if (quad.point !== node) {
+ var dx = quad.cx - node.x,
+ dy = quad.cy - node.y,
+ dn = 1 / Math.sqrt(dx * dx + dy * dy);
+
+ /* Barnes-Hut criterion. */
+ if ((x2 - x1) * dn < theta) {
+ var k = quad.charge * dn * dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ return true;
+ }
+
+ if (quad.point && isFinite(dn)) {
+ var k = quad.pointCharge * dn * dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ }
+ }
+ return !quad.charge;
+ };
+ }
+
+ function tick() {
+ var n = nodes.length,
+ m = links.length,
+ q,
+ i, // current index
+ o, // current object
+ s, // current source
+ t, // current target
+ l, // current distance
+ k, // current force
+ x, // x-distance
+ y; // y-distance
+
+ // gauss-seidel relaxation for links
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ s = o.source;
+ t = o.target;
+ x = t.x - s.x;
+ y = t.y - s.y;
+ if (l = (x * x + y * y)) {
+ l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
+ x *= l;
+ y *= l;
+ t.x -= x * (k = s.weight / (t.weight + s.weight));
+ t.y -= y * k;
+ s.x += x * (k = 1 - k);
+ s.y += y * k;
+ }
+ }
+
+ // apply gravity forces
+ if (k = alpha * gravity) {
+ x = size[0] / 2;
+ y = size[1] / 2;
+ i = -1; if (k) while (++i < n) {
+ o = nodes[i];
+ o.x += (x - o.x) * k;
+ o.y += (y - o.y) * k;
+ }
+ }
+
+ // compute quadtree center of mass and apply charge forces
+ if (charge) {
+ d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
+ i = -1; while (++i < n) {
+ if (!(o = nodes[i]).fixed) {
+ q.visit(repulse(o));
+ }
+ }
+ }
+
+ // position verlet integration
+ i = -1; while (++i < n) {
+ o = nodes[i];
+ if (o.fixed) {
+ o.x = o.px;
+ o.y = o.py;
+ } else {
+ o.x -= (o.px - (o.px = o.x)) * friction;
+ o.y -= (o.py - (o.py = o.y)) * friction;
+ }
+ }
+
+ event.tick({type: "tick", alpha: alpha});
+
+ // simulated annealing, basically
+ return (alpha *= .99) < .005;
+ }
+
+ force.nodes = function(x) {
+ if (!arguments.length) return nodes;
+ nodes = x;
+ return force;
+ };
+
+ force.links = function(x) {
+ if (!arguments.length) return links;
+ links = x;
+ return force;
+ };
+
+ force.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return force;
+ };
+
+ force.linkDistance = function(x) {
+ if (!arguments.length) return linkDistance;
+ linkDistance = d3.functor(x);
+ return force;
+ };
+
+ // For backwards-compatibility.
+ force.distance = force.linkDistance;
+
+ force.linkStrength = function(x) {
+ if (!arguments.length) return linkStrength;
+ linkStrength = d3.functor(x);
+ return force;
+ };
+
+ force.friction = function(x) {
+ if (!arguments.length) return friction;
+ friction = x;
+ return force;
+ };
+
+ force.charge = function(x) {
+ if (!arguments.length) return charge;
+ charge = typeof x === "function" ? x : +x;
+ return force;
+ };
+
+ force.gravity = function(x) {
+ if (!arguments.length) return gravity;
+ gravity = x;
+ return force;
+ };
+
+ force.theta = function(x) {
+ if (!arguments.length) return theta;
+ theta = x;
+ return force;
+ };
+
+ force.start = function() {
+ var i,
+ j,
+ n = nodes.length,
+ m = links.length,
+ w = size[0],
+ h = size[1],
+ neighbors,
+ o;
+
+ for (i = 0; i < n; ++i) {
+ (o = nodes[i]).index = i;
+ o.weight = 0;
+ }
+
+ distances = [];
+ strengths = [];
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ if (typeof o.source == "number") o.source = nodes[o.source];
+ if (typeof o.target == "number") o.target = nodes[o.target];
+ distances[i] = linkDistance.call(this, o, i);
+ strengths[i] = linkStrength.call(this, o, i);
+ ++o.source.weight;
+ ++o.target.weight;
+ }
+
+ for (i = 0; i < n; ++i) {
+ o = nodes[i];
+ if (isNaN(o.x)) o.x = position("x", w);
+ if (isNaN(o.y)) o.y = position("y", h);
+ if (isNaN(o.px)) o.px = o.x;
+ if (isNaN(o.py)) o.py = o.y;
+ }
+
+ charges = [];
+ if (typeof charge === "function") {
+ for (i = 0; i < n; ++i) {
+ charges[i] = +charge.call(this, nodes[i], i);
+ }
+ } else {
+ for (i = 0; i < n; ++i) {
+ charges[i] = charge;
+ }
+ }
+
+ // initialize node position based on first neighbor
+ function position(dimension, size) {
+ var neighbors = neighbor(i),
+ j = -1,
+ m = neighbors.length,
+ x;
+ while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x;
+ return Math.random() * size;
+ }
+
+ // initialize neighbors lazily
+ function neighbor() {
+ if (!neighbors) {
+ neighbors = [];
+ for (j = 0; j < n; ++j) {
+ neighbors[j] = [];
+ }
+ for (j = 0; j < m; ++j) {
+ var o = links[j];
+ neighbors[o.source.index].push(o.target);
+ neighbors[o.target.index].push(o.source);
+ }
+ }
+ return neighbors[i];
+ }
+
+ return force.resume();
+ };
+
+ force.resume = function() {
+ alpha = .1;
+ d3.timer(tick);
+ return force;
+ };
+
+ force.stop = function() {
+ alpha = 0;
+ return force;
+ };
+
+ // use `node.call(force.drag)` to make nodes draggable
+ force.drag = function() {
+ if (!drag) drag = d3.behavior.drag()
+ .origin(Object)
+ .on("dragstart", dragstart)
+ .on("drag", d3_layout_forceDrag)
+ .on("dragend", d3_layout_forceDragEnd);
+
+ this.on("mouseover.force", d3_layout_forceDragOver)
+ .on("mouseout.force", d3_layout_forceDragOut)
+ .call(drag);
+ };
+
+ function dragstart(d) {
+ d3_layout_forceDragOver(d3_layout_forceDragNode = d);
+ d3_layout_forceDragForce = force;
+ }
+
+ return d3.rebind(force, event, "on");
+};
+
+var d3_layout_forceDragForce,
+ d3_layout_forceDragNode;
+
+function d3_layout_forceDragOver(d) {
+ d.fixed |= 2;
+}
+
+function d3_layout_forceDragOut(d) {
+ if (d !== d3_layout_forceDragNode) d.fixed &= 1;
+}
+
+function d3_layout_forceDragEnd() {
+ d3_layout_forceDrag();
+ d3_layout_forceDragNode.fixed &= 1;
+ d3_layout_forceDragForce = d3_layout_forceDragNode = null;
+}
+
+function d3_layout_forceDrag() {
+ d3_layout_forceDragNode.px = d3.event.x;
+ d3_layout_forceDragNode.py = d3.event.y;
+ d3_layout_forceDragForce.resume(); // restart annealing
+}
+
+function d3_layout_forceAccumulate(quad, alpha, charges) {
+ var cx = 0,
+ cy = 0;
+ quad.charge = 0;
+ if (!quad.leaf) {
+ var nodes = quad.nodes,
+ n = nodes.length,
+ i = -1,
+ c;
+ while (++i < n) {
+ c = nodes[i];
+ if (c == null) continue;
+ d3_layout_forceAccumulate(c, alpha, charges);
+ quad.charge += c.charge;
+ cx += c.charge * c.cx;
+ cy += c.charge * c.cy;
+ }
+ }
+ if (quad.point) {
+ // jitter internal nodes that are coincident
+ if (!quad.leaf) {
+ quad.point.x += Math.random() - .5;
+ quad.point.y += Math.random() - .5;
+ }
+ var k = alpha * charges[quad.point.index];
+ quad.charge += quad.pointCharge = k;
+ cx += k * quad.point.x;
+ cy += k * quad.point.y;
+ }
+ quad.cx = cx / quad.charge;
+ quad.cy = cy / quad.charge;
+}
+
+function d3_layout_forceLinkDistance(link) {
+ return 20;
+}
+
+function d3_layout_forceLinkStrength(link) {
+ return 1;
+}
+d3.layout.partition = function() {
+ var hierarchy = d3.layout.hierarchy(),
+ size = [1, 1]; // width, height
+
+ function position(node, x, dx, dy) {
+ var children = node.children;
+ node.x = x;
+ node.y = node.depth * dy;
+ node.dx = dx;
+ node.dy = dy;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n,
+ c,
+ d;
+ dx = node.value ? dx / node.value : 0;
+ while (++i < n) {
+ position(c = children[i], x, d = c.value * dx, dy);
+ x += d;
+ }
+ }
+ }
+
+ function depth(node) {
+ var children = node.children,
+ d = 0;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n;
+ while (++i < n) d = Math.max(d, depth(children[i]));
+ }
+ return 1 + d;
+ }
+
+ function partition(d, i) {
+ var nodes = hierarchy.call(this, d, i);
+ position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
+ return nodes;
+ }
+
+ partition.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return partition;
+ };
+
+ return d3_layout_hierarchyRebind(partition, hierarchy);
+};
+d3.layout.pie = function() {
+ var value = Number,
+ sort = d3_layout_pieSortByValue,
+ startAngle = 0,
+ endAngle = 2 * Math.PI;
+
+ function pie(data, i) {
+
+ // Compute the numeric values for each data element.
+ var values = data.map(function(d, i) { return +value.call(pie, d, i); });
+
+ // Compute the start angle.
+ var a = +(typeof startAngle === "function"
+ ? startAngle.apply(this, arguments)
+ : startAngle);
+
+ // Compute the angular scale factor: from value to radians.
+ var k = ((typeof endAngle === "function"
+ ? endAngle.apply(this, arguments)
+ : endAngle) - startAngle)
+ / d3.sum(values);
+
+ // Optionally sort the data.
+ var index = d3.range(data.length);
+ if (sort != null) index.sort(sort === d3_layout_pieSortByValue
+ ? function(i, j) { return values[j] - values[i]; }
+ : function(i, j) { return sort(data[i], data[j]); });
+
+ // Compute the arcs!
+ // They are stored in the original data's order.
+ var arcs = [];
+ index.forEach(function(i) {
+ arcs[i] = {
+ data: data[i],
+ value: d = values[i],
+ startAngle: a,
+ endAngle: a += d * k
+ };
+ });
+ return arcs;
+ }
+
+ /**
+ * Specifies the value function *x*, which returns a nonnegative numeric value
+ * for each datum. The default value function is `Number`. The value function
+ * is passed two arguments: the current datum and the current index.
+ */
+ pie.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return pie;
+ };
+
+ /**
+ * Specifies a sort comparison operator *x*. The comparator is passed two data
+ * elements from the data array, a and b; it returns a negative value if a is
+ * less than b, a positive value if a is greater than b, and zero if a equals
+ * b.
+ */
+ pie.sort = function(x) {
+ if (!arguments.length) return sort;
+ sort = x;
+ return pie;
+ };
+
+ /**
+ * Specifies the overall start angle of the pie chart. Defaults to 0. The
+ * start angle can be specified either as a constant or as a function; in the
+ * case of a function, it is evaluated once per array (as opposed to per
+ * element).
+ */
+ pie.startAngle = function(x) {
+ if (!arguments.length) return startAngle;
+ startAngle = x;
+ return pie;
+ };
+
+ /**
+ * Specifies the overall end angle of the pie chart. Defaults to 2π. The
+ * end angle can be specified either as a constant or as a function; in the
+ * case of a function, it is evaluated once per array (as opposed to per
+ * element).
+ */
+ pie.endAngle = function(x) {
+ if (!arguments.length) return endAngle;
+ endAngle = x;
+ return pie;
+ };
+
+ return pie;
+};
+
+var d3_layout_pieSortByValue = {};
+// data is two-dimensional array of x,y; we populate y0
+d3.layout.stack = function() {
+ var values = Object,
+ order = d3_layout_stackOrders["default"],
+ offset = d3_layout_stackOffsets["zero"],
+ out = d3_layout_stackOut,
+ x = d3_layout_stackX,
+ y = d3_layout_stackY;
+
+ function stack(data, index) {
+
+ // Convert series to canonical two-dimensional representation.
+ var series = data.map(function(d, i) {
+ return values.call(stack, d, i);
+ });
+
+ // Convert each series to canonical [[x,y]] representation.
+ var points = series.map(function(d, i) {
+ return d.map(function(v, i) {
+ return [x.call(stack, v, i), y.call(stack, v, i)];
+ });
+ });
+
+ // Compute the order of series, and permute them.
+ var orders = order.call(stack, points, index);
+ series = d3.permute(series, orders);
+ points = d3.permute(points, orders);
+
+ // Compute the baseline…
+ var offsets = offset.call(stack, points, index);
+
+ // And propagate it to other series.
+ var n = series.length,
+ m = series[0].length,
+ i,
+ j,
+ o;
+ for (j = 0; j < m; ++j) {
+ out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
+ for (i = 1; i < n; ++i) {
+ out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
+ }
+ }
+
+ return data;
+ }
+
+ stack.values = function(x) {
+ if (!arguments.length) return values;
+ values = x;
+ return stack;
+ };
+
+ stack.order = function(x) {
+ if (!arguments.length) return order;
+ order = typeof x === "function" ? x : d3_layout_stackOrders[x];
+ return stack;
+ };
+
+ stack.offset = function(x) {
+ if (!arguments.length) return offset;
+ offset = typeof x === "function" ? x : d3_layout_stackOffsets[x];
+ return stack;
+ };
+
+ stack.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ return stack;
+ };
+
+ stack.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ return stack;
+ };
+
+ stack.out = function(z) {
+ if (!arguments.length) return out;
+ out = z;
+ return stack;
+ };
+
+ return stack;
+}
+
+function d3_layout_stackX(d) {
+ return d.x;
+}
+
+function d3_layout_stackY(d) {
+ return d.y;
+}
+
+function d3_layout_stackOut(d, y0, y) {
+ d.y0 = y0;
+ d.y = y;
+}
+
+var d3_layout_stackOrders = {
+
+ "inside-out": function(data) {
+ var n = data.length,
+ i,
+ j,
+ max = data.map(d3_layout_stackMaxIndex),
+ sums = data.map(d3_layout_stackReduceSum),
+ index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }),
+ top = 0,
+ bottom = 0,
+ tops = [],
+ bottoms = [];
+ for (i = 0; i < n; ++i) {
+ j = index[i];
+ if (top < bottom) {
+ top += sums[j];
+ tops.push(j);
+ } else {
+ bottom += sums[j];
+ bottoms.push(j);
+ }
+ }
+ return bottoms.reverse().concat(tops);
+ },
+
+ "reverse": function(data) {
+ return d3.range(data.length).reverse();
+ },
+
+ "default": function(data) {
+ return d3.range(data.length);
+ }
+
+};
+
+var d3_layout_stackOffsets = {
+
+ "silhouette": function(data) {
+ var n = data.length,
+ m = data[0].length,
+ sums = [],
+ max = 0,
+ i,
+ j,
+ o,
+ y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o > max) max = o;
+ sums.push(o);
+ }
+ for (j = 0; j < m; ++j) {
+ y0[j] = (max - sums[j]) / 2;
+ }
+ return y0;
+ },
+
+ "wiggle": function(data) {
+ var n = data.length,
+ x = data[0],
+ m = x.length,
+ max = 0,
+ i,
+ j,
+ k,
+ s1,
+ s2,
+ s3,
+ dx,
+ o,
+ o0,
+ y0 = [];
+ y0[0] = o = o0 = 0;
+ for (j = 1; j < m; ++j) {
+ for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
+ for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
+ for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
+ s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
+ }
+ s2 += s3 * data[i][j][1];
+ }
+ y0[j] = o -= s1 ? s2 / s1 * dx : 0;
+ if (o < o0) o0 = o;
+ }
+ for (j = 0; j < m; ++j) y0[j] -= o0;
+ return y0;
+ },
+
+ "expand": function(data) {
+ var n = data.length,
+ m = data[0].length,
+ k = 1 / n,
+ i,
+ j,
+ o,
+ y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o) for (i = 0; i < n; i++) data[i][j][1] /= o;
+ else for (i = 0; i < n; i++) data[i][j][1] = k;
+ }
+ for (j = 0; j < m; ++j) y0[j] = 0;
+ return y0;
+ },
+
+ "zero": function(data) {
+ var j = -1,
+ m = data[0].length,
+ y0 = [];
+ while (++j < m) y0[j] = 0;
+ return y0;
+ }
+
+};
+
+function d3_layout_stackMaxIndex(array) {
+ var i = 1,
+ j = 0,
+ v = array[0][1],
+ k,
+ n = array.length;
+ for (; i < n; ++i) {
+ if ((k = array[i][1]) > v) {
+ j = i;
+ v = k;
+ }
+ }
+ return j;
+}
+
+function d3_layout_stackReduceSum(d) {
+ return d.reduce(d3_layout_stackSum, 0);
+}
+
+function d3_layout_stackSum(p, d) {
+ return p + d[1];
+}
+d3.layout.histogram = function() {
+ var frequency = true,
+ valuer = Number,
+ ranger = d3_layout_histogramRange,
+ binner = d3_layout_histogramBinSturges;
+
+ function histogram(data, i) {
+ var bins = [],
+ values = data.map(valuer, this),
+ range = ranger.call(this, values, i),
+ thresholds = binner.call(this, range, values, i),
+ bin,
+ i = -1,
+ n = values.length,
+ m = thresholds.length - 1,
+ k = frequency ? 1 : 1 / n,
+ x;
+
+ // Initialize the bins.
+ while (++i < m) {
+ bin = bins[i] = [];
+ bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
+ bin.y = 0;
+ }
+
+ // Fill the bins, ignoring values outside the range.
+ i = -1; while(++i < n) {
+ x = values[i];
+ if ((x >= range[0]) && (x <= range[1])) {
+ bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
+ bin.y += k;
+ bin.push(data[i]);
+ }
+ }
+
+ return bins;
+ }
+
+ // Specifies how to extract a value from the associated data. The default
+ // value function is `Number`, which is equivalent to the identity function.
+ histogram.value = function(x) {
+ if (!arguments.length) return valuer;
+ valuer = x;
+ return histogram;
+ };
+
+ // Specifies the range of the histogram. Values outside the specified range
+ // will be ignored. The argument `x` may be specified either as a two-element
+ // array representing the minimum and maximum value of the range, or as a
+ // function that returns the range given the array of values and the current
+ // index `i`. The default range is the extent (minimum and maximum) of the
+ // values.
+ histogram.range = function(x) {
+ if (!arguments.length) return ranger;
+ ranger = d3.functor(x);
+ return histogram;
+ };
+
+ // Specifies how to bin values in the histogram. The argument `x` may be
+ // specified as a number, in which case the range of values will be split
+ // uniformly into the given number of bins. Or, `x` may be an array of
+ // threshold values, defining the bins; the specified array must contain the
+ // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x`
+ // may be a function which is evaluated, being passed the range, the array of
+ // values, and the current index `i`, returning an array of thresholds. The
+ // default bin function will divide the values into uniform bins using
+ // Sturges' formula.
+ histogram.bins = function(x) {
+ if (!arguments.length) return binner;
+ binner = typeof x === "number"
+ ? function(range) { return d3_layout_histogramBinFixed(range, x); }
+ : d3.functor(x);
+ return histogram;
+ };
+
+ // Specifies whether the histogram's `y` value is a count (frequency) or a
+ // probability (density). The default value is true.
+ histogram.frequency = function(x) {
+ if (!arguments.length) return frequency;
+ frequency = !!x;
+ return histogram;
+ };
+
+ return histogram;
+};
+
+function d3_layout_histogramBinSturges(range, values) {
+ return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
+}
+
+function d3_layout_histogramBinFixed(range, n) {
+ var x = -1,
+ b = +range[0],
+ m = (range[1] - b) / n,
+ f = [];
+ while (++x <= n) f[x] = m * x + b;
+ return f;
+}
+
+function d3_layout_histogramRange(values) {
+ return [d3.min(values), d3.max(values)];
+}
+d3.layout.hierarchy = function() {
+ var sort = d3_layout_hierarchySort,
+ children = d3_layout_hierarchyChildren,
+ value = d3_layout_hierarchyValue;
+
+ // Recursively compute the node depth and value.
+ // Also converts the data representation into a standard hierarchy structure.
+ function recurse(data, depth, nodes) {
+ var childs = children.call(hierarchy, data, depth),
+ node = d3_layout_hierarchyInline ? data : {data: data};
+ node.depth = depth;
+ nodes.push(node);
+ if (childs && (n = childs.length)) {
+ var i = -1,
+ n,
+ c = node.children = [],
+ v = 0,
+ j = depth + 1;
+ while (++i < n) {
+ d = recurse(childs[i], j, nodes);
+ d.parent = node;
+ c.push(d);
+ v += d.value;
+ }
+ if (sort) c.sort(sort);
+ if (value) node.value = v;
+ } else if (value) {
+ node.value = +value.call(hierarchy, data, depth) || 0;
+ }
+ return node;
+ }
+
+ // Recursively re-evaluates the node value.
+ function revalue(node, depth) {
+ var children = node.children,
+ v = 0;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n,
+ j = depth + 1;
+ while (++i < n) v += revalue(children[i], j);
+ } else if (value) {
+ v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0;
+ }
+ if (value) node.value = v;
+ return v;
+ }
+
+ function hierarchy(d) {
+ var nodes = [];
+ recurse(d, 0, nodes);
+ return nodes;
+ }
+
+ hierarchy.sort = function(x) {
+ if (!arguments.length) return sort;
+ sort = x;
+ return hierarchy;
+ };
+
+ hierarchy.children = function(x) {
+ if (!arguments.length) return children;
+ children = x;
+ return hierarchy;
+ };
+
+ hierarchy.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return hierarchy;
+ };
+
+ // Re-evaluates the `value` property for the specified hierarchy.
+ hierarchy.revalue = function(root) {
+ revalue(root, 0);
+ return root;
+ };
+
+ return hierarchy;
+};
+
+// A method assignment helper for hierarchy subclasses.
+function d3_layout_hierarchyRebind(object, hierarchy) {
+ d3.rebind(object, hierarchy, "sort", "children", "value");
+
+ // Add an alias for links, for convenience.
+ object.links = d3_layout_hierarchyLinks;
+
+ // If the new API is used, enabling inlining.
+ object.nodes = function(d) {
+ d3_layout_hierarchyInline = true;
+ return (object.nodes = object)(d);
+ };
+
+ return object;
+}
+
+function d3_layout_hierarchyChildren(d) {
+ return d.children;
+}
+
+function d3_layout_hierarchyValue(d) {
+ return d.value;
+}
+
+function d3_layout_hierarchySort(a, b) {
+ return b.value - a.value;
+}
+
+// Returns an array source+target objects for the specified nodes.
+function d3_layout_hierarchyLinks(nodes) {
+ return d3.merge(nodes.map(function(parent) {
+ return (parent.children || []).map(function(child) {
+ return {source: parent, target: child};
+ });
+ }));
+}
+
+// For backwards-compatibility, don't enable inlining by default.
+var d3_layout_hierarchyInline = false;
+d3.layout.pack = function() {
+ var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort),
+ size = [1, 1];
+
+ function pack(d, i) {
+ var nodes = hierarchy.call(this, d, i),
+ root = nodes[0];
+
+ // Recursively compute the layout.
+ root.x = 0;
+ root.y = 0;
+ d3_layout_packTree(root);
+
+ // Scale the layout to fit the requested size.
+ var w = size[0],
+ h = size[1],
+ k = 1 / Math.max(2 * root.r / w, 2 * root.r / h);
+ d3_layout_packTransform(root, w / 2, h / 2, k);
+
+ return nodes;
+ }
+
+ pack.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return pack;
+ };
+
+ return d3_layout_hierarchyRebind(pack, hierarchy);
+};
+
+function d3_layout_packSort(a, b) {
+ return a.value - b.value;
+}
+
+function d3_layout_packInsert(a, b) {
+ var c = a._pack_next;
+ a._pack_next = b;
+ b._pack_prev = a;
+ b._pack_next = c;
+ c._pack_prev = b;
+}
+
+function d3_layout_packSplice(a, b) {
+ a._pack_next = b;
+ b._pack_prev = a;
+}
+
+function d3_layout_packIntersects(a, b) {
+ var dx = b.x - a.x,
+ dy = b.y - a.y,
+ dr = a.r + b.r;
+ return dr * dr - dx * dx - dy * dy > .001; // within epsilon
+}
+
+function d3_layout_packCircle(nodes) {
+ var xMin = Infinity,
+ xMax = -Infinity,
+ yMin = Infinity,
+ yMax = -Infinity,
+ n = nodes.length,
+ a, b, c, j, k;
+
+ function bound(node) {
+ xMin = Math.min(node.x - node.r, xMin);
+ xMax = Math.max(node.x + node.r, xMax);
+ yMin = Math.min(node.y - node.r, yMin);
+ yMax = Math.max(node.y + node.r, yMax);
+ }
+
+ // Create node links.
+ nodes.forEach(d3_layout_packLink);
+
+ // Create first node.
+ a = nodes[0];
+ a.x = -a.r;
+ a.y = 0;
+ bound(a);
+
+ // Create second node.
+ if (n > 1) {
+ b = nodes[1];
+ b.x = b.r;
+ b.y = 0;
+ bound(b);
+
+ // Create third node and build chain.
+ if (n > 2) {
+ c = nodes[2];
+ d3_layout_packPlace(a, b, c);
+ bound(c);
+ d3_layout_packInsert(a, c);
+ a._pack_prev = c;
+ d3_layout_packInsert(c, b);
+ b = a._pack_next;
+
+ // Now iterate through the rest.
+ for (var i = 3; i < n; i++) {
+ d3_layout_packPlace(a, b, c = nodes[i]);
+
+ // Search for the closest intersection.
+ var isect = 0, s1 = 1, s2 = 1;
+ for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
+ if (d3_layout_packIntersects(j, c)) {
+ isect = 1;
+ break;
+ }
+ }
+ if (isect == 1) {
+ for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
+ if (d3_layout_packIntersects(k, c)) {
+ break;
+ }
+ }
+ }
+
+ // Update node chain.
+ if (isect) {
+ if (s1 < s2 || (s1 == s2 && b.r < a.r)) d3_layout_packSplice(a, b = j);
+ else d3_layout_packSplice(a = k, b);
+ i--;
+ } else {
+ d3_layout_packInsert(a, c);
+ b = c;
+ bound(c);
+ }
+ }
+ }
+ }
+
+ // Re-center the circles and return the encompassing radius.
+ var cx = (xMin + xMax) / 2,
+ cy = (yMin + yMax) / 2,
+ cr = 0;
+ for (var i = 0; i < n; i++) {
+ var node = nodes[i];
+ node.x -= cx;
+ node.y -= cy;
+ cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y));
+ }
+
+ // Remove node links.
+ nodes.forEach(d3_layout_packUnlink);
+
+ return cr;
+}
+
+function d3_layout_packLink(node) {
+ node._pack_next = node._pack_prev = node;
+}
+
+function d3_layout_packUnlink(node) {
+ delete node._pack_next;
+ delete node._pack_prev;
+}
+
+function d3_layout_packTree(node) {
+ var children = node.children;
+ if (children && children.length) {
+ children.forEach(d3_layout_packTree);
+ node.r = d3_layout_packCircle(children);
+ } else {
+ node.r = Math.sqrt(node.value);
+ }
+}
+
+function d3_layout_packTransform(node, x, y, k) {
+ var children = node.children;
+ node.x = (x += k * node.x);
+ node.y = (y += k * node.y);
+ node.r *= k;
+ if (children) {
+ var i = -1, n = children.length;
+ while (++i < n) d3_layout_packTransform(children[i], x, y, k);
+ }
+}
+
+function d3_layout_packPlace(a, b, c) {
+ var db = a.r + c.r,
+ dx = b.x - a.x,
+ dy = b.y - a.y;
+ if (db && (dx || dy)) {
+ var da = b.r + c.r,
+ dc = Math.sqrt(dx * dx + dy * dy),
+ cos = Math.max(-1, Math.min(1, (db * db + dc * dc - da * da) / (2 * db * dc))),
+ theta = Math.acos(cos),
+ x = cos * (db /= dc),
+ y = Math.sin(theta) * db;
+ c.x = a.x + x * dx + y * dy;
+ c.y = a.y + x * dy - y * dx;
+ } else {
+ c.x = a.x + db;
+ c.y = a.y;
+ }
+}
+// Implements a hierarchical layout using the cluster (or dendogram) algorithm.
+d3.layout.cluster = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null),
+ separation = d3_layout_treeSeparation,
+ size = [1, 1]; // width, height
+
+ function cluster(d, i) {
+ var nodes = hierarchy.call(this, d, i),
+ root = nodes[0],
+ previousNode,
+ x = 0,
+ kx,
+ ky;
+
+ // First walk, computing the initial x & y values.
+ d3_layout_treeVisitAfter(root, function(node) {
+ var children = node.children;
+ if (children && children.length) {
+ node.x = d3_layout_clusterX(children);
+ node.y = d3_layout_clusterY(children);
+ } else {
+ node.x = previousNode ? x += separation(node, previousNode) : 0;
+ node.y = 0;
+ previousNode = node;
+ }
+ });
+
+ // Compute the left-most, right-most, and depth-most nodes for extents.
+ var left = d3_layout_clusterLeft(root),
+ right = d3_layout_clusterRight(root),
+ x0 = left.x - separation(left, right) / 2,
+ x1 = right.x + separation(right, left) / 2;
+
+ // Second walk, normalizing x & y to the desired size.
+ d3_layout_treeVisitAfter(root, function(node) {
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
+ node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
+ });
+
+ return nodes;
+ }
+
+ cluster.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return cluster;
+ };
+
+ cluster.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return cluster;
+ };
+
+ return d3_layout_hierarchyRebind(cluster, hierarchy);
+};
+
+function d3_layout_clusterY(children) {
+ return 1 + d3.max(children, function(child) {
+ return child.y;
+ });
+}
+
+function d3_layout_clusterX(children) {
+ return children.reduce(function(x, child) {
+ return x + child.x;
+ }, 0) / children.length;
+}
+
+function d3_layout_clusterLeft(node) {
+ var children = node.children;
+ return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
+}
+
+function d3_layout_clusterRight(node) {
+ var children = node.children, n;
+ return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
+}
+// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
+d3.layout.tree = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null),
+ separation = d3_layout_treeSeparation,
+ size = [1, 1]; // width, height
+
+ function tree(d, i) {
+ var nodes = hierarchy.call(this, d, i),
+ root = nodes[0];
+
+ function firstWalk(node, previousSibling) {
+ var children = node.children,
+ layout = node._tree;
+ if (children && (n = children.length)) {
+ var n,
+ firstChild = children[0],
+ previousChild,
+ ancestor = firstChild,
+ child,
+ i = -1;
+ while (++i < n) {
+ child = children[i];
+ firstWalk(child, previousChild);
+ ancestor = apportion(child, previousChild, ancestor);
+ previousChild = child;
+ }
+ d3_layout_treeShift(node);
+ var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim);
+ if (previousSibling) {
+ layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+ layout.mod = layout.prelim - midpoint;
+ } else {
+ layout.prelim = midpoint;
+ }
+ } else {
+ if (previousSibling) {
+ layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+ }
+ }
+ }
+
+ function secondWalk(node, x) {
+ node.x = node._tree.prelim + x;
+ var children = node.children;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n;
+ x += node._tree.mod;
+ while (++i < n) {
+ secondWalk(children[i], x);
+ }
+ }
+ }
+
+ function apportion(node, previousSibling, ancestor) {
+ if (previousSibling) {
+ var vip = node,
+ vop = node,
+ vim = previousSibling,
+ vom = node.parent.children[0],
+ sip = vip._tree.mod,
+ sop = vop._tree.mod,
+ sim = vim._tree.mod,
+ som = vom._tree.mod,
+ shift;
+ while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
+ vom = d3_layout_treeLeft(vom);
+ vop = d3_layout_treeRight(vop);
+ vop._tree.ancestor = node;
+ shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip);
+ if (shift > 0) {
+ d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift);
+ sip += shift;
+ sop += shift;
+ }
+ sim += vim._tree.mod;
+ sip += vip._tree.mod;
+ som += vom._tree.mod;
+ sop += vop._tree.mod;
+ }
+ if (vim && !d3_layout_treeRight(vop)) {
+ vop._tree.thread = vim;
+ vop._tree.mod += sim - sop;
+ }
+ if (vip && !d3_layout_treeLeft(vom)) {
+ vom._tree.thread = vip;
+ vom._tree.mod += sip - som;
+ ancestor = node;
+ }
+ }
+ return ancestor;
+ }
+
+ // Initialize temporary layout variables.
+ d3_layout_treeVisitAfter(root, function(node, previousSibling) {
+ node._tree = {
+ ancestor: node,
+ prelim: 0,
+ mod: 0,
+ change: 0,
+ shift: 0,
+ number: previousSibling ? previousSibling._tree.number + 1 : 0
+ };
+ });
+
+ // Compute the layout using Buchheim et al.'s algorithm.
+ firstWalk(root);
+ secondWalk(root, -root._tree.prelim);
+
+ // Compute the left-most, right-most, and depth-most nodes for extents.
+ var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost),
+ right = d3_layout_treeSearch(root, d3_layout_treeRightmost),
+ deep = d3_layout_treeSearch(root, d3_layout_treeDeepest),
+ x0 = left.x - separation(left, right) / 2,
+ x1 = right.x + separation(right, left) / 2,
+ y1 = deep.depth || 1;
+
+ // Clear temporary layout variables; transform x and y.
+ d3_layout_treeVisitAfter(root, function(node) {
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
+ node.y = node.depth / y1 * size[1];
+ delete node._tree;
+ });
+
+ return nodes;
+ }
+
+ tree.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return tree;
+ };
+
+ tree.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return tree;
+ };
+
+ return d3_layout_hierarchyRebind(tree, hierarchy);
+};
+
+function d3_layout_treeSeparation(a, b) {
+ return a.parent == b.parent ? 1 : 2;
+}
+
+// function d3_layout_treeSeparationRadial(a, b) {
+// return (a.parent == b.parent ? 1 : 2) / a.depth;
+// }
+
+function d3_layout_treeLeft(node) {
+ var children = node.children;
+ return children && children.length ? children[0] : node._tree.thread;
+}
+
+function d3_layout_treeRight(node) {
+ var children = node.children,
+ n;
+ return children && (n = children.length) ? children[n - 1] : node._tree.thread;
+}
+
+function d3_layout_treeSearch(node, compare) {
+ var children = node.children;
+ if (children && (n = children.length)) {
+ var child,
+ n,
+ i = -1;
+ while (++i < n) {
+ if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) {
+ node = child;
+ }
+ }
+ }
+ return node;
+}
+
+function d3_layout_treeRightmost(a, b) {
+ return a.x - b.x;
+}
+
+function d3_layout_treeLeftmost(a, b) {
+ return b.x - a.x;
+}
+
+function d3_layout_treeDeepest(a, b) {
+ return a.depth - b.depth;
+}
+
+function d3_layout_treeVisitAfter(node, callback) {
+ function visit(node, previousSibling) {
+ var children = node.children;
+ if (children && (n = children.length)) {
+ var child,
+ previousChild = null,
+ i = -1,
+ n;
+ while (++i < n) {
+ child = children[i];
+ visit(child, previousChild);
+ previousChild = child;
+ }
+ }
+ callback(node, previousSibling);
+ }
+ visit(node, null);
+}
+
+function d3_layout_treeShift(node) {
+ var shift = 0,
+ change = 0,
+ children = node.children,
+ i = children.length,
+ child;
+ while (--i >= 0) {
+ child = children[i]._tree;
+ child.prelim += shift;
+ child.mod += shift;
+ shift += child.shift + (change += child.change);
+ }
+}
+
+function d3_layout_treeMove(ancestor, node, shift) {
+ ancestor = ancestor._tree;
+ node = node._tree;
+ var change = shift / (node.number - ancestor.number);
+ ancestor.change += change;
+ node.change -= change;
+ node.shift += shift;
+ node.prelim += shift;
+ node.mod += shift;
+}
+
+function d3_layout_treeAncestor(vim, node, ancestor) {
+ return vim._tree.ancestor.parent == node.parent
+ ? vim._tree.ancestor
+ : ancestor;
+}
+// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk
+// Modified to support a target aspect ratio by Jeff Heer
+d3.layout.treemap = function() {
+ var hierarchy = d3.layout.hierarchy(),
+ round = Math.round,
+ size = [1, 1], // width, height
+ padding = null,
+ pad = d3_layout_treemapPadNull,
+ sticky = false,
+ stickies,
+ ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio
+
+ // Compute the area for each child based on value & scale.
+ function scale(children, k) {
+ var i = -1,
+ n = children.length,
+ child,
+ area;
+ while (++i < n) {
+ area = (child = children[i]).value * (k < 0 ? 0 : k);
+ child.area = isNaN(area) || area <= 0 ? 0 : area;
+ }
+ }
+
+ // Recursively arranges the specified node's children into squarified rows.
+ function squarify(node) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = pad(node),
+ row = [],
+ remaining = children.slice(), // copy-on-write
+ child,
+ best = Infinity, // the best row score so far
+ score, // the current row score
+ u = Math.min(rect.dx, rect.dy), // initial orientation
+ n;
+ scale(remaining, rect.dx * rect.dy / node.value);
+ row.area <