#version 310 es
precision mediump float;

const vec2 pos[3] = vec2[3](vec2(0.0f, 0.5f), vec2(-0.5f, -0.5f), vec2(0.5f, -0.5f));

struct tint_symbol_1 {
  uint VertexIndex;
};
struct tint_symbol_2 {
  vec4 value;
};

vec4 vtx_main_inner(uint VertexIndex) {
  return vec4(pos[VertexIndex], 0.0f, 1.0f);
}

struct tint_symbol_3 {
  vec4 value;
};

tint_symbol_2 vtx_main(tint_symbol_1 tint_symbol) {
  vec4 inner_result = vtx_main_inner(tint_symbol.VertexIndex);
  tint_symbol_2 wrapper_result = tint_symbol_2(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.value = inner_result;
  return wrapper_result;
}
void main() {
  tint_symbol_1 inputs;
  inputs.VertexIndex = uint(gl_VertexID);
  tint_symbol_2 outputs;
  outputs = vtx_main(inputs);
  gl_Position = outputs.value;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}


#version 310 es
precision mediump float;

struct tint_symbol_1 {
  uint VertexIndex;
};
struct tint_symbol_2 {
  vec4 value;
};
struct tint_symbol_3 {
  vec4 value;
};

vec4 frag_main_inner() {
  return vec4(1.0f, 0.0f, 0.0f, 1.0f);
}

tint_symbol_3 frag_main() {
  vec4 inner_result_1 = frag_main_inner();
  tint_symbol_3 wrapper_result_1 = tint_symbol_3(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}
layout(location = 0) out vec4 value;
void main() {
  tint_symbol_3 outputs;
  outputs = frag_main();
  value = outputs.value;
}


