<style type="text/css">
::-moz-selection
{
- color: #FFFCF0;
- background: #0F0C00;
+ color: #FFFFFF;
+ background: #141414;
}
::selection
{
- color: #FFFCF0;
- background: #0F0C00;
+ color: #FFFFFF;
+ background: #141414;
}
.ebnf a, .grammar a
{
}
.ebnf a:hover, .grammar a:hover
{
- color: #050400;
+ color: #0F0F0F;
text-decoration: underline;
}
.signature
{
- color: #806600;
+ color: #4D4D4D;
font-size: 11px;
text-align: right;
}
body
{
font: normal 12px Verdana, sans-serif;
- color: #0F0C00;
- background: #FFFCF0;
+ color: #141414;
+ background: #FFFFFF;
}
a:link, a:visited
{
- color: #0F0C00;
+ color: #141414;
}
a:link.signature, a:visited.signature
{
- color: #806600;
+ color: #4D4D4D;
}
a.button, #tabs li a
{
padding: 0.25em 0.5em;
- border: 1px solid #806600;
- background: #F1E8C6;
- color: #806600;
+ border: 1px solid #4D4D4D;
+ background: #E3E3E3;
+ color: #4D4D4D;
text-decoration: none;
font-weight: bold;
}
a.button:hover, #tabs li a:hover
{
- color: #050400;
- background: #FFF6D1;
- border-color: #050400;
+ color: #0F0F0F;
+ background: #F0F0F0;
+ border-color: #0F0F0F;
}
#tabs
{
padding: 3px 10px;
margin-left: 0;
margin-top: 58px;
- border-bottom: 1px solid #0F0C00;
+ border-bottom: 1px solid #141414;
}
#tabs li
{
}
#tabs li a
{
- border-bottom: 1px solid #0F0C00;
+ border-bottom: 1px solid #141414;
}
#tabs li a.active
{
- color: #0F0C00;
- background: #FFFCF0;
- border-color: #0F0C00;
- border-bottom: 1px solid #FFFCF0;
+ color: #141414;
+ background: #FFFFFF;
+ border-color: #141414;
+ border-bottom: 1px solid #FFFFFF;
outline: none;
}
#divs div
}
#text
{
- border-color: #806600;
- background: #FFFEFA;
- color: #050400;
+ border-color: #4D4D4D;
+ background: #FFFFFF;
+ color: #0F0F0F;
}
.small
{
div.download
{
display: none;
- background: #FFFCF0;
+ background: #FFFFFF;
position: absolute;
right: 34px;
top: 94px;
padding: 10px;
- border: 1px dotted #0F0C00;
+ border: 1px dotted #141414;
}
#divs div.ebnf, .ebnf code
{
display: block;
padding: 10px;
- background: #FFF6D1;
+ background: #F0F0F0;
width: 992px;
}
#divs div.grammar
padding-left: 16px;
padding-top: 2px;
padding-bottom: 2px;
- background: #FFF6D1;
+ background: #F0F0F0;
}
pre
{
}
table.palette
{
- border-top: 1px solid #050400;
- border-right: 1px solid #050400;
+ border-top: 1px solid #0F0F0F;
+ border-right: 1px solid #0F0F0F;
margin-bottom: 4px
}
td.palette
{
- border-bottom: 1px solid #050400;
- border-left: 1px solid #050400;
+ border-bottom: 1px solid #0F0F0F;
+ border-left: 1px solid #0F0F0F;
}
a.palette
{
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0F0F0F; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0D0D0D;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0F0F0F;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs></svg></head>
<body>
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 61 1 57 1 65"/>
<text class="terminal" x="59" y="21">,</text>
<svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 61 h2 m20 0 h10 m110 0 h10 m20 0 h10 m0 0 h116 m-146 0 h20 m126 0 h20 m-166 0 q10 0 10 10 m146 0 q0 -10 10 -10 m-156 10 v12 m146 0 v-12 m-146 12 q0 10 10 10 m126 0 q10 0 10 -10 m-136 10 h10 m30 0 h10 m0 0 h10 m56 0 h10 m-296 -32 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m296 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-296 0 h10 m24 0 h10 m0 0 h252 m23 44 h-3"/>
<polygon points="365 61 373 57 373 65"/>
- <polygon points="365 61 357 57 357 65"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#Definition" title="Definition">Definition</a></div>
- <div> ::= <a href="#PropertyName" title="PropertyName">PropertyName</a> ( '=' <a href="#Value" title="Value">Value</a> )? ( ',' <a href="#PropertyName" title="PropertyName">PropertyName</a> ( '=' <a href="#Value" title="Value">Value</a> )? )*</div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">no references</xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml" /><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="Query">Query:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" width="211" height="81">
+ <polygon points="365 61 357 57 357 65"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">no references</xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml" /><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="Query">Query:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" width="211" height="81">
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 61 1 57 1 65"/>
<text class="terminal" x="59" y="21">,</text>
<svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 61 h2 m20 0 h10 m112 0 h10 m-152 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m132 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-132 0 h10 m24 0 h10 m0 0 h88 m23 44 h-3"/>
<polygon points="201 61 209 57 209 65"/>
- <polygon points="201 61 193 57 193 65"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#Query" title="Query">Query</a> ::= <a href="#PropertyQuery" title="PropertyQuery">PropertyQuery</a> ( ',' <a href="#PropertyQuery" title="PropertyQuery">PropertyQuery</a> )*</div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">no references</xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml" /><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="PropertyQuery">PropertyQuery:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" width="465" height="189">
+ <polygon points="201 61 193 57 193 65"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">no references</xhtml:p><xhtml:br xmlns:xhtml="http://www.w3.org/1999/xhtml" /><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml" style="font-size: 14px; font-weight:bold"><xhtml:a name="PropertyQuery">PropertyQuery:</xhtml:a></xhtml:p><svg xmlns="http://www.w3.org/2000/svg" width="505" height="189">
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 17 1 13 1 21"/>
<text class="terminal" x="79" y="53">-</text><a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#PropertyName" xlink:title="PropertyName">
<rect x="137" y="3" width="110" height="32"/>
<rect x="135" y="1" width="110" height="32" class="nonterminal"/>
- <text class="nonterminal" x="145" y="21">PropertyName</text></a><rect x="51" y="79" width="26" height="32" rx="10"/>
- <rect x="49" y="77" width="26" height="32" class="terminal" rx="10"/>
- <text class="terminal" x="59" y="97">?</text><a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#PropertyName" xlink:title="PropertyName">
- <rect x="97" y="79" width="110" height="32"/>
- <rect x="95" y="77" width="110" height="32" class="nonterminal"/>
- <text class="nonterminal" x="105" y="97">PropertyName</text></a><rect x="267" y="111" width="30" height="32" rx="10"/>
- <rect x="265" y="109" width="30" height="32" class="terminal" rx="10"/>
- <text class="terminal" x="275" y="129">=</text>
- <rect x="267" y="155" width="34" height="32" rx="10"/>
- <rect x="265" y="153" width="34" height="32" class="terminal" rx="10"/>
- <text class="terminal" x="275" y="173">!=</text><a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#Value" xlink:title="Value">
- <rect x="341" y="111" width="56" height="32"/>
- <rect x="339" y="109" width="56" height="32" class="nonterminal"/>
- <text class="nonterminal" x="349" y="129">Value</text></a><svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 17 h2 m40 0 h10 m0 0 h36 m-66 0 h20 m46 0 h20 m-86 0 q10 0 10 10 m66 0 q0 -10 10 -10 m-76 10 v12 m66 0 v-12 m-66 12 q0 10 10 10 m46 0 q10 0 10 -10 m-56 10 h10 m26 0 h10 m20 -32 h10 m110 0 h10 m0 0 h170 m-406 0 h20 m386 0 h20 m-426 0 q10 0 10 10 m406 0 q0 -10 10 -10 m-416 10 v56 m406 0 v-56 m-406 56 q0 10 10 10 m386 0 q10 0 10 -10 m-396 10 h10 m26 0 h10 m0 0 h10 m110 0 h10 m20 0 h10 m0 0 h160 m-190 0 h20 m170 0 h20 m-210 0 q10 0 10 10 m190 0 q0 -10 10 -10 m-200 10 v12 m190 0 v-12 m-190 12 q0 10 10 10 m170 0 q10 0 10 -10 m-160 10 h10 m30 0 h10 m0 0 h4 m-74 0 h20 m54 0 h20 m-94 0 q10 0 10 10 m74 0 q0 -10 10 -10 m-84 10 v24 m74 0 v-24 m-74 24 q0 10 10 10 m54 0 q10 0 10 -10 m-64 10 h10 m34 0 h10 m20 -44 h10 m56 0 h10 m43 -108 h-3"/>
- <polygon points="455 17 463 13 463 21"/>
- <polygon points="455 17 447 13 447 21"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#PropertyQuery" title="PropertyQuery">PropertyQuery</a></div>
- <div> ::= '-'? <a href="#PropertyName" title="PropertyName">PropertyName</a></div>
- <div> | '?' <a href="#PropertyName" title="PropertyName">PropertyName</a> ( ( '=' | '!=' ) <a href="#Value" title="Value">Value</a> )?</div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
+ <text class="nonterminal" x="145" y="21">PropertyName</text></a><rect x="71" y="111" width="26" height="32" rx="10"/>
+ <rect x="69" y="109" width="26" height="32" class="terminal" rx="10"/>
+ <text class="terminal" x="79" y="129">?</text><a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#PropertyName" xlink:title="PropertyName">
+ <rect x="137" y="79" width="110" height="32"/>
+ <rect x="135" y="77" width="110" height="32" class="nonterminal"/>
+ <text class="nonterminal" x="145" y="97">PropertyName</text></a><rect x="307" y="111" width="30" height="32" rx="10"/>
+ <rect x="305" y="109" width="30" height="32" class="terminal" rx="10"/>
+ <text class="terminal" x="315" y="129">=</text>
+ <rect x="307" y="155" width="34" height="32" rx="10"/>
+ <rect x="305" y="153" width="34" height="32" class="terminal" rx="10"/>
+ <text class="terminal" x="315" y="173">!=</text><a xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#Value" xlink:title="Value">
+ <rect x="381" y="111" width="56" height="32"/>
+ <rect x="379" y="109" width="56" height="32" class="nonterminal"/>
+ <text class="nonterminal" x="389" y="129">Value</text></a><svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 17 h2 m40 0 h10 m0 0 h36 m-66 0 h20 m46 0 h20 m-86 0 q10 0 10 10 m66 0 q0 -10 10 -10 m-76 10 v12 m66 0 v-12 m-66 12 q0 10 10 10 m46 0 q10 0 10 -10 m-56 10 h10 m26 0 h10 m20 -32 h10 m110 0 h10 m0 0 h210 m-446 0 h20 m426 0 h20 m-466 0 q10 0 10 10 m446 0 q0 -10 10 -10 m-456 10 v56 m446 0 v-56 m-446 56 q0 10 10 10 m426 0 q10 0 10 -10 m-416 10 h10 m0 0 h36 m-66 0 h20 m46 0 h20 m-86 0 q10 0 10 10 m66 0 q0 -10 10 -10 m-76 10 v12 m66 0 v-12 m-66 12 q0 10 10 10 m46 0 q10 0 10 -10 m-56 10 h10 m26 0 h10 m20 -32 h10 m110 0 h10 m20 0 h10 m0 0 h160 m-190 0 h20 m170 0 h20 m-210 0 q10 0 10 10 m190 0 q0 -10 10 -10 m-200 10 v12 m190 0 v-12 m-190 12 q0 10 10 10 m170 0 q10 0 10 -10 m-160 10 h10 m30 0 h10 m0 0 h4 m-74 0 h20 m54 0 h20 m-94 0 q10 0 10 10 m74 0 q0 -10 10 -10 m-84 10 v24 m74 0 v-24 m-74 24 q0 10 10 10 m54 0 q10 0 10 -10 m-64 10 h10 m34 0 h10 m20 -44 h10 m56 0 h10 m43 -108 h-3"/>
+ <polygon points="495 17 503 13 503 21"/>
+ <polygon points="495 17 487 13 487 21"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
<xhtml:ul>
<xhtml:li><xhtml:a href="#Query" title="Query">Query</xhtml:a></xhtml:li>
</xhtml:ul>
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 17 1 13 1 21"/>
<rect x="49" y="45" width="96" height="32" class="nonterminal"/>
<text class="nonterminal" x="59" y="65">StringLiteral</text></a><svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 17 h2 m20 0 h10 m108 0 h10 m-148 0 h20 m128 0 h20 m-168 0 q10 0 10 10 m148 0 q0 -10 10 -10 m-158 10 v24 m148 0 v-24 m-148 24 q0 10 10 10 m128 0 q10 0 10 -10 m-138 10 h10 m96 0 h10 m0 0 h12 m23 -44 h-3"/>
<polygon points="197 17 205 13 205 21"/>
- <polygon points="197 17 189 13 189 21"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#Value" title="Value">Value</a> ::= <a href="#NumberLiteral" title="NumberLiteral">NumberLiteral</a></div>
- <div> | <a href="#StringLiteral" title="StringLiteral">StringLiteral</a></div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
+ <polygon points="197 17 189 13 189 21"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
<xhtml:ul>
<xhtml:li><xhtml:a href="#Definition" title="Definition">Definition</xhtml:a></xhtml:li>
<xhtml:li><xhtml:a href="#PropertyQuery" title="PropertyQuery">PropertyQuery</xhtml:a></xhtml:li>
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 17 1 13 1 21"/>
<rect x="49" y="45" width="120" height="32" class="nonterminal"/>
<text class="nonterminal" x="59" y="65">UnquotedString</text></a><svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 17 h2 m20 0 h10 m104 0 h10 m0 0 h16 m-160 0 h20 m140 0 h20 m-180 0 q10 0 10 10 m160 0 q0 -10 10 -10 m-170 10 v24 m160 0 v-24 m-160 24 q0 10 10 10 m140 0 q10 0 10 -10 m-150 10 h10 m120 0 h10 m23 -44 h-3"/>
<polygon points="209 17 217 13 217 21"/>
- <polygon points="209 17 201 13 201 21"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#StringLiteral" title="StringLiteral">StringLiteral</a></div>
- <div> ::= <a href="#QuotedString" title="QuotedString">QuotedString</a></div>
- <div> | <a href="#UnquotedString" title="UnquotedString">UnquotedString</a></div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
+ <polygon points="209 17 201 13 201 21"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
<xhtml:ul>
<xhtml:li><xhtml:a href="#Value" title="Value">Value</xhtml:a></xhtml:li>
</xhtml:ul>
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 33 1 29 1 37"/>
<text class="terminal" x="257" y="119">'</text>
<svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 33 h2 m20 0 h10 m26 0 h10 m40 0 h10 m56 0 h10 m-96 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -12 q0 -10 10 -10 m76 32 l20 0 m-20 0 q10 0 10 -10 l0 -12 q0 -10 -10 -10 m-76 0 h10 m0 0 h66 m-116 32 h20 m116 0 h20 m-156 0 q10 0 10 10 m136 0 q0 -10 10 -10 m-146 10 v14 m136 0 v-14 m-136 14 q0 10 10 10 m116 0 q10 0 10 -10 m-126 10 h10 m0 0 h106 m20 -34 h10 m26 0 h10 m-268 0 h20 m248 0 h20 m-288 0 q10 0 10 10 m268 0 q0 -10 10 -10 m-278 10 v62 m268 0 v-62 m-268 62 q0 10 10 10 m248 0 q10 0 10 -10 m-258 10 h10 m24 0 h10 m40 0 h10 m54 0 h10 m-94 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -12 q0 -10 10 -10 m74 32 l20 0 m-20 0 q10 0 10 -10 l0 -12 q0 -10 -10 -10 m-74 0 h10 m0 0 h64 m-114 32 h20 m114 0 h20 m-154 0 q10 0 10 10 m134 0 q0 -10 10 -10 m-144 10 v14 m134 0 v-14 m-134 14 q0 10 10 10 m114 0 q10 0 10 -10 m-124 10 h10 m0 0 h104 m20 -34 h10 m24 0 h10 m0 0 h6 m23 -82 h-3"/>
<polygon points="317 33 325 29 325 37"/>
- <polygon points="317 33 309 29 309 37"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#QuotedString" title="QuotedString">QuotedString</a></div>
- <div> ::= '"' [^"]* '"'</div>
- <div> | "'" [^']* "'"</div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
+ <polygon points="317 33 309 29 309 37"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
<xhtml:ul>
<xhtml:li><xhtml:a href="#StringLiteral" title="StringLiteral">StringLiteral</xhtml:a></xhtml:li>
</xhtml:ul>
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 33 1 29 1 37"/>
<text class="regexp" x="64" y="37">[^{space},]</text>
<svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 33 h2 m20 0 h10 m108 0 h10 m-148 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -12 q0 -10 10 -10 m128 32 l20 0 m-20 0 q10 0 10 -10 l0 -12 q0 -10 -10 -10 m-128 0 h10 m0 0 h118 m23 32 h-3"/>
<polygon points="197 33 205 29 205 37"/>
- <polygon points="197 33 189 29 189 37"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#UnquotedString" title="UnquotedString">UnquotedString</a></div>
- <div> ::= [^{space},]+</div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
+ <polygon points="197 33 189 29 189 37"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
<xhtml:ul>
<xhtml:li><xhtml:a href="#StringLiteral" title="StringLiteral">StringLiteral</xhtml:a></xhtml:li>
</xhtml:ul>
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 51 1 47 1 55"/>
<text class="regexp" x="252" y="257">[0-9]</text>
<svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 51 h2 m20 0 h10 m28 0 h10 m40 0 h10 m0 0 h72 m-102 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -14 q0 -10 10 -10 m82 34 l20 0 m-20 0 q10 0 10 -10 l0 -14 q0 -10 -10 -10 m-82 0 h10 m62 0 h10 m20 34 h88 m-230 0 h20 m210 0 h20 m-250 0 q10 0 10 10 m230 0 q0 -10 10 -10 m-240 10 v28 m230 0 v-28 m-230 28 q0 10 10 10 m210 0 q10 0 10 -10 m-220 10 h10 m28 0 h10 m40 0 h10 m62 0 h10 m-102 0 h20 m82 0 h20 m-122 0 q10 0 10 10 m102 0 q0 -10 10 -10 m-112 10 v24 m102 0 v-24 m-102 24 q0 10 10 10 m82 0 q10 0 10 -10 m-92 10 h10 m60 0 h10 m0 0 h2 m-92 -10 v20 m102 0 v-20 m-102 20 v24 m102 0 v-24 m-102 24 q0 10 10 10 m82 0 q10 0 10 -10 m-92 10 h10 m58 0 h10 m0 0 h4 m-122 -88 l20 0 m-1 0 q-9 0 -9 -10 l0 -12 q0 -10 10 -10 m122 32 l20 0 m-20 0 q10 0 10 -10 l0 -12 q0 -10 -10 -10 m-122 0 h10 m0 0 h112 m-278 -16 h20 m298 0 h20 m-338 0 q10 0 10 10 m318 0 q0 -10 10 -10 m-328 10 v182 m318 0 v-182 m-318 182 q0 10 10 10 m298 0 q10 0 10 -10 m-288 10 h10 m0 0 h36 m-66 0 h20 m46 0 h20 m-86 0 q10 0 10 10 m66 0 q0 -10 10 -10 m-76 10 v12 m66 0 v-12 m-66 12 q0 10 10 10 m46 0 q10 0 10 -10 m-56 10 h10 m26 0 h10 m20 -32 h10 m62 0 h10 m20 0 h10 m62 0 h10 m-102 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -12 q0 -10 10 -10 m82 32 l20 0 m-20 0 q10 0 10 -10 l0 -12 q0 -10 -10 -10 m-82 0 h10 m0 0 h72 m20 32 h8 m23 -202 h-3"/>
<polygon points="367 51 375 47 375 55"/>
- <polygon points="367 51 359 47 359 55"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#NumberLiteral" title="NumberLiteral">NumberLiteral</a></div>
- <div> ::= '0' ( [0-7]* | 'x' [0-9A-Fa-f]+ )</div>
- <div> | '-'? [1-9] [0-9]+</div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
+ <polygon points="367 51 359 47 359 55"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
<xhtml:ul>
<xhtml:li><xhtml:a href="#Value" title="Value">Value</xhtml:a></xhtml:li>
</xhtml:ul>
<defs>
<style type="text/css">
@namespace "http://www.w3.org/2000/svg";
- .line {fill: none; stroke: #332900;}
- .bold-line {stroke: #141000; shape-rendering: crispEdges; stroke-width: 2; }
- .thin-line {stroke: #1F1800; shape-rendering: crispEdges}
- .filled {fill: #332900; stroke: none;}
+ .line {fill: none; stroke: #262626;}
+ .bold-line {stroke: #0A0A0A; shape-rendering: crispEdges; stroke-width: 2; }
+ .thin-line {stroke: #0A0A0A; shape-rendering: crispEdges}
+ .filled {fill: #262626; stroke: none;}
text.terminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #141000;
+ fill: #0A0A0A;
font-weight: bold;
}
text.nonterminal {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1A1400;
+ fill: #0A0A0A;
font-weight: normal;
}
text.regexp {font-family: Verdana, Sans-serif;
font-size: 12px;
- fill: #1F1800;
+ fill: #0A0A0A;
font-weight: normal;
}
- rect, circle, polygon {fill: #332900; stroke: #332900;}
- rect.terminal {fill: #FFDB4D; stroke: #332900;}
- rect.nonterminal {fill: #FFEC9E; stroke: #332900;}
+ rect, circle, polygon {fill: #262626; stroke: #262626;}
+ rect.terminal {fill: #FFffff; stroke: #262626;}
+ rect.nonterminal {fill: #FFFFFF; stroke: #262626;}
rect.text {fill: none; stroke: none;}
- polygon.regexp {fill: #FFF4C7; stroke: #332900;}
+ polygon.regexp {fill: #FFFFFF; stroke: #262626;}
</style>
</defs>
<polygon points="9 183 1 179 1 187"/>
<text class="terminal" x="59" y="21">.</text>
<svg:path xmlns:svg="http://www.w3.org/2000/svg" class="line" d="m17 183 h2 m20 0 h10 m62 0 h10 m20 0 h10 m0 0 h72 m-102 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -14 q0 -10 10 -10 m82 34 l20 0 m-20 0 q10 0 10 -10 l0 -14 q0 -10 -10 -10 m-82 0 h10 m62 0 h10 m-92 10 l0 -44 q0 -10 10 -10 m92 54 l0 -44 q0 -10 -10 -10 m-82 0 h10 m62 0 h10 m-92 10 l0 -44 q0 -10 10 -10 m92 54 l0 -44 q0 -10 -10 -10 m-82 0 h10 m28 0 h10 m0 0 h34 m-204 122 l20 0 m-1 0 q-9 0 -9 -10 l0 -146 q0 -10 10 -10 m204 166 l20 0 m-20 0 q10 0 10 -10 l0 -146 q0 -10 -10 -10 m-204 0 h10 m24 0 h10 m0 0 h160 m23 166 h-3"/>
<polygon points="273 183 281 179 281 187"/>
- <polygon points="273 183 265 179 265 187"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xhtml:div class="ebnf"><xhtml:code>
- <div><a href="#PropertyName" title="PropertyName">PropertyName</a></div>
- <div> ::= [A-Z] [A-Z0-9_]* ( '.' [A-Z] [A-Z0-9_]* )*</div></xhtml:code></xhtml:div>
- </xhtml:p>
- <xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
+ <polygon points="273 183 265 179 265 187"/></svg><xhtml:p xmlns:xhtml="http://www.w3.org/1999/xhtml">referenced by:
<xhtml:ul>
<xhtml:li><xhtml:a href="#Definition" title="Definition">Definition</xhtml:a></xhtml:li>
<xhtml:li><xhtml:a href="#PropertyQuery" title="PropertyQuery">PropertyQuery</xhtml:a></xhtml:li>
--- /dev/null
+=pod
+
+=head1 NAME
+
+property - Properties, a selection mechanism for algorithm implementations
+
+=head1 DESCRIPTION
+
+As of OpenSSL 3.0, a new method has been introduced to decide which of
+multiple implementations of an algorithm will be used.
+The method is centered around the concept of properties.
+Each implementation defines a number of properties and when an algorithm
+is being selected, filters based on these properties can be used to
+choose the most appropriate implementation of the algorithm.
+
+Properties are like variables, they are referenced by name and have a value
+assigned.
+
+=head2 Property Names
+
+Property names fall into two categories: those reserved by the OpenSSL
+project and user defined names.
+A I<reserved> property name consists of a single C-style identifier
+(except for leading underscores not being permitted), which begins
+with a letter and can be followed by any number of letters, numbers
+and underscores.
+Property names are case-insensitive, but OpenSSL will only use lowercase
+letters.
+
+A I<user defined> property name is similar, but it B<must> consist of
+two or more C-style identifiers, separated by periods.
+The last identifier in the name can be considered the 'true' property
+name, which is prefixed by some sort of 'namespace'.
+Providers for example could include their name in the prefix and use
+property names like
+
+ <provider_name>.<property_name>
+ <provider_name>.<algorithm_name>.<property_name>
+
+=head2 Properties
+
+A I<property> is a I<name=value> pair.
+A I<property definition> is a sequence of comma separated properties.
+There can be any number of properties in a definition.
+For example: "" defines a null property definition; "my.foo=bar"
+defines a property named I<my.foo> which has a string value I<bar> and
+"iteration.count=3" defines a property named I<iteration.count> which
+has a numeric value of I<3>.
+The full syntax for property definitions appears below.
+
+=head2 Implementations
+
+Each implementation of an algorithm can define any number of
+properties.
+For example, the default provider defines the property I<default=yes>
+for all of its algorithms.
+Likewise, the FIPS provider defines I<fips=yes> and the legacy provider
+defines I<legacy=yes> for all of their algorithms.
+
+=head2 Queries
+
+A I<property query clause> is a single conditional test.
+For example, "fips=yes", "default!=yes" or "?iteration.count!=3".
+The first two represent mandatory clauses, such clauses B<must> match
+for any algorithm to even be under consideration.
+The third clause represents an optional clause.
+Matching such clauses is not a requirement, but any additional optional
+match counts in favor of the algorithm.
+More details about that in the B<Lookups> section.
+A I<property query> is a sequence of comma separated property query clauses.
+The full syntax for property queries appears below.
+
+=head2 Lookups
+
+When an algorithm is looked up, a property query is used to determine
+the best matching algorithm.
+All mandatory query clauses B<must> be present and the implementation
+that additionally has the largest number of matching optional query
+clauses will be used.
+If there is more than one such optimal candidate, the result will be
+chosen from amongst those in an indeterminate way.
+Ordering of optional clauses is not significant.
+
+=head2 Shortcut
+
+In order to permit a more concise expression of boolean properties, there
+is one short cut: a property name alone (e.g. "default") is
+exactly equivalent to "default=yes" in both definitions and queries.
+
+=head1 Syntax
+
+The lexical syntax in EBNF is given by:
+
+ Definition ::= PropertyName ( '=' Value )?
+ ( ',' PropertyName ( '=' Value )? )*
+ Query ::= PropertyQuery ( ',' PropertyQuery )*
+ PropertyQuery ::= '-'? PropertyName
+ | '?'? ( PropertyName (( '=' | '!=' ) Value)?)
+ Value ::= NumberLiteral | StringLiteral
+ StringLiteral ::= QuotedString | UnquotedString
+ QuotedString ::= '"' [^"]* '"' | "'" [^']* "'"
+ UnquotedString ::= [^{space},]+
+ NumberLiteral ::= '0' ( [0-7]* | 'x' [0-9A-Fa-f]+ ) | '-'? [1-9] [0-9]+
+ PropertyName ::= [A-Z] [A-Z0-9_]* ( '.' [A-Z] [A-Z0-9_]* )*
+
+Railroad diagrams for this grammar can be found in the
+F<crypto/property/properties.xhtml> file.
+
+=head1 HISTORY
+
+Properties were added in OpenSSL 3.0
+
+=head1 COPYRIGHT
+
+Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
+
+Licensed under the Apache License 2.0 (the "License"). You may not use
+this file except in compliance with the License. You can obtain a copy
+in the file LICENSE in the source distribution or at
+L<https://www.openssl.org/source/license.html>.
+
+=cut