#include <metal_stdlib>

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

void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  tint_array_wrapper data = {};
  int x_41_phi = 0;
  int x_53_phi = 0;
  x_41_phi = 0;
  while (true) {
    int x_42 = 0;
    int const x_41 = x_41_phi;
    if ((x_41 < 10)) {
    } else {
      break;
    }
    {
      float const x_49 = x_9.injectionSwitch.y;
      data.arr[x_41] = (float((10 - x_41)) * x_49);
      x_42 = (x_41 + 1);
      x_41_phi = x_42;
    }
  }
  x_53_phi = 0;
  while (true) {
    int x_54 = 0;
    int x_60_phi = 0;
    int const x_53 = x_53_phi;
    if ((x_53 < 9)) {
    } else {
      break;
    }
    x_60_phi = 0;
    while (true) {
      bool x_83 = false;
      bool x_84 = false;
      int x_61 = 0;
      bool x_85_phi = false;
      int const x_60 = x_60_phi;
      if ((x_60 < 10)) {
      } else {
        break;
      }
      if ((x_60 < (x_53 + 1))) {
        {
          x_61 = (x_60 + 1);
          x_60_phi = x_61;
        }
        continue;
      }
      int const x_70_save = x_53;
      float const x_71 = data.arr[x_70_save];
      int const x_72_save = x_60;
      float const x_73 = data.arr[x_72_save];
      float const x_75 = (*(tint_symbol_5)).y;
      float const x_77 = x_6.resolution.y;
      if ((x_75 < (x_77 * 0.5f))) {
        x_83 = (x_71 > x_73);
        x_85_phi = x_83;
      } else {
        x_84 = (x_71 < x_73);
        x_85_phi = x_84;
      }
      bool const x_85 = x_85_phi;
      if (x_85) {
        float const x_88 = data.arr[x_70_save];
        float const x_89 = data.arr[x_72_save];
        data.arr[x_70_save] = x_89;
        data.arr[x_72_save] = x_88;
      }
      {
        x_61 = (x_60 + 1);
        x_60_phi = x_61;
      }
    }
    {
      x_54 = (x_53 + 1);
      x_53_phi = x_54;
    }
  }
  float const x_91 = (*(tint_symbol_5)).x;
  float const x_93 = x_6.resolution.x;
  if ((x_91 < (x_93 * 0.5f))) {
    float const x_100 = data.arr[0];
    float const x_103 = data.arr[5];
    float const x_106 = data.arr[9];
    *(tint_symbol_6) = float4((x_100 * 0.100000001f), (x_103 * 0.100000001f), (x_106 * 0.100000001f), 1.0f);
  } else {
    float const x_110 = data.arr[5];
    float const x_113 = data.arr[9];
    float const x_116 = data.arr[0];
    *(tint_symbol_6) = float4((x_110 * 0.100000001f), (x_113 * 0.100000001f), (x_116 * 0.100000001f), 1.0f);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

