源园 發表於 2021-7-8 08:35:00

Delphi使用Zxing创建二维码

<p>效果</p>
<p><img src="https://img2020.cnblogs.com/blog/911540/202107/911540-20210708082926054-753062941.gif" alt="" loading="lazy"></p>
<h4>DelphiZXingQRCode下载地址:https://www.debenu.com/open-source/delphizxingqrcode/</h4>
<p>为了调用方便unit DelphiZXIngQRCode增加了一个过程</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span> EncodeToImage(<span style="color: rgba(0, 0, 255, 1)">const</span> text: <span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Img: TImage);

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TDelphiZXingQRCode.EncodeToImage(<span style="color: rgba(0, 0, 255, 1)">const</span> text: <span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Img: TImage);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Row, Column: Integer;
BMP: TBitmap;
Scale: Double;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Data :</span>=<span style="color: rgba(0, 0, 0, 1)"> text;
BMP :</span>= TBitmap.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
BMP.Height :</span>=<span style="color: rgba(0, 0, 0, 1)"> Rows;
BMP.Width :</span>=<span style="color: rgba(0, 0, 0, 1)"> Columns;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> Row := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Rows - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> Column := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Columns - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (IsBlack) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      BMP.Canvas.Pixels :</span>=<span style="color: rgba(0, 0, 0, 1)"> clBlack
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
      BMP.Canvas.Pixels :</span>=<span style="color: rgba(0, 0, 0, 1)"> clWhite;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Img.Canvas.Brush.Color :</span>=<span style="color: rgba(0, 0, 0, 1)"> clWhite;
Img.Canvas.FillRect(Rect(</span><span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Img.Width, Img.Height));
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((BMP.Width &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (BMP.Height &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (Img.Width &lt; Img.Height) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Scale :</span>= Img.Width /<span style="color: rgba(0, 0, 0, 1)"> BMP.Width
    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
      Scale :</span>= Img.Height /<span style="color: rgba(0, 0, 0, 1)"> BMP.Height;
    Img.Canvas.StretchDraw(Rect(</span><span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, Trunc(Scale * BMP.Width), Trunc(Scale *<span style="color: rgba(0, 0, 0, 1)"> BMP.Height)), BMP);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
BMP.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>调用方式</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
DelphiZXIngQRCode;


</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
zxing: TDelphiZXingQRCode;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
zxing :</span>= TDelphiZXingQRCode.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">二维码外边距</span>
    zxing.QuietZone :=<span style="color: rgba(0, 0, 0, 1)"> SpinEdit1.Value;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">可选值qrAuto, qrNumeric, qrAlphanumeric, qrISO88591, qrUTF8NoBOM, qrUTF8BOM</span>
    zxing.Encoding :=<span style="color: rgba(0, 0, 0, 1)"> TQRCodeEncoding(ComboBox1.ItemIndex);
    zxing.EncodeToImage(Memo1.Text, Image1);
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    zxing.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>DelphiZXIngQRCode.pas</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_b25f5c29-030c-4835-9769-bf26c25b2658" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_b25f5c29-030c-4835-9769-bf26c25b2658" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_b25f5c29-030c-4835-9769-bf26c25b2658" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> DelphiZXIngQRCode;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ZXing QRCode port to Delphi, by Debenu Pty Ltd</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> www.debenu.com</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Original copyright notice</span><span style="color: rgba(0, 128, 0, 1)">
(*</span><span style="color: rgba(0, 128, 0, 1)">
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
</span><span style="color: rgba(0, 128, 0, 1)">*)</span>

<span style="color: rgba(0, 0, 255, 1)">interface</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Vcl.Graphics, Vcl.ExtCtrls;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TQRCodeEncoding </span>=<span style="color: rgba(0, 0, 0, 1)"> (qrAuto, qrNumeric, qrAlphanumeric, qrISO88591, qrUTF8NoBOM, qrUTF8BOM);

T2DBooleanArray </span>= <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span> <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Boolean;

TDelphiZXingQRCode </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)">
    FData: WideString;
    FRows: Integer;
    FColumns: Integer;
    FEncoding: TQRCodeEncoding;
    FQuietZone: Integer;
    FElements: T2DBooleanArray;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetEncoding(NewEncoding: TQRCodeEncoding);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> SetData(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> NewData: WideString);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetQuietZone(NewQuietZone: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetIsBlack(Row, Column: Integer): Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Update;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Data: WideString <span style="color: rgba(0, 0, 255, 1)">read</span> FData <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetData;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Encoding: TQRCodeEncoding <span style="color: rgba(0, 0, 255, 1)">read</span> FEncoding <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetEncoding;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> QuietZone: Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FQuietZone <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> SetQuietZone;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Rows: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FRows;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Columns: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FColumns;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> IsBlack: Boolean <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> GetIsBlack;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> EncodeToImage(<span style="color: rgba(0, 0, 255, 1)">const</span> text: <span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Img: TImage);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">implementation</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
contnrs, Math, Classes;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TByteArray </span>= <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Byte;

T2DByteArray </span>= <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span> <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Byte;

TIntegerArray </span>= <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer;

</span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)">
NUM_MASK_PATTERNS </span>= <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">;
QUIET_ZONE_SIZE </span>= <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">;
ALPHANUMERIC_TABLE: </span><span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">95</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = (-<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 0x00-0x0f</span>
    -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 0x10-0x1f</span>
    <span style="color: rgba(128, 0, 128, 1)">36</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">37</span>, <span style="color: rgba(128, 0, 128, 1)">38</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">39</span>, <span style="color: rgba(128, 0, 128, 1)">40</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">41</span>, <span style="color: rgba(128, 0, 128, 1)">42</span>, <span style="color: rgba(128, 0, 128, 1)">43</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 0x20-0x2f</span>
    <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">44</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 0x30-0x3f</span>
    -<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>, <span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">18</span>, <span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">20</span>, <span style="color: rgba(128, 0, 128, 1)">21</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 0x40-0x4f</span>
    <span style="color: rgba(128, 0, 128, 1)">25</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">27</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">29</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">31</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">33</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">35</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 0x50-0x5f</span>
<span style="color: rgba(0, 0, 0, 1)">    );
DEFAULT_BYTE_MODE_ENCODING </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ISO-8859-1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
POSITION_DETECTION_PATTERN: </span><span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">6</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ((<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));
HORIZONTAL_SEPARATION_PATTERN: </span><span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">7</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ((<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">));
VERTICAL_SEPARATION_PATTERN: </span><span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">0</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ((<span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">));
POSITION_ADJUSTMENT_PATTERN: </span><span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">4</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ((<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> From Appendix E. Table 1, JIS0510X:2004 (p 71). The table was double-checked by komatsu.</span>
POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE: <span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">39</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">6</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ((-<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 1</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">18</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 2</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 3</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 4</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 5</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 6</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">38</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 7</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>, <span style="color: rgba(128, 0, 128, 1)">42</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 8</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 9</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 10</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 11</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 12</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 13</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>, <span style="color: rgba(128, 0, 128, 1)">66</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 14</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>, <span style="color: rgba(128, 0, 128, 1)">70</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 15</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">74</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 16</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 17</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">56</span>, <span style="color: rgba(128, 0, 128, 1)">82</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 18</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 19</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>, <span style="color: rgba(128, 0, 128, 1)">90</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 20</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">72</span>, <span style="color: rgba(128, 0, 128, 1)">94</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 21</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">74</span>, <span style="color: rgba(128, 0, 128, 1)">98</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 22</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 23</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">80</span>, <span style="color: rgba(128, 0, 128, 1)">106</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 24</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">84</span>, <span style="color: rgba(128, 0, 128, 1)">110</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 25</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 26</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>, <span style="color: rgba(128, 0, 128, 1)">90</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 27</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">74</span>, <span style="color: rgba(128, 0, 128, 1)">98</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 28</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>, <span style="color: rgba(128, 0, 128, 1)">126</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 29</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">52</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">104</span>, <span style="color: rgba(128, 0, 128, 1)">130</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 30</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">56</span>, <span style="color: rgba(128, 0, 128, 1)">82</span>, <span style="color: rgba(128, 0, 128, 1)">108</span>, <span style="color: rgba(128, 0, 128, 1)">134</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 31</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">60</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">112</span>, <span style="color: rgba(128, 0, 128, 1)">138</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 32</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>, <span style="color: rgba(128, 0, 128, 1)">142</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 33</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>, <span style="color: rgba(128, 0, 128, 1)">90</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>, <span style="color: rgba(128, 0, 128, 1)">146</span>, -<span style="color: rgba(128, 0, 128, 1)">1</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 34</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>, <span style="color: rgba(128, 0, 128, 1)">126</span>, <span style="color: rgba(128, 0, 128, 1)">150</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 35</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">76</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>, <span style="color: rgba(128, 0, 128, 1)">128</span>, <span style="color: rgba(128, 0, 128, 1)">154</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 36</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">80</span>, <span style="color: rgba(128, 0, 128, 1)">106</span>, <span style="color: rgba(128, 0, 128, 1)">132</span>, <span style="color: rgba(128, 0, 128, 1)">158</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 37</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">84</span>, <span style="color: rgba(128, 0, 128, 1)">110</span>, <span style="color: rgba(128, 0, 128, 1)">136</span>, <span style="color: rgba(128, 0, 128, 1)">162</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 38</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">82</span>, <span style="color: rgba(128, 0, 128, 1)">110</span>, <span style="color: rgba(128, 0, 128, 1)">138</span>, <span style="color: rgba(128, 0, 128, 1)">166</span>),<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 39</span>
    (<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>, <span style="color: rgba(128, 0, 128, 1)">142</span>, <span style="color: rgba(128, 0, 128, 1)">170</span>)   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version 40</span>
<span style="color: rgba(0, 0, 0, 1)">    );

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Type info cells at the left top corner.</span>
TYPE_INFO_COORDINATES: <span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">1</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ((<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">2</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">3</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">4</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">5</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">7</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>), (<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>), (<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>), (<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>), (<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>), (<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>), (<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> From Appendix D in JISX0510:2004 (p. 67)</span>
VERSION_INFO_POLY = $1f25;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1 1111 0010 0101</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> From Appendix C in JISX0510:2004 (p.65).</span>
TYPE_INFO_POLY = $<span style="color: rgba(128, 0, 128, 1)">537</span><span style="color: rgba(0, 0, 0, 1)">;
TYPE_INFO_MASK_PATTERN </span>= $<span style="color: rgba(128, 0, 128, 1)">5412</span><span style="color: rgba(0, 0, 0, 1)">;
VERSION_DECODE_INFO: </span><span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">33</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ($07C94, $085BC, $09A99, $0A4D3, $0BBF6, $0C762, $0D847, $0E60D, $0F928, $10B78, $1145D, $12A17, $<span style="color: rgba(128, 0, 128, 1)">13532</span>, $149A6, $<span style="color: rgba(128, 0, 128, 1)">15683</span>, $168C9, $177EC, $18EC4, $<span style="color: rgba(128, 0, 128, 1)">191E1</span>, $1AFAB, $1B08E, $1CC1A, $1D33F, $1ED75, $1F250, $209D5, $216F0, $228BA, $2379F, $24B0B, $2542E, $26A64, $<span style="color: rgba(128, 0, 128, 1)">27541</span><span style="color: rgba(0, 0, 0, 1)">, $28C69);

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TMode </span>=<span style="color: rgba(0, 0, 0, 1)"> (qmTerminator, qmNumeric, qmAlphanumeric, qmStructuredAppend, qmByte, qmECI, qmKanji, qmFNC1FirstPosition, qmFNC1SecondPosition, qmHanzi);

</span><span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)">
ModeCharacterCountBits: </span><span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span> <span style="color: rgba(0, 0, 255, 1)">array</span>[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">2</span>] <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = ((<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">14</span>), (<span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">13</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">12</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>), (<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">));
ModeBits: </span><span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span> Integer = (<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TErrorCorrectionLevel </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FBits: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Assign(Source: TErrorCorrectionLevel);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Ordinal: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Bits: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FBits;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TECB </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    Count: Integer;
    DataCodewords: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Count, DataCodewords: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetCount: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetDataCodewords: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TECBArray </span>= <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> TECB;

TECBlocks </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    ECCodewordsPerBlock: Integer;
    ECBlocks: TECBArray;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(ECCodewordsPerBlock: Integer; ECBlocks: TECB); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(ECCodewordsPerBlock: Integer; ECBlocks1, ECBlocks2: TECB); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>; <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetTotalECCodewords: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetNumBlocks: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetECCodewordsPerBlock: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetECBlocks: TECBArray;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TByteMatrix </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)">
    Bytes: T2DByteArray;
    FWidth: Integer;
    FHeight: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Width, Height: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Get(X, Y: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetBoolean(X, Y: Integer; Value: Boolean);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetInteger(X, Y: Integer; Value: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetArray: T2DByteArray;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Assign(Source: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Clear(Value: Byte);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Hash: AnsiString;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Width: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FWidth;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Height: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FHeight;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TBitArray </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    Bits: </span><span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer;
    Size: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EnsureCapacity(Size: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>; <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(Size: Integer); <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetSizeInBytes: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetSize: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Get(I: Integer): Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetBit(Index: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> AppendBit(Bit: Boolean);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> AppendBits(Value, NumBits: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> AppendBitArray(NewBitArray: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ToBytes(BitOffset: Integer; Source: TByteArray; Offset, NumBytes: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> XorOperation(Other: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TCharacterSetECI </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TVersion </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    VersionNumber: Integer;
    AlignmentPatternCenters: </span><span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer;
    ECBlocks: </span><span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> TECBlocks;
    TotalCodewords: Integer;
    ECCodewords: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(VersionNumber: Integer; AlignmentPatternCenters: <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer; ECBlocks1, ECBlocks2, ECBlocks3, ECBlocks4: TECBlocks);
    </span><span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>; <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetVersionForNumber(VersionNum: Integer): TVersion;
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ChooseVersion(NumInputBits: Integer; ecLevel: TErrorCorrectionLevel): TVersion;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetTotalCodewords: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetECBlocksForLevel(ECLevel: TErrorCorrectionLevel): TECBlocks;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetDimensionForVersion: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TMaskUtil </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetDataMaskBit(MaskPattern, X, Y: Integer): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TQRCode </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FMode: TMode;
    FECLevel: TErrorCorrectionLevel;
    FVersion: Integer;
    FMatrixWidth: Integer;
    FMaskPattern: Integer;
    FNumTotalBytes: Integer;
    FNumDataBytes: Integer;
    FNumECBytes: Integer;
    FNumRSBlocks: Integer;
    FMatrix: TByteMatrix;
    FQRCodeError: Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>; <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> At(X, Y: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> IsValid: Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> IsValidMaskPattern(MaskPattern: Integer): Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetMatrix(NewMatrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetECLevel(NewECLevel: TErrorCorrectionLevel);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> SetAll(VersionNum, NumBytes, NumDataBytes, NumRSBlocks, NumECBytes, MatrixWidth: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> QRCodeError: Boolean <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FQRCodeError;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Mode: TMode <span style="color: rgba(0, 0, 255, 1)">read</span> FMode <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> FMode;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> Version: Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FVersion <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> FVersion;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> NumDataBytes: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FNumDataBytes;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> NumTotalBytes: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FNumTotalBytes;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> NumRSBlocks: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FNumRSBlocks;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> MatrixWidth: Integer <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FMatrixWidth;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> MaskPattern: Integer <span style="color: rgba(0, 0, 255, 1)">read</span> FMaskPattern <span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> FMaskPattern;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> ECLevel: TErrorCorrectionLevel <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FECLevel;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TMatrixUtil </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FMatrixUtilError: Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> ClearMatrix(Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedBasicPatterns(Version: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedTypeInfo(ECLevel: TErrorCorrectionLevel; MaskPattern: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> MaybeEmbedVersionInfo(Version: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedDataBits(DataBits: TBitArray; MaskPattern: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> FindMSBSet(Value: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> CalculateBCHCode(Value, Poly: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> MakeTypeInfoBits(ECLevel: TErrorCorrectionLevel; MaskPattern: Integer; Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> MakeVersionInfoBits(Version: Integer; Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> IsEmpty(Value: Integer): Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedTimingPatterns(Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedDarkDotAtLeftBottomCorner(Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedHorizontalSeparationPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedVerticalSeparationPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedPositionAdjustmentPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedPositionDetectionPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EmbedPositionDetectionPatternsAndSeparators(Matrix: TByteMatrix);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> MaybeEmbedPositionAdjustmentPatterns(Version: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> MatrixUtilError: Boolean <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FMatrixUtilError;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> BuildMatrix(DataBits: TBitArray; ECLevel: TErrorCorrectionLevel; Version, MaskPattern: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetModeBits(Mode: TMode): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ModeBits;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetModeCharacterCountBits(Mode: TMode; Version: TVersion): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Number: Integer;
Offset: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Number :</span>=<span style="color: rgba(0, 0, 0, 1)"> Version.VersionNumber;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Number &lt;= <span style="color: rgba(128, 0, 128, 1)">9</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Offset :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Number &lt;= <span style="color: rgba(128, 0, 128, 1)">26</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Offset :</span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Offset :</span>= <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ModeCharacterCountBits;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TBlockPair </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FDataBytes: TByteArray;
    FErrorCorrectionBytes: TByteArray;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(BA1, BA2: TByteArray);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetDataBytes: TByteArray;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetErrorCorrectionBytes: TByteArray;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TGenericGFPoly </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">;

TGenericGF </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FExpTable: TIntegerArray;
    FLogTable: TIntegerArray;
    FZero: TGenericGFPoly;
    FOne: TGenericGFPoly;
    FSize: Integer;
    FPrimitive: Integer;
    FGeneratorBase: Integer;
    FInitialized: Boolean;
    FPolyList: </span><span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> CheckInit;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Initialize;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> CreateQRCodeField256: TGenericGF;
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> AddOrSubtract(A, B: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Primitive, Size, B: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>; <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetZero: TGenericGFPoly;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Exp(A: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetGeneratorBase: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Inverse(A: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Multiply(A, B: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> BuildMonomial(Degree, Coefficient: Integer): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TGenericGFPolyArray </span>= <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly;

TGenericGFPoly </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FField: TGenericGF;
    FCoefficients: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AField: TGenericGF; ACoefficients: TIntegerArray);
    </span><span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>; <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Coefficients: TIntegerArray;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Multiply(Other: TGenericGFPoly): TGenericGFPoly;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> MultiplyByMonomial(Degree, Coefficient: Integer): TGenericGFPoly;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Divide(Other: TGenericGFPoly): TGenericGFPolyArray;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetCoefficients: TIntegerArray;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> IsZero: Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetCoefficient(Degree: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetDegree: Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> AddOrSubtract(Other: TGenericGFPoly): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TReedSolomonEncoder </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FField: TGenericGF;
    FCachedGenerators: TObjectList;
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AField: TGenericGF);
    </span><span style="color: rgba(0, 0, 255, 1)">destructor</span> <span style="color: rgba(0, 0, 255, 1)">Destroy</span>; <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Encode(ToEncode: TIntegerArray; ECBytes: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> BuildGenerator(Degree: Integer): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

TEncoder </span>= <span style="color: rgba(0, 0, 255, 1)">class</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError: Boolean;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ApplyMaskPenaltyRule1Internal(Matrix: TByteMatrix; IsHorizontal: Boolean): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> ChooseMode(<span style="color: rgba(0, 0, 255, 1)">const</span> Content: WideString; <span style="color: rgba(0, 0, 255, 1)">var</span> EncodeOptions: Integer): TMode; <span style="color: rgba(0, 0, 255, 1)">overload</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span> FilterContent(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Mode: TMode; EncodeOptions: Integer): WideString;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> Append8BitBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray; EncodeOptions: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> AppendAlphanumericBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> AppendBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Mode: TMode; Bits: TBitArray; EncodeOptions: Integer);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> AppendKanjiBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> AppendLengthInfo(NumLetters, VersionNum: Integer; Mode: TMode; Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> AppendModeInfo(Mode: TMode; Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> AppendNumericBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ChooseMaskPattern(Bits: TBitArray; ECLevel: TErrorCorrectionLevel; Version: Integer; Matrix: TByteMatrix): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GenerateECBytes(DataBytes: TByteArray; NumECBytesInBlock: Integer): TByteArray;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetAlphanumericCode(Code: Integer): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> GetNumDataBytesAndNumECBytesForBlockID(NumTotalBytes, NumDataBytes, NumRSBlocks, BlockID: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span> NumDataBytesInBlock: TIntegerArray; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> NumECBytesInBlock: TIntegerArray);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> InterleaveWithECBytes(Bits: TBitArray; NumTotalBytes, NumDataBytes, NumRSBlocks: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> Result: TBitArray);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">function IsOnlyDoubleByteKanji(const Content: WideString): Boolean;</span>
    <span style="color: rgba(0, 0, 255, 1)">procedure</span> TerminateBits(NumDataBytes: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> Bits: TBitArray);
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> CalculateMaskPenalty(Matrix: TByteMatrix): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ApplyMaskPenaltyRule1(Matrix: TByteMatrix): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ApplyMaskPenaltyRule2(Matrix: TByteMatrix): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ApplyMaskPenaltyRule3(Matrix: TByteMatrix): Integer;
    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ApplyMaskPenaltyRule4(Matrix: TByteMatrix): Integer;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">procedure Encode(const Content: WideString; ECLevel: TErrorCorrectionLevel; QRCode: TQRCode); overload;</span>
    <span style="color: rgba(0, 0, 255, 1)">procedure</span> Encode(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; EncodeOptions: Integer; ECLevel: TErrorCorrectionLevel; QRCode: TQRCode);
</span><span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">property</span> EncoderError: Boolean <span style="color: rgba(0, 0, 255, 1)">read</span><span style="color: rgba(0, 0, 0, 1)"> FEncoderError;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.ApplyMaskPenaltyRule1(Matrix: TByteMatrix): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= ApplyMaskPenaltyRule1Internal(Matrix, True) +<span style="color: rgba(0, 0, 0, 1)"> ApplyMaskPenaltyRule1Internal(Matrix, False);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Apply mask penalty rule 2 and return the penalty. Find 2x2 blocks with the same color and give</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> penalty to them.</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.ApplyMaskPenaltyRule2(Matrix: TByteMatrix): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Penalty: Integer;
TheArray: T2DByteArray;
Width: Integer;
Height: Integer;
X: Integer;
Y: Integer;
Value: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Penalty :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
TheArray :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.GetArray;
Width :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Width;
Height :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Height;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Height - <span style="color: rgba(128, 0, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Width - <span style="color: rgba(128, 0, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Value :</span>=<span style="color: rgba(0, 0, 0, 1)"> TheArray;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((Value = TheArray) <span style="color: rgba(0, 0, 255, 1)">and</span> (Value = TheArray) <span style="color: rgba(0, 0, 255, 1)">and</span> (Value = TheArray)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Inc(Penalty, </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Penalty;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Apply mask penalty rule 3 and return the penalty. Find consecutive cells of 00001011101 or</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 10111010000, and give penalty to them.If we find patterns like 000010111010000, we give</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> penalties twice (i.e. 40 * 2).</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.ApplyMaskPenaltyRule3(Matrix: TByteMatrix): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Penalty: Integer;
TheArray: T2DByteArray;
Width: Integer;
Height: Integer;
X: Integer;
Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Penalty :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
TheArray :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.GetArray;
Width :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Width;
Height :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Height;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Height - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Width - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> ((X + <span style="color: rgba(128, 0, 128, 1)">6</span> &lt; Width) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (((X + <span style="color: rgba(128, 0, 128, 1)">10</span> &lt; Width) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">or</span> ((X - <span style="color: rgba(128, 0, 128, 1)">4</span> &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>)))) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Inc(Penalty, </span><span style="color: rgba(128, 0, 128, 1)">40</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((Y + <span style="color: rgba(128, 0, 128, 1)">6</span> &lt; Height) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (((Y + <span style="color: rgba(128, 0, 128, 1)">10</span> &lt; Height) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">or</span> ((Y - <span style="color: rgba(128, 0, 128, 1)">4</span> &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">0</span>)))) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Inc(Penalty, </span><span style="color: rgba(128, 0, 128, 1)">40</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Penalty;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Apply mask penalty rule 4 and return the penalty. Calculate the ratio of dark cells and give</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> penalty if the ratio is far from 50%. It gives 10 penalty for 5% distance. Examples:</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> -   0% =&gt; 100</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> -40% =&gt;20</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> -45% =&gt;10</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> -50% =&gt;   0</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> -55% =&gt;10</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> -55% =&gt;20</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - 100% =&gt; 100</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.ApplyMaskPenaltyRule4(Matrix: TByteMatrix): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
NumDarkCells: Integer;
TheArray: T2DByteArray;
Width: Integer;
Height: Integer;
NumTotalCells: Integer;
DarkRatio: Double;
X: Integer;
Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
NumDarkCells :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
TheArray :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.GetArray;
Width :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Width;
Height :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Height;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Height - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Width - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (TheArray = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Inc(NumDarkCells);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
NumTotalCells :</span>= Matrix.Height *<span style="color: rgba(0, 0, 0, 1)"> Matrix.Width;
DarkRatio :</span>= NumDarkCells /<span style="color: rgba(0, 0, 0, 1)"> NumTotalCells;
Result :</span>= Round(Abs((DarkRatio * <span style="color: rgba(128, 0, 128, 1)">100</span> - <span style="color: rgba(128, 0, 128, 1)">50</span>)) / <span style="color: rgba(128, 0, 128, 1)">50</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> vertical and horizontal orders respectively.</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.ApplyMaskPenaltyRule1Internal(Matrix: TByteMatrix; IsHorizontal: Boolean): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Penalty: Integer;
NumSameBitCells: Integer;
PrevBit: Integer;
TheArray: T2DByteArray;
I: Integer;
J: Integer;
Bit: Integer;
ILimit: Integer;
JLimit: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Penalty :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
NumSameBitCells :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
PrevBit :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Horizontal mode:</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   for (int i = 0; i &lt; matrix.height(); ++i) {</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   for (int j = 0; j &lt; matrix.width(); ++j) {</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">       int bit = matrix.get(i, j);</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Vertical mode:</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   for (int i = 0; i &lt; matrix.width(); ++i) {</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   for (int j = 0; j &lt; matrix.height(); ++j) {</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">       int bit = matrix.get(j, i);</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (IsHorizontal) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ILimit :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Height;
    JLimit :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Width;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ILimit :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Width;
    JLimit :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.Height;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
TheArray :</span>=<span style="color: rgba(0, 0, 0, 1)"> Matrix.GetArray;

</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> ILimit - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> J := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> JLimit - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (IsHorizontal) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bit :</span>=<span style="color: rgba(0, 0, 0, 1)"> TheArray;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bit :</span>=<span style="color: rgba(0, 0, 0, 1)"> TheArray;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Bit = PrevBit) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Inc(NumSameBitCells);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Found five repetitive cells with the same color (bit).</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> We'll give penalty of 3.</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (NumSameBitCells = <span style="color: rgba(128, 0, 128, 1)">5</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Inc(Penalty, </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (NumSameBitCells &gt; <span style="color: rgba(128, 0, 128, 1)">5</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
          <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> After five repetitive cells, we'll add the penalty one</span>
          <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> by one.</span>
          Inc(Penalty, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
          ;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      NumSameBitCells :</span>= <span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Include the cell itself.</span>
      PrevBit :=<span style="color: rgba(0, 0, 0, 1)"> Bit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    NumSameBitCells :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Clear at each row/column.</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Penalty;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TQRCode </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">constructor</span> TQRCode.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FMode :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmTerminator;
FQRCodeError :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
FECLevel :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
FVersion :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FMatrixWidth :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FMaskPattern :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FNumTotalBytes :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FNumDataBytes :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FNumECBytes :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FNumRSBlocks :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FMatrix :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">destructor</span> TQRCode.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Assigned(FECLevel)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FECLevel.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Assigned(FMatrix)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FMatrix.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TQRCode.At(X, Y: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Value: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> The value must be zero or one.</span>
Value :=<span style="color: rgba(0, 0, 0, 1)"> FMatrix.Get(X, Y);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> ((Value = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (Value = <span style="color: rgba(128, 0, 128, 1)">1</span>))) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FQRCodeError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TQRCode.IsValid: Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> First check if all version are not uninitialized.</span>
    ((FECLevel &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (FVersion &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (FMatrixWidth &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (FMaskPattern &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (FNumTotalBytes &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (FNumDataBytes &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (FNumECBytes &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (FNumRSBlocks &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span>    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Then check them in other ways..</span>
    IsValidMaskPattern(FMaskPattern) <span style="color: rgba(0, 0, 255, 1)">and</span> (FNumTotalBytes = FNumDataBytes + FNumECBytes) <span style="color: rgba(0, 0, 255, 1)">and</span>    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ByteMatrix stuff.</span>
    (Assigned(FMatrix)) <span style="color: rgba(0, 0, 255, 1)">and</span> (FMatrixWidth = FMatrix.Width) <span style="color: rgba(0, 0, 255, 1)">and</span>    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> See 7.3.1 of JISX0510:2004 (Fp.5).</span>
    (FMatrix.Width = FMatrix.Height)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Must be square.</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TQRCode.IsValidMaskPattern(MaskPattern: Integer): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= (MaskPattern &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (MaskPattern &lt;<span style="color: rgba(0, 0, 0, 1)"> NUM_MASK_PATTERNS);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TQRCode.SetMatrix(NewMatrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Assigned(FMatrix)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FMatrix.Free;
    FMatrix :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
FMatrix :</span>=<span style="color: rgba(0, 0, 0, 1)"> NewMatrix;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TQRCode.SetAll(VersionNum, NumBytes, NumDataBytes, NumRSBlocks, NumECBytes, MatrixWidth: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FVersion :</span>=<span style="color: rgba(0, 0, 0, 1)"> VersionNum;
FNumTotalBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> NumBytes;
FNumDataBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> NumDataBytes;
FNumRSBlocks :</span>=<span style="color: rgba(0, 0, 0, 1)"> NumRSBlocks;
FNumECBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> NumECBytes;
FMatrixWidth :</span>=<span style="color: rgba(0, 0, 0, 1)"> MatrixWidth;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TQRCode.SetECLevel(NewECLevel: TErrorCorrectionLevel);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Assigned(FECLevel)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FECLevel.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
FECLevel :</span>= TErrorCorrectionLevel.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
FECLevel.Assign(NewECLevel);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TByteMatrix </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TByteMatrix.Clear(Value: Byte);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X, Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> FHeight - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> FWidth - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TByteMatrix.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Width, Height: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Y: Integer;
X: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FWidth :</span>=<span style="color: rgba(0, 0, 0, 1)"> Width;
FHeight :</span>=<span style="color: rgba(0, 0, 0, 1)"> Height;
SetLength(Bytes, Height);
</span><span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Height - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetLength(Bytes, Width);
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Width - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bytes :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TByteMatrix.Get(X, Y: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Bytes = <span style="color: rgba(128, 0, 128, 1)">255</span>) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Bytes;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TByteMatrix.GetArray: T2DByteArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Bytes;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TByteMatrix.Hash: AnsiString;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X, Y: Integer;
Counter: Integer;
CC: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> FHeight - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Counter :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> FWidth - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      CC :</span>=<span style="color: rgba(0, 0, 0, 1)"> Get(X, Y);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (CC = -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      CC :</span>= <span style="color: rgba(128, 0, 128, 1)">255</span><span style="color: rgba(0, 0, 0, 1)">;
      Counter :</span>= Counter +<span style="color: rgba(0, 0, 0, 1)"> CC;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Result :</span>= Result + AnsiChar((Counter <span style="color: rgba(0, 0, 255, 1)">mod</span> <span style="color: rgba(128, 0, 128, 1)">26</span>) + <span style="color: rgba(128, 0, 128, 1)">65</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TByteMatrix.SetBoolean(X, Y: Integer; Value: Boolean);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Bytes :</span>= Byte(Value) <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $FF;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TByteMatrix.SetInteger(X, Y, Value: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Bytes :</span>= Value <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $FF;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TByteMatrix.Assign(Source: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
SourceLength: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SourceLength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(Source.Bytes);
SetLength(Bytes, SourceLength);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (SourceLength &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Move(Source.Bytes[</span><span style="color: rgba(128, 0, 128, 1)">0</span>], Bytes[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">], SourceLength);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
FWidth :</span>=<span style="color: rgba(0, 0, 0, 1)"> Source.Width;
FHeight :</span>=<span style="color: rgba(0, 0, 0, 1)"> Source.Height;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TEncoder </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.CalculateMaskPenalty(Matrix: TByteMatrix): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Penalty: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Penalty :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
Inc(Penalty, ApplyMaskPenaltyRule1(Matrix));
Inc(Penalty, ApplyMaskPenaltyRule2(Matrix));
Inc(Penalty, ApplyMaskPenaltyRule3(Matrix));
Inc(Penalty, ApplyMaskPenaltyRule4(Matrix));
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Penalty;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">procedure TEncoder.Encode(const Content: WideString; ECLevel: TErrorCorrectionLevel; QRCode: TQRCode);
begin
Encode(Content, ECLevel, nil, QRCode);
end;</span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.Encode(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; EncodeOptions: Integer; ECLevel: TErrorCorrectionLevel; QRCode: TQRCode);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Mode: TMode;
DataBits: TBitArray;
FinalBits: TBitArray;
HeaderBits: TBitArray;
HeaderAndDataBits: TBitArray;
Matrix: TByteMatrix;
NumLetters: Integer;
MatrixUtil: TMatrixUtil;
BitsNeeded: Integer;
ProvisionalBitsNeeded: Integer;
ProvisionalVersion: TVersion;
Version: TVersion;
ECBlocks: TECBlocks;
NumDataBytes: Integer;
Dimension: Integer;
FilteredContent: WideString;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
DataBits :</span>= TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
HeaderBits :</span>= TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Pick an encoding mode appropriate for the content. Note that this will not attempt to use</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> multiple modes / segments even if that were more efficient. Twould be nice.</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Collect data within the main segment, separately, to count its size if needed. Don't add it to</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> main payload yet.</span>
<span style="color: rgba(0, 0, 0, 1)">
Mode :</span>=<span style="color: rgba(0, 0, 0, 1)"> ChooseMode(Content, EncodeOptions);
FilteredContent :</span>=<span style="color: rgba(0, 0, 0, 1)"> FilterContent(Content, Mode, EncodeOptions);
AppendBytes(FilteredContent, Mode, DataBits, EncodeOptions);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> (With ECI in place,) Write the mode marker</span>
<span style="color: rgba(0, 0, 0, 1)">AppendModeInfo(Mode, HeaderBits);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Hard part: need to know version to know how many bits length takes. But need to know how many</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> bits it takes to know version. First we take a guess at version by assuming version will be</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> the minimum, 1:</span>
ProvisionalVersion := TVersion.GetVersionForNumber(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    ProvisionalBitsNeeded :</span>= HeaderBits.GetSize + GetModeCharacterCountBits(Mode, ProvisionalVersion) +<span style="color: rgba(0, 0, 0, 1)"> DataBits.GetSize;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    ProvisionalVersion.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

ProvisionalVersion :</span>=<span style="color: rgba(0, 0, 0, 1)"> TVersion.ChooseVersion(ProvisionalBitsNeeded, ECLevel);
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Use that guess to calculate the right version. I am still not sure this works in 100% of cases.</span>
    BitsNeeded := HeaderBits.GetSize + GetModeCharacterCountBits(Mode, ProvisionalVersion) +<span style="color: rgba(0, 0, 0, 1)"> DataBits.GetSize;
    Version :</span>=<span style="color: rgba(0, 0, 0, 1)"> TVersion.ChooseVersion(BitsNeeded, ECLevel);
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    ProvisionalVersion.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

HeaderAndDataBits :</span>= TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
FinalBits :</span>= TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    HeaderAndDataBits.AppendBitArray(HeaderBits);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Find "length" of main segment and write it</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmByte) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      NumLetters :</span>=<span style="color: rgba(0, 0, 0, 1)"> DataBits.GetSizeInBytes;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      NumLetters :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(FilteredContent);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    AppendLengthInfo(NumLetters, Version.VersionNumber, Mode, HeaderAndDataBits);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Put data together into the overall payload</span>
<span style="color: rgba(0, 0, 0, 1)">    HeaderAndDataBits.AppendBitArray(DataBits);

    ECBlocks :</span>=<span style="color: rgba(0, 0, 0, 1)"> Version.GetECBlocksForLevel(ECLevel);
    NumDataBytes :</span>= Version.GetTotalCodewords -<span style="color: rgba(0, 0, 0, 1)"> ECBlocks.GetTotalECCodewords;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Terminate the bits properly.</span>
<span style="color: rgba(0, 0, 0, 1)">    TerminateBits(NumDataBytes, HeaderAndDataBits);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Interleave data bits with error correction code.</span>
<span style="color: rgba(0, 0, 0, 1)">    InterleaveWithECBytes(HeaderAndDataBits, Version.GetTotalCodewords, NumDataBytes, ECBlocks.GetNumBlocks, FinalBits);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> QRCode qrCode = new QRCode();// This is passed in</span>
<span style="color: rgba(0, 0, 0, 1)">

    QRCode.SetECLevel(ECLevel);
    QRCode.Mode :</span>=<span style="color: rgba(0, 0, 0, 1)"> Mode;
    QRCode.Version :</span>=<span style="color: rgba(0, 0, 0, 1)"> Version.VersionNumber;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Choose the mask pattern and set to "qrCode".</span>
    Dimension :=<span style="color: rgba(0, 0, 0, 1)"> Version.GetDimensionForVersion;
    Matrix :</span>= TByteMatrix.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Dimension, Dimension);

    QRCode.MaskPattern :</span>=<span style="color: rgba(0, 0, 0, 1)"> ChooseMaskPattern(FinalBits, ECLevel, Version.VersionNumber, Matrix);

    Matrix.Free;
    Matrix :</span>= TByteMatrix.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Dimension, Dimension);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Build the matrix and set it to "qrCode".</span>
    MatrixUtil := TMatrixUtil.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
      MatrixUtil.BuildMatrix(FinalBits, QRCode.ECLevel, QRCode.Version, QRCode.MaskPattern, Matrix);
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
      MatrixUtil.Free;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    QRCode.SetMatrix(Matrix);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> QRCode will free the matrix</span>
<span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    DataBits.Free;
    HeaderAndDataBits.Free;
    FinalBits.Free;
    HeaderBits.Free;
    Version.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span> TEncoder.FilterContent(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Mode: TMode; EncodeOptions: Integer): WideString;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X: Integer;
CanAdd: Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(Content) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    CanAdd :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmNumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      CanAdd :</span>= (Content &gt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (Content &lt;= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmAlphanumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      CanAdd :</span>= GetAlphanumericCode(Ord(Content)) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmByte) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">3</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      CanAdd :</span>= Ord(Content) &lt;=<span style="color: rgba(0, 0, 0, 1)"> $FF;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ((EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">4</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">5</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      CanAdd :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (CanAdd) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>= Result +<span style="color: rgba(0, 0, 0, 1)"> Content;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Return the code point of the table used in alphanumeric mode or</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">-1 if there is no corresponding code in the table.</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.GetAlphanumericCode(Code: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Code &lt; Length(ALPHANUMERIC_TABLE)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ALPHANUMERIC_TABLE;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Choose the mode based on the content</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> TEncoder.ChooseMode(<span style="color: rgba(0, 0, 255, 1)">const</span> Content: WideString; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> EncodeOptions: Integer): TMode;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
AllNumeric: Boolean;
AllAlphanumeric: Boolean;
AllISO: Boolean;
I: Integer;
C: WideChar;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    AllNumeric :</span>= Length(Content) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    I :</span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">while</span> (I &lt;= Length(Content)) <span style="color: rgba(0, 0, 255, 1)">and</span> (AllNumeric) <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      C :</span>=<span style="color: rgba(0, 0, 0, 1)"> Content;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((C &lt; <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (C &gt; <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      AllNumeric :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Inc(I);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> AllNumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      AllAlphanumeric :</span>= Length(Content) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      I :</span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> (I &lt;= Length(Content)) <span style="color: rgba(0, 0, 255, 1)">and</span> (AllAlphanumeric) <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      C :</span>=<span style="color: rgba(0, 0, 0, 1)"> Content;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (GetAlphanumericCode(Ord(C)) &lt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          AllAlphanumeric :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Inc(I);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      AllAlphanumeric :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> AllAlphanumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      AllISO :</span>= Length(Content) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      I :</span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> (I &lt;= Length(Content)) <span style="color: rgba(0, 0, 255, 1)">and</span> (AllISO) <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      C :</span>=<span style="color: rgba(0, 0, 0, 1)"> Content;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Ord(C) &gt; $FF) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          AllISO :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Inc(I);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      AllISO :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (AllNumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmNumeric;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (AllAlphanumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmAlphanumeric;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (AllISO) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmByte;
      EncodeOptions :</span>= <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmByte;
      EncodeOptions :</span>= <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmNumeric;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">2</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmAlphanumeric;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> qmByte;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TEncoder.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">function TEncoder.IsOnlyDoubleByteKanji(const Content: WideString): Boolean;
var
I: Integer;
Char1: Integer;
begin
Result := True;
I := 0;
while ((I &lt; Length(Content)) and Result) do
begin
    Char1 := Ord(Content);
    if (((Char1 &lt; $81) or (Char1 &gt; $9F)) and ((Char1 &lt; $E0) or (Char1 &gt; $EB))) then
    begin
      Result := False;
    end;
end;
end;</span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.ChooseMaskPattern(Bits: TBitArray; ECLevel: TErrorCorrectionLevel; Version: Integer; Matrix: TByteMatrix): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
MinPenalty: Integer;
BestMaskPattern: Integer;
MaskPattern: Integer;
MatrixUtil: TMatrixUtil;
Penalty: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
MinPenalty :</span>=<span style="color: rgba(0, 0, 0, 1)"> MaxInt;
BestMaskPattern :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> We try all mask patterns to choose the best one.</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> MaskPattern := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NUM_MASK_PATTERNS - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    MatrixUtil :</span>= TMatrixUtil.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
      MatrixUtil.BuildMatrix(Bits, ECLevel, Version, MaskPattern, Matrix);
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
      MatrixUtil.Free;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Penalty :</span>=<span style="color: rgba(0, 0, 0, 1)"> CalculateMaskPenalty(Matrix);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Penalty &lt; MinPenalty) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      MinPenalty :</span>=<span style="color: rgba(0, 0, 0, 1)"> Penalty;
      BestMaskPattern :</span>=<span style="color: rgba(0, 0, 0, 1)"> MaskPattern;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> BestMaskPattern;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Terminate bits as described in 8.4.8 and 8.4.9 of JISX0510:2004 (p.24).</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.TerminateBits(NumDataBytes: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Capacity: Integer;
I: Integer;
NumBitsInLastByte: Integer;
NumPaddingBytes: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Capacity :</span>= NumDataBytes <span style="color: rgba(0, 0, 255, 1)">shl</span> <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Bits.GetSize &gt; Capacity) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
I :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">while</span> ((I &lt; <span style="color: rgba(128, 0, 128, 1)">4</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (Bits.GetSize &lt; Capacity)) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Bits.AppendBit(False);
    Inc(I);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Append termination bits. See 8.4.8 of JISX0510:2004 (p.24) for details.</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> If the last byte isn't 8-bit aligned, we'll add padding bits.</span>
NumBitsInLastByte := Bits.GetSize <span style="color: rgba(0, 0, 255, 1)">and</span> $<span style="color: rgba(128, 0, 128, 1)">07</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (NumBitsInLastByte &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> I := NumBitsInLastByte <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">7</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bits.AppendBit(False);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> If we have more space, we'll fill the space with padding patterns defined in 8.4.9 (p.24).</span>
NumPaddingBytes := NumDataBytes -<span style="color: rgba(0, 0, 0, 1)"> Bits.GetSizeInBytes;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumPaddingBytes - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> ((I <span style="color: rgba(0, 0, 255, 1)">and</span> $<span style="color: rgba(128, 0, 128, 1)">01</span>) = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bits.AppendBits($EC, </span><span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bits.AppendBits($</span><span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Bits.GetSize &lt;&gt; Capacity) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Get number of data bytes and number of error correction bytes for block id "blockID". Store</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> the result in "numDataBytesInBlock", and "numECBytesInBlock". See table 12 in 8.5.1 of</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> JISX0510:2004 (p.30)</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.GetNumDataBytesAndNumECBytesForBlockID(NumTotalBytes, NumDataBytes, NumRSBlocks, BlockID: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span> NumDataBytesInBlock: TIntegerArray; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> NumECBytesInBlock: TIntegerArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
NumRSBlocksInGroup1: Integer;
NumRSBlocksInGroup2: Integer;
NumTotalBytesInGroup1: Integer;
NumTotalBytesInGroup2: Integer;
NumDataBytesInGroup1: Integer;
NumDataBytesInGroup2: Integer;
NumECBytesInGroup1: Integer;
NumECBytesInGroup2: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (BlockID &gt;= NumRSBlocks) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numRsBlocksInGroup2 = 196 % 5 = 1</span>
NumRSBlocksInGroup2 := NumTotalBytes <span style="color: rgba(0, 0, 255, 1)">mod</span><span style="color: rgba(0, 0, 0, 1)"> NumRSBlocks;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numRsBlocksInGroup1 = 5 - 1 = 4</span>
NumRSBlocksInGroup1 := NumRSBlocks -<span style="color: rgba(0, 0, 0, 1)"> NumRSBlocksInGroup2;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numTotalBytesInGroup1 = 196 / 5 = 39</span>
NumTotalBytesInGroup1 := NumTotalBytes <span style="color: rgba(0, 0, 255, 1)">div</span><span style="color: rgba(0, 0, 0, 1)"> NumRSBlocks;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numTotalBytesInGroup2 = 39 + 1 = 40</span>
NumTotalBytesInGroup2 := NumTotalBytesInGroup1 + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numDataBytesInGroup1 = 66 / 5 = 13</span>
NumDataBytesInGroup1 := NumDataBytes <span style="color: rgba(0, 0, 255, 1)">div</span><span style="color: rgba(0, 0, 0, 1)"> NumRSBlocks;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numDataBytesInGroup2 = 13 + 1 = 14</span>
NumDataBytesInGroup2 := NumDataBytesInGroup1 + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numEcBytesInGroup1 = 39 - 13 = 26</span>
NumECBytesInGroup1 := NumTotalBytesInGroup1 -<span style="color: rgba(0, 0, 0, 1)"> NumDataBytesInGroup1;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numEcBytesInGroup2 = 40 - 14 = 26</span>
NumECBytesInGroup2 := NumTotalBytesInGroup2 -<span style="color: rgba(0, 0, 0, 1)"> NumDataBytesInGroup2;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Sanity checks.</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 26 = 26</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (NumECBytesInGroup1 &lt;&gt; NumECBytesInGroup2) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 5 = 4 + 1.</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (NumRSBlocks &lt;&gt; (NumRSBlocksInGroup1 + NumRSBlocksInGroup2)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 196 = (13 + 26) * 4 + (14 + 26) * 1</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (NumTotalBytes &lt;&gt; ((NumDataBytesInGroup1 + NumECBytesInGroup1) * NumRSBlocksInGroup1) + ((NumDataBytesInGroup2 + NumECBytesInGroup2) * NumRSBlocksInGroup2)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (BlockID &lt; NumRSBlocksInGroup1) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    NumDataBytesInBlock[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> NumDataBytesInGroup1;
    NumECBytesInBlock[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> NumECBytesInGroup1;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    NumDataBytesInBlock[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> NumDataBytesInGroup2;
    NumECBytesInBlock[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> NumECBytesInGroup2;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Interleave "bits" with corresponding error correction bytes. On success, store the result in</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> "result". The interleave rule is complicated. See 8.6 of JISX0510:2004 (p.37) for details.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.InterleaveWithECBytes(Bits: TBitArray; NumTotalBytes, NumDataBytes, NumRSBlocks: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> Result: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
DataBytesOffset: Integer;
MaxNumDataBytes: Integer;
MaxNumECBytes: Integer;
Blocks: TObjectList;
NumDataBytesInBlock: TIntegerArray;
NumECBytesInBlock: TIntegerArray;
Size: Integer;
DataBytes: TByteArray;
ECBytes: TByteArray;
I, J: Integer;
BlockPair: TBlockPair;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(ECBytes, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "bits" must have "getNumDataBytes" bytes of data.</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Bits.GetSizeInBytes &lt;&gt; NumDataBytes) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Step 1.Divide data bytes into blocks and generate error correction bytes for them. We'll</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> store the divided data bytes blocks and error correction bytes blocks into "blocks".</span>
DataBytesOffset := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
MaxNumDataBytes :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
MaxNumECBytes :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Since, we know the number of reedsolmon blocks, we can initialize the vector with the number.</span>
Blocks := TObjectList.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(True);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    Blocks.Capacity :</span>=<span style="color: rgba(0, 0, 0, 1)"> NumRSBlocks;

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumRSBlocks - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      SetLength(NumDataBytesInBlock, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
      SetLength(NumECBytesInBlock, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
      GetNumDataBytesAndNumECBytesForBlockID(NumTotalBytes, NumDataBytes, NumRSBlocks, I, NumDataBytesInBlock, NumECBytesInBlock);

      Size :</span>= NumDataBytesInBlock[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
      SetLength(DataBytes, Size);
      Bits.ToBytes(</span><span style="color: rgba(128, 0, 128, 1)">8</span> * DataBytesOffset, DataBytes, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Size);
      ECBytes :</span>= GenerateECBytes(DataBytes, NumECBytesInBlock[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
      BlockPair :</span>= TBlockPair.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(DataBytes, ECBytes);
      Blocks.Add(BlockPair);

      MaxNumDataBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> Max(MaxNumDataBytes, Size);
      MaxNumECBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> Max(MaxNumECBytes, Length(ECBytes));
      Inc(DataBytesOffset, NumDataBytesInBlock[</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (NumDataBytes &lt;&gt; DataBytesOffset) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> First, place data blocks.</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> MaxNumDataBytes - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> J := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Blocks.Count - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      DataBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> TBlockPair(Blocks.Items).GetDataBytes;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (I &lt; Length(DataBytes)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Result.AppendBits(DataBytes, </span><span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Then, place error correction blocks.</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> MaxNumECBytes - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> J := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Blocks.Count - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      ECBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> TBlockPair(Blocks.Items).GetErrorCorrectionBytes;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (I &lt; Length(ECBytes)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Result.AppendBits(ECBytes, </span><span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    Blocks.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (NumTotalBytes &lt;&gt; Result.GetSizeInBytes) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Should be same.</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.GenerateECBytes(DataBytes: TByteArray; NumECBytesInBlock: Integer): TByteArray;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
NumDataBytes: Integer;
ToEncode: TIntegerArray;
ReedSolomonEncoder: TReedSolomonEncoder;
I: Integer;
ECBytes: TByteArray;
GenericGF: TGenericGF;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
NumDataBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(DataBytes);
SetLength(ToEncode, NumDataBytes </span>+<span style="color: rgba(0, 0, 0, 1)"> NumECBytesInBlock);

</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumDataBytes - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ToEncode :</span>= DataBytes <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $FF;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

GenericGF :</span>=<span style="color: rgba(0, 0, 0, 1)"> TGenericGF.CreateQRCodeField256;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    ReedSolomonEncoder :</span>= TReedSolomonEncoder.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(GenericGF);
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
      ReedSolomonEncoder.Encode(ToEncode, NumECBytesInBlock);
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
      ReedSolomonEncoder.Free;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    GenericGF.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

SetLength(ECBytes, NumECBytesInBlock);
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumECBytesInBlock - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ECBytes :</span>= ToEncode;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECBytes;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Append mode info. On success, store the result in "bits".</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.AppendModeInfo(Mode: TMode; Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Bits.AppendBits(GetModeBits(Mode), </span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Append length info. On success, store the result in "bits".</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TEncoder.AppendLengthInfo(NumLetters, VersionNum: Integer; Mode: TMode; Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
NumBits: Integer;
Version: TVersion;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Version :</span>=<span style="color: rgba(0, 0, 0, 1)"> TVersion.GetVersionForNumber(VersionNum);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    NumBits :</span>=<span style="color: rgba(0, 0, 0, 1)"> GetModeCharacterCountBits(Mode, Version);
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    Version.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (NumLetters &gt; ((<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">shl</span> NumBits) - <span style="color: rgba(128, 0, 128, 1)">1</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

Bits.AppendBits(NumLetters, NumBits);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Append "bytes" in "mode" mode (encoding) into "bits". On success, store the result in "bits".</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.AppendBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Mode: TMode; Bits: TBitArray; EncodeOptions: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmNumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    AppendNumericBytes(Content, Bits);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmAlphanumeric) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    AppendAlphanumericBytes(Content, Bits);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmByte) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Append8BitBytes(Content, Bits, EncodeOptions);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Mode = qmKanji) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    AppendKanjiBytes(Content, Bits);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.AppendNumericBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
ContentLength: Integer;
I: Integer;
Num1: Integer;
Num2: Integer;
Num3: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
ContentLength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(Content);
I :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">while</span> (I &lt; ContentLength) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Num1 :</span>= Ord(Content) - Ord(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (I + <span style="color: rgba(128, 0, 128, 1)">2</span> &lt; ContentLength) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Encode three numeric letters in ten bits.</span>
      Num2 := Ord(Content) - Ord(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
      Num3 :</span>= Ord(Content) - Ord(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
      Bits.AppendBits(Num1 </span>* <span style="color: rgba(128, 0, 128, 1)">100</span> + Num2 * <span style="color: rgba(128, 0, 128, 1)">10</span> + Num3, <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">);
      Inc(I, </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (I + <span style="color: rgba(128, 0, 128, 1)">1</span> &lt; ContentLength) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Encode two numeric letters in seven bits.</span>
      Num2 := Ord(Content) - Ord(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
      Bits.AppendBits(Num1 </span>* <span style="color: rgba(128, 0, 128, 1)">10</span> + Num2, <span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)">);
      Inc(I, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Encode one numeric letter in four bits.</span>
      Bits.AppendBits(Num1, <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
      Inc(I);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.AppendAlphanumericBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
ContentLength: Integer;
I: Integer;
Code1: Integer;
Code2: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
ContentLength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(Content);
I :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">while</span> (I &lt; ContentLength) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Code1 :</span>= GetAlphanumericCode(Ord(Content));
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Code1 = -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (I + <span style="color: rgba(128, 0, 128, 1)">1</span> &lt; ContentLength) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Code2 :</span>= GetAlphanumericCode(Ord(Content));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Code2 = -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Encode two alphanumeric letters in 11 bits.</span>
      Bits.AppendBits(Code1 * <span style="color: rgba(128, 0, 128, 1)">45</span> + Code2, <span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">);
      Inc(I, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Encode one alphanumeric letter in six bits.</span>
      Bits.AppendBits(Code1, <span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">);
      Inc(I);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.Append8BitBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray; EncodeOptions: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Bytes: TByteArray;
I: Integer;
UTF8Version: AnsiString;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(Bytes, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">3</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetLength(Bytes, Length(Content));
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(Content) <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Bytes := Ord(Content) <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $FF;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">4</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Add the UTF-8 BOM</span>
    UTF8Version := #$EF#$BB#$BF +<span style="color: rgba(0, 0, 0, 1)"> UTF8Encode(Content);
    SetLength(Bytes, Length(UTF8Version));
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Length(UTF8Version) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Move(UTF8Version[</span><span style="color: rgba(128, 0, 128, 1)">1</span>], Bytes[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">], Length(UTF8Version));
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (EncodeOptions = <span style="color: rgba(128, 0, 128, 1)">5</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> No BOM</span>
    UTF8Version :=<span style="color: rgba(0, 0, 0, 1)"> UTF8Encode(Content);
    SetLength(Bytes, Length(UTF8Version));
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Length(UTF8Version) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Move(UTF8Version[</span><span style="color: rgba(128, 0, 128, 1)">1</span>], Bytes[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">], Length(UTF8Version));
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(Bytes) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Bits.AppendBits(Bytes, </span><span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TEncoder.AppendKanjiBytes(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Content: WideString; Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Bytes: TByteArray;
ByteLength: Integer;
I: Integer;
Byte1: Integer;
Byte2: Integer;
Code: Integer;
Subtracted: Integer;
Encoded: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(Bytes, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">try</span>

<span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

ByteLength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(Bytes);
I :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">while</span> (I &lt; ByteLength) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Byte1 :</span>= Bytes <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $FF;
    Byte2 :</span>= Bytes <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $FF;
    Code :</span>= (Byte1 <span style="color: rgba(0, 0, 255, 1)">shl</span> <span style="color: rgba(128, 0, 128, 1)">8</span>) <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> Byte2;
    Subtracted :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((Code &gt;= $<span style="color: rgba(128, 0, 128, 1)">8140</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (Code &lt;= $9ffc)) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Subtracted :</span>= Code - $<span style="color: rgba(128, 0, 128, 1)">8140</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ((Code &gt;= $e040) <span style="color: rgba(0, 0, 255, 1)">and</span> (Code &lt;= $ebbf)) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Subtracted :</span>= Code -<span style="color: rgba(0, 0, 0, 1)"> $c140;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Subtracted = -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FEncoderError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Encoded :</span>= ((Subtracted <span style="color: rgba(0, 0, 255, 1)">shr</span> <span style="color: rgba(128, 0, 128, 1)">8</span>) * $c0) + (Subtracted <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $ff);
    Bits.AppendBits(Encoded, </span><span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">);
    Inc(I, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.ClearMatrix(Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Matrix.Clear(Byte(</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TMatrixUtil.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Build 2D matrix of QR Code from "dataBits" with "ecLevel", "version" and "getMaskPattern". On</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> success, store the result in "matrix" and return true.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.BuildMatrix(DataBits: TBitArray; ECLevel: TErrorCorrectionLevel; Version, MaskPattern: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
ClearMatrix(Matrix);
EmbedBasicPatterns(Version, Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Type information appear with any version.</span>
<span style="color: rgba(0, 0, 0, 1)">EmbedTypeInfo(ECLevel, MaskPattern, Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Version info appear if version &gt;= 7.</span>
<span style="color: rgba(0, 0, 0, 1)">MaybeEmbedVersionInfo(Version, Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Data should be embedded at end.</span>
<span style="color: rgba(0, 0, 0, 1)">EmbedDataBits(DataBits, MaskPattern, Matrix);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed basic patterns. On success, modify the matrix and return true.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> The basic patterns are:</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - Position detection patterns</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - Timing patterns</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - Dark dot at the left bottom corner</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - Position adjustment patterns, if need be</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedBasicPatterns(Version: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Let's get started with embedding big squares at corners.</span>
<span style="color: rgba(0, 0, 0, 1)">EmbedPositionDetectionPatternsAndSeparators(Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Then, embed the dark dot at the left bottom corner.</span>
<span style="color: rgba(0, 0, 0, 1)">EmbedDarkDotAtLeftBottomCorner(Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Position adjustment patterns appear if version &gt;= 2.</span>
<span style="color: rgba(0, 0, 0, 1)">MaybeEmbedPositionAdjustmentPatterns(Version, Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Timing patterns should be embedded after position adj. patterns.</span>
<span style="color: rgba(0, 0, 0, 1)">EmbedTimingPatterns(Matrix);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed type information. On success, modify the matrix.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedTypeInfo(ECLevel: TErrorCorrectionLevel; MaskPattern: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
TypeInfoBits: TBitArray;
I: Integer;
Bit: Boolean;
X1, Y1: Integer;
X2, Y2: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
TypeInfoBits :</span>= TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    MakeTypeInfoBits(ECLevel, MaskPattern, TypeInfoBits);

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> TypeInfoBits.GetSize - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Place bits in LSB to MSB order.LSB (least significant bit) is the last value in</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "typeInfoBits".</span>
      Bit := TypeInfoBits.Get(TypeInfoBits.GetSize - <span style="color: rgba(128, 0, 128, 1)">1</span> -<span style="color: rgba(0, 0, 0, 1)"> I);

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Type info bits at the left top corner. See 8.9 of JISX0510:2004 (p.46).</span>
      X1 := TYPE_INFO_COORDINATES[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">];
      Y1 :</span>= TYPE_INFO_COORDINATES[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
      Matrix.SetBoolean(X1, Y1, Bit);

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (I &lt; <span style="color: rgba(128, 0, 128, 1)">8</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Right top corner.</span>
      X2 := Matrix.Width - I - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      Y2 :</span>= <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">;
      Matrix.SetBoolean(X2, Y2, Bit);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span>
      <span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left bottom corner.</span>
      X2 := <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">;
      Y2 :</span>= Matrix.Height - <span style="color: rgba(128, 0, 128, 1)">7</span> + (I - <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">);
      Matrix.SetBoolean(X2, Y2, Bit);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    TypeInfoBits.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed version information if need be. On success, modify the matrix and return true.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> See 8.10 of JISX0510:2004 (p.47) for how to embed version information.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.MaybeEmbedVersionInfo(Version: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
VersionInfoBits: TBitArray;
I, J: Integer;
BitIndex: Integer;
Bit: Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Version &lt; <span style="color: rgba(128, 0, 128, 1)">7</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Exit;</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Don't need version info.</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

VersionInfoBits :</span>= TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    MakeVersionInfoBits(Version, VersionInfoBits);

    BitIndex :</span>= <span style="color: rgba(128, 0, 128, 1)">6</span> * <span style="color: rgba(128, 0, 128, 1)">3</span> - <span style="color: rgba(128, 0, 128, 1)">1</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> It will decrease from 17 to 0.</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">5</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> J := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Place bits in LSB (least significant bit) to MSB order.</span>
      Bit :=<span style="color: rgba(0, 0, 0, 1)"> VersionInfoBits.Get(BitIndex);
      Dec(BitIndex);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left bottom corner.</span>
      Matrix.SetBoolean(I, Matrix.Height - <span style="color: rgba(128, 0, 128, 1)">11</span> +<span style="color: rgba(0, 0, 0, 1)"> J, Bit);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Right bottom corner.</span>
      Matrix.SetBoolean(Matrix.Height - <span style="color: rgba(128, 0, 128, 1)">11</span> +<span style="color: rgba(0, 0, 0, 1)"> J, I, Bit);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    VersionInfoBits.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed "dataBits" using "getMaskPattern". On success, modify the matrix and return true.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> For debugging purposes, it skips masking process if "getMaskPattern" is -1.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> See 8.7 of JISX0510:2004 (p.38) for how to embed data bits.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedDataBits(DataBits: TBitArray; MaskPattern: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
BitIndex: Integer;
Direction: Integer;
X, Y, I, XX: Integer;
Bit: Boolean;
MaskUtil: TMaskUtil;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
MaskUtil :</span>= TMaskUtil.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    BitIndex :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    Direction :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Start from the right bottom cell.</span>
    X := Matrix.Width - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    Y :</span>= Matrix.Height - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">while</span> (X &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Skip the vertical timing pattern.</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (X = <span style="color: rgba(128, 0, 128, 1)">6</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Dec(X, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">while</span> ((Y &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (Y &lt; Matrix.Height)) <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          XX :</span>= X -<span style="color: rgba(0, 0, 0, 1)"> I;
          </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Skip the cell if it's not empty.</span>
          <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> IsEmpty(Matrix.Get(XX, Y))) <span style="color: rgba(0, 0, 255, 1)">then</span>
          <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            Continue;
          </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

          </span><span style="color: rgba(0, 0, 255, 1)">if</span> (BitIndex &lt; DataBits.GetSize) <span style="color: rgba(0, 0, 255, 1)">then</span>
          <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            Bit :</span>=<span style="color: rgba(0, 0, 0, 1)"> DataBits.Get(BitIndex);
            Inc(BitIndex);
          </span><span style="color: rgba(0, 0, 255, 1)">end</span>
          <span style="color: rgba(0, 0, 255, 1)">else</span>
          <span style="color: rgba(0, 0, 255, 1)">begin</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Padding bit. If there is no bit left, we'll fill the left cells with 0, as described</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> in 8.4.9 of JISX0510:2004 (p. 24).</span>
            Bit :=<span style="color: rgba(0, 0, 0, 1)"> False;
          </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

          </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Skip masking if mask_pattern is -1.</span>
          <span style="color: rgba(0, 0, 255, 1)">if</span> (MaskPattern &lt;&gt; -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
          <span style="color: rgba(0, 0, 255, 1)">begin</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> (MaskUtil.GetDataMaskBit(MaskPattern, XX, Y)) <span style="color: rgba(0, 0, 255, 1)">then</span>
            <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            Bit :</span>= <span style="color: rgba(0, 0, 255, 1)">not</span><span style="color: rgba(0, 0, 0, 1)"> Bit;
            </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
          </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
          Matrix.SetBoolean(XX, Y, Bit);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      Inc(Y, Direction);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      Direction :</span>= -Direction;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Reverse the direction.</span>
<span style="color: rgba(0, 0, 0, 1)">      Inc(Y, Direction);
      Dec(X, </span><span style="color: rgba(128, 0, 128, 1)">2</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Move to the left.</span>
    <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    MaskUtil.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> All bits should be consumed.</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (BitIndex &lt;&gt; DataBits.GetSize()) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Return the position of the most significant bit set (to one) in the "value". The most</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> significant bit is position 32. If there is no bit set, return 0. Examples:</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - findMSBSet(0) =&gt; 0</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - findMSBSet(1) =&gt; 1</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> - findMSBSet(255) =&gt; 8</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.FindMSBSet(Value: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
NumDigits: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
NumDigits :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">while</span> (Value &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Value :</span>= Value <span style="color: rgba(0, 0, 255, 1)">shr</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    Inc(NumDigits);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> NumDigits;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Calculate BCH (Bose-Chaudhuri-Hocquenghem) code for "value" using polynomial "poly". The BCH</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> code is used for encoding type information and version information.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Example: Calculation of version information of 7.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> f(x) is created from 7.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">   - 7 = 000111 in 6 bits</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">   - f(x) = x^2 + x^1 + x^0</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> g(x) is given by the standard (p. 67)</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">   - g(x) = x^12 + x^11 + x^10 + x^9 + x^8 + x^5 + x^2 + 1</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Multiply f(x) by x^(18 - 6)</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">   - f'(x) = f(x) * x^(18 - 6)</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">   - f'(x) = x^14 + x^13 + x^12</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Calculate the remainder of f'(x) / g(x)</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">         x^2</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">         __________________________________________________</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">   g(x) )x^14 + x^13 + x^12</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">         x^14 + x^13 + x^12 + x^11 + x^10 + x^7 + x^4 + x^2</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">         --------------------------------------------------</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">                              x^11 + x^10 + x^7 + x^4 + x^2</span><span style="color: rgba(0, 128, 0, 1)">
//
//</span><span style="color: rgba(0, 128, 0, 1)"> The remainder is x^11 + x^10 + x^7 + x^4 + x^2</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Encode it in binary: 110010010100</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> The return value is 0xc94 (1100 1001 0100)</span><span style="color: rgba(0, 128, 0, 1)">
//
//</span><span style="color: rgba(0, 128, 0, 1)"> Since all coefficients in the polynomials are 1 or 0, we can do the calculation by bit</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> operations. We don't care if cofficients are positive or negative.</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.CalculateBCHCode(Value, Poly: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
MSBSetInPoly: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> If poly is "1 1111 0010 0101" (version info poly), msbSetInPoly is 13. We'll subtract 1</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> from 13 to make it 12.</span>
MSBSetInPoly :=<span style="color: rgba(0, 0, 0, 1)"> FindMSBSet(Poly);
Value :</span>= Value <span style="color: rgba(0, 0, 255, 1)">shl</span> (MSBSetInPoly - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Do the division business using exclusive-or operations.</span>
<span style="color: rgba(0, 0, 255, 1)">while</span> (FindMSBSet(Value) &gt;= MSBSetInPoly) <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Value :</span>= Value <span style="color: rgba(0, 0, 255, 1)">xor</span> (Poly <span style="color: rgba(0, 0, 255, 1)">shl</span> (FindMSBSet(Value) -<span style="color: rgba(0, 0, 0, 1)"> MSBSetInPoly));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Now the "value" is the remainder (i.e. the BCH code)</span>
Result :=<span style="color: rgba(0, 0, 0, 1)"> Value;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Make bit vector of type information. On success, store the result in "bits" and return true.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> Encode error correction level and mask pattern. See 8.9 of</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> JISX0510:2004 (p.45) for details.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.MakeTypeInfoBits(ECLevel: TErrorCorrectionLevel; MaskPattern: Integer; Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
TypeInfo: Integer;
BCHCode: Integer;
MaskBits: TBitArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((MaskPattern &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (MaskPattern &lt; NUM_MASK_PATTERNS)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    TypeInfo :</span>= (ECLevel.Bits <span style="color: rgba(0, 0, 255, 1)">shl</span> <span style="color: rgba(128, 0, 128, 1)">3</span>) <span style="color: rgba(0, 0, 255, 1)">or</span><span style="color: rgba(0, 0, 0, 1)"> MaskPattern;
    Bits.AppendBits(TypeInfo, </span><span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">);

    BCHCode :</span>=<span style="color: rgba(0, 0, 0, 1)"> CalculateBCHCode(TypeInfo, TYPE_INFO_POLY);
    Bits.AppendBits(BCHCode, </span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">);

    MaskBits :</span>= TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
      MaskBits.AppendBits(TYPE_INFO_MASK_PATTERN, </span><span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">);
      Bits.XorOperation(MaskBits);
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
      MaskBits.Free;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Bits.GetSize &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">15</span>) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Just in case.</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Make bit vector of version information. On success, store the result in "bits" and return true.</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> See 8.10 of JISX0510:2004 (p.45) for details.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.MakeVersionInfoBits(Version: Integer; Bits: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
BCHCode: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Bits.AppendBits(Version, </span><span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">);
BCHCode :</span>=<span style="color: rgba(0, 0, 0, 1)"> CalculateBCHCode(Version, VERSION_INFO_POLY);
Bits.AppendBits(BCHCode, </span><span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Bits.GetSize() &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">18</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Check if "value" is empty.</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.IsEmpty(Value: Integer): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= (Value = -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedTimingPatterns(Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
I: Integer;
Bit: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -8 is for skipping position detection patterns (size 7), and two horizontal/vertical</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> separation patterns (size 1). Thus, 8 = 7 + 1.</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">8</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Matrix.Width - <span style="color: rgba(128, 0, 128, 1)">9</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Bit :</span>= (I + <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">mod</span> <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Horizontal line.</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (IsEmpty(Matrix.Get(I, <span style="color: rgba(128, 0, 128, 1)">6</span>))) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Matrix.SetInteger(I, </span><span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">, Bit);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Vertical line.</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (IsEmpty(Matrix.Get(<span style="color: rgba(128, 0, 128, 1)">6</span>, I))) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Matrix.SetInteger(</span><span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">, I, Bit);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed the lonely dark dot at left bottom corner. JISX0510:2004 (p.46)</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedDarkDotAtLeftBottomCorner(Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Matrix.Get(<span style="color: rgba(128, 0, 128, 1)">8</span>, Matrix.Height - <span style="color: rgba(128, 0, 128, 1)">8</span>) = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Matrix.SetInteger(</span><span style="color: rgba(128, 0, 128, 1)">8</span>, Matrix.Height - <span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedHorizontalSeparationPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> We know the width and height.</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">7</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> IsEmpty(Matrix.Get(XStart + X, YStart))) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Matrix.SetInteger(XStart </span>+ X, YStart, HORIZONTAL_SEPARATION_PATTERN[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedVerticalSeparationPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> We know the width and height.</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">6</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> IsEmpty(Matrix.Get(XStart, YStart + Y))) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Matrix.SetInteger(XStart, YStart </span>+ Y, VERTICAL_SEPARATION_PATTERN[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Note that we cannot unify the function with embedPositionDetectionPattern() despite they are</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> almost identical, since we cannot write a function that takes 2D arrays in different sizes in</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> C/C++. We should live with the fact.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedPositionAdjustmentPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X, Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> We know the width and height.</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> IsEmpty(Matrix.Get(XStart + X, YStart + Y))) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      Matrix.SetInteger(XStart </span>+ X, YStart +<span style="color: rgba(0, 0, 0, 1)"> Y, POSITION_ADJUSTMENT_PATTERN);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedPositionDetectionPattern(XStart, YStart: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X, Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> We know the width and height.</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">6</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">6</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> IsEmpty(Matrix.Get(XStart + X, YStart + Y))) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FMatrixUtilError :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
      Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      Matrix.SetInteger(XStart </span>+ X, YStart +<span style="color: rgba(0, 0, 0, 1)"> Y, POSITION_DETECTION_PATTERN);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed position detection patterns and surrounding vertical/horizontal separators.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.EmbedPositionDetectionPatternsAndSeparators(Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
PDPWidth: Integer;
HSPWidth: Integer;
VSPSize: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed three big squares at corners.</span>
PDPWidth := Length(POSITION_DETECTION_PATTERN[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left top corner.</span>
EmbedPositionDetectionPattern(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Matrix);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Right top corner.</span>
EmbedPositionDetectionPattern(Matrix.Width - PDPWidth, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Matrix);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left bottom corner.</span>
EmbedPositionDetectionPattern(<span style="color: rgba(128, 0, 128, 1)">0</span>, Matrix.Width -<span style="color: rgba(0, 0, 0, 1)"> PDPWidth, Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed horizontal separation patterns around the squares.</span>
HSPWidth := Length(HORIZONTAL_SEPARATION_PATTERN[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left top corner.</span>
EmbedHorizontalSeparationPattern(<span style="color: rgba(128, 0, 128, 1)">0</span>, HSPWidth - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">, Matrix);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Right top corner.</span>
EmbedHorizontalSeparationPattern(Matrix.Width - HSPWidth, HSPWidth - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">, Matrix);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left bottom corner.</span>
EmbedHorizontalSeparationPattern(<span style="color: rgba(128, 0, 128, 1)">0</span>, Matrix.Width -<span style="color: rgba(0, 0, 0, 1)"> HSPWidth, Matrix);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed vertical separation patterns around the squares.</span>
VSPSize :=<span style="color: rgba(0, 0, 0, 1)"> Length(VERTICAL_SEPARATION_PATTERN);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left top corner.</span>
EmbedVerticalSeparationPattern(VSPSize, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Matrix);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Right top corner.</span>
EmbedVerticalSeparationPattern(Matrix.Height - VSPSize - <span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Matrix);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Left bottom corner.</span>
EmbedVerticalSeparationPattern(VSPSize, Matrix.Height -<span style="color: rgba(0, 0, 0, 1)"> VSPSize, Matrix);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Embed position adjustment patterns if need be.</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TMatrixUtil.MaybeEmbedPositionAdjustmentPatterns(Version: Integer; Matrix: TByteMatrix);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Index: Integer;
Coordinates: </span><span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer;
NumCoordinates: Integer;
X, Y, I, J: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Version &gt;= <span style="color: rgba(128, 0, 128, 1)">2</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Index :</span>= Version - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    NumCoordinates :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE);
    SetLength(Coordinates, NumCoordinates);
    Move(POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[</span><span style="color: rgba(128, 0, 128, 1)">0</span>], Coordinates[<span style="color: rgba(128, 0, 128, 1)">0</span>], NumCoordinates *<span style="color: rgba(0, 0, 0, 1)"> SizeOf(Integer));
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumCoordinates - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> J := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumCoordinates - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Y :</span>=<span style="color: rgba(0, 0, 0, 1)"> Coordinates;
      X :</span>=<span style="color: rgba(0, 0, 0, 1)"> Coordinates;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((X = -<span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (Y = -<span style="color: rgba(128, 0, 128, 1)">1</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Continue;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> If the cell is unset, we embed the position adjustment pattern here.</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (IsEmpty(Matrix.Get(X, Y))) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
          <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> -2 is necessary since the x/y coordinates point to the center of the pattern, not the</span>
          <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> left top corner.</span>
          EmbedPositionAdjustmentPattern(X - <span style="color: rgba(128, 0, 128, 1)">2</span>, Y - <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">, Matrix);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TBitArray </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.AppendBits(Value, NumBits: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
NumBitsLeft: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((NumBits &lt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">or</span> (NumBits &gt; <span style="color: rgba(128, 0, 128, 1)">32</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>

<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
EnsureCapacity(Size </span>+<span style="color: rgba(0, 0, 0, 1)"> NumBits);
</span><span style="color: rgba(0, 0, 255, 1)">for</span> NumBitsLeft := NumBits <span style="color: rgba(0, 0, 255, 1)">downto</span> <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    AppendBit(((Value </span><span style="color: rgba(0, 0, 255, 1)">shr</span> (NumBitsLeft - <span style="color: rgba(128, 0, 128, 1)">1</span>)) <span style="color: rgba(0, 0, 255, 1)">and</span> $<span style="color: rgba(128, 0, 128, 1)">01</span>) = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Size: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Size :</span>=<span style="color: rgba(0, 0, 0, 1)"> Size;
SetLength(Bits, (Size </span>+ <span style="color: rgba(128, 0, 128, 1)">31</span>) <span style="color: rgba(0, 0, 255, 1)">shr</span> <span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TBitArray.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Size :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
SetLength(Bits, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.Get(I: Integer): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= (Bits <span style="color: rgba(0, 0, 255, 1)">and</span> (<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">shl</span> (I <span style="color: rgba(0, 0, 255, 1)">and</span> $1F))) &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.GetSize: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Size;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.GetSizeInBytes: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= (Size + <span style="color: rgba(128, 0, 128, 1)">7</span>) <span style="color: rgba(0, 0, 255, 1)">shr</span> <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.SetBit(Index: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Bits := Bits <span style="color: rgba(0, 0, 255, 1)">or</span> (<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">shl</span> (Index <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $1F));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.AppendBit(Bit: Boolean);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
EnsureCapacity(Size </span>+ <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Bit) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Bits := Bits <span style="color: rgba(0, 0, 255, 1)">or</span> (<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">shl</span> (Size <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> $1F));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Inc(Size);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.ToBytes(BitOffset: Integer; Source: TByteArray; Offset, NumBytes: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
I: Integer;
J: Integer;
TheByte: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumBytes - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    TheByte :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> J := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">7</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (Get(BitOffset)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      TheByte :</span>= TheByte <span style="color: rgba(0, 0, 255, 1)">or</span> (<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">shl</span> (<span style="color: rgba(128, 0, 128, 1)">7</span> -<span style="color: rgba(0, 0, 0, 1)"> J));
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      Inc(BitOffset);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Source :=<span style="color: rgba(0, 0, 0, 1)"> TheByte;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.XorOperation(Other: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Length(Bits) = Length(Other.Bits)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(Bits) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> The last byte could be incomplete (i.e. not have 8 bits in</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> it) but there is no problem since 0 XOR 0 == 0.</span>
      Bits := Bits <span style="color: rgba(0, 0, 255, 1)">xor</span><span style="color: rgba(0, 0, 0, 1)"> Other.Bits;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.AppendBitArray(NewBitArray: TBitArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
OtherSize: Integer;
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
OtherSize :</span>=<span style="color: rgba(0, 0, 0, 1)"> NewBitArray.GetSize;
EnsureCapacity(Size </span>+<span style="color: rgba(0, 0, 0, 1)"> OtherSize);
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> OtherSize - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    AppendBit(NewBitArray.Get(I));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TBitArray.EnsureCapacity(Size: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Size &gt; (Length(Bits) <span style="color: rgba(0, 0, 255, 1)">shl</span> <span style="color: rgba(128, 0, 128, 1)">5</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetLength(Bits, Size);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TErrorCorrectionLevel </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TErrorCorrectionLevel.Assign(Source: TErrorCorrectionLevel);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Self.FBits :</span>=<span style="color: rgba(0, 0, 0, 1)"> Source.FBits;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TErrorCorrectionLevel.Ordinal: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TVersion </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TVersion.ChooseVersion(NumInputBits: Integer; ECLevel: TErrorCorrectionLevel): TVersion;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
VersionNum: Integer;
Version: TVersion;
NumBytes: Integer;
ECBlocks: TECBlocks;
NumECBytes: Integer;
NumDataBytes: Integer;
TotalInputBytes: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> In the following comments, we use numbers of Version 7-H.</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> VersionNum := <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">to</span> <span style="color: rgba(128, 0, 128, 1)">40</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Version :</span>=<span style="color: rgba(0, 0, 0, 1)"> TVersion.GetVersionForNumber(VersionNum);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> numBytes = 196</span>
    NumBytes :=<span style="color: rgba(0, 0, 0, 1)"> Version.GetTotalCodewords;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> getNumECBytes = 130</span>
    ECBlocks :=<span style="color: rgba(0, 0, 0, 1)"> Version.GetECBlocksForLevel(ECLevel);
    NumECBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks.GetTotalECCodewords;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> getNumDataBytes = 196 - 130 = 66</span>
    NumDataBytes := NumBytes -<span style="color: rgba(0, 0, 0, 1)"> NumECBytes;
    TotalInputBytes :</span>= (NumInputBits + <span style="color: rgba(128, 0, 128, 1)">7</span>) <span style="color: rgba(0, 0, 255, 1)">div</span> <span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (NumDataBytes &gt;= TotalInputBytes) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Version;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Version.Free;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(VersionNumber: Integer; AlignmentPatternCenters: <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> Integer; ECBlocks1, ECBlocks2, ECBlocks3, ECBlocks4: TECBlocks);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Total: Integer;
ECBlock: TECB;
ECBArray: TECBArray;
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Self.VersionNumber :</span>=<span style="color: rgba(0, 0, 0, 1)"> VersionNumber;
SetLength(Self.AlignmentPatternCenters, Length(AlignmentPatternCenters));
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Length(AlignmentPatternCenters) &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Move(AlignmentPatternCenters[</span><span style="color: rgba(128, 0, 128, 1)">0</span>], Self.AlignmentPatternCenters[<span style="color: rgba(128, 0, 128, 1)">0</span>], Length(AlignmentPatternCenters) *<span style="color: rgba(0, 0, 0, 1)"> SizeOf(Integer));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
SetLength(ECBlocks, </span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">);
ECBlocks[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks1;
ECBlocks[</span><span style="color: rgba(128, 0, 128, 1)">1</span>] :=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks2;
ECBlocks[</span><span style="color: rgba(128, 0, 128, 1)">2</span>] :=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks3;
ECBlocks[</span><span style="color: rgba(128, 0, 128, 1)">3</span>] :=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks4;
Total :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
ECCodewords :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks1.GetECCodewordsPerBlock;
ECBArray :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks1.GetECBlocks;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(ECBArray) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ECBlock :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECBArray;
    Inc(Total, ECBlock.GetCount </span>* (ECBlock.GetDataCodewords +<span style="color: rgba(0, 0, 0, 1)"> ECCodewords));
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
TotalCodewords :</span>=<span style="color: rgba(0, 0, 0, 1)"> Total;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">destructor</span> TVersion.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(ECBlocks) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ECBlocks.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TVersion.GetDimensionForVersion: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(128, 0, 128, 1)">17</span> + <span style="color: rgba(128, 0, 128, 1)">4</span> *<span style="color: rgba(0, 0, 0, 1)"> VersionNumber;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TVersion.GetECBlocksForLevel(ECLevel: TErrorCorrectionLevel): TECBlocks;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TVersion.GetTotalCodewords: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> TotalCodewords;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TVersion.GetVersionForNumber(VersionNum: Integer): TVersion;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, [], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">19</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">13</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">2</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">18</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">3</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">15</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">55</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">44</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">17</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">4</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">80</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">5</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">108</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">43</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">11</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">6</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">68</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">27</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">19</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">7</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">38</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">31</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">14</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">13</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">8</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>, <span style="color: rgba(128, 0, 128, 1)">42</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">97</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">38</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">39</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">18</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">19</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">14</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">9</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">9</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">36</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">37</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">17</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">12</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">10</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">68</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">69</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">43</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">44</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">19</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">20</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">11</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">81</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">51</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">12</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">12</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">12</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">92</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">93</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">36</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">37</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">20</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">21</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">14</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">13</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">107</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">37</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">38</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">20</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">21</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">11</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">12</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">14</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>, <span style="color: rgba(128, 0, 128, 1)">66</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">115</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">40</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">41</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">17</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">12</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">15</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">15</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>, <span style="color: rgba(128, 0, 128, 1)">70</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">87</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">88</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">41</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">42</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">12</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">16</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">74</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">98</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">99</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">45</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">15</span>, <span style="color: rgba(128, 0, 128, 1)">19</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">20</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">17</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">107</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">108</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">15</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">14</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">18</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">56</span>, <span style="color: rgba(128, 0, 128, 1)">82</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">120</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">121</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">43</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">44</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">14</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">19</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">113</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">44</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">45</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">21</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">13</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, <span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">20</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>, <span style="color: rgba(128, 0, 128, 1)">90</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">107</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">108</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">41</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">42</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">15</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">15</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">21</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">21</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">72</span>, <span style="color: rgba(128, 0, 128, 1)">94</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">117</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">42</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">17</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">22</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">74</span>, <span style="color: rgba(128, 0, 128, 1)">98</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">111</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">112</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">13</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">23</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">23</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">121</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">24</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">80</span>, <span style="color: rgba(128, 0, 128, 1)">106</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">117</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">45</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">16</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">17</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">25</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">25</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">84</span>, <span style="color: rgba(128, 0, 128, 1)">110</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">106</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">107</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">26</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">115</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">22</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">33</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">17</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">27</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">27</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>, <span style="color: rgba(128, 0, 128, 1)">90</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">123</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">45</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">8</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">28</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">74</span>, <span style="color: rgba(128, 0, 128, 1)">98</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">117</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">45</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">23</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">31</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">31</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">29</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">29</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>, <span style="color: rgba(128, 0, 128, 1)">126</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">117</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">21</span>, <span style="color: rgba(128, 0, 128, 1)">45</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">23</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">37</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">30</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">52</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">104</span>, <span style="color: rgba(128, 0, 128, 1)">130</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">5</span>, <span style="color: rgba(128, 0, 128, 1)">115</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">15</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">25</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">23</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">25</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">31</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">31</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">56</span>, <span style="color: rgba(128, 0, 128, 1)">82</span>, <span style="color: rgba(128, 0, 128, 1)">108</span>, <span style="color: rgba(128, 0, 128, 1)">134</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">115</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">3</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">29</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">42</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">23</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">32</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">32</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">60</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">112</span>, <span style="color: rgba(128, 0, 128, 1)">138</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">115</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">23</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">35</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">35</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">33</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">33</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>, <span style="color: rgba(128, 0, 128, 1)">142</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">115</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">21</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">29</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">11</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">46</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">34</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">34</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">62</span>, <span style="color: rgba(128, 0, 128, 1)">90</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>, <span style="color: rgba(128, 0, 128, 1)">146</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">115</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">116</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">23</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">44</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">59</span>, <span style="color: rgba(128, 0, 128, 1)">16</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">17</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">35</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">35</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">78</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>, <span style="color: rgba(128, 0, 128, 1)">126</span>, <span style="color: rgba(128, 0, 128, 1)">150</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">121</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">12</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">39</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">41</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">36</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">36</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>, <span style="color: rgba(128, 0, 128, 1)">50</span>, <span style="color: rgba(128, 0, 128, 1)">76</span>, <span style="color: rgba(128, 0, 128, 1)">102</span>, <span style="color: rgba(128, 0, 128, 1)">128</span>, <span style="color: rgba(128, 0, 128, 1)">154</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">121</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">46</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">64</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">37</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">37</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">28</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">80</span>, <span style="color: rgba(128, 0, 128, 1)">106</span>, <span style="color: rgba(128, 0, 128, 1)">132</span>, <span style="color: rgba(128, 0, 128, 1)">158</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">17</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">123</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">29</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">49</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">24</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">46</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">38</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">38</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">84</span>, <span style="color: rgba(128, 0, 128, 1)">110</span>, <span style="color: rgba(128, 0, 128, 1)">136</span>, <span style="color: rgba(128, 0, 128, 1)">162</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">122</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, <span style="color: rgba(128, 0, 128, 1)">123</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">13</span>, <span style="color: rgba(128, 0, 128, 1)">46</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">48</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">42</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">32</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">39</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">39</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">26</span>, <span style="color: rgba(128, 0, 128, 1)">54</span>, <span style="color: rgba(128, 0, 128, 1)">82</span>, <span style="color: rgba(128, 0, 128, 1)">110</span>, <span style="color: rgba(128, 0, 128, 1)">138</span>, <span style="color: rgba(128, 0, 128, 1)">166</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, <span style="color: rgba(128, 0, 128, 1)">117</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">4</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">40</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">7</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">43</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">22</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">67</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (VersionNum = <span style="color: rgba(128, 0, 128, 1)">40</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= TVersion.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">40</span>, [<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>, <span style="color: rgba(128, 0, 128, 1)">58</span>, <span style="color: rgba(128, 0, 128, 1)">86</span>, <span style="color: rgba(128, 0, 128, 1)">114</span>, <span style="color: rgba(128, 0, 128, 1)">142</span>, <span style="color: rgba(128, 0, 128, 1)">170</span>], TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">19</span>, <span style="color: rgba(128, 0, 128, 1)">118</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">6</span>, <span style="color: rgba(128, 0, 128, 1)">119</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">28</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">18</span>, <span style="color: rgba(128, 0, 128, 1)">47</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">31</span>, <span style="color: rgba(128, 0, 128, 1)">48</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">24</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">25</span>)), TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">30</span>, TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">20</span>, <span style="color: rgba(128, 0, 128, 1)">15</span>), TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span>(<span style="color: rgba(128, 0, 128, 1)">61</span>, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">)));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TMaskUtil </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> pattern conditions.</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TMaskUtil.GetDataMaskBit(MaskPattern, X, Y: Integer): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Intermediate: Integer;
Temp: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Intermediate :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((MaskPattern &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (MaskPattern &lt; NUM_MASK_PATTERNS)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">case</span> (MaskPattern) <span style="color: rgba(0, 0, 255, 1)">of</span>
      <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">:
      Intermediate :</span>= (Y + X) <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">:
      Intermediate :</span>= Y <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">:
      Intermediate :</span>= X <span style="color: rgba(0, 0, 255, 1)">mod</span> <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">:
      Intermediate :</span>= (Y + X) <span style="color: rgba(0, 0, 255, 1)">mod</span> <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">:
      Intermediate :</span>= ((Y <span style="color: rgba(0, 0, 255, 1)">shr</span> <span style="color: rgba(128, 0, 128, 1)">1</span>) + (X <span style="color: rgba(0, 0, 255, 1)">div</span> <span style="color: rgba(128, 0, 128, 1)">3</span>)) <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Temp :</span>= Y *<span style="color: rgba(0, 0, 0, 1)"> X;
          Intermediate :</span>= (Temp <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span>) + (Temp <span style="color: rgba(0, 0, 255, 1)">mod</span> <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Temp :</span>= Y *<span style="color: rgba(0, 0, 0, 1)"> X;
          Intermediate :</span>= ((Temp <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span>) + (Temp <span style="color: rgba(0, 0, 255, 1)">mod</span> <span style="color: rgba(128, 0, 128, 1)">3</span>)) <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)">:
      </span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Temp :</span>= Y *<span style="color: rgba(0, 0, 0, 1)"> X;
          Intermediate :</span>= ((Temp <span style="color: rgba(0, 0, 255, 1)">mod</span> <span style="color: rgba(128, 0, 128, 1)">3</span>) + ((Y + X) <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span>)) <span style="color: rgba(0, 0, 255, 1)">and</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>= Intermediate = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TECBlocks </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">constructor</span> TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(ECCodewordsPerBlock: Integer; ECBlocks: TECB);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Self.ECCodewordsPerBlock :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECCodewordsPerBlock;
SetLength(Self.ECBlocks, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
Self.ECBlocks[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(ECCodewordsPerBlock: Integer; ECBlocks1, ECBlocks2: TECB);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Self.ECCodewordsPerBlock :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECCodewordsPerBlock;
SetLength(Self.ECBlocks, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
ECBlocks[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks1;
ECBlocks[</span><span style="color: rgba(128, 0, 128, 1)">1</span>] :=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks2;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">destructor</span> TECBlocks.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(ECBlocks) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    ECBlocks.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TECBlocks.GetECBlocks: TECBArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECBlocks;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TECBlocks.GetECCodewordsPerBlock: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ECCodewordsPerBlock;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TECBlocks.GetNumBlocks: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Total: Integer;
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Total :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(ECBlocks) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Inc(Total, ECBlocks.GetCount);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Total;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TECBlocks.GetTotalECCodewords: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= ECCodewordsPerBlock *<span style="color: rgba(0, 0, 0, 1)"> GetNumBlocks;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TBlockPair </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">constructor</span> TBlockPair.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(BA1, BA2: TByteArray);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FDataBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> BA1;
FErrorCorrectionBytes :</span>=<span style="color: rgba(0, 0, 0, 1)"> BA2;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TBlockPair.GetDataBytes: TByteArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FDataBytes;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TBlockPair.GetErrorCorrectionBytes: TByteArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FErrorCorrectionBytes;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TReedSolomonEncoder </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TReedSolomonEncoder.BuildGenerator(Degree: Integer): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
LastGenerator: TGenericGFPoly;
NextGenerator: TGenericGFPoly;
Poly: TGenericGFPoly;
D: Integer;
CA: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (Degree &gt;= FCachedGenerators.Count) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    LastGenerator :</span>= TGenericGFPoly(FCachedGenerators);

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> D := FCachedGenerators.Count <span style="color: rgba(0, 0, 255, 1)">to</span> Degree <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      SetLength(CA, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
      CA[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] := <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      CA[</span><span style="color: rgba(128, 0, 128, 1)">1</span>] := FField.Exp(D - <span style="color: rgba(128, 0, 128, 1)">1</span> +<span style="color: rgba(0, 0, 0, 1)"> FField.GetGeneratorBase);
      Poly :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(FField, CA);
      NextGenerator :</span>=<span style="color: rgba(0, 0, 0, 1)"> LastGenerator.Multiply(Poly);
      FCachedGenerators.Add(NextGenerator);
      LastGenerator :</span>=<span style="color: rgba(0, 0, 0, 1)"> NextGenerator;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly(FCachedGenerators);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TReedSolomonEncoder.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AField: TGenericGF);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
GenericGFPoly: TGenericGFPoly;
IntArray: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FField :</span>=<span style="color: rgba(0, 0, 0, 1)"> AField;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Contents of FCachedGenerators will be freed by FGenericGF.Destroy</span>
FCachedGenerators := TObjectList.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(False);

SetLength(IntArray, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
IntArray[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] := <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
GenericGFPoly :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AField, IntArray);
FCachedGenerators.Add(GenericGFPoly);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">destructor</span> TReedSolomonEncoder.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FCachedGenerators.Free;
</span><span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TReedSolomonEncoder.Encode(ToEncode: TIntegerArray; ECBytes: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
DataBytes: Integer;
Generator: TGenericGFPoly;
InfoCoefficients: TIntegerArray;
Info: TGenericGFPoly;
Remainder: TGenericGFPoly;
Coefficients: TIntegerArray;
NumZeroCoefficients: Integer;
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(Coefficients, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (ECBytes &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    DataBytes :</span>= Length(ToEncode) -<span style="color: rgba(0, 0, 0, 1)"> ECBytes;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (DataBytes &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Generator :</span>=<span style="color: rgba(0, 0, 0, 1)"> BuildGenerator(ECBytes);
      SetLength(InfoCoefficients, DataBytes);
      InfoCoefficients :</span>= Copy(ToEncode, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, DataBytes);
      Info :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(FField, InfoCoefficients);
      Info :</span>= Info.MultiplyByMonomial(ECBytes, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
      Remainder :</span>= Info.Divide(Generator)[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
      Coefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> Remainder.GetCoefficients;
      NumZeroCoefficients :</span>= ECBytes -<span style="color: rgba(0, 0, 0, 1)"> Length(Coefficients);
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> NumZeroCoefficients - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      ToEncode := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      Move(Coefficients[</span><span style="color: rgba(128, 0, 128, 1)">0</span>], ToEncode, Length(Coefficients) *<span style="color: rgba(0, 0, 0, 1)"> SizeOf(Integer));
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TECB </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">constructor</span> TECB.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Count, DataCodewords: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Self.Count :</span>=<span style="color: rgba(0, 0, 0, 1)"> Count;
Self.DataCodewords :</span>=<span style="color: rgba(0, 0, 0, 1)"> DataCodewords;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TECB.GetCount: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Count;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TECB.GetDataCodewords: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> DataCodewords;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TGenericGFPoly </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.AddOrSubtract(Other: TGenericGFPoly): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
SmallerCoefficients: TIntegerArray;
LargerCoefficients: TIntegerArray;
Temp: TIntegerArray;
SumDiff: TIntegerArray;
LengthDiff: Integer;
I: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(SmallerCoefficients, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
SetLength(LargerCoefficients, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
SetLength(Temp, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
SetLength(SumDiff, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);

Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Assigned(Other)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (FField = Other.FField) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (IsZero) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Other;
      Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Other.IsZero) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> Self;
      Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

      SmallerCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> FCoefficients;
      LargerCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> Other.Coefficients;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Length(SmallerCoefficients) &gt; Length(LargerCoefficients)) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Temp :</span>=<span style="color: rgba(0, 0, 0, 1)"> SmallerCoefficients;
      SmallerCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> LargerCoefficients;
      LargerCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> Temp;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      SetLength(SumDiff, Length(LargerCoefficients));
      LengthDiff :</span>= Length(LargerCoefficients) -<span style="color: rgba(0, 0, 0, 1)"> Length(SmallerCoefficients);

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Copy high-order terms only found in higher-degree polynomial's coefficients</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (LengthDiff &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">SumDiff := Copy(LargerCoefficients, 0, LengthDiff);</span>
      Move(LargerCoefficients[<span style="color: rgba(128, 0, 128, 1)">0</span>], SumDiff[<span style="color: rgba(128, 0, 128, 1)">0</span>], LengthDiff *<span style="color: rgba(0, 0, 0, 1)"> SizeOf(Integer));
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := LengthDiff <span style="color: rgba(0, 0, 255, 1)">to</span> Length(LargerCoefficients) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      SumDiff :</span>= TGenericGF.AddOrSubtract(SmallerCoefficients, LargerCoefficients);
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

      Result :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(FField, SumDiff);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.Coefficients: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FCoefficients;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AField: TGenericGF; ACoefficients: TIntegerArray);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
CoefficientsLength: Integer;
FirstNonZero: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FField :</span>=<span style="color: rgba(0, 0, 0, 1)"> AField;
SetLength(FField.FPolyList, Length(FField.FPolyList) </span>+ <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
FField.FPolyList :=<span style="color: rgba(0, 0, 0, 1)"> Self;
CoefficientsLength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(ACoefficients);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((CoefficientsLength &gt; <span style="color: rgba(128, 0, 128, 1)">1</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (ACoefficients[<span style="color: rgba(128, 0, 128, 1)">0</span>] = <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Leading term must be non-zero for anything except the constant polynomial "0"</span>
    FirstNonZero := <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">while</span> ((FirstNonZero &lt; CoefficientsLength) <span style="color: rgba(0, 0, 255, 1)">and</span> (ACoefficients = <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Inc(FirstNonZero);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (FirstNonZero = CoefficientsLength) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      FCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> AField.GetZero.Coefficients;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      SetLength(FCoefficients, CoefficientsLength </span>-<span style="color: rgba(0, 0, 0, 1)"> FirstNonZero);
      FCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> Copy(ACoefficients, FirstNonZero, Length(FCoefficients));
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> ACoefficients;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">destructor</span> TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Self.FField :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField;
</span><span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.Divide(Other: TGenericGFPoly): TGenericGFPolyArray;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Quotient: TGenericGFPoly;
Remainder: TGenericGFPoly;
DenominatorLeadingTerm: Integer;
InverseDenominatorLeadingTerm: integer;
DegreeDifference: Integer;
Scale: Integer;
Term: TGenericGFPoly;
IterationQuotient: TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(Result, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((FField = Other.FField) <span style="color: rgba(0, 0, 255, 1)">and</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> Other.IsZero)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">

    Quotient :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField.GetZero;
    Remainder :</span>=<span style="color: rgba(0, 0, 0, 1)"> Self;

    DenominatorLeadingTerm :</span>=<span style="color: rgba(0, 0, 0, 1)"> Other.GetCoefficient(Other.GetDegree);
    InverseDenominatorLeadingTerm :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField.Inverse(DenominatorLeadingTerm);

    </span><span style="color: rgba(0, 0, 255, 1)">while</span> ((Remainder.GetDegree &gt;= Other.GetDegree) <span style="color: rgba(0, 0, 255, 1)">and</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> Remainder.IsZero)) <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      DegreeDifference :</span>= Remainder.GetDegree -<span style="color: rgba(0, 0, 0, 1)"> Other.GetDegree;
      Scale :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField.Multiply(Remainder.GetCoefficient(Remainder.GetDegree), InverseDenominatorLeadingTerm);
      Term :</span>=<span style="color: rgba(0, 0, 0, 1)"> Other.MultiplyByMonomial(DegreeDifference, Scale);
      IterationQuotient :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField.BuildMonomial(DegreeDifference, Scale);
      Quotient :</span>=<span style="color: rgba(0, 0, 0, 1)"> Quotient.AddOrSubtract(IterationQuotient);
      Remainder :</span>=<span style="color: rgba(0, 0, 0, 1)"> Remainder.AddOrSubtract(Term);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    SetLength(Result, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">);
    Result[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> Quotient;
    Result[</span><span style="color: rgba(128, 0, 128, 1)">1</span>] :=<span style="color: rgba(0, 0, 0, 1)"> Remainder;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.GetCoefficient(Degree: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= FCoefficients;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.GetCoefficients: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FCoefficients;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.GetDegree: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= Length(FCoefficients) - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.IsZero: Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= FCoefficients[<span style="color: rgba(128, 0, 128, 1)">0</span>] = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.Multiply(Other: TGenericGFPoly): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
ACoefficients: TIntegerArray;
BCoefficients: TIntegerArray;
Product: TIntegerArray;
ALength: Integer;
BLength: Integer;
I: Integer;
J: Integer;
ACoeff: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(ACoefficients, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
SetLength(BCoefficients, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (FField = Other.FField) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (IsZero <span style="color: rgba(0, 0, 255, 1)">or</span> Other.IsZero) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField.GetZero;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    ACoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> FCoefficients;
    ALength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(ACoefficients);
    BCoefficients :</span>=<span style="color: rgba(0, 0, 0, 1)"> Other.Coefficients;
    BLength :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(BCoefficients);
    SetLength(Product, ALength </span>+ BLength - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> ALength - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      ACoeff :</span>=<span style="color: rgba(0, 0, 0, 1)"> ACoefficients;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> J := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> BLength - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Product := TGenericGF.AddOrSubtract(Product, FField.Multiply(ACoeff, BCoefficients));
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Result :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(FField, Product);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGFPoly.MultiplyByMonomial(Degree, Coefficient: Integer): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
I: Integer;
Size: Integer;
Product: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Degree &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (Coefficient = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField.GetZero;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Size :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(Coefficients);
    SetLength(Product, Size </span>+<span style="color: rgba(0, 0, 0, 1)"> Degree);
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Size - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Product :</span>=<span style="color: rgba(0, 0, 0, 1)"> FField.Multiply(FCoefficients, Coefficient);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Result :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(FField, Product);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TGenericGF </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.AddOrSubtract(A, B: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= A <span style="color: rgba(0, 0, 255, 1)">xor</span><span style="color: rgba(0, 0, 0, 1)"> B;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.BuildMonomial(Degree, Coefficient: Integer): TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Coefficients: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
CheckInit();

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (Degree &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (Coefficient = <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FZero;
      Exit;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    SetLength(Coefficients, Degree </span>+ <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    Coefficients[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] :=<span style="color: rgba(0, 0, 0, 1)"> Coefficient;
    Result :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Self, Coefficients);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.CheckInit;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">not</span> FInitialized) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Initialize;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">constructor</span> TGenericGF.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Primitive, Size, B: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FInitialized :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
FPrimitive :</span>=<span style="color: rgba(0, 0, 0, 1)"> Primitive;
FSize :</span>=<span style="color: rgba(0, 0, 0, 1)"> Size;
FGeneratorBase :</span>=<span style="color: rgba(0, 0, 0, 1)"> B;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (FSize &lt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Initialize;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">class</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.CreateQRCodeField256: TGenericGF;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>= TGenericGF.<span style="color: rgba(0, 0, 255, 1)">Create</span>($011D, <span style="color: rgba(128, 0, 128, 1)">256</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">destructor</span> TGenericGF.<span style="color: rgba(0, 0, 255, 1)">Destroy</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X: Integer;
Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(FPolyList) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (Assigned(FPolyList)) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> Y := X + <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Length(FPolyList) - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (FPolyList = FPolyList) <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          FPolyList :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      FPolyList.Free;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">inherited</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.Exp(A: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
CheckInit;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FExpTable;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.GetGeneratorBase: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FGeneratorBase;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.GetZero: TGenericGFPoly;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
CheckInit;
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FZero;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.Initialize;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
X: Integer;
I: Integer;
CA: TIntegerArray;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
SetLength(FExpTable, FSize);
SetLength(FLogTable, FSize);
X :</span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> FSize - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FExpTable :</span>=<span style="color: rgba(0, 0, 0, 1)"> X;
    X :</span>= X <span style="color: rgba(0, 0, 255, 1)">shl</span> <span style="color: rgba(128, 0, 128, 1)">1</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> x = x * 2; we're assuming the generator alpha is 2</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (X &gt;= FSize) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      X :</span>= X <span style="color: rgba(0, 0, 255, 1)">xor</span><span style="color: rgba(0, 0, 0, 1)"> FPrimitive;
      X :</span>= X <span style="color: rgba(0, 0, 255, 1)">and</span> (FSize - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">for</span> I := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> FSize - <span style="color: rgba(128, 0, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FLogTable] :</span>=<span style="color: rgba(0, 0, 0, 1)"> I;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> logTable == 0 but this should never be used</span>
<span style="color: rgba(0, 0, 0, 1)">
SetLength(CA, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
CA[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] := <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
FZero :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Self, CA);

SetLength(CA, </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
CA[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] := <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
FOne :</span>= TGenericGFPoly.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(Self, CA);

FInitialized :</span>=<span style="color: rgba(0, 0, 0, 1)"> True;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.Inverse(A: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
CheckInit;

</span><span style="color: rgba(0, 0, 255, 1)">if</span> (A &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= FExpTable - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TGenericGF.Multiply(A, B: Integer): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
CheckInit;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((A &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (B &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= FExpTable[(FLogTable + FLogTable) <span style="color: rgba(0, 0, 255, 1)">mod</span> (FSize - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)];
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span> GenerateQRCode(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Input: WideString; EncodeOptions: Integer): T2DBooleanArray;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Encoder: TEncoder;
Level: TErrorCorrectionLevel;
QRCode: TQRCode;
X: Integer;
Y: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Level :</span>= TErrorCorrectionLevel.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
Level.FBits :</span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
Encoder :</span>= TEncoder.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
QRCode :</span>= TQRCode.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
    Encoder.Encode(Input, EncodeOptions, Level, QRCode);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Assigned(QRCode.FMatrix)) <span style="color: rgba(0, 0, 255, 1)">then</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      SetLength(Result, QRCode.FMatrix.FHeight);
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> Y := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> QRCode.FMatrix.FHeight - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
      SetLength(Result, QRCode.FMatrix.FWidth);
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> X := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> QRCode.FMatrix.FWidth - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
          Result :</span>= QRCode.FMatrix.Get(Y, X) = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    QRCode.Free;
    Encoder.Free;
    Level.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TDelphiZXingQRCode </span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">constructor</span> TDelphiZXingQRCode.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FData :</span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
FEncoding :</span>=<span style="color: rgba(0, 0, 0, 1)"> qrAuto;
FQuietZone :</span>= <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">;
FRows :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
FColumns :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TDelphiZXingQRCode.EncodeToImage(<span style="color: rgba(0, 0, 255, 1)">const</span> text: <span style="color: rgba(0, 0, 255, 1)">string</span>; <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Img: TImage);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Row, Column: Integer;
BMP: TBitmap;
Scale: Double;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Data :</span>=<span style="color: rgba(0, 0, 0, 1)"> text;
BMP :</span>= TBitmap.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
BMP.Height :</span>=<span style="color: rgba(0, 0, 0, 1)"> Rows;
BMP.Width :</span>=<span style="color: rgba(0, 0, 0, 1)"> Columns;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> Row := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Rows - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> Column := <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">to</span> Columns - <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
    <span style="color: rgba(0, 0, 255, 1)">begin</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (IsBlack) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      BMP.Canvas.Pixels :</span>=<span style="color: rgba(0, 0, 0, 1)"> clBlack
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
      BMP.Canvas.Pixels :</span>=<span style="color: rgba(0, 0, 0, 1)"> clWhite;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
Img.Canvas.Brush.Color :</span>=<span style="color: rgba(0, 0, 0, 1)"> clWhite;
Img.Canvas.FillRect(Rect(</span><span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Img.Width, Img.Height));
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((BMP.Width &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (BMP.Height &gt; <span style="color: rgba(128, 0, 128, 1)">0</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (Img.Width &lt; Img.Height) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Scale :</span>= Img.Width /<span style="color: rgba(0, 0, 0, 1)"> BMP.Width
    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
      Scale :</span>= Img.Height /<span style="color: rgba(0, 0, 0, 1)"> BMP.Height;
    Img.Canvas.StretchDraw(Rect(</span><span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, Trunc(Scale * BMP.Width), Trunc(Scale *<span style="color: rgba(0, 0, 0, 1)"> BMP.Height)), BMP);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
BMP.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TDelphiZXingQRCode.GetIsBlack(Row, Column: Integer): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Dec(Row, FQuietZone);
Dec(Column, FQuietZone);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> ((Row &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (Column &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (Row &lt; (FRows - FQuietZone * <span style="color: rgba(128, 0, 128, 1)">2</span>)) <span style="color: rgba(0, 0, 255, 1)">and</span> (Column &lt; (FColumns - FQuietZone * <span style="color: rgba(128, 0, 128, 1)">2</span>))) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FElements;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>
<span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TDelphiZXingQRCode.SetData(<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> NewData: WideString);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (FData &lt;&gt; NewData) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FData :</span>=<span style="color: rgba(0, 0, 0, 1)"> NewData;
    Update;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TDelphiZXingQRCode.SetEncoding(NewEncoding: TQRCodeEncoding);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (FEncoding &lt;&gt; NewEncoding) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FEncoding :</span>=<span style="color: rgba(0, 0, 0, 1)"> NewEncoding;
    Update;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TDelphiZXingQRCode.SetQuietZone(NewQuietZone: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> ((FQuietZone &lt;&gt; NewQuietZone) <span style="color: rgba(0, 0, 255, 1)">and</span> (NewQuietZone &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span>) <span style="color: rgba(0, 0, 255, 1)">and</span> (NewQuietZone &lt;= <span style="color: rgba(128, 0, 128, 1)">100</span>)) <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FQuietZone :</span>=<span style="color: rgba(0, 0, 0, 1)"> NewQuietZone;
    Update;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TDelphiZXingQRCode.Update;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
FElements :</span>=<span style="color: rgba(0, 0, 0, 1)"> GenerateQRCode(FData, Ord(FEncoding));
FRows :</span>= Length(FElements) + FQuietZone * <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
FColumns :</span>=<span style="color: rgba(0, 0, 0, 1)"> FRows;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>unit1.pas</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_76606a29-9e68-4d42-8487-8edee0d515b6" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_76606a29-9e68-4d42-8487-8edee0d515b6" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_76606a29-9e68-4d42-8487-8edee0d515b6" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> Unit1;

</span><span style="color: rgba(0, 0, 255, 1)">interface</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Samples.Spin;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TForm1 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Image1: TImage;
    ComboBox1: TComboBox;
    Label1: TLabel;
    SpinEdit1: TSpinEdit;
    Label2: TLabel;
    Memo2: TMemo;
    Button2: TButton;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">private</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Private declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Public declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Form1: TForm1;

</span><span style="color: rgba(0, 0, 255, 1)">implementation</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
DelphiZXIngQRCode;

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$R *.dfm</span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
zxing: TDelphiZXingQRCode;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
zxing :</span>= TDelphiZXingQRCode.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">二维码外边距</span>
    zxing.QuietZone :=<span style="color: rgba(0, 0, 0, 1)"> SpinEdit1.Value;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">可选值qrAuto, qrNumeric, qrAlphanumeric, qrISO88591, qrUTF8NoBOM, qrUTF8BOM</span>
    zxing.Encoding :=<span style="color: rgba(0, 0, 0, 1)"> TQRCodeEncoding(ComboBox1.ItemIndex);
    zxing.EncodeToImage(Memo1.Text, Image1);
</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
    zxing.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:liessay,转载请注明原文链接:https://www.cnblogs.com/liessay/p/14984488.html</p><br><br>
来源:https://www.cnblogs.com/liessay/p/14984488.html
頁: [1]
查看完整版本: Delphi使用Zxing创建二维码