#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[1];
};
struct tmp_struct {
  tint_array_wrapper nmb;
};
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
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_11, thread float4* const tint_symbol_5) {
  tint_array_wrapper x_24 = {};
  bool x_68 = false;
  int x_17 = 0;
  int x_18 = 0;
  int x_19 = 0;
  int x_20 = 0;
  bool x_69 = false;
  float tmp_float = 0.0f;
  float3 color = 0.0f;
  while (true) {
    int x_25 = 0;
    float3 x_101 = 0.0f;
    bool x_79_phi = false;
    int x_26_phi = 0;
    float const x_75 = x_11.injectionSwitch.y;
    tmp_float = x_75;
    float3 const x_76 = float3(x_75, x_75, x_75);
    color = x_76;
    tint_array_wrapper const tint_symbol_2 = {.arr={0}};
    tmp_struct const tint_symbol_3 = {.nmb=tint_symbol_2};
    x_24 = tint_symbol_3.nmb;
    x_68 = false;
    x_79_phi = false;
    while (true) {
      int x_21_phi = 0;
      int x_25_phi = 0;
      bool x_93_phi = false;
      bool const x_79 = x_79_phi;
      x_18 = 1;
      x_21_phi = 1;
      while (true) {
        int const x_21 = x_21_phi;
        x_25_phi = 0;
        x_93_phi = x_79;
        if ((x_21 > 10)) {
        } else {
          break;
        }
        int const x_22 = as_type<int>((as_type<uint>(x_21) - as_type<uint>(1)));
        x_19 = x_22;
        int const x_23 = x_24.arr[x_22];
        if ((x_23 == 1)) {
          x_68 = true;
          x_17 = 1;
          x_25_phi = 1;
          x_93_phi = true;
          break;
        }
        x_18 = x_22;
        {
          x_21_phi = x_22;
        }
      }
      x_25 = x_25_phi;
      bool const x_93 = x_93_phi;
      x_26_phi = x_25;
      if (x_93) {
        break;
      }
      x_68 = true;
      x_17 = -1;
      x_26_phi = -1;
      break;
      {
        x_79_phi = false;
      }
    }
    int const x_26 = x_26_phi;
    x_20 = x_26;
    if ((x_26 == -1)) {
      discard_fragment();
    } else {
      *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
      float2 const x_100 = (float2(x_76.y, x_76.z) + float2(1.0f, 1.0f));
      x_101 = float3(x_76.x, x_100.x, x_100.y);
      color = x_101;
      float const x_103 = x_11.injectionSwitch.x;
      if ((x_103 > 1.0f)) {
        x_69 = true;
        break;
      }
    }
    *(tint_symbol_5) = float4(x_101.x, x_101.y, x_101.z, 1.0f);
    x_69 = true;
    break;
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_11, thread float4* const tint_symbol_6) {
  main_1(x_11, tint_symbol_6);
  main_out const tint_symbol_4 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_4;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_11, &(tint_symbol_7));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

int binarySearch_struct_tmp_struct_i1_1_1_(thread tmp_struct* const obj) {
  bool x_112 = false;
  int x_16 = 0;
  int one = 0;
  int zero = 0;
  int x_27 = 0;
  bool x_114_phi = false;
  int x_28_phi = 0;
  x_114_phi = false;
  while (true) {
    int x_15_phi = 0;
    int x_27_phi = 0;
    bool x_128_phi = false;
    bool const x_114 = x_114_phi;
    one = 1;
    x_15_phi = 1;
    while (true) {
      int const x_15 = x_15_phi;
      x_27_phi = 0;
      x_128_phi = x_114;
      if ((x_15 > 10)) {
      } else {
        break;
      }
      int const x_13 = as_type<int>((as_type<uint>(x_15) - as_type<uint>(1)));
      zero = x_13;
      int const x_14 = (*(obj)).nmb.arr[x_13];
      if ((x_14 == 1)) {
        x_112 = true;
        x_16 = 1;
        x_27_phi = 1;
        x_128_phi = true;
        break;
      }
      one = x_13;
      {
        x_15_phi = x_13;
      }
    }
    x_27 = x_27_phi;
    bool const x_128 = x_128_phi;
    x_28_phi = x_27;
    if (x_128) {
      break;
    }
    x_112 = true;
    x_16 = -1;
    x_28_phi = -1;
    break;
    {
      x_114_phi = false;
    }
  }
  int const x_28 = x_28_phi;
  return x_28;
}

