@tungstenstudio/outschart-generator 1.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,1194 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ NOTATIONS: () => NOTATIONS,
24
+ OutsChartError: () => OutsChartError,
25
+ filterByPreferredTargets: () => filterByPreferredTargets,
26
+ formatCheckoutChart: () => formatCheckoutChart,
27
+ formatDart: () => formatDart,
28
+ formatTarget: () => formatTarget,
29
+ generateAllCheckouts: () => generateAllCheckouts,
30
+ generateRecommended: () => generateRecommended,
31
+ getBogeyNumbers: () => getBogeyNumbers,
32
+ getCheckout: () => getCheckout,
33
+ getCheckoutChart: () => getCheckoutChart,
34
+ isCheckable: () => isCheckable,
35
+ parseTarget: () => parseTarget
36
+ });
37
+ module.exports = __toCommonJS(index_exports);
38
+
39
+ // src/types.ts
40
+ var OutsChartError = class extends Error {
41
+ constructor(code, message) {
42
+ super(message);
43
+ this.name = "OutsChartError";
44
+ this.code = code;
45
+ }
46
+ };
47
+
48
+ // src/data/dartboard-layout.json
49
+ var dartboard_layout_default = {
50
+ meta: {
51
+ description: "Physical dartboard layout: number order, neighbors, and miss targets for each bed",
52
+ notes: "Board order is clockwise starting from the top. Each number has two lateral neighbors (clockwise/counterclockwise) and each bed has radial neighbors (closer to or farther from the center)."
53
+ },
54
+ boardOrder: [20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5],
55
+ neighbors: {
56
+ "1": { clockwise: 18, counterClockwise: 20 },
57
+ "2": { clockwise: 17, counterClockwise: 15 },
58
+ "3": { clockwise: 19, counterClockwise: 17 },
59
+ "4": { clockwise: 13, counterClockwise: 18 },
60
+ "5": { clockwise: 20, counterClockwise: 12 },
61
+ "6": { clockwise: 10, counterClockwise: 13 },
62
+ "7": { clockwise: 16, counterClockwise: 19 },
63
+ "8": { clockwise: 11, counterClockwise: 16 },
64
+ "9": { clockwise: 12, counterClockwise: 14 },
65
+ "10": { clockwise: 15, counterClockwise: 6 },
66
+ "11": { clockwise: 14, counterClockwise: 8 },
67
+ "12": { clockwise: 5, counterClockwise: 9 },
68
+ "13": { clockwise: 6, counterClockwise: 4 },
69
+ "14": { clockwise: 9, counterClockwise: 11 },
70
+ "15": { clockwise: 2, counterClockwise: 10 },
71
+ "16": { clockwise: 8, counterClockwise: 7 },
72
+ "17": { clockwise: 3, counterClockwise: 2 },
73
+ "18": { clockwise: 4, counterClockwise: 1 },
74
+ "19": { clockwise: 7, counterClockwise: 3 },
75
+ "20": { clockwise: 5, counterClockwise: 1 }
76
+ },
77
+ radialBeds: {
78
+ description: "From center outward: Bull, 25, smallSingle, treble, largeSingle, double, off-board",
79
+ order: ["Bull", "25", "smallSingle", "treble", "largeSingle", "double", "off"]
80
+ },
81
+ missTargets: {
82
+ description: "For each bed type, the possible miss results: radial (in/out from center) and lateral (adjacent numbers). 'off' means off the board (no score).",
83
+ Bull: {
84
+ radialOut: "25",
85
+ radialIn: null,
86
+ lateralMiss: false
87
+ },
88
+ "25": {
89
+ radialOut: "smallSingle",
90
+ radialIn: "Bull",
91
+ lateralMiss: false
92
+ },
93
+ smallSingle: {
94
+ radialOut: "treble",
95
+ radialIn: "25",
96
+ lateralMiss: true
97
+ },
98
+ treble: {
99
+ radialOut: "largeSingle",
100
+ radialIn: "smallSingle",
101
+ lateralMiss: true
102
+ },
103
+ largeSingle: {
104
+ radialOut: "double",
105
+ radialIn: "treble",
106
+ lateralMiss: true
107
+ },
108
+ double: {
109
+ radialOut: "off",
110
+ radialIn: "largeSingle",
111
+ lateralMiss: true
112
+ }
113
+ }
114
+ };
115
+
116
+ // src/dartboard.ts
117
+ var boardLayout = dartboard_layout_default;
118
+ var BOARD_ORDER = boardLayout.boardOrder;
119
+ function getNeighbors(num) {
120
+ const n = boardLayout.neighbors[String(num)];
121
+ return { cw: n.clockwise, ccw: n.counterClockwise };
122
+ }
123
+ function parseTarget(target) {
124
+ if (target === "Bull") return { bed: "Bull", number: null, value: 50 };
125
+ if (target === "25") return { bed: "25", number: null, value: 25 };
126
+ const m = target.match(/^([TD]?)(\d+)$/);
127
+ if (!m) return null;
128
+ const num = parseInt(m[2]);
129
+ if (num < 1 || num > 20) return null;
130
+ const prefix = m[1];
131
+ if (prefix === "T") return { bed: "treble", number: num, value: num * 3 };
132
+ if (prefix === "D") return { bed: "double", number: num, value: num * 2 };
133
+ return { bed: null, number: num, value: num };
134
+ }
135
+ function formatTarget(bed, number) {
136
+ if (bed === "Bull") return { label: "Bull", value: 50 };
137
+ if (bed === "25") return { label: "25", value: 25 };
138
+ if (bed === "off") return { label: "off", value: 0 };
139
+ if (bed === "treble") return { label: `T${number}`, value: number * 3 };
140
+ if (bed === "double") return { label: `D${number}`, value: number * 2 };
141
+ return { label: `${number}`, value: number };
142
+ }
143
+ function getMissTargets(target) {
144
+ const parsed = parseTarget(target);
145
+ if (!parsed) return [];
146
+ const misses = [];
147
+ const missInfo = getMissInfo(parsed);
148
+ if (missInfo.radialIn) {
149
+ misses.push({ ...missInfo.radialIn, missType: "radialIn" });
150
+ }
151
+ if (missInfo.radialOut) {
152
+ misses.push({ ...missInfo.radialOut, missType: "radialOut" });
153
+ }
154
+ if (parsed.number) {
155
+ const { cw, ccw } = getNeighbors(parsed.number);
156
+ if (parsed.bed === "treble") {
157
+ misses.push({ label: `T${cw}`, value: cw * 3, missType: "lateralCW" });
158
+ misses.push({ label: `T${ccw}`, value: ccw * 3, missType: "lateralCCW" });
159
+ } else if (parsed.bed === "double") {
160
+ misses.push({ label: `D${cw}`, value: cw * 2, missType: "lateralCW" });
161
+ misses.push({ label: `D${ccw}`, value: ccw * 2, missType: "lateralCCW" });
162
+ } else {
163
+ misses.push({ label: `${cw}`, value: cw, missType: "lateralCW" });
164
+ misses.push({ label: `${ccw}`, value: ccw, missType: "lateralCCW" });
165
+ }
166
+ }
167
+ return misses;
168
+ }
169
+ function getMissInfo(parsed) {
170
+ const result = {
171
+ radialIn: null,
172
+ radialOut: null
173
+ };
174
+ if (parsed.bed === "Bull") {
175
+ result.radialOut = formatTarget("25", null);
176
+ } else if (parsed.bed === "25") {
177
+ result.radialIn = formatTarget("Bull", null);
178
+ } else if (parsed.bed === "treble") {
179
+ result.radialIn = formatTarget("smallSingle", parsed.number);
180
+ result.radialOut = formatTarget("largeSingle", parsed.number);
181
+ } else if (parsed.bed === "double") {
182
+ result.radialIn = formatTarget("largeSingle", parsed.number);
183
+ result.radialOut = formatTarget("off", null);
184
+ } else {
185
+ result.radialIn = formatTarget("treble", parsed.number);
186
+ result.radialOut = formatTarget("double", parsed.number);
187
+ }
188
+ return result;
189
+ }
190
+ function evaluateThrow(target, remaining) {
191
+ const parsed = parseTarget(target);
192
+ if (!parsed) return null;
193
+ const misses = getMissTargets(target);
194
+ const evaluatedMisses = misses.map((miss) => {
195
+ const newRemaining = remaining - miss.value;
196
+ return {
197
+ ...miss,
198
+ newRemaining,
199
+ busts: newRemaining < 0
200
+ };
201
+ });
202
+ return {
203
+ target,
204
+ targetValue: parsed.value,
205
+ remaining,
206
+ misses: evaluatedMisses,
207
+ bustCount: evaluatedMisses.filter((m) => m.busts).length,
208
+ totalMisses: evaluatedMisses.length
209
+ };
210
+ }
211
+
212
+ // src/data/double-out-checkouts.ts
213
+ var DOUBLE_OUT_BOGEY_NUMBERS = [159, 162, 163, 165, 166, 168, 169];
214
+ var DOUBLE_OUT_CHECKOUTS = {
215
+ 2: { darts: ["D1"], numDarts: 1 },
216
+ 3: { darts: ["1", "D1"], numDarts: 2 },
217
+ 4: { darts: ["D2"], numDarts: 1 },
218
+ 5: { darts: ["1", "D2"], numDarts: 2 },
219
+ 6: { darts: ["D3"], numDarts: 1 },
220
+ 7: { darts: ["3", "D2"], numDarts: 2 },
221
+ 8: { darts: ["D4"], numDarts: 1 },
222
+ 9: { darts: ["1", "D4"], numDarts: 2 },
223
+ 10: { darts: ["D5"], numDarts: 1 },
224
+ 11: { darts: ["3", "D4"], numDarts: 2 },
225
+ 12: { darts: ["D6"], numDarts: 1 },
226
+ 13: { darts: ["5", "D4"], numDarts: 2 },
227
+ 14: { darts: ["D7"], numDarts: 1 },
228
+ 15: { darts: ["7", "D4"], numDarts: 2 },
229
+ 16: { darts: ["D8"], numDarts: 1 },
230
+ 17: { darts: ["1", "D8"], numDarts: 2 },
231
+ 18: { darts: ["D9"], numDarts: 1 },
232
+ 19: { darts: ["3", "D8"], numDarts: 2 },
233
+ 20: { darts: ["D10"], numDarts: 1 },
234
+ 21: { darts: ["5", "D8"], numDarts: 2 },
235
+ 22: { darts: ["D11"], numDarts: 1 },
236
+ 23: { darts: ["7", "D8"], numDarts: 2 },
237
+ 24: { darts: ["D12"], numDarts: 1 },
238
+ 25: { darts: ["9", "D8"], numDarts: 2 },
239
+ 26: { darts: ["D13"], numDarts: 1 },
240
+ 27: { darts: ["3", "D12"], numDarts: 2 },
241
+ 28: { darts: ["D14"], numDarts: 1 },
242
+ 29: { darts: ["5", "D12"], numDarts: 2 },
243
+ 30: { darts: ["D15"], numDarts: 1 },
244
+ 31: { darts: ["7", "D12"], numDarts: 2 },
245
+ 32: { darts: ["D16"], numDarts: 1 },
246
+ 33: { darts: ["1", "D16"], numDarts: 2 },
247
+ 34: { darts: ["D17"], numDarts: 1 },
248
+ 35: { darts: ["3", "D16"], numDarts: 2 },
249
+ 36: { darts: ["D18"], numDarts: 1 },
250
+ 37: { darts: ["5", "D16"], numDarts: 2 },
251
+ 38: { darts: ["D19"], numDarts: 1 },
252
+ 39: { darts: ["7", "D16"], numDarts: 2 },
253
+ 40: { darts: ["D20"], numDarts: 1 },
254
+ 41: { darts: ["9", "D16"], numDarts: 2 },
255
+ 42: { darts: ["10", "D16"], numDarts: 2 },
256
+ 43: { darts: ["11", "D16"], numDarts: 2 },
257
+ 44: { darts: ["12", "D16"], numDarts: 2 },
258
+ 45: { darts: ["13", "D16"], numDarts: 2 },
259
+ 46: { darts: ["14", "D16"], numDarts: 2 },
260
+ 47: { darts: ["15", "D16"], numDarts: 2 },
261
+ 48: { darts: ["16", "D16"], numDarts: 2 },
262
+ 49: { darts: ["9", "D20"], numDarts: 2 },
263
+ 50: { darts: ["Bull"], numDarts: 1 },
264
+ 51: { darts: ["11", "D20"], numDarts: 2 },
265
+ 52: { darts: ["12", "D20"], numDarts: 2 },
266
+ 53: { darts: ["13", "D20"], numDarts: 2 },
267
+ 54: { darts: ["14", "D20"], numDarts: 2 },
268
+ 55: { darts: ["15", "D20"], numDarts: 2 },
269
+ 56: { darts: ["16", "D20"], numDarts: 2 },
270
+ 57: { darts: ["17", "D20"], numDarts: 2 },
271
+ 58: { darts: ["18", "D20"], numDarts: 2 },
272
+ 59: { darts: ["19", "D20"], numDarts: 2 },
273
+ 60: { darts: ["20", "D20"], numDarts: 2 },
274
+ 61: { darts: ["T15", "D8"], numDarts: 2 },
275
+ 62: { darts: ["T10", "D16"], numDarts: 2 },
276
+ 63: { darts: ["T13", "D12"], numDarts: 2 },
277
+ 64: { darts: ["T16", "D8"], numDarts: 2 },
278
+ 65: { darts: ["T19", "D4"], numDarts: 2 },
279
+ 66: { darts: ["T10", "D18"], numDarts: 2 },
280
+ 67: { darts: ["T17", "D8"], numDarts: 2 },
281
+ 68: { darts: ["T20", "D4"], numDarts: 2 },
282
+ 69: { darts: ["T15", "D12"], numDarts: 2 },
283
+ 70: { darts: ["T10", "D20"], numDarts: 2 },
284
+ 71: { darts: ["T13", "D16"], numDarts: 2 },
285
+ 72: { darts: ["T16", "D12"], numDarts: 2 },
286
+ 73: { darts: ["T19", "D8"], numDarts: 2 },
287
+ 74: { darts: ["T14", "D16"], numDarts: 2 },
288
+ 75: { darts: ["T17", "D12"], numDarts: 2 },
289
+ 76: { darts: ["T20", "D8"], numDarts: 2 },
290
+ 77: { darts: ["T19", "D10"], numDarts: 2 },
291
+ 78: { darts: ["T18", "D12"], numDarts: 2 },
292
+ 79: { darts: ["T13", "D20"], numDarts: 2 },
293
+ 80: { darts: ["T20", "D10"], numDarts: 2 },
294
+ 81: { darts: ["T19", "D12"], numDarts: 2 },
295
+ 82: { darts: ["T14", "D20"], numDarts: 2 },
296
+ 83: { darts: ["T17", "D16"], numDarts: 2 },
297
+ 84: { darts: ["T20", "D12"], numDarts: 2 },
298
+ 85: { darts: ["T15", "D20"], numDarts: 2 },
299
+ 86: { darts: ["T18", "D16"], numDarts: 2 },
300
+ 87: { darts: ["T17", "D18"], numDarts: 2 },
301
+ 88: { darts: ["T16", "D20"], numDarts: 2 },
302
+ 89: { darts: ["T19", "D16"], numDarts: 2 },
303
+ 90: { darts: ["T20", "D15"], numDarts: 2 },
304
+ 91: { darts: ["T17", "D20"], numDarts: 2 },
305
+ 92: { darts: ["T20", "D16"], numDarts: 2 },
306
+ 93: { darts: ["T19", "D18"], numDarts: 2 },
307
+ 94: { darts: ["T18", "D20"], numDarts: 2 },
308
+ 95: { darts: ["T19", "D19"], numDarts: 2 },
309
+ 96: { darts: ["T20", "D18"], numDarts: 2 },
310
+ 97: { darts: ["T19", "D20"], numDarts: 2 },
311
+ 98: { darts: ["T20", "D19"], numDarts: 2 },
312
+ 99: { darts: ["T19", "10", "D16"], numDarts: 3 },
313
+ 100: { darts: ["T20", "D20"], numDarts: 2 },
314
+ 101: { darts: ["T17", "Bull"], numDarts: 2 },
315
+ 102: { darts: ["T20", "10", "D16"], numDarts: 3 },
316
+ 103: { darts: ["T19", "10", "D18"], numDarts: 3 },
317
+ 104: { darts: ["T18", "Bull"], numDarts: 2 },
318
+ 105: { darts: ["T20", "13", "D16"], numDarts: 3 },
319
+ 106: { darts: ["T20", "14", "D16"], numDarts: 3 },
320
+ 107: { darts: ["T19", "Bull"], numDarts: 2 },
321
+ 108: { darts: ["T20", "16", "D16"], numDarts: 3 },
322
+ 109: { darts: ["T20", "17", "D16"], numDarts: 3 },
323
+ 110: { darts: ["T20", "Bull"], numDarts: 2 },
324
+ 111: { darts: ["T20", "19", "D16"], numDarts: 3 },
325
+ 112: { darts: ["T20", "12", "D20"], numDarts: 3 },
326
+ 113: { darts: ["T20", "13", "D20"], numDarts: 3 },
327
+ 114: { darts: ["T20", "14", "D20"], numDarts: 3 },
328
+ 115: { darts: ["T20", "15", "D20"], numDarts: 3 },
329
+ 116: { darts: ["T20", "16", "D20"], numDarts: 3 },
330
+ 117: { darts: ["T20", "17", "D20"], numDarts: 3 },
331
+ 118: { darts: ["T20", "18", "D20"], numDarts: 3 },
332
+ 119: { darts: ["T19", "T10", "D16"], numDarts: 3 },
333
+ 120: { darts: ["T20", "20", "D20"], numDarts: 3 },
334
+ 121: { darts: ["T17", "T10", "D20"], numDarts: 3 },
335
+ 122: { darts: ["T18", "T20", "D4"], numDarts: 3 },
336
+ 123: { darts: ["T19", "T16", "D9"], numDarts: 3 },
337
+ 124: { darts: ["T20", "T14", "D11"], numDarts: 3 },
338
+ 125: { darts: ["25", "T20", "D20"], numDarts: 3 },
339
+ 126: { darts: ["T19", "T19", "D6"], numDarts: 3 },
340
+ 127: { darts: ["T20", "T17", "D8"], numDarts: 3 },
341
+ 128: { darts: ["T18", "T14", "D16"], numDarts: 3 },
342
+ 129: { darts: ["T19", "T16", "D12"], numDarts: 3 },
343
+ 130: { darts: ["T20", "20", "Bull"], numDarts: 3 },
344
+ 131: { darts: ["T20", "T13", "D16"], numDarts: 3 },
345
+ 132: { darts: ["Bull", "T14", "D20"], numDarts: 3 },
346
+ 133: { darts: ["T20", "T19", "D8"], numDarts: 3 },
347
+ 134: { darts: ["T20", "T14", "D16"], numDarts: 3 },
348
+ 135: { darts: ["Bull", "T15", "D20"], numDarts: 3 },
349
+ 136: { darts: ["T20", "T20", "D8"], numDarts: 3 },
350
+ 137: { darts: ["T20", "T19", "D10"], numDarts: 3 },
351
+ 138: { darts: ["T20", "T18", "D12"], numDarts: 3 },
352
+ 139: { darts: ["T19", "T14", "D20"], numDarts: 3 },
353
+ 140: { darts: ["T20", "T20", "D10"], numDarts: 3 },
354
+ 141: { darts: ["T20", "T19", "D12"], numDarts: 3 },
355
+ 142: { darts: ["T20", "T14", "D20"], numDarts: 3 },
356
+ 143: { darts: ["T20", "T17", "D16"], numDarts: 3 },
357
+ 144: { darts: ["T20", "T20", "D12"], numDarts: 3 },
358
+ 145: { darts: ["T20", "T15", "D20"], numDarts: 3 },
359
+ 146: { darts: ["T20", "T18", "D16"], numDarts: 3 },
360
+ 147: { darts: ["T20", "T17", "D18"], numDarts: 3 },
361
+ 148: { darts: ["T20", "T16", "D20"], numDarts: 3 },
362
+ 149: { darts: ["T20", "T19", "D16"], numDarts: 3 },
363
+ 150: { darts: ["T20", "T18", "D18"], numDarts: 3 },
364
+ 151: { darts: ["T20", "T17", "D20"], numDarts: 3 },
365
+ 152: { darts: ["T20", "T20", "D16"], numDarts: 3 },
366
+ 153: { darts: ["T20", "T19", "D18"], numDarts: 3 },
367
+ 154: { darts: ["T20", "T18", "D20"], numDarts: 3 },
368
+ 155: { darts: ["T20", "T19", "D19"], numDarts: 3 },
369
+ 156: { darts: ["T20", "T20", "D18"], numDarts: 3 },
370
+ 157: { darts: ["T20", "T19", "D20"], numDarts: 3 },
371
+ 158: { darts: ["T20", "T20", "D19"], numDarts: 3 },
372
+ 160: { darts: ["T20", "T20", "D20"], numDarts: 3 },
373
+ 161: { darts: ["T20", "T17", "Bull"], numDarts: 3 },
374
+ 164: { darts: ["T20", "T18", "Bull"], numDarts: 3 },
375
+ 167: { darts: ["T20", "T19", "Bull"], numDarts: 3 },
376
+ 170: { darts: ["T20", "T20", "Bull"], numDarts: 3 }
377
+ };
378
+
379
+ // src/data/single-out-checkouts.ts
380
+ var SINGLE_OUT_BOGEY_NUMBERS = [163, 166, 169, 172, 173, 175, 176, 178, 179];
381
+ var SINGLE_OUT_CHECKOUTS = {
382
+ 1: { darts: ["1"], numDarts: 1 },
383
+ 2: { darts: ["2"], numDarts: 1 },
384
+ 3: { darts: ["3"], numDarts: 1 },
385
+ 4: { darts: ["4"], numDarts: 1 },
386
+ 5: { darts: ["5"], numDarts: 1 },
387
+ 6: { darts: ["6"], numDarts: 1 },
388
+ 7: { darts: ["7"], numDarts: 1 },
389
+ 8: { darts: ["8"], numDarts: 1 },
390
+ 9: { darts: ["9"], numDarts: 1 },
391
+ 10: { darts: ["10"], numDarts: 1 },
392
+ 11: { darts: ["11"], numDarts: 1 },
393
+ 12: { darts: ["12"], numDarts: 1 },
394
+ 13: { darts: ["13"], numDarts: 1 },
395
+ 14: { darts: ["14"], numDarts: 1 },
396
+ 15: { darts: ["15"], numDarts: 1 },
397
+ 16: { darts: ["16"], numDarts: 1 },
398
+ 17: { darts: ["17"], numDarts: 1 },
399
+ 18: { darts: ["18"], numDarts: 1 },
400
+ 19: { darts: ["19"], numDarts: 1 },
401
+ 20: { darts: ["20"], numDarts: 1 },
402
+ 21: { darts: ["7", "14"], numDarts: 2, alternates: [["1", "20"], ["2", "19"], ["3", "18"], ["4", "17"], ["5", "16"]] },
403
+ 22: { darts: ["D11"], numDarts: 1, alternates: [["2", "20"], ["3", "19"], ["4", "18"], ["5", "17"], ["6", "16"]] },
404
+ 23: { darts: ["3", "20"], numDarts: 2, alternates: [["4", "19"], ["5", "18"], ["6", "17"], ["7", "16"], ["8", "15"]] },
405
+ 24: { darts: ["D12"], numDarts: 1, alternates: [["8", "16"], ["4", "20"], ["5", "19"], ["6", "18"], ["7", "17"]] },
406
+ 25: { darts: ["9", "16"], numDarts: 2, alternates: [["25"], ["5", "20"], ["6", "19"], ["7", "18"], ["8", "17"]] },
407
+ 26: { darts: ["D13"], numDarts: 1, alternates: [["6", "20"], ["7", "19"], ["8", "18"], ["13", "13"], ["2", "D12"]] },
408
+ 27: { darts: ["9", "18"], numDarts: 2, alternates: [["7", "20"], ["8", "19"], ["3", "D12"], ["10", "17"], ["11", "16"]] },
409
+ 28: { darts: ["D14"], numDarts: 1, alternates: [["8", "20"], ["9", "19"], ["14", "14"], ["4", "D12"], ["10", "18"]] },
410
+ 29: { darts: ["9", "20"], numDarts: 2, alternates: [["5", "D12"], ["11", "18"], ["12", "17"], ["14", "15"]] },
411
+ 30: { darts: ["D15"], numDarts: 1, alternates: [["10", "20"], ["15", "15"], ["6", "D12"], ["11", "19"], ["12", "18"]] },
412
+ 31: { darts: ["12", "19"], numDarts: 2, alternates: [["7", "D12"], ["13", "18"], ["14", "17"], ["3", "D14"], ["11", "20"]] },
413
+ 32: { darts: ["D16"], numDarts: 1, alternates: [["16", "16"], ["8", "D12"], ["13", "19"], ["15", "17"], ["4", "D14"]] },
414
+ 33: { darts: ["14", "19"], numDarts: 2, alternates: [["1", "D16"], ["9", "D12"], ["16", "17"], ["5", "D14"], ["13", "20"]] },
415
+ 34: { darts: ["D17"], numDarts: 1, alternates: [["2", "D16"], ["10", "D12"], ["15", "19"], ["16", "18"], ["6", "D14"]] },
416
+ 35: { darts: ["15", "20"], numDarts: 2, alternates: [["3", "D16"], ["11", "D12"], ["16", "19"], ["17", "18"], ["7", "D14"]] },
417
+ 36: { darts: ["D18"], numDarts: 1, alternates: [["4", "D16"], ["17", "19"], ["8", "D14"], ["12", "D12"], ["18", "18"]] },
418
+ 37: { darts: ["18", "19"], numDarts: 2, alternates: [["5", "D16"], ["1", "D18"], ["17", "20"], ["3", "D17"], ["7", "D15"]] },
419
+ 38: { darts: ["D19"], numDarts: 1, alternates: [["6", "D16"], ["18", "20"], ["4", "D17"], ["8", "D15"], ["2", "D18"]] },
420
+ 39: { darts: ["19", "20"], numDarts: 2, alternates: [["7", "D16"], ["3", "D18"], ["9", "D15"], ["1", "D19"], ["5", "D17"]] },
421
+ 40: { darts: ["D20"], numDarts: 1, alternates: [["8", "D16"], ["4", "D18"], ["20", "20"], ["6", "D17"], ["10", "D15"]] },
422
+ 41: { darts: ["9", "D16"], numDarts: 2, alternates: [["1", "D20"], ["7", "D17"], ["11", "D15"], ["3", "D19"], ["5", "D18"]] },
423
+ 42: { darts: ["T14"], numDarts: 1, alternates: [["10", "D16"], ["2", "D20"], ["14", "D14"], ["6", "D18"], ["4", "D19"]] },
424
+ 43: { darts: ["3", "D20"], numDarts: 2, alternates: [["11", "D16"], ["7", "D18"], ["13", "D15"], ["19", "D12"], ["5", "D19"]] },
425
+ 44: { darts: ["12", "D16"], numDarts: 2, alternates: [["8", "D18"], ["4", "D20"], ["6", "D19"], ["10", "D17"], ["14", "D15"]] },
426
+ 45: { darts: ["T15"], numDarts: 1, alternates: [["13", "D16"], ["5", "D20"], ["9", "D18"], ["7", "D19"], ["15", "D15"]] },
427
+ 46: { darts: ["6", "D20"], numDarts: 2, alternates: [["14", "D16"], ["10", "D18"], ["8", "D19"]] },
428
+ 47: { darts: ["15", "D16"], numDarts: 2, alternates: [["11", "D18"], ["7", "D20"], ["9", "D19"]] },
429
+ 48: { darts: ["T16"], numDarts: 1, alternates: [["16", "D16"], ["8", "D20"], ["10", "D19"], ["12", "D18"], ["14", "D17"]] },
430
+ 49: { darts: ["13", "D18"], numDarts: 2, alternates: [["15", "D17"], ["9", "D20"], ["11", "D19"], ["17", "D16"], ["19", "D15"]] },
431
+ 50: { darts: ["10", "D20"], numDarts: 2, alternates: [["Bull"], ["14", "D18"], ["12", "D19"], ["16", "D17"], ["D16", "18"]] },
432
+ 51: { darts: ["T17"], numDarts: 1, alternates: [["17", "D17"], ["13", "D19"], ["11", "D20"], ["19", "D16"], ["15", "D18"]] },
433
+ 52: { darts: ["16", "D18"], numDarts: 2, alternates: [["12", "D20"], ["20", "D16"], ["14", "D19"], ["18", "D17"]] },
434
+ 53: { darts: ["17", "D18"], numDarts: 2, alternates: [["13", "D20"], ["15", "D19"]] },
435
+ 54: { darts: ["T18"], numDarts: 1, alternates: [["14", "D20"], ["18", "D18"], ["16", "D19"], ["20", "D17"]] },
436
+ 55: { darts: ["15", "D20"], numDarts: 2, alternates: [["17", "D19"]] },
437
+ 56: { darts: ["16", "D20"], numDarts: 2, alternates: [["18", "D19"]] },
438
+ 57: { darts: ["T19"], numDarts: 1, alternates: [["19", "D19"], ["17", "D20"]] },
439
+ 58: { darts: ["18", "D20"], numDarts: 2 },
440
+ 59: { darts: ["19", "D20"], numDarts: 2 },
441
+ 60: { darts: ["T20"], numDarts: 1, alternates: [["20", "D20"]] },
442
+ 61: { darts: ["T16", "13"], numDarts: 2, alternates: [["T7", "D20"], ["T14", "19"]] },
443
+ 62: { darts: ["T14", "20"], numDarts: 2, alternates: [["D11", "D20"], ["D15", "D16"], ["T15", "17"], ["T16", "14"], ["D13", "D18"]] },
444
+ 63: { darts: ["T15", "18"], numDarts: 2, alternates: [["T13", "D12"], ["T16", "15"], ["T17", "12"]] },
445
+ 64: { darts: ["T16", "16"], numDarts: 2, alternates: [["D16", "D16"]] },
446
+ 65: { darts: ["T15", "20"], numDarts: 2, alternates: [["T17", "14"], ["T11", "D16"], ["25", "D20"], ["T16", "17"]] },
447
+ 66: { darts: ["T16", "18"], numDarts: 2, alternates: [["T18", "12"], ["T17", "15"]] },
448
+ 67: { darts: ["T16", "19"], numDarts: 2, alternates: [["T17", "16"], ["T18", "13"]] },
449
+ 68: { darts: ["T17", "17"], numDarts: 2, alternates: [["T18", "14"], ["D18", "D16"], ["D14", "D20"], ["T16", "20"]] },
450
+ 69: { darts: ["T19", "12"], numDarts: 2, alternates: [["T18", "15"]] },
451
+ 70: { darts: ["T19", "13"], numDarts: 2, alternates: [["T10", "D20"], ["D16", "D19"], ["D20", "D15"], ["T17", "19"], ["T18", "16"]] },
452
+ 71: { darts: ["T17", "20"], numDarts: 2, alternates: [["T19", "14"], ["T18", "17"]] },
453
+ 72: { darts: ["T18", "18"], numDarts: 2, alternates: [["T12", "D18"]] },
454
+ 73: { darts: ["T19", "16"], numDarts: 2, alternates: [["T18", "19"], ["T20", "13"]] },
455
+ 74: { darts: ["T20", "14"], numDarts: 2, alternates: [["T14", "D16"], ["D17", "D20"], ["T18", "20"], ["T19", "17"]] },
456
+ 75: { darts: ["T19", "18"], numDarts: 2, alternates: [["T20", "15"], ["T15", "D15"]] },
457
+ 76: { darts: ["T19", "19"], numDarts: 2, alternates: [["T20", "16"]] },
458
+ 77: { darts: ["T20", "17"], numDarts: 2, alternates: [["T19", "20"]] },
459
+ 78: { darts: ["T18", "D12"], numDarts: 2, alternates: [["T14", "D18"], ["D19", "D20"], ["T16", "D15"], ["18", "T20"]] },
460
+ 79: { darts: ["T20", "19"], numDarts: 2, alternates: [["T13", "D20"]] },
461
+ 80: { darts: ["T20", "20"], numDarts: 2, alternates: [["D20", "D20"]] },
462
+ 81: { darts: ["T19", "D12"], numDarts: 2, alternates: [["T15", "D18"], ["T20", "T7"], ["T19", "T8"], ["T18", "T9"], ["T16", "T11"]] },
463
+ 82: { darts: ["T14", "D20"], numDarts: 2, alternates: [["Bull", "D16"], ["T18", "D14"], ["T16", "D17"]] },
464
+ 83: { darts: ["T17", "D16"], numDarts: 2, alternates: [["T15", "D19"], ["T19", "D13"]] },
465
+ 84: { darts: ["T16", "D18"], numDarts: 2, alternates: [["T20", "D12"], ["T20", "T8"], ["T19", "T9"], ["T17", "T11"], ["T14", "T14"]] },
466
+ 85: { darts: ["T15", "D20"], numDarts: 2, alternates: [["T19", "D14"], ["T17", "D17"]] },
467
+ 86: { darts: ["T18", "D16"], numDarts: 2, alternates: [["T16", "D19"], ["T20", "D13"]] },
468
+ 87: { darts: ["T20", "T9"], numDarts: 2, alternates: [["T15", "T14"], ["T17", "D18"], ["T19", "D15"], ["T19", "T10"], ["T18", "T11"]] },
469
+ 88: { darts: ["T16", "D20"], numDarts: 2, alternates: [["T20", "D14"], ["T18", "D17"], ["Bull", "D19"]] },
470
+ 89: { darts: ["T19", "D16"], numDarts: 2, alternates: [["T17", "D19"]] },
471
+ 90: { darts: ["T18", "D18"], numDarts: 2, alternates: [["T20", "D15"], ["Bull", "D20"], ["T20", "T10"], ["T19", "T11"], ["T16", "T14"]] },
472
+ 91: { darts: ["T17", "D20"], numDarts: 2, alternates: [["T19", "D17"]] },
473
+ 92: { darts: ["T20", "D16"], numDarts: 2, alternates: [["T18", "D19"]] },
474
+ 93: { darts: ["T19", "D18"], numDarts: 2, alternates: [["T20", "T11"], ["T17", "T14"], ["T19", "T12"], ["T18", "T13"], ["T16", "T15"]] },
475
+ 94: { darts: ["T18", "D20"], numDarts: 2, alternates: [["T20", "D17"]] },
476
+ 95: { darts: ["T19", "D19"], numDarts: 2 },
477
+ 96: { darts: ["T20", "D18"], numDarts: 2, alternates: [["T20", "T12"], ["T19", "T13"], ["T18", "T14"], ["T17", "T15"], ["T16", "T16"]] },
478
+ 97: { darts: ["T19", "D20"], numDarts: 2 },
479
+ 98: { darts: ["T20", "D19"], numDarts: 2 },
480
+ 99: { darts: ["T20", "T13"], numDarts: 2, alternates: [["T19", "T14"], ["T18", "T15"], ["T17", "T16"]] },
481
+ 100: { darts: ["T20", "D20"], numDarts: 2 },
482
+ 101: { darts: ["T17", "Bull"], numDarts: 2 },
483
+ 102: { darts: ["T20", "T14"], numDarts: 2, alternates: [["T19", "T15"], ["T18", "T16"], ["T17", "T17"]] },
484
+ 103: { darts: ["T19", "6", "D20"], numDarts: 3, alternates: [["T15", "18", "D20"], ["T20", "3", "D20"], ["T19", "14", "D16"], ["T20", "11", "D16"], ["T20", "7", "D18"]] },
485
+ 104: { darts: ["T18", "Bull"], numDarts: 2 },
486
+ 105: { darts: ["T20", "T15"], numDarts: 2, alternates: [["T19", "T16"], ["T18", "T17"]] },
487
+ 106: { darts: ["T16", "18", "D20"], numDarts: 3, alternates: [["T20", "6", "D20"], ["T20", "14", "D16"], ["T17", "15", "D20"], ["T18", "16", "D18"], ["T20", "10", "D18"]] },
488
+ 107: { darts: ["T19", "Bull"], numDarts: 2 },
489
+ 108: { darts: ["T20", "T16"], numDarts: 2, alternates: [["T19", "T17"], ["T18", "T18"]] },
490
+ 109: { darts: ["T17", "18", "D20"], numDarts: 3, alternates: [["T18", "15", "D20"], ["T19", "16", "D18"], ["T20", "13", "D18"], ["T19", "12", "D20"], ["T20", "15", "D17"]] },
491
+ 110: { darts: ["T20", "Bull"], numDarts: 2 },
492
+ 111: { darts: ["T20", "T17"], numDarts: 2, alternates: [["T19", "T18"]] },
493
+ 112: { darts: ["T18", "18", "D20"], numDarts: 3, alternates: [["T19", "15", "D20"], ["T20", "16", "D18"], ["T20", "12", "D20"], ["T20", "20", "D16"]] },
494
+ 113: { darts: ["T20", "17", "D18"], numDarts: 3, alternates: [["T19", "16", "D20"], ["T18", "19", "D20"], ["T20", "13", "D20"], ["T20", "15", "D19"], ["T19", "18", "D19"]] },
495
+ 114: { darts: ["T20", "T18"], numDarts: 2, alternates: [["T19", "T19"]] },
496
+ 115: { darts: ["T19", "18", "D20"], numDarts: 3, alternates: [["T20", "15", "D20"]] },
497
+ 116: { darts: ["T20", "16", "D20"], numDarts: 3, alternates: [["T19", "19", "D20"], ["T20", "18", "D19"]] },
498
+ 117: { darts: ["T20", "T19"], numDarts: 2 },
499
+ 118: { darts: ["T20", "18", "D20"], numDarts: 3 },
500
+ 119: { darts: ["T20", "19", "D20"], numDarts: 3 },
501
+ 120: { darts: ["T20", "T20"], numDarts: 2 },
502
+ 121: { darts: ["T19", "T16", "16"], numDarts: 3, alternates: [["T20", "T16", "13"], ["T19", "D16", "D16"], ["T19", "T15", "19"], ["T19", "T17", "13"], ["T18", "T16", "19"]] },
503
+ 122: { darts: ["T20", "T14", "20"], numDarts: 3, alternates: [["T20", "T15", "17"], ["T20", "T16", "14"], ["T17", "T17", "20"], ["T18", "T18", "14"], ["T18", "D18", "D16"]] },
504
+ 123: { darts: ["T19", "T18", "12"], numDarts: 3, alternates: [["T19", "T16", "18"], ["T20", "T15", "18"], ["T18", "T17", "18"], ["T18", "T18", "15"], ["T20", "T13", "D12"]] },
505
+ 124: { darts: ["T20", "T16", "16"], numDarts: 3, alternates: [["T20", "D16", "D16"], ["T19", "T16", "19"], ["T19", "T17", "16"], ["T19", "T18", "13"], ["T18", "D19", "D16"]] },
506
+ 125: { darts: ["T20", "T15", "20"], numDarts: 3, alternates: [["T20", "T16", "17"], ["T20", "T17", "14"], ["T19", "D18", "D16"], ["T17", "T14", "D16"], ["T20", "T11", "D16"]] },
507
+ 126: { darts: ["T19", "T19", "12"], numDarts: 3, alternates: [["T20", "T16", "18"], ["T18", "T18", "18"], ["T19", "T18", "15"], ["T20", "T18", "12"]] },
508
+ 127: { darts: ["T19", "T17", "19"], numDarts: 3, alternates: [["T19", "T18", "16"], ["T19", "T19", "13"], ["T19", "T10", "D20"], ["T19", "D16", "D19"], ["T19", "D20", "D15"]] },
509
+ 128: { darts: ["T20", "T16", "20"], numDarts: 3, alternates: [["T20", "T17", "17"], ["T20", "T18", "14"], ["T20", "D18", "D16"], ["T18", "T14", "D16"], ["T20", "D14", "D20"]] },
510
+ 129: { darts: ["T20", "T19", "12"], numDarts: 3, alternates: [["T19", "T18", "18"], ["T20", "T18", "15"]] },
511
+ 130: { darts: ["T19", "T18", "19"], numDarts: 3, alternates: [["T19", "T19", "16"], ["T20", "T10", "D20"], ["T20", "D16", "D19"], ["T20", "D20", "D15"], ["T20", "T17", "19"]] },
512
+ 131: { darts: ["T20", "T17", "20"], numDarts: 3, alternates: [["T20", "T18", "17"], ["T20", "T19", "14"], ["T19", "T14", "D16"], ["T17", "D20", "D20"], ["T19", "D17", "D20"]] },
513
+ 132: { darts: ["T20", "T18", "18"], numDarts: 3, alternates: [["T20", "T12", "D18"], ["T19", "T19", "18"], ["T20", "T19", "15"], ["T20", "T20", "12"]] },
514
+ 133: { darts: ["T19", "T19", "19"], numDarts: 3, alternates: [["T20", "T18", "19"], ["T20", "T19", "16"], ["T20", "T20", "13"]] },
515
+ 134: { darts: ["T20", "T18", "20"], numDarts: 3, alternates: [["T20", "T19", "17"], ["T20", "T20", "14"], ["T20", "T14", "D16"], ["T18", "D20", "D20"], ["T20", "D17", "D20"]] },
516
+ 135: { darts: ["T20", "T19", "18"], numDarts: 3, alternates: [["T20", "T20", "15"], ["T20", "T15", "D15"], ["T19", "T14", "D18"], ["T19", "D19", "D20"], ["T19", "T18", "D12"]] },
517
+ 136: { darts: ["T20", "T19", "19"], numDarts: 3, alternates: [["T20", "T20", "16"]] },
518
+ 137: { darts: ["T20", "T19", "20"], numDarts: 3, alternates: [["T20", "T20", "17"], ["T19", "D20", "D20"]] },
519
+ 138: { darts: ["T20", "T18", "D12"], numDarts: 3, alternates: [["T20", "T14", "D18"], ["T20", "D19", "D20"], ["T19", "T19", "D12"], ["T20", "T16", "D15"], ["T18", "T16", "D18"]] },
520
+ 139: { darts: ["T20", "T20", "19"], numDarts: 3, alternates: [["T19", "Bull", "D16"], ["T20", "T13", "D20"], ["T19", "T14", "D20"], ["T18", "T15", "D20"], ["T17", "T16", "D20"]] },
521
+ 140: { darts: ["T20", "T20", "20"], numDarts: 3, alternates: [["T20", "D20", "D20"]] },
522
+ 141: { darts: ["T20", "T19", "D12"], numDarts: 3, alternates: [["T18", "T20", "T9"], ["T18", "T15", "T14"], ["T19", "T20", "T8"], ["T19", "T19", "T9"], ["T19", "T14", "T14"]] },
523
+ 142: { darts: ["T20", "Bull", "D16"], numDarts: 3, alternates: [["T20", "T14", "D20"], ["T19", "T15", "D20"], ["T18", "T16", "D20"], ["T17", "T17", "D20"], ["T20", "T18", "D14"]] },
524
+ 143: { darts: ["T20", "T17", "D16"], numDarts: 3, alternates: [["T19", "T18", "D16"], ["T20", "T15", "D19"], ["T19", "T16", "D19"], ["T18", "T17", "D19"], ["T20", "T19", "D13"]] },
525
+ 144: { darts: ["T20", "T16", "D18"], numDarts: 3, alternates: [["T20", "T20", "D12"], ["T19", "T17", "D18"], ["T18", "T18", "D18"], ["T20", "T18", "D15"], ["T19", "T19", "D15"]] },
526
+ 145: { darts: ["T20", "T15", "D20"], numDarts: 3, alternates: [["T19", "T16", "D20"], ["T18", "T17", "D20"], ["T20", "T19", "D14"], ["T20", "T17", "D17"], ["T19", "T18", "D17"]] },
527
+ 146: { darts: ["T20", "T18", "D16"], numDarts: 3, alternates: [["T19", "T19", "D16"], ["T20", "T16", "D19"], ["T19", "T17", "D19"], ["T18", "T18", "D19"], ["T20", "T20", "D13"]] },
528
+ 147: { darts: ["T20", "T17", "D18"], numDarts: 3, alternates: [["T20", "T20", "T9"], ["T19", "T18", "D18"], ["T20", "T19", "D15"], ["T19", "Bull", "D20"], ["T19", "T20", "T10"]] },
529
+ 148: { darts: ["T20", "T16", "D20"], numDarts: 3, alternates: [["T19", "T17", "D20"], ["T18", "T18", "D20"], ["T20", "T20", "D14"], ["T20", "T18", "D17"], ["T19", "T19", "D17"]] },
530
+ 149: { darts: ["T20", "T19", "D16"], numDarts: 3, alternates: [["T20", "T17", "D19"], ["T19", "T18", "D19"]] },
531
+ 150: { darts: ["T20", "T18", "D18"], numDarts: 3, alternates: [["T19", "T19", "D18"], ["T20", "T20", "D15"], ["T20", "Bull", "D20"], ["T20", "T20", "T10"], ["T19", "T20", "T11"]] },
532
+ 151: { darts: ["T20", "T17", "D20"], numDarts: 3, alternates: [["T19", "T18", "D20"], ["T20", "T19", "D17"]] },
533
+ 152: { darts: ["T20", "T20", "D16"], numDarts: 3, alternates: [["T20", "T18", "D19"], ["T19", "T19", "D19"]] },
534
+ 153: { darts: ["T20", "T19", "D18"], numDarts: 3, alternates: [["T20", "T20", "T11"], ["T19", "T20", "T12"], ["T18", "T20", "T13"], ["T19", "T19", "T13"], ["T17", "T20", "T14"]] },
535
+ 154: { darts: ["T20", "T18", "D20"], numDarts: 3, alternates: [["T19", "T19", "D20"], ["T20", "T20", "D17"]] },
536
+ 155: { darts: ["T20", "T19", "D19"], numDarts: 3 },
537
+ 156: { darts: ["T20", "T20", "D18"], numDarts: 3, alternates: [["T20", "T20", "T12"], ["T19", "T20", "T13"], ["T18", "T20", "T14"], ["T19", "T19", "T14"], ["T17", "T20", "T15"]] },
538
+ 157: { darts: ["T20", "T19", "D20"], numDarts: 3 },
539
+ 158: { darts: ["T20", "T20", "D19"], numDarts: 3 },
540
+ 159: { darts: ["T20", "T20", "T13"], numDarts: 3, alternates: [["T19", "T20", "T14"], ["T18", "T20", "T15"], ["T19", "T19", "T15"], ["T17", "T20", "T16"], ["T18", "T19", "T16"]] },
541
+ 160: { darts: ["T20", "T20", "D20"], numDarts: 3 },
542
+ 161: { darts: ["T20", "T17", "Bull"], numDarts: 3, alternates: [["T19", "T18", "Bull"]] },
543
+ 162: { darts: ["T20", "T20", "T14"], numDarts: 3, alternates: [["T19", "T20", "T15"], ["T18", "T20", "T16"], ["T19", "T19", "T16"], ["T17", "T20", "T17"], ["T18", "T19", "T17"]] },
544
+ 164: { darts: ["T20", "T18", "Bull"], numDarts: 3, alternates: [["T19", "T19", "Bull"]] },
545
+ 165: { darts: ["T20", "T20", "T15"], numDarts: 3, alternates: [["T19", "T20", "T16"], ["T18", "T20", "T17"], ["T19", "T19", "T17"], ["T18", "T19", "T18"]] },
546
+ 167: { darts: ["T20", "T19", "Bull"], numDarts: 3 },
547
+ 168: { darts: ["T20", "T20", "T16"], numDarts: 3, alternates: [["T19", "T20", "T17"], ["T18", "T20", "T18"], ["T19", "T19", "T18"]] },
548
+ 170: { darts: ["T20", "T20", "Bull"], numDarts: 3 },
549
+ 171: { darts: ["T20", "T20", "T17"], numDarts: 3, alternates: [["T19", "T20", "T18"], ["T19", "T19", "T19"]] },
550
+ 174: { darts: ["T20", "T20", "T18"], numDarts: 3, alternates: [["T19", "T20", "T19"]] },
551
+ 177: { darts: ["T20", "T20", "T19"], numDarts: 3 },
552
+ 180: { darts: ["T20", "T20", "T20"], numDarts: 3 }
553
+ };
554
+
555
+ // src/lookup.ts
556
+ function getChartForMode(outMode) {
557
+ return outMode === "double" ? DOUBLE_OUT_CHECKOUTS : SINGLE_OUT_CHECKOUTS;
558
+ }
559
+ function getBogeyNumbersForMode(outMode) {
560
+ return outMode === "double" ? DOUBLE_OUT_BOGEY_NUMBERS : SINGLE_OUT_BOGEY_NUMBERS;
561
+ }
562
+ function getCheckout(score, outMode = "double") {
563
+ const chart = getChartForMode(outMode);
564
+ return chart[score] ?? null;
565
+ }
566
+ function getCheckoutChart(outMode = "double", range) {
567
+ const chart = getChartForMode(outMode);
568
+ if (!range) return { ...chart };
569
+ const min = range.min ?? 0;
570
+ const max = range.max ?? Infinity;
571
+ const filtered = {};
572
+ for (const [scoreStr, entry] of Object.entries(chart)) {
573
+ const score = Number(scoreStr);
574
+ if (score >= min && score <= max) {
575
+ filtered[score] = entry;
576
+ }
577
+ }
578
+ return filtered;
579
+ }
580
+ function getBogeyNumbers(outMode = "double") {
581
+ return [...getBogeyNumbersForMode(outMode)];
582
+ }
583
+ function isCheckable(score, outMode = "double") {
584
+ const chart = getChartForMode(outMode);
585
+ return score in chart;
586
+ }
587
+
588
+ // src/generate.ts
589
+ function buildTargets() {
590
+ const targets = [];
591
+ for (let i = 1; i <= 20; i++) {
592
+ targets.push({ label: `${i}`, value: i });
593
+ targets.push({ label: `D${i}`, value: i * 2 });
594
+ targets.push({ label: `T${i}`, value: i * 3 });
595
+ }
596
+ targets.push({ label: "25", value: 25 });
597
+ targets.push({ label: "Bull", value: 50 });
598
+ return targets;
599
+ }
600
+ function buildFinishingDoubles() {
601
+ const doubles = [];
602
+ for (let i = 1; i <= 20; i++) {
603
+ doubles.push({ label: `D${i}`, value: i * 2 });
604
+ }
605
+ doubles.push({ label: "Bull", value: 50 });
606
+ return doubles;
607
+ }
608
+ function generateAllCheckouts(options) {
609
+ const { outMode } = options;
610
+ const isDouble = outMode === "double";
611
+ const min = options.min ?? (isDouble ? 2 : 1);
612
+ const max = options.max ?? 170;
613
+ const allTargets2 = buildTargets();
614
+ const finishingTargets = isDouble ? buildFinishingDoubles() : allTargets2;
615
+ const checkouts = {};
616
+ const bogeyNumbers = [];
617
+ let totalOptions = 0;
618
+ for (let score = min; score <= max; score++) {
619
+ const opts = [];
620
+ for (const d of finishingTargets) {
621
+ if (d.value === score) {
622
+ opts.push([d.label]);
623
+ }
624
+ }
625
+ for (const d1 of allTargets2) {
626
+ if (d1.value >= score) continue;
627
+ const remainder = score - d1.value;
628
+ for (const d2 of finishingTargets) {
629
+ if (d2.value === remainder) {
630
+ opts.push([d1.label, d2.label]);
631
+ }
632
+ }
633
+ }
634
+ if (score > (isDouble ? 2 : 1)) {
635
+ for (const d1 of allTargets2) {
636
+ if (d1.value >= score) continue;
637
+ for (const d2 of allTargets2) {
638
+ if (d1.value + d2.value >= score) continue;
639
+ const remainder = score - d1.value - d2.value;
640
+ for (const d3 of finishingTargets) {
641
+ if (d3.value === remainder) {
642
+ opts.push([d1.label, d2.label, d3.label]);
643
+ }
644
+ }
645
+ }
646
+ }
647
+ }
648
+ if (opts.length > 0) {
649
+ checkouts[score] = { options: opts, count: opts.length };
650
+ totalOptions += opts.length;
651
+ } else {
652
+ bogeyNumbers.push(score);
653
+ }
654
+ }
655
+ return { checkouts, bogeyNumbers, totalOptions };
656
+ }
657
+
658
+ // src/data/dartboard-dimensions.json
659
+ var dartboard_dimensions_default = {
660
+ meta: {
661
+ description: "Standard steel-tip dartboard dimensions and segment areas",
662
+ units: "millimeters (mm) and square millimeters (sq mm)",
663
+ sources: [
664
+ "dartbase.com/wwwboard/messages/1280.html",
665
+ "dartsnutz.net/forum/thread-40058.html",
666
+ "pages.cs.wisc.edu/~bolo/darts/dartboard.html",
667
+ "dimensions.com/element/dartboard",
668
+ "darting.com/Darts-Rules/General/"
669
+ ],
670
+ notes: "Measurements reflect the official WDF/BDO standard board. Modern competition boards (Winmau Blade, Unicorn Eclipse) may have slightly wider beds due to thinner blade wire dividers."
671
+ },
672
+ board: {
673
+ overallDiameter: 451,
674
+ playableDiameter: 340,
675
+ typicalDepth: 38.1,
676
+ wireWidth: 1.5,
677
+ numberHeight: 25.4
678
+ },
679
+ radialMeasurements: {
680
+ description: "Distance from board center to each ring boundary",
681
+ innerBullRadius: 6.35,
682
+ outerBullRadius: 15.9,
683
+ trebleRingInnerEdge: 99,
684
+ trebleRingOuterEdge: 107,
685
+ doubleRingInnerEdge: 162,
686
+ doubleRingOuterEdge: 170
687
+ },
688
+ ringWidths: {
689
+ trebleRing: 8,
690
+ doubleRing: 8,
691
+ outerBull: 9.55,
692
+ smallSingleBed: 83.1,
693
+ largeSingleBed: 55
694
+ },
695
+ segmentAreas: {
696
+ description: "Area of a single 1/20th segment of each ring, in sq mm",
697
+ doubleBull: 126.45,
698
+ singleBull: 665.16,
699
+ trebleBed: 309.03,
700
+ doubleBed: 498.71,
701
+ smallSingle: 1481.93,
702
+ largeSingle: 2288.38
703
+ },
704
+ totalRingAreas: {
705
+ description: "Total area of each full ring (all 20 segments combined), in sq mm",
706
+ doubleBull: 126.45,
707
+ singleBull: 665.16,
708
+ trebleRing: 5174.18,
709
+ doubleRing: 8341.92,
710
+ smallSingleRing: 29638.6,
711
+ largeSingleRing: 45767.6
712
+ },
713
+ segmentAreaRatios: {
714
+ description: "Size of each segment relative to other segments",
715
+ doubleBedVsTrebleBed: 1.61,
716
+ largeSingleVsTrebleBed: 7.41,
717
+ largeSingleVsDoubleBed: 4.59,
718
+ smallSingleVsTrebleBed: 4.8,
719
+ smallSingleVsDoubleBed: 2.97,
720
+ singleBullVsDoubleBull: 5.26,
721
+ doubleBedVsDoubleBull: 3.94,
722
+ trebleBedVsDoubleBull: 2.44
723
+ },
724
+ boardVariation: {
725
+ description: "Measured treble/double widths across popular competition boards (mm). Variation comes from differing wire/blade thickness.",
726
+ boards: {
727
+ bullsAdvantage501: { treble: 9.9, double: 9.65, bull: 12.9 },
728
+ unicornEclipseHD2: { treble: 9.68, double: 9.53, bull: 11.64 },
729
+ winmauBlade5: { treble: 9.42, double: 9.16, bull: 12.33 },
730
+ missionSamurai: { treble: 9.7 },
731
+ one80Gladiator3: { treble: 9.22, double: 9.26 },
732
+ shotBanditPlus: { treble: 9.09, double: 9.2 }
733
+ }
734
+ }
735
+ };
736
+
737
+ // src/recommend.ts
738
+ function buildTargets2() {
739
+ const targets = [];
740
+ for (let i = 1; i <= 20; i++) {
741
+ targets.push({ label: `${i}`, value: i });
742
+ targets.push({ label: `D${i}`, value: i * 2 });
743
+ targets.push({ label: `T${i}`, value: i * 3 });
744
+ }
745
+ targets.push({ label: "25", value: 25 });
746
+ targets.push({ label: "Bull", value: 50 });
747
+ return targets;
748
+ }
749
+ function buildFinishingDoubles2() {
750
+ const doubles = [];
751
+ for (let i = 1; i <= 20; i++) {
752
+ doubles.push({ label: `D${i}`, value: i * 2 });
753
+ }
754
+ doubles.push({ label: "Bull", value: 50 });
755
+ return doubles;
756
+ }
757
+ var allTargets = buildTargets2();
758
+ var finishingDoubles = buildFinishingDoubles2();
759
+ var AREA = {
760
+ treble: dartboard_dimensions_default.segmentAreas.trebleBed,
761
+ double: dartboard_dimensions_default.segmentAreas.doubleBed,
762
+ largeSingle: dartboard_dimensions_default.segmentAreas.largeSingle,
763
+ smallSingle: dartboard_dimensions_default.segmentAreas.smallSingle,
764
+ bull: dartboard_dimensions_default.segmentAreas.doubleBull,
765
+ outerBull: dartboard_dimensions_default.segmentAreas.singleBull
766
+ };
767
+ var oneDartScores = new Set(allTargets.map((t) => t.value));
768
+ function missWeight(target, missType) {
769
+ const parsed = parseTarget(target);
770
+ if (!parsed) return 0.5;
771
+ if (missType === "radialIn") {
772
+ if (!parsed.bed || parsed.bed === null) return AREA.treble / AREA.largeSingle;
773
+ if (parsed.bed === "double") return 1;
774
+ if (parsed.bed === "treble") return 1;
775
+ return 0.5;
776
+ }
777
+ if (missType === "radialOut") {
778
+ if (!parsed.bed || parsed.bed === null) return AREA.double / AREA.largeSingle;
779
+ if (parsed.bed === "double") return 0.5;
780
+ if (parsed.bed === "treble") return 1;
781
+ return 0.5;
782
+ }
783
+ return 0.7;
784
+ }
785
+ function evaluatePath(score, darts, outMode, checkableScores) {
786
+ let penalty = 0;
787
+ let remaining = score;
788
+ const isDoubleOut = outMode === "double";
789
+ for (let i = 0; i < darts.length; i++) {
790
+ const dart = darts[i];
791
+ const parsed = parseTarget(dart);
792
+ if (!parsed) return Infinity;
793
+ const evaluation = evaluateThrow(dart, remaining);
794
+ if (!evaluation) return Infinity;
795
+ for (const miss of evaluation.misses) {
796
+ const weight = missWeight(dart, miss.missType);
797
+ if (miss.busts) {
798
+ penalty += 6 * weight;
799
+ } else if (isDoubleOut) {
800
+ const missRemaining = remaining - miss.value;
801
+ if (missRemaining === 1) {
802
+ penalty += 6 * weight;
803
+ } else if (missRemaining === 0) {
804
+ } else if (checkableScores && checkableScores.has(missRemaining)) {
805
+ penalty -= 0.5 * weight;
806
+ }
807
+ } else {
808
+ const missRemaining = remaining - miss.value;
809
+ if (missRemaining === 0) {
810
+ penalty -= 1 * weight;
811
+ } else if (missRemaining > 0 && oneDartScores.has(missRemaining)) {
812
+ penalty -= 0.5 * weight;
813
+ }
814
+ }
815
+ }
816
+ let targetArea;
817
+ if (parsed.bed === "treble") targetArea = AREA.treble;
818
+ else if (parsed.bed === "double") targetArea = AREA.double;
819
+ else if (dart === "Bull") targetArea = AREA.bull;
820
+ else if (dart === "25") targetArea = AREA.outerBull;
821
+ else targetArea = AREA.largeSingle;
822
+ penalty += (1 - targetArea / AREA.largeSingle) * 5.5;
823
+ if ((parsed.bed === "treble" || parsed.bed === "double") && parsed.value <= 20) {
824
+ penalty += 5;
825
+ }
826
+ if (i > 0) {
827
+ const difficulty = (d) => {
828
+ if (/^T\d+$/.test(d)) return 3;
829
+ if (d === "Bull") return 2;
830
+ if (/^D\d+$/.test(d)) return 1.5;
831
+ if (d === "25") return 1;
832
+ return 0;
833
+ };
834
+ const prev = difficulty(darts[i - 1]);
835
+ const curr = difficulty(dart);
836
+ if (curr > prev && (parsed.bed === "treble" || dart === "Bull")) {
837
+ penalty += 4;
838
+ }
839
+ }
840
+ remaining -= parsed.value;
841
+ }
842
+ const lastDart = darts[darts.length - 1];
843
+ const lastMatch = lastDart.match(/^D(\d+)$/);
844
+ if (lastMatch) {
845
+ let val = parseInt(lastMatch[1]);
846
+ let chainLen = 0;
847
+ while (val % 2 === 0) {
848
+ val /= 2;
849
+ chainLen++;
850
+ }
851
+ chainLen++;
852
+ penalty -= chainLen * 0.2;
853
+ }
854
+ return penalty;
855
+ }
856
+ function sortTrebles(darts) {
857
+ const sorted = [...darts];
858
+ for (let i = 0; i < sorted.length - 1; i++) {
859
+ const m1 = sorted[i].match(/^T(\d+)$/);
860
+ const m2 = sorted[i + 1].match(/^T(\d+)$/);
861
+ if (m1 && m2 && parseInt(m1[1]) < parseInt(m2[1])) {
862
+ [sorted[i], sorted[i + 1]] = [sorted[i + 1], sorted[i]];
863
+ }
864
+ }
865
+ return sorted;
866
+ }
867
+ function pathKey(darts) {
868
+ return [...darts].sort().join(",");
869
+ }
870
+ var SINGLE_OUT_OVERRIDES = {
871
+ 1: { darts: ["1"] },
872
+ 2: { darts: ["2"] },
873
+ 3: { darts: ["3"] },
874
+ 4: { darts: ["4"] },
875
+ 5: { darts: ["5"] },
876
+ 6: { darts: ["6"] },
877
+ 7: { darts: ["7"] },
878
+ 8: { darts: ["8"] },
879
+ 9: { darts: ["9"] },
880
+ 10: { darts: ["10"] },
881
+ 11: { darts: ["11"] },
882
+ 12: { darts: ["12"] },
883
+ 13: { darts: ["13"] },
884
+ 14: { darts: ["14"] },
885
+ 15: { darts: ["15"] },
886
+ 16: { darts: ["16"] },
887
+ 17: { darts: ["17"] },
888
+ 18: { darts: ["18"] },
889
+ 19: { darts: ["19"] },
890
+ 20: { darts: ["20"] },
891
+ 21: { darts: ["7", "14"] },
892
+ 23: { darts: ["3", "20"] },
893
+ 25: { darts: ["9", "16"] },
894
+ 27: { darts: ["9", "18"] },
895
+ 29: { darts: ["9", "20"] },
896
+ 31: { darts: ["12", "19"] },
897
+ 33: { darts: ["14", "19"] },
898
+ 35: { darts: ["15", "20"] },
899
+ 37: { darts: ["18", "19"] },
900
+ 39: { darts: ["19", "20"] },
901
+ 50: { darts: ["10", "D20"] },
902
+ 80: { darts: ["T20", "20"] },
903
+ 82: { darts: ["T14", "D20"] },
904
+ 92: { darts: ["T20", "D16"] },
905
+ 100: { darts: ["T20", "D20"] },
906
+ 103: { darts: ["T19", "6", "D20"] },
907
+ 147: { darts: ["T20", "T17", "D18"] }
908
+ };
909
+ function findBestCheckout(score, outMode, altThreshold, includeAlternates, overrides) {
910
+ const isDoubleOut = outMode === "double";
911
+ const finishing = isDoubleOut ? finishingDoubles : allTargets;
912
+ let best = null;
913
+ let bestPenalty = Infinity;
914
+ let bestNumDarts = Infinity;
915
+ for (const t of finishing) {
916
+ if (t.value !== score) continue;
917
+ const parsed = parseTarget(t.label);
918
+ const priority = !isDoubleOut && parsed?.bed === "treble" && score <= 40 ? 2 : 1;
919
+ const penalty = evaluatePath(score, [t.label], outMode);
920
+ if (priority < bestNumDarts || priority === bestNumDarts && penalty < bestPenalty) {
921
+ best = [t.label];
922
+ bestPenalty = penalty;
923
+ bestNumDarts = priority;
924
+ }
925
+ }
926
+ for (const d1 of allTargets) {
927
+ if (d1.value >= score) continue;
928
+ const remainder = score - d1.value;
929
+ for (const d2 of finishing) {
930
+ if (d2.value !== remainder) continue;
931
+ const path = [d1.label, d2.label];
932
+ const penalty = evaluatePath(score, path, outMode);
933
+ if (2 < bestNumDarts || 2 === bestNumDarts && penalty < bestPenalty) {
934
+ best = path;
935
+ bestPenalty = penalty;
936
+ bestNumDarts = 2;
937
+ }
938
+ }
939
+ }
940
+ if (bestNumDarts > 2 || score > 110) {
941
+ for (const d1 of allTargets) {
942
+ if (d1.value >= score) continue;
943
+ for (const d2 of allTargets) {
944
+ if (d1.value + d2.value >= score) continue;
945
+ const remainder = score - d1.value - d2.value;
946
+ for (const d3 of finishing) {
947
+ if (d3.value !== remainder) continue;
948
+ const path = [d1.label, d2.label, d3.label];
949
+ const penalty = evaluatePath(score, path, outMode);
950
+ if (3 < bestNumDarts || 3 === bestNumDarts && penalty < bestPenalty) {
951
+ best = path;
952
+ bestPenalty = penalty;
953
+ bestNumDarts = 3;
954
+ }
955
+ }
956
+ }
957
+ }
958
+ }
959
+ if (!best) return null;
960
+ best = sortTrebles(best);
961
+ if (!includeAlternates) {
962
+ return { darts: best, numDarts: best.length, penalty: bestPenalty, alternates: [] };
963
+ }
964
+ const alternates = [];
965
+ const seen = /* @__PURE__ */ new Set();
966
+ seen.add(pathKey(best));
967
+ const collectAlt = (path, penalty) => {
968
+ if (penalty > bestPenalty + altThreshold) return;
969
+ const key = pathKey(path);
970
+ if (seen.has(key)) return;
971
+ seen.add(key);
972
+ alternates.push({ darts: sortTrebles(path), penalty });
973
+ };
974
+ if (bestNumDarts === 1) {
975
+ for (const t of finishing) {
976
+ if (t.value !== score) continue;
977
+ collectAlt([t.label], evaluatePath(score, [t.label], outMode));
978
+ }
979
+ }
980
+ if (bestNumDarts <= 2) {
981
+ for (const d1 of allTargets) {
982
+ if (d1.value >= score) continue;
983
+ const remainder = score - d1.value;
984
+ for (const d2 of finishing) {
985
+ if (d2.value !== remainder) continue;
986
+ collectAlt([d1.label, d2.label], evaluatePath(score, [d1.label, d2.label], outMode));
987
+ }
988
+ }
989
+ }
990
+ if (bestNumDarts === 3) {
991
+ for (const d1 of allTargets) {
992
+ if (d1.value >= score) continue;
993
+ for (const d2 of allTargets) {
994
+ if (d1.value + d2.value >= score) continue;
995
+ const remainder = score - d1.value - d2.value;
996
+ for (const d3 of finishing) {
997
+ if (d3.value !== remainder) continue;
998
+ collectAlt(
999
+ [d1.label, d2.label, d3.label],
1000
+ evaluatePath(score, [d1.label, d2.label, d3.label], outMode)
1001
+ );
1002
+ }
1003
+ }
1004
+ }
1005
+ }
1006
+ alternates.sort((a, b) => a.penalty - b.penalty);
1007
+ return {
1008
+ darts: best,
1009
+ numDarts: best.length,
1010
+ penalty: bestPenalty,
1011
+ alternates: alternates.slice(0, 5).map((a) => a.darts)
1012
+ };
1013
+ }
1014
+ function validateOverrides(overrides, outMode) {
1015
+ const isDoubleOut = outMode === "double";
1016
+ for (const [scoreStr, entry] of Object.entries(overrides)) {
1017
+ const score = Number(scoreStr);
1018
+ if (!Array.isArray(entry.darts) || entry.darts.length === 0 || entry.darts.length > 3) {
1019
+ throw new OutsChartError(
1020
+ "INVALID_OVERRIDE",
1021
+ `Override for score ${score}: must have 1-3 darts`
1022
+ );
1023
+ }
1024
+ let sum = 0;
1025
+ for (const dart of entry.darts) {
1026
+ const parsed = parseTarget(dart);
1027
+ if (!parsed) {
1028
+ throw new OutsChartError(
1029
+ "INVALID_OVERRIDE",
1030
+ `Override for score ${score}: invalid dart notation '${dart}'`
1031
+ );
1032
+ }
1033
+ sum += parsed.value;
1034
+ }
1035
+ if (sum !== score) {
1036
+ throw new OutsChartError(
1037
+ "INVALID_OVERRIDE",
1038
+ `Override for score ${score}: darts sum to ${sum}, expected ${score}`
1039
+ );
1040
+ }
1041
+ const lastDart = entry.darts[entry.darts.length - 1];
1042
+ const lastParsed = parseTarget(lastDart);
1043
+ if (isDoubleOut && lastParsed.bed !== "double" && lastParsed.bed !== "Bull") {
1044
+ throw new OutsChartError(
1045
+ "INVALID_OVERRIDE",
1046
+ `Override for score ${score}: last dart '${lastDart}' is not a valid double-out finish`
1047
+ );
1048
+ }
1049
+ }
1050
+ }
1051
+ function generateRecommended(options) {
1052
+ const { outMode } = options;
1053
+ const isDoubleOut = outMode === "double";
1054
+ const min = options.min ?? (isDoubleOut ? 2 : 1);
1055
+ const max = options.max ?? (isDoubleOut ? 170 : 180);
1056
+ const includeAlternates = options.includeAlternates ?? outMode === "single";
1057
+ const altThreshold = options.altThreshold ?? 1;
1058
+ const overrides = {};
1059
+ if (!isDoubleOut) {
1060
+ Object.assign(overrides, SINGLE_OUT_OVERRIDES);
1061
+ }
1062
+ if (options.overrides) {
1063
+ validateOverrides(options.overrides, outMode);
1064
+ Object.assign(overrides, options.overrides);
1065
+ }
1066
+ const checkouts = {};
1067
+ const bogeyNumbers = [];
1068
+ for (let score = min; score <= max; score++) {
1069
+ const result = findBestCheckout(score, outMode, altThreshold, includeAlternates, overrides);
1070
+ if (overrides[score]) {
1071
+ const ov = overrides[score];
1072
+ checkouts[score] = {
1073
+ darts: ov.darts,
1074
+ numDarts: ov.darts.length
1075
+ };
1076
+ if (includeAlternates && result && result.alternates.length > 0 && ov.darts.length > 1) {
1077
+ const overrideKey = pathKey(ov.darts);
1078
+ const alts = result.alternates.filter((a) => pathKey(a) !== overrideKey);
1079
+ if (pathKey(result.darts) !== overrideKey) {
1080
+ alts.unshift(result.darts);
1081
+ }
1082
+ if (alts.length > 0) checkouts[score].alternates = alts;
1083
+ }
1084
+ continue;
1085
+ }
1086
+ if (result) {
1087
+ checkouts[score] = {
1088
+ darts: result.darts,
1089
+ numDarts: result.numDarts
1090
+ };
1091
+ if (includeAlternates && result.alternates.length > 0) {
1092
+ checkouts[score].alternates = result.alternates;
1093
+ }
1094
+ } else {
1095
+ bogeyNumbers.push(score);
1096
+ }
1097
+ }
1098
+ return { checkouts, bogeyNumbers };
1099
+ }
1100
+
1101
+ // src/filter.ts
1102
+ function normalizeTargetLabel(str) {
1103
+ if (str === "Bull") return "Bull";
1104
+ if (str === "25") return "25";
1105
+ const m = str.match(/^([SDT])(\d+)$/);
1106
+ if (m) {
1107
+ return m[1] === "S" ? m[2] : `${m[1]}${m[2]}`;
1108
+ }
1109
+ if (/^\d+$/.test(str)) return str;
1110
+ return str;
1111
+ }
1112
+ function filterByPreferredTargets(checkouts, preferredTargets) {
1113
+ const preferredLabels = new Set(preferredTargets.map(normalizeTargetLabel));
1114
+ const filtered = {};
1115
+ for (const [score, entry] of Object.entries(checkouts)) {
1116
+ const matching = entry.options.filter(
1117
+ (darts) => preferredLabels.has(darts[darts.length - 1])
1118
+ );
1119
+ if (matching.length > 0) {
1120
+ filtered[Number(score)] = {
1121
+ options: matching,
1122
+ count: matching.length
1123
+ };
1124
+ }
1125
+ }
1126
+ return filtered;
1127
+ }
1128
+
1129
+ // src/notation.ts
1130
+ var NOTATIONS = {
1131
+ default: { treble: "T", double: "D", single: "", bull: "Bull", outerBull: "25" },
1132
+ british: { treble: "T", double: "D", single: "S", bull: "DB", outerBull: "SB" },
1133
+ american: { treble: "T", double: "D", single: "", bull: "DB", outerBull: "SB" },
1134
+ explicit: { treble: "T", double: "D", single: "S", bull: "Bull", outerBull: "25" }
1135
+ };
1136
+ function formatDart(dart, notation) {
1137
+ const parsed = parseTarget(dart);
1138
+ if (!parsed) {
1139
+ throw new OutsChartError("INVALID_TARGET", `Cannot format invalid dart notation '${dart}'`);
1140
+ }
1141
+ if (parsed.bed === "Bull") return notation.bull;
1142
+ if (parsed.bed === "25") return notation.outerBull;
1143
+ if (parsed.bed === "treble") return `${notation.treble}${parsed.number}`;
1144
+ if (parsed.bed === "double") return `${notation.double}${parsed.number}`;
1145
+ return `${notation.single}${parsed.number}`;
1146
+ }
1147
+ function formatCheckoutChart(chart, notation) {
1148
+ const map = resolveNotation(notation);
1149
+ const result = {};
1150
+ for (const [scoreStr, entry] of Object.entries(chart)) {
1151
+ const score = Number(scoreStr);
1152
+ const formatted = {
1153
+ darts: entry.darts.map((d) => formatDart(d, map)),
1154
+ numDarts: entry.numDarts
1155
+ };
1156
+ if (entry.alternates) {
1157
+ formatted.alternates = entry.alternates.map(
1158
+ (alt) => alt.map((d) => formatDart(d, map))
1159
+ );
1160
+ }
1161
+ result[score] = formatted;
1162
+ }
1163
+ return result;
1164
+ }
1165
+ function resolveNotation(notation) {
1166
+ if (typeof notation === "string") {
1167
+ const preset = NOTATIONS[notation];
1168
+ if (!preset) {
1169
+ throw new OutsChartError(
1170
+ "INVALID_TARGET",
1171
+ `Unknown notation preset '${notation}'. Available: ${Object.keys(NOTATIONS).join(", ")}`
1172
+ );
1173
+ }
1174
+ return preset;
1175
+ }
1176
+ return notation;
1177
+ }
1178
+ // Annotate the CommonJS export names for ESM import in node:
1179
+ 0 && (module.exports = {
1180
+ NOTATIONS,
1181
+ OutsChartError,
1182
+ filterByPreferredTargets,
1183
+ formatCheckoutChart,
1184
+ formatDart,
1185
+ formatTarget,
1186
+ generateAllCheckouts,
1187
+ generateRecommended,
1188
+ getBogeyNumbers,
1189
+ getCheckout,
1190
+ getCheckoutChart,
1191
+ isCheckable,
1192
+ parseTarget
1193
+ });
1194
+ //# sourceMappingURL=index.cjs.map