#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct buf1 {
  /* 0x0000 */ packed_float2 resolution;
};
struct tint_array_wrapper {
  int arr[10];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  int const x_254 = *(from);
  k = x_254;
  int const x_255 = *(from);
  i = x_255;
  int const x_256 = *(mid);
  j = as_type<int>((as_type<uint>(x_256) + as_type<uint>(1)));
  while (true) {
    int const x_262 = i;
    int const x_263 = *(mid);
    int const x_265 = j;
    int const x_266 = *(to);
    if (((x_262 <= x_263) & (x_265 <= x_266))) {
    } else {
      break;
    }
    int const x_270 = i;
    int const x_272 = (*(tint_symbol_5)).arr[x_270];
    int const x_273 = j;
    int const x_275 = (*(tint_symbol_5)).arr[x_273];
    if ((x_272 < x_275)) {
      int const x_280 = k;
      k = as_type<int>((as_type<uint>(x_280) + as_type<uint>(1)));
      int const x_282 = i;
      i = as_type<int>((as_type<uint>(x_282) + as_type<uint>(1)));
      int const x_285 = (*(tint_symbol_5)).arr[x_282];
      (*(tint_symbol_6)).arr[x_280] = x_285;
    } else {
      int const x_287 = k;
      k = as_type<int>((as_type<uint>(x_287) + as_type<uint>(1)));
      int const x_289 = j;
      j = as_type<int>((as_type<uint>(x_289) + as_type<uint>(1)));
      int const x_292 = (*(tint_symbol_5)).arr[x_289];
      (*(tint_symbol_6)).arr[x_287] = x_292;
    }
  }
  while (true) {
    int const x_298 = i;
    int const x_300 = i;
    int const x_301 = *(mid);
    if (((x_298 < 10) & (x_300 <= x_301))) {
    } else {
      break;
    }
    int const x_305 = k;
    k = as_type<int>((as_type<uint>(x_305) + as_type<uint>(1)));
    int const x_307 = i;
    i = as_type<int>((as_type<uint>(x_307) + as_type<uint>(1)));
    int const x_310 = (*(tint_symbol_5)).arr[x_307];
    (*(tint_symbol_6)).arr[x_305] = x_310;
  }
  int const x_312 = *(from);
  i_1 = x_312;
  while (true) {
    int const x_317 = i_1;
    int const x_318 = *(to);
    if ((x_317 <= x_318)) {
    } else {
      break;
    }
    int const x_321 = i_1;
    int const x_322 = i_1;
    int const x_324 = (*(tint_symbol_6)).arr[x_322];
    (*(tint_symbol_5)).arr[x_321] = x_324;
    {
      int const x_326 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_326) + as_type<uint>(1)));
    }
  }
  return;
}

void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
  int low = 0;
  int high = 0;
  int m = 0;
  int i_2 = 0;
  int from_1 = 0;
  int mid_1 = 0;
  int to_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  low = 0;
  high = 9;
  m = 1;
  while (true) {
    int const x_333 = m;
    int const x_334 = high;
    if ((x_333 <= x_334)) {
    } else {
      break;
    }
    int const x_337 = low;
    i_2 = x_337;
    while (true) {
      int const x_342 = i_2;
      int const x_343 = high;
      if ((x_342 < x_343)) {
      } else {
        break;
      }
      int const x_346 = i_2;
      from_1 = x_346;
      int const x_347 = i_2;
      int const x_348 = m;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_347) + as_type<uint>(x_348)))) - as_type<uint>(1)));
      int const x_351 = i_2;
      int const x_352 = m;
      int const x_356 = high;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_351) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_352))))))) - as_type<uint>(1))), x_356);
      int const x_358 = from_1;
      param = x_358;
      int const x_359 = mid_1;
      param_1 = x_359;
      int const x_360 = to_1;
      param_2 = x_360;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
      {
        int const x_362 = m;
        int const x_364 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_364) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_362))))));
      }
    }
    {
      int const x_366 = m;
      m = as_type<int>((as_type<uint>(2) * as_type<uint>(x_366)));
    }
  }
  return;
}

void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float const x_87 = x_28.injectionSwitch.x;
  i_3 = int(x_87);
  while (true) {
    int const x_93 = i_3;
    switch(x_93) {
      case 9: {
        int const x_123 = i_3;
        (*(tint_symbol_9)).arr[x_123] = -5;
        break;
      }
      case 8: {
        int const x_121 = i_3;
        (*(tint_symbol_9)).arr[x_121] = -4;
        break;
      }
      case 7: {
        int const x_119 = i_3;
        (*(tint_symbol_9)).arr[x_119] = -3;
        break;
      }
      case 6: {
        int const x_117 = i_3;
        (*(tint_symbol_9)).arr[x_117] = -2;
        break;
      }
      case 5: {
        int const x_115 = i_3;
        (*(tint_symbol_9)).arr[x_115] = -1;
        break;
      }
      case 4: {
        int const x_113 = i_3;
        (*(tint_symbol_9)).arr[x_113] = 0;
        break;
      }
      case 3: {
        int const x_111 = i_3;
        (*(tint_symbol_9)).arr[x_111] = 1;
        break;
      }
      case 2: {
        int const x_109 = i_3;
        (*(tint_symbol_9)).arr[x_109] = 2;
        break;
      }
      case 1: {
        int const x_107 = i_3;
        (*(tint_symbol_9)).arr[x_107] = 3;
        break;
      }
      case 0: {
        int const x_105 = i_3;
        (*(tint_symbol_9)).arr[x_105] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_125 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_125) + as_type<uint>(1)));
    {
      int const x_127 = i_3;
      if ((x_127 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_133 = j_1;
    if ((x_133 < 10)) {
    } else {
      break;
    }
    int const x_136 = j_1;
    int const x_137 = j_1;
    int const x_139 = (*(tint_symbol_9)).arr[x_137];
    (*(tint_symbol_10)).arr[x_136] = x_139;
    {
      int const x_141 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_141) + as_type<uint>(1)));
    }
  }
  mergeSort_(tint_symbol_9, tint_symbol_10);
  float const x_145 = (*(tint_symbol_11)).y;
  if ((int(x_145) < 30)) {
    int const x_152 = (*(tint_symbol_9)).arr[0];
    grey = (0.5f + (float(x_152) / 10.0f));
  } else {
    float const x_157 = (*(tint_symbol_11)).y;
    if ((int(x_157) < 60)) {
      int const x_164 = (*(tint_symbol_9)).arr[1];
      grey = (0.5f + (float(x_164) / 10.0f));
    } else {
      float const x_169 = (*(tint_symbol_11)).y;
      if ((int(x_169) < 90)) {
        int const x_176 = (*(tint_symbol_9)).arr[2];
        grey = (0.5f + (float(x_176) / 10.0f));
      } else {
        float const x_181 = (*(tint_symbol_11)).y;
        if ((int(x_181) < 120)) {
          int const x_188 = (*(tint_symbol_9)).arr[3];
          grey = (0.5f + (float(x_188) / 10.0f));
        } else {
          float const x_193 = (*(tint_symbol_11)).y;
          if ((int(x_193) < 150)) {
            discard_fragment();
          } else {
            float const x_200 = (*(tint_symbol_11)).y;
            if ((int(x_200) < 180)) {
              int const x_207 = (*(tint_symbol_9)).arr[5];
              grey = (0.5f + (float(x_207) / 10.0f));
            } else {
              float const x_212 = (*(tint_symbol_11)).y;
              if ((int(x_212) < 210)) {
                int const x_219 = (*(tint_symbol_9)).arr[6];
                grey = (0.5f + (float(x_219) / 10.0f));
              } else {
                float const x_224 = (*(tint_symbol_11)).y;
                if ((int(x_224) < 240)) {
                  int const x_231 = (*(tint_symbol_9)).arr[7];
                  grey = (0.5f + (float(x_231) / 10.0f));
                } else {
                  float const x_236 = (*(tint_symbol_11)).y;
                  if ((int(x_236) < 270)) {
                    int const x_243 = (*(tint_symbol_9)).arr[8];
                    grey = (0.5f + (float(x_243) / 10.0f));
                  } else {
                    discard_fragment();
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_247 = grey;
  float3 const x_248 = float3(x_247, x_247, x_247);
  *(tint_symbol_12) = float4(x_248.x, x_248.y, x_248.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
  thread float4 tint_symbol_13 = 0.0f;
  thread tint_array_wrapper tint_symbol_14 = {};
  thread tint_array_wrapper tint_symbol_15 = {};
  thread float4 tint_symbol_16 = 0.0f;
  tint_symbol_13 = gl_FragCoord_param;
  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

