Prevent additional 0x00 from appearing in the output JLS stream

This commit is contained in:
WangXuan95 2024-09-05 00:03:31 +08:00
parent 23f38f80d0
commit 447adae17a
28 changed files with 3228 additions and 1096 deletions

View File

@ -60,7 +60,7 @@ The input and output signals of **jls_encoder** are described in the following t
| i_e | input valid | in | 1bit | i_e=1 indicates a valid input pixel is on i_x |
| i_x | input pixel | in | 8bit | The pixel value range is 8'd0 ~ 8'd255 . |
| o_e | output valid | out | 1bit | o_e=1 indicates a valid data is on o_data. |
| o_data | output data | out | 16bit | Big endian, odata[15:8] online; odata[7:0] after. |
| o_data | output data | out | 16bit | Little endian, odata[7:0] before, odata[15:8] after. |
| o_last | output last | out | 1bit | o_last=1, indicate that this is the last data of the output stream of an image. |
> Notei_w cannot less than 14'd4 。
@ -72,11 +72,11 @@ The operation flow of **jls_encoder** module is:
1. **Reset** (optional): Set `rstn=0` for at least **1 cycle** to reset, and then keep `rstn=1` during normal operation. In fact, it is not necessary to reset.
2. **Start**: keep `i_sof=1` **at least 368 cycles**, while inputting the width and height of the image on the `i_w` and `i_h` signals, `i_w` and `i_h` should remain valid during` i_sof=1`.
3. **Input**: Control `i_e` and `i_x`, input all the pixels of the image from left to right, top to bottom. When `i_e=1`, `i_x` is input as a pixel.
4. **Idle between images**: After all pixel input ends, it needs to be idle for at least 16 cycles without any action (i.e. `i_sof=0`, `i_e=0`). Then you can skip to step 2 and start the next image.
4. **Idle between images**: After all pixel input ends, it needs to be idle for at least 32 cycles without any action (i.e. `i_sof=0`, `i_e=0`). Then you can skip to step 2 and start the next image.
Between `i_sof=1` and `i_e=1`; and between `i_e=1` each can insert any number of free bubbles (ie, `i_sof=0`, `i_e=0`), which means that we can input pixels intermittently (of course, without inserting any bubbles for maximum performance).
The following figure shows the input timing diagram of compressing 2 images (//represents omitting several cycles, X represents don't care). where image 1 has 1 bubble inserted after the first pixel is entered; while image 2 has 1 bubble inserted after i_sof=1. Note **Inter-image idle** must be at least **16 cycles**.
The following figure shows the input timing diagram of compressing 2 images (//represents omitting several cycles, X represents don't care). where image 1 has 1 bubble inserted after the first pixel is entered; while image 2 has 1 bubble inserted after i_sof=1. Note **Inter-image idle** must be at least **32 cycles**.
__ __// __ __ __ __ //_ __ // __ __// __ __ __ // __
clk \__/ \__/ //_/ \__/ \__/ \__/ \__// \__/ \__///\__/ \__/ //_/ \__/ \__/ \__///\__/ \_
@ -95,7 +95,7 @@ The following figure shows the input timing diagram of compressing 2 images (//r
## Output JLS stream
During the input, **jls_encoder** will also output a compressed **JPEG-LS stream**, which constitutes the content of the complete .jls file (including the file header and trailer). When `o_e=1`, `o_data` is a valid output data. Among them, `o_data` follows the big endian order, that is, `o_data[15:8]` is at the front of the stream, and `o_data[7:0]` is at the back of the stream. `o_last=1` indicates the end of the compressed stream for an image when the output stream for each image encounters the last data.
During the input, **jls_encoder** will also output a compressed **JPEG-LS stream**, which constitutes the content of the complete .jls file (including the file header and trailer). When `o_e=1`, `o_data` is a valid output data. Among them, `o_data` follows the little endian order, that is, `o_data[7:0]` is at the front of the stream, and `o_data[15:8]` is at the back of the stream. `o_last=1` indicates the end of the compressed stream for an image when the output stream for each image encounters the last data.
 
@ -131,19 +131,19 @@ Because **JPEG-LS** is niche and professional, most image viewing software canno
You can try [this site](https://filext.com/file-extension/JLS) to view .jls files (though this site doesn't work sometimes).
If the website doesn't work, you can use the decompressor [decoder.exe](./SIM) I provided to decompress it back to a .pgm file and view it again. Please run the command with CMD in the [SIM](./SIM) directory:
If the website doesn't work, you can use the decompressor [JPEGLSdec.exe](./SIM) I provided to decompress it back to a .pgm file and view it again. Please run the command with CMD in the [SIM](./SIM) directory:
```powershell
.\decoder.exe <JLS_FILE_NAME> <PGM_FILE_NAME>
JPEGLSdec.exe <JLS_FILE_NAME> -o<PGM_FILE_NAME>
```
For example:
```powershell
.\decoder.exe test000.jls tmp.pgm
JPEGLSdec.exe test001.jls -otmp.pgm
```
> Note: decoder.exe is compiled from the C language source code provided by UBC : http://www.stat.columbia.edu/~jakulin/jpeg-ls/mirror.htm
> Note: JPEGLSdec.exe is compiled from the C language source code provided by UBC : http://www.stat.columbia.edu/~jakulin/jpeg-ls/mirror.htm
 
@ -182,7 +182,7 @@ At 35MHz, the image compression performance is 35 Mpixel/s, which means the comp
* 用于压缩 **8bit** 的灰度图像。
* 可选**无损模式**,即 NEAR=0 。
* 可选**有损模式**NEAR=1~7 可调。
* 图像宽度取值范围为 [5,16384],高度取值范围为 [1,16384]。
* 图像宽度取值范围为 [5,16384],高度取值范围为 [1,16383]。
* 极简流式输入输出。
 
@ -229,7 +229,7 @@ parameter [2:0] NEAR
| i_e | 输入像素有效 | input | 1bit | 当 i_e=1 时,一个像素需要被输入到 i_x 上。 |
| i_x | 输入像素 | input | 8bit | 像素取值范围为 8'd0 ~ 8'd255 。 |
| o_e | 输出有效 | output | 1bit | 当 o_e=1 时,输出流数据产生在 o_data 上。 |
| o_data | 输出流数据 | output | 16bit | 大端序o_data[15:8] 在先o_data[7:0] 在后。 |
| o_data | 输出流数据 | output | 16bit | 小端序o_data[7:0] 在先o_data[15:8] 在后。 |
| o_last | 输出流末尾 | output | 1bit | 当 o_e=1 时若 o_last=1 ,说明这是一张图像的输出流的最后一个数据。 |
> 注i_w 不能小于 14'd4 。
@ -241,11 +241,11 @@ parameter [2:0] NEAR
1. **复位**(可选):令 rstn=0 至少 **1 个周期**进行复位,之后正常工作时都保持 rstn=1。实际上也可以不复位即让 rstn 恒为1
2. **开始**:保持 i_sof=1 **至少 368 个周期**,同时在 i_w 和 i_h 信号上输入图像的宽度和高度i_sof=1 期间 i_w 和 i_h 要一直保持有效。
3. **输入**:控制 i_e 和 i_x从左到右从上到下地输入该图像的所有像素。当 i_e=1 时i_x 作为一个像素被输入。
4. **图像间空闲**:所有像素输入结束后,需要空闲**至少 16 个周期**不做任何动作(即 i_sof=0i_e=0。然后才能跳到第2步开始下一个图像。
4. **图像间空闲**:所有像素输入结束后,需要空闲**至少 32 个周期**不做任何动作(即 i_sof=0i_e=0。然后才能跳到第2步开始下一个图像。
i_sof=1 和 i_e=1 之间;以及 i_e=1 各自之间可以插入任意个空闲气泡(即, i_sof=0i_e=0这意味着我们可以断断续续地输入像素当然不插入任何气泡才能达到最高性能
下图展示了压缩 2 张图像的输入时序图(//代表省略若干周期X代表don't care。其中图像 1 在输入第一个像素后插入了 1 个气泡;而图像 2 在 i_sof=1 后插入了 1 个气泡。注意**图像间空闲**必须至少 **16 个周期**。
下图展示了压缩 2 张图像的输入时序图(//代表省略若干周期X代表don't care。其中图像 1 在输入第一个像素后插入了 1 个气泡;而图像 2 在 i_sof=1 后插入了 1 个气泡。注意**图像间空闲**必须至少 **32 个周期**。
__ __// __ __ __ __ //_ __ // __ __// __ __ __ // __
clk \__/ \__/ //_/ \__/ \__/ \__/ \__// \__/ \__///\__/ \__/ //_/ \__/ \__/ \__///\__/ \_
@ -264,7 +264,7 @@ i_sof=1 和 i_e=1 之间;以及 i_e=1 各自之间可以插入任意个空闲
## 输出压缩流
在输入过程中,**jls_encoder** 同时会输出压缩好的 **JPEG-LS流**,该流构成了完整的 .jls 文件的内容包括文件头部和尾部。o_e=1 时o_data 是一个有效输出数据。其中o_data 遵循大端序,即 o_data[15:8] 在流中的位置靠前o_data[7:0] 在流中的位置靠后。在每个图像的输出流遇到最后一个数据时o_last=1 指示一张图像的压缩流结束。
在输入过程中,**jls_encoder** 同时会输出压缩好的 **JPEG-LS流**,该流构成了完整的 .jls 文件的内容包括文件头部和尾部。o_e=1 时o_data 是一个有效输出数据。其中o_data 遵循小端序,即 o_data[7:0] 在流中的位置靠前o_data[15:8] 在流中的位置靠后。在每个图像的输出流遇到最后一个数据时o_last=1 指示一张图像的压缩流结束。
 
@ -300,19 +300,19 @@ i_sof=1 和 i_e=1 之间;以及 i_e=1 各自之间可以插入任意个空闲
你可以试试用[该网站](https://filext.com/file-extension/JLS)来查看 .jls 文件(不过这个网站时常失效)。
如果该网站失效,可以用我提供的解压器 decoder.exe 来把它解压回 .pgm 文件再查看。请在 SIM 目录下用 CMD 运行命令:
如果该网站失效,可以用我提供的解压器 JPEGLSdec.exe 来把它解压回 .pgm 文件再查看。请在 SIM 目录下用 CMD 运行命令:
```powershell
.\decoder.exe <JLS_FILE_NAME> <PGM_FILE_NAME>
JPEGLSdec.exe <JLS_FILE_NAME> -o<PGM_FILE_NAME>
```
例如:
```powershell
.\decoder.exe test000.jls tmp.pgm
JPEGLSdec.exe test001.jls -otmp.pgm
```
> 注decoder.exe 编译自 UBC 提供的 C 语言源码: http://www.stat.columbia.edu/~jakulin/jpeg-ls/mirror.htm
> 注:JPEGLSdec.exe 编译自 UBC 提供的 C 语言源码: http://www.stat.columbia.edu/~jakulin/jpeg-ls/mirror.htm
 

View File

@ -17,8 +17,8 @@ module jls_encoder #(
input wire i_e, // input pixel enable
input wire [ 7:0] i_x, // input pixel
output wire o_e, // output data enable
output wire [15:0] o_data, // output data
output wire o_last // indicate the last output data of a image
output wire o_last, // indicate the last output data of a image
output wire [15:0] o_data // output data
);
@ -810,23 +810,27 @@ end
// pipeline stage j: jls stream generate
//-------------------------------------------------------------------------------------------------------------------
reg j_sof;
reg j_eof;
reg j_e;
reg j_last;
reg [15:0] j_data;
reg[247:0] j_bbuf;
reg [ 7:0] j_bcnt;
reg [ 1:0] state_footer;
wire[15:0] jls_footer = 16'hFFD9;
reg [247:0] bbuf; // not real register
reg [ 7:0] bcnt; // not real register
always @ (posedge clk) begin
j_sof <= h_sof & rstn;
j_e <= 1'b0;
j_last <= 1'b0;
j_data <= 16'h0;
if(~rstn | h_sof) begin
j_eof <= 1'b0;
j_bbuf <= 248'd0;
j_bcnt <= 8'h0;
j_bcnt <= 8'd8;
state_footer <= 2'd0;
end else begin
bbuf = j_bbuf | ({h_bb,191'h0} >> j_bcnt);
bcnt = j_bcnt + {2'd0,h_bn};
@ -848,19 +852,29 @@ always @ (posedge clk) begin
bbuf = { bbuf[239:0], 8'h0};
bcnt = bcnt - 8'd8;
end
end else if(h_eof && bcnt > 8'd0) begin
j_e <= 1'b1;
j_data[15:8] <= bbuf[247:240];
if(bbuf[247:240] == 8'hFF)
j_data[ 7:0] <= {1'b0,bbuf[239:233]};
else
j_data[ 7:0] <= bbuf[239:232];
end else if(h_eof) begin
if (bcnt > 8'd0) begin
j_e <= 1'b1;
j_data[15:8] <= bbuf[247:240];
if (bbuf[247:240] == 8'hFF) begin
j_data[ 7:0] <= {1'b0,bbuf[239:233]};
end else if (bcnt > 8'd8) begin
j_data[ 7:0] <= bbuf[239:232];
end else begin
j_data[ 7:0] <= jls_footer[15:8];
state_footer <= 2'd1;
end
end else if (state_footer < 2'd2) begin
j_e <= 1'b1;
j_last <= 1'b1;
j_data <= (state_footer==2'd0) ? jls_footer : {jls_footer[7:0], 8'd0};
state_footer <= 2'd2;
end
bbuf = 248'd0;
bcnt = 8'd0;
end
j_bbuf <= bbuf;
j_bcnt <= bcnt;
j_eof <= h_eof;
end
end
@ -869,21 +883,19 @@ end
// make .jls file header and footer
//-------------------------------------------------------------------------------------------------------------------
reg [15:0] jls_wl, jls_hl;
wire[15:0] jls_header [0:12];
wire[15:0] jls_header [0:11];
assign jls_header[0] = 16'hFFD8;
assign jls_header[1] = 16'h00FF;
assign jls_header[2] = 16'hF700;
assign jls_header[3] = 16'h0B08;
assign jls_header[4] = jls_hl;
assign jls_header[5] = jls_wl;
assign jls_header[6] = 16'h0101;
assign jls_header[7] = 16'h1100;
assign jls_header[8] = 16'hFFDA;
assign jls_header[9] = 16'h0008;
assign jls_header[10]= 16'h0101;
assign jls_header[11]= {13'b0,NEAR};
assign jls_header[12]= 16'h0000;
wire[15:0] jls_footer = 16'hFFD9;
assign jls_header[1] = 16'hFFF7;
assign jls_header[2] = 16'h000B;
assign jls_header[3] = {8'h08 , jls_hl[15:8]};
assign jls_header[4] = {jls_hl[7:0], jls_wl[15:8]};
assign jls_header[5] = {jls_wl[7:0], 8'h01};
assign jls_header[6] = 16'h0111;
assign jls_header[7] = 16'h00FF;
assign jls_header[8] = 16'hDA00;
assign jls_header[9] = 16'h0801;
assign jls_header[10]= 16'h0100;
assign jls_header[11]= {5'b0,NEAR, 8'h0};
always @ (posedge clk)
if(~rstn) begin
@ -899,38 +911,27 @@ always @ (posedge clk)
// pipeline stage k: add .jls file header and footer
//-------------------------------------------------------------------------------------------------------------------
reg [3:0] k_header_i;
reg k_footer_i;
reg k_last;
reg k_e;
reg k_last;
reg [15:0] k_data;
always @ (posedge clk) begin
k_last <= 1'b0;
k_e <= 1'b0;
k_last <= 1'b0;
k_data <= 16'd0;
if(j_sof) begin
k_footer_i <= 1'b0;
if(k_header_i < 4'd13) begin
if(k_header_i < 4'd12) begin
k_e <= 1'b1;
k_data <= jls_header[k_header_i];
k_header_i <= k_header_i + 4'd1;
end
end else if(j_e) begin
k_header_i <= 4'd0;
k_footer_i <= 1'b0;
k_e <= 1'b1;
k_last <= j_last;
k_data <= j_data;
end else if(j_eof) begin
k_header_i <= 4'd0;
k_footer_i <= 1'b1;
if(~k_footer_i) begin
k_last <= 1'b1;
k_e <= 1'b1;
k_data <= jls_footer;
end
end else begin
k_header_i <= 4'd0;
k_footer_i <= 1'b0;
end
end
@ -948,9 +949,9 @@ always @ (posedge clk) // line buffer write
//-------------------------------------------------------------------------------------------------------------------
// output signal
//-------------------------------------------------------------------------------------------------------------------
assign o_e = k_e;
assign o_last = k_last;
assign o_e = k_e;
assign o_data = k_data;
assign o_data = {k_data[7:0], k_data[15:8]};
endmodule

BIN
SIM/JPEGLSdec.exe Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +0,0 @@
P5
5
1
255
<EFBFBD>e<>J

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

4
SIM/images/test009.pgm Normal file

File diff suppressed because one or more lines are too long

918
SIM/images/test010.pgm Normal file
View File

@ -0,0 +1,918 @@
P5
256 256
255
   G9>?tyviZ]\b_\_^X\WXK@@;$"#)=TQYYXYUWSSRTLJFKD!/iz~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Scr0=}<7D><>tTX2MSDIQF4EDMJG4B3!6BDGA<;:>=;>>=724'.946+!$%$$.7567653596+'+,+./232/12635356554'7?A?% <A $3-@' /=:++/,>L37.   I=CCv}wm_a\`_[YXYXWVQED>%$.9MH=-2&+CXYXRUPUNLFRJ 2s<32><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R^u1A<><41><EFBFBD><EFBFBD>ih9JY?KT39Q)(HRIL6C2!5A?CA>?@?@==A<515'.825+ %'&$166;8673235-)(,+/0/5312/67767799= $7@BA% :=))1;!
.+ !1'# 2(GL31
  !I>AAvuuk^a`^[^YY\]UVOGC9 (.-+$ !:RUPSUOPJUM"4q<34><71><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Q]y1H<><48><EFBFBD><EFBFBD>tj8KY@CQ$BQ4.LZSQ?A/"5==AC>ABB?>=@A202&+858*!$%$&/9<54694865+&(..-/111.3/785768979 ';>7/
77,#29
9! %)(!*41KF0)    L?@>t}ypiddb``]Ya^`XTHG'
$ !%(HWQQPMNaQ"7x<37><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Qar1I<><49><EFBFBD><EFBFBD>xh=HYEFJDM/PYRP;F3%7@BBA?<@B@@@A>4/4&/317.$"!%'/68539777;:0+/(,.-1/.024579786766#(5B<(
40+>4 )0$*!5.9G;0#  JA==qzznafdab`\\a]c]OGG$(")
  +JQRWPMfW#:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pds-V<><56><EFBFBD><EFBFBD>{m=ITONG+NB2R\TO;D7!5??AE=?;B=@<?A0-/&0743-"$"%%0:888666984-*+*1..530414547;65788!$5?@
:+$<0
*1&$%5-JG034  
!N;>?x{skgg`bg]^dV__\M+# &*'("  $BTXQO`]*5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Qbr)Y<><59><EFBFBD><EFBFBD><EFBFBD>i?JSUOK1:GM=#0DUQK7E3#5@?@A==<@>?:<>1,4%.543)"$$$$0:87755577:+,-/..--2/563699;<68<< $6=/
='&&A* #' 00 '37O822 <   G99>v~|oe_efa\^b_\cX# & !  !KQVPcg&7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Rcz,X<><58><EFBFBD><EFBFBD>ziAMRPROMHFKMGCDJGK5G0 8??AB@>>>A>?A<3+3#+714*!#&&(68887<85994++(+--/2516377787<889<! &>9 !=&),> $ *(611A>,6%G   "F79>}}kccfcb`^\^^`M
   /TVNj`'9<><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Odq*X<><58><EFBFBD><EFBFBD>qdALRQSLG?=JBG:78:3'@0"6BCAAB@=A?@;;;3*3%)678(#&&&%49496<56873-)..0//3231376279=44:8  <+ $:! #1A+ -,2!2.H;/7a
"D<:7t}{tfmgdbab\cc]5 
  JWRld&7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Wgv.T<>xokg]AFJMNFA21;/40-,+!@1$5BEC==@?@A==A>/)6#.856,"%$"$067857:7:;:*+.0/11502574555773499 ( 
*7" "6;0(3$&*/@97/((f 
!C954s~ysjhc_aaiddc_ %3661.$ ,VVog%3{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Qmp+Nwnhe\O9?EGN@<3.1+,+'$#H2"7ACDB>@:??A;=>1.1#-712,$'$"#5756:756<87----,,304342293:8849;;"   #9" 0!0/. $2 #&0:69% 3<33> 
 A:73xsuxeci_c`c`bcb  LRTNB;/.)#

 PXwg)5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Vgq,PmgbcWR7199ACC904++'*"D0!6A@BG>=?=@=<>=1*2%.;54(!$&$$263454596><-,,--..3374586755539;;" $6 0,
$ (*4%-=928
2<><32>  !?;2.y~tojikcefjefiZ
*_c]_WD62*-+'>^2MWug'7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ydm+Roc^YYQ;3.1;@FA96(%"B7!5BG?C@<;>>9??>1-1$1756*!"$$&157474579;5+-./,./0011782578:;688  (9/4
0*&&,CT?2,P<><50> !?744wzwsgjlijkcdgh\1W`WRUND5./231/.1g<EFBFBD>O@[sj%5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sem*fgWZZQE6+(+5BCD:0&"A,=@BDA=A?;>@;>C6+2&+715,!'&#'/5575459:74+--20.00024424267:;89:
,:3 :. &%*3KC-. X<><58>  A?;.y<>xvjmgjhcdhelV 2KPPMQQ?41/..310:[t_)G\ne%3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]go+kcLGB<2,"!(/:?I;4(D.)<A<@A@A>=;>A??5/3$-614.&$#&,45346669:5--++2.2.00127235688648 
 .- * ,7 !)).*8H1%5 y<><79> 
"=741s~sjigpkgegijY  (9GJJFC7/)+(*,/3;Pgc8S\ts(8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ymp*[O@=9.+#*188.& E+(9?DA?<@?==<?@A0.5#*545- '%&*05720656780+.,-1++04<@HUbQ>569259  // ( 55  #)" 0A6'*&!-<2D><><EFBFBD> 
 :74-y<>~xofmjffieoja/DEDD?33-**,278AQfaCTavg(9<><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\pl(cE65+&  ")) 
F-9?@@>>==B?>=>;1,0"+536."$%&&/5;62342::2++,,,/2Jj<4A><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\F978


1$ <& $ *$4?/)03<><33><EFBFBD> % 964+x{ysligghhiefgh 0BEILG93/,+//06>Q_^UZ]ri*4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>aho'^H1.'%  
@)%:FAAA>>;>=;;973.0!'752+ )''(/3:82575;:2+(+-/7c<37><63>~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>\= 
1 "@  "+*:=+3/
J<><4A><EFBFBD> =97-u<>}uolnkkkionjb9=ELI60)$! %)+'"%"!'9_bm+6<><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W!pq'L?-+% 
 >)#;@A?>?>7==<C;?1+3",865)"($#&15476;:77;2+-,.=i<><69><EFBFBD>~vkhy<68>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,  
* &;
$'!-@:'1$p<><70><EFBFBD>   ::6*q<>~wijhgkjldihj

%<FM<#   -^co*8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z!ol%E2$#

B)!7CD@E@A:>?=?=>2+4#.776*!*$&&056855888=1)+:Idq<64><71><EFBFBD><EFBFBD>lbay<61>rr<72><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
') )7 !.'.A5+6&b<><62><EFBFBD><EFBFBD>   A;5+v<>vknikpfjefil?* !=A=#
 /- 8bcwi)3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y&ul$G# 
 ?*#<@AB@8=<=?B??;3.2"+734+#*&''5875567558-/:[<5B><><EFBFBD>ysz{tg\ku`bgps<70><73><EFBFBD><EFBFBD>7*# -- ("0+BE6)-.<2E><><EFBFBD><EFBFBD><EFBFBD>   >:6,u<>~qlnqmlonggjl9/5+=:2
*8CEChduj'3<33><7F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>['uj%H


  >( <AEA>>A>8;=><=0,4")521(!&%#)6;:53654667Qh<51><68><EFBFBD>whgnqzua[l_c[O\aw<61><77>u* -) 0!  )! -EA*'
 s<><73><EFBFBD><EFBFBD>    :=8+t<>|uontllnmkjml&5;8%'GE:('$)4?@B1-Zlkavr*3}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]%sg%H(& 
>&#:@@?@@?;<<A;::3-2",116* '$''2567565:8:Of_p<5F><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tsl[YZXBIS^lz<6C>m
"#$5
#/#3D6,) O<><4F><EFBFBD><EFBFBD><EFBFBD> 
  9:3&p<>y{pqldlnklqke(4%&;HNOMDA/"";DKD?U*!Dquigvg(5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>b&pi#PA6-' 8/ 
?%%<??><<?<;;>:<<314".735)"&)'&147484/76<KUYZl<5A><6C><EFBFBD>{vz<76><7A>uiTJTE9?OYgr|<7C>S %!%' / $*!6=24# 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 
 :?4(u<>~<7E>vqlmgniiiih;)1GIGIQTH=1()9UFG@=\lNPzlhhuc(2}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y&pg"QB22+'  =*$>>B<B@;><><?@=5./0695$!%%&(37867575:8AHNV^ksgeihWWORC-9#%7AIX`m<>}&  !'$ '%.30+ n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   9>5)s<><73>ynlhqpnpnljgN/8@CBGLVHD9/29D236?Kk^fpdkfvi)3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]$k_!K7,**'!  
E(%=ABA>??<:9;==>0.2!.646)")&%&26867997/3IHWRHJLNJ?648;EF+-1Kisd|r8 "$ &  !!31,-$ 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 
 :?4(m{<7B>ymlqpikniknba724>B@<ADDEC>6.*.6;D=R;WeWfeog*5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X!m[I/-*($
?)&=D>?A>@=>7><@?1,1!+867-!%&&(237947:<=<9<V_XJ0#$0+)%/+B ,R|xl`< #$+  $ -F4&/
?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 6A6's~yqqjgnombgkkfR?2<==99:8=>90*'##*%DSRddlb*1y<31><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z!_Y"B+% 
@('=@@?<:=8:<;::<-*0.897(&(&')576656681*,5IH4##77/
.u<>fG5 
&$2 .$';D.$)e<><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>    6F5'k<><6B>~qnlnlnlojoif_I<8998115863/+-,""-jLBQRe`jg'0q<30><71><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y"\T!< 
C*&<AB@>>;>9979>:0,1)545'#&((&27:888:76-*!"*26+  %YwV<7 '% 0 +B5"$ +g^[vubff  
  7G7&n<>~zrqlnnmipjhkhfS;,5=93512432.455/5difOVb_hc',m<><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>~<>R$RL7 
?''>?>>=?@@:79;9>/.0*624+#'*+-638935<<2#   ($! !)?N@I? ) % )#5>.% ?WG:[dTXJ 
 3H3%f{{ttvuoloimhijbQMT@7:60+*1<=3+043*;Q:BKZ^`_X'/h}w|<7C><>}<7D><>y}y<7F>|{|y<>Z#NO!= 
@),A=?@?>;;>>;:A8,.0.325,$(',)974:95=@0$ #('6&/-"*>2;=GJ )% $/ ;=/" (v<><76>zfyy<79>l
 3D0(q<><71>{tvsnqsomjpjoaRMJB8472)$*56  C^b`\Z(,]wxvzty}strtqsrqrsrU#TH B
 @)&;>=AC<8>:;;=<;//0 +426*"(&&(578465;?/" !64!HJ3:<L.-5KQ  ' +))B:* E<><45><EFBFBD><EFBFBD>usz<73><7A> 
 )C5#o<><6F><EFBFBD>tnurxnvornkmeUJE@520-)').!*( /B+#F\\]SW&,gmpowqqrtpmronilmsrT!NF9! 
>)'=;?=>:9=;9?=?7.+0-777+$*($(54:6946>:<7.1/168' &'#!OT4T@K:(8E?
"& %  %#!3=1 +j<><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   -B2&n<><6E>}qqsospoosngmgTJAA1.++)&'& +,&%./Hc`bUS#-^mopspqledljhleillnQ!EC;

9$+<>?;>;8=99<@=8/-3-124*$((()337438:.,=;8.5>@8723.3&."')PN.LGKEC@<)$ 
! (#'?7"A<><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   'H2#f<><66>}rttsqrlqqpoodXMDC4'#$$ '*#&'4F;Vaa[RP(+YfbghlgjdcmhhgdfhehTEH 8  ;($;@@<=::=@<;=9;..1+213)"**)+16:9469&"$*-)+ )*082,6OL02=?OS?2! '"
# &(3@( # W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>    +E1&f<><66><EFBFBD>x~vtqqvoniqliWUZ>=(!'33,.*-*9XgPb^a[NO&)[f^`kg_djefg^]a]`ahM!KC/ ?)"9??==<;99<9:;?-+0,567(#((()35617573
 ( 9IL3$.49C90   ## "&(-4$$
"j<><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>    *E3&i<><69>|vtutvosuopkmdW<64><57>@7)*43/'%$+;P^g`c[OP&(T_\^a\b^d_`b_[Y[_chP G?8+.,-0520*" !""%'&&,***5=%$9<:<=>:8<<9:98++2,634,%'(%*6987959:
  '@I1&+++ //   "$"%%$*%(% ,r<><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   (J3&f<><66>urqtuosovqrniR<69><52>Z3+  9a^ab^OL&'Rbbb_c^\a]]ac^YZ]ZaN!H>S<53><7F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tZRTKFEFDCJD>AC?;&&;?@==;9799<@89,+5 *245+%''(,55275979%,&( +77(*!%?( $#)'!'!%&$ !Fc}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   *N3'g<><67>}zvwsurqttljqh7tڵB%
H]eeec[LJ%*UZY`dca]]_^]Z]`]]cbL"M? U<><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>hTD>C:3330/-*&&%%;A?;<>45;;==:9-*0!-446("'*))12:;577:' 0=HHEF;)%! % !+%(#(5  $ 
 /0&  =Wo<57><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   $O3(i<><69>|xvvytqtoljom=G<>ܥA"   5l<35>gga`bVII&(Q`a]]`[]_a[T_c^ZW]`Q A<#9JPNUccZWG5(# 8??;?>9:;8:@><,,1 0635('(&**0764056:1'/("5ACE2*)#*"#   (%" #:3#
3Vu<56><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   &L0%a<><61><EFBFBD>wxurrvxqsuT0<1B><>Ѽm+$($ 6D<36><44>h`dcd[KL$(Q_YW``b^`aed_ZY[]^WM!E>!)$"  )7;=>9<=8979::;.+3!/;34($)*)(1540.4175#=H?' (&!' !   2%(&$-=) 3X~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   %K2&e<><65><EFBFBD>zputtvup`="N<><4E><EFBFBD><EFBFBD><EFBFBD>N%&$"8<><38><EFBFBD>VZhebaLL&)R[_gd]ee_beba]`X]]_J"L=# $',1865.%!"!%&''('*(,.07>:=;;;=:9;=?8,+/,335-"&((+666613356!$,BfA)" (/9<##&&" 2#!' !$"-(
'./R<52><7F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>    /I1&k<><EFBFBD>uzyytwjN'<13><><EFBFBD>ƶ<EFBFBD>|6)<29><><EFBFBD><EFBFBD>H8G]cbOO&'Tbeddcaifcdcdb]X[`\G%CB=BNTZ^df_PF;2/12,2037155121/0/>=>9>;:;<6<:770,0!.644'''&%(24444166629+$/YZHF65((&178;E+!) ,! 
1#!! &((3  3%0Tz<54><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   &K4'j<><6A><EFBFBD><EFBFBD>}zx{\<$
 &<26><>ɾ<EFBFBD><C9BE><EFBFBD>L 1<><31><EFBFBD><EFBFBD><EFBFBD><;'+?MPP%+T`adacgjngdagahb^W[M!EJMQ[`csupeZLG:955765953566520,+8@>:@;?95;7;79,+/ *155*'&+')425443464?QOTSXTHORM84<E?<:B  )10"   -% .(,% %>.X{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  !  ,I2&h<><68><EFBFBD>|}qZA.
 S<><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I?<3F><><EFBFBD><EFBFBD><EFBFBD>)=9"'9H-'Ucfgeggjmlhfcab_][[J#GMPUahfqurh[K=430.+*++'"&%"-<==;<>:57<A::6,./!+6/3($+))(334322432Hdbj]SJFP\n^UVIFB8*(#$8S,"!!
(& !($0$
*.Wz<57><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>   )M1'n<><6E>nVC;1'  <14><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]
<16><><EFBFBD><EFBFBD>*<+!/7=Sfgkiligilllfbde_`]H1338>72643*!!#%'(.?B<:8<;:77<=797-*0 ,622($+)%+555301002EjohWRD<GdcUSI?<0).(&2=/# 
&**(5% #1),U{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>     *L4(hg=.+++)  @<40><><EFBFBD><EFBFBD>n(<28><><EFBFBD>13&!,9CSdjfkpgnptedf`^`]P) *27AJLPMHA50-/115647::8689;:>:;>>>==:>7<<9<>97,+1#12/5)#((&)4324110.3GaWFNI95.Mn_TQJ?EHKZ<&$00#   (,)/ "2&.Z~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  ! &P501*%$**& 
<0F><><EFBFBD>xn<><6E> 1." +3<OVenqkkmkegdad_\KSZ`ou|<7C><><EFBFBD>jYLC?<=>@><@:?>>=AA=<><><?<;;:;><9;9;8//.$1518&(+&)*343/12243@C20E()=BPIG;4AQ^jaI/-"  %"$2(
34+0`u<><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>     >-)&&"%#!

.<2E><>7 .(<1C>|".('560Cmsnikkhf]]`ZVYaqw{y<><79><EFBFBD>n_TIECHHDEBD?>>BAB<<=@==<?>>97=<;;:;;:+.1 0328(#*())05230445526!%KJ<>C=+7:8..CTdklS-1  !
#"(4&
44&0Xs<58><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  ! +"!"
eO- C&<_8nH #(''$"Mnqrllgc_c^[^gqmy<79><7F><EFBFBD>viYKFEGHGDFE@@9=<=B?=>@B:>?8>:7:78>;<90./"4546'()')'12221122444% 0=B988& ('%.ITffg`/0!)#
#!+/( !<2*4Zv<5A><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>    :*0E? $<24><><EFBFBD>K &]sslhge_[Y\Zdnpx}<7D><><EFBFBD><EFBFBD>zdNJHDKLLKI@@BA?CAB<<>;@=?=;<=:;97:9=91/3#-225&''')(301/0/1155555::JH(/+%/AKYfl_2. )" *%'  ++71'0[}<7D>ylk<6C><6B>uou    1!oyNc<><63>Z;tqpjcce]`\cdhpt~<7E><><EFBFBD><EFBFBD>qo_LJMPLLDFB?ABA?>@;==>;:;;<<8:?87:<<:1//.214$#&***1520.11331/5=H:I?-+6GA/(,?IP[oY43  0%0  $+20(-Yz}XZPj^TRbf   
 $X<>U'<27><>b *mvpklffea^bc`k~<7E><><EFBFBD><EFBFBD><EFBFBD>xeTMGJLNPJJEA?A??>@:=??;:=;:=><;669;980,4$-573&#))('1/00411113),7G:1/.9<>7.%.=@IPrb7,
 5#5"
"$72&-T<>y_TTbW]Ifl    
?<3F>r c<>q 
#Rvvmmjed^X_gerx<78><7F><EFBFBD>shUMFIOPOIKHA?@:>=><=::9;>8<:;8<78<762/30%-123%"**+'-110315034*%1MLPMBCE@7'"-469Iyq:+7"2(" 4*65'.Uuxlgbf`ZSks!   
  $Qp R<>x >rrljac`]U\hnt<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ydVIGHJUTTHGEHD??<;?>9<;;7;9;9;:>:70+'&,1".243"%((*'0142302-04,'+BRb\IEA8+*+',G<><47>?#-$023-$ 0141%-SrleZbcdazt       
e a<>h  -goie`d[\_^dfts<73><7F><EFBFBD>qhTHIIKPYSNGGEE?=>A>8?=A8698;8;8987.+,,/.%,.42#"&((*1421102211)'/0:?A72*(D~<7E>V86.)53+- 
'&31$.Jbb`[Metlb}<7D>  


b
bjX
  "bkoj`b][[\bjxv}<7D><><EFBFBD><EFBFBD>u`SKMHLTYYUEEGC@??;@9>==;:=7:=6<:99-+ +"0304 &&')(.024022/33,))+*% $Er<45><72>y/ *- 5*+ #
!3-"*:@@BK:Bc[PRN  
  X b_K  Bjhhd[\ZWWaiony|<7C><><EFBFBD>{hXNGIKTYXUPIHDAB=A<:>9=::<<<:;6:67.,!",0$)/00%(&()210.531145+(/(&"/  %EZbfo24$7 (!4-."(% 7+51#3FP[DLD;@B=>C  
J
\O;   <iqja]\ZW[allu<75><7F><EFBFBD>zocZOEJLTXZXUKF?B@A?==>><>9=>:9;<;750.$&+,#0,.0 "%"&&+-./.00.43)*($#"E+ #330$"&2=??60'$4%"-,*()a/5.".WiqTbbN=IRR_    !#

2 SQ<    5mjic`c\W[cijt{<7B><><EFBFBD><EFBFBD>weWNMIHR`\^VIJGEC?A>@<;;:99;88:7;77*(!)(+#,002!#$%"&))/0.,,-.1%(&'$:H@73.5>/"#'2-AJ3$4!'#)+*"+' e*!7- -h<>{emlePYegd"
 PN5  .fnib[YXYYdikw{<7B><><EFBFBD>}ncSJGFLW`fd^MKEB@C?;>;?>;::>9<9:235-(#), ,-/0#%$"$(-0.+-+,/0%#&,%9=>;8*!&.5NYA00 '#'.)(.H+6- ,_<><5F>grgnjatj[! 
 :T2
 &flngJ^Y\Udgps<70><73><EFBFBD><EFBFBD><EFBFBD>sgRPHDPTeolcTIIC?=@=?9>=<78631..'*),%%'*")--1 $%)..-(,*+.0&%,0# $)?XQ3('*/(!*19$ 3+"+X<><58>kt{vigoki  "  'O,   'flic]`[Y_ddst}<7D><><EFBFBD><EFBFBD>~aTLHDNU_imbVI@8:441/,**+)((),+,')))&"'(!'1./ #(-.-()+,.,$()-"  
!E/$*++/' $:$2+ 3f~<7E>qtqyojr{~    #! 

>% ,lled`_[__clr{<7B><><EFBFBD><EFBFBD><EFBFBD>ueVH@ELIRUSQK@6..,+*,0-,0-++'& *)',)/,1(+,-&%#&)')+#&  0YL.)$)((%,) 5#!6- 3j<33>q`fYdVBLRj    !   %  
)kphd_]]^XcdfmmuxuqgaQH:266;GIQWPFA63-(# "%%.+&')!*,0-!&%#"#&,#&& 3Qf<51><66>H! )&*'2$!  &4+ 2px`Vg[UOMLV!  " !

 !    )fd^ZYSMIHKJHPW[blnnlbRC;:878<<7/#!&%+'+,/-,,-,.-,.)')!(--$"%'(..! %$ (<R]b<><62>Z"*3-)7.#1m<31>~d_aicegnl!
     "SVTUKLRKQSMS\X^^\XPF6'$+35310+1.0-1342142531-11;?5/0*+%*(*&)+672+#!% !$*CS^i<69>B %/!.$ 8,#4m<34><6D>gojqr`mhn!  "!

!

  )cgaURF<6/($'*,25:=>63..07?NSPJA;857452669574100+1;GCWUQ5 &+&"'E>)%# ""   !#).()/Epx "#+ 51#6m<36><6D>lnivugfjn       ,)$#&&')04@MX`knkf^L@8<8@KQTPLHI;9:5465101..-)*%*5HY[RRT<*#'%)&K>'#,#   !%  *Gz5
$% 7,"6o<36><6F>ha_oqgcql$  
    
 +CCDBA><?EIMVdivxwue]MG@BENSPKJJIA;1.-((*)+)*-*,&438ERUEVVN4" (4@1'& !"' #(?_Z(!4-6m|<7C>tfjpijdzl  !   


2V[XSNQJLSPYcnsy<73>{}g_MD;9;:68;:DJIE<553332.001*"%0438TfXDRc`D)/13%+1-   " $$$:JX&("   3-/_~<7E>lhgqqij|w    # 



Edeb\SQRRKKV[filjnmb\M@>38;;@BOPW_[J7,$$! !+*(+CF96AXn`KE( "#%* &
#&<>=<! ("   "3+3a<33><61>pkfmqjr<6A>r#     
Rc[[WMDDB?>FJW[ooz|<7C>|mXHC96/0/7786,!! !"$*0113')#*$,26KSLZ]DGFB;: "(,  "$"#>@<(K#$$+  
$7.!0Wyxgiizulh<6C>w!  
  
DUWXRURTVSNZY_eiolocOE1$&-7AFA@?778:;>@=8-$"$*.CDNJ=N>AIA<B"
&-"   !"$#><@9#!!-  #8-1Vp{muo|usnr   ""   
 ^tvj`^WOFC<4313185::1&! !'.@MXdfhaWMC?:?6<A8-#&,)*/?2.6;EMOP1 !  #
!>?L!.  
$5,/Ul}qypxyqsz"  !   
 !LI@72)#" #)1>H[dnk]T=2005<GGGqqmhcTH@CE=5-,"-."$*".JRO/#:* ! !$! ! 7AW"'+!    7/5Xppukuqhw}{#  "!  
!-0/0-/25;>DNXggu~||k^I=7;;6;Yooloj^\OJGH4%!& '$00!!.@GWP)%1HO)  !!!!"  ,AW4".  #:0 1[v~nqr{jl}q{!    

 *;URMQGIHKRR\aeuv<75><76><EFBFBD>udPH=144AV^iomng`]MIH;!%"&/5?HC955FD6"
 "!"! ! +9E?8$ !'5#$*Cat~mskprbnpv$   
/ccf`YVWUX]\[cpq<71>~v1UE::57<NVhokonoP(3E.$&8((*#(JQ/;IW; ! ""!!"!   .>RY 3+1Zt|tojwrggso% #" 

 
7mkib\_XYTUUbeuw<75><77>~|g[F?88<DOUdlnpmL $B%# /*(D@HD/!(98IMM;  !!!!"$#!!"!
)8PZ(" 
 #5,/Wyvqf_klggtk#   
 
 <noi_\YVSTST[fqw<71><77>~xkVE75;<BQZ]ijqS  ,HA7DORTL6 !+DLQH?( !!.7-$!!#'7M]3"$ #:,.Vx<56>yghlnpp{p%  "   Ooic`bWTQOUR]coz}<7D>}zhVD<87;FIRchmb["
 %!-1"/4"$/C@9G`]M) ":FN?65,#.@B=+ !## '5L^="4,"1Tlsofewngnzp#  ! 
bega]YWTURZX]dn}}{<7B>weRC=88?HOT[dcbT." /387/32*"&2),<@EI5#DLA0+,-## $<E;5+! !"$2LW5  $5-*@L[VI?^hdiq\#  "

 )fljc\]YVTSRUccny<6E>~<7E>xbXD:85:=DFMLSX42OH8NJBQk_A((&5IJ7,
 #"$7-%### !#4:81("
#"0GS"& +"%5+!'28OXVHKe\MVT$  ! 
 
Dkkgf`\ZQSVTWbdftywvtobMA51/.59@@HF5HkngUc~<7E>dnunhU!"'%/<N/
"&-<.$
   #/JM+>)4  3*$5B_XXPHW\OVT#  

 %bomhed^SVUPVWRZZ`mjgilhZQH8877<CDW?S\uo[^PaXV<58>ijaG / -(
%-G6 /D.(!7)2KbjadcQ_RWXY#  
 
<jmjrge_[XWVTKLHLS^Xbmmz|q`@=?9:?9+B4=7000)1amnS2 
  "    '3G*" *@+ $7*1Wqv]lld`jlsc"    Uqkjgj_b^YTRYQUWVSZ^jjt}<7D>|aP+ !!(29, GU]'  #/ 

 +:H"%& %=,
 5+6axlinjhgtsk`#    [boqtqvvrnhqlia[SKIGCAEE?4%&--)&&*' #.   #
 
 '9A$'$<226*;i~omlhghayoV#  


 8s<38><73><EFBFBD><EFBFBD><EFBFBD>ywj`WGB</( '%$'3CIO]e\8  
  !,>0%+ "!;1--#6)@kmmmjdaejdX&  
  
 \<5C><>qlbZTH:-& '+/1&5ANMRQRZ^_^hY8A3
  &0># ( 64 8)Dkzpoipl`egog" 
 

 6z<7A>S.$"%+% &*04?FQTUYNUZ\]fkIOJ< !
 !# !$0A  2+!!5*Eq|nqedm\bhjf" 
 
_utX./+)&  ,8@O^fcA))+*-/5AJRWW^QU_[^dgCUO?44" #($ 
 &6;-)"&,55.(#5*@oyedabaimgof%  
DI>/&#%(-.9>@OV[]ee]>)(*-+-2=IQ]\`Y`_`chi;QHA8  )#  
 #8*;9'032<A<?@:0.-$4+7cvia]giejmec& 
  ".8:B@?==;;67@ELUW_ghZ7(').11;GTYdhjeaeZZcU:BFET,
# ,    '<:976=@@=A@;;8/,''(#5)7^rh_hffd`h`i' 
  
+49GJJHAB@978469?CR[\fil_?253969@KR]_]XYURQYb`HI@<>* 

# (1   '0/227:==@@?<85-,$'("7*8bsf[[_eh^fba& 
  

!"=JJEIHB79<859@FOYflswx_@6717468<AFKT^g_UK@9+  
 4*

'.-16=6;<<;72.%"* 3'<asi[V_\^`\aY%    
!(EONKFNKLFFFEGISZ^bluxpr^OKD35588252971) &6?9+!   
 36/55=<40+) & 4*:^trbU_Z_e]t]# 
 
>HYYWTYXW^YUQLIMXQOUY]bdmv|yb<,!-7:<4:BJA.   
+C//'&$" "* 2+:Zpgj\_^a`^ob%  


.GF]ibd^[X[VTOKHHGIIMQQZURM?/  $2=CC??61*&(..0.  

  )'%! 
  "&#6+=`pj`QX\f`im[$   :GJkle]ZTVU^UZWRJ=6/'#
"%'(!#+0354<@<6/' " .
  #$%6)9^vb\KVY^Z]we% 


$HLQjkfiee]WRD;.$&4GTF'"&(&! !#(%&)))&##" 
""$$"
 #($5+6Yo^TV\c]``j]% 
 
ESaXdaXI?4( (.<L[YipY.!!%'($ "$%" ""!"!!  (&%#')%&%(&(*)+++'("$&,8)
 (  
 ("5)9YlZHPQXXRWYWJ#  
  
'aWa\2#*(&,139?GRW`hiZ-&%**+$!$#$$&##!" !#$#"$$%%#&%'&)(*%&""&%/1* 
   $
"0%5+>ZlWLKIOISOWM<57>:   
!C]`hZ(!,5;>@?==91/349@FV[gnn[7*)-*-( &$!$"! !""$"$"##""$##%))+*-*$!&+74' 


'    %)%4(8Tc\QPRUNWSTSk9  " "Rkbf^OGHJDFF><<<116=BDNX^ehlU4.+-.+& '#(*&%%#$"# "#! "&$#$$#'(''()%)'$$)9+  


&-   ! !.!1):Yb^QPUYRRTPYI    
 ,1@]]QKEIDJKGJK@;<:=9F;RYcfgX6%'+--( ! -87@FHJHKHH:4)!!"$"''('*'$&/2&   /-Q4$*266;64*! "*1(:\eG>9FPICFFL-   "  
9a`QPWVV[^ZVO>459::FEPWdliZ6*+-,,#! /9=KMQLKKTLH?2)! (%%/2"  
)U+##%.46=FMLJJBC@5"$,&2'9XdK=;@F=>===)    
<a`aZ^__`^[VN<276<<CFPThmi^;),/-+#"! -;BKPLIGKOKF?2%   %#(1'   
.=8;:@EEAFDHGKJKD=,"!+$5*7VSOL7;QPOPRGn*    B[[\[^``^ZVRM?4349:=EQU_dkZ3+(--.# " )?HJPNFFILJI=1#  #"(2"
   )_UKFE89GEGEFHC6,#"0'#3**759;22@>@@H<P'      Cc]]]^_`[YSTK;2/576>DOWb_i^7&)+-.&! ! /@NMMMNEHDHK>.! 
!%+" 

MLJ7*#332,(-147,#':KB:36:<;?G>&
    ?^WYaac`d]ZVG5/144:DEOZ_fk\4'')**#"! 1JKMLIFEIFJH?0% 
"'* #*,)# 56
# ,:=?>2$  0=K<78::>8=F=#
    >]UT]^[_`XTNA50/06:EHMU_igX1&(*)+#"" 2OLIQJLGDC@;*
 !% 8A7/*   0BKB  )O"
3 **    -@P@68?D=<@JR"     "CXLR^afaWMUSA2014>BFGITZ^dU2$'+)(&"#! !SMCA92*   $#.HB8.) ! );CJJ8
 .TI:(-   -;L:96>>%"   $D\HP`^c^YRYI=211:?@GOOUedlT0'#),&&#!# #!   %'7<<:1#%;A@A;8-  &HWG:KEv<45>:
  
 0>K<:==4 ! 
  $?NAUc`ab_\RG<6117@BJSVaigkR1$'+((&&#&"   !#);:97."2?=>:2.+#
 >U[<S"/G=
 3GRA@@H2  $
    
 "@M>XXUd\V[SE@202:CMNSS^dhgX/(%(''$)%$!  !#*&**(*))(($$#"!! #%*6:=4*2@@@:5,*% 
8FYVX" #BY6  0ET@>;LC+$     
(EJ=X`[\_^XNB=2./6AJLQVagppS1'*('$"&&%"  !"$%$"$%'()&)(+/.++.('%%%);=>7& 3=BE;4/)"
2>R\_6-# 5C3  %1087DI@@JNG%   

"?E9NQU^[\ULC;/0.7AHPSXcllpW2*+&%%''+'& &%'%#$&'#$"!%#!!"##(%)*'"%%.?C?;#
 ,@JEA80'$ 
':IUdO,@' 70**+"
 ""   
$AF<HKNUZYXKA>5.16<GLSU\ghmT.('%'%"&)'' " ! !#$$%&$&#&%,=HD3 &<HF>71)& 0DQ]\ & 
"
    
%>F;CIHNZ_]SH@40189>INQU^ejP-%##&&&%*(& ""%" %%.<JG3
 "<GAC;5.'"
0<GY` #
   ! 
$AD9BKHHV`\OP@4/04<:AENSY^fE+&%%%&)&')$""!&$)&$$%(%&&"&"!"&" "(&/=GC,!8EC@>6.(#!
 -<BSi
 ,!"

  
 
&AC9GICGMZZWTA60207;<GHUabdB)%!"'$%'++)$ +((($&#%#$#**(()&((),+(,$-*3@GD) :H@>:4/*$  '1@Pf" !    
 %AF<CFIDFWWVP>2.0,5:=EPR]`^=&#'#$#%)+-*%$+200..)-)(&+,(&+()***)$#" -+3EKK%
!:DF>64.)# 
+/:Kc5!
  

&@B<AGIEESTTM@411057AGKM_g[<(&$$"$%*,/$#!')*-,/.//0//-.15.02253.,#016ENI#(=GIC;4.)#%,4B[A!

   &7<7GGHGFOUWO=1/-/49;CHO]fY3#$"# %%),-'##('()'*-,..+,/*,.0///-2/%#138GTB >EFG=;40' #+3FXL!

  

'387FIJHHMIQI730-066:DJJQR;((%%#$"#((-'!$%&')$)*'()(*,+**,..,+/,%$.4;FM= CJHC>84.$   )0@TS %   
 )4;;EJFGIGCEB;4./153=:<760*$"'$#" '*-$#***(#*%&$&#%$#$!""#!"" /5<AJG.  &?JH@;730(  !)1@RP ! 

$   #/16DFHFDFBCA:2/-0200.+&&'$&&%! %&,)
"!&$##%'$$#%%%#'&$'$%,49DKOG1.QV62B@781-,$!'.APO  !""!  

  #  $15<ACGC:;7=A93-/.-)+&#"%''&$%$$)*+( 
 !$!./2DRV[T:<MXLD<B770061& "'-9KK !" $$## !%'##"" #$$&&%   
 ! "
#16<;881*)2=;41+)*,()&#&'&)%$'&#  ! 12,DQbbQGQQMGD?<$7.21+ &+:OH !  ! "$%" !!"#&'&#     !!
"/7:0-.+'(+>?8/*+())$$%%")'(')# 
 !

,23DVSF64DJI@@@-(P:'!
#$,>LG !   ""#!""!!$!   
!!   %165+(+(%#'<=:1,,.,+%&&'%'&&#&!  
 a^KE>+7?HG@</#"@:#%,8K?   ! "" !"# 
  ! 
$/39,,(('$%6=8-*,,'&)&&)&$$    
 #$ $^J5% .8?D=2*'" 
(,-9L5   " !!! "!"$%"
    "#279-,+)$''1=5+))*)(%# #      #
 "/#6?M9.%&'  &,25<N: ! ! #""$"   
!%368/+'%%'%.<71.*&%    
%#'HC1;33+)&' 
(,18=S6## !! # ! ##%%& 
 
! " " "$08;/(&$%&&%50'  
  "3[G&4&,10)%#  #-/27CW3# " $ !$!"!& 
 
#*0*)8:E;<A   %/46+"%&#" %#"    !+%  !/LP%,5%&$ 
!.39<JY1 ! !! !! #"$#
  !#%6;<BD:5EUHBDA>C6+ ""175(##&$!##!  -/' !".HC%'!-48:JW,   $! "!!"!
 #+@D/3401:-4>?BH@998C.!"-78(#"! "!!   
+.* !$*);G 
 '04;AM[)

!! !  "!!   .4:69??@9;=-AJF@>HLF6? ! ".:;,"#"#"!%#"! 

/4+#,T?  
 (4<=AKW'  ! " !"#    -4:9=>>IM9@-6FOB/9GN@C #$"-46+)'%#%'#$$#!"
 36+3-(=+ ,8;=EFK  !! !""#   "089E;.9FJ?-.<DO1+.7<3)  "$#".37-('''#%&$()# 
 
 52, E& 2>1
  ';A?HIA !(+. #"" $ 
 &*17<FE)&-82(#%-:B,$!8>8
 #'$!078,(*+--*'%
 
&3-&
1+ 2@/ 
 %9>HMP4 !% $" 

003))15:0#%01-+$),.1(%7?
$6) /632+.(% 

  

!/+&
C 
#A !2=DQJ    ! ! " 
$0/'26-'6;0'(-)+7(*592$)2!  
/8'$074"


  
 .,&
">  
0>IUA
  ! "
"!)&$&"06(40(379==0/1*(*1/&,& 
 /7' /68 
 
 
+,# #   0;MY*   !!$ $,23""#""#&"&&/4237:8AG@6:86<>=;;3  
 !8-(/75    
  **#    2=MS     !" 
,+ ! *68+'/3)'3,)2AJF:AA;9:@9?=>A0
 %:8(%-318      
 %,%
!
 18MB! !%""%##.5&06+.1,3/.6914EG@@D>>;<;/ 
  6D>@3(,6
 
 ,.*
 
 48M/  ! "!>78-&" #"+7/+)%)&$ +1,&&&"
 "7:'.5! !    '-&6>K!
  #   #-*'&# "  
$6377%#! # "  

(+(
<DK   $"$+<61+4-$"#)"""$),+.**    

&2)694'"#"#$#   
 &*$7HE #$

 $1:9*5,%&    
%6.422(##! "      ;L@   !"   &*2)0)#*8-   
.30251'#!" " "    

  ";O6
    &+-#$,'"    
/7##.122&&" !!!   
 &5K*
    ! &,#)+"%%#   
.L7',-.11)! !! 

 -9G    
"(46&(2#&!  2_Z;0.214.# ""  
 1AH 


 !  

)3)$&!    2fm`B021,0&"! !"   
 =BH  !!" 
 
"(!   
 ?fntiB4,-,!! 
 
!AHM   #"
 & !   
 'HhhkojU:2-  "!! 

  HOA
 *+/  ! (" 
  
 "&D_dijwwhR6"!     KY;/,0/"
 5)"!

 
  /CKS^`nmopmV4%  
   JV-")/24-  

(9+"$
 

!-&2?FJZccgmtkbG,  

  
"IV!
 "$(''!

   !.*  
 #0  2APYZ[_jlup^7
 

 
"KR  ,25;<BCH7      ! 
  !/ 
(:DPXdsy~xtqeB  
 #IQ 
 
/597BEKOT9   

"%) 3EOT_ejtyx<79>|f?  *RM
 
 ,6:BEJQ]\K


  
 %+$
"'"#-=GPW^`ihjln]@   *NF
     (2>DIQRY]\1  *'!""    #, %*&(#%.7@EEINRQ]X8    +L@    ,3?EGKLWZ_D$ 
  


#1
! #$&##$368<?;=?1  .O1


$(*-8DMOVTYTA 

  
&3  !""" ')-,  3K%6."$-8AFLMQUR?# #
&$$! 

&2 !" "    8R$,6N
 (.:DHJLQPVK6.4   


 .2
  

   4S B*48EIINRRSVA(  
     //
&%    <S
(
%17>@<8:=@EC"      0& "'+(%# 


 
>W' 
!$'!,(,78*
 

 5
#$&&($!




CU6  !   
 8
 &%  
    
DU 
  
 
 
 
6 #" 
   
ASn3  
  

5
 !  !
 !
AR     


/    !
BR  
     ' 
 #"$(*' &&%#(""! ?P 

 

 $ 
 $1-,,2/'#! "!! "%! ES ' 

  
 #-  
"  #&"&((%! !!$! ! " # %"!'+& JR .,! 

 

 #.  , !"!#$  $#%!!!$$'&&%$ # $(%''''%&('$ FP$&*&    
&,!  ' ! ##$# ##&%$"!##&(&$!")'&+$ 
FU '(%()&! 
):*$ #'*('.( +  &"$(&!!!" !$%$%(+'$$$ 
HZ)
 !"&(&  !027*
,B>C=6/11+.215624.#(!!$%""#$#$%%$#!(' # 
Ob5
  "'&#%+3>A44>E=8>FJ,  1EGLNIPMIB==::HHONVLIEDJ0%#"  ! !""'#''%%("#!
 EU6 
   #-78CQDCJ?0/?R9266   ;ULCCBIZcGJOJLUDLJM[ahTQZdba^V`e\N:"!$#""$" "! !"" ##&

>T=   "/8=@=80==18>D@?94
  
 >]`ZPS[ed\YZPKHU]PSkhH^re``eqjgw~|suE'$&#""  "$'#"&#$!$'$#&&%# 

>SK
  7D?81/.3<439?KB/0     <ZYK@YcTgd`aVVQP\XY]lS]i_^\SPU_ahinqxv\."!((! "''($$($%')+(&('(($ 

@TK




 352,,),9FC:?=9:<4    ?PTQP]f_Y\[_MCEO\DO`Z_RLgbc`a\XXTc`nbamp<#"!! "!(('$%'&#($&(($'%'&&(#     9RJ
 ""  331566/8LNFSKFDJB
  %QTQEMY`\KX`XUWRMMLRYX]MUUTc`dfa_IOJTZ\cee;! $# $"&"#$((''$%())(*'()&'%&""#"!! 
  8@
   #$($)*)*) 74&%3CK=LN>EKEDEO   AMS]OJQLNIJ_aVJCYWDQSXZEHYTFHIE?3/!&##"$'!"%)&(*$%%%$$&'&),),)))+(&-)+($ ##"""
 


*
# " " !"#""#$%()*$#)((%&
 $(-(&06:,123AMP   ;Q65IS[X\IESXYYLBVAE?DA5120*
%!#$$##&%')&$#)$%%$'*)*&&%&#&#$!#'$$"!$  )$#$ "I>! " !"$!!'+*,)+%)(+*,*%($#' ',+!'-5@9-,0.?A    BDR43@AJL78;@<:5)( #'$'#%##*&&%#$$"'''%%'&'&*+)+$&"" $"!%$&((
0J11215
)JX,%+*&%$%$#!!!$!" $%%),+.-,$$('%&'())$%),, 
 %*("$-0) ,0%&)!#  D8C>/+$"  (%$('($!#" ""&)(%(-(+($*)'!"! !#$!"!%# 3^7/.18$  (KY8244648-/.,-10,('""!"!&%$&&(#&%$%%! %*(&'*')&'  '*%()1+,0-&";>9
     *"&&#" '$!!#&%#!" "###"$&%
 &]M-)-/(!#"%A[9240.04220,-677965-411*,,*)-)+$%*&"#$(0/,*-,*('(
  #16%"'3=#(3.-  

'"""!#$ !"%"  "! "$%"""
"M\1+('* #')+)("&<U>012/00-2110215<8;887:4342796571.1./244230*#)104    9;3*(%*/$(&- 
 
 ! ! !#! "  !$#" !$#  4]J'$',""(+,'*""%:SB2+/7532566976:<77<0;5821342.../22346<=8:4-+*..1
  11/)%       !!!!!!!$ " "###$&"" )Nm1+,/"%'*,&&$#1ID(*1260433/76463><797100/0/+,+..46234676><<73-/,


 ) 
    

 "#!"  "$$"!#!$%%!""% & '%&  9k8#( #),)'(!%0JA(,3140/243782535/+3633792-+"%((+%(17413657:42/+
         
 !"! #$"" #$ "%# ! " +[V(#%(,**)#"/FG1107110/3467811-,.367656//)!!&'464983351588781  

 



   "&' %$$!   !"#!! !" ! #B_4*, "+*(&%"!-BB2051201015.275899:89;87655,**/1533*',$!$)-01-*  
       !""! !$ # "%%"#" "!" ! !!"#$$% 8[:.(#()(&!*DF642301354625647957;;=8=8798;6676361175202116627      

 " "!" #"$#!!!$ %!#"#" !! $!#$(# "#!  +NC/("$'*)$"*@?3361622347987385824655014713835:439732125732643   
 )+$#""&%'""!!" $&#!#%$#)%$&)' !""!"## >B/, "''%#"(@=4122/14978::6755;8878855517645//*.4234787574;60        )#"#!!$&&%$" ""#!%#%$"!$'# "#!%%&&#""$""')&',
2E-)!"$$'%")?5/-)/21546267447>77;98;657/6542-/*()(($-054141//       
  %"#!!!#$'&%&# &$#$&&%$!"#$"&&('%&*$(&%$"" $%#%%0( +C/,""&'$#+=800635/3//*656626713630,.3302312/*)**%#+-00///27
     !%&%%%!$#% 

( %%%%()&! &$&%#%$# #("  #!#&''#"')+)'&#%"'($$"&*
 #=1,"""()"!.910256701264,*421183300/.-417677:645/67;9787994?=   
  #%#%#"$('(,(#%"% 

-+,+-(%$$(-*$+$$$%! %&#$%%%&&%'''%(*'%(%%'%"#$#%%()" 
:(%!#%*($35247<=539713.'($#),041352<779<=9=79:=;99@;<==87;=


  "%&$&(''%%%)'&$$#"#!! 
 /-/.--)))#()&($&(**'%)*(&!#+('))(-&$")*&*+'%"#$#'# ;0,#$'++$!5998279.)6;*,.12.)61/.1/159516;=96975=7;:>?<7923/*   ,(+)'*((&"!!"
  
.)*+,,//0**-&)-%(#(%&*))%!%))&(+1../),.)+**-($"($ >44%!&)+$ #:547331+*),-12-)+&&'",-(*(*1/34743321.1.1.+)"!#%&#  ! '%%#"#!  
  /-(('))(#%#'-,*.-,-*,(&*.(#**)-,)*,(-+)''-)#$+.-.**# 
A.% #$)(#'<533+,30020(.*()%$+/),,.,/4866132.--.$ !!!"$
 " # !  -0-,'',(+-(','(+0.,10.//(,)0).),+,*31,,(+0-*/05-)(!"*! ?2%""$'&)701($'+/1+%%)-+.,0/610,131692551+&#! "! """"
  " )--3-+..--/2.))/*0,%./,.-'/.**,,--.2200.1,.-1861-.246*
C8-'"')% 3400-**0)+/10029654/450.,243.,*)"#$    # 
,002,./2103/0+).),-.6/*-*,*.0+((()-(///.2.310151/-40.- :H<-#&,'30,.6354*,/57978::60351699<951)&& ! 

 
  -/.*+./1/**-.03431/01.2-,,.0*,-2/-/.2223366./5/00.326/+ 3I>0#)(% 599:57510844486346:5403:754342'%"!   
  
  0+)***)-0.-/21-,21-+/0...15356672213212*).,*'./1521/006 *FC0#%&!7998653105788=54764422269937/2*&$"" """! 
  

  --10011-2/..1/-+-"&-/.*-/54/3204/0264536259625*,1237958*
CQ2#&("!621/41.12/2+233688<969950/0578>720-.*##         452-*$)%&))!%+(*//411253/1.0231222131/36/8624/546@@4 
9N6(*(&(67411:>87892525)-65+&'*2-/)*)179;963/**'"!

  *333/,'!''%!" $*-3..2-727457/3034131*52(-1.3:924545850  /K2'(&#/><=;8;B?>=9<79;436=:21/35.&,056<<7:?724,(*% !
    "##%)$  +--02,%$*,122).3639:561(*).3413323,)'.411/05<=66897:8)!!  M6(*($5?<8>==9;8::=7201-/42/--2628=>:><:9434.,*/,,1:545/7:  
"
"$#$$$#%!#%$"#! %,33),(,+%(+//535:9744/202))' '-+/&-06335.78=<9:656442/2"!  K4&*& 996./'.-*/9>@=9624:4--39<<7:;@=;550*$-2'0<<?DC>EDCA

     &&$!!#" !!"  *&%0100),/-.),8467637895463-*$%)*2/2/373-54246-22374;467&#!
@=&*("&0(&!'!(&46:@EBA>:6:@=;:7343;?::::537978576::66=?8  #%#$!  %.)'*-3.+-321299436674357873420/2557;=9953'+119<=:99598;,"  19*()#**$#&'*+"!$',&4>><8>C@EB<:>>958<CC;>C@DFJEEC::;66/44:
  
#03//**,0472769<:757:7:=978843.1.,*11867135**/26:=96;??<@7%#!
!++)#3>?@:<861*)+-09;C?DA?@8<9<@<<;==BD87=?>?;:FC<:=61=;??
 
   '8:5365257539:50312422364127/1-0,/02316::8888:<93:<:@@@9;D("  #,,% 3989BD@>>879::?:>@BB<:;@>;;7;>@<78?C?<59;7=:3./147AF; 

   ':A9776758>8>1*,/2142*$*//0,+31-,,%!*+0947A>9:<?:A;>>6558<'&!(,/& &:?@=<:788:CBGDDHAB?@IAD?55;7888F@8>;837.*37608GEAEDAB     
 
(9<9:<:7:<;:657/,,0--,--(''/,/-+%$011206<@EC;85<<@;>8<8@@A5#"#+01%+93/2,,149:@EFC<>?>=FMGFE<@:56BC;?514;;?8BBC=AGJ?2.4;<  

 
 
 (31205522)*.,02/#'0%132),253.168765:7::A>>61$&286:8;=?=@=95#%# "'*1." 3:28A>A;>:<=<<5@DGF?<DQTNFFLJEFHDC=<@EF;=DGHEDHHF?=9:=
      ,76369966.4310359<877531..5.54<9<DABA9E?;5-'.1/;49=@<613/*3'))+.)06,#@GIFMICEEEG;9A?IMJONKDHCBBFHGNQQSCBCGGIHGLRSMNIBHDIEIE   
      )58534504350349<66761*,,+1109?A??<?:;?<5,/52,/+:@8:@:<;7?99,+)"&'/5/!=ILHCLKKOEFD>F@AB>DMOAA<53)0:?FDLRNMNGIIDF@=@DDJI@EGDD    ! 
   
 ,3,*0120412:86572933/,/0/:98:A<6:<A??82+,$*.127:A>C=;=9<:E<+*% %03*" BPNKDCACGCH:=FBDCICHIHGLDD>=>CCCDJGOJJKHHHEBEDCEF=9768
  

 


14$#*/1/0-/8989931/0/7458412=9;<<:<=;975673367=<<8A>=<=?@:5+*! +01' .LKIAHMJHA?B7:?:<=<@>HNJHDEJK@BHIJ@67<C@<IIINIDAGIE@@<9
 


 

 05210),( -39<9:??9=:84100'18=;>><8>099;=C@?=>ACC;8?5267<570) -53% 2JOMKELEDH?=96224:AJCGGLD@A=B@>C:95).844>GF<JMGFE>????B 

 

  
  *.(/86.33358539;0578765:9;3,:95-7<>6;8=?=@E:D8=<>>?A<5EEFGH63* $334)!+=I>CMHPKEC=AB;>?65>?7=:<B=@98/.492525>3589009?6;<>:?B<<  
 
 
  ++(#)16//4./,,1702.214238>=>:===36:857<=>@@;55:A?=ABA?A<DMC30,-362%5H GHEDC@=:=??;:==8/.4<6/454//20(((-40304?C=<>::67947: 
 "%+221+-1.)-5,).)$%$11-,,35666;757797,+369;<=D@B?@;=<?HLKKG:94-!0<:,!&4 1@CICB;988?E?CBGB>27=9@836<A:3996-/;:97247>==<<9997  
")2241276/21&,0//*,49?>8<;::<757:C;94*$")**>EDJC6@IFOIFCG;62'"59<(" GMNEDJGGDA?A/;@:;>GMDB@DGGBBHHF>@>825.('/7<96?=696
  $ 
"(&(,1133=>43328658=:26039:<99<:>=996=A<?@A<CGDIIGFJMKHEFI=<7- -5<7* <PLGAGJOJDG@D;6'-7B==47BC@=;?<:98:78>?:3:CA<:?;31+
 
 '
 
!,/,2-**35::46933;101600*/-'+1,6536866@HL@E@>DBABFIGIPNQLRTL<70) /695+!" ! *LHE@>GNI?=@=7791-5><A>5688<?:720?HELOQNLFJ@;9-')& 
 #A 
 !%+$!&%"%#0:<;74576@;5:1/1.'*.49B>?>87A>C@B94<9#*69<<EGNOMKC=0/#
)69;4,(-01(GKH8CDDKDE?@C:21/3;44<=7<?;?FGGC:?CDGGM=63255/%,-
!O3
"!#)'$)('$%&% #$(-02557:2734=:<AA<<:>@C<516:@@8:=>IMN?/=1884;ECB@97.)$6B7<3-024* :C?A;IELID<1<;889===;?BGPPLGFAFI77FFB?<?77962(+**,
1k& #%'+*%''$$$''%)'').+4:99>879;;::<AFC:62)4<8===>88<779@@79DB>=8AC?AA:0'%&-=F=@=40-049,&*89=<;:<::CEEH:ADHFLJFDDCA@FC@@@54:?9678>35684

e[#!&%)%#"&%'-,/355878=8<@AC?FBAGJLKH=@<583,099<657:DCCJHEAFA865=?E<52))
=?HB=:720& 4/-/+5<8;?:<AIIG;9<>:0-=7;::627<3:>;89A<9:@?@BBC?@-h/  $&# ")*,)"-221798463<;>A@CJFD8<GJGBABCEFBBBGB=JJB8=DB=FINMIGNMBHB?))8?:8.# +AA@>>8=<9931//448665=JPMKODA>;?113/.2/537::=9<?@>BJLED<FFBGG4i'$--3-1.45-0-"*,.%+14;?DFBBB>CCDEHCD=E<3+227@:?F@@?CCGD>=<EKKJNLC@?>=1 )12 8??A><=99& 6:30>8?=@BGEIRUNSQRPGA9451)*,.2;:>JKJICGCDGHFACGJJLLlR $$&',/31067//02338@@8>E@?@=;DJFBBED<DHFKIFNJFBA8>9>97<FKIRQKJMJBD;=HDC3)%&"%>:
(;:?@<8430  AEA@AFENJLHJPNJFB>>7;2762.5;9:CE7;CJJDDCFDAD?>>>?GLH  /A<>6 !#!#+326448=B;IIB@@KD>>>E?DBCGD:>?@GDGBJNQHLG@CBGGKA:><@782736970( <=6==7>>/-5IOOQE@LOFCF@BB;9856<?7:5<068@@AGCJHHIOLMHCLEFFECMLFD
&
 OX AtI,#"'')+-8*13446::;@AC@D=C<4@:<?97:66<>A@E?E<AEHFDMLQKJQICB8CB>=>E@;CA3/=>/@?7:A=C0>7 0:ACLC56:962-/<:8:A?E@@A86476867GHFFJLNOSIBDNLJD@DGC5(&

 

 t_"$#$%$!$*17264/4336ABGDEB?=<:?FB>7?::9;881;==FJLDNEBDJBA=AEFD=?@<>CBHPILIICKMGLQ: 7?=:9:.  <D=2334752=@8&*38?FJGIPHHJLLLGA;:?8>>;@IFFFF>==EOKF?A8.( 
   e=  
3'*,4-40+.968:8;82/9<6?=:>A=<C;8>@C=2899061.1,19@ICDFDHIEI?DED><:@DACLB:/=FD@6(+%  
%4,,"51&$/75<B@;==KNIIJEG@CFIJKKC==???FFJJ>B><9BEALJB<2*## 

   ?9
  +L4;6=8:@>B@>EB>A=A=DHDCDBFBB@@==910*2194234**&?FD=DGLMLMBE;4+ %%)000/1/-)"&$"
 
%" '1.05669;CLFJOLKMM;:3B75DHI=C@?AH?9=5=C<>><@D:)&#"!$ #'4# /0520432:6=>@@A>>?D@DFKC@@BEGDF?C;-09?3:80.9<8>@><=5955./.''*'.567599??=6//60,&-)),:6,%' 
 !"#*! $*153?DHGHOJJE?7/;=?E9><DBB@G<C=;<68=;>9=*$"##""!! !!
2 
! &(,%"-6>>D8:;><?CI>DCFFKBA@DICB@>;><=90600')*,*#-.)..1178>:BI=8AAB?>B=99<8.5:FKFB3&$ 

 '330+1('.6;9?@EC@=A<C@E>BMC8B=??CAB/=?;3-;=84'#$%(%&%" ##"   !
 "$$*-3>BDG@=A===>?>?;;9<B<346////20-/3103/2446;::DC8:@@A=9977753A@<<8<8:71+1132( 
$'$&-/32.13+5??<42+71%),5=?BIKIIKFFJFGEFE?954:=>/(%)#(%&&&'

1334
SIM/images/test011.pgm Normal file

File diff suppressed because one or more lines are too long

835
SIM/images/test012.pgm Normal file

File diff suppressed because one or more lines are too long

4
SIM/images/test013.pgm Normal file

File diff suppressed because one or more lines are too long

4
SIM/images/test014.pgm Normal file

File diff suppressed because one or more lines are too long

20
SIM/images/test015.pgm Normal file

File diff suppressed because one or more lines are too long

4
SIM/images/test016.pgm Normal file

File diff suppressed because one or more lines are too long

BIN
SIM/images/test017.pgm Normal file

Binary file not shown.

BIN
SIM/images/test018.pgm Normal file

Binary file not shown.

BIN
SIM/images/test019.pgm Normal file

Binary file not shown.

4
SIM/images/test020.pgm Normal file

File diff suppressed because one or more lines are too long

4
SIM/images/test021.pgm Normal file

File diff suppressed because one or more lines are too long

4
SIM/images/test022.pgm Normal file

File diff suppressed because one or more lines are too long

View File

@ -10,19 +10,17 @@
`timescale 1ps/1ps
`define NEAR 1 // NEAR can be 0~7
`define NEAR 1 // NEAR can be 0~7
`define FILE_NO_FIRST 1 // first input file name is test000.pgm
`define FILE_NO_FINAL 8 // final input file name is test000.pgm
`define FILE_NO_FIRST 1 // first input file number
`define FILE_NO_FINAL 22 // final input file number
// bubble numbers that insert between pixels
// when = 0, do not insert bubble
// when > 0, insert BUBBLE_CONTROL bubbles
// when < 0, insert random 0~(-BUBBLE_CONTROL) bubbles
`define BUBBLE_CONTROL -2
`define BUBBLE_CONTROL (-1)
// the input and output file names' format
@ -32,18 +30,18 @@
`define INPUT_PGM_DIR "./images"
// output file (compressed .jls file) directory
`define OUTPUT_JLS_DIR "./"
`define OUTPUT_JLS_DIR "."
module tb_jls_encoder ();
initial $dumpvars(1, tb_jls_encoder);
//initial $dumpvars(1, tb_jls_encoder);
// -------------------------------------------------------------------------------------------------------------------
// generate clock and reset
// -------------------------------------------------------------------------------------------------------------------
reg rstn = 1'b0;
reg clk = 1'b0;
reg rstn = 1'b0;
reg clk = 1'b0;
always #50000 clk = ~clk; // 10MHz
initial begin repeat(4) @(posedge clk); rstn<=1'b1; end
@ -57,12 +55,12 @@ reg [13:0] i_h = 0;
reg i_e = 0;
reg [ 7:0] i_x = 0;
wire o_e;
wire[15:0] o_data;
wire o_last;
wire[15:0] o_data;
reg [7:0] img [4096*4096-1:0];
reg [7:0] img [8192*8192-1:0];
integer w = 0, h = 0;
task load_img;
@ -148,8 +146,8 @@ begin
i_x <= img[i];
end
// 16 cycles idle between images
repeat(16) @(posedge clk) {i_sof, i_w, i_h, i_e, i_x} <= 0;
// 32 cycles idle between images
repeat(32) @(posedge clk) {i_sof, i_w, i_h, i_e, i_x} <= 0;
end
endtask
@ -159,7 +157,7 @@ endtask
// -------------------------------------------------------------------------------------------------------------------
jls_encoder #(
.NEAR ( `NEAR )
) jls_encoder_i (
) u_jls_encoder (
.rstn ( rstn ),
.clk ( clk ),
.i_sof ( i_sof ),
@ -168,8 +166,8 @@ jls_encoder #(
.i_e ( i_e ),
.i_x ( i_x ),
.o_e ( o_e ),
.o_data ( o_data ),
.o_last ( o_last )
.o_last ( o_last ),
.o_data ( o_data )
);
@ -192,7 +190,7 @@ initial begin
load_img(input_file_name);
$display("%100s (%5dx%5d)", input_file_name, w, h);
if( w < 5 || w > 16384 || h < 1 || h > 16383 ) // image size not supported
if( w < 5 || w > 16384 || h < 1 || h > 16384 ) // image size not supported
$display(" *** image size not supported ***");
else
feed_img(`BUBBLE_CONTROL);
@ -207,9 +205,9 @@ end
// -------------------------------------------------------------------------------------------------------------------
// write output stream to .jls files
// -------------------------------------------------------------------------------------------------------------------
logic [256*8:1] output_file_format;
reg [256*8:1] output_file_format;
initial $sformat(output_file_format, "%s\\%s.jls", `OUTPUT_JLS_DIR, `FILE_NAME_FORMAT);
logic [256*8:1] output_file_name;
reg [256*8:1] output_file_name;
integer opened = 0;
integer jls_file = 0;
@ -224,7 +222,7 @@ always @ (posedge clk)
// write data to file.
if(opened != 0 && jls_file != 0)
$fwrite(jls_file, "%c%c", o_data[15:8], o_data[7:0]);
$fwrite(jls_file, "%c%c", o_data[7:0], o_data[15:8]);
// if it is the last data of an output stream, close the file.
if(o_last) begin