From bff780c2da36b06855e15c23de19ec300bfafd40 Mon Sep 17 00:00:00 2001 From: Sara-Jayne Terp Date: Mon, 22 Mar 2021 07:46:18 -0700 Subject: [PATCH] updated master --- AMITT_MASTER_DATA/AMITT_TTPs_MASTER.xlsx | Bin 134635 -> 134757 bytes ...e_incident_visualisations-checkpoint.ipynb | 869 +- ...AMITT_create_incident_visualisations.ipynb | 1287 +- HTML_GENERATING_CODE/generate_amitt_ttps.py | 9 + HTML_GENERATING_CODE/test_new_code.ipynb | 263 +- counters/C00194.md | 2 +- counters_index.md | 2 +- .../cross_counterid_techniqueid.csv | 264 + visualisations/d3.js | 19718 ++++++++++++++++ visualisations/grid.js | 80 + visualisations/index.html | 15 + visualisations/index2.html | 13 + visualisations/index_local.html | 14 + visualisations/index_remote.html | 14 + visualisations/project_1.html | 8 + 15 files changed, 22401 insertions(+), 157 deletions(-) create mode 100644 visualisations/cross_counterid_techniqueid.csv create mode 100644 visualisations/d3.js create mode 100644 visualisations/grid.js create mode 100644 visualisations/index.html create mode 100644 visualisations/index2.html create mode 100644 visualisations/index_local.html create mode 100644 visualisations/index_remote.html create mode 100644 visualisations/project_1.html diff --git a/AMITT_MASTER_DATA/AMITT_TTPs_MASTER.xlsx b/AMITT_MASTER_DATA/AMITT_TTPs_MASTER.xlsx index ddc84d80bf040ea7cf44a151ef99d51e7060a9c7..8309fb8f46ab13c004363badda50099f1173a6f5 100644 GIT binary patch delta 95412 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 a1QPviAVm6T*Z`#QAOR_%@W4OT2Kax#OhYUH diff --git a/HTML_GENERATING_CODE/.ipynb_checkpoints/AMITT_create_incident_visualisations-checkpoint.ipynb b/HTML_GENERATING_CODE/.ipynb_checkpoints/AMITT_create_incident_visualisations-checkpoint.ipynb index 8acf5cd..b29f0fe 100644 --- a/HTML_GENERATING_CODE/.ipynb_checkpoints/AMITT_create_incident_visualisations-checkpoint.ipynb +++ b/HTML_GENERATING_CODE/.ipynb_checkpoints/AMITT_create_incident_visualisations-checkpoint.ipynb @@ -11,22 +11,22 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -68,13 +68,13 @@ " [ 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0]])" ] }, - "execution_count": 2, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -87,9 +87,10 @@ ], "source": [ "amitt = generate_amitt_ttps.Amitt()\n", + "redgrid = amitt.create_padded_framework_table('AMITT Red', 'technique_ids', False)\n", "\n", "techcounts = amitt.it[['id_incident','id_technique']].drop_duplicates().groupby('id_technique').count().to_dict()['id_incident']\n", - "techlabels = amitt.grid[2:][:]\n", + "techlabels = redgrid[2:][:]\n", "nrows = len(techlabels)\n", "ncols = len(techlabels[0])\n", "techgrid = np.zeros([nrows, ncols], dtype = int)\n", @@ -103,6 +104,858 @@ "techgrid" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamephase_idranksummarylongnametechnique_idscounter_ids
0TA01Strategic PlanningP011Define the desired end state, i.e. the set of ...TA01 - Strategic Planning[T0001, T0002, T0003, T0004][C00006, C00008, C00010, C00012, C00013, C0001...
1TA02Objective PlanningP012Set clearly defined, measurable, and achievabl...TA02 - Objective Planning[T0005, T0006][C00009, C00011, C00028, C00029, C00030, C0003...
2TA03Develop PeopleP023Develop online and offline users and agents, i...TA03 - Develop People[T0007, T0008, T0009][C00034, C00036, C00040, C00042, C00044, C0004...
3TA04Develop NetworksP024Develop online and offline communities and tra...TA04 - Develop Networks[T0010, T0011, T0012, T0013, T0014, T0015][C00047, C00052, C00053, C00056, C00059, C0006...
4TA05MicrotargetingP025Target very specific populations of peopleTA05 - Microtargeting[T0016, T0017, T0018][C00065, C00066, C00216]
5TA06Develop ContentP026Create and acquire content used in incidentTA06 - Develop Content[T0019, T0020, T0021, T0022, T0023, T0024, T00...[C00014, C00032, C00071, C00072, C00074, C0007...
6TA07Channel SelectionP027Set up specific delivery, amplification and ma...TA07 - Channel Selection[T0029, T0030, T0031, T0032, T0033, T0034, T00...[C00097, C00098, C00099, C00100, C00101, C0010...
7TA08Pump PrimingP038Release content on a targetted small scale, pr...TA08 - Pump Priming[T0039, T0040, T0041, T0042, T0043, T0044, T00...[C00112, C00113, C00114, C00115, C00116, C0011...
8TA09ExposureP039Release content to general public or push to l...TA09 - Exposure[T0047, T0048, T0049, T0050, T0051, T0052, T00...[C00089, C00122, C00123, C00124, C00125, C0012...
9TA10Go PhysicalP0310Move incident into offline worldTA10 - Go Physical[T0057, T0061][C00129, C00130]
10TA11PersistenceP0311Keep incident 'alive', beyond the incident cre...TA11 - Persistence[T0058, T0059, T0060][C00131, C00133, C00135, C00136, C00137, C0013...
11TA12Measure EffectivenessP0412Measure effectiveness of incident, for use in ...TA12 - Measure Effectiveness[T0062, T0063, T0064][C00090, C00140, C00147, C00148, C00149]
\n", + "
" + ], + "text/plain": [ + " id name phase_id rank \\\n", + "0 TA01 Strategic Planning P01 1 \n", + "1 TA02 Objective Planning P01 2 \n", + "2 TA03 Develop People P02 3 \n", + "3 TA04 Develop Networks P02 4 \n", + "4 TA05 Microtargeting P02 5 \n", + "5 TA06 Develop Content P02 6 \n", + "6 TA07 Channel Selection P02 7 \n", + "7 TA08 Pump Priming P03 8 \n", + "8 TA09 Exposure P03 9 \n", + "9 TA10 Go Physical P03 10 \n", + "10 TA11 Persistence P03 11 \n", + "11 TA12 Measure Effectiveness P04 12 \n", + "\n", + " summary \\\n", + "0 Define the desired end state, i.e. the set of ... \n", + "1 Set clearly defined, measurable, and achievabl... \n", + "2 Develop online and offline users and agents, i... \n", + "3 Develop online and offline communities and tra... \n", + "4 Target very specific populations of people \n", + "5 Create and acquire content used in incident \n", + "6 Set up specific delivery, amplification and ma... \n", + "7 Release content on a targetted small scale, pr... \n", + "8 Release content to general public or push to l... \n", + "9 Move incident into offline world \n", + "10 Keep incident 'alive', beyond the incident cre... \n", + "11 Measure effectiveness of incident, for use in ... \n", + "\n", + " longname \\\n", + "0 TA01 - Strategic Planning \n", + "1 TA02 - Objective Planning \n", + "2 TA03 - Develop People \n", + "3 TA04 - Develop Networks \n", + "4 TA05 - Microtargeting \n", + "5 TA06 - Develop Content \n", + "6 TA07 - Channel Selection \n", + "7 TA08 - Pump Priming \n", + "8 TA09 - Exposure \n", + "9 TA10 - Go Physical \n", + "10 TA11 - Persistence \n", + "11 TA12 - Measure Effectiveness \n", + "\n", + " technique_ids \\\n", + "0 [T0001, T0002, T0003, T0004] \n", + "1 [T0005, T0006] \n", + "2 [T0007, T0008, T0009] \n", + "3 [T0010, T0011, T0012, T0013, T0014, T0015] \n", + "4 [T0016, T0017, T0018] \n", + "5 [T0019, T0020, T0021, T0022, T0023, T0024, T00... \n", + "6 [T0029, T0030, T0031, T0032, T0033, T0034, T00... \n", + "7 [T0039, T0040, T0041, T0042, T0043, T0044, T00... \n", + "8 [T0047, T0048, T0049, T0050, T0051, T0052, T00... \n", + "9 [T0057, T0061] \n", + "10 [T0058, T0059, T0060] \n", + "11 [T0062, T0063, T0064] \n", + "\n", + " counter_ids \n", + "0 [C00006, C00008, C00010, C00012, C00013, C0001... \n", + "1 [C00009, C00011, C00028, C00029, C00030, C0003... \n", + "2 [C00034, C00036, C00040, C00042, C00044, C0004... \n", + "3 [C00047, C00052, C00053, C00056, C00059, C0006... \n", + "4 [C00065, C00066, C00216] \n", + "5 [C00014, C00032, C00071, C00072, C00074, C0007... \n", + "6 [C00097, C00098, C00099, C00100, C00101, C0010... \n", + "7 [C00112, C00113, C00114, C00115, C00116, C0011... \n", + "8 [C00089, C00122, C00123, C00124, C00125, C0012... \n", + "9 [C00129, C00130] \n", + "10 [C00131, C00133, C00135, C00136, C00137, C0013... \n", + "11 [C00090, C00140, C00147, C00148, C00149] " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amitt.df_tactics" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamesummaryid_incidentname_incidentid_techniquename_technique
0I00002T001buy FB targeted adsI00002#VaccinateUST0018Paid targeted ads
1I00005T003Targeted FB paid adsI00005Brexit voteT0018Paid targeted ads
2I00017T004Targeted FB paid adsI00017US presidential electionsT0018Paid targeted ads
3I00002T002Promote \"funding\" campaignI00002#VaccinateUST0017Promote online funding
4I00002T003create web-site - information pollutionI00002#VaccinateUST0019Generate information pollution
........................
181I00044T008Promote fake “experts” with impressive (and sc...I00044JadeHelm exerciseT0009Create fake experts
182I00047T003(Distort) Kremlin-controlled RT cited Russian ...I00047Sea of AzovT0023Distort facts
183I00053T002Distorted, saccharine “news” about the Chinese...I00053China Huawei CFO ArrestT0023Distort facts
184I00056T005Memes... anti-Isreal/USA/West, conspiracy narr...I00056Iran Influence OperationsT0022Conspiracy narratives
185I00056T006Fake news/synthetic web-sitesI00056Iran Influence OperationsT0008Create fake or imposter news sites
\n", + "

186 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " id name summary \\\n", + "0 I00002T001 buy FB targeted ads \n", + "1 I00005T003 Targeted FB paid ads \n", + "2 I00017T004 Targeted FB paid ads \n", + "3 I00002T002 Promote \"funding\" campaign \n", + "4 I00002T003 create web-site - information pollution \n", + ".. ... ... ... \n", + "181 I00044T008 Promote fake “experts” with impressive (and sc... \n", + "182 I00047T003 (Distort) Kremlin-controlled RT cited Russian ... \n", + "183 I00053T002 Distorted, saccharine “news” about the Chinese... \n", + "184 I00056T005 Memes... anti-Isreal/USA/West, conspiracy narr... \n", + "185 I00056T006 Fake news/synthetic web-sites \n", + "\n", + " id_incident name_incident id_technique \\\n", + "0 I00002 #VaccinateUS T0018 \n", + "1 I00005 Brexit vote T0018 \n", + "2 I00017 US presidential elections T0018 \n", + "3 I00002 #VaccinateUS T0017 \n", + "4 I00002 #VaccinateUS T0019 \n", + ".. ... ... ... \n", + "181 I00044 JadeHelm exercise T0009 \n", + "182 I00047 Sea of Azov T0023 \n", + "183 I00053 China Huawei CFO Arrest T0023 \n", + "184 I00056 Iran Influence Operations T0022 \n", + "185 I00056 Iran Influence Operations T0008 \n", + "\n", + " name_technique \n", + "0 Paid targeted ads \n", + "1 Paid targeted ads \n", + "2 Paid targeted ads \n", + "3 Promote online funding \n", + "4 Generate information pollution \n", + ".. ... \n", + "181 Create fake experts \n", + "182 Distort facts \n", + "183 Distort facts \n", + "184 Conspiracy narratives \n", + "185 Create fake or imposter news sites \n", + "\n", + "[186 rows x 7 columns]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amitt.it" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import tkinter as Tk\n", + "import numpy as np\n", + "\n", + "class Begueradj(Tk.Frame):\n", + " def __init__(self,parent):\n", + " Tk.Frame.__init__(self, parent)\n", + " self.parent = parent\n", + " self.initialize()\n", + "\n", + " def initialize(self):\n", + " '''\n", + " Draw the GUI\n", + " '''\n", + " self.parent.title(\"RUN ON START TEST\") \n", + " self.parent.grid_rowconfigure(1,weight=1)\n", + " self.parent.grid_columnconfigure(1,weight=1)\n", + "\n", + " self.frame = Tk.Frame(self.parent) \n", + " self.frame.pack(fill=Tk.X, padx=5, pady=5)\n", + "\n", + " # Create a 6x7 array of zeros as the one you used\n", + " self.a = np.zeros((6,7))\n", + " for i in range(0,self.a.shape[0]):\n", + " for j in range(0,self.a.shape[1]):\n", + " self.b = Tk.Button(self.frame, text = 'Hello')\n", + " self.b.grid(row=i, column= j)\n", + "\n", + "# Start the main program here \n", + "if __name__ == \"__main__\": \n", + " root=Tk.Tk()\n", + " app = Begueradj(root) \n", + " root.mainloop()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008TA01
1C00008TA06
1C00008TA08
1C00008T0006
1C00008T0009
.........
120C00165T00025
126C00174T0001
138C00197T0007
138C00197T0011
140C00202T0025
\n", + "

263 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 TA01\n", + "1 C00008 TA06\n", + "1 C00008 TA08\n", + "1 C00008 T0006\n", + "1 C00008 T0009\n", + ".. ... ...\n", + "120 C00165 T00025\n", + "126 C00174 T0001\n", + "138 C00197 T0007\n", + "138 C00197 T0011\n", + "140 C00202 T0025\n", + "\n", + "[263 rows x 2 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct = amitt.cross_counterid_techniqueid\n", + "ct[ct['technique_id'] != '']" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
138C00197T0007
\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "138 C00197 T0007" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct[(ct['id'] == 'C00197') & (ct['technique_id'].isin(['T0002', 'T0007']))]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008T0006
1C00008T0009
1C00008T0008
1C00008T0013
1C00008T0014
.........
108C00149T0020
126C00174T0001
138C00197T0007
138C00197T0011
140C00202T0025
\n", + "

190 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 T0006\n", + "1 C00008 T0009\n", + "1 C00008 T0008\n", + "1 C00008 T0013\n", + "1 C00008 T0014\n", + ".. ... ...\n", + "108 C00149 T0020\n", + "126 C00174 T0001\n", + "138 C00197 T0007\n", + "138 C00197 T0011\n", + "140 C00202 T0025\n", + "\n", + "[190 rows x 2 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct = ct[ct['technique_id'].isin(amitt.df_techniques['id'].to_list()) & ct['id'].isin(amitt.df_counters['id'].to_list())]\n", + "ct" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008T0008
24C00042T0022
\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 T0008\n", + "24 C00042 T0022" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "technique_id_list = ['T0007', 'T0008', 'T0022', 'T0023', 'T0043', 'T0052', 'T0036', 'T0037', 'T0038']\n", + "counter_id_list = ['C00009', 'C00008', 'C00042', 'C00030', 'C00093', 'C00193', 'C00073', 'C000197', 'C00174', 'C00205']\n", + "possible_counters_for_techniques = ct[ct['technique_id'].isin(technique_id_list)] \n", + "possible_techniques_for_counters = ct[ct['technique_id'].isin(counter_id_list)] \n", + "coverage = ct[(ct['id'].isin(counter_id_list)) & (ct['technique_id'].isin(technique_id_list))]\n", + "coverage" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/HTML_GENERATING_CODE/AMITT_create_incident_visualisations.ipynb b/HTML_GENERATING_CODE/AMITT_create_incident_visualisations.ipynb index 8acf5cd..e035550 100644 --- a/HTML_GENERATING_CODE/AMITT_create_incident_visualisations.ipynb +++ b/HTML_GENERATING_CODE/AMITT_create_incident_visualisations.ipynb @@ -11,22 +11,22 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -68,13 +68,13 @@ " [ 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0]])" ] }, - "execution_count": 2, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVoAAAD4CAYAAACt8i4nAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deZhU1bnv8e8LNDON4IBIO0bUxOGgIhdEkRPUC8QADrlGTWISI4/mJKLROJ5IMMdEPUaDIeZeYpwNHiNyxPFIHKMBEREVBJUoYsusMopAd7/3j6qWVru7dnWtVdQufp88+6GquutXK5uq182utddr7o6IiMTTalsPQESk3KnQiohEpkIrIhKZCq2ISGQqtCIikbWJ/QJX73lGlGkNY5c+EyOW1/f8lyi5AHuc0TVK7n7jX4uSu/D6YVFyAY7+9xej5PasiLOPZ697N0ouwIiuB0bJfWnT0ii5cz58J0ouQM3mD6zQjC2r3klccyp22qfg10tCR7QiIpFFP6IVESmqutptPYIvUaEVkfJSW7OtR/AlKrQiUlbc67b1EL5EhVZEykudCq2ISFw6ohURiUxfhomIRJbGI1ozOwAYCfQCHFgCTHX3+SEHskf/r3LMhaew6q0PmPfQdBbPCBPfsWMHJvz+N2zevJlnn5vOpElTguS26bkzu449l9qP17L53Q/4cOJfC860brtQcfQorH1HNt33O9oMGE6bQ45i05Sb8RXVBefvsWcV5104msrKLoz+/gUF51Wv3sAt099m/aYarh/VlysfnQNAnTvjhvWhdavC54IfM/Rojjp2AN133IH7bp/Ci8++VHAmQNW+VYz44Ugqu1fy6vNzeOzux4Lkht7HDbXt0I4L7xvHQzfex9ynZgfLjbWPY332cvESnHXQ7AULZnYJcC9gwEzgpeztSWZ2adCRuLPlk020blfBuqUfBYs98cThPPDAI5xz7sV884Tjg+W23bsX6595iaWX/Y62++4RJNM/XsHmqRM/u18z/VFq33w5SDbA4vequei8K4PlVe3QiV8O6/PZ/auG9+Gq4X3o0r6Cles/DfIazz7+d66+6Dp+ef6vOX7E14NkAlQvrObmy//Atedew76H9A6WG3ofN3T8OSN5+ZHpwXNj7eNYn72c6uqSb0WS64j2LOBAd9/S8EEzuwGYB1zT2JPMbDQwGmBk934c0XnfnANZPPNNFr94HZ12quTYX3yHB8fcnGT8OVX16sncuQsAqK0Nd+5m0xv/ZKdzT6Vy+CDWPPhUsNy0e/fDdWypqWPXyg5Bc886/0zuuz3sEVG/4/pxyrnf4pE7Hg6aG8MBAw9m2cJq2rSriPYaofdxrM9eTiV46iDXJbh1wG6NPN4z+7NGuftEd+/r7n2TFNnskwDYuGYDrduGezNVf7CUql49AWjVKtwVx11PPo6VN93D4u9dRufBRwTLTbOFK9dy58x3uOTYg4Lm/vSKc/jHUzN48/W3gubOnDaTi0/6OceMGhw0N4b9BhzI3of25ogRR3HUaUMwC3uJfox9HOuzl1NdbfItBzO71cxWmNncRn52kZm5me2UKyfXEe35wJNm9jbwfvaxPYB9gZ/kHGUe9h/al30GHUL7yk7MuuOJYLlTpjzKTeOvZtiwITz8yLRguRuee5mdzjuD2m8OZkv18jChHTrTdsiptNp1LyqOGomv+5jW+x1Gq516sfm5KfiK93NnNKNbt65c8osxHHjIAfzkgh8x4cZbCspbvXEzE55bwIIVa/jT9Lf4r9mLGLjPLlz7t7mcfWRvenQp/Kj21LNOpt+gvnSu7MTue1cx+c4HC84EOKj/wRw5bAAVbSuY9fSsIJkQfh/Xm3r9vQD0P+UY1n+0jpAtqGLt41ifvZzCHtHeDkwA7mz4oJntDhwHLE4SYrn+wsysFdCPzJdhBlQDL7l7on8LaPWurbR611ZavWsrrd61VYjVuzbNnZa45rQ76Licr2dmewEPu/tBDR67H/gV8CDQ191XNZeRc9aBZ65nm5Hr90RESkIeX3I1/D4pa6K7T2zq97PPGQF84O6vJj2Fo3m0IlJWEv5jO/u7PhFotrA2ZGYdgSuAvKZRqNCKSHmJO+vgK8DeQP3RbBUw28z6ufuypp6kQisi5SXi/Fh3fx3Ypf6+mS0iwTladVgQkfLidcm3HMxsEjAd2N/Mqs3srJYMSUe0IlJearfk/p2E3P20HD/fK0mOCq2IlJftcT3aKZsTzectGceuei9e+Ph40TH87Ffp+rsDWLplzbYeQt7+tOSFbT2E8lKCl+DqiFZEysv2eEQrIlJUKrQiInF5wC/DQlGhFZHyonO0IiKR6dSBiEhkOqIVEYlMR7QiIpHpiLZpaezEGavjadpyIX0dWmPlxtrHMd/HsbK3VRdcalLWBbc5ZvaDkANJYyfOWB1P05YL6evQGis31j6O+T6Olb3NuuAGXFQmlEJW7xrX1A/MbLSZzTKzWSs/aXKJxkbF6MT5fvUSoMidOLcj9R1a165aHe01YnTBjZkbWsz3cazsbfbZK8F2480WWjN7rYntdaBHU89r2AV35467Jh5MWXXi3I6ksUNrzNwYYr6PY2Vvs89eCo9oewDfA77ZyPZhyIHUd+IccsJgTv7eyGC5U6Y8yoknDmfC738TvBNnt25dueaGKz/reLq95k69/l7+etUdvDT1eZ6f9GSUDq2h3xexcmPt45jv41jZMcfcrBI8om22C66Z/Rm4zd2fb+Rnf3H303O9QN+eR0fpghurE2ePTjtEyU2jWN1ZIV6H1liWfvpRtOzlG+KdckmbEF1wNz7w68Q1p8NJl4f951cTmp114O5NriaepMiKiBRdCc46KJnpXSIiQQQ8dRWKCq2IlBddGSYiElkJFlrNdxKR8hK2C+6tZrbCzOY2eOw/zWxBdqrrFDPL+Q26Cq2IlJfa2uRbbrcDQ7/w2DTgIHc/BHgLuCxXSPRTB7GmYaVRrGk8w3Y9NEpuTE8ObRcld8d75kfJ7bPjPlFyQdO7ggt46sDdnzOzvb7w2BMN7s4ATsmVoyNaESkveVyw0HC5gOw2Os9X+yHwWK5f0pdhIlJe8ri01t0nAhNb8jJmdgVQA9yT63dVaEWkrHhd/Hm0ZnYmcAIwxBNcc65CKyLlJfL0LjMbClwCHOPunyR5jgqtiJSXgEsymtkkYDCwk5lVA2PJzDJoB0zLrlQ3w93PaS5HhVZEykvYWQenNfLwn/PNUaEVkfJSgleGqdCKSHnRojIiIpGl8YjWzA4AegEvuvv6Bo8PdffHQw0kjZ0409bxtGrfKkb8cCSV3St59fk5PHZ3znnWiYXugms796T9CadjHTrxyc1XUdH/67Q5oA+0qWDjneNh86cF5cfax2ns5pzGz16zijC9K1+5eoadBzwI/BSYa2YNe378OuRA0tiJM20dT6sXVnPz5X/g2nOvYd9DegfLhfBdcH3lUjbe9tvP7lccNpCNt9/AlpeeoeLwowrOj7WP09jNOY2fvWaFXesgiFyX4J4NHO7uo8hMcfiFmY3J/qzJFhANL2urq9uQaCBl14mzADHH3O+4flw7+Tpee+HVYJnF6IJbf9qt7sMVtOq+c8F5sd8XaermXG6fPa+rS7wVS65C27r+dIG7LyJTbIeZ2Q00U2gbdsFt1apTooGUXSfOAsQc88xpM7n4pJ9zzKjBwTJjd8FtqFX3Xaj7aGXBOTH3cdq6OZfdZ6/Ok29Fkusc7TIz6+PucwDcfb2ZnQDcChwcciBTpjzKTeOvZtiwIcE7ccbIhUzH00t+MeazjqcTbrwlSG6sMR/U/2COHDaAirYVzHp6VrDcqdffC0D/U45h/UfrgnTBtU6VtDv5B7Tac1/afeM0al55gfbfHYO1bcvGu35fcH6sfVzfXbdzZSd237uKyXc+GCQ35vs4jZ+9ZhWxjXhSubrgVgE17r6skZ8NdPcXcr1Am7a9Su/MdDNidsFN2zKJVa06RskFuOZf43SVTeMyiVpKdKsQXXA3XHVG4prT6cp7SqILbnUzP8tZZEVEiq6m9L6L0TxaESkvJXjqQIVWRMpLCc6jVaEVkbJSzGlbSanQikh50RGtiEhkKrSlL40dSR9b9kqU3JhT3a6hZ7Rs2c6V4BWgKrQiUlaK0TMsXyq0IlJeVGhFRCLTrAMRkchK8Ig2HctZiYgkFXD1LjO71cxWmNncBo91N7NpZvZ29s9uuXJUaEWkrHhtXeItgduBoV947FLgSXfvDTyZvd8sFVoRKS8Bj2jd/Tngi0vNjQTuyN6+AxiVK0eFVkTKitd54q1hN5jsNjrBS/Rw96UA2T93yfWEkvkyLG0N4tQsb6sYTSrVnPHz9H7LQx5fhrn7RGBivMFk5DyiNbN+ZnZE9vbXzOxnZjY89EDS1iBOzfK2itGkUs0ZP0/vtzzU5bG1zHIz6wmQ/XNFrifk6oI7FrgJ+KOZ/QaYAHQGLjWzK5p5Xtk3Z1SzvOJSc0a935LymrrEWwtNBc7M3j6TTKfwZuU6oj0FGAgMAv4NGOXuVwH/Gzi1qSdtD80Z1Sxv21BzRr3fcgp4RGtmk4DpwP5mVm1mZwHXAMeZ2dvAcdn7zefk6Bn2irsf+sXb2ftz3L1PrhdI2jOsY8cO3DT+aj79dBMv/GNm0PNEacqNmZ1vbtJFZeqbVB49eACT7pqcqEnlG6OaX1SmvjljmwMPZ8tzj1H34XJa9z54a3PGJs7RJu0Zlu++SNoz7NSzTuaE/zOMN+bM5615CxM1Z0zSM2x7eL9BmJ5hH39rcOKTtN3++kxReoblKrQvAv/q7p+YWSv3TI8IM+sKPO3uh+V6gbQ1Z5StYq7elavQtpSaM6ZbkEJ7ch6FdnJxCm2uWQeD3H0TQH2Rzapg6zkKEZGSkbrVu+qLbCOPrwJWRRmRiEghSm9NmdKZRysiEoLXbOsRfJkKrYiUlRLsNq5CKyJlRoVWRCQuHdGKiESmQiup0rN992jZQx5vdEJLwWLN/V366RdXypNS5bVFmRqbFxVaESkrOqIVEYnM63REKyISlY5oRUQic9cRrYhIVDqiFRGJrE6zDkRE4tKXYSIikZVFoTWzO939e6EHkrZOnOpKulWszq8xs2N07o2Zq/dbcs30MthmcjVnnPqF7SHgpPr7IQeStk6c6kq6VazOrzGzY3TujZmr91tyXmeJt2LJ1TGtClgL3AD8Nruta3C7UeqCW5rZaev8WqzsNND7LTl3S7wVS65C2xd4GbgCWOPuzwAb3f1Zd3+2qSepC25pZqet82sxstNC77fkamst8ZaLmV1gZvPMbK6ZTTKz9i0ZU7PNGRu8WBVwI7AcGOHueyR9AXXBLZ3sUur8mlS+2UkXf2lJ595Yucs3rM75O9vD+w3CNGd884Bhic/S7r/gsSZfz8x6Ac8DX3P3jWZ2H/Cou9+e75gSFdoGL/wNYKC7X570OeqCm14xO7/GksZVtpIU2u1FiEK7YL/hiWvOAW89mqvQzgD+hcwp1P8GbnL3J/IdU17H8+7+SD5FVkSk2NyTbw2/T8puo7fm+AfA9cBiYCmZ06d5F1nQPFoRKTP5zCZw94nAxMZ+ZmbdgJHA3sBq4K9m9h13vzvfMRXvDLWISBHU1rVKvOVwLPCuu6909y3AA8CRLRmTjmhFpKwEvGBhMdDfzDoCG4EhwKyWBKnQikhZqQs0P9bdXzSz+4HZQA3wCk2cZshFhVZEykrICxHcfSwwttAcFVoRKSuluNaBCm0RxerQmsZ5mD0rukbJjTWP9seVfaLkAozd8Ey07O1RqFMHIanQikhZSTCboOhUaEWkrJTgmQMVWhEpLzp1ICISmbrgiohEVoJNcFVoRaS8ODqiFRGJqkanDkRE4kr9Ea2ZHQX0A+a2dF3GpqStE2fMDp9p66Qaswtu1b5VjPjhSCq7V/Lq83N47O7HguRG64Lb/6scc+EprHrrA+Y9NJ3FM+YHyVUX3ORK8Rxtri64MxvcPhuYAHQBxprZpSEHkrZOnDE7fKatk2rMLrjVC6u5+fI/cO2517DvIb2D5cbax7iz5ZNNtG5Xwbql4a5SUxfc5BxLvBVLrksoKhrcHg0c5+7jgOOBM5p6krrglqa0dsHtd1w/rp18Ha+98Grw7NAWz3yTe8+8jqevmcSgn50cLFddcJOry2MrllyFtpWZdTOzHcn0F1sJ4O4byCwb1ih1wS1Nae2CO3PaTC4+6eccM2pw8OzgsiuabFyzgdZtK3L8cnLqgptcLZZ4K5Zc52i7kmk3boCb2a7uvszMOmcfC2bKlEe5afzVDBs2hIcfmbbd5sLWTqoHHnIAP7ngR8E6tMYa86lnnUy/QX3pXNmJ3feuCtoF96D+B3PksAFUtK1g1tMtWnO5UbH28f5D+7LPoENoX9mJWXeE+xoj5vstjZ+R5uTRyaZo8uqC+9mTMiuO93D3d3P9rrrgbpW21btidsGNtXrX7HU535ItEnX1rqXPRMtOmxBdcB/c9fTENWfksr8UpSy3aHqXu38CxHlHi4gUoBSP7DSPVkTKSilO71KhFZGyUmeld5JWhVZEykopTrZMx7wkEZGE6iz5louZ7WBm95vZAjObb2YDWjImHdGKSFmpCzvzdDzwuLufYmZtgY4tCVGhLaK0NVE8ol3PaNnVdZ9Ey47hooe+Fy17bN9nomVvj0LNOjCzSmAQ8H0Ad98MbG5Jlk4diEhZyefUQcPlArLb6AZR+wArgdvM7BUzu8XMkl3q+gUqtCJSVvJZ66DhcgHZbWKDqDbAYcAf3f1QYAPQosW0VGhFpKzUWvIth2qg2t1fzN6/n0zhzZsKrYiUlVCrd7n7MuB9M9s/+9AQ4I2WjElfholIWQl8ZdhPgXuyMw7eAX7QkhAVWhEpKyFbhrn7HKBvoTkqtCJSVrTWgYhIZKV4Ca4KrYiUlVJc+LvZQmtm/wuY7+5rzawDmTlkh5H55u3X7r4m1EDS1olTXUk/r22Hdlx43zgeuvE+5j41O1huWrrgVi9fxZ8mP8G6TzZyw0VnAfDAk9N56NmZ3HbVmILz9X5LrhRPHeSa3nUrUH+t5HgyrW2uzT52W8iBpK0Tp7qSft7x54zk5UemB82E9HTBreqxE+N+fPpn96uXf8jq9RvoVtk5SL7eb8mlsjmju9c3Yezr7ue7+/PZTrhN9jlRF9zSzI6Ve8DAg1m2sJq1q+Ks5ZCmLrgAdXV13PnQU3x3+OBgmXq/Jed5bMWSq9DONbP6eWOvmllfADPbD9jS1JPUBbc0s2Pl7jfgQPY+tDdHjDiKo04bggVeeDlVXXDJHM1+vHY9N9z9IG+9t4S/z55XeKbeb4mFXCYxlFxfhv0IGG9m/w6sAqab2fvA+9mfBZO2TpzqSrrV1OvvBaD/Kcew/qN1tKThZ1PS0gV39boN/H7SwyxYVM0TM17hP3+WOT5Z/uFqjj7swILHq/dbcqU46yBRF1wz60LmVEEbMtf+Lk/6AuqCm15n7zYwWnasZRJjdcF959kbouQCdOr7w2jZaROiC+7Ve56RuOZc8d49pdMF193XAek4QSYi27VSnHWgebQiUlZK8Z/QKrQiUlZ0RCsiElmNld4xrQqtiJSV0iuzKrQiUmZ06kBS5U9LXoiWPWzXQ6PkLrx+WJTcVruFu/xX4qorwWNaFVoRKSulV2ZVaEWkzOjUgYhIZLUleEyrQisiZaUUj2jVblxEyorn8b8kzKy1mb1iZg+3dEw6ohWRshLhiHYMMB+obGmAjmhFpKzU4Ym3XMysCvgGUNA6miq0IlJW8umw0LAbTHYb/YW43wEXU+CBcsmcOkhbgzg1y4ufC+GbM1av3sAt099m/aYarh/VlysfnQNAnTvjhvWhdauWLU/6/gdLmXjnvaxfv4Ebr/53zrnwF/TssQsdO7bn5z85u6Axg95v+ajJY9aBu08EJjb2MzM7AVjh7i+b2eBCxtTsEa2ZnWdmuxfyAkmlrUGcmuXFz4XwzRmrdujEL4f1+ez+VcP7cNXwPnRpX8HK9Z+2OHf3Xj351WVbu+m2b9cO9zp27NatoPHW0/stuYBfhg0ERpjZIuBe4OtmdndLxpTr1MGvgBfN7O9m9mMz2zlJqJozlmZ22nLrxW7O+O6H69hSU8eulR2CZd7wH5fzy0vGsOrDj3hzYeFdH/R+Sy5UF1x3v8zdq9x9L+DbwFPu/p2WjClXoX0HqCJTcA8H3jCzx83szGx7m6YGqOaMJZidttx6MZszLly5ljtnvsMlxx4UNLd+P3TvtgOfbNxYcJ7eb8mFnt4VQrM9w8xstrsf1uB+BTAMOA041t1zHuEm7RnWsWMHbhp/NZ9+uokX/jEz6HmiNOXGzC6l3KSLyjRszvju/EU8eucjzf7+fWMPaPbnqzduZsJzC5jx3kpGHrw7/zV7EQP32YWKVq04+8je9OjS+FFtm5E/bj53zVrG/787mP7SbE7+5lDefe992rdvR21tHWMv/mmzhabDbkc3mw3bz/stRM+wM/c6OXEFvWPR5KL0DMtVaF9x90Y/EWbWwd1z/qdazRmlMbFW78pVaFsqV6EtRJJCu70IUWi/s+dJiWvO3e89UBLNGU9t6gdJiqyISLGlbplEd3+rWAMREQmhmOdekyqZebQiIiGU4qIyKrQiUlZSd+pARCRtdOpARCSy2mZmUm0rKrQiUlZ06kAk67Flr0TJ7XJunNweFxW2mI0Uj74MExGJTOdoRUQi06kDEZHImltWYFtRoRWRsqJ24yIikenUgYhIZDp1ICISmY5oRUQiS930LjNrS6ZXzhJ3/5uZnQ4cCcwHJrr7llADSVsnTnUljZ8bMztW7h57VnHehaOprOzC6O9fkPsJCWkfJ1eKl+DmauRzG/ANYIyZ3QV8C3gROAK4JeRA0taJU11J4+fGzI6Vu/i9ai4678pgefW0j5OrwxNvxZKr0B7s7qcCJwLHA6e4+13AD4Ame5GoC25pZqctN2b2turQ2lLax8mlsdC2yp4+6AJ0BLpmH28HVDT1JHXBLc3stOXGzN5WHVpbSvs4OXdPvDXHzHY3s6fNbL6ZzTOzMS0dU67mjBcAPwVaA78FRpJpQd4fuN/dx+V6AXXBLZ3stOXGzM43t0enHRLlduvWlUt+MYajBw9g0l2TmXBj7jNsyzesDj7efJTKPoYwzRn77XZM4kPVmUuebfL1zKwn0NPdZ5tZF+BlYJS7v5HvmJottNkX2w3A3ZeY2Q7AscBid5+Z5AXUBVfKQdJC2xJJCu32IkShPWK3QYlrzktLnkv8emb2IDDB3aflO6ac07vcfUmD26uB+/N9ERGRYqn15AslmtloYHSDhya6+8RGfm8vMt9LvdiSMWkerYiUlXyuDMsW1S8V1obMrDMwGTjf3de2ZEwqtCJSVkLOJjCzCjJF9h53f6ClOSq0IlJWQl0ZZmYG/BmY7+43FJJV+vNaRETyUOeeeMthIPBd4OtmNie7DW/JmHREKyJlJdQRrbs/DxQ8CwJUaEWkzOQz66BYVGhFElh477nRsrt88zfRsrdHCU4JFJ0KrYiUldQtkygikjY6ohURiUxHtCIikdV66S17qUIrImVFzRlFRCJTc0YRkch0RCsiElkqZx2Y2VfI9AzbHagB3gYmufuakANJWydOdSWNnxszO3Ru9ao13PLELNZv3MT1Zw3ntr+9zOIVq/l4/UbGnXEsXTu1L6nxFiN7W3XBLcVZB80uKmNm5wH/F2hPpvNtBzIFd7qZDQ45kLR14lRX0vi5MbND51bt1JVfnj7ks/s/OPZwxp4+hMN792LZ6nUF52sfJ1frdYm3Ysm1etfZwFB3/w8yLWy+5u5XAEOBG5t6krrglmZ22nJjZsfu0LqlppZxf3mS5+ctome3yoLztI+TC9WcMaQkyyTWn15oR6YbLu6+GHXBVVfSyLkxs2N3aK1o05qxpw/hpCMP4pnX3yk4T/s4uYDLJAaTqwvuGOAsYAYwCLjW3W8zs52Bye4+KNcLqAtu6WSnLTdmdr656x66rNmfr96wkQkPz2DGgsWcOOBA1m3cxKdbalj7ySYuHHUUO1Z2bPK5SRaV2R72MYRpztit876JK+jH6xcGWQYxlyRdcA8EvgrMdfcF+b6AuuBKOchVaAuh1bu2ClFou3b+SuKas2b9P4tSaJN0wZ0HzCvCWERECqZ5tCIikWnhbxGRyFJ5wYKISJqU4qkDdcEVkbLiefwvFzMbamZvmtlCM7u0pWPSEa2IlJVQR7Rm1hr4A3AcUA28ZGZT3f2NfLNUaEWkrAQ8R9sPWOju7wCY2b3ASCDvQpvX5WqxN2B02rLTlpvGMWtfaF/E/P8MzGqwjW7ws1OAWxrc/y4woSWvU2rnaEenMDttuTGz05YbMzttuTGzY465IN5guYDsNrHBjxu7mKFFh8ulVmhFREpFNZnVCutVAUtaEqRCKyLSuJeA3ma2t5m1Bb4NTG1JUKl9GTYx96+UXHbacmNmpy03ZnbacmNmxxxzNO5eY2Y/Af4HaA3c6pklCfKWc1EZEREpjE4diIhEpkIrIhJZyRTaUJe6NZJ7q5mtMLO5oTKzubub2dNmNt/M5mUXSQ+R297MZprZq9nccSFyG+S3NrNXzOzhwLmLzOx1M5tjZrMC5u5gZveb2YLsvh4QIHP/7Djrt7Vmdn6g8V6Q/Xuba2aTzKywroyfzx6TzZ1XyHgb+0yYWXczm2Zmb2f/7BYw+1vZMdeZWd+WjjvVtvWE4ew54tbAP4F9gLbAq2T6k4XIHgQcRmbh8pBj7gkclr3dBXgrxJjJzN3rnL1dAbwI9A847p8BfwEeDrw/FgE7RXhv3AH8KHu7LbBD4PzWwDJgzwBZvYB3gQ7Z+/cB3w80zoOAuUBHMl9i/w3o3cKsL30mgOuAS7O3LyXTTSVU9leB/YFngL6h3yNp2ErliPazS93cfTNQf6lbwdz9OeCjEFlfyF3q7rOzt9cB88l80ArNdXdfn71bkd2CfGNpZlXAN4BbQuTFZmaVZD64fwZw983uvjrwywwB/unu7wXKawN0MLM2ZIpii+ZdNuKrwAx3/8Tda4BngRNbEtTEZ2Ikmf+okf1zVKhsd5/v7m+2JK9clEqh7QW83+B+NXlQ4lAAAAKMSURBVAGKVrGY2V7AoWSOPkPktTazOcAKYJq7B8kFfgdcDMRYGdmBJ8zsZTMLdSXQPsBK4Lbs6Y5bzCxZt8/kvg1MChHk7h8A1wOLgaXAGnd/IkQ2maPZQWa2o5l1BIbz+cn0herh7kshcxAB7BIwe7tXKoU22KVuxWZmnYHJwPnuvjZEprvXunsfMlei9DOzgwrNNLMTgBXu/nLBA2zcQHc/DBgG/JuZ5WzcmUAbMv8M/aO7HwpsIPPP2iCyk9BHAH8NlNeNzJHh3sBuQCcz+06IbHefD1wLTAMeJ3N6rSZEtsRXKoU22KVuxWRmFWSK7D3u/kDo/Ow/k58BhgaIGwiMMLNFZE7NfN3M7g6QC4C7L8n+uQKYQuZ0UKGqgeoGR/T3kym8oQwDZrv78kB5xwLvuvtKd98CPAAcGSgbd/+zux/mme7THwFvh8oGlptZT4DsnysCZm/3SqXQBrvUrVjMzMicO5zv7jcEzN3ZzHbI3u5A5sObd/fhL3L3y9y9yt33IrN/n3L3IEdbZtbJzLrU3waOJ/NP3YK4+zLgfTPbP/vQEFqyRF3TTiPQaYOsxUB/M+uYfX8MIXPuPggz2yX75x7ASYQd+1TgzOztM4EHA2bLtv42rn4jc87pLTKzD64ImDuJzPmyLWSOkM4KlHsUmdMbrwFzstvwALmHAK9kc+cCV0bY14MJOOuAzLnUV7PbvMB/f33ILF/3GvDfQLdAuR2BD4GugfftODL/YZwL3AW0C5j9dzL/oXkVGFJAzpc+E8COwJNkjpKfBLoHzD4xe3sTsBz4n5D7PA2bLsEVEYmsVE4diIiULRVaEZHIVGhFRCJToRURiUyFVkQkMhVaEZHIVGhFRCL7/8Id/hKYo/EzAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] @@ -87,9 +87,10 @@ ], "source": [ "amitt = generate_amitt_ttps.Amitt()\n", + "redgrid = amitt.create_padded_framework_table('AMITT Red', 'technique_ids', False)\n", "\n", "techcounts = amitt.it[['id_incident','id_technique']].drop_duplicates().groupby('id_technique').count().to_dict()['id_incident']\n", - "techlabels = amitt.grid[2:][:]\n", + "techlabels = redgrid[2:][:]\n", "nrows = len(techlabels)\n", "ncols = len(techlabels[0])\n", "techgrid = np.zeros([nrows, ncols], dtype = int)\n", @@ -103,6 +104,1276 @@ "techgrid" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamephase_idranksummarylongnametechnique_idscounter_ids
0TA01Strategic PlanningP011Define the desired end state, i.e. the set of ...TA01 - Strategic Planning[T0001, T0002, T0003, T0004][C00006, C00008, C00010, C00012, C00013, C0001...
1TA02Objective PlanningP012Set clearly defined, measurable, and achievabl...TA02 - Objective Planning[T0005, T0006][C00009, C00011, C00028, C00029, C00030, C0003...
2TA03Develop PeopleP023Develop online and offline users and agents, i...TA03 - Develop People[T0007, T0008, T0009][C00034, C00036, C00040, C00042, C00044, C0004...
3TA04Develop NetworksP024Develop online and offline communities and tra...TA04 - Develop Networks[T0010, T0011, T0012, T0013, T0014, T0015][C00047, C00052, C00053, C00056, C00059, C0006...
4TA05MicrotargetingP025Target very specific populations of peopleTA05 - Microtargeting[T0016, T0017, T0018][C00065, C00066, C00216]
5TA06Develop ContentP026Create and acquire content used in incidentTA06 - Develop Content[T0019, T0020, T0021, T0022, T0023, T0024, T00...[C00014, C00032, C00071, C00072, C00074, C0007...
6TA07Channel SelectionP027Set up specific delivery, amplification and ma...TA07 - Channel Selection[T0029, T0030, T0031, T0032, T0033, T0034, T00...[C00097, C00098, C00099, C00100, C00101, C0010...
7TA08Pump PrimingP038Release content on a targetted small scale, pr...TA08 - Pump Priming[T0039, T0040, T0041, T0042, T0043, T0044, T00...[C00112, C00113, C00114, C00115, C00116, C0011...
8TA09ExposureP039Release content to general public or push to l...TA09 - Exposure[T0047, T0048, T0049, T0050, T0051, T0052, T00...[C00089, C00122, C00123, C00124, C00125, C0012...
9TA10Go PhysicalP0310Move incident into offline worldTA10 - Go Physical[T0057, T0061][C00129, C00130]
10TA11PersistenceP0311Keep incident 'alive', beyond the incident cre...TA11 - Persistence[T0058, T0059, T0060][C00131, C00133, C00135, C00136, C00137, C0013...
11TA12Measure EffectivenessP0412Measure effectiveness of incident, for use in ...TA12 - Measure Effectiveness[T0062, T0063, T0064][C00090, C00140, C00147, C00148, C00149]
\n", + "
" + ], + "text/plain": [ + " id name phase_id rank \\\n", + "0 TA01 Strategic Planning P01 1 \n", + "1 TA02 Objective Planning P01 2 \n", + "2 TA03 Develop People P02 3 \n", + "3 TA04 Develop Networks P02 4 \n", + "4 TA05 Microtargeting P02 5 \n", + "5 TA06 Develop Content P02 6 \n", + "6 TA07 Channel Selection P02 7 \n", + "7 TA08 Pump Priming P03 8 \n", + "8 TA09 Exposure P03 9 \n", + "9 TA10 Go Physical P03 10 \n", + "10 TA11 Persistence P03 11 \n", + "11 TA12 Measure Effectiveness P04 12 \n", + "\n", + " summary \\\n", + "0 Define the desired end state, i.e. the set of ... \n", + "1 Set clearly defined, measurable, and achievabl... \n", + "2 Develop online and offline users and agents, i... \n", + "3 Develop online and offline communities and tra... \n", + "4 Target very specific populations of people \n", + "5 Create and acquire content used in incident \n", + "6 Set up specific delivery, amplification and ma... \n", + "7 Release content on a targetted small scale, pr... \n", + "8 Release content to general public or push to l... \n", + "9 Move incident into offline world \n", + "10 Keep incident 'alive', beyond the incident cre... \n", + "11 Measure effectiveness of incident, for use in ... \n", + "\n", + " longname \\\n", + "0 TA01 - Strategic Planning \n", + "1 TA02 - Objective Planning \n", + "2 TA03 - Develop People \n", + "3 TA04 - Develop Networks \n", + "4 TA05 - Microtargeting \n", + "5 TA06 - Develop Content \n", + "6 TA07 - Channel Selection \n", + "7 TA08 - Pump Priming \n", + "8 TA09 - Exposure \n", + "9 TA10 - Go Physical \n", + "10 TA11 - Persistence \n", + "11 TA12 - Measure Effectiveness \n", + "\n", + " technique_ids \\\n", + "0 [T0001, T0002, T0003, T0004] \n", + "1 [T0005, T0006] \n", + "2 [T0007, T0008, T0009] \n", + "3 [T0010, T0011, T0012, T0013, T0014, T0015] \n", + "4 [T0016, T0017, T0018] \n", + "5 [T0019, T0020, T0021, T0022, T0023, T0024, T00... \n", + "6 [T0029, T0030, T0031, T0032, T0033, T0034, T00... \n", + "7 [T0039, T0040, T0041, T0042, T0043, T0044, T00... \n", + "8 [T0047, T0048, T0049, T0050, T0051, T0052, T00... \n", + "9 [T0057, T0061] \n", + "10 [T0058, T0059, T0060] \n", + "11 [T0062, T0063, T0064] \n", + "\n", + " counter_ids \n", + "0 [C00006, C00008, C00010, C00012, C00013, C0001... \n", + "1 [C00009, C00011, C00028, C00029, C00030, C0003... \n", + "2 [C00034, C00036, C00040, C00042, C00044, C0004... \n", + "3 [C00047, C00052, C00053, C00056, C00059, C0006... \n", + "4 [C00065, C00066, C00216] \n", + "5 [C00014, C00032, C00071, C00072, C00074, C0007... \n", + "6 [C00097, C00098, C00099, C00100, C00101, C0010... \n", + "7 [C00112, C00113, C00114, C00115, C00116, C0011... \n", + "8 [C00089, C00122, C00123, C00124, C00125, C0012... \n", + "9 [C00129, C00130] \n", + "10 [C00131, C00133, C00135, C00136, C00137, C0013... \n", + "11 [C00090, C00140, C00147, C00148, C00149] " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amitt.df_tactics" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamesummaryid_incidentname_incidentid_techniquename_technique
0I00002T001buy FB targeted adsI00002#VaccinateUST0018Paid targeted ads
1I00005T003Targeted FB paid adsI00005Brexit voteT0018Paid targeted ads
2I00017T004Targeted FB paid adsI00017US presidential electionsT0018Paid targeted ads
3I00002T002Promote \"funding\" campaignI00002#VaccinateUST0017Promote online funding
4I00002T003create web-site - information pollutionI00002#VaccinateUST0019Generate information pollution
........................
181I00044T008Promote fake “experts” with impressive (and sc...I00044JadeHelm exerciseT0009Create fake experts
182I00047T003(Distort) Kremlin-controlled RT cited Russian ...I00047Sea of AzovT0023Distort facts
183I00053T002Distorted, saccharine “news” about the Chinese...I00053China Huawei CFO ArrestT0023Distort facts
184I00056T005Memes... anti-Isreal/USA/West, conspiracy narr...I00056Iran Influence OperationsT0022Conspiracy narratives
185I00056T006Fake news/synthetic web-sitesI00056Iran Influence OperationsT0008Create fake or imposter news sites
\n", + "

186 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " id name summary \\\n", + "0 I00002T001 buy FB targeted ads \n", + "1 I00005T003 Targeted FB paid ads \n", + "2 I00017T004 Targeted FB paid ads \n", + "3 I00002T002 Promote \"funding\" campaign \n", + "4 I00002T003 create web-site - information pollution \n", + ".. ... ... ... \n", + "181 I00044T008 Promote fake “experts” with impressive (and sc... \n", + "182 I00047T003 (Distort) Kremlin-controlled RT cited Russian ... \n", + "183 I00053T002 Distorted, saccharine “news” about the Chinese... \n", + "184 I00056T005 Memes... anti-Isreal/USA/West, conspiracy narr... \n", + "185 I00056T006 Fake news/synthetic web-sites \n", + "\n", + " id_incident name_incident id_technique \\\n", + "0 I00002 #VaccinateUS T0018 \n", + "1 I00005 Brexit vote T0018 \n", + "2 I00017 US presidential elections T0018 \n", + "3 I00002 #VaccinateUS T0017 \n", + "4 I00002 #VaccinateUS T0019 \n", + ".. ... ... ... \n", + "181 I00044 JadeHelm exercise T0009 \n", + "182 I00047 Sea of Azov T0023 \n", + "183 I00053 China Huawei CFO Arrest T0023 \n", + "184 I00056 Iran Influence Operations T0022 \n", + "185 I00056 Iran Influence Operations T0008 \n", + "\n", + " name_technique \n", + "0 Paid targeted ads \n", + "1 Paid targeted ads \n", + "2 Paid targeted ads \n", + "3 Promote online funding \n", + "4 Generate information pollution \n", + ".. ... \n", + "181 Create fake experts \n", + "182 Distort facts \n", + "183 Distort facts \n", + "184 Conspiracy narratives \n", + "185 Create fake or imposter news sites \n", + "\n", + "[186 rows x 7 columns]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "amitt.it" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "import tkinter as Tk\n", + "import numpy as np\n", + "\n", + "class Begueradj(Tk.Frame):\n", + " def __init__(self,parent):\n", + " Tk.Frame.__init__(self, parent)\n", + " self.parent = parent\n", + " self.initialize()\n", + "\n", + " def initialize(self):\n", + " '''\n", + " Draw the GUI\n", + " '''\n", + " self.parent.title(\"RUN ON START TEST\") \n", + " self.parent.grid_rowconfigure(1,weight=1)\n", + " self.parent.grid_columnconfigure(1,weight=1)\n", + "\n", + " self.frame = Tk.Frame(self.parent) \n", + " self.frame.pack(fill=Tk.X, padx=5, pady=5)\n", + "\n", + " # Create a 6x7 array of zeros as the one you used\n", + " self.a = np.zeros((6,7))\n", + " for i in range(0,self.a.shape[0]):\n", + " for j in range(0,self.a.shape[1]):\n", + " self.b = Tk.Button(self.frame, text = 'Hello')\n", + " self.b.grid(row=i, column= j)\n", + "\n", + "# Start the main program here \n", + "if __name__ == \"__main__\": \n", + " root=Tk.Tk()\n", + " app = Begueradj(root) \n", + " root.mainloop()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008TA01
1C00008TA06
1C00008TA08
1C00008T0006
1C00008T0009
.........
120C00165T00025
126C00174T0001
138C00197T0007
138C00197T0011
140C00202T0025
\n", + "

263 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 TA01\n", + "1 C00008 TA06\n", + "1 C00008 TA08\n", + "1 C00008 T0006\n", + "1 C00008 T0009\n", + ".. ... ...\n", + "120 C00165 T00025\n", + "126 C00174 T0001\n", + "138 C00197 T0007\n", + "138 C00197 T0011\n", + "140 C00202 T0025\n", + "\n", + "[263 rows x 2 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct = amitt.cross_counterid_techniqueid\n", + "ct[ct['technique_id'] != '']" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
138C00197T0007
\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "138 C00197 T0007" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct[(ct['id'] == 'C00197') & (ct['technique_id'].isin(['T0002', 'T0007']))]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008T0006
1C00008T0009
1C00008T0008
1C00008T0013
1C00008T0014
.........
108C00149T0020
126C00174T0001
138C00197T0007
138C00197T0011
140C00202T0025
\n", + "

190 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 T0006\n", + "1 C00008 T0009\n", + "1 C00008 T0008\n", + "1 C00008 T0013\n", + "1 C00008 T0014\n", + ".. ... ...\n", + "108 C00149 T0020\n", + "126 C00174 T0001\n", + "138 C00197 T0007\n", + "138 C00197 T0011\n", + "140 C00202 T0025\n", + "\n", + "[190 rows x 2 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ct = ct[ct['technique_id'].isin(amitt.df_techniques['id'].to_list()) & ct['id'].isin(amitt.df_counters['id'].to_list())]\n", + "ct" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008T0008
24C00042T0022
\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 T0008\n", + "24 C00042 T0022" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "technique_id_list = ['T0007', 'T0008', 'T0022', 'T0023', 'T0043', 'T0052', 'T0036', 'T0037', 'T0038']\n", + "counter_id_list = ['C00009', 'C00008', 'C00042', 'C00030', 'C00093', 'C00193', 'C00073', 'C000197', 'C00174', 'C00205']\n", + "possible_counters_for_techniques = ct[ct['technique_id'].isin(technique_id_list)] \n", + "possible_techniques_for_counters = ct[ct['id'].isin(counter_id_list)] \n", + "coverage = ct[(ct['id'].isin(counter_id_list)) & (ct['technique_id'].isin(technique_id_list))]\n", + "coverage" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008T0006
1C00008T0009
1C00008T0008
1C00008T0013
1C00008T0014
2C00009T0010
2C00009T0029
24C00042T0004
24C00042T0019
24C00042T0022
24C00042T0027
24C00042T0028
24C00042T0042
24C00042T0044
24C00042T0056
24C00042T0059
43C00073T0012
43C00073T0019
43C00073T0056
60C00093T0010
60C00093T0017
60C00093T0039
60C00093T0047
60C00093T0048
60C00093T0053
126C00174T0001
\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 T0006\n", + "1 C00008 T0009\n", + "1 C00008 T0008\n", + "1 C00008 T0013\n", + "1 C00008 T0014\n", + "2 C00009 T0010\n", + "2 C00009 T0029\n", + "24 C00042 T0004\n", + "24 C00042 T0019\n", + "24 C00042 T0022\n", + "24 C00042 T0027\n", + "24 C00042 T0028\n", + "24 C00042 T0042\n", + "24 C00042 T0044\n", + "24 C00042 T0056\n", + "24 C00042 T0059\n", + "43 C00073 T0012\n", + "43 C00073 T0019\n", + "43 C00073 T0056\n", + "60 C00093 T0010\n", + "60 C00093 T0017\n", + "60 C00093 T0039\n", + "60 C00093 T0047\n", + "60 C00093 T0048\n", + "60 C00093 T0053\n", + "126 C00174 T0001" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "possible_techniques_for_counters" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_id
1C00008T0008
5C00012T0007
5C00012T0043
7C00014T0008
8C00016T0043
13C00024T0022
13C00024T0023
15C00027T0022
15C00027T0023
22C00036T0007
24C00042T0022
31C00053T0008
40C00070T0008
40C00070T0052
42C00072T0022
44C00074T0022
59C00092T0023
62C00096T0022
64C00098T0038
79C00115T0052
84C00120T0052
85C00121T0043
87C00123T0052
90C00126T0052
95C00133T0007
96C00135T0007
138C00197T0007
\n", + "
" + ], + "text/plain": [ + " id technique_id\n", + "1 C00008 T0008\n", + "5 C00012 T0007\n", + "5 C00012 T0043\n", + "7 C00014 T0008\n", + "8 C00016 T0043\n", + "13 C00024 T0022\n", + "13 C00024 T0023\n", + "15 C00027 T0022\n", + "15 C00027 T0023\n", + "22 C00036 T0007\n", + "24 C00042 T0022\n", + "31 C00053 T0008\n", + "40 C00070 T0008\n", + "40 C00070 T0052\n", + "42 C00072 T0022\n", + "44 C00074 T0022\n", + "59 C00092 T0023\n", + "62 C00096 T0022\n", + "64 C00098 T0038\n", + "79 C00115 T0052\n", + "84 C00120 T0052\n", + "85 C00121 T0043\n", + "87 C00123 T0052\n", + "90 C00126 T0052\n", + "95 C00133 T0007\n", + "96 C00135 T0007\n", + "138 C00197 T0007" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "possible_counters_for_techniques" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/HTML_GENERATING_CODE/generate_amitt_ttps.py b/HTML_GENERATING_CODE/generate_amitt_ttps.py index 2e6eb82..865e3cf 100644 --- a/HTML_GENERATING_CODE/generate_amitt_ttps.py +++ b/HTML_GENERATING_CODE/generate_amitt_ttps.py @@ -653,6 +653,15 @@ function handleTechniqueClick(box) {{ dfw = dfw.sort_values(by='count', ascending=False) return(dfw) + + def analyse_coverage(self, technique_id_list, counter_id_list): + ct = self.cross_counterid_techniqueid.copy() + ct = ct[ct['technique_id'].isin(self.df_techniques['id'].to_list()) & ct['id'].isin(self.df_counters['id'].to_list())] + possible_counters_for_techniques = ct[ct['technique_id'].isin(technique_id_list)] + possible_techniques_for_counters = ct[ct['technique_id'].isin(counter_id_list)] + coverage = ct[(ct['id'].isin(counter_id_list)) & (ct['technique_id'].isin(technique_id_list))] + return coverage, possible_counters_for_techniques, possible_techniques_for_counters + def write_counts_table_to_file(self, objectname, objectdict, counts_table, outfile): html = '''# AMITT {} courses of action diff --git a/HTML_GENERATING_CODE/test_new_code.ipynb b/HTML_GENERATING_CODE/test_new_code.ipynb index f470ca0..f3c8c84 100644 --- a/HTML_GENERATING_CODE/test_new_code.ipynb +++ b/HTML_GENERATING_CODE/test_new_code.ipynb @@ -17,19 +17,12 @@ "updated ../amitt_blue_framework_clickable.html\n", "updated ../phases_index.md\n", "updated ../tactics_index.md\n", - "Updating ../tactics/TA06.md\n", - "Updating ../tactics/TA12.md\n", "updated ../techniques_index.md\n", - "Updating ../techniques/T0025.md\n", - "Updating ../techniques/T0062.md\n", - "Updating ../techniques/T0063.md\n", - "Updating ../techniques/T0064.md\n", "updated ../tasks_index.md\n", - "Updating ../tasks/.md\n", "updated ../incidents_index.md\n", "updated ../counters_index.md\n", + "Updating ../counters/C00194.md\n", "updated ../metatechniques_index.md\n", - "Updating ../metatechniques/M001.md\n", "updated ../actors_index.md\n", "updated ../responsetype_index.md\n", "updated ../detections_index.md\n", @@ -103,136 +96,6 @@ "amitt = Amitt()" ] }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "updated ../amitt_red_framework.md\n", - "updated ../amitt_red_framework_clickable.html\n", - "updated ../amitt_blue_framework.md\n", - "updated ../amitt_blue_framework_clickable.html\n" - ] - } - ], - "source": [ - "amitt.write_amitt_frameworks()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "updated ../amitt_blue_framework.md\n", - "updated ../amitt_blue_framework_clickable.html\n" - ] - } - ], - "source": [ - "amitt.write_amitt_blue_framework_file(outfile = '../amitt_blue_framework.md')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max(amitt.df_tactics['technique_ids'].apply(len))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 [T0001, T0002, T0003, T0004]\n", - "1 [T0005, T0006]\n", - "2 [T0007, T0008, T0009]\n", - "3 [T0010, T0011, T0012, T0013, T0014, T0015]\n", - "4 [T0016, T0017, T0018]\n", - "5 [T0019, T0020, T0021, T0022, T0023, T0024, T00...\n", - "6 [T0029, T0030, T0031, T0032, T0033, T0034, T00...\n", - "7 [T0039, T0040, T0041, T0042, T0043, T0044, T00...\n", - "8 [T0047, T0048, T0049, T0050, T0051, T0052, T00...\n", - "9 [T0057, T0061]\n", - "10 [T0058, T0059, T0060]\n", - "11 \n", - "Name: technique_ids, dtype: object" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "amitt.df_tactics['technique_ids']" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "12" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(amitt.padded_techniques_tactics_table)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "12" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "amitt.max_num_techniques_per_tactic" - ] - }, { "cell_type": "code", "execution_count": 13, @@ -240,8 +103,117 @@ "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtechnique_idWeight
1C00008TA011
1C00008TA061
1C00008TA081
1C00008T00061
1C00008T00091
............
120C00165T000251
126C00174T00011
138C00197T00071
138C00197T00111
140C00202T00251
\n", + "

263 rows × 3 columns

\n", + "
" + ], "text/plain": [ - "'xx'" + " id technique_id Weight\n", + "1 C00008 TA01 1\n", + "1 C00008 TA06 1\n", + "1 C00008 TA08 1\n", + "1 C00008 T0006 1\n", + "1 C00008 T0009 1\n", + ".. ... ... ...\n", + "120 C00165 T00025 1\n", + "126 C00174 T0001 1\n", + "138 C00197 T0007 1\n", + "138 C00197 T0011 1\n", + "140 C00202 T0025 1\n", + "\n", + "[263 rows x 3 columns]" ] }, "execution_count": 13, @@ -249,6 +221,19 @@ "output_type": "execute_result" } ], + "source": [ + "ct = amitt.cross_counterid_techniqueid\n", + "ct['Weight'] = 1\n", + "ct = ct[ct['technique_id'].str.len() > 0]\n", + "ct.to_csv('../visualisations/cross_counterid_techniqueid.csv', index=False, header=['Source','Target', 'Weight'])\n", + "ct" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], "source": [] }, { diff --git a/counters/C00194.md b/counters/C00194.md index 12bee95..04afbdf 100644 --- a/counters/C00194.md +++ b/counters/C00194.md @@ -1,6 +1,6 @@ # Counter C00194: Provide an alternative to Russian information by expanding and improving local content. -* **Summary**: To effectively compete, others argue, is to develop content that can displace the pro-Russia narrative. given the importance of affecting the entire media environment, we should note that these recommendations for alternative content span both new and old media alike. +* **Summary**: Develop content that can displace geopolitically-motivated narratives in the entire media environment, both new and old media alike. * **Playbooks**: diff --git a/counters_index.md b/counters_index.md index 9d8515c..46b26cc 100644 --- a/counters_index.md +++ b/counters_index.md @@ -1107,7 +1107,7 @@ Note: This sounds eerlily like many Reddit communities where the most upvoted co C00194 Provide an alternative to Russian information by expanding and improving local content. -To effectively compete, others argue, is to develop content that can displace the pro-Russia narrative. given the importance of affecting the entire media environment, we should note that these recommendations for alternative content span both new and old media alike. +Develop content that can displace geopolitically-motivated narratives in the entire media environment, both new and old media alike. M002 - diversion TA09 Exposure D3 Disrupt diff --git a/visualisations/cross_counterid_techniqueid.csv b/visualisations/cross_counterid_techniqueid.csv new file mode 100644 index 0000000..5f12d17 --- /dev/null +++ b/visualisations/cross_counterid_techniqueid.csv @@ -0,0 +1,264 @@ +Source,Target,Weight +C00008,TA01,1 +C00008,TA06,1 +C00008,TA08,1 +C00008,T0006,1 +C00008,T0009,1 +C00008,T0008,1 +C00008,T0013,1 +C00008,T0014,1 +C00009,TA08,1 +C00009,T0010,1 +C00009,T0029,1 +C00010,TA05,1 +C00010,T00018,1 +C00011,TA03,1 +C00011,TA04,1 +C00011,TA05,1 +C00011,TA08,1 +C00011,TA09,1 +C00011,T0059,1 +C00012,TA07,1 +C00012,TA09,1 +C00012,TA10,1 +C00012,T0002,1 +C00012,T0007,1 +C00012,T0014,1 +C00012,T0015,1 +C00012,T0025,1 +C00012,T0043,1 +C00012,T0046,1 +C00012,T0047,1 +C00012,T0048,1 +C00012,T0051,1 +C00012,T0055,1 +C00014,TA01,1 +C00014,TA06,1 +C00014,TA08,1 +C00014,T0006,1 +C00014,T0009,1 +C00014,T0008,1 +C00014,T0013,1 +C00014,T0014,1 +C00016,TA07,1 +C00016,T0043,1 +C00019,TA08,1 +C00019,TA09,1 +C00019,TA10,1 +C00021,All,1 +C00022,T0002,1 +C00024,TA01,1 +C00024,T0006,1 +C00024,T0027,1 +C00024,T0022,1 +C00024,T0023,1 +C00026,T0002,1 +C00027,TA01,1 +C00027,TA08,1 +C00027,T0006,1 +C00027,T0022,1 +C00027,T0023,1 +C00027,T0027,1 +C00027,T0047,1 +C00027,T0048,1 +C00027,T0053,1 +C00028,TA07,1 +C00028,TA08,1 +C00028,TA09,1 +C00028,TA10,1 +C00031,T0002,1 +C00031,T0003,1 +C00031,T0006,1 +C00036,T0005,1 +C00036,T0007,1 +C00036,T0017,1 +C00036,T0025,1 +C00036,T0056,1 +C00036,T0057,1 +C00040,T0009,1 +C00042,T0004,1 +C00042,T0019,1 +C00042,T0022,1 +C00042,T0027,1 +C00042,T0028,1 +C00042,T0042,1 +C00042,T0044,1 +C00042,T0056,1 +C00042,T0059,1 +C00044,TA07,1 +C00044,T0049,1 +C00044,T0054,1 +C00048,TA08,1 +C00048,T0048,1 +C00048,T0057,1 +C00048,T0061,1 +C00051,T0012,1 +C00052,T0012,1 +C00053,T0011,1 +C00053,TA06,1 +C00053,T0008,1 +C00058,T0017,1 +C00058,T0061,1 +C00060,TA07,1 +C00060,T0047,1 +C00062,All,1 +C00065,T0018,1 +C00066,T0015,1 +C00066,T0055,1 +C00067,T0017,1 +C00067,T0061,1 +C00070,T0008,1 +C00070,T0014,1 +C00070,T0015,1 +C00070,T0017,1 +C00070,T0046,1 +C00070,T0052,1 +C00070,T0055,1 +C00070,T0057,1 +C00070,T0061,1 +C00071,T0019,1 +C00071,T0056,1 +C00072,T0022,1 +C00073,T0012,1 +C00073,T0019,1 +C00073,T0056,1 +C00074,T0022,1 +C00074,T0026,1 +C00074,T0025,1 +C00076,T0021,1 +C00076,T0024,1 +C00078,TA07,1 +C00078,T0046,1 +C00078,T0021,1 +C00080,adapt,1 +C00081,info,1 +C00084,T0002,1 +C00084,T0006,1 +C00084,T0015,1 +C00084,T0017,1 +C00084,T0057,1 +C00084,T0059,1 +C00085,TA03,1 +C00085,TA04,1 +C00085,TA05,1 +C00085,TA06,1 +C00085,TA07,1 +C00085,TA08,1 +C00085,TA09,1 +C00085,TA10,1 +C00085,TA11,1 +C00086,TA09,1 +C00089,T0021,1 +C00090,T0020,1 +C00091,T0019,1 +C00092,TA07,1 +C00092,TA08,1 +C00092,T0023,1 +C00092,T0024,1 +C00092,T0025,1 +C00092,T0026,1 +C00092,T0045,1 +C00092,T0047,1 +C00092,T0053,1 +C00093,TA07,1 +C00093,T0010,1 +C00093,T0017,1 +C00093,T0039,1 +C00093,T0047,1 +C00093,T0048,1 +C00093,T0053,1 +C00094,T0026,1 +C00096,T0022,1 +C00097,T0029,1 +C00098,T0038,1 +C00099,T0030,1 +C00100,use,1 +C00101,T0029,1 +C00102,T0029,1 +C00103,T0029,1 +C00107,T0032,1 +C00107,T0035,1 +C00112,T0040,1 +C00112,T0042,1 +C00113,T0045,1 +C00114,T0039,1 +C00115,T0046,1 +C00115,T0048,1 +C00115,T0052,1 +C00115,T0053,1 +C00115,T0054,1 +C00115,T0055,1 +C00115,T0056,1 +C00116,T0041,1 +C00117,T0046,1 +C00118,T0044,1 +C00119,T0044,1 +C00120,T0047,1 +C00120,T0052,1 +C00120,T0053,1 +C00120,T0054,1 +C00120,T0055,1 +C00120,T0056,1 +C00121,T0043,1 +C00123,T0049,1 +C00123,T0051,1 +C00123,T0052,1 +C00123,T0053,1 +C00123,T0054,1 +C00123,T0055,1 +C00123,T0056,1 +C00124,TA08,1 +C00124,TA09,1 +C00125,distort,1 +C00126,T0052,1 +C00126,T0053,1 +C00126,T0054,1 +C00126,T0055,1 +C00126,T0056,1 +C00129,T0057,1 +C00129,T0061,1 +C00131,T0049,1 +C00131,T0054,1 +C00133,TA07,1 +C00133,TA09,1 +C00133,TA10,1 +C00133,T0007,1 +C00133,T0009,1 +C00133,T0011,1 +C00133,T0014,1 +C00133,T0017,1 +C00133,T0018,1 +C00133,T0045,1 +C00135,TA07,1 +C00135,TA09,1 +C00135,TA10,1 +C00135,T0007,1 +C00135,T0011,1 +C00135,T0017,1 +C00135,T0045,1 +C00136,TA08,1 +C00136,TA09,1 +C00136,TA10,1 +C00136,T0005,1 +C00136,T0010,1 +C00136,T0029,1 +C00137,T0020,1 +C00140,TA05,1 +C00140,TA09,1 +C00140,TA10,1 +C00142,TA05,1 +C00142,TA09,1 +C00142,TA10,1 +C00142,TA11,1 +C00142,T00016,1 +C00144,T0053,1 +C00145,T0015,1 +C00145,T0046,1 +C00147,T0060,1 +C00149,TA12,1 +C00149,T0020,1 +C00165,T00025,1 +C00174,T0001,1 +C00197,T0007,1 +C00197,T0011,1 +C00202,T0025,1 diff --git a/visualisations/d3.js b/visualisations/d3.js new file mode 100644 index 0000000..5dbfb56 --- /dev/null +++ b/visualisations/d3.js @@ -0,0 +1,19718 @@ +// https://d3js.org v6.6.0 Copyright 2021 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {})); +}(this, (function (exports) { 'use strict'; + +var version = "6.6.0"; + +function ascending$3(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function bisector(f) { + let delta = f; + let compare = f; + + if (f.length === 1) { + delta = (d, x) => f(d) - x; + compare = ascendingComparator(f); + } + + function left(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + } + + function right(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + + function center(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + const i = left(a, x, lo, hi - 1); + return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; + } + + return {left, center, right}; +} + +function ascendingComparator(f) { + return (d, x) => ascending$3(f(d), x); +} + +function number$3(x) { + return x === null ? NaN : +x; +} + +function* numbers(values, valueof) { + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + yield value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + yield value; + } + } + } +} + +const ascendingBisect = bisector(ascending$3); +const bisectRight = ascendingBisect.right; +const bisectLeft = ascendingBisect.left; +const bisectCenter = bisector(number$3).center; + +function count$1(values, valueof) { + let count = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count; + } + } + } + return count; +} + +function length$3(array) { + return array.length | 0; +} + +function empty$2(length) { + return !(length > 0); +} + +function arrayify(values) { + return typeof values !== "object" || "length" in values ? values : Array.from(values); +} + +function reducer(reduce) { + return values => reduce(...values); +} + +function cross$2(...values) { + const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop()); + values = values.map(arrayify); + const lengths = values.map(length$3); + const j = values.length - 1; + const index = new Array(j + 1).fill(0); + const product = []; + if (j < 0 || lengths.some(empty$2)) return product; + while (true) { + product.push(index.map((j, i) => values[i][j])); + let i = j; + while (++index[i] === lengths[i]) { + if (i === 0) return reduce ? product.map(reduce) : product; + index[i--] = 0; + } + } +} + +function cumsum(values, valueof) { + var sum = 0, index = 0; + return Float64Array.from(values, valueof === undefined + ? v => (sum += +v || 0) + : v => (sum += +valueof(v, index++, values) || 0)); +} + +function descending$2(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function variance(values, valueof) { + let count = 0; + let delta; + let mean = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } + if (count > 1) return sum / (count - 1); +} + +function deviation(values, valueof) { + const v = variance(values, valueof); + return v ? Math.sqrt(v) : v; +} + +function extent$1(values, valueof) { + let min; + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + return [min, max]; +} + +// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 +class Adder { + constructor() { + this._partials = new Float64Array(32); + this._n = 0; + } + add(x) { + const p = this._partials; + let i = 0; + for (let j = 0; j < this._n && j < 32; j++) { + const y = p[j], + hi = x + y, + lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + if (lo) p[i++] = lo; + x = hi; + } + p[i] = x; + this._n = i + 1; + return this; + } + valueOf() { + const p = this._partials; + let n = this._n, x, y, lo, hi = 0; + if (n > 0) { + hi = p[--n]; + while (n > 0) { + x = hi; + y = p[--n]; + hi = x + y; + lo = y - (hi - x); + if (lo) break; + } + if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) { + y = lo * 2; + x = hi + y; + if (y == x - hi) hi = x; + } + } + return hi; + } +} + +function fsum(values, valueof) { + const adder = new Adder(); + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + adder.add(value); + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + adder.add(value); + } + } + } + return +adder; +} + +function fcumsum(values, valueof) { + const adder = new Adder(); + let index = -1; + return Float64Array.from(values, valueof === undefined + ? v => adder.add(+v || 0) + : v => adder.add(+valueof(v, ++index, values) || 0) + ); +} + +class InternMap extends Map { + constructor(entries, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (entries != null) for (const [key, value] of entries) this.set(key, value); + } + get(key) { + return super.get(intern_get(this, key)); + } + has(key) { + return super.has(intern_get(this, key)); + } + set(key, value) { + return super.set(intern_set(this, key), value); + } + delete(key) { + return super.delete(intern_delete(this, key)); + } +} + +class InternSet extends Set { + constructor(values, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (values != null) for (const value of values) this.add(value); + } + has(value) { + return super.has(intern_get(this, value)); + } + add(value) { + return super.add(intern_set(this, value)); + } + delete(value) { + return super.delete(intern_delete(this, value)); + } +} + +function intern_get({_intern, _key}, value) { + const key = _key(value); + return _intern.has(key) ? _intern.get(key) : value; +} + +function intern_set({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) return _intern.get(key); + _intern.set(key, value); + return value; +} + +function intern_delete({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) { + value = _intern.get(value); + _intern.delete(key); + } + return value; +} + +function keyof(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} + +function identity$9(x) { + return x; +} + +function group(values, ...keys) { + return nest(values, identity$9, identity$9, keys); +} + +function groups(values, ...keys) { + return nest(values, Array.from, identity$9, keys); +} + +function rollup(values, reduce, ...keys) { + return nest(values, identity$9, reduce, keys); +} + +function rollups(values, reduce, ...keys) { + return nest(values, Array.from, reduce, keys); +} + +function index$4(values, ...keys) { + return nest(values, identity$9, unique, keys); +} + +function indexes(values, ...keys) { + return nest(values, Array.from, unique, keys); +} + +function unique(values) { + if (values.length !== 1) throw new Error("duplicate key"); + return values[0]; +} + +function nest(values, map, reduce, keys) { + return (function regroup(values, i) { + if (i >= keys.length) return reduce(values); + const groups = new InternMap(); + const keyof = keys[i++]; + let index = -1; + for (const value of values) { + const key = keyof(value, ++index, values); + const group = groups.get(key); + if (group) group.push(value); + else groups.set(key, [value]); + } + for (const [key, values] of groups) { + groups.set(key, regroup(values, i)); + } + return map(groups); + })(values, 0); +} + +function permute(source, keys) { + return Array.from(keys, key => source[key]); +} + +function sort(values, ...F) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + values = Array.from(values); + let [f = ascending$3] = F; + if (f.length === 1 || F.length > 1) { + const index = Uint32Array.from(values, (d, i) => i); + if (F.length > 1) { + F = F.map(f => values.map(f)); + index.sort((i, j) => { + for (const f of F) { + const c = ascending$3(f[i], f[j]); + if (c) return c; + } + }); + } else { + f = values.map(f); + index.sort((i, j) => ascending$3(f[i], f[j])); + } + return permute(values, index); + } + return values.sort(f); +} + +function groupSort(values, reduce, key) { + return (reduce.length === 1 + ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending$3(av, bv) || ascending$3(ak, bk))) + : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending$3(ak, bk)))) + .map(([key]) => key); +} + +var array$5 = Array.prototype; + +var slice$4 = array$5.slice; + +function constant$b(x) { + return function() { + return x; + }; +} + +var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + +function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + step = -step; + start = Math.ceil(start * step); + stop = Math.floor(stop * step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; +} + +function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); +} + +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 nice$1(start, stop, count) { + let prestep; + while (true) { + const step = tickIncrement(start, stop, count); + if (step === prestep || step === 0 || !isFinite(step)) { + return [start, stop]; + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } + prestep = step; + } +} + +function thresholdSturges(values) { + return Math.ceil(Math.log(count$1(values)) / Math.LN2) + 1; +} + +function bin() { + var value = identity$9, + domain = extent$1, + threshold = thresholdSturges; + + function histogram(data) { + if (!Array.isArray(data)) data = Array.from(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, and nice the + // default domain accordingly. + if (!Array.isArray(tz)) { + const max = x1, tn = +tz; + if (domain === extent$1) [x0, x1] = nice$1(x0, x1, tn); + tz = ticks(x0, x1, tn); + + // If the last threshold is coincident with the domain’s upper bound, the + // last bin will be zero-width. If the default domain is used, and this + // last threshold is coincident with the maximum input value, we can + // extend the niced upper bound by one tick to ensure uniform bin widths; + // otherwise, we simply remove the last threshold. Note that we don’t + // coerce values or the domain to numbers, and thus must be careful to + // compare order (>=) rather than strict equality (===)! + if (tz[tz.length - 1] >= x1) { + if (max >= x1 && domain === extent$1) { + const step = tickIncrement(x0, x1, tn); + if (isFinite(step)) { + if (step > 0) { + x1 = (Math.floor(x1 / step) + 1) * step; + } else if (step < 0) { + x1 = (Math.ceil(x1 * -step) + 1) / -step; + } + } + } else { + tz.pop(); + } + } + } + + // 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$b(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant$b([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$b(slice$4.call(_)) : constant$b(_), histogram) : threshold; + }; + + return histogram; +} + +function max$3(values, valueof) { + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } + return max; +} + +function min$2(values, valueof) { + let min; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } + return min; +} + +// Based on https://github.com/mourner/quickselect +// ISC license, Copyright 2018 Vladimir Agafonkin. +function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending$3) { + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselect(array, k, newLeft, newRight, compare); + } + + const t = array[k]; + let i = left; + let j = right; + + swap$1(array, left, k); + if (compare(array[right], t) > 0) swap$1(array, left, right); + + while (i < j) { + swap$1(array, i, j), ++i, --j; + while (compare(array[i], t) < 0) ++i; + while (compare(array[j], t) > 0) --j; + } + + if (compare(array[left], t) === 0) swap$1(array, left, j); + else ++j, swap$1(array, j, right); + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } + return array; +} + +function swap$1(array, i, j) { + const t = array[i]; + array[i] = array[j]; + array[j] = t; +} + +function quantile$1(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return min$2(values); + if (p >= 1) return max$3(values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = max$3(quickselect(values, i0).subarray(0, i0 + 1)), + value1 = min$2(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i - i0); +} + +function quantileSorted(values, p, valueof = number$3) { + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +} + +function freedmanDiaconis(values, min, max) { + return Math.ceil((max - min) / (2 * (quantile$1(values, 0.75) - quantile$1(values, 0.25)) * Math.pow(count$1(values), -1 / 3))); +} + +function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count$1(values), -1 / 3))); +} + +function maxIndex(values, valueof) { + let max; + let maxIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } + return maxIndex; +} + +function mean(values, valueof) { + let count = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } + if (count) return sum / count; +} + +function median(values, valueof) { + return quantile$1(values, 0.5, valueof); +} + +function* flatten(arrays) { + for (const array of arrays) { + yield* array; + } +} + +function merge(arrays) { + return Array.from(flatten(arrays)); +} + +function minIndex(values, valueof) { + let min; + let minIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } + return minIndex; +} + +function pairs(values, pairof = pair) { + const pairs = []; + let previous; + let first = false; + for (const value of values) { + if (first) pairs.push(pairof(previous, value)); + previous = value; + first = true; + } + return pairs; +} + +function pair(a, b) { + return [a, b]; +} + +function sequence(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; +} + +function least(values, compare = ascending$3) { + let min; + let defined = false; + if (compare.length === 1) { + let minValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending$3(value, minValue) < 0 + : ascending$3(value, value) === 0) { + min = element; + minValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, min) < 0 + : compare(value, value) === 0) { + min = value; + defined = true; + } + } + } + return min; +} + +function leastIndex(values, compare = ascending$3) { + if (compare.length === 1) return minIndex(values, compare); + let minValue; + let min = -1; + let index = -1; + for (const value of values) { + ++index; + if (min < 0 + ? compare(value, value) === 0 + : compare(value, minValue) < 0) { + minValue = value; + min = index; + } + } + return min; +} + +function greatest(values, compare = ascending$3) { + let max; + let defined = false; + if (compare.length === 1) { + let maxValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending$3(value, maxValue) > 0 + : ascending$3(value, value) === 0) { + max = element; + maxValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, max) > 0 + : compare(value, value) === 0) { + max = value; + defined = true; + } + } + } + return max; +} + +function greatestIndex(values, compare = ascending$3) { + if (compare.length === 1) return maxIndex(values, compare); + let maxValue; + let max = -1; + let index = -1; + for (const value of values) { + ++index; + if (max < 0 + ? compare(value, value) === 0 + : compare(value, maxValue) > 0) { + maxValue = value; + max = index; + } + } + return max; +} + +function scan(values, compare) { + const index = leastIndex(values, compare); + return index < 0 ? undefined : index; +} + +var shuffle$1 = shuffler(Math.random); + +function shuffler(random) { + return function shuffle(array, i0 = 0, i1 = array.length) { + let m = i1 - (i0 = +i0); + while (m) { + const i = random() * m-- | 0, t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + return array; + }; +} + +function sum$1(values, valueof) { + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + sum += value; + } + } + } + return sum; +} + +function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min$2(matrix, length$2), 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$2(d) { + return d.length; +} + +function zip() { + return transpose(arguments); +} + +function every(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (!test(value, ++index, values)) { + return false; + } + } + return true; +} + +function some(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + return true; + } + } + return false; +} + +function filter$1(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + const array = []; + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + array.push(value); + } + } + return array; +} + +function map$1(values, mapper) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + if (typeof mapper !== "function") throw new TypeError("mapper is not a function"); + return Array.from(values, (value, index) => mapper(value, index, values)); +} + +function reduce(values, reducer, value) { + if (typeof reducer !== "function") throw new TypeError("reducer is not a function"); + const iterator = values[Symbol.iterator](); + let done, next, index = -1; + if (arguments.length < 3) { + ({done, value} = iterator.next()); + if (done) return; + ++index; + } + while (({done, value: next} = iterator.next()), !done) { + value = reducer(value, next, ++index, values); + } + return value; +} + +function reverse$1(values) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + return Array.from(values).reverse(); +} + +function difference(values, ...others) { + values = new Set(values); + for (const other of others) { + for (const value of other) { + values.delete(value); + } + } + return values; +} + +function disjoint(values, other) { + const iterator = other[Symbol.iterator](), set = new Set(); + for (const v of values) { + if (set.has(v)) return false; + let value, done; + while (({value, done} = iterator.next())) { + if (done) break; + if (Object.is(v, value)) return false; + set.add(value); + } + } + return true; +} + +function set$2(values) { + return values instanceof Set ? values : new Set(values); +} + +function intersection(values, ...others) { + values = new Set(values); + others = others.map(set$2); + out: for (const value of values) { + for (const other of others) { + if (!other.has(value)) { + values.delete(value); + continue out; + } + } + } + return values; +} + +function superset(values, other) { + const iterator = values[Symbol.iterator](), set = new Set(); + for (const o of other) { + if (set.has(o)) continue; + let value, done; + while (({value, done} = iterator.next())) { + if (done) return false; + set.add(value); + if (Object.is(o, value)) break; + } + } + return true; +} + +function subset(values, other) { + return superset(other, values); +} + +function union(...others) { + const set = new Set(); + for (const other of others) { + for (const o of other) { + set.add(o); + } + } + return set; +} + +var slice$3 = Array.prototype.slice; + +function identity$8(x) { + return x; +} + +var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon$5 = 1e-6; + +function translateX(x) { + return "translate(" + x + ",0)"; +} + +function translateY(y) { + return "translate(0," + y + ")"; +} + +function number$2(scale) { + return d => +scale(d); +} + +function center$1(scale, offset) { + offset = Math.max(0, scale.bandwidth() - offset * 2) / 2; + if (scale.round()) offset = Math.round(offset); + return d => +scale(d) + offset; +} + +function entering() { + return !this.__axis; +} + +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + 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$8) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + offset, + range1 = +range[range.length - 1] + offset, + position = (scale.bandwidth ? center$1 : number$2)(scale.copy(), offset), + 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"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .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$5) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); }); + + tickEnter + .attr("opacity", epsilon$5) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient === right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d) + offset); }); + + 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$3.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice$3.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice$3.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; + }; + + axis.offset = function(_) { + return arguments.length ? (offset = +_, axis) : offset; + }; + + 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); +} + +var noop$3 = {value: () => {}}; + +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function parseTypenames$1(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$1(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$1(_[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$1(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$3, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +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; // eslint-disable-line no-prototype-builtins +} + +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); +} + +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$1(subgroups, this._parents); +} + +function array$4(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function empty$1() { + return []; +} + +function selectorAll(selector) { + return selector == null ? empty$1 : function() { + return this.querySelectorAll(selector); + }; +} + +function arrayAll(select) { + return function() { + var group = select.apply(this, arguments); + return group == null ? [] : array$4(group); + }; +} + +function selection_selectAll(select) { + if (typeof select === "function") select = arrayAll(select); + else 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$1(subgroups, parents); +} + +function matcher(selector) { + return function() { + return this.matches(selector); + }; +} + +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + +var find$1 = Array.prototype.find; + +function childFind(match) { + return function() { + return find$1.call(this.children, match); + }; +} + +function childFirst() { + return this.firstElementChild; +} + +function selection_selectChild(match) { + return this.select(match == null ? childFirst + : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +var filter = Array.prototype.filter; + +function children() { + return this.children; +} + +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} + +function selection_selectChildren(match) { + return this.selectAll(match == null ? children + : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +function selection_filter(match) { + if (typeof match !== "function") match = matcher(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$1(subgroups, this._parents); +} + +function sparse(update) { + return new Array(update.length); +} + +function selection_enter() { + return new Selection$1(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$a(x) { + return function() { + return x; + }; +} + +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 = new Map, + 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 = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(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 = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } 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.get(keyValues[i]) === node)) { + exit[i] = node; + } + } +} + +function datum(node) { + return node.__data__; +} + +function selection_data(value, key) { + if (!arguments.length) return Array.from(this, datum); + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant$a(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 = array$4(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$1(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} + +function selection_exit() { + return new Selection$1(this._exit || this._groups.map(sparse), this._parents); +} + +function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +function selection_merge(selection) { + if (!(selection instanceof Selection$1)) throw new Error("invalid merge"); + + 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$1(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 && node.compareDocumentPosition(next) ^ 4) 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$1(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() { + return Array.from(this); +} + +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() { + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars + 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$1(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS$1(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant$1(name, value) { + return function() { + this.setAttribute(name, value); + }; +} + +function attrConstantNS$1(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} + +function attrFunction$1(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS$1(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$1 : attrRemove$1) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)))(fullname, value)); +} + +function defaultView(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$1(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant$1(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} + +function styleFunction$1(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) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove$1 : typeof value === "function" + ? styleFunction$1 + : styleConstant$1)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} + +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(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$1(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction$1(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$1 + : textConstant$1)(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() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +function selection_raise() { + return this.each(raise); +} + +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_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +} + +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} + +function parseTypenames(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.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + 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.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +function selection_on(typename, value, options) { + var typenames = parseTypenames(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; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; +} + +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + 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)); +} + +function* selection_iterator() { + 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]) yield node; + } + } +} + +var root$1 = [null]; + +function Selection$1(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection$1([[document.documentElement]], root$1); +} + +function selection_selection() { + return this; +} + +Selection$1.prototype = selection.prototype = { + constructor: Selection$1, + select: selection_select, + selectAll: selection_selectAll, + selectChild: selection_selectChild, + selectChildren: selection_selectChildren, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + selection: selection_selection, + 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, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch, + [Symbol.iterator]: selection_iterator +}; + +function select(selector) { + return typeof selector === "string" + ? new Selection$1([[document.querySelector(selector)]], [document.documentElement]) + : new Selection$1([[selector]], root$1); +} + +function create$1(name) { + return select(creator(name).call(document.documentElement)); +} + +var nextId = 0; + +function local$1() { + return new Local; +} + +function Local() { + this._ = "@" + (++nextId).toString(36); +} + +Local.prototype = local$1.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._; + } +}; + +function sourceEvent(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; +} + +function pointer(event, node) { + event = sourceEvent(event); + if (node === undefined) node = event.currentTarget; + if (node) { + 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]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} + +function pointers(events, node) { + if (events.target) { // i.e., instanceof Event, not TouchList or iterable + events = sourceEvent(events); + if (node === undefined) node = events.currentTarget; + events = events.touches || [events]; + } + return Array.from(events, event => pointer(event, node)); +} + +function selectAll(selector) { + return typeof selector === "string" + ? new Selection$1([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection$1([selector == null ? [] : array$4(selector)], root$1); +} + +function nopropagation$2(event) { + event.stopImmediatePropagation(); +} + +function noevent$2(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +function dragDisable(view) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", noevent$2, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent$2, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } +} + +function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent$2, 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; + } +} + +var constant$9 = x => () => x; + +function DragEvent(type, { + sourceEvent, + subject, + target, + identifier, + active, + x, y, dx, dy, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + subject: {value: subject, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + identifier: {value: identifier, enumerable: true, configurable: true}, + active: {value: active, enumerable: true, configurable: true}, + x: {value: x, enumerable: true, configurable: true}, + y: {value: y, enumerable: true, configurable: true}, + dx: {value: dx, enumerable: true, configurable: true}, + dy: {value: dy, enumerable: true, configurable: true}, + _: {value: 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$2(event) { + return !event.ctrlKey && !event.button; +} + +function defaultContainer() { + return this.parentNode; +} + +function defaultSubject(event, d) { + return d == null ? {x: event.x, y: event.y} : d; +} + +function defaultTouchable$2() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function drag() { + var filter = defaultFilter$2, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable$2, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned(event, d) { + if (touchending || !filter.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(event.view); + nopropagation$2(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + + function mousemoved(event) { + noevent$2(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + + function mouseupped(event) { + select(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent$2(event); + gestures.mouse("end", event); + } + + function touchstarted(event, d) { + if (!filter.call(this, event, d)) return; + var touches = event.changedTouches, + c = container.call(this, event, d), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation$2(event); + gesture("start", event, touches[i]); + } + } + } + + function touchmoved(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent$2(event); + gesture("drag", event, touches[i]); + } + } + } + + function touchended(event) { + var touches = 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$2(event); + gesture("end", event, touches[i]); + } + } + } + + function beforestart(that, container, event, d, identifier, touch) { + var dispatch = listeners.copy(), + p = pointer(touch || event, container), dx, dy, + s; + + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch + }), d)) == null) return; + + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + + return function gesture(type, event, touch) { + var p0 = p, n; + switch (type) { + case "start": gestures[identifier] = gesture, n = active++; break; + case "end": delete gestures[identifier], --active; // nobreak + case "drag": p = pointer(touch || event, container), n = active; break; + } + dispatch.call( + type, + that, + new DragEvent(type, { + sourceEvent: event, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch + }), + d + ); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$9(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$9(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$9(_), drag) : subject; + }; + + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$9(!!_), drag) : touchable; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; +} + +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 reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +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, { + copy: function(channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); + +function color_formatHex() { + return this.rgb().formatHex(); +} + +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} + +function color_formatRgb() { + return this.rgb().formatRgb(); +} + +function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (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]) // eslint-disable-line no-prototype-builtins + : 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 rgb(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, rgb, 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.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); + +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} + +function rgb_formatRgb() { + 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 hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} + +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 hsl$2(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, hsl$2, 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); + }, + formatHsl: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +/* 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; +} + +const radians$1 = Math.PI / 180; +const degrees$2 = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb +const K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0$1 = 4 / 29, + t1$1 = 6 / 29, + t2 = 3 * t1$1 * t1$1, + t3 = t1$1 * t1$1 * t1$1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); +} + +function lab$1(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$1, extend(Color, { + brighter: function(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - K * (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; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0$1; +} + +function lab2xyz(t) { + return t > t1$1 ? t * t * t : t2 * (t - t0$1); +} + +function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2lrgb(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); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * degrees$2; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function hcl$2(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; +} + +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * radians$1; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} + +define(Hcl, hcl$2, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return hcl2lab(this).rgb(); + } +})); + +var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + 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) * degrees$2 - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +function cubehelix$3(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$3, 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) * radians$1, + 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); + }; +} + +var constant$8 = x => () => x; + +function linear$2(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$1(a, b) { + var d = b - a; + return d ? linear$2(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$8(isNaN(a) ? b : a); +} + +function gamma$1(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential$1(a, b, y) : constant$8(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear$2(a, d) : constant$8(isNaN(a) ? b : a); +} + +var interpolateRgb = (function rgbGamma(y) { + var color = gamma$1(y); + + function rgb$1(start, end) { + var r = color((start = rgb(start)).r, (end = rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(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$1.gamma = rgbGamma; + + return rgb$1; +})(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 = rgb(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 numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function(t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; +} + +function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); +} + +function array$3(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); +} + +function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = interpolate$2(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$1(a, b) { + var d = new Date; + return a = +a, b = +b, function(t) { + return d.setTime(a * (1 - t) + b * t), d; + }; +} + +function interpolateNumber(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} + +function object$1(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$2(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, + 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$2(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant$8(b) + : (t === "number" ? interpolateNumber + : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) + : b instanceof color ? interpolateRgb + : b instanceof Date ? date$1 + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object$1 + : interpolateNumber)(a, b); +} + +function discrete(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +function hue(a, b) { + var i = hue$1(+a, +b); + return function(t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; +} + +function interpolateRound(a, b) { + return a = +a, b = +b, function(t) { + return Math.round(a * (1 - t) + b * t); + }; +} + +var degrees$1 = 180 / Math.PI; + +var identity$7 = { + 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$1, + skewX: Math.atan(skewX) * degrees$1, + scaleX: scaleX, + scaleY: scaleY + }; +} + +var svgNode; + +/* eslint-disable no-undef */ +function parseCss(value) { + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity$7 : decompose(m.a, m.b, m.c, m.d, m.e, m.f); +} + +function parseSvg(value) { + if (value == null) return identity$7; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$7; + 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 interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +var epsilon2$1 = 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); +} + +var interpolateZoom = (function zoomRho(rho, rho2, rho4) { + + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + function zoom(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$1) { + 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 * rho / Math.SQRT2; + + return i; + } + + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + + return zoom; +})(Math.SQRT2, 2, 4); + +function hsl(hue) { + return function(start, end) { + var h = hue((start = hsl$2(start)).h, (end = hsl$2(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$1); +var hslLong = hsl(nogamma); + +function lab(start, end) { + var l = nogamma((start = lab$1(start)).l, (end = lab$1(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 = hcl$2(start)).h, (end = hcl$2(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$1); +var hclLong = hcl(nogamma); + +function cubehelix$1(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix(start, end) { + var h = hue((start = cubehelix$3(start)).h, (end = cubehelix$3(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$1); +var cubehelixLong = cubehelix$1(nogamma); + +function piecewise(interpolate, values) { + if (values === undefined) values = interpolate, interpolate = interpolate$2; + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function(t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; +} + +function quantize$1(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +} + +var frame = 0, // is an animation frame pending? + timeout$1 = 0, // is a timeout pending? + interval$1 = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : 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() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout$1 = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + 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$1) timeout$1 = clearTimeout(timeout$1); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout$1 = setTimeout(wake, time - clock.now() - clockSkew); + if (interval$1) interval$1 = clearInterval(interval$1); + } else { + if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +function timeout(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(elapsed => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +function interval(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + t._restart = t.restart; + t.restart = function(callback, delay, time) { + delay = +delay, time = time == null ? now() : +time; + t._restart(function tick(elapsed) { + elapsed += total; + t._restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + }; + t.restart(callback, delay, time); + return t; +} + +var emptyOn = dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; + +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; + +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 = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} + +function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} + +function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + 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); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + 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. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/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(function() { + if (self.state === STARTED) { + self.state = RUNNING; + 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.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + 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 > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", 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(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(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(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(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get(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(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function transition_attr(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); +} + +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} + +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} + +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + 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(this.node(), id).delay; +} + +function durationFunction(id, value) { + return function() { + set(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + set(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(this.node(), id).duration; +} + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set(this, id).ease = value; + }; +} + +function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; +} + +function easeVarying(id, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error; + set(this, id).ease = v; + }; +} + +function transition_easeVarying(value) { + if (typeof value !== "function") throw new Error; + return this.each(easeVarying(this._id, value)); +} + +function transition_filter(match) { + if (typeof match !== "function") match = matcher(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(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(name) ? init : set; + 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(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(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(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 = selection.prototype.constructor; + +function transition_selection() { + return new Selection(this._groups, this._parents); +} + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // 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 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); +} + +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + 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(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); +} + +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} + +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) 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, textTween(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(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); +} + +function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = set(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(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); + }); +} + +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, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + easeVarying: transition_easeVarying, + end: transition_end, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +const linear$1 = t => +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 cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +var exponent$1 = 3; + +var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; +})(exponent$1); + +var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; +})(exponent$1); + +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$1); + +var pi$4 = Math.PI, + halfPi$3 = pi$4 / 2; + +function sinIn(t) { + return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi$3); +} + +function sinOut(t) { + return Math.sin(t * halfPi$3); +} + +function sinInOut(t) { + return (1 - Math.cos(pi$4 * t)) / 2; +} + +// tpmt is two power minus ten times t scaled to [0,1] +function tpmt(x) { + return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494; +} + +function expIn(t) { + return tpmt(1 - +t); +} + +function expOut(t) { + return 1 - tpmt(t); +} + +function expInOut(t) { + return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 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, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + 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) * t * (s * (t - 1) + t); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((t + 1) * s + t) + 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$5 = 2 * Math.PI, + amplitude = 1, + period = 0.3; + +var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau$5); + + function elasticIn(t) { + return a * tpmt(-(--t)) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau$5); }; + 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$5); + + function elasticOut(t) { + return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau$5); }; + 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$5); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * tpmt(-t) * Math.sin((s - t) / p) + : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau$5); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; +})(amplitude, period); + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id} not found`); + } + } + 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 = [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, name, +i); + } + } + } + + return null; +} + +var constant$7 = x => () => x; + +function BrushEvent(type, { + sourceEvent, + target, + selection, + mode, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + selection: {value: selection, enumerable: true, configurable: true}, + mode: {value: mode, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +function nopropagation$1(event) { + event.stopImmediatePropagation(); +} + +function noevent$1(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + +const {abs: abs$3, max: max$2, min: min$1} = Math; + +function number1(e) { + return [+e[0], +e[1]]; +} + +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} + +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x, e) { return x == null ? null : [[+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), + input: function(y, e) { return y == null ? null : [[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", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { return xy == null ? null : number2(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(t) { + return {type: t}; +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter$1(event) { + return !event.ctrlKey && !event.button; +} + +function defaultExtent$1() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} + +function defaultTouchable$1() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +// Like d3.local, but with the name “__brush” rather than auto-generated. +function local(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; +} + +function empty(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$1, + touchable = defaultTouchable$1, + keys = true, + listeners = dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local(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("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") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function(group, selection) { + if (group.tween) { + group + .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); }) + .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); }) + .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$2(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? 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 ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function(group) { + brush.move(group, null); + }; + + function redraw() { + var group = select(this), + selection = local(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, clean) { + var emit = that.__brush.emitter; + return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean); + } + + function Emitter(that, args, clean) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + this.clean = clean; + } + + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function(event, mode) { + if (this.starting) this.starting = false, this.emit("start", event, mode); + else this.emit("brush", event); + return this; + }, + brush: function(event, mode) { + this.emit("brush", event, mode); + return this; + }, + end: function(event, mode) { + if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode); + return this; + }, + emit: function(type, event, mode) { + var d = select(this.that).datum(); + listeners.call( + type, + this.that, + new BrushEvent(type, { + sourceEvent: event, + target: brush, + selection: dim.output(this.state.selection), + mode, + dispatch: listeners + }), + d + ); + } + }; + + function started(event) { + if (touchending && !event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = event.target.__data__.type, + mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local(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 = 0, + dy = 0, + moving, + shifting = signX && signY && keys && event.shiftKey, + lockX, + lockY, + points = Array.from(event.touches || [event], t => { + const i = t.identifier; + t = pointer(t, that); + t.point0 = t.slice(); + t.identifier = i; + return t; + }); + + if (type === "overlay") { + if (selection) moving = true; + const pts = [points[0], points[1] || points[0]]; + state.selection = selection = [[ + w0 = dim === Y ? W : min$1(pts[0][0], pts[1][0]), + n0 = dim === X ? N : min$1(pts[0][1], pts[1][1]) + ], [ + e0 = dim === Y ? E : max$2(pts[0][0], pts[1][0]), + s0 = dim === X ? S : max$2(pts[0][1], pts[1][1]) + ]]; + if (points.length > 1) move(); + } 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]); + + interrupt(that); + var emit = emitter(that, arguments, true).beforestart(); + + if (event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = select(event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + dragDisable(event.view); + } + + redraw.call(that); + emit.start(event, mode.name); + + function moved(event) { + for (const p of event.changedTouches || [event]) { + for (const d of points) + if (d.identifier === p.identifier) d.cur = pointer(p, that); + } + if (shifting && !lockX && !lockY && points.length === 1) { + const point = points[0]; + if (abs$3(point.cur[0] - point[0]) > abs$3(point.cur[1] - point[1])) + lockY = true; + else + lockX = true; + } + for (const point of points) + if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1]; + moving = true; + noevent$1(event); + move(event); + } + + function move(event) { + const point = points[0], point0 = point.point0; + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = max$2(W - w0, min$1(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = max$2(N - n0, min$1(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (points[1]) { + if (signX) w1 = max$2(W, min$1(E, points[0][0])), e1 = max$2(W, min$1(E, points[1][0])), signX = 1; + if (signY) n1 = max$2(N, min$1(S, points[0][1])), s1 = max$2(N, min$1(S, points[1][1])), signY = 1; + } else { + if (signX < 0) dx = max$2(W - w0, min$1(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = max$2(W - e0, min$1(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = max$2(N - n0, min$1(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = max$2(N - s0, min$1(S - s0, dy)), n1 = n0, s1 = s0 + dy; + } + break; + } + case MODE_CENTER: { + if (signX) w1 = max$2(W, min$1(E, w0 - dx * signX)), e1 = max$2(W, min$1(E, e0 + dx * signX)); + if (signY) n1 = max$2(N, min$1(S, n0 - dy * signY)), s1 = max$2(N, min$1(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]]); + } + + if (state.selection) 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(event, mode.name); + } + } + + function ended(event) { + nopropagation$1(event); + if (event.touches) { + if (event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + } else { + yesdrag(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 (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(event, mode.name); + } + + function keydowned(event) { + switch (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$1(event); + } + + function keyupped(event) { + switch (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 (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$1(event); + } + } + + function touchmoved(event) { + emitter(this, arguments).moved(event); + } + + function touchended(event) { + emitter(this, arguments).ended(event); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$7(number2(_)), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$7(!!_), brush) : filter; + }; + + brush.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$7(!!_), brush) : touchable; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function(_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; +} + +var abs$2 = Math.abs; +var cos$2 = Math.cos; +var sin$2 = Math.sin; +var pi$3 = Math.PI; +var halfPi$2 = pi$3 / 2; +var tau$4 = pi$3 * 2; +var max$1 = Math.max; +var epsilon$4 = 1e-12; + +function range$1(i, j) { + return Array.from({length: j - i}, (_, k) => i + k); +} + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; +} + +function chord() { + return chord$1(false, false); +} + +function chordTranspose() { + return chord$1(false, true); +} + +function chordDirected() { + return chord$1(true, false); +} + +function chord$1(directed, transpose) { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = new Array(n), + groupIndex = range$1(0, n), + chords = new Array(n * n), + groups = new Array(n), + k = 0, dx; + + matrix = Float64Array.from({length: n * n}, transpose + ? (_, i) => matrix[i % n][i / n | 0] + : (_, i) => matrix[i / n | 0][i % n]); + + // Compute the scaling factor from value to angle in [0, 2pi]. + for (let i = 0; i < n; ++i) { + let x = 0; + for (let j = 0; j < n; ++j) x += matrix[i * n + j] + directed * matrix[j * n + i]; + k += groupSums[i] = x; + } + k = max$1(0, tau$4 - padAngle * n) / k; + dx = k ? padAngle : tau$4 / n; + + // Compute the angles for each group and constituent chord. + { + let x = 0; + if (sortGroups) groupIndex.sort((a, b) => sortGroups(groupSums[a], groupSums[b])); + for (const i of groupIndex) { + const x0 = x; + if (directed) { + const subgroupIndex = range$1(~n + 1, n).filter(j => j < 0 ? matrix[~j * n + i] : matrix[i * n + j]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])); + for (const j of subgroupIndex) { + if (j < 0) { + const chord = chords[~j * n + i] || (chords[~j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[~j * n + i] * k, value: matrix[~j * n + i]}; + } else { + const chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } else { + const subgroupIndex = range$1(0, n).filter(j => matrix[i * n + j] || matrix[j * n + i]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(matrix[i * n + a], matrix[i * n + b])); + for (const j of subgroupIndex) { + let chord; + if (i < j) { + chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } else { + chord = chords[j * n + i] || (chords[j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + if (i === j) chord.source = chord.target; + } + if (chord.source && chord.target && chord.source.value < chord.target.value) { + const source = chord.source; + chord.source = chord.target; + chord.target = source; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } + x += dx; + } + } + + // Remove empty chords. + chords = Object.values(chords); + chords.groups = groups; + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; +} + +const pi$2 = Math.PI, + tau$3 = 2 * pi$2, + epsilon$3 = 1e-6, + tauEpsilon = tau$3 - epsilon$3; + +function Path$1() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; +} + +function path() { + return new Path$1; +} + +Path$1.prototype = path.prototype = { + constructor: Path$1, + moveTo: function(x, y) { + this._ += "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._ += "Z"; + } + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "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._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon$3)); + + // 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$3) || !r) { + this._ += "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$2 - 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$3) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "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, ccw = !!ccw; + 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._ += "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$3 || Math.abs(this._y1 - y0) > epsilon$3) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau$3 + tau$3; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon$3) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; + } +}; + +var slice$2 = Array.prototype.slice; + +function constant$6(x) { + return function() { + return x; + }; +} + +function defaultSource$1(d) { + return d.source; +} + +function defaultTarget(d) { + return d.target; +} + +function defaultRadius$1(d) { + return d.radius; +} + +function defaultStartAngle(d) { + return d.startAngle; +} + +function defaultEndAngle(d) { + return d.endAngle; +} + +function defaultPadAngle() { + return 0; +} + +function defaultArrowheadRadius() { + return 10; +} + +function ribbon(headRadius) { + var source = defaultSource$1, + target = defaultTarget, + sourceRadius = defaultRadius$1, + targetRadius = defaultRadius$1, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + padAngle = defaultPadAngle, + context = null; + + function ribbon() { + var buffer, + s = source.apply(this, arguments), + t = target.apply(this, arguments), + ap = padAngle.apply(this, arguments) / 2, + argv = slice$2.call(arguments), + sr = +sourceRadius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$2, + sa1 = endAngle.apply(this, argv) - halfPi$2, + tr = +targetRadius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$2, + ta1 = endAngle.apply(this, argv) - halfPi$2; + + if (!context) context = buffer = path(); + + if (ap > epsilon$4) { + if (abs$2(sa1 - sa0) > ap * 2 + epsilon$4) sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap); + else sa0 = sa1 = (sa0 + sa1) / 2; + if (abs$2(ta1 - ta0) > ap * 2 + epsilon$4) ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap); + else ta0 = ta1 = (ta0 + ta1) / 2; + } + + context.moveTo(sr * cos$2(sa0), sr * sin$2(sa0)); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { + if (headRadius) { + var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2; + context.quadraticCurveTo(0, 0, tr2 * cos$2(ta0), tr2 * sin$2(ta0)); + context.lineTo(tr * cos$2(ta2), tr * sin$2(ta2)); + context.lineTo(tr2 * cos$2(ta1), tr2 * sin$2(ta1)); + } else { + context.quadraticCurveTo(0, 0, tr * cos$2(ta0), tr * sin$2(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + } + context.quadraticCurveTo(0, 0, sr * cos$2(sa0), sr * sin$2(sa0)); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + if (headRadius) ribbon.headRadius = function(_) { + return arguments.length ? (headRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : headRadius; + }; + + ribbon.radius = function(_) { + return arguments.length ? (sourceRadius = targetRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : sourceRadius; + }; + + ribbon.sourceRadius = function(_) { + return arguments.length ? (sourceRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : sourceRadius; + }; + + ribbon.targetRadius = function(_) { + return arguments.length ? (targetRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : targetRadius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : endAngle; + }; + + ribbon.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : padAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; +} + +function ribbon$1() { + return ribbon(); +} + +function ribbonArrow() { + return ribbon(defaultArrowheadRadius); +} + +var array$2 = Array.prototype; + +var slice$1 = array$2.slice; + +function ascending$1(a, b) { + return a - b; +} + +function area$3(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; +} + +var constant$5 = x => () => x; + +function contains$2(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; +} + +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; +} + +function segmentContains(a, b, c) { + var i; return collinear$1(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); +} + +function collinear$1(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); +} + +function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; +} + +function noop$2() {} + +var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] +]; + +function contours() { + var dx = 1, + dy = 1, + threshold = thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = extent$1(values), start = domain[0], stop = domain[1]; + tz = tickStep(start, stop, tz); + tz = sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending$1); + } + + return tz.map(function(value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function(ring) { + smooth(ring, values, value); + if (area$3(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function(hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains$2((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function(point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]); + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$5(slice$1.call(_)) : constant$5(_), contours) : threshold; + }; + + contours.smooth = function(_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop$2, contours) : smooth === smoothLinear; + }; + + return contours; +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } +} + +function defaultX$1(d) { + return d[0]; +} + +function defaultY$1(d) { + return d[1]; +} + +function defaultWeight() { + return 1; +} + +function density() { + var x = defaultX$1, + y = defaultY$1, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant$5(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function(d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = max$3(values0); + tz = tickStep(0, stop, tz); + tz = sequence(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$5(+_), density) : x; + }; + + density.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$5(+_), density) : y; + }; + + density.weight = function(_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant$5(+_), density) : weight; + }; + + density.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = +_[0], _1 = +_[1]; + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function(_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$5(slice$1.call(_)) : constant$5(_), density) : threshold; + }; + + density.bandwidth = function(_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; +} + +const EPSILON = Math.pow(2, -52); +const EDGE_STACK = new Uint32Array(512); + +class Delaunator { + + static from(points, getX = defaultGetX, getY = defaultGetY) { + const n = points.length; + const coords = new Float64Array(n * 2); + + for (let i = 0; i < n; i++) { + const p = points[i]; + coords[2 * i] = getX(p); + coords[2 * i + 1] = getY(p); + } + + return new Delaunator(coords); + } + + constructor(coords) { + const n = coords.length >> 1; + if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.'); + + this.coords = coords; + + // arrays that will store the triangulation graph + const maxTriangles = Math.max(2 * n - 5, 0); + this._triangles = new Uint32Array(maxTriangles * 3); + this._halfedges = new Int32Array(maxTriangles * 3); + + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)); + this._hullPrev = new Uint32Array(n); // edge to prev edge + this._hullNext = new Uint32Array(n); // edge to next edge + this._hullTri = new Uint32Array(n); // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash + + // temporary arrays for sorting points + this._ids = new Uint32Array(n); + this._dists = new Float64Array(n); + + this.update(); + } + + update() { + const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this; + const n = coords.length >> 1; + + // populate an array of point indices; calculate input data bbox + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + + for (let i = 0; i < n; i++) { + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + this._ids[i] = i; + } + const cx = (minX + maxX) / 2; + const cy = (minY + maxY) / 2; + + let minDist = Infinity; + let i0, i1, i2; + + // pick a seed point close to the center + for (let i = 0; i < n; i++) { + const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); + if (d < minDist) { + i0 = i; + minDist = d; + } + } + const i0x = coords[2 * i0]; + const i0y = coords[2 * i0 + 1]; + + minDist = Infinity; + + // find the point closest to the seed + for (let i = 0; i < n; i++) { + if (i === i0) continue; + const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]); + if (d < minDist && d > 0) { + i1 = i; + minDist = d; + } + } + let i1x = coords[2 * i1]; + let i1y = coords[2 * i1 + 1]; + + let minRadius = Infinity; + + // find the third point which forms the smallest circumcircle with the first two + for (let i = 0; i < n; i++) { + if (i === i0 || i === i1) continue; + const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]); + if (r < minRadius) { + i2 = i; + minRadius = r; + } + } + let i2x = coords[2 * i2]; + let i2y = coords[2 * i2 + 1]; + + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (let i = 0; i < n; i++) { + this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]); + } + quicksort(this._ids, this._dists, 0, n - 1); + const hull = new Uint32Array(n); + let j = 0; + for (let i = 0, d0 = -Infinity; i < n; i++) { + const id = this._ids[i]; + if (this._dists[id] > d0) { + hull[j++] = id; + d0 = this._dists[id]; + } + } + this.hull = hull.subarray(0, j); + this.triangles = new Uint32Array(0); + this.halfedges = new Uint32Array(0); + return; + } + + // swap the order of the seed points for counter-clockwise orientation + if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { + const i = i1; + const x = i1x; + const y = i1y; + i1 = i2; + i1x = i2x; + i1y = i2y; + i2 = i; + i2x = x; + i2y = y; + } + + const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); + this._cx = center.x; + this._cy = center.y; + + for (let i = 0; i < n; i++) { + this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y); + } + + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1); + + // set up the seed triangle as the starting hull + this._hullStart = i0; + let hullSize = 3; + + hullNext[i0] = hullPrev[i2] = i1; + hullNext[i1] = hullPrev[i0] = i2; + hullNext[i2] = hullPrev[i1] = i0; + + hullTri[i0] = 0; + hullTri[i1] = 1; + hullTri[i2] = 2; + + hullHash.fill(-1); + hullHash[this._hashKey(i0x, i0y)] = i0; + hullHash[this._hashKey(i1x, i1y)] = i1; + hullHash[this._hashKey(i2x, i2y)] = i2; + + this.trianglesLen = 0; + this._addTriangle(i0, i1, i2, -1, -1, -1); + + for (let k = 0, xp, yp; k < this._ids.length; k++) { + const i = this._ids[k]; + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + + // skip near-duplicate points + if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue; + xp = x; + yp = y; + + // skip seed triangle points + if (i === i0 || i === i1 || i === i2) continue; + + // find a visible edge on the convex hull using edge hash + let start = 0; + for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { + start = hullHash[(key + j) % this._hashSize]; + if (start !== -1 && start !== hullNext[start]) break; + } + + start = hullPrev[start]; + let e = start, q; + while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) { + e = q; + if (e === start) { + e = -1; + break; + } + } + if (e === -1) continue; // likely a near-duplicate point; skip it + + // add the first triangle from the point + let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); + + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i] = this._legalize(t + 2); + hullTri[e] = t; // keep track of boundary triangles on the hull + hullSize++; + + // walk forward through the hull, adding more triangles and flipping recursively + let n = hullNext[e]; + while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) { + t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]); + hullTri[i] = this._legalize(t + 2); + hullNext[n] = n; // mark as removed + hullSize--; + n = q; + } + + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) { + t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]); + this._legalize(t + 2); + hullTri[q] = t; + hullNext[e] = e; // mark as removed + hullSize--; + e = q; + } + } + + // update the hull indices + this._hullStart = hullPrev[i] = e; + hullNext[e] = hullPrev[n] = i; + hullNext[i] = n; + + // save the two new edges in the hash table + hullHash[this._hashKey(x, y)] = i; + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; + } + + this.hull = new Uint32Array(hullSize); + for (let i = 0, e = this._hullStart; i < hullSize; i++) { + this.hull[i] = e; + e = hullNext[e]; + } + + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen); + this.halfedges = this._halfedges.subarray(0, this.trianglesLen); + } + + _hashKey(x, y) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; + } + + _legalize(a) { + const {_triangles: triangles, _halfedges: halfedges, coords} = this; + + let i = 0; + let ar = 0; + + // recursion eliminated with a fixed-size stack + while (true) { + const b = halfedges[a]; + + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/ \a + * / || \ / \ + * / a||b \ flip /___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\ /br + * \||/ \ / + * pr pr + */ + const a0 = a - a % 3; + ar = a0 + (a + 2) % 3; + + if (b === -1) { // convex hull edge + if (i === 0) break; + a = EDGE_STACK[--i]; + continue; + } + + const b0 = b - b % 3; + const al = a0 + (a + 1) % 3; + const bl = b0 + (b + 2) % 3; + + const p0 = triangles[ar]; + const pr = triangles[a]; + const pl = triangles[al]; + const p1 = triangles[bl]; + + const illegal = inCircle( + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1]); + + if (illegal) { + triangles[a] = p1; + triangles[b] = p0; + + const hbl = halfedges[bl]; + + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + let e = this._hullStart; + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a; + break; + } + e = this._hullPrev[e]; + } while (e !== this._hullStart); + } + this._link(a, hbl); + this._link(b, halfedges[ar]); + this._link(ar, bl); + + const br = b0 + (b + 1) % 3; + + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br; + } + } else { + if (i === 0) break; + a = EDGE_STACK[--i]; + } + } + + return ar; + } + + _link(a, b) { + this._halfedges[a] = b; + if (b !== -1) this._halfedges[b] = a; + } + + // add a new triangle given vertex indices and adjacent half-edge ids + _addTriangle(i0, i1, i2, a, b, c) { + const t = this.trianglesLen; + + this._triangles[t] = i0; + this._triangles[t + 1] = i1; + this._triangles[t + 2] = i2; + + this._link(t, a); + this._link(t + 1, b); + this._link(t + 2, c); + + this.trianglesLen += 3; + + return t; + } +} + +// monotonically increases with real angle, but doesn't need expensive trigonometry +function pseudoAngle(dx, dy) { + const p = dx / (Math.abs(dx) + Math.abs(dy)); + return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] +} + +function dist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; +} + +// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check +function orientIfSure(px, py, rx, ry, qx, qy) { + const l = (ry - py) * (qx - px); + const r = (rx - px) * (qy - py); + return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0; +} + +// a more robust orientation test that's stable in a given triangle (to fix robustness issues) +function orient(rx, ry, qx, qy, px, py) { + const sign = orientIfSure(px, py, rx, ry, qx, qy) || + orientIfSure(rx, ry, qx, qy, px, py) || + orientIfSure(qx, qy, px, py, rx, ry); + return sign < 0; +} + +function inCircle(ax, ay, bx, by, cx, cy, px, py) { + const dx = ax - px; + const dy = ay - py; + const ex = bx - px; + const ey = by - py; + const fx = cx - px; + const fy = cy - py; + + const ap = dx * dx + dy * dy; + const bp = ex * ex + ey * ey; + const cp = fx * fx + fy * fy; + + return dx * (ey * cp - bp * fy) - + dy * (ex * cp - bp * fx) + + ap * (ex * fy - ey * fx) < 0; +} + +function circumradius(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = (ey * bl - dy * cl) * d; + const y = (dx * cl - ex * bl) * d; + + return x * x + y * y; +} + +function circumcenter(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = ax + (ey * bl - dy * cl) * d; + const y = ay + (dx * cl - ex * bl) * d; + + return {x, y}; +} + +function quicksort(ids, dists, left, right) { + if (right - left <= 20) { + for (let i = left + 1; i <= right; i++) { + const temp = ids[i]; + const tempDist = dists[temp]; + let j = i - 1; + while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--]; + ids[j + 1] = temp; + } + } else { + const median = (left + right) >> 1; + let i = left + 1; + let j = right; + swap(ids, median, i); + if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right); + if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right); + if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i); + + const temp = ids[i]; + const tempDist = dists[temp]; + while (true) { + do i++; while (dists[ids[i]] < tempDist); + do j--; while (dists[ids[j]] > tempDist); + if (j < i) break; + swap(ids, i, j); + } + ids[left + 1] = ids[j]; + ids[j] = temp; + + if (right - i + 1 >= j - left) { + quicksort(ids, dists, i, right); + quicksort(ids, dists, left, j - 1); + } else { + quicksort(ids, dists, left, j - 1); + quicksort(ids, dists, i, right); + } + } +} + +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultGetX(p) { + return p[0]; +} +function defaultGetY(p) { + return p[1]; +} + +const epsilon$2 = 1e-6; + +class Path { + constructor() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + moveTo(x, y) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`; + } + closePath() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + } + lineTo(x, y) { + this._ += `L${this._x1 = +x},${this._y1 = +y}`; + } + arc(x, y, r) { + x = +x, y = +y, r = +r; + const x0 = x + r; + const y0 = y; + if (r < 0) throw new Error("negative radius"); + if (this._x1 === null) this._ += `M${x0},${y0}`; + else if (Math.abs(this._x1 - x0) > epsilon$2 || Math.abs(this._y1 - y0) > epsilon$2) this._ += "L" + x0 + "," + y0; + if (!r) return; + this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`; + } + rect(x, y, w, h) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`; + } + value() { + return this._ || null; + } +} + +class Polygon { + constructor() { + this._ = []; + } + moveTo(x, y) { + this._.push([x, y]); + } + closePath() { + this._.push(this._[0].slice()); + } + lineTo(x, y) { + this._.push([x, y]); + } + value() { + return this._.length ? this._ : null; + } +} + +class Voronoi { + constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) { + if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error("invalid bounds"); + this.delaunay = delaunay; + this._circumcenters = new Float64Array(delaunay.points.length * 2); + this.vectors = new Float64Array(delaunay.points.length * 2); + this.xmax = xmax, this.xmin = xmin; + this.ymax = ymax, this.ymin = ymin; + this._init(); + } + update() { + this.delaunay.update(); + this._init(); + return this; + } + _init() { + const {delaunay: {points, hull, triangles}, vectors} = this; + + // Compute circumcenters. + const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2); + for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) { + const t1 = triangles[i] * 2; + const t2 = triangles[i + 1] * 2; + const t3 = triangles[i + 2] * 2; + const x1 = points[t1]; + const y1 = points[t1 + 1]; + const x2 = points[t2]; + const y2 = points[t2 + 1]; + const x3 = points[t3]; + const y3 = points[t3 + 1]; + + const dx = x2 - x1; + const dy = y2 - y1; + const ex = x3 - x1; + const ey = y3 - y1; + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const ab = (dx * ey - dy * ex) * 2; + + if (!ab) { + // degenerate case (collinear diagram) + x = (x1 + x3) / 2 - 1e8 * ey; + y = (y1 + y3) / 2 + 1e8 * ex; + } + else if (Math.abs(ab) < 1e-8) { + // almost equal points (degenerate triangle) + x = (x1 + x3) / 2; + y = (y1 + y3) / 2; + } else { + const d = 1 / ab; + x = x1 + (ey * bl - dy * cl) * d; + y = y1 + (dx * cl - ex * bl) * d; + } + circumcenters[j] = x; + circumcenters[j + 1] = y; + } + + // Compute exterior cell rays. + let h = hull[hull.length - 1]; + let p0, p1 = h * 4; + let x0, x1 = points[2 * h]; + let y0, y1 = points[2 * h + 1]; + vectors.fill(0); + for (let i = 0; i < hull.length; ++i) { + h = hull[i]; + p0 = p1, x0 = x1, y0 = y1; + p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1]; + vectors[p0 + 2] = vectors[p1] = y0 - y1; + vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0; + } + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {delaunay: {halfedges, inedges, hull}, circumcenters, vectors} = this; + if (hull.length <= 1) return null; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = Math.floor(i / 3) * 2; + const tj = Math.floor(j / 3) * 2; + const xi = circumcenters[ti]; + const yi = circumcenters[ti + 1]; + const xj = circumcenters[tj]; + const yj = circumcenters[tj + 1]; + this._renderSegment(xi, yi, xj, yj, context); + } + let h0, h1 = hull[hull.length - 1]; + for (let i = 0; i < hull.length; ++i) { + h0 = h1, h1 = hull[i]; + const t = Math.floor(inedges[h1] / 3) * 2; + const x = circumcenters[t]; + const y = circumcenters[t + 1]; + const v = h0 * 4; + const p = this._project(x, y, vectors[v + 2], vectors[v + 3]); + if (p) this._renderSegment(x, y, p[0], p[1], context); + } + return buffer && buffer.value(); + } + renderBounds(context) { + const buffer = context == null ? context = new Path : undefined; + context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin); + return buffer && buffer.value(); + } + renderCell(i, context) { + const buffer = context == null ? context = new Path : undefined; + const points = this._clip(i); + if (points === null || !points.length) return; + context.moveTo(points[0], points[1]); + let n = points.length; + while (points[0] === points[n-2] && points[1] === points[n-1] && n > 1) n -= 2; + for (let i = 2; i < n; i += 2) { + if (points[i] !== points[i-2] || points[i+1] !== points[i-1]) + context.lineTo(points[i], points[i + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + *cellPolygons() { + const {delaunay: {points}} = this; + for (let i = 0, n = points.length / 2; i < n; ++i) { + const cell = this.cellPolygon(i); + if (cell) cell.index = i, yield cell; + } + } + cellPolygon(i) { + const polygon = new Polygon; + this.renderCell(i, polygon); + return polygon.value(); + } + _renderSegment(x0, y0, x1, y1, context) { + let S; + const c0 = this._regioncode(x0, y0); + const c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + context.moveTo(x0, y0); + context.lineTo(x1, y1); + } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) { + context.moveTo(S[0], S[1]); + context.lineTo(S[2], S[3]); + } + } + contains(i, x, y) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return false; + return this.delaunay._step(i, x, y) === i; + } + *neighbors(i) { + const ci = this._clip(i); + if (ci) for (const j of this.delaunay.neighbors(i)) { + const cj = this._clip(j); + // find the common edge + if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) { + for (let aj = 0, lj = cj.length; aj < lj; aj += 2) { + if (ci[ai] == cj[aj] + && ci[ai + 1] == cj[aj + 1] + && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] + && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj] + ) { + yield j; + break loop; + } + } + } + } + } + _cell(i) { + const {circumcenters, delaunay: {inedges, halfedges, triangles}} = this; + const e0 = inedges[i]; + if (e0 === -1) return null; // coincident point + const points = []; + let e = e0; + do { + const t = Math.floor(e / 3); + points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]); + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + } while (e !== e0 && e !== -1); + return points; + } + _clip(i) { + // degenerate case (1 valid point: return the box) + if (i === 0 && this.delaunay.hull.length === 1) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + const points = this._cell(i); + if (points === null) return null; + const {vectors: V} = this; + const v = i * 4; + return V[v] || V[v + 1] + ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) + : this._clipFinite(i, points); + } + _clipFinite(i, points) { + const n = points.length; + let P = null; + let x0, y0, x1 = points[n - 2], y1 = points[n - 1]; + let c0, c1 = this._regioncode(x1, y1); + let e0, e1; + for (let j = 0; j < n; j += 2) { + x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1]; + c0 = c1, c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + e0 = e1, e1 = 0; + if (P) P.push(x1, y1); + else P = [x1, y1]; + } else { + let S, sx0, sy0, sx1, sy1; + if (c0 === 0) { + if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue; + [sx0, sy0, sx1, sy1] = S; + } else { + if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue; + [sx1, sy1, sx0, sy0] = S; + e0 = e1, e1 = this._edgecode(sx0, sy0); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx0, sy0); + else P = [sx0, sy0]; + } + e0 = e1, e1 = this._edgecode(sx1, sy1); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx1, sy1); + else P = [sx1, sy1]; + } + } + if (P) { + e0 = e1, e1 = this._edgecode(P[0], P[1]); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + return P; + } + _clipSegment(x0, y0, x1, y1, c0, c1) { + while (true) { + if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1]; + if (c0 & c1) return null; + let x, y, c = c0 || c1; + if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax; + else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin; + else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax; + else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin; + if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0); + else x1 = x, y1 = y, c1 = this._regioncode(x1, y1); + } + } + _clipInfinite(i, points, vx0, vy0, vxn, vyn) { + let P = Array.from(points), p; + if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]); + if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]); + if (P = this._clipFinite(i, P)) { + for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) { + c0 = c1, c1 = this._edgecode(P[j], P[j + 1]); + if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length; + } + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax]; + } + return P; + } + _edge(i, e0, e1, P, j) { + while (e0 !== e1) { + let x, y; + switch (e0) { + case 0b0101: e0 = 0b0100; continue; // top-left + case 0b0100: e0 = 0b0110, x = this.xmax, y = this.ymin; break; // top + case 0b0110: e0 = 0b0010; continue; // top-right + case 0b0010: e0 = 0b1010, x = this.xmax, y = this.ymax; break; // right + case 0b1010: e0 = 0b1000; continue; // bottom-right + case 0b1000: e0 = 0b1001, x = this.xmin, y = this.ymax; break; // bottom + case 0b1001: e0 = 0b0001; continue; // bottom-left + case 0b0001: e0 = 0b0101, x = this.xmin, y = this.ymin; break; // left + } + if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) { + P.splice(j, 0, x, y), j += 2; + } + } + if (P.length > 4) { + for (let i = 0; i < P.length; i+= 2) { + const j = (i + 2) % P.length, k = (i + 4) % P.length; + if (P[i] === P[j] && P[j] === P[k] + || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) + P.splice(j, 2), i -= 2; + } + } + return j; + } + _project(x0, y0, vx, vy) { + let t = Infinity, c, x, y; + if (vy < 0) { // top + if (y0 <= this.ymin) return null; + if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx; + } else if (vy > 0) { // bottom + if (y0 >= this.ymax) return null; + if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx; + } + if (vx > 0) { // right + if (x0 >= this.xmax) return null; + if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy; + } else if (vx < 0) { // left + if (x0 <= this.xmin) return null; + if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy; + } + return [x, y]; + } + _edgecode(x, y) { + return (x === this.xmin ? 0b0001 + : x === this.xmax ? 0b0010 : 0b0000) + | (y === this.ymin ? 0b0100 + : y === this.ymax ? 0b1000 : 0b0000); + } + _regioncode(x, y) { + return (x < this.xmin ? 0b0001 + : x > this.xmax ? 0b0010 : 0b0000) + | (y < this.ymin ? 0b0100 + : y > this.ymax ? 0b1000 : 0b0000); + } +} + +const tau$2 = 2 * Math.PI, pow$2 = Math.pow; + +function pointX(p) { + return p[0]; +} + +function pointY(p) { + return p[1]; +} + +// A triangulation is collinear if all its triangles have a non-null area +function collinear(d) { + const {triangles, coords} = d; + for (let i = 0; i < triangles.length; i += 3) { + const a = 2 * triangles[i], + b = 2 * triangles[i + 1], + c = 2 * triangles[i + 2], + cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) + - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]); + if (cross > 1e-10) return false; + } + return true; +} + +function jitter(x, y, r) { + return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r]; +} + +class Delaunay { + static from(points, fx = pointX, fy = pointY, that) { + return new Delaunay("length" in points + ? flatArray(points, fx, fy, that) + : Float64Array.from(flatIterable(points, fx, fy, that))); + } + constructor(points) { + this._delaunator = new Delaunator(points); + this.inedges = new Int32Array(points.length / 2); + this._hullIndex = new Int32Array(points.length / 2); + this.points = this._delaunator.coords; + this._init(); + } + update() { + this._delaunator.update(); + this._init(); + return this; + } + _init() { + const d = this._delaunator, points = this.points; + + // check for collinear + if (d.hull && d.hull.length > 2 && collinear(d)) { + this.collinear = Int32Array.from({length: points.length/2}, (_,i) => i) + .sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors + const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], + bounds = [ points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1] ], + r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]); + for (let i = 0, n = points.length / 2; i < n; ++i) { + const p = jitter(points[2 * i], points[2 * i + 1], r); + points[2 * i] = p[0]; + points[2 * i + 1] = p[1]; + } + this._delaunator = new Delaunator(points); + } else { + delete this.collinear; + } + + const halfedges = this.halfedges = this._delaunator.halfedges; + const hull = this.hull = this._delaunator.hull; + const triangles = this.triangles = this._delaunator.triangles; + const inedges = this.inedges.fill(-1); + const hullIndex = this._hullIndex.fill(-1); + + // Compute an index from each point to an (arbitrary) incoming halfedge + // Used to give the first neighbor of each point; for this reason, + // on the hull we give priority to exterior halfedges + for (let e = 0, n = halfedges.length; e < n; ++e) { + const p = triangles[e % 3 === 2 ? e - 2 : e + 1]; + if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e; + } + for (let i = 0, n = hull.length; i < n; ++i) { + hullIndex[hull[i]] = i; + } + + // degenerate case: 1 or 2 (distinct) points + if (hull.length <= 2 && hull.length > 0) { + this.triangles = new Int32Array(3).fill(-1); + this.halfedges = new Int32Array(3).fill(-1); + this.triangles[0] = hull[0]; + this.triangles[1] = hull[1]; + this.triangles[2] = hull[1]; + inedges[hull[0]] = 1; + if (hull.length === 2) inedges[hull[1]] = 0; + } + } + voronoi(bounds) { + return new Voronoi(this, bounds); + } + *neighbors(i) { + const {inedges, hull, _hullIndex, halfedges, triangles, collinear} = this; + + // degenerate case with several collinear points + if (collinear) { + const l = collinear.indexOf(i); + if (l > 0) yield collinear[l - 1]; + if (l < collinear.length - 1) yield collinear[l + 1]; + return; + } + + const e0 = inedges[i]; + if (e0 === -1) return; // coincident point + let e = e0, p0 = -1; + do { + yield p0 = triangles[e]; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) return; // bad triangulation + e = halfedges[e]; + if (e === -1) { + const p = hull[(_hullIndex[i] + 1) % hull.length]; + if (p !== p0) yield p; + return; + } + } while (e !== e0); + } + find(x, y, i = 0) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return -1; + const i0 = i; + let c; + while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c; + return c; + } + _step(i, x, y) { + const {inedges, hull, _hullIndex, halfedges, triangles, points} = this; + if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1); + let c = i; + let dc = pow$2(x - points[i * 2], 2) + pow$2(y - points[i * 2 + 1], 2); + const e0 = inedges[i]; + let e = e0; + do { + let t = triangles[e]; + const dt = pow$2(x - points[t * 2], 2) + pow$2(y - points[t * 2 + 1], 2); + if (dt < dc) dc = dt, c = t; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + if (e === -1) { + e = hull[(_hullIndex[i] + 1) % hull.length]; + if (e !== t) { + if (pow$2(x - points[e * 2], 2) + pow$2(y - points[e * 2 + 1], 2) < dc) return e; + } + break; + } + } while (e !== e0); + return c; + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {points, halfedges, triangles} = this; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = triangles[i] * 2; + const tj = triangles[j] * 2; + context.moveTo(points[ti], points[ti + 1]); + context.lineTo(points[tj], points[tj + 1]); + } + this.renderHull(context); + return buffer && buffer.value(); + } + renderPoints(context, r = 2) { + const buffer = context == null ? context = new Path : undefined; + const {points} = this; + for (let i = 0, n = points.length; i < n; i += 2) { + const x = points[i], y = points[i + 1]; + context.moveTo(x + r, y); + context.arc(x, y, r, 0, tau$2); + } + return buffer && buffer.value(); + } + renderHull(context) { + const buffer = context == null ? context = new Path : undefined; + const {hull, points} = this; + const h = hull[0] * 2, n = hull.length; + context.moveTo(points[h], points[h + 1]); + for (let i = 1; i < n; ++i) { + const h = 2 * hull[i]; + context.lineTo(points[h], points[h + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + hullPolygon() { + const polygon = new Polygon; + this.renderHull(polygon); + return polygon.value(); + } + renderTriangle(i, context) { + const buffer = context == null ? context = new Path : undefined; + const {points, triangles} = this; + const t0 = triangles[i *= 3] * 2; + const t1 = triangles[i + 1] * 2; + const t2 = triangles[i + 2] * 2; + context.moveTo(points[t0], points[t0 + 1]); + context.lineTo(points[t1], points[t1 + 1]); + context.lineTo(points[t2], points[t2 + 1]); + context.closePath(); + return buffer && buffer.value(); + } + *trianglePolygons() { + const {triangles} = this; + for (let i = 0, n = triangles.length / 3; i < n; ++i) { + yield this.trianglePolygon(i); + } + } + trianglePolygon(i) { + const polygon = new Polygon; + this.renderTriangle(i, polygon); + return polygon.value(); + } +} + +function flatArray(points, fx, fy, that) { + const n = points.length; + const array = new Float64Array(n * 2); + for (let i = 0; i < n; ++i) { + const p = points[i]; + array[i * 2] = fx.call(that, p, i, points); + array[i * 2 + 1] = fy.call(that, p, i, points); + } + return array; +} + +function* flatIterable(points, fx, fy, that) { + let i = 0; + for (const p of points) { + yield fx.call(that, p, i, points); + yield fy.call(that, p, i, points); + ++i; + } +} + +var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + +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 pad$1(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; +} + +function formatYear$1(year) { + return year < 0 ? "-" + pad$1(-year, 6) + : year > 9999 ? "+" + pad$1(year, 6) + : pad$1(year, 4); +} + +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear$1(date.getUTCFullYear()) + "-" + pad$1(date.getUTCMonth() + 1, 2) + "-" + pad$1(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + ":" + pad$1(seconds, 2) + "." + pad$1(milliseconds, 3) + "Z" + : seconds ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + ":" + pad$1(seconds, 2) + "Z" + : minutes || hours ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + "Z" + : ""); +} + +function dsvFormat(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = 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 rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; +} + +var csv$1 = dsvFormat(","); + +var csvParse = csv$1.parse; +var csvParseRows = csv$1.parseRows; +var csvFormat = csv$1.format; +var csvFormatBody = csv$1.formatBody; +var csvFormatRows = csv$1.formatRows; +var csvFormatRow = csv$1.formatRow; +var csvFormatValue = csv$1.formatValue; + +var tsv$1 = dsvFormat("\t"); + +var tsvParse = tsv$1.parse; +var tsvParseRows = tsv$1.parseRows; +var tsvFormat = tsv$1.format; +var tsvFormatBody = tsv$1.formatBody; +var tsvFormatRows = tsv$1.formatRows; +var tsvFormatRow = tsv$1.formatRow; +var tsvFormatValue = tsv$1.formatValue; + +function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } + else continue; + object[key] = value; + } + return object; +} + +// https://github.com/d3/d3-dsv/issues/45 +const fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); +} + +function blob(input, init) { + return fetch(input, init).then(responseBlob); +} + +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); +} + +function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); +} + +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); +} + +function text(input, init) { + return fetch(input, init).then(responseText); +} + +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; +} + +function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); +} + +var csv = dsvParse(csvParse); +var tsv = dsvParse(tsvParse); + +function image(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); +} + +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + if (response.status === 204 || response.status === 205) return; + return response.json(); +} + +function json(input, init) { + return fetch(input, init).then(responseJson); +} + +function parser(type) { + return (input, init) => text(input, init) + .then(text => (new DOMParser).parseFromString(text, type)); +} + +var xml = parser("application/xml"); + +var html = parser("text/html"); + +var svg = parser("image/svg+xml"); + +function center(x, y) { + var nodes, strength = 1; + + 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) * strength, sy = (sy / n - y) * strength, 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; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + return force; +} + +function tree_add(d) { + const 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, abort. + if (x0 > x1 || y0 > y1) return this; + + // 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 { + var z = x1 - x0 || 1, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: x1 = x0 + z, y1 = y0 + z; break; + case 1: x0 = x1 - z, y1 = y0 + z; break; + case 2: x1 = x0 + z, y0 = y1 - z; break; + case 3: x0 = x1 - z, y0 = y1 - z; break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + 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; + +function constant$4(x) { + return function() { + return x; + }; +} + +function jiggle(random) { + return (random() - 0.5) * 1e-6; +} + +function x$3(d) { + return d.x + d.vx; +} + +function y$3(d) { + return d.y + d.vy; +} + +function collide(radius) { + var nodes, + radii, + random, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant$4(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$3, y$3).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], 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 > node.index) { + 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(random), l += x * x; + if (y === 0) y = jiggle(random), 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; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + 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$4(+_), initialize(), force) : radius; + }; + + return force; +} + +function index$3(d) { + return d.index; +} + +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("node not found: " + nodeId); + return node; +} + +function link$2(links) { + var id = index$3, + strength = defaultStrength, + strengths, + distance = constant$4(30), + distances, + nodes, + count, + bias, + random, + 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(random); + y = target.y + target.vy - source.y - source.vy || jiggle(random); + 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 = new Map(nodes.map((d, i) => [id(d, i, nodes), d])), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + 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, _random) { + nodes = _nodes; + random = _random; + 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$4(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$4(+_), initializeDistance(), force) : distance; + }; + + return force; +} + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const a$1 = 1664525; +const c$3 = 1013904223; +const m = 4294967296; // 2^32 + +function lcg$1() { + let s = 1; + return () => (s = (a$1 * s + c$3) % m) / m; +} + +function x$2(d) { + return d.x; +} + +function y$2(d) { + return d.y; +} + +var initialRadius = 10, + 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 = new Map(), + stepper = timer(step), + event = dispatch("tick", "end"), + random = lcg$1(); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.forEach(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; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + 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, random); + 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.forEach(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; + }, + + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.delete(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, + random, + alpha, + strength = constant$4(-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, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, 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 = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // 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(random), l += x * x; + if (y === 0) y = jiggle(random), 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(random), l += x * x; + if (y === 0) y = jiggle(random), 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, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), 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 radial$1(radius, x, y) { + var nodes, + strength = constant$4(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant$4(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _, initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : radius; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} + +function x$1(x) { + var strength = constant$4(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant$4(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$4(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : x; + }; + + return force; +} + +function y$1(y) { + var strength = constant$4(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant$4(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$4(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : y; + }; + + return force; +} + +function formatDecimal(x) { + return Math.abs(x = Math.round(x)) >= 1e21 + ? x.toLocaleString("en").replace(/,/g, "") + : x.toString(10); +} + +// 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, formatDecimalParts(1.23) returns ["123", 0]. +function formatDecimalParts(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(x) { + return x = formatDecimalParts(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 formatNumerals(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +} + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + +function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); +} + +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + +function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; +} + +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; +}; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. +function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} + +var prefixExponent; + +function formatPrefixAuto(x, p) { + var d = formatDecimalParts(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") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! +} + +function formatRounded(x, p) { + var d = formatDecimalParts(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 = { + "%": (x, p) => (x * 100).toFixed(p), + "b": (x) => Math.round(x).toString(2), + "c": (x) => x + "", + "d": formatDecimal, + "e": (x, p) => x.toExponential(p), + "f": (x, p) => x.toFixed(p), + "g": (x, p) => x.toPrecision(p), + "o": (x) => Math.round(x).toString(8), + "p": (x, p) => formatRounded(x * 100, p), + "r": formatRounded, + "s": formatPrefixAuto, + "X": (x) => Math.round(x).toString(16).toUpperCase(), + "x": (x) => Math.round(x).toString(16) +}; + +function identity$6(x) { + return x; +} + +var map = Array.prototype.map, + prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]; + +function formatLocale$1(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity$6 : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity$6 : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "\u2212" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + 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, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[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 === undefined ? 6 + : /[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; + + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (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 "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } + + return numerals(value); + } + + 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(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$1; +exports.format = void 0; +exports.formatPrefix = void 0; + +defaultLocale$1({ + thousands: ",", + grouping: [3], + currency: ["$", ""] +}); + +function defaultLocale$1(definition) { + locale$1 = formatLocale$1(definition); + exports.format = locale$1.format; + exports.formatPrefix = locale$1.formatPrefix; + return locale$1; +} + +function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); +} + +function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); +} + +function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; +} + +var epsilon$1 = 1e-6; +var epsilon2 = 1e-12; +var pi$1 = Math.PI; +var halfPi$1 = pi$1 / 2; +var quarterPi = pi$1 / 4; +var tau$1 = pi$1 * 2; + +var degrees = 180 / pi$1; +var radians = pi$1 / 180; + +var abs$1 = Math.abs; +var atan = Math.atan; +var atan2$1 = Math.atan2; +var cos$1 = Math.cos; +var ceil = Math.ceil; +var exp = Math.exp; +var hypot = Math.hypot; +var log$1 = Math.log; +var pow$1 = Math.pow; +var sin$1 = Math.sin; +var sign$1 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt$2 = Math.sqrt; +var tan = Math.tan; + +function acos$1(x) { + return x > 1 ? 0 : x < -1 ? pi$1 : Math.acos(x); +} + +function asin$1(x) { + return x > 1 ? halfPi$1 : x < -1 ? -halfPi$1 : Math.asin(x); +} + +function haversin(x) { + return (x = sin$1(x / 2)) * x; +} + +function noop$1() {} + +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } +} + +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.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$1 = new Adder(); + +// hello? + +var areaSum$1 = new Adder(), + lambda00$2, + phi00$2, + lambda0$2, + cosPhi0$1, + sinPhi0$1; + +var areaStream$1 = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function() { + areaRingSum$1 = new Adder(); + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + var areaRing = +areaRingSum$1; + areaSum$1.add(areaRing < 0 ? tau$1 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$1; + }, + sphere: function() { + areaSum$1.add(tau$1); + } +}; + +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; +} + +function areaRingEnd$1() { + areaPoint$1(lambda00$2, phi00$2); +} + +function areaPointFirst$1(lambda, phi) { + areaStream$1.point = areaPoint$1; + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + lambda0$2 = lambda, cosPhi0$1 = cos$1(phi = phi / 2 + quarterPi), sinPhi0$1 = sin$1(phi); +} + +function areaPoint$1(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$2, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos$1(phi), + sinPhi = sin$1(phi), + k = sinPhi0$1 * sinPhi, + u = cosPhi0$1 * cosPhi + k * cos$1(adLambda), + v = k * sdLambda * sin$1(adLambda); + areaRingSum$1.add(atan2$1(v, u)); + + // Advance the previous points. + lambda0$2 = lambda, cosPhi0$1 = cosPhi, sinPhi0$1 = sinPhi; +} + +function area$2(object) { + areaSum$1 = new Adder(); + geoStream(object, areaStream$1); + return areaSum$1 * 2; +} + +function spherical(cartesian) { + return [atan2$1(cartesian[1], cartesian[0]), asin$1(cartesian[2])]; +} + +function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi); + return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(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$2(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; +} + +var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum, + ranges, + range; + +var boundsStream$1 = { + point: boundsPoint$1, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream$1.point = boundsRingPoint; + boundsStream$1.lineStart = boundsRingStart; + boundsStream$1.lineEnd = boundsRingEnd; + deltaSum = new Adder(); + areaStream$1.polygonStart(); + }, + polygonEnd: function() { + areaStream$1.polygonEnd(); + boundsStream$1.point = boundsPoint$1; + boundsStream$1.lineStart = boundsLineStart; + boundsStream$1.lineEnd = boundsLineEnd; + if (areaRingSum$1 < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$1) phi1 = 90; + else if (deltaSum < -epsilon$1) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function() { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } +}; + +function boundsPoint$1(lambda, phi) { + ranges.push(range = [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 * sign, + phii, + antimeridian = abs$1(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + 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 { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; +} + +function boundsLineStart() { + boundsStream$1.point = linePoint; +} + +function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream$1.point = boundsPoint$1; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs$1(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream$1.point(lambda, phi); + linePoint(lambda, phi); +} + +function boundsRingStart() { + areaStream$1.lineStart(); +} + +function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream$1.lineEnd(); + if (abs$1(deltaSum) > epsilon$1) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[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$1); + + // 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 = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; +} + +var W0, W1, + X0$1, Y0$1, Z0$1, + X1$1, Y1$1, Z1$1, + X2$1, Y2$1, Z2$1, + lambda00, phi00, // first point + x0$4, y0$4, z0; // previous point + +var centroidStream$1 = { + sphere: noop$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.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + } +}; + +// Arithmetic mean of Cartesian vectors. +function centroidPoint$1(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); +} + +function centroidPointCartesian(x, y, z) { + ++W0; + X0$1 += (x - X0$1) / W0; + Y0$1 += (y - Y0$1) / W0; + Z0$1 += (z - Z0$1) / W0; +} + +function centroidLineStart$1() { + centroidStream$1.point = centroidLinePointFirst; +} + +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + x0$4 = cosPhi * cos$1(lambda); + y0$4 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidStream$1.point = centroidLinePoint; + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + w = atan2$1(sqrt$2((w = y0$4 * z - z0 * y) * w + (w = z0 * x - x0$4 * z) * w + (w = x0$4 * y - y0$4 * x) * w), x0$4 * x + y0$4 * y + z0 * z); + W1 += w; + X1$1 += w * (x0$4 + (x0$4 = x)); + Y1$1 += w * (y0$4 + (y0$4 = y)); + Z1$1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; +} + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart$1() { + centroidStream$1.point = centroidRingPointFirst; +} + +function centroidRingEnd$1() { + centroidRingPoint(lambda00, phi00); + centroidStream$1.point = centroidPoint$1; +} + +function centroidRingPointFirst(lambda, phi) { + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + centroidStream$1.point = centroidRingPoint; + var cosPhi = cos$1(phi); + x0$4 = cosPhi * cos$1(lambda); + y0$4 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + cx = y0$4 * z - z0 * y, + cy = z0 * x - x0$4 * z, + cz = x0$4 * y - y0$4 * x, + m = hypot(cx, cy, cz), + w = asin$1(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2$1.add(v * cx); + Y2$1.add(v * cy); + Z2$1.add(v * cz); + W1 += w; + X1$1 += w * (x0$4 + (x0$4 = x)); + Y1$1 += w * (y0$4 + (y0$4 = y)); + Z1$1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroid$1(object) { + W0 = W1 = + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = 0; + X2$1 = new Adder(); + Y2$1 = new Adder(); + Z2$1 = new Adder(); + geoStream(object, centroidStream$1); + + var x = +X2$1, + y = +Y2$1, + z = +Z2$1, + m = hypot(x, y, z); + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1$1, y = Y1$1, z = Z1$1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon$1) x = X0$1, y = Y0$1, z = Z0$1; + m = hypot(x, y, z); + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } + + return [atan2$1(y, x) * degrees, asin$1(z / m) * degrees]; +} + +function constant$3(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 [abs$1(lambda) > pi$1 ? lambda + Math.round(-lambda / tau$1) * tau$1 : lambda, phi]; +} + +rotationIdentity.invert = rotationIdentity; + +function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau$1) ? (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$1 ? lambda - tau$1 : lambda < -pi$1 ? lambda + tau$1 : lambda, phi]; + }; +} + +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; +} + +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos$1(deltaPhi), + sinDeltaPhi = sin$1(deltaPhi), + cosDeltaGamma = cos$1(deltaGamma), + sinDeltaGamma = sin$1(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2$1(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin$1(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2$1(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, coordinates[1] *= degrees, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, 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$1(radius), + sinRadius = sin$1(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau$1; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$1; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(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$1(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$1 - epsilon$1) % tau$1; +} + +function circle$2() { + var center = constant$3([0, 0]), + radius = constant$3(90), + precision = constant$3(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; + } + + 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$3([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$3(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$3(+_), circle) : precision; + }; + + return circle; +} + +function clipBuffer() { + var lines = [], + line; + return { + point: function(x, y, m) { + line.push([x, y, m]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop$1, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +} + +function pointEqual(a, b) { + return abs$1(a[0] - b[0]) < epsilon$1 && abs$1(a[1] - b[1]) < epsilon$1; +} + +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 clipRejoin(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 (pointEqual(p0, p1)) { + if (!p0[2] && !p1[2]) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + // handle degenerate cases by moving the point + p1[0] += 2 * epsilon$1; + } + + 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; +} + +function longitude(point) { + if (abs$1(point[0]) <= pi$1) + return point[0]; + else + return sign$1(point[0]) * ((abs$1(point[0]) + pi$1) % tau$1 - pi$1); +} + +function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin$1(phi), + normal = [sin$1(lambda), -cos$1(lambda), 0], + angle = 0, + winding = 0; + + var sum = new Adder(); + + if (sinPhi === 1) phi = halfPi$1 + epsilon$1; + else if (sinPhi === -1) phi = -halfPi$1 - epsilon$1; + + 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 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin$1(phi0), + cosPhi0 = cos$1(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin$1(phi1), + cosPhi1 = cos$1(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi$1, + k = sinPhi0 * sinPhi1; + + sum.add(atan2$1(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign * tau$1 : 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$1 || angle < epsilon$1 && sum < -epsilon2) ^ (winding & 1); +} + +function clip(pointVisible, clipLine, interpolate, start) { + return function(sink) { + var line = clipLine(sink), + 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, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(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) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + 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$1 - epsilon$1 : halfPi$1 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$1 - epsilon$1 : halfPi$1 - b[1]); +} + +var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi$1, -halfPi$1] +); + +// 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$1 : -pi$1, + delta = abs$1(lambda1 - lambda0); + if (abs$1(delta - pi$1) < epsilon$1) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$1 : -halfPi$1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi$1) { // line crosses antimeridian + if (abs$1(lambda0 - sign0) < epsilon$1) lambda0 -= sign0 * epsilon$1; // handle degeneracies + if (abs$1(lambda1 - sign1) < epsilon$1) lambda1 -= sign1 * epsilon$1; + 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$1(lambda0 - lambda1); + return abs$1(sinLambda0Lambda1) > epsilon$1 + ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) + - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} + +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi$1; + stream.point(-pi$1, phi); + stream.point(0, phi); + stream.point(pi$1, phi); + stream.point(pi$1, 0); + stream.point(pi$1, -phi); + stream.point(0, -phi); + stream.point(-pi$1, -phi); + stream.point(-pi$1, 0); + stream.point(-pi$1, phi); + } else if (abs$1(from[0] - to[0]) > epsilon$1) { + var lambda = from[0] < to[0] ? pi$1 : -pi$1; + 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) { + var cr = cos$1(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs$1(cr) > epsilon$1; // 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$1(lambda) * cos$1(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$1 : -pi$1), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) + point1[2] = 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], 2); + 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], 3); + } + } + } + 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$2(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$1(delta - pi$1) < epsilon$1, + meridian = polar || delta < epsilon$1; + + 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$1(q[0] - lambda0) < epsilon$1 ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi$1 ^ (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$1 - 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$1, radius - pi$1]); +} + +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; +} + +var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +function clipRectangle(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$1(p[0] - x0) < epsilon$1 ? direction > 0 ? 0 : 3 + : abs$1(p[0] - x1) < epsilon$1 ? direction > 0 ? 2 : 1 + : abs$1(p[1] - y0) < epsilon$1 ? 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) { + clipRejoin(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() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(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$1, + lambda0, + sinPhi0, + cosPhi0; + +var lengthStream$1 = { + sphere: noop$1, + point: noop$1, + lineStart: lengthLineStart, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1 +}; + +function lengthLineStart() { + lengthStream$1.point = lengthPointFirst$1; + lengthStream$1.lineEnd = lengthLineEnd; +} + +function lengthLineEnd() { + lengthStream$1.point = lengthStream$1.lineEnd = noop$1; +} + +function lengthPointFirst$1(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0 = lambda, sinPhi0 = sin$1(phi), cosPhi0 = cos$1(phi); + lengthStream$1.point = lengthPoint$1; +} + +function lengthPoint$1(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin$1(phi), + cosPhi = cos$1(phi), + delta = abs$1(lambda - lambda0), + cosDelta = cos$1(delta), + sinDelta = sin$1(delta), + x = cosPhi * sinDelta, + y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta, + z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta; + lengthSum$1.add(atan2$1(sqrt$2(x * x + y * y), z)); + lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi; +} + +function length$1(object) { + lengthSum$1 = new Adder(); + geoStream(object, lengthStream$1); + return +lengthSum$1; +} + +var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + +function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length$1(object); +} + +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } +}; + +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } +}; + +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; +} + +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; +} + +function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; + } + return false; +} + +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +} + +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; +} + +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; +} + +function contains$1(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); +} + +function graticuleX(y0, y1, dy) { + var y = sequence(y0, y1 - epsilon$1, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; +} + +function graticuleY(x0, x1, dx) { + var x = sequence(x0, x1 - epsilon$1, 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 sequence(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$1(x % DX) > epsilon$1; }).map(x)) + .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$1(y % DY) > epsilon$1; }).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$1], [180, 90 - epsilon$1]]) + .extentMinor([[-180, -80 - epsilon$1], [180, 80 + epsilon$1]]); +} + +function graticule10() { + return graticule()(); +} + +function interpolate(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos$1(y0), + sy0 = sin$1(y0), + cy1 = cos$1(y1), + sy1 = sin$1(y1), + kx0 = cy0 * cos$1(x0), + ky0 = cy0 * sin$1(x0), + kx1 = cy1 * cos$1(x1), + ky1 = cy1 * sin$1(x1), + d = 2 * asin$1(sqrt$2(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin$1(d); + + var interpolate = d ? function(t) { + var B = sin$1(t *= d) / k, + A = sin$1(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2$1(y, x) * degrees, + atan2$1(z, sqrt$2(x * x + y * y)) * degrees + ]; + } : function() { + return [x0 * degrees, y0 * degrees]; + }; + + interpolate.distance = d; + + return interpolate; +} + +var identity$5 = x => x; + +var areaSum = new Adder(), + areaRingSum = new Adder(), + x00$2, + y00$2, + x0$3, + y0$3; + +var areaStream = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function() { + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$1; + areaSum.add(abs$1(areaRingSum)); + areaRingSum = new Adder(); + }, + result: function() { + var area = areaSum / 2; + areaSum = new Adder(); + return area; + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaPointFirst(x, y) { + areaStream.point = areaPoint; + x00$2 = x0$3 = x, y00$2 = y0$3 = y; +} + +function areaPoint(x, y) { + areaRingSum.add(y0$3 * x - x0$3 * y); + x0$3 = x, y0$3 = y; +} + +function areaRingEnd() { + areaPoint(x00$2, y00$2); +} + +var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + +var boundsStream = { + point: boundsPoint, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } +}; + +function boundsPoint(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; +} + +// TODO Enforce positive area for exterior, negative area for interior? + +var X0 = 0, + Y0 = 0, + Z0 = 0, + X1 = 0, + Y1 = 0, + Z1 = 0, + X2 = 0, + Y2 = 0, + Z2 = 0, + x00$1, + y00$1, + x0$1, + y0$1; + +var centroidStream = { + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.point = centroidPoint; + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + }, + result: function() { + var centroid = Z2 ? [X2 / Z2, Y2 / Z2] + : Z1 ? [X1 / Z1, Y1 / Z1] + : Z0 ? [X0 / Z0, Y0 / Z0] + : [NaN, NaN]; + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + return centroid; + } +}; + +function centroidPoint(x, y) { + X0 += x; + Y0 += y; + ++Z0; +} + +function centroidLineStart() { + centroidStream.point = centroidPointFirstLine; +} + +function centroidPointFirstLine(x, y) { + centroidStream.point = centroidPointLine; + centroidPoint(x0$1 = x, y0$1 = y); +} + +function centroidPointLine(x, y) { + var dx = x - x0$1, dy = y - y0$1, z = sqrt$2(dx * dx + dy * dy); + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; + centroidPoint(x0$1 = x, y0$1 = y); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +function centroidRingStart() { + centroidStream.point = centroidPointFirstRing; +} + +function centroidRingEnd() { + centroidPointRing(x00$1, y00$1); +} + +function centroidPointFirstRing(x, y) { + centroidStream.point = centroidPointRing; + centroidPoint(x00$1 = x0$1 = x, y00$1 = y0$1 = y); +} + +function centroidPointRing(x, y) { + var dx = x - x0$1, + dy = y - y0$1, + z = sqrt$2(dx * dx + dy * dy); + + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; + + z = y0$1 * x - x0$1 * y; + X2 += z * (x0$1 + x); + Y2 += z * (y0$1 + y); + Z2 += z * 3; + centroidPoint(x0$1 = x, y0$1 = y); +} + +function PathContext(context) { + this._context = context; +} + +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau$1); + break; + } + } + }, + result: noop$1 +}; + +var lengthSum = new Adder(), + lengthRing, + x00, + y00, + x0, + y0; + +var lengthStream = { + point: noop$1, + lineStart: function() { + lengthStream.point = lengthPointFirst; + }, + lineEnd: function() { + if (lengthRing) lengthPoint(x00, y00); + lengthStream.point = noop$1; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum; + lengthSum = new Adder(); + return length; + } +}; + +function lengthPointFirst(x, y) { + lengthStream.point = lengthPoint; + x00 = x0 = x, y00 = y0 = y; +} + +function lengthPoint(x, y) { + x0 -= x, y0 -= y; + lengthSum.add(sqrt$2(x0 * x0 + y0 * y0)); + x0 = x, y0 = y; +} + +function PathString() { + this._string = []; +} + +PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; + +function circle$1(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$2(projection, context) { + var pointRadius = 4.5, + projectionStream, + 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)); + return areaStream.result(); + }; + + path.measure = function(object) { + geoStream(object, projectionStream(lengthStream)); + return lengthStream.result(); + }; + + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream)); + return boundsStream.result(); + }; + + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream)); + return centroidStream.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$5) : (projection = _).stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + 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(projection).context(context); +} + +function transform$1(methods) { + return { + stream: transformer$3(methods) + }; +} + +function transformer$3(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; +} + +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + 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(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream)); + fitBounds(boundsStream.result()); + if (clip != null) projection.clipExtent(clip); + return projection; +} + +function fitExtent(projection, extent, object) { + return fit(projection, function(b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + 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; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); +} + +function fitWidth(projection, width, object) { + return fit(projection, function(b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitHeight(projection, height, object) { + return fit(projection, function(b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance) + +function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); +} + +function resampleNone(project) { + return transformer$3({ + 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$2(a * a + b * b + c * c), + phi2 = asin$1(c /= m), + lambda2 = abs$1(abs$1(c) - 1) < epsilon$1 || abs$1(lambda0 - lambda1) < epsilon$1 ? (lambda0 + lambda1) / 2 : atan2$1(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$1((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 = transformer$3({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function transformRotate(rotate) { + return transformer$3({ + point: function(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); +} + +function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; y *= sy; + return [dx + k * x, dy - k * y]; + } + transform.invert = function(x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; + return transform; +} + +function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); + var cosAlpha = cos$1(alpha), + sinAlpha = sin$1(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + x *= sx; y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function(x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + return transform; +} + +function projection(project) { + return projectionMutator(function() { return project; })(); +} + +function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity$5, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function(_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$5) : clipRectangle(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, phi * degrees]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; + + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt$2(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + 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$1 / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; + }; + + return p; +} + +function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos$1(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin$1(y * cosPhi0)]; + }; + + return forward; +} + +function conicEqualAreaRaw(y0, y1) { + var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs$1(n) < epsilon$1) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt$2(c) / n; + + function project(x, y) { + var r = sqrt$2(c - 2 * n * sin$1(y)) / n; + return [r * sin$1(x *= n), r0 - r * cos$1(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y, + l = atan2$1(x, abs$1(r0y)) * sign$1(r0y); + if (r0y * n < 0) + l -= pi$1 * sign$1(x) * sign$1(r0y); + return [l / 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 reset(); + }; + + 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$1, y + 0.120 * k + epsilon$1], [x - 0.214 * k - epsilon$1, y + 0.234 * k - epsilon$1]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon$1, y + 0.166 * k + epsilon$1], [x - 0.115 * k - epsilon$1, y + 0.234 * k - epsilon$1]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function(width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function(height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); +} + +function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos$1(x), + cy = cos$1(y), + k = scale(cx * cy); + if (k === Infinity) return [2, 0]; + return [ + k * cy * sin$1(x), + k * sin$1(y) + ]; + } +} + +function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt$2(x * x + y * y), + c = angle(z), + sc = sin$1(c), + cc = cos$1(c); + return [ + atan2$1(x * sc, z * cc), + asin$1(z && y * sc / z) + ]; + } +} + +var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt$2(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$1(c)) && c / sin$1(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$1 + phi) / 2))]; +} + +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi$1]; +}; + +function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau$1); +} + +function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi$1 * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); +} + +function tany(y) { + return tan((halfPi$1 + y) / 2); +} + +function conicConformalRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : log$1(cy0 / cos$1(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$1 + epsilon$1) y = -halfPi$1 + epsilon$1; } + else { if (y > halfPi$1 - epsilon$1) y = halfPi$1 - epsilon$1; } + var r = f / pow$1(tany(y), n); + return [r * sin$1(n * x), f - r * cos$1(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign$1(n) * sqrt$2(x * x + fy * fy), + l = atan2$1(x, abs$1(fy)) * sign$1(fy); + if (fy * n < 0) + l -= pi$1 * sign$1(x) * sign$1(fy); + return [l / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$1]; + }; + + 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$1(y0), + n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs$1(n) < epsilon$1) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin$1(nx), g - gy * cos$1(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y, + l = atan2$1(x, abs$1(gy)) * sign$1(gy); + if (gy * n < 0) + l -= pi$1 * sign$1(x) * sign$1(gy); + return [l / n, g - sign$1(n) * sqrt$2(x * x + gy * gy)]; + }; + + return project; +} + +function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +} + +var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt$2(3) / 2, + iterations = 12; + +function equalEarthRaw(lambda, phi) { + var l = asin$1(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; +} + +equalEarthRaw.invert = function(x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs$1(delta) < epsilon2) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l), + asin$1(sin$1(l) / M) + ]; +}; + +function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); +} + +function gnomonicRaw(x, y) { + var cy = cos$1(y), k = cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +gnomonicRaw.invert = azimuthalInvert(atan); + +function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); +} + +function identity$4() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle + x0 = null, y0, x1, y1, // clip extent + kx = 1, ky = 1, + transform = transformer$3({ + point: function(x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity$5, + cache, + cacheStream; + + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; + } + + function projection (p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function(p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } + return [x / kx, y / ky]; + }; + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$5) : clipRectangle(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 = +_, reset()) : k; + }; + projection.translate = function(_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin$1(alpha), ca = cos$1(alpha), reset()) : alpha * degrees; + }; + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + return projection; +} + +function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; +} + +naturalEarth1Raw.invert = function(x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs$1(delta) > epsilon$1 && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; +}; + +function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); +} + +function orthographicRaw(x, y) { + return [cos$1(y) * sin$1(x), sin$1(y)]; +} + +orthographicRaw.invert = azimuthalInvert(asin$1); + +function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon$1); +} + +function stereographicRaw(x, y) { + var cy = cos$1(y), k = 1 + cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(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$1 + phi) / 2)), -lambda]; +} + +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi$1]; +}; + +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 defaultSeparation$1(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$1, + 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 count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +function node_count() { + return this.eachAfter(count); +} + +function node_each(callback, that) { + let index = -1; + for (const node of this) { + callback.call(that, node, ++index, this); + } + return this; +} + +function node_eachBefore(callback, that) { + var node = this, nodes = [node], children, i, index = -1; + while (node = nodes.pop()) { + callback.call(that, node, ++index, this); + if (children = node.children) { + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + } + return this; +} + +function node_eachAfter(callback, that) { + var node = this, nodes = [node], next = [], children, i, n, index = -1; + while (node = nodes.pop()) { + next.push(node); + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + } + while (node = next.pop()) { + callback.call(that, node, ++index, this); + } + return this; +} + +function node_find(callback, that) { + let index = -1; + for (const node of this) { + if (callback.call(that, node, ++index, this)) { + return node; + } + } +} + +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() { + return Array.from(this); +} + +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* node_iterator() { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + yield node; + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } + } while (next.length); +} + +function hierarchy(data, children) { + if (data instanceof Map) { + data = [undefined, data]; + if (children === undefined) children = mapChildren; + } else if (children === undefined) { + children = objectChildren; + } + + var root = new Node$1(data), + node, + nodes = [root], + child, + childs, + i, + n; + + while (node = nodes.pop()) { + if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) { + node.children = childs; + for (i = n - 1; i >= 0; --i) { + nodes.push(child = childs[i] = new Node$1(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); +} + +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} + +function objectChildren(d) { + return d.children; +} + +function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; +} + +function copyData(node) { + if (node.data.value !== undefined) node.value = node.data.value; + node.data = node.data.data; +} + +function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} + +function Node$1(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} + +Node$1.prototype = hierarchy.prototype = { + constructor: Node$1, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + find: node_find, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy, + [Symbol.iterator]: node_iterator +}; + +function array$1(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function shuffle(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; +} + +function enclose(circles) { + var i = 0, n = (circles = shuffle(Array.from(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; +} + +function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; +} + +function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; +} + +function enclosesWeak(a, b) { + var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; +} + +function encloseBasis(B) { + switch (B.length) { + case 1: return encloseBasis1(B[0]); + case 2: return encloseBasis2(B[0], B[1]); + case 3: return encloseBasis3(B[0], B[1], B[2]); + } +} + +function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} + +function encloseBasis2(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 encloseBasis3(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 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; +} + +function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } +} + +function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; +} + +function Node(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} + +function packEnclose(circles) { + if (!(n = (circles = array$1(circles)).length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // 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 front-chain using the first three circles a, b and c. + a = new Node(a), b = new Node(b), c = new Node(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(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } 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; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < 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$2(x) { + return function() { + return x; + }; +} + +function defaultRadius(d) { + return Math.sqrt(d.value); +} + +function index$1() { + 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$2(+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 preroot = {depth: -1}, + ambiguous = {}; + +function defaultId(d) { + return d.id; +} + +function defaultParentId(d) { + return d.parentId; +} + +function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var nodes = Array.from(data), + n = nodes.length, + d, + i, + root, + parent, + node, + nodeId, + nodeKey, + nodeByKey = new Map; + + for (i = 0; i < n; ++i) { + d = nodes[i], node = nodes[i] = new Node$1(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = node.id = nodeId; + nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); + } + if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { + node.parent = nodeId; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (nodeId = node.parent) { + parent = nodeByKey.get(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; + } else { + if (root) throw new Error("multiple roots"); + root = node; + } + } + + 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(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$1.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, + 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 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + 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 < 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() { + 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$2(+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$2(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$2(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$2(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$2(+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; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, 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, value ? y0 += (y1 - y0) * row.value / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, 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 area$1(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$1(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) { + const n = points.length, + indexes = [0, 1]; + let size = 2, i; + + for (i = 2; i < n; ++i) { + while (size > 1 && cross$1(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(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.hypot(xa, ya); + } + + return perimeter; +} + +var defaultSource = Math.random; + +var uniform = (function sourceRandomUniform(source) { + function randomUniform(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 source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; +})(defaultSource); + +var int = (function sourceRandomInt(source) { + function randomInt(min, max) { + if (arguments.length < 2) max = min, min = 0; + min = Math.floor(min); + max = Math.floor(max) - min; + return function() { + return Math.floor(source() * max + min); + }; + } + + randomInt.source = sourceRandomInt; + + return randomInt; +})(defaultSource); + +var normal = (function sourceRandomNormal(source) { + function randomNormal(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 = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; +})(defaultSource); + +var logNormal = (function sourceRandomLogNormal(source) { + var N = normal.source(source); + + function randomLogNormal() { + var randomNormal = N.apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; +})(defaultSource); + +var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + if ((n = +n) <= 0) return () => 0; + return function() { + for (var sum = 0, i = n; i > 1; --i) sum += source(); + return sum + i * source(); + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; +})(defaultSource); + +var bates = (function sourceRandomBates(source) { + var I = irwinHall.source(source); + + function randomBates(n) { + // use limiting distribution at n === 0 + if ((n = +n) === 0) return source; + var randomIrwinHall = I(n); + return function() { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; +})(defaultSource); + +var exponential = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log1p(-source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; +})(defaultSource); + +var pareto = (function sourceRandomPareto(source) { + function randomPareto(alpha) { + if ((alpha = +alpha) < 0) throw new RangeError("invalid alpha"); + alpha = 1 / -alpha; + return function() { + return Math.pow(1 - source(), alpha); + }; + } + + randomPareto.source = sourceRandomPareto; + + return randomPareto; +})(defaultSource); + +var bernoulli = (function sourceRandomBernoulli(source) { + function randomBernoulli(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + return function() { + return Math.floor(source() + p); + }; + } + + randomBernoulli.source = sourceRandomBernoulli; + + return randomBernoulli; +})(defaultSource); + +var geometric = (function sourceRandomGeometric(source) { + function randomGeometric(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + if (p === 0) return () => Infinity; + if (p === 1) return () => 1; + p = Math.log1p(-p); + return function() { + return 1 + Math.floor(Math.log1p(-source()) / p); + }; + } + + randomGeometric.source = sourceRandomGeometric; + + return randomGeometric; +})(defaultSource); + +var gamma = (function sourceRandomGamma(source) { + var randomNormal = normal.source(source)(); + + function randomGamma(k, theta) { + if ((k = +k) < 0) throw new RangeError("invalid k"); + // degenerate distribution if k === 0 + if (k === 0) return () => 0; + theta = theta == null ? 1 : +theta; + // exponential distribution if k === 1 + if (k === 1) return () => -Math.log1p(-source()) * theta; + + var d = (k < 1 ? k + 1 : k) - 1 / 3, + c = 1 / (3 * Math.sqrt(d)), + multiplier = k < 1 ? () => Math.pow(source(), 1 / k) : () => 1; + return function() { + do { + do { + var x = randomNormal(), + v = 1 + c * x; + } while (v <= 0); + v *= v * v; + var u = 1 - source(); + } while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v))); + return d * v * multiplier() * theta; + }; + } + + randomGamma.source = sourceRandomGamma; + + return randomGamma; +})(defaultSource); + +var beta = (function sourceRandomBeta(source) { + var G = gamma.source(source); + + function randomBeta(alpha, beta) { + var X = G(alpha), + Y = G(beta); + return function() { + var x = X(); + return x === 0 ? 0 : x / (x + Y()); + }; + } + + randomBeta.source = sourceRandomBeta; + + return randomBeta; +})(defaultSource); + +var binomial = (function sourceRandomBinomial(source) { + var G = geometric.source(source), + B = beta.source(source); + + function randomBinomial(n, p) { + n = +n; + if ((p = +p) >= 1) return () => n; + if (p <= 0) return () => 0; + return function() { + var acc = 0, nn = n, pp = p; + while (nn * pp > 16 && nn * (1 - pp) > 16) { + var i = Math.floor((nn + 1) * pp), + y = B(i, nn - i + 1)(); + if (y <= pp) { + acc += i; + nn -= i; + pp = (pp - y) / (1 - y); + } else { + nn = i - 1; + pp /= y; + } + } + var sign = pp < 0.5, + pFinal = sign ? pp : 1 - pp, + g = G(pFinal); + for (var s = g(), k = 0; s <= nn; ++k) s += g(); + return acc + (sign ? k : nn - k); + }; + } + + randomBinomial.source = sourceRandomBinomial; + + return randomBinomial; +})(defaultSource); + +var weibull = (function sourceRandomWeibull(source) { + function randomWeibull(k, a, b) { + var outerFunc; + if ((k = +k) === 0) { + outerFunc = x => -Math.log(x); + } else { + k = 1 / k; + outerFunc = x => Math.pow(x, k); + } + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * outerFunc(-Math.log1p(-source())); + }; + } + + randomWeibull.source = sourceRandomWeibull; + + return randomWeibull; +})(defaultSource); + +var cauchy = (function sourceRandomCauchy(source) { + function randomCauchy(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * Math.tan(Math.PI * source()); + }; + } + + randomCauchy.source = sourceRandomCauchy; + + return randomCauchy; +})(defaultSource); + +var logistic = (function sourceRandomLogistic(source) { + function randomLogistic(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + var u = source(); + return a + b * Math.log(u / (1 - u)); + }; + } + + randomLogistic.source = sourceRandomLogistic; + + return randomLogistic; +})(defaultSource); + +var poisson = (function sourceRandomPoisson(source) { + var G = gamma.source(source), + B = binomial.source(source); + + function randomPoisson(lambda) { + return function() { + var acc = 0, l = lambda; + while (l > 16) { + var n = Math.floor(0.875 * l), + t = G(n)(); + if (t > l) return acc + B(n - 1, l / t)(); + acc += n; + l -= t; + } + for (var s = -Math.log1p(-source()), k = 0; s <= l; ++k) s -= Math.log1p(-source()); + return acc + k; + }; + } + + randomPoisson.source = sourceRandomPoisson; + + return randomPoisson; +})(defaultSource); + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const mul = 0x19660D; +const inc = 0x3C6EF35F; +const eps = 1 / 0x100000000; + +function lcg(seed = Math.random()) { + let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0; + return () => (state = mul * state + inc | 0, eps * (state >>> 0)); +} + +function initRange(domain, range) { + switch (arguments.length) { + case 0: break; + case 1: this.range(domain); break; + default: this.range(range).domain(domain); break; + } + return this; +} + +function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: break; + case 1: { + if (typeof domain === "function") this.interpolator(domain); + else this.range(domain); + break; + } + default: { + this.domain(domain); + if (typeof interpolator === "function") this.interpolator(interpolator); + else this.range(interpolator); + break; + } + } + return this; +} + +const implicit = Symbol("implicit"); + +function ordinal() { + var index = new Map(), + domain = [], + range = [], + unknown = implicit; + + 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 = new Map(); + for (const value of _) { + const key = value + ""; + if (index.has(key)) continue; + index.set(key, domain.push(value)); + } + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + r0 = 0, + r1 = 1, + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = r1 < r0, + start = reverse ? r1 : r0, + stop = reverse ? r0 : r1; + 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 = sequence(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 ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; + }; + + scale.rangeRound = function(_) { + return [r0, r1] = _, r0 = +r0, r1 = +r1, 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 = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band(domain(), [r0, r1]) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); +} + +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.apply(null, arguments).paddingInner(1)); +} + +function constants(x) { + return function() { + return x; + }; +} + +function number$1(x) { + return +x; +} + +var unit = [0, 1]; + +function identity$3(x) { + return x; +} + +function normalize(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constants(isNaN(b) ? NaN : 0.5); +} + +function clamper(a, b) { + var t; + if (a > b) t = a, a = b, b = t; + return function(x) { return Math.max(a, Math.min(b, x)); }; +} + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} + +function polymap(domain, range, interpolate) { + 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] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function(x) { + var i = bisectRight(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} + +function copy$1(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function transformer$2() { + var domain = unit, + range = unit, + interpolate = interpolate$2, + transform, + untransform, + unknown, + clamp = identity$3, + piecewise, + output, + input; + + function rescale() { + var n = Math.min(domain.length, range.length); + if (clamp !== identity$3) clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function(y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y))); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_, number$1), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = Array.from(_), interpolate = interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? true : identity$3, rescale()) : clamp !== identity$3; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t, u) { + transform = t, untransform = u; + return rescale(); + }; +} + +function continuous() { + return transformer$2()(identity$3, identity$3); +} + +function tickFormat(start, stop, count, specifier) { + var step = tickStep(start, stop, 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) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function(count) { + if (count == null) count = 10; + + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + while (maxIter-- > 0) { + step = tickIncrement(start, stop, count); + if (step === prestep) { + d[i0] = start; + d[i1] = stop; + return domain(d); + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; + } + + return scale; + }; + + return scale; +} + +function linear() { + var scale = continuous(); + + scale.copy = function() { + return copy$1(scale, linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function identity$2(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = Array.from(_, number$1), scale) : domain.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return identity$2(domain).unknown(unknown); + }; + + domain = arguments.length ? Array.from(domain, number$1) : [0, 1]; + + 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 transformLog(x) { + return Math.log(x); +} + +function transformExp(x) { + return Math.exp(x); +} + +function transformLogn(x) { + return -Math.log(-x); +} + +function transformExpn(x) { + return -Math.exp(-x); +} + +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 loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + 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.floor(i), j = Math.ceil(j); + 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); + } + } + if (z.length * 2 < n) z = ticks(u, v, n); + } 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))); } + })); + }; + + return scale; +} + +function log() { + var scale = loggish(transformer$2()).domain([1, 10]); + + scale.copy = function() { + return copy$1(scale, log()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function transformSymlog(c) { + return function(x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; +} + +function transformSymexp(c) { + return function(x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; +} + +function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function(_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); +} + +function symlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); +} + +function transformPow(exponent) { + return function(x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; +} + +function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); +} + +function transformSquare(x) { + return x < 0 ? -x * x : x * x; +} + +function powish(transform) { + var scale = transform(identity$3, identity$3), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity$3, identity$3) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); +} + +function pow() { + var scale = powish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, pow()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function sqrt$1() { + return pow.apply(null, arguments).exponent(0.5); +} + +function square$1(x) { + return Math.sign(x) * x * x; +} + +function unsquare(x) { + return Math.sign(x) * Math.sqrt(Math.abs(x)); +} + +function radial() { + var squared = continuous(), + range = [0, 1], + round = false, + unknown; + + function scale(x) { + var y = unsquare(squared(x)); + return isNaN(y) ? unknown : round ? Math.round(y) : y; + } + + scale.invert = function(y) { + return squared.invert(square$1(y)); + }; + + scale.domain = function(_) { + return arguments.length ? (squared.domain(_), scale) : squared.domain(); + }; + + scale.range = function(_) { + return arguments.length ? (squared.range((range = Array.from(_, number$1)).map(square$1)), scale) : range.slice(); + }; + + scale.rangeRound = function(_) { + return scale.range(_).round(true); + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, scale) : round; + }; + + scale.clamp = function(_) { + return arguments.length ? (squared.clamp(_), scale) : squared.clamp(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return radial(squared.domain(), range) + .round(round) + .clamp(squared.clamp()) + .unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = quantileSorted(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : 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 (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending$3); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + 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, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range = Array.from(_)).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.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function() { + return domain.slice(); + }; + + scale.copy = function() { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); +} + +function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), 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.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +var t0 = new Date, + t1 = new Date; + +function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function(date) { + return floori(date = new Date(+date)), date; + }; + + 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 = [], previous; + 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(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function(start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + 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$1 = 1e3; +var durationMinute$1 = 6e4; +var durationHour$1 = 36e5; +var durationDay$1 = 864e5; +var durationWeek$1 = 6048e5; + +var second = newInterval(function(date) { + date.setTime(date - date.getMilliseconds()); +}, function(date, step) { + date.setTime(+date + step * durationSecond$1); +}, function(start, end) { + return (end - start) / durationSecond$1; +}, function(date) { + return date.getUTCSeconds(); +}); +var seconds = second.range; + +var minute = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond$1); +}, function(date, step) { + date.setTime(+date + step * durationMinute$1); +}, function(start, end) { + return (end - start) / durationMinute$1; +}, function(date) { + return date.getMinutes(); +}); +var minutes = minute.range; + +var hour = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond$1 - date.getMinutes() * durationMinute$1); +}, function(date, step) { + date.setTime(+date + step * durationHour$1); +}, function(start, end) { + return (end - start) / durationHour$1; +}, function(date) { + return date.getHours(); +}); +var hours = hour.range; + +var day = newInterval( + date => date.setHours(0, 0, 0, 0), + (date, step) => date.setDate(date.getDate() + step), + (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1, + date => 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$1) / durationWeek$1; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.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$1); +}, function(start, end) { + return (end - start) / durationMinute$1; +}, 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$1); +}, function(start, end) { + return (end - start) / durationHour$1; +}, 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$1; +}, 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$1; + }); +} + +var utcSunday = 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 = utcSunday.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; + +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 newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; +} + +function formatLocale(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, + "f": formatMicroseconds, + "g": formatYearISO, + "G": formatFullYearISO, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "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, + "f": formatUTCMicroseconds, + "g": formatUTCYearISO, + "G": formatUTCFullYearISO, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "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, + "f": parseMicroseconds, + "g": parseYear, + "G": parseFullYear, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "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, Z) { + return function(string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day$1; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day$1 = week.getUTCDay(); + week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week); + week = utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day$1 = week.getDay(); + week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week); + week = day.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day$1 = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$1 + 5) % 7 : d.w + d.U * 7 - (day$1 + 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 localDate(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.get(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.get(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.get(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.get(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.get(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 formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + 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)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", false); + 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 += "", true); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + 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) { + return new Map(names.map((name, i) => [name.toLowerCase(), i])); +} + +function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + 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 parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, 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 parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), 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 parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; +} + +function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], 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 formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; +} + +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 formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; +} + +function formatWeekNumberSunday(d, p) { + return pad(sunday.count(year(d) - 1, d), p, 2); +} + +function dISO(d) { + var day = d.getDay(); + return (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); +} + +function formatWeekNumberISO(d, p) { + d = dISO(d); + return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2); +} + +function formatWeekdayNumberSunday(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad(monday.count(year(d) - 1, d), p, 2); +} + +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); +} + +function formatYearISO(d, p) { + d = dISO(d); + return pad(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatFullYearISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); + 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 formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; +} + +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 formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; +} + +function formatUTCWeekNumberSunday(d, p) { + return pad(utcSunday.count(utcYear(d) - 1, d), p, 2); +} + +function UTCdISO(d) { + var day = d.getUTCDay(); + return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); +} + +function formatUTCWeekNumberISO(d, p) { + d = UTCdISO(d); + return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); +} + +function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad(utcMonday.count(utcYear(d) - 1, d), p, 2); +} + +function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCYearISO(d, p) { + d = UTCdISO(d); + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCFullYearISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +function formatUnixTimestamp(d) { + return +d; +} + +function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); +} + +var locale; +exports.timeFormat = void 0; +exports.timeParse = void 0; +exports.utcFormat = void 0; +exports.utcParse = void 0; + +defaultLocale({ + 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(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; +} + +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 durationSecond = 1000, + durationMinute = durationSecond * 60, + durationHour = durationMinute * 60, + durationDay = durationHour * 24, + durationWeek = durationDay * 7, + durationMonth = durationDay * 30, + durationYear = durationDay * 365; + +function date(t) { + return new Date(t); +} + +function number(t) { + return t instanceof Date ? +t : +new Date(+t); +} + +function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(), + 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], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [ hour, 1, durationHour ], + [ hour, 3, 3 * durationHour ], + [ hour, 6, 6 * durationHour ], + [ hour, 12, 12 * durationHour ], + [ day, 1, durationDay ], + [ day, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ 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) { + 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), + step; + 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 = Math.max(tickStep(start, stop, interval), 1); + interval = millisecond; + } + return interval.every(step); + } + + return interval; + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(Array.from(_, number)) : domain().map(date); + }; + + scale.ticks = function(interval) { + 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); + 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) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1])) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy$1(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; +} + +function time() { + return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +} + +function utcTime() { + return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +} + +function transformer$1() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity$3, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1; + return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)]; + }; + } + + scale.range = range(interpolate$2); + + scale.rangeRound = range(interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; +} + +function copy(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function sequential() { + var scale = linearish(transformer$1()(identity$3)); + + scale.copy = function() { + return copy(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialLog() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSymlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function() { + return copy(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialPow() { + var scale = powish(transformer$1()); + + scale.copy = function() { + return copy(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); +} + +function sequentialQuantile() { + var domain = [], + interpolator = identity$3; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x, 1) - 1) / (domain.length - 1)); + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending$3); + return scale; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.range = function() { + return domain.map((d, i) => interpolator(i / (domain.length - 1))); + }; + + scale.quantiles = function(n) { + return Array.from({length: n + 1}, (_, i) => quantile$1(domain, i / n)); + }; + + scale.copy = function() { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); +} + +function transformer() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + s = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity$3, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1, r2; + return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)]; + }; + } + + scale.range = range(interpolate$2); + + scale.rangeRound = range(interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1; + return scale; + }; +} + +function diverging$1() { + var scale = linearish(transformer()(identity$3)); + + scale.copy = function() { + return copy(scale, diverging$1()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingLog() { + var scale = loggish(transformer()).domain([0.1, 1, 10]); + + scale.copy = function() { + return copy(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSymlog() { + var scale = symlogish(transformer()); + + scale.copy = function() { + return copy(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingPow() { + var scale = powish(transformer()); + + scale.copy = function() { + return copy(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); +} + +function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} + +var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + +var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + +var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + +var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + +var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + +var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + +var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + +var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + +var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + +var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + +var ramp$1 = scheme => rgbBasis(scheme[scheme.length - 1]); + +var scheme$q = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" +).map(colors); + +var BrBG = ramp$1(scheme$q); + +var scheme$p = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" +).map(colors); + +var PRGn = ramp$1(scheme$p); + +var scheme$o = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" +).map(colors); + +var PiYG = ramp$1(scheme$o); + +var scheme$n = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" +).map(colors); + +var PuOr = ramp$1(scheme$n); + +var scheme$m = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" +).map(colors); + +var RdBu = ramp$1(scheme$m); + +var scheme$l = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" +).map(colors); + +var RdGy = ramp$1(scheme$l); + +var scheme$k = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" +).map(colors); + +var RdYlBu = ramp$1(scheme$k); + +var scheme$j = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" +).map(colors); + +var RdYlGn = ramp$1(scheme$j); + +var scheme$i = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" +).map(colors); + +var Spectral = ramp$1(scheme$i); + +var scheme$h = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" +).map(colors); + +var BuGn = ramp$1(scheme$h); + +var scheme$g = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" +).map(colors); + +var BuPu = ramp$1(scheme$g); + +var scheme$f = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" +).map(colors); + +var GnBu = ramp$1(scheme$f); + +var scheme$e = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" +).map(colors); + +var OrRd = ramp$1(scheme$e); + +var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" +).map(colors); + +var PuBuGn = ramp$1(scheme$d); + +var scheme$c = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" +).map(colors); + +var PuBu = ramp$1(scheme$c); + +var scheme$b = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" +).map(colors); + +var PuRd = ramp$1(scheme$b); + +var scheme$a = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" +).map(colors); + +var RdPu = ramp$1(scheme$a); + +var scheme$9 = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" +).map(colors); + +var YlGnBu = ramp$1(scheme$9); + +var scheme$8 = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" +).map(colors); + +var YlGn = ramp$1(scheme$8); + +var scheme$7 = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" +).map(colors); + +var YlOrBr = ramp$1(scheme$7); + +var scheme$6 = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" +).map(colors); + +var YlOrRd = ramp$1(scheme$6); + +var scheme$5 = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" +).map(colors); + +var Blues = ramp$1(scheme$5); + +var scheme$4 = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" +).map(colors); + +var Greens = ramp$1(scheme$4); + +var scheme$3 = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" +).map(colors); + +var Greys = ramp$1(scheme$3); + +var scheme$2 = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" +).map(colors); + +var Purples = ramp$1(scheme$2); + +var scheme$1 = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" +).map(colors); + +var Reds = ramp$1(scheme$1); + +var scheme = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" +).map(colors); + +var Oranges = ramp$1(scheme); + +function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; +} + +var cubehelix = cubehelixLong(cubehelix$3(300, 0.5, 0.0), cubehelix$3(-240, 0.5, 1.0)); + +var warm = cubehelixLong(cubehelix$3(-100, 0.75, 0.35), cubehelix$3(80, 1.50, 0.8)); + +var cool = cubehelixLong(cubehelix$3(260, 0.75, 0.35), cubehelix$3(80, 1.50, 0.8)); + +var c$2 = cubehelix$3(); + +function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c$2.h = 360 * t - 100; + c$2.s = 1.5 - 1.5 * ts; + c$2.l = 0.8 - 0.9 * ts; + return c$2 + ""; +} + +var c$1 = rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + +function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; +} + +function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; +} + +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 constant$1(x) { + return function constant() { + return x; + }; +} + +var abs = Math.abs; +var atan2 = Math.atan2; +var cos = Math.cos; +var max = Math.max; +var min = Math.min; +var sin = Math.sin; +var sqrt = Math.sqrt; + +var epsilon = 1e-12; +var pi = Math.PI; +var halfPi = pi / 2; +var tau = 2 * pi; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); +} + +function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); +} + +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 intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + 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) / 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) * sqrt(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, + a1 = endAngle.apply(this, arguments) - halfPi, + da = 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)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * 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) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(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) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); + + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + 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, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), 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) || !(da0 > epsilon)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + 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, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), 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; + return [cos(a) * r, 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; +} + +var slice = Array.prototype.slice; + +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +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(x$1, y$1) { + var defined = constant$1(true), + context = null, + curve = curveLinear, + output = null; + + x$1 = typeof x$1 === "function" ? x$1 : (x$1 === undefined) ? x : constant$1(x$1); + y$1 = typeof y$1 === "function" ? y$1 : (y$1 === undefined) ? y : constant$1(y$1); + + function line(data) { + var i, + n = (data = array(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$1(d, i, data), +y$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant$1(+_), line) : x$1; + }; + + line.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant$1(+_), line) : y$1; + }; + + 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(x0, y0, y1) { + var x1 = null, + defined = constant$1(true), + context = null, + curve = curveLinear, + output = null; + + x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? x : constant$1(+x0); + y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? constant$1(0) : constant$1(+y0); + y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? y : constant$1(+y1); + + function area(data) { + var i, + j, + k, + n = (data = array(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), + padAngle = constant$1(0); + + function pie(data) { + var i, + n = (data = array(data)).length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, 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$1(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$1(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; +} + +function lineRadial(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$1(_)) : c()._curve; + }; + + return l; +} + +function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); +} + +function areaRadial() { + var a = area().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 lineRadial(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial$1(_)) : c()._curve; + }; + + return a; +} + +function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} + +function linkSource(d) { + return d.source; +} + +function linkTarget(d) { + return d.target; +} + +function link(curve) { + var source = linkSource, + target = linkTarget, + x$1 = x, + y$1 = y, + context = null; + + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = path(); + curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant$1(+_), link) : x$1; + }; + + link.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant$1(+_), link) : y$1; + }; + + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; +} + +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} + +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} + +function curveRadial(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} + +function linkHorizontal() { + return link(curveHorizontal); +} + +function linkVertical() { + return link(curveVertical); +} + +function linkRadial() { + var l = link(curveRadial); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} + +var circle = { + draw: function(context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); + } +}; + +var cross = { + 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), + 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, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 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 * 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, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + 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, + diamond, + square, + star, + triangle, + wye +]; + +function symbol(type, size) { + var context = null; + type = typeof type === "function" ? type : constant$1(type || circle); + size = typeof size === "function" ? size : constant$1(size === undefined ? 64 : +size); + + 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$3(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$3(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$3(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$3(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$3(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); +} + +class Bump { + constructor(context, x) { + this._context = context; + this._x = x; + } + areaStart() { + this._line = 0; + } + areaEnd() { + this._line = NaN; + } + lineStart() { + this._point = 0; + } + lineEnd() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + } + point(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: { + this._point = 1; + if (this._line) this._context.lineTo(x, y); + else this._context.moveTo(x, y); + break; + } + case 1: this._point = 2; // proceed + default: { + if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y); + else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y); + break; + } + } + this._x0 = x, this._y0 = y; + } +} + +function bumpX(context) { + return new Bump(context, true); +} + +function bumpY(context) { + return new Bump(context, false); +} + +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$2(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$2(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$2(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$2(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$2(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$1(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + 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) { + 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._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$1(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$1(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$1(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(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(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(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point(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); +} + +function none$1(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +} + +function none(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 stackSeries(key) { + const series = []; + series.key = key; + return series; +} + +function stack() { + var keys = constant$1([]), + order = none, + offset = none$1, + value = stackValue; + + function stack(data) { + var sz = Array.from(keys.apply(this, arguments), stackSeries), + i, n = sz.length, j = -1, + oz; + + for (const d of data) { + for (i = 0, ++j; i < n; ++i) { + (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d; + } + } + + for (i = 0, oz = array(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(Array.from(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none : typeof _ === "function" ? _ : constant$1(Array.from(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, 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$1(series, order); +} + +function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } +} + +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$1(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$1(series, order); +} + +function appearance(series) { + var peaks = series.map(peak); + return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); +} + +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; +} + +function ascending(series) { + var sums = series.map(sum); + return none(series).sort(function(a, b) { return sums[a] - sums[b]; }); +} + +function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} + +function descending(series) { + return ascending(series).reverse(); +} + +function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + 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(series).reverse(); +} + +var constant = x => () => x; + +function ZoomEvent(type, { + sourceEvent, + target, + transform, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + transform: {value: transform, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +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 = new Transform(1, 0, 0); + +transform.prototype = Transform.prototype; + +function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; +} + +function nopropagation(event) { + event.stopImmediatePropagation(); +} + +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// Ignore right-click, since that should open the context menu. +// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event +function defaultFilter(event) { + return (!event.ctrlKey || event.type === 'wheel') && !event.button; +} + +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} + +function defaultTransform() { + return this.__zoom || identity; +} + +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} + +function zoom() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = interpolateZoom, + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchfirst, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0, + tapDistance = 10; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function(collection, transform, point, event) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point, event); + } else { + selection.interrupt().each(function() { + gesture(this, arguments) + .event(event) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection, k, p, event) { + zoom.scaleTo(selection, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + + zoom.scaleTo = function(selection, k, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + + zoom.translateBy = function(selection, x, y, event) { + 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), translateExtent); + }, null, event); + }; + + zoom.translateTo = function(selection, x, y, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p, event); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], 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 centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point, event) { + transition + .on("start.zoom", function() { gesture(this, arguments).event(event).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args).event(event), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + 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 = interpolate(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, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + 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) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + var d = select(this.that).datum(); + listeners.call( + type, + this.that, + new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + + function wheeled(event, ...args) { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, args).event(event), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = pointer(event); + + // 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(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned(event, ...args) { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, args, true).event(event), + v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = pointer(event, currentTarget), + currentTarget = event.currentTarget, + x0 = event.clientX, + y0 = event.clientY; + + dragDisable(event.view); + nopropagation(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved(event) { + noevent(event); + if (!g.moved) { + var dx = event.clientX - x0, dy = event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event) + .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped(event) { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event.view, g.moved); + noevent(event); + g.event(event).end(); + } + } + + function dblclicked(event, ...args) { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this), + p1 = t0.invert(p0), + k1 = t0.k * (event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + + noevent(event); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event); + else select(this).call(zoom.transform, t1, p0, event); + } + + function touchstarted(event, ...args) { + if (!filter.apply(this, arguments)) return; + var touches = event.touches, + n = touches.length, + g = gesture(this, args, event.changedTouches.length === n).event(event), + started, i, t, p; + + nopropagation(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + 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, translateExtent)); + } + + function touchended(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t; + + nopropagation(event); + 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.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + t = pointer(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + } + + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; + + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + + return zoom; +} + +exports.Adder = Adder; +exports.Delaunay = Delaunay; +exports.FormatSpecifier = FormatSpecifier; +exports.InternMap = InternMap; +exports.InternSet = InternSet; +exports.Voronoi = Voronoi; +exports.active = active; +exports.arc = arc; +exports.area = area; +exports.areaRadial = areaRadial; +exports.ascending = ascending$3; +exports.autoType = autoType; +exports.axisBottom = axisBottom; +exports.axisLeft = axisLeft; +exports.axisRight = axisRight; +exports.axisTop = axisTop; +exports.bin = bin; +exports.bisect = bisectRight; +exports.bisectCenter = bisectCenter; +exports.bisectLeft = bisectLeft; +exports.bisectRight = bisectRight; +exports.bisector = bisector; +exports.blob = blob; +exports.brush = brush; +exports.brushSelection = brushSelection; +exports.brushX = brushX; +exports.brushY = brushY; +exports.buffer = buffer; +exports.chord = chord; +exports.chordDirected = chordDirected; +exports.chordTranspose = chordTranspose; +exports.cluster = cluster; +exports.color = color; +exports.contourDensity = density; +exports.contours = contours; +exports.count = count$1; +exports.create = create$1; +exports.creator = creator; +exports.cross = cross$2; +exports.csv = csv; +exports.csvFormat = csvFormat; +exports.csvFormatBody = csvFormatBody; +exports.csvFormatRow = csvFormatRow; +exports.csvFormatRows = csvFormatRows; +exports.csvFormatValue = csvFormatValue; +exports.csvParse = csvParse; +exports.csvParseRows = csvParseRows; +exports.cubehelix = cubehelix$3; +exports.cumsum = cumsum; +exports.curveBasis = basis; +exports.curveBasisClosed = basisClosed; +exports.curveBasisOpen = basisOpen; +exports.curveBumpX = bumpX; +exports.curveBumpY = bumpY; +exports.curveBundle = bundle; +exports.curveCardinal = cardinal; +exports.curveCardinalClosed = cardinalClosed; +exports.curveCardinalOpen = cardinalOpen; +exports.curveCatmullRom = catmullRom; +exports.curveCatmullRomClosed = catmullRomClosed; +exports.curveCatmullRomOpen = catmullRomOpen; +exports.curveLinear = curveLinear; +exports.curveLinearClosed = linearClosed; +exports.curveMonotoneX = monotoneX; +exports.curveMonotoneY = monotoneY; +exports.curveNatural = natural; +exports.curveStep = step; +exports.curveStepAfter = stepAfter; +exports.curveStepBefore = stepBefore; +exports.descending = descending$2; +exports.deviation = deviation; +exports.difference = difference; +exports.disjoint = disjoint; +exports.dispatch = dispatch; +exports.drag = drag; +exports.dragDisable = dragDisable; +exports.dragEnable = yesdrag; +exports.dsv = dsv; +exports.dsvFormat = dsvFormat; +exports.easeBack = backInOut; +exports.easeBackIn = backIn; +exports.easeBackInOut = backInOut; +exports.easeBackOut = backOut; +exports.easeBounce = bounceOut; +exports.easeBounceIn = bounceIn; +exports.easeBounceInOut = bounceInOut; +exports.easeBounceOut = bounceOut; +exports.easeCircle = circleInOut; +exports.easeCircleIn = circleIn; +exports.easeCircleInOut = circleInOut; +exports.easeCircleOut = circleOut; +exports.easeCubic = cubicInOut; +exports.easeCubicIn = cubicIn; +exports.easeCubicInOut = cubicInOut; +exports.easeCubicOut = cubicOut; +exports.easeElastic = elasticOut; +exports.easeElasticIn = elasticIn; +exports.easeElasticInOut = elasticInOut; +exports.easeElasticOut = elasticOut; +exports.easeExp = expInOut; +exports.easeExpIn = expIn; +exports.easeExpInOut = expInOut; +exports.easeExpOut = expOut; +exports.easeLinear = linear$1; +exports.easePoly = polyInOut; +exports.easePolyIn = polyIn; +exports.easePolyInOut = polyInOut; +exports.easePolyOut = polyOut; +exports.easeQuad = quadInOut; +exports.easeQuadIn = quadIn; +exports.easeQuadInOut = quadInOut; +exports.easeQuadOut = quadOut; +exports.easeSin = sinInOut; +exports.easeSinIn = sinIn; +exports.easeSinInOut = sinInOut; +exports.easeSinOut = sinOut; +exports.every = every; +exports.extent = extent$1; +exports.fcumsum = fcumsum; +exports.filter = filter$1; +exports.forceCenter = center; +exports.forceCollide = collide; +exports.forceLink = link$2; +exports.forceManyBody = manyBody; +exports.forceRadial = radial$1; +exports.forceSimulation = simulation; +exports.forceX = x$1; +exports.forceY = y$1; +exports.formatDefaultLocale = defaultLocale$1; +exports.formatLocale = formatLocale$1; +exports.formatSpecifier = formatSpecifier; +exports.fsum = fsum; +exports.geoAlbers = albers; +exports.geoAlbersUsa = albersUsa; +exports.geoArea = area$2; +exports.geoAzimuthalEqualArea = azimuthalEqualArea; +exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; +exports.geoAzimuthalEquidistant = azimuthalEquidistant; +exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; +exports.geoBounds = bounds; +exports.geoCentroid = centroid$1; +exports.geoCircle = circle$2; +exports.geoClipAntimeridian = clipAntimeridian; +exports.geoClipCircle = clipCircle; +exports.geoClipExtent = extent; +exports.geoClipRectangle = clipRectangle; +exports.geoConicConformal = conicConformal; +exports.geoConicConformalRaw = conicConformalRaw; +exports.geoConicEqualArea = conicEqualArea; +exports.geoConicEqualAreaRaw = conicEqualAreaRaw; +exports.geoConicEquidistant = conicEquidistant; +exports.geoConicEquidistantRaw = conicEquidistantRaw; +exports.geoContains = contains$1; +exports.geoDistance = distance; +exports.geoEqualEarth = equalEarth; +exports.geoEqualEarthRaw = equalEarthRaw; +exports.geoEquirectangular = equirectangular; +exports.geoEquirectangularRaw = equirectangularRaw; +exports.geoGnomonic = gnomonic; +exports.geoGnomonicRaw = gnomonicRaw; +exports.geoGraticule = graticule; +exports.geoGraticule10 = graticule10; +exports.geoIdentity = identity$4; +exports.geoInterpolate = interpolate; +exports.geoLength = length$1; +exports.geoMercator = mercator; +exports.geoMercatorRaw = mercatorRaw; +exports.geoNaturalEarth1 = naturalEarth1; +exports.geoNaturalEarth1Raw = naturalEarth1Raw; +exports.geoOrthographic = orthographic; +exports.geoOrthographicRaw = orthographicRaw; +exports.geoPath = index$2; +exports.geoProjection = projection; +exports.geoProjectionMutator = projectionMutator; +exports.geoRotation = rotation; +exports.geoStereographic = stereographic; +exports.geoStereographicRaw = stereographicRaw; +exports.geoStream = geoStream; +exports.geoTransform = transform$1; +exports.geoTransverseMercator = transverseMercator; +exports.geoTransverseMercatorRaw = transverseMercatorRaw; +exports.gray = gray; +exports.greatest = greatest; +exports.greatestIndex = greatestIndex; +exports.group = group; +exports.groupSort = groupSort; +exports.groups = groups; +exports.hcl = hcl$2; +exports.hierarchy = hierarchy; +exports.histogram = bin; +exports.hsl = hsl$2; +exports.html = html; +exports.image = image; +exports.index = index$4; +exports.indexes = indexes; +exports.interpolate = interpolate$2; +exports.interpolateArray = array$3; +exports.interpolateBasis = basis$2; +exports.interpolateBasisClosed = basisClosed$1; +exports.interpolateBlues = Blues; +exports.interpolateBrBG = BrBG; +exports.interpolateBuGn = BuGn; +exports.interpolateBuPu = BuPu; +exports.interpolateCividis = cividis; +exports.interpolateCool = cool; +exports.interpolateCubehelix = cubehelix$2; +exports.interpolateCubehelixDefault = cubehelix; +exports.interpolateCubehelixLong = cubehelixLong; +exports.interpolateDate = date$1; +exports.interpolateDiscrete = discrete; +exports.interpolateGnBu = GnBu; +exports.interpolateGreens = Greens; +exports.interpolateGreys = Greys; +exports.interpolateHcl = hcl$1; +exports.interpolateHclLong = hclLong; +exports.interpolateHsl = hsl$1; +exports.interpolateHslLong = hslLong; +exports.interpolateHue = hue; +exports.interpolateInferno = inferno; +exports.interpolateLab = lab; +exports.interpolateMagma = magma; +exports.interpolateNumber = interpolateNumber; +exports.interpolateNumberArray = numberArray; +exports.interpolateObject = object$1; +exports.interpolateOrRd = OrRd; +exports.interpolateOranges = Oranges; +exports.interpolatePRGn = PRGn; +exports.interpolatePiYG = PiYG; +exports.interpolatePlasma = plasma; +exports.interpolatePuBu = PuBu; +exports.interpolatePuBuGn = PuBuGn; +exports.interpolatePuOr = PuOr; +exports.interpolatePuRd = PuRd; +exports.interpolatePurples = Purples; +exports.interpolateRainbow = rainbow; +exports.interpolateRdBu = RdBu; +exports.interpolateRdGy = RdGy; +exports.interpolateRdPu = RdPu; +exports.interpolateRdYlBu = RdYlBu; +exports.interpolateRdYlGn = RdYlGn; +exports.interpolateReds = Reds; +exports.interpolateRgb = interpolateRgb; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateRound = interpolateRound; +exports.interpolateSinebow = sinebow; +exports.interpolateSpectral = Spectral; +exports.interpolateString = interpolateString; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateTurbo = turbo; +exports.interpolateViridis = viridis; +exports.interpolateWarm = warm; +exports.interpolateYlGn = YlGn; +exports.interpolateYlGnBu = YlGnBu; +exports.interpolateYlOrBr = YlOrBr; +exports.interpolateYlOrRd = YlOrRd; +exports.interpolateZoom = interpolateZoom; +exports.interrupt = interrupt; +exports.intersection = intersection; +exports.interval = interval; +exports.isoFormat = formatIso; +exports.isoParse = parseIso; +exports.json = json; +exports.lab = lab$1; +exports.lch = lch; +exports.least = least; +exports.leastIndex = leastIndex; +exports.line = line; +exports.lineRadial = lineRadial$1; +exports.linkHorizontal = linkHorizontal; +exports.linkRadial = linkRadial; +exports.linkVertical = linkVertical; +exports.local = local$1; +exports.map = map$1; +exports.matcher = matcher; +exports.max = max$3; +exports.maxIndex = maxIndex; +exports.mean = mean; +exports.median = median; +exports.merge = merge; +exports.min = min$2; +exports.minIndex = minIndex; +exports.namespace = namespace; +exports.namespaces = namespaces; +exports.nice = nice$1; +exports.now = now; +exports.pack = index$1; +exports.packEnclose = enclose; +exports.packSiblings = siblings; +exports.pairs = pairs; +exports.partition = partition; +exports.path = path; +exports.permute = permute; +exports.pie = pie; +exports.piecewise = piecewise; +exports.pointRadial = pointRadial; +exports.pointer = pointer; +exports.pointers = pointers; +exports.polygonArea = area$1; +exports.polygonCentroid = centroid; +exports.polygonContains = contains; +exports.polygonHull = hull; +exports.polygonLength = length; +exports.precisionFixed = precisionFixed; +exports.precisionPrefix = precisionPrefix; +exports.precisionRound = precisionRound; +exports.quadtree = quadtree; +exports.quantile = quantile$1; +exports.quantileSorted = quantileSorted; +exports.quantize = quantize$1; +exports.quickselect = quickselect; +exports.radialArea = areaRadial; +exports.radialLine = lineRadial$1; +exports.randomBates = bates; +exports.randomBernoulli = bernoulli; +exports.randomBeta = beta; +exports.randomBinomial = binomial; +exports.randomCauchy = cauchy; +exports.randomExponential = exponential; +exports.randomGamma = gamma; +exports.randomGeometric = geometric; +exports.randomInt = int; +exports.randomIrwinHall = irwinHall; +exports.randomLcg = lcg; +exports.randomLogNormal = logNormal; +exports.randomLogistic = logistic; +exports.randomNormal = normal; +exports.randomPareto = pareto; +exports.randomPoisson = poisson; +exports.randomUniform = uniform; +exports.randomWeibull = weibull; +exports.range = sequence; +exports.reduce = reduce; +exports.reverse = reverse$1; +exports.rgb = rgb; +exports.ribbon = ribbon$1; +exports.ribbonArrow = ribbonArrow; +exports.rollup = rollup; +exports.rollups = rollups; +exports.scaleBand = band; +exports.scaleDiverging = diverging$1; +exports.scaleDivergingLog = divergingLog; +exports.scaleDivergingPow = divergingPow; +exports.scaleDivergingSqrt = divergingSqrt; +exports.scaleDivergingSymlog = divergingSymlog; +exports.scaleIdentity = identity$2; +exports.scaleImplicit = implicit; +exports.scaleLinear = linear; +exports.scaleLog = log; +exports.scaleOrdinal = ordinal; +exports.scalePoint = point$4; +exports.scalePow = pow; +exports.scaleQuantile = quantile; +exports.scaleQuantize = quantize; +exports.scaleRadial = radial; +exports.scaleSequential = sequential; +exports.scaleSequentialLog = sequentialLog; +exports.scaleSequentialPow = sequentialPow; +exports.scaleSequentialQuantile = sequentialQuantile; +exports.scaleSequentialSqrt = sequentialSqrt; +exports.scaleSequentialSymlog = sequentialSymlog; +exports.scaleSqrt = sqrt$1; +exports.scaleSymlog = symlog; +exports.scaleThreshold = threshold; +exports.scaleTime = time; +exports.scaleUtc = utcTime; +exports.scan = scan; +exports.schemeAccent = Accent; +exports.schemeBlues = scheme$5; +exports.schemeBrBG = scheme$q; +exports.schemeBuGn = scheme$h; +exports.schemeBuPu = scheme$g; +exports.schemeCategory10 = category10; +exports.schemeDark2 = Dark2; +exports.schemeGnBu = scheme$f; +exports.schemeGreens = scheme$4; +exports.schemeGreys = scheme$3; +exports.schemeOrRd = scheme$e; +exports.schemeOranges = scheme; +exports.schemePRGn = scheme$p; +exports.schemePaired = Paired; +exports.schemePastel1 = Pastel1; +exports.schemePastel2 = Pastel2; +exports.schemePiYG = scheme$o; +exports.schemePuBu = scheme$c; +exports.schemePuBuGn = scheme$d; +exports.schemePuOr = scheme$n; +exports.schemePuRd = scheme$b; +exports.schemePurples = scheme$2; +exports.schemeRdBu = scheme$m; +exports.schemeRdGy = scheme$l; +exports.schemeRdPu = scheme$a; +exports.schemeRdYlBu = scheme$k; +exports.schemeRdYlGn = scheme$j; +exports.schemeReds = scheme$1; +exports.schemeSet1 = Set1; +exports.schemeSet2 = Set2; +exports.schemeSet3 = Set3; +exports.schemeSpectral = scheme$i; +exports.schemeTableau10 = Tableau10; +exports.schemeYlGn = scheme$8; +exports.schemeYlGnBu = scheme$9; +exports.schemeYlOrBr = scheme$7; +exports.schemeYlOrRd = scheme$6; +exports.select = select; +exports.selectAll = selectAll; +exports.selection = selection; +exports.selector = selector; +exports.selectorAll = selectorAll; +exports.shuffle = shuffle$1; +exports.shuffler = shuffler; +exports.some = some; +exports.sort = sort; +exports.stack = stack; +exports.stackOffsetDiverging = diverging; +exports.stackOffsetExpand = expand; +exports.stackOffsetNone = none$1; +exports.stackOffsetSilhouette = silhouette; +exports.stackOffsetWiggle = wiggle; +exports.stackOrderAppearance = appearance; +exports.stackOrderAscending = ascending; +exports.stackOrderDescending = descending; +exports.stackOrderInsideOut = insideOut; +exports.stackOrderNone = none; +exports.stackOrderReverse = reverse; +exports.stratify = stratify; +exports.style = styleValue; +exports.subset = subset; +exports.sum = sum$1; +exports.superset = superset; +exports.svg = svg; +exports.symbol = symbol; +exports.symbolCircle = circle; +exports.symbolCross = cross; +exports.symbolDiamond = diamond; +exports.symbolSquare = square; +exports.symbolStar = star; +exports.symbolTriangle = triangle; +exports.symbolWye = wye; +exports.symbols = symbols; +exports.text = text; +exports.thresholdFreedmanDiaconis = freedmanDiaconis; +exports.thresholdScott = scott; +exports.thresholdSturges = thresholdSturges; +exports.tickFormat = tickFormat; +exports.tickIncrement = tickIncrement; +exports.tickStep = tickStep; +exports.ticks = ticks; +exports.timeDay = day; +exports.timeDays = days; +exports.timeFormatDefaultLocale = defaultLocale; +exports.timeFormatLocale = formatLocale; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeYear = year; +exports.timeYears = years; +exports.timeout = timeout; +exports.timer = timer; +exports.timerFlush = timerFlush; +exports.transition = transition; +exports.transpose = transpose; +exports.tree = tree; +exports.treemap = index; +exports.treemapBinary = binary; +exports.treemapDice = treemapDice; +exports.treemapResquarify = resquarify; +exports.treemapSlice = treemapSlice; +exports.treemapSliceDice = sliceDice; +exports.treemapSquarify = squarify; +exports.tsv = tsv; +exports.tsvFormat = tsvFormat; +exports.tsvFormatBody = tsvFormatBody; +exports.tsvFormatRow = tsvFormatRow; +exports.tsvFormatRows = tsvFormatRows; +exports.tsvFormatValue = tsvFormatValue; +exports.tsvParse = tsvParse; +exports.tsvParseRows = tsvParseRows; +exports.union = union; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcYear = utcYear; +exports.utcYears = utcYears; +exports.variance = variance; +exports.version = version; +exports.window = defaultView; +exports.xml = xml; +exports.zip = zip; +exports.zoom = zoom; +exports.zoomIdentity = identity; +exports.zoomTransform = transform; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/visualisations/grid.js b/visualisations/grid.js new file mode 100644 index 0000000..cfe901e --- /dev/null +++ b/visualisations/grid.js @@ -0,0 +1,80 @@ + +var gridnames = ["#bluegrid", "#redgrid"]; + +for (gridname in gridnames) { + fillGrid(gridname) +} + +function fillGrid(gridname) { + + + function gridData() { + var data = new Array(); + var xpos = 1; //starting xpos and ypos at 1 so the stroke will show when we make the grid below + var ypos = 1; + var width = 50; + var height = 50; + var click = 0; + + // iterate for rows + for (var row = 0; row < 10; row++) { + data.push( new Array() ); + + // iterate for cells/columns inside rows + for (var column = 0; column < 12; column++) { + data[row].push({ + x: xpos, + y: ypos, + width: width, + height: height, + text: "test", + click: click + }) + // increment the x position. I.e. move it over by 50 (width variable) + xpos += width; + } + // reset the x position after a row is complete + xpos = 1; + // increment the y position for the next row. Move it down 50 (height variable) + ypos += height; + } + return data; + } + + + var gridData = gridData(); + // I like to log the data to the console for quick debugging + console.log(gridData); + + var grid = d3.select("#bluegrid") + .append("svg") + .attr("width","610px") + .attr("height","510px"); + + var row = grid.selectAll(".row") + .data(gridData) + .enter().append("g") + .attr("class", "row"); + + var column = row.selectAll(".square") + .data(function(d) { return d; }) + .enter().append("rect") + .attr("class","square") + .attr("x", function(d) { return d.x; }) + .attr("y", function(d) { return d.y; }) + .attr("width", function(d) { return d.width; }) + .attr("height", function(d) { return d.height; }) + .style("fill", "#fff") + .style("stroke", "#222") + .on('click', function(d) { + d.click ++; + if ((d.click)%4 == 0 ) { d3.select(this).style("fill","#fff"); } + if ((d.click)%4 == 1 ) { d3.select(this).style("fill","#2C93E8"); } + if ((d.click)%4 == 2 ) { d3.select(this).style("fill","#F56C4E"); } + if ((d.click)%4 == 3 ) { d3.select(this).style("fill","#838690"); } + }); +} + + + + diff --git a/visualisations/index.html b/visualisations/index.html new file mode 100644 index 0000000..bffb200 --- /dev/null +++ b/visualisations/index.html @@ -0,0 +1,15 @@ + + + + + +

AMITT Red TTPs (techniques)

+
+ +

AMITT Blue TTPs (counters)

+
+ + + + + diff --git a/visualisations/index2.html b/visualisations/index2.html new file mode 100644 index 0000000..84010f1 --- /dev/null +++ b/visualisations/index2.html @@ -0,0 +1,13 @@ + + + + + D3 Page Template + + + + + + \ No newline at end of file diff --git a/visualisations/index_local.html b/visualisations/index_local.html new file mode 100644 index 0000000..9b30ca2 --- /dev/null +++ b/visualisations/index_local.html @@ -0,0 +1,14 @@ + + + + + +

AMITT Red TTPs (techniques)

+
+ +

AMITT Blue TTPs (counters)

+
+ + + + diff --git a/visualisations/index_remote.html b/visualisations/index_remote.html new file mode 100644 index 0000000..87eb6ad --- /dev/null +++ b/visualisations/index_remote.html @@ -0,0 +1,14 @@ + + + + + +

AMITT Red TTPs (techniques)

+
+ +

AMITT Blue TTPs (counters)

+
+ + + + \ No newline at end of file diff --git a/visualisations/project_1.html b/visualisations/project_1.html new file mode 100644 index 0000000..0972001 --- /dev/null +++ b/visualisations/project_1.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file