<div dir="ltr">I like onlyContains() and containsOnly() so far. </div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 3, 2017 at 1:29 AM, Daniel Duan via swift-evolution <span dir="ltr"><<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">I want to retract my nitpickings on argument labels; `all(equal:)` and `all(match:)` are the best names for these methods.<div><br></div><div>things all match condition?</div><div>things all equal value?</div><div><br></div><div>If we accept `all` as a term of art (which I think we should), along with these labels the use site are very readable!</div><div><div class="h5"><div><div><br><div><div><blockquote type="cite"><div>On Mar 31, 2017, at 6:38 PM, Daniel Duan via swift-evolution <<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>> wrote:</div><br class="m_3567735769958103683Apple-interchange-newline"><div><div style="word-wrap:break-word">nit: should these names be `all(matching)`/`all(equalTo)` per API Design Guidelines?<br><div><blockquote type="cite"><div>On Mar 31, 2017, at 8:28 AM, Ben Cohen via swift-evolution <<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>> wrote:</div><br class="m_3567735769958103683Apple-interchange-newline"><div><div style="word-wrap:break-word;line-break:after-white-space">Hi,<div><br></div><div>A short proposal for you as part of the algorithms theme. Hopefully non-controversial, aside from the naming of the method and arguments, about which controversy abounds. Online copy here: <a href="https://github.com/airspeedswift/swift-evolution/blob/9a778e904c9be8a3692edd19bb757b23c54aacbe/proposals/0162-all-algorithm.md" target="_blank">https://github.com/<wbr>airspeedswift/swift-evolution/<wbr>blob/<wbr>9a778e904c9be8a3692edd19bb757b<wbr>23c54aacbe/proposals/0162-all-<wbr>algorithm.md</a></div><div><br></div><div><br></div><div><h1 id="m_3567735769958103683add-an--code-all--code--algorithm-to--code-sequence--code-" style="box-sizing:border-box;font-size:2.25em;margin-right:0px;margin-bottom:16px;margin-left:0px;line-height:1.2;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255);margin-top:0px!important">Add an <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:24.479999542236328px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">all</code> algorithm to <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:24.479999542236328px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">Sequence</code></h1><ul style="box-sizing:border-box;padding:0px 0px 0px 2em;margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)"><li style="box-sizing:border-box">Proposal: <a style="box-sizing:border-box;background-color:transparent;color:rgb(65,131,196);text-decoration:none">SE-NNNN</a></li><li style="box-sizing:border-box">Authors: <a href="https://github.com/airspeedswift" style="box-sizing:border-box;background-color:transparent;color:rgb(65,131,196);text-decoration:none" target="_blank">Ben Cohen</a></li><li style="box-sizing:border-box">Review Manager: TBD</li><li style="box-sizing:border-box">Status: <strong style="box-sizing:border-box">Awaiting review</strong></li></ul><h2 id="m_3567735769958103683introduction" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Introduction</h2><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">It is common to want to confirm that every element of a sequence equals a value, or matches a certain criteria. Many implementations of this can be found in use on github. This proposal adds such a method to <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">Sequence</code>.</p><h2 id="m_3567735769958103683motivation" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Motivation</h2><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">You can achieve this in Swift 3 with <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">contains</code> by negating both the criteria and the result:</p><pre style="box-sizing:border-box;overflow:auto;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;padding:16px;background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;color:rgb(51,51,51);height:103px"><code class="m_3567735769958103683swift m_3567735769958103683hljs" style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;padding:0.5em;margin:0px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:0px;display:block;overflow-x:auto;line-height:inherit;word-wrap:normal;height:auto"><span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">// every element is 9</span>
!nums.<span class="m_3567735769958103683hljs-built_in" style="box-sizing:border-box;color:rgb(0,134,179)">contains</span> { $<span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">0</span> != <span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">9</span> }
<span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">// every element is odd</span>
!nums.<span class="m_3567735769958103683hljs-built_in" style="box-sizing:border-box;color:rgb(0,134,179)">contains</span> { !isOdd($<span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">0</span>) }</code></pre><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">but these are a readability nightmare. Additionally, developers may not make the leap to realize <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">contains</code> can be used this way, so may hand-roll their own <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">for</code> loop, which could be buggy<ins id="m_3567735769958103683firstdiff" style="box-sizing:border-box;display:inline-block;text-decoration:none!important;border:none!important;background-image:none!important;background-position:initial initial!important;background-repeat:initial initial!important"></ins>, or compose other inefficient alternatives:</p><pre style="box-sizing:border-box;overflow:auto;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;padding:16px;background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;color:rgb(51,51,51);height:103px"><code class="m_3567735769958103683swift m_3567735769958103683hljs" style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;padding:0.5em;margin:0px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:0px;display:block;overflow-x:auto;line-height:inherit;word-wrap:normal;height:auto"><span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">// misses opportunity to bail early</span>
nums.<span class="m_3567735769958103683hljs-built_in" style="box-sizing:border-box;color:rgb(0,134,179)">reduce</span>(<span class="m_3567735769958103683hljs-literal" style="box-sizing:border-box;color:rgb(0,128,128)">true</span>) { $<span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">0.0</span> && $<span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">0.1</span> == <span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">9</span> }
<span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">// the most straw-man travesty I could think of...</span>
<span class="m_3567735769958103683hljs-type" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Set</span>(nums).<span class="m_3567735769958103683hljs-built_in" style="box-sizing:border-box;color:rgb(0,134,179)">count</span> == <span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">1</span> && <span class="m_3567735769958103683hljs-type" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Set</span>(nums).first == <span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">9</span></code></pre><h2 id="m_3567735769958103683proposed-solution" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Proposed solution</h2><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">Introduce two algorithms on <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">Sequence</code> which test every element and return <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">true</code> if they match:</p><pre style="box-sizing:border-box;overflow:auto;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;padding:16px;background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;color:rgb(51,51,51);height:73px"><code class="m_3567735769958103683swift m_3567735769958103683hljs" style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;padding:0.5em;margin:0px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:0px;display:block;overflow-x:auto;line-height:inherit;word-wrap:normal;height:auto">nums.all(<span class="m_3567735769958103683hljs-built_in" style="box-sizing:border-box;color:rgb(0,134,179)">equal</span>: <span class="m_3567735769958103683hljs-number" style="box-sizing:border-box;color:rgb(0,128,128)">9</span>)
nums.all(match: isOdd)</code></pre><h2 id="m_3567735769958103683detailed-design" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Detailed design</h2><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">Add the following extensions to <code style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;padding:0.2em 0px;margin:0px;background-color:rgba(0,0,0,0.0392157);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px">Sequence</code>:</p><pre style="box-sizing:border-box;overflow:auto;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10.880000114440918px;margin-top:0px;margin-bottom:16px;font-stretch:normal;line-height:1.45;padding:16px;background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-wrap:normal;color:rgb(51,51,51);height:208px"><code class="m_3567735769958103683swift m_3567735769958103683hljs" style="box-sizing:border-box;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;padding:0.5em;margin:0px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:0px;display:block;overflow-x:auto;line-height:inherit;word-wrap:normal;height:auto"><span class="m_3567735769958103683hljs-class" style="box-sizing:border-box"><span class="m_3567735769958103683hljs-keyword" style="box-sizing:border-box;font-weight:bold">extension</span> <span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Sequence</span> </span>{
<span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">/// Returns a Boolean value indicating whether every element of the sequence</span>
<span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">/// satisfies the given predicate.</span>
<span class="m_3567735769958103683hljs-function" style="box-sizing:border-box"><span class="m_3567735769958103683hljs-keyword" style="box-sizing:border-box;font-weight:bold">func</span> <span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(153,0,0);font-weight:bold">all</span><span class="m_3567735769958103683hljs-params" style="box-sizing:border-box">(match criteria: <span class="m_3567735769958103683hljs-params" style="box-sizing:border-box">(Iterator.Element)</span></span></span> <span class="m_3567735769958103683hljs-keyword" style="box-sizing:border-box;font-weight:bold">throws</span> -> <span class="m_3567735769958103683hljs-type" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Bool</span>) <span class="m_3567735769958103683hljs-keyword" style="box-sizing:border-box;font-weight:bold">rethrows</span> -> <span class="m_3567735769958103683hljs-type" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Bool</span>
}
<span class="m_3567735769958103683hljs-class" style="box-sizing:border-box"><span class="m_3567735769958103683hljs-keyword" style="box-sizing:border-box;font-weight:bold">extension</span> <span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Sequence</span> <span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">where</span> <span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Iterator</span>.<span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Element</span>: <span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Equatable</span> </span>{
<span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">/// Returns a Boolean value indicating whether every element of the sequence</span>
<span class="m_3567735769958103683hljs-comment" style="box-sizing:border-box;color:rgb(153,153,136);font-style:italic">/// equals the given element.</span>
<span class="m_3567735769958103683hljs-function" style="box-sizing:border-box"><span class="m_3567735769958103683hljs-keyword" style="box-sizing:border-box;font-weight:bold">func</span> <span class="m_3567735769958103683hljs-title" style="box-sizing:border-box;color:rgb(153,0,0);font-weight:bold">all</span><span class="m_3567735769958103683hljs-params" style="box-sizing:border-box">(<span class="m_3567735769958103683hljs-built_in" style="box-sizing:border-box;color:rgb(0,134,179)">equal</span> element: Iterator.Element)</span></span> -> <span class="m_3567735769958103683hljs-type" style="box-sizing:border-box;color:rgb(68,85,136);font-weight:bold">Bool</span>
}</code></pre><h2 id="m_3567735769958103683source-compatibility" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Source compatibility</h2><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">This change is purely additive so has no source compatibility consequences.</p><h2 id="m_3567735769958103683effect-on-abi-stability" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Effect on ABI stability</h2><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">This change is purely additive so has no ABI stability consequences.</p><h2 id="m_3567735769958103683effect-on-api-resilience" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Effect on API resilience</h2><p style="box-sizing:border-box;margin:0px 0px 16px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255)">This change is purely additive so has no API resilience consequences.</p><h2 id="m_3567735769958103683alternatives-considered" style="box-sizing:border-box;margin-top:1em;margin-bottom:16px;line-height:1.225;font-size:1.75em;color:rgb(51,51,51);padding-bottom:0.3em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(238,238,238);font-family:helvetica,arial,freesans,clean,sans-serif;background-color:rgb(255,255,255)">Alternatives considered</h2><div style="box-sizing:border-box;margin-top:0px;margin-right:0px;margin-left:0px;color:rgb(51,51,51);font-family:helvetica,arial,freesans,clean,sans-serif;font-size:12.799999237060547px;background-color:rgb(255,255,255);margin-bottom:0px!important">Not adding it.</div></div></div>______________________________<wbr>_________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br></div></blockquote></div><br></div>______________________________<wbr>_________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br></div></blockquote></div><br></div></div></div></div></div></div><br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Brandon</div>
</div>