#version 310 es
precision mediump float;

struct VertexOutput {
  vec4 pos;
  int loc0;
};

VertexOutput foo(float x) {
  VertexOutput tint_symbol_2 = VertexOutput(vec4(x, x, x, 1.0f), 42);
  return tint_symbol_2;
}

struct tint_symbol {
  int loc0;
  vec4 pos;
};

VertexOutput vert_main1_inner() {
  return foo(0.5f);
}

struct tint_symbol_1 {
  int loc0;
  vec4 pos;
};

tint_symbol vert_main1() {
  VertexOutput inner_result = vert_main1_inner();
  tint_symbol wrapper_result = tint_symbol(0, vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.pos = inner_result.pos;
  wrapper_result.loc0 = inner_result.loc0;
  return wrapper_result;
}
layout(location = 0) flat out int loc0;


void main() {
  tint_symbol outputs;
  outputs = vert_main1();
  loc0 = outputs.loc0;
  gl_Position = outputs.pos;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}

#version 310 es
precision mediump float;

struct VertexOutput {
  vec4 pos;
  int loc0;
};

VertexOutput foo(float x) {
  VertexOutput tint_symbol_2 = VertexOutput(vec4(x, x, x, 1.0f), 42);
  return tint_symbol_2;
}

struct tint_symbol {
  int loc0;
  vec4 pos;
};

struct tint_symbol_1 {
  int loc0;
  vec4 pos;
};

VertexOutput vert_main2_inner() {
  return foo(0.25f);
}

tint_symbol_1 vert_main2() {
  VertexOutput inner_result_1 = vert_main2_inner();
  tint_symbol_1 wrapper_result_1 = tint_symbol_1(0, vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result_1.pos = inner_result_1.pos;
  wrapper_result_1.loc0 = inner_result_1.loc0;
  return wrapper_result_1;
}
layout(location = 0) flat out int loc0;


void main() {
  tint_symbol_1 outputs;
  outputs = vert_main2();
  loc0 = outputs.loc0;
  gl_Position = outputs.pos;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}

