[[block]]
struct buf0 {
  injectionSwitch : vec2<f32>;
};

var<private> data : array<i32, 10>;

var<private> temp : array<i32, 10>;

var<private> gl_FragCoord : vec4<f32>;

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

var<private> x_GLF_color : vec4<f32>;

fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
  var k : i32;
  var i : i32;
  var j : i32;
  var i_1 : i32;
  let x_260 : i32 = *(from);
  k = x_260;
  let x_261 : i32 = *(from);
  i = x_261;
  let x_262 : i32 = *(mid);
  j = (x_262 + 1);
  loop {
    let x_268 : i32 = i;
    let x_269 : i32 = *(mid);
    let x_271 : i32 = j;
    let x_272 : i32 = *(to);
    if (((x_268 <= x_269) && (x_271 <= x_272))) {
    } else {
      break;
    }
    let x_276 : i32 = i;
    let x_278 : i32 = data[x_276];
    let x_279 : i32 = j;
    let x_281 : i32 = data[x_279];
    if ((x_278 < x_281)) {
      let x_286 : i32 = k;
      k = (x_286 + 1);
      let x_288 : i32 = i;
      i = (x_288 + 1);
      let x_291 : i32 = data[x_288];
      temp[x_286] = x_291;
    } else {
      let x_293 : i32 = k;
      k = (x_293 + 1);
      let x_295 : i32 = j;
      j = (x_295 + 1);
      let x_298 : i32 = data[x_295];
      temp[x_293] = x_298;
    }
  }
  loop {
    let x_304 : i32 = i;
    let x_306 : i32 = i;
    let x_307 : i32 = *(mid);
    if (((x_304 < 10) && (x_306 <= x_307))) {
    } else {
      break;
    }
    let x_311 : i32 = k;
    k = (x_311 + 1);
    let x_313 : i32 = i;
    i = (x_313 + 1);
    let x_316 : i32 = data[x_313];
    temp[x_311] = x_316;
  }
  let x_318 : i32 = *(from);
  i_1 = x_318;
  loop {
    let x_323 : i32 = i_1;
    let x_324 : i32 = *(to);
    if ((x_323 <= x_324)) {
    } else {
      break;
    }
    let x_327 : i32 = i_1;
    let x_328 : i32 = i_1;
    let x_330 : i32 = temp[x_328];
    data[x_327] = x_330;

    continuing {
      let x_332 : i32 = i_1;
      i_1 = (x_332 + 1);
    }
  }
  return;
}

fn func_i1_i1_(m : ptr<function, i32>, high : ptr<function, i32>) -> i32 {
  var x : i32;
  var x_335 : i32;
  var x_336 : i32;
  let x_338 : f32 = gl_FragCoord.x;
  if ((x_338 >= 0.0)) {
    if (false) {
      let x_346 : i32 = *(high);
      x_336 = (x_346 << bitcast<u32>(0));
    } else {
      x_336 = 4;
    }
    let x_348 : i32 = x_336;
    x_335 = (1 << bitcast<u32>(x_348));
  } else {
    x_335 = 1;
  }
  let x_350 : i32 = x_335;
  x = x_350;
  let x_351 : i32 = x;
  x = (x_351 >> bitcast<u32>(4));
  let x_353 : i32 = *(m);
  let x_355 : i32 = *(m);
  let x_357 : i32 = *(m);
  let x_359 : i32 = x;
  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x_359));
}

fn mergeSort_() {
  var low : i32;
  var high_1 : i32;
  var m_1 : i32;
  var i_2 : i32;
  var from_1 : i32;
  var mid_1 : i32;
  var to_1 : i32;
  var param : i32;
  var param_1 : i32;
  var param_2 : i32;
  var param_3 : i32;
  var param_4 : i32;
  low = 0;
  high_1 = 9;
  m_1 = 1;
  loop {
    let x_367 : i32 = m_1;
    let x_368 : i32 = high_1;
    if ((x_367 <= x_368)) {
    } else {
      break;
    }
    let x_371 : i32 = low;
    i_2 = x_371;
    loop {
      let x_376 : i32 = i_2;
      let x_377 : i32 = high_1;
      if ((x_376 < x_377)) {
      } else {
        break;
      }
      let x_380 : i32 = i_2;
      from_1 = x_380;
      let x_381 : i32 = i_2;
      let x_382 : i32 = m_1;
      mid_1 = ((x_381 + x_382) - 1);
      let x_385 : i32 = i_2;
      let x_386 : i32 = m_1;
      let x_390 : i32 = high_1;
      to_1 = min(((x_385 + (2 * x_386)) - 1), x_390);
      let x_392 : i32 = from_1;
      param = x_392;
      let x_393 : i32 = mid_1;
      param_1 = x_393;
      let x_394 : i32 = to_1;
      param_2 = x_394;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));

      continuing {
        let x_396 : i32 = m_1;
        param_3 = x_396;
        let x_397 : i32 = high_1;
        param_4 = x_397;
        let x_398 : i32 = func_i1_i1_(&(param_3), &(param_4));
        let x_399 : i32 = i_2;
        i_2 = (x_399 + x_398);
      }
    }

    continuing {
      let x_401 : i32 = m_1;
      m_1 = (2 * x_401);
    }
  }
  return;
}

fn main_1() {
  var i_3 : i32;
  var j_1 : i32;
  var grey : f32;
  let x_93 : f32 = x_34.injectionSwitch.x;
  i_3 = i32(x_93);
  loop {
    let x_99 : i32 = i_3;
    switch(x_99) {
      case 9: {
        let x_129 : i32 = i_3;
        data[x_129] = -5;
      }
      case 8: {
        let x_127 : i32 = i_3;
        data[x_127] = -4;
      }
      case 7: {
        let x_125 : i32 = i_3;
        data[x_125] = -3;
      }
      case 6: {
        let x_123 : i32 = i_3;
        data[x_123] = -2;
      }
      case 5: {
        let x_121 : i32 = i_3;
        data[x_121] = -1;
      }
      case 4: {
        let x_119 : i32 = i_3;
        data[x_119] = 0;
      }
      case 3: {
        let x_117 : i32 = i_3;
        data[x_117] = 1;
      }
      case 2: {
        let x_115 : i32 = i_3;
        data[x_115] = 2;
      }
      case 1: {
        let x_113 : i32 = i_3;
        data[x_113] = 3;
      }
      case 0: {
        let x_111 : i32 = i_3;
        data[x_111] = 4;
      }
      default: {
      }
    }
    let x_131 : i32 = i_3;
    i_3 = (x_131 + 1);

    continuing {
      let x_133 : i32 = i_3;
      if ((x_133 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  loop {
    let x_139 : i32 = j_1;
    if ((x_139 < 10)) {
    } else {
      break;
    }
    let x_142 : i32 = j_1;
    let x_143 : i32 = j_1;
    let x_145 : i32 = data[x_143];
    temp[x_142] = x_145;

    continuing {
      let x_147 : i32 = j_1;
      j_1 = (x_147 + 1);
    }
  }
  mergeSort_();
  let x_151 : f32 = gl_FragCoord.y;
  if ((i32(x_151) < 30)) {
    let x_158 : i32 = data[0];
    grey = (0.5 + (f32(x_158) / 10.0));
  } else {
    let x_163 : f32 = gl_FragCoord.y;
    if ((i32(x_163) < 60)) {
      let x_170 : i32 = data[1];
      grey = (0.5 + (f32(x_170) / 10.0));
    } else {
      let x_175 : f32 = gl_FragCoord.y;
      if ((i32(x_175) < 90)) {
        let x_182 : i32 = data[2];
        grey = (0.5 + (f32(x_182) / 10.0));
      } else {
        let x_187 : f32 = gl_FragCoord.y;
        if ((i32(x_187) < 120)) {
          let x_194 : i32 = data[3];
          grey = (0.5 + (f32(x_194) / 10.0));
        } else {
          let x_199 : f32 = gl_FragCoord.y;
          if ((i32(x_199) < 150)) {
            discard;
          } else {
            let x_206 : f32 = gl_FragCoord.y;
            if ((i32(x_206) < 180)) {
              let x_213 : i32 = data[5];
              grey = (0.5 + (f32(x_213) / 10.0));
            } else {
              let x_218 : f32 = gl_FragCoord.y;
              if ((i32(x_218) < 210)) {
                let x_225 : i32 = data[6];
                grey = (0.5 + (f32(x_225) / 10.0));
              } else {
                let x_230 : f32 = gl_FragCoord.y;
                if ((i32(x_230) < 240)) {
                  let x_237 : i32 = data[7];
                  grey = (0.5 + (f32(x_237) / 10.0));
                } else {
                  let x_242 : f32 = gl_FragCoord.y;
                  if ((i32(x_242) < 270)) {
                    let x_249 : i32 = data[8];
                    grey = (0.5 + (f32(x_249) / 10.0));
                  } else {
                    discard;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  let x_253 : f32 = grey;
  let x_254 : vec3<f32> = vec3<f32>(x_253, x_253, x_253);
  x_GLF_color = vec4<f32>(x_254.x, x_254.y, x_254.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);
}
