Merge branch 'texture-scale-test' into 'main'

gsk: Add a test for scaled textures

See merge request GNOME/gtk!5686
This commit is contained in:
Matthias Clasen 2023-03-23 02:42:28 +00:00
commit 57ec758d81
9 changed files with 705 additions and 68 deletions

View File

@ -1412,9 +1412,41 @@ gsk_gl_command_queue_create_framebuffer (GskGLCommandQueue *self)
return fbo_id;
}
static GdkMemoryFormat
memory_format_gl_format (GdkMemoryFormat data_format,
gboolean use_es,
guint *gl_internalformat,
guint *gl_format,
guint *gl_type)
{
if (!gdk_memory_format_gl_format (data_format,
use_es,
gl_internalformat,
gl_format,
gl_type))
{
if (gdk_memory_format_prefers_high_depth (data_format))
data_format = GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED;
else
data_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
if (!gdk_memory_format_gl_format (data_format,
use_es,
gl_internalformat,
gl_format,
gl_type))
{
g_assert_not_reached ();
}
}
return data_format;
}
static void
gsk_gl_command_queue_do_upload_texture (GskGLCommandQueue *self,
GdkTexture *texture)
gsk_gl_command_queue_do_upload_texture_chunk (GskGLCommandQueue *self,
GdkTexture *texture,
int x,
int y)
{
GdkGLContext *context;
const guchar *data;
@ -1435,25 +1467,11 @@ gsk_gl_command_queue_do_upload_texture (GskGLCommandQueue *self,
width = gdk_texture_get_width (texture);
height = gdk_texture_get_height (texture);
if (!gdk_memory_format_gl_format (data_format,
use_es,
&gl_internalformat,
&gl_format,
&gl_type))
{
if (gdk_memory_format_prefers_high_depth (data_format))
data_format = GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED;
else
data_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
if (!gdk_memory_format_gl_format (data_format,
use_es,
&gl_internalformat,
&gl_format,
&gl_type))
{
g_assert_not_reached ();
}
}
data_format = memory_format_gl_format (data_format,
use_es,
&gl_internalformat,
&gl_format,
&gl_type);
gdk_texture_downloader_init (&downloader, texture);
gdk_texture_downloader_set_format (&downloader, data_format);
@ -1469,43 +1487,53 @@ gsk_gl_command_queue_do_upload_texture (GskGLCommandQueue *self,
*/
if (stride == width * bpp)
{
glTexImage2D (GL_TEXTURE_2D, 0, gl_internalformat, width, height, 0, gl_format, gl_type, data);
glTexSubImage2D (GL_TEXTURE_2D, 0, x, y, width, height, gl_format, gl_type, data);
}
else if (stride % bpp == 0 &&
(gdk_gl_context_check_version (context, 0, 0, 3, 0) || gdk_gl_context_has_unpack_subimage (context)))
{
glPixelStorei (GL_UNPACK_ROW_LENGTH, stride / bpp);
glTexImage2D (GL_TEXTURE_2D, 0, gl_internalformat, width, height, 0, gl_format, gl_type, data);
glTexSubImage2D (GL_TEXTURE_2D, 0, x, y, width, height, gl_format, gl_type, data);
glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
}
else
{
int i;
glTexImage2D (GL_TEXTURE_2D, 0, gl_internalformat, width, height, 0, gl_format, gl_type, NULL);
for (i = 0; i < height; i++)
glTexSubImage2D (GL_TEXTURE_2D, 0, 0, i, width, 1, gl_format, gl_type, data + (i * stride));
for (int i = 0; i < height; i++)
glTexSubImage2D (GL_TEXTURE_2D, 0, x, y + i, width, 1, gl_format, gl_type, data + (i * stride));
}
glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
g_bytes_unref (bytes);
}
int
gsk_gl_command_queue_upload_texture (GskGLCommandQueue *self,
GdkTexture *texture)
gsk_gl_command_queue_upload_texture_chunks (GskGLCommandQueue *self,
unsigned int n_chunks,
GskGLTextureChunk *chunks)
{
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME;
cairo_surface_t *surface = NULL;
int width, height;
GdkMemoryFormat data_format;
GLenum gl_internalformat;
GLenum gl_format;
GLenum gl_type;
gboolean use_es;
int texture_id;
g_assert (GSK_IS_GL_COMMAND_QUEUE (self));
g_assert (!GDK_IS_GL_TEXTURE (texture));
width = gdk_texture_get_width (texture);
height = gdk_texture_get_height (texture);
width = height = 0;
for (unsigned int i = 0; i < n_chunks; i++)
{
GskGLTextureChunk *c = &chunks[i];
width = MAX (width, c->x + gdk_texture_get_width (c->texture));
height = MAX (height, c->y + gdk_texture_get_height (c->texture));
}
if (width > self->max_texture_size || height > self->max_texture_size)
{
g_warning ("Attempt to create texture of size %ux%u but max size is %d. "
@ -1514,6 +1542,7 @@ gsk_gl_command_queue_upload_texture (GskGLCommandQueue *self,
width = MIN (width, self->max_texture_size);
height = MIN (height, self->max_texture_size);
}
texture_id = gsk_gl_command_queue_create_texture (self, width, height, GL_RGBA8);
if (texture_id == -1)
return texture_id;
@ -1524,15 +1553,28 @@ gsk_gl_command_queue_upload_texture (GskGLCommandQueue *self,
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D, texture_id);
gsk_gl_command_queue_do_upload_texture (self, texture);
/* Initialize the texture */
use_es = gdk_gl_context_get_use_es (gdk_gl_context_get_current ());
data_format = gdk_texture_get_format (chunks[0].texture);
memory_format_gl_format (data_format,
use_es,
&gl_internalformat,
&gl_format,
&gl_type);
glTexImage2D (GL_TEXTURE_2D, 0, gl_internalformat, width, height, 0, gl_format, gl_type, NULL);
for (unsigned int i = 0; i < n_chunks; i++)
{
GskGLTextureChunk *c = &chunks[i];
gsk_gl_command_queue_do_upload_texture_chunk (self, c->texture, c->x, c->y);
}
/* Restore previous texture state if any */
if (self->attachments->textures[0].id > 0)
glBindTexture (self->attachments->textures[0].target,
self->attachments->textures[0].id);
g_clear_pointer (&surface, cairo_surface_destroy);
if (gdk_profiler_is_running ())
gdk_profiler_add_markf (start_time, GDK_PROFILER_CURRENT_TIME-start_time,
"Upload Texture",
@ -1541,6 +1583,13 @@ gsk_gl_command_queue_upload_texture (GskGLCommandQueue *self,
return texture_id;
}
int
gsk_gl_command_queue_upload_texture (GskGLCommandQueue *self,
GdkTexture *texture)
{
return gsk_gl_command_queue_upload_texture_chunks (self, 1, &(GskGLTextureChunk){ texture, 0, 0});
}
void
gsk_gl_command_queue_set_profiler (GskGLCommandQueue *self,
GskProfiler *profiler)

View File

@ -298,6 +298,18 @@ int gsk_gl_command_queue_create_texture (GskGLCommandQueue
int width,
int height,
int format);
typedef struct {
GdkTexture *texture;
int x;
int y;
} GskGLTextureChunk;
int gsk_gl_command_queue_upload_texture_chunks(GskGLCommandQueue *self,
unsigned int n_chunks,
GskGLTextureChunk *chunks);
guint gsk_gl_command_queue_create_framebuffer (GskGLCommandQueue *self);
gboolean gsk_gl_command_queue_create_render_target (GskGLCommandQueue *self,
int width,

View File

@ -43,6 +43,8 @@
#include <gdk/gdkprofilerprivate.h>
#include <gdk/gdktextureprivate.h>
#include <gdk/gdkmemoryformatprivate.h>
G_DEFINE_TYPE (GskGLDriver, gsk_gl_driver, G_TYPE_OBJECT)
static guint
@ -732,7 +734,7 @@ gsk_gl_driver_load_texture (GskGLDriver *self,
t = gdk_texture_get_render_data (texture, self);
if (t && t->texture_id)
{
if (ensure_mipmap & !t->has_mipmap)
if (ensure_mipmap && !t->has_mipmap)
{
glBindTexture (GL_TEXTURE_2D, t->texture_id);
glGenerateMipmap (GL_TEXTURE_2D);
@ -1181,12 +1183,10 @@ void
gsk_gl_driver_add_texture_slices (GskGLDriver *self,
GdkTexture *texture,
gboolean ensure_mipmap,
guint min_cols,
guint min_rows,
GskGLTextureSlice **out_slices,
guint *out_n_slices)
{
int max_texture_size;
int max_slice_size;
GskGLTextureSlice *slices;
GskGLTexture *t;
guint n_slices;
@ -1196,19 +1196,23 @@ gsk_gl_driver_add_texture_slices (GskGLDriver *self,
int tex_height;
int x = 0, y = 0;
GdkMemoryTexture *memtex;
int extra_pixels;
GdkMemoryTexture *memtex1 = NULL;
GdkMemoryTexture *memtex2 = NULL;
GdkMemoryTexture *memtex3 = NULL;
GdkMemoryTexture *memtex4 = NULL;
g_assert (GSK_IS_GL_DRIVER (self));
g_assert (GDK_IS_TEXTURE (texture));
g_assert (out_slices != NULL);
g_assert (out_n_slices != NULL);
/* XXX: Too much? */
max_texture_size = self->command_queue->max_texture_size / 4;
max_slice_size = self->command_queue->max_texture_size / 2;
tex_width = texture->width;
tex_height = texture->height;
cols = MAX ((texture->width / max_texture_size) + 1, min_cols);
rows = MAX ((texture->height / max_texture_size) + 1, min_rows);
cols = (texture->width / max_slice_size) + 1;
rows = (texture->height / max_slice_size) + 1;
n_slices = cols * rows;
@ -1231,26 +1235,253 @@ gsk_gl_driver_add_texture_slices (GskGLDriver *self,
memtex = gdk_memory_texture_from_texture (texture,
gdk_texture_get_format (texture));
if (ensure_mipmap)
{
guchar *data1, *data2, *data3, *data4;
guchar *top_row, *bot_row, *left_row, *right_row;
GdkTexture *tmp;
int w;
GBytes *bytes;
/* We need some extra pixels around our tiles, in order for
* GL to properly determine the right level of detail to use.
* This number should probably depend on the scale, but for
* now we just hardcode it.
*
* We create some auxiliary textures to hold the extra pixels:
*
* +---------------------+
* | memtex1 |
* *---+-------------+---+
* | | | |
* memtex2| memtex |memtex3
* | | | |
* *---+-------------+---+
* | memtex4 | |
* +---------------------+
*/
extra_pixels = 15;
top_row = g_malloc (4 * tex_width);
tmp = gdk_memory_texture_new_subtexture (memtex, 0, 0, tex_width, 1);
gdk_texture_download (tmp, top_row, 4 * tex_width);
g_object_unref (tmp);
bot_row = g_malloc (4 * tex_width);
tmp = gdk_memory_texture_new_subtexture (memtex, 0, tex_height - 1, tex_width, 1);
gdk_texture_download (tmp, bot_row, 4 * tex_width);
g_object_unref (tmp);
left_row = g_malloc (4 * tex_height);
tmp = gdk_memory_texture_new_subtexture (memtex, 0, 0, 1, tex_height);
gdk_texture_download (tmp, left_row, 4);
g_object_unref (tmp);
right_row = g_malloc (4 * tex_height);
tmp = gdk_memory_texture_new_subtexture (memtex, tex_width - 1, 0, 1, tex_height);
gdk_texture_download (tmp, right_row, 4);
g_object_unref (tmp);
w = tex_width + 2 * extra_pixels;
data1 = g_malloc (4 * w * extra_pixels);
data2 = g_malloc (4 * extra_pixels * tex_height);
data3 = g_malloc (4 * extra_pixels * tex_height);
data4 = g_malloc (4 * w * extra_pixels);
for (int i = 0; i < w; i++)
{
int ii = CLAMP (i, extra_pixels, (tex_width - 1) + extra_pixels) - extra_pixels;
for (int j = 0; j < extra_pixels; j++)
{
data1[(j * w + i) * 4] = top_row[ii * 4];
data1[(j * w + i) * 4 + 1] = top_row[ii * 4 + 1];
data1[(j * w + i) * 4 + 2] = top_row[ii * 4 + 2];
data1[(j * w + i) * 4 + 3] = top_row[ii * 4 + 3];
data4[(j * w + i) * 4] = bot_row[ii * 4];
data4[(j * w + i) * 4 + 1] = bot_row[ii * 4 + 1];
data4[(j * w + i) * 4 + 2] = bot_row[ii * 4 + 2];
data4[(j * w + i) * 4 + 3] = bot_row[ii * 4 + 3];
}
}
for (int i = 0; i < extra_pixels; i++)
{
for (int j = 0; j < tex_height; j++)
{
data2[(j * extra_pixels + i) * 4] = left_row[j * 4];
data2[(j * extra_pixels + i) * 4 + 1] = left_row[j * 4 + 1];
data2[(j * extra_pixels + i) * 4 + 2] = left_row[j * 4 + 2];
data2[(j * extra_pixels + i) * 4 + 3] = left_row[j * 4 + 3];
data3[(j * extra_pixels + i) * 4] = right_row[j * 4];
data3[(j * extra_pixels + i) * 4 + 1] = right_row[j * 4 + 1];
data3[(j * extra_pixels + i) * 4 + 2] = right_row[j * 4 + 2];
data3[(j * extra_pixels + i) * 4 + 3] = right_row[j * 4 + 3];
}
}
g_free (top_row);
g_free (bot_row);
g_free (left_row);
g_free (right_row);
bytes = g_bytes_new_take (data1, 4 * w * extra_pixels);
memtex1 = GDK_MEMORY_TEXTURE (gdk_memory_texture_new (w, extra_pixels, GDK_MEMORY_DEFAULT, bytes, 4 * w));
g_bytes_unref (bytes);
bytes = g_bytes_new_take (data2, 4 * extra_pixels * tex_height);
memtex2 = GDK_MEMORY_TEXTURE (gdk_memory_texture_new (extra_pixels, tex_height, GDK_MEMORY_DEFAULT, bytes, 4 * extra_pixels));
g_bytes_unref (bytes);
bytes = g_bytes_new_take (data3, 4 * extra_pixels * tex_height);
memtex3 = GDK_MEMORY_TEXTURE (gdk_memory_texture_new (extra_pixels, tex_height, GDK_MEMORY_DEFAULT, bytes, 4 * extra_pixels));
g_bytes_unref (bytes);
bytes = g_bytes_new_take (data4, 4 * w * extra_pixels);
memtex4 = GDK_MEMORY_TEXTURE (gdk_memory_texture_new (w, extra_pixels, GDK_MEMORY_DEFAULT, bytes, 4 * w));
g_bytes_unref (bytes);
}
else
extra_pixels = 0;
x = 0;
for (guint col = 0; col < cols; col++)
{
int slice_width = col + 1 < cols ? tex_width / cols : tex_width - x;
y = 0;
for (guint row = 0; row < rows; row++)
{
int slice_height = row + 1 < rows ? tex_height / rows : tex_height - y;
int slice_index = (col * rows) + row;
GdkTexture *subtex;
guint texture_id;
subtex = gdk_memory_texture_new_subtexture (memtex,
x, y,
slice_width, slice_height);
texture_id = gsk_gl_command_queue_upload_texture (self->command_queue, subtex);
g_object_unref (subtex);
if (ensure_mipmap)
{
GskGLTextureChunk chunks[5];
unsigned int n_chunks = 0;
if (row == 0)
{
chunks[n_chunks].texture = gdk_memory_texture_new_subtexture (memtex1,
x, 0,
slice_width + 2 * extra_pixels, extra_pixels);
chunks[n_chunks].x = 0;
chunks[n_chunks].y = 0;
n_chunks++;
}
if (row == rows - 1)
{
chunks[n_chunks].texture = gdk_memory_texture_new_subtexture (memtex4,
x, 0,
slice_width + 2 * extra_pixels, extra_pixels);
chunks[n_chunks].x = 0;
chunks[n_chunks].y = slice_height + extra_pixels;
n_chunks++;
}
if (col == 0)
{
int yy = y - extra_pixels;
int hh = slice_height + 2 * extra_pixels;
int y0 = 0;
if (row == 0)
{
yy = 0;
y0 = extra_pixels;
hh -= extra_pixels;
}
if (row == rows - 1)
{
hh -= extra_pixels;
}
chunks[n_chunks].texture = gdk_memory_texture_new_subtexture (memtex2,
0, yy, extra_pixels, hh);
chunks[n_chunks].x = 0;
chunks[n_chunks].y = y0;
n_chunks++;
}
if (col == cols - 1)
{
int yy = y - extra_pixels;
int hh = slice_height + 2 * extra_pixels;
int y0 = 0;
if (row == 0)
{
yy = 0;
y0 = extra_pixels;
hh -= extra_pixels;
}
if (row == rows - 1)
{
hh -= extra_pixels;
}
chunks[n_chunks].texture = gdk_memory_texture_new_subtexture (memtex3,
0, yy, extra_pixels, hh);
chunks[n_chunks].x = slice_width + extra_pixels;
chunks[n_chunks].y = y0;
n_chunks++;
}
{
int xx = x - extra_pixels;
int yy = y - extra_pixels;
int ww = slice_width + 2 * extra_pixels;
int hh = slice_height + 2 * extra_pixels;
int x0 = 0;
int y0 = 0;
if (col == 0)
{
xx = 0;
ww -= extra_pixels;
x0 = extra_pixels;
}
if (col == cols - 1)
{
ww -= extra_pixels;
}
if (row == 0)
{
yy = 0;
hh -= extra_pixels;
y0 = extra_pixels;
}
if (row == rows - 1)
{
hh -= extra_pixels;
}
chunks[n_chunks].texture = gdk_memory_texture_new_subtexture (memtex, xx, yy, ww, hh);
chunks[n_chunks].x = x0;
chunks[n_chunks].y = y0;
n_chunks++;
}
texture_id = gsk_gl_command_queue_upload_texture_chunks (self->command_queue, n_chunks, chunks);
glBindTexture (GL_TEXTURE_2D, texture_id);
glGenerateMipmap (GL_TEXTURE_2D);
for (unsigned int i = 0; i < n_chunks; i++)
g_object_unref (chunks[i].texture);
}
else
{
GdkTexture *subtex;
subtex = gdk_memory_texture_new_subtexture (memtex, x, y, slice_width, slice_height);
texture_id = gsk_gl_command_queue_upload_texture (self->command_queue, subtex);
g_object_unref (subtex);
}
slices[slice_index].rect.x = x;
@ -1258,15 +1489,22 @@ gsk_gl_driver_add_texture_slices (GskGLDriver *self,
slices[slice_index].rect.width = slice_width;
slices[slice_index].rect.height = slice_height;
slices[slice_index].texture_id = texture_id;
slices[slice_index].area.x = extra_pixels / (float) (slice_width + 2 * extra_pixels);
slices[slice_index].area.y = extra_pixels / (float) (slice_height + 2 * extra_pixels);
slices[slice_index].area.x2 = (extra_pixels + slice_width) / (float) (slice_width + 2 * extra_pixels);
slices[slice_index].area.y2 = (extra_pixels + slice_height) / (float) (slice_height + 2 * extra_pixels);
y += slice_height;
}
y = 0;
x += slice_width;
}
g_object_unref (memtex);
g_clear_object (&memtex1);
g_clear_object (&memtex2);
g_clear_object (&memtex3);
g_clear_object (&memtex4);
/* Allocate one Texture for the entire thing. */
t = gsk_gl_texture_new (0,

View File

@ -170,8 +170,6 @@ GskGLTexture * gsk_gl_driver_mark_texture_permanent (GskGLDriver *s
void gsk_gl_driver_add_texture_slices (GskGLDriver *self,
GdkTexture *texture,
gboolean ensure_mipmap,
guint min_cols,
guint min_rows,
GskGLTextureSlice **out_slices,
guint *out_n_slices);
GskGLProgram * gsk_gl_driver_lookup_shader (GskGLDriver *self,
@ -224,8 +222,6 @@ static inline void
gsk_gl_driver_slice_texture (GskGLDriver *self,
GdkTexture *texture,
gboolean ensure_mipmap,
guint min_cols,
guint min_rows,
GskGLTextureSlice **out_slices,
guint *out_n_slices)
{
@ -234,15 +230,14 @@ gsk_gl_driver_slice_texture (GskGLDriver *self,
t = gdk_texture_get_render_data (texture, self);
if (t && t->slices &&
(t->has_mipmap || !ensure_mipmap) &&
min_cols == 0 && min_rows == 0)
(t->has_mipmap || !ensure_mipmap))
{
*out_slices = t->slices;
*out_n_slices = t->n_slices;
return;
}
gsk_gl_driver_add_texture_slices (self, texture, ensure_mipmap, min_cols, min_rows, out_slices, out_n_slices);
gsk_gl_driver_add_texture_slices (self, texture, ensure_mipmap, out_slices, out_n_slices);
}
G_END_DECLS

View File

@ -3538,9 +3538,12 @@ gsk_gl_render_job_visit_texture (GskGLRenderJob *job,
const graphene_rect_t *bounds)
{
int max_texture_size = job->command_queue->max_texture_size;
float scale_x = bounds->size.width / texture->width;
float scale_y = bounds->size.height / texture->height;
gboolean use_mipmaps;
use_mipmaps = job->scale_x < 0.5 || job->scale_y < 0.5;
use_mipmaps = (scale_x * job->scale_x) < 0.5 ||
(scale_y * job->scale_y) < 0.5;
if G_LIKELY (texture->width <= max_texture_size &&
texture->height <= max_texture_size)
@ -3567,21 +3570,17 @@ gsk_gl_render_job_visit_texture (GskGLRenderJob *job,
{
float min_x = job->offset_x + bounds->origin.x;
float min_y = job->offset_y + bounds->origin.y;
float max_x = min_x + bounds->size.width;
float max_y = min_y + bounds->size.height;
float scale_x = (max_x - min_x) / texture->width;
float scale_y = (max_y - min_y) / texture->height;
GskGLTextureSlice *slices = NULL;
guint n_slices = 0;
gsk_gl_driver_slice_texture (job->driver, texture, use_mipmaps, 0, 0, &slices, &n_slices);
gsk_gl_driver_slice_texture (job->driver, texture, use_mipmaps, &slices, &n_slices);
g_assert (slices != NULL);
g_assert (n_slices > 0);
gsk_gl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, blit));
for (guint i = 0; i < n_slices; i ++)
for (unsigned int i = 0; i < n_slices; i++)
{
const GskGLTextureSlice *slice = &slices[i];
float x1, x2, y1, y2;
@ -3603,7 +3602,8 @@ gsk_gl_render_job_visit_texture (GskGLRenderJob *job,
gsk_gl_render_job_draw_coords (job,
x1, y1, x2, y2,
0, 0, 1, 1,
slice->area.x, slice->area.y,
slice->area.x2, slice->area.y2,
(guint16[]) { FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO });
}
@ -3720,7 +3720,7 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob *job,
GskGLTextureSlice *slices = NULL;
guint n_slices = 0;
gsk_gl_driver_slice_texture (job->driver, texture, filter == GSK_SCALING_FILTER_TRILINEAR, 0, 0, &slices, &n_slices);
gsk_gl_driver_slice_texture (job->driver, texture, filter == GSK_SCALING_FILTER_TRILINEAR, &slices, &n_slices);
gsk_gl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, blit));
@ -3752,7 +3752,8 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob *job,
slice_bounds.origin.y,
slice_bounds.origin.x + slice_bounds.size.width,
slice_bounds.origin.y + slice_bounds.size.height,
0, 0, 1, 1,
slice->area.x, slice->area.y,
slice->area.x2, slice->area.y2,
(guint16[]){ FP16_ZERO, FP16_ZERO, FP16_ZERO, FP16_ZERO } );
}

View File

@ -28,6 +28,12 @@ G_BEGIN_DECLS
struct _GskGLTextureSlice
{
cairo_rectangle_int_t rect;
struct {
float x;
float y;
float x2;
float y2;
} area;
guint texture_id;
};

View File

@ -0,0 +1,335 @@
/* Clip away problematic corners */
clip {
clip: 3 3 57 57;
child: transform {
transform: scale(0.042);
child: texture {
bounds: 0 0 1500 1500;
texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABdwAAAXcCAIAAAC3V9szAAAgAElEQVR4nOzbwQ0EMQgEweXyz3nu\
MTkYS67+UDEgmO/7vu9L8n3fzDAzMzMzMzMz8wH/PkmSJEmSJJ0vSdczzMzMzMzMzMx8zC5lJEmS\
JEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0ua\
G/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZm\
ZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEk\
SZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1\
DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzM\
zMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmS\
JElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu\
+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZ\
mZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIk\
SZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdcz\
zMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMz\
H7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmS\
JGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnh\
n4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZm\
Zn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIk\
SZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8w\
MzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8\
zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmS\
pIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/\
KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ\
+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIk\
SZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPM\
zMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mx\
u5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmS\
FpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6p\
mJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbm\
F+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIk\
SdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMz\
MzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfs\
UkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJEla\
aDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+Kdi\
ZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlf\
sEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIk\
aaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzM\
zMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NL\
GUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh\
6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZ\
mZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7B\
LmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKk\
jZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMz\
MzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5l\
JEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWm\
o0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZm\
ZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7\
lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2\
StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzM\
zMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SR\
JEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqO\
Lmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZ\
mZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xS\
RpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdoo\
SdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMz\
MzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaS\
JEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6\
pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZm\
ZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZ\
SZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMk\
Xc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzM\
zMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmS\
JEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS\
5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZ\
mZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUk\
SZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0\
PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMz\
M/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmS\
JEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0ua\
G/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZm\
ZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEk\
SZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1\
DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzM\
zMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmS\
JElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu\
+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZ\
mZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIk\
SZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdcz\
zMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMz\
H7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmS\
JGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnh\
n4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZm\
Zn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIk\
SZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8w\
MzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8\
zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmS\
pIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/\
KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ\
+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIk\
SZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPM\
zMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mx\
u5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmS\
FpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6p\
mJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbm\
F+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIk\
SdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMz\
MzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfs\
UkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJEla\
aDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+Kdi\
ZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlf\
sEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIk\
aaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzM\
zMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NL\
GUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh\
6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZ\
mZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7B\
LmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKk\
jZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMz\
MzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5l\
JEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWm\
o0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZm\
ZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7\
lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2\
StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzM\
zMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SR\
JEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqO\
Lmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZ\
mZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xS\
RpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdoo\
SdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMz\
MzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaS\
JEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6\
pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZm\
ZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZ\
SZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMk\
Xc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzM\
zMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmS\
JEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS\
5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZ\
mZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUk\
SZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0\
PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMz\
M/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmS\
JEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0ua\
G/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZm\
ZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEk\
SZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1\
DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzM\
zMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmS\
JElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu\
+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZ\
mZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIk\
SZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdcz\
zMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMz\
H7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmS\
JGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSSlK2m0AACAASURBVJIkaaMkXc8wMzMzMzMzM/Mxu5SR\
JEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqO\
Lmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZ\
mZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xS\
RpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdoo\
SdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMz\
MzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaS\
JEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6\
pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZm\
ZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZ\
SZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMk\
Xc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzM\
zMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmS\
JEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS\
5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZ\
mZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUk\
SZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0\
PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMz\
M/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmS\
JEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0ua\
G/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZm\
ZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEk\
SZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1\
DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzM\
zMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmS\
JElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu\
+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZ\
mZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIk\
SZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnhn4qZmZmZmZmZ+QW7lJEkSZIkSdooSdcz\
zMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZmZn7BLmUkSZIkSZI2StL1DDMzMzMzMzMz\
H7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIkSZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmS\
JGmh6eiS5oZ/KmZmZmZmZmbmF+xSRpIkSZIkaaMkXc8wMzMzMzMzM/Mxu5SRJEmSJElaaDq6pLnh\
n4qZmZmZmZmZ+QW7lJEkSZIkSdooSdczzMzMzMzMzMx8zC5lJEmSJEmSFpqOLmlu+KdiZmZmZmZm\
Zn7BLmUkSZIkSZI2StL1DDMzMzMzMzMzH7NLGUmSJEmSpIWmo0uaG/6pmJmZmZmZmZlfsEsZSZIk\
SZKkjZJ0PcPMzMzMzMzMzMfsUkaSJEmSJGmh6eiS5oZ/KmZmZmZm/rdvBzcAgDAMxMT+Q4dHdqBI\
9X3wDFVgZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5\
gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmS\
pImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMz\
MzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyW\
MpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJA\
p0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mY\
mZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYN\
tpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmS\
JkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzM\
zMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vK\
SJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOd\
Pj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2Jm\
ZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfY\
UkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEma\
KEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMz\
MzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkj\
SZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT6\
9Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZ\
mZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBL\
GUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmi\
JD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzM\
zMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwk\
SZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnT\
I80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZm\
ZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1l\
JEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS\
9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMz\
MzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIk\
SZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+P\
ND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZ\
mZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSR\
JEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS\
8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzM\
zMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIk\
SZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S\
/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZm\
ZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaS\
JEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnP\
M8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMz\
Mz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIk\
SZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejz\
w38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZ\
mZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmS\
JEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3P\
MDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM\
/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIk\
SdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P\
/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZm\
ZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmS\
JEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzD\
zMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPz\
M1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIk\
SQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8\
p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZ\
mTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmS\
JEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwz\
MzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzP\
bCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIk\
DXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCf\
ipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm\
3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmS\
JGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zM\
zMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+z\
pYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI0\
0OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38q\
ZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5\
gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmS\
pImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMz\
MzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyW\
MpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJA\
p0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mY\
mZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYN\
tpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmS\
JkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzM\
zMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vK\
SJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOd\
Pj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2Jm\
ZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfY\
UkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEma\
KEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMz\
MzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkj\
SZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT6\
9Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZ\
mZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBL\
GUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmi\
JD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzM\
zMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwk\
SZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnT\
I80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZm\
ZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1l\
JEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS\
9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMz\
MzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIk\
SZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+P\
ND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZ\
mZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSR\
JEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS\
8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzM\
zMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIk\
SZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S\
/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZm\
ZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaS\
JEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnP\
M8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMz\
Mz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIk\
SZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejz\
w38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZ\
mZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmS\
JEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3P\
MDMzMzMzMzPzM1vKSJIkSZIkDXT6/2TLPAAAB6JJREFU9Ejzw38qZmZmZmZmZuYNtpSRJEmSJEma\
KEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMz\
MzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkj\
SZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT6\
9Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZ\
mZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBL\
GUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmi\
JD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzM\
zMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwk\
SZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnT\
I80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZm\
ZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1l\
JEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS\
9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMz\
MzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIk\
SZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+P\
ND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZ\
mZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSR\
JEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS\
8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzM\
zMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIk\
SZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S\
/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZm\
ZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaS\
JEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnP\
M8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMz\
Mz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIk\
SZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejz\
w38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZ\
mZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIkSdJAp0+PND/8p2JmZmZmZmZm3mBLGUmS\
JEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3P\
MDMzMzMzMzPzM1vKSJIkSZIkDXT69Ejzw38qZmZmZmZmZuYNtpSRJEmSJEmaKEnPM8zMzMzMzMzM\
/MyWMpIkSZIkSQOdPj3S/PCfipmZmZmZmZl5gy1lJEmSJEmSJkrS8wwzMzMzMzMzMz+zpYwkSZIk\
SdJAp0+PND/8p2JmZmZmZmZm3mBLGUmSJEmSpImS9DzDzMzMzMzMzMzPbCkjSZIkSZI00OnTI80P\
/6mYmZmZmZmZmTfYUkaSJEmSJGmiJD3PMDMzMzMzMzPzM1vKSJIkSZIkDXQBAv0dBQosl+kAAAAA\
SUVORK5CYII=\
");
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

View File

@ -13,6 +13,7 @@ compare_render_tests = [
'big-checkerboard',
'big-checkerboard-scaled-down',
'big-checkerboard-scaled-down-nearest',
'big-checkerboard-scaled-down2',
'blend-difference',
'blend-invisible-child',
'blend-normal',