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

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, 10>;
  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);
}
