My aggregated monorepo of OCaml code, automaintained
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

WIP: site redesign, odoc extension API updates, and new content

- odoc extension API: add link-phase enrichment support for extensions
- odoc-jons-plugins: new site shell with nav bar, recent posts with
featured card layout, and updated CSS
- site-builder: support projects/ directory and improved rule generation
- site: redesigned homepage with hero section and recent posts cards
- site: updated blog index layout
- onnxrt docs: minor .mld cleanup
- New blog images and content (weeknotes, examination map, fungus svg)
- Add mockup.html for design iteration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+4505 -84
+1 -1
odoc-docsite/src/odoc_docsite_css.ml
··· 90 90 height: var(--header-height); 91 91 background: var(--sidebar-bg); 92 92 border-bottom: 1px solid var(--border-color); 93 + box-shadow: var(--shadow-sm); 93 94 display: flex; 94 95 align-items: center; 95 96 padding: 0 24px; 96 97 z-index: 100; 97 - box-shadow: var(--shadow-sm); 98 98 } 99 99 100 100 .docsite-header-brand {
+383 -1
odoc-jons-plugins/src/odoc_jons_plugins.ml
··· 387 387 let hidden_tag_extension prefix = 388 388 let module E = struct 389 389 let prefix = prefix 390 - 391 390 let to_document ~tag:_ _content = 392 391 Api.simple_output [] 393 392 end in ··· 395 394 396 395 let () = 397 396 List.iter hidden_tag_extension [ "published"; "notanotebook"; "packages" ] 397 + 398 + (* --- Recent posts extension --- *) 399 + 400 + module Recent_posts = struct 401 + open Odoc_document.Types 402 + 403 + let prefix = "recent-posts" 404 + 405 + (* Check if a string matches YYYY-MM-DD date pattern *) 406 + let is_date s = 407 + let s = Stdlib.String.trim s in 408 + Stdlib.String.length s = 10 409 + && s.[4] = '-' && s.[7] = '-' 410 + && (try 411 + let _ = int_of_string (Stdlib.String.sub s 0 4) in 412 + let _ = int_of_string (Stdlib.String.sub s 5 2) in 413 + let _ = int_of_string (Stdlib.String.sub s 8 2) in 414 + true 415 + with _ -> false) 416 + 417 + (* Format "2025-12-15" -> "Dec 2025" *) 418 + let format_date s = 419 + let s = Stdlib.String.trim s in 420 + let year = Stdlib.String.sub s 0 4 in 421 + let month = Stdlib.String.sub s 5 2 in 422 + let m = match month with 423 + | "01" -> "Jan" | "02" -> "Feb" | "03" -> "Mar" | "04" -> "Apr" 424 + | "05" -> "May" | "06" -> "Jun" | "07" -> "Jul" | "08" -> "Aug" 425 + | "09" -> "Sep" | "10" -> "Oct" | "11" -> "Nov" | "12" -> "Dec" 426 + | _ -> month 427 + in 428 + m ^ " " ^ year 429 + 430 + (* Find the first unordered list in Block.t *) 431 + let find_list (blocks : Block.t) = 432 + List.find_map (fun (b : Block.one) -> 433 + match b.desc with 434 + | List (Unordered, items) -> Some items 435 + | _ -> None 436 + ) blocks 437 + 438 + (* Extract the link inline element from a list of inlines *) 439 + let find_link (inlines : Inline.t) = 440 + List.find_map (fun (i : Inline.one) -> 441 + match i.desc with 442 + | Link _ -> Some i 443 + | _ -> None 444 + ) inlines 445 + 446 + (* Extract date string from trailing text in inlines *) 447 + let find_date (inlines : Inline.t) = 448 + let texts = List.filter_map (fun (i : Inline.one) -> 449 + match i.desc with 450 + | Text s when is_date s -> Some (Stdlib.String.trim s) 451 + | _ -> None 452 + ) inlines in 453 + match texts with 454 + | [] -> None 455 + | _ -> Some (List.hd (List.rev texts)) 456 + 457 + (* Extract link and date from inlines *) 458 + let extract_from_inlines inlines = 459 + match find_link inlines, find_date inlines with 460 + | Some link, Some date -> Some (link, date) 461 + | Some link, None -> Some (link, "") 462 + | _ -> None 463 + 464 + (* Extract link and date from a list item (Block.t) *) 465 + let extract_item (item : Block.t) = 466 + List.find_map (fun (b : Block.one) -> 467 + match b.desc with 468 + | Paragraph inlines | Inline inlines -> extract_from_inlines inlines 469 + | _ -> None 470 + ) item 471 + 472 + (* Extract an optional excerpt Block.t from a list item. 473 + The link phase injects synopsis paragraphs as extra elements in list items. 474 + We look for a second paragraph (after the one containing the link/date). *) 475 + let extract_excerpt (item : Block.t) = 476 + let paragraphs = List.filter (fun (b : Block.one) -> 477 + match b.desc with 478 + | Paragraph _ -> true 479 + | _ -> false 480 + ) item in 481 + match paragraphs with 482 + | _ :: excerpt :: _ -> Some excerpt 483 + | _ -> None 484 + 485 + let raw html = Block.{ attr = []; desc = Raw_markup ("html", html) } 486 + 487 + let inline_block (inlines : Inline.t) = 488 + Block.{ attr = []; desc = Inline inlines } 489 + 490 + let recent_posts_css = {| 491 + /* Recent posts extension - neutralize at-tags wrapper */ 492 + .jon-shell-main ul.at-tags:has(li.recent-posts) { 493 + margin: 0; 494 + padding: 0; 495 + list-style: none; 496 + margin-left: 0; 497 + } 498 + .jon-shell-main .at-tags li.recent-posts { 499 + list-style: none; 500 + padding: 0; 501 + padding-left: 0; 502 + margin: 0; 503 + text-indent: 0; 504 + } 505 + .recent-posts { 506 + margin: 1.5rem 0 2rem; 507 + } 508 + .recent-posts-header { 509 + display: flex; 510 + align-items: baseline; 511 + justify-content: space-between; 512 + margin-bottom: 1.25rem; 513 + } 514 + .recent-posts-title { 515 + font-size: 1.35rem; 516 + font-weight: 500; 517 + color: var(--text-color); 518 + letter-spacing: -0.01em; 519 + } 520 + .recent-posts-link { 521 + font-size: 0.85rem; 522 + color: var(--text-muted); 523 + } 524 + .recent-posts-link:hover { 525 + color: var(--link-color); 526 + } 527 + .recent-posts-featured { 528 + background: var(--surface-color, #fff); 529 + border: 1px solid var(--border-color); 530 + border-radius: 10px; 531 + padding: 1.5rem 1.75rem; 532 + margin-bottom: 1.25rem; 533 + transition: box-shadow 0.2s ease; 534 + } 535 + .recent-posts-featured:hover { 536 + box-shadow: 0 2px 12px rgba(0,0,0,0.06); 537 + } 538 + .recent-posts-featured-label { 539 + font-size: 0.72rem; 540 + font-weight: 600; 541 + letter-spacing: 0.08em; 542 + text-transform: uppercase; 543 + color: var(--accent-color, #b44e2d); 544 + margin-bottom: 0.5rem; 545 + } 546 + .recent-posts-featured-title { 547 + font-size: 1.35rem; 548 + font-weight: 500; 549 + line-height: 1.3; 550 + margin-bottom: 0.5rem; 551 + } 552 + .recent-posts-featured-title a { 553 + color: var(--text-color); 554 + text-decoration: none; 555 + } 556 + .recent-posts-featured-title a:hover { 557 + color: var(--accent-color, #b44e2d); 558 + } 559 + .recent-posts-featured-date { 560 + font-size: 0.8rem; 561 + color: var(--text-muted); 562 + } 563 + .recent-posts-featured-excerpt { 564 + font-size: 0.92rem; 565 + line-height: 1.55; 566 + color: var(--text-muted); 567 + margin: 0.75rem 0 0; 568 + display: -webkit-box; 569 + -webkit-line-clamp: 3; 570 + -webkit-box-orient: vertical; 571 + overflow: hidden; 572 + } 573 + .recent-posts-list { 574 + display: flex; 575 + flex-direction: column; 576 + gap: 1px; 577 + background: var(--border-color); 578 + border-radius: 10px; 579 + overflow: hidden; 580 + border: 1px solid var(--border-color); 581 + } 582 + .recent-posts-item { 583 + display: grid; 584 + grid-template-columns: 1fr auto; 585 + gap: 1rem; 586 + align-items: baseline; 587 + padding: 0.875rem 1.25rem; 588 + background: var(--surface-color, #fff); 589 + transition: background 0.15s ease; 590 + } 591 + .recent-posts-item:hover { 592 + background: var(--bg-hover, #f0f2f5); 593 + } 594 + .recent-posts-item-title { 595 + font-size: 1rem; 596 + font-weight: 400; 597 + line-height: 1.4; 598 + } 599 + .recent-posts-item-title a { 600 + color: var(--text-color); 601 + text-decoration: none; 602 + } 603 + .recent-posts-item-title a:hover { 604 + color: var(--accent-color, #b44e2d); 605 + } 606 + .recent-posts-item-date { 607 + font-size: 0.78rem; 608 + color: var(--text-muted); 609 + white-space: nowrap; 610 + font-variant-numeric: tabular-nums; 611 + } 612 + @media (prefers-color-scheme: dark) { 613 + .recent-posts-featured { 614 + background: var(--surface-color, #22242a); 615 + } 616 + .recent-posts-featured:hover { 617 + box-shadow: 0 2px 12px rgba(0,0,0,0.2); 618 + } 619 + .recent-posts-item { 620 + background: var(--surface-color, #22242a); 621 + } 622 + .recent-posts-item:hover { 623 + background: var(--bg-hover, #2a2d35); 624 + } 625 + } 626 + @media (max-width: 700px) { 627 + .recent-posts-item { 628 + grid-template-columns: 1fr; 629 + gap: 0.25rem; 630 + } 631 + .recent-posts-featured { 632 + padding: 1.25rem; 633 + } 634 + } 635 + |} 636 + 637 + module Identifier = Odoc_model.Paths.Identifier 638 + 639 + (* Build a path hierarchy from a page identifier, for use with Env.lookup_page_by_path. 640 + E.g. LeafPage(Page(Page(Page(None, "jon-site"), "blog"), "2026"), "weeknotes-2026-09") 641 + -> (`TAbsolutePath, ["jon-site"; "blog"; "2026"; "weeknotes-2026-09"]) *) 642 + let rec hierarchy_of_page_id (id : Identifier.Page.t) : string list = 643 + match id.iv with 644 + | `Page (Some parent, name) | `LeafPage (Some parent, name) -> 645 + hierarchy_of_container_id parent @ [Odoc_model.Names.PageName.to_string name] 646 + | `Page (None, name) | `LeafPage (None, name) -> 647 + [Odoc_model.Names.PageName.to_string name] 648 + 649 + and hierarchy_of_container_id (id : Identifier.ContainerPage.t) : string list = 650 + match id.iv with 651 + | `Page (Some parent, name) -> 652 + hierarchy_of_container_id parent @ [Odoc_model.Names.PageName.to_string name] 653 + | `Page (None, name) -> 654 + [Odoc_model.Names.PageName.to_string name] 655 + 656 + (* Extract page identifier from a resolved reference in a list item's content *) 657 + let extract_page_id_from_item 658 + (item : Api.Comment.nestable_block_element Api.Location_.with_location list) = 659 + List.find_map (fun (el : Api.Comment.nestable_block_element Api.Location_.with_location) -> 660 + match el.Api.Location_.value with 661 + | `Paragraph inlines -> 662 + List.find_map (fun (inline : Api.Comment.inline_element Api.Location_.with_location) -> 663 + match inline.Api.Location_.value with 664 + | `Reference (`Resolved r, _) -> ( 665 + match Odoc_model.Paths.Reference.Resolved.identifier r with 666 + | Some id -> ( 667 + match (id : Identifier.t).iv with 668 + | `LeafPage _ as iv -> 669 + Some ({ iv; ihash = id.ihash; ikey = id.ikey } : Identifier.Page.t) 670 + | `Page _ as iv -> 671 + Some ({ iv; ihash = id.ihash; ikey = id.ikey } : Identifier.Page.t) 672 + | _ -> None) 673 + | None -> None) 674 + | _ -> None 675 + ) inlines 676 + | _ -> None 677 + ) item 678 + 679 + (* Link phase: enrich list items with page synopses from the environment. 680 + For each list item that contains a page reference, look up the page 681 + and inject its synopsis as an additional paragraph. *) 682 + let link ~tag:_ env content = 683 + let enrich_item item = 684 + match extract_page_id_from_item item with 685 + | None -> item 686 + | Some page_id -> 687 + let segments = hierarchy_of_page_id page_id in 688 + let hierarchy : Odoc_model.Paths.Reference.Hierarchy.t = 689 + (`TCurrentPackage, segments) 690 + in 691 + (match Api.Env.lookup_page_by_path hierarchy env with 692 + | Error _ -> item 693 + | Ok page -> 694 + (* Find first paragraph, skipping headings and tags *) 695 + let synopsis = 696 + List.find_map (fun (el : Odoc_model.Comment.block_element Api.Location_.with_location) -> 697 + match el.Api.Location_.value with 698 + | `Paragraph p -> Some p 699 + | `Heading _ | `Tag _ -> None 700 + | _ -> None 701 + ) page.content.elements 702 + in 703 + match synopsis with 704 + | None -> item 705 + | Some synopsis_paragraph -> 706 + let dummy_loc = { 707 + Api.Location_.file = ""; start = { line = 0; column = 0 }; 708 + end_ = { line = 0; column = 0 } 709 + } in 710 + item @ [ { Api.Location_.value = `Paragraph synopsis_paragraph; 711 + location = dummy_loc } ]) 712 + in 713 + List.map (fun (el : Api.Comment.nestable_block_element Api.Location_.with_location) -> 714 + match el.Api.Location_.value with 715 + | `List (kind, items) -> 716 + let enriched_items = List.map enrich_item items in 717 + { el with value = `List (kind, enriched_items) } 718 + | _ -> el 719 + ) content 720 + 721 + let to_document ~tag:_ content = 722 + let blocks = Api.blocks_of_nestable_elements content in 723 + match find_list blocks with 724 + | None -> Api.simple_output blocks 725 + | Some items -> 726 + let parsed = List.filter_map extract_item items in 727 + (* Extract excerpts from the first list item (featured) *) 728 + let featured_excerpt = match items with 729 + | first_item :: _ -> extract_excerpt first_item 730 + | [] -> None 731 + in 732 + match parsed with 733 + | [] -> Api.simple_output blocks 734 + | (featured_link, featured_date) :: rest -> 735 + let result = ref [] in 736 + let add b = result := b :: !result in 737 + (* Section open + header *) 738 + add (raw {|<div class="recent-posts"><div class="recent-posts-header"><span class="recent-posts-title">Recent writing</span><a href="/blog/" class="recent-posts-link">All posts &rarr;</a></div>|}); 739 + (* Featured card *) 740 + add (raw {|<div class="recent-posts-featured"><div class="recent-posts-featured-label">Featured</div><div class="recent-posts-featured-title">|}); 741 + add (inline_block [featured_link]); 742 + let date_html = 743 + if featured_date = "" then "" 744 + else Printf.sprintf {|<div class="recent-posts-featured-date">%s</div>|} (format_date featured_date) 745 + in 746 + add (raw (Printf.sprintf {|</div>%s|} date_html)); 747 + (* Excerpt from referenced page *) 748 + (match featured_excerpt with 749 + | Some excerpt_block -> 750 + (match excerpt_block.desc with 751 + | Paragraph inlines -> 752 + add (raw {|<p class="recent-posts-featured-excerpt">|}); 753 + add (inline_block inlines); 754 + add (raw {|</p>|}) 755 + | _ -> ()) 756 + | None -> ()); 757 + add (raw {|</div>|}); 758 + (* Post list *) 759 + if rest <> [] then begin 760 + add (raw {|<div class="recent-posts-list">|}); 761 + List.iter (fun (link, date) -> 762 + add (raw {|<div class="recent-posts-item"><div class="recent-posts-item-title">|}); 763 + add (inline_block [link]); 764 + let date_str = if date = "" then "" else format_date date in 765 + add (raw (Printf.sprintf {|</div><span class="recent-posts-item-date">%s</span></div>|} date_str)) 766 + ) rest; 767 + add (raw {|</div>|}) 768 + end; 769 + (* Section close *) 770 + add (raw {|</div>|}); 771 + { 772 + content = List.rev !result; 773 + overrides = []; 774 + resources = [Css_inline recent_posts_css]; 775 + assets = []; 776 + } 777 + end 778 + 779 + let () = Api.Registry.register_with_link (module Recent_posts)
+40 -7
odoc-jons-plugins/src/odoc_jons_plugins_css.ml
··· 8 8 --bg-color: #ffffff; 9 9 --text-color: #1a1a2e; 10 10 --text-muted: #6b7280; 11 - --link-color: #0969da; 12 - --link-hover: #0550ae; 11 + --link-color: #b44e2d; 12 + --link-hover: #943f24; 13 13 --border-color: #e5e7eb; 14 14 --code-bg: #f6f8fa; 15 15 --code-border: #e5e7eb; 16 16 --header-bg: #ffffff; 17 - --highlight-bg: rgba(9, 105, 218, 0.08); 17 + --highlight-bg: rgba(180, 78, 45, 0.08); 18 18 19 19 /* x-ocaml interactive cells */ 20 20 --xo-font-size: 0.875rem; ··· 23 23 --xo-gutter-bg: var(--code-bg); 24 24 --xo-gutter-text: var(--text-muted); 25 25 --xo-gutter-border: var(--border-color); 26 - --xo-stdout-bg: rgba(9, 105, 218, 0.06); 26 + --xo-stdout-bg: rgba(180, 78, 45, 0.06); 27 27 --xo-stdout-text: var(--link-color); 28 28 --xo-stderr-bg: rgba(218, 9, 9, 0.06); 29 29 --xo-stderr-text: #cf222e; ··· 44 44 --bg-color: #0d1117; 45 45 --text-color: #e6edf3; 46 46 --text-muted: #8b949e; 47 - --link-color: #58a6ff; 48 - --link-hover: #79c0ff; 47 + --link-color: #e07850; 48 + --link-hover: #f09070; 49 49 --border-color: #30363d; 50 50 --code-bg: #161b22; 51 51 --code-border: #30363d; 52 52 --header-bg: #161b22; 53 - --highlight-bg: rgba(88, 166, 255, 0.12); 53 + --highlight-bg: rgba(224, 120, 80, 0.12); 54 54 55 55 /* x-ocaml interactive cells - dark overrides */ 56 56 --xo-stdout-bg: rgba(88, 166, 255, 0.08); ··· 94 94 margin: 0 auto; 95 95 padding: 16px 20px; 96 96 font-size: 14px; 97 + border-bottom: 1px solid var(--border-color); 97 98 } 98 99 99 100 .jon-shell-header > a { ··· 263 264 .jon-shell-sidebar > ul > li > ul > li > a, 264 265 .jon-shell-sidebar > ul > li > ul > li > .sidebar-label { 265 266 display: none; 267 + } 268 + 269 + /* Hero intro - side-by-side text + photo */ 270 + .hero-intro { 271 + display: grid; 272 + grid-template-columns: 1fr auto; 273 + gap: 2rem; 274 + align-items: start; 275 + margin-bottom: 0.5rem; 276 + } 277 + .hero-intro .hero-text { 278 + min-width: 0; 279 + } 280 + .hero-intro .hero-text > p { 281 + margin-top: 0; 282 + } 283 + .hero-photo { 284 + width: 120px; 285 + height: 120px; 286 + border-radius: 50%; 287 + object-fit: cover; 288 + box-shadow: 0 0 0 1px var(--border-color); 289 + margin-top: 4px; 290 + } 291 + @media (max-width: 700px) { 292 + .hero-intro { 293 + grid-template-columns: 1fr; 294 + gap: 1rem; 295 + } 296 + .hero-intro .hero-photo { 297 + order: -1; 298 + } 266 299 } 267 300 268 301 /* Typography */
+1 -1
odoc/src/extension_api/dune
··· 1 1 (library 2 2 (name odoc_extension_api) 3 3 (public_name odoc.extension_api) 4 - (libraries odoc_model odoc_document odoc_extension_registry)) 4 + (libraries odoc_model odoc_document odoc_extension_registry odoc_xref2))
+40
odoc/src/extension_api/odoc_extension_api.ml
··· 105 105 (** Raised when an extension receives a tag variant it doesn't support *) 106 106 exception Unsupported_tag of string 107 107 108 + (** {1 Link Environment} 109 + 110 + Extensions that need to look up other pages or modules during linking 111 + can use the cross-reference environment. *) 112 + 113 + module Env = Odoc_xref2.Env 114 + 108 115 (** {1 Extension Interface} *) 109 116 110 117 (** The signature that all tag extensions must implement *) ··· 120 127 (** Document phase: convert tag to renderable content. 121 128 Called during document generation. Returns content plus any 122 129 page-level resources needed (JS/CSS). *) 130 + end 131 + 132 + (** Extensions that also need link-time access to the cross-reference 133 + environment implement this extended signature. *) 134 + module type Extension_with_link = sig 135 + include Extension 136 + 137 + val link : 138 + tag:string -> 139 + Env.t -> 140 + Comment.nestable_block_element Location_.with_location list -> 141 + Comment.nestable_block_element Location_.with_location list 142 + (** Link phase: transform tag content with access to the cross-reference 143 + environment. Called during linking, after references have been resolved. 144 + Use [Env.lookup_page_by_name] etc. to look up other pages. *) 123 145 end 124 146 125 147 (** {1 Code Block Extensions} ··· 195 217 with Unsupported_tag _ -> None 196 218 in 197 219 Odoc_extension_registry.register_handler ~prefix:E.prefix handler 220 + 221 + let register_with_link (module E : Extension_with_link) = 222 + let handler tag content = 223 + try 224 + let result = E.to_document ~tag content in 225 + Some { 226 + Odoc_extension_registry.content = result.content; 227 + overrides = result.overrides; 228 + resources = result.resources; 229 + assets = result.assets; 230 + } 231 + with Unsupported_tag _ -> None 232 + in 233 + Odoc_extension_registry.register_handler ~prefix:E.prefix handler; 234 + let link_handler tag env content = 235 + E.link ~tag (Obj.obj env) content 236 + in 237 + Odoc_extension_registry.register_link_handler ~prefix:E.prefix link_handler 198 238 199 239 let register_code_block (module E : Code_Block_Extension) = 200 240 let handler meta content =
+22
odoc/src/extension_registry/odoc_extension_registry.ml
··· 213 213 let list_extension_infos () = 214 214 Hashtbl.fold (fun _ info acc -> info :: acc) extension_infos [] 215 215 |> List.sort (fun a b -> String.compare a.info_prefix b.info_prefix) 216 + 217 + (** {1 Link Handlers} 218 + 219 + Extensions can register a link handler that runs during the linking 220 + phase with access to the cross-reference environment. The handler 221 + receives the tag name, the environment (as [Obj.t] to avoid a 222 + dependency on [odoc_xref2] here), and already-resolved content. 223 + It returns transformed content. *) 224 + 225 + type link_handler = 226 + string -> (* tag name *) 227 + Obj.t -> (* env — actually Odoc_xref2.Env.t, type-erased *) 228 + Comment.nestable_block_element Location_.with_location list -> 229 + Comment.nestable_block_element Location_.with_location list 230 + 231 + let link_handlers : (string, link_handler) Hashtbl.t = Hashtbl.create 16 232 + 233 + let register_link_handler ~prefix (handler : link_handler) = 234 + Hashtbl.replace link_handlers prefix handler 235 + 236 + let find_link_handler ~prefix = 237 + Hashtbl.find_opt link_handlers prefix
+1 -1
odoc/src/xref2/dune
··· 3 3 (public_name odoc.xref2) 4 4 (instrumentation 5 5 (backend landmarks --auto)) 6 - (libraries odoc_model odoc_utils)) 6 + (libraries odoc_model odoc_utils odoc_extension_registry)) 7 7 8 8 (rule 9 9 (enabled_if
+10 -3
odoc/src/xref2/link.ml
··· 344 344 and comment_tag env warnings_tag parent ~loc:_ (x : Comment.tag) = 345 345 match x with 346 346 | `Custom (name, content) -> 347 - `Custom 348 - ( name, 349 - comment_nestable_block_element_list env warnings_tag parent content ) 347 + let resolved = 348 + comment_nestable_block_element_list env warnings_tag parent content 349 + in 350 + let prefix = Odoc_extension_registry.prefix_of_tag name in 351 + let content = 352 + match Odoc_extension_registry.find_link_handler ~prefix with 353 + | Some handler -> handler name (Obj.repr env) resolved 354 + | None -> resolved 355 + in 356 + `Custom (name, content) 350 357 | `Deprecated content -> 351 358 `Deprecated 352 359 (comment_nestable_block_element_list env warnings_tag parent content)
-2
onnxrt/doc/add_example.mld
··· 1 1 {0 Tensor Addition} 2 2 3 - @x-ocaml.universe ./universe 4 - @x-ocaml.worker ./universe/worker.js 5 3 6 4 This notebook demonstrates basic ONNX Runtime inference in OCaml: 7 5 creating tensors, loading a model, and running addition.
-2
onnxrt/doc/sentiment_example.mld
··· 1 1 {0 Sentiment Analysis} 2 2 3 - @x-ocaml.universe ./universe 4 - @x-ocaml.worker ./universe/worker.js 5 3 6 4 This notebook runs a DistilBERT sentiment analysis model entirely in 7 5 the browser using ONNX Runtime. It includes a vocabulary loader,
+53 -10
site-builder/gen_rules.ml
··· 78 78 if dir = "." then Printf.sprintf "_html/%s.html" base 79 79 else Printf.sprintf "_html/%s/%s.html" dir base 80 80 81 + (* Asset path computations for the odoc asset pipeline *) 82 + let asset_odoc_target rel = 83 + let dir = Filename.dirname rel in 84 + let base = Filename.basename rel in 85 + if dir = "." then Printf.sprintf "_odoc/asset-%s.odoc" base 86 + else Printf.sprintf "_odoc/%s/asset-%s.odoc" dir base 87 + 88 + let asset_odocl_target rel = 89 + Filename.chop_extension (asset_odoc_target rel) ^ ".odocl" 90 + 91 + let is_asset_file f = 92 + List.exists 93 + (fun ext -> Filename.check_suffix f ext) 94 + [ ".svg"; ".png"; ".jpg"; ".jpeg"; ".gif"; ".webp"; ".ico"; ".mov" ] 95 + 81 96 (* --- Output helpers ------------------------------------------------------ *) 82 97 83 98 let pr = Printf.printf ··· 101 116 walk_files ~pred:(fun f -> Filename.check_suffix f ".mld") "." 102 117 |> List.map strip_dot_slash 103 118 in 104 - let assets = 119 + let static_assets = 105 120 if Sys.file_exists "static" && Sys.is_directory "static" then 106 121 walk_files ~pred:(fun _ -> true) "static" |> List.map strip_dot_slash 107 122 else [] 108 123 in 109 - (* Phase 1: compile all .mld → .odoc, then link all .odoc → .odocl *) 124 + (* Content assets: images alongside .mld files (blog posts etc.) *) 125 + let content_assets = 126 + walk_files ~pred:is_asset_file "." |> List.map strip_dot_slash 127 + |> List.filter (fun f -> 128 + not (String.length f >= 7 && String.sub f 0 7 = "static/")) 129 + in 130 + (* Phase 1: compile all .mld → .odoc, compile-asset, then link → .odocl *) 110 131 prl "(rule"; 111 132 prl " (target (dir _odoc))"; 112 133 prl " (deps"; 113 134 List.iter (fun rel -> prl " %s" rel) mld_files; 135 + List.iter (fun rel -> prl " %s" rel) content_assets; 114 136 prl " )"; 115 137 prl " (action"; 116 138 prl " (progn"; 117 - (* Compile *) 139 + (* Compile pages *) 118 140 List.iter 119 141 (fun rel -> 120 142 prl " (run odoc compile %s --output-dir _odoc --parent-id %s)" rel 121 143 (parent_id rel)) 122 144 mld_files; 123 - (* Link *) 145 + (* Compile assets — declares asset names so {image!...} refs resolve *) 146 + List.iter 147 + (fun rel -> 148 + prl " (run odoc compile-asset --name %s --output-dir _odoc --parent-id %s)" 149 + (Filename.basename rel) (parent_id rel)) 150 + content_assets; 151 + (* Link pages *) 124 152 List.iter 125 153 (fun rel -> 126 154 prl " (run odoc link %s -P %s:_odoc -o %s)" (odoc_target rel) 127 155 package (odocl_target rel)) 128 156 mld_files; 157 + (* Link assets *) 158 + List.iter 159 + (fun rel -> 160 + prl " (run odoc link %s -P %s:_odoc -o %s)" (asset_odoc_target rel) 161 + package (asset_odocl_target rel)) 162 + content_assets; 129 163 (* Index + sidebar *) 130 164 pr " (run odoc compile-index --root %s:_odoc -o _odoc/index.odoc-index" 131 165 package; ··· 136 170 _odoc/index.odoc-index)"; 137 171 prl " )))"; 138 172 pr "\n"; 139 - (* Phase 2: html-generate + support-files + asset copy *) 173 + (* Phase 2: html-generate + support-files + asset generate/copy *) 140 174 prl "(rule"; 141 175 prl " (target (dir _html))"; 142 176 prl " (deps"; 143 177 List.iter (fun rel -> prl " %s" (odocl_target rel)) mld_files; 178 + List.iter (fun rel -> prl " %s" (asset_odocl_target rel)) content_assets; 179 + List.iter (fun rel -> prl " %s" rel) content_assets; 144 180 (* sidebar.odoc-sidebar is generated but not used — reference docs 145 181 (built via @doc) have their own sidebar; site pages don't need one. *) 146 - List.iter (fun asset -> prl " %s" asset) assets; 182 + List.iter (fun asset -> prl " %s" asset) static_assets; 147 183 prl " )"; 148 184 prl " (action"; 149 185 prl " (progn"; 150 - (* HTML generate *) 186 + (* HTML generate pages *) 151 187 List.iter 152 188 (fun rel -> 153 189 prl " (run odoc html-generate --shell jon-shell --config x-ocaml.universe=/_opam -o _html %s)" 154 190 (odocl_target rel)) 155 191 mld_files; 192 + (* HTML generate assets via odoc *) 193 + List.iter 194 + (fun rel -> 195 + prl " (run odoc html-generate-asset --asset-unit %s -o _html %s)" 196 + (asset_odocl_target rel) rel) 197 + content_assets; 156 198 (* Support files *) 157 199 prl " (run odoc support-files -o _html)"; 158 - (* Asset copies — use system because (copy) declares implicit targets *) 200 + (* Static asset copies — these aren't odoc-managed, just raw files *) 159 201 List.iter 160 202 (fun asset -> 161 203 prl " (system \"mkdir -p $(dirname _html/%s) && cp %s _html/%s\")" 162 204 asset asset asset) 163 - assets; 205 + static_assets; 164 206 prl " )))"; 165 207 pr "\n"; 166 208 (* @site alias *) ··· 168 210 prl " (name site)"; 169 211 prl " (deps"; 170 212 List.iter (fun rel -> prl " %s" (html_target rel)) mld_files; 171 - List.iter (fun asset -> prl " _html/%s" asset) assets; 213 + List.iter (fun asset -> prl " _html/%s" asset) static_assets; 214 + List.iter (fun rel -> prl " _html/%s" rel) content_assets; 172 215 prl " ))"; 173 216 pr "\n"; 174 217 (* Blog index generation via gen_blog_index.exe *)
site/blog/2025/05/alice.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/amy.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/emilio.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/frank.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/hattie.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/marta.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/melissa.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/orlando.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/ruari.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/sadiq.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/sebastian.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/simon.jpg

This is a binary file and will not be displayed.

site/blog/2025/05/simond.jpg

This is a binary file and will not be displayed.

site/blog/2025/09/examination_map_histogram.png

This is a binary file and will not be displayed.

+2873
site/blog/2025/09/examination_map_histogram.svg
··· 1 + <?xml version="1.0" encoding="utf-8" standalone="no"?> 2 + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 3 + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 + <svg xmlns:xlink="http://www.w3.org/1999/xlink" width="997.763055pt" height="552.159687pt" viewBox="0 0 997.763055 552.159687" xmlns="http://www.w3.org/2000/svg" version="1.1"> 5 + <metadata> 6 + <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 7 + <cc:Work> 8 + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> 9 + <dc:date>2025-09-24T17:18:53.818222</dc:date> 10 + <dc:format>image/svg+xml</dc:format> 11 + <dc:creator> 12 + <cc:Agent> 13 + <dc:title>Matplotlib v3.8.3, https://matplotlib.org/</dc:title> 14 + </cc:Agent> 15 + </dc:creator> 16 + </cc:Work> 17 + </rdf:RDF> 18 + </metadata> 19 + <defs> 20 + <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style> 21 + </defs> 22 + <g id="figure_1"> 23 + <g id="patch_1"> 24 + <path d="M 0 552.159687 25 + L 997.763055 552.159687 26 + L 997.763055 0 27 + L 0 0 28 + z 29 + " style="fill: #ffffff"/> 30 + </g> 31 + <g id="axes_1"> 32 + <g id="patch_2"> 33 + <path d="M 50.243125 426.72312 34 + L 990.563055 426.72312 35 + L 990.563055 97.04 36 + L 50.243125 97.04 37 + z 38 + " style="fill: #ffffff"/> 39 + </g> 40 + <g id="matplotlib.axis_1"> 41 + <g id="xtick_1"> 42 + <g id="line2d_1"> 43 + <defs> 44 + <path id="mb8e09ac4f1" d="M 0 0 45 + L 0 3.5 46 + " style="stroke: #2c3e50; stroke-width: 0.8"/> 47 + </defs> 48 + <g> 49 + <use xlink:href="#mb8e09ac4f1" x="99.678289" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 50 + </g> 51 + </g> 52 + <g id="text_1"> 53 + <!-- 0-99 --> 54 + <g style="fill: #2c3e50" transform="translate(93.605457 455.144036) rotate(-45) scale(0.1 -0.1)"> 55 + <defs> 56 + <path id="DejaVuSans-30" d="M 2034 4250 57 + Q 1547 4250 1301 3770 58 + Q 1056 3291 1056 2328 59 + Q 1056 1369 1301 889 60 + Q 1547 409 2034 409 61 + Q 2525 409 2770 889 62 + Q 3016 1369 3016 2328 63 + Q 3016 3291 2770 3770 64 + Q 2525 4250 2034 4250 65 + z 66 + M 2034 4750 67 + Q 2819 4750 3233 4129 68 + Q 3647 3509 3647 2328 69 + Q 3647 1150 3233 529 70 + Q 2819 -91 2034 -91 71 + Q 1250 -91 836 529 72 + Q 422 1150 422 2328 73 + Q 422 3509 836 4129 74 + Q 1250 4750 2034 4750 75 + z 76 + " transform="scale(0.015625)"/> 77 + <path id="DejaVuSans-2d" d="M 313 2009 78 + L 1997 2009 79 + L 1997 1497 80 + L 313 1497 81 + L 313 2009 82 + z 83 + " transform="scale(0.015625)"/> 84 + <path id="DejaVuSans-39" d="M 703 97 85 + L 703 672 86 + Q 941 559 1184 500 87 + Q 1428 441 1663 441 88 + Q 2288 441 2617 861 89 + Q 2947 1281 2994 2138 90 + Q 2813 1869 2534 1725 91 + Q 2256 1581 1919 1581 92 + Q 1219 1581 811 2004 93 + Q 403 2428 403 3163 94 + Q 403 3881 828 4315 95 + Q 1253 4750 1959 4750 96 + Q 2769 4750 3195 4129 97 + Q 3622 3509 3622 2328 98 + Q 3622 1225 3098 567 99 + Q 2575 -91 1691 -91 100 + Q 1453 -91 1209 -44 101 + Q 966 3 703 97 102 + z 103 + M 1959 2075 104 + Q 2384 2075 2632 2365 105 + Q 2881 2656 2881 3163 106 + Q 2881 3666 2632 3958 107 + Q 2384 4250 1959 4250 108 + Q 1534 4250 1286 3958 109 + Q 1038 3666 1038 3163 110 + Q 1038 2656 1286 2365 111 + Q 1534 2075 1959 2075 112 + z 113 + " transform="scale(0.015625)"/> 114 + </defs> 115 + <use xlink:href="#DejaVuSans-30"/> 116 + <use xlink:href="#DejaVuSans-2d" x="63.623047"/> 117 + <use xlink:href="#DejaVuSans-39" x="99.707031"/> 118 + <use xlink:href="#DejaVuSans-39" x="163.330078"/> 119 + </g> 120 + </g> 121 + </g> 122 + <g id="xtick_2"> 123 + <g id="line2d_2"> 124 + <g> 125 + <use xlink:href="#mb8e09ac4f1" x="214.421417" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 126 + </g> 127 + </g> 128 + <g id="text_2"> 129 + <!-- 600-699 --> 130 + <g style="fill: #2c3e50" transform="translate(201.600134 468.640937) rotate(-45) scale(0.1 -0.1)"> 131 + <defs> 132 + <path id="DejaVuSans-36" d="M 2113 2584 133 + Q 1688 2584 1439 2293 134 + Q 1191 2003 1191 1497 135 + Q 1191 994 1439 701 136 + Q 1688 409 2113 409 137 + Q 2538 409 2786 701 138 + Q 3034 994 3034 1497 139 + Q 3034 2003 2786 2293 140 + Q 2538 2584 2113 2584 141 + z 142 + M 3366 4563 143 + L 3366 3988 144 + Q 3128 4100 2886 4159 145 + Q 2644 4219 2406 4219 146 + Q 1781 4219 1451 3797 147 + Q 1122 3375 1075 2522 148 + Q 1259 2794 1537 2939 149 + Q 1816 3084 2150 3084 150 + Q 2853 3084 3261 2657 151 + Q 3669 2231 3669 1497 152 + Q 3669 778 3244 343 153 + Q 2819 -91 2113 -91 154 + Q 1303 -91 875 529 155 + Q 447 1150 447 2328 156 + Q 447 3434 972 4092 157 + Q 1497 4750 2381 4750 158 + Q 2619 4750 2861 4703 159 + Q 3103 4656 3366 4563 160 + z 161 + " transform="scale(0.015625)"/> 162 + </defs> 163 + <use xlink:href="#DejaVuSans-36"/> 164 + <use xlink:href="#DejaVuSans-30" x="63.623047"/> 165 + <use xlink:href="#DejaVuSans-30" x="127.246094"/> 166 + <use xlink:href="#DejaVuSans-2d" x="190.869141"/> 167 + <use xlink:href="#DejaVuSans-36" x="226.953125"/> 168 + <use xlink:href="#DejaVuSans-39" x="290.576172"/> 169 + <use xlink:href="#DejaVuSans-39" x="354.199219"/> 170 + </g> 171 + </g> 172 + </g> 173 + <g id="xtick_3"> 174 + <g id="line2d_3"> 175 + <g> 176 + <use xlink:href="#mb8e09ac4f1" x="329.164544" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 177 + </g> 178 + </g> 179 + <g id="text_3"> 180 + <!-- 1200-1299 --> 181 + <g style="fill: #2c3e50" transform="translate(311.844295 477.638871) rotate(-45) scale(0.1 -0.1)"> 182 + <defs> 183 + <path id="DejaVuSans-31" d="M 794 531 184 + L 1825 531 185 + L 1825 4091 186 + L 703 3866 187 + L 703 4441 188 + L 1819 4666 189 + L 2450 4666 190 + L 2450 531 191 + L 3481 531 192 + L 3481 0 193 + L 794 0 194 + L 794 531 195 + z 196 + " transform="scale(0.015625)"/> 197 + <path id="DejaVuSans-32" d="M 1228 531 198 + L 3431 531 199 + L 3431 0 200 + L 469 0 201 + L 469 531 202 + Q 828 903 1448 1529 203 + Q 2069 2156 2228 2338 204 + Q 2531 2678 2651 2914 205 + Q 2772 3150 2772 3378 206 + Q 2772 3750 2511 3984 207 + Q 2250 4219 1831 4219 208 + Q 1534 4219 1204 4116 209 + Q 875 4013 500 3803 210 + L 500 4441 211 + Q 881 4594 1212 4672 212 + Q 1544 4750 1819 4750 213 + Q 2544 4750 2975 4387 214 + Q 3406 4025 3406 3419 215 + Q 3406 3131 3298 2873 216 + Q 3191 2616 2906 2266 217 + Q 2828 2175 2409 1742 218 + Q 1991 1309 1228 531 219 + z 220 + " transform="scale(0.015625)"/> 221 + </defs> 222 + <use xlink:href="#DejaVuSans-31"/> 223 + <use xlink:href="#DejaVuSans-32" x="63.623047"/> 224 + <use xlink:href="#DejaVuSans-30" x="127.246094"/> 225 + <use xlink:href="#DejaVuSans-30" x="190.869141"/> 226 + <use xlink:href="#DejaVuSans-2d" x="254.492188"/> 227 + <use xlink:href="#DejaVuSans-31" x="290.576172"/> 228 + <use xlink:href="#DejaVuSans-32" x="354.199219"/> 229 + <use xlink:href="#DejaVuSans-39" x="417.822266"/> 230 + <use xlink:href="#DejaVuSans-39" x="481.445312"/> 231 + </g> 232 + </g> 233 + </g> 234 + <g id="xtick_4"> 235 + <g id="line2d_4"> 236 + <g> 237 + <use xlink:href="#mb8e09ac4f1" x="443.907672" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 238 + </g> 239 + </g> 240 + <g id="text_4"> 241 + <!-- 1800-1899 --> 242 + <g style="fill: #2c3e50" transform="translate(426.587423 477.638871) rotate(-45) scale(0.1 -0.1)"> 243 + <defs> 244 + <path id="DejaVuSans-38" d="M 2034 2216 245 + Q 1584 2216 1326 1975 246 + Q 1069 1734 1069 1313 247 + Q 1069 891 1326 650 248 + Q 1584 409 2034 409 249 + Q 2484 409 2743 651 250 + Q 3003 894 3003 1313 251 + Q 3003 1734 2745 1975 252 + Q 2488 2216 2034 2216 253 + z 254 + M 1403 2484 255 + Q 997 2584 770 2862 256 + Q 544 3141 544 3541 257 + Q 544 4100 942 4425 258 + Q 1341 4750 2034 4750 259 + Q 2731 4750 3128 4425 260 + Q 3525 4100 3525 3541 261 + Q 3525 3141 3298 2862 262 + Q 3072 2584 2669 2484 263 + Q 3125 2378 3379 2068 264 + Q 3634 1759 3634 1313 265 + Q 3634 634 3220 271 266 + Q 2806 -91 2034 -91 267 + Q 1263 -91 848 271 268 + Q 434 634 434 1313 269 + Q 434 1759 690 2068 270 + Q 947 2378 1403 2484 271 + z 272 + M 1172 3481 273 + Q 1172 3119 1398 2916 274 + Q 1625 2713 2034 2713 275 + Q 2441 2713 2670 2916 276 + Q 2900 3119 2900 3481 277 + Q 2900 3844 2670 4047 278 + Q 2441 4250 2034 4250 279 + Q 1625 4250 1398 4047 280 + Q 1172 3844 1172 3481 281 + z 282 + " transform="scale(0.015625)"/> 283 + </defs> 284 + <use xlink:href="#DejaVuSans-31"/> 285 + <use xlink:href="#DejaVuSans-38" x="63.623047"/> 286 + <use xlink:href="#DejaVuSans-30" x="127.246094"/> 287 + <use xlink:href="#DejaVuSans-30" x="190.869141"/> 288 + <use xlink:href="#DejaVuSans-2d" x="254.492188"/> 289 + <use xlink:href="#DejaVuSans-31" x="290.576172"/> 290 + <use xlink:href="#DejaVuSans-38" x="354.199219"/> 291 + <use xlink:href="#DejaVuSans-39" x="417.822266"/> 292 + <use xlink:href="#DejaVuSans-39" x="481.445312"/> 293 + </g> 294 + </g> 295 + </g> 296 + <g id="xtick_5"> 297 + <g id="line2d_5"> 298 + <g> 299 + <use xlink:href="#mb8e09ac4f1" x="558.650799" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 300 + </g> 301 + </g> 302 + <g id="text_5"> 303 + <!-- 2400-2499 --> 304 + <g style="fill: #2c3e50" transform="translate(541.33055 477.638871) rotate(-45) scale(0.1 -0.1)"> 305 + <defs> 306 + <path id="DejaVuSans-34" d="M 2419 4116 307 + L 825 1625 308 + L 2419 1625 309 + L 2419 4116 310 + z 311 + M 2253 4666 312 + L 3047 4666 313 + L 3047 1625 314 + L 3713 1625 315 + L 3713 1100 316 + L 3047 1100 317 + L 3047 0 318 + L 2419 0 319 + L 2419 1100 320 + L 313 1100 321 + L 313 1709 322 + L 2253 4666 323 + z 324 + " transform="scale(0.015625)"/> 325 + </defs> 326 + <use xlink:href="#DejaVuSans-32"/> 327 + <use xlink:href="#DejaVuSans-34" x="63.623047"/> 328 + <use xlink:href="#DejaVuSans-30" x="127.246094"/> 329 + <use xlink:href="#DejaVuSans-30" x="190.869141"/> 330 + <use xlink:href="#DejaVuSans-2d" x="254.492188"/> 331 + <use xlink:href="#DejaVuSans-32" x="290.576172"/> 332 + <use xlink:href="#DejaVuSans-34" x="354.199219"/> 333 + <use xlink:href="#DejaVuSans-39" x="417.822266"/> 334 + <use xlink:href="#DejaVuSans-39" x="481.445312"/> 335 + </g> 336 + </g> 337 + </g> 338 + <g id="xtick_6"> 339 + <g id="line2d_6"> 340 + <g> 341 + <use xlink:href="#mb8e09ac4f1" x="673.393927" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 342 + </g> 343 + </g> 344 + <g id="text_6"> 345 + <!-- 3000-3099 --> 346 + <g style="fill: #2c3e50" transform="translate(656.073678 477.638871) rotate(-45) scale(0.1 -0.1)"> 347 + <defs> 348 + <path id="DejaVuSans-33" d="M 2597 2516 349 + Q 3050 2419 3304 2112 350 + Q 3559 1806 3559 1356 351 + Q 3559 666 3084 287 352 + Q 2609 -91 1734 -91 353 + Q 1441 -91 1130 -33 354 + Q 819 25 488 141 355 + L 488 750 356 + Q 750 597 1062 519 357 + Q 1375 441 1716 441 358 + Q 2309 441 2620 675 359 + Q 2931 909 2931 1356 360 + Q 2931 1769 2642 2001 361 + Q 2353 2234 1838 2234 362 + L 1294 2234 363 + L 1294 2753 364 + L 1863 2753 365 + Q 2328 2753 2575 2939 366 + Q 2822 3125 2822 3475 367 + Q 2822 3834 2567 4026 368 + Q 2313 4219 1838 4219 369 + Q 1578 4219 1281 4162 370 + Q 984 4106 628 3988 371 + L 628 4550 372 + Q 988 4650 1302 4700 373 + Q 1616 4750 1894 4750 374 + Q 2613 4750 3031 4423 375 + Q 3450 4097 3450 3541 376 + Q 3450 3153 3228 2886 377 + Q 3006 2619 2597 2516 378 + z 379 + " transform="scale(0.015625)"/> 380 + </defs> 381 + <use xlink:href="#DejaVuSans-33"/> 382 + <use xlink:href="#DejaVuSans-30" x="63.623047"/> 383 + <use xlink:href="#DejaVuSans-30" x="127.246094"/> 384 + <use xlink:href="#DejaVuSans-30" x="190.869141"/> 385 + <use xlink:href="#DejaVuSans-2d" x="254.492188"/> 386 + <use xlink:href="#DejaVuSans-33" x="290.576172"/> 387 + <use xlink:href="#DejaVuSans-30" x="354.199219"/> 388 + <use xlink:href="#DejaVuSans-39" x="417.822266"/> 389 + <use xlink:href="#DejaVuSans-39" x="481.445312"/> 390 + </g> 391 + </g> 392 + </g> 393 + <g id="xtick_7"> 394 + <g id="line2d_7"> 395 + <g> 396 + <use xlink:href="#mb8e09ac4f1" x="788.137054" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 397 + </g> 398 + </g> 399 + <g id="text_7"> 400 + <!-- 3600-3699 --> 401 + <g style="fill: #2c3e50" transform="translate(770.816805 477.638871) rotate(-45) scale(0.1 -0.1)"> 402 + <use xlink:href="#DejaVuSans-33"/> 403 + <use xlink:href="#DejaVuSans-36" x="63.623047"/> 404 + <use xlink:href="#DejaVuSans-30" x="127.246094"/> 405 + <use xlink:href="#DejaVuSans-30" x="190.869141"/> 406 + <use xlink:href="#DejaVuSans-2d" x="254.492188"/> 407 + <use xlink:href="#DejaVuSans-33" x="290.576172"/> 408 + <use xlink:href="#DejaVuSans-36" x="354.199219"/> 409 + <use xlink:href="#DejaVuSans-39" x="417.822266"/> 410 + <use xlink:href="#DejaVuSans-39" x="481.445312"/> 411 + </g> 412 + </g> 413 + </g> 414 + <g id="xtick_8"> 415 + <g id="line2d_8"> 416 + <g> 417 + <use xlink:href="#mb8e09ac4f1" x="902.880182" y="426.72312" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 418 + </g> 419 + </g> 420 + <g id="text_8"> 421 + <!-- 4200-4299 --> 422 + <g style="fill: #2c3e50" transform="translate(885.559933 477.638871) rotate(-45) scale(0.1 -0.1)"> 423 + <use xlink:href="#DejaVuSans-34"/> 424 + <use xlink:href="#DejaVuSans-32" x="63.623047"/> 425 + <use xlink:href="#DejaVuSans-30" x="127.246094"/> 426 + <use xlink:href="#DejaVuSans-30" x="190.869141"/> 427 + <use xlink:href="#DejaVuSans-2d" x="254.492188"/> 428 + <use xlink:href="#DejaVuSans-34" x="290.576172"/> 429 + <use xlink:href="#DejaVuSans-32" x="354.199219"/> 430 + <use xlink:href="#DejaVuSans-39" x="417.822266"/> 431 + <use xlink:href="#DejaVuSans-39" x="481.445312"/> 432 + </g> 433 + </g> 434 + </g> 435 + <g id="text_9"> 436 + <!-- Number of Examiners --> 437 + <g style="fill: #34495e" transform="translate(441.34684 492.987401) scale(0.13 -0.13)"> 438 + <defs> 439 + <path id="DejaVuSans-Bold-4e" d="M 588 4666 440 + L 1931 4666 441 + L 3628 1466 442 + L 3628 4666 443 + L 4769 4666 444 + L 4769 0 445 + L 3425 0 446 + L 1728 3200 447 + L 1728 0 448 + L 588 0 449 + L 588 4666 450 + z 451 + " transform="scale(0.015625)"/> 452 + <path id="DejaVuSans-Bold-75" d="M 500 1363 453 + L 500 3500 454 + L 1625 3500 455 + L 1625 3150 456 + Q 1625 2866 1622 2436 457 + Q 1619 2006 1619 1863 458 + Q 1619 1441 1641 1255 459 + Q 1663 1069 1716 984 460 + Q 1784 875 1895 815 461 + Q 2006 756 2150 756 462 + Q 2500 756 2700 1025 463 + Q 2900 1294 2900 1772 464 + L 2900 3500 465 + L 4019 3500 466 + L 4019 0 467 + L 2900 0 468 + L 2900 506 469 + Q 2647 200 2364 54 470 + Q 2081 -91 1741 -91 471 + Q 1134 -91 817 281 472 + Q 500 653 500 1363 473 + z 474 + " transform="scale(0.015625)"/> 475 + <path id="DejaVuSans-Bold-6d" d="M 3781 2919 476 + Q 3994 3244 4286 3414 477 + Q 4578 3584 4928 3584 478 + Q 5531 3584 5847 3212 479 + Q 6163 2841 6163 2131 480 + L 6163 0 481 + L 5038 0 482 + L 5038 1825 483 + Q 5041 1866 5042 1909 484 + Q 5044 1953 5044 2034 485 + Q 5044 2406 4934 2573 486 + Q 4825 2741 4581 2741 487 + Q 4263 2741 4089 2478 488 + Q 3916 2216 3909 1719 489 + L 3909 0 490 + L 2784 0 491 + L 2784 1825 492 + Q 2784 2406 2684 2573 493 + Q 2584 2741 2328 2741 494 + Q 2006 2741 1831 2477 495 + Q 1656 2213 1656 1722 496 + L 1656 0 497 + L 531 0 498 + L 531 3500 499 + L 1656 3500 500 + L 1656 2988 501 + Q 1863 3284 2130 3434 502 + Q 2397 3584 2719 3584 503 + Q 3081 3584 3359 3409 504 + Q 3638 3234 3781 2919 505 + z 506 + " transform="scale(0.015625)"/> 507 + <path id="DejaVuSans-Bold-62" d="M 2400 722 508 + Q 2759 722 2948 984 509 + Q 3138 1247 3138 1747 510 + Q 3138 2247 2948 2509 511 + Q 2759 2772 2400 2772 512 + Q 2041 2772 1848 2508 513 + Q 1656 2244 1656 1747 514 + Q 1656 1250 1848 986 515 + Q 2041 722 2400 722 516 + z 517 + M 1656 2988 518 + Q 1888 3294 2169 3439 519 + Q 2450 3584 2816 3584 520 + Q 3463 3584 3878 3070 521 + Q 4294 2556 4294 1747 522 + Q 4294 938 3878 423 523 + Q 3463 -91 2816 -91 524 + Q 2450 -91 2169 54 525 + Q 1888 200 1656 506 526 + L 1656 0 527 + L 538 0 528 + L 538 4863 529 + L 1656 4863 530 + L 1656 2988 531 + z 532 + " transform="scale(0.015625)"/> 533 + <path id="DejaVuSans-Bold-65" d="M 4031 1759 534 + L 4031 1441 535 + L 1416 1441 536 + Q 1456 1047 1700 850 537 + Q 1944 653 2381 653 538 + Q 2734 653 3104 758 539 + Q 3475 863 3866 1075 540 + L 3866 213 541 + Q 3469 63 3072 -14 542 + Q 2675 -91 2278 -91 543 + Q 1328 -91 801 392 544 + Q 275 875 275 1747 545 + Q 275 2603 792 3093 546 + Q 1309 3584 2216 3584 547 + Q 3041 3584 3536 3087 548 + Q 4031 2591 4031 1759 549 + z 550 + M 2881 2131 551 + Q 2881 2450 2695 2645 552 + Q 2509 2841 2209 2841 553 + Q 1884 2841 1681 2658 554 + Q 1478 2475 1428 2131 555 + L 2881 2131 556 + z 557 + " transform="scale(0.015625)"/> 558 + <path id="DejaVuSans-Bold-72" d="M 3138 2547 559 + Q 2991 2616 2845 2648 560 + Q 2700 2681 2553 2681 561 + Q 2122 2681 1889 2404 562 + Q 1656 2128 1656 1613 563 + L 1656 0 564 + L 538 0 565 + L 538 3500 566 + L 1656 3500 567 + L 1656 2925 568 + Q 1872 3269 2151 3426 569 + Q 2431 3584 2822 3584 570 + Q 2878 3584 2943 3579 571 + Q 3009 3575 3134 3559 572 + L 3138 2547 573 + z 574 + " transform="scale(0.015625)"/> 575 + <path id="DejaVuSans-Bold-20" transform="scale(0.015625)"/> 576 + <path id="DejaVuSans-Bold-6f" d="M 2203 2784 577 + Q 1831 2784 1636 2517 578 + Q 1441 2250 1441 1747 579 + Q 1441 1244 1636 976 580 + Q 1831 709 2203 709 581 + Q 2569 709 2762 976 582 + Q 2956 1244 2956 1747 583 + Q 2956 2250 2762 2517 584 + Q 2569 2784 2203 2784 585 + z 586 + M 2203 3584 587 + Q 3106 3584 3614 3096 588 + Q 4122 2609 4122 1747 589 + Q 4122 884 3614 396 590 + Q 3106 -91 2203 -91 591 + Q 1297 -91 786 396 592 + Q 275 884 275 1747 593 + Q 275 2609 786 3096 594 + Q 1297 3584 2203 3584 595 + z 596 + " transform="scale(0.015625)"/> 597 + <path id="DejaVuSans-Bold-66" d="M 2841 4863 598 + L 2841 4128 599 + L 2222 4128 600 + Q 1984 4128 1890 4042 601 + Q 1797 3956 1797 3744 602 + L 1797 3500 603 + L 2753 3500 604 + L 2753 2700 605 + L 1797 2700 606 + L 1797 0 607 + L 678 0 608 + L 678 2700 609 + L 122 2700 610 + L 122 3500 611 + L 678 3500 612 + L 678 3744 613 + Q 678 4316 997 4589 614 + Q 1316 4863 1984 4863 615 + L 2841 4863 616 + z 617 + " transform="scale(0.015625)"/> 618 + <path id="DejaVuSans-Bold-45" d="M 588 4666 619 + L 3834 4666 620 + L 3834 3756 621 + L 1791 3756 622 + L 1791 2888 623 + L 3713 2888 624 + L 3713 1978 625 + L 1791 1978 626 + L 1791 909 627 + L 3903 909 628 + L 3903 0 629 + L 588 0 630 + L 588 4666 631 + z 632 + " transform="scale(0.015625)"/> 633 + <path id="DejaVuSans-Bold-78" d="M 1422 1791 634 + L 159 3500 635 + L 1344 3500 636 + L 2059 2463 637 + L 2784 3500 638 + L 3969 3500 639 + L 2706 1797 640 + L 4031 0 641 + L 2847 0 642 + L 2059 1106 643 + L 1281 0 644 + L 97 0 645 + L 1422 1791 646 + z 647 + " transform="scale(0.015625)"/> 648 + <path id="DejaVuSans-Bold-61" d="M 2106 1575 649 + Q 1756 1575 1579 1456 650 + Q 1403 1338 1403 1106 651 + Q 1403 894 1545 773 652 + Q 1688 653 1941 653 653 + Q 2256 653 2472 879 654 + Q 2688 1106 2688 1447 655 + L 2688 1575 656 + L 2106 1575 657 + z 658 + M 3816 1997 659 + L 3816 0 660 + L 2688 0 661 + L 2688 519 662 + Q 2463 200 2181 54 663 + Q 1900 -91 1497 -91 664 + Q 953 -91 614 226 665 + Q 275 544 275 1050 666 + Q 275 1666 698 1953 667 + Q 1122 2241 2028 2241 668 + L 2688 2241 669 + L 2688 2328 670 + Q 2688 2594 2478 2717 671 + Q 2269 2841 1825 2841 672 + Q 1466 2841 1156 2769 673 + Q 847 2697 581 2553 674 + L 581 3406 675 + Q 941 3494 1303 3539 676 + Q 1666 3584 2028 3584 677 + Q 2975 3584 3395 3211 678 + Q 3816 2838 3816 1997 679 + z 680 + " transform="scale(0.015625)"/> 681 + <path id="DejaVuSans-Bold-69" d="M 538 3500 682 + L 1656 3500 683 + L 1656 0 684 + L 538 0 685 + L 538 3500 686 + z 687 + M 538 4863 688 + L 1656 4863 689 + L 1656 3950 690 + L 538 3950 691 + L 538 4863 692 + z 693 + " transform="scale(0.015625)"/> 694 + <path id="DejaVuSans-Bold-6e" d="M 4056 2131 695 + L 4056 0 696 + L 2931 0 697 + L 2931 347 698 + L 2931 1631 699 + Q 2931 2084 2911 2256 700 + Q 2891 2428 2841 2509 701 + Q 2775 2619 2662 2680 702 + Q 2550 2741 2406 2741 703 + Q 2056 2741 1856 2470 704 + Q 1656 2200 1656 1722 705 + L 1656 0 706 + L 538 0 707 + L 538 3500 708 + L 1656 3500 709 + L 1656 2988 710 + Q 1909 3294 2193 3439 711 + Q 2478 3584 2822 3584 712 + Q 3428 3584 3742 3212 713 + Q 4056 2841 4056 2131 714 + z 715 + " transform="scale(0.015625)"/> 716 + <path id="DejaVuSans-Bold-73" d="M 3272 3391 717 + L 3272 2541 718 + Q 2913 2691 2578 2766 719 + Q 2244 2841 1947 2841 720 + Q 1628 2841 1473 2761 721 + Q 1319 2681 1319 2516 722 + Q 1319 2381 1436 2309 723 + Q 1553 2238 1856 2203 724 + L 2053 2175 725 + Q 2913 2066 3209 1816 726 + Q 3506 1566 3506 1031 727 + Q 3506 472 3093 190 728 + Q 2681 -91 1863 -91 729 + Q 1516 -91 1145 -36 730 + Q 775 19 384 128 731 + L 384 978 732 + Q 719 816 1070 734 733 + Q 1422 653 1784 653 734 + Q 2113 653 2278 743 735 + Q 2444 834 2444 1013 736 + Q 2444 1163 2330 1236 737 + Q 2216 1309 1875 1350 738 + L 1678 1375 739 + Q 931 1469 631 1722 740 + Q 331 1975 331 2491 741 + Q 331 3047 712 3315 742 + Q 1094 3584 1881 3584 743 + Q 2191 3584 2531 3537 744 + Q 2872 3491 3272 3391 745 + z 746 + " transform="scale(0.015625)"/> 747 + </defs> 748 + <use xlink:href="#DejaVuSans-Bold-4e"/> 749 + <use xlink:href="#DejaVuSans-Bold-75" x="83.691406"/> 750 + <use xlink:href="#DejaVuSans-Bold-6d" x="154.882812"/> 751 + <use xlink:href="#DejaVuSans-Bold-62" x="259.082031"/> 752 + <use xlink:href="#DejaVuSans-Bold-65" x="330.664062"/> 753 + <use xlink:href="#DejaVuSans-Bold-72" x="398.486328"/> 754 + <use xlink:href="#DejaVuSans-Bold-20" x="447.802734"/> 755 + <use xlink:href="#DejaVuSans-Bold-6f" x="482.617188"/> 756 + <use xlink:href="#DejaVuSans-Bold-66" x="551.318359"/> 757 + <use xlink:href="#DejaVuSans-Bold-20" x="594.824219"/> 758 + <use xlink:href="#DejaVuSans-Bold-45" x="629.638672"/> 759 + <use xlink:href="#DejaVuSans-Bold-78" x="697.949219"/> 760 + <use xlink:href="#DejaVuSans-Bold-61" x="762.451172"/> 761 + <use xlink:href="#DejaVuSans-Bold-6d" x="829.931641"/> 762 + <use xlink:href="#DejaVuSans-Bold-69" x="934.130859"/> 763 + <use xlink:href="#DejaVuSans-Bold-6e" x="968.408203"/> 764 + <use xlink:href="#DejaVuSans-Bold-65" x="1039.599609"/> 765 + <use xlink:href="#DejaVuSans-Bold-72" x="1107.421875"/> 766 + <use xlink:href="#DejaVuSans-Bold-73" x="1156.738281"/> 767 + </g> 768 + </g> 769 + </g> 770 + <g id="matplotlib.axis_2"> 771 + <g id="ytick_1"> 772 + <g id="line2d_9"> 773 + <path d="M 50.243125 411.737524 774 + L 990.563055 411.737524 775 + " clip-path="url(#p2fee206b1a)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #bdc3c7; stroke-opacity: 0.3; stroke-width: 0.8"/> 776 + </g> 777 + <g id="line2d_10"> 778 + <defs> 779 + <path id="m667d51a1d0" d="M 0 0 780 + L -3.5 0 781 + " style="stroke: #2c3e50; stroke-width: 0.8"/> 782 + </defs> 783 + <g> 784 + <use xlink:href="#m667d51a1d0" x="50.243125" y="411.737524" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 785 + </g> 786 + </g> 787 + <g id="text_10"> 788 + <!-- $\mathdefault{10^{0}}$ --> 789 + <g style="fill: #2c3e50" transform="translate(23.883125 415.916664) scale(0.11 -0.11)"> 790 + <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/> 791 + <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.765625)"/> 792 + <use xlink:href="#DejaVuSans-30" transform="translate(128.203125 39.046875) scale(0.7)"/> 793 + </g> 794 + </g> 795 + </g> 796 + <g id="ytick_2"> 797 + <g id="line2d_11"> 798 + <path d="M 50.243125 328.32351 799 + L 990.563055 328.32351 800 + " clip-path="url(#p2fee206b1a)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #bdc3c7; stroke-opacity: 0.3; stroke-width: 0.8"/> 801 + </g> 802 + <g id="line2d_12"> 803 + <g> 804 + <use xlink:href="#m667d51a1d0" x="50.243125" y="328.32351" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 805 + </g> 806 + </g> 807 + <g id="text_11"> 808 + <!-- $\mathdefault{10^{1}}$ --> 809 + <g style="fill: #2c3e50" transform="translate(23.883125 332.50265) scale(0.11 -0.11)"> 810 + <use xlink:href="#DejaVuSans-31" transform="translate(0 0.684375)"/> 811 + <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.684375)"/> 812 + <use xlink:href="#DejaVuSans-31" transform="translate(128.203125 38.965625) scale(0.7)"/> 813 + </g> 814 + </g> 815 + </g> 816 + <g id="ytick_3"> 817 + <g id="line2d_13"> 818 + <path d="M 50.243125 244.909495 819 + L 990.563055 244.909495 820 + " clip-path="url(#p2fee206b1a)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #bdc3c7; stroke-opacity: 0.3; stroke-width: 0.8"/> 821 + </g> 822 + <g id="line2d_14"> 823 + <g> 824 + <use xlink:href="#m667d51a1d0" x="50.243125" y="244.909495" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 825 + </g> 826 + </g> 827 + <g id="text_12"> 828 + <!-- $\mathdefault{10^{2}}$ --> 829 + <g style="fill: #2c3e50" transform="translate(23.883125 249.088636) scale(0.11 -0.11)"> 830 + <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/> 831 + <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.765625)"/> 832 + <use xlink:href="#DejaVuSans-32" transform="translate(128.203125 39.046875) scale(0.7)"/> 833 + </g> 834 + </g> 835 + </g> 836 + <g id="ytick_4"> 837 + <g id="line2d_15"> 838 + <path d="M 50.243125 161.495481 839 + L 990.563055 161.495481 840 + " clip-path="url(#p2fee206b1a)" style="fill: none; stroke-dasharray: 2.96,1.28; stroke-dashoffset: 0; stroke: #bdc3c7; stroke-opacity: 0.3; stroke-width: 0.8"/> 841 + </g> 842 + <g id="line2d_16"> 843 + <g> 844 + <use xlink:href="#m667d51a1d0" x="50.243125" y="161.495481" style="fill: #2c3e50; stroke: #2c3e50; stroke-width: 0.8"/> 845 + </g> 846 + </g> 847 + <g id="text_13"> 848 + <!-- $\mathdefault{10^{3}}$ --> 849 + <g style="fill: #2c3e50" transform="translate(23.883125 165.674622) scale(0.11 -0.11)"> 850 + <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/> 851 + <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.765625)"/> 852 + <use xlink:href="#DejaVuSans-33" transform="translate(128.203125 39.046875) scale(0.7)"/> 853 + </g> 854 + </g> 855 + </g> 856 + <g id="ytick_5"> 857 + <g id="line2d_17"> 858 + <defs> 859 + <path id="m6a7b7196c3" d="M 0 0 860 + L -2 0 861 + " style="stroke: #000000; stroke-width: 0.6"/> 862 + </defs> 863 + <g> 864 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="424.658518" style="stroke: #000000; stroke-width: 0.6"/> 865 + </g> 866 + </g> 867 + </g> 868 + <g id="ytick_6"> 869 + <g id="line2d_18"> 870 + <g> 871 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="419.821177" style="stroke: #000000; stroke-width: 0.6"/> 872 + </g> 873 + </g> 874 + </g> 875 + <g id="ytick_7"> 876 + <g id="line2d_19"> 877 + <g> 878 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="415.55434" style="stroke: #000000; stroke-width: 0.6"/> 879 + </g> 880 + </g> 881 + </g> 882 + <g id="ytick_8"> 883 + <g id="line2d_20"> 884 + <g> 885 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="386.627403" style="stroke: #000000; stroke-width: 0.6"/> 886 + </g> 887 + </g> 888 + </g> 889 + <g id="ytick_9"> 890 + <g id="line2d_21"> 891 + <g> 892 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="371.938925" style="stroke: #000000; stroke-width: 0.6"/> 893 + </g> 894 + </g> 895 + </g> 896 + <g id="ytick_10"> 897 + <g id="line2d_22"> 898 + <g> 899 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="361.517283" style="stroke: #000000; stroke-width: 0.6"/> 900 + </g> 901 + </g> 902 + </g> 903 + <g id="ytick_11"> 904 + <g id="line2d_23"> 905 + <g> 906 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="353.43363" style="stroke: #000000; stroke-width: 0.6"/> 907 + </g> 908 + </g> 909 + </g> 910 + <g id="ytick_12"> 911 + <g id="line2d_24"> 912 + <g> 913 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="346.828804" style="stroke: #000000; stroke-width: 0.6"/> 914 + </g> 915 + </g> 916 + </g> 917 + <g id="ytick_13"> 918 + <g id="line2d_25"> 919 + <g> 920 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="341.244504" style="stroke: #000000; stroke-width: 0.6"/> 921 + </g> 922 + </g> 923 + </g> 924 + <g id="ytick_14"> 925 + <g id="line2d_26"> 926 + <g> 927 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="336.407163" style="stroke: #000000; stroke-width: 0.6"/> 928 + </g> 929 + </g> 930 + </g> 931 + <g id="ytick_15"> 932 + <g id="line2d_27"> 933 + <g> 934 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="332.140326" style="stroke: #000000; stroke-width: 0.6"/> 935 + </g> 936 + </g> 937 + </g> 938 + <g id="ytick_16"> 939 + <g id="line2d_28"> 940 + <g> 941 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="303.213389" style="stroke: #000000; stroke-width: 0.6"/> 942 + </g> 943 + </g> 944 + </g> 945 + <g id="ytick_17"> 946 + <g id="line2d_29"> 947 + <g> 948 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="288.524911" style="stroke: #000000; stroke-width: 0.6"/> 949 + </g> 950 + </g> 951 + </g> 952 + <g id="ytick_18"> 953 + <g id="line2d_30"> 954 + <g> 955 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="278.103269" style="stroke: #000000; stroke-width: 0.6"/> 956 + </g> 957 + </g> 958 + </g> 959 + <g id="ytick_19"> 960 + <g id="line2d_31"> 961 + <g> 962 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="270.019616" style="stroke: #000000; stroke-width: 0.6"/> 963 + </g> 964 + </g> 965 + </g> 966 + <g id="ytick_20"> 967 + <g id="line2d_32"> 968 + <g> 969 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="263.41479" style="stroke: #000000; stroke-width: 0.6"/> 970 + </g> 971 + </g> 972 + </g> 973 + <g id="ytick_21"> 974 + <g id="line2d_33"> 975 + <g> 976 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="257.83049" style="stroke: #000000; stroke-width: 0.6"/> 977 + </g> 978 + </g> 979 + </g> 980 + <g id="ytick_22"> 981 + <g id="line2d_34"> 982 + <g> 983 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="252.993149" style="stroke: #000000; stroke-width: 0.6"/> 984 + </g> 985 + </g> 986 + </g> 987 + <g id="ytick_23"> 988 + <g id="line2d_35"> 989 + <g> 990 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="248.726311" style="stroke: #000000; stroke-width: 0.6"/> 991 + </g> 992 + </g> 993 + </g> 994 + <g id="ytick_24"> 995 + <g id="line2d_36"> 996 + <g> 997 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="219.799375" style="stroke: #000000; stroke-width: 0.6"/> 998 + </g> 999 + </g> 1000 + </g> 1001 + <g id="ytick_25"> 1002 + <g id="line2d_37"> 1003 + <g> 1004 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="205.110896" style="stroke: #000000; stroke-width: 0.6"/> 1005 + </g> 1006 + </g> 1007 + </g> 1008 + <g id="ytick_26"> 1009 + <g id="line2d_38"> 1010 + <g> 1011 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="194.689255" style="stroke: #000000; stroke-width: 0.6"/> 1012 + </g> 1013 + </g> 1014 + </g> 1015 + <g id="ytick_27"> 1016 + <g id="line2d_39"> 1017 + <g> 1018 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="186.605602" style="stroke: #000000; stroke-width: 0.6"/> 1019 + </g> 1020 + </g> 1021 + </g> 1022 + <g id="ytick_28"> 1023 + <g id="line2d_40"> 1024 + <g> 1025 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="180.000776" style="stroke: #000000; stroke-width: 0.6"/> 1026 + </g> 1027 + </g> 1028 + </g> 1029 + <g id="ytick_29"> 1030 + <g id="line2d_41"> 1031 + <g> 1032 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="174.416476" style="stroke: #000000; stroke-width: 0.6"/> 1033 + </g> 1034 + </g> 1035 + </g> 1036 + <g id="ytick_30"> 1037 + <g id="line2d_42"> 1038 + <g> 1039 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="169.579134" style="stroke: #000000; stroke-width: 0.6"/> 1040 + </g> 1041 + </g> 1042 + </g> 1043 + <g id="ytick_31"> 1044 + <g id="line2d_43"> 1045 + <g> 1046 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="165.312297" style="stroke: #000000; stroke-width: 0.6"/> 1047 + </g> 1048 + </g> 1049 + </g> 1050 + <g id="ytick_32"> 1051 + <g id="line2d_44"> 1052 + <g> 1053 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="136.385361" style="stroke: #000000; stroke-width: 0.6"/> 1054 + </g> 1055 + </g> 1056 + </g> 1057 + <g id="ytick_33"> 1058 + <g id="line2d_45"> 1059 + <g> 1060 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="121.696882" style="stroke: #000000; stroke-width: 0.6"/> 1061 + </g> 1062 + </g> 1063 + </g> 1064 + <g id="ytick_34"> 1065 + <g id="line2d_46"> 1066 + <g> 1067 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="111.275241" style="stroke: #000000; stroke-width: 0.6"/> 1068 + </g> 1069 + </g> 1070 + </g> 1071 + <g id="ytick_35"> 1072 + <g id="line2d_47"> 1073 + <g> 1074 + <use xlink:href="#m6a7b7196c3" x="50.243125" y="103.191587" style="stroke: #000000; stroke-width: 0.6"/> 1075 + </g> 1076 + </g> 1077 + </g> 1078 + <g id="text_14"> 1079 + <!-- Number of Packages (log scale) --> 1080 + <g style="fill: #34495e" transform="translate(17.077969 377.838513) rotate(-90) scale(0.13 -0.13)"> 1081 + <defs> 1082 + <path id="DejaVuSans-Bold-50" d="M 588 4666 1083 + L 2584 4666 1084 + Q 3475 4666 3951 4270 1085 + Q 4428 3875 4428 3144 1086 + Q 4428 2409 3951 2014 1087 + Q 3475 1619 2584 1619 1088 + L 1791 1619 1089 + L 1791 0 1090 + L 588 0 1091 + L 588 4666 1092 + z 1093 + M 1791 3794 1094 + L 1791 2491 1095 + L 2456 2491 1096 + Q 2806 2491 2997 2661 1097 + Q 3188 2831 3188 3144 1098 + Q 3188 3456 2997 3625 1099 + Q 2806 3794 2456 3794 1100 + L 1791 3794 1101 + z 1102 + " transform="scale(0.015625)"/> 1103 + <path id="DejaVuSans-Bold-63" d="M 3366 3391 1104 + L 3366 2478 1105 + Q 3138 2634 2908 2709 1106 + Q 2678 2784 2431 2784 1107 + Q 1963 2784 1702 2511 1108 + Q 1441 2238 1441 1747 1109 + Q 1441 1256 1702 982 1110 + Q 1963 709 2431 709 1111 + Q 2694 709 2930 787 1112 + Q 3166 866 3366 1019 1113 + L 3366 103 1114 + Q 3103 6 2833 -42 1115 + Q 2563 -91 2291 -91 1116 + Q 1344 -91 809 395 1117 + Q 275 881 275 1747 1118 + Q 275 2613 809 3098 1119 + Q 1344 3584 2291 3584 1120 + Q 2566 3584 2833 3536 1121 + Q 3100 3488 3366 3391 1122 + z 1123 + " transform="scale(0.015625)"/> 1124 + <path id="DejaVuSans-Bold-6b" d="M 538 4863 1125 + L 1656 4863 1126 + L 1656 2216 1127 + L 2944 3500 1128 + L 4244 3500 1129 + L 2534 1894 1130 + L 4378 0 1131 + L 3022 0 1132 + L 1656 1459 1133 + L 1656 0 1134 + L 538 0 1135 + L 538 4863 1136 + z 1137 + " transform="scale(0.015625)"/> 1138 + <path id="DejaVuSans-Bold-67" d="M 2919 594 1139 + Q 2688 288 2409 144 1140 + Q 2131 0 1766 0 1141 + Q 1125 0 706 504 1142 + Q 288 1009 288 1791 1143 + Q 288 2575 706 3076 1144 + Q 1125 3578 1766 3578 1145 + Q 2131 3578 2409 3434 1146 + Q 2688 3291 2919 2981 1147 + L 2919 3500 1148 + L 4044 3500 1149 + L 4044 353 1150 + Q 4044 -491 3511 -936 1151 + Q 2978 -1381 1966 -1381 1152 + Q 1638 -1381 1331 -1331 1153 + Q 1025 -1281 716 -1178 1154 + L 716 -306 1155 + Q 1009 -475 1290 -558 1156 + Q 1572 -641 1856 -641 1157 + Q 2406 -641 2662 -400 1158 + Q 2919 -159 2919 353 1159 + L 2919 594 1160 + z 1161 + M 2181 2772 1162 + Q 1834 2772 1640 2515 1163 + Q 1447 2259 1447 1791 1164 + Q 1447 1309 1634 1061 1165 + Q 1822 813 2181 813 1166 + Q 2531 813 2725 1069 1167 + Q 2919 1325 2919 1791 1168 + Q 2919 2259 2725 2515 1169 + Q 2531 2772 2181 2772 1170 + z 1171 + " transform="scale(0.015625)"/> 1172 + <path id="DejaVuSans-Bold-28" d="M 2413 -844 1173 + L 1484 -844 1174 + Q 1006 -72 778 623 1175 + Q 550 1319 550 2003 1176 + Q 550 2688 779 3389 1177 + Q 1009 4091 1484 4856 1178 + L 2413 4856 1179 + Q 2013 4116 1813 3408 1180 + Q 1613 2700 1613 2009 1181 + Q 1613 1319 1811 609 1182 + Q 2009 -100 2413 -844 1183 + z 1184 + " transform="scale(0.015625)"/> 1185 + <path id="DejaVuSans-Bold-6c" d="M 538 4863 1186 + L 1656 4863 1187 + L 1656 0 1188 + L 538 0 1189 + L 538 4863 1190 + z 1191 + " transform="scale(0.015625)"/> 1192 + <path id="DejaVuSans-Bold-29" d="M 513 -844 1193 + Q 913 -100 1113 609 1194 + Q 1313 1319 1313 2009 1195 + Q 1313 2700 1113 3408 1196 + Q 913 4116 513 4856 1197 + L 1441 4856 1198 + Q 1916 4091 2145 3389 1199 + Q 2375 2688 2375 2003 1200 + Q 2375 1319 2147 623 1201 + Q 1919 -72 1441 -844 1202 + L 513 -844 1203 + z 1204 + " transform="scale(0.015625)"/> 1205 + </defs> 1206 + <use xlink:href="#DejaVuSans-Bold-4e"/> 1207 + <use xlink:href="#DejaVuSans-Bold-75" x="83.691406"/> 1208 + <use xlink:href="#DejaVuSans-Bold-6d" x="154.882812"/> 1209 + <use xlink:href="#DejaVuSans-Bold-62" x="259.082031"/> 1210 + <use xlink:href="#DejaVuSans-Bold-65" x="330.664062"/> 1211 + <use xlink:href="#DejaVuSans-Bold-72" x="398.486328"/> 1212 + <use xlink:href="#DejaVuSans-Bold-20" x="447.802734"/> 1213 + <use xlink:href="#DejaVuSans-Bold-6f" x="482.617188"/> 1214 + <use xlink:href="#DejaVuSans-Bold-66" x="551.318359"/> 1215 + <use xlink:href="#DejaVuSans-Bold-20" x="594.824219"/> 1216 + <use xlink:href="#DejaVuSans-Bold-50" x="629.638672"/> 1217 + <use xlink:href="#DejaVuSans-Bold-61" x="700.304688"/> 1218 + <use xlink:href="#DejaVuSans-Bold-63" x="767.785156"/> 1219 + <use xlink:href="#DejaVuSans-Bold-6b" x="827.0625"/> 1220 + <use xlink:href="#DejaVuSans-Bold-61" x="893.566406"/> 1221 + <use xlink:href="#DejaVuSans-Bold-67" x="961.046875"/> 1222 + <use xlink:href="#DejaVuSans-Bold-65" x="1032.628906"/> 1223 + <use xlink:href="#DejaVuSans-Bold-73" x="1100.451172"/> 1224 + <use xlink:href="#DejaVuSans-Bold-20" x="1159.972656"/> 1225 + <use xlink:href="#DejaVuSans-Bold-28" x="1194.787109"/> 1226 + <use xlink:href="#DejaVuSans-Bold-6c" x="1240.490234"/> 1227 + <use xlink:href="#DejaVuSans-Bold-6f" x="1274.767578"/> 1228 + <use xlink:href="#DejaVuSans-Bold-67" x="1343.46875"/> 1229 + <use xlink:href="#DejaVuSans-Bold-20" x="1415.050781"/> 1230 + <use xlink:href="#DejaVuSans-Bold-73" x="1449.865234"/> 1231 + <use xlink:href="#DejaVuSans-Bold-63" x="1509.386719"/> 1232 + <use xlink:href="#DejaVuSans-Bold-61" x="1568.664062"/> 1233 + <use xlink:href="#DejaVuSans-Bold-6c" x="1636.144531"/> 1234 + <use xlink:href="#DejaVuSans-Bold-65" x="1670.421875"/> 1235 + <use xlink:href="#DejaVuSans-Bold-29" x="1738.244141"/> 1236 + </g> 1237 + </g> 1238 + </g> 1239 + <g id="patch_3"> 1240 + <path d="M 92.98494 83825.751702 1241 + L 106.371638 83825.751702 1242 + L 106.371638 112.025596 1243 + L 92.98494 112.025596 1244 + z 1245 + " clip-path="url(#p2fee206b1a)" style="fill: #3498db; opacity: 0.85; stroke: #3498db; stroke-width: 1.5; stroke-linejoin: miter"/> 1246 + </g> 1247 + <g id="patch_4"> 1248 + <path d="M 112.108795 83825.751702 1249 + L 125.495493 83825.751702 1250 + L 125.495493 262.226938 1251 + L 112.108795 262.226938 1252 + z 1253 + " clip-path="url(#p2fee206b1a)" style="fill: #e74c3c; opacity: 0.85; stroke: #e74c3c; stroke-width: 1.5; stroke-linejoin: miter"/> 1254 + </g> 1255 + <g id="patch_5"> 1256 + <path d="M 131.232649 83825.751702 1257 + L 144.619347 83825.751702 1258 + L 144.619347 247.538459 1259 + L 131.232649 247.538459 1260 + z 1261 + " clip-path="url(#p2fee206b1a)" style="fill: #2ecc71; opacity: 0.85; stroke: #2ecc71; stroke-width: 1.5; stroke-linejoin: miter"/> 1262 + </g> 1263 + <g id="patch_6"> 1264 + <path d="M 150.356504 83825.751702 1265 + L 163.743202 83825.751702 1266 + L 163.743202 289.753036 1267 + L 150.356504 289.753036 1268 + z 1269 + " clip-path="url(#p2fee206b1a)" style="fill: #f39c12; opacity: 0.85; stroke: #f39c12; stroke-width: 1.5; stroke-linejoin: miter"/> 1270 + </g> 1271 + <g id="patch_7"> 1272 + <path d="M 169.480358 83825.751702 1273 + L 182.867057 83825.751702 1274 + L 182.867057 361.517283 1275 + L 169.480358 361.517283 1276 + z 1277 + " clip-path="url(#p2fee206b1a)" style="fill: #9b59b6; opacity: 0.85; stroke: #9b59b6; stroke-width: 1.5; stroke-linejoin: miter"/> 1278 + </g> 1279 + <g id="patch_8"> 1280 + <path d="M 188.604213 83825.751702 1281 + L 201.990911 83825.751702 1282 + L 201.990911 386.627403 1283 + L 188.604213 386.627403 1284 + z 1285 + " clip-path="url(#p2fee206b1a)" style="fill: #1abc9c; opacity: 0.85; stroke: #1abc9c; stroke-width: 1.5; stroke-linejoin: miter"/> 1286 + </g> 1287 + <g id="patch_9"> 1288 + <path d="M 207.728068 83825.751702 1289 + L 221.114766 83825.751702 1290 + L 221.114766 83825.751702 1291 + L 207.728068 83825.751702 1292 + z 1293 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1294 + </g> 1295 + <g id="patch_10"> 1296 + <path d="M 226.851922 83825.751702 1297 + L 240.23862 83825.751702 1298 + L 240.23862 411.737524 1299 + L 226.851922 411.737524 1300 + z 1301 + " clip-path="url(#p2fee206b1a)" style="fill: #34495e; opacity: 0.85; stroke: #34495e; stroke-width: 1.5; stroke-linejoin: miter"/> 1302 + </g> 1303 + <g id="patch_11"> 1304 + <path d="M 245.975777 83825.751702 1305 + L 259.362475 83825.751702 1306 + L 259.362475 371.938925 1307 + L 245.975777 371.938925 1308 + z 1309 + " clip-path="url(#p2fee206b1a)" style="fill: #3498db; opacity: 0.85; stroke: #3498db; stroke-width: 1.5; stroke-linejoin: miter"/> 1310 + </g> 1311 + <g id="patch_12"> 1312 + <path d="M 265.099631 83825.751702 1313 + L 278.48633 83825.751702 1314 + L 278.48633 83825.751702 1315 + L 265.099631 83825.751702 1316 + z 1317 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1318 + </g> 1319 + <g id="patch_13"> 1320 + <path d="M 284.223486 83825.751702 1321 + L 297.610184 83825.751702 1322 + L 297.610184 83825.751702 1323 + L 284.223486 83825.751702 1324 + z 1325 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1326 + </g> 1327 + <g id="patch_14"> 1328 + <path d="M 303.34734 83825.751702 1329 + L 316.734039 83825.751702 1330 + L 316.734039 83825.751702 1331 + L 303.34734 83825.751702 1332 + z 1333 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1334 + </g> 1335 + <g id="patch_15"> 1336 + <path d="M 322.471195 83825.751702 1337 + L 335.857893 83825.751702 1338 + L 335.857893 83825.751702 1339 + L 322.471195 83825.751702 1340 + z 1341 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1342 + </g> 1343 + <g id="patch_16"> 1344 + <path d="M 341.59505 83825.751702 1345 + L 354.981748 83825.751702 1346 + L 354.981748 83825.751702 1347 + L 341.59505 83825.751702 1348 + z 1349 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1350 + </g> 1351 + <g id="patch_17"> 1352 + <path d="M 360.718904 83825.751702 1353 + L 374.105602 83825.751702 1354 + L 374.105602 83825.751702 1355 + L 360.718904 83825.751702 1356 + z 1357 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1358 + </g> 1359 + <g id="patch_18"> 1360 + <path d="M 379.842759 83825.751702 1361 + L 393.229457 83825.751702 1362 + L 393.229457 83825.751702 1363 + L 379.842759 83825.751702 1364 + z 1365 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1366 + </g> 1367 + <g id="patch_19"> 1368 + <path d="M 398.966613 83825.751702 1369 + L 412.353312 83825.751702 1370 + L 412.353312 83825.751702 1371 + L 398.966613 83825.751702 1372 + z 1373 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1374 + </g> 1375 + <g id="patch_20"> 1376 + <path d="M 418.090468 83825.751702 1377 + L 431.477166 83825.751702 1378 + L 431.477166 83825.751702 1379 + L 418.090468 83825.751702 1380 + z 1381 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1382 + </g> 1383 + <g id="patch_21"> 1384 + <path d="M 437.214323 83825.751702 1385 + L 450.601021 83825.751702 1386 + L 450.601021 83825.751702 1387 + L 437.214323 83825.751702 1388 + z 1389 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1390 + </g> 1391 + <g id="patch_22"> 1392 + <path d="M 456.338177 83825.751702 1393 + L 469.724875 83825.751702 1394 + L 469.724875 83825.751702 1395 + L 456.338177 83825.751702 1396 + z 1397 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1398 + </g> 1399 + <g id="patch_23"> 1400 + <path d="M 475.462032 83825.751702 1401 + L 488.84873 83825.751702 1402 + L 488.84873 83825.751702 1403 + L 475.462032 83825.751702 1404 + z 1405 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1406 + </g> 1407 + <g id="patch_24"> 1408 + <path d="M 494.585886 83825.751702 1409 + L 507.972585 83825.751702 1410 + L 507.972585 83825.751702 1411 + L 494.585886 83825.751702 1412 + z 1413 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1414 + </g> 1415 + <g id="patch_25"> 1416 + <path d="M 513.709741 83825.751702 1417 + L 527.096439 83825.751702 1418 + L 527.096439 83825.751702 1419 + L 513.709741 83825.751702 1420 + z 1421 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1422 + </g> 1423 + <g id="patch_26"> 1424 + <path d="M 532.833596 83825.751702 1425 + L 546.220294 83825.751702 1426 + L 546.220294 83825.751702 1427 + L 532.833596 83825.751702 1428 + z 1429 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1430 + </g> 1431 + <g id="patch_27"> 1432 + <path d="M 551.95745 83825.751702 1433 + L 565.344148 83825.751702 1434 + L 565.344148 83825.751702 1435 + L 551.95745 83825.751702 1436 + z 1437 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1438 + </g> 1439 + <g id="patch_28"> 1440 + <path d="M 571.081305 83825.751702 1441 + L 584.468003 83825.751702 1442 + L 584.468003 83825.751702 1443 + L 571.081305 83825.751702 1444 + z 1445 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1446 + </g> 1447 + <g id="patch_29"> 1448 + <path d="M 590.205159 83825.751702 1449 + L 603.591857 83825.751702 1450 + L 603.591857 83825.751702 1451 + L 590.205159 83825.751702 1452 + z 1453 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1454 + </g> 1455 + <g id="patch_30"> 1456 + <path d="M 609.329014 83825.751702 1457 + L 622.715712 83825.751702 1458 + L 622.715712 83825.751702 1459 + L 609.329014 83825.751702 1460 + z 1461 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1462 + </g> 1463 + <g id="patch_31"> 1464 + <path d="M 628.452868 83825.751702 1465 + L 641.839567 83825.751702 1466 + L 641.839567 83825.751702 1467 + L 628.452868 83825.751702 1468 + z 1469 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1470 + </g> 1471 + <g id="patch_32"> 1472 + <path d="M 647.576723 83825.751702 1473 + L 660.963421 83825.751702 1474 + L 660.963421 83825.751702 1475 + L 647.576723 83825.751702 1476 + z 1477 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1478 + </g> 1479 + <g id="patch_33"> 1480 + <path d="M 666.700578 83825.751702 1481 + L 680.087276 83825.751702 1482 + L 680.087276 83825.751702 1483 + L 666.700578 83825.751702 1484 + z 1485 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1486 + </g> 1487 + <g id="patch_34"> 1488 + <path d="M 685.824432 83825.751702 1489 + L 699.21113 83825.751702 1490 + L 699.21113 83825.751702 1491 + L 685.824432 83825.751702 1492 + z 1493 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1494 + </g> 1495 + <g id="patch_35"> 1496 + <path d="M 704.948287 83825.751702 1497 + L 718.334985 83825.751702 1498 + L 718.334985 83825.751702 1499 + L 704.948287 83825.751702 1500 + z 1501 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1502 + </g> 1503 + <g id="patch_36"> 1504 + <path d="M 724.072141 83825.751702 1505 + L 737.45884 83825.751702 1506 + L 737.45884 83825.751702 1507 + L 724.072141 83825.751702 1508 + z 1509 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1510 + </g> 1511 + <g id="patch_37"> 1512 + <path d="M 743.195996 83825.751702 1513 + L 756.582694 83825.751702 1514 + L 756.582694 83825.751702 1515 + L 743.195996 83825.751702 1516 + z 1517 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1518 + </g> 1519 + <g id="patch_38"> 1520 + <path d="M 762.319851 83825.751702 1521 + L 775.706549 83825.751702 1522 + L 775.706549 83825.751702 1523 + L 762.319851 83825.751702 1524 + z 1525 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1526 + </g> 1527 + <g id="patch_39"> 1528 + <path d="M 781.443705 83825.751702 1529 + L 794.830403 83825.751702 1530 + L 794.830403 83825.751702 1531 + L 781.443705 83825.751702 1532 + z 1533 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1534 + </g> 1535 + <g id="patch_40"> 1536 + <path d="M 800.56756 83825.751702 1537 + L 813.954258 83825.751702 1538 + L 813.954258 83825.751702 1539 + L 800.56756 83825.751702 1540 + z 1541 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1542 + </g> 1543 + <g id="patch_41"> 1544 + <path d="M 819.691414 83825.751702 1545 + L 833.078113 83825.751702 1546 + L 833.078113 200.68341 1547 + L 819.691414 200.68341 1548 + z 1549 + " clip-path="url(#p2fee206b1a)" style="fill: #e67e22; opacity: 0.85; stroke: #e67e22; stroke-width: 1.5; stroke-linejoin: miter"/> 1550 + </g> 1551 + <g id="patch_42"> 1552 + <path d="M 838.815269 83825.751702 1553 + L 852.201967 83825.751702 1554 + L 852.201967 411.737524 1555 + L 838.815269 411.737524 1556 + z 1557 + " clip-path="url(#p2fee206b1a)" style="fill: #34495e; opacity: 0.85; stroke: #34495e; stroke-width: 1.5; stroke-linejoin: miter"/> 1558 + </g> 1559 + <g id="patch_43"> 1560 + <path d="M 857.939124 83825.751702 1561 + L 871.325822 83825.751702 1562 + L 871.325822 386.627403 1563 + L 857.939124 386.627403 1564 + z 1565 + " clip-path="url(#p2fee206b1a)" style="fill: #3498db; opacity: 0.85; stroke: #3498db; stroke-width: 1.5; stroke-linejoin: miter"/> 1566 + </g> 1567 + <g id="patch_44"> 1568 + <path d="M 877.062978 83825.751702 1569 + L 890.449676 83825.751702 1570 + L 890.449676 83825.751702 1571 + L 877.062978 83825.751702 1572 + z 1573 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1574 + </g> 1575 + <g id="patch_45"> 1576 + <path d="M 896.186833 83825.751702 1577 + L 909.573531 83825.751702 1578 + L 909.573531 83825.751702 1579 + L 896.186833 83825.751702 1580 + z 1581 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1582 + </g> 1583 + <g id="patch_46"> 1584 + <path d="M 915.310687 83825.751702 1585 + L 928.697385 83825.751702 1586 + L 928.697385 83825.751702 1587 + L 915.310687 83825.751702 1588 + z 1589 + " clip-path="url(#p2fee206b1a)" style="fill: #eceff1; opacity: 0.3; stroke: #eceff1; stroke-width: 1.5; stroke-linejoin: miter"/> 1590 + </g> 1591 + <g id="patch_47"> 1592 + <path d="M 934.434542 83825.751702 1593 + L 947.82124 83825.751702 1594 + L 947.82124 278.103269 1595 + L 934.434542 278.103269 1596 + z 1597 + " clip-path="url(#p2fee206b1a)" style="fill: #9b59b6; opacity: 0.85; stroke: #9b59b6; stroke-width: 1.5; stroke-linejoin: miter"/> 1598 + </g> 1599 + <g id="patch_48"> 1600 + <path d="M 50.243125 426.72312 1601 + L 50.243125 97.04 1602 + " style="fill: none; stroke: #bdc3c7; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> 1603 + </g> 1604 + <g id="patch_49"> 1605 + <path d="M 50.243125 426.72312 1606 + L 990.563055 426.72312 1607 + " style="fill: none; stroke: #bdc3c7; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> 1608 + </g> 1609 + <g id="text_15"> 1610 + <g id="patch_50"> 1611 + <path d="M 85.44493 107.220771 1612 + L 113.911648 107.220771 1613 + Q 115.711648 107.220771 115.711648 105.420771 1614 + L 115.711648 96.710458 1615 + Q 115.711648 94.910458 113.911648 94.910458 1616 + L 85.44493 94.910458 1617 + Q 83.64493 94.910458 83.64493 96.710458 1618 + L 83.64493 105.420771 1619 + Q 83.64493 107.220771 85.44493 107.220771 1620 + z 1621 + " style="fill: #ffffff; opacity: 0.8"/> 1622 + </g> 1623 + <!-- 3,918 --> 1624 + <g style="fill: #2c3e50" transform="translate(85.44493 103.549052) scale(0.09 -0.09)"> 1625 + <defs> 1626 + <path id="DejaVuSans-Bold-33" d="M 2981 2516 1627 + Q 3453 2394 3698 2092 1628 + Q 3944 1791 3944 1325 1629 + Q 3944 631 3412 270 1630 + Q 2881 -91 1863 -91 1631 + Q 1503 -91 1142 -33 1632 + Q 781 25 428 141 1633 + L 428 1069 1634 + Q 766 900 1098 814 1635 + Q 1431 728 1753 728 1636 + Q 2231 728 2486 893 1637 + Q 2741 1059 2741 1369 1638 + Q 2741 1688 2480 1852 1639 + Q 2219 2016 1709 2016 1640 + L 1228 2016 1641 + L 1228 2791 1642 + L 1734 2791 1643 + Q 2188 2791 2409 2933 1644 + Q 2631 3075 2631 3366 1645 + Q 2631 3634 2415 3781 1646 + Q 2200 3928 1806 3928 1647 + Q 1516 3928 1219 3862 1648 + Q 922 3797 628 3669 1649 + L 628 4550 1650 + Q 984 4650 1334 4700 1651 + Q 1684 4750 2022 4750 1652 + Q 2931 4750 3382 4451 1653 + Q 3834 4153 3834 3553 1654 + Q 3834 3144 3618 2883 1655 + Q 3403 2622 2981 2516 1656 + z 1657 + " transform="scale(0.015625)"/> 1658 + <path id="DejaVuSans-Bold-2c" d="M 653 1209 1659 + L 1778 1209 1660 + L 1778 256 1661 + L 1006 -909 1662 + L 341 -909 1663 + L 653 256 1664 + L 653 1209 1665 + z 1666 + " transform="scale(0.015625)"/> 1667 + <path id="DejaVuSans-Bold-39" d="M 641 103 1668 + L 641 966 1669 + Q 928 831 1190 764 1670 + Q 1453 697 1709 697 1671 + Q 2247 697 2547 995 1672 + Q 2847 1294 2900 1881 1673 + Q 2688 1725 2447 1647 1674 + Q 2206 1569 1925 1569 1675 + Q 1209 1569 770 1986 1676 + Q 331 2403 331 3084 1677 + Q 331 3838 820 4291 1678 + Q 1309 4744 2131 4744 1679 + Q 3044 4744 3544 4128 1680 + Q 4044 3513 4044 2388 1681 + Q 4044 1231 3459 570 1682 + Q 2875 -91 1856 -91 1683 + Q 1528 -91 1228 -42 1684 + Q 928 6 641 103 1685 + z 1686 + M 2125 2350 1687 + Q 2441 2350 2600 2554 1688 + Q 2759 2759 2759 3169 1689 + Q 2759 3575 2600 3781 1690 + Q 2441 3988 2125 3988 1691 + Q 1809 3988 1650 3781 1692 + Q 1491 3575 1491 3169 1693 + Q 1491 2759 1650 2554 1694 + Q 1809 2350 2125 2350 1695 + z 1696 + " transform="scale(0.015625)"/> 1697 + <path id="DejaVuSans-Bold-31" d="M 750 831 1698 + L 1813 831 1699 + L 1813 3847 1700 + L 722 3622 1701 + L 722 4441 1702 + L 1806 4666 1703 + L 2950 4666 1704 + L 2950 831 1705 + L 4013 831 1706 + L 4013 0 1707 + L 750 0 1708 + L 750 831 1709 + z 1710 + " transform="scale(0.015625)"/> 1711 + <path id="DejaVuSans-Bold-38" d="M 2228 2088 1712 + Q 1891 2088 1709 1903 1713 + Q 1528 1719 1528 1375 1714 + Q 1528 1031 1709 848 1715 + Q 1891 666 2228 666 1716 + Q 2563 666 2741 848 1717 + Q 2919 1031 2919 1375 1718 + Q 2919 1722 2741 1905 1719 + Q 2563 2088 2228 2088 1720 + z 1721 + M 1350 2484 1722 + Q 925 2613 709 2878 1723 + Q 494 3144 494 3541 1724 + Q 494 4131 934 4440 1725 + Q 1375 4750 2228 4750 1726 + Q 3075 4750 3515 4442 1727 + Q 3956 4134 3956 3541 1728 + Q 3956 3144 3739 2878 1729 + Q 3522 2613 3097 2484 1730 + Q 3572 2353 3814 2058 1731 + Q 4056 1763 4056 1313 1732 + Q 4056 619 3595 264 1733 + Q 3134 -91 2228 -91 1734 + Q 1319 -91 855 264 1735 + Q 391 619 391 1313 1736 + Q 391 1763 633 2058 1737 + Q 875 2353 1350 2484 1738 + z 1739 + M 1631 3419 1740 + Q 1631 3141 1786 2991 1741 + Q 1941 2841 2228 2841 1742 + Q 2509 2841 2662 2991 1743 + Q 2816 3141 2816 3419 1744 + Q 2816 3697 2662 3845 1745 + Q 2509 3994 2228 3994 1746 + Q 1941 3994 1786 3844 1747 + Q 1631 3694 1631 3419 1748 + z 1749 + " transform="scale(0.015625)"/> 1750 + </defs> 1751 + <use xlink:href="#DejaVuSans-Bold-33"/> 1752 + <use xlink:href="#DejaVuSans-Bold-2c" x="69.580078"/> 1753 + <use xlink:href="#DejaVuSans-Bold-39" x="107.568359"/> 1754 + <use xlink:href="#DejaVuSans-Bold-31" x="177.148438"/> 1755 + <use xlink:href="#DejaVuSans-Bold-38" x="246.728516"/> 1756 + </g> 1757 + </g> 1758 + <g id="text_16"> 1759 + <g id="patch_51"> 1760 + <path d="M 112.540112 257.422112 1761 + L 125.064175 257.422112 1762 + Q 126.864175 257.422112 126.864175 255.622112 1763 + L 126.864175 246.9118 1764 + Q 126.864175 245.1118 125.064175 245.1118 1765 + L 112.540112 245.1118 1766 + Q 110.740112 245.1118 110.740112 246.9118 1767 + L 110.740112 255.622112 1768 + Q 110.740112 257.422112 112.540112 257.422112 1769 + z 1770 + " style="fill: #ffffff; opacity: 0.8"/> 1771 + </g> 1772 + <!-- 62 --> 1773 + <g style="fill: #2c3e50" transform="translate(112.540112 253.750394) scale(0.09 -0.09)"> 1774 + <defs> 1775 + <path id="DejaVuSans-Bold-36" d="M 2316 2303 1776 + Q 2000 2303 1842 2098 1777 + Q 1684 1894 1684 1484 1778 + Q 1684 1075 1842 870 1779 + Q 2000 666 2316 666 1780 + Q 2634 666 2792 870 1781 + Q 2950 1075 2950 1484 1782 + Q 2950 1894 2792 2098 1783 + Q 2634 2303 2316 2303 1784 + z 1785 + M 3803 4544 1786 + L 3803 3681 1787 + Q 3506 3822 3243 3889 1788 + Q 2981 3956 2731 3956 1789 + Q 2194 3956 1894 3657 1790 + Q 1594 3359 1544 2772 1791 + Q 1750 2925 1990 3001 1792 + Q 2231 3078 2516 3078 1793 + Q 3231 3078 3670 2659 1794 + Q 4109 2241 4109 1563 1795 + Q 4109 813 3618 361 1796 + Q 3128 -91 2303 -91 1797 + Q 1394 -91 895 523 1798 + Q 397 1138 397 2266 1799 + Q 397 3422 980 4083 1800 + Q 1563 4744 2578 4744 1801 + Q 2900 4744 3203 4694 1802 + Q 3506 4644 3803 4544 1803 + z 1804 + " transform="scale(0.015625)"/> 1805 + <path id="DejaVuSans-Bold-32" d="M 1844 884 1806 + L 3897 884 1807 + L 3897 0 1808 + L 506 0 1809 + L 506 884 1810 + L 2209 2388 1811 + Q 2438 2594 2547 2791 1812 + Q 2656 2988 2656 3200 1813 + Q 2656 3528 2436 3728 1814 + Q 2216 3928 1850 3928 1815 + Q 1569 3928 1234 3808 1816 + Q 900 3688 519 3450 1817 + L 519 4475 1818 + Q 925 4609 1322 4679 1819 + Q 1719 4750 2100 4750 1820 + Q 2938 4750 3402 4381 1821 + Q 3866 4013 3866 3353 1822 + Q 3866 2972 3669 2642 1823 + Q 3472 2313 2841 1759 1824 + L 1844 884 1825 + z 1826 + " transform="scale(0.015625)"/> 1827 + </defs> 1828 + <use xlink:href="#DejaVuSans-Bold-36"/> 1829 + <use xlink:href="#DejaVuSans-Bold-32" x="69.580078"/> 1830 + </g> 1831 + </g> 1832 + <g id="text_17"> 1833 + <g id="patch_52"> 1834 + <path d="M 131.663967 242.733634 1835 + L 144.18803 242.733634 1836 + Q 145.98803 242.733634 145.98803 240.933634 1837 + L 145.98803 232.223321 1838 + Q 145.98803 230.423321 144.18803 230.423321 1839 + L 131.663967 230.423321 1840 + Q 129.863967 230.423321 129.863967 232.223321 1841 + L 129.863967 240.933634 1842 + Q 129.863967 242.733634 131.663967 242.733634 1843 + z 1844 + " style="fill: #ffffff; opacity: 0.8"/> 1845 + </g> 1846 + <!-- 93 --> 1847 + <g style="fill: #2c3e50" transform="translate(131.663967 239.061915) scale(0.09 -0.09)"> 1848 + <use xlink:href="#DejaVuSans-Bold-39"/> 1849 + <use xlink:href="#DejaVuSans-Bold-33" x="69.580078"/> 1850 + </g> 1851 + </g> 1852 + <g id="text_18"> 1853 + <g id="patch_53"> 1854 + <path d="M 150.787822 284.948211 1855 + L 163.311884 284.948211 1856 + Q 165.111884 284.948211 165.111884 283.148211 1857 + L 165.111884 274.437898 1858 + Q 165.111884 272.637898 163.311884 272.637898 1859 + L 150.787822 272.637898 1860 + Q 148.987822 272.637898 148.987822 274.437898 1861 + L 148.987822 283.148211 1862 + Q 148.987822 284.948211 150.787822 284.948211 1863 + z 1864 + " style="fill: #ffffff; opacity: 0.8"/> 1865 + </g> 1866 + <!-- 29 --> 1867 + <g style="fill: #2c3e50" transform="translate(150.787822 281.276492) scale(0.09 -0.09)"> 1868 + <use xlink:href="#DejaVuSans-Bold-32"/> 1869 + <use xlink:href="#DejaVuSans-Bold-39" x="69.580078"/> 1870 + </g> 1871 + </g> 1872 + <g id="text_19"> 1873 + <g id="patch_54"> 1874 + <path d="M 173.042692 356.712458 1875 + L 179.304723 356.712458 1876 + Q 181.104723 356.712458 181.104723 354.912458 1877 + L 181.104723 346.202145 1878 + Q 181.104723 344.402145 179.304723 344.402145 1879 + L 173.042692 344.402145 1880 + Q 171.242692 344.402145 171.242692 346.202145 1881 + L 171.242692 354.912458 1882 + Q 171.242692 356.712458 173.042692 356.712458 1883 + z 1884 + " style="fill: #ffffff; opacity: 0.8"/> 1885 + </g> 1886 + <!-- 4 --> 1887 + <g style="fill: #2c3e50" transform="translate(173.042692 353.040739) scale(0.09 -0.09)"> 1888 + <defs> 1889 + <path id="DejaVuSans-Bold-34" d="M 2356 3675 1890 + L 1038 1722 1891 + L 2356 1722 1892 + L 2356 3675 1893 + z 1894 + M 2156 4666 1895 + L 3494 4666 1896 + L 3494 1722 1897 + L 4159 1722 1898 + L 4159 850 1899 + L 3494 850 1900 + L 3494 0 1901 + L 2356 0 1902 + L 2356 850 1903 + L 288 850 1904 + L 288 1881 1905 + L 2156 4666 1906 + z 1907 + " transform="scale(0.015625)"/> 1908 + </defs> 1909 + <use xlink:href="#DejaVuSans-Bold-34"/> 1910 + </g> 1911 + </g> 1912 + <g id="text_20"> 1913 + <g id="patch_55"> 1914 + <path d="M 192.166546 381.822578 1915 + L 198.428578 381.822578 1916 + Q 200.228578 381.822578 200.228578 380.022578 1917 + L 200.228578 371.312265 1918 + Q 200.228578 369.512265 198.428578 369.512265 1919 + L 192.166546 369.512265 1920 + Q 190.366546 369.512265 190.366546 371.312265 1921 + L 190.366546 380.022578 1922 + Q 190.366546 381.822578 192.166546 381.822578 1923 + z 1924 + " style="fill: #ffffff; opacity: 0.8"/> 1925 + </g> 1926 + <!-- 2 --> 1927 + <g style="fill: #2c3e50" transform="translate(192.166546 378.150859) scale(0.09 -0.09)"> 1928 + <use xlink:href="#DejaVuSans-Bold-32"/> 1929 + </g> 1930 + </g> 1931 + <g id="text_21"> 1932 + <g id="patch_56"> 1933 + <path d="M 230.414256 406.932698 1934 + L 236.676287 406.932698 1935 + Q 238.476287 406.932698 238.476287 405.132698 1936 + L 238.476287 396.422386 1937 + Q 238.476287 394.622386 236.676287 394.622386 1938 + L 230.414256 394.622386 1939 + Q 228.614256 394.622386 228.614256 396.422386 1940 + L 228.614256 405.132698 1941 + Q 228.614256 406.932698 230.414256 406.932698 1942 + z 1943 + " style="fill: #ffffff; opacity: 0.8"/> 1944 + </g> 1945 + <!-- 1 --> 1946 + <g style="fill: #2c3e50" transform="translate(230.414256 403.260979) scale(0.09 -0.09)"> 1947 + <use xlink:href="#DejaVuSans-Bold-31"/> 1948 + </g> 1949 + </g> 1950 + <g id="text_22"> 1951 + <g id="patch_57"> 1952 + <path d="M 249.53811 367.134099 1953 + L 255.800141 367.134099 1954 + Q 257.600141 367.134099 257.600141 365.334099 1955 + L 257.600141 356.623787 1956 + Q 257.600141 354.823787 255.800141 354.823787 1957 + L 249.53811 354.823787 1958 + Q 247.73811 354.823787 247.73811 356.623787 1959 + L 247.73811 365.334099 1960 + Q 247.73811 367.134099 249.53811 367.134099 1961 + z 1962 + " style="fill: #ffffff; opacity: 0.8"/> 1963 + </g> 1964 + <!-- 3 --> 1965 + <g style="fill: #2c3e50" transform="translate(249.53811 363.46238) scale(0.09 -0.09)"> 1966 + <use xlink:href="#DejaVuSans-Bold-33"/> 1967 + </g> 1968 + </g> 1969 + <g id="text_23"> 1970 + <g id="patch_58"> 1971 + <path d="M 816.991717 195.878585 1972 + L 835.77781 195.878585 1973 + Q 837.57781 195.878585 837.57781 194.078585 1974 + L 837.57781 185.368272 1975 + Q 837.57781 183.568272 835.77781 183.568272 1976 + L 816.991717 183.568272 1977 + Q 815.191717 183.568272 815.191717 185.368272 1978 + L 815.191717 194.078585 1979 + Q 815.191717 195.878585 816.991717 195.878585 1980 + z 1981 + " style="fill: #ffffff; opacity: 0.8"/> 1982 + </g> 1983 + <!-- 339 --> 1984 + <g style="fill: #2c3e50" transform="translate(816.991717 192.206866) scale(0.09 -0.09)"> 1985 + <use xlink:href="#DejaVuSans-Bold-33"/> 1986 + <use xlink:href="#DejaVuSans-Bold-33" x="69.580078"/> 1987 + <use xlink:href="#DejaVuSans-Bold-39" x="139.160156"/> 1988 + </g> 1989 + </g> 1990 + <g id="text_24"> 1991 + <g id="patch_59"> 1992 + <path d="M 842.377602 406.932698 1993 + L 848.639634 406.932698 1994 + Q 850.439634 406.932698 850.439634 405.132698 1995 + L 850.439634 396.422386 1996 + Q 850.439634 394.622386 848.639634 394.622386 1997 + L 842.377602 394.622386 1998 + Q 840.577602 394.622386 840.577602 396.422386 1999 + L 840.577602 405.132698 2000 + Q 840.577602 406.932698 842.377602 406.932698 2001 + z 2002 + " style="fill: #ffffff; opacity: 0.8"/> 2003 + </g> 2004 + <!-- 1 --> 2005 + <g style="fill: #2c3e50" transform="translate(842.377602 403.260979) scale(0.09 -0.09)"> 2006 + <use xlink:href="#DejaVuSans-Bold-31"/> 2007 + </g> 2008 + </g> 2009 + <g id="text_25"> 2010 + <g id="patch_60"> 2011 + <path d="M 861.501457 381.822578 2012 + L 867.763488 381.822578 2013 + Q 869.563488 381.822578 869.563488 380.022578 2014 + L 869.563488 371.312265 2015 + Q 869.563488 369.512265 867.763488 369.512265 2016 + L 861.501457 369.512265 2017 + Q 859.701457 369.512265 859.701457 371.312265 2018 + L 859.701457 380.022578 2019 + Q 859.701457 381.822578 861.501457 381.822578 2020 + z 2021 + " style="fill: #ffffff; opacity: 0.8"/> 2022 + </g> 2023 + <!-- 2 --> 2024 + <g style="fill: #2c3e50" transform="translate(861.501457 378.150859) scale(0.09 -0.09)"> 2025 + <use xlink:href="#DejaVuSans-Bold-32"/> 2026 + </g> 2027 + </g> 2028 + <g id="text_26"> 2029 + <g id="patch_61"> 2030 + <path d="M 934.86586 273.298443 2031 + L 947.389922 273.298443 2032 + Q 949.189922 273.298443 949.189922 271.498443 2033 + L 949.189922 262.788131 2034 + Q 949.189922 260.988131 947.389922 260.988131 2035 + L 934.86586 260.988131 2036 + Q 933.06586 260.988131 933.06586 262.788131 2037 + L 933.06586 271.498443 2038 + Q 933.06586 273.298443 934.86586 273.298443 2039 + z 2040 + " style="fill: #ffffff; opacity: 0.8"/> 2041 + </g> 2042 + <!-- 40 --> 2043 + <g style="fill: #2c3e50" transform="translate(934.86586 269.626725) scale(0.09 -0.09)"> 2044 + <defs> 2045 + <path id="DejaVuSans-Bold-30" d="M 2944 2338 2046 + Q 2944 3213 2780 3570 2047 + Q 2616 3928 2228 3928 2048 + Q 1841 3928 1675 3570 2049 + Q 1509 3213 1509 2338 2050 + Q 1509 1453 1675 1090 2051 + Q 1841 728 2228 728 2052 + Q 2613 728 2778 1090 2053 + Q 2944 1453 2944 2338 2054 + z 2055 + M 4147 2328 2056 + Q 4147 1169 3647 539 2057 + Q 3147 -91 2228 -91 2058 + Q 1306 -91 806 539 2059 + Q 306 1169 306 2328 2060 + Q 306 3491 806 4120 2061 + Q 1306 4750 2228 4750 2062 + Q 3147 4750 3647 4120 2063 + Q 4147 3491 4147 2328 2064 + z 2065 + " transform="scale(0.015625)"/> 2066 + </defs> 2067 + <use xlink:href="#DejaVuSans-Bold-34"/> 2068 + <use xlink:href="#DejaVuSans-Bold-30" x="69.580078"/> 2069 + </g> 2070 + </g> 2071 + <g id="text_27"> 2072 + <!-- Package Counts by Examiner Range --> 2073 + <g style="fill: #2c3e50" transform="translate(368.842153 77.04) scale(0.15 -0.15)"> 2074 + <defs> 2075 + <path id="DejaVuSans-Bold-43" d="M 4288 256 2076 + Q 3956 84 3597 -3 2077 + Q 3238 -91 2847 -91 2078 + Q 1681 -91 1000 561 2079 + Q 319 1213 319 2328 2080 + Q 319 3447 1000 4098 2081 + Q 1681 4750 2847 4750 2082 + Q 3238 4750 3597 4662 2083 + Q 3956 4575 4288 4403 2084 + L 4288 3438 2085 + Q 3953 3666 3628 3772 2086 + Q 3303 3878 2944 3878 2087 + Q 2300 3878 1931 3465 2088 + Q 1563 3053 1563 2328 2089 + Q 1563 1606 1931 1193 2090 + Q 2300 781 2944 781 2091 + Q 3303 781 3628 887 2092 + Q 3953 994 4288 1222 2093 + L 4288 256 2094 + z 2095 + " transform="scale(0.015625)"/> 2096 + <path id="DejaVuSans-Bold-74" d="M 1759 4494 2097 + L 1759 3500 2098 + L 2913 3500 2099 + L 2913 2700 2100 + L 1759 2700 2101 + L 1759 1216 2102 + Q 1759 972 1856 886 2103 + Q 1953 800 2241 800 2104 + L 2816 800 2105 + L 2816 0 2106 + L 1856 0 2107 + Q 1194 0 917 276 2108 + Q 641 553 641 1216 2109 + L 641 2700 2110 + L 84 2700 2111 + L 84 3500 2112 + L 641 3500 2113 + L 641 4494 2114 + L 1759 4494 2115 + z 2116 + " transform="scale(0.015625)"/> 2117 + <path id="DejaVuSans-Bold-79" d="M 78 3500 2118 + L 1197 3500 2119 + L 2138 1125 2120 + L 2938 3500 2121 + L 4056 3500 2122 + L 2584 -331 2123 + Q 2363 -916 2067 -1148 2124 + Q 1772 -1381 1288 -1381 2125 + L 641 -1381 2126 + L 641 -647 2127 + L 991 -647 2128 + Q 1275 -647 1404 -556 2129 + Q 1534 -466 1606 -231 2130 + L 1638 -134 2131 + L 78 3500 2132 + z 2133 + " transform="scale(0.015625)"/> 2134 + <path id="DejaVuSans-Bold-52" d="M 2297 2597 2135 + Q 2675 2597 2839 2737 2136 + Q 3003 2878 3003 3200 2137 + Q 3003 3519 2839 3656 2138 + Q 2675 3794 2297 3794 2139 + L 1791 3794 2140 + L 1791 2597 2141 + L 2297 2597 2142 + z 2143 + M 1791 1766 2144 + L 1791 0 2145 + L 588 0 2146 + L 588 4666 2147 + L 2425 4666 2148 + Q 3347 4666 3776 4356 2149 + Q 4206 4047 4206 3378 2150 + Q 4206 2916 3982 2619 2151 + Q 3759 2322 3309 2181 2152 + Q 3556 2125 3751 1926 2153 + Q 3947 1728 4147 1325 2154 + L 4800 0 2155 + L 3519 0 2156 + L 2950 1159 2157 + Q 2778 1509 2601 1637 2158 + Q 2425 1766 2131 1766 2159 + L 1791 1766 2160 + z 2161 + " transform="scale(0.015625)"/> 2162 + </defs> 2163 + <use xlink:href="#DejaVuSans-Bold-50"/> 2164 + <use xlink:href="#DejaVuSans-Bold-61" x="70.666016"/> 2165 + <use xlink:href="#DejaVuSans-Bold-63" x="138.146484"/> 2166 + <use xlink:href="#DejaVuSans-Bold-6b" x="197.423828"/> 2167 + <use xlink:href="#DejaVuSans-Bold-61" x="263.927734"/> 2168 + <use xlink:href="#DejaVuSans-Bold-67" x="331.408203"/> 2169 + <use xlink:href="#DejaVuSans-Bold-65" x="402.990234"/> 2170 + <use xlink:href="#DejaVuSans-Bold-20" x="470.8125"/> 2171 + <use xlink:href="#DejaVuSans-Bold-43" x="505.626953"/> 2172 + <use xlink:href="#DejaVuSans-Bold-6f" x="579.015625"/> 2173 + <use xlink:href="#DejaVuSans-Bold-75" x="647.716797"/> 2174 + <use xlink:href="#DejaVuSans-Bold-6e" x="718.908203"/> 2175 + <use xlink:href="#DejaVuSans-Bold-74" x="790.099609"/> 2176 + <use xlink:href="#DejaVuSans-Bold-73" x="837.902344"/> 2177 + <use xlink:href="#DejaVuSans-Bold-20" x="897.423828"/> 2178 + <use xlink:href="#DejaVuSans-Bold-62" x="932.238281"/> 2179 + <use xlink:href="#DejaVuSans-Bold-79" x="1003.820312"/> 2180 + <use xlink:href="#DejaVuSans-Bold-20" x="1069.005859"/> 2181 + <use xlink:href="#DejaVuSans-Bold-45" x="1103.820312"/> 2182 + <use xlink:href="#DejaVuSans-Bold-78" x="1172.130859"/> 2183 + <use xlink:href="#DejaVuSans-Bold-61" x="1236.632812"/> 2184 + <use xlink:href="#DejaVuSans-Bold-6d" x="1304.113281"/> 2185 + <use xlink:href="#DejaVuSans-Bold-69" x="1408.3125"/> 2186 + <use xlink:href="#DejaVuSans-Bold-6e" x="1442.589844"/> 2187 + <use xlink:href="#DejaVuSans-Bold-65" x="1513.78125"/> 2188 + <use xlink:href="#DejaVuSans-Bold-72" x="1581.603516"/> 2189 + <use xlink:href="#DejaVuSans-Bold-20" x="1630.919922"/> 2190 + <use xlink:href="#DejaVuSans-Bold-52" x="1665.734375"/> 2191 + <use xlink:href="#DejaVuSans-Bold-61" x="1742.736328"/> 2192 + <use xlink:href="#DejaVuSans-Bold-6e" x="1810.216797"/> 2193 + <use xlink:href="#DejaVuSans-Bold-67" x="1881.408203"/> 2194 + <use xlink:href="#DejaVuSans-Bold-65" x="1952.990234"/> 2195 + </g> 2196 + </g> 2197 + </g> 2198 + <g id="text_28"> 2199 + <!-- Distribution of Examiner Counts per Package --> 2200 + <g style="fill: #2c3e50" transform="translate(270.055399 20.877187) scale(0.18 -0.18)"> 2201 + <defs> 2202 + <path id="DejaVuSans-Bold-44" d="M 1791 3756 2203 + L 1791 909 2204 + L 2222 909 2205 + Q 2959 909 3348 1275 2206 + Q 3738 1641 3738 2338 2207 + Q 3738 3031 3350 3393 2208 + Q 2963 3756 2222 3756 2209 + L 1791 3756 2210 + z 2211 + M 588 4666 2212 + L 1856 4666 2213 + Q 2919 4666 3439 4514 2214 + Q 3959 4363 4331 4000 2215 + Q 4659 3684 4818 3271 2216 + Q 4978 2859 4978 2338 2217 + Q 4978 1809 4818 1395 2218 + Q 4659 981 4331 666 2219 + Q 3956 303 3431 151 2220 + Q 2906 0 1856 0 2221 + L 588 0 2222 + L 588 4666 2223 + z 2224 + " transform="scale(0.015625)"/> 2225 + <path id="DejaVuSans-Bold-70" d="M 1656 506 2226 + L 1656 -1331 2227 + L 538 -1331 2228 + L 538 3500 2229 + L 1656 3500 2230 + L 1656 2988 2231 + Q 1888 3294 2169 3439 2232 + Q 2450 3584 2816 3584 2233 + Q 3463 3584 3878 3070 2234 + Q 4294 2556 4294 1747 2235 + Q 4294 938 3878 423 2236 + Q 3463 -91 2816 -91 2237 + Q 2450 -91 2169 54 2238 + Q 1888 200 1656 506 2239 + z 2240 + M 2400 2772 2241 + Q 2041 2772 1848 2508 2242 + Q 1656 2244 1656 1747 2243 + Q 1656 1250 1848 986 2244 + Q 2041 722 2400 722 2245 + Q 2759 722 2948 984 2246 + Q 3138 1247 3138 1747 2247 + Q 3138 2247 2948 2509 2248 + Q 2759 2772 2400 2772 2249 + z 2250 + " transform="scale(0.015625)"/> 2251 + </defs> 2252 + <use xlink:href="#DejaVuSans-Bold-44"/> 2253 + <use xlink:href="#DejaVuSans-Bold-69" x="83.007812"/> 2254 + <use xlink:href="#DejaVuSans-Bold-73" x="117.285156"/> 2255 + <use xlink:href="#DejaVuSans-Bold-74" x="176.806641"/> 2256 + <use xlink:href="#DejaVuSans-Bold-72" x="224.609375"/> 2257 + <use xlink:href="#DejaVuSans-Bold-69" x="273.925781"/> 2258 + <use xlink:href="#DejaVuSans-Bold-62" x="308.203125"/> 2259 + <use xlink:href="#DejaVuSans-Bold-75" x="379.785156"/> 2260 + <use xlink:href="#DejaVuSans-Bold-74" x="450.976562"/> 2261 + <use xlink:href="#DejaVuSans-Bold-69" x="498.779297"/> 2262 + <use xlink:href="#DejaVuSans-Bold-6f" x="533.056641"/> 2263 + <use xlink:href="#DejaVuSans-Bold-6e" x="601.757812"/> 2264 + <use xlink:href="#DejaVuSans-Bold-20" x="672.949219"/> 2265 + <use xlink:href="#DejaVuSans-Bold-6f" x="707.763672"/> 2266 + <use xlink:href="#DejaVuSans-Bold-66" x="776.464844"/> 2267 + <use xlink:href="#DejaVuSans-Bold-20" x="819.970703"/> 2268 + <use xlink:href="#DejaVuSans-Bold-45" x="854.785156"/> 2269 + <use xlink:href="#DejaVuSans-Bold-78" x="923.095703"/> 2270 + <use xlink:href="#DejaVuSans-Bold-61" x="987.597656"/> 2271 + <use xlink:href="#DejaVuSans-Bold-6d" x="1055.078125"/> 2272 + <use xlink:href="#DejaVuSans-Bold-69" x="1159.277344"/> 2273 + <use xlink:href="#DejaVuSans-Bold-6e" x="1193.554688"/> 2274 + <use xlink:href="#DejaVuSans-Bold-65" x="1264.746094"/> 2275 + <use xlink:href="#DejaVuSans-Bold-72" x="1332.568359"/> 2276 + <use xlink:href="#DejaVuSans-Bold-20" x="1381.884766"/> 2277 + <use xlink:href="#DejaVuSans-Bold-43" x="1416.699219"/> 2278 + <use xlink:href="#DejaVuSans-Bold-6f" x="1490.087891"/> 2279 + <use xlink:href="#DejaVuSans-Bold-75" x="1558.789062"/> 2280 + <use xlink:href="#DejaVuSans-Bold-6e" x="1629.980469"/> 2281 + <use xlink:href="#DejaVuSans-Bold-74" x="1701.171875"/> 2282 + <use xlink:href="#DejaVuSans-Bold-73" x="1748.974609"/> 2283 + <use xlink:href="#DejaVuSans-Bold-20" x="1808.496094"/> 2284 + <use xlink:href="#DejaVuSans-Bold-70" x="1843.310547"/> 2285 + <use xlink:href="#DejaVuSans-Bold-65" x="1914.892578"/> 2286 + <use xlink:href="#DejaVuSans-Bold-72" x="1982.714844"/> 2287 + <use xlink:href="#DejaVuSans-Bold-20" x="2032.03125"/> 2288 + <use xlink:href="#DejaVuSans-Bold-50" x="2066.845703"/> 2289 + <use xlink:href="#DejaVuSans-Bold-61" x="2137.511719"/> 2290 + <use xlink:href="#DejaVuSans-Bold-63" x="2204.992188"/> 2291 + <use xlink:href="#DejaVuSans-Bold-6b" x="2264.269531"/> 2292 + <use xlink:href="#DejaVuSans-Bold-61" x="2330.773438"/> 2293 + <use xlink:href="#DejaVuSans-Bold-67" x="2398.253906"/> 2294 + <use xlink:href="#DejaVuSans-Bold-65" x="2469.835938"/> 2295 + </g> 2296 + </g> 2297 + <g id="text_29"> 2298 + <g id="patch_62"> 2299 + <path d="M 14.603055 549.959687 2300 + L 123.148368 549.959687 2301 + Q 128.148368 549.959687 128.148368 544.959687 2302 + L 128.148368 512.885937 2303 + Q 128.148368 507.885937 123.148368 507.885937 2304 + L 14.603055 507.885937 2305 + Q 9.603055 507.885937 9.603055 512.885937 2306 + L 9.603055 544.959687 2307 + Q 9.603055 549.959687 14.603055 549.959687 2308 + z 2309 + " style="fill: #ecf0f1; opacity: 0.9; stroke: #bdc3c7; stroke-linejoin: miter"/> 2310 + </g> 2311 + <!-- Total Packages: 4,494 --> 2312 + <g style="fill: #2c3e50" transform="translate(14.603055 520.484375) scale(0.1 -0.1)"> 2313 + <defs> 2314 + <path id="DejaVuSans-54" d="M -19 4666 2315 + L 3928 4666 2316 + L 3928 4134 2317 + L 2272 4134 2318 + L 2272 0 2319 + L 1638 0 2320 + L 1638 4134 2321 + L -19 4134 2322 + L -19 4666 2323 + z 2324 + " transform="scale(0.015625)"/> 2325 + <path id="DejaVuSans-6f" d="M 1959 3097 2326 + Q 1497 3097 1228 2736 2327 + Q 959 2375 959 1747 2328 + Q 959 1119 1226 758 2329 + Q 1494 397 1959 397 2330 + Q 2419 397 2687 759 2331 + Q 2956 1122 2956 1747 2332 + Q 2956 2369 2687 2733 2333 + Q 2419 3097 1959 3097 2334 + z 2335 + M 1959 3584 2336 + Q 2709 3584 3137 3096 2337 + Q 3566 2609 3566 1747 2338 + Q 3566 888 3137 398 2339 + Q 2709 -91 1959 -91 2340 + Q 1206 -91 779 398 2341 + Q 353 888 353 1747 2342 + Q 353 2609 779 3096 2343 + Q 1206 3584 1959 3584 2344 + z 2345 + " transform="scale(0.015625)"/> 2346 + <path id="DejaVuSans-74" d="M 1172 4494 2347 + L 1172 3500 2348 + L 2356 3500 2349 + L 2356 3053 2350 + L 1172 3053 2351 + L 1172 1153 2352 + Q 1172 725 1289 603 2353 + Q 1406 481 1766 481 2354 + L 2356 481 2355 + L 2356 0 2356 + L 1766 0 2357 + Q 1100 0 847 248 2358 + Q 594 497 594 1153 2359 + L 594 3053 2360 + L 172 3053 2361 + L 172 3500 2362 + L 594 3500 2363 + L 594 4494 2364 + L 1172 4494 2365 + z 2366 + " transform="scale(0.015625)"/> 2367 + <path id="DejaVuSans-61" d="M 2194 1759 2368 + Q 1497 1759 1228 1600 2369 + Q 959 1441 959 1056 2370 + Q 959 750 1161 570 2371 + Q 1363 391 1709 391 2372 + Q 2188 391 2477 730 2373 + Q 2766 1069 2766 1631 2374 + L 2766 1759 2375 + L 2194 1759 2376 + z 2377 + M 3341 1997 2378 + L 3341 0 2379 + L 2766 0 2380 + L 2766 531 2381 + Q 2569 213 2275 61 2382 + Q 1981 -91 1556 -91 2383 + Q 1019 -91 701 211 2384 + Q 384 513 384 1019 2385 + Q 384 1609 779 1909 2386 + Q 1175 2209 1959 2209 2387 + L 2766 2209 2388 + L 2766 2266 2389 + Q 2766 2663 2505 2880 2390 + Q 2244 3097 1772 3097 2391 + Q 1472 3097 1187 3025 2392 + Q 903 2953 641 2809 2393 + L 641 3341 2394 + Q 956 3463 1253 3523 2395 + Q 1550 3584 1831 3584 2396 + Q 2591 3584 2966 3190 2397 + Q 3341 2797 3341 1997 2398 + z 2399 + " transform="scale(0.015625)"/> 2400 + <path id="DejaVuSans-6c" d="M 603 4863 2401 + L 1178 4863 2402 + L 1178 0 2403 + L 603 0 2404 + L 603 4863 2405 + z 2406 + " transform="scale(0.015625)"/> 2407 + <path id="DejaVuSans-20" transform="scale(0.015625)"/> 2408 + <path id="DejaVuSans-50" d="M 1259 4147 2409 + L 1259 2394 2410 + L 2053 2394 2411 + Q 2494 2394 2734 2622 2412 + Q 2975 2850 2975 3272 2413 + Q 2975 3691 2734 3919 2414 + Q 2494 4147 2053 4147 2415 + L 1259 4147 2416 + z 2417 + M 628 4666 2418 + L 2053 4666 2419 + Q 2838 4666 3239 4311 2420 + Q 3641 3956 3641 3272 2421 + Q 3641 2581 3239 2228 2422 + Q 2838 1875 2053 1875 2423 + L 1259 1875 2424 + L 1259 0 2425 + L 628 0 2426 + L 628 4666 2427 + z 2428 + " transform="scale(0.015625)"/> 2429 + <path id="DejaVuSans-63" d="M 3122 3366 2430 + L 3122 2828 2431 + Q 2878 2963 2633 3030 2432 + Q 2388 3097 2138 3097 2433 + Q 1578 3097 1268 2742 2434 + Q 959 2388 959 1747 2435 + Q 959 1106 1268 751 2436 + Q 1578 397 2138 397 2437 + Q 2388 397 2633 464 2438 + Q 2878 531 3122 666 2439 + L 3122 134 2440 + Q 2881 22 2623 -34 2441 + Q 2366 -91 2075 -91 2442 + Q 1284 -91 818 406 2443 + Q 353 903 353 1747 2444 + Q 353 2603 823 3093 2445 + Q 1294 3584 2113 3584 2446 + Q 2378 3584 2631 3529 2447 + Q 2884 3475 3122 3366 2448 + z 2449 + " transform="scale(0.015625)"/> 2450 + <path id="DejaVuSans-6b" d="M 581 4863 2451 + L 1159 4863 2452 + L 1159 1991 2453 + L 2875 3500 2454 + L 3609 3500 2455 + L 1753 1863 2456 + L 3688 0 2457 + L 2938 0 2458 + L 1159 1709 2459 + L 1159 0 2460 + L 581 0 2461 + L 581 4863 2462 + z 2463 + " transform="scale(0.015625)"/> 2464 + <path id="DejaVuSans-67" d="M 2906 1791 2465 + Q 2906 2416 2648 2759 2466 + Q 2391 3103 1925 3103 2467 + Q 1463 3103 1205 2759 2468 + Q 947 2416 947 1791 2469 + Q 947 1169 1205 825 2470 + Q 1463 481 1925 481 2471 + Q 2391 481 2648 825 2472 + Q 2906 1169 2906 1791 2473 + z 2474 + M 3481 434 2475 + Q 3481 -459 3084 -895 2476 + Q 2688 -1331 1869 -1331 2477 + Q 1566 -1331 1297 -1286 2478 + Q 1028 -1241 775 -1147 2479 + L 775 -588 2480 + Q 1028 -725 1275 -790 2481 + Q 1522 -856 1778 -856 2482 + Q 2344 -856 2625 -561 2483 + Q 2906 -266 2906 331 2484 + L 2906 616 2485 + Q 2728 306 2450 153 2486 + Q 2172 0 1784 0 2487 + Q 1141 0 747 490 2488 + Q 353 981 353 1791 2489 + Q 353 2603 747 3093 2490 + Q 1141 3584 1784 3584 2491 + Q 2172 3584 2450 3431 2492 + Q 2728 3278 2906 2969 2493 + L 2906 3500 2494 + L 3481 3500 2495 + L 3481 434 2496 + z 2497 + " transform="scale(0.015625)"/> 2498 + <path id="DejaVuSans-65" d="M 3597 1894 2499 + L 3597 1613 2500 + L 953 1613 2501 + Q 991 1019 1311 708 2502 + Q 1631 397 2203 397 2503 + Q 2534 397 2845 478 2504 + Q 3156 559 3463 722 2505 + L 3463 178 2506 + Q 3153 47 2828 -22 2507 + Q 2503 -91 2169 -91 2508 + Q 1331 -91 842 396 2509 + Q 353 884 353 1716 2510 + Q 353 2575 817 3079 2511 + Q 1281 3584 2069 3584 2512 + Q 2775 3584 3186 3129 2513 + Q 3597 2675 3597 1894 2514 + z 2515 + M 3022 2063 2516 + Q 3016 2534 2758 2815 2517 + Q 2500 3097 2075 3097 2518 + Q 1594 3097 1305 2825 2519 + Q 1016 2553 972 2059 2520 + L 3022 2063 2521 + z 2522 + " transform="scale(0.015625)"/> 2523 + <path id="DejaVuSans-73" d="M 2834 3397 2524 + L 2834 2853 2525 + Q 2591 2978 2328 3040 2526 + Q 2066 3103 1784 3103 2527 + Q 1356 3103 1142 2972 2528 + Q 928 2841 928 2578 2529 + Q 928 2378 1081 2264 2530 + Q 1234 2150 1697 2047 2531 + L 1894 2003 2532 + Q 2506 1872 2764 1633 2533 + Q 3022 1394 3022 966 2534 + Q 3022 478 2636 193 2535 + Q 2250 -91 1575 -91 2536 + Q 1294 -91 989 -36 2537 + Q 684 19 347 128 2538 + L 347 722 2539 + Q 666 556 975 473 2540 + Q 1284 391 1588 391 2541 + Q 1994 391 2212 530 2542 + Q 2431 669 2431 922 2543 + Q 2431 1156 2273 1281 2544 + Q 2116 1406 1581 1522 2545 + L 1381 1569 2546 + Q 847 1681 609 1914 2547 + Q 372 2147 372 2553 2548 + Q 372 3047 722 3315 2549 + Q 1072 3584 1716 3584 2550 + Q 2034 3584 2315 3537 2551 + Q 2597 3491 2834 3397 2552 + z 2553 + " transform="scale(0.015625)"/> 2554 + <path id="DejaVuSans-3a" d="M 750 794 2555 + L 1409 794 2556 + L 1409 0 2557 + L 750 0 2558 + L 750 794 2559 + z 2560 + M 750 3309 2561 + L 1409 3309 2562 + L 1409 2516 2563 + L 750 2516 2564 + L 750 3309 2565 + z 2566 + " transform="scale(0.015625)"/> 2567 + <path id="DejaVuSans-2c" d="M 750 794 2568 + L 1409 794 2569 + L 1409 256 2570 + L 897 -744 2571 + L 494 -744 2572 + L 750 256 2573 + L 750 794 2574 + z 2575 + " transform="scale(0.015625)"/> 2576 + </defs> 2577 + <use xlink:href="#DejaVuSans-54"/> 2578 + <use xlink:href="#DejaVuSans-6f" x="44.083984"/> 2579 + <use xlink:href="#DejaVuSans-74" x="105.265625"/> 2580 + <use xlink:href="#DejaVuSans-61" x="144.474609"/> 2581 + <use xlink:href="#DejaVuSans-6c" x="205.753906"/> 2582 + <use xlink:href="#DejaVuSans-20" x="233.537109"/> 2583 + <use xlink:href="#DejaVuSans-50" x="265.324219"/> 2584 + <use xlink:href="#DejaVuSans-61" x="321.126953"/> 2585 + <use xlink:href="#DejaVuSans-63" x="382.40625"/> 2586 + <use xlink:href="#DejaVuSans-6b" x="437.386719"/> 2587 + <use xlink:href="#DejaVuSans-61" x="493.546875"/> 2588 + <use xlink:href="#DejaVuSans-67" x="554.826172"/> 2589 + <use xlink:href="#DejaVuSans-65" x="618.302734"/> 2590 + <use xlink:href="#DejaVuSans-73" x="679.826172"/> 2591 + <use xlink:href="#DejaVuSans-3a" x="731.925781"/> 2592 + <use xlink:href="#DejaVuSans-20" x="765.617188"/> 2593 + <use xlink:href="#DejaVuSans-34" x="797.404297"/> 2594 + <use xlink:href="#DejaVuSans-2c" x="861.027344"/> 2595 + <use xlink:href="#DejaVuSans-34" x="892.814453"/> 2596 + <use xlink:href="#DejaVuSans-39" x="956.4375"/> 2597 + <use xlink:href="#DejaVuSans-34" x="1020.060547"/> 2598 + </g> 2599 + <!-- Max Examiners: 4438 --> 2600 + <g style="fill: #2c3e50" transform="translate(14.603055 531.682187) scale(0.1 -0.1)"> 2601 + <defs> 2602 + <path id="DejaVuSans-4d" d="M 628 4666 2603 + L 1569 4666 2604 + L 2759 1491 2605 + L 3956 4666 2606 + L 4897 4666 2607 + L 4897 0 2608 + L 4281 0 2609 + L 4281 4097 2610 + L 3078 897 2611 + L 2444 897 2612 + L 1241 4097 2613 + L 1241 0 2614 + L 628 0 2615 + L 628 4666 2616 + z 2617 + " transform="scale(0.015625)"/> 2618 + <path id="DejaVuSans-78" d="M 3513 3500 2619 + L 2247 1797 2620 + L 3578 0 2621 + L 2900 0 2622 + L 1881 1375 2623 + L 863 0 2624 + L 184 0 2625 + L 1544 1831 2626 + L 300 3500 2627 + L 978 3500 2628 + L 1906 2253 2629 + L 2834 3500 2630 + L 3513 3500 2631 + z 2632 + " transform="scale(0.015625)"/> 2633 + <path id="DejaVuSans-45" d="M 628 4666 2634 + L 3578 4666 2635 + L 3578 4134 2636 + L 1259 4134 2637 + L 1259 2753 2638 + L 3481 2753 2639 + L 3481 2222 2640 + L 1259 2222 2641 + L 1259 531 2642 + L 3634 531 2643 + L 3634 0 2644 + L 628 0 2645 + L 628 4666 2646 + z 2647 + " transform="scale(0.015625)"/> 2648 + <path id="DejaVuSans-6d" d="M 3328 2828 2649 + Q 3544 3216 3844 3400 2650 + Q 4144 3584 4550 3584 2651 + Q 5097 3584 5394 3201 2652 + Q 5691 2819 5691 2113 2653 + L 5691 0 2654 + L 5113 0 2655 + L 5113 2094 2656 + Q 5113 2597 4934 2840 2657 + Q 4756 3084 4391 3084 2658 + Q 3944 3084 3684 2787 2659 + Q 3425 2491 3425 1978 2660 + L 3425 0 2661 + L 2847 0 2662 + L 2847 2094 2663 + Q 2847 2600 2669 2842 2664 + Q 2491 3084 2119 3084 2665 + Q 1678 3084 1418 2786 2666 + Q 1159 2488 1159 1978 2667 + L 1159 0 2668 + L 581 0 2669 + L 581 3500 2670 + L 1159 3500 2671 + L 1159 2956 2672 + Q 1356 3278 1631 3431 2673 + Q 1906 3584 2284 3584 2674 + Q 2666 3584 2933 3390 2675 + Q 3200 3197 3328 2828 2676 + z 2677 + " transform="scale(0.015625)"/> 2678 + <path id="DejaVuSans-69" d="M 603 3500 2679 + L 1178 3500 2680 + L 1178 0 2681 + L 603 0 2682 + L 603 3500 2683 + z 2684 + M 603 4863 2685 + L 1178 4863 2686 + L 1178 4134 2687 + L 603 4134 2688 + L 603 4863 2689 + z 2690 + " transform="scale(0.015625)"/> 2691 + <path id="DejaVuSans-6e" d="M 3513 2113 2692 + L 3513 0 2693 + L 2938 0 2694 + L 2938 2094 2695 + Q 2938 2591 2744 2837 2696 + Q 2550 3084 2163 3084 2697 + Q 1697 3084 1428 2787 2698 + Q 1159 2491 1159 1978 2699 + L 1159 0 2700 + L 581 0 2701 + L 581 3500 2702 + L 1159 3500 2703 + L 1159 2956 2704 + Q 1366 3272 1645 3428 2705 + Q 1925 3584 2291 3584 2706 + Q 2894 3584 3203 3211 2707 + Q 3513 2838 3513 2113 2708 + z 2709 + " transform="scale(0.015625)"/> 2710 + <path id="DejaVuSans-72" d="M 2631 2963 2711 + Q 2534 3019 2420 3045 2712 + Q 2306 3072 2169 3072 2713 + Q 1681 3072 1420 2755 2714 + Q 1159 2438 1159 1844 2715 + L 1159 0 2716 + L 581 0 2717 + L 581 3500 2718 + L 1159 3500 2719 + L 1159 2956 2720 + Q 1341 3275 1631 3429 2721 + Q 1922 3584 2338 3584 2722 + Q 2397 3584 2469 3576 2723 + Q 2541 3569 2628 3553 2724 + L 2631 2963 2725 + z 2726 + " transform="scale(0.015625)"/> 2727 + </defs> 2728 + <use xlink:href="#DejaVuSans-4d"/> 2729 + <use xlink:href="#DejaVuSans-61" x="86.279297"/> 2730 + <use xlink:href="#DejaVuSans-78" x="147.558594"/> 2731 + <use xlink:href="#DejaVuSans-20" x="206.738281"/> 2732 + <use xlink:href="#DejaVuSans-45" x="238.525391"/> 2733 + <use xlink:href="#DejaVuSans-78" x="301.708984"/> 2734 + <use xlink:href="#DejaVuSans-61" x="360.888672"/> 2735 + <use xlink:href="#DejaVuSans-6d" x="422.167969"/> 2736 + <use xlink:href="#DejaVuSans-69" x="519.580078"/> 2737 + <use xlink:href="#DejaVuSans-6e" x="547.363281"/> 2738 + <use xlink:href="#DejaVuSans-65" x="610.742188"/> 2739 + <use xlink:href="#DejaVuSans-72" x="672.265625"/> 2740 + <use xlink:href="#DejaVuSans-73" x="713.378906"/> 2741 + <use xlink:href="#DejaVuSans-3a" x="765.478516"/> 2742 + <use xlink:href="#DejaVuSans-20" x="799.169922"/> 2743 + <use xlink:href="#DejaVuSans-34" x="830.957031"/> 2744 + <use xlink:href="#DejaVuSans-34" x="894.580078"/> 2745 + <use xlink:href="#DejaVuSans-33" x="958.203125"/> 2746 + <use xlink:href="#DejaVuSans-38" x="1021.826172"/> 2747 + </g> 2748 + <!-- Bins Used: 45 --> 2749 + <g style="fill: #2c3e50" transform="translate(14.603055 542.88) scale(0.1 -0.1)"> 2750 + <defs> 2751 + <path id="DejaVuSans-42" d="M 1259 2228 2752 + L 1259 519 2753 + L 2272 519 2754 + Q 2781 519 3026 730 2755 + Q 3272 941 3272 1375 2756 + Q 3272 1813 3026 2020 2757 + Q 2781 2228 2272 2228 2758 + L 1259 2228 2759 + z 2760 + M 1259 4147 2761 + L 1259 2741 2762 + L 2194 2741 2763 + Q 2656 2741 2882 2914 2764 + Q 3109 3088 3109 3444 2765 + Q 3109 3797 2882 3972 2766 + Q 2656 4147 2194 4147 2767 + L 1259 4147 2768 + z 2769 + M 628 4666 2770 + L 2241 4666 2771 + Q 2963 4666 3353 4366 2772 + Q 3744 4066 3744 3513 2773 + Q 3744 3084 3544 2831 2774 + Q 3344 2578 2956 2516 2775 + Q 3422 2416 3680 2098 2776 + Q 3938 1781 3938 1306 2777 + Q 3938 681 3513 340 2778 + Q 3088 0 2303 0 2779 + L 628 0 2780 + L 628 4666 2781 + z 2782 + " transform="scale(0.015625)"/> 2783 + <path id="DejaVuSans-55" d="M 556 4666 2784 + L 1191 4666 2785 + L 1191 1831 2786 + Q 1191 1081 1462 751 2787 + Q 1734 422 2344 422 2788 + Q 2950 422 3222 751 2789 + Q 3494 1081 3494 1831 2790 + L 3494 4666 2791 + L 4128 4666 2792 + L 4128 1753 2793 + Q 4128 841 3676 375 2794 + Q 3225 -91 2344 -91 2795 + Q 1459 -91 1007 375 2796 + Q 556 841 556 1753 2797 + L 556 4666 2798 + z 2799 + " transform="scale(0.015625)"/> 2800 + <path id="DejaVuSans-64" d="M 2906 2969 2801 + L 2906 4863 2802 + L 3481 4863 2803 + L 3481 0 2804 + L 2906 0 2805 + L 2906 525 2806 + Q 2725 213 2448 61 2807 + Q 2172 -91 1784 -91 2808 + Q 1150 -91 751 415 2809 + Q 353 922 353 1747 2810 + Q 353 2572 751 3078 2811 + Q 1150 3584 1784 3584 2812 + Q 2172 3584 2448 3432 2813 + Q 2725 3281 2906 2969 2814 + z 2815 + M 947 1747 2816 + Q 947 1113 1208 752 2817 + Q 1469 391 1925 391 2818 + Q 2381 391 2643 752 2819 + Q 2906 1113 2906 1747 2820 + Q 2906 2381 2643 2742 2821 + Q 2381 3103 1925 3103 2822 + Q 1469 3103 1208 2742 2823 + Q 947 2381 947 1747 2824 + z 2825 + " transform="scale(0.015625)"/> 2826 + <path id="DejaVuSans-35" d="M 691 4666 2827 + L 3169 4666 2828 + L 3169 4134 2829 + L 1269 4134 2830 + L 1269 2991 2831 + Q 1406 3038 1543 3061 2832 + Q 1681 3084 1819 3084 2833 + Q 2600 3084 3056 2656 2834 + Q 3513 2228 3513 1497 2835 + Q 3513 744 3044 326 2836 + Q 2575 -91 1722 -91 2837 + Q 1428 -91 1123 -41 2838 + Q 819 9 494 109 2839 + L 494 744 2840 + Q 775 591 1075 516 2841 + Q 1375 441 1709 441 2842 + Q 2250 441 2565 725 2843 + Q 2881 1009 2881 1497 2844 + Q 2881 1984 2565 2268 2845 + Q 2250 2553 1709 2553 2846 + Q 1456 2553 1204 2497 2847 + Q 953 2441 691 2322 2848 + L 691 4666 2849 + z 2850 + " transform="scale(0.015625)"/> 2851 + </defs> 2852 + <use xlink:href="#DejaVuSans-42"/> 2853 + <use xlink:href="#DejaVuSans-69" x="68.603516"/> 2854 + <use xlink:href="#DejaVuSans-6e" x="96.386719"/> 2855 + <use xlink:href="#DejaVuSans-73" x="159.765625"/> 2856 + <use xlink:href="#DejaVuSans-20" x="211.865234"/> 2857 + <use xlink:href="#DejaVuSans-55" x="243.652344"/> 2858 + <use xlink:href="#DejaVuSans-73" x="316.845703"/> 2859 + <use xlink:href="#DejaVuSans-65" x="368.945312"/> 2860 + <use xlink:href="#DejaVuSans-64" x="430.46875"/> 2861 + <use xlink:href="#DejaVuSans-3a" x="493.945312"/> 2862 + <use xlink:href="#DejaVuSans-20" x="527.636719"/> 2863 + <use xlink:href="#DejaVuSans-34" x="559.423828"/> 2864 + <use xlink:href="#DejaVuSans-35" x="623.046875"/> 2865 + </g> 2866 + </g> 2867 + </g> 2868 + <defs> 2869 + <clipPath id="p2fee206b1a"> 2870 + <rect x="50.243125" y="97.04" width="940.31993" height="329.68312"/> 2871 + </clipPath> 2872 + </defs> 2873 + </svg>
+467
site/blog/2025/12/fungus.svg
··· 1 + <?xml version="1.0" standalone="no"?> 2 + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 3 + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 + <svg viewBox="0 0 920 520" version="1.1" 5 + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="initme()"> 6 + <script><![CDATA[ 7 + celltimes=[ 8 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 9 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 10 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,25.500000,24.500000,25.500000,27.500000,25.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,24.500000,25.500000,24.500000,23.500000,19.500000,21.500000,24.500000,22.500000,23.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,24.500000,22.500000,22.500000,23.500000,19.500000,17.500000,18.500000,20.500000,20.500000,22.500000,25.500000,0.000000,0.000000,0.000000,0.000000,23.500000,23.500000,21.500000,18.500000,19.500000,-0.500000,15.500000,13.500000,17.500000,17.500000,22.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,22.500000,21.500000,18.500000,17.500000,-0.500000,15.500000,-0.500000,10.500000,13.500000,15.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,-0.500000,26.500000,27.500000,-0.500000,15.500000,13.500000,12.500000,-0.500000,8.500000,10.500000,12.500000,14.500000,-0.500000,-0.500000,27.500000,0.000000,24.500000,23.500000,21.500000,-0.500000,-0.500000,14.500000,9.500000,7.500000,7.500000,8.500000,10.500000,11.500000,21.500000,18.500000,20.500000,0.000000,23.500000,22.500000,20.500000,18.500000,16.500000,13.500000,10.500000,0.500000,7.500000,8.500000,10.500000,13.500000,16.500000,18.500000,21.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,18.500000,17.500000,10.500000,4.500000,6.500000,8.500000,19.500000,20.500000,17.500000,19.500000,21.500000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,19.500000,-0.500000,9.500000,8.500000,19.500000,19.500000,19.500000,19.500000,-0.500000,22.500000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,17.500000,15.500000,11.500000,11.500000,-0.500000,19.500000,-0.500000,-0.500000,23.500000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,18.500000,17.500000,16.500000,15.500000,16.500000,20.500000,22.500000,24.500000,27.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,-0.500000,20.500000,24.500000,22.500000,20.500000,22.500000,24.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,25.500000,-0.500000,25.500000,24.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,-0.500000,26.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 11 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,22.500000,26.500000,27.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,24.500000,23.500000,21.500000,27.500000,-0.500000,-0.500000,-0.500000,-0.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,22.500000,22.500000,20.500000,21.500000,-0.500000,-0.500000,-0.500000,-0.500000,25.500000,26.500000,0.000000,0.000000,0.000000,0.000000,25.500000,23.500000,21.500000,20.500000,19.500000,20.500000,21.500000,22.500000,18.500000,20.500000,22.500000,24.500000,25.500000,0.000000,0.000000,0.000000,23.500000,21.500000,20.500000,19.500000,16.500000,15.500000,17.500000,16.500000,17.500000,18.500000,19.500000,21.500000,21.500000,0.000000,0.000000,19.500000,18.500000,19.500000,20.500000,16.500000,17.500000,14.500000,-0.500000,15.500000,16.500000,21.500000,23.500000,22.500000,22.500000,24.500000,0.000000,18.500000,18.500000,17.500000,16.500000,14.500000,13.500000,11.500000,8.500000,11.500000,15.500000,19.500000,-0.500000,-0.500000,24.500000,26.500000,0.000000,19.500000,19.500000,19.500000,17.500000,-0.500000,18.500000,15.500000,0.500000,6.500000,12.500000,15.500000,16.500000,20.500000,22.500000,23.500000,0.000000,20.500000,23.500000,22.500000,22.500000,21.500000,19.500000,16.500000,6.500000,11.500000,13.500000,15.500000,18.500000,20.500000,21.500000,-0.500000,0.000000,22.500000,24.500000,21.500000,20.500000,16.500000,15.500000,13.500000,10.500000,13.500000,15.500000,17.500000,19.500000,20.500000,23.500000,25.500000,0.000000,0.000000,-0.500000,23.500000,20.500000,22.500000,16.500000,18.500000,18.500000,20.500000,17.500000,18.500000,20.500000,21.500000,24.500000,0.000000,0.000000,0.000000,-0.500000,-0.500000,22.500000,20.500000,18.500000,19.500000,21.500000,20.500000,19.500000,23.500000,22.500000,23.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,22.500000,20.500000,19.500000,-0.500000,22.500000,22.500000,20.500000,24.500000,25.500000,25.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,27.500000,21.500000,23.500000,22.500000,21.500000,27.500000,27.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,27.500000,23.500000,25.500000,27.500000,23.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 12 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,23.500000,21.500000,21.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,21.500000,18.500000,20.500000,17.500000,18.500000,19.500000,21.500000,23.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,18.500000,18.500000,17.500000,19.500000,16.500000,17.500000,17.500000,19.500000,21.500000,-0.500000,21.500000,0.000000,0.000000,0.000000,0.000000,20.500000,17.500000,16.500000,14.500000,14.500000,14.500000,15.500000,16.500000,18.500000,17.500000,20.500000,20.500000,21.500000,0.000000,0.000000,0.000000,17.500000,16.500000,14.500000,13.500000,13.500000,13.500000,13.500000,17.500000,16.500000,16.500000,16.500000,18.500000,19.500000,0.000000,0.000000,17.500000,15.500000,14.500000,13.500000,12.500000,12.500000,12.500000,12.500000,13.500000,13.500000,14.500000,16.500000,17.500000,24.500000,20.500000,0.000000,18.500000,16.500000,13.500000,12.500000,10.500000,8.500000,10.500000,9.500000,10.500000,11.500000,12.500000,13.500000,14.500000,16.500000,18.500000,0.000000,16.500000,15.500000,15.500000,13.500000,10.500000,7.500000,6.500000,0.500000,6.500000,7.500000,10.500000,11.500000,15.500000,21.500000,20.500000,0.000000,15.500000,14.500000,13.500000,11.500000,10.500000,9.500000,7.500000,5.500000,9.500000,9.500000,13.500000,13.500000,15.500000,18.500000,21.500000,0.000000,16.500000,14.500000,13.500000,12.500000,13.500000,17.500000,8.500000,7.500000,9.500000,10.500000,14.500000,15.500000,17.500000,18.500000,19.500000,0.000000,0.000000,15.500000,15.500000,15.500000,14.500000,13.500000,14.500000,8.500000,10.500000,13.500000,14.500000,17.500000,-0.500000,19.500000,0.000000,0.000000,0.000000,20.500000,17.500000,15.500000,14.500000,12.500000,11.500000,10.500000,12.500000,13.500000,14.500000,17.500000,20.500000,24.500000,0.000000,0.000000,0.000000,0.000000,19.500000,17.500000,15.500000,13.500000,12.500000,12.500000,14.500000,14.500000,16.500000,17.500000,20.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,16.500000,16.500000,14.500000,13.500000,16.500000,16.500000,16.500000,20.500000,19.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,17.500000,14.500000,20.500000,18.500000,19.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 13 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,14.500000,14.500000,12.500000,14.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,15.500000,15.500000,12.500000,12.500000,11.500000,12.500000,12.500000,18.500000,19.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,15.500000,14.500000,13.500000,11.500000,11.500000,10.500000,11.500000,12.500000,13.500000,14.500000,15.500000,0.000000,0.000000,0.000000,0.000000,14.500000,13.500000,14.500000,13.500000,10.500000,9.500000,9.500000,10.500000,12.500000,12.500000,14.500000,17.500000,20.500000,0.000000,0.000000,0.000000,14.500000,13.500000,11.500000,10.500000,9.500000,7.500000,7.500000,9.500000,10.500000,12.500000,13.500000,16.500000,19.500000,0.000000,0.000000,19.500000,13.500000,13.500000,11.500000,9.500000,8.500000,6.500000,6.500000,7.500000,15.500000,13.500000,15.500000,17.500000,18.500000,18.500000,0.000000,18.500000,12.500000,12.500000,10.500000,8.500000,6.500000,4.500000,5.500000,8.500000,9.500000,10.500000,12.500000,12.500000,13.500000,15.500000,0.000000,14.500000,12.500000,10.500000,9.500000,7.500000,6.500000,5.500000,0.500000,5.500000,8.500000,10.500000,12.500000,13.500000,14.500000,14.500000,0.000000,15.500000,14.500000,10.500000,9.500000,8.500000,6.500000,4.500000,4.500000,6.500000,7.500000,10.500000,11.500000,12.500000,13.500000,14.500000,0.000000,13.500000,11.500000,9.500000,8.500000,7.500000,6.500000,6.500000,6.500000,8.500000,10.500000,12.500000,12.500000,12.500000,13.500000,15.500000,0.000000,0.000000,11.500000,10.500000,10.500000,8.500000,8.500000,9.500000,9.500000,10.500000,11.500000,13.500000,12.500000,13.500000,15.500000,0.000000,0.000000,0.000000,-0.500000,12.500000,11.500000,9.500000,9.500000,10.500000,10.500000,11.500000,12.500000,-0.500000,13.500000,15.500000,16.500000,0.000000,0.000000,0.000000,0.000000,13.500000,13.500000,11.500000,10.500000,11.500000,11.500000,11.500000,13.500000,14.500000,15.500000,16.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,13.500000,13.500000,11.500000,12.500000,11.500000,13.500000,14.500000,15.500000,16.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,14.500000,13.500000,12.500000,14.500000,15.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 14 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,15.500000,13.500000,12.500000,12.500000,14.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,14.500000,14.500000,13.500000,12.500000,11.500000,13.500000,13.500000,13.500000,14.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,14.500000,13.500000,13.500000,13.500000,11.500000,10.500000,11.500000,12.500000,12.500000,13.500000,15.500000,0.000000,0.000000,0.000000,0.000000,17.500000,15.500000,12.500000,13.500000,11.500000,10.500000,9.500000,12.500000,14.500000,12.500000,12.500000,14.500000,16.500000,0.000000,0.000000,0.000000,14.500000,13.500000,11.500000,12.500000,11.500000,10.500000,8.500000,9.500000,10.500000,11.500000,12.500000,14.500000,14.500000,0.000000,0.000000,14.500000,13.500000,12.500000,10.500000,10.500000,10.500000,8.500000,7.500000,10.500000,9.500000,9.500000,11.500000,12.500000,14.500000,16.500000,0.000000,13.500000,12.500000,11.500000,10.500000,9.500000,8.500000,7.500000,4.500000,7.500000,8.500000,9.500000,10.500000,11.500000,12.500000,14.500000,0.000000,14.500000,14.500000,12.500000,11.500000,10.500000,8.500000,7.500000,0.500000,7.500000,8.500000,9.500000,10.500000,12.500000,13.500000,15.500000,0.000000,17.500000,15.500000,13.500000,12.500000,11.500000,9.500000,8.500000,6.500000,8.500000,9.500000,11.500000,13.500000,13.500000,14.500000,16.500000,0.000000,18.500000,16.500000,14.500000,13.500000,-0.500000,10.500000,8.500000,7.500000,12.500000,10.500000,12.500000,14.500000,14.500000,17.500000,17.500000,0.000000,0.000000,18.500000,27.500000,18.500000,-0.500000,12.500000,14.500000,8.500000,13.500000,12.500000,14.500000,15.500000,16.500000,20.500000,0.000000,0.000000,0.000000,20.500000,24.500000,17.500000,18.500000,14.500000,13.500000,10.500000,17.500000,18.500000,15.500000,17.500000,18.500000,21.500000,0.000000,0.000000,0.000000,0.000000,17.500000,16.500000,14.500000,13.500000,11.500000,11.500000,15.500000,16.500000,18.500000,19.500000,20.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,18.500000,16.500000,14.500000,14.500000,12.500000,14.500000,15.500000,16.500000,19.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,18.500000,18.500000,14.500000,15.500000,16.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 15 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,22.500000,25.500000,17.500000,20.500000,19.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,21.500000,18.500000,17.500000,17.500000,15.500000,20.500000,18.500000,21.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,18.500000,17.500000,15.500000,15.500000,14.500000,14.500000,15.500000,17.500000,17.500000,16.500000,19.500000,0.000000,0.000000,0.000000,0.000000,21.500000,16.500000,15.500000,15.500000,14.500000,10.500000,12.500000,17.500000,19.500000,20.500000,14.500000,15.500000,-0.500000,0.000000,0.000000,0.000000,18.500000,14.500000,13.500000,12.500000,10.500000,9.500000,10.500000,11.500000,15.500000,15.500000,13.500000,15.500000,17.500000,0.000000,0.000000,19.500000,17.500000,15.500000,14.500000,13.500000,12.500000,8.500000,9.500000,9.500000,19.500000,11.500000,11.500000,16.500000,-0.500000,15.500000,0.000000,21.500000,18.500000,17.500000,16.500000,14.500000,17.500000,7.500000,6.500000,7.500000,8.500000,9.500000,10.500000,11.500000,12.500000,13.500000,0.000000,23.500000,18.500000,17.500000,15.500000,11.500000,10.500000,6.500000,0.500000,5.500000,10.500000,12.500000,-0.500000,-0.500000,13.500000,15.500000,0.000000,-0.500000,17.500000,15.500000,14.500000,10.500000,9.500000,7.500000,4.500000,7.500000,-0.500000,13.500000,14.500000,16.500000,23.500000,24.500000,0.000000,18.500000,16.500000,13.500000,12.500000,11.500000,9.500000,9.500000,7.500000,10.500000,11.500000,13.500000,19.500000,17.500000,20.500000,22.500000,0.000000,0.000000,18.500000,18.500000,-0.500000,16.500000,12.500000,10.500000,10.500000,11.500000,13.500000,14.500000,16.500000,18.500000,21.500000,0.000000,0.000000,0.000000,20.500000,-0.500000,-0.500000,14.500000,12.500000,11.500000,11.500000,13.500000,15.500000,16.500000,18.500000,19.500000,21.500000,0.000000,0.000000,0.000000,0.000000,23.500000,21.500000,20.500000,14.500000,12.500000,12.500000,14.500000,18.500000,19.500000,19.500000,20.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,20.500000,19.500000,17.500000,16.500000,13.500000,15.500000,19.500000,21.500000,22.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,17.500000,16.500000,14.500000,16.500000,20.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 16 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,21.500000,-0.500000,-0.500000,22.500000,23.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,20.500000,19.500000,19.500000,21.500000,22.500000,21.500000,22.500000,24.500000,25.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,20.500000,17.500000,16.500000,16.500000,17.500000,19.500000,20.500000,21.500000,22.500000,23.500000,21.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,17.500000,15.500000,14.500000,12.500000,19.500000,18.500000,19.500000,20.500000,18.500000,21.500000,19.500000,19.500000,0.000000,0.000000,0.000000,19.500000,16.500000,14.500000,12.500000,11.500000,10.500000,16.500000,21.500000,20.500000,16.500000,18.500000,16.500000,16.500000,0.000000,0.000000,21.500000,19.500000,16.500000,13.500000,12.500000,9.500000,8.500000,9.500000,10.500000,12.500000,14.500000,17.500000,15.500000,14.500000,17.500000,0.000000,20.500000,18.500000,13.500000,10.500000,9.500000,8.500000,6.500000,5.500000,8.500000,10.500000,18.500000,11.500000,12.500000,13.500000,15.500000,0.000000,17.500000,16.500000,15.500000,12.500000,10.500000,10.500000,4.500000,0.500000,5.500000,7.500000,8.500000,9.500000,10.500000,11.500000,13.500000,0.000000,16.500000,14.500000,12.500000,10.500000,9.500000,8.500000,7.500000,4.500000,6.500000,8.500000,9.500000,10.500000,12.500000,14.500000,16.500000,0.000000,18.500000,16.500000,14.500000,14.500000,13.500000,10.500000,8.500000,9.500000,8.500000,9.500000,13.500000,11.500000,13.500000,17.500000,18.500000,0.000000,0.000000,18.500000,15.500000,17.500000,15.500000,14.500000,10.500000,10.500000,10.500000,11.500000,13.500000,14.500000,14.500000,20.500000,0.000000,0.000000,0.000000,19.500000,18.500000,17.500000,15.500000,13.500000,12.500000,15.500000,12.500000,13.500000,19.500000,16.500000,16.500000,19.500000,0.000000,0.000000,0.000000,0.000000,20.500000,19.500000,20.500000,16.500000,14.500000,16.500000,14.500000,15.500000,20.500000,18.500000,18.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,21.500000,-0.500000,19.500000,15.500000,18.500000,16.500000,18.500000,21.500000,22.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,20.500000,17.500000,22.500000,20.500000,20.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 17 + [0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,23.500000,25.500000,23.500000,25.500000,26.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,22.500000,21.500000,21.500000,22.500000,20.500000,22.500000,23.500000,25.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,24.500000,21.500000,19.500000,20.500000,21.500000,19.500000,21.500000,21.500000,23.500000,23.500000,24.500000,0.000000,0.000000,0.000000,0.000000,24.500000,22.500000,21.500000,18.500000,17.500000,15.500000,17.500000,21.500000,19.500000,21.500000,22.500000,23.500000,22.500000,0.000000,0.000000,0.000000,22.500000,21.500000,19.500000,16.500000,16.500000,13.500000,15.500000,19.500000,16.500000,19.500000,20.500000,24.500000,21.500000,0.000000,0.000000,26.500000,22.500000,20.500000,16.500000,14.500000,13.500000,11.500000,13.500000,15.500000,15.500000,16.500000,17.500000,18.500000,19.500000,20.500000,0.000000,27.500000,21.500000,21.500000,17.500000,15.500000,11.500000,9.500000,12.500000,12.500000,13.500000,19.500000,19.500000,19.500000,22.500000,23.500000,0.000000,25.500000,21.500000,20.500000,17.500000,17.500000,12.500000,5.500000,0.500000,12.500000,14.500000,17.500000,23.500000,25.500000,24.500000,25.500000,0.000000,24.500000,23.500000,21.500000,21.500000,21.500000,17.500000,14.500000,9.500000,9.500000,14.500000,16.500000,19.500000,22.500000,25.500000,26.500000,0.000000,25.500000,24.500000,23.500000,20.500000,19.500000,17.500000,13.500000,10.500000,11.500000,12.500000,16.500000,19.500000,26.500000,26.500000,26.500000,0.000000,0.000000,25.500000,26.500000,25.500000,23.500000,20.500000,17.500000,12.500000,12.500000,14.500000,17.500000,20.500000,20.500000,27.500000,0.000000,0.000000,0.000000,27.500000,-0.500000,23.500000,21.500000,19.500000,18.500000,15.500000,15.500000,14.500000,15.500000,17.500000,18.500000,20.500000,0.000000,0.000000,0.000000,0.000000,-0.500000,-0.500000,23.500000,23.500000,19.500000,19.500000,17.500000,16.500000,18.500000,19.500000,22.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,23.500000,22.500000,21.500000,19.500000,18.500000,18.500000,21.500000,-0.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.500000,22.500000,21.500000,22.500000,19.500000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0], 18 + []] 19 + cellids=[ 20 + "0-0", 21 + "1-0", 22 + "2-0", 23 + "3-0", 24 + "4-0", 25 + "5-0", 26 + "6-0", 27 + "7-0", 28 + "8-0", 29 + "9-0", 30 + "10-0", 31 + "11-0", 32 + "12-0", 33 + "13-0", 34 + "14-0", 35 + "15-0", 36 + "0-1", 37 + "1-1", 38 + "2-1", 39 + "3-1", 40 + "4-1", 41 + "5-1", 42 + "6-1", 43 + "7-1", 44 + "8-1", 45 + "9-1", 46 + "10-1", 47 + "11-1", 48 + "12-1", 49 + "13-1", 50 + "14-1", 51 + "15-1", 52 + "0-2", 53 + "1-2", 54 + "2-2", 55 + "3-2", 56 + "4-2", 57 + "5-2", 58 + "6-2", 59 + "7-2", 60 + "8-2", 61 + "9-2", 62 + "10-2", 63 + "11-2", 64 + "12-2", 65 + "13-2", 66 + "14-2", 67 + "15-2", 68 + "0-3", 69 + "1-3", 70 + "2-3", 71 + "3-3", 72 + "4-3", 73 + "5-3", 74 + "6-3", 75 + "7-3", 76 + "8-3", 77 + "9-3", 78 + "10-3", 79 + "11-3", 80 + "12-3", 81 + "13-3", 82 + "14-3", 83 + "15-3", 84 + "0-4", 85 + "1-4", 86 + "2-4", 87 + "3-4", 88 + "4-4", 89 + "5-4", 90 + "6-4", 91 + "7-4", 92 + "8-4", 93 + "9-4", 94 + "10-4", 95 + "11-4", 96 + "12-4", 97 + "13-4", 98 + "14-4", 99 + "15-4", 100 + "0-5", 101 + "1-5", 102 + "2-5", 103 + "3-5", 104 + "4-5", 105 + "5-5", 106 + "6-5", 107 + "7-5", 108 + "8-5", 109 + "9-5", 110 + "10-5", 111 + "11-5", 112 + "12-5", 113 + "13-5", 114 + "14-5", 115 + "15-5", 116 + "0-6", 117 + "1-6", 118 + "2-6", 119 + "3-6", 120 + "4-6", 121 + "5-6", 122 + "6-6", 123 + "7-6", 124 + "8-6", 125 + "9-6", 126 + "10-6", 127 + "11-6", 128 + "12-6", 129 + "13-6", 130 + "14-6", 131 + "15-6", 132 + "0-7", 133 + "1-7", 134 + "2-7", 135 + "3-7", 136 + "4-7", 137 + "5-7", 138 + "6-7", 139 + "7-7", 140 + "8-7", 141 + "9-7", 142 + "10-7", 143 + "11-7", 144 + "12-7", 145 + "13-7", 146 + "14-7", 147 + "15-7", 148 + "0-8", 149 + "1-8", 150 + "2-8", 151 + "3-8", 152 + "4-8", 153 + "5-8", 154 + "6-8", 155 + "7-8", 156 + "8-8", 157 + "9-8", 158 + "10-8", 159 + "11-8", 160 + "12-8", 161 + "13-8", 162 + "14-8", 163 + "15-8", 164 + "0-9", 165 + "1-9", 166 + "2-9", 167 + "3-9", 168 + "4-9", 169 + "5-9", 170 + "6-9", 171 + "7-9", 172 + "8-9", 173 + "9-9", 174 + "10-9", 175 + "11-9", 176 + "12-9", 177 + "13-9", 178 + "14-9", 179 + "15-9", 180 + "0-10", 181 + "1-10", 182 + "2-10", 183 + "3-10", 184 + "4-10", 185 + "5-10", 186 + "6-10", 187 + "7-10", 188 + "8-10", 189 + "9-10", 190 + "10-10", 191 + "11-10", 192 + "12-10", 193 + "13-10", 194 + "14-10", 195 + "15-10", 196 + "0-11", 197 + "1-11", 198 + "2-11", 199 + "3-11", 200 + "4-11", 201 + "5-11", 202 + "6-11", 203 + "7-11", 204 + "8-11", 205 + "9-11", 206 + "10-11", 207 + "11-11", 208 + "12-11", 209 + "13-11", 210 + "14-11", 211 + "15-11", 212 + "0-12", 213 + "1-12", 214 + "2-12", 215 + "3-12", 216 + "4-12", 217 + "5-12", 218 + "6-12", 219 + "7-12", 220 + "8-12", 221 + "9-12", 222 + "10-12", 223 + "11-12", 224 + "12-12", 225 + "13-12", 226 + "14-12", 227 + "15-12", 228 + "0-13", 229 + "1-13", 230 + "2-13", 231 + "3-13", 232 + "4-13", 233 + "5-13", 234 + "6-13", 235 + "7-13", 236 + "8-13", 237 + "9-13", 238 + "10-13", 239 + "11-13", 240 + "12-13", 241 + "13-13", 242 + "14-13", 243 + "15-13", 244 + "0-14", 245 + "1-14", 246 + "2-14", 247 + "3-14", 248 + "4-14", 249 + "5-14", 250 + "6-14", 251 + "7-14", 252 + "8-14", 253 + "9-14", 254 + "10-14", 255 + "11-14", 256 + "12-14", 257 + "13-14", 258 + "14-14", 259 + "15-14", 260 + "0-15", 261 + "1-15", 262 + "2-15", 263 + "3-15", 264 + "4-15", 265 + "5-15", 266 + "6-15", 267 + "7-15", 268 + "8-15", 269 + "9-15", 270 + "10-15", 271 + "11-15", 272 + "12-15", 273 + "13-15", 274 + "14-15", 275 + "15-15", 276 + ""]; 277 + timecourse=[ 278 + [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], 279 + [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], 280 + [1,1,1,1,2,2,3,6,11,13,19,22,24,29,31,37,41,49,57,68,76,83,94,102,112,119,121,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,0], 281 + [1,1,1,1,1,1,3,3,4,4,5,8,9,13,15,23,32,39,50,64,82,97,115,128,135,142,145,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,0], 282 + [1,1,1,1,1,2,4,8,11,16,25,29,40,60,79,92,110,128,139,148,159,168,168,170,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,0], 283 + [1,1,1,1,4,7,16,22,31,44,62,80,104,128,146,160,164,166,170,173,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,0], 284 + [1,1,1,1,2,2,3,9,19,28,43,58,81,102,129,139,149,157,167,169,172,173,173,173,174,174,174,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,0], 285 + [1,1,1,1,2,3,5,10,12,19,29,39,49,60,74,91,103,119,131,142,151,159,162,165,166,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,0], 286 + [1,1,1,1,3,5,7,9,17,25,38,43,53,63,76,86,103,113,126,140,153,163,169,171,172,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,0], 287 + [1,1,1,1,1,2,2,2,2,5,6,9,16,21,27,35,43,56,63,82,93,114,128,143,150,160,167,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,0], 288 + []]; 289 + ]]></script> 290 + <script type="text/ecmascript" xlink:href="svgscript.js"/><script type="text/ecmascript" xlink:href="graph.js"/><g transform="translate(0.5,0.5)"><rect x="10" y="10" width="400" height="400" stroke="black" fill="white"/><circle id="6-1" cx="160" cy="35" r="10" stroke="black" stroke-width="1" fill="white" /> 291 + <circle id="7-1" cx="185" cy="35" r="10" stroke="black" stroke-width="1" fill="white" /> 292 + <circle id="8-1" cx="210" cy="35" r="10" stroke="black" stroke-width="1" fill="white" /> 293 + <circle id="9-1" cx="235" cy="35" r="10" stroke="black" stroke-width="1" fill="white" /> 294 + <circle id="10-1" cx="260" cy="35" r="10" stroke="black" stroke-width="1" fill="white" /> 295 + <circle id="4-2" cx="110" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 296 + <circle id="5-2" cx="135" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 297 + <circle id="6-2" cx="160" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 298 + <circle id="7-2" cx="185" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 299 + <circle id="8-2" cx="210" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 300 + <circle id="9-2" cx="235" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 301 + <circle id="10-2" cx="260" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 302 + <circle id="11-2" cx="285" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 303 + <circle id="12-2" cx="310" cy="60" r="10" stroke="black" stroke-width="1" fill="white" /> 304 + <circle id="3-3" cx="85" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 305 + <circle id="4-3" cx="110" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 306 + <circle id="5-3" cx="135" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 307 + <circle id="6-3" cx="160" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 308 + <circle id="7-3" cx="185" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 309 + <circle id="8-3" cx="210" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 310 + <circle id="9-3" cx="235" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 311 + <circle id="10-3" cx="260" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 312 + <circle id="11-3" cx="285" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 313 + <circle id="12-3" cx="310" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 314 + <circle id="13-3" cx="335" cy="85" r="10" stroke="black" stroke-width="1" fill="white" /> 315 + <circle id="2-4" cx="60" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 316 + <circle id="3-4" cx="85" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 317 + <circle id="4-4" cx="110" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 318 + <circle id="5-4" cx="135" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 319 + <circle id="6-4" cx="160" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 320 + <circle id="7-4" cx="185" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 321 + <circle id="8-4" cx="210" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 322 + <circle id="9-4" cx="235" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 323 + <circle id="10-4" cx="260" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 324 + <circle id="11-4" cx="285" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 325 + <circle id="12-4" cx="310" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 326 + <circle id="13-4" cx="335" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 327 + <circle id="14-4" cx="360" cy="110" r="10" stroke="black" stroke-width="1" fill="white" /> 328 + <circle id="2-5" cx="60" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 329 + <circle id="3-5" cx="85" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 330 + <circle id="4-5" cx="110" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 331 + <circle id="5-5" cx="135" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 332 + <circle id="6-5" cx="160" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 333 + <circle id="7-5" cx="185" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 334 + <circle id="8-5" cx="210" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 335 + <circle id="9-5" cx="235" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 336 + <circle id="10-5" cx="260" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 337 + <circle id="11-5" cx="285" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 338 + <circle id="12-5" cx="310" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 339 + <circle id="13-5" cx="335" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 340 + <circle id="14-5" cx="360" cy="135" r="10" stroke="black" stroke-width="1" fill="white" /> 341 + <circle id="1-6" cx="35" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 342 + <circle id="2-6" cx="60" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 343 + <circle id="3-6" cx="85" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 344 + <circle id="4-6" cx="110" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 345 + <circle id="5-6" cx="135" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 346 + <circle id="6-6" cx="160" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 347 + <circle id="7-6" cx="185" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 348 + <circle id="8-6" cx="210" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 349 + <circle id="9-6" cx="235" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 350 + <circle id="10-6" cx="260" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 351 + <circle id="11-6" cx="285" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 352 + <circle id="12-6" cx="310" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 353 + <circle id="13-6" cx="335" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 354 + <circle id="14-6" cx="360" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 355 + <circle id="15-6" cx="385" cy="160" r="10" stroke="black" stroke-width="1" fill="white" /> 356 + <circle id="1-7" cx="35" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 357 + <circle id="2-7" cx="60" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 358 + <circle id="3-7" cx="85" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 359 + <circle id="4-7" cx="110" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 360 + <circle id="5-7" cx="135" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 361 + <circle id="6-7" cx="160" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 362 + <circle id="7-7" cx="185" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 363 + <circle id="8-7" cx="210" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 364 + <circle id="9-7" cx="235" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 365 + <circle id="10-7" cx="260" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 366 + <circle id="11-7" cx="285" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 367 + <circle id="12-7" cx="310" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 368 + <circle id="13-7" cx="335" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 369 + <circle id="14-7" cx="360" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 370 + <circle id="15-7" cx="385" cy="185" r="10" stroke="black" stroke-width="1" fill="white" /> 371 + <circle id="1-8" cx="35" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 372 + <circle id="2-8" cx="60" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 373 + <circle id="3-8" cx="85" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 374 + <circle id="4-8" cx="110" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 375 + <circle id="5-8" cx="135" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 376 + <circle id="6-8" cx="160" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 377 + <circle id="7-8" cx="185" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 378 + <circle id="8-8" cx="210" cy="210" r="10" stroke="black" stroke-width="1" fill="red" /> 379 + <circle id="9-8" cx="235" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 380 + <circle id="10-8" cx="260" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 381 + <circle id="11-8" cx="285" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 382 + <circle id="12-8" cx="310" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 383 + <circle id="13-8" cx="335" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 384 + <circle id="14-8" cx="360" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 385 + <circle id="15-8" cx="385" cy="210" r="10" stroke="black" stroke-width="1" fill="white" /> 386 + <circle id="1-9" cx="35" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 387 + <circle id="2-9" cx="60" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 388 + <circle id="3-9" cx="85" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 389 + <circle id="4-9" cx="110" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 390 + <circle id="5-9" cx="135" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 391 + <circle id="6-9" cx="160" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 392 + <circle id="7-9" cx="185" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 393 + <circle id="8-9" cx="210" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 394 + <circle id="9-9" cx="235" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 395 + <circle id="10-9" cx="260" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 396 + <circle id="11-9" cx="285" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 397 + <circle id="12-9" cx="310" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 398 + <circle id="13-9" cx="335" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 399 + <circle id="14-9" cx="360" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 400 + <circle id="15-9" cx="385" cy="235" r="10" stroke="black" stroke-width="1" fill="white" /> 401 + <circle id="1-10" cx="35" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 402 + <circle id="2-10" cx="60" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 403 + <circle id="3-10" cx="85" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 404 + <circle id="4-10" cx="110" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 405 + <circle id="5-10" cx="135" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 406 + <circle id="6-10" cx="160" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 407 + <circle id="7-10" cx="185" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 408 + <circle id="8-10" cx="210" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 409 + <circle id="9-10" cx="235" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 410 + <circle id="10-10" cx="260" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 411 + <circle id="11-10" cx="285" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 412 + <circle id="12-10" cx="310" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 413 + <circle id="13-10" cx="335" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 414 + <circle id="14-10" cx="360" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 415 + <circle id="15-10" cx="385" cy="260" r="10" stroke="black" stroke-width="1" fill="white" /> 416 + <circle id="2-11" cx="60" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 417 + <circle id="3-11" cx="85" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 418 + <circle id="4-11" cx="110" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 419 + <circle id="5-11" cx="135" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 420 + <circle id="6-11" cx="160" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 421 + <circle id="7-11" cx="185" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 422 + <circle id="8-11" cx="210" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 423 + <circle id="9-11" cx="235" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 424 + <circle id="10-11" cx="260" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 425 + <circle id="11-11" cx="285" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 426 + <circle id="12-11" cx="310" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 427 + <circle id="13-11" cx="335" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 428 + <circle id="14-11" cx="360" cy="285" r="10" stroke="black" stroke-width="1" fill="white" /> 429 + <circle id="2-12" cx="60" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 430 + <circle id="3-12" cx="85" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 431 + <circle id="4-12" cx="110" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 432 + <circle id="5-12" cx="135" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 433 + <circle id="6-12" cx="160" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 434 + <circle id="7-12" cx="185" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 435 + <circle id="8-12" cx="210" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 436 + <circle id="9-12" cx="235" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 437 + <circle id="10-12" cx="260" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 438 + <circle id="11-12" cx="285" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 439 + <circle id="12-12" cx="310" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 440 + <circle id="13-12" cx="335" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 441 + <circle id="14-12" cx="360" cy="310" r="10" stroke="black" stroke-width="1" fill="white" /> 442 + <circle id="3-13" cx="85" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 443 + <circle id="4-13" cx="110" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 444 + <circle id="5-13" cx="135" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 445 + <circle id="6-13" cx="160" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 446 + <circle id="7-13" cx="185" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 447 + <circle id="8-13" cx="210" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 448 + <circle id="9-13" cx="235" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 449 + <circle id="10-13" cx="260" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 450 + <circle id="11-13" cx="285" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 451 + <circle id="12-13" cx="310" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 452 + <circle id="13-13" cx="335" cy="335" r="10" stroke="black" stroke-width="1" fill="white" /> 453 + <circle id="4-14" cx="110" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 454 + <circle id="5-14" cx="135" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 455 + <circle id="6-14" cx="160" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 456 + <circle id="7-14" cx="185" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 457 + <circle id="8-14" cx="210" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 458 + <circle id="9-14" cx="235" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 459 + <circle id="10-14" cx="260" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 460 + <circle id="11-14" cx="285" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 461 + <circle id="12-14" cx="310" cy="360" r="10" stroke="black" stroke-width="1" fill="white" /> 462 + <circle id="6-15" cx="160" cy="385" r="10" stroke="black" stroke-width="1" fill="white" /> 463 + <circle id="7-15" cx="185" cy="385" r="10" stroke="black" stroke-width="1" fill="white" /> 464 + <circle id="8-15" cx="210" cy="385" r="10" stroke="black" stroke-width="1" fill="white" /> 465 + <circle id="9-15" cx="235" cy="385" r="10" stroke="black" stroke-width="1" fill="white" /> 466 + <circle id="10-15" cx="260" cy="385" r="10" stroke="black" stroke-width="1" fill="white" /> 467 + <rect x="10" y="420" width="100" height="30" stroke="black" fill="yellow" onmousedown="back();"/><rect x="310" y="420" width="100" height="30" stroke="black" fill="yellow" onmousedown="forward();"/><text x="60" y="440" fill="black" text-anchor="middle" font-size="10pt" onmousedown="back();">back</text><text x="360" y="440" fill="black" text-anchor="middle" font-size="10pt" onmousedown="forward();">forward</text><rect x="10" y="460" width="100" height="30" stroke="black" fill="yellow" onmousedown="prev_ep();"/><rect x="310" y="460" width="100" height="30" stroke="black" fill="yellow" onmousedown="next_rep();"/><text x="60" y="480" fill="black" text-anchor="middle" font-size="10pt" onmousedown="prev_rep();">prev rep</text><text x="360" y="480" fill="black" text-anchor="middle" font-size="10pt" onmousedown="next_rep();">next rep</text><text id="time" x="210" y="440" fill="black" text-anchor="middle" font-size="10pt">Time: 10.0</text><text id="rep" x="210" y="480" fill="black" text-anchor="middle" font-size="10pt">Rep: 10.0</text></g><g id="graph" transform="translate(430,5)"/></svg>
+35
site/blog/2026/03/weeknotes-2026-10.mld
··· 1 + {0 Weeknotes 2026 week 10} 2 + 3 + @publishes 2026-03-09 4 + @notanotebook 5 + 6 + {1 What did I do?} 7 + 8 + - New site design. The old site was a bit of a mess and was simply reusing odoc's default 9 + default styling. I've also rearranged the content a bit to make it more navigable and 10 + cohesive. 11 + {image!old.png} 12 + {image!new.png} 13 + - TESSERA in the browser is a {{:https://tee.cl.cam.ac.uk/}hot} {{:https://anil.recoil.org/notes/2026w10}topic} right now, so I've applied the work I've been doing with x-ocaml, js_top_worker 14 + and odoc plugins to make a {{!}TESSERA notebook} that's based on the {{:https://github.com/ucam-eo/tessera-interactive-map}example notebook}. 15 + - I was interested in whether we'll be able to do inference in reasonable time using these 16 + notebooks. {{:https://onnx.ai/}ONNX} has a web version of its runtime, so I got Claude to 17 + make some bindings, and checked it was working by doing a sentiment analysis notebook. This 18 + is working nicely, so the next step is to do something a bit more useful. 19 + - The docs CI was again causing problems. This time it had decided that it had never built 20 + anything, and therefore needed to rebuilt the entire world. However, despite being set up 21 + as a custom dedicated runner, all its jobs were queued waiting to start. It turned out that 22 + the runner paused itself when the docker partition reached 70%. This was a little surprising 23 + on two counts - firstly we don't actually use docker for running the jobs, we use obuilder, 24 + which doesn't share space with docker. Secondly, with that in mind, how did it get to 70%? 25 + It turned out to be the job logs - including 250 gigs of older logs from a previous instance. 26 + Simply blowing those away caused everything to restart and so it's now live again. 27 + - I met up with {{:}Andrés C. Zúñiga-González} to have a chat about how he's using interactive 28 + maps and notebooks. He pointed me at his {{:https://ancazugo.github.io/blog.html}blog}, some of which which is using {{:https://quarto.org/}quarto}, 29 + which he rates very highly. An {{:https://ancazugo.github.io/posts/2025-11-16-tessera_example.html}example of quarto output}. 30 + - Our group seminar this week was {{:https://tombearpark.com/}Tom Bearpark} who talked about 31 + his proposed 'Carbon at Risk' measure in order to compare diverse ways of removing carbon 32 + from the atomsphere to help with the carbon removal market. 33 + 34 + 35 +
+36 -33
site/blog/index.mld
··· 2 2 3 3 @children_order 2026/ 2025/ 4 4 5 - - {{!//blog/2026/03/page-"weeknotes-2026-09"}Weeknotes 2026 week 9} 6 - - {{!//blog/2026/02/page-"weeknotes-2026-08"}Weeknotes weeks 7-8} 7 - - {{!//blog/2026/02/page-"weeknotes-2026-06"}Weeknotes for week 6} 8 - - {{!//blog/2026/01/page-"weeknotes-2026-04-05"}Weeknotes for weeks 4-5} 9 - - {{!//blog/2026/01/page-"weeknotes-2026-03"}Weeknotes for week 3} 10 - - {{!//blog/2025/12/page-"claude-and-dune"}Claude and Dune} 11 - - {{!//blog/2025/12/page-"an-svg-is-all-you-need"}An SVG is all you need} 12 - - {{!//blog/2025/11/page-"foundations-of-computer-science"}Foundations of Computer Science} 13 - - {{!//blog/2025/09/page-"caching-opam-solutions2"}Caching opam solutions - part 2} 14 - - {{!//blog/2025/09/page-"odoc-bugs"}Odoc bugs} 15 - - {{!//blog/2025/09/page-"caching-opam-solutions"}Caching opam solutions} 16 - - {{!//blog/2025/09/page-"build-ids-for-day10"}Build IDs for Day10} 17 - - {{!//blog/2025/09/page-"giving-hub-cl-an-upgrade"}Giving hub.cl an upgrade} 18 - - {{!//blog/2025/08/page-"ocaml-lsp-mcp"}Using ocaml-lsp-server via an MCP server} 19 - - {{!//blog/2025/08/page-"ocaml-mcp-server"}An OCaml MCP server} 20 - - {{!//blog/2025/08/page-week33}Week 33} 21 - - {{!//blog/2025/07/page-retrospective}4 months in, a retrospective} 22 - - {{!//blog/2025/07/page-"odoc-3-live-on-ocaml-org"}Odoc 3 is live on OCaml.org!} 23 - - {{!//blog/2025/07/page-week28}Week 28} 24 - - {{!//blog/2025/07/page-week27}Weeks 24-27} 25 - - {{!//blog/2025/06/page-week23}Week 23} 26 - - {{!//blog/2025/05/page-"docs-progress"}Progress in OCaml docs} 27 - - {{!//blog/2025/05/page-"lots-of-things"}Lots of things have been happening} 28 - - {{!//blog/2025/05/page-"ticks-solved-by-ai"}Solving First-year OCaml exercises with AI} 29 - - {{!//blog/2025/05/page-"oxcaml-gets-closer"}OxCaml is getting closer...} 30 - - {{!//blog/2025/05/page-"ai-for-climate-and-nature-day"}AI for Climate & Nature Community Day} 31 - - {{!//blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}OCaml-Docs-CI and Odoc 3} 32 - - {{!//blog/2025/04/page-"odoc-3"}Odoc 3: So what?} 33 - - {{!//blog/2025/04/page-"semantic-versioning-is-hard"}Semantic Versioning in OCaml is Hard} 34 - - {{!//blog/2025/04/page-"meeting-the-team"}Meeting the Team} 35 - - {{!//blog/2025/04/page-"this-site"}This site} 36 - - {{!//blog/2025/03/page-"module-type-of"}The Road to Odoc 3: Module Type Of} 37 - - {{!//blog/2025/03/page-"code-block-metadata"}Code block metadata} 5 + @recent-posts 6 + {ul 7 + {- {{!//blog/2026/03/page-"weeknotes-2026-09"}Weeknotes 2026 week 9} 2026-03-02} 8 + {- {{!//blog/2026/02/page-"weeknotes-2026-08"}Weeknotes weeks 7-8} 2026-02-23} 9 + {- {{!//blog/2026/02/page-"weeknotes-2026-06"}Weeknotes for week 6} 2026-02-09} 10 + {- {{!//blog/2026/01/page-"weeknotes-2026-04-05"}Weeknotes for weeks 4-5} 2026-01-31} 11 + {- {{!//blog/2026/01/page-"weeknotes-2026-03"}Weeknotes for week 3} 2026-01-18} 12 + {- {{!//blog/2025/12/page-"claude-and-dune"}Claude and Dune} 2025-12-18} 13 + {- {{!//blog/2025/12/page-"an-svg-is-all-you-need"}An SVG is all you need} 2025-12-15} 14 + {- {{!//blog/2025/11/page-"foundations-of-computer-science"}Foundations of Computer Science} 2025-11-15} 15 + {- {{!//blog/2025/09/page-"caching-opam-solutions2"}Caching opam solutions - part 2} 2025-09-20} 16 + {- {{!//blog/2025/09/page-"odoc-bugs"}Odoc bugs} 2025-09-15} 17 + {- {{!//blog/2025/09/page-"caching-opam-solutions"}Caching opam solutions} 2025-09-10} 18 + {- {{!//blog/2025/09/page-"build-ids-for-day10"}Build IDs for Day10} 2025-09-05} 19 + {- {{!//blog/2025/09/page-"giving-hub-cl-an-upgrade"}Giving hub.cl an upgrade} 2025-09-01} 20 + {- {{!//blog/2025/08/page-"ocaml-lsp-mcp"}Using ocaml-lsp-server via an MCP server} 2025-08-25} 21 + {- {{!//blog/2025/08/page-"ocaml-mcp-server"}An OCaml MCP server} 2025-08-20} 22 + {- {{!//blog/2025/08/page-week33}Week 33} 2025-08-11} 23 + {- {{!//blog/2025/07/page-retrospective}4 months in, a retrospective} 2025-07-28} 24 + {- {{!//blog/2025/07/page-"odoc-3-live-on-ocaml-org"}Odoc 3 is live on OCaml.org!} 2025-07-21} 25 + {- {{!//blog/2025/07/page-week28}Week 28} 2025-07-14} 26 + {- {{!//blog/2025/07/page-week27}Weeks 24-27} 2025-07-07} 27 + {- {{!//blog/2025/06/page-week23}Week 23} 2025-06-09} 28 + {- {{!//blog/2025/05/page-"docs-progress"}Progress in OCaml docs} 2025-05-28} 29 + {- {{!//blog/2025/05/page-"lots-of-things"}Lots of things have been happening} 2025-05-22} 30 + {- {{!//blog/2025/05/page-"ticks-solved-by-ai"}Solving First-year OCaml exercises with AI} 2025-05-15} 31 + {- {{!//blog/2025/05/page-"oxcaml-gets-closer"}OxCaml is getting closer...} 2025-05-10} 32 + {- {{!//blog/2025/05/page-"ai-for-climate-and-nature-day"}AI for Climate & Nature Community Day} 2025-05-05} 33 + {- {{!//blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}OCaml-Docs-CI and Odoc 3} 2025-04-28} 34 + {- {{!//blog/2025/04/page-"odoc-3"}Odoc 3: So what?} 2025-04-21} 35 + {- {{!//blog/2025/04/page-"semantic-versioning-is-hard"}Semantic Versioning in OCaml is Hard} 2025-04-14} 36 + {- {{!//blog/2025/04/page-"meeting-the-team"}Meeting the Team} 2025-04-07} 37 + {- {{!//blog/2025/04/page-"this-site"}This site} 2025-04-01} 38 + {- {{!//blog/2025/03/page-"module-type-of"}The Road to Odoc 3: Module Type Of} 2025-03-24} 39 + {- {{!//blog/2025/03/page-"code-block-metadata"}Code block metadata} 2025-03-17} 40 + }
+7
site/dune
··· 3 3 (rule 4 4 (deps 5 5 (glob_files_rec *.mld) 6 + (glob_files_rec *.svg) 7 + (glob_files_rec *.png) 8 + (glob_files_rec *.jpg) 9 + (glob_files_rec *.jpeg) 10 + (glob_files_rec *.gif) 11 + (glob_files_rec *.webp) 12 + (glob_files_rec *.mov) 6 13 (glob_files_rec static/*)) 7 14 (action 8 15 (with-stdout-to
+25 -23
site/index.mld
··· 1 - {0 jon.recoil.org} 1 + {0 Hi, I'm Jon} 2 2 3 - Built using {{:https://github.com/ocaml/odoc}odoc}, the OCaml documentation generator. Because when you have a hammer... 3 + {%html: <div class="hero-intro"><div class="hero-text">%} 4 4 5 - {1 Recent entries} 5 + Fellow of {{:https://www.chu.cam.ac.uk/}Churchill College}, 6 + Assistant Research Professor at Cambridge's 7 + {{:https://www.cl.cam.ac.uk/}Department of Computer Science}, 8 + and Professional Old Dude at {{:https://tarides.com/}Tarides}. 9 + I work on {{:https://github.com/ocaml/odoc}odoc}, OCaml documentation tooling, 10 + and interactive computing in the browser. 6 11 12 + {%html: </div><img src="/static/assets/jon.jpg" class="hero-photo" alt="Jon Ludlam"></div>%} 13 + 14 + @recent-posts 7 15 {ul 8 - {- {{!blog/2026/02/page-"weeknotes-2026-06"}Weeknotes for week 6}} 9 - {- {{!blog/2026/01/page-"weeknotes-2026-04-05"}Weeknotes for weeks 4-5}} 10 - {- {{!blog/2026/01/page-"weeknotes-2026-03"}Weeknotes for week 3}} 11 - {- {{!blog/2025/12/page-"claude-and-dune"}Claude and Dune}} 12 - {- {{!blog/2025/12/page-"an-svg-is-all-you-need"}An SVG is all you need}} 13 - {- {{!blog/2025/11/page-"foundations-of-computer-science"}Foundations of Computer Science}} 14 - {- {{!blog/2025/09/page-"caching-opam-solutions2"}Caching opam solutions - part 2}} 15 - {- {{!blog/2025/09/page-"odoc-bugs"}Odoc bugs}} 16 - {- {{!blog/2025/09/page-"caching-opam-solutions"}Caching opam solutions}} 17 - {- {{!blog/2025/09/page-"build-ids-for-day10"}Build IDs for Day10}} 16 + {- {{!blog/2026/03/page-"weeknotes-2026-09"}Weeknotes 2026 week 9} 2026-03-02} 17 + {- {{!blog/2026/02/page-"weeknotes-2026-08"}Weeknotes weeks 7-8} 2026-02-23} 18 + {- {{!blog/2026/02/page-"weeknotes-2026-06"}Weeknotes for week 6} 2026-02-09} 19 + {- {{!blog/2026/01/page-"weeknotes-2026-04-05"}Weeknotes for weeks 4-5} 2026-01-31} 20 + {- {{!blog/2026/01/page-"weeknotes-2026-03"}Weeknotes for week 3} 2026-01-18} 21 + {- {{!blog/2025/12/page-"claude-and-dune"}Claude and Dune} 2025-12-18} 22 + {- {{!blog/2025/12/page-"an-svg-is-all-you-need"}An SVG is all you need} 2025-12-15} 23 + {- {{!blog/2025/11/page-"foundations-of-computer-science"}Foundations of Computer Science} 2025-11-15} 24 + {- {{!blog/2025/09/page-"caching-opam-solutions2"}Caching opam solutions - part 2} 2025-09-20} 25 + {- {{!blog/2025/09/page-"odoc-bugs"}Odoc bugs} 2025-09-15} 26 + {- {{!blog/2025/09/page-"caching-opam-solutions"}Caching opam solutions} 2025-09-10} 27 + {- {{!blog/2025/09/page-"build-ids-for-day10"}Build IDs for Day10} 2025-09-05} 18 28 } 19 29 20 - {1 About me} 21 - 22 - {%html: <img src="/static/assets/jon.jpg" style="border-radius: 50%; margin-bottom: 1rem; display: block; max-width: 150px;" >%} 23 - 24 - Fellow of {{:https://www.chu.cam.ac.uk/}Churchill College}, SRA at {{:https://www.cl.cam.ac.uk/}Department of Computer Science and Technology}, 25 - member of {{:https://www.cst.cam.ac.uk/research/eeg}Energy and Environment Group}, Bookfighter at the {{:https://nevermoor.fandom.com/wiki/Gobleian_Library}Gobleian Library}, 26 - Professional Old Dude at {{:https://tarides.com/}Tarides}. 27 - 28 - Something something something... OCaml wins! 30 + {1 About this site} 31 + Built using {{:https://github.com/ocaml/odoc}odoc}, the OCaml documentation generator. Because when you have a hammer... 29 32 30 - {1 About this site} 31 33 See {{!blog/2025/04/page-"this-site"}this-site} for more information about this site.
+511
site/mockup.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>jon.recoil.org — mockup</title> 7 + <link rel="preconnect" href="https://fonts.googleapis.com"> 8 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 9 + <link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;0,6..72,600;1,6..72,400;1,6..72,500&family=DM+Sans:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet"> 10 + <style> 11 + *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } 12 + 13 + :root { 14 + --text: #1a1a2e; 15 + --text-secondary: #555e6e; 16 + --text-tertiary: #8891a0; 17 + --bg: #faf9f7; 18 + --surface: #fff; 19 + --border: #e5e2dc; 20 + --accent: #b44e2d; 21 + --accent-hover: #943e22; 22 + --link: #2a6496; 23 + --link-hover: #1d4a6e; 24 + --tag-bg: #f0ede8; 25 + --tag-text: #6b6358; 26 + --max-w: 680px; 27 + --wide-w: 960px; 28 + } 29 + 30 + @media (prefers-color-scheme: dark) { 31 + :root { 32 + --text: #e2dfd8; 33 + --text-secondary: #a8a299; 34 + --text-tertiary: #76716a; 35 + --bg: #1a1917; 36 + --surface: #242320; 37 + --border: #3a3834; 38 + --accent: #d4734f; 39 + --accent-hover: #e0896a; 40 + --link: #6aaddb; 41 + --link-hover: #8dc2e6; 42 + --tag-bg: #2e2c28; 43 + --tag-text: #a8a299; 44 + } 45 + } 46 + 47 + html { 48 + font-size: 17px; 49 + -webkit-font-smoothing: antialiased; 50 + } 51 + 52 + body { 53 + font-family: 'DM Sans', -apple-system, sans-serif; 54 + background: var(--bg); 55 + color: var(--text); 56 + line-height: 1.6; 57 + } 58 + 59 + a { color: var(--link); text-decoration: none; } 60 + a:hover { color: var(--link-hover); } 61 + 62 + /* ── Nav (kept close to existing) ── */ 63 + .nav { 64 + border-bottom: 1px solid var(--border); 65 + } 66 + .nav-inner { 67 + max-width: var(--wide-w); 68 + margin: 0 auto; 69 + padding: 16px 24px; 70 + display: flex; 71 + align-items: center; 72 + justify-content: space-between; 73 + font-size: 14px; 74 + } 75 + .nav-brand { 76 + font-weight: 600; 77 + color: var(--text); 78 + text-decoration: none; 79 + } 80 + .nav-brand:hover { color: var(--accent); } 81 + .nav-links { display: flex; gap: 20px; } 82 + .nav-links a { color: var(--text-secondary); } 83 + .nav-links a:hover { color: var(--link); } 84 + 85 + /* ── Hero ── */ 86 + .hero { 87 + max-width: var(--wide-w); 88 + margin: 0 auto; 89 + padding: 56px 24px 48px; 90 + display: grid; 91 + grid-template-columns: 1fr auto; 92 + gap: 40px; 93 + align-items: start; 94 + } 95 + 96 + .hero-text h1 { 97 + font-family: 'Newsreader', Georgia, serif; 98 + font-size: 2.4rem; 99 + font-weight: 500; 100 + line-height: 1.2; 101 + letter-spacing: -0.02em; 102 + margin-bottom: 16px; 103 + color: var(--text); 104 + } 105 + 106 + .hero-text h1 em { 107 + font-style: italic; 108 + color: var(--accent); 109 + } 110 + 111 + .hero-bio { 112 + font-size: 1.05rem; 113 + color: var(--text-secondary); 114 + line-height: 1.65; 115 + max-width: 540px; 116 + } 117 + 118 + .hero-bio a { 119 + color: var(--text); 120 + text-decoration: underline; 121 + text-decoration-color: var(--border); 122 + text-underline-offset: 3px; 123 + text-decoration-thickness: 1.5px; 124 + } 125 + .hero-bio a:hover { 126 + text-decoration-color: var(--accent); 127 + color: var(--accent); 128 + } 129 + 130 + .hero-photo { 131 + width: 120px; 132 + height: 120px; 133 + border-radius: 50%; 134 + object-fit: cover; 135 + border: 3px solid var(--bg); 136 + box-shadow: 0 0 0 1px var(--border); 137 + margin-top: 8px; 138 + } 139 + 140 + /* ── Section divider ── */ 141 + .divider { 142 + max-width: var(--wide-w); 143 + margin: 0 auto; 144 + padding: 0 24px; 145 + } 146 + .divider hr { 147 + border: none; 148 + border-top: 1px solid var(--border); 149 + } 150 + 151 + /* ── Posts section ── */ 152 + .posts-section { 153 + max-width: var(--wide-w); 154 + margin: 0 auto; 155 + padding: 40px 24px 48px; 156 + } 157 + 158 + .section-header { 159 + display: flex; 160 + align-items: baseline; 161 + justify-content: space-between; 162 + margin-bottom: 28px; 163 + } 164 + 165 + .section-title { 166 + font-family: 'Newsreader', Georgia, serif; 167 + font-size: 1.35rem; 168 + font-weight: 500; 169 + color: var(--text); 170 + letter-spacing: -0.01em; 171 + } 172 + 173 + .section-link { 174 + font-size: 0.85rem; 175 + color: var(--text-tertiary); 176 + } 177 + .section-link:hover { color: var(--accent); } 178 + 179 + /* ── Featured post ── */ 180 + .featured { 181 + background: var(--surface); 182 + border: 1px solid var(--border); 183 + border-radius: 10px; 184 + padding: 28px 32px; 185 + margin-bottom: 24px; 186 + transition: box-shadow 0.2s ease; 187 + } 188 + .featured:hover { 189 + box-shadow: 0 2px 12px rgba(0,0,0,0.06); 190 + } 191 + 192 + .featured-label { 193 + font-size: 0.72rem; 194 + font-weight: 600; 195 + letter-spacing: 0.08em; 196 + text-transform: uppercase; 197 + color: var(--accent); 198 + margin-bottom: 10px; 199 + } 200 + 201 + .featured h3 { 202 + font-family: 'Newsreader', Georgia, serif; 203 + font-size: 1.5rem; 204 + font-weight: 500; 205 + line-height: 1.3; 206 + margin-bottom: 8px; 207 + } 208 + .featured h3 a { 209 + color: var(--text); 210 + } 211 + .featured h3 a:hover { 212 + color: var(--accent); 213 + } 214 + 215 + .featured-excerpt { 216 + color: var(--text-secondary); 217 + font-size: 0.95rem; 218 + line-height: 1.6; 219 + margin-bottom: 12px; 220 + } 221 + 222 + .featured-meta { 223 + font-size: 0.8rem; 224 + color: var(--text-tertiary); 225 + display: flex; 226 + align-items: center; 227 + gap: 12px; 228 + } 229 + 230 + .tag { 231 + display: inline-block; 232 + background: var(--tag-bg); 233 + color: var(--tag-text); 234 + font-size: 0.72rem; 235 + font-weight: 500; 236 + padding: 3px 9px; 237 + border-radius: 4px; 238 + letter-spacing: 0.02em; 239 + } 240 + 241 + /* ── Post list ── */ 242 + .post-list { 243 + display: flex; 244 + flex-direction: column; 245 + gap: 1px; 246 + background: var(--border); 247 + border-radius: 10px; 248 + overflow: hidden; 249 + border: 1px solid var(--border); 250 + } 251 + 252 + .post-item { 253 + display: grid; 254 + grid-template-columns: 1fr auto; 255 + gap: 16px; 256 + align-items: baseline; 257 + padding: 16px 24px; 258 + background: var(--surface); 259 + transition: background 0.15s ease; 260 + } 261 + .post-item:hover { 262 + background: var(--tag-bg); 263 + } 264 + 265 + .post-title { 266 + font-family: 'Newsreader', Georgia, serif; 267 + font-size: 1.05rem; 268 + font-weight: 400; 269 + line-height: 1.4; 270 + } 271 + .post-title a { 272 + color: var(--text); 273 + } 274 + .post-title a:hover { 275 + color: var(--accent); 276 + } 277 + 278 + .post-date { 279 + font-size: 0.78rem; 280 + color: var(--text-tertiary); 281 + white-space: nowrap; 282 + font-variant-numeric: tabular-nums; 283 + } 284 + 285 + /* ── Highlights / cards ── */ 286 + .highlights { 287 + max-width: var(--wide-w); 288 + margin: 0 auto; 289 + padding: 0 24px 48px; 290 + display: grid; 291 + grid-template-columns: repeat(3, 1fr); 292 + gap: 16px; 293 + } 294 + 295 + .highlight-card { 296 + background: var(--surface); 297 + border: 1px solid var(--border); 298 + border-radius: 10px; 299 + padding: 24px; 300 + transition: box-shadow 0.2s ease, transform 0.2s ease; 301 + } 302 + .highlight-card:hover { 303 + box-shadow: 0 2px 12px rgba(0,0,0,0.06); 304 + transform: translateY(-1px); 305 + } 306 + 307 + .highlight-icon { 308 + font-size: 1.6rem; 309 + margin-bottom: 12px; 310 + display: block; 311 + line-height: 1; 312 + } 313 + 314 + .highlight-card h3 { 315 + font-family: 'Newsreader', Georgia, serif; 316 + font-size: 1.05rem; 317 + font-weight: 500; 318 + margin-bottom: 6px; 319 + } 320 + .highlight-card h3 a { color: var(--text); } 321 + .highlight-card h3 a:hover { color: var(--accent); } 322 + 323 + .highlight-card p { 324 + font-size: 0.85rem; 325 + color: var(--text-secondary); 326 + line-height: 1.55; 327 + } 328 + 329 + /* ── Footer ── */ 330 + .footer { 331 + max-width: var(--wide-w); 332 + margin: 0 auto; 333 + padding: 24px 24px 40px; 334 + border-top: 1px solid var(--border); 335 + font-size: 0.8rem; 336 + color: var(--text-tertiary); 337 + display: flex; 338 + justify-content: space-between; 339 + align-items: center; 340 + } 341 + 342 + .footer a { color: var(--text-tertiary); } 343 + .footer a:hover { color: var(--accent); } 344 + 345 + /* ── Animations ── */ 346 + @keyframes fadeUp { 347 + from { opacity: 0; transform: translateY(12px); } 348 + to { opacity: 1; transform: translateY(0); } 349 + } 350 + 351 + .hero, .featured, .post-list, .highlights, .section-header { 352 + animation: fadeUp 0.5s ease both; 353 + } 354 + .featured { animation-delay: 0.05s; } 355 + .post-list { animation-delay: 0.1s; } 356 + .highlights .highlight-card:nth-child(1) { animation: fadeUp 0.5s ease 0.15s both; } 357 + .highlights .highlight-card:nth-child(2) { animation: fadeUp 0.5s ease 0.2s both; } 358 + .highlights .highlight-card:nth-child(3) { animation: fadeUp 0.5s ease 0.25s both; } 359 + 360 + /* ── Responsive ── */ 361 + @media (max-width: 700px) { 362 + .hero { 363 + grid-template-columns: 1fr; 364 + padding: 36px 20px 32px; 365 + gap: 20px; 366 + } 367 + .hero-photo { 368 + width: 80px; 369 + height: 80px; 370 + order: -1; 371 + } 372 + .hero-text h1 { font-size: 1.8rem; } 373 + .highlights { 374 + grid-template-columns: 1fr; 375 + } 376 + .post-item { 377 + grid-template-columns: 1fr; 378 + gap: 4px; 379 + } 380 + .featured { padding: 20px; } 381 + } 382 + </style> 383 + </head> 384 + <body> 385 + 386 + <!-- Nav (matching existing site structure) --> 387 + <nav class="nav"> 388 + <div class="nav-inner"> 389 + <a href="/" class="nav-brand">jon.recoil.org</a> 390 + <div class="nav-links"> 391 + <a href="/blog/">blog</a> 392 + <a href="/notebooks/">notebooks</a> 393 + <a href="/projects/">projects</a> 394 + <a href="/reference/">reference</a> 395 + </div> 396 + </div> 397 + </nav> 398 + 399 + <!-- Hero --> 400 + <section class="hero"> 401 + <div class="hero-text"> 402 + <h1>Jon Ludlam</h1> 403 + <p class="hero-bio"> 404 + Fellow of <a href="https://www.chu.cam.ac.uk/">Churchill College</a>, 405 + Senior Research Associate at Cambridge's 406 + <a href="https://www.cl.cam.ac.uk/">Department of Computer Science</a>, 407 + and Professional Old Dude at <a href="https://tarides.com/">Tarides</a>. 408 + I work on <a href="https://github.com/ocaml/odoc">odoc</a>, OCaml documentation tooling, 409 + and interactive computing in the browser. 410 + </p> 411 + </div> 412 + <img src="/static/assets/jon.jpg" alt="Jon Ludlam" class="hero-photo"> 413 + </section> 414 + 415 + <div class="divider"><hr></div> 416 + 417 + <!-- Recent writing --> 418 + <section class="posts-section"> 419 + <div class="section-header"> 420 + <h2 class="section-title">Recent writing</h2> 421 + <a href="/blog/" class="section-link">All posts &rarr;</a> 422 + </div> 423 + 424 + <a href="/blog/2025/12/an-svg-is-all-you-need.html" style="text-decoration:none; display:block;"> 425 + <div class="featured"> 426 + <div class="featured-label">Featured</div> 427 + <h3><a href="/blog/2025/12/an-svg-is-all-you-need.html">An SVG is all you need</a></h3> 428 + <p class="featured-excerpt"> 429 + SVGs are way more capable than many people realise. A completely self-contained SVG file can 430 + fetch data, generate visualisations, and render interactive controls &mdash; all client-side, 431 + no server required. Including one I made 20 years ago that still works. 432 + </p> 433 + <div class="featured-meta"> 434 + <span>December 2025</span> 435 + <span class="tag">research</span> 436 + <span class="tag">visualisation</span> 437 + </div> 438 + </div> 439 + </a> 440 + 441 + <div class="post-list"> 442 + <div class="post-item"> 443 + <div class="post-title"><a href="/blog/2026/03/weeknotes-2026-09.html">Weeknotes 2026 week 9</a></div> 444 + <span class="post-date">Mar 2026</span> 445 + </div> 446 + <div class="post-item"> 447 + <div class="post-title"><a href="/blog/2026/02/weeknotes-2026-08.html">Weeknotes weeks 7&ndash;8</a></div> 448 + <span class="post-date">Feb 2026</span> 449 + </div> 450 + <div class="post-item"> 451 + <div class="post-title"><a href="/blog/2025/12/claude-and-dune.html">Claude and Dune</a></div> 452 + <span class="post-date">Dec 2025</span> 453 + </div> 454 + <div class="post-item"> 455 + <div class="post-title"><a href="/blog/2025/11/foundations-of-computer-science.html">Foundations of Computer Science</a></div> 456 + <span class="post-date">Nov 2025</span> 457 + </div> 458 + <div class="post-item"> 459 + <div class="post-title"><a href="/blog/2025/09/caching-opam-solutions2.html">Caching opam solutions, part 2</a></div> 460 + <span class="post-date">Sep 2025</span> 461 + </div> 462 + <div class="post-item"> 463 + <div class="post-title"><a href="/blog/2025/08/ocaml-lsp-mcp.html">Using ocaml-lsp-server via an MCP server</a></div> 464 + <span class="post-date">Aug 2025</span> 465 + </div> 466 + <div class="post-item"> 467 + <div class="post-title"><a href="/blog/2025/07/odoc-3-live-on-ocaml-org.html">Odoc 3 is live on OCaml.org!</a></div> 468 + <span class="post-date">Jul 2025</span> 469 + </div> 470 + <div class="post-item"> 471 + <div class="post-title"><a href="/blog/2025/04/odoc-3.html">Odoc 3: So what?</a></div> 472 + <span class="post-date">Apr 2025</span> 473 + </div> 474 + </div> 475 + </section> 476 + 477 + <div class="divider"><hr></div> 478 + 479 + <!-- Highlights --> 480 + <section class="posts-section" style="padding-bottom: 24px;"> 481 + <div class="section-header"> 482 + <h2 class="section-title">Explore</h2> 483 + </div> 484 + </section> 485 + 486 + <div class="highlights"> 487 + <div class="highlight-card"> 488 + <span class="highlight-icon">&lambda;</span> 489 + <h3><a href="/notebooks/">Interactive notebooks</a></h3> 490 + <p>OCaml code running live in the browser. Foundations of Computer Science supervision material, ONNX Runtime inference, and more.</p> 491 + </div> 492 + <div class="highlight-card"> 493 + <span class="highlight-icon">&para;</span> 494 + <h3><a href="/reference/">Reference docs</a></h3> 495 + <p>Package documentation built with odoc&nbsp;3. Browse type signatures, module hierarchies, and search across everything.</p> 496 + </div> 497 + <div class="highlight-card"> 498 + <span class="highlight-icon">&sect;</span> 499 + <h3><a href="/blog/2025/04/this-site.html">About this site</a></h3> 500 + <p>Built entirely with odoc &mdash; the OCaml documentation generator. Because when you have a hammer, everything looks like a&nbsp;nail.</p> 501 + </div> 502 + </div> 503 + 504 + <!-- Footer --> 505 + <footer class="footer"> 506 + <span>jon ludlam</span> 507 + <span>Built with <a href="https://github.com/ocaml/odoc">odoc</a></span> 508 + </footer> 509 + 510 + </body> 511 + </html>