Add new*Texture variants which don't require image files.

Update the no-game screen to avoid deprecated functions.
This commit is contained in:
Alex Szpakowski
2020-02-12 20:07:35 -04:00
parent ceb854db5b
commit 8478a870a9
3 changed files with 291 additions and 241 deletions
+76 -32
View File
@@ -700,30 +700,6 @@ static void parseDPIScale(Data *d, float *dpiscale)
} }
} }
static Texture::Settings w__optImageSettings(lua_State *L, int idx, bool &setdpiscale)
{
Texture::Settings s;
setdpiscale = false;
if (!lua_isnoneornil(L, idx))
{
luax_checktablefields<Texture::SettingType>(L, idx, "texture setting name", Texture::getConstant);
s.mipmaps = luax_boolflag(L, idx, "mipmaps", false) ? Texture::MIPMAPS_MANUAL : Texture::MIPMAPS_NONE;
s.linear = luax_boolflag(L, idx, Texture::getConstant(Texture::SETTING_LINEAR), s.linear);
lua_getfield(L, idx, Texture::getConstant(Texture::SETTING_DPI_SCALE));
if (lua_isnumber(L, -1))
{
s.dpiScale = (float) lua_tonumber(L, -1);
setdpiscale = true;
}
lua_pop(L, 1);
}
return s;
}
static std::pair<StrongRef<image::ImageData>, StrongRef<image::CompressedImageData>> static std::pair<StrongRef<image::ImageData>, StrongRef<image::CompressedImageData>>
getImageData(lua_State *L, int idx, bool allowcompressed, float *dpiscale) getImageData(lua_State *L, int idx, bool allowcompressed, float *dpiscale)
{ {
@@ -891,9 +867,33 @@ int w_newTexture(lua_State *L)
luax_checkgraphicscreated(L); luax_checkgraphicscreated(L);
Texture::Slices slices(TEXTURE_2D); Texture::Slices slices(TEXTURE_2D);
Texture::Slices *slicesref = &slices;
Texture::Settings settings;
settings.type = TEXTURE_2D;
bool dpiscaleset = false; bool dpiscaleset = false;
Texture::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
if (lua_type(L, 1) == LUA_TNUMBER)
{
slicesref = nullptr;
settings.width = (int) luaL_checkinteger(L, 1);
settings.height = (int) luaL_checkinteger(L, 2);
int startidx = 3;
if (lua_type(L, 3) == LUA_TNUMBER)
{
settings.layers = (int) luaL_checkinteger(L, 3);
settings.type = TEXTURE_2D_ARRAY;
startidx = 4;
}
luax_checktexturesettings(L, startidx, true, true, false, OptionalBool(), settings, dpiscaleset);
}
else
{
luax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);
float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale; float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
if (lua_istable(L, 1)) if (lua_istable(L, 1))
@@ -918,8 +918,9 @@ int w_newTexture(lua_State *L)
else else
slices.add(data.second, 0, 0, false, settings.mipmaps != Texture::MIPMAPS_NONE); slices.add(data.second, 0, 0, false, settings.mipmaps != Texture::MIPMAPS_NONE);
} }
}
return w__pushNewTexture(L, &slices, settings); return w__pushNewTexture(L, slicesref, settings);
} }
int w_newCubeTexture(lua_State *L) int w_newCubeTexture(lua_State *L)
@@ -927,9 +928,21 @@ int w_newCubeTexture(lua_State *L)
luax_checkgraphicscreated(L); luax_checkgraphicscreated(L);
Texture::Slices slices(TEXTURE_CUBE); Texture::Slices slices(TEXTURE_CUBE);
Texture::Slices *slicesref = &slices;
Texture::Settings settings;
settings.type = TEXTURE_CUBE;
bool dpiscaleset = false; bool dpiscaleset = false;
Texture::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
if (lua_type(L, 1) == LUA_TNUMBER)
{
slicesref = nullptr;
settings.width = settings.height = (int) luaL_checkinteger(L, 1);
luax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);
}
else
{
luax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);
float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale; float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
auto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE); auto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE);
@@ -1012,8 +1025,9 @@ int w_newCubeTexture(lua_State *L)
lua_pop(L, tlen); lua_pop(L, tlen);
} }
}
return w__pushNewTexture(L, &slices, settings); return w__pushNewTexture(L, slicesref, settings);
} }
int w_newArrayTexture(lua_State *L) int w_newArrayTexture(lua_State *L)
@@ -1021,9 +1035,23 @@ int w_newArrayTexture(lua_State *L)
luax_checkgraphicscreated(L); luax_checkgraphicscreated(L);
Texture::Slices slices(TEXTURE_2D_ARRAY); Texture::Slices slices(TEXTURE_2D_ARRAY);
Texture::Slices *slicesref = &slices;
Texture::Settings settings;
settings.type = TEXTURE_2D_ARRAY;
bool dpiscaleset = false; bool dpiscaleset = false;
Texture::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
if (lua_type(L, 1) == LUA_TNUMBER)
{
slicesref = nullptr;
settings.width = (int) luaL_checkinteger(L, 1);
settings.height = (int) luaL_checkinteger(L, 2);
settings.layers = (int) luaL_checkinteger(L, 3);
luax_checktexturesettings(L, 4, true, false, false, OptionalBool(), settings, dpiscaleset);
}
else
{
luax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);
float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale; float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
if (lua_istable(L, 1)) if (lua_istable(L, 1))
@@ -1076,8 +1104,9 @@ int w_newArrayTexture(lua_State *L)
else else
slices.add(data.second, 0, 0, true, settings.mipmaps != Texture::MIPMAPS_NONE); slices.add(data.second, 0, 0, true, settings.mipmaps != Texture::MIPMAPS_NONE);
} }
}
return w__pushNewTexture(L, &slices, settings); return w__pushNewTexture(L, slicesref, settings);
} }
int w_newVolumeTexture(lua_State *L) int w_newVolumeTexture(lua_State *L)
@@ -1087,9 +1116,23 @@ int w_newVolumeTexture(lua_State *L)
auto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE); auto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE);
Texture::Slices slices(TEXTURE_VOLUME); Texture::Slices slices(TEXTURE_VOLUME);
Texture::Slices *slicesref = &slices;
Texture::Settings settings;
settings.type = TEXTURE_VOLUME;
bool dpiscaleset = false; bool dpiscaleset = false;
Texture::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
if (lua_type(L, 1) == LUA_TNUMBER)
{
slicesref = nullptr;
settings.width = (int) luaL_checkinteger(L, 1);
settings.height = (int) luaL_checkinteger(L, 2);
settings.layers = (int) luaL_checkinteger(L, 3);
luax_checktexturesettings(L, 4, true, false, false, OptionalBool(), settings, dpiscaleset);
}
else
{
luax_checktexturesettings(L, 2, true, false, false, OptionalBool(), settings, dpiscaleset);
float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale; float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
if (lua_istable(L, 1)) if (lua_istable(L, 1))
@@ -1149,8 +1192,9 @@ int w_newVolumeTexture(lua_State *L)
else else
slices.add(data.second, 0, 0, true, settings.mipmaps != Texture::MIPMAPS_NONE); slices.add(data.second, 0, 0, true, settings.mipmaps != Texture::MIPMAPS_NONE);
} }
}
return w__pushNewTexture(L, &slices, settings); return w__pushNewTexture(L, slicesref, settings);
} }
int w_newCanvas(lua_State *L) int w_newCanvas(lua_State *L)
+13 -13
View File
@@ -3186,21 +3186,21 @@ function love.nogame()
R.bg.cloud_3 = R.bg[dpiscale].cloud_3_png R.bg.cloud_3 = R.bg[dpiscale].cloud_3_png
R.bg.cloud_4 = R.bg[dpiscale].cloud_4_png R.bg.cloud_4 = R.bg[dpiscale].cloud_4_png
img_duckloon_normal = love.graphics.newImage(R.duckloon.normal, settings) img_duckloon_normal = love.graphics.newTexture(R.duckloon.normal, settings)
img_duckloon_blink = love.graphics.newImage(R.duckloon.blink, settings) img_duckloon_blink = love.graphics.newTexture(R.duckloon.blink, settings)
img_n = love.graphics.newImage(R.chain.n, settings) img_n = love.graphics.newTexture(R.chain.n, settings)
img_o = love.graphics.newImage(R.chain.o, settings) img_o = love.graphics.newTexture(R.chain.o, settings)
img_g = love.graphics.newImage(R.chain.g, settings) img_g = love.graphics.newTexture(R.chain.g, settings)
img_a = love.graphics.newImage(R.chain.a, settings) img_a = love.graphics.newTexture(R.chain.a, settings)
img_m = love.graphics.newImage(R.chain.m, settings) img_m = love.graphics.newTexture(R.chain.m, settings)
img_e = love.graphics.newImage(R.chain.e, settings) img_e = love.graphics.newTexture(R.chain.e, settings)
img_square = love.graphics.newImage(R.chain.square, settings) img_square = love.graphics.newTexture(R.chain.square, settings)
img_cloud_1 = love.graphics.newImage(R.bg.cloud_1, settings) img_cloud_1 = love.graphics.newTexture(R.bg.cloud_1, settings)
img_cloud_2 = love.graphics.newImage(R.bg.cloud_2, settings) img_cloud_2 = love.graphics.newTexture(R.bg.cloud_2, settings)
img_cloud_3 = love.graphics.newImage(R.bg.cloud_3, settings) img_cloud_3 = love.graphics.newTexture(R.bg.cloud_3, settings)
img_cloud_4 = love.graphics.newImage(R.bg.cloud_4, settings) img_cloud_4 = love.graphics.newTexture(R.bg.cloud_4, settings)
cloud_images = { cloud_images = {
img_cloud_1, img_cloud_1,
+39 -33
View File
@@ -11936,54 +11936,60 @@ const unsigned char nogame_lua[] =
0x0a, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x72, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x72,
0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x64, 0x75, 0x63,
0x6f, 0x6f, 0x6e, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74,
0x67, 0x73, 0x29, 0x0a, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x69, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x69,
0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73,
0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x64, 0x75, 0x63, 0x6b,
0x6f, 0x6e, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x6c, 0x6f, 0x6f, 0x6e, 0x2e, 0x62, 0x6c, 0x69, 0x6e, 0x6b, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e,
0x29, 0x0a, 0x67, 0x73, 0x29, 0x0a,
0x0a, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61,
0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52,
0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61,
0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52,
0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61,
0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52,
0x68, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x67, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x61, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x61, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61,
0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52,
0x68, 0x61, 0x69, 0x6e, 0x2e, 0x61, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x61, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61,
0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52,
0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6d, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6d, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61,
0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52,
0x68, 0x61, 0x69, 0x6e, 0x2e, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76,
0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78, 0x74,
0x65, 0x28, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65,
0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,
0x0a, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6c, 0x6f,
0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78,
0x67, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x2c, 0x20, 0x73, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x2c,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x20, 0x3d, 0x20, 0x6c, 0x6f,
0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78,
0x67, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x2c, 0x20, 0x73, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x32, 0x2c,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x20, 0x3d, 0x20, 0x6c, 0x6f,
0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78,
0x67, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x2c, 0x20, 0x73, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x33, 0x2c,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,
0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x20, 0x3d, 0x20, 0x6c, 0x6f,
0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x54, 0x65, 0x78,
0x67, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x2c, 0x20, 0x73, 0x74, 0x75, 0x72, 0x65, 0x28, 0x52, 0x2e, 0x62, 0x67, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x34, 0x2c,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x0a,
0x0a, 0x0a,
0x09, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x09, 0x09, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a,
0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x6d, 0x67, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x31, 0x2c, 0x0a,