PageSourceSearch

https://blddb.net/assets/js/fingeredge.js

js blddb.net collected 2026-10-06 13:14:39 UTC 19,253 bytes, 404 lines download raw bytes

1"use strict";
2
3const MOVE = [
4    "U", "U2", "U'",
5    "R", "R2", "R'",
6    "F", "F2", "F'",
7    "D", "D2", "D'",
8    "L", "L2", "L'",
9    "B", "B2", "B'",
10    "u", "u2", "u'",
11    "r", "r2", "r'",
12    "f", "f2", "f'",
13    "d", "d2", "d'",
14    "l", "l2", "l'",
15    "b", "b2", "b'",
16    "E", "E2", "E'",
17    "M", "M2", "M'",
18    "S", "S2", "S'"
19];
20const ROTATION = ["", "y", "y2", "y'", "x", "x y", "x y2", "x y'", "x2", "x2 y", "x2 y2", "x2 y'", "x'", "x' y", "x' y2", "x' y'", "z", "z y", "z y2", "z y'", "z'", "z' y", "z' y2", "z' y'"];
21const ROTATION_BASE = ["x", "y", "z"];
22const ROTATION_DICT = {
23    "x": [4, 21, 14, 19, 8, 22, 2, 18, 12, 23, 6, 17, 0, 20, 10, 16, 5, 1, 13, 9, 7, 11, 15, 3],
24    "x2": [8, 11, 10, 9, 12, 15, 14, 13, 0, 3, 2, 1, 4, 7, 6, 5, 22, 21, 20, 23, 18, 17, 16, 19],
25    "x'": [12, 17, 6, 23, 0, 16, 10, 20, 4, 19, 14, 21, 8, 18, 2, 22, 15, 11, 7, 3, 13, 1, 5, 9],
26    "y": [1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12, 17, 18, 19, 16, 21, 22, 23, 20],
27    "y2": [2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13, 18, 19, 16, 17, 22, 23, 20, 21],
28    "y'": [3, 0, 1, 2, 7, 4, 5, 6, 11, 8, 9, 10, 15, 12, 13, 14, 19, 16, 17, 18, 23, 20, 21, 22],
29    "z": [16, 5, 22, 15, 19, 9, 23, 3, 18, 13, 20, 7, 17, 1, 21, 11, 10, 6, 2, 14, 0, 4, 8, 12],
30    "z2": [10, 9, 8, 11, 14, 13, 12, 15, 2, 1, 0, 3, 6, 5, 4, 7, 20, 23, 22, 21, 16, 19, 18, 17],
31    "z'": [20, 13, 18, 7, 21, 1, 17, 11, 22, 5, 16, 15, 23, 9, 19, 3, 0, 12, 8, 4, 10, 14, 2, 6]
32};
33const MOVE_DICT = [
34    ["U", "U2", "U'", "R", "R2", "R'", "F", "F2", "F'", "D", "D2", "D'", "L", "L2", "L'", "B", "B2", "B'", "u", "u2", "u'", "r", "r2", "r'", "f", "f2", "f'", "d", "d2", "d'", "l", "l2", "l'", "b", "b2", "b'", "E", "E2", "E'", "M", "M2", "M'", "S", "S2", "S'"],
35    ["U", "U2", "U'", "B", "B2", "B'", "R", "R2", "R'", "D", "D2", "D'", "F", "F2", "F'", "L", "L2", "L'", "u", "u2", "u'", "b", "b2", "b'", "r", "r2", "r'", "d", "d2", "d'", "f", "f2", "f'", "l", "l2", "l'", "E", "E2", "E'", "S", "S2", "S'", "M'", "M2", "M"],
36    ["U", "U2", "U'", "L", "L2", "L'", "B", "B2", "B'", "D", "D2", "D'", "R", "R2", "R'", "F", "F2", "F'", "u", "u2", "u'", "l", "l2", "l'", "b", "b2", "b'", "d", "d2", "d'", "r", "r2", "r'", "f", "f2", "f'", "E", "E2", "E'", "M'", "M2", "M", "S'", "S2", "S"],
37    ["U", "U2", "U'", "F", "F2", "F'", "L", "L2", "L'", "D", "D2", "D'", "B", "B2", "B'", "R", "R2", "R'", "u", "u2", "u'", "f", "f2", "f'", "l", "l2", "l'", "d", "d2", "d'", "b", "b2", "b'", "r", "r2", "r'", "E", "E2", "E'", "S'", "S2", "S", "M", "M2", "M'"],
38    ["F", "F2", "F'", "R", "R2", "R'", "D", "D2", "D'", "B", "B2", "B'", "L", "L2", "L'", "U", "U2", "U'", "f", "f2", "f'", "r", "r2", "r'", "d", "d2", "d'", "b", "b2", "b'", "l", "l2", "l'", "u", "u2", "u'", "S'", "S2", "S", "M", "M2", "M'", "E", "E2", "E'"],
39    ["F", "F2", "F'", "U", "U2", "U'", "R", "R2", "R'", "B", "B2", "B'", "D", "D2", "D'", "L", "L2", "L'", "f", "f2", "f'", "u", "u2", "u'", "r", "r2", "r'", "b", "b2", "b'", "d", "d2", "d'", "l", "l2", "l'", "S'", "S2", "S", "E", "E2", "E'", "M'", "M2", "M"],
40    ["F", "F2", "F'", "L", "L2", "L'", "U", "U2", "U'", "B", "B2", "B'", "R", "R2", "R'", "D", "D2", "D'", "f", "f2", "f'", "l", "l2", "l'", "u", "u2", "u'", "b", "b2", "b'", "r", "r2", "r'", "d", "d2", "d'", "S'", "S2", "S", "M'", "M2", "M", "E'", "E2", "E"],
41    ["F", "F2", "F'", "D", "D2", "D'", "L", "L2", "L'", "B", "B2", "B'", "U", "U2", "U'", "R", "R2", "R'", "f", "f2", "f'", "d", "d2", "d'", "l", "l2", "l'", "b", "b2", "b'", "u", "u2", "u'", "r", "r2", "r'", "S'", "S2", "S", "E'", "E2", "E", "M", "M2", "M'"],
42    ["D", "D2", "D'", "R", "R2", "R'", "B", "B2", "B'", "U", "U2", "U'", "L", "L2", "L'", "F", "F2", "F'", "d", "d2", "d'", "r", "r2", "r'", "b", "b2", "b'", "u", "u2", "u'", "l", "l2", "l'", "f", "f2", "f'", "E'", "E2", "E", "M", "M2", "M'", "S'", "S2", "S"],
43    ["D", "D2", "D'", "F", "F2", "F'", "R", "R2", "R'", "U", "U2", "U'", "B", "B2", "B'", "L", "L2", "L'", "d", "d2", "d'", "f", "f2", "f'", "r", "r2", "r'", "u", "u2", "u'", "b", "b2", "b'", "l", "l2", "l'", "E'", "E2", "E", "S'", "S2", "S", "M'", "M2", "M"],
44    ["D", "D2", "D'", "L", "L2", "L'", "F", "F2", "F'", "U", "U2", "U'", "R", "R2", "R'", "B", "B2", "B'", "d", "d2", "d'", "l", "l2", "l'", "f", "f2", "f'", "u", "u2", "u'", "r", "r2", "r'", "b", "b2", "b'", "E'", "E2", "E", "M'", "M2", "M", "S", "S2", "S'"],
45    ["D", "D2", "D'", "B", "B2", "B'", "L", "L2", "L'", "U", "U2", "U'", "F", "F2", "F'", "R", "R2", "R'", "d", "d2", "d'", "b", "b2", "b'", "l", "l2", "l'", "u", "u2", "u'", "f", "f2", "f'", "r", "r2", "r'", "E'", "E2", "E", "S", "S2", "S'", "M", "M2", "M'"],
46    ["B", "B2", "B'", "R", "R2", "R'", "U", "U2", "U'", "F", "F2", "F'", "L", "L2", "L'", "D", "D2", "D'", "b", "b2", "b'", "r", "r2", "r'", "u", "u2", "u'", "f", "f2", "f'", "l", "l2", "l'", "d", "d2", "d'", "S", "S2", "S'", "M", "M2", "M'", "E'", "E2", "E"],
47    ["B", "B2", "B'", "D", "D2", "D'", "R", "R2", "R'", "F", "F2", "F'", "U", "U2", "U'", "L", "L2", "L'", "b", "b2", "b'", "d", "d2", "d'", "r", "r2", "r'", "f", "f2", "f'", "u", "u2", "u'", "l", "l2", "l'", "S", "S2", "S'", "E'", "E2", "E", "M'", "M2", "M"],
48    ["B", "B2", "B'", "L", "L2", "L'", "D", "D2", "D'", "F", "F2", "F'", "R", "R2", "R'", "U", "U2", "U'", "b", "b2", "b'", "l", "l2", "l'", "d", "d2", "d'", "f", "f2", "f'", "r", "r2", "r'", "u", "u2", "u'", "S", "S2", "S'", "M'", "M2", "M", "E", "E2", "E'"],
49    ["B", "B2", "B'", "U", "U2", "U'", "L", "L2", "L'", "F", "F2", "F'", "D", "D2", "D'", "R", "R2", "R'", "b", "b2", "b'", "u", "u2", "u'", "l", "l2", "l'", "f", "f2", "f'", "d", "d2", "d'", "r", "r2", "r'", "S", "S2", "S'", "E", "E2", "E'", "M", "M2", "M'"],
50    ["L", "L2", "L'", "U", "U2", "U'", "F", "F2", "F'", "R", "R2", "R'", "D", "D2", "D'", "B", "B2", "B'", "l", "l2", "l'", "u", "u2", "u'", "f", "f2", "f'", "r", "r2", "r'", "d", "d2", "d'", "b", "b2", "b'", "M'", "M2", "M", "E", "E2", "E'", "S", "S2", "S'"],
51    ["L", "L2", "L'", "B", "B2", "B'", "U", "U2", "U'", "R", "R2", "R'", "F", "F2", "F'", "D", "D2", "D'", "l", "l2", "l'", "b", "b2", "b'", "u", "u2", "u'", "r", "r2", "r'", "f", "f2", "f'", "d", "d2", "d'", "M'", "M2", "M", "S", "S2", "S'", "E'", "E2", "E"],
52    ["L", "L2", "L'", "D", "D2", "D'", "B", "B2", "B'", "R", "R2", "R'", "U", "U2", "U'", "F", "F2", "F'", "l", "l2", "l'", "d", "d2", "d'", "b", "b2", "b'", "r", "r2", "r'", "u", "u2", "u'", "f", "f2", "f'", "M'", "M2", "M", "E'", "E2", "E", "S'", "S2", "S"],
53    ["L", "L2", "L'", "F", "F2", "F'", "D", "D2", "D'", "R", "R2", "R'", "B", "B2", "B'", "U", "U2", "U'", "l", "l2", "l'", "f", "f2", "f'", "d", "d2", "d'", "r", "r2", "r'", "b", "b2", "b'", "u", "u2", "u'", "M'", "M2", "M", "S'", "S2", "S", "E", "E2", "E'"],
54    ["R", "R2", "R'", "D", "D2", "D'", "F", "F2", "F'", "L", "L2", "L'", "U", "U2", "U'", "B", "B2", "B'", "r", "r2", "r'", "d", "d2", "d'", "f", "f2", "f'", "l", "l2", "l'", "u", "u2", "u'", "b", "b2", "b'", "M", "M2", "M'", "E'", "E2", "E", "S", "S2", "S'"],
55    ["R", "R2", "R'", "B", "B2", "B'", "D", "D2", "D'", "L", "L2", "L'", "F", "F2", "F'", "U", "U2", "U'", "r", "r2", "r'", "b", "b2", "b'", "d", "d2", "d'", "l", "l2", "l'", "f", "f2", "f'", "u", "u2", "u'", "M", "M2", "M'", "S", "S2", "S'", "E", "E2", "E'"],
56    ["R", "R2", "R'", "U", "U2", "U'", "B", "B2", "B'", "L", "L2", "L'", "D", "D2", "D'", "F", "F2", "F'", "r", "r2", "r'", "u", "u2", "u'", "b", "b2", "b'", "l", "l2", "l'", "d", "d2", "d'", "f", "f2", "f'", "M", "M2", "M'", "E", "E2", "E'", "S'", "S2", "S"],
57    ["R", "R2", "R'", "F", "F2", "F'", "U", "U2", "U'", "L", "L2", "L'", "B", "B2", "B'", "D", "D2", "D'", "r", "r2", "r'", "f", "f2", "f'", "u", "u2", "u'", "l", "l2", "l'", "b", "b2", "b'", "d", "d2", "d'", "M", "M2", "M'", "S'", "S2", "S", "E'", "E2", "E"]
58];
59const ALG_REPLACE = {
60    "U": "d y",
61    "U2": "d2 y2",
62    "U'": "d' y'",
63    "R": "l x",
64    "R2": "l2 x2",
65    "R'": "l' x'",
66    "F": "b z",
67    "F2": "b2 z2",
68    "F'": "b' z'",
69    "D": "u y'",
70    "D2": "u2 y2",
71    "D'": "u' y",
72    "L": "r x'",
73    "L2": "r2 x2",
74    "L'": "r' x",
75    "B": "f z'",
76    "B2": "f2 z2",
77    "B'": "f' z",
78    "u": "D y",
79    "u2": "D2 y2",
80    "u'": "D' y'",
81    "r": "L x",
82    "r2": "L2 x2",
83    "r'": "L' x'",
84    "f": "B z",
85    "f2": "B2 z2",
86    "f'": "B' z'",
87    "d": "U y'",
88    "d2": "U2 y2",
89    "d'": "U' y",
90    "l": "R x'",
91    "l2": "R2 x2",
92    "l'": "R' x",
93    "b": "F z'",
94    "b2": "F2 z2",
95    "b'": "F' z",
96    "E": "U D' y'",
97    "E2": "U2 D2 y2",
98    "E'": "U' D y",
99    "M": "L' R x'",
100    "M2": "L2 R2 x2",
101    "M'": "L R' x",
102    "S": "F' B z",
103    "S2": "F2 B2 z2",
104    "S'": "F B' z'"
105};
106
107function rewrite(alg, ALG_ALLOWED) {
108    function processMove(res, rotationIndex) {
109        let rotationIndexOut = rotationIndex;
110        for (let i = 0; i < res.length; i++) {
111            if (ROTATION_BASE.includes(res[i][0]) && !ALG_ALLOWED.includes(res[i][0])) {
112                if (!ROTATION_DICT.hasOwnProperty(res[i])) {
113                    return -1;
114                }
115                rotationIndexOut = ROTATION_DICT[res[i]][rotationIndexOut];
116            } else if (ROTATION_BASE.includes(res[i][0]) && ALG_ALLOWED.includes(res[i][0])) {
117                out.push(res[i]);
118            } else {
119                if (MOVE.indexOf(res[i]) === -1) {
120                    return -1;
121                }
122                const moveNew = MOVE_DICT[rotationIndexOut][MOVE.indexOf(res[i])];
123                if (!ALG_ALLOWED.includes(moveNew[0]) && ALG_REPLACE.hasOwnProperty(res[i])) {
124                    const moveReplaceList = ALG_REPLACE[res[i]].split(" ");
125                    rotationIndexOut = processMove(moveReplaceList, rotationIndexOut);
126                } else {
127                    out.push(moveNew);
128                }
129            }
130        }
131        return rotationIndexOut;
132    }
133    const res = arrayToStr(algToArray(alg)).split(" ");
134    for (let i = 0; i < res.length; i++) {
135        if (res[i][0] === "y" || res[i][0] === "z") {
136            return arrayToStr(algToArray(res.join(" ")));
137        }
138    }
139    let rotationIndex = 0;
140    const out = [];
141    rotationIndex = processMove(res, rotationIndex);
142    if (rotationIndex === -1) {
143        return "";
144    }
145    if (ROTATION[rotationIndex] === "") {
146        return arrayToStr(algToArray(out.join(" ")));
147    }
148    return arrayToStr(algToArray("".concat(out.join(" "), " ").concat(ROTATION[rotationIndex])));
149}
150
151function single(alg) {
152    return rewrite(alg, ["U", "R", "F", "D", "L", "B", "E", "M", "S", "y", "z"]);
153}
154
155function righty(alg) {
156    return rewrite(alg, ["R", "r", "U", "d", "D", "u", "F", "b", "B", "f", "E", "M", "S"]);
157}
158
159function finger(s1, position) {
160    // R' F R' S' R F R' S R F2 R
161    // if (fingerback(s1, position) > 5) {
162    //     return 0;
163    // }
164    let fingerposition = position;
165    const arr = s1.split(" ");
166    for (let i = 0; i <= arr.length - 1; i++) {
167        if (i > 0 && arr[i][0] === "E") {
168            if (arr[i - 1] === "U2") {
169                return 0;
170            }
171            if (arr[i - 1][0] === "U" && arr[i] === "E2") {
172                return 0;
173            }
174        }
175        if (i < arr.length - 1 && arr[i][0] === "E") {
176            if (arr[i + 1][0] === "D") {
177                return 0;
178            }
179        }
180        if (i > 0 && arr[i][0] === "S") {
181            if (arr[i - 1] === "F2") {
182                return 0;
183            }
184        }
185        if (i < arr.length - 1 && arr[i][0] === "S") {
186            if (arr[i + 1][0] === "B") {
187                return 0;
188            }
189        }
190        if (i > 0 && arr[i] === "S2") {
191            if (arr[i - 1][0] === "F") {
192                return 0;
193            }
194        }
195        if (i < arr.length - 1 && arr[i] === "S2") {
196            if (arr[i + 1][0] === "B") {
197                return 0;
198            }
199        }
200        if (i > 0 && arr[i][0] === "B") {
201            if (arr[i - 1][0] === "F") {
202                if (arr[i - 1] === "F2" || arr[i] === "B2") {
203                    return 0;
204                }
205            }
206        }
207        if (i > 0 && arr[i][0] === "D") {
208            if (arr[i - 1][0] === "u") {
209                return 0;
210            }
211        }
212        // U E R S' R' U' R S R' E'
213        if (i > 0 && arr[i][0] === "E") {
214            if (arr[i - 1][0] === "U") {
215                if (fingerposition !== 2) {
216                    return 0;
217                }
218            }
219        }
220        if (i > 0 && i < arr.length - 1) {
221            if (arr[i][0] === "E" || arr[i][0] === "M" || arr[i][0] === "S") {
222                if (arr[i - 1][0] === "E" || arr[i - 1][0] === "M" || arr[i - 1][0] === "S") {
223                    if (arr[i + 1][0] === "E" || arr[i + 1][0] === "M" || arr[i + 1][0] === "S") {
224                        return 0;
225                    }
226                }
227            }
228        }
229        if (fingerposition === 4 && (arr[i][0] === "B" || arr[i][0] === "F" || arr[i] === "D2" || arr[i] === "S2" || arr[i] === "M2")) {
230            return 0;
231        }
232        if (fingerposition === 2 && (arr[i][0] === "B" || arr[i] === "F2" || arr[i] === "S2" || arr[i] === "E2")) {
233            return 0;
234        }
235        // R U2 R2 F' R S R' F R S' R U2 R'
236        if (fingerposition === 1 && arr[i] === "B2") {
237            return 0;
238        }
239        if (fingerposition === 0 && (arr[i][0] === "B" || arr[i][0] === "F" || arr[i] === "D2" || arr[i] === "S2" || arr[i] === "M2")) {
240            return 0;
241        }
242        if (arr[i] === "R" || arr[i] === "r") {
243            fingerposition = fingerposition + 1;
244        }
245        if (arr[i] === "R'" || arr[i] === "r'") {
246            fingerposition = fingerposition - 1;
247        }
248        if (arr[i] === "R2" || arr[i] === "r2") {
249            if (fingerposition === 2) {
250                fingerposition = 0;
251                for (let j = i + 1; j <= arr.length - 1; j++) {
252                    if (arr[j] === "R" || arr[j] === "r" || arr[j] === "R2" || arr[j] === "r2") {
253                        fingerposition = 0;
254                        break;
255                    }
256                    if (arr[j] === "R'" || arr[j] === "r'") {
257                        fingerposition = 4;
258                        break;
259                    }
260                }
261            } else {
262                fingerposition = (fingerposition + 2) % 4;
263            }
264        }
265        if (fingerposition === 5 || fingerposition === -1) {
266            return 0;
267        }
268    }
269    if (fingerposition === 4 || fingerposition === 0) {
270        return 0;
271    }
272    return 1;
273}
274
275function fingerpain(s1, position) {
276    let pain = 0;
277    let fingerposition = position;
278    const arr = s1.split(" ");
279    pain = pain + Math.min(Math.floor(fingerback(s1, position) / 2), 2);
280    for (let i = 0; i <= arr.length - 1; i++) {
281        if (fingerposition === 4 && (arr[i] === "U2" || arr[i][0] === "M" || arr[i][0] === "E")) {
282            pain = pain + 1;
283        }
284        if (fingerposition === 3 && (arr[i] === "U2" || arr[i][0] === "M")) {
285            pain = pain + 1;
286        }
287        if (fingerposition === 2 && (arr[i][0] === "E" || arr[i][0] === "F")) {
288            pain = pain + 1;
289        }
290        if (fingerposition === 1 && (arr[i] === "U2" || arr[i][0] === "M")) {
291            pain = pain + 1;
292        }
293        if (fingerposition === 0 && (arr[i] === "U2" || arr[i][0] === "M" || arr[i][0] === "E")) {
294            pain = pain + 1;
295        }
296        if (fingerposition === 3 && arr[i] === "F2") {
297            pain = pain + 1;
298        }
299        if (arr[i] === "R" || arr[i] === "r") {
300            fingerposition = fingerposition + 1;
301        }
302        if (arr[i] === "R'" || arr[i] === "r'") {
303            fingerposition = fingerposition - 1;
304        }
305        if (arr[i] === "R2" || arr[i] === "r2") {
306            if (fingerposition === 2) {
307                fingerposition = 0;
308                for (let j = i + 1; j <= arr.length - 1; j++) {
309                    if (arr[j] === "R" || arr[j] === "r" || arr[j] === "R2" || arr[j] === "r2") {
310                        fingerposition = 0;
311                        break;
312                    }
313                    if (arr[j] === "R'" || arr[j] === "r'") {
314                        fingerposition = 4;
315                        break;
316                    }
317                }
318            } else {
319                fingerposition = (fingerposition + 2) % 4;
320            }
321        }
322    }
323    return pain;
324}
325
326function fingerback(s1, position) {
327    let fingerposition = position;
328    const arr = s1.split(" ");
329    let sum = 0;
330    for (let i = 0; i <= arr.length - 1; i++) {
331        if (arr[i] === "R" || arr[i] === "r") {
332            fingerposition = fingerposition + 1;
333        }
334        if (arr[i] === "R'" || arr[i] === "r'") {
335            fingerposition = fingerposition - 1;
336        }
337        if (arr[i] === "R2" || arr[i] === "r2") {
338            if (fingerposition === 2) {
339                fingerposition = 0;
340                for (let j = i + 1; j <= arr.length - 1; j++) {
341                    if (arr[j] === "R" || arr[j] === "r" || arr[j] === "R2" || arr[j] === "r2") {
342                        fingerposition = 0;
343                        break;
344                    }
345                    if (arr[j] === "R'" || arr[j] === "r'") {
346                        fingerposition = 4;
347                        break;
348                    }
349                }
350            } else {
351                fingerposition = (fingerposition + 2) % 4;
352            }
353        }
354        if (fingerposition === 0 || fingerposition === 4) {
355            // U R' U' S R2 S' R2 U R U'
356            let isBad = true;
357            if (i > 0) {
358                if ((arr[i - 1] === "S" || arr[i - 1] === "S'") && (arr[i] === "R2" || arr[i] === "r2") || (arr[i] === "S" || arr[i] === "S'") && (arr[i - 1] === "R2" || arr[i - 1] === "r2")) {
359                    isBad = false;
360                }
361            }
362            if (i < arr.length - 1) {
363                if ((arr[i + 1] === "S" || arr[i + 1] === "S'") && (arr[i] === "R2" || arr[i] === "r2") || (arr[i] === "S" || arr[i] === "S'") && (arr[i + 1] === "R2" || arr[i + 1] === "r2")) {
364                    isBad = false;
365                }
366            }
367            if (isBad) {
368                sum = sum + 1;
369            }
370        }
371    }
372    return sum;
373}
374
375
376function fingerbeginfrom(s1) {
377    if (s1 === "") {
378        return "";
379    }
380    const s1Righty = righty(s1);
381    let fingerbegin = "",
382        count = 0;
383    for (let i = 0; i <= 10; i++) {
384        if (finger(s1Righty, 2) === 1 && (fingerpain(s1Righty, 2) === i || fingerpain(s1Righty, 2) === i + 1)) {
385            count = count + 1;
386            fingerbegin = `${fingerbegin}${arrLang[lang]["homegrip"]}/`;
387        }
388        if (finger(s1Righty, 1) === 1 && fingerpain(s1Righty, 1) === i) {
389            count = count + 1;
390            fingerbegin = `${fingerbegin}${arrLang[lang]["thumbdown"]}/`;
391        }
392        if (finger(s1Righty, 3) === 1 && fingerpain(s1Righty, 3) === i) {
393            count = count + 1;
394            fingerbegin = `${fingerbegin}${arrLang[lang]["thumbup"]}/`;
395        }
396        if (fingerbegin.length > 0) {
397            break;
398        }
399    }
400    if (count === 3) {
401        return `${arrLang[lang]["homegrip"]}`;
402    }
403    return fingerbegin.substring(0, fingerbegin.length - 1);
404}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.