struct BST {
  data : i32;
  leftIndex : i32;
  rightIndex : i32;
};

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

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

var<private> obj : QuicksortObject;

var<private> tree : array<BST, 10>;

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

var<private> x_GLF_color : vec4<f32>;

fn makeTreeNode_struct_BST_i1_i1_i11_i1_(node : ptr<function, BST>, data : ptr<function, i32>) {
  let x_208 : i32 = *(data);
  (*(node)).data = x_208;
  (*(node)).leftIndex = -1;
  (*(node)).rightIndex = -1;
  return;
}

fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
  var baseIndex : i32;
  var param : BST;
  var param_1 : i32;
  var param_2 : BST;
  var param_3 : i32;
  baseIndex = 0;
  loop {
    let x_217 : i32 = baseIndex;
    let x_218 : i32 = *(treeIndex);
    if ((x_217 <= x_218)) {
    } else {
      break;
    }
    let x_221 : i32 = *(data_1);
    let x_222 : i32 = baseIndex;
    let x_224 : i32 = tree[x_222].data;
    if ((x_221 <= x_224)) {
      let x_229 : i32 = baseIndex;
      let x_231 : i32 = tree[x_229].leftIndex;
      if ((x_231 == -1)) {
        let x_236 : i32 = baseIndex;
        let x_237 : i32 = *(treeIndex);
        tree[x_236].leftIndex = x_237;
        let x_239 : i32 = *(treeIndex);
        let x_241 : BST = tree[x_239];
        param = x_241;
        let x_242 : i32 = *(data_1);
        param_1 = x_242;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
        let x_244 : BST = param;
        tree[x_239] = x_244;
        return;
      } else {
        let x_246 : i32 = baseIndex;
        let x_248 : i32 = tree[x_246].leftIndex;
        baseIndex = x_248;
        continue;
      }
      return;
    } else {
      let x_249 : i32 = baseIndex;
      let x_251 : i32 = tree[x_249].rightIndex;
      if ((x_251 == -1)) {
        let x_256 : i32 = baseIndex;
        let x_257 : i32 = *(treeIndex);
        tree[x_256].rightIndex = x_257;
        let x_259 : i32 = *(treeIndex);
        let x_261 : BST = tree[x_259];
        param_2 = x_261;
        let x_262 : i32 = *(data_1);
        param_3 = x_262;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
        let x_264 : BST = param_2;
        tree[x_259] = x_264;
        return;
      } else {
        let x_266 : i32 = baseIndex;
        let x_268 : i32 = tree[x_266].rightIndex;
        baseIndex = x_268;
        continue;
      }
      return;
    }
    return;
  }
  return;
}

fn identity_i1_(a : ptr<function, i32>) -> i32 {
  let x_202 : i32 = *(a);
  let x_203 : i32 = *(a);
  obj.numbers[x_202] = x_203;
  let x_206 : i32 = obj.numbers[2];
  return x_206;
}

fn search_i1_(target : ptr<function, i32>) -> i32 {
  var index : i32;
  var currentNode : BST;
  var x_270 : i32;
  index = 0;
  loop {
    let x_275 : i32 = index;
    if ((x_275 != -1)) {
    } else {
      break;
    }
    let x_278 : i32 = index;
    let x_280 : BST = tree[x_278];
    currentNode = x_280;
    let x_282 : i32 = currentNode.data;
    let x_283 : i32 = *(target);
    if ((x_282 == x_283)) {
      let x_287 : i32 = *(target);
      return x_287;
    }
    let x_288 : i32 = *(target);
    let x_290 : i32 = currentNode.data;
    if ((x_288 > x_290)) {
      let x_296 : i32 = currentNode.rightIndex;
      x_270 = x_296;
    } else {
      let x_298 : i32 = currentNode.leftIndex;
      x_270 = x_298;
    }
    let x_299 : i32 = x_270;
    index = x_299;
  }
  return -1;
}

fn main_1() {
  var treeIndex_1 : i32;
  var param_4 : BST;
  var param_5 : i32;
  var param_6 : i32;
  var param_7 : i32;
  var param_8 : i32;
  var param_9 : i32;
  var param_10 : i32;
  var param_11 : i32;
  var param_12 : i32;
  var param_13 : i32;
  var param_14 : i32;
  var param_15 : i32;
  var param_16 : i32;
  var param_17 : i32;
  var param_18 : i32;
  var param_19 : i32;
  var param_20 : i32;
  var param_21 : i32;
  var param_22 : i32;
  var param_23 : i32;
  var pp : i32;
  var looplimiter0 : i32;
  var i : i32;
  var param_24 : i32;
  var count : i32;
  var i_1 : i32;
  var result : i32;
  var param_25 : i32;
  treeIndex_1 = 0;
  let x_101 : BST = tree[0];
  param_4 = x_101;
  param_5 = 9;
  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
  let x_103 : BST = param_4;
  tree[0] = x_103;
  let x_105 : i32 = treeIndex_1;
  treeIndex_1 = (x_105 + 1);
  let x_107 : i32 = treeIndex_1;
  param_6 = x_107;
  param_7 = 5;
  insert_i1_i1_(&(param_6), &(param_7));
  let x_109 : i32 = treeIndex_1;
  treeIndex_1 = (x_109 + 1);
  let x_111 : i32 = treeIndex_1;
  param_8 = x_111;
  param_9 = 12;
  insert_i1_i1_(&(param_8), &(param_9));
  let x_113 : i32 = treeIndex_1;
  treeIndex_1 = (x_113 + 1);
  let x_115 : i32 = treeIndex_1;
  param_10 = x_115;
  param_11 = 15;
  insert_i1_i1_(&(param_10), &(param_11));
  let x_117 : i32 = treeIndex_1;
  treeIndex_1 = (x_117 + 1);
  let x_119 : i32 = treeIndex_1;
  param_12 = x_119;
  param_13 = 7;
  insert_i1_i1_(&(param_12), &(param_13));
  let x_121 : i32 = treeIndex_1;
  treeIndex_1 = (x_121 + 1);
  let x_123 : i32 = treeIndex_1;
  param_14 = x_123;
  param_15 = 8;
  insert_i1_i1_(&(param_14), &(param_15));
  let x_125 : i32 = treeIndex_1;
  treeIndex_1 = (x_125 + 1);
  let x_127 : i32 = treeIndex_1;
  param_16 = x_127;
  param_17 = 2;
  insert_i1_i1_(&(param_16), &(param_17));
  let x_129 : i32 = treeIndex_1;
  treeIndex_1 = (x_129 + 1);
  let x_131 : i32 = treeIndex_1;
  param_18 = x_131;
  param_19 = 6;
  insert_i1_i1_(&(param_18), &(param_19));
  let x_133 : i32 = treeIndex_1;
  treeIndex_1 = (x_133 + 1);
  let x_135 : i32 = treeIndex_1;
  param_20 = x_135;
  param_21 = 17;
  insert_i1_i1_(&(param_20), &(param_21));
  let x_137 : i32 = treeIndex_1;
  treeIndex_1 = (x_137 + 1);
  let x_139 : i32 = treeIndex_1;
  param_22 = x_139;
  param_23 = 13;
  insert_i1_i1_(&(param_22), &(param_23));
  pp = 0;
  looplimiter0 = 0;
  i = 0;
  loop {
    let x_145 : i32 = i;
    if ((x_145 < 10000)) {
    } else {
      break;
    }
    let x_148 : i32 = looplimiter0;
    let x_150 : f32 = x_50.injectionSwitch.y;
    if ((x_148 >= i32(x_150))) {
      let x_156 : f32 = x_50.injectionSwitch.y;
      param_24 = (1 + i32(x_156));
      let x_159 : i32 = identity_i1_(&(param_24));
      pp = x_159;
      break;
    }
    let x_160 : i32 = looplimiter0;
    looplimiter0 = (x_160 + 1);

    continuing {
      let x_162 : i32 = i;
      i = (x_162 + 1);
    }
  }
  let x_164 : i32 = pp;
  if ((x_164 != 2)) {
    return;
  }
  count = 0;
  i_1 = 0;
  loop {
    let x_172 : i32 = i_1;
    if ((x_172 < 20)) {
    } else {
      break;
    }
    let x_175 : i32 = i_1;
    param_25 = x_175;
    let x_176 : i32 = search_i1_(&(param_25));
    result = x_176;
    let x_177 : i32 = i_1;
    switch(x_177) {
      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
        let x_187 : i32 = result;
        let x_188 : i32 = i_1;
        if ((x_187 == x_188)) {
          let x_192 : i32 = count;
          count = (x_192 + 1);
        }
      }
      default: {
        let x_181 : i32 = result;
        if ((x_181 == -1)) {
          let x_185 : i32 = count;
          count = (x_185 + 1);
        }
      }
    }

    continuing {
      let x_194 : i32 = i_1;
      i_1 = (x_194 + 1);
    }
  }
  let x_196 : i32 = count;
  if ((x_196 == 20)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(0.0, 0.0, 1.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);
}
