struct QuicksortObject {
  numbers : array<i32, 10u>,
}

struct buf0 {
  resolution : vec2<f32>,
}

var<private> obj : QuicksortObject;

var<private> x_GLF_color : vec4<f32>;

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

fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
  var temp : i32;
  let x_92 : i32 = *(i);
  let x_94 : i32 = obj.numbers[x_92];
  temp = x_94;
  let x_95 : i32 = *(i);
  let x_96 : i32 = *(j);
  let x_98 : i32 = obj.numbers[x_96];
  obj.numbers[x_95] = x_98;
  let x_100 : i32 = *(j);
  let x_101 : i32 = temp;
  obj.numbers[x_100] = x_101;
  return;
}

fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
  var pivot : i32;
  var i_1 : i32;
  var j_1 : i32;
  var param : i32;
  var param_1 : i32;
  var param_2 : i32;
  var param_3 : i32;
  let x_104 : i32 = *(h);
  let x_106 : i32 = obj.numbers[x_104];
  pivot = x_106;
  let x_107 : i32 = *(l);
  i_1 = (x_107 - 1);
  let x_109 : i32 = *(l);
  j_1 = x_109;
  loop {
    let x_114 : i32 = j_1;
    let x_115 : i32 = *(h);
    if ((x_114 <= (x_115 - 1))) {
    } else {
      break;
    }
    let x_119 : i32 = j_1;
    let x_121 : i32 = obj.numbers[x_119];
    let x_122 : i32 = pivot;
    if ((x_121 <= x_122)) {
      let x_126 : i32 = i_1;
      i_1 = (x_126 + 1);
      let x_128 : i32 = i_1;
      param = x_128;
      let x_129 : i32 = j_1;
      param_1 = x_129;
      swap_i1_i1_(&(param), &(param_1));
    }

    continuing {
      let x_131 : i32 = j_1;
      j_1 = (x_131 + 1);
    }
  }
  let x_133 : i32 = i_1;
  param_2 = (x_133 + 1);
  let x_135 : i32 = *(h);
  param_3 = x_135;
  swap_i1_i1_(&(param_2), &(param_3));
  let x_137 : i32 = i_1;
  return (x_137 + 1);
}

fn quicksort_() {
  var l_1 : i32;
  var h_1 : i32;
  var top : i32;
  var stack : array<i32, 10u>;
  var p : i32;
  var param_4 : i32;
  var param_5 : i32;
  l_1 = 0;
  h_1 = 9;
  top = -1;
  let x_140 : i32 = top;
  let x_141 : i32 = (x_140 + 1);
  top = x_141;
  let x_142 : i32 = l_1;
  stack[x_141] = x_142;
  let x_144 : i32 = top;
  let x_145 : i32 = (x_144 + 1);
  top = x_145;
  let x_146 : i32 = h_1;
  stack[x_145] = x_146;
  loop {
    let x_152 : i32 = top;
    if ((x_152 >= 0)) {
    } else {
      break;
    }
    let x_155 : i32 = top;
    top = (x_155 - 1);
    let x_158 : i32 = stack[x_155];
    h_1 = x_158;
    let x_159 : i32 = top;
    top = (x_159 - 1);
    let x_162 : i32 = stack[x_159];
    l_1 = x_162;
    let x_163 : i32 = l_1;
    param_4 = x_163;
    let x_164 : i32 = h_1;
    param_5 = x_164;
    let x_165 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
    p = x_165;
    let x_166 : i32 = p;
    let x_168 : i32 = l_1;
    if (((x_166 - 1) > x_168)) {
      let x_172 : i32 = top;
      let x_173 : i32 = (x_172 + 1);
      top = x_173;
      let x_174 : i32 = l_1;
      stack[x_173] = x_174;
      let x_176 : i32 = top;
      let x_177 : i32 = (x_176 + 1);
      top = x_177;
      let x_178 : i32 = p;
      stack[x_177] = (x_178 - 1);
    }
    let x_181 : i32 = p;
    let x_183 : i32 = h_1;
    if (((x_181 + 1) < x_183)) {
      let x_187 : i32 = top;
      let x_188 : i32 = (x_187 + 1);
      top = x_188;
      let x_189 : i32 = p;
      stack[x_188] = (x_189 + 1);
      let x_192 : i32 = top;
      let x_193 : i32 = (x_192 + 1);
      top = x_193;
      let x_194 : i32 = h_1;
      stack[x_193] = x_194;
    }
  }
  return;
}

fn main_1() {
  var i_2 : i32;
  i_2 = 0;
  loop {
    let x_64 : i32 = i_2;
    if ((x_64 < 10)) {
    } else {
      break;
    }
    let x_67 : i32 = i_2;
    let x_68 : i32 = i_2;
    obj.numbers[x_67] = (10 - x_68);
    let x_71 : i32 = i_2;
    let x_72 : i32 = i_2;
    let x_74 : i32 = obj.numbers[x_72];
    let x_75 : i32 = i_2;
    let x_77 : i32 = obj.numbers[x_75];
    obj.numbers[x_71] = (x_74 * x_77);

    continuing {
      let x_80 : i32 = i_2;
      i_2 = (x_80 + 1);
    }
  }
  quicksort_();
  let x_84 : i32 = obj.numbers[0];
  let x_86 : i32 = obj.numbers[4];
  if ((x_84 < x_86)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(0.0, 1.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);
}
