struct buf0 {
  resolution : vec2<f32>;
}

struct buf1 {
  injectionSwitch : vec2<f32>;
}

@group(0) @binding(0) var<uniform> x_10 : buf0;

var<private> gl_FragCoord : vec4<f32>;

@group(0) @binding(1) var<uniform> x_16 : buf1;

var<private> x_GLF_color : vec4<f32>;

fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
  var x_104 : f32;
  var x_104_phi : f32;
  var x_107_phi : i32;
  x_104_phi = -0.5;
  x_107_phi = 1;
  loop {
    var x_126 : f32;
    var x_125 : f32;
    var x_108 : i32;
    var x_105_phi : f32;
    x_104 = x_104_phi;
    let x_107 : i32 = x_107_phi;
    if ((x_107 < 800)) {
    } else {
      break;
    }
    var x_124 : f32;
    var x_125_phi : f32;
    if (((x_107 % 32) == 0)) {
      x_126 = (x_104 + 0.400000006);
      x_105_phi = x_126;
    } else {
      let x_118 : f32 = *(thirty_two);
      x_125_phi = x_104;
      if (((f32(x_107) - (round(x_118) * floor((f32(x_107) / round(x_118))))) <= 0.01)) {
        x_124 = (x_104 + 100.0);
        x_125_phi = x_124;
      }
      x_125 = x_125_phi;
      x_105_phi = x_125;
    }
    var x_105 : f32;
    x_105 = x_105_phi;
    let x_128 : f32 = *(limit);
    if ((f32(x_107) >= x_128)) {
      return x_105;
    }

    continuing {
      x_108 = (x_107 + 1);
      x_104_phi = x_105;
      x_107_phi = x_108;
    }
  }
  return x_104;
}

fn main_1() {
  var c : vec3<f32>;
  var param : f32;
  var param_1 : f32;
  var param_2 : f32;
  var param_3 : f32;
  var x_54 : vec3<f32>;
  var x_74_phi : i32;
  c = vec3<f32>(7.0, 8.0, 9.0);
  let x_56 : f32 = x_10.resolution.x;
  let x_58 : f32 = round((x_56 * 0.125));
  let x_60 : f32 = gl_FragCoord.x;
  param = x_60;
  param_1 = x_58;
  let x_61 : f32 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_61;
  let x_64 : f32 = gl_FragCoord.y;
  param_2 = x_64;
  param_3 = x_58;
  let x_65 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_65;
  let x_67 : f32 = c.x;
  let x_68 : vec3<f32> = c;
  x_54 = x_68;
  let x_70 : f32 = x_54.y;
  c.z = (x_67 + x_70);
  x_74_phi = 0;
  loop {
    var x_75 : i32;
    let x_74 : i32 = x_74_phi;
    if ((x_74 < 3)) {
    } else {
      break;
    }
    let x_81 : f32 = c[x_74];
    if ((x_81 >= 1.0)) {
      let x_86 : f32 = x_16.injectionSwitch.x;
      let x_88 : f32 = x_16.injectionSwitch.y;
      if ((x_86 > x_88)) {
        discard;
      }
      let x_92 : f32 = c[x_74];
      let x_93 : f32 = c[x_74];
      c[x_74] = (x_92 * x_93);
    }

    continuing {
      x_75 = (x_74 + 1);
      x_74_phi = x_75;
    }
  }
  let x_95 : vec3<f32> = c;
  let x_97 : vec3<f32> = normalize(abs(x_95));
  x_GLF_color = vec4<f32>(x_97.x, x_97.y, x_97.z, 1.0);
  return;
}

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

@stage(fragment)
fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  return main_out(x_GLF_color);
}
