struct buf0 {
  injectionSwitch : vec2<f32>;
};

[[group(0), binding(0)]] var<uniform> x_6 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn main_1() {
  var i : i32;
  var GLF_dead5cols : i32;
  var GLF_dead5rows : i32;
  var GLF_dead5c : i32;
  var GLF_dead5r : i32;
  var msb10 : i32;
  var donor_replacementGLF_dead5sums : array<f32, 9>;
  i = 0;
  loop {
    let x_45 : i32 = i;
    let x_47 : f32 = x_6.injectionSwitch.x;
    if ((x_45 >= i32(x_47))) {
      break;
    }
    let x_53 : f32 = x_6.injectionSwitch.y;
    if ((0.0 > x_53)) {
      GLF_dead5cols = 2;
      loop {
        let x_61 : i32 = GLF_dead5cols;
        if ((x_61 <= 4)) {
        } else {
          break;
        }
        GLF_dead5rows = 2;
        loop {
          let x_68 : i32 = GLF_dead5rows;
          if ((x_68 <= 4)) {
          } else {
            break;
          }
          GLF_dead5c = 0;
          loop {
            let x_75 : i32 = GLF_dead5c;
            let x_76 : i32 = GLF_dead5cols;
            if ((x_75 < x_76)) {
            } else {
              break;
            }
            GLF_dead5r = 0;
            loop {
              let x_83 : i32 = GLF_dead5r;
              let x_84 : i32 = GLF_dead5rows;
              if ((x_83 < x_84)) {
              } else {
                break;
              }
              let x_87 : i32 = msb10;
              switch(x_87) {
                case 1, 8: {
                  let x_90 : i32 = msb10;
                  let x_92 : i32 = msb10;
                  let x_95 : i32 = msb10;
                  let x_96 : i32 = select(0, x_95, ((x_90 >= 0) && (x_92 < 9)));
                  let x_98 : f32 = donor_replacementGLF_dead5sums[x_96];
                  donor_replacementGLF_dead5sums[x_96] = (x_98 + 1.0);
                }
                default: {
                }
              }

              continuing {
                let x_101 : i32 = GLF_dead5r;
                GLF_dead5r = (x_101 + 1);
              }
            }

            continuing {
              let x_103 : i32 = GLF_dead5c;
              GLF_dead5c = (x_103 + 1);
            }
          }
          let x_105 : i32 = msb10;
          msb10 = (x_105 + 1);

          continuing {
            let x_107 : i32 = GLF_dead5rows;
            GLF_dead5rows = (x_107 + 1);
          }
        }

        continuing {
          let x_109 : i32 = GLF_dead5cols;
          GLF_dead5cols = (x_109 + 1);
        }
      }
    }
    let x_111 : i32 = i;
    i = (x_111 + 1);

    continuing {
      let x_113 : i32 = i;
      if ((x_113 < 200)) {
      } else {
        break;
      }
    }
  }
  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  return;
}

struct main_out {
  [[location(0)]]
  x_GLF_color_1 : vec4<f32>;
};

[[stage(fragment)]]
fn main() -> main_out {
  main_1();
  return main_out(x_GLF_color);
}
