<?xml version="1.0" encoding="UTF-8"?>
<Worksheet>
<Version major="2015" minor="1"/>
<Label-Scheme value="2" prefix=""/>
<View-Properties presentation="false" autoexpanding_sections="true" UserProfileName="Maple Default Profile" NumericFormat-ApplyInteger="true" NumericFormat-ApplyRational="true" NumericFormat-ApplyExponent="false">
</View-Properties>
<MapleNet-Properties elisiondigitsbefore="100" labelling="true" indentamount="4" elisiontermsthreshold="10000" ansi="false" errorbreak="1" useclientjvm="true" echo="1" imaginaryunit="I" labelwidth="20" unitattributes="&quot;fontweight&quot; = &quot;bold&quot;" contextmenusize="automatic" plotdriver="opengl" elisiondigitsafter="100" plotoutput="terminal" helpbrowser="standard" rtablesize="10" elisiontermsbefore="100" elisiondigitsthreshold="10000" typesetting="standard" plotdevice="inline" verboseproc="1" showassumed="1" quiet="false" errorcursor="false" longdelim="true" plotoptions="" elisiontermsafter="100" screenwidth="79" preplot="" prettyprint="3" displayprecision="-1" screenpixelheight="1200" warnlevel="3" screenheight="25" latexwidth="8.0" postplot="" prompt="&gt; " ShowLabels="true"/>
<Styles>
<Font name="Ordered List 1" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Annotation Text" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Ordered List 2" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Ordered List 3" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Ordered List 4" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Ordered List 5" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Author" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Annotation Title" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Warning" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Caption Reference" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Maple Input Placeholder" background="[255,255,255]" bold="true" executable="true" family="Courier New" foreground="[200,0,200]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="true"/>
<Font name="Maple Plot" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Code" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[255,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Line Printed Output" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Text Output" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Diagnostic" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[40,120,40]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="2D Inert Output" background="[255,255,255]" bold="false" executable="true" family="Times New Roman" foreground="[144,144,144]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Normal" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Times New Roma" foreground="[0,128,128]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true" placeholder="false"/>
<Font name="Maple Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Dash Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="2D Math" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Maple Input" background="[255,255,255]" bold="true" executable="true" family="Courier New" foreground="[255,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="2D Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="2D Input" background="[255,255,255]" bold="false" executable="true" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="HyperlinkError" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[255,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="true" placeholder="false"/>
<Font name="Header and Footer" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="10" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Error" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[255,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Title" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Heading 1" background="[255,255,255]" bold="true" executable="false" family="Times New Roma" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Text" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Bullet Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Heading 4" background="[255,255,255]" bold="false" executable="false" family="Times New Roma" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Equation Label" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Heading 3" background="[255,255,255]" bold="true" executable="false" family="Times New Roma" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="14" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Heading 2" background="[255,255,255]" bold="true" executable="false" family="Times New Roma" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="16" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="HyperlinkWarning" background="[255,255,255]" bold="false" executable="false" family="Courier New" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="true" placeholder="false"/>
<Font name="Dictionary Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Times New Roma" foreground="[147,0,15]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true" placeholder="false"/>
<Font name="Atomic Variable" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[175,0,175]" italic="true" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="Caption Text" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Font name="List Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false" placeholder="false"/>
<Layout name="Ordered List 1" alignment="left" bullet="numeric" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1" bulletsuffix=""/>
<Layout name="Ordered List 2" alignment="left" bullet="alphabetic" firstindent="0" leftmargin="36" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1" bulletsuffix=""/>
<Layout name="Ordered List 3" alignment="left" bullet="roman" firstindent="0" leftmargin="72" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1" bulletsuffix=""/>
<Layout name="Ordered List 4" alignment="left" bullet="ALPHABETIC" firstindent="0" leftmargin="108" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1" bulletsuffix=""/>
<Layout name="Ordered List 5" alignment="left" bullet="ROMAN" firstindent="0" leftmargin="144" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1" bulletsuffix=""/>
<Layout name="Author" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="8" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Warning" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Annotation Title" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="12" spacebelow="12" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Maple Plot" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Line Printed Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Text Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="newline" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Diagnostic" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Normal" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Maple Output" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.3" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Dash Item" alignment="left" bullet="dash" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="HyperlinkError" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Error" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Title" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="12" spacebelow="12" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Heading 1" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="4" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Bullet Item" alignment="left" bullet="dot" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Heading 4" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Heading 3" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="Heading 2" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="2" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="HyperlinkWarning" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Layout name="List Item" alignment="left" bullet="indent" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0" bulletsuffix=""/>
<Pencil-style name="Pencil 5" pen-color="[255,0,0]" pen-height="5.0" pen-width="5.0" pen-opacity="1.0"/>
<Pencil-style name="Pencil 4" pen-color="[0,0,255]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
<Pencil-style name="Pencil 3" pen-color="[0,0,0]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
<Pencil-style name="Pencil 2" pen-color="[0,0,255]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
<Pencil-style name="Pencil 1" pen-color="[0,0,0]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
<Highlighter-style name="Highlighter 2" pen-color="[255,204,0]" pen-height="14.0" pen-width="14.0" pen-opacity="0.8"/>
<Highlighter-style name="Highlighter 1" pen-color="[255,153,255]" pen-height="12.0" pen-width="8.0" pen-opacity="0.8"/>
<Highlighter-style name="Highlighter 4" pen-color="[0,255,255]" pen-height="32.0" pen-width="32.0" pen-opacity="0.8"/>
<Highlighter-style name="Highlighter 3" pen-color="[51,255,0]" pen-height="24.0" pen-width="24.0" pen-opacity="0.8"/>
<Highlighter-style name="Highlighter 5" pen-color="[255,255,0]" pen-height="48.0" pen-width="48.0" pen-opacity="0.8"/>
</Styles>
<Startup-Code startupcode=""/>
<Task-table>
    <Task-category name="&lt;default&gt;"/>
</Task-table>
<Task/>
<Group labelreference="L4840" drawlabel="true">
<Input>
<Text-field style="Title" size="20" family="Arial" layout="Title"><Font family="Arial" size="20">The SHA-3 Family of Cryptographic Hash Functions and Extendable-Output Functions</Font></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"><Font family="Arial" encoding="UTF-8">Jos\303\251 Luis G\303\263mez Pardo</Font></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"><Font family="Arial" encoding="UTF-8">Departamento de \303\201lxebra, Universidade de Santiago</Font></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"><Font family="Arial">15782 Santiago de Compostela, Spain</Font></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"><Font family="Arial">e-mail: </Font><Hyperlink linktarget="mailto:gomez.pardo@usc.es" hyperlink="true"><Font style="Author" family="Arial" underline="true" foreground="[0,128,128]">gomez.pardo@usc.es</Font></Hyperlink></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"><Font family="Arial" encoding="UTF-8">Carlos G\303\263mez-Rodr\303\255guez</Font></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"><Font family="Arial" encoding="UTF-8">Departamento de Computaci\303\263n, Universidade da Coru\303\261a</Font></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"><Font family="Arial" encoding="UTF-8">15071 A Coru\303\261a, Spain
</Font><Font family="Arial">e-mail: </Font><Hyperlink linktarget="mailto:cgomezr@udc.es" hyperlink="true"><Font style="Hyperlink" family="Arial">cgomezr@udc.es</Font></Hyperlink></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"></Text-field>
<Text-field style="Author" family="Arial" layout="Author" spacebelow="2" spaceabove="2"></Text-field>
</Input>
</Group>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">Introduction</Text-field></Title>
<Text-field style="Text" size="14" layout="Normal"><Font size="14">   </Font></Text-field>
<Text-field style="Text" size="14" layout="Normal"><Font size="12">    This worksheet contains a Maple implementation of the Secure Hash Algorithm-3 (SHA-3) family of functions wich have been standardized by the US National Institute of Standards and Technology (NIST) in August 2015, as specified in [FIPS PUB 202] (</Font><Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink><Font size="12">). The SHA-3 family consists of four cryptographic hash functions, called SHA3-224, SHA3-256, SHA3-384, and SHA3-512, and two extendable-output functions (XOFs), called SHAKE128 and SHAKE256. The XOFs are different from hash functions but, as stated in </Font><Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink><Font size="12">, &quot;it is possible to use them in similar ways, with the flexibility to be adapted directly to the requirements of individual applications, subject to additional security considerations&quot;.  The SHA-3 functions are based on the <Font family="Courier New">Keccak</Font> sponge function, designed by G. Bertoni, J. Daemen, M. Peeters, G. Van Assche.  <Font family="Courier New">Keccak</Font> was selected for this purpose because it was declared, on October 2, 2012, the winner of the </Font><Hyperlink linktarget="http://csrc.nist.gov/groups/ST/hash/sha-3/index.html" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">NIST Hash Function Competition</Font></Hyperlink><Font size="12"> held by NIST. </Font></Text-field>
<Text-field style="Text" size="14" layout="Normal"></Text-field>
<Text-field style="Text" size="14" layout="Normal"><Font size="12">    The worksheet is an updated version of a previous one which had been published in 2013 with the title <Font bold="true">&quot;The SHA-3 family of hash functions and their use for message authentication&quot;</Font>. The new version includes the XOFs following the NIST specification and, at the programming level, the most important change is in the padding procedure.  In the original proposal, the SHA-3 functions were instances of <Font family="Courier New">Keccak</Font>, which uses the pad10*1 algorithm specified in  </Font><Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink><Font size="12">,but in </Font><Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink><Font size="12"> the application of <Font family="Courier New">Keccak</Font> is preceded by appending a two-bit suffix &quot;01&quot; to the message in the case of the SHA-3 hash functions and appending a four-bit &quot;1111&quot; suffix  in the case of the SHA-3 XOFs. The stated purpose of this modification is to distinguish the SHA-3 hash functions from the XOFs and to facilitate the development of new variants of the SHA-3 functions. With respect to the previous version of this worksheet, we just made the minimum number of changes to comply with the standard and, in particular, we kept the terminology used in the previous version.  We also implement the Message Authentication Code HMAC-SHA-3, based on the SHA-3 hash functions. </Font></Text-field>
<Text-field style="Text" size="14" layout="Normal"></Text-field>
<Text-field style="Text" size="14" layout="Normal"><Font size="12">    In addition to the NIST specification in </Font><Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink><Font size="12">, the principal reference for <Font family="Courier New">Keccak</Font> may be found in the </Font><Hyperlink linktarget="http://keccak.noekeon.org" hyperlink="true"><Font style="Hyperlink">The Keccak sponge function family</Font></Hyperlink><Font size="12"> web page and, in particular, in the documents &quot;The <Font family="Courier New">Keccak</Font> reference&quot; (</Font><Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink><Font size="12">),&quot;<Font family="Courier New">Keccak</Font> implementation overview&quot; (</Font><Hyperlink linktarget="http://keccak.noekeon.org/Keccak-implementation-3.2.pdf" hyperlink="true"><Font style="Hyperlink">Kimplementation</Font></Hyperlink><Font size="12">) and, in more detail, in &quot;<Font family="Courier New">Keccak</Font> sponge function family main document&quot; (</Font><Hyperlink linktarget="http://keccak.noekeon.org/Keccak-main-2.1.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Kmain</Font></Hyperlink><Font size="12">).  The implementation in this worksheet is similar to other implementations of cryptographic schemes included in </Font><Hyperlink linktarget="https://sites.google.com/site/cryptomaple" hyperlink="true"><Font style="Text" underline="true" encoding="UTF-8" foreground="[0,128,128]">[G\303\263mez Pardo]</Font></Hyperlink><Font size="12"> and its purpose is to facilitate learning through experimentation and to help to understand how the algorithm works.  With this in mind, one important design goal was to build up an implementation that could handle real messages in a variety of formats and not just short text strings. The implementation uses, whenever possible, lookup tables for efficiency and is able to compute hashes or authentication tags for both text (or hex) strings and binary files of moderate size. </Font></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    A hash function maps messages (which may be regarded as bit strings of arbitrary length) to short fixed-length strings, the <Font italic="true">message digests</Font> or <Font italic="true">hash values</Font> (or, simply, <Font italic="true">hashes</Font>) which can be seen as a sort of fingerprints of the messages. The idea is then that any change, either accidental or intentional to the message will, with high probability, also change the hash value, allowing the detection of the fact that these changes have taken place. For the hash function to be cryptographically useful it is then a basic requirement that the function be collision resistant, in the sense that it should be infeasible for an adversary to generate a <Font italic="true">collision</Font>, i.e., two different messages with the same hash (since hashes have a short fixed length, there will be many messages which have the same hash value, so the hash function is far from being injective but it should look like that to an adversary). At first sight, it might seem sufficient that the adversary be unable to find a collision with a given message, but for most cryptographic purposes this is not enough and, on the other hand, finding collisions between two messages, none of which is fixed, is much easier as a consequence of the <Font italic="true">birthday attack</Font> (see <Hyperlink linktarget="http://en.wikipedia.org/wiki/Cryptographic_hash_function" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Wikipedia Cryptographic Hash Function</Font></Hyperlink> and <Font underline="true" foreground="[0,128,128]">[</Font><Hyperlink linktarget="https://sites.google.com/site/cryptomaple" hyperlink="true"><Font style="Text" underline="true" encoding="UTF-8" foreground="[0,128,128]">G\303\263mez Pardo</Font></Hyperlink>, 5.6]). Thus a cryptographic hash function should be collision resistant (meaning that finding a collision is infeasible in practice), and also preimage resistant (i.e., one-way), the latter being always the case for all <Font italic="true">genuine</Font> collision resistant functions (i.e., for those that are not specifically designed to behave differently).  Cryptographic hash functions have many important cryptographic applications, including password or pin verification (the passwords are not stored but their hashes are stored instead), digital signatures and message authentication through MACs (our implementation of HMAC-SHA-3 below is an application of the latter type). In the case of the four SHA-3 hash functions, SHA3-224, SHA3-256, SHA3-384, and SHA3-512, the suffix after the dash indicates the bit-length of the digest, so that, for example, SHA3-512 produces 512-bit hashes. An extendable-output function (abbreviately XOF) maps messages to bit strings but, in contrast with hash functions, its output can be extended to any desired length. Thus in the functions SHAKE128 and SHAKE256, the suffixes do not indicate output length but, as explained in <Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink>,  they refer to the security strength that these functions can generally support<Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"></Hyperlink>.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The <Font family="Courier New">Keccak</Font> algorithm is based on the <Font italic="true">sponge construction</Font>, which is more general than a hash function since, using a permutation of fixed-length bit strings, it allows the selection of an arbitrary output length; this construction is presented in the documents &quot;Cryptographic Sponge Functions&quot; (<Hyperlink linktarget="http://sponge.noekeon.org/CSF-0.1.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Csponge</Font></Hyperlink>) and the already mentioned <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-main-2.1.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Kmain</Font></Hyperlink>, where its security properties are discussed. In particular, the authors have shown that the <Font family="Courier New">Keccak</Font> sponge function has the property called <Font italic="true">indifferentiability from a random oracle </Font>(a random oracle is an ideal hash function which, on each new input query, will pick uniformly at random some response from its output domain and will always return the same response if asked the same query again). Indeed, the authors have obtained an upper bound for the expected success probability of a shortcut attack (an attack whose success probability against the sponge function is higher than against a random oracle)  which, in turn, gives a lower bound for the expected complexity of differentiating the sponge construction (calling a random permutation) from a random oracle.  This is a provable lower bound on the expected workload of any successful generic attack, namely, of an attack that does not exploit specific properties of the underlying permutation, cf. <Font underline="true" foreground="[0,128,128]">Kmain</Font><Font encoding="UTF-8">. In addition to these good security properties, the sponge construction also has other practical advantages over constructions that make use of a compression function (a hash function that acts on fixed-length messages) such as the Merkle-Damg\303\245rd construction used in the SHA-2 family of hash functions (see, for example, [</Font><Hyperlink linktarget="https://sites.google.com/site/cryptomaple" hyperlink="true"><Font style="Text" underline="true" encoding="UTF-8" foreground="[0,128,128]">G\303\263mez Pardo</Font></Hyperlink>, 5.6.2] for a description of this construction). Among these advantages are its greater simplicity, the fact that it has variable-length output, and also the flexibility provided by the fact that its security level can be increased at the cost of speed by decreasing the bit rate and increasing the capacity (see below for the definition of these parameters).</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The sponge construction builds a function <Font family="Courier New">SPONGE</Font>[ <Font italic="true">f</Font> , pad,<Font italic="true"> r</Font>] which maps arbitrary finite-length bit strings to infinite-length bit strings using a permutation <Font italic="true">f:</Font><Font encoding="UTF-8"> (\342\204\244</Font><Font subscript="true">2</Font>)<Font superscript="true" italic="true">b</Font><Font encoding="UTF-8">\342\206\222 (\342\204\244</Font><Font subscript="true">2</Font>)<Font superscript="true" italic="true">b</Font> (where the positive integer <Font italic="true">b</Font> is called the width of <Font italic="true">f</Font>), an appropriate padding rule &quot;pad&quot; and a parameter <Font italic="true">r</Font> (a positive integer &lt; <Font italic="true">b</Font>) called the bit rate. A finite-length output can be obtained by truncating it to its first <Font italic="true">n</Font> bits. The sponge construction has a state of <Font italic="true">b</Font> bits which at the start of the process are all initialized to 0. The input message is then padded and divided into <Font italic="true">r</Font>-bit blocks and the sponge construction proceeds in two phases called the <Font italic="true">absorbing phase</Font> and the <Font italic="true">squeezing phase</Font>. The state bits are separated into two parts: the outer part consisting of the first <Font italic="true">r</Font> bits and the inner part with the remaining <Font italic="true">c</Font> = <Font italic="true">b</Font> - <Font italic="true">r</Font> bits, where <Font italic="true">c</Font> is called the capacity.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    In the absorbing phase, the first message block is XORed (using the bitwise XOR) with the outer part of the initial 0-state and then the permutation <Font italic="true">f</Font> is applied to the resulting state. Then the next <Font italic="true">r</Font>-bit message block is XORed with the outer part of the state and <Font italic="true">f</Font> is applied again. This process continues interleaving the XOR operations with applications of the permutation <Font italic="true">f</Font> until all the input is consumed. When all the message blocks are processed, the sponge construction switches to the squeezing phase. This phase starts by taking the first <Font italic="true">r</Font> bits from the state and then applying the permutation <Font italic="true">f</Font>. If the squeezed <Font italic="true">r</Font> bits are less than the requested <Font italic="true">n</Font> bits, the process continues by applying <Font italic="true">f</Font> to the state and then extracting the first <Font italic="true">r</Font> bits of the resulting state. The process is continued interleaving the extraction of the first <Font italic="true">r</Font> bits of the state with the application of <Font italic="true">f</Font><Font encoding="UTF-8"> until the total number of bits obtained is \342\211\245  </Font><Font italic="true">n</Font>, and the final output is obtained by truncating the squeezed bits to the first <Font italic="true">n</Font> bits. The whole process is summarized in <Hyperlink linktarget="http://sponge.noekeon.org/CSF-0.1.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Csponge</Font></Hyperlink> by means of the following image:</Text-field>
<Text-field style="Text" layout="Normal" alignment="centred"></Text-field>
<Group labelreference="L5054" drawlabel="true">
<Text-field superscript="false" placeholder="false" executable="false" selection-placeholder="false" italic="false" size="12" bold="false" subscript="false" family="Times New Roman" opaque="false" underline="false" background="[255,255,255]" readonly="false" foreground="[0,0,0]" alignment="centred" firstindent="0" spacebelow="0" leftmargin="0" linespacing="0.0" initial="0" linebreak="space" rightmargin="0" bulletsuffix="" spaceabove="0" bullet="none" pagebreak-before="false"><Image height="274" width="607" zoomable="false" labelreference="L5052" drawcaption="false" captionalignment="0" captionposition="1">TUZOV3RLVWI8b2I8Uj1NRExDZE5OWmVtOmBRPkQ6O1JkdXh2eT9HYlJRdEtDbHl3WTx0WFl0Q0NCYE5cXEBOZFxcUUhteGhZUGhIa2ZoeVU8eUNNUk1wdXV1TEpEVk9kckBsWE5kTEVkUkpkTD9xcXA8VGtFTE9kTE88VEpUT1xcVXlpUW5ycGxvWEtMcVRRVEtcXFBqOkBPQjxxWkxqREhuQ3VXPEBSWkRZWF1zd1V4alVUPERqQ21qXnR0cVl2RUxQc0RRbVlzUkhzVkVtbG1qPkFWajxcXDo+OnRUW1RMV0I6O1pFQW48SDo+WnFJakRuOj5aVnlaZD49Plpqd11iQEY8WjppaVpQajtaOnZYWjpeVVo6PkhKOj5SQ0I8bXZ0P1Y7UWJgcXZgXXdpWXJBd0NJPWVqQ2ZVcVZLSXRLSVI7RVJSeXVAb2JAd1ZJcWVfQVR4QjpbWGtteXZJeWpBeGpxZVhndXZHWW1naXdnSUFRcko/Q3NXZzpjZERlZ2ZfZ25vaHBvR2RLR3RzWXhhaUVXY0V1dHBjY0dnY0hrQ0hzeXZZeElReW9Zd3FvV1dRZ2ZfZ2Y/Zlo/cnNBZzpCOkFFVEtFUF9kTl93UkloPUl0S0lUU0VVU01TRE1jRm1GYWVWX0VlVVdlZU9nZG9GX2NGQ0VTQ0VYZltDa3NSS19Ib2NIZVl3ZXlUZj9VOz9EdFF5b1lXcWdXaGtVdj9Jdj15al1iSlFpb1V3QF1jUkNCX1k7O1Jad1dZcWlPb2RQb3JBeXJZO0lqPVZyQXhbUUhsS0heTUhzT2ZcXE9yVFF1VD1SOj1GbEtITFdkX1lDXFw7eHY7ZT5fYj5TRVVTRUNDQ0NvV2U7ZVZfZVZjVl9ldm5heG5FVEtFVE1VVE1tc0FZSjo+Wldmcj5hcnJXaXV3a1JGYFxcaGlEV2NFV2s9WGo9R2I7R3JXWXFxZ3hvaXhzXm1BQHBEbnZ3WXlxWWZBcWtPcXRQcXNJeXNpUXlmaXF1d3hmaXdnWWxNWGxBaWtVdl5iPl9CSXhuQzo8SnZ5a1F5b1l1V1JBcFtoeVtUajtBZT9Ra1F4X1lvZXZAaWtvdkZJbVZ4cz1fYz9Wclo/YFRPZVRfOkVSV2NFV29nT1tTbl1YbmF5c1l4WXlpeXV1SkF0akNZbGFWXFxLQjxCWnlZZl11ckdYQkFkW2N3SVNCPVNCaXF1d1d3XFxRdmxPV09RRzxNeEpTVDthdl5hdlp1dnI/d2JBd05tVFBtdE9pdG93SU9hdE5hZFdnZXdLWW5Bd3JBeXJdYkphZkNVZEJDU0JCOm9jRmlzR1l1eXFpdXV4aHdiQXdyPGdCRTtDdl9TUj9lRGtGW0NGO1NHR11Ybl1YSktSV3NYPWF5c3l2WVd3UGlnPVF1SkdzXnFjRVk7O0I+V1NDRVNTZWl0ZWhrR2hraXNVd0hDYVY8cVNBRUZgbXJDR2NDV0Rha1M+PUNjVVdlVWZIY0RGbVl4bWliP2diX2dmX0c8PUd4a0lYQXVSQVVUTVVUP2Q+Pzo7d2Q/Z2I/c0hxc0hdVVZdSWxLcD5gaj5EakM9a2NAVmRYb2VoVl4/bmhWeVpvZ1lxcUdoZVxcZ21ReGxRT2VUT1tBQGw6Pjo7VmpBV2NFV2tNWGxNR2djR3dvWXdRSXBnQkE9Q095dFF5ZmF3Zm1tSUZDQk9bU3NFWXNVeVpxR1dTR1I/ZVI/ZWNXVGFPVnVZZlphRlI+WjpIYj9Iclo/YXVWYXlQaW9RX3I+YXJvc1ZIYWdZdGlxdXdYZVBvZEBJeXZeWk4/YENHY0M/dVteXj5AbD5gaj5gbVZgZXhvaXhma0BXY0dnY2d3bVhAbEpAakpOakVGTEprTXheSXN1dXhoaW9ZdXF4ZXdUaXBXdG5BeGpBeFNTUFA/WHhzPUtiQFZYdXF4ZXVrYFA7cU9icHF0ZXhkdXJfTExZdE1pcG9ocGtXaE49SjpMVj91UkF1d1hpcXVNdW5IV2F5c1l4d3JkUXNEUVNgU2BUa0JAa2ptUUxEWlJ4Y1lwYWNRd2RxcHledFBxdEhZc0VZZ2dnZ09PZExPcmBgZFBvZGBhdl5BbVNIbWtvYVVKOjxKV2BWYG1WaFRVcGBTVVVVdXF5d1dhSFZgVUdlU0dxZGd0ZEhxbXd2TE5sRFhocXFuYFh0Y2lcXE9mXFxReF9Zb2tFWGtFT2NET2BrRmA7cVpASXRQcXRQb2RQb2VtcGZHTmJiSHFzSHFkUG9kSXI9eFpGblpdP3dKSW5PaXRPUWxMUGxOTls/WGZbRjo+dEtHZVNHbUdoa0dXZE1XdGNZdGFYd2RRd2RRV29ocG9obE9obHd0aXdVWW9Jd01pcj9pcm15dkl5Pl9CXWF1d0dnWW9Jd01ZbkF3S3F4QVdYYGFza0F4akFSQmNSPl1SQkdjQ0dVVE1VXFxbYkh3RXlreXJJeF1xY2lPeGpBeGJBWXQ/PDtCckN3VGloZXV0aXdVaUl3U2VDR2NjRXlkaVNYbHNTdWtzTz1AO0pqUVJSQVR0Pzo7SndxSk9cXEs6QjpbPT46O1BKOztydzo7QnE6O0JWeVZKXVRqc2dYZWlUZ0hlbVRbRVZbQ3Q7PTo7dEVfZ2ZfR1xcV0ZaW0hCTUdST2hsT2hhd1NZb0huW0hKY0U+Pjpbc05zRFFzeXBZdWldUmE/UmI9ZE49UDo+WjpYXz5wakBwYXVveGZgb2Zga2JBXkpHcjpKOjx0YXV4aGl1ZVVXZVVrQkBrWkxRQlxcVGpCOjx3VVBuXFxQbj5gaj5cXGpKaXF1dXhCcHM8ZExGSjpMeWBcXFBuXFxsSHVuXVxcalh4UXltVVhtVUhdV1I8b1pLOjx0YWR3dXBVVFVVVUVLeTxsPmRMRko6TFlBZW5MRXA9PVNSTHJJXFxOO2VKPUo6cHU/aGo/SFBSXFxrcHlqa0hwa2ByWDxTPFBLQEo6ZHFlYXBNaW5vaHBvTFBsTGxiQFBCTE9SPFo6QnRlUl9PVE1TRE1TSUddRnBBUkxbVGo7Wjo+blFGbltIbld2W1tGZlxcV2ZdV19lVl9DRnM9QG48SDo+YmlQcVdpdTxXbktBW3ZQXkNOX1JaOj5gbWl3VXlwXmBuXnBnWVBeakFiTF5kako6PmZgcXl3WXlXd1tbYmF1c1hnVE9lVGs9SUlrQmQ7XTpCalNyXnVSRUNiQUtkWk86PGpYZHZheXZ5SFltcWpDVUpcXHBLXkRSP1o6ZmFcXE9oQkZbbWF4Y1lkPG9bXkZiP1ZaOj46O2ZBZWloUVZbR3RiXWJGY1dhWHhtYFo6Plo6bm9KZ2VXZ2NhWHRBYWtTVnR4Zm52YHFWUGNfcGtUZmBEUGJbYHBJX3lySXhddnZtSGI/Vjo+amhJc0JBc15gbl5gaFZQaFtRcj92ZFF3dGF5c1lYY0VXY01mbERWWkFHTDtKOjx2eFo6QjppWUI7SURfVE1VVE07REo7dGtNU0htU0hLUmJhdkNZZGxPaGxnd01jZl9nZndjSXdDSVdrOztCVkFiOk9DQE1VVE1JbEtIbFNJdVNpTWF4RXdEaWtYdj1paGV1dGtDQE9COjxKOmxXPF1zS11OQXVSQV1VVEE6PGp5RExNRXJmbFV2QG1zVUo/ZEo/SG1tdFZsbU5GSjo8cUhEUE9WZl1zUm5eR15nZ2dnP15aWlFjaVs6XmhpeWFPT2JCP2NCb2dob19hdmZWSXheaHVoUHdkUXdaYWBYW1o/cENXY0VXYkJGeXJBeUJWW0VWXFxPSGZjUXRfWG5AZ2tcXEZmcVZhUllwYXdzS1heQT9hc1Z5SXdteGZbVW5gZlh1YWBcXE9mXFxFUGtEQGZZXjs+YFJBZl1OdU93ZFFXXFxvTm5Xb2JAb3JBeFtZbmxnVmVAP3VyP2BAblpAbl5gbl5XcWFfd2Zhd1pfWTs8SjpcXFNKRFFcXGhVSXV2bVFyTz1TOj46O0hBXVY/U2huRXdMTURDX3RjTWZcXE9mXFxnYj9nQltDWTpCOmlHQl9nWl1Yb2VYR2VTR1VJR11Vcj9YW3VyVWlVPEI6W1g/PXh3RWR0b0VCTWI9PVM6O1paeGQ+dmRqZm1IXl5jRl9jZmNZcGFXQHFyWjo+dkheWlE/YFRQbVRYdkF5a2l3aWJ3Z2l3W0FATDtaSllfPFhfUl54eXhaTEB2Sk48Plp0UWZKX2RqPnU7YF5fZl5fSG9Nd25MZl1BWjpeZTpAeURuYldnZVdhdVZhXVtedlpBVklGXjw6W3g/Q3hPW0N0eXc7X0ZyWjpOeWI/cE4/YGRRd2RBaEJGWzpKOnBRPEl2cFlST2hsT0h0S0l0Y0l3Y2lyP2lyT2hsT2h5ZWFSRE1TZG1zVkhRd0FZW0RtRm1UTE1UTGVUT2VQcXRQWWhRdW14SkhOPU15UUo6PHZzXUtAVHZnWXVxeGtYZFFkRE9jRE9kTE90SXlteU5laFFObExQTE4+cExoXFxVUnlrdTxNRFlzRVlPZVRPVTxNUlxcT1Y9cUpFVVNFbU95bHFNUFpQS2BgcXZgdUF5cmE8UXI8bUBVbkNRc0RRb2RQb3BZUUpQa0RQU3lxVVJRdExRbExQbEw9VEo9WG5Bd0tFU0NFc3dUWXBBcXNIcTtlTT08OktJXFxXdGN5SGltdW5peG9pc0dpc09LRExLVE5dVE51VFF1RFFzRGFlaFljWG9lWG9lcHdBSzpBVmpsUXY9eUpUTVVUVVBtVHBoVkVxTFVVVVV1VVl1dVltWXNpbllkVVtNeVlFcnZQWW9RcztJclt5ckl4TXloeXBZdURpbGVka0doa3VpdU9BcktJd25hcj53aXZJeEFxcXdXeXhReWV5b2JAb2JmXVdmXTxWeDo+Wjo+Wj14YkdnY0dRbF9WY1h2YXhfZ2hvZ2h5dmF1VXdISV1TRl1jYj9IWXVpeGVpd1V5cElzTXdGQWVjVGNYYGFzU3NEUXNkeGl4TXlzbUFWWHNJeF1XY0VXY19nZl95W1lyQVdmQXVjTFNVeD9GPj9zXk14XkdTTW9nV1VpcFF2P1ljbFF4bElDTWtGdm15dkllUkFTOj46PXh3WXlxVVhtVXhRd0dZbXlzeXZZR0NDQ0NIb2NIX0JQd0dCQ0ZXY0VXZ0l1bXhecXZgcUdWPWlKaXRPaVhBcWNXY3lleWZ5Y0RGeXZJeWVXX2VWX0tTZHJBeXJlUXdkcXhpbXJmTVBzTXheYW5eYE5sRG1mdVdpdXVWYXVGXVhWSjpAU0dpc0dxS0hsSz9pcj9JWGtFWGV4VGlwd3J1TllMVkNBc0JhdXdYWVFZcj1Zdk5Jb011WXZJeEF1UXQ9d0llSl1JdltJOmVSP0VTRE1TcFl2X2F3YFdmXVdYZXF0Z19zRmFzbXl2SVlEV2dCOj5qQkdiO0diQ0hrQ3hgaW91VkBgW09aS0lldFZeS0BjQXFrV1Zwb2hwV0lwXXdiQ0djQ1ZvaXZmc1BqQ2FzRmFrQkBrUnlwaXdleXFjXkl2RlZbRVZrP1drUEZ5dVl5cWBwbkBcXFdoOjtKSlRuYHBuYEJaQXZaQUh5bXl2TWZtX1hJX1JcXGNld1NRZVVXZUluPXVqUmVZZ1RzT1xcc2dYVXFgaj9oanFcXFdSQXJkWUtzXFxzT2l0b1BwbFB4Q1lsYVxcUkFEOjxrS0RMS0RUV2VVd3hWSXFNXFxYampUbltIblthd2ZhWWVxdGdMTUdwckxZS1Ntb1pNTExMTEZpc0dZeWtleU9BUlZlcXRldFZhdVZlU0dlT29kUG94a2lEbXJEWFxcQG9iQFc8TVI8VFU9SDpcXHdQYG1WYHV5eExAdVJBVVdjRVdTUG1UUHZVeEpxbVhwbVhvZFBvXFxvaE1wU21vWk1LRExLcnRZW1B4ZGhUZVBKPExKRFhrRVhVVVVVdUF5TERSO09dVE5dUkFydT46PGp1RW1VWG1NSHNeZVdnZXdaQXZabWxYPXlrWXZBXXdIWWp3XXhwaXdVSWpwVG5xQG5QeU1XYXldWFB1RG89YXNGYUtbXFxsV2htV3l4YkBvWWRMRmVXZ2VvRmBrRlRvaVBNckh2PXlqbVB5TERNU0RtVGZgZkFbPT5aWlllO0ZaO1ZgYW9zRndjSXdedD5bWnlfRm5aXVl1cXhnVXZgaF9mY2BsY0ZfY0ZmY19uU3dnaXd3eGBgdT5pakFmWVl5ZmdnZ2dnZVdnXW91QG9jSG9jUj9lUmh0TUhpdVloZ050WklxUFZrc25nQ0lbOj52UHZteGZpVFlwYXdjZl9nZnFzV1hhQ3BzPD55TnduTG92cXl1eXdmTEF5YXlzWWBdeFZ3XVhsUHBsUE5cXENgYmFYdFN4bV1RYlxcRmw+aXI/WV1VVl1TT3dWQHZ1VmFMSXduUXdkUXdYV29tSkZsSmdZcW9VT2RMT0JoUzw8SlBNc2ZtdXZIcWlkbkZETlRRdVRBTUZsSj9QUltEbEJleXJIa0x1b1JpVDthT1dNcU5lVVdlVT9lUl9sUHBsWFFxb1dtUXhsUVBtVFB1WXdpaHBxWmdnZ2d3XklvbUZeW0ZecW13dkhhdXNYaHVoXUdxdkRpbGVWd1Bpb21ZeG1ZeG5heEZIa0NIZk1fRDtCOjt2WFVial9kW0NDRD1kPmNGPltSXndVP3lpQFFEWElpdXVjPk1GZ3l1eXdFQUlpWnlVTUNWaHV1eGd5eXV5cXlZVW1oZkV5akl2PUloXXVySktSP2diP1dGQW1jZmdnZ2dYb2VYPz1DP21SQE1ZdE1ZYFtGXltjWXNJWHFyQHFyQkFzQm1VWG11O0lyW2dpQVd2QXljWVFpb1VHc0NJUz1USj1EW1t2YXl2QVFXQG90UHF0Uj9lUmNSP2VSdnF1UFNzPl1SPl1SP2VSQ1trak1zRFFzdmFxPlxcSj9kSmFsU1ZAU25NS1xcRG1SQG1SRWVcXE5hP0ZgZE5fZE5iPE9iQnBjO19uaXZleGBcXE5eXFxKZm08QGM/Zlo/Xm9YR15WaV9AVmpLeXJgP2VjVnZcXFF2XFxIb2NId2NJd3M+eFN3eElWalB3aW1xdFdpdmV2dFM+d2VpbFBwbF9fZng/ZXRgZmtYdGxoXFxBeFtZcml3VWlHZ2NHY0VhVVJpVDtBRj5fdl9pdmNhWHRxckdXRWt3YmRRd2RZZXBjV1RJaW11Zk1XZE1fZ2ZfZ0BvaktVbkBFc0VZc11cXGpOZVRPdXJJeE15QXhbWXJwUUtgYG5eYHJFWXNlUXhfWXNSRXk8QExUXXFyRXBReGxRVFM7TFVVVVVVTVVUTXNFWXNrWVlJV3NsT2hsP2tIQGJqQHNCQWNcXFheSkZnd1F5b2FpVUdydnd5eGltOmljQj52YT9lY1Z2YHF2QD9mQGh2ZXZ0R3ltYWduY0hva0F5Q1lwU1lwYHNNaWZeX2ZqUWU/c1JJWWJTP0lrTXZJeWV5c2V3U1lAP0RUU0lwXVdETVNET2hsT3h5c3l2WVhcXGFyQ09iPE9iWXdJeW1ocV9jSG9jaEVXY0VFWkFEQlFGXFxLRlBxdFBhQ1xcQWNET2N0RVlzRURSO2JSTFRMPUw8RVBrRFA+dUpbXFxrVVhtVVBsTFBMS0lPQmBKcUBrQT1LP11SPj1Md3l5Oj1tV1lxcVVTQ0VTS2RdS3BqSXZdeFBmP1FrO3h4PVF0P0hfXFxRVlFkX1NTRE9jRE9lVVRwXWF3TXBxWlBURTxMPFV0YHBTeEhZZXF3RklNTUlMPHVteGR2XFxcXGpwZFdUYXJnaExGcGxQcEw8PW9mYG9GRE5OUXRMUXZjSXdzRFdMYW5EUFtIb2NIP3VNZ3dEV0NdYkpBdnZ3d0w8Sjo8VmpIV2lcXFVkWXdleVdZcXFnUF9PdmxoV3hsUXhYeXF5Y3RRZ253eFM7Q1t3ZGlPdmFnU1VfU1s/VEpLUmNHV2M9Q1tHWW1xdltRZERTcktRd0ZTRVltQ3VcXHNNWXRtXFxPZlxcT2dkT0dUTVdtSnVMVU5xdFBxVFBtVGBQblxcUG5gZltbXnJkaWpPQzo8amlAa0VYa0l5bXl0UWI8T0JFU0NFa1dkeWlkVXRgUGl0T0lodDtpdFhhbnZoUkJkT2tdWEpVeWlFTm9Rdj9ZTz5AdGpIVj1BWEZxcnBpWWpkTUFFdHddeGJJbG5gcG5hc1NYUEtMUnFxd1dZcG9ocGd1TVZ0S3VUVV9IcGtIeGxpdkVBS1tIcW11dkRUS0VUVkFITmpkc0dpc2Zxa0Q8OjtpPGtoQWlmZl9nRlN1XVFyXl9ZW1d0Y1lCU0d0SGlldUNVd0NDT0NGXnlFak1CW1tWdz92eVNZVk1zRFFzeXV5XTt1VFF1VEFyOkFmYXdkbllGYVNzT1tDP09SY1l5SnF5QkNmTXNGSD1WeV1mX2dmV0Fpa1VGXltGPlNpbGNSWXVVeWdZdkF2UXdHWU1IUltjXFxRdlxcTUdPT2dcXE9mPD9ETG1UUG1Ja012PkljTXNGamd1altYdGN5Ykl0XT9DW2tkQElyZmVXZ2VycG1VOztCOjxpc0dpc3docXd4QHFyQF9vakdkSj9kWm91WG9jSG9nOlhmUWZfU09wPllyPVlqX3hsXmFpRGliQmZlcnZcXGJmXm95bU1HYnhgaUd5YkJGZVVXZV1eamJgZGR3dFFAdGJfcFRQbVRGYXNGYVBwZj5ReEtfXl9SY1l5cXl3d3VXeXNWSGFFeXNJeUtFR29kUXdkcUF3S1lma1l2QVlWTXlXWGFpY0l3Y0l3ZFF3ZG9mYG9mZE9nVENFU0N3XFxRdmxVd1BpZ3BZYz95aGZFdVxcV2dlV2ljVXRgY1l3ZXlZd0l5bWdWRWlsQ0lzQ0leW0ZeP2hqeGtJeFNZbVZXTVRMTVBgXXNSbFRZQU46PFpaP2RLb2RQb2BtVmB1dmhoYV1leGZxQG9kUG9sb3l4QWppd3VfSF4+cHJHaHlJaXdeRl1GbmJAb3JBXmpKQXlrWXZpd3V4aGF2P3lqcW9RV2RRblxcUE5gUl5bZmFaTHBxXUdxPEhddF5oYm9mYG9mWVl1SXBdd05ddVhmTXdeRFFzRHlkaGBlY0FhX15gbl5wTVdtc1d4YGlodlZ3YVl0YXhjd3dtaWdmX2dmQ0djQ3BvaHBnWXllPD5aOl5zQ1FzRFFmeT9wbndvU2I7S0doa0doeXVFc2ZHVWVwbXl2SXlgb2ZgQ0RLQ0R2VUZrQ0RZc3lUQ0ZeR2djSHJaPXRjYVh0ZG1ITU5NQEw8dVdYYXFraHBvaHdwPWxwXFxXSlF1Y1V0YEhwblROUHhrXFxkc1l4UXl5dXl1eV9leEBMbFZ4TFhsTVhxdFBxamlJV0lBWnZvY0l3Y2lhdkNZbHBxeHBpd0F5cjs+XUZxdkl5bVlBdEpBXFxLRlxcO0lzU3B5WUl5TWFbVGdxPGBxdm5oRUFeO0diO2l4ZXFkbU51VHh0aXhlWVl0UlZwcXBnV1FgbE5gZGFoT09oaUBlaEBmZml3Z2leX3JYdVJCaXNCQXNybXl2SUk8PXdLWWZBZXloa0V1aWdvZ2hvQXlrWXZgb05HaGtHSFF2VFc6PEppVVhxdVhJZEtHZFBsXmJuP1xcOk5pcWZmRGFsQ1ZcXGBeXXI+SEVXY0V2SmFHQ11EPm1EPF1WW0tEPz1VOj1TTk9GcltCdT1jQmVJWG9kdEF4W1lyUXdHWWR4ZlVNTnlrRGxSSG1TaHV4aGl1cU5xT2ZcXE9mcl5IZWRPZ2RwbFBwZDo/YjpvY0hvc1F4X1k/ZVdYU21peG9pc0NJczt1Q3lpOjtKOmx5Pk9eV3ZheF9haXZfSWlyP2lqTVdwdnljP1Z0c3llSWZcXEZHZEtHdHRoaGVhY0ZfY1Bvb1ZHc2Rhb3RZYFhea0F4akFfY0Zfc2xoZkVxXXdOaW5GaWxhdmhXdWZwZXdQcVlmYV1RXl5eXl5BeFtZcmhwb2hwbFBwbD5nZjpCOjtiO0FWRGFkY3NiSXNFWFlpcXVnPE9iPHdpeXdJbUl2d1V1VFF1ZFdnZUdoeVd1QVdJO0F0Y2F4VFF1VHF4YD1pXlVHZEtHVHdJeW1ZTVVUTWlpdXV4dElYZ0FYeW1yPUdETEtERFNDRVN0S0l0a19obl9DRltDVltJXWNoTmVUT0Vpc0dpd1F5ZXlncGtIcHNmSXVlYEtJSDtKOjxqcm1tWHBtaG1XaEVKO0RKUHF0UHlteXRZYE10TGVUT2VYa3lZX2huX2hYdk13R1ltcWR3SUV2bFVySkB0SkF0a1V2QElUY2B0QXRLWDx3ZVl3cVluQXBZSEhzZXROYXRsSkBsanBXV1FRcXVYcVl0YXhTaUhVbXBWRGFsY0xvZFBvPFFyPGl5ZUFYWmxZdkF5O2VuTHVteGRZdGV2RGlsQHBqQHRTSXVzPXlqSVRyQj1QOl53amd4ZGl0ckF5cllaQW5bYj9nYj9cXFdoWjpwYVtGbEJ3bkl3bXBGYGtGdXNYaGFIbEtIbGdob2dobVdobUhwa0hQblxcUGZhaGVsVnlwaXdlQXlqWHZDP15EUGtEeGl2SXhBd1BlWVFhdVZhVVBtVFBfZE5fWGFxc1dfaG5fSG1VWG1ZR1FtZ2pDRWBxY3NveVlpVDpNUjxNdmhpdXV3R1hdaXJLWF5BY3l3aXlrR3E7RFk7Q0NDQ0NTV2VVd3dZeXFZRVRLRUxTZT47QjpZZ3hnWXVxaGBlc1RrQj1HVFBtVEBJdmVZSTo7RVpnSGVtdFJJdVNpZXJDWFxccXZHWWVxcXdXWUZqQ0M/T1JTX0lzTVBxbXdyTFF0THBuVXREcVNATFlZXW5jVXRgaFNVcFBncG9ocE9lVE9lYG5eYGpfSHZ0RXhcXExOXFxMbmhwb2hdVl5dUkJxTVpieV1kUG9kbDtFRltiSkVSO0VCS0lVOjtWU19jRl9jWXdlWXddWXBhd09fZl5fZmBvZmB2alM6PVI6RVNDRXM6QXI6bVVYbUVBb3VAa3U/S1JCTVRMTWhVSVZlQUo6PEpaV2ZaP2ZKeXddd2A9eFpVeXdmQVs6Sjo8cldcXFRqPlo6Qmp1RWJASjpCOmlZWk9KOj5aOl51QU4/O1o6PmhZPm9aPzo7Slo7PlpxPT5aVj1cXHhPYGo+YEpweWpeYG5eRHBDPUo6PFQ7QVo6cHFUbmF2P3lwaXdVeWJGQF1rP3dKSV5cXFhwOj5yaUF4c1hvOndwRFdjRVdbRVZbQWFrU1ZyeEhFdmo/blpATlxcV0Y6O0Y+cXREa3JBeXJhc0Zhc3ZTWWhhZWlwX2NET2NUZWhkZUR1S0hSRVVTZXV2R1lNZ0V3c2tSXFxLQE1YbE1YPl1SPnl0aXhVRUxLRExrRVZjRVdjZT9nYj9nZE9nVD9lUl9zV1hhUV9kTl9sYmFrZml4XXlySXhqSXZdeHZpeGFxakBwSlBjX3B0UXl0ZVBvZFBnZE9nZEF3YkF1VFF1SFhdcW5nWnZ4O2d2RF5kZGZgZl5fZml5dXl4P1RbRVI7RUJDX1JMQXRKQVRRdVRZY0l0XXg8aWJFY0huW0hCb0NCcVVGa0pMTWRCQXNCcXhPP2JAb2JAV2I9V2I9c1JHSF1tYk9nZE9zc2lPQkdnY0c/dWQ7VEo9VDplZkxVV2VVV09hdE5hSG5bSG5naG9nZ2dnZ0dha0tIc3ZscWVpcWJAb2JcXE9mXFxPb2RQb0BwakBwakZeV3BjQXFkO1ZcXE1WXFx1V2l1Z19nZl9cXFhaPF51alhvPEhfZ2ZfR25bSG5nZVdndVd4YGlzckl4XUltcW5nY0dnY3BvaHBldkBpa2BwbmBgSEhdXFxiQndFeWtZWkF1W0FWUGVUT2V2aXl3eXV2SGllPFFyPEVUS0VUZ2NHZ2NSP2Vya1V2QGl5ckl4PU9TX29GX2NGV3dJeW1VTl1UTlFzRFFXeXF5d1lmQGVjXFxLSWlreUxNVExtQ1dLSW5hdkNZZGBvZmBjTkRNb2RQb2RRd2RRblxcUG5fZVZfdXdZeXFJQGtCQHhxeXhRQXRKQVV0YFhjcW13VFleXVZePWtIWWttTFFXcFl3UXlvWXBhdXNgcG5gUE4+YHBvaHBPaGxPeGpJdE1IQExkVE9lVFlrUXY/aXRleFRxeFdZcVFgXXNSaG9VdXB0VFF1VHhYcVZmUG9kUHdCSWxddHBpdXVoXFxPZlxcTE1UTE1hdE5hV1llSmxZeG1ZTE1UTGtoVFptc1ZIUXV5eGl5TXdMWW5EdHNFeFFQbVRQWWJBdFtAbVJAbVl4UXlNT2RMT2RAb2JAb2RQb1Q8TVJcXGxPaGxfeG5heFI/ZVI/XFxKPjxvZFBvdExRdGx3VXlwSUVSO0VqYmFxclRWajxNcXBXV1FLRExLREVTQ0VSQkRXY0VXY0BvYmBLVWxQRkROTm1VWG15ZGl0ZVh3UXlvdVhxdXhrWGRRVGlyP09tb0JEY2I8XVhePUhaXUNAU2I7QVZyTVl0TUhqZXZocXdIRWZKXUI/Y0JhcXNXV3VlVXZ1eXhpWUY+b0l4XXlCd1dAU1htVVhlVVdlXVl1YVZDP2diP2dRd2RRU2lhUXRQcXRwTXY+SUNTQ0VTQ0I7Q2JfV1NRb2JAb2JwW0huW1hkVVJhV3RNU0RNc1hoYXVjc0dpc1NgU2RRZWdUZVRQbVRAcXdaPXVxQVNGXUtwdXNiQHBqQFhDUWxfXFxOTERTU0VlYXhuYU9jRE9jUXFgR2ZbR3Z4aXl1WU9wXkdrOkRaU0dlU1lkYXRjb2hwb0hwdUJtVVhtVVRMTVRcXHV4Vj1FRmtSVl1VVkdjQ0dDPD1XVkFxSGFtc1RUSj1USmlwR2RsRGVLRExLVFRRcF1PPD1XTkFvS3VPWW1xXkFSamRNV2Rtb1l3UVlwdW1PZ2VXZ3VuSGVtPHFUO2hORUdbR2ZbZ19nZl93TnFqSHduYWZeX2Z3VGlwRUdiO0dqRm9eaUBla1B2dXl4aWF3SG5sU0htQ0BcXERASzt1d1NmTE9kTFtnZGNUTl1UVmloZXVUbE1YbGNlSHV3TnFma0doa1tJdltZc1F4X1FCPEtCTEtETHNiSXNFYEd0Yl13SGtodXV4aEVHY0NHcHVzP0dyWl1GXltGWnVWZltjWGNJdDtIajt4VXloaWVVVWFET2NEV1dJcW1zRmFzRkNGXl1XZl15XklzTWtDPlNFeFtZclFjT1NHcjtIXWtpTG9lWG9ZXXFyR2tCPUdyUE9DYD9mWj9SPl1SXj11amB0T2l0S0xSaWxVdkBWWHFNZDxteFVvZ2hvV3hReW1RPD1XQ1FsX0RRc05pZ3dlUXdkYWl3Z2lfaG5faGhuX2h4eGl5dW9wYFd2Rmc6a0ZgS2diP2dCVVNFdUI+W0JuZUdXUWlEcXNIcVhuXVg+PUNTQXVSYXRPaXRrZ0hVc1ZkO2U6QXI6RUI7Q0JdVVZdcWlmRW9jYXhBdFtqTmBsTlxcSj5cXEJOW0ROZnFvYEheZGpmaG9naHBwcHBAW1t2YkF3cnhgaUFgdFF5dHVReXRRY0I/Y2I/Z2JfbmBwbnBZZkhIcGtIcEF4W1lub2JAb2JpcF92ZmQ+bXF4Z1lRb2VYb0VPY0RvXXheaXJwcXhwcVFxeFl2YXhfZXJAaFtGaz5PcGpAcGJ2X2l2ZmVvYEhhZGp2XFxoXmVKXlxcTl5gbl5gdnhpeXFpUVF0Z1hveXh5eFlpTkFvS19mbEZ1WXl1eXhfZ3laPE5fUm5oWndnP1ZwX1dzUEZkS0dkdVZhdUhcXF1uYmJBd2Jhc1ZIYU1IaXU/b1pPeWFgcXZgdUJBc0JfYj5fdmRpdGVgX3dAYG1WYE13RGlEUXNESWdjR2dWTW1IQHNSZDtlQkFzQkVWW0VWXVNGXV91VmFVUG9VUktETEtGZltHdktWPkFjRFFzRG1IX1VWal1mPEd1dGdYZUtSYkV5bGl2eXNZeGF3dVlnVFNFVWNlVl9lSktSVXFoZ1VWWW1IQFN5ZTtlZE9nZEdkXXNSRENDQ0RLQ0RWY2lqeXF5dXlvWHBtWEBvYkB3XXlySUhVdEVWQ0VTQ0BqOkBKcGBzdWVXRklqRGx2WXhZeElNbFxcVkJIajtIUnBtWHBUU2lcXEtHZEtPdExRdHRLSXRbUFRjYFdEcUJUdltJZmV4ZXVReD1ubldXaG1XeHRpeGVJXFw8V29Rd29gV2dLVlpPXlt1XnBRP2ByeV1Fdl9mXl92QGlrUXZAaWtVZmI+X2JCX15MeE5JeWZJdW13RGlrVVpxSV1rSVFhdVZhV2l1V0llZkxVVl1VVlFtZ1ZFc0xZV3lFeV95ZF5hdl5lWXdleT9VY1BjdmBxdmxHR1tTaV9nZl9HSXNDSUd3RXlrSWtDSEt1U0l1Y193dGhnVXVveGNZdGF3ZXlzWVhdaGJFREdvUl1VVDxtWHVjWGRhdFNZaGF1eGl5dXl5dFl1WUM/Y0JfeHdpYj1tYkZDaWtVdkBxaXdVeUhhZXNTRE5bRD5xaT5fVz9VZktxRGdLVU53ZFF3eG5Jd01paGV1dGxfeFRVRl1TZl5hdl5VVl1VVkF1UkFhd2Zhd3h3aUpPU19vaHBvaFxcW2JsT1BrcExRaEt4XFxZckFwckV4XFxVTE1UbF5gbl5UUj1VUlBwVWV1V2l1eXRpeGVRcXRQUVVUTVVsd3d0VWpRcj9YS2FsU1ZAdXNYWGFpbXV0WFJNUUFVVUI9U2I8UXI8eVJJcF11ZHNQdl1Zdj1xcT5AamdAeGlAZkhgXXNOYltAZHBnd1RpandeZW1wZkdwa0hwW3ZfYmp3dlxcUXZsUXlvWXdVeGBpT21VWG1xWXZfUXhsUXhScVtGVmdlV2doX3l4UV9lVl9tSHBrSGRPU1lbSXI9dHlHaD9xRkltZXZld1RpaHI/aXJnd1V5aF1xRUlXQlhjSXRdaG11dkhpVGVvVHNReXRxeF1pdl5LRGNBdFtXUkhxc0hZSXBdd3JNeF5JQ2hJeHI7ckdpc2drR2hrd1RpaGVVVGBfU2N5ckVpVl9lVl1LRlxcW0ZfY0ZnZ2dnV1dlVVdrdWNBcVdPZVRPbXRQcXRSWWlieXVTR3dda1JGP0NFU0NFUXNEUVVrT1Y/a3drQUlaSXVtd1ZobVdoVVNRb0d3S1luQVd5cWdrW3VzV1hhcXRnV1V3ZVl3dXdYaWlFV1l2O3I7O0lRPUhzSXlzeWRoY21rVXZAZVZfZVZmTWtaQF5Jd2NJeXZJeW1BaXI/SXZ1dl94b2xKQGxqR3lsaXY9dlpIPmVVV2VxWXFNZmhvZ3h1eXhpeWl0YXhDWF1BeXByPmlqQWZTR2VTX2ZeX25WYG1Wd3F1RmhqP2hSaXBld3RpeXF5cWtXd3E9aWJUWG1VeHBmR3VcXE9mXFxPXFxWXl1WeXdIP2NeTnRfWGNRYGtHaGtXZ2VXR3Fod2JOT2NET3NpeXF5cXdjSXdjQXZaQXRpcWNOX0Q/aGo/aGl3VXlvRXdLWU5zcmZdZWs9d0pJZjxRaktETEtMa0RWeVdJc05Jb013Y1dQYU9uXVhuXVNGXUNYZnBuW2JnZ2dnaG9naFduYGY/dVl4aXhJYUpIXkxOWj1WWmFmY1RgcHdXeXBvZ3ZJXkE+aGhAZkhwXXdOX1o+XkpxcT1uWj1od0BIeGxReDx5aFhfaUVwY2F4Z1dRcW8/d0pJblhwbVhYWmZRZ1xcYXJDcHNIcXNBcWtXVl9nZl8/aV5VdmZeb2Zgb2V2QGlrV3lwaXdmcHdzdndkQXY7WWpkUG9keHF3cXhVbl87QWFgPl9iPndFeWxpRmI7R2I8T2I8V1pjeWJSP2VyPl9iPl9xdmBxYXlzWXhyZ2ZdQVpAVmpraGdVcWBvZ2hvSWp5V29GaF11bmhXUXFvP3VPWV86dltmTmU6PlpaPlpDU0pjRGhDdXJTRnVTSXVhdXNXWGhrR2hTRkFtY1Y7VlFVZXFzV3BjSG9jeWd5aFlRZVVXZWtFc0BJRVFrR1Y9c0NJc3NTWXBhR0V1cklVaVxcP1Ric3ZIaWVlY0dnY0NCO0M6WUdVO3ZSW2VlO2VbWXJBV1lyPVlud3c6R3JCS0NES1lzRVlHTWVuQ0N1a1lGa0JiaXJFd0RjRVdjVXlxeXdZO3ZQWUNdaXdnaXVWYXV2O2RZT3hWd0RSO0ViQ0ZbQ2h1dXA9dHdkPXNKSE5YcG1YeE9ZbXFeUW5XQVBSaXI9WXhgaXNleXVLWWxIbW5JdW1oRVdjRVlsYXZDbUo9SFBqcXVyVE5jRE9jRF9McXF3V3lAYFtTTmBqcXVweXdZeWtKTnl3eXhZeVpYaVxcQUFmVW93d1hpcXFbdlhfbEZtZll3ZVl5X1lzUUBrQkBrO3h4QEldRm5aXWFyQ1hcXG1uZkZBcGpAcFI+aWlvXmBuXkVvbGZGYW1vdkZXZE1XdDpZaT1ebT5YaD9WcGdXdXBwZ0lHaVNXcXBnX3BYaUB2dVNJeGFAcGpAYGNHZ2NpZkVxbFtRdFVwb2hwd2ZIZW1AcEVJcnJQYmVXZ2VfYj5fclxcaXJFaGZfZ2ZrR3dqZ3hkZUI/Y0JZYkFzQ2pFd0dXQkxLRExLU0VVU3FjV1RhYlF1YlVvSGdNR2ZbR3ZVeGBpQ1hlRWxXVVI9VVI/ZVI/RWV3Rmp3eD5VUj1VVlhhaXNdVW5PQ0pJd25BaGo/SHVVWXVlRl9jRlZNSVZ3SXltaUhvY0g9VVJcXFV0VXY6YGxOZlo/ZlpycW88ZnhvaXhWT2k8P115VnZvSGhzRmlYVmo7QWtGYGtWWGFxQ2I7R0J3VFlvaHBvaFNDRVNzVXhfWTtZZz1taEQ9U0I9Z2RPZzxxYjpDcj8/ZVI/dUZJZW1DaWJ5QmJdVE5dZD5fYj5hd1NZaGtRd2ptc1ZHSVxcS0ZcXENUS0VUcmVYQnFXW0l2W1loYXVzQGlWQVtDQHF0UHFIaXNHSWdmRU9kQltkTE9kTE1VVE1jXVFHOj9EbG9ocG9ZbkF3S1VTRVVDSGdZbHdTTl1UTj9jQj9zVklxXFxpdFthbkNVbE5cXExOPHFoYVZaPEpPXFxLUUh5eGl5dWRsRGVyX3V1Y1VxY1l0YVhOPkBxX3lOck1YbE1QcDxNUWxrd01VUj1VXm1WYG1QblxcUFpBdWFUeV50TmFUbVNIbUNUS0VUdk9JbnJAcXJBcWtnXmF2Xl1pdFtWZU93ZFF3dl9pdmtYZk8+dlBoXjpodlZIYF1vWkhoaVRPZVRvdE9pdF9fZl4/dlJ5XnVhXmF2XklYXXFuY1ZfZVZ2b0hGX05Oaz9oaj9Zb1F3b2pRd0o+aEBeZGpeZWBAcXJAXVtebmNIb0NYZllAZWlnYj9nYnJueENVa0VYa19hcm55eHFiQkZmcVlhPnFsZ0F2UV9kTl9qdWlbVGZgb2Zgc0B3PT5qanFlP150TmF0Yl5cXER2cGZGakxQbExGaGtHaHZ3d1xcdmpXUWJldl9pdltBcWFTeW5yQHFSVl1qaV1Bb2JAb2JZb3F2R25NSXdycWhFPnVETl9Sbl9NT2RMT2pKTmRLR2Q7SXBJR1xcS0ZcXGNHZ2Nfb2FJcmlgbl5gWll5cElweXVgYXNhaUM+aEtZdUE/aWlQWk5OWz9HYjtHalVvbDpHaGtHcGRQb2RucXdPZlFgZlFvZFBPdlVpX1VAcF1HW2I+X2I+dGJfcHRReXRfaXVoWmZnWk9eW1FIb2VYbz0/W0NHY0NHdlVpb0Zga0Z2cEZOd093ZFF3ckh4cElAXFxcXFFrXz5iXUh0eG95dklzSGheSldkTVdqaXdtZk9iZlFfSnFpanFnOnhcXGtxWz5WYVBHWmZpd2pXcz9BYWZZZTx2YXlveT55cFU/clA/ZDtBaFNuYFdPeHQ+bFtGbnJ2a0dHZ3NAd2xPZnhvYmZRX2pOZj5Ba3NZeGFZa0VYa113cF1JXkRebzw+WlpealpReGBLbk9gU2BdV2ZdR19oRD5aOk5ianhbQEI6O0I6c0g8T0NAPlo6PmhZPk88Sjo+UkRyOj5aUF5pdkF5a3F0Z1hlVlFoU3FbOl5hRk5fUj46S3lkT2ZcXE9WbkF3S1lzUGdHXWt4VF1GOlxcSk9cXDtodVF4T1k9cHd4T2l4VXlwTnRUSzpcXHlITE9SPEo6PFpacWFKR3I6Plo6Plo6WHk6Z1o9Plo6Plo6bnc9ZlxcRj46PEpWeUpkPE06Pjo7QUI6Oz5KOnRocXFuQGlrUXhMeXN5c3luXWVMYXROYURMS0RsQXdLWWZIV0R5dXl3eXhrV1ZBUVhwS0VhW2hvZ2hTTVVUbXRReXRxd1NjXVdmXVJCY1dTUWg/TVRMTWh3TWY8T2I8dWY/S3Jta0l4XXliYXdmYXVrTVM7RWpkUXdkcVN5aXVIbEtIVFlwYXdbYVdubEtDXFxLRlxccWtVdkB1cmNkcj9pcklsTXY8U0dlU2dBUWtcXE5eXFxyPmFyPlhwS0FKOlxcUUJMT1JcXHVGYE1zTHRJeXNpWHQ+UWxMUGxMUnVZUj9jQj9HVF1vUmttSFFzYko9R05jU0dlc2V1dGhnWFRvZVV0cF1Zckd3Z2BBZmJua1RuYGY/ZT9nYj95cGl3dXRmY3l3eGhpZUF5akF4W1ludlpbbW5mRlhxdVhpYUhrR2lzR2lcXE9mXFxneVtPX2ROb2JGQF07SXVWP1o6blVJVF5bdWY7VWo/UkZdU0ZHWVVTSXVTSTtDQlhnZ1RzRGlrVVZZV1VzUkF1UkhbRltbQkNfUmw9WGo9VlhxUkhtU2htdkZJZVZHcz1JWU13RkltVE1VVF1tdUBxc0hxY0ZocllVUU5MSz9UeT09VEo9bFJhXjpeZXZpZGw+dUJQa0Rwc1l4YVlIaVVwcWZXdnN4dGZJVUVVU0VVYGNDTl9kTm9udGRsXUVZcnRvUVF5ZkV2PGlqdlxccV9ZTk1Ic3BxeHBhc1VBWHVFS3VMWF5Bc1ltWXNpakZtTmloVXVwbGJhTzo8eHU8b1o9eD5heVVJVUNFYz9oaj92cjxBaFhAblpAbmdob2dWbEBWW1FuX2Z3eUNWc01wXkY/bVpobl9ocl5IWnF4Z3lYaU9Zd2Q+cmdpXmZAblpAdnV5eGlZZ2RPZ3BuZ1ZBY25vXFw6OmtlYGlzVXdGaGtHWFl0bW94cHF4dmdpd3FSQmNHU01oPkdzbV9JeWd5YENkQl1TcE1SYjtHYltzUkdIPVdkcz1JaU10XkdTRm1DXkN4QEVDRUVmSl1GXltGQm9TO05fUl5la3ZhSmByVXlqSkBgbXZmSGFkSj9kYnF4Y2ZiP2dyY1d0YEhocnZbYUlgY1B0cld5Zj5fRkZtRkNnS1VOWXRtX0lZTXI8O0JyQ0NkO0VWZ3huaUVnT2dkT3NnWXlJWXk8PVI6aG1XbmdZUHZHeHVZaXFsVmBtVnROYXRmcXhjbmFTcWlxYXhwRnleYGo/PlpqX1tOP2ByVm15dml4d3JbeWNUSWFyPmFqZ3hfPl13d3RNcW9gbmFTcUljRUJNVE5dVF5JeT09U1JHY01zRnBVVT1JeEZFQ1VNVVRNRVlzRUl1Zk1JY0hLQjpzaV1ZY2dNR2FDY0I/Y0ZZZXFzZ2VhWHg9ST5fYms/aGo/VExNVGRhSEtFVEtFWHRheGNhUj5JRjp1aG9PZVdnZVdzV2Z1aXVldE1lQ0FZRV9bV1dlTV1VVl1JT01tbmZpdXV4bGJhTzo6WXd0aVNnR2djR0ljTXReS1I8QVhYY2I8RXd0R0JdeWVneUg8PXNWYXV2V3dIPUNYQXV4dXhLdXRxU3NtY0ZmbVNIbVNfZVZfS1JiSXNNd0Y+dVY7O2JZSVI/U2J5R1ltcXZvTUlKX1ZpdVdJTUZLP2NEWXJzZVVxPUlraHdxRGs+TVVyQFhbdXJjTGtEUGt2aFlbZFlhZFVlPVFYSE9bRU1GbmN5P1o6Pms8ZlxcRm55Pl9iPm9cXGY+ZUpJaERWeGVfa3N3c05Jb01nZE9nZFV5XWxZdXBZXW9Hb1JBeVtRYnRxa3RwW0lfc1FnXmY+WjpYYFpQaltXa0h4dVFRdVR1PkdDTTtDRlNyc11WbENpXXFCRnF0UHFkaW9oWUFDW1NYbVV4SFdyXFw/eFtxeHVXdlVtdj1RRFA7QjpJQkpFcmpnclZJaW1VdUlbRmdLVW4/Y2lvQ1tDVnRrRUJNdj1pd3F1clRrU0NFU0N3Q2lPRnBTSG1TV1lrZVJ3Q0U9VTo7QkE7Uj9TclBLcjxRclBxdFBBdVlheW1lREx1Uk1vRkdNckhhYko9VEo9dkl5dVlpd29VRXlnRTxNcm5dSUpfckFnRmY7SkE8Uj9Ucmg8dXFwcFhwbVhBcWtVdkJwczw9anBZU2RlV2dlV3NtWVpMdWhlU1ZAUUtUUUpgcnFYdWldd0dYeGdFS0U8Slp1UGJAVlJpckRRc0RNU0RNa0NBS2VhUUlUdXNhcnFYRVVmYGVET2NEeFtJPl9iUz9IW01icG9QeGhPW0VKOlxcd0BpVllhTz9lUj9FdVNJdVxcTE5cXFROQW1rZnFYYll1O1lSUj1VUnFyQHFqeXRLW0RWRmFzRnFySGhNRXlOPUR0cFVzS0l0S3BTYVh4Qz9tdVBeS0BjRXBcXGdObW9WZ1BGdDs/WjpecUNYZ3hYZWNhaHRYcXVYcT1Yaj1nY0dnY3RPaXRBd0tZbl1QblxcQGtIZnR3YGxOYGxnVmVwQG1UUG14PmlqQXJQcXRwb3hmSXU7SGo7aGhvZ2g+d3ZcXEFcXHRmbXh3dkhpbV9WY1BAXVVWXWFnZl9neWxZc2lWY1BgX0NmO0V5YV15Rk9nZHRySGhNVUhQXW1qTVhsTWlwZXV0QHFrV1R3aHF3WEhtU0hTbm1PSElTSXVTcXVYcXVNdWxYZj1Yaj14ZGl0ZXhWRkFta113UklwZFBfPnd2PD5aamFcXGhIb1pvaXlpeXFZa1F2X0B3YkF3X1RfcEJpdE9peDpJaj1ua0hwa1liWUNjSGl4eUt3ZVl3UXdHWW1JW01yPldlcXNXZFdnZXdIb2NIQ1VTRXV0T2l0cz1Zcj13Y0l3V0lpbXViYkFiZnViT3NkRXVkaGNZdXF4Z09lVE9VXVVOX2VmY0ZfY1ZrUGZfVHZheF9pSG9jSEZ0O0Z1aFF0X1hjdE9pdFdpcXF3Z0dnY0dsSkBsYmdnZ2dkUG9keGBoY1F0Ykl0XXhgaW91VmF0TmFibj9icFFnZl9ndml4UXllR2djR3dfV09xXmBvZmBzWj9gPmlyP1llVE9lcHF3V1lvaXhveWd2RGlcXFxcWFpIXmR1cV1vbnFXaXBAPnJaSXJXVl9bV2htY2l1dXhnUkVvRENZa0FxbmZkVXQ+b2JAb3l4cXlGcDtRYWRYb2VYbXRmaGQ/Z2I/b3lsRGVuQG1SQE1LQ0RLU1F1VHFOX2ROX3BuYHBrVkRRTElzQ0l3bklnQ3BrQ3FiQ0ZbQ1ZsYGZjdEl4XXliPl9iPm9lWG91S1heQT9cXDxXaXFxd0dZc0VZUWlpVU1UTE1WYG1WUG9lWG9Tbl1TcEt4cHF4WHVpeGV5XklLeT15aklOeGxReG1zVkhRTFBsTEh0S0l0Tk1PT1l0TVl4XFxpckVwVFBtVEdpc0dhUkFhVlFwakBwSkVUS0VYV1Fxb1c8UWo9bmpAcGpMUXRMVVhtVXhNeW5Jd2tJeGtJTVNETWBtVmBVV1BhbztxUU9cXHVFQXVSQU11RFJ1WHRqWHM6PEpIWXZIUEtgbE9obG9gcG5gWHZTRGw8UXI8cVZgbVZbSXZbaW9naG8+bEplQVdTUXBfRVFzRFFJeE15bHhuYXhOdExRdHdyYWxDSGtDXVNGXWttWHBtcWtXVFFYdFF4XXVNdUtrRVhrZUo/ZEpmeVNEcUw/aXI/cXBwcHB0cnFzV1hBdVJBdW5dRTxzYkZtRnVLSXRraXNVeEBtU0hQaj9US2RNV2Q9bW5ZeGRpdGV4b1l1cWx4UWlseWhxdXdYd11Zdm1oZmdGPF1iW0dmW3VyYV9mX2dmSXNFeFtZeXF5d0F5ckF5Z1NVcF94TllSWG1VWGByPm13d1xcdXBQV09Rb25heG55cXlxeXVBdjtZaldwU01VUGxMUERQa0RQdWpIVj1xcXdVeVxcVE5dVFlkSXZfWXNRSHlzSXlmdUt0PEo9bWpGRHNIcXNISXNDSXVxeFdZVFF0eUtHZEtnXVdmXVZBdXNWRU55dFFZeHNpWXlXdExRdFJfUFRDcFM7aVBSVW9aTW1UUG1sVFBtVFVUTVVqeGpOTU9vWXJBeEtmPVNPSXVVeXBpRUw8TXVUUXVXdE5kQXdiYXRReXRJTGw9RFNJdE14XFx5dXl3eXhTV1BRb2RYZGF0aFVNSj1PTlhTUXBPU0xNVGx5cFl1aWVXZ2VXV3FwQ2xLSGx0TmF0bmxQcGx4cHF4eGF4Y1lMdVR4XFx5c1VZdXVIbltITlxcTE48bVNIbW9VcUpkUG9keEtYXFxRYkRPY0RLQjxLWk10SWlrVXRQbmVYb0VwP0BQQm15bVV5XFxIcXNIWWFxc1dwVmBtVjtFUjtlUUc8VmJ1VmF1dmNJd3NFeWxpdm5gcG5wV1VcXFZgbVZIXW1yRFQ7RVJbZXZEaWxLRVRLVWphUFFpWWtSQXVSQXRKQXQ6QGo6cG1IZXVfVGxDeXZJeW1ZZFBkXWx1WHF1ZGtAVXdwaHNPWV9kQXdiQWZ5WXk9cHhSWG4+YGo+SGo7SFpVUGFxT2hsT2xPaGxvcHBwcHFwZ3dUdnlWYGFRcV91VmF1T3NOSF9WT3FEPnZcXFF2P1lrVE9lVFdqdmdcXFJeYVI/b1o/XUZuclBpb1VXYj1XYkdnQ1FyPFFyZ1l1cXd1eGdZdUF4W1lyWG1VWF13RXliQ1lzRVlSQkNjRE9jcF1lQmdJZmtHaGtWcWF1dVFGcjtJUnVSQXVWd1F5b2FTVEFDQ0NDV1tJcj1IZVNHZWl4ZXl0Rk1lX2VWX0V5ckF5RlNFcFtDdUFEXXV3dz1kdUl5bXl2R1dFcVB5ZXlvdExRdFxcU1Roa1JEUFxcRXdMaW5bRE5bZFFPQVhnQXA/QFB2PXlqbVdTVWxZdFF4XVNfUFR3ZVl3RW1ZcE1rWFlxcVdrRFBrWHNReE9tRFdNRVVTRVl3UXlvVU1VVE1PZExPaGxldFR4ZFl0YWxlbFlMcEpBdEplSG9jSHF0UHFsRFddPE5aPHZdWXZtSXlteXZyQHFybE5HQXB5aVk9VVI9bU9ncHZBPG9zSHFzTFF0TFlPUW9PTVNETVNSRU9NdVVZdVNuPU9IUG9kUG88cVQ7ZFZfZVZ4YU9fPXl2ZUxiWVFQTE9SQGtCQGs/VEtQPFlzRVl3XXlySXREUXNEaXRPaXRLSXRrcXl3WXlrSHBrYHdFeWpjcG9ocFJ3XFxUajx1TV1qdW14ZklVWW1qSHVVakBWO0BsSkB0bXhWSVF5THlOcElOUHl0UXlyeFxccll4UXltcl1ET1VdTmBsXmZfZ2ZZc1NIWkhuW0hmXFxPZlxcaXl1eXh3XXdzV3B0XmF1VmF1O2heX3dsUkF1UkdnY0d3WHdqaFdsSkBsamBwbmB3XVE/XVROXVV5b1l3bXRmR1VUTVVUbVdobVdrSXhrWWJzQUJNWXRhd1NnZ2dnZ0I/Y0JTd0hVV0hhbWNiP2diU1NlP0JxZVRtQUlkTVdkTXJERUU/ZVI/XWdOR3lrWXZBQ3RbP0lkV1Zvc2lraGt2PVk6SG9NUU9qPFd5QEpDUFI8cXFNdHhmSXVNWXdTbFhobF88Tlo8TmtFWGtBeFtZbmlkYXRjeFVxWWVnZ2dndWpHVj1RZW9TV2ZfZ2ZPaXB3WGxNWERRc0RRd0VJZVVHZltHZkVvRGdLeXJJeF1BaFtVcnRnV1plVl9lRE1TRE1nZE9nSHY9eWpxeENvaXhvaUFzQ1hbaXJFeFxceWd5b3lUaXdlb0ZIXWVic0dpc1diPVdSS0VUS3VlbWI7P2ZNSXdzSXlzYUREY2ZNeXdpTUVHb1JgU2R1Y2RvY2dnZ2dcXFF2XFxRQ0RLQ1dVeWNTR2VTVmxpQz9FZkpdR2ZbT2NFVz9gaj5gdmF5dnF4dW5tSlFUYldOZVhvZVhpZ2RwcXJJeF15YlNHZVNAajpAYkFZWmJeW0BWbm9ocG9YdFxcR3JgTl9jRl9DSGtDaGhVaWQ/Z0JhVmFJSVNfU1BvZFBveV95ZFltVXY/WUt5aWJndXRBeFtZckJHRF1bZE9nZHVjVENpWVFNVVRNdVJBbU1BdGdlV2dlV25NUXdYdEBlcWdob0dIclpdWHVYcGRIbltIbm5gcE5Ic1ZtakdUTXBAV0tRTnl0UXlYVkFXdXNYaGF3eVxccGhFeXVZeWlZcXF3T3F0UHF3WWlzVmo7QXl0aXhlYG1WYG1OYGxOd3JjYWRkZmhCQWxbZm14dmQ/aEo/ZEo/ZFxcT2ZcXHV0eE1zRVlzU193aT1mSj1HTXVmSGV0UXl0SWtDSGtWbGlYS3lJQHFyQGFUZGNoVWFUVz9WWUd2WFVXb1tiSmNjQFV5eGl5dV9pdl95SkdGPU15UlN2ZXl0aV9TZGFUY0VXY1VJdVNpSXVleGNocG9oYHNGYXN4a3dzeD9XY0VXS2tEUGt3dHlJcjtSb2NIb3NJeF15SnVUUXV3XVV5QHFyQHl3WXlpbUNXWndmYXdockV4XFxZZkFkUXI9eFpxeXdZeWtBc3J5TVF4T1lvZ1dRYWdmX2deaWlJWkxPZExPXl5eXk5ZdGtoeGhAbWlnWkJhZmxhbGNWZFB2X1hfd15hdl5WXl1Wak1vYmhZbEtIbGtJdj15al9Xc1BIcGpObldoTXVGY0NHc3V3WGlJbnl1O29UX19mXj9JbWVial9obl9IPD1nd2F5VVtDcG1pVXVnVV9FXVNGXU91VFFVcGlWPT1Db29ocG9VeF9ZU21VWG1VUG1UcFd2bmFlVl9FU0VVU3FTWXV1c0VZc01FVEtFTXdGSW13VHlTZl1XZlNkWUVlPXFiR1Nobl9oTmtEUGtyZWtYYUtXZE1Xd2NlPll0ZXdzWWxZcGF3U3BsUHBsSkBsSlV5PnlteXRZYHl2YVlvY0hvb11PUE1tVFBteHBZd1FXZE1XZEhuW0h0Z3VUaXBVd1BWTEVyYll3ZXl4dF1KZHh1Rl1TRk15V3VMQHFyQHFMTlxcTG5NbzpMU0VVU2VRd2RheG5naFRAdUpBdFpHZ2NHdW9YbHZheXZvXmFOaWVOX2Ruc1NYQF9obl94bVl4ZXlVQnFVb1VlZHdHYmFYdGl2RXlkQW9DV0tJZF10Ym9jTXlXV1FpT2l4bWVYdXF4Z3FlQE9HeEV4XFxpQk1XRkBPeXRReU11ZkhoWVU8cD1Qa0RQU2lYWUtRdVRRdWh5dXl4VVVVVWVtV2htUVxcXXJCXFx1bVxcVXRgWGN4bkRsUko9VGpNeF5Jc1BsTFBkdl9pdl9pZmt3bW9OYkJ3ZVl3aV5Bc0tgd2JJcUlQW0ROW1hmYXRfdE1ZcEROW0RWeGBpc1VYYXFvd0tZbkFHdU4+ZkRhbGNmeXhJXT1YW2BZZTtWWj1WamNZVFl0YGdTXXl2bGl2eT1IUltDQFNiW0l3Y0lzYlllT1dHUU13ZFF3cGlmX1F0X1dTQW1jVkN1UW9kcXl3WXlSQmNZdkF5a3dmQFNlcXNXQD1DX2NGX2NYVj9pZ1V1cFtiSnl1eXV5V1l0ZV9zR2lzZ2dnZ1d5TDtWWmFET2NEUWlnVXV0Y00+d0xpcGtNTXNFWXNjXFxcXF13ckhoaFVJa01YbE13dHlBXj1XYj1ZakF2W3g/eWpJWmVXeFF5ZXlHXj5QeG1ZeGtpc2lYb2VYeWV5b3lweHVpdkNHY0M/W1tAeGpBeEhYXFxNT2RMP1xcPEdga1JBSWNRdWdYZVJCY1ZhdVZxYXRPcXJHV0V1b0c+U0I9U2JwaWJaZVZfZUhvTXdOcVlBZXdQa0hWYVU+XWp4dXhqeFhpcXVbVFJAYFBuXFxQbl1tYnF2YHFuXmBuTklvX2FvU1VwQHFrV1R1Z3VOW0VWW2VVWVlxdmBxdnFwZ1V1WGVxdGV0VFF1REFWajxwdGxxYXhrSnVxW2VUS0FSdD10TmF0Vm1xdkVZYUhrUklzW2VNYWB0UHF0RExLREx5dFF5cFV1Q1F1b1hXdXBPO0hWPXFaclBbblF5b0d0eW5iQG9iSHFzSGlxcFZyeGZ0QkZuWHB5TXZaYlh3aGhdO0diO2laRW5cXFZncXRncGxQcExWZ113ZmF3YHhfeXJfaWFZa1dfdnlfeXJJaHZXcV9ndD15SnFnWTtCY0NHY2dEZWtUdkNZbGFCVWVCUltDQGNiPEV3Y1lGTnlXW0NGWztDW09kTE9EdlVpX2V0bGdWRVFZV2VCOk1ZdE15R1dFcTtFRmtCRXlYTztjSXdjWU9IX01DZXdnVDtGX2VWX11iSkVSO0hLTWxObnhTPnFZY3hYdElqRV1sc1hYYXFSPl1SPmxKQExTQj1TakRXcFV5cGl3cHBgV3Fdbld3PkFyOkFyQ0lzQ0l0S0l0UkF1UnZxUmB3bG5oZkFlc0dpc1ldcUJwb2hwX3NVbXlveXRZTUl0S0lXb0dwa3dDb2VYb3VsaXZFSWlcXEVGUkVVU0V5dVl5QWdiP0dJdVNJbUNXUD1VUj15XFxpckVnVXVvWG9RdVtfZl5UVVVVVUF1UkFJdW14Vm14V0FZTUhwdkhpbXVVeXBpd1RQbVRsdnVBU2hxdXdYU11IdHRRcEQ8d2VZd2lUVXBgV2poeWl5cFl4ajtxcXdFalJESjtESmVUT2V0UkFXeGF5c2lZeWs+W1hPcm9Xbzpud3J0RDtEPGdoRGtmaj9oallzUWx4aGl1RXFubmRRO1FLUXhPWW1xbl1tUmhsT2hOZVRPVXl3XXR4clFYbVVYdXBZd1F5W1hSQXBrV1RRUFlUVVBrRFBrPXlqSXRzUkhQPUhzSHl2O0l5Z2h1ZUxLP1BwX1VjeG5heEZ4a0l4V3FdWlZyPndiQXdhc094XmFzU1hgRllpTWl0T2lla1BmP3ZoZ15qQ1lsYXZrU1ZgYEF2O1lqcHBwcGBjZEB1d1ZpcEFkYl5sR1ZdcF54TkFiPE9iPHFzSHFrVXZxb3hwaGd1dEd3TGluPXY6W1N4eVllVVdlZVl3ZVlha1NWP0lwXXdScWVUYUNXS0lOSXVTSWV1b3lxSVg+bUZNZ0dnY0dRXWdSRUhpbXV2b3g7W0lzUVN1UUdqU1dQYUdLQ0RLS2ZdQUQ6V2N4RWlLa2NvT0s8TVI8TFJCWHh1QVZgeFNZcE9dVE5tYXlzWXhweU1paHZfaXZjRVdjbXNIcXM9YHZweHBdeFJJcFhvZVh3RFhcXGFqUHBsUHVwUVxcbFBlVE9FVVVVVVF5dFFZUFNsbHFBc0tYTlRMTVRcXFV0TFVzeGpBeHJnWXVxaHdnaXdZYFFzTVZcXE1WTGlwO01WXFxNdmxpdkV5ckZuZk1xbkdfY3RJdXV4aGlJeW15dmtpYVNwaz0+Y15OdFNZcGF3bkl3bWh3Z2l3XVBib2VHXFw9RUZrYll3ZVl5VXlleU87REo7dE1JSTpVVGFvU2dbR2ZbRV55aGZjd0NHaGtHaHVXaXVJeF15cm9faG5vWGZBdUtpaDtlV2dlR3BlRlQ9WXI9WUlVUmBhRXI7WDplVVdlZWVxeXFJWE5nZVdnc3Y9UzxrdXBDVjxhQmRjZERxaU1lZUBzSXl1WXltd1dRQ2ptRWVVY2NDRltDUktFVEt1VVl1ZUdFV3RNRmZbR2ZJdltJeF5Jc01veDtbeGhzVXhfR2ZbR3Y9eFpJUkhzRltNdl5Jc01oZ2lHdWxoZlNRcF9TcG1YdWF4YG9mYFdJcW13RkdFbWtGbVNIbXF0Z1dVRm1YOkFXY0VXa3V3QXNURl1TZktHZEtTPE1SXFxNdF5HUztDQjtjZE9nZGd5U093ZFFXWXVVWVU9VVI9Z2VXZ0F3YkFXSHk/Yz1VVE1VZEV1SFptdmBxdlFtZ1ZFWW9Rd09BaWtVdjxZcj1ZSVg/WVhvZFBvVl1VVm13WXlxWVFzRFFndXV3WHFhdD1fZVZfRVFvZGk7ZV1zUkhfR1ltaVZZcj1ZcjtJcltTRl1TZndNWUVwbEF0S1hcXGtVdFBoRE5bRHZgaXNVcG5gcG53ZHg6WHlPQE5WdWpZWHNRXFxqSmBvZmBPeXRsaTxrRXlwPFxcbUFRdUhcXGt0UXl0aWJpbndjeXhNVmVncXV3WHFmYG9GcXRQcXRXVWljR2djaWxldkRpeXV5eGtpaVxcP1k6X0I/Y0JpaXV1d0RSO0VyPXdKSWZVdWhoRXdiQXduc0hxc1VzT1hfO0hqO2hbR2ZbTXY+SWNLQ0RLW3JYd3ZJcVd0TVl0dVdYYWlTSWhddXJ4Z1l1YWl2X2lqV0J2bUdoa0dSQUlrWVdRcWd3Q1hcXGFCUXVXW1dZX2F2XmFmXVduT2l0b0V2PGlqTFBsTFB2XFxRdk9pZG9gcG5Ab05PbzxQajxWbGV2eXNXWj9QYnNZd2l4cWBuY1ZAaWpBdjtXXFxNVlxcR2djR1FwbFBwYkBvYlhhcW93Tml0T2lrV1ZhcHFyR1hdXXFyR1hedG5eOj5qQT9wUEdydkl5YXltZk9zS1lfRGZqbE95bklnaXdnaXlnWXFxS0BjXlhaQW5bRk5sXXliV0ZsQl9ecXdocWlgZW90PnhqQXhyQHFySGZddF5kUj9lUkF0SkF0QHFyYHh1UU5fbXdcXHNGYXNYX1Fvb2ZpVWlDSXNDSV1TRl10TFF0THNEUXN1akdWPWdpd2d5WkNJYVFlV2FzRmFzTE1UTG1leXNZWENFU0NlUXdkQVVmS2FUTl1UYHVzWGdXXVVWPWF5ZnNXWEd2XFxRdlxcYXdmYUVPY0RvQXlrWXZMT2RMQ1I7RVJ3Y0l3U0VVU2VTU0hgPURsWXZBO0I6WWdAY1VLSFFjRVdjSXJ5eGtLbVJAbVZHUW1vVFdQYW9bPlxcPEFdUj5dbml2bFddWGdiYFZsYW9zVkhhbW92Rk9uPUBcXEBPZExPaHNReF9Zc1F4X2FOYUJCWmlWal1pRztCOjtCOltNTj1QOj46O1hZO2daPUI6O2ZpT3VJZXY7V1h0PUJaW0VOPUg6PG5pYEtGXFxLalhQbHhWRkFtO11YUDxKcmlNUWhtQ1lLOjxKPkxsTFBsRHFzSHF5akl2PXRRWUhvRzxyWkRKT1xcSzo+ZjtQbVRQbVRkQF1YRDtCOltFP01COjtCOjtCUUtiRHRNQ3FzSHFrR2hrZ3hvaXhOdDxLW01LRExLWHBRd01VUG1UQF1YSkxydnV5eGlRcGxQcEBuWkBqYkFeTVdlVVd5XFxpckVwa3FpeVpZX1l4YXlvaXBhd1NnaG9nYEtJYkJiTl9kdlNZcGFnaj9oSj93WjtCQTtUO0F4P0tJV29pW1VyQGdyRXdEQWFyPkFlU0dlP2lyP0xRS0RKSHhNeWxXaG1XeGF4Y1l0c1loeWBpc1FgS0loQj5oZ1F1b0hkXXBid05pbkFnc1F4X3F5eHF5PndyWz5yZXhkaXBqR1ZdcHd4aGllSXdjSWlsZXZkcFlxWXByQHFiVlZka19rYXhuYWFtc1ZoWGBhc09gd095bkF4akFoXFxYdko+Xl5eXl5feGJJdGtSRlFkX1NTSF1lckNSbl1FajtUSkVyamliTXlmSXVVdF9YY0tHZEtTPl1SXlNHZVNjQ2l5a0dZT11TRl1zaGdVdU9iPVdiR11TRk10TFF0SF9Fc0tSbk1GSFVTSXVTWXVoaGV1W1dSQW92SGllVU9kTE9YckF4W01mTUNYVGVWX2hqRXRMaGRVdGBYdXF4Z0lrQ0hrUXlvWXV5dkl5bVRvV2Bwb2hwU1htVVhzQkFzVlFxb1VrV0ROU3l2dGl4ZXlSSXBdYXFzV2Zgb2ZwRmFzRll2QXlrTWZtQlh0TE9kTG9gZj91al93UklwU1ZgYF9xd1d5UHhbUUdaWFlaT15baVlnaG9neE5pbkFvaHBvaHBwcHB4b1hnUUFcXDxvakBwaj53alxcYWBZd2VZT1s/UGBnT3VuWG1xdmdwaHBvSHhbUVxcanl4cXlnZ2dnb0BwakBxdXd4aFdkTVd0akhmPUFrSF9yY3d2SXltaWBvZmBta1ZmQHlheWF5TW9lWG9fZ2ZfZ2BvZmBzZHdeU0ZdU0ZjQ0djZ2Y/PWxabFg+YFZNbEo9SFhiQXRbRD9HZ2NHd29Zd1FJRUZrQllrZzxrWXhtWW5NSVdRcjxRdkhpTVRNVVQ9eWpFS2pxTXJwTEN4eHd0WXhhcWZgb2ZNdW5IV0JEbkV1bGhkcXdVeXBVdXBoVz51alxcQU9kZGx0UXlvWVddVE5dRFBrRFB5dFF5SHBddXJoTXVuSGtiQVRWZHhteXZJQXNCQVNjRF89d2pIZnVvWGdRUHBsUHhEaFxcZT5rSFJUaWV1c1hKS1Jdd1JJb2V2Q1lsZVdnZXdmR1VtX3I+YXJSZXc+b1JdR1Z5XWhuX2haYWVJZ2VYaWl1dWRVV2V1Y1l0YVhMQ2NOW0xiSXVteFZVdXBoZU50XFxMQWV0UXl0eVxcWXJBVDtFUjtVUj1VVmlxdXdQVVRvZGlwZUdfaGI+YEo/ZDtBeHh4bGl2ZVxcXmpAd2tYZmtKTnZJWWFIbnF0Z3hEZnlxR1tGYF1zTmheQXNLYGJhTnZuYGxOZGNHZ0Nhc0ZEaz5NdE9pdG9xeHBxTnRETGFoVE5dVF51VmFVVlU8UD5AbFF4bFFWXFxrX1xccFBbUlBtVFBePmBzR2lzR2lTTWZNQ1hUTVZcXE1GR29SPXFkOm9peG9JWWtnPFtJQ2tjXFxDeHhfdE5hVG55dWlzR3hhQkU9dldZaXE9d3lnSFZzWURlU0dlVmo8eXBFS1pVbzp0dXg+W1BAWklQakRuanFpeXV5d3lAa3l4cFlBdUw+dmF5X2k+ZTxeaXhgWnJheWdZXlJPWnZOW0hQXmthb0JAa0J4a1l2YUxJd25RblxcUF5bRl5bXnd0SWZLR2RLb3lzbnlXQGxKQFxcWXZdSUBcXERXY0VXYkJmcj5hcnZIaW1FTUdzaGtHaGN5ckNCPFdFX11WXl1JdF14QmN5cUFGPFl3UXlnRVdjRUdEPFVnUXVnUE1UTE1GcltFQV1EUXNEWXVpeGVFW1t4cXl1eVVGPk9YbVVYSW9Fd0tjSktVaj9WO0doa0xqPUlwWVl2QXlra3hLeXluSXVtSkxSSWxNdjxrSHBrYEBUYnRxd3F4VWRqPEVOdGRNYVxcbmBwbnhEWWxhSltcXHh0aXhlXWpKXVl2XXlReV9cXF5qUGlvVXdeaXZfST9ocj5gWj9kO0VlP2diP2d0T2l0WXVxd1dGa0I9VVVVVUVVU3JEPVI6d2N4eXJ5d1l5cVVXZVVXQXRKYG9mYFNQbVRQRE5OZVVXZVNbQFQ+ZEo/RGtIcHJbZFZfZVZSeXl1bVVYbW06QGo6YGxOYExwQWx5bWw6ZVZfZU5wcWxtTVhsPUw8TUtETEtSWVJ4RHV4dWxOYGxOdVRRdWxReGxxXFxQbjxvZVhveUF5a1lKW1xcXk5fbElvdXhOeWlRXzp3TnlnWXVpRFNLUGRMT2RvaHBvYERsQl15bVBLanFQeEx1WEh4VXRMUXRMPkB0P1lbWHFxd1d1UHF0cEJCO0Z0Q0RhR0lyO0lyO1FyZXl0aXhzWFhhYXNGYXNyQVhDPFVUTVVUTWVeUGRjeGJJcF1vbmBwbnY9aV5qTmY+QWs6QEpHclpdVXI/WDtdUj5ddlZJaW1dWU9dcmlPVW9PQ1tbRFhrRXhFeWxpVkVVU0VtSXZBQlJFVVNFVVNQc0dpc3dsWXZBUXBJVlpMUUs8ck1cXG1BVHJdUVBtVFBLTFJgbE5gXFxSQURORlxcTztcXFdDXFxrVGRQREB3WlxcanNxeGdZVXdlWXdIbEtITFllbGlkd1plTDpoVDp4VDtlWkFJclF4XFxmRlpST1p2b1FsSV5xRU5fUm5dUUhsS0heXFxOXjx5c114Yzx5czxnXVtGYjo+WlpSTENUSmN0RWtpeFdIbEtISnNFaUNCckFCOlFsZUBuPEh2X2VyP2lyT2VUT21yQHFydklxbWFNTUhtU0hPYGxOYHhuYXhSbj1MPEFWVXlXeG1xSGBMQVFPUHVUUXVUUj1VUkRYSVF4dkl5bXlWaG1XaHBuYHBOcE1QdXRZREFjO09eS0BuPEh2d155dUhmXXlaallzXUBwakBwdFBxdE9yPkhbdlloa2liYWZfZ1JIbVNIT2VUT2VWX2VWQ3RTPUNNR2VTR2NRcUJGbVVYbXlvWXdRSXNDSXNWUVhVbWJmYXdmcWhwb0h4bXlMO1dmXVd2YXlzWWhIb2NIX2ZeX0ZLSVU6a3NaT2JbaVZZa0l2PVJCY2NSQ0g8P3daW2I7Z0ZqSXdNeUZUY2NAeWJxS1RidXRWYXVWV2VVV2dbR05UTVVUdGxIZFNHZVNzQGdKQHBEXmZhd2ZNSXdub2lYT1p2XltIUF5rUWBmX19zb2lYUWl3aGl1cVxcO1FcXFp5d0c+ZUBvYkBma0BXdlVpXjp2ZTw+eF8+cj1BbjxIdl8/dWdAYnJJZmZJdFhAZj1ObDxRXFw6aF5qWXNpQj51QltrQnZFQzpRRzpZclpPYltJVUdjQ0dDWXNFWWxReGxhWWxrWXZ1aFh5aXl1Y0pLSGxLSFxcS0lCQ1ZqZ0Y6eXNZdXV2YXlTO2ZNSXdTQ0VTS1I8TVJ0UXl0YVJhRUZGW2c8W1FOPVB2VE9nZE9naG9naHM8UXI8QHdaVmRPZ2RvaXhlVXJBeFtRc0RRcz51TkZMUVdwbVRQbWRUT2VUc0l5TE1YVkFIVGBtc1ZIa0V1V0ZsSj1JdVNJVUdlU2dsTmBsSlFwS1NRT3F0UHFwb2hwV1xcYXJDQHVvWVR2PWtAVW53eFl5cVVTT2BOP2B2RltkPl1YaGpnaWFYaGBlb1xcS0liQlZsUHBsQEFmam5mSXFtR19oSk5SR2lzd0l4SFZbRVY7eXBRUFZLQVduYGtGYEs9VVI9ZVBvZFBWTVF2eXhZeVlpXXVySFRWXVV2PXlqSVZWTVFeVU9yUUxCUWNPYXVWYWFdb3JGTlxcQ2Bibm9cXDp4YWJAZnJjWG9lSD9EVEdIXW1CS0lSQlNiZ2lJQGdGOnd0aHlCaF1kTVdkTWF0TmFiXVFEYl1vQmh5S0F0SkFqUXVtZllqd0VLall4QTxKUEVKWHFKT1xcS0lFS0l0S1FlVE9leGxReDw9S3dYWXFxc1ZhdXY9d0pJbj51alxcQW9OYXROZVF3ZHE/VWtQRFZ5VU9kTE9sWWVqdmV5cGlXRmFsX3ZeSGNNQFxcPEdvY0hvXFxOXlxcbltIbls+d2pcXEFvdFF5dFdbRVZbd2dpd1FvZFBfZndePlF4X1lzQ3BbP0lha0doa09tVHRgaXNVR0Q8dXdYaWltO0hqO0Vxa1dWQ3RbP1FobVdoSHBrSFBwPUp3ZFBvZFRGXVNGcXNIcWtiQWRVP3JyP2B2ZmZ5cXl3aV5fZl5zSHFzaGo/aGpTSG1TSGZbR2Y+dz5IcF11cnh0WXhhT1xcTF5AV253RmlsYWZ1cXhnUV5cXE5ePndqXFx1dkl5bUllU0dlbEtIbFtYdGN5W1lyQVdXUGFnS11UTl1GdFtEQWV1eXdRVl1VVkRtRm15a3drQXhbWW5jV1BhT2F1VmFtYkFkVlh2ZVl3VT9kSj9sTVhsTXdEaXJBeXJZZ0l1bWRGbXZpd1Vkd1ZIYWVDUXNEUWdmX2dePUhSc3l2WXhJUXlvWXdzSVl2S1ZYcUJPW0NJRXRQcXRgU2RDeXJJd0VZeWhpdWVvZ2hvZ2dnZ0dLSWNyY1NVVVVVZVRPZXhJeUl5YUNGW0NOXVROXXVrV1ZBQ3RDP3FQcGxQYGtGYHNHWW1xdFdZV3FkUG9EWF9Id3Q6eWxQcGxQQHBqQHhjWXRhWHNFWXNZZmF0X3hkaXRlTm5NRmhOcHBwcHBYcG1YaWpFdlxcdmdpd3dySGhddXBoZ1FlXFxYXFxrT21QcGxQYHF2YHlHWF1xbm9WR3FMYXROYXZnaXdHS1p1TGJAVnJNU2o9WGp4bFF4dFRoUGVdU0dvWkF2Wk1mXUFAWkFuW1Y+bktBZ1hwbVhQZVRPZWtHaGtfaXJHW0BYS1FUT2VUb113UklIX2NGX19iPl9CeFt5b0lJXW1yRldYYXFzV3Fpd1VJYGtGYGtORnRxR2RWcE14XklTaXRPaW5vaHBKeGpJdE1sWXVIPE0+QGxVWG1VZVdnZW9ZeG1ZUGtEUFN2XVl2YGxOYExLSWs6VHE6ZUo9WVROXWQ+YGo+QFxcV0RMP2diP3dDWWRhQ2NIRVJeS0M/T1hqQXY7TWZNPURmeXRZdVl3aXhReVVDb1M7XUNTQ0VTV3hheXNNY2U8P1M8T2I8d2JIY0VcXEtJPzt2PmtpZXNzOztCOjtCOllCWk9iOzxaOl51QU4/O0o6PEpyeEtOPzo7Qlo9WFNxaXdVaXBvcEl5bXl0cElFeG9peE9VVE1VckBBdz1hbXdUWVBFU0NFd19Zc1FgUj5cXE1OPFhoQFZwdXdYaXVnaXJ1bXl4cXlFeExpbFdnZVc/eVhwPUo6PHJDTVdkTVdSaXR3THF0UHE+dVY7XFxxZlRQbVRsRGVueHV5eGlxd01zQXhLWUxrRVhrRUxLREx1YWBWX2VWT2hsT2hYZlBYcmlLSGlMRkBha1lfUW9vXl9mXl9oVkBrV1d1Yz5eWj5eWj5aUXBhOz5ackBtVFBtVFlqQUJJc0NJV2hhdXNMY2U/O3hsd0JJa0V2d1l5cUVVW1VVU1hfUXNPd1hpcXVTVVVVdWhJRUNES0N0VXhgaXNUZ0hlPWNCO0liO3ZWRXJyR2lzR3NCQXNuTWlMZ3duSXdNaUNHY0N4a0l4O3lIWUM6O0Jyc3NAcXJgQXlrWXZkS0dkW1JBQ0J2X1NMTVRsV3RKbVJcXE9mXFxvZmBvZldzZkJDQ0NDeFVpR11LSTtJaTxHZE5fZG51WHF1Q0dja1dJVEZETk5lVE9lTE5cXExuYFZDUUx3T3lycXNFPlo6Plo6XmlFdnltRmlXYXVWYXZfaXZ3Z0ldd1tJZ011ZlRTRVVDVkJnRzo7Sjo8cktseU9cXDtweGdZdVlcXFFyPVRNVVRNUXVUUU1OXFxMXmF2XmFKdTxWOjxKOnJLU1Vob2ZYcWhnVWV2X2l2eWJJc0VkS0dkS2VUT2VIW0VyO3JIR2k6O0I6c3ZzRVlzZVNVb0hnaXdVeWg+dUI7O2JZSWhfT2JLc0RRc3VwZ1dVRVRLRVQ/ZVI/UXY/WWNvYXhuQXVrc0Q6O2pbRXVTSXV4bVl4dU9ZbXFuYXhuYU50VEs6Zl11cF9pb3VwaGdVeHBxeGhVc1B5ZFc7SFNHZVM/S0V0TGhcXExLREw7SVA9bVNIbWtsUHBsbGtXTEo6PHlWZVl3ZVFweVJPZVRPRHBDPUo6XFx3ZEBWVHlKaVhXaG1XaGlwa2xUcmBUUXVUXVlRWl1TZVVXZUBwakBQSGhNPD5aOj5yWkZyaFBbYGF2Q1lsbk9hV1BiW0B5ckVbR2ZbX3NVU1ZhSXlAaWpVbFBmPU1ISE1gbFNWQE9pdE9JWFZBQEo6PEo6PE1ePHVsbU1GRVVTRVVKPVRKcGtIcGtcXFBuXFw9VVI9dVV4UGk9dWt0TDo8Sjo8SmppT3BgVGp0ckl4TWFIdGJtckBxcmxNWGxNU0RNU2dZVj1BSjpCOjtYO3dZP1NUVE1VdEV2PGliT1dHUU1jQ0djS0dzXmlVdW9Yd2l5cXl1aldFQDtaOj52QnZ5RG52ckl4XWlvZ2hvdXl4aXlyWE5xckBxYlBvZFByR0dsOko6PHJLbHNPXFxTa0VYa0l5bXl2UWVvVGVuY0hvQ2hTS0RMS0R4akF4cj15aklWbE1YbGxxbVFKOjxKOjxKWVFyc1Bqc0RYXFxhSldwU3FReGxRd3JEWG1xdkdRV2RNV1hxdVhBeUhZSzo8Wjo+eVBuc09ea2Zgb2ZxdkdZbVV5aDpBZj5fYj5vaGdRdV9IbltIdHg+Y0Y+Wjo+Wjo+cjo/dnZuXUZ3bnd4X2dxcGdjW1lJXTtCOjt2dm94W2tmTmVUT0VjR01KOnFvS2R3OjxaaUl0T2l0d1ZoYGFzVXlwaVdpdGlwQD5aWkFdYkBmOkJaRXJQdHBMZE07PEo6QExVcFJuWFo6Qjo7aE9bTDo+Wjo+anVVO0FCOjtCOjtidUFSPzxaakB2SXhheEFlbkBnS3luSXdtQnBbPD5aeVhqbUZpOz5aWnhveGBpc1FwY1d0YF5qSldmXVd2PXlqSUZrSFhaOnZlPWhpakI6W3hPZVI/ZUJweXJxeXdZSWNHTUI6O2JEa0I6PlpqOzxaOmlpcmB3dj5tdFBxdGB4bmFoS0dkS3lleEd5Pz9lUj9tYkFhOko6PEw9WG1wSXJWTFFuPVdgYXNTSHlzSXlrRVhrbW5gcG5JeW15dE50REw6Plo6PlxcPVhncElyVmdxdGd4QklsXXZleXBpT09kTE9iQkZjQ0djU1dlVXdxeWNRWXRNWU5uPEo6PlpaYWBoQXVBVmJdSHRwb3dWSXdiQXdCaGxpPltbdmZhd2ZbRl5bWGJBcFtLVl1GPlo6Plo6XmpacWtEbnZzWXhhaXZfaXZNcW5HV2dZUF5cXE5ebG5pdkF5QkBrQnBwcHBgPFZqW1lfWj5eWj5gaj5wWkBuOkB3Wl5aQmZbR2Z4bFF4REFzQkFedD5bS3BleGBJV2l1d0ZfY0ZrO0VGS2ZtP0RdYXRjV1Rha1NWP3lwaU9cXFhqSmxyQ0lzY3F1d1hZR2hrR2BSQUROQE1WXFxNblVYbVVNUjxNSllxbzx0UklwTXdkWGRhTHltVz9MeVt4UU9cXEtHcFJ1cXhnWVV1QXFCXFxNanF4Z1lVPkBsSHBrSHVyQ1BxdFBxb2hwb2BxbkxQYG1SQG1qdVhxdXBuYHBua0hwa3hwcXhYaG1XaER0Q0BRYUBvYkBzSXlzSWFyPmFSTVVUTWlzR2lPeGxRWHhLeVByZFRPZVRKPVRKR2lzR2lMTl5vVkdxbE5fZE5vb2hQS0lOc1J3WXlpeWl1c1hoYXRQcXRAcVQ7X2VWX0VcXFdEa01VYj1XYlF2P1RzRFFzVFVVVXVVdXBYZ3BvaHBrYmFSVmRUTVVUbW12RkltQ1lsYVRzRVlzbXl2ZDxsS0hsa25rV2Z3VUdaeF5lPz5lPFFlP1ZkV2dlZ1F3ZFFxXFxnckRAc0JBc112YkhAeXVZeW1IX1B3Xll4YXlvYkJGa0RQa3BfbUJoYWZeX2ZedkZvWkhPc0RRc2xJeGtJYGo+YDpxYT5JaXNHaT53XlxcYW08UGo8WGBhb3NGR21sZmJBd2JBeG1FR21leXRpWHVSQXViQG9iYGdWQXFLeFtRTlpwUFtSTl1UTnhbZ2BJQFxcZG9naG9rSHBrWGdwZGdsTFBsTG5kRGF0UXl0TWZdRFhuZFBPW1dPO1RQbVRgeXNMbWJJeVQ7b0lcXEV2Rm11PE9iPEdJbW12ZkNVbF92dklxS0xSeHBxeHB5eHF5VXVwaGVsSkBsWlVVdnh5YlBvZFBSV01PUkRQa0RQPkBUb2VYb1R4UXF2YXl2UW1UUE1waVRNSEBwcUh1S2x4W2x4a0l4a0xQbExYbl1YVkVxbGVOdXF2WEVUS0V4aGl1dWx4b3lzVnV0d3BuWXFxd1VRbW1mbXZmSEFnZVdnVUF1UkFhdE5hSG9tdkZtZ0hdeHZpeGFjWlFcXDp3eWdgdHVOb2JAb0JuW0huW0hiT2l0T2l3Z2l3V2NFV3NySXdFSXFpOltyeGdZTklWPll1cGVlUEViT1NHUD1oaW13T2VUT2VpaENicHlDZD9iOj9CdWtEUXVmTGVoY0dnY0tJdEtJdGZrVXZgVE9lVE9hdE5hVFl1VVl2eFZ0cGdqP2hqPnFpQE5xeFFlPVFvc1l3UXVkTVdkbUNIa0NIb1tUYGBDaGk7TmBsTmBEUEtreG95dWVvVXFPQkhxc0hBWHdRc3l5alo9UFJcXEtJdWNGbm5UUXVUcV5Jb212RmY8YWpQcXRQX2dEUHF0UHFgcG5gZmtAV3djaV5Fd2xoUkhMbHN1cFJYeXF5d11cXGp4bFl2QXVNVWpzVFhgQU4+UHBsUHB0bFNuSXhrSVJCZFV0YFhjeG5RRW1VWG1VVVVVdW9YZXFUQHVfXFxrXUxLP1BWY0VXQ0BMRHlzSXl3RVFqZ1lRV2VVV01uWWFVaXFWSXFtV3htWXhXX2VWb2RYZGFUdnV1eG1WYG1OS3lXaHhvQGlrVXRqSkxRcF13UmxxRT1ySXlzSUB3cW10YVxcTERkVmBhc1NAa2N5dD91eVJETVNETHdxdnRhUlhtVXhdc1JIUF15ckl4cnFpd3F0UHFUTHdxc3RRc05hdE5QUltAeXRReVxcWXE+TFI8TWJ3cXN0YWpGb15pUGVvUG9kUG9EdnVxeHNXT3RNWXRpX3VySHJaP2B0UXFJbnZAaWtVRnhrSXhxeVdJR05LQ3BjdldZaXFNUjxNUjxLQlY/aVhTVUxNVExDRk5RdExRdGtNdkl5ZXlDRDxNRlxcS0ZGeVVlSXZbSWh2RXlsbXBAWE55dVl5cW1ARHFTYFBjTWxdWG5daGtHaHNleXRpeG14ZFlEcWtzeHNXWFFRaXVXaW1XZFFxaXI9eEpJbE9WPXFKaXdNTXF0UHFlbFRmQFhuXVhubFBwbFZlbUpZdVVZVVhtVVhwcHM8SHE+YGo+dFdpdXdodW1MbVRQbVV2QFlrWG5deXlldXdYWXZcXE1TeXlaeWFzRldgV2FoTWBoU0ZrTGZiaGZvRU9iQ0dcXENvb29pW1tndW13X3FvcFlWa29YZ1d5aFFAZXFpXnFBeWhGX0xPX1tGXFxcXE5icUZlV1ljVGZlYE9nVHBmSHl3SXh2cXh2b3ZxPEd0Vl9reHZ3eWJTd1ZYV3hWd3NzY3NrbUltYWVhSUlBeWZJdWV4S2VUT2VsTUNaS0l0S1VIZUdxQ3RIaWV1U0ZdU0Z5O3lLQ3k7S3ddeE5nZE9nbE5gbFJYVFdxVVhtVVVtcFZHYFFUbVd0dEtJdGtJbFVoRHZqPVFocXdoYXZ5RGpTVFBgXUxOXFxMQllWZ1lYYXFzb0l4a0lsQVdtYkZfY0ZfYj5fYllqWUZdVVZddVF5dFFZa0lIb0tfeVh1VHRtdXZIaXBoZXVUbVNHeFA/cWxnVFVcXFVWXXVRcklMdz1LQll5eU1ST0x0TmF5XXV5eGl5VE1VVG1VWG1VbkVTVXFwZ2V2TUx0QTxNVExNPDxSR2VTR2BYW0RjYkl3Y2lpdEd1aGd1dEhvRHl1dUF3S1lub1FjYmFyP3BdP2FpcXF3V0dhZ2htRWl2THBbWGZuckd4XFxpYndQXFxlVl9lSF9Nb25iTnhqZ3dTWXBhUFxccUFaOl5gVkJKSWNFV2ZdV0ZzSXhaS0RDX3ZRO2JsdUhZO0JIYWVzU1RpX2JWS0JYbVVYXVhxQ1ZUTVVUX2VQcVdkTVdkX3h3O3JaPUhed3VEdUZoS3l0UXlscVV1Z2hvZ2hsdXg6VXJpd2huTXY8dXl4bWRZc1ZhdVZNU0RNQ1lpZ3ZNa2NXU0lQdWdePXY6SWJYbVVYVWZAZWNMZWRNQ2VcXGNIY1NiSz9TXkNzQ0lzd1l5cXl2aj1JbHFDYlliQm1oTndkUXd2WkF2OnVEUHdkUVdCOmdkT2dkTE1STFdnQEdjRVVzWz95Pml2ZVt0akNYY0VXVGtGaGNHRE9iTXNkaT9kPFdEUWZfdkFcXGJPbmBmZmpeaXh2ZWJeXFxkRmh5TmxLWWt5YXlteWtuR2ZUT2VUcHF4cHlxYGBgSHNEUVNLQ0RLeGtJeGNJdW13ZmxXVktdSD1VUj1JWW1xdnNBeXJhQ1hbSXJnVnh5Yj87QnRLSXRzdXl1eXd3Y0l3c2pHVj1hZG9ZVztFaXRbWGJBaGBlc1RzRVlzZWlxaXVxU1NJaGJzYmVXZ2VBdWtwa1l0UVhFbFdgdVl1S2dlV2dNeD1scldpdXdIdEtMSllhTkVVU0VBblpATml1V2lxZW9RZHBfX2Q+bkNHXUZwa0hwW1FYc2c/ZXhQaW9Rd09WX1A/XVNSbG9jZG9JUXVUUWVFV2NlckF5cml2RXlkTU9EWHNjcUF5a1l2Q1VkYENoU2FXc3VnV0VWVE14Z2tid2F5dmFUXz1pTF95RmNFdFtUY3lUa1tkZWV1dGdYRHFDW0dYUXlnWXVjQ0djU0VpbGVmdmt5ZVl5UkFIWm9EPEl1U0l1U2ZmQUduRmdfc2FfamlaVFBpeT5tX1dzUGhyQHFyTFlmY0d5dm95bGl2RWl3Z2l3Tz5seEBaOnBuYHB2TGheRU9eXVZeY0lxcEdeW0ZeZm9gdVlmPXFdS05iQm9dbFl4bXliSGBdc2hpdXF4P1ZbUD5fdW5cXD5QZXRwbkhgdldPcW5HZ0dnY0dBcFtXclZeXVY+Y1hWdml5d2lXZ2VXX0lBdXh5bW9Zd1FZeHJfYWl2X2lodkV5bFF4bFF4d1ZJUWNYZGFkP2diP09yPDtSQkNmdkh5TERrPmxRblV4WFxcakpQam9kUD1IVmo8TXlcXHlqWXJUaFBlPXl2bXE8bFdbdXRKdGo9SUtIbEtoPE9iPHNCQXNaPVBSRHdjSXdERUs9RE4+QEw8dVU9eHN1WG1FVGxDYVRobXVabVZgbVZgX2NDSFpaXmpKTmJiWWdaUF1JcW5AP1tbXmpKTmxASF1GTmJCRj5jdD1HRUZLUkJDRj5fVElrVmo7Q1s+Y29BZkBWblxcP3NdV2RiTmtMaGdtUGBpP2RoYHZuSHlvcV1DV3RcXEBvSnlcXDp2Wzs+bFVfcGdGeUo+YmRAW20+XU9WYlhObExvZFBvXlVxZkVXY0VnbHVhYlBxbk15dFF5aXFxd1dgZ1VhX2dmXz8+Wj1WWj1GdXBWX0leZ3BWcU9Xb1BPYFlZWmlxdXdYZFt4Xzo+dls+XmV5XzpAYlo+OlVTRVVTcGdzREljdnF4Om9ocG9oZlVlP01YP0dFRk9ja2NIb2NCOk9iPE9CU2toU0VVU0VVU1BsbmB5b1lQbVRQZVxcT2ZcXGxnVW1edVlkUHM+ZVlNVVRNRT1tWXhtaURjV3g7c3RBREpLQz9nZl9nZmRPWEI7ZVRPZVBjRE9Dc3Bnc0xPZEw7QmpbSG5bZGdVaGxNRklXUlpfZl5fUldlVVdTSFJjdDxHRUZPY1tzZlN3SGltdUJBaEdNdFRPQ1c/cnJdSVhDWWxDaWZfdl5hdmo7RUZTRE1TRFNraGNzSWBtVmBNaHdRQjo7clV3SGldVF9ZQ1pzYz09RnFzSFFPZmJvZmZJQkdlU0dNeDxFY2FPSW1TSG1DYjo9UmxtQ1NFWXBhd1M7Qm5td1ZJVUBnV0R5Q1FXc09HeVs7eGZJdW1TV2VVV2BTRElJY2RfQnlRVWRrclJBbWdob2ddUj5dakZUdXZQWW9RT01Ic1ZcXFFyPXBGVHVObl9oQjo7c3B1Qz5dUj5deGV5dEllVHQ/dFddVVZNRExLRF49WVNjZmI/Z2JJcj13Ql51cnhleW5heG5hd2dpd19tWUI7SFJbY2BfdztvV1dRaUdNZW5DY0Vpdnh5c3lheUlfQz07eWZbRkhBeGpBWFNraFNrRFBrVlxcTVZMWWZBdUNTa2hjbEpJbE12QXY7WUpTbFg+RUs+TGpiQG9icEx4YVVPZVQ+SE1GUHdrUXhsUWtFWGtlUG9kUGxPVWpbSXZbaVl0YXhrbFBwbGxPVWpsZXR1eFhpbU9RWFlfUXNPRFVvPFVUTVV0dXdYaVFpdE9pRFVvPE9pbVVYbVVvZVhvTVB2PWtrXVZeXW4+TU5LZW93PFhhcXNXbE1JeE5lcEo9WXI9WXFxdXdYcXF3VXlAVVdsRG1GWXRheFNhaXZfaUtZbFFWbVRldXlWbVhwbVhQcGxQUFB2XFxKPlFWa2l0ZXhUd1xcUXZcXFRfeEpcXF14Ykl0TERrXlF3T1lvbFBXamxPaGxTWjxMYkB0WzxqQkRNeXVVcXRXWGFxbmduR1ZzeUF5XXlrc1hoYXF0T2l0Q3Fob2dfTXhwcXhoR2djR0lsXXZiXk90VE9jRE9jPE9iPGFqQ1ZcXF5PdFRQWmo+XUZIW01uXlZvcXZHYXl2YVlvXkduXXI+aDpPXktga1V2YEhvXmdIXzp5aFlpaWFHZ2NHcWl3dXhGbW5wYktfdHhoaXVRcW5Hd1xcd2Zhd15NcFpPPnJVWXV1cG9ocHdaSXI9UGBjZ19nUkVnY0dnVFtXUjo7QnZnaXd3Z1hlcW9ZZ19PdFRJcW13dkRXY0VnaXZfaV5PdFRQWm5Xd1Bpc1BxdHB3dXhoaWxQbU1oXFxWXl1WcXBnc1NJdVNtRmdHRj9JZmJLY1xcP2dvU1dQQVRsP2hwZXdUbURFZ2RYb2VIRVROYXJDV0R1XXhiSVJLXVQ/ZVI/R2ZbR3ZSSWhddUlwX3Q/V0NRO0JaY09UYFNcXD1uc0xRdExZc0VZQ3FwR3lvPkFta1RWRlxcS0ZsdXdYWVFheWBwakl0TWhNV2RNVU9lVE9heWBgTGBAcXJAVUF1UmFZeWl5cVFIU01lb1RlcGxZeG1ZV3hVVERgWGRhdGM8SnJAWFtRUm1ZbXRUWGBhSzpcXGpAcGpwdHFjZFJsaXhvaXRNWXRlZE9nZFd4VVRdbXJGSFdVcXBnZVI/ZVJtWW1MPW1xeFdZUXdjSXdzUXl0cVB5SG9UUG1UVEtFVEthdE5hcHZxZG5CdUxpbFU+PGpNeE5JbVB5SG9iQG9iPEpSeXF5dVltWW08TWtLUGxMUFhkYXRjTGtcXGBWVkhyTnBsUFB3YkF3RnVteGRtTFBzWm1Zd2l4UW1KPUh4ckl4XXlrZ2RqU1xcc2FRU0dlU19FcFJVa1F0T2htVnVcXG5dTHlJeFF4QWxDXVREYExOXFxMXnBuYHBYcXF3V3FWcFhQYW1zVmxLQVhsU0htY1RsYmBMQF1PUHR4ZGl0ZVhYYXFzX2l2X2lzY3VqQVl2U0VVU2V4Y1l0QU1OS0BzZGxQP0FTSXVTYVVwU3F5eHF5R2FXYUxPZExrO0FWZnV1eGhVYERUY0x0YGhTVUBtRm12R1ltcVRtU3FzQGlrVURNRmxyV1hRcV1WTGRsPEFTXkxMQXRKQXBrV1RRcFR4QWBtOj1OYnNNUXVUUWlwb2hQbVRrR0ZzVWRRbUI9RVNvVXJKX0NgR3RIO0VEU0hSd0dsWXJJc1E6WG5BdWt4RVhFRFdjRVd0UXl0cWtIcGs8RW5KbWo7SE9AZVZfZVZRcW9XZVNGP2xTX15Zb3Y6SWo9PjpNdW5HU0BHYmNbc3dXWXFhdE9pdHdjSXdjclxcRXhRZ2hKdVRRdXZbSXZbR2ZbR3haSXI9Q3VARFBwXFxXUkFKOnRZeEl5YXlMcUBsT2hsT1Fxb1V3eGRZdGF0TmF0bmRZY3hKSWxNPnRKQVRPd3hzQHhzYXl4Zkl1bWhTVXBQaXhVeXB5XFxxUmhkVXRgcl5NUGFxc1dYT3VAcU50TnNEUVNVU0VVV1JBcFtNTktAd0VRVUpAU15UTGFsU05VVE1Va0NIa0toV2Y9U2hgdlJIckppdWpcXE49SFduWEpAUHJGbHZFQGs/UVZpdE9pZFhvZXhpVHFOQGxLSGxLSW9NdU5tVFBtUGo8UEpTeHJgQE1TSG1TaG9VdXBocXV3WFlIbVNIeUxmbFlwYXdTbUtBWFBoXXVyZGxlcVlaaHlveXRZPUpqVFhgYXNpPHlzQU9OTEthXXNSSEo6RE5bRE5sQWtHRUpeTExDQXlrWXZTYVdwSW1tXmk7UXZTR2VTb2BwbmBAcXJAeW1vaXlzV3lwaW90UHF0PlpGUW1vVndFbmRkVmV5YVlZVl5dblBxdHBUUXVUeUVsTElga0ZgdEtJdGtNWGxNVD95dWpcXHJTWXBhRU1GbHJObm52b2RITmNOaXRPaV9TT3A+Plp4d3l3eWhzX3JAYHZBb2tTXltveWdxXmtheG5haG1XaGVdaF1qXlxcYD9gWU9vdmBxVmlyP2lqO0FmdkF5XXlrWWhoVG5rRFBrbD5gaj5gbVZgdV94YklsdlFyTT9qVXlwaXdwaGd1VEF1UkFhW0ZeW0h3RUdrP1F2WkBuWm5aPUh2YHF2UEdlU0dfeUB4Tj5mRXFsZ15bQFZyU0l1c2BuXmBuY1ljT3ZcXFFWYXNGYWs+XUZob1V3cER5X3BmWmJgb2ZgXXBeZ1JWajtBW0ROW3Rhb3hAb1JAbVJWYj1XcnBoZ1VxXl9mXndvdFR2d1l5cUlvYkpOdVVZdXlvZmpQaGt3d1hpYV1WXl1wYGdPdXZvd19hbldWYXA/cFJfb3hoaXVxXFxRdlxcRUlfcGZyUmlwZXdcXE1Ic25faG5fX2ZeP29pTkVVU0VldVdpdTtCdkF4PXlDbFljR0NzQ3BWalxcblVsbl11ckhwbmBwbkdwWDpBVFJIcm5Uako9T1ZwUXdNUTo8UXRMUXBkdkRtWHhtWXhhb1NVcEJ5eVZFWXNFWUQ8a0ptdUxZdE1ZUW9Ndz5xVm14TGdMVU5hbG1AeWdZdXFoTVZcXE06PFZwYXdTeXVAaWxpWXBhdXNkPVdiPU1VVE1pWXVxeG9LcXduUXVUX2ZUaWpgcG5gSXlteXZPVlxcW2BlQ2BiXFxAajpAOltFVltFaHV1eGd1YmV5PE9iPEdpbXV2ZEdnY2dYZ1F1b1lDdG9HeG9oRmtiXFw/Z1F1Z1hFdVJBdWJHZ2NHeXVZeXFjdmZrZU5fZD5td2JTdmdpd0d5dm1pREpDZnZneXF5aXlpdExRdGRVdGBnc2l5aXlxdWJ1WUxlVVdldVtXUkFfc0Zhc3JbRUhVWGhPcl1jRkx3V0BTUktddERnRGU7ZUZtZlRPZVR3ZmF3Vl1nZGtTYmNtZl1zUkg/ZFVJY3RXUXlcXFlyQXhVeXBpVXdPPUxEZGpRdW9YZW13VFlwcHBwcFBBWHJDXFxLRlxcTEJcXEpERUtPbU1EVVNFdXZHWW1hcG5gcG5lWG9leXdpeU1PZExPQXg+bVVMTVRsPXdKSW5bVXJASEo6dGxFaVFwXXdSUFBcXGRsUWB2XmFWbERMTlF1VFFZXXFyR0hvY0hvR1R3dmRZdGFYPXFqR2RtdGRYPDxaQXZbaF94cWdqZEdhc094XnZsRWlaOkhmPXFqd095Sj5nT1FvT3ZqPUllbGBmQ1l5cXl3eUBmP3dlW29aPUdkTnZrQVllbkBnS0ZpYG90VkhhbU9eXVZeVXJzRVdjRXdLWWZBdVJIX207QVZuaFdVcVByPFFSZVhpeG1wXFxsTFBsXFxndE8+WmZmX2d2dGl4ZVlQbExQdGpwc215VnlleE15Q3FqR0R5Q3lYeXF5d2VyQUlrXk1qSEFWUlxcTD9FSjpRdW9YV3FgV1NRTj1JU1RpTl9kTlZtT3Fwb2hwT2NET2N4V1lxcVlwb3ZFeFxcaVJpdVdpSUxdbFJiQXdiQXNqbGpSQXVSSUo9bEo+aGo/SHNqaHNpcExZeHN5WXZJeFFIZW10ZHh2SXltbUxFaFZcXE1WXFxFVltFVlxcTVZscXl3WXlWYXVWYXF2YHFkUXdkcVBnTXVGWE1xbFdvUXdPcVRQbVREcWtRbXhMUXRMcXBoZXVUbExQbFRQbVRgaG5faFZobVdobWdWd2RRd3BqQHBqaXNVeGA/aXI/UWZrQHVIcXNoT3NOSF9FeFxcaW5kT1h1aWVfUXhfWXN1cXhnWWNFV2NNQ2M+bWJAb2JnUXVvV1dZcWl3Y1JLRUlzQ0lzRVlzZVZfZVZWa0NhPXNKR0ZFa0RmO0V3S1luT2g9Z2R3a0lZd2lhdXNYV2Rhc1N4c1l4YVVHZWtrSHBraGo/aGpjSG9jRVVTRVVYbVVYZFlCXFxrV1RRcGV4ZEdjYHZ4P05sTFBsQnddWGhxd2hpbE9obGBjcUBuc1BgbVZgcXBnV1Fpc1F4X1F0TFFkR2djR09oQj53Y0l3T2ZcXE9GbD0/bmhwb0hxdFBxaExhbkNHajtIamxoeUlxeGVGaG9Rd09pcXV3eEBhcj5hdFBxdHBwZ1dRbUVpdlQ/ZVI/YFJeW2w/W3ZYSVdUTVVUbUVYa0VlcXNXWEF5a1l2a0lSVlFnZUl3TXlmY0dnY1dkYXNTUHdUQFNCOkNCO0NCY0VXY3V0aXdVaV1oYF1XZl13ZGdUZV9WdW9YPElzQ0lXcXF3V1F4YkV5ZWdkWG9lWGtFWGtlT2dkT1dlVVdVTl1MUXVUUWF1VmFxPXVqSFRqQXRLWFxcUXI9UEVockxtWDpQeF9MTENwV1hhcXNVd1Bpb3F0V1hhdl5hdmpJeXZVTE1UbHBpd1VZVVNFVUdQTW9MU09tTXVRdFZcXFFYdE92XFxRdkl4XXlyc0hxc2B2YHhZZ1F1b1hQcXRQcXhwcXhNb0xXTkRZalh4cWhPZ2RPZ1xcUXZcXHlPWW9RXXZKPHRNWXRtdFBxRmZbR3ZcXFF2XFxhd2ZhdUZZYlpZZ0hBZkJQcXRQcXJBeXJBWWtlVktCXklmZ2d3VGlobU9obEh3Y0lXZVVXZWB3OmR2aGBxdmBRdlxcUXZEUXNEbXZBWT08Smh0bGVtZ3Z4ZGlwZV1wYkdQZE94XkpYbkk/ZD5vWk1fZVZfbVF4bFFZcXF3Z1NxYEVAXFw8T3NsaXhhP2BCZmltQXdGbmJHb2llQWBwbmBQZ2xBZ3daXmpKQkxlR2RHeFZzRz4/RDw9S0xBUD1IUkJETj5mdD1IXUZOQj1DW2N0PVJCY0hPU2VHcUZpO0lWa2NsVUY7PUNbbUI9P2xUUG9BdWtYZHl1eXhhVXBTWUtRbE9ObVhmPEtvYFhsXW1FYGpKTFJZQU1QVGtPQG1SQFVXZVVnSG9jSG9mQVVKTFdjQXBJbEpbXFxqeHRLYHhPQmRZRzxQPUhSQmpkOz1DWzpjWUBfdVZhdUJBc0JRaXRPSV91Qjw/VEV1YlNbQzxMZ19pdl9pZXVwaG9BeGpBZXVwaGdQcF1HYmJobj1hW0BGXj5QbWRmYXdmcWRQb0Q+WlxcT2ZcXF9sV1ZbPGdfVzpDRj5fTEZDW1tab2U7QT5QZ3Fhdj8/W3c/XUl4cnVPeF5JQ2tFeFtYYkFUSXNDSWNCaWdpcG9QdE1ZdGlrVXRQRFFzRHFZdEl3YWRKaWhNW1xceG9Zcng8TT5AdEFcXHdTWXBBaXNHaXNXaXV3dXRoaFU/aWJPXnFweVxcaW5lclZhdXZbU05gXkd1bGhmQ0djQ3dtaGBpYkF0W3Bxd1d5WG9xdkdla0Zwb2BdZXd0aGhdcj5oWk9obE9wbFhaOz93PUFgPUhiQmZpOlF2P1lrTVhsTVhpcGF3Q05kSV5mUD9taGhldXB1dXhoSWBzUm9nbklfSklyO0lySXZdeF5ha092PlBiPFdnY15eTEZzaGhldXB3WGlxdUd3TGleX3dyPEB0QUh2T19ePkB0QUd3Y0l3O1dcXGxTSF1Yb2VYVU9ocHlJeEFxY1l0YXh2SXltaUBsWlBVRGxOTUhZdkF5a1lxcXV3SFltcXRTU0lwWlxcSD47Y2ZbR2Y7S3NFQVZCUXVVY3c7S1hwbVhwbXBmQGxCUFVQSGtNdE5IXW1yRFRTSVRaXFx4Sz1ZT0RLW1xceEtNd2RRd1pga2VAU1lVclRJTDx1VXNcXHc9SFJiaFJNVGs/SUxLRExbTmJMWExlWG9lWHVTSXU/Yjo/YjtXQkFLZElFd2ZJYkl5dmlpdXV3eFR0dGxZeG1pT2dkT2Ftc1ZId2VZd0V1UGxld1RpcHdUWXBhbFF4bFFkTE9Ed2VZd3VUUXV0b1hlcVRhcj5hanZNWWlxdXdoTXVsWF5xdmBxdFBxRFBRc0RRP2xKQEx1UkF1OjxSR2VTR01XZE13PXhKSUxWXVVWdXl4aXlxXkVzTGhTVXBQV01xbkVXWkFyO3hZeEl5YUR3dUlWajxNOjxMUGxMcHl0WXVZd2BZc1FUQXVSQVlyPVlWY1F0X1B5dFF5PEVuamlyRT5zXFxxYHBuYFVuYGY/X3hPbUhJbDo+WlRGcENfYjtfRFlzWV9Jc01YeXFxS0l0S1lvUGVvVFxcUGI9dEBoS1VMblxcUG5kTE9kTFluQXdrUFdPUU9BdWJvcXg6X2ZeX3ZfWGNRUGBtVmBZcGF3T3VoaEVtd1ZJaXhvaXhfVl9PRVRLRVRPZVRPdE9HZUZ5eXVpdEFRVmtvSXBXUz9PUltxaXdVeTxRcjxRZ2RPZ1hpaXV1VltFVmtLWF5YX1ZHY1E/bmJOd3l4eXd5d1tYYkFQcG1YcG9faG5vcXVxd3VIb013bkB3YkF3W1NOYD5hdVZheUtZbkFHeGtJeD9nYj93aXlpeXFGb1lHZVNHbUxQbGxBdjtZamJAb2JIZW1wZnNXaXVXdEdnZmF3ZnlJeWF5bUNJU21TSG1jWG9lWHlZeFl4WWdGRW1kSl9zSV9nYlF2P1ljW0dmW0dJc0NJP2lyP3F4cHF4RXFkZ1NGeV1VOz9Sal9YY1F0SWdXPFF1b1dXRUtDRGtFdjtZSmNFV2N3ZVl3dWNYZGF0TE9kTF92XmF2PmFyPkF3YkF3TXlmSVVXY0VXP2NCP2N1d1dZcW9ocG9YSkFmO3VJdkF4PWdob2dYd3d3T0lpbWhSQG1SeFBZb1FPZVRPZVhUYXBTRXlsaXRNbFxcVkJEeU5VVVVVVVNlTXU9d1VQUktdTD9FVGVzSj1DW29EYG9ocG9oeXV5eFlUYW9TR0NDQ0NDQ0xQd015bm1OTUhzXFxFcFxcVVZdRVM/TGxgYE1zTFg+cXVYcVlWQXFrVU9QXW9qdVhxdU5hRXg6QXI6TVRhZXNUaFBwbVhwdVdZcXFfdFdJeW15dG9faG5vVXlwaVdEUG4+TU5LPVZaPW5faG5fWWJZTmxJd213VmlgV2ZdV3JbQWhIaF11bmJLX2R2X2l2P2I6P1pDaWhwbmdWQWNhZ2JdcGJHUG5iTmtWUHJhYGNTUHBeR3NMcHV3WGlBblpAbml5aXlxUXl0RTpbWGdRdW9fZ2Zfd3hpeXVJYjtHYmBxdmBBQmpfVkNRRERPZjxNUjxdeXdpeUNJdWtBc0tXRmhtV2h1dXl1eXdRd09ZZ0NJaU1nc2B1dXJHWD1vdXZFZko9SXhdeXJVSXVTaWZfZ2ZLY1xcT0NFU0NDSXVXR3NeTUVSO0VSO01yVFhgYVN3aFFQZVVXZXVbWFJBPEpScXBnVXVBdFhjQFJaPFhqPVhSaFF1bVhXZVVXZFJLXVl4dFk/UWtPTFF0TFFuZWpyQXlySXY9eWpZYFFzTVRiXFxMUG1UUG1tdkRZbFhVcXBXXlVvTU1UTG1UaGBVU3lwaXVVOjx3T1lvUWRxQmlqRXRMYHlzWXhvZ2hvRzxKW0ReYlF4TXZeSD9lVE9lWFlxcUNpVVI9VVJTYVdwV2RNV1RnZVdnY1JLZURPXFxRdlxcUXZheXZhSjxESj9FVHZsTWldeGJJdGZsTGVhdGNYVE5kUk9gbE5AbVVYbUFdUj5ddXl4WXlkTl9kdk9Zb1F1c1l4UWlBdWtYTjo8eXJBeVZNcW5FV1tRcj9gVk5cXHQ7WEpBPE9EUHVrWFZBZFk/RU92XFxRVklyO0lWWGFxc1VPUW1vXlRWd2hLRlxcS2xUUG1EdzpRU0RNU1ZcXE1WbFJGQE07bXFPdHNZeFFxUGA/b3h5SGo7SGpbSG5bWW5Bd2tURnlkT15uSWhjRl9jXnZlX2tTXls8Z19Rdm1JeXBsUHBcXHZ2VE9mR1Ftbz46X0VzS2R2Z0ZjY2JvZ2hvWWhhdXNiUUlhdXNYZ0ZhTWhyQXlyUWI8T0JgU2RzWXhJeUlFdUh1Y1l0YXhhc1NYP1ROY2hjVXRgO0JCT2NET2R4YXhfWXNRX1dwU1VHZVNHb0lHR3l1WXk9O2JPZ2RPPVhqPVg7RVI7cWRnU1VgZXNUZ1J3WWU7QVdlVVdBc0JBU3RFd3ZfaXZvd1dZcUU6a3ZJeWVJTVNQZWdUZUI6U2dQZWdcXFd3bkF3S1lCOmtCRjtFSl1UTl1SUUtkW29pWG1VWF1YQ3lneW95RDtCUW1nVkVmRU1IbVNIU19TYHNiPUlHZVNHdUF1SFVnaG9vS0hsa0lwSXVrWGRRRG5deW5pZmZlYndnaXdjWF9dcj5oOmhyXFxnckF5ckV3aXRxdkdZXWxIbV5pd09YX1E/Wlp4aXlxeW9RZXBHaGtHWjpAdEpldmd5dXl3eUdFRmtyU1loYWVmZWFTVW9IRztCcHF3V1lTZFlVUj1VQl9SXFxLeU1RYjxPQnBTZWd3ZmF3Rko7Q2xTSG1Dc0htZkdBZWtTQjpbRVdMbEZ4alxcQE9JdVNJPUpybFl2QVFzVU9LQFNOYXROQUo6eXRReWxJeXZNUFJLQFNeUXdkUVteeGNcXFZkYXBjPz5qZmF3Zk9xXl5hdl5dOl5fZl5feG5wWUFcXGRPYUZBZkpOYk5mYkt3d1l5cVFwaXVXd1BpXzo+d0xpbkVGaUVPYFJYckF4W1FZZURgbUd3XFxnTmVuUXY/WVs6Pl1uPmdKZmlEV25iTndXWXFxT15LQG9cXFBuPFdjRVdzQkFzYkh2REdzbz9sQ1hcXGFObHFgXj9GeHBxeGhUXUNFRldlVVdVd094d1l5cVlCOkdmW0dGc1Vpc1V4YD1CUnVpeGVJV0VWSkFmO11mZT9SdEVHTEtnV2dlV2NVbGl1cXV1Oztibk1YQEVUTnVmSGVlOjtGb2NIb0dWUmlTO21XeHdoaGV1dENjPk1SUWtEUXNETV1ET01VVE1nX2dmT0FIb0NHY0NHOztCaHNkRW11QHlyQVlCOldjRVdTd09XXXdSSW9kSHloQj14aW11dkdkaFdocXV3WD1CUmNJdF14R1llcUNCWk1yPkdDb1FFW2NZW0NYa0VYT2VUT3V5dll4SWNVeD12OklCTF9SUF9kTj90P1dkYGNTPDtibXV2SEl0X2NnVXVoQDtiUXlnWVVTcUdFVEtFRE10VEt4UE1GSz9XYj1XakNlRkV3RkFVWjtEakNlRlFZPz9Dd0VFdFNiO0lYajtDb0BzT1BqVmBtVnhieW5jSG9jeF94YklcXDo+bFlQdW5WZE1XdHRXY3NHaXNndXZIaW12XmF2bm13dkhhZWhibXV2SEdoa0doVVdtW1hSQVBxdFBxcGV3VGlMOkx2XFxRdj5MSjtEWVd1a01YbE1pakV0TExUTE1Ec1VNUGFBa0Zga2M9c0Zhc2ZwVUNBd0t3c1l4YXlpdXV4aHZvYVlXZVVXbUZWeUpwXVJQYlReYG5eYE5wZURgZXhPb2JAb1pYYz5RZms+WnZ2aXhhdUhxc0hwX2Zgb2ZgYGxOYGR4YGRYbmNhdVdpdVF5T3l5bll0SXVySGdFVWtJdj1pVVdlVVdnZVdna0doaztCPl1SPj1DPktCdFFlS2NjVlV4XFx3QmlEclFZeU08dF9hVm1EWXZsdV15cklISlphckNOZW9QZ19obl9oYmRhbl5gbkp4Y11XZl1HWlp2YXl2aWVxdGdQcXRQcW5xc1tAX0RgZEpxdFBxXlFobjo+XltGXltHc0xoXnRQcXRIZltHZkBvYkB3XVZXbm5HW0NZZmJvWkBuWjo+ZFNHZUNvdUxgdEdPXktgcXZHeUxwdWtgaXh2ZVxcRmxGPl1qPnZNVnZBQFxcdGFlcnZcXENGblBYY1xcRmxmYXVzWHBFd2xoVnRgaGNlZl9nZnhwcXhYSXFtd15uRmZ0YWhVcGBnP1o6d2VZd20/UWZXd3F4Z2luQXdLUVxcQ2B2bGl2RVlrUXZfaHF0Z1hlYXFzV3hdeF5pUj9lUj95a2hyZ15fZj5aWlBvZFBjdEBwWE9ya0lbXnBudFBxdGZpYHF5Wk5pTmlfO3duQl5wa1l2QVlaOnF1d1hpZU9nZD9jQ0lyPXhaWXFxd1d5dXl3eXhpa0FhTXFpd1VbR2ZbZ2l1dXhoO0diO0lsXXZCYW5hVG1UUG1IUE1vTGtBWXZfdVZhVXJ5eFBzSFdiWXBgYFVLcFNXPEpqXFxQblxcbFhJS0htU0h1cGhldXR0WXhhWUtFVEs8SmJNV2RNTVI8TUJ1TkdUYVhpeV5JU015U0NEU0VVU1VmQXVLUFRraVxcVXJAeDthWG1IbnRVUXBwdXhQVmtAVV11ckhoSjpoTXVsWEpATmNMa3RJeWF5bW9gcG5wWGlxZWNZdUJAZF1AcEluWltwbGV5bFlvaVN3cGhndUBpa1V2dGl4ZUlPY2xQcGxAdllJd3k+WlpGbEJvYXJAZlhvZVg+WkZmXXReXFw6TnFvV3dwR3lsaWZLQGNOYGxOYFxcT2ZcXG9Pdj5Ja0Zhc0ZJd015bmlYZXFwWzpOeG1ZeFVuX0hvXnJBTGtHdll1UUt0SnlmUXF3YHF2QE12XmN0QklzTE1pO0V3TEtZXV9mUWlETltEPmFWbHN4aGl1ZVVWXVVIXj1zSl9nZmRwb2hwS0VUS21XaG1XWVxcVWlEVFdlVVdYbVVYdXNYaFlWb2pGZjxhakNWXFxgXmxReGxBaXI/aWJBd2JZVmFwX19cXE5eXFxXc1BoX154c11pdGV4ZG9Rd0VgYlxcPmdKcFxcTllbWHBrVmBnZkZ3c1ZaOkhwXXdycF53W1ZqeVdhVmBDU2RzV1hhcVlcXFVVRFlzRWlpdl9pRFFzRHFYZ1F1b1tXUkFoSWtna1lDcF13S1dGQV1DR2NDQ2FCcW91d1dZYV9mXj9FVVNFYWtGYEtka0lTQkNzRGtWajtDb19VXl1TaENFaEFSTllJc2N0UHF0eD1YO2FiPl9CaHNkZVl2XVlkTVdMb2RQb112QklsZm1QdT12OklqPXRKSFxcS0ZcXEtucHBwcHNHaXNXXFxQYj1MRWhyZFxcT2ZcXFNJdVNpUXRfWGtuUXZzRFFzPEo6bUpwPUo6ZVhvZVB3eW9uTFhkdVdybU9JPVNCPUo6TFlsPFBTPWxoeVJbeFVFXFxKPER3X0BTW2B4UERwUl1vOkBqOmB1VmF1SGVtdGRTUkBQO3VVWXVxWGl4S3BqcmFZeHVsaGRVbFl4bXlQaW11VlxcTE5cXHRqUFI+XVI+dWtYZFFGaXNHaXhuYXhAcWtXVFFwXXdSdU9pdE9JdEtJYHVWYXVDWWxhVEo6XVVWXVU/ZVI/YFhJXUtTYVNURHdGSHZtSXlvUVV4ZXl0aVBXdHFrSHBrSGBdUXZcXFF2UkF1UndheXZxQEhmbnd3WGldOm5nV1FxX05cXENwYVBZcV1OXFxDYHl2YXlMUXRMcV5Jb21WPj1LdF95R1ltaV49SFJrSHBrSF51Y0N1eVc9d3lfZEhvY0hjVVJBWEFRV2VVV0FjQj9jRE5bRHJReXRxeGV5dElBc0JBU3RvSTxNaDx3VEs/RGRFaUJtRjt1Q0dDR2lzR1lFaFxcZWJuZUJsTVhHZVNHZWRoW2l4ZXFyQHFyWGxhdFNkPVdiXUxQbExAdWJQcHlOQXI6QW5XV3FwV1pAXltaUWhzWGBhb3M+PmpnVmVwdFBZWXdRcVZtT3FwVURMdGpWXk5OWzs+Xl1WXj1PeVZ2eXhpeXVpa1V2YEBeWj4+bFg+XnJ5eEZOX3c+cj9gYD93a0ZBXkJpYmVGd2BQZ2VXZ3VneGRpeGpJdj1pbGV2ZFRPZVRvYFRwcTo+ckV4XFxpPmNpUFxcd1dwUFBpTFBsTFB0TFF0XlhjQk9gW0F3YkFhXFxfckJwW1dOYU5vZFBvWj5eWkJ3bl93bkl3bVBwb0lPckJnY0dnaXlxeXdmZXJoaXVxeEZEPW91YVtTYFNYS1FmPz1Cam9XV2RLdUVxPkxKO3hwcXhwU0htU21ZeG1RUzx2VnV3TT1KSkBjYG9zVkhdS0ZcXEtZcXF3dz15aklWdHdwZzo+aGBVQF9WRV1WcWtIVkloTGlGanlXbGdGV0dydll4SXlJcG1YcE1JdEtJTXNGSF1obl9oPmF4P0NzQ2t4O0FuX1FNdjxZaj1Zcj15TklvTWV5d2l5c11RWE1XZE13dkl5bVlyPFFyRFRLRWRyXFxFUEVocmRUT2VUSjpoUGVtdHZAWWtRck1ZdE11VVl1UWtEUGtxeXdZeUNJc0NhVlppV2tFWGtpckVOeXRReXB5d1l5XTo+X0RQYXI/eFpHZEtHXFxzVl9pUXVvWF9tVmBtQXlrWVZvWGdxdGl3VUlJdmo9R0RPdXBnV1VpeXV5eGlnVXVvUmhfWEpdRD9tZ0RDZG5NU1RzY0FZQjpfZl5fZnhnWXVxR1hdaXJnWXVxeD9nYj93ckl3RVlhaXNVaG51aUttV2htR3ZZSTttYjtBVk5hdE5haXdVeVBLRVZ1Z1tDRUZDaWdxRXNXQkdtWHBtSFNTZVxcUXZcXFFGV1lTPlFWa191VmF1QGljVXNUaVFzSDtTbz1Dd113RHNUa0VYa3F3V1lpdWdwR2BLOm1vZFBvVEVxbGVuTVhsTXhxeXhRVWhzeERYXFxhcmpJdj15eXRZd2l4dGl4VUlFbWxkUkdlU2dsUXhsbVZpaj9wdHhoWXVxWGdRdV9pdl9JUXRMUUhVbXBkaztBVlZhcXNVdFVZdXV4U1lwUXF0V1hhTnNoSnNZblZpcXV1eFRpcGVlVXVwWFdtcXZFcV1Ybl1IajtIUkBtUkBxcXdVaVJJcF14aXlxeVFuX1Y/aHF3aHlpWHhwaGV1VHhQaW1tb2hwb0BUYlxccWtVdkBZdkF5az1Zcj15bGhkVXRNeF5JU2dlV2dpTXVsWEp4UXFEc0VNS0VUSz1VUj11ckdYTWFsTEVIc0JtTmxYa0JxbktgeWlUUXVUbUZBdUxwdWtIUXNEUW9kUG9cXFZieHddeFJJQFl2bHVTWFBhPVl2bG1uQVJmZUtHZGtrWFZBUXRxaXA9PW9TQE1eQWpWVXFwZVc9eXVDPUtbeFdVRVNDRXNmSXVteHdYaWE9SXZGR21sZmZtcXZHaWo/aGpecXdrUHdkUXdFd2xoZnlreXJZdlxcZj5lak93TklvakBwalBzRFFzSGdtdGZ5cll2SXBpeG9pbnljcFlNWWV1b1hnUXNEUXNkT2dkT1dNcWZHU2I7QXdReWdZcWJHU0VCYXdVO0JiZ2dnZ3Vtd253VFlwYVRRdVRVUXVUcXRPaXRvWXdRP2RKP1xcU2ZrdVd2QHVSSWhdXVh5P0NFZ3JkSXVtd0Zzd0ZHO0JKR1luY2ZfZ2Z5ZXlveURzZ1lnYXNTV0hxa1dWQVNJT0JDPVNCPXV5d1l5Y3lleWVHcFBrRFBDWXNFWW5tYUtnZE9naG9VdXBMQFZMWXRNSXNKYU06PFhwbVhgZFlSdFJJcE1XbXBmRW1CXU5cXFR2dlVXZVVXY1lzcURqO0hqR3RSWHBOX2ROczxRcjxKOmhxd2hZbE1YbFVyV015VXlXeWhqQXhqYXVWYVVwUl1PV2RNV2xLQVh2ZVl3dUBXS1FOdFFUSFlsYXRTeG15c3l2XmF2Xm1QVWhRbj13SnlteE15Q3hzYVltVVhtVVF1VFFsc3F1Ojx4akl2PWlWRXFsd1xcWXJBVGJcXEx0PFFyXFxXV1FxT0lzQ0lXV1Fxb0V3Y0l3ZE1XZE1RdExRZW10Zkh3UklwXWBSXFxEUWpHal15ckl4YXdPeU5fX1BWZVVzaG1XaFVDUWtHXndyYmFpc1V4YHl2WXdZeG9YZ1FVO0VSO1V3UGlndWV4ZGl2XVl2bWNZdGF4XFxRdlxcaXZFeWR5TXZFR0hcXF1yQj93YkFXdD1XRW9iQG9iaG9naENlb2lTYll3ZXlFdjtZSl9peEdYXXFCc2VzWj1IYGtTVj9JaF11ck9pdE9pWW1Zc2lWbXF2R1FFVEtFXk1UT2VYb2VobkFYY0lJbW12dk1WZ0FDd011TXlmSVVUTVVUYXNTWF9jcVliOz1DY0tCWXdzYXdXT294Tz9JcW13VnVkaGNVcHF3V1lHTktDY1FSSz9TbndXWTxKOkl2ak1XZE1XZGlPbHV5eGlZbHlZYmRZTVBxYFlOdz1TcHBwcFBwZD1Uc2BOTERzaGhVdWBPZ2RPeXF5dXlXa0BVRnVsbUl5dk1YV0FwZXV0aFBTRnRLd1VKYll5O0F2cjxNPkBsXFw8V2NFV09ZWUBBbGxlVl5dVkZtbXZEdVhxdXhFdjxpakxZeDtodE5hdGB5c1l4V2l1V0ltc3hQS0JgUmtUV0s9bWV0VGhgT1VtcGZtckZITV11ckhobHhgS2Fobl9ocGdVdXBkT2dkb3RQcXRkTkB4ang+YD1IQmVHS01WXFxNZlJdR2hpdGV3dEFzSWdPZ2RPRWo7VjpDRU9JRmlddmxRQ1NLZnVpQ3JXWGFxQzo7ZGFpRk9ZRk5La0lFTjo9b3NBUD1IUkJkcD5dVl5MUHNYeXhlUVF4T1ltWW1xZllvaXNpYmtGbEpgW2BwdXdpeU53bGdob2deaV53cnhxeXV5d3RQcXRYZ1Fxb09faEY/d1VmalNeWzw/b19OaGo/aFJoYGVvZF5fZl5Rbj9Xa2JJaUVRWjtAZnlxeXdZa1F2X3hWaXBhX3M/cUxQWkpgdT94cl1paVV2bE1geXZheVZobVd4aXVpd3FoXXVuaEpZamZYc0RRc1Bpb1V3aG5Bd0tBc0JBY2xBZkhfalR4W2FXZF1ealQ/bz14WklOcXJAcT5EW2N1dXdYaWhpdE5hdF5cXD9HcXRQcXhGaWxhbmN2eEBIZ3hGbko/YWdPdW5geG5haDo+XFxDYGJocXdocWtIcGteSWpYUW9FWHJbYWJAb2JYXmFyP3h2SXltWWlxcVdbR2ZbSG9jSFNhV3BBZ0tVZkxVVE1lRG1FVkhjaEo7ZTtBRj5AVEZtTm1Nc05IT01tbkZFVFA9SmRRd2R5dkhpbU1tdFRpdkFVVE1VUFo8Tlo8XjpQcD1GYllBYXZQaz5AXFw8Z2M/d3VCdmJ0cV5wQFtbZm46YVtARl4+UG1kWGNRcF9eSXFWWXJBeFtRb2hmPltvYGhyZ1xcQ0ZePlBtRHdkUXd4c1l4YUltU0htPW5aRj5kcF9fQkpGQVZKTFJiWVBuaFdVcXBnVXVwUHNIUEpbXFxqUUVsSkxSQkROXlBqalRqO09iQkY+QVZAU0o+QEw8TW9BVFBSXFxqSkxSQkRvWEZyWkI+P2x0b1o9PGVAQltjPEI+OjpaT1l4eXdjTz5cXERmalNJdVNRc0dmWlteakpOYmJZdGxReGxBc0V4eUVBZlZhdVZxZ1ZBcVtgcXI/XFw8PztDZmBDWG9lWD87QkBjUktNc0hfQltbYkpLUmJZeFpBSVJbYkpLUkJDZ1hbc1o9bEpMUkJleFptSj1AXFxKYmRJckZrQltbYkpLUmR3Qm07RT5GPjo6Sk87XFxqTnVzYV1WakxWa0BRaXRPaUBwakBwW2lTalFPZExPZFF3ZEFzZUVsQl1yXUl4Pk1OS3lyVElMQ2BSc0VZc0V1U0l1b2hwb3hNZkBSUVhTXkxMWHRrQXVwdklSTERrXnRQcXRwZFBvZFlMb014bFFoYHF2RF9eTHhjTkliQkY+W2Y8TWVOR3JOW0ROW3NYbHBVWG1VeUt5XFx5amRYZGFUV2RNV0hsXXRSUGVUT2VqP2hqZ2BVc1BYSkFuO21qQHBqU0l1U0l5c0l5XWxSRkBUUXVUaWV1dGhweHBxeGF4Y1l0bVl4bWluVUlTRl1TblF4bFF3UXlvWT1WWj1uWXhtWUhwa0h4VkhRbT1TV2BrRmBrV1VxcGVzVkhRbVhWQXFreWx5cllOWXhzWWBQY01sUHBsUFV3UGlvVXFwZ1VxZGV0ZFBZY3FrPk1Oc2xYZkF1UkhQXW1SSXBNZ0l3Y0lvXVhuXVF3ZFFZbGF2Q0F0SkF0SlNmXVdmO0JKXURvPXdKSUZRdVRRaVJFb0RzSXlzSUVSO0VmW1VyP2h2X2lWbVh1dUNbW2JKYGw+UFdGZVhvZVhhcGM/blpATnRfdnhpeXVRYXROYXZrQWlDSGtDeG5Jd21gP2BSPlpKRlxcS0Z2ZFF3dFhpcXF3TXluSXdvVkdxTHdjSXdbOk51cXhnWU9lVE9jUFBhbF92QnBqQHByT1hfUT93cG9fVj9xOlFma2BzRmFzWHdxeGd5bGl2RVl2QXlrVUl1U0laOnhxeXhxUXhsUXFuR1dtSGltdXZwZ2NHQXRKQUQ6a3ZHWWVBdUdSdVRRdUh2PXlqVVNFVXNcXE9mXFxLVGxZdWl1aUtnc2tNWGxNRXRbWGJJdF13Uj9LQjtBZWtTVnZfaXZPZ2RPZ0JlZWI/Z2JrQj1HVml1V1lVVVVVdWJxVF1bYkpLUmJZV1BBWUBTWHNReF89QnI/WWtEdzx1U0l1c3RCc2VnZVdnRTtCeG1ZeFBSW2RVW1RQbVR0QkFzQjxKYF1zUkhSS110TXluSUVRVmxzbkhXTVF3b2xNUjxNQjxKSHFzSGF2Z3hxeXhROlxcWGdRdW9pd1V5cG5lbXV0WGhBSjpwb2hwT1dNWGRhdGM8SlJxcXdVUVdNTktAU3RoWGVxSjp0bGhkVVxcZE5tcXZHWUo6YHVWYVVjaXRzWHF1WEo6SXFtdXZUZHVkXWpKTFJCZFlHUU15UGs+YVZsREpadXNYaFFTSXVTYVhbPVlyPVFFaHJcXHRvVWVwZGVKOnRxeFF5ZXRqPUluZVxcWGRhdGNleXRpeDo8UlhEWXdYWXFxd1RRdVRJTF1sUk5ZV3ZFcjxoSjo8WGVxdGd4VklxbUtgUD88SmBwU1dQdWBoU1VMcUhBcjtYSkdga0ZQT2RMT2RMX0pQXFxMcV5jYGNqPl1GcHV3WGk9PlpjWHh4aXl1WWZBcWtTPl1SXnBld3RIT2lvX15FSWNGX2NmX2hlSFxcPD9bW154b1ZkZV9wQFhwbVhwP2hqP2lzVXhgZ2BvZlBxbkd3bF5oYkFkcXZgcXZkUXdkbGdtQj5aTmF0TkF2WWFhQE9tVXRAO0I8Q2I6O0JcXFF2XFxBQjpXc19xdGVXVmdlV2dXZl1XVFNFVXNheGNZdGhpdXVXaFNhVzo7dFBxdGh3VEdVU0VVQzpLZ2VXZ0NtdDxtdE9fZE5fSHFtd1ZNaUhtV2htZ2BvbltYYj8+akF5a1lWWz9QYnBWbXd5bXlheUFXY0VXY1dnZVdgdHNfeGJJXFw9SHJaWGhpXmpKTkJNR2RHeEZrUlF1VHFxeGdZdXlneXBZVW5dWG5ZeGF5c01ZdE1ZYj1XYm9heG5Rcj1ZckFjQ1RbeENnQkNtdVpVVl1VQjpjVl9lVlpjSENBU1RnYj9nUmRNV2R5ZmFbRUN1eGhBQjphZ1NVaEhzRXhbWWRhTHhtWXhVUkBgS1tAT2RBdFtOXFxMTlxcSGZddF5mZE9nRD5adm5dSUJ3Y0l3Z3Rld1RRWXVQb3hnWXVNSUNHS1JCQ0Y+X1ROVXZTW0M6O2VVV2VpYXVzV0Q6a3V4Z1l1VXZAaWNnV1VxRFNDRXV2SFltXVZeXXZhbGxEQXNCQUo6SGxddFI8PGpDSGtDZVI/ZVJQbVRQRHddRGxgbExFSEo6UXVUUU06PHNWXFx3QFh0WEhPRFBKOkxRRUl3U1lwYU1WXFxNdnBoV1VhdVdpdXV1eGhpT1BUa2dcXE9mTGxMUGx0bXhmSVNkXFxwZ1V1UDxKWHlxeXV1bXhWSU10P11qSkxiPHd1THByQUlyPl9iPl9yPmFySnh0QG9iQFdsYGZjREhrQ0h2aj9hdm9heVl0RW5teGZpVEFyOkFmSGFtcz5aWkl3Y0ljVFBvUXdiXFxGbF5hdl5BZVRPZXQ+YXI+WjpnY0dnWzpeZFF3ZFFZb0BPY15YcWpPdW9YZ0FHZE5xcGdXdWhpdXV4eFpJcj1YW1FuX0pJd0U+Wm5Bd0tZbk9Xb1BfaXh2bUhgXVteako6YUNgP2diP0d3Y0l3eXlnU3JeTVNeS2RrU25LcE92dFl4YXFuWXVtdXZIaVJBdVJ5aXlxeXVebVJMUXdPWW9HYGtGUE5cXExOTExMTFxcbmVoaj9oak9hdE5hSkF0Sk1IcGNcXE5NRVl5cXl3ZXFSPHNHVHdeWFBVdFhxdXhKQXRKSV9IZ3laX3N0UHF0WGtRdl9APmpzV3hgaXFyR3g8T3ldUGo8UGpxd3dYaWB0PGRJUHJscXZHd2pJdl1wPmBqPmhwb2hwVmBtVnNGYXNGPltCPl15bml2Rm1CZmNteXhxeWF1b3hmQXRbWGI/UWZraXF1d3hyYGVoWXRhVExvaTpUVl1VdmpBeGpNWD1McVpBdlpJS01sTjpWY1FwXz9uWkBubXhmaXRfckJIXFxPZlxcT3ZvWXdxYFZgTHBdeF5pcmF3U1lgRVdjRU9pQndfQ0FmPFlyPWl0T2l0Z2BvZkBaWkBvYkBvaHBvSGF1VmF1UHF0UGBzUFBeZl9nZm9UeXRxbXdWSVlNcWZHdWdYZWl0c1l4YVlpb1V3b0ZIXWVSWWdRdUdHY0NHd0ZJbWVec0Zhc3JBeXJFcVZhSUY+P0Q8PVNDPUVOVWJBXUJOWVhlcXRnV3dReWdhdVZhdXZgaG9jSG9jQXRbWHJOSW9NZW51PFZmXFxPZkxYbE1YcHhXWXFZXXFiaXF1d1hwbmBwRj5bQkJGO0VKQWhjT2hsT2g9dWJIY1I/ZVJPW0ROO1hzX3V4YHhTXXBiRUxTQHh2dXdYaXF0RWs/eG5heE5zSHJXQFVmbHVrWFZBRE9OYXROYVVsYFZDPEp2cFl3UXU9WXI9YHVKdEs6XFxOTERTc094UXhfWU9bPk5qSGhddW5xdkd5TGBbUWlxdGd4ZEl5bXl2bVZgbUZlZm5sZ2hvZ3hqQXhqUXhsUW5zP09iQkZePmBkV1d2U15jXUBjQFZyXUl4bml4b2lmTFZkXVBiPE9iUF9vUkdwa1d2QE9oVVFhVEdiO0dqPVhqPW9lWG9lVl9lVlhrRVhrXFxPajs/W1tCXj9ZbDtZcGNIU19TTmF5Rj1nQ09HZEtHUFtHUj10a1dWQVFZY1lLalRQbVRNeWxZdlxceXlZbVdJTj5ATDw9d1VZTj1gS0BgU1pMTnlRTzptWXhtWU9lVE9kUTxxblh4VGlwVVNNVVRtWGlxdVdFUDtbSlBkQmFfPUhuaUd5aXZnUG9kUG9mYG9mQ0ZbQ2Z4WF5pRz5aa0Zga0ZAaHF1dXhMWFl1UU4+QFxcSmVkbVdAU1RXZVVHbUZzc0RPY0RDUUZYb3JrPUlWRE5bZHBvaHA9bVpsR3lsaWZYdmthblxcRVhgbE5gcGZnVGFwbkd3TFlbUW5fcj9pcj9fYE5cXD5AXFw8P1tjVmNtcGJscW9UZ3BkSXdNeW5faG5fQFpaWG9lWGdmX2d2T3dOSV9jSXFHUXhNP2VSP11MTlxcbEF4W1liWHZrYXBvaHBzX1FoQWFrU1Z2aHF3SHhoWmliQkY+b2Q6bUJtRWRKS1pKTmRqZmJueWxaXmpKTkJNaG95aTppaE89WFhBVkRpV3Y7Qjo7QjpNVEtXREtXZ0o7ZVo6Ojo6OjM6XCJce1x9<Drawing-Root>LSUrQU5OT1RBVElPTkc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZR0YnLSUtQk9VTkRTX1dJRFRIRzYjJCIlcWdGKi0lLkJPVU5EU19IRUlHSFRHNiMkIiVTRkYqLSUpQ0hJTERSRU5HNiI=</Drawing-Root></Image></Text-field>
<Text-field superscript="false" placeholder="false" executable="false" selection-placeholder="false" italic="false" size="12" bold="false" subscript="false" family="Times New Roman" opaque="false" underline="false" background="[255,255,255]" readonly="false" foreground="[0,0,0]" alignment="centred" firstindent="0" spacebelow="0" leftmargin="0" linespacing="0.0" initial="0" linebreak="space" rightmargin="0" bulletsuffix="" spaceabove="0" bullet="none" pagebreak-before="false"></Text-field>
</Group>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The <Font family="Courier New">Keccak</Font> sponge construction is the special case of this algorithm based on the use of  the <Font family="Courier New">Keccak</Font> permutations <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>] (which play the role of the permutation <Font italic="true">f</Font> above), together with <Font italic="true">multi-rate padding</Font>, described below.  As mentioned in  <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>,  the design philosophy underlying the <Font family="Courier New">Keccak</Font> construction is the so-called <Font italic="true">hermetic sponge strategy</Font>, consisting in the use of the sponge construction for obtaining provable security against generic attacks and calling a permutation that should not have structural properties with the exception of a compact description; this philosophy is explained in detail in <Hyperlink linktarget="http://sponge.noekeon.org/CSF-0.1.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Csponge</Font></Hyperlink> and, more specifically for the case of the Keccak permutations, in <Font underline="true" foreground="[0,128,128]">Kmain</Font>. There are seven <Font family="Courier New">Keccak</Font> permutations <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font><Font encoding="UTF-8">]: (\342\204\244</Font><Font subscript="true">2</Font>)<Font superscript="true" italic="true">b</Font><Font encoding="UTF-8">\342\206\222 (\342\204\244</Font><Font subscript="true">2</Font>)<Font superscript="true" italic="true">b</Font>, of widths <Font italic="true">b</Font><Font encoding="UTF-8">\342\210\210{25, 50, 100, 200, 400, 800, 1600}, but here we will consider only the values of  </Font><Font italic="true">b</Font> which are multiples of 8, i.e., 200, 400, 800 and 1600. The reason is that our implementation will be byte-oriented and so all the bit strings or bit lists we will handle will have length a multiple of 8. This is not a very serious restriction because the usual messages have this property and, on the other hand, the lower values of <Font italic="true">b</Font> are weak from the security point of view and, in fact, the only value used in the SHA-3 standard is <Font italic="true">b =</Font> 1600. The permutation width <Font italic="true">b</Font> can be written in the form <Font italic="true">b</Font><Font encoding="UTF-8"> = 25\303\2272<Font superscript="true" italic="true">\356\223\201</Font>, for \356\223\201 ranging from 3 to 6. </Font></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The permutation <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>]  is described in<Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"></Hyperlink> <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>  as a sequence of operations on a state <Font italic="true">a</Font> that is a three-dimensional array of elements of  <Font encoding="UTF-8">\342\204\244</Font><Font subscript="true">2</Font> of the form <Font italic="true">a</Font>[5][5][<Font italic="true">w</Font>], with <Font italic="true">w</Font> = 2<Font superscript="true" encoding="UTF-8" italic="true">\356\223\201</Font>. Here, a bit string <Font italic="true">s</Font><Font encoding="UTF-8">\342\210\210(\342\204\244</Font><Font subscript="true">2</Font>)<Font superscript="true" italic="true">b</Font> whose bits we assume enumerated from 0 to <Font italic="true">b</Font>-1, is mapped to the state by assigning the bit <Font italic="true">s</Font>[<Font italic="true">w</Font>(5<Font italic="true">y</Font>+<Font italic="true">x</Font>)+<Font italic="true">z</Font>] to the state bit <Font italic="true">a</Font>[<Font italic="true">x</Font>][<Font italic="true">y</Font>][<Font italic="true">z</Font>], and the state bits <Font italic="true">a</Font>[<Font italic="true">x</Font>][<Font italic="true">y</Font>][0..<Font italic="true">w</Font>-1], for fixed values of <Font italic="true">x</Font> and <Font italic="true">y</Font>, constitute a <Font italic="true">lane</Font><Font encoding="UTF-8">, so that the state can be viewed as a 5\303\2275 array of lanes.  We refer to</Font>  <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>  for the description of <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>], which is an iterated permutation consisting of a sequence of <Font italic="true">n</Font><Font subscript="true">r</Font>  rounds, where <Font italic="true">n</Font><Font subscript="true">r</Font> = 12+2<Font encoding="UTF-8">\356\223\201 and each round consists of five steps  (</Font><Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>). As described above, the permutation width <Font italic="true">b</Font> is written in the form <Font italic="true">b</Font> = <Font italic="true">c </Font>+ <Font italic="true">r</Font>, where <Font italic="true">c</Font> is the <Font italic="true">capacity</Font> and <Font italic="true">r</Font> is the bit rate. The message is padded to make its length a multiple of <Font italic="true">r</Font> and the blocks of length <Font italic="true">r</Font> are successively absorbed into the state, each of these absortions being followed for an application to the state of the <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>] permutation. Although this is not necessary, we will for simplicity assume that <Font italic="true">c</Font> (and hence also <Font italic="true">r</Font>) is a multiple of 8 and, in fact, we will require that <Font italic="true">r</Font> be a multiple of <Font italic="true">w, </Font>which is always the case for the SHA-3 hash functions included in the SHA-3 standard (see  <Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink>). In the original proposal, <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-submission-3.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Ksubmission</Font></Hyperlink>, it is suggested, for security reasons, the use of  <Font italic="true">c </Font>= 2<Font italic="true">n</Font>, where <Font italic="true">n</Font> is the size of the output hash and this suggestion has been followed in the NIST standard. Thus <Font italic="true">r</Font>, the number of message bits processed per block permutation, depends on the output hash size. This way  the rate <Font italic="true">r</Font> is 1152, 1088, 832, 576, respectively, for 224, 256, 384 and 512-bit hash sizes when <Font italic="true">w</Font> is 64, which corresponds to<Font italic="true"> b</Font> = 1600. As far as possible, we will keep these notations in our implementation. In the NIST specification in <Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink>, a more general version of the Keccak family of permutations is described and, in particular, the <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>]  permutation is equivalent to NIST's  <Font family="Courier New">Keccak</Font>-<Font italic="true">p</Font>[<Font italic="true">b, </Font>12<Font italic="true">+2l</Font>] so that <Font family="Courier New">Keccak</Font>-<Font italic="true">p</Font>[1600<Font italic="true">, </Font>24], which underlies the six SHA-3 functions defined in the NIST standard, is equivalent to <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[1600] in the terminology of  <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>  that we are using here.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    There are many possible choices for working with the data involved in the algorithm and, in particular, the lanes in the state might be represented by decimal integers, by hex strings, by lists of bytes or by lists (or strings) of bits. In this implementation we use integers to represent the lanes and the bitwise operations on them in the <Font family="Courier New">Keccak</Font> rounds are performed with the help of Maple's package <Font family="Courier New">Bits</Font>, with the exception of the cyclic bit rotation, for which we use the function <Font family="Courier New">Rot</Font> defined below.  When converting between bit lists and integers, we will use the little endian convention as suggested in <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>, so that bits will be enumerated in ascending order from the least significant to the most significant one and the number defined by the bits <Font italic="true">b<Font subscript="true">i</Font></Font><Font encoding="UTF-8"> will be \316\243</Font><Font italic="true">b<Font subscript="true">i</Font></Font>2<Font superscript="true" italic="true">i</Font>, and a similar convention will be adopted for byte lists.  </Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">Requirements and copyright</Text-field></Title>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">Requirements: Maple v.14 or higher

<Font encoding="UTF-8">\302\251 (2015) Jos\303\251 Luis G\303\263mez Pardo, Carlos G\303\263mez-Rodr\303\255guez</Font></Text-field>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">Initialization</Text-field></Title>
<Text-field style="Text" layout="Normal">    We start with some auxiliary conversion functions that will be used by the <Font family="Courier New">Keccak</Font> algorithm but are not intended to be called directly by the user. Thus <Font family="Courier New">bytestohexstring</Font> converts a list of bytes (as integers in the 0..255 range) to a hex string and <Font family="Courier New">hexstringtobytes</Font> reverses this process. Similarly, <Font family="Courier New">filetobytes</Font> reads a binary file to a list of bytes and <Font family="Courier New">bytestofile</Font> writes a list of bytes to a file. Some of these functions are combined in <Font family="Courier New">messagetobytes</Font>, which on input a message given either as an ASCII text string, a hex string or a file, converts it to a list of bytes suitable to be processed by the SHA-3 functions. For speed, these functions use tables to convert between bytes given as integers and the corresponding hexadecimal strings.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Group labelreference="L4845" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2JVEocmVzdGFydEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIjpGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGTC1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR1EmMC4wZW1GJy8lJmRlcHRoR0ZULyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZQNiZGUkZVRlgvRmVuUSVhdXRvRictRiw2I1EhRicvJStleGVjdXRhYmxlR0Y9Rjk=">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JVEocmVzdGFydEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIjpGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGTC1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR1EmMC4wZW1GJy8lJmRlcHRoR0ZULyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZQNiZGUkZVRlgvRmVuUSVhdXRvRictRiw2I1EhRic=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5051" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="bytestohex := Array(0 .. 255, proc (i) if i &lt; 16 then cat(&quot;0&quot;, StringTools:-LowerCase(convert(i, hex))) else StringTools:-LowerCase(convert(convert(i, hex), string)) end if end proc):" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZpYG0tSSNtaUdGJDYjUSFGJy1GLDYlUStieXRlc3RvaGV4RicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0Y2USdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGQC8lKXN0cmV0Y2h5R0ZALyUqc3ltbWV0cmljR0ZALyUobGFyZ2VvcEdGQC8lLm1vdmFibGVsaW1pdHNHRkAvJSdhY2NlbnRHRkAvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZPLUY5Ni1RKiZjb2xvbmVxO0YnRjxGPkZBRkNGRUZHRklGSy9GTlEsMC4yNzc3Nzc4ZW1GJy9GUUZWRjgtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTy8lJmRlcHRoR0Znbi8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GWTYmRmVuRmhuRmpuL0Zdb1ElYXV0b0YnLUYsNiVRJkFycmF5RidGMkY1LUkobWZlbmNlZEdGJDYkLUYjNkYtSSNtbkdGJDYkUSIwRidGPC1GOTYtUSMuLkYnRjxGPkZBRkNGRUZHRklGSy9GTlEsMC4yMjIyMjIyZW1GJ0ZQLUZccDYkUSQyNTVGJ0Y8LUY5Ni1RIixGJ0Y8Rj4vRkJGNEZDRkVGR0ZJRktGTS9GUVEsMC4zMzMzMzMzZW1GJ0Y4RjgtRjk2L1ElcHJvY0YnLyUlYm9sZEdGNC9GNlElYm9sZEYnLyUrZm9udHdlaWdodEdGY3FGPkZBRkNGRUZHRklGS0ZNRlAtRmdvNiQtRiM2JC1GLDYlUSJpRidGMkY1RjxGPEY4LUY5Ni9RI2lmRidGYHFGYnFGZHFGPkZBRkNGRUZHRklGS0ZNRlBGOEZqcS1GOTYtUSI8RidGPEY+RkFGQ0ZFRkdGSUZLRlVGVy1GXHA2JFEjMTZGJ0Y8RjgtRjk2L1EldGhlbkYnRmBxRmJxRmRxRj5GQUZDRkVGR0ZJRktGTUZQRjgtRiw2JVEkY2F0RicvRjNGQEY8LUZnbzYkLUYjNipGKy1JI21zR0YkNiNGXnBGZ3AtRiw2JVEsU3RyaW5nVG9vbHNGJ0YyRjUtRjk2LVEjOi1GJ0Y8Rj5GQUZDRkVGR0ZJRktGTUZQLUYsNiVRKkxvd2VyQ2FzZUYnRjJGNS1GZ282JC1GIzYlLUYsNiVRKGNvbnZlcnRGJ0YyRjUtRmdvNiQtRiM2JkZqcUZncC1GLDYlUSRoZXhGJ0YyRjVGPEY8RjxGPEY8RjxGOC1GOTYvUSVlbHNlRidGYHFGYnFGZHFGPkZBRkNGRUZHRklGS0ZNRlBGOEZkc0Znc0Zqcy1GZ282JC1GIzYlRmF0LUZnbzYkLUYjNidGYXRGZHRGZ3AtRiw2JVEnc3RyaW5nRidGMkY1RjxGPEY8RjxGOC1GOTYvUSRlbmRGJ0ZgcUZicUZkcUY+RkFGQ0ZFRkdGSUZLRk1GUEY4Rl1yRjhGaXVGOEZdcS8lK2V4ZWN1dGFibGVHRkBGPEY8LUY5Ni1RIjpGJ0Y8Rj5GQUZDRkVGR0ZJRktGVUZXRlhGX29GWC1GLDYlUTFieXRlc3RvaGV4c3RyaW5nRidGMkY1RjhGUkY4Rl1xLUZnbzYkLUYjNiYtRiw2JVEpYnl0ZWxpc3RGJ0YyRjUtRjk2LVEtJlByb3BvcnRpb247RidGPEY+RkFGQ0ZFRkdGSUZLRlVGVy1GZ282Ji1GIzYpLUYsNiVRJWxpc3RGJ0YyRjUtRmdvNiQtRiM2JS1GLDYlUShpbnRlZ2VyRidGMkY1LUZnbzYmLUYjNiZGW3BGX3BGZHBGPEY8LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnRjxGPEZncEY4Rml3Rlx4RjxGPC9GYXhRInxmckYnL0ZkeFEifGhyRidGPEY8RitGWEY4Rl1yRjhGaHZGOC1GOTYtUSI9RidGPEY+RkFGQ0ZFRkdGSUZLRlVGV0Y4LUZnbzYmLUYjNiRGK0Y8RjxGYHhGY3hGOEZmckY4RlhGOEY4RjgtRmJzRi1GOEZYRjhGW3VGOEZYRjhGOEY4LUYsNiVGW3NGMkY1LUZnbzYkLUYjNiUtRiw2JVEjb3BGJ0YyRjUtRmdvNiQtRiM2JS1GLDYlUSRtYXBGJ0YyRjUtRmdvNiQtRiM2KS1GLDYlUSJ4RidGMkY1LUY5Ni1RKCZzcmFycjtGJ0Y8Rj5GQUZDRkVGR0ZJRktGTUZQRi8tRmdvNiYtRiM2JEZmekY8RjxGYHhGY3hGZ3BGaHZGPEY8RjxGPEY8RjxGOEZYRl9vRml1RjhGXXJGWEZpdUY4Rl1xRl52RjhGWEZfb0ZYLUYsNiVRK2hleHRvYnl0ZXNGJ0YyRjVGOEZSRjgtRiw2JVEmdGFibGVGJ0YyRjUtRmdvNiQtRiM2JUZfei1GZ282JC1GIzYuRmZ6Rml6RjhGZnpGOEZqeEZhdC1GZ282JC1GIzYoRmZ6RmdwLUYsNiVRKGRlY2ltYWxGJ0YyRjVGZ3BGaHRGPEY8RmdwRmF0LUZnbzYkLUYjNiZGL0ZncEZid0Y8RjxGPEY8RjxGPEZedkZYRl9vRlhGWEZfby1GLDYlUTFoZXhzdHJpbmd0b2J5dGVzRidGMkY1RjhGUkY4Rl1xLUZnbzYkLUYjNiYtRiw2JVEkc3RyRidGMkY1Rlt3RmZ1RjxGPEYrRlhGXXJGOEZgXWxGOEZqeEY4RmF5RjhGZnJGOEZYRjhGOEY4Rl15RjhGWEY4Rlt1RjhGOEZYRjhGOEY4Rl96LUZnbzYkLUYjNitGZnpGOEZpekY4RmBbbEZcW2xGZ3AtRmdvNiYtRiM2J0Zkc0Zncy1GLDYlUSxMZW5ndGhTcGxpdEYnRjJGNS1GZ282JC1GIzYmRmBdbEZncC1GXHA2JFEiMkYnRjxGPEY8RjxGPEZgeEZjeEY8RjxGOEZYRl9vRml1RjhGXXJGWEZpdUY4Rl1xRl52RjhGWEZfb0ZYLUYsNiVRLGZpbGV0b2J5dGVzRidGMkY1RjhGUkY4Rl1xLUZnbzYkLUYjNiYtRiw2JVEpZmlsZW5hbWVGJ0YyRjVGW3dGZnVGPEY8RitGWEZfby1GOTYvUSZsb2NhbEYnRmBxRmJxRmRxRj5GQUZDRkVGR0ZJRktGTUZQRjgtRiw2JVEiZkYnRjJGNS1GOTYtUSI7RidGPEY+RmpwRkNGRUZHRklGS0ZNRldGWEY4RmJfbEY4RlJGOC1GLDYlUSpGaWxlVG9vbHNGJ0YyRjVGZ3MtRiw2JVEnQmluYXJ5RidGMkY1RmdzLUYsNiVRJVJlYWRGJ0YyRjUtRmdvNiQtRiM2J0ZcX2xGZ3BGaXctRmdvNiYtRiM2JC1GXHA2JFEiMUYnRjxGPEY8RmB4RmN4RjxGPEY4LUY5Ni9RJG1vZEYnRmBxRmJxRmRxRj5GQUZDRkVGR0ZJRktGTUZQRjgtRlxwNiRRJDI1NkYnRjxGZV9sRlhGOEZoX2xGZ3NGW2BsRmdzLUYsNiVRJkNsb3NlRidGMkY1LUZnbzYkLUYjNiRGXF9sRjxGPEZlX2xGWEZfb0ZiX2xGWEZpdUY4Rl1xRl52RjhGWEY4RlhGOC1GLDYlUSpjaGVja2ZpbGVGJ0YyRjVGOEZSRjhGXXFGaF5sRitGWEY4Rl9fbEY4LUYsNiVRInJGJ0YyRjVGZ3BGYl9sRmVfbEZYRjhGYl9sRlJGXF9sRmVfbEZYRjhGXXJGOEZoX2xGZ3MtRiw2JVEnRXhpc3RzRidGMkY1LUZnbzYkLUYjNiRGYl9sRjxGPEY4RmZyRjhGWEY4RjhGOEY4RjhGXGJsRjhGUkY4LUYsNiVRKXJlYWRzdGF0RidGMkY1LUZnbzYkLUYjNiZGKy1GYnM2I1FNRmlsZX5leGlzdHMsfm8vYy9hfnRvfm92ZXJ3cml0ZS9jaGFuZ2UvYWJvcnRGJ0YrRjxGPEZlX2xGWEY4RjhGOEY4RjhGXXJGOEY4RlxibEZqeEY4LUYsNiVRIm9GJ0YyRjVGOEZmckY4RjhGWEY4RjhGOEY4RjgtRjk2L1ElZWxpZkYnRmBxRmJxRmRxRj5GQUZDRkVGR0ZJRktGTUZQRjhGXGJsRjhGanhGOC1GLDYlUSJhRidGMkY1RjhGOEZmckY4RlhGOEY4RjhGOEY4RjhGOEY4RjgtRjk2L1EmZXJyb3JGJ0ZgcUZicUZkcUY+RkFGQ0ZFRkdGSUZLRk1GUEY4LUZiczYjUTpPcGVyYXRpb25+YWJvcnRlZH5ieX51c2VyRidGOEZYRjhGOEY4RjhGOEZbdUY4RlhGOEY4RjhGOEY4RjhGOEY4RjhGYl9sRjhGUkY4RmZibC1GZ282JC1GIzYmRistRmJzNiNRPFBsZWFzZX5lbnRlcn5uZXd+ZmlsZX5uYW1lOkYnRitGPEY8RmVfbEY4RlhGOEY4RjhGOEY4RjhGOEY4RjhGYl9sRjhGUi1GLDYlUSlwcm9jbmFtZUYnRjJGNUZiYmxGK0ZYRjhGOEY4RjhGOEZpdUY4Rl1yRlhGOEZpdUY4Rl1yRjhGZV9sRjhGWEY4RmJfbEZlX2xGWEZYRjhGaXVGOEZdcUZedkY4RlhGOEZYRjgtRiw2JVE0Ynl0ZXRvaW50ZWdlcjF0YWJsZUYnRjJGNUY4RlJGOEZjby1GZ282JC1GIzYvRltwRl9wRmRwRmdwRjhGZnpGOEZpei1GLDYlUSVtb2RzRidGMkY1LUZnbzYkLUYjNihGZnotRjk2LVEiK0YnRjxGPkZBRkNGRUZHRklGS0ZicC9GUUZjcEZpYGxGZ3BGX2FsRjxGPC1GOTYtUSgmbWludXM7RidGPEY+RkFGQ0ZFRkdGSUZLRmJwRmplbEZpYGxGPEY8Rl52RlhGOEZYRjgtRiw2JVEsYnl0ZXN0b2ZpbGVGJ0YyRjVGOEZSRjhGXXEtRmdvNiQtRiM2OC1GLDYlUSJsRidGMkY1Rlt3RmJ3RmV3RmdwRjhGXF9sRlt3RmZ1RmdwLUYsNiVRKmZpbGVjaGVja0YnRjJGNUZbdy1GLDYlUSp0cnVlZmFsc2VGJ0YyRjVGUi1GLDYlRjRGMkY1RmdwLUYsNiVRKmxvZ291dHB1dEYnRjJGNUZbdy1GLDYlUSVuYW1lRidGMkY1RlItRiw2JVEpdGVybWluYWxGJ0YyRjVGPEY8RitGWEY4Rl9fbEY4RmJfbEZncC1GLDYlUSJuRidGMkY1RmVfbEY4RjhGWEY4RmJfbEY4RlJGOEZcX2xGZV9sRlhGOEZdckY4RmhmbEY4RmZyRjhGYl9sRjhGUkY4RmlhbEZiYmxGOEZpdUY4Rl1yRmVfbEY4LUY5Ni1RIiNGJ0Y8Rj5GQUZDRkVGR0ZJRktGTUZQLUYsNiVRYW9DaGVja35pZn5hfmZpbGV+bmFtZWR+ZmlsZW5hbWV+YWxyZWFkeX5leGlzdHN+aW5+dGhlfmN1cnJlbnR+ZGlyZWN0b3J5RidGMkY1RlhGOEZpZ2xGUi1GLDYlUSVub3BzRidGMkY1LUZnbzYkLUYjNiRGZWZsRjxGPEZlX2xGWEY4RmhfbEZnc0ZbYGxGZ3MtRiw2JVEmV3JpdGVGJ0YyRjUtRmdvNiQtRiM2KkZiX2xGZ3BGaXdGZWBsRmdwRl96LUZnbzYkLUYjNilGZnpGaXpGaWRsRlxbbEZncEZlZmxGPEY8RjxGPEZlX2xGWEY4RmhfbEZnc0ZbYGxGZ3NGYmFsRmJibEZlX2xGWEY4Rl1yRjhGYGdsRjhGanhGOC1GLDYlUSVmaWxlRidGMkY1RjhGZnJGWEY4RjhGOEY4RjgtRiw2JVEod3JpdGV0b0YnRjJGNS1GZ282JC1GIzYlRmJ5LUZnbzYkLUYjNidGXF9sRmdwLUZiczYjUSUubG9nRidGK0Y8RjxGPEY8RmVfbEZYRjhGOEY4RjhGOC1GLDYlUSdwcmludGZGJ0YyRjUtRmdvNiQtRiM2KkYrLUZiczYjUTklZH5ieXRlc35zYXZlZH50b34lc1xuXG5GJ0ZncEY4RmlnbEZncEZiX2xGPEY8RmVfbEZYRjhGOEY4RjhGOEZnaWwtRmdvNiQtRiM2JEZmZ2xGPEY8RitGWEY4RjhGY2NsRjhGYGdsRjhGanhGOEZmZ2xGOEZmckZYRjhGOEY4RjhGOEZlamxGaGpsRjhGWEY4Rlt1RlhGOEY4RjhGOEY4LUYsNiVRJU5VTExGJ0YyRjVGWEY4Rml1RjhGXXJGWEY4Rml1RjhGXXFGXnZGWEY4RlhGOC1GLDYlUS9tZXNzYWdldG9ieXRlc0YnRjJGNUY4RlJGOEZdcS1GZ282JC1GIzYqLUYsNiVRKG1lc3NhZ2VGJ0YyRjVGW3dGZnVGZ3AtRiw2JVEsbWVzc2FnZXR5cGVGJ0YyRjVGW3dGY2dsRjxGPEY4RlhGWEY4Rl1yRjhGYFxtRjhGanhGOEZkaWxGOEZmckY4RlhGOEY4RjhGOEY4RmVebC1GZ282JC1GIzYkRl1cbUY8RjxGK0ZYRjhGY2NsRjhGYFxtRjhGanhGOC1GLDYlUSV0ZXh0RidGMkY1RjhGZnJGWEY4RjhGOEY4RjhGYXQtRmdvNiQtRiM2JkZdXG1GZ3AtRiw2JVEmYnl0ZXNGJ0YyRjVGPEY8RitGWEY4RmNjbEY4RmBcbUY4Rmp4RjhGaHRGOEZmckZYRjhGOEY4RjhGOEZpXGwtRmdvNiQtRiM2J0Zkc0Znc0Zqc0ZjXG1GPEY8RitGWEY4Rlt1RjhGaWNsRjgtRmJzNiNRRWluY29ycmVjdH5tZXNzYWdlfnR5cGV+c3BlY2lmaWNhdGlvbkYnRlhGOEZpdUY4Rl1yRmVfbEZYRjhGaXVGOEZdcUZedkZYRl9vRitGXHZGPA==">QzQ+SStieXRlc3RvaGV4RzYiLUkmQXJyYXlHJSpwcm90ZWN0ZWRHNiQ7IiIhIiRiI2YqNiNJImlHRiVGJUYlRiVAJTI5JCIjOy1JJGNhdEdGKDYkUSIwRiUtX0ksU3RyaW5nVG9vbHNHNiRGKEkoX3N5c2xpYkdGJUkqTG93ZXJDYXNlR0YlNiMtSShjb252ZXJ0R0YoNiRGMkkkaGV4R0YlLUY5NiMtRkA2JEY/SSdzdHJpbmdHRihGJUYlRiUhIiI+STFieXRlc3RvaGV4c3RyaW5nR0YlZio2IydJKWJ5dGVsaXN0R0YlPCQmSShpbnRlZ2VyR0YoNiNGKi1JJWxpc3RHRig2I0ZQRiVGJUYlQCUvRjI3IlEhRiUtRjU2Iy1JI29wR0YoNiMtSSRtYXBHRig2JGYqNiNJInhHRiVGJTYkSSlvcGVyYXRvckdGJUkmYXJyb3dHRiVGJSZGJDYjRjJGJUYlRiVGMkYlRiVGJUZIPkkraGV4dG9ieXRlc0dGJS1JJnRhYmxlR0YoNiMtRmpuNiRmKkZdb0YlRl9vRiUvRjItRkA2JUYySShkZWNpbWFsR0YlRkJGJUYlRiUtRkA2JEYkRlRGSD5JMWhleHN0cmluZ3RvYnl0ZXNHRiVmKjYjJ0kkc3RyR0YlRkdGJUYlRiVAJS9GMkZZRlgtRmpuNiRmKkZdb0YlRl9vRiUmRmVvRmNvRiVGJUYlNyMtX0Y6SSxMZW5ndGhTcGxpdEdGJTYkRjIiIiNGJUYlRiVGSD5JLGZpbGV0b2J5dGVzR0YlZio2IydJKWZpbGVuYW1lR0YlRkc2I0kiZkdGJUYlRiVDJT44JC1JJG1vZEdGJTYkLV9fSSpGaWxlVG9vbHNHRiVJJ0JpbmFyeUdGJUklUmVhZEdGJTYkRjImRlE2IyIiIiIkYyMtX0ZkckkmQ2xvc2VHRiVGY29GXnJGJUYlRiVGSD5JKmNoZWNrZmlsZUdGJWYqRmdxNiRJInJHRiVGW3JGJUYlQyU+OCVGMkAkLV9GZXJJJ0V4aXN0c0dGJTYjRmdzQyQ+Rl5yLUkpcmVhZHN0YXRHRiU2I1FNRmlsZX5leGlzdHMsfm8vYy9hfnRvfm92ZXJ3cml0ZS9jaGFuZ2UvYWJvcnRGJUAnL0Zeckkib0dGJUYlL0ZeckkiYUdGJVlROk9wZXJhdGlvbn5hYm9ydGVkfmJ5fnVzZXJGJUMkPkZncy1GYHQ2I1E8UGxlYXNlfmVudGVyfm5ld35maWxlfm5hbWU6RiU+RmdzLTkhRlx0RmdzRiVGJUYlRkg+STRieXRldG9pbnRlZ2VyMXRhYmxlR0YlLUYnNiRGKmYqRl1vRiVGX29GJSwmLUklbW9kc0dGKDYkLCZGMkZbc0Zbc0Zbc0Zcc0Zbc0ZIRltzRiVGJUYlRkg+SSxieXRlc3RvZmlsZUdGJXQrNiYnSSJsR0YlRlNGaHE+J0kqZmlsZWNoZWNrR0YlSSp0cnVlZmFsc2VHRihJJXRydWVHRig+J0kqbG9nb3V0cHV0R0YlSSVuYW1lR0YoSSl0ZXJtaW5hbEdGJTYkRltySSJuR0YlRiVGJUMoPkZecjklQCQ5Jj5GXnItRmFzNiNGXnI+RmdzLUklbm9wc0dGKEZjby1fRmRySSZXcml0ZUdGJTYlRl5yRmlyLUZqbjYkZipGXW9GJUZfb0YlJkZjdUZjb0YlRiVGJUYyLUZec0Zld0AnLzknSSVmaWxlR0YlQyUtSSh3cml0ZXRvR0YoNiMtRjU2JEZgd1ElLmxvZ0YlLUkncHJpbnRmR0YlNiVROSVkfmJ5dGVzfnNhdmVkfnRvfiVzXG5cbkYlRmdzRl5yLUZoeDYjRlt3L0ZkeEZbd0ZdeUklTlVMTEdGKEYlRiVGJTYjIiIlRkg+SS9tZXNzYWdldG9ieXRlc0dGJWYqNiQnSShtZXNzYWdlR0YlRkcnSSxtZXNzYWdldHlwZUdGJUZqdkYlRiVGJUApL0Zgd0ZleC1GZXFGY28vRmB3SSV0ZXh0R0YlLUZANiRGMkkmYnl0ZXNHRiUvRmB3RkItRmNwNiMtRjlGY29ZUUVpbmNvcnJlY3R+bWVzc2FnZX50eXBlfnNwZWNpZmljYXRpb25GJUYlRiVGJUZI</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5036" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    The next function, <Font family="Courier New">checkkey</Font>, converts a key, given either as a text or a hex string, to a list of bytes that can be used by the HMAC function. If the string contains some non-hex character, then it is automatically regarded as an ASCII text string, otherwise it is regarded as a hex string. We have imposed a lower minimum of 128 bits for the key, so that the supplied key will be rejected if the hex string has less than 32 characters or if the text string has less than 16 characters. The maximum length will be 512 bits and if the supplied string is longer it will be truncated to this length (i.e., to 128 characters if it is a hex string and to 64 characters otherwise). Of course, all these conventions and restrictions are easy to modify and, in particular, it is possible to define a key type as hex or text according to whether we want the string to be regarded as a hex or a text string and the size limits can also be easily modified or even lifted. However, we feel that these restrictions are reasonable and make the functions easier to use. The function <Font family="Courier New">checkkey</Font> takes as input a key given as a string (either hex or ASCII) and, after checking that the string length is no less than 128 bits, converts it to a list of bytes (at most 64 bytes, corresponding to a 512-bit key as mentioned above); if the supplied key is too short, then it is rejected as invalid. 
</Text-field>
</Input>
</Group>
<Group labelreference="L5035" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="checkkey := proc (key::string) local k; k := key; if not StringTools:-IsHexDigit(k) then if StringTools:-Length(k) &lt; 16 then error &quot;The supplied key has less than 128 bits&quot; elif 64 &lt; StringTools:-Length(k) then k := StringTools:-Take(k, 64) end if; k := convert(k, bytes) else if StringTools:-Length(k) &lt; 32 then error &quot;The supplied hex key has less than 128 bits&quot; elif 128 &lt; StringTools:-Length(k) then k := StringTools:-Take(key, 128) elif `mod`(StringTools:-Length(k), 2) = 1 then k := cat(&quot;0&quot;, k) end if; k := hexstringtobytes(StringTools:-LowerCase(k)) end if; k end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZpei1JI21pR0YkNiVRKWNoZWNra2V5RicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtRjY2L1ElcHJvY0YnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGZW5GO0Y+RkBGQkZERkZGSEZKRk0tSShtZmVuY2VkR0YkNiQtRiM2Ji1GLDYlUSRrZXlGJ0YvRjItRjY2LVEtJlByb3BvcnRpb247RidGOUY7Rj5GQEZCRkRGRkZIRlJGVC1GLDYlUSdzdHJpbmdGJ0YvRjJGOUY5LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRkwvJSZkZXB0aEdGXnAvJSpsaW5lYnJlYWtHUShuZXdsaW5lRidGNS1GNjYvUSV1c2VzRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRiw2JVEsU3RyaW5nVG9vbHNGJ0YvRjItRjY2LVEiO0YnRjlGOy9GP0YxRkBGQkZERkZGSEZKRlRGaW9GNS1GNjYvUSZsb2NhbEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUYsNiVRImtGJ0YvRjJGXHFGaW9GNUZjcUZPRjVGXW9GXHFGNUZpb0Y1LUY2Ni9RI2lmRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRjY2L1Ekbm90RidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRiw2JVErSXNIZXhEaWdpdEYnRi9GMi1GaW42JC1GIzYkRmNxRjlGOUY1LUY2Ni9RJXRoZW5GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GaW9GNUY1RjVGNUY1RmZxRjUtRiw2JVEnTGVuZ3RoRidGL0YyRl9yRjUtRjY2LVEiPEYnRjlGO0Y+RkBGQkZERkZGSEZSRlRGNS1JI21uR0YkNiRRIzE2RidGOUY1RmNyRjVGaW9GNUY1RjVGNUY1RjVGNS1GNjYvUSZlcnJvckYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUkjbXNHRiQ2I1FIVGhlfnN1cHBsaWVkfmtleX5oYXN+bGVzc350aGFufjEyOH5iaXRzRidGaW9GNUY1RjVGNUY1LUY2Ni9RJWVsaWZGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNUZmckZfckY1LUY2Ni1RIj5GJ0Y5RjtGPkZARkJGREZGRkhGUkZULUZdczYkUSM2NEYnRjlGNUZjckY1RmlvRjVGNUY1RjVGNUY1RjVGY3FGNUZPRjUtRiw2JVElVGFrZUYnRi9GMi1GaW42JC1GIzYnRmNxLUY2Ni1RIixGJ0Y5RjtGX3FGQEZCRkRGRkZIRkovRk5RLDAuMzMzMzMzM2VtRidGNUZddEY5RjlGZm9GaW9GNUY1RjVGNUY1LUY2Ni9RJGVuZEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RmZxRlxxRmlvRjVGY3FGNUZPRjUtRiw2JVEoY29udmVydEYnRi9GMi1GaW42JC1GIzYnRmNxRmd0RjUtRiw2JVEmYnl0ZXNGJ0YvRjJGOUY5RmZvRmlvRjUtRjY2L1ElZWxzZUYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZpby1GNjYvRjhGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRlx2Rlx2Rlx2RmZxRjVGZnJGX3JGaXItRl1zNiRRIzMyRidGOUY1RmNyRmlvRjVGNUY1RjVGNUY1RjVGNUZgc0Y1LUZkczYjUUxUaGV+c3VwcGxpZWR+aGV4fmtleX5oYXN+bGVzc350aGFufjEyOH5iaXRzRidGaW9GNUY1RjVGNUY1RmdzRjVGZnJGX3JGNUZqc0Y1LUZdczYkUSQxMjhGJ0Y5RjVGY3JGaW9GNUY1RjVGNUY1RjVGNUY1RmNxRjVGT0ZgdC1GaW42JC1GIzYnRl1vRmd0RjVGZHZGOUY5RmZvRmlvRjVGNUY1RjVGNUZnc0Y1RmZyRl9yRjUtRjY2L1EkbW9kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRl1zNiRRIjJGJ0Y5RjUtRjY2LVEiPUYnRjlGO0Y+RkBGQkZERkZGSEZSRlRGNS1GXXM2JFEiMUYnRjlGNUZjckZpb0Y1RjVGNUY1RjVGNUY1RjVGY3FGNUZPLUYsNiVRJGNhdEYnRi9GMi1GaW42JC1GIzYnRmZvLUZkczYjUSIwRidGZ3RGY3FGOUY5RmZvRmlvRlx2Rlx2Rlx2Rlx2Rlx2Rlx1RjVGZnFGXHFGaW9GNUY1RjVGNUY1RmNxRk9GNS1GLDYlUTFoZXhzdHJpbmd0b2J5dGVzRidGL0YyLUZpbjYkLUYjNiUtRiw2JVEqTG93ZXJDYXNlRidGL0YyRl9yRjlGOUZmb0Zpb0Y1RjVGXHVGNUZmcUZccUZpb0Y1RmNxRmlvRjVGXHVGNUZVLUY2Ni1RIjpGJ0Y5RjtGPkZARkJGREZGRkhGUkZURjVGaW8tRmpvNiZGXHBGX3BGYXAvRmRwUSVhdXRvRidGZm8vJStleGVjdXRhYmxlR0Y9Rjk=">QyQ+SSljaGVja2tleUc2ImYqNiMnSSRrZXlHRiVJJ3N0cmluZ0clKnByb3RlY3RlZEc2I0kia0dGJUYlRiVDJT44JDkkQCU0LV9JLFN0cmluZ1Rvb2xzRzYkRitJKF9zeXNsaWJHRiVJK0lzSGV4RGlnaXRHRiU2I0YwQyRAJjItX0Y2SSdMZW5ndGhHRiVGOiIjO1lRSFRoZX5zdXBwbGllZH5rZXl+aGFzfmxlc3N+dGhhbn4xMjh+Yml0c0YlMiIja0Y+PkYwLV9GNkklVGFrZUdGJTYkRjBGRT5GMC1JKGNvbnZlcnRHRis2JEYwSSZieXRlc0dGJUMkQCgyRj4iI0tZUUxUaGV+c3VwcGxpZWR+aGV4fmtleX5oYXN+bGVzc350aGFufjEyOH5iaXRzRiUyIiRHIkY+PkYwLUZINiRGMUZXLy1JJG1vZEdGJTYkRj4iIiMiIiI+RjAtSSRjYXRHRis2JFEiMEYlRjA+RjAtSTFoZXhzdHJpbmd0b2J5dGVzR0YlNiMtX0Y2SSpMb3dlckNhc2VHRiVGOkYwRiVGJUYlISIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4854" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The next function performs a cyclic bitwise shift on an integer <Font italic="true">n</Font>. The parameter <Font italic="true">l</Font> sets the integer length, i.e., the number of bits that are going to be shifted (this is necessary because an integer that is represented, say, by a list of 64 bits, may have one or several leading bits equal to 0 and the result of applying the cyclic rotation would be different if these 0 bits were not taken into account). Finally, the parameter <Font italic="true">s</Font>  (where we may assume that <Font italic="true">s</Font> is less than <Font italic="true">l</Font> or, otherwise, reduce <Font italic="true">s</Font> modulo <Font italic="true">l</Font>) sets the number of positions that the bits are going to be shifted.
</Text-field>
</Input>
</Group>
<Group labelreference="L4992" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Rot := proc (n, l, s) local t; irem(n, 2^(l-s))*2^s+iquo(n, 2^(l-s)) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZFLUkjbWlHRiQ2JVEkUm90RicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtRjY2L1ElcHJvY0YnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGZW5GO0Y+RkBGQkZERkZGSEZKRk0tSShtZmVuY2VkR0YkNiQtRiM2KS1GLDYlUSJuRidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGSi9GTlEsMC4zMzMzMzMzZW1GJy1GLDYlUSJsRidGL0YyRmBvRjUtRiw2JVEic0YnRi9GMkY5RjktRiw2I1EhRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0ZkcC8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0Y1LUY2Ni9RJmxvY2FsRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRiw2JVEidEYnRi9GMi1GNjYtUSI7RidGOUY7RmNvRkBGQkZERkZGSEZKRlRGXHBGX3AtRiw2JVElaXJlbUYnRi9GMi1GaW42JC1GIzYnRl1vRmBvRjUtSSVtc3VwR0YkNiUtSSNtbkdGJDYkUSIyRidGOS1GIzYmRmZvLUY2Ni1RKCZtaW51cztGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRicvRk5GaXJGaW9GOS8lMXN1cGVyc2NyaXB0c2hpZnRHUSIwRidGOUY5LUY2Ni1RJyZzZG90O0YnRjlGO0Y+RkBGQkZERkZGSEZKRk1GNS1GXXI2JUZfci1GIzYkRmlvRjlGW3MtRjY2LVEiK0YnRjlGO0Y+RkBGQkZERkZGSEZockZqci1GLDYlUSVpcXVvRidGL0YyLUZpbjYkLUYjNiZGXW9GYG9GXHJGOUY5RlxwRl9wRjUtRjY2L1EkZW5kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZfcC1GYHA2JkZicEZlcEZncC9GanBRJWF1dG9GJ0ZccC8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSRSb3RHNiJmKjYlSSJuR0YlSSJsR0YlSSJzR0YlNiNJInRHRiVGJUYlLCYqJi1JJWlyZW1HJSpwcm90ZWN0ZWRHNiQ5JCkiIiMsJjklIiIiOSYhIiJGOClGNUY5RjhGOC1JJWlxdW9HRjFGMkY4RiVGJUYlRjo=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5027" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">    We will use the following function to convert a lane, given as a list of bytes, to a <Font italic="true">w</Font>-bit integer, note that for this conversion we use the little-endian convention.
</Text-field>
</Input>
</Group>
<Group labelreference="L4993" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="bytestoint := proc (bytes) local l; l := nops(bytes); add(bytes[i]*256^(i-1), i = 1 .. l) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZGLUkjbWlHRiQ2JVErYnl0ZXN0b2ludEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTC1GNjYtUSomY29sb25lcTtGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjc3Nzc3OGVtRicvRk5GU0Y1LUY2Ni9RJXByb2NGJy8lJWJvbGRHRjEvRjNRJWJvbGRGJy8lK2ZvbnR3ZWlnaHRHRmVuRjtGPkZARkJGREZGRkhGSkZNLUkobWZlbmNlZEdGJDYkLUYjNiQtRiw2JVEmYnl0ZXNGJ0YvRjJGOUY5LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRkwvJSZkZXB0aEdGaG8vJSpsaW5lYnJlYWtHUShuZXdsaW5lRidGNS1GNjYvUSZsb2NhbEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUYsNiVRImxGJ0YvRjItRjY2LVEiO0YnRjlGOy9GP0YxRkBGQkZERkZGSEZKRlRGY29GNUZjcEZPLUYsNiVRJW5vcHNGJ0YvRjItRmluNiQtRiM2JUZdby8lK2V4ZWN1dGFibGVHRj1GOUY5RmZwRmNvRjUtRiw2JVEkYWRkRidGL0YyLUZpbjYkLUYjNi5GXW8tRmluNiYtRiM2JC1GLDYlUSJpRidGL0YyRjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1GNjYtUScmc2RvdDtGJ0Y5RjtGPkZARkJGREZGRkhGSkZNLUklbXN1cEdGJDYlLUkjbW5HRiQ2JFEkMjU2RidGOS1GIzYmRl5yLUY2Ni1RKCZtaW51cztGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRicvRk5GZ3MtRl5zNiRRIjFGJ0Y5RjkvJTFzdXBlcnNjcmlwdHNoaWZ0R1EiMEYnLUY2Ni1RIixGJ0Y5RjtGaXBGQEZCRkRGRkZIRkovRk5RLDAuMzMzMzMzM2VtRidGNUZeci1GNjYtUSI9RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZpcy1GNjYtUSMuLkYnRjlGO0Y+RkBGQkZERkZGSEZmc0ZNRmNwRjlGOUZgb0Zjb0Y1LUY2Ni9RJGVuZEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RlUtRjY2LVEiOkYnRjlGO0Y+RkBGQkZERkZGSEZSRlRGY28tRmRvNiZGZm9GaW9GW3AvRl5wUSVhdXRvRidGYG9GYXFGOQ==">QyQ+SStieXRlc3RvaW50RzYiZio2I0kmYnl0ZXNHRiU2I0kibEdGJUYlRiVDJD44JC1JJW5vcHNHJSpwcm90ZWN0ZWRHNiM5JC1JJGFkZEdGMDYkKiYmRjI2I0kiaUdGJSIiIikiJGMjLCZGOUY6ISIiRjpGOi9GOTtGOkYtRiVGJUYlRj4=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5028" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Finally, a function to convert a decimal integer <Font italic="true">x</Font> to base <Font italic="true">b</Font>, where the base-<Font italic="true">b</Font> representation is the list of digits in little-endian order, and <Font italic="true">l</Font> is a parameter that specifies the length of this list, so that if the integer has less than<Font italic="true"> l</Font> digits in base <Font italic="true">b</Font>, the list of digits given by the function is completed with zeros on the right up to the required length (we will always assume that this length is greater than or equal to the bit-length of <Font italic="true">x</Font>).
</Text-field>
</Input>
</Group>
<Group labelreference="L4994" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="decimaltob := proc (x::nonnegint, b, l) local y; y := convert(x, base, b); [op(y), `$`(0, l-nops(y))] end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZGLUkjbWlHRiQ2JVErZGVjaW1hbHRvYkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTC1GNjYtUSomY29sb25lcTtGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjc3Nzc3OGVtRicvRk5GU0Y1LUY2Ni9RJXByb2NGJy8lJWJvbGRHRjEvRjNRJWJvbGRGJy8lK2ZvbnR3ZWlnaHRHRmVuRjtGPkZARkJGREZGRkhGSkZNLUkobWZlbmNlZEdGJDYkLUYjNi0tRiw2JVEieEYnRi9GMi1GNjYtUS0mUHJvcG9ydGlvbjtGJ0Y5RjtGPkZARkJGREZGRkhGUkZULUYsNiVRKm5vbm5lZ2ludEYnRi9GMi1GNjYtUSIsRidGOUY7L0Y/RjFGQEZCRkRGRkZIRkovRk5RLDAuMzMzMzMzM2VtRidGNS1GLDYlUSJiRidGL0YyRmZvRjUtRiw2JVEibEYnRi9GMi8lK2V4ZWN1dGFibGVHRj1GOUY5LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRkwvJSZkZXB0aEdGXHEvJSpsaW5lYnJlYWtHUShuZXdsaW5lRidGNS1GNjYvUSZsb2NhbEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUYsNiVRInlGJ0YvRjItRjY2LVEiO0YnRjlGO0Zpb0ZARkJGREZGRkhGSkZURmdwRjVGZ3FGT0Y1LUYsNiVRKGNvbnZlcnRGJ0YvRjItRmluNiQtRiM2K0Zdb0Zmb0Y1LUYsNiVRJWJhc2VGJ0YvRjJGZm9GNUZccEZicEY5RjlGanFGZ3BGNS1GaW42Ji1GIzYrLUYsNiVRI29wRidGL0YyLUZpbjYkLUYjNiVGZ3FGYnBGOUY5RmZvRjUtSSNtbkdGJDYkUSIwRidGOS1GNjYtUSIkRidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1GaW42JC1GIzYoRl9wLUY2Ni1RKCZtaW51cztGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRicvRk5GYXQtRiw2JVElbm9wc0YnRi9GMkZec0ZicEY5RjlGYnBGOUY5LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnRmRwRmdwRjUtRjY2L1EkZW5kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZncC1GaHA2JkZqcEZdcUZfcS9GYnFRJWF1dG9GJ0ZkcEZicEY5">QyQ+SStkZWNpbWFsdG9iRzYiZio2JSdJInhHRiVJKm5vbm5lZ2ludEclKnByb3RlY3RlZEdJImJHRiVJImxHRiU2I0kieUdGJUYlRiVDJD44JC1JKGNvbnZlcnRHRis2JTkkSSViYXNlR0YlOSU3JC1JI29wR0YrNiNGMi1JIiRHRis2JCIiISwmOSYiIiItSSVub3BzR0YrRjwhIiJGJUYlRiVGRg==</Equation></Text-field>
</Input>
</Group>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">The <Font family="Courier New">Keccak</Font> sponge function</Text-field></Title>
<Group labelreference="L4860" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    We start the implementation of the <Font family="Courier New">Keccak</Font> sponge function by giving the <Font italic="true">Round Constants</Font><Font encoding="UTF-8">, which are used in the \316\271 (iota) step of each round of </Font><Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>]. The 24 constants are initialized as hex strings in a one-dimensional array:

</Text-field>
</Input>
</Group>
<Group labelreference="L4858" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="RChex := Array(0 .. 23, [&quot;0000000000000001&quot;, &quot;0000000000008082&quot;, &quot;800000000000808a&quot;, &quot;8000000080008000&quot;, &quot;000000000000808b&quot;, &quot;0000000080000001&quot;, &quot;8000000080008081&quot;, &quot;8000000000008009&quot;, &quot;000000000000008a&quot;, &quot;0000000000000088&quot;, &quot;0000000080008009&quot;, &quot;000000008000000a&quot;, &quot;000000008000808b&quot;, &quot;800000000000008b&quot;, &quot;8000000000008089&quot;, &quot;8000000000008003&quot;, &quot;8000000000008002&quot;, &quot;8000000000000080&quot;, &quot;000000000000800a&quot;, &quot;800000008000000a&quot;, &quot;8000000080008081&quot;, &quot;8000000000008080&quot;, &quot;0000000080000001&quot;, &quot;8000000080008008&quot;])" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYqLUkjbWlHRiQ2I1EhRictRiM2KS1GLDYlUSZSQ2hleEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GOFEnbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRkIvJSlzdHJldGNoeUdGQi8lKnN5bW1ldHJpY0dGQi8lKGxhcmdlb3BHRkIvJS5tb3ZhYmxlbGltaXRzR0ZCLyUnYWNjZW50R0ZCLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGUS1GOzYtUSomY29sb25lcTtGJ0Y+RkBGQ0ZFRkdGSUZLRk0vRlBRLDAuMjc3Nzc3OGVtRicvRlNGWEY6LUYsNiVRJkFycmF5RidGNEY3LUkobWZlbmNlZEdGJDYkLUYjNiotSSNtbkdGJDYkUSIwRidGPi1GOzYtUSMuLkYnRj5GQEZDRkVGR0ZJRktGTS9GUFEsMC4yMjIyMjIyZW1GJ0ZSLUZdbzYkUSMyM0YnRj4tRjs2LVEiLEYnRj5GQC9GREY2RkVGR0ZJRktGTUZPL0ZTUSwwLjMzMzMzMzNlbUYnRjotRiM2JC1GaG42Ji1GIzZgXGxGKy1JI21zR0YkNiNRMTAwMDAwMDAwMDAwMDAwMDFGJ0Zoby1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZRLyUmZGVwdGhHRl1xLyUqbGluZWJyZWFrR1EobmV3bGluZUYnRjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExMDAwMDAwMDAwMDAwODA4MkYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExODAwMDAwMDAwMDAwODA4YUYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExODAwMDAwMDA4MDAwODAwMEYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOkY6LUZlcDYjUTEwMDAwMDAwMDAwMDA4MDhiRidGaG9GaHBGOkY6RjpGOkY6RjpGOkY6RjotRmVwNiNRMTAwMDAwMDAwODAwMDAwMDFGJ0Zob0ZocEY6RjpGOkY6RjpGOkY6RjotRmVwNiNRMTgwMDAwMDAwODAwMDgwODFGJ0Zob0ZocEY6RjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExODAwMDAwMDAwMDAwODAwOUYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOkY6LUZlcDYjUTEwMDAwMDAwMDAwMDAwMDhhRidGaG9GaHBGOkY6RjpGOkY6RjpGOkY6RjotRmVwNiNRMTAwMDAwMDAwMDAwMDAwODhGJ0Zob0ZocEY6RjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExMDAwMDAwMDA4MDAwODAwOUYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOkY6LUZlcDYjUTEwMDAwMDAwMDgwMDAwMDBhRidGaG9GaHBGOkY6RjpGOkY6RjpGOkY6RjotRmVwNiNRMTAwMDAwMDAwODAwMDgwOGJGJ0Zob0ZocEY6RjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExODAwMDAwMDAwMDAwMDA4YkYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOkY6LUZlcDYjUTE4MDAwMDAwMDAwMDA4MDg5RidGaG9GaHBGOkY6RjpGOkY6RjpGOkY6RjotRmVwNiNRMTgwMDAwMDAwMDAwMDgwMDNGJ0Zob0ZocEY6RjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExODAwMDAwMDAwMDAwODAwMkYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOkY6LUZlcDYjUTE4MDAwMDAwMDAwMDAwMDgwRidGaG9GaHBGOkY6RjpGOkY6RjpGOkY6RjotRmVwNiNRMTAwMDAwMDAwMDAwMDgwMGFGJ0Zob0ZocEY6RjpGOkY6RjpGOkY6RjpGOi1GZXA2I1ExODAwMDAwMDA4MDAwMDAwYUYnRmhvRmhwRjpGOkY6RjpGOkY6RjpGOkY6RmRyRmhvRmhwRjpGOkY6RjpGOkY6RjpGOkY6LUZlcDYjUTE4MDAwMDAwMDAwMDA4MDgwRidGaG9GaHBGOkY6RjpGOkY6RjpGOkY6RjpGYXJGaG9GaHBGOkY6RjpGOkY6RjpGOkY6RjotRmVwNiNRMTgwMDAwMDAwODAwMDgwMDhGJ0YrRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0Y+RitGPkY+Rj5GK0ZocC1GaXA2JkZbcUZecUZgcS9GY3FRJWF1dG9GJ0YrLyUrZXhlY3V0YWJsZUdGQkY+">PkkmUkNoZXhHNiItSSZBcnJheUclKnByb3RlY3RlZEc2JDsiIiEiI0I3OlExMDAwMDAwMDAwMDAwMDAwMUYkUTEwMDAwMDAwMDAwMDA4MDgyRiRRMTgwMDAwMDAwMDAwMDgwOGFGJFExODAwMDAwMDA4MDAwODAwMEYkUTEwMDAwMDAwMDAwMDA4MDhiRiRRMTAwMDAwMDAwODAwMDAwMDFGJFExODAwMDAwMDA4MDAwODA4MUYkUTE4MDAwMDAwMDAwMDA4MDA5RiRRMTAwMDAwMDAwMDAwMDAwOGFGJFExMDAwMDAwMDAwMDAwMDA4OEYkUTEwMDAwMDAwMDgwMDA4MDA5RiRRMTAwMDAwMDAwODAwMDAwMGFGJFExMDAwMDAwMDA4MDAwODA4YkYkUTE4MDAwMDAwMDAwMDAwMDhiRiRRMTgwMDAwMDAwMDAwMDgwODlGJFExODAwMDAwMDAwMDAwODAwM0YkUTE4MDAwMDAwMDAwMDA4MDAyRiRRMTgwMDAwMDAwMDAwMDAwODBGJFExMDAwMDAwMDAwMDAwODAwYUYkUTE4MDAwMDAwMDgwMDAwMDBhRiRGM1ExODAwMDAwMDAwMDAwODA4MEYkRjJRMTgwMDAwMDAwODAwMDgwMDhGJA==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4861" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"><Font encoding="UTF-8">    We now convert each round constant to an integer that will be XORed with the first lane of  the state in the \316\271 step.  For this, according to the little endian convention we have mentioned, the bytes in each constant are reversed before converting them to an integer. Later, in the absortion phase, these integers will be automatically truncated to lane size </Font><Font italic="true">w</Font> whenever <Font italic="true">w</Font> &lt; 64, which happens when <Font italic="true">b</Font> &lt; 1600 in order to XOR them with other lanes; this truncation will be forced by the use of <Font family="Courier New">Bits:-Settings(defaultbits = w)</Font> in the function <Font family="Courier New">keccak</Font> below. 
</Text-field>
</Input>
</Group>
<Group labelreference="L4995" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="RCint := `~`[bytestoint](`~`[ListTools:-Reverse](`~`[hexstringtobytes](RChex)));" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYvLUkjbWlHRiQ2JVEmUkNpbnRGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSJ+RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHRkwtRjY2LVEqJmNvbG9uZXE7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORlNGNS1GLDYlUStieXRlc3RvaW50RidGL0YyLUY2Ni1RInxpckYnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4xMTExMTExZW1GJy9GTkZmbi1JKG1mZW5jZWRHRiQ2JC1GIzYpLUYsNiVRKkxpc3RUb29sc0YnRi9GMi1GNjYtUSM6LUYnRjlGO0Y+RkBGQkZERkZGSEZKRk0tRiw2JVEoUmV2ZXJzZUYnRi9GMkZYLUZpbjYkLUYjNiYtRiw2JVExaGV4c3RyaW5ndG9ieXRlc0YnRi9GMkZYLUZpbjYkLUYjNiQtRiw2JVEmUkNoZXhGJ0YvRjJGOUY5RjlGOS1GLDYjUSFGJ0Y5RjktRjY2LVEiO0YnRjlGOy9GP0YxRkBGQkZERkZGSEZKRlQtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0ZgcS8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GXHE2JkZecUZhcUZjcS9GZnFRJWF1dG9GJ0ZkcC8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSZSQ2ludEc2Ii0mSSJ8aXJHJSpwcm90ZWN0ZWRHNiNJK2J5dGVzdG9pbnRHRiU2Iy0mRig2I19JKkxpc3RUb29sc0dGJUkoUmV2ZXJzZUdGJTYjLSZGKDYjSTFoZXhzdHJpbmd0b2J5dGVzR0YlNiNJJlJDaGV4R0YlIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4863" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
<Font encoding="UTF-8">    Next, we set up the cyclic shift offsets that are used in the \317\201 and \317\200 steps of each round of </Font><Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>]. The offsets are the elements of the following two-dimensional array:
</Text-field>
</Input>
</Group>
<Group labelreference="L4864" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="ro := Array(0 .. 4, 0 .. 4, [[0, 36, 3, 41, 18], [1, 44, 10, 45, 2], [62, 6, 43, 15, 61], [28, 55, 25, 21, 56], [27, 20, 39, 8, 14]]);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYuLUkjbWlHRiQ2JVEjcm9GJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEifkYnRjIvJSZmZW5jZUdGMS8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0YxLyUqc3ltbWV0cmljR0YxLyUobGFyZ2VvcEdGMS8lLm1vdmFibGVsaW1pdHNHRjEvJSdhY2NlbnRHRjEvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZJLUY2Ni1RKiZjb2xvbmVxO0YnRjJGOUY7Rj1GP0ZBRkNGRS9GSFEsMC4yNzc3Nzc4ZW1GJy9GS0ZQRjUtRiw2JVEmQXJyYXlGJ0YvRjItSShtZmVuY2VkR0YkNiQtRiM2LC1JI21uR0YkNiRRIjBGJ0YyLUY2Ni1RIy4uRidGMkY5RjtGPUY/RkFGQ0ZFL0ZIUSwwLjIyMjIyMjJlbUYnRkotRmVuNiRRIjRGJ0YyLUY2Ni1RIixGJ0YyRjkvRjxRJXRydWVGJ0Y9Rj9GQUZDRkVGRy9GS1EsMC4zMzMzMzMzZW1GJ0ZaRmhuRl1vRmBvLUZWNiYtRiM2Ly1GVjYmLUYjNixGWkZgby1GZW42JFEjMzZGJ0YyRmBvLUZlbjYkUSIzRidGMkZgby1GZW42JFEjNDFGJ0YyRmBvLUZlbjYkUSMxOEYnRjJGMkYyLyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnRmBvLUZWNiYtRiM2LC1GZW42JFEiMUYnRjJGYG8tRmVuNiRRIzQ0RidGMkZgby1GZW42JFEjMTBGJ0YyRmBvLUZlbjYkUSM0NUYnRjJGYG8tRmVuNiRRIjJGJ0YyRjJGMkZbcUZecUZgb0Y1LUZWNiYtRiM2LC1GZW42JFEjNjJGJ0YyRmBvLUZlbjYkUSI2RidGMkZgby1GZW42JFEjNDNGJ0YyRmBvLUZlbjYkUSMxNUYnRjJGYG8tRmVuNiRRIzYxRidGMkYyRjJGW3FGXnFGYG9GNS1GVjYmLUYjNiwtRmVuNiRRIzI4RidGMkZgby1GZW42JFEjNTVGJ0YyRmBvLUZlbjYkUSMyNUYnRjJGYG8tRmVuNiRRIzIxRidGMkZgby1GZW42JFEjNTZGJ0YyRjJGMkZbcUZecUZgb0Y1LUZWNiYtRiM2LC1GZW42JFEjMjdGJ0YyRmBvLUZlbjYkUSMyMEYnRjJGYG8tRmVuNiRRIzM5RidGMkZgby1GZW42JFEiOEYnRjJGYG8tRmVuNiRRIzE0RidGMkYyRjJGW3FGXnFGMkYyRltxRl5xRjJGMi1GNjYtUSI7RidGMkY5RmNvRj1GP0ZBRkNGRUZHRlEtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGSS8lJmRlcHRoR0Zldi8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GYXY2JkZjdkZmdkZodi9GW3dRJWF1dG9GJy1GLDYjUSFGJy8lK2V4ZWN1dGFibGVHRjFGMg==">QyQ+SSNyb0c2Ii1JJkFycmF5RyUqcHJvdGVjdGVkRzYlOyIiISIiJUYqNyc3J0YrIiNPIiIkIiNUIiM9NyciIiIiI1ciIzUiI1giIiM3JyIjaSIiJyIjViIjOiIjaDcnIiNHIiNiIiNEIiNAIiNjNyciI0YiIz8iI1IiIikiIzlGNA==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4865" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">    </Text-field>
<Text-field style="Text" layout="Normal">    The next step is to build the round function, for which se shall assume that the lanes are given as integers.  The bitwise operations on these integers required by the <Font family="Courier New">Keccak</Font> permutation are then performed using the Maple package <Font family="Courier New">Bits</Font> (plus the function <Font family="Courier New">Rot</Font> we defined before to perform the cyclic shift) and it is important to notice that, for these operations to work properly, it is necessary to set the parameter <Font family="Courier New">defaultbits</Font> of the Bits package to the lane length <Font italic="true">w</Font> which, as mentioned, is done in the function <Font family="Courier New">keccak</Font> below. Note that Maple's convention is to number the list elements starting from 1 (instead of the numbering starting from 0 used in the <Font family="Courier New">Keccak</Font> reference) but this does not cause any trouble. The bitwise cyclic shifts used in the <Font encoding="UTF-8">\317\201 and \317\200 steps are right shifts according to the little endian convention (bits are shifted from less to more significant) but sometimes they are called &quot;left shifts&quot; because the big endian convention is assumed. The cyclic right shift of size </Font><Font italic="true">s</Font> is obtained with <Font family="Courier New">Rot</Font>. We remark that the Maple code for this function is an almost word-for-word rendition of the pseudocode given in <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-implementation-3.2.pdf" hyperlink="true"><Font style="Hyperlink">Kimplementation</Font></Hyperlink>. </Text-field>
<Text-field style="Text" layout="Normal">    The inputs of the <Font family="Courier New">Round</Font> function are the state <Font italic="true">A</Font>, the permutation width <Font italic="true">b</Font>, and the round number <Font italic="true">rn</Font>. The output is the modified state.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4866" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Round := proc (A::Array, b::posint, rn::nonnegint) local w, wb, B, C, D, x, y; w := iquo(b, 25); B := Array(0 .. 4, 0 .. 4, fill = 0); C := Array(0 .. 4, fill = 0); D := Array(0 .. 4, fill = 0); for x from 0 to 4 do C[x] := Bits:-Xor(Bits:-Xor(Bits:-Xor(Bits:-Xor(A[x, 0], A[x, 1]), A[x, 2]), A[x, 3]), A[x, 4]) end do; for x from 0 to 4 do D[x] := Bits:-Xor(C[`mod`(x-1, 5)], Rot(C[`mod`(x+1, 5)], w, 1)) end do; for x from 0 to 4 do for y from 0 to 4 do A[x, y] := Bits:-Xor(A[x, y], D[x]) end do end do; for x from 0 to 4 do for y from 0 to 4 do B[y, `mod`(2*x+3*y, 5)] := Rot(A[x, y], w, `mod`(ro[x, y], w)) end do end do; for x from 0 to 4 do for y from 0 to 4 do A[x, y] := Bits:-Xor(B[x, y], Bits:-And(Bits:-Not(B[`mod`(x+1, 5), y]), B[`mod`(x+2, 5), y])) end do end do; A[0, 0] := Bits:-Xor(A[0, 0], RCint[rn]); A end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZpYmwtSSNtaUdGJDYlUSZSb3VuZEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZMLUY2Ni9RJXByb2NGJy8lJWJvbGRHRjEvRjNRJWJvbGRGJy8lK2ZvbnR3ZWlnaHRHRlVGO0Y+RkBGQkZERkZGSC9GS1EmMC4wZW1GJy9GTkZZLUkobWZlbmNlZEdGJDYkLUYjNi4tRiw2JVEiQUYnRi9GMi1GNjYtUS0mUHJvcG9ydGlvbjtGJ0Y5RjtGPkZARkJGREZGRkhGSkZNLUYsNiVRJkFycmF5RidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGWC9GTlEsMC4zMzMzMzMzZW1GJy1GLDYlUSJiRidGL0YyRl1vLUYsNiVRJ3Bvc2ludEYnRi9GMkZjby1GLDYlUSNybkYnRi9GMkZdby1GLDYlUSpub25uZWdpbnRGJ0YvRjJGOUY5LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRlkvJSZkZXB0aEdGXXEvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRjY2LVEifkYnRjlGO0Y+RkBGQkZERkZGSEZYRlotRjY2L1EldXNlc0YnRlJGVEZWRjtGPkZARkJGREZGRkhGWEZaRmVxRmVxLUYsNiVRJUJpdHNGJ0YvRjItRjY2LVEiO0YnRjlGO0Zmb0ZARkJGREZGRkhGWEZNRmVxRmhwRmVxLUY2Ni9RJmxvY2FsRidGUkZURlZGO0Y+RkBGQkZERkZGSEZYRlpGZXFGZXEtRiw2JVEid0YnRi9GMkZjby1GLDYlUSN3YkYnRi9GMkZjb0ZlcS1GLDYlUSJCRidGL0YyRmNvLUYsNiVRIkNGJ0YvRjJGY28tRiw2JVEiREYnRi9GMkZjby1GLDYlUSJ4RidGL0YyRmNvLUYsNiVRInlGJ0YvRjJGXnJGaHBGZXFGZHJGNS1GLDYlUSVpcXVvRidGL0YyLUZmbjYkLUYjNiZGaW9GY28tSSNtbkdGJDYkUSMyNUYnRjlGOUY5Rl5yRmhwLUZpcDYmRltxRl5xRmBxL0ZjcVElYXV0b0YnRmVxRmpyRjVGYG8tRmZuNiQtRiM2Ly1GYXQ2JFEiMEYnRjktRjY2LVEjLi5GJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRidGWi1GYXQ2JFEiNEYnRjlGZXFGY29GXHVGX3VGZHVGY28tRiw2JVElZmlsbEYnRi9GMi1GNjYtUSI9RidGOUY7Rj5GQEZCRkRGRkZIRkpGTUZcdUY5RjlGXnItRjY2LVEiI0YnRjlGO0Y+RkBGQkZERkZGSEZYRlotRiw2JVE5dGhlfnplcm9+KG9yfnJvb3QpfnN0YXRlRidGL0YyRmhwRmVxRl1zRjVGZXFGYG8tRmZuNiQtRiM2LEZcdUZfdUZkdUZjb0ZlcUZndUZqdUZcdS8lK2V4ZWN1dGFibGVHRj1GOUY5Rl5yRmhwRmVxRmBzLUY2Ni5GZ3FGL0YyRjtGPkZARkJGREZGRkhGWEZaLUY2Ni5GOEYvRjJGO0Y+RkBGQkZERkZGSEZKRk1GaXZGYG8tRmZuNiQtRiM2LkZcdUZfdUZkdUZjb0ZlcUZndUZlcUZqdUZlcUZcdUZndkY5RjlGXnJGZHRGaHBGZXFGXXYtRiw2JVEsdGhldGF+c3RlcDpGJ0YvRjJGaHBGZXEtRjY2L1EkZm9yRidGUkZURlZGO0Y+RkBGQkZERkZGSEZYRlpGZXFGY3NGZXEtRjY2L1ElZnJvbUYnRlJGVEZWRjtGPkZARkJGREZGRkhGWEZaRmVxRlx1RmVxLUY2Ni9RI3RvRidGUkZURlZGO0Y+RkBGQkZERkZGSEZYRlpGZXFGZHVGZXEtRjY2L1EjZG9GJ0ZSRlRGVkY7Rj5GQEZCRkRGRkZIRlhGWkZocEZlcUZlcUZlcUZlcUZlcUZdcy1GZm42Ji1GIzYkRmNzRjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0Y1RmVxLUYsNiVRJFhvckYnRi9GMi1GZm42JC1GIzYpRmp4LUZmbjYkLUYjNilGangtRmZuNiQtRiM2KUZqeC1GZm42JC1GIzYpRmpuLUZmbjYmLUYjNiZGY3NGY29GXHVGOUY5RmR4Rmd4RmNvRmVxRmpuLUZmbjYmLUYjNiZGY3NGY28tRmF0NiRRIjFGJ0Y5RjlGOUZkeEZneEY5RjlGY29GZXFGam4tRmZuNiYtRiM2JkZjc0Zjby1GYXQ2JFEiMkYnRjlGOUY5RmR4Rmd4RjlGOUZjb0ZlcUZqbi1GZm42Ji1GIzYmRmNzRmNvLUZhdDYkUSIzRidGOUY5RjlGZHhGZ3hGOUY5RmNvRmVxRmpuLUZmbjYmLUYjNiZGY3NGY29GZHVGOUY5RmR4Rmd4RjlGOUZlcEZocEZlcUZlcUZlcUZlcUZlcUZddi1GLDYlUVFUaGV+Zm9sbG93aW5nfmlzfmF+c2xpZ2h0bHl+c2xvd2VyfmFsdGVybmF0aXZlOn5GJ0YvRjJGaHBGZXFGZXFGZXFGZXFGZXFGXXZGXXMtRmZuNiYtRiM2JUZjc0ZndkY5RjlGZHhGZ3hGNUZlcS1GLDYlUSZmb2xkbEYnRi9GMi1GZm42JC1GIzY4Rmp4RmNvRmpuLUZmbjYmLUYjNidGY3NGY29GXHVGZ3ZGOUY5RmR4Rmd4RmNvRmVxRmpuLUZmbjYmLUYjNidGY3NGY29GZXpGZ3ZGOUY5RmR4Rmd4RmNvRmVxRmpuLUZmbjYmLUYjNidGY3NGY29GXFtsRmd2RjlGOUZkeEZneEZjb0ZlcUZqbi1GZm42Ji1GIzYnRmNzRmNvRmNbbEZndkY5RjlGZHhGZ3hGY29GZXFGam4tRmZuNiYtRiM2J0Zjc0Zjb0ZkdUZndkY5RjlGZHhGZ3hGZ3ZGOUY5RmVxRmhwRmVxLUY2Ni9RJGVuZEYnRlJGVEZWRjtGPkZARkJGREZGRkhGWEZaRmVxRl14Rl5yRmVxRmhwRmVxRmR3RmVxRmNzRmVxRmd3RmVxRlx1RmVxRmp3RmVxRmR1RmVxRl14RmVxRmVxRmVxRmhwRmVxRmVxRmVxRmVxLUYsNiVGYnMvRjBGPUY5Rl1cbEY1Rmp4LUZmbjYkLUYjNipGXXMtRmZuNiYtRiM2KC1GZm42JC1GIzYmRmNzLUY2Ni1RKCZtaW51cztGJ0Y5RjtGPkZARkJGREZGRkhGYnUvRk5GY3VGZXpGOUY5RmVxLUY2Ni9RJG1vZEYnRlJGVEZWRjtGPkZARkJGREZGRkhGWEZaRmVxLUZhdDYkUSI1RidGOUY5RjlGZHhGZ3hGY29GZXEtRiw2JVEkUm90RidGL0YyLUZmbjYkLUYjNipGXXMtRmZuNiYtRiM2KC1GZm42JC1GIzYmRmNzLUY2Ni1RIitGJ0Y5RjtGPkZARkJGREZGRkhGYnVGYV9sRmV6RjlGOUZlcUZiX2xGZXFGZV9sRjlGOUZkeEZneEZjb0ZlcUZkckZjb0ZlekY5RjlGZ3ZGOUY5RmVwRmhwRmVxRlxebEZlcUZdeEZeckZlcUZocEZlcUZkd0ZlcUZjc0ZlcUZnd0ZlcUZcdUZlcUZqd0ZlcUZkdUZlcUZdeEZocEZlcUZlcUZlcUZkd0ZlcUZmc0ZlcUZnd0ZlcUZcdUZlcUZqd0ZlcUZkdUZlcUZdeEZocEZlcUZlcUZlcUZlcUZlcUZqbi1GZm42Ji1GIzYnRmNzRmNvRmZzRmd2RjlGOUZkeEZneEY1Rmp4LUZmbjYkLUYjNipGam5GamBsRmNvRmVxRl9ebEZdXGxGZ3ZGOUY5RmVxRmhwRmVxRmVxRmVxRlxebEZlcUZdeEZeckZocEZlcUZcXmxGZXFGXXhGXnJGaHBGZXFGXXYtRiw2JVEycmhvfmFuZH5waX5zdGVwczpGJ0YvRjJGaHBGZXFGZHdGZXFGY3NGZXFGZ3dGZXFGXHVGZXFGandGZXFGZHVGZXFGXXhGZXFGaHBGZXFGZXFGZXFGZHdGZXFGZnNGZXFGZ3dGZXFGXHVGZXFGandGZXFGZHVGZXFGXXhGaHBGZXFGZXFGZXFGZXFGZXFGZXFGZXFGanItRmZuNiYtRiM2K0Zmc0Zjb0ZlcS1GZm42JC1GIzYqRlxbbC1GNjYtUScmc2RvdDtGJ0Y5RjtGPkZARkJGREZGRkhGWEZaRmNzRmdgbEZjW2xGXWJsRmZzRjlGOUZlcUZiX2xGZXFGZV9sRjlGOUZkeEZneEY1RmhfbC1GZm42JC1GIzYuRmpuLUZmbjYmLUYjNiZGY3NGY29GZnNGOUY5RmR4Rmd4RmNvRmRyRmNvLUYsNiVRI3JvRidGL0YyRmRibEZlcUZiX2xGZXFGZHJGOUY5RmVxRmhwRmVxRmVxRmVxRlxebEZlcUZdeEZeckZocEZlcUZcXmxGZXFGXXhGXnJGaHBGZXFGXXYtRiw2JVEqY2hpfnN0ZXA6RidGL0YyRmhwRmVxRmR3RmVxRmNzRmVxRmd3RmVxRlx1RmVxRmp3RmVxRmR1RmVxRl14RmhwRmVxRmVxRmVxRmR3RmVxRmZzRmVxRmd3RmVxRlx1RmVxRmp3RmVxRmR1RmVxRl14RmhwRmVxRmVxRmVxRmVxRmVxRmVxRmpuRmRibEY1Rmp4LUZmbjYkLUYjNilGanJGZGJsRmNvRmVxLUYsNiVRJEFuZEYnRmFebEY5LUZmbjYkLUYjNiktRiw2JVEkTm90RidGYV5sRjktRmZuNiQtRiM2JUZqci1GZm42Ji1GIzYqRmNgbEZlcUZiX2xGZXFGZV9sRmNvRmZzRjlGOUZkeEZneEY5RjlGY29GZXFGanItRmZuNiYtRiM2Ki1GZm42JC1GIzYmRmNzRmdgbEZcW2xGOUY5RmVxRmJfbEZlcUZlX2xGY29GZnNGOUY5RmR4Rmd4RjlGOUY5RjlGZXFGaHBGZXFGZXFGZXFGXF5sRmVxRl14Rl5yRmhwRmVxRlxebEZlcUZdeEZeckZlcUZocEZlcUZlcUZddi1GLDYlUStpb3RhfnN0ZXA6RidGL0YyRmhwRmhwRmVxRmVxRmpuLUZmbjYmLUYjNiZGXHVGY29GXHVGOUY5RmR4Rmd4RjVGangtRmZuNiQtRiM2KUZqbkZfZWxGY29GZXEtRiw2JVEmUkNpbnRGJ0YvRjItRmZuNiYtRiM2JEZfcEY5RjlGZHhGZ3hGOUY5Rl5yRmhwRmVxRmpuRmhwRmVxRlxebEZlcUZPLUY2Ni1RIjpGJ0Y5RjtGPkZARkJGREZGRkhGSkZNRmhwRmR0RmVwRmd2Rjk=">QyQ+SSZSb3VuZEc2ImYqNiUnSSJBR0YlSSZBcnJheUclKnByb3RlY3RlZEcnSSJiR0YlSSdwb3NpbnRHRisnSSNybkdGJUkqbm9ubmVnaW50R0YrNilJIndHRiVJI3diR0YlSSJCR0YlSSJDR0YlSSJER0YlSSJ4R0YlSSJ5R0YlRiVGJUMtPjgkLUklaXF1b0dGKzYkOSUiI0Q+OCYtRio2JTsiIiEiIiVGRi9JJWZpbGxHRiVGRz44Jy1GKjYkRkZGST44KEZNPyg4KUZHIiIiRkhJJXRydWVHRis+JkZMNiNGUi1fSSVCaXRzR0koX3N5c2xpYkdGJUkkWG9yR0YrNiQtRlk2JC1GWTYkLUZZNiQmOSQ2JEZSRkcmRl9vNiRGUkZTJkZfbzYkRlIiIiMmRl9vNiRGUiIiJCZGX282JEZSRkg/KEZSRkdGU0ZIRlQ+JkZQRlctRlk2JCZGTDYjLUkkbW9kR0YlNiQsJkZSRlMhIiJGUyIiJi1JJFJvdEdGJTYlJkZMNiMtRmNwNiQsJkZSRlNGU0ZTRmdwRjxGUz8oRlJGR0ZTRkhGVD8oOCpGR0ZTRkhGVD4mRl9vNiRGUkZicS1GWTYkRmRxRl1wPyhGUkZHRlNGSEZUPyhGYnFGR0ZTRkhGVD4mRkM2JEZicS1GY3A2JCwmRlJGZW9GYnFGaG9GZ3AtRmlwNiVGZHFGPC1GY3A2JCZJI3JvR0YlRmVxRjw/KEZSRkdGU0ZIRlQ/KEZicUZHRlNGSEZUPkZkcS1GWTYkJkZDRmVxLV9GWkkkQW5kR0YrNiQtX0ZaSSROb3RHRis2IyZGQzYkRl1xRmJxJkZDNiQtRmNwNiQsJkZSRlNGZW9GU0ZncEZicT4mRl9vNiRGR0ZHLUZZNiRGXHQmSSZSQ2ludEdGJTYjOSZGX29GJUYlRiVGZnA=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4869" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The next step is to build the <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[<Font italic="true">b</Font>] permutation, which consists simply in applying the successive round functions to the state. The inputs are a state <Font italic="true">A</Font> and the permutation width <Font italic="true">b</Font>; the output is the modified state.
</Text-field>
</Input>
</Group>
<Group labelreference="L4870" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Keccakf := proc (A::Array, b::posint) local w, l, nr, i, S; w := iquo(b, 25); l := ilog[2](w); nr := 12+2*l; S := A; for i from 0 to nr-1 do S := Round(S, b, i) end do; S end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZmcS1JI21pR0YkNiVRKEtlY2Nha2ZGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSJ+RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHRkwtRjY2LVEqJmNvbG9uZXE7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORlNGNS1GNjYvUSVwcm9jRicvJSVib2xkR0YxL0YzUSVib2xkRicvJStmb250d2VpZ2h0R0ZlbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUkobWZlbmNlZEdGJDYkLUYjNistRiw2JVEiQUYnRi9GMi1GNjYtUS0mUHJvcG9ydGlvbjtGJ0Y5RjtGPkZARkJGREZGRkhGUkZULUYsNiVRJkFycmF5RidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGSi9GTlEsMC4zMzMzMzMzZW1GJ0Y1LUYsNiVRImJGJ0YvRjJGYG8tRiw2JVEncG9zaW50RidGL0YyRjlGOS1GLDYjUSFGJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZMLyUmZGVwdGhHRmpwLyUqbGluZWJyZWFrR1EobmV3bGluZUYnRjUtRjY2L1EmbG9jYWxGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSJ3RidGL0YyRmZvLUYsNiVRImxGJ0YvRjJGZm8tRiw2JVEjbnJGJ0YvRjJGZm8tRiw2JVEiaUYnRi9GMkZmby1GLDYlUSJTRidGL0YyLUY2Ni1RIjtGJ0Y5RjtGaW9GQEZCRkRGRkZIRkpGVEZicEZlcEY1RmVxRjVGT0Y1LUYsNiVRJWlxdW9GJ0YvRjItRmluNiQtRiM2JkZccEZmby1JI21uR0YkNiRRIzI1RidGOUY5RjlGZHJGZXBGNUZocUY1Rk9GNS1GLDYlUSVpbG9nRicvRjBGPUY5LUZpbjYmLUYjNiQtRl9zNiRRIjJGJ0Y5RjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1GaW42JC1GIzYkRmVxRjlGOUZkckZlcEY1RltyRk8tRl9zNiRRIzEyRidGOS1GNjYtUSIrRidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjIyMjIyMjJlbUYnL0ZORl51RmpzLUY2Ni1RJyZzZG90O0YnRjlGO0Y+RkBGQkZERkZGSEZKRk1GaHFGZHJGZXBGNUZhckZPRjVGXW9GZHJGZXBGNS1GNjYvUSRmb3JGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNUZeckY1LUY2Ni9RJWZyb21GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GX3M2JFEiMEYnRjlGNS1GNjYvUSN0b0YnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RltyLUY2Ni1RKCZtaW51cztGJ0Y5RjtGPkZARkJGREZGRkhGXXVGX3UtRl9zNiRRIjFGJ0Y5RjUtRjY2L1EjZG9GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GZXBGNUY1RjVGYXJGT0Y1LUYsNiVRJlJvdW5kRidGL0YyLUZpbjYkLUYjNihGYXJGZm9GXHBGZm9GXnJGOUY5RmJwRmVwRjUtRjY2L1EkZW5kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGZXZGZHJGNUZlcC1GLDYlRmNyRmVzRjlGZXBGNUZfd0Y1RlUtRjY2LVEiOkYnRjlGO0Y+RkBGQkZERkZGSEZSRlRGZXAtRmZwNiZGaHBGW3FGXXEvRmBxUSVhdXRvRidGYnAvJStleGVjdXRhYmxlR0Y9Rjk=">QyQ+SShLZWNjYWtmRzYiZio2JCdJIkFHRiVJJkFycmF5RyUqcHJvdGVjdGVkRydJImJHRiVJJ3Bvc2ludEdGKzYnSSJ3R0YlSSJsR0YlSSNuckdGJUkiaUdGJUkiU0dGJUYlRiVDKD44JC1JJWlxdW9HRis2JDklIiNEPjglLSZJJWlsb2dHRiU2IyIiIzYjRjc+OCYsJiIjNyIiIkY+RkM+OCg5JD8oOCciIiFGSSwmRkZGSSEiIkZJSSV0cnVlR0YrPkZLLUkmUm91bmRHRiU2JUZLRjtGTkZLRiVGJUYlRlE=</Equation></Text-field>
</Input>
</Group><Presentation-Block>
<Group view="code" labelreference="L4871" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Keccak uses <Font italic="true">multi-rate padding</Font>, an algorithm that pads the message given as a bit list by appending a single bit 1 followed by the minimum number of bits 0 followed by a single bit 1 such that the resulting length is a multiple of the bit rate <Font italic="true">r </Font>(see <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>). The next function implements this algorithm but adds two variants: for the SHA-3 hash functions the application of multi-rate padding is preceded by appending first the bits &quot;01&quot; to the message bit list and for the SHA-3 XOF's, the four bits &quot;1111&quot; are appended first.  Having the full message given as a list of bits is not convenient if the message is long and hence we will consider the message as a list of bytes (which is not restrictive in this context, given the byte-oriented approach mentioned before). These blocks will later be divided into lanes and these lanes converted to integers in the <Font family="Courier New">Keccak</Font> function below, just before their absortion into the state.</Text-field>
<Text-field style="Text" layout="Normal">    The inputs of  the padding function are the message given as a list of bytes (i.e., a list of integers in the 0..255 range), the bit rate <Font italic="true">r </Font>and <Font italic="true">domain,</Font> which can take the values <Font italic="true">'hash'</Font> <Font italic="true">'xof'</Font> or <Font italic="true">'kec'</Font> to apply different paddings and implement <Font italic="true">domain separation</Font> by distinguishing the inputs corresponding to the SHA-3 hash functions from these corresponding to the SHA-3 XOFs, with the value <Font italic="true">'kec'</Font> corresponding to the Keccak function itself. The  output is an array containing the padded message blocks, each of which is given as a list of bytes.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group view="code" labelreference="L5070" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="pad := proc (message::list, r::posint, domain::(identical(hash, xof, kec))) local rby, numby, aby, blocks, lastblock, last; rby := iquo(r, 8); numby := nops(message); aby := irem(numby, rby); blocks := [ListTools:-LengthSplit(message, rby)]; blocks := Array(1 .. nops(blocks), proc (i) options operator, arrow; blocks[i] end proc); if aby = 0 then if domain = hash then lastblock := [6, `$`(0, rby-2), 128] elif domain = xof then lastblock := [31, `$`(0, rby-2), 128] else lastblock := [1, `$`(0, rby-2), 128] end if; if numby = 0 then blocks := Array(1 .. 1, fill = lastblock) else blocks := ArrayTools:-Concatenate(2, blocks, Array(1 .. 1, fill = lastblock)) end if elif aby = rby-1 then if domain = hash then blocks[-1] := [op(blocks[-1]), 134] elif domain = xof then blocks[-1] := [op(blocks[-1]), 159] else blocks[-1] := [op(blocks[-1]), 129] end if else if domain = hash then blocks[-1] := [op(blocks[-1]), 6, `$`(0, rby-aby-2), 128] elif domain = xof then blocks[-1] := [op(blocks[-1]), 31, `$`(0, rby-aby-2), 128] else blocks[-1] := [op(blocks[-1]), 1, `$`(0, rby-aby-2), 128] end if end if; blocks end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZeXm4tSSNtaUdGJDYlUSRwYWRGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSJ+RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHRkwtRjY2LVEqJmNvbG9uZXE7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORlNGNS1GNjYvUSVwcm9jRicvJSVib2xkR0YxL0YzUSVib2xkRicvJStmb250d2VpZ2h0R0ZlbkY7Rj5GQEZCRkRGRkZIRkpGTS1JKG1mZW5jZWRHRiQ2JC1GIzYwLUYsNiVRKG1lc3NhZ2VGJ0YvRjItRjY2LVEtJlByb3BvcnRpb247RidGOUY7Rj5GQEZCRkRGRkZIRlJGVC1GLDYlUSVsaXN0RidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGSi9GTlEsMC4zMzMzMzMzZW1GJ0Y1LUYsNiVRInJGJ0YvRjJGYG8tRiw2JVEncG9zaW50RidGL0YyRmZvLUYsNiVRJ2RvbWFpbkYnRi9GMkZgby1GLDYlUSppZGVudGljYWxGJ0YvRjItRmluNiQtRiM2Ki1GLDYlUSVoYXNoRidGL0YyRmZvRjUtRiw2JVEkeG9mRidGL0YyRmZvRjUtRiw2JVEka2VjRidGL0YyRjlGOUY5RjktRiw2I1EhRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0Zdci8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0Y1LUY2Ni9RJmxvY2FsRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRiw2JVEkcmJ5RidGL0YyRmZvRjUtRiw2JVEmbnVtYnlGJ0YvRjJGZm9GNS1GLDYlUSRhYnlGJ0YvRjJGZm9GNS1GLDYlUSdibG9ja3NGJ0YvRjJGZm9GNS1GLDYlUSpsYXN0YmxvY2tGJ0YvRjJGZm9GNS1GLDYlUSVsYXN0RidGL0YyLUY2Ni1RIjtGJ0Y5RjtGaW9GQEZCRkRGRkZIRkpGVEZocUY1RmhyRk8tRiw2JVElaXF1b0YnRi9GMi1GaW42JC1GIzYmRlxwRmZvLUkjbW5HRiQ2JFEiOEYnRjlGOUY5RmpzRjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1LUY2Ni1RIiNGJ0Y5RjtGPkZARkJGREZGRkhGSkZNLUYsNiVRSlRoaXN+aXN+dGhlfmJpdH5yYXRlfmlufmJ5dGVzfihieXRlfnJhdGUpRidGL0YyRmhxRjVGW3NGNUZPRjUtRiw2JVElbm9wc0YnRi9GMi1GaW42JC1GIzYkRl1vRjlGOUZqc0Y1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1Rmh0LUYsNiVRQ1RoZX5udW1iZXJ+b2Z+Ynl0ZXN+aW5+dGhlfm1lc3NhZ2VGJ0YvRjJGaHFGNUZec0Y1Rk9GNS1GLDYlUSVpcmVtRidGL0YyLUZpbjYkLUYjNidGW3NGZm9GNUZockY5RjlGanNGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGaHQtRiw2JVFhb0VpdGhlcn4wfm9yfnRoZX5udW1iZXJ+b2Z+cmVtYWluaW5nfmJ5dGVzfmFmdGVyfnBhcnRpdGlvbmluZ35pbn5ibG9ja3NGJ0YvRjJGaHFGNUZhc0Y1Rk8tRmluNiYtRiM2Jy1GLDYlUSpMaXN0VG9vbHNGJ0YvRjItRjY2LVEjOi1GJ0Y5RjtGPkZARkJGREZGRkhGSkZNLUYsNiVRLExlbmd0aFNwbGl0RidGL0YyLUZpbjYkLUYjNiZGXW9GZm9GaHJGOUY5RjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0Zqc0Y1Rmh0LUYsNiVRUFRoZX5wYXJ0aXRpb25lZH5tZXNzYWdlLH5ub3d+cGFkZGluZ35zdGFydHN+Li4uRidGL0YyRmhxRjVGYXNGT0Y1LUYsNiVRJkFycmF5RidGL0YyLUZpbjYkLUYjNi0tRmV0NiRRIjFGJ0Y5LUY2Ni1RIy4uRidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjIyMjIyMjJlbUYnRk1GXnUtRmluNiQtRiM2JEZhc0Y5RjlGZm9GNS1GLDYlUSJpRidGL0YyLUY2Ni1RKCZzcmFycjtGJ0Y5RjtGPkZARkJGREZGRkhGSkZNRmFzLUZpbjYmLUYjNiRGX3lGOUY5RmN3RmZ3RjlGOUZqc0ZocUY1LUY2Ni9RI2lmRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGXnNGNS1GNjYtUSI9RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEY1LUZldDYkUSIwRidGOUY1LUY2Ni9RJXRoZW5GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GaHFGNUY1RjVGNUZpeUY1RmJwRjVGXHpGNUZccUY1RmJ6RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUZodC1GLDYlUUFBZGR+YW5+ZW50aXJlfmJsb2NrfmlufnRoaXN+Y2FzZUYnRi9GMkZocUY1RjVGNUY1RjVGNUY1RmRzRjVGTy1GaW42Ji1GIzYqLUZldDYkUSI2RidGOUZmb0Zfei1GNjYtUSIkRidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1GaW42JC1GIzYmRmhyLUY2Ni1RKCZtaW51cztGJ0Y5RjtGPkZARkJGREZGRkhGaXgvRk5GangtRmV0NiRRIjJGJ0Y5RjlGOUZmby1GZXQ2JFEkMTI4RidGOUY5RjlGY3dGZndGZXFGaHFGNUY1RjUtRjY2L1ElZWxpZkYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RmJwRjVGXHpGNUZfcUY1RmJ6RjVGaHFGNUY1RjVGNUY1RjVGNUY1RmRzRjVGT0Y1LUZpbjYmLUYjNiotRmV0NiRRIzMxRidGOUZmb0ZfekZfW2xGYltsRmZvRl1cbEY5RjlGY3dGZndGZXFGaHFGNUY1RjUtRjY2L1ElZWxzZUYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZocUY1RjVGNUY1RjVGNUY1RjVGZHNGNUZPRjUtRmluNiYtRiM2KkZjeEZmb0ZfekZfW2xGYltsRmZvRl1cbEY5RjlGY3dGZndGZXFGaHFGNUY1RjUtRjY2L1EkZW5kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGaXlGanNGaHFGNUY1RjVGaXlGNUZbc0Y1Rlx6RjVGX3pGNUZiekZocUY1RjVGNUY1RjVGNUY1RmFzRjVGT0Y1Rlx4LUZpbjYkLUYjNi1GY3hGZnhGY3hGZm9GNS1GLDYlUSVmaWxsRidGL0YyRjVGXHpGNUZkc0Y5RjlGZXFGaHFGNUY1RjVGalxsRmhxRjVGNUY1RjVGNUY1RjVGYXNGNUZPLUYsNiVRK0FycmF5VG9vbHNGJ0YvRjJGaXYtRiw2JVEsQ29uY2F0ZW5hdGVGJ0YvRjItRmluNiQtRiM2K0ZqW2xGZm9GNUZhc0Zmb0Y1LUYjNiVGXHgtRmluNiQtRiM2LEZjeEZmeEZjeEZmb0Y1RmhdbEZcekY1RmRzRjlGOUY5RmVxRjlGOUZqc0ZocUY1RjVGNUZhXWxGNUZpeUZqc0ZocUZgXGxGNUZec0Y1Rlx6RjVGaHJGNS1GNjYtUSomdW1pbnVzMDtGJ0Y5RjtGPkZARkJGREZGRkhGaXhGaVtsRmN4RjVGYnpGNUZocUY1RjVGNUY1Rml5RjVGNUZicEY1Rlx6RjVGXHFGNUZiekY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1Rmh0LUYsNiVRMkFkZH5qdXN0fm9uZX5ieXRlRidGL0YyRmhxRjVGNUY1RjVGNUY1RjVGYXMtRmluNiYtRiM2JUZbX2xGY3hGOUY5RmN3RmZ3Rk8tRmluNiYtRiM2KC1GLDYlUSNvcEYnRi9GMi1GaW42JC1GIzYlRmFzRmFfbEY5RjlGZm9GNS1GZXQ2JFEkMTM0RidGOUY5RjlGY3dGZndGZXFGaHFGNUY1RjVGYFxsRjVGYnBGNUZcekY1Rl9xRjVGYnpGaHFGNUY1RjVGNUY1RjVGNUY1RmFzRmFfbEZPLUZpbjYmLUYjNihGaV9sRlxgbEZmb0Y1LUZldDYkUSQxNTlGJ0Y5RjlGOUZjd0Zmd0ZlcUZocUY1RjVGNUY1RmpcbEZocUY1RjVGNUY1RjVGNUY1RmFzRmFfbEZPLUZpbjYmLUYjNihGaV9sRlxgbEZmb0Y1LUZldDYkUSQxMjlGJ0Y5RjlGOUZjd0Zmd0ZlcUZocUY1RjVGNUY1RmFdbEY1Rml5RmpzRmhxRjVGalxsRjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGNUY1RjVGaHQtRiw2JVFmbklufnRoaXN+Y2FzZX5hdH5sZWFzdH50d29+Ynl0ZXN+YXJlfmFkZGVkfnRvfnRoZX5sYXN0fmJsb2NrRidGL0YyRmhxRjVGNUY1RjVGNUZpeUY1RmJwRjVGXHpGNUZccUY1RmJ6RmhxRjVGNUY1RjVGNUY1RjVGNUZhc0ZhX2xGNUZPRjUtRmluNiYtRiM2MEZpX2xGXGBsRmZvRjVGXFtsRmZvRjVGX3pGX1tsLUZpbjYkLUYjNihGaHJGZltsRl5zRmZbbEZqW2xGOUY5RmZvRjVGXVxsRjlGOUZjd0Zmd0ZlcUZocUY1RjVGNUY1RmBcbEY1RmJwRjVGXHpGNUZfcUY1RmJ6RmhxRjVGNUY1RjVGNUY1RjVGYXNGYV9sRjVGT0Y1LUZpbjYmLUYjNjBGaV9sRlxgbEZmb0Y1RmdcbEZmb0Y1Rl96Rl9bbEZoYWxGZm9GNUZdXGxGOUY5RmN3RmZ3RmVxRmhxRjVGNUY1RjVGalxsRjVGNUZocUY1RjVGNUY1RjVGNUY1RmFzRmFfbEY1Rk9GNS1GaW42Ji1GIzYwRmlfbEZcYGxGZm9GNUZjeEZmb0Y1Rl96Rl9bbEZoYWxGZm9GNUZdXGxGOUY5RmN3RmZ3RmpzRmhxRjVGNUY1RjVGYV1sRjVGaXlGanNGaHFGNUZhXWxGNUZpeUZqc0ZocUY1RmFzRmhxRjVGYV1sRjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZocS1GaXE2JkZbckZeckZgci9GY3JRJWF1dG9GJ0ZlcS8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSRwYWRHNiJmKjYlJ0kobWVzc2FnZUdGJUklbGlzdEclKnByb3RlY3RlZEcnSSJyR0YlSSdwb3NpbnRHRisnSSdkb21haW5HRiUtSSppZGVudGljYWxHRis2JUklaGFzaEdGJUkkeG9mR0YlSSRrZWNHRiU2KEkkcmJ5R0YlSSZudW1ieUdGJUkkYWJ5R0YlSSdibG9ja3NHRiVJKmxhc3RibG9ja0dGJUklbGFzdEdGJUYlRiVDKT44JC1JJWlxdW9HRis2JDklIiIpPjglLUklbm9wc0dGKzYjOSQ+OCYtSSVpcmVtR0YrNiRGR0ZAPjgnNyMtX0kqTGlzdFRvb2xzRzYkRitJKF9zeXNsaWJHRiVJLExlbmd0aFNwbGl0R0YlNiRGS0ZAPkZSLUkmQXJyYXlHRis2JDsiIiItRkk2I0ZSZio2I0kiaUdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlJlQjRkpGJUYlNiRGO0ZSQCcvRk0iIiFDJEAnLzkmRjQ+OCg3JSIiJy1JIiRHRis2JEZobywmRkBGam4hIiNGam4iJEciL0ZccEY1PkZecDclIiNKRmFwRmZwPkZecDclRmpuRmFwRmZwQCUvRkdGaG8+RlItRmduNiQ7RmpuRmpuL0klZmlsbEdGJUZecD5GUi1fSStBcnJheVRvb2xzR0ZXSSxDb25jYXRlbmF0ZUdGJTYlIiIjRlJGYHEvRk0sJkZARmpuISIiRmpuQCdGW3A+JkZSNiNGXnI3JC1JI29wR0YrNiNGYXIiJE0iRmdwPkZhcjckRmRyIiRmIj5GYXI3JEZkciIkSCJAJ0ZbcD5GYXI3JkZkckZgcC1GYnA2JEZobywoRkBGam5GTUZeckZlcEZqbkZmcEZncD5GYXI3JkZkckZqcEZhc0ZmcD5GYXI3JkZkckZqbkZhc0ZmcEZSRiVGJUYlRl5y</Equation></Text-field>
</Input>
</Group></Presentation-Block>
<Group labelreference="L4873" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"> </Text-field>
<Text-field style="Text" layout="Normal">   Next we give the function that absorbs one block into the state. For this we use Maple's function <Font family="Courier New">ArrayTools:-Copy</Font>, which copies a one-dimensional array containing a <Font family="Courier New">Keccak</Font> block into the zero state. The entries of the block are copied to the state in Fortran order, which Maple uses by default, and this corresponds exactly to the mapping defined in  <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink>, so that we don't need to make the mapping function explicit (note, however, that if we represent the 5x5 state array as a matrix, the <Font italic="true">x</Font>-coordinate serves to enumerate rows and the <Font italic="true">y</Font>-coordinate to enumerate columns, in contrast with the graphical picture given in [<Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">Kreference</Font></Hyperlink><Font italic="true">,</Font> p. 11], where the <Font italic="true">x</Font>-coordinates belong to the horizontal axis and the <Font italic="true">y</Font>-coordinates to the vertical one. Independently of this pictorial representation, the indices of the block are mapped to those of the state in the following order: (0, 0), (1,0), (2,0), (3,0), (4, 0), (0,1), (2,1), ..., which is precisely <Hyperlink linktarget="Help:Fortran_order" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Fortran_order</Font></Hyperlink>). The function inputs are the state array, the block given as a list of bytes, the bit rate <Font italic="true">r</Font> and the permutation width <Font italic="true">b</Font>. The output is the modified state.
</Text-field>
</Input>
</Group>
<Group labelreference="L5030" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="AbsorbBlock := proc (S, blocklist, b, r) local B, w, T; B := S; w := iquo(b, 200); T := Array(0 .. 4, 0 .. 4, fill = 0); ArrayTools:-Copy(Array(`~`[bytestoint]([ListTools:-LengthSplit(blocklist, w)])), T); B := `~`[Bits:-Xor](B, T); B := Keccakf(B, b) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZicC1JI21pR0YkNiVRLEFic29yYkJsb2NrRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtRjY2L1ElcHJvY0YnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGZW5GO0Y+RkBGQkZERkZGSEZKRk0tSShtZmVuY2VkR0YkNiQtRiM2Li1GLDYlUSJTRidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGSi9GTlEsMC4zMzMzMzMzZW1GJ0Y1LUYsNiVRKmJsb2NrbGlzdEYnRi9GMkZgb0Y1LUYsNiVRImJGJ0YvRjJGYG9GNS1GLDYlUSJyRidGL0YyLyUrZXhlY3V0YWJsZUdGPUY5RjktRiw2I1EhRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0ZpcC8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0Y1RjUtRjY2L1EmbG9jYWxGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSJCRidGL0YyRmBvLUYsNiVRIndGJ0YvRjJGYG9GNS1GLDYlUSJURidGL0YyLUY2Ni1RIjtGJ0Y5RjtGY29GQEZCRkRGRkZIRkpGVEY1RmRwRjVGZHFGT0Zdb0ZdckY1LUZlcDYmRmdwRmpwRlxxL0ZfcVElYXV0b0YnRmRwRjVGZ3FGNUZPRjUtRiw2JVElaXF1b0YnRi9GMi1GaW42JC1GIzYmRmlvRmBvLUkjbW5HRiQ2JFEkMjAwRidGOUY5RjlGXXJGZHBGNUZqcUZPLUYsNiVRJkFycmF5RidGL0YyLUZpbjYkLUYjNjEtRlxzNiRRIjBGJ0Y5LUY2Ni1RIy4uRidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjIyMjIyMjJlbUYnRk0tRlxzNiRRIjRGJ0Y5RmBvRmZzRmlzRl50RmBvRjUtRiw2JVElZmlsbEYnRi9GMkY1LUY2Ni1RIj1GJ0Y5RjtGPkZARkJGREZGRkhGUkZURjVGZnNGOUY5Rl1yRjVGZHBGNS1GLDYlUStBcnJheVRvb2xzRidGL0YyLUY2Ni1RIzotRidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1GLDYlUSVDb3B5RidGL0YyLUZpbjYkLUYjNilGX3MtRmluNiQtRiM2Jy1GLDYlUStieXRlc3RvaW50RidGL0YyLUY2Ni1RInxpckYnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4xMTExMTExZW1GJy9GTkZfdi1GaW42JC1GIzYlLUZpbjYmLUYjNigtRiw2JVEqTGlzdFRvb2xzRidGL0YyRmp0LUYsNiVRLExlbmd0aFNwbGl0RidGL0YyLUZpbjYkLUYjNidGZm9GYG9GZ3FGX3BGOUY5Rl9wRjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0ZfcEY5RjlGX3BGOUY5RmBvRjUtRiw2JUZcci9GMEY9RjlGX3BGOUY5Rl1yRjVGZHBGNUZkcUY1Rk9GNS1GLDYlUSVCaXRzRidGL0YyRmp0LUYsNiVRJFhvckYnRi9GMkZbdi1GaW42JC1GIzYoRmRxRmBvRjVGanFGX3BGOUY5Rl1yRmByRmRwRjVGZHFGNUZPRjUtRiw2JVEoS2VjY2FrZkYnRi9GMi1GaW42JC1GIzYmRmRxRmBvRmlvRjlGOUZhcEZkcEY1LUY2Ni9RJGVuZEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RlUtRjY2LVEiOkYnRjlGO0Y+RkBGQkZERkZGSEZSRlRGZHBGYHJGYXBGX3BGOQ==">QyQ+SSxBYnNvcmJCbG9ja0c2ImYqNiZJIlNHRiVJKmJsb2NrbGlzdEdGJUkiYkdGJUkickdGJTYlSSJCR0YlSSJ3R0YlSSJUR0YlRiVGJUMoPjgkOSQ+OCUtSSVpcXVvRyUqcHJvdGVjdGVkRzYkOSYiJCsjPjgmLUkmQXJyYXlHRjg2JTsiIiEiIiVGQS9JJWZpbGxHRiVGQi1fSStBcnJheVRvb2xzRzYkRjhJKF9zeXNsaWJHRiVJJUNvcHlHRiU2JC1GPzYjLSZJInxpckdGODYjSStieXRlc3RvaW50R0YlNiM3Iy1fSSpMaXN0VG9vbHNHRklJLExlbmd0aFNwbGl0R0YlNiQ5JUY1Rj0+RjItJkZRNiNfSSVCaXRzR0ZKSSRYb3JHRjg2JEYyRj0+RjItSShLZWNjYWtmR0YlNiRGMkY6RiVGJUYlISIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5029" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    The following is a different version of the absorbing function which is functionally equivalent to the previous one but does not employ the resources of Maple's <Font family="Courier New">ArrayTools</Font> package and is closer in spirit to the description in <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-implementation-3.2.pdf" hyperlink="true"><Font style="Hyperlink">Kimplementation</Font></Hyperlink>. To force the function <Font family="Courier New">keccak</Font> below to use it instead of the previous function it suffices to drop the 2 at the end of the name and to rename it to <Font family="Courier New">AbsorbBlock.</Font>
</Text-field>
</Input>
</Group>
<Group labelreference="L5016" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="AbsorbBlock2 := proc (S, blocklist, b, r) local B, w, z, m, n, x, y; B := S; w := iquo(b, 200); z := iquo(iquo(r, 8), w); m := iquo(z, 5); n := irem(z, 5); for x from 0 to 4 do for y from 0 to m-1 do B[x, y] := Bits:-Xor(B[x, y], bytestoint(blocklist[w*(5*y+x)+1 .. w*(5*y+x+1)])) end do end do; for x from 0 to n-1 do B[x, m] := Bits:-Xor(B[x, m], bytestoint(blocklist[w*(5*m+x)+1 .. w*(5*m+x+1)])) end do; B := Keccakf(B, b) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZndi1JI21pR0YkNiVRLUFic29yYkJsb2NrMkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTC1GNjYtUSomY29sb25lcTtGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjc3Nzc3OGVtRicvRk5GU0Y1LUY2Ni9RJXByb2NGJy8lJWJvbGRHRjEvRjNRJWJvbGRGJy8lK2ZvbnR3ZWlnaHRHRmVuRjtGPkZARkJGREZGRkhGSkZNLUkobWZlbmNlZEdGJDYkLUYjNi0tRiw2JVEiU0YnRi9GMi1GNjYtUSIsRidGOUY7L0Y/RjFGQEZCRkRGRkZIRkovRk5RLDAuMzMzMzMzM2VtRidGNS1GLDYlUSpibG9ja2xpc3RGJ0YvRjJGYG9GNS1GLDYlUSJiRidGL0YyRmBvRjUtRiw2JVEickYnRi9GMkY5RjktRiw2I1EhRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0ZncC8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0Y1RjUtRjY2L1EmbG9jYWxGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSJCRidGL0YyRmBvLUYsNiVRIndGJ0YvRjJGYG9GNS1GLDYlUSJ6RidGL0YyRmBvLUYsNiVRIm1GJ0YvRjJGYG8tRiw2JVEibkYnRi9GMkZgby1GLDYlUSJ4RidGL0YyRmBvLUYsNiVRInlGJ0YvRjItRjY2LVEiO0YnRjlGO0Zjb0ZARkJGREZGRkhGSkZURmJwRjVGYnFGT0Zdb0ZnckY1LUZjcDYmRmVwRmhwRmpwL0ZdcVElYXV0b0YnRmJwRjVGZXFGNUZPRjUtRiw2JVElaXF1b0YnRi9GMi1GaW42JC1GIzYmRmlvRmBvLUkjbW5HRiQ2JFEkMjAwRidGOUY5RjlGZ3JGYnBGNUZocUY1Rk9GNUZecy1GaW42JC1GIzYnRl5zLUZpbjYkLUYjNiZGXHBGYG8tRmZzNiRRIjhGJ0Y5RjlGOUZgb0ZlcUY5RjlGZ3JGYnBGNUZbckZPRl5zLUZpbjYkLUYjNiZGaHFGYG8tRmZzNiRRIjVGJ0Y5RjlGOUZnckZicEY1Rl5yRk8tRiw2JVElaXJlbUYnRi9GMkZkdEZnckZicC1GNjYvUSRmb3JGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNUZhckY1LUY2Ni9RJWZyb21GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GZnM2JFEiMEYnRjlGNS1GNjYvUSN0b0YnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUZmczYkUSI0RidGOUY1LUY2Ni9RI2RvRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRmJwRjVGNUZedUY1RmRyRjVGYXVGNUZkdUY1Rmd1RjVGW3ItRjY2LVEoJm1pbnVzO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yMjIyMjIyZW1GJy9GTkZkdi1GZnM2JFEiMUYnRjlGNUZddkZicEY1RjVGNUY1RjVGYnEtRmluNiYtRiM2JkZhckZgb0ZkckY5RjkvJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRidGT0Y1LUYsNiVRJUJpdHNGJ0YvRjItRjY2LVEjOi1GJ0Y5RjtGPkZARkJGREZGRkhGSkZNLUYsNiVRJFhvckYnRi9GMi1GaW42JC1GIzYpRmJxRml2RmBvRjUtRiw2JVErYnl0ZXN0b2ludEYnRi9GMi1GaW42JC1GIzYlRmZvLUZpbjYmLUYjNixGZXEtRjY2LVEnJnNkb3Q7RidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1GaW42JC1GIzYoRmh0Rlt5RmRyLUY2Ni1RIitGJ0Y5RjtGPkZARkJGREZGRkhGY3ZGZXZGYXJGOUY5RmJ5RmZ2LUY2Ni1RIy4uRidGOUY7Rj5GQEZCRkRGRkZIRmN2Rk1GZXFGW3ktRmluNiQtRiM2KkZodEZbeUZkckZieUZhckZieUZmdkY5RjlGOUY5Rl13RmB3RjlGOUY5RjlGZ3JGYnBGNUY1RjUtRjY2L1EkZW5kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGXXZGZ3JGNUZicEZcekY1Rl12RmdyRmJwRl51RjVGYXJGNUZhdUY1RmR1RjVGZ3VGNUZeckZgdkZmdkY1Rl12RjVGYnBGNUY1RjVGNUY1RjVGYnEtRmluNiYtRiM2JkZhckZgb0ZbckY5RjlGXXdGYHdGT0Zjd0Zmd0Zpdy1GaW42JC1GIzYqRmJxLUZpbjYmLUYjNidGYXJGYG9GNUZbckY5RjlGXXdGYHdGNUZgb0Y1RmB4LUZpbjYkLUYjNiVGZm8tRmluNiYtRiM2LEZlcUZbeS1GaW42JC1GIzYoRmh0Rlt5RltyRmJ5LUYsNiVGY3IvRjBGPUY5RjlGOUZieUZmdkZleUZlcUZbeS1GaW42JC1GIzYqRmh0Rlt5RltyRmJ5RmdbbEZieUZmdkY5RjlGOUY5Rl13RmB3RjlGOUY5RjlGZ3JGNUZfcEZicEZcekY1Rl12RmdyRmJwRjVGYnFGNUZPRjUtRiw2JVEoS2VjY2FrZkYnRi9GMi1GaW42JC1GIzYmRmJxRmBvRmlvRjlGOUZfcEZicEY1Rlx6RjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZicEZqckZfcC8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SS1BYnNvcmJCbG9jazJHNiJmKjYmSSJTR0YlSSpibG9ja2xpc3RHRiVJImJHRiVJInJHRiU2KUkiQkdGJUkid0dGJUkiekdGJUkibUdGJUkibkdGJUkieEdGJUkieUdGJUYlRiVDKj44JDkkPjglLUklaXF1b0clKnByb3RlY3RlZEc2JDkmIiQrIz44Ji1GOzYkLUY7NiQ5JyIiKUY5PjgnLUY7NiRGQSIiJj44KC1JJWlyZW1HRjxGSz8oOCkiIiEiIiIiIiVJJXRydWVHRjw/KDgqRlNGVCwmRklGVCEiIkZURlY+JkY2NiRGUkZYLV9JJUJpdHNHSShfc3lzbGliR0YlSSRYb3JHRjw2JEZmbi1JK2J5dGVzdG9pbnRHRiU2IyY5JTYjOywmKiZGOUZULCZGWEZMRlJGVEZURlRGVEZUKiZGOUZULChGWEZMRlJGVEZURlRGVD8oRlJGU0ZULCZGTkZURlpGVEZWPiZGNjYkRlJGSS1GaW42JEZdcC1GX282IyZGYm82IzssJiomRjlGVCwmRklGTEZSRlRGVEZURlRGVComRjlGVCwoRklGTEZSRlRGVEZURlQ+RjYtSShLZWNjYWtmR0YlNiRGNkY+RiVGJUYlRlo=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4879" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Next we give the squeezing function, which extracts the bits from the state after processing them with the <Font family="Courier New">Keccak</Font> permutation. The inputs are the state array, the <Font family="Courier New">Keccak</Font> width, the bit rate and the required output length in bits. The output is a list of bytes corresponding to the required length.
</Text-field>
</Input>
</Group>
<Group labelreference="L4878" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Squeeze := proc (S, b, r, n) local w, z, B, l, m, Z, h; w := iquo(b, 25); B := S; l := convert(B, list)[1 .. iquo(r, w)]; while nops(l) &lt; n/w do B := Keccakf(B, b); l := [op(l), op(convert(B, list))[1 .. iquo(r, w)]] end do; l := ListTools:-Flatten(`~`[decimaltob](l, 256, iquo(w, 8))); l[1 .. iquo(n, 8)] end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZmci1JI21pR0YkNiVRKFNxdWVlemVGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSJ+RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHRkwtRjY2LVEqJmNvbG9uZXE7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORlMtRjY2L1ElcHJvY0YnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGZW5GO0Y+RkBGQkZERkZGSEZKRk0tSShtZmVuY2VkR0YkNiQtRiM2LS1GLDYlUSJTRidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGSi9GTlEsMC4zMzMzMzMzZW1GJ0Y1LUYsNiVRImJGJ0YvRjJGYG9GNS1GLDYlUSJyRidGL0YyRmBvRjUtRiw2JVEibkYnRi9GMkY5RjktRiw2I1EhRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0ZncC8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0Y1LUY2Ni9RJXVzZXNGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSpMaXN0VG9vbHNGJ0YvRjItRjY2LVEiO0YnRjlGO0Zjb0ZARkJGREZGRkhGSkZURmJwRjUtRjY2L1EmbG9jYWxGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSJ3RidGL0YyRmBvRjUtRiw2JVEiekYnRi9GMkZgby1GLDYlUSJCRidGL0YyRmBvLUYsNiVRImxGJ0YvRjJGYG8tRiw2JVEibUYnRi9GMkZgby1GLDYlUSJaRidGL0YyRmBvLUYsNiVRImhGJ0YvRjJGZXFGYnBGNUZbckZPLUYsNiVRJWlxdW9GJ0YvRjItRmluNiQtRiM2J0Zmb0Zgby1JI21uR0YkNiRRIzI1RidGOS8lK2V4ZWN1dGFibGVHRj1GOUY5RmVxRmJwRjVGYXJGT0Zdb0ZlcUY1RmJwRjVGNUZkckY1Rk9GNS1GLDYlUShjb252ZXJ0RidGL0YyLUZpbjYkLUYjNiYtRiw2JUZjci9GMEY9RjlGYG8tRiw2JVElbGlzdEYnRi9GMkY5RjktRmluNiYtRiM2KC1GaHM2JFEiMUYnRjktRjY2LVEjLi5GJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRidGTUZgcy1GaW42JC1GIzYmRmlvRmBvRltyRjlGOUZfcEY5RjkvJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRidGZXEtRmNwNiZGZXBGaHBGanAvRl1xUSVhdXRvRidGYnBGYHZGNS1GNjYvUSZ3aGlsZUYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUYsNiVRJW5vcHNGJ0YvRjItRmluNiQtRiM2JEZkckY5RjktRjY2LVEiPEYnRjlGO0Y+RkBGQkZERkZGSEZSRlQtSSZtZnJhY0dGJDYoLUYjNiVGXHBGL0YyLUYjNiUtRiw2JUZdckZmdEY5Ri9GMi8lLmxpbmV0aGlja25lc3NHRmB1LyUrZGVub21hbGlnbkdRJ2NlbnRlckYnLyUpbnVtYWxpZ25HRl54LyUpYmV2ZWxsZWRHRj1GNS1GNjYvUSNkb0YnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZicEY1RjVGNUY1RmFyRjVGT0Y1LUYsNiVRKEtlY2Nha2ZGJ0YvRjItRmluNiQtRiM2JkZhckZgb0Zmb0Y5RjlGZXFGYnBGNUY1RjVGNUY1RmRyRjVGT0Y1LUZpbjYmLUYjNistRiw2JVEjb3BGJ0YvRjJGanZGYG9GNUZheS1GaW42JC1GIzYlRl10RmB0RjlGOS1GaW42Ji1GIzYoRl51RmF1LUYsNiVGYnNGZnRGOS1GaW42JC1GIzYmLUYsNiVGW3BGZnRGOUZgb0Zod0Y5RjlGX3BGOUY5Rmp1Rl12Rl9wRjlGOUZqdUZddkZfcEZicC1GNjYvRjhGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNLUY2Ni9RJGVuZEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RmN4RmVxRmJwRjVGNUZkckZPLUYsNiVRKEZsYXR0ZW5GJ0YvRjItRmluNiQtRiM2Jy1GLDYlUStkZWNpbWFsdG9iRidGL0YyLUY2Ni1RInxpckYnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4xMTExMTExZW1GJy9GTkZnW2wtRmluNiQtRiM2K0ZkckZgb0Y1LUZoczYkUSQyNTZGJ0Y5RmBvRjVGXHotRmluNiQtRiM2JkZod0Zgby1GaHM2JFEiOEYnRjlGOUY5RjlGOUZbdEY5RjlGZXFGYnBGNUZkci1GaW42Jy1GIzYoLUZoczYlRmB1Ri9GMi1GNjYuRmN1Ri9GMkY7Rj5GQEZCRkRGRkZIRmR1Rk1GYHMtRmluNiUtRiM2J0ZccC1GNjYuRmJvRi9GMkY7RmNvRkBGQkZERkZGSEZKRmRvLUZoczYlRmZcbEYvRjJGL0YyRi9GMkYvRjJGL0YyRmp1Rl12Rl9wRmJwRjVGZnpGNUZVLUY2Ni1RIjpGJ0Y5RjtGPkZARkJGREZGRkhGUkZURmJwRmB2Rl9wRlt0Rjk=">QyQ+SShTcXVlZXplRzYiZio2JkkiU0dGJUkiYkdGJUkickdGJUkibkdGJTYpSSJ3R0YlSSJ6R0YlSSJCR0YlSSJsR0YlSSJtR0YlSSJaR0YlSSJoR0YlRiVGJUMoPjgkLUklaXF1b0clKnByb3RlY3RlZEc2JDklIiNEPjgmOSQ+OCcmLUkoY29udmVydEdGOTYkRj5JJWxpc3RHRjk2IzsiIiItRjg2JDkmRjY/KEYlRklGSUYlMi1JJW5vcHNHRjk2I0ZBKiY5J0ZJRjYhIiJDJD5GPi1JKEtlY2Nha2ZHRiU2JEY+Rjs+RkE3JC1JI29wR0Y5RlEmLUZnbjYjRkNGRz5GQS1fSSpMaXN0VG9vbHNHNiRGOUkoX3N5c2xpYkdGJUkoRmxhdHRlbkdGJTYjLSZJInxpckdGOTYjSStkZWNpbWFsdG9iR0YlNiVGQSIkYyMtRjg2JEY2IiIpJkZBNiM7RkktRjg2JEZTRlxwRiVGJUYlRlQ=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4877" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">      Now we combine the previous functions to obtain a version of <Font family="Courier New">Keccak</Font> that acts on messages given as lists of bytes and produces its output also in this format. This function is used below to construct the <Font family="Courier New">Keccak</Font> sponge function and the SHA-3 functions, as well as the SHA-3 based HMAC. As mentioned above, all of the numeric parameters <Font italic="true">b</Font>, <Font italic="true">r</Font>, <Font italic="true">n</Font>, are required to be multiples of 8 as a consequence of the byte-oriented character of the implementation. In fact, we will require that the bit rate <Font italic="true">r</Font> is a multiple of the lane width <Font italic="true">w</Font> since this simplifies the implementation somewhat and is not too restrictive in practice (for example, all the values for <Font italic="true">b</Font>, <Font italic="true">r</Font> and <Font italic="true">n</Font> used in the SHA-3 functions, and hence on HMAC based on these functions, comply with this requisite). Here the command <Equation executable="false" style="2D Math" input-equation="" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JlElQml0c0YnLyUnZmFtaWx5R1EsQ291cmllcn5OZXdGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LlEjOi1GJ0YvRjUvJSZmZW5jZUdGNC8lKnNlcGFyYXRvckdGNC8lKXN0cmV0Y2h5R0Y0LyUqc3ltbWV0cmljR0Y0LyUobGFyZ2VvcEdGNC8lLm1vdmFibGVsaW1pdHNHRjQvJSdhY2NlbnRHRjQvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUYsNiZRKVNldHRpbmdzRidGL0YyRjUtSShtZmVuY2VkR0YkNiUtRiM2KC1GLDYmUSxkZWZhdWx0Yml0c0YnRi9GMkY1LUY5Ni5RIn5GJ0YvRjVGPEY+RkBGQkZERkZGSEZKRk0tRjk2LlEiPUYnRi9GNUY8Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORltvRlotRiw2JlEid0YnRi9GMkY1RjVGL0Y1RjU=">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JlElQml0c0YnLyUnZmFtaWx5R1EsQ291cmllcn5OZXdGJy8lJ2l0YWxpY0dRJmZhbHNlRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LlEjOi1GJ0YvRjUvJSZmZW5jZUdGNC8lKnNlcGFyYXRvckdGNC8lKXN0cmV0Y2h5R0Y0LyUqc3ltbWV0cmljR0Y0LyUobGFyZ2VvcEdGNC8lLm1vdmFibGVsaW1pdHNHRjQvJSdhY2NlbnRHRjQvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUYsNiZRKVNldHRpbmdzRidGL0YyRjUtSShtZmVuY2VkR0YkNiUtRiM2KC1GLDYmUSxkZWZhdWx0Yml0c0YnRi9GMkY1LUY5Ni5RIn5GJ0YvRjVGPEY+RkBGQkZERkZGSEZKRk0tRjk2LlEiPUYnRi9GNUY8Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORltvRlotRiw2JlEid0YnRi9GMkY1RjVGL0Y1RjU=</Equation> plays an important role because it forces all bitwise operations with the integers representing <Font italic="true">w</Font>-bit lanes to be performed with <Font italic="true">w</Font>-bit width and, in particular, if the lanes are shorter than 64 bytes (as it happens whenever <Font italic="true">b</Font> &lt; 1600), the XOR operation with the 64-bit round constants defined above is performed over the first <Font italic="true">w</Font> bits, which is equivalent to the truncation of these constants before XORing them and makes it unnecessary to perform this truncation explicitly.
    The function proceeds as in the pseudocode given in [<Hyperlink linktarget="http://keccak.noekeon.org/Keccak-implementation-3.2.pdf" hyperlink="true"><Font style="Hyperlink">Kimplementation</Font></Hyperlink>, p. 9]. First, padding is performed with the previous function <Font family="Courier New">pad</Font> and then the state is initialized. The next step is the absorbing phase which is performed for each block by the function <Font family="Courier New">AbsorbBlock</Font> and, finally, the squeezing phase produces the requested output by means of the function <Font family="Courier New">Squeeze</Font>. </Text-field>
<Text-field style="Text" layout="Normal">    The inputs of the function are the message in one of the three valid formats, the permutation width <Font italic="true">b</Font>, the bit rate <Font italic="true">r</Font>, the output length <Font italic="true">n </Font>and, finally, <Font italic="true">domain</Font>, which is used to select the type of padding that will be applied and will take the values <Font italic="true">'hash'</Font>  for the SHA-3 hash functions, <Font italic="true">'xof'</Font> for the SHAKE functions and '<Font italic="true">kec'</Font> for <Font family="Courier New">Keccak</Font>. The output is a list of bytes which will be converted in the function <Font family="Courier New">Keccak</Font> below to a hex string to obtain the message digest.
</Text-field>
</Input>
</Group>
<Group labelreference="L5071" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="keccak := proc (message, b, r, n, domain) local m, w, S, nb, i, P; if not b in [200, 400, 800, 1600] then error &quot;b-value of %1 not supported&quot;, b end if; if not `mod`(n, 8) = 0 then error &quot;the output length n = %1 should be a multiple of 8&quot;, n end if; w := iquo(b, 25); if `mod`(r, w) &lt;&gt; 0 then error &quot;the bit rate r should be a multiple of w = %1&quot;, w end if; Bits:-Settings(defaultbits = w); m := pad(message, r, domain); S := Array(0 .. 4, 0 .. 4, proc (i, j) options operator, arrow; 0 end proc); nb := ArrayTools:-NumElems(m); for i to nb do S := AbsorbBlock(S, m[i], b, r) end do; Squeeze(S, b, r, n) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZgeC1JI21pR0YkNiVRJ2tlY2Nha0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTC1GNjYtUSomY29sb25lcTtGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjc3Nzc3OGVtRicvRk5GU0Y1LUY2Ni9RJXByb2NGJy8lJWJvbGRHRjEvRjNRJWJvbGRGJy8lK2ZvbnR3ZWlnaHRHRmVuRjtGPkZARkJGREZGRkhGSkZNLUkobWZlbmNlZEdGJDYkLUYjNjAtRiw2JVEobWVzc2FnZUYnRi9GMi1GNjYtUSIsRidGOUY7L0Y/RjFGQEZCRkRGRkZIRkovRk5RLDAuMzMzMzMzM2VtRidGNS1GLDYlUSJiRidGL0YyRmBvRjUtRiw2JVEickYnRi9GMkZgb0Y1LUYsNiVRIm5GJ0YvRjJGYG9GNS1GLDYlUSdkb21haW5GJ0YvRjJGOUY5RjUtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0ZncC8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0Y1LUY2Ni9RJmxvY2FsRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRiw2JVEibUYnRi9GMkZgby1GLDYlUSJ3RidGL0YyRmBvLUYsNiVRIlNGJ0YvRjJGYG9GNS1GLDYlUSNuYkYnRi9GMkZgb0Y1LUYsNiVRImlGJ0YvRjJGYG9GNS1GLDYlUSJQRidGL0YyLUY2Ni1RIjtGJ0Y5RjtGY29GQEZCRkRGRkZIRkpGVEZicC1GY3A2JkZlcEZocEZqcC9GXXFRJWF1dG9GJy1GNjYvUSNpZkYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUY2Ni9RJG5vdEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RmZvRjUtRjY2L1EjaW5GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GaW42Ji1GIzYqLUkjbW5HRiQ2JFEkMjAwRidGOUZgby1GaXM2JFEkNDAwRidGOUZgby1GaXM2JFEkODAwRidGOUZgby1GaXM2JFElMTYwMEYnRjlGOUY5LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnRjUtRjY2L1EldGhlbkYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZicEY1RjVGNS1GNjYvUSZlcnJvckYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUkjbXNHRiQ2I1E8Yi12YWx1ZX5vZn4lMX5ub3R+c3VwcG9ydGVkRidGYG9GNUZmb0ZicEY1LUY2Ni9RJGVuZEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RltzRmRyRmJwRjVGW3NGNUZec0Y1LUYsNiVGXnAvRjBGPUY5RjUtRjY2L1EkbW9kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRmlzNiRRIjhGJ0Y5RjUtRjY2LVEiPUYnRjlGO0Y+RkBGQkZERkZGSEZSRlRGNS1GaXM2JFEiMEYnRjlGNUZbdUZicEY1RjVGNUZedUY1LUZidTYjUVN0aGV+b3V0cHV0fmxlbmd0aH5ufj1+JTF+c2hvdWxkfmJlfmF+bXVsdGlwbGV+b2Z+OEYnRmBvRjVGXHBGYnBGNUZldUY1RltzRmRyRmdyRmJwRmdyRmVxRjVGT0Y1LUYsNiVRJWlxdW9GJ0YvRjItRmluNiQtRiM2JkZmb0Zgby1GaXM2JFEjMjVGJ0Y5RjlGOUZkckZicEY1RltzRjVGaW9GNUZbdkY1RmVxRjUtRjY2LVErJk5vdEVxdWFsO0YnRjlGO0Y+RkBGQkZERkZGSEZSRlRGZHZGNUZbdUZicEY1RjVGNUZedUY1LUZidTYjUU50aGV+Yml0fnJhdGV+cn5zaG91bGR+YmV+YX5tdWx0aXBsZX5vZn53fj1+JTFGJ0Zgb0Y1RmVxRmJwRjVGZXVGNUZbc0ZkckZicEY1LUYsNiVRJUJpdHNGJ0YvRjItRjY2LVEjOi1GJ0Y5RjtGPkZARkJGREZGRkhGSkZNLUYsNiVRKVNldHRpbmdzRidGL0YyLUZpbjYkLUYjNigtRiw2JVEsZGVmYXVsdGJpdHNGJ0YvRjJGNUZhdkY1RmVxRjlGOUZkckZicEY1RmJxLUY2Ni5GUUYvRjJGO0Y+RkBGQkZERkZGSEZSRlQtRjY2LkY4Ri9GMkY7Rj5GQEZCRkRGRkZIRkpGTS1GLDYlUSRwYWRGJ0YvRjItRmluNiUtRiM2LEZdby1GNjYuRmJvRi9GMkY7RmNvRkBGQkZERkZGSEZKRmRvRlx5RmlvRmV5Rlx5Rl9wRi8vJStleGVjdXRhYmxlR0Y9RjJGL0YyLUY2Ni5GZnJGL0YyRjtGY29GQEZCRkRGRkZIRkpGVEZicEY1RmhxRjVGTy1GLDYlUSZBcnJheUYnRi9GMi1GaW42JC1GIzYvRmR2LUY2Ni1RIy4uRidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjIyMjIyMjJlbUYnRk0tRmlzNiRRIjRGJ0Y5RjVGYG9GZHZGYnpGZ3pGYG8tRmluNiQtRiM2JkZeckZgby1GLDYlUSJqRidGL0YyRjlGOS1GNjYtUSgmc3JhcnI7RidGOUY7Rj5GQEZCRkRGRkZIRkpGTUZkdkY5RjlGZHItRjY2LVEiI0YnRjlGO0Y+RkBGQkZERkZGSEZKRk0tRiw2JVE5dGhlfnplcm9+KG9yfnJvb3QpfnN0YXRlRidGL0YyRmJwRjVGW3JGNUZPRjUtRiw2JVErQXJyYXlUb29sc0YnRi9GMkZdeC1GLDYlUSlOdW1FbGVtc0YnRi9GMi1GaW42JC1GIzYkRmJxRjlGOUZkckZicEY1LUY2Ni9RJGZvckYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1Rl5yRjUtRjY2L1ElZnJvbUYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUZpczYkUSIxRidGOUY1LUY2Ni9RI3RvRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGW3JGNS1GNjYvUSNkb0YnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZicEY1RmhxRjVGT0Y1LUYsNiVRLEFic29yYkJsb2NrRidGL0YyLUZpbjYkLUYjNi5GaHFGYG9GNUZicS1GaW42Ji1GIzYkRl5yRjlGOUZldEZodEZgb0Y1RmZvRmBvRjVGaW9GOUY5RmRyRjVGYnBGNUZldUY1RmBdbEZkckY1RmJwRjUtRiw2JVEoU3F1ZWV6ZUYnRi9GMi1GaW42JC1GIzYqRmhxRmBvRmZvRmBvRmlvRmBvRlxwRjlGOUZkckZicEY1RmV1RjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZicEZnci1GLDYjUSFGJ0ZneUY5">QyQ+SSdrZWNjYWtHNiJmKjYnSShtZXNzYWdlR0YlSSJiR0YlSSJyR0YlSSJuR0YlSSdkb21haW5HRiU2KEkibUdGJUkid0dGJUkiU0dGJUkjbmJHRiVJImlHRiVJIlBHRiVGJUYlQyxAJDQtSSNpbkclKnByb3RlY3RlZEc2JDklNyYiJCsjIiQrJSIkKykiJSs7WTYkUTxiLXZhbHVlfm9mfiUxfm5vdH5zdXBwb3J0ZWRGJUY7QCQ0Ly1JJG1vZEdGJTYkOSciIikiIiFZNiRRU3RoZX5vdXRwdXR+bGVuZ3Rofm5+PX4lMX5zaG91bGR+YmV+YX5tdWx0aXBsZX5vZn44RiVGSj44JS1JJWlxdW9HRjk2JEY7IiNEQCQwLUZINiQ5JkZRRkxZNiRRTnRoZX5iaXR+cmF0ZX5yfnNob3VsZH5iZX5hfm11bHRpcGxlfm9mfnd+PX4lMUYlRlEtX0klQml0c0dJKF9zeXNsaWJHRiVJKVNldHRpbmdzR0YlNiMvSSxkZWZhdWx0Yml0c0dGJUZRPjgkLUkkcGFkR0YlNiU5JEZaOSg+OCYtSSZBcnJheUdGOTYlO0ZMIiIlRlxwZio2JEYySSJqR0YlRiU2JEkpb3BlcmF0b3JHRiVJJmFycm93R0YlRiVGTEYlRiVGJT44Jy1fSStBcnJheVRvb2xzRzYkRjlGW29JKU51bUVsZW1zR0YlNiNGYW8/KDgoIiIiRl5xRmVwSSV0cnVlR0Y5PkZoby1JLEFic29yYkJsb2NrR0YlNiZGaG8mRmFvNiNGXXFGO0ZaLUkoU3F1ZWV6ZUdGJTYmRmhvRjtGWkZKRiVGJUYlISIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4990" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    Finally, we give the <Font family="Courier New">Keccak</Font> (sponge) function for ordinary messages. The input parameters are <Font italic="true">message</Font>, for a message given either as a text string, a file name (including the full path if the file is not in the current working directory) or a hex string, <Font italic="true">b</Font> for the <Font family="Courier New">Keccak</Font> width, <Font italic="true">r</Font> for the bit rate, <Font italic="true">n</Font> for the desired output length in bits (all of them satisfying the requirements stated above) and, finally, a name (<Font italic="true">hex</Font>, <Font italic="true">text</Font> or <Font italic="true">file</Font>) to indicate which kind of message is being processed (with <Font italic="true">text</Font> being the default). The default values for the width and the bit rate are those suggested in <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-submission-3.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Ksubmission</Font></Hyperlink>. As mentioned in <Hyperlink linktarget="http://sponge.noekeon.org/CSF-0.1.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Csponge</Font></Hyperlink> the resulting capacity value of 576 precludes generic attacks with expected complexity below <Equation executable="false" style="Text" input-equation="" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUklbXN1cEdGJDYlLUkjbW5HRiQ2JFEiMkYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1GIzYnLUYvNiRRJDI4OEYnRjIvJSdpdGFsaWNHUSV0cnVlRicvJStmb3JlZ3JvdW5kR1EsWzIwMCwwLDIwMF1GJy8lLHBsYWNlaG9sZGVyR0Y8L0YzUSdpdGFsaWNGJy8lMXN1cGVyc2NyaXB0c2hpZnRHUSIwRictSSNtb0dGJDYtUSIuRidGMi8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGTS8lKXN0cmV0Y2h5R0ZNLyUqc3ltbWV0cmljR0ZNLyUobGFyZ2VvcEdGTS8lLm1vdmFibGVsaW1pdHNHRk0vJSdhY2NlbnRHRk0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0Zmbi1GSDYtUSJ+RidGMkZLRk5GUEZSRlRGVkZYRlpGZ25GMg==">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUklbXN1cEdGJDYlLUkjbW5HRiQ2JFEiMkYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1GIzYnLUYvNiRRJDI4OEYnRjIvJSdpdGFsaWNHUSV0cnVlRicvJStmb3JlZ3JvdW5kR1EsWzIwMCwwLDIwMF1GJy8lLHBsYWNlaG9sZGVyR0Y8L0YzUSdpdGFsaWNGJy8lMXN1cGVyc2NyaXB0c2hpZnRHUSIwRictSSNtb0dGJDYtUSIuRidGMi8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGTS8lKXN0cmV0Y2h5R0ZNLyUqc3ltbWV0cmljR0ZNLyUobGFyZ2VvcEdGTS8lLm1vdmFibGVsaW1pdHNHRk0vJSdhY2NlbnRHRk0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0Zmbi1GSDYtUSJ+RidGMkZLRk5GUEZSRlRGVkZYRlpGZ25GMg==</Equation>The output is the message digest given as a hex string.
</Text-field>
</Input>
</Group>
<Group labelreference="L5072" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Keccak := proc (message::string, b::posint := 1600, r::posint := 1024, n::posint := 1024, messagetype::name := text) local m, l; m := messagetobytes(message, messagetype); l := keccak(m, b, r, n, kec); bytestohexstring(l) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZaLUkjbWlHRiQ2JVEnS2VjY2FrRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtRjY2L1ElcHJvY0YnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGZW5GO0Y+RkBGQkZERkZGSEZKRk0tSShtZmVuY2VkR0YkNiQtRiM2QS1GLDYlUShtZXNzYWdlRidGL0YyLUY2Ni1RLSZQcm9wb3J0aW9uO0YnRjlGO0Y+RkBGQkZERkZGSEZSRlQtRiw2JVEnc3RyaW5nRidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGSi9GTlEsMC4zMzMzMzMzZW1GJ0Y1LUYsNiVRImJGJ0YvRjJGYG8tRiw2JVEncG9zaW50RidGL0YyRk8tSSNtbkdGJDYkUSUxNjAwRidGOUZmb0Y1LUYsNiVRInJGJ0YvRjJGYG9GX3BGTy1GY3A2JFElMTAyNEYnRjlGZm8tRiw2JVEibkYnRi9GMkZgb0ZfcEZPRmlwRmZvRjUtRiw2JVEsbWVzc2FnZXR5cGVGJ0YvRjJGYG8tRiw2JVElbmFtZUYnRi9GMkZPLUYsNiVRJXRleHRGJ0YvRjJGOUY5RjUtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0Zdci8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0Y1LUY2Ni9RJXVzZXNGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSpMaXN0VG9vbHNGJ0YvRjItRjY2LVEiO0YnRjlGO0Zpb0ZARkJGREZGRkhGSkZURmhxRjUtRjY2L1EmbG9jYWxGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSJtRidGL0YyRmZvRjUtRiw2JVEibEYnRi9GMkZbc0Y1RmhxLUZpcTYmRltyRl5yRmByL0ZjclElYXV0b0YnRmFzRjVGT0Y1LUYsNiVRL21lc3NhZ2V0b2J5dGVzRidGL0YyLUZpbjYkLUYjNidGXW9GZm9GNUZfcUY5RjlGW3NGaHFGNUZkc0ZPLUYsNiVRJ2tlY2Nha0YnRi9GMi1GaW42JC1GIzYwRmFzRmZvRjVGXHBGZm9GNUZmcEZmb0Y1RlxxRmZvRjUtRiw2JVEka2VjRidGL0YyRjlGOUZbc0ZocUZnc0Y1LUYsNiVRMWJ5dGVzdG9oZXhzdHJpbmdGJ0YvRjItRmluNiQtRiM2JEZkc0Y5RjktRiw2I1EhRidGaHFGNS1GNjYvUSRlbmRGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNUZVLUY2Ni1RIjpGJ0Y5RjtGPkZARkJGREZGRkhGUkZURmhxRmdzRmN1LyUrZXhlY3V0YWJsZUdGPUY5">QyQ+SSdLZWNjYWtHNiJ0KzYnJ0kobWVzc2FnZUdGJUknc3RyaW5nRyUqcHJvdGVjdGVkRz4nSSJiR0YlSSdwb3NpbnRHRisiJSs7PidJInJHRiVGLyIlQzU+J0kibkdGJUYvRjQ+J0ksbWVzc2FnZXR5cGVHRiVJJW5hbWVHRitJJXRleHRHRiU2JEkibUdGJUkibEdGJUYlRiVDJT44JC1JL21lc3NhZ2V0b2J5dGVzR0YlNiQ5JDkoPjglLUkna2VjY2FrR0YlNidGQjklOSY5J0kka2VjR0YlLUkxYnl0ZXN0b2hleHN0cmluZ0dGJTYjRklGJUYlRiU2IyIiJiEiIg==</Equation></Text-field>
</Input>
</Group>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">SHA-3</Text-field></Title>
<Group labelreference="L4930" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">    The process of SHA-3 standardization by NIST was completed in August 2015 and includes four hash functions with output lengths of  224, 256, 384 and 512 bits. In all these cases, the width is 1600 (i.e., the underlying permutation is <Font family="Courier New">Keccak</Font>-<Font italic="true">f</Font>[1600]) and the capacity is twice the output length. The capacity works as a security parameter, so that security is increased with higher capacities, but there is a security-efficiency trade-off and speed may be increased by using lower capacities (see <Hyperlink linktarget="http://keccak.noekeon.org/NoteOnKeccakParametersAndUsage.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">KParameters</Font></Hyperlink>).</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The function SHA3 below is an implementation of the four hash functions in the SHA-3 standard. It is an indexed function which should be called in the form:</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    SHA3[<Font italic="true">n</Font>](<Font italic="true">message</Font>)</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">where <Font italic="true">n</Font> is the output length in bits (which must be one of the following values: 224, 256, 384, 512), <Font italic="true">message</Font> is the message and there is an additional (optional) input parameter to specify the type of message (<Font italic="true">text</Font>, <Font italic="true">hex</Font> or <Font italic="true">file</Font>) with <Font italic="true">text</Font> the default. 
</Text-field>
</Input>
</Group>
<Group labelreference="L5073" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="SHA3 := proc (message::string, messagetype::name := text) local n, m, l; if type(procname, 'indexed') then n := op(procname) else error &quot;output length not specified&quot; end if; if not n in {224, 256, 384, 512} then error &quot;%1 is not a valid output length&quot;, n end if; m := messagetobytes(message, messagetype); l := keccak(m, 1600, 1600-2*n, n, hash); bytestohexstring(l) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZkci1JI21pR0YkNiVRJVNIQTNGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSJ+RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHRkwtRjY2LVEqJmNvbG9uZXE7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORlNGNS1GNjYvUSVwcm9jRicvJSVib2xkR0YxL0YzUSVib2xkRicvJStmb250d2VpZ2h0R0ZlbkY7Rj5GQEZCRkRGRkZIRkpGTS1JKG1mZW5jZWRHRiQ2JC1GIzYtLUYsNiVRKG1lc3NhZ2VGJ0YvRjItRjY2LVEtJlByb3BvcnRpb247RidGOUY7Rj5GQEZCRkRGRkZIRlJGVC1GLDYlUSdzdHJpbmdGJ0YvRjItRjY2LVEiLEYnRjlGOy9GP0YxRkBGQkZERkZGSEZKL0ZOUSwwLjMzMzMzMzNlbUYnRjUtRiw2JVEsbWVzc2FnZXR5cGVGJ0YvRjJGYG8tRiw2JVElbmFtZUYnRi9GMkZPLUYsNiVRJXRleHRGJ0YvRjJGOUY5LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRkwvJSZkZXB0aEdGXXEvJSpsaW5lYnJlYWtHUShuZXdsaW5lRidGNS1GNjYvUSZsb2NhbEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUYsNiVRIm5GJ0YvRjJGZm9GNS1GLDYlUSJtRidGL0YyRmZvRjUtRiw2JVEibEYnRi9GMi1GNjYtUSI7RidGOUY7RmlvRkBGQkZERkZGSEZKRlRGaHBGNS1GNjYvUSNpZkYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUYsNiVRJXR5cGVGJy9GMEY9RjktRmluNiQtRiM2KS1GLDYlUSlwcm9jbmFtZUYnRmpyRjlGZm9GNS1GNjYtUSkmcnNxdW9yO0YnRjkvRjxGMUY+RkBGQkZERkZGSEZKRk0tRiw2JVEoaW5kZXhlZEYnRmpyRjlGYnNGOUY5RjUtRjY2L1EldGhlbkYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZocEY1RjVGNUY1RmhxRk9GNS1GLDYlUSNvcEYnRmpyRjktRmluNiQtRiM2JEZfc0Y5RjlGZXBGaHBGNS1GNjYvUSVlbHNlRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRmhwRjVGNUY1RjUtRjY2L1EmZXJyb3JGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1JI21zR0YkNiNRPG91dHB1dH5sZW5ndGh+bm90fnNwZWNpZmllZEYnRmhwRjUtRjY2L1EkZW5kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGZHJGYXJGaHBGNUZkckY1LUY2Ni9RJG5vdEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RmhxRjUtRjY2L1EjaW5GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GaW42Ji1GIzYtLUkjbW5HRiQ2JFEkMjI0RidGOUZmb0Y1LUZbdjYkUSQyNTZGJ0Y5RmZvRjUtRlt2NiRRJDM4NEYnRjlGZm9GNS1GW3Y2JFEkNTEyRidGOUY5RjkvJSVvcGVuR1EifGZyRicvJSZjbG9zZUdRInxockYnRjVGaXNGaHBGNUY1RjVGNUY1RmZ0RjUtRmp0NiNRQCUxfmlzfm5vdH5hfnZhbGlkfm91dHB1dH5sZW5ndGhGJ0Zmb0Y1RmhxRmhwRjVGXXVGNUZkckZhckZocEY1RltyRjVGT0Y1LUYsNiVRL21lc3NhZ2V0b2J5dGVzRidGL0YyLUZpbjYkLUYjNidGXW9GZm9GNUZccEY5RjlGYXJGaHBGNUZeckY1Rk9GNS1GLDYlUSdrZWNjYWtGJ0YvRjItRmluNiQtRiM2NEZbckZmb0Y1LUZbdjYkUSUxNjAwRidGOUZmb0Y1Rl54LUY2Ni1RKCZtaW51cztGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRicvRk5GZXgtRlt2NiRRIjJGJ0Y5LUY2Ni1RJyZzZG90O0YnRjlGO0Y+RkBGQkZERkZGSEZKRk1GaHFGZm9GNUZocUZmb0Y1LUYsNiVRJWhhc2hGJ0YvRjJGOUY5RmFyRmhwRjUtRiw2JVExYnl0ZXN0b2hleHN0cmluZ0YnRi9GMi1GaW42JC1GIzYkRl5yRjlGOUZlcEZocEY1Rl11RjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZocC1GaXA2JkZbcUZecUZgcS9GY3FRJWF1dG9GJ0ZlcC8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSVTSEEzRzYidCs2JCdJKG1lc3NhZ2VHRiVJJ3N0cmluZ0clKnByb3RlY3RlZEc+J0ksbWVzc2FnZXR5cGVHRiVJJW5hbWVHRitJJXRleHRHRiU2JUkibkdGJUkibUdGJUkibEdGJUYlRiVDJ0AlLUkldHlwZUdGKzYkOSEuSShpbmRleGVkR0YrPjgkLUkjb3BHRis2I0Y6WVE8b3V0cHV0fmxlbmd0aH5ub3R+c3BlY2lmaWVkRiVAJDQtSSNpbkdGKzYkRj48JiIkQyMiJGMjIiQlUSIkNyZZNiRRQCUxfmlzfm5vdH5hfnZhbGlkfm91dHB1dH5sZW5ndGhGJUY+PjglLUkvbWVzc2FnZXRvYnl0ZXNHRiU2JDkkOSU+OCYtSSdrZWNjYWtHRiU2J0ZSIiUrOywmRmduIiIiRj4hIiNGPkklaGFzaEdGJS1JMWJ5dGVzdG9oZXhzdHJpbmdHRiU2I0ZZRiVGJUYlNiMiIiMhIiI=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5076" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field style="Text" layout="Normal">
    The next procedure implements the XOFs SHAKE128 and SHAKE256. These functions should be called in the form:</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    SHAKE[<Font italic="true">n</Font>](<Font italic="true">message, d</Font>)</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">where <Font italic="true">n</Font> is now the &quot;security strength&quot; of the function which must be either 128 or 256, while <Font italic="true">d</Font> represents the bit-length of the output, which should be a multiple of 8.
</Text-field>
</Input>
</Group>
<Group labelreference="L5074" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="SHAKE := proc (message::string, d::integer, messagetype::name := text) local n, m, l; if type(procname, 'indexed') then n := op(procname) else error &quot;output length not specified&quot; end if; if not n in {128, 256} then error &quot;%1 is not a valid security strength parameter&quot;, n end if; m := messagetobytes(message, messagetype); l := keccak(m, 1600, 1600-2*n, d, xof); bytestohexstring(l) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZkci1JI21pR0YkNiVRJlNIQUtFRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtRjY2L1ElcHJvY0YnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGZW5GO0Y+RkBGQkZERkZGSEZKRk0tSShtZmVuY2VkR0YkNiQtRiM2Mi1GLDYlUShtZXNzYWdlRidGL0YyLUY2Ni1RLSZQcm9wb3J0aW9uO0YnRjlGO0Y+RkBGQkZERkZGSEZSRlQtRiw2JVEnc3RyaW5nRidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGSi9GTlEsMC4zMzMzMzMzZW1GJ0Y1LUYsNiVRImRGJ0YvRjJGYG8tRiw2JVEoaW50ZWdlckYnRi9GMkZmb0Y1LUYsNiVRLG1lc3NhZ2V0eXBlRidGL0YyRmBvLUYsNiVRJW5hbWVGJ0YvRjJGTy1GLDYlUSV0ZXh0RidGL0YyRjlGOS1GLDYjUSFGJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZMLyUmZGVwdGhHRmNxLyUqbGluZWJyZWFrR1EobmV3bGluZUYnRjUtRjY2L1EmbG9jYWxGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSJuRidGL0YyRmZvRjUtRiw2JVEibUYnRi9GMkZmb0Y1LUYsNiVRImxGJ0YvRjItRjY2LVEiO0YnRjlGO0Zpb0ZARkJGREZGRkhGSkZURl5xRjUtRjY2L1EjaWZGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSV0eXBlRicvRjBGPUY5LUZpbjYkLUYjNiktRiw2JVEpcHJvY25hbWVGJ0Zgc0Y5RmZvRjUtRjY2LVEpJnJzcXVvcjtGJ0Y5L0Y8RjFGPkZARkJGREZGRkhGSkZNLUYsNiVRKGluZGV4ZWRGJ0Zgc0Y5RmhzRjlGOUY1LUY2Ni9RJXRoZW5GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GXnFGNUY1RjVGNUZeckZPRjUtRiw2JVEjb3BGJ0Zgc0Y5LUZpbjYkLUYjNiRGZXNGOUY5RltxRl5xRjUtRjY2L1ElZWxzZUYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZecUY1RjVGNUY1LUY2Ni9RJmVycm9yRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtSSNtc0dGJDYjUTxvdXRwdXR+bGVuZ3Rofm5vdH5zcGVjaWZpZWRGJ0ZecUY1LUY2Ni9RJGVuZEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RmpyRmdyRl5xRjVGanJGNS1GNjYvUSRub3RGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNUZeckY1LUY2Ni9RI2luRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjUtRmluNiYtRiM2Jy1JI21uR0YkNiRRJDEyOEYnRjlGZm9GNS1GYXY2JFEkMjU2RidGOUY5RjkvJSVvcGVuR1EifGZyRicvJSZjbG9zZUdRInxockYnRjVGX3RGXnFGNUY1RjVGNUY1Rlx1RjUtRmB1NiNRTiUxfmlzfm5vdH5hfnZhbGlkfnNlY3VyaXR5fnN0cmVuZ3RofnBhcmFtZXRlckYnRmZvRjVGXnJGXnFGNUZjdUY1RmpyRmdyRl5xRjVGYXJGNUZPRjUtRiw2JVEvbWVzc2FnZXRvYnl0ZXNGJ0YvRjItRmluNiQtRiM2J0Zdb0Zmb0Y1RmJwRjlGOUZnckZecUY1RmRyRjVGT0Y1LUYsNiVRJ2tlY2Nha0YnRi9GMi1GaW42JS1GIzY1RmFyLUY2Ni5GaG9GL0YyRjtGaW9GQEZCRkRGRkZIRkpGam8tRjY2LkY4Ri9GMkY7Rj5GQEZCRkRGRkZIRkpGTS1GYXY2JVElMTYwMEYnRi9GMkZeeEZgeEZieC1GNjYuUSgmbWludXM7RidGL0YyRjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRicvRk5GaXgtRmF2NiVRIjJGJ0YvRjItRjY2LlEnJnNkb3Q7RidGL0YyRjtGPkZARkJGREZGRkhGSkZNRl5yRl54RmB4RlxwRl54RmB4LUYsNiVRJHhvZkYnRi9GMkYvRjJGL0YyRmdyRl5xRjUtRiw2JVExYnl0ZXN0b2hleHN0cmluZ0YnRi9GMi1GaW42JC1GIzYkRmRyRjlGOUZbcUZecUY1RmN1RjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZecS1GX3E2JkZhcUZkcUZmcS9GaXFRJWF1dG9GJ0ZbcS8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSZTSEFLRUc2InQrNiUnSShtZXNzYWdlR0YlSSdzdHJpbmdHJSpwcm90ZWN0ZWRHJ0kiZEdGJUkoaW50ZWdlckdGKz4nSSxtZXNzYWdldHlwZUdGJUklbmFtZUdGK0kldGV4dEdGJTYlSSJuR0YlSSJtR0YlSSJsR0YlRiVGJUMnQCUtSSV0eXBlR0YrNiQ5IS5JKGluZGV4ZWRHRis+OCQtSSNvcEdGKzYjRj1ZUTxvdXRwdXR+bGVuZ3Rofm5vdH5zcGVjaWZpZWRGJUAkNC1JI2luR0YrNiRGQTwkIiRHIiIkYyNZNiRRTiUxfmlzfm5vdH5hfnZhbGlkfnNlY3VyaXR5fnN0cmVuZ3RofnBhcmFtZXRlckYlRkE+OCUtSS9tZXNzYWdldG9ieXRlc0dGJTYkOSQ5Jj44Ji1JJ2tlY2Nha0dGJTYnRlMiJSs7LCZGaG4iIiJGQSEiIzklSSR4b2ZHRiUtSTFieXRlc3RvaGV4c3RyaW5nR0YlNiNGWkYlRiVGJTYjIiIkISIi</Equation></Text-field>
</Input>
</Group>
</Section>
<Text-field style="Text" size="14" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">HMAC-SHA-3</Text-field></Title>
<Group labelreference="L4964" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    One of the most important applications of hash functions is to the construction of MACs (<Font italic="true">Message Authentication Codes</Font>).  MACs are cryptographic schemes designed to prevent an adversary from impersonating a legitimate user and from modifying a message without the legitimate users noticing it. For this purpose, two users share a secret key <Font italic="true">k</Font> and when one of them wants to send a message <Font italic="true">m</Font> to the other, she uses a tag generation algorithm that computes a MAC tag <Font italic="true">t</Font> using <Font italic="true">m</Font> and <Font italic="true">k</Font> as inputs and sends the pair (<Font italic="true">m,t</Font>) to the receiver. The receiver verifies that <Font italic="true">t</Font> is a valid tag for m by running a verification algorithm that, on input <Font italic="true">m</Font>, <Font italic="true">k</Font> and <Font italic="true">t</Font>, checks whether <Font italic="true">t</Font> is a valid tag for <Font italic="true">m</Font> (this is done by computing the tag from <Font italic="true">m</Font> and <Font italic="true">k</Font> and checking whether it is equal to the received tag).  If the message has been modified by an adversary, this will be noticed by the receiver because the adversary, not knowing the secret key, will be unable to compute a valid tag for the message if the MAC is secure (see, for example, <Hyperlink linktarget="https://sites.google.com/site/cryptomaple/" hyperlink="true"><Font style="Text" underline="true" encoding="UTF-8" foreground="[0,128,128]">[G\303\263mez Pardo]</Font></Hyperlink> for the precise definition of security for MACs). Thus a secure MAC gives the receiver assurance that the message has not been modified (thus providing <Font italic="true">message integrity</Font>) and also that the message is <Font italic="true">authentic</Font> (for only the legitimate user in possession of <Font italic="true">k</Font> should be able to generate a valid tag for <Font italic="true">m</Font>).</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    One of the basic ideas to obtain a MAC from a cryptographic hash function consists in computing the message tag by hashing the key together with the messages. There are several concrete ways of doing this and the most popular one gives rise to HMAC (Hash-based MAC, introduced in <Hyperlink linktarget="http://cseweb.ucsd.edu/~mihir/papers/kmd5.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">[Bellare-Canetti-Krawczyk]</Font></Hyperlink>) which, using a hash function <Font italic="true">H</Font>, combines the message with the key and some padding and computes the tag <Font encoding="UTF-8" italic="true">t = HMAC(k,m) = H((k\342\212\225opad)\342\210\245H((k\342\212\225ipad)\342\210\245m))</Font>, where <Font encoding="UTF-8" italic="true">\342\212\225</Font> denotes the bitwise XOR, <Font encoding="UTF-8" italic="true">\342\210\245</Font> denotes concatenation of strings, <Font italic="true">ipad</Font> is a string of bytes 0x36, and <Font italic="true">opad</Font> a string of bytes 0x5c, both of length equal to the block size <Font italic="true">B</Font>, a parameter associated to the scheme (we omit here some details and refer to the <Hyperlink linktarget="http://cseweb.ucsd.edu/~mihir/papers/hmac.html" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">HMAC papers page</Font></Hyperlink>, or to [<Hyperlink linktarget="https://sites.google.com/site/cryptomaple/" hyperlink="true"><Font style="Text" underline="true" encoding="UTF-8" foreground="[0,128,128]">G\303\263mez Pardo</Font></Hyperlink>, Algorithm 5.4], or also to the <Hyperlink linktarget="http://en.wikipedia.org/wiki/Hash-based_message_authentication_code" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Wikipedia HMAC page</Font></Hyperlink> for a more detailed description). HMAC is used in both the <Font italic="true">Transport Layer Security</Font> (TLS) protocol used by web browsers for secure connections, as well as in the <Font italic="true">IPSec</Font> security suite. It is regarded as a secure scheme although its practical security in some settings has been questioned in [<Hyperlink linktarget="http://eprint.iacr.org/2012/074.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Koblitz-Menezes</Font></Hyperlink>].</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Although HMAC-SHA-3 has not been standardized and the Keccak authors mention in their web page that <Font italic="true">&quot;Unlike SHA-1 and SHA-2, Keccak does not have the length-extension weakness, hence does not need the HMAC nested construction. Instead, MAC computation can be performed by simply prepending the message with the key&quot;</Font> , we give here a SHA-3-based implementation of HMAC (see, for example,  <Hyperlink linktarget="http://csrc.nist.gov/groups/ST/hash/sha-3/Aug2014/documents/perlner_kmac.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">SHA3-based MACs</Font></Hyperlink>) which uses any one of the four SHA-3 hash functions defined above.The parameters <Font italic="true">B</Font> (input block length in bytes) and <Font italic="true">L</Font> (output size in bytes) are computed in the following table (see <Hyperlink linktarget="http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">FIPS-198-1</Font></Hyperlink> for a detailed description of the NIST HMAC standard or also [<Hyperlink linktarget="https://sites.google.com/site/cryptomaple/" hyperlink="true"><Font style="Text" underline="true" encoding="UTF-8" foreground="[0,128,128]">G\303\263mez Pardo</Font></Hyperlink>, Section 5.6.5]). In this case, following the recommendation in [<Hyperlink linktarget="http://keccak.noekeon.org/Keccak-submission-3.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">Ksubmission</Font></Hyperlink>, 5.1.3, p. 9], <Font italic="true">B</Font> is equal to the byte rate and <Font italic="true">L</Font> the output length of the hash function in bytes, which is one of the following values: 28, 32, 48 or 64. The table is indexed by the four output bit lengths and the entry corresponding to each of these lengths is an array containing the values of <Font italic="true">B</Font> and <Font italic="true">L</Font> (in this order) associated to it.
</Text-field>
</Input>
</Group>
<Group labelreference="L4972" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="HT := table(map(proc (x) options operator, arrow; x = Array(1 .. 2, [200-(1/4)*x, (1/8)*x]) end proc, [224, 256, 384, 512]));" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYuLUkjbWlHRiQ2JVEjSFRGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSJ+RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHRkwtRjY2LVEqJmNvbG9uZXE7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjI3Nzc3NzhlbUYnL0ZORlNGNS1GLDYlUSZ0YWJsZUYnRi9GMi1JKG1mZW5jZWRHRiQ2JC1GIzYlLUYsNiVRJG1hcEYnRi9GMi1GWTYkLUYjNi8tRiw2JVEieEYnRi9GMkY1LUY2Ni1RKCZzcmFycjtGJ0Y5RjtGPkZARkJGREZGRkhGSkZNRl5vRjUtRjY2LVEiPUYnRjlGO0Y+RkBGQkZERkZGSEZSRlRGNS1GLDYlUSZBcnJheUYnRi9GMi1GWTYkLUYjNiktSSNtbkdGJDYkUSIxRidGOS1GNjYtUSMuLkYnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yMjIyMjIyZW1GJ0ZNLUZfcDYkUSIyRidGOS1GNjYtUSIsRidGOUY7L0Y/RjFGQEZCRkRGRkZIRkovRk5RLDAuMzMzMzMzM2VtRidGNS1GWTYmLUYjNigtRl9wNiRRJDIwMEYnRjktRjY2LVEoJm1pbnVzO0YnRjlGO0Y+RkBGQkZERkZGSEZlcC9GTkZmcC1JJm1mcmFjR0YkNihGXm8tRiM2JC1GX3A2JFEiNEYnRjlGOS8lLmxpbmV0aGlja25lc3NHRmFwLyUrZGVub21hbGlnbkdRJ2NlbnRlckYnLyUpbnVtYWxpZ25HRmdyLyUpYmV2ZWxsZWRHRj1GanAtRlxyNihGXm8tRiM2JC1GX3A2JFEiOEYnRjlGOUZjckZlckZockZqckY5RjkvJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRidGOUY5RmpwRjUtRlk2Ji1GIzYtLUZfcDYkUSQyMjRGJ0Y5RmpwRjUtRl9wNiRRJDI1NkYnRjlGanBGNS1GX3A2JFEkMzg0RidGOUZqcEY1LUZfcDYkUSQ1MTJGJ0Y5RjlGOUZjc0Zmc0Y5RjlGOUY5LUY2Ni1RIjtGJ0Y5RjtGXXFGQEZCRkRGRkZIRkpGVC1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZMLyUmZGVwdGhHRmF1LyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZddTYmRl91RmJ1RmR1L0ZndVElYXV0b0YnLUYsNiNRIUYnLyUrZXhlY3V0YWJsZUdGPUY5">QyQ+SSNIVEc2Ii1JJnRhYmxlRyUqcHJvdGVjdGVkRzYjLUkkbWFwR0YoNiRmKjYjSSJ4R0YlRiU2JEkpb3BlcmF0b3JHRiVJJmFycm93R0YlRiUvOSQtSSZBcnJheUdGKDYkOyIiIiIiIzckLCYiJCsjRjlGNCMhIiIiIiUsJEY0I0Y5IiIpRiVGJUYlNyYiJEMjIiRjIyIkJVEiJDcmRjk=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4974" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The next function, HMAC3, computes the SHA-3-based HMAC tag for a message. Like the function SHA3, HMAC3 is an indexed function which is called in the form:

    HMAC3[<Font italic="true">n</Font>](<Font italic="true">key, message</Font>)

where <Font italic="true">n</Font> is the output length in bytes and must be equal to one of the following: 224, 256, 384, 512. The key, given either as a text or a hex string, is processed with the function <Font family="Courier New">checkkey</Font> above and hence it must have a minimum bit length of 128 (this seems a basic security requirement and, in fact, in HMAC it is advisable to use a key length greater than or equal to the output length). However, if desired it is easy to modify the function to allow for the use of smaller keys (for example, for testing purposes). There is no maximum length for the key but keys longer than 512 bits will be truncated to this length by <Font family="Courier New">checkkey</Font> (a key length greater than 512 would not significantly improve security and would, on the other hand, have obvious practical disadvantages since keys have to be shared through secure channels and stored safely). The message can be an ASCII string, a hex string or a file, with the type specified through the optional parameter <Font italic="true">messagetype</Font>, which has <Font italic="true">text</Font> as default.
</Text-field>
</Input>
</Group>
<Group labelreference="L5041" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="HMAC3 := proc (key::string, message::string, messagetype::name := text) local n, B, L, r, m, k, ipad, opad; if type(procname, 'indexed') then n := op(procname) else error &quot;output length not specified&quot; end if; if not n in {224, 256, 384, 512} then error &quot;%1 is not a valid output length&quot;, n end if; B := HT[n][1]; L := HT[n][2]; r := 8*B; m := messagetobytes(message, messagetype); k := checkkey(key); k := [op(k), `$`(0, B-nops(k))]; ipad := [`$`(54, B)]; opad := [`$`(92, B)]; m := keccak([op(`~`[Bits:-Xor](k, ipad)), op(m)], 1600, r, n, hash); bytestohexstring(keccak([op(`~`[Bits:-Xor](k, opad)), op(m)], 1600, r, n, hash)) end proc:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZddy1JI21pR0YkNiVRJkhNQUMzRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtRjY2L1ElcHJvY0YnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGZW5GO0Y+RkBGQkZERkZGSEZKRk0tSShtZmVuY2VkR0YkNiQtRiM2My1GLDYlUSRrZXlGJ0YvRjItRjY2LVEtJlByb3BvcnRpb247RidGOUY7Rj5GQEZCRkRGRkZIRlJGVC1GLDYlUSdzdHJpbmdGJ0YvRjItRjY2LVEiLEYnRjlGOy9GP0YxRkBGQkZERkZGSEZKL0ZOUSwwLjMzMzMzMzNlbUYnRjUtRiw2JVEobWVzc2FnZUYnRi9GMkZgb0Zjb0Zmb0Y1RjUtRiw2JVEsbWVzc2FnZXR5cGVGJ0YvRjJGYG8tRiw2JVElbmFtZUYnRi9GMkZPLUYsNiVRJXRleHRGJ0YvRjJGOUY5LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRkwvJSZkZXB0aEdGYHEvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRjY2L1EmbG9jYWxGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GLDYlUSJuRidGL0YyLUY2Ni5GaG9GL0YyRjtGaW9GQEZCRkRGRkZIRkpGam8tRiw2JVEiQkYnRi9GMkZeci1GLDYlUSJMRidGL0YyRl5yLUY2Ni5GOEYvRjJGO0Y+RkBGQkZERkZGSEZKRk0tRiw2JVEickYnRi9GMkZeckZmci1GLDYlUSJtRidGL0YyRl5yLUYsNiVRImtGJ0YvRjJGXnJGZnItRiw2JVElaXBhZEYnRi9GMkZeci1GLDYlUSVvcGFkRidGL0YyLUY2Ni1RIjtGJ0Y5RjtGaW9GQEZCRkRGRkZIRkpGVEZbcS1GXHE2JkZecUZhcUZjcS9GZnFRJWF1dG9GJy1GNjYvUSNpZkYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1LUYsNiVRJXR5cGVGJy9GMEY9RjktRmluNiQtRiM2KS1GLDYlUSlwcm9jbmFtZUYnRmR0RjlGZm9GNS1GNjYtUSkmcnNxdW9yO0YnRjkvRjxGMUY+RkBGQkZERkZGSEZKRk0tRiw2JVEoaW5kZXhlZEYnRmR0RjlGXHVGOUY5RjUtRjY2L1EldGhlbkYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUZbcUY1RjVGNUY1LUYsNiVGXXJGZHRGOUY1Rk9GNS1GLDYlUSNvcEYnRmR0RjktRmluNiQtRiM2JEZpdEY5RjlGaHBGW3FGNS1GNjYvUSVlbHNlRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRltxRjVGNUY1RjUtRjY2L1EmZXJyb3JGJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1JI21zR0YkNiNRPG91dHB1dH5sZW5ndGh+bm90fnNwZWNpZmllZEYnRltxRjUtRjY2L1EkZW5kRidGWEZaRmZuRjtGPkZARkJGREZGRkhGSkZNRjVGXnRGZ3NGW3FGNUZedEY1LUY2Ni9RJG5vdEYnRlhGWkZmbkY7Rj5GQEZCRkRGRkZIRkpGTUY1RltyRjUtRjY2L1EjaW5GJ0ZYRlpGZm5GO0Y+RkBGQkZERkZGSEZKRk1GNS1GaW42Ji1GIzYtLUkjbW5HRiQ2JFEkMjI0RidGOUZmb0Y1LUZndzYkUSQyNTZGJ0Y5RmZvRjUtRmd3NiRRJDM4NEYnRjlGZm9GNS1GZ3c2JFEkNTEyRidGOUY5RjkvJSVvcGVuR1EifGZyRicvJSZjbG9zZUdRInxockYnRjVGY3VGW3FGNUY1RjVGNUY1RmJ2RjUtRmZ2NiNRQCUxfmlzfm5vdH5hfnZhbGlkfm91dHB1dH5sZW5ndGhGJ0Zmb0Y1RltyRltxRjVGaXZGNUZedEZnc0Zqc0ZbcUY1RmByRk9GNS1GLDYlUSNIVEYnRi9GMi1GaW42Ji1GIzYkRltyRjlGOS9GZHhRIltGJy9GZ3hRIl1GJy1GaW42Ji1GIzYkLUZndzYkUSIxRidGOUY5RjlGY3lGZXlGZ3NGW3FGNUY1RmNyRk9GXHlGX3ktRmluNiYtRiM2JC1GZ3c2JFEiMkYnRjlGOUY5RmN5RmV5RmdzRltxRjVGaHJGNUZPRjUtRmd3NiRRIjhGJ0Y5LUY2Ni1RJyZzZG90O0YnRjlGO0Y+RkBGQkZERkZGSEZKRk1GYHJGZ3NGW3FGNUY1RltzRk8tRiw2JVEvbWVzc2FnZXRvYnl0ZXNGJ0YvRjItRmluNiQtRiM2JkZccEZmb0ZfcEY5RjlGZ3NGW3FGNUZec0Y1Rk9GNS1GLDYlUSljaGVja2tleUYnRi9GMi1GaW42JC1GIzYkRl1vRjlGOUZnc0ZbcUZqc0Y1Rl5zRjVGT0Y1LUZpbjYmLUYjNiotRiw2JUZqdUYvRjItRmluNiQtRiM2JEZec0Y5RjlGZm9GNS1GZ3c2JFEiMEYnRjktRjY2LVEiJEYnRjlGO0Y+RkBGQkZERkZGSEZKRk0tRmluNiQtRiM2J0Zgci1GNjYtUSgmbWludXM7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjIyMjIyMjJlbUYnL0ZORmFdbC1GLDYlUSVub3BzRidGL0YyRl9cbEY5RjlGOUY5RmN5RmV5RmdzRltxRjVGYXNGNUZPRjUtRmluNiYtRiM2Ji1GZ3c2JFEjNTRGJ0Y5RmZcbC1GLDYlRmJyRmR0RjlGOUY5RmN5RmV5RmdzRltxRjVGZHNGNUZPRjUtRmluNiYtRiM2Ji1GZ3c2JFEjOTJGJ0Y5RmZcbEZdXmxGOUY5RmN5RmV5RmdzRltxRmZyRltzLUY2Ni5GUUYvRjJGO0Y+RkBGQkZERkZGSEZSRlRGZnItRiw2JVEna2VjY2FrRidGL0YyLUZpbjYlLUYjNjAtRmluNictRiM2KUZdXGwtRmluNiUtRiM2KC1GLDYlUSVCaXRzRidGL0YyLUY2Ni5RIzotRidGL0YyRjtGPkZARkJGREZGRkhGSkZNLUYsNiVRJFhvckYnRi9GMi1GNjYuUSJ8aXJGJ0YvRjJGO0Y+RkBGQkZERkZGSC9GS1EsMC4xMTExMTExZW1GJy9GTkZkYGwtRmluNiUtRiM2JkZec0ZeckZhc0Y5Ri9GMkY5Ri9GMkZeckZmckZdXGwtRmluNiUtRiM2JEZbc0Y5Ri9GMkY5Ri9GMkZjeUZleUZeckZmci1GZ3c2JVElMTYwMEYnRi9GMkZeckZmckZockZeckZmckZbckZeckZmci1GLDYlUSVoYXNoRidGL0YyRjlGL0YyLUY2Ni5GaXNGL0YyRjtGaW9GQEZCRkRGRkZIRkpGVEZmckZbcUY1LUYsNiVRMWJ5dGVzdG9oZXhzdHJpbmdGJ0YvRjItRmluNiUtRiM2JUZoXmwtRmluNiUtRiM2Ly1GaW42Jy1GIzYoRl1cbC1GaW42JS1GIzYoRmdfbEZqX2xGXWBsRmBgbC1GaW42JS1GIzYmRl5zRl5yRmRzRjlGL0YyRjlGL0YyRl5yRl1cbEZqYGxGOUYvRjJGY3lGZXlGXnJGZnJGXmFsRl5yRmZyRmhyRl5yRltyRl5yRmZyRmFhbEY5Ri9GMkY5Ri9GMkZocEZbcUY1Rml2RjVGVS1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVEZbcUZqc0ZocC8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSZITUFDM0c2InQrNiUnSSRrZXlHRiVJJ3N0cmluZ0clKnByb3RlY3RlZEcnSShtZXNzYWdlR0YlRio+J0ksbWVzc2FnZXR5cGVHRiVJJW5hbWVHRitJJXRleHRHRiU2KkkibkdGJUkiQkdGJUkiTEdGJUkickdGJUkibUdGJUkia0dGJUklaXBhZEdGJUklb3BhZEdGJUYlRiVDLkAlLUkldHlwZUdGKzYkOSEuSShpbmRleGVkR0YrPjgkLUkjb3BHRis2I0ZBWVE8b3V0cHV0fmxlbmd0aH5ub3R+c3BlY2lmaWVkRiVAJDQtSSNpbkdGKzYkRkU8JiIkQyMiJGMjIiQlUSIkNyZZNiRRQCUxfmlzfm5vdH5hfnZhbGlkfm91dHB1dH5sZW5ndGhGJUZFPjglJiZJI0hUR0YlNiNGRTYjIiIiPjgmJkZlbjYjIiIjPjgnLCRGWSIiKT44KC1JL21lc3NhZ2V0b2J5dGVzR0YlNiQ5JTkmPjgpLUkpY2hlY2trZXlHRiU2IzkkPkZbcDckLUZHNiNGW3AtSSIkR0YrNiQiIiEsJkZZRmluLUklbm9wc0dGK0ZjcCEiIj44KjcjLUZlcDYkIiNhRlk+OCs3Iy1GZXA2JCIjIypGWT5GZG8tSSdrZWNjYWtHRiU2JzckLUZHNiMtJkkifGlyR0YrNiNfSSVCaXRzR0koX3N5c2xpYkdGJUkkWG9yR0YrNiRGW3BGXXEtRkc2I0ZkbyIlKztGYG9GRUklaGFzaEdGJS1JMWJ5dGVzdG9oZXhzdHJpbmdHRiU2Iy1GanE2JzckLUZHNiMtRmByNiRGW3BGY3FGaHJGanJGYG9GRUZbc0YlRiVGJTYjIiIkRltx</Equation></Text-field>
</Input>
</Group>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">KAT tests and other tests</Text-field></Title>
<Group labelreference="L4895" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">    </Text-field>
<Text-field style="Text" layout="Normal">    Here we include some Known Answer Tests taken from <Hyperlink linktarget="https://github.com/gvanas/KeccakCodePackage/tree/master/TestVectors" hyperlink="true"><Font style="Hyperlink">Keccak Code Package Test Vectors</Font></Hyperlink> and <Hyperlink linktarget="http://keccak.noekeon.org/KeccakKAT-3.zip" hyperlink="true"><Font style="Hyperlink">KATests</Font></Hyperlink>. Note, however, that the tests in the latter reference have not been updated and hence give different results for SHA-3 and SHAKE because they do not take into account the new padding method introduced by NIST. We start with a few short hex messages.
</Text-field>
</Input>
</Group>
<Group labelreference="L4900" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="sm0 := &quot;&quot;:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzZILUkjbWlHRiQ2JVEkc20wRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkwtSSNtc0dGJDYjUSFGJy1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR1EmMC4wZW1GJy8lJmRlcHRoR0Zlbi8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GLDYlUSVzbTE2RidGL0YyRjUtRlA2I1ElNDFGQkYnRlNGVi1GLDYlUSVzbTY0RidGL0YyRjUtRlA2I1ExNEE0RjIwMjQ4NDUxMjUyNkYnRlNGVi1GLDYlUSZzbTMyMEYnRi9GMkY1LUY2Ni1RIn5GJ0Y5RjtGPkZARkJGREZGRkgvRktGaG4vRk5GaG4tRlA2I1FbcDdBQkFBMTJFQzJBNzM0NzY3NEU0NDQxNDBBRTBGQjY1OUQwOEUxQzY2REVDRDhENkVBRTkyNUZBNDUxRDY1RjNDMDMwOEUyOTQ0NkI4RUQzRidGU0ZWLUYsNiVRJnNtODAwRidGL0YyRjVGXXAtRlA2I1FjdzQzM0M1MzAzMTMxNjI0QzAwMjFEODY4QTMwODI1NDc1RThEMEJEMzA1MkEwMjIxODAzOThGNENBNDQyM0I5ODIxNEI2QkVBQUMyMUM4ODA3QTJDMzNGOEM5M0JENDJCMDkyQ0MxQjA2Q0VERjMyMjRENUVEMUVDMjk3ODQ0NDRGMjJFMDhBNTVBQTU4NTQyQjUyNEIwMkNEM0Q1RDVGNjkwN0FGRTcxQzVENzQ2MjIyNEEzRjlEOUU1M0U3RTA4NDZEQ0JCNENFRidGU0ZWLUYsNiVRJ3NtMjA0MEYnRi9GMkY1Rl1wLUZQNiNRaWpsM0EzQTgxOUM0OEVGREUyQUQ5MTRGQkYwMEUxOEFCNkJDNEYxNDUxM0FCMjdEMEMxNzhBMTg4QjYxNDMxRTdGNTYyM0NCNjZCMjMzNDY3NzVEMzg2QjUwRTk4MkM0OTNBREJCRkM1NEI5QTNDRDM4MzM4MjMzNkExQTBCMjE1MEExNTM1OEYzMzZEMDNBRTE4RjY2NkM3NTczRDU1QzRGRDE4MUMyOUU2Q0NGREU2M0VBMzVGMEFERjU4ODVDRkMwQTNEODRBMkIyRTRERDI0NDk2REI3ODlFNjYzMTcwQ0VGNzQ3OThBQTFCQkNENDU3NEVBMEJCQTQwNDg5RDc2NEIyRjgzQUFEQzY2QjE0OEI0QTBDRDk1MjQ2QzEyN0Q1ODcxQzRGMTE0MTg2OTBBNURERjAxMjQ2QTBDODBBNDNDNzAwODhCNjE4MzYzOURDRkRBNDEyNUJEMTEzQThGNDlFRTIzRUQzMDZGQUFDNTc2QzNGQjBDMUUyNTY2NzFEODE3RkMyNTM0QTUyRjVCNDM5RjcyRTQyNERFMzc2RjRDNTY1Q0NBODIzMDdERDlFRjc2REE1QjdDNEVCN0UwODUxNzJFMzI4ODA3QzAyRDAxMUZGQkYzMzc4NTM3OEQ3OURDMjY2RjZBNUJFNkJCMEU0QTkyRUNFRUJBRUIxRidGU0ZWRl1wLUZXNiZGWUZmbkZpbi9GXG9RJWF1dG9GJy1GLEZRLyUrZXhlY3V0YWJsZUdGPUY5">Qy4+SSRzbTBHNiJRIUYlISIiPkklc20xNkdGJVElNDFGQkYlRic+SSVzbTY0R0YlUTE0QTRGMjAyNDg0NTEyNTI2RiVGJz5JJnNtMzIwR0YlUVtwN0FCQUExMkVDMkE3MzQ3Njc0RTQ0NDE0MEFFMEZCNjU5RDA4RTFDNjZERUNEOEQ2RUFFOTI1RkE0NTFENjVGM0MwMzA4RTI5NDQ2QjhFRDNGJUYnPkkmc204MDBHRiVRY3c0MzNDNTMwMzEzMTYyNEMwMDIxRDg2OEEzMDgyNTQ3NUU4RDBCRDMwNTJBMDIyMTgwMzk4RjRDQTQ0MjNCOTgyMTRCNkJFQUFDMjFDODgwN0EyQzMzRjhDOTNCRDQyQjA5MkNDMUIwNkNFREYzMjI0RDVFRDFFQzI5Nzg0NDQ0RjIyRTA4QTU1QUE1ODU0MkI1MjRCMDJDRDNENUQ1RjY5MDdBRkU3MUM1RDc0NjIyMjRBM0Y5RDlFNTNFN0UwODQ2RENCQjRDRUYlRic+SSdzbTIwNDBHRiVRaWpsM0EzQTgxOUM0OEVGREUyQUQ5MTRGQkYwMEUxOEFCNkJDNEYxNDUxM0FCMjdEMEMxNzhBMTg4QjYxNDMxRTdGNTYyM0NCNjZCMjMzNDY3NzVEMzg2QjUwRTk4MkM0OTNBREJCRkM1NEI5QTNDRDM4MzM4MjMzNkExQTBCMjE1MEExNTM1OEYzMzZEMDNBRTE4RjY2NkM3NTczRDU1QzRGRDE4MUMyOUU2Q0NGREU2M0VBMzVGMEFERjU4ODVDRkMwQTNEODRBMkIyRTRERDI0NDk2REI3ODlFNjYzMTcwQ0VGNzQ3OThBQTFCQkNENDU3NEVBMEJCQTQwNDg5RDc2NEIyRjgzQUFEQzY2QjE0OEI0QTBDRDk1MjQ2QzEyN0Q1ODcxQzRGMTE0MTg2OTBBNURERjAxMjQ2QTBDODBBNDNDNzAwODhCNjE4MzYzOURDRkRBNDEyNUJEMTEzQThGNDlFRTIzRUQzMDZGQUFDNTc2QzNGQjBDMUUyNTY2NzFEODE3RkMyNTM0QTUyRjVCNDM5RjcyRTQyNERFMzc2RjRDNTY1Q0NBODIzMDdERDlFRjc2REE1QjdDNEVCN0UwODUxNzJFMzI4ODA3QzAyRDAxMUZGQkYzMzc4NTM3OEQ3OURDMjY2RjZBNUJFNkJCMEU0QTkyRUNFRUJBRUIxRiVGJw==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4940" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Here, we use the <Font family="Courier New">Keccak</Font> function with <Font italic="true">b</Font> = 200, <Font italic="true">r</Font> =40 and <Font italic="true">c</Font> = <Font italic="true">n</Font> = 160. In this case the output length is higher than the bit rate, so that the squeezing phase requires more than one application of the <Font family="Courier New">Keccak</Font> permutation:
</Text-field>
</Input>
</Group>
<Group labelreference="L4925" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[Keccak]([sm0, sm16, sm64, sm320, sm800, sm2040], 200, 40, 160, hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEnS2VjY2FrRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifGlyRicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRkwtSShtZmVuY2VkR0YkNiQtRiM2Ly1GUDYmLUYjNjMtRiw2JVEkc20wRidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkgvRktRJjAuMGVtRicvRk5RLDAuMzMzMzMzM2VtRictRjY2LVEifkYnRjlGO0Y+RkBGQkZERkZGSEZpbi9GTkZqbi1GLDYlUSVzbTE2RidGL0YyRmVuRl1vLUYsNiVRJXNtNjRGJ0YvRjJGZW5GXW8tRiw2JVEmc20zMjBGJ0YvRjJGZW5GXW8tRiw2JVEmc204MDBGJ0YvRjJGZW5GXW8tRiw2JVEnc20yMDQwRidGL0YyRjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0Zlbi1JI21uR0YkNiRRJDIwMEYnRjlGZW5GXW8tRmdwNiRRIzQwRidGOUZlbkZdby1GZ3A2JFEkMTYwRidGOUZlbkZdby1GLDYlUSRoZXhGJ0YvRjJGOUY5LUY2Ni1RIjtGJ0Y5RjtGaG5GQEZCRkRGRkZIRmluL0ZOUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmpuLyUmZGVwdGhHRl1yLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZpcTYmRltyRl5yRmByL0ZjclElYXV0b0YnLUYsNiNRIUYnLyUrZXhlY3V0YWJsZUdGPUY5">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjSSdLZWNjYWtHNiI2JzcoSSRzbTBHRilJJXNtMTZHRilJJXNtNjRHRilJJnNtMzIwR0YpSSZzbTgwMEdGKUknc20yMDQwR0YpIiQrIyIjUyIkZyJJJGhleEdGKSIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5005" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Next, with different parameters:
</Text-field>
</Input>
</Group>
<Group labelreference="L4924" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[Keccak]([sm0, sm16, sm64, sm320, sm800, sm2040], 800, 512, 512, hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEnS2VjY2FrRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifGlyRicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRkwtSShtZmVuY2VkR0YkNiQtRiM2MC1GUDYmLUYjNjMtRiw2JVEkc20wRidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkgvRktRJjAuMGVtRicvRk5RLDAuMzMzMzMzM2VtRictRjY2LVEifkYnRjlGO0Y+RkBGQkZERkZGSEZpbi9GTkZqbi1GLDYlUSVzbTE2RidGL0YyRmVuRl1vLUYsNiVRJXNtNjRGJ0YvRjJGZW5GXW8tRiw2JVEmc20zMjBGJ0YvRjJGZW5GXW8tRiw2JVEmc204MDBGJ0YvRjJGZW5GXW8tRiw2JVEnc20yMDQwRidGL0YyRjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0Zlbi1JI21uR0YkNiRRJDgwMEYnRjlGZW5GXW8tRmdwNiRRJDUxMkYnRjlGZW5GXW9GanBGZW5GXW8tRiw2JVEkaGV4RidGL0YyLyUrZXhlY3V0YWJsZUdGPUY5RjktRjY2LVEiO0YnRjlGO0ZobkZARkJGREZGRkhGaW4vRk5RLDAuMjc3Nzc3OGVtRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGam4vJSZkZXB0aEdGXHIvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRmhxNiZGanFGXXJGX3IvRmJyUSVhdXRvRictRiw2I1EhRidGYHFGOQ==">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjSSdLZWNjYWtHNiI2JzcoSSRzbTBHRilJJXNtMTZHRilJJXNtNjRHRilJJnNtMzIwR0YpSSZzbTgwMEdGKUknc20yMDQwR0YpIiQrKSIkNyZGM0kkaGV4R0YpIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4942" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Let us now compute the hashes of the preceding messages with the four SHA-3 functions:
</Text-field>
</Input>
</Group>
<Group labelreference="L4904" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[224]]([sm0, sm16, sm64, sm320, sm800, sm2040], hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkMjI0RicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUkjbW9HRiQ2LVEifGlyRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmduLUY2NiQtRiM2KC1GNjYmLUYjNjMtRiw2JVEkc20wRidGL0YyLUZKNi1RIixGJ0Y+Rk0vRlBGMUZRRlNGVUZXRlkvRmZuUSYwLjBlbUYnL0ZpblEsMC4zMzMzMzMzZW1GJy1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GLDYlUSVzbTE2RidGL0YyRmVvRl1wLUYsNiVRJXNtNjRGJ0YvRjJGZW9GXXAtRiw2JVEmc20zMjBGJ0YvRjJGZW9GXXAtRiw2JVEmc204MDBGJ0YvRjJGZW9GXXAtRiw2JVEnc20yMDQwRidGL0YyRj5GPkZDRkZGZW9GXXAtRiw2JVEkaGV4RidGL0YyRkBGPkY+LUZKNi1RIjtGJ0Y+Rk1GaG9GUUZTRlVGV0ZZRmlvL0ZpblEsMC4yNzc3Nzc4ZW1GJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0Zqby8lJmRlcHRoR0Zdci8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GaXE2JkZbckZeckZgci9GY3JRJWF1dG9GJy1GLDYjUSFGJ0ZARj4=">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiRDIzYkNyhJJHNtMEdGKkklc20xNkdGKkklc202NEdGKkkmc20zMjBHRipJJnNtODAwR0YqSSdzbTIwNDBHRipJJGhleEdGKiIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5089" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4907" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[256]]([sm0, sm16, sm64, sm320, sm800, sm2040], hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYkLUkjbW5HRiQ2JFEkMjU2RicvRjNRJ25vcm1hbEYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1JI21vR0YkNi1RInxpckYnRj4vJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRkwvJSlzdHJldGNoeUdGTC8lKnN5bW1ldHJpY0dGTC8lKGxhcmdlb3BHRkwvJS5tb3ZhYmxlbGltaXRzR0ZMLyUnYWNjZW50R0ZMLyUnbHNwYWNlR1EsMC4xMTExMTExZW1GJy8lJ3JzcGFjZUdGZW4tRjY2JC1GIzYnLUY2NiYtRiM2My1GLDYlUSRzbTBGJ0YvRjItRkc2LVEiLEYnRj5GSi9GTkYxRk9GUUZTRlVGVy9GWlEmMC4wZW1GJy9GZ25RLDAuMzMzMzMzM2VtRictRkc2LVEifkYnRj5GSkZNRk9GUUZTRlVGV0Znby9GZ25GaG8tRiw2JVElc20xNkYnRi9GMkZjb0ZbcC1GLDYlUSVzbTY0RidGL0YyRmNvRltwLUYsNiVRJnNtMzIwRidGL0YyRmNvRltwLUYsNiVRJnNtODAwRidGL0YyRmNvRltwLUYsNiVRJ3NtMjA0MEYnRi9GMkY+Rj5GQEZDRmNvRltwLUYsNiVRJGhleEYnRi9GMkY+Rj4tRkc2LVEiO0YnRj5GSkZmb0ZPRlFGU0ZVRldGZ28vRmduUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmhvLyUmZGVwdGhHRltyLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZncTYmRmlxRlxyRl5yL0ZhclElYXV0b0YnLUYsNiNRIUYnLyUrZXhlY3V0YWJsZUdGTEY+">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiRjIzYkNyhJJHNtMEdGKkklc20xNkdGKkklc202NEdGKkkmc20zMjBHRipJJnNtODAwR0YqSSdzbTIwNDBHRipJJGhleEdGKiIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5090" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4908" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[384]]([sm0, sm16, sm64, sm320, sm800, sm2040], hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkMzg0RicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUkjbW9HRiQ2LVEifGlyRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmduLUY2NiQtRiM2Jy1GNjYmLUYjNjMtRiw2JVEkc20wRidGL0YyLUZKNi1RIixGJ0Y+Rk0vRlBGMUZRRlNGVUZXRlkvRmZuUSYwLjBlbUYnL0ZpblEsMC4zMzMzMzMzZW1GJy1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GLDYlUSVzbTE2RidGL0YyRmVvRl1wLUYsNiVRJXNtNjRGJ0YvRjJGZW9GXXAtRiw2JVEmc20zMjBGJ0YvRjJGZW9GXXAtRiw2JVEmc204MDBGJ0YvRjJGZW9GXXAtRiw2JVEnc20yMDQwRidGL0YyRj5GPkZDRkZGZW9GXXAtRiw2JVEkaGV4RidGL0YyRj5GPi1GSjYtUSI7RidGPkZNRmhvRlFGU0ZVRldGWUZpby9GaW5RLDAuMjc3Nzc3OGVtRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGam8vJSZkZXB0aEdGXXIvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRmlxNiZGW3JGXnJGYHIvRmNyUSVhdXRvRictRiw2I1EhRidGQEY+">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiQlUTYkNyhJJHNtMEdGKkklc20xNkdGKkklc202NEdGKkkmc20zMjBHRipJJnNtODAwR0YqSSdzbTIwNDBHRipJJGhleEdGKiIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5091" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L5083" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[512]]([sm0, sm16, sm64, sm320, sm800, sm2040], hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYkLUkjbW5HRiQ2JFEkNTEyRicvRjNRJ25vcm1hbEYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1JI21vR0YkNi1RInxpckYnRj4vJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRkwvJSlzdHJldGNoeUdGTC8lKnN5bW1ldHJpY0dGTC8lKGxhcmdlb3BHRkwvJS5tb3ZhYmxlbGltaXRzR0ZMLyUnYWNjZW50R0ZMLyUnbHNwYWNlR1EsMC4xMTExMTExZW1GJy8lJ3JzcGFjZUdGZW4tRjY2JC1GIzYnLUY2NiYtRiM2My1GLDYlUSRzbTBGJ0YvRjItRkc2LVEiLEYnRj5GSi9GTkYxRk9GUUZTRlVGVy9GWlEmMC4wZW1GJy9GZ25RLDAuMzMzMzMzM2VtRictRkc2LVEifkYnRj5GSkZNRk9GUUZTRlVGV0Znby9GZ25GaG8tRiw2JVElc20xNkYnRi9GMkZjb0ZbcC1GLDYlUSVzbTY0RidGL0YyRmNvRltwLUYsNiVRJnNtMzIwRidGL0YyRmNvRltwLUYsNiVRJnNtODAwRidGL0YyRmNvRltwLUYsNiVRJ3NtMjA0MEYnRi9GMkY+Rj5GQEZDRmNvRltwLUYsNiVRJGhleEYnRi9GMkY+Rj4tRkc2LVEiO0YnRj5GSkZmb0ZPRlFGU0ZVRldGZ28vRmduUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmhvLyUmZGVwdGhHRltyLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZncTYmRmlxRlxyRl5yL0ZhclElYXV0b0YnLUYsNiNRIUYnLyUrZXhlY3V0YWJsZUdGTEY+">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiQ3JjYkNyhJJHNtMEdGKkklc20xNkdGKkklc202NEdGKkkmc20zMjBHRipJJnNtODAwR0YqSSdzbTIwNDBHRipJJGhleEdGKiIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4983" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    Let us now apply the SHAKE functions to some of these messages setting the output length equal to 4096 bits; the results agree with those in <Hyperlink linktarget="https://github.com/gvanas/KeccakCodePackage/tree/master/TestVectors" hyperlink="true"><Font style="Hyperlink">Keccak Code Package Test Vectors</Font></Hyperlink>.
</Text-field>
</Input>
</Group>
<Group labelreference="L5062" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHAKE[128]]([sm0, sm64, sm320, sm2040], 4096, hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEmU0hBS0VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JS1JI21uR0YkNiRRJDEyOEYnL0YzUSdub3JtYWxGJy8lK2V4ZWN1dGFibGVHUSZmYWxzZUYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1JI21vR0YkNi1RInxpckYnRj4vJSZmZW5jZUdGQi8lKnNlcGFyYXRvckdGQi8lKXN0cmV0Y2h5R0ZCLyUqc3ltbWV0cmljR0ZCLyUobGFyZ2VvcEdGQi8lLm1vdmFibGVsaW1pdHNHRkIvJSdhY2NlbnRHRkIvJSdsc3BhY2VHUSwwLjExMTExMTFlbUYnLyUncnNwYWNlR0Znbi1GNjYkLUYjNiotRjY2Ji1GIzYtLUYsNiVRJHNtMEYnRi9GMi1GSjYtUSIsRidGPkZNL0ZQRjFGUUZTRlVGV0ZZL0ZmblEmMC4wZW1GJy9GaW5RLDAuMzMzMzMzM2VtRictRko2LVEifkYnRj5GTUZPRlFGU0ZVRldGWUZpby9GaW5Gam8tRiw2JVElc202NEYnRi9GMkZlb0ZdcC1GLDYlUSZzbTMyMEYnRi9GMkZlb0ZdcC1GLDYlUSdzbTIwNDBGJ0YvRjJGPkY+RkNGRkZlb0ZdcC1GOzYkUSU0MDk2RidGPkZlb0ZdcC1GLDYlUSRoZXhGJ0YvRjJGPkY+LUZKNi1RIjtGJ0Y+Rk1GaG9GUUZTRlVGV0ZZRmlvL0ZpblEsMC4yNzc3Nzc4ZW1GJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0Zqby8lJmRlcHRoR0ZqcS8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GZnE2JkZocUZbckZdci9GYHJRJWF1dG9GJy1GLDYjUSFGJ0ZARj4=">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkkmU0hBS0VHNiI2IyIkRyI2JTcmSSRzbTBHRipJJXNtNjRHRipJJnNtMzIwR0YqSSdzbTIwNDBHRioiJSc0JUkkaGV4R0YqIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5064" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L5063" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHAKE[256]]([sm0, sm64, sm320, sm2040], 4096, hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEmU0hBS0VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JC1JI21uR0YkNiRRJDI1NkYnL0YzUSdub3JtYWxGJ0Y+Rj4vJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRictSSNtb0dGJDYtUSJ8aXJGJ0Y+LyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZMLyUpc3RyZXRjaHlHRkwvJSpzeW1tZXRyaWNHRkwvJShsYXJnZW9wR0ZMLyUubW92YWJsZWxpbWl0c0dGTC8lJ2FjY2VudEdGTC8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmVuLUY2NiQtRiM2Ki1GNjYmLUYjNi0tRiw2JVEkc20wRidGL0YyLUZHNi1RIixGJ0Y+RkovRk5GMUZPRlFGU0ZVRlcvRlpRJjAuMGVtRicvRmduUSwwLjMzMzMzMzNlbUYnLUZHNi1RIn5GJ0Y+RkpGTUZPRlFGU0ZVRldGZ28vRmduRmhvLUYsNiVRJXNtNjRGJ0YvRjJGY29GW3AtRiw2JVEmc20zMjBGJ0YvRjJGY29GW3AtRiw2JVEnc20yMDQwRidGL0YyRj5GPkZARkNGY29GW3AtRjs2JFElNDA5NkYnRj5GY29GW3AtRiw2JVEkaGV4RidGL0YyRj5GPi1GRzYtUSI7RidGPkZKRmZvRk9GUUZTRlVGV0Znby9GZ25RLDAuMjc3Nzc3OGVtRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGaG8vJSZkZXB0aEdGaHEvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRmRxNiZGZnFGaXFGW3IvRl5yUSVhdXRvRictRiw2I1EhRicvJStleGVjdXRhYmxlR0ZMRj4=">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkkmU0hBS0VHNiI2IyIkYyM2JTcmSSRzbTBHRipJJXNtNjRHRipJJnNtMzIwR0YqSSdzbTIwNDBHRioiJSc0JUkkaGV4R0YqIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5066" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The following messages from <Hyperlink linktarget="https://github.com/gvanas/KeccakCodePackage/tree/master/TestVectors" hyperlink="true"><Font style="Hyperlink">Keccak Code Package Test Vectors</Font></Hyperlink>  have byte lengths equal to <Font italic="true">B</Font>-1, <Font italic="true">B</Font>, and <Font italic="true">B</Font>+1, where <Font italic="true">B</Font> = 136 is the byte length of the blocks in which the message is partitioned when a bit rate <Font italic="true">r</Font> = 1088 is used. Thus they serve to test the different cases in the <Font italic="true">pad</Font> function according to the number of remaining bytes after partitioning the message in blocks of this length.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L5065" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="sm1080 := &quot;B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB&quot;:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzY8LUkjbW9HRiQ2LVEifkYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGNC8lKXN0cmV0Y2h5R0Y0LyUqc3ltbWV0cmljR0Y0LyUobGFyZ2VvcEdGNC8lLm1vdmFibGVsaW1pdHNHRjQvJSdhY2NlbnRHRjQvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZDLUkjbWlHRiQ2JVEnc20xMDgwRicvJSdpdGFsaWNHUSV0cnVlRicvRjBRJ2l0YWxpY0YnRistRiw2LVEqJmNvbG9uZXE7RidGL0YyRjVGN0Y5RjtGPUY/L0ZCUSwwLjI3Nzc3NzhlbUYnL0ZFRlNGKy1JI21zR0YkNiNRaVtsQjc3MUQ1Q0VGNUQxQTQxQTkzRDE1NjQzRDcxODFEMkEyRUYwQThFODREOTE4MTJGMjBFRDIxRjE0N0JFRjczMkJGM0E2MEVGNDA2N0MzNzM0Qjg1QkM4Q0Q0NzE3ODBGMTBEQzlFODI5MUI1ODMzOUE2NzdCOTYwMjE4RjcxRTc5M0YyNzk3QUVBMzQ5NDA2NTEyODI5MDY1RDM3QkI1NUVBNzk2RkE0RjU2RkQ4ODk2QjQ5QjJDRDE5QjQzMjE1QUQ5NjdDNzEyQjI0RTUwMzJEMDY1MjMyRTAyQzEyNzQwOUQyRUQ0MTQ2QjlENzVENzYzRDUyREI5OEQ5NDlEM0IwRkVENkE4MDUyRkJCRictRiw2LVEiOkYnRi9GMkY1RjdGOUY7Rj1GP0ZSRlQtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGQy8lJmRlcHRoR0Zbby8lKmxpbmVicmVha0dRKG5ld2xpbmVGJ0YrLUZHNiVRJ3NtMTA4OEYnRkpGTUZPLUZWNiNRW1xsQjMyRDk1QjBCOUFBRDJBODgxNkRFNkQwNkQxRjg2MDA4NTA1QkQ4QzE0MTI0RjZFOUExNjNCNUEyQURFNTVGODM1RDBFQzM4ODBFRjUwNzAwRDNCMjVFNDJDQzBBRjA1MENDRDFCRTVFNTU1QjIzMDg3RTA0RDdCRjk4MTM2MjI3ODBDNzMxM0ExOTU0Rjg3NDBCNkVFMkQzRjcxRjc2OERENDE3RjUyMDQ4MkJEM0EwOEQ0RjIyMkI0RUU5REJEMDE1NDQ3QjMzNTA3REQ1MEYzQUI0MjQ3QzVERTlBOEFCRDYyQThERUNFQTAxRTNCODdDOEI5MjdGNUIwOEJFQjM3Njc0QzZGOEUzODBDMDRGJ0ZZRmZuRistRkc2JVEnc20xMDk2RidGSkZNRk9GKy1GVjYjUV1cbDA0NDEwRTMxMDgyQTQ3NTg0QjQwNkYwNTEzOThBNkFCRTc0RTREQTU5QkI2Rjg1RTZCNDlFOEExRjdGMkNBMDBERkJBNTQ2MkMyQ0QyQkZERThCNjRGQjIxRDcwQzA4M0YxMTMxOEI1NkE1MkQwM0I4MUNBQzVFRUMyOUVCMzFCRDAwNzhCNjE1Njc4NkRBM0Q2RDhDMzMwOThDNUM0N0JCNjdBQzY0REIxNDE2NUFGNjVCNDQ1NDREODA2RERFNUY0ODdENTM3M0M3Rjk3OTJDMjk5RTk2ODZCN0U1ODIxRTdDOEUyNDU4MzE1Qjk5NkI1Njc3RDkyNkRBQzU3QjNGMjJEQTg3M0M2MDEwMTZBMERGJ0ZZRmZuRmZuLUZnbjYmRmluRlxvRl5vL0Zhb1ElYXV0b0YnLUZHNiNRIUYnLyUrZXhlY3V0YWJsZUdGNEYv">Qyg+SSdzbTEwODBHNiJRaVtsQjc3MUQ1Q0VGNUQxQTQxQTkzRDE1NjQzRDcxODFEMkEyRUYwQThFODREOTE4MTJGMjBFRDIxRjE0N0JFRjczMkJGM0E2MEVGNDA2N0MzNzM0Qjg1QkM4Q0Q0NzE3ODBGMTBEQzlFODI5MUI1ODMzOUE2NzdCOTYwMjE4RjcxRTc5M0YyNzk3QUVBMzQ5NDA2NTEyODI5MDY1RDM3QkI1NUVBNzk2RkE0RjU2RkQ4ODk2QjQ5QjJDRDE5QjQzMjE1QUQ5NjdDNzEyQjI0RTUwMzJEMDY1MjMyRTAyQzEyNzQwOUQyRUQ0MTQ2QjlENzVENzYzRDUyREI5OEQ5NDlEM0IwRkVENkE4MDUyRkJCRiUhIiI+SSdzbTEwODhHRiVRW1xsQjMyRDk1QjBCOUFBRDJBODgxNkRFNkQwNkQxRjg2MDA4NTA1QkQ4QzE0MTI0RjZFOUExNjNCNUEyQURFNTVGODM1RDBFQzM4ODBFRjUwNzAwRDNCMjVFNDJDQzBBRjA1MENDRDFCRTVFNTU1QjIzMDg3RTA0RDdCRjk4MTM2MjI3ODBDNzMxM0ExOTU0Rjg3NDBCNkVFMkQzRjcxRjc2OERENDE3RjUyMDQ4MkJEM0EwOEQ0RjIyMkI0RUU5REJEMDE1NDQ3QjMzNTA3REQ1MEYzQUI0MjQ3QzVERTlBOEFCRDYyQThERUNFQTAxRTNCODdDOEI5MjdGNUIwOEJFQjM3Njc0QzZGOEUzODBDMDRGJUYnPkknc20xMDk2R0YlUV1cbDA0NDEwRTMxMDgyQTQ3NTg0QjQwNkYwNTEzOThBNkFCRTc0RTREQTU5QkI2Rjg1RTZCNDlFOEExRjdGMkNBMDBERkJBNTQ2MkMyQ0QyQkZERThCNjRGQjIxRDcwQzA4M0YxMTMxOEI1NkE1MkQwM0I4MUNBQzVFRUMyOUVCMzFCRDAwNzhCNjE1Njc4NkRBM0Q2RDhDMzMwOThDNUM0N0JCNjdBQzY0REIxNDE2NUFGNjVCNDQ1NDREODA2RERFNUY0ODdENTM3M0M3Rjk3OTJDMjk5RTk2ODZCN0U1ODIxRTdDOEUyNDU4MzE1Qjk5NkI1Njc3RDkyNkRBQzU3QjNGMjJEQTg3M0M2MDEwMTZBMERGJUYn</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5067" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field style="Text" layout="Normal">
    The result of applying SHAKE256 (which uses <Font family="Courier New">Keccak</Font> with bit rate <Font italic="true">r</Font> = 1088) to these messages is the following (the same as in <Hyperlink linktarget="https://github.com/gvanas/KeccakCodePackage/tree/master/TestVectors" hyperlink="true"><Font style="Hyperlink">Keccak Code Package Test Vectors</Font></Hyperlink>):
</Text-field>
</Input>
</Group>
<Group labelreference="L5068" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHAKE[256]]([sm1080, sm1088, sm1096], 4096, hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEmU0hBS0VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JC1JI21uR0YkNiRRJDI1NkYnL0YzUSdub3JtYWxGJ0Y+Rj4vJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRictSSNtb0dGJDYtUSJ8aXJGJ0Y+LyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZMLyUpc3RyZXRjaHlHRkwvJSpzeW1tZXRyaWNHRkwvJShsYXJnZW9wR0ZMLyUubW92YWJsZWxpbWl0c0dGTC8lJ2FjY2VudEdGTC8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmVuLUY2NiQtRiM2Ki1GNjYmLUYjNiotRiw2JVEnc20xMDgwRidGL0YyLUZHNi1RIixGJ0Y+RkovRk5GMUZPRlFGU0ZVRlcvRlpRJjAuMGVtRicvRmduUSwwLjMzMzMzMzNlbUYnLUZHNi1RIn5GJ0Y+RkpGTUZPRlFGU0ZVRldGZ28vRmduRmhvLUYsNiVRJ3NtMTA4OEYnRi9GMkZjb0ZbcC1GLDYlUSdzbTEwOTZGJ0YvRjJGPkY+RkBGQ0Zjb0ZbcC1GOzYkUSU0MDk2RidGPkZjb0ZbcC1GLDYlUSRoZXhGJ0YvRjJGPkY+LUZHNi1RIjtGJ0Y+RkpGZm9GT0ZRRlNGVUZXRmdvL0ZnblEsMC4yNzc3Nzc4ZW1GJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0Zoby8lJmRlcHRoR0ZlcS8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GYXE2JkZjcUZmcUZocS9GW3JRJWF1dG9GJy1GLDYjUSFGJy8lK2V4ZWN1dGFibGVHRkxGPg==">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkkmU0hBS0VHNiI2IyIkYyM2JTclSSdzbTEwODBHRipJJ3NtMTA4OEdGKkknc20xMDk2R0YqIiUnNCVJJGhleEdGKiIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4943" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Next we give a &quot;long message&quot;, taken from  <Hyperlink linktarget="http://keccak.noekeon.org/KeccakKAT-3.zip" hyperlink="true"><Font style="Hyperlink">KATests</Font></Hyperlink>.
</Text-field>
</Input>
</Group>
<Group labelreference="L4915" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="lm34304 := &quot;0EBF64AC017FEBDCA40FF85FD4AEB8F1A827561C150F74CD5E864857FBBA9C08A46EFB9FF7A16919618C9FB06BF8FE3F0859774DA6C38C5A0C54D44075D1BAF6482B7705C8E1A86E79B0FBF0328246B5E6BE013F934D4ECC34808A3639C49464309DF5AD250BF4521E41B4CDE563566B8625076AD7E260018EEE2F3252D15F36BDBBCE3C74758C68A0E72D83A37DB4D2022A80A4F6B16F4515053E1FE398CC6A74D343D4CBB403597AE68533E18EF893F756F6F554F98BCCBC84702D19F875D347C345B09EDFCB1C71BD6955C5178DFCB07376728CFC3AB9565C0A1A8DCA78221028B00B51B175A2DA2CC0A90C33C169EA8A1A2E375C087AC3657D28AC481D5B5C225AEFA85919FB8628F32F42F1FC0806A250143C084322FE9E30BCC8B89F3DA73469CEB935EE25887D843321CC8ABB3C75E15F4894CBB5731782372A5631979BBE6AEACDFB711A84F83BB89E0F92B88C5EE83E4F9A3C4F80624A17ED5549B77ED7D939C368CD9A92EAAE595105DE7E2889CAD71D01201580038FCF4AB4D285A13BEFAAA14FACFE5099A83F9E71D512519D055F44F757757BCEBBD2734CB91C5C4CE7B411D1E83B42689FDF8A69E63DDFD255B977D7435BEEB5DEBBBA7A47B19CDAB3F1C40E79B926A481A1629A818525C2A198983F23F0DA5DA8B99633689292332BCC2A4AD49769B3E448F8CEDB87C1DE2EF5D04E1C3A8116C3328F6B19B59C318E18F8DB29875C22A0A0C8EA615A593439F7B90AA2AD9C16CA573040A8190A834370378554BDA9DA9486AA3CE3F1B01DBA14B032B3C334F7A1E961426302ED2D38C34F61D7B4D182C0CA303C2F379E74EAF65A48D3D8A95616B2ABA5C88DBF6284C5CD68D902E3958A7B9529F49D38091BAC288734247FCE886D49BCE00AB98B1B962A8DA8B4710644E9DA418529E79A27408B52EB655FDE025A129A38EEEBA936657F725F0EC668380B9DD50C0759AC150F81B696B886E86A5447CCDCB3FBEC08C79471DC3111042FCFFFADC1A973340DD68610631FDDA6AD25148C2D0B48ADA24E6B2D42EA7510991C0455BA1B7F393CA1FA5801F182F89117885455DBF88F63CE0B77669BA965B73A344D3C4C787E3B4AAF58C56FB2589967C71969B1FE92C5E7D91094DBA84F470437339C1DC6918DD5FB835CBE69750363691B0CEE7B80F0D0AEB31DDBDAC52F904A3A91051B54ADF75B0D195763D29FD1B88244F61D6A304807B646326E76FB880D1DF37281A11CED52D5B5873668642C72CD7C70E36825CC17DA6E03C577D12F79CCEFD6B7B76C88B19F7606536793D8D33F7E0A598769883B417C3662B6267001BE7D0914563B2402149357D1C64680DA80B32207A67611EDF0E8D9A767E2BE2ABB21956FC764200945E4BC5830ACCCDC80DE485086514C63DA7F785CBA0C1E9CE5B249B52E7EE570D8657C63C4FC90856DFBBB24C8D2A711CB3A0960685EC55540F6EC2641A429D3DC99D82F26D2C7EACC614FFE988117D8F13B7442A9AE2929D3E1F67B974BB4A4AA960015C9216AFA844A243095F167B114700FB11215EB54357BCB1D4792A0B676C708E710211C3AF73D61B82F4D04BC40C898CE00A2D34C77F5E22DB71F46C939A0EC9C37D1647E23A0F44CC23D710A1DB20E38D009C6580192295C40B478A85A0930181D0962C3B18B6AAC7F5BE99607ADD25BBC23A7530E7E58C93F9FD4AFE5133FD228C6B4D9E43538CD9DCBE76C4D7DEDF22741839558A6B561847327DF7CFF1C17E03EB0ED9DD921974954638CADBF645A4BAA4A62774BA66E2E458A1F7AC67EC394429339C2F620D457F5DD06AE551B69BADDEE99A6C93EDC7BF7CD56898CEC4AB4E633489DD1934B3EAB68601E3560092CB9B1C64B90C9FBB6F62BE60B0E221F1F6E1D58444B731B30AB04C40988093FBD396E65BA703F52ACE0695035EE78E7A4969D3EB5834C58EF60FEE1DE0F0E03E4203FF50F957ED68513F9134A4332B56044EE14CE80EAD7CE532ACA58B1F98423C3CABD9921F83A81C7467B3C6F6DE4B12AD741C7345BD645854BBF859D110C8D60F53AFE65F6A8A0856BBF78954F8ECC831FBB43F030449A9FE72A3C86AB7962ACD28975530CB567CEA713BE76B2262A70896B8A3CAC66772C56A9ED139F3F4349898AECCDEBD5622F32A75EBBC9FE202FE56C957356D40AFEE4718C52D30FBF683CE17056E672F909110C087D361C196FE33C6D80DC6925769F6A93DD41B5BB5FEA806F3BF56C50D69B45A371AC5DCF5CF356BC552E0CF87E22AF0F121B21278B067138E2AFA098E7EDE1C0A8AB29B6CCF6B85D39ADB9CEDD013886D2C23C273A21267B2F2C22B5BF25D5A5CBD083684B454AB5FB854F90CB49B2F53795BBFD46348B30958398344F9C362040E1412F331E2DD1679F31ADBCF8D40BD3BF707A4F3558239A0B9488B3D6A264E6DA3911B0BE47DFF3257B193129DDA9F3C0D9ADEB161F8426CCD01AD2D0854F7319E12DF89DA88C98FBFEA96D1F40BD098AA46BEB471834B039D6F001F804ED3DC47CDE01D5B594D565D94F70BA7387822DBE8D0E44645A914F25D1D15F38EB4E5C9B4F48C6146DBEFF8D36C17E5E57A3F07E561AF390EDFA4E2CFECA19722A3BEEEA23782CD7AF8A61767B010F89A7082E04E807F5CEC49BF5AC71DB3DFDC5665CD1FA5B9EB0C3C7343C674730EC650A13BAE412126C68DAF917862ADB4E220461A6CD0C7511F4F31C47F8A41AC54FC0B34F07DC15060E9A43855DA0A162436B1D3A4B6D8EA87229FAECBBD9A2F0792266DD160E0F8671690411F8A9BC7429F8E0F4EB0098E33F0532057D1E05E6A78FF48A6BDF78176FB462E56B305476A78F099786A6793D2FC3F4F74DABD3A34BC2E50267F06157494B9966E1BF1F8708CBB770580CBB2467FC1B3595345A49A5D8EC528F3E2B3F91B06E0693F87FDA3B68CF99DF5C47BB18B767FBE74EC0B664AC0F1CC6592F01A5659A7F3B4293BFB8541F0A9E3F923A547DD1C784ED624CD3A2C9D1B8C308B3236E4146C93CDC36E17DFEDA5C123E735AD4FEAADCAABF9581BC1060726F545C308E56C7310093F7938A2083DC468BF5FF3C84C2271EC7533838FF15E6F7EE8C71115EA8E342BC33AD64467640B11EFE5F33CECDEE3058E8C17F8CA0488918506FE2FA10B92B9FA87DD7305362D24D4CE454A779612B112C7C7E6D4B632A8475EDADBEA13486CFAF5647E4DF1FB135AE793F8E6D23216B0ADF664A14397DAE07E133A1A58E15B25E9092B61FAD3619BD551858144B80D9075D34128C351643F101BADDFA990CE910F2A8D721B64C495A12F07AF3D32CEDAC92E20DD9638C0DB36EB7B1286138FE056EAE9D91C4A0AB7DC5267FB16A41B771EB01D54701FB43570482157BE10C6FA9E4D866B8B5D650EE6F3FE117B1FA79CBE4F8A9B97928EBA2FCA6D7669B384184895BFE76ABF484B03B9F7CA10308C6CE31197CA15B1A36CEDC3774B6B9DDCC2431E732DB36537F1F4F4883E81E7B3C6D368B4EBDCE34C657711D2CBB4158D519E027C5B4B64575AFCD87CE736C45028D378D70C0FDE73B5499FFB307B9DD82073833C0A84769964FBD7D01C4ECE805E122364B2B485B6DAC7793F1EE7F1CB2A50AE6565CD210308260EF64D9B2FE8378516AD093960D5CA8CFA9FCF28762998020743086B93EEDEC324784428EBA23141466185C740055B1E87BF7F6BEF5CE8E28DD270F9DA64D6FFF2CB0D73A734D45DC56CD03BE9414DB568EE2366F2166FD6D43AF9EEECB13C4A5D3A8E775BEE5942194033AE3EE1754FC046BE91130979AB88E47A4CEA379ED9E77BC4310DDAE2BDB7A5B941E3FB6081CC3ED710E0C603D47EFA82FCCC0D556D4AB58825EBE6EC7700F02FB7A0EED44CD2F8772CCDEE4BA4B883DAAB46264A569AAAE97A0E4369EC00F59D841A1A7CF2D39BC58725B248C7B159D6D68B3D9721231CACAAD38F26F357BFD31FFCEC18CF34EE42C3B375C827C4284B31FCD4374CFE8C2C7A6B952581C9837587CB161EECA237290AFE8095E069A99514DFAFC2FD8CFC734B4AE64807D3ACA2681ADE0FA018B17D2A61F30F0307AE86D67D4A14D9CE214CF41EDB702735F99D58BDACE7F28C7D95A9CAE8B079708C6C7E78ACCAB67F67A598F7C86FE8B8AB6539B2EBB376B6A17144A3ADAD6BE5D617D30607AB4D94C11A7C1858E19B5C7B12F9BE4AC245A9E91A22EE5471AA58538AFB35319F53D6DD69BC2AE48D2B649DFF6E71DEA3B797C071A0C345F66DF053475A40031F323908C71A198C7FB2D542AA8DD97B2F1CE01D11E7FC458518CE1CB451BB9B1D57530D15EC95BA73BD5A386947FF8D0F565549A11B88759D6ABA3A83967BF9543E640A33F6F9D9655A547785B42B11216EC1CCE067630E89708CA896733129DB5312169003B8FACB8DE3F99E65427AEF51CC1C91005BB7F5B65218B1B492FDD67761E0F7C2FC60F7ECA13B09DF6B2A53B5B9CEAB43D5A1EC3260A89B54BC257850F0659E3240DAF073CC5236F65B159CF8FDEC771911C054BB417F6799330D443A735704E66EA9F1D3351837197C19E8226D27A1EB5B664781CF0651231AB25678A4C9F9973DA830ED3871A6EE638DDA3C789B0AC27DF49717CA2A1DF46968D56035EF02B712D12067E72B1E661120FC1FDE4FE6B11BB4D189F29112DBBD6DD0D9E4E78501C8E5EEECC333B208D7B86522C61DE4ED0D4454D19CA62027627344F455C05F429FA17E4A6F0BAFCD4B575CBA3755B042382942190B6EAF762DF7714797E916D58E7DD0DE2CFC41D8E6E410DE623EA5C547334D3A21488CD2D65E6F9E0F123166FD8304309D0160B5A605317E0122308F9FF065AE6ED422437C962A1362EC1F2804B274E3BAE118292FF930BD519EFD3A93E40F949ABC60E8E9190DAAF9FC8099A44311861B02FFB4F9A0AEA81999170ED5BD14B727B42EB44B0B55983F1AC2F2BA80734630D6B7500D65EAB42F6771EEA6872677E252DA4C717BAA07760BFC5FE09D4835A65200A80C2759A476A930B7FB4A738241C3E73A9C75D5A7F0A0BE52138DDA2812AEFBA8FD78D5840E6EA1D15C57EA66A59B3A882A8FD04093A5815A5324BE75C4F83CF16B785D2D3BD36602A0026A9895CB343688EEA40CDB483EDCD87788B668A69D0BC75B07D8C8247A9780E4C1EC342C1198295D699F0829E41A78F0F9978DD52D6491898F1F05B979E587F711DF66F38C23C2BFF9C69086AB970C468315B3B6C36D58A7AE9C749FA06429E6781AE7D49B3B368048641A63DB95EE293A1954201CAD72E92A85E34C7A74B2FD1BCA6AA61435AF2DC32C1A2F559F63E716A6C96F076097E6C45F4372AE6828E9EAAE3EB82361710EC14F67F7D0ED9859249C18D14985302847FC8F3301BD31C7E1E09B2057E9EE46FCC7C9BD8DB59EB0DEB0B1D8D291508CB3837C9B2F191A49595D6AADDCEFEF0DD59ED3A05FA8F6EF03D38F534139D56BCBD4BC3256E1A120D49A5DB1BADB528B0256C61A2F179A23C49928738F9C0FA81FC196D1A74507998415F070EF9C38BAA53951FEE7B68008BC675E0E15BC32A61C30BC132E79C58A3A970FFDDB8B806782DD31242B3C3CF9810BEEA5FB5A1B250EA62336456E7694B4C829508C7DBFE090AF6A850F79D04D2C698637816017F8A920E1B1ADE236E227B3480899BCBB991F6C6C240BBD4114AAF9875935558394A486652B0942F3409B66FAF8B8BF711CC8C34CCA41B8E16C2CDF0160B92A332C1F04BC64582446B98AFF34189675B7A10FFC6F13B3F74654ED7C0590D4AF7F4D747BF89BB2A8F5C8CE610CF4FA4AB714A845E15649B53E54A95213D5A73905941D9467B0BEDDA2BECC1C219E1CAB699652D85B8CD7E0CD11CE5B0CAC76F9EF3D74BD829877898E7350CCA72101076A970BEC6756C3FD1AAF3396F72833F8D4E716AEC6F93718B262710B0DA2F3FD6CBDB204ED0E91D65CAB39ED35F22A01E5D509282752837EBEE968B140989EF5F4D513452784BDB892CAFD8387E05B3012C0458A369E62191F5BDC57DD63CE42E945F493C2B42306B8084F3B25E94ABACF08EE155F3621ACC9626EE487C7A7E4667F0377AE4B2&quot;:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEobG0zNDMwNEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZMLUkjbXNHRiQ2I1FbY1xtMEVCRjY0QUMwMTdGRUJEQ0E0MEZGODVGRDRBRUI4RjFBODI3NTYxQzE1MEY3NENENUU4NjQ4NTdGQkJBOUMwOEE0NkVGQjlGRjdBMTY5MTk2MThDOUZCMDZCRjhGRTNGMDg1OTc3NERBNkMzOEM1QTBDNTRENDQwNzVEMUJBRjY0ODJCNzcwNUM4RTFBODZFNzlCMEZCRjAzMjgyNDZCNUU2QkUwMTNGOTM0RDRFQ0MzNDgwOEEzNjM5QzQ5NDY0MzA5REY1QUQyNTBCRjQ1MjFFNDFCNENERTU2MzU2NkI4NjI1MDc2QUQ3RTI2MDAxOEVFRTJGMzI1MkQxNUYzNkJEQkJDRTNDNzQ3NThDNjhBMEU3MkQ4M0EzN0RCNEQyMDIyQTgwQTRGNkIxNkY0NTE1MDUzRTFGRTM5OENDNkE3NEQzNDNENENCQjQwMzU5N0FFNjg1MzNFMThFRjg5M0Y3NTZGNkY1NTRGOThCQ0NCQzg0NzAyRDE5Rjg3NUQzNDdDMzQ1QjA5RURGQ0IxQzcxQkQ2OTU1QzUxNzhERkNCMDczNzY3MjhDRkMzQUI5NTY1QzBBMUE4RENBNzgyMjEwMjhCMDBCNTFCMTc1QTJEQTJDQzBBOTBDMzNDMTY5RUE4QTFBMkUzNzVDMDg3QUMzNjU3RDI4QUM0ODFENUI1QzIyNUFFRkE4NTkxOUZCODYyOEYzMkY0MkYxRkMwODA2QTI1MDE0M0MwODQzMjJGRTlFMzBCQ0M4Qjg5RjNEQTczNDY5Q0VCOTM1RUUyNTg4N0Q4NDMzMjFDQzhBQkIzQzc1RTE1RjQ4OTRDQkI1NzMxNzgyMzcyQTU2MzE5NzlCQkU2QUVBQ0RGQjcxMUE4NEY4M0JCODlFMEY5MkI4OEM1RUU4M0U0RjlBM0M0RjgwNjI0QTE3RUQ1NTQ5Qjc3RUQ3RDkzOUMzNjhDRDlBOTJFQUFFNTk1MTA1REU3RTI4ODlDQUQ3MUQwMTIwMTU4MDAzOEZDRjRBQjREMjg1QTEzQkVGQUFBMTRGQUNGRTUwOTlBODNGOUU3MUQ1MTI1MTlEMDU1RjQ0Rjc1Nzc1N0JDRUJCRDI3MzRDQjkxQzVDNENFN0I0MTFEMUU4M0I0MjY4OUZERjhBNjlFNjNEREZEMjU1Qjk3N0Q3NDM1QkVFQjVERUJCQkE3QTQ3QjE5Q0RBQjNGMUM0MEU3OUI5MjZBNDgxQTE2MjlBODE4NTI1QzJBMTk4OTgzRjIzRjBEQTVEQThCOTk2MzM2ODkyOTIzMzJCQ0MyQTRBRDQ5NzY5QjNFNDQ4RjhDRURCODdDMURFMkVGNUQwNEUxQzNBODExNkMzMzI4RjZCMTlCNTlDMzE4RTE4RjhEQjI5ODc1QzIyQTBBMEM4RUE2MTVBNTkzNDM5RjdCOTBBQTJBRDlDMTZDQTU3MzA0MEE4MTkwQTgzNDM3MDM3ODU1NEJEQTlEQTk0ODZBQTNDRTNGMUIwMURCQTE0QjAzMkIzQzMzNEY3QTFFOTYxNDI2MzAyRUQyRDM4QzM0RjYxRDdCNEQxODJDMENBMzAzQzJGMzc5RTc0RUFGNjVBNDhEM0Q4QTk1NjE2QjJBQkE1Qzg4REJGNjI4NEM1Q0Q2OEQ5MDJFMzk1OEE3Qjk1MjlGNDlEMzgwOTFCQUMyODg3MzQyNDdGQ0U4ODZENDlCQ0UwMEFCOThCMUI5NjJBOERBOEI0NzEwNjQ0RTlEQTQxODUyOUU3OUEyNzQwOEI1MkVCNjU1RkRFMDI1QTEyOUEzOEVFRUJBOTM2NjU3RjcyNUYwRUM2NjgzODBCOURENTBDMDc1OUFDMTUwRjgxQjY5NkI4ODZFODZBNTQ0N0NDRENCM0ZCRUMwOEM3OTQ3MURDMzExMTA0MkZDRkZGQURDMUE5NzMzNDBERDY4NjEwNjMxRkREQTZBRDI1MTQ4QzJEMEI0OEFEQTI0RTZCMkQ0MkVBNzUxMDk5MUMwNDU1QkExQjdGMzkzQ0ExRkE1ODAxRjE4MkY4OTExNzg4NTQ1NURCRjg4RjYzQ0UwQjc3NjY5QkE5NjVCNzNBMzQ0RDNDNEM3ODdFM0I0QUFGNThDNTZGQjI1ODk5NjdDNzE5NjlCMUZFOTJDNUU3RDkxMDk0REJBODRGNDcwNDM3MzM5QzFEQzY5MThERDVGQjgzNUNCRTY5NzUwMzYzNjkxQjBDRUU3QjgwRjBEMEFFQjMxRERCREFDNTJGOTA0QTNBOTEwNTFCNTRBREY3NUIwRDE5NTc2M0QyOUZEMUI4ODI0NEY2MUQ2QTMwNDgwN0I2NDYzMjZFNzZGQjg4MEQxREYzNzI4MUExMUNFRDUyRDVCNTg3MzY2ODY0MkM3MkNEN0M3MEUzNjgyNUNDMTdEQTZFMDNDNTc3RDEyRjc5Q0NFRkQ2QjdCNzZDODhCMTlGNzYwNjUzNjc5M0Q4RDMzRjdFMEE1OTg3Njk4ODNCNDE3QzM2NjJCNjI2NzAwMUJFN0QwOTE0NTYzQjI0MDIxNDkzNTdEMUM2NDY4MERBODBCMzIyMDdBNjc2MTFFREYwRThEOUE3NjdFMkJFMkFCQjIxOTU2RkM3NjQyMDA5NDVFNEJDNTgzMEFDQ0NEQzgwREU0ODUwODY1MTRDNjNEQTdGNzg1Q0JBMEMxRTlDRTVCMjQ5QjUyRTdFRTU3MEQ4NjU3QzYzQzRGQzkwODU2REZCQkIyNEM4RDJBNzExQ0IzQTA5NjA2ODVFQzU1NTQwRjZFQzI2NDFBNDI5RDNEQzk5RDgyRjI2RDJDN0VBQ0M2MTRGRkU5ODgxMTdEOEYxM0I3NDQyQTlBRTI5MjlEM0UxRjY3Qjk3NEJCNEE0QUE5NjAwMTVDOTIxNkFGQTg0NEEyNDMwOTVGMTY3QjExNDcwMEZCMTEyMTVFQjU0MzU3QkNCMUQ0NzkyQTBCNjc2QzcwOEU3MTAyMTFDM0FGNzNENjFCODJGNEQwNEJDNDBDODk4Q0UwMEEyRDM0Qzc3RjVFMjJEQjcxRjQ2QzkzOUEwRUM5QzM3RDE2NDdFMjNBMEY0NENDMjNENzEwQTFEQjIwRTM4RDAwOUM2NTgwMTkyMjk1QzQwQjQ3OEE4NUEwOTMwMTgxRDA5NjJDM0IxOEI2QUFDN0Y1QkU5OTYwN0FERDI1QkJDMjNBNzUzMEU3RTU4QzkzRjlGRDRBRkU1MTMzRkQyMjhDNkI0RDlFNDM1MzhDRDlEQ0JFNzZDNEQ3REVERjIyNzQxODM5NTU4QTZCNTYxODQ3MzI3REY3Q0ZGMUMxN0UwM0VCMEVEOUREOTIxOTc0OTU0NjM4Q0FEQkY2NDVBNEJBQTRBNjI3NzRCQTY2RTJFNDU4QTFGN0FDNjdFQzM5NDQyOTMzOUMyRjYyMEQ0NTdGNUREMDZBRTU1MUI2OUJBRERFRTk5QTZDOTNFREM3QkY3Q0Q1Njg5OENFQzRBQjRFNjMzNDg5REQxOTM0QjNFQUI2ODYwMUUzNTYwMDkyQ0I5QjFDNjRCOTBDOUZCQjZGNjJCRTYwQjBFMjIxRjFGNkUxRDU4NDQ0QjczMUIzMEFCMDRDNDA5ODgwOTNGQkQzOTZFNjVCQTcwM0Y1MkFDRTA2OTUwMzVFRTc4RTdBNDk2OUQzRUI1ODM0QzU4RUY2MEZFRTFERTBGMEUwM0U0MjAzRkY1MEY5NTdFRDY4NTEzRjkxMzRBNDMzMkI1NjA0NEVFMTRDRTgwRUFEN0NFNTMyQUNBNThCMUY5ODQyM0MzQ0FCRDk5MjFGODNBODFDNzQ2N0IzQzZGNkRFNEIxMkFENzQxQzczNDVCRDY0NTg1NEJCRjg1OUQxMTBDOEQ2MEY1M0FGRTY1RjZBOEEwODU2QkJGNzg5NTRGOEVDQzgzMUZCQjQzRjAzMDQ0OUE5RkU3MkEzQzg2QUI3OTYyQUNEMjg5NzU1MzBDQjU2N0NFQTcxM0JFNzZCMjI2MkE3MDg5NkI4QTNDQUM2Njc3MkM1NkE5RUQxMzlGM0Y0MzQ5ODk4QUVDQ0RFQkQ1NjIyRjMyQTc1RUJCQzlGRTIwMkZFNTZDOTU3MzU2RDQwQUZFRTQ3MThDNTJEMzBGQkY2ODNDRTE3MDU2RTY3MkY5MDkxMTBDMDg3RDM2MUMxOTZGRTMzQzZEODBEQzY5MjU3NjlGNkE5M0RENDFCNUJCNUZFQTgwNkYzQkY1NkM1MEQ2OUI0NUEzNzFBQzVEQ0Y1Q0YzNTZCQzU1MkUwQ0Y4N0UyMkFGMEYxMjFCMjEyNzhCMDY3MTM4RTJBRkEwOThFN0VERTFDMEE4QUIyOUI2Q0NGNkI4NUQzOUFEQjlDRUREMDEzODg2RDJDMjNDMjczQTIxMjY3QjJGMkMyMkI1QkYyNUQ1QTVDQkQwODM2ODRCNDU0QUI1RkI4NTRGOTBDQjQ5QjJGNTM3OTVCQkZENDYzNDhCMzA5NTgzOTgzNDRGOUMzNjIwNDBFMTQxMkYzMzFFMkREMTY3OUYzMUFEQkNGOEQ0MEJEM0JGNzA3QTRGMzU1ODIzOUEwQjk0ODhCM0Q2QTI2NEU2REEzOTExQjBCRTQ3REZGMzI1N0IxOTMxMjlEREE5RjNDMEQ5QURFQjE2MUY4NDI2Q0NEMDFBRDJEMDg1NEY3MzE5RTEyREY4OURBODhDOThGQkZFQTk2RDFGNDBCRDA5OEFBNDZCRUI0NzE4MzRCMDM5RDZGMDAxRjgwNEVEM0RDNDdDREUwMUQ1QjU5NEQ1NjVEOTRGNzBCQTczODc4MjJEQkU4RDBFNDQ2NDVBOTE0RjI1RDFEMTVGMzhFQjRFNUM5QjRGNDhDNjE0NkRCRUZGOEQzNkMxN0U1RTU3QTNGMDdFNTYxQUYzOTBFREZBNEUyQ0ZFQ0ExOTcyMkEzQkVFRUEyMzc4MkNEN0FGOEE2MTc2N0IwMTBGODlBNzA4MkUwNEU4MDdGNUNFQzQ5QkY1QUM3MURCM0RGREM1NjY1Q0QxRkE1QjlFQjBDM0M3MzQzQzY3NDczMEVDNjUwQTEzQkFFNDEyMTI2QzY4REFGOTE3ODYyQURCNEUyMjA0NjFBNkNEMEM3NTExRjRGMzFDNDdGOEE0MUFDNTRGQzBCMzRGMDdEQzE1MDYwRTlBNDM4NTVEQTBBMTYyNDM2QjFEM0E0QjZEOEVBODcyMjlGQUVDQkJEOUEyRjA3OTIyNjZERDE2MEUwRjg2NzE2OTA0MTFGOEE5QkM3NDI5RjhFMEY0RUIwMDk4RTMzRjA1MzIwNTdEMUUwNUU2QTc4RkY0OEE2QkRGNzgxNzZGQjQ2MkU1NkIzMDU0NzZBNzhGMDk5Nzg2QTY3OTNEMkZDM0Y0Rjc0REFCRDNBMzRCQzJFNTAyNjdGMDYxNTc0OTRCOTk2NkUxQkYxRjg3MDhDQkI3NzA1ODBDQkIyNDY3RkMxQjM1OTUzNDVBNDlBNUQ4RUM1MjhGM0UyQjNGOTFCMDZFMDY5M0Y4N0ZEQTNCNjhDRjk5REY1QzQ3QkIxOEI3NjdGQkU3NEVDMEI2NjRBQzBGMUNDNjU5MkYwMUE1NjU5QTdGM0I0MjkzQkZCODU0MUYwQTlFM0Y5MjNBNTQ3REQxQzc4NEVENjI0Q0QzQTJDOUQxQjhDMzA4QjMyMzZFNDE0NkM5M0NEQzM2RTE3REZFREE1QzEyM0U3MzVBRDRGRUFBRENBQUJGOTU4MUJDMTA2MDcyNkY1NDVDMzA4RTU2QzczMTAwOTNGNzkzOEEyMDgzREM0NjhCRjVGRjNDODRDMjI3MUVDNzUzMzgzOEZGMTVFNkY3RUU4QzcxMTE1RUE4RTM0MkJDMzNBRDY0NDY3NjQwQjExRUZFNUYzM0NFQ0RFRTMwNThFOEMxN0Y4Q0EwNDg4OTE4NTA2RkUyRkExMEI5MkI5RkE4N0RENzMwNTM2MkQyNEQ0Q0U0NTRBNzc5NjEyQjExMkM3QzdFNkQ0QjYzMkE4NDc1RURBREJFQTEzNDg2Q0ZBRjU2NDdFNERGMUZCMTM1QUU3OTNGOEU2RDIzMjE2QjBBREY2NjRBMTQzOTdEQUUwN0UxMzNBMUE1OEUxNUIyNUU5MDkyQjYxRkFEMzYxOUJENTUxODU4MTQ0QjgwRDkwNzVEMzQxMjhDMzUxNjQzRjEwMUJBRERGQTk5MENFOTEwRjJBOEQ3MjFCNjRDNDk1QTEyRjA3QUYzRDMyQ0VEQUM5MkUyMEREOTYzOEMwREIzNkVCN0IxMjg2MTM4RkUwNTZFQUU5RDkxQzRBMEFCN0RDNTI2N0ZCMTZBNDFCNzcxRUIwMUQ1NDcwMUZCNDM1NzA0ODIxNTdCRTEwQzZGQTlFNEQ4NjZCOEI1RDY1MEVFNkYzRkUxMTdCMUZBNzlDQkU0RjhBOUI5NzkyOEVCQTJGQ0E2RDc2NjlCMzg0MTg0ODk1QkZFNzZBQkY0ODRCMDNCOUY3Q0ExMDMwOEM2Q0UzMTE5N0NBMTVCMUEzNkNFREMzNzc0QjZCOUREQ0MyNDMxRTczMkRCMzY1MzdGMUY0RjQ4ODNFODFFN0IzQzZEMzY4QjRFQkRDRTM0QzY1NzcxMUQyQ0JCNDE1OEQ1MTlFMDI3QzVCNEI2NDU3NUFGQ0Q4N0NFNzM2QzQ1MDI4RDM3OEQ3MEMwRkRFNzNCNTQ5OUZGQjMwN0I5REQ4MjA3MzgzM0MwQTg0NzY5OTY0RkJEN0QwMUM0RUNFODA1RTEyMjM2NEIyQjQ4NUI2REFDNzc5M0YxRUU3RjFDQjJBNTBBRTY1NjVDRDIxMDMwODI2MEVGNjREOUIyRkU4Mzc4NTE2QUQwOTM5NjBENUNBOENGQTlGQ0YyODc2Mjk5ODAyMDc0MzA4NkI5M0VFREVDMzI0Nzg0NDI4RUJBMjMxNDE0NjYxODVDNzQwMDU1QjFFODdCRjdGNkJFRjVDRThFMjhERDI3MEY5REE2NEQ2RkZGMkNCMEQ3M0E3MzRENDVEQzU2Q0QwM0JFOTQxNERCNTY4RUUyMzY2RjIxNjZGRDZENDNBRjlFRUVDQjEzQzRBNUQzQThFNzc1QkVFNTk0MjE5NDAzM0FFM0VFMTc1NEZDMDQ2QkU5MTEzMDk3OUFCODhFNDdBNENFQTM3OUVEOUU3N0JDNDMxMEREQUUyQkRCN0E1Qjk0MUUzRkI2MDgxQ0MzRUQ3MTBFMEM2MDNENDdFRkE4MkZDQ0MwRDU1NkQ0QUI1ODgyNUVCRTZFQzc3MDBGMDJGQjdBMEVFRDQ0Q0QyRjg3NzJDQ0RFRTRCQTRCODgzREFBQjQ2MjY0QTU2OUFBQUU5N0EwRTQzNjlFQzAwRjU5RDg0MUExQTdDRjJEMzlCQzU4NzI1QjI0OEM3QjE1OUQ2RDY4QjNEOTcyMTIzMUNBQ0FBRDM4RjI2RjM1N0JGRDMxRkZDRUMxOENGMzRFRTQyQzNCMzc1QzgyN0M0Mjg0QjMxRkNENDM3NENGRThDMkM3QTZCOTUyNTgxQzk4Mzc1ODdDQjE2MUVFQ0EyMzcyOTBBRkU4MDk1RTA2OUE5OTUxNERGQUZDMkZEOENGQzczNEI0QUU2NDgwN0QzQUNBMjY4MUFERTBGQTAxOEIxN0QyQTYxRjMwRjAzMDdBRTg2RDY3RDRBMTREOUNFMjE0Q0Y0MUVEQjcwMjczNUY5OUQ1OEJEQUNFN0YyOEM3RDk1QTlDQUU4QjA3OTcwOEM2QzdFNzhBQ0NBQjY3RjY3QTU5OEY3Qzg2RkU4QjhBQjY1MzlCMkVCQjM3NkI2QTE3MTQ0QTNBREFENkJFNUQ2MTdEMzA2MDdBQjREOTRDMTFBN0MxODU4RTE5QjVDN0IxMkY5QkU0QUMyNDVBOUU5MUEyMkVFNTQ3MUFBNTg1MzhBRkIzNTMxOUY1M0Q2REQ2OUJDMkFFNDhEMkI2NDlERkY2RTcxREVBM0I3OTdDMDcxQTBDMzQ1RjY2REYwNTM0NzVBNDAwMzFGMzIzOTA4QzcxQTE5OEM3RkIyRDU0MkFBOEREOTdCMkYxQ0UwMUQxMUU3RkM0NTg1MThDRTFDQjQ1MUJCOUIxRDU3NTMwRDE1RUM5NUJBNzNCRDVBMzg2OTQ3RkY4RDBGNTY1NTQ5QTExQjg4NzU5RDZBQkEzQTgzOTY3QkY5NTQzRTY0MEEzM0Y2RjlEOTY1NUE1NDc3ODVCNDJCMTEyMTZFQzFDQ0UwNjc2MzBFODk3MDhDQTg5NjczMzEyOURCNTMxMjE2OTAwM0I4RkFDQjhERTNGOTlFNjU0MjdBRUY1MUNDMUM5MTAwNUJCN0Y1QjY1MjE4QjFCNDkyRkRENjc3NjFFMEY3QzJGQzYwRjdFQ0ExM0IwOURGNkIyQTUzQjVCOUNFQUI0M0Q1QTFFQzMyNjBBODlCNTRCQzI1Nzg1MEYwNjU5RTMyNDBEQUYwNzNDQzUyMzZGNjVCMTU5Q0Y4RkRFQzc3MTkxMUMwNTRCQjQxN0Y2Nzk5MzMwRDQ0M0E3MzU3MDRFNjZFQTlGMUQzMzUxODM3MTk3QzE5RTgyMjZEMjdBMUVCNUI2NjQ3ODFDRjA2NTEyMzFBQjI1Njc4QTRDOUY5OTczREE4MzBFRDM4NzFBNkVFNjM4RERBM0M3ODlCMEFDMjdERjQ5NzE3Q0EyQTFERjQ2OTY4RDU2MDM1RUYwMkI3MTJEMTIwNjdFNzJCMUU2NjExMjBGQzFGREU0RkU2QjExQkI0RDE4OUYyOTExMkRCQkQ2REQwRDlFNEU3ODUwMUM4RTVFRUVDQzMzM0IyMDhEN0I4NjUyMkM2MURFNEVEMEQ0NDU0RDE5Q0E2MjAyNzYyNzM0NEY0NTVDMDVGNDI5RkExN0U0QTZGMEJBRkNENEI1NzVDQkEzNzU1QjA0MjM4Mjk0MjE5MEI2RUFGNzYyREY3NzE0Nzk3RTkxNkQ1OEU3REQwREUyQ0ZDNDFEOEU2RTQxMERFNjIzRUE1QzU0NzMzNEQzQTIxNDg4Q0QyRDY1RTZGOUUwRjEyMzE2NkZEODMwNDMwOUQwMTYwQjVBNjA1MzE3RTAxMjIzMDhGOUZGMDY1QUU2RUQ0MjI0MzdDOTYyQTEzNjJFQzFGMjgwNEIyNzRFM0JBRTExODI5MkZGOTMwQkQ1MTlFRkQzQTkzRTQwRjk0OUFCQzYwRThFOTE5MERBQUY5RkM4MDk5QTQ0MzExODYxQjAyRkZCNEY5QTBBRUE4MTk5OTE3MEVENUJEMTRCNzI3QjQyRUI0NEIwQjU1OTgzRjFBQzJGMkJBODA3MzQ2MzBENkI3NTAwRDY1RUFCNDJGNjc3MUVFQTY4NzI2NzdFMjUyREE0QzcxN0JBQTA3NzYwQkZDNUZFMDlENDgzNUE2NTIwMEE4MEMyNzU5QTQ3NkE5MzBCN0ZCNEE3MzgyNDFDM0U3M0E5Qzc1RDVBN0YwQTBCRTUyMTM4RERBMjgxMkFFRkJBOEZENzhENTg0MEU2RUExRDE1QzU3RUE2NkE1OUIzQTg4MkE4RkQwNDA5M0E1ODE1QTUzMjRCRTc1QzRGODNDRjE2Qjc4NUQyRDNCRDM2NjAyQTAwMjZBOTg5NUNCMzQzNjg4RUVBNDBDREI0ODNFRENEODc3ODhCNjY4QTY5RDBCQzc1QjA3RDhDODI0N0E5NzgwRTRDMUVDMzQyQzExOTgyOTVENjk5RjA4MjlFNDFBNzhGMEY5OTc4REQ1MkQ2NDkxODk4RjFGMDVCOTc5RTU4N0Y3MTFERjY2RjM4QzIzQzJCRkY5QzY5MDg2QUI5NzBDNDY4MzE1QjNCNkMzNkQ1OEE3QUU5Qzc0OUZBMDY0MjlFNjc4MUFFN0Q0OUIzQjM2ODA0ODY0MUE2M0RCOTVFRTI5M0ExOTU0MjAxQ0FENzJFOTJBODVFMzRDN0E3NEIyRkQxQkNBNkFBNjE0MzVBRjJEQzMyQzFBMkY1NTlGNjNFNzE2QTZDOTZGMDc2MDk3RTZDNDVGNDM3MkFFNjgyOEU5RUFBRTNFQjgyMzYxNzEwRUMxNEY2N0Y3RDBFRDk4NTkyNDlDMThEMTQ5ODUzMDI4NDdGQzhGMzMwMUJEMzFDN0UxRTA5QjIwNTdFOUVFNDZGQ0M3QzlCRDhEQjU5RUIwREVCMEIxRDhEMjkxNTA4Q0IzODM3QzlCMkYxOTFBNDk1OTVENkFBRERDRUZFRjBERDU5RUQzQTA1RkE4RjZFRjAzRDM4RjUzNDEzOUQ1NkJDQkQ0QkMzMjU2RTFBMTIwRDQ5QTVEQjFCQURCNTI4QjAyNTZDNjFBMkYxNzlBMjNDNDk5Mjg3MzhGOUMwRkE4MUZDMTk2RDFBNzQ1MDc5OTg0MTVGMDcwRUY5QzM4QkFBNTM5NTFGRUU3QjY4MDA4QkM2NzVFMEUxNUJDMzJBNjFDMzBCQzEzMkU3OUM1OEEzQTk3MEZGRERCOEI4MDY3ODJERDMxMjQyQjNDM0NGOTgxMEJFRUE1RkI1QTFCMjUwRUE2MjMzNjQ1NkU3Njk0QjRDODI5NTA4QzdEQkZFMDkwQUY2QTg1MEY3OUQwNEQyQzY5ODYzNzgxNjAxN0Y4QTkyMEUxQjFBREUyMzZFMjI3QjM0ODA4OTlCQ0JCOTkxRjZDNkMyNDBCQkQ0MTE0QUFGOTg3NTkzNTU1ODM5NEE0ODY2NTJCMDk0MkYzNDA5QjY2RkFGOEI4QkY3MTFDQzhDMzRDQ0E0MUI4RTE2QzJDREYwMTYwQjkyQTMzMkMxRjA0QkM2NDU4MjQ0NkI5OEFGRjM0MTg5Njc1QjdBMTBGRkM2RjEzQjNGNzQ2NTRFRDdDMDU5MEQ0QUY3RjRENzQ3QkY4OUJCMkE4RjVDOENFNjEwQ0Y0RkE0QUI3MTRBODQ1RTE1NjQ5QjUzRTU0QTk1MjEzRDVBNzM5MDU5NDFEOTQ2N0IwQkVEREEyQkVDQzFDMjE5RTFDQUI2OTk2NTJEODVCOENEN0UwQ0QxMUNFNUIwQ0FDNzZGOUVGM0Q3NEJEODI5ODc3ODk4RTczNTBDQ0E3MjEwMTA3NkE5NzBCRUM2NzU2QzNGRDFBQUYzMzk2RjcyODMzRjhENEU3MTZBRUM2RjkzNzE4QjI2MjcxMEIwREEyRjNGRDZDQkRCMjA0RUQwRTkxRDY1Q0FCMzlFRDM1RjIyQTAxRTVENTA5MjgyNzUyODM3RUJFRTk2OEIxNDA5ODlFRjVGNEQ1MTM0NTI3ODRCREI4OTJDQUZEODM4N0UwNUIzMDEyQzA0NThBMzY5RTYyMTkxRjVCREM1N0RENjNDRTQyRTk0NUY0OTNDMkI0MjMwNkI4MDg0RjNCMjVFOTRBQkFDRjA4RUUxNTVGMzYyMUFDQzk2MjZFRTQ4N0M3QTdFNDY2N0YwMzc3QUU0QjJGJy1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR1EmMC4wZW1GJy8lJmRlcHRoR0Zlbi8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GVzYmRllGZm5GaW4vRlxvUSVhdXRvRictRiw2I1EhRicvJStleGVjdXRhYmxlR0Y9Rjk=">QyQ+SShsbTM0MzA0RzYiUVtjXG0wRUJGNjRBQzAxN0ZFQkRDQTQwRkY4NUZENEFFQjhGMUE4Mjc1NjFDMTUwRjc0Q0Q1RTg2NDg1N0ZCQkE5QzA4QTQ2RUZCOUZGN0ExNjkxOTYxOEM5RkIwNkJGOEZFM0YwODU5Nzc0REE2QzM4QzVBMEM1NEQ0NDA3NUQxQkFGNjQ4MkI3NzA1QzhFMUE4NkU3OUIwRkJGMDMyODI0NkI1RTZCRTAxM0Y5MzRENEVDQzM0ODA4QTM2MzlDNDk0NjQzMDlERjVBRDI1MEJGNDUyMUU0MUI0Q0RFNTYzNTY2Qjg2MjUwNzZBRDdFMjYwMDE4RUVFMkYzMjUyRDE1RjM2QkRCQkNFM0M3NDc1OEM2OEEwRTcyRDgzQTM3REI0RDIwMjJBODBBNEY2QjE2RjQ1MTUwNTNFMUZFMzk4Q0M2QTc0RDM0M0Q0Q0JCNDAzNTk3QUU2ODUzM0UxOEVGODkzRjc1NkY2RjU1NEY5OEJDQ0JDODQ3MDJEMTlGODc1RDM0N0MzNDVCMDlFREZDQjFDNzFCRDY5NTVDNTE3OERGQ0IwNzM3NjcyOENGQzNBQjk1NjVDMEExQThEQ0E3ODIyMTAyOEIwMEI1MUIxNzVBMkRBMkNDMEE5MEMzM0MxNjlFQThBMUEyRTM3NUMwODdBQzM2NTdEMjhBQzQ4MUQ1QjVDMjI1QUVGQTg1OTE5RkI4NjI4RjMyRjQyRjFGQzA4MDZBMjUwMTQzQzA4NDMyMkZFOUUzMEJDQzhCODlGM0RBNzM0NjlDRUI5MzVFRTI1ODg3RDg0MzMyMUNDOEFCQjNDNzVFMTVGNDg5NENCQjU3MzE3ODIzNzJBNTYzMTk3OUJCRTZBRUFDREZCNzExQTg0RjgzQkI4OUUwRjkyQjg4QzVFRTgzRTRGOUEzQzRGODA2MjRBMTdFRDU1NDlCNzdFRDdEOTM5QzM2OENEOUE5MkVBQUU1OTUxMDVERTdFMjg4OUNBRDcxRDAxMjAxNTgwMDM4RkNGNEFCNEQyODVBMTNCRUZBQUExNEZBQ0ZFNTA5OUE4M0Y5RTcxRDUxMjUxOUQwNTVGNDRGNzU3NzU3QkNFQkJEMjczNENCOTFDNUM0Q0U3QjQxMUQxRTgzQjQyNjg5RkRGOEE2OUU2M0RERkQyNTVCOTc3RDc0MzVCRUVCNURFQkJCQTdBNDdCMTlDREFCM0YxQzQwRTc5QjkyNkE0ODFBMTYyOUE4MTg1MjVDMkExOTg5ODNGMjNGMERBNURBOEI5OTYzMzY4OTI5MjMzMkJDQzJBNEFENDk3NjlCM0U0NDhGOENFREI4N0MxREUyRUY1RDA0RTFDM0E4MTE2QzMzMjhGNkIxOUI1OUMzMThFMThGOERCMjk4NzVDMjJBMEEwQzhFQTYxNUE1OTM0MzlGN0I5MEFBMkFEOUMxNkNBNTczMDQwQTgxOTBBODM0MzcwMzc4NTU0QkRBOURBOTQ4NkFBM0NFM0YxQjAxREJBMTRCMDMyQjNDMzM0RjdBMUU5NjE0MjYzMDJFRDJEMzhDMzRGNjFEN0I0RDE4MkMwQ0EzMDNDMkYzNzlFNzRFQUY2NUE0OEQzRDhBOTU2MTZCMkFCQTVDODhEQkY2Mjg0QzVDRDY4RDkwMkUzOTU4QTdCOTUyOUY0OUQzODA5MUJBQzI4ODczNDI0N0ZDRTg4NkQ0OUJDRTAwQUI5OEIxQjk2MkE4REE4QjQ3MTA2NDRFOURBNDE4NTI5RTc5QTI3NDA4QjUyRUI2NTVGREUwMjVBMTI5QTM4RUVFQkE5MzY2NTdGNzI1RjBFQzY2ODM4MEI5REQ1MEMwNzU5QUMxNTBGODFCNjk2Qjg4NkU4NkE1NDQ3Q0NEQ0IzRkJFQzA4Qzc5NDcxREMzMTExMDQyRkNGRkZBREMxQTk3MzM0MERENjg2MTA2MzFGRERBNkFEMjUxNDhDMkQwQjQ4QURBMjRFNkIyRDQyRUE3NTEwOTkxQzA0NTVCQTFCN0YzOTNDQTFGQTU4MDFGMTgyRjg5MTE3ODg1NDU1REJGODhGNjNDRTBCNzc2NjlCQTk2NUI3M0EzNDREM0M0Qzc4N0UzQjRBQUY1OEM1NkZCMjU4OTk2N0M3MTk2OUIxRkU5MkM1RTdEOTEwOTREQkE4NEY0NzA0MzczMzlDMURDNjkxOERENUZCODM1Q0JFNjk3NTAzNjM2OTFCMENFRTdCODBGMEQwQUVCMzFEREJEQUM1MkY5MDRBM0E5MTA1MUI1NEFERjc1QjBEMTk1NzYzRDI5RkQxQjg4MjQ0RjYxRDZBMzA0ODA3QjY0NjMyNkU3NkZCODgwRDFERjM3MjgxQTExQ0VENTJENUI1ODczNjY4NjQyQzcyQ0Q3QzcwRTM2ODI1Q0MxN0RBNkUwM0M1NzdEMTJGNzlDQ0VGRDZCN0I3NkM4OEIxOUY3NjA2NTM2NzkzRDhEMzNGN0UwQTU5ODc2OTg4M0I0MTdDMzY2MkI2MjY3MDAxQkU3RDA5MTQ1NjNCMjQwMjE0OTM1N0QxQzY0NjgwREE4MEIzMjIwN0E2NzYxMUVERjBFOEQ5QTc2N0UyQkUyQUJCMjE5NTZGQzc2NDIwMDk0NUU0QkM1ODMwQUNDQ0RDODBERTQ4NTA4NjUxNEM2M0RBN0Y3ODVDQkEwQzFFOUNFNUIyNDlCNTJFN0VFNTcwRDg2NTdDNjNDNEZDOTA4NTZERkJCQjI0QzhEMkE3MTFDQjNBMDk2MDY4NUVDNTU1NDBGNkVDMjY0MUE0MjlEM0RDOTlEODJGMjZEMkM3RUFDQzYxNEZGRTk4ODExN0Q4RjEzQjc0NDJBOUFFMjkyOUQzRTFGNjdCOTc0QkI0QTRBQTk2MDAxNUM5MjE2QUZBODQ0QTI0MzA5NUYxNjdCMTE0NzAwRkIxMTIxNUVCNTQzNTdCQ0IxRDQ3OTJBMEI2NzZDNzA4RTcxMDIxMUMzQUY3M0Q2MUI4MkY0RDA0QkM0MEM4OThDRTAwQTJEMzRDNzdGNUUyMkRCNzFGNDZDOTM5QTBFQzlDMzdEMTY0N0UyM0EwRjQ0Q0MyM0Q3MTBBMURCMjBFMzhEMDA5QzY1ODAxOTIyOTVDNDBCNDc4QTg1QTA5MzAxODFEMDk2MkMzQjE4QjZBQUM3RjVCRTk5NjA3QUREMjVCQkMyM0E3NTMwRTdFNThDOTNGOUZENEFGRTUxMzNGRDIyOEM2QjREOUU0MzUzOENEOURDQkU3NkM0RDdERURGMjI3NDE4Mzk1NThBNkI1NjE4NDczMjdERjdDRkYxQzE3RTAzRUIwRUQ5REQ5MjE5NzQ5NTQ2MzhDQURCRjY0NUE0QkFBNEE2Mjc3NEJBNjZFMkU0NThBMUY3QUM2N0VDMzk0NDI5MzM5QzJGNjIwRDQ1N0Y1REQwNkFFNTUxQjY5QkFEREVFOTlBNkM5M0VEQzdCRjdDRDU2ODk4Q0VDNEFCNEU2MzM0ODlERDE5MzRCM0VBQjY4NjAxRTM1NjAwOTJDQjlCMUM2NEI5MEM5RkJCNkY2MkJFNjBCMEUyMjFGMUY2RTFENTg0NDRCNzMxQjMwQUIwNEM0MDk4ODA5M0ZCRDM5NkU2NUJBNzAzRjUyQUNFMDY5NTAzNUVFNzhFN0E0OTY5RDNFQjU4MzRDNThFRjYwRkVFMURFMEYwRTAzRTQyMDNGRjUwRjk1N0VENjg1MTNGOTEzNEE0MzMyQjU2MDQ0RUUxNENFODBFQUQ3Q0U1MzJBQ0E1OEIxRjk4NDIzQzNDQUJEOTkyMUY4M0E4MUM3NDY3QjNDNkY2REU0QjEyQUQ3NDFDNzM0NUJENjQ1ODU0QkJGODU5RDExMEM4RDYwRjUzQUZFNjVGNkE4QTA4NTZCQkY3ODk1NEY4RUNDODMxRkJCNDNGMDMwNDQ5QTlGRTcyQTNDODZBQjc5NjJBQ0QyODk3NTUzMENCNTY3Q0VBNzEzQkU3NkIyMjYyQTcwODk2QjhBM0NBQzY2NzcyQzU2QTlFRDEzOUYzRjQzNDk4OThBRUNDREVCRDU2MjJGMzJBNzVFQkJDOUZFMjAyRkU1NkM5NTczNTZENDBBRkVFNDcxOEM1MkQzMEZCRjY4M0NFMTcwNTZFNjcyRjkwOTExMEMwODdEMzYxQzE5NkZFMzNDNkQ4MERDNjkyNTc2OUY2QTkzREQ0MUI1QkI1RkVBODA2RjNCRjU2QzUwRDY5QjQ1QTM3MUFDNURDRjVDRjM1NkJDNTUyRTBDRjg3RTIyQUYwRjEyMUIyMTI3OEIwNjcxMzhFMkFGQTA5OEU3RURFMUMwQThBQjI5QjZDQ0Y2Qjg1RDM5QURCOUNFREQwMTM4ODZEMkMyM0MyNzNBMjEyNjdCMkYyQzIyQjVCRjI1RDVBNUNCRDA4MzY4NEI0NTRBQjVGQjg1NEY5MENCNDlCMkY1Mzc5NUJCRkQ0NjM0OEIzMDk1ODM5ODM0NEY5QzM2MjA0MEUxNDEyRjMzMUUyREQxNjc5RjMxQURCQ0Y4RDQwQkQzQkY3MDdBNEYzNTU4MjM5QTBCOTQ4OEIzRDZBMjY0RTZEQTM5MTFCMEJFNDdERkYzMjU3QjE5MzEyOUREQTlGM0MwRDlBREVCMTYxRjg0MjZDQ0QwMUFEMkQwODU0RjczMTlFMTJERjg5REE4OEM5OEZCRkVBOTZEMUY0MEJEMDk4QUE0NkJFQjQ3MTgzNEIwMzlENkYwMDFGODA0RUQzREM0N0NERTAxRDVCNTk0RDU2NUQ5NEY3MEJBNzM4NzgyMkRCRThEMEU0NDY0NUE5MTRGMjVEMUQxNUYzOEVCNEU1QzlCNEY0OEM2MTQ2REJFRkY4RDM2QzE3RTVFNTdBM0YwN0U1NjFBRjM5MEVERkE0RTJDRkVDQTE5NzIyQTNCRUVFQTIzNzgyQ0Q3QUY4QTYxNzY3QjAxMEY4OUE3MDgyRTA0RTgwN0Y1Q0VDNDlCRjVBQzcxREIzREZEQzU2NjVDRDFGQTVCOUVCMEMzQzczNDNDNjc0NzMwRUM2NTBBMTNCQUU0MTIxMjZDNjhEQUY5MTc4NjJBREI0RTIyMDQ2MUE2Q0QwQzc1MTFGNEYzMUM0N0Y4QTQxQUM1NEZDMEIzNEYwN0RDMTUwNjBFOUE0Mzg1NURBMEExNjI0MzZCMUQzQTRCNkQ4RUE4NzIyOUZBRUNCQkQ5QTJGMDc5MjI2NkREMTYwRTBGODY3MTY5MDQxMUY4QTlCQzc0MjlGOEUwRjRFQjAwOThFMzNGMDUzMjA1N0QxRTA1RTZBNzhGRjQ4QTZCREY3ODE3NkZCNDYyRTU2QjMwNTQ3NkE3OEYwOTk3ODZBNjc5M0QyRkMzRjRGNzREQUJEM0EzNEJDMkU1MDI2N0YwNjE1NzQ5NEI5OTY2RTFCRjFGODcwOENCQjc3MDU4MENCQjI0NjdGQzFCMzU5NTM0NUE0OUE1RDhFQzUyOEYzRTJCM0Y5MUIwNkUwNjkzRjg3RkRBM0I2OENGOTlERjVDNDdCQjE4Qjc2N0ZCRTc0RUMwQjY2NEFDMEYxQ0M2NTkyRjAxQTU2NTlBN0YzQjQyOTNCRkI4NTQxRjBBOUUzRjkyM0E1NDdERDFDNzg0RUQ2MjRDRDNBMkM5RDFCOEMzMDhCMzIzNkU0MTQ2QzkzQ0RDMzZFMTdERkVEQTVDMTIzRTczNUFENEZFQUFEQ0FBQkY5NTgxQkMxMDYwNzI2RjU0NUMzMDhFNTZDNzMxMDA5M0Y3OTM4QTIwODNEQzQ2OEJGNUZGM0M4NEMyMjcxRUM3NTMzODM4RkYxNUU2RjdFRThDNzExMTVFQThFMzQyQkMzM0FENjQ0Njc2NDBCMTFFRkU1RjMzQ0VDREVFMzA1OEU4QzE3RjhDQTA0ODg5MTg1MDZGRTJGQTEwQjkyQjlGQTg3REQ3MzA1MzYyRDI0RDRDRTQ1NEE3Nzk2MTJCMTEyQzdDN0U2RDRCNjMyQTg0NzVFREFEQkVBMTM0ODZDRkFGNTY0N0U0REYxRkIxMzVBRTc5M0Y4RTZEMjMyMTZCMEFERjY2NEExNDM5N0RBRTA3RTEzM0ExQTU4RTE1QjI1RTkwOTJCNjFGQUQzNjE5QkQ1NTE4NTgxNDRCODBEOTA3NUQzNDEyOEMzNTE2NDNGMTAxQkFEREZBOTkwQ0U5MTBGMkE4RDcyMUI2NEM0OTVBMTJGMDdBRjNEMzJDRURBQzkyRTIwREQ5NjM4QzBEQjM2RUI3QjEyODYxMzhGRTA1NkVBRTlEOTFDNEEwQUI3REM1MjY3RkIxNkE0MUI3NzFFQjAxRDU0NzAxRkI0MzU3MDQ4MjE1N0JFMTBDNkZBOUU0RDg2NkI4QjVENjUwRUU2RjNGRTExN0IxRkE3OUNCRTRGOEE5Qjk3OTI4RUJBMkZDQTZENzY2OUIzODQxODQ4OTVCRkU3NkFCRjQ4NEIwM0I5RjdDQTEwMzA4QzZDRTMxMTk3Q0ExNUIxQTM2Q0VEQzM3NzRCNkI5RERDQzI0MzFFNzMyREIzNjUzN0YxRjRGNDg4M0U4MUU3QjNDNkQzNjhCNEVCRENFMzRDNjU3NzExRDJDQkI0MTU4RDUxOUUwMjdDNUI0QjY0NTc1QUZDRDg3Q0U3MzZDNDUwMjhEMzc4RDcwQzBGREU3M0I1NDk5RkZCMzA3QjlERDgyMDczODMzQzBBODQ3Njk5NjRGQkQ3RDAxQzRFQ0U4MDVFMTIyMzY0QjJCNDg1QjZEQUM3NzkzRjFFRTdGMUNCMkE1MEFFNjU2NUNEMjEwMzA4MjYwRUY2NEQ5QjJGRTgzNzg1MTZBRDA5Mzk2MEQ1Q0E4Q0ZBOUZDRjI4NzYyOTk4MDIwNzQzMDg2QjkzRUVERUMzMjQ3ODQ0MjhFQkEyMzE0MTQ2NjE4NUM3NDAwNTVCMUU4N0JGN0Y2QkVGNUNFOEUyOEREMjcwRjlEQTY0RDZGRkYyQ0IwRDczQTczNEQ0NURDNTZDRDAzQkU5NDE0REI1NjhFRTIzNjZGMjE2NkZENkQ0M0FGOUVFRUNCMTNDNEE1RDNBOEU3NzVCRUU1OTQyMTk0MDMzQUUzRUUxNzU0RkMwNDZCRTkxMTMwOTc5QUI4OEU0N0E0Q0VBMzc5RUQ5RTc3QkM0MzEwRERBRTJCREI3QTVCOTQxRTNGQjYwODFDQzNFRDcxMEUwQzYwM0Q0N0VGQTgyRkNDQzBENTU2RDRBQjU4ODI1RUJFNkVDNzcwMEYwMkZCN0EwRUVENDRDRDJGODc3MkNDREVFNEJBNEI4ODNEQUFCNDYyNjRBNTY5QUFBRTk3QTBFNDM2OUVDMDBGNTlEODQxQTFBN0NGMkQzOUJDNTg3MjVCMjQ4QzdCMTU5RDZENjhCM0Q5NzIxMjMxQ0FDQUFEMzhGMjZGMzU3QkZEMzFGRkNFQzE4Q0YzNEVFNDJDM0IzNzVDODI3QzQyODRCMzFGQ0Q0Mzc0Q0ZFOEMyQzdBNkI5NTI1ODFDOTgzNzU4N0NCMTYxRUVDQTIzNzI5MEFGRTgwOTVFMDY5QTk5NTE0REZBRkMyRkQ4Q0ZDNzM0QjRBRTY0ODA3RDNBQ0EyNjgxQURFMEZBMDE4QjE3RDJBNjFGMzBGMDMwN0FFODZENjdENEExNEQ5Q0UyMTRDRjQxRURCNzAyNzM1Rjk5RDU4QkRBQ0U3RjI4QzdEOTVBOUNBRThCMDc5NzA4QzZDN0U3OEFDQ0FCNjdGNjdBNTk4RjdDODZGRThCOEFCNjUzOUIyRUJCMzc2QjZBMTcxNDRBM0FEQUQ2QkU1RDYxN0QzMDYwN0FCNEQ5NEMxMUE3QzE4NThFMTlCNUM3QjEyRjlCRTRBQzI0NUE5RTkxQTIyRUU1NDcxQUE1ODUzOEFGQjM1MzE5RjUzRDZERDY5QkMyQUU0OEQyQjY0OURGRjZFNzFERUEzQjc5N0MwNzFBMEMzNDVGNjZERjA1MzQ3NUE0MDAzMUYzMjM5MDhDNzFBMTk4QzdGQjJENTQyQUE4REQ5N0IyRjFDRTAxRDExRTdGQzQ1ODUxOENFMUNCNDUxQkI5QjFENTc1MzBEMTVFQzk1QkE3M0JENUEzODY5NDdGRjhEMEY1NjU1NDlBMTFCODg3NTlENkFCQTNBODM5NjdCRjk1NDNFNjQwQTMzRjZGOUQ5NjU1QTU0Nzc4NUI0MkIxMTIxNkVDMUNDRTA2NzYzMEU4OTcwOENBODk2NzMzMTI5REI1MzEyMTY5MDAzQjhGQUNCOERFM0Y5OUU2NTQyN0FFRjUxQ0MxQzkxMDA1QkI3RjVCNjUyMThCMUI0OTJGREQ2Nzc2MUUwRjdDMkZDNjBGN0VDQTEzQjA5REY2QjJBNTNCNUI5Q0VBQjQzRDVBMUVDMzI2MEE4OUI1NEJDMjU3ODUwRjA2NTlFMzI0MERBRjA3M0NDNTIzNkY2NUIxNTlDRjhGREVDNzcxOTExQzA1NEJCNDE3RjY3OTkzMzBENDQzQTczNTcwNEU2NkVBOUYxRDMzNTE4MzcxOTdDMTlFODIyNkQyN0ExRUI1QjY2NDc4MUNGMDY1MTIzMUFCMjU2NzhBNEM5Rjk5NzNEQTgzMEVEMzg3MUE2RUU2MzhEREEzQzc4OUIwQUMyN0RGNDk3MTdDQTJBMURGNDY5NjhENTYwMzVFRjAyQjcxMkQxMjA2N0U3MkIxRTY2MTEyMEZDMUZERTRGRTZCMTFCQjREMTg5RjI5MTEyREJCRDZERDBEOUU0RTc4NTAxQzhFNUVFRUNDMzMzQjIwOEQ3Qjg2NTIyQzYxREU0RUQwRDQ0NTREMTlDQTYyMDI3NjI3MzQ0RjQ1NUMwNUY0MjlGQTE3RTRBNkYwQkFGQ0Q0QjU3NUNCQTM3NTVCMDQyMzgyOTQyMTkwQjZFQUY3NjJERjc3MTQ3OTdFOTE2RDU4RTdERDBERTJDRkM0MUQ4RTZFNDEwREU2MjNFQTVDNTQ3MzM0RDNBMjE0ODhDRDJENjVFNkY5RTBGMTIzMTY2RkQ4MzA0MzA5RDAxNjBCNUE2MDUzMTdFMDEyMjMwOEY5RkYwNjVBRTZFRDQyMjQzN0M5NjJBMTM2MkVDMUYyODA0QjI3NEUzQkFFMTE4MjkyRkY5MzBCRDUxOUVGRDNBOTNFNDBGOTQ5QUJDNjBFOEU5MTkwREFBRjlGQzgwOTlBNDQzMTE4NjFCMDJGRkI0RjlBMEFFQTgxOTk5MTcwRUQ1QkQxNEI3MjdCNDJFQjQ0QjBCNTU5ODNGMUFDMkYyQkE4MDczNDYzMEQ2Qjc1MDBENjVFQUI0MkY2NzcxRUVBNjg3MjY3N0UyNTJEQTRDNzE3QkFBMDc3NjBCRkM1RkUwOUQ0ODM1QTY1MjAwQTgwQzI3NTlBNDc2QTkzMEI3RkI0QTczODI0MUMzRTczQTlDNzVENUE3RjBBMEJFNTIxMzhEREEyODEyQUVGQkE4RkQ3OEQ1ODQwRTZFQTFEMTVDNTdFQTY2QTU5QjNBODgyQThGRDA0MDkzQTU4MTVBNTMyNEJFNzVDNEY4M0NGMTZCNzg1RDJEM0JEMzY2MDJBMDAyNkE5ODk1Q0IzNDM2ODhFRUE0MENEQjQ4M0VEQ0Q4Nzc4OEI2NjhBNjlEMEJDNzVCMDdEOEM4MjQ3QTk3ODBFNEMxRUMzNDJDMTE5ODI5NUQ2OTlGMDgyOUU0MUE3OEYwRjk5NzhERDUyRDY0OTE4OThGMUYwNUI5NzlFNTg3RjcxMURGNjZGMzhDMjNDMkJGRjlDNjkwODZBQjk3MEM0NjgzMTVCM0I2QzM2RDU4QTdBRTlDNzQ5RkEwNjQyOUU2NzgxQUU3RDQ5QjNCMzY4MDQ4NjQxQTYzREI5NUVFMjkzQTE5NTQyMDFDQUQ3MkU5MkE4NUUzNEM3QTc0QjJGRDFCQ0E2QUE2MTQzNUFGMkRDMzJDMUEyRjU1OUY2M0U3MTZBNkM5NkYwNzYwOTdFNkM0NUY0MzcyQUU2ODI4RTlFQUFFM0VCODIzNjE3MTBFQzE0RjY3RjdEMEVEOTg1OTI0OUMxOEQxNDk4NTMwMjg0N0ZDOEYzMzAxQkQzMUM3RTFFMDlCMjA1N0U5RUU0NkZDQzdDOUJEOERCNTlFQjBERUIwQjFEOEQyOTE1MDhDQjM4MzdDOUIyRjE5MUE0OTU5NUQ2QUFERENFRkVGMERENTlFRDNBMDVGQThGNkVGMDNEMzhGNTM0MTM5RDU2QkNCRDRCQzMyNTZFMUExMjBENDlBNURCMUJBREI1MjhCMDI1NkM2MUEyRjE3OUEyM0M0OTkyODczOEY5QzBGQTgxRkMxOTZEMUE3NDUwNzk5ODQxNUYwNzBFRjlDMzhCQUE1Mzk1MUZFRTdCNjgwMDhCQzY3NUUwRTE1QkMzMkE2MUMzMEJDMTMyRTc5QzU4QTNBOTcwRkZEREI4QjgwNjc4MkREMzEyNDJCM0MzQ0Y5ODEwQkVFQTVGQjVBMUIyNTBFQTYyMzM2NDU2RTc2OTRCNEM4Mjk1MDhDN0RCRkUwOTBBRjZBODUwRjc5RDA0RDJDNjk4NjM3ODE2MDE3RjhBOTIwRTFCMUFERTIzNkUyMjdCMzQ4MDg5OUJDQkI5OTFGNkM2QzI0MEJCRDQxMTRBQUY5ODc1OTM1NTU4Mzk0QTQ4NjY1MkIwOTQyRjM0MDlCNjZGQUY4QjhCRjcxMUNDOEMzNENDQTQxQjhFMTZDMkNERjAxNjBCOTJBMzMyQzFGMDRCQzY0NTgyNDQ2Qjk4QUZGMzQxODk2NzVCN0ExMEZGQzZGMTNCM0Y3NDY1NEVEN0MwNTkwRDRBRjdGNEQ3NDdCRjg5QkIyQThGNUM4Q0U2MTBDRjRGQTRBQjcxNEE4NDVFMTU2NDlCNTNFNTRBOTUyMTNENUE3MzkwNTk0MUQ5NDY3QjBCRUREQTJCRUNDMUMyMTlFMUNBQjY5OTY1MkQ4NUI4Q0Q3RTBDRDExQ0U1QjBDQUM3NkY5RUYzRDc0QkQ4Mjk4Nzc4OThFNzM1MENDQTcyMTAxMDc2QTk3MEJFQzY3NTZDM0ZEMUFBRjMzOTZGNzI4MzNGOEQ0RTcxNkFFQzZGOTM3MThCMjYyNzEwQjBEQTJGM0ZENkNCREIyMDRFRDBFOTFENjVDQUIzOUVEMzVGMjJBMDFFNUQ1MDkyODI3NTI4MzdFQkVFOTY4QjE0MDk4OUVGNUY0RDUxMzQ1Mjc4NEJEQjg5MkNBRkQ4Mzg3RTA1QjMwMTJDMDQ1OEEzNjlFNjIxOTFGNUJEQzU3REQ2M0NFNDJFOTQ1RjQ5M0MyQjQyMzA2QjgwODRGM0IyNUU5NEFCQUNGMDhFRTE1NUYzNjIxQUNDOTYyNkVFNDg3QzdBN0U0NjY3RjAzNzdBRTRCMkYlISIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4944" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    The 256-bit and 512-bit hashes corresponding to this message under the SHA-3 functions are the following:
</Text-field>
</Input>
</Group>
<Group labelreference="L4916" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="SHA3[256](lm34304, hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkMjU2RicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUYsNiNRIUYnLUY2NiQtRiM2KC1GLDYlUShsbTM0MzA0RidGL0YyLUkjbW9HRiQ2LVEiLEYnRj4vJSZmZW5jZUdGQi8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0ZCLyUqc3ltbWV0cmljR0ZCLyUobGFyZ2VvcEdGQi8lLm1vdmFibGVsaW1pdHNHRkIvJSdhY2NlbnRHRkIvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR1EsMC4zMzMzMzMzZW1GJy1GVDYtUSJ+RidGPkZXL0ZaRkJGZW5GZ25GaW5GW29GXW9GX28vRmNvRmFvLUYsNiVRJGhleEYnRi9GMkZARj5GPi1GVDYtUSI7RidGPkZXRllGZW5GZ25GaW5GW29GXW9GX28vRmNvUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmFvLyUmZGVwdGhHRmdwLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZjcDYmRmVwRmhwRmpwL0ZdcVElYXV0b0YnRklGQEY+">QyQtJkklU0hBM0c2IjYjIiRjIzYkSShsbTM0MzA0R0YmSSRoZXhHRiYiIiI=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5084" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4917" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="SHA3[512](lm34304, hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkNTEyRicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUY2NiQtRiM2Jy1GLDYlUShsbTM0MzA0RidGL0YyLUkjbW9HRiQ2LVEiLEYnRj4vJSZmZW5jZUdGQi8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0ZCLyUqc3ltbWV0cmljR0ZCLyUobGFyZ2VvcEdGQi8lLm1vdmFibGVsaW1pdHNHRkIvJSdhY2NlbnRHRkIvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR1EsMC4zMzMzMzMzZW1GJy1GUTYtUSJ+RidGPkZUL0ZXRkJGWEZaRmZuRmhuRmpuRlxvL0Zgb0Zeby1GLDYlUSRoZXhGJ0YvRjJGPkY+LUZRNi1RIjtGJ0Y+RlRGVkZYRlpGZm5GaG5Gam5GXG8vRmBvUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRl5vLyUmZGVwdGhHRmRwLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZgcDYmRmJwRmVwRmdwL0ZqcFElYXV0b0YnLUYsNiNRIUYnRkBGPg==">QyQtJkklU0hBM0c2IjYjIiQ3JjYkSShsbTM0MzA0R0YmSSRoZXhHRiYiIiI=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5078" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    We next apply Keccak, with <Font italic="true">b</Font> = 1600, <Font italic="true">r</Font> = 576 and output length 512:
</Text-field>
</Input>
</Group>
<Group labelreference="L5075" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Keccak(lm34304, 1600, 576, 512, hex)" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYqLUkjbWlHRiQ2JVEnS2VjY2FrRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkobWZlbmNlZEdGJDYkLUYjNjEtRiw2JVEobG0zNDMwNEYnRi9GMi1JI21vR0YkNi1RIixGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRjEvJSlzdHJldGNoeUdGRS8lKnN5bW1ldHJpY0dGRS8lKGxhcmdlb3BHRkUvJS5tb3ZhYmxlbGltaXRzR0ZFLyUnYWNjZW50R0ZFLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdRLDAuMzMzMzMzM2VtRictRj42LVEifkYnRkFGQy9GR0ZFRkhGSkZMRk5GUEZSL0ZWRlQtSSNtbkdGJDYkUSUxNjAwRidGQUY9RlgtRmhuNiRRJDU3NkYnRkFGPUZYLUZobjYkUSQ1MTJGJ0ZBRj1GWC1GLDYlUSRoZXhGJ0YvRjIvJStleGVjdXRhYmxlR0ZFRkFGQS1GLDYjUSFGJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZULyUmZGVwdGhHRl5wLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZqbzYmRlxwRl9wRmFwL0ZkcFElYXV0b0YnRmZvRmRvRkE=">LUknS2VjY2FrRzYiNidJKGxtMzQzMDRHRiQiJSs7IiR3JiIkNyZJJGhleEdGJA==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4945" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Next, we include a couple of text messages and we compute their message digests with the four SHA-3 functions; these results can be checked against those obtained using the online implementation of SHA-3 at <Hyperlink linktarget="http://emn178.github.io/online-tools/" hyperlink="true"><Font style="Hyperlink">http://emn178.github.io/online-tools/</Font></Hyperlink>. Observe that a small change in the message produces a random-looking change in the hash value.
</Text-field>
</Input>
</Group>
<Group labelreference="L4918" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="mt1 := &quot;The quick brown fox jumps over the lazy dog&quot;:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYtLUkjbWlHRiQ2JVEkbXQxRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtSSNtc0dGJDYjUUxUaGV+cXVpY2t+YnJvd25+Zm94fmp1bXBzfm92ZXJ+dGhlfmxhenl+ZG9nRictRjY2LVEiOkYnRjlGO0Y+RkBGQkZERkZGSEZSRlQtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0Zbby8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GZ242JkZpbkZcb0Zeby9GYW9RJWF1dG9GJy1GLDYjUSFGJy8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSRtdDFHNiJRTFRoZX5xdWlja35icm93bn5mb3h+anVtcHN+b3Zlcn50aGV+bGF6eX5kb2dGJSEiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4919" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="mt2 := &quot;The quick brown fox jumps over the lazy dog.&quot;:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEkbXQyRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkwtRjY2LVEifkYnRjlGO0Y+RkBGQkZERkZGSC9GS1EmMC4wZW1GJy9GTkZTLUkjbXNHRiQ2I1FNVGhlfnF1aWNrfmJyb3dufmZveH5qdW1wc35vdmVyfnRoZX5sYXp5fmRvZy5GJy1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRkpGTS1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZTLyUmZGVwdGhHRltvLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZnbjYmRmluRlxvRl5vL0Zhb1ElYXV0b0YnLUYsNiNRIUYnLyUrZXhlY3V0YWJsZUdGPUY5">QyQ+SSRtdDJHNiJRTVRoZX5xdWlja35icm93bn5mb3h+anVtcHN+b3Zlcn50aGV+bGF6eX5kb2cuRiUhIiI=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4985" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4920" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[224]]([mt1, mt2]);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkMjI0RicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUkjbW9HRiQ2LVEifGlyRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmduLUY2NiQtRiM2JS1GNjYmLUYjNigtRiw2JVEkbXQxRidGL0YyLUZKNi1RIixGJ0Y+Rk0vRlBGMUZRRlNGVUZXRlkvRmZuUSYwLjBlbUYnL0ZpblEsMC4zMzMzMzMzZW1GJy1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GLDYlUSRtdDJGJ0YvRjJGQEY+Rj5GQ0ZGRkBGPkY+LUZKNi1RIjtGJ0Y+Rk1GaG9GUUZTRlVGV0ZZRmlvL0ZpblEsMC4yNzc3Nzc4ZW1GJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0Zqby8lJmRlcHRoR0ZecS8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GanA2JkZccUZfcUZhcS9GZHFRJWF1dG9GJy1GLDYjUSFGJ0ZARj4=">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiRDIzYjNyRJJG10MUdGKkkkbXQyR0YqIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5085" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4921" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[256]]([mt1, mt2]);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkMjU2RicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUkjbW9HRiQ2LVEifGlyRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmduLUY2NiQtRiM2JC1GNjYmLUYjNictRiw2JVEkbXQxRidGL0YyLUZKNi1RIixGJ0Y+Rk0vRlBGMUZRRlNGVUZXRlkvRmZuUSYwLjBlbUYnL0ZpblEsMC4zMzMzMzMzZW1GJy1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GLDYlUSRtdDJGJ0YvRjJGPkY+RkNGRkY+Rj4tRko2LVEiO0YnRj5GTUZob0ZRRlNGVUZXRllGaW8vRmluUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmpvLyUmZGVwdGhHRl5xLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZqcDYmRlxxRl9xRmFxL0ZkcVElYXV0b0YnLUYsNiNRIUYnRkBGPg==">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiRjIzYjNyRJJG10MUdGKkkkbXQyR0YqIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5086" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4922" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[384]]([mt1, mt2]);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkMzg0RicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUkjbW9HRiQ2LVEifGlyRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmduLUY2NiQtRiM2JS1GNjYmLUYjNictRiw2JVEkbXQxRidGL0YyLUZKNi1RIixGJ0Y+Rk0vRlBGMUZRRlNGVUZXRlkvRmZuUSYwLjBlbUYnL0ZpblEsMC4zMzMzMzMzZW1GJy1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GLDYlUSRtdDJGJ0YvRjJGPkY+RkNGRi1GLDYjUSFGJ0Y+Rj4tRko2LVEiO0YnRj5GTUZob0ZRRlNGVUZXRllGaW8vRmluUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmpvLyUmZGVwdGhHRmFxLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZdcTYmRl9xRmJxRmRxL0ZncVElYXV0b0YnRmRwRkBGPg==">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiQlUTYjNyRJJG10MUdGKkkkbXQyR0YqIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5087" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L4923" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHA3[512]]([mt1, mt2]);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkNTEyRicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUkjbW9HRiQ2LVEifGlyRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMTExMTExMWVtRicvJSdyc3BhY2VHRmduLUY2NiQtRiM2JC1GNjYmLUYjNictRiw2JVEkbXQxRidGL0YyLUZKNi1RIixGJ0Y+Rk0vRlBGMUZRRlNGVUZXRlkvRmZuUSYwLjBlbUYnL0ZpblEsMC4zMzMzMzMzZW1GJy1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GLDYlUSRtdDJGJ0YvRjJGPkY+RkNGRkY+Rj4tRko2LVEiO0YnRj5GTUZob0ZRRlNGVUZXRllGaW8vRmluUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmpvLyUmZGVwdGhHRl5xLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZqcDYmRlxxRl9xRmFxL0ZkcVElYXV0b0YnLUYsNiNRIUYnRkBGPg==">QyQtJkkifGlyRyUqcHJvdGVjdGVkRzYjJkklU0hBM0c2IjYjIiQ3JjYjNyRJJG10MUdGKkkkbXQyR0YqIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5079" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field style="Text" layout="Normal">
    We now apply the SHAKE functions to both text messages:
</Text-field>
</Input>
</Group>
<Group labelreference="L5082" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHAKE[128]]([mt1, mt2], 256)" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEmU0hBS0VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JS1JI21uR0YkNiRRJDEyOEYnL0YzUSdub3JtYWxGJy8lK2V4ZWN1dGFibGVHUSZmYWxzZUYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1JI21vR0YkNi1RInxpckYnRj4vJSZmZW5jZUdGQi8lKnNlcGFyYXRvckdGQi8lKXN0cmV0Y2h5R0ZCLyUqc3ltbWV0cmljR0ZCLyUobGFyZ2VvcEdGQi8lLm1vdmFibGVsaW1pdHNHRkIvJSdhY2NlbnRHRkIvJSdsc3BhY2VHUSwwLjExMTExMTFlbUYnLyUncnNwYWNlR0Znbi1GNjYkLUYjNigtRjY2Ji1GIzYnLUYsNiVRJG10MUYnRi9GMi1GSjYtUSIsRidGPkZNL0ZQRjFGUUZTRlVGV0ZZL0ZmblEmMC4wZW1GJy9GaW5RLDAuMzMzMzMzM2VtRictRiw2JVEkbXQyRidGL0YyRkBGPkY+RkNGRkZlby1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GOzYkUSQyNTZGJ0Y+RkBGPkY+LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmpvLyUmZGVwdGhHRl9xLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZbcTYmRl1xRmBxRmJxL0ZlcVElYXV0b0YnRmdwRkBGPg==">LSZJInxpckclKnByb3RlY3RlZEc2IyZJJlNIQUtFRzYiNiMiJEciNiQ3JEkkbXQxR0YpSSRtdDJHRikiJGMj</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5088" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L5081" drawlabel="true" applyint="true" applyrational="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="`~`[SHAKE[256]]([mt1, mt2], 512)" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEmU0hBS0VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JS1JI21uR0YkNiRRJDI1NkYnL0YzUSdub3JtYWxGJy8lK2V4ZWN1dGFibGVHUSZmYWxzZUYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1JI21vR0YkNi1RInxpckYnRj4vJSZmZW5jZUdGQi8lKnNlcGFyYXRvckdGQi8lKXN0cmV0Y2h5R0ZCLyUqc3ltbWV0cmljR0ZCLyUobGFyZ2VvcEdGQi8lLm1vdmFibGVsaW1pdHNHRkIvJSdhY2NlbnRHRkIvJSdsc3BhY2VHUSwwLjExMTExMTFlbUYnLyUncnNwYWNlR0Znbi1GNjYkLUYjNigtRjY2Ji1GIzYnLUYsNiVRJG10MUYnRi9GMi1GSjYtUSIsRidGPkZNL0ZQRjFGUUZTRlVGV0ZZL0ZmblEmMC4wZW1GJy9GaW5RLDAuMzMzMzMzM2VtRictRiw2JVEkbXQyRidGL0YyRkBGPkY+RkNGRkZlby1GSjYtUSJ+RidGPkZNRk9GUUZTRlVGV0ZZRmlvL0ZpbkZqby1GOzYkUSQ1MTJGJ0Y+RkBGPkY+LUYsNiNRIUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmpvLyUmZGVwdGhHRl9xLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUZbcTYmRl1xRmBxRmJxL0ZlcVElYXV0b0YnRmdwRkBGPg==">LSZJInxpckclKnByb3RlY3RlZEc2IyZJJlNIQUtFRzYiNiMiJGMjNiQ3JEkkbXQxR0YpSSRtdDJHRikiJDcm</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4901" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    We create, in the current directory, a file containing the sentence &quot;The quick brown fox jumps over the lazy dog&quot;:
</Text-field>
</Input>
</Group>
<Group labelreference="L4951" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="bytestofile(convert(mt1, bytes), &quot;sha3testfile&quot;, false);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEsYnl0ZXN0b2ZpbGVGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiUtRiM2LS1GLDYlUShjb252ZXJ0RidGL0YyLUY2NiUtRiM2KS1GLDYlUSRtdDFGJ0YvRjItSSNtb0dGJDYtUSIsRicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRkwvJSpzeW1tZXRyaWNHRkwvJShsYXJnZW9wR0ZMLyUubW92YWJsZWxpbWl0c0dGTC8lJ2FjY2VudEdGTC8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUZFNi5RIn5GJ0YvRjJGSi9GTkZMRk9GUUZTRlVGV0ZZL0ZnbkZlbi1GLDYlUSZieXRlc0YnRi9GMkYvLyUrZXhlY3V0YWJsZUdGTEYyRi9GMi1GRTYuRkdGL0YyRkpGTUZPRlFGU0ZVRldGWUZmbkZpbi1JI21zR0YkNiNRLXNoYTN0ZXN0ZmlsZUYnRmNvRmluLUYsNiVGTEYvRjJGL0Zhb0YyRi9GMi1GRTYuUSI7RidGL0YyRkpGTUZPRlFGU0ZVRldGWS9GZ25RLDAuMjc3Nzc3OGVtRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGZW4vJSZkZXB0aEdGZXAvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRmFwNiZGY3BGZnBGaHAvRltxUSVhdXRvRictRiw2I1EhRidGL0Zhb0Yy">QyQtSSxieXRlc3RvZmlsZUc2IjYlLUkoY29udmVydEclKnByb3RlY3RlZEc2JEkkbXQxR0YlSSZieXRlc0dGJVEtc2hhM3Rlc3RmaWxlRiVJJmZhbHNlR0YpIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4948" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    We compute the hash of the file with SHA3-512; the result is the same that the one obtained for the text string:
</Text-field>
</Input>
</Group>
<Group labelreference="L4949" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="SHA3[512](&quot;sha3testfile&quot;, file);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkNTEyRicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUY2NiQtRiM2KC1GLDYjUSFGJy1JI21zR0YkNiNRLXNoYTN0ZXN0ZmlsZUYnLUkjbW9HRiQ2LVEiLEYnRj4vJSZmZW5jZUdGQi8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0ZCLyUqc3ltbWV0cmljR0ZCLyUobGFyZ2VvcEdGQi8lLm1vdmFibGVsaW1pdHNHRkIvJSdhY2NlbnRHRkIvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR1EsMC4zMzMzMzMzZW1GJy1GLDYlUSVmaWxlRidGL0YyRkBGPkY+LUZVNi1RIjtGJ0Y+RlhGWkZmbkZobkZqbkZcb0Zeb0Zgby9GZG9RLDAuMjc3Nzc3OGVtRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGYm8vJSZkZXB0aEdGY3AvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRl9wNiZGYXBGZHBGZnAvRmlwUSVhdXRvRidGTUZARj4=">QyQtJkklU0hBM0c2IjYjIiQ3JjYkUS1zaGEzdGVzdGZpbGVGJkklZmlsZUdGJiIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5038" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    As another example, we compute the SHA3-512 hash of the original file containing this worksheet, namely, &quot;SHA-3.mw&quot;, assuming it located on the current directory:
</Text-field>
</Input>
</Group>
<Group labelreference="L5039" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="SHA3[512](&quot;SHA-3.mw&quot;, file);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVElU0hBM0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2Ji1GIzYlLUkjbW5HRiQ2JFEkNTEyRicvRjNRJ25vcm1hbEYnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRidGPkY+LyUlb3BlbkdRIltGJy8lJmNsb3NlR1EiXUYnLUY2NiQtRiM2KC1GLDYjUSFGJy1JI21zR0YkNiNRKVNIQS0zLm13RictSSNtb0dGJDYtUSIsRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUZVNi1RIn5GJ0Y+RlgvRmVuRkJGZm5GaG5Gam5GXG9GXm9GYG8vRmRvRmJvLUYsNiVRJWZpbGVGJ0YvRjJGPkY+LUZVNi1RIjtGJ0Y+RlhGWkZmbkZobkZqbkZcb0Zeb0Zgby9GZG9RLDAuMjc3Nzc3OGVtRictSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGYm8vJSZkZXB0aEdGaHAvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRmRwNiZGZnBGaXBGW3EvRl5xUSVhdXRvRidGTUZARj4=">QyQtJkklU0hBM0c2IjYjIiQ3JjYkUSlTSEEtMy5td0YmSSVmaWxlR0YmIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5042" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    An example of the use of HMAC3 for authentication would be the following. Suppose that Alice wants to send Bob the following message:</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
<Group labelreference="L5043" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="msg := &quot;The meeting will be tomorrow at 11:30 AM&quot;:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYtLUkjbWlHRiQ2JVEkbXNnRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtSSNtc0dGJDYjUUlUaGV+bWVldGluZ353aWxsfmJlfnRvbW9ycm93fmF0fjExOjMwfkFNRictRjY2LVEiOkYnRjlGO0Y+RkBGQkZERkZGSEZSRlQtSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGTC8lJmRlcHRoR0Zbby8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GZ242JkZpbkZcb0Zeby9GYW9RJWF1dG9GJy1GLDYjUSFGJy8lK2V4ZWN1dGFibGVHRj1GOQ==">QyQ+SSRtc2dHNiJRSVRoZX5tZWV0aW5nfndpbGx+YmV+dG9tb3Jyb3d+YXR+MTE6MzB+QU1GJSEiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5045" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    Alice wants to make sure that the message that Bob receives is exactly this one and that Bob knows that the message really comes from Alice. For authentication purposes they have agreed, through a secure channel, to use the 256-bit key with HMAC3[512]:
</Text-field>
</Input>
</Group>
<Group labelreference="L5044" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="k := &quot;c73a4875sff3dcca50cb049ceceb3a5e230d45a640711dcdbdd012576ffe6f20&quot;:" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEia0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTEY1LUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTLUkjbXNHRiQ2I1Fbb2M3M2E0ODc1c2ZmM2RjY2E1MGNiMDQ5Y2VjZWIzYTVlMjMwZDQ1YTY0MDcxMWRjZGJkZDAxMjU3NmZmZTZmMjBGJy1GNjYtUSI6RidGOUY7Rj5GQEZCRkRGRkZIRlJGVC1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZMLyUmZGVwdGhHRltvLyUqbGluZWJyZWFrR1EobmV3bGluZUYnLUYsNiNRIUYnLyUrZXhlY3V0YWJsZUdGPUY5">QyQ+SSJrRzYiUVtvYzczYTQ4NzVzZmYzZGNjYTUwY2IwNDljZWNlYjNhNWUyMzBkNDVhNjQwNzExZGNkYmRkMDEyNTc2ZmZlNmYyMEYlISIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5046" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    Alice then computes:
</Text-field>
</Input>
</Group>
<Group labelreference="L5047" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="tg := HMAC3[512](k, msg);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYvLUkjbWlHRiQ2JVEjdGdGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSSNtb0dGJDYtUSomY29sb25lcTtGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGTC1GNjYtUSJ+RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSYwLjBlbUYnL0ZORlMtRiw2JVEmSE1BQzNGJ0YvRjItSShtZmVuY2VkR0YkNiYtRiM2JS1JI21uR0YkNiRRJDUxMkYnRjkvJStleGVjdXRhYmxlR0Y9RjlGOS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1GWTYkLUYjNigtRiw2JVEia0YnRi9GMi1GNjYtUSIsRidGOUY7L0Y/RjFGQEZCRkRGRkZIRlIvRk5RLDAuMzMzMzMzM2VtRidGTy1GLDYlUSRtc2dGJ0YvRjJGW29GOUY5LUY2Ni1RIjtGJ0Y5RjtGXXBGQEZCRkRGRkZIRlJGTS1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0ZTLyUmZGVwdGhHRltxLyUqbGluZWJyZWFrR1EobmV3bGluZUYnRk8tRmdwNiZGaXBGXHFGXnEvRmFxUSVhdXRvRictRiw2I1EhRidGW29GOQ==">QyQ+SSN0Z0c2Ii0mSSZITUFDM0dGJTYjIiQ3JjYkSSJrR0YlSSRtc2dHRiUiIiI=</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L5049" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">
    Alice then sends Bob the pair (<Font italic="true">msg, tg</Font>). By repeating the previous computation using the secret key <Font italic="true">k</Font> they share, Bob observes that the value obtained coincides with <Font italic="true">tg</Font>, which gives him assurance that the message really comes from Alice and has not been modified en route. In this case the message was sent in the clear but it is also possible to combine authentication with an encryption scheme to obtain authenticated encryption.
</Text-field>
</Input>
</Group>
<Group labelreference="L4969" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Next, we use HMAC3 to compute a couple of tags.  First we compute the HMAC tag for an ASCII message using SHA3-256:
</Text-field>
</Input>
</Group>
<Group labelreference="L4975" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="HMAC3[256](&quot;0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b&quot;, &quot;Hi There&quot;);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEmSE1BQzNGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JS1JI21uR0YkNiRRJDI1NkYnL0YzUSdub3JtYWxGJy8lK2V4ZWN1dGFibGVHUSZmYWxzZUYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1GNjYkLUYjNiktRiw2I1EhRictSSNtc0dGJDYjUUkwYjBiMGIwYjBiMGIwYjBiMGIwYjBiMGIwYjBiMGIwYjBiMGIwYjBiRictSSNtb0dGJDYtUSIsRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUZVNi1RIn5GJ0Y+RlgvRmVuRkJGZm5GaG5Gam5GXG9GXm9GYG8vRmRvRmJvLUZRNiNRKUhpflRoZXJlRidGTUY+Rj4tRlU2LVEiO0YnRj5GWEZaRmZuRmhuRmpuRlxvRl5vRmBvL0Zkb1EsMC4yNzc3Nzc4ZW1GJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0Ziby8lJmRlcHRoR0ZocC8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GZHA2JkZmcEZpcEZbcS9GXnFRJWF1dG9GJ0ZNRkBGPg==">QyQtJkkmSE1BQzNHNiI2IyIkYyM2JFFJMGIwYjBiMGIwYjBiMGIwYjBiMGIwYjBiMGIwYjBiMGIwYjBiMGIwYkYmUSlIaX5UaGVyZUYmIiIi</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4978" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Now, the tag of a hex message using HMAC-SHA3-512:
</Text-field>
</Input>
</Group>
<Group labelreference="L4976" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="HMAC3[512](&quot;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;, &quot;dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&quot;, hex)" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEmSE1BQzNGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JS1JI21uR0YkNiRRJDUxMkYnL0YzUSdub3JtYWxGJy8lK2V4ZWN1dGFibGVHUSZmYWxzZUYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1GNjYkLUYjNistRiw2I1EhRictSSNtc0dGJDYjUUlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhRictSSNtb0dGJDYtUSIsRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUZVNi1RIn5GJ0Y+RlgvRmVuRkJGZm5GaG5Gam5GXG9GXm9GYG8vRmRvRmJvLUZRNiNRX3FkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkRidGVEZmby1GLDYlUSRoZXhGJ0YvRjJGPkY+Rk0tSSdtc3BhY2VHRiQ2Ji8lJ2hlaWdodEdRJjAuMGV4RicvJSZ3aWR0aEdGYm8vJSZkZXB0aEdGZnAvJSpsaW5lYnJlYWtHUShuZXdsaW5lRictRmJwNiZGZHBGZ3BGaXAvRlxxUSVhdXRvRidGTUZARj4=">LSZJJkhNQUMzRzYiNiMiJDcmNiVRSWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFGJVFfcWRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRGJUkkaGV4R0Yl</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4977" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Another example is the following:
</Text-field>
</Input>
</Group>
<Group labelreference="L4968" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="HMAC3[512](&quot;0102030405060708090a0b0c0d0e0f10111213141516171819&quot;, StringTools:-Repeat(&quot;cd&quot;, 50), hex);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYrLUkjbWlHRiQ2JVEmSE1BQzNGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JC1JI21uR0YkNiRRJDUxMkYnL0YzUSdub3JtYWxGJ0Y+Rj4vJSVvcGVuR1EiW0YnLyUmY2xvc2VHUSJdRictRjY2JC1GIzYvLUYsNiNRIUYnLUkjbXNHRiQ2I1FTMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmMTAxMTEyMTMxNDE1MTYxNzE4MTlGJy1JI21vR0YkNi1RIixGJ0Y+LyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRlcvJSpzeW1tZXRyaWNHRlcvJShsYXJnZW9wR0ZXLyUubW92YWJsZWxpbWl0c0dGVy8lJ2FjY2VudEdGVy8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUZSNi1RIn5GJ0Y+RlUvRllGV0ZaRmZuRmhuRmpuRlxvRl5vL0Zib0Zgby1GLDYlUSxTdHJpbmdUb29sc0YnRi9GMi1GUjYtUSM6LUYnRj5GVUZnb0ZaRmZuRmhuRmpuRlxvRl5vRmhvLUYsNiVRJ1JlcGVhdEYnRi9GMi1GNjYkLUYjNilGSi1GTjYjUSNjZEYnRlFGZG8tRjs2JFEjNTBGJ0Y+LyUrZXhlY3V0YWJsZUdGV0Y+Rj5GUUZkby1GLDYlUSRoZXhGJ0YvRjJGXHFGPkY+LUZSNi1RIjtGJ0Y+RlVGWEZaRmZuRmhuRmpuRlxvRl5vL0Zib1EsMC4yNzc3Nzc4ZW1GJy1JJ21zcGFjZUdGJDYmLyUnaGVpZ2h0R1EmMC4wZXhGJy8lJndpZHRoR0Zgby8lJmRlcHRoR0Zbci8lKmxpbmVicmVha0dRKG5ld2xpbmVGJy1GZ3E2JkZpcUZcckZeci9GYXJRJWF1dG9GJ0ZKRlxxRj4=">QyQtJkkmSE1BQzNHNiI2IyIkNyY2JVFTMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmMTAxMTEyMTMxNDE1MTYxNzE4MTlGJi1fSSxTdHJpbmdUb29sc0c2JCUqcHJvdGVjdGVkR0koX3N5c2xpYkdGJkknUmVwZWF0R0YmNiRRI2NkRiYiI11JJGhleEdGJiIiIg==</Equation></Text-field>
</Input>
</Group>
<Group labelreference="L4980" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">    Finally,  we compute the HMAC-SHA3-512 tag of the file &quot;sha3testfile&quot; created above, using the sentence &quot;This is my not so secret key&quot; as key:
</Text-field>
</Input>
</Group>
<Group labelreference="L4973" drawlabel="true">
<Input>
<Text-field prompt="&gt; " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="HMAC3[512](&quot;This is my not so secret key&quot;, &quot;sha3testfile&quot;, file);" display="LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYqLUkjbWlHRiQ2JVEmSE1BQzNGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiYtRiM2JS1JI21uR0YkNiRRJDUxMkYnL0YzUSdub3JtYWxGJy8lK2V4ZWN1dGFibGVHUSZmYWxzZUYnRj5GPi8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJy1GNjYkLUYjNiwtRiw2I1EhRictSSNtc0dGJDYjUT1UaGlzfmlzfm15fm5vdH5zb35zZWNyZXR+a2V5RictSSNtb0dGJDYtUSIsRidGPi8lJmZlbmNlR0ZCLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUZVNi1RIn5GJ0Y+RlgvRmVuRkJGZm5GaG5Gam5GXG9GXm9GYG8vRmRvRmJvLUZRNiNRLXNoYTN0ZXN0ZmlsZUYnRlRGZm8tRiw2JVElZmlsZUYnRi9GMkZARj5GPi1GVTYtUSI7RidGPkZYRlpGZm5GaG5Gam5GXG9GXm9GYG8vRmRvUSwwLjI3Nzc3NzhlbUYnLUknbXNwYWNlR0YkNiYvJSdoZWlnaHRHUSYwLjBleEYnLyUmd2lkdGhHRmJvLyUmZGVwdGhHRltxLyUqbGluZWJyZWFrR1EobmV3bGluZUYnRmZvRkBGPg==">QyQtJkkmSE1BQzNHNiI2IyIkNyY2JVE9VGhpc35pc35teX5ub3R+c29+c2VjcmV0fmtleUYmUS1zaGEzdGVzdGZpbGVGJkklZmlsZUdGJiIiIg==</Equation></Text-field>
</Input>
</Group>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">Conclusions</Text-field></Title>
<Text-field style="Text" layout="Normal">    We have used Maple's capabilities as a programming environment, to implement and explore the cryptographic hash functions and the extended-output functions standardized by NIST  in <Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">SHA-3 Standard</Font></Hyperlink>. In addition, we have also implemented HMAC-SHA-3, the version of HMAC (<Font italic="true">Hash-based Message Authentication Code</Font>) based on the SHA-3 hash functions. These implementations use, whenever possible, lookup tables for efficiency and are able to provide hashes and to authenticate messages given either as hex strings, ASCII text strings or files. We have also included some Known Answer Tests to check compliance with the proposed standard.</Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
<Text-field style="Heading 1" layout="Heading 1">References</Text-field></Title>
<Group labelreference="L4899" drawlabel="true">
<Input>
<Text-field style="Text" layout="Normal">M. Bellare, R. Canetti, H. Krawczyk, Keying Hash Functions for Message Authentication, available at <Hyperlink linktarget="http://cseweb.ucsd.edu/~mihir/papers/kmd5.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">http://cseweb.ucsd.edu/~mihir/papers/kmd5.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">G. Bertoni, J. Daemen, M. Peeters, G. Van Assche, The <Font family="Courier New">Keccak</Font> reference, Version 3.0 (Kreference),  available at  <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-reference-3.0.pdf" hyperlink="true"><Font style="Hyperlink">http://keccak.noekeon.org/Keccak-reference-3.0.pdf</Font></Hyperlink> </Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">G. Bertoni, J. Daemen, M. Peeters, G. Van Assche, The <Font family="Courier New">Keccak</Font> SHA-3 submission, Version 3.0 (Ksubmission), available at <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-submission-3.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">http://keccak.noekeon.org/Keccak-submission-3.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">G. Bertoni, J. Daemen, M. Peeters, G. Van Assche, Cryptographic sponge functions, Version 0.1 (Csponge), available at <Font underline="true" foreground="[0,128,128]">http://sponge.noekeon.org/CSF-0.1.pdf</Font></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">G. Bertoni, J. Daemen, M. Peeters, G. Van Assche, R. Van Keer, <Font family="Courier New">Keccak</Font> implementation overview, Version 3.2 (Kimplementation), available at <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-implementation-3.2.pdf" hyperlink="true"><Font style="Hyperlink">http://keccak.noekeon.org/Keccak-implementation-3.2.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">G. Bertoni, J. Daemen, M. Peeters, G. Van Assche, Note on <Font family="Courier New">Keccak</Font> parameters and usage (Kparameters), available at <Hyperlink linktarget="http://keccak.noekeon.org/NoteOnKeccakParametersAndUsage.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">http://keccak.noekeon.org/NoteOnKeccakParametersAndUsage.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">G. Bertoni, J. Daemen, M. Peeters, G. Van Assche, <Font family="Courier New">Keccak</Font> sponge function family main document (Kmain), available at <Hyperlink linktarget="http://keccak.noekeon.org/Keccak-main-2.1.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">http://keccak.noekeon.org/Keccak-main-2.1.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">FIPS PUB 198-1, The Keyed-Hash Message Authentication Code (HMAC) (2008), available at <Hyperlink linktarget="http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">FIPS PUB 202, SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions (2015) (SHA-3 Standard), available at <Hyperlink linktarget="http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf" hyperlink="true"><Font style="Hyperlink">http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal"><Font encoding="UTF-8">J.L. G\303\263mez Pardo, </Font><Hyperlink linktarget="https://sites.google.com/site/cryptomaple" hyperlink="true"><Font style="Text" underline="true" italic="true" foreground="[0,128,128]">Introduction to Cryptography with Maple</Font></Hyperlink><Font italic="true">,</Font> Springer, 2013.

N. Koblitz and A. Menezes, Another look at HMAC, available at <Hyperlink linktarget="http://eprint.iacr.org/2012/074.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">http://eprint.iacr.org/2012/074.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">R. Perlner, SHA3-based MACs (2014) (SHA-3 MACs), available at <Hyperlink linktarget="http://csrc.nist.gov/groups/ST/hash/sha-3/Aug2014/documents/perlner_kmac.pdf" hyperlink="true"><Font style="Text" underline="true" foreground="[0,128,128]">http://csrc.nist.gov/groups/ST/hash/sha-3/Aug2014/documents/perlner_kmac.pdf</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal">G. Van Assche, Keccak Code Package Test Vectors, available at <Hyperlink linktarget="https://github.com/gvanas/KeccakCodePackage/tree/master/TestVectors" hyperlink="true"><Font style="Hyperlink">https://github.com/gvanas/KeccakCodePackage/tree/master/TestVectors</Font></Hyperlink></Text-field>
<Text-field style="Text" layout="Normal"></Text-field>
</Input>
</Group>
</Section>
<Text-field style="Text" layout="Normal"></Text-field>
<Text-field style="Text" layout="Normal"><Font italic="true">Legal Notice: The copyright for this application is owned by the authors. Neither Maplesoft nor the authors are responsible for any errors contained within and are not liable for any damages resulting from the use of this material. This application is intended for non-commercial, non-profit use only. Contact the authors for permission if you wish to use this application in for-profit activities.</Font></Text-field>
</Worksheet>