Skip to content

Instantly share code, notes, and snippets.

@1wheel
Last active November 14, 2016 05:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 1wheel/ac8d28c794c72996b9b963aad33dd77a to your computer and use it in GitHub Desktop.
Save 1wheel/ac8d28c794c72996b9b963aad33dd77a to your computer and use it in GitHub Desktop.
fl-counties
fips county state admitsPer10k2006 admitsPer10k2013 admitsPer10k2014 valid06 valid13 valid14 population2006 population2013 population2014 admissions2006 admissions2013 admissions2014 source
1001 Autauga County AL 44.25665216 19.22518862 18.5937359 TRUE TRUE TRUE 51328 55136 55395 243 106 103 NCRP
1003 Baldwin County AL 24.63738683 17.70337132 16.54081984 TRUE TRUE TRUE 168121 195443 200111 461 346 331 NCRP
1005 Barbour County AL 75.39987555 10.37882719 12.27358947 TRUE TRUE TRUE 27861 26978 26887 206 28 33 NCRP
1007 Bibb County AL 21.97415839 11.10913615 6.664889363 TRUE TRUE TRUE 22099 22504 22506 50 25 15 NCRP
1009 Blount County AL 16.13938879 11.78101178 6.930126995 TRUE TRUE TRUE 55485 57720 57719 93 68 40 NCRP
1011 Bullock County AL 66.07109622 8.486562942 NA TRUE TRUE 10776 10605 10764 71 9 NA NCRP
1013 Butler County AL 36.36539953 37.45872147 34.48955459 TRUE TRUE TRUE 20815 20289 20296 75 76 70 NCRP
1015 Calhoun County AL 46.04380108 36.89498657 37.09582801 TRUE TRUE TRUE 115388 116547 115916 542 430 430 NCRP
1017 Chambers County AL 50.66627618 24.57937089 25.8246273 TRUE TRUE TRUE 34945 34175 34076 173 84 88 NCRP
1019 Cherokee County AL 24.96735039 38.29216925 31.87771249 TRUE TRUE TRUE 25466 26115 26037 65 100 83 NCRP
1021 Chilton County AL 43.20592538 23.4966694 29.36423027 TRUE TRUE TRUE 42318 43836 43931 189 103 129 NCRP
1023 Choctaw County AL 16.07364653 13.43584385 12.75988891 TRUE TRUE TRUE 14431 13397 13323 22 18 17 NCRP
1025 Clarke County AL 23.85328276 30.19947548 30.06614552 TRUE TRUE TRUE 26755 25166 24945 61 76 75 NCRP
1027 Clay County AL 56.19207473 39.24181845 32.46753247 TRUE TRUE TRUE 14053 13506 13552 77 53 44 NCRP
1029 Cleburne County AL 70.92673135 36.62515815 27.18832891 TRUE TRUE TRUE 14538 15017 15080 106 55 41 NCRP
1031 Coffee County AL 45.57343267 18.28513006 14.1428824 TRUE TRUE TRUE 46228 50861 50909 230 93 72 NCRP
1033 Colbert County AL 43.15410607 20.91781501 22.00099004 TRUE TRUE TRUE 54413 54499 54543 235 114 120 NCRP
1035 Conecuh County AL 52.65567766 3.876570011 5.524861878 TRUE TRUE TRUE 13603 12898 12670 69 5 7 NCRP
1037 Coosa County AL 55.36702983 45.18752824 45.01194194 TRUE TRUE TRUE 11451 11065 10886 62 50 49 NCRP
1039 Covington County AL 74.51052924 58.12417437 56.44353009 TRUE TRUE TRUE 37441 37850 37914 282 220 214 NCRP
1041 Crenshaw County AL 27.94697241 11.46131805 12.16283895 TRUE TRUE TRUE 13880 13960 13977 39 16 17 NCRP
1043 Cullman County AL 36.02529224 30.45195152 24.97262852 TRUE TRUE TRUE 79044 80783 81289 290 246 203 NCRP
1045 Dale County AL 32.13444573 16.65162002 14.14598658 TRUE TRUE TRUE 49077 49845 49484 161 83 70 NCRP
1047 Dallas County AL 31.09698081 14.25110446 9.829541368 TRUE TRUE TRUE 44323 42102 41711 134 60 41 NCRP
1049 DeKalb County AL 31.37486634 13.9645104 17.02666573 TRUE TRUE TRUE 68495 70894 71065 223 99 121 NCRP
1051 Elmore County AL 31.54139808 16.45876646 14.44854712 TRUE TRUE TRUE 75246 80808 80977 252 133 117 NCRP
1053 Escambia County AL 45.06274726 30.08471222 35.51268121 TRUE TRUE TRUE 37673 37893 37733 172 114 134 NCRP
1055 Etowah County AL 54.67101477 33.66614725 36.89716124 TRUE TRUE TRUE 103528 103962 103531 570 350 382 NCRP
1057 Fayette County AL 35.06721216 29.57005145 14.81569278 TRUE TRUE TRUE 17767 16909 16874 60 50 25 NCRP
1059 Franklin County AL 52.73795238 30.11857206 25.63210025 TRUE TRUE TRUE 31134 31542 31601 167 95 81 NCRP
1061 Geneva County AL 33.96663058 22.06267295 16.84636119 TRUE TRUE TRUE 26271 26742 26712 91 59 45 NCRP
1063 Greene County AL 30.22162525 13.76462491 8.184262832 TRUE TRUE TRUE 9361 8718 8553 27 12 7 NCRP
1065 Hale County AL 5.771450558 3.265626021 NA TRUE TRUE 16427 15311 15184 9 5 NA NCRP
1067 Henry County AL 46.22140051 17.4175569 22.68760908 TRUE TRUE TRUE 16953 17224 17190 80 30 39 NCRP
1069 Houston County AL 77.20422962 43.81139868 43.57298475 TRUE TRUE TRUE 95846 103626 104193 790 454 454 NCRP
1071 Jackson County AL 32.72460552 22.85433666 22.02601348 TRUE TRUE TRUE 53483 52944 52665 174 121 116 NCRP
1073 Jefferson County AL 48.1359103 23.96855568 24.57653153 TRUE TRUE TRUE 655893 659197 660793 3170 1580 1624 NCRP
1075 Lamar County AL 23.61767158 18.30599169 19.87789294 TRUE TRUE TRUE 14816 14203 14086 34 26 28 NCRP
1077 Lauderdale County AL 28.48941359 19.61756527 24.16860015 TRUE TRUE TRUE 90294 92774 93096 264 182 225 NCRP
1079 Lawrence County AL 41.16557382 36.04301332 36.14421842 TRUE TRUE TRUE 34028 33571 33477 140 121 121 NCRP
1081 Lee County AL 26.52262733 20.76357213 17.17934589 TRUE TRUE TRUE 129247 151708 154255 383 315 265 NCRP
1083 Limestone County AL 24.16025521 14.73168099 11.67568044 TRUE TRUE TRUE 73651 88924 90787 206 131 106 NCRP
1085 Lowndes County AL 25.257081 16.77539609 17.01323251 TRUE TRUE TRUE 12124 10730 10580 28 18 18 NCRP
1087 Macon County AL 23.55429505 14.1257189 14.41441441 TRUE TRUE TRUE 22227 19822 19425 49 28 28 NCRP
1089 Madison County AL 36.25334901 20.3127296 18.21301231 TRUE TRUE TRUE 309170 347073 350299 1230 705 638 NCRP
1091 Marengo County AL 37.73767478 42.51532529 19.89060169 TRUE TRUE TRUE 21531 20228 20110 78 86 40 NCRP
1093 Marion County AL 70.55365017 43.88714734 49.22202768 TRUE TRUE TRUE 30779 30305 30271 216 133 149 NCRP
1095 Marshall County AL 20.59787191 18.61074982 16.69554926 TRUE TRUE TRUE 88209 94569 94636 193 176 158 NCRP
1097 Mobile County AL 52.37325382 40.13894249 37.69966974 TRUE TRUE TRUE 402916 414560 415123 2164 1664 1565 NCRP
1099 Monroe County AL 21.07296514 4.506940689 15.49186677 TRUE TRUE TRUE 23602 22188 21947 48 10 34 NCRP
1101 Montgomery County AL 57.2102367 24.33218492 21.97277498 TRUE TRUE TRUE 227291 227271 226189 1310 553 497 NCRP
1103 Morgan County AL 39.02300435 25.9136657 34.6969659 TRUE TRUE TRUE 115491 119628 119607 467 310 415 NCRP
1105 Perry County AL 21.17420597 5.011024253 NA TRUE TRUE 10677 9978 9826 22 5 NA NCRP
1107 Pickens County AL 30.74400492 20.12072435 16.69531058 TRUE TRUE TRUE 20128 19383 20365 60 39 34 NCRP
1109 Pike County AL 66.71316372 22.86087524 20.06648896 TRUE TRUE TRUE 31309 33682 33389 220 77 67 NCRP
1111 Randolph County AL 80.19632762 42.80104134 40.37446204 TRUE TRUE TRUE 22695 22663 22539 183 97 91 NCRP
1113 Russell County AL 61.3927697 36.34528016 38.08213663 TRUE TRUE TRUE 50459 59430 59608 341 216 227 NCRP
1115 St. Clair County AL 28.51362383 27.36422244 30.79691339 TRUE TRUE TRUE 75948 86244 86697 241 236 267 NCRP
1117 Shelby County AL 15.67809 18.90340653 15.82347391 TRUE TRUE TRUE 178841 204196 206655 311 386 327 NCRP
1119 Sumter County AL 14.7579693 11.24016486 6.835789154 TRUE TRUE TRUE 14059 13345 13166 20 15 9 NCRP
1121 Talladega County AL 61.82417985 23.23608601 18.81409705 TRUE TRUE TRUE 81991 81339 81322 506 189 153 NCRP
1123 Tallapoosa County AL 51.65588491 25.47245336 32.30900036 TRUE TRUE TRUE 41243 41221 41165 214 105 133 NCRP
1125 Tuscaloosa County AL 29.67117831 24.70808592 26.50683441 TRUE TRUE TRUE 181383 200744 202212 584 496 536 NCRP
1127 Walker County AL 41.57785716 25.05352344 26.72939164 TRUE TRUE TRUE 68234 65859 65471 277 165 175 NCRP
1129 Washington County AL 23.14279102 15.43759648 20.19721991 TRUE TRUE TRUE 17705 16842 16834 40 26 34 NCRP
1131 Wilcox County AL 7.805047264 4.439708755 5.406379528 TRUE TRUE TRUE 12221 11262 11098 9 5 6 NCRP
1133 Winston County AL 42.31369649 31.83528342 29.39958592 TRUE TRUE TRUE 24796 24187 24150 103 77 71 NCRP
2013 Aleutians East Borough AK NA NA NA FALSE FALSE FALSE 2794 3351 3360 NA NA NA NCRP
2016 Aleutians West Census Area AK NA NA NA FALSE FALSE 5658 5692 5750 NA NA NA NCRP
2020 Anchorage Municipality AK NA NA NA FALSE FALSE FALSE 280085 301629 301010 NA NA NA NCRP
2050 Bethel Census Area AK NA NA NA FALSE FALSE FALSE 16755 17806 17868 NA NA NA NCRP
2060 Bristol Bay Borough AK NA NA NA FALSE FALSE FALSE 1111 955 957 NA NA NA NCRP
2068 Denali Borough AK NA NA NA FALSE 1837 1933 1921 NA NA NA NCRP
2070 Dillingham Census Area AK NA NA NA FALSE FALSE FALSE 4833 4988 4988 NA NA NA NCRP
2090 Fairbanks North Star Borough AK NA NA NA FALSE FALSE FALSE 90545 100807 99357 NA NA NA NCRP
2100 Haines Borough AK NA NA NA FALSE FALSE FALSE 2300 2569 2566 NA NA NA NCRP
2105 Hoonah-Angoon Census Area AK NA NA NA FALSE FALSE 2271 2134 2082 NA NA NA NCRP
2110 Juneau City and Borough AK NA NA NA FALSE FALSE FALSE 30808 32626 32406 NA NA NA NCRP
2122 Kenai Peninsula Borough AK NA NA NA FALSE FALSE FALSE 52253 57067 57477 NA NA NA NCRP
2130 Ketchikan Gateway Borough AK NA NA NA FALSE FALSE FALSE 13492 13695 13787 NA NA NA NCRP
2150 Kodiak Island Borough AK NA NA NA FALSE FALSE FALSE 13184 14115 13986 NA NA NA NCRP
2164 Lake and Peninsula Borough AK NA NA NA 1624 1662 1631 NA NA NA NCRP
2170 Matanuska-Susitna Borough AK NA NA NA FALSE FALSE FALSE 78633 95892 97882 NA NA NA NCRP
2180 Nome Census Area AK NA NA NA FALSE FALSE FALSE 9235 9884 9817 NA NA NA NCRP
2185 North Slope Borough AK NA NA NA FALSE FALSE FALSE 8315 9733 9703 NA NA NA NCRP
2188 Northwest Arctic Borough AK NA NA NA FALSE FALSE FALSE 7467 7697 7717 NA NA NA NCRP
2195 Petersburg Census Area AK NA NA NA FALSE FALSE 3886 3213 3160 NA NA NA NCRP
2198 Prince of Wales-Hyder Census Area AK NA NA NA FALSE FALSE 5574 6402 6396 NA NA NA NCRP
2220 Sitka City and Borough AK NA NA NA FALSE FALSE FALSE 9046 9014 8900 NA NA NA NCRP
2230 Skagway Municipality AK NA NA NA FALSE 946 1012 1036 NA NA NA NCRP
2240 Southeast Fairbanks Census Area AK NA NA NA FALSE FALSE FALSE 6817 6969 6931 NA NA NA NCRP
2261 Valdez-Cordova Census Area AK NA NA NA FALSE FALSE FALSE 9828 9770 9488 NA NA NA NCRP
2270 Wade Hampton Census Area AK NA NA NA FALSE FALSE FALSE 7292 7952 8010 NA NA NA NCRP
2275 Wrangell City and Borough AK NA NA NA FALSE FALSE 2309 2404 2364 NA NA NA NCRP
2282 Yakutat City and Borough AK NA NA NA FALSE FALSE FALSE 642 634 635 NA NA NA NCRP
2290 Yukon-Koyukuk Census Area AK NA NA NA FALSE FALSE FALSE 5762 5654 5547 NA NA NA NCRP
4001 Apache County AZ 13.19847731 9.740214563 11.5553823 TRUE TRUE TRUE 69390 71867 71828 95 70 83 NCRP
4003 Cochise County AZ 21.52047498 25.35762733 25.81444981 TRUE TRUE TRUE 127241 129744 127448 282 329 329 NCRP
4005 Coconino County AZ 40.50595348 23.044846 23.09670109 TRUE TRUE TRUE 128695 136690 137682 546 315 318 NCRP
4007 Gila County AZ 38.99878129 41.64860637 42.92249478 TRUE TRUE TRUE 52541 53063 53119 208 221 228 NCRP
4009 Graham County AZ 28.78820491 42.20649125 52.42774719 TRUE TRUE TRUE 33701 37435 37957 107 158 199 NCRP
4011 Greenlee County AZ 12.67427123 36.89624329 33.16927028 TRUE TRUE TRUE 7838 8944 9346 11 33 31 NCRP
4012 La Paz County AZ 27.93022344 26.56042497 40.03756611 TRUE TRUE TRUE 20573 20331 20231 57 54 81 NCRP
4013 Maricopa County AZ 32.60086173 28.78526768 29.08109751 TRUE TRUE TRUE 3642884 4013164 4087191 12679 11552 11886 NCRP
4015 Mohave County AZ 38.92304641 37.16940672 41.05998692 TRUE TRUE TRUE 196168 202855 203361 785 754 835 NCRP
4017 Navajo County AZ 27.2068278 34.74745216 37.27995116 TRUE TRUE TRUE 105624 107346 108101 292 373 403 NCRP
4019 Pima County AZ 26.76080742 26.00070137 28.56101844 TRUE TRUE TRUE 940930 998050 1004516 2641 2595 2869 NCRP
4021 Pinal County AZ 20.30976346 33.30221375 34.95737937 TRUE TRUE TRUE 271328 390965 401918 770 1302 1405 NCRP
4023 Santa Cruz County AZ 22.70701583 20.16086246 19.70232359 TRUE TRUE TRUE 44298 47121 46695 107 95 92 NCRP
4025 Yavapai County AZ 46.46927838 34.68143684 38.56628466 TRUE TRUE TRUE 204082 215389 218844 985 747 844 NCRP
4027 Yuma County AZ 35.27177354 28.41120015 35.52327956 TRUE TRUE TRUE 183848 202033 203247 702 574 722 NCRP
5001 Arkansas County AR 63.82866487 62.69925611 54.85640529 TRUE TRUE TRUE 19785 18820 18594 121 118 102 NCRP
5003 Ashley County AR 51.74405174 51.28929042 58.23945007 TRUE TRUE TRUE 22501 21252 20948 112 109 122 NCRP
5005 Baxter County AR 24.95094596 20.24587765 23.98609785 TRUE TRUE TRUE 40867 40996 40857 103 83 98 NCRP
5007 Benton County AR 17.89490809 23.0087526 23.89392583 TRUE TRUE TRUE 195569 237301 242321 407 546 579 NCRP
5009 Boone County AR 28.03310062 21.12920913 24.46499624 TRUE TRUE TRUE 36056 37389 37196 104 79 91 NCRP
5011 Bradley County AR 28.9017341 41.10078628 30.49874417 TRUE TRUE TRUE 11778 11192 11148 33 46 34 NCRP
5013 Calhoun County AR 52.64147396 24.9089864 21.14571319 TRUE TRUE TRUE 5693 5219 5202 28 13 11 NCRP
5015 Carroll County AR 15.98198395 17.29106628 22.34717416 TRUE TRUE TRUE 26615 27760 27744 44 48 62 NCRP
5017 Chicot County AR 36.14146803 41.45351914 66.18962433 TRUE TRUE TRUE 12516 11338 11180 42 47 74 NCRP
5019 Clark County AR 36.22555866 47.1427942 36.32175762 TRUE TRUE TRUE 22924 22697 22576 83 107 82 NCRP
5021 Clay County AR 17.09943002 26.15404734 35.71901045 TRUE TRUE TRUE 16679 15294 15118 27 40 54 NCRP
5023 Cleburne County AR 18.95111386 31.57156221 45.25239916 TRUE TRUE TRUE 25430 25656 25634 49 81 116 NCRP
5025 Cleveland County AR 34.69010176 24.52697968 39.05787667 TRUE TRUE TRUE 8829 8562 8449 30 21 33 NCRP
5027 Columbia County AR 31.00522193 35.02843485 33.4266494 TRUE TRUE TRUE 25133 24266 23933 76 85 80 NCRP
5029 Conway County AR 37.20273134 32.58405742 44.58568515 TRUE TRUE TRUE 20753 21176 21083 79 69 94 NCRP
5031 Craighead County AR 30.08191223 24.98844039 25.2638561 TRUE TRUE TRUE 89725 101647 102518 296 254 259 NCRP
5033 Crawford County AR 42.07392064 38.1134646 44.41058722 TRUE TRUE TRUE 59126 61658 61697 260 235 274 NCRP
5035 Crittenden County AR 80.28227645 56.27235821 61.55647049 TRUE TRUE TRUE 50360 49758 49548 405 280 305 NCRP
5037 Cross County AR 12.95045045 10.2833638 17.41452371 TRUE TRUE TRUE 18525 17504 17227 23 18 30 NCRP
5039 Dallas County AR 38.53325047 26.51180407 23.21083172 TRUE TRUE TRUE 8477 7921 7755 31 21 18 NCRP
5041 Desha County AR 24.26804447 41.62664105 49.73907371 TRUE TRUE TRUE 13870 12492 12264 31 52 61 NCRP
5043 Drew County AR 35.85572086 44.31866724 42.42294061 TRUE TRUE TRUE 18705 18728 18622 67 83 79 NCRP
5045 Faulkner County AR 27.34455869 19.43211324 25.58624801 TRUE TRUE TRUE 102969 119390 120768 317 232 309 NCRP
5047 Franklin County AR 24.35918729 33.43549735 38.75315922 TRUE TRUE TRUE 18151 17945 17805 44 60 69 NCRP
5049 Fulton County AR 17.12049568 24.53586325 19.79381443 TRUE TRUE TRUE 12119 12227 12125 21 30 24 NCRP
5051 Garland County AR 17.60800439 28.22850667 26.61268778 TRUE TRUE TRUE 94077 97065 97322 170 274 259 NCRP
5053 Grant County AR 20.08704386 29.92352876 33.61992945 TRUE TRUE TRUE 17442 18046 18144 36 54 61 NCRP
5055 Greene County AR 27.24283701 43.64784547 49.89243374 TRUE TRUE TRUE 40469 43072 43694 116 188 218 NCRP
5057 Hempstead County AR 29.76587143 39.73569069 38.96627402 TRUE TRUE TRUE 22957 22398 22327 67 89 87 NCRP
5059 Hot Spring County AR 28.3286119 40.96889952 39.55885879 TRUE TRUE TRUE 32248 33440 33368 94 137 132 NCRP
5061 Howard County AR 73.46523131 59.80507974 75.55555556 TRUE TRUE TRUE 13843 13544 13500 101 81 102 NCRP
5063 Independence County AR 28.54346762 39.35618706 43.56178468 TRUE TRUE TRUE 35426 36843 36959 105 145 161 NCRP
5065 Izard County AR 25.81120944 30.67943729 30.40189826 TRUE TRUE TRUE 13583 13364 13486 35 41 41 NCRP
5067 Jackson County AR 53.34381493 74.16213768 74.71198814 TRUE TRUE TRUE 18092 17664 17534 95 131 131 NCRP
5069 Jefferson County AR 25.59974664 43.10108916 46.33663914 TRUE TRUE TRUE 79977 73084 72297 194 315 335 NCRP
5071 Johnson County AR 25.33619178 40.56089929 38.45414343 TRUE TRUE TRUE 24596 25887 26005 65 105 100 NCRP
5073 Lafayette County AR 39.99466738 41.40786749 50.62579103 TRUE TRUE TRUE 7879 7245 7111 30 30 36 NCRP
5075 Lawrence County AR 15.09258722 49.23509759 64.96958242 TRUE TRUE TRUE 17193 17061 16931 26 84 110 NCRP
5077 Lee County AR 12.66192656 26.88975202 28.39756592 TRUE TRUE TRUE 11067 10041 9860 13 27 28 NCRP
5079 Lincoln County AR 14.84308736 11.39357687 12.88475304 TRUE TRUE TRUE 14315 14043 13970 21 16 18 NCRP
5081 Little River County AR 76.20073892 55.72561023 86.97733801 TRUE TRUE TRUE 13147 12741 12532 99 71 109 NCRP
5083 Logan County AR 16.20089105 20.38412756 24.59240368 TRUE TRUE TRUE 22689 22076 21958 36 45 54 NCRP
5085 Lonoke County AR 27.43048538 29.92913008 32.84095197 TRUE TRUE TRUE 62648 70834 71557 190 212 235 NCRP
5087 Madison County AR 28.07734031 20.35493925 17.15374841 TRUE TRUE TRUE 15156 15721 15740 44 32 27 NCRP
5089 Marion County AR 14.45347787 10.95756985 13.44168143 TRUE TRUE TRUE 16759 16427 16367 24 18 22 NCRP
5091 Miller County AR 52.85533724 71.23098202 71.152252 TRUE TRUE TRUE 42669 43380 43428 230 309 309 NCRP
5093 Mississippi County AR 48.13556369 38.89658872 44.98700124 TRUE TRUE TRUE 46983 44734 44235 221 174 199 NCRP
5095 Monroe County AR 19.99500125 53.47593583 52.75652862 TRUE TRUE TRUE 8949 7667 7582 16 41 40 NCRP
5097 Montgomery County AR 8.52242463 22.78645833 33.03237172 TRUE TRUE TRUE 9437 9216 9082 8 21 30 NCRP
5099 Nevada County AR 30.17434063 25.03128911 21.78149719 TRUE TRUE TRUE 9383 8789 8723 27 22 19 NCRP
5101 Newton County AR 7.307270734 6.197322757 NA TRUE TRUE 8474 8068 7904 6 5 NA NCRP
5103 Ouachita County AR 45.61225683 28.78503178 35.44385371 TRUE TRUE TRUE 26656 25013 24828 117 72 88 NCRP
5105 Perry County AR NA 18.36813612 12.68911664 TRUE TRUE 10352 10344 10245 NA 19 13 NCRP
5107 Phillips County AR 25.40817767 26.92646627 45.65980933 TRUE TRUE TRUE 23244 20426 19930 54 55 91 NCRP
5109 Pike County AR 37.33333333 52.1301456 49.89114659 TRUE TRUE TRUE 11262 11126 11024 42 58 55 NCRP
5111 Poinsett County AR 41.79813957 30.96358682 31.34537656 TRUE TRUE TRUE 24904 24222 24246 102 75 76 NCRP
5113 Polk County AR 23.85589094 32.42605876 43.01606922 TRUE TRUE TRUE 20422 20354 20225 49 66 87 NCRP
5115 Pope County AR 28.59529623 40.48002295 40.5056882 TRUE TRUE TRUE 58809 62747 63201 178 254 256 NCRP
5117 Prairie County AR 20.99615071 31.10047847 72.25433526 TRUE TRUE TRUE 8989 8360 8304 18 26 60 NCRP
5119 Pulaski County AR 27.89389442 30.77622492 31.34692464 TRUE TRUE TRUE 371647 391536 392702 1077 1205 1231 NCRP
5121 Randolph County AR 26.82163612 25.51888397 33.57805475 TRUE TRUE TRUE 18185 17634 17571 48 45 59 NCRP
5123 St. Francis County AR 25.43526546 13.91839426 20.81861779 TRUE TRUE TRUE 28496 27302 26899 71 38 56 NCRP
5125 Saline County AR 11.74392775 17.16512677 21.08556071 TRUE TRUE TRUE 96661 114185 115719 129 196 244 NCRP
5127 Scott County AR 27.900279 43.98020891 28.0557374 TRUE TRUE TRUE 11239 10914 10693 31 48 30 NCRP
5129 Searcy County AR 17.28181706 20.02503129 18.91789633 TRUE TRUE TRUE 8210 7990 7929 14 16 15 NCRP
5131 Sebastian County AR 44.8884112 63.87765698 61.60472014 TRUE TRUE TRUE 121492 127118 126776 568 812 781 NCRP
5133 Sevier County AR 30.34370076 51.3204936 46.48226788 TRUE TRUE TRUE 16273 17342 17426 52 89 81 NCRP
5135 Sharp County AR 21.50787653 34.56761191 28.39228676 TRUE TRUE TRUE 17629 17068 16906 37 59 48 NCRP
5137 Stone County AR 30.35871215 27.12838107 32.01536738 TRUE TRUE TRUE 12262 12533 12494 38 34 40 NCRP
5139 Union County AR 51.80719975 45.23663184 42.75735203 TRUE TRUE TRUE 42914 40675 40227 214 184 172 NCRP
5141 Van Buren County AR 36.7411209 22.98850575 21.36371729 TRUE TRUE TRUE 17027 16965 16851 63 39 36 NCRP
5143 Washington County AR 44.49019051 37.55426684 36.64082032 TRUE TRUE TRUE 190314 216753 220792 925 814 809 NCRP
5145 White County AR 23.27465377 21.73885407 25.19340391 TRUE TRUE TRUE 72728 78661 78592 181 171 198 NCRP
5147 Woodruff County AR 8.356545961 19.85252411 26.04920405 TRUE TRUE TRUE 7877 7052 6910 6 14 18 NCRP
5149 Yell County AR 29.98092123 21.55271243 26.42248645 TRUE TRUE TRUE 21556 21807 21951 66 47 58 NCRP
6001 Alameda County CA 30.19056205 4.516095617 4.624683644 TRUE TRUE TRUE 1444484 1583226 1610921 4635 715 745 NCRP
6003 Alpine County CA NA NA NA 1276 1150 1116 NA NA NA NCRP
6005 Amador County CA 42.48837582 17.75859243 11.975396 TRUE TRUE TRUE 38353 36602 36742 159 65 44 NCRP
6007 Butte County CA 51.73617724 16.32047478 17.57038187 TRUE TRUE TRUE 216824 222420 224241 1141 363 394 NCRP
6009 Calaveras County CA 36.32578023 10.31066481 7.3951237 TRUE TRUE TRUE 46045 44614 44624 164 46 33 NCRP
6011 Colusa County CA 35.57053262 10.26502426 13.07250572 TRUE TRUE TRUE 20890 21432 21419 76 22 28 NCRP
6013 Contra Costa County CA 15.81919208 3.36684976 3.752230418 TRUE TRUE TRUE 1000834 1095980 1111339 1686 369 417 NCRP
6015 Del Norte County CA 52.54434531 12.9370755 14.33191239 TRUE TRUE TRUE 28211 27827 27212 149 36 39 NCRP
6017 El Dorado County CA 20.55453028 7.215961045 6.11731035 TRUE TRUE TRUE 176773 181542 183087 372 131 112 NCRP
6019 Fresno County CA 61.20657085 16.49405607 17.88868023 TRUE TRUE TRUE 883862 956102 965974 5751 1577 1728 NCRP
6021 Glenn County CA 55.60704356 13.61324067 7.154355214 TRUE TRUE TRUE 27652 27914 27955 156 38 20 NCRP
6023 Humboldt County CA 54.08095801 8.616847422 6.379396034 TRUE TRUE TRUE 132093 134620 134809 728 116 86 NCRP
6025 Imperial County CA 21.91768312 6.759915952 7.482229704 TRUE TRUE TRUE 160505 177517 179091 384 120 134 NCRP
6027 Inyo County CA 42.20322476 7.599196656 9.234111896 TRUE TRUE TRUE 18370 18423 18410 78 14 17 NCRP
6029 Kern County CA 54.16149888 17.46113684 15.89317954 TRUE TRUE TRUE 784511 865923 874589 4594 1512 1390 NCRP
6031 Kings County CA 71.93391566 33.80572974 29.21427573 TRUE TRUE TRUE 147712 150862 150269 1092 510 439 NCRP
6033 Lake County CA 69.09430439 20.2058174 17.44983173 TRUE TRUE TRUE 64202 63843 64184 444 129 112 NCRP
6035 Lassen County CA 44.68222706 10.24462933 13.85870421 TRUE TRUE TRUE 34605 32212 31749 152 33 44 NCRP
6037 Los Angeles County CA 34.15683519 11.25622203 10.88892085 TRUE TRUE TRUE 9737955 10053995 10116705 33793 11317 11016 NCRP
6039 Madera County CA 51.4412124 13.99796274 14.88210782 TRUE TRUE TRUE 143622 152165 154548 779 213 230 NCRP
6041 Marin County CA 9.542771645 1.89320032 2.646212848 TRUE TRUE TRUE 244580 258821 260750 243 49 69 NCRP
6043 Mariposa County CA 18.27141354 11.26252956 6.221015722 TRUE TRUE TRUE 18219 17758 17682 33 20 11 NCRP
6045 Mendocino County CA 36.80126176 13.0328909 11.26677213 TRUE TRUE TRUE 87345 87471 87869 322 114 99 NCRP
6047 Merced County CA 42.55779704 13.58731749 11.71377833 TRUE TRUE TRUE 245338 263481 266353 1101 358 312 NCRP
6049 Modoc County CA 40.13519223 13.16944688 NA TRUE TRUE 9617 9112 9023 38 12 NA NCRP
6051 Mono County CA 14.06766547 5.707762557 3.572194042 TRUE TRUE TRUE 13743 14016 13997 20 8 5 NCRP
6053 Monterey County CA 32.38469787 10.836054 9.968841574 TRUE TRUE TRUE 401831 429123 431344 1362 465 430 NCRP
6055 Napa County CA 26.19035527 7.113387395 4.235284152 TRUE TRUE TRUE 131440 140580 141667 361 100 60 NCRP
6057 Nevada County CA 12.58768234 4.070749629 4.449253233 TRUE TRUE TRUE 97549 98262 98893 124 40 44 NCRP
6059 Orange County CA 27.03348318 5.698536831 5.881389852 TRUE TRUE TRUE 2932261 3121854 3145515 8250 1779 1850 NCRP
6061 Placer County CA 23.34768097 6.152355181 7.237135924 TRUE TRUE TRUE 321934 367339 371694 831 226 269 NCRP
6063 Plumas County CA 33.69753906 5.827197118 8.599376545 TRUE TRUE TRUE 20762 18877 18606 66 11 16 NCRP
6065 Riverside County CA 36.72379257 12.49915105 12.12825815 TRUE TRUE TRUE 2012370 2296956 2329271 8184 2871 2825 NCRP
6067 Sacramento County CA 32.28105772 11.30438527 10.96471992 TRUE TRUE TRUE 1369563 1463149 1482026 4633 1654 1625 NCRP
6069 San Benito County CA 20.49362915 5.208875925 4.462217035 TRUE TRUE TRUE 54124 57594 58267 115 30 26 NCRP
6071 San Bernardino County CA 55.38391232 15.7119886 16.97892521 TRUE TRUE TRUE 1974140 2093306 2112619 11392 3289 3587 NCRP
6073 San Diego County CA 28.18436302 7.279931036 8.368493159 TRUE TRUE TRUE 2947289 3222558 3263431 8845 2346 2731 NCRP
6075 San Francisco County CA 23.11923777 2.05673742 1.607096563 TRUE TRUE TRUE 768650 841138 852469 1890 173 137 NCRP
6077 San Joaquin County CA 47.04426142 14.11293468 12.43716785 TRUE TRUE TRUE 662812 705027 715597 3261 995 890 NCRP
6079 San Luis Obispo County CA 23.88880313 8.50574047 8.312939161 TRUE TRUE TRUE 260498 276284 279083 650 235 232 NCRP
6081 San Mateo County CA 23.48045283 4.836846376 4.653425277 TRUE TRUE TRUE 690176 750489 758581 1713 363 353 NCRP
6083 Santa Barbara County CA 37.18803243 7.957328539 7.897101673 TRUE TRUE TRUE 408085 436076 440668 1589 347 348 NCRP
6085 Santa Clara County CA 28.83223118 5.20013019 5.230641743 TRUE TRUE TRUE 1691159 1871107 1894605 5225 973 991 NCRP
6087 Santa Cruz County CA 15.70949518 6.90310417 6.107342055 TRUE TRUE TRUE 251616 269444 271804 416 186 166 NCRP
6089 Shasta County CA 74.28385197 18.92406371 20.24426598 TRUE TRUE TRUE 176166 179137 179804 1322 339 364 NCRP
6091 Sierra County CA 38.37543972 NA 16.65001665 TRUE TRUE 3424 3040 3003 12 NA 5 NCRP
6093 Siskiyou County CA 46.06431027 8.452699152 11.91895113 TRUE TRUE TRUE 44487 43773 43628 205 37 52 NCRP
6095 Solano County CA 48.50715864 5.667667719 5.821896361 TRUE TRUE TRUE 408402 425219 431131 2024 241 251 NCRP
6097 Sonoma County CA 20.55515325 4.400200229 4.937116724 TRUE TRUE TRUE 465188 495432 500292 1002 218 247 NCRP
6099 Stanislaus County CA 33.5699306 13.22474852 11.91736044 TRUE TRUE TRUE 504651 526286 531997 1740 696 634 NCRP
6101 Sutter County CA 69.10230306 14.27267098 10.95495947 TRUE TRUE TRUE 91112 95287 95847 655 136 105 NCRP
6103 Tehama County CA 69.25886687 17.58276572 19.82019123 TRUE TRUE TRUE 61587 63130 63067 438 111 125 NCRP
6105 Trinity County CA 44.72796598 8.182088664 8.352315869 TRUE TRUE TRUE 13634 13444 13170 61 11 11 NCRP
6107 Tulare County CA 41.97974226 11.69937875 12.00354432 TRUE TRUE TRUE 414921 454725 458198 1875 532 550 NCRP
6109 Tuolumne County CA 30.69726648 16.13770845 14.118259 TRUE TRUE TRUE 56680 53911 53831 168 87 76 NCRP
6111 Ventura County CA 20.91633827 6.218994211 6.15709697 TRUE TRUE TRUE 798183 840972 846178 1734 523 521 NCRP
6113 Yolo County CA 51.75788974 11.87434606 12.81371935 TRUE TRUE TRUE 189615 205485 207590 1047 244 266 NCRP
6115 Yuba County CA 66.55275994 18.94739712 17.71084012 TRUE TRUE TRUE 69272 73361 73966 483 139 131 NCRP
8001 Adams County CO 21.83483397 21.50688454 18.16033517 TRUE TRUE TRUE 406575 470547 480718 987 1012 873 NCRP
8003 Alamosa County CO 29.49852507 35.06397638 40.79866477 TRUE TRUE TRUE 15196 16256 16177 47 57 66 NCRP
8005 Arapahoe County CO 15.46128443 14.96395496 15.3840933 TRUE TRUE TRUE 531619 608128 618821 905 910 952 NCRP
8007 Archuleta County CO 20.64580064 6.556302246 14.70107808 TRUE TRUE TRUE 11937 12202 12244 25 8 18 NCRP
8009 Baca County CO 18.61207126 21.74503941 NA TRUE TRUE 3933 3679 3645 7 8 NA NCRP
8011 Bent County CO 16.28399284 29.64771538 23.09058615 TRUE TRUE TRUE 6012 5734 5630 10 17 13 NCRP
8013 Boulder County CO 9.200457034 9.632856094 9.734052909 TRUE TRUE TRUE 284243 310396 313333 277 299 305 NCRP
8014 Broomfield County CO 1.04948313 7.296123105 5.793556278 TRUE TRUE TRUE 48729 60306 62138 6 44 36 NCRP
8015 Chaffee County CO 10.51873997 19.08917371 17.97091978 TRUE TRUE TRUE 17087 18335 18363 19 35 33 NCRP
8017 Cheyenne County CO NA NA NA 1912 1898 1871 NA NA NA NCRP
8019 Clear Creek County CO 7.736516357 24.1492865 16.32741918 TRUE TRUE TRUE 9042 9110 9187 7 22 15 NCRP
8021 Conejos County CO 7.26744186 7.265681763 16.93889897 TRUE TRUE TRUE 8256 8258 8265 6 6 14 NCRP
8023 Costilla County CO NA 19.77959876 14.01345291 TRUE TRUE 3571 3539 3568 NA 7 5 NCRP
8025 Crowley County CO 17.76514479 15.00093756 16.79104478 TRUE TRUE TRUE 5886 5333 5360 10 8 9 NCRP
8027 Custer County CO NA NA NA 3994 4271 4361 NA NA NA NCRP
8029 Delta County CO 14.02524544 7.584251138 8.034817543 TRUE TRUE TRUE 29789 30326 29870 43 23 24 NCRP
8031 Denver County CO 34.89440446 27.60637322 26.61697762 TRUE TRUE TRUE 556895 648401 663862 2161 1790 1767 NCRP
8033 Dolores County CO NA NA NA 1973 2025 1978 NA NA NA NCRP
8035 Douglas County CO 4.163623581 5.386928373 5.847990389 TRUE TRUE TRUE 256136 306297 314638 122 165 184 NCRP
8037 Eagle County CO 7.861785968 4.004500296 6.046748928 TRUE TRUE TRUE 48476 52441 52921 41 21 32 NCRP
8039 Elbert County CO 4.292766688 5.48222494 3.719776813 TRUE TRUE TRUE 22423 23713 24195 10 13 9 NCRP
8041 El Paso County CO 18.89906261 22.82390957 24.14399588 TRUE TRUE TRUE 580251 655453 663519 1199 1496 1602 NCRP
8043 Fremont County CO 24.11953042 23.45952694 20.85931788 TRUE TRUE TRUE 46873 46463 46502 113 109 97 NCRP
8045 Garfield County CO 17.46432163 11.73338937 13.05233115 TRUE TRUE TRUE 51594 57102 57461 99 67 75 NCRP
8047 Gilpin County CO 23.73562169 28.71500359 22.2184242 TRUE TRUE TRUE 4883 5572 5851 13 16 13 NCRP
8049 Grand County CO 11.69590643 11.17396466 10.3121133 TRUE TRUE TRUE 14003 14319 14546 17 16 15 NCRP
8051 Gunnison County CO 12.32086116 12.25411158 8.26709062 TRUE TRUE TRUE 14720 15505 15725 19 19 13 NCRP
8053 Hinsdale County CO NA NA NA 815 812 786 NA NA NA NCRP
8055 Huerfano County CO 42.26415094 18.44167819 10.83255958 TRUE TRUE TRUE 7127 6507 6462 28 12 7 NCRP
8057 Jackson County CO NA NA NA 1415 1364 1396 NA NA NA NCRP
8059 Jefferson County CO 21.32543201 18.94667373 18.47796699 TRUE TRUE TRUE 521662 551548 558503 1153 1045 1032 NCRP
8061 Kiowa County CO NA NA NA 1456 1420 1402 NA NA NA NCRP
8063 Kit Carson County CO 14.65380388 22.45508982 21.0604559 TRUE TRUE TRUE 8011 8016 8072 12 18 17 NCRP
8065 Lake County CO 10.91107474 16.46090535 10.87399755 TRUE TRUE TRUE 7278 7290 7357 8 12 8 NCRP
8067 La Plata County CO 36.89540537 22.12472344 17.596177 TRUE TRUE TRUE 48574 53334 53989 192 118 95 NCRP
8069 Larimer County CO 15.17341513 14.34466372 13.29746207 TRUE TRUE TRUE 280713 316494 324122 464 454 431 NCRP
8071 Las Animas County CO 20.48097252 18.00055386 14.94449189 TRUE TRUE TRUE 15673 14444 14052 31 26 21 NCRP
8073 Lincoln County CO 45.93899302 53.39716443 61.70598911 TRUE TRUE TRUE 5530 5431 5510 25 29 34 NCRP
8075 Logan County CO 33.17556509 37.48828491 32.85384479 TRUE TRUE TRUE 21911 22407 22524 75 84 74 NCRP
8077 Mesa County CO 27.47029139 25.99882193 28.3295673 TRUE TRUE TRUE 134665 147699 148255 405 384 420 NCRP
8079 Mineral County CO NA NA NA 789 723 698 NA NA NA NCRP
8081 Moffat County CO 31.97739273 46.51162791 38.67574257 TRUE TRUE TRUE 13115 13115 12928 43 61 50 NCRP
8083 Montezuma County CO 18.81467545 25.71395177 15.90873817 TRUE TRUE TRUE 24968 25667 25772 48 66 41 NCRP
8085 Montrose County CO 14.87079473 12.51718044 13.45631591 TRUE TRUE TRUE 38282 40744 40873 61 51 55 NCRP
8087 Morgan County CO 37.44524516 21.83944486 31.41767862 TRUE TRUE TRUE 27816 28389 28328 106 62 89 NCRP
8089 Otero County CO 33.4803635 20.99935387 29.7490264 TRUE TRUE TRUE 19042 18572 18488 63 39 55 NCRP
8091 Ouray County CO NA NA NA 4090 4578 4629 NA NA NA NCRP
8093 Park County CO 13.01841175 8.060515873 7.341694708 TRUE TRUE TRUE 16230 16128 16345 21 13 12 NCRP
8095 Phillips County CO 15.97079626 NA NA TRUE 4414 4355 4363 7 NA NA NCRP
8097 Pitkin County CO 8.152332149 6.904090674 4.538749574 TRUE TRUE TRUE 15504 17381 17626 14 12 8 NCRP
8099 Prowers County CO 24.85368396 23.61371224 34.07013462 TRUE TRUE TRUE 13130 12281 12034 31 29 41 NCRP
8101 Pueblo County CO 29.05378386 36.44929333 37.25096525 TRUE TRUE TRUE 152026 161320 161875 465 588 603 NCRP
8103 Rio Blanco County CO 17.72525849 19.23361444 11.92783659 TRUE TRUE TRUE 6176 6759 6707 12 13 8 NCRP
8105 Rio Grande County CO 10.91244859 12.76052744 17.2309813 TRUE TRUE TRUE 12033 11755 11607 13 15 20 NCRP
8107 Routt County CO 17.51463112 2.984056612 7.961449822 TRUE TRUE TRUE 21859 23458 23865 41 7 19 NCRP
8109 Saguache County CO NA 8.03083842 11.29761136 TRUE TRUE 6223 6226 6196 NA 5 7 NCRP
8111 San Juan County CO NA NA NA 649 699 720 NA NA NA NCRP
8113 San Miguel County CO NA 14.29128232 7.653061224 TRUE TRUE 7071 7697 7840 NA 11 6 NCRP
8115 Sedgwick County CO NA 21.2404418 21.29471891 TRUE TRUE 2474 2354 2348 NA 5 5 NCRP
8117 Summit County CO 11.03556299 6.95531212 8.502244593 TRUE TRUE TRUE 26019 28755 29404 31 20 25 NCRP
8119 Teller County CO 12.88881251 12.03886835 18.38471076 TRUE TRUE TRUE 22281 23258 23389 30 28 43 NCRP
8121 Washington County CO 33.36113428 NA 10.46025105 TRUE TRUE 4907 4774 4780 16 NA 5 NCRP
8123 Weld County CO 23.57214622 24.83737433 22.9048871 TRUE TRUE TRUE 230703 270560 277670 610 672 636 NCRP
8125 Yuma County CO 17.83414247 11.80753714 10.78219957 TRUE TRUE TRUE 9784 10163 10202 18 12 11 NCRP
9001 Fairfield County CT NA NA NA 896254 942119 945438 NA NA NA NCRP
9003 Hartford County CT NA NA NA 881298 898848 897985 NA NA NA NCRP
9005 Litchfield County CT NA NA NA 189682 186660 184993 NA NA NA NCRP
9007 Middlesex County CT NA NA NA 163473 165389 164943 NA NA NA NCRP
9009 New Haven County CT NA NA NA 850207 863016 861277 NA NA NA NCRP
9011 New London County CT NA NA NA 270814 273976 273676 NA NA NA NCRP
9013 Tolland County CT NA NA NA 148954 151706 151367 NA NA NA NCRP
9015 Windham County CT NA NA NA 116778 117627 116998 NA NA NA NCRP
10001 Kent County DE NA NA NA 149704 169562 171987 NA NA NA NCRP
10003 New Castle County DE NA NA NA 527174 549233 552778 NA NA NA NCRP
10005 Sussex County DE NA NA NA 182390 206445 210849 NA NA NA NCRP
11001 District of Columbia DC NA NA NA 570681 649111 658893 NA NA NA NCRP
12001 Alachua County FL 31.69927316 25.97617929 23.98783056 TRUE TRUE TRUE 239506 253309 256380 792 658 615 NCRP
12003 Baker County FL 33.61779157 26.64988711 23.9914369 TRUE TRUE TRUE 25571 27017 27093 91 72 65 NCRP
12005 Bay County FL 61.62714406 51.55287313 46.87543649 TRUE TRUE TRUE 165644 174966 178985 1052 902 839 NCRP
12007 Bradford County FL 43.24362961 32.33359349 68.5341922 TRUE TRUE TRUE 28506 26907 26702 121 87 183 NCRP
12009 Brevard County FL 20.23211959 18.64210068 16.91552116 TRUE TRUE TRUE 535138 551440 556885 1104 1028 942 NCRP
12011 Broward County FL 17.48568118 12.56101004 11.63042635 TRUE TRUE TRUE 1739348 1845393 1869235 3121 2318 2174 NCRP
12013 Calhoun County FL 31.29251701 30.72301495 39.223782 TRUE TRUE TRUE 13997 14647 14532 46 45 57 NCRP
12015 Charlotte County FL 18.78766834 16.79317118 18.40046535 TRUE TRUE TRUE 157099 164948 168474 303 277 310 NCRP
12017 Citrus County FL 16.33217796 20.34010378 21.45260696 TRUE TRUE TRUE 137826 139134 139377 229 283 299 NCRP
12019 Clay County FL 12.35304804 21.01406874 19.51971491 TRUE TRUE TRUE 178339 196535 199798 238 413 390 NCRP
12021 Collier County FL 11.15143095 8.908987198 9.375618232 TRUE TRUE TRUE 312621 340106 348777 366 303 327 NCRP
12023 Columbia County FL 38.47975373 39.96270148 41.11587603 TRUE TRUE TRUE 65890 67563 67857 260 270 279 NCRP
12027 DeSoto County FL 28.28201206 30.62167784 27.13355421 TRUE TRUE TRUE 34300 34616 35012 98 106 95 NCRP
12029 Dixie County FL 29.56757423 35.72771719 33.94731879 TRUE TRUE TRUE 15892 15954 15907 48 57 54 NCRP
12031 Duval County FL 18.73715044 22.50592231 20.27407881 TRUE TRUE TRUE 842098 887322 897698 1635 1997 1820 NCRP
12033 Escambia County FL 41.19084426 29.91512679 24.97915721 TRUE TRUE TRUE 300395 307871 310659 1239 921 776 NCRP
12035 Flagler County FL 8.735778666 14.30715358 13.47550973 TRUE TRUE TRUE 84339 99950 102408 85 143 138 NCRP
12037 Franklin County FL 38.94755063 30.93049231 24.54506983 TRUE TRUE TRUE 11308 11639 11815 45 36 29 NCRP
12039 Gadsden County FL 59.32565087 30.30893464 35.86785074 TRUE TRUE TRUE 45258 46191 46281 278 140 166 NCRP
12041 Gilchrist County FL 6.502334929 25.4332525 19.41519092 TRUE TRUE TRUE 16223 16907 16997 11 43 33 NCRP
12043 Glades County FL 15.29051988 19.69547762 32.26989366 TRUE TRUE TRUE 12297 13201 13635 20 26 44 NCRP
12045 Gulf County FL 34.82555563 17.71591269 33.24134471 TRUE TRUE TRUE 15856 15805 15944 55 28 53 NCRP
12047 Hamilton County FL 37.52985329 9.77721908 7.118451025 TRUE TRUE TRUE 14430 14319 14048 55 14 10 NCRP
12049 Hardee County FL 17.92508048 20.43049982 22.93494485 TRUE TRUE TRUE 27049 27410 27469 49 56 63 NCRP
12051 Hendry County FL 17.73327075 29.40397351 21.29593559 TRUE TRUE TRUE 38776 37750 38505 68 111 82 NCRP
12053 Hernando County FL 13.86329635 26.57788238 18.87919024 TRUE TRUE TRUE 164398 174205 175855 240 463 332 NCRP
12055 Highlands County FL 29.9160519 22.67180016 21.88607028 TRUE TRUE TRUE 97788 97919 98236 294 222 215 NCRP
12057 Hillsborough County FL 29.99412519 19.07823312 15.63475748 TRUE TRUE TRUE 1171826 1294145 1316298 3773 2469 2058 NCRP
12059 Holmes County FL 25.67458719 37.66094967 43.25699746 TRUE TRUE TRUE 19824 19649 19650 51 74 85 NCRP
12061 Indian River County FL 22.38870232 14.36407292 14.09277745 TRUE TRUE TRUE 131463 142021 144755 312 204 204 NCRP
12063 Jackson County FL 38.11377367 35.30612245 30.53216123 TRUE TRUE TRUE 48265 49000 48801 188 173 149 NCRP
12065 Jefferson County FL 31.1009745 23.95715896 20.6405694 TRUE TRUE TRUE 14461 14192 14050 45 34 29 NCRP
12067 Lafayette County FL 36.59233848 13.56545331 10.18675722 TRUE TRUE TRUE 8341 8846 8835 32 12 9 NCRP
12069 Lake County FL 17.18030346 16.87681547 12.25886154 TRUE TRUE TRUE 281329 308115 315690 517 520 387 NCRP
12071 Lee County FL 10.04782576 12.44450627 12.70027211 TRUE TRUE TRUE 582678 661336 679513 637 823 863 NCRP
12073 Leon County FL 35.13695877 28.70467496 27.18424722 TRUE TRUE TRUE 263076 282184 283988 979 810 772 NCRP
12075 Levy County FL 30.77763161 33.00246889 19.18562088 TRUE TRUE TRUE 39447 39694 39613 124 131 76 NCRP
12077 Liberty County FL 27.68415985 28.8184438 29.90430622 TRUE TRUE TRUE 8011 8328 8360 23 24 25 NCRP
12079 Madison County FL 41.95070792 26.18500508 14.58040825 TRUE TRUE TRUE 19299 18713 18518 80 49 27 NCRP
12081 Manatee County FL 9.621016914 11.94450042 13.5609218 TRUE TRUE TRUE 313771 342417 351746 317 409 477 NCRP
12083 Marion County FL 40.95915179 32.54412347 26.68302046 TRUE TRUE TRUE 316310 336159 339167 1366 1094 905 NCRP
12085 Martin County FL 27.87814813 22.90761695 22.16543236 TRUE TRUE TRUE 141802 151478 153392 412 347 340 NCRP
12086 Miami-Dade County FL 8.599197748 7.528769438 7.105105236 TRUE TRUE TRUE 2405911 2641866 2662874 2192 1989 1892 NCRP
12087 Monroe County FL 31.93510571 24.82491899 25.66894835 TRUE TRUE TRUE 73793 76536 77136 237 190 198 NCRP
12089 Nassau County FL 15.64122271 19.30501931 12.79056109 TRUE TRUE TRUE 67823 75628 76619 116 146 98 NCRP
12091 Okaloosa County FL 25.88080839 20.26755232 21.06741573 TRUE TRUE TRUE 184071 193906 196512 481 393 414 NCRP
12093 Okeechobee County FL 36.82962515 45.04043403 49.0433983 TRUE TRUE TRUE 39668 39076 39149 146 176 192 NCRP
12095 Orange County FL 12.98263764 11.11868297 10.68634422 TRUE TRUE TRUE 1083429 1226764 1253001 1526 1364 1339 NCRP
12097 Osceola County FL 14.68712143 14.29057957 14.11942194 TRUE TRUE TRUE 242081 299498 310211 411 428 438 NCRP
12099 Palm Beach County FL 8.318268605 8.414480755 7.512287957 TRUE TRUE TRUE 1284489 1376199 1397710 1114 1158 1050 NCRP
12101 Pasco County FL 14.39574194 21.3792451 19.20338903 TRUE TRUE TRUE 439529 475695 485331 674 1017 932 NCRP
12103 Pinellas County FL 21.42356375 19.57835049 18.19639313 TRUE TRUE TRUE 924182 930109 938098 1971 1821 1707 NCRP
12105 Polk County FL 41.84861419 24.55232132 27.02327941 TRUE TRUE TRUE 568324 623159 634638 2554 1530 1715 NCRP
12107 Putnam County FL 20.62891033 49.48788994 37.56428205 TRUE TRUE TRUE 74663 72543 72143 152 359 271 NCRP
12109 St. Johns County FL 13.84978312 15.89165044 14.40902354 TRUE TRUE TRUE 168480 209544 217919 273 333 314 NCRP
12111 St. Lucie County FL 26.47545505 19.69913415 18.76108141 TRUE TRUE TRUE 255251 286307 291028 744 564 546 NCRP
12113 Santa Rosa County FL 10.92692458 11.50418815 16.82759971 TRUE TRUE TRUE 142983 160811 163422 170 185 275 NCRP
12115 Sarasota County FL 8.405247798 13.24818958 12.67123805 TRUE TRUE TRUE 371361 390242 396962 322 517 503 NCRP
12117 Seminole County FL 9.106146298 11.22036336 11.59280116 TRUE TRUE TRUE 413218 436706 442516 389 490 513 NCRP
12119 Sumter County FL 15.95382536 9.310214504 5.946655007 TRUE TRUE TRUE 76202 108483 114350 157 101 68 NCRP
12121 Suwannee County FL 40.1259769 37.97062995 37.25410022 TRUE TRUE TRUE 39533 43718 44022 172 166 164 NCRP
12123 Taylor County FL 26.47837599 44.14528607 50.48268532 TRUE TRUE TRUE 20793 22879 22582 60 101 114 NCRP
12125 Union County FL 21.55876396 19.22312077 17.11652403 TRUE TRUE TRUE 14873 15086 15190 33 29 26 NCRP
12127 Volusia County FL 22.64905253 21.44848075 20.70809468 TRUE TRUE TRUE 494748 501201 507531 1124 1075 1051 NCRP
12129 Wakulla County FL 14.92343628 13.86381223 11.453296 TRUE TRUE TRUE 27785 31016 31432 46 43 36 NCRP
12131 Walton County FL 28.98038523 16.83416662 17.38989111 TRUE TRUE TRUE 51145 59403 61530 164 100 107 NCRP
12133 Washington County FL 68.82033843 35.7215344 28.62868594 TRUE TRUE TRUE 22860 24635 24451 170 88 70 NCRP
13001 Appling County GA 21.79361447 19.57479202 18.33872708 TRUE TRUE TRUE 17725 18391 18540 40 36 34 NCRP
13003 Atkinson County GA 13.20211234 22.92747677 26.75422595 TRUE TRUE TRUE 8197 8287 8223 11 19 22 NCRP
13005 Bacon County GA 24.19571646 31.16651825 31.91206453 TRUE TRUE TRUE 10682 11230 11281 27 35 36 NCRP
13007 Baker County GA NA NA NA 3877 3321 3255 NA NA NA NCRP
13009 Baldwin County GA 32.37863445 25.57489326 24.83173234 TRUE TRUE TRUE 46513 46139 45909 149 118 114 NCRP
13011 Banks County GA 14.18207604 11.45975443 10.38535119 TRUE TRUE TRUE 17076 18325 18295 26 21 19 NCRP
13013 Barrow County GA 14.44239486 18.90094505 16.38448935 TRUE TRUE TRUE 61395 71425 73240 101 135 120 NCRP
13015 Bartow County GA 34.36871152 29.91440334 28.80003145 TRUE TRUE TRUE 92983 101289 101736 345 303 293 NCRP
13017 Ben Hill County GA 54.05097861 56.60377358 53.82501145 TRUE TRUE TRUE 17525 17490 17464 95 99 94 NCRP
13019 Berrien County GA 16.16772713 12.62825572 10.69518717 TRUE TRUE TRUE 18051 19005 18700 31 24 20 NCRP
13021 Bibb County GA 18.19654844 16.29854801 18.06309087 TRUE TRUE TRUE 154510 154615 153905 283 252 278 NCRP
13023 Bleckley County GA 27.7756346 18.81615053 10.94177413 TRUE TRUE TRUE 12553 12755 12795 36 24 14 NCRP
13025 Brantley County GA 10.32103862 19.12672824 13.03143835 TRUE TRUE TRUE 16895 18299 18417 19 35 24 NCRP
13027 Brooks County GA 15.10859301 17.27336703 17.51199896 TRUE TRUE TRUE 16309 15631 15418 24 27 27 NCRP
13029 Bryan County GA 12.73479784 10.26167265 11.79732201 TRUE TRUE TRUE 27346 33133 33906 40 34 40 NCRP
13031 Bulloch County GA 27.11054923 20.7550345 26.21831953 TRUE TRUE TRUE 64304 71308 72087 193 148 189 NCRP
13033 Burke County GA 28.85070835 31.84296619 38.75115593 TRUE TRUE TRUE 22875 22925 22709 67 73 88 NCRP
13035 Butts County GA 32.25395748 22.82318491 19.68503937 TRUE TRUE TRUE 22669 23222 23368 76 53 46 NCRP
13037 Calhoun County GA 27.30582524 13.81003529 10.83088349 TRUE TRUE TRUE 6350 6517 6463 18 9 7 NCRP
13039 Camden County GA 7.283607945 11.64664091 14.03117612 TRUE TRUE TRUE 47086 51517 52027 37 60 73 NCRP
13043 Candler County GA 39.83703033 29.23976608 27.55326965 TRUE TRUE TRUE 10388 10944 10888 44 32 30 NCRP
13045 Carroll County GA 25.90860022 16.10492223 19.01957175 TRUE TRUE TRUE 105853 112388 114093 288 181 217 NCRP
13047 Catoosa County GA 17.80020432 21.12191016 17.82965819 TRUE TRUE TRUE 61095 65335 65621 115 138 117 NCRP
13049 Charlton County GA 14.52599388 21.46580803 16.28285648 TRUE TRUE TRUE 12089 13044 12897 19 28 21 NCRP
13051 Chatham County GA 38.39883144 27.00877785 23.07863321 TRUE TRUE TRUE 246896 278428 283379 1041 752 654 NCRP
13053 Chattahoochee County GA 4.100713524 12.14574899 8.448086508 TRUE TRUE TRUE 11828 12350 11837 5 15 10 NCRP
13055 Chattooga County GA 46.35761589 37.42038217 34.88511969 TRUE TRUE TRUE 25640 25120 24939 119 94 87 NCRP
13057 Cherokee County GA 12.64448384 10.13923662 12.20858497 TRUE TRUE TRUE 193241 224869 230985 276 228 282 NCRP
13059 Clarke County GA 16.74182259 13.11816247 11.65886653 TRUE TRUE TRUE 112074 121206 120938 199 159 141 NCRP
13061 Clay County GA 41.49377593 36.2199539 22.5660864 TRUE TRUE TRUE 3232 3037 3102 13 11 7 NCRP
13063 Clayton County GA 30.36711055 26.16644578 25.56607934 TRUE TRUE TRUE 258552 264843 267542 797 693 684 NCRP
13065 Clinch County GA 25.12562814 22.05233755 30.74220466 TRUE TRUE TRUE 6828 6802 6831 17 15 21 NCRP
13067 Cobb County GA 21.28039929 21.49795045 19.74059517 TRUE TRUE TRUE 661913 718208 730981 1488 1544 1443 NCRP
13069 Coffee County GA 20.54107047 20.63576712 18.68678611 TRUE TRUE TRUE 40702 43129 42811 88 89 80 NCRP
13071 Colquitt County GA 23.59057251 9.721742136 12.79770943 TRUE TRUE TRUE 43700 46288 46102 108 45 59 NCRP
13073 Columbia County GA 8.111501954 11.96005488 11.4895481 TRUE TRUE TRUE 110845 136287 139257 104 163 160 NCRP
13075 Cook County GA 23.43841556 18.7958884 20.33228767 TRUE TRUE TRUE 16622 17025 17214 40 32 35 NCRP
13077 Coweta County GA 18.08388139 18.01504256 15.34251425 TRUE TRUE TRUE 113749 133222 135571 234 240 208 NCRP
13079 Crawford County GA 5.55247085 4.807307107 6.458383789 TRUE TRUE TRUE 12943 12481 12387 7 6 8 NCRP
13081 Crisp County GA 45.49126313 35.72658402 38.80701142 TRUE TRUE TRUE 22718 23232 22934 107 83 89 NCRP
13083 Dade County GA 36.79131484 17.57362744 17.69479529 TRUE TRUE TRUE 16411 16502 16389 61 29 29 NCRP
13085 Dawson County GA 24.12114173 19.42519094 20.90865531 TRUE TRUE TRUE 20660 22651 22957 54 44 48 NCRP
13087 Decatur County GA 37.57768464 28.49627356 20.57310801 TRUE TRUE TRUE 27835 27372 27220 104 78 56 NCRP
13089 DeKalb County GA 15.9501248 16.02942925 15.67517493 TRUE TRUE TRUE 676687 714935 722161 1117 1146 1132 NCRP
13091 Dodge County GA 33.9503302 36.24723438 27.17391304 TRUE TRUE TRUE 20954 21243 20976 73 77 57 NCRP
13093 Dooly County GA 29.54514223 23.75462866 22.55427122 TRUE TRUE TRUE 13719 14313 14188 43 34 32 NCRP
13095 Dougherty County GA 41.49862025 38.01138194 41.87994416 TRUE TRUE TRUE 94418 93130 92407 391 354 387 NCRP
13097 Douglas County GA 44.64887704 44.15641476 38.62339309 TRUE TRUE TRUE 119918 136560 138776 596 603 536 NCRP
13099 Early County GA 29.66533791 22.83322234 24.78314746 TRUE TRUE TRUE 11648 10511 10491 32 24 26 NCRP
13101 Echols County GA NA 12.50938204 NA TRUE 3913 3997 4003 NA 5 NA NCRP
13103 Effingham County GA 13.78372765 15.59976509 9.02152536 TRUE TRUE TRUE 47823 54488 55423 73 85 50 NCRP
13105 Elbert County GA 34.66117446 27.1599877 31.38182941 TRUE TRUE TRUE 20631 19514 19438 69 53 61 NCRP
13107 Emanuel County GA 17.6452424 27.55784961 19.77587343 TRUE TRUE TRUE 22091 22861 22755 40 63 45 NCRP
13109 Evans County GA 33.93872684 23.12031814 30.28078547 TRUE TRUE TRUE 10889 10813 10898 37 25 33 NCRP
13111 Fannin County GA 25.83213348 13.8970774 13.89298194 TRUE TRUE TRUE 22758 23746 23753 61 33 33 NCRP
13113 Fayette County GA 11.57742402 16.42748373 14.59002043 TRUE TRUE TRUE 104099 108355 109664 124 178 160 NCRP
13115 Floyd County GA 51.89969526 42.28065608 41.01475074 TRUE TRUE TRUE 95165 96025 96063 499 406 394 NCRP
13117 Forsyth County GA 7.927135953 9.625624642 8.369962115 TRUE TRUE TRUE 147228 195312 204302 145 188 171 NCRP
13119 Franklin County GA 29.54814074 32.20831065 28.7459576 TRUE TRUE TRUE 21956 22044 22264 65 71 64 NCRP
13121 Fulton County GA 18.61781195 12.98845054 11.93392879 TRUE TRUE TRUE 845181 984721 996319 1766 1279 1189 NCRP
13123 Gilmer County GA 20.1356507 14.69199286 12.48742586 TRUE TRUE TRUE 27665 28587 28829 57 42 36 NCRP
13125 Glascock County GA NA NA NA 2893 3083 3053 NA NA NA NCRP
13127 Glynn County GA 15.44593921 26.73763997 20.80924855 TRUE TRUE TRUE 74870 81533 82175 124 218 171 NCRP
13129 Gordon County GA 33.02712556 29.91223357 39.07434831 TRUE TRUE TRUE 52161 55830 56047 183 167 219 NCRP
13131 Grady County GA 39.37477628 23.35893578 12.2244568 TRUE TRUE TRUE 24384 25258 25359 99 59 31 NCRP
13133 Greene County GA 26.10154745 35.61997175 28.5021225 TRUE TRUE TRUE 15587 16283 16490 42 58 47 NCRP
13135 Gwinnett County GA 8.790293385 15.48391303 12.51819638 TRUE TRUE TRUE 740267 858956 877922 726 1330 1099 NCRP
13137 Habersham County GA 11.11600009 7.85328221 9.142439203 TRUE TRUE TRUE 40616 43294 43752 48 34 40 NCRP
13139 Hall County GA 21.60346968 17.09638419 15.46437689 TRUE TRUE TRUE 166524 187759 190761 395 321 295 NCRP
13141 Hancock County GA 11.9137875 12.36232861 15.277941 TRUE TRUE TRUE 9650 8898 8509 11 11 13 NCRP
13143 Haralson County GA 18.18563335 32.30110245 35.61328166 TRUE TRUE TRUE 28121 28482 28641 52 92 102 NCRP
13145 Harris County GA 9.917252921 13.16071374 13.99196983 TRUE TRUE TRUE 29289 32673 32876 32 43 46 NCRP
13147 Hart County GA 21.69796434 26.68759812 26.79591756 TRUE TRUE TRUE 24764 25480 25377 55 68 68 NCRP
13149 Heard County GA 28.18585583 20.75944987 17.23692149 TRUE TRUE TRUE 11553 11561 11603 33 24 20 NCRP
13151 Henry County GA 15.12001512 11.86211478 10.09964043 TRUE TRUE TRUE 180304 210755 213869 312 250 216 NCRP
13153 Houston County GA 20.04119968 17.03635098 16.02832789 TRUE TRUE TRUE 128978 147919 149111 287 252 239 NCRP
13155 Irwin County GA 16.71716644 31.87420314 10.98418278 TRUE TRUE TRUE 9852 9412 9104 16 30 10 NCRP
13157 Jackson County GA 14.69204484 15.90920274 15.67803459 TRUE TRUE TRUE 54037 60971 61870 89 97 97 NCRP
13159 Jasper County GA 21.82135583 18.45972089 14.1453246 TRUE TRUE TRUE 13370 13543 13432 30 25 19 NCRP
13161 Jeff Davis County GA 23.93298763 24.6897104 22.88175517 TRUE TRUE TRUE 14028 14986 14859 36 37 34 NCRP
13163 Jefferson County GA 11.37997125 33.65561131 18.43657817 TRUE TRUE TRUE 16889 16342 16272 19 55 30 NCRP
13165 Jenkins County GA 21.98565147 15.10574018 17.53424658 TRUE TRUE TRUE 8533 9268 9125 19 14 16 NCRP
13167 Johnson County GA 25.24487529 15.34369885 11.33903721 TRUE TRUE TRUE 9638 9776 9701 25 15 11 NCRP
13169 Jones County GA 30.71553229 32.32646251 29.87459617 TRUE TRUE TRUE 27563 28769 28787 88 93 86 NCRP
13171 Lamar County GA 20.94933569 17.83127159 16.47717911 TRUE TRUE TRUE 17115 17946 18207 38 32 30 NCRP
13173 Lanier County GA 16.58536585 10.57895749 9.64041261 TRUE TRUE TRUE 8509 10398 10373 17 11 10 NCRP
13175 Laurens County GA 25.10217206 21.49101759 26.54072015 TRUE TRUE TRUE 47287 47927 47851 121 103 127 NCRP
13177 Lee County GA 16.76504488 10.32311345 8.906854853 TRUE TRUE TRUE 27365 29061 29191 48 30 26 NCRP
13179 Liberty County GA 13.71361654 20.45053624 13.95748336 TRUE TRUE TRUE 63047 64057 65198 89 131 91 NCRP
13181 Lincoln County GA 16.4682037 14.25055059 10.49593283 TRUE TRUE TRUE 8198 7719 7622 13 11 8 NCRP
13183 Long County GA 21.58979392 22.83516616 16.94618127 TRUE TRUE TRUE 12152 16641 17113 33 38 29 NCRP
13185 Lowndes County GA 26.13756804 15.15930569 13.91788448 TRUE TRUE TRUE 100592 112802 113523 291 171 158 NCRP
13187 Lumpkin County GA 22.34783752 11.64746991 15.71721837 TRUE TRUE TRUE 27300 30908 31176 68 36 49 NCRP
13189 McDuffie County GA 24.42734019 24.74207553 24.33317735 TRUE TRUE TRUE 21564 21421 21370 53 53 52 NCRP
13191 McIntosh County GA 16.9707255 24.68265162 14.07063459 TRUE TRUE TRUE 12950 14180 14214 24 35 20 NCRP
13193 Macon County GA 17.98685576 10.02793496 5.075406032 TRUE TRUE TRUE 14364 13961 13792 26 14 7 NCRP
13195 Madison County GA 24.2476109 15.64945227 26.84374117 TRUE TRUE TRUE 27347 28116 28312 68 44 76 NCRP
13197 Marion County GA 32.28410008 9.173259947 11.36751165 TRUE TRUE TRUE 8089 8721 8797 28 8 10 NCRP
13199 Meriwether County GA 36.87485596 22.16249352 29.71978489 TRUE TRUE TRUE 22694 21207 21198 80 47 63 NCRP
13201 Miller County GA 19.82160555 20.28054757 16.78415576 TRUE TRUE TRUE 6104 5917 5958 12 12 10 NCRP
13205 Mitchell County GA 30.84832905 23.01645894 11.85718677 TRUE TRUE TRUE 23579 23027 22771 72 53 27 NCRP
13207 Monroe County GA 34.94532747 18.144788 19.59262134 TRUE TRUE TRUE 24924 27005 27051 93 49 53 NCRP
13209 Montgomery County GA 23.20441989 16.71681712 8.897786676 TRUE TRUE TRUE 9165 8973 8991 21 15 8 NCRP
13211 Morgan County GA 24.06267487 36.61559261 36.19959902 TRUE TRUE TRUE 17316 17752 17956 43 65 65 NCRP
13213 Murray County GA 35.69258809 14.25008906 14.20959147 TRUE TRUE TRUE 40173 39298 39410 141 56 56 NCRP
13215 Muscogee County GA 35.75294051 17.70024319 14.88398951 TRUE TRUE TRUE 189464 203952 200887 697 361 299 NCRP
13217 Newton County GA 33.33068804 25.14652499 31.15505184 TRUE TRUE TRUE 90647 102201 103675 336 257 323 NCRP
13219 Oconee County GA 9.025270758 5.286343612 5.699142279 TRUE TRUE TRUE 29720 34050 35093 30 18 20 NCRP
13221 Oglethorpe County GA 10.18329939 15.1598677 13.63047775 TRUE TRUE TRUE 14030 14512 14673 15 22 20 NCRP
13223 Paulding County GA 7.09096597 6.930242355 4.899756355 TRUE TRUE TRUE 122635 147181 148987 102 102 73 NCRP
13225 Peach County GA 10.55274553 8.176918788 14.48629374 TRUE TRUE TRUE 25510 26905 26922 29 22 39 NCRP
13227 Pickens County GA 14.92233602 13.21630689 14.00140014 TRUE TRUE TRUE 28169 29509 29997 44 39 42 NCRP
13229 Pierce County GA 5.859166933 15.30504539 18.95634774 TRUE TRUE TRUE 17502 18948 18991 11 29 36 NCRP
13231 Pike County GA 9.546807435 9.552708474 7.872244714 TRUE TRUE TRUE 16590 17796 17784 17 17 14 NCRP
13233 Polk County GA 11.86210903 20.39973772 17.01796611 TRUE TRUE TRUE 40372 41177 41133 49 84 70 NCRP
13235 Pulaski County GA 24.62845011 14.74286705 19.15875642 TRUE TRUE TRUE 11183 11531 11483 29 17 22 NCRP
13237 Putnam County GA 20.24386799 35.66400751 21.23442809 TRUE TRUE TRUE 20368 21310 21192 43 76 45 NCRP
13239 Quitman County GA 29.21535893 29.58579882 NA TRUE TRUE 2545 2366 2315 7 7 NA NCRP
13241 Rabun County GA 23.96902465 14.15645965 14.15994582 TRUE TRUE TRUE 16090 16247 16243 39 23 23 NCRP
13243 Randolph County GA 17.33795679 32.01113431 21.87884589 TRUE TRUE TRUE 7786 7185 7313 13 23 16 NCRP
13245 Richmond County GA 34.41399237 29.1639341 27.8097811 TRUE TRUE TRUE 196449 201276 201368 692 587 560 NCRP
13247 Rockdale County GA 28.72154116 20.9641191 23.4747134 TRUE TRUE TRUE 79911 86815 87754 246 182 206 NCRP
13249 Schley County GA 13.95256129 25.63091483 NA TRUE TRUE 4374 5072 5163 7 13 NA NCRP
13251 Screven County GA 34.59010723 26.73044457 26.97905573 TRUE TRUE TRUE 14884 14216 14085 50 38 38 NCRP
13253 Seminole County GA 19.25036802 21.34112097 34.53833755 TRUE TRUE TRUE 8869 8903 8686 17 19 30 NCRP
13255 Spalding County GA 43.43003546 31.84763339 32.9749328 TRUE TRUE TRUE 61971 63741 63988 278 203 211 NCRP
13257 Stephens County GA 35.12157468 32.81890994 25.90266876 TRUE TRUE TRUE 25488 25595 25480 91 84 66 NCRP
13259 Stewart County GA 16.64724488 25.52881109 10.44568245 TRUE TRUE TRUE 5627 5484 5744 10 14 6 NCRP
13261 Sumter County GA 29.28440138 23.91810441 17.93032787 TRUE TRUE TRUE 32785 31357 31232 94 75 56 NCRP
13263 Talbot County GA 14.94991778 15.50628004 18.77934272 TRUE TRUE TRUE 6959 6449 6390 10 10 12 NCRP
13265 Taliaferro County GA 50.96262741 59.06674542 NA TRUE TRUE 1863 1693 1693 9 10 NA NCRP
13267 Tattnall County GA 26.04269424 26.69074067 30.52648271 TRUE TRUE TRUE 23417 25477 25224 66 68 77 NCRP
13269 Taylor County GA 45.37521815 34.35611894 50.9357972 TRUE TRUE TRUE 8798 8441 8442 39 29 43 NCRP
13271 Telfair County GA 35.99536331 12.5710865 15.13500424 TRUE TRUE TRUE 15401 16705 16518 59 21 25 NCRP
13273 Terrell County GA 27.03871945 31.47384415 27.37625931 TRUE TRUE TRUE 9969 9214 9132 25 29 25 NCRP
13275 Thomas County GA 26.62668934 14.04744916 12.23336818 TRUE TRUE TRUE 43901 44848 44959 119 63 55 NCRP
13277 Tift County GA 20.22843328 25.07447865 21.61949686 TRUE TRUE TRUE 39503 40280 40704 82 101 88 NCRP
13279 Toombs County GA 21.66807448 35.16225918 38.85345649 TRUE TRUE TRUE 26851 27302 27282 59 96 106 NCRP
13281 Towns County GA 22.74665908 18.60119048 28.83402415 TRUE TRUE TRUE 10281 10752 11098 24 20 32 NCRP
13283 Treutlen County GA 48.40839079 52.51312828 66.39126586 TRUE TRUE TRUE 6771 6665 6778 33 35 45 NCRP
13285 Troup County GA 61.52620397 36.0832959 37.85861319 TRUE TRUE TRUE 63897 69007 69469 417 249 263 NCRP
13287 Turner County GA 15.05152252 14.73658357 20.85122041 TRUE TRUE TRUE 9133 8143 8153 13 12 17 NCRP
13289 Twiggs County GA 19.30063579 24.81682817 32.45192308 TRUE TRUE TRUE 9715 8462 8320 17 21 27 NCRP
13291 Union County GA 12.61741203 14.3472023 21.37918486 TRUE TRUE TRUE 20460 21607 21984 27 31 47 NCRP
13293 Upson County GA 62.41176908 30.91772868 25.13711152 TRUE TRUE TRUE 27349 26522 26256 168 82 66 NCRP
13295 Walker County GA 25.99261109 22.395597 19.78949837 TRUE TRUE TRUE 66343 68317 68218 178 153 135 NCRP
13297 Walton County GA 19.66894558 30.46972217 37.32237631 TRUE TRUE TRUE 77057 85987 87615 166 262 327 NCRP
13299 Ware County GA 31.38191513 33.88976025 32.09911305 TRUE TRUE TRUE 35624 35704 35515 113 121 114 NCRP
13301 Warren County GA 24.53557659 16.20453727 14.49275362 TRUE TRUE TRUE 6038 5554 5520 14 9 8 NCRP
13303 Washington County GA 16.68096464 33.3671841 21.32299491 TRUE TRUE TRUE 20805 20679 20635 35 69 44 NCRP
13305 Wayne County GA 31.47050055 27.94597112 23.37306755 TRUE TRUE TRUE 28929 30058 29949 95 84 70 NCRP
13307 Webster County GA 21.66847237 NA NA TRUE 2630 2707 2649 6 NA NA NCRP
13309 Wheeler County GA 9.036922282 6.298022421 12.50781739 TRUE TRUE TRUE 6954 7939 7995 7 5 10 NCRP
13311 White County GA 14.59854015 19.07778698 13.9435109 TRUE TRUE TRUE 25575 27781 27970 40 53 39 NCRP
13313 Whitfield County GA 35.49280393 22.79627887 23.08242066 TRUE TRUE TRUE 96408 103087 103542 364 235 239 NCRP
13315 Wilcox County GA 27.44237102 11.11605158 15.8245733 TRUE TRUE TRUE 8868 8996 8847 25 10 14 NCRP
13317 Wilkes County GA 33.12226011 27.15205149 34.20523139 TRUE TRUE TRUE 10586 9944 9940 34 27 34 NCRP
13319 Wilkinson County GA 23.1092437 15.89656634 20.37315033 TRUE TRUE TRUE 9793 9436 9326 22 15 19 NCRP
13321 Worth County GA 13.844024 17.56551462 12.41642789 TRUE TRUE TRUE 21783 21064 20940 30 37 26 NCRP
15001 Hawaii County HI 11.28076816 NA NA TRUE FALSE FALSE 173536 191409 194190 211 NA NA NCRP
15003 Honolulu County HI 11.10215015 NA NA TRUE FALSE FALSE 926954 987019 991788 1071 NA NA NCRP
15005 Kalawao County HI NA NA NA 109 89 89 NA NA NA NCRP
15007 Kauai County HI 12.37623762 NA NA TRUE FALSE FALSE 63465 69679 70475 84 NA NA NCRP
15009 Maui County HI 14.87553708 NA NA TRUE FALSE FALSE 145667 160791 163019 233 NA NA NCRP
16001 Ada County ID NA NA 20.78660648 TRUE 363498 416556 426236 NA NA 886 Idaho Department of Correction
16003 Adams County ID NA NA 10.36001036 TRUE 3788 3831 3861 NA NA 4 Idaho Department of Correction
16005 Bannock County ID NA NA 15.4774617 TRUE 78491 83322 83347 NA NA 129 Idaho Department of Correction
16007 Bear Lake County ID NA NA 10.07218399 TRUE 6071 5937 5957 NA NA 6 Idaho Department of Correction
16009 Benewah County ID NA NA 8.773853915 TRUE 9260 9049 9118 NA NA 8 Idaho Department of Correction
16011 Bingham County ID NA NA 13.91680841 TRUE 43396 45408 45269 NA NA 63 Idaho Department of Correction
16013 Blaine County ID NA NA 5.120566055 TRUE 21082 21322 21482 NA NA 11 Idaho Department of Correction
16015 Boise County ID NA NA 10.25791325 TRUE 7151 6744 6824 NA NA 7 Idaho Department of Correction
16017 Bonner County ID NA NA 9.137910304 TRUE 40127 40703 41585 NA NA 38 Idaho Department of Correction
16019 Bonneville County ID NA NA 17.03138378 TRUE 94756 107550 108623 NA NA 185 Idaho Department of Correction
16021 Boundary County ID NA NA 10.01912743 TRUE 10530 10865 10979 NA NA 11 Idaho Department of Correction
16023 Butte County ID NA NA 3.813882532 TRUE 2786 2628 2622 NA NA 1 Idaho Department of Correction
16025 Camas County ID NA NA 9.624639076 TRUE 1073 1039 1039 NA NA 1 Idaho Department of Correction
16027 Canyon County ID NA NA 15.90012947 TRUE 172188 199040 203143 NA NA 323 Idaho Department of Correction
16029 Caribou County ID NA NA 8.77577885 TRUE 6886 6830 6837 NA NA 6 Idaho Department of Correction
16031 Cassia County ID NA NA 22.51486831 TRUE 21281 23342 23540 NA NA 53 Idaho Department of Correction
16033 Clark County ID NA NA NA 0 947 861 867 NA NA NA Idaho Department of Correction
16035 Clearwater County ID NA NA 14.01541696 TRUE 8776 8604 8562 NA NA 12 Idaho Department of Correction
16037 Custer County ID NA NA 4.830917874 TRUE 4155 4235 4140 NA NA 2 Idaho Department of Correction
16039 Elmore County ID NA NA 16.09565417 TRUE 25927 26156 26094 NA NA 42 Idaho Department of Correction
16041 Franklin County ID NA NA 10.75186238 TRUE 12085 12849 13021 NA NA 14 Idaho Department of Correction
16043 Fremont County ID NA NA 8.549001321 TRUE 12770 12912 12867 NA NA 11 Idaho Department of Correction
16045 Gem County ID NA NA 11.2652674 TRUE 16632 16694 16866 NA NA 19 Idaho Department of Correction
16047 Gooding County ID NA NA 13.27668614 TRUE 14749 15094 15064 NA NA 20 Idaho Department of Correction
16049 Idaho County ID NA NA 9.867406722 TRUE 15638 16201 16215 NA NA 16 Idaho Department of Correction
16051 Jefferson County ID NA NA 4.440990341 TRUE 22439 26868 27021 NA NA 12 Idaho Department of Correction
16053 Jerome County ID NA NA 21.03602419 TRUE 20111 22606 22818 NA NA 48 Idaho Department of Correction
16055 Kootenai County ID NA NA 11.53903588 TRUE 129510 144357 147326 NA NA 170 Idaho Department of Correction
16057 Latah County ID NA NA 6.508552238 TRUE 36251 38221 38411 NA NA 25 Idaho Department of Correction
16059 Lemhi County ID NA NA 3.882992493 TRUE 7795 7725 7726 NA NA 3 Idaho Department of Correction
16061 Lewis County ID NA NA 13.02761855 TRUE 3712 3825 3838 NA NA 5 Idaho Department of Correction
16063 Lincoln County ID NA NA 7.524454477 TRUE 4762 5307 5316 NA NA 4 Idaho Department of Correction
16065 Madison County ID NA NA 4.469214996 TRUE 34984 37572 38038 NA NA 17 Idaho Department of Correction
16067 Minidoka County ID NA NA 18.69802687 TRUE 19046 20310 20323 NA NA 38 Idaho Department of Correction
16069 Nez Perce County ID NA NA 17.24698178 TRUE 38513 39938 40007 NA NA 69 Idaho Department of Correction
16071 Oneida County ID NA NA 16.73040153 TRUE 4146 4269 4184 NA NA 7 Idaho Department of Correction
16073 Owyhee County ID NA NA 13.21236678 TRUE 11114 11423 11353 NA NA 15 Idaho Department of Correction
16075 Payette County ID NA NA 10.07181643 TRUE 21916 22591 22836 NA NA 23 Idaho Department of Correction
16077 Power County ID NA NA 17.06708678 TRUE 7564 7694 7617 NA NA 13 Idaho Department of Correction
16079 Shoshone County ID NA NA 7.263922518 TRUE 13014 12685 12390 NA NA 9 Idaho Department of Correction
16081 Teton County ID NA NA 5.802146794 TRUE 8270 10301 10341 NA NA 6 Idaho Department of Correction
16083 Twin Falls County ID NA NA 25.95348147 TRUE 71974 79839 80914 NA NA 210 Idaho Department of Correction
16085 Valley County ID NA NA 32.56665988 TRUE 9480 9586 9826 NA NA 32 Idaho Department of Correction
16087 Washington County ID NA NA 4.989522004 TRUE 10025 9954 10021 NA NA 5 Idaho Department of Correction
17001 Adams County IL 34.10173934 33.70820034 NA TRUE TRUE 67106 67046 66988 229 226 NA NCRP
17003 Alexander County IL 45.11278195 37.94321601 NA TRUE TRUE 8730 7643 7492 36 29 NA NCRP
17005 Bond County IL 19.24709878 22.90819541 NA TRUE TRUE 18004 17461 17269 34 40 NA NCRP
17007 Boone County IL 13.31656433 14.83954739 NA TRUE TRUE 51797 53910 53869 72 80 NA NCRP
17009 Brown County IL NA 7.29181858 NA TRUE 6875 6857 6832 NA 5 NA NCRP
17011 Bureau County IL 17.92218304 14.66963971 NA TRUE TRUE 35183 34084 33840 62 50 NA NCRP
17013 Calhoun County IL NA 25.78341928 NA TRUE 5174 5042 4956 NA 13 NA NCRP
17015 Carroll County IL 18.42226462 7.398439602 NA TRUE TRUE 15866 14868 14715 28 11 NA NCRP
17017 Cass County IL 28.0857354 23.99700037 NA TRUE TRUE 13611 13335 13156 38 32 NA NCRP
17019 Champaign County IL 39.81662616 24.88323832 NA TRUE TRUE 193844 205761 207133 806 512 NA NCRP
17021 Christian County IL 25.10750051 20.19256094 NA TRUE TRUE 35076 34171 33892 87 69 NA NCRP
17023 Clark County IL 26.40628838 19.13225946 NA TRUE TRUE 16669 16203 16180 43 31 NA NCRP
17025 Clay County IL 20.37252619 24.31476569 NA TRUE TRUE 14061 13572 13520 28 33 NA NCRP
17027 Clinton County IL 15.04315009 23.48594801 NA TRUE TRUE 37051 37895 37857 57 89 NA NCRP
17029 Coles County IL 35.36067893 22.55737216 NA TRUE TRUE 53359 53641 53320 190 121 NA NCRP
17031 Cook County IL 37.65464169 27.44044516 NA TRUE TRUE 5165495 5246635 5246456 19627 14397 NA NCRP
17033 Crawford County IL 33.49063784 22.54791432 NA TRUE TRUE 19966 19514 19393 66 44 NA NCRP
17035 Cumberland County IL 18.15705856 10.11866434 NA TRUE TRUE 11103 10871 10833 20 11 NA NCRP
17037 DeKalb County IL 14.02404121 10.87765501 NA TRUE TRUE 101437 104802 105462 147 114 NA NCRP
17039 De Witt County IL 24.83193023 18.29156759 NA TRUE TRUE 16792 16401 16284 41 30 NA NCRP
17041 Douglas County IL 19.09355844 11.59917293 NA TRUE TRUE 20111 19829 19889 38 23 NA NCRP
17043 DuPage County IL 12.3861756 8.631036089 NA TRUE TRUE 908685 931522 932708 1143 804 NA NCRP
17045 Edgar County IL 45.80402421 15.03508186 NA TRUE TRUE 18986 17958 17841 84 27 NA NCRP
17047 Edwards County IL 10.45556385 25.45672357 NA TRUE TRUE 6694 6678 6617 7 17 NA NCRP
17049 Effingham County IL 20.13187839 16.03218096 NA TRUE TRUE 34289 34306 34320 69 55 NA NCRP
17051 Fayette County IL 25.80586744 32.67232382 NA TRUE TRUE 21925 22037 21870 57 72 NA NCRP
17053 Ford County IL 12.15066829 11.58245258 NA TRUE TRUE 14096 13814 13688 17 16 NA NCRP
17055 Franklin County IL 15.2014188 25.52309714 NA TRUE TRUE 39560 39572 39411 60 101 NA NCRP
17057 Fulton County IL 19.27828613 18.9722016 NA TRUE TRUE 37387 36369 36007 71 69 NA NCRP
17059 Gallatin County IL 14.50326323 NA NA TRUE 5980 5401 5291 8 NA NA NCRP
17061 Greene County IL 10.88692118 11.75001836 NA TRUE TRUE 14167 13617 13434 15 16 NA NCRP
17063 Grundy County IL 9.787472036 13.16078087 NA TRUE TRUE 46534 50149 50425 49 66 NA NCRP
17065 Hamilton County IL 5.943183169 22.81186217 NA TRUE TRUE 8497 8329 8296 5 19 NA NCRP
17067 Hancock County IL 15.83197002 11.87199827 NA TRUE TRUE 19412 18531 18564 30 22 NA NCRP
17069 Hardin County IL 16.38193307 52.91005291 NA TRUE TRUE 4508 4158 4129 7 22 NA NCRP
17071 Henderson County IL 19.48232675 18.81603705 NA TRUE TRUE 7614 6909 6916 14 13 NA NCRP
17073 Henry County IL 36.8085953 22.31155779 NA TRUE TRUE 50392 49750 49635 185 111 NA NCRP
17075 Iroquois County IL 24.11193371 12.75114588 NA TRUE TRUE 30308 29017 28879 71 37 NA NCRP
17077 Jackson County IL 23.97802015 25.67479702 NA TRUE TRUE 60170 59981 59677 144 154 NA NCRP
17079 Jasper County IL 27.89256198 10.4416832 NA TRUE TRUE 9807 9577 9623 27 10 NA NCRP
17081 Jefferson County IL 25.0199902 24.01797474 NA TRUE TRUE 39545 38721 38534 97 93 NA NCRP
17083 Jersey County IL 30.19693654 25.62063787 NA TRUE TRUE 22736 22638 22571 69 58 NA NCRP
17085 Jo Daviess County IL 7.521458278 5.851111711 NA TRUE TRUE 22828 22218 22254 17 13 NA NCRP
17087 Johnson County IL 26.84563758 21.34724858 NA TRUE TRUE 12889 12648 12601 34 27 NA NCRP
17089 Kane County IL 16.70589143 11.57784911 NA TRUE TRUE 485179 524277 527306 866 607 NA NCRP
17091 Kankakee County IL 36.728589 25.04612587 NA TRUE TRUE 109735 112193 111375 415 281 NA NCRP
17093 Kendall County IL 9.538868742 8.282786028 NA TRUE TRUE 90740 119525 121350 111 99 NA NCRP
17095 Knox County IL 16.36692359 18.95280942 NA TRUE TRUE 53196 52235 52069 86 99 NA NCRP
17097 Lake County IL 15.39668907 11.07954545 NA TRUE TRUE 689891 704000 705186 1081 780 NA NCRP
17099 LaSalle County IL 33.01116554 33.73825186 NA TRUE TRUE 113139 112039 111241 374 378 NA NCRP
17101 Lawrence County IL 29.93653455 31.76886651 NA TRUE TRUE 16730 16683 16519 50 53 NA NCRP
17103 Lee County IL 29.26691994 15.19451851 NA TRUE TRUE 35905 34881 34735 104 53 NA NCRP
17105 Livingston County IL 34.89544291 21.70331825 NA TRUE TRUE 38978 38243 37903 135 83 NA NCRP
17107 Logan County IL 28.16714717 21.37394383 NA TRUE TRUE 30562 29943 29746 85 64 NA NCRP
17109 McDonough County IL 15.36145504 17.27328809 NA TRUE TRUE 32868 32420 31880 50 56 NA NCRP
17111 McHenry County IL 6.946698695 5.075365931 NA TRUE TRUE 300630 307367 307283 214 156 NA NCRP
17113 McLean County IL 30.13314646 21.61321494 NA TRUE TRUE 162925 174893 174061 516 378 NA NCRP
17115 Macon County IL 66.11525276 51.90295609 NA TRUE TRUE 110808 109435 108350 729 568 NA NCRP
17117 Macoupin County IL 21.70157178 12.58210356 NA TRUE TRUE 48176 46892 46453 103 59 NA NCRP
17119 Madison County IL 23.92192955 22.45114071 NA TRUE TRUE 266164 267247 266560 642 600 NA NCRP
17121 Marion County IL 66.54722293 48.64669047 NA TRUE TRUE 40037 38646 38571 260 188 NA NCRP
17123 Marshall County IL 10.43841336 14.00329489 NA TRUE TRUE 12896 12140 12014 13 17 NA NCRP
17125 Mason County IL 24.81389578 33.12892084 NA TRUE TRUE 15153 14187 13898 36 47 NA NCRP
17127 Massac County IL 37.29878288 20.69425901 NA TRUE TRUE 15397 14980 14905 57 31 NA NCRP
17129 Menard County IL 11.82312603 11.10406091 NA TRUE TRUE 12570 12608 12570 15 14 NA NCRP
17131 Mercer County IL 14.08882083 11.78440737 NA TRUE TRUE 16642 16123 15945 23 19 NA NCRP
17133 Monroe County IL 9.94545071 7.745010426 NA TRUE TRUE 31644 33570 33722 33 26 NA NCRP
17135 Montgomery County IL 38.82455318 40.44353072 NA TRUE TRUE 30378 29671 29359 116 120 NA NCRP
17137 Morgan County IL 21.45438121 12.84319881 NA TRUE TRUE 35966 35038 34929 76 45 NA NCRP
17139 Moultrie County IL 15.46842424 13.42011676 NA TRUE TRUE 14565 14903 14837 23 20 NA NCRP
17141 Ogle County IL 8.475853236 12.7918743 NA TRUE TRUE 53358 52377 52085 45 67 NA NCRP
17143 Peoria County IL 33.98942907 31.56013133 NA TRUE TRUE 183446 188529 187319 636 595 NA NCRP
17145 Perry County IL 14.42611126 14.18050409 NA TRUE TRUE 22692 21861 21672 32 31 NA NCRP
17147 Piatt County IL 8.423586041 5.474452555 NA TRUE TRUE 16682 16440 16431 14 9 NA NCRP
17149 Pike County IL 37.33855665 26.63858258 NA TRUE TRUE 16632 16142 16022 61 43 NA NCRP
17151 Pope County IL 27.37850787 34.62603878 NA TRUE TRUE 4397 4332 4276 12 15 NA NCRP
17153 Pulaski County IL 29.82601491 15.24390244 NA TRUE TRUE 6434 5904 5815 18 9 NA NCRP
17155 Putnam County IL NA 15.45064378 NA TRUE 5931 5825 5814 NA 9 NA NCRP
17157 Randolph County IL 15.65416341 8.810572687 NA TRUE TRUE 33688 32915 32869 52 29 NA NCRP
17159 Richland County IL 39.47449577 32.36245955 NA TRUE TRUE 16171 16068 16061 64 52 NA NCRP
17161 Rock Island County IL 18.85039701 11.98877415 NA TRUE TRUE 147131 146804 146063 278 176 NA NCRP
17163 St. Clair County IL 27.3296175 20.96867804 NA TRUE TRUE 263445 267065 265729 735 560 NA NCRP
17165 Saline County IL 44.88977956 38.96834324 NA TRUE TRUE 25482 24892 24612 112 97 NA NCRP
17167 Sangamon County IL 32.02719538 23.11128082 NA TRUE TRUE 193317 199037 198997 635 460 NA NCRP
17169 Schuyler County IL 14.68624833 37.71043771 NA TRUE TRUE 7513 7425 7330 11 28 NA NCRP
17171 Scott County IL NA 9.552923194 NA TRUE 5392 5234 5204 NA 5 NA NCRP
17173 Shelby County IL 20.65930118 16.69373759 NA TRUE TRUE 22379 22164 22048 46 37 NA NCRP
17175 Stark County IL 21.8781555 15.29831719 NA TRUE TRUE 6156 5883 5813 13 9 NA NCRP
17177 Stephenson County IL 33.18186622 26.07840622 NA TRUE TRUE 47917 46782 46435 157 122 NA NCRP
17179 Tazewell County IL 19.74260941 21.11870472 NA TRUE TRUE 131804 136372 135707 268 288 NA NCRP
17181 Union County IL 19.74946394 46.13018965 NA TRUE TRUE 18082 17559 17447 35 81 NA NCRP
17183 Vermilion County IL 34.62851369 27.97881071 NA TRUE TRUE 82715 80418 79728 281 225 NA NCRP
17185 Wabash County IL 23.63268062 23.22780454 NA TRUE TRUE 12354 11624 11549 28 27 NA NCRP
17187 Warren County IL 20.8309875 16.94532309 NA TRUE TRUE 17839 17704 17874 37 30 NA NCRP
17189 Washington County IL 21.19513196 NA NA TRUE 15008 14404 14337 31 NA NA NCRP
17191 Wayne County IL 24.58918076 5.416466057 NA TRUE TRUE 16829 16616 16543 41 9 NA NCRP
17193 White County IL 37.59398496 29.6020928 NA TRUE TRUE 14942 14526 14374 55 43 NA NCRP
17195 Whiteside County IL 45.39982803 25.31689772 NA TRUE TRUE 59033 57274 56876 264 145 NA NCRP
17197 Will County IL 16.69883829 16.36663605 NA TRUE TRUE 650779 683708 685419 1135 1119 NA NCRP
17199 Williamson County IL 18.76707804 15.94920105 NA TRUE TRUE 64424 67088 67008 125 107 NA NCRP
17201 Winnebago County IL 37.69803398 36.06732108 NA TRUE TRUE 289405 290845 288542 1106 1049 NA NCRP
17203 Woodford County IL 20.04986762 17.11148002 NA TRUE TRUE 37385 39155 39187 78 67 NA NCRP
18001 Adams County IN 22.07762026 32.29061554 31.90480297 TRUE TRUE TRUE 33887 34685 34791 76 112 111 NCRP
18003 Allen County IN 36.50327636 34.73635574 29.97939429 TRUE TRUE TRUE 346314 363596 365918 1308 1263 1097 NCRP
18005 Bartholomew County IN 25.66405749 26.9016581 23.93507611 TRUE TRUE TRUE 74508 79549 80217 200 214 192 NCRP
18007 Benton County IN 23.80142809 29.7210791 11.49425287 TRUE TRUE TRUE 8871 8748 8700 21 26 10 NCRP
18009 Blackford County IN 10.26450849 60.84867894 53.22151439 TRUE TRUE TRUE 13161 12490 12401 13 76 66 NCRP
18011 Boone County IN 12.06709304 21.15038252 20.18896875 TRUE TRUE TRUE 52750 60519 61915 70 128 125 NCRP
18013 Brown County IN 11.89846642 11.95695496 9.357037829 TRUE TRUE TRUE 15329 15054 14962 18 18 14 NCRP
18015 Carroll County IN 29.34009647 30.35429936 28.61014907 TRUE TRUE TRUE 20179 20096 19923 59 61 57 NCRP
18017 Cass County IN 16.75171383 16.34580458 18.73146366 TRUE TRUE TRUE 39255 38542 38438 65 63 72 NCRP
18019 Clark County IN 18.43177098 16.31205674 15.315678 TRUE TRUE TRUE 104148 112800 114262 205 184 175 NCRP
18021 Clay County IN 5.58347292 48.88606934 41.03606656 TRUE TRUE TRUE 27096 26797 26562 15 131 109 NCRP
18023 Clinton County IN 12.08970562 42.78172219 62.54576519 TRUE TRUE TRUE 33298 32958 32776 40 141 205 NCRP
18025 Crawford County IN 35.66066066 31.09980209 30.03284843 TRUE TRUE TRUE 11008 10611 10655 38 33 32 NCRP
18027 Daviess County IN 13.78100727 12.6923196 13.74927434 TRUE TRUE TRUE 30469 32303 32729 44 41 45 NCRP
18029 Dearborn County IN 47.42371186 104.4197675 114.3295762 TRUE TRUE TRUE 48879 49799 49506 237 520 566 NCRP
18031 Decatur County IN 23.13119241 46.45495393 38.4557382 TRUE TRUE TRUE 25469 26262 26524 60 122 102 NCRP
18033 DeKalb County IN 15.85686223 12.76535388 13.44878843 TRUE TRUE TRUE 41594 42302 42383 67 54 57 NCRP
18035 Delaware County IN 23.55943015 17.72399983 15.28947503 TRUE TRUE TRUE 117326 117355 117074 277 208 179 NCRP
18037 Dubois County IN 5.462793625 10.87007893 7.793127878 TRUE TRUE TRUE 41589 42318 42345 23 46 33 NCRP
18039 Elkhart County IN 42.18219891 38.83524186 31.53918137 TRUE TRUE TRUE 195047 200591 201971 838 779 637 NCRP
18041 Fayette County IN 22.81021898 54.1130081 54.1162434 TRUE TRUE TRUE 24508 23839 23468 55 129 127 NCRP
18043 Floyd County IN 9.451544196 19.32710133 21.26570315 TRUE TRUE TRUE 72358 76059 76179 71 147 162 NCRP
18045 Fountain County IN 22.79635258 23.12755737 19.20998919 TRUE TRUE TRUE 17459 16863 16658 39 39 32 NCRP
18047 Franklin County IN 31.68127767 45.79353657 49.70785733 TRUE TRUE TRUE 23122 22929 22934 73 105 114 NCRP
18049 Fulton County IN 35.75224659 45.95453434 43.41463415 TRUE TRUE TRUE 20563 20455 20500 74 94 89 NCRP
18051 Gibson County IN 11.04016232 19.37175896 18.66169022 TRUE TRUE TRUE 33429 33554 33759 37 65 63 NCRP
18053 Grant County IN 17.65440427 39.68483865 35.87627062 TRUE TRUE TRUE 70448 69044 68569 123 274 246 NCRP
18055 Greene County IN 11.8178237 22.24456836 30.25117643 TRUE TRUE TRUE 33223 32817 32726 39 73 99 NCRP
18057 Hamilton County IN 10.81359969 20.34848464 19.13271628 TRUE TRUE TRUE 244738 296828 302623 306 604 579 NCRP
18059 Hancock County IN 12.48829223 20.95757849 16.11603546 TRUE TRUE TRUE 65402 71096 71978 88 149 116 NCRP
18061 Harrison County IN 16.57613547 29.93705542 19.08445508 TRUE TRUE TRUE 37766 39082 39299 65 117 75 NCRP
18063 Hendricks County IN 19.71431071 20.30668298 19.54426616 TRUE TRUE TRUE 132350 153644 156056 293 312 305 NCRP
18065 Henry County IN 14.40892948 34.44340276 30.61536892 TRUE TRUE TRUE 48375 49066 48995 71 169 150 NCRP
18067 Howard County IN 21.49888278 36.40264703 38.20105565 TRUE TRUE TRUE 83943 82961 82982 178 302 317 NCRP
18069 Huntington County IN 72.88629738 68.13061535 73.28502152 TRUE TRUE TRUE 37601 36841 36706 270 251 269 NCRP
18071 Jackson County IN 19.17276532 41.90072751 46.21896808 TRUE TRUE TRUE 41725 43436 43705 82 182 202 NCRP
18073 Jasper County IN 7.186059045 13.18115095 15.53398058 TRUE TRUE TRUE 32419 33381 33475 24 44 52 NCRP
18075 Jay County IN 15.4689917 30.99173554 38.71759762 TRUE TRUE TRUE 21564 21296 21179 33 66 82 NCRP
18077 Jefferson County IN 14.17609171 49.21411215 53.85609651 TRUE TRUE TRUE 32287 32511 32494 46 160 175 NCRP
18079 Jennings County IN 31.06905804 48.1041313 49.28571429 TRUE TRUE TRUE 28320 28272 28000 88 136 138 NCRP
18081 Johnson County IN 27.4337781 31.54877028 27.7216717 TRUE TRUE TRUE 130512 145806 147538 389 460 409 NCRP
18083 Knox County IN 14.89572989 18.39007987 21.08703674 TRUE TRUE TRUE 38399 38064 37938 57 70 80 NCRP
18085 Kosciusko County IN 14.31759258 21.66750003 14.38317805 TRUE TRUE TRUE 76358 77997 78564 111 169 113 NCRP
18087 LaGrange County IN 21.62133305 24.95599863 18.21209283 TRUE TRUE TRUE 36613 38067 38436 81 95 70 NCRP
18089 Lake County IN 10.35912999 13.53268092 10.87249198 TRUE TRUE TRUE 491432 491403 490228 512 665 533 NCRP
18091 LaPorte County IN 11.76893361 18.33608974 18.03596425 TRUE TRUE TRUE 109641 111256 111444 131 204 201 NCRP
18093 Lawrence County IN 19.5427008 34.44291849 32.81988447 TRUE TRUE TRUE 46165 45873 45704 90 158 150 NCRP
18095 Madison County IN 48.15801323 58.21891539 47.66700751 TRUE TRUE TRUE 131240 130370 130069 631 759 620 NCRP
18097 Marion County IN 57.73687245 43.00106964 35.85790849 TRUE TRUE TRUE 878515 928349 934243 5267 3992 3350 NCRP
18099 Marshall County IN 29.11362815 41.66932415 24.4125077 TRUE TRUE TRUE 46851 47037 47107 137 196 115 NCRP
18101 Martin County IN 8.764241893 12.70772239 13.72145447 TRUE TRUE TRUE 10344 10230 10203 9 13 14 NCRP
18103 Miami County IN 22.11664482 22.69393629 18.6349224 TRUE TRUE TRUE 37745 36133 35954 81 82 67 NCRP
18105 Monroe County IN 16.47163298 22.17997465 19.04575866 TRUE TRUE TRUE 130677 142020 143339 230 315 273 NCRP
18107 Montgomery County IN 28.7845087 43.79753475 43.77916426 TRUE TRUE TRUE 38040 38130 38146 110 167 167 NCRP
18109 Morgan County IN 16.46994236 27.0713936 22.24039717 TRUE TRUE TRUE 68308 69446 69693 114 188 155 NCRP
18111 Newton County IN 18.37325984 24.85972015 21.89884148 TRUE TRUE TRUE 14326 14079 14156 26 35 31 NCRP
18113 Noble County IN 39.36096319 53.25082612 39.48086858 TRUE TRUE TRUE 47470 47511 47618 187 253 188 NCRP
18115 Ohio County IN 18.10699588 33.14001657 43.08202154 TRUE TRUE TRUE 6022 6035 6035 11 20 26 NCRP
18117 Orange County IN 9.077613596 13.68682516 12.73820442 TRUE TRUE TRUE 19666 19727 19626 18 27 25 NCRP
18119 Owen County IN 18.63325104 32.12092584 29.56745672 TRUE TRUE TRUE 21871 21170 20969 40 68 62 NCRP
18121 Parke County IN 22.08018594 40.03713589 29.01410085 TRUE TRUE TRUE 17376 17234 17233 38 69 50 NCRP
18123 Perry County IN 24.67866324 45.66912972 44.20684692 TRUE TRUE TRUE 19202 19488 19454 48 89 86 NCRP
18125 Pike County IN 12.51956182 26.84351808 17.42712294 TRUE TRUE TRUE 13016 12666 12624 16 34 22 NCRP
18127 Porter County IN 8.536762569 11.3563304 10.83339319 TRUE TRUE TRUE 158595 166427 167076 141 189 181 NCRP
18129 Posey County IN 21.77886672 31.35410543 24.66718872 TRUE TRUE TRUE 26348 25515 25540 56 80 63 NCRP
18131 Pulaski County IN 15.84546895 12.30390649 16.19495643 TRUE TRUE TRUE 13713 13004 12967 21 16 21 NCRP
18133 Putnam County IN 30.15952803 39.69945646 35.08958477 TRUE TRUE TRUE 37768 37532 37618 114 149 132 NCRP
18135 Randolph County IN 8.469682387 13.66333542 9.848723605 TRUE TRUE TRUE 26415 25616 25384 22 35 25 NCRP
18137 Ripley County IN 25.4923872 50.97915129 47.0224936 TRUE TRUE TRUE 28352 28443 28497 73 145 134 NCRP
18139 Rush County IN 34.18902474 41.11600587 56.23964007 TRUE TRUE TRUE 17723 17025 16892 59 70 95 NCRP
18141 St. Joseph County IN 24.52248645 23.34644932 19.80434799 TRUE TRUE TRUE 265496 266850 267618 654 623 530 NCRP
18143 Scott County IN 31.20449345 71.69210129 75.06747638 TRUE TRUE TRUE 23982 23852 23712 75 171 178 NCRP
18145 Shelby County IN 51.67262025 61.5702665 70.43675273 TRUE TRUE TRUE 43812 44502 44579 230 274 314 NCRP
18147 Spencer County IN 12.88167939 8.635578584 13.94163742 TRUE TRUE TRUE 20977 20844 20801 27 18 29 NCRP
18149 Starke County IN 53.29436541 61.1673487 39.43832885 TRUE TRUE TRUE 23362 23215 23074 124 142 91 NCRP
18151 Steuben County IN 12.57677684 21.57811862 31.18806109 TRUE TRUE TRUE 34044 34294 34308 43 74 107 NCRP
18153 Sullivan County IN 20.63693073 15.57117916 15.20190024 TRUE TRUE TRUE 21540 21193 21050 44 33 32 NCRP
18155 Switzerland County IN 8.543763053 11.39817629 11.48105626 TRUE TRUE TRUE 10151 10528 10452 9 12 12 NCRP
18157 Tippecanoe County IN 15.60115699 27.41467459 25.01720616 TRUE TRUE TRUE 163010 180925 183074 274 496 458 NCRP
18159 Tipton County IN 3.157761778 8.341889117 5.189750243 TRUE TRUE TRUE 16326 15584 15415 5 13 8 NCRP
18161 Union County IN 48.51752022 57.46340129 41.40215291 TRUE TRUE TRUE 7432 7309 7246 36 42 30 NCRP
18163 Vanderburgh County IN 38.33926085 40.82104846 33.51537861 TRUE TRUE TRUE 176822 181524 182006 691 741 610 NCRP
18165 Vermillion County IN 31.68095416 29.64364554 14.01898936 TRUE TRUE TRUE 16585 15855 15693 51 47 22 NCRP
18167 Vigo County IN 33.39994819 27.68651482 21.72405824 TRUE TRUE TRUE 106509 108356 108175 361 300 235 NCRP
18169 Wabash County IN 35.22205207 59.66365772 57.67084212 TRUE TRUE TRUE 33665 32348 32252 115 193 186 NCRP
18171 Warren County IN 18.90359168 8.34028357 11.97318008 TRUE TRUE TRUE 8625 8393 8352 16 7 10 NCRP
18173 Warrick County IN 8.476970896 12.13094867 6.377863906 TRUE TRUE TRUE 56746 61001 61149 51 74 39 NCRP
18175 Washington County IN 16.74743444 45.30744337 49.86010474 TRUE TRUE TRUE 28164 27810 27878 47 126 139 NCRP
18177 Wayne County IN 71.3275085 66.6392068 65.61156182 TRUE TRUE TRUE 69642 67978 67671 489 453 444 NCRP
18179 Wells County IN 14.79770455 36.77531007 44.14614888 TRUE TRUE TRUE 27872 27736 27862 41 102 123 NCRP
18181 White County IN 21.59563198 11.07646866 11.04158999 TRUE TRUE TRUE 24830 24376 24453 53 27 27 NCRP
18183 Whitley County IN 11.42032818 14.14044166 12.27434662 TRUE TRUE TRUE 32597 33238 33403 38 47 41 NCRP
19001 Adair County IA 7.907221929 NA NA TRUE 7924 7463 7454 6 NA NA NCRP
19003 Adams County IA NA NA NA 4224 3892 3875 NA NA NA NCRP
19005 Allamakee County IA NA 4.983625231 8.548226243 TRUE TRUE 14378 14046 14038 NA 7 12 NCRP
19007 Appanoose County IA 13.2729544 17.37893988 20.53550272 TRUE TRUE TRUE 13319 12659 12661 17 22 26 NCRP
19009 Audubon County IA NA 10.20408163 12.08146358 TRUE TRUE 6265 5880 5794 NA 6 7 NCRP
19011 Benton County IA 5.00558315 1.942728368 7.009345794 TRUE TRUE TRUE 26137 25737 25680 13 5 18 NCRP
19013 Black Hawk County IA 50.35445888 50.682173 45.59922346 TRUE TRUE TRUE 127486 132591 132897 662 672 606 NCRP
19015 Boone County IA 12.92284303 9.107468124 9.457874626 TRUE TRUE TRUE 26471 26352 26433 34 24 25 NCRP
19017 Bremer County IA 8.201090745 13.42718802 10.51737389 TRUE TRUE TRUE 24054 24577 24721 20 33 26 NCRP
19019 Buchanan County IA 9.544716999 13.85438563 13.30924993 TRUE TRUE TRUE 20957 20932 21038 20 29 28 NCRP
19021 Buena Vista County IA 5.896805897 11.65954139 14.57867626 TRUE TRUE TRUE 19909 20584 20578 12 24 30 NCRP
19023 Butler County IA 5.365886377 7.334311241 9.996001599 TRUE TRUE TRUE 14931 14998 15006 8 11 15 NCRP
19025 Calhoun County IA 13.06270096 5.045917852 10.13581999 TRUE TRUE TRUE 10093 9909 9866 13 5 10 NCRP
19027 Carroll County IA 6.752845842 4.369144133 8.267678241 TRUE TRUE TRUE 20832 20599 20562 14 9 17 NCRP
19029 Cass County IA 10.15007613 13.97264304 18.59012493 TRUE TRUE TRUE 14021 13598 13448 14 19 25 NCRP
19031 Cedar County IA 3.793626707 7.073290168 2.715767748 TRUE TRUE TRUE 18332 18379 18411 7 13 5 NCRP
19033 Cerro Gordo County IA 28.90831285 24.13515688 27.28071392 TRUE TRUE TRUE 44531 43505 43254 127 105 118 NCRP
19035 Cherokee County IA 6.65945226 11.74693741 11.82832038 TRUE TRUE TRUE 12215 11918 11836 8 14 14 NCRP
19037 Chickasaw County IA 4.846918168 NA 4.076973255 TRUE TRUE 12603 12288 12264 6 NA 5 NCRP
19039 Clarke County IA 11.81398346 7.560211686 16.27427579 TRUE TRUE TRUE 9196 9259 9217 11 7 15 NCRP
19041 Clay County IA 3.613587087 9.105256768 12.71571299 TRUE TRUE TRUE 16812 16474 16515 6 15 21 NCRP
19043 Clayton County IA 6.11450806 10.12088839 15.8263622 TRUE TRUE TRUE 18272 17785 17692 11 18 28 NCRP
19045 Clinton County IA 11.24836387 13.86302504 13.94351835 TRUE TRUE TRUE 49487 48330 48051 55 67 67 NCRP
19047 Crawford County IA 15.11188608 4.017908392 6.384954725 TRUE TRUE TRUE 16868 17422 17228 26 7 11 NCRP
19049 Dallas County IA 4.458763628 5.888099348 6.330749354 TRUE TRUE TRUE 56158 74727 77400 31 44 49 NCRP
19051 Davis County IA 13.70645346 15.96351197 14.80469195 TRUE TRUE TRUE 8619 8770 8781 12 14 13 NCRP
19053 Decatur County IA 8.425613866 10.91570649 8.471499455 TRUE TRUE TRUE 8576 8245 8263 7 9 7 NCRP
19055 Delaware County IA 4.528729125 10.8577633 12.07035291 TRUE TRUE TRUE 17957 17499 17398 8 19 21 NCRP
19057 Des Moines County IA 38.4605841 27.4399288 21.11538939 TRUE TRUE TRUE 40192 40452 40255 155 111 85 NCRP
19059 Dickinson County IA 5.946010227 7.670069031 4.723944494 TRUE TRUE TRUE 16667 16949 16935 10 13 8 NCRP
19061 Dubuque County IA 15.46429971 14.17966469 12.24447442 TRUE TRUE TRUE 91258 95912 96370 146 136 118 NCRP
19063 Emmet County IA 7.888768366 8.004802882 7.007007007 TRUE TRUE TRUE 10437 9994 9990 8 8 7 NCRP
19065 Fayette County IA 29.77619825 23.41349202 15.73022661 TRUE TRUE TRUE 21265 20501 20343 62 48 32 NCRP
19067 Floyd County IA 12.98139334 8.069522036 9.330098899 TRUE TRUE TRUE 16586 16110 16077 21 13 15 NCRP
19069 Franklin County IA 6.589475666 8.546196942 NA TRUE TRUE 10699 10531 10436 7 9 NA NCRP
19071 Fremont County IA 8.229323824 7.079144839 12.81686129 TRUE TRUE TRUE 7622 7063 7022 6 5 9 NCRP
19073 Greene County IA 12.96596434 6.553079948 20.65217391 TRUE TRUE TRUE 9611 9156 9200 12 6 19 NCRP
19075 Grundy County IA 5.637886598 NA 6.464646465 TRUE TRUE 12436 12311 12375 7 NA 8 NCRP
19077 Guthrie County IA 6.455777921 13.1147541 13.05726544 TRUE TRUE TRUE 11150 10675 10722 7 14 14 NCRP
19079 Hamilton County IA 6.457445435 9.796238245 10.5841106 TRUE TRUE TRUE 16144 15312 15117 10 15 16 NCRP
19081 Hancock County IA 5.336653918 10.80886327 7.254919742 TRUE TRUE TRUE 11729 11102 11027 6 12 8 NCRP
19083 Hardin County IA 4.583739185 8.034894399 7.509675929 TRUE TRUE TRUE 17893 17424 17311 8 14 13 NCRP
19085 Harrison County IA 5.431461742 11.0826349 NA TRUE TRUE 15346 14437 14324 8 16 NA NCRP
19087 Henry County IA 10.40221914 19.28878777 21.7638621 TRUE TRUE TRUE 20326 20219 20217 21 39 44 NCRP
19089 Howard County IA NA NA 5.291565245 TRUE 9664 9511 9449 NA NA 5 NCRP
19091 Humboldt County IA 6.137479542 7.229164515 NA TRUE TRUE 10038 9683 9640 6 7 NA NCRP
19093 Ida County IA 11.26919284 9.801176141 21.30076683 TRUE TRUE TRUE 7247 7142 7042 8 7 15 NCRP
19095 Iowa County IA 3.675794891 4.89566122 4.885496183 TRUE TRUE TRUE 16391 16341 16375 6 8 8 NCRP
19097 Jackson County IA 3.546638294 2.555975872 4.619648907 TRUE TRUE TRUE 20092 19562 19482 7 5 9 NCRP
19099 Jasper County IA 10.89621357 12.79573113 15.7300933 TRUE TRUE TRUE 37288 36731 36872 40 47 58 NCRP
19101 Jefferson County IA 7.142857143 8.682565409 9.235209235 TRUE TRUE TRUE 16401 17276 17325 12 15 16 NCRP
19103 Johnson County IA 9.624423654 6.651694394 7.941695306 TRUE TRUE TRUE 122226 139814 142287 129 93 113 NCRP
19105 Jones County IA 4.845665552 4.872344572 NA TRUE TRUE 20678 20524 20454 10 10 NA NCRP
19107 Keokuk County IA 8.630609896 NA NA TRUE 10713 10313 10231 9 NA NA NCRP
19109 Kossuth County IA 7.125736866 8.509524121 3.941663382 TRUE TRUE TRUE 16045 15277 15222 11 13 6 NCRP
19111 Lee County IA 21.82672935 19.49923699 22.38848268 TRUE TRUE TRUE 36291 35386 35286 78 69 79 NCRP
19113 Linn County IA 14.29073445 10.13480681 9.644042967 TRUE TRUE TRUE 202709 216087 217751 305 219 210 NCRP
19115 Louisa County IA 10.57455058 4.427129449 8.063793567 TRUE TRUE TRUE 11904 11294 11161 12 5 9 NCRP
19117 Lucas County IA 13.57466063 12.5930166 12.64222503 TRUE TRUE TRUE 9331 8735 8701 12 11 11 NCRP
19119 Lyon County IA 6.00394545 5.131713992 10.27133442 TRUE TRUE TRUE 11604 11692 11683 7 6 12 NCRP
19121 Madison County IA 3.203895937 8.407165492 10.89115254 TRUE TRUE TRUE 15262 15463 15609 5 13 17 NCRP
19123 Mahaska County IA 20.95594792 16.06282349 23.24541797 TRUE TRUE TRUE 22298 22412 22370 47 36 52 NCRP
19125 Marion County IA 11.40524641 16.86950235 17.38348569 TRUE TRUE TRUE 33396 33196 33365 38 56 58 NCRP
19127 Marshall County IA 35.04901961 27.05865146 28.3854549 TRUE TRUE TRUE 39601 41022 40866 143 111 116 NCRP
19129 Mills County IA 9.343923113 12.74312542 14.83379408 TRUE TRUE TRUE 15214 14910 14831 14 19 22 NCRP
19131 Mitchell County IA NA NA NA 10836 10724 10779 NA NA NA NCRP
19133 Monona County IA 5.430060817 18.67311072 10.00444642 TRUE TRUE TRUE 9479 9104 8996 5 17 9 NCRP
19135 Monroe County IA 19.97503121 17.51751752 7.499062617 TRUE TRUE TRUE 7911 7992 8001 16 14 6 NCRP
19137 Montgomery County IA 9.411764706 NA 15.3536129 TRUE TRUE 11179 10421 10421 10 NA 16 NCRP
19139 Muscatine County IA 18.22515071 13.04813831 18.87979862 TRUE TRUE TRUE 42145 42918 42903 78 56 81 NCRP
19141 O'Brien County IA 40.00280721 11.39033246 13.51735913 TRUE TRUE TRUE 14558 14047 14056 57 16 19 NCRP
19143 Osceola County IA NA 9.643201543 NA TRUE 6713 6222 6218 NA 6 NA NCRP
19145 Page County IA 4.419749968 5.135777107 6.453278265 TRUE TRUE TRUE 16331 15577 15496 7 8 10 NCRP
19147 Palo Alto County IA NA 7.633587786 5.495109353 TRUE TRUE 9586 9170 9099 NA 7 5 NCRP
19149 Plymouth County IA 8.024716126 10.0304927 8.442550454 TRUE TRUE TRUE 24982 24924 24874 20 25 21 NCRP
19151 Pocahontas County IA 8.283860279 12.58037462 14.00952648 TRUE TRUE TRUE 7694 7154 7138 6 9 10 NCRP
19153 Polk County IA 33.19591063 32.86692547 27.94316556 TRUE TRUE TRUE 405990 451822 459862 1455 1485 1285 NCRP
19155 Pottawattamie County IA 26.89270885 20.57169937 26.95215188 TRUE TRUE TRUE 90867 92846 93128 250 191 251 NCRP
19157 Poweshiek County IA 4.786215699 9.123108297 16.60595672 TRUE TRUE TRUE 19053 18634 18668 9 17 31 NCRP
19159 Ringgold County IA NA 11.89060642 NA TRUE 5230 5046 5051 NA 6 NA NCRP
19161 Sac County IA NA NA 4.982561036 TRUE 10707 10049 10035 NA NA 5 NCRP
19163 Scott County IA 32.61910462 20.40421453 19.07962681 TRUE TRUE TRUE 159597 170553 171387 545 348 327 NCRP
19165 Shelby County IA 4.963600265 5.023442733 9.206561768 TRUE TRUE TRUE 12480 11944 11948 6 6 11 NCRP
19167 Sioux County IA 5.580029369 6.662032209 8.36192728 TRUE TRUE TRUE 33077 34524 34681 19 23 29 NCRP
19169 Story County IA 14.87603306 9.956107483 10.94894391 TRUE TRUE TRUE 84739 93410 94073 135 93 103 NCRP
19171 Tama County IA 14.15548383 13.12560635 16.04492579 TRUE TRUE TRUE 18149 17523 17451 25 23 28 NCRP
19173 Taylor County IA NA 8.081461128 9.767214716 TRUE TRUE 6557 6187 6143 NA 5 6 NCRP
19175 Union County IA 7.173029409 18.2554171 28.76318313 TRUE TRUE TRUE 12225 12599 12516 9 23 36 NCRP
19177 Van Buren County IA NA 6.720430108 14.72951259 TRUE TRUE 7660 7440 7468 NA 5 11 NCRP
19179 Wapello County IA 38.62527841 30.81446301 27.26343292 TRUE TRUE TRUE 35776 35373 35212 137 109 96 NCRP
19181 Warren County IA 11.15137998 13.9243444 12.51146885 TRUE TRUE TRUE 44178 47399 47956 52 66 60 NCRP
19183 Washington County IA 7.786021801 13.1728367 13.14000906 TRUE TRUE TRUE 21472 22015 22070 17 29 29 NCRP
19185 Wayne County IA NA NA 9.382329945 TRUE 6478 6416 6395 NA NA 6 NCRP
19187 Webster County IA 34.55057673 32.24419604 25.16574212 TRUE TRUE TRUE 38534 37216 36955 130 120 93 NCRP
19189 Winnebago County IA 10.24972046 NA 5.682356284 TRUE TRUE 11138 10494 10559 11 NA 6 NCRP
19191 Winneshiek County IA 2.851982128 6.226351837 7.222650231 TRUE TRUE TRUE 21012 20879 20768 6 13 15 NCRP
19193 Woodbury County IA 35.92579903 27.66968459 29.62716704 TRUE TRUE TRUE 100693 102278 102271 367 283 303 NCRP
19195 Worth County IA 9.256810368 NA 10.49317943 TRUE TRUE 7649 7541 7624 7 NA 8 NCRP
19197 Wright County IA 3.819126184 10.79996914 12.46105919 TRUE TRUE TRUE 13588 12963 12840 5 14 16 NCRP
20001 Allen County KS NA NA 23.23960028 TRUE 13639 13098 12909 NA NA 30 Kansas Sentencing Commission
20003 Anderson County KS NA NA 15.22263098 TRUE 8023 7858 7883 NA NA 12 Kansas Sentencing Commission
20005 Atchison County KS NA NA 38.15175922 TRUE 16902 16717 16513 NA NA 63 Kansas Sentencing Commission
20007 Barber County KS NA NA 14.294466 TRUE 5003 4938 4897 NA NA 7 Kansas Sentencing Commission
20009 Barton County KS NA NA 13.8762096 TRUE 27460 27510 27385 NA NA 38 Kansas Sentencing Commission
20011 Bourbon County KS NA NA 31.81695099 TRUE 14990 14826 14772 NA NA 47 Kansas Sentencing Commission
20013 Brown County KS NA NA 20.37697402 TRUE 10111 9949 9815 NA NA 20 Kansas Sentencing Commission
20015 Butler County KS NA NA 9.059749045 FALSE TRUE 63571 65884 66227 NA NA 60 Kansas Sentencing Commission
20017 Chase County KS NA NA 7.429420505 TRUE 2949 2708 2692 NA NA 2 Kansas Sentencing Commission
20019 Chautauqua County KS NA NA 5.745475438 TRUE 3836 3553 3481 NA NA 2 Kansas Sentencing Commission
20021 Cherokee County KS NA NA 4.329629095 TRUE 21855 20933 20787 NA NA 9 Kansas Sentencing Commission
20023 Cheyenne County KS NA NA NA 0 2866 2682 2693 NA NA NA Kansas Sentencing Commission
20025 Clark County KS NA NA 13.99253731 TRUE 2252 2201 2144 NA NA 3 Kansas Sentencing Commission
20027 Clay County KS NA NA 24.04713238 TRUE 8458 8390 8317 NA NA 20 Kansas Sentencing Commission
20029 Cloud County KS NA NA 26.63825253 TRUE 9560 9365 9385 NA NA 25 Kansas Sentencing Commission
20031 Coffey County KS NA NA 10.67235859 TRUE 8652 8415 8433 NA NA 9 Kansas Sentencing Commission
20033 Comanche County KS NA NA 5.117707267 TRUE 1842 1924 1954 NA NA 1 Kansas Sentencing Commission
20035 Cowley County KS NA NA 19.18638601 TRUE 35787 36230 35963 NA NA 69 Kansas Sentencing Commission
20037 Crawford County KS NA NA 21.63400356 TRUE 38855 39330 39290 NA NA 85 Kansas Sentencing Commission
20039 Decatur County KS NA NA 17.19394773 TRUE 3107 2915 2908 NA NA 5 Kansas Sentencing Commission
20041 Dickinson County KS NA NA 17.01557183 TRUE 19429 19521 19394 NA NA 33 Kansas Sentencing Commission
20043 Doniphan County KS NA NA 8.89001778 TRUE 7936 7859 7874 NA NA 7 Kansas Sentencing Commission
20045 Douglas County KS NA NA 9.177853069 FALSE TRUE 107187 114803 116585 NA NA 107 Kansas Sentencing Commission
20047 Edwards County KS NA NA 26.40264026 TRUE 3078 2957 3030 NA NA 8 Kansas Sentencing Commission
20049 Elk County KS NA NA 11.13585746 TRUE 2971 2650 2694 NA NA 3 Kansas Sentencing Commission
20051 Ellis County KS NA NA 29.98655775 TRUE 27653 29060 29013 NA NA 87 Kansas Sentencing Commission
20053 Ellsworth County KS NA NA 10.95118899 TRUE 6465 6390 6392 NA NA 7 Kansas Sentencing Commission
20055 Finney County KS NA NA 20.16996558 FALSE TRUE 36259 37131 37184 NA NA 75 Kansas Sentencing Commission
20057 Ford County KS NA NA 30.46414715 FALSE TRUE 32029 34950 34795 NA NA 106 Kansas Sentencing Commission
20059 Franklin County KS NA NA 14.83737457 FALSE TRUE 25716 25790 25611 NA NA 38 Kansas Sentencing Commission
20061 Geary County KS NA NA 26.42115872 TRUE 27708 36987 36713 NA NA 97 Kansas Sentencing Commission
20063 Gove County KS NA NA NA 0 2824 2765 2727 NA NA NA Kansas Sentencing Commission
20065 Graham County KS NA NA 7.794232268 TRUE 2751 2598 2566 NA NA 2 Kansas Sentencing Commission
20067 Grant County KS NA NA 10.23541453 TRUE 7707 7869 7816 NA NA 8 Kansas Sentencing Commission
20069 Gray County KS NA NA 11.50937192 TRUE 5838 6007 6082 NA NA 7 Kansas Sentencing Commission
20071 Greeley County KS NA NA 7.686395081 TRUE 1262 1286 1301 NA NA 1 Kansas Sentencing Commission
20073 Greenwood County KS NA NA 20.54361568 TRUE 6944 6404 6328 NA NA 13 Kansas Sentencing Commission
20075 Hamilton County KS NA NA 30.73376873 TRUE 2583 2606 2603 NA NA 8 Kansas Sentencing Commission
20077 Harper County KS NA NA 15.46923341 TRUE 6049 5859 5818 NA NA 9 Kansas Sentencing Commission
20079 Harvey County KS NA NA 15.79551982 TRUE 33659 34803 34820 NA NA 55 Kansas Sentencing Commission
20081 Haskell County KS NA NA 7.306380906 TRUE 4182 4136 4106 NA NA 3 Kansas Sentencing Commission
20083 Hodgeman County KS NA NA 20.87682672 TRUE 2027 1951 1916 NA NA 4 Kansas Sentencing Commission
20085 Jackson County KS NA NA 35.45313539 TRUE 13356 13373 13539 NA NA 48 Kansas Sentencing Commission
20087 Jefferson County KS NA NA 15.38053567 TRUE 19005 18824 18855 NA NA 29 Kansas Sentencing Commission
20089 Jewell County KS NA NA 13.14492277 TRUE 3264 3067 3043 NA NA 4 Kansas Sentencing Commission
20091 Johnson County KS NA NA 9.664409896 FALSE TRUE 514813 567326 574272 NA NA 555 Kansas Sentencing Commission
20093 Kearny County KS NA NA 10.21711367 TRUE 4052 3904 3915 NA NA 4 Kansas Sentencing Commission
20095 Kingman County KS NA NA 9.093270979 TRUE 8119 7837 7698 NA NA 7 Kansas Sentencing Commission
20097 Kiowa County KS NA NA 23.8758456 TRUE 3039 2518 2513 NA NA 6 Kansas Sentencing Commission
20099 Labette County KS NA NA 19.08396947 TRUE 21929 20969 20960 NA NA 40 Kansas Sentencing Commission
20101 Lane County KS NA NA 23.7107291 TRUE 1780 1720 1687 NA NA 4 Kansas Sentencing Commission
20103 Leavenworth County KS NA NA 9.645037248 TRUE 72741 78234 78797 NA NA 76 Kansas Sentencing Commission
20105 Lincoln County KS NA NA 3.157562362 TRUE 3360 3138 3167 NA NA 1 Kansas Sentencing Commission
20107 Linn County KS NA NA 22.1006104 TRUE 10013 9531 9502 NA NA 21 Kansas Sentencing Commission
20109 Logan County KS NA NA 17.89549034 TRUE 2808 2789 2794 NA NA 5 Kansas Sentencing Commission
20111 Lyon County KS NA NA 25.5931591 TRUE 35832 33522 33212 NA NA 85 Kansas Sentencing Commission
20113 McPherson County KS NA NA 0.683971136 TRUE 29174 29606 29241 NA NA 2 Kansas Sentencing Commission
20115 Marion County KS NA NA 4.914809961 TRUE 12804 12224 12208 NA NA 6 Kansas Sentencing Commission
20117 Marshall County KS NA NA 24.98500899 TRUE 10171 10028 10006 NA NA 25 Kansas Sentencing Commission
20119 Meade County KS NA NA NA 0 4531 4304 4357 NA NA NA Kansas Sentencing Commission
20121 Miami County KS NA NA 9.140210834 TRUE 31180 32839 32822 NA NA 30 Kansas Sentencing Commission
20123 Mitchell County KS NA NA 12.73074475 TRUE 6382 6336 6284 NA NA 8 Kansas Sentencing Commission
20125 Montgomery County KS NA NA 32.29120798 FALSE TRUE 35246 34396 34065 NA NA 110 Kansas Sentencing Commission
20127 Morris County KS NA NA 15.7950158 TRUE 5929 5717 5698 NA NA 9 Kansas Sentencing Commission
20129 Morton County KS NA NA 12.86173633 TRUE 3285 3150 3110 NA NA 4 Kansas Sentencing Commission
20131 Nemaha County KS NA NA 15.76665353 TRUE 10345 10140 10148 NA NA 16 Kansas Sentencing Commission
20133 Neosho County KS NA NA 18.2748538 TRUE 16479 16458 16416 NA NA 30 Kansas Sentencing Commission
20135 Ness County KS NA NA NA 0 3135 3094 3105 NA NA NA Kansas Sentencing Commission
20137 Norton County KS NA NA 14.38848921 TRUE 5748 5642 5560 NA NA 8 Kansas Sentencing Commission
20139 Osage County KS NA NA 13.80522088 TRUE 16633 16082 15936 NA NA 22 Kansas Sentencing Commission
20141 Osborne County KS NA NA 13.31203408 TRUE 3998 3806 3756 NA NA 5 Kansas Sentencing Commission
20143 Ottawa County KS NA NA 3.297609233 TRUE 6108 6071 6065 NA NA 2 Kansas Sentencing Commission
20145 Pawnee County KS NA NA 20.24291498 TRUE 6889 6946 6916 NA NA 14 Kansas Sentencing Commission
20147 Phillips County KS NA NA 3.614675583 TRUE 5573 5571 5533 NA NA 2 Kansas Sentencing Commission
20149 Pottawatomie County KS NA NA 10.04498406 TRUE 19720 22670 22897 NA NA 23 Kansas Sentencing Commission
20151 Pratt County KS NA NA 22.33502538 TRUE 9658 9844 9850 NA NA 22 Kansas Sentencing Commission
20153 Rawlins County KS NA NA 3.86996904 TRUE 2663 2603 2584 NA NA 1 Kansas Sentencing Commission
20155 Reno County KS NA NA 32.29143807 FALSE TRUE 63822 64155 63794 NA NA 206 Kansas Sentencing Commission
20157 Republic County KS NA NA 8.328128253 TRUE 5159 4810 4803 NA NA 4 Kansas Sentencing Commission
20159 Rice County KS NA NA 17.97304044 TRUE 10224 10010 10015 NA NA 18 Kansas Sentencing Commission
20161 Riley County KS NA NA 9.043274729 FALSE TRUE 66928 75905 75194 NA NA 68 Kansas Sentencing Commission
20163 Rooks County KS NA NA 7.759456838 TRUE 5322 5164 5155 NA NA 4 Kansas Sentencing Commission
20165 Rush County KS NA NA 18.76759462 TRUE 3294 3186 3197 NA NA 6 Kansas Sentencing Commission
20167 Russell County KS NA NA 18.68890167 TRUE 6894 6929 6956 NA NA 13 Kansas Sentencing Commission
20169 Saline County KS NA NA 27.62084118 FALSE TRUE 54478 55830 55755 NA NA 154 Kansas Sentencing Commission
20171 Scott County KS NA NA 3.937007874 TRUE 4738 4992 5080 NA NA 2 Kansas Sentencing Commission
20173 Sedgwick County KS NA NA 27.27971337 FALSE TRUE 471659 506121 508803 NA NA 1388 Kansas Sentencing Commission
20175 Seward County KS NA NA 21.30833156 FALSE TRUE 22246 23470 23465 NA NA 50 Kansas Sentencing Commission
20177 Shawnee County KS NA NA 21.13157629 FALSE TRUE 172986 178574 178406 NA NA 377 Kansas Sentencing Commission
20179 Sheridan County KS NA NA NA 0 2585 2531 2539 NA NA NA Kansas Sentencing Commission
20181 Sherman County KS NA NA 18.00327332 TRUE 5979 6107 6110 NA NA 11 Kansas Sentencing Commission
20183 Smith County KS NA NA 2.653223667 TRUE 4052 3720 3769 NA NA 1 Kansas Sentencing Commission
20185 Stafford County KS NA NA 6.98161508 TRUE 4440 4350 4297 NA NA 3 Kansas Sentencing Commission
20187 Stanton County KS NA NA 4.737091426 TRUE 2212 2167 2111 NA NA 1 Kansas Sentencing Commission
20189 Stevens County KS NA NA 13.79072574 TRUE 5481 5790 5801 NA NA 8 Kansas Sentencing Commission
20191 Sumner County KS NA NA 16.57599456 TRUE 24493 23614 23528 NA NA 39 Kansas Sentencing Commission
20193 Thomas County KS NA NA 12.67266506 TRUE 7726 8001 7891 NA NA 10 Kansas Sentencing Commission
20195 Trego County KS NA NA 6.891798759 TRUE 2991 2959 2902 NA NA 2 Kansas Sentencing Commission
20197 Wabaunsee County KS NA NA 4.272287098 TRUE 6845 7041 7022 NA NA 3 Kansas Sentencing Commission
20199 Wallace County KS NA NA 19.92031873 TRUE 1527 1562 1506 NA NA 3 Kansas Sentencing Commission
20201 Washington County KS NA NA 12.50446588 TRUE 5950 5628 5598 NA NA 7 Kansas Sentencing Commission
20203 Wichita County KS NA NA 4.595588235 TRUE 2287 2186 2176 NA NA 1 Kansas Sentencing Commission
20205 Wilson County KS NA NA 21.0456358 TRUE 9747 9105 9028 NA NA 19 Kansas Sentencing Commission
20207 Woodson County KS NA NA 15.83782072 TRUE 3440 3206 3157 NA NA 5 Kansas Sentencing Commission
20209 Wyandotte County KS NA NA 29.44888515 FALSE TRUE 153689 160601 161636 NA NA 476 Kansas Sentencing Commission
21001 Adair County KY 28.3483098 32.92396133 25.5155176 TRUE TRUE TRUE 18335 19135 19204 53 63 49 NCRP
21003 Allen County KY 23.85330219 32.56204055 37.28414443 TRUE TRUE TRUE 19272 20269 20384 48 66 76 NCRP
21005 Anderson County KY 16.68597914 20.68775285 22.38669591 TRUE TRUE TRUE 20519 21752 21888 36 45 49 NCRP
21007 Ballard County KY 51.91982613 66.40907993 65.53398058 TRUE TRUE TRUE 8204 8282 8240 43 55 54 NCRP
21009 Barren County KY 38.81987578 23.69558147 23.8713266 TRUE TRUE TRUE 40857 43046 43148 165 102 103 NCRP
21011 Bath County KY 16.19502216 49.96668887 33.59003769 TRUE TRUE TRUE 11558 12008 12206 19 60 41 NCRP
21013 Bell County KY 48.22415432 78.83891776 81.71934625 TRUE TRUE TRUE 28960 27905 27778 137 220 227 NCRP
21015 Boone County KY 27.22457802 33.00277031 36.7841915 TRUE TRUE TRUE 109295 124535 126413 330 411 465 NCRP
21017 Bourbon County KY 27.50137507 20.56684224 42.05888244 TRUE TRUE TRUE 19809 19935 19972 55 41 84 NCRP
21019 Boyd County KY 25.5505536 68.62324612 70.44560944 TRUE TRUE TRUE 49312 48963 48832 126 336 344 NCRP
21021 Boyle County KY 36.23567123 53.06205218 64.29677506 TRUE TRUE TRUE 28031 29588 29706 104 157 191 NCRP
21023 Bracken County KY 21.24645892 39.09952607 41.63692601 TRUE TRUE TRUE 8484 8440 8406 18 33 35 NCRP
21025 Breathitt County KY 28.31010453 22.11247881 35.05108509 TRUE TRUE TRUE 14549 13567 13409 39 30 47 NCRP
21027 Breckinridge County KY 49.85293385 48.36457918 54.80691874 TRUE TRUE TRUE 19590 20056 19888 100 97 109 NCRP
21029 Bullitt County KY 13.68770764 29.94050951 33.73741261 TRUE TRUE TRUE 70042 76819 77955 103 230 263 NCRP
21031 Butler County KY 37.65887337 59.25463901 66.7961165 TRUE TRUE TRUE 12925 12826 12875 48 76 86 NCRP
21033 Caldwell County KY 36.30465008 71.95932734 61.29666012 TRUE TRUE TRUE 12828 12785 12725 47 92 78 NCRP
21035 Calloway County KY 29.1576385 29.88909572 27.16681469 TRUE TRUE TRUE 36375 38141 38282 109 114 104 NCRP
21037 Campbell County KY 51.65220846 73.09733545 74.70081561 TRUE TRUE TRUE 88036 91385 91833 468 668 686 NCRP
21039 Carlisle County KY 35.5450237 52.12510024 30.13258337 TRUE TRUE TRUE 5212 4988 4978 18 26 15 NCRP
21041 Carroll County KY 78.88460833 106.6078485 123.901988 TRUE TRUE TRUE 10528 10881 10815 86 116 134 NCRP
21043 Carter County KY 10.54813953 43.60411857 40.03967234 TRUE TRUE TRUE 27921 27291 27223 29 119 109 NCRP
21045 Casey County KY 35.61164563 54.01378283 47.82581335 TRUE TRUE TRUE 15900 16107 15891 57 87 76 NCRP
21047 Christian County KY 39.36954792 35.74211927 32.05387205 TRUE TRUE TRUE 70592 74422 74250 292 266 238 NCRP
21049 Clark County KY 47.46124466 21.90580504 33.83858158 TRUE TRUE TRUE 34823 35607 35758 169 78 121 NCRP
21051 Clay County KY 21.26380992 35.78491383 26.00841727 TRUE TRUE TRUE 22718 21238 21147 46 76 55 NCRP
21053 Clinton County KY 40.15670911 41.43646409 42.30201672 TRUE TRUE TRUE 9942 10136 10165 41 42 43 NCRP
21055 Crittenden County KY 33.39437682 55.30253741 44.44926279 TRUE TRUE TRUE 9264 9222 9224 31 51 41 NCRP
21057 Cumberland County KY 23.38497515 22.01027146 16.30837658 TRUE TRUE TRUE 7073 6815 6745 16 15 11 NCRP
21059 Daviess County KY 41.9623573 36.96537678 38.36174002 TRUE TRUE TRUE 93908 98200 98275 408 363 377 NCRP
21061 Edmonson County KY 30.45768851 49.66065221 34.12969283 TRUE TRUE TRUE 11957 12082 12013 37 60 41 NCRP
21063 Elliott County KY 16.70092497 23.41920375 39.10323253 TRUE TRUE TRUE 7151 7686 7672 13 18 30 NCRP
21065 Estill County KY 13.69769194 49.06703525 45.6842251 TRUE TRUE TRUE 14786 14470 14447 20 71 66 NCRP
21067 Fayette County KY 29.05169806 29.83032382 29.85871807 TRUE TRUE TRUE 279971 308411 310797 874 920 928 NCRP
21069 Fleming County KY 18.70453758 43.24843825 44.00137504 TRUE TRUE TRUE 14235 14567 14545 27 63 64 NCRP
21071 Floyd County KY 25.09632934 34.33655022 26.24120919 TRUE TRUE TRUE 40429 38443 38108 99 132 100 NCRP
21073 Franklin County KY 26.52358777 27.38567488 25.86206897 TRUE TRUE TRUE 48699 49661 49880 131 136 129 NCRP
21075 Fulton County KY 96.2406015 129.9921691 108.5395052 TRUE TRUE TRUE 6871 6385 6265 64 83 68 NCRP
21077 Gallatin County KY 38.70967742 81.13828786 52.39259518 TRUE TRUE TRUE 8253 8504 8589 33 69 45 NCRP
21079 Garrard County KY 33.14393939 26.65403068 24.91398742 TRUE TRUE TRUE 16595 16883 16858 56 45 42 NCRP
21081 Grant County KY 42.94105732 44.35221354 57.48743719 TRUE TRUE TRUE 24253 24576 24875 106 109 143 NCRP
21083 Graves County KY 27.86037665 30.23006956 24.19054708 TRUE TRUE TRUE 36859 37380 37618 104 113 91 NCRP
21085 Grayson County KY 64.25889366 48.78423539 46.95731847 TRUE TRUE TRUE 25294 26033 26194 166 127 123 NCRP
21087 Green County KY 18.66334874 4.48149144 10.86661233 TRUE TRUE TRUE 11454 11157 11043 21 5 12 NCRP
21089 Greenup County KY 15.47987616 43.84042087 38.00815247 TRUE TRUE TRUE 36827 36496 36308 57 160 138 NCRP
21091 Hancock County KY 42.98327138 36.84089339 45.69861762 TRUE TRUE TRUE 8542 8686 8753 37 32 40 NCRP
21093 Hardin County KY 39.16731789 42.84141275 47.4756618 TRUE TRUE TRUE 97539 108073 108266 416 463 514 NCRP
21095 Harlan County KY 40.67282504 32.25014898 22.36977595 TRUE TRUE TRUE 30113 28527 28163 118 92 63 NCRP
21097 Harrison County KY 20.86342481 40.47053745 46.25645439 TRUE TRUE TRUE 18483 18532 18592 39 75 86 NCRP
21099 Hart County KY 29.43581357 40.99465991 37.10275851 TRUE TRUE TRUE 18109 18539 18597 54 76 69 NCRP
21101 Henderson County KY 71.48564888 54.32322318 74.03103278 TRUE TRUE TRUE 45633 46389 46467 331 252 344 NCRP
21103 Henry County KY 19.44894652 20.73747651 16.05445672 TRUE TRUE TRUE 15475 15431 15572 30 32 25 NCRP
21105 Hickman County KY 64.12908564 48.44144903 40.13519223 TRUE TRUE TRUE 5002 4748 4734 31 23 19 NCRP
21107 Hopkins County KY 52.55287332 30.93049231 26.95359669 TRUE TRUE TRUE 46727 46556 46376 246 144 125 NCRP
21109 Jackson County KY 29.06543449 26.16626794 33.11009105 TRUE TRUE TRUE 13577 13376 13289 39 35 44 NCRP
21111 Jefferson County KY 32.66897051 29.90959775 29.47267593 TRUE TRUE TRUE 715149 757282 760026 2439 2265 2240 NCRP
21113 Jessamine County KY 26.26649291 39.33391902 37.39053429 TRUE TRUE TRUE 45024 50084 50815 129 197 190 NCRP
21115 Johnson County KY 11.97758481 36.65189226 36.54028029 TRUE TRUE TRUE 23382 23464 23262 28 86 85 NCRP
21117 Kenton County KY 28.5398065 52.39736299 51.72971225 TRUE TRUE TRUE 155557 163367 163929 459 856 848 NCRP
21119 Knott County KY 19.7323796 37.35059761 44.67656683 TRUE TRUE TRUE 16837 16064 15892 32 60 71 NCRP
21121 Knox County KY 35.7759297 46.80089204 49.68865966 TRUE TRUE TRUE 31599 31837 31798 114 149 158 NCRP
21123 Larue County KY 16.25556576 25.57544757 25.38787024 TRUE TRUE TRUE 13934 14076 14180 23 36 36 NCRP
21125 Laurel County KY 40.38663017 43.73251118 39.15687745 TRUE TRUE TRUE 57239 59681 60015 239 261 235 NCRP
21127 Lawrence County KY 10.70731246 30.94997473 31.00480891 TRUE TRUE TRUE 15766 15832 15804 17 49 49 NCRP
21129 Lee County KY 22.50463331 41.78091135 67.15828285 TRUE TRUE TRUE 7850 7659 7594 17 32 51 NCRP
21131 Leslie County KY 16.04278075 11.81281236 12.82286133 TRUE TRUE TRUE 11642 11005 10918 18 13 14 NCRP
21133 Letcher County KY 21.48582762 38.70199464 38.1009461 TRUE TRUE TRUE 24534 23513 23359 52 91 89 NCRP
21135 Lewis County KY 23.81124179 56.52583521 43.22766571 TRUE TRUE TRUE 14010 13799 13880 33 78 60 NCRP
21137 Lincoln County KY 21.94943501 29.08286569 33.54469217 TRUE TRUE TRUE 24838 24413 24445 54 71 82 NCRP
21139 Livingston County KY 38.02683004 40.56362084 50.2190405 TRUE TRUE TRUE 9594 9368 9359 36 38 47 NCRP
21141 Logan County KY 40.63828201 46.72204094 45.40886589 TRUE TRUE TRUE 26768 26968 26867 109 126 122 NCRP
21143 Lyon County KY 23.82654277 47.26456339 35.58718861 TRUE TRUE TRUE 8434 8463 8430 20 40 30 NCRP
21145 McCracken County KY 69.50160037 70.51085959 65.37448711 TRUE TRUE TRUE 64678 65380 65316 456 461 427 NCRP
21147 McCreary County KY 41.84330782 51.27919291 41.98622852 TRUE TRUE TRUE 17892 17941 17863 76 92 75 NCRP
21149 McLean County KY 30.44939101 16.81908967 34.81747204 TRUE TRUE TRUE 9702 9513 9478 29 16 33 NCRP
21151 Madison County KY 30.24673716 42.12065304 47.40096176 TRUE TRUE TRUE 80264 86181 87340 254 363 414 NCRP
21153 Magoffin County KY 25.0398361 24.01797474 30.20212189 TRUE TRUE TRUE 13258 12907 12913 33 31 39 NCRP
21155 Marion County KY 34.59860603 20.01501126 14.99475184 TRUE TRUE TRUE 19392 19985 20007 69 40 30 NCRP
21157 Marshall County KY 35.78732106 30.79588105 26.81484832 TRUE TRUE TRUE 31204 31173 30953 112 96 83 NCRP
21159 Martin County KY 20.25710947 32.32673658 26.32208662 TRUE TRUE TRUE 13371 12683 12537 26 41 33 NCRP
21161 Mason County KY 59.01902361 105.7253452 87.38203425 TRUE TRUE TRUE 17138 17309 17166 103 183 150 NCRP
21163 Meade County KY 49.60727573 50.26328387 49.76148804 TRUE TRUE TRUE 29397 29246 29139 144 147 145 NCRP
21165 Menifee County KY 31.57562362 39.5381939 30.22109114 TRUE TRUE TRUE 6567 6323 6287 20 25 19 NCRP
21167 Mercer County KY 24.86745179 52.14695105 36.58708195 TRUE TRUE TRUE 21181 21286 21319 53 111 78 NCRP
21169 Metcalfe County KY 15.93149457 17.06313359 22.02202202 TRUE TRUE TRUE 10123 9963 9990 16 17 22 NCRP
21171 Monroe County KY 54.25786279 34.4988345 23.35575486 TRUE TRUE TRUE 11337 10725 10704 59 37 25 NCRP
21173 Montgomery County KY 35.87175846 70.74261418 61.14872243 TRUE TRUE TRUE 25085 27282 27474 96 193 168 NCRP
21175 Morgan County KY 15.37672988 28.4665518 27.8132752 TRUE TRUE TRUE 14174 13349 13303 21 38 37 NCRP
21177 Muhlenberg County KY 45.50227511 75.21444117 87.15993207 TRUE TRUE TRUE 31595 31244 31207 143 235 272 NCRP
21179 Nelson County KY 40.99760847 28.31969792 26.33223244 TRUE TRUE TRUE 41424 44492 44812 180 126 118 NCRP
21181 Nicholas County KY 28.22865208 58.38792367 66.75188183 TRUE TRUE TRUE 7147 7022 7041 20 41 47 NCRP
21183 Ohio County KY 46.75433104 45.89644094 43.37490095 TRUE TRUE TRUE 23658 23967 23977 112 110 104 NCRP
21185 Oldham County KY 5.579258287 7.525538797 5.985194519 TRUE TRUE TRUE 56329 62454 63490 34 47 38 NCRP
21187 Owen County KY 33.31174239 40.43633628 38.51573509 TRUE TRUE TRUE 10886 10634 10645 36 43 41 NCRP
21189 Owsley County KY 33.76952301 82.2867042 79.85803017 TRUE TRUE TRUE 4743 4618 4508 16 38 36 NCRP
21191 Pendleton County KY 21.06837026 69.27772824 57.26902643 TRUE TRUE TRUE 14972 14579 14493 31 101 83 NCRP
21193 Perry County KY 41.42094917 59.31537197 71.02221256 TRUE TRUE TRUE 28829 27986 27597 118 166 196 NCRP
21195 Pike County KY 23.11044934 27.2291947 22.84481391 TRUE TRUE TRUE 65632 63902 63034 149 174 144 NCRP
21197 Powell County KY 33.38102051 34.33956237 41.01656748 TRUE TRUE TRUE 12943 12522 12434 42 43 51 NCRP
21199 Pulaski County KY 39.76707854 62.96319558 55.15080298 TRUE TRUE TRUE 60752 63688 63825 252 401 352 NCRP
21201 Robertson County KY NA 40.54054054 59.17159763 TRUE TRUE 2309 2220 2197 NA 9 13 NCRP
21203 Rockcastle County KY 52.95052068 55.50581916 69.53524308 TRUE TRUE TRUE 16974 16755 16826 90 93 117 NCRP
21205 Rowan County KY 27.74813234 57.81329706 69.75269499 TRUE TRUE TRUE 22706 23524 23655 65 136 165 NCRP
21207 Russell County KY 15.87661601 26.55667307 23.06740182 TRUE TRUE TRUE 17232 17698 17774 28 47 41 NCRP
21209 Scott County KY 14.74589296 20.58641297 16.57437017 TRUE TRUE TRUE 41924 50033 51284 71 103 85 NCRP
21211 Shelby County KY 20.74060264 19.88296166 21.83844011 TRUE TRUE TRUE 39283 44259 44875 89 88 98 NCRP
21213 Simpson County KY 37.26423207 39.48555957 40.39044093 TRUE TRUE TRUE 17115 17728 17826 65 70 72 NCRP
21215 Spencer County KY 12.71455817 15.38110972 19.80982567 TRUE TRUE TRUE 15638 17554 17668 22 27 35 NCRP
21217 Taylor County KY 31.7266626 14.29138547 15.44126381 TRUE TRUE TRUE 23971 25190 25257 78 36 39 NCRP
21219 Todd County KY 38.38464614 30.43896187 38.33865815 TRUE TRUE TRUE 12092 12484 12520 48 38 48 NCRP
21221 Trigg County KY 16.09629785 37.75695707 26.16320181 TRUE TRUE TRUE 13780 14302 14142 23 54 37 NCRP
21223 Trimble County KY 17.01066001 24.88124859 35.28340542 TRUE TRUE TRUE 8856 8842 8786 15 22 31 NCRP
21225 Union County KY 56.81067512 39.73246805 52.09363666 TRUE TRUE TRUE 15246 15101 15165 86 60 79 NCRP
21227 Warren County KY 37.33605918 33.54007955 41.09247883 TRUE TRUE TRUE 105170 118664 120460 431 398 495 NCRP
21229 Washington County KY 25.4798709 11.75285426 6.689522535 TRUE TRUE TRUE 11456 11912 11959 30 14 8 NCRP
21231 Wayne County KY 34.62037794 43.56454814 40.02733574 TRUE TRUE TRUE 20547 20659 20486 72 90 82 NCRP
21233 Webster County KY 41.28575641 32.83337064 30.97612572 TRUE TRUE TRUE 13875 13401 13236 56 44 41 NCRP
21235 Whitley County KY 17.63816563 43.2754454 37.7432893 TRUE TRUE TRUE 36149 35586 35503 63 154 134 NCRP
21237 Wolfe County KY 20.55076038 22.05983731 42.97199889 TRUE TRUE TRUE 7256 7253 7214 15 16 31 NCRP
21239 Woodford County KY 14.00672323 15.839075 18.38594844 TRUE TRUE TRUE 24134 25254 25563 35 40 47 NCRP
22001 Acadia Parish LA 25.2235355 35.22655986 31.20699037 TRUE TRUE TRUE 60522 62169 62486 156 219 195 NCRP
22003 Allen Parish LA 18.3064579 36.66861713 48.22463345 TRUE TRUE TRUE 25692 25635 25713 47 94 124 NCRP
22005 Ascension Parish LA 16.2845706 21.41009508 18.96965709 TRUE TRUE TRUE 96421 114432 117029 179 245 222 NCRP
22007 Assumption Parish LA 15.04211793 21.55544059 19.53633759 TRUE TRUE TRUE 23477 23196 23034 35 50 45 NCRP
22009 Avoyelles Parish LA 29.68993176 52.50804559 52.25422287 TRUE TRUE TRUE 42080 41327 41145 124 217 215 NCRP
22011 Beauregard Parish LA 33.43456577 35.33666455 41.16249517 TRUE TRUE TRUE 34510 36223 36198 120 128 149 NCRP
22013 Bienville Parish LA 35.13950383 50.73240443 51.85451927 TRUE TRUE TRUE 14773 13995 13885 50 71 72 NCRP
22015 Bossier Parish LA 36.59949811 32.78212002 34.46235527 TRUE TRUE TRUE 110606 123848 125064 439 406 431 NCRP
22017 Caddo Parish LA 49.89219373 48.36105407 43.9820588 TRUE TRUE TRUE 252740 255164 252603 1275 1234 1111 NCRP
22019 Calcasieu Parish LA 22.78740027 25.58968649 28.24486319 TRUE TRUE TRUE 185350 195782 197204 441 501 557 NCRP
22021 Caldwell Parish LA 29.75304969 54.36424041 50.53567819 TRUE TRUE TRUE 10224 9933 9894 30 54 50 NCRP
22023 Cameron Parish LA 16.20268081 26.95014224 41.92244348 TRUE TRUE TRUE 7719 6679 6679 11 18 28 NCRP
22025 Catahoula Parish LA 39.68253968 37.01539061 45.31573244 TRUE TRUE TRUE 10423 10266 10151 41 38 46 NCRP
22027 Claiborne Parish LA 29.47418062 40.71368698 28.028272 TRUE TRUE TRUE 17109 16702 16412 50 68 46 NCRP
22029 Concordia Parish LA 39.22138292 67.88766789 67.91752174 TRUE TRUE TRUE 20315 20475 20466 81 139 139 NCRP
22031 De Soto Parish LA 46.61917726 46.84272647 36.10640336 TRUE TRUE TRUE 26175 27112 27142 125 127 98 NCRP
22033 East Baton Rouge Parish LA 25.7523744 26.43286569 25.2218401 TRUE TRUE TRUE 433474 445279 446042 1138 1177 1125 NCRP
22035 East Carroll Parish LA 37.78994006 39.8036354 48.08334446 TRUE TRUE TRUE 8188 7537 7487 29 30 36 NCRP
22037 East Feliciana Parish LA 16.40893044 25.37427049 17.66516933 TRUE TRUE TRUE 20559 19705 19813 33 50 35 NCRP
22039 Evangeline Parish LA 40.8368597 53.04332365 32.64094955 TRUE TRUE TRUE 34839 33746 33700 138 179 110 NCRP
22041 Franklin Parish LA 37.19986473 52.56753468 52.8349885 TRUE TRUE TRUE 20685 20545 20441 77 108 108 NCRP
22043 Grant Parish LA 21.70668837 47.42517113 51.82273052 TRUE TRUE TRUE 21039 22351 22384 48 106 116 NCRP
22045 Iberia Parish LA 40.65206455 45.38700527 44.64708509 TRUE TRUE TRUE 73362 74030 73913 299 336 330 NCRP
22047 Iberville Parish LA 35.67146283 36.18637478 34.20649923 TRUE TRUE TRUE 33519 33438 33327 119 121 114 NCRP
22049 Jackson Parish LA 18.49910588 32.24206349 30.01125422 TRUE TRUE TRUE 15950 16128 15994 30 52 48 NCRP
22051 Jefferson Parish LA 34.83460483 34.76272261 33.0490503 TRUE TRUE TRUE 426285 435524 435716 1510 1514 1440 NCRP
22053 Jefferson Davis Parish LA 32.70048892 27.13834169 30.81615148 TRUE TRUE TRUE 31489 31321 31477 103 85 97 NCRP
22055 Lafayette Parish LA 23.58501061 27.14971251 26.48062331 TRUE TRUE TRUE 209424 231310 235644 530 628 624 NCRP
22057 Lafourche Parish LA 20.7741202 35.85923452 32.74841869 TRUE TRUE TRUE 94385 97325 98020 201 349 321 NCRP
22059 La Salle Parish LA 30.3173213 53.98110661 61.99878698 TRUE TRUE TRUE 14519 14820 14839 45 80 92 NCRP
22061 Lincoln Parish LA 42.19409283 43.76367615 37.80162547 TRUE TRUE TRUE 44867 47528 47617 198 208 180 NCRP
22063 Livingston Parish LA 16.51407153 36.57682623 31.30732002 TRUE TRUE TRUE 115722 134238 135751 215 491 425 NCRP
22065 Madison Parish LA 53.1164412 34.37578603 44.75217428 TRUE TRUE TRUE 12537 11927 11843 64 41 53 NCRP
22067 Morehouse Parish LA 42.3866971 39.94821528 36.62182362 TRUE TRUE TRUE 29079 27035 26760 117 108 98 NCRP
22069 Natchitoches Parish LA 33.49998731 35.51354113 33.70270132 TRUE TRUE TRUE 38984 39140 39166 132 139 132 NCRP
22071 Orleans Parish LA 24.73299292 43.37662201 42.23043297 TRUE TRUE TRUE 230172 379006 384320 883 1644 1623 NCRP
22073 Ouachita Parish LA 39.70486482 46.7403414 42.66751959 TRUE TRUE TRUE 151183 156182 156325 614 730 667 NCRP
22075 Plaquemines Parish LA 17.96023092 32.17612193 35.39898494 TRUE TRUE TRUE 22329 23620 23447 42 76 83 NCRP
22077 Pointe Coupee Parish LA 18.4729064 26.28882057 21.86914219 TRUE TRUE TRUE 22754 22443 22406 42 59 49 NCRP
22079 Rapides Parish LA 46.04874502 39.83342386 34.19177586 TRUE TRUE TRUE 130103 132552 132488 608 528 453 NCRP
22081 Red River Parish LA 54.27558706 42.83620787 50.75556581 TRUE TRUE TRUE 9281 8871 8669 49 38 44 NCRP
22083 Richland Parish LA 36.51037663 45.45454545 62.19864995 TRUE TRUE TRUE 20661 20900 20740 76 95 129 NCRP
22085 Sabine Parish LA 47.35238409 54.41728161 46.69614447 TRUE TRUE TRUE 23954 24257 24199 115 132 113 NCRP
22087 St. Bernard Parish LA 19.30501931 31.12033195 25.89565178 TRUE TRUE TRUE 16563 43380 44409 75 135 115 NCRP
22089 St. Charles Parish LA 15.96138864 24.32442705 23.88852024 TRUE TRUE TRUE 52453 52622 52745 84 128 126 NCRP
22091 St. Helena Parish LA 27.11986982 54.37286886 32.95978906 TRUE TRUE TRUE 11089 10851 10619 30 59 35 NCRP
22093 St. James Parish LA 14.14491696 17.97235023 15.71309733 TRUE TRUE TRUE 21964 21700 21638 31 39 34 NCRP
22095 St. John the Baptist Parish LA 11.74150956 21.77949976 21.71676763 TRUE TRUE TRUE 47296 43619 43745 53 95 95 NCRP
22097 St. Landry Parish LA 16.16108411 32.82537857 34.16597976 TRUE TRUE TRUE 85128 83472 83709 135 274 286 NCRP
22099 St. Martin Parish LA 27.96856866 28.89736713 27.94710682 TRUE TRUE TRUE 51044 52946 53315 147 153 149 NCRP
22101 St. Mary Parish LA 51.77706276 53.61179086 54.55024265 TRUE TRUE TRUE 54152 53533 53162 280 287 290 NCRP
22103 St. Tammany Parish LA 29.76793677 37.85910474 41.0447913 TRUE TRUE TRUE 223133 242478 245829 705 918 1009 NCRP
22105 Tangipahoa Parish LA 23.56010272 26.85087803 23.84906611 TRUE TRUE TRUE 114102 125508 127049 289 337 303 NCRP
22107 Tensas Parish LA 27.42409403 34.64438557 60.04140787 TRUE TRUE TRUE 5719 4907 4830 14 17 29 NCRP
22109 Terrebonne Parish LA 42.63953946 46.60949236 42.00197656 TRUE TRUE TRUE 109994 112638 113328 477 525 476 NCRP
22111 Union Parish LA 41.19418852 47.69121055 50.135321 TRUE TRUE TRUE 22919 22436 22539 93 107 113 NCRP
22113 Vermilion Parish LA 15.75504333 33.72226344 30.19323671 TRUE TRUE TRUE 56388 59308 59616 92 200 180 NCRP
22115 Vernon Parish LA 18.28223196 26.5010979 24.93669915 TRUE TRUE TRUE 50781 52828 52132 96 140 130 NCRP
22117 Washington Parish LA 44.10354746 66.61779924 61.35764594 TRUE TRUE TRUE 45157 46384 46286 207 309 284 NCRP
22119 Webster Parish LA 51.1708375 62.8977175 55.785585 TRUE TRUE TRUE 41331 40701 40333 210 256 225 NCRP
22121 West Baton Rouge Parish LA 39.14709312 38.28140908 37.07394857 TRUE TRUE TRUE 22666 24555 25085 94 94 93 NCRP
22123 West Carroll Parish LA 21.66377816 40.98718061 53.79609544 TRUE TRUE TRUE 11851 11467 11525 25 47 62 NCRP
22125 West Feliciana Parish LA 19.32740626 25.21334368 12.98195508 TRUE TRUE TRUE 15736 15468 15406 30 39 20 NCRP
22127 Winn Parish LA 36.35402208 46.66260905 61.7242081 TRUE TRUE TRUE 15720 14787 14743 55 69 91 NCRP
23001 Androscoggin County ME NA 9.684237972 NA FALSE TRUE FALSE 107932 107391 107440 NA 104 NA NCRP
23003 Aroostook County ME NA 17.98997701 NA FALSE TRUE FALSE 72827 70039 69447 NA 126 NA NCRP
23005 Cumberland County ME NA 7.590969195 NA FALSE TRUE FALSE 277084 285866 287797 NA 217 NA NCRP
23007 Franklin County ME NA 12.12359514 NA TRUE FALSE 30528 30519 30296 NA 37 NA NCRP
23009 Hancock County ME NA 6.935572185 NA TRUE FALSE 54009 54790 54696 NA 38 NA NCRP
23011 Kennebec County ME NA 7.517182131 NA TRUE FALSE 121508 121056 121112 NA 91 NA NCRP
23013 Knox County ME NA 12.88269172 NA TRUE FALSE 40417 39588 39676 NA 51 NA NCRP
23015 Lincoln County ME NA 5.560433128 NA TRUE FALSE 34904 34170 34170 NA 19 NA NCRP
23017 Oxford County ME NA 7.156571828 NA TRUE FALSE 57556 57290 57238 NA 41 NA NCRP
23019 Penobscot County ME NA 10.81581194 NA FALSE TRUE FALSE 151446 153479 153414 NA 166 NA NCRP
23021 Piscataquis County ME NA 8.150908244 NA TRUE FALSE 17597 17176 17026 NA 14 NA NCRP
23023 Sagadahoc County ME NA 7.992236113 NA TRUE FALSE 35895 35034 35045 NA 28 NA NCRP
23025 Somerset County ME NA 10.83591331 NA TRUE FALSE 52195 51680 51163 NA 56 NA NCRP
23027 Waldo County ME NA 9.749839641 NA TRUE FALSE 38763 38975 39051 NA 38 NA NCRP
23029 Washington County ME NA 11.18498726 NA TRUE FALSE 33323 32186 31808 NA 36 NA NCRP
23031 York County ME NA 5.96601876 NA TRUE FALSE 197635 199463 200710 NA 119 NA NCRP
24001 Allegany County MD 12.50100815 14.00769743 NA TRUE TRUE 73980 73531 72952 93 103 NA NCRP
24003 Anne Arundel County MD 7.145140019 7.387462523 NA TRUE TRUE 517698 556348 560133 389 411 NA NCRP
24005 Baltimore County MD 15.80772683 14.35883493 NA TRUE TRUE 793733 823883 826925 1284 1183 NA NCRP
24009 Calvert County MD 8.507589666 13.48364279 NA TRUE TRUE 87043 90480 90613 76 122 NA NCRP
24011 Caroline County MD 19.77426911 27.87819374 NA TRUE TRUE 32214 32642 32538 65 91 NA NCRP
24013 Carroll County MD 6.57654803 7.462953897 NA TRUE TRUE 166950 167494 167830 110 125 NA NCRP
24015 Cecil County MD 15.28072164 16.17662918 NA TRUE TRUE 98821 101999 102383 155 165 NA NCRP
24017 Charles County MD 21.41557631 18.44342708 NA TRUE TRUE 141164 152900 154747 319 282 NA NCRP
24019 Dorchester County MD 30.35227029 40.78253404 NA TRUE TRUE 31677 32612 32578 99 133 NA NCRP
24021 Frederick County MD 6.211232613 8.3259463 NA TRUE TRUE 224211 241414 243675 147 201 NA NCRP
24023 Garrett County MD 4.997667755 15.02504174 NA TRUE TRUE 30147 29950 29679 15 45 NA NCRP
24025 Harford County MD 17.47316187 21.1294429 NA TRUE TRUE 241163 249415 250105 431 527 NA NCRP
24027 Howard County MD 3.811844626 4.886303266 NA TRUE TRUE 271793 304934 309284 112 149 NA NCRP
24029 Kent County MD 23.34823646 21.7182686 NA TRUE TRUE 19786 19799 19820 47 43 NA NCRP
24031 Montgomery County MD 2.728722533 3.579248985 NA TRUE TRUE 926492 1019767 1030447 270 365 NA NCRP
24033 Prince George's County MD 7.418592963 8.465677103 NA TRUE TRUE 852097 894199 904430 648 757 NA NCRP
24035 Queen Anne's County MD 15.7787651 11.52927613 NA TRUE TRUE 45716 48572 48804 76 56 NA NCRP
24037 St. Mary's County MD 11.95379113 12.05655621 NA TRUE TRUE 98849 109484 110382 128 132 NA NCRP
24039 Somerset County MD 33.02083729 32.51845901 NA TRUE TRUE 26139 26139 25859 87 85 NA NCRP
24041 Talbot County MD 17.96138303 16.07420485 NA TRUE TRUE 37000 37949 37643 68 61 NA NCRP
24043 Washington County MD 27.68888739 29.74555492 NA TRUE TRUE 144286 149266 149573 411 444 NA NCRP
24045 Wicomico County MD 32.3023986 37.34115153 NA TRUE TRUE 94621 100961 101539 322 377 NA NCRP
24047 Worcester County MD 14.56904757 28.29731563 NA TRUE TRUE 50678 51595 51675 75 146 NA NCRP
24510 Baltimore city MD 130.3574733 80.68603987 NA TRUE TRUE 621109 623404 622793 8101 5030 NA NCRP
25001 Barnstable County MA NA 3.21175222 3.81547968 FALSE TRUE TRUE 220037 214836 214914 NA 69 82 NCRP
25003 Berkshire County MA NA 4.710824858 5.282989551 FALSE TRUE TRUE 131977 129489 128715 NA 61 68 NCRP
25005 Bristol County MA NA 5.034708702 5.395222612 FALSE TRUE TRUE 544487 552167 554194 NA 278 299 NCRP
25007 Dukes County MA NA NA NA 15768 17190 17356 NA NA NA NCRP
25009 Essex County MA NA 8.074933287 7.632386805 FALSE TRUE TRUE 729455 764093 769091 NA 617 587 NCRP
25011 Franklin County MA NA 5.059377416 4.939177556 FALSE TRUE TRUE 71708 71155 70862 NA 36 35 NCRP
25013 Hampden County MA NA 6.054589721 4.934199987 FALSE TRUE TRUE 461408 467414 468161 NA 283 231 NCRP
25015 Hampshire County MA NA 1.180344164 1.801924953 FALSE TRUE TRUE 156168 160970 160939 NA 19 29 NCRP
25017 Middlesex County MA NA 3.131957454 3.107656744 FALSE TRUE TRUE 1456528 1558131 1570315 NA 488 488 NCRP
25019 Nantucket County MA NA NA NA 9811 10568 10856 NA NA NA NCRP
25021 Norfolk County MA NA 2.947543883 3.178024251 FALSE TRUE TRUE 653421 688709 692254 NA 203 220 NCRP
25023 Plymouth County MA NA 4.963902501 6.193025155 FALSE TRUE TRUE 486779 503636 507022 NA 250 314 NCRP
25025 Suffolk County MA NA 6.288704145 5.93023953 FALSE TRUE TRUE 687192 760093 767254 NA 478 455 NCRP
25027 Worcester County MA NA 3.516682029 3.060942254 FALSE TRUE TRUE 785345 810423 813475 NA 285 249 NCRP
26001 Alcona County MI 16.68984701 8.509029025 NA TRUE TRUE 11503 10577 10454 18 9 NA NCRP
26003 Alger County MI 9.476676845 12.61166579 NA TRUE TRUE 9687 9515 9459 9 12 NA NCRP
26005 Allegan County MI 11.63394247 9.067875717 NA TRUE TRUE 111156 112485 113847 130 102 NA NCRP
26007 Alpena County MI 9.18398585 15.47402084 NA TRUE TRUE 30209 29081 28988 27 45 NA NCRP
26009 Antrim County MI 13.61470388 15.02855425 NA TRUE TRUE 24278 23289 23267 32 35 NA NCRP
26011 Arenac County MI 10.15679553 3.883243803 NA TRUE TRUE 16968 15451 15353 16 6 NA NCRP
26013 Baraga County MI 9.104358712 NA NA TRUE 8940 8688 8654 8 NA NA NCRP
26015 Barry County MI 9.979533499 5.919061068 NA TRUE TRUE 59610 59131 59281 59 35 NA NCRP
26017 Bay County MI 12.85969882 13.55951223 NA TRUE TRUE 108711 106936 106179 138 145 NA NCRP
26019 Benzie County MI 6.867345771 5.170630817 NA TRUE TRUE 17867 17406 17519 12 9 NA NCRP
26021 Berrien County MI 27.64092392 23.37095435 NA TRUE TRUE 157537 155321 155233 432 363 NA NCRP
26023 Branch County MI 8.333708726 12.42178874 NA TRUE TRUE 46805 43472 43545 37 54 NA NCRP
26025 Calhoun County MI 18.29799165 12.1634651 NA TRUE TRUE 138291 134830 134878 248 164 NA NCRP
26027 Cass County MI 13.78993335 12.38342169 NA TRUE TRUE 52282 51682 51608 72 64 NA NCRP
26029 Charlevoix County MI 6.530925855 3.829216925 NA TRUE TRUE 26394 26115 26121 17 10 NA NCRP
26031 Cheboygan County MI 18.4721955 14.04330018 NA TRUE TRUE 27249 25635 25675 48 36 NA NCRP
26033 Chippewa County MI 5.417956656 11.63422012 NA TRUE TRUE 39051 38679 38321 21 45 NA NCRP
26035 Clare County MI 9.408558544 7.855202435 NA TRUE TRUE 31612 30553 30652 29 24 NA NCRP
26037 Clinton County MI 8.706894277 5.706430109 NA TRUE TRUE 72881 77106 77297 66 44 NA NCRP
26039 Crawford County MI 18.5489049 18.69427668 NA TRUE TRUE 14597 13908 13745 26 26 NA NCRP
26041 Delta County MI 5.680742284 8.96276379 NA TRUE TRUE 37898 36819 36559 21 33 NA NCRP
26043 Dickinson County MI 14.88492806 17.26983152 NA TRUE TRUE 26951 26057 25957 39 45 NA NCRP
26045 Eaton County MI 7.876204596 8.684164334 NA TRUE TRUE 108364 108243 108579 85 94 NA NCRP
26047 Emmet County MI 14.91265445 14.5159827 NA TRUE TRUE 32926 33067 33204 49 48 NA NCRP
26049 Genesee County MI 16.65184131 12.29479601 NA TRUE TRUE 441164 415623 412895 702 511 NA NCRP
26051 Gladwin County MI 7.013715711 13.32601709 NA TRUE TRUE 26726 25514 25411 18 34 NA NCRP
26053 Gogebic County MI 6.180851721 8.176100629 NA TRUE TRUE 16552 15900 15737 10 13 NA NCRP
26055 Grand Traverse County MI 12.58760291 9.219763619 NA TRUE TRUE 84705 90024 90782 111 83 NA NCRP
26057 Gratiot County MI 11.62569991 9.99191131 NA TRUE TRUE 42714 42034 41665 49 42 NA NCRP
26059 Hillsdale County MI 15.7114263 9.975062344 NA TRUE TRUE 47499 46115 45830 73 46 NA NCRP
26061 Houghton County MI 3.014194114 1.633586539 NA TRUE TRUE 35765 36729 36495 11 6 NA NCRP
26063 Huron County MI 4.274678636 7.748574262 NA TRUE TRUE 34363 32264 32065 14 25 NA NCRP
26065 Ingham County MI 11.04674086 9.257983244 NA TRUE TRUE 282104 282999 284582 311 262 NA NCRP
26067 Ionia County MI 8.918931606 11.25070317 NA TRUE TRUE 65157 63996 64294 57 72 NA NCRP
26069 Iosco County MI 8.183306056 5.909001379 NA TRUE TRUE 26869 25385 25420 21 15 NA NCRP
26071 Iron County MI 9.38326367 8.673026886 NA TRUE TRUE 12248 11530 11387 11 10 NA NCRP
26073 Isabella County MI 11.36363636 11.21776667 NA TRUE TRUE 68556 70424 70616 80 79 NA NCRP
26075 Jackson County MI 23.23170503 14.13303817 NA TRUE TRUE 163387 159909 159741 372 226 NA NCRP
26077 Kalamazoo County MI 15.38991071 11.62469723 NA TRUE TRUE 244178 257211 258818 389 299 NA NCRP
26079 Kalkaska County MI 19.83432505 11.57809425 NA TRUE TRUE 17572 17274 17394 34 20 NA NCRP
26081 Kent County MI 16.29086662 15.5206653 NA TRUE TRUE 595191 622396 629237 993 966 NA NCRP
26083 Keweenaw County MI NA NA NA 2087 2181 2217 NA NA NA NCRP
26085 Lake County MI 20.02612103 14.06964474 NA TRUE TRUE 11707 11372 11341 23 16 NA NCRP
26087 Lapeer County MI 4.981714842 4.078996567 NA TRUE TRUE 91691 88257 88153 44 36 NA NCRP
26089 Leelanau County MI 5.534544784 5.058168943 NA TRUE TRUE 21818 21747 21915 12 11 NA NCRP
26091 Lenawee County MI 11.75820311 10.29803732 NA TRUE TRUE 101715 99048 99047 117 102 NA NCRP
26093 Livingston County MI 9.484545126 10.14143781 NA TRUE TRUE 181620 184392 185596 173 187 NA NCRP
26095 Luce County MI 15.26717557 13.80368098 NA TRUE TRUE 6736 6520 6426 10 9 NA NCRP
26097 Mackinac County MI 7.207856564 NA NA TRUE 11474 11072 11042 8 NA NA NCRP
26099 Macomb County MI 9.382428002 6.970784693 NA TRUE TRUE 833328 854997 860112 793 596 NA NCRP
26101 Manistee County MI 11.37009665 10.22745868 NA TRUE TRUE 25201 24444 24420 28 25 NA NCRP
26103 Marquette County MI 5.641497669 5.616067866 NA TRUE TRUE 66002 67663 67676 38 38 NA NCRP
26105 Mason County MI 12.21725775 12.90772719 NA TRUE TRUE 28846 28665 28824 35 37 NA NCRP
26107 Mecosta County MI 7.673169484 12.72617891 NA TRUE TRUE 42876 43218 43186 33 55 NA NCRP
26109 Menominee County MI 5.435464314 2.517306482 NA TRUE TRUE 24472 23835 23714 13 6 NA NCRP
26111 Midland County MI 10.85374872 7.536516215 NA TRUE TRUE 83693 83593 83427 91 63 NA NCRP
26113 Missaukee County MI 12.71753681 11.26424596 NA TRUE TRUE 15043 15092 15037 19 17 NA NCRP
26115 Monroe County MI 12.08654761 13.98331325 NA TRUE TRUE 153460 150179 149824 183 210 NA NCRP
26117 Montcalm County MI 13.28399279 11.45712331 NA TRUE TRUE 63806 62843 62893 84 72 NA NCRP
26119 Montmorency County MI 7.29318608 5.337318531 NA TRUE TRUE 10125 9368 9300 7 5 NA NCRP
26121 Muskegon County MI 32.60240837 20.37783171 NA TRUE TRUE 173710 172246 172344 558 351 NA NCRP
26123 Newaygo County MI 9.527754764 13.34890706 NA TRUE TRUE 49287 47944 47900 46 64 NA NCRP
26125 Oakland County MI 13.68874062 10.27747561 NA TRUE TRUE 1202256 1231820 1237868 1661 1266 NA NCRP
26127 Oceana County MI 7.559721802 5.344531399 NA TRUE TRUE 27484 26195 26221 20 14 NA NCRP
26129 Ogemaw County MI 8.822027209 15.55209953 NA TRUE TRUE 22003 21219 21039 19 33 NA NCRP
26131 Ontonagon County MI NA NA NA 7241 6312 6172 NA NA NA NCRP
26133 Osceola County MI 9.827379935 10.32835564 NA TRUE TRUE 23887 23237 23169 23 24 NA NCRP
26135 Oscoda County MI 12.80558789 5.960896519 NA TRUE TRUE 9090 8388 8371 11 5 NA NCRP
26137 Otsego County MI 23.21051105 14.50296275 NA TRUE TRUE 24805 24133 24158 56 35 NA NCRP
26139 Ottawa County MI 4.231940288 2.748491078 NA TRUE TRUE 258003 272877 276292 113 75 NA NCRP
26141 Presque Isle County MI 9.823182711 6.899724011 NA TRUE TRUE 14006 13044 13004 13 9 NA NCRP
26143 Roscommon County MI 15.65009678 14.62599248 NA TRUE TRUE 25560 23930 23955 38 35 NA NCRP
26145 Saginaw County MI 19.11074678 18.35655446 NA TRUE TRUE 205822 196660 195012 380 361 NA NCRP
26147 St. Clair County MI 14.88895067 11.9831487 NA TRUE TRUE 168312 160225 160078 241 192 NA NCRP
26149 St. Joseph County MI 13.25456955 16.43628474 NA TRUE TRUE 62236 60841 60946 81 100 NA NCRP
26151 Sanilac County MI 4.925299622 3.105367508 NA TRUE TRUE 44917 41863 41587 21 13 NA NCRP
26153 Schoolcraft County MI 11.89484953 8.488964346 NA TRUE TRUE 8946 8246 8171 10 7 NA NCRP
26155 Shiawassee County MI 14.16106423 9.286667828 NA TRUE TRUE 72839 68916 68933 99 64 NA NCRP
26157 Tuscola County MI 12.14384108 11.62147205 NA TRUE TRUE 57472 54210 54000 67 63 NA NCRP
26159 Van Buren County MI 11.85817621 13.80298888 NA TRUE TRUE 77019 75346 75199 90 104 NA NCRP
26161 Washtenaw County MI 9.008492082 8.887810439 NA TRUE TRUE 344018 354418 356874 314 315 NA NCRP
26163 Wayne County MI 21.04175822 15.87540259 NA TRUE TRUE 1932490 1775703 1764804 3797 2819 NA NCRP
26165 Wexford County MI 13.15386968 16.27714137 NA TRUE TRUE 32461 32561 32886 43 53 NA NCRP
27001 Aitkin County MN 13.0988024 22.82236592 22.19263205 TRUE TRUE TRUE 16357 15774 15771 21 36 35 NCRP
27003 Anoka County MN 9.101060693 6.809559324 7.985631713 TRUE TRUE TRUE 323590 339229 341864 304 231 273 NCRP
27005 Becker County MN 18.90243902 20.76811943 27.06034457 TRUE TRUE TRUE 32057 33224 33259 62 69 90 NCRP
27007 Beltrami County MN 11.99440261 24.79048747 31.97266994 TRUE TRUE TRUE 43066 45582 45664 54 113 146 NCRP
27009 Benton County MN 15.22344927 19.87261146 18.47820584 TRUE TRUE TRUE 37617 39250 39506 59 78 73 NCRP
27011 Big Stone County MN 9.598771357 11.70960187 NA TRUE TRUE 5375 5124 5127 5 6 NA NCRP
27013 Blue Earth County MN 6.046136674 13.11020282 16.05872907 TRUE TRUE TRUE 61100 64835 65385 39 85 105 NCRP
27015 Brown County MN 7.019459502 7.511959831 5.930729084 TRUE TRUE TRUE 26252 25293 25292 18 19 15 NCRP
27017 Carlton County MN 6.215040398 13.2832151 17.71105676 TRUE TRUE TRUE 34538 35383 35571 22 47 63 NCRP
27019 Carver County MN 1.940282419 2.300196562 2.56837001 TRUE TRUE TRUE 85657 95644 97338 18 22 25 NCRP
27021 Cass County MN 15.09566438 15.4239843 28.71248993 TRUE TRUE TRUE 28754 28527 28559 43 44 82 NCRP
27023 Chippewa County MN 22.81616688 22.25519288 11.56069364 TRUE TRUE TRUE 12525 12132 12110 28 27 14 NCRP
27025 Chisago County MN 7.263787227 9.853315734 10.55067099 TRUE TRUE TRUE 51444 53789 54025 39 53 57 NCRP
27027 Clay County MN 16.26479761 19.29228638 21.86469993 TRUE TRUE TRUE 55072 60646 61286 97 117 134 NCRP
27029 Clearwater County MN 10.31518625 22.77644915 29.57570242 TRUE TRUE TRUE 8476 8781 8791 9 20 26 NCRP
27031 Cook County MN NA NA NA 5210 5184 5233 NA NA NA NCRP
27033 Cottonwood County MN 8.577800652 11.14731607 17.1924697 TRUE TRUE TRUE 11789 11662 11633 10 13 20 NCRP
27035 Crow Wing County MN 11.15680087 16.47524752 19.44202956 TRUE TRUE TRUE 60654 63125 63265 70 104 123 NCRP
27037 Dakota County MN 6.984733014 7.509252034 8.460011296 TRUE TRUE TRUE 386228 408829 412529 281 307 349 NCRP
27039 Dodge County MN 10.41718339 7.382253064 13.26585761 TRUE TRUE TRUE 19601 20319 20353 21 15 27 NCRP
27041 Douglas County MN 9.651444959 13.1280256 13.59064963 TRUE TRUE TRUE 35472 36563 36790 35 48 50 NCRP
27043 Faribault County MN 6.93000693 13.38876753 14.79706877 TRUE TRUE TRUE 15150 14191 14192 10 19 21 NCRP
27045 Fillmore County MN 3.833253474 4.801920768 5.294570658 TRUE TRUE TRUE 21043 20825 20776 8 10 11 NCRP
27047 Freeborn County MN 7.388608693 22.60105902 17.50972763 TRUE TRUE TRUE 31622 30972 30840 23 70 54 NCRP
27049 Goodhue County MN 6.917572797 9.04860393 10.77052323 TRUE TRUE TRUE 45598 46416 46423 32 42 50 NCRP
27051 Grant County MN NA NA 13.43183345 TRUE 6127 5986 5956 NA NA 8 NCRP
27053 Hennepin County MN 11.31021687 11.29110211 12.23532751 TRUE TRUE TRUE 1119507 1200060 1212064 1324 1355 1483 NCRP
27055 Houston County MN 6.344171293 10.09242537 6.937773508 TRUE TRUE TRUE 19506 18826 18738 12 19 13 NCRP
27057 Hubbard County MN 5.381604697 14.50676983 16.04044136 TRUE TRUE TRUE 19783 20680 20573 11 30 33 NCRP
27059 Isanti County MN 6.828089711 7.596793629 13.01642673 TRUE TRUE TRUE 37183 38174 38413 26 29 50 NCRP
27061 Itasca County MN 13.93219664 25.93064651 30.27045998 TRUE TRUE TRUE 44405 45506 45589 63 118 138 NCRP
27063 Jackson County MN 13.64123551 9.738994936 12.65946051 TRUE TRUE TRUE 10583 10268 10269 14 10 13 NCRP
27065 Kanabec County MN 18.57470126 24.98438476 16.32140615 TRUE TRUE TRUE 16360 16010 15930 30 40 26 NCRP
27067 Kandiyohi County MN 14.19614338 18.63075726 20.57467187 TRUE TRUE TRUE 41537 42403 42285 60 79 87 NCRP
27069 Kittson County MN NA NA NA 4746 4489 4435 NA NA NA NCRP
27071 Koochiching County MN 9.055920308 14.48501944 14.77909147 TRUE TRUE TRUE 13705 13117 12856 12 19 19 NCRP
27073 Lac qui Parle County MN NA 9.985734665 13.06051371 TRUE TRUE 7415 7010 6891 NA 7 9 NCRP
27075 Lake County MN 6.466512702 5.566895528 12.17228464 TRUE TRUE TRUE 10962 10778 10680 7 6 13 NCRP
27077 Lake of the Woods County MN NA NA 15.31393568 TRUE 4321 3931 3918 NA NA 6 NCRP
27079 Le Sueur County MN 9.006412566 7.225955633 6.12171408 TRUE TRUE TRUE 27480 27678 27770 25 20 17 NCRP
27081 Lincoln County MN 10.24940212 NA 10.36627505 TRUE TRUE 6003 5792 5788 6 NA 6 NCRP
27083 Lyon County MN 7.003073571 17.91695879 17.92324177 TRUE TRUE TRUE 25347 25674 25665 18 46 46 NCRP
27085 McLeod County MN 7.984361664 9.734931716 13.93456329 TRUE TRUE TRUE 36749 35953 35882 29 35 50 NCRP
27087 Mahnomen County MN 25.57077626 56.51777575 16.34877384 TRUE TRUE TRUE 5277 5485 5505 14 31 9 NCRP
27089 Marshall County MN 5.28876666 23.29768082 40.35255389 TRUE TRUE TRUE 9802 9443 9417 5 22 38 NCRP
27091 Martin County MN 15.02374721 18.12126555 24.72799209 TRUE TRUE TRUE 20901 20418 20220 31 37 50 NCRP
27093 Meeker County MN 6.035263181 12.56553577 12.11754014 TRUE TRUE TRUE 23402 23079 23107 14 29 28 NCRP
27095 Mille Lacs County MN 16.9707255 38.63390512 37.08854891 TRUE TRUE TRUE 25882 25884 25884 44 100 96 NCRP
27097 Morrison County MN 8.454616825 13.38036735 17.06796708 TRUE TRUE TRUE 32813 32884 32810 28 44 56 NCRP
27099 Mower County MN 17.83348619 27.72267155 32.0423162 TRUE TRUE TRUE 38697 39318 39323 70 109 126 NCRP
27101 Murray County MN 10.41787244 5.845218611 NA TRUE TRUE 8884 8554 8470 9 5 NA NCRP
27103 Nicollet County MN 6.088465402 7.298604142 7.554467712 TRUE TRUE TRUE 31779 32883 33093 20 24 25 NCRP
27105 Nobles County MN 9.771986971 6.906395322 10.65308013 TRUE TRUE TRUE 20608 21719 21590 21 15 23 NCRP
27107 Norman County MN 8.884940027 13.50945662 22.59376412 TRUE TRUE TRUE 6952 6662 6639 6 9 15 NCRP
27109 Olmsted County MN 15.0619938 16.95346843 15.10443352 TRUE TRUE TRUE 137293 149232 150287 220 253 227 NCRP
27111 Otter Tail County MN 8.192577873 11.9810387 9.716318209 TRUE TRUE TRUE 57732 57591 57635 47 69 56 NCRP
27113 Pennington County MN 12.84980011 17.72421127 9.247403614 TRUE TRUE TRUE 13810 14105 14058 18 25 13 NCRP
27115 Pine County MN 9.507962919 13.40989582 14.09176835 TRUE TRUE TRUE 28860 29083 29095 28 39 41 NCRP
27117 Pipestone County MN 16.89545935 NA 6.464820601 TRUE TRUE 9496 9282 9281 16 NA 6 NCRP
27119 Polk County MN 22.20671277 39.42844526 49.52056523 TRUE TRUE TRUE 31170 31703 31704 70 125 157 NCRP
27121 Pope County MN 11.86456147 7.317965606 10.01456664 TRUE TRUE TRUE 11138 10932 10984 13 8 11 NCRP
27123 Ramsey County MN 17.68360311 20.69487006 19.31832049 TRUE TRUE TRUE 497158 527667 532655 912 1092 1029 NCRP
27125 Red Lake County MN NA NA 17.31387583 TRUE 4077 4063 4043 NA NA 7 NCRP
27127 Redwood County MN 22.58185924 20.36659878 27.71511441 TRUE TRUE TRUE 16119 15712 15515 36 32 43 NCRP
27129 Renville County MN 3.871217498 11.89374917 9.317803661 TRUE TRUE TRUE 16374 15134 15025 6 18 14 NCRP
27131 Rice County MN 6.812727413 7.709624695 5.679114672 TRUE TRUE TRUE 61899 64854 65151 44 50 37 NCRP
27133 Rock County MN NA NA NA 9502 9547 9553 NA NA NA NCRP
27135 Roseau County MN 7.05716302 15.48686843 20.40946489 TRUE TRUE TRUE 16031 15497 15679 11 24 32 NCRP
27137 St. Louis County MN 13.97714736 17.23425133 20.50271462 TRUE TRUE TRUE 198357 200763 200949 280 346 412 NCRP
27139 Scott County MN 5.347432479 10.75557946 13.60329916 TRUE TRUE TRUE 121013 137603 139672 71 148 190 NCRP
27141 Sherburne County MN 6.059245961 11.64118541 11.30303097 TRUE TRUE TRUE 84079 90197 91126 54 105 103 NCRP
27143 Sibley County MN 5.942162947 9.297383451 10.05496715 TRUE TRUE TRUE 15164 15058 14918 9 14 15 NCRP
27145 Stearns County MN 9.334472007 14.53010559 18.24578843 TRUE TRUE TRUE 144256 152098 152912 141 221 279 NCRP
27147 Steele County MN 13.96801052 10.98026298 12.30415881 TRUE TRUE TRUE 36040 36429 36573 51 40 45 NCRP
27149 Stevens County MN NA NA 9.183673469 TRUE 9729 9761 9800 NA NA 9 NCRP
27151 Swift County MN 15.49907006 12.58521238 8.478168716 TRUE TRUE TRUE 10119 9535 9436 15 12 8 NCRP
27153 Todd County MN 8.098149573 7.371913011 10.71546324 TRUE TRUE TRUE 24620 24417 24264 20 18 26 NCRP
27155 Traverse County MN NA NA 17.71479185 TRUE 3795 3410 3387 NA NA 6 NCRP
27157 Wabasha County MN 6.960879855 6.989097009 7.489935399 TRUE TRUE TRUE 21826 21462 21362 15 15 16 NCRP
27159 Wadena County MN 18.87888469 16.68843419 18.89946936 TRUE TRUE TRUE 13705 13782 13757 26 23 26 NCRP
27161 Waseca County MN 9.450803318 10.99418879 6.833114323 TRUE TRUE TRUE 19348 19101 19025 18 21 13 NCRP
27163 Washington County MN 5.179951516 6.810359855 7.782319693 TRUE TRUE TRUE 225091 246683 249283 125 168 194 NCRP
27165 Watonwan County MN 8.05513291 8.990380293 17.14337273 TRUE TRUE TRUE 11323 11123 11083 9 10 19 NCRP
27167 Wilkin County MN 7.603406326 7.633587786 13.85681293 TRUE TRUE TRUE 6709 6550 6495 5 5 9 NCRP
27169 Winona County MN 8.182668329 8.973508642 11.15525373 TRUE TRUE TRUE 50904 51262 51097 42 46 57 NCRP
27171 Wright County MN 4.994371423 8.184071459 9.236595391 TRUE TRUE TRUE 115192 128298 129918 63 105 120 NCRP
27173 Yellow Medicine County MN 13.60015543 16.72734429 18.79513305 TRUE TRUE TRUE 10663 10163 10109 14 17 19 NCRP
28001 Adams County MS NA 27.46309646 23.63172323 FALSE TRUE TRUE 33220 32043 31737 NA 88 75 NCRP
28003 Alcorn County MS NA 31.04592656 29.42750134 TRUE TRUE 36183 37364 37380 NA 116 110 NCRP
28005 Amite County MS NA 26.36680884 19.00387996 TRUE TRUE 13586 12895 12629 NA 34 24 NCRP
28007 Attala County MS NA 32.57834316 26.09194802 FALSE TRUE TRUE 19431 19338 19163 NA 63 50 NCRP
28009 Benton County MS NA 22.33717376 22.90260366 TRUE TRUE 8479 8506 8296 NA 19 19 NCRP
28011 Bolivar County MS NA 18.81301626 13.91850272 FALSE TRUE TRUE 36102 34019 33768 NA 64 47 NCRP
28013 Calhoun County MS NA 56.31318271 33.23160393 TRUE TRUE 14947 14739 14745 NA 83 49 NCRP
28015 Carroll County MS NA 15.45445765 16.57889604 FALSE TRUE TRUE 10534 10353 10254 NA 16 17 NCRP
28017 Chickasaw County MS NA 43.31004216 34.65603881 TRUE TRUE 18074 17317 17313 NA 75 60 NCRP
28019 Choctaw County MS NA 22.64600715 16.87967205 TRUE TRUE 8894 8390 8294 NA 19 14 NCRP
28021 Claiborne County MS NA 18.5245723 18.72246696 TRUE TRUE 10358 9177 9080 NA 17 17 NCRP
28023 Clarke County MS NA 26.84727561 18.40603718 TRUE TRUE 16976 16389 16299 NA 44 30 NCRP
28025 Clay County MS NA 50.01225791 38.56613103 FALSE TRUE TRUE 21139 20395 20225 NA 102 78 NCRP
28027 Coahoma County MS NA 31.39280747 24.18672149 TRUE TRUE 27441 25165 24807 NA 79 60 NCRP
28029 Copiah County MS NA 20.14238583 19.79372851 FALSE TRUE TRUE 29540 28795 28797 NA 58 57 NCRP
28031 Covington County MS NA 16.98754247 12.85875939 TRUE TRUE 19555 19426 19442 NA 33 25 NCRP
28033 DeSoto County MS NA 26.84659428 20.77080152 FALSE TRUE TRUE 145220 168364 170913 NA 452 355 NCRP
28035 Forrest County MS NA 51.86005603 39.04100616 FALSE TRUE TRUE 73219 76745 76330 NA 398 298 NCRP
28037 Franklin County MS NA 21.51626376 29.36295161 TRUE TRUE 8111 7901 7833 NA 17 23 NCRP
28039 George County MS NA 24.18588581 24.46036991 FALSE TRUE TRUE 21382 23154 23303 NA 56 57 NCRP
28041 Greene County MS NA 16.8527491 12.56456792 TRUE TRUE 13135 14241 14326 NA 24 18 NCRP
28043 Grenada County MS NA 11.13585746 27.69315979 FALSE TRUE TRUE 22388 21552 21666 NA 24 60 NCRP
28045 Hancock County MS NA 35.31708601 24.15721778 TRUE TRUE 40087 45587 45949 NA 161 111 NCRP
28047 Harrison County MS NA 48.52566418 39.58645219 FALSE TRUE TRUE 174449 196597 199058 NA 954 788 NCRP
28049 Hinds County MS NA 16.77415152 14.52432825 FALSE TRUE TRUE 248989 245616 243729 NA 412 354 NCRP
28051 Holmes County MS NA 16.5368612 10.29308197 FALSE TRUE TRUE 19932 18746 18459 NA 31 19 NCRP
28053 Humphreys County MS NA 17.94124243 18.30454181 TRUE TRUE 9840 8918 8741 NA 16 16 NCRP
28055 Issaquena County MS NA 35.31073446 NA TRUE 1649 1416 1397 NA 5 NA NCRP
28057 Itawamba County MS NA 23.44316099 22.10226548 FALSE TRUE TRUE 23217 23461 23527 NA 55 52 NCRP
28059 Jackson County MS NA 35.35936809 33.58438964 FALSE TRUE TRUE 132717 140274 141137 NA 496 474 NCRP
28061 Jasper County MS NA 17.55766786 16.26408048 TRUE TRUE 17544 16517 16601 NA 29 27 NCRP
28063 Jefferson County MS NA 26.20545073 23.68732728 TRUE TRUE 8241 7632 7599 NA 20 18 NCRP
28065 Jefferson Davis County MS NA 12.55440241 10.9964473 TRUE TRUE 12928 11948 11822 NA 15 13 NCRP
28067 Jones County MS NA 25.40429115 24.60096647 FALSE TRUE TRUE 66330 68886 68290 NA 175 168 NCRP
28069 Kemper County MS NA 12.6508369 14.75942143 TRUE TRUE 10533 10276 10163 NA 13 15 NCRP
28071 Lafayette County MS NA 16.73302175 16.24787455 FALSE TRUE TRUE 44281 51993 52930 NA 87 86 NCRP
28073 Lamar County MS NA 22.88795077 20.79901496 TRUE TRUE 48850 58983 60099 NA 135 125 NCRP
28075 Lauderdale County MS NA 36.59811781 38.12438079 FALSE TRUE TRUE 78063 80332 79739 NA 294 304 NCRP
28077 Lawrence County MS NA 32.7685422 26.39577668 TRUE TRUE 13053 12512 12502 NA 41 33 NCRP
28079 Leake County MS NA 36.46660088 28.02569741 TRUE TRUE 23159 23309 23193 NA 85 65 NCRP
28081 Lee County MS NA 43.65636704 32.14227061 FALSE TRUE TRUE 79684 85440 85246 NA 373 274 NCRP
28083 Leflore County MS NA 20.8913649 27.05111069 FALSE TRUE TRUE 33862 31592 31422 NA 66 85 NCRP
28085 Lincoln County MS NA 42.87769784 32.20704529 FALSE TRUE TRUE 34248 34750 34775 NA 149 112 NCRP
28087 Lowndes County MS NA 52.41982605 39.17629332 FALSE TRUE TRUE 59396 59901 59730 NA 314 234 NCRP
28089 Madison County MS NA 35.31489111 26.35512548 FALSE TRUE TRUE 87844 100241 101688 NA 354 268 NCRP
28091 Marion County MS NA 44.32048294 29.37992887 FALSE TRUE TRUE 26291 26173 25868 NA 116 76 NCRP
28093 Marshall County MS NA 33.68017525 36.4298725 TRUE TRUE 36374 36520 36234 NA 123 132 NCRP
28095 Monroe County MS NA 28.79929109 27.77546316 FALSE TRUE TRUE 37454 36112 36003 NA 104 100 NCRP
28097 Montgomery County MS NA 27.48815166 19.23076923 FALSE TRUE TRUE 11453 10550 10400 NA 29 20 NCRP
28099 Neshoba County MS NA 34.28261091 25.7933141 FALSE TRUE TRUE 29381 29461 29465 NA 101 76 NCRP
28101 Newton County MS NA 27.63830669 24.73433492 TRUE TRUE 21814 21709 21832 NA 60 54 NCRP
28103 Noxubee County MS NA 17.16505556 10.79622132 FALSE TRUE TRUE 11875 11069 11115 NA 19 12 NCRP
28105 Oktibbeha County MS NA 34.89976463 25.09410289 FALSE TRUE TRUE 45052 49284 49414 NA 172 124 NCRP
28107 Panola County MS NA 41.81306077 35.12948554 FALSE TRUE TRUE 34705 34439 34444 NA 144 121 NCRP
28109 Pearl River County MS NA 27.29406627 33.68100826 FALSE TRUE TRUE 55153 54957 55224 NA 150 186 NCRP
28111 Perry County MS NA 41.26093415 31.07876012 TRUE TRUE 12098 12118 12227 NA 50 38 NCRP
28113 Pike County MS NA 53.97975759 36.94642768 FALSE TRUE TRUE 40241 40015 40058 NA 216 148 NCRP
28115 Pontotoc County MS NA 34.44913877 31.34087237 FALSE TRUE TRUE 29098 30770 30950 NA 106 97 NCRP
28117 Prentiss County MS NA 41.68960906 42.47286456 FALSE TRUE TRUE 25463 25426 25428 NA 106 108 NCRP
28119 Quitman County MS NA 20.44989775 24.74602761 TRUE TRUE 9008 7824 7678 NA 16 19 NCRP
28121 Rankin County MS NA 36.22523533 23.97514689 FALSE TRUE TRUE 134132 147135 148070 NA 533 355 NCRP
28123 Scott County MS NA 36.82589143 28.10863989 FALSE TRUE TRUE 28170 28241 28461 NA 104 80 NCRP
28125 Sharkey County MS NA 44.83347566 25.82311168 TRUE TRUE 5510 4684 4647 NA 21 12 NCRP
28127 Simpson County MS NA 21.10856353 15.65743 TRUE TRUE 27658 27477 27463 NA 58 43 NCRP
28129 Smith County MS NA 15.41687222 14.20805535 TRUE TRUE 16427 16216 16188 NA 25 23 NCRP
28131 Stone County MS NA 45.09520098 27.41258741 FALSE TRUE TRUE 15968 17962 17875 NA 81 49 NCRP
28133 Sunflower County MS NA 23.92600793 15.63863835 FALSE TRUE TRUE 31464 28003 27496 NA 67 43 NCRP
28135 Tallahatchie County MS NA 39.20005315 23.03366981 TRUE TRUE 15283 15051 14761 NA 59 34 NCRP
28137 Tate County MS NA 31.04165932 25.17373422 FALSE TRUE TRUE 27473 28349 28204 NA 88 71 NCRP
28139 Tippah County MS NA 24.44987775 20.41834929 TRUE TRUE 21688 22086 22039 NA 54 45 NCRP
28141 Tishomingo County MS NA 27.23395509 14.41812564 TRUE TRUE 19424 19461 19420 NA 53 28 NCRP
28143 Tunica County MS NA 45.66210046 30.1943763 FALSE TRUE TRUE 10723 10512 10598 NA 48 32 NCRP
28145 Union County MS NA 46.13443864 35.94689825 TRUE TRUE 26762 27745 28097 NA 128 101 NCRP
28147 Walthall County MS NA 27.51123935 22.88175517 FALSE TRUE TRUE 15594 14903 14859 NA 41 34 NCRP
28149 Warren County MS NA 36.44948846 31.67788592 FALSE TRUE TRUE 49440 48286 47983 NA 176 152 NCRP
28151 Washington County MS NA 41.29900479 31.65979002 FALSE TRUE TRUE 54325 49638 48958 NA 205 155 NCRP
28153 Wayne County MS NA 30.71971913 18.05758907 FALSE TRUE TRUE 21111 20508 20490 NA 63 37 NCRP
28155 Webster County MS NA 24.12302744 23.06458083 TRUE TRUE 10022 9949 9972 NA 24 23 NCRP
28157 Wilkinson County MS NA 5.354465624 7.61614623 TRUE TRUE 10306 9338 9191 NA 5 7 NCRP
28159 Winston County MS NA 32.03930154 27.05920554 TRUE TRUE 19538 18727 18478 NA 60 50 NCRP
28161 Yalobusha County MS NA 22.65738793 18.73574454 TRUE TRUE 12976 12358 12276 NA 28 23 NCRP
28163 Yazoo County MS NA 16.81273475 15.09868066 FALSE TRUE TRUE 28714 27955 27817 NA 47 42 NCRP
29001 Adair County MO 21.50705823 31.11266674 38.668854 TRUE TRUE TRUE 25007 25713 25602 55 80 99 NCRP
29003 Andrew County MO 13.85761303 30.42479908 25.89331952 TRUE TRUE TRUE 16861 17420 17379 24 53 45 NCRP
29005 Atchison County MO 51.73951829 31.29026321 29.72872538 TRUE TRUE TRUE 5908 5433 5382 29 17 16 NCRP
29007 Audrain County MO 35.56910569 42.5199922 52.53602194 TRUE TRUE TRUE 25869 25635 25887 91 109 136 NCRP
29009 Barry County MO 36.22171056 38.13796971 48.79143065 TRUE TRUE TRUE 35756 35660 35662 129 136 174 NCRP
29011 Barton County MO 46.04944256 26.94537438 35.66392967 TRUE TRUE TRUE 12972 12247 12057 57 33 43 NCRP
29013 Bates County MO 35.54923569 48.39392656 42.20935842 TRUE TRUE TRUE 17193 16531 16584 60 80 70 NCRP
29015 Benton County MO 31.03956229 39.16379995 35.09518239 TRUE TRUE TRUE 18749 18895 18806 59 74 66 NCRP
29017 Bollinger County MO 24.17794971 31.34040501 24.20526061 TRUE TRUE TRUE 12496 12444 12394 30 39 30 NCRP
29019 Boone County MO 39.69211466 31.06553013 30.8018319 TRUE TRUE TRUE 152784 170929 172717 658 531 532 NCRP
29021 Buchanan County MO 72.69148615 80.7907464 70.73732204 TRUE TRUE TRUE 86543 89738 89486 650 725 633 NCRP
29023 Butler County MO 58.44548968 57.68515073 67.48580471 TRUE TRUE TRUE 42246 42992 42972 251 248 290 NCRP
29025 Caldwell County MO 44.32911666 67.21763085 77.48505645 TRUE TRUE TRUE 9343 9075 9034 41 61 70 NCRP
29027 Callaway County MO 35.68524709 36.37588414 38.2122905 TRUE TRUE TRUE 43118 44535 44750 158 162 171 NCRP
29029 Camden County MO 61.38469262 46.76201556 44.06987574 TRUE TRUE TRUE 41832 43839 44021 269 205 194 NCRP
29031 Cape Girardeau County MO 36.81769346 30.18186508 30.36787412 TRUE TRUE TRUE 72941 77530 78043 281 234 237 NCRP
29033 Carroll County MO 41.23263889 38.37298542 54.18555789 TRUE TRUE TRUE 9743 9121 9043 38 35 49 NCRP
29035 Carter County MO 20.76677316 23.79441624 25.56727389 TRUE TRUE TRUE 6030 6304 6258 13 15 16 NCRP
29037 Cass County MO 27.23404255 21.93679028 22.89645055 TRUE TRUE TRUE 94494 100744 100889 272 221 231 NCRP
29039 Cedar County MO 46.03323024 55.20900552 44.43807339 TRUE TRUE TRUE 14229 13947 13952 64 77 62 NCRP
29041 Chariton County MO 37.51617076 31.31524008 42.89056408 TRUE TRUE TRUE 8013 7664 7694 29 24 33 NCRP
29043 Christian County MO 22.48361364 27.22671188 26.30905835 TRUE TRUE TRUE 69394 80803 82101 177 220 216 NCRP
29045 Clark County MO 59.70149254 57.77841976 39.03426341 TRUE TRUE TRUE 7206 6923 6917 42 40 27 NCRP
29047 Clay County MO 28.25210114 21.58591454 23.53625868 TRUE TRUE TRUE 206369 230706 233682 636 498 550 NCRP
29049 Clinton County MO 29.52708263 38.53094669 42.36661905 TRUE TRUE TRUE 20347 20503 20299 61 79 86 NCRP
29051 Cole County MO 34.37057249 30.26784433 30.82670429 TRUE TRUE TRUE 73509 76649 76557 262 232 236 NCRP
29053 Cooper County MO 42.10765904 49.2917847 51.74864942 TRUE TRUE TRUE 17547 17650 17585 74 87 91 NCRP
29055 Crawford County MO 61.10638987 58.23898347 67.34279919 TRUE TRUE TRUE 24373 24554 24650 151 143 166 NCRP
29057 Dade County MO 37.49676752 23.81267363 22.28631358 TRUE TRUE TRUE 7974 7559 7628 29 18 17 NCRP
29059 Dallas County MO 37.65015239 37.56665051 42.10140948 TRUE TRUE TRUE 16580 16504 16389 63 62 69 NCRP
29061 Daviess County MO 56.30765545 73.69819983 66.28902013 TRUE TRUE TRUE 8331 8277 8297 47 61 55 NCRP
29063 DeKalb County MO 3.884098501 61.90252312 43.33438386 TRUE TRUE TRUE 12882 12762 12692 5 79 55 NCRP
29065 Dent County MO 55.59460668 41.2279589 46.6304695 TRUE TRUE TRUE 15419 15766 15655 87 65 73 NCRP
29067 Douglas County MO 16.12075914 30.45383644 45.76996899 TRUE TRUE TRUE 13573 13463 13546 22 41 62 NCRP
29069 Dunklin County MO 82.09048753 101.6029282 102.4119449 TRUE TRUE TRUE 32388 31692 31344 262 322 321 NCRP
29071 Franklin County MO 25.5983617 24.07696768 28.99572901 TRUE TRUE TRUE 99341 101757 102084 260 245 296 NCRP
29073 Gasconade County MO 27.84591925 24.16269548 20.85295305 TRUE TRUE TRUE 15479 14899 14866 42 36 31 NCRP
29075 Gentry County MO 25.09595512 13.26846528 8.789920891 TRUE TRUE TRUE 6776 6783 6826 17 9 6 NCRP
29077 Greene County MO 29.79538585 36.0601472 36.69564305 TRUE TRUE TRUE 263046 283970 285865 829 1024 1049 NCRP
29079 Grundy County MO 54.46411204 44.37584411 72.57036383 TRUE TRUE TRUE 10187 10366 10197 56 46 74 NCRP
29081 Harrison County MO 32.69079022 49.22161172 63.66477602 TRUE TRUE TRUE 8870 8736 8639 29 43 55 NCRP
29083 Henry County MO 50.03831763 77.96564072 65.82531324 TRUE TRUE TRUE 22556 22061 22028 111 172 145 NCRP
29085 Hickory County MO 27.37130224 26.95708432 31.45677405 TRUE TRUE TRUE 9518 9274 9219 26 25 29 NCRP
29087 Holt County MO 64.97589604 76.56967841 55.35872453 TRUE TRUE TRUE 4976 4571 4516 31 35 25 NCRP
29089 Howard County MO 31.42183818 30.21442495 44.2956984 TRUE TRUE TRUE 10089 10260 10159 32 31 45 NCRP
29091 Howell County MO 28.17736912 43.1783215 33.60465985 TRUE TRUE TRUE 39067 40298 40173 114 174 135 NCRP
29093 Iron County MO 38.07710614 45.43696829 38.95977403 TRUE TRUE TRUE 10710 10344 10267 40 47 40 NCRP
29095 Jackson County MO 32.93169005 15.92455027 15.35441773 TRUE TRUE TRUE 660539 680082 683191 2225 1083 1049 NCRP
29097 Jasper County MO 32.70463944 29.80485123 28.67035893 TRUE TRUE TRUE 112030 116424 117543 382 347 337 NCRP
29099 Jefferson County MO 16.93711413 24.85931885 24.69512743 TRUE TRUE TRUE 213105 221245 222716 372 550 550 NCRP
29101 Johnson County MO 27.09419437 27.53202893 28.88046797 TRUE TRUE TRUE 51500 54482 54362 145 150 157 NCRP
29103 Knox County MO 24.39619419 NA NA TRUE 4158 4070 4000 10 NA NA NCRP
29105 Laclede County MO 48.12157028 56.3973064 66.02895116 TRUE TRUE TRUE 34937 35640 35439 171 201 234 NCRP
29107 Lafayette County MO 104.2545498 87.84728555 91.47087616 TRUE TRUE TRUE 33288 32898 32688 346 289 299 NCRP
29109 Lawrence County MO 37.41425899 45.15028219 43.13178865 TRUE TRUE TRUE 37779 38095 38023 144 172 164 NCRP
29111 Lewis County MO 20.60237418 25.62838837 20.7141448 TRUE TRUE TRUE 10286 10145 10138 21 26 21 NCRP
29113 Lincoln County MO 40.90403574 26.35584097 32.44299434 TRUE TRUE TRUE 49117 53878 54249 217 142 176 NCRP
29115 Linn County MO 29.38373571 29.15215807 53.61059215 TRUE TRUE TRUE 12928 12349 12311 37 36 66 NCRP
29117 Livingston County MO 44.5153146 95.49428379 111.60566 TRUE TRUE TRUE 14717 14870 15053 67 142 168 NCRP
29119 McDonald County MO 3.494670627 34.07079646 31.14035088 TRUE TRUE TRUE 22977 22600 22800 8 77 71 NCRP
29121 Macon County MO 29.59150852 36.10108303 37.47012081 TRUE TRUE TRUE 15562 15512 15479 46 56 58 NCRP
29123 Madison County MO 28.34008097 34.68301339 47.70375162 TRUE TRUE TRUE 12130 12398 12368 35 43 59 NCRP
29125 Maries County MO 10.98659635 28.68174297 26.62820371 TRUE TRUE TRUE 9235 9065 9013 10 26 24 NCRP
29127 Marion County MO 54.15914456 63.66561711 59.82019364 TRUE TRUE TRUE 28468 28901 28920 156 184 173 NCRP
29129 Mercer County MO 40.01066951 46.08294931 43.02231783 TRUE TRUE TRUE 3668 3689 3719 15 17 16 NCRP
29131 Miller County MO 53.8953465 59.44307029 62.05003779 TRUE TRUE TRUE 24759 25066 25141 134 149 156 NCRP
29133 Mississippi County MO 92.49527013 61.04834748 35.83473862 TRUE TRUE TRUE 14033 14251 14232 132 87 51 NCRP
29135 Moniteau County MO 37.68282557 36.82539683 39.10191726 TRUE TRUE TRUE 15340 15750 15856 59 58 62 NCRP
29137 Monroe County MO 40.91839054 26.27370345 34.45503618 TRUE TRUE TRUE 9219 8754 8707 36 23 30 NCRP
29139 Montgomery County MO 61.01583113 65.32663317 36.31450046 TRUE TRUE TRUE 12242 11940 11841 74 78 43 NCRP
29141 Morgan County MO 50.01961554 54.36931594 52.3715415 TRUE TRUE TRUE 20570 20232 20240 102 110 106 NCRP
29143 New Madrid County MO 76.49104039 74.58623693 79.90367776 TRUE TRUE TRUE 18821 18368 18272 143 137 146 NCRP
29145 Newton County MO 28.3508676 17.0111423 19.28393461 TRUE TRUE TRUE 56671 58785 58598 166 100 113 NCRP
29147 Nodaway County MO 29.98243886 38.74467261 31.19448897 TRUE TRUE TRUE 22698 23229 23081 70 90 72 NCRP
29149 Oregon County MO 25.60585277 20.93002093 20.16313812 TRUE TRUE TRUE 10669 10989 10911 28 23 22 NCRP
29151 Osage County MO 21.67316862 16.7834209 12.40604247 TRUE TRUE TRUE 13687 13704 13703 30 23 17 NCRP
29153 Ozark County MO 27.97057909 32.46073298 53.72945638 TRUE TRUE TRUE 9667 9550 9492 27 31 51 NCRP
29155 Pemiscot County MO 96.91629956 89.80691513 82.71954674 TRUE TRUE TRUE 18953 17816 17650 176 160 146 NCRP
29157 Perry County MO 27.36698069 32.95323779 35.41297781 TRUE TRUE TRUE 18672 19118 19202 52 63 68 NCRP
29159 Pettis County MO 47.45408817 46.6835707 65.12729426 TRUE TRUE TRUE 40937 42199 42225 200 197 275 NCRP
29161 Phelps County MO 34.69056461 47.17820901 52.62336388 TRUE TRUE TRUE 44025 44936 44847 156 212 236 NCRP
29163 Pike County MO 24.75913666 50.44812966 52.85583302 TRUE TRUE TRUE 18707 18633 18541 46 94 98 NCRP
29165 Platte County MO 20.36502939 23.16279369 21.20521585 TRUE TRUE TRUE 83913 93253 94788 185 216 201 NCRP
29167 Polk County MO 27.98507463 36.6877997 51.20113351 TRUE TRUE TRUE 30053 31073 31054 87 114 159 NCRP
29169 Pulaski County MO 29.54825268 28.09668236 34.05943559 TRUE TRUE TRUE 46482 53743 53436 156 151 182 NCRP
29171 Putnam County MO 42.47572816 43.08576118 43.48726444 TRUE TRUE TRUE 5167 4874 4829 21 21 21 NCRP
29173 Ralls County MO 32.33392122 42.27290602 71.18478791 TRUE TRUE TRUE 10092 10172 10255 33 43 73 NCRP
29175 Randolph County MO 71.27865996 76.14009778 70.59668156 TRUE TRUE TRUE 25480 24954 25072 180 190 177 NCRP
29177 Ray County MO 67.8402748 58.62428348 66.66957166 TRUE TRUE TRUE 23842 23028 22949 158 135 153 NCRP
29179 Reynolds County MO 24.02041735 27.26033621 31.98781417 TRUE TRUE TRUE 6707 6603 6565 16 18 21 NCRP
29181 Ripley County MO 31.98066946 44.18157201 49.39508913 TRUE TRUE TRUE 14049 14033 13969 45 62 69 NCRP
29183 St. Charles County MO 18.35108641 20.59374164 19.13078766 TRUE TRUE TRUE 337952 373900 379493 670 770 726 NCRP
29185 St. Clair County MO 35.2368121 26.29088232 28.55028022 TRUE TRUE TRUE 9694 9509 9457 34 25 27 NCRP
29186 Ste. Genevieve County MO 22.22716159 35.68640571 40.7502512 TRUE TRUE TRUE 18263 17934 17914 40 64 73 NCRP
29187 St. Francois County MO 35.05990671 60.87705252 66.10066707 TRUE TRUE TRUE 62917 66199 65960 230 403 436 NCRP
29189 St. Louis County MO 18.59511366 17.09451208 15.36118242 TRUE TRUE TRUE 1002050 1001491 1001876 1859 1712 1539 NCRP
29195 Saline County MO 66.02641056 77.82268467 95.51548379 TRUE TRUE TRUE 23008 23258 23347 154 181 223 NCRP
29197 Schuyler County MO NA 16.05872907 16.01830664 TRUE TRUE 4267 4359 4370 NA 7 7 NCRP
29199 Scotland County MO 22.63840296 50.85435313 39.07053259 TRUE TRUE TRUE 4823 4916 4863 11 25 19 NCRP
29201 Scott County MO 55.84455324 43.08916142 45.75482611 TRUE TRUE TRUE 39626 39221 38903 219 169 178 NCRP
29203 Shannon County MO 15.49833095 22.93301147 21.61123784 TRUE TRUE TRUE 8313 8285 8329 13 19 18 NCRP
29205 Shelby County MO 47.81638508 37.36192333 26.1951539 TRUE TRUE TRUE 6533 6156 6108 30 23 16 NCRP
29207 Stoddard County MO 65.97454789 42.65466514 56.9190076 TRUE TRUE TRUE 30314 29774 29867 197 127 170 NCRP
29209 Stone County MO 33.94411792 36.36247648 39.54475309 TRUE TRUE TRUE 31546 31351 31104 108 114 123 NCRP
29211 Sullivan County MO 33.27787022 52.72952854 42.11511465 TRUE TRUE TRUE 6783 6448 6411 22 34 27 NCRP
29213 Taney County MO 39.68556819 46.53509756 46.65314402 TRUE TRUE TRUE 46200 53508 54230 208 249 253 NCRP
29215 Texas County MO 32.13317847 40.56636892 35.09866625 TRUE TRUE TRUE 25385 25637 25642 83 104 90 NCRP
29217 Vernon County MO 39.54263935 37.67825631 41.90276653 TRUE TRUE TRUE 20715 20967 21001 83 79 88 NCRP
29219 Warren County MO 42.24446689 52.71129961 52.02538117 TRUE TRUE TRUE 30175 33010 33253 138 174 173 NCRP
29221 Washington County MO 39.38730853 51.31877312 55.82804961 TRUE TRUE TRUE 24619 25137 25077 99 129 140 NCRP
29223 Wayne County MO 46.14125177 37.25504806 37.16919417 TRUE TRUE TRUE 13429 13421 13452 62 50 50 NCRP
29225 Webster County MO 33.08154601 27.12180155 28.19345044 TRUE TRUE TRUE 34692 36502 36888 120 99 104 NCRP
29227 Worth County MO NA NA 33.76748673 TRUE 2202 2086 2073 NA NA 7 NCRP
29229 Wright County MO 25.74692914 59.14270212 62.87245093 TRUE TRUE TRUE 18554 18430 18291 48 109 115 NCRP
29510 St. Louis city MO 66.49840887 57.99130915 52.04477363 TRUE TRUE TRUE 320131 318496 317419 2121 1847 1652 NCRP
30001 Beaverhead County MT NA NA 8.560727662 FALSE TRUE 9012 9308 9345 NA NA 8 NCRP
30003 Big Horn County MT NA NA 6.776087939 FALSE TRUE 12540 13134 13282 NA NA 9 NCRP
30005 Blaine County MT NA NA 7.55401118 TRUE 6536 6582 6619 NA NA 5 NCRP
30007 Broadwater County MT NA NA NA 4958 5687 5667 NA NA NA NCRP
30009 Carbon County MT NA NA 11.53957111 FALSE TRUE 9916 10305 10399 NA NA 12 NCRP
30011 Carter County MT NA NA NA 1227 1169 1169 NA NA NA NCRP
30013 Cascade County MT NA NA 16.39463713 FALSE FALSE TRUE 79984 82404 82344 NA NA 135 NCRP
30015 Chouteau County MT NA NA NA 5709 5861 5894 NA NA NA NCRP
30017 Custer County MT NA NA 9.923916639 FALSE FALSE TRUE 11395 11936 12092 NA NA 12 NCRP
30019 Daniels County MT NA NA NA 1748 1783 1793 NA NA NA NCRP
30021 Dawson County MT NA NA 13.65833158 FALSE TRUE 8853 9400 9518 NA NA 13 NCRP
30023 Deer Lodge County MT NA NA 15.30054645 FALSE TRUE 9180 9287 9150 NA NA 14 NCRP
30025 Fallon County MT NA NA NA 2722 3056 3108 NA NA NA NCRP
30027 Fergus County MT NA NA 10.48767698 FALSE TRUE 11501 11522 11442 NA NA 12 NCRP
30029 Flathead County MT NA NA 12.00960769 FALSE FALSE TRUE 85759 93125 94924 NA NA 114 NCRP
30031 Gallatin County MT NA NA 4.213425412 FALSE FALSE TRUE 83984 94694 97308 NA NA 41 NCRP
30033 Garfield County MT NA NA NA 1233 1282 1309 NA NA NA NCRP
30035 Glacier County MT NA NA 8.031542056 FALSE TRUE 13250 13801 13696 NA NA 11 NCRP
30037 Golden Valley County MT NA NA NA 973 857 852 NA NA NA NCRP
30039 Granite County MT NA NA NA 3013 3130 3209 NA NA NA NCRP
30041 Hill County MT NA NA 25.30730296 FALSE FALSE TRUE 15981 16604 16596 NA NA 42 NCRP
30043 Jefferson County MT NA NA NA 10801 11505 11558 NA NA NA NCRP
30045 Judith Basin County MT NA NA NA 2146 2011 1991 NA NA NA NCRP
30047 Lake County MT NA NA 22.68119179 FALSE FALSE TRUE 28283 29023 29099 NA NA 66 NCRP
30049 Lewis and Clark County MT NA NA 17.00680272 FALSE FALSE TRUE 59529 65333 65856 NA NA 112 NCRP
30051 Liberty County MT NA NA NA 2216 2373 2359 NA NA NA NCRP
30053 Lincoln County MT NA NA 8.366013072 FALSE TRUE 19228 19403 19125 NA NA 16 NCRP
30055 McCone County MT NA NA NA 1765 1704 1694 NA NA NA NCRP
30057 Madison County MT NA NA NA FALSE 7343 7694 7820 NA NA NA NCRP
30059 Meagher County MT NA NA NA 1923 1912 1853 NA NA NA NCRP
30061 Mineral County MT NA NA 25.83979328 FALSE TRUE 4211 4271 4257 NA NA 11 NCRP
30063 Missoula County MT NA NA 15.26392389 FALSE FALSE TRUE 104372 111769 112684 NA NA 172 NCRP
30065 Musselshell County MT NA NA 13.07474395 FALSE TRUE 4398 4625 4589 NA NA 6 NCRP
30067 Park County MT NA NA 4.408060453 FALSE TRUE 15690 15660 15880 NA NA 7 NCRP
30069 Petroleum County MT NA NA NA 495 505 485 NA NA NA NCRP
30071 Phillips County MT NA NA NA 4166 4179 4192 NA NA NA NCRP
30073 Pondera County MT NA NA NA FALSE 6172 6258 6219 NA NA NA NCRP
30075 Powder River County MT NA NA NA 1794 1751 1783 NA NA NA NCRP
30077 Powell County MT NA NA 13.02648719 FALSE TRUE 7115 6965 6909 NA NA 9 NCRP
30079 Prairie County MT NA NA NA 1098 1176 1148 NA NA NA NCRP
30081 Ravalli County MT NA NA 13.16110163 FALSE FALSE TRUE 39555 40824 41030 NA NA 54 NCRP
30083 Richland County MT NA NA 9.502418798 FALSE FALSE TRUE 9267 11187 11576 NA NA 11 NCRP
30085 Roosevelt County MT NA NA NA FALSE 10285 11124 11332 NA NA NA NCRP
30087 Rosebud County MT NA NA 11.79498177 FALSE TRUE 9057 9336 9326 NA NA 11 NCRP
30089 Sanders County MT NA NA 7.919746568 FALSE TRUE 11178 11348 11364 NA NA 9 NCRP
30091 Sheridan County MT NA NA NA 3507 3658 3696 NA NA NA NCRP
30093 Silver Bow County MT NA NA 8.938869666 FALSE FALSE TRUE 33441 34512 34680 NA NA 31 NCRP
30095 Stillwater County MT NA NA 6.458557589 TRUE 8659 9310 9290 NA NA 6 NCRP
30097 Sweet Grass County MT NA NA NA 3697 3662 3665 NA NA NA NCRP
30099 Teton County MT NA NA NA 6110 6075 6064 NA NA NA NCRP
30101 Toole County MT NA NA NA FALSE 5085 5149 5150 NA NA NA NCRP
30103 Treasure County MT NA NA NA 759 699 692 NA NA NA NCRP
30105 Valley County MT NA NA 7.853403141 FALSE TRUE 7272 7619 7640 NA NA 6 NCRP
30107 Wheatland County MT NA NA NA 2035 2131 2102 NA NA NA NCRP
30109 Wibaux County MT NA NA NA 984 1126 1121 NA NA NA NCRP
30111 Yellowstone County MT NA NA 13.04342239 FALSE FALSE TRUE 139582 154060 155634 NA NA 203 NCRP
31001 Adams County NE NA 19.63205725 20.02733891 FALSE TRUE TRUE 30910 31581 31457 NA 62 63 NCRP
31003 Antelope County NE NA 12.39157373 14.0668959 FALSE TRUE TRUE 6836 6456 6398 NA 8 9 NCRP
31005 Arthur County NE NA NA NA 450 451 453 NA NA NA NCRP
31007 Banner County NE NA NA NA 733 777 764 NA NA NA NCRP
31009 Blaine County NE NA NA NA 493 481 504 NA NA NA NCRP
31011 Boone County NE NA NA NA 5623 5375 5353 NA NA NA NCRP
31013 Box Butte County NE NA 16.79929266 11.4638448 FALSE TRUE TRUE 11338 11310 11340 NA 19 13 NCRP
31015 Boyd County NE NA NA NA 2143 2019 2033 NA NA NA NCRP
31017 Brown County NE NA NA NA 3319 2924 2941 NA NA NA NCRP
31019 Buffalo County NE NA 16.23038828 14.10086264 FALSE TRUE TRUE 44645 48058 48224 NA 78 68 NCRP
31021 Burt County NE NA 10.63344979 NA FALSE TRUE 7122 6583 6573 NA 7 NA NCRP
31023 Butler County NE NA 8.409418549 9.69814523 FALSE TRUE TRUE 8396 8324 8249 NA 7 8 NCRP
31025 Cass County NE NA 7.485914661 10.18649115 FALSE TRUE TRUE 25240 25381 25524 NA 19 26 NCRP
31027 Cedar County NE NA 8.058945429 NA FALSE TRUE 9060 8686 8610 NA 7 NA NCRP
31029 Chase County NE NA NA NA 3965 3977 3978 NA NA NA NCRP
31031 Cherry County NE NA 19.03443502 8.67754252 TRUE TRUE 5927 5779 5762 NA 11 5 NCRP
31033 Cheyenne County NE NA 14.88242881 12.81040599 FALSE TRUE TRUE 9943 10079 10148 NA 15 13 NCRP
31035 Clay County NE NA NA 7.917656374 TRUE 6609 6383 6315 NA NA 5 NCRP
31037 Colfax County NE NA 14.41476071 5.712109673 FALSE TRUE TRUE 9993 10406 10504 NA 15 6 NCRP
31039 Cuming County NE NA 11.1049417 NA FALSE TRUE 9440 9005 9027 NA 10 NA NCRP
31041 Custer County NE NA 5.557613931 NA FALSE TRUE 11090 10796 10728 NA 6 NA NCRP
31043 Dakota County NE NA 25.30557678 25.89928058 FALSE TRUE TRUE 20295 20944 20850 NA 53 54 NCRP
31045 Dawes County NE NA 6.598482349 5.529750055 FALSE TRUE TRUE 9040 9093 9042 NA 6 5 NCRP
31047 Dawson County NE NA 18.63199735 9.130146082 FALSE TRUE TRUE 24291 24152 24096 NA 45 22 NCRP
31049 Deuel County NE NA NA NA 1969 1934 1940 NA NA NA NCRP
31051 Dixon County NE NA NA NA FALSE 5987 5835 5782 NA NA NA NCRP
31053 Dodge County NE NA 23.2132616 27.48748095 FALSE TRUE TRUE 36597 36617 36744 NA 85 101 NCRP
31055 Douglas County NE NA 19.77567722 16.38306175 FALSE TRUE TRUE 493757 537529 543244 NA 1063 890 NCRP
31057 Dundy County NE NA NA NA 2051 1969 1886 NA NA NA NCRP
31059 Fillmore County NE NA NA NA FALSE 6053 5685 5661 NA NA NA NCRP
31061 Franklin County NE NA NA NA 3352 3091 3076 NA NA NA NCRP
31063 Frontier County NE NA NA NA 2879 2712 2705 NA NA NA NCRP
31065 Furnas County NE NA NA NA 5016 4856 4888 NA NA NA NCRP
31067 Gage County NE NA 27.0443711 22.61921248 FALSE TRUE TRUE 22875 21816 21663 NA 59 49 NCRP
31069 Garden County NE NA NA NA 2120 1904 1911 NA NA NA NCRP
31071 Garfield County NE NA NA NA 1984 2033 2003 NA NA NA NCRP
31073 Gosper County NE NA NA NA 2075 1974 1970 NA NA NA NCRP
31075 Grant County NE NA NA NA 677 625 619 NA NA NA NCRP
31077 Greeley County NE NA NA NA 2578 2483 2482 NA NA NA NCRP
31079 Hall County NE NA 24.12881834 22.60456645 FALSE TRUE TRUE 55190 60923 61492 NA 147 139 NCRP
31081 Hamilton County NE NA 12.05875904 14.23097975 FALSE TRUE TRUE 9196 9122 9135 NA 11 13 NCRP
31083 Harlan County NE NA NA NA 3522 3513 3492 NA NA NA NCRP
31085 Hayes County NE NA NA NA 994 973 933 NA NA NA NCRP
31087 Hitchcock County NE NA NA NA 2956 2873 2901 NA NA NA NCRP
31089 Holt County NE NA 8.622341445 9.612611747 FALSE TRUE TRUE 10613 10438 10403 NA 9 10 NCRP
31091 Hooker County NE NA NA NA 751 732 728 NA NA NA NCRP
31093 Howard County NE NA NA 9.430996542 TRUE 6357 6341 6362 NA NA 6 NCRP
31095 Jefferson County NE NA 15.90035776 32.7198364 FALSE TRUE TRUE 7970 7547 7335 NA 12 24 NCRP
31097 Johnson County NE NA NA NA 5257 5129 5185 NA NA NA NCRP
31099 Kearney County NE NA NA NA 6614 6553 6644 NA NA NA NCRP
31101 Keith County NE NA 12.31375446 9.851003571 FALSE TRUE TRUE 8381 8121 8121 NA 10 8 NCRP
31103 Keya Paha County NE NA NA NA 892 797 810 NA NA NA NCRP
31105 Kimball County NE NA 24.4100895 13.46619984 FALSE TRUE TRUE 3879 3687 3713 NA 9 5 NCRP
31107 Knox County NE NA 15.19224027 NA FALSE TRUE 8846 8557 8482 NA 13 NA NCRP
31109 Lancaster County NE NA 20.31720403 18.3899667 FALSE TRUE TRUE 272286 297285 301795 NA 604 555 NCRP
31111 Lincoln County NE NA 18.56367062 19.82409605 FALSE TRUE TRUE 35973 36092 35815 NA 67 71 NCRP
31113 Logan County NE NA NA NA 756 764 750 NA NA NA NCRP
31115 Loup County NE NA NA NA 635 581 588 NA NA NA NCRP
31117 McPherson County NE NA NA NA FALSE 518 523 498 NA NA NA NCRP
31119 Madison County NE NA 32.0558282 30.13589583 FALSE TRUE TRUE 35415 35251 35174 NA 113 106 NCRP
31121 Merrick County NE NA 11.53698244 24.46561937 FALSE TRUE TRUE 7813 7801 7766 NA 9 19 NCRP
31123 Morrill County NE NA 10.24170422 NA FALSE TRUE 5090 4882 4862 NA 5 NA NCRP
31125 Nance County NE NA 25 28.01120448 TRUE TRUE 3807 3600 3570 NA 9 10 NCRP
31127 Nemaha County NE NA 12.53831151 6.968641115 FALSE TRUE TRUE 7311 7178 7175 NA 9 5 NCRP
31129 Nuckolls County NE NA NA 13.73311971 TRUE 4709 4395 4369 NA NA 6 NCRP
31131 Otoe County NE NA 13.99758224 12.66063177 FALSE TRUE TRUE 15753 15717 15797 NA 22 20 NCRP
31133 Pawnee County NE NA NA NA 2802 2726 2702 NA NA NA NCRP
31135 Perkins County NE NA NA NA 3041 2910 2891 NA NA NA NCRP
31137 Phelps County NE NA 16.3096662 7.619462284 FALSE TRUE TRUE 9405 9197 9187 NA 15 7 NCRP
31139 Pierce County NE NA 11.16694584 6.942515968 FALSE TRUE TRUE 7416 7164 7202 NA 8 5 NCRP
31141 Platte County NE NA 15.68603328 16.53094961 FALSE TRUE TRUE 31100 32513 32666 NA 51 54 NCRP
31143 Polk County NE NA 13.33333333 9.48586606 TRUE TRUE 5409 5250 5271 NA 7 5 NCRP
31145 Red Willow County NE NA 9.979134537 15.64369191 FALSE TRUE TRUE 11194 11023 10867 NA 11 17 NCRP
31147 Richardson County NE NA 9.846153846 11.07283465 FALSE TRUE TRUE 8642 8125 8128 NA 8 9 NCRP
31149 Rock County NE NA NA NA 1552 1417 1443 NA NA NA NCRP
31151 Saline County NE NA 10.49097776 5.613247264 FALSE TRUE TRUE 13987 14298 14252 NA 15 8 NCRP
31153 Sarpy County NE NA 11.27788472 9.524196686 FALSE TRUE TRUE 144070 169358 172193 NA 191 164 NCRP
31155 Saunders County NE NA 14.36712801 6.214446197 FALSE TRUE TRUE 20411 20881 20919 NA 30 13 NCRP
31157 Scotts Bluff County NE NA 19.25684839 17.00260524 FALSE TRUE TRUE 36223 36870 36465 NA 71 62 NCRP
31159 Seward County NE NA 15.23675574 6.413994169 FALSE TRUE TRUE 16654 17064 17150 NA 26 11 NCRP
31161 Sheridan County NE NA 15.23229246 17.11351968 FALSE TRUE TRUE 5649 5252 5259 NA 8 9 NCRP
31163 Sherman County NE NA NA NA 3148 3110 3074 NA NA NA NCRP
31165 Sioux County NE NA NA NA 1409 1319 1303 NA NA NA NCRP
31167 Stanton County NE NA 8.218277449 NA FALSE TRUE 6363 6084 6069 NA 5 NA NCRP
31169 Thayer County NE NA NA 13.38432122 FALSE TRUE 5312 5196 5230 NA NA 7 NCRP
31171 Thomas County NE NA NA NA 659 696 687 NA NA NA NCRP
31173 Thurston County NE NA 7.249528781 7.174630507 TRUE TRUE 6947 6897 6969 NA 5 5 NCRP
31175 Valley County NE NA NA NA 4367 4197 4204 NA NA NA NCRP
31177 Washington County NE NA 13.34585537 8.391746471 FALSE TRUE TRUE 20056 20231 20258 NA 27 17 NCRP
31179 Wayne County NE NA 6.357952739 9.542996501 FALSE TRUE TRUE 9720 9437 9431 NA 6 9 NCRP
31181 Webster County NE NA NA NA 3846 3675 3658 NA NA NA NCRP
31183 Wheeler County NE NA NA NA 826 758 766 NA NA NA NCRP
31185 York County NE NA 28.13243887 22.99346123 FALSE TRUE TRUE 14130 13863 13917 NA 39 32 NCRP
32001 Churchill County NV NA 27.86442088 31.68118721 FALSE TRUE TRUE 24842 24045 23989 NA 67 76 NCRP
32003 Clark County NV NA 18.38550526 18.94978018 FALSE TRUE TRUE 1803774 2029316 2069681 NA 3731 3922 NCRP
32005 Douglas County NV NA 13.16879421 13.67384719 FALSE TRUE TRUE 46855 47081 47536 NA 62 65 NCRP
32007 Elko County NV NA 15.22910282 15.1612781 FALSE TRUE TRUE 46108 52531 52766 NA 80 80 NCRP
32009 Esmeralda County NV NA NA 133.8199513 TRUE 883 832 822 NA NA 11 NCRP
32011 Eureka County NV NA NA NA FALSE 1579 2071 2018 NA NA NA NCRP
32013 Humboldt County NV NA 27.63544245 27.20064819 FALSE TRUE TRUE 15420 17369 17279 NA 48 47 NCRP
32015 Lander County NV NA 9.878169246 NA FALSE TRUE 5307 6074 6009 NA 6 NA NCRP
32017 Lincoln County NV NA 22.86585366 11.57407407 FALSE TRUE TRUE 4729 5248 5184 NA 12 6 NCRP
32019 Lyon County NV NA 16.14785992 19.1160285 FALSE TRUE TRUE 49827 51400 51789 NA 83 99 NCRP
32021 Mineral County NV NA 59.22351393 48.88888889 FALSE TRUE TRUE 4864 4559 4500 NA 27 22 NCRP
32023 Nye County NV NA 33.09849165 29.32690034 FALSE TRUE TRUE 42530 42298 42282 NA 140 124 NCRP
32027 Pershing County NV NA 16.03031186 22.3947447 FALSE TRUE TRUE 6653 6862 6698 NA 11 15 NCRP
32029 Storey County NV NA NA NA FALSE 3913 3889 3912 NA NA NA NCRP
32031 Washoe County NV NA 23.25827986 23.79123701 FALSE TRUE TRUE 400453 433824 440078 NA 1009 1047 NCRP
32033 White Pine County NV NA 29.89834562 26.90851106 FALSE TRUE TRUE 9511 10034 10034 NA 30 27 NCRP
32510 Carson City NV NA 27.93141081 19.80851766 FALSE TRUE TRUE 55410 54061 54522 NA 151 108 NCRP
33001 Belknap County NH NA NA NA FALSE FALSE FALSE 60105 60201 60305 NA NA NA NCRP
33003 Carroll County NH NA NA NA FALSE FALSE FALSE 47421 47505 47399 NA NA NA NCRP
33005 Cheshire County NH NA NA NA FALSE FALSE FALSE 77658 76399 76115 NA NA NA NCRP
33007 Coos County NH NA NA NA FALSE FALSE 33814 31962 31653 NA NA NA NCRP
33009 Grafton County NH NA NA NA FALSE FALSE FALSE 87236 89628 89658 NA NA NA NCRP
33011 Hillsborough County NH NA NA NA FALSE FALSE FALSE 398169 403398 405184 NA NA NA NCRP
33013 Merrimack County NH NA NA NA FALSE FALSE FALSE 146609 147150 147171 NA NA NA NCRP
33015 Rockingham County NH NA NA NA 293618 298745 300621 NA NA NA NCRP
33017 Strafford County NH NA NA NA FALSE FALSE FALSE 120363 124642 125604 NA NA NA NCRP
33019 Sullivan County NH NA NA NA FALSE FALSE FALSE 43396 42986 43103 NA NA NA NCRP
34001 Atlantic County NJ 40.04218795 29.87322888 NA TRUE TRUE 271759 276167 275209 1101 825 NA NCRP
34003 Bergen County NJ 5.707743798 3.97871978 NA TRUE TRUE 889406 927434 933572 521 369 NA NCRP
34005 Burlington County NJ 5.933808038 6.686793694 NA TRUE TRUE 448373 450141 449722 267 301 NA NCRP
34007 Camden County NJ 39.29801056 24.21283866 NA TRUE TRUE 513195 512125 511038 2018 1240 NA NCRP
34009 Cape May County NJ 32.06321625 26.18702334 NA TRUE TRUE 98695 95849 95344 310 251 NA NCRP
34011 Cumberland County NJ 21.92675827 14.3172577 NA TRUE TRUE 153371 157153 157389 345 225 NA NCRP
34013 Essex County NJ 21.37804399 13.97566694 NA TRUE TRUE 781027 792091 795723 1680 1107 NA NCRP
34015 Gloucester County NJ 7.540695543 7.932675726 NA TRUE TRUE 280015 289940 290951 218 230 NA NCRP
34017 Hudson County NJ 20.94305815 10.48341181 NA TRUE TRUE 613577 663906 669115 1350 696 NA NCRP
34019 Hunterdon County NJ 7.241414595 7.590552924 NA TRUE TRUE 128535 126473 126067 92 96 NA NCRP
34021 Mercer County NJ 16.35451814 14.84967067 NA TRUE TRUE 362840 371052 371537 602 551 NA NCRP
34023 Middlesex County NJ 8.420784651 11.30215511 NA TRUE TRUE 786890 830815 836297 688 939 NA NCRP
34025 Monmouth County NJ 10.95698984 7.608379701 NA TRUE TRUE 626934 629569 629279 690 479 NA NCRP
34027 Morris County NJ 4.058466142 2.921916777 NA TRUE TRUE 487486 499672 499727 201 146 NA NCRP
34029 Ocean County NJ 6.805987887 5.844926056 NA TRUE TRUE 561302 583412 586301 394 341 NA NCRP
34031 Passaic County NJ 24.93765586 11.49905917 NA TRUE TRUE 492730 506998 508856 1254 583 NA NCRP
34033 Salem County NJ 23.24344854 15.97395017 NA TRUE TRUE 65831 65106 64715 153 104 NA NCRP
34035 Somerset County NJ 6.008454754 4.437106282 NA TRUE TRUE 314993 331297 332568 196 147 NA NCRP
34037 Sussex County NJ 7.233444201 6.861534239 NA TRUE TRUE 150508 145740 144909 107 100 NA NCRP
34039 Union County NJ 22.62435068 14.0616274 NA TRUE TRUE 525153 549723 552939 1223 773 NA NCRP
34041 Warren County NJ 10.07859454 8.704686491 NA TRUE TRUE 109059 106839 106917 109 93 NA NCRP
35001 Bernalillo County NM NA NA 21.67119877 TRUE 628632 674883 675551 NA NA 1,464 New Mexico Sentencing Commission
35003 Catron County NM NA NA 2.812148481 TRUE 3573 3592 3556 NA NA 1 New Mexico Sentencing Commission
35005 Chaves County NM NA NA 30.9663317 TRUE 62486 66041 65878 NA NA 204 New Mexico Sentencing Commission
35006 Cibola County NM NA NA 10.96932246 TRUE 27032 27483 27349 NA NA 30 New Mexico Sentencing Commission
35007 Colfax County NM NA NA 35.48895899 TRUE 13982 13054 12680 NA NA 45 New Mexico Sentencing Commission
35009 Curry County NM NA NA 31.78402558 TRUE 47018 50580 50969 NA NA 162 New Mexico Sentencing Commission
35011 De Baca County NM NA NA 43.83561644 TRUE 1994 1891 1825 NA NA 8 New Mexico Sentencing Commission
35013 Dona Ana County NM NA NA 20.40472491 TRUE 193701 213697 213676 NA NA 436 New Mexico Sentencing Commission
35015 Eddy County NM NA NA 25.17953719 TRUE 51366 55486 56395 NA NA 142 New Mexico Sentencing Commission
35017 Grant County NM NA NA 16.84080286 TRUE 29503 29310 29096 NA NA 49 New Mexico Sentencing Commission
35019 Guadalupe County NM NA NA 24.61951656 TRUE 4701 4560 4468 NA NA 11 New Mexico Sentencing Commission
35021 Harding County NM NA NA 14.64128843 TRUE 749 688 683 NA NA 1 New Mexico Sentencing Commission
35023 Hidalgo County NM NA NA 17.54385965 TRUE 4921 4626 4560 NA NA 8 New Mexico Sentencing Commission
35025 Lea County NM NA NA 21.85745511 TRUE 59541 68347 69999 NA NA 153 New Mexico Sentencing Commission
35027 Lincoln County NM NA NA 35.01471633 TRUE 20588 20023 19706 NA NA 69 New Mexico Sentencing Commission
35028 Los Alamos County NM NA NA 13.00757833 TRUE 18477 17831 17682 NA NA 23 New Mexico Sentencing Commission
35029 Luna County NM NA NA 27.96579257 TRUE 25303 24778 24673 NA NA 69 New Mexico Sentencing Commission
35031 McKinley County NM NA NA 6.073038409 TRUE 70541 73332 74098 NA NA 45 New Mexico Sentencing Commission
35033 Mora County NM NA NA 132.8397213 TRUE 4992 4673 4592 NA NA 61 New Mexico Sentencing Commission
35035 Otero County NM NA NA 31.34507237 TRUE 62200 65900 65082 NA NA 204 New Mexico Sentencing Commission
35037 Quay County NM NA NA 38.81896248 TRUE 9036 8697 8501 NA NA 33 New Mexico Sentencing Commission
35039 Rio Arriba County NM NA NA 9.804660985 TRUE 40335 40088 39777 NA NA 39 New Mexico Sentencing Commission
35041 Roosevelt County NM NA NA 19.96314496 TRUE 19186 19983 19536 NA NA 39 New Mexico Sentencing Commission
35043 Sandoval County NM NA NA 21.65571769 TRUE 114231 136479 137608 NA NA 298 New Mexico Sentencing Commission
35045 San Juan County NM NA NA 6.866744759 TRUE 125028 126448 123785 NA NA 85 New Mexico Sentencing Commission
35047 San Miguel County NM NA NA 15.2271681 TRUE 29388 28623 28239 NA NA 43 New Mexico Sentencing Commission
35049 Santa Fe County NM NA NA 8.166626171 TRUE 138786 147306 148164 NA NA 121 New Mexico Sentencing Commission
35051 Sierra County NM NA NA 38.85209713 TRUE 11997 11571 11325 NA NA 44 New Mexico Sentencing Commission
35053 Socorro County NM NA NA 40.43905257 TRUE 18081 17531 17310 NA NA 70 New Mexico Sentencing Commission
35055 Taos County NM NA NA 18.74017652 TRUE 32170 33030 33084 NA NA 62 New Mexico Sentencing Commission
35057 Torrance County NM NA NA 41.63730703 TRUE 16728 15713 15611 NA NA 65 New Mexico Sentencing Commission
35059 Union County NM NA NA 18.61764021 TRUE 4210 4381 4297 NA NA 8 New Mexico Sentencing Commission
35061 Valencia County NM NA NA 12.79396441 TRUE 71661 76270 75817 NA NA 97 New Mexico Sentencing Commission
36001 Albany County NY 25.87796737 24.5919237 22.81201022 TRUE TRUE TRUE 303997 307418 308171 790 756 703 NCRP
36003 Allegany County NY 4.936443293 9.36329588 7.960449137 TRUE TRUE TRUE 49359 48060 47736 24 45 38 NCRP
36005 Bronx County NY 19.00788298 13.38175052 11.55644126 TRUE TRUE TRUE 1348164 1427317 1438159 2656 1910 1662 NCRP
36007 Broome County NY 20.32132786 18.5668229 18.39380995 TRUE TRUE TRUE 200905 198203 197349 405 368 363 NCRP
36009 Cattaraugus County NY 16.05317615 10.76003848 11.57760814 TRUE TRUE TRUE 81342 78996 78600 128 85 91 NCRP
36011 Cayuga County NY 10.90676596 22.81464675 22.83597427 TRUE TRUE TRUE 80892 79335 78823 87 181 180 NCRP
36013 Chautauqua County NY 14.16261666 13.97288059 11.81343854 TRUE TRUE TRUE 135640 133115 132053 190 186 156 NCRP
36015 Chemung County NY 20.14042036 18.42120133 17.20405606 TRUE TRUE TRUE 88732 88485 87770 179 163 151 NCRP
36017 Chenango County NY 8.579238243 11.71291248 15.37652248 TRUE TRUE TRUE 51391 49518 49426 43 58 76 NCRP
36019 Clinton County NY 10.99370916 25.31397894 25.60270482 TRUE TRUE TRUE 82547 81773 81632 90 207 209 NCRP
36021 Columbia County NY 14.2004659 9.953603365 12.55593831 TRUE TRUE TRUE 63427 62289 62122 89 62 78 NCRP
36023 Cortland County NY 18.26632299 18.31166453 14.8906658 TRUE TRUE TRUE 49449 49149 49024 90 90 73 NCRP
36025 Delaware County NY 7.580383652 10.45110376 11.80738928 TRUE TRUE TRUE 48271 46885 46581 36 49 55 NCRP
36027 Dutchess County NY 8.372984515 10.87311446 11.96982929 TRUE TRUE TRUE 294712 297063 296579 249 323 355 NCRP
36029 Erie County NY 11.60754109 9.589069329 10.51108811 TRUE TRUE TRUE 925564 921883 922835 1067 884 970 NCRP
36031 Essex County NY 4.338837702 10.80886327 20.68305799 TRUE TRUE TRUE 39490 38857 38679 17 42 80 NCRP
36033 Franklin County NY 11.61080579 16.9475017 17.55686473 TRUE TRUE TRUE 51511 51335 51262 60 87 90 NCRP
36035 Fulton County NY 14.68322306 16.50528169 16.26467055 TRUE TRUE TRUE 55328 54528 54105 81 90 88 NCRP
36037 Genesee County NY 20.20978087 20.36282858 19.94523512 TRUE TRUE TRUE 59919 59422 59162 121 121 118 NCRP
36039 Greene County NY 13.28482668 11.78684423 14.17641295 TRUE TRUE TRUE 49513 48359 47967 65 57 68 NCRP
36041 Hamilton County NY NA 12.60769069 14.84623542 TRUE TRUE 4987 4759 4715 NA 6 7 NCRP
36043 Herkimer County NY 12.41696157 16.9660368 18.04091365 TRUE TRUE TRUE 64029 64246 63744 80 109 115 NCRP
36045 Jefferson County NY 8.892803605 10.6244144 12.25829744 TRUE TRUE TRUE 113650 119536 119103 105 127 146 NCRP
36047 Kings County NY 11.37889801 8.204050688 6.999027002 TRUE TRUE TRUE 2436132 2602373 2621793 2890 2135 1835 NCRP
36049 Lewis County NY 8.484580198 8.828073273 8.449669361 TRUE TRUE TRUE 27001 27186 27220 23 24 23 NCRP
36051 Livingston County NY 13.21308403 16.52994701 16.72189019 TRUE TRUE TRUE 65357 64731 64586 86 107 108 NCRP
36053 Madison County NY 5.216985406 5.791425932 10.36355346 TRUE TRUE TRUE 72042 72521 72369 38 42 75 NCRP
36055 Monroe County NY 14.5335598 14.83859528 15.24290631 TRUE TRUE TRUE 738329 750071 749857 1085 1113 1143 NCRP
36057 Montgomery County NY 11.99544173 16.45595023 19.28524076 TRUE TRUE TRUE 49724 49830 49779 60 82 96 NCRP
36059 Nassau County NY 5.581333046 5.40181935 5.211143309 TRUE TRUE TRUE 1324905 1355099 1358627 750 732 708 NCRP
36061 New York County NY 33.57686423 23.01463537 21.89739089 TRUE TRUE TRUE 1578171 1632005 1636268 5390 3756 3583 NCRP
36063 Niagara County NY 11.74204627 11.71419237 12.31705889 TRUE TRUE TRUE 216148 214270 213525 253 251 263 NCRP
36065 Oneida County NY 15.79805812 19.20436611 17.1339497 TRUE TRUE TRUE 234229 233801 232871 370 449 399 NCRP
36067 Onondaga County NY 15.496509 16.78600299 16.12572512 TRUE TRUE TRUE 460925 468843 468196 724 787 755 NCRP
36069 Ontario County NY 21.88143402 21.85622445 26.34289517 TRUE TRUE TRUE 104644 109351 109707 237 239 289 NCRP
36071 Orange County NY 18.66799322 13.41598075 12.65624211 TRUE TRUE TRUE 366908 374926 376099 698 503 476 NCRP
36073 Orleans County NY 16.87645032 19.81879955 18.34032012 TRUE TRUE TRUE 43420 42384 41984 72 84 77 NCRP
36075 Oswego County NY 12.80819725 17.86052331 17.86408409 TRUE TRUE TRUE 122354 121497 120913 156 217 216 NCRP
36077 Otsego County NY 8.06074578 11.51774706 6.870828426 TRUE TRUE TRUE 63032 61644 61128 50 71 42 NCRP
36079 Putnam County NY 3.810746305 5.620063627 5.327329199 TRUE TRUE TRUE 99357 99643 99487 38 56 53 NCRP
36081 Queens County NY 7.937422443 6.649325758 6.284513133 TRUE TRUE TRUE 2173862 2303993 2321580 1791 1532 1459 NCRP
36083 Rensselaer County NY 17.61037822 13.15352671 13.2687421 TRUE TRUE TRUE 157312 159653 159774 281 210 212 NCRP
36085 Richmond County NY 6.996680298 5.436955643 5.937301254 TRUE TRUE TRUE 457577 472691 473279 329 257 281 NCRP
36087 Rockland County NY 8.791724987 6.293168174 5.249084498 TRUE TRUE TRUE 299390 320983 323866 277 202 170 NCRP
36089 St. Lawrence County NY 8.028760805 11.69444469 13.28545781 TRUE TRUE TRUE 111556 112019 111400 90 131 148 NCRP
36091 Saratoga County NY 4.792715073 7.585256047 7.380369107 TRUE TRUE TRUE 214627 224119 224921 106 170 166 NCRP
36093 Schenectady County NY 27.77400999 19.49305198 18.62137606 TRUE TRUE TRUE 151768 155440 155735 430 303 290 NCRP
36095 Schoharie County NY 8.023700778 8.477503218 6.335931065 TRUE TRUE TRUE 32661 31849 31566 26 27 20 NCRP
36097 Schuyler County NY 9.223090278 11.90218567 13.52887061 TRUE TRUE TRUE 18752 18484 18479 17 22 25 NCRP
36099 Seneca County NY 6.504708844 12.47413035 14.90654741 TRUE TRUE TRUE 35223 35273 34884 23 44 52 NCRP
36101 Steuben County NY 17.98870148 18.79718244 15.34646422 TRUE TRUE TRUE 98473 98951 98394 178 186 151 NCRP
36103 Suffolk County NY 8.370086168 7.358846218 6.267598512 TRUE TRUE TRUE 1475626 1502953 1502968 1252 1106 942 NCRP
36105 Sullivan County NY 28.26250421 21.16910609 24.75540866 TRUE TRUE TRUE 77231 76999 75943 218 163 188 NCRP
36107 Tioga County NY 11.02600957 12.16132698 9.825546421 TRUE TRUE TRUE 51536 50159 49870 56 61 49 NCRP
36109 Tompkins County NY 6.649066197 8.719147631 6.972901204 TRUE TRUE TRUE 99651 104368 104691 68 91 73 NCRP
36111 Ulster County NY 13.45518052 16.58851632 15.35093796 TRUE TRUE TRUE 182845 180848 180445 245 300 277 NCRP
36113 Warren County NY 17.53476458 27.4645186 26.01080449 TRUE TRUE TRUE 65554 65175 64973 115 179 169 NCRP
36115 Washington County NY 9.962521941 22.95808555 19.2394023 TRUE TRUE TRUE 62771 62723 62372 63 144 120 NCRP
36117 Wayne County NY 10.2977774 8.334415725 7.713115556 TRUE TRUE TRUE 93595 92388 92051 96 77 71 NCRP
36119 Westchester County NY 6.577550788 4.683811756 4.492954184 TRUE TRUE TRUE 931426 969296 972634 629 454 437 NCRP
36121 Wyoming County NY 10.25689955 13.2718805 14.56734971 TRUE TRUE TRUE 42673 41441 41188 43 55 60 NCRP
36123 Yates County NY 13.83782074 13.11136716 12.29768328 TRUE TRUE TRUE 25025 25169 25208 35 33 31 NCRP
37001 Alamance County NC 20.26601606 17.64877008 21.75978227 TRUE TRUE TRUE 141462 154685 155792 309 273 339 NCRP
37003 Alexander County NC 12.40862129 10.25641026 13.37184424 TRUE TRUE TRUE 36243 37050 37392 46 38 50 NCRP
37005 Alleghany County NC 15.39018649 19.26782274 19.30324478 TRUE TRUE TRUE 10940 10899 10879 17 21 21 NCRP
37007 Anson County NC 18.81892431 20 19.01804774 TRUE TRUE TRUE 26599 26000 25765 50 52 49 NCRP
37009 Ashe County NC 11.77336277 13.26064535 16.58925017 TRUE TRUE TRUE 26134 27148 27126 32 36 45 NCRP
37011 Avery County NC 13.51655778 14.64953798 23.63135093 TRUE TRUE TRUE 18104 17748 17773 24 26 42 NCRP
37013 Beaufort County NC 23.54177614 26.77686647 31.31238836 TRUE TRUE TRUE 46622 47429 47585 112 127 149 NCRP
37015 Bertie County NC 11.01585325 9.788087897 7.460459564 TRUE TRUE TRUE 19936 20433 20106 23 20 15 NCRP
37017 Bladen County NC 7.721124424 15.21327286 16.44689385 TRUE TRUE TRUE 34114 34838 34657 27 53 57 NCRP
37019 Brunswick County NC 10.15191617 15.26955979 14.89447642 TRUE TRUE TRUE 93938 115262 118836 112 176 177 NCRP
37021 Buncombe County NC 16.99744831 16.90565916 17.28273842 TRUE TRUE TRUE 226524 247846 250539 411 419 433 NCRP
37023 Burke County NC 9.162058041 14.16967912 16.65064926 TRUE TRUE TRUE 89903 89628 89486 83 127 149 NCRP
37025 Cabarrus County NC 14.71763636 15.50668493 19.31255628 TRUE TRUE TRUE 157735 187661 192103 267 291 371 NCRP
37027 Caldwell County NC 11.16410014 8.783808513 15.34043493 TRUE TRUE TRUE 80897 81969 81484 92 72 125 NCRP
37029 Camden County NC NA 4.905327185 NA TRUE 9321 10193 10331 NA 5 NA NCRP
37031 Carteret County NC 12.94681389 10.9463483 19.32830507 TRUE TRUE TRUE 64028 68516 68811 87 75 133 NCRP
37033 Caswell County NC 9.803085841 9.893324157 12.13066459 TRUE TRUE TRUE 23993 23248 23082 23 23 28 NCRP
37035 Catawba County NC 8.8712184 13.4431188 16.56593371 TRUE TRUE TRUE 150449 154726 154534 137 208 256 NCRP
37037 Chatham County NC 6.010541565 8.687056286 9.752831232 TRUE TRUE TRUE 58779 66766 68698 39 58 67 NCRP
37039 Cherokee County NC 10.64493631 12.54334834 11.79028039 TRUE TRUE TRUE 26877 27106 27141 29 34 32 NCRP
37041 Chowan County NC 18.26545799 8.163820668 11.66620917 TRUE TRUE TRUE 14835 14699 14572 27 12 17 NCRP
37043 Clay County NC NA 8.476172537 8.505812305 TRUE TRUE 10107 10618 10581 NA 9 9 NCRP
37045 Cleveland County NC 19.04371864 29.77018243 30.38856154 TRUE TRUE TRUE 96990 97077 97076 186 289 295 NCRP
37047 Columbus County NC 16.44708367 15.38622932 20.01650484 TRUE TRUE TRUE 55654 57194 56953 95 88 114 NCRP
37049 Craven County NC 12.68730597 13.59437078 19.1369247 TRUE TRUE TRUE 96926 104455 104510 132 142 200 NCRP
37051 Cumberland County NC 11.05476768 14.85606464 19.67345738 TRUE TRUE TRUE 307365 326466 326328 356 485 642 NCRP
37053 Currituck County NC 5.862646566 6.553616777 6.005765535 TRUE TRUE TRUE 22923 24414 24976 14 16 15 NCRP
37055 Dare County NC 19.24815539 16.60986855 14.24339107 TRUE TRUE TRUE 33463 34919 35104 66 58 50 NCRP
37057 Davidson County NC 13.49900291 16.90529374 18.04086011 TRUE TRUE TRUE 157209 163854 164072 220 277 296 NCRP
37059 Davie County NC 8.224678875 12.03398397 10.61929816 TRUE TRUE TRUE 39539 41549 41434 34 50 44 NCRP
37061 Duplin County NC 11.49250452 18.29073885 22.5443372 TRUE TRUE TRUE 54704 59593 59882 68 109 135 NCRP
37063 Durham County NC 10.37997208 12.83639152 13.34646472 TRUE TRUE TRUE 246929 288243 294460 287 370 393 NCRP
37065 Edgecombe County NC 16.59262431 20.70057962 29.49047021 TRUE TRUE TRUE 56129 55554 54933 93 115 162 NCRP
37067 Forsyth County NC 13.44965262 13.49852429 15.27519997 TRUE TRUE TRUE 332110 361521 365298 477 488 558 NCRP
37069 Franklin County NC 6.704385649 10.43757527 12.09035953 TRUE TRUE TRUE 55460 62275 62860 41 65 76 NCRP
37071 Gaston County NC 16.30778287 19.76209115 22.87722556 TRUE TRUE TRUE 196284 209492 211127 338 414 483 NCRP
37073 Gates County NC 11.68419296 4.282655246 6.051698798 TRUE TRUE TRUE 11708 11675 11567 14 5 7 NCRP
37075 Graham County NC 10.27162748 10.31282228 6.941230912 TRUE TRUE TRUE 8561 8727 8644 9 9 6 NCRP
37077 Granville County NC 11.85811508 11.69832095 11.96581197 TRUE TRUE TRUE 55167 58128 58500 69 68 70 NCRP
37079 Greene County NC 19.64269011 16.4985387 14.22272792 TRUE TRUE TRUE 20742 21214 21093 42 35 30 NCRP
37081 Guilford County NC 16.73645236 18.24626741 19.37049787 TRUE TRUE TRUE 458792 506953 512119 829 925 992 NCRP
37083 Halifax County NC 13.08731636 9.744214373 16.80196338 TRUE TRUE TRUE 55685 53365 52970 71 52 89 NCRP
37085 Harnett County NC 12.87954677 10.54843891 10.89479418 TRUE TRUE TRUE 103036 125137 126666 153 132 138 NCRP
37087 Haywood County NC 13.90985734 17.57855416 19.50530511 TRUE TRUE TRUE 57701 59163 59471 82 104 116 NCRP
37089 Henderson County NC 10.13171226 11.86878601 15.56469244 TRUE TRUE TRUE 100056 109531 111149 109 130 173 NCRP
37091 Hertford County NC 17.94746288 11.86579378 13.98716472 TRUE TRUE TRUE 23981 24440 24308 44 29 34 NCRP
37093 Hoke County NC 15.969862 16.42132426 18.01941447 TRUE TRUE TRUE 41360 51153 51611 78 84 93 NCRP
37095 Hyde County NC 10.39681164 20.94240838 8.809020437 TRUE TRUE TRUE 5621 5730 5676 6 12 5 NCRP
37097 Iredell County NC 13.20545329 15.12060045 17.15914204 TRUE TRUE TRUE 146854 164676 166675 213 249 286 NCRP
37099 Jackson County NC 7.184975967 9.033203125 5.368341427 TRUE TRUE TRUE 38129 40960 40981 29 37 22 NCRP
37101 Johnston County NC 10.5616843 15.50561798 17.03201909 TRUE TRUE TRUE 149721 178000 181423 182 276 309 NCRP
37103 Jones County NC 9.809691976 29.35420744 15.87931719 TRUE TRUE TRUE 9994 10220 10076 10 30 16 NCRP
37105 Lee County NC 13.79075509 14.83407504 16.42586571 TRUE TRUE TRUE 52642 59997 59662 81 89 98 NCRP
37107 Lenoir County NC 27.49801778 25.4621378 27.35744208 TRUE TRUE TRUE 59203 58911 58485 163 150 160 NCRP
37109 Lincoln County NC 11.93484085 19.88647091 20.04284157 TRUE TRUE TRUE 72179 79451 79829 94 158 160 NCRP
37111 McDowell County NC 8.006583191 9.786694544 9.340598243 TRUE TRUE TRUE 43969 44959 44965 36 44 42 NCRP
37113 Macon County NC 4.430136744 8.881257586 8.856088561 TRUE TRUE TRUE 32736 33779 33875 15 30 30 NCRP
37115 Madison County NC 22.55061894 26.51389612 37.81254431 TRUE TRUE TRUE 20265 21121 21157 47 56 80 NCRP
37117 Martin County NC 20.29237586 44.2963213 55.85401211 TRUE TRUE TRUE 24651 23704 23454 49 105 131 NCRP
37119 Mecklenburg County NC 6.672755204 9.742935616 10.14281919 TRUE TRUE TRUE 831507 992514 1012539 632 967 1027 NCRP
37121 Mitchell County NC 17.47233547 26.11306959 30.04375939 TRUE TRUE TRUE 15699 15318 15311 27 40 46 NCRP
37123 Montgomery County NC 9.02299058 12.7231088 19.71162621 TRUE TRUE TRUE 27311 27509 27395 25 35 54 NCRP
37125 Moore County NC 12.63628739 15.61544509 22.88427861 TRUE TRUE TRUE 82838 91576 93077 113 143 213 NCRP
37127 Nash County NC 14.23025813 18.18950931 24.26952955 TRUE TRUE TRUE 92127 94560 94357 136 172 229 NCRP
37129 New Hanover County NC 19.13731874 21.38937098 24.36453411 TRUE TRUE TRUE 190791 213190 216298 395 456 527 NCRP
37131 Northampton County NC 12.47401247 9.613997981 7.330303475 TRUE TRUE TRUE 22112 20803 20463 27 20 15 NCRP
37133 Onslow County NC 9.559007419 11.52588747 12.15423079 TRUE TRUE TRUE 161185 185669 187589 172 214 228 NCRP
37135 Orange County NC 7.34986072 6.673124529 7.976071785 TRUE TRUE TRUE 124286 139365 140420 100 93 112 NCRP
37137 Pamlico County NC 16.77468547 7.743534149 15.44640099 TRUE TRUE TRUE 12995 12914 12948 22 10 20 NCRP
37139 Pasquotank County NC 14.59709543 8.802595508 11.56156534 TRUE TRUE TRUE 38956 39761 39787 59 35 46 NCRP
37141 Pender County NC 13.10566914 13.97180236 16.88888889 TRUE TRUE TRUE 47481 55111 56250 70 77 95 NCRP
37143 Perquimans County NC 6.684988487 5.881055649 9.653943265 TRUE TRUE TRUE 12494 13603 13466 9 8 13 NCRP
37145 Person County NC 14.22728081 20.89278435 30.40989472 TRUE TRUE TRUE 38244 39248 39132 56 82 119 NCRP
37147 Pitt County NC 13.78420389 16.91989148 21.271257 TRUE TRUE TRUE 152934 174351 175354 235 295 373 NCRP
37149 Polk County NC 4.415877533 10.28453891 11.2983249 TRUE TRUE TRUE 19912 20419 20357 9 21 23 NCRP
37151 Randolph County NC 7.532983202 9.757398776 11.20620824 TRUE TRUE TRUE 137885 142456 142778 107 139 160 NCRP
37153 Richmond County NC 13.10869472 21.41744548 26.67657928 TRUE TRUE TRUE 46263 46224 45733 61 99 122 NCRP
37155 Robeson County NC 11.5954956 16.07931474 18.40308697 TRUE TRUE TRUE 128894 134956 134760 156 217 248 NCRP
37157 Rockingham County NC 17.63934003 19.36782547 22.13837027 TRUE TRUE TRUE 92960 91905 91696 164 178 203 NCRP
37159 Rowan County NC 14.68195133 24.36502715 25.89627065 TRUE TRUE TRUE 134045 138313 138630 203 337 359 NCRP
37161 Rutherford County NC 16.02302568 26.01713542 27.02702703 TRUE TRUE TRUE 65855 66879 66600 108 174 180 NCRP
37163 Sampson County NC 15.70179157 20.74947736 27.16627635 TRUE TRUE TRUE 62118 64098 64050 100 133 174 NCRP
37165 Scotland County NC 31.76707826 24.16263956 19.95727457 TRUE TRUE TRUE 36348 36006 35576 115 87 71 NCRP
37167 Stanly County NC 10.7386542 12.53504866 13.36633663 TRUE TRUE TRUE 59185 60630 60600 65 76 81 NCRP
37169 Stokes County NC 13.17383082 13.09378153 17.44975118 TRUE TRUE TRUE 46755 46587 46419 62 61 81 NCRP
37171 Surry County NC 14.01627521 14.37135583 15.34919417 TRUE TRUE TRUE 72807 73062 72968 103 105 112 NCRP
37173 Swain County NC 12.12813013 15.69858713 18.21493625 TRUE TRUE TRUE 13693 14014 14274 17 22 26 NCRP
37175 Transylvania County NC 8.208183863 11.84510251 9.078529278 TRUE TRUE TRUE 31469 32925 33045 27 39 30 NCRP
37177 Tyrrell County NC 37.45318352 NA NA TRUE 4339 4105 4115 16 NA NA NCRP
37179 Union County NC 5.841519574 8.838906232 9.013213279 TRUE TRUE TRUE 172529 212696 218568 120 188 197 NCRP
37181 Vance County NC 24.15780142 17.6615247 20.62132963 TRUE TRUE TRUE 44574 44730 44614 109 79 92 NCRP
37183 Wake County NC 9.43808423 15.43551748 16.32136467 TRUE TRUE TRUE 784038 975024 998691 877 1505 1630 NCRP
37185 Warren County NC 7.214313197 5.374505301 11.86298255 TRUE TRUE TRUE 20513 20467 20231 15 11 24 NCRP
37187 Washington County NC 22.37999691 18.80141011 14.31980907 TRUE TRUE TRUE 13305 12765 12570 29 24 18 NCRP
37189 Watauga County NC 6.594642823 12.80654472 9.512937595 TRUE TRUE TRUE 47748 52317 52560 34 67 50 NCRP
37191 Wayne County NC 15.39932891 16.77421426 16.15028604 TRUE TRUE TRUE 117534 124596 124456 190 209 201 NCRP
37193 Wilkes County NC 13.00878816 24.77829943 31.81382376 TRUE TRUE TRUE 68489 69012 68838 90 171 219 NCRP
37195 Wilson County NC 18.92705709 13.48072257 20.39286987 TRUE TRUE TRUE 77379 81598 81401 154 110 166 NCRP
37197 Yadkin County NC 13.86817385 22.10002894 26.72523285 TRUE TRUE TRUE 37881 38009 37792 53 84 101 NCRP
37199 Yancey County NC 9.591514331 20.49647005 18.73509708 TRUE TRUE TRUE 17814 17564 17614 17 36 33 NCRP
38001 Adams County ND NA NA NA 2366 2366 2384 NA NA NA NCRP
38003 Barnes County ND 20.74875959 10.75076151 16.15218952 TRUE TRUE TRUE 11106 11162 11144 23 12 18 NCRP
38005 Benson County ND NA 11.63805644 14.63486024 TRUE TRUE 6709 6874 6833 NA 8 10 NCRP
38007 Billings County ND NA NA NA 741 891 901 NA NA NA NCRP
38009 Bottineau County ND 12.25302497 8.911332244 18.04511278 TRUE TRUE TRUE 6526 6733 6650 8 6 12 NCRP
38011 Bowman County ND NA NA NA 3020 3212 3247 NA NA NA NCRP
38013 Burke County ND NA NA NA 1975 2291 2245 NA NA NA NCRP
38015 Burleigh County ND 27.88835125 40.46939995 41.32459697 TRUE TRUE TRUE 75940 88709 90503 234 359 374 NCRP
38017 Cass County ND 16.80944964 10.10986048 12.69423071 TRUE TRUE TRUE 138340 163207 167005 259 165 212 NCRP
38019 Cavalier County ND NA NA NA 4202 3875 3855 NA NA NA NCRP
38021 Dickey County ND 13.29787234 NA NA TRUE 5419 5231 5150 7 NA NA NCRP
38023 Divide County ND NA NA NA 2083 2315 2432 NA NA NA NCRP
38025 Dunn County ND NA NA NA 3432 4162 4399 NA NA NA NCRP
38027 Eddy County ND NA NA NA 2529 2406 2377 NA NA NA NCRP
38029 Emmons County ND NA 17.23642631 NA TRUE 3748 3481 3422 NA 6 NA NCRP
38031 Foster County ND NA NA 17.84651993 TRUE 3565 3372 3362 NA NA 6 NCRP
38033 Golden Valley County ND NA NA NA 1670 1815 1825 NA NA NA NCRP
38035 Grand Forks County ND 14.54934157 18.90031885 19.67549688 TRUE TRUE TRUE 67096 69311 70138 98 131 138 NCRP
38037 Grant County ND NA NA NA 2519 2371 2361 NA NA NA NCRP
38039 Griggs County ND NA NA NA 2457 2292 2319 NA NA NA NCRP
38041 Hettinger County ND NA NA NA 2577 2668 2660 NA NA NA NCRP
38043 Kidder County ND NA NA NA 2509 2429 2424 NA NA NA NCRP
38045 LaMoure County ND NA NA NA 4357 4133 4149 NA NA NA NCRP
38047 Logan County ND NA NA NA 2018 1932 1944 NA NA NA NCRP
38049 McHenry County ND NA 15.24390244 11.69004676 TRUE TRUE 5507 5904 5988 NA 9 7 NCRP
38051 McIntosh County ND NA 21.70767004 NA TRUE 3080 2764 2801 NA 6 NA NCRP
38053 McKenzie County ND NA NA 17.27901055 TRUE 5727 9297 10996 NA NA 19 NCRP
38055 McLean County ND 14.18749318 11.60827353 21.92524535 TRUE TRUE TRUE 8767 9476 9578 13 11 21 NCRP
38057 Mercer County ND 8.278145695 9.306654258 10.29041848 TRUE TRUE TRUE 8309 8596 8746 7 8 9 NCRP
38059 Morton County ND 18.29662051 27.25171617 21.79598954 TRUE TRUE TRUE 25910 28989 29822 51 79 65 NCRP
38061 Mountrail County ND NA NA NA 6826 9346 9782 NA NA NA NCRP
38063 Nelson County ND NA NA NA 3271 3079 3045 NA NA NA NCRP
38065 Oliver County ND NA NA NA 1863 1869 1850 NA NA NA NCRP
38067 Pembina County ND 16.37778081 12.56281407 11.22334456 TRUE TRUE TRUE 7786 7164 7128 12 9 8 NCRP
38069 Pierce County ND 20.45919527 18.21493625 31.78928247 TRUE TRUE TRUE 4394 4392 4404 9 8 14 NCRP
38071 Ramsey County ND 52.29669659 47.64792515 48.42615012 TRUE TRUE TRUE 11298 11543 11564 60 55 56 NCRP
38073 Ransom County ND NA NA 14.6896805 TRUE 5720 5490 5446 NA NA 8 NCRP
38075 Renville County ND NA NA NA 2499 2616 2587 NA NA NA NCRP
38077 Richland County ND 10.4563907 9.19061332 7.302823759 TRUE TRUE TRUE 16869 16321 16432 17 15 12 NCRP
38079 Rolette County ND 15.51918736 4.107619634 4.789272031 TRUE TRUE TRUE 13625 14607 14616 22 6 7 NCRP
38081 Sargent County ND NA NA NA 4115 3880 3931 NA NA NA NCRP
38083 Sheridan County ND NA 45.69687738 NA TRUE 1435 1313 1326 NA 6 NA NCRP
38085 Sioux County ND NA NA NA 4148 4426 4422 NA NA NA NCRP
38087 Slope County ND NA NA NA 744 761 765 NA NA NA NCRP
38089 Stark County ND 9.350892231 12.33393241 8.231265639 TRUE TRUE TRUE 22770 28377 30372 24 35 25 NCRP
38091 Steele County ND NA NA NA 2026 1960 1955 NA NA NA NCRP
38093 Stutsman County ND 8.552694099 19.44049312 13.25192863 TRUE TRUE TRUE 21115 21090 21129 18 41 28 NCRP
38095 Towner County ND NA NA NA 2408 2297 2310 NA NA NA NCRP
38097 Traill County ND 9.846153846 NA NA TRUE 8249 8210 8082 8 NA NA NCRP
38099 Walsh County ND 25.22068096 26.11201153 27.34731085 TRUE TRUE TRUE 11501 11106 10970 28 29 30 NCRP
38101 Ward County ND 10.46744157 17.50051472 25.07782774 TRUE TRUE TRUE 58030 67998 69384 67 119 174 NCRP
38103 Wells County ND 11.84834123 19.11589008 11.92748092 TRUE TRUE TRUE 4404 4185 4192 5 8 5 NCRP
38105 Williams County ND 13.98657289 15.89825119 26.76626206 TRUE TRUE TRUE 20122 29563 32130 35 47 86 NCRP
39001 Adams County OH 12.67337886 47.28720757 29.50691457 TRUE TRUE TRUE 28615 28126 28129 36 133 83 Ohio Department of Rehabilitation and Correction/NCRP
39003 Allen County OH 25.21365504 14.82692417 15.51789794 TRUE TRUE TRUE 106716 105214 105040 267 156 163 Ohio Department of Rehabilitation and Correction/NCRP
39005 Ashland County OH 10.70744261 13.17845511 17.5355897 TRUE TRUE TRUE 53231 53117 53035 57 70 93 Ohio Department of Rehabilitation and Correction/NCRP
39007 Ashtabula County OH 16.06585015 16.93743172 15.83060247 TRUE TRUE TRUE 102340 99779 99175 162 169 157 Ohio Department of Rehabilitation and Correction/NCRP
39009 Athens County OH 16.97242752 25.26544215 30.90569128 TRUE TRUE TRUE 64237 64515 64713 110 163 200 Ohio Department of Rehabilitation and Correction/NCRP
39011 Auglaize County OH 25.70470091 19.83607987 16.79719029 TRUE TRUE TRUE 46034 45876 45841 118 91 77 Ohio Department of Rehabilitation and Correction/NCRP
39013 Belmont County OH 7.429632805 8.052340211 12.093117 TRUE TRUE TRUE 70469 69545 69461 52 56 84 Ohio Department of Rehabilitation and Correction/NCRP
39015 Brown County OH 18.1598063 35.94438793 34.22794451 TRUE TRUE TRUE 44334 44235 44116 81 159 151 Ohio Department of Rehabilitation and Correction/NCRP
39017 Butler County OH 24.34735561 19.21881183 19.43029415 TRUE TRUE TRUE 356691 371511 374158 900 714 727 Ohio Department of Rehabilitation and Correction/NCRP
39019 Carroll County OH 18.12541392 9.904142054 7.45024302 TRUE TRUE TRUE 29163 28271 28187 52 28 21 Ohio Department of Rehabilitation and Correction/NCRP
39021 Champaign County OH 24.08731652 22.79924003 20.95685954 TRUE TRUE TRUE 40018 39475 39128 96 90 82 Ohio Department of Rehabilitation and Correction/NCRP
39023 Clark County OH 36.07645014 23.82988677 22.40871743 TRUE TRUE TRUE 140668 136803 136554 497 326 306 Ohio Department of Rehabilitation and Correction/NCRP
39025 Clermont County OH 18.19400555 19.17564693 19.69636833 TRUE TRUE TRUE 192209 200254 201560 361 384 397 Ohio Department of Rehabilitation and Correction/NCRP
39027 Clinton County OH 35.94125628 28.88586502 29.87928768 TRUE TRUE TRUE 42499 41889 41835 151 121 125 Ohio Department of Rehabilitation and Correction/NCRP
39029 Columbiana County OH 11.8605129 10.67195542 10.31357039 TRUE TRUE TRUE 109673 105885 105686 127 113 109 Ohio Department of Rehabilitation and Correction/NCRP
39031 Coshocton County OH 24.6866692 18.25613079 20.53894183 TRUE TRUE TRUE 37339 36700 36516 91 67 75 Ohio Department of Rehabilitation and Correction/NCRP
39033 Crawford County OH 18.68598321 21.51040449 23.30508475 TRUE TRUE TRUE 44907 42770 42480 81 92 99 Ohio Department of Rehabilitation and Correction/NCRP
39035 Cuyahoga County OH 44.73754315 24.95574983 24.15409088 TRUE TRUE TRUE 1312816 1263837 1259828 5693 3154 3043 Ohio Department of Rehabilitation and Correction/NCRP
39037 Darke County OH 18.22807884 7.449714428 6.513909112 TRUE TRUE TRUE 53023 52351 52196 96 39 34 Ohio Department of Rehabilitation and Correction/NCRP
39039 Defiance County OH 30.5826116 29.59885759 33.75746559 TRUE TRUE TRUE 39154 38515 38510 119 114 130 Ohio Department of Rehabilitation and Correction/NCRP
39041 Delaware County OH 10.60969243 9.665122407 9.570997234 TRUE TRUE TRUE 156164 185202 189113 189 179 181 Ohio Department of Rehabilitation and Correction/NCRP
39043 Erie County OH 28.57739385 31.5233667 28.08988764 TRUE TRUE TRUE 77876 76134 75828 219 240 213 Ohio Department of Rehabilitation and Correction/NCRP
39045 Fairfield County OH 13.45931616 19.75846287 17.75490255 TRUE TRUE TRUE 141005 148797 150381 198 294 267 Ohio Department of Rehabilitation and Correction/NCRP
39047 Fayette County OH 40.48162757 45.14045627 41.66666667 TRUE TRUE TRUE 28791 28799 28800 117 130 120 Ohio Department of Rehabilitation and Correction/NCRP
39049 Franklin County OH 18.39529405 13.98873322 13.66744817 TRUE TRUE TRUE 1115924 1213834 1231393 2174 1698 1683 Ohio Department of Rehabilitation and Correction/NCRP
39051 Fulton County OH 15.2578578 19.09566693 17.61390324 TRUE TRUE TRUE 42785 42418 42580 65 81 75 Ohio Department of Rehabilitation and Correction/NCRP
39053 Gallia County OH 16.20272854 21.2439128 30.26614469 TRUE TRUE TRUE 30927 30597 30397 50 65 92 Ohio Department of Rehabilitation and Correction/NCRP
39055 Geauga County OH 5.127657302 3.827384939 5.51460841 TRUE TRUE TRUE 93839 94059 94295 48 36 52 Ohio Department of Rehabilitation and Correction/NCRP
39057 Greene County OH 25.64764927 18.59725323 19.22842144 TRUE TRUE TRUE 157850 163465 163820 417 304 315 Ohio Department of Rehabilitation and Correction/NCRP
39059 Guernsey County OH 17.7788907 23.98142071 24.24854761 TRUE TRUE TRUE 40600 39614 39590 71 95 96 Ohio Department of Rehabilitation and Correction/NCRP
39061 Hamilton County OH 38.64265945 23.13442206 20.8397644 TRUE TRUE TRUE 804913 804429 806631 3101 1861 1681 Ohio Department of Rehabilitation and Correction/NCRP
39063 Hancock County OH 16.87954385 13.07586644 11.01716288 TRUE TRUE TRUE 74167 75712 75337 127 99 83 Ohio Department of Rehabilitation and Correction/NCRP
39065 Hardin County OH 17.87618391 23.92419807 22.01534784 TRUE TRUE TRUE 31939 31767 31796 57 76 70 Ohio Department of Rehabilitation and Correction/NCRP
39067 Harrison County OH 10.78269694 9.600614439 8.363893714 TRUE TRUE TRUE 15868 15624 15543 17 15 13 Ohio Department of Rehabilitation and Correction/NCRP
39069 Henry County OH 14.20252805 15.32375895 16.82356731 TRUE TRUE TRUE 29026 28061 27937 40 43 47 Ohio Department of Rehabilitation and Correction/NCRP
39071 Highland County OH 24.19633598 37.24007124 37.6350331 TRUE TRUE TRUE 43562 43233 43045 105 161 162 Ohio Department of Rehabilitation and Correction/NCRP
39073 Hocking County OH 26.6502665 29.36241611 37.24978242 TRUE TRUE TRUE 29097 28608 28725 78 84 107 Ohio Department of Rehabilitation and Correction/NCRP
39075 Holmes County OH 9.336850214 13.06290822 9.795434872 TRUE TRUE TRUE 41828 43635 43898 40 57 43 Ohio Department of Rehabilitation and Correction/NCRP
39077 Huron County OH 15.15406634 15.96223403 14.30663896 TRUE TRUE TRUE 60113 58889 58714 90 94 84 Ohio Department of Rehabilitation and Correction/NCRP
39079 Jackson County OH 16.0440758 15.8613958 27.1772322 TRUE TRUE TRUE 33135 32784 32748 53 52 89 Ohio Department of Rehabilitation and Correction/NCRP
39081 Jefferson County OH 13.20218199 12.05758231 13.73829291 TRUE TRUE TRUE 70656 68007 67694 91 82 93 Ohio Department of Rehabilitation and Correction/NCRP
39083 Knox County OH 10.34058268 11.32577188 12.26151356 TRUE TRUE TRUE 59194 60923 61167 63 69 75 Ohio Department of Rehabilitation and Correction/NCRP
39085 Lake County OH 15.35784207 13.23845772 11.77856302 TRUE TRUE TRUE 228203 229634 229230 353 304 270 Ohio Department of Rehabilitation and Correction/NCRP
39087 Lawrence County OH 22.95013561 42.31402823 35.2141246 TRUE TRUE TRUE 62798 61918 61623 143 262 217 Ohio Department of Rehabilitation and Correction/NCRP
39089 Licking County OH 19.09436447 18.99075981 20.48527068 TRUE TRUE TRUE 160263 168503 169390 319 320 347 Ohio Department of Rehabilitation and Correction/NCRP
39091 Logan County OH 21.23560576 14.29639731 15.16250247 TRUE TRUE TRUE 45902 45466 45507 97 65 69 Ohio Department of Rehabilitation and Correction/NCRP
39093 Lorain County OH 26.31578947 13.36607196 13.41152339 TRUE TRUE TRUE 297259 303006 304216 794 405 408 Ohio Department of Rehabilitation and Correction/NCRP
39095 Lucas County OH 23.00283724 15.95685011 14.8637907 TRUE TRUE TRUE 446769 436803 435286 1011 697 647 Ohio Department of Rehabilitation and Correction/NCRP
39097 Madison County OH 13.88214063 15.25235718 15.93879503 TRUE TRUE TRUE 41865 43272 43918 60 66 70 Ohio Department of Rehabilitation and Correction/NCRP
39099 Mahoning County OH 20.08159201 19.62993309 16.29474623 TRUE TRUE TRUE 246112 234336 233204 476 460 380 Ohio Department of Rehabilitation and Correction/NCRP
39101 Marion County OH 49.30416296 35.04779244 39.8660986 TRUE TRUE TRUE 66345 65910 65720 327 231 262 Ohio Department of Rehabilitation and Correction/NCRP
39103 Medina County OH 14.02581211 10.46958671 11.13452897 TRUE TRUE TRUE 167298 174792 176029 243 183 196 Ohio Department of Rehabilitation and Correction/NCRP
39105 Meigs County OH 13.9481804 41.75543247 24.43101453 TRUE TRUE TRUE 23586 23470 23331 33 98 57 Ohio Department of Rehabilitation and Correction/NCRP
39107 Mercer County OH 11.5165029 13.50554955 12.98033357 TRUE TRUE TRUE 41063 40724 40831 47 55 53 Ohio Department of Rehabilitation and Correction/NCRP
39109 Miami County OH 24.01158778 21.37000077 19.34552454 TRUE TRUE TRUE 102028 103416 103900 247 221 201 Ohio Department of Rehabilitation and Correction/NCRP
39111 Monroe County OH 15.02116619 6.163961373 26.27030764 TRUE TRUE TRUE 14818 14601 14465 22 9 38 Ohio Department of Rehabilitation and Correction/NCRP
39113 Montgomery County OH 28.70815181 20.08362567 20.85849984 TRUE TRUE TRUE 543620 534764 533116 1540 1074 1112 Ohio Department of Rehabilitation and Correction/NCRP
39115 Morgan County OH 7.995735608 10.02204851 14.14808327 TRUE TRUE TRUE 15189 14967 14843 12 15 21 Ohio Department of Rehabilitation and Correction/NCRP
39117 Morrow County OH 8.015573113 8.276728124 11.94811106 TRUE TRUE TRUE 34561 35038 35152 28 29 42 Ohio Department of Rehabilitation and Correction/NCRP
39119 Muskingum County OH 34.23700391 20.8877894 21.55724906 TRUE TRUE TRUE 86023 85696 85818 294 179 185 Ohio Department of Rehabilitation and Correction/NCRP
39121 Noble County OH 12.97902862 14.44192284 13.92466755 TRUE TRUE TRUE 14616 14541 14363 19 21 20 Ohio Department of Rehabilitation and Correction/NCRP
39123 Ottawa County OH 7.976409166 5.83090379 8.74763085 TRUE TRUE TRUE 41641 41160 41154 33 24 36 Ohio Department of Rehabilitation and Correction/NCRP
39125 Paulding County OH 28.80510262 24.4868188 25.27779241 TRUE TRUE TRUE 19748 19194 18989 56 47 48 Ohio Department of Rehabilitation and Correction/NCRP
39127 Perry County OH 13.31447117 23.93409774 17.31263264 TRUE TRUE TRUE 35430 35932 35812 48 86 62 Ohio Department of Rehabilitation and Correction/NCRP
39129 Pickaway County OH 26.63139645 31.70049233 31.99943737 TRUE TRUE TRUE 54094 56466 56876 149 179 182 Ohio Department of Rehabilitation and Correction/NCRP
39131 Pike County OH 8.04561514 16.20174697 10.61721404 TRUE TRUE TRUE 28590 28392 28256 23 46 30 Ohio Department of Rehabilitation and Correction/NCRP
39133 Portage County OH 9.731496386 13.93853416 11.48985063 TRUE TRUE TRUE 157773 161423 161882 159 225 186 Ohio Department of Rehabilitation and Correction/NCRP
39135 Preble County OH 18.31153389 21.32860429 13.94700139 TRUE TRUE TRUE 42651 41728 41586 77 89 58 Ohio Department of Rehabilitation and Correction/NCRP
39137 Putnam County OH 15.14313172 12.31743797 7.901436891 TRUE TRUE TRUE 34781 34098 34171 52 42 27 Ohio Department of Rehabilitation and Correction/NCRP
39139 Richland County OH 26.6640732 30.01013967 34.68862246 TRUE TRUE TRUE 127292 122292 121942 329 367 423 Ohio Department of Rehabilitation and Correction/NCRP
39141 Ross County OH 17.09467623 30.76366269 31.62301222 TRUE TRUE TRUE 76639 77364 77159 133 238 244 Ohio Department of Rehabilitation and Correction/NCRP
39143 Sandusky County OH 21.61038618 11.46179402 11.13345187 TRUE TRUE TRUE 61745 60200 60179 131 69 67 Ohio Department of Rehabilitation and Correction/NCRP
39145 Scioto County OH 52.4369237 39.47553926 44.00838748 TRUE TRUE TRUE 78285 78023 77258 414 308 340 Ohio Department of Rehabilitation and Correction/NCRP
39147 Seneca County OH 23.76897971 21.34299448 23.17268138 TRUE TRUE TRUE 57406 55756 55669 134 119 129 Ohio Department of Rehabilitation and Correction/NCRP
39149 Shelby County OH 24.94068982 19.13992507 31.25574554 TRUE TRUE TRUE 49099 49112 48951 123 94 153 Ohio Department of Rehabilitation and Correction/NCRP
39151 Stark County OH 28.53352089 20.14807234 21.23831626 TRUE TRUE TRUE 376180 375222 375736 1071 756 798 Ohio Department of Rehabilitation and Correction/NCRP
39153 Summit County OH 31.11198097 22.81339346 21.4413693 TRUE TRUE TRUE 544660 541787 541943 1685 1236 1162 Ohio Department of Rehabilitation and Correction/NCRP
39155 Trumbull County OH 13.98521016 15.98217745 15.45022542 TRUE TRUE TRUE 216185 206480 205175 292 330 317 Ohio Department of Rehabilitation and Correction/NCRP
39157 Tuscarawas County OH 11.88829327 5.928832451 6.789671078 TRUE TRUE TRUE 92271 92767 92788 110 55 63 Ohio Department of Rehabilitation and Correction/NCRP
39159 Union County OH 23.3471898 9.179467966 10.59952395 TRUE TRUE TRUE 48589 53380 53776 123 49 57 Ohio Department of Rehabilitation and Correction/NCRP
39161 Van Wert County OH 23.70576957 16.14374956 18.62131965 TRUE TRUE TRUE 29342 28494 28462 68 46 53 Ohio Department of Rehabilitation and Correction/NCRP
39163 Vinton County OH 38.90759446 19.52978292 34.75895421 TRUE TRUE TRUE 13516 13313 13234 52 26 46 Ohio Department of Rehabilitation and Correction/NCRP
39165 Warren County OH 15.93318283 13.57148713 9.699583595 TRUE TRUE TRUE 200630 219578 221659 343 298 215 Ohio Department of Rehabilitation and Correction/NCRP
39167 Washington County OH 20.94155844 15.31119183 15.0294872 TRUE TRUE TRUE 62387 61393 61213 129 94 92 Ohio Department of Rehabilitation and Correction/NCRP
39169 Wayne County OH 8.453159041 6.600430765 10.47283554 TRUE TRUE TRUE 114263 115144 115537 97 76 121 Ohio Department of Rehabilitation and Correction/NCRP
39171 Williams County OH 18.60564017 19.74122983 18.7712853 TRUE TRUE TRUE 38547 37485 37291 70 74 70 Ohio Department of Rehabilitation and Correction/NCRP
39173 Wood County OH 12.0950324 16.25273781 16.05062119 TRUE TRUE TRUE 125027 129209 129590 154 210 208 Ohio Department of Rehabilitation and Correction/NCRP
39175 Wyandot County OH 14.17057834 16.44663733 25.05256565 TRUE TRUE TRUE 22729 22497 22353 32 37 56 Ohio Department of Rehabilitation and Correction/NCRP
40001 Adair County OK 3.121237794 12.14301776 17.12791851 TRUE TRUE TRUE 22215 22235 22186 7 27 38 NCRP
40003 Alfalfa County OK 8.812125485 NA 10.3626943 TRUE TRUE 5639 5817 5790 5 NA 6 NCRP
40005 Atoka County OK 27.71855011 16.68480232 34.79269353 TRUE TRUE TRUE 14013 13785 13796 39 23 48 NCRP
40007 Beaver County OK 33.89830508 28.88086643 41.92489974 TRUE TRUE TRUE 5514 5540 5486 19 16 23 NCRP
40009 Beckham County OK 47.10543694 34.82249023 45.58693175 TRUE TRUE TRUE 20040 23548 23691 107 82 108 NCRP
40011 Blaine County OK 36.28162385 25.46084123 49.41010386 TRUE TRUE TRUE 11965 9819 9917 37 25 49 NCRP
40013 Bryan County OK 21.35611319 17.41411674 31.24578519 TRUE TRUE TRUE 39739 44217 44486 92 77 139 NCRP
40015 Caddo County OK 24.32021618 16.95662495 42.97847665 TRUE TRUE TRUE 29087 29487 29317 72 50 126 NCRP
40017 Canadian County OK 9.11782912 11.49552864 11.57568181 TRUE TRUE TRUE 102876 126136 129582 109 145 150 NCRP
40019 Carter County OK 24.21509686 23.22474566 37.68869954 TRUE TRUE TRUE 46430 48655 48821 116 113 184 NCRP
40021 Cherokee County OK 7.370283019 11.0478811 15.30791668 TRUE TRUE TRUE 45517 47973 48341 35 53 74 NCRP
40023 Choctaw County OK 29.66967759 39.14543524 31.00059363 TRUE TRUE TRUE 15277 15072 15161 45 59 47 NCRP
40025 Cimarron County OK 45.23026316 NA 34.87358326 TRUE TRUE 2572 2330 2294 11 NA 8 NCRP
40027 Cleveland County OK 4.865024306 7.262217941 15.59790744 TRUE TRUE TRUE 237257 269890 269908 127 196 421 NCRP
40029 Coal County OK 40.49266071 18.91009111 17.22059583 TRUE TRUE TRUE 5671 5817 5807 24 11 10 NCRP
40031 Comanche County OK 23.99852317 26.55256528 22.79398239 TRUE TRUE TRUE 116653 125035 125033 299 332 285 NCRP
40033 Cotton County OK 48.65390853 42.25581017 53.65853659 TRUE TRUE TRUE 6327 6153 6150 30 26 33 NCRP
40035 Craig County OK 4.70778129 19.0917769 29.48841037 TRUE TRUE TRUE 14881 14666 14582 7 28 43 NCRP
40037 Creek County OK 18.2216781 27.01632295 43.18156077 TRUE TRUE TRUE 67791 70698 70632 128 191 305 NCRP
40039 Custer County OK 43.78470739 31.74603175 49.83050847 TRUE TRUE TRUE 26148 29295 29500 123 93 147 NCRP
40041 Delaware County OK 21.74228149 29.97268618 28.95333687 TRUE TRUE TRUE 40266 41371 41446 90 124 120 NCRP
40043 Dewey County OK NA NA NA 4621 4817 4914 NA NA NA NCRP
40045 Ellis County OK NA NA 12.04819277 TRUE 3898 4140 4150 NA NA 5 NCRP
40047 Garfield County OK 24.93601942 34.71500104 52.62240256 TRUE TRUE TRUE 57723 62509 63091 152 217 332 NCRP
40049 Garvin County OK 6.56694637 13.88077148 18.14157687 TRUE TRUE TRUE 27249 27376 27561 18 38 50 NCRP
40051 Grady County OK 25.16318229 24.23790435 38.62294351 TRUE TRUE TRUE 50462 53635 53854 133 130 208 NCRP
40053 Grant County OK 13.26846528 17.69520018 17.77382804 TRUE TRUE TRUE 4645 4521 4501 6 8 8 NCRP
40055 Greer County OK 45.32211072 55.17689062 63.4043245 TRUE TRUE TRUE 6048 6162 6151 28 34 39 NCRP
40057 Harmon County OK 41.46510021 41.82642036 28.59185132 TRUE TRUE TRUE 2915 2869 2798 12 12 8 NCRP
40059 Harper County OK NA 18.26245761 41.97271773 TRUE TRUE 3527 3833 3812 NA 7 16 NCRP
40061 Haskell County OK 21.79157911 20.81727062 46.52605459 TRUE TRUE TRUE 12329 12970 12896 28 27 60 NCRP
40063 Hughes County OK 28.18326348 32.73679616 42.73504274 TRUE TRUE TRUE 13450 13746 13806 39 45 59 NCRP
40065 Jackson County OK 31.58295282 24.78645516 56.92745596 TRUE TRUE TRUE 26805 26224 25998 83 65 148 NCRP
40067 Jefferson County OK 48.00991172 37.74771941 30.19707565 TRUE TRUE TRUE 6418 6358 6292 31 24 19 NCRP
40069 Johnston County OK 20.94336186 10.88336659 28.82103936 TRUE TRUE TRUE 10709 11026 11103 23 12 32 NCRP
40071 Kay County OK 17.34530159 14.93094438 26.38638463 TRUE TRUE TRUE 46220 45543 45478 80 68 120 NCRP
40073 Kingfisher County OK 14.59950893 15.01109516 32.83543652 TRUE TRUE TRUE 14464 15322 15532 22 23 51 NCRP
40075 Kiowa County OK 34.08243689 23.46416382 40.70265638 TRUE TRUE TRUE 9756 9376 9336 32 22 38 NCRP
40077 Latimer County OK 17.21950335 13.06213846 12.15748621 TRUE TRUE TRUE 10841 10718 10693 19 14 13 NCRP
40079 Le Flore County OK 10.58687228 24.47489317 30.74697052 TRUE TRUE TRUE 49209 49847 49761 53 122 153 NCRP
40081 Lincoln County OK 18.69268065 20.384985 21.37554522 TRUE TRUE TRUE 33441 34339 34619 64 70 74 NCRP
40083 Logan County OK 11.89615358 14.63930993 14.35639191 TRUE TRUE TRUE 37060 44401 45276 51 65 65 NCRP
40085 Love County OK 21.06149958 26.76824874 32.74327228 TRUE TRUE TRUE 9207 9713 9773 20 26 32 NCRP
40087 McClain County OK 5.973545726 10.95410231 16.34818964 TRUE TRUE TRUE 31419 36516 37313 21 40 61 NCRP
40089 McCurtain County OK 22.02576713 28.39021444 48.41149773 TRUE TRUE TRUE 33198 33110 33050 73 94 160 NCRP
40091 McIntosh County OK 29.96365065 21.98124267 22.40143369 TRUE TRUE TRUE 19730 20472 20088 61 45 45 NCRP
40093 Major County OK 7.890583903 9.122898475 6.451612903 TRUE TRUE TRUE 7449 7673 7750 6 7 5 NCRP
40095 Marshall County OK 15.13240858 25.64262931 38.93214683 TRUE TRUE TRUE 14988 15989 16182 24 41 63 NCRP
40097 Mayes County OK 10.94624179 23.46729246 30.38024304 TRUE TRUE TRUE 40107 40908 40816 45 96 124 NCRP
40099 Murray County OK 10.31611525 43.03742067 36.94848946 TRUE TRUE TRUE 12969 13709 13803 14 59 51 NCRP
40101 Muskogee County OK 20.52167513 17.21954205 30.01457851 TRUE TRUE TRUE 69958 70269 69966 145 121 210 NCRP
40103 Noble County OK 11.27591292 4.394059232 6.090133983 TRUE TRUE TRUE 11462 11379 11494 13 5 7 NCRP
40105 Nowata County OK 16.06805293 25.61912895 19.00418092 TRUE TRUE TRUE 10705 10539 10524 17 27 20 NCRP
40107 Okfuskee County OK 16.30257581 30.91693109 27.90086985 TRUE TRUE TRUE 11895 12291 12186 20 38 34 NCRP
40109 Oklahoma County OK 31.90742476 25.15655023 29.18240964 TRUE TRUE TRUE 690153 755668 766215 2336 1901 2236 NCRP
40111 Okmulgee County OK 12.32797444 38.27532889 61.13313723 TRUE TRUE TRUE 39426 39451 39095 49 151 239 NCRP
40113 Osage County OK 3.765690377 19.19706201 25.84356308 TRUE TRUE TRUE 46576 47924 47981 18 92 124 NCRP
40115 Ottawa County OK 34.96830997 43.99008674 51.70534185 TRUE TRUE TRUE 32971 32280 32105 112 142 166 NCRP
40117 Pawnee County OK 10.24590164 13.91662129 38.41229193 TRUE TRUE TRUE 16625 16527 16401 17 23 63 NCRP
40119 Payne County OK 10.26997189 7.425399902 14.95066281 TRUE TRUE TRUE 74964 79457 80264 80 59 120 NCRP
40121 Pittsburg County OK 27.08237004 16.93668799 25.54564604 TRUE TRUE TRUE 44831 44873 44626 123 76 114 NCRP
40123 Pontotoc County OK 17.77188329 32.30635884 36.57413498 TRUE TRUE TRUE 35525 38073 38005 67 123 139 NCRP
40125 Pottawatomie County OK 26.37431569 24.02022756 34.39584465 TRUE TRUE TRUE 67696 71190 71811 185 171 247 NCRP
40127 Pushmataha County OK 21.04155708 12.46327784 18.87640449 TRUE TRUE TRUE 11389 11233 11125 24 14 21 NCRP
40129 Roger Mills County OK 18.85267977 45.44239508 53.17734645 TRUE TRUE TRUE 3387 3741 3761 7 17 20 NCRP
40131 Rogers County OK 18.57973327 10.98864133 22.49067528 TRUE TRUE TRUE 82234 89183 89815 163 98 202 NCRP
40133 Seminole County OK 31.442833 39.25262993 49.17194446 TRUE TRUE TRUE 24997 25476 25421 80 100 125 NCRP
40135 Sequoyah County OK 7.410240474 10.65194761 16.20000967 TRUE TRUE TRUE 41248 41307 41358 31 44 67 NCRP
40137 Stephens County OK 31.38284849 37.79709629 48.99647136 TRUE TRUE TRUE 43670 44977 44493 141 170 218 NCRP
40139 Texas County OK 45.84770998 28.99469941 43.92989521 TRUE TRUE TRUE 19361 22073 21853 97 64 96 NCRP
40141 Tillman County OK 13.9275766 32.54784533 22.28631358 TRUE TRUE TRUE 8394 7681 7628 11 25 17 NCRP
40143 Tulsa County OK 29.46145897 28.31615209 26.81075861 TRUE TRUE TRUE 575014 622966 629598 1796 1764 1688 NCRP
40145 Wagoner County OK 5.669776044 8.853650479 7.793717471 TRUE TRUE TRUE 66345 75675 75702 42 67 59 NCRP
40147 Washington County OK 14.61162306 23.07677391 30.22893121 TRUE TRUE TRUE 49216 51567 51937 75 119 157 NCRP
40149 Washita County OK 18.91496862 16.21575489 30.31090326 TRUE TRUE TRUE 11422 11717 11547 22 19 35 NCRP
40151 Woods County OK 10.17064075 14.42041043 13.99655469 TRUE TRUE TRUE 8550 9015 9288 9 13 13 NCRP
40153 Woodward County OK 14.64629205 20.73027091 20.90203911 TRUE TRUE TRUE 19341 21225 21529 30 44 45 NCRP
41001 Baker County OR NA 11.18290258 11.20866804 TRUE TRUE 16094 16096 16059 NA 18 18 NCRP
41003 Benton County OR 7.559106397 7.096323872 6.60364243 TRUE TRUE TRUE 81957 85960 86316 65 61 57 NCRP
41005 Clackamas County OR 9.250207604 9.499120881 9.215843148 TRUE TRUE TRUE 363508 388457 394972 352 369 364 NCRP
41007 Clatsop County OR 14.80205614 19.6654185 19.21332124 TRUE TRUE TRUE 36603 37121 37474 55 73 72 NCRP
41009 Columbia County OR 11.55413212 9.744807845 5.054691765 TRUE TRUE TRUE 48184 49257 49459 57 48 25 NCRP
41011 Coos County OR 9.242586012 12.49339292 14.08563425 TRUE TRUE TRUE 63844 62433 62475 58 78 88 NCRP
41013 Crook County OR 10.52933857 18.75901876 8.096009144 TRUE TRUE TRUE 21673 20790 20998 22 39 17 NCRP
41015 Curry County OR 12.52180135 11.21126508 8.95455563 TRUE TRUE TRUE 22626 22299 22335 28 25 20 NCRP
41017 Deschutes County OR 12.76741507 10.66554186 12.79432824 TRUE TRUE TRUE 148149 165955 170388 205 177 218 NCRP
41019 Douglas County OR 8.482001379 14.88624661 12.43316008 TRUE TRUE TRUE 106658 106810 106972 91 159 133 NCRP
41021 Gilliam County OR 26.10966057 NA NA TRUE 1834 1938 1932 5 NA NA NCRP
41023 Grant County OR 6.794401413 9.624639076 NA TRUE TRUE 7373 7273 7180 5 7 NA NCRP
41025 Harney County OR 13.67240908 9.787472036 12.62980634 TRUE TRUE TRUE 7286 7152 7126 10 7 9 NCRP
41027 Hood River County OR 7.580148928 4.403152657 4.369674459 TRUE TRUE TRUE 21200 22711 22885 17 10 10 NCRP
41029 Jackson County OR 11.21311252 9.995626913 9.510811415 TRUE TRUE TRUE 196858 208091 210287 230 208 200 NCRP
41031 Jefferson County OR 14.91076837 11.91185229 19.37635184 TRUE TRUE TRUE 21113 21827 22192 32 26 43 NCRP
41033 Josephine County OR 11.95897708 21.49607907 16.26813718 TRUE TRUE TRUE 81601 83271 83599 99 179 136 NCRP
41035 Klamath County OR 14.95219828 18.37565302 20.47208005 TRUE TRUE TRUE 66294 65848 65455 99 121 134 NCRP
41037 Lake County OR 22.89493767 14.03598316 11.48252105 TRUE TRUE TRUE 7796 7837 7838 18 11 9 NCRP
41039 Lane County OR 15.36580811 14.48008075 14.73473295 TRUE TRUE TRUE 339926 355661 358337 543 515 528 NCRP
41041 Lincoln County OR 19.31842848 17.71058315 17.23915011 TRUE TRUE TRUE 45529 46300 46406 89 82 80 NCRP
41043 Linn County OR 16.23487012 17.9528674 18.51603606 TRUE TRUE TRUE 110764 118644 119356 191 213 221 NCRP
41045 Malheur County OR 18.12415043 14.69435737 12.18748971 TRUE TRUE TRUE 31303 30624 30359 56 45 37 NCRP
41047 Marion County OR 22.10770598 20.45135742 21.2504983 TRUE TRUE TRUE 303290 322228 326110 704 659 693 NCRP
41049 Morrow County OR 5.348546978 7.988638381 8.938946992 TRUE TRUE TRUE 11203 11266 11187 6 9 10 NCRP
41051 Multnomah County OR 15.14095669 13.48419621 11.60018128 TRUE TRUE TRUE 683767 766082 776712 1132 1033 901 NCRP
41053 Polk County OR 8.165415514 7.700540343 6.673853894 TRUE TRUE TRUE 71027 76618 77916 62 59 52 NCRP
41055 Sherman County OR NA 29.10360885 NA TRUE 1682 1718 1710 NA 5 NA NCRP
41057 Tillamook County OR 8.300395257 9.07906683 7.497435088 TRUE TRUE TRUE 25160 25333 25342 21 23 19 NCRP
41059 Umatilla County OR 10.22200089 13.13940782 12.38511179 TRUE TRUE TRUE 73984 76868 76705 78 101 95 NCRP
41061 Union County OR 7.381220621 16.05387838 10.50951695 TRUE TRUE TRUE 24754 25539 25691 19 41 27 NCRP
41063 Wallowa County OR 7.221259388 8.817046289 NA TRUE TRUE 6835 6805 6820 5 6 NA NCRP
41065 Wasco County OR 9.49329536 11.38370952 15.67705271 TRUE TRUE TRUE 24159 25475 25515 24 29 40 NCRP
41067 Washington County OR 9.080665965 8.838136107 9.005360587 TRUE TRUE TRUE 502226 555547 562998 490 491 507 NCRP
41069 Wheeler County OR NA NA NA 1425 1397 1375 NA NA NA NCRP
41071 Yamhill County OR 9.318450532 8.131935698 11.104778 TRUE TRUE TRUE 93198 100837 101758 93 82 113 NCRP
42001 Adams County PA 9.655552928 24.44385306 21.62927424 TRUE TRUE TRUE 99899 101457 101714 98 248 220 NCRP
42003 Allegheny County PA 10.17170457 11.10342406 11.18371093 TRUE TRUE TRUE 1226025 1232953 1231255 1248 1369 1377 NCRP
42005 Armstrong County PA 5.53822835 10.13067097 6.196061075 TRUE TRUE TRUE 70030 68110 67785 38 69 42 NCRP
42007 Beaver County PA 7.160380791 9.467246854 8.678095778 TRUE TRUE TRUE 173259 170060 169392 122 161 147 NCRP
42009 Bedford County PA 8.688623964 26.86585391 19.40914477 TRUE TRUE TRUE 49871 49133 48946 43 132 95 NCRP
42011 Berks County PA 22.5928101 20.52449885 18.20199134 TRUE TRUE TRUE 401834 413652 413691 931 849 753 NCRP
42013 Blair County PA 11.02883252 24.45026468 19.37199794 TRUE TRUE TRUE 127002 126379 125955 140 309 244 NCRP
42015 Bradford County PA 14.85053654 27.42318301 22.17402564 TRUE TRUE TRUE 62345 62356 61784 93 171 137 NCRP
42017 Bucks County PA 4.632758073 9.210543119 9.478446109 TRUE TRUE TRUE 619544 626456 626685 290 577 594 NCRP
42019 Butler County PA 7.261495109 10.843237 7.74430874 TRUE TRUE TRUE 181009 185369 185943 134 201 144 NCRP
42021 Cambria County PA 9.055936201 11.15910727 11.76197253 TRUE TRUE TRUE 146093 138900 137732 129 155 162 NCRP
42023 Cameron County PA 10 12.25991009 18.73048907 TRUE TRUE TRUE 5341 4894 4805 5 6 9 NCRP
42025 Carbon County PA 5.224820973 9.429587262 11.17301097 TRUE TRUE TRUE 63105 64690 64441 34 61 72 NCRP
42027 Centre County PA 3.625534119 7.15883102 8.00040317 TRUE TRUE TRUE 148734 157847 158742 56 113 127 NCRP
42029 Chester County PA 7.792078716 8.714425908 7.937065119 TRUE TRUE TRUE 479137 509500 512784 392 444 407 NCRP
42031 Clarion County PA 9.566968781 10.99969303 14.68277479 TRUE TRUE TRUE 40615 39092 38821 38 43 57 NCRP
42033 Clearfield County PA 22.566719 25.37106718 25.24910396 TRUE TRUE TRUE 82461 81589 81191 184 207 205 NCRP
42035 Clinton County PA 10.12632592 16.81980218 13.08340672 TRUE TRUE TRUE 38730 39834 39745 40 67 52 NCRP
42037 Columbia County PA 7.311141284 12.66030176 9.981824141 TRUE TRUE TRUE 65882 67139 67122 49 85 67 NCRP
42039 Crawford County PA 10.20720629 16.13069293 18.58330944 TRUE TRUE TRUE 89496 87411 87175 90 141 162 NCRP
42041 Cumberland County PA 4.969488185 8.330984631 7.179133745 TRUE TRUE TRUE 226835 241268 243762 118 201 175 NCRP
42043 Dauphin County PA 32.04044083 32.5071859 29.87625851 TRUE TRUE TRUE 260312 271017 271453 862 881 811 NCRP
42045 Delaware County PA 11.71907798 19.82756779 17.49680261 TRUE TRUE TRUE 553806 561844 562960 656 1114 985 NCRP
42047 Elk County PA 7.547407151 5.722460658 12.82297878 TRUE TRUE TRUE 33006 31455 31194 24 18 40 NCRP
42049 Erie County PA 21.85243015 20.76780097 20.32732013 TRUE TRUE TRUE 278389 279760 278443 613 581 566 NCRP
42051 Fayette County PA 23.65125418 31.89934643 29.38412661 TRUE TRUE TRUE 141165 134799 134086 322 430 394 NCRP
42053 Forest County PA 14.29313929 NA 13.30140995 TRUE TRUE 7519 7602 7518 11 NA 10 NCRP
42055 Franklin County PA 13.87837497 21.42045193 18.96763729 TRUE TRUE TRUE 142421 152191 152892 209 326 290 NCRP
42057 Fulton County PA 23.68225184 25.18034572 23.92017496 TRUE TRUE TRUE 14714 14694 14632 35 37 35 NCRP
42059 Greene County PA 10.42698504 17.42252257 17.70472743 TRUE TRUE TRUE 39342 37882 37843 40 66 67 NCRP
42061 Huntingdon County PA 6.975628897 17.87621809 10.27322404 TRUE TRUE TRUE 45684 45871 45750 32 82 47 NCRP
42063 Indiana County PA 8.257544907 8.612288376 9.235400087 TRUE TRUE TRUE 88716 88246 87706 73 76 81 NCRP
42065 Jefferson County PA 20.4376319 48.24688174 43.6847529 TRUE TRUE TRUE 45323 44977 44638 92 217 195 NCRP
42067 Juniata County PA 7.276549299 13.31181928 6.452653654 TRUE TRUE TRUE 24107 24790 24796 18 33 16 NCRP
42069 Lackawanna County PA 18.48092405 43.7255067 36.7621134 TRUE TRUE TRUE 212595 213834 212719 396 935 782 NCRP
42071 Lancaster County PA 8.159661842 14.16655034 14.23160579 TRUE TRUE TRUE 500922 530122 533320 427 751 759 NCRP
42073 Lawrence County PA 13.27815522 17.80395494 15.88356558 TRUE TRUE TRUE 92248 89306 88771 120 159 141 NCRP
42075 Lebanon County PA 17.1860934 20.92743926 18.04061338 TRUE TRUE TRUE 128302 135707 136359 231 284 246 NCRP
42077 Lehigh County PA 13.32129021 19.73196015 18.44487358 TRUE TRUE TRUE 336794 355768 357823 469 702 660 NCRP
42079 Luzerne County PA 10.72228958 11.97391375 13.48685345 TRUE TRUE TRUE 316837 319862 318829 344 383 430 NCRP
42081 Lycoming County PA 24.87050187 29.81187678 31.3283208 TRUE TRUE TRUE 116983 116732 116508 290 348 365 NCRP
42083 McKean County PA 9.008176653 24.53959054 27.25948207 TRUE TRUE TRUE 44309 42788 42554 39 105 116 NCRP
42085 Mercer County PA 13.52760234 17.43081873 12.96960412 TRUE TRUE TRUE 118123 115313 114884 157 201 149 NCRP
42087 Mifflin County PA 8.137393464 19.05740776 13.53325314 TRUE TRUE TRUE 46435 46701 46552 38 89 63 NCRP
42089 Monroe County PA 34.09353229 51.75611799 42.02893322 TRUE TRUE TRUE 165185 167130 166314 576 865 699 NCRP
42091 Montgomery County PA 1.416816116 4.81671893 3.990906609 TRUE TRUE TRUE 781519 813832 816857 114 392 326 NCRP
42093 Montour County PA 9.249687143 15.64607499 16.63000912 TRUE TRUE TRUE 18114 18535 18641 17 29 31 NCRP
42095 Northampton County PA 11.59365901 15.47972123 14.66802371 TRUE TRUE TRUE 289628 299747 300654 346 464 441 NCRP
42097 Northumberland County PA 14.08241921 18.695957 14.37026314 TRUE TRUE TRUE 93475 94138 93944 133 176 135 NCRP
42099 Perry County PA 8.732099197 18.85096776 13.58636105 TRUE TRUE TRUE 45121 45621 45634 40 86 62 NCRP
42101 Philadelphia County PA 31.24219108 30.59023734 25.37337443 TRUE TRUE TRUE 1488710 1556052 1560297 4801 4760 3959 NCRP
42103 Pike County PA 6.121128386 23.66905712 19.39812425 TRUE TRUE TRUE 55601 56614 56191 35 134 109 NCRP
42105 Potter County PA 3.431120261 20.01029101 17.43577822 TRUE TRUE TRUE 17944 17491 17206 6 35 30 NCRP
42107 Schuylkill County PA 7.853757617 15.05470102 14.33500003 TRUE TRUE TRUE 148005 146798 145797 116 221 209 NCRP
42109 Snyder County PA 22.66374556 20.70186816 21.07978077 TRUE TRUE TRUE 38946 40093 40323 90 83 85 NCRP
42111 Somerset County PA 14.48132297 17.33531451 18.10595922 TRUE TRUE TRUE 78834 76722 76218 112 133 138 NCRP
42113 Sullivan County PA 15.57875058 20.46599496 12.62028711 TRUE TRUE TRUE 6487 6352 6339 10 13 8 NCRP
42115 Susquehanna County PA 7.450870821 11.57462087 8.58778626 TRUE TRUE TRUE 43376 42334 41920 32 49 36 NCRP
42117 Tioga County PA 6.38796224 15.54477366 11.35449685 TRUE TRUE TRUE 41347 42458 42274 27 66 48 NCRP
42119 Union County PA 16.2467729 17.88948769 19.83331105 TRUE TRUE TRUE 44666 44719 44874 73 80 89 NCRP
42121 Venango County PA 30.77486719 28.01068487 23.5386426 TRUE TRUE TRUE 55761 53908 53529 168 151 126 NCRP
42123 Warren County PA 14.72398561 24.667839 28.49912783 TRUE TRUE TRUE 41972 40944 40703 61 101 116 NCRP
42125 Washington County PA 5.912125625 12.05606309 11.72023229 TRUE TRUE TRUE 205992 208194 208187 123 251 244 NCRP
42127 Wayne County PA 18.00352409 20.32953203 15.95299702 TRUE TRUE TRUE 52031 51649 51401 94 105 82 NCRP
42129 Westmoreland County PA 6.014996292 8.474576271 7.903818323 TRUE TRUE TRUE 366559 361080 359320 219 306 284 NCRP
42131 Wyoming County PA 14.19597544 39.0874849 25.59453983 TRUE TRUE TRUE 28194 28142 28131 40 110 72 NCRP
42133 York County PA 16.84470102 16.77313931 16.31291761 TRUE TRUE TRUE 418043 439393 440755 735 737 719 NCRP
44001 Bristol County RI NA NA NA 50996 49263 49060 NA NA NA NCRP
44003 Kent County RI NA NA NA FALSE FALSE FALSE 168522 164923 165128 NA NA NA NCRP
44005 Newport County RI NA NA NA FALSE FALSE FALSE 85130 82457 82358 NA NA NA NCRP
44007 Providence County RI NA NA NA FALSE FALSE FALSE 631691 630171 631974 NA NA NA NCRP
44009 Washington County RI NA NA NA FALSE FALSE FALSE 126757 126540 126653 NA NA NA NCRP
45001 Abbeville County SC 18.62640193 11.59628919 11.61626277 TRUE TRUE TRUE 25821 25008 24965 47 29 29 NCRP
45003 Aiken County SC 14.84138272 14.6079589 11.59311211 TRUE TRUE TRUE 152577 164294 164753 240 240 191 NCRP
45005 Allendale County SC 20.56001566 19.34432906 10.31459515 TRUE TRUE TRUE 10882 9822 9695 21 19 10 NCRP
45007 Anderson County SC 25.41383701 7.8111075 10.26917691 TRUE TRUE TRUE 178579 190754 192810 479 149 198 NCRP
45009 Bamberg County SC 13.27937271 18.13471503 14.49084442 TRUE TRUE TRUE 16392 15440 15182 21 28 22 NCRP
45011 Barnwell County SC 26.34046163 19.40083018 15.48340088 TRUE TRUE TRUE 22886 22164 21959 59 43 34 NCRP
45013 Beaufort County SC 9.192399337 7.751983167 6.255260105 TRUE TRUE TRUE 147213 171569 175852 152 133 110 NCRP
45015 Berkeley County SC 11.01070696 8.561952951 8.274261497 TRUE TRUE TRUE 159501 193881 198205 203 166 164 NCRP
45017 Calhoun County SC 18.53200079 10.61148693 10.08200027 TRUE TRUE TRUE 15229 15078 14878 28 16 15 NCRP
45019 Charleston County SC 24.55844967 13.40795306 12.67666627 TRUE TRUE TRUE 334826 372913 381015 881 500 483 NCRP
45021 Cherokee County SC 26.26513393 34.98197083 31.05811795 TRUE TRUE TRUE 54166 55743 56024 146 195 174 NCRP
45023 Chester County SC 16.42385717 11.96282323 13.91594768 TRUE TRUE TRUE 33222 32601 32337 54 39 45 NCRP
45025 Chesterfield County SC 23.68035822 9.526077638 9.756097561 TRUE TRUE TRUE 45103 46189 46125 110 44 45 NCRP
45027 Clarendon County SC 28.28119589 14.32287861 17.88174596 TRUE TRUE TRUE 34094 34211 34113 98 49 61 NCRP
45029 Colleton County SC 16.12357943 15.85875139 17.20896984 TRUE TRUE TRUE 38608 37834 37771 62 60 65 NCRP
45031 Darlington County SC 21.65452258 10.00794749 7.817224443 TRUE TRUE TRUE 68424 67946 67799 148 68 53 NCRP
45033 Dillon County SC 26.53106345 19.83682611 17.34828284 TRUE TRUE TRUE 31373 31255 31127 84 62 54 NCRP
45035 Dorchester County SC 15.73654168 7.640050383 8.55397423 TRUE TRUE TRUE 120136 145287 148469 220 111 127 NCRP
45037 Edgefield County SC 25.84463256 20.14596321 13.55779008 TRUE TRUE TRUE 26135 26308 26553 69 53 36 NCRP
45039 Fairfield County SC 25.01165798 18.58013222 18.71518106 TRUE TRUE TRUE 24177 23143 22976 59 43 43 NCRP
45041 Florence County SC 24.89209785 26.00517214 22.55244881 TRUE TRUE TRUE 132489 138434 139231 342 360 314 NCRP
45043 Georgetown County SC 29.03118779 19.00198282 16.4546756 TRUE TRUE TRUE 59821 60520 60773 175 115 100 NCRP
45045 Greenville County SC 21.05002207 14.23380983 12.65660215 TRUE TRUE TRUE 415957 474223 482752 968 675 611 NCRP
45047 Greenwood County SC 25.24129821 18.94129633 21.00115075 TRUE TRUE TRUE 68091 69689 69520 176 132 146 NCRP
45049 Hampton County SC 21.59309021 17.65138514 13.23205097 TRUE TRUE TRUE 21104 20395 20405 45 36 27 NCRP
45051 Horry County SC 18.43231365 19.10011847 16.53102747 TRUE TRUE TRUE 242194 289527 298832 510 553 494 NCRP
45053 Jasper County SC 19.67884131 13.47809809 11.04158999 TRUE TRUE TRUE 22406 26710 27170 50 36 30 NCRP
45055 Kershaw County SC 16.31189638 10.86192576 16.4658571 TRUE TRUE TRUE 58060 62604 63161 101 68 104 NCRP
45057 Lancaster County SC 16.93480102 11.42573274 11.54401154 TRUE TRUE TRUE 66992 80520 83160 132 92 96 NCRP
45059 Laurens County SC 26.33281671 18.57809597 18.33676521 TRUE TRUE TRUE 67388 66207 66533 175 123 122 NCRP
45061 Lee County SC 25.93965061 15.75487586 14.71951153 TRUE TRUE TRUE 20001 18407 18343 49 29 27 NCRP
45063 Lexington County SC 19.54421833 14.47347261 13.74654537 TRUE TRUE TRUE 241219 273604 277888 521 396 382 NCRP
45065 McCormick County SC 6.936874443 25.17116391 15.23461304 TRUE TRUE TRUE 10166 9932 9846 7 25 15 NCRP
45067 Marion County SC 38.23214559 23.11560928 21.60774121 TRUE TRUE TRUE 33994 32013 31933 125 74 69 NCRP
45069 Marlboro County SC 32.58356107 20.71502554 13.96648045 TRUE TRUE TRUE 29199 27999 27924 93 58 39 NCRP
45071 Newberry County SC 24.52417764 13.5753833 14.29214197 TRUE TRUE TRUE 36746 37568 37783 92 51 54 NCRP
45073 Oconee County SC 14.10930004 9.344172574 12.76731567 TRUE TRUE TRUE 71490 74913 75192 105 70 96 NCRP
45075 Orangeburg County SC 19.92682608 16.42307608 18.75901876 TRUE TRUE TRUE 91761 90726 90090 183 149 169 NCRP
45077 Pickens County SC 17.91049773 12.58157052 13.79104081 TRUE TRUE TRUE 115570 119222 120368 214 150 166 NCRP
45079 Richland County SC 25.9168403 11.66142656 12.37654582 TRUE TRUE TRUE 357096 397893 401566 1010 464 497 NCRP
45081 Saluda County SC 27.14249812 15.92039801 14.98052532 TRUE TRUE TRUE 19310 20100 20026 54 32 30 NCRP
45083 Spartanburg County SC 24.51279512 26.20195449 25.6522065 TRUE TRUE TRUE 268898 290818 293542 703 762 753 NCRP
45085 Sumter County SC 34.9296298 15.5552675 16.58651396 TRUE TRUE TRUE 105953 108002 107919 376 168 179 NCRP
45087 Union County SC 40.56795132 41.09784862 31.92710575 TRUE TRUE TRUE 29248 27982 27876 116 115 89 NCRP
45089 Williamsburg County SC 25.63045015 16.63339987 17.12800122 TRUE TRUE TRUE 35458 33066 32695 87 55 56 NCRP
45091 York County SC 25.24530818 17.66806591 15.36605447 TRUE TRUE TRUE 197892 239415 245346 583 423 377 NCRP
46003 Aurora County SD 18.36884644 22.07505519 NA TRUE TRUE FALSE 2775 2718 2745 5 6 NA NCRP
46005 Beadle County SD 36.80009058 20.76616209 NA TRUE TRUE FALSE 16149 18299 18169 65 38 NA NCRP
46007 Bennett County SD 40.8044302 31.87481889 NA TRUE TRUE FALSE 3475 3451 3430 14 11 NA NCRP
46009 Bon Homme County SD 11.3507378 7.132667618 NA TRUE TRUE 7174 7010 7023 8 5 NA NCRP
46011 Brookings County SD 26.31986376 13.90274126 NA TRUE TRUE FALSE 30323 33087 33314 85 46 NA NCRP
46013 Brown County SD 31.36661078 32.75509669 NA TRUE TRUE FALSE 35561 38162 38408 116 125 NA NCRP
46015 Brule County SD 15.13431706 16.75353686 NA TRUE TRUE FALSE 4991 5372 5309 8 9 NA NCRP
46017 Buffalo County SD NA NA NA 1973 2033 2077 NA NA NA NCRP
46019 Butte County SD 33.34314014 26.15012107 NA TRUE TRUE FALSE 9517 10325 10298 34 27 NA NCRP
46021 Campbell County SD NA NA NA 1533 1347 1386 NA NA NA NCRP
46023 Charles Mix County SD 38.14298169 43.42633807 NA TRUE TRUE FALSE 9110 9211 9287 35 40 NA NCRP
46025 Clark County SD NA NA NA 3713 3628 3645 NA NA NA NCRP
46027 Clay County SD 22.21744428 11.48023247 NA TRUE TRUE FALSE 13627 13937 13932 31 16 NA NCRP
46029 Codington County SD 36.44447684 12.56506911 NA TRUE TRUE FALSE 26754 27855 27938 100 35 NA NCRP
46031 Corson County SD 12.26091221 NA NA TRUE FALSE 4041 4230 4182 5 NA NA NCRP
46033 Custer County SD 13.24343848 11.8708452 NA TRUE TRUE FALSE 7992 8424 8445 11 10 NA NCRP
46035 Davison County SD 56.05952502 33.7718635 NA TRUE TRUE FALSE 19404 19839 19885 110 67 NA NCRP
46037 Day County SD 24.69571353 16.02278797 NA TRUE TRUE FALSE 5805 5617 5588 14 9 NA NCRP
46039 Deuel County SD NA NA NA 4394 4303 4312 NA NA NA NCRP
46041 Dewey County SD NA NA NA 5537 5606 5662 NA NA NA NCRP
46043 Douglas County SD NA NA NA 3131 3017 2973 NA NA NA NCRP
46045 Edmunds County SD 17.27968403 NA NA TRUE 4043 4035 3983 7 NA NA NCRP
46047 Fall River County SD 39.99428653 24.86470674 NA TRUE TRUE FALSE 7108 6837 6845 28 17 NA NCRP
46049 Faulk County SD NA NA NA 2398 2380 2357 NA NA NA NCRP
46051 Grant County SD 19.15970987 8.231581836 NA TRUE TRUE 7410 7289 7241 14 6 NA NCRP
46053 Gregory County SD 35.31904874 25.9985819 NA TRUE TRUE FALSE 4311 4231 4217 15 11 NA NCRP
46055 Haakon County SD NA NA NA 1984 1888 1847 NA NA NA NCRP
46057 Hamlin County SD NA NA NA 5595 5952 5989 NA NA NA NCRP
46059 Hand County SD NA NA NA 3390 3396 3345 NA NA NA NCRP
46061 Hanson County SD NA NA NA 3414 3407 3419 NA NA NA NCRP
46063 Harding County SD NA NA NA 1278 1264 1250 NA NA NA NCRP
46065 Hughes County SD 38.28750435 32.63483339 NA TRUE TRUE FALSE 16717 17466 17642 66 57 NA NCRP
46067 Hutchinson County SD 9.669843901 9.762900976 NA TRUE TRUE 7471 7170 7200 7 7 NA NCRP
46069 Hyde County SD NA NA NA 1531 1387 1396 NA NA NA NCRP
46071 Jackson County SD NA NA NA FALSE 2976 3231 3274 NA NA NA NCRP
46073 Jerauld County SD NA NA NA 2059 2058 2007 NA NA NA NCRP
46075 Jones County SD NA NA NA 1046 996 975 NA NA NA NCRP
46077 Kingsbury County SD 9.723842863 9.842519685 NA TRUE TRUE FALSE 5228 5080 5075 5 5 NA NCRP
46079 Lake County SD 19.02455898 9.107468124 NA TRUE TRUE FALSE 10659 12078 12368 22 11 NA NCRP
46081 Lawrence County SD 41.96667352 32.53142696 NA TRUE TRUE FALSE 23172 24899 24657 102 81 NA NCRP
46083 Lincoln County SD 8.3524297 8.218738724 NA TRUE TRUE FALSE 36885 49886 51548 39 41 NA NCRP
46085 Lyman County SD 34.1745531 18.03658851 NA TRUE TRUE FALSE 3754 3881 3877 13 7 NA NCRP
46087 McCook County SD 17.8412132 17.7085178 NA TRUE TRUE 5679 5647 5649 10 10 NA NCRP
46089 McPherson County SD NA NA NA 2571 2439 2429 NA NA NA NCRP
46091 Marshall County SD 23.62035645 14.75237092 NA TRUE TRUE FALSE 4616 4745 4683 11 7 NA NCRP
46093 Meade County SD 40.13274678 23.33722287 NA TRUE TRUE FALSE 25085 26567 26951 104 62 NA NCRP
46095 Mellette County SD 57.91505792 NA NA TRUE 2030 2081 2100 12 NA NA NCRP
46097 Miner County SD NA 38.54389722 NA TRUE 2474 2335 2316 NA 9 NA NCRP
46099 Minnehaha County SD 24.66668207 23.75865216 NA TRUE TRUE FALSE 160630 179724 182882 427 427 NA NCRP
46101 Moody County SD 49.53560372 15.58603491 NA TRUE TRUE 6537 6416 6367 32 10 NA NCRP
46103 Pennington County SD 51.67782622 42.30436581 NA TRUE TRUE FALSE 94394 106372 108242 531 450 NA NCRP
46105 Perkins County SD 47.57050629 NA NA TRUE 2977 3035 3033 14 NA NA NCRP
46107 Potter County SD NA NA NA 2413 2369 2340 NA NA NA NCRP
46109 Roberts County SD 78.35455436 58.22416303 NA TRUE TRUE FALSE 9977 10305 10374 80 60 NA NCRP
46111 Sanborn County SD NA NA NA 2410 2324 2336 NA NA NA NCRP
46113 Shannon County SD NA NA NA 13404 14166 14218 NA NA NA NCRP
46115 Spink County SD 13.79944802 30.30762237 NA TRUE TRUE FALSE 6714 6599 6598 9 20 NA NCRP
46117 Stanley County SD 30.34389751 36.86327078 NA TRUE TRUE FALSE 2845 2984 2983 9 11 NA NCRP
46119 Sully County SD NA NA NA 1422 1464 1438 NA NA NA NCRP
46121 Todd County SD NA NA NA 9505 9977 9882 NA NA NA NCRP
46123 Tripp County SD 30.51516783 39.95641119 NA TRUE TRUE FALSE 5964 5506 5512 17 22 NA NCRP
46125 Turner County SD 11.98465964 5.977286312 NA TRUE TRUE FALSE 8382 8365 8272 10 5 NA NCRP
46127 Union County SD 32.24699828 30.39718995 NA TRUE TRUE FALSE 13388 14804 15029 47 45 NA NCRP
46129 Walworth County SD 71.20686507 12.71571299 NA TRUE TRUE FALSE 5469 5505 5511 39 7 NA NCRP
46135 Yankton County SD 41.3002931 31.32721497 NA TRUE TRUE FALSE 21957 22664 22684 93 71 NA NCRP
46137 Ziebach County SD NA NA NA 2782 2835 2826 NA NA NA NCRP
47001 Anderson County TN 14.34968045 30.86337987 26.87744942 TRUE TRUE TRUE 73117 75494 75528 108 233 203 NCRP
47003 Bedford County TN 30.87849313 27.04530088 25.52169344 TRUE TRUE TRUE 42780 45849 46627 140 124 119 NCRP
47005 Benton County TN 15.85559215 16.58272939 17.3428306 TRUE TRUE TRUE 16435 16282 16145 26 27 28 NCRP
47007 Bledsoe County TN 7.002256283 15.23284492 15.07429474 TRUE TRUE TRUE 12847 13786 13931 9 21 21 NCRP
47009 Blount County TN 14.79122549 25.4308449 25.64528768 TRUE TRUE TRUE 118228 125045 126339 183 318 324 NCRP
47011 Bradley County TN 25.18237234 35.53443994 26.31706725 TRUE TRUE TRUE 94638 101873 102975 252 362 271 NCRP
47013 Campbell County TN 33.04317806 57.96740888 35.5729245 TRUE TRUE TRUE 40475 40195 39918 134 233 142 NCRP
47015 Cannon County TN 17.40391588 29.71660506 23.98778804 TRUE TRUE TRUE 13280 13797 13757 24 41 33 NCRP
47017 Carroll County TN 25.942156 25.96855699 15.86182587 TRUE TRUE TRUE 28791 28496 28370 74 74 45 NCRP
47019 Carter County TN 20.0215885 31.39662661 24.08325423 TRUE TRUE TRUE 57877 57331 56886 115 180 137 NCRP
47021 Cheatham County TN 18.61627521 15.71330816 14.58605774 TRUE TRUE TRUE 38186 39457 39764 73 62 58 NCRP
47023 Chester County TN 18.65780421 17.28708079 23.01628402 TRUE TRUE TRUE 16491 17354 17379 32 30 40 NCRP
47025 Claiborne County TN 9.713300956 38.93267496 37.66776399 TRUE TRUE TRUE 31481 31593 31592 31 123 119 NCRP
47027 Clay County TN 24.30910952 29.58199357 30.90792015 TRUE TRUE TRUE 7977 7775 7765 19 23 24 NCRP
47029 Cocke County TN 22.19350489 34.79097132 25.44241533 TRUE TRUE TRUE 35001 35354 35374 79 123 90 NCRP
47031 Coffee County TN 36.78481825 34.51121615 33.56768551 TRUE TRUE TRUE 51646 53316 53623 195 184 180 NCRP
47033 Crockett County TN 20.58177827 22.5826319 19.77092992 TRUE TRUE TRUE 14430 14613 14668 30 33 29 NCRP
47035 Cumberland County TN 18.7315556 24.69908857 29.14546866 TRUE TRUE TRUE 53363 57492 57985 106 142 169 NCRP
47037 Davidson County TN 40.77412887 34.00390263 29.07172472 TRUE TRUE TRUE 597597 659042 668347 2603 2241 1943 NCRP
47039 Decatur County TN 13.68106028 16.28804115 7.714726556 TRUE TRUE TRUE 11567 11665 11666 16 19 9 NCRP
47041 DeKalb County TN 11.65562914 39.74271819 35.29167532 TRUE TRUE TRUE 18289 19123 19268 22 76 68 NCRP
47043 Dickson County TN 19.629051 23.51393898 18.38853188 TRUE TRUE TRUE 47229 50183 50575 98 118 93 NCRP
47045 Dyer County TN 35.30427051 48.48008386 38.48688546 TRUE TRUE TRUE 38043 38160 37935 135 185 146 NCRP
47047 Fayette County TN 16.88223988 18.05426597 19.73802261 TRUE TRUE TRUE 35667 38772 39011 65 70 77 NCRP
47049 Fentress County TN 45.14295268 31.25174396 24.64295715 TRUE TRUE TRUE 17514 17919 17855 81 56 44 NCRP
47051 Franklin County TN 22.9352202 35.59580599 32.3655862 TRUE TRUE TRUE 40877 41297 41402 94 147 134 NCRP
47053 Gibson County TN 21.34342784 22.04960149 19.00064683 TRUE TRUE TRUE 48101 49434 49472 106 109 94 NCRP
47055 Giles County TN 22.93420963 25.36219296 22.8745711 TRUE TRUE TRUE 29515 28783 28853 67 73 66 NCRP
47057 Grainger County TN 10.15318059 34.37031815 31.05318404 TRUE TRUE TRUE 22175 22694 22864 23 78 71 NCRP
47059 Greene County TN 22.85997175 26.96563347 25.02377991 TRUE TRUE TRUE 67153 68235 68335 157 184 171 NCRP
47061 Grundy County TN 22.69898221 45.29927224 40.96834264 TRUE TRUE TRUE 14073 13466 13425 31 61 55 NCRP
47063 Hamblen County TN 34.59766266 47.24309585 42.99130655 TRUE TRUE TRUE 60629 63078 63036 217 298 271 NCRP
47065 Hamilton County TN 13.22685374 14.52597198 15.06178464 TRUE TRUE TRUE 321350 349030 351220 451 507 529 NCRP
47067 Hancock County TN 56.40492801 96.06724707 75.10890792 TRUE TRUE TRUE 6730 6662 6657 38 64 50 NCRP
47069 Hardeman County TN 31.97382608 38.4220337 28.88503755 TRUE TRUE TRUE 27816 26287 25965 86 101 75 NCRP
47071 Hardin County TN 14.6092038 26.91686534 20.10050251 TRUE TRUE TRUE 25863 26006 25870 38 70 52 NCRP
47073 Hawkins County TN 21.49438856 35.19206067 26.43870627 TRUE TRUE TRUE 56030 56831 56735 122 200 150 NCRP
47075 Haywood County TN 30.75926825 35.13009112 31.89441848 TRUE TRUE TRUE 19288 18218 18185 57 64 58 NCRP
47077 Henderson County TN 23.26913439 29.67146892 37.1309222 TRUE TRUE TRUE 27066 27973 28009 65 83 104 NCRP
47079 Henry County TN 28.48914625 21.44788785 13.04185815 TRUE TRUE TRUE 31686 32171 32204 92 69 42 NCRP
47081 Hickman County TN 11.87162273 21.89449333 25.42650919 TRUE TRUE TRUE 24159 24207 24384 29 53 62 NCRP
47083 Houston County TN NA 22.90536468 19.3540583 TRUE TRUE 8080 8295 8267 NA 19 16 NCRP
47085 Humphreys County TN 20.66115702 14.25047958 18.19685691 TRUE TRUE TRUE 18234 18245 18135 38 26 33 NCRP
47087 Jackson County TN 17.35056823 19.04597005 19.8824343 TRUE TRUE TRUE 11317 11551 11568 20 22 23 NCRP
47089 Jefferson County TN 19.51351456 37.28774667 32.27214914 TRUE TRUE TRUE 49079 52296 52677 101 195 170 NCRP
47091 Johnson County TN 17.62308624 25.58825165 29.11697183 TRUE TRUE TRUE 18059 17977 17859 32 46 52 NCRP
47093 Knox County TN 23.7080161 26.46562395 22.84662227 TRUE TRUE TRUE 411785 444350 448644 1036 1176 1025 NCRP
47095 Lake County TN 50.17367812 55.8006748 24.89844057 TRUE TRUE TRUE 7846 7706 7631 39 43 19 NCRP
47097 Lauderdale County TN 31.66150968 39.53429328 25.56423928 TRUE TRUE TRUE 27548 27571 27382 88 109 70 NCRP
47099 Lawrence County TN 17.64972452 28.11331094 32.40762644 TRUE TRUE TRUE 40773 41973 42274 74 118 137 NCRP
47101 Lewis County TN 24.06838742 31.78320509 25.19737947 TRUE TRUE TRUE 11817 11956 11906 29 38 30 NCRP
47103 Lincoln County TN 17.65885487 27.38421241 27.64812558 TRUE TRUE TRUE 32310 33596 33637 59 92 93 NCRP
47105 Loudon County TN 5.489143694 15.66279393 12.21169565 TRUE TRUE TRUE 45207 50438 50771 27 79 62 NCRP
47107 McMinn County TN 33.24544308 44.49706854 39.71420971 TRUE TRUE TRUE 51610 52363 52626 174 233 209 NCRP
47109 McNairy County TN 18.79843474 16.81957187 13.324704 TRUE TRUE TRUE 25445 26160 26267 49 44 35 NCRP
47111 Macon County TN 21.41327623 30.89416542 24.7793766 TRUE TRUE TRUE 21556 22658 23003 48 70 57 NCRP
47113 Madison County TN 37.34950794 37.8730342 35.85324614 TRUE TRUE TRUE 96681 98751 98178 367 374 352 NCRP
47115 Marion County TN 17.01283051 24.68874546 26.04991727 TRUE TRUE TRUE 27992 28353 28407 48 70 74 NCRP
47117 Marshall County TN 36.01791161 29.26233198 21.10716684 TRUE TRUE TRUE 28821 31098 31269 111 91 66 NCRP
47119 Maury County TN 17.84382982 33.49282297 22.56913992 TRUE TRUE TRUE 75795 83600 85515 146 280 193 NCRP
47121 Meigs County TN 9.396890484 18.02575107 17.09255619 TRUE TRUE TRUE 11346 11650 11701 11 21 20 NCRP
47123 Monroe County TN 25.19116303 37.41504129 27.41361395 TRUE TRUE TRUE 42955 45169 45233 113 169 124 NCRP
47125 Montgomery County TN 7.1492907 8.877869744 7.475218598 TRUE TRUE TRUE 153054 184729 189961 127 164 142 NCRP
47127 Moore County TN 23.63321254 34.84872485 34.81563539 TRUE TRUE TRUE 6123 6313 6319 15 22 22 NCRP
47129 Morgan County TN 5.463485704 5.99852344 9.695290859 TRUE TRUE TRUE 21156 21672 21660 12 13 21 NCRP
47131 Obion County TN 34.84762086 27.65273312 17.12937526 TRUE TRUE TRUE 31990 31100 30941 110 86 53 NCRP
47133 Overton County TN 21.71061559 21.32583148 24.06028691 TRUE TRUE TRUE 21371 22039 22028 48 47 53 NCRP
47135 Perry County TN 34.34677522 26.74818494 23.01201739 TRUE TRUE TRUE 7620 7851 7822 27 21 18 NCRP
47137 Pickett County TN 17.66437684 27.54278969 NA TRUE TRUE 5023 5083 5124 9 14 NA NCRP
47139 Polk County TN 28.70298391 44.40710514 40.04781829 TRUE TRUE TRUE 16539 16664 16730 48 74 67 NCRP
47141 Putnam County TN 15.40535336 26.6474515 26.83206364 TRUE TRUE TRUE 68493 73553 74165 112 196 199 NCRP
47143 Rhea County TN 7.793017456 9.841611564 11.64180019 TRUE TRUE TRUE 30440 32515 32641 25 32 38 NCRP
47145 Roane County TN 6.695805822 11.70451757 10.23735497 TRUE TRUE TRUE 53821 52971 52748 36 62 54 NCRP
47147 Robertson County TN 16.96110953 23.62977054 17.77346906 TRUE TRUE TRUE 61551 67288 68079 113 159 121 NCRP
47149 Rutherford County TN 17.59419763 14.03830503 14.19146712 TRUE TRUE TRUE 233247 281373 288906 474 395 410 NCRP
47151 Scott County TN 22.11790196 64.51906038 35.47550825 TRUE TRUE TRUE 22034 22009 21987 49 142 78 NCRP
47153 Sequatchie County TN 21.62840996 30.77133479 31.9640914 TRUE TRUE TRUE 13282 14624 14704 31 45 47 NCRP
47155 Sevier County TN 16.75885865 35.0079515 30.07044475 TRUE TRUE TRUE 84098 93693 95110 153 328 286 NCRP
47157 Shelby County TN 30.27058083 26.25177647 23.66843736 TRUE TRUE TRUE 920106 939365 938803 2824 2466 2222 NCRP
47159 Smith County TN 15.67889621 35.67493836 29.9857962 TRUE TRUE TRUE 18726 19061 19009 30 68 57 NCRP
47161 Stewart County TN 6.760309472 15.7362308 12.80216884 TRUE TRUE TRUE 12866 13345 13279 9 21 17 NCRP
47163 Sullivan County TN 33.17574853 36.0575389 36.9952944 TRUE TRUE TRUE 154227 156694 157047 520 565 581 NCRP
47165 Sumner County TN 21.80498888 20.7552302 18.47069586 TRUE TRUE TRUE 148941 169114 172706 357 351 319 NCRP
47167 Tipton County TN 19.57649515 25.33948411 19.47324862 TRUE TRUE TRUE 57466 61564 61623 120 156 120 NCRP
47169 Trousdale County TN 28.05049088 29.46451448 29.99250187 TRUE TRUE TRUE 7531 7806 8002 22 23 24 NCRP
47171 Unicoi County TN 23.55648077 19.36161974 20.59789567 TRUE TRUE TRUE 18143 18077 17963 43 35 37 NCRP
47173 Union County TN 21.37977786 46.09260423 27.2066133 TRUE TRUE TRUE 18896 19092 19113 41 88 52 NCRP
47175 Van Buren County TN 26.96871629 17.98237727 10.65151784 TRUE TRUE TRUE 5406 5561 5633 15 10 6 NCRP
47177 Warren County TN 25.33804972 32.86008127 31.27423753 TRUE TRUE TRUE 39190 39866 39969 101 131 125 NCRP
47179 Washington County TN 24.45698235 25.08740771 18.45661507 TRUE TRUE TRUE 115923 125561 126242 303 315 233 NCRP
47181 Wayne County TN 36.47917157 34.81647586 34.29314728 TRUE TRUE TRUE 17033 16946 16913 62 59 58 NCRP
47183 Weakley County TN 11.21366342 20.62514525 11.05518867 TRUE TRUE TRUE 34289 34424 34373 39 71 38 NCRP
47185 White County TN 14.23843608 28.59212382 34.59944489 TRUE TRUE TRUE 24866 26231 26301 37 75 91 NCRP
47187 Williamson County TN 12.59692487 8.795074758 11.54824437 TRUE TRUE TRUE 161902 198975 205226 238 175 237 NCRP
47189 Wilson County TN 13.93781852 16.7191188 15.63297601 TRUE TRUE TRUE 103697 122016 125376 163 204 196 NCRP
48001 Anderson County TX 36.7306306 33.48638105 37.30890034 TRUE TRUE TRUE 57386 57934 57627 214 194 215 NCRP
48003 Andrews County TX 30.21730745 43.43169919 44.63008525 TRUE TRUE TRUE 13195 16808 17477 47 73 78 NCRP
48005 Angelina County TX 39.52115071 44.74221862 48.43304843 TRUE TRUE TRUE 83810 87613 87750 344 392 425 NCRP
48007 Aransas County TX 56.71477547 53.6547113 62.06951786 TRUE TRUE TRUE 23395 24229 24972 134 130 155 NCRP
48009 Archer County TX 13.55472721 17.14285714 12.48439451 TRUE TRUE TRUE 9063 8750 8811 12 15 11 NCRP
48011 Armstrong County TX NA NA NA 1989 1957 1955 NA NA NA NCRP
48013 Atascosa County TX 35.00021875 28.88393331 27.83941056 TRUE TRUE TRUE 43059 47085 47774 160 136 133 NCRP
48015 Austin County TX 16.09911455 21.5195585 22.32602871 TRUE TRUE TRUE 26828 28811 29114 46 62 65 NCRP
48017 Bailey County TX 21.06445724 38.13559322 28.94356006 TRUE TRUE TRUE 7001 7080 6910 15 27 20 NCRP
48019 Bandera County TX 18.99381483 12.13179987 22.01799732 TRUE TRUE TRUE 19775 20607 20892 39 25 46 NCRP
48021 Bastrop County TX 24.08671216 20.36820458 21.13514968 TRUE TRUE TRUE 69720 76099 78069 180 155 165 NCRP
48023 Baylor County TX 38.06416531 16.64355062 36.19153675 TRUE TRUE TRUE 3870 3605 3592 14 6 13 NCRP
48025 Bee County TX 30.97797466 32.953956 30.42935824 TRUE TRUE TRUE 31977 32773 32863 100 108 100 NCRP
48027 Bell County TX 31.97909813 28.38056284 30.29106155 TRUE TRUE TRUE 273771 326632 329140 1011 927 997 NCRP
48029 Bexar County TX 30.73741272 31.5670355 29.56032386 TRUE TRUE TRUE 1573935 1822154 1855866 5389 5752 5486 NCRP
48031 Blanco County TX 6.627532664 15.04607862 10.17388087 TRUE TRUE TRUE 9686 10634 10812 7 16 11 NCRP
48033 Borden County TX NA NA NA 634 639 652 NA NA NA NCRP
48035 Bosque County TX 38.13418813 25.75299519 30.9336333 TRUE TRUE TRUE 18046 17862 17780 69 46 55 NCRP
48037 Bowie County TX 32.52522859 52.86701911 47.27954972 TRUE TRUE TRUE 90235 93442 93275 302 494 441 NCRP
48039 Brazoria County TX 18.77975417 23.40702211 23.48250938 TRUE TRUE TRUE 284248 330670 338124 600 774 794 NCRP
48041 Brazos County TX 28.08107588 27.31879915 25.9619798 TRUE TRUE TRUE 175433 204621 209152 555 559 543 NCRP
48043 Brewster County TX 11.89961056 15.07159005 10.90155892 TRUE TRUE TRUE 8790 9289 9173 11 14 10 NCRP
48045 Briscoe County TX NA NA NA 1704 1544 1536 NA NA NA NCRP
48047 Brooks County TX 33.21799308 27.72002772 27.80094523 TRUE TRUE TRUE 7490 7215 7194 24 20 20 NCRP
48049 Brown County TX 57.7196774 64.63015722 64.27110722 TRUE TRUE TRUE 38492 37908 37653 219 245 242 NCRP
48051 Burleson County TX 62.78704726 40.78541048 53.32405958 TRUE TRUE TRUE 17000 17163 17253 108 70 92 NCRP
48053 Burnet County TX 14.3418922 29.06714736 30.70556038 TRUE TRUE TRUE 41109 44380 44943 62 129 138 NCRP
48055 Caldwell County TX 27.03756662 34.90623726 34.16227079 TRUE TRUE TRUE 36533 39248 39810 104 137 136 NCRP
48057 Calhoun County TX 20.46226108 28.91898095 27.98550259 TRUE TRUE TRUE 20839 21785 21797 44 63 61 NCRP
48059 Callahan County TX 20.6871075 19.97336884 15.54059054 TRUE TRUE TRUE 13309 13518 13513 28 27 21 NCRP
48061 Cameron County TX 17.89583891 25.48915993 25.40486023 TRUE TRUE TRUE 380169 418217 420392 735 1066 1068 NCRP
48063 Camp County TX 33.02456706 35.42102721 34.8625307 TRUE TRUE TRUE 12068 12422 12621 41 44 44 NCRP
48065 Carson County TX 58.46053914 63.48145673 69.84866123 TRUE TRUE TRUE 6413 5986 6013 36 38 42 NCRP
48067 Cass County TX 41.85341418 48.07533998 46.59462675 TRUE TRUE TRUE 30095 30369 30261 127 146 141 NCRP
48069 Castro County TX 26.09992543 34.94757863 33.41472818 TRUE TRUE TRUE 7780 8012 7781 21 28 26 NCRP
48071 Chambers County TX 55.94602193 29.82668279 26.21575567 TRUE TRUE TRUE 29980 37215 38145 199 111 100 NCRP
48073 Cherokee County TX 25.36125037 32.57137251 38.30890731 TRUE TRUE TRUE 49162 50965 50902 129 166 195 NCRP
48075 Childress County TX 36.84285107 69.37561943 46.5509945 TRUE TRUE TRUE 7214 7063 7089 26 49 33 NCRP
48077 Clay County TX 9.388789785 19.16443082 8.678881389 TRUE TRUE TRUE 11157 10436 10370 10 20 9 NCRP
48079 Cochran County TX 29.33507171 23.37228715 NA TRUE TRUE 3257 2995 2935 9 7 NA NCRP
48081 Coke County TX 36.68602874 NA 15.36570375 TRUE TRUE 3492 3215 3254 12 NA 5 NCRP
48083 Coleman County TX 17.15462031 52.71790066 62.87069988 TRUE TRUE TRUE 8853 8536 8430 15 45 53 NCRP
48085 Collin County TX 9.786665483 10.65550575 11.04783895 TRUE TRUE TRUE 683935 858711 885241 794 915 978 NCRP
48087 Collingsworth County TX 42.46978112 58.3090379 82.86377196 TRUE TRUE TRUE 2952 3087 3017 13 18 25 NCRP
48089 Colorado County TX 47.16981132 39.46861764 41.50779478 TRUE TRUE TRUE 20608 20776 20719 98 82 86 NCRP
48091 Comal County TX 11.33088872 20.10244678 18.59427296 TRUE TRUE TRUE 95637 118891 123694 127 239 230 NCRP
48093 Comanche County TX 33.98655 26.48811714 38.37638376 TRUE TRUE TRUE 13814 13591 13550 47 36 52 NCRP
48095 Concho County TX 29.48402948 17.04822211 34.56790123 TRUE TRUE TRUE 3957 4106 4050 12 7 14 NCRP
48097 Cooke County TX 37.15829955 49.12280702 56.24209902 TRUE TRUE TRUE 38241 38475 38761 143 189 218 NCRP
48099 Coryell County TX 16.71800542 30.73060376 29.51218867 TRUE TRUE TRUE 72217 76471 75562 127 235 223 NCRP
48101 Cottle County TX NA NA NA 1577 1442 1415 NA NA NA NCRP
48103 Crane County TX 20.07136485 23.13354364 20.2020202 TRUE TRUE TRUE 3855 4755 4950 9 11 10 NCRP
48105 Crockett County TX 52.08333333 50.37115589 60.33578174 TRUE TRUE TRUE 3739 3772 3812 20 19 23 NCRP
48107 Crosby County TX 26.42007926 8.344459279 16.95202577 TRUE TRUE TRUE 6466 5992 5899 16 5 10 NCRP
48109 Culberson County TX 29.85074627 NA NA TRUE 2587 2288 2266 7 NA NA NCRP
48111 Dallam County TX 36.47505107 35.47608912 36.44008409 TRUE TRUE TRUE 6205 7047 7135 25 25 26 NCRP
48113 Dallas County TX 38.00651694 34.18630834 32.30317338 TRUE TRUE TRUE 2275434 2486083 2518638 9169 8499 8136 NCRP
48115 Dawson County TX 71.16404037 43.69773224 47.86120251 TRUE TRUE TRUE 13987 13273 13372 98 58 64 NCRP
48117 Deaf Smith County TX 64.22541047 63.58471882 75.01953634 TRUE TRUE TRUE 18770 19187 19195 124 122 144 NCRP
48119 Delta County TX 34.37082299 30.73967339 36.27338679 TRUE TRUE TRUE 5355 5205 5238 18 16 19 NCRP
48121 Denton County TX 14.02907872 12.31567629 12.25172991 TRUE TRUE TRUE 584561 729152 753363 965 898 923 NCRP
48123 DeWitt County TX 45.88287533 45.85142188 44.96228969 TRUE TRUE TRUE 20108 20501 20684 93 94 93 NCRP
48125 Dickens County TX 29.38706969 NA 27.05139766 TRUE TRUE 2466 2288 2218 7 NA 6 NCRP
48127 Dimmit County TX 15.57935735 19.19736722 27.05383714 TRUE TRUE TRUE 9972 10939 11089 16 21 30 NCRP
48129 Donley County TX 46.96132597 47.48603352 47.98193621 TRUE TRUE TRUE 3779 3580 3543 17 17 17 NCRP
48131 Duval County TX 13.6286201 33.62068966 35.55016041 TRUE TRUE TRUE 12298 11600 11533 16 39 41 NCRP
48133 Eastland County TX 48.19929597 82.17827206 96.28080986 TRUE TRUE TRUE 18545 18253 18176 89 150 175 NCRP
48135 Ector County TX 32.71113874 44.14066157 47.88699449 TRUE TRUE TRUE 127476 149522 153904 463 660 737 NCRP
48137 Edwards County TX NA NA 26.60989888 TRUE 1995 1879 1879 NA NA 5 NCRP
48139 Ellis County TX 31.44323115 30.66620571 28.62218093 TRUE TRUE TRUE 135276 156198 159317 478 479 456 NCRP
48141 El Paso County TX 14.90747403 14.33857317 14.24137389 TRUE TRUE TRUE 744795 831324 833487 1212 1192 1187 NCRP
48143 Erath County TX 34.58600041 25.74806889 23.91212295 TRUE TRUE TRUE 36355 40003 40147 134 103 96 NCRP
48145 Falls County TX 37.81251764 36.43303262 38.84866678 TRUE TRUE TRUE 17945 17292 16989 67 63 66 NCRP
48147 Fannin County TX 45.83222449 51.12352871 53.33017303 TRUE TRUE TRUE 33540 33644 33752 155 172 180 NCRP
48149 Fayette County TX 25.13989133 27.43594916 37.45016712 TRUE TRUE TRUE 23631 24785 24833 62 68 93 NCRP
48151 Fisher County TX 35.67787971 36.47733194 23.49256069 TRUE TRUE TRUE 4098 3838 3831 14 14 9 NCRP
48153 Floyd County TX 54.9364307 30.45359833 26.89527652 TRUE TRUE TRUE 6855 6239 5949 35 19 16 NCRP
48155 Foard County TX NA 55.11811024 39.21568627 TRUE TRUE 1432 1270 1275 NA 7 5 NCRP
48157 Fort Bend County TX 8.736507269 9.044229644 7.514463518 TRUE TRUE TRUE 490916 654561 685345 532 592 515 NCRP
48159 Franklin County TX 50.89058524 36.7508481 33.96226415 TRUE TRUE TRUE 10755 10612 10600 54 39 36 NCRP
48161 Freestone County TX 57.99460752 45.34107698 36.93958101 TRUE TRUE TRUE 19123 19629 19762 114 89 73 NCRP
48163 Frio County TX 27.39413309 26.4142637 29.1403594 TRUE TRUE TRUE 16720 18172 18531 48 48 54 NCRP
48165 Gaines County TX 26.08357844 20.56419721 13.8996139 TRUE TRUE TRUE 15707 18965 19425 47 39 27 NCRP
48167 Galveston County TX 33.94355325 24.8158327 26.03453873 TRUE TRUE TRUE 279182 307465 314198 1007 763 818 NCRP
48169 Garza County TX 29.89301447 42.15456674 32.63403263 TRUE TRUE TRUE 5996 6405 6435 19 27 21 NCRP
48171 Gillespie County TX 15.99808023 9.868161364 9.796238245 TRUE TRUE TRUE 23487 25334 25520 40 25 25 NCRP
48173 Glasscock County TX NA 48.19277108 NA TRUE 1202 1245 1291 NA 6 NA NCRP
48175 Goliad County TX 23.34844115 48.19922346 39.74036296 TRUE TRUE TRUE 7121 7469 7549 17 36 30 NCRP
48177 Gonzales County TX 35.14056225 43.52341857 49.35978888 TRUE TRUE TRUE 19633 20219 20462 70 88 101 NCRP
48179 Gray County TX 35.12315055 51.89934145 55.11195973 TRUE TRUE TRUE 22100 22929 23044 80 119 127 NCRP
48181 Grayson County TX 52.18810804 47.24422321 58.44544822 TRUE TRUE TRUE 117174 122343 123534 633 578 722 NCRP
48183 Gregg County TX 62.24541543 50.89533581 55.35534561 TRUE TRUE TRUE 117118 123194 123204 761 627 682 NCRP
48185 Grimes County TX 27.75381615 29.38878762 24.6577359 TRUE TRUE TRUE 25639 26881 27172 74 79 67 NCRP
48187 Guadalupe County TX 21.99499779 20.88120063 20.78098472 TRUE TRUE TRUE 111878 143191 147250 299 299 306 NCRP
48189 Hale County TX 47.02627939 42.44742942 38.01843318 TRUE TRUE TRUE 36162 35809 34720 170 152 132 NCRP
48191 Hall County TX 39.27492447 49.59702418 66.73021926 TRUE TRUE TRUE 3582 3226 3147 13 16 21 NCRP
48193 Hamilton County TX 23.78121284 36.31082062 28.05220149 TRUE TRUE TRUE 8389 8262 8199 20 30 23 NCRP
48195 Hansford County TX 12.57635645 NA 19.96732619 TRUE TRUE 5293 5515 5509 7 NA 11 NCRP
48197 Hardeman County TX 39.1485197 44.9326011 38.18737271 TRUE TRUE TRUE 4409 4006 3928 16 18 15 NCRP
48199 Hardin County TX 13.1040131 20.93069414 20.67564409 TRUE TRUE TRUE 51470 55421 55621 72 116 115 NCRP
48201 Harris County TX 40.24594211 32.73790926 30.85309263 TRUE TRUE TRUE 3807435 4352752 4441370 16832 14250 13703 NCRP
48203 Harrison County TX 41.07301368 28.87549304 36.97873352 TRUE TRUE TRUE 63699 67185 67336 273 194 249 NCRP
48205 Hartley County TX 11.52073733 11.53212521 11.49614058 TRUE TRUE TRUE 5911 6070 6089 7 7 7 NCRP
48207 Haskell County TX 37.38317757 67.98096533 72.80291212 TRUE TRUE TRUE 5817 5884 5769 22 40 42 NCRP
48209 Hays County TX 17.78925821 17.90540732 17.02472639 TRUE TRUE TRUE 132111 176483 185025 292 316 315 NCRP
48211 Hemphill County TX 17.68123263 16.91229766 28.70813397 TRUE TRUE TRUE 3523 4139 4180 7 7 12 NCRP
48213 Henderson County TX 45.90772674 44.77346155 49.18653046 TRUE TRUE TRUE 78404 78618 79290 361 352 390 NCRP
48215 Hidalgo County TX 25.87757353 23.54257078 24.41422113 TRUE TRUE TRUE 695352 818942 831073 2046 1928 2029 NCRP
48217 Hill County TX 49.92724887 82.90779735 71.16620753 TRUE TRUE TRUE 34484 34858 34848 175 289 248 NCRP
48219 Hockley County TX 35.90741942 25.08503401 19.08639776 TRUE TRUE TRUE 22912 23520 23577 83 59 45 NCRP
48221 Hood County TX 39.99536286 48.20689264 44.13864728 TRUE TRUE TRUE 47952 52897 53921 207 255 238 NCRP
48223 Hopkins County TX 64.59838504 59.71999211 67.64845077 TRUE TRUE TRUE 33746 35499 35921 228 212 243 NCRP
48225 Houston County TX 40.6591055 42.09418574 51.00919045 TRUE TRUE TRUE 23551 22806 22741 95 96 116 NCRP
48227 Howard County TX 46.7461824 31.42486975 33.55979373 TRUE TRUE TRUE 33328 36277 36651 165 114 123 NCRP
48229 Hudspeth County TX 58.92751915 24.1984271 15.57147306 TRUE TRUE TRUE 3459 3306 3211 20 8 5 NCRP
48231 Hunt County TX 30.42044995 37.81474204 36.38705886 TRUE TRUE TRUE 83770 87532 88493 263 331 322 NCRP
48233 Hutchinson County TX 25.92558901 16.48955661 27.55706609 TRUE TRUE TRUE 22176 21832 21773 57 36 60 NCRP
48235 Irion County TX NA 43.50528278 NA TRUE 1649 1609 1574 NA 7 NA NCRP
48237 Jack County TX 11.09631602 20.19975311 28.23263693 TRUE TRUE TRUE 9177 8911 8855 10 18 25 NCRP
48239 Jackson County TX 69.0092247 69.82953379 73.95345682 TRUE TRUE TRUE 13954 14607 14739 98 102 109 NCRP
48241 Jasper County TX 22.06888845 31.12818643 33.19081908 TRUE TRUE TRUE 34861 35659 35552 79 111 118 NCRP
48243 Jeff Davis County TX NA NA 22.68602541 TRUE 2264 2236 2204 NA NA 5 NCRP
48245 Jefferson County TX 46.55829503 41.25562667 42.0639483 TRUE TRUE TRUE 245962 252814 252235 1174 1043 1061 NCRP
48247 Jim Hogg County TX 13.28021248 57.29564553 34.25309229 TRUE TRUE TRUE 5160 5236 5255 7 30 18 NCRP
48249 Jim Wells County TX 15.28495524 10.79939523 12.09102121 TRUE TRUE TRUE 40393 41669 41353 63 45 50 NCRP
48251 Johnson County TX 42.39290214 52.08064433 56.01564882 TRUE TRUE TRUE 142501 154952 157456 646 807 882 NCRP
48253 Jones County TX 32.37213009 29.89834562 29.59470305 TRUE TRUE TRUE 20242 20068 19936 65 60 59 NCRP
48255 Karnes County TX 26.14641995 23.67744554 26.83483161 TRUE TRUE TRUE 14985 14782 14906 39 35 40 NCRP
48257 Kaufman County TX 22.9043908 23.49775619 24.90201014 TRUE TRUE TRUE 91395 108521 111236 241 255 277 NCRP
48259 Kendall County TX 7.152871162 7.205956924 11.31687243 TRUE TRUE TRUE 29134 37469 38880 25 27 44 NCRP
48261 Kenedy County TX 95.41984733 192.7710843 225 TRUE TRUE TRUE 426 415 400 5 8 9 NCRP
48263 Kent County TX NA NA NA 770 801 785 NA NA NA NCRP
48265 Kerr County TX 40.04346426 50.26836498 53.3997864 TRUE TRUE TRUE 47840 49932 50562 199 251 270 NCRP
48267 Kimble County TX 28.47130968 31.37606455 51.82514646 TRUE TRUE TRUE 4578 4462 4438 13 14 23 NCRP
48269 King County TX NA NA NA 285 273 262 NA NA NA NCRP
48271 Kinney County TX 22.29033157 NA 28.36074872 TRUE TRUE 3488 3623 3526 8 NA 10 NCRP
48273 Kleberg County TX 59.27867216 58.78876481 52.50077664 TRUE TRUE TRUE 31149 32149 32190 190 189 169 NCRP
48275 Knox County TX 16.0814795 26.47603918 38.88024883 TRUE TRUE TRUE 3788 3777 3858 6 10 15 NCRP
48277 Lamar County TX 68.94333782 60.0162206 63.2029562 TRUE TRUE TRUE 49386 49320 49523 343 296 313 NCRP
48279 Lamb County TX 28.73356799 23.26088537 24.31118314 TRUE TRUE TRUE 14338 13757 13574 40 32 33 NCRP
48281 Lampasas County TX 36.61533832 33.20283463 26.79102997 TRUE TRUE TRUE 19472 20179 20156 73 67 54 NCRP
48283 La Salle County TX 30.34243606 39.03620945 26.7594327 TRUE TRUE TRUE 6549 7429 7474 21 29 20 NCRP
48285 Lavaca County TX 26.87199628 19.44430231 17.74757872 TRUE TRUE TRUE 19181 19543 19721 52 38 35 NCRP
48287 Lee County TX 40.95645365 56.06800506 44.79751523 TRUE TRUE TRUE 16348 16587 16742 68 93 75 NCRP
48289 Leon County TX 35.11486728 13.17838744 23.13030069 TRUE TRUE TRUE 16334 16694 16861 59 22 39 NCRP
48291 Liberty County TX 29.46864352 46.86303273 56.32576776 TRUE TRUE TRUE 74269 77033 78117 224 361 440 NCRP
48293 Limestone County TX 53.80706324 52.94167876 59.93878592 TRUE TRUE TRUE 23093 23422 23524 126 124 141 NCRP
48295 Lipscomb County TX 23.67564368 NA NA TRUE 3115 3479 3553 8 NA NA NCRP
48297 Live Oak County TX 35.33568905 46.34310752 54.58605574 TRUE TRUE TRUE 11559 11868 12091 41 55 66 NCRP
48299 Llano County TX 19.76798627 24.21931361 34.3413634 TRUE TRUE TRUE 18502 19406 19510 38 47 67 NCRP
48301 Loving County TX NA NA NA 75 103 86 NA NA NA NCRP
48303 Lubbock County TX 42.74093966 34.44115011 35.54736133 TRUE TRUE TRUE 261761 290060 293974 1208 999 1045 NCRP
48305 Lynn County TX 59.92124636 36.79046952 31.19043493 TRUE TRUE TRUE 6192 5708 5771 35 21 18 NCRP
48307 McCulloch County TX 33.72681282 35.10470887 45.12745457 TRUE TRUE TRUE 8183 8261 8199 28 29 37 NCRP
48309 McLennan County TX 50.18624956 50.41210552 48.10200418 TRUE TRUE TRUE 224452 241807 243441 1191 1219 1171 NCRP
48311 McMullen County TX NA NA NA 765 772 805 NA NA NA NCRP
48313 Madison County TX 43.10029951 34.73478544 26.69360075 TRUE TRUE TRUE 13264 13819 13861 59 48 37 NCRP
48315 Marion County TX 49.8132005 33.20636781 48.28061878 TRUE TRUE TRUE 10992 10239 10149 52 34 49 NCRP
48317 Martin County TX 24.21307506 15.12001512 16.48351648 TRUE TRUE TRUE 4443 5291 5460 12 8 9 NCRP
48319 Mason County TX 14.87357462 NA NA TRUE 3862 4148 4071 6 NA NA NCRP
48321 Matagorda County TX 41.48584841 35.30667542 39.97918892 TRUE TRUE TRUE 36743 36537 36519 152 129 146 NCRP
48323 Maverick County TX 8.746355685 14.51070607 13.85405889 TRUE TRUE TRUE 50951 56510 57023 48 82 79 NCRP
48325 Medina County TX 19.13484692 21.11219018 16.07717042 TRUE TRUE TRUE 43936 47366 47894 89 100 77 NCRP
48327 Menard County TX NA 32.66448903 32.60363298 TRUE TRUE 2199 2143 2147 NA 7 7 NCRP
48329 Midland County TX 37.52925384 41.79033755 43.76564205 TRUE TRUE TRUE 125844 151949 155830 534 635 682 NCRP
48331 Milam County TX 42.85189569 46.29821008 46.17414248 TRUE TRUE TRUE 25082 24191 24256 105 112 112 NCRP
48333 Mills County TX 12.26742997 36.83995088 22.58726899 TRUE TRUE TRUE 4854 4886 4870 6 18 11 NCRP
48335 Mitchell County TX 27.6949297 36.67481663 46.27589246 TRUE TRUE TRUE 9279 8998 9076 26 33 42 NCRP
48337 Montague County TX 32.54016677 25.72678158 26.78203543 TRUE TRUE TRUE 19781 19435 19416 64 50 52 NCRP
48339 Montgomery County TX 19.42130032 24.7890232 25.22415584 TRUE TRUE TRUE 392497 499818 518947 917 1239 1309 NCRP
48341 Moore County TX 31.32234781 28.79899204 27.09048221 TRUE TRUE TRUE 20558 22223 22148 69 64 60 NCRP
48343 Morris County TX 52.06309737 29.72930684 36.09825002 TRUE TRUE TRUE 13168 12782 12743 67 38 46 NCRP
48345 Motley County TX NA NA NA 1236 1193 1153 NA NA NA NCRP
48347 Nacogdoches County TX 51.77844357 42.95137291 49.31011776 TRUE TRUE TRUE 61750 65190 65301 337 280 322 NCRP
48349 Navarro County TX 49.91333041 52.14717553 58.3048034 TRUE TRUE TRUE 47338 48133 48195 239 251 281 NCRP
48351 Newton County TX 43.23570432 21.11337884 26.17060405 TRUE TRUE TRUE 14349 14209 14138 62 30 37 NCRP
48353 Nolan County TX 47.06038311 45.10181071 46.37911615 TRUE TRUE TRUE 14740 15077 15093 71 68 70 NCRP
48355 Nueces County TX 40.69634023 48.02216669 45.87040068 TRUE TRUE TRUE 329113 352962 356221 1401 1695 1634 NCRP
48357 Ochiltree County TX 52.54609726 13.97428731 24.16806098 TRUE TRUE TRUE 9557 10734 10758 55 15 26 NCRP
48359 Oldham County TX NA 90.47619048 53.14009662 TRUE TRUE 2010 2100 2070 NA 19 11 NCRP
48361 Orange County TX 55.60141796 52.06073753 51.05893352 TRUE TRUE TRUE 81687 82980 83433 458 432 426 NCRP
48363 Palo Pinto County TX 45.68654745 54.07534737 59.08314351 TRUE TRUE TRUE 27859 27924 28096 128 151 166 NCRP
48365 Panola County TX 29.73572894 24.34417629 25.24296352 TRUE TRUE TRUE 23456 23825 23769 71 58 60 NCRP
48367 Parker County TX 27.3468492 37.35223406 38.40407911 TRUE TRUE TRUE 105387 120207 123164 324 449 473 NCRP
48369 Parmer County TX 25.59307018 24.07221665 13.12071054 TRUE TRUE TRUE 10035 9970 9908 26 24 13 NCRP
48371 Pecos County TX 27.58178319 30.52658357 31.46039137 TRUE TRUE TRUE 15403 15724 15893 43 48 50 NCRP
48373 Polk County TX 44.27882508 56.02668353 57.29291 TRUE TRUE TRUE 45495 45871 46079 202 257 264 NCRP
48375 Potter County TX 74.3873739 72.86362222 76.54550388 TRUE TRUE TRUE 119780 122146 121627 904 890 931 NCRP
48377 Presidio County TX 7.91661169 NA NA TRUE 7638 7264 6976 6 NA NA NCRP
48379 Rains County TX 47.32004732 42.66521423 21.75489485 TRUE TRUE TRUE 10830 11016 11032 52 47 24 NCRP
48381 Randall County TX 25.59685362 31.26875336 31.66432694 TRUE TRUE TRUE 112464 126644 128220 315 396 406 NCRP
48383 Reagan County TX 26.15518745 13.78549766 18.64181092 TRUE TRUE TRUE 3160 3627 3755 9 5 7 NCRP
48385 Real County TX 44.80286738 30.03905077 20.76535153 TRUE TRUE TRUE 3264 3329 3371 15 10 7 NCRP
48387 Red River County TX 41.70273035 48.7804878 62.67073759 TRUE TRUE TRUE 13237 12505 12446 53 61 78 NCRP
48389 Reeves County TX 34.84573503 41.91233928 62.72214092 TRUE TRUE TRUE 12747 14077 14349 48 59 90 NCRP
48391 Refugio County TX 66.87593831 77.05008255 52.04053684 TRUE TRUE TRUE 7548 7268 7302 49 56 38 NCRP
48393 Roberts County TX NA NA NA 849 923 928 NA NA NA NCRP
48395 Robertson County TX 34.99456981 34.62730089 38.18181818 TRUE TRUE TRUE 16581 16461 16500 58 57 63 NCRP
48397 Rockwall County TX 29.12861022 33.06366514 31.2040907 TRUE TRUE TRUE 66117 85290 87809 236 282 274 NCRP
48399 Runnels County TX 60.3506083 42.71015337 43.20276498 TRUE TRUE TRUE 10587 10302 10416 63 44 45 NCRP
48401 Rusk County TX 20.9314495 22.60389454 27.44654415 TRUE TRUE TRUE 50415 53973 53923 112 122 148 NCRP
48403 Sabine County TX 18.86080724 28.87669651 31.88405797 TRUE TRUE TRUE 10583 10389 10350 20 30 33 NCRP
48405 San Augustine County TX 6.775832863 36.60908363 33.68176539 TRUE TRUE TRUE 9128 8741 8610 6 32 29 NCRP
48407 San Jacinto County TX 25.49776895 22.3847187 35.05664416 TRUE TRUE TRUE 25151 26804 27099 68 60 95 NCRP
48409 San Patricio County TX 32.8170526 37.88278974 37.21138758 TRUE TRUE TRUE 67022 66257 66915 214 251 249 NCRP
48411 San Saba County TX 31.40495868 22.75910364 33.79580221 TRUE TRUE TRUE 5985 5712 5622 19 13 19 NCRP
48413 Schleicher County TX 18.09408926 34.4072568 22.13788741 TRUE TRUE TRUE 3085 3197 3162 6 11 7 NCRP
48415 Scurry County TX 48.78335488 23.74471535 46.16805171 TRUE TRUE TRUE 16232 17267 17328 83 41 80 NCRP
48417 Shackelford County TX 20.82093992 17.78304683 23.93060126 TRUE TRUE TRUE 3287 3374 3343 7 6 8 NCRP
48419 Shelby County TX 26.87229817 19.71776532 13.71742112 TRUE TRUE TRUE 25324 25865 25515 69 51 35 NCRP
48421 Sherman County TX 16.40419948 NA NA TRUE 2946 3085 3084 5 NA NA NCRP
48423 Smith County TX 50.51195183 50.02999954 50.12748924 TRUE TRUE TRUE 196124 216670 218842 1072 1084 1097 NCRP
48425 Somervell County TX 39.82663699 26.66975881 47.1589602 TRUE TRUE TRUE 7853 8624 8694 34 23 41 NCRP
48427 Starr County TX 10.92076739 19.23385158 20.49082678 TRUE TRUE TRUE 59050 62390 62955 67 120 129 NCRP
48429 Stephens County TX 24.22837881 48.12834225 39.34077618 TRUE TRUE TRUE 9450 9350 9405 23 45 37 NCRP
48431 Sterling County TX 36.81885125 65.04065041 37.34129948 TRUE TRUE TRUE 1124 1230 1339 5 8 5 NCRP
48433 Stonewall County TX NA NA 57.02066999 TRUE 1425 1430 1403 NA NA 8 NCRP
48435 Sutton County TX 34.49975357 44.98875281 55.387714 TRUE TRUE TRUE 4299 4001 3972 14 18 22 NCRP
48437 Swisher County TX 33.30344563 30.92385002 31.6580926 TRUE TRUE TRUE 7901 7761 7581 26 24 24 NCRP
48439 Tarrant County TX 29.38180276 31.68328419 31.23843402 TRUE TRUE TRUE 1662005 1913943 1945360 5431 6064 6077 NCRP
48441 Taylor County TX 47.51561227 51.61878296 48.46717921 TRUE TRUE TRUE 127838 133866 135143 630 691 655 NCRP
48443 Terrell County TX 59.73715651 NA NA TRUE 921 905 927 5 NA NA NCRP
48445 Terry County TX 70.38911737 36.89457571 51.80940419 TRUE TRUE TRUE 12448 12739 12739 89 47 66 NCRP
48447 Throckmorton County TX 30.80714726 NA 43.53233831 TRUE TRUE 1710 1598 1608 5 NA 7 NCRP
48449 Titus County TX 22.24969098 44.40497336 39.06971021 TRUE TRUE TRUE 29541 32654 32506 72 145 127 NCRP
48451 Tom Green County TX 51.62143093 55.93493106 61.31654775 TRUE TRUE TRUE 106125 114955 116608 578 643 715 NCRP
48453 Travis County TX 31.64830783 22.23116853 21.06598213 TRUE TRUE TRUE 925151 1122748 1151145 3365 2496 2425 NCRP
48455 Trinity County TX 53.94190871 44.44135824 54.13385827 TRUE TRUE TRUE 14376 14401 14224 78 64 77 NCRP
48457 Tyler County TX 27.7533651 31.69719853 22.41105612 TRUE TRUE TRUE 21034 21453 21418 60 68 48 NCRP
48459 Upshur County TX 22.95660949 31.6662478 31.96709124 TRUE TRUE TRUE 38004 39790 40354 91 126 129 NCRP
48461 Upton County TX NA 17.86777844 17.37116387 TRUE TRUE 3174 3358 3454 NA 6 6 NCRP
48463 Uvalde County TX 19.94130484 21.54852133 17.70107313 TRUE TRUE TRUE 26301 26916 27117 53 58 48 NCRP
48465 Val Verde County TX 16.21177919 16.71456817 14.90586842 TRUE TRUE TRUE 47401 49059 48974 79 82 73 NCRP
48467 Van Zandt County TX 25.13567552 22.6830849 33.26403326 TRUE TRUE TRUE 52194 52462 52910 132 119 176 NCRP
48469 Victoria County TX 31.6800654 53.81534126 49.18698741 TRUE TRUE TRUE 84528 90123 91081 279 485 448 NCRP
48471 Walker County TX 23.34458963 16.7021828 19.20073364 TRUE TRUE TRUE 65591 69452 69789 159 116 134 NCRP
48473 Waller County TX 17.79359431 21.7658957 17.51388296 TRUE TRUE TRUE 38260 45484 46820 78 99 82 NCRP
48475 Ward County TX 24.91694352 46.24277457 57.6344086 TRUE TRUE TRUE 10301 11245 11625 27 52 67 NCRP
48477 Washington County TX 40.16182854 28.97363107 35.13560602 TRUE TRUE TRUE 32199 34169 34438 136 99 121 NCRP
48479 Webb County TX 9.143386349 9.970732299 8.399800505 TRUE TRUE TRUE 229307 263772 266673 233 263 224 NCRP
48481 Wharton County TX 33.9929586 28.14509281 23.80489701 TRUE TRUE TRUE 41073 41215 41168 140 116 98 NCRP
48483 Wheeler County TX 36.19254434 48.7804878 45.50227511 TRUE TRUE TRUE 5055 5740 5714 20 28 26 NCRP
48485 Wichita County TX 33.7246304 39.29184014 44.19931246 TRUE TRUE TRUE 131376 132343 132355 443 520 585 NCRP
48487 Wilbarger County TX 46.36900755 62.33845218 57.04154783 TRUE TRUE TRUE 13835 13154 12973 62 82 74 NCRP
48489 Willacy County TX 22.23331367 37.35252585 38.8074693 TRUE TRUE TRUE 21463 21953 21903 49 82 85 NCRP
48491 Williamson County TX 18.6433191 13.1147541 11.97751661 TRUE TRUE TRUE 351970 471225 489250 823 618 586 NCRP
48493 Wilson County TX 20.79857381 23.54857168 24.78341451 TRUE TRUE TRUE 39007 45438 46402 91 107 115 NCRP
48495 Winkler County TX 53.71900826 24.92130115 49.86574607 TRUE TRUE TRUE 6642 7624 7821 39 19 39 NCRP
48497 Wise County TX 19.36754934 25.57251283 27.58038872 TRUE TRUE TRUE 56569 61003 61638 116 156 170 NCRP
48499 Wood County TX 36.35154078 28.1888654 28.23672174 TRUE TRUE TRUE 41099 42570 42852 153 120 121 NCRP
48501 Yoakum County TX 21.25531383 31.8627451 30.1713734 TRUE TRUE TRUE 7404 8160 8286 17 26 25 NCRP
48503 Young County TX 28.26855124 33.23164088 37.60217984 TRUE TRUE TRUE 18227 18356 18350 52 61 69 NCRP
48505 Zapata County TX 8.472182999 13.23488437 16.0625742 TRUE TRUE TRUE 13069 14356 14319 12 19 23 NCRP
48507 Zavala County TX 16.03510845 17.19760871 17.11910002 TRUE TRUE TRUE 11642 12211 12267 19 21 21 NCRP
49001 Beaver County UT 30.63256241 20.11761065 38.69370067 TRUE TRUE TRUE 6281 6462 6461 20 13 25 NCRP
49003 Box Elder County UT 9.968102073 6.881094684 5.629100509 TRUE TRUE TRUE 45948 50864 51518 50 35 29 NCRP
49005 Cache County UT 10.59720969 9.034655575 7.436012269 TRUE TRUE TRUE 101236 117326 118343 121 106 88 NCRP
49007 Carbon County UT 24.02600462 27.71009507 34.8499516 TRUE TRUE TRUE 20072 20931 20660 51 58 72 NCRP
49009 Daggett County UT NA NA NA 984 1130 1117 NA NA NA NCRP
49011 Davis County UT 10.48460014 9.418938263 9.038739187 TRUE TRUE TRUE 278800 322754 329692 327 304 298 NCRP
49013 Duchesne County UT 24.07242661 24.86819855 31.89401374 TRUE TRUE TRUE 15823 20106 20380 46 50 65 NCRP
49015 Emery County UT 26.61771455 19.5968645 22.57548678 TRUE TRUE TRUE 10445 10716 10631 29 21 24 NCRP
49017 Garfield County UT 11.71188757 NA 11.94267516 TRUE TRUE 4670 5065 5024 6 NA 6 NCRP
49019 Grand County UT 34.52368109 14.94608733 23.33227278 TRUE TRUE TRUE 8787 9367 9429 32 14 22 NCRP
49021 Iron County UT 12.49057823 15.4155783 15.02041507 TRUE TRUE TRUE 42000 46706 47269 58 72 71 NCRP
49023 Juab County UT 8.737864078 24.20838578 20.98035476 TRUE TRUE TRUE 9175 10327 10486 9 25 22 NCRP
49025 Kane County UT 19.50947603 8.285004143 12.40694789 TRUE TRUE TRUE 6678 7242 7254 14 6 9 NCRP
49027 Millard County UT 9.567089213 12.67025657 16.65873394 TRUE TRUE TRUE 11946 12628 12606 12 16 21 NCRP
49029 Morgan County UT NA NA NA 8342 10198 10608 NA NA NA NCRP
49031 Piute County UT NA NA NA 1429 1523 1484 NA NA NA NCRP
49033 Rich County UT NA NA NA 2035 2276 2293 NA NA NA NCRP
49035 Salt Lake County UT 11.73312576 8.428426836 7.245301546 TRUE TRUE TRUE 966798 1080866 1091742 1230 911 791 NCRP
49037 San Juan County UT 10.81446435 6.004002668 6.556947085 TRUE TRUE TRUE 13679 14990 15251 16 9 10 NCRP
49039 Sanpete County UT 9.308986753 14.87094147 10.88597816 TRUE TRUE TRUE 25051 28243 28477 26 42 31 NCRP
49041 Sevier County UT 12.02038658 7.196315486 14.44182352 TRUE TRUE TRUE 19844 20844 20773 25 15 30 NCRP
49043 Summit County UT 3.491620112 2.860635061 3.835826621 TRUE TRUE TRUE 34242 38453 39105 13 11 15 NCRP
49045 Tooele County UT 14.8849797 16.30488488 8.928861327 TRUE TRUE TRUE 51483 60718 61598 88 99 55 NCRP
49047 Uintah County UT 20.46141984 22.69543289 20.88588711 TRUE TRUE TRUE 28662 35690 36867 69 81 77 NCRP
49049 Utah County UT 4.629087295 6.993691183 7.593934835 TRUE TRUE TRUE 448296 551926 560974 245 386 426 NCRP
49051 Wasatch County UT 4.482112297 10.16451455 7.216569243 TRUE TRUE TRUE 20755 26563 27714 11 27 20 NCRP
49053 Washington County UT 10.85256022 8.529708433 8.094874562 TRUE TRUE TRUE 126796 147719 151948 154 126 123 NCRP
49055 Wayne County UT NA NA NA 2594 2732 2723 NA NA NA NCRP
49057 Weber County UT 36.17378811 27.13675751 23.03773781 TRUE TRUE TRUE 212656 238422 240475 846 647 554 NCRP
50001 Addison County VT NA NA NA 36758 36898 37009 NA NA NA NCRP
50003 Bennington County VT NA NA NA 37127 36692 36445 NA NA NA NCRP
50005 Caledonia County VT NA NA NA 31252 31151 30981 NA NA NA NCRP
50007 Chittenden County VT NA NA NA 152861 159818 160531 NA NA NA NCRP
50009 Essex County VT NA NA NA 6341 6196 6125 NA NA NA NCRP
50011 Franklin County VT NA NA NA 47392 48272 48642 NA NA NA NCRP
50013 Grand Isle County VT NA NA NA 7173 6982 6994 NA NA NA NCRP
50015 Lamoille County VT NA NA NA 23642 25050 25082 NA NA NA NCRP
50017 Orange County VT NA NA NA 29249 28879 28859 NA NA NA NCRP
50019 Orleans County VT NA NA NA 27215 27170 27082 NA NA NA NCRP
50021 Rutland County VT NA NA NA 62894 60545 60086 NA NA NA NCRP
50023 Washington County VT NA NA NA 59414 59221 58998 NA NA NA NCRP
50025 Windham County VT NA NA NA 44390 43808 43714 NA NA NA NCRP
50027 Windsor County VT NA NA NA 57184 56173 56014 NA NA NA NCRP
51001 Accomack County VA 17.72357235 14.53620423 NA TRUE TRUE 35192 33021 33021 59 48 NA NCRP
51003 Albemarle County VA 9.141857784 6.503970334 NA TRUE TRUE 93852 103014 104489 92 67 NA NCRP
51005 Alleghany County VA 32.63546798 21.71081198 NA TRUE TRUE 16564 16121 15820 53 35 NA NCRP
51007 Amelia County VA 16.51982379 12.57169796 NA TRUE TRUE 12250 12727 12855 21 16 NA NCRP
51009 Amherst County VA 15.81689617 16.77383282 NA TRUE TRUE 32094 32193 32041 51 54 NA NCRP
51011 Appomattox County VA 21.9210841 21.01116218 NA TRUE TRUE 14215 15230 15279 33 32 NA NCRP
51013 Arlington County VA 17.08081038 8.760596782 NA TRUE TRUE 188176 226012 226908 367 198 NA NCRP
51015 Augusta County VA 11.5291756 12.46021535 NA TRUE TRUE 71896 73835 73862 85 92 NA NCRP
51017 Bath County VA NA NA NA 4823 4607 4563 NA NA NA NCRP
51019 Bedford County VA 8.095410192 6.469500924 NA TRUE TRUE 66363 75740 76583 56 49 NA NCRP
51021 Bland County VA 11.77336277 19.41747573 NA TRUE TRUE 6840 6695 6625 8 13 NA NCRP
51023 Botetourt County VA 20.25637925 19.3769112 NA TRUE TRUE 32491 33029 33100 67 64 NA NCRP
51025 Brunswick County VA 37.74680604 39.61822438 NA TRUE TRUE 18011 16659 16498 65 66 NA NCRP
51027 Buchanan County VA 20.90301003 34.38760348 NA TRUE TRUE 25009 23555 23106 50 81 NA NCRP
51029 Buckingham County VA 11.09424267 12.84521516 NA TRUE TRUE 16547 17127 16913 19 22 NA NCRP
51031 Campbell County VA 17.82887915 17.13733569 NA TRUE TRUE 53475 54851 54885 98 94 NA NCRP
51033 Caroline County VA 7.650311229 16.39064367 NA TRUE TRUE 26722 29285 29778 22 48 NA NCRP
51035 Carroll County VA 14.67694053 14.41163656 NA TRUE TRUE 29894 29837 29621 44 43 NA NCRP
51036 Charles City County VA 27.75850104 16.88713763 NA TRUE TRUE 7156 7106 7023 20 12 NA NCRP
51037 Charlotte County VA 9.616925789 9.746588694 NA TRUE TRUE 12731 12312 12225 12 12 NA NCRP
51041 Chesterfield County VA 13.63792404 10.27777439 NA TRUE TRUE 298496 327892 332499 437 337 NA NCRP
51043 Clarke County VA 11.97942358 4.878728743 NA TRUE TRUE 13939 14348 14423 17 7 NA NCRP
51045 Craig County VA NA NA NA 5158 5196 5234 NA NA NA NCRP
51047 Culpeper County VA 13.52207902 10.72430292 NA TRUE TRUE 44076 48488 49166 64 52 NA NCRP
51049 Cumberland County VA 20.11465353 10.16466762 NA TRUE TRUE 9596 9838 9827 20 10 NA NCRP
51051 Dickenson County VA 16.5089847 33.01184543 NA TRUE TRUE 15958 15449 15308 26 51 NA NCRP
51053 Dinwiddie County VA 21.08875147 12.89121249 NA TRUE TRUE 26590 27926 27859 59 36 NA NCRP
51057 Essex County VA 20.57245081 20.53571429 NA TRUE TRUE 10576 11200 11103 23 23 NA NCRP
51059 Fairfax County VA 4.504704965 3.429056005 NA TRUE TRUE 1018981 1134423 1137538 496 389 NA NCRP
51061 Fauquier County VA 17.72324472 15.02238484 NA TRUE TRUE 63761 67233 68248 117 101 NA NCRP
51063 Floyd County VA 9.758636393 33.48789284 NA TRUE TRUE 14762 15528 15578 15 52 NA NCRP
51065 Fluvanna County VA 10.05413766 7.331378299 NA TRUE TRUE 24638 25916 26092 26 19 NA NCRP
51067 Franklin County VA 18.32903283 19.15301128 NA TRUE TRUE 53037 56388 56358 103 108 NA NCRP
51069 Frederick County VA 7.299913156 13.16809629 NA TRUE TRUE 72456 81257 82377 58 107 NA NCRP
51071 Giles County VA 15.77932324 33.65015644 NA TRUE TRUE 17161 16939 16815 27 57 NA NCRP
51073 Gloucester County VA 13.01942064 15.19756839 NA TRUE TRUE 36220 36848 37141 48 56 NA NCRP
51075 Goochland County VA 11.12914445 4.159157077 NA TRUE TRUE 20176 21639 21936 24 9 NA NCRP
51077 Grayson County VA 18.85933537 21.74486031 NA TRUE TRUE 16096 15176 15093 29 33 NA NCRP
51079 Greene County VA 15.6107014 14.86278465 NA TRUE TRUE 17607 18839 19031 29 28 NA NCRP
51081 Greensville County VA 46.36529227 56.9679449 NA TRUE TRUE 12048 11761 11681 56 67 NA NCRP
51083 Halifax County VA 16.13890589 13.84611037 NA TRUE TRUE 36383 35389 35200 58 49 NA NCRP
51085 Hanover County VA 19.33657603 9.486353485 NA TRUE TRUE 98025 101198 101918 194 96 NA NCRP
51087 Henrico County VA 16.83188035 11.66352608 NA TRUE TRUE 291460 318943 321924 524 372 NA NCRP
51089 Henry County VA 21.14085798 19.79934129 NA TRUE TRUE 55464 52527 52081 113 104 NA NCRP
51091 Highland County VA NA NA NA 2479 2219 2248 NA NA NA NCRP
51093 Isle of Wight County VA 12.7215673 10.94183991 NA TRUE TRUE 33716 35643 36007 45 39 NA NCRP
51095 James City County VA NA NA NA 61133 70964 72583 NA NA NA NCRP
51097 King and Queen County VA 29.91452991 9.834223096 NA TRUE TRUE 6915 7118 7175 21 7 NA NCRP
51099 King George County VA 17.80464577 12.8256513 NA TRUE TRUE 21519 24950 25371 43 32 NA NCRP
51101 King William County VA 16.91835328 9.315034466 NA TRUE TRUE 14874 16103 16186 27 15 NA NCRP
51103 Lancaster County VA 16.80969654 12.58087707 NA TRUE TRUE 11551 11128 11044 19 14 NA NCRP
51105 Lee County VA 27.4542103 40.86977224 NA TRUE TRUE 25228 25202 24951 70 103 NA NCRP
51107 Loudoun County VA 3.491823314 4.672910511 NA TRUE TRUE 267194 350959 363050 114 164 NA NCRP
51109 Louisa County VA 15.57632399 14.11598635 NA TRUE TRUE 30946 34004 34348 52 48 NA NCRP
51111 Lunenburg County VA 25.86409593 12.80204833 NA TRUE TRUE 13070 12498 12466 33 16 NA NCRP
51113 Madison County VA 6.792965507 11.37483886 NA TRUE TRUE 13291 13187 13157 9 15 NA NCRP
51115 Mathews County VA 12.300123 13.44989913 NA TRUE TRUE 8987 8922 8836 11 12 NA NCRP
51117 Mecklenburg County VA 20.14005081 30.3165688 NA TRUE TRUE 32642 31336 31192 65 95 NA NCRP
51119 Middlesex County VA 7.372592388 15.80219372 NA TRUE TRUE 10732 10758 10696 8 17 NA NCRP
51121 Montgomery County VA 7.796860183 15.20228345 NA TRUE TRUE 90062 96696 97244 74 147 NA NCRP
51125 Nelson County VA 8.701472557 16.90445601 NA TRUE TRUE 14809 14789 14850 13 25 NA NCRP
51127 New Kent County VA 14.3685807 14.88553537 NA TRUE TRUE 16680 19482 20021 27 29 NA NCRP
51131 Northampton County VA 29.1757841 23.17497103 NA TRUE TRUE 12776 12082 12121 36 28 NA NCRP
51133 Northumberland County VA 20.26917464 11.44632491 NA TRUE TRUE 12430 12231 12251 25 14 NA NCRP
51135 Nottoway County VA 21.4348758 15.2856506 NA TRUE TRUE 15719 15701 15579 34 24 NA NCRP
51137 Orange County VA 7.956621677 8.953585767 NA TRUE TRUE 31438 34623 35026 27 31 NA NCRP
51139 Page County VA 22.52346194 26.08439564 NA TRUE TRUE 24045 23769 23848 54 62 NA NCRP
51141 Patrick County VA 13.55380862 26.20659533 NA TRUE TRUE 18766 18316 18264 25 48 NA NCRP
51143 Pittsylvania County VA 22.19509488 14.0694198 NA TRUE TRUE 62586 62547 62383 140 88 NA NCRP
51145 Powhatan County VA 9.605806176 9.560567969 NA TRUE TRUE 27391 28241 28449 27 27 NA NCRP
51147 Prince Edward County VA 31.51169818 25.41630149 NA TRUE TRUE 21722 22820 23074 73 58 NA NCRP
51149 Prince George County VA 15.90697164 15.54834732 NA TRUE TRUE 34575 37303 37333 58 58 NA NCRP
51153 Prince William County VA 9.119970816 7.883389449 NA TRUE TRUE 359174 440166 446094 380 347 NA NCRP
51155 Pulaski County VA 32.21352968 38.53732035 NA TRUE TRUE 34891 34512 34322 112 133 NA NCRP
51157 Rappahannock County VA 14.76906552 10.73393264 NA TRUE TRUE 7348 7453 7361 11 8 NA NCRP
51159 Richmond County VA 22.97592998 11.1719361 NA TRUE TRUE 9328 8951 8902 21 10 NA NCRP
51161 Roanoke County VA 10.23442213 10.56631161 NA TRUE TRUE 90489 93694 93785 95 99 NA NCRP
51163 Rockbridge County VA 21.48131573 25.96937405 NA TRUE TRUE 21931 22334 22327 48 58 NA NCRP
51165 Rockingham County VA 19.24952852 23.67625298 NA TRUE TRUE 73000 77715 78171 148 184 NA NCRP
51167 Russell County VA 21.64351044 36.42922827 NA TRUE TRUE 28618 28274 28023 62 103 NA NCRP
51169 Scott County VA 16.56495205 26.51113468 NA TRUE TRUE 23272 22632 22384 38 60 NA NCRP
51171 Shenandoah County VA 10.64584812 10.06342297 NA TRUE TRUE 40610 42729 43021 45 43 NA NCRP
51173 Smyth County VA 12.1955033 23.62874516 NA TRUE TRUE 32632 31741 31555 39 75 NA NCRP
51175 Southampton County VA 39.03708523 56.08709997 NA TRUE TRUE 18028 18186 18059 72 102 NA NCRP
51177 Spotsylvania County VA 9.974340205 10.9635384 NA TRUE TRUE 117891 127696 129188 124 140 NA NCRP
51179 Stafford County VA 19.78996853 18.3227728 NA TRUE TRUE 119892 136988 139992 261 251 NA NCRP
51181 Surry County VA 10.1126842 NA NA TRUE 6991 6794 6790 7 NA NA NCRP
51183 Sussex County VA 21.65403515 27.100271 NA TRUE TRUE 12193 11808 11767 26 32 NA NCRP
51185 Tazewell County VA 39.85312556 50.78558959 NA TRUE TRUE 44195 44107 43452 178 224 NA NCRP
51187 Warren County VA 14.27212179 15.80024348 NA TRUE TRUE 36231 38607 38987 54 61 NA NCRP
51191 Washington County VA 18.06437486 14.42579844 NA TRUE TRUE 53322 54763 54729 99 79 NA NCRP
51193 Westmoreland County VA 10.83732603 23.91527161 NA TRUE TRUE 16841 17562 17477 19 42 NA NCRP
51195 Wise County VA 23.08402585 39.63564746 NA TRUE TRUE 41531 40620 39935 95 161 NA NCRP
51197 Wythe County VA 16.39680262 28.97167593 NA TRUE TRUE 28628 29339 29121 48 85 NA NCRP
51199 York County VA 19.00793771 8.492053864 NA TRUE TRUE 63912 65944 66342 125 56 NA NCRP
51510 Alexandria city VA 10.85715877 5.491855979 NA TRUE TRUE 127676 149312 150575 156 82 NA NCRP
51515 Bedford city VA NA NA NA 6147 NA NA NA NA NA NCRP
51520 Bristol city VA 64.35950996 67.10254646 NA TRUE TRUE 17684 17436 17184 114 117 NA NCRP
51530 Buena Vista city VA 13.43484102 17.97752809 NA TRUE TRUE 6679 6675 6603 9 12 NA NCRP
51540 Charlottesville city VA 27.02517005 20.40227973 NA TRUE TRUE 41066 45093 45593 118 92 NA NCRP
51550 Chesapeake city VA 25.84254223 24.64946123 NA TRUE TRUE 217271 230431 233371 583 568 NA NCRP
51570 Colonial Heights city VA 30.89068131 32.75355771 NA TRUE TRUE 17604 17708 17731 54 58 NA NCRP
51580 Covington city VA NA NA NA 5979 5833 5802 NA NA NA NCRP
51590 Danville city VA 37.44534375 48.16460136 NA TRUE TRUE 44586 42770 42444 161 206 NA NCRP
51595 Emporia city VA NA NA NA 5734 5565 5462 NA NA NA NCRP
51600 Fairfax city VA NA NA NA 21407 24194 24483 NA NA NA NCRP
51610 Falls Church city VA NA NA NA 10852 13469 13601 NA NA NA NCRP
51620 Franklin city VA NA NA NA 8489 8632 8526 NA NA NA NCRP
51630 Fredericksburg city VA 60.54529328 62.45064963 NA TRUE TRUE 22479 27862 28350 157 174 NA NCRP
51640 Galax city VA NA NA NA 6879 7014 7014 NA NA NA NCRP
51650 Hampton city VA 29.27926283 14.53106289 NA TRUE TRUE 140839 136948 136879 401 199 NA NCRP
51660 Harrisonburg city VA NA NA NA 45858 51518 52478 NA NA NA NCRP
51670 Hopewell city VA 29.42618931 28.36687829 NA TRUE TRUE 22295 22209 22196 66 63 NA NCRP
51678 Lexington city VA NA NA NA 6978 7232 7311 NA NA NA NCRP
51680 Lynchburg city VA 27.59360247 20.4548342 NA TRUE TRUE 70919 78710 79047 211 161 NA NCRP
51683 Manassas city VA NA NA NA 35631 41725 42081 NA NA NA NCRP
51685 Manassas Park city VA NA NA NA 12490 15409 15174 NA NA NA NCRP
51690 Martinsville city VA 77.49130939 50.91649695 NA TRUE TRUE 14281 13748 13711 107 70 NA NCRP
51700 Newport News city VA 26.34995166 16.7568607 NA TRUE TRUE 183581 182015 182965 477 305 NA NCRP
51710 Norfolk city VA 49.8176902 27.49714844 NA TRUE TRUE 243406 245480 245428 1216 675 NA NCRP
51720 Norton city VA NA NA NA 3825 4017 4031 NA NA NA NCRP
51730 Petersburg city VA 48.8770649 30.06780597 NA TRUE TRUE 32181 32593 32701 158 98 NA NCRP
51735 Poquoson city VA NA NA NA 12008 12125 12048 NA NA NA NCRP
51740 Portsmouth city VA 53.59693851 31.71335288 NA TRUE TRUE 99213 96174 96004 514 305 NA NCRP
51750 Radford city VA 22.14905717 28.36140534 NA TRUE TRUE 16163 17277 17646 37 49 NA NCRP
51760 Richmond city VA 24.82225151 28.55093524 NA TRUE TRUE 198618 214704 217853 516 613 NA NCRP
51770 Roanoke city VA 29.17158852 19.43024844 NA TRUE TRUE 94247 98815 99428 284 192 NA NCRP
51775 Salem city VA 20.84168337 16.21707143 NA TRUE TRUE 24508 25282 25483 52 41 NA NCRP
51790 Staunton city VA 28.76318313 25.0842997 NA TRUE TRUE 23638 24318 24538 69 61 NA NCRP
51800 Suffolk city VA 26.51988402 20.05854296 NA TRUE TRUE 80291 85749 86806 225 172 NA NCRP
51810 Virginia Beach city VA 16.73636382 12.79745742 NA TRUE TRUE 437739 449308 450980 740 575 NA NCRP
51820 Waynesboro city VA 44.5518745 23.05882353 NA TRUE TRUE 20728 21250 21366 94 49 NA NCRP
51830 Williamsburg city VA 81.62425406 82.06171584 NA TRUE TRUE 12810 14745 14691 119 121 NA NCRP
51840 Winchester city VA 33.09888291 23.63894243 NA TRUE TRUE 25757 27497 27543 88 65 NA NCRP
53001 Adams County WA 9.573449633 11.53463011 11.47087961 TRUE TRUE TRUE 16997 19073 19179 18 22 22 NCRP
53003 Asotin County WA 23.39234933 20.35830619 20.28031908 TRUE TRUE TRUE 21133 22104 22189 51 45 45 NCRP
53005 Benton County WA 14.86099937 13.49937382 14.15655867 TRUE TRUE TRUE 159564 184453 186486 266 249 264 NCRP
53007 Chelan County WA 19.1657426 12.42621932 14.2114013 TRUE TRUE TRUE 69536 74037 74588 140 92 106 NCRP
53009 Clallam County WA 12.12864731 10.51903114 9.901670907 TRUE TRUE TRUE 69642 72250 72715 87 76 72 NCRP
53011 Clark County WA 13.29329163 13.85029054 12.30576841 TRUE TRUE TRUE 401698 443312 451008 575 614 555 NCRP
53013 Columbia County WA NA 24.77700694 15.05646173 TRUE TRUE 3895 4036 3985 NA 10 6 NCRP
53015 Cowlitz County WA 34.66849476 32.04592594 30.84213721 TRUE TRUE TRUE 99162 101729 102133 354 326 315 NCRP
53017 Douglas County WA 5.92676579 9.630249119 7.536930962 TRUE TRUE TRUE 35558 39459 39804 23 38 30 NCRP
53019 Ferry County WA 10.49455595 6.524859716 15.65149341 TRUE TRUE TRUE 7562 7663 7667 8 5 12 NCRP
53021 Franklin County WA 11.85311908 11.31456808 12.64107324 TRUE TRUE TRUE 64585 86614 87809 97 98 111 NCRP
53023 Garfield County WA NA 22.24199288 22.57336343 TRUE TRUE 2245 2248 2215 NA 5 5 NCRP
53025 Grant County WA 9.423294384 14.11754485 18.25072198 TRUE TRUE TRUE 81036 92084 93147 85 130 170 NCRP
53027 Grays Harbor County WA 20.66803529 19.71803214 21.74588381 TRUE TRUE TRUE 71256 71001 70818 149 140 154 NCRP
53029 Island County WA 5.202649544 5.344259375 6.05487228 TRUE TRUE TRUE 79136 78589 79275 41 42 48 NCRP
53031 Jefferson County WA 5.35439395 6.319220408 6.94720127 TRUE TRUE TRUE 29239 30067 30228 16 19 21 NCRP
53033 King County WA 8.655062097 6.487682197 5.586627096 TRUE TRUE TRUE 1822967 2046956 2079967 1709 1328 1162 NCRP
53035 Kitsap County WA 15.23624088 15.67899528 14.24170775 TRUE TRUE TRUE 245054 253205 254183 385 397 362 NCRP
53037 Kittitas County WA 9.44515754 12.68519183 11.05310192 TRUE TRUE TRUE 38680 41781 42522 39 53 47 NCRP
53039 Klickitat County WA 11.19929883 9.115770283 13.42217535 TRUE TRUE TRUE 19701 20843 20861 23 19 28 NCRP
53041 Lewis County WA 24.79481298 29.69295092 26.75433926 TRUE TRUE TRUE 73318 75102 75128 187 223 201 NCRP
53043 Lincoln County WA 5.724644595 14.58718273 12.68292683 TRUE TRUE TRUE 10418 10283 10250 6 15 13 NCRP
53045 Mason County WA 17.31330486 20.81921977 17.789198 TRUE TRUE TRUE 56872 60521 60711 105 126 108 NCRP
53047 Okanogan County WA 11.66662616 19.6907818 24.21893921 TRUE TRUE TRUE 39322 41136 41290 48 81 100 NCRP
53049 Pacific County WA 26.9476926 37.19291377 21.88609503 TRUE TRUE TRUE 21326 20434 20561 56 76 45 NCRP
53051 Pend Oreille County WA 4.631058969 13.9275766 14.632268 TRUE TRUE TRUE 12681 12924 12985 6 18 19 NCRP
53053 Pierce County WA 16.05345689 15.20325669 12.99391293 TRUE TRUE TRUE 763408 820219 831928 1293 1247 1081 NCRP
53055 San Juan County WA NA NA 4.370902279 TRUE 15270 15871 16015 NA NA 7 NCRP
53057 Skagit County WA 13.77070919 18.94864496 15.61915839 TRUE TRUE TRUE 112621 118742 120365 162 225 188 NCRP
53059 Skamania County WA 18.87470789 16.88138605 14.99118166 TRUE TRUE TRUE 10583 11255 11340 21 19 17 NCRP
53061 Snohomish County WA 7.465910048 7.770153501 8.057052356 TRUE TRUE TRUE 670706 746446 759583 541 580 612 NCRP
53063 Spokane County WA 14.28776444 11.01544457 11.66588894 TRUE TRUE TRUE 447517 479327 484318 677 528 565 NCRP
53065 Stevens County WA 5.055960288 8.749107821 7.331042383 TRUE TRUE TRUE 42366 43433 43650 22 38 32 NCRP
53067 Thurston County WA 12.92564823 12.11147124 11.09644124 TRUE TRUE TRUE 232688 262561 265851 331 318 295 NCRP
53069 Wahkiakum County WA NA NA NA 3936 4044 4067 NA NA NA NCRP
53071 Walla Walla County WA 11.16902457 10.7315928 10.52737117 TRUE TRUE TRUE 56705 59637 59844 66 64 63 NCRP
53073 Whatcom County WA 13.48352205 13.47891858 13.58284817 TRUE TRUE TRUE 188926 206248 208351 274 278 283 NCRP
53075 Whitman County WA 1.757778168 1.49707002 3.203280159 TRUE TRUE TRUE 42827 46758 46827 8 7 15 NCRP
53077 Yakima County WA 12.13959306 17.59018508 18.04697057 TRUE TRUE TRUE 230617 247297 247687 297 435 447 NCRP
54001 Barbour County WV 16.21134794 12.5029769 10.73601336 TRUE TRUE TRUE 15922 16796 16766 27 21 18 NCRP
54003 Berkeley County WV 11.43537595 13.15741047 12.12702607 TRUE TRUE TRUE 96318 108684 110497 121 143 134 NCRP
54005 Boone County WV 12.23640739 27.40067256 20.66289955 TRUE TRUE TRUE 25101 24087 23714 30 66 49 NCRP
54007 Braxton County WV 25.47507574 31.15264798 31.80529627 TRUE TRUE TRUE 14585 14445 14463 37 45 46 NCRP
54009 Brooke County WV 15.46047134 17.29519953 20.82447939 TRUE TRUE TRUE 24399 23706 23530 37 41 49 NCRP
54011 Cabell County WV 15.52730736 20.06565069 24.19961075 TRUE TRUE TRUE 94943 97181 97109 150 195 235 NCRP
54013 Calhoun County WV 6.57635144 9.292446568 22.62744576 TRUE TRUE TRUE 7531 7533 7513 5 7 17 NCRP
54015 Clay County WV 24.5936698 27.16800696 30.19796443 TRUE TRUE TRUE 9695 9202 8941 23 25 27 NCRP
54017 Doddridge County WV 12.17581882 14.25686111 15.49278989 TRUE TRUE TRUE 7848 8417 8391 10 12 13 NCRP
54019 Fayette County WV 13.51086317 25.89593346 30.79854649 TRUE TRUE TRUE 46200 45567 45132 62 118 139 NCRP
54021 Gilmer County WV 6.914035492 25.43352601 23.20724066 TRUE TRUE TRUE 8083 8650 8618 6 22 20 NCRP
54023 Grant County WV 20.22074311 12.72480489 15.40172842 TRUE TRUE TRUE 11834 11788 11687 24 15 18 NCRP
54025 Greenbrier County WV 23.88445543 21.25933593 24.25952045 TRUE TRUE TRUE 35196 35749 35450 85 76 86 NCRP
54027 Hampshire County WV 12.63370673 15.34069118 24.27287825 TRUE TRUE TRUE 23016 23467 23483 30 36 57 NCRP
54029 Hancock County WV 24.24877937 18.5252572 17.26886291 TRUE TRUE TRUE 31266 30229 30112 74 56 52 NCRP
54031 Hardy County WV 10.77431404 22.18564374 20.11060835 TRUE TRUE TRUE 13611 13973 13923 15 31 28 NCRP
54033 Harrison County WV 16.0687918 21.7624699 21.81469147 TRUE TRUE TRUE 68141 68926 68761 111 150 150 NCRP
54035 Jackson County WV 15.73779466 27.75208141 23.34683788 TRUE TRUE TRUE 28877 29187 29126 46 81 68 NCRP
54037 Jefferson County WV 4.248951617 7.459835156 9.872022688 TRUE TRUE TRUE 50003 54961 55713 23 41 55 NCRP
54039 Kanawha County WV 12.79177998 20.53355905 18.76744663 TRUE TRUE TRUE 192954 191394 190223 246 393 357 NCRP
54041 Lewis County WV 14.01498995 18.83925858 37.1633971 TRUE TRUE TRUE 16445 16455 16414 23 31 61 NCRP
54043 Lincoln County WV 10.61865189 13.01115242 16.69681369 TRUE TRUE TRUE 22064 21520 21561 23 28 36 NCRP
54045 Logan County WV 27.16645629 28.34829493 22.91501641 TRUE TRUE TRUE 36440 35981 35348 99 102 81 NCRP
54047 McDowell County WV 24.0173664 15.31833413 22.98513302 TRUE TRUE TRUE 23199 20890 20448 52 32 47 NCRP
54049 Marion County WV 14.47075848 15.6806089 12.14724574 TRUE TRUE TRUE 56284 56758 56803 82 89 69 NCRP
54051 Marshall County WV 10.35322777 10.74278699 11.10562685 TRUE TRUE TRUE 33814 32580 32416 34 35 36 NCRP
54053 Mason County WV 18.33449452 20.9975687 20.35830619 TRUE TRUE TRUE 26648 27146 27016 50 57 55 NCRP
54055 Mercer County WV 34.85327894 34.40478113 39.97734078 TRUE TRUE TRUE 61297 61910 61785 217 213 247 NCRP
54057 Mineral County WV 8.20988756 10.8275887 11.9660599 TRUE TRUE TRUE 27324 27707 27578 23 30 33 NCRP
54059 Mingo County WV 23.43159486 35.45552644 16.72110748 TRUE TRUE TRUE 27054 25948 25716 62 92 43 NCRP
54061 Monongalia County WV 9.544794533 12.62020995 11.98496081 TRUE TRUE TRUE 89656 102217 103463 94 129 124 NCRP
54063 Monroe County WV 3.700414446 31.10650274 26.50566927 TRUE TRUE TRUE 13382 13502 13582 5 42 36 NCRP
54065 Morgan County WV 22.85453091 23.53346344 26.92946771 TRUE TRUE TRUE 17038 17422 17453 40 41 47 NCRP
54067 Nicholas County WV 24.83949862 23.85808289 21.68273512 TRUE TRUE TRUE 26205 25987 25827 65 62 56 NCRP
54069 Ohio County WV 25.59108615 23.09732894 19.15620384 TRUE TRUE TRUE 44925 43728 43328 113 101 83 NCRP
54071 Pendleton County WV 23.67486518 16.12253124 20.35002035 TRUE TRUE TRUE 7922 7443 7371 18 12 15 NCRP
54073 Pleasants County WV 6.577216522 7.898894155 7.859575583 TRUE TRUE TRUE 7670 7596 7634 5 6 6 NCRP
54075 Pocahontas County WV 28.65986473 8.07102502 5.772338952 TRUE TRUE TRUE 8938 8673 8662 25 7 5 NCRP
54077 Preston County WV 10.69328106 10.67995728 9.470818042 TRUE TRUE TRUE 32238 33708 33788 36 36 32 NCRP
54079 Putnam County WV 12.31417201 16.08171633 14.09194997 TRUE TRUE TRUE 54207 56586 56770 69 91 80 NCRP
54081 Raleigh County WV 12.65934956 17.55077643 14.18693524 TRUE TRUE TRUE 78178 78629 78241 100 138 111 NCRP
54083 Randolph County WV 11.90516684 16.57309071 16.99004383 TRUE TRUE TRUE 29049 29566 29429 35 49 50 NCRP
54085 Ritchie County WV 9.7059109 6.946511859 7.991209669 TRUE TRUE TRUE 10588 10077 10011 10 7 8 NCRP
54087 Roane County WV 19.58533126 34.11804845 28.64157119 TRUE TRUE TRUE 15442 14655 14664 29 50 42 NCRP
54089 Summers County WV 13.7731062 42.86136565 23.85033912 TRUE TRUE TRUE 13879 13532 13417 19 58 32 NCRP
54091 Taylor County WV 17.15367325 27.66007533 18.16157947 TRUE TRUE TRUE 16498 16992 17069 29 47 31 NCRP
54093 Tucker County WV 12.74606996 NA NA TRUE 7111 6953 6927 9 NA NA NCRP
54095 Tyler County WV 16.44736842 23.33851967 13.18971202 TRUE TRUE TRUE 9484 8998 9098 15 21 12 NCRP
54097 Upshur County WV 14.77165484 22.3015165 30.32631111 TRUE TRUE TRUE 23754 24662 24731 36 55 75 NCRP
54099 Wayne County WV 12.14083367 21.19205298 26.74967171 TRUE TRUE TRUE 42717 41525 41122 51 88 110 NCRP
54101 Webster County WV 29.75862449 61.92996284 71.31537242 TRUE TRUE TRUE 9391 8881 8834 27 55 63 NCRP
54103 Wetzel County WV 13.99452388 25.32271015 14.38578934 TRUE TRUE TRUE 16917 16191 15988 23 41 23 NCRP
54105 Wirt County WV 8.626639061 10.21276596 11.9760479 TRUE TRUE TRUE 5791 5875 5845 5 6 7 NCRP
54107 Wood County WV 13.25205407 15.97222222 16.58220949 TRUE TRUE TRUE 86552 86400 86237 115 138 143 NCRP
54109 Wyoming County WV 8.518250351 10.45296167 13.71802814 TRUE TRUE TRUE 24288 22960 22598 20 24 31 NCRP
55001 Adams County WI 18.80333639 19.99609832 17.31387583 TRUE TRUE TRUE 21185 20504 20215 39 41 35 NCRP
55003 Ashland County WI 24.89419965 19.29780876 20.49307582 TRUE TRUE TRUE 16408 16064 16103 40 31 33 NCRP
55005 Barron County WI 12.22013704 10.96395053 14.299857 TRUE TRUE TRUE 45968 45604 45455 56 50 65 NCRP
55007 Bayfield County WI 8.625837702 NA 9.342676009 TRUE TRUE 15172 15125 14985 13 NA 14 NCRP
55009 Brown County WI 18.71530784 19.35116676 20.57116141 TRUE TRUE TRUE 240191 254765 256670 469 493 528 NCRP
55011 Buffalo County WI 6.683499183 11.2528132 8.340915984 TRUE TRUE TRUE 13908 13330 13188 9 15 11 NCRP
55013 Burnett County WI 16.82956826 8.487855837 12.39561587 TRUE TRUE TRUE 16056 15316 15328 26 13 19 NCRP
55015 Calumet County WI 7.709787372 9.467407945 9.092562284 TRUE TRUE TRUE 46809 49644 49491 38 47 45 NCRP
55017 Chippewa County WI 9.892143723 8.544438994 6.933501418 TRUE TRUE TRUE 60271 63199 63460 62 54 44 NCRP
55019 Clark County WI 6.064106266 9.548058561 10.16762049 TRUE TRUE TRUE 34399 34562 34423 21 33 35 NCRP
55021 Columbia County WI 20.4776952 16.60396022 18.19305838 TRUE TRUE TRUE 55820 56613 56615 116 94 103 NCRP
55023 Crawford County WI 12.66739052 8.524111057 10.98096633 TRUE TRUE TRUE 16953 16424 16392 21 14 18 NCRP
55025 Dane County WI 16.12442176 11.39155378 11.29223451 TRUE TRUE TRUE 465018 510027 516284 801 581 583 NCRP
55027 Dodge County WI 12.18989142 13.23544384 14.11249351 TRUE TRUE TRUE 89003 88399 88574 108 117 125 NCRP
55029 Door County WI 11.14065981 8.610483263 16.20687171 TRUE TRUE TRUE 28167 27873 27766 31 24 45 NCRP
55031 Douglas County WI 10.68327499 13.24321856 14.87482265 TRUE TRUE TRUE 43815 43796 43698 47 58 65 NCRP
55033 Dunn County WI 6.154407239 6.331833292 4.514163187 TRUE TRUE TRUE 42828 44221 44305 27 28 20 NCRP
55035 Eau Claire County WI 12.02549405 8.652560371 8.861407585 TRUE TRUE TRUE 95896 101704 101564 120 88 90 NCRP
55037 Florence County WI 24.57002457 19.9247288 NA TRUE TRUE 4794 4517 4481 11 9 NA NCRP
55039 Fond du Lac County WI 14.65583381 15.15032268 14.64243949 TRUE TRUE TRUE 99920 101648 101759 149 154 149 NCRP
55041 Forest County WI 21.60994057 21.91060473 26.29560644 TRUE TRUE TRUE 9737 9128 9127 20 20 24 NCRP
55043 Grant County WI 8.222396241 7.237871674 7.910629184 TRUE TRUE TRUE 50051 51120 51829 42 37 41 NCRP
55045 Green County WI 8.129860979 7.550018875 8.36413674 TRUE TRUE TRUE 35869 37086 37063 30 28 31 NCRP
55047 Green Lake County WI 20.48104191 25.83434386 13.272457 TRUE TRUE TRUE 19195 18967 18836 39 49 25 NCRP
55049 Iowa County WI 2.952465309 6.739679865 5.456453305 TRUE TRUE TRUE 23589 23740 23825 7 16 13 NCRP
55051 Iron County WI NA NA NA 6236 5887 5917 NA NA NA NCRP
55053 Jackson County WI 12.19155369 11.17318436 9.684292078 TRUE TRUE TRUE 20016 20585 20652 25 23 20 NCRP
55055 Jefferson County WI 11.19247485 11.93712327 13.15243794 TRUE TRUE TRUE 81300 84610 84395 94 101 111 NCRP
55057 Juneau County WI 17.99572602 12.43406179 14.77552567 TRUE TRUE TRUE 26695 26540 26395 48 33 39 NCRP
55059 Kenosha County WI 34.51706078 22.20617117 25.22788395 TRUE TRUE TRUE 161607 167521 168068 576 372 424 NCRP
55061 Kewaunee County WI 7.289338128 2.930546058 3.913128546 TRUE TRUE TRUE 20755 20474 20444 15 6 8 NCRP
55063 La Crosse County WI 15.42193727 12.61399472 13.13436883 TRUE TRUE TRUE 110641 117330 118011 178 148 155 NCRP
55065 Lafayette County WI 5.937889674 5.36800668 3.560196998 TRUE TRUE TRUE 16785 16766 16853 10 9 6 NCRP
55067 Langlade County WI 21.17148906 21.97016146 22.15352911 TRUE TRUE TRUE 20440 19572 19410 42 43 43 NCRP
55069 Lincoln County WI 16.05584642 22.31831497 17.89913312 TRUE TRUE TRUE 29457 28676 28493 46 64 51 NCRP
55071 Manitowoc County WI 12.70068312 10.54289719 9.231536926 TRUE TRUE TRUE 81869 80623 80160 103 85 74 NCRP
55073 Marathon County WI 14.34976245 16.69560078 17.16011195 TRUE TRUE TRUE 130516 135365 135780 193 226 233 NCRP
55075 Marinette County WI 20.89738663 32.53247223 25.42496005 TRUE TRUE TRUE 42389 41497 41298 87 135 105 NCRP
55077 Marquette County WI 8.492291612 8.581424516 7.973421927 TRUE TRUE TRUE 15437 15149 15050 13 13 12 NCRP
55078 Menominee County WI NA NA NA 4312 4382 4522 NA NA NA NCRP
55079 Milwaukee County WI 41.99775493 26.43284197 26.42183341 TRUE TRUE TRUE 930263 956386 956406 3992 2528 2527 NCRP
55081 Monroe County WI 9.343091674 14.14395898 13.66270742 TRUE TRUE TRUE 43208 45249 45379 42 64 62 NCRP
55083 Oconto County WI 11.19074898 15.80328923 20.84613946 TRUE TRUE TRUE 37756 37334 37417 42 59 78 NCRP
55085 Oneida County WI 15.33400245 8.404303003 9.560498271 TRUE TRUE TRUE 36746 35696 35563 55 30 34 NCRP
55087 Outagamie County WI 12.02159393 11.04175336 11.15347846 TRUE TRUE TRUE 171632 180225 182006 214 199 203 NCRP
55089 Ozaukee County WI 6.689117498 8.266835065 14.74791357 TRUE TRUE TRUE 85362 87095 87470 58 72 129 NCRP
55091 Pepin County WI NA NA 9.543285617 TRUE 7540 7368 7335 NA NA 7 NCRP
55093 Pierce County WI 8.319060436 3.191515479 2.685678012 TRUE TRUE TRUE 39915 40733 40958 34 13 11 NCRP
55095 Polk County WI 3.416467373 9.211495947 8.057646707 TRUE TRUE TRUE 44367 43424 43437 15 40 35 NCRP
55097 Portage County WI 9.552868712 10.05850936 9.505973156 TRUE TRUE TRUE 68481 70587 70482 67 71 67 NCRP
55099 Price County WI 8.556149733 4.356665699 9.506398537 TRUE TRUE TRUE 14882 13772 13675 12 6 13 NCRP
55101 Racine County WI 32.91548104 27.19036332 24.38986898 TRUE TRUE TRUE 193915 194922 195163 642 530 476 NCRP
55103 Richland County WI 11.72463849 10.12430395 10.7575586 TRUE TRUE TRUE 18299 17779 17662 21 18 19 NCRP
55105 Rock County WI 19.95696779 18.11582925 16.7506266 TRUE TRUE TRUE 158538 160633 161188 320 291 270 NCRP
55107 Rusk County WI 6.862946949 5.566766405 7.674597084 TRUE TRUE TRUE 14945 14371 14333 10 8 11 NCRP
55109 St. Croix County WI 6.47729414 3.026493458 3.457854517 TRUE TRUE TRUE 79784 85908 86759 55 26 30 NCRP
55111 Sauk County WI 9.301878017 7.294293009 11.04466779 TRUE TRUE TRUE 59580 63063 63379 58 46 70 NCRP
55113 Sawyer County WI 8.463305525 24.22333919 18.85988927 TRUE TRUE TRUE 16624 16513 16437 14 40 31 NCRP
55115 Shawano County WI 20.34661049 12.98264173 14.67086751 TRUE TRUE TRUE 41639 41594 41579 85 54 61 NCRP
55117 Sheboygan County WI 7.810127132 11.05616882 12.40350421 TRUE TRUE TRUE 114775 114868 115290 90 127 143 NCRP
55119 Taylor County WI 6.785246935 8.74763085 4.381694255 TRUE TRUE TRUE 20394 20577 20540 14 18 9 NCRP
55121 Trempealeau County WI 6.185992164 7.437709186 5.760954285 TRUE TRUE TRUE 28286 29579 29509 18 22 17 NCRP
55123 Vernon County WI 7.66615559 3.962357603 2.634872538 TRUE TRUE TRUE 29123 30285 30362 23 12 8 NCRP
55125 Vilas County WI 8.410821924 10.30203699 15.42200206 TRUE TRUE TRUE 22064 21355 21398 18 22 33 NCRP
55127 Walworth County WI 13.93504127 16.97726986 15.6480918 TRUE TRUE TRUE 101026 103079 103527 143 175 162 NCRP
55129 Washburn County WI 6.312334301 12.12275888 5.097489486 TRUE TRUE TRUE 16098 15673 15694 10 19 8 NCRP
55131 Washington County WI 9.532023058 13.10773959 12.75787799 TRUE TRUE TRUE 127483 132746 133251 126 174 170 NCRP
55133 Waukesha County WI 9.074642127 9.899984769 10.35133808 TRUE TRUE TRUE 380799 393940 395118 355 390 409 NCRP
55135 Waupaca County WI 8.221797323 4.405117597 4.801597972 TRUE TRUE TRUE 52634 52212 52066 43 23 25 NCRP
55137 Waushara County WI 7.352040191 12.33045623 9.926379353 TRUE TRUE TRUE 24690 24330 24178 18 30 24 NCRP
55139 Winnebago County WI 9.889193375 9.506376949 10.6187799 TRUE TRUE TRUE 162727 169360 169511 166 161 180 NCRP
55141 Wood County WI 6.982771355 5.950448988 6.249320726 TRUE TRUE TRUE 74603 73944 73608 52 44 46 NCRP
56001 Albany County WY 14.15158525 15.43620589 13.22366507 TRUE TRUE TRUE 33950 37574 37811 52 58 50 NCRP
56003 Big Horn County WY 4.258581041 6.663334999 4.191114837 TRUE TRUE TRUE 11222 12006 11930 5 8 5 NCRP
56005 Campbell County WY 20.25543165 18.04604854 21.31622517 TRUE TRUE TRUE 39497 48210 48320 95 87 103 NCRP
56007 Carbon County WY 22.77183883 22.79779621 26.4917371 TRUE TRUE TRUE 15136 15791 15854 36 36 42 NCRP
56009 Converse County WY 9.327688886 15.36742107 16.31552813 TRUE TRUE TRUE 12801 14316 14097 13 22 23 NCRP
56011 Crook County WY NA 6.985191394 12.41721854 TRUE TRUE 6286 7158 7248 NA 5 9 NCRP
56013 Fremont County WY 12.58730903 15.58998344 11.30137828 TRUE TRUE TRUE 37408 41052 40703 51 64 46 NCRP
56015 Goshen County WY 17.09020657 24.30402121 22.19920083 TRUE TRUE TRUE 12538 13578 13514 23 33 30 NCRP
56017 Hot Springs County WY NA 18.53377265 29.06976744 TRUE TRUE 4632 4856 4816 NA 9 14 NCRP
56019 Johnson County WY 5.81733566 22.03665043 13.9974338 TRUE TRUE TRUE 7796 8622 8573 5 19 12 NCRP
56021 Laramie County WY 18.15779012 13.01879915 13.17577732 TRUE TRUE TRUE 86819 96015 96389 169 125 127 NCRP
56023 Lincoln County WY 4.972375691 7.09374659 5.385899715 TRUE TRUE TRUE 16429 18326 18567 9 13 10 NCRP
56025 Natrona County WY 17.19612635 29.33093428 23.52249338 TRUE TRUE TRUE 70806 81143 81624 133 238 192 NCRP
56027 Niobrara County WY NA NA NA 2321 2549 2463 NA NA NA NCRP
56029 Park County WY 7.353713625 17.49331138 10.69371141 TRUE TRUE TRUE 26789 29154 28989 21 51 31 NCRP
56031 Platte County WY 10.34363866 9.158557527 10.22843505 TRUE TRUE TRUE 8690 8735 8799 9 8 9 NCRP
56033 Sheridan County WY 14.29738562 22.79125888 13.31912627 TRUE TRUE TRUE 27422 29836 30032 42 68 40 NCRP
56035 Sublette County WY 9.825112989 19.82750074 15.90931689 TRUE TRUE TRUE 7957 10087 10057 10 20 16 NCRP
56037 Sweetwater County WY 18.90316628 21.90023228 26.21639636 TRUE TRUE TRUE 39749 45205 45010 84 99 118 NCRP
56039 Teton County WY 11.1239861 5.363128492 5.669428696 TRUE TRUE TRUE 20014 22375 22930 24 12 13 NCRP
56041 Uinta County WY 9.505703422 4.279397081 11.00267891 TRUE TRUE TRUE 19709 21031 20904 20 9 23 NCRP
56043 Washakie County WY NA 9.467455621 21.62941601 TRUE TRUE 7979 8450 8322 NA 8 18 NCRP
56045 Weston County WY 9.786103733 8.38691641 NA TRUE TRUE 6717 7154 7201 7 6 NA NCRP
// https://d3js.org/d3-force/ Version 1.0.0. Copyright 2016 Mike Bostock.
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-quadtree'), require('d3-collection'), require('d3-dispatch'), require('d3-timer')) :
typeof define === 'function' && define.amd ? define(['exports', 'd3-quadtree', 'd3-collection', 'd3-dispatch', 'd3-timer'], factory) :
(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3));
}(this, function (exports,d3Quadtree,d3Collection,d3Dispatch,d3Timer) { 'use strict';
function center(x, y) {
var nodes;
if (x == null) x = 0;
if (y == null) y = 0;
function force() {
var i,
n = nodes.length,
node,
sx = 0,
sy = 0;
for (i = 0; i < n; ++i) {
node = nodes[i], sx += node.x, sy += node.y;
}
for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
node = nodes[i], node.x -= sx, node.y -= sy;
}
}
force.initialize = function(_) {
nodes = _;
};
force.x = function(_) {
return arguments.length ? (x = +_, force) : x;
};
force.y = function(_) {
return arguments.length ? (y = +_, force) : y;
};
return force;
}
function constant(x) {
return function() {
return x;
};
}
function jiggle() {
return (Math.random() - 0.5) * 1e-6;
}
function x(d) {
return d.x + d.vx;
}
function y(d) {
return d.y + d.vy;
}
function collide(radius) {
var nodes,
radii,
strength = 1,
iterations = 1;
if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius);
function force() {
var i, n = nodes.length,
tree,
node,
xi,
yi,
ri,
ri2;
for (var k = 0; k < iterations; ++k) {
tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare);
for (i = 0; i < n; ++i) {
node = nodes[i];
ri = radii[i], ri2 = ri * ri;
xi = node.x + node.vx;
yi = node.y + node.vy;
tree.visit(apply);
}
}
function apply(quad, x0, y0, x1, y1) {
var data = quad.data, rj = quad.r, r = ri + rj;
if (data) {
if (data.index > i) {
var x = xi - data.x - data.vx,
y = yi - data.y - data.vy,
l = x * x + y * y;
if (l < r * r) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
l = (r - (l = Math.sqrt(l))) / l * strength;
node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
node.vy += (y *= l) * r;
data.vx -= x * (r = 1 - r);
data.vy -= y * r;
}
}
return;
}
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
}
}
function prepare(quad) {
if (quad.data) return quad.r = radii[quad.data.index];
for (var i = quad.r = 0; i < 4; ++i) {
if (quad[i] && quad[i].r > quad.r) {
quad.r = quad[i].r;
}
}
}
force.initialize = function(_) {
var i, n = (nodes = _).length; radii = new Array(n);
for (i = 0; i < n; ++i) radii[i] = +radius(nodes[i], i, nodes);
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = +_, force) : strength;
};
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), force) : radius;
};
return force;
}
function x$1(d) {
return d.x + d.vx;
}
function y$1(d) {
return d.y + d.vy;
}
function rectCollide(bbox) {
var nodes,
boundingBoxes,
strength = 1,
iterations = 1;
if (typeof bbox !== "function") bbox = constant(bbox == null ? [[0,0][1,1]] : bbox);
function force() {
var i,
n = nodes.length,
tree,
node,
xi,
yi,
bbi,
nx1,
ny1,
nx2,
ny2
for (var k = 0; k < iterations; ++k) {
tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(prepare);
for (i = 0; i < n; ++i) {
node = nodes[i];
bbi = boundingBoxes[i],
xi = node.x + node.vx;
yi = node.y + node.vy;
nx1 = xi + bbi[0][0]
ny1 = yi + bbi[0][1]
nx2 = xi + bbi[1][0]
ny2 = yi + bbi[1][1]
tree.visit(apply);
}
}
function apply(quad, x0, y0, x1, y1) {
var data = quad.data,
bWidth = bbLength(bbi, 0),
bHeight = bbLength(bbi, 1);
if (data) {
if (data.index > i) {
var bbj = boundingBoxes[data.index],
dnx1 = data.x + data.vx + bbj[0][0],
dny1 = data.y + data.vy + bbj[0][1],
dnx2 = data.x + data.vx + bbj[1][0],
dny2 = data.y + data.vy + bbj[1][1],
dWidth = bbLength(bbj, 0),
dHeight = bbLength(bbj, 1),
x = node.x - data.x,
y = node.y - data.y,
lx = Math.abs(x),
ly = Math.abs(y);
if (nx1 <= dnx2 && dnx1 <= nx2 && ny1 <= dny2 && dny1 <= ny2) {
if (x === 0) x = jiggle(), lx += x * x;
if (y === 0) y = jiggle(), ly += y * y;
node.vx += lx * (1 / lx) * ((bWidth * bWidth) / (dWidth * dWidth + bWidth));
node.vy += ly * (1 / ly) * ((bHeight * bHeight) / (dHeight * dHeight + bHeight));
data.vx -= lx * (1 / lx) * (((bWidth * bWidth) / (dWidth * dWidth + bWidth)));
data.vy -= ly * (1 / ly) * (((bHeight * bHeight) / (dHeight * dHeight + bHeight)));
}
}
return;
}
return x0 > nx2 || x1 < nx1 || y0 > ny2 || y1 < ny1;
}
}
function prepare(quad) {
if (quad.data) return quad.bb = boundingBoxes[quad.data.index];
for (var i = quad.bb = [[0,0],[0,0]]; i < 4; ++i) {
if (quad[i] && bbArea(quad[i].bb) > bbArea(quad.bb)) {
quad.bb = quad[i].bb;
}
}
}
function bbArea(bbox) {
return (bbox[1][0] - bbox[0][0]) * (bbox[1][1] - bbox[0][1])
}
function bbLength(bbox, heightWidth) {
return (bbox[1][heightWidth] - bbox[0][heightWidth])
}
force.initialize = function(_) {
var i, n = (nodes = _).length; boundingBoxes = new Array(n);
for (i = 0; i < n; ++i) boundingBoxes[i] = bbox(nodes[i], i, nodes);
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = +_, force) : strength;
};
force.bbox = function(_) {
return arguments.length ? (bbox = typeof _ === "function" ? _ : constant(+_), force) : bbox;
};
return force;
}
function index(d, i) {
return i;
}
function link(links) {
var id = index,
strength = defaultStrength,
strengths,
distance = constant(30),
distances,
nodes,
count,
bias,
iterations = 1;
if (links == null) links = [];
function defaultStrength(link) {
return 1 / Math.min(count[link.source.index], count[link.target.index]);
}
function force(alpha) {
for (var k = 0, n = links.length; k < iterations; ++k) {
for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
link = links[i], source = link.source, target = link.target;
x = target.x + target.vx - source.x - source.vx || jiggle();
y = target.y + target.vy - source.y - source.vy || jiggle();
l = Math.sqrt(x * x + y * y);
l = (l - distances[i]) / l * alpha * strengths[i];
x *= l, y *= l;
target.vx -= x * (b = bias[i]);
target.vy -= y * b;
source.vx += x * (b = 1 - b);
source.vy += y * b;
}
}
}
function initialize() {
if (!nodes) return;
var i,
n = nodes.length,
m = links.length,
nodeById = d3Collection.map(nodes, id),
link;
for (i = 0, count = new Array(n); i < n; ++i) {
count[i] = 0;
}
for (i = 0; i < m; ++i) {
link = links[i], link.index = i;
if (typeof link.source !== "object") link.source = nodeById.get(link.source);
if (typeof link.target !== "object") link.target = nodeById.get(link.target);
++count[link.source.index], ++count[link.target.index];
}
for (i = 0, bias = new Array(m); i < m; ++i) {
link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
}
strengths = new Array(m), initializeStrength();
distances = new Array(m), initializeDistance();
}
function initializeStrength() {
if (!nodes) return;
for (var i = 0, n = links.length; i < n; ++i) {
strengths[i] = +strength(links[i], i, links);
}
}
function initializeDistance() {
if (!nodes) return;
for (var i = 0, n = links.length; i < n; ++i) {
distances[i] = +distance(links[i], i, links);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.links = function(_) {
return arguments.length ? (links = _, initialize(), force) : links;
};
force.id = function(_) {
return arguments.length ? (id = _, force) : id;
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength;
};
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance;
};
return force;
}
function x$2(d) {
return d.x;
}
function y$2(d) {
return d.y;
}
var initialRadius = 10;
var initialAngle = Math.PI * (3 - Math.sqrt(5));
function simulation(nodes) {
var simulation,
alpha = 1,
alphaMin = 0.001,
alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
alphaTarget = 0,
velocityDecay = 0.6,
forces = d3Collection.map(),
stepper = d3Timer.timer(step),
event = d3Dispatch.dispatch("tick", "end");
if (nodes == null) nodes = [];
function step() {
tick();
event.call("tick", simulation);
if (alpha < alphaMin) {
stepper.stop();
event.call("end", simulation);
}
}
function tick() {
var i, n = nodes.length, node;
alpha += (alphaTarget - alpha) * alphaDecay;
forces.each(function(force) {
force(alpha);
});
for (i = 0; i < n; ++i) {
node = nodes[i];
if (node.fx == null) node.x += node.vx *= velocityDecay;
else node.x = node.fx, node.vx = 0;
if (node.fy == null) node.y += node.vy *= velocityDecay;
else node.y = node.fy, node.vy = 0;
}
}
function initializeNodes() {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.index = i;
if (isNaN(node.x) || isNaN(node.y)) {
var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
node.x = radius * Math.cos(angle);
node.y = radius * Math.sin(angle);
}
if (isNaN(node.vx) || isNaN(node.vy)) {
node.vx = node.vy = 0;
}
}
}
function initializeForce(force) {
if (force.initialize) force.initialize(nodes);
return force;
}
initializeNodes();
return simulation = {
tick: tick,
restart: function() {
return stepper.restart(step), simulation;
},
stop: function() {
return stepper.stop(), simulation;
},
nodes: function(_) {
return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
},
alpha: function(_) {
return arguments.length ? (alpha = +_, simulation) : alpha;
},
alphaMin: function(_) {
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
},
alphaDecay: function(_) {
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
},
alphaTarget: function(_) {
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
},
velocityDecay: function(_) {
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
},
force: function(name, _) {
return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
},
find: function(x, y, radius) {
var i = 0,
n = nodes.length,
dx,
dy,
d2,
node,
closest;
if (radius == null) radius = Infinity;
else radius *= radius;
for (i = 0; i < n; ++i) {
node = nodes[i];
dx = x - node.x;
dy = y - node.y;
d2 = dx * dx + dy * dy;
if (d2 < radius) closest = node, radius = d2;
}
return closest;
},
on: function(name, _) {
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
}
};
}
function manyBody() {
var nodes,
node,
alpha,
strength = constant(-30),
strengths,
distanceMin2 = 1,
distanceMax2 = Infinity,
theta2 = 0.81;
function force(_) {
var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$2, y$2).visitAfter(accumulate);
for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
for (i = 0; i < n; ++i) strengths[i] = +strength(nodes[i], i, nodes);
}
function accumulate(quad) {
var strength = 0, q, c, x, y, i;
// For internal nodes, accumulate forces from child quadrants.
if (quad.length) {
for (x = y = i = 0; i < 4; ++i) {
if ((q = quad[i]) && (c = q.value)) {
strength += c, x += c * q.x, y += c * q.y;
}
}
quad.x = x / strength;
quad.y = y / strength;
}
// For leaf nodes, accumulate forces from coincident quadrants.
else {
q = quad;
q.x = q.data.x;
q.y = q.data.y;
do strength += strengths[q.data.index];
while (q = q.next);
}
quad.value = strength;
}
function apply(quad, x1, _, x2) {
if (!quad.value) return true;
var x = quad.x - node.x,
y = quad.y - node.y,
w = x2 - x1,
l = x * x + y * y;
// Apply the Barnes-Hut approximation if possible.
// Limit forces for very close nodes; randomize direction if coincident.
if (w * w / theta2 < l) {
if (l < distanceMax2) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
node.vx += x * quad.value * alpha / l;
node.vy += y * quad.value * alpha / l;
}
return true;
}
// Otherwise, process points directly.
else if (quad.length || l >= distanceMax2) return;
// Limit forces for very close nodes; randomize direction if coincident.
if (quad.data !== node || quad.next) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
}
do if (quad.data !== node) {
w = strengths[quad.data.index] * alpha / l;
node.vx += x * w;
node.vy += y * w;
} while (quad = quad.next);
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength;
};
force.distanceMin = function(_) {
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
};
force.distanceMax = function(_) {
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
};
force.theta = function(_) {
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
};
return force;
}
function x$3(x) {
var strength = constant(0.1),
nodes,
strengths,
xz;
if (typeof x !== "function") x = constant(x == null ? 0 : +x);
function force(alpha) {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
}
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
xz = new Array(n);
for (i = 0; i < n; ++i) {
strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength;
};
force.x = function(_) {
return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x;
};
return force;
}
function y$3(y) {
var strength = constant(0.1),
nodes,
strengths,
yz;
if (typeof y !== "function") y = constant(y == null ? 0 : +y);
function force(alpha) {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
}
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
yz = new Array(n);
for (i = 0; i < n; ++i) {
strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength;
};
force.y = function(_) {
return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y;
};
return force;
}
exports.forceCenter = center;
exports.forceCollide = collide;
exports.forceRectCollide = rectCollide;
exports.forceLink = link;
exports.forceManyBody = manyBody;
exports.forceSimulation = simulation;
exports.forceX = x$3;
exports.forceY = y$3;
Object.defineProperty(exports, '__esModule', { value: true });
}));
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.d3 = global.d3 || {})));
}(this, function (exports) { 'use strict';
function ascending(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
function bisector(compare) {
if (compare.length === 1) compare = ascendingComparator(compare);
return {
left: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) < 0) lo = mid + 1;
else hi = mid;
}
return lo;
},
right: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) > 0) hi = mid;
else lo = mid + 1;
}
return lo;
}
};
}
function ascendingComparator(f) {
return function(d, x) {
return ascending(f(d), x);
};
}
var ascendingBisect = bisector(ascending);
var bisectRight = ascendingBisect.right;
var bisectLeft = ascendingBisect.left;
function descending(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
function number(x) {
return x === null ? NaN : +x;
}
function variance(array, f) {
var n = array.length,
m = 0,
a,
d,
s = 0,
i = -1,
j = 0;
if (f == null) {
while (++i < n) {
if (!isNaN(a = number(array[i]))) {
d = a - m;
m += d / ++j;
s += d * (a - m);
}
}
}
else {
while (++i < n) {
if (!isNaN(a = number(f(array[i], i, array)))) {
d = a - m;
m += d / ++j;
s += d * (a - m);
}
}
}
if (j > 1) return s / (j - 1);
}
function deviation(array, f) {
var v = variance(array, f);
return v ? Math.sqrt(v) : v;
}
function extent(array, f) {
var i = -1,
n = array.length,
a,
b,
c;
if (f == null) {
while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; }
while (++i < n) if ((b = array[i]) != null) {
if (a > b) a = b;
if (c < b) c = b;
}
}
else {
while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; }
while (++i < n) if ((b = f(array[i], i, array)) != null) {
if (a > b) a = b;
if (c < b) c = b;
}
}
return [a, c];
}
var array = Array.prototype;
var slice = array.slice;
var map = array.map;
function constant(x) {
return function() {
return x;
};
}
function identity(x) {
return x;
}
function range(start, stop, step) {
start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
var i = -1,
n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
range = new Array(n);
while (++i < n) {
range[i] = start + i * step;
}
return range;
}
var e10 = Math.sqrt(50);
var e5 = Math.sqrt(10);
var e2 = Math.sqrt(2);
function ticks(start, stop, count) {
var step = tickStep(start, stop, count);
return range(
Math.ceil(start / step) * step,
Math.floor(stop / step) * step + step / 2, // inclusive
step
);
}
function tickStep(start, stop, count) {
var step0 = Math.abs(stop - start) / Math.max(0, count),
step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
error = step0 / step1;
if (error >= e10) step1 *= 10;
else if (error >= e5) step1 *= 5;
else if (error >= e2) step1 *= 2;
return stop < start ? -step1 : step1;
}
function sturges(values) {
return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
}
function histogram() {
var value = identity,
domain = extent,
threshold = sturges;
function histogram(data) {
var i,
n = data.length,
x,
values = new Array(n);
for (i = 0; i < n; ++i) {
values[i] = value(data[i], i, data);
}
var xz = domain(values),
x0 = xz[0],
x1 = xz[1],
tz = threshold(values, x0, x1);
// Convert number of thresholds into uniform thresholds.
if (!Array.isArray(tz)) tz = ticks(x0, x1, tz);
// Remove any thresholds outside the domain.
var m = tz.length;
while (tz[0] <= x0) tz.shift(), --m;
while (tz[m - 1] >= x1) tz.pop(), --m;
var bins = new Array(m + 1),
bin;
// Initialize bins.
for (i = 0; i <= m; ++i) {
bin = bins[i] = [];
bin.x0 = i > 0 ? tz[i - 1] : x0;
bin.x1 = i < m ? tz[i] : x1;
}
// Assign data to bins by value, ignoring any outside the domain.
for (i = 0; i < n; ++i) {
x = values[i];
if (x0 <= x && x <= x1) {
bins[bisectRight(tz, x, 0, m)].push(data[i]);
}
}
return bins;
}
histogram.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
};
histogram.domain = function(_) {
return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
};
histogram.thresholds = function(_) {
return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
};
return histogram;
}
function threshold(array, p, f) {
if (f == null) f = number;
if (!(n = array.length)) return;
if ((p = +p) <= 0 || n < 2) return +f(array[0], 0, array);
if (p >= 1) return +f(array[n - 1], n - 1, array);
var n,
h = (n - 1) * p,
i = Math.floor(h),
a = +f(array[i], i, array),
b = +f(array[i + 1], i + 1, array);
return a + (b - a) * (h - i);
}
function freedmanDiaconis(values, min, max) {
values = map.call(values, number).sort(ascending);
return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
}
function scott(values, min, max) {
return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
}
function max(array, f) {
var i = -1,
n = array.length,
a,
b;
if (f == null) {
while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = array[i]) != null && b > a) a = b;
}
else {
while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = f(array[i], i, array)) != null && b > a) a = b;
}
return a;
}
function mean(array, f) {
var s = 0,
n = array.length,
a,
i = -1,
j = n;
if (f == null) {
while (++i < n) if (!isNaN(a = number(array[i]))) s += a; else --j;
}
else {
while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) s += a; else --j;
}
if (j) return s / j;
}
function median(array, f) {
var numbers = [],
n = array.length,
a,
i = -1;
if (f == null) {
while (++i < n) if (!isNaN(a = number(array[i]))) numbers.push(a);
}
else {
while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) numbers.push(a);
}
return threshold(numbers.sort(ascending), 0.5);
}
function merge(arrays) {
var n = arrays.length,
m,
i = -1,
j = 0,
merged,
array;
while (++i < n) j += arrays[i].length;
merged = new Array(j);
while (--n >= 0) {
array = arrays[n];
m = array.length;
while (--m >= 0) {
merged[--j] = array[m];
}
}
return merged;
}
function min(array, f) {
var i = -1,
n = array.length,
a,
b;
if (f == null) {
while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = array[i]) != null && a > b) a = b;
}
else {
while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; }
while (++i < n) if ((b = f(array[i], i, array)) != null && a > b) a = b;
}
return a;
}
function pairs(array) {
var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
while (i < n) pairs[i] = [p, p = array[++i]];
return pairs;
}
function permute(array, indexes) {
var i = indexes.length, permutes = new Array(i);
while (i--) permutes[i] = array[indexes[i]];
return permutes;
}
function scan(array, compare) {
if (!(n = array.length)) return;
var i = 0,
n,
j = 0,
xi,
xj = array[j];
if (!compare) compare = ascending;
while (++i < n) if (compare(xi = array[i], xj) < 0 || compare(xj, xj) !== 0) xj = xi, j = i;
if (compare(xj, xj) === 0) return j;
}
function shuffle(array, i0, i1) {
var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
t,
i;
while (m) {
i = Math.random() * m-- | 0;
t = array[m + i0];
array[m + i0] = array[i + i0];
array[i + i0] = t;
}
return array;
}
function sum(array, f) {
var s = 0,
n = array.length,
a,
i = -1;
if (f == null) {
while (++i < n) if (a = +array[i]) s += a; // Note: zero and null are equivalent.
}
else {
while (++i < n) if (a = +f(array[i], i, array)) s += a;
}
return s;
}
function transpose(matrix) {
if (!(n = matrix.length)) return [];
for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
row[j] = matrix[j][i];
}
}
return transpose;
}
function length(d) {
return d.length;
}
function zip() {
return transpose(arguments);
}
var prefix = "$";
function Map() {}
Map.prototype = map$1.prototype = {
constructor: Map,
has: function(key) {
return (prefix + key) in this;
},
get: function(key) {
return this[prefix + key];
},
set: function(key, value) {
this[prefix + key] = value;
return this;
},
remove: function(key) {
var property = prefix + key;
return property in this && delete this[property];
},
clear: function() {
for (var property in this) if (property[0] === prefix) delete this[property];
},
keys: function() {
var keys = [];
for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
return keys;
},
values: function() {
var values = [];
for (var property in this) if (property[0] === prefix) values.push(this[property]);
return values;
},
entries: function() {
var entries = [];
for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
return entries;
},
size: function() {
var size = 0;
for (var property in this) if (property[0] === prefix) ++size;
return size;
},
empty: function() {
for (var property in this) if (property[0] === prefix) return false;
return true;
},
each: function(f) {
for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
}
};
function map$1(object, f) {
var map = new Map;
// Copy constructor.
if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
// Index array by numeric index or specified key function.
else if (Array.isArray(object)) {
var i = -1,
n = object.length,
o;
if (f == null) while (++i < n) map.set(i, object[i]);
else while (++i < n) map.set(f(o = object[i], i, object), o);
}
// Convert object to map.
else if (object) for (var key in object) map.set(key, object[key]);
return map;
}
function nest() {
var keys = [],
sortKeys = [],
sortValues,
rollup,
nest;
function apply(array, depth, createResult, setResult) {
if (depth >= keys.length) return rollup != null
? rollup(array) : (sortValues != null
? array.sort(sortValues)
: array);
var i = -1,
n = array.length,
key = keys[depth++],
keyValue,
value,
valuesByKey = map$1(),
values,
result = createResult();
while (++i < n) {
if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
values.push(value);
} else {
valuesByKey.set(keyValue, [value]);
}
}
valuesByKey.each(function(values, key) {
setResult(result, key, apply(values, depth, createResult, setResult));
});
return result;
}
function entries(map, depth) {
if (++depth > keys.length) return map;
var array, sortKey = sortKeys[depth - 1];
if (rollup != null && depth >= keys.length) array = map.entries();
else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
}
return nest = {
object: function(array) { return apply(array, 0, createObject, setObject); },
map: function(array) { return apply(array, 0, createMap, setMap); },
entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
key: function(d) { keys.push(d); return nest; },
sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
sortValues: function(order) { sortValues = order; return nest; },
rollup: function(f) { rollup = f; return nest; }
};
}
function createObject() {
return {};
}
function setObject(object, key, value) {
object[key] = value;
}
function createMap() {
return map$1();
}
function setMap(map, key, value) {
map.set(key, value);
}
function Set() {}
var proto = map$1.prototype;
Set.prototype = set.prototype = {
constructor: Set,
has: proto.has,
add: function(value) {
value += "";
this[prefix + value] = value;
return this;
},
remove: proto.remove,
clear: proto.clear,
values: proto.keys,
size: proto.size,
empty: proto.empty,
each: proto.each
};
function set(object, f) {
var set = new Set;
// Copy constructor.
if (object instanceof Set) object.each(function(value) { set.add(value); });
// Otherwise, assume it’s an array.
else if (object) {
var i = -1, n = object.length;
if (f == null) while (++i < n) set.add(object[i]);
else while (++i < n) set.add(f(object[i], i, object));
}
return set;
}
function d3keys(map) {
var keys = [];
for (var key in map) keys.push(key);
return keys;
}
function values(map) {
var values = [];
for (var key in map) values.push(map[key]);
return values;
}
function entries(map) {
var entries = [];
for (var key in map) entries.push({key: key, value: map[key]});
return entries;
}
function uniform(min, max) {
min = min == null ? 0 : +min;
max = max == null ? 1 : +max;
if (arguments.length === 1) max = min, min = 0;
else max -= min;
return function() {
return Math.random() * max + min;
};
}
function normal(mu, sigma) {
var x, r;
mu = mu == null ? 0 : +mu;
sigma = sigma == null ? 1 : +sigma;
return function() {
var y;
// If available, use the second previously-generated uniform random.
if (x != null) y = x, x = null;
// Otherwise, generate a new x and y.
else do {
x = Math.random() * 2 - 1;
y = Math.random() * 2 - 1;
r = x * x + y * y;
} while (!r || r > 1);
return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
};
}
function logNormal() {
var randomNormal = normal.apply(this, arguments);
return function() {
return Math.exp(randomNormal());
};
}
function irwinHall(n) {
return function() {
for (var sum = 0, i = 0; i < n; ++i) sum += Math.random();
return sum;
};
}
function bates(n) {
var randomIrwinHall = irwinHall(n);
return function() {
return randomIrwinHall() / n;
};
}
function exponential(lambda) {
return function() {
return -Math.log(1 - Math.random()) / lambda;
};
}
function linear(t) {
return +t;
}
function quadIn(t) {
return t * t;
}
function quadOut(t) {
return t * (2 - t);
}
function quadInOut(t) {
return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
}
function cubicIn(t) {
return t * t * t;
}
function cubicOut(t) {
return --t * t * t + 1;
}
function easeCubicInOut(t) {
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
}
var exponent = 3;
var polyIn = (function custom(e) {
e = +e;
function polyIn(t) {
return Math.pow(t, e);
}
polyIn.exponent = custom;
return polyIn;
})(exponent);
var polyOut = (function custom(e) {
e = +e;
function polyOut(t) {
return 1 - Math.pow(1 - t, e);
}
polyOut.exponent = custom;
return polyOut;
})(exponent);
var polyInOut = (function custom(e) {
e = +e;
function polyInOut(t) {
return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
}
polyInOut.exponent = custom;
return polyInOut;
})(exponent);
var pi = Math.PI;
var halfPi = pi / 2;
function sinIn(t) {
return 1 - Math.cos(t * halfPi);
}
function sinOut(t) {
return Math.sin(t * halfPi);
}
function sinInOut(t) {
return (1 - Math.cos(pi * t)) / 2;
}
function expIn(t) {
return Math.pow(2, 10 * t - 10);
}
function expOut(t) {
return 1 - Math.pow(2, -10 * t);
}
function expInOut(t) {
return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
}
function circleIn(t) {
return 1 - Math.sqrt(1 - t * t);
}
function circleOut(t) {
return Math.sqrt(1 - --t * t);
}
function circleInOut(t) {
return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
}
var b1 = 4 / 11;
var b2 = 6 / 11;
var b3 = 8 / 11;
var b4 = 3 / 4;
var b5 = 9 / 11;
var b6 = 10 / 11;
var b7 = 15 / 16;
var b8 = 21 / 22;
var b9 = 63 / 64;
var b0 = 1 / b1 / b1;
function bounceIn(t) {
return 1 - bounceOut(1 - t);
}
function bounceOut(t) {
return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
}
function bounceInOut(t) {
return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
}
var overshoot = 1.70158;
var backIn = (function custom(s) {
s = +s;
function backIn(t) {
return t * t * ((s + 1) * t - s);
}
backIn.overshoot = custom;
return backIn;
})(overshoot);
var backOut = (function custom(s) {
s = +s;
function backOut(t) {
return --t * t * ((s + 1) * t + s) + 1;
}
backOut.overshoot = custom;
return backOut;
})(overshoot);
var backInOut = (function custom(s) {
s = +s;
function backInOut(t) {
return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
}
backInOut.overshoot = custom;
return backInOut;
})(overshoot);
var tau = 2 * Math.PI;
var amplitude = 1;
var period = 0.3;
var elasticIn = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticIn(t) {
return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
}
elasticIn.amplitude = function(a) { return custom(a, p * tau); };
elasticIn.period = function(p) { return custom(a, p); };
return elasticIn;
})(amplitude, period);
var elasticOut = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticOut(t) {
return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
}
elasticOut.amplitude = function(a) { return custom(a, p * tau); };
elasticOut.period = function(p) { return custom(a, p); };
return elasticOut;
})(amplitude, period);
var elasticInOut = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticInOut(t) {
return ((t = t * 2 - 1) < 0
? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
: 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
}
elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
elasticInOut.period = function(p) { return custom(a, p); };
return elasticInOut;
})(amplitude, period);
function area(polygon) {
var i = -1,
n = polygon.length,
a,
b = polygon[n - 1],
area = 0;
while (++i < n) {
a = b;
b = polygon[i];
area += a[1] * b[0] - a[0] * b[1];
}
return area / 2;
}
function centroid(polygon) {
var i = -1,
n = polygon.length,
x = 0,
y = 0,
a,
b = polygon[n - 1],
c,
k = 0;
while (++i < n) {
a = b;
b = polygon[i];
k += c = a[0] * b[1] - b[0] * a[1];
x += (a[0] + b[0]) * c;
y += (a[1] + b[1]) * c;
}
return k *= 3, [x / k, y / k];
}
// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
// the 3D cross product in a quadrant I Cartesian coordinate system (+x is
// right, +y is up). Returns a positive value if ABC is counter-clockwise,
// negative if clockwise, and zero if the points are collinear.
function cross(a, b, c) {
return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
}
function lexicographicOrder(a, b) {
return a[0] - b[0] || a[1] - b[1];
}
// Computes the upper convex hull per the monotone chain algorithm.
// Assumes points.length >= 3, is sorted by x, unique in y.
// Returns an array of indices into points in left-to-right order.
function computeUpperHullIndexes(points) {
var n = points.length,
indexes = [0, 1],
size = 2;
for (var i = 2; i < n; ++i) {
while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
indexes[size++] = i;
}
return indexes.slice(0, size); // remove popped points
}
function hull(points) {
if ((n = points.length) < 3) return null;
var i,
n,
sortedPoints = new Array(n),
flippedPoints = new Array(n);
for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
sortedPoints.sort(lexicographicOrder);
for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
var upperIndexes = computeUpperHullIndexes(sortedPoints),
lowerIndexes = computeUpperHullIndexes(flippedPoints);
// Construct the hull polygon, removing possible duplicate endpoints.
var skipLeft = lowerIndexes[0] === upperIndexes[0],
skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
hull = [];
// Add upper hull in right-to-l order.
// Then add lower hull in left-to-right order.
for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
return hull;
}
function contains(polygon, point) {
var n = polygon.length,
p = polygon[n - 1],
x = point[0], y = point[1],
x0 = p[0], y0 = p[1],
x1, y1,
inside = false;
for (var i = 0; i < n; ++i) {
p = polygon[i], x1 = p[0], y1 = p[1];
if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
x0 = x1, y0 = y1;
}
return inside;
}
function length$1(polygon) {
var i = -1,
n = polygon.length,
b = polygon[n - 1],
xa,
ya,
xb = b[0],
yb = b[1],
perimeter = 0;
while (++i < n) {
xa = xb;
ya = yb;
b = polygon[i];
xb = b[0];
yb = b[1];
xa -= xb;
ya -= yb;
perimeter += Math.sqrt(xa * xa + ya * ya);
}
return perimeter;
}
var pi$1 = Math.PI;
var tau$1 = 2 * pi$1;
var epsilon = 1e-6;
var tauEpsilon = tau$1 - epsilon;
function Path() {
this._x0 = this._y0 = // start of current subpath
this._x1 = this._y1 = null; // end of current subpath
this._ = [];
}
function path() {
return new Path;
}
Path.prototype = path.prototype = {
constructor: Path,
moveTo: function(x, y) {
this._.push("M", this._x0 = this._x1 = +x, ",", this._y0 = this._y1 = +y);
},
closePath: function() {
if (this._x1 !== null) {
this._x1 = this._x0, this._y1 = this._y0;
this._.push("Z");
}
},
lineTo: function(x, y) {
this._.push("L", this._x1 = +x, ",", this._y1 = +y);
},
quadraticCurveTo: function(x1, y1, x, y) {
this._.push("Q", +x1, ",", +y1, ",", this._x1 = +x, ",", this._y1 = +y);
},
bezierCurveTo: function(x1, y1, x2, y2, x, y) {
this._.push("C", +x1, ",", +y1, ",", +x2, ",", +y2, ",", this._x1 = +x, ",", this._y1 = +y);
},
arcTo: function(x1, y1, x2, y2, r) {
x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
var x0 = this._x1,
y0 = this._y1,
x21 = x2 - x1,
y21 = y2 - y1,
x01 = x0 - x1,
y01 = y0 - y1,
l01_2 = x01 * x01 + y01 * y01;
// Is the radius negative? Error.
if (r < 0) throw new Error("negative radius: " + r);
// Is this path empty? Move to (x1,y1).
if (this._x1 === null) {
this._.push(
"M", this._x1 = x1, ",", this._y1 = y1
);
}
// Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
else if (!(l01_2 > epsilon));
// Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
// Equivalently, is (x1,y1) coincident with (x2,y2)?
// Or, is the radius zero? Line to (x1,y1).
else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
this._.push(
"L", this._x1 = x1, ",", this._y1 = y1
);
}
// Otherwise, draw an arc!
else {
var x20 = x2 - x0,
y20 = y2 - y0,
l21_2 = x21 * x21 + y21 * y21,
l20_2 = x20 * x20 + y20 * y20,
l21 = Math.sqrt(l21_2),
l01 = Math.sqrt(l01_2),
l = r * Math.tan((pi$1 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
t01 = l / l01,
t21 = l / l21;
// If the start tangent is not coincident with (x0,y0), line to.
if (Math.abs(t01 - 1) > epsilon) {
this._.push(
"L", x1 + t01 * x01, ",", y1 + t01 * y01
);
}
this._.push(
"A", r, ",", r, ",0,0,", +(y01 * x20 > x01 * y20), ",", this._x1 = x1 + t21 * x21, ",", this._y1 = y1 + t21 * y21
);
}
},
arc: function(x, y, r, a0, a1, ccw) {
x = +x, y = +y, r = +r;
var dx = r * Math.cos(a0),
dy = r * Math.sin(a0),
x0 = x + dx,
y0 = y + dy,
cw = 1 ^ ccw,
da = ccw ? a0 - a1 : a1 - a0;
// Is the radius negative? Error.
if (r < 0) throw new Error("negative radius: " + r);
// Is this path empty? Move to (x0,y0).
if (this._x1 === null) {
this._.push(
"M", x0, ",", y0
);
}
// Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
this._.push(
"L", x0, ",", y0
);
}
// Is this arc empty? We’re done.
if (!r) return;
// Is this a complete circle? Draw two arcs to complete the circle.
if (da > tauEpsilon) {
this._.push(
"A", r, ",", r, ",0,1,", cw, ",", x - dx, ",", y - dy,
"A", r, ",", r, ",0,1,", cw, ",", this._x1 = x0, ",", this._y1 = y0
);
}
// Otherwise, draw an arc!
else {
if (da < 0) da = da % tau$1 + tau$1;
this._.push(
"A", r, ",", r, ",0,", +(da >= pi$1), ",", cw, ",", this._x1 = x + r * Math.cos(a1), ",", this._y1 = y + r * Math.sin(a1)
);
}
},
rect: function(x, y, w, h) {
this._.push("M", this._x0 = this._x1 = +x, ",", this._y0 = this._y1 = +y, "h", +w, "v", +h, "h", -w, "Z");
},
toString: function() {
return this._.join("");
}
};
function tree_add(d) {
var x = +this._x.call(null, d),
y = +this._y.call(null, d);
return add(this.cover(x, y), x, y, d);
}
function add(tree, x, y, d) {
if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
var parent,
node = tree._root,
leaf = {data: d},
x0 = tree._x0,
y0 = tree._y0,
x1 = tree._x1,
y1 = tree._y1,
xm,
ym,
xp,
yp,
right,
bottom,
i,
j;
// If the tree is empty, initialize the root as a leaf.
if (!node) return tree._root = leaf, tree;
// Find the existing leaf for the new point, or add it.
while (node.length) {
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
}
// Is the new point is exactly coincident with the existing point?
xp = +tree._x.call(null, node.data);
yp = +tree._y.call(null, node.data);
if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
// Otherwise, split the leaf node until the old and new point are separated.
do {
parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
} while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
return parent[j] = node, parent[i] = leaf, tree;
}
function addAll(data) {
var d, i, n = data.length,
x,
y,
xz = new Array(n),
yz = new Array(n),
x0 = Infinity,
y0 = Infinity,
x1 = -Infinity,
y1 = -Infinity;
// Compute the points and their extent.
for (i = 0; i < n; ++i) {
if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
xz[i] = x;
yz[i] = y;
if (x < x0) x0 = x;
if (x > x1) x1 = x;
if (y < y0) y0 = y;
if (y > y1) y1 = y;
}
// If there were no (valid) points, inherit the existing extent.
if (x1 < x0) x0 = this._x0, x1 = this._x1;
if (y1 < y0) y0 = this._y0, y1 = this._y1;
// Expand the tree to cover the new points.
this.cover(x0, y0).cover(x1, y1);
// Add the new points.
for (i = 0; i < n; ++i) {
add(this, xz[i], yz[i], data[i]);
}
return this;
}
function tree_cover(x, y) {
if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
var x0 = this._x0,
y0 = this._y0,
x1 = this._x1,
y1 = this._y1;
// If the quadtree has no extent, initialize them.
// Integer extent are necessary so that if we later double the extent,
// the existing quadrant boundaries don’t change due to floating point error!
if (isNaN(x0)) {
x1 = (x0 = Math.floor(x)) + 1;
y1 = (y0 = Math.floor(y)) + 1;
}
// Otherwise, double repeatedly to cover.
else if (x0 > x || x > x1 || y0 > y || y > y1) {
var z = x1 - x0,
node = this._root,
parent,
i;
switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
case 0: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
break;
}
case 1: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
break;
}
case 2: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
break;
}
case 3: {
do parent = new Array(4), parent[i] = node, node = parent;
while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
break;
}
}
if (this._root && this._root.length) this._root = node;
}
// If the quadtree covers the point already, just return.
else return this;
this._x0 = x0;
this._y0 = y0;
this._x1 = x1;
this._y1 = y1;
return this;
}
function tree_data() {
var data = [];
this.visit(function(node) {
if (!node.length) do data.push(node.data); while (node = node.next)
});
return data;
}
function tree_extent(_) {
return arguments.length
? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
: isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
}
function Quad(node, x0, y0, x1, y1) {
this.node = node;
this.x0 = x0;
this.y0 = y0;
this.x1 = x1;
this.y1 = y1;
}
function tree_find(x, y, radius) {
var data,
x0 = this._x0,
y0 = this._y0,
x1,
y1,
x2,
y2,
x3 = this._x1,
y3 = this._y1,
quads = [],
node = this._root,
q,
i;
if (node) quads.push(new Quad(node, x0, y0, x3, y3));
if (radius == null) radius = Infinity;
else {
x0 = x - radius, y0 = y - radius;
x3 = x + radius, y3 = y + radius;
radius *= radius;
}
while (q = quads.pop()) {
// Stop searching if this quadrant can’t contain a closer node.
if (!(node = q.node)
|| (x1 = q.x0) > x3
|| (y1 = q.y0) > y3
|| (x2 = q.x1) < x0
|| (y2 = q.y1) < y0) continue;
// Bisect the current quadrant.
if (node.length) {
var xm = (x1 + x2) / 2,
ym = (y1 + y2) / 2;
quads.push(
new Quad(node[3], xm, ym, x2, y2),
new Quad(node[2], x1, ym, xm, y2),
new Quad(node[1], xm, y1, x2, ym),
new Quad(node[0], x1, y1, xm, ym)
);
// Visit the closest quadrant first.
if (i = (y >= ym) << 1 | (x >= xm)) {
q = quads[quads.length - 1];
quads[quads.length - 1] = quads[quads.length - 1 - i];
quads[quads.length - 1 - i] = q;
}
}
// Visit this point. (Visiting coincident points isn’t necessary!)
else {
var dx = x - +this._x.call(null, node.data),
dy = y - +this._y.call(null, node.data),
d2 = dx * dx + dy * dy;
if (d2 < radius) {
var d = Math.sqrt(radius = d2);
x0 = x - d, y0 = y - d;
x3 = x + d, y3 = y + d;
data = node.data;
}
}
}
return data;
}
function tree_remove(d) {
if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
var parent,
node = this._root,
retainer,
previous,
next,
x0 = this._x0,
y0 = this._y0,
x1 = this._x1,
y1 = this._y1,
x,
y,
xm,
ym,
right,
bottom,
i,
j;
// If the tree is empty, initialize the root as a leaf.
if (!node) return this;
// Find the leaf node for the point.
// While descending, also retain the deepest parent with a non-removed sibling.
if (node.length) while (true) {
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
if (!node.length) break;
if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
}
// Find the point to remove.
while (node.data !== d) if (!(previous = node, node = node.next)) return this;
if (next = node.next) delete node.next;
// If there are multiple coincident points, remove just the point.
if (previous) return (next ? previous.next = next : delete previous.next), this;
// If this is the root point, remove it.
if (!parent) return this._root = next, this;
// Remove this leaf.
next ? parent[i] = next : delete parent[i];
// If the parent now contains exactly one leaf, collapse superfluous parents.
if ((node = parent[0] || parent[1] || parent[2] || parent[3])
&& node === (parent[3] || parent[2] || parent[1] || parent[0])
&& !node.length) {
if (retainer) retainer[j] = node;
else this._root = node;
}
return this;
}
function removeAll(data) {
for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
return this;
}
function tree_root() {
return this._root;
}
function tree_size() {
var size = 0;
this.visit(function(node) {
if (!node.length) do ++size; while (node = node.next)
});
return size;
}
function tree_visit(callback) {
var quads = [], q, node = this._root, child, x0, y0, x1, y1;
if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
while (q = quads.pop()) {
if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
}
}
return this;
}
function tree_visitAfter(callback) {
var quads = [], next = [], q;
if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
while (q = quads.pop()) {
var node = q.node;
if (node.length) {
var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
}
next.push(q);
}
while (q = next.pop()) {
callback(q.node, q.x0, q.y0, q.x1, q.y1);
}
return this;
}
function defaultX(d) {
return d[0];
}
function tree_x(_) {
return arguments.length ? (this._x = _, this) : this._x;
}
function defaultY(d) {
return d[1];
}
function tree_y(_) {
return arguments.length ? (this._y = _, this) : this._y;
}
function quadtree(nodes, x, y) {
var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
return nodes == null ? tree : tree.addAll(nodes);
}
function Quadtree(x, y, x0, y0, x1, y1) {
this._x = x;
this._y = y;
this._x0 = x0;
this._y0 = y0;
this._x1 = x1;
this._y1 = y1;
this._root = undefined;
}
function leaf_copy(leaf) {
var copy = {data: leaf.data}, next = copy;
while (leaf = leaf.next) next = next.next = {data: leaf.data};
return copy;
}
var treeProto = quadtree.prototype = Quadtree.prototype;
treeProto.copy = function() {
var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
node = this._root,
nodes,
child;
if (!node) return copy;
if (!node.length) return copy._root = leaf_copy(node), copy;
nodes = [{source: node, target: copy._root = new Array(4)}];
while (node = nodes.pop()) {
for (var i = 0; i < 4; ++i) {
if (child = node.source[i]) {
if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
else node.target[i] = leaf_copy(child);
}
}
}
return copy;
};
treeProto.add = tree_add;
treeProto.addAll = addAll;
treeProto.cover = tree_cover;
treeProto.data = tree_data;
treeProto.extent = tree_extent;
treeProto.find = tree_find;
treeProto.remove = tree_remove;
treeProto.removeAll = removeAll;
treeProto.root = tree_root;
treeProto.size = tree_size;
treeProto.visit = tree_visit;
treeProto.visitAfter = tree_visitAfter;
treeProto.x = tree_x;
treeProto.y = tree_y;
var slice$1 = [].slice;
var noabort = {};
function Queue(size) {
if (!(size >= 1)) throw new Error;
this._size = size;
this._call =
this._error = null;
this._tasks = [];
this._data = [];
this._waiting =
this._active =
this._ended =
this._start = 0; // inside a synchronous task callback?
}
Queue.prototype = queue.prototype = {
constructor: Queue,
defer: function(callback) {
if (typeof callback !== "function" || this._call) throw new Error;
if (this._error != null) return this;
var t = slice$1.call(arguments, 1);
t.push(callback);
++this._waiting, this._tasks.push(t);
poke(this);
return this;
},
abort: function() {
if (this._error == null) abort(this, new Error("abort"));
return this;
},
await: function(callback) {
if (typeof callback !== "function" || this._call) throw new Error;
this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
maybeNotify(this);
return this;
},
awaitAll: function(callback) {
if (typeof callback !== "function" || this._call) throw new Error;
this._call = callback;
maybeNotify(this);
return this;
}
};
function poke(q) {
if (!q._start) {
try { start(q); } // let the current task complete
catch (e) {
if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
else if (!q._data) throw e; // await callback errored synchronously
}
}
}
function start(q) {
while (q._start = q._waiting && q._active < q._size) {
var i = q._ended + q._active,
t = q._tasks[i],
j = t.length - 1,
c = t[j];
t[j] = end(q, i);
--q._waiting, ++q._active;
t = c.apply(null, t);
if (!q._tasks[i]) continue; // task finished synchronously
q._tasks[i] = t || noabort;
}
}
function end(q, i) {
return function(e, r) {
if (!q._tasks[i]) return; // ignore multiple callbacks
--q._active, ++q._ended;
q._tasks[i] = null;
if (q._error != null) return; // ignore secondary errors
if (e != null) {
abort(q, e);
} else {
q._data[i] = r;
if (q._waiting) poke(q);
else maybeNotify(q);
}
};
}
function abort(q, e) {
var i = q._tasks.length, t;
q._error = e; // ignore active callbacks
q._data = undefined; // allow gc
q._waiting = NaN; // prevent starting
while (--i >= 0) {
if (t = q._tasks[i]) {
q._tasks[i] = null;
if (t.abort) {
try { t.abort(); }
catch (e) { /* ignore */ }
}
}
}
q._active = NaN; // allow notification
maybeNotify(q);
}
function maybeNotify(q) {
if (!q._active && q._call) {
var d = q._data;
q._data = undefined; // allow gc
q._call(q._error, d);
}
}
function queue(concurrency) {
return new Queue(arguments.length ? +concurrency : Infinity);
}
function constant$1(x) {
return function constant() {
return x;
};
}
var epsilon$1 = 1e-12;
var pi$2 = Math.PI;
var halfPi$1 = pi$2 / 2;
var tau$2 = 2 * pi$2;
function arcInnerRadius(d) {
return d.innerRadius;
}
function arcOuterRadius(d) {
return d.outerRadius;
}
function arcStartAngle(d) {
return d.startAngle;
}
function arcEndAngle(d) {
return d.endAngle;
}
function arcPadAngle(d) {
return d && d.padAngle; // Note: optional!
}
function asin(x) {
return x >= 1 ? halfPi$1 : x <= -1 ? -halfPi$1 : Math.asin(x);
}
function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
var x10 = x1 - x0, y10 = y1 - y0,
x32 = x3 - x2, y32 = y3 - y2,
t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
return [x0 + t * x10, y0 + t * y10];
}
// Compute perpendicular offset line of length rc.
// http://mathworld.wolfram.com/Circle-LineIntersection.html
function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
var x01 = x0 - x1,
y01 = y0 - y1,
lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01),
ox = lo * y01,
oy = -lo * x01,
x11 = x0 + ox,
y11 = y0 + oy,
x10 = x1 + ox,
y10 = y1 + oy,
x00 = (x11 + x10) / 2,
y00 = (y11 + y10) / 2,
dx = x10 - x11,
dy = y10 - y11,
d2 = dx * dx + dy * dy,
r = r1 - rc,
D = x11 * y10 - x10 * y11,
d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)),
cx0 = (D * dy - dx * d) / d2,
cy0 = (-D * dx - dy * d) / d2,
cx1 = (D * dy + dx * d) / d2,
cy1 = (-D * dx + dy * d) / d2,
dx0 = cx0 - x00,
dy0 = cy0 - y00,
dx1 = cx1 - x00,
dy1 = cy1 - y00;
// Pick the closer of the two intersection points.
// TODO Is there a faster way to determine which intersection to use?
if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
return {
cx: cx0,
cy: cy0,
x01: -ox,
y01: -oy,
x11: cx0 * (r1 / r - 1),
y11: cy0 * (r1 / r - 1)
};
}
function arc() {
var innerRadius = arcInnerRadius,
outerRadius = arcOuterRadius,
cornerRadius = constant$1(0),
padRadius = null,
startAngle = arcStartAngle,
endAngle = arcEndAngle,
padAngle = arcPadAngle,
context = null;
function arc() {
var buffer,
r,
r0 = +innerRadius.apply(this, arguments),
r1 = +outerRadius.apply(this, arguments),
a0 = startAngle.apply(this, arguments) - halfPi$1,
a1 = endAngle.apply(this, arguments) - halfPi$1,
da = Math.abs(a1 - a0),
cw = a1 > a0;
if (!context) context = buffer = path();
// Ensure that the outer radius is always larger than the inner radius.
if (r1 < r0) r = r1, r1 = r0, r0 = r;
// Is it a point?
if (!(r1 > epsilon$1)) context.moveTo(0, 0);
// Or is it a circle or annulus?
else if (da > tau$2 - epsilon$1) {
context.moveTo(r1 * Math.cos(a0), r1 * Math.sin(a0));
context.arc(0, 0, r1, a0, a1, !cw);
if (r0 > epsilon$1) {
context.moveTo(r0 * Math.cos(a1), r0 * Math.sin(a1));
context.arc(0, 0, r0, a1, a0, cw);
}
}
// Or is it a circular or annular sector?
else {
var a01 = a0,
a11 = a1,
a00 = a0,
a10 = a1,
da0 = da,
da1 = da,
ap = padAngle.apply(this, arguments) / 2,
rp = (ap > epsilon$1) && (padRadius ? +padRadius.apply(this, arguments) : Math.sqrt(r0 * r0 + r1 * r1)),
rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
rc0 = rc,
rc1 = rc,
t0,
t1;
// Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
if (rp > epsilon$1) {
var p0 = asin(rp / r0 * Math.sin(ap)),
p1 = asin(rp / r1 * Math.sin(ap));
if ((da0 -= p0 * 2) > epsilon$1) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
else da0 = 0, a00 = a10 = (a0 + a1) / 2;
if ((da1 -= p1 * 2) > epsilon$1) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
else da1 = 0, a01 = a11 = (a0 + a1) / 2;
}
var x01 = r1 * Math.cos(a01),
y01 = r1 * Math.sin(a01),
x10 = r0 * Math.cos(a10),
y10 = r0 * Math.sin(a10);
// Apply rounded corners?
if (rc > epsilon$1) {
var x11 = r1 * Math.cos(a11),
y11 = r1 * Math.sin(a11),
x00 = r0 * Math.cos(a00),
y00 = r0 * Math.sin(a00);
// Restrict the corner radius according to the sector angle.
if (da < pi$2) {
var oc = da0 > epsilon$1 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
ax = x01 - oc[0],
ay = y01 - oc[1],
bx = x11 - oc[0],
by = y11 - oc[1],
kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2),
lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
rc0 = Math.min(rc, (r0 - lc) / (kc - 1));
rc1 = Math.min(rc, (r1 - lc) / (kc + 1));
}
}
// Is the sector collapsed to a line?
if (!(da1 > epsilon$1)) context.moveTo(x01, y01);
// Does the sector’s outer ring have rounded corners?
else if (rc1 > epsilon$1) {
t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
// Have the corners merged?
if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, Math.atan2(t0.y01, t0.x01), Math.atan2(t1.y01, t1.x01), !cw);
// Otherwise, draw the two corners and the ring.
else {
context.arc(t0.cx, t0.cy, rc1, Math.atan2(t0.y01, t0.x01), Math.atan2(t0.y11, t0.x11), !cw);
context.arc(0, 0, r1, Math.atan2(t0.cy + t0.y11, t0.cx + t0.x11), Math.atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
context.arc(t1.cx, t1.cy, rc1, Math.atan2(t1.y11, t1.x11), Math.atan2(t1.y01, t1.x01), !cw);
}
}
// Or is the outer ring just a circular arc?
else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
// Is there no inner ring, and it’s a circular sector?
// Or perhaps it’s an annular sector collapsed due to padding?
if (!(r0 > epsilon$1) || !(da0 > epsilon$1)) context.lineTo(x10, y10);
// Does the sector’s inner ring (or point) have rounded corners?
else if (rc0 > epsilon$1) {
t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
// Have the corners merged?
if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, Math.atan2(t0.y01, t0.x01), Math.atan2(t1.y01, t1.x01), !cw);
// Otherwise, draw the two corners and the ring.
else {
context.arc(t0.cx, t0.cy, rc0, Math.atan2(t0.y01, t0.x01), Math.atan2(t0.y11, t0.x11), !cw);
context.arc(0, 0, r0, Math.atan2(t0.cy + t0.y11, t0.cx + t0.x11), Math.atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);
context.arc(t1.cx, t1.cy, rc0, Math.atan2(t1.y11, t1.x11), Math.atan2(t1.y01, t1.x01), !cw);
}
}
// Or is the inner ring just a circular arc?
else context.arc(0, 0, r0, a10, a00, cw);
}
context.closePath();
if (buffer) return context = null, buffer + "" || null;
}
arc.centroid = function() {
var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$2 / 2;
return [Math.cos(a) * r, Math.sin(a) * r];
};
arc.innerRadius = function(_) {
return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : innerRadius;
};
arc.outerRadius = function(_) {
return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : outerRadius;
};
arc.cornerRadius = function(_) {
return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : cornerRadius;
};
arc.padRadius = function(_) {
return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), arc) : padRadius;
};
arc.startAngle = function(_) {
return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : startAngle;
};
arc.endAngle = function(_) {
return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : endAngle;
};
arc.padAngle = function(_) {
return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : padAngle;
};
arc.context = function(_) {
return arguments.length ? ((context = _ == null ? null : _), arc) : context;
};
return arc;
}
function Linear(context) {
this._context = context;
}
Linear.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; // proceed
default: this._context.lineTo(x, y); break;
}
}
};
function curveLinear(context) {
return new Linear(context);
}
function x(p) {
return p[0];
}
function y(p) {
return p[1];
}
function line() {
var x$$ = x,
y$$ = y,
defined = constant$1(true),
context = null,
curve = curveLinear,
output = null;
function line(data) {
var i,
n = data.length,
d,
defined0 = false,
buffer;
if (context == null) output = curve(buffer = path());
for (i = 0; i <= n; ++i) {
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
if (defined0 = !defined0) output.lineStart();
else output.lineEnd();
}
if (defined0) output.point(+x$$(d, i, data), +y$$(d, i, data));
}
if (buffer) return output = null, buffer + "" || null;
}
line.x = function(_) {
return arguments.length ? (x$$ = typeof _ === "function" ? _ : constant$1(+_), line) : x$$;
};
line.y = function(_) {
return arguments.length ? (y$$ = typeof _ === "function" ? _ : constant$1(+_), line) : y$$;
};
line.defined = function(_) {
return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), line) : defined;
};
line.curve = function(_) {
return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
};
line.context = function(_) {
return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
};
return line;
}
function area$1() {
var x0 = x,
x1 = null,
y0 = constant$1(0),
y1 = y,
defined = constant$1(true),
context = null,
curve = curveLinear,
output = null;
function area(data) {
var i,
j,
k,
n = data.length,
d,
defined0 = false,
buffer,
x0z = new Array(n),
y0z = new Array(n);
if (context == null) output = curve(buffer = path());
for (i = 0; i <= n; ++i) {
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
if (defined0 = !defined0) {
j = i;
output.areaStart();
output.lineStart();
} else {
output.lineEnd();
output.lineStart();
for (k = i - 1; k >= j; --k) {
output.point(x0z[k], y0z[k]);
}
output.lineEnd();
output.areaEnd();
}
}
if (defined0) {
x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
}
}
if (buffer) return output = null, buffer + "" || null;
}
function arealine() {
return line().defined(defined).curve(curve).context(context);
}
area.x = function(_) {
return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), x1 = null, area) : x0;
};
area.x0 = function(_) {
return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), area) : x0;
};
area.x1 = function(_) {
return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : x1;
};
area.y = function(_) {
return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), y1 = null, area) : y0;
};
area.y0 = function(_) {
return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), area) : y0;
};
area.y1 = function(_) {
return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : y1;
};
area.lineX0 =
area.lineY0 = function() {
return arealine().x(x0).y(y0);
};
area.lineY1 = function() {
return arealine().x(x0).y(y1);
};
area.lineX1 = function() {
return arealine().x(x1).y(y0);
};
area.defined = function(_) {
return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), area) : defined;
};
area.curve = function(_) {
return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
};
area.context = function(_) {
return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
};
return area;
}
function descending$1(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
function identity$1(d) {
return d;
}
function pie() {
var value = identity$1,
sortValues = descending$1,
sort = null,
startAngle = constant$1(0),
endAngle = constant$1(tau$2),
padAngle = constant$1(0);
function pie(data) {
var i,
n = data.length,
j,
k,
sum = 0,
index = new Array(n),
arcs = new Array(n),
a0 = +startAngle.apply(this, arguments),
da = Math.min(tau$2, Math.max(-tau$2, endAngle.apply(this, arguments) - a0)),
a1,
p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
pa = p * (da < 0 ? -1 : 1),
v;
for (i = 0; i < n; ++i) {
if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
sum += v;
}
}
// Optionally sort the arcs by previously-computed values or by data.
if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
// Compute the arcs! They are stored in the original data's order.
for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
data: data[j],
index: i,
value: v,
startAngle: a0,
endAngle: a1,
padAngle: p
};
}
return arcs;
}
pie.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), pie) : value;
};
pie.sortValues = function(_) {
return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
};
pie.sort = function(_) {
return arguments.length ? (sort = _, sortValues = null, pie) : sort;
};
pie.startAngle = function(_) {
return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : startAngle;
};
pie.endAngle = function(_) {
return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : endAngle;
};
pie.padAngle = function(_) {
return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : padAngle;
};
return pie;
}
var curveRadialLinear = curveRadial(curveLinear);
function Radial(curve) {
this._curve = curve;
}
Radial.prototype = {
areaStart: function() {
this._curve.areaStart();
},
areaEnd: function() {
this._curve.areaEnd();
},
lineStart: function() {
this._curve.lineStart();
},
lineEnd: function() {
this._curve.lineEnd();
},
point: function(a, r) {
this._curve.point(r * Math.sin(a), r * -Math.cos(a));
}
};
function curveRadial(curve) {
function radial(context) {
return new Radial(curve(context));
}
radial._curve = curve;
return radial;
}
function radialLine(l) {
var c = l.curve;
l.angle = l.x, delete l.x;
l.radius = l.y, delete l.y;
l.curve = function(_) {
return arguments.length ? c(curveRadial(_)) : c()._curve;
};
return l;
}
function radialLine$1() {
return radialLine(line().curve(curveRadialLinear));
}
function radialArea() {
var a = area$1().curve(curveRadialLinear),
c = a.curve,
x0 = a.lineX0,
x1 = a.lineX1,
y0 = a.lineY0,
y1 = a.lineY1;
a.angle = a.x, delete a.x;
a.startAngle = a.x0, delete a.x0;
a.endAngle = a.x1, delete a.x1;
a.radius = a.y, delete a.y;
a.innerRadius = a.y0, delete a.y0;
a.outerRadius = a.y1, delete a.y1;
a.lineStartAngle = function() { return radialLine(x0()); }, delete a.lineX0;
a.lineEndAngle = function() { return radialLine(x1()); }, delete a.lineX1;
a.lineInnerRadius = function() { return radialLine(y0()); }, delete a.lineY0;
a.lineOuterRadius = function() { return radialLine(y1()); }, delete a.lineY1;
a.curve = function(_) {
return arguments.length ? c(curveRadial(_)) : c()._curve;
};
return a;
}
var circle = {
draw: function(context, size) {
var r = Math.sqrt(size / pi$2);
context.moveTo(r, 0);
context.arc(0, 0, r, 0, tau$2);
}
};
var cross$1 = {
draw: function(context, size) {
var r = Math.sqrt(size / 5) / 2;
context.moveTo(-3 * r, -r);
context.lineTo(-r, -r);
context.lineTo(-r, -3 * r);
context.lineTo(r, -3 * r);
context.lineTo(r, -r);
context.lineTo(3 * r, -r);
context.lineTo(3 * r, r);
context.lineTo(r, r);
context.lineTo(r, 3 * r);
context.lineTo(-r, 3 * r);
context.lineTo(-r, r);
context.lineTo(-3 * r, r);
context.closePath();
}
};
var tan30 = Math.sqrt(1 / 3);
var tan30_2 = tan30 * 2;
var diamond = {
draw: function(context, size) {
var y = Math.sqrt(size / tan30_2),
x = y * tan30;
context.moveTo(0, -y);
context.lineTo(x, 0);
context.lineTo(0, y);
context.lineTo(-x, 0);
context.closePath();
}
};
var ka = 0.89081309152928522810;
var kr = Math.sin(pi$2 / 10) / Math.sin(7 * pi$2 / 10);
var kx = Math.sin(tau$2 / 10) * kr;
var ky = -Math.cos(tau$2 / 10) * kr;
var star = {
draw: function(context, size) {
var r = Math.sqrt(size * ka),
x = kx * r,
y = ky * r;
context.moveTo(0, -r);
context.lineTo(x, y);
for (var i = 1; i < 5; ++i) {
var a = tau$2 * i / 5,
c = Math.cos(a),
s = Math.sin(a);
context.lineTo(s * r, -c * r);
context.lineTo(c * x - s * y, s * x + c * y);
}
context.closePath();
}
};
var square = {
draw: function(context, size) {
var w = Math.sqrt(size),
x = -w / 2;
context.rect(x, x, w, w);
}
};
var sqrt3 = Math.sqrt(3);
var triangle = {
draw: function(context, size) {
var y = -Math.sqrt(size / (sqrt3 * 3));
context.moveTo(0, y * 2);
context.lineTo(-sqrt3 * y, -y);
context.lineTo(sqrt3 * y, -y);
context.closePath();
}
};
var c = -0.5;
var s = Math.sqrt(3) / 2;
var k = 1 / Math.sqrt(12);
var a = (k / 2 + 1) * 3;
var wye = {
draw: function(context, size) {
var r = Math.sqrt(size / a),
x0 = r / 2,
y0 = r * k,
x1 = x0,
y1 = r * k + r,
x2 = -x1,
y2 = y1;
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.lineTo(x2, y2);
context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
context.closePath();
}
};
var symbols = [
circle,
cross$1,
diamond,
square,
star,
triangle,
wye
];
function symbol() {
var type = constant$1(circle),
size = constant$1(64),
context = null;
function symbol() {
var buffer;
if (!context) context = buffer = path();
type.apply(this, arguments).draw(context, +size.apply(this, arguments));
if (buffer) return context = null, buffer + "" || null;
}
symbol.type = function(_) {
return arguments.length ? (type = typeof _ === "function" ? _ : constant$1(_), symbol) : type;
};
symbol.size = function(_) {
return arguments.length ? (size = typeof _ === "function" ? _ : constant$1(+_), symbol) : size;
};
symbol.context = function(_) {
return arguments.length ? (context = _ == null ? null : _, symbol) : context;
};
return symbol;
}
function noop() {}
function point(that, x, y) {
that._context.bezierCurveTo(
(2 * that._x0 + that._x1) / 3,
(2 * that._y0 + that._y1) / 3,
(that._x0 + 2 * that._x1) / 3,
(that._y0 + 2 * that._y1) / 3,
(that._x0 + 4 * that._x1 + x) / 6,
(that._y0 + 4 * that._y1 + y) / 6
);
}
function Basis(context) {
this._context = context;
}
Basis.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 3: point(this, this._x1, this._y1); // proceed
case 2: this._context.lineTo(this._x1, this._y1); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
function basis(context) {
return new Basis(context);
}
function BasisClosed(context) {
this._context = context;
}
BasisClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x2, this._y2);
this._context.closePath();
break;
}
case 2: {
this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x2, this._y2);
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
function basisClosed(context) {
return new BasisClosed(context);
}
function BasisOpen(context) {
this._context = context;
}
BasisOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 = NaN;
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
case 3: this._point = 4; // proceed
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
function basisOpen(context) {
return new BasisOpen(context);
}
function Bundle(context, beta) {
this._basis = new Basis(context);
this._beta = beta;
}
Bundle.prototype = {
lineStart: function() {
this._x = [];
this._y = [];
this._basis.lineStart();
},
lineEnd: function() {
var x = this._x,
y = this._y,
j = x.length - 1;
if (j > 0) {
var x0 = x[0],
y0 = y[0],
dx = x[j] - x0,
dy = y[j] - y0,
i = -1,
t;
while (++i <= j) {
t = i / j;
this._basis.point(
this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
);
}
}
this._x = this._y = null;
this._basis.lineEnd();
},
point: function(x, y) {
this._x.push(+x);
this._y.push(+y);
}
};
var bundle = (function custom(beta) {
function bundle(context) {
return beta === 1 ? new Basis(context) : new Bundle(context, beta);
}
bundle.beta = function(beta) {
return custom(+beta);
};
return bundle;
})(0.85);
function point$1(that, x, y) {
that._context.bezierCurveTo(
that._x1 + that._k * (that._x2 - that._x0),
that._y1 + that._k * (that._y2 - that._y0),
that._x2 + that._k * (that._x1 - x),
that._y2 + that._k * (that._y1 - y),
that._x2,
that._y2
);
}
function Cardinal(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
Cardinal.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x2, this._y2); break;
case 3: point$1(this, this._x1, this._y1); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
case 2: this._point = 3; // proceed
default: point$1(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var cardinal = (function custom(tension) {
function cardinal(context) {
return new Cardinal(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0);
function CardinalClosed(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
CardinalClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 2: {
this._context.lineTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
this.point(this._x5, this._y5);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
default: point$1(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var cardinalClosed = (function custom(tension) {
function cardinal(context) {
return new CardinalClosed(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0);
function CardinalOpen(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
CardinalOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
case 3: this._point = 4; // proceed
default: point$1(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var cardinalOpen = (function custom(tension) {
function cardinal(context) {
return new CardinalOpen(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0);
function point$2(that, x, y) {
var x1 = that._x1,
y1 = that._y1,
x2 = that._x2,
y2 = that._y2;
if (that._l01_a > epsilon$1) {
var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
n = 3 * that._l01_a * (that._l01_a + that._l12_a);
x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
}
if (that._l23_a > epsilon$1) {
var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
m = 3 * that._l23_a * (that._l23_a + that._l12_a);
x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
}
that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
}
function CatmullRom(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRom.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x2, this._y2); break;
case 3: this.point(this, this._x2, this._y2); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; // proceed
default: point$2(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var catmullRom = (function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5);
function CatmullRomClosed(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRomClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 2: {
this._context.lineTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
this.point(this._x5, this._y5);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
default: point$2(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var catmullRomClosed = (function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5);
function CatmullRomOpen(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRomOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
case 3: this._point = 4; // proceed
default: point$2(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
var catmullRomOpen = (function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5);
function LinearClosed(context) {
this._context = context;
}
LinearClosed.prototype = {
areaStart: noop,
areaEnd: noop,
lineStart: function() {
this._point = 0;
},
lineEnd: function() {
if (this._point) this._context.closePath();
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) this._context.lineTo(x, y);
else this._point = 1, this._context.moveTo(x, y);
}
};
function linearClosed(context) {
return new LinearClosed(context);
}
function sign(x) {
return x < 0 ? -1 : 1;
}
// Calculate the slopes of the tangents (Hermite-type interpolation) based on
// the following paper: Steffen, M. 1990. A Simple Method for Monotonic
// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
// NOV(II), P. 443, 1990.
function slope3(that, x2, y2) {
var h0 = that._x1 - that._x0,
h1 = x2 - that._x1,
s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
p = (s0 * h1 + s1 * h0) / (h0 + h1);
return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
}
// Calculate a one-sided slope.
function slope2(that, t) {
var h = that._x1 - that._x0;
return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
}
// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
// "you can express cubic Hermite interpolation in terms of cubic Bézier curves
// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
function point$3(that, t0, t1) {
var x0 = that._x0,
y0 = that._y0,
x1 = that._x1,
y1 = that._y1,
dx = (x1 - x0) / 3;
that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
}
function MonotoneX(context) {
this._context = context;
}
MonotoneX.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 =
this._t0 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x1, this._y1); break;
case 3: point$3(this, this._t0, slope2(this, this._t0)); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
var t1 = NaN;
x = +x, y = +y;
if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
default: point$3(this, this._t0, t1 = slope3(this, x, y)); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
this._t0 = t1;
}
}
function MonotoneY(context) {
this._context = new ReflectContext(context);
}
(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
MonotoneX.prototype.point.call(this, y, x);
};
function ReflectContext(context) {
this._context = context;
}
ReflectContext.prototype = {
moveTo: function(x, y) { this._context.moveTo(y, x); },
closePath: function() { this._context.closePath(); },
lineTo: function(x, y) { this._context.lineTo(y, x); },
bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
};
function monotoneX(context) {
return new MonotoneX(context);
}
function monotoneY(context) {
return new MonotoneY(context);
}
function Natural(context) {
this._context = context;
}
Natural.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x = [];
this._y = [];
},
lineEnd: function() {
var x = this._x,
y = this._y,
n = x.length;
if (n) {
this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
if (n === 2) {
this._context.lineTo(x[1], y[1]);
} else {
var px = controlPoints(x),
py = controlPoints(y);
for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
}
}
}
if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
this._line = 1 - this._line;
this._x = this._y = null;
},
point: function(x, y) {
this._x.push(+x);
this._y.push(+y);
}
};
// See https://www.particleincell.com/2012/bezier-splines/ for derivation.
function controlPoints(x) {
var i,
n = x.length - 1,
m,
a = new Array(n),
b = new Array(n),
r = new Array(n);
a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
a[n - 1] = r[n - 1] / b[n - 1];
for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
b[n - 1] = (x[n] + a[n - 1]) / 2;
for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
return [a, b];
}
function natural(context) {
return new Natural(context);
}
function Step(context, t) {
this._context = context;
this._t = t;
}
Step.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x = this._y = NaN;
this._point = 0;
},
lineEnd: function() {
if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; // proceed
default: {
if (this._t <= 0) {
this._context.lineTo(this._x, y);
this._context.lineTo(x, y);
} else {
var x1 = this._x * (1 - this._t) + x * this._t;
this._context.lineTo(x1, this._y);
this._context.lineTo(x1, y);
}
break;
}
}
this._x = x, this._y = y;
}
};
function step(context) {
return new Step(context, 0.5);
}
function stepBefore(context) {
return new Step(context, 0);
}
function stepAfter(context) {
return new Step(context, 1);
}
var slice$2 = Array.prototype.slice;
function none(series, order) {
if (!((n = series.length) > 1)) return;
for (var i = 1, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
s0 = s1, s1 = series[order[i]];
for (var j = 0; j < m; ++j) {
s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
}
}
}
function none$1(series) {
var n = series.length, o = new Array(n);
while (--n >= 0) o[n] = n;
return o;
}
function stackValue(d, key) {
return d[key];
}
function stack() {
var keys = constant$1([]),
order = none$1,
offset = none,
value = stackValue;
function stack(data) {
var kz = keys.apply(this, arguments),
i,
m = data.length,
n = kz.length,
sz = new Array(n),
oz;
for (i = 0; i < n; ++i) {
for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
si[j] = sij = [0, +value(data[j], ki, j, data)];
sij.data = data[j];
}
si.key = ki;
}
for (i = 0, oz = order(sz); i < n; ++i) {
sz[oz[i]].index = i;
}
offset(sz, oz);
return sz;
}
stack.keys = function(_) {
return arguments.length ? (keys = typeof _ === "function" ? _ : constant$1(slice$2.call(_)), stack) : keys;
};
stack.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), stack) : value;
};
stack.order = function(_) {
return arguments.length ? (order = _ == null ? none$1 : typeof _ === "function" ? _ : constant$1(slice$2.call(_)), stack) : order;
};
stack.offset = function(_) {
return arguments.length ? (offset = _ == null ? none : _, stack) : offset;
};
return stack;
}
function expand(series, order) {
if (!((n = series.length) > 0)) return;
for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
}
none(series, order);
}
function silhouette(series, order) {
if (!((n = series.length) > 0)) return;
for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
s0[j][1] += s0[j][0] = -y / 2;
}
none(series, order);
}
function wiggle(series, order) {
if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
var si = series[order[i]],
sij0 = si[j][1] || 0,
sij1 = si[j - 1][1] || 0,
s3 = (sij0 - sij1) / 2;
for (var k = 0; k < i; ++k) {
var sk = series[order[k]],
skj0 = sk[j][1] || 0,
skj1 = sk[j - 1][1] || 0;
s3 += skj0 - skj1;
}
s1 += sij0, s2 += s3 * sij0;
}
s0[j - 1][1] += s0[j - 1][0] = y;
if (s1) y -= s2 / s1;
}
s0[j - 1][1] += s0[j - 1][0] = y;
none(series, order);
}
function ascending$1(series) {
var sums = series.map(sum$1);
return none$1(series).sort(function(a, b) { return sums[a] - sums[b]; });
}
function sum$1(series) {
var s = 0, i = -1, n = series.length, v;
while (++i < n) if (v = +series[i][1]) s += v;
return s;
}
function descending$2(series) {
return ascending$1(series).reverse();
}
function insideOut(series) {
var n = series.length,
i,
j,
sums = series.map(sum$1),
order = none$1(series).sort(function(a, b) { return sums[b] - sums[a]; }),
top = 0,
bottom = 0,
tops = [],
bottoms = [];
for (i = 0; i < n; ++i) {
j = order[i];
if (top < bottom) {
top += sums[j];
tops.push(j);
} else {
bottom += sums[j];
bottoms.push(j);
}
}
return bottoms.reverse().concat(tops);
}
function reverse(series) {
return none$1(series).reverse();
}
function define(constructor, factory, prototype) {
constructor.prototype = factory.prototype = prototype;
prototype.constructor = constructor;
}
function extend(parent, definition) {
var prototype = Object.create(parent.prototype);
for (var key in definition) prototype[key] = definition[key];
return prototype;
}
function Color() {}
var darker = 0.7;
var brighter = 1 / darker;
var reHex3 = /^#([0-9a-f]{3})$/;
var reHex6 = /^#([0-9a-f]{6})$/;
var reRgbInteger = /^rgb\(\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*\)$/;
var reRgbPercent = /^rgb\(\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*\)$/;
var reRgbaInteger = /^rgba\(\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+)\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/;
var reRgbaPercent = /^rgba\(\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/;
var reHslPercent = /^hsl\(\s*([-+]?\d+(?:\.\d+)?)\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*\)$/;
var reHslaPercent = /^hsla\(\s*([-+]?\d+(?:\.\d+)?)\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)%\s*,\s*([-+]?\d+(?:\.\d+)?)\s*\)$/;
var named = {
aliceblue: 0xf0f8ff,
antiquewhite: 0xfaebd7,
aqua: 0x00ffff,
aquamarine: 0x7fffd4,
azure: 0xf0ffff,
beige: 0xf5f5dc,
bisque: 0xffe4c4,
black: 0x000000,
blanchedalmond: 0xffebcd,
blue: 0x0000ff,
blueviolet: 0x8a2be2,
brown: 0xa52a2a,
burlywood: 0xdeb887,
cadetblue: 0x5f9ea0,
chartreuse: 0x7fff00,
chocolate: 0xd2691e,
coral: 0xff7f50,
cornflowerblue: 0x6495ed,
cornsilk: 0xfff8dc,
crimson: 0xdc143c,
cyan: 0x00ffff,
darkblue: 0x00008b,
darkcyan: 0x008b8b,
darkgoldenrod: 0xb8860b,
darkgray: 0xa9a9a9,
darkgreen: 0x006400,
darkgrey: 0xa9a9a9,
darkkhaki: 0xbdb76b,
darkmagenta: 0x8b008b,
darkolivegreen: 0x556b2f,
darkorange: 0xff8c00,
darkorchid: 0x9932cc,
darkred: 0x8b0000,
darksalmon: 0xe9967a,
darkseagreen: 0x8fbc8f,
darkslateblue: 0x483d8b,
darkslategray: 0x2f4f4f,
darkslategrey: 0x2f4f4f,
darkturquoise: 0x00ced1,
darkviolet: 0x9400d3,
deeppink: 0xff1493,
deepskyblue: 0x00bfff,
dimgray: 0x696969,
dimgrey: 0x696969,
dodgerblue: 0x1e90ff,
firebrick: 0xb22222,
floralwhite: 0xfffaf0,
forestgreen: 0x228b22,
fuchsia: 0xff00ff,
gainsboro: 0xdcdcdc,
ghostwhite: 0xf8f8ff,
gold: 0xffd700,
goldenrod: 0xdaa520,
gray: 0x808080,
green: 0x008000,
greenyellow: 0xadff2f,
grey: 0x808080,
honeydew: 0xf0fff0,
hotpink: 0xff69b4,
indianred: 0xcd5c5c,
indigo: 0x4b0082,
ivory: 0xfffff0,
khaki: 0xf0e68c,
lavender: 0xe6e6fa,
lavenderblush: 0xfff0f5,
lawngreen: 0x7cfc00,
lemonchiffon: 0xfffacd,
lightblue: 0xadd8e6,
lightcoral: 0xf08080,
lightcyan: 0xe0ffff,
lightgoldenrodyellow: 0xfafad2,
lightgray: 0xd3d3d3,
lightgreen: 0x90ee90,
lightgrey: 0xd3d3d3,
lightpink: 0xffb6c1,
lightsalmon: 0xffa07a,
lightseagreen: 0x20b2aa,
lightskyblue: 0x87cefa,
lightslategray: 0x778899,
lightslategrey: 0x778899,
lightsteelblue: 0xb0c4de,
lightyellow: 0xffffe0,
lime: 0x00ff00,
limegreen: 0x32cd32,
linen: 0xfaf0e6,
magenta: 0xff00ff,
maroon: 0x800000,
mediumaquamarine: 0x66cdaa,
mediumblue: 0x0000cd,
mediumorchid: 0xba55d3,
mediumpurple: 0x9370db,
mediumseagreen: 0x3cb371,
mediumslateblue: 0x7b68ee,
mediumspringgreen: 0x00fa9a,
mediumturquoise: 0x48d1cc,
mediumvioletred: 0xc71585,
midnightblue: 0x191970,
mintcream: 0xf5fffa,
mistyrose: 0xffe4e1,
moccasin: 0xffe4b5,
navajowhite: 0xffdead,
navy: 0x000080,
oldlace: 0xfdf5e6,
olive: 0x808000,
olivedrab: 0x6b8e23,
orange: 0xffa500,
orangered: 0xff4500,
orchid: 0xda70d6,
palegoldenrod: 0xeee8aa,
palegreen: 0x98fb98,
paleturquoise: 0xafeeee,
palevioletred: 0xdb7093,
papayawhip: 0xffefd5,
peachpuff: 0xffdab9,
peru: 0xcd853f,
pink: 0xffc0cb,
plum: 0xdda0dd,
powderblue: 0xb0e0e6,
purple: 0x800080,
rebeccapurple: 0x663399,
red: 0xff0000,
rosybrown: 0xbc8f8f,
royalblue: 0x4169e1,
saddlebrown: 0x8b4513,
salmon: 0xfa8072,
sandybrown: 0xf4a460,
seagreen: 0x2e8b57,
seashell: 0xfff5ee,
sienna: 0xa0522d,
silver: 0xc0c0c0,
skyblue: 0x87ceeb,
slateblue: 0x6a5acd,
slategray: 0x708090,
slategrey: 0x708090,
snow: 0xfffafa,
springgreen: 0x00ff7f,
steelblue: 0x4682b4,
tan: 0xd2b48c,
teal: 0x008080,
thistle: 0xd8bfd8,
tomato: 0xff6347,
turquoise: 0x40e0d0,
violet: 0xee82ee,
wheat: 0xf5deb3,
white: 0xffffff,
whitesmoke: 0xf5f5f5,
yellow: 0xffff00,
yellowgreen: 0x9acd32
};
define(Color, color, {
displayable: function() {
return this.rgb().displayable();
},
toString: function() {
return this.rgb() + "";
}
});
function color(format) {
var m;
format = (format + "").trim().toLowerCase();
return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
: (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
: (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
: (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
: (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
: (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
: (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
: (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
: named.hasOwnProperty(format) ? rgbn(named[format])
: format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
: null;
}
function rgbn(n) {
return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
}
function rgba(r, g, b, a) {
if (a <= 0) r = g = b = NaN;
return new Rgb(r, g, b, a);
}
function rgbConvert(o) {
if (!(o instanceof Color)) o = color(o);
if (!o) return new Rgb;
o = o.rgb();
return new Rgb(o.r, o.g, o.b, o.opacity);
}
function colorRgb(r, g, b, opacity) {
return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
}
function Rgb(r, g, b, opacity) {
this.r = +r;
this.g = +g;
this.b = +b;
this.opacity = +opacity;
}
define(Rgb, colorRgb, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
rgb: function() {
return this;
},
displayable: function() {
return (0 <= this.r && this.r <= 255)
&& (0 <= this.g && this.g <= 255)
&& (0 <= this.b && this.b <= 255)
&& (0 <= this.opacity && this.opacity <= 1);
},
toString: function() {
var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
return (a === 1 ? "rgb(" : "rgba(")
+ Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
+ Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
+ Math.max(0, Math.min(255, Math.round(this.b) || 0))
+ (a === 1 ? ")" : ", " + a + ")");
}
}));
function hsla(h, s, l, a) {
if (a <= 0) h = s = l = NaN;
else if (l <= 0 || l >= 1) h = s = NaN;
else if (s <= 0) h = NaN;
return new Hsl(h, s, l, a);
}
function hslConvert(o) {
if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
if (!(o instanceof Color)) o = color(o);
if (!o) return new Hsl;
if (o instanceof Hsl) return o;
o = o.rgb();
var r = o.r / 255,
g = o.g / 255,
b = o.b / 255,
min = Math.min(r, g, b),
max = Math.max(r, g, b),
h = NaN,
s = max - min,
l = (max + min) / 2;
if (s) {
if (r === max) h = (g - b) / s + (g < b) * 6;
else if (g === max) h = (b - r) / s + 2;
else h = (r - g) / s + 4;
s /= l < 0.5 ? max + min : 2 - max - min;
h *= 60;
} else {
s = l > 0 && l < 1 ? 0 : h;
}
return new Hsl(h, s, l, o.opacity);
}
function colorHsl(h, s, l, opacity) {
return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
}
function Hsl(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
define(Hsl, colorHsl, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = this.h % 360 + (this.h < 0) * 360,
s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
l = this.l,
m2 = l + (l < 0.5 ? l : 1 - l) * s,
m1 = 2 * l - m2;
return new Rgb(
hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
hsl2rgb(h, m1, m2),
hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
this.opacity
);
},
displayable: function() {
return (0 <= this.s && this.s <= 1 || isNaN(this.s))
&& (0 <= this.l && this.l <= 1)
&& (0 <= this.opacity && this.opacity <= 1);
}
}));
/* From FvD 13.37, CSS Color Module Level 3 */
function hsl2rgb(h, m1, m2) {
return (h < 60 ? m1 + (m2 - m1) * h / 60
: h < 180 ? m2
: h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
: m1) * 255;
}
var deg2rad = Math.PI / 180;
var rad2deg = 180 / Math.PI;
var Kn = 18;
var Xn = 0.950470;
var Yn = 1;
var Zn = 1.088830;
var t0 = 4 / 29;
var t1 = 6 / 29;
var t2 = 3 * t1 * t1;
var t3 = t1 * t1 * t1;
function labConvert(o) {
if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
if (o instanceof Hcl) {
var h = o.h * deg2rad;
return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
}
if (!(o instanceof Rgb)) o = rgbConvert(o);
var b = rgb2xyz(o.r),
a = rgb2xyz(o.g),
l = rgb2xyz(o.b),
x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
}
function lab(l, a, b, opacity) {
return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
}
function Lab(l, a, b, opacity) {
this.l = +l;
this.a = +a;
this.b = +b;
this.opacity = +opacity;
}
define(Lab, lab, extend(Color, {
brighter: function(k) {
return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
},
darker: function(k) {
return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
},
rgb: function() {
var y = (this.l + 16) / 116,
x = isNaN(this.a) ? y : y + this.a / 500,
z = isNaN(this.b) ? y : y - this.b / 200;
y = Yn * lab2xyz(y);
x = Xn * lab2xyz(x);
z = Zn * lab2xyz(z);
return new Rgb(
xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
this.opacity
);
}
}));
function xyz2lab(t) {
return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
}
function lab2xyz(t) {
return t > t1 ? t * t * t : t2 * (t - t0);
}
function xyz2rgb(x) {
return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
}
function rgb2xyz(x) {
return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
}
function hclConvert(o) {
if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
if (!(o instanceof Lab)) o = labConvert(o);
var h = Math.atan2(o.b, o.a) * rad2deg;
return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
}
function colorHcl(h, c, l, opacity) {
return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
}
function Hcl(h, c, l, opacity) {
this.h = +h;
this.c = +c;
this.l = +l;
this.opacity = +opacity;
}
define(Hcl, colorHcl, extend(Color, {
brighter: function(k) {
return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
},
darker: function(k) {
return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
},
rgb: function() {
return labConvert(this).rgb();
}
}));
var A = -0.14861;
var B = +1.78277;
var C = -0.29227;
var D = -0.90649;
var E = +1.97294;
var ED = E * D;
var EB = E * B;
var BC_DA = B * C - D * A;
function cubehelixConvert(o) {
if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
if (!(o instanceof Rgb)) o = rgbConvert(o);
var r = o.r / 255,
g = o.g / 255,
b = o.b / 255,
l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
bl = b - l,
k = (E * (g - l) - C * bl) / D,
s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
}
function cubehelix(h, s, l, opacity) {
return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
}
function Cubehelix(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
define(Cubehelix, cubehelix, extend(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
l = +this.l,
a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
cosh = Math.cos(h),
sinh = Math.sin(h);
return new Rgb(
255 * (l + a * (A * cosh + B * sinh)),
255 * (l + a * (C * cosh + D * sinh)),
255 * (l + a * (E * cosh)),
this.opacity
);
}
}));
function basis$1(t1, v0, v1, v2, v3) {
var t2 = t1 * t1, t3 = t2 * t1;
return ((1 - 3 * t1 + 3 * t2 - t3) * v0
+ (4 - 6 * t2 + 3 * t3) * v1
+ (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
+ t3 * v3) / 6;
}
function basis$2(values) {
var n = values.length - 1;
return function(t) {
var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
v1 = values[i],
v2 = values[i + 1],
v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
return basis$1((t - i / n) * n, v0, v1, v2, v3);
};
}
function basisClosed$1(values) {
var n = values.length;
return function(t) {
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
v0 = values[(i + n - 1) % n],
v1 = values[i % n],
v2 = values[(i + 1) % n],
v3 = values[(i + 2) % n];
return basis$1((t - i / n) * n, v0, v1, v2, v3);
};
}
function constant$2(x) {
return function() {
return x;
};
}
function linear$1(a, d) {
return function(t) {
return a + t * d;
};
}
function exponential$1(a, b, y) {
return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
return Math.pow(a + t * b, y);
};
}
function hue(a, b) {
var d = b - a;
return d ? linear$1(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$2(isNaN(a) ? b : a);
}
function gamma(y) {
return (y = +y) === 1 ? nogamma : function(a, b) {
return b - a ? exponential$1(a, b, y) : constant$2(isNaN(a) ? b : a);
};
}
function nogamma(a, b) {
var d = b - a;
return d ? linear$1(a, d) : constant$2(isNaN(a) ? b : a);
}
var interpolateRgb = (function rgbGamma(y) {
var color = gamma(y);
function rgb(start, end) {
var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),
g = color(start.g, end.g),
b = color(start.b, end.b),
opacity = color(start.opacity, end.opacity);
return function(t) {
start.r = r(t);
start.g = g(t);
start.b = b(t);
start.opacity = opacity(t);
return start + "";
};
}
rgb.gamma = rgbGamma;
return rgb;
})(1);
function rgbSpline(spline) {
return function(colors) {
var n = colors.length,
r = new Array(n),
g = new Array(n),
b = new Array(n),
i, color;
for (i = 0; i < n; ++i) {
color = colorRgb(colors[i]);
r[i] = color.r || 0;
g[i] = color.g || 0;
b[i] = color.b || 0;
}
r = spline(r);
g = spline(g);
b = spline(b);
color.opacity = 1;
return function(t) {
color.r = r(t);
color.g = g(t);
color.b = b(t);
return color + "";
};
};
}
var rgbBasis = rgbSpline(basis$2);
var rgbBasisClosed = rgbSpline(basisClosed$1);
function array$1(a, b) {
var nb = b ? b.length : 0,
na = a ? Math.min(nb, a.length) : 0,
x = new Array(nb),
c = new Array(nb),
i;
for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
for (; i < nb; ++i) c[i] = b[i];
return function(t) {
for (i = 0; i < na; ++i) c[i] = x[i](t);
return c;
};
}
function date(a, b) {
var d = new Date;
return a = +a, b -= a, function(t) {
return d.setTime(a + b * t), d;
};
}
function interpolateNumber(a, b) {
return a = +a, b -= a, function(t) {
return a + b * t;
};
}
function object(a, b) {
var i = {},
c = {},
k;
if (a === null || typeof a !== "object") a = {};
if (b === null || typeof b !== "object") b = {};
for (k in b) {
if (k in a) {
i[k] = interpolate(a[k], b[k]);
} else {
c[k] = b[k];
}
}
return function(t) {
for (k in i) c[k] = i[k](t);
return c;
};
}
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
var reB = new RegExp(reA.source, "g");
function zero(b) {
return function() {
return b;
};
}
function one(b) {
return function(t) {
return b(t) + "";
};
}
function interpolateString(a, b) {
var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
am, // current match in a
bm, // current match in b
bs, // string preceding current number in b, if any
i = -1, // index in s
s = [], // string constants and placeholders
q = []; // number interpolators
// Coerce inputs to strings.
a = a + "", b = b + "";
// Interpolate pairs of numbers in a & b.
while ((am = reA.exec(a))
&& (bm = reB.exec(b))) {
if ((bs = bm.index) > bi) { // a string precedes the next number in b
bs = b.slice(bi, bs);
if (s[i]) s[i] += bs; // coalesce with previous string
else s[++i] = bs;
}
if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
if (s[i]) s[i] += bm; // coalesce with previous string
else s[++i] = bm;
} else { // interpolate non-matching numbers
s[++i] = null;
q.push({i: i, x: interpolateNumber(am, bm)});
}
bi = reB.lastIndex;
}
// Add remains of b.
if (bi < b.length) {
bs = b.slice(bi);
if (s[i]) s[i] += bs; // coalesce with previous string
else s[++i] = bs;
}
// Special optimization for only a single match.
// Otherwise, interpolate each of the numbers and rejoin the string.
return s.length < 2 ? (q[0]
? one(q[0].x)
: zero(b))
: (b = q.length, function(t) {
for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
return s.join("");
});
}
function interpolate(a, b) {
var t = typeof b, c;
return b == null || t === "boolean" ? constant$2(b)
: (t === "number" ? interpolateNumber
: t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
: b instanceof color ? interpolateRgb
: b instanceof Date ? date
: Array.isArray(b) ? array$1
: isNaN(b) ? object
: interpolateNumber)(a, b);
}
function interpolateRound(a, b) {
return a = +a, b -= a, function(t) {
return Math.round(a + b * t);
};
}
var degrees = 180 / Math.PI;
var identity$2 = {
translateX: 0,
translateY: 0,
rotate: 0,
skewX: 0,
scaleX: 1,
scaleY: 1
};
function decompose(a, b, c, d, e, f) {
var scaleX, scaleY, skewX;
if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
return {
translateX: e,
translateY: f,
rotate: Math.atan2(b, a) * degrees,
skewX: Math.atan(skewX) * degrees,
scaleX: scaleX,
scaleY: scaleY
};
}
var cssNode;
var cssRoot;
var cssView;
var svgNode;
function parseCss(value) {
if (value === "none") return identity$2;
if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
cssNode.style.transform = value;
value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
cssRoot.removeChild(cssNode);
value = value.slice(7, -1).split(",");
return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
}
function parseSvg(value) {
if (value == null) return identity$2;
if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
svgNode.setAttribute("transform", value);
if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
value = value.matrix;
return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
}
function interpolateTransform(parse, pxComma, pxParen, degParen) {
function pop(s) {
return s.length ? s.pop() + " " : "";
}
function translate(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push("translate(", null, pxComma, null, pxParen);
q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
} else if (xb || yb) {
s.push("translate(" + xb + pxComma + yb + pxParen);
}
}
function rotate(a, b, s, q) {
if (a !== b) {
if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)});
} else if (b) {
s.push(pop(s) + "rotate(" + b + degParen);
}
}
function skewX(a, b, s, q) {
if (a !== b) {
q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
} else if (b) {
s.push(pop(s) + "skewX(" + b + degParen);
}
}
function scale(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push(pop(s) + "scale(", null, ",", null, ")");
q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
} else if (xb !== 1 || yb !== 1) {
s.push(pop(s) + "scale(" + xb + "," + yb + ")");
}
}
return function(a, b) {
var s = [], // string constants and placeholders
q = []; // number interpolators
a = parse(a), b = parse(b);
translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
rotate(a.rotate, b.rotate, s, q);
skewX(a.skewX, b.skewX, s, q);
scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
a = b = null; // gc
return function(t) {
var i = -1, n = q.length, o;
while (++i < n) s[(o = q[i]).i] = o.x(t);
return s.join("");
};
};
}
var interpolateTransform$1 = interpolateTransform(parseCss, "px, ", "px)", "deg)");
var interpolateTransform$2 = interpolateTransform(parseSvg, ", ", ")", ")");
var rho = Math.SQRT2;
var rho2 = 2;
var rho4 = 4;
var epsilon2 = 1e-12;
function cosh(x) {
return ((x = Math.exp(x)) + 1 / x) / 2;
}
function sinh(x) {
return ((x = Math.exp(x)) - 1 / x) / 2;
}
function tanh(x) {
return ((x = Math.exp(2 * x)) - 1) / (x + 1);
}
// p0 = [ux0, uy0, w0]
// p1 = [ux1, uy1, w1]
function interpolateZoom(p0, p1) {
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
dx = ux1 - ux0,
dy = uy1 - uy0,
d2 = dx * dx + dy * dy,
i,
S;
// Special case for u0 ≅ u1.
if (d2 < epsilon2) {
S = Math.log(w1 / w0) / rho;
i = function(t) {
return [
ux0 + t * dx,
uy0 + t * dy,
w0 * Math.exp(rho * t * S)
];
}
}
// General case.
else {
var d1 = Math.sqrt(d2),
b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
S = (r1 - r0) / rho;
i = function(t) {
var s = t * S,
coshr0 = cosh(r0),
u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
return [
ux0 + u * dx,
uy0 + u * dy,
w0 * coshr0 / cosh(rho * s + r0)
];
}
}
i.duration = S * 1000;
return i;
}
function hsl(hue) {
return function(start, end) {
var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),
s = nogamma(start.s, end.s),
l = nogamma(start.l, end.l),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.s = s(t);
start.l = l(t);
start.opacity = opacity(t);
return start + "";
};
}
}
var hsl$1 = hsl(hue);
var hslLong = hsl(nogamma);
function lab$1(start, end) {
var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
a = nogamma(start.a, end.a),
b = nogamma(start.b, end.b),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.l = l(t);
start.a = a(t);
start.b = b(t);
start.opacity = opacity(t);
return start + "";
};
}
function hcl(hue) {
return function(start, end) {
var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),
c = nogamma(start.c, end.c),
l = nogamma(start.l, end.l),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.c = c(t);
start.l = l(t);
start.opacity = opacity(t);
return start + "";
};
}
}
var hcl$1 = hcl(hue);
var hclLong = hcl(nogamma);
function cubehelix$1(hue) {
return (function cubehelixGamma(y) {
y = +y;
function cubehelix$$(start, end) {
var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
s = nogamma(start.s, end.s),
l = nogamma(start.l, end.l),
opacity = nogamma(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.s = s(t);
start.l = l(Math.pow(t, y));
start.opacity = opacity(t);
return start + "";
};
}
cubehelix$$.gamma = cubehelixGamma;
return cubehelix$$;
})(1);
}
var cubehelix$2 = cubehelix$1(hue);
var interpolateCubehelixLong = cubehelix$1(nogamma);
function quantize(interpolator, n) {
var samples = new Array(n);
for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
return samples;
}
var noop$1 = {value: function() {}};
function dispatch() {
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
_[t] = [];
}
return new Dispatch(_);
}
function Dispatch(_) {
this._ = _;
}
function parseTypenames(typenames, types) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
return {type: t, name: name};
});
}
Dispatch.prototype = dispatch.prototype = {
constructor: Dispatch,
on: function(typename, callback) {
var _ = this._,
T = parseTypenames(typename + "", _),
t,
i = -1,
n = T.length;
// If no callback was specified, return the callback of the given type and name.
if (arguments.length < 2) {
while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
return;
}
// If a type was specified, set the callback for the given type and name.
// Otherwise, if a null callback was specified, remove callbacks of the given name.
if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
while (++i < n) {
if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback);
else if (callback == null) for (t in _) _[t] = set$1(_[t], typename.name, null);
}
return this;
},
copy: function() {
var copy = {}, _ = this._;
for (var t in _) copy[t] = _[t].slice();
return new Dispatch(copy);
},
call: function(type, that) {
if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
},
apply: function(type, that, args) {
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
}
};
function get(type, name) {
for (var i = 0, n = type.length, c; i < n; ++i) {
if ((c = type[i]).name === name) {
return c.value;
}
}
}
function set$1(type, name, callback) {
for (var i = 0, n = type.length; i < n; ++i) {
if (type[i].name === name) {
type[i] = noop$1, type = type.slice(0, i).concat(type.slice(i + 1));
break;
}
}
if (callback != null) type.push({name: name, value: callback});
return type;
}
function objectConverter(columns) {
return new Function("d", "return {" + columns.map(function(name, i) {
return JSON.stringify(name) + ": d[" + i + "]";
}).join(",") + "}");
}
function customConverter(columns, f) {
var object = objectConverter(columns);
return function(row, i) {
return f(object(row), i, columns);
};
}
// Compute unique columns in order of discovery.
function inferColumns(rows) {
var columnSet = Object.create(null),
columns = [];
rows.forEach(function(row) {
for (var column in row) {
if (!(column in columnSet)) {
columns.push(columnSet[column] = column);
}
}
});
return columns;
}
function dsv(delimiter) {
var reFormat = new RegExp("[\"" + delimiter + "\n]"),
delimiterCode = delimiter.charCodeAt(0);
function parse(text, f) {
var convert, columns, rows = parseRows(text, function(row, i) {
if (convert) return convert(row, i - 1);
columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
});
rows.columns = columns;
return rows;
}
function parseRows(text, f) {
var EOL = {}, // sentinel value for end-of-line
EOF = {}, // sentinel value for end-of-file
rows = [], // output rows
N = text.length,
I = 0, // current character index
n = 0, // the current line number
t, // the current token
eol; // is the current token followed by EOL?
function token() {
if (I >= N) return EOF; // special case: end of file
if (eol) return eol = false, EOL; // special case: end of line
// special case: quotes
var j = I, c;
if (text.charCodeAt(j) === 34) {
var i = j;
while (i++ < N) {
if (text.charCodeAt(i) === 34) {
if (text.charCodeAt(i + 1) !== 34) break;
++i;
}
}
I = i + 2;
c = text.charCodeAt(i + 1);
if (c === 13) {
eol = true;
if (text.charCodeAt(i + 2) === 10) ++I;
} else if (c === 10) {
eol = true;
}
return text.slice(j + 1, i).replace(/""/g, "\"");
}
// common case: find next delimiter or newline
while (I < N) {
var k = 1;
c = text.charCodeAt(I++);
if (c === 10) eol = true; // \n
else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n
else if (c !== delimiterCode) continue;
return text.slice(j, I - k);
}
// special case: last token before EOF
return text.slice(j);
}
while ((t = token()) !== EOF) {
var a = [];
while (t !== EOL && t !== EOF) {
a.push(t);
t = token();
}
if (f && (a = f(a, n++)) == null) continue;
rows.push(a);
}
return rows;
}
function format(rows, columns) {
if (columns == null) columns = inferColumns(rows);
return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
return columns.map(function(column) {
return formatValue(row[column]);
}).join(delimiter);
})).join("\n");
}
function formatRows(rows) {
return rows.map(formatRow).join("\n");
}
function formatRow(row) {
return row.map(formatValue).join(delimiter);
}
function formatValue(text) {
return text == null ? ""
: reFormat.test(text += "") ? "\"" + text.replace(/\"/g, "\"\"") + "\""
: text;
}
return {
parse: parse,
parseRows: parseRows,
format: format,
formatRows: formatRows
};
}
var csv = dsv(",");
var csvParse = csv.parse;
var csvParseRows = csv.parseRows;
var csvFormat = csv.format;
var csvFormatRows = csv.formatRows;
var tsv = dsv("\t");
var tsvParse = tsv.parse;
var tsvParseRows = tsv.parseRows;
var tsvFormat = tsv.format;
var tsvFormatRows = tsv.formatRows;
function request(url, callback) {
var request,
event = dispatch("beforesend", "progress", "load", "error"),
mimeType,
headers = map$1(),
xhr = new XMLHttpRequest,
user = null,
password = null,
response,
responseType,
timeout = 0;
// If IE does not support CORS, use XDomainRequest.
if (typeof XDomainRequest !== "undefined"
&& !("withCredentials" in xhr)
&& /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
"onload" in xhr
? xhr.onload = xhr.onerror = xhr.ontimeout = respond
: xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
function respond(o) {
var status = xhr.status, result;
if (!status && hasResponse(xhr)
|| status >= 200 && status < 300
|| status === 304) {
if (response) {
try {
result = response.call(request, xhr);
} catch (e) {
event.call("error", request, e);
return;
}
} else {
result = xhr;
}
event.call("load", request, result);
} else {
event.call("error", request, o);
}
}
xhr.onprogress = function(e) {
event.call("progress", request, e);
};
request = {
header: function(name, value) {
name = (name + "").toLowerCase();
if (arguments.length < 2) return headers.get(name);
if (value == null) headers.remove(name);
else headers.set(name, value + "");
return request;
},
// If mimeType is non-null and no Accept header is set, a default is used.
mimeType: function(value) {
if (!arguments.length) return mimeType;
mimeType = value == null ? null : value + "";
return request;
},
// Specifies what type the response value should take;
// for instance, arraybuffer, blob, document, or text.
responseType: function(value) {
if (!arguments.length) return responseType;
responseType = value;
return request;
},
timeout: function(value) {
if (!arguments.length) return timeout;
timeout = +value;
return request;
},
user: function(value) {
return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
},
password: function(value) {
return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
},
// Specify how to convert the response content to a specific type;
// changes the callback value on "load" events.
response: function(value) {
response = value;
return request;
},
// Alias for send("GET", …).
get: function(data, callback) {
return request.send("GET", data, callback);
},
// Alias for send("POST", …).
post: function(data, callback) {
return request.send("POST", data, callback);
},
// If callback is non-null, it will be used for error and load events.
send: function(method, data, callback) {
xhr.open(method, url, true, user, password);
if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
if (responseType != null) xhr.responseType = responseType;
if (timeout > 0) xhr.timeout = timeout;
if (callback == null && typeof data === "function") callback = data, data = null;
if (callback != null && callback.length === 1) callback = fixCallback(callback);
if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
event.call("beforesend", request, xhr);
xhr.send(data == null ? null : data);
return request;
},
abort: function() {
xhr.abort();
return request;
},
on: function() {
var value = event.on.apply(event, arguments);
return value === event ? request : value;
}
};
if (callback != null) {
if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
return request.get(callback);
}
return request;
}
function fixCallback(callback) {
return function(error, xhr) {
callback(error == null ? xhr : null);
};
}
function hasResponse(xhr) {
var type = xhr.responseType;
return type && type !== "text"
? xhr.response // null on error
: xhr.responseText; // "" on error
}
function type(defaultMimeType, response) {
return function(url, callback) {
var r = request(url).mimeType(defaultMimeType).response(response);
if (callback != null) {
if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
return r.get(callback);
}
return r;
};
}
var html = type("text/html", function(xhr) {
return document.createRange().createContextualFragment(xhr.responseText);
});
var json = type("application/json", function(xhr) {
return JSON.parse(xhr.responseText);
});
var text = type("text/plain", function(xhr) {
return xhr.responseText;
});
var xml = type("application/xml", function(xhr) {
var xml = xhr.responseXML;
if (!xml) throw new Error("parse error");
return xml;
});
function dsv$1(defaultMimeType, parse) {
return function(url, row, callback) {
if (arguments.length < 3) callback = row, row = null;
var r = request(url).mimeType(defaultMimeType);
r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
r.row(row);
return callback ? r.get(callback) : r;
};
}
function responseOf(parse, row) {
return function(request) {
return parse(request.responseText, row);
};
}
var csv$1 = dsv$1("text/csv", csvParse);
var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
var frame = 0;
var timeout = 0;
var interval = 0;
var pokeDelay = 1000;
var taskHead;
var taskTail;
var clockLast = 0;
var clockNow = 0;
var clockSkew = 0;
var clock = typeof performance === "object" && performance.now ? performance : Date;
var setFrame = typeof requestAnimationFrame === "function"
? (clock === Date ? function(f) { requestAnimationFrame(function() { f(clock.now()); }); } : requestAnimationFrame)
: function(f) { setTimeout(f, 17); };
function now() {
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
}
function clearNow() {
clockNow = 0;
}
function Timer() {
this._call =
this._time =
this._next = null;
}
Timer.prototype = timer.prototype = {
constructor: Timer,
restart: function(callback, delay, time) {
if (typeof callback !== "function") throw new TypeError("callback is not a function");
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
if (!this._next && taskTail !== this) {
if (taskTail) taskTail._next = this;
else taskHead = this;
taskTail = this;
}
this._call = callback;
this._time = time;
sleep();
},
stop: function() {
if (this._call) {
this._call = null;
this._time = Infinity;
sleep();
}
}
};
function timer(callback, delay, time) {
var t = new Timer;
t.restart(callback, delay, time);
return t;
}
function timerFlush() {
now(); // Get the current time, if not already set.
++frame; // Pretend we’ve set an alarm, if we haven’t already.
var t = taskHead, e;
while (t) {
if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
t = t._next;
}
--frame;
}
function wake(time) {
clockNow = (clockLast = time || clock.now()) + clockSkew;
frame = timeout = 0;
try {
timerFlush();
} finally {
frame = 0;
nap();
clockNow = 0;
}
}
function poke$1() {
var now = clock.now(), delay = now - clockLast;
if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
}
function nap() {
var t0, t1 = taskHead, t2, time = Infinity;
while (t1) {
if (t1._call) {
if (time > t1._time) time = t1._time;
t0 = t1, t1 = t1._next;
} else {
t2 = t1._next, t1._next = null;
t1 = t0 ? t0._next = t2 : taskHead = t2;
}
}
taskTail = t0;
sleep(time);
}
function sleep(time) {
if (frame) return; // Soonest alarm already set, or will be.
if (timeout) timeout = clearTimeout(timeout);
var delay = time - clockNow;
if (delay > 24) {
if (time < Infinity) timeout = setTimeout(wake, delay);
if (interval) interval = clearInterval(interval);
} else {
if (!interval) interval = setInterval(poke$1, pokeDelay);
frame = 1, setFrame(wake);
}
}
function timeout$1(callback, delay, time) {
var t = new Timer;
delay = delay == null ? 0 : +delay;
t.restart(function(elapsed) {
t.stop();
callback(elapsed + delay);
}, delay, time);
return t;
}
function interval$1(callback, delay, time) {
var t = new Timer, total = delay;
if (delay == null) return t.restart(callback, delay, time), t;
delay = +delay, time = time == null ? now() : +time;
t.restart(function tick(elapsed) {
elapsed += total;
t.restart(tick, total += delay, time);
callback(elapsed);
}, delay, time);
return t;
}
var t0$1 = new Date;
var t1$1 = new Date;
function newInterval(floori, offseti, count, field) {
function interval(date) {
return floori(date = new Date(+date)), date;
}
interval.floor = interval;
interval.ceil = function(date) {
return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
};
interval.round = function(date) {
var d0 = interval(date),
d1 = interval.ceil(date);
return date - d0 < d1 - date ? d0 : d1;
};
interval.offset = function(date, step) {
return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
};
interval.range = function(start, stop, step) {
var range = [];
start = interval.ceil(start);
step = step == null ? 1 : Math.floor(step);
if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)
return range;
};
interval.filter = function(test) {
return newInterval(function(date) {
while (floori(date), !test(date)) date.setTime(date - 1);
}, function(date, step) {
while (--step >= 0) while (offseti(date, 1), !test(date));
});
};
if (count) {
interval.count = function(start, end) {
t0$1.setTime(+start), t1$1.setTime(+end);
floori(t0$1), floori(t1$1);
return Math.floor(count(t0$1, t1$1));
};
interval.every = function(step) {
step = Math.floor(step);
return !isFinite(step) || !(step > 0) ? null
: !(step > 1) ? interval
: interval.filter(field
? function(d) { return field(d) % step === 0; }
: function(d) { return interval.count(0, d) % step === 0; });
};
}
return interval;
}
var millisecond = newInterval(function() {
// noop
}, function(date, step) {
date.setTime(+date + step);
}, function(start, end) {
return end - start;
});
// An optimized implementation for this simple case.
millisecond.every = function(k) {
k = Math.floor(k);
if (!isFinite(k) || !(k > 0)) return null;
if (!(k > 1)) return millisecond;
return newInterval(function(date) {
date.setTime(Math.floor(date / k) * k);
}, function(date, step) {
date.setTime(+date + step * k);
}, function(start, end) {
return (end - start) / k;
});
};
var milliseconds = millisecond.range;
var durationSecond = 1e3;
var durationMinute = 6e4;
var durationHour = 36e5;
var durationDay = 864e5;
var durationWeek = 6048e5;
var second = newInterval(function(date) {
date.setTime(Math.floor(date / durationSecond) * durationSecond);
}, function(date, step) {
date.setTime(+date + step * durationSecond);
}, function(start, end) {
return (end - start) / durationSecond;
}, function(date) {
return date.getUTCSeconds();
});
var seconds = second.range;
var minute = newInterval(function(date) {
date.setTime(Math.floor(date / durationMinute) * durationMinute);
}, function(date, step) {
date.setTime(+date + step * durationMinute);
}, function(start, end) {
return (end - start) / durationMinute;
}, function(date) {
return date.getMinutes();
});
var minutes = minute.range;
var hour = newInterval(function(date) {
var offset = date.getTimezoneOffset() * durationMinute % durationHour;
if (offset < 0) offset += durationHour;
date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
}, function(date, step) {
date.setTime(+date + step * durationHour);
}, function(start, end) {
return (end - start) / durationHour;
}, function(date) {
return date.getHours();
});
var hours = hour.range;
var day = newInterval(function(date) {
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setDate(date.getDate() + step);
}, function(start, end) {
return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
}, function(date) {
return date.getDate() - 1;
});
var days = day.range;
function weekday(i) {
return newInterval(function(date) {
date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setDate(date.getDate() + step * 7);
}, function(start, end) {
return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
});
}
var timeWeek = weekday(0);
var timeMonday = weekday(1);
var tuesday = weekday(2);
var wednesday = weekday(3);
var thursday = weekday(4);
var friday = weekday(5);
var saturday = weekday(6);
var sundays = timeWeek.range;
var mondays = timeMonday.range;
var tuesdays = tuesday.range;
var wednesdays = wednesday.range;
var thursdays = thursday.range;
var fridays = friday.range;
var saturdays = saturday.range;
var month = newInterval(function(date) {
date.setDate(1);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setMonth(date.getMonth() + step);
}, function(start, end) {
return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
}, function(date) {
return date.getMonth();
});
var months = month.range;
var year = newInterval(function(date) {
date.setMonth(0, 1);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setFullYear(date.getFullYear() + step);
}, function(start, end) {
return end.getFullYear() - start.getFullYear();
}, function(date) {
return date.getFullYear();
});
// An optimized implementation for this simple case.
year.every = function(k) {
return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
date.setFullYear(Math.floor(date.getFullYear() / k) * k);
date.setMonth(0, 1);
date.setHours(0, 0, 0, 0);
}, function(date, step) {
date.setFullYear(date.getFullYear() + step * k);
});
};
var years = year.range;
var utcMinute = newInterval(function(date) {
date.setUTCSeconds(0, 0);
}, function(date, step) {
date.setTime(+date + step * durationMinute);
}, function(start, end) {
return (end - start) / durationMinute;
}, function(date) {
return date.getUTCMinutes();
});
var utcMinutes = utcMinute.range;
var utcHour = newInterval(function(date) {
date.setUTCMinutes(0, 0, 0);
}, function(date, step) {
date.setTime(+date + step * durationHour);
}, function(start, end) {
return (end - start) / durationHour;
}, function(date) {
return date.getUTCHours();
});
var utcHours = utcHour.range;
var utcDay = newInterval(function(date) {
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCDate(date.getUTCDate() + step);
}, function(start, end) {
return (end - start) / durationDay;
}, function(date) {
return date.getUTCDate() - 1;
});
var utcDays = utcDay.range;
function utcWeekday(i) {
return newInterval(function(date) {
date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCDate(date.getUTCDate() + step * 7);
}, function(start, end) {
return (end - start) / durationWeek;
});
}
var utcWeek = utcWeekday(0);
var utcMonday = utcWeekday(1);
var utcTuesday = utcWeekday(2);
var utcWednesday = utcWeekday(3);
var utcThursday = utcWeekday(4);
var utcFriday = utcWeekday(5);
var utcSaturday = utcWeekday(6);
var utcSundays = utcWeek.range;
var utcMondays = utcMonday.range;
var utcTuesdays = utcTuesday.range;
var utcWednesdays = utcWednesday.range;
var utcThursdays = utcThursday.range;
var utcFridays = utcFriday.range;
var utcSaturdays = utcSaturday.range;
var utcMonth = newInterval(function(date) {
date.setUTCDate(1);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCMonth(date.getUTCMonth() + step);
}, function(start, end) {
return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
}, function(date) {
return date.getUTCMonth();
});
var utcMonths = utcMonth.range;
var utcYear = newInterval(function(date) {
date.setUTCMonth(0, 1);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCFullYear(date.getUTCFullYear() + step);
}, function(start, end) {
return end.getUTCFullYear() - start.getUTCFullYear();
}, function(date) {
return date.getUTCFullYear();
});
// An optimized implementation for this simple case.
utcYear.every = function(k) {
return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
date.setUTCMonth(0, 1);
date.setUTCHours(0, 0, 0, 0);
}, function(date, step) {
date.setUTCFullYear(date.getUTCFullYear() + step * k);
});
};
var utcYears = utcYear.range;
// Computes the decimal coefficient and exponent of the specified number x with
// significant digits p, where x is positive and p is in [1, 21] or undefined.
// For example, formatDecimal(1.23) returns ["123", 0].
function formatDecimal(x, p) {
if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
var i, coefficient = x.slice(0, i);
// The string returned by toExponential either has the form \d\.\d+e[-+]\d+
// (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
return [
coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
+x.slice(i + 1)
];
}
function exponent$1(x) {
return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
}
function formatGroup(grouping, thousands) {
return function(value, width) {
var i = value.length,
t = [],
j = 0,
g = grouping[0],
length = 0;
while (i > 0 && g > 0) {
if (length + g + 1 > width) g = Math.max(1, width - length);
t.push(value.substring(i -= g, i + g));
if ((length += g + 1) > width) break;
g = grouping[j = (j + 1) % grouping.length];
}
return t.reverse().join(thousands);
};
}
function formatDefault(x, p) {
x = x.toPrecision(p);
out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
switch (x[i]) {
case ".": i0 = i1 = i; break;
case "0": if (i0 === 0) i0 = i; i1 = i; break;
case "e": break out;
default: if (i0 > 0) i0 = 0; break;
}
}
return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
}
var prefixExponent;
function formatPrefixAuto(x, p) {
var d = formatDecimal(x, p);
if (!d) return x + "";
var coefficient = d[0],
exponent = d[1],
i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
n = coefficient.length;
return i === n ? coefficient
: i > n ? coefficient + new Array(i - n + 1).join("0")
: i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
: "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
}
function formatRounded(x, p) {
var d = formatDecimal(x, p);
if (!d) return x + "";
var coefficient = d[0],
exponent = d[1];
return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
: coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
: coefficient + new Array(exponent - coefficient.length + 2).join("0");
}
var formatTypes = {
"": formatDefault,
"%": function(x, p) { return (x * 100).toFixed(p); },
"b": function(x) { return Math.round(x).toString(2); },
"c": function(x) { return x + ""; },
"d": function(x) { return Math.round(x).toString(10); },
"e": function(x, p) { return x.toExponential(p); },
"f": function(x, p) { return x.toFixed(p); },
"g": function(x, p) { return x.toPrecision(p); },
"o": function(x) { return Math.round(x).toString(8); },
"p": function(x, p) { return formatRounded(x * 100, p); },
"r": formatRounded,
"s": formatPrefixAuto,
"X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
"x": function(x) { return Math.round(x).toString(16); }
};
// [[fill]align][sign][symbol][0][width][,][.precision][type]
var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
function formatSpecifier(specifier) {
return new FormatSpecifier(specifier);
}
function FormatSpecifier(specifier) {
if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
var match,
fill = match[1] || " ",
align = match[2] || ">",
sign = match[3] || "-",
symbol = match[4] || "",
zero = !!match[5],
width = match[6] && +match[6],
comma = !!match[7],
precision = match[8] && +match[8].slice(1),
type = match[9] || "";
// The "n" type is an alias for ",g".
if (type === "n") comma = true, type = "g";
// Map invalid types to the default format.
else if (!formatTypes[type]) type = "";
// If zero fill is specified, padding goes after sign and before digits.
if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
this.fill = fill;
this.align = align;
this.sign = sign;
this.symbol = symbol;
this.zero = zero;
this.width = width;
this.comma = comma;
this.precision = precision;
this.type = type;
}
FormatSpecifier.prototype.toString = function() {
return this.fill
+ this.align
+ this.sign
+ this.symbol
+ (this.zero ? "0" : "")
+ (this.width == null ? "" : Math.max(1, this.width | 0))
+ (this.comma ? "," : "")
+ (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
+ this.type;
};
var prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];
function identity$3(x) {
return x;
}
function formatLocale(locale) {
var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
currency = locale.currency,
decimal = locale.decimal;
function newFormat(specifier) {
specifier = formatSpecifier(specifier);
var fill = specifier.fill,
align = specifier.align,
sign = specifier.sign,
symbol = specifier.symbol,
zero = specifier.zero,
width = specifier.width,
comma = specifier.comma,
precision = specifier.precision,
type = specifier.type;
// Compute the prefix and suffix.
// For SI-prefix, the suffix is lazily computed.
var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? "%" : "";
// What format function should we use?
// Is this an integer type?
// Can this type generate exponential notation?
var formatType = formatTypes[type],
maybeSuffix = !type || /[defgprs%]/.test(type);
// Set the default precision if not specified,
// or clamp the specified precision to the supported range.
// For significant precision, it must be in [1, 21].
// For fixed precision, it must be in [0, 20].
precision = precision == null ? (type ? 6 : 12)
: /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
: Math.max(0, Math.min(20, precision));
function format(value) {
var valuePrefix = prefix,
valueSuffix = suffix,
i, n, c;
if (type === "c") {
valueSuffix = formatType(value) + valueSuffix;
value = "";
} else {
value = +value;
// Convert negative to positive, and compute the prefix.
// Note that -0 is not less than 0, but 1 / -0 is!
var valueNegative = (value < 0 || 1 / value < 0) && (value *= -1, true);
// Perform the initial formatting.
value = formatType(value, precision);
// If the original value was negative, it may be rounded to zero during
// formatting; treat this as (positive) zero.
if (valueNegative) {
i = -1, n = value.length;
valueNegative = false;
while (++i < n) {
if (c = value.charCodeAt(i), (48 < c && c < 58)
|| (type === "x" && 96 < c && c < 103)
|| (type === "X" && 64 < c && c < 71)) {
valueNegative = true;
break;
}
}
}
// Compute the prefix and suffix.
valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : "");
// Break the formatted value into the integer “value” part that can be
// grouped, and fractional or exponential “suffix” part that is not.
if (maybeSuffix) {
i = -1, n = value.length;
while (++i < n) {
if (c = value.charCodeAt(i), 48 > c || c > 57) {
valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
value = value.slice(0, i);
break;
}
}
}
}
// If the fill character is not "0", grouping is applied before padding.
if (comma && !zero) value = group(value, Infinity);
// Compute the padding.
var length = valuePrefix.length + value.length + valueSuffix.length,
padding = length < width ? new Array(width - length + 1).join(fill) : "";
// If the fill character is "0", grouping is applied after padding.
if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
// Reconstruct the final output based on the desired alignment.
switch (align) {
case "<": return valuePrefix + value + valueSuffix + padding;
case "=": return valuePrefix + padding + value + valueSuffix;
case "^": return padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
}
return padding + valuePrefix + value + valueSuffix;
}
format.toString = function() {
return specifier + "";
};
return format;
}
function formatPrefix(specifier, value) {
var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
k = Math.pow(10, -e),
prefix = prefixes[8 + e / 3];
return function(value) {
return f(k * value) + prefix;
};
}
return {
format: newFormat,
formatPrefix: formatPrefix
};
}
var locale;
exports.format;
exports.formatPrefix;
defaultLocale({
decimal: ".",
thousands: ",",
grouping: [3],
currency: ["$", ""]
});
function defaultLocale(definition) {
locale = formatLocale(definition);
exports.format = locale.format;
exports.formatPrefix = locale.formatPrefix;
return locale;
}
function precisionFixed(step) {
return Math.max(0, -exponent$1(Math.abs(step)));
}
function precisionPrefix(step, value) {
return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
}
function precisionRound(step, max) {
step = Math.abs(step), max = Math.abs(max) - step;
return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
}
function localDate(d) {
if (0 <= d.y && d.y < 100) {
var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
date.setFullYear(d.y);
return date;
}
return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
}
function utcDate(d) {
if (0 <= d.y && d.y < 100) {
var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
date.setUTCFullYear(d.y);
return date;
}
return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
}
function newYear(y) {
return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
}
function formatLocale$1(locale) {
var locale_dateTime = locale.dateTime,
locale_date = locale.date,
locale_time = locale.time,
locale_periods = locale.periods,
locale_weekdays = locale.days,
locale_shortWeekdays = locale.shortDays,
locale_months = locale.months,
locale_shortMonths = locale.shortMonths;
var periodRe = formatRe(locale_periods),
periodLookup = formatLookup(locale_periods),
weekdayRe = formatRe(locale_weekdays),
weekdayLookup = formatLookup(locale_weekdays),
shortWeekdayRe = formatRe(locale_shortWeekdays),
shortWeekdayLookup = formatLookup(locale_shortWeekdays),
monthRe = formatRe(locale_months),
monthLookup = formatLookup(locale_months),
shortMonthRe = formatRe(locale_shortMonths),
shortMonthLookup = formatLookup(locale_shortMonths);
var formats = {
"a": formatShortWeekday,
"A": formatWeekday,
"b": formatShortMonth,
"B": formatMonth,
"c": null,
"d": formatDayOfMonth,
"e": formatDayOfMonth,
"H": formatHour24,
"I": formatHour12,
"j": formatDayOfYear,
"L": formatMilliseconds,
"m": formatMonthNumber,
"M": formatMinutes,
"p": formatPeriod,
"S": formatSeconds,
"U": formatWeekNumberSunday,
"w": formatWeekdayNumber,
"W": formatWeekNumberMonday,
"x": null,
"X": null,
"y": formatYear,
"Y": formatFullYear,
"Z": formatZone,
"%": formatLiteralPercent
};
var utcFormats = {
"a": formatUTCShortWeekday,
"A": formatUTCWeekday,
"b": formatUTCShortMonth,
"B": formatUTCMonth,
"c": null,
"d": formatUTCDayOfMonth,
"e": formatUTCDayOfMonth,
"H": formatUTCHour24,
"I": formatUTCHour12,
"j": formatUTCDayOfYear,
"L": formatUTCMilliseconds,
"m": formatUTCMonthNumber,
"M": formatUTCMinutes,
"p": formatUTCPeriod,
"S": formatUTCSeconds,
"U": formatUTCWeekNumberSunday,
"w": formatUTCWeekdayNumber,
"W": formatUTCWeekNumberMonday,
"x": null,
"X": null,
"y": formatUTCYear,
"Y": formatUTCFullYear,
"Z": formatUTCZone,
"%": formatLiteralPercent
};
var parses = {
"a": parseShortWeekday,
"A": parseWeekday,
"b": parseShortMonth,
"B": parseMonth,
"c": parseLocaleDateTime,
"d": parseDayOfMonth,
"e": parseDayOfMonth,
"H": parseHour24,
"I": parseHour24,
"j": parseDayOfYear,
"L": parseMilliseconds,
"m": parseMonthNumber,
"M": parseMinutes,
"p": parsePeriod,
"S": parseSeconds,
"U": parseWeekNumberSunday,
"w": parseWeekdayNumber,
"W": parseWeekNumberMonday,
"x": parseLocaleDate,
"X": parseLocaleTime,
"y": parseYear,
"Y": parseFullYear,
"Z": parseZone,
"%": parseLiteralPercent
};
// These recursive directive definitions must be deferred.
formats.x = newFormat(locale_date, formats);
formats.X = newFormat(locale_time, formats);
formats.c = newFormat(locale_dateTime, formats);
utcFormats.x = newFormat(locale_date, utcFormats);
utcFormats.X = newFormat(locale_time, utcFormats);
utcFormats.c = newFormat(locale_dateTime, utcFormats);
function newFormat(specifier, formats) {
return function(date) {
var string = [],
i = -1,
j = 0,
n = specifier.length,
c,
pad,
format;
if (!(date instanceof Date)) date = new Date(+date);
while (++i < n) {
if (specifier.charCodeAt(i) === 37) {
string.push(specifier.slice(j, i));
if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
else pad = c === "e" ? " " : "0";
if (format = formats[c]) c = format(date, pad);
string.push(c);
j = i + 1;
}
}
string.push(specifier.slice(j, i));
return string.join("");
};
}
function newParse(specifier, newDate) {
return function(string) {
var d = newYear(1900),
i = parseSpecifier(d, specifier, string += "", 0);
if (i != string.length) return null;
// The am-pm flag is 0 for AM, and 1 for PM.
if ("p" in d) d.H = d.H % 12 + d.p * 12;
// Convert day-of-week and week-of-year to day-of-year.
if ("W" in d || "U" in d) {
if (!("w" in d)) d.w = "W" in d ? 1 : 0;
var day = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
d.m = 0;
d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;
}
// If a time zone is specified, all fields are interpreted as UTC and then
// offset according to the specified time zone.
if ("Z" in d) {
d.H += d.Z / 100 | 0;
d.M += d.Z % 100;
return utcDate(d);
}
// Otherwise, all fields are in local time.
return newDate(d);
};
}
function parseSpecifier(d, specifier, string, j) {
var i = 0,
n = specifier.length,
m = string.length,
c,
parse;
while (i < n) {
if (j >= m) return -1;
c = specifier.charCodeAt(i++);
if (c === 37) {
c = specifier.charAt(i++);
parse = parses[c in pads ? specifier.charAt(i++) : c];
if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
} else if (c != string.charCodeAt(j++)) {
return -1;
}
}
return j;
}
function parsePeriod(d, string, i) {
var n = periodRe.exec(string.slice(i));
return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseShortWeekday(d, string, i) {
var n = shortWeekdayRe.exec(string.slice(i));
return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseWeekday(d, string, i) {
var n = weekdayRe.exec(string.slice(i));
return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseShortMonth(d, string, i) {
var n = shortMonthRe.exec(string.slice(i));
return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseMonth(d, string, i) {
var n = monthRe.exec(string.slice(i));
return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
}
function parseLocaleDateTime(d, string, i) {
return parseSpecifier(d, locale_dateTime, string, i);
}
function parseLocaleDate(d, string, i) {
return parseSpecifier(d, locale_date, string, i);
}
function parseLocaleTime(d, string, i) {
return parseSpecifier(d, locale_time, string, i);
}
function formatShortWeekday(d) {
return locale_shortWeekdays[d.getDay()];
}
function formatWeekday(d) {
return locale_weekdays[d.getDay()];
}
function formatShortMonth(d) {
return locale_shortMonths[d.getMonth()];
}
function formatMonth(d) {
return locale_months[d.getMonth()];
}
function formatPeriod(d) {
return locale_periods[+(d.getHours() >= 12)];
}
function formatUTCShortWeekday(d) {
return locale_shortWeekdays[d.getUTCDay()];
}
function formatUTCWeekday(d) {
return locale_weekdays[d.getUTCDay()];
}
function formatUTCShortMonth(d) {
return locale_shortMonths[d.getUTCMonth()];
}
function formatUTCMonth(d) {
return locale_months[d.getUTCMonth()];
}
function formatUTCPeriod(d) {
return locale_periods[+(d.getUTCHours() >= 12)];
}
return {
format: function(specifier) {
var f = newFormat(specifier += "", formats);
f.toString = function() { return specifier; };
return f;
},
parse: function(specifier) {
var p = newParse(specifier += "", localDate);
p.toString = function() { return specifier; };
return p;
},
utcFormat: function(specifier) {
var f = newFormat(specifier += "", utcFormats);
f.toString = function() { return specifier; };
return f;
},
utcParse: function(specifier) {
var p = newParse(specifier, utcDate);
p.toString = function() { return specifier; };
return p;
}
};
}
var pads = {"-": "", "_": " ", "0": "0"};
var numberRe = /^\s*\d+/;
var percentRe = /^%/;
var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
function pad(value, fill, width) {
var sign = value < 0 ? "-" : "",
string = (sign ? -value : value) + "",
length = string.length;
return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
}
function requote(s) {
return s.replace(requoteRe, "\\$&");
}
function formatRe(names) {
return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
}
function formatLookup(names) {
var map = {}, i = -1, n = names.length;
while (++i < n) map[names[i].toLowerCase()] = i;
return map;
}
function parseWeekdayNumber(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 1));
return n ? (d.w = +n[0], i + n[0].length) : -1;
}
function parseWeekNumberSunday(d, string, i) {
var n = numberRe.exec(string.slice(i));
return n ? (d.U = +n[0], i + n[0].length) : -1;
}
function parseWeekNumberMonday(d, string, i) {
var n = numberRe.exec(string.slice(i));
return n ? (d.W = +n[0], i + n[0].length) : -1;
}
function parseFullYear(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 4));
return n ? (d.y = +n[0], i + n[0].length) : -1;
}
function parseYear(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
}
function parseZone(d, string, i) {
var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6));
return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
}
function parseMonthNumber(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
}
function parseDayOfMonth(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.d = +n[0], i + n[0].length) : -1;
}
function parseDayOfYear(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 3));
return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
}
function parseHour24(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.H = +n[0], i + n[0].length) : -1;
}
function parseMinutes(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.M = +n[0], i + n[0].length) : -1;
}
function parseSeconds(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 2));
return n ? (d.S = +n[0], i + n[0].length) : -1;
}
function parseMilliseconds(d, string, i) {
var n = numberRe.exec(string.slice(i, i + 3));
return n ? (d.L = +n[0], i + n[0].length) : -1;
}
function parseLiteralPercent(d, string, i) {
var n = percentRe.exec(string.slice(i, i + 1));
return n ? i + n[0].length : -1;
}
function formatDayOfMonth(d, p) {
return pad(d.getDate(), p, 2);
}
function formatHour24(d, p) {
return pad(d.getHours(), p, 2);
}
function formatHour12(d, p) {
return pad(d.getHours() % 12 || 12, p, 2);
}
function formatDayOfYear(d, p) {
return pad(1 + day.count(year(d), d), p, 3);
}
function formatMilliseconds(d, p) {
return pad(d.getMilliseconds(), p, 3);
}
function formatMonthNumber(d, p) {
return pad(d.getMonth() + 1, p, 2);
}
function formatMinutes(d, p) {
return pad(d.getMinutes(), p, 2);
}
function formatSeconds(d, p) {
return pad(d.getSeconds(), p, 2);
}
function formatWeekNumberSunday(d, p) {
return pad(timeWeek.count(year(d), d), p, 2);
}
function formatWeekdayNumber(d) {
return d.getDay();
}
function formatWeekNumberMonday(d, p) {
return pad(timeMonday.count(year(d), d), p, 2);
}
function formatYear(d, p) {
return pad(d.getFullYear() % 100, p, 2);
}
function formatFullYear(d, p) {
return pad(d.getFullYear() % 10000, p, 4);
}
function formatZone(d) {
var z = d.getTimezoneOffset();
return (z > 0 ? "-" : (z *= -1, "+"))
+ pad(z / 60 | 0, "0", 2)
+ pad(z % 60, "0", 2);
}
function formatUTCDayOfMonth(d, p) {
return pad(d.getUTCDate(), p, 2);
}
function formatUTCHour24(d, p) {
return pad(d.getUTCHours(), p, 2);
}
function formatUTCHour12(d, p) {
return pad(d.getUTCHours() % 12 || 12, p, 2);
}
function formatUTCDayOfYear(d, p) {
return pad(1 + utcDay.count(utcYear(d), d), p, 3);
}
function formatUTCMilliseconds(d, p) {
return pad(d.getUTCMilliseconds(), p, 3);
}
function formatUTCMonthNumber(d, p) {
return pad(d.getUTCMonth() + 1, p, 2);
}
function formatUTCMinutes(d, p) {
return pad(d.getUTCMinutes(), p, 2);
}
function formatUTCSeconds(d, p) {
return pad(d.getUTCSeconds(), p, 2);
}
function formatUTCWeekNumberSunday(d, p) {
return pad(utcWeek.count(utcYear(d), d), p, 2);
}
function formatUTCWeekdayNumber(d) {
return d.getUTCDay();
}
function formatUTCWeekNumberMonday(d, p) {
return pad(utcMonday.count(utcYear(d), d), p, 2);
}
function formatUTCYear(d, p) {
return pad(d.getUTCFullYear() % 100, p, 2);
}
function formatUTCFullYear(d, p) {
return pad(d.getUTCFullYear() % 10000, p, 4);
}
function formatUTCZone() {
return "+0000";
}
function formatLiteralPercent() {
return "%";
}
var locale$1;
exports.timeFormat;
exports.timeParse;
exports.utcFormat;
exports.utcParse;
defaultLocale$1({
dateTime: "%x, %X",
date: "%-m/%-d/%Y",
time: "%-I:%M:%S %p",
periods: ["AM", "PM"],
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
});
function defaultLocale$1(definition) {
locale$1 = formatLocale$1(definition);
exports.timeFormat = locale$1.format;
exports.timeParse = locale$1.parse;
exports.utcFormat = locale$1.utcFormat;
exports.utcParse = locale$1.utcParse;
return locale$1;
}
var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
function formatIsoNative(date) {
return date.toISOString();
}
var formatIso = Date.prototype.toISOString
? formatIsoNative
: exports.utcFormat(isoSpecifier);
function parseIsoNative(string) {
var date = new Date(string);
return isNaN(date) ? null : date;
}
var parseIso = +new Date("2000-01-01T00:00:00.000Z")
? parseIsoNative
: exports.utcParse(isoSpecifier);
var array$2 = Array.prototype;
var map$2 = array$2.map;
var slice$3 = array$2.slice;
var implicit = {name: "implicit"};
function ordinal(range) {
var index = map$1(),
domain = [],
unknown = implicit;
range = range == null ? [] : slice$3.call(range);
function scale(d) {
var key = d + "", i = index.get(key);
if (!i) {
if (unknown !== implicit) return unknown;
index.set(key, i = domain.push(d));
}
return range[(i - 1) % range.length];
}
scale.domain = function(_) {
if (!arguments.length) return domain.slice();
domain = [], index = map$1();
var i = -1, n = _.length, d, key;
while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
return scale;
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), scale) : range.slice();
};
scale.unknown = function(_) {
return arguments.length ? (unknown = _, scale) : unknown;
};
scale.copy = function() {
return ordinal()
.domain(domain)
.range(range)
.unknown(unknown);
};
return scale;
}
function band() {
var scale = ordinal().unknown(undefined),
domain = scale.domain,
ordinalRange = scale.range,
range$$ = [0, 1],
step,
bandwidth,
round = false,
paddingInner = 0,
paddingOuter = 0,
align = 0.5;
delete scale.unknown;
function rescale() {
var n = domain().length,
reverse = range$$[1] < range$$[0],
start = range$$[reverse - 0],
stop = range$$[1 - reverse];
step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
if (round) step = Math.floor(step);
start += (stop - start - step * (n - paddingInner)) * align;
bandwidth = step * (1 - paddingInner);
if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
var values = range(n).map(function(i) { return start + step * i; });
return ordinalRange(reverse ? values.reverse() : values);
}
scale.domain = function(_) {
return arguments.length ? (domain(_), rescale()) : domain();
};
scale.range = function(_) {
return arguments.length ? (range$$ = [+_[0], +_[1]], rescale()) : range$$.slice();
};
scale.rangeRound = function(_) {
return range$$ = [+_[0], +_[1]], round = true, rescale();
};
scale.bandwidth = function() {
return bandwidth;
};
scale.step = function() {
return step;
};
scale.round = function(_) {
return arguments.length ? (round = !!_, rescale()) : round;
};
scale.padding = function(_) {
return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
};
scale.paddingInner = function(_) {
return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
};
scale.paddingOuter = function(_) {
return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
};
scale.align = function(_) {
return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
};
scale.copy = function() {
return band()
.domain(domain())
.range(range$$)
.round(round)
.paddingInner(paddingInner)
.paddingOuter(paddingOuter)
.align(align);
};
return rescale();
}
function pointish(scale) {
var copy = scale.copy;
scale.padding = scale.paddingOuter;
delete scale.paddingInner;
delete scale.paddingOuter;
scale.copy = function() {
return pointish(copy());
};
return scale;
}
function point$4() {
return pointish(band().paddingInner(1));
}
function constant$3(x) {
return function() {
return x;
};
}
function number$1(x) {
return +x;
}
var unit = [0, 1];
function deinterpolate(a, b) {
return (b -= (a = +a))
? function(x) { return (x - a) / b; }
: constant$3(b);
}
function deinterpolateClamp(deinterpolate) {
return function(a, b) {
var d = deinterpolate(a = +a, b = +b);
return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
};
}
function reinterpolateClamp(reinterpolate) {
return function(a, b) {
var r = reinterpolate(a = +a, b = +b);
return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
};
}
function bimap(domain, range, deinterpolate, reinterpolate) {
var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
return function(x) { return r0(d0(x)); };
}
function polymap(domain, range, deinterpolate, reinterpolate) {
var j = Math.min(domain.length, range.length) - 1,
d = new Array(j),
r = new Array(j),
i = -1;
// Reverse descending domains.
if (domain[j] < domain[0]) {
domain = domain.slice().reverse();
range = range.slice().reverse();
}
while (++i < j) {
d[i] = deinterpolate(domain[i], domain[i + 1]);
r[i] = reinterpolate(range[i], range[i + 1]);
}
return function(x) {
var i = bisectRight(domain, x, 1, j) - 1;
return r[i](d[i](x));
};
}
function copy(source, target) {
return target
.domain(source.domain())
.range(source.range())
.interpolate(source.interpolate())
.clamp(source.clamp());
}
// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
function continuous(deinterpolate$$, reinterpolate) {
var domain = unit,
range = unit,
interpolate$$ = interpolate,
clamp = false,
piecewise,
output,
input;
function rescale() {
piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
output = input = null;
return scale;
}
function scale(x) {
return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate$$) : deinterpolate$$, interpolate$$)))(+x);
}
scale.invert = function(y) {
return (input || (input = piecewise(range, domain, deinterpolate, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
};
scale.domain = function(_) {
return arguments.length ? (domain = map$2.call(_, number$1), rescale()) : domain.slice();
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), rescale()) : range.slice();
};
scale.rangeRound = function(_) {
return range = slice$3.call(_), interpolate$$ = interpolateRound, rescale();
};
scale.clamp = function(_) {
return arguments.length ? (clamp = !!_, rescale()) : clamp;
};
scale.interpolate = function(_) {
return arguments.length ? (interpolate$$ = _, rescale()) : interpolate$$;
};
return rescale();
}
function tickFormat(domain, count, specifier) {
var start = domain[0],
stop = domain[domain.length - 1],
step = tickStep(start, stop, count == null ? 10 : count),
precision;
specifier = formatSpecifier(specifier == null ? ",f" : specifier);
switch (specifier.type) {
case "s": {
var value = Math.max(Math.abs(start), Math.abs(stop));
if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
return exports.formatPrefix(specifier, value);
}
case "":
case "e":
case "g":
case "p":
case "r": {
if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
break;
}
case "f":
case "%": {
if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
break;
}
}
return exports.format(specifier);
}
function linearish(scale) {
var domain = scale.domain;
scale.ticks = function(count) {
var d = domain();
return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
};
scale.tickFormat = function(count, specifier) {
return tickFormat(domain(), count, specifier);
};
scale.nice = function(count) {
var d = domain(),
i = d.length - 1,
n = count == null ? 10 : count,
start = d[0],
stop = d[i],
step = tickStep(start, stop, n);
if (step) {
step = tickStep(Math.floor(start / step) * step, Math.ceil(stop / step) * step, n);
d[0] = Math.floor(start / step) * step;
d[i] = Math.ceil(stop / step) * step;
domain(d);
}
return scale;
};
return scale;
}
function linear$2() {
var scale = continuous(deinterpolate, interpolateNumber);
scale.copy = function() {
return copy(scale, linear$2());
};
return linearish(scale);
}
function identity$4() {
var domain = [0, 1];
function scale(x) {
return +x;
}
scale.invert = scale;
scale.domain = scale.range = function(_) {
return arguments.length ? (domain = map$2.call(_, number$1), scale) : domain.slice();
};
scale.copy = function() {
return identity$4().domain(domain);
};
return linearish(scale);
}
function nice(domain, interval) {
domain = domain.slice();
var i0 = 0,
i1 = domain.length - 1,
x0 = domain[i0],
x1 = domain[i1],
t;
if (x1 < x0) {
t = i0, i0 = i1, i1 = t;
t = x0, x0 = x1, x1 = t;
}
domain[i0] = interval.floor(x0);
domain[i1] = interval.ceil(x1);
return domain;
}
function deinterpolate$1(a, b) {
return (b = Math.log(b / a))
? function(x) { return Math.log(x / a) / b; }
: constant$3(b);
}
function reinterpolate(a, b) {
return a < 0
? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
: function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
}
function pow10(x) {
return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
}
function powp(base) {
return base === 10 ? pow10
: base === Math.E ? Math.exp
: function(x) { return Math.pow(base, x); };
}
function logp(base) {
return base === Math.E ? Math.log
: base === 10 && Math.log10
|| base === 2 && Math.log2
|| (base = Math.log(base), function(x) { return Math.log(x) / base; });
}
function reflect(f) {
return function(x) {
return -f(-x);
};
}
function log() {
var scale = continuous(deinterpolate$1, reinterpolate).domain([1, 10]),
domain = scale.domain,
base = 10,
logs = logp(10),
pows = powp(10);
function rescale() {
logs = logp(base), pows = powp(base);
if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
return scale;
}
scale.base = function(_) {
return arguments.length ? (base = +_, rescale()) : base;
};
scale.domain = function(_) {
return arguments.length ? (domain(_), rescale()) : domain();
};
scale.ticks = function(count) {
var d = domain(),
u = d[0],
v = d[d.length - 1],
r;
if (r = v < u) i = u, u = v, v = i;
var i = logs(u),
j = logs(v),
p,
k,
t,
n = count == null ? 10 : +count,
z = [];
if (!(base % 1) && j - i < n) {
i = Math.round(i) - 1, j = Math.round(j) + 1;
if (u > 0) for (; i < j; ++i) {
for (k = 1, p = pows(i); k < base; ++k) {
t = p * k;
if (t < u) continue;
if (t > v) break;
z.push(t);
}
} else for (; i < j; ++i) {
for (k = base - 1, p = pows(i); k >= 1; --k) {
t = p * k;
if (t < u) continue;
if (t > v) break;
z.push(t);
}
}
} else {
z = ticks(i, j, Math.min(j - i, n)).map(pows);
}
return r ? z.reverse() : z;
};
scale.tickFormat = function(count, specifier) {
if (specifier == null) specifier = base === 10 ? ".0e" : ",";
if (typeof specifier !== "function") specifier = exports.format(specifier);
if (count === Infinity) return specifier;
if (count == null) count = 10;
var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
return function(d) {
var i = d / pows(Math.round(logs(d)));
if (i * base < base - 0.5) i *= base;
return i <= k ? specifier(d) : "";
};
};
scale.nice = function() {
return domain(nice(domain(), {
floor: function(x) { return pows(Math.floor(logs(x))); },
ceil: function(x) { return pows(Math.ceil(logs(x))); }
}));
};
scale.copy = function() {
return copy(scale, log().base(base));
};
return scale;
}
function raise(x, exponent) {
return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
}
function pow() {
var exponent = 1,
scale = continuous(deinterpolate, reinterpolate),
domain = scale.domain;
function deinterpolate(a, b) {
return (b = raise(b, exponent) - (a = raise(a, exponent)))
? function(x) { return (raise(x, exponent) - a) / b; }
: constant$3(b);
}
function reinterpolate(a, b) {
b = raise(b, exponent) - (a = raise(a, exponent));
return function(t) { return raise(a + b * t, 1 / exponent); };
}
scale.exponent = function(_) {
return arguments.length ? (exponent = +_, domain(domain())) : exponent;
};
scale.copy = function() {
return copy(scale, pow().exponent(exponent));
};
return linearish(scale);
}
function sqrt() {
return pow().exponent(0.5);
}
function quantile() {
var domain = [],
range = [],
thresholds = [];
function rescale() {
var i = 0, n = Math.max(1, range.length);
thresholds = new Array(n - 1);
while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
return scale;
}
function scale(x) {
if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
}
scale.invertExtent = function(y) {
var i = range.indexOf(y);
return i < 0 ? [NaN, NaN] : [
i > 0 ? thresholds[i - 1] : domain[0],
i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
];
};
scale.domain = function(_) {
if (!arguments.length) return domain.slice();
domain = [];
for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
domain.sort(ascending);
return rescale();
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), rescale()) : range.slice();
};
scale.quantiles = function() {
return thresholds.slice();
};
scale.copy = function() {
return quantile()
.domain(domain)
.range(range);
};
return scale;
}
function quantize$1() {
var x0 = 0,
x1 = 1,
n = 1,
domain = [0.5],
range = [0, 1];
function scale(x) {
if (x <= x) return range[bisectRight(domain, x, 0, n)];
}
function rescale() {
var i = -1;
domain = new Array(n);
while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
return scale;
}
scale.domain = function(_) {
return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
};
scale.range = function(_) {
return arguments.length ? (n = (range = slice$3.call(_)).length - 1, rescale()) : range.slice();
};
scale.invertExtent = function(y) {
var i = range.indexOf(y);
return i < 0 ? [NaN, NaN]
: i < 1 ? [x0, domain[0]]
: i >= n ? [domain[n - 1], x1]
: [domain[i - 1], domain[i]];
};
scale.copy = function() {
return quantize$1()
.domain([x0, x1])
.range(range);
};
return linearish(scale);
}
function threshold$1() {
var domain = [0.5],
range = [0, 1],
n = 1;
function scale(x) {
if (x <= x) return range[bisectRight(domain, x, 0, n)];
}
scale.domain = function(_) {
return arguments.length ? (domain = slice$3.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
};
scale.range = function(_) {
return arguments.length ? (range = slice$3.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
};
scale.invertExtent = function(y) {
var i = range.indexOf(y);
return [domain[i - 1], domain[i]];
};
scale.copy = function() {
return threshold$1()
.domain(domain)
.range(range);
};
return scale;
}
var durationSecond$1 = 1000;
var durationMinute$1 = durationSecond$1 * 60;
var durationHour$1 = durationMinute$1 * 60;
var durationDay$1 = durationHour$1 * 24;
var durationWeek$1 = durationDay$1 * 7;
var durationMonth = durationDay$1 * 30;
var durationYear = durationDay$1 * 365;
function date$1(t) {
return new Date(t);
}
function number$2(t) {
return t instanceof Date ? +t : +new Date(+t);
}
function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
var scale = continuous(deinterpolate, interpolateNumber),
invert = scale.invert,
domain = scale.domain;
var formatMillisecond = format(".%L"),
formatSecond = format(":%S"),
formatMinute = format("%I:%M"),
formatHour = format("%I %p"),
formatDay = format("%a %d"),
formatWeek = format("%b %d"),
formatMonth = format("%B"),
formatYear = format("%Y");
var tickIntervals = [
[second, 1, durationSecond$1],
[second, 5, 5 * durationSecond$1],
[second, 15, 15 * durationSecond$1],
[second, 30, 30 * durationSecond$1],
[minute, 1, durationMinute$1],
[minute, 5, 5 * durationMinute$1],
[minute, 15, 15 * durationMinute$1],
[minute, 30, 30 * durationMinute$1],
[ hour, 1, durationHour$1 ],
[ hour, 3, 3 * durationHour$1 ],
[ hour, 6, 6 * durationHour$1 ],
[ hour, 12, 12 * durationHour$1 ],
[ day, 1, durationDay$1 ],
[ day, 2, 2 * durationDay$1 ],
[ week, 1, durationWeek$1 ],
[ month, 1, durationMonth ],
[ month, 3, 3 * durationMonth ],
[ year, 1, durationYear ]
];
function tickFormat(date) {
return (second(date) < date ? formatMillisecond
: minute(date) < date ? formatSecond
: hour(date) < date ? formatMinute
: day(date) < date ? formatHour
: month(date) < date ? (week(date) < date ? formatDay : formatWeek)
: year(date) < date ? formatMonth
: formatYear)(date);
}
function tickInterval(interval, start, stop, step) {
if (interval == null) interval = 10;
// If a desired tick count is specified, pick a reasonable tick interval
// based on the extent of the domain and a rough estimate of tick size.
// Otherwise, assume interval is already a time interval and use it.
if (typeof interval === "number") {
var target = Math.abs(stop - start) / interval,
i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);
if (i === tickIntervals.length) {
step = tickStep(start / durationYear, stop / durationYear, interval);
interval = year;
} else if (i) {
i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
step = i[1];
interval = i[0];
} else {
step = tickStep(start, stop, interval);
interval = millisecond;
}
}
return step == null ? interval : interval.every(step);
}
scale.invert = function(y) {
return new Date(invert(y));
};
scale.domain = function(_) {
return arguments.length ? domain(map$2.call(_, number$2)) : domain().map(date$1);
};
scale.ticks = function(interval, step) {
var d = domain(),
t0 = d[0],
t1 = d[d.length - 1],
r = t1 < t0,
t;
if (r) t = t0, t0 = t1, t1 = t;
t = tickInterval(interval, t0, t1, step);
t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
return r ? t.reverse() : t;
};
scale.tickFormat = function(count, specifier) {
return specifier == null ? tickFormat : format(specifier);
};
scale.nice = function(interval, step) {
var d = domain();
return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
? domain(nice(d, interval))
: scale;
};
scale.copy = function() {
return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
};
return scale;
}
function time() {
return calendar(year, month, timeWeek, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
}
function utcTime() {
return calendar(utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
}
function colors(s) {
return s.match(/.{6}/g).map(function(x) {
return "#" + x;
});
}
var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
var cubehelix$3 = interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
var rainbow = cubehelix();
function rainbow$1(t) {
if (t < 0 || t > 1) t -= Math.floor(t);
var ts = Math.abs(t - 0.5);
rainbow.h = 360 * t - 100;
rainbow.s = 1.5 - 1.5 * ts;
rainbow.l = 0.8 - 0.9 * ts;
return rainbow + "";
}
function ramp(range) {
var n = range.length;
return function(t) {
return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
};
}
var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
function sequential(interpolator) {
var x0 = 0,
x1 = 1,
clamp = false;
function scale(x) {
var t = (x - x0) / (x1 - x0);
return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
}
scale.domain = function(_) {
return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
};
scale.clamp = function(_) {
return arguments.length ? (clamp = !!_, scale) : clamp;
};
scale.interpolator = function(_) {
return arguments.length ? (interpolator = _, scale) : interpolator;
};
scale.copy = function() {
return sequential(interpolator).domain([x0, x1]).clamp(clamp);
};
return linearish(scale);
}
var xhtml = "http://www.w3.org/1999/xhtml";
var namespaces = {
svg: "http://www.w3.org/2000/svg",
xhtml: xhtml,
xlink: "http://www.w3.org/1999/xlink",
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
};
function namespace(name) {
var prefix = name += "", i = prefix.indexOf(":");
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
}
function creatorInherit(name) {
return function() {
var document = this.ownerDocument,
uri = this.namespaceURI;
return uri === xhtml && document.documentElement.namespaceURI === xhtml
? document.createElement(name)
: document.createElementNS(uri, name);
};
}
function creatorFixed(fullname) {
return function() {
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
};
}
function creator(name) {
var fullname = namespace(name);
return (fullname.local
? creatorFixed
: creatorInherit)(fullname);
}
var nextId = 0;
function local() {
return new Local;
}
function Local() {
this._ = "@" + (++nextId).toString(36);
}
Local.prototype = local.prototype = {
constructor: Local,
get: function(node) {
var id = this._;
while (!(id in node)) if (!(node = node.parentNode)) return;
return node[id];
},
set: function(node, value) {
return node[this._] = value;
},
remove: function(node) {
return this._ in node && delete node[this._];
},
toString: function() {
return this._;
}
};
var matcher = function(selector) {
return function() {
return this.matches(selector);
};
};
if (typeof document !== "undefined") {
var element = document.documentElement;
if (!element.matches) {
var vendorMatches = element.webkitMatchesSelector
|| element.msMatchesSelector
|| element.mozMatchesSelector
|| element.oMatchesSelector;
matcher = function(selector) {
return function() {
return vendorMatches.call(this, selector);
};
};
}
}
var matcher$1 = matcher;
var filterEvents = {};
exports.event = null;
if (typeof document !== "undefined") {
var element$1 = document.documentElement;
if (!("onmouseenter" in element$1)) {
filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
}
}
function filterContextListener(listener, index, group) {
listener = contextListener(listener, index, group);
return function(event) {
var related = event.relatedTarget;
if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
listener.call(this, event);
}
};
}
function contextListener(listener, index, group) {
return function(event1) {
var event0 = exports.event; // Events can be reentrant (e.g., focus).
exports.event = event1;
try {
listener.call(this, this.__data__, index, group);
} finally {
exports.event = event0;
}
};
}
function parseTypenames$1(typenames) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
return {type: t, name: name};
});
}
function onRemove(typename) {
return function() {
var on = this.__on;
if (!on) return;
for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.capture);
} else {
on[++i] = o;
}
}
if (++i) on.length = i;
else delete this.__on;
};
}
function onAdd(typename, value, capture) {
var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
return function(d, i, group) {
var on = this.__on, o, listener = wrap(value, i, group);
if (on) for (var j = 0, m = on.length; j < m; ++j) {
if ((o = on[j]).type === typename.type && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.capture);
this.addEventListener(o.type, o.listener = listener, o.capture = capture);
o.value = value;
return;
}
}
this.addEventListener(typename.type, listener, capture);
o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
if (!on) this.__on = [o];
else on.push(o);
};
}
function selection_on(typename, value, capture) {
var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
if (arguments.length < 2) {
var on = this.node().__on;
if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
for (i = 0, o = on[j]; i < n; ++i) {
if ((t = typenames[i]).type === o.type && t.name === o.name) {
return o.value;
}
}
}
return;
}
on = value ? onAdd : onRemove;
if (capture == null) capture = false;
for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
return this;
}
function customEvent(event1, listener, that, args) {
var event0 = exports.event;
event1.sourceEvent = exports.event;
exports.event = event1;
try {
return listener.apply(that, args);
} finally {
exports.event = event0;
}
}
function sourceEvent() {
var current = exports.event, source;
while (source = current.sourceEvent) current = source;
return current;
}
function point$5(node, event) {
var svg = node.ownerSVGElement || node;
if (svg.createSVGPoint) {
var point = svg.createSVGPoint();
point.x = event.clientX, point.y = event.clientY;
point = point.matrixTransform(node.getScreenCTM().inverse());
return [point.x, point.y];
}
var rect = node.getBoundingClientRect();
return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
}
function mouse(node) {
var event = sourceEvent();
if (event.changedTouches) event = event.changedTouches[0];
return point$5(node, event);
}
function none$2() {}
function selector(selector) {
return selector == null ? none$2 : function() {
return this.querySelector(selector);
};
}
function selection_select(select) {
if (typeof select !== "function") select = selector(select);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
subgroup[i] = subnode;
}
}
}
return new Selection(subgroups, this._parents);
}
function empty() {
return [];
}
function selectorAll(selector) {
return selector == null ? empty : function() {
return this.querySelectorAll(selector);
};
}
function selection_selectAll(select) {
if (typeof select !== "function") select = selectorAll(select);
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
subgroups.push(select.call(node, node.__data__, i, group));
parents.push(node);
}
}
}
return new Selection(subgroups, parents);
}
function selection_filter(match) {
if (typeof match !== "function") match = matcher$1(match);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new Selection(subgroups, this._parents);
}
function sparse(update) {
return new Array(update.length);
}
function selection_enter() {
return new Selection(this._enter || this._groups.map(sparse), this._parents);
}
function EnterNode(parent, datum) {
this.ownerDocument = parent.ownerDocument;
this.namespaceURI = parent.namespaceURI;
this._next = null;
this._parent = parent;
this.__data__ = datum;
}
EnterNode.prototype = {
constructor: EnterNode,
appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
querySelector: function(selector) { return this._parent.querySelector(selector); },
querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
};
function constant$4(x) {
return function() {
return x;
};
}
var keyPrefix = "$"; // Protect against keys like “__proto__”.
function bindIndex(parent, group, enter, update, exit, data) {
var i = 0,
node,
groupLength = group.length,
dataLength = data.length;
// Put any non-null nodes that fit into update.
// Put any null nodes into enter.
// Put any remaining data into enter.
for (; i < dataLength; ++i) {
if (node = group[i]) {
node.__data__ = data[i];
update[i] = node;
} else {
enter[i] = new EnterNode(parent, data[i]);
}
}
// Put any non-null nodes that don’t fit into exit.
for (; i < groupLength; ++i) {
if (node = group[i]) {
exit[i] = node;
}
}
}
function bindKey(parent, group, enter, update, exit, data, key) {
var i,
node,
nodeByKeyValue = {},
groupLength = group.length,
dataLength = data.length,
keyValues = new Array(groupLength),
keyValue;
// Compute the key for each node.
// If multiple nodes have the same key, the duplicates are added to exit.
for (i = 0; i < groupLength; ++i) {
if (node = group[i]) {
keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
if (keyValue in nodeByKeyValue) {
exit[i] = node;
} else {
nodeByKeyValue[keyValue] = node;
}
}
}
// Compute the key for each datum.
// If there a node associated with this key, join and add it to update.
// If there is not (or the key is a duplicate), add it to enter.
for (i = 0; i < dataLength; ++i) {
keyValue = keyPrefix + key.call(parent, data[i], i, data);
if (node = nodeByKeyValue[keyValue]) {
update[i] = node;
node.__data__ = data[i];
nodeByKeyValue[keyValue] = null;
} else {
enter[i] = new EnterNode(parent, data[i]);
}
}
// Add any remaining nodes that were not bound to data to exit.
for (i = 0; i < groupLength; ++i) {
if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
exit[i] = node;
}
}
}
function selection_data(value, key) {
if (!value) {
data = new Array(this.size()), j = -1;
this.each(function(d) { data[++j] = d; });
return data;
}
var bind = key ? bindKey : bindIndex,
parents = this._parents,
groups = this._groups;
if (typeof value !== "function") value = constant$4(value);
for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
var parent = parents[j],
group = groups[j],
groupLength = group.length,
data = value.call(parent, parent && parent.__data__, j, parents),
dataLength = data.length,
enterGroup = enter[j] = new Array(dataLength),
updateGroup = update[j] = new Array(dataLength),
exitGroup = exit[j] = new Array(groupLength);
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
// Now connect the enter nodes to their following update node, such that
// appendChild can insert the materialized enter node before this node,
// rather than at the end of the parent node.
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
if (previous = enterGroup[i0]) {
if (i0 >= i1) i1 = i0 + 1;
while (!(next = updateGroup[i1]) && ++i1 < dataLength);
previous._next = next || null;
}
}
}
update = new Selection(update, parents);
update._enter = enter;
update._exit = exit;
return update;
}
function selection_exit() {
return new Selection(this._exit || this._groups.map(sparse), this._parents);
}
function selection_merge(selection) {
for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new Selection(merges, this._parents);
}
function selection_order() {
for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
if (node = group[i]) {
if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
next = node;
}
}
}
return this;
}
function selection_sort(compare) {
if (!compare) compare = ascending$2;
function compareNode(a, b) {
return a && b ? compare(a.__data__, b.__data__) : !a - !b;
}
for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group[i]) {
sortgroup[i] = node;
}
}
sortgroup.sort(compareNode);
}
return new Selection(sortgroups, this._parents).order();
}
function ascending$2(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
function selection_call() {
var callback = arguments[0];
arguments[0] = this;
callback.apply(null, arguments);
return this;
}
function selection_nodes() {
var nodes = new Array(this.size()), i = -1;
this.each(function() { nodes[++i] = this; });
return nodes;
}
function selection_node() {
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
var node = group[i];
if (node) return node;
}
}
return null;
}
function selection_size() {
var size = 0;
this.each(function() { ++size; });
return size;
}
function selection_empty() {
return !this.node();
}
function selection_each(callback) {
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
if (node = group[i]) callback.call(node, node.__data__, i, group);
}
}
return this;
}
function attrRemove(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant(name, value) {
return function() {
this.setAttribute(name, value);
};
}
function attrConstantNS(fullname, value) {
return function() {
this.setAttributeNS(fullname.space, fullname.local, value);
};
}
function attrFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.removeAttribute(name);
else this.setAttribute(name, v);
};
}
function attrFunctionNS(fullname, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
else this.setAttributeNS(fullname.space, fullname.local, v);
};
}
function selection_attr(name, value) {
var fullname = namespace(name);
if (arguments.length < 2) {
var node = this.node();
return fullname.local
? node.getAttributeNS(fullname.space, fullname.local)
: node.getAttribute(fullname);
}
return this.each((value == null
? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
? (fullname.local ? attrFunctionNS : attrFunction)
: (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
}
function window$1(node) {
return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
|| (node.document && node) // node is a Window
|| node.defaultView; // node is a Document
}
function styleRemove(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant(name, value, priority) {
return function() {
this.style.setProperty(name, value, priority);
};
}
function styleFunction(name, value, priority) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.style.removeProperty(name);
else this.style.setProperty(name, v, priority);
};
}
function selection_style(name, value, priority) {
var node;
return arguments.length > 1
? this.each((value == null
? styleRemove : typeof value === "function"
? styleFunction
: styleConstant)(name, value, priority == null ? "" : priority))
: window$1(node = this.node())
.getComputedStyle(node, null)
.getPropertyValue(name);
}
function propertyRemove(name) {
return function() {
delete this[name];
};
}
function propertyConstant(name, value) {
return function() {
this[name] = value;
};
}
function propertyFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) delete this[name];
else this[name] = v;
};
}
function selection_property(name, value) {
return arguments.length > 1
? this.each((value == null
? propertyRemove : typeof value === "function"
? propertyFunction
: propertyConstant)(name, value))
: this.node()[name];
}
function classArray(string) {
return string.trim().split(/^|\s+/);
}
function classList(node) {
return node.classList || new ClassList(node);
}
function ClassList(node) {
this._node = node;
this._names = classArray(node.getAttribute("class") || "");
}
ClassList.prototype = {
add: function(name) {
var i = this._names.indexOf(name);
if (i < 0) {
this._names.push(name);
this._node.setAttribute("class", this._names.join(" "));
}
},
remove: function(name) {
var i = this._names.indexOf(name);
if (i >= 0) {
this._names.splice(i, 1);
this._node.setAttribute("class", this._names.join(" "));
}
},
contains: function(name) {
return this._names.indexOf(name) >= 0;
}
};
function classedAdd(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n) list.add(names[i]);
}
function classedRemove(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n) list.remove(names[i]);
}
function classedTrue(names) {
return function() {
classedAdd(this, names);
};
}
function classedFalse(names) {
return function() {
classedRemove(this, names);
};
}
function classedFunction(names, value) {
return function() {
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
};
}
function selection_classed(name, value) {
var names = classArray(name + "");
if (arguments.length < 2) {
var list = classList(this.node()), i = -1, n = names.length;
while (++i < n) if (!list.contains(names[i])) return false;
return true;
}
return this.each((typeof value === "function"
? classedFunction : value
? classedTrue
: classedFalse)(names, value));
}
function textRemove() {
this.textContent = "";
}
function textConstant(value) {
return function() {
this.textContent = value;
};
}
function textFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.textContent = v == null ? "" : v;
};
}
function selection_text(value) {
return arguments.length
? this.each(value == null
? textRemove : (typeof value === "function"
? textFunction
: textConstant)(value))
: this.node().textContent;
}
function htmlRemove() {
this.innerHTML = "";
}
function htmlConstant(value) {
return function() {
this.innerHTML = value;
};
}
function htmlFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.innerHTML = v == null ? "" : v;
};
}
function selection_html(value) {
return arguments.length
? this.each(value == null
? htmlRemove : (typeof value === "function"
? htmlFunction
: htmlConstant)(value))
: this.node().innerHTML;
}
function raise$1() {
if (this.nextSibling) this.parentNode.appendChild(this);
}
function selection_raise() {
return this.each(raise$1);
}
function lower() {
if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
}
function selection_lower() {
return this.each(lower);
}
function selection_append(name) {
var create = typeof name === "function" ? name : creator(name);
return this.select(function() {
return this.appendChild(create.apply(this, arguments));
});
}
function constantNull() {
return null;
}
function selection_insert(name, before) {
var create = typeof name === "function" ? name : creator(name),
select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
return this.select(function() {
return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
});
}
function remove() {
var parent = this.parentNode;
if (parent) parent.removeChild(this);
}
function selection_remove() {
return this.each(remove);
}
function selection_datum(value) {
return arguments.length
? this.property("__data__", value)
: this.node().__data__;
}
function dispatchEvent(node, type, params) {
var window = window$1(node),
event = window.CustomEvent;
if (event) {
event = new event(type, params);
} else {
event = window.document.createEvent("Event");
if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
else event.initEvent(type, false, false);
}
node.dispatchEvent(event);
}
function dispatchConstant(type, params) {
return function() {
return dispatchEvent(this, type, params);
};
}
function dispatchFunction(type, params) {
return function() {
return dispatchEvent(this, type, params.apply(this, arguments));
};
}
function selection_dispatch(type, params) {
return this.each((typeof params === "function"
? dispatchFunction
: dispatchConstant)(type, params));
}
var root = [null];
function Selection(groups, parents) {
this._groups = groups;
this._parents = parents;
}
function selection() {
return new Selection([[document.documentElement]], root);
}
Selection.prototype = selection.prototype = {
constructor: Selection,
select: selection_select,
selectAll: selection_selectAll,
filter: selection_filter,
data: selection_data,
enter: selection_enter,
exit: selection_exit,
merge: selection_merge,
order: selection_order,
sort: selection_sort,
call: selection_call,
nodes: selection_nodes,
node: selection_node,
size: selection_size,
empty: selection_empty,
each: selection_each,
attr: selection_attr,
style: selection_style,
property: selection_property,
classed: selection_classed,
text: selection_text,
html: selection_html,
raise: selection_raise,
lower: selection_lower,
append: selection_append,
insert: selection_insert,
remove: selection_remove,
datum: selection_datum,
on: selection_on,
dispatch: selection_dispatch
};
function select(selector) {
return typeof selector === "string"
? new Selection([[document.querySelector(selector)]], [document.documentElement])
: new Selection([[selector]], root);
}
function selectAll(selector) {
return typeof selector === "string"
? new Selection([document.querySelectorAll(selector)], [document.documentElement])
: new Selection([selector == null ? [] : selector], root);
}
function touch(node, touches, identifier) {
if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
if ((touch = touches[i]).identifier === identifier) {
return point$5(node, touch);
}
}
return null;
}
function touches(node, touches) {
if (touches == null) touches = sourceEvent().touches;
for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
points[i] = point$5(node, touches[i]);
}
return points;
}
var emptyOn = dispatch("start", "end", "interrupt");
var emptyTween = [];
var CREATED = 0;
var SCHEDULED = 1;
var STARTING = 2;
var STARTED = 3;
var ENDING = 4;
var ENDED = 5;
function schedule(node, name, id, index, group, timing) {
var schedules = node.__transition;
if (!schedules) node.__transition = {};
else if (id in schedules) return;
create(node, id, {
name: name,
index: index, // For context during callback.
group: group, // For context during callback.
on: emptyOn,
tween: emptyTween,
time: timing.time,
delay: timing.delay,
duration: timing.duration,
ease: timing.ease,
timer: null,
state: CREATED
});
}
function init(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late");
return schedule;
}
function set$2(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late");
return schedule;
}
function get$1(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id])) throw new Error("too late");
return schedule;
}
function create(node, id, self) {
var schedules = node.__transition,
tween;
// Initialize the self timer when the transition is created.
// Note the actual delay is not known until the first callback!
schedules[id] = self;
self.timer = timer(schedule, 0, self.time);
// If the delay is greater than this first sleep, sleep some more;
// otherwise, start immediately.
function schedule(elapsed) {
self.state = SCHEDULED;
if (self.delay <= elapsed) start(elapsed - self.delay);
else self.timer.restart(start, self.delay, self.time);
}
function start(elapsed) {
var i, j, n, o;
for (i in schedules) {
o = schedules[i];
if (o.name !== self.name) continue;
// Interrupt the active transition, if any.
// Dispatch the interrupt event.
if (o.state === STARTED) {
o.state = ENDED;
o.timer.stop();
o.on.call("interrupt", node, node.__data__, o.index, o.group);
delete schedules[i];
}
// Cancel any pre-empted transitions. No interrupt event is dispatched
// because the cancelled transitions never started. Note that this also
// removes this transition from the pending list!
else if (+i < id) {
o.state = ENDED;
o.timer.stop();
delete schedules[i];
}
}
// Defer the first tick to end of the current frame; see mbostock/d3#1576.
// Note the transition may be canceled after start and before the first tick!
// Note this must be scheduled before the start event; see d3/d3-transition#16!
// Assuming this is successful, subsequent callbacks go straight to tick.
timeout$1(function() {
if (self.state === STARTED) {
self.timer.restart(tick, self.delay, self.time);
tick(elapsed);
}
});
// Dispatch the start event.
// Note this must be done before the tween are initialized.
self.state = STARTING;
self.on.call("start", node, node.__data__, self.index, self.group);
if (self.state !== STARTING) return; // interrupted
self.state = STARTED;
// Initialize the tween, deleting null tween.
tween = new Array(n = self.tween.length);
for (i = 0, j = -1; i < n; ++i) {
if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
tween[++j] = o;
}
}
tween.length = j + 1;
}
function tick(elapsed) {
var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.state = ENDING, 1),
i = -1,
n = tween.length;
while (++i < n) {
tween[i].call(null, t);
}
// Dispatch the end event.
if (self.state === ENDING) {
self.state = ENDED;
self.timer.stop();
self.on.call("end", node, node.__data__, self.index, self.group);
for (i in schedules) if (+i !== id) return void delete schedules[id];
delete node.__transition;
}
}
}
function interrupt(node, name) {
var schedules = node.__transition,
schedule,
active,
empty = true,
i;
if (!schedules) return;
name = name == null ? null : name + "";
for (i in schedules) {
if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
active = schedule.state === STARTED;
schedule.state = ENDED;
schedule.timer.stop();
if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group);
delete schedules[i];
}
if (empty) delete node.__transition;
}
function selection_interrupt(name) {
return this.each(function() {
interrupt(this, name);
});
}
function tweenRemove(id, name) {
var tween0, tween1;
return function() {
var schedule = set$2(this, id),
tween = schedule.tween;
// If this node shared tween with the previous node,
// just assign the updated shared tween and we’re done!
// Otherwise, copy-on-write.
if (tween !== tween0) {
tween1 = tween0 = tween;
for (var i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1 = tween1.slice();
tween1.splice(i, 1);
break;
}
}
}
schedule.tween = tween1;
};
}
function tweenFunction(id, name, value) {
var tween0, tween1;
if (typeof value !== "function") throw new Error;
return function() {
var schedule = set$2(this, id),
tween = schedule.tween;
// If this node shared tween with the previous node,
// just assign the updated shared tween and we’re done!
// Otherwise, copy-on-write.
if (tween !== tween0) {
tween1 = (tween0 = tween).slice();
for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1[i] = t;
break;
}
}
if (i === n) tween1.push(t);
}
schedule.tween = tween1;
};
}
function transition_tween(name, value) {
var id = this._id;
name += "";
if (arguments.length < 2) {
var tween = get$1(this.node(), id).tween;
for (var i = 0, n = tween.length, t; i < n; ++i) {
if ((t = tween[i]).name === name) {
return t.value;
}
}
return null;
}
return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
}
function tweenValue(transition, name, value) {
var id = transition._id;
transition.each(function() {
var schedule = set$2(this, id);
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
});
return function(node) {
return get$1(node, id).value[name];
};
}
function interpolate$1(a, b) {
var c;
return (typeof b === "number" ? interpolateNumber
: b instanceof color ? interpolateRgb
: (c = color(b)) ? (b = c, interpolateRgb)
: interpolateString)(a, b);
}
function attrRemove$1(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS$1(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant$1(name, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = this.getAttribute(name);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function attrConstantNS$1(fullname, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = this.getAttributeNS(fullname.space, fullname.local);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function attrFunction$1(name, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var value0, value1 = value(this);
if (value1 == null) return void this.removeAttribute(name);
value0 = this.getAttribute(name);
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function attrFunctionNS$1(fullname, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var value0, value1 = value(this);
if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
value0 = this.getAttributeNS(fullname.space, fullname.local);
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function transition_attr(name, value) {
var fullname = namespace(name), i = fullname === "transform" ? interpolateTransform$2 : interpolate$1;
return this.attrTween(name, typeof value === "function"
? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
: value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
: (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
}
function attrTweenNS(fullname, value) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.setAttributeNS(fullname.space, fullname.local, i(t));
};
}
tween._value = value;
return tween;
}
function attrTween(name, value) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.setAttribute(name, i(t));
};
}
tween._value = value;
return tween;
}
function transition_attrTween(name, value) {
var key = "attr." + name;
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
if (value == null) return this.tween(key, null);
if (typeof value !== "function") throw new Error;
var fullname = namespace(name);
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
}
function delayFunction(id, value) {
return function() {
init(this, id).delay = +value.apply(this, arguments);
};
}
function delayConstant(id, value) {
return value = +value, function() {
init(this, id).delay = value;
};
}
function transition_delay(value) {
var id = this._id;
return arguments.length
? this.each((typeof value === "function"
? delayFunction
: delayConstant)(id, value))
: get$1(this.node(), id).delay;
}
function durationFunction(id, value) {
return function() {
set$2(this, id).duration = +value.apply(this, arguments);
};
}
function durationConstant(id, value) {
return value = +value, function() {
set$2(this, id).duration = value;
};
}
function transition_duration(value) {
var id = this._id;
return arguments.length
? this.each((typeof value === "function"
? durationFunction
: durationConstant)(id, value))
: get$1(this.node(), id).duration;
}
function easeConstant(id, value) {
if (typeof value !== "function") throw new Error;
return function() {
set$2(this, id).ease = value;
};
}
function transition_ease(value) {
var id = this._id;
return arguments.length
? this.each(easeConstant(id, value))
: get$1(this.node(), id).ease;
}
function transition_filter(match) {
if (typeof match !== "function") match = matcher$1(match);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new Transition(subgroups, this._parents, this._name, this._id);
}
function transition_merge(transition) {
if (transition._id !== this._id) throw new Error;
for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new Transition(merges, this._parents, this._name, this._id);
}
function start$1(name) {
return (name + "").trim().split(/^|\s+/).every(function(t) {
var i = t.indexOf(".");
if (i >= 0) t = t.slice(0, i);
return !t || t === "start";
});
}
function onFunction(id, name, listener) {
var on0, on1, sit = start$1(name) ? init : set$2;
return function() {
var schedule = sit(this, id),
on = schedule.on;
// If this node shared a dispatch with the previous node,
// just assign the updated shared dispatch and we’re done!
// Otherwise, copy-on-write.
if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
schedule.on = on1;
};
}
function transition_on(name, listener) {
var id = this._id;
return arguments.length < 2
? get$1(this.node(), id).on.on(name)
: this.each(onFunction(id, name, listener));
}
function removeFunction(id) {
return function() {
var parent = this.parentNode;
for (var i in this.__transition) if (+i !== id) return;
if (parent) parent.removeChild(this);
};
}
function transition_remove() {
return this.on("end.remove", removeFunction(this._id));
}
function transition_select(select) {
var name = this._name,
id = this._id;
if (typeof select !== "function") select = selector(select);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
subgroup[i] = subnode;
schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
}
}
}
return new Transition(subgroups, this._parents, name, id);
}
function transition_selectAll(select) {
var name = this._name,
id = this._id;
if (typeof select !== "function") select = selectorAll(select);
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
if (child = children[k]) {
schedule(child, name, id, k, children, inherit);
}
}
subgroups.push(children);
parents.push(node);
}
}
}
return new Transition(subgroups, parents, name, id);
}
var Selection$1 = selection.prototype.constructor;
function transition_selection() {
return new Selection$1(this._groups, this._parents);
}
function styleRemove$1(name, interpolate) {
var value00,
value10,
interpolate0;
return function() {
var style = window$1(this).getComputedStyle(this, null),
value0 = style.getPropertyValue(name),
value1 = (this.style.removeProperty(name), style.getPropertyValue(name));
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function styleRemoveEnd(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant$1(name, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = window$1(this).getComputedStyle(this, null).getPropertyValue(name);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function styleFunction$1(name, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var style = window$1(this).getComputedStyle(this, null),
value0 = style.getPropertyValue(name),
value1 = value(this);
if (value1 == null) value1 = (this.style.removeProperty(name), style.getPropertyValue(name));
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function transition_style(name, value, priority) {
var i = (name += "") === "transform" ? interpolateTransform$1 : interpolate$1;
return value == null ? this
.styleTween(name, styleRemove$1(name, i))
.on("end.style." + name, styleRemoveEnd(name))
: this.styleTween(name, typeof value === "function"
? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
: styleConstant$1(name, i, value), priority);
}
function styleTween(name, value, priority) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.style.setProperty(name, i(t), priority);
};
}
tween._value = value;
return tween;
}
function transition_styleTween(name, value, priority) {
var key = "style." + (name += "");
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
if (value == null) return this.tween(key, null);
if (typeof value !== "function") throw new Error;
return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
}
function textConstant$1(value) {
return function() {
this.textContent = value;
};
}
function textFunction$1(value) {
return function() {
var value1 = value(this);
this.textContent = value1 == null ? "" : value1;
};
}
function transition_text(value) {
return this.tween("text", typeof value === "function"
? textFunction$1(tweenValue(this, "text", value))
: textConstant$1(value == null ? "" : value + ""));
}
function transition_transition() {
var name = this._name,
id0 = this._id,
id1 = newId();
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
var inherit = get$1(node, id0);
schedule(node, name, id1, i, group, {
time: inherit.time + inherit.delay + inherit.duration,
delay: 0,
duration: inherit.duration,
ease: inherit.ease
});
}
}
}
return new Transition(groups, this._parents, name, id1);
}
var id = 0;
function Transition(groups, parents, name, id) {
this._groups = groups;
this._parents = parents;
this._name = name;
this._id = id;
}
function transition(name) {
return selection().transition(name);
}
function newId() {
return ++id;
}
var selection_prototype = selection.prototype;
Transition.prototype = transition.prototype = {
constructor: Transition,
select: transition_select,
selectAll: transition_selectAll,
filter: transition_filter,
merge: transition_merge,
selection: transition_selection,
transition: transition_transition,
call: selection_prototype.call,
nodes: selection_prototype.nodes,
node: selection_prototype.node,
size: selection_prototype.size,
empty: selection_prototype.empty,
each: selection_prototype.each,
on: transition_on,
attr: transition_attr,
attrTween: transition_attrTween,
style: transition_style,
styleTween: transition_styleTween,
text: transition_text,
remove: transition_remove,
tween: transition_tween,
delay: transition_delay,
duration: transition_duration,
ease: transition_ease
};
var defaultTiming = {
time: null, // Set on use.
delay: 0,
duration: 250,
ease: easeCubicInOut
};
function inherit(node, id) {
var timing;
while (!(timing = node.__transition) || !(timing = timing[id])) {
if (!(node = node.parentNode)) {
return defaultTiming.time = now(), defaultTiming;
}
}
return timing;
}
function selection_transition(name) {
var id,
timing;
if (name instanceof Transition) {
id = name._id, name = name._name;
} else {
id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
}
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
schedule(node, name, id, i, group, timing || inherit(node, id));
}
}
}
return new Transition(groups, this._parents, name, id);
}
selection.prototype.interrupt = selection_interrupt;
selection.prototype.transition = selection_transition;
var root$1 = [null];
function active(node, name) {
var schedules = node.__transition,
schedule,
i;
if (schedules) {
name = name == null ? null : name + "";
for (i in schedules) {
if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
return new Transition([[node]], root$1, name, +i);
}
}
}
return null;
}
var slice$4 = Array.prototype.slice;
function identity$5(x) {
return x;
}
var top = 1;
var right = 2;
var bottom = 3;
var left = 4;
var epsilon$2 = 1e-6;
function translateX(scale0, scale1, d) {
var x = scale0(d);
return "translate(" + (isFinite(x) ? x : scale1(d)) + ",0)";
}
function translateY(scale0, scale1, d) {
var y = scale0(d);
return "translate(0," + (isFinite(y) ? y : scale1(d)) + ")";
}
function center(scale) {
var offset = scale.bandwidth() / 2;
if (scale.round()) offset = Math.round(offset);
return function(d) {
return scale(d) + offset;
};
}
function entering() {
return !this.__axis;
}
function axis(orient, scale) {
var tickArguments = [],
tickValues = null,
tickFormat = null,
tickSizeInner = 6,
tickSizeOuter = 6,
tickPadding = 3;
function axis(context) {
var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$5) : tickFormat,
spacing = Math.max(tickSizeInner, 0) + tickPadding,
transform = orient === top || orient === bottom ? translateX : translateY,
range = scale.range(),
range0 = range[0] + 0.5,
range1 = range[range.length - 1] + 0.5,
position = (scale.bandwidth ? center : identity$5)(scale.copy()),
selection = context.selection ? context.selection() : context,
path = selection.selectAll(".domain").data([null]),
tick = selection.selectAll(".tick").data(values, scale).order(),
tickExit = tick.exit(),
tickEnter = tick.enter().append("g").attr("class", "tick"),
line = tick.select("line"),
text = tick.select("text"),
k = orient === top || orient === left ? -1 : 1,
x, y = orient === left || orient === right ? (x = "x", "y") : (x = "y", "x");
path = path.merge(path.enter().insert("path", ".tick")
.attr("class", "domain")
.attr("stroke", "#000"));
tick = tick.merge(tickEnter);
line = line.merge(tickEnter.append("line")
.attr("stroke", "#000")
.attr(x + "2", k * tickSizeInner)
.attr(y + "1", 0.5)
.attr(y + "2", 0.5));
text = text.merge(tickEnter.append("text")
.attr("fill", "#000")
.attr(x, k * spacing)
.attr(y, 0.5)
.attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
if (context !== selection) {
path = path.transition(context);
tick = tick.transition(context);
line = line.transition(context);
text = text.transition(context);
tickExit = tickExit.transition(context)
.attr("opacity", epsilon$2)
.attr("transform", function(d) { return transform(position, this.parentNode.__axis || position, d); });
tickEnter
.attr("opacity", epsilon$2)
.attr("transform", function(d) { return transform(this.parentNode.__axis || position, position, d); });
}
tickExit.remove();
path
.attr("d", orient === left || orient == right
? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
: "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
tick
.attr("opacity", 1)
.attr("transform", function(d) { return transform(position, position, d); });
line
.attr(x + "2", k * tickSizeInner);
text
.attr(x, k * spacing)
.text(format);
selection.filter(entering)
.attr("fill", "none")
.attr("font-size", 10)
.attr("font-family", "sans-serif")
.attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
selection
.each(function() { this.__axis = position; });
}
axis.scale = function(_) {
return arguments.length ? (scale = _, axis) : scale;
};
axis.ticks = function() {
return tickArguments = slice$4.call(arguments), axis;
};
axis.tickArguments = function(_) {
return arguments.length ? (tickArguments = _ == null ? [] : slice$4.call(_), axis) : tickArguments.slice();
};
axis.tickValues = function(_) {
return arguments.length ? (tickValues = _ == null ? null : slice$4.call(_), axis) : tickValues && tickValues.slice();
};
axis.tickFormat = function(_) {
return arguments.length ? (tickFormat = _, axis) : tickFormat;
};
axis.tickSize = function(_) {
return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
};
axis.tickSizeInner = function(_) {
return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
};
axis.tickSizeOuter = function(_) {
return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
};
axis.tickPadding = function(_) {
return arguments.length ? (tickPadding = +_, axis) : tickPadding;
};
return axis;
}
function axisTop(scale) {
return axis(top, scale);
}
function axisRight(scale) {
return axis(right, scale);
}
function axisBottom(scale) {
return axis(bottom, scale);
}
function axisLeft(scale) {
return axis(left, scale);
}
function defaultSeparation(a, b) {
return a.parent === b.parent ? 1 : 2;
}
function meanX(children) {
return children.reduce(meanXReduce, 0) / children.length;
}
function meanXReduce(x, c) {
return x + c.x;
}
function maxY(children) {
return 1 + children.reduce(maxYReduce, 0);
}
function maxYReduce(y, c) {
return Math.max(y, c.y);
}
function leafLeft(node) {
var children;
while (children = node.children) node = children[0];
return node;
}
function leafRight(node) {
var children;
while (children = node.children) node = children[children.length - 1];
return node;
}
function cluster() {
var separation = defaultSeparation,
dx = 1,
dy = 1,
nodeSize = false;
function cluster(root) {
var previousNode,
x = 0;
// First walk, computing the initial x & y values.
root.eachAfter(function(node) {
var children = node.children;
if (children) {
node.x = meanX(children);
node.y = maxY(children);
} else {
node.x = previousNode ? x += separation(node, previousNode) : 0;
node.y = 0;
previousNode = node;
}
});
var left = leafLeft(root),
right = leafRight(root),
x0 = left.x - separation(left, right) / 2,
x1 = right.x + separation(right, left) / 2;
// Second walk, normalizing x & y to the desired size.
return root.eachAfter(nodeSize ? function(node) {
node.x = (node.x - root.x) * dx;
node.y = (root.y - node.y) * dy;
} : function(node) {
node.x = (node.x - x0) / (x1 - x0) * dx;
node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
});
}
cluster.separation = function(x) {
return arguments.length ? (separation = x, cluster) : separation;
};
cluster.size = function(x) {
return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
};
cluster.nodeSize = function(x) {
return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
};
return cluster;
}
function node_each(callback) {
var node = this, current, next = [node], children, i, n;
do {
current = next.reverse(), next = [];
while (node = current.pop()) {
callback(node), children = node.children;
if (children) for (i = 0, n = children.length; i < n; ++i) {
next.push(children[i]);
}
}
} while (next.length);
return this;
}
function node_eachBefore(callback) {
var node = this, nodes = [node], children, i;
while (node = nodes.pop()) {
callback(node), children = node.children;
if (children) for (i = children.length - 1; i >= 0; --i) {
nodes.push(children[i]);
}
}
return this;
}
function node_eachAfter(callback) {
var node = this, nodes = [node], next = [], children, i, n;
while (node = nodes.pop()) {
next.push(node), children = node.children;
if (children) for (i = 0, n = children.length; i < n; ++i) {
nodes.push(children[i]);
}
}
while (node = next.pop()) {
callback(node);
}
return this;
}
function node_sum(value) {
return this.eachAfter(function(node) {
var sum = +value(node.data) || 0,
children = node.children,
i = children && children.length;
while (--i >= 0) sum += children[i].value;
node.value = sum;
});
}
function node_sort(compare) {
return this.eachBefore(function(node) {
if (node.children) {
node.children.sort(compare);
}
});
}
function node_path(end) {
var start = this,
ancestor = leastCommonAncestor(start, end),
nodes = [start];
while (start !== ancestor) {
start = start.parent;
nodes.push(start);
}
var k = nodes.length;
while (end !== ancestor) {
nodes.splice(k, 0, end);
end = end.parent;
}
return nodes;
}
function leastCommonAncestor(a, b) {
if (a === b) return a;
var aNodes = a.ancestors(),
bNodes = b.ancestors(),
c = null;
a = aNodes.pop();
b = bNodes.pop();
while (a === b) {
c = a;
a = aNodes.pop();
b = bNodes.pop();
}
return c;
}
function node_ancestors() {
var node = this, nodes = [node];
while (node = node.parent) {
nodes.push(node);
}
return nodes;
}
function node_descendants() {
var nodes = [];
this.each(function(node) {
nodes.push(node);
});
return nodes;
}
function node_leaves() {
var leaves = [];
this.eachBefore(function(node) {
if (!node.children) {
leaves.push(node);
}
});
return leaves;
}
function node_links() {
var root = this, links = [];
root.each(function(node) {
if (node !== root) { // Don’t include the root’s parent, if any.
links.push({source: node.parent, target: node});
}
});
return links;
}
function hierarchy(data, children) {
var root = new Node(data),
valued = +data.value && (root.value = data.value),
node,
nodes = [root],
child,
childs,
i,
n;
if (children == null) children = defaultChildren;
while (node = nodes.pop()) {
if (valued) node.value = +node.data.value;
if ((childs = children(node.data)) && (n = childs.length)) {
node.children = new Array(n);
for (i = n - 1; i >= 0; --i) {
nodes.push(child = node.children[i] = new Node(childs[i]));
child.parent = node;
child.depth = node.depth + 1;
}
}
}
return root.eachBefore(computeHeight);
}
function node_copy() {
return hierarchy(this).eachBefore(copyData);
}
function defaultChildren(d) {
return d.children;
}
function copyData(node) {
node.data = node.data.data;
}
function computeHeight(node) {
var height = 0;
do node.height = height;
while ((node = node.parent) && (node.height < ++height));
}
function Node(data) {
this.data = data;
this.depth =
this.height = 0;
this.parent = null;
}
Node.prototype = hierarchy.prototype = {
constructor: Node,
each: node_each,
eachAfter: node_eachAfter,
eachBefore: node_eachBefore,
sum: node_sum,
sort: node_sort,
path: node_path,
ancestors: node_ancestors,
descendants: node_descendants,
leaves: node_leaves,
links: node_links,
copy: node_copy
};
function Node$2(value) {
this._ = value;
this.next = null;
}
function shuffle$1(array) {
var i,
n = (array = array.slice()).length,
head = null,
node = head;
while (n) {
var next = new Node$2(array[n - 1]);
if (node) node = node.next = next;
else node = head = next;
array[i] = array[--n];
}
return {
head: head,
tail: node
};
}
function enclose(circles) {
return encloseN(shuffle$1(circles), []);
}
function encloses(a, b) {
var dx = b.x - a.x,
dy = b.y - a.y,
dr = a.r - b.r;
return dr * dr + 1e-6 > dx * dx + dy * dy;
}
// Returns the smallest circle that contains circles L and intersects circles B.
function encloseN(L, B) {
var circle,
l0 = null,
l1 = L.head,
l2,
p1;
switch (B.length) {
case 1: circle = enclose1(B[0]); break;
case 2: circle = enclose2(B[0], B[1]); break;
case 3: circle = enclose3(B[0], B[1], B[2]); break;
}
while (l1) {
p1 = l1._, l2 = l1.next;
if (!circle || !encloses(circle, p1)) {
// Temporarily truncate L before l1.
if (l0) L.tail = l0, l0.next = null;
else L.head = L.tail = null;
B.push(p1);
circle = encloseN(L, B); // Note: reorders L!
B.pop();
// Move l1 to the front of L and reconnect the truncated list L.
if (L.head) l1.next = L.head, L.head = l1;
else l1.next = null, L.head = L.tail = l1;
l0 = L.tail, l0.next = l2;
} else {
l0 = l1;
}
l1 = l2;
}
L.tail = l0;
return circle;
}
function enclose1(a) {
return {
x: a.x,
y: a.y,
r: a.r
};
}
function enclose2(a, b) {
var x1 = a.x, y1 = a.y, r1 = a.r,
x2 = b.x, y2 = b.y, r2 = b.r,
x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
l = Math.sqrt(x21 * x21 + y21 * y21);
return {
x: (x1 + x2 + x21 / l * r21) / 2,
y: (y1 + y2 + y21 / l * r21) / 2,
r: (l + r1 + r2) / 2
};
}
function enclose3(a, b, c) {
var x1 = a.x, y1 = a.y, r1 = a.r,
x2 = b.x, y2 = b.y, r2 = b.r,
x3 = c.x, y3 = c.y, r3 = c.r,
a2 = 2 * (x1 - x2),
b2 = 2 * (y1 - y2),
c2 = 2 * (r2 - r1),
d2 = x1 * x1 + y1 * y1 - r1 * r1 - x2 * x2 - y2 * y2 + r2 * r2,
a3 = 2 * (x1 - x3),
b3 = 2 * (y1 - y3),
c3 = 2 * (r3 - r1),
d3 = x1 * x1 + y1 * y1 - r1 * r1 - x3 * x3 - y3 * y3 + r3 * r3,
ab = a3 * b2 - a2 * b3,
xa = (b2 * d3 - b3 * d2) / ab - x1,
xb = (b3 * c2 - b2 * c3) / ab,
ya = (a3 * d2 - a2 * d3) / ab - y1,
yb = (a2 * c3 - a3 * c2) / ab,
A = xb * xb + yb * yb - 1,
B = 2 * (xa * xb + ya * yb + r1),
C = xa * xa + ya * ya - r1 * r1,
r = (-B - Math.sqrt(B * B - 4 * A * C)) / (2 * A);
return {
x: xa + xb * r + x1,
y: ya + yb * r + y1,
r: r
};
}
function place(a, b, c) {
var ax = a.x,
ay = a.y,
da = b.r + c.r,
db = a.r + c.r,
dx = b.x - ax,
dy = b.y - ay,
dc = dx * dx + dy * dy;
if (dc) {
var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
c.x = ax + x * dx + y * dy;
c.y = ay + x * dy - y * dx;
} else {
c.x = ax + db;
c.y = ay;
}
}
function intersects(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;
}
function distance2(circle, x, y) {
var dx = circle.x - x,
dy = circle.y - y;
return dx * dx + dy * dy;
}
function Node$1(circle) {
this._ = circle;
this.next = null;
this.previous = null;
}
function packEnclose(circles) {
if (!(n = circles.length)) return 0;
var a, b, c, n;
// Place the first circle.
a = circles[0], a.x = 0, a.y = 0;
if (!(n > 1)) return a.r;
// Place the second circle.
b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
if (!(n > 2)) return a.r + b.r;
// Place the third circle.
place(b, a, c = circles[2]);
// Initialize the weighted centroid.
var aa = a.r * a.r,
ba = b.r * b.r,
ca = c.r * c.r,
oa = aa + ba + ca,
ox = aa * a.x + ba * b.x + ca * c.x,
oy = aa * a.y + ba * b.y + ca * c.y,
cx, cy, i, j, k, sj, sk;
// Initialize the front-chain using the first three circles a, b and c.
a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
a.next = c.previous = b;
b.next = a.previous = c;
c.next = b.previous = a;
// Attempt to place each remaining circle…
pack: for (i = 3; i < n; ++i) {
place(a._, b._, c = circles[i]), c = new Node$1(c);
// If there are only three elements in the front-chain…
if ((k = a.previous) === (j = b.next)) {
// If the new circle intersects the third circle,
// rotate the front chain to try the next position.
if (intersects(j._, c._)) {
a = b, b = j, --i;
continue pack;
}
}
// Find the closest intersecting circle on the front-chain, if any.
else {
sj = j._.r, sk = k._.r;
do {
if (sj <= sk) {
if (intersects(j._, c._)) {
b = j, a.next = b, b.previous = a, --i;
continue pack;
}
j = j.next, sj += j._.r;
} else {
if (intersects(k._, c._)) {
a = k, a.next = b, b.previous = a, --i;
continue pack;
}
k = k.previous, sk += k._.r;
}
} while (j !== k.next);
}
// Success! Insert the new circle c between a and b.
c.previous = a, c.next = b, a.next = b.previous = b = c;
// Update the weighted centroid.
oa += ca = c._.r * c._.r;
ox += ca * c._.x;
oy += ca * c._.y;
// Compute the new closest circle a to centroid.
aa = distance2(a._, cx = ox / oa, cy = oy / oa);
while ((c = c.next) !== b) {
if ((ca = distance2(c._, cx, cy)) < aa) {
a = c, aa = ca;
}
}
b = a.next;
}
// Compute the enclosing circle of the front chain.
a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
// Translate the circles to put the enclosing circle around the origin.
for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
return c.r;
}
function siblings(circles) {
packEnclose(circles);
return circles;
}
function optional(f) {
return f == null ? null : required(f);
}
function required(f) {
if (typeof f !== "function") throw new Error;
return f;
}
function constantZero() {
return 0;
}
function constant$5(x) {
return function() {
return x;
};
}
function defaultRadius(d) {
return Math.sqrt(d.value);
}
function index() {
var radius = null,
dx = 1,
dy = 1,
padding = constantZero;
function pack(root) {
root.x = dx / 2, root.y = dy / 2;
if (radius) {
root.eachBefore(radiusLeaf(radius))
.eachAfter(packChildren(padding, 0.5))
.eachBefore(translateChild(1));
} else {
root.eachBefore(radiusLeaf(defaultRadius))
.eachAfter(packChildren(constantZero, 1))
.eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
.eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
}
return root;
}
pack.radius = function(x) {
return arguments.length ? (radius = optional(x), pack) : radius;
};
pack.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
};
pack.padding = function(x) {
return arguments.length ? (padding = typeof x === "function" ? x : constant$5(+x), pack) : padding;
};
return pack;
}
function radiusLeaf(radius) {
return function(node) {
if (!node.children) {
node.r = Math.max(0, +radius(node) || 0);
}
};
}
function packChildren(padding, k) {
return function(node) {
if (children = node.children) {
var children,
i,
n = children.length,
r = padding(node) * k || 0,
e;
if (r) for (i = 0; i < n; ++i) children[i].r += r;
e = packEnclose(children);
if (r) for (i = 0; i < n; ++i) children[i].r -= r;
node.r = e + r;
}
};
}
function translateChild(k) {
return function(node) {
var parent = node.parent;
node.r *= k;
if (parent) {
node.x = parent.x + k * node.x;
node.y = parent.y + k * node.y;
}
};
}
function roundNode(node) {
node.x0 = Math.round(node.x0);
node.y0 = Math.round(node.y0);
node.x1 = Math.round(node.x1);
node.y1 = Math.round(node.y1);
}
function treemapDice(parent, x0, y0, x1, y1) {
var nodes = parent.children,
node,
i = -1,
n = nodes.length,
k = parent.value && (x1 - x0) / parent.value;
while (++i < n) {
node = nodes[i], node.y0 = y0, node.y1 = y1;
node.x0 = x0, node.x1 = x0 += node.value * k;
}
}
function partition() {
var dx = 1,
dy = 1,
padding = 0,
round = false;
function partition(root) {
var n = root.height + 1;
root.x0 =
root.y0 = padding;
root.x1 = dx;
root.y1 = dy / n;
root.eachBefore(positionNode(dy, n));
if (round) root.eachBefore(roundNode);
return root;
}
function positionNode(dy, n) {
return function(node) {
if (node.children) {
treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
}
var x0 = node.x0,
y0 = node.y0,
x1 = node.x1 - padding,
y1 = node.y1 - padding;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
};
}
partition.round = function(x) {
return arguments.length ? (round = !!x, partition) : round;
};
partition.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
};
partition.padding = function(x) {
return arguments.length ? (padding = +x, partition) : padding;
};
return partition;
}
var keyPrefix$1 = "$";
var preroot = {depth: -1};
var ambiguous = {};
function defaultId(d) {
return d.id;
}
function defaultParentId(d) {
return d.parentId;
}
function stratify() {
var id = defaultId,
parentId = defaultParentId;
function stratify(data) {
var d,
i,
n = data.length,
root,
parent,
node,
nodes = new Array(n),
nodeId,
nodeKey,
nodeByKey = {};
for (i = 0; i < n; ++i) {
d = data[i], node = nodes[i] = new Node(d);
if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
nodeKey = keyPrefix$1 + (node.id = nodeId);
nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
}
}
for (i = 0; i < n; ++i) {
node = nodes[i], nodeId = parentId(data[i], i, data);
if (nodeId == null || !(nodeId += "")) {
if (root) throw new Error("multiple roots");
root = node;
} else {
parent = nodeByKey[keyPrefix$1 + nodeId];
if (!parent) throw new Error("missing: " + nodeId);
if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
if (parent.children) parent.children.push(node);
else parent.children = [node];
node.parent = parent;
}
}
if (!root) throw new Error("no root");
root.parent = preroot;
root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
root.parent = null;
if (n > 0) throw new Error("cycle");
return root;
}
stratify.id = function(x) {
return arguments.length ? (id = required(x), stratify) : id;
};
stratify.parentId = function(x) {
return arguments.length ? (parentId = required(x), stratify) : parentId;
};
return stratify;
}
function defaultSeparation$1(a, b) {
return a.parent === b.parent ? 1 : 2;
}
// function radialSeparation(a, b) {
// return (a.parent === b.parent ? 1 : 2) / a.depth;
// }
// This function is used to traverse the left contour of a subtree (or
// subforest). It returns the successor of v on this contour. This successor is
// either given by the leftmost child of v or by the thread of v. The function
// returns null if and only if v is on the highest level of its subtree.
function nextLeft(v) {
var children = v.children;
return children ? children[0] : v.t;
}
// This function works analogously to nextLeft.
function nextRight(v) {
var children = v.children;
return children ? children[children.length - 1] : v.t;
}
// Shifts the current subtree rooted at w+. This is done by increasing
// prelim(w+) and mod(w+) by shift.
function moveSubtree(wm, wp, shift) {
var change = shift / (wp.i - wm.i);
wp.c -= change;
wp.s += shift;
wm.c += change;
wp.z += shift;
wp.m += shift;
}
// All other shifts, applied to the smaller subtrees between w- and w+, are
// performed by this function. To prepare the shifts, we have to adjust
// change(w+), shift(w+), and change(w-).
function executeShifts(v) {
var shift = 0,
change = 0,
children = v.children,
i = children.length,
w;
while (--i >= 0) {
w = children[i];
w.z += shift;
w.m += shift;
shift += w.s + (change += w.c);
}
}
// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
// returns the specified (default) ancestor.
function nextAncestor(vim, v, ancestor) {
return vim.a.parent === v.parent ? vim.a : ancestor;
}
function TreeNode(node, i) {
this._ = node;
this.parent = null;
this.children = null;
this.A = null; // default ancestor
this.a = this; // ancestor
this.z = 0; // prelim
this.m = 0; // mod
this.c = 0; // change
this.s = 0; // shift
this.t = null; // thread
this.i = i; // number
}
TreeNode.prototype = Object.create(Node.prototype);
function treeRoot(root) {
var tree = new TreeNode(root, 0),
node,
nodes = [tree],
child,
children,
i,
n;
while (node = nodes.pop()) {
if (children = node._.children) {
node.children = new Array(n = children.length);
for (i = n - 1; i >= 0; --i) {
nodes.push(child = node.children[i] = new TreeNode(children[i], i));
child.parent = node;
}
}
}
(tree.parent = new TreeNode(null, 0)).children = [tree];
return tree;
}
// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
function tree() {
var separation = defaultSeparation$1,
dx = 1,
dy = 1,
nodeSize = null;
function tree(root) {
var t = treeRoot(root);
// Compute the layout using Buchheim et al.’s algorithm.
t.eachAfter(firstWalk), t.parent.m = -t.z;
t.eachBefore(secondWalk);
// If a fixed node size is specified, scale x and y.
if (nodeSize) root.eachBefore(sizeNode);
// If a fixed tree size is specified, scale x and y based on the extent.
// Compute the left-most, right-most, and depth-most nodes for extents.
else {
var left = root,
right = root,
bottom = root;
root.eachBefore(function(node) {
if (node.x < left.x) left = node;
if (node.x > right.x) right = node;
if (node.depth > bottom.depth) bottom = node;
});
var s = left === right ? 1 : separation(left, right) / 2,
tx = s - left.x,
kx = dx / (right.x + s + tx),
ky = dy / (bottom.depth || 1);
root.eachBefore(function(node) {
node.x = (node.x + tx) * kx;
node.y = node.depth * ky;
});
}
return root;
}
// Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
// applied recursively to the children of v, as well as the function
// APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
// node v is placed to the midpoint of its outermost children.
function firstWalk(v) {
var children = v.children,
siblings = v.parent.children,
w = v.i ? siblings[v.i - 1] : null;
if (children) {
executeShifts(v);
var midpoint = (children[0].z + children[children.length - 1].z) / 2;
if (w) {
v.z = w.z + separation(v._, w._);
v.m = v.z - midpoint;
} else {
v.z = midpoint;
}
} else if (w) {
v.z = w.z + separation(v._, w._);
}
v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
}
// Computes all real x-coordinates by summing up the modifiers recursively.
function secondWalk(v) {
v._.x = v.z + v.parent.m;
v.m += v.parent.m;
}
// The core of the algorithm. Here, a new subtree is combined with the
// previous subtrees. Threads are used to traverse the inside and outside
// contours of the left and right subtree up to the highest common level. The
// vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
// superscript o means outside and i means inside, the subscript - means left
// subtree and + means right subtree. For summing up the modifiers along the
// contour, we use respective variables si+, si-, so-, and so+. Whenever two
// nodes of the inside contours conflict, we compute the left one of the
// greatest uncommon ancestors using the function ANCESTOR and call MOVE
// SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
// Finally, we add a new thread (if necessary).
function apportion(v, w, ancestor) {
if (w) {
var vip = v,
vop = v,
vim = w,
vom = vip.parent.children[0],
sip = vip.m,
sop = vop.m,
sim = vim.m,
som = vom.m,
shift;
while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
vom = nextLeft(vom);
vop = nextRight(vop);
vop.a = v;
shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
if (shift > 0) {
moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
sip += shift;
sop += shift;
}
sim += vim.m;
sip += vip.m;
som += vom.m;
sop += vop.m;
}
if (vim && !nextRight(vop)) {
vop.t = vim;
vop.m += sim - sop;
}
if (vip && !nextLeft(vom)) {
vom.t = vip;
vom.m += sip - som;
ancestor = v;
}
}
return ancestor;
}
function sizeNode(node) {
node.x *= dx;
node.y = node.depth * dy;
}
tree.separation = function(x) {
return arguments.length ? (separation = x, tree) : separation;
};
tree.size = function(x) {
return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
};
tree.nodeSize = function(x) {
return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
};
return tree;
}
function treemapSlice(parent, x0, y0, x1, y1) {
var nodes = parent.children,
node,
i = -1,
n = nodes.length,
k = parent.value && (y1 - y0) / parent.value;
while (++i < n) {
node = nodes[i], node.x0 = x0, node.x1 = x1;
node.y0 = y0, node.y1 = y0 += node.value * k;
}
}
var phi = (1 + Math.sqrt(5)) / 2;
function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
var rows = [],
nodes = parent.children,
row,
nodeValue,
i0 = 0,
i1,
n = nodes.length,
dx, dy,
value = parent.value,
sumValue,
minValue,
maxValue,
newRatio,
minRatio,
alpha,
beta;
while (i0 < n) {
dx = x1 - x0, dy = y1 - y0;
minValue = maxValue = sumValue = nodes[i0].value;
alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
beta = sumValue * sumValue * alpha;
minRatio = Math.max(maxValue / beta, beta / minValue);
// Keep adding nodes while the aspect ratio maintains or improves.
for (i1 = i0 + 1; i1 < n; ++i1) {
sumValue += nodeValue = nodes[i1].value;
if (nodeValue < minValue) minValue = nodeValue;
if (nodeValue > maxValue) maxValue = nodeValue;
beta = sumValue * sumValue * alpha;
newRatio = Math.max(maxValue / beta, beta / minValue);
if (newRatio > minRatio) { sumValue -= nodeValue; break; }
minRatio = newRatio;
}
// Position and record the row orientation.
rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
value -= sumValue, i0 = i1;
}
return rows;
}
var squarify = (function custom(ratio) {
function squarify(parent, x0, y0, x1, y1) {
squarifyRatio(ratio, parent, x0, y0, x1, y1);
}
squarify.ratio = function(x) {
return custom((x = +x) > 1 ? x : 1);
};
return squarify;
})(phi);
function index$1() {
var tile = squarify,
round = false,
dx = 1,
dy = 1,
paddingStack = [0],
paddingInner = constantZero,
paddingTop = constantZero,
paddingRight = constantZero,
paddingBottom = constantZero,
paddingLeft = constantZero;
function treemap(root) {
root.x0 =
root.y0 = 0;
root.x1 = dx;
root.y1 = dy;
root.eachBefore(positionNode);
paddingStack = [0];
if (round) root.eachBefore(roundNode);
return root;
}
function positionNode(node) {
var p = paddingStack[node.depth],
x0 = node.x0 + p,
y0 = node.y0 + p,
x1 = node.x1 - p,
y1 = node.y1 - p;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
if (node.children) {
p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
x0 += paddingLeft(node) - p;
y0 += paddingTop(node) - p;
x1 -= paddingRight(node) - p;
y1 -= paddingBottom(node) - p;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
tile(node, x0, y0, x1, y1);
}
}
treemap.round = function(x) {
return arguments.length ? (round = !!x, treemap) : round;
};
treemap.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
};
treemap.tile = function(x) {
return arguments.length ? (tile = required(x), treemap) : tile;
};
treemap.padding = function(x) {
return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
};
treemap.paddingInner = function(x) {
return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$5(+x), treemap) : paddingInner;
};
treemap.paddingOuter = function(x) {
return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
};
treemap.paddingTop = function(x) {
return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$5(+x), treemap) : paddingTop;
};
treemap.paddingRight = function(x) {
return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$5(+x), treemap) : paddingRight;
};
treemap.paddingBottom = function(x) {
return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$5(+x), treemap) : paddingBottom;
};
treemap.paddingLeft = function(x) {
return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$5(+x), treemap) : paddingLeft;
};
return treemap;
}
function binary(parent, x0, y0, x1, y1) {
var nodes = parent.children,
i, n = nodes.length,
sum, sums = new Array(n + 1);
for (sums[0] = sum = i = 0; i < n; ++i) {
sums[i + 1] = sum += nodes[i].value;
}
partition(0, n, parent.value, x0, y0, x1, y1);
function partition(i, j, value, x0, y0, x1, y1) {
if (i >= j - 1) {
var node = nodes[i];
node.x0 = x0, node.y0 = y0;
node.x1 = x1, node.y1 = y1;
return;
}
var valueOffset = sums[i],
valueTarget = (value / 2) + valueOffset,
k = i + 1,
hi = j - 1;
while (k < hi) {
var mid = k + hi >>> 1;
if (sums[mid] < valueTarget) k = mid + 1;
else hi = mid;
}
var valueLeft = sums[k] - valueOffset,
valueRight = value - valueLeft;
if ((y1 - y0) > (x1 - x0)) {
var yk = (y0 * valueRight + y1 * valueLeft) / value;
partition(i, k, valueLeft, x0, y0, x1, yk);
partition(k, j, valueRight, x0, yk, x1, y1);
} else {
var xk = (x0 * valueRight + x1 * valueLeft) / value;
partition(i, k, valueLeft, x0, y0, xk, y1);
partition(k, j, valueRight, xk, y0, x1, y1);
}
}
}
function sliceDice(parent, x0, y0, x1, y1) {
(parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
}
var resquarify = (function custom(ratio) {
function resquarify(parent, x0, y0, x1, y1) {
if ((rows = parent._squarify) && (rows.ratio === ratio)) {
var rows,
row,
nodes,
i,
j = -1,
n,
m = rows.length,
value = parent.value;
while (++j < m) {
row = rows[j], nodes = row.children;
for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
value -= row.value;
}
} else {
parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
rows.ratio = ratio;
}
}
resquarify.ratio = function(x) {
return custom((x = +x) > 1 ? x : 1);
};
return resquarify;
})(phi);
function center$1(x, y) {
var nodes;
if (x == null) x = 0;
if (y == null) y = 0;
function force() {
var i,
n = nodes.length,
node,
sx = 0,
sy = 0;
for (i = 0; i < n; ++i) {
node = nodes[i], sx += node.x, sy += node.y;
}
for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
node = nodes[i], node.x -= sx, node.y -= sy;
}
}
force.initialize = function(_) {
nodes = _;
};
force.x = function(_) {
return arguments.length ? (x = +_, force) : x;
};
force.y = function(_) {
return arguments.length ? (y = +_, force) : y;
};
return force;
}
function constant$6(x) {
return function() {
return x;
};
}
function jiggle() {
return (Math.random() - 0.5) * 1e-6;
}
function x$1(d) {
return d.x + d.vx;
}
function y$1(d) {
return d.y + d.vy;
}
function collide(radius) {
var nodes,
radii,
strength = 1,
iterations = 1;
if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
function force() {
var i, n = nodes.length,
tree,
node,
xi,
yi,
ri,
ri2;
for (var k = 0; k < iterations; ++k) {
tree = quadtree(nodes, x$1, y$1).visitAfter(prepare);
for (i = 0; i < n; ++i) {
node = nodes[i];
ri = radii[i], ri2 = ri * ri;
xi = node.x + node.vx;
yi = node.y + node.vy;
tree.visit(apply);
}
}
function apply(quad, x0, y0, x1, y1) {
var data = quad.data, rj = quad.r, r = ri + rj;
if (data) {
if (data.index > i) {
var x = xi - data.x - data.vx,
y = yi - data.y - data.vy,
l = x * x + y * y;
if (l < r * r) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
l = (r - (l = Math.sqrt(l))) / l * strength;
node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
node.vy += (y *= l) * r;
data.vx -= x * (r = 1 - r);
data.vy -= y * r;
}
}
return;
}
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
}
}
function prepare(quad) {
if (quad.data) return quad.r = radii[quad.data.index];
for (var i = quad.r = 0; i < 4; ++i) {
if (quad[i] && quad[i].r > quad.r) {
quad.r = quad[i].r;
}
}
}
force.initialize = function(_) {
var i, n = (nodes = _).length; radii = new Array(n);
for (i = 0; i < n; ++i) radii[i] = +radius(nodes[i], i, nodes);
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = +_, force) : strength;
};
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), force) : radius;
};
return force;
}
function index$2(d, i) {
return i;
}
function link(links) {
var id = index$2,
strength = defaultStrength,
strengths,
distance = constant$6(30),
distances,
nodes,
count,
bias,
iterations = 1;
if (links == null) links = [];
function defaultStrength(link) {
return 1 / Math.min(count[link.source.index], count[link.target.index]);
}
function force(alpha) {
for (var k = 0, n = links.length; k < iterations; ++k) {
for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
link = links[i], source = link.source, target = link.target;
x = target.x + target.vx - source.x - source.vx || jiggle();
y = target.y + target.vy - source.y - source.vy || jiggle();
l = Math.sqrt(x * x + y * y);
l = (l - distances[i]) / l * alpha * strengths[i];
x *= l, y *= l;
target.vx -= x * (b = bias[i]);
target.vy -= y * b;
source.vx += x * (b = 1 - b);
source.vy += y * b;
}
}
}
function initialize() {
if (!nodes) return;
var i,
n = nodes.length,
m = links.length,
nodeById = map$1(nodes, id),
link;
for (i = 0, count = new Array(n); i < n; ++i) {
count[i] = 0;
}
for (i = 0; i < m; ++i) {
link = links[i], link.index = i;
if (typeof link.source !== "object") link.source = nodeById.get(link.source);
if (typeof link.target !== "object") link.target = nodeById.get(link.target);
++count[link.source.index], ++count[link.target.index];
}
for (i = 0, bias = new Array(m); i < m; ++i) {
link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
}
strengths = new Array(m), initializeStrength();
distances = new Array(m), initializeDistance();
}
function initializeStrength() {
if (!nodes) return;
for (var i = 0, n = links.length; i < n; ++i) {
strengths[i] = +strength(links[i], i, links);
}
}
function initializeDistance() {
if (!nodes) return;
for (var i = 0, n = links.length; i < n; ++i) {
distances[i] = +distance(links[i], i, links);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.links = function(_) {
return arguments.length ? (links = _, initialize(), force) : links;
};
force.id = function(_) {
return arguments.length ? (id = _, force) : id;
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
};
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
};
return force;
}
function x$2(d) {
return d.x;
}
function y$2(d) {
return d.y;
}
var initialRadius = 10;
var initialAngle = Math.PI * (3 - Math.sqrt(5));
function simulation(nodes) {
var simulation,
alpha = 1,
alphaMin = 0.001,
alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
alphaTarget = 0,
velocityDecay = 0.6,
forces = map$1(),
stepper = timer(step),
event = dispatch("tick", "end");
if (nodes == null) nodes = [];
function step() {
tick();
event.call("tick", simulation);
if (alpha < alphaMin) {
stepper.stop();
event.call("end", simulation);
}
}
function tick() {
var i, n = nodes.length, node;
alpha += (alphaTarget - alpha) * alphaDecay;
forces.each(function(force) {
force(alpha);
});
for (i = 0; i < n; ++i) {
node = nodes[i];
if (node.fx == null) node.x += node.vx *= velocityDecay;
else node.x = node.fx, node.vx = 0;
if (node.fy == null) node.y += node.vy *= velocityDecay;
else node.y = node.fy, node.vy = 0;
}
}
function initializeNodes() {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.index = i;
if (isNaN(node.x) || isNaN(node.y)) {
var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
node.x = radius * Math.cos(angle);
node.y = radius * Math.sin(angle);
}
if (isNaN(node.vx) || isNaN(node.vy)) {
node.vx = node.vy = 0;
}
}
}
function initializeForce(force) {
if (force.initialize) force.initialize(nodes);
return force;
}
initializeNodes();
return simulation = {
tick: tick,
restart: function() {
return stepper.restart(step), simulation;
},
stop: function() {
return stepper.stop(), simulation;
},
nodes: function(_) {
return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
},
alpha: function(_) {
return arguments.length ? (alpha = +_, simulation) : alpha;
},
alphaMin: function(_) {
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
},
alphaDecay: function(_) {
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
},
alphaTarget: function(_) {
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
},
velocityDecay: function(_) {
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
},
force: function(name, _) {
return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
},
find: function(x, y, radius) {
var i = 0,
n = nodes.length,
dx,
dy,
d2,
node,
closest;
if (radius == null) radius = Infinity;
else radius *= radius;
for (i = 0; i < n; ++i) {
node = nodes[i];
dx = x - node.x;
dy = y - node.y;
d2 = dx * dx + dy * dy;
if (d2 < radius) closest = node, radius = d2;
}
return closest;
},
on: function(name, _) {
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
}
};
}
function manyBody() {
var nodes,
node,
alpha,
strength = constant$6(-30),
strengths,
distanceMin2 = 1,
distanceMax2 = Infinity,
theta2 = 0.81;
function force(_) {
var i, n = nodes.length, tree = quadtree(nodes, x$2, y$2).visitAfter(accumulate);
for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
for (i = 0; i < n; ++i) strengths[i] = +strength(nodes[i], i, nodes);
}
function accumulate(quad) {
var strength = 0, q, c, x, y, i;
// For internal nodes, accumulate forces from child quadrants.
if (quad.length) {
for (x = y = i = 0; i < 4; ++i) {
if ((q = quad[i]) && (c = q.value)) {
strength += c, x += c * q.x, y += c * q.y;
}
}
quad.x = x / strength;
quad.y = y / strength;
}
// For leaf nodes, accumulate forces from coincident quadrants.
else {
q = quad;
q.x = q.data.x;
q.y = q.data.y;
do strength += strengths[q.data.index];
while (q = q.next);
}
quad.value = strength;
}
function apply(quad, x1, _, x2) {
if (!quad.value) return true;
var x = quad.x - node.x,
y = quad.y - node.y,
w = x2 - x1,
l = x * x + y * y;
// Apply the Barnes-Hut approximation if possible.
// Limit forces for very close nodes; randomize direction if coincident.
if (w * w / theta2 < l) {
if (l < distanceMax2) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
node.vx += x * quad.value * alpha / l;
node.vy += y * quad.value * alpha / l;
}
return true;
}
// Otherwise, process points directly.
else if (quad.length || l >= distanceMax2) return;
// Limit forces for very close nodes; randomize direction if coincident.
if (quad.data !== node || quad.next) {
if (x === 0) x = jiggle(), l += x * x;
if (y === 0) y = jiggle(), l += y * y;
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
}
do if (quad.data !== node) {
w = strengths[quad.data.index] * alpha / l;
node.vx += x * w;
node.vy += y * w;
} while (quad = quad.next);
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
};
force.distanceMin = function(_) {
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
};
force.distanceMax = function(_) {
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
};
force.theta = function(_) {
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
};
return force;
}
function x$3(x) {
var strength = constant$6(0.1),
nodes,
strengths,
xz;
if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
function force(alpha) {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
}
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
xz = new Array(n);
for (i = 0; i < n; ++i) {
strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
};
force.x = function(_) {
return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
};
return force;
}
function y$3(y) {
var strength = constant$6(0.1),
nodes,
strengths,
yz;
if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
function force(alpha) {
for (var i = 0, n = nodes.length, node; i < n; ++i) {
node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
}
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length;
strengths = new Array(n);
yz = new Array(n);
for (i = 0; i < n; ++i) {
strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
force.strength = function(_) {
return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
};
force.y = function(_) {
return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
};
return force;
}
function nopropagation() {
exports.event.stopImmediatePropagation();
}
function noevent() {
exports.event.preventDefault();
exports.event.stopImmediatePropagation();
}
function dragDisable(view) {
var root = view.document.documentElement,
selection = select(view).on("dragstart.drag", noevent, true);
if ("onselectstart" in root) {
selection.on("selectstart.drag", noevent, true);
} else {
root.__noselect = root.style.MozUserSelect;
root.style.MozUserSelect = "none";
}
}
function dragEnable(view, noclick) {
var root = view.document.documentElement,
selection = select(view).on("dragstart.drag", null);
if (noclick) {
selection.on("click.drag", noevent, true);
setTimeout(function() { selection.on("click.drag", null); }, 0);
}
if ("onselectstart" in root) {
selection.on("selectstart.drag", null);
} else {
root.style.MozUserSelect = root.__noselect;
delete root.__noselect;
}
}
function constant$7(x) {
return function() {
return x;
};
}
function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
this.target = target;
this.type = type;
this.subject = subject;
this.identifier = id;
this.active = active;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this._ = dispatch;
}
DragEvent.prototype.on = function() {
var value = this._.on.apply(this._, arguments);
return value === this._ ? this : value;
};
// Ignore right-click, since that should open the context menu.
function defaultFilter() {
return !exports.event.button;
}
function defaultContainer() {
return this.parentNode;
}
function defaultSubject(d) {
return d == null ? {x: exports.event.x, y: exports.event.y} : d;
}
function drag() {
var filter = defaultFilter,
container = defaultContainer,
subject = defaultSubject,
gestures = {},
listeners = dispatch("start", "drag", "end"),
active = 0,
mousemoving,
touchending;
function drag(selection) {
selection
.on("mousedown.drag", mousedowned)
.on("touchstart.drag", touchstarted)
.on("touchmove.drag", touchmoved)
.on("touchend.drag touchcancel.drag", touchended)
.style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
}
function mousedowned() {
if (touchending || !filter.apply(this, arguments)) return;
var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
if (!gesture) return;
select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
dragDisable(exports.event.view);
nopropagation();
mousemoving = false;
gesture("start");
}
function mousemoved() {
noevent();
mousemoving = true;
gestures.mouse("drag");
}
function mouseupped() {
select(exports.event.view).on("mousemove.drag mouseup.drag", null);
dragEnable(exports.event.view, mousemoving);
noevent();
gestures.mouse("end");
}
function touchstarted() {
if (!filter.apply(this, arguments)) return;
var touches = exports.event.changedTouches,
c = container.apply(this, arguments),
n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
nopropagation();
gesture("start");
}
}
}
function touchmoved() {
var touches = exports.event.changedTouches,
n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
noevent();
gesture("drag");
}
}
}
function touchended() {
var touches = exports.event.changedTouches,
n = touches.length, i, gesture;
if (touchending) clearTimeout(touchending);
touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
nopropagation();
gesture("end");
}
}
}
function beforestart(id, container, point, that, args) {
var p = point(container, id), s, dx, dy,
sublisteners = listeners.copy();
if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
if ((exports.event.subject = s = subject.apply(that, args)) == null) return false;
dx = s.x - p[0] || 0;
dy = s.y - p[1] || 0;
return true;
})) return;
return function gesture(type) {
var p0 = p, n;
switch (type) {
case "start": gestures[id] = gesture, n = active++; break;
case "end": delete gestures[id], --active; // nobreak
case "drag": p = point(container, id), n = active; break;
}
customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
};
}
drag.filter = function(_) {
return arguments.length ? (filter = typeof _ === "function" ? _ : constant$7(!!_), drag) : filter;
};
drag.container = function(_) {
return arguments.length ? (container = typeof _ === "function" ? _ : constant$7(_), drag) : container;
};
drag.subject = function(_) {
return arguments.length ? (subject = typeof _ === "function" ? _ : constant$7(_), drag) : subject;
};
drag.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? drag : value;
};
return drag;
}
function constant$8(x) {
return function() {
return x;
};
}
function x$4(d) {
return d[0];
}
function y$4(d) {
return d[1];
}
function RedBlackTree() {
this._ = null; // root node
}
function RedBlackNode(node) {
node.U = // parent node
node.C = // color - true for red, false for black
node.L = // left node
node.R = // right node
node.P = // previous node
node.N = null; // next node
}
RedBlackTree.prototype = {
constructor: RedBlackTree,
insert: function(after, node) {
var parent, grandpa, uncle;
if (after) {
node.P = after;
node.N = after.N;
if (after.N) after.N.P = node;
after.N = node;
if (after.R) {
after = after.R;
while (after.L) after = after.L;
after.L = node;
} else {
after.R = node;
}
parent = after;
} else if (this._) {
after = RedBlackFirst(this._);
node.P = null;
node.N = after;
after.P = after.L = node;
parent = after;
} else {
node.P = node.N = null;
this._ = node;
parent = null;
}
node.L = node.R = null;
node.U = parent;
node.C = true;
after = node;
while (parent && parent.C) {
grandpa = parent.U;
if (parent === grandpa.L) {
uncle = grandpa.R;
if (uncle && uncle.C) {
parent.C = uncle.C = false;
grandpa.C = true;
after = grandpa;
} else {
if (after === parent.R) {
RedBlackRotateLeft(this, parent);
after = parent;
parent = after.U;
}
parent.C = false;
grandpa.C = true;
RedBlackRotateRight(this, grandpa);
}
} else {
uncle = grandpa.L;
if (uncle && uncle.C) {
parent.C = uncle.C = false;
grandpa.C = true;
after = grandpa;
} else {
if (after === parent.L) {
RedBlackRotateRight(this, parent);
after = parent;
parent = after.U;
}
parent.C = false;
grandpa.C = true;
RedBlackRotateLeft(this, grandpa);
}
}
parent = after.U;
}
this._.C = false;
},
remove: function(node) {
if (node.N) node.N.P = node.P;
if (node.P) node.P.N = node.N;
node.N = node.P = null;
var parent = node.U,
sibling,
left = node.L,
right = node.R,
next,
red;
if (!left) next = right;
else if (!right) next = left;
else next = RedBlackFirst(right);
if (parent) {
if (parent.L === node) parent.L = next;
else parent.R = next;
} else {
this._ = next;
}
if (left && right) {
red = next.C;
next.C = node.C;
next.L = left;
left.U = next;
if (next !== right) {
parent = next.U;
next.U = node.U;
node = next.R;
parent.L = node;
next.R = right;
right.U = next;
} else {
next.U = parent;
parent = next;
node = next.R;
}
} else {
red = node.C;
node = next;
}
if (node) node.U = parent;
if (red) return;
if (node && node.C) { node.C = false; return; }
do {
if (node === this._) break;
if (node === parent.L) {
sibling = parent.R;
if (sibling.C) {
sibling.C = false;
parent.C = true;
RedBlackRotateLeft(this, parent);
sibling = parent.R;
}
if ((sibling.L && sibling.L.C)
|| (sibling.R && sibling.R.C)) {
if (!sibling.R || !sibling.R.C) {
sibling.L.C = false;
sibling.C = true;
RedBlackRotateRight(this, sibling);
sibling = parent.R;
}
sibling.C = parent.C;
parent.C = sibling.R.C = false;
RedBlackRotateLeft(this, parent);
node = this._;
break;
}
} else {
sibling = parent.L;
if (sibling.C) {
sibling.C = false;
parent.C = true;
RedBlackRotateRight(this, parent);
sibling = parent.L;
}
if ((sibling.L && sibling.L.C)
|| (sibling.R && sibling.R.C)) {
if (!sibling.L || !sibling.L.C) {
sibling.R.C = false;
sibling.C = true;
RedBlackRotateLeft(this, sibling);
sibling = parent.L;
}
sibling.C = parent.C;
parent.C = sibling.L.C = false;
RedBlackRotateRight(this, parent);
node = this._;
break;
}
}
sibling.C = true;
node = parent;
parent = parent.U;
} while (!node.C);
if (node) node.C = false;
}
};
function RedBlackRotateLeft(tree, node) {
var p = node,
q = node.R,
parent = p.U;
if (parent) {
if (parent.L === p) parent.L = q;
else parent.R = q;
} else {
tree._ = q;
}
q.U = parent;
p.U = q;
p.R = q.L;
if (p.R) p.R.U = p;
q.L = p;
}
function RedBlackRotateRight(tree, node) {
var p = node,
q = node.L,
parent = p.U;
if (parent) {
if (parent.L === p) parent.L = q;
else parent.R = q;
} else {
tree._ = q;
}
q.U = parent;
p.U = q;
p.L = q.R;
if (p.L) p.L.U = p;
q.R = p;
}
function RedBlackFirst(node) {
while (node.L) node = node.L;
return node;
}
function createEdge(left, right, v0, v1) {
var edge = [null, null],
index = edges.push(edge) - 1;
edge.left = left;
edge.right = right;
if (v0) setEdgeEnd(edge, left, right, v0);
if (v1) setEdgeEnd(edge, right, left, v1);
cells[left.index].halfedges.push(index);
cells[right.index].halfedges.push(index);
return edge;
}
function createBorderEdge(left, v0, v1) {
var edge = [v0, v1];
edge.left = left;
return edge;
}
function setEdgeEnd(edge, left, right, vertex) {
if (!edge[0] && !edge[1]) {
edge[0] = vertex;
edge.left = left;
edge.right = right;
} else if (edge.left === right) {
edge[1] = vertex;
} else {
edge[0] = vertex;
}
}
// Liang–Barsky line clipping.
function clipEdge(edge, x0, y0, x1, y1) {
var a = edge[0],
b = edge[1],
ax = a[0],
ay = a[1],
bx = b[0],
by = b[1],
t0 = 0,
t1 = 1,
dx = bx - ax,
dy = by - ay,
r;
r = x0 - ax;
if (!dx && r > 0) return;
r /= dx;
if (dx < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dx > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = x1 - ax;
if (!dx && r < 0) return;
r /= dx;
if (dx < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dx > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
r = y0 - ay;
if (!dy && r > 0) return;
r /= dy;
if (dy < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dy > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = y1 - ay;
if (!dy && r < 0) return;
r /= dy;
if (dy < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dy > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
return true;
}
function connectEdge(edge, x0, y0, x1, y1) {
var v1 = edge[1];
if (v1) return true;
var v0 = edge[0],
left = edge.left,
right = edge.right,
lx = left[0],
ly = left[1],
rx = right[0],
ry = right[1],
fx = (lx + rx) / 2,
fy = (ly + ry) / 2,
fm,
fb;
if (ry === ly) {
if (fx < x0 || fx >= x1) return;
if (lx > rx) {
if (!v0) v0 = [fx, y0];
else if (v0[1] >= y1) return;
v1 = [fx, y1];
} else {
if (!v0) v0 = [fx, y1];
else if (v0[1] < y0) return;
v1 = [fx, y0];
}
} else {
fm = (lx - rx) / (ry - ly);
fb = fy - fm * fx;
if (fm < -1 || fm > 1) {
if (lx > rx) {
if (!v0) v0 = [(y0 - fb) / fm, y0];
else if (v0[1] >= y1) return;
v1 = [(y1 - fb) / fm, y1];
} else {
if (!v0) v0 = [(y1 - fb) / fm, y1];
else if (v0[1] < y0) return;
v1 = [(y0 - fb) / fm, y0];
}
} else {
if (ly < ry) {
if (!v0) v0 = [x0, fm * x0 + fb];
else if (v0[0] >= x1) return;
v1 = [x1, fm * x1 + fb];
} else {
if (!v0) v0 = [x1, fm * x1 + fb];
else if (v0[0] < x0) return;
v1 = [x0, fm * x0 + fb];
}
}
}
edge[0] = v0;
edge[1] = v1;
return true;
}
function clipEdges(x0, y0, x1, y1) {
var i = edges.length,
edge;
while (i--) {
if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
|| !clipEdge(edge, x0, y0, x1, y1)
|| !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$3
|| Math.abs(edge[0][1] - edge[1][1]) > epsilon$3)) {
delete edges[i];
}
}
}
function createCell(site) {
return cells[site.index] = {
site: site,
halfedges: []
};
}
function cellHalfedgeAngle(cell, edge) {
var site = cell.site,
va = edge.left,
vb = edge.right;
if (site === vb) vb = va, va = site;
if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
if (site === va) va = edge[1], vb = edge[0];
else va = edge[0], vb = edge[1];
return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
}
function cellHalfedgeStart(cell, edge) {
return edge[+(edge.left !== cell.site)];
}
function cellHalfedgeEnd(cell, edge) {
return edge[+(edge.left === cell.site)];
}
function sortCellHalfedges() {
for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
var index = new Array(m),
array = new Array(m);
for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
index.sort(function(i, j) { return array[j] - array[i]; });
for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
for (j = 0; j < m; ++j) halfedges[j] = array[j];
}
}
}
function clipCells(x0, y0, x1, y1) {
var nCells = cells.length,
iCell,
cell,
site,
iHalfedge,
halfedges,
nHalfedges,
start,
startX,
startY,
end,
endX,
endY,
cover = true;
for (iCell = 0; iCell < nCells; ++iCell) {
if (cell = cells[iCell]) {
site = cell.site;
halfedges = cell.halfedges;
iHalfedge = halfedges.length;
// Remove any dangling clipped edges.
while (iHalfedge--) {
if (!edges[halfedges[iHalfedge]]) {
halfedges.splice(iHalfedge, 1);
}
}
// Insert any border edges as necessary.
iHalfedge = 0, nHalfedges = halfedges.length;
while (iHalfedge < nHalfedges) {
end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
if (Math.abs(endX - startX) > epsilon$3 || Math.abs(endY - startY) > epsilon$3) {
halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
Math.abs(endX - x0) < epsilon$3 && y1 - endY > epsilon$3 ? [x0, Math.abs(startX - x0) < epsilon$3 ? startY : y1]
: Math.abs(endY - y1) < epsilon$3 && x1 - endX > epsilon$3 ? [Math.abs(startY - y1) < epsilon$3 ? startX : x1, y1]
: Math.abs(endX - x1) < epsilon$3 && endY - y0 > epsilon$3 ? [x1, Math.abs(startX - x1) < epsilon$3 ? startY : y0]
: Math.abs(endY - y0) < epsilon$3 && endX - x0 > epsilon$3 ? [Math.abs(startY - y0) < epsilon$3 ? startX : x0, y0]
: null)) - 1);
++nHalfedges;
}
}
if (nHalfedges) cover = false;
}
}
// If there weren’t any edges, have the closest site cover the extent.
// It doesn’t matter which corner of the extent we measure!
if (cover) {
var dx, dy, d2, dc = Infinity;
for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
if (cell = cells[iCell]) {
site = cell.site;
dx = site[0] - x0;
dy = site[1] - y0;
d2 = dx * dx + dy * dy;
if (d2 < dc) dc = d2, cover = cell;
}
}
if (cover) {
var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
cover.halfedges.push(
edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
edges.push(createBorderEdge(site, v01, v11)) - 1,
edges.push(createBorderEdge(site, v11, v10)) - 1,
edges.push(createBorderEdge(site, v10, v00)) - 1
);
}
}
// Lastly delete any cells with no edges; these were entirely clipped.
for (iCell = 0; iCell < nCells; ++iCell) {
if (cell = cells[iCell]) {
if (!cell.halfedges.length) {
delete cells[iCell];
}
}
}
}
var circlePool = [];
var firstCircle;
function Circle() {
RedBlackNode(this);
this.x =
this.y =
this.arc =
this.site =
this.cy = null;
}
function attachCircle(arc) {
var lArc = arc.P,
rArc = arc.N;
if (!lArc || !rArc) return;
var lSite = lArc.site,
cSite = arc.site,
rSite = rArc.site;
if (lSite === rSite) return;
var bx = cSite[0],
by = cSite[1],
ax = lSite[0] - bx,
ay = lSite[1] - by,
cx = rSite[0] - bx,
cy = rSite[1] - by;
var d = 2 * (ax * cy - ay * cx);
if (d >= -epsilon2$1) return;
var ha = ax * ax + ay * ay,
hc = cx * cx + cy * cy,
x = (cy * ha - ay * hc) / d,
y = (ax * hc - cx * ha) / d;
var circle = circlePool.pop() || new Circle;
circle.arc = arc;
circle.site = cSite;
circle.x = x + bx;
circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
arc.circle = circle;
var before = null,
node = circles._;
while (node) {
if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
if (node.L) node = node.L;
else { before = node.P; break; }
} else {
if (node.R) node = node.R;
else { before = node; break; }
}
}
circles.insert(before, circle);
if (!before) firstCircle = circle;
}
function detachCircle(arc) {
var circle = arc.circle;
if (circle) {
if (!circle.P) firstCircle = circle.N;
circles.remove(circle);
circlePool.push(circle);
RedBlackNode(circle);
arc.circle = null;
}
}
var beachPool = [];
function Beach() {
RedBlackNode(this);
this.edge =
this.site =
this.circle = null;
}
function createBeach(site) {
var beach = beachPool.pop() || new Beach;
beach.site = site;
return beach;
}
function detachBeach(beach) {
detachCircle(beach);
beaches.remove(beach);
beachPool.push(beach);
RedBlackNode(beach);
}
function removeBeach(beach) {
var circle = beach.circle,
x = circle.x,
y = circle.cy,
vertex = [x, y],
previous = beach.P,
next = beach.N,
disappearing = [beach];
detachBeach(beach);
var lArc = previous;
while (lArc.circle
&& Math.abs(x - lArc.circle.x) < epsilon$3
&& Math.abs(y - lArc.circle.cy) < epsilon$3) {
previous = lArc.P;
disappearing.unshift(lArc);
detachBeach(lArc);
lArc = previous;
}
disappearing.unshift(lArc);
detachCircle(lArc);
var rArc = next;
while (rArc.circle
&& Math.abs(x - rArc.circle.x) < epsilon$3
&& Math.abs(y - rArc.circle.cy) < epsilon$3) {
next = rArc.N;
disappearing.push(rArc);
detachBeach(rArc);
rArc = next;
}
disappearing.push(rArc);
detachCircle(rArc);
var nArcs = disappearing.length,
iArc;
for (iArc = 1; iArc < nArcs; ++iArc) {
rArc = disappearing[iArc];
lArc = disappearing[iArc - 1];
setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
}
lArc = disappearing[0];
rArc = disappearing[nArcs - 1];
rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
attachCircle(lArc);
attachCircle(rArc);
}
function addBeach(site) {
var x = site[0],
directrix = site[1],
lArc,
rArc,
dxl,
dxr,
node = beaches._;
while (node) {
dxl = leftBreakPoint(node, directrix) - x;
if (dxl > epsilon$3) node = node.L; else {
dxr = x - rightBreakPoint(node, directrix);
if (dxr > epsilon$3) {
if (!node.R) {
lArc = node;
break;
}
node = node.R;
} else {
if (dxl > -epsilon$3) {
lArc = node.P;
rArc = node;
} else if (dxr > -epsilon$3) {
lArc = node;
rArc = node.N;
} else {
lArc = rArc = node;
}
break;
}
}
}
createCell(site);
var newArc = createBeach(site);
beaches.insert(lArc, newArc);
if (!lArc && !rArc) return;
if (lArc === rArc) {
detachCircle(lArc);
rArc = createBeach(lArc.site);
beaches.insert(newArc, rArc);
newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
attachCircle(lArc);
attachCircle(rArc);
return;
}
if (!rArc) { // && lArc
newArc.edge = createEdge(lArc.site, newArc.site);
return;
}
// else lArc !== rArc
detachCircle(lArc);
detachCircle(rArc);
var lSite = lArc.site,
ax = lSite[0],
ay = lSite[1],
bx = site[0] - ax,
by = site[1] - ay,
rSite = rArc.site,
cx = rSite[0] - ax,
cy = rSite[1] - ay,
d = 2 * (bx * cy - by * cx),
hb = bx * bx + by * by,
hc = cx * cx + cy * cy,
vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
setEdgeEnd(rArc.edge, lSite, rSite, vertex);
newArc.edge = createEdge(lSite, site, null, vertex);
rArc.edge = createEdge(site, rSite, null, vertex);
attachCircle(lArc);
attachCircle(rArc);
}
function leftBreakPoint(arc, directrix) {
var site = arc.site,
rfocx = site[0],
rfocy = site[1],
pby2 = rfocy - directrix;
if (!pby2) return rfocx;
var lArc = arc.P;
if (!lArc) return -Infinity;
site = lArc.site;
var lfocx = site[0],
lfocy = site[1],
plby2 = lfocy - directrix;
if (!plby2) return lfocx;
var hl = lfocx - rfocx,
aby2 = 1 / pby2 - 1 / plby2,
b = hl / plby2;
if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
return (rfocx + lfocx) / 2;
}
function rightBreakPoint(arc, directrix) {
var rArc = arc.N;
if (rArc) return leftBreakPoint(rArc, directrix);
var site = arc.site;
return site[1] === directrix ? site[0] : Infinity;
}
var epsilon$3 = 1e-6;
var epsilon2$1 = 1e-12;
var beaches;
var cells;
var circles;
var edges;
function triangleArea(a, b, c) {
return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
}
function lexicographic(a, b) {
return b[1] - a[1]
|| b[0] - a[0];
}
function Diagram(sites, extent) {
var site = sites.sort(lexicographic).pop(),
x,
y,
circle;
edges = [];
cells = new Array(sites.length);
beaches = new RedBlackTree;
circles = new RedBlackTree;
while (true) {
circle = firstCircle;
if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
if (site[0] !== x || site[1] !== y) {
addBeach(site);
x = site[0], y = site[1];
}
site = sites.pop();
} else if (circle) {
removeBeach(circle.arc);
} else {
break;
}
}
sortCellHalfedges();
if (extent) {
var x0 = +extent[0][0],
y0 = +extent[0][1],
x1 = +extent[1][0],
y1 = +extent[1][1];
clipEdges(x0, y0, x1, y1);
clipCells(x0, y0, x1, y1);
}
this.edges = edges;
this.cells = cells;
beaches =
circles =
edges =
cells = null;
}
Diagram.prototype = {
constructor: Diagram,
polygons: function() {
var edges = this.edges;
return this.cells.map(function(cell) {
var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
polygon.data = cell.site.data;
return polygon;
});
},
triangles: function() {
var triangles = [],
edges = this.edges;
this.cells.forEach(function(cell, i) {
var site = cell.site,
halfedges = cell.halfedges,
j = -1,
m = halfedges.length,
s0,
e1 = edges[halfedges[m - 1]],
s1 = e1.left === site ? e1.right : e1.left;
while (++j < m) {
s0 = s1;
e1 = edges[halfedges[j]];
s1 = e1.left === site ? e1.right : e1.left;
if (i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
triangles.push([site.data, s0.data, s1.data]);
}
}
});
return triangles;
},
links: function() {
return this.edges.filter(function(edge) {
return edge.right;
}).map(function(edge) {
return {
source: edge.left.data,
target: edge.right.data
};
});
}
}
function voronoi() {
var x = x$4,
y = y$4,
extent = null;
function voronoi(data) {
return new Diagram(data.map(function(d, i) {
var s = [Math.round(x(d, i, data) / epsilon$3) * epsilon$3, Math.round(y(d, i, data) / epsilon$3) * epsilon$3];
s.index = i;
s.data = d;
return s;
}), extent);
}
voronoi.polygons = function(data) {
return voronoi(data).polygons();
};
voronoi.links = function(data) {
return voronoi(data).links();
};
voronoi.triangles = function(data) {
return voronoi(data).triangles();
};
voronoi.x = function(_) {
return arguments.length ? (x = typeof _ === "function" ? _ : constant$8(+_), voronoi) : x;
};
voronoi.y = function(_) {
return arguments.length ? (y = typeof _ === "function" ? _ : constant$8(+_), voronoi) : y;
};
voronoi.extent = function(_) {
return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
};
voronoi.size = function(_) {
return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
};
return voronoi;
}
function constant$9(x) {
return function() {
return x;
};
}
function ZoomEvent(target, type, transform) {
this.target = target;
this.type = type;
this.transform = transform;
}
function Transform(k, x, y) {
this.k = k;
this.x = x;
this.y = y;
}
Transform.prototype = {
constructor: Transform,
scale: function(k) {
return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
},
translate: function(x, y) {
return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
},
apply: function(point) {
return [point[0] * this.k + this.x, point[1] * this.k + this.y];
},
applyX: function(x) {
return x * this.k + this.x;
},
applyY: function(y) {
return y * this.k + this.y;
},
invert: function(location) {
return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
},
invertX: function(x) {
return (x - this.x) / this.k;
},
invertY: function(y) {
return (y - this.y) / this.k;
},
rescaleX: function(x) {
return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
},
rescaleY: function(y) {
return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
},
toString: function() {
return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
}
};
var identity$6 = new Transform(1, 0, 0);
transform.prototype = Transform.prototype;
function transform(node) {
return node.__zoom || identity$6;
}
function nopropagation$1() {
exports.event.stopImmediatePropagation();
}
function noevent$1() {
exports.event.preventDefault();
exports.event.stopImmediatePropagation();
}
// Ignore right-click, since that should open the context menu.
function defaultFilter$1() {
return !exports.event.button;
}
function defaultExtent() {
var e = this, w, h;
if (e instanceof SVGElement) {
e = e.ownerSVGElement || e;
w = e.width.baseVal.value;
h = e.height.baseVal.value;
} else {
w = e.clientWidth;
h = e.clientHeight;
}
return [[0, 0], [w, h]];
}
function defaultTransform() {
return this.__zoom || identity$6;
}
function zoom() {
var filter = defaultFilter$1,
extent = defaultExtent,
k0 = 0,
k1 = Infinity,
x0 = -k1,
x1 = k1,
y0 = x0,
y1 = x1,
duration = 250,
gestures = [],
listeners = dispatch("start", "zoom", "end"),
touchstarting,
touchending,
touchDelay = 500,
wheelDelay = 150;
function zoom(selection) {
selection
.on("wheel.zoom", wheeled)
.on("mousedown.zoom", mousedowned)
.on("dblclick.zoom", dblclicked)
.on("touchstart.zoom", touchstarted)
.on("touchmove.zoom", touchmoved)
.on("touchend.zoom touchcancel.zoom", touchended)
.style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
.property("__zoom", defaultTransform);
}
zoom.transform = function(collection, transform) {
var selection = collection.selection ? collection.selection() : collection;
selection.property("__zoom", defaultTransform);
if (collection !== selection) {
schedule(collection, transform);
} else {
selection.interrupt().each(function() {
gesture(this, arguments)
.start()
.zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
.end();
});
}
};
zoom.scaleBy = function(selection, k) {
zoom.scaleTo(selection, function() {
var k0 = this.__zoom.k,
k1 = typeof k === "function" ? k.apply(this, arguments) : k;
return k0 * k1;
});
};
zoom.scaleTo = function(selection, k) {
zoom.transform(selection, function() {
var e = extent.apply(this, arguments),
t0 = this.__zoom,
p0 = centroid(e),
p1 = t0.invert(p0),
k1 = typeof k === "function" ? k.apply(this, arguments) : k;
return constrain(translate(scale(t0, k1), p0, p1), e);
});
};
zoom.translateBy = function(selection, x, y) {
zoom.transform(selection, function() {
return constrain(this.__zoom.translate(
typeof x === "function" ? x.apply(this, arguments) : x,
typeof y === "function" ? y.apply(this, arguments) : y
), extent.apply(this, arguments));
});
};
function scale(transform, k) {
k = Math.max(k0, Math.min(k1, k));
return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
}
function translate(transform, p0, p1) {
var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
}
function constrain(transform, extent) {
var dx = Math.min(0, transform.invertX(extent[0][0]) - x0) || Math.max(0, transform.invertX(extent[1][0]) - x1),
dy = Math.min(0, transform.invertY(extent[0][1]) - y0) || Math.max(0, transform.invertY(extent[1][1]) - y1);
return dx || dy ? transform.translate(dx, dy) : transform;
}
function centroid(extent) {
return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
}
function schedule(transition, transform, center) {
transition
.on("start.zoom", function() { gesture(this, arguments).start(); })
.on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
.tween("zoom", function() {
var that = this,
args = arguments,
g = gesture(that, args),
e = extent.apply(that, args),
p = center || centroid(e),
w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
a = that.__zoom,
b = typeof transform === "function" ? transform.apply(that, args) : transform,
i = interpolateZoom(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
return function(t) {
if (t === 1) t = b; // Avoid rounding error on end.
else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
g.zoom(null, t);
};
});
}
function gesture(that, args) {
for (var i = 0, n = gestures.length, g; i < n; ++i) {
if ((g = gestures[i]).that === that) {
return g;
}
}
return new Gesture(that, args);
}
function Gesture(that, args) {
this.that = that;
this.args = args;
this.index = -1;
this.active = 0;
this.extent = extent.apply(that, args);
}
Gesture.prototype = {
start: function() {
if (++this.active === 1) {
this.index = gestures.push(this) - 1;
this.emit("start");
}
return this;
},
zoom: function(key, transform) {
if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
this.that.__zoom = transform;
this.emit("zoom");
return this;
},
end: function() {
if (--this.active === 0) {
gestures.splice(this.index, 1);
this.index = -1;
this.emit("end");
}
return this;
},
emit: function(type) {
customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
}
};
function wheeled() {
if (!filter.apply(this, arguments)) return;
var g = gesture(this, arguments),
t = this.__zoom,
k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, -exports.event.deltaY * (exports.event.deltaMode ? 120 : 1) / 500))),
p = mouse(this);
// If the mouse is in the same location as before, reuse it.
// If there were recent wheel events, reset the wheel idle timeout.
if (g.wheel) {
if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
g.mouse[1] = t.invert(g.mouse[0] = p);
}
clearTimeout(g.wheel);
}
// If this wheel event won’t trigger a transform change, ignore it.
else if (t.k === k) return;
// Otherwise, capture the mouse point and location at the start.
else {
g.mouse = [p, t.invert(p)];
interrupt(this);
g.start();
}
noevent$1();
g.wheel = setTimeout(wheelidled, wheelDelay);
g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent));
function wheelidled() {
g.wheel = null;
g.end();
}
}
function mousedowned() {
if (touchending || !filter.apply(this, arguments)) return;
var g = gesture(this, arguments),
v = select(exports.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
p = mouse(this);
dragDisable(exports.event.view);
nopropagation$1();
g.mouse = [p, this.__zoom.invert(p)];
interrupt(this);
g.start();
function mousemoved() {
noevent$1();
g.moved = true;
g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent));
}
function mouseupped() {
v.on("mousemove.zoom mouseup.zoom", null);
dragEnable(exports.event.view, g.moved);
noevent$1();
g.end();
}
}
function dblclicked() {
if (!filter.apply(this, arguments)) return;
var t0 = this.__zoom,
p0 = mouse(this),
p1 = t0.invert(p0),
k1 = t0.k * (exports.event.shiftKey ? 0.5 : 2),
t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments));
noevent$1();
if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
else select(this).call(zoom.transform, t1);
}
function touchstarted() {
if (!filter.apply(this, arguments)) return;
var g = gesture(this, arguments),
touches = exports.event.changedTouches,
n = touches.length, i, t, p;
nopropagation$1();
for (i = 0; i < n; ++i) {
t = touches[i], p = touch(this, touches, t.identifier);
p = [p, this.__zoom.invert(p), t.identifier];
if (!g.touch0) g.touch0 = p;
else if (!g.touch1) g.touch1 = p;
}
if (touchstarting) {
touchstarting = clearTimeout(touchstarting);
if (!g.touch1) return g.end(), dblclicked.apply(this, arguments);
}
if (exports.event.touches.length === n) {
touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
interrupt(this);
g.start();
}
}
function touchmoved() {
var g = gesture(this, arguments),
touches = exports.event.changedTouches,
n = touches.length, i, t, p, l;
noevent$1();
if (touchstarting) touchstarting = clearTimeout(touchstarting);
for (i = 0; i < n; ++i) {
t = touches[i], p = touch(this, touches, t.identifier);
if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
}
t = g.that.__zoom;
if (g.touch1) {
var p0 = g.touch0[0], l0 = g.touch0[1],
p1 = g.touch1[0], l1 = g.touch1[1],
dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
t = scale(t, Math.sqrt(dp / dl));
p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
}
else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
else return;
g.zoom("touch", constrain(translate(t, p, l), g.extent));
}
function touchended() {
var g = gesture(this, arguments),
touches = exports.event.changedTouches,
n = touches.length, i, t;
nopropagation$1();
if (touchending) clearTimeout(touchending);
touchending = setTimeout(function() { touchending = null; }, touchDelay);
for (i = 0; i < n; ++i) {
t = touches[i];
if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
}
if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
if (!g.touch0) g.end();
}
zoom.filter = function(_) {
return arguments.length ? (filter = typeof _ === "function" ? _ : constant$9(!!_), zoom) : filter;
};
zoom.extent = function(_) {
return arguments.length ? (extent = typeof _ === "function" ? _ : constant$9([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
};
zoom.scaleExtent = function(_) {
return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1];
};
zoom.translateExtent = function(_) {
return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]];
};
zoom.duration = function(_) {
return arguments.length ? (duration = +_, zoom) : duration;
};
zoom.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? zoom : value;
};
return zoom;
}
function constant$10(x) {
return function() {
return x;
};
}
function BrushEvent(target, type, selection) {
this.target = target;
this.type = type;
this.selection = selection;
}
function nopropagation$2() {
exports.event.stopImmediatePropagation();
}
function noevent$2() {
exports.event.preventDefault();
exports.event.stopImmediatePropagation();
}
var MODE_DRAG = {name: "drag"};
var MODE_SPACE = {name: "space"};
var MODE_HANDLE = {name: "handle"};
var MODE_CENTER = {name: "center"};
var X = {
name: "x",
handles: ["e", "w"].map(type$1),
input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
};
var Y = {
name: "y",
handles: ["n", "s"].map(type$1),
input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
};
var XY = {
name: "xy",
handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type$1),
input: function(xy) { return xy; },
output: function(xy) { return xy; }
};
var cursors = {
overlay: "crosshair",
selection: "move",
n: "ns-resize",
e: "ew-resize",
s: "ns-resize",
w: "ew-resize",
nw: "nwse-resize",
ne: "nesw-resize",
se: "nwse-resize",
sw: "nesw-resize"
};
var flipX = {
e: "w",
w: "e",
nw: "ne",
ne: "nw",
se: "sw",
sw: "se"
};
var flipY = {
n: "s",
s: "n",
nw: "sw",
ne: "se",
se: "ne",
sw: "nw"
};
var signsX = {
overlay: +1,
selection: +1,
n: null,
e: +1,
s: null,
w: -1,
nw: -1,
ne: +1,
se: +1,
sw: -1
};
var signsY = {
overlay: +1,
selection: +1,
n: -1,
e: null,
s: +1,
w: null,
nw: -1,
ne: -1,
se: +1,
sw: +1
};
function type$1(t) {
return {type: t};
}
// Ignore right-click, since that should open the context menu.
function defaultFilter$2() {
return !exports.event.button;
}
function defaultExtent$1() {
var svg = this.ownerSVGElement || this;
return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
}
// Like d3.local, but with the name “__brush” rather than auto-generated.
function local$1(node) {
while (!node.__brush) if (!(node = node.parentNode)) return;
return node.__brush;
}
function empty$1(extent) {
return extent[0][0] === extent[1][0]
|| extent[0][1] === extent[1][1];
}
function brushSelection(node) {
var state = node.__brush;
return state ? state.dim.output(state.selection) : null;
}
function brushX() {
return brush$1(X);
}
function brushY() {
return brush$1(Y);
}
function brush() {
return brush$1(XY);
}
function brush$1(dim) {
var extent = defaultExtent$1,
filter = defaultFilter$2,
listeners = dispatch(brush, "start", "brush", "end"),
handleSize = 6,
touchending;
function brush(group) {
var overlay = group
.property("__brush", initialize)
.selectAll(".overlay")
.data([type$1("overlay")]);
overlay.enter().append("rect")
.attr("class", "overlay")
.attr("pointer-events", "all")
.attr("cursor", cursors.overlay)
.merge(overlay)
.each(function() {
var extent = local$1(this).extent;
select(this)
.attr("x", extent[0][0])
.attr("y", extent[0][1])
.attr("width", extent[1][0] - extent[0][0])
.attr("height", extent[1][1] - extent[0][1]);
});
group.selectAll(".selection")
.data([type$1("selection")])
.enter().append("rect")
.attr("class", "selection")
.attr("cursor", cursors.selection)
.attr("fill", "#777")
.attr("fill-opacity", 0.3)
.attr("stroke", "#fff")
.attr("shape-rendering", "crispEdges");
var handle = group.selectAll(".handle")
.data(dim.handles, function(d) { return d.type; });
handle.exit().remove();
handle.enter().append("rect")
.attr("class", function(d) { return "handle handle--" + d.type; })
.attr("cursor", function(d) { return cursors[d.type]; });
group
.each(redraw)
.attr("fill", "none")
.attr("pointer-events", "all")
.style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
.on("mousedown.brush touchstart.brush", started);
}
brush.move = function(group, selection) {
if (group.selection) {
group
.on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
.on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
.tween("brush", function() {
var that = this,
state = that.__brush,
emit = emitter(that, arguments),
selection0 = state.selection,
selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
i = interpolate(selection0, selection1);
function tween(t) {
state.selection = t === 1 && empty$1(selection1) ? null : i(t);
redraw.call(that);
emit.brush();
}
return selection0 && selection1 ? tween : tween(1);
});
} else {
group
.each(function() {
var that = this,
args = arguments,
state = that.__brush,
selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
emit = emitter(that, args).beforestart();
interrupt(that);
state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
redraw.call(that);
emit.start().brush().end();
});
}
};
function redraw() {
var group = select(this),
selection = local$1(this).selection;
if (selection) {
group.selectAll(".selection")
.style("display", null)
.attr("x", selection[0][0])
.attr("y", selection[0][1])
.attr("width", selection[1][0] - selection[0][0])
.attr("height", selection[1][1] - selection[0][1]);
group.selectAll(".handle")
.style("display", null)
.attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
.attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
.attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
.attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
}
else {
group.selectAll(".selection,.handle")
.style("display", "none")
.attr("x", null)
.attr("y", null)
.attr("width", null)
.attr("height", null);
}
}
function emitter(that, args) {
return that.__brush.emitter || new Emitter(that, args);
}
function Emitter(that, args) {
this.that = that;
this.args = args;
this.state = that.__brush;
this.active = 0;
}
Emitter.prototype = {
beforestart: function() {
if (++this.active === 1) this.state.emitter = this, this.starting = true;
return this;
},
start: function() {
if (this.starting) this.starting = false, this.emit("start");
return this;
},
brush: function() {
this.emit("brush");
return this;
},
end: function() {
if (--this.active === 0) delete this.state.emitter, this.emit("end");
return this;
},
emit: function(type) {
customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
}
};
function started() {
if (exports.event.touches) { if (exports.event.changedTouches.length < exports.event.touches.length) return noevent$2(); }
else if (touchending) return;
if (!filter.apply(this, arguments)) return;
var that = this,
type = exports.event.target.__data__.type,
mode = (exports.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (exports.event.altKey ? MODE_CENTER : MODE_HANDLE),
signX = dim === Y ? null : signsX[type],
signY = dim === X ? null : signsY[type],
state = local$1(that),
extent = state.extent,
selection = state.selection,
W = extent[0][0], w0, w1,
N = extent[0][1], n0, n1,
E = extent[1][0], e0, e1,
S = extent[1][1], s0, s1,
dx,
dy,
moving,
shifting = signX && signY && exports.event.shiftKey,
lockX,
lockY,
point0 = mouse(that),
point = point0,
emit = emitter(that, arguments).beforestart();
if (type === "overlay") {
state.selection = selection = [
[w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
[e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
];
} else {
w0 = selection[0][0];
n0 = selection[0][1];
e0 = selection[1][0];
s0 = selection[1][1];
}
w1 = w0;
n1 = n0;
e1 = e0;
s1 = s0;
var group = select(that)
.attr("pointer-events", "none");
var overlay = group.selectAll(".overlay")
.attr("cursor", cursors[type]);
if (exports.event.touches) {
group
.on("touchmove.brush", moved, true)
.on("touchend.brush touchcancel.brush", ended, true);
} else {
var view = select(exports.event.view)
.on("keydown.brush", keydowned, true)
.on("keyup.brush", keyupped, true)
.on("mousemove.brush", moved, true)
.on("mouseup.brush", ended, true);
dragDisable(exports.event.view);
}
nopropagation$2();
interrupt(that);
redraw.call(that);
emit.start();
function moved() {
var point1 = mouse(that);
if (shifting && !lockX && !lockY) {
if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
else lockX = true;
}
point = point1;
moving = true;
noevent$2();
move();
}
function move() {
var t;
dx = point[0] - point0[0];
dy = point[1] - point0[1];
switch (mode) {
case MODE_SPACE:
case MODE_DRAG: {
if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
break;
}
case MODE_HANDLE: {
if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
break;
}
case MODE_CENTER: {
if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
break;
}
}
if (e1 < w1) {
signX *= -1;
t = w0, w0 = e0, e0 = t;
t = w1, w1 = e1, e1 = t;
if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
}
if (s1 < n1) {
signY *= -1;
t = n0, n0 = s0, s0 = t;
t = n1, n1 = s1, s1 = t;
if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
}
selection = state.selection; // May be set by brush.move!
if (lockX) w1 = selection[0][0], e1 = selection[1][0];
if (lockY) n1 = selection[0][1], s1 = selection[1][1];
if (selection[0][0] !== w1
|| selection[0][1] !== n1
|| selection[1][0] !== e1
|| selection[1][1] !== s1) {
state.selection = [[w1, n1], [e1, s1]];
redraw.call(that);
emit.brush();
}
}
function ended() {
nopropagation$2();
if (exports.event.touches) {
if (exports.event.touches.length) return;
if (touchending) clearTimeout(touchending);
touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
group.on("touchmove.brush touchend.brush touchcancel.brush", null);
} else {
dragEnable(exports.event.view, moving);
view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
}
group.attr("pointer-events", "all");
overlay.attr("cursor", cursors.overlay);
if (empty$1(selection)) state.selection = null, redraw.call(that);
emit.end();
}
function keydowned() {
switch (exports.event.keyCode) {
case 16: { // SHIFT
shifting = signX && signY;
break;
}
case 18: { // ALT
if (mode === MODE_HANDLE) {
if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
mode = MODE_CENTER;
move();
}
break;
}
case 32: { // SPACE; takes priority over ALT
if (mode === MODE_HANDLE || mode === MODE_CENTER) {
if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
mode = MODE_SPACE;
overlay.attr("cursor", cursors.selection);
move();
}
break;
}
default: return;
}
noevent$2();
}
function keyupped() {
switch (exports.event.keyCode) {
case 16: { // SHIFT
if (shifting) {
lockX = lockY = shifting = false;
move();
}
break;
}
case 18: { // ALT
if (mode === MODE_CENTER) {
if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
mode = MODE_HANDLE;
move();
}
break;
}
case 32: { // SPACE
if (mode === MODE_SPACE) {
if (exports.event.altKey) {
if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
mode = MODE_CENTER;
} else {
if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
mode = MODE_HANDLE;
}
overlay.attr("cursor", cursors[type]);
move();
}
break;
}
default: return;
}
noevent$2();
}
}
function initialize() {
var state = this.__brush || {selection: null};
state.extent = extent.apply(this, arguments);
state.dim = dim;
return state;
}
brush.extent = function(_) {
return arguments.length ? (extent = typeof _ === "function" ? _ : constant$10([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
};
brush.filter = function(_) {
return arguments.length ? (filter = typeof _ === "function" ? _ : constant$10(!!_), brush) : filter;
};
brush.handleSize = function(_) {
return arguments.length ? (handleSize = +_, brush) : handleSize;
};
brush.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? brush : value;
};
return brush;
}
// Adds floating point numbers with twice the normal precision.
// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
// 305–363 (1997).
// Code adapted from GeographicLib by Charles F. F. Karney,
// http://geographiclib.sourceforge.net/
function adder() {
return new Adder;
}
function Adder() {
this.reset();
}
Adder.prototype = {
constructor: Adder,
reset: function() {
this.s = // rounded value
this.t = 0; // exact error
},
add: function(y) {
add$1(temp, y, this.t);
add$1(this, temp.s, this.s);
if (this.s) this.t += temp.t;
else this.s = temp.t;
},
valueOf: function() {
return this.s;
}
};
var temp = new Adder;
function add$1(adder, a, b) {
var x = adder.s = a + b,
bv = x - a,
av = x - bv;
adder.t = (a - av) + (b - bv);
}
var epsilon$4 = 1e-6;
var epsilon2$2 = 1e-12;
var pi$3 = Math.PI;
var halfPi$2 = pi$3 / 2;
var quarterPi = pi$3 / 4;
var tau$3 = pi$3 * 2;
var degrees$1 = 180 / pi$3;
var radians = pi$3 / 180;
var abs = Math.abs;
var atan = Math.atan;
var atan2 = Math.atan2;
var cos = Math.cos;
var ceil = Math.ceil;
var exp = Math.exp;
var log$1 = Math.log;
var pow$1 = Math.pow;
var sin = Math.sin;
var sign$1 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
var sqrt$1 = Math.sqrt;
var tan = Math.tan;
function acos(x) {
return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
}
function asin$1(x) {
return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
}
function haversin(x) {
return (x = sin(x / 2)) * x;
}
function noop$2() {}
function streamGeometry(geometry, stream) {
if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
streamGeometryType[geometry.type](geometry, stream);
}
}
var streamObjectType = {
Feature: function(feature, stream) {
streamGeometry(feature.geometry, stream);
},
FeatureCollection: function(object, stream) {
var features = object.features, i = -1, n = features.length;
while (++i < n) streamGeometry(features[i].geometry, stream);
}
};
var streamGeometryType = {
Sphere: function(object, stream) {
stream.sphere();
},
Point: function(object, stream) {
object = object.coordinates;
stream.point(object[0], object[1], object[2]);
},
MultiPoint: function(object, stream) {
var coordinates = object.coordinates, i = -1, n = coordinates.length;
while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
},
LineString: function(object, stream) {
streamLine(object.coordinates, stream, 0);
},
MultiLineString: function(object, stream) {
var coordinates = object.coordinates, i = -1, n = coordinates.length;
while (++i < n) streamLine(coordinates[i], stream, 0);
},
Polygon: function(object, stream) {
streamPolygon(object.coordinates, stream);
},
MultiPolygon: function(object, stream) {
var coordinates = object.coordinates, i = -1, n = coordinates.length;
while (++i < n) streamPolygon(coordinates[i], stream);
},
GeometryCollection: function(object, stream) {
var geometries = object.geometries, i = -1, n = geometries.length;
while (++i < n) streamGeometry(geometries[i], stream);
}
};
function streamLine(coordinates, stream, closed) {
var i = -1, n = coordinates.length - closed, coordinate;
stream.lineStart();
while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
stream.lineEnd();
}
function streamPolygon(coordinates, stream) {
var i = -1, n = coordinates.length;
stream.polygonStart();
while (++i < n) streamLine(coordinates[i], stream, 1);
stream.polygonEnd();
}
function geoStream(object, stream) {
if (object && streamObjectType.hasOwnProperty(object.type)) {
streamObjectType[object.type](object, stream);
} else {
streamGeometry(object, stream);
}
}
var areaRingSum = adder();
var areaSum = adder();
var lambda00;
var phi00;
var lambda0;
var cosPhi0;
var sinPhi0;
var areaStream = {
point: noop$2,
lineStart: noop$2,
lineEnd: noop$2,
polygonStart: function() {
areaRingSum.reset();
areaStream.lineStart = areaRingStart;
areaStream.lineEnd = areaRingEnd;
},
polygonEnd: function() {
var areaRing = +areaRingSum;
areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
this.lineStart = this.lineEnd = this.point = noop$2;
},
sphere: function() {
areaSum.add(tau$3);
}
};
function areaRingStart() {
areaStream.point = areaPointFirst;
}
function areaRingEnd() {
areaPoint(lambda00, phi00);
}
function areaPointFirst(lambda, phi) {
areaStream.point = areaPoint;
lambda00 = lambda, phi00 = phi;
lambda *= radians, phi *= radians;
lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);
}
function areaPoint(lambda, phi) {
lambda *= radians, phi *= radians;
phi = phi / 2 + quarterPi; // half the angular distance from south pole
// Spherical excess E for a spherical triangle with vertices: south pole,
// previous point, current point. Uses a formula derived from Cagnoli’s
// theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
var dLambda = lambda - lambda0,
sdLambda = dLambda >= 0 ? 1 : -1,
adLambda = sdLambda * dLambda,
cosPhi = cos(phi),
sinPhi = sin(phi),
k = sinPhi0 * sinPhi,
u = cosPhi0 * cosPhi + k * cos(adLambda),
v = k * sdLambda * sin(adLambda);
areaRingSum.add(atan2(v, u));
// Advance the previous points.
lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
}
function area$2(object) {
areaSum.reset();
geoStream(object, areaStream);
return areaSum * 2;
}
function spherical(cartesian) {
return [atan2(cartesian[1], cartesian[0]), asin$1(cartesian[2])];
}
function cartesian(spherical) {
var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);
return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];
}
function cartesianDot(a, b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
function cartesianCross(a, b) {
return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
}
// TODO return a
function cartesianAddInPlace(a, b) {
a[0] += b[0], a[1] += b[1], a[2] += b[2];
}
function cartesianScale(vector, k) {
return [vector[0] * k, vector[1] * k, vector[2] * k];
}
// TODO return d
function cartesianNormalizeInPlace(d) {
var l = sqrt$1(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
d[0] /= l, d[1] /= l, d[2] /= l;
}
var lambda0$1;
var phi0;
var lambda1;
var phi1;
var lambda2;
var lambda00$1;
var phi00$1;
var p0;
var deltaSum = adder();
var ranges;
var range$1;
var boundsStream = {
point: boundsPoint,
lineStart: boundsLineStart,
lineEnd: boundsLineEnd,
polygonStart: function() {
boundsStream.point = boundsRingPoint;
boundsStream.lineStart = boundsRingStart;
boundsStream.lineEnd = boundsRingEnd;
deltaSum.reset();
areaStream.polygonStart();
},
polygonEnd: function() {
areaStream.polygonEnd();
boundsStream.point = boundsPoint;
boundsStream.lineStart = boundsLineStart;
boundsStream.lineEnd = boundsLineEnd;
if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
else if (deltaSum > epsilon$4) phi1 = 90;
else if (deltaSum < -epsilon$4) phi0 = -90;
range$1[0] = lambda0$1, range$1[1] = lambda1;
}
};
function boundsPoint(lambda, phi) {
ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
if (phi < phi0) phi0 = phi;
if (phi > phi1) phi1 = phi;
}
function linePoint(lambda, phi) {
var p = cartesian([lambda * radians, phi * radians]);
if (p0) {
var normal = cartesianCross(p0, p),
equatorial = [normal[1], -normal[0], 0],
inflection = cartesianCross(equatorial, normal);
cartesianNormalizeInPlace(inflection);
inflection = spherical(inflection);
var delta = lambda - lambda2,
sign = delta > 0 ? 1 : -1,
lambdai = inflection[0] * degrees$1 * sign,
phii,
antimeridian = abs(delta) > 180;
if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
phii = inflection[1] * degrees$1;
if (phii > phi1) phi1 = phii;
} else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
phii = -inflection[1] * degrees$1;
if (phii < phi0) phi0 = phii;
} else {
if (phi < phi0) phi0 = phi;
if (phi > phi1) phi1 = phi;
}
if (antimeridian) {
if (lambda < lambda2) {
if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
} else {
if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
}
} else {
if (lambda1 >= lambda0$1) {
if (lambda < lambda0$1) lambda0$1 = lambda;
if (lambda > lambda1) lambda1 = lambda;
} else {
if (lambda > lambda2) {
if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
} else {
if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
}
}
}
} else {
boundsPoint(lambda, phi);
}
p0 = p, lambda2 = lambda;
}
function boundsLineStart() {
boundsStream.point = linePoint;
}
function boundsLineEnd() {
range$1[0] = lambda0$1, range$1[1] = lambda1;
boundsStream.point = boundsPoint;
p0 = null;
}
function boundsRingPoint(lambda, phi) {
if (p0) {
var delta = lambda - lambda2;
deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
} else {
lambda00$1 = lambda, phi00$1 = phi;
}
areaStream.point(lambda, phi);
linePoint(lambda, phi);
}
function boundsRingStart() {
areaStream.lineStart();
}
function boundsRingEnd() {
boundsRingPoint(lambda00$1, phi00$1);
areaStream.lineEnd();
if (abs(deltaSum) > epsilon$4) lambda0$1 = -(lambda1 = 180);
range$1[0] = lambda0$1, range$1[1] = lambda1;
p0 = null;
}
// Finds the left-right distance between two longitudes.
// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
// the distance between ±180° to be 360°.
function angle(lambda0, lambda1) {
return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
}
function rangeCompare(a, b) {
return a[0] - b[0];
}
function rangeContains(range, x) {
return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
}
function bounds(feature) {
var i, n, a, b, merged, deltaMax, delta;
phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
ranges = [];
geoStream(feature, boundsStream);
// First, sort ranges by their minimum longitudes.
if (n = ranges.length) {
ranges.sort(rangeCompare);
// Then, merge any ranges that overlap.
for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
b = ranges[i];
if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
} else {
merged.push(a = b);
}
}
// Finally, find the largest gap between the merged ranges.
// The final bounding box will be the inverse of this gap.
for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
b = merged[i];
if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
}
}
ranges = range$1 = null;
return lambda0$1 === Infinity || phi0 === Infinity
? [[NaN, NaN], [NaN, NaN]]
: [[lambda0$1, phi0], [lambda1, phi1]];
}
var W0;
var W1;
var X0;
var Y0;
var Z0;
var X1;
var Y1;
var Z1;
var X2;
var Y2;
var Z2;
var lambda00$2;
var phi00$2;
var x0;
var y0;
var z0;
// previous point
var centroidStream = {
sphere: noop$2,
point: centroidPoint,
lineStart: centroidLineStart,
lineEnd: centroidLineEnd,
polygonStart: function() {
centroidStream.lineStart = centroidRingStart;
centroidStream.lineEnd = centroidRingEnd;
},
polygonEnd: function() {
centroidStream.lineStart = centroidLineStart;
centroidStream.lineEnd = centroidLineEnd;
}
};
// Arithmetic mean of Cartesian vectors.
function centroidPoint(lambda, phi) {
lambda *= radians, phi *= radians;
var cosPhi = cos(phi);
centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi));
}
function centroidPointCartesian(x, y, z) {
++W0;
X0 += (x - X0) / W0;
Y0 += (y - Y0) / W0;
Z0 += (z - Z0) / W0;
}
function centroidLineStart() {
centroidStream.point = centroidLinePointFirst;
}
function centroidLinePointFirst(lambda, phi) {
lambda *= radians, phi *= radians;
var cosPhi = cos(phi);
x0 = cosPhi * cos(lambda);
y0 = cosPhi * sin(lambda);
z0 = sin(phi);
centroidStream.point = centroidLinePoint;
centroidPointCartesian(x0, y0, z0);
}
function centroidLinePoint(lambda, phi) {
lambda *= radians, phi *= radians;
var cosPhi = cos(phi),
x = cosPhi * cos(lambda),
y = cosPhi * sin(lambda),
z = sin(phi),
w = atan2(sqrt$1((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
W1 += w;
X1 += w * (x0 + (x0 = x));
Y1 += w * (y0 + (y0 = y));
Z1 += w * (z0 + (z0 = z));
centroidPointCartesian(x0, y0, z0);
}
function centroidLineEnd() {
centroidStream.point = centroidPoint;
}
// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
// J. Applied Mechanics 42, 239 (1975).
function centroidRingStart() {
centroidStream.point = centroidRingPointFirst;
}
function centroidRingEnd() {
centroidRingPoint(lambda00$2, phi00$2);
centroidStream.point = centroidPoint;
}
function centroidRingPointFirst(lambda, phi) {
lambda00$2 = lambda, phi00$2 = phi;
lambda *= radians, phi *= radians;
centroidStream.point = centroidRingPoint;
var cosPhi = cos(phi);
x0 = cosPhi * cos(lambda);
y0 = cosPhi * sin(lambda);
z0 = sin(phi);
centroidPointCartesian(x0, y0, z0);
}
function centroidRingPoint(lambda, phi) {
lambda *= radians, phi *= radians;
var cosPhi = cos(phi),
x = cosPhi * cos(lambda),
y = cosPhi * sin(lambda),
z = sin(phi),
cx = y0 * z - z0 * y,
cy = z0 * x - x0 * z,
cz = x0 * y - y0 * x,
m = sqrt$1(cx * cx + cy * cy + cz * cz),
u = x0 * x + y0 * y + z0 * z,
v = m && -acos(u) / m, // area weight
w = atan2(m, u); // line weight
X2 += v * cx;
Y2 += v * cy;
Z2 += v * cz;
W1 += w;
X1 += w * (x0 + (x0 = x));
Y1 += w * (y0 + (y0 = y));
Z1 += w * (z0 + (z0 = z));
centroidPointCartesian(x0, y0, z0);
}
function centroid$1(object) {
W0 = W1 =
X0 = Y0 = Z0 =
X1 = Y1 = Z1 =
X2 = Y2 = Z2 = 0;
geoStream(object, centroidStream);
var x = X2,
y = Y2,
z = Z2,
m = x * x + y * y + z * z;
// If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
if (m < epsilon2$2) {
x = X1, y = Y1, z = Z1;
// If the feature has zero length, fall back to arithmetic mean of point vectors.
if (W1 < epsilon$4) x = X0, y = Y0, z = Z0;
m = x * x + y * y + z * z;
// If the feature still has an undefined ccentroid, then return.
if (m < epsilon2$2) return [NaN, NaN];
}
return [atan2(y, x) * degrees$1, asin$1(z / sqrt$1(m)) * degrees$1];
}
function constant$11(x) {
return function() {
return x;
};
}
function compose(a, b) {
function compose(x, y) {
return x = a(x, y), b(x[0], x[1]);
}
if (a.invert && b.invert) compose.invert = function(x, y) {
return x = b.invert(x, y), x && a.invert(x[0], x[1]);
};
return compose;
}
function rotationIdentity(lambda, phi) {
return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
}
rotationIdentity.invert = rotationIdentity;
function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
: rotationLambda(deltaLambda))
: (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
: rotationIdentity);
}
function forwardRotationLambda(deltaLambda) {
return function(lambda, phi) {
return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
};
}
function rotationLambda(deltaLambda) {
var rotation = forwardRotationLambda(deltaLambda);
rotation.invert = forwardRotationLambda(-deltaLambda);
return rotation;
}
function rotationPhiGamma(deltaPhi, deltaGamma) {
var cosDeltaPhi = cos(deltaPhi),
sinDeltaPhi = sin(deltaPhi),
cosDeltaGamma = cos(deltaGamma),
sinDeltaGamma = sin(deltaGamma);
function rotation(lambda, phi) {
var cosPhi = cos(phi),
x = cos(lambda) * cosPhi,
y = sin(lambda) * cosPhi,
z = sin(phi),
k = z * cosDeltaPhi + x * sinDeltaPhi;
return [
atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
asin$1(k * cosDeltaGamma + y * sinDeltaGamma)
];
}
rotation.invert = function(lambda, phi) {
var cosPhi = cos(phi),
x = cos(lambda) * cosPhi,
y = sin(lambda) * cosPhi,
z = sin(phi),
k = z * cosDeltaGamma - y * sinDeltaGamma;
return [
atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
asin$1(k * cosDeltaPhi - x * sinDeltaPhi)
];
};
return rotation;
}
function rotation(rotate) {
rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
function forward(coordinates) {
coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
}
forward.invert = function(coordinates) {
coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
};
return forward;
}
// Generates a circle centered at [0°, 0°], with a given radius and precision.
function circleStream(stream, radius, delta, direction, t0, t1) {
if (!delta) return;
var cosRadius = cos(radius),
sinRadius = sin(radius),
step = direction * delta;
if (t0 == null) {
t0 = radius + direction * tau$3;
t1 = radius - step / 2;
} else {
t0 = circleRadius(cosRadius, t0);
t1 = circleRadius(cosRadius, t1);
if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
}
for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);
stream.point(point[0], point[1]);
}
}
// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
function circleRadius(cosRadius, point) {
point = cartesian(point), point[0] -= cosRadius;
cartesianNormalizeInPlace(point);
var radius = acos(-point[1]);
return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$4) % tau$3;
}
function circle$1() {
var center = constant$11([0, 0]),
radius = constant$11(90),
precision = constant$11(6),
ring,
rotate,
stream = {point: point};
function point(x, y) {
ring.push(x = rotate(x, y));
x[0] *= degrees$1, x[1] *= degrees$1;
}
function circle() {
var c = center.apply(this, arguments),
r = radius.apply(this, arguments) * radians,
p = precision.apply(this, arguments) * radians;
ring = [];
rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
circleStream(stream, r, p, 1);
c = {type: "Polygon", coordinates: [ring]};
ring = rotate = null;
return c;
}
circle.center = function(_) {
return arguments.length ? (center = typeof _ === "function" ? _ : constant$11([+_[0], +_[1]]), circle) : center;
};
circle.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant$11(+_), circle) : radius;
};
circle.precision = function(_) {
return arguments.length ? (precision = typeof _ === "function" ? _ : constant$11(+_), circle) : precision;
};
return circle;
}
function clipBuffer() {
var lines = [],
line;
return {
point: function(x, y) {
line.push([x, y]);
},
lineStart: function() {
lines.push(line = []);
},
lineEnd: noop$2,
rejoin: function() {
if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
},
result: function() {
var result = lines;
lines = [];
line = null;
return result;
}
};
}
function clipLine(a, b, x0, y0, x1, y1) {
var ax = a[0],
ay = a[1],
bx = b[0],
by = b[1],
t0 = 0,
t1 = 1,
dx = bx - ax,
dy = by - ay,
r;
r = x0 - ax;
if (!dx && r > 0) return;
r /= dx;
if (dx < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dx > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = x1 - ax;
if (!dx && r < 0) return;
r /= dx;
if (dx < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dx > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
r = y0 - ay;
if (!dy && r > 0) return;
r /= dy;
if (dy < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dy > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = y1 - ay;
if (!dy && r < 0) return;
r /= dy;
if (dy < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dy > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
return true;
}
function pointEqual(a, b) {
return abs(a[0] - b[0]) < epsilon$4 && abs(a[1] - b[1]) < epsilon$4;
}
function Intersection(point, points, other, entry) {
this.x = point;
this.z = points;
this.o = other; // another intersection
this.e = entry; // is an entry?
this.v = false; // visited
this.n = this.p = null; // next & previous
}
// A generalized polygon clipping algorithm: given a polygon that has been cut
// into its visible line segments, and rejoins the segments by interpolating
// along the clip edge.
function clipPolygon(segments, compareIntersection, startInside, interpolate, stream) {
var subject = [],
clip = [],
i,
n;
segments.forEach(function(segment) {
if ((n = segment.length - 1) <= 0) return;
var n, p0 = segment[0], p1 = segment[n], x;
// If the first and last points of a segment are coincident, then treat as a
// closed ring. TODO if all rings are closed, then the winding order of the
// exterior ring should be checked.
if (pointEqual(p0, p1)) {
stream.lineStart();
for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
stream.lineEnd();
return;
}
subject.push(x = new Intersection(p0, segment, null, true));
clip.push(x.o = new Intersection(p0, null, x, false));
subject.push(x = new Intersection(p1, segment, null, false));
clip.push(x.o = new Intersection(p1, null, x, true));
});
if (!subject.length) return;
clip.sort(compareIntersection);
link$1(subject);
link$1(clip);
for (i = 0, n = clip.length; i < n; ++i) {
clip[i].e = startInside = !startInside;
}
var start = subject[0],
points,
point;
while (1) {
// Find first unvisited intersection.
var current = start,
isSubject = true;
while (current.v) if ((current = current.n) === start) return;
points = current.z;
stream.lineStart();
do {
current.v = current.o.v = true;
if (current.e) {
if (isSubject) {
for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
} else {
interpolate(current.x, current.n.x, 1, stream);
}
current = current.n;
} else {
if (isSubject) {
points = current.p.z;
for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
} else {
interpolate(current.x, current.p.x, -1, stream);
}
current = current.p;
}
current = current.o;
points = current.z;
isSubject = !isSubject;
} while (!current.v);
stream.lineEnd();
}
}
function link$1(array) {
if (!(n = array.length)) return;
var n,
i = 0,
a = array[0],
b;
while (++i < n) {
a.n = b = array[i];
b.p = a;
a = b;
}
a.n = b = array[0];
b.p = a;
}
var clipMax = 1e9;
var clipMin = -clipMax;
// TODO Use d3-polygon’s polygonContains here for the ring check?
// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
function clipExtent(x0, y0, x1, y1) {
function visible(x, y) {
return x0 <= x && x <= x1 && y0 <= y && y <= y1;
}
function interpolate(from, to, direction, stream) {
var a = 0, a1 = 0;
if (from == null
|| (a = corner(from, direction)) !== (a1 = corner(to, direction))
|| comparePoint(from, to) < 0 ^ direction > 0) {
do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
while ((a = (a + direction + 4) % 4) !== a1);
} else {
stream.point(to[0], to[1]);
}
}
function corner(p, direction) {
return abs(p[0] - x0) < epsilon$4 ? direction > 0 ? 0 : 3
: abs(p[0] - x1) < epsilon$4 ? direction > 0 ? 2 : 1
: abs(p[1] - y0) < epsilon$4 ? direction > 0 ? 1 : 0
: direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
}
function compareIntersection(a, b) {
return comparePoint(a.x, b.x);
}
function comparePoint(a, b) {
var ca = corner(a, 1),
cb = corner(b, 1);
return ca !== cb ? ca - cb
: ca === 0 ? b[1] - a[1]
: ca === 1 ? a[0] - b[0]
: ca === 2 ? a[1] - b[1]
: b[0] - a[0];
}
return function(stream) {
var activeStream = stream,
bufferStream = clipBuffer(),
segments,
polygon,
ring,
x__, y__, v__, // first point
x_, y_, v_, // previous point
first,
clean;
var clipStream = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: polygonStart,
polygonEnd: polygonEnd
};
function point(x, y) {
if (visible(x, y)) activeStream.point(x, y);
}
function polygonInside() {
var winding = 0;
for (var i = 0, n = polygon.length; i < n; ++i) {
for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
}
}
return winding;
}
// Buffer geometry within a polygon and then clip it en masse.
function polygonStart() {
activeStream = bufferStream, segments = [], polygon = [], clean = true;
}
function polygonEnd() {
var startInside = polygonInside(),
cleanInside = clean && startInside,
visible = (segments = merge(segments)).length;
if (cleanInside || visible) {
stream.polygonStart();
if (cleanInside) {
stream.lineStart();
interpolate(null, null, 1, stream);
stream.lineEnd();
}
if (visible) {
clipPolygon(segments, compareIntersection, startInside, interpolate, stream);
}
stream.polygonEnd();
}
activeStream = stream, segments = polygon = ring = null;
}
function lineStart() {
clipStream.point = linePoint;
if (polygon) polygon.push(ring = []);
first = true;
v_ = false;
x_ = y_ = NaN;
}
// TODO rather than special-case polygons, simply handle them separately.
// Ideally, coincident intersection points should be jittered to avoid
// clipping issues.
function lineEnd() {
if (segments) {
linePoint(x__, y__);
if (v__ && v_) bufferStream.rejoin();
segments.push(bufferStream.result());
}
clipStream.point = point;
if (v_) activeStream.lineEnd();
}
function linePoint(x, y) {
var v = visible(x, y);
if (polygon) ring.push([x, y]);
if (first) {
x__ = x, y__ = y, v__ = v;
first = false;
if (v) {
activeStream.lineStart();
activeStream.point(x, y);
}
} else {
if (v && v_) activeStream.point(x, y);
else {
var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
if (clipLine(a, b, x0, y0, x1, y1)) {
if (!v_) {
activeStream.lineStart();
activeStream.point(a[0], a[1]);
}
activeStream.point(b[0], b[1]);
if (!v) activeStream.lineEnd();
clean = false;
} else if (v) {
activeStream.lineStart();
activeStream.point(x, y);
clean = false;
}
}
}
x_ = x, y_ = y, v_ = v;
}
return clipStream;
};
}
function extent$1() {
var x0 = 0,
y0 = 0,
x1 = 960,
y1 = 500,
cache,
cacheStream,
clip;
return clip = {
stream: function(stream) {
return cache && cacheStream === stream ? cache : cache = clipExtent(x0, y0, x1, y1)(cacheStream = stream);
},
extent: function(_) {
return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
}
};
}
var lengthSum = adder();
var lambda0$2;
var sinPhi0$1;
var cosPhi0$1;
var lengthStream = {
sphere: noop$2,
point: noop$2,
lineStart: lengthLineStart,
lineEnd: noop$2,
polygonStart: noop$2,
polygonEnd: noop$2
};
function lengthLineStart() {
lengthStream.point = lengthPointFirst;
lengthStream.lineEnd = lengthLineEnd;
}
function lengthLineEnd() {
lengthStream.point = lengthStream.lineEnd = noop$2;
}
function lengthPointFirst(lambda, phi) {
lambda *= radians, phi *= radians;
lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi);
lengthStream.point = lengthPoint;
}
function lengthPoint(lambda, phi) {
lambda *= radians, phi *= radians;
var sinPhi = sin(phi),
cosPhi = cos(phi),
delta = abs(lambda - lambda0$2),
cosDelta = cos(delta),
sinDelta = sin(delta),
x = cosPhi * sinDelta,
y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
lengthSum.add(atan2(sqrt$1(x * x + y * y), z));
lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
}
function length$2(object) {
lengthSum.reset();
geoStream(object, lengthStream);
return +lengthSum;
}
var coordinates = [null, null];
var object$1 = {type: "LineString", coordinates: coordinates};
function distance(a, b) {
coordinates[0] = a;
coordinates[1] = b;
return length$2(object$1);
}
function graticuleX(y0, y1, dy) {
var y = range(y0, y1 - epsilon$4, dy).concat(y1);
return function(x) { return y.map(function(y) { return [x, y]; }); };
}
function graticuleY(x0, x1, dx) {
var x = range(x0, x1 - epsilon$4, dx).concat(x1);
return function(y) { return x.map(function(x) { return [x, y]; }); };
}
function graticule() {
var x1, x0, X1, X0,
y1, y0, Y1, Y0,
dx = 10, dy = dx, DX = 90, DY = 360,
x, y, X, Y,
precision = 2.5;
function graticule() {
return {type: "MultiLineString", coordinates: lines()};
}
function lines() {
return range(ceil(X0 / DX) * DX, X1, DX).map(X)
.concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
.concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$4; }).map(x))
.concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$4; }).map(y));
}
graticule.lines = function() {
return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
};
graticule.outline = function() {
return {
type: "Polygon",
coordinates: [
X(X0).concat(
Y(Y1).slice(1),
X(X1).reverse().slice(1),
Y(Y0).reverse().slice(1))
]
};
};
graticule.extent = function(_) {
if (!arguments.length) return graticule.extentMinor();
return graticule.extentMajor(_).extentMinor(_);
};
graticule.extentMajor = function(_) {
if (!arguments.length) return [[X0, Y0], [X1, Y1]];
X0 = +_[0][0], X1 = +_[1][0];
Y0 = +_[0][1], Y1 = +_[1][1];
if (X0 > X1) _ = X0, X0 = X1, X1 = _;
if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
return graticule.precision(precision);
};
graticule.extentMinor = function(_) {
if (!arguments.length) return [[x0, y0], [x1, y1]];
x0 = +_[0][0], x1 = +_[1][0];
y0 = +_[0][1], y1 = +_[1][1];
if (x0 > x1) _ = x0, x0 = x1, x1 = _;
if (y0 > y1) _ = y0, y0 = y1, y1 = _;
return graticule.precision(precision);
};
graticule.step = function(_) {
if (!arguments.length) return graticule.stepMinor();
return graticule.stepMajor(_).stepMinor(_);
};
graticule.stepMajor = function(_) {
if (!arguments.length) return [DX, DY];
DX = +_[0], DY = +_[1];
return graticule;
};
graticule.stepMinor = function(_) {
if (!arguments.length) return [dx, dy];
dx = +_[0], dy = +_[1];
return graticule;
};
graticule.precision = function(_) {
if (!arguments.length) return precision;
precision = +_;
x = graticuleX(y0, y1, 90);
y = graticuleY(x0, x1, precision);
X = graticuleX(Y0, Y1, 90);
Y = graticuleY(X0, X1, precision);
return graticule;
};
return graticule
.extentMajor([[-180, -90 + epsilon$4], [180, 90 - epsilon$4]])
.extentMinor([[-180, -80 - epsilon$4], [180, 80 + epsilon$4]]);
}
function interpolate$2(a, b) {
var x0 = a[0] * radians,
y0 = a[1] * radians,
x1 = b[0] * radians,
y1 = b[1] * radians,
cy0 = cos(y0),
sy0 = sin(y0),
cy1 = cos(y1),
sy1 = sin(y1),
kx0 = cy0 * cos(x0),
ky0 = cy0 * sin(x0),
kx1 = cy1 * cos(x1),
ky1 = cy1 * sin(x1),
d = 2 * asin$1(sqrt$1(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
k = sin(d);
var interpolate = d ? function(t) {
var B = sin(t *= d) / k,
A = sin(d - t) / k,
x = A * kx0 + B * kx1,
y = A * ky0 + B * ky1,
z = A * sy0 + B * sy1;
return [
atan2(y, x) * degrees$1,
atan2(z, sqrt$1(x * x + y * y)) * degrees$1
];
} : function() {
return [x0 * degrees$1, y0 * degrees$1];
};
interpolate.distance = d;
return interpolate;
}
function identity$7(x) {
return x;
}
var areaSum$1 = adder();
var areaRingSum$1 = adder();
var x00;
var y00;
var x0$1;
var y0$1;
var areaStream$1 = {
point: noop$2,
lineStart: noop$2,
lineEnd: noop$2,
polygonStart: function() {
areaStream$1.lineStart = areaRingStart$1;
areaStream$1.lineEnd = areaRingEnd$1;
},
polygonEnd: function() {
areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2;
areaSum$1.add(abs(areaRingSum$1));
areaRingSum$1.reset();
},
result: function() {
var area = areaSum$1 / 2;
areaSum$1.reset();
return area;
}
};
function areaRingStart$1() {
areaStream$1.point = areaPointFirst$1;
}
function areaPointFirst$1(x, y) {
areaStream$1.point = areaPoint$1;
x00 = x0$1 = x, y00 = y0$1 = y;
}
function areaPoint$1(x, y) {
areaRingSum$1.add(y0$1 * x - x0$1 * y);
x0$1 = x, y0$1 = y;
}
function areaRingEnd$1() {
areaPoint$1(x00, y00);
}
var x0$2 = Infinity;
var y0$2 = x0$2;
var x1 = -x0$2;
var y1 = x1;
var boundsStream$1 = {
point: boundsPoint$1,
lineStart: noop$2,
lineEnd: noop$2,
polygonStart: noop$2,
polygonEnd: noop$2,
result: function() {
var bounds = [[x0$2, y0$2], [x1, y1]];
x1 = y1 = -(y0$2 = x0$2 = Infinity);
return bounds;
}
};
function boundsPoint$1(x, y) {
if (x < x0$2) x0$2 = x;
if (x > x1) x1 = x;
if (y < y0$2) y0$2 = y;
if (y > y1) y1 = y;
}
var X0$1 = 0;
var Y0$1 = 0;
var Z0$1 = 0;
var X1$1 = 0;
var Y1$1 = 0;
var Z1$1 = 0;
var X2$1 = 0;
var Y2$1 = 0;
var Z2$1 = 0;
var x00$1;
var y00$1;
var x0$3;
var y0$3;
var centroidStream$1 = {
point: centroidPoint$1,
lineStart: centroidLineStart$1,
lineEnd: centroidLineEnd$1,
polygonStart: function() {
centroidStream$1.lineStart = centroidRingStart$1;
centroidStream$1.lineEnd = centroidRingEnd$1;
},
polygonEnd: function() {
centroidStream$1.point = centroidPoint$1;
centroidStream$1.lineStart = centroidLineStart$1;
centroidStream$1.lineEnd = centroidLineEnd$1;
},
result: function() {
var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
: Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
: Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
: [NaN, NaN];
X0$1 = Y0$1 = Z0$1 =
X1$1 = Y1$1 = Z1$1 =
X2$1 = Y2$1 = Z2$1 = 0;
return centroid;
}
};
function centroidPoint$1(x, y) {
X0$1 += x;
Y0$1 += y;
++Z0$1;
}
function centroidLineStart$1() {
centroidStream$1.point = centroidPointFirstLine;
}
function centroidPointFirstLine(x, y) {
centroidStream$1.point = centroidPointLine;
centroidPoint$1(x0$3 = x, y0$3 = y);
}
function centroidPointLine(x, y) {
var dx = x - x0$3, dy = y - y0$3, z = sqrt$1(dx * dx + dy * dy);
X1$1 += z * (x0$3 + x) / 2;
Y1$1 += z * (y0$3 + y) / 2;
Z1$1 += z;
centroidPoint$1(x0$3 = x, y0$3 = y);
}
function centroidLineEnd$1() {
centroidStream$1.point = centroidPoint$1;
}
function centroidRingStart$1() {
centroidStream$1.point = centroidPointFirstRing;
}
function centroidRingEnd$1() {
centroidPointRing(x00$1, y00$1);
}
function centroidPointFirstRing(x, y) {
centroidStream$1.point = centroidPointRing;
centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
}
function centroidPointRing(x, y) {
var dx = x - x0$3,
dy = y - y0$3,
z = sqrt$1(dx * dx + dy * dy);
X1$1 += z * (x0$3 + x) / 2;
Y1$1 += z * (y0$3 + y) / 2;
Z1$1 += z;
z = y0$3 * x - x0$3 * y;
X2$1 += z * (x0$3 + x);
Y2$1 += z * (y0$3 + y);
Z2$1 += z * 3;
centroidPoint$1(x0$3 = x, y0$3 = y);
}
function PathContext(context) {
var pointRadius = 4.5;
var stream = {
point: point,
// While inside a line, override point to moveTo then lineTo.
lineStart: function() { stream.point = pointLineStart; },
lineEnd: lineEnd,
// While inside a polygon, override lineEnd to closePath.
polygonStart: function() { stream.lineEnd = lineEndPolygon; },
polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; },
pointRadius: function(_) {
pointRadius = _;
return stream;
},
result: noop$2
};
function point(x, y) {
context.moveTo(x + pointRadius, y);
context.arc(x, y, pointRadius, 0, tau$3);
}
function pointLineStart(x, y) {
context.moveTo(x, y);
stream.point = pointLine;
}
function pointLine(x, y) {
context.lineTo(x, y);
}
function lineEnd() {
stream.point = point;
}
function lineEndPolygon() {
context.closePath();
}
return stream;
}
function PathString() {
var pointCircle = circle$2(4.5),
string = [];
var stream = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: function() {
stream.lineEnd = lineEndPolygon;
},
polygonEnd: function() {
stream.lineEnd = lineEnd;
stream.point = point;
},
pointRadius: function(_) {
pointCircle = circle$2(_);
return stream;
},
result: function() {
if (string.length) {
var result = string.join("");
string = [];
return result;
}
}
};
function point(x, y) {
string.push("M", x, ",", y, pointCircle);
}
function pointLineStart(x, y) {
string.push("M", x, ",", y);
stream.point = pointLine;
}
function pointLine(x, y) {
string.push("L", x, ",", y);
}
function lineStart() {
stream.point = pointLineStart;
}
function lineEnd() {
stream.point = point;
}
function lineEndPolygon() {
string.push("Z");
}
return stream;
}
function circle$2(radius) {
return "m0," + radius
+ "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
+ "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
+ "z";
}
function index$3() {
var pointRadius = 4.5,
projection,
projectionStream,
context,
contextStream;
function path(object) {
if (object) {
if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
geoStream(object, projectionStream(contextStream));
}
return contextStream.result();
}
path.area = function(object) {
geoStream(object, projectionStream(areaStream$1));
return areaStream$1.result();
};
path.bounds = function(object) {
geoStream(object, projectionStream(boundsStream$1));
return boundsStream$1.result();
};
path.centroid = function(object) {
geoStream(object, projectionStream(centroidStream$1));
return centroidStream$1.result();
};
path.projection = function(_) {
return arguments.length ? (projectionStream = (projection = _) == null ? identity$7 : _.stream, path) : projection;
};
path.context = function(_) {
if (!arguments.length) return context;
contextStream = (context = _) == null ? new PathString : new PathContext(_);
if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
return path;
};
path.pointRadius = function(_) {
if (!arguments.length) return pointRadius;
pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
return path;
};
return path.projection(null).context(null);
}
var sum$2 = adder();
function polygonContains(polygon, point) {
var lambda = point[0],
phi = point[1],
normal = [sin(lambda), -cos(lambda), 0],
angle = 0,
winding = 0;
sum$2.reset();
for (var i = 0, n = polygon.length; i < n; ++i) {
if (!(m = (ring = polygon[i]).length)) continue;
var ring,
m,
point0 = ring[m - 1],
lambda0 = point0[0],
phi0 = point0[1] / 2 + quarterPi,
sinPhi0 = sin(phi0),
cosPhi0 = cos(phi0);
for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
var point1 = ring[j],
lambda1 = point1[0],
phi1 = point1[1] / 2 + quarterPi,
sinPhi1 = sin(phi1),
cosPhi1 = cos(phi1),
delta = lambda1 - lambda0,
sign = delta >= 0 ? 1 : -1,
absDelta = sign * delta,
antimeridian = absDelta > pi$3,
k = sinPhi0 * sinPhi1;
sum$2.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));
angle += antimeridian ? delta + sign * tau$3 : delta;
// Are the longitudes either side of the point’s meridian (lambda),
// and are the latitudes smaller than the parallel (phi)?
if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
var arc = cartesianCross(cartesian(point0), cartesian(point1));
cartesianNormalizeInPlace(arc);
var intersection = cartesianCross(normal, arc);
cartesianNormalizeInPlace(intersection);
var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection[2]);
if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
winding += antimeridian ^ delta >= 0 ? 1 : -1;
}
}
}
}
// First, determine whether the South pole is inside or outside:
//
// It is inside if:
// * the polygon winds around it in a clockwise direction.
// * the polygon does not (cumulatively) wind around it, but has a negative
// (counter-clockwise) area.
//
// Second, count the (signed) number of times a segment crosses a lambda
// from the point to the South pole. If it is zero, then the point is the
// same side as the South pole.
return (angle < -epsilon$4 || angle < epsilon$4 && sum$2 < -epsilon$4) ^ (winding & 1);
}
function clip(pointVisible, clipLine, interpolate, start) {
return function(rotate, sink) {
var line = clipLine(sink),
rotatedStart = rotate.invert(start[0], start[1]),
ringBuffer = clipBuffer(),
ringSink = clipLine(ringBuffer),
polygonStarted = false,
polygon,
segments,
ring;
var clip = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: function() {
clip.point = pointRing;
clip.lineStart = ringStart;
clip.lineEnd = ringEnd;
segments = [];
polygon = [];
},
polygonEnd: function() {
clip.point = point;
clip.lineStart = lineStart;
clip.lineEnd = lineEnd;
segments = merge(segments);
var startInside = polygonContains(polygon, rotatedStart);
if (segments.length) {
if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
clipPolygon(segments, compareIntersection, startInside, interpolate, sink);
} else if (startInside) {
if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
sink.lineStart();
interpolate(null, null, 1, sink);
sink.lineEnd();
}
if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
segments = polygon = null;
},
sphere: function() {
sink.polygonStart();
sink.lineStart();
interpolate(null, null, 1, sink);
sink.lineEnd();
sink.polygonEnd();
}
};
function point(lambda, phi) {
var point = rotate(lambda, phi);
if (pointVisible(lambda = point[0], phi = point[1])) sink.point(lambda, phi);
}
function pointLine(lambda, phi) {
var point = rotate(lambda, phi);
line.point(point[0], point[1]);
}
function lineStart() {
clip.point = pointLine;
line.lineStart();
}
function lineEnd() {
clip.point = point;
line.lineEnd();
}
function pointRing(lambda, phi) {
ring.push([lambda, phi]);
var point = rotate(lambda, phi);
ringSink.point(point[0], point[1]);
}
function ringStart() {
ringSink.lineStart();
ring = [];
}
function ringEnd() {
pointRing(ring[0][0], ring[0][1]);
ringSink.lineEnd();
var clean = ringSink.clean(),
ringSegments = ringBuffer.result(),
i, n = ringSegments.length, m,
segment,
point;
ring.pop();
polygon.push(ring);
ring = null;
if (!n) return;
// No intersections.
if (clean & 1) {
segment = ringSegments[0];
if ((m = segment.length - 1) > 0) {
if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
sink.lineStart();
for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
sink.lineEnd();
}
return;
}
// Rejoin connected segments.
// TODO reuse ringBuffer.rejoin()?
if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
segments.push(ringSegments.filter(validSegment));
}
return clip;
};
}
function validSegment(segment) {
return segment.length > 1;
}
// Intersections are sorted along the clip edge. For both antimeridian cutting
// and circle clipping, the same comparison is used.
function compareIntersection(a, b) {
return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$4 : halfPi$2 - a[1])
- ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$4 : halfPi$2 - b[1]);
}
var clipAntimeridian = clip(
function() { return true; },
clipAntimeridianLine,
clipAntimeridianInterpolate,
[-pi$3, -halfPi$2]
);
// Takes a line and cuts into visible segments. Return values: 0 - there were
// intersections or the line was empty; 1 - no intersections; 2 - there were
// intersections, and the first and last segments should be rejoined.
function clipAntimeridianLine(stream) {
var lambda0 = NaN,
phi0 = NaN,
sign0 = NaN,
clean; // no intersections
return {
lineStart: function() {
stream.lineStart();
clean = 1;
},
point: function(lambda1, phi1) {
var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
delta = abs(lambda1 - lambda0);
if (abs(delta - pi$3) < epsilon$4) { // line crosses a pole
stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
stream.point(sign0, phi0);
stream.lineEnd();
stream.lineStart();
stream.point(sign1, phi0);
stream.point(lambda1, phi0);
clean = 0;
} else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
if (abs(lambda0 - sign0) < epsilon$4) lambda0 -= sign0 * epsilon$4; // handle degeneracies
if (abs(lambda1 - sign1) < epsilon$4) lambda1 -= sign1 * epsilon$4;
phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
stream.point(sign0, phi0);
stream.lineEnd();
stream.lineStart();
stream.point(sign1, phi0);
clean = 0;
}
stream.point(lambda0 = lambda1, phi0 = phi1);
sign0 = sign1;
},
lineEnd: function() {
stream.lineEnd();
lambda0 = phi0 = NaN;
},
clean: function() {
return 2 - clean; // if intersections, rejoin first and last segments
}
};
}
function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
var cosPhi0,
cosPhi1,
sinLambda0Lambda1 = sin(lambda0 - lambda1);
return abs(sinLambda0Lambda1) > epsilon$4
? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)
- sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))
/ (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
: (phi0 + phi1) / 2;
}
function clipAntimeridianInterpolate(from, to, direction, stream) {
var phi;
if (from == null) {
phi = direction * halfPi$2;
stream.point(-pi$3, phi);
stream.point(0, phi);
stream.point(pi$3, phi);
stream.point(pi$3, 0);
stream.point(pi$3, -phi);
stream.point(0, -phi);
stream.point(-pi$3, -phi);
stream.point(-pi$3, 0);
stream.point(-pi$3, phi);
} else if (abs(from[0] - to[0]) > epsilon$4) {
var lambda = from[0] < to[0] ? pi$3 : -pi$3;
phi = direction * lambda / 2;
stream.point(-lambda, phi);
stream.point(0, phi);
stream.point(lambda, phi);
} else {
stream.point(to[0], to[1]);
}
}
function clipCircle(radius, delta) {
var cr = cos(radius),
smallRadius = cr > 0,
notHemisphere = abs(cr) > epsilon$4; // TODO optimise for this common case
function interpolate(from, to, direction, stream) {
circleStream(stream, radius, delta, direction, from, to);
}
function visible(lambda, phi) {
return cos(lambda) * cos(phi) > cr;
}
// Takes a line and cuts into visible segments. Return values used for polygon
// clipping: 0 - there were intersections or the line was empty; 1 - no
// intersections 2 - there were intersections, and the first and last segments
// should be rejoined.
function clipLine(stream) {
var point0, // previous point
c0, // code for previous point
v0, // visibility of previous point
v00, // visibility of first point
clean; // no intersections
return {
lineStart: function() {
v00 = v0 = false;
clean = 1;
},
point: function(lambda, phi) {
var point1 = [lambda, phi],
point2,
v = visible(lambda, phi),
c = smallRadius
? v ? 0 : code(lambda, phi)
: v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
if (!point0 && (v00 = v0 = v)) stream.lineStart();
// Handle degeneracies.
// TODO ignore if not clipping polygons.
if (v !== v0) {
point2 = intersect(point0, point1);
if (pointEqual(point0, point2) || pointEqual(point1, point2)) {
point1[0] += epsilon$4;
point1[1] += epsilon$4;
v = visible(point1[0], point1[1]);
}
}
if (v !== v0) {
clean = 0;
if (v) {
// outside going in
stream.lineStart();
point2 = intersect(point1, point0);
stream.point(point2[0], point2[1]);
} else {
// inside going out
point2 = intersect(point0, point1);
stream.point(point2[0], point2[1]);
stream.lineEnd();
}
point0 = point2;
} else if (notHemisphere && point0 && smallRadius ^ v) {
var t;
// If the codes for two points are different, or are both zero,
// and there this segment intersects with the small circle.
if (!(c & c0) && (t = intersect(point1, point0, true))) {
clean = 0;
if (smallRadius) {
stream.lineStart();
stream.point(t[0][0], t[0][1]);
stream.point(t[1][0], t[1][1]);
stream.lineEnd();
} else {
stream.point(t[1][0], t[1][1]);
stream.lineEnd();
stream.lineStart();
stream.point(t[0][0], t[0][1]);
}
}
}
if (v && (!point0 || !pointEqual(point0, point1))) {
stream.point(point1[0], point1[1]);
}
point0 = point1, v0 = v, c0 = c;
},
lineEnd: function() {
if (v0) stream.lineEnd();
point0 = null;
},
// Rejoin first and last segments if there were intersections and the first
// and last points were visible.
clean: function() {
return clean | ((v00 && v0) << 1);
}
};
}
// Intersects the great circle between a and b with the clip circle.
function intersect(a, b, two) {
var pa = cartesian(a),
pb = cartesian(b);
// We have two planes, n1.p = d1 and n2.p = d2.
// Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
var n1 = [1, 0, 0], // normal
n2 = cartesianCross(pa, pb),
n2n2 = cartesianDot(n2, n2),
n1n2 = n2[0], // cartesianDot(n1, n2),
determinant = n2n2 - n1n2 * n1n2;
// Two polar points.
if (!determinant) return !two && a;
var c1 = cr * n2n2 / determinant,
c2 = -cr * n1n2 / determinant,
n1xn2 = cartesianCross(n1, n2),
A = cartesianScale(n1, c1),
B = cartesianScale(n2, c2);
cartesianAddInPlace(A, B);
// Solve |p(t)|^2 = 1.
var u = n1xn2,
w = cartesianDot(A, u),
uu = cartesianDot(u, u),
t2 = w * w - uu * (cartesianDot(A, A) - 1);
if (t2 < 0) return;
var t = sqrt$1(t2),
q = cartesianScale(u, (-w - t) / uu);
cartesianAddInPlace(q, A);
q = spherical(q);
if (!two) return q;
// Two intersection points.
var lambda0 = a[0],
lambda1 = b[0],
phi0 = a[1],
phi1 = b[1],
z;
if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
var delta = lambda1 - lambda0,
polar = abs(delta - pi$3) < epsilon$4,
meridian = polar || delta < epsilon$4;
if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
// Check that the first point is between a and b.
if (meridian
? polar
? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$4 ? phi0 : phi1)
: phi0 <= q[1] && q[1] <= phi1
: delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
var q1 = cartesianScale(u, (-w + t) / uu);
cartesianAddInPlace(q1, A);
return [q, spherical(q1)];
}
}
// Generates a 4-bit vector representing the location of a point relative to
// the small circle's bounding box.
function code(lambda, phi) {
var r = smallRadius ? radius : pi$3 - radius,
code = 0;
if (lambda < -r) code |= 1; // left
else if (lambda > r) code |= 2; // right
if (phi < -r) code |= 4; // below
else if (phi > r) code |= 8; // above
return code;
}
return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
}
function transform$1(prototype) {
return {
stream: transform$2(prototype)
};
}
function transform$2(prototype) {
function T() {}
var p = T.prototype = Object.create(Transform$1.prototype);
for (var k in prototype) p[k] = prototype[k];
return function(stream) {
var t = new T;
t.stream = stream;
return t;
};
}
function Transform$1() {}
Transform$1.prototype = {
point: function(x, y) { this.stream.point(x, y); },
sphere: function() { this.stream.sphere(); },
lineStart: function() { this.stream.lineStart(); },
lineEnd: function() { this.stream.lineEnd(); },
polygonStart: function() { this.stream.polygonStart(); },
polygonEnd: function() { this.stream.polygonEnd(); }
};
function fit(project, extent, object) {
var w = extent[1][0] - extent[0][0],
h = extent[1][1] - extent[0][1],
clip = project.clipExtent && project.clipExtent();
project
.scale(150)
.translate([0, 0]);
if (clip != null) project.clipExtent(null);
geoStream(object, project.stream(boundsStream$1));
var b = boundsStream$1.result(),
k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
if (clip != null) project.clipExtent(clip);
return project
.scale(k * 150)
.translate([x, y]);
}
function fitSize(project) {
return function(size, object) {
return fit(project, [[0, 0], size], object);
};
}
function fitExtent(project) {
return function(extent, object) {
return fit(project, extent, object);
};
}
var maxDepth = 16;
var cosMinDistance = cos(30 * radians);
// cos(minimum angular distance)
function resample(project, delta2) {
return +delta2 ? resample$1(project, delta2) : resampleNone(project);
}
function resampleNone(project) {
return transform$2({
point: function(x, y) {
x = project(x, y);
this.stream.point(x[0], x[1]);
}
});
}
function resample$1(project, delta2) {
function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
var dx = x1 - x0,
dy = y1 - y0,
d2 = dx * dx + dy * dy;
if (d2 > 4 * delta2 && depth--) {
var a = a0 + a1,
b = b0 + b1,
c = c0 + c1,
m = sqrt$1(a * a + b * b + c * c),
phi2 = asin$1(c /= m),
lambda2 = abs(abs(c) - 1) < epsilon$4 || abs(lambda0 - lambda1) < epsilon$4 ? (lambda0 + lambda1) / 2 : atan2(b, a),
p = project(lambda2, phi2),
x2 = p[0],
y2 = p[1],
dx2 = x2 - x0,
dy2 = y2 - y0,
dz = dy * dx2 - dx * dy2;
if (dz * dz / d2 > delta2 // perpendicular projected distance
|| abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
|| a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
stream.point(x2, y2);
resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
}
}
}
return function(stream) {
var lambda00, x00, y00, a00, b00, c00, // first point
lambda0, x0, y0, a0, b0, c0; // previous point
var resampleStream = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
};
function point(x, y) {
x = project(x, y);
stream.point(x[0], x[1]);
}
function lineStart() {
x0 = NaN;
resampleStream.point = linePoint;
stream.lineStart();
}
function linePoint(lambda, phi) {
var c = cartesian([lambda, phi]), p = project(lambda, phi);
resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
stream.point(x0, y0);
}
function lineEnd() {
resampleStream.point = point;
stream.lineEnd();
}
function ringStart() {
lineStart();
resampleStream.point = ringPoint;
resampleStream.lineEnd = ringEnd;
}
function ringPoint(lambda, phi) {
linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
resampleStream.point = linePoint;
}
function ringEnd() {
resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
resampleStream.lineEnd = lineEnd;
lineEnd();
}
return resampleStream;
};
}
var transformRadians = transform$2({
point: function(x, y) {
this.stream.point(x * radians, y * radians);
}
});
function projection(project) {
return projectionMutator(function() { return project; })();
}
function projectionMutator(projectAt) {
var project,
k = 150, // scale
x = 480, y = 250, // translate
dx, dy, lambda = 0, phi = 0, // center
deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
theta = null, preclip = clipAntimeridian, // clip angle
x0 = null, y0, x1, y1, postclip = identity$7, // clip extent
delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
cache,
cacheStream;
function projection(point) {
point = projectRotate(point[0] * radians, point[1] * radians);
return [point[0] * k + dx, dy - point[1] * k];
}
function invert(point) {
point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
return point && [point[0] * degrees$1, point[1] * degrees$1];
}
function projectTransform(x, y) {
return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
}
projection.stream = function(stream) {
return cache && cacheStream === stream ? cache : cache = transformRadians(preclip(rotate, projectResample(postclip(cacheStream = stream))));
};
projection.clipAngle = function(_) {
return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians, 6 * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
};
projection.clipExtent = function(_) {
return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$7) : clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
};
projection.scale = function(_) {
return arguments.length ? (k = +_, recenter()) : k;
};
projection.translate = function(_) {
return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
};
projection.center = function(_) {
return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
};
projection.rotate = function(_) {
return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
};
projection.precision = function(_) {
return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt$1(delta2);
};
projection.fitExtent = fitExtent(projection);
projection.fitSize = fitSize(projection);
function recenter() {
projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
var center = project(lambda, phi);
dx = x - center[0] * k;
dy = y + center[1] * k;
return reset();
}
function reset() {
cache = cacheStream = null;
return projection;
}
return function() {
project = projectAt.apply(this, arguments);
projection.invert = project.invert && invert;
return recenter();
};
}
function conicProjection(projectAt) {
var phi0 = 0,
phi1 = pi$3 / 3,
m = projectionMutator(projectAt),
p = m(phi0, phi1);
p.parallels = function(_) {
return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
};
return p;
}
function conicEqualAreaRaw(y0, y1) {
var sy0 = sin(y0),
n = (sy0 + sin(y1)) / 2,
c = 1 + sy0 * (2 * n - sy0),
r0 = sqrt$1(c) / n;
function project(x, y) {
var r = sqrt$1(c - 2 * n * sin(y)) / n;
return [r * sin(x *= n), r0 - r * cos(x)];
}
project.invert = function(x, y) {
var r0y = r0 - y;
return [atan2(x, r0y) / n, asin$1((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
};
return project;
}
function conicEqualArea() {
return conicProjection(conicEqualAreaRaw)
.scale(155.424)
.center([0, 33.6442]);
}
function albers() {
return conicEqualArea()
.parallels([29.5, 45.5])
.scale(1070)
.translate([480, 250])
.rotate([96, 0])
.center([-0.6, 38.7]);
}
// The projections must have mutually exclusive clip regions on the sphere,
// as this will avoid emitting interleaving lines and polygons.
function multiplex(streams) {
var n = streams.length;
return {
point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
};
}
// A composite projection for the United States, configured by default for
// 960×500. The projection also works quite well at 960×600 if you change the
// scale to 1285 and adjust the translate accordingly. The set of standard
// parallels for each region comes from USGS, which is published here:
// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
function albersUsa() {
var cache,
cacheStream,
lower48 = albers(), lower48Point,
alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
point, pointStream = {point: function(x, y) { point = [x, y]; }};
function albersUsa(coordinates) {
var x = coordinates[0], y = coordinates[1];
return point = null,
(lower48Point.point(x, y), point)
|| (alaskaPoint.point(x, y), point)
|| (hawaiiPoint.point(x, y), point);
}
albersUsa.invert = function(coordinates) {
var k = lower48.scale(),
t = lower48.translate(),
x = (coordinates[0] - t[0]) / k,
y = (coordinates[1] - t[1]) / k;
return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
: y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
: lower48).invert(coordinates);
};
albersUsa.stream = function(stream) {
return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
};
albersUsa.precision = function(_) {
if (!arguments.length) return lower48.precision();
lower48.precision(_), alaska.precision(_), hawaii.precision(_);
return albersUsa;
};
albersUsa.scale = function(_) {
if (!arguments.length) return lower48.scale();
lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
return albersUsa.translate(lower48.translate());
};
albersUsa.translate = function(_) {
if (!arguments.length) return lower48.translate();
var k = lower48.scale(), x = +_[0], y = +_[1];
lower48Point = lower48
.translate(_)
.clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
.stream(pointStream);
alaskaPoint = alaska
.translate([x - 0.307 * k, y + 0.201 * k])
.clipExtent([[x - 0.425 * k + epsilon$4, y + 0.120 * k + epsilon$4], [x - 0.214 * k - epsilon$4, y + 0.234 * k - epsilon$4]])
.stream(pointStream);
hawaiiPoint = hawaii
.translate([x - 0.205 * k, y + 0.212 * k])
.clipExtent([[x - 0.214 * k + epsilon$4, y + 0.166 * k + epsilon$4], [x - 0.115 * k - epsilon$4, y + 0.234 * k - epsilon$4]])
.stream(pointStream);
return albersUsa;
};
albersUsa.fitExtent = fitExtent(albersUsa);
albersUsa.fitSize = fitSize(albersUsa);
return albersUsa.scale(1070);
}
function azimuthalRaw(scale) {
return function(x, y) {
var cx = cos(x),
cy = cos(y),
k = scale(cx * cy);
return [
k * cy * sin(x),
k * sin(y)
];
}
}
function azimuthalInvert(angle) {
return function(x, y) {
var z = sqrt$1(x * x + y * y),
c = angle(z),
sc = sin(c),
cc = cos(c);
return [
atan2(x * sc, z * cc),
asin$1(z && y * sc / z)
];
}
}
var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
return sqrt$1(2 / (1 + cxcy));
});
azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
return 2 * asin$1(z / 2);
});
function azimuthalEqualArea() {
return projection(azimuthalEqualAreaRaw)
.scale(124.75)
.clipAngle(180 - 1e-3);
}
var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
return (c = acos(c)) && c / sin(c);
});
azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
return z;
});
function azimuthalEquidistant() {
return projection(azimuthalEquidistantRaw)
.scale(79.4188)
.clipAngle(180 - 1e-3);
}
function mercatorRaw(lambda, phi) {
return [lambda, log$1(tan((halfPi$2 + phi) / 2))];
}
mercatorRaw.invert = function(x, y) {
return [x, 2 * atan(exp(y)) - halfPi$2];
};
function mercator() {
return mercatorProjection(mercatorRaw)
.scale(961 / tau$3);
}
function mercatorProjection(project) {
var m = projection(project),
scale = m.scale,
translate = m.translate,
clipExtent = m.clipExtent,
clipAuto;
m.scale = function(_) {
return arguments.length ? (scale(_), clipAuto && m.clipExtent(null), m) : scale();
};
m.translate = function(_) {
return arguments.length ? (translate(_), clipAuto && m.clipExtent(null), m) : translate();
};
m.clipExtent = function(_) {
if (!arguments.length) return clipAuto ? null : clipExtent();
if (clipAuto = _ == null) {
var k = pi$3 * scale(),
t = translate();
_ = [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]];
}
clipExtent(_);
return m;
};
return m.clipExtent(null);
}
function tany(y) {
return tan((halfPi$2 + y) / 2);
}
function conicConformalRaw(y0, y1) {
var cy0 = cos(y0),
n = y0 === y1 ? sin(y0) : log$1(cy0 / cos(y1)) / log$1(tany(y1) / tany(y0)),
f = cy0 * pow$1(tany(y0), n) / n;
if (!n) return mercatorRaw;
function project(x, y) {
if (f > 0) { if (y < -halfPi$2 + epsilon$4) y = -halfPi$2 + epsilon$4; }
else { if (y > halfPi$2 - epsilon$4) y = halfPi$2 - epsilon$4; }
var r = f / pow$1(tany(y), n);
return [r * sin(n * x), f - r * cos(n * x)];
}
project.invert = function(x, y) {
var fy = f - y, r = sign$1(n) * sqrt$1(x * x + fy * fy);
return [atan2(x, fy) / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$2];
};
return project;
}
function conicConformal() {
return conicProjection(conicConformalRaw)
.scale(109.5)
.parallels([30, 30]);
}
function equirectangularRaw(lambda, phi) {
return [lambda, phi];
}
equirectangularRaw.invert = equirectangularRaw;
function equirectangular() {
return projection(equirectangularRaw)
.scale(152.63);
}
function conicEquidistantRaw(y0, y1) {
var cy0 = cos(y0),
n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0),
g = cy0 / n + y0;
if (abs(n) < epsilon$4) return equirectangularRaw;
function project(x, y) {
var gy = g - y, nx = n * x;
return [gy * sin(nx), g - gy * cos(nx)];
}
project.invert = function(x, y) {
var gy = g - y;
return [atan2(x, gy) / n, g - sign$1(n) * sqrt$1(x * x + gy * gy)];
};
return project;
}
function conicEquidistant() {
return conicProjection(conicEquidistantRaw)
.scale(131.154)
.center([0, 13.9389]);
}
function gnomonicRaw(x, y) {
var cy = cos(y), k = cos(x) * cy;
return [cy * sin(x) / k, sin(y) / k];
}
gnomonicRaw.invert = azimuthalInvert(atan);
function gnomonic() {
return projection(gnomonicRaw)
.scale(144.049)
.clipAngle(60);
}
function orthographicRaw(x, y) {
return [cos(y) * sin(x), sin(y)];
}
orthographicRaw.invert = azimuthalInvert(asin$1);
function orthographic() {
return projection(orthographicRaw)
.scale(249.5)
.clipAngle(90 + epsilon$4);
}
function stereographicRaw(x, y) {
var cy = cos(y), k = 1 + cos(x) * cy;
return [cy * sin(x) / k, sin(y) / k];
}
stereographicRaw.invert = azimuthalInvert(function(z) {
return 2 * atan(z);
});
function stereographic() {
return projection(stereographicRaw)
.scale(250)
.clipAngle(142);
}
function transverseMercatorRaw(lambda, phi) {
return [log$1(tan((halfPi$2 + phi) / 2)), -lambda];
}
transverseMercatorRaw.invert = function(x, y) {
return [-y, 2 * atan(exp(x)) - halfPi$2];
};
function transverseMercator() {
var m = mercatorProjection(transverseMercatorRaw),
center = m.center,
rotate = m.rotate;
m.center = function(_) {
return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
};
m.rotate = function(_) {
return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
};
return rotate([0, 0, 90])
.scale(159.155);
}
function attrsFunction(selection, map) {
return selection.each(function() {
var x = map.apply(this, arguments), s = select(this);
for (var name in x) s.attr(name, x[name]);
});
}
function attrsObject(selection, map) {
for (var name in map) selection.attr(name, map[name]);
return selection;
}
function selection_attrs(map) {
return (typeof map === "function" ? attrsFunction : attrsObject)(this, map);
}
function stylesFunction(selection, map, priority) {
return selection.each(function() {
var x = map.apply(this, arguments), s = select(this);
for (var name in x) s.style(name, x[name], priority);
});
}
function stylesObject(selection, map, priority) {
for (var name in map) selection.style(name, map[name], priority);
return selection;
}
function selection_styles(map, priority) {
return (typeof map === "function" ? stylesFunction : stylesObject)(this, map, priority == null ? "" : priority);
}
function propertiesFunction(selection, map) {
return selection.each(function() {
var x = map.apply(this, arguments), s = select(this);
for (var name in x) s.property(name, x[name]);
});
}
function propertiesObject(selection, map) {
for (var name in map) selection.property(name, map[name]);
return selection;
}
function selection_properties(map) {
return (typeof map === "function" ? propertiesFunction : propertiesObject)(this, map);
}
function attrsFunction$1(transition, map) {
return transition.each(function() {
var x = map.apply(this, arguments), t = select(this).transition(transition);
for (var name in x) t.attr(name, x[name]);
});
}
function attrsObject$1(transition, map) {
for (var name in map) transition.attr(name, map[name]);
return transition;
}
function transition_attrs(map) {
return (typeof map === "function" ? attrsFunction$1 : attrsObject$1)(this, map);
}
function stylesFunction$1(transition, map, priority) {
return transition.each(function() {
var x = map.apply(this, arguments), t = select(this).transition(transition);
for (var name in x) t.style(name, x[name], priority);
});
}
function stylesObject$1(transition, map, priority) {
for (var name in map) transition.style(name, map[name], priority);
return transition;
}
function transition_styles(map, priority) {
return (typeof map === "function" ? stylesFunction$1 : stylesObject$1)(this, map, priority == null ? "" : priority);
}
selection.prototype.attrs = selection_attrs;
selection.prototype.styles = selection_styles;
selection.prototype.properties = selection_properties;
transition.prototype.attrs = transition_attrs;
transition.prototype.styles = transition_styles;
function translateSelection(xy) {
return this.attr('transform', function(d,i) {
return 'translate('+[typeof xy == 'function' ? xy.call(this, d,i) : xy]+')';
});
};
function parseAttributes(name) {
if (typeof name === "string") {
var attr = {},
parts = name.split(/([\.#])/g), p;
name = parts.shift();
while ((p = parts.shift())) {
if (p == '.') attr['class'] = attr['class'] ? attr['class'] + ' ' + parts.shift() : parts.shift();
else if (p == '#') attr.id = parts.shift();
}
return {tag: name, attr: attr};
}
return name;
}
function append(name) {
var n = parseAttributes(name), s;
name = creator(n.tag);
s = this.select(function() {
return this.appendChild(name.apply(this, arguments));
});
//attrs not provided by default in v4
for (var key in n.attr) { s.attr(key, n.attr[key]) }
return s;
};
function selectAppend(name) {
var select = selector(name),
n = parseAttributes(name), s;
name = creator(n.tag);
s = this.select(function() {
return select.apply(this, arguments)
|| this.appendChild(name.apply(this, arguments));
});
//attrs not provided by default in v4
for (var key in n.attr) { s.attr(key, n.attr[key]) }
return s;
};
function tspans(lines, lh) {
return this.selectAll('tspan')
.data(lines).enter()
.append('tspan')
.text(function(d) { return d; })
.attr('x', 0)
.attr('dy', function(d, i) { return i ? lh || 15 : 0; });
};
function appendMany(data, name){
return this.selectAll(null).data(data).enter().append(name);
};
function at(name, value) {
if (typeof(name) == 'object'){
for (var key in name){
this.attr(key.replace(/([a-z\d])([A-Z])/g, '$1-$2').toLowerCase(), name[key])
}
return this
} else{
return arguments.length == 1 ? this.attr(name) : this.attr(name, value)
}
};
function f(){
var functions = arguments
//convert all string arguments into field accessors
var i = 0, l = functions.length
while (i < l) {
if (typeof(functions[i]) === 'string' || typeof(functions[i]) === 'number'){
functions[i] = (function(str){ return function(d){ return d[str] } })(functions[i])
}
i++
}
//return composition of functions
return function(d) {
var i=0, l = functions.length
while (i++ < l) d = functions[i-1].call(this, d)
return d
}
}
f.not = function(d){ return !d }
f.run = function(d){ return d() }
f.objToFn = function(obj, defaultVal){
if (arguments.length == 1) defaultVal = undefined
return function(str){
return typeof(obj[str]) !== undefined ? obj[str] : defaultVal }
}
function st(name, value) {
if (typeof(name) == 'object'){
for (var key in name){
addStyle(this, key, name[key])
}
return this
} else{
return arguments.length == 1 ? this.style(name) : addStyle(this, name, value)
}
function addStyle(sel, style, value){
var style = style.replace(/([a-z\d])([A-Z])/g, '$1-$2').toLowerCase()
var pxStyles = 'top left bottom right padding-top padding-left padding-bottom padding-right border-top b-width border-left-width border-botto-width m border-right-width margin-top margin-left margin-bottom margin-right font-size width height stroke-width line-height margin padding border max-width min-width'
if (~pxStyles.indexOf(style) ){
sel.style(style, typeof value == 'function' ? f(value, addPx) : addPx(value))
} else{
sel.style(style, value)
}
return sel
}
function addPx(d){ return d.match ? d : d + 'px' }
};
function wordwrap(line, maxCharactersPerLine) {
var w = line.split(' '),
lines = [],
words = [],
maxChars = maxCharactersPerLine || 40,
l = 0;
w.forEach(function(d) {
if (l+d.length > maxChars) {
lines.push(words.join(' '));
words.length = 0;
l = 0;
}
l += d.length;
words.push(d);
});
if (words.length) {
lines.push(words.join(' '));
}
return lines.filter(function(d){ return d != '' });
};
function ascendingKey(key) {
return typeof key == 'function' ? function (a, b) {
return key(a) < key(b) ? -1 : key(a) > key(b) ? 1 : key(a) >= key(b) ? 0 : NaN;
} : function (a, b) {
return a[key] < b[key] ? -1 : a[key] > b[key] ? 1 : a[key] >= b[key] ? 0 : NaN;
};
};
function descendingKey(key) {
return typeof key == 'function' ? function (a, b) {
return key(b) < key(a) ? -1 : key(b) > key(a) ? 1 : key(b) >= key(a) ? 0 : NaN;
} : function (a, b) {
return b[key] < a[key] ? -1 : b[key] > a[key] ? 1 : b[key] >= a[key] ? 0 : NaN;
};
};
function conventions(c){
c = c || {}
c.margin = c.margin || {top: 20, right: 20, bottom: 20, left: 20}
c.width = c.width || c.totalWidth - c.margin.left - c.margin.right || 900
c.height = c.height || c.totalHeight - c.margin.top - c.margin.bottom || 460
c.totalWidth = c.width + c.margin.left + c.margin.right
c.totalHeight = c.height + c.margin.top + c.margin.bottom
c.parentSel = c.parentSel || select('body')
c.rootsvg = c.parentSel.append('svg')
c.svg = c.rootsvg
.attr('width', c.totalWidth)
.attr('height', c.totalHeight)
.append('g')
.attr('transform', 'translate(' + c.margin.left + ',' + c.margin.top + ')')
c.x = c.x || linear$2().range([0, c.width])
c.y = c.y || linear$2().range([c.height, 0])
c.xAxis = c.xAxis || axisBottom().scale(c.x)
c.yAxis = c.yAxis || axisLeft().scale(c.y)
c.drawAxis = function(){
c.svg.append('g')
.attr('class', 'x axis')
.attr('transform', 'translate(0,' + c.height + ')')
.call(c.xAxis);
c.svg.append('g')
.attr('class', 'y axis')
.call(c.yAxis);
}
return c
}
function attachTooltip(sel, tooltipSel, fieldFns){
if (!sel.size()) return
tooltipSel = tooltipSel || select('.tooltip')
sel
.on('mouseover.attachTooltip', ttDisplay)
.on('mousemove.attachTooltip', ttMove)
.on('mouseout.attachTooltip', ttHide)
.on('click.attachTooltip', function(d){ console.log(d) })
var d = sel.datum()
fieldFns = fieldFns || d3keys(d)
.filter(function(str){
return (typeof d[str] != 'object') && (d[str] != 'array')
})
.map(function(str){
return function(d){ return str + ': <b>' + d[str] + '</b>'} })
function ttDisplay(d){
tooltipSel
.classed('tooltip-hidden', false)
.html('')
.appendMany(fieldFns, 'div')
.html(function(fn){ return fn(d) })
select(this).classed('tooltipped', true)
}
function ttMove(d){
var tt = tooltipSel
if (!tt.size()) return
var e = exports.event,
x = e.clientX,
y = e.clientY,
n = tt.node(),
nBB = n.getBoundingClientRect(),
doctop = (window.scrollY)? window.scrollY : (document.documentElement && document.documentElement.scrollTop)? document.documentElement.scrollTop : document.body.scrollTop;
tt.style('top', (y+doctop-nBB.height-18)+'px');
tt.style('left', Math.min(Math.max(20, (x-nBB.width/2)), window.innerWidth - nBB.width - 20)+'px');
}
function ttHide(d){
tooltipSel.classed('tooltip-hidden', true);
selectAll('.tooltipped').classed('tooltipped', false)
}
}
function loadData(files, cb){
var q = queue()
files.forEach(function(d){
var type = d.split('.').reverse()[0]
if (type != 'csv' && type != 'json') return cb(new Error('Invalid type', d))
q.defer(d3[type], d)
})
q.awaitAll(cb)
}
function nestBy(array, key){
return nest().key(key).entries(array).map(function(d){
d.values.key = d.key
return d.values
})
}
selection.prototype.translate = translateSelection
selection.prototype.append = append
selection.prototype.selectAppend = selectAppend
selection.prototype.tspans = tspans
selection.prototype.appendMany = appendMany
selection.prototype.at = at
selection.prototype.st = st
selection.prototype.prop = selection.prototype.property
exports.bisect = bisectRight;
exports.bisectRight = bisectRight;
exports.bisectLeft = bisectLeft;
exports.ascending = ascending;
exports.bisector = bisector;
exports.descending = descending;
exports.deviation = deviation;
exports.extent = extent;
exports.histogram = histogram;
exports.thresholdFreedmanDiaconis = freedmanDiaconis;
exports.thresholdScott = scott;
exports.thresholdSturges = sturges;
exports.max = max;
exports.mean = mean;
exports.median = median;
exports.merge = merge;
exports.min = min;
exports.pairs = pairs;
exports.permute = permute;
exports.quantile = threshold;
exports.range = range;
exports.scan = scan;
exports.shuffle = shuffle;
exports.sum = sum;
exports.ticks = ticks;
exports.tickStep = tickStep;
exports.transpose = transpose;
exports.variance = variance;
exports.zip = zip;
exports.entries = entries;
exports.keys = d3keys;
exports.values = values;
exports.map = map$1;
exports.set = set;
exports.nest = nest;
exports.randomUniform = uniform;
exports.randomNormal = normal;
exports.randomLogNormal = logNormal;
exports.randomBates = bates;
exports.randomIrwinHall = irwinHall;
exports.randomExponential = exponential;
exports.easeLinear = linear;
exports.easeQuad = quadInOut;
exports.easeQuadIn = quadIn;
exports.easeQuadOut = quadOut;
exports.easeQuadInOut = quadInOut;
exports.easeCubic = easeCubicInOut;
exports.easeCubicIn = cubicIn;
exports.easeCubicOut = cubicOut;
exports.easeCubicInOut = easeCubicInOut;
exports.easePoly = polyInOut;
exports.easePolyIn = polyIn;
exports.easePolyOut = polyOut;
exports.easePolyInOut = polyInOut;
exports.easeSin = sinInOut;
exports.easeSinIn = sinIn;
exports.easeSinOut = sinOut;
exports.easeSinInOut = sinInOut;
exports.easeExp = expInOut;
exports.easeExpIn = expIn;
exports.easeExpOut = expOut;
exports.easeExpInOut = expInOut;
exports.easeCircle = circleInOut;
exports.easeCircleIn = circleIn;
exports.easeCircleOut = circleOut;
exports.easeCircleInOut = circleInOut;
exports.easeBounce = bounceOut;
exports.easeBounceIn = bounceIn;
exports.easeBounceOut = bounceOut;
exports.easeBounceInOut = bounceInOut;
exports.easeBack = backInOut;
exports.easeBackIn = backIn;
exports.easeBackOut = backOut;
exports.easeBackInOut = backInOut;
exports.easeElastic = elasticOut;
exports.easeElasticIn = elasticIn;
exports.easeElasticOut = elasticOut;
exports.easeElasticInOut = elasticInOut;
exports.polygonArea = area;
exports.polygonCentroid = centroid;
exports.polygonHull = hull;
exports.polygonContains = contains;
exports.polygonLength = length$1;
exports.path = path;
exports.quadtree = quadtree;
exports.queue = queue;
exports.arc = arc;
exports.area = area$1;
exports.line = line;
exports.pie = pie;
exports.radialArea = radialArea;
exports.radialLine = radialLine$1;
exports.symbol = symbol;
exports.symbols = symbols;
exports.symbolCircle = circle;
exports.symbolCross = cross$1;
exports.symbolDiamond = diamond;
exports.symbolSquare = square;
exports.symbolStar = star;
exports.symbolTriangle = triangle;
exports.symbolWye = wye;
exports.curveBasisClosed = basisClosed;
exports.curveBasisOpen = basisOpen;
exports.curveBasis = basis;
exports.curveBundle = bundle;
exports.curveCardinalClosed = cardinalClosed;
exports.curveCardinalOpen = cardinalOpen;
exports.curveCardinal = cardinal;
exports.curveCatmullRomClosed = catmullRomClosed;
exports.curveCatmullRomOpen = catmullRomOpen;
exports.curveCatmullRom = catmullRom;
exports.curveLinearClosed = linearClosed;
exports.curveLinear = curveLinear;
exports.curveMonotoneX = monotoneX;
exports.curveMonotoneY = monotoneY;
exports.curveNatural = natural;
exports.curveStep = step;
exports.curveStepAfter = stepAfter;
exports.curveStepBefore = stepBefore;
exports.stack = stack;
exports.stackOffsetExpand = expand;
exports.stackOffsetNone = none;
exports.stackOffsetSilhouette = silhouette;
exports.stackOffsetWiggle = wiggle;
exports.stackOrderAscending = ascending$1;
exports.stackOrderDescending = descending$2;
exports.stackOrderInsideOut = insideOut;
exports.stackOrderNone = none$1;
exports.stackOrderReverse = reverse;
exports.color = color;
exports.rgb = colorRgb;
exports.hsl = colorHsl;
exports.lab = lab;
exports.hcl = colorHcl;
exports.cubehelix = cubehelix;
exports.interpolate = interpolate;
exports.interpolateArray = array$1;
exports.interpolateNumber = interpolateNumber;
exports.interpolateObject = object;
exports.interpolateRound = interpolateRound;
exports.interpolateString = interpolateString;
exports.interpolateTransformCss = interpolateTransform$1;
exports.interpolateTransformSvg = interpolateTransform$2;
exports.interpolateZoom = interpolateZoom;
exports.interpolateRgb = interpolateRgb;
exports.interpolateRgbBasis = rgbBasis;
exports.interpolateRgbBasisClosed = rgbBasisClosed;
exports.interpolateHsl = hsl$1;
exports.interpolateHslLong = hslLong;
exports.interpolateLab = lab$1;
exports.interpolateHcl = hcl$1;
exports.interpolateHclLong = hclLong;
exports.interpolateCubehelix = cubehelix$2;
exports.interpolateCubehelixLong = interpolateCubehelixLong;
exports.interpolateBasis = basis$2;
exports.interpolateBasisClosed = basisClosed$1;
exports.quantize = quantize;
exports.dispatch = dispatch;
exports.dsvFormat = dsv;
exports.csvParse = csvParse;
exports.csvParseRows = csvParseRows;
exports.csvFormat = csvFormat;
exports.csvFormatRows = csvFormatRows;
exports.tsvParse = tsvParse;
exports.tsvParseRows = tsvParseRows;
exports.tsvFormat = tsvFormat;
exports.tsvFormatRows = tsvFormatRows;
exports.request = request;
exports.html = html;
exports.json = json;
exports.text = text;
exports.xml = xml;
exports.csv = csv$1;
exports.tsv = tsv$1;
exports.now = now;
exports.timer = timer;
exports.timerFlush = timerFlush;
exports.timeout = timeout$1;
exports.interval = interval$1;
exports.timeInterval = newInterval;
exports.timeMillisecond = millisecond;
exports.timeMilliseconds = milliseconds;
exports.timeSecond = second;
exports.timeSeconds = seconds;
exports.timeMinute = minute;
exports.timeMinutes = minutes;
exports.timeHour = hour;
exports.timeHours = hours;
exports.timeDay = day;
exports.timeDays = days;
exports.timeWeek = timeWeek;
exports.timeWeeks = sundays;
exports.timeSunday = timeWeek;
exports.timeSundays = sundays;
exports.timeMonday = timeMonday;
exports.timeMondays = mondays;
exports.timeTuesday = tuesday;
exports.timeTuesdays = tuesdays;
exports.timeWednesday = wednesday;
exports.timeWednesdays = wednesdays;
exports.timeThursday = thursday;
exports.timeThursdays = thursdays;
exports.timeFriday = friday;
exports.timeFridays = fridays;
exports.timeSaturday = saturday;
exports.timeSaturdays = saturdays;
exports.timeMonth = month;
exports.timeMonths = months;
exports.timeYear = year;
exports.timeYears = years;
exports.utcMillisecond = millisecond;
exports.utcMilliseconds = milliseconds;
exports.utcSecond = second;
exports.utcSeconds = seconds;
exports.utcMinute = utcMinute;
exports.utcMinutes = utcMinutes;
exports.utcHour = utcHour;
exports.utcHours = utcHours;
exports.utcDay = utcDay;
exports.utcDays = utcDays;
exports.utcWeek = utcWeek;
exports.utcWeeks = utcSundays;
exports.utcSunday = utcWeek;
exports.utcSundays = utcSundays;
exports.utcMonday = utcMonday;
exports.utcMondays = utcMondays;
exports.utcTuesday = utcTuesday;
exports.utcTuesdays = utcTuesdays;
exports.utcWednesday = utcWednesday;
exports.utcWednesdays = utcWednesdays;
exports.utcThursday = utcThursday;
exports.utcThursdays = utcThursdays;
exports.utcFriday = utcFriday;
exports.utcFridays = utcFridays;
exports.utcSaturday = utcSaturday;
exports.utcSaturdays = utcSaturdays;
exports.utcMonth = utcMonth;
exports.utcMonths = utcMonths;
exports.utcYear = utcYear;
exports.utcYears = utcYears;
exports.formatLocale = formatLocale;
exports.formatDefaultLocale = defaultLocale;
exports.formatSpecifier = formatSpecifier;
exports.precisionFixed = precisionFixed;
exports.precisionPrefix = precisionPrefix;
exports.precisionRound = precisionRound;
exports.isoFormat = formatIso;
exports.isoParse = parseIso;
exports.timeFormatLocale = formatLocale$1;
exports.timeFormatDefaultLocale = defaultLocale$1;
exports.scaleBand = band;
exports.scalePoint = point$4;
exports.scaleIdentity = identity$4;
exports.scaleLinear = linear$2;
exports.scaleLog = log;
exports.scaleOrdinal = ordinal;
exports.scaleImplicit = implicit;
exports.scalePow = pow;
exports.scaleSqrt = sqrt;
exports.scaleQuantile = quantile;
exports.scaleQuantize = quantize$1;
exports.scaleThreshold = threshold$1;
exports.scaleTime = time;
exports.scaleUtc = utcTime;
exports.schemeCategory10 = category10;
exports.schemeCategory20b = category20b;
exports.schemeCategory20c = category20c;
exports.schemeCategory20 = category20;
exports.scaleSequential = sequential;
exports.interpolateCubehelixDefault = cubehelix$3;
exports.interpolateRainbow = rainbow$1;
exports.interpolateWarm = warm;
exports.interpolateCool = cool;
exports.interpolateViridis = viridis;
exports.interpolateMagma = magma;
exports.interpolateInferno = inferno;
exports.interpolatePlasma = plasma;
exports.creator = creator;
exports.customEvent = customEvent;
exports.local = local;
exports.matcher = matcher$1;
exports.mouse = mouse;
exports.namespace = namespace;
exports.namespaces = namespaces;
exports.select = select;
exports.selectAll = selectAll;
exports.selection = selection;
exports.selector = selector;
exports.selectorAll = selectorAll;
exports.touch = touch;
exports.touches = touches;
exports.window = window$1;
exports.active = active;
exports.interrupt = interrupt;
exports.transition = transition;
exports.axisTop = axisTop;
exports.axisRight = axisRight;
exports.axisBottom = axisBottom;
exports.axisLeft = axisLeft;
exports.cluster = cluster;
exports.hierarchy = hierarchy;
exports.pack = index;
exports.packSiblings = siblings;
exports.packEnclose = enclose;
exports.partition = partition;
exports.stratify = stratify;
exports.tree = tree;
exports.treemap = index$1;
exports.treemapBinary = binary;
exports.treemapDice = treemapDice;
exports.treemapSlice = treemapSlice;
exports.treemapSliceDice = sliceDice;
exports.treemapSquarify = squarify;
exports.treemapResquarify = resquarify;
exports.forceCenter = center$1;
exports.forceCollide = collide;
exports.forceLink = link;
exports.forceManyBody = manyBody;
exports.forceSimulation = simulation;
exports.forceX = x$3;
exports.forceY = y$3;
exports.drag = drag;
exports.dragDisable = dragDisable;
exports.dragEnable = dragEnable;
exports.voronoi = voronoi;
exports.zoom = zoom;
exports.zoomIdentity = identity$6;
exports.zoomTransform = transform;
exports.brush = brush;
exports.brushX = brushX;
exports.brushY = brushY;
exports.brushSelection = brushSelection;
exports.geoArea = area$2;
exports.geoBounds = bounds;
exports.geoCentroid = centroid$1;
exports.geoCircle = circle$1;
exports.geoClipExtent = extent$1;
exports.geoDistance = distance;
exports.geoGraticule = graticule;
exports.geoInterpolate = interpolate$2;
exports.geoLength = length$2;
exports.geoPath = index$3;
exports.geoAlbers = albers;
exports.geoAlbersUsa = albersUsa;
exports.geoAzimuthalEqualArea = azimuthalEqualArea;
exports.geoAzimuthalEquidistant = azimuthalEquidistant;
exports.geoConicConformal = conicConformal;
exports.geoConicEqualArea = conicEqualArea;
exports.geoConicEquidistant = conicEquidistant;
exports.geoEquirectangular = equirectangular;
exports.geoGnomonic = gnomonic;
exports.geoProjection = projection;
exports.geoProjectionMutator = projectionMutator;
exports.geoMercator = mercator;
exports.geoOrthographic = orthographic;
exports.geoStereographic = stereographic;
exports.geoTransverseMercator = transverseMercator;
exports.geoRotation = rotation;
exports.geoStream = geoStream;
exports.geoTransform = transform$1;
exports.wordwrap = wordwrap;
exports.parseAttributes = parseAttributes;
exports.f = f;
exports.ascendingKey = ascendingKey;
exports.descendingKey = descendingKey;
exports.conventions = conventions;
exports.attachTooltip = attachTooltip;
exports.loadData = loadData;
exports.nestBy = nestBy;
Object.defineProperty(exports, '__esModule', { value: true });
}));
<!DOCTYPE html>
<meta charset='utf-8'>
<style>
body{
margin: 0px;
}
.land {
fill: #222;
}
.county-boundary {
fill: none;
stroke: #fff;
stroke-width: .5px;
}
.state-boundary {
fill: none;
stroke: #fff;
}
.county{
stroke: #fff;
}
</style>
<body></body>
<script src='d3v4+jetpack.js'></script>
<script src='topojson.js'></script>
<script src='d3-force.js'></script>
<script src='script.js'></script>
var width = 960/2 - 1,
height = 500/2,
padding = 0
var projection = d3.geoAlbersUsa()
.scale(1000)
.translate([width/2, height/2])
var path = d3.geoPath().projection(projection)
var ƒ = d3.f
d3.loadData(['us.json', 'county-pop.csv'], function(err, res){
us = res[0]
pops = res[1]
var svg = d3.select('body').html('').append('svg')
.at({width, height})
fipsToPop = {}
pops.forEach(function(d){ return fipsToPop[d.fips] = +d.population2014 })
function isFL(d){ return Math.floor(d.id/1000) == 12 }
counties = topojson.feature(us, us.objects.counties).features
counties.forEach(function(d){
d.pop = fipsToPop[d.id]
})
flCounties = counties.filter(isFL)
flState = topojson.feature(us, {
type: "GeometryCollection",
geometries: us.objects.states.geometries.filter(function(d){ return d.id == 12 })
})
projection.fitSize([width, height], flState)
svg.appendMany(flCounties, 'path.county').attr('d', path)
.at({opacity: opacity})
.call(d3.attachTooltip)
flCounties.forEach(function(d){
d.pos = projection(d3.geoCentroid(d))
d.x = d.pos[0]
d.y = d.pos[1]
d.area = d3.geoArea(d)
d.s = d.area*250000
})
var svg = d3.select('body').append('svg').at({width, height})
svg.appendMany(flCounties, 'rect').each(function(d){
d3.select(this)
.at({width: d.s, height: d.s, x: -d.s/2, y: -d.s/2})
.translate(d.pos)
.at({opacity: opacity, stroke: 'white'})
})
//collide force
flCounties.forEach(function(d){
d.x = d.pos[0]
d.y = d.pos[1]
})
var simulation = d3.forceSimulation(flCounties)
.force('x', d3.forceX(ƒ('pos', 0)).strength(.1))
.force('y', d3.forceY(ƒ('pos', 1)).strength(.1))
.force('collide', collide)
for (var i = 0; i < 100; ++i) simulation.tick()
var svg = d3.select('body').append('svg').at({width, height})
svg.appendMany(flCounties, 'rect').each(function(d){
d3.select(this)
.at({width: d.s, height: d.s, x: -d.s/2, y: -d.s/2})
.translate([d.x, d.y])
.at({opacity: opacity, stroke: 'white'})
})
svg.appendMany(flCounties, 'path')
.at({d: function(d){ return 'M' + d.pos + 'L' + [d.x, d.y] }, stroke: '#0f0'})
//rectCollide force
flCounties.forEach(function(d){
d.x = d.pos[0]
d.y = d.pos[1]
})
var rectCollide = d3.forceRectCollide(function(d){ return [
[-d.s/2, -d.s/2],
[ d.s/2, d.s/2]
]})
var simulation = d3.forceSimulation(flCounties)
.force('x', d3.forceX(ƒ('pos', 0)).strength(.1))
.force('y', d3.forceY(ƒ('pos', 1)).strength(.1))
.force('rectCollide', rectCollide)
for (var i = 0; i < 100; ++i) simulation.tick()
var svg = d3.select('body').append('svg').at({width, height})
svg.appendMany(flCounties, 'rect').each(function(d){
d3.select(this)
.at({width: d.s, height: d.s, x: -d.s/2, y: -d.s/2})
.translate([d.x, d.y])
.at({opacity: opacity, stroke: 'white'})
})
svg.appendMany(flCounties, 'path')
.at({d: function(d){ return 'M' + d.pos + 'L' + [d.x, d.y] }, stroke: '#0f0'})
})
d3.select(self.frameElement).style('height', 2*height + 'px')
function opacity(d){
return d.pop/500000 + .05
return d.area*10000
}
//From http://bl.ocks.org/mbostock/4055889
function collide() {
for (var k = 0, iterations = 4, strength = 0.5; k < iterations; ++k) {
for (var i = 0, n = flCounties.length; i < n; ++i) {
for (var a = flCounties[i], j = i + 1; j < n; ++j) {
var b = flCounties[j],
x = a.x + a.vx - b.x - b.vx,
y = a.y + a.vy - b.y - b.vy,
lx = Math.abs(x),
ly = Math.abs(y),
r = a.s/2 + b.s/2 + padding;
if (lx < r && ly < r) {
if (lx > ly) {
lx = (lx - r) * (x < 0 ? -strength : strength);
a.vx -= lx, b.vx += lx;
} else {
ly = (ly - r) * (y < 0 ? -strength : strength);
a.vy -= ly, b.vy += ly;
}
}
}
}
}
}
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(n.topojson=n.topojson||{})}(this,function(n){"use strict";function t(){}function r(n){if(!n)return t;var r,e,o=n.scale[0],i=n.scale[1],u=n.translate[0],f=n.translate[1];return function(n,t){t||(r=e=0),n[0]=(r+=n[0])*o+u,n[1]=(e+=n[1])*i+f}}function e(n){if(!n)return t;var r,e,o=n.scale[0],i=n.scale[1],u=n.translate[0],f=n.translate[1];return function(n,t){t||(r=e=0);var c=Math.round((n[0]-u)/o),a=Math.round((n[1]-f)/i);n[0]=c-r,n[1]=a-e,r=c,e=a}}function o(n,t){for(var r,e=n.length,o=e-t;o<--e;)r=n[o],n[o++]=n[e],n[e]=r}function i(n,t){for(var r=0,e=n.length;r<e;){var o=r+e>>>1;n[o]<t?r=o+1:e=o}return r}function u(n,t){return"GeometryCollection"===t.type?{type:"FeatureCollection",features:t.geometries.map(function(t){return f(n,t)})}:f(n,t)}function f(n,t){var r={type:"Feature",id:t.id,properties:t.properties||{},geometry:c(n,t)};return null==t.id&&delete r.id,r}function c(n,t){function e(n,t){t.length&&t.pop();for(var r,e=l[n<0?~n:n],i=0,u=e.length;i<u;++i)t.push(r=e[i].slice()),s(r,i);n<0&&o(t,u)}function i(n){return n=n.slice(),s(n,0),n}function u(n){for(var t=[],r=0,o=n.length;r<o;++r)e(n[r],t);return t.length<2&&t.push(t[0].slice()),t}function f(n){for(var t=u(n);t.length<4;)t.push(t[0].slice());return t}function c(n){return n.map(f)}function a(n){var t=n.type;return"GeometryCollection"===t?{type:t,geometries:n.geometries.map(a)}:t in h?{type:t,coordinates:h[t](n)}:null}var s=r(n.transform),l=n.arcs,h={Point:function(n){return i(n.coordinates)},MultiPoint:function(n){return n.coordinates.map(i)},LineString:function(n){return u(n.arcs)},MultiLineString:function(n){return n.arcs.map(u)},Polygon:function(n){return c(n.arcs)},MultiPolygon:function(n){return n.arcs.map(c)}};return a(t)}function a(n,t){function r(t){var r,e=n.arcs[t<0?~t:t],o=e[0];return n.transform?(r=[0,0],e.forEach(function(n){r[0]+=n[0],r[1]+=n[1]})):r=e[e.length-1],t<0?[r,o]:[o,r]}function e(n,t){for(var r in n){var e=n[r];delete t[e.start],delete e.start,delete e.end,e.forEach(function(n){o[n<0?~n:n]=1}),f.push(e)}}var o={},i={},u={},f=[],c=-1;return t.forEach(function(r,e){var o,i=n.arcs[r<0?~r:r];i.length<3&&!i[1][0]&&!i[1][1]&&(o=t[++c],t[c]=r,t[e]=o)}),t.forEach(function(n){var t,e,o=r(n),f=o[0],c=o[1];if(t=u[f])if(delete u[t.end],t.push(n),t.end=c,e=i[c]){delete i[e.start];var a=e===t?t:t.concat(e);i[a.start=t.start]=u[a.end=e.end]=a}else i[t.start]=u[t.end]=t;else if(t=i[c])if(delete i[t.start],t.unshift(n),t.start=f,e=u[f]){delete u[e.end];var s=e===t?t:e.concat(t);i[s.start=e.start]=u[s.end=t.end]=s}else i[t.start]=u[t.end]=t;else t=[n],i[t.start=f]=u[t.end=c]=t}),e(u,i),e(i,u),t.forEach(function(n){o[n<0?~n:n]||f.push([n])}),f}function s(n){return c(n,l.apply(this,arguments))}function l(n,t,r){function e(n){var t=n<0?~n:n;(s[t]||(s[t]=[])).push({i:n,g:c})}function o(n){n.forEach(e)}function i(n){n.forEach(o)}function u(n){"GeometryCollection"===n.type?n.geometries.forEach(u):n.type in l&&(c=n,l[n.type](n.arcs))}var f=[];if(arguments.length>1){var c,s=[],l={LineString:o,MultiLineString:i,Polygon:i,MultiPolygon:function(n){n.forEach(i)}};u(t),s.forEach(arguments.length<3?function(n){f.push(n[0].i)}:function(n){r(n[0].g,n[n.length-1].g)&&f.push(n[0].i)})}else for(var h=0,p=n.arcs.length;h<p;++h)f.push(h);return{type:"MultiLineString",arcs:a(n,f)}}function h(n){var t=n[0],r=n[1],e=n[2];return Math.abs((t[0]-e[0])*(r[1]-t[1])-(t[0]-r[0])*(e[1]-t[1]))}function p(n){for(var t,r=-1,e=n.length,o=n[e-1],i=0;++r<e;)t=o,o=n[r],i+=t[0]*o[1]-t[1]*o[0];return i/2}function v(n){return c(n,g.apply(this,arguments))}function g(n,t){function r(n){n.forEach(function(t){t.forEach(function(t){(o[t=t<0?~t:t]||(o[t]=[])).push(n)})}),i.push(n)}function e(t){return Math.abs(p(c(n,{type:"Polygon",arcs:[t]}).coordinates[0]))}var o={},i=[],u=[];return t.forEach(function(n){"Polygon"===n.type?r(n.arcs):"MultiPolygon"===n.type&&n.arcs.forEach(r)}),i.forEach(function(n){if(!n._){var t=[],r=[n];for(n._=1,u.push(t);n=r.pop();)t.push(n),n.forEach(function(n){n.forEach(function(n){o[n<0?~n:n].forEach(function(n){n._||(n._=1,r.push(n))})})})}}),i.forEach(function(n){delete n._}),{type:"MultiPolygon",arcs:u.map(function(t){var r,i=[];if(t.forEach(function(n){n.forEach(function(n){n.forEach(function(n){o[n<0?~n:n].length<2&&i.push(n)})})}),i=a(n,i),(r=i.length)>1)for(var u,f,c=1,s=e(i[0]);c<r;++c)(u=e(i[c]))>s&&(f=i[0],i[0]=i[c],i[c]=f,s=u);return i})}}function d(n){function t(n,t){n.forEach(function(n){n<0&&(n=~n);var r=o[n];r?r.push(t):o[n]=[t]})}function r(n,r){n.forEach(function(n){t(n,r)})}function e(n,t){"GeometryCollection"===n.type?n.geometries.forEach(function(n){e(n,t)}):n.type in f&&f[n.type](n.arcs,t)}var o={},u=n.map(function(){return[]}),f={LineString:t,MultiLineString:r,Polygon:r,MultiPolygon:function(n,t){n.forEach(function(n){r(n,t)})}};n.forEach(e);for(var c in o)for(var a=o[c],s=a.length,l=0;l<s;++l)for(var h=l+1;h<s;++h){var p,v=a[l],g=a[h];(p=u[v])[c=i(p,g)]!==g&&p.splice(c,0,g),(p=u[g])[c=i(p,v)]!==v&&p.splice(c,0,v)}return u}function y(n,t){return n[1][2]-t[1][2]}function m(){function n(n,t){for(;t>0;){var r=(t+1>>1)-1,o=e[r];if(y(n,o)>=0)break;e[o._=t]=o,e[n._=t=r]=n}}function t(n,t){for(;;){var r=t+1<<1,i=r-1,u=t,f=e[u];if(i<o&&y(e[i],f)<0&&(f=e[u=i]),r<o&&y(e[r],f)<0&&(f=e[u=r]),u===t)break;e[f._=t]=f,e[n._=t=u]=n}}var r={},e=[],o=0;return r.push=function(t){return n(e[t._=o]=t,o++),o},r.pop=function(){if(!(o<=0)){var n,r=e[0];return--o>0&&(n=e[o],t(e[n._=0]=n,0)),r}},r.remove=function(r){var i,u=r._;if(e[u]===r)return u!==--o&&(i=e[o],(y(i,r)<0?n:t)(e[i._=u]=i,u)),u},r}function E(n,t){function o(n){f.remove(n),n[1][2]=t(n),f.push(n)}var i=r(n.transform),u=e(n.transform),f=m();return t||(t=h),n.arcs.forEach(function(n){var r,e,c,a,s=[],l=0;for(e=0,c=n.length;e<c;++e)a=n[e],i(n[e]=[a[0],a[1],1/0],e);for(e=1,c=n.length-1;e<c;++e)r=n.slice(e-1,e+2),r[1][2]=t(r),s.push(r),f.push(r);for(e=0,c=s.length;e<c;++e)r=s[e],r.previous=s[e-1],r.next=s[e+1];for(;r=f.pop();){var h=r.previous,p=r.next;r[1][2]<l?r[1][2]=l:l=r[1][2],h&&(h.next=p,h[2]=r[2],o(h)),p&&(p.previous=h,p[0]=r[0],o(p))}n.forEach(u)}),n}var M="1.6.27";n.version=M,n.mesh=s,n.meshArcs=l,n.merge=v,n.mergeArcs=g,n.feature=u,n.neighbors=d,n.presimplify=E,Object.defineProperty(n,"__esModule",{value:!0})});
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment