#version 310 es
precision mediump float;

struct Uniforms {
  mat4 modelViewProjectionMatrix;
};

layout(binding = 0) uniform Uniforms_1 {
  mat4 modelViewProjectionMatrix;
} uniforms;

struct VertexInput {
  vec4 cur_position;
  vec4 color;
};

struct VertexOutput {
  vec4 vtxFragColor;
  vec4 Position;
};

struct tint_symbol_3 {
  vec4 cur_position;
  vec4 color;
};

struct tint_symbol_4 {
  vec4 vtxFragColor;
  vec4 Position;
};

VertexOutput vtx_main_inner(VertexInput tint_symbol) {
  VertexOutput tint_symbol_1 = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  tint_symbol_1.Position = (uniforms.modelViewProjectionMatrix * tint_symbol.cur_position);
  tint_symbol_1.vtxFragColor = tint_symbol.color;
  return tint_symbol_1;
}

struct tint_symbol_6 {
  vec4 fragColor;
};

struct tint_symbol_7 {
  vec4 value;
};

tint_symbol_4 vtx_main(tint_symbol_3 tint_symbol_2) {
  VertexInput tint_symbol_8 = VertexInput(tint_symbol_2.cur_position, tint_symbol_2.color);
  VertexOutput inner_result = vtx_main_inner(tint_symbol_8);
  tint_symbol_4 wrapper_result = tint_symbol_4(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.vtxFragColor = inner_result.vtxFragColor;
  wrapper_result.Position = inner_result.Position;
  return wrapper_result;
}
layout(location = 0) in vec4 cur_position;
layout(location = 1) in vec4 color;
layout(location = 0) out vec4 vtxFragColor;


void main() {
  tint_symbol_3 inputs;
  inputs.cur_position = cur_position;
  inputs.color = color;
  tint_symbol_4 outputs;
  outputs = vtx_main(inputs);
  vtxFragColor = outputs.vtxFragColor;
  gl_Position = outputs.Position;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}

#version 310 es
precision mediump float;

struct Uniforms {
  mat4 modelViewProjectionMatrix;
};

struct VertexInput {
  vec4 cur_position;
  vec4 color;
};

struct VertexOutput {
  vec4 vtxFragColor;
  vec4 Position;
};

struct tint_symbol_3 {
  vec4 cur_position;
  vec4 color;
};

struct tint_symbol_4 {
  vec4 vtxFragColor;
  vec4 Position;
};

struct tint_symbol_6 {
  vec4 fragColor;
};

struct tint_symbol_7 {
  vec4 value;
};

vec4 frag_main_inner(vec4 fragColor) {
  return fragColor;
}

tint_symbol_7 frag_main(tint_symbol_6 tint_symbol_5) {
  vec4 inner_result_1 = frag_main_inner(tint_symbol_5.fragColor);
  tint_symbol_7 wrapper_result_1 = tint_symbol_7(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}
layout(location = 0) in vec4 fragColor;
layout(location = 0) out vec4 value;

void main() {
  tint_symbol_6 inputs;
  inputs.fragColor = fragColor;
  tint_symbol_7 outputs;
  outputs = frag_main(inputs);
  value = outputs.value;
}

