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

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

var<private> x_GLF_color : vec4<f32>;

fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
  let x_158 : i32 = *(data);
  (*(tree)).data = x_158;
  (*(tree)).leftIndex = -1;
  (*(tree)).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_167 : i32 = baseIndex;
    let x_168 : i32 = *(treeIndex);
    if ((x_167 <= x_168)) {
    } else {
      break;
    }
    let x_171 : i32 = *(data_1);
    let x_172 : i32 = baseIndex;
    let x_174 : i32 = tree_1[x_172].data;
    if ((x_171 <= x_174)) {
      let x_179 : i32 = baseIndex;
      let x_181 : i32 = tree_1[x_179].leftIndex;
      if ((x_181 == -1)) {
        let x_186 : i32 = baseIndex;
        let x_187 : i32 = *(treeIndex);
        tree_1[x_186].leftIndex = x_187;
        let x_189 : i32 = *(treeIndex);
        let x_191 : BST = tree_1[x_189];
        param = x_191;
        let x_192 : i32 = *(data_1);
        param_1 = x_192;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
        let x_194 : BST = param;
        tree_1[x_189] = x_194;
        return;
      } else {
        let x_196 : i32 = baseIndex;
        let x_198 : i32 = tree_1[x_196].leftIndex;
        baseIndex = x_198;
        continue;
      }
      return;
    } else {
      let x_199 : i32 = baseIndex;
      let x_201 : i32 = tree_1[x_199].rightIndex;
      if ((x_201 == -1)) {
        let x_206 : i32 = baseIndex;
        let x_207 : i32 = *(treeIndex);
        tree_1[x_206].rightIndex = x_207;
        let x_209 : i32 = *(treeIndex);
        let x_211 : BST = tree_1[x_209];
        param_2 = x_211;
        let x_212 : i32 = *(data_1);
        param_3 = x_212;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
        let x_214 : BST = param_2;
        tree_1[x_209] = x_214;
        return;
      } else {
        let x_216 : i32 = baseIndex;
        let x_218 : i32 = tree_1[x_216].rightIndex;
        baseIndex = x_218;
        continue;
      }
      return;
    }
    return;
  }
  return;
}

fn search_i1_(target : ptr<function, i32>) -> i32 {
  var index : i32;
  var currentNode : BST;
  var x_220 : i32;
  index = 0;
  loop {
    let x_225 : i32 = index;
    if ((x_225 != -1)) {
    } else {
      break;
    }
    let x_228 : i32 = index;
    let x_230 : BST = tree_1[x_228];
    currentNode = x_230;
    let x_232 : i32 = currentNode.data;
    let x_233 : i32 = *(target);
    if ((x_232 == x_233)) {
      let x_237 : i32 = *(target);
      return x_237;
    }
    let x_238 : i32 = *(target);
    let x_240 : i32 = currentNode.data;
    if ((x_238 > x_240)) {
      let x_246 : i32 = currentNode.rightIndex;
      x_220 = x_246;
    } else {
      let x_248 : i32 = currentNode.leftIndex;
      x_220 = x_248;
    }
    let x_249 : i32 = x_220;
    index = x_249;
  }
  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 count : i32;
  var i : i32;
  var result : i32;
  var param_24 : i32;
  treeIndex_1 = 0;
  let x_84 : BST = tree_1[0];
  param_4 = x_84;
  param_5 = 9;
  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
  let x_86 : BST = param_4;
  tree_1[0] = x_86;
  let x_88 : i32 = treeIndex_1;
  treeIndex_1 = (x_88 + 1);
  let x_90 : i32 = treeIndex_1;
  param_6 = x_90;
  param_7 = 5;
  insert_i1_i1_(&(param_6), &(param_7));
  let x_92 : i32 = treeIndex_1;
  treeIndex_1 = (x_92 + 1);
  let x_94 : i32 = treeIndex_1;
  param_8 = x_94;
  param_9 = 12;
  insert_i1_i1_(&(param_8), &(param_9));
  let x_96 : i32 = treeIndex_1;
  treeIndex_1 = (x_96 + 1);
  let x_98 : i32 = treeIndex_1;
  param_10 = x_98;
  param_11 = 15;
  insert_i1_i1_(&(param_10), &(param_11));
  let x_100 : i32 = treeIndex_1;
  treeIndex_1 = (x_100 + 1);
  let x_102 : i32 = treeIndex_1;
  param_12 = x_102;
  param_13 = 7;
  insert_i1_i1_(&(param_12), &(param_13));
  let x_104 : i32 = treeIndex_1;
  treeIndex_1 = (x_104 + 1);
  let x_106 : i32 = treeIndex_1;
  param_14 = x_106;
  param_15 = 8;
  insert_i1_i1_(&(param_14), &(param_15));
  let x_108 : i32 = treeIndex_1;
  treeIndex_1 = (x_108 + 1);
  let x_110 : i32 = treeIndex_1;
  param_16 = x_110;
  param_17 = 2;
  insert_i1_i1_(&(param_16), &(param_17));
  let x_112 : i32 = treeIndex_1;
  treeIndex_1 = (x_112 + 1);
  let x_114 : i32 = treeIndex_1;
  param_18 = x_114;
  param_19 = 6;
  insert_i1_i1_(&(param_18), &(param_19));
  let x_116 : i32 = treeIndex_1;
  treeIndex_1 = (x_116 + 1);
  let x_118 : i32 = treeIndex_1;
  param_20 = x_118;
  param_21 = 17;
  insert_i1_i1_(&(param_20), &(param_21));
  let x_120 : i32 = treeIndex_1;
  treeIndex_1 = (x_120 + 1);
  let x_122 : i32 = treeIndex_1;
  param_22 = x_122;
  param_23 = 13;
  insert_i1_i1_(&(param_22), &(param_23));
  count = 0;
  i = 0;
  loop {
    let x_128 : i32 = i;
    if ((x_128 < 20)) {
    } else {
      break;
    }
    let x_131 : i32 = i;
    param_24 = x_131;
    let x_132 : i32 = search_i1_(&(param_24));
    result = x_132;
    let x_133 : i32 = i;
    switch(x_133) {
      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
        let x_143 : i32 = result;
        let x_144 : i32 = i;
        if ((x_143 == x_144)) {
          let x_148 : i32 = count;
          count = (x_148 + 1);
        }
      }
      default: {
        let x_137 : i32 = result;
        if ((x_137 == -1)) {
          let x_141 : i32 = count;
          count = (x_141 + 1);
        }
      }
    }

    continuing {
      let x_150 : i32 = i;
      i = (x_150 + 1);
    }
  }
  let x_152 : i32 = count;
  if ((x_152 == 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);
}
