Files
rippled/ValidatorList_8cpp_source.html
2025-11-10 09:36:27 -08:00

2561 lines
476 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>rippled: ValidatorList.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">rippled
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_a62226f9e3a6c7c5a3be455e2f87ae01.html">xrpld</a></li><li class="navelem"><a class="el" href="dir_c69db3203fa08a9ff994909ba6ee9783.html">app</a></li><li class="navelem"><a class="el" href="dir_2860c73e71f9ef894ba4acb1eeae5483.html">misc</a></li><li class="navelem"><a class="el" href="dir_c80815dbdc2122d1b16ef343a4cf0d47.html">detail</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">ValidatorList.cpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="preprocessor">#include &lt;xrpld/app/misc/HashRouter.h&gt;</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="preprocessor">#include &lt;xrpld/app/misc/NetworkOPs.h&gt;</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="preprocessor">#include &lt;xrpld/app/misc/ValidatorList.h&gt;</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &lt;xrpld/overlay/Overlay.h&gt;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span> </div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;xrpl/basics/FileUtilities.h&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;xrpl/basics/Slice.h&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &lt;xrpl/basics/StringUtilities.h&gt;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &lt;xrpl/basics/base64.h&gt;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &lt;xrpl/json/json_reader.h&gt;</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#include &lt;xrpl/protocol/PublicKey.h&gt;</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &lt;xrpl/protocol/STValidation.h&gt;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &lt;xrpl/protocol/digest.h&gt;</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;xrpl/protocol/jss.h&gt;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;xrpl/protocol/messages.h&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;boost/regex.hpp&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/cmath.html">cmath</a>&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/numeric.html">numeric</a>&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/shared_mutex.html">shared_mutex</a>&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceripple.html">ripple</a> {</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div>
<div class="foldopen" id="foldopen00026" data-start="{" data-end="}">
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"><a class="line" href="namespaceripple.html#a96888695e8d79474e080c334f149e30a"> 26</a></span><a class="code hl_function" href="namespaceripple.html#ac124fe6744b7fe887dec949b56b16d50">to_string</a>(<a class="code hl_enumeration" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a> disposition)</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span>{</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordflow">switch</span> (disposition)</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> {</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>:</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;accepted&quot;</span>;</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ListDisposition::expired</a>:</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;expired&quot;</span>;</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a>:</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;same_sequence&quot;</span>;</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ListDisposition::pending</a>:</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;pending&quot;</span>;</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>:</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;known_sequence&quot;</span>;</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ListDisposition::unsupported_version</a>:</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;unsupported_version&quot;</span>;</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>:</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;untrusted&quot;</span>;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ListDisposition::stale</a>:</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;stale&quot;</span>;</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>:</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;invalid&quot;</span>;</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> }</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span>}</div>
</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
<div class="foldopen" id="foldopen00052" data-start="{" data-end="}">
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aaa6c17138870cb5a2bd680c29cc4ebab"> 52</a></span><a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a3377c0090810a38667f445596bb1aaf7">ValidatorList::PublisherListStats::PublisherListStats</a>(<a class="code hl_enumeration" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a> d)</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span>{</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> ++<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">dispositions</a>[d];</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span>}</div>
</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> </div>
<div class="foldopen" id="foldopen00057" data-start="{" data-end="}">
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a34d5705410e27523336af23aa9d90ec6"> 57</a></span><a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a3377c0090810a38667f445596bb1aaf7">ValidatorList::PublisherListStats::PublisherListStats</a>(</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <a class="code hl_enumeration" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a> d,</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> key,</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <a class="code hl_enumeration" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4">PublisherStatus</a> stat,</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> seq)</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> : publisherKey(key), status(stat), sequence(seq)</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span>{</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> ++<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">dispositions</a>[d];</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span>}</div>
</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><a class="code hl_enumeration" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a></div>
<div class="foldopen" id="foldopen00068" data-start="{" data-end="}">
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc"> 68</a></span><a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">ValidatorList::PublisherListStats::bestDisposition</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keywordflow">return</span> dispositions.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/map/empty.html">empty</a>() ? <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> : dispositions.begin()-&gt;first;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span>}</div>
</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><a class="code hl_enumeration" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a></div>
<div class="foldopen" id="foldopen00075" data-start="{" data-end="}">
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a47be311fd3dc2b5a9aa0623ee493215d"> 75</a></span><a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a47be311fd3dc2b5a9aa0623ee493215d">ValidatorList::PublisherListStats::worstDisposition</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">return</span> dispositions.empty() ? <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> : dispositions.rbegin()-&gt;first;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span>}</div>
</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> </div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00082" data-start="{" data-end="}">
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02"> 82</a></span><a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02">ValidatorList::PublisherListStats::mergeDispositions</a>(</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a> <span class="keyword">const</span>&amp; src)</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span>{</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [disp, <a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>] : src.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">dispositions</a>)</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> {</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> dispositions[disp] += <a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> }</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span>}</div>
</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
<div class="foldopen" id="foldopen00091" data-start="{" data-end="}">
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a371d1aa21ff85729e2e5544f3bd63fbe"> 91</a></span><a class="code hl_function" href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a17b716a96c5adf8f12cee236370a3aa5">ValidatorList::MessageWithHash::MessageWithHash</a>(</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Message&gt;</a> <span class="keyword">const</span>&amp; message_,</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <a class="code hl_class" href="classripple_1_1base__uint.html">uint256</a> hash_,</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> num_)</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> : message(message_), hash(hash_), numVLs(num_)</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span>{</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span>}</div>
</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> </div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#adfef0eec37f112fc8a5429764f6f9080">ValidatorList::filePrefix_</a> = <span class="stringliteral">&quot;cache.&quot;</span>;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
<div class="foldopen" id="foldopen00101" data-start="{" data-end="}">
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aa4effc5014393e8a6eae30d95053df28"> 101</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#aa4effc5014393e8a6eae30d95053df28">ValidatorList::ValidatorList</a>(</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <a class="code hl_class" href="classripple_1_1ManifestCache.html">ManifestCache</a>&amp; validatorManifests,</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <a class="code hl_class" href="classripple_1_1ManifestCache.html">ManifestCache</a>&amp; publisherManifests,</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <a class="code hl_class" href="classripple_1_1TimeKeeper.html">TimeKeeper</a>&amp; timeKeeper,</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; databasePath,</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <a class="code hl_class" href="classbeast_1_1Journal.html">beast::Journal</a> j,</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::size_t&gt;</a> minimumQuorum)</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> : <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>(validatorManifests)</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> , <a class="code hl_variable" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>(publisherManifests)</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> , <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>(timeKeeper)</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> , <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a9475570d68abff79cc3392bd658bccb4">dataPath_</a>(databasePath)</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> , <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>(j)</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> , <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>(minimumQuorum.value_or(1)) <span class="comment">// Genesis ledger quorum</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> , <a class="code hl_variable" href="classripple_1_1ValidatorList.html#ac3b9186600dcd1c5326c80af17165741">minimumQuorum_</a>(minimumQuorum)</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> , <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a>(1)</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span>{</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span>}</div>
</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> </div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span><span class="keywordtype">bool</span></div>
<div class="foldopen" id="foldopen00120" data-start="{" data-end="}">
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#ac0fc258a8801e974c5d94cde492b00d3"> 120</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#ac0fc258a8801e974c5d94cde492b00d3">ValidatorList::load</a>(</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; localSigningKey,</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; configKeys,</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; publisherKeys,</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::size_t&gt;</a> listThreshold)</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span>{</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keyword">static</span> boost::regex <span class="keyword">const</span> re(</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="stringliteral">&quot;[[:space:]]*&quot;</span> <span class="comment">// skip leading whitespace</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="stringliteral">&quot;([[:alnum:]]+)&quot;</span> <span class="comment">// node identity</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="stringliteral">&quot;(?:&quot;</span> <span class="comment">// begin optional comment block</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="stringliteral">&quot;[[:space:]]+&quot;</span> <span class="comment">// (skip all leading whitespace)</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="stringliteral">&quot;(?:&quot;</span> <span class="comment">// begin optional comment</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="stringliteral">&quot;(.*[^[:space:]]+)&quot;</span> <span class="comment">// the comment</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="stringliteral">&quot;[[:space:]]*&quot;</span> <span class="comment">// (skip all trailing whitespace)</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="stringliteral">&quot;)?&quot;</span> <span class="comment">// end optional comment</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="stringliteral">&quot;)?&quot;</span> <span class="comment">// end optional comment block</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> );</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> </div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> &lt;&lt; <span class="stringliteral">&quot;Loading configured trusted validator list publisher keys&quot;</span>;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> </div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> = 0;</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> key : publisherKeys)</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> {</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; <span class="stringliteral">&quot;Processing &#39;&quot;</span> &lt;&lt; key &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keyword">auto</span> <span class="keyword">const</span> ret = <a class="code hl_function" href="namespaceripple.html#a2127aa882d06ad6aaae928d2e80fb395">strUnHex</a>(key);</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <span class="keywordflow">if</span> (!ret || !<a class="code hl_function" href="namespaceripple.html#a798e187ba7443d8f951b810a12d50976">publicKeyType</a>(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(*ret)))</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> {</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Invalid validator list publisher key: &quot;</span> &lt;&lt; key;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> }</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">auto</span> <span class="keywordtype">id</span> = <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(*ret));</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keyword">auto</span> status = <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">PublisherStatus::unavailable</a>;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> </div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(<span class="keywordtype">id</span>))</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> {</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>())</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> &lt;&lt; <span class="stringliteral">&quot;Configured validator list publisher key is revoked: &quot;</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> &lt;&lt; key;</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> status = <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">PublisherStatus::revoked</a>;</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> }</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(<span class="keywordtype">id</span>))</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> {</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>())</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> &lt;&lt; <span class="stringliteral">&quot;Duplicate validator list publisher key: &quot;</span> &lt;&lt; key;</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> }</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> </div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[id].status = status;</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> ++<a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> }</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keywordflow">if</span> (listThreshold)</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> {</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a> = *listThreshold;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="comment">// This should be enforced by Config class</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a> &gt; 0 &amp;&amp; <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a> &lt;= <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size(),</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="stringliteral">&quot;ripple::ValidatorList::load : list threshold inside range&quot;</span>);</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Validator list threshold set in configuration to &quot;</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> &lt;&lt; <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a>;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> }</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> {</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="comment">// Want truncated result when dividing an odd integer</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a> = (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size() &lt; 3)</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> ? 1 <span class="comment">//</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> : <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size() / 2 + 1;</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Validator list threshold computed as &quot;</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> &lt;&lt; <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a>;</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> }</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> </div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Loaded &quot;</span> &lt;&lt; <a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> &lt;&lt; <span class="stringliteral">&quot; keys&quot;</span>;</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="keywordflow">if</span> (localSigningKey)</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#abd28e45a701578558624ec9592f69bdf">localPubKey_</a> = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(*localSigningKey);</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> </div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="comment">// Treat local validator key as though it was listed in the config</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#abd28e45a701578558624ec9592f69bdf">localPubKey_</a>)</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> {</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="comment">// The local validator must meet listThreshold_ so the validator does</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="comment">// not ignore itself.</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keyword">auto</span> <span class="keyword">const</span> [_, inserted] =</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.insert({*<a class="code hl_variable" href="classripple_1_1ValidatorList.html#abd28e45a701578558624ec9592f69bdf">localPubKey_</a>, <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a>});</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keywordflow">if</span> (inserted)</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> {</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Added own master key &quot;</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> &lt;&lt; <a class="code hl_function" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, *<a class="code hl_variable" href="classripple_1_1ValidatorList.html#abd28e45a701578558624ec9592f69bdf">localPubKey_</a>);</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> }</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> }</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> </div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Loading configured validator keys&quot;</span>;</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> </div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> = 0;</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; n : configKeys)</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> {</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; <span class="stringliteral">&quot;Processing &#39;&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> </div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> boost::smatch <a class="code hl_enumvalue" href="namespaceripple.html#aad512dea42da4cc179f20c67de593c26ae3cc92c14a5e6dd1a7d94b6ff634d7fc">match</a>;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> </div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keywordflow">if</span> (!boost::regex_match(n, <a class="code hl_enumvalue" href="namespaceripple.html#aad512dea42da4cc179f20c67de593c26ae3cc92c14a5e6dd1a7d94b6ff634d7fc">match</a>, re))</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> {</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Malformed entry: &#39;&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> }</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> </div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keyword">auto</span> <span class="keyword">const</span> <span class="keywordtype">id</span> =</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> parseBase58&lt;PublicKey&gt;(<a class="code hl_enumvalue" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, <a class="code hl_enumvalue" href="namespaceripple.html#aad512dea42da4cc179f20c67de593c26ae3cc92c14a5e6dd1a7d94b6ff634d7fc">match</a>[1].str());</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> </div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keywordflow">if</span> (!<span class="keywordtype">id</span>)</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> {</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Invalid node identity: &quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="namespaceripple.html#aad512dea42da4cc179f20c67de593c26ae3cc92c14a5e6dd1a7d94b6ff634d7fc">match</a>[1];</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> }</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> </div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="comment">// Skip local key which was already added</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> <span class="keywordflow">if</span> (*<span class="keywordtype">id</span> == <a class="code hl_variable" href="classripple_1_1ValidatorList.html#abd28e45a701578558624ec9592f69bdf">localPubKey_</a> || *<span class="keywordtype">id</span> == localSigningKey)</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> </div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <span class="keyword">auto</span> ret = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.insert({*id, <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">listThreshold_</a>});</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> <span class="keywordflow">if</span> (!ret.second)</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> {</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Duplicate node identity: &quot;</span> &lt;&lt; <a class="code hl_enumvalue" href="namespaceripple.html#aad512dea42da4cc179f20c67de593c26ae3cc92c14a5e6dd1a7d94b6ff634d7fc">match</a>[1];</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> }</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a147f9d3a3afb1cdd7714d68202bd26ba">localPublisherList</a>.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#a1d97cceec8dbfaf845cceade47cfdbb4">list</a>.emplace_back(*<span class="keywordtype">id</span>);</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> ++<a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> }</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> </div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="comment">// Config listed keys never expire</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="comment">// set the expiration time for the newly created publisher list</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="comment">// exactly once</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> &gt; 0)</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a147f9d3a3afb1cdd7714d68202bd26ba">localPublisherList</a>.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#ab1eaafc17bdc547f85f4898d5535c6e5">validUntil</a> = TimeKeeper::time_point::max();</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> </div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Loaded &quot;</span> &lt;&lt; <a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> &lt;&lt; <span class="stringliteral">&quot; entries&quot;</span>;</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> </div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span>}</div>
</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> </div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span>boost::filesystem::path</div>
<div class="foldopen" id="foldopen00267" data-start="{" data-end="}">
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033"> 267</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">ValidatorList::getCacheFileName</a>(</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey)<span class="keyword"> const</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a9475570d68abff79cc3392bd658bccb4">dataPath_</a> / (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#adfef0eec37f112fc8a5429764f6f9080">filePrefix_</a> + <a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey));</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span>}</div>
</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> </div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span><span class="comment">// static</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span><a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="foldopen" id="foldopen00276" data-start="{" data-end="}">
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a"> 276</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">ValidatorList::buildFileData</a>(</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; pubCollection,</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <a class="code hl_class" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span>{</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">buildFileData</a>(pubKey, pubCollection, {}, j);</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span>}</div>
</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> </div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span><span class="comment">// static</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span><a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="foldopen" id="foldopen00286" data-start="{" data-end="}">
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a789233c78ed4fddac45196e4efe9f0dd"> 286</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">ValidatorList::buildFileData</a>(</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; pubCollection,</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::uint32_t&gt;</a> forceVersion,</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <a class="code hl_class" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span>{</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> value(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">rawVersion</a> == 2 || pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>.empty(),</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> <span class="stringliteral">&quot;ripple::ValidatorList::buildFileData : valid publisher list input&quot;</span>);</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <span class="keyword">auto</span> <span class="keyword">const</span> effectiveVersion =</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> forceVersion ? *forceVersion : pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">rawVersion</a>;</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> </div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> value[jss::manifest] = pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>;</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> value[jss::version] = effectiveVersion;</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> value[jss::public_key] = pubKey;</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> </div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="keywordflow">switch</span> (effectiveVersion)</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> {</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <span class="keywordflow">case</span> 1: {</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>;</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> value[jss::blob] = <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawBlob;</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> value[jss::signature] = <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawSignature;</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="comment">// This is only possible if &quot;downgrading&quot; a v2 UNL to v1, for</span></div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="comment">// example for the /vl/ endpoint.</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest &amp;&amp;</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> *<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest != pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>)</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> value[jss::manifest] = *<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest;</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> }</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="keywordflow">case</span> 2: {</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> blobs(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> </div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keyword">auto</span> add = [&amp;blobs, &amp;outerManifest = pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>](</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherList.html">PublisherList</a> <span class="keyword">const</span>&amp; pubList) {</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> <span class="keyword">auto</span>&amp; blob = blobs.<a class="code hl_function" href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">append</a>(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> blob[jss::blob] = pubList.rawBlob;</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> blob[jss::signature] = pubList.rawSignature;</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="keywordflow">if</span> (pubList.rawManifest &amp;&amp;</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> *pubList.rawManifest != outerManifest)</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> blob[jss::manifest] = *pubList.rawManifest;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> };</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> </div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> add(pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>);</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [_, <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">pending</a>] : pubCollection.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>)</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> {</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> (void)_;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> add(<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">pending</a>);</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> }</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> </div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> value[jss::blobs_v2] = std::move(blobs);</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> }</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> JLOG(j.<a class="code hl_function" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>())</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> &lt;&lt; <span class="stringliteral">&quot;Invalid VL version provided: &quot;</span> &lt;&lt; effectiveVersion;</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> value = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4ea7d9899633b4409bd3fc107e6737f8391">Json::nullValue</a>;</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> }</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> </div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="keywordflow">return</span> value;</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span>}</div>
</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> </div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00350" data-start="{" data-end="}">
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb"> 350</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb">ValidatorList::cacheValidatorFile</a>(</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp; lock,</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey)<span class="keyword"> const</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a9475570d68abff79cc3392bd658bccb4">dataPath_</a>.empty())</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> </div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> boost::filesystem::path <span class="keyword">const</span> filename = <a class="code hl_function" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">getCacheFileName</a>(lock, pubKey);</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> </div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> boost::system::error_code ec;</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> </div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> value =</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">buildFileData</a>(<a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey), <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/at.html">at</a>(pubKey), <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>);</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <span class="comment">// rippled should be the only process writing to this file, so</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <span class="comment">// if it ever needs to be read, it is not expected to change externally, so</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> <span class="comment">// delay the refresh as long as possible: 24 hours. (See also</span></div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> <span class="comment">// `ValidatorSite::missingSite()`)</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> value[jss::refresh_interval] = 24 * 60;</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> </div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <a class="code hl_function" href="namespaceripple.html#ae18870f8d8eaa17b582f609cc486aa04">writeFileContents</a>(ec, filename, value.<a class="code hl_function" href="classJson_1_1Value.html#a3696d34c1a1833742b4bf8e5b247f125">toStyledString</a>());</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> </div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> {</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> <span class="comment">// Log and ignore any file I/O exceptions</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Problem writing &quot;</span> &lt;&lt; filename &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; ec.value()</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; ec.message();</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> }</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span>}</div>
</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> </div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span><span class="comment">// static</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a></div>
<div class="foldopen" id="foldopen00381" data-start="{" data-end="}">
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691"> 381</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ValidatorList::parseBlobs</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version, <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> <span class="keyword">const</span>&amp; body)</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span>{</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> result;</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> <span class="keywordflow">switch</span> (version)</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> {</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <span class="keywordflow">case</span> 1: {</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="keywordflow">if</span> (!body.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::blob) || !body[jss::blob].<a class="code hl_function" href="classJson_1_1Value.html#a71e1f82cf1c3eaf969d400dcffb163a6">isString</a>() ||</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> !body.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::signature) ||</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> !body[jss::signature].<a class="code hl_function" href="classJson_1_1Value.html#a71e1f82cf1c3eaf969d400dcffb163a6">isString</a>() ||</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <span class="comment">// If the v2 field is present, the VL is malformed</span></div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> body.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::blobs_v2))</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> <span class="keywordflow">return</span> {};</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> <a class="code hl_struct" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a>&amp; info = result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a> = body[jss::blob].<a class="code hl_function" href="classJson_1_1Value.html#ab0d86bf425efefd03513e8dbfaca317b">asString</a>();</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a> = body[jss::signature].<a class="code hl_function" href="classJson_1_1Value.html#ab0d86bf425efefd03513e8dbfaca317b">asString</a>();</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>() == 1,</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="stringliteral">&quot;ripple::ValidatorList::parseBlobs : single element result&quot;</span>);</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> }</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> <span class="comment">// Treat unknown versions as if they&#39;re the latest version. This</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <span class="comment">// will likely break a bunch of unit tests each time we introduce a</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> <span class="comment">// new version, so don&#39;t do it casually. Note that the version is</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> <span class="comment">// validated elsewhere.</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <span class="keywordflow">case</span> 2:</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> <span class="keywordflow">default</span>: {</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> <span class="keywordflow">if</span> (!body.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::blobs_v2) ||</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> !body[jss::blobs_v2].<a class="code hl_function" href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">isArray</a>() ||</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> body[jss::blobs_v2].<a class="code hl_function" href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">size</a>() &gt; <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aa0c6d081fe5e626dc63a9cd949de2d85">maxSupportedBlobs</a> ||</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> <span class="comment">// If any of the v1 fields are present, the VL is malformed</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> body.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::blob) || body.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::signature))</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> <span class="keywordflow">return</span> {};</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; blobs = body[jss::blobs_v2];</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(blobs.size());</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; blobInfo : blobs)</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> {</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <span class="keywordflow">if</span> (!blobInfo.isObject() ||</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> !blobInfo.isMember(jss::signature) ||</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> !blobInfo[jss::signature].isString() ||</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> !blobInfo.isMember(jss::blob) ||</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> !blobInfo[jss::blob].isString())</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> <span class="keywordflow">return</span> {};</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <a class="code hl_struct" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a>&amp; info = result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a> = blobInfo[jss::blob].asString();</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a> = blobInfo[jss::signature].asString();</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> <span class="keywordflow">if</span> (blobInfo.isMember(jss::manifest))</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> {</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keywordflow">if</span> (!blobInfo[jss::manifest].isString())</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="keywordflow">return</span> {};</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> = blobInfo[jss::manifest].asString();</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> }</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> }</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>() == blobs.size(),</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> <span class="stringliteral">&quot;ripple::ValidatorList::parseBlobs(version, Jason::Value) : &quot;</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> <span class="stringliteral">&quot;result size matches&quot;</span>);</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> }</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> }</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span>}</div>
</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span><span class="comment">// static</span></div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a></div>
<div class="foldopen" id="foldopen00444" data-start="{" data-end="}">
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a00f7133196028a7df7331c972abf9169"> 444</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ValidatorList::parseBlobs</a>(protocol::TMValidatorList <span class="keyword">const</span>&amp; body)</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span>{</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> <span class="keywordflow">return</span> {{body.blob(), body.signature(), {}}};</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span>}</div>
</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> </div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span><span class="comment">// static</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a></div>
<div class="foldopen" id="foldopen00451" data-start="{" data-end="}">
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a4abcd1b16fada4897130485669234083"> 451</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ValidatorList::parseBlobs</a>(protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; body)</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span>{</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> <span class="keywordflow">if</span> (body.blobs_size() &gt; <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aa0c6d081fe5e626dc63a9cd949de2d85">maxSupportedBlobs</a>)</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <span class="keywordflow">return</span> {};</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> result;</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(body.blobs_size());</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; blob : body.blobs())</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> {</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <a class="code hl_struct" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a>&amp; info = result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a> = blob.blob();</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a> = blob.signature();</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> <span class="keywordflow">if</span> (blob.has_manifest())</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> {</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> info.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> = blob.manifest();</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> }</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> }</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> result.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>() == body.blobs_size(),</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="stringliteral">&quot;ripple::ValidatorList::parseBlobs(TMValidatorList) : result size &quot;</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> <span class="stringliteral">&quot;match&quot;</span>);</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span>}</div>
</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> </div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span><a class="code hl_function" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; largeMsg,</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize,</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> begin,</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> end);</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> </div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen00483" data-start="{" data-end="}">
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"><a class="line" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076"> 483</a></span><a class="code hl_function" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">splitMessage</a>(</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; largeMsg,</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize,</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> begin = 0,</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> end = 0)</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span>{</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keywordflow">if</span> (begin == 0 &amp;&amp; end == 0)</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> end = largeMsg.blobs_size();</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> XRPL_ASSERT(begin &lt; end, <span class="stringliteral">&quot;ripple::splitMessage : valid inputs&quot;</span>);</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <span class="keywordflow">if</span> (end &lt;= begin)</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> </div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> <span class="keyword">auto</span> mid = (begin + end) / 2;</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> <span class="comment">// The parts function will do range checking</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <span class="comment">// Use two separate calls to ensure deterministic order</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <span class="keyword">auto</span> result = <a class="code hl_function" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(messages, largeMsg, maxSize, begin, mid);</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="keywordflow">return</span> result + <a class="code hl_function" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(messages, largeMsg, maxSize, mid, end);</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span>}</div>
</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> </div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen00504" data-start="{" data-end="}">
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"><a class="line" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0"> 504</a></span><a class="code hl_function" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; largeMsg,</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize,</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> begin,</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> end)</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span>{</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordflow">if</span> (end &lt;= begin)</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> <span class="keywordflow">if</span> (end - begin == 1)</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> {</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> protocol::TMValidatorList smallMsg;</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> smallMsg.set_version(1);</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> smallMsg.set_manifest(largeMsg.manifest());</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> </div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; blob = largeMsg.blobs(begin);</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> smallMsg.set_blob(blob.blob());</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> smallMsg.set_signature(blob.signature());</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <span class="comment">// This is only possible if &quot;downgrading&quot; a v2 UNL to v1.</span></div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keywordflow">if</span> (blob.has_manifest())</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> smallMsg.set_manifest(blob.manifest());</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> </div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <a class="code hl_function" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(smallMsg) &lt;= <a class="code hl_variable" href="namespaceripple.html#ac6313681c41516db0a8f8829e1d7b753">maximiumMessageSize</a>,</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> <span class="stringliteral">&quot;ripple::splitMessageParts : maximum message size&quot;</span>);</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> </div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::make_shared&lt;Message&gt;</a>(smallMsg, protocol::mtVALIDATORLIST),</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> <a class="code hl_function" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(smallMsg),</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> 1);</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> <span class="keywordflow">return</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/back.html">back</a>().numVLs;</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> }</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> {</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;protocol::TMValidatorListCollection&gt;</a> smallMsg;</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> smallMsg.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">emplace</a>();</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> smallMsg-&gt;set_version(largeMsg.version());</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> smallMsg-&gt;set_manifest(largeMsg.manifest());</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> </div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> <span class="keywordflow">for</span> (<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> i = begin; i &lt; end; ++i)</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> {</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> *smallMsg-&gt;add_blobs() = largeMsg.blobs(i);</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> }</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> </div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(*smallMsg) &gt; maxSize)</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> {</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> <span class="comment">// free up the message space</span></div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> smallMsg.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/utility/optional/reset.html">reset</a>();</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">splitMessage</a>(messages, largeMsg, maxSize, begin, end);</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> }</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> {</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::make_shared&lt;Message&gt;</a>(</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> *smallMsg, protocol::mtVALIDATORLISTCOLLECTION),</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> <a class="code hl_function" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(*smallMsg),</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> smallMsg-&gt;blobs_size());</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <span class="keywordflow">return</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/back.html">back</a>().numVLs;</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> }</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> }</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span>}</div>
</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> </div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span><span class="comment">// Build a v1 protocol message using only the current VL</span></div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen00569" data-start="{" data-end="}">
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"><a class="line" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0"> 569</a></span><a class="code hl_function" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <a class="code hl_struct" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a> <span class="keyword">const</span>&amp; currentBlob,</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize)</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span>{</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>(),</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="stringliteral">&quot;ripple::buildValidatorListMessage(ValidatorBlobInfo) : empty messages &quot;</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> <span class="stringliteral">&quot;input&quot;</span>);</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> protocol::TMValidatorList msg;</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a> =</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> currentBlob.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> ? *currentBlob.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> : rawManifest;</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> <span class="keyword">auto</span> <span class="keyword">const</span> version = 1;</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> msg.set_manifest(<a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>);</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> msg.set_blob(currentBlob.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a>);</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> msg.set_signature(currentBlob.<a class="code hl_variable" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a>);</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> <span class="comment">// Override the version</span></div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> msg.set_version(version);</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> </div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> <a class="code hl_function" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(msg) &lt;= <a class="code hl_variable" href="namespaceripple.html#ac6313681c41516db0a8f8829e1d7b753">maximiumMessageSize</a>,</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> <span class="stringliteral">&quot;ripple::buildValidatorListMessage(ValidatorBlobInfo) : maximum &quot;</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> <span class="stringliteral">&quot;message size&quot;</span>);</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::make_shared&lt;Message&gt;</a>(msg, protocol::mtVALIDATORLIST),</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> <a class="code hl_function" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(msg),</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> 1);</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <span class="keywordflow">return</span> 1;</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span>}</div>
</div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> </div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span><span class="comment">// Build a v2 protocol message using all the VLs with sequence larger than the</span></div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span><span class="comment">// peer&#39;s</span></div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen00604" data-start="{" data-end="}">
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"><a class="line" href="namespaceripple.html#a7e0985fab0c0a13e1bb91f6d8ed4830f"> 604</a></span><a class="code hl_function" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize)</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span>{</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>(),</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> <span class="stringliteral">&quot;ripple::buildValidatorListMessage(std::map&lt;std::size_t, &quot;</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="stringliteral">&quot;ValidatorBlobInfo&gt;) : empty messages input&quot;</span>);</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> protocol::TMValidatorListCollection msg;</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> <span class="keyword">auto</span> <span class="keyword">const</span> version = rawVersion &lt; 2 ? 2 : rawVersion;</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> msg.set_version(version);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> msg.set_manifest(rawManifest);</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> </div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, blobInfo] : blobInfos)</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> {</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="keywordflow">if</span> (sequence &lt;= peerSequence)</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> protocol::ValidatorBlobInfo&amp; blob = *msg.add_blobs();</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> blob.set_blob(blobInfo.blob);</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> blob.set_signature(blobInfo.signature);</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="keywordflow">if</span> (blobInfo.manifest)</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> blob.set_manifest(*blobInfo.manifest);</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> }</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> msg.blobs_size() &gt; 0,</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> <span class="stringliteral">&quot;ripple::buildValidatorListMessage(std::map&lt;std::size_t, &quot;</span></div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> <span class="stringliteral">&quot;ValidatorBlobInfo&gt;) : minimum message blobs&quot;</span>);</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(msg) &gt; maxSize)</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> {</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> <span class="comment">// split into smaller messages</span></div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">splitMessage</a>(messages, msg, maxSize);</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> }</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> {</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::make_shared&lt;Message&gt;</a>(msg, protocol::mtVALIDATORLISTCOLLECTION),</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> <a class="code hl_function" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(msg),</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> msg.blobs_size());</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> <span class="keywordflow">return</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/back.html">back</a>().numVLs;</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> }</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span>}</div>
</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> </div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span>[[nodiscard]]</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span><span class="comment">// static</span></div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair&lt;std::size_t, std::size_t&gt;</a></div>
<div class="foldopen" id="foldopen00653" data-start="{" data-end="}">
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e"> 653</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e">ValidatorList::buildValidatorListMessages</a>(</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> messageVersion,</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize <span class="comment">/*= maximiumMessageSize*/</span>)</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span>{</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> !blobInfos.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/map/empty.html">empty</a>(),</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> <span class="stringliteral">&quot;ripple::ValidatorList::buildValidatorListMessages : empty messages &quot;</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="stringliteral">&quot;input&quot;</span>);</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; [currentSeq, currentBlob] = *blobInfos.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/map/begin.html">begin</a>();</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> <span class="keyword">auto</span> numVLs = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/accumulate.html">std::accumulate</a>(</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>(),</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>(),</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> 0,</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> [](<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> total, <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1MessageWithHash.html">MessageWithHash</a> <span class="keyword">const</span>&amp; m) {</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> return total + m.numVLs;</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> });</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> <span class="keywordflow">if</span> (messageVersion == 2 &amp;&amp; peerSequence &lt; maxSequence)</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> {</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> <span class="comment">// Version 2</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> <span class="keywordflow">if</span> (messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> {</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> numVLs = <a class="code hl_function" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> messages,</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> peerSequence,</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> rawVersion,</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> rawManifest,</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> blobInfos,</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> maxSize);</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keywordflow">if</span> (messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="comment">// No message was generated. Create an empty placeholder so we</span></div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="comment">// dont&#39; repeat the work later.</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> }</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> </div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> <span class="comment">// Don&#39;t send it next time.</span></div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="keywordflow">return</span> {maxSequence, numVLs};</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> }</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (messageVersion == 1 &amp;&amp; peerSequence &lt; currentSeq)</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> {</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <span class="comment">// Version 1</span></div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> <span class="keywordflow">if</span> (messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> {</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> numVLs = <a class="code hl_function" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> messages,</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> rawVersion,</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> currentBlob.manifest ? *currentBlob.manifest : rawManifest,</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> currentBlob,</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> maxSize);</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="keywordflow">if</span> (messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <span class="comment">// No message was generated. Create an empty placeholder so we</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> <span class="comment">// dont&#39; repeat the work later.</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> }</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> </div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> <span class="comment">// Don&#39;t send it next time.</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> <span class="keywordflow">return</span> {currentSeq, numVLs};</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> }</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> <span class="keywordflow">return</span> {0, 0};</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span>}</div>
</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> </div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span><span class="comment">// static</span></div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00721" data-start="{" data-end="}">
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a19844edbd01319f6f0ddca1c94def75f"> 721</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">ValidatorList::sendValidatorList</a>(</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> <a class="code hl_class" href="classripple_1_1Peer.html">Peer</a>&amp; peer,</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <a class="code hl_class" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> <a class="code hl_class" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span>{</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <span class="keyword">const</span> messageVersion =</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> peer.<a class="code hl_function" href="classripple_1_1Peer.html#a1781d176803366238413407a0815124a">supportsFeature</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1">ProtocolFeature::ValidatorList2Propagation</a>) ? 2</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> : peer.<a class="code hl_function" href="classripple_1_1Peer.html#a1781d176803366238413407a0815124a">supportsFeature</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b">ProtocolFeature::ValidatorListPropagation</a>) ? 1</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> : 0;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="keywordflow">if</span> (!messageVersion)</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> <span class="keyword">auto</span> <span class="keyword">const</span> [newPeerSequence, numVLs] = <a class="code hl_function" href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e">buildValidatorListMessages</a>(</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> messageVersion,</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> peerSequence,</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> maxSequence,</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> rawVersion,</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> rawManifest,</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> blobInfos,</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> messages);</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <span class="keywordflow">if</span> (newPeerSequence)</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> {</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> !messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>(),</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> <span class="stringliteral">&quot;ripple::ValidatorList::sendValidatorList : non-empty messages &quot;</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <span class="stringliteral">&quot;input&quot;</span>);</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> <span class="comment">// Don&#39;t send it next time.</span></div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> peer.<a class="code hl_function" href="classripple_1_1Peer.html#adc1069de1a8a5ff1364003caf00bb139">setPublisherListSequence</a>(publisherKey, newPeerSequence);</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> </div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> <span class="keywordtype">bool</span> sent = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; message : messages)</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> {</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> <span class="keywordflow">if</span> (message.message)</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> {</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> peer.<a class="code hl_function" href="classripple_1_1Peer.html#a3c89dbf867ba814f0bf2417757d5a0f4">send</a>(message.message);</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> hashRouter.<a class="code hl_function" href="classripple_1_1HashRouter.html#a86c862f1b0722d061b3724ff34a53572">addSuppressionPeer</a>(message.hash, peer.<a class="code hl_function" href="classripple_1_1Peer.html#aee121254a095838be2d8040bfdfacc79">id</a>());</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> sent = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> }</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> }</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> <span class="comment">// The only way sent wil be false is if the messages was too big, and</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> <span class="comment">// thus there will only be one entry without a message</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> sent || messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>() == 1,</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="stringliteral">&quot;ripple::ValidatorList::sendValidatorList : sent or one message&quot;</span>);</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> <span class="keywordflow">if</span> (sent)</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> {</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="keywordflow">if</span> (messageVersion &gt; 1)</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> JLOG(j.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> &lt;&lt; <span class="stringliteral">&quot;Sent &quot;</span> &lt;&lt; messages.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>()</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> &lt;&lt; <span class="stringliteral">&quot; validator list collection(s) containing &quot;</span> &lt;&lt; numVLs</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> &lt;&lt; <span class="stringliteral">&quot; validator list(s) for &quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey)</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> &lt;&lt; <span class="stringliteral">&quot; with sequence range &quot;</span> &lt;&lt; peerSequence &lt;&lt; <span class="stringliteral">&quot;, &quot;</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> &lt;&lt; newPeerSequence &lt;&lt; <span class="stringliteral">&quot; to &quot;</span> &lt;&lt; peer.<a class="code hl_function" href="classripple_1_1Peer.html#a306013e6a8c450fc13ee57adfd1a3a37">fingerprint</a>();</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> {</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> numVLs == 1,</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <span class="stringliteral">&quot;ripple::ValidatorList::sendValidatorList : one validator &quot;</span></div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> <span class="stringliteral">&quot;list&quot;</span>);</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> JLOG(j.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> &lt;&lt; <span class="stringliteral">&quot;Sent validator list for &quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey)</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> &lt;&lt; <span class="stringliteral">&quot; with sequence &quot;</span> &lt;&lt; newPeerSequence &lt;&lt; <span class="stringliteral">&quot; to &quot;</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> &lt;&lt; peer.<a class="code hl_function" href="classripple_1_1Peer.html#a306013e6a8c450fc13ee57adfd1a3a37">fingerprint</a>();</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> }</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> }</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> }</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span>}</div>
</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> </div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span><span class="comment">// static</span></div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00797" data-start="{" data-end="}">
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917"> 797</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">ValidatorList::sendValidatorList</a>(</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> <a class="code hl_class" href="classripple_1_1Peer.html">Peer</a>&amp; peer,</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> <a class="code hl_class" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> <a class="code hl_class" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span>{</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a> messages;</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">sendValidatorList</a>(</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> peer,</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> peerSequence,</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> publisherKey,</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> maxSequence,</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> rawVersion,</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> rawManifest,</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> blobInfos,</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> messages,</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> hashRouter,</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> j);</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span>}</div>
</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> </div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span><span class="comment">// static</span></div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00824" data-start="{" data-end="}">
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5"> 824</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">ValidatorList::buildBlobInfos</a>(</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a>&amp; blobInfos,</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; lists)</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span>{</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = lists.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>;</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; remaining = lists.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>;</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> blobInfos[<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.sequence] = {</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawBlob, <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawSignature, <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest};</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, vl] : remaining)</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> {</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> blobInfos[sequence] = {vl.rawBlob, vl.rawSignature, vl.rawManifest};</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> }</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span>}</div>
</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> </div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span><span class="comment">// static</span></div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a></div>
<div class="foldopen" id="foldopen00840" data-start="{" data-end="}">
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a17b4fae898c2fe1c40471536133753d3"> 840</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">ValidatorList::buildBlobInfos</a>(</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; lists)</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span>{</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> result;</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">buildBlobInfos</a>(result, lists);</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span>}</div>
</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> </div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span><span class="comment">// static</span></div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen00850" data-start="{" data-end="}">
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139"> 850</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139">ValidatorList::broadcastBlobs</a>(</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; lists,</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> <a class="code hl_class" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> <a class="code hl_class" href="classripple_1_1Overlay.html">Overlay</a>&amp; overlay,</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> <a class="code hl_class" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> <a class="code hl_class" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span>{</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> <span class="keyword">auto</span> <span class="keyword">const</span> toSkip = hashRouter.<a class="code hl_function" href="classripple_1_1HashRouter.html#a29980c0f77dcc002ef322c23080f3266">shouldRelay</a>(hash);</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> </div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> <span class="keywordflow">if</span> (toSkip)</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> {</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> <span class="comment">// We don&#39;t know what messages or message versions we&#39;re sending</span></div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> <span class="comment">// until we examine our peer&#39;s properties. Build the message(s) on</span></div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="comment">// demand, but reuse them when possible.</span></div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> </div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> <span class="comment">// This will hold a v1 message with only the current VL if we have</span></div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> <span class="comment">// any peers that don&#39;t support v2</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a> messages1;</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> <span class="comment">// This will hold v2 messages indexed by the peer&#39;s</span></div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="comment">// `publisherListSequence`. For each `publisherListSequence`, we&#39;ll</span></div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> <span class="comment">// only send the VLs with higher sequences.</span></div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&gt;</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> messages2;</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> <span class="comment">// If any peers are found that are worth considering, this list will</span></div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> <span class="comment">// be built to hold info for all of the valid VLs.</span></div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> blobInfos;</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> </div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> XRPL_ASSERT(</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> lists.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#aad9dd39b951a5b4a42bba0593ac16289">sequence</a> == maxSequence ||</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> lists.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>.count(maxSequence) == 1,</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> <span class="stringliteral">&quot;ripple::ValidatorList::broadcastBlobs : valid sequence&quot;</span>);</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> <span class="comment">// Can&#39;t use overlay.foreach here because we need to modify</span></div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> <span class="comment">// the peer, and foreach provides a const&amp;</span></div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; peer : overlay.<a class="code hl_function" href="classripple_1_1Overlay.html#a516f776bf7ff0dbf6a8be71b7355e5be">getActivePeers</a>())</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> {</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> <span class="keywordflow">if</span> (toSkip-&gt;count(peer-&gt;id()) == 0)</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> {</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> <span class="keyword">auto</span> <span class="keyword">const</span> peerSequence =</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> peer-&gt;publisherListSequence(publisherKey).value_or(0);</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span> <span class="keywordflow">if</span> (peerSequence &lt; maxSequence)</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> {</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> <span class="keywordflow">if</span> (blobInfos.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/map/empty.html">empty</a>())</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">buildBlobInfos</a>(blobInfos, lists);</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> <span class="keyword">auto</span> <span class="keyword">const</span> v2 = peer-&gt;supportsFeature(</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> <a class="code hl_enumvalue" href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1">ProtocolFeature::ValidatorList2Propagation</a>);</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">sendValidatorList</a>(</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> *peer,</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> peerSequence,</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> publisherKey,</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> maxSequence,</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> lists.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">rawVersion</a>,</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> lists.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>,</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> blobInfos,</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> v2 ? messages2[peerSequence] : messages1,</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> hashRouter,</div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> j);</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span> <span class="comment">// Even if the peer doesn&#39;t support the messages,</span></div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span> <span class="comment">// suppress it so it&#39;ll be ignored next time.</span></div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> hashRouter.addSuppressionPeer(hash, peer-&gt;id());</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> }</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> }</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span> }</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> }</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"> 915</span>}</div>
</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> </div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span><a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="foldopen" id="foldopen00918" data-start="{" data-end="}">
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a7bdc06d223ec320799b7b09fe38fb16a"> 918</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a7bdc06d223ec320799b7b09fe38fb16a">ValidatorList::applyListsAndBroadcast</a>(</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>,</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobs,</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> <a class="code hl_class" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> <a class="code hl_class" href="classripple_1_1Overlay.html">Overlay</a>&amp; overlay,</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> <a class="code hl_class" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> <a class="code hl_class" href="classripple_1_1NetworkOPs.html">NetworkOPs</a>&amp; networkOPs)</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span>{</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> <span class="keyword">auto</span> <span class="keyword">const</span> result =</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110">applyLists</a>(<a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>, version, blobs, std::move(siteUri), hash);</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span> <span class="keyword">auto</span> <span class="keyword">const</span> disposition = result.bestDisposition();</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> </div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> <span class="keywordflow">if</span> (disposition == <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>)</div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> {</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> <span class="keywordtype">bool</span> good = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span> </div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> <span class="comment">// localPublisherList never expires, so localPublisherList is excluded</span></div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span> <span class="comment">// from the below check.</span></div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [_, listCollection] : <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span> {</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> <span class="keywordflow">if</span> (listCollection.status != <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> {</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> good = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> }</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> }</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> <span class="keywordflow">if</span> (good)</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> {</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> networkOPs.<a class="code hl_function" href="classripple_1_1NetworkOPs.html#ace637a61664a15f70bc362f2ad1101e9">clearUNLBlocked</a>();</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span> }</div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> }</div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> <span class="keywordtype">bool</span> broadcast = disposition &lt;= <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>;</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> </div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> <span class="comment">// this function is only called for PublicKeys which are not specified</span></div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> <span class="comment">// in the config file (Note: Keys specified in the local config file are</span></div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> <span class="comment">// stored in ValidatorList::localPublisherList data member).</span></div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span> <span class="keywordflow">if</span> (broadcast &amp;&amp; result.status &lt;= <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e">PublisherStatus::expired</a> &amp;&amp;</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> result.publisherKey &amp;&amp;</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[*result.publisherKey].maxSequence)</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> {</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; pubCollection = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[*result.publisherKey];</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> </div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139">broadcastBlobs</a>(</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> *result.publisherKey,</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> pubCollection,</div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> *pubCollection.maxSequence,</div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno"> 966</span> hash,</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> overlay,</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> hashRouter,</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>);</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> }</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> </div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span>}</div>
</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> </div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span><a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="foldopen" id="foldopen00976" data-start="{" data-end="}">
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110"> 976</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110">ValidatorList::applyLists</a>(</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>,</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobs,</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;uint256&gt;</a> <span class="keyword">const</span>&amp; hash <span class="comment">/* = {} */</span>)</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span>{</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> <span class="keywordflow">if</span> (<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/count.html">std::count</a>(</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/begin.html">std::begin</a>(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#afb78f6ff830cea855542f3ad78a587b1">supportedListVersions</a>),</div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/end.html">std::end</a>(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#afb78f6ff830cea855542f3ad78a587b1">supportedListVersions</a>),</div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> version) != 1)</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> <span class="keywordflow">return</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ListDisposition::unsupported_version</a>};</div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> </div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> </div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a> result;</div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; blobInfo : blobs)</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"> 993</span> {</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> <span class="keyword">auto</span> stats = <a class="code hl_function" href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c">applyList</a>(</div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>,</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> blobInfo.manifest,</div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> blobInfo.blob,</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> blobInfo.signature,</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> version,</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> siteUri,</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> hash,</div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span> lock);</div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> </div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> <span class="keywordflow">if</span> (stats.bestDisposition() &lt; result.<a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">bestDisposition</a>() ||</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> (stats.bestDisposition() == result.<a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">bestDisposition</a>() &amp;&amp;</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> stats.sequence &gt; result.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aa37066f4c4bc231ad60e6f751e56bf05">sequence</a>))</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> {</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span> stats.mergeDispositions(result);</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span> result = std::move(stats);</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> }</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> result.<a class="code hl_function" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02">mergeDispositions</a>(stats);</div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> }</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> </div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> <span class="comment">// Clean up the collection, because some of the processing may have made it</span></div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span> <span class="comment">// inconsistent</span></div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span> <span class="keywordflow">if</span> (result.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a> &amp;&amp; <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(*result.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a>))</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> {</div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span> <span class="keyword">auto</span>&amp; pubCollection = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[*result.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a>];</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> <span class="keyword">auto</span>&amp; remaining = pubCollection.remaining;</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = pubCollection.current;</div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = remaining.begin(); iter != remaining.end();)</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> {</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> <span class="keyword">auto</span> next = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter);</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span> next == remaining.end() || next-&gt;first &gt; iter-&gt;first,</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> <span class="stringliteral">&quot;ripple::ValidatorList::applyLists : next is valid&quot;</span>);</div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span> <span class="keywordflow">if</span> (iter-&gt;first &lt;= <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.sequence ||</div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> (next != remaining.end() &amp;&amp;</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> next-&gt;second.validFrom &lt;= iter-&gt;second.validFrom))</div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> {</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> iter = remaining.erase(iter);</div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> }</div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> {</div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> iter = next;</div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> }</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> }</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> </div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb">cacheValidatorFile</a>(lock, *result.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a>);</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> </div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> pubCollection.fullHash = <a class="code hl_function" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(pubCollection);</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> </div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> result.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aa37066f4c4bc231ad60e6f751e56bf05">sequence</a> = *pubCollection.maxSequence;</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> }</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> </div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span>}</div>
</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> </div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen01052" data-start="{" data-end="}">
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3"> 1052</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3">ValidatorList::updatePublisherList</a>(</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherList.html">PublisherList</a> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>,</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; oldList,</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp;)</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span>{</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span> <span class="comment">// Update keyListings_ for added and removed keys</span></div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; publisherList = <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.list;</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; manifests = <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.manifests;</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> <span class="keyword">auto</span> iNew = publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>();</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> <span class="keyword">auto</span> iOld = oldList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>();</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> <span class="keywordflow">while</span> (iNew != publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() || iOld != oldList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>())</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> {</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> <span class="keywordflow">if</span> (iOld == oldList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() ||</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> (iNew != publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() &amp;&amp; *iNew &lt; *iOld))</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> {</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> <span class="comment">// Increment list count for added keys</span></div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> ++<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iNew];</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> ++iNew;</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> }</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> iNew == publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() ||</div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> (iOld != oldList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() &amp;&amp; *iOld &lt; *iNew))</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> {</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> <span class="comment">// Decrement list count for removed keys</span></div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iOld] &lt;= 1)</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.erase(*iOld);</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> --<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iOld];</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> ++iOld;</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> }</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> {</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> ++iNew;</div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> ++iOld;</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> }</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> }</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> </div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> <span class="keywordflow">if</span> (publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> {</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;No validator keys included in valid list&quot;</span>;</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> }</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> </div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; valManifest : manifests)</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> {</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> <span class="keyword">auto</span> m = <a class="code hl_function" href="namespaceripple.html#a12a05294e1d72bbcf9718dc99195ad19">deserializeManifest</a>(<a class="code hl_function" href="namespaceripple.html#a44b8469c9a47739d50dd628e8a4bd561">base64_decode</a>(valManifest));</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> </div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> <span class="keywordflow">if</span> (!m || !<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.count(m-&gt;masterKey))</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> {</div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;List for &quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey)</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> &lt;&lt; <span class="stringliteral">&quot; contained untrusted validator manifest&quot;</span>;</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> }</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> </div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> <span class="keywordflow">if</span> (<span class="keyword">auto</span> <span class="keyword">const</span> r = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">applyManifest</a>(std::move(*m));</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> r == <a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ManifestDisposition::invalid</a>)</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> {</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;List for &quot;</span> &lt;&lt; <a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey)</div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> &lt;&lt; <span class="stringliteral">&quot; contained invalid validator manifest&quot;</span>;</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> }</div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> }</div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span>}</div>
</div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> </div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span><a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="foldopen" id="foldopen01116" data-start="{" data-end="}">
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c"> 1116</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c">ValidatorList::applyList</a>(</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; globalManifest,</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; localManifest,</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; blob,</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; signature,</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;uint256&gt;</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp; lock)</div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span>{</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> <span class="keyword">using namespace </span>std::string_literals;</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> </div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> list;</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a> = localManifest ? *localManifest : globalManifest;</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> <span class="keyword">auto</span> m = <a class="code hl_function" href="namespaceripple.html#a12a05294e1d72bbcf9718dc99195ad19">deserializeManifest</a>(<a class="code hl_function" href="namespaceripple.html#a44b8469c9a47739d50dd628e8a4bd561">base64_decode</a>(<a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>));</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> <span class="keywordflow">if</span> (!m)</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> {</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;UNL manifest cannot be deserialized&quot;</span>;</div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> <span class="keywordflow">return</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>};</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> }</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> </div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> <span class="keyword">auto</span> [result, pubKeyOpt] =</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#ac74567517641b42d1cac0852f99a7814">verify</a>(lock, list, std::move(*m), blob, signature);</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> </div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> <span class="keywordflow">if</span> (!pubKeyOpt)</div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> {</div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>())</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> &lt;&lt; <span class="stringliteral">&quot;UNL manifest is signed with an unrecognized master public key&quot;</span>;</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> <span class="keywordflow">return</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{result};</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> }</div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> </div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="namespaceripple.html#a798e187ba7443d8f951b810a12d50976">publicKeyType</a>(*pubKeyOpt))</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> {</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> <span class="comment">// This is an impossible situation because we will never load an</span></div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> <span class="comment">// invalid public key type (see checks in `ValidatorList::load`) however</span></div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> <span class="comment">// we can only arrive here if the key used by the manifest matched one</span></div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> <span class="comment">// of the loaded keys</span></div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> <span class="comment">// LCOV_EXCL_START</span></div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> UNREACHABLE(</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> <span class="stringliteral">&quot;ripple::ValidatorList::applyList : invalid public key type&quot;</span>);</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> <span class="keywordflow">return</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{result};</div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> <span class="comment">// LCOV_EXCL_STOP</span></div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> }</div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> </div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> pubKey = *pubKeyOpt;</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> <span class="keywordflow">if</span> (result &gt; <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ListDisposition::pending</a>)</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> {</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(pubKey))</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> {</div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; pubCollection = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[pubKey];</div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> <span class="keywordflow">if</span> (pubCollection.maxSequence &amp;&amp;</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> (result == <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a> ||</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> result == <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>))</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> {</div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> <span class="comment">// We&#39;ve seen something valid list for this publisher</span></div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> <span class="comment">// already, so return what we know about it.</span></div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> <span class="keywordflow">return</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> result,</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> pubKey,</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span> pubCollection.status,</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> *pubCollection.maxSequence};</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> }</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> }</div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> <span class="keywordflow">return</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{result};</div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span> }</div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span> </div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span> <span class="comment">// Update publisher&#39;s list</span></div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> <span class="keyword">auto</span>&amp; pubCollection = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[pubKey];</div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> <span class="keyword">auto</span> <span class="keyword">const</span> sequence = list[jss::sequence].<a class="code hl_function" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>();</div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span> <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a> =</div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span> (result == <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a> ||</div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span> result == <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ListDisposition::expired</a>);</div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> </div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a>)</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> pubCollection.status = result == <a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a></div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> ? <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a></div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> : <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e">PublisherStatus::expired</a>;</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> pubCollection.rawManifest = globalManifest;</div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> <span class="keywordflow">if</span> (!pubCollection.maxSequence || sequence &gt; *pubCollection.maxSequence)</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> pubCollection.maxSequence = sequence;</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span> </div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> <span class="keyword">const</span>&amp; newList = list[jss::validators];</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a> oldList;</div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a> &amp;&amp; pubCollection.remaining.count(sequence) != 0)</div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> {</div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> <span class="comment">// We&#39;ve seen this list before and stored it in &quot;remaining&quot;. The</span></div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> <span class="comment">// normal expected process is that the processed list would have</span></div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> <span class="comment">// already been moved in to &quot;current&quot; by &quot;updateTrusted()&quot;, but race</span></div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> <span class="comment">// conditions are possible, or the node may have lost sync, so do</span></div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> <span class="comment">// some of that work here.</span></div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> <span class="keyword">auto</span>&amp; publisher = pubCollection.current;</div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> <span class="comment">// Copy the old validator list</span></div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span> oldList = std::move(pubCollection.current.list);</div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span> <span class="comment">// Move the publisher info from &quot;remaining&quot; to &quot;current&quot;</span></div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span> publisher = std::move(pubCollection.remaining[sequence]);</div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span> <span class="comment">// Remove the entry in &quot;remaining&quot;</span></div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> pubCollection.remaining.erase(sequence);</div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> <span class="comment">// Done</span></div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> publisher.sequence == sequence,</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> <span class="stringliteral">&quot;ripple::ValidatorList::applyList : publisher sequence match&quot;</span>);</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> }</div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> {</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> <span class="keyword">auto</span>&amp; publisher = <a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a> ? pubCollection.current</div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> : pubCollection.remaining[sequence];</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span> publisher.sequence = sequence;</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> publisher.validFrom = <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{<a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{</div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> list.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::effective) ? list[jss::effective].<a class="code hl_function" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>() : 0}};</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> publisher.validUntil = <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{list[jss::expiration].<a class="code hl_function" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>()}};</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> publisher.siteUri = std::move(siteUri);</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> publisher.rawBlob = blob;</div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> publisher.rawSignature = signature;</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> publisher.rawManifest = localManifest;</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> <span class="keywordflow">if</span> (hash)</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span> publisher.hash = *hash;</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> </div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a>&amp; publisherList = publisher.list;</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a>&amp; manifests = publisher.manifests;</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> </div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> <span class="comment">// Copy the old validator list</span></div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> oldList = std::move(publisherList);</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> <span class="comment">// Build the new validator list from &quot;newList&quot;</span></div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/clear.html">clear</a>();</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(newList.<a class="code hl_function" href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">size</a>());</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : newList)</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> {</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span> <span class="keywordflow">if</span> (val.isObject() &amp;&amp; val.isMember(jss::validation_public_key) &amp;&amp;</div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> val[jss::validation_public_key].isString())</div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span> {</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;Blob&gt;</a> <span class="keyword">const</span> ret =</div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span> <a class="code hl_function" href="namespaceripple.html#a2127aa882d06ad6aaae928d2e80fb395">strUnHex</a>(val[jss::validation_public_key].asString());</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span> </div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span> <span class="keywordflow">if</span> (!ret || !<a class="code hl_function" href="namespaceripple.html#a798e187ba7443d8f951b810a12d50976">publicKeyType</a>(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(*ret)))</div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> {</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>())</div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span> &lt;&lt; <span class="stringliteral">&quot;Invalid node identity: &quot;</span></div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span> &lt;&lt; val[jss::validation_public_key].asString();</div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> }</div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span> {</div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">push_back</a>(</div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code hl_class" href="classripple_1_1Slice.html">Slice</a>{ret-&gt;data(), ret-&gt;size()}));</div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> }</div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> </div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> <span class="keywordflow">if</span> (val.isMember(jss::manifest) &amp;&amp;</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> val[jss::manifest].isString())</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> manifests.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">push_back</a>(val[jss::manifest].asString());</div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> }</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> }</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> </div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> <span class="comment">// Standardize the list order by sorting</span></div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/sort.html">std::sort</a>(publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>(), publisherList.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>());</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> }</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> <span class="comment">// If this publisher has ever sent a more updated version than the one</span></div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> <span class="comment">// in this file, keep it. This scenario is unlikely, but legal.</span></div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> pubCollection.rawVersion = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(pubCollection.rawVersion, version);</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> <span class="keywordflow">if</span> (!pubCollection.remaining.empty())</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> {</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> <span class="comment">// If there are any pending VLs, then this collection must be at least</span></div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> <span class="comment">// version 2.</span></div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> pubCollection.rawVersion = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(pubCollection.rawVersion, 2u);</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> }</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> </div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span> <a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a> <span class="keyword">const</span> applyResult{</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span> result, pubKey, pubCollection.status, *pubCollection.maxSequence};</div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> </div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a>)</div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> {</div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3">updatePublisherList</a>(pubKey, pubCollection.current, oldList, lock);</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> }</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span> </div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> <span class="keywordflow">return</span> applyResult;</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span>}</div>
</div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> </div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a></div>
<div class="foldopen" id="foldopen01293" data-start="{" data-end="}">
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a"> 1293</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a">ValidatorList::loadLists</a>()</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span>{</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span> <span class="keyword">using namespace </span>std::string_literals;</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> <span class="keyword">using namespace </span>boost::filesystem;</div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span> <span class="keyword">using namespace </span>boost::system::errc;</div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span> </div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span> </div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> sites;</div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> sites.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size());</div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [pubKey, publisherCollection] : <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> {</div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> boost::system::error_code ec;</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> </div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> <span class="keywordflow">if</span> (publisherCollection.status == <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> </div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> boost::filesystem::path <span class="keyword">const</span> filename = <a class="code hl_function" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">getCacheFileName</a>(lock, pubKey);</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> </div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> <span class="keyword">auto</span> <span class="keyword">const</span> fullPath{<a class="code hl_enumvalue" href="namespaceripple.html#a286745fec5429abb3893001b4982522ba9f3fda2fef6dda85970e12ce9a9b8cbe">canonical</a>(filename, ec)};</div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> </div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> <span class="keyword">auto</span> size = file_size(fullPath, ec);</div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> <span class="keywordflow">if</span> (!ec &amp;&amp; !size)</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> {</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> <span class="comment">// Treat an empty file as a missing file, because</span></div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> <span class="comment">// nobody else is going to write it.</span></div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> ec = <a class="code hl_function" href="namespaceripple.html#a70e53b89eb57ac8fdc4625ce28455eb4">make_error_code</a>(no_such_file_or_directory);</div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> }</div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> </div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span> prefix = [&amp;fullPath]() {</div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span><span class="preprocessor">#if _MSC_VER </span><span class="comment">// MSVC: Windows paths need a leading / added</span></div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> {</div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> <span class="keywordflow">return</span> fullPath.root_path() == <span class="stringliteral">&quot;/&quot;</span>s ? <span class="stringliteral">&quot;file://&quot;</span> : <span class="stringliteral">&quot;file:///&quot;</span>;</div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> }</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> {</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> (void)fullPath;</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> <span class="keywordflow">return</span> <span class="stringliteral">&quot;file://&quot;</span>;</div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> }</div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> }();</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> sites.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(prefix + fullPath.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/string/basic_string/basic_string.html">string</a>());</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> }</div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> </div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span> <span class="comment">// Then let the ValidatorSites do the rest of the work.</span></div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> <span class="keywordflow">return</span> sites;</div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span>}</div>
</div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> </div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span><span class="comment">// The returned PublicKey value is read from the manifest. Manifests do not</span></div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span><span class="comment">// contain the default-constructed public keys</span></div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair&lt;ListDisposition, std::optional&lt;PublicKey&gt;</a>&gt;</div>
<div class="foldopen" id="foldopen01348" data-start="{" data-end="}">
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#ac74567517641b42d1cac0852f99a7814"> 1348</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#ac74567517641b42d1cac0852f99a7814">ValidatorList::verify</a>(</div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp; lock,</div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; list,</div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span> <a class="code hl_struct" href="structripple_1_1Manifest.html">Manifest</a> <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>,</div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; blob,</div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; signature)</div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span>{</div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(<a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>.masterKey))</div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>, {}};</div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span> </div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> masterPubKey = <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>.masterKey;</div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span> <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">revoked</a> = <a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>.revoked();</div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span> </div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span> <span class="keyword">auto</span> <span class="keyword">const</span> result = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">applyManifest</a>(std::move(<a class="code hl_enumvalue" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>));</div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span> </div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">revoked</a> &amp;&amp; result == <a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">ManifestDisposition::accepted</a>)</div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span> {</div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268">removePublisherList</a>(lock, masterPubKey, <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">PublisherStatus::revoked</a>);</div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span> <span class="comment">// If the manifest is revoked, no future list is valid either</span></div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[masterPubKey].remaining.clear();</div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span> }</div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span> </div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span> <span class="keyword">auto</span> <span class="keyword">const</span> signingKey = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#a557c94c2a57c5bbe75557524420b1e9d">getSigningKey</a>(masterPubKey);</div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span> </div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">revoked</a> || !signingKey || result == <a class="code hl_enumvalue" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ManifestDisposition::invalid</a>)</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>, masterPubKey};</div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span> </div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span> <span class="keyword">auto</span> <span class="keyword">const</span> sig = <a class="code hl_function" href="namespaceripple.html#a2127aa882d06ad6aaae928d2e80fb395">strUnHex</a>(signature);</div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span> <span class="keyword">auto</span> <span class="keyword">const</span> data = <a class="code hl_function" href="namespaceripple.html#a44b8469c9a47739d50dd628e8a4bd561">base64_decode</a>(blob);</div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span> <span class="keywordflow">if</span> (!sig || !<a class="code hl_function" href="namespaceripple.html#a3549cb4c3d81efe240ad20c147e48ac7">ripple::verify</a>(*signingKey, <a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(data), <a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(*sig)))</div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>, masterPubKey};</div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span> </div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span> <a class="code hl_class" href="classJson_1_1Reader.html">Json::Reader</a> r;</div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span> <span class="keywordflow">if</span> (!r.<a class="code hl_function" href="classJson_1_1Reader.html#a8ee4d40504e4f8b069745d762ab4d78c">parse</a>(data, list))</div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>, masterPubKey};</div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span> </div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span> <span class="keywordflow">if</span> (list.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::sequence) &amp;&amp; list[jss::sequence].<a class="code hl_function" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>() &amp;&amp;</div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span> list.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::expiration) &amp;&amp; list[jss::expiration].<a class="code hl_function" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>() &amp;&amp;</div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span> (!list.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::effective) || list[jss::effective].<a class="code hl_function" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>()) &amp;&amp;</div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span> list.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::validators) &amp;&amp; list[jss::validators].<a class="code hl_function" href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">isArray</a>())</div>
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span> {</div>
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span> <span class="keyword">auto</span> <span class="keyword">const</span> sequence = list[jss::sequence].<a class="code hl_function" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>();</div>
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"> 1390</span> <span class="keyword">auto</span> <span class="keyword">const</span> validFrom = <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{<a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{</div>
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span> list.<a class="code hl_function" href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">isMember</a>(jss::effective) ? list[jss::effective].<a class="code hl_function" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>() : 0}};</div>
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"> 1392</span> <span class="keyword">auto</span> <span class="keyword">const</span> validUntil = <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{</div>
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span> <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{list[jss::expiration].<a class="code hl_function" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>()}};</div>
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span> <span class="keyword">auto</span> <span class="keyword">const</span> now = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code hl_function" href="classripple_1_1TimeKeeper.html#a2a0090c133fcbeb544017a3c7eddab6e">now</a>();</div>
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; listCollection = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[masterPubKey];</div>
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"> 1396</span> <span class="keywordflow">if</span> (validUntil &lt;= validFrom)</div>
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>, masterPubKey};</div>
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sequence &lt; listCollection.current.sequence)</div>
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ListDisposition::stale</a>, masterPubKey};</div>
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sequence == listCollection.current.sequence)</div>
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"> 1401</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a>, masterPubKey};</div>
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (validUntil &lt;= now)</div>
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ListDisposition::expired</a>, masterPubKey};</div>
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (validFrom &gt; now)</div>
<div class="line"><a id="l01405" name="l01405"></a><span class="lineno"> 1405</span> <span class="comment">// Not yet valid. Return pending if one of the following is true</span></div>
<div class="line"><a id="l01406" name="l01406"></a><span class="lineno"> 1406</span> <span class="comment">// * There&#39;s no maxSequence, indicating this is the first blob seen</span></div>
<div class="line"><a id="l01407" name="l01407"></a><span class="lineno"> 1407</span> <span class="comment">// for this publisher</span></div>
<div class="line"><a id="l01408" name="l01408"></a><span class="lineno"> 1408</span> <span class="comment">// * The sequence is larger than the maxSequence, indicating this</span></div>
<div class="line"><a id="l01409" name="l01409"></a><span class="lineno"> 1409</span> <span class="comment">// blob is new</span></div>
<div class="line"><a id="l01410" name="l01410"></a><span class="lineno"> 1410</span> <span class="comment">// * There&#39;s no entry for this sequence AND this blob is valid</span></div>
<div class="line"><a id="l01411" name="l01411"></a><span class="lineno"> 1411</span> <span class="comment">// before the last blob, indicating blobs may be processing out of</span></div>
<div class="line"><a id="l01412" name="l01412"></a><span class="lineno"> 1412</span> <span class="comment">// order. This may result in some duplicated processing, but</span></div>
<div class="line"><a id="l01413" name="l01413"></a><span class="lineno"> 1413</span> <span class="comment">// prevents the risk of missing valid data. Else return</span></div>
<div class="line"><a id="l01414" name="l01414"></a><span class="lineno"> 1414</span> <span class="comment">// known_sequence</span></div>
<div class="line"><a id="l01415" name="l01415"></a><span class="lineno"> 1415</span> <span class="keywordflow">return</span> !listCollection.maxSequence ||</div>
<div class="line"><a id="l01416" name="l01416"></a><span class="lineno"> 1416</span> sequence &gt; *listCollection.maxSequence ||</div>
<div class="line"><a id="l01417" name="l01417"></a><span class="lineno"> 1417</span> (listCollection.remaining.count(sequence) == 0 &amp;&amp;</div>
<div class="line"><a id="l01418" name="l01418"></a><span class="lineno"> 1418</span> validFrom &lt; listCollection.remaining</div>
<div class="line"><a id="l01419" name="l01419"></a><span class="lineno"> 1419</span> .at(*listCollection.maxSequence)</div>
<div class="line"><a id="l01420" name="l01420"></a><span class="lineno"> 1420</span> .validFrom)</div>
<div class="line"><a id="l01421" name="l01421"></a><span class="lineno"> 1421</span> ? <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/utility/pair/make_pair.html">std::make_pair</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ListDisposition::pending</a>, masterPubKey)</div>
<div class="line"><a id="l01422" name="l01422"></a><span class="lineno"> 1422</span> : <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/utility/pair/make_pair.html">std::make_pair</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>, masterPubKey);</div>
<div class="line"><a id="l01423" name="l01423"></a><span class="lineno"> 1423</span> }</div>
<div class="line"><a id="l01424" name="l01424"></a><span class="lineno"> 1424</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01425" name="l01425"></a><span class="lineno"> 1425</span> {</div>
<div class="line"><a id="l01426" name="l01426"></a><span class="lineno"> 1426</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>, masterPubKey};</div>
<div class="line"><a id="l01427" name="l01427"></a><span class="lineno"> 1427</span> }</div>
<div class="line"><a id="l01428" name="l01428"></a><span class="lineno"> 1428</span> </div>
<div class="line"><a id="l01429" name="l01429"></a><span class="lineno"> 1429</span> <span class="keywordflow">return</span> {<a class="code hl_enumvalue" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>, masterPubKey};</div>
<div class="line"><a id="l01430" name="l01430"></a><span class="lineno"> 1430</span>}</div>
</div>
<div class="line"><a id="l01431" name="l01431"></a><span class="lineno"> 1431</span> </div>
<div class="line"><a id="l01432" name="l01432"></a><span class="lineno"> 1432</span><span class="keywordtype">bool</span></div>
<div class="foldopen" id="foldopen01433" data-start="{" data-end="}">
<div class="line"><a id="l01433" name="l01433"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b"> 1433</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b">ValidatorList::listed</a>(<a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a id="l01434" name="l01434"></a><span class="lineno"> 1434</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01435" name="l01435"></a><span class="lineno"> 1435</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01436" name="l01436"></a><span class="lineno"> 1436</span> </div>
<div class="line"><a id="l01437" name="l01437"></a><span class="lineno"> 1437</span> <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a id="l01438" name="l01438"></a><span class="lineno"> 1438</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(pubKey) != <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.<a class="code hl_function" href="classripple_1_1PublicKey.html#aaf5eda03758063af5402881f7eb40b2e">end</a>();</div>
<div class="line"><a id="l01439" name="l01439"></a><span class="lineno"> 1439</span>}</div>
</div>
<div class="line"><a id="l01440" name="l01440"></a><span class="lineno"> 1440</span> </div>
<div class="line"><a id="l01441" name="l01441"></a><span class="lineno"> 1441</span><span class="keywordtype">bool</span></div>
<div class="foldopen" id="foldopen01442" data-start="{" data-end="}">
<div class="line"><a id="l01442" name="l01442"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a15193c461b148a76cf11872f6641b26b"> 1442</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ValidatorList::trusted</a>(</div>
<div class="line"><a id="l01443" name="l01443"></a><span class="lineno"> 1443</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a id="l01444" name="l01444"></a><span class="lineno"> 1444</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a id="l01445" name="l01445"></a><span class="lineno"> 1445</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01446" name="l01446"></a><span class="lineno"> 1446</span> <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a id="l01447" name="l01447"></a><span class="lineno"> 1447</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.find(pubKey) != <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.<a class="code hl_function" href="classripple_1_1PublicKey.html#aaf5eda03758063af5402881f7eb40b2e">end</a>();</div>
<div class="line"><a id="l01448" name="l01448"></a><span class="lineno"> 1448</span>}</div>
</div>
<div class="line"><a id="l01449" name="l01449"></a><span class="lineno"> 1449</span> </div>
<div class="line"><a id="l01450" name="l01450"></a><span class="lineno"> 1450</span><span class="keywordtype">bool</span></div>
<div class="foldopen" id="foldopen01451" data-start="{" data-end="}">
<div class="line"><a id="l01451" name="l01451"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8"> 1451</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ValidatorList::trusted</a>(<a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a id="l01452" name="l01452"></a><span class="lineno"> 1452</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01453" name="l01453"></a><span class="lineno"> 1453</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01454" name="l01454"></a><span class="lineno"> 1454</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">trusted</a>(read_lock, identity);</div>
<div class="line"><a id="l01455" name="l01455"></a><span class="lineno"> 1455</span>}</div>
</div>
<div class="line"><a id="l01456" name="l01456"></a><span class="lineno"> 1456</span> </div>
<div class="line"><a id="l01457" name="l01457"></a><span class="lineno"> 1457</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a></div>
<div class="foldopen" id="foldopen01458" data-start="{" data-end="}">
<div class="line"><a id="l01458" name="l01458"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5"> 1458</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5">ValidatorList::getListedKey</a>(<a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a id="l01459" name="l01459"></a><span class="lineno"> 1459</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01460" name="l01460"></a><span class="lineno"> 1460</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01461" name="l01461"></a><span class="lineno"> 1461</span> </div>
<div class="line"><a id="l01462" name="l01462"></a><span class="lineno"> 1462</span> <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a id="l01463" name="l01463"></a><span class="lineno"> 1463</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(pubKey) != <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end())</div>
<div class="line"><a id="l01464" name="l01464"></a><span class="lineno"> 1464</span> <span class="keywordflow">return</span> pubKey;</div>
<div class="line"><a id="l01465" name="l01465"></a><span class="lineno"> 1465</span> <span class="keywordflow">return</span> <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::nullopt</a>;</div>
<div class="line"><a id="l01466" name="l01466"></a><span class="lineno"> 1466</span>}</div>
</div>
<div class="line"><a id="l01467" name="l01467"></a><span class="lineno"> 1467</span> </div>
<div class="line"><a id="l01468" name="l01468"></a><span class="lineno"> 1468</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a></div>
<div class="foldopen" id="foldopen01469" data-start="{" data-end="}">
<div class="line"><a id="l01469" name="l01469"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a15ca6b033b973fb438ca5d1b6a66b5b9"> 1469</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">ValidatorList::getTrustedKey</a>(</div>
<div class="line"><a id="l01470" name="l01470"></a><span class="lineno"> 1470</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a id="l01471" name="l01471"></a><span class="lineno"> 1471</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a id="l01472" name="l01472"></a><span class="lineno"> 1472</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01473" name="l01473"></a><span class="lineno"> 1473</span> <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code hl_function" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a id="l01474" name="l01474"></a><span class="lineno"> 1474</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.find(pubKey) != <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.end())</div>
<div class="line"><a id="l01475" name="l01475"></a><span class="lineno"> 1475</span> <span class="keywordflow">return</span> pubKey;</div>
<div class="line"><a id="l01476" name="l01476"></a><span class="lineno"> 1476</span> <span class="keywordflow">return</span> <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::nullopt</a>;</div>
<div class="line"><a id="l01477" name="l01477"></a><span class="lineno"> 1477</span>}</div>
</div>
<div class="line"><a id="l01478" name="l01478"></a><span class="lineno"> 1478</span> </div>
<div class="line"><a id="l01479" name="l01479"></a><span class="lineno"> 1479</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a></div>
<div class="foldopen" id="foldopen01480" data-start="{" data-end="}">
<div class="line"><a id="l01480" name="l01480"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b"> 1480</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">ValidatorList::getTrustedKey</a>(<a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a id="l01481" name="l01481"></a><span class="lineno"> 1481</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01482" name="l01482"></a><span class="lineno"> 1482</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01483" name="l01483"></a><span class="lineno"> 1483</span> </div>
<div class="line"><a id="l01484" name="l01484"></a><span class="lineno"> 1484</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">getTrustedKey</a>(read_lock, identity);</div>
<div class="line"><a id="l01485" name="l01485"></a><span class="lineno"> 1485</span>}</div>
</div>
<div class="line"><a id="l01486" name="l01486"></a><span class="lineno"> 1486</span> </div>
<div class="line"><a id="l01487" name="l01487"></a><span class="lineno"> 1487</span><span class="keywordtype">bool</span></div>
<div class="foldopen" id="foldopen01488" data-start="{" data-end="}">
<div class="line"><a id="l01488" name="l01488"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c"> 1488</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c">ValidatorList::trustedPublisher</a>(<a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a id="l01489" name="l01489"></a><span class="lineno"> 1489</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01490" name="l01490"></a><span class="lineno"> 1490</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01491" name="l01491"></a><span class="lineno"> 1491</span> <span class="keywordflow">return</span> identity.<a class="code hl_function" href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">size</a>() &amp;&amp; <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(identity) &amp;&amp;</div>
<div class="line"><a id="l01492" name="l01492"></a><span class="lineno"> 1492</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.at(identity).status &lt; <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">PublisherStatus::revoked</a>;</div>
<div class="line"><a id="l01493" name="l01493"></a><span class="lineno"> 1493</span>}</div>
</div>
<div class="line"><a id="l01494" name="l01494"></a><span class="lineno"> 1494</span> </div>
<div class="line"><a id="l01495" name="l01495"></a><span class="lineno"> 1495</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a></div>
<div class="foldopen" id="foldopen01496" data-start="{" data-end="}">
<div class="line"><a id="l01496" name="l01496"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a150b6f26a82b2d4a30d9558719cc8fd5"> 1496</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a150b6f26a82b2d4a30d9558719cc8fd5">ValidatorList::localPublicKey</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01497" name="l01497"></a><span class="lineno"> 1497</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01498" name="l01498"></a><span class="lineno"> 1498</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01499" name="l01499"></a><span class="lineno"> 1499</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#abd28e45a701578558624ec9592f69bdf">localPubKey_</a>;</div>
<div class="line"><a id="l01500" name="l01500"></a><span class="lineno"> 1500</span>}</div>
</div>
<div class="line"><a id="l01501" name="l01501"></a><span class="lineno"> 1501</span> </div>
<div class="line"><a id="l01502" name="l01502"></a><span class="lineno"> 1502</span><span class="keywordtype">bool</span></div>
<div class="foldopen" id="foldopen01503" data-start="{" data-end="}">
<div class="line"><a id="l01503" name="l01503"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268"> 1503</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268">ValidatorList::removePublisherList</a>(</div>
<div class="line"><a id="l01504" name="l01504"></a><span class="lineno"> 1504</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a id="l01505" name="l01505"></a><span class="lineno"> 1505</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a id="l01506" name="l01506"></a><span class="lineno"> 1506</span> <a class="code hl_enumeration" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4">PublisherStatus</a> reason)</div>
<div class="line"><a id="l01507" name="l01507"></a><span class="lineno"> 1507</span>{</div>
<div class="line"><a id="l01508" name="l01508"></a><span class="lineno"> 1508</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01509" name="l01509"></a><span class="lineno"> 1509</span> reason != <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a> &amp;&amp;</div>
<div class="line"><a id="l01510" name="l01510"></a><span class="lineno"> 1510</span> reason != <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">PublisherStatus::unavailable</a>,</div>
<div class="line"><a id="l01511" name="l01511"></a><span class="lineno"> 1511</span> <span class="stringliteral">&quot;ripple::ValidatorList::removePublisherList : valid reason input&quot;</span>);</div>
<div class="line"><a id="l01512" name="l01512"></a><span class="lineno"> 1512</span> <span class="keyword">auto</span> <span class="keyword">const</span> iList = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.find(publisherKey);</div>
<div class="line"><a id="l01513" name="l01513"></a><span class="lineno"> 1513</span> <span class="keywordflow">if</span> (iList == <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.end())</div>
<div class="line"><a id="l01514" name="l01514"></a><span class="lineno"> 1514</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01515" name="l01515"></a><span class="lineno"> 1515</span> </div>
<div class="line"><a id="l01516" name="l01516"></a><span class="lineno"> 1516</span> JLOG(<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">j_</a>.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Removing validator list for publisher &quot;</span></div>
<div class="line"><a id="l01517" name="l01517"></a><span class="lineno"> 1517</span> &lt;&lt; <a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey);</div>
<div class="line"><a id="l01518" name="l01518"></a><span class="lineno"> 1518</span> </div>
<div class="line"><a id="l01519" name="l01519"></a><span class="lineno"> 1519</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : iList-&gt;second.current.list)</div>
<div class="line"><a id="l01520" name="l01520"></a><span class="lineno"> 1520</span> {</div>
<div class="line"><a id="l01521" name="l01521"></a><span class="lineno"> 1521</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; iVal = <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(val);</div>
<div class="line"><a id="l01522" name="l01522"></a><span class="lineno"> 1522</span> <span class="keywordflow">if</span> (iVal == <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end())</div>
<div class="line"><a id="l01523" name="l01523"></a><span class="lineno"> 1523</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01524" name="l01524"></a><span class="lineno"> 1524</span> </div>
<div class="line"><a id="l01525" name="l01525"></a><span class="lineno"> 1525</span> <span class="keywordflow">if</span> (iVal-&gt;second &lt;= 1)</div>
<div class="line"><a id="l01526" name="l01526"></a><span class="lineno"> 1526</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.erase(iVal);</div>
<div class="line"><a id="l01527" name="l01527"></a><span class="lineno"> 1527</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01528" name="l01528"></a><span class="lineno"> 1528</span> --iVal-&gt;second;</div>
<div class="line"><a id="l01529" name="l01529"></a><span class="lineno"> 1529</span> }</div>
<div class="line"><a id="l01530" name="l01530"></a><span class="lineno"> 1530</span> </div>
<div class="line"><a id="l01531" name="l01531"></a><span class="lineno"> 1531</span> iList-&gt;second.current.list.clear();</div>
<div class="line"><a id="l01532" name="l01532"></a><span class="lineno"> 1532</span> iList-&gt;second.status = reason;</div>
<div class="line"><a id="l01533" name="l01533"></a><span class="lineno"> 1533</span> </div>
<div class="line"><a id="l01534" name="l01534"></a><span class="lineno"> 1534</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01535" name="l01535"></a><span class="lineno"> 1535</span>}</div>
</div>
<div class="line"><a id="l01536" name="l01536"></a><span class="lineno"> 1536</span> </div>
<div class="line"><a id="l01537" name="l01537"></a><span class="lineno"> 1537</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen01538" data-start="{" data-end="}">
<div class="line"><a id="l01538" name="l01538"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a42f61dfc9c05a17b695f6630452ca7f7"> 1538</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ValidatorList::count</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;)<span class="keyword"> const</span></div>
<div class="line"><a id="l01539" name="l01539"></a><span class="lineno"> 1539</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01540" name="l01540"></a><span class="lineno"> 1540</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size() + (<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a147f9d3a3afb1cdd7714d68202bd26ba">localPublisherList</a>.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#a1d97cceec8dbfaf845cceade47cfdbb4">list</a>.size() &gt; 0);</div>
<div class="line"><a id="l01541" name="l01541"></a><span class="lineno"> 1541</span>}</div>
</div>
<div class="line"><a id="l01542" name="l01542"></a><span class="lineno"> 1542</span> </div>
<div class="line"><a id="l01543" name="l01543"></a><span class="lineno"> 1543</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen01544" data-start="{" data-end="}">
<div class="line"><a id="l01544" name="l01544"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd"> 1544</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ValidatorList::count</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01545" name="l01545"></a><span class="lineno"> 1545</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01546" name="l01546"></a><span class="lineno"> 1546</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code hl_variable" href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">mutex_</a>};</div>
<div class="line"><a id="l01547" name="l01547"></a><span class="lineno"> 1547</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>(read_lock);</div>
<div class="line"><a id="l01548" name="l01548"></a><span class="lineno"> 1548</span>}</div>
</div>
<div class="line"><a id="l01549" name="l01549"></a><span class="lineno"> 1549</span> </div>
<div class="line"><a id="l01550" name="l01550"></a><span class="lineno"> 1550</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;TimeKeeper::time_point&gt;</a></div>
<div class="foldopen" id="foldopen01551" data-start="{" data-end="}">
<div class="line"><a id="l01551" name="l01551"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#ae8b5192dbbf82c4a0150538f50d49184"> 1551</a></span><a class="code hl_function" href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741">ValidatorList::expires</a>(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;)<span class="keyword"> const</span></div>
<div class="line"><a id="l01552" name="l01552"></a><span class="lineno"> 1552</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01553" name="l01553"></a><span class="lineno"> 1553</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;TimeKeeper::time_point&gt;</a> res{};</div>
<div class="line"><a id="l01554" name="l01554"></a><span class="lineno"> 1554</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [_, collection] : <a class="code hl_variable" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a id="l01555" name="l01555"></a><span class="lineno"> 1555</span> {</div>
<div class="line"><a id="l01556" name="l01556"></a><span class="lineno"> 1556</span> <span class="comment">// Unfetched</span></div>
<div class="line"><a id="l01557" name="l01557"></a><span class="lineno"> 1557</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = collection.current;</div>
<div class="line"><a id="l01558" name="l01558"></a><span class="lineno"> 1558</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil == <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a id="l01559" name="l01559"></a><span class="lineno"> 1559</span> {</div>
<div class="line"><a id="l01560" name="l01560"></a><span class="lineno"> 1560</span> <span class="keywordflow">return</span> <a class="code hl_variableRef" href="http://en.cppreference.com/w/cpp/types/is_same.html">std::nullopt</a>;</div>
<div class="line"><a id="l01561" name="l01561"></a><span class="lineno"> 1561</span> }</div>
<div class="line"><a id="l01562" name="l01562"></a><span class="lineno"> 1562</span> </div>
<div class="line"><a id="l01563" name="l01563"></a><span class="lineno"> 1563</span> <span class="comment">// Find the latest validUntil in a chain where the next validFrom</span></div>
<div class="line"><a id="l01564" name="l01564"></a><span class="lineno"> 1564</span> <span class="comment">// overlaps with the previous validUntil. applyLists has already cleaned</span></div>
<div class="line"><a id="l01565" name="l01565"></a><span class="lineno"> 1565</span> <span class="comment">// up the list so the validFrom dates are guaranteed increasing.</span></div>
<div class="line"><a id="l01566" name="l01566"></a><span class="lineno"> 1566</span> <span class="keyword">auto</span> chainedExpiration = <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil;</div>
<div class="line"><a id="l01567" name="l01567"></a><span class="lineno"> 1567</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, check] : collection.remaining)</div>
<div class="line"><a id="l01568" name="l01568"></a><span class="lineno"> 1568</span> {</div>
<div class="line"><a id="l01569" name="l01569"></a><span class="lineno"> 1569</span> (void)sequence;</div>
<div class="line"><a id="l01570" name="l01570"></a><span class="lineno"> 1570</span> <span class="keywordflow">if</span> (check.validFrom &lt;= chainedExpiration)</div>
<div class="line"><a id="l01571" name="l01571"></a><span class="lineno"> 1571</span> chainedExpiration = check.validUntil;</div>
<div class="line"><a id="l01572" name="l01572"></a><span class="lineno"> 1572</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01573" name="l01573"></a><span class="lineno"> 1573</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01574" name="l01574"></a><span class="lineno"> 1574</span> }</div>
<div class="line"><a id="l01575" name="l01575"></a><span class="lineno"> 1575</span> </div>
<div class="line"><a id="l01576" name="l01576"></a><span class="lineno"> 1576</span> <span class="comment">// Earliest</span></div>
<div class="line"><a id="l01577" name="l01577"></a><span class="lineno"> 1577</span> <span class="keywordflow">if</span> (!res || chainedExpiration &lt; *res)</div>
<div class="line"><a id="l01578" name="l01578"></a><span class="lineno"> 1578</span> {</div>
<div class="line"><a id="l01579" name="l01579"></a><span class="lineno"> 1579</span> res = chainedExpiration;</div>
<div class="line"><a id="l01580" name="l01580"></a><span class="lineno"> 1580</span> }</div>
<div class="line"><a id="l01581" name="l01581"></a><span class="lineno"> 1581</span> }</div>
<div class="line"><a id="l01582" name="l01582"></a><span class="lineno"> 1582</span> </div>
<div class="line"><a id="l01583" name="l01583"></a><span class="lineno"> 1583</span> <span class="keywordflow">if</span> (localPublisherList.list.size() &gt; 0)</div>
<div class="line"><a id="l01584" name="l01584"></a><span class="lineno"> 1584</span> {</div>
<div class="line"><a id="l01585" name="l01585"></a><span class="lineno"> 1585</span> PublisherList collection = localPublisherList;</div>
<div class="line"><a id="l01586" name="l01586"></a><span class="lineno"> 1586</span> <span class="comment">// Unfetched</span></div>
<div class="line"><a id="l01587" name="l01587"></a><span class="lineno"> 1587</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = collection;</div>
<div class="line"><a id="l01588" name="l01588"></a><span class="lineno"> 1588</span> <span class="keyword">auto</span> chainedExpiration = <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil;</div>
<div class="line"><a id="l01589" name="l01589"></a><span class="lineno"> 1589</span> </div>
<div class="line"><a id="l01590" name="l01590"></a><span class="lineno"> 1590</span> <span class="comment">// Earliest</span></div>
<div class="line"><a id="l01591" name="l01591"></a><span class="lineno"> 1591</span> <span class="keywordflow">if</span> (!res || chainedExpiration &lt; *res)</div>
<div class="line"><a id="l01592" name="l01592"></a><span class="lineno"> 1592</span> {</div>
<div class="line"><a id="l01593" name="l01593"></a><span class="lineno"> 1593</span> res = chainedExpiration;</div>
<div class="line"><a id="l01594" name="l01594"></a><span class="lineno"> 1594</span> }</div>
<div class="line"><a id="l01595" name="l01595"></a><span class="lineno"> 1595</span> }</div>
<div class="line"><a id="l01596" name="l01596"></a><span class="lineno"> 1596</span> <span class="keywordflow">return</span> res;</div>
<div class="line"><a id="l01597" name="l01597"></a><span class="lineno"> 1597</span>}</div>
</div>
<div class="line"><a id="l01598" name="l01598"></a><span class="lineno"> 1598</span> </div>
<div class="line"><a id="l01599" name="l01599"></a><span class="lineno"> 1599</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;TimeKeeper::time_point&gt;</a></div>
<div class="foldopen" id="foldopen01600" data-start="{" data-end="}">
<div class="line"><a id="l01600" name="l01600"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741"> 1600</a></span>ValidatorList::expires()<span class="keyword"> const</span></div>
<div class="line"><a id="l01601" name="l01601"></a><span class="lineno"> 1601</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01602" name="l01602"></a><span class="lineno"> 1602</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l01603" name="l01603"></a><span class="lineno"> 1603</span> <span class="keywordflow">return</span> expires(read_lock);</div>
<div class="line"><a id="l01604" name="l01604"></a><span class="lineno"> 1604</span>}</div>
</div>
<div class="line"><a id="l01605" name="l01605"></a><span class="lineno"> 1605</span> </div>
<div class="line"><a id="l01606" name="l01606"></a><span class="lineno"> 1606</span><a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="foldopen" id="foldopen01607" data-start="{" data-end="}">
<div class="line"><a id="l01607" name="l01607"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a6f943a4488f3b50dcbb5177007d43271"> 1607</a></span>ValidatorList::getJson()<span class="keyword"> const</span></div>
<div class="line"><a id="l01608" name="l01608"></a><span class="lineno"> 1608</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01609" name="l01609"></a><span class="lineno"> 1609</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> res(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l01610" name="l01610"></a><span class="lineno"> 1610</span> </div>
<div class="line"><a id="l01611" name="l01611"></a><span class="lineno"> 1611</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l01612" name="l01612"></a><span class="lineno"> 1612</span> </div>
<div class="line"><a id="l01613" name="l01613"></a><span class="lineno"> 1613</span> res[jss::validation_quorum] = <span class="keyword">static_cast&lt;</span><a class="code hl_typedef" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(quorum_);</div>
<div class="line"><a id="l01614" name="l01614"></a><span class="lineno"> 1614</span> </div>
<div class="line"><a id="l01615" name="l01615"></a><span class="lineno"> 1615</span> {</div>
<div class="line"><a id="l01616" name="l01616"></a><span class="lineno"> 1616</span> <span class="keyword">auto</span>&amp; x = (res[jss::validator_list] = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l01617" name="l01617"></a><span class="lineno"> 1617</span> </div>
<div class="line"><a id="l01618" name="l01618"></a><span class="lineno"> 1618</span> x[jss::count] = <span class="keyword">static_cast&lt;</span><a class="code hl_typedef" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(count(read_lock));</div>
<div class="line"><a id="l01619" name="l01619"></a><span class="lineno"> 1619</span> </div>
<div class="line"><a id="l01620" name="l01620"></a><span class="lineno"> 1620</span> <span class="keywordflow">if</span> (<span class="keyword">auto</span> when = expires(read_lock))</div>
<div class="line"><a id="l01621" name="l01621"></a><span class="lineno"> 1621</span> {</div>
<div class="line"><a id="l01622" name="l01622"></a><span class="lineno"> 1622</span> <span class="keywordflow">if</span> (*when == TimeKeeper::time_point::max())</div>
<div class="line"><a id="l01623" name="l01623"></a><span class="lineno"> 1623</span> {</div>
<div class="line"><a id="l01624" name="l01624"></a><span class="lineno"> 1624</span> x[jss::expiration] = <span class="stringliteral">&quot;never&quot;</span>;</div>
<div class="line"><a id="l01625" name="l01625"></a><span class="lineno"> 1625</span> x[jss::status] = <span class="stringliteral">&quot;active&quot;</span>;</div>
<div class="line"><a id="l01626" name="l01626"></a><span class="lineno"> 1626</span> }</div>
<div class="line"><a id="l01627" name="l01627"></a><span class="lineno"> 1627</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01628" name="l01628"></a><span class="lineno"> 1628</span> {</div>
<div class="line"><a id="l01629" name="l01629"></a><span class="lineno"> 1629</span> x[jss::expiration] = to_string(*when);</div>
<div class="line"><a id="l01630" name="l01630"></a><span class="lineno"> 1630</span> </div>
<div class="line"><a id="l01631" name="l01631"></a><span class="lineno"> 1631</span> <span class="keywordflow">if</span> (*when &gt; timeKeeper_.now())</div>
<div class="line"><a id="l01632" name="l01632"></a><span class="lineno"> 1632</span> x[jss::status] = <span class="stringliteral">&quot;active&quot;</span>;</div>
<div class="line"><a id="l01633" name="l01633"></a><span class="lineno"> 1633</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01634" name="l01634"></a><span class="lineno"> 1634</span> x[jss::status] = <span class="stringliteral">&quot;expired&quot;</span>;</div>
<div class="line"><a id="l01635" name="l01635"></a><span class="lineno"> 1635</span> }</div>
<div class="line"><a id="l01636" name="l01636"></a><span class="lineno"> 1636</span> }</div>
<div class="line"><a id="l01637" name="l01637"></a><span class="lineno"> 1637</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01638" name="l01638"></a><span class="lineno"> 1638</span> {</div>
<div class="line"><a id="l01639" name="l01639"></a><span class="lineno"> 1639</span> x[jss::status] = <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a id="l01640" name="l01640"></a><span class="lineno"> 1640</span> x[jss::expiration] = <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a id="l01641" name="l01641"></a><span class="lineno"> 1641</span> }</div>
<div class="line"><a id="l01642" name="l01642"></a><span class="lineno"> 1642</span> </div>
<div class="line"><a id="l01643" name="l01643"></a><span class="lineno"> 1643</span> x[jss::validator_list_threshold] = <a class="code hl_typedef" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a>(listThreshold_);</div>
<div class="line"><a id="l01644" name="l01644"></a><span class="lineno"> 1644</span> }</div>
<div class="line"><a id="l01645" name="l01645"></a><span class="lineno"> 1645</span> </div>
<div class="line"><a id="l01646" name="l01646"></a><span class="lineno"> 1646</span> <span class="comment">// Validator keys listed in the local config file</span></div>
<div class="line"><a id="l01647" name="l01647"></a><span class="lineno"> 1647</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; jLocalStaticKeys =</div>
<div class="line"><a id="l01648" name="l01648"></a><span class="lineno"> 1648</span> (res[jss::local_static_keys] = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01649" name="l01649"></a><span class="lineno"> 1649</span> </div>
<div class="line"><a id="l01650" name="l01650"></a><span class="lineno"> 1650</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; key : localPublisherList.list)</div>
<div class="line"><a id="l01651" name="l01651"></a><span class="lineno"> 1651</span> jLocalStaticKeys.<a class="code hl_function" href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">append</a>(<a class="code hl_function" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(TokenType::NodePublic, key));</div>
<div class="line"><a id="l01652" name="l01652"></a><span class="lineno"> 1652</span> </div>
<div class="line"><a id="l01653" name="l01653"></a><span class="lineno"> 1653</span> <span class="comment">// Publisher lists</span></div>
<div class="line"><a id="l01654" name="l01654"></a><span class="lineno"> 1654</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; jPublisherLists =</div>
<div class="line"><a id="l01655" name="l01655"></a><span class="lineno"> 1655</span> (res[jss::publisher_lists] = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01656" name="l01656"></a><span class="lineno"> 1656</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [publicKey, pubCollection] : publisherLists_)</div>
<div class="line"><a id="l01657" name="l01657"></a><span class="lineno"> 1657</span> {</div>
<div class="line"><a id="l01658" name="l01658"></a><span class="lineno"> 1658</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; curr = jPublisherLists.<a class="code hl_function" href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">append</a>(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l01659" name="l01659"></a><span class="lineno"> 1659</span> curr[jss::pubkey_publisher] = <a class="code hl_function" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publicKey);</div>
<div class="line"><a id="l01660" name="l01660"></a><span class="lineno"> 1660</span> curr[jss::available] =</div>
<div class="line"><a id="l01661" name="l01661"></a><span class="lineno"> 1661</span> pubCollection.status == PublisherStatus::available;</div>
<div class="line"><a id="l01662" name="l01662"></a><span class="lineno"> 1662</span> </div>
<div class="line"><a id="l01663" name="l01663"></a><span class="lineno"> 1663</span> <span class="keyword">auto</span> appendList = [](<a class="code hl_struct" href="structripple_1_1ValidatorList_1_1PublisherList.html">PublisherList</a> <span class="keyword">const</span>&amp; publisherList,</div>
<div class="line"><a id="l01664" name="l01664"></a><span class="lineno"> 1664</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; target) {</div>
<div class="line"><a id="l01665" name="l01665"></a><span class="lineno"> 1665</span> target[jss::uri] = publisherList.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#a4d5d54c46f6269d96903ac574975f261">siteUri</a>;</div>
<div class="line"><a id="l01666" name="l01666"></a><span class="lineno"> 1666</span> <span class="keywordflow">if</span> (publisherList.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#ab1eaafc17bdc547f85f4898d5535c6e5">validUntil</a> != <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a id="l01667" name="l01667"></a><span class="lineno"> 1667</span> {</div>
<div class="line"><a id="l01668" name="l01668"></a><span class="lineno"> 1668</span> target[jss::seq] =</div>
<div class="line"><a id="l01669" name="l01669"></a><span class="lineno"> 1669</span> <span class="keyword">static_cast&lt;</span><a class="code hl_typedef" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(publisherList.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#aad9dd39b951a5b4a42bba0593ac16289">sequence</a>);</div>
<div class="line"><a id="l01670" name="l01670"></a><span class="lineno"> 1670</span> target[jss::expiration] = to_string(publisherList.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#ab1eaafc17bdc547f85f4898d5535c6e5">validUntil</a>);</div>
<div class="line"><a id="l01671" name="l01671"></a><span class="lineno"> 1671</span> }</div>
<div class="line"><a id="l01672" name="l01672"></a><span class="lineno"> 1672</span> <span class="keywordflow">if</span> (publisherList.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#ade8078adfb156f2f5b2d976fc91b6b75">validFrom</a> != <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a id="l01673" name="l01673"></a><span class="lineno"> 1673</span> target[jss::effective] = to_string(publisherList.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#ade8078adfb156f2f5b2d976fc91b6b75">validFrom</a>);</div>
<div class="line"><a id="l01674" name="l01674"></a><span class="lineno"> 1674</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; keys = (target[jss::list] = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01675" name="l01675"></a><span class="lineno"> 1675</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; key : publisherList.<a class="code hl_variable" href="structripple_1_1ValidatorList_1_1PublisherList.html#a1d97cceec8dbfaf845cceade47cfdbb4">list</a>)</div>
<div class="line"><a id="l01676" name="l01676"></a><span class="lineno"> 1676</span> {</div>
<div class="line"><a id="l01677" name="l01677"></a><span class="lineno"> 1677</span> keys.<a class="code hl_function" href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">append</a>(<a class="code hl_function" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(TokenType::NodePublic, key));</div>
<div class="line"><a id="l01678" name="l01678"></a><span class="lineno"> 1678</span> }</div>
<div class="line"><a id="l01679" name="l01679"></a><span class="lineno"> 1679</span> };</div>
<div class="line"><a id="l01680" name="l01680"></a><span class="lineno"> 1680</span> {</div>
<div class="line"><a id="l01681" name="l01681"></a><span class="lineno"> 1681</span> <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = pubCollection.current;</div>
<div class="line"><a id="l01682" name="l01682"></a><span class="lineno"> 1682</span> appendList(<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>, curr);</div>
<div class="line"><a id="l01683" name="l01683"></a><span class="lineno"> 1683</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil != <a class="code hl_typedef" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a id="l01684" name="l01684"></a><span class="lineno"> 1684</span> {</div>
<div class="line"><a id="l01685" name="l01685"></a><span class="lineno"> 1685</span> curr[jss::version] = pubCollection.rawVersion;</div>
<div class="line"><a id="l01686" name="l01686"></a><span class="lineno"> 1686</span> }</div>
<div class="line"><a id="l01687" name="l01687"></a><span class="lineno"> 1687</span> }</div>
<div class="line"><a id="l01688" name="l01688"></a><span class="lineno"> 1688</span> </div>
<div class="line"><a id="l01689" name="l01689"></a><span class="lineno"> 1689</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> remaining(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01690" name="l01690"></a><span class="lineno"> 1690</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, future] : pubCollection.remaining)</div>
<div class="line"><a id="l01691" name="l01691"></a><span class="lineno"> 1691</span> {</div>
<div class="line"><a id="l01692" name="l01692"></a><span class="lineno"> 1692</span> <span class="keyword">using namespace </span>std::chrono_literals;</div>
<div class="line"><a id="l01693" name="l01693"></a><span class="lineno"> 1693</span> </div>
<div class="line"><a id="l01694" name="l01694"></a><span class="lineno"> 1694</span> (void)sequence;</div>
<div class="line"><a id="l01695" name="l01695"></a><span class="lineno"> 1695</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; r = remaining.<a class="code hl_function" href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">append</a>(<a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l01696" name="l01696"></a><span class="lineno"> 1696</span> appendList(future, r);</div>
<div class="line"><a id="l01697" name="l01697"></a><span class="lineno"> 1697</span> <span class="comment">// Race conditions can happen, so make this check &quot;fuzzy&quot;</span></div>
<div class="line"><a id="l01698" name="l01698"></a><span class="lineno"> 1698</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01699" name="l01699"></a><span class="lineno"> 1699</span> future.validFrom &gt; timeKeeper_.now() + 600s,</div>
<div class="line"><a id="l01700" name="l01700"></a><span class="lineno"> 1700</span> <span class="stringliteral">&quot;ripple::ValidatorList::getJson : minimum valid from&quot;</span>);</div>
<div class="line"><a id="l01701" name="l01701"></a><span class="lineno"> 1701</span> }</div>
<div class="line"><a id="l01702" name="l01702"></a><span class="lineno"> 1702</span> <span class="keywordflow">if</span> (remaining.<a class="code hl_function" href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">size</a>())</div>
<div class="line"><a id="l01703" name="l01703"></a><span class="lineno"> 1703</span> curr[jss::remaining] = std::move(remaining);</div>
<div class="line"><a id="l01704" name="l01704"></a><span class="lineno"> 1704</span> }</div>
<div class="line"><a id="l01705" name="l01705"></a><span class="lineno"> 1705</span> </div>
<div class="line"><a id="l01706" name="l01706"></a><span class="lineno"> 1706</span> <span class="comment">// Trusted validator keys</span></div>
<div class="line"><a id="l01707" name="l01707"></a><span class="lineno"> 1707</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; jValidatorKeys =</div>
<div class="line"><a id="l01708" name="l01708"></a><span class="lineno"> 1708</span> (res[jss::trusted_validator_keys] = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01709" name="l01709"></a><span class="lineno"> 1709</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : trustedMasterKeys_)</div>
<div class="line"><a id="l01710" name="l01710"></a><span class="lineno"> 1710</span> {</div>
<div class="line"><a id="l01711" name="l01711"></a><span class="lineno"> 1711</span> jValidatorKeys.<a class="code hl_function" href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">append</a>(<a class="code hl_function" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(TokenType::NodePublic, k));</div>
<div class="line"><a id="l01712" name="l01712"></a><span class="lineno"> 1712</span> }</div>
<div class="line"><a id="l01713" name="l01713"></a><span class="lineno"> 1713</span> </div>
<div class="line"><a id="l01714" name="l01714"></a><span class="lineno"> 1714</span> <span class="comment">// signing keys</span></div>
<div class="line"><a id="l01715" name="l01715"></a><span class="lineno"> 1715</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; jSigningKeys = (res[jss::signing_keys] = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a id="l01716" name="l01716"></a><span class="lineno"> 1716</span> validatorManifests_.for_each_manifest([&amp;jSigningKeys,</div>
<div class="line"><a id="l01717" name="l01717"></a><span class="lineno"> 1717</span> <span class="keyword">this</span>](Manifest <span class="keyword">const</span>&amp; manifest) {</div>
<div class="line"><a id="l01718" name="l01718"></a><span class="lineno"> 1718</span> <span class="keyword">auto</span> it = keyListings_.find(manifest.masterKey);</div>
<div class="line"><a id="l01719" name="l01719"></a><span class="lineno"> 1719</span> <span class="keywordflow">if</span> (it != keyListings_.end() &amp;&amp; manifest.signingKey)</div>
<div class="line"><a id="l01720" name="l01720"></a><span class="lineno"> 1720</span> {</div>
<div class="line"><a id="l01721" name="l01721"></a><span class="lineno"> 1721</span> jSigningKeys[toBase58(TokenType::NodePublic, manifest.masterKey)] =</div>
<div class="line"><a id="l01722" name="l01722"></a><span class="lineno"> 1722</span> toBase58(TokenType::NodePublic, *manifest.signingKey);</div>
<div class="line"><a id="l01723" name="l01723"></a><span class="lineno"> 1723</span> }</div>
<div class="line"><a id="l01724" name="l01724"></a><span class="lineno"> 1724</span> });</div>
<div class="line"><a id="l01725" name="l01725"></a><span class="lineno"> 1725</span> </div>
<div class="line"><a id="l01726" name="l01726"></a><span class="lineno"> 1726</span> <span class="comment">// Negative UNL</span></div>
<div class="line"><a id="l01727" name="l01727"></a><span class="lineno"> 1727</span> <span class="keywordflow">if</span> (!negativeUNL_.empty())</div>
<div class="line"><a id="l01728" name="l01728"></a><span class="lineno"> 1728</span> {</div>
<div class="line"><a id="l01729" name="l01729"></a><span class="lineno"> 1729</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a>&amp; jNegativeUNL = (res[jss::NegativeUNL] = <a class="code hl_enumvalue" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a id="l01730" name="l01730"></a><span class="lineno"> 1730</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : negativeUNL_)</div>
<div class="line"><a id="l01731" name="l01731"></a><span class="lineno"> 1731</span> {</div>
<div class="line"><a id="l01732" name="l01732"></a><span class="lineno"> 1732</span> jNegativeUNL.<a class="code hl_function" href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">append</a>(<a class="code hl_function" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(TokenType::NodePublic, k));</div>
<div class="line"><a id="l01733" name="l01733"></a><span class="lineno"> 1733</span> }</div>
<div class="line"><a id="l01734" name="l01734"></a><span class="lineno"> 1734</span> }</div>
<div class="line"><a id="l01735" name="l01735"></a><span class="lineno"> 1735</span> </div>
<div class="line"><a id="l01736" name="l01736"></a><span class="lineno"> 1736</span> <span class="keywordflow">return</span> res;</div>
<div class="line"><a id="l01737" name="l01737"></a><span class="lineno"> 1737</span>}</div>
</div>
<div class="line"><a id="l01738" name="l01738"></a><span class="lineno"> 1738</span> </div>
<div class="line"><a id="l01739" name="l01739"></a><span class="lineno"> 1739</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen01740" data-start="{" data-end="}">
<div class="line"><a id="l01740" name="l01740"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#abc82f50ad5da8d3d12240e8025369789"> 1740</a></span>ValidatorList::for_each_listed(</div>
<div class="line"><a id="l01741" name="l01741"></a><span class="lineno"> 1741</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a>&lt;<span class="keywordtype">void</span>(<a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp;, <span class="keywordtype">bool</span>)&gt; func)<span class="keyword"> const</span></div>
<div class="line"><a id="l01742" name="l01742"></a><span class="lineno"> 1742</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01743" name="l01743"></a><span class="lineno"> 1743</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l01744" name="l01744"></a><span class="lineno"> 1744</span> </div>
<div class="line"><a id="l01745" name="l01745"></a><span class="lineno"> 1745</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; v : keyListings_)</div>
<div class="line"><a id="l01746" name="l01746"></a><span class="lineno"> 1746</span> func(v.first, trusted(read_lock, v.first));</div>
<div class="line"><a id="l01747" name="l01747"></a><span class="lineno"> 1747</span>}</div>
</div>
<div class="line"><a id="l01748" name="l01748"></a><span class="lineno"> 1748</span> </div>
<div class="line"><a id="l01749" name="l01749"></a><span class="lineno"> 1749</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen01750" data-start="{" data-end="}">
<div class="line"><a id="l01750" name="l01750"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a727b089f03d260cebfaca07ee4c83059"> 1750</a></span>ValidatorList::for_each_available(</div>
<div class="line"><a id="l01751" name="l01751"></a><span class="lineno"> 1751</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a>&lt;<span class="keywordtype">void</span>(</div>
<div class="line"><a id="l01752" name="l01752"></a><span class="lineno"> 1752</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; manifest,</div>
<div class="line"><a id="l01753" name="l01753"></a><span class="lineno"> 1753</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a id="l01754" name="l01754"></a><span class="lineno"> 1754</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a id="l01755" name="l01755"></a><span class="lineno"> 1755</span> <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a id="l01756" name="l01756"></a><span class="lineno"> 1756</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a id="l01757" name="l01757"></a><span class="lineno"> 1757</span> <a class="code hl_class" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash)&gt; func)<span class="keyword"> const</span></div>
<div class="line"><a id="l01758" name="l01758"></a><span class="lineno"> 1758</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01759" name="l01759"></a><span class="lineno"> 1759</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l01760" name="l01760"></a><span class="lineno"> 1760</span> </div>
<div class="line"><a id="l01761" name="l01761"></a><span class="lineno"> 1761</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [key, plCollection] : publisherLists_)</div>
<div class="line"><a id="l01762" name="l01762"></a><span class="lineno"> 1762</span> {</div>
<div class="line"><a id="l01763" name="l01763"></a><span class="lineno"> 1763</span> <span class="keywordflow">if</span> (plCollection.status != PublisherStatus::available)</div>
<div class="line"><a id="l01764" name="l01764"></a><span class="lineno"> 1764</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01765" name="l01765"></a><span class="lineno"> 1765</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01766" name="l01766"></a><span class="lineno"> 1766</span> plCollection.maxSequence != 0,</div>
<div class="line"><a id="l01767" name="l01767"></a><span class="lineno"> 1767</span> <span class="stringliteral">&quot;ripple::ValidatorList::for_each_available : nonzero maxSequence&quot;</span>);</div>
<div class="line"><a id="l01768" name="l01768"></a><span class="lineno"> 1768</span> func(</div>
<div class="line"><a id="l01769" name="l01769"></a><span class="lineno"> 1769</span> plCollection.rawManifest,</div>
<div class="line"><a id="l01770" name="l01770"></a><span class="lineno"> 1770</span> plCollection.rawVersion,</div>
<div class="line"><a id="l01771" name="l01771"></a><span class="lineno"> 1771</span> buildBlobInfos(plCollection),</div>
<div class="line"><a id="l01772" name="l01772"></a><span class="lineno"> 1772</span> key,</div>
<div class="line"><a id="l01773" name="l01773"></a><span class="lineno"> 1773</span> plCollection.maxSequence.value_or(0),</div>
<div class="line"><a id="l01774" name="l01774"></a><span class="lineno"> 1774</span> plCollection.fullHash);</div>
<div class="line"><a id="l01775" name="l01775"></a><span class="lineno"> 1775</span> }</div>
<div class="line"><a id="l01776" name="l01776"></a><span class="lineno"> 1776</span>}</div>
</div>
<div class="line"><a id="l01777" name="l01777"></a><span class="lineno"> 1777</span> </div>
<div class="line"><a id="l01778" name="l01778"></a><span class="lineno"> 1778</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;Json::Value&gt;</a></div>
<div class="foldopen" id="foldopen01779" data-start="{" data-end="}">
<div class="line"><a id="l01779" name="l01779"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a62f2c33d93c3985c6c486a9bfc6499fe"> 1779</a></span>ValidatorList::getAvailable(</div>
<div class="line"><a id="l01780" name="l01780"></a><span class="lineno"> 1780</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string_view.html">std::string_view</a> pubKey,</div>
<div class="line"><a id="l01781" name="l01781"></a><span class="lineno"> 1781</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::uint32_t&gt;</a> forceVersion <span class="comment">/* = {} */</span>)</div>
<div class="line"><a id="l01782" name="l01782"></a><span class="lineno"> 1782</span>{</div>
<div class="line"><a id="l01783" name="l01783"></a><span class="lineno"> 1783</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l01784" name="l01784"></a><span class="lineno"> 1784</span> </div>
<div class="line"><a id="l01785" name="l01785"></a><span class="lineno"> 1785</span> <span class="keyword">auto</span> <span class="keyword">const</span> keyBlob = <a class="code hl_function" href="namespaceripple.html#aaee5c5a25fe700e8c60aa391e8a7e6c6">strViewUnHex</a>(pubKey);</div>
<div class="line"><a id="l01786" name="l01786"></a><span class="lineno"> 1786</span> </div>
<div class="line"><a id="l01787" name="l01787"></a><span class="lineno"> 1787</span> <span class="keywordflow">if</span> (!keyBlob || !<a class="code hl_function" href="namespaceripple.html#a798e187ba7443d8f951b810a12d50976">publicKeyType</a>(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(*keyBlob)))</div>
<div class="line"><a id="l01788" name="l01788"></a><span class="lineno"> 1788</span> {</div>
<div class="line"><a id="l01789" name="l01789"></a><span class="lineno"> 1789</span> JLOG(j_.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Invalid requested validator list publisher key: &quot;</span></div>
<div class="line"><a id="l01790" name="l01790"></a><span class="lineno"> 1790</span> &lt;&lt; pubKey;</div>
<div class="line"><a id="l01791" name="l01791"></a><span class="lineno"> 1791</span> <span class="keywordflow">return</span> {};</div>
<div class="line"><a id="l01792" name="l01792"></a><span class="lineno"> 1792</span> }</div>
<div class="line"><a id="l01793" name="l01793"></a><span class="lineno"> 1793</span> </div>
<div class="line"><a id="l01794" name="l01794"></a><span class="lineno"> 1794</span> <span class="keyword">auto</span> <span class="keywordtype">id</span> = <a class="code hl_class" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code hl_function" href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">makeSlice</a>(*keyBlob));</div>
<div class="line"><a id="l01795" name="l01795"></a><span class="lineno"> 1795</span> </div>
<div class="line"><a id="l01796" name="l01796"></a><span class="lineno"> 1796</span> <span class="keyword">auto</span> <span class="keyword">const</span> iter = publisherLists_.find(<span class="keywordtype">id</span>);</div>
<div class="line"><a id="l01797" name="l01797"></a><span class="lineno"> 1797</span> </div>
<div class="line"><a id="l01798" name="l01798"></a><span class="lineno"> 1798</span> <span class="keywordflow">if</span> (iter == publisherLists_.end() ||</div>
<div class="line"><a id="l01799" name="l01799"></a><span class="lineno"> 1799</span> iter-&gt;second.status != PublisherStatus::available)</div>
<div class="line"><a id="l01800" name="l01800"></a><span class="lineno"> 1800</span> <span class="keywordflow">return</span> {};</div>
<div class="line"><a id="l01801" name="l01801"></a><span class="lineno"> 1801</span> </div>
<div class="line"><a id="l01802" name="l01802"></a><span class="lineno"> 1802</span> <a class="code hl_class" href="classJson_1_1Value.html">Json::Value</a> value =</div>
<div class="line"><a id="l01803" name="l01803"></a><span class="lineno"> 1803</span> buildFileData(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a>{pubKey}, iter-&gt;second, forceVersion, j_);</div>
<div class="line"><a id="l01804" name="l01804"></a><span class="lineno"> 1804</span> </div>
<div class="line"><a id="l01805" name="l01805"></a><span class="lineno"> 1805</span> <span class="keywordflow">return</span> value;</div>
<div class="line"><a id="l01806" name="l01806"></a><span class="lineno"> 1806</span>}</div>
</div>
<div class="line"><a id="l01807" name="l01807"></a><span class="lineno"> 1807</span> </div>
<div class="line"><a id="l01808" name="l01808"></a><span class="lineno"> 1808</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen01809" data-start="{" data-end="}">
<div class="line"><a id="l01809" name="l01809"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b"> 1809</a></span>ValidatorList::calculateQuorum(</div>
<div class="line"><a id="l01810" name="l01810"></a><span class="lineno"> 1810</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> unlSize,</div>
<div class="line"><a id="l01811" name="l01811"></a><span class="lineno"> 1811</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> effectiveUnlSize,</div>
<div class="line"><a id="l01812" name="l01812"></a><span class="lineno"> 1812</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> seenSize)</div>
<div class="line"><a id="l01813" name="l01813"></a><span class="lineno"> 1813</span>{</div>
<div class="line"><a id="l01814" name="l01814"></a><span class="lineno"> 1814</span> <span class="comment">// Use quorum if specified via command line.</span></div>
<div class="line"><a id="l01815" name="l01815"></a><span class="lineno"> 1815</span> <span class="keywordflow">if</span> (minimumQuorum_ &gt; 0)</div>
<div class="line"><a id="l01816" name="l01816"></a><span class="lineno"> 1816</span> {</div>
<div class="line"><a id="l01817" name="l01817"></a><span class="lineno"> 1817</span> JLOG(j_.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Using potentially unsafe quorum of &quot;</span></div>
<div class="line"><a id="l01818" name="l01818"></a><span class="lineno"> 1818</span> &lt;&lt; *minimumQuorum_</div>
<div class="line"><a id="l01819" name="l01819"></a><span class="lineno"> 1819</span> &lt;&lt; <span class="stringliteral">&quot; as specified on the command line&quot;</span>;</div>
<div class="line"><a id="l01820" name="l01820"></a><span class="lineno"> 1820</span> <span class="keywordflow">return</span> *minimumQuorum_;</div>
<div class="line"><a id="l01821" name="l01821"></a><span class="lineno"> 1821</span> }</div>
<div class="line"><a id="l01822" name="l01822"></a><span class="lineno"> 1822</span> </div>
<div class="line"><a id="l01823" name="l01823"></a><span class="lineno"> 1823</span> <span class="keywordflow">if</span> (!publisherLists_.empty())</div>
<div class="line"><a id="l01824" name="l01824"></a><span class="lineno"> 1824</span> {</div>
<div class="line"><a id="l01825" name="l01825"></a><span class="lineno"> 1825</span> <span class="comment">// Do not use achievable quorum until lists from a sufficient number of</span></div>
<div class="line"><a id="l01826" name="l01826"></a><span class="lineno"> 1826</span> <span class="comment">// configured publishers are available</span></div>
<div class="line"><a id="l01827" name="l01827"></a><span class="lineno"> 1827</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">unavailable</a> = 0;</div>
<div class="line"><a id="l01828" name="l01828"></a><span class="lineno"> 1828</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; list : publisherLists_)</div>
<div class="line"><a id="l01829" name="l01829"></a><span class="lineno"> 1829</span> {</div>
<div class="line"><a id="l01830" name="l01830"></a><span class="lineno"> 1830</span> <span class="keywordflow">if</span> (list.second.status != PublisherStatus::available)</div>
<div class="line"><a id="l01831" name="l01831"></a><span class="lineno"> 1831</span> <a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">unavailable</a> += 1;</div>
<div class="line"><a id="l01832" name="l01832"></a><span class="lineno"> 1832</span> }</div>
<div class="line"><a id="l01833" name="l01833"></a><span class="lineno"> 1833</span> <span class="comment">// There are two, subtly different, sides to list threshold:</span></div>
<div class="line"><a id="l01834" name="l01834"></a><span class="lineno"> 1834</span> <span class="comment">//</span></div>
<div class="line"><a id="l01835" name="l01835"></a><span class="lineno"> 1835</span> <span class="comment">// 1. The minimum required intersection between lists listThreshold_</span></div>
<div class="line"><a id="l01836" name="l01836"></a><span class="lineno"> 1836</span> <span class="comment">// for a validator to be included in trustedMasterKeys_.</span></div>
<div class="line"><a id="l01837" name="l01837"></a><span class="lineno"> 1837</span> <span class="comment">// If this many (or more) publishers are unavailable, we are likely</span></div>
<div class="line"><a id="l01838" name="l01838"></a><span class="lineno"> 1838</span> <span class="comment">// to NOT include a validator which otherwise would have been used.</span></div>
<div class="line"><a id="l01839" name="l01839"></a><span class="lineno"> 1839</span> <span class="comment">// We disable quorum if this happens.</span></div>
<div class="line"><a id="l01840" name="l01840"></a><span class="lineno"> 1840</span> <span class="comment">// 2. The minimum number of publishers which, when unavailable, will</span></div>
<div class="line"><a id="l01841" name="l01841"></a><span class="lineno"> 1841</span> <span class="comment">// prevent us from hitting the above threshold on ANY validator.</span></div>
<div class="line"><a id="l01842" name="l01842"></a><span class="lineno"> 1842</span> <span class="comment">// This is calculated as:</span></div>
<div class="line"><a id="l01843" name="l01843"></a><span class="lineno"> 1843</span> <span class="comment">// N - M + 1</span></div>
<div class="line"><a id="l01844" name="l01844"></a><span class="lineno"> 1844</span> <span class="comment">// where</span></div>
<div class="line"><a id="l01845" name="l01845"></a><span class="lineno"> 1845</span> <span class="comment">// N: number of publishers i.e. publisherLists_.size()</span></div>
<div class="line"><a id="l01846" name="l01846"></a><span class="lineno"> 1846</span> <span class="comment">// M: minimum required intersection i.e. listThreshold_</span></div>
<div class="line"><a id="l01847" name="l01847"></a><span class="lineno"> 1847</span> <span class="comment">// If this happens, we still have this local validator and we do not</span></div>
<div class="line"><a id="l01848" name="l01848"></a><span class="lineno"> 1848</span> <span class="comment">// want it to form a quorum of 1, so we disable quorum as well.</span></div>
<div class="line"><a id="l01849" name="l01849"></a><span class="lineno"> 1849</span> <span class="comment">//</span></div>
<div class="line"><a id="l01850" name="l01850"></a><span class="lineno"> 1850</span> <span class="comment">// We disable quorum if the number of unavailable publishers exceeds</span></div>
<div class="line"><a id="l01851" name="l01851"></a><span class="lineno"> 1851</span> <span class="comment">// either of the above thresholds</span></div>
<div class="line"><a id="l01852" name="l01852"></a><span class="lineno"> 1852</span> <span class="keyword">auto</span> <span class="keyword">const</span> errorThreshold = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/min.html">std::min</a>(</div>
<div class="line"><a id="l01853" name="l01853"></a><span class="lineno"> 1853</span> listThreshold_, <span class="comment">//</span></div>
<div class="line"><a id="l01854" name="l01854"></a><span class="lineno"> 1854</span> publisherLists_.size() - listThreshold_ + 1);</div>
<div class="line"><a id="l01855" name="l01855"></a><span class="lineno"> 1855</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01856" name="l01856"></a><span class="lineno"> 1856</span> errorThreshold &gt; 0,</div>
<div class="line"><a id="l01857" name="l01857"></a><span class="lineno"> 1857</span> <span class="stringliteral">&quot;ripple::ValidatorList::calculateQuorum : nonzero error threshold&quot;</span>);</div>
<div class="line"><a id="l01858" name="l01858"></a><span class="lineno"> 1858</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">unavailable</a> &gt;= errorThreshold)</div>
<div class="line"><a id="l01859" name="l01859"></a><span class="lineno"> 1859</span> <span class="keywordflow">return</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/types/numeric_limits/max.html">std::numeric_limits&lt;std::size_t&gt;::max</a>();</div>
<div class="line"><a id="l01860" name="l01860"></a><span class="lineno"> 1860</span> }</div>
<div class="line"><a id="l01861" name="l01861"></a><span class="lineno"> 1861</span> </div>
<div class="line"><a id="l01862" name="l01862"></a><span class="lineno"> 1862</span> <span class="comment">// Use an 80% quorum to balance fork safety, liveness, and required UNL</span></div>
<div class="line"><a id="l01863" name="l01863"></a><span class="lineno"> 1863</span> <span class="comment">// overlap.</span></div>
<div class="line"><a id="l01864" name="l01864"></a><span class="lineno"> 1864</span> <span class="comment">//</span></div>
<div class="line"><a id="l01865" name="l01865"></a><span class="lineno"> 1865</span> <span class="comment">// Theorem 8 of the Analysis of the XRP Ledger Consensus Protocol</span></div>
<div class="line"><a id="l01866" name="l01866"></a><span class="lineno"> 1866</span> <span class="comment">// (https://arxiv.org/abs/1802.07242) says:</span></div>
<div class="line"><a id="l01867" name="l01867"></a><span class="lineno"> 1867</span> <span class="comment">// XRP LCP guarantees fork safety if Oi,j &gt; nj/2 + ni qi + ti,j</span></div>
<div class="line"><a id="l01868" name="l01868"></a><span class="lineno"> 1868</span> <span class="comment">// for every pair of nodes Pi, Pj.</span></div>
<div class="line"><a id="l01869" name="l01869"></a><span class="lineno"> 1869</span> <span class="comment">//</span></div>
<div class="line"><a id="l01870" name="l01870"></a><span class="lineno"> 1870</span> <span class="comment">// ni: size of Pi&#39;s UNL</span></div>
<div class="line"><a id="l01871" name="l01871"></a><span class="lineno"> 1871</span> <span class="comment">// nj: size of Pj&#39;s UNL</span></div>
<div class="line"><a id="l01872" name="l01872"></a><span class="lineno"> 1872</span> <span class="comment">// Oi,j: number of validators in both UNLs</span></div>
<div class="line"><a id="l01873" name="l01873"></a><span class="lineno"> 1873</span> <span class="comment">// qi: validation quorum for Pi&#39;s UNL</span></div>
<div class="line"><a id="l01874" name="l01874"></a><span class="lineno"> 1874</span> <span class="comment">// ti, tj: maximum number of allowed Byzantine faults in Pi and Pj&#39;s</span></div>
<div class="line"><a id="l01875" name="l01875"></a><span class="lineno"> 1875</span> <span class="comment">// UNLs ti,j: min{ti, tj, Oi,j}</span></div>
<div class="line"><a id="l01876" name="l01876"></a><span class="lineno"> 1876</span> <span class="comment">//</span></div>
<div class="line"><a id="l01877" name="l01877"></a><span class="lineno"> 1877</span> <span class="comment">// Assume ni &lt; nj, meaning and ti,j = ti</span></div>
<div class="line"><a id="l01878" name="l01878"></a><span class="lineno"> 1878</span> <span class="comment">//</span></div>
<div class="line"><a id="l01879" name="l01879"></a><span class="lineno"> 1879</span> <span class="comment">// For qi = .8*ni, we make ti &lt;= .2*ni</span></div>
<div class="line"><a id="l01880" name="l01880"></a><span class="lineno"> 1880</span> <span class="comment">// (We could make ti lower and tolerate less UNL overlap. However in</span></div>
<div class="line"><a id="l01881" name="l01881"></a><span class="lineno"> 1881</span> <span class="comment">// order to prioritize safety over liveness, we need ti &gt;= ni - qi)</span></div>
<div class="line"><a id="l01882" name="l01882"></a><span class="lineno"> 1882</span> <span class="comment">//</span></div>
<div class="line"><a id="l01883" name="l01883"></a><span class="lineno"> 1883</span> <span class="comment">// An 80% quorum allows two UNLs to safely have &lt; .2*ni unique</span></div>
<div class="line"><a id="l01884" name="l01884"></a><span class="lineno"> 1884</span> <span class="comment">// validators between them:</span></div>
<div class="line"><a id="l01885" name="l01885"></a><span class="lineno"> 1885</span> <span class="comment">//</span></div>
<div class="line"><a id="l01886" name="l01886"></a><span class="lineno"> 1886</span> <span class="comment">// pi = ni - Oi,j</span></div>
<div class="line"><a id="l01887" name="l01887"></a><span class="lineno"> 1887</span> <span class="comment">// pj = nj - Oi,j</span></div>
<div class="line"><a id="l01888" name="l01888"></a><span class="lineno"> 1888</span> <span class="comment">//</span></div>
<div class="line"><a id="l01889" name="l01889"></a><span class="lineno"> 1889</span> <span class="comment">// Oi,j &gt; nj/2 + ni qi + ti,j</span></div>
<div class="line"><a id="l01890" name="l01890"></a><span class="lineno"> 1890</span> <span class="comment">// ni - pi &gt; (ni - pi + pj)/2 + ni .8*ni + .2*ni</span></div>
<div class="line"><a id="l01891" name="l01891"></a><span class="lineno"> 1891</span> <span class="comment">// pi + pj &lt; .2*ni</span></div>
<div class="line"><a id="l01892" name="l01892"></a><span class="lineno"> 1892</span> <span class="comment">//</span></div>
<div class="line"><a id="l01893" name="l01893"></a><span class="lineno"> 1893</span> <span class="comment">// Note that the negative UNL protocol introduced the</span></div>
<div class="line"><a id="l01894" name="l01894"></a><span class="lineno"> 1894</span> <span class="comment">// AbsoluteMinimumQuorum which is 60% of the original UNL size. The</span></div>
<div class="line"><a id="l01895" name="l01895"></a><span class="lineno"> 1895</span> <span class="comment">// effective quorum should not be lower than it.</span></div>
<div class="line"><a id="l01896" name="l01896"></a><span class="lineno"> 1896</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a><span class="keyword">&gt;</span>(<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(</div>
<div class="line"><a id="l01897" name="l01897"></a><span class="lineno"> 1897</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(effectiveUnlSize * 0.8f), <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(unlSize * 0.6f)));</div>
<div class="line"><a id="l01898" name="l01898"></a><span class="lineno"> 1898</span>}</div>
</div>
<div class="line"><a id="l01899" name="l01899"></a><span class="lineno"> 1899</span> </div>
<div class="line"><a id="l01900" name="l01900"></a><span class="lineno"> 1900</span><a class="code hl_struct" href="structripple_1_1TrustChanges.html">TrustChanges</a></div>
<div class="foldopen" id="foldopen01901" data-start="{" data-end="}">
<div class="line"><a id="l01901" name="l01901"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aa4813b41483e2df542ce2731fb7b5f5d"> 1901</a></span>ValidatorList::updateTrusted(</div>
<div class="line"><a id="l01902" name="l01902"></a><span class="lineno"> 1902</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;NodeID&gt;</a> <span class="keyword">const</span>&amp; seenValidators,</div>
<div class="line"><a id="l01903" name="l01903"></a><span class="lineno"> 1903</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a> closeTime,</div>
<div class="line"><a id="l01904" name="l01904"></a><span class="lineno"> 1904</span> <a class="code hl_class" href="classripple_1_1NetworkOPs.html">NetworkOPs</a>&amp; ops,</div>
<div class="line"><a id="l01905" name="l01905"></a><span class="lineno"> 1905</span> <a class="code hl_class" href="classripple_1_1Overlay.html">Overlay</a>&amp; overlay,</div>
<div class="line"><a id="l01906" name="l01906"></a><span class="lineno"> 1906</span> <a class="code hl_class" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter)</div>
<div class="line"><a id="l01907" name="l01907"></a><span class="lineno"> 1907</span>{</div>
<div class="line"><a id="l01908" name="l01908"></a><span class="lineno"> 1908</span> <span class="keyword">using namespace </span>std::chrono_literals;</div>
<div class="line"><a id="l01909" name="l01909"></a><span class="lineno"> 1909</span> <span class="keywordflow">if</span> (timeKeeper_.now() &gt; closeTime + 30s)</div>
<div class="line"><a id="l01910" name="l01910"></a><span class="lineno"> 1910</span> closeTime = timeKeeper_.now();</div>
<div class="line"><a id="l01911" name="l01911"></a><span class="lineno"> 1911</span> </div>
<div class="line"><a id="l01912" name="l01912"></a><span class="lineno"> 1912</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{mutex_};</div>
<div class="line"><a id="l01913" name="l01913"></a><span class="lineno"> 1913</span> </div>
<div class="line"><a id="l01914" name="l01914"></a><span class="lineno"> 1914</span> <span class="comment">// Rotate pending and remove expired published lists</span></div>
<div class="line"><a id="l01915" name="l01915"></a><span class="lineno"> 1915</span> <span class="keywordtype">bool</span> good = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01916" name="l01916"></a><span class="lineno"> 1916</span> <span class="comment">// localPublisherList is not processed here. This is because the</span></div>
<div class="line"><a id="l01917" name="l01917"></a><span class="lineno"> 1917</span> <span class="comment">// Validators specified in the local config file do not expire nor do</span></div>
<div class="line"><a id="l01918" name="l01918"></a><span class="lineno"> 1918</span> <span class="comment">// they have a &quot;remaining&quot; section of PublisherList.</span></div>
<div class="line"><a id="l01919" name="l01919"></a><span class="lineno"> 1919</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; [pubKey, collection] : publisherLists_)</div>
<div class="line"><a id="l01920" name="l01920"></a><span class="lineno"> 1920</span> {</div>
<div class="line"><a id="l01921" name="l01921"></a><span class="lineno"> 1921</span> {</div>
<div class="line"><a id="l01922" name="l01922"></a><span class="lineno"> 1922</span> <span class="keyword">auto</span>&amp; remaining = collection.remaining;</div>
<div class="line"><a id="l01923" name="l01923"></a><span class="lineno"> 1923</span> <span class="keyword">auto</span> <span class="keyword">const</span> firstIter = remaining.begin();</div>
<div class="line"><a id="l01924" name="l01924"></a><span class="lineno"> 1924</span> <span class="keyword">auto</span> iter = firstIter;</div>
<div class="line"><a id="l01925" name="l01925"></a><span class="lineno"> 1925</span> <span class="keywordflow">if</span> (iter != remaining.end() &amp;&amp; iter-&gt;second.validFrom &lt;= closeTime)</div>
<div class="line"><a id="l01926" name="l01926"></a><span class="lineno"> 1926</span> {</div>
<div class="line"><a id="l01927" name="l01927"></a><span class="lineno"> 1927</span> <span class="comment">// Find the LAST candidate that is ready to go live.</span></div>
<div class="line"><a id="l01928" name="l01928"></a><span class="lineno"> 1928</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> next = <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter); next != remaining.end() &amp;&amp;</div>
<div class="line"><a id="l01929" name="l01929"></a><span class="lineno"> 1929</span> next-&gt;second.validFrom &lt;= closeTime;</div>
<div class="line"><a id="l01930" name="l01930"></a><span class="lineno"> 1930</span> ++iter, ++next)</div>
<div class="line"><a id="l01931" name="l01931"></a><span class="lineno"> 1931</span> {</div>
<div class="line"><a id="l01932" name="l01932"></a><span class="lineno"> 1932</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01933" name="l01933"></a><span class="lineno"> 1933</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter) == next,</div>
<div class="line"><a id="l01934" name="l01934"></a><span class="lineno"> 1934</span> <span class="stringliteral">&quot;ripple::ValidatorList::updateTrusted : sequential &quot;</span></div>
<div class="line"><a id="l01935" name="l01935"></a><span class="lineno"> 1935</span> <span class="stringliteral">&quot;remaining&quot;</span>);</div>
<div class="line"><a id="l01936" name="l01936"></a><span class="lineno"> 1936</span> }</div>
<div class="line"><a id="l01937" name="l01937"></a><span class="lineno"> 1937</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01938" name="l01938"></a><span class="lineno"> 1938</span> iter != remaining.end(),</div>
<div class="line"><a id="l01939" name="l01939"></a><span class="lineno"> 1939</span> <span class="stringliteral">&quot;ripple::ValidatorList::updateTrusted : non-end of &quot;</span></div>
<div class="line"><a id="l01940" name="l01940"></a><span class="lineno"> 1940</span> <span class="stringliteral">&quot;remaining&quot;</span>);</div>
<div class="line"><a id="l01941" name="l01941"></a><span class="lineno"> 1941</span> </div>
<div class="line"><a id="l01942" name="l01942"></a><span class="lineno"> 1942</span> <span class="comment">// Rotate the pending list in to current</span></div>
<div class="line"><a id="l01943" name="l01943"></a><span class="lineno"> 1943</span> <span class="keyword">auto</span> sequence = iter-&gt;first;</div>
<div class="line"><a id="l01944" name="l01944"></a><span class="lineno"> 1944</span> <span class="keyword">auto</span>&amp; candidate = iter-&gt;second;</div>
<div class="line"><a id="l01945" name="l01945"></a><span class="lineno"> 1945</span> <span class="keyword">auto</span>&amp; <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = collection.current;</div>
<div class="line"><a id="l01946" name="l01946"></a><span class="lineno"> 1946</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01947" name="l01947"></a><span class="lineno"> 1947</span> candidate.validFrom &lt;= closeTime,</div>
<div class="line"><a id="l01948" name="l01948"></a><span class="lineno"> 1948</span> <span class="stringliteral">&quot;ripple::ValidatorList::updateTrusted : maximum time&quot;</span>);</div>
<div class="line"><a id="l01949" name="l01949"></a><span class="lineno"> 1949</span> </div>
<div class="line"><a id="l01950" name="l01950"></a><span class="lineno"> 1950</span> <span class="keyword">auto</span> <span class="keyword">const</span> oldList = <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.list;</div>
<div class="line"><a id="l01951" name="l01951"></a><span class="lineno"> 1951</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = std::move(candidate);</div>
<div class="line"><a id="l01952" name="l01952"></a><span class="lineno"> 1952</span> <span class="keywordflow">if</span> (collection.status != PublisherStatus::available)</div>
<div class="line"><a id="l01953" name="l01953"></a><span class="lineno"> 1953</span> collection.status = PublisherStatus::available;</div>
<div class="line"><a id="l01954" name="l01954"></a><span class="lineno"> 1954</span> XRPL_ASSERT(</div>
<div class="line"><a id="l01955" name="l01955"></a><span class="lineno"> 1955</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.sequence == sequence,</div>
<div class="line"><a id="l01956" name="l01956"></a><span class="lineno"> 1956</span> <span class="stringliteral">&quot;ripple::ValidatorList::updateTrusted : sequence match&quot;</span>);</div>
<div class="line"><a id="l01957" name="l01957"></a><span class="lineno"> 1957</span> <span class="comment">// If the list is expired, remove the validators so they don&#39;t</span></div>
<div class="line"><a id="l01958" name="l01958"></a><span class="lineno"> 1958</span> <span class="comment">// get processed in. The expiration check below will do the rest</span></div>
<div class="line"><a id="l01959" name="l01959"></a><span class="lineno"> 1959</span> <span class="comment">// of the work</span></div>
<div class="line"><a id="l01960" name="l01960"></a><span class="lineno"> 1960</span> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil &lt;= closeTime)</div>
<div class="line"><a id="l01961" name="l01961"></a><span class="lineno"> 1961</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.list.clear();</div>
<div class="line"><a id="l01962" name="l01962"></a><span class="lineno"> 1962</span> </div>
<div class="line"><a id="l01963" name="l01963"></a><span class="lineno"> 1963</span> updatePublisherList(pubKey, <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>, oldList, lock);</div>
<div class="line"><a id="l01964" name="l01964"></a><span class="lineno"> 1964</span> </div>
<div class="line"><a id="l01965" name="l01965"></a><span class="lineno"> 1965</span> <span class="comment">// Only broadcast the current, which will consequently only</span></div>
<div class="line"><a id="l01966" name="l01966"></a><span class="lineno"> 1966</span> <span class="comment">// send to peers that don&#39;t understand v2, or which are</span></div>
<div class="line"><a id="l01967" name="l01967"></a><span class="lineno"> 1967</span> <span class="comment">// unknown (unlikely). Those that do understand v2 should</span></div>
<div class="line"><a id="l01968" name="l01968"></a><span class="lineno"> 1968</span> <span class="comment">// already have this list and are in the process of</span></div>
<div class="line"><a id="l01969" name="l01969"></a><span class="lineno"> 1969</span> <span class="comment">// switching themselves.</span></div>
<div class="line"><a id="l01970" name="l01970"></a><span class="lineno"> 1970</span> broadcastBlobs(</div>
<div class="line"><a id="l01971" name="l01971"></a><span class="lineno"> 1971</span> pubKey,</div>
<div class="line"><a id="l01972" name="l01972"></a><span class="lineno"> 1972</span> collection,</div>
<div class="line"><a id="l01973" name="l01973"></a><span class="lineno"> 1973</span> sequence,</div>
<div class="line"><a id="l01974" name="l01974"></a><span class="lineno"> 1974</span> <a class="code hl_enumvalue" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.hash,</div>
<div class="line"><a id="l01975" name="l01975"></a><span class="lineno"> 1975</span> overlay,</div>
<div class="line"><a id="l01976" name="l01976"></a><span class="lineno"> 1976</span> hashRouter,</div>
<div class="line"><a id="l01977" name="l01977"></a><span class="lineno"> 1977</span> j_);</div>
<div class="line"><a id="l01978" name="l01978"></a><span class="lineno"> 1978</span> </div>
<div class="line"><a id="l01979" name="l01979"></a><span class="lineno"> 1979</span> <span class="comment">// Erase any candidates that we skipped over, plus this one</span></div>
<div class="line"><a id="l01980" name="l01980"></a><span class="lineno"> 1980</span> remaining.erase(firstIter, <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter));</div>
<div class="line"><a id="l01981" name="l01981"></a><span class="lineno"> 1981</span> }</div>
<div class="line"><a id="l01982" name="l01982"></a><span class="lineno"> 1982</span> }</div>
<div class="line"><a id="l01983" name="l01983"></a><span class="lineno"> 1983</span> <span class="comment">// Remove if expired</span></div>
<div class="line"><a id="l01984" name="l01984"></a><span class="lineno"> 1984</span> <span class="comment">// ValidatorLists specified in the local config file never expire.</span></div>
<div class="line"><a id="l01985" name="l01985"></a><span class="lineno"> 1985</span> <span class="comment">// Hence, the below steps are not relevant for localPublisherList</span></div>
<div class="line"><a id="l01986" name="l01986"></a><span class="lineno"> 1986</span> <span class="keywordflow">if</span> (collection.status == PublisherStatus::available &amp;&amp;</div>
<div class="line"><a id="l01987" name="l01987"></a><span class="lineno"> 1987</span> collection.current.validUntil &lt;= closeTime)</div>
<div class="line"><a id="l01988" name="l01988"></a><span class="lineno"> 1988</span> {</div>
<div class="line"><a id="l01989" name="l01989"></a><span class="lineno"> 1989</span> removePublisherList(lock, pubKey, PublisherStatus::expired);</div>
<div class="line"><a id="l01990" name="l01990"></a><span class="lineno"> 1990</span> ops.<a class="code hl_function" href="classripple_1_1NetworkOPs.html#a3b837bd8b8633d45d7e5f26961fab856">setUNLBlocked</a>();</div>
<div class="line"><a id="l01991" name="l01991"></a><span class="lineno"> 1991</span> }</div>
<div class="line"><a id="l01992" name="l01992"></a><span class="lineno"> 1992</span> <span class="keywordflow">if</span> (collection.status != PublisherStatus::available)</div>
<div class="line"><a id="l01993" name="l01993"></a><span class="lineno"> 1993</span> good = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01994" name="l01994"></a><span class="lineno"> 1994</span> }</div>
<div class="line"><a id="l01995" name="l01995"></a><span class="lineno"> 1995</span> <span class="keywordflow">if</span> (good)</div>
<div class="line"><a id="l01996" name="l01996"></a><span class="lineno"> 1996</span> ops.<a class="code hl_function" href="classripple_1_1NetworkOPs.html#ace637a61664a15f70bc362f2ad1101e9">clearUNLBlocked</a>();</div>
<div class="line"><a id="l01997" name="l01997"></a><span class="lineno"> 1997</span> </div>
<div class="line"><a id="l01998" name="l01998"></a><span class="lineno"> 1998</span> <a class="code hl_struct" href="structripple_1_1TrustChanges.html">TrustChanges</a> trustChanges;</div>
<div class="line"><a id="l01999" name="l01999"></a><span class="lineno"> 1999</span> </div>
<div class="line"><a id="l02000" name="l02000"></a><span class="lineno"> 2000</span> <span class="keyword">auto</span> it = trustedMasterKeys_.cbegin();</div>
<div class="line"><a id="l02001" name="l02001"></a><span class="lineno"> 2001</span> <span class="keywordflow">while</span> (it != trustedMasterKeys_.cend())</div>
<div class="line"><a id="l02002" name="l02002"></a><span class="lineno"> 2002</span> {</div>
<div class="line"><a id="l02003" name="l02003"></a><span class="lineno"> 2003</span> <span class="keyword">auto</span> <span class="keyword">const</span> kit = keyListings_.find(*it);</div>
<div class="line"><a id="l02004" name="l02004"></a><span class="lineno"> 2004</span> <span class="keywordflow">if</span> (kit == keyListings_.end() || <span class="comment">//</span></div>
<div class="line"><a id="l02005" name="l02005"></a><span class="lineno"> 2005</span> kit-&gt;second &lt; listThreshold_ || <span class="comment">//</span></div>
<div class="line"><a id="l02006" name="l02006"></a><span class="lineno"> 2006</span> validatorManifests_.revoked(*it))</div>
<div class="line"><a id="l02007" name="l02007"></a><span class="lineno"> 2007</span> {</div>
<div class="line"><a id="l02008" name="l02008"></a><span class="lineno"> 2008</span> trustChanges.<a class="code hl_variable" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.insert(<a class="code hl_function" href="namespaceripple.html#aa2a27f242f6d150ff52f2ad0b2e2a512">calcNodeID</a>(*it));</div>
<div class="line"><a id="l02009" name="l02009"></a><span class="lineno"> 2009</span> it = trustedMasterKeys_.erase(it);</div>
<div class="line"><a id="l02010" name="l02010"></a><span class="lineno"> 2010</span> }</div>
<div class="line"><a id="l02011" name="l02011"></a><span class="lineno"> 2011</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l02012" name="l02012"></a><span class="lineno"> 2012</span> {</div>
<div class="line"><a id="l02013" name="l02013"></a><span class="lineno"> 2013</span> XRPL_ASSERT(</div>
<div class="line"><a id="l02014" name="l02014"></a><span class="lineno"> 2014</span> kit-&gt;second &gt;= listThreshold_,</div>
<div class="line"><a id="l02015" name="l02015"></a><span class="lineno"> 2015</span> <span class="stringliteral">&quot;ripple::ValidatorList::updateTrusted : count meets threshold&quot;</span>);</div>
<div class="line"><a id="l02016" name="l02016"></a><span class="lineno"> 2016</span> ++it;</div>
<div class="line"><a id="l02017" name="l02017"></a><span class="lineno"> 2017</span> }</div>
<div class="line"><a id="l02018" name="l02018"></a><span class="lineno"> 2018</span> }</div>
<div class="line"><a id="l02019" name="l02019"></a><span class="lineno"> 2019</span> </div>
<div class="line"><a id="l02020" name="l02020"></a><span class="lineno"> 2020</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : keyListings_)</div>
<div class="line"><a id="l02021" name="l02021"></a><span class="lineno"> 2021</span> {</div>
<div class="line"><a id="l02022" name="l02022"></a><span class="lineno"> 2022</span> <span class="keywordflow">if</span> (val.second &gt;= listThreshold_ &amp;&amp;</div>
<div class="line"><a id="l02023" name="l02023"></a><span class="lineno"> 2023</span> !validatorManifests_.revoked(val.first) &amp;&amp;</div>
<div class="line"><a id="l02024" name="l02024"></a><span class="lineno"> 2024</span> trustedMasterKeys_.emplace(val.first).second)</div>
<div class="line"><a id="l02025" name="l02025"></a><span class="lineno"> 2025</span> trustChanges.<a class="code hl_variable" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.insert(<a class="code hl_function" href="namespaceripple.html#aa2a27f242f6d150ff52f2ad0b2e2a512">calcNodeID</a>(val.first));</div>
<div class="line"><a id="l02026" name="l02026"></a><span class="lineno"> 2026</span> }</div>
<div class="line"><a id="l02027" name="l02027"></a><span class="lineno"> 2027</span> </div>
<div class="line"><a id="l02028" name="l02028"></a><span class="lineno"> 2028</span> <span class="comment">// If there were any changes, we need to update the ephemeral signing</span></div>
<div class="line"><a id="l02029" name="l02029"></a><span class="lineno"> 2029</span> <span class="comment">// keys:</span></div>
<div class="line"><a id="l02030" name="l02030"></a><span class="lineno"> 2030</span> <span class="keywordflow">if</span> (!trustChanges.<a class="code hl_variable" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.empty() || !trustChanges.<a class="code hl_variable" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.empty())</div>
<div class="line"><a id="l02031" name="l02031"></a><span class="lineno"> 2031</span> {</div>
<div class="line"><a id="l02032" name="l02032"></a><span class="lineno"> 2032</span> trustedSigningKeys_.clear();</div>
<div class="line"><a id="l02033" name="l02033"></a><span class="lineno"> 2033</span> </div>
<div class="line"><a id="l02034" name="l02034"></a><span class="lineno"> 2034</span> <span class="comment">// trustedMasterKeys_ contain non-revoked manifests only. Hence the</span></div>
<div class="line"><a id="l02035" name="l02035"></a><span class="lineno"> 2035</span> <span class="comment">// manifests must contain a valid signingKey</span></div>
<div class="line"><a id="l02036" name="l02036"></a><span class="lineno"> 2036</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : trustedMasterKeys_)</div>
<div class="line"><a id="l02037" name="l02037"></a><span class="lineno"> 2037</span> {</div>
<div class="line"><a id="l02038" name="l02038"></a><span class="lineno"> 2038</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a> <span class="keyword">const</span> signingKey =</div>
<div class="line"><a id="l02039" name="l02039"></a><span class="lineno"> 2039</span> validatorManifests_.getSigningKey(k);</div>
<div class="line"><a id="l02040" name="l02040"></a><span class="lineno"> 2040</span> XRPL_ASSERT(</div>
<div class="line"><a id="l02041" name="l02041"></a><span class="lineno"> 2041</span> signingKey,</div>
<div class="line"><a id="l02042" name="l02042"></a><span class="lineno"> 2042</span> <span class="stringliteral">&quot;ripple::ValidatorList::updateTrusted : found signing key&quot;</span>);</div>
<div class="line"><a id="l02043" name="l02043"></a><span class="lineno"> 2043</span> trustedSigningKeys_.insert(*signingKey);</div>
<div class="line"><a id="l02044" name="l02044"></a><span class="lineno"> 2044</span> }</div>
<div class="line"><a id="l02045" name="l02045"></a><span class="lineno"> 2045</span> }</div>
<div class="line"><a id="l02046" name="l02046"></a><span class="lineno"> 2046</span> </div>
<div class="line"><a id="l02047" name="l02047"></a><span class="lineno"> 2047</span> JLOG(j_.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a id="l02048" name="l02048"></a><span class="lineno"> 2048</span> &lt;&lt; trustedMasterKeys_.size() &lt;&lt; <span class="stringliteral">&quot; of &quot;</span> &lt;&lt; keyListings_.size()</div>
<div class="line"><a id="l02049" name="l02049"></a><span class="lineno"> 2049</span> &lt;&lt; <span class="stringliteral">&quot; listed validators eligible for inclusion in the trusted set&quot;</span>;</div>
<div class="line"><a id="l02050" name="l02050"></a><span class="lineno"> 2050</span> </div>
<div class="line"><a id="l02051" name="l02051"></a><span class="lineno"> 2051</span> <span class="keyword">auto</span> <span class="keyword">const</span> unlSize = trustedMasterKeys_.size();</div>
<div class="line"><a id="l02052" name="l02052"></a><span class="lineno"> 2052</span> <span class="keyword">auto</span> effectiveUnlSize = unlSize;</div>
<div class="line"><a id="l02053" name="l02053"></a><span class="lineno"> 2053</span> <span class="keyword">auto</span> seenSize = seenValidators.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/size.html">size</a>();</div>
<div class="line"><a id="l02054" name="l02054"></a><span class="lineno"> 2054</span> <span class="keywordflow">if</span> (!negativeUNL_.empty())</div>
<div class="line"><a id="l02055" name="l02055"></a><span class="lineno"> 2055</span> {</div>
<div class="line"><a id="l02056" name="l02056"></a><span class="lineno"> 2056</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : trustedMasterKeys_)</div>
<div class="line"><a id="l02057" name="l02057"></a><span class="lineno"> 2057</span> {</div>
<div class="line"><a id="l02058" name="l02058"></a><span class="lineno"> 2058</span> <span class="keywordflow">if</span> (negativeUNL_.count(k))</div>
<div class="line"><a id="l02059" name="l02059"></a><span class="lineno"> 2059</span> --effectiveUnlSize;</div>
<div class="line"><a id="l02060" name="l02060"></a><span class="lineno"> 2060</span> }</div>
<div class="line"><a id="l02061" name="l02061"></a><span class="lineno"> 2061</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;NodeID&gt;</a> negUnlNodeIDs;</div>
<div class="line"><a id="l02062" name="l02062"></a><span class="lineno"> 2062</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : negativeUNL_)</div>
<div class="line"><a id="l02063" name="l02063"></a><span class="lineno"> 2063</span> {</div>
<div class="line"><a id="l02064" name="l02064"></a><span class="lineno"> 2064</span> negUnlNodeIDs.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/emplace.html">emplace</a>(<a class="code hl_function" href="namespaceripple.html#aa2a27f242f6d150ff52f2ad0b2e2a512">calcNodeID</a>(k));</div>
<div class="line"><a id="l02065" name="l02065"></a><span class="lineno"> 2065</span> }</div>
<div class="line"><a id="l02066" name="l02066"></a><span class="lineno"> 2066</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; nid : seenValidators)</div>
<div class="line"><a id="l02067" name="l02067"></a><span class="lineno"> 2067</span> {</div>
<div class="line"><a id="l02068" name="l02068"></a><span class="lineno"> 2068</span> <span class="keywordflow">if</span> (negUnlNodeIDs.<a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/count.html">count</a>(nid))</div>
<div class="line"><a id="l02069" name="l02069"></a><span class="lineno"> 2069</span> --seenSize;</div>
<div class="line"><a id="l02070" name="l02070"></a><span class="lineno"> 2070</span> }</div>
<div class="line"><a id="l02071" name="l02071"></a><span class="lineno"> 2071</span> }</div>
<div class="line"><a id="l02072" name="l02072"></a><span class="lineno"> 2072</span> quorum_ = calculateQuorum(unlSize, effectiveUnlSize, seenSize);</div>
<div class="line"><a id="l02073" name="l02073"></a><span class="lineno"> 2073</span> </div>
<div class="line"><a id="l02074" name="l02074"></a><span class="lineno"> 2074</span> JLOG(j_.<a class="code hl_function" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Using quorum of &quot;</span> &lt;&lt; quorum_ &lt;&lt; <span class="stringliteral">&quot; for new set of &quot;</span></div>
<div class="line"><a id="l02075" name="l02075"></a><span class="lineno"> 2075</span> &lt;&lt; unlSize &lt;&lt; <span class="stringliteral">&quot; trusted validators (&quot;</span></div>
<div class="line"><a id="l02076" name="l02076"></a><span class="lineno"> 2076</span> &lt;&lt; trustChanges.<a class="code hl_variable" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.size() &lt;&lt; <span class="stringliteral">&quot; added, &quot;</span></div>
<div class="line"><a id="l02077" name="l02077"></a><span class="lineno"> 2077</span> &lt;&lt; trustChanges.<a class="code hl_variable" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.size() &lt;&lt; <span class="stringliteral">&quot; removed)&quot;</span>;</div>
<div class="line"><a id="l02078" name="l02078"></a><span class="lineno"> 2078</span> </div>
<div class="line"><a id="l02079" name="l02079"></a><span class="lineno"> 2079</span> <span class="keywordflow">if</span> (unlSize &lt; quorum_)</div>
<div class="line"><a id="l02080" name="l02080"></a><span class="lineno"> 2080</span> {</div>
<div class="line"><a id="l02081" name="l02081"></a><span class="lineno"> 2081</span> JLOG(j_.<a class="code hl_function" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;New quorum of &quot;</span> &lt;&lt; quorum_</div>
<div class="line"><a id="l02082" name="l02082"></a><span class="lineno"> 2082</span> &lt;&lt; <span class="stringliteral">&quot; exceeds the number of trusted validators (&quot;</span></div>
<div class="line"><a id="l02083" name="l02083"></a><span class="lineno"> 2083</span> &lt;&lt; unlSize &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a id="l02084" name="l02084"></a><span class="lineno"> 2084</span> }</div>
<div class="line"><a id="l02085" name="l02085"></a><span class="lineno"> 2085</span> </div>
<div class="line"><a id="l02086" name="l02086"></a><span class="lineno"> 2086</span> <span class="keywordflow">if</span> ((publisherLists_.size() || localPublisherList.list.size()) &amp;&amp;</div>
<div class="line"><a id="l02087" name="l02087"></a><span class="lineno"> 2087</span> unlSize == 0)</div>
<div class="line"><a id="l02088" name="l02088"></a><span class="lineno"> 2088</span> {</div>
<div class="line"><a id="l02089" name="l02089"></a><span class="lineno"> 2089</span> <span class="comment">// No validators. Lock down.</span></div>
<div class="line"><a id="l02090" name="l02090"></a><span class="lineno"> 2090</span> ops.<a class="code hl_function" href="classripple_1_1NetworkOPs.html#a3b837bd8b8633d45d7e5f26961fab856">setUNLBlocked</a>();</div>
<div class="line"><a id="l02091" name="l02091"></a><span class="lineno"> 2091</span> }</div>
<div class="line"><a id="l02092" name="l02092"></a><span class="lineno"> 2092</span> </div>
<div class="line"><a id="l02093" name="l02093"></a><span class="lineno"> 2093</span> <span class="keywordflow">return</span> trustChanges;</div>
<div class="line"><a id="l02094" name="l02094"></a><span class="lineno"> 2094</span>}</div>
</div>
<div class="line"><a id="l02095" name="l02095"></a><span class="lineno"> 2095</span> </div>
<div class="line"><a id="l02096" name="l02096"></a><span class="lineno"> 2096</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="foldopen" id="foldopen02097" data-start="{" data-end="}">
<div class="line"><a id="l02097" name="l02097"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3"> 2097</a></span>ValidatorList::getTrustedMasterKeys()<span class="keyword"> const</span></div>
<div class="line"><a id="l02098" name="l02098"></a><span class="lineno"> 2098</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02099" name="l02099"></a><span class="lineno"> 2099</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l02100" name="l02100"></a><span class="lineno"> 2100</span> <span class="keywordflow">return</span> trustedMasterKeys_;</div>
<div class="line"><a id="l02101" name="l02101"></a><span class="lineno"> 2101</span>}</div>
</div>
<div class="line"><a id="l02102" name="l02102"></a><span class="lineno"> 2102</span> </div>
<div class="line"><a id="l02103" name="l02103"></a><span class="lineno"> 2103</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="foldopen" id="foldopen02104" data-start="{" data-end="}">
<div class="line"><a id="l02104" name="l02104"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aaa7f964baccfa4bcb35b7b4ab5d4cc63"> 2104</a></span>ValidatorList::getListThreshold()<span class="keyword"> const</span></div>
<div class="line"><a id="l02105" name="l02105"></a><span class="lineno"> 2105</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02106" name="l02106"></a><span class="lineno"> 2106</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l02107" name="l02107"></a><span class="lineno"> 2107</span> <span class="keywordflow">return</span> listThreshold_;</div>
<div class="line"><a id="l02108" name="l02108"></a><span class="lineno"> 2108</span>}</div>
</div>
<div class="line"><a id="l02109" name="l02109"></a><span class="lineno"> 2109</span> </div>
<div class="line"><a id="l02110" name="l02110"></a><span class="lineno"> 2110</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="foldopen" id="foldopen02111" data-start="{" data-end="}">
<div class="line"><a id="l02111" name="l02111"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5"> 2111</a></span>ValidatorList::getNegativeUNL()<span class="keyword"> const</span></div>
<div class="line"><a id="l02112" name="l02112"></a><span class="lineno"> 2112</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02113" name="l02113"></a><span class="lineno"> 2113</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l02114" name="l02114"></a><span class="lineno"> 2114</span> <span class="keywordflow">return</span> negativeUNL_;</div>
<div class="line"><a id="l02115" name="l02115"></a><span class="lineno"> 2115</span>}</div>
</div>
<div class="line"><a id="l02116" name="l02116"></a><span class="lineno"> 2116</span> </div>
<div class="line"><a id="l02117" name="l02117"></a><span class="lineno"> 2117</span><span class="keywordtype">void</span></div>
<div class="foldopen" id="foldopen02118" data-start="{" data-end="}">
<div class="line"><a id="l02118" name="l02118"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2"> 2118</a></span>ValidatorList::setNegativeUNL(<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; negUnl)</div>
<div class="line"><a id="l02119" name="l02119"></a><span class="lineno"> 2119</span>{</div>
<div class="line"><a id="l02120" name="l02120"></a><span class="lineno"> 2120</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{mutex_};</div>
<div class="line"><a id="l02121" name="l02121"></a><span class="lineno"> 2121</span> negativeUNL_ = negUnl;</div>
<div class="line"><a id="l02122" name="l02122"></a><span class="lineno"> 2122</span>}</div>
</div>
<div class="line"><a id="l02123" name="l02123"></a><span class="lineno"> 2123</span> </div>
<div class="line"><a id="l02124" name="l02124"></a><span class="lineno"> 2124</span><a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::shared_ptr&lt;STValidation&gt;</a>&gt;</div>
<div class="foldopen" id="foldopen02125" data-start="{" data-end="}">
<div class="line"><a id="l02125" name="l02125"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#abd6d3f90be1eff9c1216f37f379ca67f"> 2125</a></span>ValidatorList::negativeUNLFilter(</div>
<div class="line"><a id="l02126" name="l02126"></a><span class="lineno"> 2126</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a>&lt;<a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;STValidation&gt;</a>&gt;&amp;&amp; validations)<span class="keyword"> const</span></div>
<div class="line"><a id="l02127" name="l02127"></a><span class="lineno"> 2127</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02128" name="l02128"></a><span class="lineno"> 2128</span> <span class="comment">// Remove validations that are from validators on the negative UNL.</span></div>
<div class="line"><a id="l02129" name="l02129"></a><span class="lineno"> 2129</span> <span class="keyword">auto</span> ret = std::move(validations);</div>
<div class="line"><a id="l02130" name="l02130"></a><span class="lineno"> 2130</span> </div>
<div class="line"><a id="l02131" name="l02131"></a><span class="lineno"> 2131</span> <a class="code hl_classRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{mutex_};</div>
<div class="line"><a id="l02132" name="l02132"></a><span class="lineno"> 2132</span> <span class="keywordflow">if</span> (!negativeUNL_.empty())</div>
<div class="line"><a id="l02133" name="l02133"></a><span class="lineno"> 2133</span> {</div>
<div class="line"><a id="l02134" name="l02134"></a><span class="lineno"> 2134</span> ret.erase(</div>
<div class="line"><a id="l02135" name="l02135"></a><span class="lineno"> 2135</span> <a class="code hl_functionRef" href="http://en.cppreference.com/w/cpp/algorithm/remove.html">std::remove_if</a>(</div>
<div class="line"><a id="l02136" name="l02136"></a><span class="lineno"> 2136</span> ret.begin(),</div>
<div class="line"><a id="l02137" name="l02137"></a><span class="lineno"> 2137</span> ret.end(),</div>
<div class="line"><a id="l02138" name="l02138"></a><span class="lineno"> 2138</span> [&amp;](<span class="keyword">auto</span> <span class="keyword">const</span>&amp; v) -&gt; <span class="keywordtype">bool</span> {</div>
<div class="line"><a id="l02139" name="l02139"></a><span class="lineno"> 2139</span> if (auto const masterKey =</div>
<div class="line"><a id="l02140" name="l02140"></a><span class="lineno"> 2140</span> getTrustedKey(read_lock, v-&gt;getSignerPublic());</div>
<div class="line"><a id="l02141" name="l02141"></a><span class="lineno"> 2141</span> masterKey)</div>
<div class="line"><a id="l02142" name="l02142"></a><span class="lineno"> 2142</span> {</div>
<div class="line"><a id="l02143" name="l02143"></a><span class="lineno"> 2143</span> return negativeUNL_.count(*masterKey);</div>
<div class="line"><a id="l02144" name="l02144"></a><span class="lineno"> 2144</span> }</div>
<div class="line"><a id="l02145" name="l02145"></a><span class="lineno"> 2145</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l02146" name="l02146"></a><span class="lineno"> 2146</span> {</div>
<div class="line"><a id="l02147" name="l02147"></a><span class="lineno"> 2147</span> return false;</div>
<div class="line"><a id="l02148" name="l02148"></a><span class="lineno"> 2148</span> }</div>
<div class="line"><a id="l02149" name="l02149"></a><span class="lineno"> 2149</span> }),</div>
<div class="line"><a id="l02150" name="l02150"></a><span class="lineno"> 2150</span> ret.end());</div>
<div class="line"><a id="l02151" name="l02151"></a><span class="lineno"> 2151</span> }</div>
<div class="line"><a id="l02152" name="l02152"></a><span class="lineno"> 2152</span> </div>
<div class="line"><a id="l02153" name="l02153"></a><span class="lineno"> 2153</span> <span class="keywordflow">return</span> ret;</div>
<div class="line"><a id="l02154" name="l02154"></a><span class="lineno"> 2154</span>}</div>
</div>
<div class="line"><a id="l02155" name="l02155"></a><span class="lineno"> 2155</span> </div>
<div class="line"><a id="l02156" name="l02156"></a><span class="lineno"> 2156</span>} <span class="comment">// namespace ripple</span></div>
<div class="ttc" id="aaccumulate_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/accumulate.html">std::accumulate</a></div><div class="ttdeci">T accumulate(T... args)</div></div>
<div class="ttc" id="aat_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string/at.html">std::string::at</a></div><div class="ttdeci">T at(T... args)</div></div>
<div class="ttc" id="aback_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/back.html">std::vector::back</a></div><div class="ttdeci">T back(T... args)</div></div>
<div class="ttc" id="abasic_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div></div>
<div class="ttc" id="abasic_string_view_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string_view.html">std::string_view</a></div></div>
<div class="ttc" id="abegin_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/map/begin.html">std::map::begin</a></div><div class="ttdeci">T begin(T... args)</div></div>
<div class="ttc" id="aceil_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a></div><div class="ttdeci">T ceil(T... args)</div></div>
<div class="ttc" id="aclassJson_1_1Reader_html"><div class="ttname"><a href="classJson_1_1Reader.html">Json::Reader</a></div><div class="ttdoc">Unserialize a JSON document into a Value.</div><div class="ttdef"><b>Definition</b> <a href="json__reader_8h_source.html#l00019">json_reader.h:20</a></div></div>
<div class="ttc" id="aclassJson_1_1Reader_html_a8ee4d40504e4f8b069745d762ab4d78c"><div class="ttname"><a href="classJson_1_1Reader.html#a8ee4d40504e4f8b069745d762ab4d78c">Json::Reader::parse</a></div><div class="ttdeci">bool parse(std::string const &amp;document, Value &amp;root)</div><div class="ttdoc">Read a Value from a JSON document.</div><div class="ttdef"><b>Definition</b> <a href="json__reader_8cpp_source.html#l00059">json_reader.cpp:59</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html"><div class="ttname"><a href="classJson_1_1Value.html">Json::Value</a></div><div class="ttdoc">Represents a JSON value.</div><div class="ttdef"><b>Definition</b> <a href="json__value_8h_source.html#l00130">json_value.h:131</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a1627eb9d6568d6d0252fa8bb711c0a59"><div class="ttname"><a href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">Json::Value::isArray</a></div><div class="ttdeci">bool isArray() const</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l01115">json_value.cpp:1115</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a21526b61dea2a1771030473e6248621e"><div class="ttname"><a href="classJson_1_1Value.html#a21526b61dea2a1771030473e6248621e">Json::Value::append</a></div><div class="ttdeci">Value &amp; append(Value const &amp;value)</div><div class="ttdoc">Append value to array at the end.</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l00978">json_value.cpp:978</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a23c7027ca674f989f90564d63ef36c74"><div class="ttname"><a href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">Json::Value::size</a></div><div class="ttdeci">UInt size() const</div><div class="ttdoc">Number of values in array or object.</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l00785">json_value.cpp:785</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a3696d34c1a1833742b4bf8e5b247f125"><div class="ttname"><a href="classJson_1_1Value.html#a3696d34c1a1833742b4bf8e5b247f125">Json::Value::toStyledString</a></div><div class="ttdeci">std::string toStyledString() const</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l01139">json_value.cpp:1139</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a71e1f82cf1c3eaf969d400dcffb163a6"><div class="ttname"><a href="classJson_1_1Value.html#a71e1f82cf1c3eaf969d400dcffb163a6">Json::Value::isString</a></div><div class="ttdeci">bool isString() const</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l01109">json_value.cpp:1109</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a74b305583ec3aacf4f9dd06e799dc265"><div class="ttname"><a href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">Json::Value::asUInt</a></div><div class="ttdeci">UInt asUInt() const</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l00614">json_value.cpp:614</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_ab0d86bf425efefd03513e8dbfaca317b"><div class="ttname"><a href="classJson_1_1Value.html#ab0d86bf425efefd03513e8dbfaca317b">Json::Value::asString</a></div><div class="ttdeci">std::string asString() const</div><div class="ttdoc">Returns the unquoted string value.</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l00471">json_value.cpp:471</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_abfa90c81f6aee7877bd5fb4c8445994f"><div class="ttname"><a href="classJson_1_1Value.html#abfa90c81f6aee7877bd5fb4c8445994f">Json::Value::isMember</a></div><div class="ttdeci">bool isMember(char const *key) const</div><div class="ttdoc">Return true if the object has a member named key.</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l01030">json_value.cpp:1030</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_aff51d8b52979ca06cf9d909accd5f695"><div class="ttname"><a href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">Json::Value::isInt</a></div><div class="ttdeci">bool isInt() const</div><div class="ttdef"><b>Definition</b> <a href="json__value_8cpp_source.html#l01079">json_value.cpp:1079</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html"><div class="ttname"><a href="classbeast_1_1Journal.html">beast::Journal</a></div><div class="ttdoc">A generic endpoint for log messages.</div><div class="ttdef"><b>Definition</b> <a href="Journal_8h_source.html#l00040">Journal.h:41</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a49b0713e65bb8e2c51b76fbf16252afe"><div class="ttname"><a href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">beast::Journal::error</a></div><div class="ttdeci">Stream error() const</div><div class="ttdef"><b>Definition</b> <a href="Journal_8h_source.html#l00327">Journal.h:327</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a556228cb60bcf405c225d3f64b7b01ae"><div class="ttname"><a href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">beast::Journal::debug</a></div><div class="ttdeci">Stream debug() const</div><div class="ttdef"><b>Definition</b> <a href="Journal_8h_source.html#l00309">Journal.h:309</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_abbe082bd27ca0f1d1365af2824e4f85b"><div class="ttname"><a href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">beast::Journal::trace</a></div><div class="ttdeci">Stream trace() const</div><div class="ttdoc">Severity stream access functions.</div><div class="ttdef"><b>Definition</b> <a href="Journal_8h_source.html#l00303">Journal.h:303</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_ad8fefe3e8ad583e1ed1bf02094ac3d8f"><div class="ttname"><a href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">beast::Journal::warn</a></div><div class="ttdeci">Stream warn() const</div><div class="ttdef"><b>Definition</b> <a href="Journal_8h_source.html#l00321">Journal.h:321</a></div></div>
<div class="ttc" id="aclassbeast_1_1abstract__clock_html_a4e16832b0bdf9392c5138bbbde024d8e"><div class="ttname"><a href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">beast::abstract_clock&lt; NetClock &gt;::time_point</a></div><div class="ttdeci">typename Clock::time_point time_point</div><div class="ttdef"><b>Definition</b> <a href="abstract__clock_8h_source.html#l00041">abstract_clock.h:41</a></div></div>
<div class="ttc" id="aclassbeast_1_1abstract__clock_html_ad024b15fa67696e8d1eba3744e800d32"><div class="ttname"><a href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">beast::abstract_clock&lt; NetClock &gt;::duration</a></div><div class="ttdeci">typename Clock::duration duration</div><div class="ttdef"><b>Definition</b> <a href="abstract__clock_8h_source.html#l00040">abstract_clock.h:40</a></div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html"><div class="ttname"><a href="classripple_1_1HashRouter.html">ripple::HashRouter</a></div><div class="ttdoc">Routing table for objects identified by hash.</div><div class="ttdef"><b>Definition</b> <a href="HashRouter_8h_source.html#l00077">HashRouter.h:78</a></div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html_a29980c0f77dcc002ef322c23080f3266"><div class="ttname"><a href="classripple_1_1HashRouter.html#a29980c0f77dcc002ef322c23080f3266">ripple::HashRouter::shouldRelay</a></div><div class="ttdeci">std::optional&lt; std::set&lt; PeerShortID &gt; &gt; shouldRelay(uint256 const &amp;key)</div><div class="ttdoc">Determines whether the hashed item should be relayed.</div><div class="ttdef"><b>Definition</b> <a href="HashRouter_8cpp_source.html#l00104">HashRouter.cpp:104</a></div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html_a86c862f1b0722d061b3724ff34a53572"><div class="ttname"><a href="classripple_1_1HashRouter.html#a86c862f1b0722d061b3724ff34a53572">ripple::HashRouter::addSuppressionPeer</a></div><div class="ttdeci">bool addSuppressionPeer(uint256 const &amp;key, PeerShortID peer)</div><div class="ttdef"><b>Definition</b> <a href="HashRouter_8cpp_source.html#l00033">HashRouter.cpp:33</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html"><div class="ttname"><a href="classripple_1_1ManifestCache.html">ripple::ManifestCache</a></div><div class="ttdoc">Remembers manifests with the highest sequence number.</div><div class="ttdef"><b>Definition</b> <a href="Manifest_8h_source.html#l00236">Manifest.h:237</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a557c94c2a57c5bbe75557524420b1e9d"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a557c94c2a57c5bbe75557524420b1e9d">ripple::ManifestCache::getSigningKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; getSigningKey(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns master key's current signing key.</div><div class="ttdef"><b>Definition</b> <a href="Manifest_8cpp_source.html#l00292">Manifest.cpp:292</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a6494e744b90cbecd735b460fcd7be82f"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">ripple::ManifestCache::revoked</a></div><div class="ttdeci">bool revoked(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns true if master key has been revoked in a manifest.</div><div class="ttdef"><b>Definition</b> <a href="Manifest_8cpp_source.html#l00352">Manifest.cpp:352</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a882c588d2f26d7d61ae3ffe4212cbae0"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">ripple::ManifestCache::applyManifest</a></div><div class="ttdeci">ManifestDisposition applyManifest(Manifest m)</div><div class="ttdoc">Add manifest to cache.</div><div class="ttdef"><b>Definition</b> <a href="Manifest_8cpp_source.html#l00364">Manifest.cpp:364</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_adbe8167cfd5ac328a9bf8b85c319ddc1"><div class="ttname"><a href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">ripple::ManifestCache::getMasterKey</a></div><div class="ttdeci">PublicKey getMasterKey(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns ephemeral signing key's master public key.</div><div class="ttdef"><b>Definition</b> <a href="Manifest_8cpp_source.html#l00304">Manifest.cpp:304</a></div></div>
<div class="ttc" id="aclassripple_1_1Message_html_a7a4b11ee88a462956cab12969e833fbe"><div class="ttname"><a href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">ripple::Message::totalSize</a></div><div class="ttdeci">static std::size_t totalSize(::google::protobuf::Message const &amp;message)</div><div class="ttdef"><b>Definition</b> <a href="Message_8cpp_source.html#l00047">Message.cpp:47</a></div></div>
<div class="ttc" id="aclassripple_1_1NetworkOPs_html"><div class="ttname"><a href="classripple_1_1NetworkOPs.html">ripple::NetworkOPs</a></div><div class="ttdoc">Provides server functionality for clients.</div><div class="ttdef"><b>Definition</b> <a href="NetworkOPs_8h_source.html#l00069">NetworkOPs.h:70</a></div></div>
<div class="ttc" id="aclassripple_1_1NetworkOPs_html_a3b837bd8b8633d45d7e5f26961fab856"><div class="ttname"><a href="classripple_1_1NetworkOPs.html#a3b837bd8b8633d45d7e5f26961fab856">ripple::NetworkOPs::setUNLBlocked</a></div><div class="ttdeci">virtual void setUNLBlocked()=0</div></div>
<div class="ttc" id="aclassripple_1_1NetworkOPs_html_ace637a61664a15f70bc362f2ad1101e9"><div class="ttname"><a href="classripple_1_1NetworkOPs.html#ace637a61664a15f70bc362f2ad1101e9">ripple::NetworkOPs::clearUNLBlocked</a></div><div class="ttdeci">virtual void clearUNLBlocked()=0</div></div>
<div class="ttc" id="aclassripple_1_1Overlay_html"><div class="ttname"><a href="classripple_1_1Overlay.html">ripple::Overlay</a></div><div class="ttdoc">Manages the set of connected peers.</div><div class="ttdef"><b>Definition</b> <a href="Overlay_8h_source.html#l00029">Overlay.h:30</a></div></div>
<div class="ttc" id="aclassripple_1_1Overlay_html_a516f776bf7ff0dbf6a8be71b7355e5be"><div class="ttname"><a href="classripple_1_1Overlay.html#a516f776bf7ff0dbf6a8be71b7355e5be">ripple::Overlay::getActivePeers</a></div><div class="ttdeci">virtual PeerSequence getActivePeers() const =0</div><div class="ttdoc">Returns a sequence representing the current list of peers.</div></div>
<div class="ttc" id="aclassripple_1_1Peer_html"><div class="ttname"><a href="classripple_1_1Peer.html">ripple::Peer</a></div><div class="ttdoc">Represents a peer connection in the overlay.</div><div class="ttdef"><b>Definition</b> <a href="xrpld_2overlay_2Peer_8h_source.html#l00024">xrpld/overlay/Peer.h:25</a></div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_a1781d176803366238413407a0815124a"><div class="ttname"><a href="classripple_1_1Peer.html#a1781d176803366238413407a0815124a">ripple::Peer::supportsFeature</a></div><div class="ttdeci">virtual bool supportsFeature(ProtocolFeature f) const =0</div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_a306013e6a8c450fc13ee57adfd1a3a37"><div class="ttname"><a href="classripple_1_1Peer.html#a306013e6a8c450fc13ee57adfd1a3a37">ripple::Peer::fingerprint</a></div><div class="ttdeci">virtual std::string const &amp; fingerprint() const =0</div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_a3c89dbf867ba814f0bf2417757d5a0f4"><div class="ttname"><a href="classripple_1_1Peer.html#a3c89dbf867ba814f0bf2417757d5a0f4">ripple::Peer::send</a></div><div class="ttdeci">virtual void send(std::shared_ptr&lt; Message &gt; const &amp;m)=0</div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_adc1069de1a8a5ff1364003caf00bb139"><div class="ttname"><a href="classripple_1_1Peer.html#adc1069de1a8a5ff1364003caf00bb139">ripple::Peer::setPublisherListSequence</a></div><div class="ttdeci">virtual void setPublisherListSequence(PublicKey const &amp;, std::size_t const)=0</div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_aee121254a095838be2d8040bfdfacc79"><div class="ttname"><a href="classripple_1_1Peer.html#aee121254a095838be2d8040bfdfacc79">ripple::Peer::id</a></div><div class="ttdeci">virtual id_t id() const =0</div></div>
<div class="ttc" id="aclassripple_1_1PublicKey_html"><div class="ttname"><a href="classripple_1_1PublicKey.html">ripple::PublicKey</a></div><div class="ttdoc">A public key.</div><div class="ttdef"><b>Definition</b> <a href="PublicKey_8h_source.html#l00042">PublicKey.h:43</a></div></div>
<div class="ttc" id="aclassripple_1_1PublicKey_html_a663437215503b159ed33b1664e4213a3"><div class="ttname"><a href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">ripple::PublicKey::size</a></div><div class="ttdeci">std::size_t size() const noexcept</div><div class="ttdef"><b>Definition</b> <a href="PublicKey_8h_source.html#l00074">PublicKey.h:74</a></div></div>
<div class="ttc" id="aclassripple_1_1PublicKey_html_aaf5eda03758063af5402881f7eb40b2e"><div class="ttname"><a href="classripple_1_1PublicKey.html#aaf5eda03758063af5402881f7eb40b2e">ripple::PublicKey::end</a></div><div class="ttdeci">const_iterator end() const noexcept</div><div class="ttdef"><b>Definition</b> <a href="PublicKey_8h_source.html#l00092">PublicKey.h:92</a></div></div>
<div class="ttc" id="aclassripple_1_1Slice_html"><div class="ttname"><a href="classripple_1_1Slice.html">ripple::Slice</a></div><div class="ttdoc">An immutable linear range of bytes.</div><div class="ttdef"><b>Definition</b> <a href="Slice_8h_source.html#l00026">Slice.h:27</a></div></div>
<div class="ttc" id="aclassripple_1_1TimeKeeper_html"><div class="ttname"><a href="classripple_1_1TimeKeeper.html">ripple::TimeKeeper</a></div><div class="ttdoc">Manages various times used by the server.</div><div class="ttdef"><b>Definition</b> <a href="TimeKeeper_8h_source.html#l00012">TimeKeeper.h:13</a></div></div>
<div class="ttc" id="aclassripple_1_1TimeKeeper_html_a2a0090c133fcbeb544017a3c7eddab6e"><div class="ttname"><a href="classripple_1_1TimeKeeper.html#a2a0090c133fcbeb544017a3c7eddab6e">ripple::TimeKeeper::now</a></div><div class="ttdeci">time_point now() const override</div><div class="ttdoc">Returns the current time, using the server's clock.</div><div class="ttdef"><b>Definition</b> <a href="TimeKeeper_8h_source.html#l00045">TimeKeeper.h:45</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a002fda13878b813249f3fd49e64577fd"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ripple::ValidatorList::count</a></div><div class="ttdeci">std::size_t count() const</div><div class="ttdoc">Return the number of configured validator list sites.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01544">ValidatorList.cpp:1544</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a0056ded6793baf9fda1c2f1fcffc535b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">ripple::ValidatorList::getTrustedKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; getTrustedKey(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns master public key if public key is trusted.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01480">ValidatorList.cpp:1480</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a023f425a3145224e0101f0ef9db7c917"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">ripple::ValidatorList::sendValidatorList</a></div><div class="ttdeci">static void sendValidatorList(Peer &amp;peer, std::uint64_t peerSequence, PublicKey const &amp;publisherKey, std::size_t maxSequence, std::uint32_t rawVersion, std::string const &amp;rawManifest, std::map&lt; std::size_t, ValidatorBlobInfo &gt; const &amp;blobInfos, HashRouter &amp;hashRouter, beast::Journal j)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00797">ValidatorList.cpp:797</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a0db3ac667949c8002894beb011f7f139"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139">ripple::ValidatorList::broadcastBlobs</a></div><div class="ttdeci">static void broadcastBlobs(PublicKey const &amp;publisherKey, PublisherListCollection const &amp;lists, std::size_t maxSequence, uint256 const &amp;hash, Overlay &amp;overlay, HashRouter &amp;hashRouter, beast::Journal j)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00850">ValidatorList.cpp:850</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a11929bd666b5a688054d623832118033"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">ripple::ValidatorList::getCacheFileName</a></div><div class="ttdeci">boost::filesystem::path getCacheFileName(lock_guard const &amp;, PublicKey const &amp;pubKey) const</div><div class="ttdoc">Get the filename used for caching UNLs.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00267">ValidatorList.cpp:267</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a12f49b76ef58d9c64310aa4a7ce0115a"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a">ripple::ValidatorList::loadLists</a></div><div class="ttdeci">std::vector&lt; std::string &gt; loadLists()</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01293">ValidatorList.cpp:1293</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a147f9d3a3afb1cdd7714d68202bd26ba"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a147f9d3a3afb1cdd7714d68202bd26ba">ripple::ValidatorList::localPublisherList</a></div><div class="ttdeci">PublisherList localPublisherList</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00244">ValidatorList.h:244</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a150b6f26a82b2d4a30d9558719cc8fd5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a150b6f26a82b2d4a30d9558719cc8fd5">ripple::ValidatorList::localPublicKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; localPublicKey() const</div><div class="ttdoc">This function returns the local validator public key or a std::nullopt.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01496">ValidatorList.cpp:1496</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a19f4cc404400551b2a39c7c5a137e01f"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">ripple::ValidatorList::validatorManifests_</a></div><div class="ttdeci">ManifestCache &amp; validatorManifests_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00205">ValidatorList.h:205</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a2c598bf8d6f6358e1f08eb47df0b49d2"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">ripple::ValidatorList::quorum_</a></div><div class="ttdeci">std::atomic&lt; std::size_t &gt; quorum_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00214">ValidatorList.h:214</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a3728d8811726a5ffb23bcd5c21d235a3"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3">ripple::ValidatorList::updatePublisherList</a></div><div class="ttdeci">void updatePublisherList(PublicKey const &amp;pubKey, PublisherList const &amp;current, std::vector&lt; PublicKey &gt; const &amp;oldList, lock_guard const &amp;)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01052">ValidatorList.cpp:1052</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a390041ee5976df2e6b170a3c6eed5de5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">ripple::ValidatorList::timeKeeper_</a></div><div class="ttdeci">TimeKeeper &amp; timeKeeper_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00207">ValidatorList.h:207</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a3cb3357e6108a7e96d03e4da7feb7d5a"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">ripple::ValidatorList::buildFileData</a></div><div class="ttdeci">static Json::Value buildFileData(std::string const &amp;pubKey, PublisherListCollection const &amp;pubCollection, beast::Journal j)</div><div class="ttdoc">Build a Json representation of the collection, suitable for writing to a cache file,...</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00276">ValidatorList.cpp:276</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a437c1823bf6bb8498cc153896b3abfa5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">ripple::ValidatorList::buildBlobInfos</a></div><div class="ttdeci">static void buildBlobInfos(std::map&lt; std::size_t, ValidatorBlobInfo &gt; &amp;blobInfos, PublisherListCollection const &amp;lists)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00824">ValidatorList.cpp:824</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a4489b055e951d0923286cffecd9dee46"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">ripple::ValidatorList::keyListings_</a></div><div class="ttdeci">hash_map&lt; PublicKey, std::size_t &gt; keyListings_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00221">ValidatorList.h:221</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a5b0d33cb960903cc89ba236178e0247b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b">ripple::ValidatorList::listed</a></div><div class="ttdeci">bool listed(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns true if public key is included on any lists.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01433">ValidatorList.cpp:1433</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a5cbb13f05befbcb3ad0be0501b85d610"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a5cbb13f05befbcb3ad0be0501b85d610">ripple::ValidatorList::listThreshold_</a></div><div class="ttdeci">std::size_t listThreshold_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00227">ValidatorList.h:227</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a61c0b817fc56c96d5a6c40a0e7dadbeb"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb">ripple::ValidatorList::cacheValidatorFile</a></div><div class="ttdeci">void cacheValidatorFile(lock_guard const &amp;lock, PublicKey const &amp;pubKey) const</div><div class="ttdoc">Write a JSON UNL to a cache file.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00350">ValidatorList.cpp:350</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a623a1124f621b9ee5745bd22094b4acb"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">ripple::ValidatorList::trustedMasterKeys_</a></div><div class="ttdeci">hash_set&lt; PublicKey &gt; trustedMasterKeys_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00224">ValidatorList.h:224</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a647d2962692b44371893c84549fe918c"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c">ripple::ValidatorList::applyList</a></div><div class="ttdeci">PublisherListStats applyList(std::string const &amp;globalManifest, std::optional&lt; std::string &gt; const &amp;localManifest, std::string const &amp;blob, std::string const &amp;signature, std::uint32_t version, std::string siteUri, std::optional&lt; uint256 &gt; const &amp;hash, lock_guard const &amp;)</div><div class="ttdoc">Apply published list of public keys.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01116">ValidatorList.cpp:1116</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a74578a60966c12996799fd9784d66741"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741">ripple::ValidatorList::expires</a></div><div class="ttdeci">std::optional&lt; TimeKeeper::time_point &gt; expires() const</div><div class="ttdoc">Return the time when the validator list will expire.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01600">ValidatorList.cpp:1600</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a796cfdb52b275852b6aa548bcf42a002"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a796cfdb52b275852b6aa548bcf42a002">ripple::ValidatorList::mutex_</a></div><div class="ttdeci">std::shared_mutex mutex_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00210">ValidatorList.h:210</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a7bdc06d223ec320799b7b09fe38fb16a"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a7bdc06d223ec320799b7b09fe38fb16a">ripple::ValidatorList::applyListsAndBroadcast</a></div><div class="ttdeci">PublisherListStats applyListsAndBroadcast(std::string const &amp;manifest, std::uint32_t version, std::vector&lt; ValidatorBlobInfo &gt; const &amp;blobs, std::string siteUri, uint256 const &amp;hash, Overlay &amp;overlay, HashRouter &amp;hashRouter, NetworkOPs &amp;networkOPs)</div><div class="ttdoc">Apply multiple published lists of public keys, then broadcast it to all peers that have not seen it o...</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00918">ValidatorList.cpp:918</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a82ca85cd7be327072ee4ecc3bcb8fb27"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a82ca85cd7be327072ee4ecc3bcb8fb27">ripple::ValidatorList::j_</a></div><div class="ttdeci">beast::Journal const j_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00209">ValidatorList.h:209</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a90d8cf623e6011f148956964d0e09b9c"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c">ripple::ValidatorList::trustedPublisher</a></div><div class="ttdeci">bool trustedPublisher(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns true if public key is a trusted publisher.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01488">ValidatorList.cpp:1488</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a923f3aa3898a824b4b6947abd88502c5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5">ripple::ValidatorList::getListedKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; getListedKey(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns listed master public if public key is included on any lists.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01458">ValidatorList.cpp:1458</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a9475570d68abff79cc3392bd658bccb4"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a9475570d68abff79cc3392bd658bccb4">ripple::ValidatorList::dataPath_</a></div><div class="ttdeci">boost::filesystem::path const dataPath_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00208">ValidatorList.h:208</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a9d3a6dfa4f7ffe2717513369298e7268"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268">ripple::ValidatorList::removePublisherList</a></div><div class="ttdeci">bool removePublisherList(lock_guard const &amp;, PublicKey const &amp;publisherKey, PublisherStatus reason)</div><div class="ttdoc">Stop trusting publisher's list of keys.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01503">ValidatorList.cpp:1503</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a9de7a870beb3104dc8320d6367b7f7e8"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ripple::ValidatorList::trusted</a></div><div class="ttdeci">bool trusted(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns true if public key is trusted.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01451">ValidatorList.cpp:1451</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aa0c6d081fe5e626dc63a9cd949de2d85"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aa0c6d081fe5e626dc63a9cd949de2d85">ripple::ValidatorList::maxSupportedBlobs</a></div><div class="ttdeci">static constexpr std::size_t maxSupportedBlobs</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00253">ValidatorList.h:253</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aa4effc5014393e8a6eae30d95053df28"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aa4effc5014393e8a6eae30d95053df28">ripple::ValidatorList::ValidatorList</a></div><div class="ttdeci">ValidatorList(ManifestCache &amp;validatorManifests, ManifestCache &amp;publisherManifests, TimeKeeper &amp;timeKeeper, std::string const &amp;databasePath, beast::Journal j, std::optional&lt; std::size_t &gt; minimumQuorum=std::nullopt)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00101">ValidatorList.cpp:101</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_abd28e45a701578558624ec9592f69bdf"><div class="ttname"><a href="classripple_1_1ValidatorList.html#abd28e45a701578558624ec9592f69bdf">ripple::ValidatorList::localPubKey_</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; localPubKey_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00234">ValidatorList.h:234</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ac0fc258a8801e974c5d94cde492b00d3"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ac0fc258a8801e974c5d94cde492b00d3">ripple::ValidatorList::load</a></div><div class="ttdeci">bool load(std::optional&lt; PublicKey &gt; const &amp;localSigningKey, std::vector&lt; std::string &gt; const &amp;configKeys, std::vector&lt; std::string &gt; const &amp;publisherKeys, std::optional&lt; std::size_t &gt; listThreshold={})</div><div class="ttdoc">Load configured trusted keys.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00120">ValidatorList.cpp:120</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ac3b9186600dcd1c5326c80af17165741"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ac3b9186600dcd1c5326c80af17165741">ripple::ValidatorList::minimumQuorum_</a></div><div class="ttdeci">std::optional&lt; std::size_t &gt; minimumQuorum_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00215">ValidatorList.h:215</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ac74567517641b42d1cac0852f99a7814"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ac74567517641b42d1cac0852f99a7814">ripple::ValidatorList::verify</a></div><div class="ttdeci">std::pair&lt; ListDisposition, std::optional&lt; PublicKey &gt; &gt; verify(lock_guard const &amp;, Json::Value &amp;list, Manifest manifest, std::string const &amp;blob, std::string const &amp;signature)</div><div class="ttdoc">Check response for trusted valid published list.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l01348">ValidatorList.cpp:1348</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_acf339d3f8e4939b5cd5075374ecc9691"><div class="ttname"><a href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ripple::ValidatorList::parseBlobs</a></div><div class="ttdeci">static std::vector&lt; ValidatorBlobInfo &gt; parseBlobs(std::uint32_t version, Json::Value const &amp;body)</div><div class="ttdoc">Pull the blob/signature/manifest information out of the appropriate Json body fields depending on the...</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00381">ValidatorList.cpp:381</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_adfef0eec37f112fc8a5429764f6f9080"><div class="ttname"><a href="classripple_1_1ValidatorList.html#adfef0eec37f112fc8a5429764f6f9080">ripple::ValidatorList::filePrefix_</a></div><div class="ttdeci">static std::string const filePrefix_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00255">ValidatorList.h:255</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aebd0354cf915b7c82161dca56c5c378b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">ripple::ValidatorList::publisherLists_</a></div><div class="ttdeci">hash_map&lt; PublicKey, PublisherListCollection &gt; publisherLists_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00218">ValidatorList.h:218</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aed9fb899a5dbc48018f3bdeedb55a110"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110">ripple::ValidatorList::applyLists</a></div><div class="ttdeci">PublisherListStats applyLists(std::string const &amp;manifest, std::uint32_t version, std::vector&lt; ValidatorBlobInfo &gt; const &amp;blobs, std::string siteUri, std::optional&lt; uint256 &gt; const &amp;hash={})</div><div class="ttdoc">Apply multiple published lists of public keys.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00976">ValidatorList.cpp:976</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af2dde165e04bd3a99a397fe3541f341e"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e">ripple::ValidatorList::buildValidatorListMessages</a></div><div class="ttdeci">static std::pair&lt; std::size_t, std::size_t &gt; buildValidatorListMessages(std::size_t messageVersion, std::uint64_t peerSequence, std::size_t maxSequence, std::uint32_t rawVersion, std::string const &amp;rawManifest, std::map&lt; std::size_t, ValidatorBlobInfo &gt; const &amp;blobInfos, std::vector&lt; MessageWithHash &gt; &amp;messages, std::size_t maxSize=maximiumMessageSize)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00653">ValidatorList.cpp:653</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af8fe24acb044cf9b928d14a1e84b63ac"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">ripple::ValidatorList::publisherManifests_</a></div><div class="ttdeci">ManifestCache &amp; publisherManifests_</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00206">ValidatorList.h:206</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_afb78f6ff830cea855542f3ad78a587b1"><div class="ttname"><a href="classripple_1_1ValidatorList.html#afb78f6ff830cea855542f3ad78a587b1">ripple::ValidatorList::supportedListVersions</a></div><div class="ttdeci">static constexpr std::uint32_t supportedListVersions[]</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00250">ValidatorList.h:250</a></div></div>
<div class="ttc" id="aclassripple_1_1base__uint_html"><div class="ttname"><a href="classripple_1_1base__uint.html">ripple::base_uint&lt; 256 &gt;</a></div></div>
<div class="ttc" id="aclear_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/clear.html">std::vector::clear</a></div><div class="ttdeci">T clear(T... args)</div></div>
<div class="ttc" id="acmath_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/cmath.html">cmath</a></div></div>
<div class="ttc" id="acount_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/count.html">std::count</a></div><div class="ttdeci">T count(T... args)</div></div>
<div class="ttc" id="aemplace_back_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">std::vector::emplace_back</a></div><div class="ttdeci">T emplace_back(T... args)</div></div>
<div class="ttc" id="aemplace_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">std::optional::emplace</a></div><div class="ttdeci">T emplace(T... args)</div></div>
<div class="ttc" id="aempty_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/map/empty.html">std::map::empty</a></div><div class="ttdeci">T empty(T... args)</div></div>
<div class="ttc" id="aend_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/end.html">std::vector::end</a></div><div class="ttdeci">T end(T... args)</div></div>
<div class="ttc" id="afunction_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a></div></div>
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a></div></div>
<div class="ttc" id="ais_same_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/is_same.html">std::is_same_v</a></div><div class="ttdeci">T is_same_v</div></div>
<div class="ttc" id="alock_guard_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a></div></div>
<div class="ttc" id="amake_pair_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/pair/make_pair.html">std::make_pair</a></div><div class="ttdeci">T make_pair(T... args)</div></div>
<div class="ttc" id="amap_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/map.html">std::map</a></div></div>
<div class="ttc" id="amax_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a></div><div class="ttdeci">T max(T... args)</div></div>
<div class="ttc" id="amin_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/min.html">std::min</a></div><div class="ttdeci">T min(T... args)</div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4ea7d9899633b4409bd3fc107e6737f8391"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4ea7d9899633b4409bd3fc107e6737f8391">Json::nullValue</a></div><div class="ttdeci">@ nullValue</div><div class="ttdoc">'null' value</div><div class="ttdef"><b>Definition</b> <a href="json__value_8h_source.html#l00020">json_value.h:20</a></div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a></div><div class="ttdeci">@ arrayValue</div><div class="ttdoc">array value (ordered list)</div><div class="ttdef"><b>Definition</b> <a href="json__value_8h_source.html#l00026">json_value.h:26</a></div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a></div><div class="ttdeci">@ objectValue</div><div class="ttdoc">object value (collection of name/value pairs).</div><div class="ttdef"><b>Definition</b> <a href="json__value_8h_source.html#l00028">json_value.h:27</a></div></div>
<div class="ttc" id="anamespaceJson_html_ab1488c31a37eea2d37f36a0961372572"><div class="ttname"><a href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a></div><div class="ttdeci">unsigned int UInt</div><div class="ttdef"><b>Definition</b> <a href="json__forwards_8h_source.html#l00008">json_forwards.h:8</a></div></div>
<div class="ttc" id="anamespaceripple_html"><div class="ttname"><a href="namespaceripple.html">ripple</a></div><div class="ttdoc">Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.</div><div class="ttdef"><b>Definition</b> <a href="algorithm_8h_source.html#l00006">algorithm.h:6</a></div></div>
<div class="ttc" id="anamespaceripple_html_a08a13b62b18272366f788632359e8793"><div class="ttname"><a href="namespaceripple.html#a08a13b62b18272366f788632359e8793">ripple::toBase58</a></div><div class="ttdeci">std::string toBase58(AccountID const &amp;v)</div><div class="ttdoc">Convert AccountID to base58 checked string.</div><div class="ttdef"><b>Definition</b> <a href="AccountID_8cpp_source.html#l00095">AccountID.cpp:95</a></div></div>
<div class="ttc" id="anamespaceripple_html_a12a05294e1d72bbcf9718dc99195ad19"><div class="ttname"><a href="namespaceripple.html#a12a05294e1d72bbcf9718dc99195ad19">ripple::deserializeManifest</a></div><div class="ttdeci">std::optional&lt; Manifest &gt; deserializeManifest(Slice s, beast::Journal journal)</div><div class="ttdoc">Constructs Manifest from serialized string.</div><div class="ttdef"><b>Definition</b> <a href="Manifest_8cpp_source.html#l00035">Manifest.cpp:35</a></div></div>
<div class="ttc" id="anamespaceripple_html_a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6"><div class="ttname"><a href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">ripple::TokenType::NodePublic</a></div><div class="ttdeci">@ NodePublic</div></div>
<div class="ttc" id="anamespaceripple_html_a2127aa882d06ad6aaae928d2e80fb395"><div class="ttname"><a href="namespaceripple.html#a2127aa882d06ad6aaae928d2e80fb395">ripple::strUnHex</a></div><div class="ttdeci">std::optional&lt; Blob &gt; strUnHex(std::size_t strSize, Iterator begin, Iterator end)</div><div class="ttdef"><b>Definition</b> <a href="StringUtilities_8h_source.html#l00032">StringUtilities.h:32</a></div></div>
<div class="ttc" id="anamespaceripple_html_a286745fec5429abb3893001b4982522ba9f3fda2fef6dda85970e12ce9a9b8cbe"><div class="ttname"><a href="namespaceripple.html#a286745fec5429abb3893001b4982522ba9f3fda2fef6dda85970e12ce9a9b8cbe">ripple::ECDSACanonicality::canonical</a></div><div class="ttdeci">@ canonical</div></div>
<div class="ttc" id="anamespaceripple_html_a3549cb4c3d81efe240ad20c147e48ac7"><div class="ttname"><a href="namespaceripple.html#a3549cb4c3d81efe240ad20c147e48ac7">ripple::verify</a></div><div class="ttdeci">bool verify(PublicKey const &amp;publicKey, Slice const &amp;m, Slice const &amp;sig, bool mustBeFullyCanonical=true) noexcept</div><div class="ttdoc">Verify a signature on a message.</div><div class="ttdef"><b>Definition</b> <a href="PublicKey_8cpp_source.html#l00270">PublicKey.cpp:270</a></div></div>
<div class="ttc" id="anamespaceripple_html_a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b"><div class="ttname"><a href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b">ripple::ProtocolFeature::ValidatorListPropagation</a></div><div class="ttdeci">@ ValidatorListPropagation</div></div>
<div class="ttc" id="anamespaceripple_html_a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1"><div class="ttname"><a href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1">ripple::ProtocolFeature::ValidatorList2Propagation</a></div><div class="ttdeci">@ ValidatorList2Propagation</div></div>
<div class="ttc" id="anamespaceripple_html_a44b8469c9a47739d50dd628e8a4bd561"><div class="ttname"><a href="namespaceripple.html#a44b8469c9a47739d50dd628e8a4bd561">ripple::base64_decode</a></div><div class="ttdeci">std::string base64_decode(std::string_view data)</div><div class="ttdef"><b>Definition</b> <a href="libxrpl_2basics_2base64_8cpp_source.html#l00226">libxrpl/basics/base64.cpp:226</a></div></div>
<div class="ttc" id="anamespaceripple_html_a4c908de9e211941a49282147bdc6f076"><div class="ttname"><a href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">ripple::splitMessage</a></div><div class="ttdeci">std::size_t splitMessage(std::vector&lt; ValidatorList::MessageWithHash &gt; &amp;messages, protocol::TMValidatorListCollection const &amp;largeMsg, std::size_t maxSize, std::size_t begin=0, std::size_t end=0)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00483">ValidatorList.cpp:483</a></div></div>
<div class="ttc" id="anamespaceripple_html_a4ff3645a512aba91799410ca0da8ebf0"><div class="ttname"><a href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">ripple::splitMessageParts</a></div><div class="ttdeci">std::size_t splitMessageParts(std::vector&lt; ValidatorList::MessageWithHash &gt; &amp;messages, protocol::TMValidatorListCollection const &amp;largeMsg, std::size_t maxSize, std::size_t begin, std::size_t end)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00504">ValidatorList.cpp:504</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000"><div class="ttname"><a href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">ripple::ValStatus::current</a></div><div class="ttdeci">@ current</div><div class="ttdoc">This was a new validation and was added.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ripple::ListDisposition</a></div><div class="ttdeci">ListDisposition</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00036">ValidatorList.h:36</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ripple::ListDisposition::unsupported_version</a></div><div class="ttdeci">@ unsupported_version</div><div class="ttdoc">List version is not supported.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ripple::ListDisposition::stale</a></div><div class="ttdeci">@ stale</div><div class="ttdoc">Trusted publisher key, but seq is too old.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ripple::ListDisposition::accepted</a></div><div class="ttdeci">@ accepted</div><div class="ttdoc">List is valid.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ripple::ListDisposition::untrusted</a></div><div class="ttdeci">@ untrusted</div><div class="ttdoc">List signed by untrusted publisher key.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ripple::ListDisposition::same_sequence</a></div><div class="ttdeci">@ same_sequence</div><div class="ttdoc">Same sequence as current list.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ripple::ListDisposition::pending</a></div><div class="ttdeci">@ pending</div><div class="ttdoc">List will be valid in the future.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ripple::ListDisposition::known_sequence</a></div><div class="ttdeci">@ known_sequence</div><div class="ttdoc">Future sequence already seen.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ripple::ListDisposition::expired</a></div><div class="ttdeci">@ expired</div><div class="ttdoc">List is expired, but has the largest non-pending sequence seen so far.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ripple::ListDisposition::invalid</a></div><div class="ttdeci">@ invalid</div><div class="ttdoc">Invalid format or signature.</div></div>
<div class="ttc" id="anamespaceripple_html_a70e53b89eb57ac8fdc4625ce28455eb4"><div class="ttname"><a href="namespaceripple.html#a70e53b89eb57ac8fdc4625ce28455eb4">ripple::make_error_code</a></div><div class="ttdeci">std::error_code make_error_code(ripple::TokenCodecErrc e)</div><div class="ttdef"><b>Definition</b> <a href="token__errors_8h_source.html#l00078">token_errors.h:78</a></div></div>
<div class="ttc" id="anamespaceripple_html_a798e187ba7443d8f951b810a12d50976"><div class="ttname"><a href="namespaceripple.html#a798e187ba7443d8f951b810a12d50976">ripple::publicKeyType</a></div><div class="ttdeci">std::optional&lt; KeyType &gt; publicKeyType(Slice const &amp;slice)</div><div class="ttdoc">Returns the type of public key.</div><div class="ttdef"><b>Definition</b> <a href="PublicKey_8cpp_source.html#l00205">PublicKey.cpp:205</a></div></div>
<div class="ttc" id="anamespaceripple_html_a86e358ce3f06ff049af13c2342791cf8"><div class="ttname"><a href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">ripple::strHex</a></div><div class="ttdeci">std::string strHex(FwdIt begin, FwdIt end)</div><div class="ttdef"><b>Definition</b> <a href="strHex_8h_source.html#l00011">strHex.h:11</a></div></div>
<div class="ttc" id="anamespaceripple_html_a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470"><div class="ttname"><a href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">ripple::ManifestDisposition::accepted</a></div><div class="ttdeci">@ accepted</div><div class="ttdoc">Manifest is valid.</div></div>
<div class="ttc" id="anamespaceripple_html_a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3"><div class="ttname"><a href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ripple::ManifestDisposition::invalid</a></div><div class="ttdeci">@ invalid</div><div class="ttdoc">Timely, but invalid signature.</div></div>
<div class="ttc" id="anamespaceripple_html_a93f2333b362ee67694b78f55eadf7805"><div class="ttname"><a href="namespaceripple.html#a93f2333b362ee67694b78f55eadf7805">ripple::makeSlice</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_same&lt; T, char &gt;::value||std::is_same&lt; T, unsigned char &gt;::value, Slice &gt; makeSlice(std::array&lt; T, N &gt; const &amp;a)</div><div class="ttdef"><b>Definition</b> <a href="Slice_8h_source.html#l00225">Slice.h:225</a></div></div>
<div class="ttc" id="anamespaceripple_html_aa2a27f242f6d150ff52f2ad0b2e2a512"><div class="ttname"><a href="namespaceripple.html#aa2a27f242f6d150ff52f2ad0b2e2a512">ripple::calcNodeID</a></div><div class="ttdeci">NodeID calcNodeID(PublicKey const &amp;)</div><div class="ttdoc">Calculate the 160-bit node ID from a node public key.</div><div class="ttdef"><b>Definition</b> <a href="PublicKey_8cpp_source.html#l00301">PublicKey.cpp:301</a></div></div>
<div class="ttc" id="anamespaceripple_html_aad512dea42da4cc179f20c67de593c26ae3cc92c14a5e6dd1a7d94b6ff634d7fc"><div class="ttname"><a href="namespaceripple.html#aad512dea42da4cc179f20c67de593c26ae3cc92c14a5e6dd1a7d94b6ff634d7fc">ripple::AttestationMatch::match</a></div><div class="ttdeci">@ match</div></div>
<div class="ttc" id="anamespaceripple_html_aaee5c5a25fe700e8c60aa391e8a7e6c6"><div class="ttname"><a href="namespaceripple.html#aaee5c5a25fe700e8c60aa391e8a7e6c6">ripple::strViewUnHex</a></div><div class="ttdeci">std::optional&lt; Blob &gt; strViewUnHex(std::string_view strSrc)</div><div class="ttdef"><b>Definition</b> <a href="StringUtilities_8h_source.html#l00093">StringUtilities.h:93</a></div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4">ripple::PublisherStatus</a></div><div class="ttdeci">PublisherStatus</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00068">ValidatorList.h:68</a></div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">ripple::PublisherStatus::unavailable</a></div><div class="ttdeci">@ unavailable</div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">ripple::PublisherStatus::revoked</a></div><div class="ttdeci">@ revoked</div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ripple::PublisherStatus::expired</a></div><div class="ttdeci">@ expired</div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">ripple::PublisherStatus::available</a></div><div class="ttdeci">@ available</div></div>
<div class="ttc" id="anamespaceripple_html_ac124fe6744b7fe887dec949b56b16d50"><div class="ttname"><a href="namespaceripple.html#ac124fe6744b7fe887dec949b56b16d50">ripple::to_string</a></div><div class="ttdeci">std::string to_string(base_uint&lt; Bits, Tag &gt; const &amp;a)</div><div class="ttdef"><b>Definition</b> <a href="base__uint_8h_source.html#l00611">base_uint.h:611</a></div></div>
<div class="ttc" id="anamespaceripple_html_ac6313681c41516db0a8f8829e1d7b753"><div class="ttname"><a href="namespaceripple.html#ac6313681c41516db0a8f8829e1d7b753">ripple::maximiumMessageSize</a></div><div class="ttdeci">constexpr std::size_t maximiumMessageSize</div><div class="ttdef"><b>Definition</b> <a href="Message_8h_source.html#l00015">Message.h:15</a></div></div>
<div class="ttc" id="anamespaceripple_html_ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45"><div class="ttname"><a href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">ripple::HashPrefix::manifest</a></div><div class="ttdeci">@ manifest</div><div class="ttdoc">Manifest.</div></div>
<div class="ttc" id="anamespaceripple_html_ae18870f8d8eaa17b582f609cc486aa04"><div class="ttname"><a href="namespaceripple.html#ae18870f8d8eaa17b582f609cc486aa04">ripple::writeFileContents</a></div><div class="ttdeci">void writeFileContents(boost::system::error_code &amp;ec, boost::filesystem::path const &amp;destPath, std::string const &amp;contents)</div><div class="ttdef"><b>Definition</b> <a href="FileUtilities_8cpp_source.html#l00062">FileUtilities.cpp:62</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae3f5bc352766a1a8dbf5270eb7dbc2e7"><div class="ttname"><a href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">ripple::sha512Half</a></div><div class="ttdeci">sha512_half_hasher::result_type sha512Half(Args const &amp;... args)</div><div class="ttdoc">Returns the SHA512-Half of a series of objects.</div><div class="ttdef"><b>Definition</b> <a href="digest_8h_source.html#l00205">digest.h:205</a></div></div>
<div class="ttc" id="anamespaceripple_html_afa0aa10894e600bbb27be9b3be16a4a0"><div class="ttname"><a href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">ripple::buildValidatorListMessage</a></div><div class="ttdeci">std::size_t buildValidatorListMessage(std::vector&lt; ValidatorList::MessageWithHash &gt; &amp;messages, std::uint32_t rawVersion, std::string const &amp;rawManifest, ValidatorBlobInfo const &amp;currentBlob, std::size_t maxSize)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00569">ValidatorList.cpp:569</a></div></div>
<div class="ttc" id="anext_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a></div><div class="ttdeci">T next(T... args)</div></div>
<div class="ttc" id="anumeric_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/numeric.html">numeric</a></div></div>
<div class="ttc" id="aoptional_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional</a></div></div>
<div class="ttc" id="apair_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair</a></div></div>
<div class="ttc" id="apush_back_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">std::vector::push_back</a></div><div class="ttdeci">T push_back(T... args)</div></div>
<div class="ttc" id="aremove_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/remove.html">std::remove_if</a></div><div class="ttdeci">T remove_if(T... args)</div></div>
<div class="ttc" id="areserve_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">std::vector::reserve</a></div><div class="ttdeci">T reserve(T... args)</div></div>
<div class="ttc" id="areset_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional/reset.html">std::optional::reset</a></div><div class="ttdeci">T reset(T... args)</div></div>
<div class="ttc" id="ashared_lock_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a></div></div>
<div class="ttc" id="ashared_mutex_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/shared_mutex.html">shared_mutex</a></div></div>
<div class="ttc" id="ashared_ptr_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr</a></div></div>
<div class="ttc" id="asize_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/size.html">std::vector::size</a></div><div class="ttdeci">T size(T... args)</div></div>
<div class="ttc" id="asize_t_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div></div>
<div class="ttc" id="asort_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/sort.html">std::sort</a></div><div class="ttdeci">T sort(T... args)</div></div>
<div class="ttc" id="astructripple_1_1Manifest_html"><div class="ttname"><a href="structripple_1_1Manifest.html">ripple::Manifest</a></div><div class="ttdef"><b>Definition</b> <a href="Manifest_8h_source.html#l00061">Manifest.h:62</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html"><div class="ttname"><a href="structripple_1_1TrustChanges.html">ripple::TrustChanges</a></div><div class="ttdoc">Changes in trusted nodes after updating validator list.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00088">ValidatorList.h:89</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html_a0c0a50258cfb5466d79bcff91a8d5c00"><div class="ttname"><a href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">ripple::TrustChanges::added</a></div><div class="ttdeci">hash_set&lt; NodeID &gt; added</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00092">ValidatorList.h:92</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html_a968f2c3bdc3420ca645ad54a5be5c6d9"><div class="ttname"><a href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">ripple::TrustChanges::removed</a></div><div class="ttdeci">hash_set&lt; NodeID &gt; removed</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00093">ValidatorList.h:93</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html">ripple::ValidatorBlobInfo</a></div><div class="ttdoc">Used to represent the information stored in the blobs_v2 Json array.</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00097">ValidatorList.h:98</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html_a14a9062d631a59e17893186560310288"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">ripple::ValidatorBlobInfo::blob</a></div><div class="ttdeci">std::string blob</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00100">ValidatorList.h:100</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html_ab85c1d3f43dae20290c0271a1cfd4270"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">ripple::ValidatorBlobInfo::signature</a></div><div class="ttdeci">std::string signature</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00102">ValidatorList.h:102</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html_aff27a4056fcd7873c6d78a02047a79ad"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">ripple::ValidatorBlobInfo::manifest</a></div><div class="ttdeci">std::optional&lt; std::string &gt; manifest</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00105">ValidatorList.h:105</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1MessageWithHash_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1MessageWithHash.html">ripple::ValidatorList::MessageWithHash</a></div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00297">ValidatorList.h:298</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1MessageWithHash_html_a17b716a96c5adf8f12cee236370a3aa5"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a17b716a96c5adf8f12cee236370a3aa5">ripple::ValidatorList::MessageWithHash::MessageWithHash</a></div><div class="ttdeci">MessageWithHash()=default</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ripple::ValidatorList::PublisherListCollection</a></div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00175">ValidatorList.h:176</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a1ca30d925811c0634bbaedc04da3881c"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">ripple::ValidatorList::PublisherListCollection::rawManifest</a></div><div class="ttdeci">std::string rawManifest</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00201">ValidatorList.h:201</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a48d42d3793975088316dd65e63e78c24"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">ripple::ValidatorList::PublisherListCollection::current</a></div><div class="ttdeci">PublisherList current</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00188">ValidatorList.h:188</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a4efb18d223a1910d123c99e09c1a524c"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">ripple::ValidatorList::PublisherListCollection::remaining</a></div><div class="ttdeci">std::map&lt; std::size_t, PublisherList &gt; remaining</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00197">ValidatorList.h:197</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a6b97cdf21f82f10b613a058c355670f7"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">ripple::ValidatorList::PublisherListCollection::rawVersion</a></div><div class="ttdeci">std::uint32_t rawVersion</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00202">ValidatorList.h:202</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ripple::ValidatorList::PublisherListStats</a></div><div class="ttdoc">Describes the result of processing a Validator List (UNL), including some of the information from the...</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00272">ValidatorList.h:273</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a0152f32b497bbaa62e9a85e0be90bb02"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02">ripple::ValidatorList::PublisherListStats::mergeDispositions</a></div><div class="ttdeci">void mergeDispositions(PublisherListStats const &amp;src)</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00082">ValidatorList.cpp:82</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a1c1a5dcd8079d94a6affd3602b9d4fbc"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">ripple::ValidatorList::PublisherListStats::bestDisposition</a></div><div class="ttdeci">ListDisposition bestDisposition() const</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00068">ValidatorList.cpp:68</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a3377c0090810a38667f445596bb1aaf7"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a3377c0090810a38667f445596bb1aaf7">ripple::ValidatorList::PublisherListStats::PublisherListStats</a></div><div class="ttdeci">PublisherListStats()=default</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a47be311fd3dc2b5a9aa0623ee493215d"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a47be311fd3dc2b5a9aa0623ee493215d">ripple::ValidatorList::PublisherListStats::worstDisposition</a></div><div class="ttdeci">ListDisposition worstDisposition() const</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8cpp_source.html#l00075">ValidatorList.cpp:75</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a517f509ad4f2032f1553def3e810a5a5"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">ripple::ValidatorList::PublisherListStats::dispositions</a></div><div class="ttdeci">std::map&lt; ListDisposition, std::size_t &gt; dispositions</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00291">ValidatorList.h:291</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a6863af689efe13c3d2c5193bd1a6b580"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">ripple::ValidatorList::PublisherListStats::publisherKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; publisherKey</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00292">ValidatorList.h:292</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_aa37066f4c4bc231ad60e6f751e56bf05"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aa37066f4c4bc231ad60e6f751e56bf05">ripple::ValidatorList::PublisherListStats::sequence</a></div><div class="ttdeci">std::size_t sequence</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00294">ValidatorList.h:294</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html">ripple::ValidatorList::PublisherList</a></div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00155">ValidatorList.h:156</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_a1d97cceec8dbfaf845cceade47cfdbb4"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#a1d97cceec8dbfaf845cceade47cfdbb4">ripple::ValidatorList::PublisherList::list</a></div><div class="ttdeci">std::vector&lt; PublicKey &gt; list</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00159">ValidatorList.h:159</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_a4d5d54c46f6269d96903ac574975f261"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#a4d5d54c46f6269d96903ac574975f261">ripple::ValidatorList::PublisherList::siteUri</a></div><div class="ttdeci">std::string siteUri</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00164">ValidatorList.h:164</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_aad9dd39b951a5b4a42bba0593ac16289"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#aad9dd39b951a5b4a42bba0593ac16289">ripple::ValidatorList::PublisherList::sequence</a></div><div class="ttdeci">std::size_t sequence</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00161">ValidatorList.h:161</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_ab1eaafc17bdc547f85f4898d5535c6e5"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#ab1eaafc17bdc547f85f4898d5535c6e5">ripple::ValidatorList::PublisherList::validUntil</a></div><div class="ttdeci">TimeKeeper::time_point validUntil</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00163">ValidatorList.h:163</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_ade8078adfb156f2f5b2d976fc91b6b75"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#ade8078adfb156f2f5b2d976fc91b6b75">ripple::ValidatorList::PublisherList::validFrom</a></div><div class="ttdeci">TimeKeeper::time_point validFrom</div><div class="ttdef"><b>Definition</b> <a href="ValidatorList_8h_source.html#l00162">ValidatorList.h:162</a></div></div>
<div class="ttc" id="atime_point_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/chrono/time_point.html">std::chrono::time_point</a></div></div>
<div class="ttc" id="aunordered_set_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/unordered_set.html">std::unordered_set</a></div></div>
<div class="ttc" id="avector_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>