[DOCS] Add token graph concept docs (#53339)

Adds conceptual docs for token graphs.
These docs cover:

* How a token graph is constructed from a token stream
* How synonyms and multi-position tokens impact token graphs
* How token graphs are used during search
* Why some token filters produce invalid token graphs

Also makes the following supporting changes:
* Adds anchors to the 'Anatomy of an Analyzer' docs for cross-linking
* Adds several SVGs for token graph diagrams
This commit is contained in:
James Rodewig 2020-03-19 07:42:26 -04:00
parent 4b0ae15a9d
commit 8f4a3eb07f
10 changed files with 420 additions and 5 deletions

View File

@ -10,6 +10,7 @@ blocks into analyzers suitable for different languages and types of text.
Elasticsearch also exposes the individual building blocks so that they can be Elasticsearch also exposes the individual building blocks so that they can be
combined to define new <<analysis-custom-analyzer,`custom`>> analyzers. combined to define new <<analysis-custom-analyzer,`custom`>> analyzers.
[[analyzer-anatomy-character-filters]]
==== Character filters ==== Character filters
A _character filter_ receives the original text as a stream of characters and A _character filter_ receives the original text as a stream of characters and
@ -21,6 +22,7 @@ elements like `<b>` from the stream.
An analyzer may have *zero or more* <<analysis-charfilters,character filters>>, An analyzer may have *zero or more* <<analysis-charfilters,character filters>>,
which are applied in order. which are applied in order.
[[analyzer-anatomy-tokenizer]]
==== Tokenizer ==== Tokenizer
A _tokenizer_ receives a stream of characters, breaks it up into individual A _tokenizer_ receives a stream of characters, breaks it up into individual
@ -35,6 +37,7 @@ the term represents.
An analyzer must have *exactly one* <<analysis-tokenizers,tokenizer>>. An analyzer must have *exactly one* <<analysis-tokenizers,tokenizer>>.
[[analyzer-anatomy-token-filters]]
==== Token filters ==== Token filters
A _token filter_ receives the token stream and may add, remove, or change A _token filter_ receives the token stream and may add, remove, or change

View File

@ -8,6 +8,8 @@ This section explains the fundamental concepts of text analysis in {es}.
* <<analyzer-anatomy>> * <<analyzer-anatomy>>
* <<analysis-index-search-time>> * <<analysis-index-search-time>>
* <<token-graphs>>
include::anatomy.asciidoc[] include::anatomy.asciidoc[]
include::index-search-time.asciidoc[] include::index-search-time.asciidoc[]
include::token-graphs.asciidoc[]

View File

@ -0,0 +1,104 @@
[[token-graphs]]
=== Token graphs
When a <<analyzer-anatomy-tokenizer,tokenizer>> converts a text into a stream of
tokens, it also records the following:
* The `position` of each token in the stream
* The `positionLength`, the number of positions that a token spans
Using these, you can create a
https://en.wikipedia.org/wiki/Directed_acyclic_graph[directed acyclic graph],
called a _token graph_, for a stream. In a token graph, each position represents
a node. Each token represents an edge or arc, pointing to the next position.
image::images/analysis/token-graph-qbf-ex.svg[align="center"]
[[token-graphs-synonyms]]
==== Synonyms
Some <<analyzer-anatomy-token-filters,token filters>> can add new tokens, like
synonyms, to an existing token stream. These synonyms often span the same
positions as existing tokens.
In the following graph, `quick` and its synonym `fast` both have a position of
`0`. They span the same positions.
image::images/analysis/token-graph-qbf-synonym-ex.svg[align="center"]
[[token-graphs-multi-position-tokens]]
==== Multi-position tokens
Some token filters can add tokens that span multiple positions. These can
include tokens for multi-word synonyms, such as using "atm" as a synonym for
"automatic teller machine."
However, only some token filters, known as _graph token filters_, accurately
record the `positionLength` for multi-position tokens. This filters include:
* <<analysis-synonym-graph-tokenfilter,`synonym_graph`>>
* <<analysis-word-delimiter-graph-tokenfilter,`word_delimiter_graph`>>
In the following graph, `domain name system` and its synonym, `dns`, both have a
position of `0`. However, `dns` has a `positionLength` of `3`. Other tokens in
the graph have a default `positionLength` of `1`.
image::images/analysis/token-graph-dns-synonym-ex.svg[align="center"]
[[token-graphs-token-graphs-search]]
===== Using token graphs for search
<<analysis-index-search-time,Indexing>> ignores the `positionLength` attribute
and does not support token graphs containing multi-position tokens.
However, queries, such as the <<query-dsl-match-query,`match`>> or
<<query-dsl-match-query-phrase,`match_phrase`>> query, can use these graphs to
generate multiple sub-queries from a single query string.
.*Example*
[%collapsible]
====
A user runs a search for the following phrase using the `match_phrase` query:
`domain name system is fragile`
During <<analysis-index-search-time,search analysis>>, `dns`, a synonym for
`domain name system`, is added to the query string's token stream. The `dns`
token has a `positionLength` of `3`.
image::images/analysis/token-graph-dns-synonym-ex.svg[align="center"]
The `match_phrase` query uses this graph to generate sub-queries for the
following phrases:
[source,text]
------
dns is fragile
domain name system is fragile
------
This means the query matches documents containing either `dns is fragile` _or_
`domain name system is fragile`.
====
[[token-graphs-invalid-token-graphs]]
===== Invalid token graphs
The following token filters can add tokens that span multiple positions but
only record a default `positionLength` of `1`:
* <<analysis-synonym-tokenfilter,`synonym`>>
* <<analysis-word-delimiter-tokenfilter,`word_delimiter`>>
This means these filters will produce invalid token graphs for streams
containing such tokens.
In the following graph, `dns` is a multi-position synonym for `domain name
system`. However, `dns` has the default `positionLength` value of `1`, resulting
in an invalid graph.
image::images/analysis/token-graph-dns-invalid-ex.svg[align="center"]
Avoid using invalid token graphs for search. Invalid graphs can cause unexpected
search results.

View File

@ -8,8 +8,8 @@ The `synonym_graph` token filter allows to easily handle synonyms,
including multi-word synonyms correctly during the analysis process. including multi-word synonyms correctly during the analysis process.
In order to properly handle multi-word synonyms this token filter In order to properly handle multi-word synonyms this token filter
creates a "graph token stream" during processing. For more information creates a <<token-graphs,graph token stream>> during processing. For more
on this topic and its various complexities, please read the information on this topic and its various complexities, please read the
http://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html[Lucene's TokenStreams are actually graphs] blog post. http://blog.mikemccandless.com/2012/04/lucenes-tokenstreams-are-actually.html[Lucene's TokenStreams are actually graphs] blog post.
["NOTE",id="synonym-graph-index-note"] ["NOTE",id="synonym-graph-index-note"]

View File

@ -440,8 +440,8 @@ that span multiple positions when any of the following parameters are `true`:
However, only the `word_delimiter_graph` filter assigns multi-position tokens a However, only the `word_delimiter_graph` filter assigns multi-position tokens a
`positionLength` attribute, which indicates the number of positions a token `positionLength` attribute, which indicates the number of positions a token
spans. This ensures the `word_delimiter_graph` filter always produces valid token spans. This ensures the `word_delimiter_graph` filter always produces valid
https://en.wikipedia.org/wiki/Directed_acyclic_graph[graphs]. <<token-graphs,token graphs>>.
The `word_delimiter` filter does not assign multi-position tokens a The `word_delimiter` filter does not assign multi-position tokens a
`positionLength` attribute. This means it produces invalid graphs for streams `positionLength` attribute. This means it produces invalid graphs for streams

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 48 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 53 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="602px" height="54px" viewBox="0 0 602 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
<title>Slice 1</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Analysis" transform="translate(1.000000, 1.000000)">
<g id="Group">
<path d="M0.209972,1.39317 L0.209972,1.39317 C0.209972,0.6962172 0.774963,0.13123 1.471912,0.13123 L46.318115,0.13123 C46.6528013,0.13123 46.9737775,0.26418746 47.2104414,0.50084365 C47.4470975,0.73749984 47.580055,1.05848375 47.580055,1.39317 L47.580055,48.948025 C47.580055,49.6449855 47.0150602,50.2099726 46.318115,50.2099726 L1.471912,50.2099726 C0.774963,50.2099726 0.209972,49.6449854 0.209972,48.948025 L0.209972,1.39317 Z" id="Path" fill-opacity="0" fill="#000000"></path>
<path d="M0.209972,1.39317 L0.209972,1.39317 C0.209972,0.6962172 0.774963,0.13123 1.471912,0.13123 L46.318115,0.13123 C46.6528013,0.13123 46.9737775,0.26418746 47.2104414,0.50084365 C47.4470975,0.73749984 47.580055,1.05848375 47.580055,1.39317 L47.580055,48.948025 C47.580055,49.6449855 47.0150602,50.2099726 46.318115,50.2099726 L1.471912,50.2099726 C0.774963,50.2099726 0.209972,49.6449854 0.209972,48.948025 L0.209972,1.39317 Z" id="Path" stroke="#979CAB" stroke-width="2" stroke-linejoin="round"></path>
<path d="M19.488403,25.49685 C19.488403,23.9239333 19.6498613,22.6583083 19.972778,21.699975 C20.2956947,20.731225 20.7748613,19.9864333 21.410278,19.4656 C22.0561113,18.9447667 22.863403,18.68435 23.832153,18.68435 C24.550903,18.68435 25.1811113,18.8301833 25.722778,19.12185 C26.2644447,19.4031 26.707153,19.8197667 27.050903,20.37185 C27.4050697,20.9135167 27.6811113,21.574975 27.879028,22.356225 C28.0873613,23.1270583 28.191528,24.1739333 28.191528,25.49685 C28.191528,27.0697667 28.0300697,28.3406025 27.707153,29.3093576 C27.3842363,30.2676909 26.8998613,31.0124826 26.254028,31.5437326 C25.6186113,32.0645659 24.8113197,32.3249826 23.832153,32.3249826 C22.550903,32.3249826 21.5404863,31.8614409 20.800903,30.9343576 C19.925903,29.8197743 19.488403,28.0072717 19.488403,25.49685 L19.488403,25.49685 Z M21.160278,25.49685 C21.160278,27.6947717 21.4154863,29.1583159 21.925903,29.8874826 C22.4467363,30.6062326 23.082153,30.9656076 23.832153,30.9656076 C24.5925697,30.9656076 25.2279863,30.6010243 25.738403,29.8718576 C26.2488197,29.1426909 26.504028,27.6843551 26.504028,25.49685 C26.504028,23.2989333 26.2488197,21.8406 25.738403,21.12185 C25.2279863,20.4031 24.5873613,20.043725 23.816528,20.043725 C23.066528,20.043725 22.4675697,20.3614333 22.019653,20.99685 C21.4467363,21.80935 21.160278,23.30935 21.160278,25.49685 L21.160278,25.49685 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
<path d="M183.71559,4.1045 L183.71559,4.1045 C183.71559,2.5803148 184.951186,1.344719 186.475371,1.344719 L228.325896,1.344719 C229.05783,1.344719 229.759795,1.63547523 230.277342,2.1530381 C230.794921,2.67060097 231.085662,3.3725587 231.085662,4.1044999 L231.085662,48.6636799 C231.085662,50.1878651 229.850066,51.4234609 228.325896,51.4234609 L186.475371,51.4234609 C184.951186,51.4234609 183.71559,50.1878652 183.71559,48.6636799 L183.71559,4.1045 Z" id="Path" fill-opacity="0" fill="#000000"></path>
<path d="M183.71559,4.1045 L183.71559,4.1045 C183.71559,2.5803148 184.951186,1.344719 186.475371,1.344719 L228.325896,1.344719 C229.05783,1.344719 229.759795,1.63547523 230.277342,2.1530381 C230.794921,2.67060097 231.085662,3.3725587 231.085662,4.1044999 L231.085662,48.6636799 C231.085662,50.1878651 229.850066,51.4234609 228.325896,51.4234609 L186.475371,51.4234609 C184.951186,51.4234609 183.71559,50.1878652 183.71559,48.6636799 L183.71559,4.1045 Z" id="Path" stroke="#979CAB" stroke-width="2" stroke-linejoin="round"></path>
<path d="M209.1659,33.3041 L207.525275,33.3041 L207.525275,22.850967 C207.129442,23.225967 206.608608,23.6061753 205.962775,23.991592 C205.327358,24.366592 204.754442,24.647842 204.244025,24.835342 L204.244025,23.241592 C205.160692,22.8145087 205.962775,22.2936753 206.650275,21.679092 C207.337775,21.0645087 207.82215,20.4707587 208.1034,19.897842 L209.1659,19.897842 L209.1659,33.3041 Z" id="Path" fill="#000000" fill-rule="nonzero"></path>
<polygon id="Path" fill="#FFFFFF" points="39.08891 16.85302 58.521977 16.85302 58.521977 38.679795 39.08891 38.679795"></polygon>
<polygon id="Path" fill="#FFFFFF" points="175.08891 16.85302 194.521985 16.85302 194.521985 38.679795 175.08891 38.679795"></polygon>
<line x1="194.52199" y1="27.7664" x2="47.56136" y2="28.2073485" id="Path" fill-opacity="0" fill="#000000"></line>
<line x1="176.52206" y1="27.82041" x2="47.56134" y2="28.20735" id="Path" stroke="#00BFB3" stroke-width="3" stroke-linejoin="round"></line>
<polygon id="Path" stroke="#00BFB3" stroke-width="3" fill="#00BFB3" points="176.53693 32.77559 190.136295 27.779565 176.507206 22.8652355"></polygon>
<path d="M367.71558,4.1045 L367.71558,4.1045 C367.71558,2.5803148 368.951206,1.344719 370.475376,1.344719 L412.325901,1.344719 C413.057835,1.344719 413.7598,1.63547523 414.277348,2.1530381 C414.794926,2.67060097 415.085667,3.3725587 415.085667,4.1044999 L415.085667,48.6636799 C415.085667,50.1878651 413.850071,51.4234609 412.325901,51.4234609 L370.475376,51.4234609 C368.951206,51.4234609 367.71558,50.1878652 367.71558,48.6636799 L367.71558,4.1045 Z" id="Path" fill-opacity="0" fill="#000000"></path>
<path d="M367.71558,4.1045 L367.71558,4.1045 C367.71558,2.5803148 368.951206,1.344719 370.475376,1.344719 L412.325901,1.344719 C413.057835,1.344719 413.7598,1.63547523 414.277348,2.1530381 C414.794926,2.67060097 415.085667,3.3725587 415.085667,4.1044999 L415.085667,48.6636799 C415.085667,50.1878651 413.850071,51.4234609 412.325901,51.4234609 L370.475376,51.4234609 C368.951206,51.4234609 367.71558,50.1878652 367.71558,48.6636799 L367.71558,4.1045 Z" id="Path" stroke="#979CAB" stroke-width="2" stroke-linejoin="round"></path>
<path d="M395.6034,31.72597 L395.6034,33.304095 L386.775275,33.304095 C386.764858,32.9082617 386.827358,32.5280533 386.962775,32.16347 C387.191942,31.5593033 387.551317,30.9655533 388.0409,30.38222 C388.5409,29.7988867 389.25965,29.1270117 390.19715,28.366595 C391.645067,27.1790899 392.624233,26.2363791 393.13465,25.5384624 C393.645067,24.8405457 393.900275,24.1842957 393.900275,23.5697124 C393.900275,22.9134624 393.6659,22.3665874 393.19715,21.9290874 C392.738817,21.4811707 392.13465,21.2572124 391.38465,21.2572124 C390.592983,21.2572124 389.957567,21.4967957 389.4784,21.9759624 C389.00965,22.4447124 388.775275,23.0957541 388.775275,23.9290874 L387.087775,23.7572124 C387.202358,22.4967957 387.63465,21.5384624 388.38465,20.8822124 C389.145067,20.2259624 390.155483,19.8978374 391.4159,19.8978374 C392.69715,19.8978374 393.712775,20.2520041 394.462775,20.9603374 C395.212775,21.6686707 395.587775,22.5488791 395.587775,23.6009624 C395.587775,24.1322124 395.4784,24.6582541 395.25965,25.1790874 C395.0409,25.6999207 394.676317,26.2467957 394.1659,26.8197124 C393.6659,27.3822124 392.82215,28.1634649 391.63465,29.16347 C390.655483,29.9863867 390.025275,30.5488867 389.744025,30.85097 C389.462775,31.1426367 389.233608,31.4343033 389.056525,31.72597 L395.6034,31.72597 Z" id="Path" fill="#000000" fill-rule="nonzero"></path>
<polygon id="Path" fill="#FFFFFF" points="223.0889 16.85302 242.521975 16.85302 242.521975 38.679795 223.0889 38.679795"></polygon>
<polygon id="Path" fill="#FFFFFF" points="359.0889 16.85302 378.521975 16.85302 378.521975 38.679795 359.0889 38.679795"></polygon>
<line x1="378.52197" y1="27.7664" x2="231.56134" y2="28.2073485" id="Path" fill-opacity="0" fill="#000000"></line>
<line x1="360.52206" y1="27.82041" x2="231.56134" y2="28.20735" id="Path" stroke="#00BFB3" stroke-width="3" stroke-linejoin="round"></line>
<polygon id="Path" stroke="#00BFB3" stroke-width="3" fill="#00BFB3" points="360.53693 32.77559 374.136295 27.779565 360.507206 22.8652355"></polygon>
<path d="M551.7156,4.1045 L551.7156,4.1045 C551.7156,2.5803148 552.951196,1.344719 554.475366,1.344719 L596.325891,1.344719 C597.057824,1.344719 597.75979,1.63547523 598.277368,2.1530381 C598.794946,2.67060097 599.085717,3.3725587 599.085717,4.1044999 L599.085717,48.6636799 C599.085717,50.1878651 597.850122,51.4234609 596.325891,51.4234609 L554.475366,51.4234609 C552.951196,51.4234609 551.7156,50.1878652 551.7156,48.6636799 L551.7156,4.1045 Z" id="Path" fill-opacity="0" fill="#000000"></path>
<path d="M551.7156,4.1045 L551.7156,4.1045 C551.7156,2.5803148 552.951196,1.344719 554.475366,1.344719 L596.325891,1.344719 C597.057824,1.344719 597.75979,1.63547523 598.277368,2.1530381 C598.794946,2.67060097 599.085717,3.3725587 599.085717,4.1044999 L599.085717,48.6636799 C599.085717,50.1878651 597.850122,51.4234609 596.325891,51.4234609 L554.475366,51.4234609 C552.951196,51.4234609 551.7156,50.1878652 551.7156,48.6636799 L551.7156,4.1045 Z" id="Path" stroke="#979CAB" stroke-width="2" stroke-linejoin="round"></path>
<path d="M570.994,29.77284 L572.634625,29.55409 C572.822125,30.49159 573.139833,31.163465 573.58775,31.569715 C574.046083,31.975965 574.598167,32.17909 575.244,32.17909 C576.014833,32.17909 576.665875,31.913465 577.197125,31.382215 C577.728375,30.850965 577.994,30.1895067 577.994,29.3978324 C577.994,28.64784 577.749208,28.0280458 577.259625,27.5384574 C576.770042,27.0488741 576.145042,26.8040824 575.384625,26.8040824 C575.072125,26.8040824 574.686708,26.8613741 574.228375,26.9759574 L574.415875,25.5384574 C574.520042,25.5488741 574.608583,25.5540824 574.6815,25.5540824 C575.379417,25.5540824 576.004417,25.3717907 576.5565,25.0072074 C577.119,24.6426241 577.40025,24.0853324 577.40025,23.3353324 C577.40025,22.7311657 577.197125,22.2311657 576.790875,21.8353324 C576.384625,21.4394991 575.858583,21.2415824 575.21275,21.2415824 C574.577333,21.2415824 574.046083,21.4447074 573.619,21.8509574 C573.191917,22.2467907 572.921083,22.8457491 572.8065,23.6478324 L571.165875,23.3509574 C571.363792,22.2572074 571.816917,21.4082491 572.52525,20.8040824 C573.233583,20.1999157 574.119,19.8978324 575.1815,19.8978324 C575.910667,19.8978324 576.577333,20.0540824 577.1815,20.3665824 C577.796083,20.6790824 578.264833,21.1061657 578.58775,21.6478324 C578.921083,22.1894991 579.08775,22.7624157 579.08775,23.3665824 C579.08775,23.9394991 578.9315,24.4655407 578.619,24.9447074 C578.3065,25.4134574 577.848167,25.7884574 577.244,26.0697074 C578.035667,26.2572074 578.65025,26.6374157 579.08775,27.2103324 C579.52525,27.7832541 579.744,28.5020067 579.744,29.36659 C579.744,30.52284 579.316917,31.507215 578.46275,32.319715 C577.619,33.132215 576.546083,33.538465 575.244,33.538465 C574.066917,33.538465 573.092958,33.1895067 572.322125,32.49159 C571.551292,31.7936733 571.108583,30.8874233 570.994,29.77284 Z" id="Path" fill="#000000" fill-rule="nonzero"></path>
<polygon id="Path" fill="#FFFFFF" points="407.0889 16.85302 426.521975 16.85302 426.521975 38.679795 407.0889 38.679795"></polygon>
<polygon id="Path" fill="#FFFFFF" points="543.0889 16.85302 562.521944 16.85302 562.521944 38.679795 543.0889 38.679795"></polygon>
<line x1="562.522" y1="27.7664" x2="415.56137" y2="28.2073485" id="Path" fill-opacity="0" fill="#000000"></line>
<line x1="544.52203" y1="27.82041" x2="415.56133" y2="28.20735" id="Path" stroke="#00BFB3" stroke-width="3" stroke-linejoin="round"></line>
<polygon id="Path" stroke="#00BFB3" stroke-width="3" fill="#00BFB3" points="544.5369 32.77559 558.136265 27.779565 544.507176 22.8652355"></polygon>
<polygon id="Path" fill="#FFFFFF" points="75.41746 10.47244 146.3151 10.47244 146.3151 41.842511 75.41746 41.842511"></polygon>
<path d="M96.48065,36.7806104 L96.48065,32.046235 C96.23065,32.4108183 95.8764833,32.7129017 95.41815,32.952485 C94.9598167,33.1816517 94.4702333,33.296235 93.9494,33.296235 C92.8035667,33.296235 91.8139833,32.8379017 90.98065,31.921235 C90.1577333,31.0045683 89.746275,29.74936 89.746275,28.15561 C89.746275,27.1764383 89.9129417,26.3014357 90.246275,25.5306024 C90.590025,24.7597691 91.0796083,24.1764357 91.715025,23.7806024 C92.3608583,23.3847691 93.0639833,23.1868524 93.8244,23.1868524 C95.0223167,23.1868524 95.965025,23.6920607 96.652525,24.7024774 L96.652525,23.4056024 L98.121275,23.4056024 L98.121275,36.7806104 L96.48065,36.7806104 L96.48065,36.7806104 Z M91.433775,28.21811 C91.433775,29.4576933 91.6941917,30.389985 92.215025,31.014985 C92.7358583,31.639985 93.3608583,31.952485 94.090025,31.952485 C94.7879417,31.952485 95.3869,31.65561 95.8869,31.06186 C96.3973167,30.46811 96.652525,29.5670683 96.652525,28.358735 C96.652525,27.0670633 96.3869,26.0983107 95.85565,25.4524774 C95.3244,24.8066441 94.6994,24.4837274 93.98065,24.4837274 C93.2723167,24.4837274 92.66815,24.7858107 92.16815,25.3899774 C91.6785667,25.9941441 91.433775,26.9368549 91.433775,28.21811 Z M107.028242,33.077485 L107.028242,31.65561 C106.278242,32.74936 105.257409,33.296235 103.965742,33.296235 C103.392825,33.296235 102.856367,33.18686 102.356367,32.96811 C101.866784,32.74936 101.5022,32.4733183 101.262617,32.139985 C101.023034,31.8066517 100.856367,31.4004017 100.762617,30.921235 C100.6897,30.608735 100.653242,30.0983183 100.653242,29.389985 L100.653242,23.4056024 L102.293867,23.4056024 L102.293867,28.764985 C102.293867,29.6191517 102.330325,30.1972767 102.403242,30.49936 C102.507409,30.9264433 102.726159,31.264985 103.059492,31.514985 C103.392825,31.764985 103.804284,31.889985 104.293867,31.889985 C104.78345,31.889985 105.241784,31.764985 105.668867,31.514985 C106.106367,31.2545683 106.413659,30.9108183 106.590742,30.483735 C106.767825,30.046235 106.856367,29.4160267 106.856367,28.59311 L106.856367,23.4056024 L108.496992,23.4056024 L108.496992,33.0774854 L107.028242,33.0774854 L107.028242,33.077485 Z M111.075834,21.608727 L111.075834,19.718102 L112.716459,19.718102 L112.716459,21.608727 L111.075834,21.608727 Z M111.075834,33.077485 L111.075834,23.405602 L112.716459,23.405602 L112.716459,33.077485 L111.075834,33.077485 Z M121.533155,29.53061 L123.14253,29.74936 C122.965447,30.8535267 122.512322,31.7233183 121.783155,32.358735 C121.064405,32.983735 120.17378,33.296235 119.11128,33.296235 C117.788363,33.296235 116.725863,32.8639433 115.92378,31.99936 C115.121697,31.1347767 114.720655,29.8951933 114.720655,28.28061 C114.720655,27.2285216 114.89253,26.3118524 115.23628,25.5306024 C115.58003,24.7493524 116.106072,24.1660191 116.814405,23.7806024 C117.522738,23.3847691 118.293572,23.1868524 119.126905,23.1868524 C120.178988,23.1868524 121.038363,23.4524774 121.70503,23.9837274 C122.371697,24.5149774 122.79878,25.2701857 122.98628,26.2493524 L121.39253,26.4837274 C121.23628,25.8378941 120.965447,25.3535191 120.58003,25.0306024 C120.194613,24.6972691 119.731072,24.5306024 119.189405,24.5306024 C118.366488,24.5306024 117.694613,24.8274774 117.17378,25.4212274 C116.652947,26.0149774 116.39253,26.9524799 116.39253,28.233735 C116.39253,29.5358183 116.64253,30.483735 117.14253,31.077485 C117.64253,31.6608183 118.293572,31.952485 119.095655,31.952485 C119.741488,31.952485 120.277947,31.7545683 120.70503,31.358735 C121.14253,30.9629017 121.418572,30.3535267 121.533155,29.53061 Z M124.54878,33.077485 L124.54878,19.718102 L126.189405,19.718102 L126.189405,27.343102 L130.08003,23.405602 L132.189405,23.405602 L128.501905,26.999352 L132.564405,33.077485 L130.54878,33.077485 L127.345655,28.1243596 L126.189405,29.2493596 L126.189405,33.077485 L124.54878,33.077485 L124.54878,33.077485 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
<polygon id="Path" fill="#FFFFFF" points="261.4882 10.47244 332.385844 10.47244 332.385844 41.842511 261.4882 41.842511"></polygon>
<path d="M274.26498,33.07748 L272.749355,33.07748 L272.749355,19.718097 L274.38998,19.718097 L274.38998,24.483722 C275.087897,23.6191387 275.973313,23.186847 277.04623,23.186847 C277.63998,23.186847 278.20248,23.3066387 278.73373,23.546222 C279.26498,23.7858053 279.70248,24.124347 280.04623,24.561847 C280.38998,24.9889303 280.655605,25.5097637 280.843105,26.124347 C281.041022,26.7389303 281.13998,27.3951829 281.13998,28.0931046 C281.13998,29.7493546 280.728522,31.0306046 279.905605,31.9368546 C279.093105,32.8431046 278.10873,33.2962296 276.95248,33.2962296 C275.817063,33.2962296 274.92123,32.8170629 274.26498,31.8587296 L274.26498,33.0774796 L274.26498,33.07748 Z M274.249355,28.17123 C274.249355,29.32748 274.410813,30.1660217 274.73373,30.686855 C275.244147,31.5305974 275.942063,31.95248 276.82748,31.95248 C277.54623,31.95248 278.166022,31.63998 278.686855,31.01498 C279.207688,30.38998 279.468105,29.4628967 279.468105,28.23373 C279.468105,26.9733083 279.218105,26.0410141 278.718105,25.4368474 C278.218105,24.8326807 277.60873,24.5305974 276.88998,24.5305974 C276.181647,24.5305974 275.561855,24.8430974 275.030605,25.4680974 C274.509772,26.0930974 274.249355,26.9941416 274.249355,28.17123 Z M283.125087,33.07748 L283.125087,23.405597 L284.593837,23.405597 L284.593837,24.874347 C284.968837,24.186847 285.312587,23.733722 285.625087,23.514972 C285.948004,23.296222 286.30217,23.186847 286.687587,23.186847 C287.23967,23.186847 287.80217,23.3639303 288.375087,23.718097 L287.812587,25.233722 C287.406337,24.9941387 287.005295,24.874347 286.609462,24.874347 C286.244879,24.874347 285.921962,24.983722 285.640712,25.202472 C285.359462,25.421222 285.156337,25.718097 285.031337,26.093097 C284.843837,26.6764303 284.750087,27.3170579 284.750087,28.0149796 L284.750087,33.07748 L283.125087,33.07748 L283.125087,33.07748 Z M288.744014,28.23373 C288.744014,26.4420583 289.238806,25.1191391 290.228389,24.2649724 C291.061722,23.5462224 292.077347,23.1868474 293.275264,23.1868474 C294.608597,23.1868474 295.697139,23.6243474 296.540889,24.4993474 C297.384639,25.3639307 297.806514,26.5670583 297.806514,28.10873 C297.806514,29.3483133 297.619014,30.32748 297.244014,31.04623 C296.869014,31.7545633 296.322139,32.3066467 295.603389,32.70248 C294.895056,33.0983133 294.119014,33.29623 293.275264,33.29623 C291.921097,33.29623 290.827347,32.8639383 289.994014,31.999355 C289.160681,31.124355 288.744014,29.8691467 288.744014,28.23373 Z M290.431514,28.23373 C290.431514,29.4733133 290.697139,30.405605 291.228389,31.030605 C291.770056,31.6451883 292.452347,31.95248 293.275264,31.95248 C294.087764,31.95248 294.764847,31.6451883 295.306514,31.030605 C295.848181,30.405605 296.119014,29.4576883 296.119014,28.186855 C296.119014,26.9889333 295.848181,26.0826807 295.306514,25.4680974 C294.764847,24.8535141 294.087764,24.5462224 293.275264,24.5462224 C292.452347,24.5462224 291.770056,24.8535141 291.228389,25.4680974 C290.697139,26.0722641 290.431514,26.9941416 290.431514,28.23373 Z M301.510341,33.07748 L298.541591,23.405597 L300.244716,23.405597 L301.775966,28.9837296 L302.354091,31.0618546 C302.385341,30.9576879 302.552008,30.2910213 302.854091,29.0618546 L304.400966,23.405597 L306.088466,23.405597 L307.525966,29.0149796 L308.010341,30.8587296 L308.572841,28.9993546 L310.229091,23.405597 L311.822841,23.405597 L308.791591,33.07748 L307.088466,33.07748 L305.557216,27.2805974 L305.182216,25.6399724 L303.229091,33.07748 L301.510341,33.07748 Z M313.202052,33.07748 L313.202052,23.405597 L314.670802,23.405597 L314.670802,24.780597 C315.379135,23.718097 316.405177,23.186847 317.748927,23.186847 C318.33226,23.186847 318.868719,23.2910137 319.358302,23.499347 C319.847885,23.7076803 320.212469,23.983722 320.452052,24.327472 C320.702052,24.6608053 320.873927,25.061847 320.967677,25.530597 C321.030177,25.8326803 321.061427,26.3639303 321.061427,27.124347 L321.061427,33.07748 L319.420802,33.07748 L319.420802,27.186847 C319.420802,26.5201803 319.353094,26.0253887 319.217677,25.702472 C319.092677,25.3691387 318.868719,25.1035137 318.545802,24.905597 C318.222885,24.7076803 317.842677,24.608722 317.405177,24.608722 C316.70726,24.608722 316.103094,24.8326803 315.592677,25.280597 C315.092677,25.718097 314.842677,26.5566387 314.842677,27.796222 L314.842677,33.07748 L313.202052,33.07748 L313.202052,33.07748 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
<polygon id="Path" fill="#FFFFFF" points="454.6824 10.47244 502.052487 10.47244 502.052487 41.842511 454.6824 41.842511"></polygon>
<path d="M467.5489,33.07748 L467.5489,24.671222 L466.095775,24.671222 L466.095775,23.405597 L467.5489,23.405597 L467.5489,22.374347 C467.5489,21.7285137 467.606192,21.2441387 467.720775,20.921222 C467.877025,20.4941387 468.153067,20.1503887 468.5489,19.889972 C468.944733,19.6295553 469.502025,19.499347 470.220775,19.499347 C470.679108,19.499347 471.189525,19.5514303 471.752025,19.655597 L471.502025,21.093097 C471.168692,21.030597 470.850983,20.999347 470.5489,20.999347 C470.0489,20.999347 469.694733,21.108722 469.4864,21.327472 C469.278067,21.5358053 469.1739,21.9316387 469.1739,22.514972 L469.1739,23.405597 L471.064525,23.405597 L471.064525,24.671222 L469.1739,24.671222 L469.1739,33.07748 L467.5489,33.07748 Z M471.732189,28.23373 C471.732189,26.4420583 472.22698,25.1191391 473.216564,24.2649724 C474.049897,23.5462224 475.065522,23.1868474 476.263439,23.1868474 C477.596772,23.1868474 478.685314,23.6243474 479.529064,24.4993474 C480.372814,25.3639307 480.794689,26.5670583 480.794689,28.10873 C480.794689,29.3483133 480.607189,30.32748 480.232189,31.04623 C479.857189,31.7545633 479.310314,32.3066467 478.591564,32.70248 C477.88323,33.0983133 477.107189,33.29623 476.263439,33.29623 C474.909272,33.29623 473.815522,32.8639383 472.982189,31.999355 C472.148855,31.124355 471.732189,29.8691467 471.732189,28.23373 Z M473.419689,28.23373 C473.419689,29.4733133 473.685314,30.405605 474.216564,31.030605 C474.75823,31.6451883 475.440522,31.95248 476.263439,31.95248 C477.075939,31.95248 477.753022,31.6451883 478.294689,31.030605 C478.836355,30.405605 479.107189,29.4576883 479.107189,28.186855 C479.107189,26.9889333 478.836355,26.0826807 478.294689,25.4680974 C477.753022,24.8535141 477.075939,24.5462224 476.263439,24.5462224 C475.440522,24.5462224 474.75823,24.8535141 474.216564,25.4680974 C473.685314,26.0722641 473.419689,26.9941416 473.419689,28.23373 Z M481.623546,33.07748 L485.154796,28.04623 L481.889171,23.4055974 L483.936046,23.4055974 L485.420421,25.6712224 C485.701671,26.0983057 485.925629,26.4576807 486.092296,26.7493474 C486.363129,26.3535141 486.607921,25.9993474 486.826671,25.6868474 L488.467296,23.4055974 L490.420421,23.4055974 L487.076671,27.9524724 L490.670421,33.07748 L488.654796,33.07748 L486.670421,30.07748 L486.154796,29.26498 L483.607921,33.07748 L481.623546,33.07748 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 30 KiB