#version 310 es
precision mediump float;

struct Interface {
  int i;
  uint u;
  ivec4 vi;
  uvec4 vu;
  vec4 pos;
};
struct tint_symbol {
  int i;
  uint u;
  ivec4 vi;
  uvec4 vu;
  vec4 pos;
};

Interface vert_main_inner() {
  Interface tint_symbol_4 = Interface(0, 0u, ivec4(0, 0, 0, 0), uvec4(0u, 0u, 0u, 0u), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  return tint_symbol_4;
}

struct tint_symbol_2 {
  int i;
  uint u;
  ivec4 vi;
  uvec4 vu;
  vec4 pos;
};
struct tint_symbol_3 {
  int value;
};

tint_symbol vert_main() {
  Interface inner_result = vert_main_inner();
  tint_symbol wrapper_result = tint_symbol(0, 0u, ivec4(0, 0, 0, 0), uvec4(0u, 0u, 0u, 0u), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.i = inner_result.i;
  wrapper_result.u = inner_result.u;
  wrapper_result.vi = inner_result.vi;
  wrapper_result.vu = inner_result.vu;
  wrapper_result.pos = inner_result.pos;
  return wrapper_result;
}
layout(location = 0) flat out int i;
layout(location = 1) flat out uint u;
layout(location = 2) flat out ivec4 vi;
layout(location = 3) flat out uvec4 vu;
void main() {
  tint_symbol outputs;
  outputs = vert_main();
  i = outputs.i;
  u = outputs.u;
  vi = outputs.vi;
  vu = outputs.vu;
  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 Interface {
  int i;
  uint u;
  ivec4 vi;
  uvec4 vu;
  vec4 pos;
};
struct tint_symbol {
  int i;
  uint u;
  ivec4 vi;
  uvec4 vu;
  vec4 pos;
};
struct tint_symbol_2 {
  int i;
  uint u;
  ivec4 vi;
  uvec4 vu;
  vec4 pos;
};
struct tint_symbol_3 {
  int value;
};

int frag_main_inner(Interface inputs) {
  return inputs.i;
}

tint_symbol_3 frag_main(tint_symbol_2 tint_symbol_1) {
  Interface tint_symbol_4 = Interface(tint_symbol_1.i, tint_symbol_1.u, tint_symbol_1.vi, tint_symbol_1.vu, tint_symbol_1.pos);
  int inner_result_1 = frag_main_inner(tint_symbol_4);
  tint_symbol_3 wrapper_result_1 = tint_symbol_3(0);
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}
layout(location = 0) flat in int i;
layout(location = 1) flat in uint u;
layout(location = 2) flat in ivec4 vi;
layout(location = 3) flat in uvec4 vu;
layout(location = 0) out int value;
void main() {
  tint_symbol_2 inputs;
  inputs.i = i;
  inputs.u = u;
  inputs.vi = vi;
  inputs.vu = vu;
  inputs.pos = gl_FragCoord;
  tint_symbol_3 outputs;
  outputs = frag_main(inputs);
  value = outputs.value;
}


