<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>学习笔记 on 安洛的小窝</title>
        <link>http://blog.anlor.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
        <description>Recent content in 学习笔记 on 安洛的小窝</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Thu, 24 Jul 2025 07:55:02 +0000</lastBuildDate><atom:link href="http://blog.anlor.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Transformer 中的位置编码</title>
        <link>http://blog.anlor.top/post/transformer_pe/</link>
        <pubDate>Thu, 24 Jul 2025 07:55:02 +0000</pubDate>
        
        <guid>http://blog.anlor.top/post/transformer_pe/</guid>
        <description>&lt;img src="http://blog.anlor.top/post/transformer_pe/images/cover.webp" alt="Featured image of post Transformer 中的位置编码" /&gt;&lt;p&gt;封面图为原神 4 周年官方贺图。&lt;/p&gt;
&lt;p&gt;本文旨在讨论Transformer中的几种位置编码，以直观感受其特性。本文对应此 &lt;a class=&#34;link&#34; href=&#34;https://colab.research.google.com/drive/1P0kCGk92M2rRUVBcklPthVqmVzcsqK34?usp=sharing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Jupyter Notebook&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;环境准备&#34;&gt;环境准备
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;numpy&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;首先生成一个模拟的tokens列表，为了突出位置编码的影响，tokens的初值为1。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ones&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[[1. 1.]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [1. 1.]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [1. 1.]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [1. 1.]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;位置编码&#34;&gt;位置编码
&lt;/h2&gt;&lt;h3 id=&#34;整型编码&#34;&gt;整型编码
&lt;/h3&gt;&lt;p&gt;直接使用数组下标标记位置。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;int_pe&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arange&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reshape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;int_pe&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;broadcast_to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;int_pe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;int_pe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[0, 0],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1, 1],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [2, 2],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [3, 3]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;int_pe_embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;int_pe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;int_pe_embed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[1., 1.],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [2., 2.],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [3., 3.],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [4., 4.]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;非常直观的标记方法，缺点是随着tokens长度变长，位置编码会变得非常大&lt;/p&gt;
&lt;h3 id=&#34;01浮点数编码&#34;&gt;[0,1]浮点数编码
&lt;/h3&gt;&lt;p&gt;将数组下标压缩映射到[0,1]范围内以标记位置，避免位置编码过大的问题。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;zeroone_pe&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arange&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reshape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;zeroone_pe&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;broadcast_to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zeroone_pe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;zeroone_pe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[0.  , 0.  ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [0.25, 0.25],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [0.5 , 0.5 ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [0.75, 0.75]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;zeroone_pe_embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;zeroone_pe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;zeroone_pe_embed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[1.  , 1.  ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.25, 1.25],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.5 , 1.5 ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.75, 1.75]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;确实解决了整数编码中位置编码过大的问题。然而，当序列长度不同时，tokens的相对距离会改变。这不是我们想要的。&lt;/p&gt;
&lt;h3 id=&#34;二进制编码&#34;&gt;二进制编码
&lt;/h3&gt;&lt;p&gt;考虑到tokens中是多维向量，比起为一个向量的每个维度都加相同的整数，为不同维度加上不同的位置编码可以容纳更多信息。因此考虑二进制编码，将下标转换为二进制向量作为位置编码。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;binary_vector_array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;length 不能超过 2^dim&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dtype&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 格式化为二进制字符串，前导0补齐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;bin_str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;0&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;b&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bit&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bin_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;binary_PE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;binary_vector_array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;binary_PE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[0, 0],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [0, 1],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1, 0],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1, 1]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;binary_PE_embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;binary_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;binary_PE_embed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[1., 1.],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1., 2.],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [2., 1.],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [2., 2.]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;比起前面几种做法，这种做法更加充分利用了向量的空间。然而，这种方式编码出来的位置向量在空间中是离散的。下面是二进制编码位置向量的绘图，每个向量被绘制为3维空间中的一个点。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;PE_plt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;points&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;plt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ax&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_subplot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;111&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;points&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;points&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;marker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;o&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;yi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;enumerate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;points&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;yi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_xlabel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;X&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ax&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_ylabel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Y&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;plt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;PE_plt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;binary_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Figure size 640x480 with 1 Axes&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD&amp;#43;naQAAI7xJREFUeJzt3X9UVHX&amp;#43;x/EXjDLoSVAP8UOZlrQtLX9QqCyaW7YUW31Nj1txsiPosV&amp;#43;GHpPakvyB2w9x&amp;#43;7XuJuXG2to5m6vl0b5tspiRVBZFoZT585iavxqUbWNYLNCZ&amp;#43;/3DdfqSYEDMXObj83HOnOJyr/c9V&amp;#43;0&amp;#43;u3OZCbMsyxIAAIAhwu0eAAAAoCMRNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwShe7Bwg2n8&amp;#43;nI0eOqEePHgoLC7N7HAAA0AqWZamurk59&amp;#43;vRRePjZr82cc3Fz5MgRuVwuu8cAAADtcPDgQSUmJp51nXMubnr06CHp1MGJioqyeRoAANAaHo9HLpfLfx4/m3Mubk6/FBUVFUXcAAAQYlpzSwk3FAMAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AfDuu&amp;#43;9q7Nix6tOnj8LCwvTaa6/ZPRIAAEH1/PPPa8iQIf6fTk5LS9M///nPoOybuAmA&amp;#43;vp6DR06VIWFhXaPAgCALRITE7Vo0SJVVlbqk08&amp;#43;0TXXXKNx48Zp27ZtAd93mGVZVsD30ol4PB5FR0ertrY2KO9zExYWprVr12r8&amp;#43;PEB3xcAAJ1Z79699eSTT2rq1Klt3rYt5&amp;#43;9z7k38AABAcHm9Xr366quqr69XWlpawPdH3HQUr1d67z3pq6&amp;#43;khARp9GjJ4bB7KgAAgucH58KtPXsq7cor9d133&amp;#43;m8887T2rVrdemllwZ8DFvvuWnPjbdlZWW64oor5HQ6ddFFF2n58uUBn/NHrVkjJSVJY8ZIEyee&amp;#43;mdS0qnlAACcC5o5F17yP/&amp;#43;jqt//Xh999JGmTZum7Oxsbd&amp;#43;&amp;#43;PeCj2Bo3bb3xdt&amp;#43;&amp;#43;fbrxxhs1ZswYVVVV6b777tMdd9yh9evXB3jSs1izRrr5ZunQoabLDx8&amp;#43;tRwAANO1cC6MOHJEF82YoZQvv1RBQYGGDh2qP/7xjwEfx9aXpa6//npdf/31rV5/6dKluvDCC/X0009LkgYOHKhNmzbpD3/4gzIyMgI1Zsu8XmnmTKm5e7ItSzr94V4&amp;#43;X3DnAgAgWFpzLrzvPmncOPl8PjU0NAR8pJC656a8vFzp6elNlmVkZOi&amp;#43;&amp;#43;&amp;#43;5rcZuGhoYmB9Lj8XTcQO&amp;#43;9d&amp;#43;YVG0n/kbRH8v9G7ystVVW/furdu7cuuOCCjts/AAB2a&amp;#43;FcmCfpekkXWJbqDh7UiqwslZWVBeXVlpB6nxu32624uLgmy&amp;#43;Li4uTxePTtt982u01BQYGio6P9D5fL1XEDffVVs4s/kXT5fx&amp;#43;SlPvcc7r88ss1f/78jts3AACdQQvnwqOSsiRdIulXkj7&amp;#43;9FOtX79e1157bcBHCqkrN&amp;#43;2Rl5en3Nxc/9cej6fjAichodnFV0tqcnFu40bp6qs7Zp8AAHQmLZwLl/1wwZIlQTsXhlTcxMfHq7q6usmy6upqRUVFqVu3bs1u43Q65XQ6AzPQ6NFSYuKpm4ebe60xLOzU90ePDsz&amp;#43;AQCwWyc8F4bUy1JpaWkqLS1tsmzDhg1BeUOgZjkc0um7vk/fPHza6a8XL&amp;#43;b9bgAA5uqE50Jb4&amp;#43;Y///mPqqqqVFVVJenUj3pXVVXpwIEDkk69pJSVleVf/5577tHevXv14IMPaufOnXruuef0yiuvaNasWXaMf8qECdLq1VLfvk2XJyaeWj5hgj1zAQAQLJ3sXGjrZ0uVlZVpzJgxZyzPzs7W8uXLNXnyZO3fv19lZWVNtpk1a5a2b9&amp;#43;uxMREzZs3T5MnT271PgP22VK8QzEA4FwXwHNhW87ffHAmAADo9Npy/g6pe24AAAB&amp;#43;DHEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMIrtcVNYWKikpCRFRkYqNTVVFRUVZ11/8eLFuuSSS9StWze5XC7NmjVL3333XZCmBQAAnZ2tcbNq1Srl5uYqPz9fmzdv1tChQ5WRkaGjR482u/6KFSs0e/Zs5efna8eOHVq2bJlWrVqlhx9&amp;#43;OMiTAwCAzirMsizLrp2npqZq&amp;#43;PDhWrJkiSTJ5/PJ5XJpxowZmj179hnrT58&amp;#43;XTt27FBpaal/2f3336&amp;#43;PPvpImzZtanYfDQ0Namho8H/t8XjkcrlUW1urqKioDn5GAAAgEDwej6Kjo1t1/rbtyk1jY6MqKyuVnp7&amp;#43;/TDh4UpPT1d5eXmz24wcOVKVlZX&amp;#43;l6727t2r4uJi3XDDDS3up6CgQNHR0f6Hy&amp;#43;Xq2CcCAAA6lS527bimpkZer1dxcXFNlsfFxWnnzp3NbjNx4kTV1NToyiuvlGVZOnnypO65556zviyVl5en3Nxc/9enr9wAAAAz2X5DcVuUlZVp4cKFeu6557R582atWbNG69at06OPPtriNk6nU1FRUU0eAADAXLZduYmJiZHD4VB1dXWT5dXV1YqPj292m3nz5mnSpEm64447JEmDBw9WfX297rrrLs2ZM0fh4SHVagAAIABsq4GIiAilpKQ0uTnY5/OptLRUaWlpzW5z/PjxMwLG4XBIkmy8LxoAAHQitl25kaTc3FxlZ2dr2LBhGjFihBYvXqz6&amp;#43;npNmTJFkpSVlaW&amp;#43;ffuqoKBAkjR27Fg988wzuvzyy5Wamqo9e/Zo3rx5Gjt2rD9yAADAuc3WuMnMzNSxY8c0f/58ud1uJScnq6SkxH&amp;#43;T8YEDB5pcqZk7d67CwsI0d&amp;#43;5cHT58WOeff77Gjh2rxx9/3K6nAAAAOhlb3&amp;#43;fGDm35OXkAANA5hMT73AAAAAQCcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKLbHTWFhoZKSkhQZGanU1FRVVFScdf1vvvlGOTk5SkhIkNPp1MUXX6zi4uIgTQsAADq7LnbufNWqVcrNzdXSpUuVmpqqxYsXKyMjQ7t27VJsbOwZ6zc2Nuraa69VbGysVq9erb59&amp;#43;&amp;#43;rLL79Uz549gz88AADolMIsy7Ls2nlqaqqGDx&amp;#43;uJUuWSJJ8Pp9cLpdmzJih2bNnn7H&amp;#43;0qVL9eSTT2rnzp3q2rVrq/bR0NCghoYG/9cej0cul0u1tbWKiorqmCcCAAACyuPxKDo6ulXnb9telmpsbFRlZaXS09O/HyY8XOnp6SovL292m9dff11paWnKyclRXFycBg0apIULF8rr9ba4n4KCAkVHR/sfLperw58LAADoPGyLm5qaGnm9XsXFxTVZHhcXJ7fb3ew2e/fu1erVq&amp;#43;X1elVcXKx58&amp;#43;bp6aef1mOPPdbifvLy8lRbW&amp;#43;t/HDx4sEOfBwAA6FxsveemrXw&amp;#43;n2JjY/XCCy/I4XAoJSVFhw8f1pNPPqn8/Pxmt3E6nXI6nUGeFAAA2MW2uImJiZHD4VB1dXWT5dXV1YqPj292m4SEBHXt2lUOh8O/bODAgXK73WpsbFRERERAZwYAAJ2fbS9LRUREKCUlRaWlpf5lPp9PpaWlSktLa3abUaNGac&amp;#43;ePfL5fP5lu3fvVkJCAmEDAAAk2fw&amp;#43;N7m5uSoqKtJLL72kHTt2aNq0aaqvr9eUKVMkSVlZWcrLy/OvP23aNH399deaOXOmdu/erXXr1mnhwoXKycmx6ykAAIBOxtZ7bjIzM3Xs2DHNnz9fbrdbycnJKikp8d9kfODAAYWHf99fLpdL69ev16xZszRkyBD17dtXM2fO1EMPPWTXUwAAAJ2Mre9zY4e2/Jw8AADoHELifW4AAAACgbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARml13Bw5ciSQcwAAAHSIVsfNZZddphUrVgRyFgAAgJ&amp;#43;s1XHz&amp;#43;OOP6&amp;#43;6779Ytt9yir7/&amp;#43;OpAzAQAAtFur4&amp;#43;bee&amp;#43;/VZ599pn/961&amp;#43;69NJL9Y9//COQcwEAALRLl7asfOGFF&amp;#43;rtt9/WkiVLNGHCBA0cOFBdujT9JTZv3tyhAwIAALRFm&amp;#43;JGkr788kutWbNGvXr10rhx486IGwAAADu1qUyKiop0//33Kz09Xdu2bdP5558fqLkAAADapdVx8&amp;#43;tf/1oVFRVasmSJsrKyAjkTAABAu7U6brxerz777DMlJiYGch4AAICfpNVxs2HDhkDOAQAA0CH4&amp;#43;AUAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBROkXcFBYWKikpSZGRkUpNTVVFRUWrtlu5cqXCwsI0fvz4wA4IAABChu1xs2rVKuXm5io/P1&amp;#43;bN2/W0KFDlZGRoaNHj551u/379&amp;#43;uBBx7Q6NGjgzQpAAAIBbbHzTPPPKM777xTU6ZM0aWXXqqlS5eqe/fuevHFF1vcxuv16vbbb9fvfvc79evXL4jTAgCAzs7WuGlsbFRlZaXS09P9y8LDw5Wenq7y8vIWt3vkkUcUGxurqVOn/ug&amp;#43;Ghoa5PF4mjwAAIC5bI2bmpoaeb1excXFNVkeFxcnt9vd7DabNm3SsmXLVFRU1Kp9FBQUKDo62v9wuVw/eW4AANB52f6yVFvU1dVp0qRJKioqUkxMTKu2ycvLU21trf9x8ODBAE8JAADs1MXOncfExMjhcKi6urrJ8urqasXHx5&amp;#43;x/hdffKH9&amp;#43;/dr7Nix/mU&amp;#43;n0&amp;#43;S1KVLF&amp;#43;3atUv9&amp;#43;/dvso3T6ZTT6QzA9AAAoDOy9cpNRESEUlJSVFpa6l/m8/lUWlqqtLS0M9YfMGCAtm7dqqqqKv/jpptu0pgxY1RVVcVLTgAAwN4rN5KUm5ur7OxsDRs2TCNGjNDixYtVX1&amp;#43;vKVOmSJKysrLUt29fFRQUKDIyUoMGDWqyfc&amp;#43;ePSXpjOUAAODcZHvcZGZm6tixY5o/f77cbreSk5NVUlLiv8n4wIEDCg8PqVuDAACAjcIsy7LsHiKYPB6PoqOjVVtbq6ioKLvHAQAArdCW8zeXRAAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABG6RRxU1hYqKSkJEVGRio1NVUVFRUtrltUVKTRo0erV69e6tWrl9LT08&amp;#43;6PgAAOLfYHjerVq1Sbm6u8vPztXnzZg0dOlQZGRk6evRos&amp;#43;uXlZXptttu08aNG1VeXi6Xy6XrrrtOhw8fDvLkAACgMwqzLMuyc4DU1FQNHz5cS5YskST5fD65XC7NmDFDs2fP/tHtvV6vevXqpSVLligrK&amp;#43;tH1/d4PIqOjlZtba2ioqJ&amp;#43;8vwAACDw2nL&amp;#43;tvXKTWNjoyorK5Wenu5fFh4ervT0dJWXl7fq1zh&amp;#43;/LhOnDih3r17N/v9hoYGeTyeJg8AAGAuW&amp;#43;OmpqZGXq9XcXFxTZbHxcXJ7Xa36td46KGH1KdPnyaB9P8VFBQoOjra/3C5XD95bgAA0HnZfs/NT7Fo0SKtXLlSa9euVWRkZLPr5OXlqba21v84ePBgkKcEAADB1MXOncfExMjhcKi6urrJ8urqasXHx59126eeekqLFi3SW2&amp;#43;9pSFDhrS4ntPplNPp7JB5AQBA52frlZuIiAilpKSotLTUv8zn86m0tFRpaWktbvfEE0/o0UcfVUlJiYYNGxaMUQEAQIiw9cqNJOXm5io7O1vDhg3TiBEjtHjxYtXX12vKlCmSpKysLPXt21cFBQWSpN///veaP3&amp;#43;&amp;#43;VqxYoaSkJP&amp;#43;9Oeedd57OO&amp;#43;88254HAADoHGyPm8zMTB07dkzz58&amp;#43;X2&amp;#43;1WcnKySkpK/DcZHzhwQOHh319gev7559XY2Kibb765ya&amp;#43;Tn5&amp;#43;vBQsWBHN0AADQCdn&amp;#43;PjfBxvvcAAAQekLmfW4AAAA6GnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcBVFhYqKSkJEVGRio1NVUVFRV2jwQAQFAUFBRo&amp;#43;PDh6tGjh2JjYzV&amp;#43;/Hjt2rUrKPsmbgJk1apVys3NVX5&amp;#43;vjZv3qyhQ4cqIyNDR48etXs0AAAC7p133lFOTo4&amp;#43;/PBDbdiwQSdOnNB1112n&amp;#43;vr6gO87zLIsK&amp;#43;B76UQ8Ho&amp;#43;io6NVW1urqKiogO0nNTVVw4cP15IlSyRJPp9PLpdLM2bM0OzZswO2XwAAOqNjx44pNjZW77zzjn75y1&amp;#43;2efu2nL&amp;#43;5chMAjY2NqqysVHp6un9ZeHi40tPTVV5ebuNkAADYo7a2VpLUu3fvgO&amp;#43;rS8D3cK7weqX33pO&amp;#43;&amp;#43;ko1XbvK6/UqLi6uySpxcXHauXOnTQMCABBg/&amp;#43;9cqIQEafRoyeGQz&amp;#43;fTfffdp1GjRmnQoEEBH6NTXLlp6423r776qgYMGKDIyEgNHjxYxcXFQZq0BWvWSElJ0pgx0sSJ0i23nFpeVmbnVAAABM8Pz4Vjxpz6es0a5eTk6PPPP9fKlSuDMortcdPWG28/&amp;#43;OAD3XbbbZo6daq2bNmi8ePHa/z48fr888&amp;#43;DPPl/rVkj3XyzdOiQf1GMJIek6ocfPvX9/6qurlZ8fHzwZwQAIJCaORdKkg4f1vTf/EZvvPqqNm7cqMTExKCMY/sNxW298TYzM1P19fV64403/Mt&amp;#43;8YtfKDk5WUuXLv3R/XXoDcVe76kq/eFvpqRUSSMkPetySfv2yRcWpgsuuEDTp0/nhmIAgDlaOBdakmZIWiupLD5ePz90SHI42r2bkLmhuD033paXlzdZX5IyMjJaXL&amp;#43;hoUEej6fJo8O8916zYSNJuZKKJL108KB2/O1vmjZtmurr6zVlypSO2z8AAHZr4VyYI&amp;#43;lvklZI6uF2y/2//yu3261vv/024CPZGjc1NTUt3njrdrub3cbtdrdp/YKCAkVHR/sfLperY4aXTt0w1YJMSU9Jmi8p&amp;#43;Y47VFVVpZKSkjNmBwAgpLVwLnxeUq2kqyUlSEr4zW&amp;#43;UkJCgVatWBXwk439aKi8vT7m5uf6vPR5PxwVOQsJZvz39vw9t2CBdfXXH7BMAgM6khXPhGfe8bNwYtHOhrXETExMjh8Oh6urqJsvPduNtfHx8m9Z3Op1yOp0dM/APjR4tJSZKhw9Lzd26FBZ26vujRwdm/wAA2K0TngttfVkqIiJCKSkpKi0t9S/z&amp;#43;XwqLS1VWlpas9ukpaU1WV&amp;#43;SNmzY0OL6AeVwSH/846l/Dwtr&amp;#43;r3TXy9e/JNuoAIAoFPrhOdC238UPDc3V0VFRXrppZe0Y8eOM268zcrKUl5enn/9mTNnqqSkRE8//bR27typBQsW6JNPPtH06dPteQITJkirV0t9&amp;#43;zZdnph4avmECfbMBQBAsHSyc6Ht99xkZmbq2LFjmj9/vtxut5KTk5vceHvgwAGFh3/fYCNHjtSKFSs0d&amp;#43;5cPfzww/r5z3&amp;#43;u1157LSjveNiiCROkceOafVdGAADOCZ3oXGj7&amp;#43;9wEW7A&amp;#43;OBMAAHSckHmfGwAAgI5G3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMYvvHLwTb6Tdk9ng8Nk8CAABa6/R5uzUfrHDOxU1dXZ0kyeVy2TwJAABoq7q6OkVHR591nXPus6V8Pp&amp;#43;OHDmiHj16KOyHH83&amp;#43;E3k8HrlcLh08eJDPrQogjnNwcJyDg&amp;#43;McPBzr4AjUcbYsS3V1derTp0&amp;#43;TD9Ruzjl35SY8PFyJiYkB3UdUVBR/cYKA4xwcHOfg4DgHD8c6OAJxnH/sis1p3FAMAACMQtwAAACjEDcdyOl0Kj8/X06n0&amp;#43;5RjMZxDg6Oc3BwnIOHYx0cneE4n3M3FAMAALNx5QYAABiFuAEAAEYhbgAAgFGIGwAAYBTipo0KCwuVlJSkyMhIpaamqqKi4qzrv/rqqxowYIAiIyM1ePBgFRcXB2nS0NaW41xUVKTRo0erV69e6tWrl9LT03/09wWntPXP82krV65UWFiYxo8fH9gBDdHW4/zNN98oJydHCQkJcjqduvjii/lvRyu09TgvXrxYl1xyibp16yaXy6VZs2bpu&amp;#43;&amp;#43;&amp;#43;C9K0oendd9/V2LFj1adPH4WFhem111770W3Kysp0xRVXyOl06qKLLtLy5csDPqcstNrKlSutiIgI68UXX7S2bdtm3XnnnVbPnj2t6urqZtd///33LYfDYT3xxBPW9u3brblz51pdu3a1tm7dGuTJQ0tbj/PEiROtwsJCa8uWLdaOHTusyZMnW9HR0dahQ4eCPHloaetxPm3fvn1W3759rdGjR1vjxo0LzrAhrK3HuaGhwRo2bJh1ww03WJs2bbL27dtnlZWVWVVVVUGePLS09Ti//PLLltPptF5&amp;#43;&amp;#43;WVr37591vr1662EhARr1qxZQZ48tBQXF1tz5syx1qxZY0my1q5de9b19&amp;#43;7da3Xv3t3Kzc21tm/fbj377LOWw&amp;#43;GwSkpKAjoncdMGI0aMsHJycvxfe71eq0&amp;#43;fPlZBQUGz6996663WjTfe2GRZamqqdffddwd0zlDX1uP8QydPnrR69OhhvfTSS4Ea0QjtOc4nT560Ro4caf3lL3&amp;#43;xsrOziZtWaOtxfv75561&amp;#43;/fpZjY2NwRrRCG09zjk5OdY111zTZFlubq41atSogM5pktbEzYMPPmhddtllTZZlZmZaGRkZAZzMsnhZqpUaGxtVWVmp9PR0/7Lw8HClp6ervLy82W3Ky8ubrC9JGRkZLa6P9h3nHzp&amp;#43;/LhOnDih3r17B2rMkNfe4/zII48oNjZWU6dODcaYIa89x/n1119XWlqacnJyFBcXp0GDBmnhwoXyer3BGjvktOc4jxw5UpWVlf6Xrvbu3avi4mLdcMMNQZn5XGHXefCc&amp;#43;&amp;#43;DM9qqpqZHX61VcXFyT5XFxcdq5c2ez27jd7mbXd7vdAZsz1LXnOP/QQw89pD59&amp;#43;pzxFwrfa89x3rRpk5YtW6aqqqogTGiG9hznvXv36u2339btt9&amp;#43;u4uJi7dmzR/fee69OnDih/Pz8YIwdctpznCdOnKiamhpdeeWVsixLJ0&amp;#43;e1D333KOHH344GCOfM1o6D3o8Hn377bfq1q1bQPbLlRsYZdGiRVq5cqXWrl2ryMhIu8cxRl1dnSZNmqSioiLFxMTYPY7RfD6fYmNj9cILLyglJUWZmZmaM2eOli5davdoRikrK9PChQv13HPPafPmzVqzZo3WrVunRx991O7R0AG4ctNKMTExcjgcqq6ubrK8urpa8fHxzW4THx/fpvXRvuN82lNPPaVFixbprbfe0pAhQwI5Zshr63H&amp;#43;4osvtH//fo0dO9a/zOfzSZK6dOmiXbt2qX///oEdOgS1589zQkKCunbtKofD4V82cOBAud1uNTY2KiIiIqAzh6L2HOd58&amp;#43;Zp0qRJuuOOOyRJgwcPVn19ve666y7NmTNH4eH8v39HaOk8GBUVFbCrNhJXblotIiJCKSkpKi0t9S/z&amp;#43;XwqLS1VWlpas9ukpaU1WV&amp;#43;SNmzY0OL6aN9xlqQnnnhCjz76qEpKSjRs2LBgjBrS2nqcBwwYoK1bt6qqqsr/uOmmmzRmzBhVVVXJ5XIFc/yQ0Z4/z6NGjdKePXv88ShJu3fvVkJCAmHTgvYc5&amp;#43;PHj58RMKeD0uIjFzuMbefBgN6ubJiVK1daTqfTWr58ubV9&amp;#43;3brrrvusnr27Gm53W7Lsixr0qRJ1uzZs/3rv//&amp;#43;&amp;#43;1aXLl2sp556ytqxY4eVn5/Pj4K3QluP86JFi6yIiAhr9erV1ldffeV/1NXV2fUUQkJbj/MP8dNSrdPW43zgwAGrR48e1vTp061du3ZZb7zxhhUbG2s99thjdj2FkNDW45yfn2/16NHD&amp;#43;vvf/27t3bvXevPNN63&amp;#43;/ftbt956q11PISTU1dVZW7ZssbZs2WJJsp555hlry5Yt1pdffmlZlmXNnj3bmjRpkn/90z8K/tvf/tbasWOHVVhYyI&amp;#43;Cd0bPPvusdcEFF1gRERHWiBEjrA8//ND/vauuusrKzs5usv4rr7xiXXzxxVZERIR12WWXWevWrQvyxKGpLcf5Zz/7mSXpjEd&amp;#43;fn7wBw8xbf3z/P8RN63X1uP8wQcfWKmpqZbT6bT69etnPf7449bJkyeDPHXoactxPnHihLVgwQKrf//&amp;#43;VmRkpOVyuax7773X&amp;#43;ve//x38wUPIxo0bm/3v7eljm52dbV111VVnbJOcnGxFRERY/fr1s/76178GfM4wy&amp;#43;L6GwAAMAf33AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAQprX69XIkSM1YcKEJstra2vlcrk0Z84cmyYDYBc&amp;#43;fgFAyNu9e7eSk5NVVFSk22&amp;#43;/XZKUlZWlTz/9VB9//DGfpg2cY4gbAEb405/&amp;#43;pAULFmjbtm2qqKjQLbfcoo8//lhDhw61ezQAQUbcADCCZVm65ppr5HA4tHXrVs2YMUNz5861eywANiBuABhj586dGjhwoAYPHqzNmzerS5cudo8EwAbcUAzAGC&amp;#43;&amp;#43;&amp;#43;KK6d&amp;#43;&amp;#43;uffv26dChQ3aPA8AmXLkBYIQPPvhAV111ld5880099thjkqS33npLYWFhNk8GINi4cgMg5B0/flyTJ0/WtGnTNGbMGC1btkwVFRVaunSp3aMBsAFXbgCEvJkzZ6q4uFiffvqpunfvLkn685//rAceeEBbt25VUlKSvQMCCCriBkBIe&amp;#43;edd/SrX/1KZWVluvLKK5t8LyMjQydPnuTlKeAcQ9wAAACjcM8NAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAo/wfLGgSvx9pmpcAAAAASUVORK5CYII=&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Output Image&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;可以看到，位置1和位置2明明是相邻位置，其位置向量距离却很远。这对于模型学习相邻位置的关系是不利的。而且将这些点按顺序连接起来，不是一个连续可微的函数，这使得它很难泛化，例如很难处理浮点数位置。&lt;/p&gt;
&lt;h3 id=&#34;sin-编码&#34;&gt;sin 编码
&lt;/h3&gt;&lt;p&gt;从二进制编码位置向量离散的问题，想到采用高维空间上的连续函数作为编码。其中一种思路是使用 $\sin$ 编码。第 $t$ 个 token 的 $\sin$ 编码形式：
$$
PE_t=[\sin(\frac{t}{2^0}),\sin(\frac{t}{2^1}),&amp;hellip;,\sin(\frac{t}{2^i}),&amp;hellip;,\sin(\frac{t}{2^{dim-1}})]
$$
其中 $t$ 表示这是第 $t$ 个 token。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;math&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sin_PE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sin_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sin_PE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[0.        , 0.        ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [0.84147098, 0.47942554],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [0.90929743, 0.84147098],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [0.14112001, 0.99749499]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以看到，在 $\sin$ 编码中，越低维度的向量变化越剧烈，越高维度的向量变化越平缓。这和二进制编码正好相反，但是思路其实是一样的，和前面整型编码中所有维度向量以相同速度变化形成对比。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sin_PE_embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sin_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sin_PE_embed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[1.        , 1.        ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.84147098, 1.47942554],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.90929743, 1.84147098],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.14112001, 1.99749499]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;下面是 $\sin$ 编码的绘图&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;PE_plt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Figure size 640x480 with 1 Axes&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD&amp;#43;naQAAI/xJREFUeJzt3X9UVHX&amp;#43;x/HXMMqQJyH9Ej&amp;#43;EaSl3&amp;#43;&amp;#43;nP9QeLxZbtFLv1NV22YtMj5umnocekziZp0PZD3H4d2pWyyE6ds7laHuzbposZRWlRFEZZqR3TEstB2TbGxQKdud8/WKdF0Rhk5sKH5&amp;#43;OcOSc&amp;#43;3Ou86WY8z507dxyWZVkCAAAwRJTdAwAAAHQn4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARuln9wCRFggE9PXXX2vgwIFyOBx2jwMAADrBsizt379fQ4YMUVTU8c/N9Lm4&amp;#43;frrr&amp;#43;V2u&amp;#43;0eAwAAdEF9fb1SU1OPu02fi5uBAwdKavuXExsba/M0AACgM3w&amp;#43;n9xud/D3&amp;#43;PH0ubg5/FJUbGwscQMAQC/TmUtKuKAYAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuEHEPP744xoxYkTwnWoZGRn6xz/&amp;#43;YfdYAADDEDeImNTUVC1evFi1tbV6//33dfHFF2vy5Mn65JNP7B4NAGAQh2VZlt1DRJLP51NcXJyampq4z00PMHjwYD344IO67rrr7B4FANCDhfL7u8/dxA89g9/v1wsvvKDm5mZlZGTYPQ4AwCC2viz15ptvatKkSRoyZIgcDodefPHFH92nqqpKP//5z&amp;#43;VyufTTn/5UzzzzTNjnxAnw&amp;#43;6WqKulvf5OqqrS5rk4nn3yyXC6Xbr75Zq1evVrnnnuu3VMCAAxia9w0Nzdr5MiRKi0t7dT2O3fu1OWXX66JEyeqrq5Ot956q66//nqtW7cuzJOiS8rLpbQ0aeJEaepUaeJEnfW//6u6P/1J7777rmbNmqUZM2bo008/tXtSAIBBesw1Nw6HQ6tXr9aUKVOOuc0dd9yhNWvW6OOPPw6u/f73v9e3336rioqKTj0P19xESHm5dOWV0pH/eR3&amp;#43;TJBVq6TsbHk8Hg0dOlRPPPFE5GcEAPQaofz&amp;#43;7lXvlqqurpbH42m3lpWVperq6mPu09LSIp/P1&amp;#43;6BMPP7pblzjw4b6Ye1W2&amp;#43;V/H4FAgG1tLREdDwAgNl6Vdx4vV4lJia2W0tMTJTP59N3333X4T7FxcWKi4sLPtxudyRG7ds2bJB27z5quUDSm5K&amp;#43;sCxtrq9XQW6uqqqqNG3atIiPCAAwV6&amp;#43;Km64oKChQU1NT8FFfX2/3SObbs6fD5b2SciWdJelXkt778EOtW7dOl1xySQSHAwCYrle9FTwpKUkNDQ3t1hoaGhQbG6uTTjqpw31cLpdcLlckxsNhyckdLi87cmHJEumii8I9DQCgj&amp;#43;lVZ24yMjJUWVnZbm39&amp;#43;vXcJ6WnycyUUlN/uHj4SA6H5Ha3bQcAQDezNW7&amp;#43;/e9/q66uTnV1dZLa3updV1enXbt2SWp7SSk3Nze4/c0336wdO3boD3/4g7Zu3arHHntMzz//vObNm2fH&amp;#43;DgWp1N69NG2fz4ycA5/XVLSth0AAN3M1rh5//33NXr0aI0ePVqSlJ&amp;#43;fr9GjR6uwsFCStGfPnmDoSNLpp5&amp;#43;uNWvWaP369Ro5cqQefvhhPfXUU8rKyrJlfhxHdnbb271TUtqvp6YG3wYOAEA49Jj73EQK97mJML&amp;#43;/7d1Te/a0XYuTmckZGwBAyPhsKfQcTicXDQMAIqpXXVAMAADwY4gbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAABAtysuLta4ceM0cOBAJSQkaMqUKdq2bVtEnpu4AQAA3e6NN95QXl6e3nnnHa1fv14HDx7UpZdequbm5rA/t8OyLCvsz9KD&amp;#43;Hw&amp;#43;xcXFqampSbGxsXaPAwBAn7Bv3z4lJCTojTfe0C9/&amp;#43;cuQ9w/l9zdnbgAAQNg1NTVJkgYPHhz25&amp;#43;oX9mcAAAB9g98vbdgg7dkjJSdLmZmS06lAIKBbb71V559/voYNGxb2MYgbAABw4srLpblzpd27f1hLTZUefVR569fr448/1saNGyMyCnEDAABOTHm5dOWV0pGX8X71lWb/7nd6&amp;#43;X/&amp;#43;R2&amp;#43;&amp;#43;955SU1MjMg5xAwAAus7vbztjc0TYWJLmWJZWS6rq31&amp;#43;nn3ZaxEbigmIAANB1Gza0fynqP/Ik/VXSckkDvV55/&amp;#43;//5PV69d1334V9JOIGAAB03Z49HS4/LqlJ0kWSkiUl/&amp;#43;53Sk5O1sqVK8M&amp;#43;Ei9LAQCArktO7nD5qJvovf66dNFF4Z5GEmduAADAicjMbHtXlMPR8fcdDsntbtsuQogbAADQdU6n9Oijbf98ZOAc/rqkpG27CCFuAADAicnOllatklJS2q&amp;#43;npratZ2dHdByuuQEAACcuO1uaPLnDOxRHGnEDAAC6h9MZsYuGj4eXpQAAgFGIGwAAYBTiBgAAGIW4AQAARrE9bkpLS5WWlqaYmBilp6erpqbmuNuXlJTorLPO0kknnSS326158&amp;#43;bp&amp;#43;&amp;#43;&amp;#43;/j9C0AACgp7M1blauXKn8/HwVFRVp06ZNGjlypLKysrR3794Ot1&amp;#43;&amp;#43;fLnmz5&amp;#43;voqIibdmyRcuWLdPKlSt15513RnhyAADQUzksyzrq4x8iJT09XePGjdOSJUskSYFAQG63W3PmzNH8&amp;#43;fOP2n727NnasmWLKisrg2u33Xab3n33XW3cuLHD52hpaVFLS0vwa5/PJ7fbraamJsXGxnbzTwQAAMLB5/MpLi6uU7&amp;#43;/bTtz09raqtraWnk8nh&amp;#43;GiYqSx&amp;#43;NRdXV1h/tMmDBBtbW1wZeuduzYobVr1&amp;#43;qyyy475vMUFxcrLi4u&amp;#43;HC73d37gwAAgB7Ftpv4NTY2yu/3KzExsd16YmKitm7d2uE&amp;#43;U6dOVWNjoy644AJZlqVDhw7p5ptvPu7LUgUFBcrPzw9&amp;#43;ffjMDQAAMJPtFxSHoqqqSosWLdJjjz2mTZs2qby8XGvWrNG99957zH1cLpdiY2PbPQAAgLlsO3MTHx8vp9OphoaGdusNDQ1KSkrqcJ&amp;#43;77rpL06dP1/XXXy9JGj58uJqbm3XjjTdqwYIFiorqVa0GAADCwLYaiI6O1pgxY9pdHBwIBFRZWamMjIwO9zlw4MBRAeP8zwdy2XhdNAAA6EFs/eDM/Px8zZgxQ2PHjtX48eNVUlKi5uZmzZw5U5KUm5urlJQUFRcXS5ImTZqkRx55RKNHj1Z6erq2b9&amp;#43;uu&amp;#43;66S5MmTQpGDgAA6NtsjZucnBzt27dPhYWF8nq9GjVqlCoqKoIXGe/atavdmZqFCxfK4XBo4cKF&amp;#43;uqrr3Tqqadq0qRJuv/&amp;#43;&amp;#43;&amp;#43;36EQAAQA9j631u7BDK&amp;#43;&amp;#43;QBAEDP0CvucwMAABAOxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAo9geN6WlpUpLS1NMTIzS09NVU1Nz3O2//fZb5eXlKTk5WS6XS2eeeabWrl0boWkBAEBP18/OJ1&amp;#43;5cqXy8/O1dOlSpaenq6SkRFlZWdq2bZsSEhKO2r61tVWXXHKJEhIStGrVKqWkpOjLL7/UKaecEvnhAQBAj&amp;#43;SwLMuy68nT09M1btw4LVmyRJIUCATkdrs1Z84czZ8//6jtly5dqgcffFBbt25V//79u/ScPp9PcXFxampqUmxs7AnNDwAAIiOU39&amp;#43;2vSzV2tqq2tpaeTyeH4aJipLH41F1dXWH&amp;#43;7z00kvKyMhQXl6eEhMTNWzYMC1atEh&amp;#43;v/&amp;#43;Yz9PS0iKfz9fuAQAAzGVb3DQ2Nsrv9ysxMbHdemJiorxeb4f77NixQ6tWrZLf79fatWt111136eGHH9Z99913zOcpLi5WXFxc8OF2u7v15wAAAD2L7RcUhyIQCCghIUFPPvmkxowZo5ycHC1YsEBLly495j4FBQVqamoKPurr6yM4MQAAiDTbLiiOj4&amp;#43;X0&amp;#43;lUQ0NDu/WGhgYlJSV1uE9ycrL69&amp;#43;8vp9MZXDvnnHPk9XrV2tqq6Ojoo/ZxuVxyuVzdOzwAAOixbDtzEx0drTFjxqiysjK4FggEVFlZqYyMjA73Of/887V9&amp;#43;3YFAoHg2meffabk5OQOwwYAAPQ9tr4slZ&amp;#43;fr7KyMj377LPasmWLZs2apebmZs2cOVOSlJubq4KCguD2s2bN0jfffKO5c&amp;#43;fqs88&amp;#43;05o1a7Ro0SLl5eXZ9SMAAIAextb73OTk5Gjfvn0qLCyU1&amp;#43;vVqFGjVFFREbzIeNeuXYqK&amp;#43;qG/3G631q1bp3nz5mnEiBFKSUnR3Llzdccdd9j1IwAAgB7G1vvc2IH73AAA0Pv0ivvcAAAAhANxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKN0Om6&amp;#43;/vrrcM4BAADQLTodN&amp;#43;edd56WL18ezlkAAEA3ePPNNzVp0iQNGTJEDodDL774ot0jRVSn4&amp;#43;b&amp;#43;&amp;#43;&amp;#43;/XTTfdpKuuukrffPNNOGcCAAAnoLm5WSNHjlRpaando9ii03Fzyy236KOPPtI///lPnXvuufr73/8ezrkAAEAX/eY3v9F9992n3/72t3aPYot&amp;#43;oWx8&amp;#43;umn67XXXtOSJUuUnZ2tc845R/36tf8jNm3a1K0DAgAAhCKkuJGkL7/8UuXl5Ro0aJAmT558VNwAAIAI8/ulDRukPXuk5GQpM1NyOu2eyjYhlUlZWZluu&amp;#43;02eTweffLJJzr11FPDNRcAAOiM8nJp7lxp9&amp;#43;4f1lJTpUcflbKz7ZvLRp2Om1//&amp;#43;teqqanRkiVLlJubG86ZAABAZ5SXS1deKVlW&amp;#43;/WvvmpbX7XKnrls1um48fv9&amp;#43;uijj5SamhrOeQAAQGf4/W1nbI4MG6ltzeGQbr014mP1BJ2Om/Xr14dzDgAAEIoNG9q/FPVf/i1pu2VJ9fWSpJ07d6qurk6DBw/WaaedFsEh7cHHLwAA0Bvt2XPMb70vafR/HpKUn5&amp;#43;v0aNHq7CwMBKT2Y63OgEA0BslJx/zWxdJCr5Y9frr0kUXhX&amp;#43;eHoQzNwAA9EaZmW3vinI4Ov6&amp;#43;wyG53W3b9THEDQAAvZHT2fZ2b&amp;#43;nowDn8dUlJn7zfDXEDAEBvlZ3d9nbvlJT266mpbevc5wYAAPQ62dnS5Mncofi/EDcAAPR2Tmefu2j4eHhZCgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEYhbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYpUfETWlpqdLS0hQTE6P09HTV1NR0ar8VK1bI4XBoypQp4R0QAAD0GrbHzcqVK5Wfn6&amp;#43;ioiJt2rRJI0eOVFZWlvbu3Xvc/b744gvdfvvtyszMjNCkAACgN7A9bh555BHdcMMNmjlzps4991wtXbpUAwYM0NNPP33Mffx&amp;#43;v6ZNm6Y//vGPOuOMM47757e0tMjn87V7AAAAc9kaN62traqtrZXH4wmuRUVFyePxqLq6&amp;#43;pj73XPPPUpISNB11133o89RXFysuLi44MPtdnfL7AAAoGeyNW4aGxvl9/uVmJjYbj0xMVFer7fDfTZu3Khly5aprKysU89RUFCgpqam4KO&amp;#43;vv6E5wYAAD1XP7sHCMX&amp;#43;/fs1ffp0lZWVKT4&amp;#43;vlP7uFwuuVyuME8GAAB6ClvjJj4&amp;#43;Xk6nUw0NDe3WGxoalJSUdNT2n3/&amp;#43;ub744gtNmjQpuBYIBCRJ/fr107Zt2zR06NDwDg0AAHo0W1&amp;#43;Wio6O1pgxY1RZWRlcCwQCqqysVEZGxlHbn3322dq8ebPq6uqCjyuuuEITJ05UXV0d19MAAAD7X5bKz8/XjBkzNHbsWI0fP14lJSVqbm7WzJkzJUm5ublKSUlRcXGxYmJiNGzYsHb7n3LKKZJ01DoAAOibbI&amp;#43;bnJwc7du3T4WFhfJ6vRo1apQqKiqCFxnv2rVLUVG2v2MdAAD0Eg7Lsiy7h4gkn8&amp;#43;nuLg4NTU1KTY21u5xAABAJ4Ty&amp;#43;5tTIgAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACj9Ii4KS0tVVpammJiYpSenq6amppjbltWVqbMzEwNGjRIgwYNksfjOe72AACgb7E9blauXKn8/HwVFRVp06ZNGjlypLKysrR3794Ot6&amp;#43;qqtI111yj119/XdXV1XK73br00kv11VdfRXhyAADQEzksy7LsHCA9PV3jxo3TkiVLJEmBQEBut1tz5szR/Pnzf3R/v9&amp;#43;vQYMGacmSJcrNzf3R7X0&amp;#43;n&amp;#43;Li4tTU1KTY2NgTnh8AAIRfKL&amp;#43;/bT1z09raqtraWnk8nuBaVFSUPB6PqqurO/VnHDhwQAcPHtTgwYM7/H5LS4t8Pl&amp;#43;7BwAAMJetcdPY2Ci/36/ExMR264mJifJ6vZ36M&amp;#43;644w4NGTKkXSD9t&amp;#43;LiYsXFxQUfbrf7hOcGAAA9l&amp;#43;3X3JyIxYsXa8WKFVq9erViYmI63KagoEBNTU3BR319fYSnBAAAkdTPziePj4&amp;#43;X0&amp;#43;lUQ0NDu/WGhgYlJSUdd9&amp;#43;HHnpIixcv1quvvqoRI0YcczuXyyWXy9Ut8wIAgJ7P1jM30dHRGjNmjCorK4NrgUBAlZWVysjIOOZ&amp;#43;DzzwgO69915VVFRo7NixkRgVAAD0EraeuZGk/Px8zZgxQ2PHjtX48eNVUlKi5uZmzZw5U5KUm5urlJQUFRcXS5L&amp;#43;9Kc/qbCwUMuXL1daWlrw2pyTTz5ZJ598sm0/BwAA6Blsj5ucnBzt27dPhYWF8nq9GjVqlCoqKoIXGe/atUtRUT&amp;#43;cYHr88cfV2tqqK6&amp;#43;8st2fU1RUpLvvvjuSowMAgB7I9vvcRBr3uQEAoPfpNfe5AQAA6G7EDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA0AADAKcQMAAIxC3AAAAKMQNwAAwCjEDQAAMApxAwAAjELchFFpaanS0tIUExOj9PR01dTU2D0SAADGI27CZOXKlcrPz1dRUZE2bdqkkSNHKisrS3v37rV7NAAAjEbchMkjjzyiG264QTNnztS5556rpUuXasCAAXr66aftHg0AAKMRN2HQ2tqq2tpaeTye4FpUVJQ8Ho&amp;#43;qq6ttnAwAAPP1s3sAY/j90oYN0p49auzfX36/X4mJie02SUxM1NatW20aEACAvqFHnLkJ9cLbF154QWeffbZiYmI0fPhwrV27NkKTHkN5uZSWJk2cKE2dKl11Vdt6VZWdUwEA0CfZHjehXnj79ttv65prrtF1112nDz74QFOmTNGUKVP08ccfR3jy/ygvl668Utq9O7gUL8kpqeHOO9u&amp;#43;/x8NDQ1KSkqK/IwAAPQhDsuyLDsHSE9P17hx47RkyRJJUiAQkNvt1pw5czR//vyjts/JyVFzc7Nefvnl4NovfvELjRo1SkuXLv3R5/P5fIqLi1NTU5NiY2NPbHi/v&amp;#43;2MzX&amp;#43;FzWHpksZL&amp;#43;ovbLe3cqYDDodNOO02zZ8/u8OcCAADHFsrvb1vP3HTlwtvq6up220tSVlbWMbdvaWmRz&amp;#43;dr9&amp;#43;g2GzZ0GDaSlC&amp;#43;pTNKz9fXa8te/atasWWpubtbMmTO77/kBAMBRbI2bxsbGY1546/V6O9zH6/WGtH1xcbHi4uKCD7fb3T3DS9KePcf8Vo6khyQVShp1/fWqq6tTRUXFUbMDAIDuZfs1N&amp;#43;FWUFCgpqam4KO&amp;#43;vr77/vDk5ON&amp;#43;e7akLyW1rF&amp;#43;vd999V&amp;#43;np6d333AAAoEO2vhU8Pj5eTqdTDQ0N7daPd&amp;#43;FtUlJSSNu7XC65XK7uGfhImZlSaqr01VdSR5cuORxt38/MDM/zAwCAo9h65iY6OlpjxoxRZWVlcC0QCKiyslIZGRkd7pORkdFue0lav379MbcPK6dTevTRtn92ONp/7/DXJSVt2wEAgIiw/WWp/Px8lZWV6dlnn9WWLVuOuvA2NzdXBQUFwe3nzp2riooKPfzww9q6davuvvtuvf/&amp;#43;&amp;#43;5o9e7Y9P0B2trRqlZSS0n49NbVtPTvbnrkAAOijbL9DcU5Ojvbt26fCwkJ5vV6NGjWq3YW3u3btUlTUDw02YcIELV&amp;#43;&amp;#43;XAsXLtSdd96pn/3sZ3rxxRc1bNgwu36EtoCZPDl4h2IlJ7e9FMUZGwAAIs72&amp;#43;9xEWrfe5wYAAEREr7nPDQAAQHcjbgAAgFGIGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGsf3jFyLt8A2ZfT6fzZMAAIDOOvx7uzMfrNDn4mb//v2SJLfbbfMkAAAgVPv371dcXNxxt&amp;#43;lzny0VCAT09ddfa&amp;#43;DAgXI4HN36Z/t8PrndbtXX1/O5VTbjWPQcHIueg2PRs3A8QmNZlvbv368hQ4a0&amp;#43;0DtjvS5MzdRUVFKTU0N63PExsbyH2oPwbHoOTgWPQfHomfheHTej52xOYwLigEAgFGIGwAAYBTiphu5XC4VFRXJ5XLZPUqfx7HoOTgWPQfHomfheIRPn7ugGAAAmI0zNwAAwCjEDQAAMApxAwAAjELcAAAAoxA3ISotLVVaWppiYmKUnp6umpqa427/wgsv6Oyzz1ZMTIyGDx&amp;#43;utWvXRmhS84VyLMrKypSZmalBgwZp0KBB8ng8P3rs0Hmh/r04bMWKFXI4HJoyZUp4B&amp;#43;xDQj0W3377rfLy8pScnCyXy6UzzzyT/091k1CPRUlJic466yyddNJJcrvdmjdvnr7//vsITWsYC522YsUKKzo62nr66aetTz75xLrhhhusU045xWpoaOhw&amp;#43;7feestyOp3WAw88YH366afWwoULrf79&amp;#43;1ubN2&amp;#43;O8OTmCfVYTJ061SotLbU&amp;#43;&amp;#43;OADa8uWLda1115rxcXFWbt3747w5OYJ9VgctnPnTislJcXKzMy0Jk&amp;#43;eHJlhDRfqsWhpabHGjh1rXXbZZdbGjRutnTt3WlVVVVZdXV2EJzdPqMfiueees1wul/Xcc89ZO3futNatW2clJydb8&amp;#43;bNi/DkZiBuQjB&amp;#43;/HgrLy8v&amp;#43;LXf77eGDBliFRcXd7j91VdfbV1&amp;#43;&amp;#43;eXt1tLT062bbroprHP2BaEeiyMdOnTIGjhwoPXss8&amp;#43;Ga8Q&amp;#43;oyvH4tChQ9aECROsp556ypoxYwZx001CPRaPP/64dcYZZ1itra2RGrHPCPVY5OXlWRdffHG7tfz8fOv8888P65ym4mWpTmptbVVtba08Hk9wLSoqSh6PR9XV1R3uU11d3W57ScrKyjrm9uicrhyLIx04cEAHDx7U4MGDwzVmn9DVY3HPPfcoISFB1113XSTG7BO6cixeeuklZWRkKC8vT4mJiRo2bJgWLVokv98fqbGN1JVjMWHCBNXW1gZfutqxY4fWrl2ryy67LCIzm6bPfXBmVzU2Nsrv9ysxMbHdemJiorZu3drhPl6vt8PtvV5v2ObsC7pyLI50xx13aMiQIUfFJ0LTlWOxceNGLVu2THV1dRGYsO/oyrHYsWOHXnvtNU2bNk1r167V9u3bdcstt&amp;#43;jgwYMqKiqKxNhG6sqxmDp1qhobG3XBBRfIsiwdOnRIN998s&amp;#43;68885IjGwcztygz1m8eLFWrFih1atXKyYmxu5x&amp;#43;pT9&amp;#43;/dr&amp;#43;vTpKisrU3x8vN3j9HmBQEAJCQl68sknNWbMGOXk5GjBggVaunSp3aP1OVVVVVq0aJEee&amp;#43;wxbdq0SeXl5VqzZo3uvfdeu0frlThz00nx8fFyOp1qaGhot97Q0KCkpKQO90lKSgppe3ROV47FYQ899JAWL16sV199VSNGjAjnmH1CqMfi888/1xdffKFJkyYF1wKBgCSpX79&amp;#43;2rZtm4YOHRreoQ3Vlb8XycnJ6t&amp;#43;/v5xOZ3DtnHPOkdfrVWtrq6Kjo8M6s6m6cizuuusuTZ8&amp;#43;Xddff70kafjw4WpubtaNN96oBQsWKCqKcxGh4N9WJ0VHR2vMmDGqrKwMrgUCAVVWViojI6PDfTIyMtptL0nr168/5vbonK4cC0l64IEHdO&amp;#43;996qiokJjx46NxKjGC/VYnH322dq8ebPq6uqCjyuuuEITJ05UXV2d3G53JMc3Slf&amp;#43;Xpx//vnavn17MDAl6bPPPlNycjJhcwK6ciwOHDhwVMAcjk6Lj4AMnd1XNPcmK1assFwul/XMM89Yn376qXXjjTdap5xyiuX1ei3Lsqzp06db8&amp;#43;fPD27/1ltvWf369bMeeugha8uWLVZRURFvBe8moR6LxYsXW9HR0daqVausPXv2BB/79&amp;#43;&amp;#43;360cwRqjH4ki8W6r7hHosdu3aZQ0cONCaPXu2tW3bNuvll1&amp;#43;2EhISrPvuu8&amp;#43;uH8EYoR6LoqIia&amp;#43;DAgdbf/vY3a8eOHdYrr7xiDR061Lr66qvt&amp;#43;hF6NeImRH/5y1&amp;#43;s0047zYqOjrbGjx9vvfPOO8HvXXjhhdaMGTPabf/8889bZ555phUdHW2dd9551po1ayI8sblCORY/&amp;#43;clPLElHPYqKiiI/uIFC/Xvx34ib7hXqsXj77bet9PR0y&amp;#43;VyWWeccYZ1//33W4cOHYrw1GYK5VgcPHjQuvvuu62hQ4daMTExltvttm655RbrX//6V&amp;#43;QHN4DDsjjfBQAAzME1NwAAwCjEDQAAMApxAwAAjELcAAAAoxA3AADAKMQNAAAwCnEDAACMQtwAAACjEDcAAMAoxA2AXs3v92vChAnKzs5ut97U1CS3260FCxbYNBkAu/DxCwB6vc8&amp;#43;&amp;#43;0yjRo1SWVmZpk2bJknKzc3Vhx9&amp;#43;qPfee49PuAb6GOIGgBH&amp;#43;/Oc/6&amp;#43;6779Ynn3yimpoaXXXVVXrvvfc0cuRIu0cDEGHEDQAjWJaliy&amp;#43;&amp;#43;WE6nU5s3b9acOXO0cOFCu8cCYAPiBoAxtm7dqnPOOUfDhw/Xpk2b1K9fP7tHAmADLigGYIynn35aAwYM0M6dO7V79267xwFgE87cADDC22&amp;#43;/rQsvvFCvvPKK7rvvPknSq6&amp;#43;&amp;#43;KofDYfNkACKNMzcAer0DBw7o2muv1axZszRx4kQtW7ZMNTU1Wrp0qd2jAbABZ24A9Hpz587V2rVr9eGHH2rAgAGSpCeeeEK33367Nm/erLS0NHsHBBBRxA2AXu2NN97Qr371K1VVVemCCy5o972srCwdOnSIl6eAPoa4AQAARuGaGwAAYBTiBgAAGIW4AQAARiFuAACAUYgbAABgFOIGAAAYhbgBAABGIW4AAIBRiBsAAGAU4gYAABiFuAEAAEb5f3pOUzICslqrAAAAAElFTkSuQmCC&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Output Image&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;可以看到，这个就没有距离突变，而且连接起来是一个连续可微的函数。不过，起始位置和结束位置离得太近，如果 tokens 继续增加，甚至有可能重合。要解决这个问题，只需要增大 $\sin$ 函数的周期。例如，采用 $\sin(\frac{t}{10000^{\frac{i}{dim-1}}})$&lt;/p&gt;
&lt;h3 id=&#34;sinusoidal-编码&#34;&gt;Sinusoidal 编码
&lt;/h3&gt;&lt;p&gt;这是原始 Transformer 论文中采用的编码方法。Sinusoidal 编码在 $\sin$ 编码的基础上，额外希望解决一个问题：能否使得已知位置 $t$ 的编码 $PE_t$ 和距离 $\Delta t$，通过线性变化就可以算出 $PE_{t+\Delta t}$？即满足：
$$
PE_{t+\Delta t} = T_{\Delta t}PE_{t}
$$
其中 $T_{\Delta t}$ 是一个线性变化矩阵。&lt;/p&gt;
&lt;p&gt;这样可以更清晰地编码 tokens 之间的相对位置，同时也有利于计算优化。&lt;/p&gt;
&lt;p&gt;观察上述等式，可以联想到旋转矩阵。令&lt;/p&gt;
&lt;p&gt;$$
T_{\Delta t} =
\begin{pmatrix}
\cos{\Delta t}&amp;amp;\sin{\Delta t}\\
-\sin{\Delta t}&amp;amp;\cos{\Delta t}
\end{pmatrix}\\
PE_t =
\begin{pmatrix}
\sin{t}\\
\cos{t}
\end{pmatrix}
$$&lt;/p&gt;
&lt;p&gt;则&lt;/p&gt;
&lt;p&gt;$$
\begin{pmatrix}
\sin(t+\Delta t)\\
\cos(t+\Delta t)
\end{pmatrix}=
\begin{pmatrix}
\cos{\Delta t}&amp;amp;\sin{\Delta t}\\
-\sin{\Delta t}&amp;amp;\cos{\Delta t}
\end{pmatrix}
\begin{pmatrix}
\sin{t}\\
\cos{t}
\end{pmatrix}
$$&lt;/p&gt;
&lt;p&gt;模仿 $\sin$ 编码的方式，扩展到多维，则有
$$
PE_t = [\sin(w_0t), \cos(w_0t), \sin(w_1t), \cos(w_1t), &amp;hellip;]
$$
在 Sinusoidal 编码中，采用
$$
PE_t = \begin{cases}
\sin(\frac{t}{10000^{\frac{i}{dim}}}) &amp;amp; i=2k, k\in N \\
\cos(\frac{t}{10000^{\frac{i-1}{dim}}}) &amp;amp; i=2k+1, k\in N
\end{cases}
$$
Sinusoidal编码要求向量维度必须是偶数。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;gen_Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gen_Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[ 0.        ,  1.        ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [ 0.84147098,  0.54030231],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [ 0.90929743, -0.41614684],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [ 0.14112001, -0.9899925 ]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE_embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE_embed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[1.        , 2.        ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.84147098, 1.54030231],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.90929743, 0.58385316],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [1.14112001, 0.0100075 ]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;绘图如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;PE_plt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Figure size 640x480 with 1 Axes&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAksAAAGwCAYAAAC5ACFFAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD&amp;#43;naQAAMThJREFUeJzt3X1YVHX&amp;#43;//HXgDJoCegqdzHlXZu6edNiEqab5XyF9NvqVyvdLNSf6WZqKVbKbmqbFaZ9u8x0o1xNu9I0vbRvN0YSLnZHarh0Y&amp;#43;pmWd4xqLnMKBYinN8frLNNwkcgYRh8Pq7rXDGf8zmfeX882ryuc858sFmWZQkAAACVCvJ3AQAAAA0ZYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAZN/F1AY1BeXq7Dhw&amp;#43;rRYsWstls/i4HAABUg2VZOnHihGJjYxUUVPX1I8LSBXD48GE5HA5/lwEAAGrhwIEDiouLq3I/YekCaNGihaSKP&amp;#43;ywsDA/VwMAAKrD4/HI4XB4P8erQli6AM7eegsLCyMsAQAQYM73CA0PeAMAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhKYAsXrxYbdu2VWhoqBISErRt2zZ/lwQAQKNHWAoQa9asUWpqqmbPnq0dO3aoe/fuSkpK0pEjR/xdGgAAjRphKUA8/fTTGjdunMaMGaMuXbooIyNDzZs317Jly/xdGgAAjRphKQCcPn1aeXl5cjqd3ragoCA5nU7l5ub6sTIAABo/VvBuqMrKpPfflwoKdKxpU5WVlSkqKsqnS1RUlHbv3u2nAgEAuDgE1JWl9957T7fccotiY2Nls9n02muvnfeYnJwc/fa3v5XdblfHjh21fPnyc/o0uAen16&amp;#43;X2raVbrxRuuMO6bbbKtpzcvxZFQAAF6WACkvFxcXq3r27Fi9eXK3&amp;#43;&amp;#43;/bt06BBg3TjjTcqPz9fU6ZM0d1336133nnH26fBPTi9fr10663SwYPeptaSgiUV/ulPFfv/rbCwUNHR0fVfIwAAFxGbZVmWv4uoDZvNpg0bNmjIkCFV9pk&amp;#43;fbreeustffHFF962ESNGqKioSJmZmZKkhIQEXXvttVq0aJEkqby8XA6HQ5MnT9aMGTOqVYvH41F4eLjcbvcv&amp;#43;0W6ZWUVV5R&amp;#43;EpTOSpDUS9KzDoe0b5/KbTZdfvnlmjRpUrXrBAAA/1Hdz&amp;#43;&amp;#43;AurJUU7m5uT4PRUtSUlKS96Ho2j44XVJSIo/H47NdEO&amp;#43;/X2lQkqRUSUskrThwQLteflkTJkxQcXGxxowZc2HeGwAAVKpRhyWXy1XpQ9Eej0c//PCDjh07VuWD0y6Xq8px09PTFR4e7t0cDseFKbigoMpdwyU9JWmWpB533638/HxlZmaeUzsAALiwGnVYqitpaWlyu93e7cCBAxdm4JgY4&amp;#43;5Jkr6TVJKVpa1btyohIeHCvC8AAKhSo146IDo6WoWFhT5thYWFCgsLU7NmzRQcHKzg4OBK&amp;#43;5genLbb7bLb7Re&amp;#43;4L59pbg46dAhqbJHyWy2iv19&amp;#43;1749wYAAJVq1FeWEhMTlZ2d7dOWlZWlxMRESVJISIji4&amp;#43;N9&amp;#43;pSXlys7O9vbp14FB0vPPFPxs83mu&amp;#43;/s6wULKvoBAIB6EVBh6eTJk8rPz1d&amp;#43;fr6kiqUB8vPztX//fkkVt8dSUlK8/e&amp;#43;55x598803euihh7R792799a9/1auvvqqpU6d6&amp;#43;6SmpmrJkiVasWKFdu3a5f8Hp4cOldatky67zLc9Lq6ifehQ/9QFAMBFKqBuw33yySe68cYbva9TU1MlSaNGjdLy5ctVUFDgDU6S1K5dO7311luaOnWqnnnmGcXFxelvf/ubkpKSvH2GDx&amp;#43;uo0ePatasWXK5XOrRo4f/H5weOlQaPNi7grdiYipuvXFFCQCAehew6yw1JBdsnSUAAFBvWGcJAADgAiAsAQAAGBCWAAAADAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgEHBhafHixWrbtq1CQ0OVkJCgbdu2Vdm3X79&amp;#43;stls52yDBg3y9hk9evQ5&amp;#43;5OTk&amp;#43;tjKgAAIAA08XcBNbFmzRqlpqYqIyNDCQkJWrBggZKSkrRnzx5FRkae03/9&amp;#43;vU6ffq09/X333&amp;#43;v7t2767bbbvPpl5ycrBdffNH72m63190kAABAQAmosPT0009r3LhxGjNmjCQpIyNDb731lpYtW6YZM2ac079Vq1Y&amp;#43;r1evXq3mzZufE5bsdruio6OrXUdJSYlKSkq8rz0eT02mAQAAAkjA3IY7ffq08vLy5HQ6vW1BQUFyOp3Kzc2t1hhLly7ViBEjdMkll/i05&amp;#43;TkKDIyUldddZUmTJig77//3jhOenq6wsPDvZvD4aj5hAAAQEAImLB07NgxlZWVKSoqyqc9KipKLpfrvMdv27ZNX3zxhe6&amp;#43;&amp;#43;26f9uTkZL300kvKzs7Wk08&amp;#43;qS1btujmm29WWVlZlWOlpaXJ7XZ7twMHDtRuUgAAoMELqNtwv8TSpUvVtWtX9erVy6d9xIgR3p&amp;#43;7du2qbt26qUOHDsrJyVH//v0rHctut/NcEwAAF4mAubLUunVrBQcHq7Cw0Ke9sLDwvM8bFRcXa/Xq1Ro7dux536d9&amp;#43;/Zq3bq19u7d&amp;#43;4vqBQAAjUPAhKWQkBDFx8crOzvb21ZeXq7s7GwlJiYaj127dq1KSkp05513nvd9Dh48qO&amp;#43;//14xMTG/uGYAABD4AiYsSVJqaqqWLFmiFStWaNeuXZowYYKKi4u9345LSUlRWlraOcctXbpUQ4YM0a9&amp;#43;9Suf9pMnT&amp;#43;rBBx/Uxx9/rG&amp;#43;//VbZ2dkaPHiwOnbsqKSkpHqZEwAAaNgC6pml4cOH6&amp;#43;jRo5o1a5ZcLpd69OihzMxM70Pf&amp;#43;/fvV1CQb/7bs2ePPvjgA23atOmc8YKDg/XZZ59pxYoVKioqUmxsrAYMGKA5c&amp;#43;bwTBIAAJAk2SzLsvxdRKDzeDwKDw&amp;#43;X2&amp;#43;1WWFiYv8sBAADVUN3P74C6DQcAAFDfCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAABg9N577&amp;#43;mWW25RbGysbDabXnvtNX&amp;#43;XVK8ISwAAwKi4uFjdu3fX4sWL/V2KXzTxdwEAAKBhu/nmm3XzzTf7uwy/4coSAACAAWEJAADAgNtwAADAV1mZ9P77UkGBFBMj9e0rBQf7uyq/ISwBAID/WL9euv9&amp;#43;6eDB/7TFxUnPPCMNHeq/uvyIsAQAACqsXy/deqtkWb7thw5VtK9b55&amp;#43;6/IywBAAAKm693X//uUFJ0knL0l5JuvdeSdK&amp;#43;ffuUn5&amp;#43;vVq1a6fLLL6/fOv2AB7wBAEDFM0o/vfX2E59IukbSNYWFkqTU1FRdc801mjVrVv3V50dcWQIAABUPc1ehnyTv9aZVq6Q//KEeCmo4uLIEAAAqvvV2Ifs1IoQlAABQsTxAXJxks1W&amp;#43;32aTHI6KfheZgAtLixcvVtu2bRUaGqqEhARt27atyr7Lly&amp;#43;XzWbz2UJDQ336WJalWbNmKSYmRs2aNZPT6dRXX31V19MAAKBhCQ6uWB5AOjcwnX29YMFFud5SQIWlNWvWKDU1VbNnz9aOHTvUvXt3JSUl6ciRI1UeExYWpoKCAu/23Xff&amp;#43;eyfN2&amp;#43;eFi5cqIyMDG3dulWXXHKJkpKS9OOPP9b1dAAAaFiGDq1YHuCyy3zb4&amp;#43;Iq2i/SdZZsllXJdwQbqISEBF177bVatGiRJKm8vFwOh0OTJ0/WjBkzzum/fPlyTZkyRUVFRZWOZ1mWYmNjNW3aND3wwAOSJLfbraioKC1fvlwjRoyo9LiSkhKVlJR4X3s8HjkcDrndboWFhf3CWQIA4GcXyQreHo9H4eHh5/38DpgrS6dPn1ZeXp6cTqe3LSgoSE6nU7m5uVUed/LkSV1xxRVyOBwaPHiwdu7c6d23b98&amp;#43;uVwunzHDw8OVkJBgHDM9PV3h4eHezeFw/MLZAQDQgAQHS/36VXzrrV&amp;#43;/RhmUaiJgwtKxY8dUVlamqKgon/aoqCi5XK5Kj7nqqqu0bNky/d///Z9efvlllZeXq3fv3jr473Ukzh5XkzElKS0tTW6327sdOHDgl0wNAAA0YI16naXExEQlJiZ6X/fu3VudO3fW888/rzlz5tR6XLvdLrvdfiFKBAAADVzAXFlq3bq1goODVfjv1UPPKiwsVHR0dLXGaNq0qa655hrt3btXkrzH/ZIxAQBA4xYwYSkkJETx8fHKzs72tpWXlys7O9vn6pFJWVmZPv/8c8X8e0Gtdu3aKTo62mdMj8ejrVu3VntMAADQuAXUbbjU1FSNGjVKPXv2VK9evbRgwQIVFxdrzJgxkqSUlBRddtllSk9PlyQ9&amp;#43;uijuu6669SxY0cVFRVp/vz5&amp;#43;u6773T33XdLkmw2m6ZMmaLHHntMV155pdq1a6eZM2cqNjZWQ4YM8dc0AQBAAxJQYWn48OE6evSoZs2aJZfLpR49eigzM9P7gPb&amp;#43;/fsVFPSfi2X/&amp;#43;te/NG7cOLlcLrVs2VLx8fH66KOP1KVLF2&amp;#43;fhx56SMXFxRo/fryKiorUp08fZWZmnrN4JQAAuDgF1DpLDVV112kAAAANR6NbZwkAAMAfCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAIuLC0ePFitW3bVqGhoUpISNC2bduq7LtkyRL17dtXLVu2VMuWLeV0Os/pP3r0aNlsNp8tOTm5rqcBAAACRECFpTVr1ig1NVWzZ8/Wjh071L17dyUlJenIkSOV9s/JydEf/vAH/f3vf1dubq4cDocGDBigQ4cO&amp;#43;fRLTk5WQUGBd3vllVfqYzoAACAA2CzLsvxdRHUlJCTo2muv1aJFiyRJ5eXlcjgcmjx5smbMmHHe48vKytSyZUstWrRIKSkpkiquLBUVFem1116rdV0ej0fh4eFyu90KCwur9TgAAKD&amp;#43;VPfzO2CuLJ0&amp;#43;fVp5eXlyOp3etqCgIDmdTuXm5lZrjFOnTqm0tFStWrXyac/JyVFkZKSuuuoqTZgwQd9//71xnJKSEnk8Hp8NAAA0TgETlo4dO6aysjJFRUX5tEdFRcnlclVrjOnTpys2NtYncCUnJ&amp;#43;ull15Sdna2nnzySW3ZskU333yzysrKqhwnPT1d4eHh3s3hcNRuUgAAoMFr4u8C6svcuXO1evVq5eTkKDQ01Ns&amp;#43;YsQI789du3ZVt27d1KFDB&amp;#43;Xk5Kh///6VjpWWlqbU1FTva4/HQ2ACAKCRCpgrS61bt1ZwcLAKCwt92gsLCxUdHW089qmnntLcuXO1adMmdevWzdi3ffv2at26tfbu3VtlH7vdrrCwMJ8NAAA0TgETlkJCQhQfH6/s7GxvW3l5ubKzs5WYmFjlcfPmzdOcOXOUmZmpnj17nvd9Dh48qO&amp;#43;//14xMTEXpG4AABDYAiYsSVJqaqqWLFmiFStWaNeuXZowYYKKi4s1ZswYSVJKSorS0tK8/Z988knNnDlTy5YtU9u2beVyueRyuXTy5ElJ0smTJ/Xggw/q448/1rfffqvs7GwNHjxYHTt2VFJSkl/mCAAAGpaAemZp&amp;#43;PDhOnr0qGbNmiWXy6UePXooMzPT&amp;#43;9D3/v37FRT0n/z33HPP6fTp07r11lt9xpk9e7YeeeQRBQcH67PPPtOKFStUVFSk2NhYDRgwQHPmzJHdbq/XuQEAgIYpoNZZaqhYZwkAgMDT6NZZAgAA8AfCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGFQ7LB0&amp;#43;fLgu6wAAAGiQqh2WfvOb32jVqlV1WUu1LF68WG3btlVoaKgSEhK0bds2Y/&amp;#43;1a9eqU6dOCg0NVdeuXbVx40af/ZZladasWYqJiVGzZs3kdDr11Vdf1eUUAABAAKl2WHr88cf1xz/&amp;#43;UbfddpuOHz9elzVVac2aNUpNTdXs2bO1Y8cOde/eXUlJSTpy5Eil/T/66CP94Q9/0NixY/WPf/xDQ4YM0ZAhQ/TFF194&amp;#43;8ybN08LFy5URkaGtm7dqksuuURJSUn68ccf62taAACgAbNZlmVVt/O&amp;#43;ffs0duxYffnll1qyZIluueWWuqztHAkJCbr22mu1aNEiSVJ5ebkcDocmT56sGTNmnNN/&amp;#43;PDhKi4u1ptvvultu&amp;#43;6669SjRw9lZGTIsizFxsZq2rRpeuCBByRJbrdbUVFRWr58uUaMGFGtujwej8LDw&amp;#43;V2uxUWFnYBZgoAAOpadT&amp;#43;/a/SAd7t27bR582Y9/PDDGjp0qLp166bf/va3PltdOX36tPLy8uR0Or1tQUFBcjqdys3NrfSY3Nxcn/6SlJSU5O2/b98&amp;#43;uVwunz7h4eFKSEiockxJKikpkcfj8dkAAEDj1KSmB3z33Xdav369WrZsqcGDB6tJkxoPUSvHjh1TWVmZoqKifNqjoqK0e/fuSo9xuVyV9ne5XN79Z9uq6lOZ9PR0/eUvf6nxHAAAQOCpUdJZsmSJpk2bJqfTqZ07d6pNmzZ1VVeDlpaWptTUVO9rj8cjh8Phx4oAAEBdqXZYSk5O1rZt27Ro0SKlpKTUZU2Vat26tYKDg1VYWOjTXlhYqOjo6EqPiY6ONvY/&amp;#43;9/CwkLFxMT49OnRo0eVtdjtdtnt9tpMAwAABJhqP7NUVlamzz77zC9BSZJCQkIUHx&amp;#43;v7Oxsb1t5ebmys7OVmJhY6TGJiYk&amp;#43;/SUpKyvL279du3aKjo726ePxeLR169YqxwQAABeXal9ZysrKqss6qiU1NVWjRo1Sz5491atXLy1YsEDFxcUaM2aMJCklJUWXXXaZ0tPTJUn333&amp;#43;/brjhBv3v//6vBg0apNWrV&amp;#43;uTTz7RCy&amp;#43;8IEmy2WyaMmWKHnvsMV155ZVq166dZs6cqdjYWA0ZMsRf0wQAAA1I/TydfYEMHz5cR48e1axZs&amp;#43;RyudSjRw9lZmZ6H9Dev3&amp;#43;/goL&amp;#43;c7Gsd&amp;#43;/eWrVqlR5&amp;#43;&amp;#43;GH96U9/0pVXXqnXXntNV199tbfPQw89pOLiYo0fP15FRUXq06ePMjMzFRoaWu/zAwAADU&amp;#43;N1llC5VhnCQCAwFMn6ywBAABcbAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgQFgCAAAwCJiwdPz4cY0cOVJhYWGKiIjQ2LFjdfLkSWP/yZMn66qrrlKzZs10&amp;#43;eWX67777pPb7fbpZ7PZztlWr15d19MBAAABoom/C6iukSNHqqCgQFlZWSotLdWYMWM0fvx4rVq1qtL&amp;#43;hw8f1uHDh/XUU0&amp;#43;pS5cu&amp;#43;u6773TPPffo8OHDWrdunU/fF198UcnJyd7XERERdTkVAAAQQGyWZVn&amp;#43;LuJ8du3apS5dumj79u3q2bOnJCkzM1MDBw7UwYMHFRsbW61x1q5dqzvvvFPFxcVq0qQiJ9psNm3YsEFDhgypdX0ej0fh4eFyu90KCwur9TgAAKD&amp;#43;VPfzOyBuw&amp;#43;Xm5ioiIsIblCTJ6XQqKChIW7durfY4Z/8wzgalsyZOnKjWrVurV69eWrZsmc6XH0tKSuTxeHw2AADQOAXEbTiXy6XIyEiftiZNmqhVq1ZyuVzVGuPYsWOaM2eOxo8f79P&amp;#43;6KOP6qabblLz5s21adMm3XvvvTp58qTuu&amp;#43;&amp;#43;&amp;#43;KsdKT0/XX/7yl5pPBAAABBy/XlmaMWNGpQ9Y/3TbvXv3L34fj8ejQYMGqUuXLnrkkUd89s2cOVPXX3&amp;#43;9rrnmGk2fPl0PPfSQ5s&amp;#43;fbxwvLS1Nbrfbux04cOAX1wgAABomv15ZmjZtmkaPHm3s0759e0VHR&amp;#43;vIkSM&amp;#43;7WfOnNHx48cVHR1tPP7EiRNKTk5WixYttGHDBjVt2tTYPyEhQXPmzFFJSYnsdnulfex2e5X7AABA4&amp;#43;LXsNSmTRu1adPmvP0SExNVVFSkvLw8xcfHS5I2b96s8vJyJSQkVHmcx&amp;#43;NRUlKS7Ha7Xn/9dYWGhp73vfLz89WyZUvCEAAAkBQgzyx17txZycnJGjdunDIyMlRaWqpJkyZpxIgR3m/CHTp0SP3799dLL72kXr16yePxaMCAATp16pRefvllnwex27Rpo&amp;#43;DgYL3xxhsqLCzUddddp9DQUGVlZemJJ57QAw884M/pAgCABiQgwpIkrVy5UpMmTVL//v0VFBSkYcOGaeHChd79paWl2rNnj06dOiVJ2rFjh/ebch07dvQZa9&amp;#43;&amp;#43;fWrbtq2aNm2qxYsXa&amp;#43;rUqbIsSx07dtTTTz&amp;#43;tcePG1d/EAABAgxYQ6yw1dKyzBABA4GlU6ywBAAD4C2EJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAgAYvPT1d1157rVq0aKHIyEgNGTJEe/bsqZf3JiwBAIAGb8uWLZo4caI&amp;#43;/vhjZWVlqbS0VAMGDFBxcXGdv7fNsiyrzt&amp;#43;lkfN4PAoPD5fb7VZYWJi/ywEAoNE7evSoIiMjtWXLFv3ud7&amp;#43;r1RjV/fzmyhIAAAg4brdbktSqVas6f68mdf4OAAAAtVFWJr3/vlRQIMXESH37SsHBKi8v15QpU3T99dfr6quvrvMyCEsAAKDhWb9euv9&amp;#43;6eDB/7TFxUnPPKOJWVn64osv9MEHH9RLKYQlAADQsKxfL916q/Tzx6oPHdKkYcP05q9&amp;#43;pfe2b1dcXFy9lENYAgAADUdZWcUVpZ8FJUvSZMvSBkk5TZuq3eWX11tJPOANAAAajvff97319m8TJb0saZWkFi6XXP/3f3K5XPrhhx/qvCTCEgAAaDgKCiptfk6SW1I/STGSYoYNU0xMjNasWVPnJXEbDgAANBwxMZU2n7Mo5N//LvXrV9fVSOLKEgAAaEj69q341pvNVvl&amp;#43;m01yOCr61RPCEgAAaDiCg6Vnnqn4&amp;#43;eeB6ezrBQsq&amp;#43;tUTwhIAAGhYhg6V1q2TLrvMtz0urqJ96NB6LYdnlgAAQMMzdKg0eHClK3jXN8ISAABomIKD6&amp;#43;0hbhNuwwEAABgQlgAAAAwISwAAAAaEJQAAAIOACUvHjx/XyJEjFRYWpoiICI0dO1YnT540HtOvXz/ZbDaf7Z577vHps3//fg0aNEjNmzdXZGSkHnzwQZ05c6YupwIAAAJIwHwbbuTIkSooKFBWVpZKS0s1ZswYjR8/XqtWrTIeN27cOD366KPe182bN/f&amp;#43;XFZWpkGDBik6OlofffSRCgoKlJKSoqZNm&amp;#43;qJJ56os7kAAIDAYbMs65xft9LQ7Nq1S126dNH27dvVs2dPSVJmZqYGDhyogwcPKjY2ttLj&amp;#43;vXrpx49emjBggWV7n/77bf13//93zp8&amp;#43;LCioqIkSRkZGZo&amp;#43;fbqOHj2qkJCQSo8rKSlRSUmJ97XH45HD4ZDb7VZYWNgvmCkAAKgvHo9H4eHh5/38DojbcLm5uYqIiPAGJUlyOp0KCgrS1q1bjceuXLlSrVu31tVXX620tDSdOnXKZ9yuXbt6g5IkJSUlyePxaOfOnVWOmZ6ervDwcO/mcDh&amp;#43;wewAAEBDFhC34VwulyIjI33amjRpolatWsnlclV53B133KErrrhCsbGx&amp;#43;uyzzzR9&amp;#43;nTt2bNH69ev947706AkyfvaNG5aWppSU1O9r89eWQIAAI2PX8PSjBkz9OSTTxr77Nq1q9bjjx8/3vtz165dFRMTo/79&amp;#43;&amp;#43;vrr79Whw4daj2u3W6X3W6v9fEAACBw&amp;#43;DUsTZs2TaNHjzb2ad&amp;#43;&amp;#43;vaKjo3XkyBGf9jNnzuj48eOKjo6u9vslJCRIkvbu3asOHTooOjpa27Zt8&amp;#43;lTWFgoSTUaFwAANF5&amp;#43;DUtt2rRRmzZtztsvMTFRRUVFysvLU3x8vCRp8&amp;#43;bNKi8v9wag6sjPz5ckxcTEeMd9/PHHdeTIEe9tvqysLIWFhalLly41nA0AAGiMAuIB786dOys5OVnjxo3Ttm3b9OGHH2rSpEkaMWKE95twhw4dUqdOnbxXir7&amp;#43;&amp;#43;mvNmTNHeXl5&amp;#43;vbbb/X6668rJSVFv/vd79StWzdJ0oABA9SlSxfddddd&amp;#43;vTTT/XOO&amp;#43;/o4Ycf1sSJE7nNBgAAJAVIWJIqvtXWqVMn9e/fXwMHDlSfPn30wgsvePeXlpZqz5493m&amp;#43;7hYSE6N1339WAAQPUqVMnTZs2TcOGDdMbb7zhPSY4OFhvvvmmgoODlZiYqDvvvFMpKSk&amp;#43;6zIBAICLW0Css9TQVXedBgAA0HA0qnWWAAAA/IWwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAAAAg4AJS8ePH9fIkSMVFhamiIgIjR07VidPnqyy/7fffiubzVbptnbtWm&amp;#43;/yvavXr26PqYEAAACQBN/F1BdI0eOVEFBgbKyslRaWqoxY8Zo/PjxWrVqVaX9HQ6HCgoKfNpeeOEFzZ8/XzfffLNP&amp;#43;4svvqjk5GTv64iIiAtePwAACEwBEZZ27dqlzMxMbd&amp;#43;&amp;#43;XT179pQkPfvssxo4cKCeeuopxcbGnnNMcHCwoqOjfdo2bNig22&amp;#43;/XZdeeqlPe0RExDl9TUpKSlRSUuJ97fF4ajIdAAAQQALiNlxubq4iIiK8QUmSnE6ngoKCtHXr1mqNkZeXp/z8fI0dO/acfRMnTlTr1q3Vq1cvLVu2TJZlGcdKT09XeHi4d3M4HDWbEAAACBgBEZZcLpciIyN92po0aaJWrVrJ5XJVa4ylS5eqc&amp;#43;fO6t27t0/7o48&amp;#43;qldffVVZWVkaNmyY7r33Xj377LPGsdLS0uR2u73bgQMHajYhAAAQMPx6G27GjBl68sknjX127dr1i9/nhx9&amp;#43;0KpVqzRz5sxz9v207ZprrlFxcbHmz5&amp;#43;v&amp;#43;&amp;#43;67r8rx7Ha77Hb7L64LAAA0fH4NS9OmTdPo0aONfdq3b6/o6GgdOXLEp/3MmTM6fvx4tZ41WrdunU6dOqWUlJTz9k1ISNCcOXNUUlJCIAIAAP4NS23atFGbNm3O2y8xMVFFRUXKy8tTfHy8JGnz5s0qLy9XQkLCeY9funSpfv/731frvfLz89WyZUuCEgAAkBQg34br3LmzkpOTNW7cOGVkZKi0tFSTJk3SiBEjvN&amp;#43;EO3TokPr376&amp;#43;XXnpJvXr18h67d&amp;#43;9evffee9q4ceM5477xxhsqLCzUddddp9DQUGVlZemJJ57QAw88UG9zAwAADVtAhCVJWrlypSZNmqT&amp;#43;/fsrKChIw4YN08KFC737S0tLtWfPHp06dcrnuGXLlikuLk4DBgw4Z8ymTZtq8eLFmjp1qizLUseOHfX0009r3LhxdT4fAAAQGGzW&amp;#43;b4nj/PyeDwKDw&amp;#43;X2&amp;#43;1WWFiYv8sBAADVUN3P74BYOgAAAMBfCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAIAADAgLAEAABgQlgAAAAwISwAAAAaEJQAAAAPCEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAsAQAAGBCWAAAADAhLAAAABoQlAAAAA8ISAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYQsJ577jl169ZNYWFhCgsLU2Jiot5&amp;#43;&amp;#43;21/lwUAaGQISwhYcXFxmjt3rvLy8vTJJ5/opptu0uDBg7Vz505/lwYAaERslmVZ/i4i0Hk8HoWHh8vtdissLMzf5VzUWrVqpfnz52vs2LH&amp;#43;LgUA0MBV9/O7ST3WBNSZsrIyrV27VsXFxUpMTPR3OQCARoSwhMBSVia9/75UUCDFxOjziAgl9umjH3/8UZdeeqk2bNigLl26&amp;#43;LtKAEAjQlhC4Fi/Xrr/fungQW/TVZddpvwnn5T7uuu0bt06jRo1Slu2bCEwAQAuGJ5ZugB4ZqkerF8v3Xqr9PO/rjZbxX/XrZOGDpXT6VSHDh30/PPP13&amp;#43;NAICAUt3P74D5Ntzjjz&amp;#43;u3r17q3nz5oqIiKjWMZZladasWYqJiVGzZs3kdDr11Vdf&amp;#43;fQ5fvy4Ro4cqbCwMEVERGjs2LE6efJkHcwAtVZWVnFFqbJcf7ZtyhSprEzl5eUqKSmp1/IAAI1bwISl06dP67bbbtOECROqfcy8efO0cOFCZWRkaOvWrbrkkkuUlJSkH3/80dtn5MiR2rlzp7KysvTmm2/qvffe0/jx4&amp;#43;tiCqit99/3ufV2Vpqk9yR9a1n6/MABpaWkKCcnRyNHjqz3EgEAjZgVYF588UUrPDz8vP3Ky8ut6Ohoa/78&amp;#43;d62oqIiy263W6&amp;#43;88oplWZb15ZdfWpKs7du3e/u8/fbbls1msw4dOlTtmtxutyXJcrvd1Z8Iqm/VKsuquIbks/0/ybpCskIkq41k9f/Nb6xNmzb5u1oAQICo7ud3wFxZqql9&amp;#43;/bJ5XLJ6XR628LDw5WQkKDc3FxJUm5uriIiItSzZ09vH6fTqaCgIG3durXKsUtKSuTxeHw21KGYmEqbl0r6VlKJpCOS3l20SP/1X/9Vf3UBAC4KjTYsuVwuSVJUVJRPe1RUlHefy&amp;#43;VSZGSkz/4mTZqoVatW3j6VSU9PV3h4uHdzOBwXuHr46NtXiov7z8PcP2ezSQ5HRT8AAC4wv4alGTNmyGazGbfdu3f7s8RKpaWlye12e7cDBw74u6TGLThYeuaZip9/HpjOvl6woKIfAAAXmF/XWZo2bZpGjx5t7NO&amp;#43;fftajR0dHS1JKiwsVMxPbuMUFhaqR48e3j5HjhzxOe7MmTM6fvy49/jK2O122e32WtWFWho6tGJ5gJ&amp;#43;ts6S4uIqgNHSo30oDADRufg1Lbdq0UZs2bepk7Hbt2ik6OlrZ2dnecOTxeLR161bvN&amp;#43;oSExNVVFSkvLw8xcfHS5I2b96s8vJyJSQk1Eld&amp;#43;AWGDpUGD/ZZwVt9&amp;#43;3JFCQBQpwJmBe/9&amp;#43;/fr&amp;#43;PHj2r9/v8rKypSfny9J6tixoy699FJJUqdOnZSenq7/&amp;#43;Z//kc1m05QpU/TYY4/pyiuvVLt27TRz5kzFxsZqyJAhkqTOnTsrOTlZ48aNU0ZGhkpLSzVp0iSNGDFCsbGxfpopjIKDpX79/F0FAOAiEjBhadasWVqxYoX39TXXXCNJ&amp;#43;vvf/65&amp;#43;//7w3LNnj9xut7fPQw89pOLiYo0fP15FRUXq06ePMjMzFRoa6u2zcuVKTZo0Sf3791dQUJCGDRumhQsX1s&amp;#43;kAABAg8evO7kA&amp;#43;HUnAAAEnkb3604AAAD8gbAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAACDgFmUsiE7u1SVx&amp;#43;PxcyUAAKC6zn5un2/JScLSBXDixAlJksPh8HMlAACgpk6cOKHw8PAq97OC9wVQXl6uw4cPq0WLFrLZbBdsXI/HI4fDoQMHDrAyuJ9xLhoWzkfDwbloODgXNWdZlk6cOKHY2FgFBVX9ZBJXli6AoKAgxcXF1dn4YWFh/MVvIDgXDQvno&amp;#43;HgXDQcnIuaMV1ROosHvAEAAAwISwAAAAaEpQbMbrdr9uzZstvt/i7lose5aFg4Hw0H56Lh4FzUHR7wBgAAMODKEgAAgAFhCQAAwICwBAAAYEBYAgAAMCAs&amp;#43;dnixYvVtm1bhYaGKiEhQdu2bTP2X7t2rTp16qTQ0FB17dpVGzdurKdKG7&amp;#43;anIslS5aob9&amp;#43;&amp;#43;atmypVq2bCmn03nec4fqq&amp;#43;m/i7NWr14tm82mIUOG1G2BF5mano&amp;#43;ioiJNnDhRMTExstvt&amp;#43;vWvf83/qy6Qmp6LBQsW6KqrrlKzZs3kcDg0depU/fjjj/VUbSNiwW9Wr15thYSEWMuWLbN27txpjRs3zoqIiLAKCwsr7f/hhx9awcHB1rx586wvv/zSevjhh62mTZtan3/&amp;#43;eT1X3vjU9Fzccccd1uLFi61//OMf1q5du6zRo0db4eHh1sGDB&amp;#43;u58sanpufirH379lmXXXaZ1bdvX2vw4MH1U&amp;#43;xFoKbno6SkxOrZs6c1cOBA64MPPrD27dtn5eTkWPn5&amp;#43;fVceeNT03OxcuVKy263WytXrrT27dtnvfPOO1ZMTIw1derUeq488BGW/KhXr17WxIkTva/Lysqs2NhYKz09vdL&amp;#43;t99&amp;#43;uzVo0CCftoSEBOuPf/xjndZ5Majpufi5M2fOWC1atLBWrFhRVyVeNGpzLs6cOWP17t3b&amp;#43;tvf/maNGjWKsHQB1fR8PPfcc1b79u2t06dP11eJF42anouJEydaN910k09bamqqdf3119dpnY0Rt&amp;#43;H85PTp08rLy5PT6fS2BQUFyel0Kjc3t9JjcnNzffpLUlJSUpX9UT21ORc/d&amp;#43;rUKZWWlqpVq1Z1VeZFobbn4tFHH1VkZKTGjh1bH2VeNGpzPl5//XUlJiZq4sSJioqK0tVXX60nnnhCZWVl9VV2o1Sbc9G7d2/l5eV5b9V988032rhxowYOHFgvNTcm/CJdPzl27JjKysoUFRXl0x4VFaXdu3dXeozL5aq0v8vlqrM6Lwa1ORc/N336dMXGxp4TZlEztTkXH3zwgZYuXar8/Px6qPDiUpvz8c0332jz5s0aOXKkNm7cqL179&amp;#43;ree&amp;#43;9VaWmpZs&amp;#43;eXR9lN0q1ORd33HGHjh07pj59&amp;#43;siyLJ05c0b33HOP/vSnP9VHyY0KV5aAX2ju3LlavXq1NmzYoNDQUH&amp;#43;Xc1E5ceKE7rrrLi1ZskStW7f2dzmQVF5ersjISL3wwguKj4/X8OHD9ec//1kZGRn&amp;#43;Lu2ik5OToyeeeEJ//etftWPHDq1fv15vvfWW5syZ4&amp;#43;/SAg5XlvykdevWCg4OVmFhoU97YWGhoqOjKz0mOjq6Rv1RPbU5F2c99dRTmjt3rt59911169atLsu8KNT0XHz99df69ttvdcstt3jbysvLJUlNmjTRnj171KFDh7otuhGrzb&amp;#43;NmJgYNW3aVMHBwd62zp07y&amp;#43;Vy6fTp0woJCanTmhur2pyLmTNn6q677tLdd98tSeratauKi4s1fvx4/fnPf1ZQENdLqos/KT8JCQlRfHy8srOzvW3l5eXKzs5WYmJipcckJib69JekrKysKvujempzLiRp3rx5mjNnjjIzM9WzZ8/6KLXRq&amp;#43;m56NSpkz7//HPl5&amp;#43;d7t9///ve68cYblZ&amp;#43;fL4fDUZ/lNzq1&amp;#43;bdx/fXXa&amp;#43;/evd7QKkn//Oc/FRMTQ1D6BWpzLk6dOnVOIDobYi1&amp;#43;LWzN&amp;#43;PsJ84vZ6tWrLbvdbi1fvtz68ssvrfHjx1sRERGWy&amp;#43;WyLMuy7rrrLmvGjBne/h9&amp;#43;&amp;#43;KHVpEkT66mnnrJ27dplzZ49m6UDLpCanou5c&amp;#43;daISEh1rp166yCggLvduLECX9NodGo6bn4Ob4Nd2HV9Hzs37/fatGihTVp0iRrz5491ptvvmlFRkZajz32mL&amp;#43;m0GjU9FzMnj3batGihfXKK69Y33zzjbVp0yarQ4cO1u233&amp;#43;6vKQQswpKfPfvss9bll19uhYSEWL169bI&amp;#43;/vhj774bbrjBGjVqlE//V1991fr1r39thYSEWL/5zW&amp;#43;st956q54rbrxqci6uuOIKS9I52&amp;#43;zZs&amp;#43;u/8Eaopv8ufoqwdOHV9Hx89NFHVkJCgmW326327dtbjz/&amp;#43;uHXmzJl6rrpxqsm5KC0ttR555BGrQ4cOVmhoqOVwOKx7773X&amp;#43;te//lX/hQc4m2VxLQ4AAKAqPLMEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGBAWAKAnygrK1Pv3r01dOhQn3a32y2Hw6E///nPfqoMgL/w604A4Gf&amp;#43;&amp;#43;c9/qkePHlqyZIlGjhwpSUpJSdGnn36q7du3KyQkxM8VAqhPhCUAqMTChQv1yCOPaOfOndq2bZtuu&amp;#43;02bd&amp;#43;&amp;#43;Xd27d/d3aQDqGWEJACphWZZuuukmBQcH6/PPP9fkyZP18MMP&amp;#43;7ssAH5AWAKAKuzevVudO3dW165dtWPHDjVp0sTfJQHwAx7wBoAqLFu2TM2bN9e&amp;#43;fft08OBBf5cDwE&amp;#43;4sgQAlfjoo490ww03aNOmTXrsscckSe&amp;#43;&amp;#43;&amp;#43;65sNpufKwNQ37iyBAA/c&amp;#43;rUKY0ePVoTJkzQjTfeqKVLl2rbtm3KyMjwd2kA/IArSwDwM/fff782btyoTz/9VM2bN5ckPf/883rggQf0&amp;#43;eefq23btv4tEEC9IiwBwE9s2bJF/fv3V05Ojvr06eOzLykpSWfOnOF2HHCRISwBAAAY8MwSAACAAWEJAADAgLAEAABgQFgCAAAwICwBAAAYEJYAAAAMCEsAAAAGhCUAAAADwhIAAIABYQkAAMCAsAQAAGDw/wEiOylzgtFs4wAAAABJRU5ErkJggg==&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Output Image&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;和 $\sin$ 编码的图像有点像，毕竟都是三角函数。&lt;/p&gt;
&lt;p&gt;Sinusoidal 编码还有一些其它优异性质。例如两个位置向量的点积只取决于 $\Delta t$，即两个位置向量的点积可以反映其距离。同时这个点积是无向的。下图展示了一个 Sinusoidal 编码中，中间位置编码和其它位置编码的点积结果。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;orig_len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gen_Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE_dot_product&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Sinusoidal_PE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;plt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sinusoidal_PE_dot_product&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;marker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;o&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;plt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xlabel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pos&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;plt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ylabel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dot product&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;plt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;orig_len&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Figure size 640x480 with 1 Axes&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAksAAAGwCAYAAAC5ACFFAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD&amp;#43;naQAAac9JREFUeJzt3XlYVPXiBvB3ZoBhEYZ9U1TEBXABlyTUypLEXbvdytKrmemttDRs0X4pqZXpLVvMm2Vadktt0xQ1TDH1VggKgqKIoigIDIsIw77MnN8fI1NcEQFn5jAz7&amp;#43;d5zlMezhzekzHzcpbvVyIIggAiIiIiapZU7ABEREREHRnLEhEREVELWJaIiIiIWsCyRERERNQCliUiIiKiFrAsEREREbWAZYmIiIioBVZiBzAHGo0GeXl5cHR0hEQiETsOERERtYIgCCgvL4evry&amp;#43;k0lufP2JZ0oO8vDz4&amp;#43;fmJHYOIiIjaIScnB126dLnl11mW9MDR0RGA9j&amp;#43;2k5OTyGmIiIioNVQqFfz8/HSf47fCsqQHjZfenJycWJaIiIhMzO1uoeEN3kREREQtYFkiIiIiagHLEhEREVELWJaIiIiIWsCyRERERNQCliUiIiKiFrAsEREREbWAZYmIiIioBSxLRERERC3gCN5ERLeg1ghIzCpBYXkNPB1tMdTfFTIpJ8smsjQmdWbp6NGjmDhxInx9fSGRSPDTTz/d9jWHDx/GoEGDIJfL0bNnT3z55Zc3bbN&amp;#43;/Xp0794dtra2CAsLQ2Jiov7DE5FJiU3Lx4jVh/D4xmNYsD0Fj288hhGrDyE2LV/saERkZCZVliorKxESEoL169e3avusrCyMHz8e999/P1JSUrBw4UI8/fTT2L9/v26bb7/9FlFRUYiOjkZycjJCQkIQGRmJwsJCQx0GEXVwsWn5ePbrZOSX1TRZryyrwbNfJ7MwEVkYiSAIgtgh2kMikWDnzp2YMmXKLbd59dVXsXfvXqSlpenWTZ06FaWlpYiNjQUAhIWF4a677sLHH38MANBoNPDz88Pzzz&amp;#43;PxYsXtyqLSqWCQqFAWVkZJ9IlMnFqjYARqw/dVJQaSQB4K2zx26sP8JIckYlr7ee3SZ1Zaqv4&amp;#43;HhEREQ0WRcZGYn4&amp;#43;HgAQF1dHZKSkppsI5VKERERodumObW1tVCpVE0WIjIPiVkltyxKACAAyC&amp;#43;rQWJWifFCEZGozLosKZVKeHl5NVnn5eUFlUqF6upqFBcXQ61WN7uNUqm85X5XrVoFhUKhW/z8/AySn4iMr7D81kWpPdsRkekz67JkKEuWLEFZWZluycnJETsSEemJp6OtXrcjItNn1kMHeHt7o6CgoMm6goICODk5wc7ODjKZDDKZrNltvL29b7lfuVwOuVxukMxEJK6h/q7oJJeholbd7Ncb71ka6u9q3GBEJBqzPrMUHh6OuLi4JusOHDiA8PBwAICNjQ0GDx7cZBuNRoO4uDjdNkRkWRKzSm5ZlADtPUvRE4N5czeRBTGpslRRUYGUlBSkpKQA0A4NkJKSguzsbADay2MzZszQbf/MM8/g0qVLeOWVV3Du3Dn8&amp;#43;9//xnfffYcXX3xRt01UVBQ2btyILVu2ID09Hc8&amp;#43;&amp;#43;ywqKysxa9Ysox4bEYnvemUdXvw2BQAwLMANPormL7XZ25j1SXki&amp;#43;h8m9RN/4sQJ3H///bo/R0VFAQBmzpyJL7/8Evn5&amp;#43;briBAD&amp;#43;/v7Yu3cvXnzxRXz44Yfo0qULPv/8c0RGRuq2eeyxx1BUVIRly5ZBqVQiNDQUsbGxN930TUTmTRAEvPLjKShVNejh4YDPZw6B3ErWZATvmFO52JqQg6jvUhG78B64d&amp;#43;LleCJLYLLjLHUkHGeJyPT9J/4ylu46AxuZFDueG4Z&amp;#43;nRU3bVNTr8akj3/D&amp;#43;YIK3NfbA188eRekvBxHZLI4zhIRUSudU6qwcm86AGDx2MBmixIA2FrLsO7xQZBbSXHkfBE2/55lzJhEJBKWJSKyaNV1ajy/9STqGjS4v48HZg3v3uL2fbwd8fqEYADA6thzSMstM0JKIhITyxIRWbSVe8/iQmEFPBzl&amp;#43;NcjIZBIbn9ZbXpYV4wO9kK9WsDz206isrbBCEmJSCwsS0RksX4&amp;#43;nY&amp;#43;tCdmQSID3Hw1t9Q3bEokEa/4&amp;#43;AD4KW2QVVyJ69xkDJyUiMbEsEZFFyi2txqs/ngIA/PPeAIzo5d6m1zvb2&amp;#43;D9x0IhlQA/JF3FrpRcQ8Qkog6AZYmILE6DWoOF209CVdOAED9nLBrdu137ubuHG&amp;#43;Y/0AsA8H8705B9rUqfMYmog2BZIiKLs&amp;#43;5QJo5fvo5Ocit8NDUU1rL2vxW&amp;#43;8EBPDOnmgoraBjy//STq1Ro9JiWijoBliYgsSmJWCdYdugAAeOuhfujm5nBH&amp;#43;7OSSfHB1FA42VohNacU7x84r4&amp;#43;YRNSBsCwRkcUorarDwu0noRGAhwd1weTQznrZbxcXe7zz8AAAwCdHLuL3zGK97JeIOgaWJSKyCIIgYPGPp5FXVgN/dwcsn9xXr/sf198Hjw/tCkEAXvw2BdcqavW6fyISD8sSEVmErYnZiD2jhLVMgo&amp;#43;mDkQnuf6nxlw2IRg9PTuhsLwWL/9wCpxNisg8sCwRkdk7X1COFTFnAQCvRAaif5fmpzO5U3Y2Mqx7fCBsrKQ4dK4QX/5x2SDfh4iMi2WJiMxaTb12OpPaBg3u7e2B2SP8Dfr9gnyc8H/jggAAq/adw5k8TodCZOpYlojIrL21Nx0ZBeVw72SD9x4JgVR6&amp;#43;&amp;#43;lM7tSM8G6ICPJEnVqD57edRFUdp0MhMmUsS0RktvafUeI/x64AAN57NBQejq2bzuROaadDCYGXkxyXiiqxfPdZo3xfIjIMliUiMkt5pdV45QftdCZz7&amp;#43;2B&amp;#43;3p7GPX7uzpop0ORSIBvT&amp;#43;QgJjXPqN&amp;#43;fiPSHZYmIzI5aI&amp;#43;DFb1NQVl2P/p0VeGl0H1FyDAtwx7yRPQEAr&amp;#43;04jZwSTodCZIpYlojI7Pz710wkZJXAwUaGj248nSaWBRG9MKirM8prG7Bg&amp;#43;0k0cDoUIpPDskREZuXE5RJ8EKedzmTllH7wd7&amp;#43;z6UzulLVMig&amp;#43;nDoSj3ArJ2aX48EY2IjIdLEtEZDbKquuxYHsK1BoBDw3sjL8N6iJ2JACAn6s93v5bfwDAx79mIv7iNZETEVFbsCwRkVkQBAGv7TiN3NJqdHW1xwo9T2dypyaG&amp;#43;OLRIV0gCMDCb0&amp;#43;ipLJO7EhE1EosS0RkFr49noO9p/NhJZXgo8cHwtHWWuxIN3ljUl/08HBAgaoWr3A6FCKTwbJERCYvs7Acb8ScAQC8FNkHoX7O4ga6BXsbK3w0dSBsZFIcTC/QjQFFRB0byxIRmbSaejXmbz2JmnoNRvR0x9x7eogdqUX9OiuweGwgAODNvelIz1eJnIiIbodliYhM2js/n8M5ZTncHGyw9lHjTGdyp2YN744HAj1R16CdDqW6Ti12JCJqAcsSEZmsg2cL8OUflwEA7z4SAk8nW3EDtZJEIsG//j4AHo5yZBZWYMUeTodC1JGxLBGRSSpQ1eDlH1IBALNH&amp;#43;OP&amp;#43;QE&amp;#43;RE7WNWyc5PrgxHcq2xGz8fDpf7EhEdAssS0RkctQaAQu3p&amp;#43;B6VT36&amp;#43;jrhlTHiTGdyp4b3dMcz9wUAAF798RRyS6tFTkREzWFZIiKTs&amp;#43;HIRcRfugZ7GxnWPT4QciuZ2JHaLerB3gjxc4aqpgELOR0KUYfEskREJiU5&amp;#43;zrWHjgPAFg&amp;#43;qS96eHQSOdGdsZZJsW7qQHSSW&amp;#43;H45etYdyhT7EhE9D9YlojIZKhq6vHCtpNQawRMDPHF3wd3jOlM7lRXN3u89VA/AMC6QxeQcInToRB1JCxLRGQSGqczuXq9Gl1c7PDWQ/0gkXT8YQJaa3JoZzw8qAs0ArDw2xSUVnE6FKKOwuTK0vr169G9e3fY2toiLCwMiYmJt9x25MiRkEgkNy3jx4/XbfPkk0/e9PUxY8YY41CIqA2&amp;#43;T7qKPafyIbsxnYlTB5zO5E4tn9wX/u4OyC&amp;#43;rwas/cjoUoo7CpMrSt99&amp;#43;i6ioKERHRyM5ORkhISGIjIxEYWFhs9vv2LED&amp;#43;fn5uiUtLQ0ymQyPPPJIk&amp;#43;3GjBnTZLtt27YZ43CIqJUuFlUgepd2OpOoB3tjUFcXkRMZRie5djoUa5kE&amp;#43;88U4JuEbLEjERFMrCytXbsWc&amp;#43;bMwaxZsxAcHIwNGzbA3t4emzdvbnZ7V1dXeHt765YDBw7A3t7&amp;#43;prIkl8ubbOfi0vIbcW1tLVQqVZOFiAyjtkGN57eeRHW9GsMC3HSP2pur/l0UeHWMdjqUlXvOIkNZLnIiIjKZslRXV4ekpCRERETo1kmlUkRERCA&amp;#43;Pr5V&amp;#43;9i0aROmTp0KBweHJusPHz4MT09P9OnTB88&amp;#43;&amp;#43;yyuXWv55spVq1ZBoVDoFj8/v7YfEBG1yprYDJzNV8HF3hrvPxYKmQlMZ3Knnhruj/t6e6C2QYMXtp1ETT2nQyESk8mUpeLiYqjVanh5eTVZ7&amp;#43;XlBaVSedvXJyYmIi0tDU8//XST9WPGjMFXX32FuLg4rF69GkeOHMHYsWOhVt/6zWnJkiUoKyvTLTk5Oe07KCJq0a/nCrHptywA2ulMvExkOpM7JZVK8O4jIXDvJEdGQTne2psudiQii2YldgBj2bRpE/r374&amp;#43;hQ4c2WT916lTdv/fv3x8DBgxAQEAADh8&amp;#43;jFGjRjW7L7lcDrlcbtC8RJauUFWDl77XTmfy5LDuGBXkdZtXmBcPRznWPhqCGZsT8Z9jVzCilzsi&amp;#43;3qLHYvIIpnMmSV3d3fIZDIUFBQ0WV9QUABv75bfQCorK7F9&amp;#43;3bMnj37tt&amp;#43;nR48ecHd3R2YmB4YjEotGIyDqu1Rcq6xDkI8TFo8NFDuSKO7t7YF/3tsDAPDKD6eQx&amp;#43;lQiERhMmXJxsYGgwcPRlxcnG6dRqNBXFwcwsPDW3zt999/j9raWkyfPv223&amp;#43;fq1au4du0afHx87jgzEbXPZ/&amp;#43;9hN8yi2FnrZ3OxNbadKczuVOLRvfBgC4KlFXXY&amp;#43;G3KVBrOJwAkbGZTFkCgKioKGzcuBFbtmxBeno6nn32WVRWVmLWrFkAgBkzZmDJkiU3vW7Tpk2YMmUK3NzcmqyvqKjAyy&amp;#43;/jGPHjuHy5cuIi4vD5MmT0bNnT0RGRhrlmIioqZScUry7PwMAED0xGD09TXs6kztlYyXFR1MHwsFGhsSsEqz/lWe9iYzNpO5Zeuyxx1BUVIRly5ZBqVQiNDQUsbGxupu&amp;#43;s7OzIZU27X8ZGRn47bff8Msvv9y0P5lMhlOnTmHLli0oLS2Fr68vRo8ejZUrV/KeJCIRlN&amp;#43;YzqRBI2B8fx88dhefNAWA7u4OWDmlH6K&amp;#43;S8UHB89jWIAbhnR3FTsWkcWQCBwi9o6pVCooFAqUlZXByclJ7DhEJkkQBCz8NgW7UvLQ2dkO&amp;#43;xbcA4Wd&amp;#43;Y3SfSde/DYFO0/mav/7vHAPFPb870N0J1r7&amp;#43;W1Sl&amp;#43;GIyHztSM7FrpS8G9OZhLIoNWPF5L7o5maP3NJqLNnJ6VCIjIVliYhEl1VciWW70gAAC0f1wuBuvMTUHEdba3w0dSCspBLsO63Et8c5xhuRMbAsEZGo6m6MUl1Zp0aYvyueu7&amp;#43;n2JE6tBA/Z7wc2QcA8EbMGWQWcjoUIkNjWSIiUb37SwZO55bB2d4aH0y1jOlM7tSce3rgnl7uqKnXYP5WTodCZGgsS0QkmiPni/DZ0UsAgDUPD4CPwk7kRKZBKpXgvUdD4OZgg3PKcrzz8zmxIxGZNZYlIhJFUXktFn2XAgCYEd4NozmVR5t4Otri3UdDAABf/nEZB88W3OYVRNReLEtEZHQajYBF36eiuKIOgd6OeG1ckNiRTNL9fTzx9Ah/AMDLP6RCWVYjciIi88SyRERGt&amp;#43;m3LBw9XwS5ldTipzO5Uy&amp;#43;P6YO&amp;#43;vk64XlWPFzkdCpFBsCwRkVGdulqKNfu199gsmxiMXl6OIicybXIr7fx59jYyxF&amp;#43;6hg1HLoodicjssCwRkdFU1DbghW0nUa8WMKavN54Y2lXsSGahh0cnLJ/UFwCw9sB5JF25LnIiIvPCskRERhO96wwuX6uCr8IW7zzcHxIJhwnQl78P7oJJIb5QawQs2H4Sqpp6sSMRmQ2WJSIyip9O5uLH5KuQSoAPpg6Es72N2JHMikQiwZsP9YOfqx2uXq/GaztOczoUIj1hWSIig7tyrRKv/6SdzuSFUb0w1J/TmRiC01&amp;#43;mQ9lzKh/fJ10VOxKRWWBZIiKDapzOpKK2AUO7u2I&amp;#43;pzMxqIFdXRA1ujcA7WXPi0UVIiciMn0sS0RkUGsPnEfq1TIo7Kzx/tRQWMn4tmNoz9wbgOE93VBdr8bzW0&amp;#43;itoHToRDdCb5rEZHB/PdCke5R9tUP90dnZ05nYgxSqQRrHw2Fq4MNzuarsPrnDLEjEZk0liUiMojiilpEfZcKAJgW1hVj&amp;#43;vmInMiyeDnZ4t1HBgAANv&amp;#43;ehUPnOB0KUXuxLBGR3mk0Al76PhVF5bXo5dkJr48PFjuSRXog0AtPDusOAHjp&amp;#43;1MoVHE6FKL2YFkiIr374o/LOJxRBBsrKdY9MRB2NpzORCyLxwYiyMcJJZV1iPouFRpOh0LUZixLRKRXabllWP2zdjqTpeODEOjtJHIiy2ZrrZ0Oxc5aht8yi/HZfy&amp;#43;JHYnI5LAsEZHeVN6YzqROrcGDwV6Yfnc3sSMRgJ6enfDGJO2l0Hf3ZyAlp1TcQEQmhmWJiPRmecwZXCquhLeTLdY8PIDTmXQgjw7xw/gBPmjQCHhh20mUczoUolZjWSIivdidmofvTlyFRAJ8MDUULg6czqQjkUgkePsh7fAN2SVVeP2nNE6HQtRKVmIHICLTpNYISMwqQWF5DSQAXttxGgDw/P09cXcPN3HDUbMUdtb46PFQPPrpMexKycOInu7o4mKPwvIaeDraYqi/K2RSng0k&amp;#43;l8sS0TUZrFp&amp;#43;Vgecxb5ZU0fRe/h4YAXRvUSKRW1xuBurngxohfe/eU8XvnhFP56bslHYYvoicEcE4vof/AyHBG1SWxaPp79OvmmogQAl4oqcTCdgx92dD3cOwEA/vcinLKsBs9&amp;#43;nYzYtHzjhyLqwFiWiKjV1BoBy2PO3vQh20gCYHnMWag5lk&amp;#43;HpdYIWLn3bLNfa/xb498hUVMsS0TUaolZJc2eUWokAMgvq0FiVonxQlGb8O&amp;#43;QqO1Yloio1QrLWzddRmu3I&amp;#43;Pj3yFR27EsEVGreTra6nU7Mj7&amp;#43;HRK1HcsSEbXaUH9X&amp;#43;ChscauHyyXQPlE11N/VmLGoDfh3SNR2JleW1q9fj&amp;#43;7du8PW1hZhYWFITEy85bZffvklJBJJk8XWtulvS4IgYNmyZfDx8YGdnR0iIiJw4cIFQx8GkUmSSSWInhjc7A3ejR&amp;#43;&amp;#43;0RODOVZPB9b4dwjgloWJf4dETZlUWfr2228RFRWF6OhoJCcnIyQkBJGRkSgsLLzla5ycnJCfn69brly50uTra9aswUcffYQNGzYgISEBDg4OiIyMRE0Nr9cTNWdMPx&amp;#43;MCvS8ab23whafTB/EMXpMwJh&amp;#43;Pvhk&amp;#43;iB4K5r&amp;#43;8iiTSvDvafw7JPpfJjUo5dq1azFnzhzMmjULALBhwwbs3bsXmzdvxuLFi5t9jUQigbe3d7NfEwQBH3zwAV5//XVMnjwZAPDVV1/By8sLP/30E6ZOndrs62pra1FbW6v7s0qlupPDIjIpGo2AM3na/&amp;#43;ejHuyNbm72HP3ZBI3p54MHg72RmFWCnOtV&amp;#43;L8dp1GvEdDFxV7saEQdjsmcWaqrq0NSUhIiIiJ066RSKSIiIhAfH3/L11VUVKBbt27w8/PD5MmTcebMGd3XsrKyoFQqm&amp;#43;xToVAgLCysxX2uWrUKCoVCt/j5&amp;#43;d3h0RGZjsTLJVCqauBoa4V/3tcDk0M7IzzAjUXJBMmkEoQHuOHRIX4Y3U/7S&amp;#43;WulFyRUxF1PCZTloqLi6FWq&amp;#43;Hl5dVkvZeXF5RKZbOv6dOnDzZv3oxdu3bh66&amp;#43;/hkajwbBhw3D16lUA0L2uLfsEgCVLlqCsrEy35OTk3MmhEZmUXSl5AICx/bwht5KJnIb0ZVKILwBgz6l8aDggJVETJnUZrq3Cw8MRHh6u&amp;#43;/OwYcMQFBSETz/9FCtXrmz3fuVyOeRyuT4iEpmUugYNfr4xFcakkM4ipyF9GtnHA462VlCqapB4uYSTIRP9hcmcWXJ3d4dMJkNBQdN5pwoKCm55T9L/sra2xsCBA5GZmQkAutfdyT6JLMlvmUUoraqHeyc5wgP4YWpO5FYyjNVdissTOQ1Rx2IyZcnGxgaDBw9GXFycbp1Go0FcXFyTs0ctUavVOH36NHx8tE96&amp;#43;Pv7w9vbu8k&amp;#43;VSoVEhISWr1PIkvS&amp;#43;CE6YYAP71EyQ41nC39Oy0ddg0bkNEQdh8mUJQCIiorCxo0bsWXLFqSnp&amp;#43;PZZ59FZWWl7um4GTNmYMmSJbrtV6xYgV9&amp;#43;&amp;#43;QWXLl1CcnIypk&amp;#43;fjitXruDpp58GoH1SbuHChXjzzTexe/dunD59GjNmzICvry&amp;#43;mTJkixiESdVhVdQ04cFZ7FnZSqK/IacgQwgPc4N5JjtKqevyWWSR2HKIOw6TuWXrsscdQVFSEZcuWQalUIjQ0FLGxsbobtLOzsyGV/tn/rl&amp;#43;/jjlz5kCpVMLFxQWDBw/GH3/8geDgYN02r7zyCiorKzF37lyUlpZixIgRiI2NvWnwSiJLdzC9EFV1avi52mGgn7PYccgAZFIJJgzwwZd/XMaulDw8EOh1&amp;#43;xcRWQCJIAh87OEOqVQqKBQKlJWVwcnJSew4RAbx9JYTOJhegHn3B&amp;#43;DlyECx45CBJGdfx9/&amp;#43;/QfsbWRIev1B2NnwiUcyX639/Dapy3BEJI6yqnocOa8dKZ9PwZm3gX7O8HO1Q1WdGgfTC27/AiILwLJERLf1c1o&amp;#43;6tUCAr0d0cfbUew4ZEASiUQ35hKfiiPSYlkiotvanar90JwYwhu7LUHj2cMj5wtRVlUvchoi8bEsEVGLClU1iL90DcCfozyTeevj7Yg&amp;#43;Xo6oVwuIPZMvdhwi0bEsEVGLYk7lQxCAQV2d4efKSVYtRePwELwUR8SyRES30XgJjmeVLEvj33f8pWsoVNWInIZIXCxLRHRLV65VIjWnFFIJMH4Ay5Il8XO1x8CuzhAE7eS6RJaMZYmIbmn3jUsww3u6w8ORk0dbmsmNT8Wl8lIcWTaWJSJqliAIfArOwo0f4AupBEjNKcWVa5VixyESDcsSETXrnLIcFworYCOTIrKvt9hxSAQejnIM7&amp;#43;kOAIjh2SWyYCxLRNSsxqeg7g/0gMLOWuQ0JJaJfxmgkrNjkaViWSKimwiCoDuTwOlNLFtkX2/YyKS4UFiBc8pyseMQiYJliYhukpx9Hbml1XCwkWFUkKfYcUhECjtr3B/oAYBjLpHlYlkiops0fihG9vWGrTVnnbd0jWcXY1J5KY4sE8sSETXRoNZg32ntuDoTQ/kUHAGjgjzhYCNDbmk1krOvix2HyOhYloioiT8uXkNxRR1c7K0x4saTUGTZbK1luicieSmOLBHLEhE10fhhOH6AD6xlfIsgrcazjPtO56NBrRE5DZFx8Z2QiHRq6tX45YwSAJ&amp;#43;Co6ZG9HSHi701iivq8MfFa2LHITIqliUi0jmcUYjy2gb4KmwxpJuL2HGoA7GWSTF&amp;#43;gA8AXoojy8OyREQ6jR&amp;#43;CE0N8IZVKRE5DHU3j2cZfzihRU68WOQ2R8bAsEREAoLymHnHnCgFwLjhq3pBuLvBR2KK8tgGHMwrFjkNkNCxLRAQA&amp;#43;OVMAeoaNAjwcEBfXyex41AHJJVKMOkv058QWQqWJSICAOz6y/QmEgkvwVHzGs86xp0rRHlNvchpiIyDZYmIcK2iFr9nFgMAJnEgSmpBX18n9PBwQF2DBr&amp;#43;cKRA7DpFRsCwREfadzodaI2BAFwX83R3EjkMdmEQiweQbN3o3no0kMncsS0Sku/9kEm/splZoPPv4e2YxrlXUipyGyPBYlogs3NXrVThx5TokEmDCAJYluj1/dwcM6KKAWiPo5hEkMmcsS0QWLiZV&amp;#43;2EX5u8Kb4WtyGnIVPCpOLIkLEtEFm73X56CI2qtCQN8IZEAJ65cR25ptdhxiAyKZYnIgl0oKEd6vgpWUgnG9vMWOw6ZEG&amp;#43;FLcL8XQEAMbzRm8wcyxKRBWs8q3Rfbw&amp;#43;4ONiInIZMTePZSF6KI3NncmVp/fr16N69O2xtbREWFobExMRbbrtx40bcc889cHFxgYuLCyIiIm7a/sknn4REImmyjBkzxtCHQSQ6QRD&amp;#43;vATHsZWoHcb284aVVIL0fBUuFJSLHYfIYEyqLH377beIiopCdHQ0kpOTERISgsjISBQWNj9H0eHDh/H444/j119/RXx8PPz8/DB69Gjk5uY22W7MmDHIz8/XLdu2bTPG4RCJ6tTVMly5VgVbaykigrzEjkMmyMXBBvf19gDw51lKInNkUmVp7dq1mDNnDmbNmoXg4GBs2LAB9vb22Lx5c7Pbf/PNN3juuecQGhqKwMBAfP7559BoNIiLi2uynVwuh7e3t25xcXExxuEQiarx0smDwd5wkFuJnIZMVeNZyd2peRAEQeQ0RIZhMmWprq4OSUlJiIiI0K2TSqWIiIhAfHx8q/ZRVVWF&amp;#43;vp6uLq6Nll/&amp;#43;PBheHp6ok&amp;#43;fPnj22Wdx7dq1FvdTW1sLlUrVZCEyJWqNgD2nOBAl3bmIIC/YWktx5VoVTl0tEzsOkUGYTFkqLi6GWq2Gl1fTywVeXl5QKpWt2serr74KX1/fJoVrzJgx&amp;#43;OqrrxAXF4fVq1fjyJEjGDt2LNRq9S33s2rVKigUCt3i5&amp;#43;fXvoMiEklC1jUUltfCydYK9/Z2FzsOmTAHuRUeDNY&amp;#43;SckbvclcmUxZulPvvPMOtm/fjp07d8LW9s&amp;#43;B96ZOnYpJkyahf//&amp;#43;mDJlCvbs2YPjx4/j8OHDt9zXkiVLUFZWpltycnKMcARE&amp;#43;rP7xofauP4&amp;#43;kFvJRE5Dpq7x7OSeU3lQa3gpjsxPm8vSihUrUFVVddP66upqrFixQi&amp;#43;hmuPu7g6ZTIaCgqazXBcUFMDbu&amp;#43;XxYd5991288847&amp;#43;OWXXzBgwIAWt&amp;#43;3Rowfc3d2RmZl5y23kcjmcnJyaLESmoq5Bg5/TtGdjeQmO9OHe3u5wsrVCYXktErJavo2ByBS1uSwtX74cFRUVN62vqqrC8uXL9RKqOTY2Nhg8eHCTm7Mbb9YODw&amp;#43;/5evWrFmDlStXIjY2FkOGDLnt97l69SquXbsGHx8fveQm6miOni9CWXU9PB3lCOvhJnYcMgNyKxnG9de&amp;#43;Z&amp;#43;7mpTgyQ20uS4IgQCKR3LQ&amp;#43;NTX1phun9S0qKgobN27Eli1bkJ6ejmeffRaVlZWYNWsWAGDGjBlYsmSJbvvVq1dj6dKl2Lx5M7p37w6lUgmlUqkrexUVFXj55Zdx7NgxXL58GXFxcZg8eTJ69uyJyMhIgx4LkVh23XjEe8IAX8ikN/8sE7VH41nKn9OUqGvQiJyGSL9a/bywi4uLbtDG3r17NylMarUaFRUVeOaZZwwSstFjjz2GoqIiLFu2DEqlEqGhoYiNjdXd9J2dnQ2p9M/&amp;#43;98knn6Curg5///vfm&amp;#43;wnOjoab7zxBmQyGU6dOoUtW7agtLQUvr6&amp;#43;GD16NFauXAm5XG7QYyESQ1VdAw6e1V7K5kCUpE9hPdzg6ShHYXktjp4vQkQwx&amp;#43;4i8yERWjkwxpYtWyAIAp566il88MEHUCgUuq/Z2Nige/fuLV4OM2cqlQoKhQJlZWW8f4k6tF0puViwPQXd3Oxx&amp;#43;KWRzZ4lJmqvFTFnsfn3LEwM8cW6xweKHYfotlr7&amp;#43;d3qM0szZ84EAPj7&amp;#43;2P48OGwsuIgdkSmpvF&amp;#43;kkkhvixKpHeTQn2x&amp;#43;fcsHDxbgKq6Btjb8HOCzEOb71mqrKy8aQRsANi/fz9&amp;#43;/vlnvYQiIv0rrarD0QtFAPgUHBlGSBcFurnZo7pejQNnC27/AiIT0eaytHjx4mYHbBQEAYsXL9ZLKCLSv5/TlKhXCwjycUIvL0ex45AZkkgkuiLOp&amp;#43;LInLS5LF24cAHBwcE3rQ8MDGxxbCIiEteuFO0E0jyrRIbU&amp;#43;P/X0QtFKK2qEzkNkX60uSwpFApcunTppvWZmZlwcHDQSygi0i9lWQ0SskoAABNDOIYYGU4vL0cE&amp;#43;TihXi3oBj8lMnVtLkuTJ0/GwoULcfHiRd26zMxMLFq0CJMmTdJrOCLSjz2n8iAIwJBuLujiYi92HDJzjWeXGs9mEpm6NpelNWvWwMHBAYGBgfD394e/vz&amp;#43;CgoLg5uaGd9991xAZiegO7b4xECXHViJjaDx7mZBVAmVZjchpiO5cm5/rVCgU&amp;#43;OOPP3DgwAGkpqbCzs4OAwYMwL333muIfER0h7KKK3HqahlkUoluSgoiQ&amp;#43;riYo8h3Vxw4sp17DmVh6fv6SF2JKI70q5BMCQSCUaPHo3Ro0frOw8R6VnMjbNKw3u6w70TR6Yn45gU6osTV65jdyrLEpm&amp;#43;NpelFStWtPj1ZcuWtTsMEemXIAh8Co5EMa6/D5bHnMWpq2XIKq6EvzsfACLT1eaytHPnziZ/rq&amp;#43;vR1ZWFqysrBAQEMCyRNSBnM1X4WJRJWyspIjsy7m6yHjcO8kxvKc7jp4vwu6UPCyI6CV2JKJ2a3NZOnny5E3rVCoVnnzySTz00EN6CUVE&amp;#43;tF4Y/eoQE842lqLnIYszaQQX21ZSs3FC6N6coodMlltfhquOU5OTli&amp;#43;fDmWLl2qj90RkR5oNAJi/jIXHJGxRfb1go2VFBeLKnE2XyV2HKJ200tZAoCysjKUlZXpa3dEdIeSsq8jr6wGneRWuD/QU&amp;#43;w4ZIEcba0x6sb/e5z&amp;#43;hExZmy/DffTRR03&amp;#43;LAgC8vPz8Z///Adjx47VWzAiujONH06Rfb1hay0TOQ1Zqkkhvvg5TYmY1Dy8OiYQUikvxZHpaXNZev/995v8WSqVwsPDAzNnzsSSJUv0FoyI2q9ercHe0/kAOBAliev&amp;#43;QE84yq2QV1aDpOzruKu7q9iRiNqszWUpKyvLEDmISI9&amp;#43;zyxGSWUd3BxsMDzATew4ZMFsrWUY3dcbPyZfxa6UXJYlMkl6u2eJiDqOxktw4wf4wErGH3MSV&amp;#43;PZzX2nlahXa0ROQ9R2rTqz9Le//a3VO9yxY0e7wxDRnaupV2P/Ge1s73wKjjqC4QFucHOwwbXKOvyeWYyRffjAAZmWVv3KqVAodIuTkxPi4uJw4sQJ3deTkpIQFxcHhUJhsKBE1DqHzhWisk6Nzs52GNTVRew4RLCSSTF&amp;#43;gHZeQj4VR6aoVWeWvvjiC92/v/rqq3j00UexYcMGyGTaJ2zUajWee&amp;#43;45ODk5GSYlEbVa4/QmE0N8&amp;#43;eQRdRiTQnzxVfwV7D&amp;#43;jRE29mk9okklp880MmzdvxksvvaQrSgAgk8kQFRWFzZs36zUcEbWNqqYev2YUAeAlOOpYBnV1QWdnO1TWqXHoXKHYcYjapM1lqaGhAefOnbtp/blz56DR8MY9IjHtT1OirkGDXp6dEOTjKHYcIh2pVIKJNwp849lPIlPR5qEDZs2ahdmzZ&amp;#43;PixYsYOnQoACAhIQHvvPMOZs2apfeARNR6jXPBTQrx5Txc1OFMCvHFhiMX8WtGEVQ19XDifIVkItpclt599114e3vjvffeQ36&amp;#43;dtA7Hx8fvPzyy1i0aJHeAxJR6xSV1&amp;#43;L3zGIA0P0GT9SRBPk4opdnJ1worMD&amp;#43;NCUeGeIndiSiVmnzZTipVIpXXnkFubm5KC0tRWlpKXJzc/HKK680uY&amp;#43;JiIxr3&amp;#43;l8aAQgxM8Z3d0dxI5DdBOJRKK7l67xLCiRKWj3aHVFRUU4deoUTp06heLiYn1mIqJ2aLwPhDd2U0fWeNbz98xiFJXXipyGqHXaXJYqKyvx1FNPwcfHB/feey/uvfde&amp;#43;Pj4YPbs2aiqqjJERiK6jZySKiRnl0IiASbcGM&amp;#43;GqCPq7u6AED9naATt2VAiU9DmshQVFYUjR44gJiZGdxlu165dOHLkCO9ZIhJJzCntJY3wHm7wcrIVOQ1RyybxqTgyMW0uSz/&amp;#43;&amp;#43;CM2bdqEsWPHwsnJCU5OThg3bhw2btyIH374wRAZieg2GkdF5iU4MgUTBvhAIgGSs0uRU8IrEtTxtbksVVVVwcvL66b1np6evAxHJILzBeU4pyyHtUyCsf14CY46Pi8nW4T3cAPAG73JNLS5LIWHhyM6Oho1NTW6ddXV1Vi&amp;#43;fDnCw8P1Gq4569evR/fu3WFra4uwsDAkJia2uP3333&amp;#43;PwMBA2Nraon///ti3b1&amp;#43;TrwuCgGXLlsHHxwd2dnaIiIjAhQsXDHkIRHrVeFbpvt6eUNhz3BoyDY1nQWNYlsgEtLksffDBB/j999/RpUsXjBo1CqNGjYKfnx/&amp;#43;&amp;#43;OMPfPjhh4bIqPPtt98iKioK0dHRSE5ORkhICCIjI1FY2PzQ&amp;#43;X/88Qcef/xxzJ49GydPnsSUKVMwZcoUpKWl6bZZs2YNPvroI2zYsAEJCQlwcHBAZGRkkzJI1FEJgvDnQJShvARHpmNsPx9YyyQ4pyxHhrJc7DhELZIIgiC09UVVVVX45ptvdNOeBAUFYdq0abCzs9N7wL8KCwvDXXfdhY8//hgAoNFo4Ofnh&amp;#43;effx6LFy&amp;#43;&amp;#43;afvHHnsMlZWV2LNnj27d3XffjdDQUGzYsAGCIMDX1xeLFi3CSy&amp;#43;9BAAoKyuDl5cXvvzyS0ydOrVVuVQqFRQKBcrKyjiZMBnVyezreOjff8DOWoakpRGwt2nzOLNEonl6ywkcTC/AvPsD8HJkoNhxyAK19vO7TWeW6uvrERAQgCtXrmDOnDl477338N577&amp;#43;Hpp582eFGqq6tDUlISIiIidOukUikiIiIQHx/f7Gvi4&amp;#43;ObbA8AkZGRuu2zsrKgVCqbbKNQKBAWFnbLfQJAbW0tVCpVk4VIDI1nlUb39WJRIpPTeDY0JjUf7fi9ncho2lSWrK2tRbs8VVxcDLVafdPN5V5eXlAqlc2&amp;#43;RqlUtrh94z/bsk8AWLVqFRQKhW7x8&amp;#43;OQ/WR8ao2APae049TwKTgyRRFBnrC3kSG7pAopOaVixyG6pTbfszRv3jysXr0aDQ0NhshjEpYsWYKysjLdkpOTI3YkskDHLl1DUXktFHbWuKeXh9hxiNrM3sYKDwZrf1ndlcIbvanjavN5&amp;#43;&amp;#43;PHjyMuLg6//PIL&amp;#43;vfvDweHpnNQ7dixQ2/h/srd3R0ymQwFBQVN1hcUFMDb27vZ13h7e7e4feM/CwoK4OPj02Sb0NDQW2aRy&amp;#43;WQy&amp;#43;XtOQwivWl8Cm5cfx/YWLV75iIiUU0K8cWulDzsPZ2PpROCIZNKxI5EdJM2v8M6Ozvj4YcfRmRkJHx9fZtcjlIoFIbICACwsbHB4MGDERcXp1un0WgQFxd3yyELwsPDm2wPAAcOHNBt7&amp;#43;/vD29v7ybbqFQqJCQkGGUYBKL2qm1QY18aL8GR6bunlwec7a1RVF6LY5euiR2HqFltPrP0xRdfGCJHq0RFRWHmzJkYMmQIhg4dig8&amp;#43;&amp;#43;ACVlZWYNWsWAGDGjBno3LkzVq1aBQBYsGAB7rvvPrz33nsYP348tm/fjhMnTuCzzz4DoJ0Be&amp;#43;HChXjzzTfRq1cv&amp;#43;Pv7Y&amp;#43;nSpfD19cWUKVPEOkyi2zqSUYTymgZ4Ockx1N9V7DhE7WZjJcXYfj7YlpiNXSm5GN7TXexIRDdp9&amp;#43;MzhYWFyMjIAAD06dMHnp6eegt1K4899hiKioqwbNkyKJVKhIaGIjY2VneDdnZ2NqTSP0&amp;#43;WDRs2DFu3bsXrr7&amp;#43;O1157Db169cJPP/2Efv366bZ55ZVXUFlZiblz56K0tBQjRoxAbGwsbG05vxZ1XI1PwU0c4MvLFmTyJoX4YltiNn5OU2LllH6QW8nEjkTURJvHWVKpVJg3bx62b98OtVoNAJDJZHjsscewfv16g16K66g4zhIZU2VtAwa/eQA19Rrsnj8cA7o4ix2J6I6oNQKGv3MISlUNPvvHYIzu2/x9qET6ZpBxlgBgzpw5SEhIwJ49e1BaWorS0lLs2bMHJ06cwD//&amp;#43;c87Ck1Et3fgbAFq6jXo7maP/p0t75cTMj8yqQQTBmgfstnF6U&amp;#43;oA2pzWdqzZw82b96MyMhIODk5wcnJCZGRkdi4cSNiYmIMkZGI/uLP6U06QyLhJTgyD40DVMalF6Cy1nKHpqGOqc1lyc3NrdlLbQqFAi4uLnoJRUTNu15Zh6PniwDwKTgyL/07K&amp;#43;Dv7oCaeg0OnC24/QuIjKjNZen1119HVFRUkxGulUolXn75ZSxdulSv4YioqX1p&amp;#43;WjQCAj2cUJPz05ixyHSG4lEgok3fgHYlZIrchqiptr8NNwnn3yCzMxMdO3aFV27dgWgfQpNLpejqKgIn376qW7b5ORk/SUlIt1AlJNDeVaJzM&amp;#43;kEF98FHcB/71QjOuVdXBxsBE7EhGAdpQljj9EJI78smokXi4BAEzgJTgyQz09O6GvrxPO5KmwLy0f08K6iR2JCEA7ylJ0dLQhchDRbexJzYcgAEO7u6Kzs53YcYgMYlKIL87kqbArJY9liToMTihFZCJ2pWrv45jIS3BkxhrvWzp&amp;#43;uQR5pdUipyHSYlkiMgGXiiqQlquCTCrBuH4csI/Ml6&amp;#43;zHYZ2d4UgAHtOccwl6hhYlohMQOPYSvf0codbJ7nIaYgMq/Hs6W4OUEkdBMsSUQcnCILuKTiOrUSWYHx/H1hJJUjLVeFiUYXYcYjaXpZWrFiBqqqqm9ZXV1djxYoVeglFRH86k6fCpeJKyK2knDOLLIKrgw1G9HIH8OdwGURianNZWr58OSoqbm76VVVVWL58uV5CEdGfGi9FRAR5oZO8zQ&amp;#43;wEpmkxrOoMal5aON870R61&amp;#43;ayJAhCs/NRpaamwtXVVS&amp;#43;hiEhLoxEQc6MsTeQlOLIgo/t6Q24lxaXiSpzJU4kdhyxcq39NdXFxgUQigUQiQe/evZsUJrVajYqKCjzzzDMGCUlkqY5fLkF&amp;#43;WQ0c5VYY2cdD7DhERtNJboWIIC/sPZ2PXSm56Nf55jlJiYyl1WXpgw8&amp;#43;gCAIeOqpp7B8&amp;#43;fImk&amp;#43;na2Nige/fuCA8PN0hIIkvVeAluTD9v2FrLRE5DZFwTQ3yx93Q&amp;#43;9pzKx5KxQZBKb76qQWQMrS5LM2fOBAD4&amp;#43;/tj2LBhsLa2NlgoIgLq1RrsO50PAJjEgSjJAo3s4wFHWyvkl9Xg&amp;#43;OUShPVwEzsSWag23y163333Qa1W48cff0R6ejoAoG/fvpg0aRJkMv7mS6Qvv10oxvWqerh3skE4PyTIAtlayzCmrze&amp;#43;T7qKXal5LEskmjbf4J2ZmYmgoCDMmDEDO3bswI4dOzB9&amp;#43;nT07dsXFy9eNERGIovUeAluwgBfWMk4JBpZpsazqj&amp;#43;fzke9WiNyGrJUbX4HfuGFFxAQEICcnBwkJycjOTkZ2dnZ8Pf3xwsvvGCIjEQWp7pOjf1nlAD4FBxZtvAebnDvJMf1qnr8dqFY7Dhkodpclo4cOYI1a9Y0GSbAzc0N77zzDo4cOaLXcESWKu5cAarq1OjiYodBXZ3FjkMkGiuZFBMG&amp;#43;AAAdqXkipyGLFWby5JcLkd5eflN6ysqKmBjY6OXUESW7q/TmzQ3rhmRJWk8u/rL2QJU16lFTkOWqM1lacKECZg7dy4SEhIgCAIEQcCxY8fwzDPPYNKkSYbISGRRyqrrcTijCACfgiMCgEFdndHFxQ5VdWrEnSsQOw5ZoDaXpY8&amp;#43;&amp;#43;ggBAQEIDw&amp;#43;Hra0tbG1tMXz4cPTs2RMffvihITISWZT9aUrUqTXo7dUJgd5OYschEp1EItFNf7KLc8WRCNo8dICzszN27dqFCxcu4Ny5cwCAoKAg9OzZU&amp;#43;/hiCxR41Nwk0M7i5yEqOOYHNoZ/z58EUcyilBWXQ&amp;#43;FHcf6I&amp;#43;Np96ycvXr1Qq9evfSZhcjiFZbX4I&amp;#43;L2id&amp;#43;Jg7gJTiiRn28HdHHyxEZBeXYn6bEo3f5iR2JLEirylJUVFSrd7h27dp2hyGydHtP5UMjAKF&amp;#43;zujqZi92HKIOZVKoL/61PwO7UnNZlsioWlWWTp482eTPycnJaGhoQJ8&amp;#43;fQAA58&amp;#43;fh0wmw&amp;#43;DBg/WfkMiC/HkJjmeViP7XpBBtWYq/eA2Fqhp4OtmKHYksRKvK0q&amp;#43;//qr797Vr18LR0RFbtmyBi4sLAOD69euYNWsW7rnnHsOkJLIA2deqcDK7FFIJMP7GuDJE9Cc/V3sM7OqMk9ml2HMqH0&amp;#43;N8Bc7ElmINj8N995772HVqlW6ogQALi4uePPNN/Hee&amp;#43;/pNRyRJYk5pT2rNCzAHZ6O/I2ZqDmNT8U1noUlMoY2lyWVSoWioqKb1hcVFTU7WCURtc5fB6IkouaNH&amp;#43;ADqQRIySlF9rUqseOQhWhzWXrooYcwa9Ys7NixA1evXsXVq1fx448/Yvbs2fjb3/5miIwAgJKSEkybNg1OTk5wdnbG7NmzUVFR0eL2zz//PPr06QM7Ozt07doVL7zwAsrKyppsJ5FIblq2b99usOMgas45pQoZBeWwkUkR2c9b7DhEHZanoy2GBbgDAHancvoTMo42Dx2wYcMGvPTSS3jiiSdQX1&amp;#43;v3YmVFWbPno1//etfeg/YaNq0acjPz8eBAwdQX1&amp;#43;PWbNmYe7cudi6dWuz2&amp;#43;fl5SEvLw/vvvsugoODceXKFTzzzDPIy8vDDz/80GTbL774AmPGjNH92dnZ2WDHQdScxrNKI/t4cPwYotuYFOKL3zKLsTs1D/Mf4BA2ZHgSQRCE9rywsrISFy9eBAAEBATAwcFBr8H&amp;#43;Kj09HcHBwTh&amp;#43;/DiGDBkCAIiNjcW4ceNw9epV&amp;#43;Pq27rLF999/j&amp;#43;nTp6OyshJWVtqeKJFIsHPnTkyZMqXd&amp;#43;VQqFRQKBcrKyuDkxBGXqW0EQcA9a37F1evV&amp;#43;PiJgZjA8ZWIWlRWXY&amp;#43;73jyIOrUGsQvv4Uj31G6t/fxu82W4Rg4ODhgwYAAGDBhg0KIEAPHx8XB2dtYVJQCIiIiAVCpFQkJCq/fT&amp;#43;B&amp;#43;jsSg1mjdvHtzd3TF06FBs3rwZt&amp;#43;uPtbW1UKlUTRai9krOLsXV69VwsJFhVKCX2HGIOjyFnTVG9vEAwOlPyDjaXZaMSalUwtPTs8k6KysruLq6QqlUtmofxcXFWLlyJebOndtk/YoVK/Ddd9/hwIEDePjhh/Hcc89h3bp1Le5r1apVUCgUusXPj4OjUfvF3HiqZ3Rfb9jZyEROQ2QaGieZjknNu&amp;#43;0vuER3StSytHjx4mZvsP7r0jj/3J1QqVQYP348goOD8cYbbzT52tKlSzF8&amp;#43;HAMHDgQr776Kl555ZXb3nu1ZMkSlJWV6ZacnJw7zkiWqUGtwZ5TfAqOqK1GBXrBwUaGq9erkZxdKnYcMnPtnhtOHxYtWoQnn3yyxW169OgBb29vFBYWNlnf0NCAkpISeHu3/ORQeXk5xowZA0dHR&amp;#43;zcuRPW1i3fPBsWFoaVK1eitrYWcrm82W3kcvktv0bUFvGXrqG4og4u9tYY0ctd7DhEJsPORobRfb2x82QudqfkYnA3l9u/iKidRC1LHh4e8PDwuO124eHhKC0tRVJSkm5KlUOHDkGj0SAsLOyWr1OpVIiMjIRcLsfu3btha3v7gf5SUlLg4uLCMkRG0fgU3Lj&amp;#43;PrCWmcRVcaIOY1KoL3aezMXe0/lYOiEYVvwZIgMxif&amp;#43;zgoKCMGbMGMyZMweJiYn4/fffMX/&amp;#43;fEydOlX3JFxubi4CAwORmJgIQFuURo8ejcrKSmzatAkqlQpKpRJKpRJqtRoAEBMTg88//xxpaWnIzMzEJ598grfffhvPP/&amp;#43;8aMdKlqOmXo3YNO09d7wER9R2I3q6w8XeGsUVdYi/dE3sOGTGRD2z1BbffPMN5s&amp;#43;fj1GjRkEqleLhhx/GRx99pPt6fX09MjIyUFWlHdE1OTlZ96Rcz549m&amp;#43;wrKysL3bt3h7W1NdavX48XX3wRgiCgZ8&amp;#43;eWLt2LebMmWO8AyOLdTijCOW1DfBR2OKu7q5ixyEyOdYyKcb198E3CdnYlZKHe3rd/koFUXu0e5wl&amp;#43;hPHWaL2mPdNMvaezsfce3vgtXFBYschMkmJWSV49NN4OMqtcPz1CNha84lSaj2Dj7NERO1XXlOPg&amp;#43;kFAHgJjuhODOnmAh&amp;#43;FLcprG3A44&amp;#43;Z5S4n0gWWJSAQHzhagtkGDHu4O6OvLs5FE7SWVSjDxxi8cnCuODIVliUgEu28MRDkp1BcSiUTkNESmrfHsbFx6Icpr6kVOQ&amp;#43;aIZYnIyK5V1OK/F4oB8BIckT709XVCDw8H1DZocOBsgdhxyAyxLBEZ2b40JdQaAf06O6GHRyex4xCZPIlEovvFg3PFkSGwLBEZWcyNN/PJIZ1FTkJkPhrL0m&amp;#43;ZxbhWUStyGjI3LEtERpRbWo3EyyWQSIAJIT5ixyEyGz08OqF/ZwXUGgH7TueLHYfMDMsSkRHtuXFj913dXeGjsBM5DZF5maR7Ko6X4ki/WJaIjKjxTXxyKG/sJtK3CSE&amp;#43;kEiA45evI7e0Wuw4ZEZYloiMJLOwAmfyVLCSSjCuHy/BEembj8IOQ29MHRTDs0ukRyxLREbSeFbp3t4ecHGwETkNkXmadOOs7W4&amp;#43;FUd6xLJEZASCIOh&amp;#43;0&amp;#43;XYSkSGM66fD6ykEpzNVyGzsFzsOGQmWJaIjOB0bhmyiithay3Fg8FeYschMlsuDja4t7cHAJ5dIv1hWSIygsY37YggLzjIrUROQ2TeGh&amp;#43;g2J2aB0EQRE5D5oBlicjA1BoBMad4CY7IWCKCvGBrLcXla1U4nVsmdhwyAyxLRAaWmFWCAlUtnGytcF8fD7HjEJk9B7kVIoK0l7s5/QnpA8sSkYGoNQLiL17DR4cuAAAi&amp;#43;3pDbiUTORWRZZgcqp1OaEfyVew8mYv4i9eg1vCSHLUPb54gMoDYtHwsjzmL/LIa3bq4c4WITcvHGI6xRGRwNfUNkAC4XlWPF79NAQD4KGwRPTGYP4PUZjyzRKRnsWn5ePbr5CZFCQCuV9bh2a&amp;#43;TEZvGeauIDCk2LR8vbEvB/55HUpbV8GeQ2oVliUiP1BoBy2PO3vQmDUC3bnnMWV4OIDIQ/gySIbAsEelRYlbJTWeU/koAkF9Wg8SsEuOFIrIg/BkkQ2BZItKjwvJbv0m3Zzsiahv&amp;#43;DJIhsCwR6ZGno61etyOituHPIBkCyxKRHg31d4W34tZvwhJon8gZ6u9qvFBEFmSovyt8FLaQtLANfwaprViWiPRIJpXgoRvju/yvxjfv6InBkElbeisnovaSSSWInhgMALcsTPwZpLZiWSLSo9oGNfbdeCzZQd50AEpvhS0&amp;#43;mT6IY7wQGdiYfj74ZPqgW57l7exsb&amp;#43;REZOo4KCWRHm3&amp;#43;7TKuXKuCp6McB6Luw9k8FQrLa&amp;#43;DpqD3tz99miYxjTD8fPBjsjcSsEt3P4NaEK4g5lY/lMWfw/TPhkEj480itw7JEpCeFqhp8fGNqk1fHBEJhZ43wADeRUxFZLplU0uRnsLu7PQ6mF&amp;#43;LElevYnZqnmxKF6HZ4GY5IT1bHZqCyTo1QP2c8NJBvwkQdjY/CDs&amp;#43;NDAAArNp3DlV1DSInIlPBskSkByezr&amp;#43;PH5KsAgDcm9YWUl9uIOqQ59/ZAFxc7KFU1&amp;#43;OTwRbHjkIlgWSK6QxqNgDdizgIA/j64C0L9nMUNRES3ZGstw&amp;#43;vjgwAAnx69hJySKpETkSlgWSK6QztO5iI1pxSd5FZ4ZUwfseMQ0W1E9vXGsAA31DVo8NbedLHjkAkwmbJUUlKCadOmwcnJCc7Ozpg9ezYqKipafM3IkSMhkUiaLM8880yTbbKzszF&amp;#43;/HjY29vD09MTL7/8MhoaeB2bWqeitgGrY88BAJ5/oCdHBSYyARKJBNET&amp;#43;0ImlSD2jBJ/ZBaLHYk6OJMpS9OmTcOZM2dw4MAB7NmzB0ePHsXcuXNv&amp;#43;7o5c&amp;#43;YgPz9ft6xZs0b3NbVajfHjx6Ourg5//PEHtmzZgi&amp;#43;//BLLli0z5KGQGVl36AKKymvh7&amp;#43;6AWcP9xY5DRK3Ux9sR08O6AgCWx5xFg1ojciLqyEyiLKWnpyM2Nhaff/45wsLCMGLECKxbtw7bt29HXl5ei6&amp;#43;1t7eHt7e3bnFyctJ97ZdffsHZs2fx9ddfIzQ0FGPHjsXKlSuxfv161NXV3XKftbW1UKlUTRayPFnFldj8WxYAYOmEINhYmcSPExHd8OKDveFib42MgnJ8k5AtdhzqwEzi3T0&amp;#43;Ph7Ozs4YMmSIbl1ERASkUikSEhJafO0333wDd3d39OvXD0uWLEFV1Z8388XHx6N///7w8vLSrYuMjIRKpcKZM2duuc9Vq1ZBoVDoFj8/vzs4OjJVb&amp;#43;45i3q1gJF9PPBAoNftX0BEHYqzvQ2iRmvvM1x74DyuV976l2SybCZRlpRKJTw9PZuss7KygqurK5RK5S1f98QTT&amp;#43;Drr7/Gr7/&amp;#43;iiVLluA///kPpk&amp;#43;f3mS/fy1KAHR/bmm/S5YsQVlZmW7Jyclpz2GRCTucUYi4c4WwkkqwdEKw2HGIqJ2eGNoVgd6OKKuux3sHMsSOQx2UqCN4L168GKtXr25xm/T09j&amp;#43;p8Nd7mvr37w8fHx&amp;#43;MGjUKFy9eREBAQLv3K5fLIZfL2/16Mm11DRqs2KMdKmDW8O4I8OgkciIiai&amp;#43;ZVII3JvXF1M&amp;#43;OYWtCNp4Y2g3Bvk63fyFZFFHL0qJFi/Dkk0&amp;#43;2uE2PHj3g7e2NwsLCJusbGhpQUlICb2/vVn&amp;#43;/sLAwAEBmZiYCAgLg7e2NxMTEJtsUFBQAQJv2S5blq/jLuFRUCfdONnh&amp;#43;VC&amp;#43;x4xDRHbq7hxvG9/fB3tPaeeO2z72b88ZRE6KWJQ8PD3h4eNx2u/DwcJSWliIpKQmDBw8GABw6dAgajUZXgFojJSUFAODj46Pb71tvvYXCwkLdZb4DBw7AyckJwcG8tEI3KyqvxYcHtfO/vRzZB0621iInIiJ9WDIuEAfTC5CQVYKf05QY199H7EjUgZjEPUtBQUEYM2YM5syZg8TERPz&amp;#43;&amp;#43;&amp;#43;&amp;#43;YP38&amp;#43;pk6dCl9fXwBAbm4uAgMDdWeKLl68iJUrVyIpKQmXL1/G7t27MWPGDNx7770YMGAAAGD06NEIDg7GP/7xD6SmpmL//v14/fXXMW/ePF5mo2a9uz8D5bUN6N9ZgUcG88Z&amp;#43;InPRxcUe/7xPe3vGW3vTUVOvFjkRdSQmUZYA7VNtgYGBGDVqFMaNG4cRI0bgs88&amp;#43;0329vr4eGRkZuqfdbGxscPDgQYwePRqBgYFYtGgRHn74YcTExOheI5PJsGfPHshkMoSHh2P69OmYMWMGVqxYYfTjo47v9NUyfJekvZn/jUnBnP&amp;#43;NyMw8e18AfBW2yC2txqdHLokdhzoQiSAIgtghTJ1KpYJCoUBZWVmTcZzIfAiCgL9viEfSleuYEuqLD6YOFDsSERlATGoent92ErbWUsQtGonOznZiRyIDau3nt8mcWSIS0&amp;#43;7UPCRduQ57GxkWjw0SOw4RGciEAT4Y6u&amp;#43;KmnoNVu3jvHGkxbJEdBtVdQ1YtU87/9u8&amp;#43;3vCW8H534jMlXbeuGBIJcCeU/lIuHRN7EjUAbAsEd3Gv3&amp;#43;9CKWqBl1d7TF7BOd/IzJ3fX0VmDpUO2/cGzFnodbwbhVLx7JE1ILsa1X47L/aGz3/b3wQbK1lIiciImN4aXQfONlaIT1fhe3HOW&amp;#43;cpWNZImrBW/vOoq5BgxE93TE6mPO/EVkKVwcbvPhgbwDaIUPKqupFTkRiYlkiuoXfM4ux/0wBZFLtPQwc0ZfIsky/uxt6eXbC9ap6vH/wvNhxSEQsS0TNaFBrsDzmDADgH3d3Qy8vR5ETEZGxWcukiJ7YFwDwn2NXcL6gXOREJBaWJaJmfH3sCs4XVMDF3hovRvQWOw4RiWREL&amp;#43;0leLVGwIqYs&amp;#43;DQhJaJZYnof5RU1mHtAe0p95ci&amp;#43;0Bhz/nfiCzZ6&amp;#43;ODYSOT4rfMYvxytkDsOCQCliWi//HeLxlQ1TQgyMcJU&amp;#43;/qKnYcIhJZVzd7PH2PdtgQzhtnmViWiP7ibJ4K2xK1jwm/MTEYMs7/RkTQDkjr5SRHdkkVNv2WJXYcMjKWJaIbBEHAGzFnoBGA8QN8ENbDTexIRNRBOMitsHhsIABg/a&amp;#43;ZUJbViJyIjIllieiGvafzkZhVAltrKV4bx/nfiKipKaGdMairM6rq1Fgde07sOGRELEsdlFojIP7iNexKyUX8xWscbt/AquvUuvnfnrkvgDONE9FNJBIJ3pjUFxIJsPNkLpKuXBc7ktnrKJ&amp;#43;FVqJ8V2pRbFo&amp;#43;lsecRf5fTvP6KGwRPTEYY/r5iJjMfH169CJyS6vR2dkO/7w3QOw4RNRBDejijEcGd8F3J65iecwZ/PTccEh5b6NBdKTPQp5Z6mBi0/Lx7NfJTf7nAABlWQ2e/ToZsWn5IiUzX7ml1dhw5CIA4LVxQbCz4fxvRHRrL0cGwlFuhVNXy/BD0lWx45iljvZZyLLUgag1ApbHnEVzJxkb1y3nDNh69/a&amp;#43;dNTUaxDm74px/b3FjkNEHZyHoxwvjOoFAFiz/xxUNZw3Tp864mchy1IHkphVclOL/isBQH5ZDRKzSowXyswdu3QNe0/lQyrBjXsReDqdiG5v5rDu6OHhgOKKOqyLuyB2HLPSET8LWZY6kMLy1j2K2trtqGWNv70AwBNhXRHk4yRyIiIyFTZWUiydEAwA&amp;#43;OL3y7hYVCFyIvPRET8LWZY6EE9HW71uRy3blpiN9HwVFHbWWPRgH7HjEJGJub&amp;#43;PJx4I9ESDRsDKPWfFjmM2OuJnIctSBzLU3xU&amp;#43;Clu0dCHI01GOof6uRstkrsqq6vHeLxkAgKgHe8PFwUbkRERkil4fHwRrmQSHM4pw6BznjdOHUD9nyK1uXU8k0D4VZ8zPQpalDkQmlSB6ova07q0KU4NaQF5ptfFCman3D57H9ap69PbqhGlhnP&amp;#43;NiNqnh0cnzBqunTdu5Z501DVoRE5k2uoaNHhh&amp;#43;0nU3uK/Y&amp;#43;NnY7SRp6NiWepgxvTzwSfTB8Fb0fT0opeTHF5OcpRU1WHqZ8eQU1IlUkLTl6Esx3&amp;#43;OXQEARE/sCysZfwyIqP2ef6An3DvJkVVciS//4Lxx7VWv1uD5bck4cLYANlZSPP9AT/j8z2eht8IWn0wfZPRxliSCIPA59DukUqmgUChQVlYGJyf93CSs1ghIzCpBYXkNPB21pxuvVdRi6mfHcKm4El1c7LB97t3o4mKvl&amp;#43;9nKQRBwPRNCfg98xoi&amp;#43;3rh038METsSEZmB707k4JUfTqGT3AqHXrqP95a2Ub1agxe2ncTPaUrYWEmxccYQ3Nfbo9nPQn2eUWrt5zd/pe6gZFIJwgPcMDm0M8ID3CCTSuDpZIttc&amp;#43;&amp;#43;Gv7sDrl6vxuMbjyGXl&amp;#43;TaZP&amp;#43;ZAvyeeQ02VlK8Pj5Y7DhEZCb&amp;#43;PqgLQrooUFHbgH/FZogdx6TUqzVYsP1GUZJJ8ek/BuO&amp;#43;3h4Amv8sFAPLkonxcrLFtjl3o7ubPXJKqjH1s3jew9RKNfVqvLVP&amp;#43;8TK3Ht6wM&amp;#43;VZ&amp;#43;WISD&amp;#43;kUgmiJ/UFAHyfdBWpOaXiBjIRDWoNFm5Pwb7Tfxal&amp;#43;/t4ih3rJixLJshboT3D1E1XmI4hv4yF6XY&amp;#43;/&amp;#43;8l5JRUw9vJFs/dz/nfiEi/BnV1wd8GdgYAvBFzBhrOttCiBrUGC79Nwd7T&amp;#43;bCWSfDJ9EG4P7DjFSWAZclk&amp;#43;SjssG3O3ejqao/skipM/ewYlC2MeGrplGU1WP&amp;#43;rdv63JeMCYW/DOaSJSP9eHRsIexsZTmaX4qeUXLHjdFgNag1e/C4Ve07dKErTBmNUkJfYsW6JZcmE&amp;#43;TrbYdvcu&amp;#43;Hnaocr16rw&amp;#43;EYWplt55&amp;#43;d0VNerMaSbCyaF&amp;#43;Iodh4jMlJeTLeY/0BMA8M7P51BR2yByoo5HrRGw6PtUxKTmwVomwfonBiEiuOMWJYBlyeR1drbD9rnh8HO1Q1ZxJZ7YeAwFKhamv0q6UoKfUvIg4fxvRGQEs0f4o5ubPQrLa7H&amp;#43;10yx43Qoao2Al75Pxa6UPFhJJfj4iUEY3bfjT2DOsmQGOjtrL8l1cbHDpeJKPL7xGApZmAAAGo2AN3Zrb&amp;#43;p&amp;#43;bIgf&amp;#43;nVWiJyIiMyd3Eqme9p203&amp;#43;zcLm4UuREHYNaI&amp;#43;Dl71Ox82SurihFmkBRAkyoLJWUlGDatGlwcnKCs7MzZs&amp;#43;ejYqKW09cePnyZUgkkmaX77//Xrddc1/fvn27MQ5Jr7q42GPbnLvR2dkOl4puFCZOuIvvk3JwOrcMjrZWeCmS878RkXFEBHninl7uqFNr8ObedLHjiE6tEfDKD6ew42QuZFIJ1j0&amp;#43;EGP6mUZRAkyoLE2bNg1nzpzBgQMHsGfPHhw9ehRz58695fZ&amp;#43;fn7Iz89vsixfvhydOnXC2LFjm2z7xRdfNNluypQpBj4aw/Bztcf2uXfDV2GLi0WVeGJjAorKa8WOJRpVTT3&amp;#43;tV873smCUb3g3kkuciIishQSiXb6KiupBAfTC3D0fJHYkUSj0QhY/OMp/Jh8FTKpBB9NHYix/Y07AvedMomylJ6ejtjYWHz&amp;#43;&amp;#43;ecICwvDiBEjsG7dOmzfvh15eXnNvkYmk8Hb27vJsnPnTjz66KPo1KlTk22dnZ2bbGdr2/LIq7W1tVCpVE2WjkJbmMLho7BFZmEFnth4DMUVllmYPjp4AcUVdQjwcMDMYd3FjkNEFqanpyNmhHcHAKzYcxb1asubN06jEbBkx2l8n6QtSh9ODcX4AaZVlAATKUvx8fFwdnbGkCF/Tk0REREBqVSKhISEVu0jKSkJKSkpmD179k1fmzdvHtzd3TF06FBs3rwZt5sBZtWqVVAoFLrFz8&amp;#43;vbQdkYF3dtGeYvJ1sceFGYbpmYYUps7ACX/5xGQCwdEIwrDn/GxGJYEFEL7g62CCzsAL/ib8idhyj0mgEvLbzNL49kQOpBHj/sVBMGGCaTyObxCeIUqmEp2fTgaqsrKzg6uoKpVLZqn1s2rQJQUFBGDZsWJP1K1aswHfffYcDBw7g4YcfxnPPPYd169a1uK8lS5agrKxMt&amp;#43;Tk5LTtgIygm5sDts&amp;#43;9G15OcpwvqMATGxMspjAJgoCVe86iQSNgVKAnRnbA0WCJyDIo7Kzx0mjt/ZLvHzxvMe/DGo2A//spDduP/1mUTHnYFlHL0uLFi295E3bjcu7cuTv&amp;#43;PtXV1di6dWuzZ5WWLl2K4cOHY&amp;#43;DAgXj11Vfxyiuv4F//&amp;#43;leL&amp;#43;5PL5XBycmqydETd3R2wfW44PB3lyCgox7TPE1BSWSd2LIM7dK4QR84XwVomwesTOP8bEYnrsbv80NfXCeU1DXj3l/NixzE4jUbA67vSsC0xG1IJsPbRUEwO7Sx2rDsiallatGgR0tPTW1x69OgBb29vFBYWNnltQ0MDSkpK4O19&amp;#43;7vpf/jhB1RVVWHGjBm33TYsLAxXr15Fba15tH9/dwdsm3s3PB3lOKcsxxMbj&amp;#43;G6GRem2gY1Vu7RDhXw1Ah/&amp;#43;Ls7iJyIiCydTCpB9ETtvHHbj2cjLbdM5ESGIwgClu1Ow9aEbEgkwLuPhGDKQNMuSoDIZcnDwwOBgYEtLjY2NggPD0dpaSmSkpJ0rz106BA0Gg3CwsJu&amp;#43;302bdqESZMmwcPD47bbpqSkwMXFBXK5&amp;#43;Tw5FeDRCVvn3A2PG4Vp2ucJZluYvvj9Mi5fq4KHoxzPP9BL7DhERACAof6umBjiC0EAlsecue29saZIEARE7z6Dr49pi9K//h6Cvw3qInYsvTCJe5aCgoIwZswYzJkzB4mJifj9998xf/58TJ06Fb6&amp;#43;2mugubm5CAwMRGJiYpPXZmZm4ujRo3j66adv2m9MTAw&amp;#43;//xzpKWlITMzE5988gnefvttPP/880Y5LmPq6dkJ2&amp;#43;aEwb2THGfzVZi&amp;#43;KQGlVeZVmApVNVgXdwEA8OqYQHSSc/43Iuo4lowNhK21FMcvX0fMqXyx4&amp;#43;iVIAhYHnMWX8VfgUQCrHl4AP4&amp;#43;2DyKEmAiZQkAvvnmGwQGBmLUqFEYN24cRowYgc8&amp;#43;&amp;#43;0z39fr6emRkZKCqqqrJ6zZv3owuXbpg9OjRN&amp;#43;3T2toa69evR3h4OEJDQ/Hpp59i7dq1iI6ONvjxiKGnp&amp;#43;ONwmSDM3nawlRWVS92LL1ZHZuByjo1QvycdTN/ExF1FL7OdnhupHbeuFX70lFVZx7zxgmCgBV7zuqeQF79twF4ZEjHekr8TkkEczwXaGQqlQoKhQJlZWUd9mbvvzpfUI7HPzuGa5V16N9Zga&amp;#43;fDoPCzlrsWHfkZPZ1PPTvPwAAO58bhoFdXURORER0s5p6NSLWHsHV69V44YGeiBpt2jMLaJ8&amp;#43;Tsfm37MAAO/8rT&amp;#43;mDu0qcqrWa&amp;#43;3nt8mcWSL96e3liK1z7oabgw1O55ZhxqYElFWb7hkmjUZ7&amp;#43;hcAHh7UhUWJiDosW2sZ/m9cEADg06OXkFNSdZtXdFyCIOCtvX8WpVUmVpTagmXJQvXxdsQ3c8Lg6mCD1KtlmLE5Eaoa0yxMO0/mIiWnFA42Mrw6xrR/SyMi8zemnzfCe7ihtkGDt/eZ5rxxgiBg1c/n8Plv2qL09kP98biZFiWAZcmiBXo74Zunw&amp;#43;Bib43UnFLM2JSIchMrTBW1DXgnVjsW1/OjesHTqeWpaoiIxCaRSBA9KRhSCfBzmhJ/XCwWO1KbCIKAd2LP4bOjlwAAb07phyfCzLcoASxLFi/IxwnfPH03nO2tkZJTipmbTaswfXwoE0XltejuZo9Zw7uLHYeIqFUCvZ0w/e5uAIDlu8&amp;#43;iwUTmjRMEAWv2Z&amp;#43;DTI9qitHJyX91xmDOWJUKwr/YMk8LOGsnZpXjyi&amp;#43;OoqO34T2lcLq7E5hungF8fHwy5lUzkRERErfdiRG8o7KyRUVCObYnZYse5LUEQ8O4vGfjk8EUAwPJJffGPGxMFmzuWJQIA9PVV6ApT0pXreHJzYocvTG/uPYs6tQb39vbAqCDO/0ZEpsXFwQaLRvcGALx34HyHHvtOEAS898t5rP9VW5SiJwZj5rDu4oYyIpYl0unXWYGvZ4fBydYKJ65cx6wvElHZQQvTkfNFOJheCCupBMsmBEMikYgdiYiozZ4Y2hWB3o4orarH2gMdd9649w9ewMe/ZgIAlk4Ixqzh/iInMi6WJWqifxftuEuOtlY4fvk6Zn1xvMMVpnq1BitizgAAZg7rjp6enURORETUPlYyKZZN1E74/fWxKzinVImc6GYfHDyPj27MjvD6&amp;#43;CDMHmFZRQlgWaJmDOjijK9nh8FRboXEyyV46svjHWqk2S1/XMbFokq4OdjghVGc/42ITNuwAHeM7ecNjaC92bsjjRX94cEL&amp;#43;OCgtij937ggPH1PD5ETiYNliZoV4ueMr2YPhaPcCglZ2sJUXacWOxaKK2rx4Y0f3Jcj&amp;#43;5j8yONERADw2rggyK2kiL90DbFpSrHjAADWxV3A&amp;#43;we1lwaXjA3EnHstsygBLEvUgoFdXbBl9lB0klvh2KUSzN4ifmF6d38Gymsb0K&amp;#43;zk9nNPURElsvP1R7/vFFG3tybjpp6cd9r1/&amp;#43;aifdu3EP16phA/PO&amp;#43;AFHziI1liVo0qKsLtjw1FA42Mvxx8Rqe/uq4aD/Ep6&amp;#43;W4dsTOQCANyb2hUzKm7qJyHw8MzIAPgpb5JZW6wZ8FMO/D2fiX/szAGjP4D870rKLEsCyRK0wuNufhen3zGuY89UJoxcmQRCwPOYMBAGYHOqLId1djfr9iYgMzd7GCktuzBv378OZyCutNnqGDUcuYk2stii9NLo35t3f0&amp;#43;gZOiKWJWqVId1d8eVTQ2FvI8N/LxQbvTDtTs3DiSvXYWctw&amp;#43;KxgUb7vkRExjRxgA&amp;#43;GdndFTb0Gq34&amp;#43;Z9Tv/dnRi3jnxveMerA35j/AB2gasSxRq93V3RVfzvqzMP3zP0lGKUxVdQ1YtU/7Azzv/gD4KOwM/j2JiMQgkUiwbGIwJBIgJjUPiVklRvm&amp;#43;n//3Et6&amp;#43;8T67MKIXnzT&amp;#43;HyxL1CZD/V3xxZN3wc5ahiPni/DM14YvTJ8cvgilqgZ&amp;#43;rnYW&amp;#43;9gqEVmOfp0VmHqXdmLaN3afgVpj2KEEPv/vJby5Nx0A8MKoXlgY0dug388UsSxRm4X1cMMXs7SF6XBGEZ79Ogm1DYYpTDklVfj0xo2O/zcuGLbWnP&amp;#43;NiMzfS6N7w9HWCmfzVfjuxoMthrD5t6w/i9IDPfFiBM8oNYdlidrl7h5u2PTkENhaS/FrRhGe/TrZIIXprb3pqGvQYFiAGyL7eul9/0REHZFbJ7nuDM&amp;#43;/9megrLpe79/jy9&amp;#43;zsGLPWQDA/Pt74sUHe3PqqFtgWaJ2Gxbgjs0z74LcSopD5wox75tk1DVo9Lb/PzKLEXtGCZlUguiJfflDTEQWZUZ4N/T07ISSyjrdYLz68lX8ZbwRoy1Kz40MwKLRLEotYVmiOzKspzs23ShMB9MLMW&amp;#43;rfgpTg1qD5Td&amp;#43;kKeHdUUfb8c73icRkSmxlkmxbIJ23riv4i8js7BcL/v9T/xlLNulnV/zmfsC8HJkHxal22BZojs2opc7Pp85BDZWUhw4W4D5W5NRr76zwvRNQjYyCsrhYm&amp;#43;NFx/kzYZEZJnu7e2BiCAvNGgELI&amp;#43;583njvj52BUtvFKV/3tsDr45hUWoNliXSi3t6eWDjDG1h&amp;#43;uVsAZ7ferLdhel6ZR3W3hhmP2p0Hzjb2&amp;#43;gzKhGRSVk6IQg2Min&amp;#43;e6EYB9ML272frQnZeP2nNADAnHv8sXhsIItSK7Eskd7c19sDn/1jMGxkUsSeUeKFbe0rTO8d0N7MGOjtiCeGdjVAUiIi09HNzQGz7/EHALy592y7HqbZnpiN13aeBgDMHuGP18YFsSi1AcsS6dXIPp749EZh&amp;#43;jlNiYXbU9DQhsJ0Nk&amp;#43;FrQnZAIA3JnH&amp;#43;NyIiAJh3f094Ospx5VoVNv2W1abXfnc8B4t3aIvSrOHd8fp4FqW2Ylkivbs/0BMb/jEI1jIJ9p7Ox8JvW1eYGud/0wjA&amp;#43;P4&amp;#43;uLuHmxHSEhF1fJ3kVrqpnj4&amp;#43;lIkCVU2rXvfdiRy8uuMUAODJYd2xbEIwi1I7sCyRQTwQ6IVPpg2GtUyCPafy8eJ3qbctTPtOK5GQVQK5lRRLxnH&amp;#43;NyKiv5oS2hkDuzqjqk6N1a2YN&amp;#43;6HpKt49cdTEATtMATRE1mU2otliQwmItgL/75RmGJS87Do&amp;#43;1sXpuo6Nd7epx1F9pn7AtDFxd6YUYmIOjypVII3JvYFAOw4mYvk7Ou33PbHpKt4&amp;#43;YdUCAIw/e6uWD6JY9XdCZYlMqgHg73w8RODYCWVYFdKHl76PrXZeY4&amp;#43;PXoRuaXV8FXY4pn7AkRISkTU8YX4OeORwV0AAMt3n4GmmffTnSev4qUbRWlaWFesmNSPRekOWYkdgMxfZF9vfPzEIMzfmoyfUvIglUjwr0dCAACJWSXIKFBh/a&amp;#43;ZAIDXxgfBzobzvxER3crLY/rg5zQlUq&amp;#43;W4bukHHRzdUBheQ08HW2RX1qtK0qPD&amp;#43;2KlZP7QcoHZe4YyxIZxZh&amp;#43;3lj3&amp;#43;EDM33YSO07mIre0GleuVUH5l5sUbWQSyPjbDxFRizwdbfHCqJ54e985vLbjNJo5uYSpd/nhrSksSvrCy3BkNGP7&amp;#43;2Dd4wMhlQAJWSVNihIA1KkFPPdNMmLT8kVKSERkGnwUdgDQbFECgHt7ebAo6ZHJlKW33noLw4YNg729PZydnVv1GkEQsGzZMvj4&amp;#43;MDOzg4RERG4cKHpZIQlJSWYNm0anJyc4OzsjNmzZ6OiosIAR0CA9pKck511i9ssjznb7H1NREQEqDWC7oGY5kgArNzL91F9MpmyVFdXh0ceeQTPPvtsq1&amp;#43;zZs0afPTRR9iwYQMSEhLg4OCAyMhI1NT8eUZj2rRpOHPmDA4cOIA9e/bg6NGjmDt3riEOgaC9R6m0qv6WXxcA5JfVIDGrxHihiIhMSGJWCfLLbj3OEt9H9c9k7llavnw5AODLL79s1faCIOCDDz7A66&amp;#43;/jsmTJwMAvvrqK3h5eeGnn37C1KlTkZ6ejtjYWBw/fhxDhgwBAKxbtw7jxo3Du&amp;#43;&amp;#43;&amp;#43;C19fX4MciyUrLG/dQGqt3Y6IyNLwfdT4TObMUltlZWVBqVQiIiJCt06hUCAsLAzx8fEAgPj4eDg7O&amp;#43;uKEgBERERAKpUiISHhlvuura2FSqVqslDreDra6nU7IiJLw/dR4zPbsqRUKgEAXl5eTdZ7eXnpvqZUKuHp6dnk61ZWVnB1ddVt05xVq1ZBoVDoFj8/Pz2nN19D/V3ho7DFrW47lADwUdhiqL&amp;#43;rMWMREZkMvo8an6hlafHixZBIJC0u587dfkh3Y1uyZAnKysp0S05OjtiRTIZMKkH0xGAAuOkHvfHP0RODOYEuEdEt8H3U&amp;#43;ES9Z2nRokV48sknW9ymR48e7dq3t7c3AKCgoAA&amp;#43;Pj669QUFBQgNDdVtU1hY2OR1DQ0NKCkp0b2&amp;#43;OXK5HHK5vF25CBjTzwefTB&amp;#43;E5TFnm9yk6K2wRfTEYIzp59PCq4mIiO&amp;#43;jxiVqWfLw8ICHh4dB9u3v7w9vb2/ExcXpypFKpUJCQoLuibrw8HCUlpYiKSkJgwcPBgAcOnQIGo0GYWFhBslFWmP6&amp;#43;eDBYG8kZpXoRp4d6u/K34SIiFqJ76PGYzJPw2VnZ6OkpATZ2dlQq9VISUkBAPTs2ROdOnUCAAQGBmLVqlV46KGHIJFIsHDhQrz55pvo1asX/P39sXTpUvj6&amp;#43;mLKlCkAgKCgIIwZMwZz5szBhg0bUF9fj/nz52Pq1Kl8Es4IZFIJwgPcxI5BRGSy&amp;#43;D5qHCZTlpYtW4YtW7bo/jxw4EAAwK&amp;#43;//oqRI0cCADIyMlBWVqbb5pVXXkFlZSXmzp2L0tJSjBgxArGxsbC1/fMJgW&amp;#43;&amp;#43;&amp;#43;Qbz58/HqFGjIJVK8fDDD&amp;#43;Ojjz4yzkERERFRhycRBIFDfN4hlUoFhUKBsrIyODk5iR2HiIiIWqG1n99mO3QAERERkT6wLBERERG1gGWJiIiIqAUsS0REREQtYFkiIiIiagHLEhEREVELWJaIiIiIWmAyg1J2ZI1DValUKpGTEBERUWs1fm7fbshJliU9KC8vBwD4&amp;#43;fmJnISIiIjaqry8HAqF4pZf5wjeeqDRaJCXlwdHR0dIJPqbwFClUsHPzw85OTlmOzK4uR8jj8/0mfsx8vhMn7kfoyGPTxAElJeXw9fXF1Lpre9M4pklPZBKpejSpYvB9u/k5GSWPwB/Ze7HyOMzfeZ&amp;#43;jDw&amp;#43;02fux2io42vpjFIj3uBNRERE1AKWJSIiIqIWsCx1YHK5HNHR0ZDL5WJHMRhzP0Yen&amp;#43;kz92Pk8Zk&amp;#43;cz/GjnB8vMGbiIiIqAU8s0RERETUApYlIiIiohawLBERERG1gGWJiIiIqAUsSx3Y&amp;#43;vXr0b17d9ja2iIsLAyJiYliR9Kbo0ePYuLEifD19YVEIsFPP/0kdiS9WrVqFe666y44OjrC09MTU6ZMQUZGhtix9OaTTz7BgAEDdIPEhYeH4&amp;#43;effxY7lsG88847kEgkWLhwodhR9OaNN96ARCJpsgQGBoodS69yc3Mxffp0uLm5wc7ODv3798eJEyfEjqUX3bt3v&amp;#43;nvTyKRYN68eWJH0xu1Wo2lS5fC398fdnZ2CAgIwMqVK287j5shsCx1UN9&amp;#43;&amp;#43;y2ioqIQHR2N5ORkhISEIDIyEoWFhWJH04vKykqEhIRg/fr1YkcxiCNHjmDevHk4duwYDhw4gPr6eowePRqVlZViR9OLLl264J133kFSUhJOnDiBBx54AJMnT8aZM2fEjqZ3x48fx6effooBAwaIHUXv&amp;#43;vbti/z8fN3y22&amp;#43;/iR1Jb65fv47hw4fD2toaP//8M86ePYv33nsPLi4uYkfTi&amp;#43;PHjzf5uztw4AAA4JFHHhE5mf6sXr0an3zyCT7&amp;#43;&amp;#43;GOkp6dj9erVWLNmDdatW2f8MAJ1SEOHDhXmzZun&amp;#43;7NarRZ8fX2FVatWiZjKMAAIO3fuFDuGQRUWFgoAhCNHjogdxWBcXFyEzz//XOwYelVeXi706tVLOHDggHDfffcJCxYsEDuS3kRHRwshISFixzCYV199VRgxYoTYMYxmwYIFQkBAgKDRaMSOojfjx48XnnrqqSbr/va3vwnTpk0zehaeWeqA6urqkJSUhIiICN06qVSKiIgIxMfHi5iM2qusrAwA4OrqKnIS/VOr1di&amp;#43;fTsqKysRHh4udhy9mjdvHsaPH9/kZ9GcXLhwAb6&amp;#43;vujRowemTZuG7OxssSPpze7duzFkyBA88sgj8PT0xMCBA7Fx40axYxlEXV0dvv76azz11FN6ncxdbMOGDUNcXBzOnz8PAEhNTcVvv/2GsWPHGj0LJ9LtgIqLi6FWq&amp;#43;Hl5dVkvZeXF86dOydSKmovjUaDhQsXYvjw4ejXr5/YcfTm9OnTCA8PR01NDTp16oSdO3ciODhY7Fh6s337diQnJ&amp;#43;P48eNiRzGIsLAwfPnll&amp;#43;jTpw/y8/OxfPly3HPPPUhLS4Ojo6PY8e7YpUuX8MknnyAqKgqvvfYajh8/jhdeeAE2NjaYOXOm2PH06qeffkJpaSmefPJJsaPo1eLFi6FSqRAYGAiZTAa1Wo233noL06ZNM3oWliUiA5s3bx7S0tLM6n4QAOjTpw9SUlJQVlaGH374ATNnzsSRI0fMojDl5ORgwYIFOHDgAGxtbcWOYxB//e18wIABCAsLQ7du3fDdd99h9uzZIibTD41GgyFDhuDtt98GAAwcOBBpaWnYsGGD2ZWlTZs2YezYsfD19RU7il599913&amp;#43;Oabb7B161b07dsXKSkpWLhwIXx9fY3&amp;#43;d8iy1AG5u7tDJpOhoKCgyfqCggJ4e3uLlIraY/78&amp;#43;dizZw&amp;#43;OHj2KLl26iB1Hr2xsbNCzZ08AwODBg3H8&amp;#43;HF8&amp;#43;OGH&amp;#43;PTTT0VOdueSkpJQWFiIQYMG6dap1WocPXoUH3/8MWprayGTyURMqH/Ozs7o3bs3MjMzxY6iFz4&amp;#43;PjcV96CgIPz4448iJTKMK1eu4ODBg9ixY4fYUfTu5ZdfxuLFizF16lQAQP/&amp;#43;/XHlyhWsWrXK6GWJ9yx1QDY2Nhg8eDDi4uJ06zQaDeLi4szunhBzJQgC5s&amp;#43;fj507d&amp;#43;LQoUPw9/cXO5LBaTQa1NbWih1DL0aNGoXTp08jJSVFtwwZMgTTpk1DSkqK2RUlAKioqMDFixfh4&amp;#43;MjdhS9GD58&amp;#43;E3DdZw/fx7dunUTKZFhfPHFF/D09MT48ePFjqJ3VVVVkEqb1hSZTAaNRmP0LDyz1EFFRUVh5syZGDJkCIYOHYoPPvgAlZWVmDVrltjR9KKioqLJb7BZWVlISUmBq6srunbtKmIy/Zg3bx62bt2KXbt2wdHREUqlEgCgUChgZ2cncro7t2TJEowdOxZdu3ZFeXk5tm7disOHD2P//v1iR9MLR0fHm&amp;#43;4vc3BwgJubm9ncd/bSSy9h4sSJ6NatG/Ly8hAdHQ2ZTIbHH39c7Gh68eKLL2LYsGF4&amp;#43;&amp;#43;238eijjyIxMRGfffYZPvvsM7Gj6Y1Go8EXX3yBmTNnwsrK/D7OJ06ciLfeegtdu3ZF3759cfLkSaxduxZPPfWU8cMY/fk7arV169YJXbt2FWxsbIShQ4cKx44dEzuS3vz6668CgJuWmTNnih1NL5o7NgDCF198IXY0vXjqqaeEbt26CTY2NoKHh4cwatQo4ZdffhE7lkGZ29ABjz32mODj4yPY2NgInTt3Fh577DEhMzNT7Fh6FRMTI/Tr10&amp;#43;Qy&amp;#43;VCYGCg8Nlnn4kdSa/2798vABAyMjLEjmIQKpVKWLBggdC1a1fB1tZW6NGjh/B///d/Qm1trdGzSARBhKEwiYiIiEwE71kiIiIiagHLEhEREVELWJaIiIiIWsCyRERERNQCliUiIiKiFrAsEREREbWAZYmIiIioBSxLRERERC1gWSIiIiJqAcsSERERUQtYloiIiIhawLJERBZp5MiRmD9/PubPnw&amp;#43;FQgF3d3csXboUjdNlXr9&amp;#43;HTNmzICLiwvs7e0xduxYXLhwQff6K1euYOLEiXBxcYGDgwP69u2Lffv2iXU4RGRALEtEZLG2bNkCKysrJCYm4sMPP8TatWvx&amp;#43;eefAwCefPJJnDhxArt370Z8fDwEQcC4ceNQX18PAJg3bx5qa2tx9OhRnD59GqtXr0anTp3EPBwiMhCJ0PhrFBGRBRk5ciQKCwtx5swZSCQSAMDixYuxe/du7Nq1C71798bvv/&amp;#43;OYcOGAQCuXbsGPz8/bNmyBY888ggGDBiAhx9&amp;#43;GNHR0WIeBhEZAc8sEZHFuvvuu3VFCQDCw8Nx4cIFnD17FlZWVggLC9N9zc3NDX369EF6ejoA4IUXXsCbb76J4cOHIzo6GqdOnTJ6fiIyDpYlIqJ2ePrpp3Hp0iX84x//wOnTpzFkyBCsW7dO7FhEZAAsS0RksRISEpr8&amp;#43;dixY&amp;#43;jVqxeCg4PR0NDQ5OvXrl1DRkYGgoODdev8/PzwzDPPYMeOHVi0aBE2btxotOxEZDwsS0RksbKzsxEVFYWMjAxs27YN69atw4IFC9CrVy9MnjwZc&amp;#43;bMwW&amp;#43;//YbU1FRMnz4dnTt3xuTJkwEACxcuxP79&amp;#43;5GVlYXk5GT8&amp;#43;uuvCAoKEvmIiMgQrMQOQEQklhkzZqC6uhpDhw6FTCbDggULMHfuXADAF198gQULFmDChAmoq6vDvffei3379sHa2hoAoFarMW/ePFy9ehVOTk4YM2YM3n//fTEPh4gMhE/DEZFFGjlyJEJDQ/HBBx&amp;#43;IHYWIOjhehiMiIiJqAcsSERERUQt4GY6IiIioBTyzRERERNQCliUiIiKiFrAsEREREbWAZYmIiIioBSxLRERERC1gWSIiIiJqAcsSERERUQtYloiIiIha8P8zwW3C7rNbpwAAAABJRU5ErkJggg==&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Output Image&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;rope编码&#34;&gt;RoPE编码
&lt;/h3&gt;&lt;p&gt;RoPE是目前最流行的位置编码之一。&lt;/p&gt;
&lt;p&gt;Sinusoidal 编码尽管生成的位置向量隐含了相对位置信息，拥有点积与距离有关的优秀特性，可是一但其位置向量加到 tokens 上，这个特性就消失了。那如果直接将旋转矩阵应用到 tokens 上呢？在RoPE编码中，不生成显式的位置向量，而是直接把旋转矩阵和 tokens 相乘。即：
$$
x&amp;rsquo;_t = \begin{pmatrix}
\cos{t\theta}&amp;amp;-\sin{t\theta}\\
\sin{t\theta}&amp;amp;\cos{t\theta}
\end{pmatrix}x_t
$$
扩展到多维，自然就是更改 $\theta$ 为 $\theta_i$ 了。在 RoPE 中，令
$$
\theta_i = \begin{cases}
\frac{1}{10000^{\frac{i}{dim}}} &amp;amp; i=2k, k\in N\\
\frac{1}{10000^{\frac{i-1}{dim}}} &amp;amp; i=2k+1, k\in N
\end{cases}
$$
从而组合形成
$$
\begin{pmatrix}
\cos{t\theta_0}&amp;amp;-\sin{t\theta_0}&amp;amp;0&amp;amp;0&amp;amp;\cdots\\
\sin{t\theta_0}&amp;amp;\cos{t\theta_0}&amp;amp;0&amp;amp;0&amp;amp;\cdots\\
0&amp;amp;0&amp;amp;\cos{t\theta_1}&amp;amp;-\sin{t\theta_1}&amp;amp;\cdots\\
0&amp;amp;0&amp;amp;\sin{t\theta_1}&amp;amp;\cos{t\theta_1}&amp;amp;\cdots\\
\cdots&amp;amp;\cdots&amp;amp;\cdots&amp;amp;\cdots&amp;amp;\ddots
\end{pmatrix}
$$
这样的形式。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;RoPE_embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;RoPE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))),&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))],[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))]])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RoPE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;RoPE_embed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;matmul&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RoPE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;RoPE_embed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[[ 1. -0.]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [ 0.  1.]]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[[ 0.54030231 -0.84147098]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [ 0.84147098  0.54030231]]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[[-0.41614684 -0.90929743]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [ 0.90929743 -0.41614684]]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[[-0.9899925  -0.14112001]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [ 0.14112001 -0.9899925 ]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;array([[ 1.        ,  1.        ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [-0.30116868,  1.38177329],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [-1.32544426,  0.49315059],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       [-1.1311125 , -0.84887249]])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;PE_plt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RoPE_embed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;Figure size 640x480 with 1 Axes&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkIAAAGwCAYAAABFFQqPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD&amp;#43;naQAAIUxJREFUeJzt3Xt00/X9x/FXWmhqJ2nlAL3YclPHRZAiahcmN&amp;#43;mswPHAqTpEZpFxUaceWJlKNwfTzYP3gdLfQDdkHmUinArzBtZyVSqFAoIV2cCOa1NUZgMViybf3x8dcYEWCmvybfJ5Ps7JgXzz/Tbv8C3N83zzTeqwLMsSAACAgWLsHgAAAMAuhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjNXK7gFaOr/fr0OHDqlNmzZyOBx2jwMAAJrAsiwdPXpUaWlpiolp/LgPIXQWhw4dUkZGht1jAACA87B//36lp6c3ejshdBZt2rSRVP8P6XK5bJ4GAAA0hdfrVUZGRuB5vDGE0FmcfDnM5XIRQgAARJizndbCydIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEIAWad26dbrxxhuVlpYmh8OhZcuW2T0SgChECAFokWpra9WnTx8VFhbaPQqAKMbnCAFokYYNG6Zhw4bZPQaAKMcRIQAAYCyOCAFoOXw&amp;#43;af16qapKSk2VBgyQYmPtngpAFCOEALQMRUXSlCnSgQPfL0tPl&amp;#43;bMsW8mAFGPEAJgv6Ii6eabJcsKXn7wYP1yAAgRzhECYC&amp;#43;fr/5I0KkRJAUv8/vDNxMAY3BECIC91q8PfjnsP45J2i0FYqiypETbunZV27Zt1bFjx7COCCB6cUQIgL2qqhpcvFlS3/9cJCn///5Pffv21YwZM8I1GQADcEQIgL1SUxtcPFhS0Itlq1dLgweHfh4ARuGIEAB7DRhQ/&amp;#43;4wh6Ph2x0OKSOjfj0AaGaEEAB7xcZ&amp;#43;/xb5U2Po5PXZs/k8IQAhQQgBsF9urrR0qXTxxcHL09Prl&amp;#43;fm2jMXgKjHOUIAWobcXGnkSD5ZGkBYEUIAWo7YWE6IBhBWvDQGAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAgBahsLBQnTt3Vnx8vLKyslRWVhby&amp;#43;ySEAACA7RYvXqz8/HzNnDlTW7ZsUZ8&amp;#43;fZSTk6PDhw&amp;#43;H9H4JIQAAYLtnnnlGkyZN0vjx49WzZ0/NmzdPCQkJWrBgQUjvlxACAAC2OnHihMrLy5WdnR1YFhMTo&amp;#43;zsbJWWlob0vluF9KsDAAA0xOeT1q&amp;#43;Xqqr0RevW8vl8Sk5ODlolOTlZn376aUjHIIQAAEB4FRVJU6ZIBw4EL1&amp;#43;zRnK7wzpKRL00tm7dOt14441KS0uTw&amp;#43;HQsmXLzrrNmjVrdOWVV8rpdOrSSy/VwoULQz4nAABoRFGRdPPNQRHUTlKspOpf/7r&amp;#43;9v&amp;#43;orq5WSkpKSMeJqBCqra1Vnz59VFhY2KT1KysrNWLECA0ZMkTbtm3T1KlTNXHiRK1cuTLEkwIAgNP4fPVHgiwraHGcpH6SSiRp6lTJ55Pf71dJSYncIT5CFFEvjQ0bNkzDhg1r8vrz5s1Tly5d9PTTT0uSevTooffff19//OMflZOT0&amp;#43;A2dXV1qqurC1z3er3/29AAAKDe&amp;#43;vWnvxz2H/mSxkm6av9&amp;#43;XfPyy5q9YYNqa2s1fvz4kI4UUUeEzlVpaWnQGeiSlJOTc8Yz0GfNmqXExMTAJSMjI9RjAgBghqqqRm8aLekpSTMkZU6cqG3btmnFihWnnUDd3KI6hDweT4NnoHu9Xh0/frzBbQoKClRTUxO47N&amp;#43;/PxyjAgAQ/VJTz3jzvZL2SqorLtbGjRuVlZUV8pEi6qWxcHA6nXI6nXaPAQBA9BkwQEpPlw4ePO08IUmSw1F/&amp;#43;4ABYRspqo8IpaSkqLq6OmhZdXW1XC6XLrjgApumAgDAULGx0pw59X93OIJvO3l99uz69cIkqkPI7XarpKQkaFlxcXHIz0AHAACNyM2Vli6VLr44eHl6ev3y3NywjhNRL40dO3ZMu3fvDlyvrKzUtm3b1LZtW3Xs2FEFBQU6ePCgXnrpJUnSXXfdpblz5&amp;#43;qBBx7Qz3/&amp;#43;c61atUqvvfaa3nrrLbseAgAAyM2VRo4MfLK0UlPrXw4L45GgkyIqhDZv3qwhQ4YErufn50uSxo0bp4ULF6qqqkr79u0L3N6lSxe99dZb&amp;#43;uUvf6k5c&amp;#43;YoPT1df/7znxt96zwAAAiT2Fhp8GC7p5DDsho6Wwkneb1eJSYmqqamRi6Xy&amp;#43;5xAABAEzT1&amp;#43;TuqzxECAAA4E0IIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghm82aNUtXX3212rRpow4dOmjUqFHatWuX3WMBAGAEQshma9eu1T333KMPP/xQxcXF&amp;#43;vbbb3X99dertrbW7tEAAIh6DsuyLLuHaMm8Xq8SExNVU1Mjl8sV8vv7/PPP1aFDB61du1YDBw4M&amp;#43;f0BABCNmvr8zRGhFqampkaS1LZtW5snAQAg&amp;#43;kVcCBUWFqpz586Kj49XVlaWysrKGl134cKFcjgcQZf4&amp;#43;PgwTtsIn09as0b629/q//T5JEl&amp;#43;v19Tp07Vj3/8Y/Xq1cvWEQEAMEEruwc4F4sXL1Z&amp;#43;fr7mzZunrKwszZ49Wzk5Odq1a5c6dOjQ4DYulyvo5GOHwxGucRtWVCRNmSIdOPD9svR0ac4c3VNcrI8//ljvv/&amp;#43;&amp;#43;ffMBAGCQiDoi9Mwzz2jSpEkaP368evbsqXnz5ikhIUELFixodBuHw6GUlJTAJTk5OYwTn6KoSLr55uAIkqSDB3XvTTfpzSVLtHr1aqWnp9szHwAAhomYEDpx4oTKy8uVnZ0dWBYTE6Ps7GyVlpY2ut2xY8fUqVMnZWRkaOTIkaqoqDjj/dTV1cnr9QZdmoXPV38k6JRz0y1J91qWXpe0qnVrdenYsXnuDwAAnFXEhNAXX3whn8932hGd5ORkeTyeBrfp1q2bFixYoOXLl&amp;#43;vll1&amp;#43;W3&amp;#43;9X//79deDUIzL/ZdasWUpMTAxcMjIymucBrF9/&amp;#43;pEgSfdIelnSIkltPB55li&amp;#43;Xx&amp;#43;PR8ePHm&amp;#43;d&amp;#43;AQBAoyImhM6H2&amp;#43;1WXl6eMjMzNWjQIBUVFal9&amp;#43;/aaP39&amp;#43;o9sUFBSopqYmcNm/f3/zDFNV1eDiP0mqkTRYUqqk1JtuUmpqqhYvXtw89wsAABoVMSdLt2vXTrGxsaqurg5aXl1drZSUlCZ9jdatW6tv377avXt3o&amp;#43;s4nU45nc7/adYGpaY2uPi0D3FavVoaPLj57x8AAJwmYo4IxcXFqV&amp;#43;/fiopKQks8/v9KikpkdvtbtLX8Pl82rFjh1IbiZKQGjCg/t1hjb1rzeGQMjLq1wMAAGERMSEkSfn5&amp;#43;XrhhRf017/&amp;#43;VTt37tTdd9&amp;#43;t2tpajR8/XpKUl5engoKCwPqPPPKI3n33XX322WfasmWLfvazn2nv3r2aOHFi&amp;#43;IePjZXmzKn/&amp;#43;6kxdPL67Nn16wEAgLCImJfGJGn06NH6/PPPNWPGDHk8HmVmZmrFihWBE6j37dunmJjv2&amp;#43;7f//63Jk2aJI/Ho4suukj9&amp;#43;vXThg0b1LNnT3seQG6utHRpw58jNHt2/e0AACBs&amp;#43;F1jZxGS3zXm89W/i6yqqv7coQEDOBIEAEAzaurzd0QdEYoasbGcEA0AQAsQUecIAQAANCdCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMZqcggdOnQolHMAAACEXZND6PLLL9eiRYtCOQsAAEBYNTmEHn30Ud1555265ZZbdOTIkVDOBAAAEBZNDqFf/OIX2r59u7788kv17NlTb7zxRijnAgAACLlW57Jyly5dtGrVKs2dO1e5ubnq0aOHWrUK/hJbtmxp1gEBAABC5ZxCSJL27t2roqIiXXTRRRo5cuRpIQQAABApzqliXnjhBU2bNk3Z2dmqqKhQ&amp;#43;/btQzUXAABAyDU5hG644QaVlZVp7ty5ysvLC&amp;#43;VMAAAAYdHkEPL5fNq&amp;#43;fbvS09NDOQ8AAEDYNDmEiouLQzkHAABA2PErNgAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgrIgLocLCQnXu3Fnx8fHKyspSWVnZGddfsmSJunfvrvj4ePXu3Vtvv/12mCYFAAAtXUSF0OLFi5Wfn6&amp;#43;ZM2dqy5Yt6tOnj3JycnT48OEG19&amp;#43;wYYPGjBmjCRMmaOvWrRo1apRGjRqljz/&amp;#43;OMyTAwCAlshhWZZl9xBNlZWVpauvvlpz586VJPn9fmVkZOi&amp;#43;&amp;#43;&amp;#43;7T9OnTT1t/9OjRqq2t1ZtvvhlY9qMf/UiZmZmaN29ek&amp;#43;7T6/UqMTFRNTU1crlczfNAAABASDX1&amp;#43;TtijgidOHFC5eXlys7ODiyLiYlRdna2SktLG9ymtLQ0aH1JysnJaXR9Saqrq5PX6w26AACA6BQxIfTFF1/I5/MpOTk5aHlycrI8Hk&amp;#43;D23g8nnNaX5JmzZqlxMTEwCUjI&amp;#43;N/Hx4AALRIERNC4VJQUKCamprAZf/&amp;#43;/XaPBAAAQqSV3QM0Vbt27RQbG6vq6uqg5dXV1UpJSWlwm5SUlHNaX5KcTqecTuf/PjAAAGjxIuaIUFxcnPr166eSkpLAMr/fr5KSErnd7ga3cbvdQetLUnFxcaPrAwAAs0TMESFJys/P17hx43TVVVfpmmuu0ezZs1VbW6vx48dLkvLy8nTxxRdr1qxZkqQpU6Zo0KBBevrppzVixAi9&amp;#43;uqr2rx5s55//nk7HwYAAGghIiqERo8erc8//1wzZsyQx&amp;#43;NRZmamVqxYETghet&amp;#43;&amp;#43;fYqJ&amp;#43;f4gV//&amp;#43;/bVo0SI99NBD&amp;#43;vWvf63LLrtMy5YtU69evex6CAAAoAWJqM8RsgOfIwQAQOSJus8RAgAAaG6EEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjEUIAQAAYxFCAADAWBETQkeOHNHYsWPlcrmUlJSkCRMm6NixY2fcZvDgwXI4HEGXu&amp;#43;66K0wTAwCAlq6V3QM01dixY1VVVaXi4mJ9&amp;#43;&amp;#43;23Gj9&amp;#43;vCZPnqxFixadcbtJkybpkUceCVxPSEgI9agAACBCREQI7dy5UytWrNCmTZt01VVXSZKee&amp;#43;45DR8&amp;#43;XE899ZTS0tIa3TYhIUEpKSlNvq&amp;#43;6ujrV1dUFrnu93vMfHAAAtGgR8dJYaWmpkpKSAhEkSdnZ2YqJidHGjRvPuO0rr7yidu3aqVevXiooKNDXX399xvVnzZqlxMTEwCUjI6NZHgMAAGh5IuKIkMfjUYcOHYKWtWrVSm3btpXH42l0u9tuu02dOnVSWlqatm/frgcffFC7du1SUVFRo9sUFBQoPz8/cN3r9RJDAABEKVtDaPr06Xr88cfPuM7OnTvP&amp;#43;&amp;#43;tPnjw58PfevXsrNTVVQ4cO1Z49e3TJJZc0uI3T6ZTT6Tzv&amp;#43;wQAAJHD1hCaNm2a7rjjjjOu07VrV6WkpOjw4cNBy7/77jsdOXLknM7/ycrKkiTt3r270RACAADmsDWE2rdvr/bt2591Pbfbra&amp;#43;&amp;#43;&amp;#43;krl5eXq16&amp;#43;fJGnVqlXy&amp;#43;/2BuGmKbdu2SZJSU1PPa14AABBdIuJk6R49euiGG27QpEmTVFZWpg8&amp;#43;&amp;#43;ED33nuvbr311sA7xg4ePKju3burrKxMkrRnzx79/ve/V3l5uf71r3/p73//u/Ly8jRw4EBdccUVdj4cAADQQkRECEn17/7q3r27hg4dquHDh&amp;#43;vaa6/V888/H7j922&amp;#43;/1a5duwLvCouLi9N7772n66&amp;#43;/Xt27d9e0adN000036Y033rDrIQAAgBbGYVmWZfcQLZnX61ViYqJqamrkcrnsHgcAADRBU5&amp;#43;/I&amp;#43;aIEAAAQHMjhAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEAIAAMYihAAAgLEIIQAAYCxCCAAAGIsQAgAAxiKEAACAsQghAABgLEIIAAAYixACAADGIoQAAICxCCEAAGAsQggAABiLEEKD/vSnP&amp;#43;mKK66Qy&amp;#43;WSy&amp;#43;WS2&amp;#43;3WO&amp;#43;&amp;#43;8Y/dYAAA0K0IIDUpPT9djjz2m8vJybd68Wdddd51GjhypiooKu0cDAKDZOCzLsuweoiXzer1KTExUTU2NXC6X3ePYqm3btnryySc1YcIEu0cBAOCMmvr83SqMMyFC&amp;#43;Xw&amp;#43;LVmyRLW1tXK73XaPAwBAsyGE8D2fT1q/XqqqklJTtSMpSe5rr9U333yjCy&amp;#43;8UK&amp;#43;//rp69uxp95QAADQbQgj1ioqkKVOkAwcCi7pdfLG2Pf64an70Iy1dulTjxo3T2rVriSEAQNTgHKGzMOIcoaIi6eabpVO/FRyO&amp;#43;j&amp;#43;XLpVyc5Wdna1LLrlE8&amp;#43;fPD/&amp;#43;MAACcg6Y&amp;#43;f/OuMdP5fPVHghrq4ZPLpk6VfD75/X7V1dWFdTwAAEKJl8ZMt3590MthJxVIGiapo2Xp6P79WpSXpzVr1mjlypVhHxEAgFAhhExXVdXg4sOS8iRVSUqUdMVHH2nlypX6yU9&amp;#43;EsbhAAAILULIdKmpDS7&amp;#43;y6kL5s6VBg8O9TQAAIQV5wiZbsAAKT39&amp;#43;xOjT&amp;#43;VwSBkZ9esBABBlCCHTxcZKc&amp;#43;bU//3UGDp5ffbs&amp;#43;vUAAIgyhBCk3Nz6t8hffHHw8vT0wFvnAQCIRpwjhHq5udLIkUGfLK0BAzgSBACIaoQQvhcbywnRAACj8NIYAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBafLH0WlmVJkrxer82TAACApjr5vH3yebwxhNBZHD16VJKUkZFh8yQAAOBcHT16VImJiY3e7rDOlkqG8/v9OnTokNq0aSOHw2H3OFHB6/UqIyND&amp;#43;/fvl8vlsnscI7EP7Mc&amp;#43;sB/7wH6h3AeWZeno0aNKS0tTTEzjZwJxROgsYmJilJ6ebvcYUcnlcvHDx2bsA/uxD&amp;#43;zHPrBfqPbBmY4EncTJ0gAAwFiEEAAAMBYhhLBzOp2aOXOmnE6n3aMYi31gP/aB/dgH9msJ&amp;#43;4CTpQEAgLE4IgQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhhLB49NFH1b9/fyUkJCgpKalJ21iWpRkzZig1NVUXXHCBsrOz9c9//jO0g0axI0eOaOzYsXK5XEpKStKECRN07NixM24zePBgORyOoMtdd90VpokjX2FhoTp37qz4&amp;#43;HhlZWWprKzsjOsvWbJE3bt3V3x8vHr37q233347TJNGr3PZBwsXLjzt&amp;#43;z0&amp;#43;Pj6M00afdevW6cYbb1RaWpocDoeWLVt21m3WrFmjK6&amp;#43;8Uk6nU5deeqkWLlwY0hkJIYTFiRMndMstt&amp;#43;juu&amp;#43;9u8jZPPPGEnn32Wc2bN08bN27UD37wA&amp;#43;Xk5Oibb74J4aTRa&amp;#43;zYsaqoqFBxcbHefPNNrVu3TpMnTz7rdpMmTVJVVVXg8sQTT4Rh2si3ePFi5efna&amp;#43;bMmdqyZYv69OmjnJwcHT58uMH1N2zYoDFjxmjChAnaunWrRo0apVGjRunjjz8O8&amp;#43;TR41z3gVT/Ccf//f2&amp;#43;d&amp;#43;/eME4cfWpra9WnTx8VFhY2af3KykqNGDFCQ4YM0bZt2zR16lRNnDhRK1euDN2QFhBGL774opWYmHjW9fx&amp;#43;v5WSkmI9&amp;#43;eSTgWVfffWV5XQ6rb/97W8hnDA6ffLJJ5Yka9OmTYFl77zzjuVwOKyDBw82ut2gQYOsKVOmhGHC6HPNNddY99xzT&amp;#43;C6z&amp;#43;ez0tLSrFmzZjW4/k9/&amp;#43;lNrxIgRQcuysrKsO&amp;#43;&amp;#43;8M6RzRrNz3QdN/fmE8yPJev3118&amp;#43;4zgMPPGBdfvnlQctGjx5t5eTkhGwujgihRaqsrJTH41F2dnZgWWJiorKyslRaWmrjZJGptLRUSUlJuuqqqwLLsrOzFRMTo40bN55x21deeUXt2rVTr169VFBQoK&amp;#43;//jrU40a8EydOqLy8POj7NyYmRtnZ2Y1&amp;#43;/5aWlgatL0k5OTl8v5&amp;#43;n89kHknTs2DF16tRJGRkZGjlypCoqKsIxLv7Djv8H/NJVtEgej0eSlJycHLQ8OTk5cBuazuPxqEOHDkHLWrVqpbZt257x3/O2225Tp06dlJaWpu3bt&amp;#43;vBBx/Url27VFRUFOqRI9oXX3whn8/X4Pfvp59&amp;#43;2uA2Ho&amp;#43;H7/dmdD77oFu3blqwYIGuuOIK1dTU6KmnnlL//v1VUVHBL98Ok8b&amp;#43;H3i9Xh0/flwXXHBBs98nR4Rw3qZPn37aiYWnXhr7gYPmEep9MHnyZOXk5Kh3794aO3asXnrpJb3&amp;#43;&amp;#43;uvas2dPMz4KoGVwu93Ky8tTZmamBg0apKKiIrVv317z58&amp;#43;3ezSEEEeEcN6mTZumO&amp;#43;6444zrdO3a9by&amp;#43;dkpKiiSpurpaqampgeXV1dXKzMw8r68ZjZq6D1JSUk47QfS7777TkSNHAv/WTZGVlSVJ2r17ty655JJzntcU7dq1U2xsrKqrq4OWV1dXN/rvnZKSck7r48zOZx&amp;#43;cqnXr1urbt692794dihHRgMb&amp;#43;H7hcrpAcDZIIIfwP2rdvr/bt24fka3fp0kUpKSkqKSkJhI/X69XGjRvP6Z1n0a6p&amp;#43;8Dtduurr75SeXm5&amp;#43;vXrJ0latWqV/H5/IG6aYtu2bZIUFKc4XVxcnPr166eSkhKNGjVKkuT3&amp;#43;1VSUqJ77723wW3cbrdKSko0derUwLLi4mK53e4wTBx9zmcfnMrn82nHjh0aPnx4CCfFf3O73ad9bETI/x&amp;#43;E7DRs4L/s3bvX2rp1q/Xwww9bF154obV161Zr69at1tGjRwPrdOvWzSoqKgpcf&amp;#43;yxx6ykpCRr&amp;#43;fLl1vbt262RI0daXbp0sY4fP27HQ4h4N9xwg9W3b19r48aN1vvvv29ddtll1pgxYwK3HzhwwOrWrZu1ceNGy7Isa/fu3dYjjzxibd682aqsrLSWL19ude3a1Ro4cKBdDyGivPrqq5bT6bQWLlxoffLJJ9bkyZOtpKQky&amp;#43;PxWJZlWbfffrs1ffr0wPoffPCB1apVK&amp;#43;upp56ydu7cac2cOdNq3bq1tWPHDrseQsQ7133w8MMPWytXrrT27NljlZeXW7feeqsVHx9vVVRU2PUQIt7Ro0cDP&amp;#43;8lWc8884y1detWa&amp;#43;/evZZlWdb06dOt22&amp;#43;/PbD&amp;#43;Z599ZiUkJFj333&amp;#43;/tXPnTquwsNCKjY21VqxYEbIZCSGExbhx4yxJp11Wr14dWEeS9eKLLwau&amp;#43;/1&amp;#43;67e//a2VnJxsOZ1Oa&amp;#43;jQodauXbvCP3yU&amp;#43;PLLL60xY8ZYF154oeVyuazx48cHhWhlZWXQPtm3b581cOBAq23btpbT6bQuvfRS6/7777dqampsegSR57nnnrM6duxoxcXFWddcc4314YcfBm4bNGiQNW7cuKD1X3vtNeuHP/yhFRcXZ11&amp;#43;&amp;#43;eXWW2&amp;#43;9FeaJo8&amp;#43;57IOpU6cG1k1OTraGDx9ubdmyxYapo8fq1asb/Nl/8t993Lhx1qBBg07bJjMz04qLi7O6du0a9LwQCg7LsqzQHW8CAABouXjXGAAAMBYhBAAAjEUIAQAAYxFCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQTAGD6fT/3791dubm7Q8pqaGmVkZOg3v/mNTZMBsAu/YgOAUf7xj38oMzNTL7zwgsaOHStJysvL00cffaRNmzYpLi7O5gkBhBMhBMA4zz77rH73u9&amp;#43;poqJCZWVluuWWW7Rp0yb16dPH7tEAhBkhBMA4lmXpuuuuU2xsrHbs2KH77rtPDz30kN1jAbABIQTASJ9&amp;#43;&amp;#43;ql69Oih3r17a8uWLWrVqpXdIwGwASdLAzDSggULlJCQoMrKSh04cMDucQDYhCNCAIyzYcMGDRo0SO&amp;#43;&amp;#43;&amp;#43;67&amp;#43;8Ic/SJLee&amp;#43;89ORwOmycDEG4cEQJglK&amp;#43;//lp33HGH7r77bg0ZMkR/&amp;#43;ctfVFZWpnnz5tk9GgAbcEQIgFGmTJmit99&amp;#43;Wx999JESEhIkSfPnz9evfvUr7dixQ507d7Z3QABhRQgBMMbatWs1dOhQrVmzRtdee23QbTk5Ofruu&amp;#43;94iQwwDCEEAACMxTlCAADAWIQQAAAwFiEEAACMRQgBAABjEUIAAMBYhBAAADAWIQQAAIxFCAEAAGMRQgAAwFiEEAAAMBYhBAAAjPX/vEx0NPqcsAgAAAAASUVORK5CYII=&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Output Image&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;当然实际的 RoPE 编码不会像上面那样实现，而且在 Transformer 中，一般对 q, k 向量进行位置嵌入，而不是直接对原始 token 进行位置嵌入。详情可参考 LLAMA 的实现：&lt;a class=&#34;link&#34; href=&#34;https://github.com/meta-llama/llama-models/blob/a9c89c471f793423afd4cc3ca8671d6e56fe64cb/models/llama4/model.py#L89&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/meta-llama/llama-models/blob/a9c89c471f793423afd4cc3ca8671d6e56fe64cb/models/llama4/model.py#L89&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;为什么对 $q$, $k$ 向量进行位置嵌入呢？刚刚提到，RoPE 编码想要使得编码后的向量内积和距离相关。在 Transformer 中，q 和 k 向量正好需要进行内积操作：
$$
Attention(q,k,v) = softmax(\frac{qk^t}{\sqrt{d_k}})v
$$
因此，在 $Attention$ 操作前对 $q$ 和 $k$ 向量进行 RoPE 编码，$qk^t$ 就隐含了相对位置信息，从而使得 $Attention$ 也隐含了相对位置信息。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>缓冲区溢出漏洞及缓解机制</title>
        <link>http://blog.anlor.top/post/buffer-overflow-overview/</link>
        <pubDate>Wed, 20 Nov 2024 16:37:15 +0800</pubDate>
        
        <guid>http://blog.anlor.top/post/buffer-overflow-overview/</guid>
        <description>&lt;img src="http://blog.anlor.top/post/buffer-overflow-overview/images/cover.webp" alt="Featured image of post 缓冲区溢出漏洞及缓解机制" /&gt;&lt;p&gt;封面图：&lt;a class=&#34;link&#34; href=&#34;https://www.bilibili.com/opus/993288080028860441&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.bilibili.com/opus/993288080028860441&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;引言&#34;&gt;引言
&lt;/h2&gt;&lt;p&gt;迄今为止，缓冲区溢出已被识别为最常见且最危险的漏洞。根据 2019 年通用漏洞和暴露（CVE）列表，它是报告频率最高的漏洞，报告了超过 400 个漏洞。截至 2021 年 5 月，CVE 数据库中报告的缓冲区溢出漏洞数量已达到 13,700 多个。在所有缓冲区溢出漏洞中，基于栈的缓冲区溢出是最常见的类型。本文将介绍各种用于缓解缓冲区溢出漏洞的机制和它们的绕过方法，并介绍最近的一个栈溢出漏洞 &lt;a class=&#34;link&#34; href=&#34;https://www.cve.org/CVERecord?id=CVE-2024-9632&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CVE-2024-9632&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;基于硬件的缓解技术&#34;&gt;基于硬件的缓解技术
&lt;/h2&gt;&lt;p&gt;基于硬件的缓解技术中，最著名的就是 NX（No-eXecute）技术。NX 技术是一种硬件支持的内存保护技术，它通过在内存页表中设置一个标志位来防止代码执行。当试图执行一个被标记为不可执行的内存区域时，CPU 会产生一个异常，从而阻止攻击者执行恶意代码。还有一些其它的研究工作，如 SmashGuard 通过在 CPU 上实现一个硬件堆栈来保存返回地址，HSDefender 通过设计安全的&lt;code&gt;call&lt;/code&gt;指令来防止栈溢出攻击等。以下主要介绍 NX 技术。&lt;/p&gt;
&lt;h3 id=&#34;nx技术&#34;&gt;NX技术
&lt;/h3&gt;&lt;p&gt;在冯诺依曼架构中，使用相同的内存空间来存储代码和数据。这是通过分页来实现的，但分页机制不允许用户在特定内存区域上独立设置读写和执行权限，而仅允许三种权限：non-accessible、readable-executable（RX）和 readablewriteable-executable（RWX）。因此，如果页面设置了可读写，那么它就一定是可执行的。攻击者可以利用这一点，将恶意代码注入到内存中，并通过覆盖返回地址的方式来执行恶意代码。为了解决这个问题，NX技术被引入到现代 CPU 中。&lt;/p&gt;
&lt;p&gt;操作系统可以通过操作NX位来将某些内存区域标记为不可执行。NX 的位号是 63，这是页表中最高有效位。如果特定页面的 NX 位设置为 0，则可以执行该代码；如果设置为 1，则它是仅包含数据的不可执行页面。NX（no-execute）功能仅适用于 64 位模式。NX 功能的一个重要之处在于它是运行时策略，应用无需重新编译即可从此功能中受益。操作系统利用 NX 位将堆栈/堆内存标记为不可执行，从而防止了相当一部分利用缓冲区溢出的代码注入攻击。&lt;/p&gt;
&lt;h3 id=&#34;nx技术的绕过&#34;&gt;NX技术的绕过
&lt;/h3&gt;&lt;p&gt;为了绕过 NX 技术，一种常见的思路是代码重用攻击。代码重用攻击是一种利用程序中已有的代码片段来实现攻击目的的攻击方式。这种攻击方式不需要向内存中注入恶意代码。ROP攻击是一种高级形式的代码重用攻击。以下介绍 ROP 攻击的基本原理。&lt;/p&gt;
&lt;h4 id=&#34;rop攻击&#34;&gt;ROP攻击
&lt;/h4&gt;&lt;p&gt;ROP 使用预先存在的名为 “gadgets” 的小指令序列来实施攻击。这些 gadgets 是结合在一起可以执行高级任务的短指令序列。gadgets 必须是有效的以返回指令结尾指令序列，从而让 CPU 继续执行下一个 gadgets 或有效载荷。在发起攻击时，攻击者通常会用跳转到第一个 gadgets 的代码指针覆盖堆栈上保存的返回地址。ROP 攻击的流程图如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://blog.anlor.top/post/buffer-overflow-overview/images/ROP.webp&#34;
	width=&#34;121&#34;
	height=&#34;801&#34;
	srcset=&#34;http://blog.anlor.top/post/buffer-overflow-overview/images/ROP_hu_57a699bb6f0a71e1.webp 480w, http://blog.anlor.top/post/buffer-overflow-overview/images/ROP_hu_fe94b769e4c30789.webp 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;ROP攻击流程图&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;15&#34;
		data-flex-basis=&#34;36px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;常见的可用于 ROP 攻击的 gadgets 包括 &lt;code&gt;pop rdi; ret&lt;/code&gt; 和 &lt;code&gt;system()&lt;/code&gt; 等。&lt;code&gt;system()&lt;/code&gt; 函数可以执行系统命令，而 &lt;code&gt;pop rdi; ret&lt;/code&gt; 可以将参数传递给 &lt;code&gt;system()&lt;/code&gt; 函数。通过将这两个 gadgets 结合在一起，攻击者可以执行任意系统命令。在查找 gadgets 的步骤，攻击者可以通过各种调试器和反汇编工具来在二进制文件中查找这些指令。&lt;/p&gt;
&lt;h2 id=&#34;基于操作系统的缓解技术&#34;&gt;基于操作系统的缓解技术
&lt;/h2&gt;&lt;p&gt;有许多基于操作系统的缓解技术。例如 libsafe 通过修改标准库来提供更安全的函数，地址混淆和二进制搅拌技术都是在加载时对目标二进制文件进行修改，以使攻击者难以找到目标函数的地址。而最常见的基于操作系统的缓解技术是 ASLR 技术。以下主要介绍 ASLR 技术。&lt;/p&gt;
&lt;h3 id=&#34;aslr技术&#34;&gt;ASLR技术
&lt;/h3&gt;&lt;p&gt;在上文中介绍了 ROP，其必须知道 gadgets 的地址。ASLR随机化进程各个部分的基址，包括堆栈、堆、共享库和可执行文件。因此，攻击者不能每次都使用相同的漏洞来滥用相同的易受攻击的程序。每次程序运行时，系统会将程序的代码段、堆、栈以及动态库加载到不同的随机地址。攻击者无法直接预测这些关键区域的精确地址，从而难以利用固定地址的内存漏洞。&lt;/p&gt;
&lt;h3 id=&#34;aslr技术的绕过&#34;&gt;ASLR技术的绕过
&lt;/h3&gt;&lt;p&gt;在 32 位系统中，ASLR 技术的绕过相对容易，因为 32 位系统的内存地址空间相对较小，ASLR 的随机性有限，地址中通常只有 8 或 16 位被随机化。攻击者可以通过不断尝试可能的内存地址来暴力破解 ASLR。在 64 位系统中，地址中有 40 位被随机化，因此暴力破解的难度大大增加。但是，攻击者仍然可以通过泄露内存地址和信息泄露等方式来绕过 ASLR。以下主要介绍信息泄露技术。&lt;/p&gt;
&lt;h4 id=&#34;信息泄露技术&#34;&gt;信息泄露技术
&lt;/h4&gt;&lt;p&gt;信息泄露技术的流程如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://blog.anlor.top/post/buffer-overflow-overview/images/info_leak.webp&#34;
	width=&#34;121&#34;
	height=&#34;811&#34;
	srcset=&#34;http://blog.anlor.top/post/buffer-overflow-overview/images/info_leak_hu_41d0ad0770ba6b3.webp 480w, http://blog.anlor.top/post/buffer-overflow-overview/images/info_leak_hu_ceff75364c892662.webp 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;信息泄露技术流程图&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;14&#34;
		data-flex-basis=&#34;35px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;其中一种信息泄露方法是利用过程链接表（PLT）和全局偏移表（GOT）这两种数据结构。PLT 是一种数据结构，用于调用外部函数，这些函数的地址在运行时由动态链接器解析。GOT 是一个数组，其中包含进程当前使用的全局变量和库函数的绝对地址。当程序调用函数时，查找 PLT 中的条目，条目中包含跳转指令，可以跳转到 GOT 中的条目。GOT 调用动态链接器来获取函数地址并存储在自己的条目中，这样程序就可以通过函数地址来调用函数。如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://blog.anlor.top/post/buffer-overflow-overview/images/PLT_and_GOT.png&#34;
	width=&#34;720&#34;
	height=&#34;515&#34;
	srcset=&#34;http://blog.anlor.top/post/buffer-overflow-overview/images/PLT_and_GOT_hu_9eafac655869912e.png 480w, http://blog.anlor.top/post/buffer-overflow-overview/images/PLT_and_GOT_hu_2703f1d99903c42d.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;PLT和GOT&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;139&#34;
		data-flex-basis=&#34;335px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;通过获取 PLT 和 GOT 中的地址，攻击者可以泄露程序中的地址信息，从而绕过 ASLR。具体地说，利用调试器可以获取某个函数的 PLT 地址，之后反汇编该地址的指令就能获得 GOT 的地址。通过获得 GOT 中的地址，攻击者可以获取到函数的绝对地址。之后通过库文件来获取其它函数和该函数的相对偏移，就可以利用该函数的地址加上相对偏移来调用任意库函数。&lt;/p&gt;
&lt;p&gt;另外，&lt;code&gt;printf()&lt;/code&gt; 函数也是一个常用的信息泄露工具。如果攻击者可以修改 &lt;code&gt;printf()&lt;/code&gt; 函数的格式控制字符串，就可以泄露栈上的数据。例如，通过 &lt;code&gt;%lx&lt;/code&gt; 格式控制字符，攻击者就可以获得泄露的内存地址。&lt;/p&gt;
&lt;h2 id=&#34;基于编译器的缓解技术&#34;&gt;基于编译器的缓解技术
&lt;/h2&gt;&lt;p&gt;有许多缓解技术在编译器这一层面实现。其中一些可视为对基于操作系统和硬件的缓解技术的补充。例如，PIC 技术将代码编译为位置无关的机器码指令，从而让这些指令可以被加载到任意地址；PIE 技术编译出的可执行文件的不同部分可以使用不同的基址，从而增加了攻击者猜测基址的难度。这两个技术都是 ASLR 的补充。另一些技术则从其它方面进行保护，例如 StackGuard, ProPolice, Address Sanitizer 等。基于编译器的缓解技术很多，且大多数都在主流编译器中有广泛应用，无法一一列举，以下主要介绍 RELRO 和 StackGuard 两种技术。&lt;/p&gt;
&lt;h3 id=&#34;relro技术&#34;&gt;RELRO技术
&lt;/h3&gt;&lt;p&gt;RELRO 技术是一种保护机制，用于防止全局偏移表（GOT）被攻击者利用。在首次调用共享库函数时，动态链接器会将 GOT 表中的地址填充为真实地址。也就是说，GOT 表在程序运行时是可写的。并且，GOT 表需要位于已知位置，因为它包含了程序运行时的必要信息。这给了攻击者一个机会，可以通过覆盖 GOT 表中的地址来执行恶意代码。&lt;/p&gt;
&lt;p&gt;RELRO 技术通过将 GOT 表标记为只读来解决这个问题。RELRO 技术有两种类型：Partial RELRO 和 Full RELRO。Partial RELRO 会在程序启动时将 GOT 表的部分标记为只读，通常只保护不频繁改变的全局变量和一些只读数据段。动态链接中的某些函数指针仍可能被攻击者利用。Full RELRO比Partial RELRO更安全，它会在程序加载完成后，将整个GOT段标记为只读。所有GOT表项，包括动态链接的函数指针，都会被标记为只读，彻底防止了指针修改。其缺点是对程序启动速度影响较大，因为它要求在程序运行前完成所有符号解析。&lt;/p&gt;
&lt;h3 id=&#34;relro技术的绕过&#34;&gt;RELRO技术的绕过
&lt;/h3&gt;&lt;p&gt;RELRO 技术的绕过方法主要针对 Partial RELRO。对于 Partial RELRO，动态链接中的某些函数指针未受保护，例如 &lt;code&gt;printf()&lt;/code&gt; 函数。可以通过覆写 GOT 表中的 &lt;code&gt;printf()&lt;/code&gt; 函数指针来执行任意代码。&lt;/p&gt;
&lt;h3 id=&#34;stackguard-技术&#34;&gt;StackGuard 技术
&lt;/h3&gt;&lt;p&gt;StackGuard 通过在返回地址旁边插入一个“护符”（Canary）来防止返回地址被修改。该护符将会挡在缓冲区和返回地址之间。在函数体执行完毕后，控制返回前，它会将护符与保存在其它位置的副本进行比较，只有当护符保持不变时，才会跳转到函数的返回地址。在常规的栈溢出攻击中，攻击者采用的方法是线性、顺序且按升序覆盖字节。这使得在不覆盖护符的情况下改变返回地址几乎不可能。&lt;/p&gt;
&lt;h3 id=&#34;stackguard-技术的绕过&#34;&gt;StackGuard 技术的绕过
&lt;/h3&gt;&lt;p&gt;绕过 StackGuard 技术的主要思路是想办法找到护符的值。刚刚提到，护符位于缓冲区和返回地址之间的某个位置，同时在其它位置还会有护符的副本；在程序返回时，为了检查护符是否被篡改，护符通常还会被加载到寄存器中。这些情况为信息泄露攻击提供了机会。通过信息泄露攻击，攻击者可以获取到护符的值，从而绕过 StackGuard 技术。&lt;/p&gt;
&lt;h2 id=&#34;漏洞-cve-2024-9632-介绍&#34;&gt;漏洞 CVE-2024-9632 介绍
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.cve.org/CVERecord?id=CVE-2024-9632&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CVE-2024-9632&lt;/a&gt; 漏洞是一个缓冲区溢出漏洞。该漏洞存在于 &lt;code&gt;xorg-xserver&lt;/code&gt; 中。该软件是 Linux 系统下最常见的显示服务器，用于管理图形显示设备。本地攻击者可以通过利用该漏洞发起拒绝服务攻击，如果 &lt;code&gt;xorg-xserver&lt;/code&gt; 以 root 权限运行，攻击者还能获得提升的权限，甚至完全控制系统。该漏洞被标记为高危险性。&lt;/p&gt;
&lt;h3 id=&#34;漏洞原理&#34;&gt;漏洞原理
&lt;/h3&gt;&lt;p&gt;产生漏洞的代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;XkbSymInterpretPtr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sym&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;skipped&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;unsigned&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;firstSI&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nSI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;compat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num_si&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;compat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num_si&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;firstSI&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nSI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;compat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sym_interpret&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;reallocarray&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sym_interpret&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                 &lt;span class=&#34;n&#34;&gt;compat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num_si&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                 &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XkbSymInterpretRec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sym_interpret&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;compat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num_si&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BadAlloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中，&lt;code&gt;compat-&amp;gt;sym_interpret&lt;/code&gt; 是一个数组，存储了 &lt;code&gt;XkbSymInterpretRec&lt;/code&gt; 类型的结构体，每个结构体表示一种键盘符号（symbol）与修饰符（modifier）组合的解释方式。该解释方式用于决定在特定符号与修饰符输入下应该执行的操作，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;激活一个功能键。&lt;/li&gt;
&lt;li&gt;触发一个特定的动作（如执行 XFree86 私有动作 &lt;code&gt;XkbSA_XFree86Private&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而 &lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 是一个整型变量，记录当前 &lt;code&gt;compat-&amp;gt;sym_interpret&lt;/code&gt; 数组中元素的个数。&lt;/p&gt;
&lt;p&gt;在这段代码中没有出现的还有一个变量，那就是 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt;。该变量用于记录 &lt;code&gt;compat-&amp;gt;sym_interpret&lt;/code&gt; 数组的容量。它和 &lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 的区别在于，&lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 记录的是当前数组中的元素个数，而 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt; 记录的是数组的容量。也就是说，在理想情况下，&lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 应该永远小于等于 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt;。当 &lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 等于 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt; 时，表示数组已满。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;xorg-xserver&lt;/code&gt; 允许客户端发起更新 &lt;code&gt;compat-&amp;gt;sym_interpret&lt;/code&gt; 数组的请求。请求中的 &lt;code&gt;firstSI&lt;/code&gt; 和 &lt;code&gt;nSI&lt;/code&gt; 字段分别表示要更新的数组元素的起始位置和更新的元素个数。当它们之和超过了当前元素个数时，表示客户端需要增加数组的大小。&lt;code&gt;reallocarray&lt;/code&gt; 函数会重新分配内存，以容纳新的元素。这就是这段代码的主要工作。&lt;/p&gt;
&lt;p&gt;然而，这段代码中仅仅更新了 &lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt;，而没有更新 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt;。这样就可能不再满足上文提到的 &lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 应永远小于等于 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt; 的假设。在之后，它调用 &lt;code&gt;reallocarray&lt;/code&gt; 将 &lt;code&gt;compat-&amp;gt;sym_interpret&lt;/code&gt; 调整为了 &lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 的大小。这就导致数组被分配到的内存空间超过了它本应占有的内存空间 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt;，从而导致了缓冲区溢出漏洞。攻击者可以通过构造一个特别长的更新请求来触发这个漏洞。&lt;/p&gt;
&lt;h3 id=&#34;防御措施&#34;&gt;防御措施
&lt;/h3&gt;&lt;p&gt;以下是修复补丁，&lt;a class=&#34;link&#34; href=&#34;https://gitlab.freedesktop.org/xorg/xserver/-/commit/85b776571487f52e756f68a069c768757369bfe3.diff&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;相关链接&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;@@ -2990,13 +2990,13 @@ _XkbSetCompatMap(ClientPtr client, DeviceIntPtr dev,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         XkbSymInterpretPtr sym;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         unsigned int skipped = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-        if ((unsigned) (req-&amp;gt;firstSI + req-&amp;gt;nSI) &amp;gt; compat-&amp;gt;num_si) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-            compat-&amp;gt;num_si = req-&amp;gt;firstSI + req-&amp;gt;nSI;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+        if ((unsigned) (req-&amp;gt;firstSI + req-&amp;gt;nSI) &amp;gt; compat-&amp;gt;size_si) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+            compat-&amp;gt;num_si = compat-&amp;gt;size_si = req-&amp;gt;firstSI + req-&amp;gt;nSI;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             compat-&amp;gt;sym_interpret = reallocarray(compat-&amp;gt;sym_interpret,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-                                                 compat-&amp;gt;num_si,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+                                                 compat-&amp;gt;size_si,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                  sizeof(XkbSymInterpretRec));
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             if (!compat-&amp;gt;sym_interpret) {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-                compat-&amp;gt;num_si = 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+                compat-&amp;gt;num_si = compat-&amp;gt;size_si = 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 return BadAlloc;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从补丁文件中可以看出，主要的修复措施是在更新 &lt;code&gt;compat-&amp;gt;num_si&lt;/code&gt; 时，同时更新 &lt;code&gt;compat-&amp;gt;size_si&lt;/code&gt;。这样就保证了 &lt;code&gt;compat-&amp;gt;sym_interpret&lt;/code&gt; 数组的大小不会超过它的容量。&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;本文介绍了缓冲区溢出漏洞的概念，以及各种缓解缓冲区溢出漏洞的技术。其中，NX 技术通过将内存区域标记为不可执行来防止代码注入攻击；ASLR 技术通过随机化进程各个部分的基址来增加攻击者猜测基址的难度；RELRO 技术通过将 GOT 表标记为只读来防止攻击者利用 GOT 表；StackGuard 技术通过在返回地址旁边插入一个护符来防止返回地址被修改。最后，本文介绍了一个最近的栈溢出漏洞 &lt;a class=&#34;link&#34; href=&#34;https://www.cve.org/CVERecord?id=CVE-2024-9632&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CVE-2024-9632&lt;/a&gt; 的原理和修复措施。可以看到，尽管有了这些防御措施，但仍然有很多方法可以绕过这些技术，而错误的代码实现也会导致漏洞的产生。现有的漏洞缓解技术仍有很大提升空间，值得进一步研究。同时开发者也应该在编写代码时遵循安全编程规范，同时关注最新的漏洞信息，及时修复已知的漏洞。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>一道关于内存分配的题</title>
        <link>http://blog.anlor.top/post/an-exam-question-about-memory-distribution/</link>
        <pubDate>Thu, 26 Jan 2023 15:54:53 +0800</pubDate>
        
        <guid>http://blog.anlor.top/post/an-exam-question-about-memory-distribution/</guid>
        <description>&lt;img src="http://blog.anlor.top/post/an-exam-question-about-memory-distribution/images/cover.webp" alt="Featured image of post 一道关于内存分配的题" /&gt;&lt;p&gt;封面图：&lt;a class=&#34;link&#34; href=&#34;https://www.pixiv.net/artworks/95681846&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.pixiv.net/artworks/95681846&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;曾经我以为没有递归的程序阅读题都是渣渣，直到……&lt;/p&gt;
&lt;h2 id=&#34;题目描述&#34;&gt;题目描述
&lt;/h2&gt;&lt;p&gt;下面代码进行数组与指针的操作，已知&amp;amp;score[0]的值为 0x00FF2000。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;short&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;short&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;long&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%p, %p&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%d, %d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;(1) 请说明数组名score 的含义。&lt;/p&gt;
&lt;p&gt;(2) 写出程序执行结果。&lt;/p&gt;
&lt;p&gt;非官方答案：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(1)指向数组score头元素的指针
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(2)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0x00FF2002 0x00FF2004
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1 131073
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注：在64位linux系统上时，第一个printf输出的第二个数应为0x00FF2008&lt;/p&gt;
&lt;h2 id=&#34;题目详解&#34;&gt;题目详解
&lt;/h2&gt;&lt;p&gt;首先第一小题完全莫名其妙，不讲。&lt;/p&gt;
&lt;p&gt;有意思的是第二小题，这个程序有两个&lt;code&gt;printf&lt;/code&gt;语句，第一个&lt;code&gt;printf&lt;/code&gt;主要考察指针运算。众所周知，假设指针的类型长度为&lt;code&gt;n&lt;/code&gt;，那么指针加&lt;code&gt;k&lt;/code&gt;，指针实际移动&lt;code&gt;n*k&lt;/code&gt;。在本例中，指针&lt;code&gt;p1&lt;/code&gt;的类型是&lt;code&gt;short int *&lt;/code&gt;，&lt;code&gt;short int&lt;/code&gt;的类型长度是2个字节，此处&lt;code&gt;p1+1&lt;/code&gt;，实际地址增加2，即&lt;code&gt;0x00FF2002&lt;/code&gt;。&lt;code&gt;p3+1&lt;/code&gt;同理。但是这里有个小坑，&lt;code&gt;long int&lt;/code&gt; 在64位linux系统上是8个字节，在windows上是4个字节。实际考试中应指定&lt;code&gt;long int&lt;/code&gt;长度。&lt;/p&gt;
&lt;p&gt;第二个printf语句是输出两个指针对应的内容。我们先忽略格式控制符，看后面的两个参数。第一个参数是&lt;code&gt;*p1&lt;/code&gt;，又因为&lt;code&gt;p1=score&lt;/code&gt;，&lt;code&gt;p1&lt;/code&gt;和&lt;code&gt;score&lt;/code&gt;都是&lt;code&gt;short int *&lt;/code&gt;类型，所以毫无疑问这里是取&lt;code&gt;score[0]&lt;/code&gt;，也就是&lt;code&gt;1&lt;/code&gt;。第二个参数是&lt;code&gt;*p3&lt;/code&gt;，也有&lt;code&gt;p3=score&lt;/code&gt;，但是p3是&lt;code&gt;long int *&lt;/code&gt;，在它执行&lt;code&gt;*&lt;/code&gt;运算的时候会一次取&lt;code&gt;long int&lt;/code&gt;长度的内容，也就是取4个字节。然而，一个&lt;code&gt;short int&lt;/code&gt;类型只占2个字节，所以这里发生了访问溢出。那么这里到底取出来了什么呢？这就需要从内存里分析了。&lt;/p&gt;
&lt;h3 id=&#34;程序内存分配分析&#34;&gt;程序内存分配分析
&lt;/h3&gt;&lt;p&gt;相信大家都很熟悉下面这张图：
&lt;img src=&#34;http://blog.anlor.top/post/an-exam-question-about-memory-distribution/images/%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.png&#34;
	width=&#34;707&#34;
	height=&#34;593&#34;
	srcset=&#34;http://blog.anlor.top/post/an-exam-question-about-memory-distribution/images/%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D_hu_9003e6088bc7233d.png 480w, http://blog.anlor.top/post/an-exam-question-about-memory-distribution/images/%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D_hu_dd54df61c665893.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;内存分配&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;119&#34;
		data-flex-basis=&#34;286px&#34;
	
&gt;
这张图展示了计算机内存分配的顺序。我们知道，对于局部变量，系统在栈区从高地址向低地址分配内存。
而在数组内部则是从低地址向高地址分配内存。因此变量相对位置如表：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;内存内容&lt;/th&gt;
          &lt;th&gt;内存属主&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;0x00FF2000&lt;/td&gt;
          &lt;td&gt;p1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;0x00FF2000&lt;/td&gt;
          &lt;td&gt;p3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;未知&lt;/td&gt;
          &lt;td&gt;score[9]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;9&lt;/td&gt;
          &lt;td&gt;score[8]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;8&lt;/td&gt;
          &lt;td&gt;score[7]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7&lt;/td&gt;
          &lt;td&gt;score[6]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6&lt;/td&gt;
          &lt;td&gt;score[5]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;score[4]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;score[3]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;score[2]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;score[1]&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;score[0]&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;当进行&lt;code&gt;*p3&lt;/code&gt;操作时，从低地址向高地址进行操作，取出的即为score[0]和score[1]占用的内存空间。&lt;/p&gt;
&lt;h3 id=&#34;计算机中的整数&#34;&gt;计算机中的整数
&lt;/h3&gt;&lt;p&gt;一般来说，整数以补码的形式存储在内存中。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;正数的补码等于其原码，负数的补码等于模减去其绝对值的原码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;考虑到short int 占两个字节，也就是16位二进制，4位十六进制，那么可以得到：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C&#34; data-lang=&#34;C&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;short&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mo&#34;&gt;0000000000000001&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mo&#34;&gt;0001&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;H&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;short&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mo&#34;&gt;0000000000000010&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;B&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mo&#34;&gt;0002&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;H&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在常用家用计算机（小端机）中，数字&lt;strong&gt;高位存储在高地址，低位存储在低地址&lt;/strong&gt;，在虚拟内存中，最小操作单位是字节，也即两位16进制。因此在虚拟内存中存储情况类似：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;内存内容&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;高地址&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;00H&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;02H&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;00H&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;01H&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;低地址&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;回到p3&#34;&gt;回到&lt;code&gt;*p3&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;当&lt;code&gt;*p3&lt;/code&gt;取数时，取出的即为上面这一串十六进制。我们按我们习惯的高位在前进行拼接，最终结果就是&lt;code&gt;00020001H&lt;/code&gt;，即&lt;code&gt;131073&lt;/code&gt;。
除此之外，我们还需要关注格式控制符。幸运的是，这里的格式控制符是&lt;code&gt;%d&lt;/code&gt;，在Windows平台下刚好能够兼容&lt;code&gt;*p1&lt;/code&gt;和&lt;code&gt;*p3&lt;/code&gt;，因此没有什么问题。于是我们能够得出最后的结果：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1 131073
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;其实这是一道非常简单的关于内存分配的题目，不过涉及到比较复杂的内存分配机制问题，所以记个笔记来记录一下。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
