#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;
}

