warning: use of deprecated intrinsic
#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 color_out_1;
};
struct tint_symbol_2 {
  float4 color_out_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_4, texture2d<float, access::read> tint_symbol_5, thread float4* const tint_symbol_6) {
  float4 const x_19 = *(tint_symbol_4);
  float4 const x_22 = tint_symbol_5.read(uint2(int2(float2(x_19.x, x_19.y))));
  *(tint_symbol_6) = x_22;
  return;
}

main_out tint_symbol_1_inner(float4 gl_FragCoord_param, thread float4* const tint_symbol_7, texture2d<float, access::read> tint_symbol_8, thread float4* const tint_symbol_9) {
  *(tint_symbol_7) = gl_FragCoord_param;
  main_1(tint_symbol_7, tint_symbol_8, tint_symbol_9);
  main_out const tint_symbol_3 = {.color_out_1=*(tint_symbol_9)};
  return tint_symbol_3;
}

fragment tint_symbol_2 tint_symbol_1(texture2d<float, access::read> tint_symbol_11 [[texture(0)]], float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_10 = 0.0f;
  thread float4 tint_symbol_12 = 0.0f;
  main_out const inner_result = tint_symbol_1_inner(gl_FragCoord_param, &(tint_symbol_10), tint_symbol_11, &(tint_symbol_12));
  tint_symbol_2 wrapper_result = {};
  wrapper_result.color_out_1 = inner_result.color_out_1;
  return wrapper_result;
}

