From 13187831241856dd0fba6005e734b51f0823f5ac Mon Sep 17 00:00:00 2001 From: bytedream Date: Wed, 26 Mar 2025 01:25:16 +0100 Subject: [PATCH 01/14] Update action badge template to match shields layout --- templates/shared/actions/runner_badge.tmpl | 34 ++++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/templates/shared/actions/runner_badge.tmpl b/templates/shared/actions/runner_badge.tmpl index 816e87e177a32..bbace44f6bcf8 100644 --- a/templates/shared/actions/runner_badge.tmpl +++ b/templates/shared/actions/runner_badge.tmpl @@ -1,25 +1,27 @@ - {{.Badge.Label.Text}}: {{.Badge.Message.Text}} - - - - + + - + - - - + + + + + + + {{.Badge.Label.Text}} + + {{.Badge.Message.Text}} - {{.Badge.Label.Text}}{{.Badge.Message.Text}} From ea71a32158d8ad1b5417fe91fd55961a42f1f9b1 Mon Sep 17 00:00:00 2001 From: bytedream Date: Wed, 26 Mar 2025 01:25:58 +0100 Subject: [PATCH 02/14] Update action badge font spacing --- build/generate-font-width.go | 123 + modules/badge/badge.go | 79 +- modules/badge/badge_font_width.go | 5599 +++++++++++++++++++++++++++++ 3 files changed, 5759 insertions(+), 42 deletions(-) create mode 100644 build/generate-font-width.go create mode 100644 modules/badge/badge_font_width.go diff --git a/build/generate-font-width.go b/build/generate-font-width.go new file mode 100644 index 0000000000000..564ab98dbd1b5 --- /dev/null +++ b/build/generate-font-width.go @@ -0,0 +1,123 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//go:build ignore + +package main + +import ( + "archive/zip" + "bytes" + "flag" + "fmt" + "go/format" + "io" + "log" + "net/http" + "os" + "strings" + "unicode" + + "golang.org/x/image/font" + "golang.org/x/image/font/sfnt" +) + +const dejavuZip = "https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip" + +var flagOut = flag.String("o", "modules/badge/badge_font_width.go", "out") + +func main() { + flag.Parse() + + ttfFont := extractFont() + + str := "map[rune]int32{\n" + for r := rune(0); r <= unicode.MaxRune; r++ { + if !unicode.IsPrint(r) { + continue + } + + glyphIndex, err := ttfFont.GlyphIndex(nil, r) + if err != nil { + log.Fatalf("Failed to find glyph for rune %s: %v", string(r), err) + } else if glyphIndex == 0 { + continue + } + + advancedWidth, err := ttfFont.GlyphAdvance(nil, glyphIndex, 11, font.HintingNone) + if err != nil { + log.Fatalf("Failed to find font width for rune %s: %v", string(r), err) + } else if advancedWidth == 0 { + continue + } + + str += fmt.Sprintf("\t%d: %d,\n", r, advancedWidth) + } + str += "}" + + data, err := format.Source([]byte(str)) + if err != nil { + log.Fatalf("Failed to format generated code: %v", err) + } + + err = os.WriteFile(*flagOut, []byte(fmt.Sprintf(hdr, dejavuZip, data)), 0o644) + if err != nil { + log.Fatalf("Failed to write file: %v", err) + } +} + +func extractFont() *sfnt.Font { + resp, err := http.Get(dejavuZip) + if err != nil { + log.Fatalf("Failed to download archive: %v", err) + } + defer resp.Body.Close() + + buf, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatalf("Failed to read download archive: %v", err) + } + + bufReader := io.NewSectionReader(bytes.NewReader(buf), 0, int64(len(buf))) + + archive, err := zip.NewReader(bufReader, int64(len(buf))) + if err != nil { + log.Fatalf("Failed to unzip archive: %v", err) + } + + var fontBytes []byte + for _, file := range archive.File { + if strings.HasSuffix(file.Name, ".ttf") { + ttfFile, err := file.Open() + if err != nil { + log.Fatalf("Failed to extract font from archive: %v", err) + } + + if fontBytes, err = io.ReadAll(ttfFile); err != nil { + log.Fatalf("Failed to extract font from archive: %v", err) + } + + break + } + } + if fontBytes == nil { + log.Fatalf("Failed to find font in archive") + } + + font, err := sfnt.Parse(fontBytes) + if err != nil { + log.Fatalf("Failed to parse font: %v", err) + } + + return font +} + +const hdr = `// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package badge + +// Code generated by build/generate-font-width.go. DO NOT EDIT. +// Sourced from %s +var DejaVuFontWidthData = %s +` diff --git a/modules/badge/badge.go b/modules/badge/badge.go index b30d0b472945f..60ce1d5f07c71 100644 --- a/modules/badge/badge.go +++ b/modules/badge/badge.go @@ -11,54 +11,33 @@ import ( // We use 10x scale to calculate more precisely // Then scale down to normal size in tmpl file -type Label struct { - text string - width int -} - -func (l Label) Text() string { - return l.text -} - -func (l Label) Width() int { - return l.width -} - -func (l Label) TextLength() int { - return int(float64(l.width-defaultOffset) * 9.5) -} - -func (l Label) X() int { - return l.width*5 + 10 -} - -type Message struct { +type Text struct { text string width int x int } -func (m Message) Text() string { - return m.text +func (t Text) Text() string { + return t.text } -func (m Message) Width() int { - return m.width +func (t Text) Width() int { + return t.width } -func (m Message) X() int { - return m.x +func (t Text) X() int { + return t.x } -func (m Message) TextLength() int { - return int(float64(m.width-defaultOffset) * 9.5) +func (t Text) TextLength() int { + return int(float64(t.width-defaultOffset) * 10) } type Badge struct { Color string FontSize int - Label Label - Message Message + Label Text + Message Text } func (b Badge) Width() int { @@ -66,10 +45,9 @@ func (b Badge) Width() int { } const ( - defaultOffset = 9 - defaultFontSize = 11 - DefaultColor = "#9f9f9f" // Grey - defaultFontWidth = 7 // approximate speculation + defaultOffset = 10 + defaultFontSize = 11 + DefaultColor = "#9f9f9f" // Grey ) var StatusColorMap = map[actions_model.Status]string{ @@ -85,20 +63,37 @@ var StatusColorMap = map[actions_model.Status]string{ // GenerateBadge generates badge with given template func GenerateBadge(label, message, color string) Badge { - lw := defaultFontWidth*len(label) + defaultOffset - mw := defaultFontWidth*len(message) + defaultOffset - x := lw*10 + mw*5 - 10 + lw := calculateTextWidth(label) + defaultOffset + mw := calculateTextWidth(message) + defaultOffset + + lx := lw * 5 + mx := lw*10 + mw*5 - 10 return Badge{ - Label: Label{ + Label: Text{ text: label, width: lw, + x: lx, }, - Message: Message{ + Message: Text{ text: message, width: mw, - x: x, + x: mx, }, FontSize: defaultFontSize * 10, Color: color, } } + +func calculateTextWidth(text string) int { + width := 0 + + for _, char := range text { + charWidth, ok := DejaVuFontWidthData[char] + if !ok { + charWidth = 0 + } + width += int(charWidth) + } + + return width +} diff --git a/modules/badge/badge_font_width.go b/modules/badge/badge_font_width.go new file mode 100644 index 0000000000000..456d80684e018 --- /dev/null +++ b/modules/badge/badge_font_width.go @@ -0,0 +1,5599 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package badge + +// Code generated by build/generate-font-width.go. DO NOT EDIT. +// Sourced from https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip +var DejaVuFontWidthData = map[rune]int32{ + 32: 3, + 33: 4, + 34: 5, + 35: 9, + 36: 7, + 37: 10, + 38: 9, + 39: 3, + 40: 4, + 41: 4, + 42: 6, + 43: 9, + 44: 3, + 45: 4, + 46: 3, + 47: 4, + 48: 7, + 49: 7, + 50: 7, + 51: 7, + 52: 7, + 53: 7, + 54: 7, + 55: 7, + 56: 7, + 57: 7, + 58: 4, + 59: 4, + 60: 9, + 61: 9, + 62: 9, + 63: 6, + 64: 11, + 65: 8, + 66: 8, + 67: 8, + 68: 8, + 69: 7, + 70: 6, + 71: 9, + 72: 8, + 73: 3, + 74: 3, + 75: 7, + 76: 6, + 77: 9, + 78: 8, + 79: 9, + 80: 7, + 81: 9, + 82: 8, + 83: 7, + 84: 7, + 85: 8, + 86: 8, + 87: 11, + 88: 8, + 89: 7, + 90: 8, + 91: 4, + 92: 4, + 93: 4, + 94: 9, + 95: 6, + 96: 6, + 97: 7, + 98: 7, + 99: 6, + 100: 7, + 101: 7, + 102: 4, + 103: 7, + 104: 7, + 105: 3, + 106: 3, + 107: 6, + 108: 3, + 109: 11, + 110: 7, + 111: 7, + 112: 7, + 113: 7, + 114: 5, + 115: 6, + 116: 4, + 117: 7, + 118: 7, + 119: 9, + 120: 7, + 121: 7, + 122: 6, + 123: 7, + 124: 4, + 125: 7, + 126: 9, + 161: 4, + 162: 7, + 163: 7, + 164: 7, + 165: 7, + 166: 4, + 167: 6, + 168: 6, + 169: 11, + 170: 5, + 171: 7, + 172: 9, + 174: 11, + 175: 6, + 176: 6, + 177: 9, + 178: 4, + 179: 4, + 180: 6, + 181: 7, + 182: 7, + 183: 3, + 184: 6, + 185: 4, + 186: 5, + 187: 7, + 188: 11, + 189: 11, + 190: 11, + 191: 6, + 192: 8, + 193: 8, + 194: 8, + 195: 8, + 196: 8, + 197: 8, + 198: 11, + 199: 8, + 200: 7, + 201: 7, + 202: 7, + 203: 7, + 204: 3, + 205: 3, + 206: 3, + 207: 3, + 208: 9, + 209: 8, + 210: 9, + 211: 9, + 212: 9, + 213: 9, + 214: 9, + 215: 9, + 216: 9, + 217: 8, + 218: 8, + 219: 8, + 220: 8, + 221: 7, + 222: 7, + 223: 7, + 224: 7, + 225: 7, + 226: 7, + 227: 7, + 228: 7, + 229: 7, + 230: 11, + 231: 6, + 232: 7, + 233: 7, + 234: 7, + 235: 7, + 236: 3, + 237: 3, + 238: 3, + 239: 3, + 240: 7, + 241: 7, + 242: 7, + 243: 7, + 244: 7, + 245: 7, + 246: 7, + 247: 9, + 248: 7, + 249: 7, + 250: 7, + 251: 7, + 252: 7, + 253: 7, + 254: 7, + 255: 7, + 256: 8, + 257: 7, + 258: 8, + 259: 7, + 260: 8, + 261: 7, + 262: 8, + 263: 6, + 264: 8, + 265: 6, + 266: 8, + 267: 6, + 268: 8, + 269: 6, + 270: 8, + 271: 7, + 272: 9, + 273: 7, + 274: 7, + 275: 7, + 276: 7, + 277: 7, + 278: 7, + 279: 7, + 280: 7, + 281: 7, + 282: 7, + 283: 7, + 284: 9, + 285: 7, + 286: 9, + 287: 7, + 288: 9, + 289: 7, + 290: 9, + 291: 7, + 292: 8, + 293: 7, + 294: 10, + 295: 8, + 296: 3, + 297: 3, + 298: 3, + 299: 3, + 300: 3, + 301: 3, + 302: 3, + 303: 3, + 304: 3, + 305: 3, + 306: 6, + 307: 6, + 308: 3, + 309: 3, + 310: 7, + 311: 6, + 312: 6, + 313: 6, + 314: 3, + 315: 6, + 316: 3, + 317: 6, + 318: 4, + 319: 6, + 320: 4, + 321: 6, + 322: 3, + 323: 8, + 324: 7, + 325: 8, + 326: 7, + 327: 8, + 328: 7, + 329: 9, + 330: 8, + 331: 7, + 332: 9, + 333: 7, + 334: 9, + 335: 7, + 336: 9, + 337: 7, + 338: 12, + 339: 11, + 340: 8, + 341: 5, + 342: 8, + 343: 5, + 344: 8, + 345: 5, + 346: 7, + 347: 6, + 348: 7, + 349: 6, + 350: 7, + 351: 6, + 352: 7, + 353: 6, + 354: 7, + 355: 4, + 356: 7, + 357: 4, + 358: 7, + 359: 4, + 360: 8, + 361: 7, + 362: 8, + 363: 7, + 364: 8, + 365: 7, + 366: 8, + 367: 7, + 368: 8, + 369: 7, + 370: 8, + 371: 7, + 372: 11, + 373: 9, + 374: 7, + 375: 7, + 376: 7, + 377: 8, + 378: 6, + 379: 8, + 380: 6, + 381: 8, + 382: 6, + 383: 4, + 384: 7, + 385: 8, + 386: 8, + 387: 7, + 388: 8, + 389: 7, + 390: 8, + 391: 8, + 392: 6, + 393: 9, + 394: 9, + 395: 8, + 396: 7, + 397: 7, + 398: 7, + 399: 9, + 400: 7, + 401: 6, + 402: 4, + 403: 9, + 404: 8, + 405: 11, + 406: 4, + 407: 3, + 408: 8, + 409: 6, + 410: 3, + 411: 7, + 412: 11, + 413: 8, + 414: 7, + 415: 9, + 416: 10, + 417: 7, + 418: 10, + 419: 8, + 420: 7, + 421: 7, + 422: 8, + 423: 7, + 424: 6, + 425: 7, + 426: 4, + 427: 4, + 428: 7, + 429: 4, + 430: 7, + 431: 9, + 432: 7, + 433: 8, + 434: 8, + 435: 8, + 436: 8, + 437: 8, + 438: 6, + 439: 7, + 440: 7, + 441: 6, + 442: 6, + 443: 7, + 444: 7, + 445: 6, + 446: 6, + 447: 7, + 448: 3, + 449: 5, + 450: 5, + 451: 3, + 452: 16, + 453: 14, + 454: 13, + 455: 9, + 456: 9, + 457: 5, + 458: 10, + 459: 10, + 460: 9, + 461: 8, + 462: 7, + 463: 3, + 464: 3, + 465: 9, + 466: 7, + 467: 8, + 468: 7, + 469: 8, + 470: 7, + 471: 8, + 472: 7, + 473: 8, + 474: 7, + 475: 8, + 476: 7, + 477: 7, + 478: 8, + 479: 7, + 480: 8, + 481: 7, + 482: 11, + 483: 11, + 484: 9, + 485: 7, + 486: 9, + 487: 7, + 488: 7, + 489: 6, + 490: 9, + 491: 7, + 492: 9, + 493: 7, + 494: 7, + 495: 6, + 496: 3, + 497: 16, + 498: 14, + 499: 13, + 500: 9, + 501: 7, + 502: 12, + 503: 8, + 504: 8, + 505: 7, + 506: 8, + 507: 7, + 508: 11, + 509: 11, + 510: 9, + 511: 7, + 512: 8, + 513: 7, + 514: 8, + 515: 7, + 516: 7, + 517: 7, + 518: 7, + 519: 7, + 520: 3, + 521: 3, + 522: 3, + 523: 3, + 524: 9, + 525: 7, + 526: 9, + 527: 7, + 528: 8, + 529: 5, + 530: 8, + 531: 5, + 532: 8, + 533: 7, + 534: 8, + 535: 7, + 536: 7, + 537: 6, + 538: 7, + 539: 4, + 540: 7, + 541: 6, + 542: 8, + 543: 7, + 544: 8, + 545: 9, + 546: 8, + 547: 7, + 548: 8, + 549: 6, + 550: 8, + 551: 7, + 552: 7, + 553: 7, + 554: 9, + 555: 7, + 556: 9, + 557: 7, + 558: 9, + 559: 7, + 560: 9, + 561: 7, + 562: 7, + 563: 7, + 564: 5, + 565: 9, + 566: 5, + 567: 3, + 568: 11, + 569: 11, + 570: 8, + 571: 8, + 572: 6, + 573: 6, + 574: 7, + 575: 6, + 576: 6, + 577: 7, + 578: 5, + 579: 8, + 580: 8, + 581: 8, + 582: 7, + 583: 7, + 584: 3, + 585: 3, + 586: 9, + 587: 7, + 588: 8, + 589: 5, + 590: 7, + 591: 7, + 592: 7, + 593: 7, + 594: 7, + 595: 7, + 596: 6, + 597: 6, + 598: 7, + 599: 8, + 600: 7, + 601: 7, + 602: 9, + 603: 6, + 604: 6, + 605: 9, + 606: 7, + 607: 3, + 608: 8, + 609: 7, + 610: 7, + 611: 7, + 612: 7, + 613: 7, + 614: 7, + 615: 7, + 616: 3, + 617: 4, + 618: 4, + 619: 4, + 620: 5, + 621: 3, + 622: 8, + 623: 11, + 624: 11, + 625: 11, + 626: 7, + 627: 7, + 628: 7, + 629: 7, + 630: 9, + 631: 8, + 632: 7, + 633: 5, + 634: 5, + 635: 5, + 636: 5, + 637: 5, + 638: 6, + 639: 6, + 640: 7, + 641: 7, + 642: 6, + 643: 4, + 644: 4, + 645: 5, + 646: 4, + 647: 4, + 648: 4, + 649: 7, + 650: 7, + 651: 7, + 652: 7, + 653: 9, + 654: 7, + 655: 7, + 656: 6, + 657: 6, + 658: 6, + 659: 6, + 660: 6, + 661: 6, + 662: 6, + 663: 6, + 664: 9, + 665: 6, + 666: 7, + 667: 8, + 668: 7, + 669: 3, + 670: 7, + 671: 6, + 672: 8, + 673: 6, + 674: 6, + 675: 11, + 676: 12, + 677: 11, + 678: 9, + 679: 7, + 680: 9, + 681: 9, + 682: 8, + 683: 7, + 684: 6, + 685: 6, + 686: 7, + 687: 7, + 688: 4, + 689: 4, + 690: 2, + 691: 3, + 692: 3, + 693: 3, + 694: 4, + 695: 6, + 696: 4, + 697: 3, + 698: 5, + 699: 3, + 700: 3, + 701: 3, + 702: 3, + 703: 3, + 704: 4, + 705: 4, + 706: 6, + 707: 6, + 708: 6, + 709: 6, + 710: 6, + 711: 6, + 712: 3, + 713: 6, + 714: 6, + 715: 6, + 716: 3, + 717: 6, + 718: 6, + 719: 6, + 720: 4, + 721: 4, + 722: 3, + 723: 3, + 724: 6, + 725: 6, + 726: 4, + 727: 3, + 728: 6, + 729: 6, + 730: 6, + 731: 6, + 732: 6, + 733: 6, + 734: 3, + 735: 6, + 736: 5, + 737: 2, + 738: 4, + 739: 5, + 740: 4, + 741: 5, + 742: 5, + 743: 5, + 744: 5, + 745: 5, + 748: 6, + 749: 6, + 750: 6, + 755: 6, + 759: 6, + 880: 7, + 881: 6, + 882: 9, + 883: 7, + 884: 3, + 885: 3, + 886: 8, + 887: 7, + 890: 6, + 891: 6, + 892: 6, + 893: 6, + 894: 4, + 895: 3, + 900: 6, + 901: 6, + 902: 8, + 903: 3, + 904: 8, + 905: 10, + 906: 4, + 908: 9, + 910: 9, + 911: 9, + 912: 4, + 913: 8, + 914: 8, + 915: 6, + 916: 8, + 917: 7, + 918: 8, + 919: 8, + 920: 9, + 921: 3, + 922: 7, + 923: 8, + 924: 9, + 925: 8, + 926: 7, + 927: 9, + 928: 8, + 929: 7, + 931: 7, + 932: 7, + 933: 7, + 934: 9, + 935: 8, + 936: 9, + 937: 8, + 938: 3, + 939: 7, + 940: 7, + 941: 6, + 942: 7, + 943: 4, + 944: 6, + 945: 7, + 946: 7, + 947: 7, + 948: 7, + 949: 6, + 950: 6, + 951: 7, + 952: 7, + 953: 4, + 954: 6, + 955: 7, + 956: 7, + 957: 6, + 958: 6, + 959: 7, + 960: 7, + 961: 7, + 962: 6, + 963: 7, + 964: 7, + 965: 6, + 966: 7, + 967: 6, + 968: 7, + 969: 9, + 970: 4, + 971: 6, + 972: 7, + 973: 6, + 974: 9, + 975: 7, + 976: 7, + 977: 7, + 978: 8, + 979: 9, + 980: 8, + 981: 7, + 982: 9, + 983: 7, + 984: 9, + 985: 7, + 986: 7, + 987: 6, + 988: 6, + 989: 5, + 990: 7, + 991: 7, + 992: 10, + 993: 7, + 994: 10, + 995: 9, + 996: 8, + 997: 7, + 998: 9, + 999: 7, + 1000: 8, + 1001: 7, + 1002: 8, + 1003: 7, + 1004: 8, + 1005: 7, + 1006: 7, + 1007: 6, + 1008: 7, + 1009: 7, + 1010: 6, + 1011: 3, + 1012: 9, + 1013: 7, + 1014: 7, + 1015: 7, + 1016: 7, + 1017: 8, + 1018: 9, + 1019: 7, + 1020: 7, + 1021: 8, + 1022: 8, + 1023: 8, + 1024: 7, + 1025: 7, + 1026: 9, + 1027: 7, + 1028: 8, + 1029: 7, + 1030: 3, + 1031: 3, + 1032: 3, + 1033: 12, + 1034: 11, + 1035: 9, + 1036: 8, + 1037: 8, + 1038: 7, + 1039: 8, + 1040: 8, + 1041: 8, + 1042: 8, + 1043: 7, + 1044: 9, + 1045: 7, + 1046: 12, + 1047: 7, + 1048: 8, + 1049: 8, + 1050: 8, + 1051: 8, + 1052: 9, + 1053: 8, + 1054: 9, + 1055: 8, + 1056: 7, + 1057: 8, + 1058: 7, + 1059: 7, + 1060: 9, + 1061: 8, + 1062: 9, + 1063: 8, + 1064: 12, + 1065: 12, + 1066: 9, + 1067: 10, + 1068: 8, + 1069: 8, + 1070: 12, + 1071: 8, + 1072: 7, + 1073: 7, + 1074: 6, + 1075: 6, + 1076: 8, + 1077: 7, + 1078: 10, + 1079: 6, + 1080: 7, + 1081: 7, + 1082: 7, + 1083: 7, + 1084: 8, + 1085: 7, + 1086: 7, + 1087: 7, + 1088: 7, + 1089: 6, + 1090: 6, + 1091: 7, + 1092: 9, + 1093: 7, + 1094: 7, + 1095: 6, + 1096: 10, + 1097: 10, + 1098: 8, + 1099: 9, + 1100: 6, + 1101: 6, + 1102: 9, + 1103: 7, + 1104: 7, + 1105: 7, + 1106: 7, + 1107: 6, + 1108: 6, + 1109: 6, + 1110: 3, + 1111: 3, + 1112: 3, + 1113: 10, + 1114: 10, + 1115: 7, + 1116: 7, + 1117: 7, + 1118: 7, + 1119: 7, + 1120: 10, + 1121: 9, + 1122: 8, + 1123: 7, + 1124: 10, + 1125: 8, + 1126: 10, + 1127: 9, + 1128: 13, + 1129: 11, + 1130: 9, + 1131: 7, + 1132: 11, + 1133: 9, + 1134: 7, + 1135: 6, + 1136: 9, + 1137: 10, + 1138: 9, + 1139: 7, + 1140: 9, + 1141: 7, + 1142: 9, + 1143: 7, + 1144: 11, + 1145: 10, + 1146: 10, + 1147: 8, + 1148: 13, + 1149: 11, + 1150: 10, + 1151: 9, + 1152: 8, + 1153: 6, + 1154: 6, + 1160: 5, + 1161: 5, + 1162: 8, + 1163: 7, + 1164: 8, + 1165: 6, + 1166: 7, + 1167: 7, + 1168: 7, + 1169: 6, + 1170: 7, + 1171: 6, + 1172: 7, + 1173: 6, + 1174: 12, + 1175: 10, + 1176: 7, + 1177: 6, + 1178: 8, + 1179: 7, + 1180: 8, + 1181: 7, + 1182: 8, + 1183: 7, + 1184: 9, + 1185: 9, + 1186: 8, + 1187: 7, + 1188: 11, + 1189: 10, + 1190: 12, + 1191: 10, + 1192: 10, + 1193: 8, + 1194: 8, + 1195: 6, + 1196: 7, + 1197: 6, + 1198: 7, + 1199: 7, + 1200: 7, + 1201: 7, + 1202: 8, + 1203: 7, + 1204: 10, + 1205: 9, + 1206: 8, + 1207: 6, + 1208: 8, + 1209: 6, + 1210: 8, + 1211: 7, + 1212: 10, + 1213: 8, + 1214: 10, + 1215: 8, + 1216: 3, + 1217: 12, + 1218: 10, + 1219: 7, + 1220: 7, + 1221: 9, + 1222: 7, + 1223: 8, + 1224: 7, + 1225: 9, + 1226: 7, + 1227: 8, + 1228: 6, + 1229: 10, + 1230: 9, + 1231: 3, + 1232: 8, + 1233: 7, + 1234: 8, + 1235: 7, + 1236: 11, + 1237: 11, + 1238: 7, + 1239: 7, + 1240: 9, + 1241: 7, + 1242: 9, + 1243: 7, + 1244: 12, + 1245: 10, + 1246: 7, + 1247: 6, + 1248: 7, + 1249: 6, + 1250: 8, + 1251: 7, + 1252: 8, + 1253: 7, + 1254: 9, + 1255: 7, + 1256: 9, + 1257: 7, + 1258: 9, + 1259: 7, + 1260: 8, + 1261: 6, + 1262: 7, + 1263: 7, + 1264: 7, + 1265: 7, + 1266: 7, + 1267: 7, + 1268: 8, + 1269: 6, + 1270: 7, + 1271: 6, + 1272: 10, + 1273: 9, + 1274: 7, + 1275: 6, + 1276: 8, + 1277: 7, + 1278: 8, + 1279: 7, + 1280: 8, + 1281: 6, + 1282: 11, + 1283: 10, + 1284: 11, + 1285: 10, + 1286: 7, + 1287: 6, + 1288: 12, + 1289: 11, + 1290: 12, + 1291: 11, + 1292: 9, + 1293: 7, + 1294: 9, + 1295: 8, + 1296: 7, + 1297: 6, + 1298: 8, + 1299: 7, + 1300: 13, + 1301: 11, + 1302: 10, + 1303: 10, + 1304: 11, + 1305: 11, + 1306: 9, + 1307: 7, + 1308: 11, + 1309: 9, + 1310: 8, + 1311: 7, + 1312: 12, + 1313: 10, + 1314: 12, + 1315: 10, + 1316: 9, + 1317: 8, + 1329: 8, + 1330: 8, + 1331: 8, + 1332: 8, + 1333: 8, + 1334: 8, + 1335: 7, + 1336: 8, + 1337: 9, + 1338: 8, + 1339: 8, + 1340: 6, + 1341: 10, + 1342: 9, + 1343: 8, + 1344: 8, + 1345: 8, + 1346: 8, + 1347: 8, + 1348: 9, + 1349: 8, + 1350: 8, + 1351: 8, + 1352: 8, + 1353: 8, + 1354: 9, + 1355: 8, + 1356: 9, + 1357: 8, + 1358: 8, + 1359: 8, + 1360: 8, + 1361: 8, + 1362: 6, + 1363: 9, + 1364: 8, + 1365: 9, + 1366: 9, + 1369: 3, + 1370: 3, + 1371: 3, + 1372: 4, + 1373: 3, + 1374: 4, + 1375: 6, + 1377: 11, + 1378: 7, + 1379: 7, + 1380: 7, + 1381: 7, + 1382: 7, + 1383: 6, + 1384: 7, + 1385: 8, + 1386: 7, + 1387: 7, + 1388: 3, + 1389: 11, + 1390: 7, + 1391: 7, + 1392: 7, + 1393: 7, + 1394: 7, + 1395: 7, + 1396: 7, + 1397: 3, + 1398: 7, + 1399: 5, + 1400: 7, + 1401: 4, + 1402: 11, + 1403: 6, + 1404: 7, + 1405: 7, + 1406: 7, + 1407: 11, + 1408: 7, + 1409: 7, + 1410: 5, + 1411: 11, + 1412: 7, + 1413: 7, + 1414: 9, + 1415: 9, + 1417: 4, + 1418: 4, + 1470: 4, + 1472: 3, + 1475: 3, + 1478: 5, + 1488: 7, + 1489: 6, + 1490: 5, + 1491: 6, + 1492: 7, + 1493: 3, + 1494: 4, + 1495: 7, + 1496: 7, + 1497: 2, + 1498: 6, + 1499: 6, + 1500: 6, + 1501: 7, + 1502: 7, + 1503: 3, + 1504: 4, + 1505: 7, + 1506: 7, + 1507: 7, + 1508: 7, + 1509: 6, + 1510: 7, + 1511: 8, + 1512: 6, + 1513: 8, + 1514: 7, + 1520: 5, + 1521: 5, + 1522: 4, + 1523: 5, + 1524: 7, + 1542: 7, + 1543: 7, + 1545: 8, + 1546: 11, + 1548: 4, + 1563: 3, + 1567: 6, + 1569: 5, + 1570: 3, + 1571: 3, + 1572: 5, + 1573: 3, + 1574: 9, + 1575: 3, + 1576: 10, + 1577: 6, + 1578: 10, + 1579: 10, + 1580: 7, + 1581: 7, + 1582: 7, + 1583: 5, + 1584: 5, + 1585: 5, + 1586: 5, + 1587: 13, + 1588: 13, + 1589: 13, + 1590: 13, + 1591: 10, + 1592: 10, + 1593: 7, + 1594: 7, + 1600: 3, + 1601: 11, + 1602: 9, + 1603: 9, + 1604: 8, + 1605: 7, + 1606: 8, + 1607: 6, + 1608: 5, + 1609: 9, + 1610: 9, + 1626: 6, + 1632: 6, + 1633: 6, + 1634: 6, + 1635: 6, + 1636: 6, + 1637: 6, + 1638: 6, + 1639: 6, + 1640: 6, + 1641: 6, + 1642: 6, + 1643: 4, + 1644: 3, + 1645: 6, + 1646: 10, + 1647: 9, + 1652: 3, + 1657: 10, + 1658: 10, + 1659: 10, + 1660: 10, + 1661: 10, + 1662: 10, + 1663: 10, + 1664: 10, + 1665: 7, + 1666: 7, + 1667: 7, + 1668: 7, + 1669: 7, + 1670: 7, + 1671: 7, + 1672: 5, + 1673: 5, + 1674: 5, + 1675: 5, + 1676: 5, + 1677: 5, + 1678: 5, + 1679: 5, + 1680: 5, + 1681: 5, + 1682: 5, + 1683: 5, + 1684: 6, + 1685: 7, + 1686: 6, + 1687: 5, + 1688: 5, + 1689: 5, + 1690: 13, + 1691: 13, + 1692: 13, + 1693: 13, + 1694: 13, + 1695: 10, + 1696: 7, + 1697: 11, + 1698: 11, + 1699: 11, + 1700: 11, + 1701: 11, + 1702: 11, + 1703: 9, + 1704: 9, + 1705: 10, + 1706: 12, + 1707: 10, + 1708: 9, + 1709: 9, + 1710: 9, + 1711: 10, + 1712: 10, + 1713: 10, + 1714: 10, + 1715: 10, + 1716: 10, + 1717: 8, + 1718: 8, + 1719: 8, + 1720: 8, + 1721: 8, + 1722: 8, + 1723: 8, + 1724: 8, + 1725: 8, + 1726: 8, + 1727: 7, + 1734: 5, + 1735: 5, + 1736: 5, + 1739: 5, + 1740: 9, + 1742: 9, + 1744: 9, + 1749: 6, + 1776: 6, + 1777: 6, + 1778: 6, + 1779: 6, + 1780: 6, + 1781: 6, + 1782: 6, + 1783: 6, + 1784: 6, + 1785: 6, + 1984: 7, + 1985: 7, + 1986: 7, + 1987: 7, + 1988: 7, + 1989: 7, + 1990: 7, + 1991: 7, + 1992: 7, + 1993: 7, + 1994: 3, + 1995: 6, + 1996: 5, + 1997: 7, + 1998: 7, + 1999: 7, + 2000: 7, + 2001: 7, + 2002: 9, + 2003: 5, + 2004: 5, + 2005: 6, + 2006: 7, + 2007: 4, + 2008: 11, + 2009: 5, + 2010: 9, + 2011: 7, + 2012: 7, + 2013: 8, + 2014: 6, + 2015: 8, + 2016: 5, + 2017: 7, + 2018: 7, + 2019: 6, + 2020: 6, + 2021: 6, + 2022: 7, + 2023: 7, + 2036: 3, + 2037: 3, + 2040: 6, + 2041: 6, + 2042: 4, + 3647: 7, + 3713: 7, + 3714: 8, + 3716: 8, + 3719: 5, + 3720: 7, + 3722: 8, + 3725: 8, + 3732: 7, + 3733: 7, + 3734: 7, + 3735: 7, + 3737: 7, + 3738: 7, + 3739: 7, + 3740: 8, + 3741: 8, + 3742: 8, + 3743: 8, + 3745: 8, + 3746: 8, + 3747: 8, + 3749: 7, + 3751: 7, + 3754: 8, + 3755: 9, + 3757: 7, + 3758: 8, + 3759: 9, + 3760: 7, + 3762: 6, + 3763: 6, + 3773: 7, + 3776: 4, + 3777: 7, + 3778: 5, + 3779: 6, + 3780: 5, + 3782: 7, + 3792: 7, + 3793: 7, + 3794: 7, + 3795: 7, + 3796: 7, + 3797: 7, + 3798: 8, + 3799: 7, + 3800: 7, + 3801: 7, + 3804: 11, + 3805: 11, + 4256: 10, + 4257: 8, + 4258: 7, + 4259: 9, + 4260: 7, + 4261: 8, + 4262: 8, + 4263: 10, + 4264: 5, + 4265: 7, + 4266: 9, + 4267: 10, + 4268: 7, + 4269: 9, + 4270: 9, + 4271: 7, + 4272: 10, + 4273: 7, + 4274: 7, + 4275: 9, + 4276: 10, + 4277: 8, + 4278: 7, + 4279: 7, + 4280: 7, + 4281: 7, + 4282: 9, + 4283: 10, + 4284: 7, + 4285: 7, + 4286: 7, + 4287: 8, + 4288: 9, + 4289: 7, + 4290: 8, + 4291: 7, + 4292: 7, + 4293: 8, + 4304: 6, + 4305: 6, + 4306: 6, + 4307: 9, + 4308: 6, + 4309: 6, + 4310: 6, + 4311: 9, + 4312: 6, + 4313: 6, + 4314: 12, + 4315: 6, + 4316: 6, + 4317: 9, + 4318: 6, + 4319: 6, + 4320: 9, + 4321: 6, + 4322: 7, + 4323: 6, + 4324: 9, + 4325: 6, + 4326: 9, + 4327: 6, + 4328: 6, + 4329: 6, + 4330: 6, + 4331: 6, + 4332: 6, + 4333: 6, + 4334: 6, + 4335: 5, + 4336: 6, + 4337: 6, + 4338: 6, + 4339: 6, + 4340: 6, + 4341: 6, + 4342: 9, + 4343: 6, + 4344: 6, + 4345: 6, + 4346: 6, + 4347: 5, + 4348: 4, + 5121: 8, + 5122: 8, + 5123: 8, + 5124: 8, + 5125: 8, + 5126: 8, + 5127: 8, + 5129: 8, + 5130: 8, + 5131: 8, + 5132: 9, + 5133: 9, + 5134: 9, + 5135: 9, + 5136: 9, + 5137: 9, + 5138: 11, + 5139: 11, + 5140: 11, + 5141: 11, + 5142: 8, + 5143: 11, + 5144: 11, + 5145: 11, + 5146: 11, + 5147: 8, + 5149: 3, + 5150: 6, + 5151: 5, + 5152: 5, + 5153: 4, + 5154: 4, + 5155: 4, + 5156: 4, + 5157: 5, + 5158: 4, + 5159: 3, + 5160: 4, + 5161: 4, + 5162: 4, + 5163: 12, + 5164: 10, + 5165: 10, + 5166: 12, + 5167: 8, + 5168: 8, + 5169: 8, + 5170: 8, + 5171: 8, + 5172: 8, + 5173: 8, + 5175: 8, + 5176: 8, + 5177: 8, + 5178: 9, + 5179: 8, + 5180: 9, + 5181: 9, + 5182: 9, + 5183: 9, + 5184: 11, + 5185: 11, + 5186: 11, + 5187: 11, + 5188: 11, + 5189: 11, + 5190: 11, + 5191: 11, + 5192: 8, + 5193: 6, + 5194: 2, + 5196: 8, + 5197: 8, + 5198: 8, + 5199: 8, + 5200: 8, + 5201: 8, + 5202: 8, + 5204: 8, + 5205: 8, + 5206: 8, + 5207: 10, + 5208: 10, + 5209: 10, + 5210: 10, + 5211: 10, + 5212: 10, + 5213: 10, + 5214: 10, + 5215: 10, + 5216: 10, + 5217: 10, + 5218: 10, + 5219: 10, + 5220: 10, + 5221: 10, + 5222: 5, + 5223: 10, + 5224: 10, + 5225: 10, + 5226: 10, + 5227: 7, + 5228: 7, + 5229: 7, + 5230: 7, + 5231: 7, + 5232: 7, + 5233: 7, + 5234: 7, + 5235: 7, + 5236: 9, + 5237: 8, + 5238: 9, + 5239: 9, + 5240: 9, + 5241: 9, + 5242: 9, + 5243: 8, + 5244: 9, + 5245: 8, + 5246: 9, + 5247: 9, + 5248: 9, + 5249: 9, + 5250: 9, + 5251: 4, + 5252: 4, + 5253: 8, + 5254: 9, + 5255: 8, + 5256: 9, + 5257: 7, + 5258: 7, + 5259: 7, + 5260: 7, + 5261: 7, + 5262: 7, + 5263: 7, + 5264: 7, + 5265: 7, + 5266: 9, + 5267: 8, + 5268: 9, + 5269: 9, + 5270: 9, + 5271: 9, + 5272: 9, + 5273: 8, + 5274: 9, + 5275: 8, + 5276: 9, + 5277: 9, + 5278: 9, + 5279: 9, + 5280: 9, + 5281: 5, + 5282: 5, + 5283: 7, + 5284: 6, + 5285: 6, + 5286: 6, + 5287: 7, + 5288: 7, + 5289: 7, + 5290: 6, + 5291: 6, + 5292: 8, + 5293: 8, + 5294: 8, + 5295: 8, + 5296: 8, + 5297: 8, + 5298: 8, + 5299: 8, + 5300: 8, + 5301: 8, + 5302: 8, + 5303: 8, + 5304: 8, + 5305: 8, + 5306: 8, + 5307: 4, + 5308: 6, + 5309: 4, + 5312: 9, + 5313: 9, + 5314: 9, + 5315: 9, + 5316: 9, + 5317: 9, + 5318: 9, + 5319: 9, + 5320: 9, + 5321: 12, + 5322: 11, + 5323: 12, + 5324: 9, + 5325: 12, + 5326: 9, + 5327: 9, + 5328: 7, + 5329: 5, + 5330: 7, + 5331: 9, + 5332: 9, + 5333: 9, + 5334: 9, + 5335: 9, + 5336: 9, + 5337: 9, + 5338: 9, + 5339: 9, + 5340: 12, + 5341: 11, + 5342: 12, + 5343: 11, + 5344: 12, + 5345: 11, + 5346: 12, + 5347: 11, + 5348: 12, + 5349: 11, + 5350: 12, + 5351: 11, + 5352: 12, + 5353: 11, + 5354: 7, + 5356: 8, + 5357: 7, + 5358: 7, + 5359: 7, + 5360: 7, + 5361: 7, + 5362: 7, + 5363: 7, + 5364: 7, + 5365: 7, + 5366: 9, + 5367: 8, + 5368: 9, + 5369: 8, + 5370: 9, + 5371: 8, + 5372: 9, + 5373: 8, + 5374: 9, + 5375: 8, + 5376: 9, + 5377: 8, + 5378: 9, + 5379: 8, + 5380: 9, + 5381: 5, + 5382: 5, + 5383: 5, + 5392: 8, + 5393: 8, + 5394: 8, + 5395: 10, + 5396: 10, + 5397: 10, + 5398: 10, + 5399: 10, + 5400: 10, + 5401: 10, + 5402: 10, + 5403: 10, + 5404: 10, + 5405: 13, + 5406: 12, + 5407: 13, + 5408: 12, + 5409: 13, + 5410: 12, + 5411: 13, + 5412: 12, + 5413: 7, + 5414: 7, + 5415: 7, + 5416: 7, + 5417: 7, + 5418: 7, + 5419: 7, + 5420: 7, + 5421: 7, + 5422: 7, + 5423: 9, + 5424: 9, + 5425: 9, + 5426: 9, + 5427: 9, + 5428: 9, + 5429: 9, + 5430: 9, + 5431: 9, + 5432: 9, + 5433: 9, + 5434: 9, + 5435: 9, + 5436: 9, + 5437: 9, + 5438: 5, + 5440: 4, + 5441: 5, + 5442: 10, + 5443: 10, + 5444: 10, + 5445: 10, + 5446: 10, + 5447: 10, + 5448: 7, + 5449: 7, + 5450: 7, + 5451: 7, + 5452: 7, + 5453: 7, + 5454: 9, + 5455: 8, + 5456: 5, + 5458: 8, + 5459: 8, + 5460: 8, + 5461: 8, + 5462: 8, + 5463: 8, + 5464: 8, + 5465: 8, + 5466: 8, + 5467: 10, + 5468: 11, + 5469: 6, + 5470: 8, + 5471: 8, + 5472: 8, + 5473: 8, + 5474: 8, + 5475: 8, + 5476: 8, + 5477: 8, + 5478: 8, + 5479: 8, + 5480: 10, + 5481: 10, + 5482: 6, + 5492: 9, + 5493: 9, + 5494: 9, + 5495: 9, + 5496: 9, + 5497: 9, + 5498: 9, + 5499: 6, + 5500: 8, + 5501: 5, + 5502: 12, + 5503: 12, + 5504: 12, + 5505: 12, + 5506: 12, + 5507: 12, + 5508: 12, + 5509: 9, + 5514: 9, + 5515: 9, + 5516: 9, + 5517: 9, + 5518: 14, + 5519: 14, + 5520: 14, + 5521: 11, + 5522: 11, + 5523: 14, + 5524: 14, + 5525: 8, + 5526: 12, + 5536: 9, + 5537: 9, + 5538: 9, + 5539: 9, + 5540: 9, + 5541: 9, + 5542: 7, + 5543: 7, + 5544: 7, + 5545: 7, + 5546: 7, + 5547: 7, + 5548: 7, + 5549: 7, + 5550: 5, + 5551: 7, + 5598: 8, + 5601: 8, + 5702: 5, + 5703: 5, + 5742: 5, + 5743: 12, + 5744: 14, + 5745: 18, + 5746: 18, + 5747: 15, + 5748: 15, + 5749: 18, + 5750: 18, + 5761: 5, + 5762: 8, + 5763: 10, + 5764: 13, + 5765: 15, + 5766: 5, + 5767: 8, + 5768: 10, + 5769: 13, + 5770: 15, + 5771: 5, + 5772: 8, + 5773: 10, + 5774: 13, + 5775: 15, + 5776: 5, + 5777: 8, + 5778: 10, + 5779: 13, + 5780: 15, + 5781: 5, + 5782: 8, + 5783: 9, + 5784: 13, + 5785: 13, + 5786: 8, + 5787: 6, + 5788: 6, + 7424: 7, + 7425: 8, + 7426: 11, + 7427: 6, + 7428: 6, + 7429: 7, + 7430: 7, + 7431: 5, + 7432: 6, + 7433: 3, + 7434: 4, + 7435: 6, + 7436: 6, + 7437: 8, + 7438: 7, + 7439: 7, + 7440: 6, + 7441: 8, + 7442: 8, + 7443: 8, + 7444: 11, + 7446: 7, + 7447: 7, + 7448: 6, + 7449: 7, + 7450: 7, + 7451: 6, + 7452: 6, + 7453: 8, + 7454: 10, + 7455: 7, + 7456: 7, + 7457: 9, + 7458: 6, + 7459: 6, + 7462: 6, + 7463: 7, + 7464: 6, + 7465: 6, + 7466: 6, + 7467: 7, + 7468: 5, + 7469: 7, + 7470: 5, + 7472: 5, + 7473: 4, + 7474: 4, + 7475: 5, + 7476: 5, + 7477: 2, + 7478: 2, + 7479: 5, + 7480: 4, + 7481: 6, + 7482: 5, + 7483: 5, + 7484: 5, + 7485: 5, + 7486: 4, + 7487: 5, + 7488: 4, + 7489: 5, + 7490: 7, + 7491: 4, + 7492: 4, + 7493: 4, + 7494: 7, + 7495: 5, + 7496: 4, + 7497: 5, + 7498: 5, + 7499: 4, + 7500: 4, + 7501: 4, + 7502: 2, + 7503: 5, + 7504: 7, + 7505: 4, + 7506: 5, + 7507: 4, + 7508: 5, + 7509: 5, + 7510: 5, + 7511: 3, + 7512: 4, + 7513: 5, + 7514: 7, + 7515: 5, + 7517: 4, + 7518: 4, + 7519: 4, + 7520: 5, + 7521: 4, + 7522: 2, + 7523: 3, + 7524: 4, + 7525: 5, + 7526: 4, + 7527: 4, + 7528: 5, + 7529: 5, + 7530: 4, + 7543: 7, + 7544: 5, + 7547: 4, + 7549: 7, + 7557: 3, + 7579: 4, + 7580: 4, + 7581: 4, + 7582: 5, + 7583: 4, + 7584: 3, + 7585: 3, + 7586: 4, + 7587: 4, + 7588: 3, + 7589: 3, + 7590: 3, + 7591: 3, + 7592: 3, + 7593: 3, + 7594: 3, + 7595: 4, + 7596: 7, + 7597: 7, + 7598: 5, + 7599: 5, + 7600: 4, + 7601: 5, + 7602: 5, + 7603: 4, + 7604: 3, + 7605: 3, + 7606: 6, + 7607: 5, + 7608: 4, + 7609: 4, + 7610: 5, + 7611: 4, + 7612: 5, + 7613: 4, + 7614: 4, + 7615: 5, + 7680: 8, + 7681: 7, + 7682: 8, + 7683: 7, + 7684: 8, + 7685: 7, + 7686: 8, + 7687: 7, + 7688: 8, + 7689: 6, + 7690: 8, + 7691: 7, + 7692: 8, + 7693: 7, + 7694: 8, + 7695: 7, + 7696: 8, + 7697: 7, + 7698: 8, + 7699: 7, + 7700: 7, + 7701: 7, + 7702: 7, + 7703: 7, + 7704: 7, + 7705: 7, + 7706: 7, + 7707: 7, + 7708: 7, + 7709: 7, + 7710: 6, + 7711: 4, + 7712: 9, + 7713: 7, + 7714: 8, + 7715: 7, + 7716: 8, + 7717: 7, + 7718: 8, + 7719: 7, + 7720: 8, + 7721: 7, + 7722: 8, + 7723: 7, + 7724: 3, + 7725: 3, + 7726: 3, + 7727: 3, + 7728: 7, + 7729: 6, + 7730: 7, + 7731: 6, + 7732: 7, + 7733: 6, + 7734: 6, + 7735: 3, + 7736: 6, + 7737: 3, + 7738: 6, + 7739: 3, + 7740: 6, + 7741: 3, + 7742: 9, + 7743: 11, + 7744: 9, + 7745: 11, + 7746: 9, + 7747: 11, + 7748: 8, + 7749: 7, + 7750: 8, + 7751: 7, + 7752: 8, + 7753: 7, + 7754: 8, + 7755: 7, + 7756: 9, + 7757: 7, + 7758: 9, + 7759: 7, + 7760: 9, + 7761: 7, + 7762: 9, + 7763: 7, + 7764: 7, + 7765: 7, + 7766: 7, + 7767: 7, + 7768: 8, + 7769: 5, + 7770: 8, + 7771: 5, + 7772: 8, + 7773: 5, + 7774: 8, + 7775: 5, + 7776: 7, + 7777: 6, + 7778: 7, + 7779: 6, + 7780: 7, + 7781: 6, + 7782: 7, + 7783: 6, + 7784: 7, + 7785: 6, + 7786: 7, + 7787: 4, + 7788: 7, + 7789: 4, + 7790: 7, + 7791: 4, + 7792: 7, + 7793: 4, + 7794: 8, + 7795: 7, + 7796: 8, + 7797: 7, + 7798: 8, + 7799: 7, + 7800: 8, + 7801: 7, + 7802: 8, + 7803: 7, + 7804: 8, + 7805: 7, + 7806: 8, + 7807: 7, + 7808: 11, + 7809: 9, + 7810: 11, + 7811: 9, + 7812: 11, + 7813: 9, + 7814: 11, + 7815: 9, + 7816: 11, + 7817: 9, + 7818: 8, + 7819: 7, + 7820: 8, + 7821: 7, + 7822: 7, + 7823: 7, + 7824: 8, + 7825: 6, + 7826: 8, + 7827: 6, + 7828: 8, + 7829: 6, + 7830: 7, + 7831: 4, + 7832: 9, + 7833: 7, + 7834: 7, + 7835: 4, + 7836: 4, + 7837: 4, + 7838: 8, + 7839: 7, + 7840: 8, + 7841: 7, + 7842: 8, + 7843: 7, + 7844: 8, + 7845: 7, + 7846: 8, + 7847: 7, + 7848: 8, + 7849: 7, + 7850: 8, + 7851: 7, + 7852: 8, + 7853: 7, + 7854: 8, + 7855: 7, + 7856: 8, + 7857: 7, + 7858: 8, + 7859: 7, + 7860: 8, + 7861: 7, + 7862: 8, + 7863: 7, + 7864: 7, + 7865: 7, + 7866: 7, + 7867: 7, + 7868: 7, + 7869: 7, + 7870: 7, + 7871: 7, + 7872: 7, + 7873: 7, + 7874: 7, + 7875: 7, + 7876: 7, + 7877: 7, + 7878: 7, + 7879: 7, + 7880: 3, + 7881: 3, + 7882: 3, + 7883: 3, + 7884: 9, + 7885: 7, + 7886: 9, + 7887: 7, + 7888: 9, + 7889: 7, + 7890: 9, + 7891: 7, + 7892: 9, + 7893: 7, + 7894: 9, + 7895: 7, + 7896: 9, + 7897: 7, + 7898: 10, + 7899: 7, + 7900: 10, + 7901: 7, + 7902: 10, + 7903: 7, + 7904: 10, + 7905: 7, + 7906: 10, + 7907: 7, + 7908: 8, + 7909: 7, + 7910: 8, + 7911: 7, + 7912: 9, + 7913: 7, + 7914: 9, + 7915: 7, + 7916: 9, + 7917: 7, + 7918: 9, + 7919: 7, + 7920: 9, + 7921: 7, + 7922: 7, + 7923: 7, + 7924: 7, + 7925: 7, + 7926: 7, + 7927: 7, + 7928: 7, + 7929: 7, + 7930: 8, + 7931: 5, + 7936: 7, + 7937: 7, + 7938: 7, + 7939: 7, + 7940: 7, + 7941: 7, + 7942: 7, + 7943: 7, + 7944: 8, + 7945: 8, + 7946: 10, + 7947: 10, + 7948: 8, + 7949: 9, + 7950: 8, + 7951: 8, + 7952: 6, + 7953: 6, + 7954: 6, + 7955: 6, + 7956: 6, + 7957: 6, + 7960: 8, + 7961: 8, + 7962: 11, + 7963: 11, + 7964: 10, + 7965: 10, + 7968: 7, + 7969: 7, + 7970: 7, + 7971: 7, + 7972: 7, + 7973: 7, + 7974: 7, + 7975: 7, + 7976: 9, + 7977: 9, + 7978: 12, + 7979: 12, + 7980: 11, + 7981: 12, + 7982: 10, + 7983: 10, + 7984: 4, + 7985: 4, + 7986: 4, + 7987: 4, + 7988: 4, + 7989: 4, + 7990: 4, + 7991: 4, + 7992: 4, + 7993: 4, + 7994: 7, + 7995: 7, + 7996: 6, + 7997: 7, + 7998: 5, + 7999: 5, + 8000: 7, + 8001: 7, + 8002: 7, + 8003: 7, + 8004: 7, + 8005: 7, + 8008: 9, + 8009: 9, + 8010: 12, + 8011: 12, + 8012: 10, + 8013: 11, + 8016: 6, + 8017: 6, + 8018: 6, + 8019: 6, + 8020: 6, + 8021: 6, + 8022: 6, + 8023: 6, + 8025: 9, + 8027: 11, + 8029: 11, + 8031: 10, + 8032: 9, + 8033: 9, + 8034: 9, + 8035: 9, + 8036: 9, + 8037: 9, + 8038: 9, + 8039: 9, + 8040: 9, + 8041: 9, + 8042: 12, + 8043: 12, + 8044: 10, + 8045: 11, + 8046: 10, + 8047: 10, + 8048: 7, + 8049: 7, + 8050: 6, + 8051: 6, + 8052: 7, + 8053: 7, + 8054: 4, + 8055: 4, + 8056: 7, + 8057: 7, + 8058: 6, + 8059: 6, + 8060: 9, + 8061: 9, + 8064: 7, + 8065: 7, + 8066: 7, + 8067: 7, + 8068: 7, + 8069: 7, + 8070: 7, + 8071: 7, + 8072: 8, + 8073: 8, + 8074: 10, + 8075: 10, + 8076: 8, + 8077: 9, + 8078: 8, + 8079: 8, + 8080: 7, + 8081: 7, + 8082: 7, + 8083: 7, + 8084: 7, + 8085: 7, + 8086: 7, + 8087: 7, + 8088: 9, + 8089: 9, + 8090: 12, + 8091: 12, + 8092: 11, + 8093: 12, + 8094: 10, + 8095: 10, + 8096: 9, + 8097: 9, + 8098: 9, + 8099: 9, + 8100: 9, + 8101: 9, + 8102: 9, + 8103: 9, + 8104: 9, + 8105: 9, + 8106: 12, + 8107: 12, + 8108: 10, + 8109: 11, + 8110: 10, + 8111: 10, + 8112: 7, + 8113: 7, + 8114: 7, + 8115: 7, + 8116: 7, + 8118: 7, + 8119: 7, + 8120: 8, + 8121: 8, + 8122: 8, + 8123: 8, + 8124: 8, + 8125: 6, + 8126: 6, + 8127: 6, + 8128: 6, + 8129: 6, + 8130: 7, + 8131: 7, + 8132: 7, + 8134: 7, + 8135: 7, + 8136: 9, + 8137: 8, + 8138: 10, + 8139: 10, + 8140: 8, + 8141: 6, + 8142: 6, + 8143: 6, + 8144: 4, + 8145: 4, + 8146: 4, + 8147: 4, + 8150: 4, + 8151: 4, + 8152: 3, + 8153: 3, + 8154: 5, + 8155: 4, + 8157: 6, + 8158: 6, + 8159: 6, + 8160: 6, + 8161: 6, + 8162: 6, + 8163: 6, + 8164: 7, + 8165: 7, + 8166: 6, + 8167: 6, + 8168: 7, + 8169: 7, + 8170: 9, + 8171: 9, + 8172: 8, + 8173: 6, + 8174: 6, + 8175: 6, + 8178: 9, + 8179: 9, + 8180: 9, + 8182: 9, + 8183: 9, + 8184: 10, + 8185: 9, + 8186: 10, + 8187: 9, + 8188: 8, + 8189: 6, + 8190: 6, + 8208: 4, + 8209: 4, + 8210: 7, + 8211: 6, + 8212: 11, + 8213: 11, + 8214: 6, + 8215: 6, + 8216: 3, + 8217: 3, + 8218: 3, + 8219: 3, + 8220: 6, + 8221: 6, + 8222: 6, + 8223: 6, + 8224: 6, + 8225: 6, + 8226: 6, + 8227: 6, + 8228: 4, + 8229: 7, + 8230: 11, + 8231: 3, + 8240: 15, + 8241: 19, + 8242: 2, + 8243: 4, + 8244: 6, + 8245: 2, + 8246: 4, + 8247: 6, + 8248: 4, + 8249: 4, + 8250: 4, + 8251: 9, + 8252: 5, + 8253: 6, + 8254: 6, + 8255: 9, + 8256: 9, + 8257: 3, + 8258: 11, + 8259: 6, + 8260: 2, + 8261: 4, + 8262: 4, + 8263: 10, + 8264: 8, + 8265: 8, + 8266: 5, + 8267: 7, + 8268: 6, + 8269: 6, + 8270: 6, + 8271: 4, + 8272: 9, + 8273: 6, + 8274: 5, + 8275: 11, + 8276: 9, + 8277: 9, + 8278: 6, + 8279: 7, + 8280: 9, + 8281: 9, + 8282: 3, + 8283: 9, + 8284: 9, + 8285: 3, + 8286: 3, + 8304: 4, + 8305: 2, + 8308: 4, + 8309: 4, + 8310: 4, + 8311: 4, + 8312: 4, + 8313: 4, + 8314: 6, + 8315: 6, + 8316: 6, + 8317: 3, + 8318: 3, + 8319: 4, + 8320: 4, + 8321: 4, + 8322: 4, + 8323: 4, + 8324: 4, + 8325: 4, + 8326: 4, + 8327: 4, + 8328: 4, + 8329: 4, + 8330: 6, + 8331: 6, + 8332: 6, + 8333: 3, + 8334: 3, + 8336: 4, + 8337: 5, + 8338: 5, + 8339: 5, + 8340: 5, + 8341: 4, + 8342: 5, + 8343: 2, + 8344: 7, + 8345: 4, + 8346: 5, + 8347: 4, + 8348: 3, + 8352: 10, + 8353: 7, + 8354: 7, + 8355: 7, + 8356: 7, + 8357: 11, + 8358: 7, + 8359: 14, + 8360: 12, + 8361: 11, + 8362: 9, + 8363: 7, + 8364: 7, + 8365: 7, + 8366: 7, + 8367: 14, + 8368: 7, + 8369: 7, + 8370: 7, + 8371: 7, + 8372: 9, + 8373: 7, + 8376: 7, + 8377: 7, + 8378: 7, + 8381: 7, + 8448: 11, + 8449: 11, + 8450: 8, + 8451: 12, + 8452: 7, + 8453: 11, + 8454: 12, + 8455: 7, + 8456: 8, + 8457: 10, + 8459: 11, + 8460: 8, + 8461: 9, + 8462: 7, + 8463: 7, + 8464: 5, + 8465: 8, + 8466: 8, + 8467: 5, + 8468: 9, + 8469: 9, + 8470: 11, + 8471: 11, + 8472: 8, + 8473: 8, + 8474: 9, + 8475: 9, + 8476: 9, + 8477: 9, + 8478: 10, + 8479: 8, + 8480: 11, + 8481: 12, + 8482: 11, + 8483: 8, + 8484: 8, + 8485: 6, + 8486: 8, + 8487: 8, + 8488: 7, + 8489: 4, + 8490: 7, + 8491: 8, + 8492: 9, + 8493: 8, + 8494: 9, + 8495: 7, + 8496: 7, + 8497: 9, + 8498: 6, + 8499: 12, + 8500: 5, + 8501: 8, + 8502: 7, + 8503: 5, + 8504: 7, + 8505: 4, + 8506: 10, + 8507: 13, + 8508: 8, + 8509: 8, + 8510: 7, + 8511: 9, + 8512: 9, + 8513: 9, + 8514: 6, + 8515: 6, + 8516: 7, + 8517: 9, + 8518: 8, + 8519: 7, + 8520: 4, + 8521: 4, + 8523: 9, + 8526: 6, + 8528: 11, + 8529: 11, + 8530: 15, + 8531: 11, + 8532: 11, + 8533: 11, + 8534: 11, + 8535: 11, + 8536: 11, + 8537: 11, + 8538: 11, + 8539: 11, + 8540: 11, + 8541: 11, + 8542: 11, + 8543: 6, + 8544: 3, + 8545: 5, + 8546: 8, + 8547: 10, + 8548: 8, + 8549: 10, + 8550: 12, + 8551: 14, + 8552: 10, + 8553: 8, + 8554: 10, + 8555: 12, + 8556: 6, + 8557: 8, + 8558: 8, + 8559: 9, + 8560: 3, + 8561: 5, + 8562: 7, + 8563: 9, + 8564: 7, + 8565: 9, + 8566: 11, + 8567: 13, + 8568: 9, + 8569: 7, + 8570: 9, + 8571: 11, + 8572: 3, + 8573: 6, + 8574: 7, + 8575: 11, + 8576: 14, + 8577: 8, + 8578: 14, + 8579: 8, + 8580: 6, + 8581: 8, + 8585: 11, + 8592: 9, + 8593: 9, + 8594: 9, + 8595: 9, + 8596: 9, + 8597: 9, + 8598: 9, + 8599: 9, + 8600: 9, + 8601: 9, + 8602: 9, + 8603: 9, + 8604: 9, + 8605: 9, + 8606: 9, + 8607: 9, + 8608: 9, + 8609: 9, + 8610: 9, + 8611: 9, + 8612: 9, + 8613: 9, + 8614: 9, + 8615: 9, + 8616: 9, + 8617: 9, + 8618: 9, + 8619: 9, + 8620: 9, + 8621: 9, + 8622: 9, + 8623: 9, + 8624: 9, + 8625: 9, + 8626: 9, + 8627: 9, + 8628: 9, + 8629: 9, + 8630: 9, + 8631: 9, + 8632: 9, + 8633: 9, + 8634: 9, + 8635: 9, + 8636: 9, + 8637: 9, + 8638: 9, + 8639: 9, + 8640: 9, + 8641: 9, + 8642: 9, + 8643: 9, + 8644: 9, + 8645: 9, + 8646: 9, + 8647: 9, + 8648: 9, + 8649: 9, + 8650: 9, + 8651: 9, + 8652: 9, + 8653: 9, + 8654: 9, + 8655: 9, + 8656: 9, + 8657: 9, + 8658: 9, + 8659: 9, + 8660: 9, + 8661: 9, + 8662: 9, + 8663: 9, + 8664: 9, + 8665: 9, + 8666: 9, + 8667: 9, + 8668: 9, + 8669: 9, + 8670: 9, + 8671: 9, + 8672: 9, + 8673: 9, + 8674: 9, + 8675: 9, + 8676: 9, + 8677: 9, + 8678: 9, + 8679: 9, + 8680: 9, + 8681: 9, + 8682: 9, + 8683: 9, + 8684: 9, + 8685: 9, + 8686: 9, + 8687: 9, + 8688: 9, + 8689: 9, + 8690: 9, + 8691: 9, + 8692: 9, + 8693: 9, + 8694: 9, + 8695: 9, + 8696: 9, + 8697: 9, + 8698: 9, + 8699: 9, + 8700: 9, + 8701: 9, + 8702: 9, + 8703: 9, + 8704: 8, + 8705: 7, + 8706: 6, + 8707: 7, + 8708: 7, + 8709: 10, + 8710: 7, + 8711: 7, + 8712: 10, + 8713: 10, + 8714: 8, + 8715: 10, + 8716: 10, + 8717: 8, + 8718: 7, + 8719: 8, + 8720: 8, + 8721: 7, + 8722: 9, + 8723: 9, + 8724: 9, + 8725: 4, + 8726: 7, + 8727: 9, + 8728: 7, + 8729: 7, + 8730: 7, + 8731: 7, + 8732: 7, + 8733: 8, + 8734: 9, + 8735: 9, + 8736: 10, + 8737: 10, + 8738: 9, + 8739: 6, + 8740: 6, + 8741: 6, + 8742: 6, + 8743: 8, + 8744: 8, + 8745: 8, + 8746: 8, + 8747: 6, + 8748: 9, + 8749: 12, + 8750: 6, + 8751: 9, + 8752: 12, + 8753: 6, + 8754: 6, + 8755: 6, + 8756: 7, + 8757: 7, + 8758: 3, + 8759: 7, + 8760: 9, + 8761: 9, + 8762: 9, + 8763: 9, + 8764: 9, + 8765: 9, + 8766: 9, + 8767: 9, + 8768: 4, + 8769: 9, + 8770: 9, + 8771: 9, + 8772: 9, + 8773: 9, + 8774: 9, + 8775: 9, + 8776: 9, + 8777: 9, + 8778: 9, + 8779: 9, + 8780: 9, + 8781: 9, + 8782: 9, + 8783: 9, + 8784: 9, + 8785: 9, + 8786: 9, + 8787: 9, + 8788: 11, + 8789: 11, + 8790: 9, + 8791: 9, + 8792: 9, + 8793: 9, + 8794: 9, + 8795: 9, + 8796: 9, + 8797: 9, + 8798: 9, + 8799: 9, + 8800: 9, + 8801: 9, + 8802: 9, + 8803: 9, + 8804: 9, + 8805: 9, + 8806: 9, + 8807: 9, + 8808: 9, + 8809: 9, + 8810: 12, + 8811: 12, + 8812: 5, + 8813: 9, + 8814: 9, + 8815: 9, + 8816: 9, + 8817: 9, + 8818: 9, + 8819: 9, + 8820: 9, + 8821: 9, + 8822: 9, + 8823: 9, + 8824: 9, + 8825: 9, + 8826: 9, + 8827: 9, + 8828: 9, + 8829: 9, + 8830: 9, + 8831: 9, + 8832: 9, + 8833: 9, + 8834: 9, + 8835: 9, + 8836: 9, + 8837: 9, + 8838: 9, + 8839: 9, + 8840: 9, + 8841: 9, + 8842: 9, + 8843: 9, + 8844: 8, + 8845: 8, + 8846: 8, + 8847: 9, + 8848: 9, + 8849: 9, + 8850: 9, + 8851: 9, + 8852: 9, + 8853: 9, + 8854: 9, + 8855: 9, + 8856: 9, + 8857: 9, + 8858: 9, + 8859: 9, + 8860: 9, + 8861: 9, + 8862: 9, + 8863: 9, + 8864: 9, + 8865: 9, + 8866: 10, + 8867: 10, + 8868: 10, + 8869: 10, + 8870: 6, + 8871: 6, + 8872: 10, + 8873: 10, + 8874: 10, + 8875: 10, + 8876: 10, + 8877: 10, + 8878: 10, + 8879: 10, + 8880: 9, + 8881: 9, + 8882: 9, + 8883: 9, + 8884: 9, + 8885: 9, + 8886: 11, + 8887: 11, + 8888: 9, + 8889: 9, + 8890: 6, + 8891: 8, + 8892: 8, + 8893: 8, + 8894: 9, + 8895: 9, + 8896: 9, + 8897: 9, + 8898: 9, + 8899: 9, + 8900: 7, + 8901: 3, + 8902: 7, + 8903: 9, + 8904: 11, + 8905: 11, + 8906: 11, + 8907: 11, + 8908: 11, + 8909: 9, + 8910: 8, + 8911: 8, + 8912: 9, + 8913: 9, + 8914: 9, + 8915: 9, + 8916: 9, + 8917: 9, + 8918: 9, + 8919: 9, + 8920: 16, + 8921: 16, + 8922: 9, + 8923: 9, + 8924: 9, + 8925: 9, + 8926: 9, + 8927: 9, + 8928: 9, + 8929: 9, + 8930: 9, + 8931: 9, + 8932: 9, + 8933: 9, + 8934: 9, + 8935: 9, + 8936: 9, + 8937: 9, + 8938: 9, + 8939: 9, + 8940: 9, + 8941: 9, + 8942: 11, + 8943: 11, + 8944: 11, + 8945: 11, + 8946: 11, + 8947: 10, + 8948: 8, + 8949: 10, + 8950: 10, + 8951: 8, + 8952: 10, + 8953: 10, + 8954: 11, + 8955: 10, + 8956: 8, + 8957: 10, + 8958: 8, + 8959: 10, + 8960: 7, + 8961: 7, + 8962: 7, + 8963: 9, + 8964: 9, + 8965: 9, + 8966: 9, + 8967: 5, + 8968: 4, + 8969: 4, + 8970: 4, + 8971: 4, + 8972: 9, + 8973: 9, + 8974: 9, + 8975: 9, + 8976: 9, + 8977: 6, + 8984: 11, + 8985: 9, + 8988: 5, + 8989: 5, + 8990: 5, + 8991: 5, + 8992: 6, + 8993: 6, + 8996: 13, + 8997: 13, + 8998: 16, + 8999: 13, + 9000: 16, + 9003: 16, + 9004: 10, + 9075: 4, + 9076: 7, + 9077: 9, + 9082: 7, + 9085: 8, + 9095: 13, + 9108: 10, + 9115: 6, + 9116: 6, + 9117: 6, + 9118: 6, + 9119: 6, + 9120: 6, + 9121: 6, + 9122: 6, + 9123: 6, + 9124: 6, + 9125: 6, + 9126: 6, + 9127: 8, + 9128: 8, + 9129: 8, + 9130: 8, + 9131: 8, + 9132: 8, + 9133: 8, + 9134: 6, + 9166: 9, + 9167: 10, + 9187: 10, + 9189: 8, + 9192: 7, + 9250: 7, + 9251: 7, + 9312: 10, + 9313: 10, + 9314: 10, + 9315: 10, + 9316: 10, + 9317: 10, + 9318: 10, + 9319: 10, + 9320: 10, + 9321: 10, + 9472: 7, + 9473: 7, + 9474: 7, + 9475: 7, + 9476: 7, + 9477: 7, + 9478: 7, + 9479: 7, + 9480: 7, + 9481: 7, + 9482: 7, + 9483: 7, + 9484: 7, + 9485: 7, + 9486: 7, + 9487: 7, + 9488: 7, + 9489: 7, + 9490: 7, + 9491: 7, + 9492: 7, + 9493: 7, + 9494: 7, + 9495: 7, + 9496: 7, + 9497: 7, + 9498: 7, + 9499: 7, + 9500: 7, + 9501: 7, + 9502: 7, + 9503: 7, + 9504: 7, + 9505: 7, + 9506: 7, + 9507: 7, + 9508: 7, + 9509: 7, + 9510: 7, + 9511: 7, + 9512: 7, + 9513: 7, + 9514: 7, + 9515: 7, + 9516: 7, + 9517: 7, + 9518: 7, + 9519: 7, + 9520: 7, + 9521: 7, + 9522: 7, + 9523: 7, + 9524: 7, + 9525: 7, + 9526: 7, + 9527: 7, + 9528: 7, + 9529: 7, + 9530: 7, + 9531: 7, + 9532: 7, + 9533: 7, + 9534: 7, + 9535: 7, + 9536: 7, + 9537: 7, + 9538: 7, + 9539: 7, + 9540: 7, + 9541: 7, + 9542: 7, + 9543: 7, + 9544: 7, + 9545: 7, + 9546: 7, + 9547: 7, + 9548: 7, + 9549: 7, + 9550: 7, + 9551: 7, + 9552: 7, + 9553: 7, + 9554: 7, + 9555: 7, + 9556: 7, + 9557: 7, + 9558: 7, + 9559: 7, + 9560: 7, + 9561: 7, + 9562: 7, + 9563: 7, + 9564: 7, + 9565: 7, + 9566: 7, + 9567: 7, + 9568: 7, + 9569: 7, + 9570: 7, + 9571: 7, + 9572: 7, + 9573: 7, + 9574: 7, + 9575: 7, + 9576: 7, + 9577: 7, + 9578: 7, + 9579: 7, + 9580: 7, + 9581: 7, + 9582: 7, + 9583: 7, + 9584: 7, + 9585: 7, + 9586: 7, + 9587: 7, + 9588: 7, + 9589: 7, + 9590: 7, + 9591: 7, + 9592: 7, + 9593: 7, + 9594: 7, + 9595: 7, + 9596: 7, + 9597: 7, + 9598: 7, + 9599: 7, + 9600: 8, + 9601: 8, + 9602: 8, + 9603: 8, + 9604: 8, + 9605: 8, + 9606: 8, + 9607: 8, + 9608: 8, + 9609: 8, + 9610: 8, + 9611: 8, + 9612: 8, + 9613: 8, + 9614: 8, + 9615: 8, + 9616: 8, + 9617: 8, + 9618: 8, + 9619: 8, + 9620: 8, + 9621: 8, + 9622: 8, + 9623: 8, + 9624: 8, + 9625: 8, + 9626: 8, + 9627: 8, + 9628: 8, + 9629: 8, + 9630: 8, + 9631: 8, + 9632: 10, + 9633: 10, + 9634: 10, + 9635: 10, + 9636: 10, + 9637: 10, + 9638: 10, + 9639: 10, + 9640: 10, + 9641: 10, + 9642: 7, + 9643: 7, + 9644: 10, + 9645: 10, + 9646: 6, + 9647: 6, + 9648: 8, + 9649: 8, + 9650: 8, + 9651: 8, + 9652: 6, + 9653: 6, + 9654: 8, + 9655: 8, + 9656: 6, + 9657: 6, + 9658: 8, + 9659: 8, + 9660: 8, + 9661: 8, + 9662: 6, + 9663: 6, + 9664: 8, + 9665: 8, + 9666: 6, + 9667: 6, + 9668: 8, + 9669: 8, + 9670: 8, + 9671: 8, + 9672: 8, + 9673: 10, + 9674: 5, + 9675: 10, + 9676: 10, + 9677: 10, + 9678: 10, + 9679: 10, + 9680: 10, + 9681: 10, + 9682: 10, + 9683: 10, + 9684: 10, + 9685: 10, + 9686: 6, + 9687: 6, + 9688: 9, + 9689: 11, + 9690: 11, + 9691: 11, + 9692: 4, + 9693: 4, + 9694: 4, + 9695: 4, + 9696: 10, + 9697: 10, + 9698: 8, + 9699: 8, + 9700: 8, + 9701: 8, + 9702: 6, + 9703: 10, + 9704: 10, + 9705: 10, + 9706: 10, + 9707: 10, + 9708: 8, + 9709: 8, + 9710: 8, + 9711: 12, + 9712: 10, + 9713: 10, + 9714: 10, + 9715: 10, + 9716: 10, + 9717: 10, + 9718: 10, + 9719: 10, + 9720: 8, + 9721: 8, + 9722: 8, + 9723: 9, + 9724: 9, + 9725: 8, + 9726: 8, + 9727: 8, + 9728: 10, + 9729: 11, + 9730: 10, + 9731: 10, + 9732: 10, + 9733: 10, + 9734: 10, + 9735: 6, + 9736: 10, + 9737: 10, + 9738: 10, + 9739: 10, + 9740: 7, + 9741: 11, + 9742: 14, + 9743: 14, + 9744: 10, + 9745: 10, + 9746: 10, + 9747: 6, + 9748: 10, + 9749: 10, + 9750: 10, + 9751: 10, + 9752: 10, + 9753: 10, + 9754: 10, + 9755: 10, + 9756: 10, + 9757: 7, + 9758: 10, + 9759: 7, + 9760: 10, + 9761: 10, + 9762: 10, + 9763: 10, + 9764: 7, + 9765: 8, + 9766: 7, + 9767: 9, + 9768: 6, + 9769: 10, + 9770: 10, + 9771: 10, + 9772: 8, + 9773: 10, + 9774: 10, + 9775: 10, + 9776: 10, + 9777: 10, + 9778: 10, + 9779: 10, + 9780: 10, + 9781: 10, + 9782: 10, + 9783: 10, + 9784: 10, + 9785: 11, + 9786: 11, + 9787: 11, + 9788: 10, + 9789: 10, + 9790: 10, + 9791: 7, + 9792: 8, + 9793: 8, + 9794: 10, + 9795: 10, + 9796: 10, + 9797: 10, + 9798: 10, + 9799: 10, + 9800: 10, + 9801: 10, + 9802: 10, + 9803: 10, + 9804: 10, + 9805: 10, + 9806: 10, + 9807: 10, + 9808: 10, + 9809: 10, + 9810: 10, + 9811: 10, + 9812: 10, + 9813: 10, + 9814: 10, + 9815: 10, + 9816: 10, + 9817: 10, + 9818: 10, + 9819: 10, + 9820: 10, + 9821: 10, + 9822: 10, + 9823: 10, + 9824: 10, + 9825: 10, + 9826: 10, + 9827: 10, + 9828: 10, + 9829: 10, + 9830: 10, + 9831: 10, + 9832: 10, + 9833: 5, + 9834: 7, + 9835: 10, + 9836: 10, + 9837: 5, + 9838: 4, + 9839: 5, + 9840: 8, + 9841: 8, + 9842: 10, + 9843: 10, + 9844: 10, + 9845: 10, + 9846: 10, + 9847: 10, + 9848: 10, + 9849: 10, + 9850: 10, + 9851: 10, + 9852: 10, + 9853: 10, + 9854: 10, + 9855: 10, + 9856: 10, + 9857: 10, + 9858: 10, + 9859: 10, + 9860: 10, + 9861: 10, + 9862: 10, + 9863: 10, + 9864: 10, + 9865: 10, + 9866: 10, + 9867: 10, + 9868: 10, + 9869: 10, + 9870: 10, + 9871: 10, + 9872: 10, + 9873: 10, + 9874: 10, + 9875: 10, + 9876: 10, + 9877: 6, + 9878: 10, + 9879: 10, + 9880: 10, + 9881: 10, + 9882: 10, + 9883: 10, + 9884: 10, + 9886: 10, + 9887: 10, + 9888: 10, + 9889: 8, + 9890: 11, + 9891: 12, + 9892: 13, + 9893: 10, + 9894: 9, + 9895: 9, + 9896: 9, + 9897: 9, + 9898: 9, + 9899: 9, + 9900: 9, + 9901: 9, + 9902: 9, + 9903: 9, + 9904: 9, + 9905: 9, + 9906: 8, + 9907: 8, + 9908: 8, + 9909: 8, + 9910: 9, + 9911: 8, + 9912: 8, + 9920: 9, + 9921: 9, + 9922: 9, + 9923: 9, + 9954: 8, + 9985: 9, + 9986: 9, + 9987: 9, + 9988: 9, + 9990: 9, + 9991: 9, + 9992: 9, + 9993: 9, + 9996: 9, + 9997: 9, + 9998: 9, + 9999: 9, + 10000: 9, + 10001: 9, + 10002: 9, + 10003: 9, + 10004: 9, + 10005: 9, + 10006: 9, + 10007: 9, + 10008: 9, + 10009: 9, + 10010: 9, + 10011: 9, + 10012: 9, + 10013: 9, + 10014: 9, + 10015: 9, + 10016: 9, + 10017: 9, + 10018: 9, + 10019: 9, + 10020: 9, + 10021: 9, + 10022: 9, + 10023: 9, + 10025: 9, + 10026: 9, + 10027: 9, + 10028: 9, + 10029: 9, + 10030: 9, + 10031: 9, + 10032: 9, + 10033: 9, + 10034: 9, + 10035: 9, + 10036: 9, + 10037: 9, + 10038: 9, + 10039: 9, + 10040: 9, + 10041: 9, + 10042: 9, + 10043: 9, + 10044: 9, + 10045: 9, + 10046: 9, + 10047: 9, + 10048: 9, + 10049: 9, + 10050: 9, + 10051: 9, + 10052: 9, + 10053: 9, + 10054: 9, + 10055: 9, + 10056: 9, + 10057: 9, + 10058: 9, + 10059: 9, + 10061: 10, + 10063: 10, + 10064: 10, + 10065: 10, + 10066: 10, + 10070: 10, + 10072: 9, + 10073: 9, + 10074: 9, + 10075: 4, + 10076: 4, + 10077: 6, + 10078: 6, + 10081: 9, + 10082: 9, + 10083: 9, + 10084: 9, + 10085: 9, + 10086: 9, + 10087: 9, + 10088: 9, + 10089: 9, + 10090: 9, + 10091: 9, + 10092: 9, + 10093: 9, + 10094: 9, + 10095: 9, + 10096: 9, + 10097: 9, + 10098: 9, + 10099: 9, + 10100: 9, + 10101: 9, + 10102: 10, + 10103: 10, + 10104: 10, + 10105: 10, + 10106: 10, + 10107: 10, + 10108: 10, + 10109: 10, + 10110: 10, + 10111: 10, + 10112: 9, + 10113: 9, + 10114: 9, + 10115: 9, + 10116: 9, + 10117: 9, + 10118: 9, + 10119: 9, + 10120: 9, + 10121: 9, + 10122: 9, + 10123: 9, + 10124: 9, + 10125: 9, + 10126: 9, + 10127: 9, + 10128: 9, + 10129: 9, + 10130: 9, + 10131: 9, + 10132: 9, + 10136: 9, + 10137: 9, + 10138: 9, + 10139: 9, + 10140: 9, + 10141: 9, + 10142: 9, + 10143: 9, + 10144: 9, + 10145: 9, + 10146: 9, + 10147: 9, + 10148: 9, + 10149: 9, + 10150: 9, + 10151: 9, + 10152: 9, + 10153: 9, + 10154: 9, + 10155: 9, + 10156: 9, + 10157: 9, + 10158: 9, + 10159: 9, + 10161: 9, + 10162: 9, + 10163: 9, + 10164: 9, + 10165: 9, + 10166: 9, + 10167: 9, + 10168: 9, + 10169: 9, + 10170: 9, + 10171: 9, + 10172: 9, + 10173: 9, + 10174: 9, + 10181: 4, + 10182: 4, + 10208: 5, + 10214: 5, + 10215: 5, + 10216: 4, + 10217: 4, + 10218: 6, + 10219: 6, + 10224: 9, + 10225: 9, + 10226: 9, + 10227: 9, + 10228: 13, + 10229: 16, + 10230: 16, + 10231: 16, + 10232: 16, + 10233: 16, + 10234: 16, + 10235: 16, + 10236: 16, + 10237: 16, + 10238: 16, + 10239: 16, + 10240: 8, + 10241: 8, + 10242: 8, + 10243: 8, + 10244: 8, + 10245: 8, + 10246: 8, + 10247: 8, + 10248: 8, + 10249: 8, + 10250: 8, + 10251: 8, + 10252: 8, + 10253: 8, + 10254: 8, + 10255: 8, + 10256: 8, + 10257: 8, + 10258: 8, + 10259: 8, + 10260: 8, + 10261: 8, + 10262: 8, + 10263: 8, + 10264: 8, + 10265: 8, + 10266: 8, + 10267: 8, + 10268: 8, + 10269: 8, + 10270: 8, + 10271: 8, + 10272: 8, + 10273: 8, + 10274: 8, + 10275: 8, + 10276: 8, + 10277: 8, + 10278: 8, + 10279: 8, + 10280: 8, + 10281: 8, + 10282: 8, + 10283: 8, + 10284: 8, + 10285: 8, + 10286: 8, + 10287: 8, + 10288: 8, + 10289: 8, + 10290: 8, + 10291: 8, + 10292: 8, + 10293: 8, + 10294: 8, + 10295: 8, + 10296: 8, + 10297: 8, + 10298: 8, + 10299: 8, + 10300: 8, + 10301: 8, + 10302: 8, + 10303: 8, + 10304: 8, + 10305: 8, + 10306: 8, + 10307: 8, + 10308: 8, + 10309: 8, + 10310: 8, + 10311: 8, + 10312: 8, + 10313: 8, + 10314: 8, + 10315: 8, + 10316: 8, + 10317: 8, + 10318: 8, + 10319: 8, + 10320: 8, + 10321: 8, + 10322: 8, + 10323: 8, + 10324: 8, + 10325: 8, + 10326: 8, + 10327: 8, + 10328: 8, + 10329: 8, + 10330: 8, + 10331: 8, + 10332: 8, + 10333: 8, + 10334: 8, + 10335: 8, + 10336: 8, + 10337: 8, + 10338: 8, + 10339: 8, + 10340: 8, + 10341: 8, + 10342: 8, + 10343: 8, + 10344: 8, + 10345: 8, + 10346: 8, + 10347: 8, + 10348: 8, + 10349: 8, + 10350: 8, + 10351: 8, + 10352: 8, + 10353: 8, + 10354: 8, + 10355: 8, + 10356: 8, + 10357: 8, + 10358: 8, + 10359: 8, + 10360: 8, + 10361: 8, + 10362: 8, + 10363: 8, + 10364: 8, + 10365: 8, + 10366: 8, + 10367: 8, + 10368: 8, + 10369: 8, + 10370: 8, + 10371: 8, + 10372: 8, + 10373: 8, + 10374: 8, + 10375: 8, + 10376: 8, + 10377: 8, + 10378: 8, + 10379: 8, + 10380: 8, + 10381: 8, + 10382: 8, + 10383: 8, + 10384: 8, + 10385: 8, + 10386: 8, + 10387: 8, + 10388: 8, + 10389: 8, + 10390: 8, + 10391: 8, + 10392: 8, + 10393: 8, + 10394: 8, + 10395: 8, + 10396: 8, + 10397: 8, + 10398: 8, + 10399: 8, + 10400: 8, + 10401: 8, + 10402: 8, + 10403: 8, + 10404: 8, + 10405: 8, + 10406: 8, + 10407: 8, + 10408: 8, + 10409: 8, + 10410: 8, + 10411: 8, + 10412: 8, + 10413: 8, + 10414: 8, + 10415: 8, + 10416: 8, + 10417: 8, + 10418: 8, + 10419: 8, + 10420: 8, + 10421: 8, + 10422: 8, + 10423: 8, + 10424: 8, + 10425: 8, + 10426: 8, + 10427: 8, + 10428: 8, + 10429: 8, + 10430: 8, + 10431: 8, + 10432: 8, + 10433: 8, + 10434: 8, + 10435: 8, + 10436: 8, + 10437: 8, + 10438: 8, + 10439: 8, + 10440: 8, + 10441: 8, + 10442: 8, + 10443: 8, + 10444: 8, + 10445: 8, + 10446: 8, + 10447: 8, + 10448: 8, + 10449: 8, + 10450: 8, + 10451: 8, + 10452: 8, + 10453: 8, + 10454: 8, + 10455: 8, + 10456: 8, + 10457: 8, + 10458: 8, + 10459: 8, + 10460: 8, + 10461: 8, + 10462: 8, + 10463: 8, + 10464: 8, + 10465: 8, + 10466: 8, + 10467: 8, + 10468: 8, + 10469: 8, + 10470: 8, + 10471: 8, + 10472: 8, + 10473: 8, + 10474: 8, + 10475: 8, + 10476: 8, + 10477: 8, + 10478: 8, + 10479: 8, + 10480: 8, + 10481: 8, + 10482: 8, + 10483: 8, + 10484: 8, + 10485: 8, + 10486: 8, + 10487: 8, + 10488: 8, + 10489: 8, + 10490: 8, + 10491: 8, + 10492: 8, + 10493: 8, + 10494: 8, + 10495: 8, + 10502: 9, + 10503: 9, + 10506: 9, + 10507: 9, + 10560: 8, + 10561: 8, + 10627: 8, + 10628: 8, + 10702: 9, + 10703: 11, + 10704: 11, + 10705: 11, + 10706: 11, + 10707: 11, + 10708: 11, + 10709: 11, + 10731: 5, + 10746: 9, + 10747: 9, + 10752: 11, + 10753: 11, + 10754: 11, + 10764: 15, + 10765: 6, + 10766: 6, + 10767: 6, + 10768: 6, + 10769: 6, + 10770: 6, + 10771: 6, + 10772: 6, + 10773: 6, + 10774: 6, + 10775: 6, + 10776: 6, + 10777: 6, + 10778: 6, + 10779: 6, + 10780: 6, + 10799: 9, + 10858: 9, + 10859: 9, + 10877: 9, + 10878: 9, + 10879: 9, + 10880: 9, + 10881: 9, + 10882: 9, + 10883: 9, + 10884: 9, + 10885: 9, + 10886: 9, + 10887: 9, + 10888: 9, + 10889: 9, + 10890: 9, + 10891: 9, + 10892: 9, + 10893: 9, + 10894: 9, + 10895: 9, + 10896: 9, + 10897: 9, + 10898: 9, + 10899: 9, + 10900: 9, + 10901: 9, + 10902: 9, + 10903: 9, + 10904: 9, + 10905: 9, + 10906: 9, + 10907: 9, + 10908: 9, + 10909: 9, + 10910: 9, + 10911: 9, + 10912: 9, + 10926: 9, + 10927: 9, + 10928: 9, + 10929: 9, + 10930: 9, + 10931: 9, + 10932: 9, + 10933: 9, + 10934: 9, + 10935: 9, + 10936: 9, + 10937: 9, + 10938: 9, + 11001: 9, + 11002: 9, + 11008: 9, + 11009: 9, + 11010: 9, + 11011: 9, + 11012: 9, + 11013: 9, + 11014: 9, + 11015: 9, + 11016: 9, + 11017: 9, + 11018: 9, + 11019: 9, + 11020: 9, + 11021: 9, + 11022: 9, + 11023: 9, + 11024: 9, + 11025: 9, + 11026: 10, + 11027: 10, + 11028: 10, + 11029: 10, + 11030: 8, + 11031: 8, + 11032: 8, + 11033: 8, + 11034: 10, + 11039: 10, + 11040: 10, + 11041: 10, + 11042: 10, + 11043: 10, + 11044: 12, + 11091: 10, + 11092: 10, + 11360: 6, + 11361: 3, + 11362: 6, + 11363: 7, + 11364: 8, + 11365: 7, + 11366: 4, + 11367: 8, + 11368: 7, + 11369: 7, + 11370: 6, + 11371: 8, + 11372: 6, + 11373: 9, + 11374: 9, + 11375: 8, + 11376: 9, + 11377: 8, + 11378: 12, + 11379: 11, + 11380: 7, + 11381: 7, + 11382: 6, + 11383: 7, + 11385: 5, + 11386: 7, + 11387: 5, + 11388: 2, + 11389: 5, + 11390: 7, + 11391: 8, + 11520: 6, + 11521: 7, + 11522: 6, + 11523: 7, + 11524: 6, + 11525: 10, + 11526: 7, + 11527: 10, + 11528: 7, + 11529: 7, + 11530: 10, + 11531: 7, + 11532: 7, + 11533: 10, + 11534: 7, + 11535: 9, + 11536: 10, + 11537: 6, + 11538: 7, + 11539: 10, + 11540: 10, + 11541: 9, + 11542: 7, + 11543: 7, + 11544: 6, + 11545: 7, + 11546: 7, + 11547: 7, + 11548: 10, + 11549: 6, + 11550: 6, + 11551: 6, + 11552: 10, + 11553: 7, + 11554: 7, + 11555: 7, + 11556: 7, + 11557: 10, + 11568: 7, + 11569: 10, + 11570: 10, + 11571: 8, + 11572: 8, + 11573: 7, + 11574: 6, + 11575: 8, + 11576: 8, + 11577: 7, + 11578: 7, + 11579: 8, + 11580: 10, + 11581: 8, + 11582: 5, + 11583: 8, + 11584: 10, + 11585: 10, + 11586: 3, + 11587: 7, + 11588: 8, + 11589: 7, + 11590: 6, + 11591: 8, + 11592: 7, + 11593: 7, + 11594: 6, + 11595: 10, + 11596: 9, + 11597: 8, + 11598: 7, + 11599: 3, + 11600: 9, + 11601: 3, + 11602: 8, + 11603: 7, + 11604: 10, + 11605: 10, + 11606: 8, + 11607: 4, + 11608: 8, + 11609: 10, + 11610: 10, + 11611: 8, + 11612: 8, + 11613: 8, + 11614: 8, + 11615: 7, + 11616: 8, + 11617: 8, + 11618: 7, + 11619: 9, + 11620: 6, + 11621: 9, + 11631: 6, + 11800: 6, + 11807: 9, + 11810: 4, + 11811: 4, + 11812: 4, + 11813: 4, + 11822: 6, + 19904: 10, + 19905: 10, + 19906: 10, + 19907: 10, + 19908: 10, + 19909: 10, + 19910: 10, + 19911: 10, + 19912: 10, + 19913: 10, + 19914: 10, + 19915: 10, + 19916: 10, + 19917: 10, + 19918: 10, + 19919: 10, + 19920: 10, + 19921: 10, + 19922: 10, + 19923: 10, + 19924: 10, + 19925: 10, + 19926: 10, + 19927: 10, + 19928: 10, + 19929: 10, + 19930: 10, + 19931: 10, + 19932: 10, + 19933: 10, + 19934: 10, + 19935: 10, + 19936: 10, + 19937: 10, + 19938: 10, + 19939: 10, + 19940: 10, + 19941: 10, + 19942: 10, + 19943: 10, + 19944: 10, + 19945: 10, + 19946: 10, + 19947: 10, + 19948: 10, + 19949: 10, + 19950: 10, + 19951: 10, + 19952: 10, + 19953: 10, + 19954: 10, + 19955: 10, + 19956: 10, + 19957: 10, + 19958: 10, + 19959: 10, + 19960: 10, + 19961: 10, + 19962: 10, + 19963: 10, + 19964: 10, + 19965: 10, + 19966: 10, + 19967: 10, + 42192: 8, + 42193: 7, + 42194: 7, + 42195: 8, + 42196: 7, + 42197: 7, + 42198: 9, + 42199: 7, + 42200: 7, + 42201: 6, + 42202: 8, + 42203: 8, + 42204: 8, + 42205: 6, + 42206: 6, + 42207: 9, + 42208: 8, + 42209: 6, + 42210: 7, + 42211: 8, + 42212: 8, + 42213: 8, + 42214: 8, + 42215: 8, + 42216: 9, + 42217: 6, + 42218: 11, + 42219: 8, + 42220: 7, + 42221: 8, + 42222: 8, + 42223: 8, + 42224: 7, + 42225: 7, + 42226: 3, + 42227: 9, + 42228: 8, + 42229: 8, + 42230: 6, + 42231: 8, + 42232: 3, + 42233: 3, + 42234: 7, + 42235: 7, + 42236: 3, + 42237: 3, + 42238: 6, + 42239: 6, + 42564: 7, + 42565: 6, + 42566: 4, + 42567: 4, + 42572: 13, + 42573: 11, + 42576: 11, + 42577: 10, + 42580: 12, + 42581: 9, + 42582: 11, + 42583: 9, + 42594: 12, + 42595: 10, + 42596: 12, + 42597: 10, + 42598: 13, + 42599: 11, + 42600: 9, + 42601: 7, + 42602: 9, + 42603: 8, + 42604: 15, + 42605: 11, + 42606: 10, + 42634: 9, + 42635: 8, + 42636: 7, + 42637: 6, + 42644: 8, + 42645: 7, + 42648: 15, + 42649: 11, + 42760: 5, + 42761: 5, + 42762: 5, + 42763: 5, + 42764: 5, + 42765: 5, + 42766: 5, + 42767: 5, + 42768: 5, + 42769: 5, + 42770: 5, + 42771: 5, + 42772: 5, + 42773: 5, + 42774: 5, + 42779: 4, + 42780: 4, + 42781: 3, + 42782: 3, + 42783: 3, + 42786: 4, + 42787: 4, + 42788: 5, + 42789: 5, + 42790: 8, + 42791: 7, + 42792: 10, + 42793: 8, + 42794: 7, + 42795: 6, + 42800: 5, + 42801: 6, + 42802: 14, + 42803: 11, + 42804: 13, + 42805: 11, + 42806: 13, + 42807: 11, + 42808: 11, + 42809: 9, + 42810: 11, + 42811: 9, + 42812: 11, + 42813: 9, + 42814: 8, + 42815: 6, + 42816: 7, + 42817: 6, + 42822: 7, + 42823: 4, + 42824: 6, + 42825: 5, + 42826: 9, + 42827: 8, + 42830: 15, + 42831: 11, + 42832: 7, + 42833: 7, + 42834: 8, + 42835: 9, + 42838: 9, + 42839: 7, + 42852: 7, + 42853: 7, + 42854: 7, + 42855: 7, + 42880: 6, + 42881: 3, + 42882: 8, + 42883: 7, + 42889: 4, + 42890: 4, + 42891: 4, + 42892: 3, + 42893: 8, + 42894: 5, + 42896: 8, + 42897: 7, + 42912: 9, + 42913: 7, + 42914: 7, + 42915: 6, + 42916: 8, + 42917: 7, + 42918: 8, + 42919: 5, + 42920: 7, + 42921: 6, + 42922: 9, + 43000: 6, + 43001: 7, + 43002: 10, + 43003: 6, + 43004: 7, + 43005: 9, + 43006: 3, + 43007: 13, + 64256: 8, + 64257: 7, + 64258: 7, + 64259: 11, + 64260: 11, + 64261: 8, + 64262: 9, + 64275: 13, + 64276: 13, + 64277: 13, + 64278: 13, + 64279: 17, + 64285: 2, + 64287: 4, + 64288: 7, + 64289: 9, + 64290: 9, + 64291: 10, + 64292: 8, + 64293: 9, + 64294: 9, + 64295: 9, + 64296: 10, + 64297: 9, + 64298: 8, + 64299: 8, + 64300: 8, + 64301: 8, + 64302: 7, + 64303: 7, + 64304: 7, + 64305: 6, + 64306: 5, + 64307: 6, + 64308: 7, + 64309: 4, + 64310: 4, + 64312: 7, + 64313: 4, + 64314: 6, + 64315: 6, + 64316: 6, + 64318: 7, + 64320: 4, + 64321: 7, + 64323: 7, + 64324: 7, + 64326: 7, + 64327: 8, + 64328: 6, + 64329: 8, + 64330: 7, + 64331: 3, + 64332: 6, + 64333: 6, + 64334: 7, + 64335: 7, + 64338: 10, + 64339: 11, + 64340: 3, + 64341: 3, + 64342: 10, + 64343: 11, + 64344: 3, + 64345: 3, + 64346: 10, + 64347: 11, + 64348: 3, + 64349: 3, + 64350: 10, + 64351: 11, + 64352: 3, + 64353: 3, + 64354: 10, + 64355: 11, + 64356: 3, + 64357: 3, + 64358: 10, + 64359: 11, + 64360: 3, + 64361: 3, + 64362: 11, + 64363: 11, + 64364: 5, + 64365: 6, + 64366: 11, + 64367: 11, + 64368: 5, + 64369: 6, + 64370: 7, + 64371: 7, + 64372: 7, + 64373: 7, + 64374: 7, + 64375: 7, + 64376: 7, + 64377: 7, + 64378: 7, + 64379: 7, + 64380: 7, + 64381: 7, + 64382: 7, + 64383: 7, + 64384: 7, + 64385: 7, + 64386: 5, + 64387: 6, + 64388: 5, + 64389: 6, + 64390: 5, + 64391: 6, + 64392: 5, + 64393: 6, + 64394: 5, + 64395: 6, + 64396: 5, + 64397: 6, + 64398: 10, + 64399: 10, + 64400: 5, + 64401: 6, + 64402: 10, + 64403: 10, + 64404: 5, + 64405: 6, + 64406: 10, + 64407: 10, + 64408: 5, + 64409: 6, + 64410: 10, + 64411: 10, + 64412: 5, + 64413: 6, + 64414: 8, + 64415: 8, + 64416: 8, + 64417: 8, + 64418: 3, + 64419: 3, + 64426: 8, + 64427: 7, + 64428: 6, + 64429: 5, + 64467: 9, + 64468: 9, + 64469: 5, + 64470: 6, + 64471: 5, + 64472: 6, + 64473: 5, + 64474: 6, + 64475: 5, + 64476: 6, + 64478: 5, + 64479: 6, + 64484: 9, + 64485: 9, + 64486: 3, + 64487: 3, + 64488: 3, + 64489: 3, + 64508: 9, + 64509: 9, + 64510: 3, + 64511: 3, + 65136: 3, + 65137: 3, + 65138: 3, + 65139: 3, + 65140: 3, + 65142: 3, + 65143: 3, + 65144: 3, + 65145: 3, + 65146: 3, + 65147: 3, + 65148: 3, + 65149: 3, + 65150: 3, + 65151: 3, + 65152: 5, + 65153: 3, + 65154: 3, + 65155: 3, + 65156: 3, + 65157: 5, + 65158: 6, + 65159: 3, + 65160: 3, + 65161: 9, + 65162: 9, + 65163: 3, + 65164: 3, + 65165: 3, + 65166: 3, + 65167: 10, + 65168: 11, + 65169: 3, + 65170: 3, + 65171: 6, + 65172: 6, + 65173: 10, + 65174: 11, + 65175: 3, + 65176: 3, + 65177: 10, + 65178: 11, + 65179: 3, + 65180: 3, + 65181: 7, + 65182: 7, + 65183: 7, + 65184: 7, + 65185: 7, + 65186: 7, + 65187: 7, + 65188: 7, + 65189: 7, + 65190: 7, + 65191: 7, + 65192: 7, + 65193: 5, + 65194: 6, + 65195: 5, + 65196: 6, + 65197: 5, + 65198: 6, + 65199: 5, + 65200: 6, + 65201: 13, + 65202: 14, + 65203: 9, + 65204: 10, + 65205: 13, + 65206: 14, + 65207: 9, + 65208: 10, + 65209: 13, + 65210: 13, + 65211: 9, + 65212: 10, + 65213: 13, + 65214: 13, + 65215: 9, + 65216: 10, + 65217: 10, + 65218: 10, + 65219: 9, + 65220: 9, + 65221: 10, + 65222: 10, + 65223: 9, + 65224: 9, + 65225: 7, + 65226: 6, + 65227: 7, + 65228: 5, + 65229: 7, + 65230: 6, + 65231: 6, + 65232: 5, + 65233: 11, + 65234: 11, + 65235: 5, + 65236: 6, + 65237: 9, + 65238: 9, + 65239: 5, + 65240: 6, + 65241: 9, + 65242: 9, + 65243: 5, + 65244: 6, + 65245: 8, + 65246: 8, + 65247: 3, + 65248: 4, + 65249: 7, + 65250: 7, + 65251: 6, + 65252: 6, + 65253: 8, + 65254: 8, + 65255: 3, + 65256: 3, + 65257: 6, + 65258: 6, + 65259: 6, + 65260: 5, + 65261: 5, + 65262: 6, + 65263: 9, + 65264: 9, + 65265: 9, + 65266: 9, + 65267: 3, + 65268: 3, + 65269: 6, + 65270: 7, + 65271: 6, + 65272: 7, + 65273: 6, + 65274: 7, + 65275: 6, + 65276: 7, + 65533: 11, + 66304: 8, + 66305: 7, + 66306: 6, + 66307: 7, + 66308: 6, + 66309: 6, + 66310: 5, + 66311: 7, + 66312: 10, + 66313: 3, + 66314: 7, + 66315: 6, + 66316: 16, + 66317: 10, + 66318: 10, + 66319: 10, + 66320: 8, + 66321: 10, + 66322: 6, + 66323: 7, + 66324: 5, + 66325: 8, + 66326: 7, + 66327: 8, + 66328: 8, + 66329: 9, + 66330: 6, + 66331: 6, + 66332: 6, + 66333: 5, + 66334: 8, + 66336: 3, + 66337: 8, + 66338: 8, + 66339: 9, + 119552: 10, + 119553: 10, + 119554: 10, + 119555: 10, + 119556: 10, + 119557: 10, + 119558: 10, + 119559: 10, + 119560: 10, + 119561: 10, + 119562: 10, + 119563: 10, + 119564: 10, + 119565: 10, + 119566: 10, + 119567: 10, + 119568: 10, + 119569: 10, + 119570: 10, + 119571: 10, + 119572: 10, + 119573: 10, + 119574: 10, + 119575: 10, + 119576: 10, + 119577: 10, + 119578: 10, + 119579: 10, + 119580: 10, + 119581: 10, + 119582: 10, + 119583: 10, + 119584: 10, + 119585: 10, + 119586: 10, + 119587: 10, + 119588: 10, + 119589: 10, + 119590: 10, + 119591: 10, + 119592: 10, + 119593: 10, + 119594: 10, + 119595: 10, + 119596: 10, + 119597: 10, + 119598: 10, + 119599: 10, + 119600: 10, + 119601: 10, + 119602: 10, + 119603: 10, + 119604: 10, + 119605: 10, + 119606: 10, + 119607: 10, + 119608: 10, + 119609: 10, + 119610: 10, + 119611: 10, + 119612: 10, + 119613: 10, + 119614: 10, + 119615: 10, + 119616: 10, + 119617: 10, + 119618: 10, + 119619: 10, + 119620: 10, + 119621: 10, + 119622: 10, + 119623: 10, + 119624: 10, + 119625: 10, + 119626: 10, + 119627: 10, + 119628: 10, + 119629: 10, + 119630: 10, + 119631: 10, + 119632: 10, + 119633: 10, + 119634: 10, + 119635: 10, + 119636: 10, + 119637: 10, + 119638: 10, + 120120: 8, + 120121: 8, + 120123: 9, + 120124: 8, + 120125: 7, + 120126: 9, + 120128: 4, + 120129: 4, + 120130: 8, + 120131: 7, + 120132: 11, + 120134: 9, + 120138: 7, + 120139: 8, + 120140: 9, + 120141: 8, + 120142: 12, + 120143: 9, + 120144: 8, + 120146: 7, + 120147: 8, + 120148: 6, + 120149: 8, + 120150: 7, + 120151: 5, + 120152: 8, + 120153: 8, + 120154: 4, + 120155: 4, + 120156: 7, + 120157: 4, + 120158: 13, + 120159: 8, + 120160: 7, + 120161: 8, + 120162: 8, + 120163: 5, + 120164: 6, + 120165: 5, + 120166: 8, + 120167: 7, + 120168: 10, + 120169: 7, + 120170: 7, + 120171: 6, + 120224: 8, + 120225: 8, + 120226: 8, + 120227: 8, + 120228: 7, + 120229: 6, + 120230: 9, + 120231: 8, + 120232: 5, + 120233: 3, + 120234: 7, + 120235: 6, + 120236: 9, + 120237: 8, + 120238: 9, + 120239: 7, + 120240: 9, + 120241: 8, + 120242: 7, + 120243: 7, + 120244: 8, + 120245: 8, + 120246: 11, + 120247: 8, + 120248: 7, + 120249: 8, + 120250: 7, + 120251: 7, + 120252: 6, + 120253: 7, + 120254: 7, + 120255: 4, + 120256: 7, + 120257: 7, + 120258: 3, + 120259: 3, + 120260: 6, + 120261: 3, + 120262: 11, + 120263: 7, + 120264: 7, + 120265: 7, + 120266: 7, + 120267: 5, + 120268: 6, + 120269: 4, + 120270: 7, + 120271: 7, + 120272: 9, + 120273: 7, + 120274: 7, + 120275: 6, + 120792: 7, + 120793: 7, + 120794: 7, + 120795: 7, + 120796: 7, + 120797: 7, + 120798: 7, + 120799: 7, + 120800: 7, + 120801: 7, + 120802: 7, + 120803: 7, + 120804: 7, + 120805: 7, + 120806: 7, + 120807: 7, + 120808: 7, + 120809: 7, + 120810: 7, + 120811: 7, + 126464: 3, + 126465: 10, + 126466: 7, + 126467: 5, + 126469: 5, + 126470: 5, + 126471: 7, + 126472: 10, + 126473: 9, + 126474: 9, + 126475: 8, + 126476: 7, + 126477: 8, + 126478: 13, + 126479: 7, + 126480: 11, + 126481: 13, + 126482: 9, + 126483: 5, + 126484: 13, + 126485: 10, + 126486: 10, + 126487: 7, + 126488: 5, + 126489: 13, + 126490: 10, + 126491: 7, + 126492: 10, + 126493: 8, + 126494: 11, + 126495: 9, + 126497: 4, + 126498: 7, + 126500: 7, + 126503: 7, + 126505: 4, + 126506: 7, + 126507: 5, + 126508: 7, + 126509: 4, + 126510: 10, + 126511: 7, + 126512: 5, + 126513: 10, + 126514: 5, + 126516: 10, + 126517: 4, + 126518: 4, + 126519: 7, + 126521: 10, + 126523: 6, + 126561: 7, + 126562: 10, + 126564: 9, + 126567: 10, + 126568: 12, + 126569: 7, + 126570: 9, + 126572: 9, + 126573: 7, + 126574: 13, + 126575: 10, + 126576: 9, + 126577: 13, + 126578: 9, + 126580: 13, + 126581: 7, + 126582: 7, + 126583: 10, + 126585: 13, + 126586: 12, + 126587: 10, + 126588: 7, + 126590: 9, + 127024: 15, + 127025: 15, + 127026: 15, + 127027: 15, + 127028: 15, + 127029: 15, + 127030: 15, + 127031: 15, + 127032: 15, + 127033: 15, + 127034: 15, + 127035: 15, + 127036: 15, + 127037: 15, + 127038: 15, + 127039: 15, + 127040: 15, + 127041: 15, + 127042: 15, + 127043: 15, + 127044: 15, + 127045: 15, + 127046: 15, + 127047: 15, + 127048: 15, + 127049: 15, + 127050: 15, + 127051: 15, + 127052: 15, + 127053: 15, + 127054: 15, + 127055: 15, + 127056: 15, + 127057: 15, + 127058: 15, + 127059: 15, + 127060: 15, + 127061: 15, + 127062: 15, + 127063: 15, + 127064: 15, + 127065: 15, + 127066: 15, + 127067: 15, + 127068: 15, + 127069: 15, + 127070: 15, + 127071: 15, + 127072: 15, + 127073: 15, + 127074: 9, + 127075: 9, + 127076: 9, + 127077: 9, + 127078: 9, + 127079: 9, + 127080: 9, + 127081: 9, + 127082: 9, + 127083: 9, + 127084: 9, + 127085: 9, + 127086: 9, + 127087: 9, + 127088: 9, + 127089: 9, + 127090: 9, + 127091: 9, + 127092: 9, + 127093: 9, + 127094: 9, + 127095: 9, + 127096: 9, + 127097: 9, + 127098: 9, + 127099: 9, + 127100: 9, + 127101: 9, + 127102: 9, + 127103: 9, + 127104: 9, + 127105: 9, + 127106: 9, + 127107: 9, + 127108: 9, + 127109: 9, + 127110: 9, + 127111: 9, + 127112: 9, + 127113: 9, + 127114: 9, + 127115: 9, + 127116: 9, + 127117: 9, + 127118: 9, + 127119: 9, + 127120: 9, + 127121: 9, + 127122: 9, + 127123: 9, + 127136: 11, + 127137: 11, + 127138: 11, + 127139: 11, + 127140: 11, + 127141: 11, + 127142: 11, + 127143: 11, + 127144: 11, + 127145: 11, + 127146: 11, + 127147: 11, + 127148: 11, + 127149: 11, + 127150: 11, + 127153: 11, + 127154: 11, + 127155: 11, + 127156: 11, + 127157: 11, + 127158: 11, + 127159: 11, + 127160: 11, + 127161: 11, + 127162: 11, + 127163: 11, + 127164: 11, + 127165: 11, + 127166: 11, + 127169: 11, + 127170: 11, + 127171: 11, + 127172: 11, + 127173: 11, + 127174: 11, + 127175: 11, + 127176: 11, + 127177: 11, + 127178: 11, + 127179: 11, + 127180: 11, + 127181: 11, + 127182: 11, + 127183: 11, + 127185: 11, + 127186: 11, + 127187: 11, + 127188: 11, + 127189: 11, + 127190: 11, + 127191: 11, + 127192: 11, + 127193: 11, + 127194: 11, + 127195: 11, + 127196: 11, + 127197: 11, + 127198: 11, + 127199: 11, + 127761: 11, + 127762: 11, + 127763: 11, + 127764: 11, + 127765: 11, + 127766: 11, + 127767: 11, + 127768: 11, + 128045: 11, + 128046: 13, + 128049: 11, + 128053: 13, + 128512: 11, + 128513: 11, + 128514: 13, + 128515: 11, + 128516: 11, + 128517: 11, + 128518: 11, + 128519: 11, + 128520: 11, + 128521: 11, + 128522: 11, + 128523: 11, + 128524: 11, + 128525: 11, + 128526: 11, + 128527: 11, + 128528: 11, + 128529: 11, + 128530: 11, + 128531: 11, + 128532: 11, + 128533: 11, + 128534: 11, + 128535: 11, + 128536: 11, + 128537: 11, + 128538: 11, + 128539: 11, + 128540: 11, + 128541: 11, + 128542: 11, + 128543: 11, + 128544: 11, + 128545: 11, + 128546: 11, + 128547: 11, + 128549: 11, + 128550: 11, + 128551: 11, + 128552: 11, + 128553: 11, + 128554: 11, + 128555: 11, + 128557: 13, + 128558: 11, + 128559: 11, + 128560: 11, + 128561: 11, + 128562: 11, + 128563: 11, + 128564: 18, + 128565: 11, + 128566: 11, + 128567: 11, + 128568: 11, + 128569: 13, + 128570: 11, + 128571: 11, + 128572: 11, + 128573: 11, + 128574: 11, + 128575: 11, + 128576: 11, + 128579: 11, +} From 884976437684f2f0c61e09d1c2b266c7217abe85 Mon Sep 17 00:00:00 2001 From: bytedream Date: Wed, 26 Mar 2025 13:32:01 +0100 Subject: [PATCH 03/14] Fallback to font width of 'm' if char width data is missing --- modules/badge/badge.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/badge/badge.go b/modules/badge/badge.go index 60ce1d5f07c71..9089151194252 100644 --- a/modules/badge/badge.go +++ b/modules/badge/badge.go @@ -4,6 +4,8 @@ package badge import ( + "unicode" + actions_model "code.gitea.io/gitea/models/actions" ) @@ -90,7 +92,12 @@ func calculateTextWidth(text string) int { for _, char := range text { charWidth, ok := DejaVuFontWidthData[char] if !ok { - charWidth = 0 + // use the width of 'm' in case of missing font width data for a printable character + if unicode.IsPrint(char) { + charWidth = DejaVuFontWidthData['m'] + } else { + charWidth = 0 + } } width += int(charWidth) } From 5af1264e8a0a9f1676d5413da9aa405b04b49dc6 Mon Sep 17 00:00:00 2001 From: bytedream Date: Wed, 26 Mar 2025 13:40:10 +0100 Subject: [PATCH 04/14] Add Verdana font and use DejaVu Sans as first --- templates/shared/actions/runner_badge.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/shared/actions/runner_badge.tmpl b/templates/shared/actions/runner_badge.tmpl index bbace44f6bcf8..63f2fc50f20ee 100644 --- a/templates/shared/actions/runner_badge.tmpl +++ b/templates/shared/actions/runner_badge.tmpl @@ -13,7 +13,7 @@ - From 458d55c17109ce5906a752033bfa035d42235168 Mon Sep 17 00:00:00 2001 From: bytedream Date: Thu, 27 Mar 2025 14:59:24 +0100 Subject: [PATCH 05/14] Only generate font width up to unicode.MaxLatin1 --- build/generate-font-width.go | 4 +- modules/badge/badge_font_width.go | 5781 +---------------------------- 2 files changed, 192 insertions(+), 5593 deletions(-) diff --git a/build/generate-font-width.go b/build/generate-font-width.go index 564ab98dbd1b5..5b4e86659f863 100644 --- a/build/generate-font-width.go +++ b/build/generate-font-width.go @@ -31,8 +31,8 @@ func main() { ttfFont := extractFont() - str := "map[rune]int32{\n" - for r := rune(0); r <= unicode.MaxRune; r++ { + str := "map[rune]uint8{\n" + for r := rune(0); r <= unicode.MaxLatin1; r++ { if !unicode.IsPrint(r) { continue } diff --git a/modules/badge/badge_font_width.go b/modules/badge/badge_font_width.go index 456d80684e018..5cc6c4a471034 100644 --- a/modules/badge/badge_font_width.go +++ b/modules/badge/badge_font_width.go @@ -5,5595 +5,194 @@ package badge // Code generated by build/generate-font-width.go. DO NOT EDIT. // Sourced from https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip -var DejaVuFontWidthData = map[rune]int32{ - 32: 3, - 33: 4, - 34: 5, - 35: 9, - 36: 7, - 37: 10, - 38: 9, - 39: 3, - 40: 4, - 41: 4, - 42: 6, - 43: 9, - 44: 3, - 45: 4, - 46: 3, - 47: 4, - 48: 7, - 49: 7, - 50: 7, - 51: 7, - 52: 7, - 53: 7, - 54: 7, - 55: 7, - 56: 7, - 57: 7, - 58: 4, - 59: 4, - 60: 9, - 61: 9, - 62: 9, - 63: 6, - 64: 11, - 65: 8, - 66: 8, - 67: 8, - 68: 8, - 69: 7, - 70: 6, - 71: 9, - 72: 8, - 73: 3, - 74: 3, - 75: 7, - 76: 6, - 77: 9, - 78: 8, - 79: 9, - 80: 7, - 81: 9, - 82: 8, - 83: 7, - 84: 7, - 85: 8, - 86: 8, - 87: 11, - 88: 8, - 89: 7, - 90: 8, - 91: 4, - 92: 4, - 93: 4, - 94: 9, - 95: 6, - 96: 6, - 97: 7, - 98: 7, - 99: 6, - 100: 7, - 101: 7, - 102: 4, - 103: 7, - 104: 7, - 105: 3, - 106: 3, - 107: 6, - 108: 3, - 109: 11, - 110: 7, - 111: 7, - 112: 7, - 113: 7, - 114: 5, - 115: 6, - 116: 4, - 117: 7, - 118: 7, - 119: 9, - 120: 7, - 121: 7, - 122: 6, - 123: 7, - 124: 4, - 125: 7, - 126: 9, - 161: 4, - 162: 7, - 163: 7, - 164: 7, - 165: 7, - 166: 4, - 167: 6, - 168: 6, - 169: 11, - 170: 5, - 171: 7, - 172: 9, - 174: 11, - 175: 6, - 176: 6, - 177: 9, - 178: 4, - 179: 4, - 180: 6, - 181: 7, - 182: 7, - 183: 3, - 184: 6, - 185: 4, - 186: 5, - 187: 7, - 188: 11, - 189: 11, - 190: 11, - 191: 6, - 192: 8, - 193: 8, - 194: 8, - 195: 8, - 196: 8, - 197: 8, - 198: 11, - 199: 8, - 200: 7, - 201: 7, - 202: 7, - 203: 7, - 204: 3, - 205: 3, - 206: 3, - 207: 3, - 208: 9, - 209: 8, - 210: 9, - 211: 9, - 212: 9, - 213: 9, - 214: 9, - 215: 9, - 216: 9, - 217: 8, - 218: 8, - 219: 8, - 220: 8, - 221: 7, - 222: 7, - 223: 7, - 224: 7, - 225: 7, - 226: 7, - 227: 7, - 228: 7, - 229: 7, - 230: 11, - 231: 6, - 232: 7, - 233: 7, - 234: 7, - 235: 7, - 236: 3, - 237: 3, - 238: 3, - 239: 3, - 240: 7, - 241: 7, - 242: 7, - 243: 7, - 244: 7, - 245: 7, - 246: 7, - 247: 9, - 248: 7, - 249: 7, - 250: 7, - 251: 7, - 252: 7, - 253: 7, - 254: 7, - 255: 7, - 256: 8, - 257: 7, - 258: 8, - 259: 7, - 260: 8, - 261: 7, - 262: 8, - 263: 6, - 264: 8, - 265: 6, - 266: 8, - 267: 6, - 268: 8, - 269: 6, - 270: 8, - 271: 7, - 272: 9, - 273: 7, - 274: 7, - 275: 7, - 276: 7, - 277: 7, - 278: 7, - 279: 7, - 280: 7, - 281: 7, - 282: 7, - 283: 7, - 284: 9, - 285: 7, - 286: 9, - 287: 7, - 288: 9, - 289: 7, - 290: 9, - 291: 7, - 292: 8, - 293: 7, - 294: 10, - 295: 8, - 296: 3, - 297: 3, - 298: 3, - 299: 3, - 300: 3, - 301: 3, - 302: 3, - 303: 3, - 304: 3, - 305: 3, - 306: 6, - 307: 6, - 308: 3, - 309: 3, - 310: 7, - 311: 6, - 312: 6, - 313: 6, - 314: 3, - 315: 6, - 316: 3, - 317: 6, - 318: 4, - 319: 6, - 320: 4, - 321: 6, - 322: 3, - 323: 8, - 324: 7, - 325: 8, - 326: 7, - 327: 8, - 328: 7, - 329: 9, - 330: 8, - 331: 7, - 332: 9, - 333: 7, - 334: 9, - 335: 7, - 336: 9, - 337: 7, - 338: 12, - 339: 11, - 340: 8, - 341: 5, - 342: 8, - 343: 5, - 344: 8, - 345: 5, - 346: 7, - 347: 6, - 348: 7, - 349: 6, - 350: 7, - 351: 6, - 352: 7, - 353: 6, - 354: 7, - 355: 4, - 356: 7, - 357: 4, - 358: 7, - 359: 4, - 360: 8, - 361: 7, - 362: 8, - 363: 7, - 364: 8, - 365: 7, - 366: 8, - 367: 7, - 368: 8, - 369: 7, - 370: 8, - 371: 7, - 372: 11, - 373: 9, - 374: 7, - 375: 7, - 376: 7, - 377: 8, - 378: 6, - 379: 8, - 380: 6, - 381: 8, - 382: 6, - 383: 4, - 384: 7, - 385: 8, - 386: 8, - 387: 7, - 388: 8, - 389: 7, - 390: 8, - 391: 8, - 392: 6, - 393: 9, - 394: 9, - 395: 8, - 396: 7, - 397: 7, - 398: 7, - 399: 9, - 400: 7, - 401: 6, - 402: 4, - 403: 9, - 404: 8, - 405: 11, - 406: 4, - 407: 3, - 408: 8, - 409: 6, - 410: 3, - 411: 7, - 412: 11, - 413: 8, - 414: 7, - 415: 9, - 416: 10, - 417: 7, - 418: 10, - 419: 8, - 420: 7, - 421: 7, - 422: 8, - 423: 7, - 424: 6, - 425: 7, - 426: 4, - 427: 4, - 428: 7, - 429: 4, - 430: 7, - 431: 9, - 432: 7, - 433: 8, - 434: 8, - 435: 8, - 436: 8, - 437: 8, - 438: 6, - 439: 7, - 440: 7, - 441: 6, - 442: 6, - 443: 7, - 444: 7, - 445: 6, - 446: 6, - 447: 7, - 448: 3, - 449: 5, - 450: 5, - 451: 3, - 452: 16, - 453: 14, - 454: 13, - 455: 9, - 456: 9, - 457: 5, - 458: 10, - 459: 10, - 460: 9, - 461: 8, - 462: 7, - 463: 3, - 464: 3, - 465: 9, - 466: 7, - 467: 8, - 468: 7, - 469: 8, - 470: 7, - 471: 8, - 472: 7, - 473: 8, - 474: 7, - 475: 8, - 476: 7, - 477: 7, - 478: 8, - 479: 7, - 480: 8, - 481: 7, - 482: 11, - 483: 11, - 484: 9, - 485: 7, - 486: 9, - 487: 7, - 488: 7, - 489: 6, - 490: 9, - 491: 7, - 492: 9, - 493: 7, - 494: 7, - 495: 6, - 496: 3, - 497: 16, - 498: 14, - 499: 13, - 500: 9, - 501: 7, - 502: 12, - 503: 8, - 504: 8, - 505: 7, - 506: 8, - 507: 7, - 508: 11, - 509: 11, - 510: 9, - 511: 7, - 512: 8, - 513: 7, - 514: 8, - 515: 7, - 516: 7, - 517: 7, - 518: 7, - 519: 7, - 520: 3, - 521: 3, - 522: 3, - 523: 3, - 524: 9, - 525: 7, - 526: 9, - 527: 7, - 528: 8, - 529: 5, - 530: 8, - 531: 5, - 532: 8, - 533: 7, - 534: 8, - 535: 7, - 536: 7, - 537: 6, - 538: 7, - 539: 4, - 540: 7, - 541: 6, - 542: 8, - 543: 7, - 544: 8, - 545: 9, - 546: 8, - 547: 7, - 548: 8, - 549: 6, - 550: 8, - 551: 7, - 552: 7, - 553: 7, - 554: 9, - 555: 7, - 556: 9, - 557: 7, - 558: 9, - 559: 7, - 560: 9, - 561: 7, - 562: 7, - 563: 7, - 564: 5, - 565: 9, - 566: 5, - 567: 3, - 568: 11, - 569: 11, - 570: 8, - 571: 8, - 572: 6, - 573: 6, - 574: 7, - 575: 6, - 576: 6, - 577: 7, - 578: 5, - 579: 8, - 580: 8, - 581: 8, - 582: 7, - 583: 7, - 584: 3, - 585: 3, - 586: 9, - 587: 7, - 588: 8, - 589: 5, - 590: 7, - 591: 7, - 592: 7, - 593: 7, - 594: 7, - 595: 7, - 596: 6, - 597: 6, - 598: 7, - 599: 8, - 600: 7, - 601: 7, - 602: 9, - 603: 6, - 604: 6, - 605: 9, - 606: 7, - 607: 3, - 608: 8, - 609: 7, - 610: 7, - 611: 7, - 612: 7, - 613: 7, - 614: 7, - 615: 7, - 616: 3, - 617: 4, - 618: 4, - 619: 4, - 620: 5, - 621: 3, - 622: 8, - 623: 11, - 624: 11, - 625: 11, - 626: 7, - 627: 7, - 628: 7, - 629: 7, - 630: 9, - 631: 8, - 632: 7, - 633: 5, - 634: 5, - 635: 5, - 636: 5, - 637: 5, - 638: 6, - 639: 6, - 640: 7, - 641: 7, - 642: 6, - 643: 4, - 644: 4, - 645: 5, - 646: 4, - 647: 4, - 648: 4, - 649: 7, - 650: 7, - 651: 7, - 652: 7, - 653: 9, - 654: 7, - 655: 7, - 656: 6, - 657: 6, - 658: 6, - 659: 6, - 660: 6, - 661: 6, - 662: 6, - 663: 6, - 664: 9, - 665: 6, - 666: 7, - 667: 8, - 668: 7, - 669: 3, - 670: 7, - 671: 6, - 672: 8, - 673: 6, - 674: 6, - 675: 11, - 676: 12, - 677: 11, - 678: 9, - 679: 7, - 680: 9, - 681: 9, - 682: 8, - 683: 7, - 684: 6, - 685: 6, - 686: 7, - 687: 7, - 688: 4, - 689: 4, - 690: 2, - 691: 3, - 692: 3, - 693: 3, - 694: 4, - 695: 6, - 696: 4, - 697: 3, - 698: 5, - 699: 3, - 700: 3, - 701: 3, - 702: 3, - 703: 3, - 704: 4, - 705: 4, - 706: 6, - 707: 6, - 708: 6, - 709: 6, - 710: 6, - 711: 6, - 712: 3, - 713: 6, - 714: 6, - 715: 6, - 716: 3, - 717: 6, - 718: 6, - 719: 6, - 720: 4, - 721: 4, - 722: 3, - 723: 3, - 724: 6, - 725: 6, - 726: 4, - 727: 3, - 728: 6, - 729: 6, - 730: 6, - 731: 6, - 732: 6, - 733: 6, - 734: 3, - 735: 6, - 736: 5, - 737: 2, - 738: 4, - 739: 5, - 740: 4, - 741: 5, - 742: 5, - 743: 5, - 744: 5, - 745: 5, - 748: 6, - 749: 6, - 750: 6, - 755: 6, - 759: 6, - 880: 7, - 881: 6, - 882: 9, - 883: 7, - 884: 3, - 885: 3, - 886: 8, - 887: 7, - 890: 6, - 891: 6, - 892: 6, - 893: 6, - 894: 4, - 895: 3, - 900: 6, - 901: 6, - 902: 8, - 903: 3, - 904: 8, - 905: 10, - 906: 4, - 908: 9, - 910: 9, - 911: 9, - 912: 4, - 913: 8, - 914: 8, - 915: 6, - 916: 8, - 917: 7, - 918: 8, - 919: 8, - 920: 9, - 921: 3, - 922: 7, - 923: 8, - 924: 9, - 925: 8, - 926: 7, - 927: 9, - 928: 8, - 929: 7, - 931: 7, - 932: 7, - 933: 7, - 934: 9, - 935: 8, - 936: 9, - 937: 8, - 938: 3, - 939: 7, - 940: 7, - 941: 6, - 942: 7, - 943: 4, - 944: 6, - 945: 7, - 946: 7, - 947: 7, - 948: 7, - 949: 6, - 950: 6, - 951: 7, - 952: 7, - 953: 4, - 954: 6, - 955: 7, - 956: 7, - 957: 6, - 958: 6, - 959: 7, - 960: 7, - 961: 7, - 962: 6, - 963: 7, - 964: 7, - 965: 6, - 966: 7, - 967: 6, - 968: 7, - 969: 9, - 970: 4, - 971: 6, - 972: 7, - 973: 6, - 974: 9, - 975: 7, - 976: 7, - 977: 7, - 978: 8, - 979: 9, - 980: 8, - 981: 7, - 982: 9, - 983: 7, - 984: 9, - 985: 7, - 986: 7, - 987: 6, - 988: 6, - 989: 5, - 990: 7, - 991: 7, - 992: 10, - 993: 7, - 994: 10, - 995: 9, - 996: 8, - 997: 7, - 998: 9, - 999: 7, - 1000: 8, - 1001: 7, - 1002: 8, - 1003: 7, - 1004: 8, - 1005: 7, - 1006: 7, - 1007: 6, - 1008: 7, - 1009: 7, - 1010: 6, - 1011: 3, - 1012: 9, - 1013: 7, - 1014: 7, - 1015: 7, - 1016: 7, - 1017: 8, - 1018: 9, - 1019: 7, - 1020: 7, - 1021: 8, - 1022: 8, - 1023: 8, - 1024: 7, - 1025: 7, - 1026: 9, - 1027: 7, - 1028: 8, - 1029: 7, - 1030: 3, - 1031: 3, - 1032: 3, - 1033: 12, - 1034: 11, - 1035: 9, - 1036: 8, - 1037: 8, - 1038: 7, - 1039: 8, - 1040: 8, - 1041: 8, - 1042: 8, - 1043: 7, - 1044: 9, - 1045: 7, - 1046: 12, - 1047: 7, - 1048: 8, - 1049: 8, - 1050: 8, - 1051: 8, - 1052: 9, - 1053: 8, - 1054: 9, - 1055: 8, - 1056: 7, - 1057: 8, - 1058: 7, - 1059: 7, - 1060: 9, - 1061: 8, - 1062: 9, - 1063: 8, - 1064: 12, - 1065: 12, - 1066: 9, - 1067: 10, - 1068: 8, - 1069: 8, - 1070: 12, - 1071: 8, - 1072: 7, - 1073: 7, - 1074: 6, - 1075: 6, - 1076: 8, - 1077: 7, - 1078: 10, - 1079: 6, - 1080: 7, - 1081: 7, - 1082: 7, - 1083: 7, - 1084: 8, - 1085: 7, - 1086: 7, - 1087: 7, - 1088: 7, - 1089: 6, - 1090: 6, - 1091: 7, - 1092: 9, - 1093: 7, - 1094: 7, - 1095: 6, - 1096: 10, - 1097: 10, - 1098: 8, - 1099: 9, - 1100: 6, - 1101: 6, - 1102: 9, - 1103: 7, - 1104: 7, - 1105: 7, - 1106: 7, - 1107: 6, - 1108: 6, - 1109: 6, - 1110: 3, - 1111: 3, - 1112: 3, - 1113: 10, - 1114: 10, - 1115: 7, - 1116: 7, - 1117: 7, - 1118: 7, - 1119: 7, - 1120: 10, - 1121: 9, - 1122: 8, - 1123: 7, - 1124: 10, - 1125: 8, - 1126: 10, - 1127: 9, - 1128: 13, - 1129: 11, - 1130: 9, - 1131: 7, - 1132: 11, - 1133: 9, - 1134: 7, - 1135: 6, - 1136: 9, - 1137: 10, - 1138: 9, - 1139: 7, - 1140: 9, - 1141: 7, - 1142: 9, - 1143: 7, - 1144: 11, - 1145: 10, - 1146: 10, - 1147: 8, - 1148: 13, - 1149: 11, - 1150: 10, - 1151: 9, - 1152: 8, - 1153: 6, - 1154: 6, - 1160: 5, - 1161: 5, - 1162: 8, - 1163: 7, - 1164: 8, - 1165: 6, - 1166: 7, - 1167: 7, - 1168: 7, - 1169: 6, - 1170: 7, - 1171: 6, - 1172: 7, - 1173: 6, - 1174: 12, - 1175: 10, - 1176: 7, - 1177: 6, - 1178: 8, - 1179: 7, - 1180: 8, - 1181: 7, - 1182: 8, - 1183: 7, - 1184: 9, - 1185: 9, - 1186: 8, - 1187: 7, - 1188: 11, - 1189: 10, - 1190: 12, - 1191: 10, - 1192: 10, - 1193: 8, - 1194: 8, - 1195: 6, - 1196: 7, - 1197: 6, - 1198: 7, - 1199: 7, - 1200: 7, - 1201: 7, - 1202: 8, - 1203: 7, - 1204: 10, - 1205: 9, - 1206: 8, - 1207: 6, - 1208: 8, - 1209: 6, - 1210: 8, - 1211: 7, - 1212: 10, - 1213: 8, - 1214: 10, - 1215: 8, - 1216: 3, - 1217: 12, - 1218: 10, - 1219: 7, - 1220: 7, - 1221: 9, - 1222: 7, - 1223: 8, - 1224: 7, - 1225: 9, - 1226: 7, - 1227: 8, - 1228: 6, - 1229: 10, - 1230: 9, - 1231: 3, - 1232: 8, - 1233: 7, - 1234: 8, - 1235: 7, - 1236: 11, - 1237: 11, - 1238: 7, - 1239: 7, - 1240: 9, - 1241: 7, - 1242: 9, - 1243: 7, - 1244: 12, - 1245: 10, - 1246: 7, - 1247: 6, - 1248: 7, - 1249: 6, - 1250: 8, - 1251: 7, - 1252: 8, - 1253: 7, - 1254: 9, - 1255: 7, - 1256: 9, - 1257: 7, - 1258: 9, - 1259: 7, - 1260: 8, - 1261: 6, - 1262: 7, - 1263: 7, - 1264: 7, - 1265: 7, - 1266: 7, - 1267: 7, - 1268: 8, - 1269: 6, - 1270: 7, - 1271: 6, - 1272: 10, - 1273: 9, - 1274: 7, - 1275: 6, - 1276: 8, - 1277: 7, - 1278: 8, - 1279: 7, - 1280: 8, - 1281: 6, - 1282: 11, - 1283: 10, - 1284: 11, - 1285: 10, - 1286: 7, - 1287: 6, - 1288: 12, - 1289: 11, - 1290: 12, - 1291: 11, - 1292: 9, - 1293: 7, - 1294: 9, - 1295: 8, - 1296: 7, - 1297: 6, - 1298: 8, - 1299: 7, - 1300: 13, - 1301: 11, - 1302: 10, - 1303: 10, - 1304: 11, - 1305: 11, - 1306: 9, - 1307: 7, - 1308: 11, - 1309: 9, - 1310: 8, - 1311: 7, - 1312: 12, - 1313: 10, - 1314: 12, - 1315: 10, - 1316: 9, - 1317: 8, - 1329: 8, - 1330: 8, - 1331: 8, - 1332: 8, - 1333: 8, - 1334: 8, - 1335: 7, - 1336: 8, - 1337: 9, - 1338: 8, - 1339: 8, - 1340: 6, - 1341: 10, - 1342: 9, - 1343: 8, - 1344: 8, - 1345: 8, - 1346: 8, - 1347: 8, - 1348: 9, - 1349: 8, - 1350: 8, - 1351: 8, - 1352: 8, - 1353: 8, - 1354: 9, - 1355: 8, - 1356: 9, - 1357: 8, - 1358: 8, - 1359: 8, - 1360: 8, - 1361: 8, - 1362: 6, - 1363: 9, - 1364: 8, - 1365: 9, - 1366: 9, - 1369: 3, - 1370: 3, - 1371: 3, - 1372: 4, - 1373: 3, - 1374: 4, - 1375: 6, - 1377: 11, - 1378: 7, - 1379: 7, - 1380: 7, - 1381: 7, - 1382: 7, - 1383: 6, - 1384: 7, - 1385: 8, - 1386: 7, - 1387: 7, - 1388: 3, - 1389: 11, - 1390: 7, - 1391: 7, - 1392: 7, - 1393: 7, - 1394: 7, - 1395: 7, - 1396: 7, - 1397: 3, - 1398: 7, - 1399: 5, - 1400: 7, - 1401: 4, - 1402: 11, - 1403: 6, - 1404: 7, - 1405: 7, - 1406: 7, - 1407: 11, - 1408: 7, - 1409: 7, - 1410: 5, - 1411: 11, - 1412: 7, - 1413: 7, - 1414: 9, - 1415: 9, - 1417: 4, - 1418: 4, - 1470: 4, - 1472: 3, - 1475: 3, - 1478: 5, - 1488: 7, - 1489: 6, - 1490: 5, - 1491: 6, - 1492: 7, - 1493: 3, - 1494: 4, - 1495: 7, - 1496: 7, - 1497: 2, - 1498: 6, - 1499: 6, - 1500: 6, - 1501: 7, - 1502: 7, - 1503: 3, - 1504: 4, - 1505: 7, - 1506: 7, - 1507: 7, - 1508: 7, - 1509: 6, - 1510: 7, - 1511: 8, - 1512: 6, - 1513: 8, - 1514: 7, - 1520: 5, - 1521: 5, - 1522: 4, - 1523: 5, - 1524: 7, - 1542: 7, - 1543: 7, - 1545: 8, - 1546: 11, - 1548: 4, - 1563: 3, - 1567: 6, - 1569: 5, - 1570: 3, - 1571: 3, - 1572: 5, - 1573: 3, - 1574: 9, - 1575: 3, - 1576: 10, - 1577: 6, - 1578: 10, - 1579: 10, - 1580: 7, - 1581: 7, - 1582: 7, - 1583: 5, - 1584: 5, - 1585: 5, - 1586: 5, - 1587: 13, - 1588: 13, - 1589: 13, - 1590: 13, - 1591: 10, - 1592: 10, - 1593: 7, - 1594: 7, - 1600: 3, - 1601: 11, - 1602: 9, - 1603: 9, - 1604: 8, - 1605: 7, - 1606: 8, - 1607: 6, - 1608: 5, - 1609: 9, - 1610: 9, - 1626: 6, - 1632: 6, - 1633: 6, - 1634: 6, - 1635: 6, - 1636: 6, - 1637: 6, - 1638: 6, - 1639: 6, - 1640: 6, - 1641: 6, - 1642: 6, - 1643: 4, - 1644: 3, - 1645: 6, - 1646: 10, - 1647: 9, - 1652: 3, - 1657: 10, - 1658: 10, - 1659: 10, - 1660: 10, - 1661: 10, - 1662: 10, - 1663: 10, - 1664: 10, - 1665: 7, - 1666: 7, - 1667: 7, - 1668: 7, - 1669: 7, - 1670: 7, - 1671: 7, - 1672: 5, - 1673: 5, - 1674: 5, - 1675: 5, - 1676: 5, - 1677: 5, - 1678: 5, - 1679: 5, - 1680: 5, - 1681: 5, - 1682: 5, - 1683: 5, - 1684: 6, - 1685: 7, - 1686: 6, - 1687: 5, - 1688: 5, - 1689: 5, - 1690: 13, - 1691: 13, - 1692: 13, - 1693: 13, - 1694: 13, - 1695: 10, - 1696: 7, - 1697: 11, - 1698: 11, - 1699: 11, - 1700: 11, - 1701: 11, - 1702: 11, - 1703: 9, - 1704: 9, - 1705: 10, - 1706: 12, - 1707: 10, - 1708: 9, - 1709: 9, - 1710: 9, - 1711: 10, - 1712: 10, - 1713: 10, - 1714: 10, - 1715: 10, - 1716: 10, - 1717: 8, - 1718: 8, - 1719: 8, - 1720: 8, - 1721: 8, - 1722: 8, - 1723: 8, - 1724: 8, - 1725: 8, - 1726: 8, - 1727: 7, - 1734: 5, - 1735: 5, - 1736: 5, - 1739: 5, - 1740: 9, - 1742: 9, - 1744: 9, - 1749: 6, - 1776: 6, - 1777: 6, - 1778: 6, - 1779: 6, - 1780: 6, - 1781: 6, - 1782: 6, - 1783: 6, - 1784: 6, - 1785: 6, - 1984: 7, - 1985: 7, - 1986: 7, - 1987: 7, - 1988: 7, - 1989: 7, - 1990: 7, - 1991: 7, - 1992: 7, - 1993: 7, - 1994: 3, - 1995: 6, - 1996: 5, - 1997: 7, - 1998: 7, - 1999: 7, - 2000: 7, - 2001: 7, - 2002: 9, - 2003: 5, - 2004: 5, - 2005: 6, - 2006: 7, - 2007: 4, - 2008: 11, - 2009: 5, - 2010: 9, - 2011: 7, - 2012: 7, - 2013: 8, - 2014: 6, - 2015: 8, - 2016: 5, - 2017: 7, - 2018: 7, - 2019: 6, - 2020: 6, - 2021: 6, - 2022: 7, - 2023: 7, - 2036: 3, - 2037: 3, - 2040: 6, - 2041: 6, - 2042: 4, - 3647: 7, - 3713: 7, - 3714: 8, - 3716: 8, - 3719: 5, - 3720: 7, - 3722: 8, - 3725: 8, - 3732: 7, - 3733: 7, - 3734: 7, - 3735: 7, - 3737: 7, - 3738: 7, - 3739: 7, - 3740: 8, - 3741: 8, - 3742: 8, - 3743: 8, - 3745: 8, - 3746: 8, - 3747: 8, - 3749: 7, - 3751: 7, - 3754: 8, - 3755: 9, - 3757: 7, - 3758: 8, - 3759: 9, - 3760: 7, - 3762: 6, - 3763: 6, - 3773: 7, - 3776: 4, - 3777: 7, - 3778: 5, - 3779: 6, - 3780: 5, - 3782: 7, - 3792: 7, - 3793: 7, - 3794: 7, - 3795: 7, - 3796: 7, - 3797: 7, - 3798: 8, - 3799: 7, - 3800: 7, - 3801: 7, - 3804: 11, - 3805: 11, - 4256: 10, - 4257: 8, - 4258: 7, - 4259: 9, - 4260: 7, - 4261: 8, - 4262: 8, - 4263: 10, - 4264: 5, - 4265: 7, - 4266: 9, - 4267: 10, - 4268: 7, - 4269: 9, - 4270: 9, - 4271: 7, - 4272: 10, - 4273: 7, - 4274: 7, - 4275: 9, - 4276: 10, - 4277: 8, - 4278: 7, - 4279: 7, - 4280: 7, - 4281: 7, - 4282: 9, - 4283: 10, - 4284: 7, - 4285: 7, - 4286: 7, - 4287: 8, - 4288: 9, - 4289: 7, - 4290: 8, - 4291: 7, - 4292: 7, - 4293: 8, - 4304: 6, - 4305: 6, - 4306: 6, - 4307: 9, - 4308: 6, - 4309: 6, - 4310: 6, - 4311: 9, - 4312: 6, - 4313: 6, - 4314: 12, - 4315: 6, - 4316: 6, - 4317: 9, - 4318: 6, - 4319: 6, - 4320: 9, - 4321: 6, - 4322: 7, - 4323: 6, - 4324: 9, - 4325: 6, - 4326: 9, - 4327: 6, - 4328: 6, - 4329: 6, - 4330: 6, - 4331: 6, - 4332: 6, - 4333: 6, - 4334: 6, - 4335: 5, - 4336: 6, - 4337: 6, - 4338: 6, - 4339: 6, - 4340: 6, - 4341: 6, - 4342: 9, - 4343: 6, - 4344: 6, - 4345: 6, - 4346: 6, - 4347: 5, - 4348: 4, - 5121: 8, - 5122: 8, - 5123: 8, - 5124: 8, - 5125: 8, - 5126: 8, - 5127: 8, - 5129: 8, - 5130: 8, - 5131: 8, - 5132: 9, - 5133: 9, - 5134: 9, - 5135: 9, - 5136: 9, - 5137: 9, - 5138: 11, - 5139: 11, - 5140: 11, - 5141: 11, - 5142: 8, - 5143: 11, - 5144: 11, - 5145: 11, - 5146: 11, - 5147: 8, - 5149: 3, - 5150: 6, - 5151: 5, - 5152: 5, - 5153: 4, - 5154: 4, - 5155: 4, - 5156: 4, - 5157: 5, - 5158: 4, - 5159: 3, - 5160: 4, - 5161: 4, - 5162: 4, - 5163: 12, - 5164: 10, - 5165: 10, - 5166: 12, - 5167: 8, - 5168: 8, - 5169: 8, - 5170: 8, - 5171: 8, - 5172: 8, - 5173: 8, - 5175: 8, - 5176: 8, - 5177: 8, - 5178: 9, - 5179: 8, - 5180: 9, - 5181: 9, - 5182: 9, - 5183: 9, - 5184: 11, - 5185: 11, - 5186: 11, - 5187: 11, - 5188: 11, - 5189: 11, - 5190: 11, - 5191: 11, - 5192: 8, - 5193: 6, - 5194: 2, - 5196: 8, - 5197: 8, - 5198: 8, - 5199: 8, - 5200: 8, - 5201: 8, - 5202: 8, - 5204: 8, - 5205: 8, - 5206: 8, - 5207: 10, - 5208: 10, - 5209: 10, - 5210: 10, - 5211: 10, - 5212: 10, - 5213: 10, - 5214: 10, - 5215: 10, - 5216: 10, - 5217: 10, - 5218: 10, - 5219: 10, - 5220: 10, - 5221: 10, - 5222: 5, - 5223: 10, - 5224: 10, - 5225: 10, - 5226: 10, - 5227: 7, - 5228: 7, - 5229: 7, - 5230: 7, - 5231: 7, - 5232: 7, - 5233: 7, - 5234: 7, - 5235: 7, - 5236: 9, - 5237: 8, - 5238: 9, - 5239: 9, - 5240: 9, - 5241: 9, - 5242: 9, - 5243: 8, - 5244: 9, - 5245: 8, - 5246: 9, - 5247: 9, - 5248: 9, - 5249: 9, - 5250: 9, - 5251: 4, - 5252: 4, - 5253: 8, - 5254: 9, - 5255: 8, - 5256: 9, - 5257: 7, - 5258: 7, - 5259: 7, - 5260: 7, - 5261: 7, - 5262: 7, - 5263: 7, - 5264: 7, - 5265: 7, - 5266: 9, - 5267: 8, - 5268: 9, - 5269: 9, - 5270: 9, - 5271: 9, - 5272: 9, - 5273: 8, - 5274: 9, - 5275: 8, - 5276: 9, - 5277: 9, - 5278: 9, - 5279: 9, - 5280: 9, - 5281: 5, - 5282: 5, - 5283: 7, - 5284: 6, - 5285: 6, - 5286: 6, - 5287: 7, - 5288: 7, - 5289: 7, - 5290: 6, - 5291: 6, - 5292: 8, - 5293: 8, - 5294: 8, - 5295: 8, - 5296: 8, - 5297: 8, - 5298: 8, - 5299: 8, - 5300: 8, - 5301: 8, - 5302: 8, - 5303: 8, - 5304: 8, - 5305: 8, - 5306: 8, - 5307: 4, - 5308: 6, - 5309: 4, - 5312: 9, - 5313: 9, - 5314: 9, - 5315: 9, - 5316: 9, - 5317: 9, - 5318: 9, - 5319: 9, - 5320: 9, - 5321: 12, - 5322: 11, - 5323: 12, - 5324: 9, - 5325: 12, - 5326: 9, - 5327: 9, - 5328: 7, - 5329: 5, - 5330: 7, - 5331: 9, - 5332: 9, - 5333: 9, - 5334: 9, - 5335: 9, - 5336: 9, - 5337: 9, - 5338: 9, - 5339: 9, - 5340: 12, - 5341: 11, - 5342: 12, - 5343: 11, - 5344: 12, - 5345: 11, - 5346: 12, - 5347: 11, - 5348: 12, - 5349: 11, - 5350: 12, - 5351: 11, - 5352: 12, - 5353: 11, - 5354: 7, - 5356: 8, - 5357: 7, - 5358: 7, - 5359: 7, - 5360: 7, - 5361: 7, - 5362: 7, - 5363: 7, - 5364: 7, - 5365: 7, - 5366: 9, - 5367: 8, - 5368: 9, - 5369: 8, - 5370: 9, - 5371: 8, - 5372: 9, - 5373: 8, - 5374: 9, - 5375: 8, - 5376: 9, - 5377: 8, - 5378: 9, - 5379: 8, - 5380: 9, - 5381: 5, - 5382: 5, - 5383: 5, - 5392: 8, - 5393: 8, - 5394: 8, - 5395: 10, - 5396: 10, - 5397: 10, - 5398: 10, - 5399: 10, - 5400: 10, - 5401: 10, - 5402: 10, - 5403: 10, - 5404: 10, - 5405: 13, - 5406: 12, - 5407: 13, - 5408: 12, - 5409: 13, - 5410: 12, - 5411: 13, - 5412: 12, - 5413: 7, - 5414: 7, - 5415: 7, - 5416: 7, - 5417: 7, - 5418: 7, - 5419: 7, - 5420: 7, - 5421: 7, - 5422: 7, - 5423: 9, - 5424: 9, - 5425: 9, - 5426: 9, - 5427: 9, - 5428: 9, - 5429: 9, - 5430: 9, - 5431: 9, - 5432: 9, - 5433: 9, - 5434: 9, - 5435: 9, - 5436: 9, - 5437: 9, - 5438: 5, - 5440: 4, - 5441: 5, - 5442: 10, - 5443: 10, - 5444: 10, - 5445: 10, - 5446: 10, - 5447: 10, - 5448: 7, - 5449: 7, - 5450: 7, - 5451: 7, - 5452: 7, - 5453: 7, - 5454: 9, - 5455: 8, - 5456: 5, - 5458: 8, - 5459: 8, - 5460: 8, - 5461: 8, - 5462: 8, - 5463: 8, - 5464: 8, - 5465: 8, - 5466: 8, - 5467: 10, - 5468: 11, - 5469: 6, - 5470: 8, - 5471: 8, - 5472: 8, - 5473: 8, - 5474: 8, - 5475: 8, - 5476: 8, - 5477: 8, - 5478: 8, - 5479: 8, - 5480: 10, - 5481: 10, - 5482: 6, - 5492: 9, - 5493: 9, - 5494: 9, - 5495: 9, - 5496: 9, - 5497: 9, - 5498: 9, - 5499: 6, - 5500: 8, - 5501: 5, - 5502: 12, - 5503: 12, - 5504: 12, - 5505: 12, - 5506: 12, - 5507: 12, - 5508: 12, - 5509: 9, - 5514: 9, - 5515: 9, - 5516: 9, - 5517: 9, - 5518: 14, - 5519: 14, - 5520: 14, - 5521: 11, - 5522: 11, - 5523: 14, - 5524: 14, - 5525: 8, - 5526: 12, - 5536: 9, - 5537: 9, - 5538: 9, - 5539: 9, - 5540: 9, - 5541: 9, - 5542: 7, - 5543: 7, - 5544: 7, - 5545: 7, - 5546: 7, - 5547: 7, - 5548: 7, - 5549: 7, - 5550: 5, - 5551: 7, - 5598: 8, - 5601: 8, - 5702: 5, - 5703: 5, - 5742: 5, - 5743: 12, - 5744: 14, - 5745: 18, - 5746: 18, - 5747: 15, - 5748: 15, - 5749: 18, - 5750: 18, - 5761: 5, - 5762: 8, - 5763: 10, - 5764: 13, - 5765: 15, - 5766: 5, - 5767: 8, - 5768: 10, - 5769: 13, - 5770: 15, - 5771: 5, - 5772: 8, - 5773: 10, - 5774: 13, - 5775: 15, - 5776: 5, - 5777: 8, - 5778: 10, - 5779: 13, - 5780: 15, - 5781: 5, - 5782: 8, - 5783: 9, - 5784: 13, - 5785: 13, - 5786: 8, - 5787: 6, - 5788: 6, - 7424: 7, - 7425: 8, - 7426: 11, - 7427: 6, - 7428: 6, - 7429: 7, - 7430: 7, - 7431: 5, - 7432: 6, - 7433: 3, - 7434: 4, - 7435: 6, - 7436: 6, - 7437: 8, - 7438: 7, - 7439: 7, - 7440: 6, - 7441: 8, - 7442: 8, - 7443: 8, - 7444: 11, - 7446: 7, - 7447: 7, - 7448: 6, - 7449: 7, - 7450: 7, - 7451: 6, - 7452: 6, - 7453: 8, - 7454: 10, - 7455: 7, - 7456: 7, - 7457: 9, - 7458: 6, - 7459: 6, - 7462: 6, - 7463: 7, - 7464: 6, - 7465: 6, - 7466: 6, - 7467: 7, - 7468: 5, - 7469: 7, - 7470: 5, - 7472: 5, - 7473: 4, - 7474: 4, - 7475: 5, - 7476: 5, - 7477: 2, - 7478: 2, - 7479: 5, - 7480: 4, - 7481: 6, - 7482: 5, - 7483: 5, - 7484: 5, - 7485: 5, - 7486: 4, - 7487: 5, - 7488: 4, - 7489: 5, - 7490: 7, - 7491: 4, - 7492: 4, - 7493: 4, - 7494: 7, - 7495: 5, - 7496: 4, - 7497: 5, - 7498: 5, - 7499: 4, - 7500: 4, - 7501: 4, - 7502: 2, - 7503: 5, - 7504: 7, - 7505: 4, - 7506: 5, - 7507: 4, - 7508: 5, - 7509: 5, - 7510: 5, - 7511: 3, - 7512: 4, - 7513: 5, - 7514: 7, - 7515: 5, - 7517: 4, - 7518: 4, - 7519: 4, - 7520: 5, - 7521: 4, - 7522: 2, - 7523: 3, - 7524: 4, - 7525: 5, - 7526: 4, - 7527: 4, - 7528: 5, - 7529: 5, - 7530: 4, - 7543: 7, - 7544: 5, - 7547: 4, - 7549: 7, - 7557: 3, - 7579: 4, - 7580: 4, - 7581: 4, - 7582: 5, - 7583: 4, - 7584: 3, - 7585: 3, - 7586: 4, - 7587: 4, - 7588: 3, - 7589: 3, - 7590: 3, - 7591: 3, - 7592: 3, - 7593: 3, - 7594: 3, - 7595: 4, - 7596: 7, - 7597: 7, - 7598: 5, - 7599: 5, - 7600: 4, - 7601: 5, - 7602: 5, - 7603: 4, - 7604: 3, - 7605: 3, - 7606: 6, - 7607: 5, - 7608: 4, - 7609: 4, - 7610: 5, - 7611: 4, - 7612: 5, - 7613: 4, - 7614: 4, - 7615: 5, - 7680: 8, - 7681: 7, - 7682: 8, - 7683: 7, - 7684: 8, - 7685: 7, - 7686: 8, - 7687: 7, - 7688: 8, - 7689: 6, - 7690: 8, - 7691: 7, - 7692: 8, - 7693: 7, - 7694: 8, - 7695: 7, - 7696: 8, - 7697: 7, - 7698: 8, - 7699: 7, - 7700: 7, - 7701: 7, - 7702: 7, - 7703: 7, - 7704: 7, - 7705: 7, - 7706: 7, - 7707: 7, - 7708: 7, - 7709: 7, - 7710: 6, - 7711: 4, - 7712: 9, - 7713: 7, - 7714: 8, - 7715: 7, - 7716: 8, - 7717: 7, - 7718: 8, - 7719: 7, - 7720: 8, - 7721: 7, - 7722: 8, - 7723: 7, - 7724: 3, - 7725: 3, - 7726: 3, - 7727: 3, - 7728: 7, - 7729: 6, - 7730: 7, - 7731: 6, - 7732: 7, - 7733: 6, - 7734: 6, - 7735: 3, - 7736: 6, - 7737: 3, - 7738: 6, - 7739: 3, - 7740: 6, - 7741: 3, - 7742: 9, - 7743: 11, - 7744: 9, - 7745: 11, - 7746: 9, - 7747: 11, - 7748: 8, - 7749: 7, - 7750: 8, - 7751: 7, - 7752: 8, - 7753: 7, - 7754: 8, - 7755: 7, - 7756: 9, - 7757: 7, - 7758: 9, - 7759: 7, - 7760: 9, - 7761: 7, - 7762: 9, - 7763: 7, - 7764: 7, - 7765: 7, - 7766: 7, - 7767: 7, - 7768: 8, - 7769: 5, - 7770: 8, - 7771: 5, - 7772: 8, - 7773: 5, - 7774: 8, - 7775: 5, - 7776: 7, - 7777: 6, - 7778: 7, - 7779: 6, - 7780: 7, - 7781: 6, - 7782: 7, - 7783: 6, - 7784: 7, - 7785: 6, - 7786: 7, - 7787: 4, - 7788: 7, - 7789: 4, - 7790: 7, - 7791: 4, - 7792: 7, - 7793: 4, - 7794: 8, - 7795: 7, - 7796: 8, - 7797: 7, - 7798: 8, - 7799: 7, - 7800: 8, - 7801: 7, - 7802: 8, - 7803: 7, - 7804: 8, - 7805: 7, - 7806: 8, - 7807: 7, - 7808: 11, - 7809: 9, - 7810: 11, - 7811: 9, - 7812: 11, - 7813: 9, - 7814: 11, - 7815: 9, - 7816: 11, - 7817: 9, - 7818: 8, - 7819: 7, - 7820: 8, - 7821: 7, - 7822: 7, - 7823: 7, - 7824: 8, - 7825: 6, - 7826: 8, - 7827: 6, - 7828: 8, - 7829: 6, - 7830: 7, - 7831: 4, - 7832: 9, - 7833: 7, - 7834: 7, - 7835: 4, - 7836: 4, - 7837: 4, - 7838: 8, - 7839: 7, - 7840: 8, - 7841: 7, - 7842: 8, - 7843: 7, - 7844: 8, - 7845: 7, - 7846: 8, - 7847: 7, - 7848: 8, - 7849: 7, - 7850: 8, - 7851: 7, - 7852: 8, - 7853: 7, - 7854: 8, - 7855: 7, - 7856: 8, - 7857: 7, - 7858: 8, - 7859: 7, - 7860: 8, - 7861: 7, - 7862: 8, - 7863: 7, - 7864: 7, - 7865: 7, - 7866: 7, - 7867: 7, - 7868: 7, - 7869: 7, - 7870: 7, - 7871: 7, - 7872: 7, - 7873: 7, - 7874: 7, - 7875: 7, - 7876: 7, - 7877: 7, - 7878: 7, - 7879: 7, - 7880: 3, - 7881: 3, - 7882: 3, - 7883: 3, - 7884: 9, - 7885: 7, - 7886: 9, - 7887: 7, - 7888: 9, - 7889: 7, - 7890: 9, - 7891: 7, - 7892: 9, - 7893: 7, - 7894: 9, - 7895: 7, - 7896: 9, - 7897: 7, - 7898: 10, - 7899: 7, - 7900: 10, - 7901: 7, - 7902: 10, - 7903: 7, - 7904: 10, - 7905: 7, - 7906: 10, - 7907: 7, - 7908: 8, - 7909: 7, - 7910: 8, - 7911: 7, - 7912: 9, - 7913: 7, - 7914: 9, - 7915: 7, - 7916: 9, - 7917: 7, - 7918: 9, - 7919: 7, - 7920: 9, - 7921: 7, - 7922: 7, - 7923: 7, - 7924: 7, - 7925: 7, - 7926: 7, - 7927: 7, - 7928: 7, - 7929: 7, - 7930: 8, - 7931: 5, - 7936: 7, - 7937: 7, - 7938: 7, - 7939: 7, - 7940: 7, - 7941: 7, - 7942: 7, - 7943: 7, - 7944: 8, - 7945: 8, - 7946: 10, - 7947: 10, - 7948: 8, - 7949: 9, - 7950: 8, - 7951: 8, - 7952: 6, - 7953: 6, - 7954: 6, - 7955: 6, - 7956: 6, - 7957: 6, - 7960: 8, - 7961: 8, - 7962: 11, - 7963: 11, - 7964: 10, - 7965: 10, - 7968: 7, - 7969: 7, - 7970: 7, - 7971: 7, - 7972: 7, - 7973: 7, - 7974: 7, - 7975: 7, - 7976: 9, - 7977: 9, - 7978: 12, - 7979: 12, - 7980: 11, - 7981: 12, - 7982: 10, - 7983: 10, - 7984: 4, - 7985: 4, - 7986: 4, - 7987: 4, - 7988: 4, - 7989: 4, - 7990: 4, - 7991: 4, - 7992: 4, - 7993: 4, - 7994: 7, - 7995: 7, - 7996: 6, - 7997: 7, - 7998: 5, - 7999: 5, - 8000: 7, - 8001: 7, - 8002: 7, - 8003: 7, - 8004: 7, - 8005: 7, - 8008: 9, - 8009: 9, - 8010: 12, - 8011: 12, - 8012: 10, - 8013: 11, - 8016: 6, - 8017: 6, - 8018: 6, - 8019: 6, - 8020: 6, - 8021: 6, - 8022: 6, - 8023: 6, - 8025: 9, - 8027: 11, - 8029: 11, - 8031: 10, - 8032: 9, - 8033: 9, - 8034: 9, - 8035: 9, - 8036: 9, - 8037: 9, - 8038: 9, - 8039: 9, - 8040: 9, - 8041: 9, - 8042: 12, - 8043: 12, - 8044: 10, - 8045: 11, - 8046: 10, - 8047: 10, - 8048: 7, - 8049: 7, - 8050: 6, - 8051: 6, - 8052: 7, - 8053: 7, - 8054: 4, - 8055: 4, - 8056: 7, - 8057: 7, - 8058: 6, - 8059: 6, - 8060: 9, - 8061: 9, - 8064: 7, - 8065: 7, - 8066: 7, - 8067: 7, - 8068: 7, - 8069: 7, - 8070: 7, - 8071: 7, - 8072: 8, - 8073: 8, - 8074: 10, - 8075: 10, - 8076: 8, - 8077: 9, - 8078: 8, - 8079: 8, - 8080: 7, - 8081: 7, - 8082: 7, - 8083: 7, - 8084: 7, - 8085: 7, - 8086: 7, - 8087: 7, - 8088: 9, - 8089: 9, - 8090: 12, - 8091: 12, - 8092: 11, - 8093: 12, - 8094: 10, - 8095: 10, - 8096: 9, - 8097: 9, - 8098: 9, - 8099: 9, - 8100: 9, - 8101: 9, - 8102: 9, - 8103: 9, - 8104: 9, - 8105: 9, - 8106: 12, - 8107: 12, - 8108: 10, - 8109: 11, - 8110: 10, - 8111: 10, - 8112: 7, - 8113: 7, - 8114: 7, - 8115: 7, - 8116: 7, - 8118: 7, - 8119: 7, - 8120: 8, - 8121: 8, - 8122: 8, - 8123: 8, - 8124: 8, - 8125: 6, - 8126: 6, - 8127: 6, - 8128: 6, - 8129: 6, - 8130: 7, - 8131: 7, - 8132: 7, - 8134: 7, - 8135: 7, - 8136: 9, - 8137: 8, - 8138: 10, - 8139: 10, - 8140: 8, - 8141: 6, - 8142: 6, - 8143: 6, - 8144: 4, - 8145: 4, - 8146: 4, - 8147: 4, - 8150: 4, - 8151: 4, - 8152: 3, - 8153: 3, - 8154: 5, - 8155: 4, - 8157: 6, - 8158: 6, - 8159: 6, - 8160: 6, - 8161: 6, - 8162: 6, - 8163: 6, - 8164: 7, - 8165: 7, - 8166: 6, - 8167: 6, - 8168: 7, - 8169: 7, - 8170: 9, - 8171: 9, - 8172: 8, - 8173: 6, - 8174: 6, - 8175: 6, - 8178: 9, - 8179: 9, - 8180: 9, - 8182: 9, - 8183: 9, - 8184: 10, - 8185: 9, - 8186: 10, - 8187: 9, - 8188: 8, - 8189: 6, - 8190: 6, - 8208: 4, - 8209: 4, - 8210: 7, - 8211: 6, - 8212: 11, - 8213: 11, - 8214: 6, - 8215: 6, - 8216: 3, - 8217: 3, - 8218: 3, - 8219: 3, - 8220: 6, - 8221: 6, - 8222: 6, - 8223: 6, - 8224: 6, - 8225: 6, - 8226: 6, - 8227: 6, - 8228: 4, - 8229: 7, - 8230: 11, - 8231: 3, - 8240: 15, - 8241: 19, - 8242: 2, - 8243: 4, - 8244: 6, - 8245: 2, - 8246: 4, - 8247: 6, - 8248: 4, - 8249: 4, - 8250: 4, - 8251: 9, - 8252: 5, - 8253: 6, - 8254: 6, - 8255: 9, - 8256: 9, - 8257: 3, - 8258: 11, - 8259: 6, - 8260: 2, - 8261: 4, - 8262: 4, - 8263: 10, - 8264: 8, - 8265: 8, - 8266: 5, - 8267: 7, - 8268: 6, - 8269: 6, - 8270: 6, - 8271: 4, - 8272: 9, - 8273: 6, - 8274: 5, - 8275: 11, - 8276: 9, - 8277: 9, - 8278: 6, - 8279: 7, - 8280: 9, - 8281: 9, - 8282: 3, - 8283: 9, - 8284: 9, - 8285: 3, - 8286: 3, - 8304: 4, - 8305: 2, - 8308: 4, - 8309: 4, - 8310: 4, - 8311: 4, - 8312: 4, - 8313: 4, - 8314: 6, - 8315: 6, - 8316: 6, - 8317: 3, - 8318: 3, - 8319: 4, - 8320: 4, - 8321: 4, - 8322: 4, - 8323: 4, - 8324: 4, - 8325: 4, - 8326: 4, - 8327: 4, - 8328: 4, - 8329: 4, - 8330: 6, - 8331: 6, - 8332: 6, - 8333: 3, - 8334: 3, - 8336: 4, - 8337: 5, - 8338: 5, - 8339: 5, - 8340: 5, - 8341: 4, - 8342: 5, - 8343: 2, - 8344: 7, - 8345: 4, - 8346: 5, - 8347: 4, - 8348: 3, - 8352: 10, - 8353: 7, - 8354: 7, - 8355: 7, - 8356: 7, - 8357: 11, - 8358: 7, - 8359: 14, - 8360: 12, - 8361: 11, - 8362: 9, - 8363: 7, - 8364: 7, - 8365: 7, - 8366: 7, - 8367: 14, - 8368: 7, - 8369: 7, - 8370: 7, - 8371: 7, - 8372: 9, - 8373: 7, - 8376: 7, - 8377: 7, - 8378: 7, - 8381: 7, - 8448: 11, - 8449: 11, - 8450: 8, - 8451: 12, - 8452: 7, - 8453: 11, - 8454: 12, - 8455: 7, - 8456: 8, - 8457: 10, - 8459: 11, - 8460: 8, - 8461: 9, - 8462: 7, - 8463: 7, - 8464: 5, - 8465: 8, - 8466: 8, - 8467: 5, - 8468: 9, - 8469: 9, - 8470: 11, - 8471: 11, - 8472: 8, - 8473: 8, - 8474: 9, - 8475: 9, - 8476: 9, - 8477: 9, - 8478: 10, - 8479: 8, - 8480: 11, - 8481: 12, - 8482: 11, - 8483: 8, - 8484: 8, - 8485: 6, - 8486: 8, - 8487: 8, - 8488: 7, - 8489: 4, - 8490: 7, - 8491: 8, - 8492: 9, - 8493: 8, - 8494: 9, - 8495: 7, - 8496: 7, - 8497: 9, - 8498: 6, - 8499: 12, - 8500: 5, - 8501: 8, - 8502: 7, - 8503: 5, - 8504: 7, - 8505: 4, - 8506: 10, - 8507: 13, - 8508: 8, - 8509: 8, - 8510: 7, - 8511: 9, - 8512: 9, - 8513: 9, - 8514: 6, - 8515: 6, - 8516: 7, - 8517: 9, - 8518: 8, - 8519: 7, - 8520: 4, - 8521: 4, - 8523: 9, - 8526: 6, - 8528: 11, - 8529: 11, - 8530: 15, - 8531: 11, - 8532: 11, - 8533: 11, - 8534: 11, - 8535: 11, - 8536: 11, - 8537: 11, - 8538: 11, - 8539: 11, - 8540: 11, - 8541: 11, - 8542: 11, - 8543: 6, - 8544: 3, - 8545: 5, - 8546: 8, - 8547: 10, - 8548: 8, - 8549: 10, - 8550: 12, - 8551: 14, - 8552: 10, - 8553: 8, - 8554: 10, - 8555: 12, - 8556: 6, - 8557: 8, - 8558: 8, - 8559: 9, - 8560: 3, - 8561: 5, - 8562: 7, - 8563: 9, - 8564: 7, - 8565: 9, - 8566: 11, - 8567: 13, - 8568: 9, - 8569: 7, - 8570: 9, - 8571: 11, - 8572: 3, - 8573: 6, - 8574: 7, - 8575: 11, - 8576: 14, - 8577: 8, - 8578: 14, - 8579: 8, - 8580: 6, - 8581: 8, - 8585: 11, - 8592: 9, - 8593: 9, - 8594: 9, - 8595: 9, - 8596: 9, - 8597: 9, - 8598: 9, - 8599: 9, - 8600: 9, - 8601: 9, - 8602: 9, - 8603: 9, - 8604: 9, - 8605: 9, - 8606: 9, - 8607: 9, - 8608: 9, - 8609: 9, - 8610: 9, - 8611: 9, - 8612: 9, - 8613: 9, - 8614: 9, - 8615: 9, - 8616: 9, - 8617: 9, - 8618: 9, - 8619: 9, - 8620: 9, - 8621: 9, - 8622: 9, - 8623: 9, - 8624: 9, - 8625: 9, - 8626: 9, - 8627: 9, - 8628: 9, - 8629: 9, - 8630: 9, - 8631: 9, - 8632: 9, - 8633: 9, - 8634: 9, - 8635: 9, - 8636: 9, - 8637: 9, - 8638: 9, - 8639: 9, - 8640: 9, - 8641: 9, - 8642: 9, - 8643: 9, - 8644: 9, - 8645: 9, - 8646: 9, - 8647: 9, - 8648: 9, - 8649: 9, - 8650: 9, - 8651: 9, - 8652: 9, - 8653: 9, - 8654: 9, - 8655: 9, - 8656: 9, - 8657: 9, - 8658: 9, - 8659: 9, - 8660: 9, - 8661: 9, - 8662: 9, - 8663: 9, - 8664: 9, - 8665: 9, - 8666: 9, - 8667: 9, - 8668: 9, - 8669: 9, - 8670: 9, - 8671: 9, - 8672: 9, - 8673: 9, - 8674: 9, - 8675: 9, - 8676: 9, - 8677: 9, - 8678: 9, - 8679: 9, - 8680: 9, - 8681: 9, - 8682: 9, - 8683: 9, - 8684: 9, - 8685: 9, - 8686: 9, - 8687: 9, - 8688: 9, - 8689: 9, - 8690: 9, - 8691: 9, - 8692: 9, - 8693: 9, - 8694: 9, - 8695: 9, - 8696: 9, - 8697: 9, - 8698: 9, - 8699: 9, - 8700: 9, - 8701: 9, - 8702: 9, - 8703: 9, - 8704: 8, - 8705: 7, - 8706: 6, - 8707: 7, - 8708: 7, - 8709: 10, - 8710: 7, - 8711: 7, - 8712: 10, - 8713: 10, - 8714: 8, - 8715: 10, - 8716: 10, - 8717: 8, - 8718: 7, - 8719: 8, - 8720: 8, - 8721: 7, - 8722: 9, - 8723: 9, - 8724: 9, - 8725: 4, - 8726: 7, - 8727: 9, - 8728: 7, - 8729: 7, - 8730: 7, - 8731: 7, - 8732: 7, - 8733: 8, - 8734: 9, - 8735: 9, - 8736: 10, - 8737: 10, - 8738: 9, - 8739: 6, - 8740: 6, - 8741: 6, - 8742: 6, - 8743: 8, - 8744: 8, - 8745: 8, - 8746: 8, - 8747: 6, - 8748: 9, - 8749: 12, - 8750: 6, - 8751: 9, - 8752: 12, - 8753: 6, - 8754: 6, - 8755: 6, - 8756: 7, - 8757: 7, - 8758: 3, - 8759: 7, - 8760: 9, - 8761: 9, - 8762: 9, - 8763: 9, - 8764: 9, - 8765: 9, - 8766: 9, - 8767: 9, - 8768: 4, - 8769: 9, - 8770: 9, - 8771: 9, - 8772: 9, - 8773: 9, - 8774: 9, - 8775: 9, - 8776: 9, - 8777: 9, - 8778: 9, - 8779: 9, - 8780: 9, - 8781: 9, - 8782: 9, - 8783: 9, - 8784: 9, - 8785: 9, - 8786: 9, - 8787: 9, - 8788: 11, - 8789: 11, - 8790: 9, - 8791: 9, - 8792: 9, - 8793: 9, - 8794: 9, - 8795: 9, - 8796: 9, - 8797: 9, - 8798: 9, - 8799: 9, - 8800: 9, - 8801: 9, - 8802: 9, - 8803: 9, - 8804: 9, - 8805: 9, - 8806: 9, - 8807: 9, - 8808: 9, - 8809: 9, - 8810: 12, - 8811: 12, - 8812: 5, - 8813: 9, - 8814: 9, - 8815: 9, - 8816: 9, - 8817: 9, - 8818: 9, - 8819: 9, - 8820: 9, - 8821: 9, - 8822: 9, - 8823: 9, - 8824: 9, - 8825: 9, - 8826: 9, - 8827: 9, - 8828: 9, - 8829: 9, - 8830: 9, - 8831: 9, - 8832: 9, - 8833: 9, - 8834: 9, - 8835: 9, - 8836: 9, - 8837: 9, - 8838: 9, - 8839: 9, - 8840: 9, - 8841: 9, - 8842: 9, - 8843: 9, - 8844: 8, - 8845: 8, - 8846: 8, - 8847: 9, - 8848: 9, - 8849: 9, - 8850: 9, - 8851: 9, - 8852: 9, - 8853: 9, - 8854: 9, - 8855: 9, - 8856: 9, - 8857: 9, - 8858: 9, - 8859: 9, - 8860: 9, - 8861: 9, - 8862: 9, - 8863: 9, - 8864: 9, - 8865: 9, - 8866: 10, - 8867: 10, - 8868: 10, - 8869: 10, - 8870: 6, - 8871: 6, - 8872: 10, - 8873: 10, - 8874: 10, - 8875: 10, - 8876: 10, - 8877: 10, - 8878: 10, - 8879: 10, - 8880: 9, - 8881: 9, - 8882: 9, - 8883: 9, - 8884: 9, - 8885: 9, - 8886: 11, - 8887: 11, - 8888: 9, - 8889: 9, - 8890: 6, - 8891: 8, - 8892: 8, - 8893: 8, - 8894: 9, - 8895: 9, - 8896: 9, - 8897: 9, - 8898: 9, - 8899: 9, - 8900: 7, - 8901: 3, - 8902: 7, - 8903: 9, - 8904: 11, - 8905: 11, - 8906: 11, - 8907: 11, - 8908: 11, - 8909: 9, - 8910: 8, - 8911: 8, - 8912: 9, - 8913: 9, - 8914: 9, - 8915: 9, - 8916: 9, - 8917: 9, - 8918: 9, - 8919: 9, - 8920: 16, - 8921: 16, - 8922: 9, - 8923: 9, - 8924: 9, - 8925: 9, - 8926: 9, - 8927: 9, - 8928: 9, - 8929: 9, - 8930: 9, - 8931: 9, - 8932: 9, - 8933: 9, - 8934: 9, - 8935: 9, - 8936: 9, - 8937: 9, - 8938: 9, - 8939: 9, - 8940: 9, - 8941: 9, - 8942: 11, - 8943: 11, - 8944: 11, - 8945: 11, - 8946: 11, - 8947: 10, - 8948: 8, - 8949: 10, - 8950: 10, - 8951: 8, - 8952: 10, - 8953: 10, - 8954: 11, - 8955: 10, - 8956: 8, - 8957: 10, - 8958: 8, - 8959: 10, - 8960: 7, - 8961: 7, - 8962: 7, - 8963: 9, - 8964: 9, - 8965: 9, - 8966: 9, - 8967: 5, - 8968: 4, - 8969: 4, - 8970: 4, - 8971: 4, - 8972: 9, - 8973: 9, - 8974: 9, - 8975: 9, - 8976: 9, - 8977: 6, - 8984: 11, - 8985: 9, - 8988: 5, - 8989: 5, - 8990: 5, - 8991: 5, - 8992: 6, - 8993: 6, - 8996: 13, - 8997: 13, - 8998: 16, - 8999: 13, - 9000: 16, - 9003: 16, - 9004: 10, - 9075: 4, - 9076: 7, - 9077: 9, - 9082: 7, - 9085: 8, - 9095: 13, - 9108: 10, - 9115: 6, - 9116: 6, - 9117: 6, - 9118: 6, - 9119: 6, - 9120: 6, - 9121: 6, - 9122: 6, - 9123: 6, - 9124: 6, - 9125: 6, - 9126: 6, - 9127: 8, - 9128: 8, - 9129: 8, - 9130: 8, - 9131: 8, - 9132: 8, - 9133: 8, - 9134: 6, - 9166: 9, - 9167: 10, - 9187: 10, - 9189: 8, - 9192: 7, - 9250: 7, - 9251: 7, - 9312: 10, - 9313: 10, - 9314: 10, - 9315: 10, - 9316: 10, - 9317: 10, - 9318: 10, - 9319: 10, - 9320: 10, - 9321: 10, - 9472: 7, - 9473: 7, - 9474: 7, - 9475: 7, - 9476: 7, - 9477: 7, - 9478: 7, - 9479: 7, - 9480: 7, - 9481: 7, - 9482: 7, - 9483: 7, - 9484: 7, - 9485: 7, - 9486: 7, - 9487: 7, - 9488: 7, - 9489: 7, - 9490: 7, - 9491: 7, - 9492: 7, - 9493: 7, - 9494: 7, - 9495: 7, - 9496: 7, - 9497: 7, - 9498: 7, - 9499: 7, - 9500: 7, - 9501: 7, - 9502: 7, - 9503: 7, - 9504: 7, - 9505: 7, - 9506: 7, - 9507: 7, - 9508: 7, - 9509: 7, - 9510: 7, - 9511: 7, - 9512: 7, - 9513: 7, - 9514: 7, - 9515: 7, - 9516: 7, - 9517: 7, - 9518: 7, - 9519: 7, - 9520: 7, - 9521: 7, - 9522: 7, - 9523: 7, - 9524: 7, - 9525: 7, - 9526: 7, - 9527: 7, - 9528: 7, - 9529: 7, - 9530: 7, - 9531: 7, - 9532: 7, - 9533: 7, - 9534: 7, - 9535: 7, - 9536: 7, - 9537: 7, - 9538: 7, - 9539: 7, - 9540: 7, - 9541: 7, - 9542: 7, - 9543: 7, - 9544: 7, - 9545: 7, - 9546: 7, - 9547: 7, - 9548: 7, - 9549: 7, - 9550: 7, - 9551: 7, - 9552: 7, - 9553: 7, - 9554: 7, - 9555: 7, - 9556: 7, - 9557: 7, - 9558: 7, - 9559: 7, - 9560: 7, - 9561: 7, - 9562: 7, - 9563: 7, - 9564: 7, - 9565: 7, - 9566: 7, - 9567: 7, - 9568: 7, - 9569: 7, - 9570: 7, - 9571: 7, - 9572: 7, - 9573: 7, - 9574: 7, - 9575: 7, - 9576: 7, - 9577: 7, - 9578: 7, - 9579: 7, - 9580: 7, - 9581: 7, - 9582: 7, - 9583: 7, - 9584: 7, - 9585: 7, - 9586: 7, - 9587: 7, - 9588: 7, - 9589: 7, - 9590: 7, - 9591: 7, - 9592: 7, - 9593: 7, - 9594: 7, - 9595: 7, - 9596: 7, - 9597: 7, - 9598: 7, - 9599: 7, - 9600: 8, - 9601: 8, - 9602: 8, - 9603: 8, - 9604: 8, - 9605: 8, - 9606: 8, - 9607: 8, - 9608: 8, - 9609: 8, - 9610: 8, - 9611: 8, - 9612: 8, - 9613: 8, - 9614: 8, - 9615: 8, - 9616: 8, - 9617: 8, - 9618: 8, - 9619: 8, - 9620: 8, - 9621: 8, - 9622: 8, - 9623: 8, - 9624: 8, - 9625: 8, - 9626: 8, - 9627: 8, - 9628: 8, - 9629: 8, - 9630: 8, - 9631: 8, - 9632: 10, - 9633: 10, - 9634: 10, - 9635: 10, - 9636: 10, - 9637: 10, - 9638: 10, - 9639: 10, - 9640: 10, - 9641: 10, - 9642: 7, - 9643: 7, - 9644: 10, - 9645: 10, - 9646: 6, - 9647: 6, - 9648: 8, - 9649: 8, - 9650: 8, - 9651: 8, - 9652: 6, - 9653: 6, - 9654: 8, - 9655: 8, - 9656: 6, - 9657: 6, - 9658: 8, - 9659: 8, - 9660: 8, - 9661: 8, - 9662: 6, - 9663: 6, - 9664: 8, - 9665: 8, - 9666: 6, - 9667: 6, - 9668: 8, - 9669: 8, - 9670: 8, - 9671: 8, - 9672: 8, - 9673: 10, - 9674: 5, - 9675: 10, - 9676: 10, - 9677: 10, - 9678: 10, - 9679: 10, - 9680: 10, - 9681: 10, - 9682: 10, - 9683: 10, - 9684: 10, - 9685: 10, - 9686: 6, - 9687: 6, - 9688: 9, - 9689: 11, - 9690: 11, - 9691: 11, - 9692: 4, - 9693: 4, - 9694: 4, - 9695: 4, - 9696: 10, - 9697: 10, - 9698: 8, - 9699: 8, - 9700: 8, - 9701: 8, - 9702: 6, - 9703: 10, - 9704: 10, - 9705: 10, - 9706: 10, - 9707: 10, - 9708: 8, - 9709: 8, - 9710: 8, - 9711: 12, - 9712: 10, - 9713: 10, - 9714: 10, - 9715: 10, - 9716: 10, - 9717: 10, - 9718: 10, - 9719: 10, - 9720: 8, - 9721: 8, - 9722: 8, - 9723: 9, - 9724: 9, - 9725: 8, - 9726: 8, - 9727: 8, - 9728: 10, - 9729: 11, - 9730: 10, - 9731: 10, - 9732: 10, - 9733: 10, - 9734: 10, - 9735: 6, - 9736: 10, - 9737: 10, - 9738: 10, - 9739: 10, - 9740: 7, - 9741: 11, - 9742: 14, - 9743: 14, - 9744: 10, - 9745: 10, - 9746: 10, - 9747: 6, - 9748: 10, - 9749: 10, - 9750: 10, - 9751: 10, - 9752: 10, - 9753: 10, - 9754: 10, - 9755: 10, - 9756: 10, - 9757: 7, - 9758: 10, - 9759: 7, - 9760: 10, - 9761: 10, - 9762: 10, - 9763: 10, - 9764: 7, - 9765: 8, - 9766: 7, - 9767: 9, - 9768: 6, - 9769: 10, - 9770: 10, - 9771: 10, - 9772: 8, - 9773: 10, - 9774: 10, - 9775: 10, - 9776: 10, - 9777: 10, - 9778: 10, - 9779: 10, - 9780: 10, - 9781: 10, - 9782: 10, - 9783: 10, - 9784: 10, - 9785: 11, - 9786: 11, - 9787: 11, - 9788: 10, - 9789: 10, - 9790: 10, - 9791: 7, - 9792: 8, - 9793: 8, - 9794: 10, - 9795: 10, - 9796: 10, - 9797: 10, - 9798: 10, - 9799: 10, - 9800: 10, - 9801: 10, - 9802: 10, - 9803: 10, - 9804: 10, - 9805: 10, - 9806: 10, - 9807: 10, - 9808: 10, - 9809: 10, - 9810: 10, - 9811: 10, - 9812: 10, - 9813: 10, - 9814: 10, - 9815: 10, - 9816: 10, - 9817: 10, - 9818: 10, - 9819: 10, - 9820: 10, - 9821: 10, - 9822: 10, - 9823: 10, - 9824: 10, - 9825: 10, - 9826: 10, - 9827: 10, - 9828: 10, - 9829: 10, - 9830: 10, - 9831: 10, - 9832: 10, - 9833: 5, - 9834: 7, - 9835: 10, - 9836: 10, - 9837: 5, - 9838: 4, - 9839: 5, - 9840: 8, - 9841: 8, - 9842: 10, - 9843: 10, - 9844: 10, - 9845: 10, - 9846: 10, - 9847: 10, - 9848: 10, - 9849: 10, - 9850: 10, - 9851: 10, - 9852: 10, - 9853: 10, - 9854: 10, - 9855: 10, - 9856: 10, - 9857: 10, - 9858: 10, - 9859: 10, - 9860: 10, - 9861: 10, - 9862: 10, - 9863: 10, - 9864: 10, - 9865: 10, - 9866: 10, - 9867: 10, - 9868: 10, - 9869: 10, - 9870: 10, - 9871: 10, - 9872: 10, - 9873: 10, - 9874: 10, - 9875: 10, - 9876: 10, - 9877: 6, - 9878: 10, - 9879: 10, - 9880: 10, - 9881: 10, - 9882: 10, - 9883: 10, - 9884: 10, - 9886: 10, - 9887: 10, - 9888: 10, - 9889: 8, - 9890: 11, - 9891: 12, - 9892: 13, - 9893: 10, - 9894: 9, - 9895: 9, - 9896: 9, - 9897: 9, - 9898: 9, - 9899: 9, - 9900: 9, - 9901: 9, - 9902: 9, - 9903: 9, - 9904: 9, - 9905: 9, - 9906: 8, - 9907: 8, - 9908: 8, - 9909: 8, - 9910: 9, - 9911: 8, - 9912: 8, - 9920: 9, - 9921: 9, - 9922: 9, - 9923: 9, - 9954: 8, - 9985: 9, - 9986: 9, - 9987: 9, - 9988: 9, - 9990: 9, - 9991: 9, - 9992: 9, - 9993: 9, - 9996: 9, - 9997: 9, - 9998: 9, - 9999: 9, - 10000: 9, - 10001: 9, - 10002: 9, - 10003: 9, - 10004: 9, - 10005: 9, - 10006: 9, - 10007: 9, - 10008: 9, - 10009: 9, - 10010: 9, - 10011: 9, - 10012: 9, - 10013: 9, - 10014: 9, - 10015: 9, - 10016: 9, - 10017: 9, - 10018: 9, - 10019: 9, - 10020: 9, - 10021: 9, - 10022: 9, - 10023: 9, - 10025: 9, - 10026: 9, - 10027: 9, - 10028: 9, - 10029: 9, - 10030: 9, - 10031: 9, - 10032: 9, - 10033: 9, - 10034: 9, - 10035: 9, - 10036: 9, - 10037: 9, - 10038: 9, - 10039: 9, - 10040: 9, - 10041: 9, - 10042: 9, - 10043: 9, - 10044: 9, - 10045: 9, - 10046: 9, - 10047: 9, - 10048: 9, - 10049: 9, - 10050: 9, - 10051: 9, - 10052: 9, - 10053: 9, - 10054: 9, - 10055: 9, - 10056: 9, - 10057: 9, - 10058: 9, - 10059: 9, - 10061: 10, - 10063: 10, - 10064: 10, - 10065: 10, - 10066: 10, - 10070: 10, - 10072: 9, - 10073: 9, - 10074: 9, - 10075: 4, - 10076: 4, - 10077: 6, - 10078: 6, - 10081: 9, - 10082: 9, - 10083: 9, - 10084: 9, - 10085: 9, - 10086: 9, - 10087: 9, - 10088: 9, - 10089: 9, - 10090: 9, - 10091: 9, - 10092: 9, - 10093: 9, - 10094: 9, - 10095: 9, - 10096: 9, - 10097: 9, - 10098: 9, - 10099: 9, - 10100: 9, - 10101: 9, - 10102: 10, - 10103: 10, - 10104: 10, - 10105: 10, - 10106: 10, - 10107: 10, - 10108: 10, - 10109: 10, - 10110: 10, - 10111: 10, - 10112: 9, - 10113: 9, - 10114: 9, - 10115: 9, - 10116: 9, - 10117: 9, - 10118: 9, - 10119: 9, - 10120: 9, - 10121: 9, - 10122: 9, - 10123: 9, - 10124: 9, - 10125: 9, - 10126: 9, - 10127: 9, - 10128: 9, - 10129: 9, - 10130: 9, - 10131: 9, - 10132: 9, - 10136: 9, - 10137: 9, - 10138: 9, - 10139: 9, - 10140: 9, - 10141: 9, - 10142: 9, - 10143: 9, - 10144: 9, - 10145: 9, - 10146: 9, - 10147: 9, - 10148: 9, - 10149: 9, - 10150: 9, - 10151: 9, - 10152: 9, - 10153: 9, - 10154: 9, - 10155: 9, - 10156: 9, - 10157: 9, - 10158: 9, - 10159: 9, - 10161: 9, - 10162: 9, - 10163: 9, - 10164: 9, - 10165: 9, - 10166: 9, - 10167: 9, - 10168: 9, - 10169: 9, - 10170: 9, - 10171: 9, - 10172: 9, - 10173: 9, - 10174: 9, - 10181: 4, - 10182: 4, - 10208: 5, - 10214: 5, - 10215: 5, - 10216: 4, - 10217: 4, - 10218: 6, - 10219: 6, - 10224: 9, - 10225: 9, - 10226: 9, - 10227: 9, - 10228: 13, - 10229: 16, - 10230: 16, - 10231: 16, - 10232: 16, - 10233: 16, - 10234: 16, - 10235: 16, - 10236: 16, - 10237: 16, - 10238: 16, - 10239: 16, - 10240: 8, - 10241: 8, - 10242: 8, - 10243: 8, - 10244: 8, - 10245: 8, - 10246: 8, - 10247: 8, - 10248: 8, - 10249: 8, - 10250: 8, - 10251: 8, - 10252: 8, - 10253: 8, - 10254: 8, - 10255: 8, - 10256: 8, - 10257: 8, - 10258: 8, - 10259: 8, - 10260: 8, - 10261: 8, - 10262: 8, - 10263: 8, - 10264: 8, - 10265: 8, - 10266: 8, - 10267: 8, - 10268: 8, - 10269: 8, - 10270: 8, - 10271: 8, - 10272: 8, - 10273: 8, - 10274: 8, - 10275: 8, - 10276: 8, - 10277: 8, - 10278: 8, - 10279: 8, - 10280: 8, - 10281: 8, - 10282: 8, - 10283: 8, - 10284: 8, - 10285: 8, - 10286: 8, - 10287: 8, - 10288: 8, - 10289: 8, - 10290: 8, - 10291: 8, - 10292: 8, - 10293: 8, - 10294: 8, - 10295: 8, - 10296: 8, - 10297: 8, - 10298: 8, - 10299: 8, - 10300: 8, - 10301: 8, - 10302: 8, - 10303: 8, - 10304: 8, - 10305: 8, - 10306: 8, - 10307: 8, - 10308: 8, - 10309: 8, - 10310: 8, - 10311: 8, - 10312: 8, - 10313: 8, - 10314: 8, - 10315: 8, - 10316: 8, - 10317: 8, - 10318: 8, - 10319: 8, - 10320: 8, - 10321: 8, - 10322: 8, - 10323: 8, - 10324: 8, - 10325: 8, - 10326: 8, - 10327: 8, - 10328: 8, - 10329: 8, - 10330: 8, - 10331: 8, - 10332: 8, - 10333: 8, - 10334: 8, - 10335: 8, - 10336: 8, - 10337: 8, - 10338: 8, - 10339: 8, - 10340: 8, - 10341: 8, - 10342: 8, - 10343: 8, - 10344: 8, - 10345: 8, - 10346: 8, - 10347: 8, - 10348: 8, - 10349: 8, - 10350: 8, - 10351: 8, - 10352: 8, - 10353: 8, - 10354: 8, - 10355: 8, - 10356: 8, - 10357: 8, - 10358: 8, - 10359: 8, - 10360: 8, - 10361: 8, - 10362: 8, - 10363: 8, - 10364: 8, - 10365: 8, - 10366: 8, - 10367: 8, - 10368: 8, - 10369: 8, - 10370: 8, - 10371: 8, - 10372: 8, - 10373: 8, - 10374: 8, - 10375: 8, - 10376: 8, - 10377: 8, - 10378: 8, - 10379: 8, - 10380: 8, - 10381: 8, - 10382: 8, - 10383: 8, - 10384: 8, - 10385: 8, - 10386: 8, - 10387: 8, - 10388: 8, - 10389: 8, - 10390: 8, - 10391: 8, - 10392: 8, - 10393: 8, - 10394: 8, - 10395: 8, - 10396: 8, - 10397: 8, - 10398: 8, - 10399: 8, - 10400: 8, - 10401: 8, - 10402: 8, - 10403: 8, - 10404: 8, - 10405: 8, - 10406: 8, - 10407: 8, - 10408: 8, - 10409: 8, - 10410: 8, - 10411: 8, - 10412: 8, - 10413: 8, - 10414: 8, - 10415: 8, - 10416: 8, - 10417: 8, - 10418: 8, - 10419: 8, - 10420: 8, - 10421: 8, - 10422: 8, - 10423: 8, - 10424: 8, - 10425: 8, - 10426: 8, - 10427: 8, - 10428: 8, - 10429: 8, - 10430: 8, - 10431: 8, - 10432: 8, - 10433: 8, - 10434: 8, - 10435: 8, - 10436: 8, - 10437: 8, - 10438: 8, - 10439: 8, - 10440: 8, - 10441: 8, - 10442: 8, - 10443: 8, - 10444: 8, - 10445: 8, - 10446: 8, - 10447: 8, - 10448: 8, - 10449: 8, - 10450: 8, - 10451: 8, - 10452: 8, - 10453: 8, - 10454: 8, - 10455: 8, - 10456: 8, - 10457: 8, - 10458: 8, - 10459: 8, - 10460: 8, - 10461: 8, - 10462: 8, - 10463: 8, - 10464: 8, - 10465: 8, - 10466: 8, - 10467: 8, - 10468: 8, - 10469: 8, - 10470: 8, - 10471: 8, - 10472: 8, - 10473: 8, - 10474: 8, - 10475: 8, - 10476: 8, - 10477: 8, - 10478: 8, - 10479: 8, - 10480: 8, - 10481: 8, - 10482: 8, - 10483: 8, - 10484: 8, - 10485: 8, - 10486: 8, - 10487: 8, - 10488: 8, - 10489: 8, - 10490: 8, - 10491: 8, - 10492: 8, - 10493: 8, - 10494: 8, - 10495: 8, - 10502: 9, - 10503: 9, - 10506: 9, - 10507: 9, - 10560: 8, - 10561: 8, - 10627: 8, - 10628: 8, - 10702: 9, - 10703: 11, - 10704: 11, - 10705: 11, - 10706: 11, - 10707: 11, - 10708: 11, - 10709: 11, - 10731: 5, - 10746: 9, - 10747: 9, - 10752: 11, - 10753: 11, - 10754: 11, - 10764: 15, - 10765: 6, - 10766: 6, - 10767: 6, - 10768: 6, - 10769: 6, - 10770: 6, - 10771: 6, - 10772: 6, - 10773: 6, - 10774: 6, - 10775: 6, - 10776: 6, - 10777: 6, - 10778: 6, - 10779: 6, - 10780: 6, - 10799: 9, - 10858: 9, - 10859: 9, - 10877: 9, - 10878: 9, - 10879: 9, - 10880: 9, - 10881: 9, - 10882: 9, - 10883: 9, - 10884: 9, - 10885: 9, - 10886: 9, - 10887: 9, - 10888: 9, - 10889: 9, - 10890: 9, - 10891: 9, - 10892: 9, - 10893: 9, - 10894: 9, - 10895: 9, - 10896: 9, - 10897: 9, - 10898: 9, - 10899: 9, - 10900: 9, - 10901: 9, - 10902: 9, - 10903: 9, - 10904: 9, - 10905: 9, - 10906: 9, - 10907: 9, - 10908: 9, - 10909: 9, - 10910: 9, - 10911: 9, - 10912: 9, - 10926: 9, - 10927: 9, - 10928: 9, - 10929: 9, - 10930: 9, - 10931: 9, - 10932: 9, - 10933: 9, - 10934: 9, - 10935: 9, - 10936: 9, - 10937: 9, - 10938: 9, - 11001: 9, - 11002: 9, - 11008: 9, - 11009: 9, - 11010: 9, - 11011: 9, - 11012: 9, - 11013: 9, - 11014: 9, - 11015: 9, - 11016: 9, - 11017: 9, - 11018: 9, - 11019: 9, - 11020: 9, - 11021: 9, - 11022: 9, - 11023: 9, - 11024: 9, - 11025: 9, - 11026: 10, - 11027: 10, - 11028: 10, - 11029: 10, - 11030: 8, - 11031: 8, - 11032: 8, - 11033: 8, - 11034: 10, - 11039: 10, - 11040: 10, - 11041: 10, - 11042: 10, - 11043: 10, - 11044: 12, - 11091: 10, - 11092: 10, - 11360: 6, - 11361: 3, - 11362: 6, - 11363: 7, - 11364: 8, - 11365: 7, - 11366: 4, - 11367: 8, - 11368: 7, - 11369: 7, - 11370: 6, - 11371: 8, - 11372: 6, - 11373: 9, - 11374: 9, - 11375: 8, - 11376: 9, - 11377: 8, - 11378: 12, - 11379: 11, - 11380: 7, - 11381: 7, - 11382: 6, - 11383: 7, - 11385: 5, - 11386: 7, - 11387: 5, - 11388: 2, - 11389: 5, - 11390: 7, - 11391: 8, - 11520: 6, - 11521: 7, - 11522: 6, - 11523: 7, - 11524: 6, - 11525: 10, - 11526: 7, - 11527: 10, - 11528: 7, - 11529: 7, - 11530: 10, - 11531: 7, - 11532: 7, - 11533: 10, - 11534: 7, - 11535: 9, - 11536: 10, - 11537: 6, - 11538: 7, - 11539: 10, - 11540: 10, - 11541: 9, - 11542: 7, - 11543: 7, - 11544: 6, - 11545: 7, - 11546: 7, - 11547: 7, - 11548: 10, - 11549: 6, - 11550: 6, - 11551: 6, - 11552: 10, - 11553: 7, - 11554: 7, - 11555: 7, - 11556: 7, - 11557: 10, - 11568: 7, - 11569: 10, - 11570: 10, - 11571: 8, - 11572: 8, - 11573: 7, - 11574: 6, - 11575: 8, - 11576: 8, - 11577: 7, - 11578: 7, - 11579: 8, - 11580: 10, - 11581: 8, - 11582: 5, - 11583: 8, - 11584: 10, - 11585: 10, - 11586: 3, - 11587: 7, - 11588: 8, - 11589: 7, - 11590: 6, - 11591: 8, - 11592: 7, - 11593: 7, - 11594: 6, - 11595: 10, - 11596: 9, - 11597: 8, - 11598: 7, - 11599: 3, - 11600: 9, - 11601: 3, - 11602: 8, - 11603: 7, - 11604: 10, - 11605: 10, - 11606: 8, - 11607: 4, - 11608: 8, - 11609: 10, - 11610: 10, - 11611: 8, - 11612: 8, - 11613: 8, - 11614: 8, - 11615: 7, - 11616: 8, - 11617: 8, - 11618: 7, - 11619: 9, - 11620: 6, - 11621: 9, - 11631: 6, - 11800: 6, - 11807: 9, - 11810: 4, - 11811: 4, - 11812: 4, - 11813: 4, - 11822: 6, - 19904: 10, - 19905: 10, - 19906: 10, - 19907: 10, - 19908: 10, - 19909: 10, - 19910: 10, - 19911: 10, - 19912: 10, - 19913: 10, - 19914: 10, - 19915: 10, - 19916: 10, - 19917: 10, - 19918: 10, - 19919: 10, - 19920: 10, - 19921: 10, - 19922: 10, - 19923: 10, - 19924: 10, - 19925: 10, - 19926: 10, - 19927: 10, - 19928: 10, - 19929: 10, - 19930: 10, - 19931: 10, - 19932: 10, - 19933: 10, - 19934: 10, - 19935: 10, - 19936: 10, - 19937: 10, - 19938: 10, - 19939: 10, - 19940: 10, - 19941: 10, - 19942: 10, - 19943: 10, - 19944: 10, - 19945: 10, - 19946: 10, - 19947: 10, - 19948: 10, - 19949: 10, - 19950: 10, - 19951: 10, - 19952: 10, - 19953: 10, - 19954: 10, - 19955: 10, - 19956: 10, - 19957: 10, - 19958: 10, - 19959: 10, - 19960: 10, - 19961: 10, - 19962: 10, - 19963: 10, - 19964: 10, - 19965: 10, - 19966: 10, - 19967: 10, - 42192: 8, - 42193: 7, - 42194: 7, - 42195: 8, - 42196: 7, - 42197: 7, - 42198: 9, - 42199: 7, - 42200: 7, - 42201: 6, - 42202: 8, - 42203: 8, - 42204: 8, - 42205: 6, - 42206: 6, - 42207: 9, - 42208: 8, - 42209: 6, - 42210: 7, - 42211: 8, - 42212: 8, - 42213: 8, - 42214: 8, - 42215: 8, - 42216: 9, - 42217: 6, - 42218: 11, - 42219: 8, - 42220: 7, - 42221: 8, - 42222: 8, - 42223: 8, - 42224: 7, - 42225: 7, - 42226: 3, - 42227: 9, - 42228: 8, - 42229: 8, - 42230: 6, - 42231: 8, - 42232: 3, - 42233: 3, - 42234: 7, - 42235: 7, - 42236: 3, - 42237: 3, - 42238: 6, - 42239: 6, - 42564: 7, - 42565: 6, - 42566: 4, - 42567: 4, - 42572: 13, - 42573: 11, - 42576: 11, - 42577: 10, - 42580: 12, - 42581: 9, - 42582: 11, - 42583: 9, - 42594: 12, - 42595: 10, - 42596: 12, - 42597: 10, - 42598: 13, - 42599: 11, - 42600: 9, - 42601: 7, - 42602: 9, - 42603: 8, - 42604: 15, - 42605: 11, - 42606: 10, - 42634: 9, - 42635: 8, - 42636: 7, - 42637: 6, - 42644: 8, - 42645: 7, - 42648: 15, - 42649: 11, - 42760: 5, - 42761: 5, - 42762: 5, - 42763: 5, - 42764: 5, - 42765: 5, - 42766: 5, - 42767: 5, - 42768: 5, - 42769: 5, - 42770: 5, - 42771: 5, - 42772: 5, - 42773: 5, - 42774: 5, - 42779: 4, - 42780: 4, - 42781: 3, - 42782: 3, - 42783: 3, - 42786: 4, - 42787: 4, - 42788: 5, - 42789: 5, - 42790: 8, - 42791: 7, - 42792: 10, - 42793: 8, - 42794: 7, - 42795: 6, - 42800: 5, - 42801: 6, - 42802: 14, - 42803: 11, - 42804: 13, - 42805: 11, - 42806: 13, - 42807: 11, - 42808: 11, - 42809: 9, - 42810: 11, - 42811: 9, - 42812: 11, - 42813: 9, - 42814: 8, - 42815: 6, - 42816: 7, - 42817: 6, - 42822: 7, - 42823: 4, - 42824: 6, - 42825: 5, - 42826: 9, - 42827: 8, - 42830: 15, - 42831: 11, - 42832: 7, - 42833: 7, - 42834: 8, - 42835: 9, - 42838: 9, - 42839: 7, - 42852: 7, - 42853: 7, - 42854: 7, - 42855: 7, - 42880: 6, - 42881: 3, - 42882: 8, - 42883: 7, - 42889: 4, - 42890: 4, - 42891: 4, - 42892: 3, - 42893: 8, - 42894: 5, - 42896: 8, - 42897: 7, - 42912: 9, - 42913: 7, - 42914: 7, - 42915: 6, - 42916: 8, - 42917: 7, - 42918: 8, - 42919: 5, - 42920: 7, - 42921: 6, - 42922: 9, - 43000: 6, - 43001: 7, - 43002: 10, - 43003: 6, - 43004: 7, - 43005: 9, - 43006: 3, - 43007: 13, - 64256: 8, - 64257: 7, - 64258: 7, - 64259: 11, - 64260: 11, - 64261: 8, - 64262: 9, - 64275: 13, - 64276: 13, - 64277: 13, - 64278: 13, - 64279: 17, - 64285: 2, - 64287: 4, - 64288: 7, - 64289: 9, - 64290: 9, - 64291: 10, - 64292: 8, - 64293: 9, - 64294: 9, - 64295: 9, - 64296: 10, - 64297: 9, - 64298: 8, - 64299: 8, - 64300: 8, - 64301: 8, - 64302: 7, - 64303: 7, - 64304: 7, - 64305: 6, - 64306: 5, - 64307: 6, - 64308: 7, - 64309: 4, - 64310: 4, - 64312: 7, - 64313: 4, - 64314: 6, - 64315: 6, - 64316: 6, - 64318: 7, - 64320: 4, - 64321: 7, - 64323: 7, - 64324: 7, - 64326: 7, - 64327: 8, - 64328: 6, - 64329: 8, - 64330: 7, - 64331: 3, - 64332: 6, - 64333: 6, - 64334: 7, - 64335: 7, - 64338: 10, - 64339: 11, - 64340: 3, - 64341: 3, - 64342: 10, - 64343: 11, - 64344: 3, - 64345: 3, - 64346: 10, - 64347: 11, - 64348: 3, - 64349: 3, - 64350: 10, - 64351: 11, - 64352: 3, - 64353: 3, - 64354: 10, - 64355: 11, - 64356: 3, - 64357: 3, - 64358: 10, - 64359: 11, - 64360: 3, - 64361: 3, - 64362: 11, - 64363: 11, - 64364: 5, - 64365: 6, - 64366: 11, - 64367: 11, - 64368: 5, - 64369: 6, - 64370: 7, - 64371: 7, - 64372: 7, - 64373: 7, - 64374: 7, - 64375: 7, - 64376: 7, - 64377: 7, - 64378: 7, - 64379: 7, - 64380: 7, - 64381: 7, - 64382: 7, - 64383: 7, - 64384: 7, - 64385: 7, - 64386: 5, - 64387: 6, - 64388: 5, - 64389: 6, - 64390: 5, - 64391: 6, - 64392: 5, - 64393: 6, - 64394: 5, - 64395: 6, - 64396: 5, - 64397: 6, - 64398: 10, - 64399: 10, - 64400: 5, - 64401: 6, - 64402: 10, - 64403: 10, - 64404: 5, - 64405: 6, - 64406: 10, - 64407: 10, - 64408: 5, - 64409: 6, - 64410: 10, - 64411: 10, - 64412: 5, - 64413: 6, - 64414: 8, - 64415: 8, - 64416: 8, - 64417: 8, - 64418: 3, - 64419: 3, - 64426: 8, - 64427: 7, - 64428: 6, - 64429: 5, - 64467: 9, - 64468: 9, - 64469: 5, - 64470: 6, - 64471: 5, - 64472: 6, - 64473: 5, - 64474: 6, - 64475: 5, - 64476: 6, - 64478: 5, - 64479: 6, - 64484: 9, - 64485: 9, - 64486: 3, - 64487: 3, - 64488: 3, - 64489: 3, - 64508: 9, - 64509: 9, - 64510: 3, - 64511: 3, - 65136: 3, - 65137: 3, - 65138: 3, - 65139: 3, - 65140: 3, - 65142: 3, - 65143: 3, - 65144: 3, - 65145: 3, - 65146: 3, - 65147: 3, - 65148: 3, - 65149: 3, - 65150: 3, - 65151: 3, - 65152: 5, - 65153: 3, - 65154: 3, - 65155: 3, - 65156: 3, - 65157: 5, - 65158: 6, - 65159: 3, - 65160: 3, - 65161: 9, - 65162: 9, - 65163: 3, - 65164: 3, - 65165: 3, - 65166: 3, - 65167: 10, - 65168: 11, - 65169: 3, - 65170: 3, - 65171: 6, - 65172: 6, - 65173: 10, - 65174: 11, - 65175: 3, - 65176: 3, - 65177: 10, - 65178: 11, - 65179: 3, - 65180: 3, - 65181: 7, - 65182: 7, - 65183: 7, - 65184: 7, - 65185: 7, - 65186: 7, - 65187: 7, - 65188: 7, - 65189: 7, - 65190: 7, - 65191: 7, - 65192: 7, - 65193: 5, - 65194: 6, - 65195: 5, - 65196: 6, - 65197: 5, - 65198: 6, - 65199: 5, - 65200: 6, - 65201: 13, - 65202: 14, - 65203: 9, - 65204: 10, - 65205: 13, - 65206: 14, - 65207: 9, - 65208: 10, - 65209: 13, - 65210: 13, - 65211: 9, - 65212: 10, - 65213: 13, - 65214: 13, - 65215: 9, - 65216: 10, - 65217: 10, - 65218: 10, - 65219: 9, - 65220: 9, - 65221: 10, - 65222: 10, - 65223: 9, - 65224: 9, - 65225: 7, - 65226: 6, - 65227: 7, - 65228: 5, - 65229: 7, - 65230: 6, - 65231: 6, - 65232: 5, - 65233: 11, - 65234: 11, - 65235: 5, - 65236: 6, - 65237: 9, - 65238: 9, - 65239: 5, - 65240: 6, - 65241: 9, - 65242: 9, - 65243: 5, - 65244: 6, - 65245: 8, - 65246: 8, - 65247: 3, - 65248: 4, - 65249: 7, - 65250: 7, - 65251: 6, - 65252: 6, - 65253: 8, - 65254: 8, - 65255: 3, - 65256: 3, - 65257: 6, - 65258: 6, - 65259: 6, - 65260: 5, - 65261: 5, - 65262: 6, - 65263: 9, - 65264: 9, - 65265: 9, - 65266: 9, - 65267: 3, - 65268: 3, - 65269: 6, - 65270: 7, - 65271: 6, - 65272: 7, - 65273: 6, - 65274: 7, - 65275: 6, - 65276: 7, - 65533: 11, - 66304: 8, - 66305: 7, - 66306: 6, - 66307: 7, - 66308: 6, - 66309: 6, - 66310: 5, - 66311: 7, - 66312: 10, - 66313: 3, - 66314: 7, - 66315: 6, - 66316: 16, - 66317: 10, - 66318: 10, - 66319: 10, - 66320: 8, - 66321: 10, - 66322: 6, - 66323: 7, - 66324: 5, - 66325: 8, - 66326: 7, - 66327: 8, - 66328: 8, - 66329: 9, - 66330: 6, - 66331: 6, - 66332: 6, - 66333: 5, - 66334: 8, - 66336: 3, - 66337: 8, - 66338: 8, - 66339: 9, - 119552: 10, - 119553: 10, - 119554: 10, - 119555: 10, - 119556: 10, - 119557: 10, - 119558: 10, - 119559: 10, - 119560: 10, - 119561: 10, - 119562: 10, - 119563: 10, - 119564: 10, - 119565: 10, - 119566: 10, - 119567: 10, - 119568: 10, - 119569: 10, - 119570: 10, - 119571: 10, - 119572: 10, - 119573: 10, - 119574: 10, - 119575: 10, - 119576: 10, - 119577: 10, - 119578: 10, - 119579: 10, - 119580: 10, - 119581: 10, - 119582: 10, - 119583: 10, - 119584: 10, - 119585: 10, - 119586: 10, - 119587: 10, - 119588: 10, - 119589: 10, - 119590: 10, - 119591: 10, - 119592: 10, - 119593: 10, - 119594: 10, - 119595: 10, - 119596: 10, - 119597: 10, - 119598: 10, - 119599: 10, - 119600: 10, - 119601: 10, - 119602: 10, - 119603: 10, - 119604: 10, - 119605: 10, - 119606: 10, - 119607: 10, - 119608: 10, - 119609: 10, - 119610: 10, - 119611: 10, - 119612: 10, - 119613: 10, - 119614: 10, - 119615: 10, - 119616: 10, - 119617: 10, - 119618: 10, - 119619: 10, - 119620: 10, - 119621: 10, - 119622: 10, - 119623: 10, - 119624: 10, - 119625: 10, - 119626: 10, - 119627: 10, - 119628: 10, - 119629: 10, - 119630: 10, - 119631: 10, - 119632: 10, - 119633: 10, - 119634: 10, - 119635: 10, - 119636: 10, - 119637: 10, - 119638: 10, - 120120: 8, - 120121: 8, - 120123: 9, - 120124: 8, - 120125: 7, - 120126: 9, - 120128: 4, - 120129: 4, - 120130: 8, - 120131: 7, - 120132: 11, - 120134: 9, - 120138: 7, - 120139: 8, - 120140: 9, - 120141: 8, - 120142: 12, - 120143: 9, - 120144: 8, - 120146: 7, - 120147: 8, - 120148: 6, - 120149: 8, - 120150: 7, - 120151: 5, - 120152: 8, - 120153: 8, - 120154: 4, - 120155: 4, - 120156: 7, - 120157: 4, - 120158: 13, - 120159: 8, - 120160: 7, - 120161: 8, - 120162: 8, - 120163: 5, - 120164: 6, - 120165: 5, - 120166: 8, - 120167: 7, - 120168: 10, - 120169: 7, - 120170: 7, - 120171: 6, - 120224: 8, - 120225: 8, - 120226: 8, - 120227: 8, - 120228: 7, - 120229: 6, - 120230: 9, - 120231: 8, - 120232: 5, - 120233: 3, - 120234: 7, - 120235: 6, - 120236: 9, - 120237: 8, - 120238: 9, - 120239: 7, - 120240: 9, - 120241: 8, - 120242: 7, - 120243: 7, - 120244: 8, - 120245: 8, - 120246: 11, - 120247: 8, - 120248: 7, - 120249: 8, - 120250: 7, - 120251: 7, - 120252: 6, - 120253: 7, - 120254: 7, - 120255: 4, - 120256: 7, - 120257: 7, - 120258: 3, - 120259: 3, - 120260: 6, - 120261: 3, - 120262: 11, - 120263: 7, - 120264: 7, - 120265: 7, - 120266: 7, - 120267: 5, - 120268: 6, - 120269: 4, - 120270: 7, - 120271: 7, - 120272: 9, - 120273: 7, - 120274: 7, - 120275: 6, - 120792: 7, - 120793: 7, - 120794: 7, - 120795: 7, - 120796: 7, - 120797: 7, - 120798: 7, - 120799: 7, - 120800: 7, - 120801: 7, - 120802: 7, - 120803: 7, - 120804: 7, - 120805: 7, - 120806: 7, - 120807: 7, - 120808: 7, - 120809: 7, - 120810: 7, - 120811: 7, - 126464: 3, - 126465: 10, - 126466: 7, - 126467: 5, - 126469: 5, - 126470: 5, - 126471: 7, - 126472: 10, - 126473: 9, - 126474: 9, - 126475: 8, - 126476: 7, - 126477: 8, - 126478: 13, - 126479: 7, - 126480: 11, - 126481: 13, - 126482: 9, - 126483: 5, - 126484: 13, - 126485: 10, - 126486: 10, - 126487: 7, - 126488: 5, - 126489: 13, - 126490: 10, - 126491: 7, - 126492: 10, - 126493: 8, - 126494: 11, - 126495: 9, - 126497: 4, - 126498: 7, - 126500: 7, - 126503: 7, - 126505: 4, - 126506: 7, - 126507: 5, - 126508: 7, - 126509: 4, - 126510: 10, - 126511: 7, - 126512: 5, - 126513: 10, - 126514: 5, - 126516: 10, - 126517: 4, - 126518: 4, - 126519: 7, - 126521: 10, - 126523: 6, - 126561: 7, - 126562: 10, - 126564: 9, - 126567: 10, - 126568: 12, - 126569: 7, - 126570: 9, - 126572: 9, - 126573: 7, - 126574: 13, - 126575: 10, - 126576: 9, - 126577: 13, - 126578: 9, - 126580: 13, - 126581: 7, - 126582: 7, - 126583: 10, - 126585: 13, - 126586: 12, - 126587: 10, - 126588: 7, - 126590: 9, - 127024: 15, - 127025: 15, - 127026: 15, - 127027: 15, - 127028: 15, - 127029: 15, - 127030: 15, - 127031: 15, - 127032: 15, - 127033: 15, - 127034: 15, - 127035: 15, - 127036: 15, - 127037: 15, - 127038: 15, - 127039: 15, - 127040: 15, - 127041: 15, - 127042: 15, - 127043: 15, - 127044: 15, - 127045: 15, - 127046: 15, - 127047: 15, - 127048: 15, - 127049: 15, - 127050: 15, - 127051: 15, - 127052: 15, - 127053: 15, - 127054: 15, - 127055: 15, - 127056: 15, - 127057: 15, - 127058: 15, - 127059: 15, - 127060: 15, - 127061: 15, - 127062: 15, - 127063: 15, - 127064: 15, - 127065: 15, - 127066: 15, - 127067: 15, - 127068: 15, - 127069: 15, - 127070: 15, - 127071: 15, - 127072: 15, - 127073: 15, - 127074: 9, - 127075: 9, - 127076: 9, - 127077: 9, - 127078: 9, - 127079: 9, - 127080: 9, - 127081: 9, - 127082: 9, - 127083: 9, - 127084: 9, - 127085: 9, - 127086: 9, - 127087: 9, - 127088: 9, - 127089: 9, - 127090: 9, - 127091: 9, - 127092: 9, - 127093: 9, - 127094: 9, - 127095: 9, - 127096: 9, - 127097: 9, - 127098: 9, - 127099: 9, - 127100: 9, - 127101: 9, - 127102: 9, - 127103: 9, - 127104: 9, - 127105: 9, - 127106: 9, - 127107: 9, - 127108: 9, - 127109: 9, - 127110: 9, - 127111: 9, - 127112: 9, - 127113: 9, - 127114: 9, - 127115: 9, - 127116: 9, - 127117: 9, - 127118: 9, - 127119: 9, - 127120: 9, - 127121: 9, - 127122: 9, - 127123: 9, - 127136: 11, - 127137: 11, - 127138: 11, - 127139: 11, - 127140: 11, - 127141: 11, - 127142: 11, - 127143: 11, - 127144: 11, - 127145: 11, - 127146: 11, - 127147: 11, - 127148: 11, - 127149: 11, - 127150: 11, - 127153: 11, - 127154: 11, - 127155: 11, - 127156: 11, - 127157: 11, - 127158: 11, - 127159: 11, - 127160: 11, - 127161: 11, - 127162: 11, - 127163: 11, - 127164: 11, - 127165: 11, - 127166: 11, - 127169: 11, - 127170: 11, - 127171: 11, - 127172: 11, - 127173: 11, - 127174: 11, - 127175: 11, - 127176: 11, - 127177: 11, - 127178: 11, - 127179: 11, - 127180: 11, - 127181: 11, - 127182: 11, - 127183: 11, - 127185: 11, - 127186: 11, - 127187: 11, - 127188: 11, - 127189: 11, - 127190: 11, - 127191: 11, - 127192: 11, - 127193: 11, - 127194: 11, - 127195: 11, - 127196: 11, - 127197: 11, - 127198: 11, - 127199: 11, - 127761: 11, - 127762: 11, - 127763: 11, - 127764: 11, - 127765: 11, - 127766: 11, - 127767: 11, - 127768: 11, - 128045: 11, - 128046: 13, - 128049: 11, - 128053: 13, - 128512: 11, - 128513: 11, - 128514: 13, - 128515: 11, - 128516: 11, - 128517: 11, - 128518: 11, - 128519: 11, - 128520: 11, - 128521: 11, - 128522: 11, - 128523: 11, - 128524: 11, - 128525: 11, - 128526: 11, - 128527: 11, - 128528: 11, - 128529: 11, - 128530: 11, - 128531: 11, - 128532: 11, - 128533: 11, - 128534: 11, - 128535: 11, - 128536: 11, - 128537: 11, - 128538: 11, - 128539: 11, - 128540: 11, - 128541: 11, - 128542: 11, - 128543: 11, - 128544: 11, - 128545: 11, - 128546: 11, - 128547: 11, - 128549: 11, - 128550: 11, - 128551: 11, - 128552: 11, - 128553: 11, - 128554: 11, - 128555: 11, - 128557: 13, - 128558: 11, - 128559: 11, - 128560: 11, - 128561: 11, - 128562: 11, - 128563: 11, - 128564: 18, - 128565: 11, - 128566: 11, - 128567: 11, - 128568: 11, - 128569: 13, - 128570: 11, - 128571: 11, - 128572: 11, - 128573: 11, - 128574: 11, - 128575: 11, - 128576: 11, - 128579: 11, +var DejaVuFontWidthData = map[rune]uint8{ + 32: 3, + 33: 4, + 34: 5, + 35: 9, + 36: 7, + 37: 10, + 38: 9, + 39: 3, + 40: 4, + 41: 4, + 42: 6, + 43: 9, + 44: 3, + 45: 4, + 46: 3, + 47: 4, + 48: 7, + 49: 7, + 50: 7, + 51: 7, + 52: 7, + 53: 7, + 54: 7, + 55: 7, + 56: 7, + 57: 7, + 58: 4, + 59: 4, + 60: 9, + 61: 9, + 62: 9, + 63: 6, + 64: 11, + 65: 8, + 66: 8, + 67: 8, + 68: 8, + 69: 7, + 70: 6, + 71: 9, + 72: 8, + 73: 3, + 74: 3, + 75: 7, + 76: 6, + 77: 9, + 78: 8, + 79: 9, + 80: 7, + 81: 9, + 82: 8, + 83: 7, + 84: 7, + 85: 8, + 86: 8, + 87: 11, + 88: 8, + 89: 7, + 90: 8, + 91: 4, + 92: 4, + 93: 4, + 94: 9, + 95: 6, + 96: 6, + 97: 7, + 98: 7, + 99: 6, + 100: 7, + 101: 7, + 102: 4, + 103: 7, + 104: 7, + 105: 3, + 106: 3, + 107: 6, + 108: 3, + 109: 11, + 110: 7, + 111: 7, + 112: 7, + 113: 7, + 114: 5, + 115: 6, + 116: 4, + 117: 7, + 118: 7, + 119: 9, + 120: 7, + 121: 7, + 122: 6, + 123: 7, + 124: 4, + 125: 7, + 126: 9, + 161: 4, + 162: 7, + 163: 7, + 164: 7, + 165: 7, + 166: 4, + 167: 6, + 168: 6, + 169: 11, + 170: 5, + 171: 7, + 172: 9, + 174: 11, + 175: 6, + 176: 6, + 177: 9, + 178: 4, + 179: 4, + 180: 6, + 181: 7, + 182: 7, + 183: 3, + 184: 6, + 185: 4, + 186: 5, + 187: 7, + 188: 11, + 189: 11, + 190: 11, + 191: 6, + 192: 8, + 193: 8, + 194: 8, + 195: 8, + 196: 8, + 197: 8, + 198: 11, + 199: 8, + 200: 7, + 201: 7, + 202: 7, + 203: 7, + 204: 3, + 205: 3, + 206: 3, + 207: 3, + 208: 9, + 209: 8, + 210: 9, + 211: 9, + 212: 9, + 213: 9, + 214: 9, + 215: 9, + 216: 9, + 217: 8, + 218: 8, + 219: 8, + 220: 8, + 221: 7, + 222: 7, + 223: 7, + 224: 7, + 225: 7, + 226: 7, + 227: 7, + 228: 7, + 229: 7, + 230: 11, + 231: 6, + 232: 7, + 233: 7, + 234: 7, + 235: 7, + 236: 3, + 237: 3, + 238: 3, + 239: 3, + 240: 7, + 241: 7, + 242: 7, + 243: 7, + 244: 7, + 245: 7, + 246: 7, + 247: 9, + 248: 7, + 249: 7, + 250: 7, + 251: 7, + 252: 7, + 253: 7, + 254: 7, + 255: 7, } From d07f3ef6ea999e5781e19af4e84f45f7ce6cec4a Mon Sep 17 00:00:00 2001 From: bytedream Date: Thu, 27 Mar 2025 15:32:42 +0100 Subject: [PATCH 06/14] Rename font width to glyph width --- build/{generate-font-width.go => generate-glyph-width.go} | 6 +++--- modules/badge/badge.go | 6 +++--- modules/badge/{badge_font_width.go => badge_glyph_width.go} | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename build/{generate-font-width.go => generate-glyph-width.go} (93%) rename modules/badge/{badge_font_width.go => badge_glyph_width.go} (94%) diff --git a/build/generate-font-width.go b/build/generate-glyph-width.go similarity index 93% rename from build/generate-font-width.go rename to build/generate-glyph-width.go index 5b4e86659f863..d6273c3f2595e 100644 --- a/build/generate-font-width.go +++ b/build/generate-glyph-width.go @@ -24,7 +24,7 @@ import ( const dejavuZip = "https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip" -var flagOut = flag.String("o", "modules/badge/badge_font_width.go", "out") +var flagOut = flag.String("o", "modules/badge/badge_glyph_width.go", "out") func main() { flag.Parse() @@ -117,7 +117,7 @@ const hdr = `// Copyright 2025 The Gitea Authors. All rights reserved. package badge -// Code generated by build/generate-font-width.go. DO NOT EDIT. +// Code generated by build/generate-glyph-width.go. DO NOT EDIT. // Sourced from %s -var DejaVuFontWidthData = %s +var DejaVuGlyphWidthData = %s ` diff --git a/modules/badge/badge.go b/modules/badge/badge.go index 9089151194252..89930f2db1253 100644 --- a/modules/badge/badge.go +++ b/modules/badge/badge.go @@ -90,11 +90,11 @@ func calculateTextWidth(text string) int { width := 0 for _, char := range text { - charWidth, ok := DejaVuFontWidthData[char] + charWidth, ok := DejaVuGlyphWidthData[char] if !ok { - // use the width of 'm' in case of missing font width data for a printable character + // use the width of 'm' in case of missing glyph width data for a printable character if unicode.IsPrint(char) { - charWidth = DejaVuFontWidthData['m'] + charWidth = DejaVuGlyphWidthData['m'] } else { charWidth = 0 } diff --git a/modules/badge/badge_font_width.go b/modules/badge/badge_glyph_width.go similarity index 94% rename from modules/badge/badge_font_width.go rename to modules/badge/badge_glyph_width.go index 5cc6c4a471034..9809a0eebc37e 100644 --- a/modules/badge/badge_font_width.go +++ b/modules/badge/badge_glyph_width.go @@ -3,9 +3,9 @@ package badge -// Code generated by build/generate-font-width.go. DO NOT EDIT. +// Code generated by build/generate-glyph-width.go. DO NOT EDIT. // Sourced from https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip -var DejaVuFontWidthData = map[rune]uint8{ +var DejaVuGlyphWidthData = map[rune]uint8{ 32: 3, 33: 4, 34: 5, From 36d6b9e2ea26f40ed6703bace6fbbf64bbed7829 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 28 Mar 2025 10:36:55 +0800 Subject: [PATCH 07/14] use devtest to check the result --- routers/web/devtest/devtest.go | 178 +++++++++++------- routers/web/web.go | 2 +- templates/devtest/badge-actions-svg.tmpl | 10 + ...sign-badge.tmpl => badge-commit-sign.tmpl} | 0 4 files changed, 116 insertions(+), 74 deletions(-) create mode 100644 templates/devtest/badge-actions-svg.tmpl rename templates/devtest/{commit-sign-badge.tmpl => badge-commit-sign.tmpl} (100%) diff --git a/routers/web/devtest/devtest.go b/routers/web/devtest/devtest.go index 1ea1398173e0c..8001c8ca73d79 100644 --- a/routers/web/devtest/devtest.go +++ b/routers/web/devtest/devtest.go @@ -4,14 +4,17 @@ package devtest import ( + "html/template" "net/http" "path" "strings" "time" + "unicode" "code.gitea.io/gitea/models/asymkey" "code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/badge" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/templates" "code.gitea.io/gitea/services/context" @@ -45,84 +48,113 @@ func FetchActionTest(ctx *context.Context) { ctx.JSONRedirect("") } -func prepareMockData(ctx *context.Context) { - if ctx.Req.URL.Path == "/devtest/gitea-ui" { - now := time.Now() - ctx.Data["TimeNow"] = now - ctx.Data["TimePast5s"] = now.Add(-5 * time.Second) - ctx.Data["TimeFuture5s"] = now.Add(5 * time.Second) - ctx.Data["TimePast2m"] = now.Add(-2 * time.Minute) - ctx.Data["TimeFuture2m"] = now.Add(2 * time.Minute) - ctx.Data["TimePast1y"] = now.Add(-1 * 366 * 86400 * time.Second) - ctx.Data["TimeFuture1y"] = now.Add(1 * 366 * 86400 * time.Second) - } +func prepareMockDataGiteaUI(ctx *context.Context) { + now := time.Now() + ctx.Data["TimeNow"] = now + ctx.Data["TimePast5s"] = now.Add(-5 * time.Second) + ctx.Data["TimeFuture5s"] = now.Add(5 * time.Second) + ctx.Data["TimePast2m"] = now.Add(-2 * time.Minute) + ctx.Data["TimeFuture2m"] = now.Add(2 * time.Minute) + ctx.Data["TimePast1y"] = now.Add(-1 * 366 * 86400 * time.Second) + ctx.Data["TimeFuture1y"] = now.Add(1 * 366 * 86400 * time.Second) +} + +func prepareMockDataBadgeCommitSign(ctx *context.Context) { + var commits []*asymkey.SignCommit + mockUsers, _ := db.Find[user_model.User](ctx, user_model.SearchUserOptions{ListOptions: db.ListOptions{PageSize: 1}}) + mockUser := mockUsers[0] + commits = append(commits, &asymkey.SignCommit{ + Verification: &asymkey.CommitVerification{}, + UserCommit: &user_model.UserCommit{ + Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, + }, + }) + commits = append(commits, &asymkey.SignCommit{ + Verification: &asymkey.CommitVerification{ + Verified: true, + Reason: "name / key-id", + SigningUser: mockUser, + SigningKey: &asymkey.GPGKey{KeyID: "12345678"}, + TrustStatus: "trusted", + }, + UserCommit: &user_model.UserCommit{ + User: mockUser, + Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, + }, + }) + commits = append(commits, &asymkey.SignCommit{ + Verification: &asymkey.CommitVerification{ + Verified: true, + Reason: "name / key-id", + SigningUser: mockUser, + SigningSSHKey: &asymkey.PublicKey{Fingerprint: "aa:bb:cc:dd:ee"}, + TrustStatus: "untrusted", + }, + UserCommit: &user_model.UserCommit{ + User: mockUser, + Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, + }, + }) + commits = append(commits, &asymkey.SignCommit{ + Verification: &asymkey.CommitVerification{ + Verified: true, + Reason: "name / key-id", + SigningUser: mockUser, + SigningSSHKey: &asymkey.PublicKey{Fingerprint: "aa:bb:cc:dd:ee"}, + TrustStatus: "other(unmatch)", + }, + UserCommit: &user_model.UserCommit{ + User: mockUser, + Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, + }, + }) + commits = append(commits, &asymkey.SignCommit{ + Verification: &asymkey.CommitVerification{ + Warning: true, + Reason: "gpg.error", + SigningEmail: "test@example.com", + }, + UserCommit: &user_model.UserCommit{ + User: mockUser, + Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, + }, + }) + + ctx.Data["MockCommits"] = commits +} - if ctx.Req.URL.Path == "/devtest/commit-sign-badge" { - var commits []*asymkey.SignCommit - mockUsers, _ := db.Find[user_model.User](ctx, user_model.SearchUserOptions{ListOptions: db.ListOptions{PageSize: 1}}) - mockUser := mockUsers[0] - commits = append(commits, &asymkey.SignCommit{ - Verification: &asymkey.CommitVerification{}, - UserCommit: &user_model.UserCommit{ - Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, - }, - }) - commits = append(commits, &asymkey.SignCommit{ - Verification: &asymkey.CommitVerification{ - Verified: true, - Reason: "name / key-id", - SigningUser: mockUser, - SigningKey: &asymkey.GPGKey{KeyID: "12345678"}, - TrustStatus: "trusted", - }, - UserCommit: &user_model.UserCommit{ - User: mockUser, - Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, - }, - }) - commits = append(commits, &asymkey.SignCommit{ - Verification: &asymkey.CommitVerification{ - Verified: true, - Reason: "name / key-id", - SigningUser: mockUser, - SigningSSHKey: &asymkey.PublicKey{Fingerprint: "aa:bb:cc:dd:ee"}, - TrustStatus: "untrusted", - }, - UserCommit: &user_model.UserCommit{ - User: mockUser, - Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, - }, - }) - commits = append(commits, &asymkey.SignCommit{ - Verification: &asymkey.CommitVerification{ - Verified: true, - Reason: "name / key-id", - SigningUser: mockUser, - SigningSSHKey: &asymkey.PublicKey{Fingerprint: "aa:bb:cc:dd:ee"}, - TrustStatus: "other(unmatch)", - }, - UserCommit: &user_model.UserCommit{ - User: mockUser, - Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, - }, - }) - commits = append(commits, &asymkey.SignCommit{ - Verification: &asymkey.CommitVerification{ - Warning: true, - Reason: "gpg.error", - SigningEmail: "test@example.com", - }, - UserCommit: &user_model.UserCommit{ - User: mockUser, - Commit: &git.Commit{ID: git.Sha1ObjectFormat.EmptyObjectID()}, - }, - }) +func prepareMockDataBadgeActionsSvg(ctx *context.Context) { + var badges []badge.Badge + for r := rune(0); r < 256; r++ { + if unicode.IsPrint(r) { + s := strings.Repeat(string(r), 15) + badges = append(badges, badge.GenerateBadge(s, s, "green")) + } + } + var mockSVGs []template.HTML + for _, b := range badges { + h, err := ctx.RenderToHTML("shared/actions/runner_badge", map[string]any{"Badge": b}) + if err != nil { + ctx.ServerError("RenderToHTML", err) + return + } + mockSVGs = append(mockSVGs, h) + } + ctx.Data["MockSVGs"] = mockSVGs +} - ctx.Data["MockCommits"] = commits +func prepareMockData(ctx *context.Context) { + switch ctx.Req.URL.Path { + case "/devtest/gitea-ui": + prepareMockDataGiteaUI(ctx) + case "/devtest/badge-commit-sign": + prepareMockDataBadgeCommitSign(ctx) + case "/devtest/badge-actions-svg": + prepareMockDataBadgeActionsSvg(ctx) } } -func Tmpl(ctx *context.Context) { +func TmplCommon(ctx *context.Context) { prepareMockData(ctx) if ctx.Req.Method == "POST" { _ = ctx.Req.ParseForm() diff --git a/routers/web/web.go b/routers/web/web.go index 4d635f04f0c06..455d0a3a0d4b3 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1639,7 +1639,7 @@ func registerRoutes(m *web.Router) { m.Group("/devtest", func() { m.Any("", devtest.List) m.Any("/fetch-action-test", devtest.FetchActionTest) - m.Any("/{sub}", devtest.Tmpl) + m.Any("/{sub}", devtest.TmplCommon) m.Get("/repo-action-view/{run}/{job}", devtest.MockActionsView) m.Post("/actions-mock/runs/{run}/jobs/{job}", web.Bind(actions.ViewRequest{}), devtest.MockActionsRunsJobs) }) diff --git a/templates/devtest/badge-actions-svg.tmpl b/templates/devtest/badge-actions-svg.tmpl new file mode 100644 index 0000000000000..c144225f114be --- /dev/null +++ b/templates/devtest/badge-actions-svg.tmpl @@ -0,0 +1,10 @@ +{{template "devtest/devtest-header"}} +
+
+

Actions SVG

+ {{range $badgeSVG := .MockSVGs}} +
{{$badgeSVG}}
+ {{end}} +
+
+{{template "devtest/devtest-footer"}} diff --git a/templates/devtest/commit-sign-badge.tmpl b/templates/devtest/badge-commit-sign.tmpl similarity index 100% rename from templates/devtest/commit-sign-badge.tmpl rename to templates/devtest/badge-commit-sign.tmpl From b5926cae5f842d0aaf54a140d84366770f135316 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 28 Mar 2025 18:37:42 +0800 Subject: [PATCH 08/14] render to check --- modules/badge/badge.go | 1 + routers/web/devtest/devtest.go | 4 +++- templates/shared/actions/runner_badge.tmpl | 8 ++++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/badge/badge.go b/modules/badge/badge.go index 89930f2db1253..4453b25b2bd70 100644 --- a/modules/badge/badge.go +++ b/modules/badge/badge.go @@ -36,6 +36,7 @@ func (t Text) TextLength() int { } type Badge struct { + IDPrefix string Color string FontSize int Label Text diff --git a/routers/web/devtest/devtest.go b/routers/web/devtest/devtest.go index 8001c8ca73d79..c09883280cd0e 100644 --- a/routers/web/devtest/devtest.go +++ b/routers/web/devtest/devtest.go @@ -7,6 +7,7 @@ import ( "html/template" "net/http" "path" + "strconv" "strings" "time" "unicode" @@ -132,7 +133,8 @@ func prepareMockDataBadgeActionsSvg(ctx *context.Context) { } } var mockSVGs []template.HTML - for _, b := range badges { + for i, b := range badges { + b.IDPrefix = "devtest-" + strconv.FormatInt(int64(i), 10) + "-" h, err := ctx.RenderToHTML("shared/actions/runner_badge", map[string]any{"Badge": b}) if err != nil { ctx.ServerError("RenderToHTML", err) diff --git a/templates/shared/actions/runner_badge.tmpl b/templates/shared/actions/runner_badge.tmpl index 63f2fc50f20ee..9421c0c257c91 100644 --- a/templates/shared/actions/runner_badge.tmpl +++ b/templates/shared/actions/runner_badge.tmpl @@ -1,17 +1,17 @@ {{.Badge.Label.Text}}: {{.Badge.Message.Text}} - + - + - + - + From ca43caff08ac8ab832a81fa6e970cb3b4a948d4d Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 28 Mar 2025 18:56:30 +0800 Subject: [PATCH 09/14] test fonts --- modules/badge/badge.go | 19 +++++++++++-------- routers/web/devtest/devtest.go | 16 ++++++++++++---- templates/devtest/badge-actions-svg.tmpl | 12 ++++++++++-- templates/shared/actions/runner_badge.tmpl | 2 +- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/modules/badge/badge.go b/modules/badge/badge.go index 4453b25b2bd70..1b52afb7582a3 100644 --- a/modules/badge/badge.go +++ b/modules/badge/badge.go @@ -36,11 +36,12 @@ func (t Text) TextLength() int { } type Badge struct { - IDPrefix string - Color string - FontSize int - Label Text - Message Text + IDPrefix string + FontFamily string + Color string + FontSize int + Label Text + Message Text } func (b Badge) Width() int { @@ -48,9 +49,10 @@ func (b Badge) Width() int { } const ( - defaultOffset = 10 - defaultFontSize = 11 - DefaultColor = "#9f9f9f" // Grey + defaultOffset = 10 + defaultFontSize = 11 + DefaultColor = "#9f9f9f" // Grey + DefaultFontFamily = "DejaVu Sans,Verdana,Geneva,sans-serif" ) var StatusColorMap = map[actions_model.Status]string{ @@ -72,6 +74,7 @@ func GenerateBadge(label, message, color string) Badge { lx := lw * 5 mx := lw*10 + mw*5 - 10 return Badge{ + FontFamily: DefaultFontFamily, Label: Text{ text: label, width: lw, diff --git a/routers/web/devtest/devtest.go b/routers/web/devtest/devtest.go index c09883280cd0e..063ff42409fa9 100644 --- a/routers/web/devtest/devtest.go +++ b/routers/web/devtest/devtest.go @@ -18,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/badge" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/services/context" ) @@ -125,24 +126,31 @@ func prepareMockDataBadgeCommitSign(ctx *context.Context) { } func prepareMockDataBadgeActionsSvg(ctx *context.Context) { + fontFamilyNames := strings.Split(badge.DefaultFontFamily, ",") + selectedFontFamilyName := ctx.FormString("font", fontFamilyNames[0]) var badges []badge.Badge + badges = append(badges, badge.GenerateBadge("啊啊啊啊啊啊啊啊啊啊啊啊", "🌞🌞🌞🌞🌞", "green")) for r := rune(0); r < 256; r++ { if unicode.IsPrint(r) { s := strings.Repeat(string(r), 15) - badges = append(badges, badge.GenerateBadge(s, s, "green")) + badges = append(badges, badge.GenerateBadge(s, util.TruncateRunes(s, 7), "green")) } } - var mockSVGs []template.HTML + + var badgeSVGs []template.HTML for i, b := range badges { b.IDPrefix = "devtest-" + strconv.FormatInt(int64(i), 10) + "-" + b.FontFamily = selectedFontFamilyName h, err := ctx.RenderToHTML("shared/actions/runner_badge", map[string]any{"Badge": b}) if err != nil { ctx.ServerError("RenderToHTML", err) return } - mockSVGs = append(mockSVGs, h) + badgeSVGs = append(badgeSVGs, h) } - ctx.Data["MockSVGs"] = mockSVGs + ctx.Data["BadgeSVGs"] = badgeSVGs + ctx.Data["BadgeFontFamilyNames"] = fontFamilyNames + ctx.Data["SelectedFontFamilyName"] = selectedFontFamilyName } func prepareMockData(ctx *context.Context) { diff --git a/templates/devtest/badge-actions-svg.tmpl b/templates/devtest/badge-actions-svg.tmpl index c144225f114be..8125793bb3fa4 100644 --- a/templates/devtest/badge-actions-svg.tmpl +++ b/templates/devtest/badge-actions-svg.tmpl @@ -2,9 +2,17 @@

Actions SVG

- {{range $badgeSVG := .MockSVGs}} -
{{$badgeSVG}}
+
+ {{range $fontName := .BadgeFontFamilyNames}} + + {{end}} + +
+
+ {{range $badgeSVG := .BadgeSVGs}} +
{{$badgeSVG}}
{{end}} +
{{template "devtest/devtest-footer"}} diff --git a/templates/shared/actions/runner_badge.tmpl b/templates/shared/actions/runner_badge.tmpl index 9421c0c257c91..1ba9be09fbfcc 100644 --- a/templates/shared/actions/runner_badge.tmpl +++ b/templates/shared/actions/runner_badge.tmpl @@ -13,7 +13,7 @@
- From bcc28aafae96076b527b1d87514811a758e2800a Mon Sep 17 00:00:00 2001 From: bytedream Date: Fri, 28 Mar 2025 12:17:29 +0100 Subject: [PATCH 10/14] Trim text spaces --- modules/badge/badge.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/badge/badge.go b/modules/badge/badge.go index 1b52afb7582a3..accda35e334f0 100644 --- a/modules/badge/badge.go +++ b/modules/badge/badge.go @@ -4,6 +4,7 @@ package badge import ( + "strings" "unicode" actions_model "code.gitea.io/gitea/models/actions" @@ -93,7 +94,7 @@ func GenerateBadge(label, message, color string) Badge { func calculateTextWidth(text string) int { width := 0 - for _, char := range text { + for _, char := range strings.TrimSpace(text) { charWidth, ok := DejaVuGlyphWidthData[char] if !ok { // use the width of 'm' in case of missing glyph width data for a printable character From ffc8c1dbc56a330015f5b2b7ce4320ef8ed6c297 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 28 Mar 2025 19:18:58 +0800 Subject: [PATCH 11/14] use sync.OnceValue --- modules/badge/badge.go | 6 +- modules/badge/badge_glyph_width.go | 386 +++++++++++++++-------------- 2 files changed, 198 insertions(+), 194 deletions(-) diff --git a/modules/badge/badge.go b/modules/badge/badge.go index accda35e334f0..fdf9866f607a5 100644 --- a/modules/badge/badge.go +++ b/modules/badge/badge.go @@ -93,13 +93,13 @@ func GenerateBadge(label, message, color string) Badge { func calculateTextWidth(text string) int { width := 0 - + widthData := DejaVuGlyphWidthData() for _, char := range strings.TrimSpace(text) { - charWidth, ok := DejaVuGlyphWidthData[char] + charWidth, ok := widthData[char] if !ok { // use the width of 'm' in case of missing glyph width data for a printable character if unicode.IsPrint(char) { - charWidth = DejaVuGlyphWidthData['m'] + charWidth = widthData['m'] } else { charWidth = 0 } diff --git a/modules/badge/badge_glyph_width.go b/modules/badge/badge_glyph_width.go index 9809a0eebc37e..6af917fd5af93 100644 --- a/modules/badge/badge_glyph_width.go +++ b/modules/badge/badge_glyph_width.go @@ -3,196 +3,200 @@ package badge +import "sync" + // Code generated by build/generate-glyph-width.go. DO NOT EDIT. // Sourced from https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip -var DejaVuGlyphWidthData = map[rune]uint8{ - 32: 3, - 33: 4, - 34: 5, - 35: 9, - 36: 7, - 37: 10, - 38: 9, - 39: 3, - 40: 4, - 41: 4, - 42: 6, - 43: 9, - 44: 3, - 45: 4, - 46: 3, - 47: 4, - 48: 7, - 49: 7, - 50: 7, - 51: 7, - 52: 7, - 53: 7, - 54: 7, - 55: 7, - 56: 7, - 57: 7, - 58: 4, - 59: 4, - 60: 9, - 61: 9, - 62: 9, - 63: 6, - 64: 11, - 65: 8, - 66: 8, - 67: 8, - 68: 8, - 69: 7, - 70: 6, - 71: 9, - 72: 8, - 73: 3, - 74: 3, - 75: 7, - 76: 6, - 77: 9, - 78: 8, - 79: 9, - 80: 7, - 81: 9, - 82: 8, - 83: 7, - 84: 7, - 85: 8, - 86: 8, - 87: 11, - 88: 8, - 89: 7, - 90: 8, - 91: 4, - 92: 4, - 93: 4, - 94: 9, - 95: 6, - 96: 6, - 97: 7, - 98: 7, - 99: 6, - 100: 7, - 101: 7, - 102: 4, - 103: 7, - 104: 7, - 105: 3, - 106: 3, - 107: 6, - 108: 3, - 109: 11, - 110: 7, - 111: 7, - 112: 7, - 113: 7, - 114: 5, - 115: 6, - 116: 4, - 117: 7, - 118: 7, - 119: 9, - 120: 7, - 121: 7, - 122: 6, - 123: 7, - 124: 4, - 125: 7, - 126: 9, - 161: 4, - 162: 7, - 163: 7, - 164: 7, - 165: 7, - 166: 4, - 167: 6, - 168: 6, - 169: 11, - 170: 5, - 171: 7, - 172: 9, - 174: 11, - 175: 6, - 176: 6, - 177: 9, - 178: 4, - 179: 4, - 180: 6, - 181: 7, - 182: 7, - 183: 3, - 184: 6, - 185: 4, - 186: 5, - 187: 7, - 188: 11, - 189: 11, - 190: 11, - 191: 6, - 192: 8, - 193: 8, - 194: 8, - 195: 8, - 196: 8, - 197: 8, - 198: 11, - 199: 8, - 200: 7, - 201: 7, - 202: 7, - 203: 7, - 204: 3, - 205: 3, - 206: 3, - 207: 3, - 208: 9, - 209: 8, - 210: 9, - 211: 9, - 212: 9, - 213: 9, - 214: 9, - 215: 9, - 216: 9, - 217: 8, - 218: 8, - 219: 8, - 220: 8, - 221: 7, - 222: 7, - 223: 7, - 224: 7, - 225: 7, - 226: 7, - 227: 7, - 228: 7, - 229: 7, - 230: 11, - 231: 6, - 232: 7, - 233: 7, - 234: 7, - 235: 7, - 236: 3, - 237: 3, - 238: 3, - 239: 3, - 240: 7, - 241: 7, - 242: 7, - 243: 7, - 244: 7, - 245: 7, - 246: 7, - 247: 9, - 248: 7, - 249: 7, - 250: 7, - 251: 7, - 252: 7, - 253: 7, - 254: 7, - 255: 7, -} +var DejaVuGlyphWidthData = sync.OnceValue(func() map[rune]uint8 { + return map[rune]uint8{ + 32: 3, + 33: 4, + 34: 5, + 35: 9, + 36: 7, + 37: 10, + 38: 9, + 39: 3, + 40: 4, + 41: 4, + 42: 6, + 43: 9, + 44: 3, + 45: 4, + 46: 3, + 47: 4, + 48: 7, + 49: 7, + 50: 7, + 51: 7, + 52: 7, + 53: 7, + 54: 7, + 55: 7, + 56: 7, + 57: 7, + 58: 4, + 59: 4, + 60: 9, + 61: 9, + 62: 9, + 63: 6, + 64: 11, + 65: 8, + 66: 8, + 67: 8, + 68: 8, + 69: 7, + 70: 6, + 71: 9, + 72: 8, + 73: 3, + 74: 3, + 75: 7, + 76: 6, + 77: 9, + 78: 8, + 79: 9, + 80: 7, + 81: 9, + 82: 8, + 83: 7, + 84: 7, + 85: 8, + 86: 8, + 87: 11, + 88: 8, + 89: 7, + 90: 8, + 91: 4, + 92: 4, + 93: 4, + 94: 9, + 95: 6, + 96: 6, + 97: 7, + 98: 7, + 99: 6, + 100: 7, + 101: 7, + 102: 4, + 103: 7, + 104: 7, + 105: 3, + 106: 3, + 107: 6, + 108: 3, + 109: 11, + 110: 7, + 111: 7, + 112: 7, + 113: 7, + 114: 5, + 115: 6, + 116: 4, + 117: 7, + 118: 7, + 119: 9, + 120: 7, + 121: 7, + 122: 6, + 123: 7, + 124: 4, + 125: 7, + 126: 9, + 161: 4, + 162: 7, + 163: 7, + 164: 7, + 165: 7, + 166: 4, + 167: 6, + 168: 6, + 169: 11, + 170: 5, + 171: 7, + 172: 9, + 174: 11, + 175: 6, + 176: 6, + 177: 9, + 178: 4, + 179: 4, + 180: 6, + 181: 7, + 182: 7, + 183: 3, + 184: 6, + 185: 4, + 186: 5, + 187: 7, + 188: 11, + 189: 11, + 190: 11, + 191: 6, + 192: 8, + 193: 8, + 194: 8, + 195: 8, + 196: 8, + 197: 8, + 198: 11, + 199: 8, + 200: 7, + 201: 7, + 202: 7, + 203: 7, + 204: 3, + 205: 3, + 206: 3, + 207: 3, + 208: 9, + 209: 8, + 210: 9, + 211: 9, + 212: 9, + 213: 9, + 214: 9, + 215: 9, + 216: 9, + 217: 8, + 218: 8, + 219: 8, + 220: 8, + 221: 7, + 222: 7, + 223: 7, + 224: 7, + 225: 7, + 226: 7, + 227: 7, + 228: 7, + 229: 7, + 230: 11, + 231: 6, + 232: 7, + 233: 7, + 234: 7, + 235: 7, + 236: 3, + 237: 3, + 238: 3, + 239: 3, + 240: 7, + 241: 7, + 242: 7, + 243: 7, + 244: 7, + 245: 7, + 246: 7, + 247: 9, + 248: 7, + 249: 7, + 250: 7, + 251: 7, + 252: 7, + 253: 7, + 254: 7, + 255: 7, + } +}) From 0660ebf1187f9503e2a9584e7f632949663ee081 Mon Sep 17 00:00:00 2001 From: bytedream Date: Fri, 28 Mar 2025 12:37:41 +0100 Subject: [PATCH 12/14] Remove glyph generate buildscript --- build/generate-glyph-width.go | 123 ----------------------------- modules/badge/badge_glyph_width.go | 4 +- 2 files changed, 2 insertions(+), 125 deletions(-) delete mode 100644 build/generate-glyph-width.go diff --git a/build/generate-glyph-width.go b/build/generate-glyph-width.go deleted file mode 100644 index d6273c3f2595e..0000000000000 --- a/build/generate-glyph-width.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -//go:build ignore - -package main - -import ( - "archive/zip" - "bytes" - "flag" - "fmt" - "go/format" - "io" - "log" - "net/http" - "os" - "strings" - "unicode" - - "golang.org/x/image/font" - "golang.org/x/image/font/sfnt" -) - -const dejavuZip = "https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip" - -var flagOut = flag.String("o", "modules/badge/badge_glyph_width.go", "out") - -func main() { - flag.Parse() - - ttfFont := extractFont() - - str := "map[rune]uint8{\n" - for r := rune(0); r <= unicode.MaxLatin1; r++ { - if !unicode.IsPrint(r) { - continue - } - - glyphIndex, err := ttfFont.GlyphIndex(nil, r) - if err != nil { - log.Fatalf("Failed to find glyph for rune %s: %v", string(r), err) - } else if glyphIndex == 0 { - continue - } - - advancedWidth, err := ttfFont.GlyphAdvance(nil, glyphIndex, 11, font.HintingNone) - if err != nil { - log.Fatalf("Failed to find font width for rune %s: %v", string(r), err) - } else if advancedWidth == 0 { - continue - } - - str += fmt.Sprintf("\t%d: %d,\n", r, advancedWidth) - } - str += "}" - - data, err := format.Source([]byte(str)) - if err != nil { - log.Fatalf("Failed to format generated code: %v", err) - } - - err = os.WriteFile(*flagOut, []byte(fmt.Sprintf(hdr, dejavuZip, data)), 0o644) - if err != nil { - log.Fatalf("Failed to write file: %v", err) - } -} - -func extractFont() *sfnt.Font { - resp, err := http.Get(dejavuZip) - if err != nil { - log.Fatalf("Failed to download archive: %v", err) - } - defer resp.Body.Close() - - buf, err := io.ReadAll(resp.Body) - if err != nil { - log.Fatalf("Failed to read download archive: %v", err) - } - - bufReader := io.NewSectionReader(bytes.NewReader(buf), 0, int64(len(buf))) - - archive, err := zip.NewReader(bufReader, int64(len(buf))) - if err != nil { - log.Fatalf("Failed to unzip archive: %v", err) - } - - var fontBytes []byte - for _, file := range archive.File { - if strings.HasSuffix(file.Name, ".ttf") { - ttfFile, err := file.Open() - if err != nil { - log.Fatalf("Failed to extract font from archive: %v", err) - } - - if fontBytes, err = io.ReadAll(ttfFile); err != nil { - log.Fatalf("Failed to extract font from archive: %v", err) - } - - break - } - } - if fontBytes == nil { - log.Fatalf("Failed to find font in archive") - } - - font, err := sfnt.Parse(fontBytes) - if err != nil { - log.Fatalf("Failed to parse font: %v", err) - } - - return font -} - -const hdr = `// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package badge - -// Code generated by build/generate-glyph-width.go. DO NOT EDIT. -// Sourced from %s -var DejaVuGlyphWidthData = %s -` diff --git a/modules/badge/badge_glyph_width.go b/modules/badge/badge_glyph_width.go index 6af917fd5af93..6968ae9b90208 100644 --- a/modules/badge/badge_glyph_width.go +++ b/modules/badge/badge_glyph_width.go @@ -5,8 +5,8 @@ package badge import "sync" -// Code generated by build/generate-glyph-width.go. DO NOT EDIT. -// Sourced from https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip +// DejaVuGlyphWidthData is generated by `sfnt.Face.GlyphAdvance(nil, , 11, font.HintingNone)`with DejaVu Sans +// v2.37 (https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip). var DejaVuGlyphWidthData = sync.OnceValue(func() map[rune]uint8 { return map[rune]uint8{ 32: 3, From fae2d3dad73c3bb089246511052470c364678a32 Mon Sep 17 00:00:00 2001 From: bytedream Date: Fri, 28 Mar 2025 12:39:54 +0100 Subject: [PATCH 13/14] Fix doc typo --- modules/badge/badge_glyph_width.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/badge/badge_glyph_width.go b/modules/badge/badge_glyph_width.go index 6968ae9b90208..e767fc577da86 100644 --- a/modules/badge/badge_glyph_width.go +++ b/modules/badge/badge_glyph_width.go @@ -5,7 +5,7 @@ package badge import "sync" -// DejaVuGlyphWidthData is generated by `sfnt.Face.GlyphAdvance(nil, , 11, font.HintingNone)`with DejaVu Sans +// DejaVuGlyphWidthData is generated by `sfnt.Face.GlyphAdvance(nil, , 11, font.HintingNone)` with DejaVu Sans // v2.37 (https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip). var DejaVuGlyphWidthData = sync.OnceValue(func() map[rune]uint8 { return map[rune]uint8{ From 03200189ea2b263b7ba434df092aca12a0523747 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Fri, 28 Mar 2025 19:40:46 +0800 Subject: [PATCH 14/14] add some comments about how to test the rendered images --- modules/badge/badge_glyph_width.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/badge/badge_glyph_width.go b/modules/badge/badge_glyph_width.go index e767fc577da86..e8e43ec9cb950 100644 --- a/modules/badge/badge_glyph_width.go +++ b/modules/badge/badge_glyph_width.go @@ -7,6 +7,12 @@ import "sync" // DejaVuGlyphWidthData is generated by `sfnt.Face.GlyphAdvance(nil, , 11, font.HintingNone)` with DejaVu Sans // v2.37 (https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-sans-ttf-2.37.zip). +// +// Fonts defined in "DefaultFontFamily" all have similar widths (including "DejaVu Sans"), +// and these widths are fixed and don't seem to change. +// +// A devtest page "/devtest/badge-actions-svg" could be used to check the rendered images. + var DejaVuGlyphWidthData = sync.OnceValue(func() map[rune]uint8 { return map[rune]uint8{ 32: 3,