#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  float arr[9];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
  int i = 0;
  int GLF_dead5cols = 0;
  int GLF_dead5rows = 0;
  int GLF_dead5c = 0;
  int GLF_dead5r = 0;
  int msb10 = 0;
  tint_array_wrapper donor_replacementGLF_dead5sums = {};
  i = 0;
  while (true) {
    int const x_45 = i;
    float const x_47 = x_6.injectionSwitch.x;
    if ((x_45 >= int(x_47))) {
      break;
    }
    float const x_53 = x_6.injectionSwitch.y;
    if ((0.0f > x_53)) {
      GLF_dead5cols = 2;
      while (true) {
        int const x_61 = GLF_dead5cols;
        if ((x_61 <= 4)) {
        } else {
          break;
        }
        GLF_dead5rows = 2;
        while (true) {
          int const x_68 = GLF_dead5rows;
          if ((x_68 <= 4)) {
          } else {
            break;
          }
          GLF_dead5c = 0;
          while (true) {
            int const x_75 = GLF_dead5c;
            int const x_76 = GLF_dead5cols;
            if ((x_75 < x_76)) {
            } else {
              break;
            }
            GLF_dead5r = 0;
            while (true) {
              int const x_83 = GLF_dead5r;
              int const x_84 = GLF_dead5rows;
              if ((x_83 < x_84)) {
              } else {
                break;
              }
              int const x_87 = msb10;
              switch(x_87) {
                case 1:
                case 8: {
                  int const x_90 = msb10;
                  int const x_92 = msb10;
                  int const x_95 = msb10;
                  int const x_96 = select(0, x_95, ((x_90 >= 0) & (x_92 < 9)));
                  float const x_98 = donor_replacementGLF_dead5sums.arr[x_96];
                  donor_replacementGLF_dead5sums.arr[x_96] = (x_98 + 1.0f);
                  break;
                }
                default: {
                  break;
                }
              }
              {
                int const x_101 = GLF_dead5r;
                GLF_dead5r = as_type<int>((as_type<uint>(x_101) + as_type<uint>(1)));
              }
            }
            {
              int const x_103 = GLF_dead5c;
              GLF_dead5c = as_type<int>((as_type<uint>(x_103) + as_type<uint>(1)));
            }
          }
          int const x_105 = msb10;
          msb10 = as_type<int>((as_type<uint>(x_105) + as_type<uint>(1)));
          {
            int const x_107 = GLF_dead5rows;
            GLF_dead5rows = as_type<int>((as_type<uint>(x_107) + as_type<uint>(1)));
          }
        }
        {
          int const x_109 = GLF_dead5cols;
          GLF_dead5cols = as_type<int>((as_type<uint>(x_109) + as_type<uint>(1)));
        }
      }
    }
    int const x_111 = i;
    i = as_type<int>((as_type<uint>(x_111) + as_type<uint>(1)));
    {
      int const x_113 = i;
      if ((x_113 < 200)) {
      } else {
        break;
      }
    }
  }
  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

