
package fluent;
//import com.firebase.Firebase;
import java.util.HashMap;
import java.util.Map;

class Firebase {
    static {
        root.child_string.buildValue()
                .name("john")
                .age(12)
                .write();

        root.$("john").buildValue()
                .buildUser()
                .age(12)
                .value()
                .write();
    }


    Firebase(String path) {

    }

    public Firebase child(String seg) {
        return new Firebase(seg);
    }

    public void setValue(Object seg) {
    }
}

abstract class Ref<BuilderIdentity> {
    Firebase ref;
    Ref(Firebase ref) {
        this.ref = ref;
    }
    //abstract BuilderIdentity buildValue();
}

class Val {
    SubBuilder previous;
    Val(SubBuilder previous) {
        this.previous = previous;
    }
    public void write() {
        previous.ref.ref.setValue(previous.properties);
    }
}

class SubBuilder {
    Ref ref;
    SubBuilder parent;
    Map<String, Object> properties;
    SubBuilder(Ref ref, SubBuilder parent, Map<String, Object> properties) {
        this.ref = ref;
        this.parent = parent;
        this.properties = properties;
    }
}
class SubBuilderIdentity extends SubBuilder{
    SubBuilderIdentity(Ref ref, SubBuilder parent) {
        super(ref, parent, new HashMap<String, Object>());
    }
}
class SubBuilderIntermediate<Property> extends SubBuilder{
    SubBuilderIntermediate(SubBuilder parent, SubBuilder prev, String key, Property val) {
        super(prev.ref, parent, prev.properties);
        prev.properties.put(key, val);
    }
}
abstract class SubBuilderLast<Value> extends SubBuilder{
    SubBuilderLast(SubBuilder parent, SubBuilder prev) {
        super(prev.ref, parent, prev.properties);
    }
}
class root$$Builder0 extends SubBuilderIdentity {
 root$$Builder0(Ref ref) {
   super(ref, null);
 }
 public root$$Builder1 setChildString(String val) {
   return new root$$Builder1(parent.parent, parent, "childString", val);
 }
 public root$$Builder2 openChildObject() {
   return new root$$Builder2(this);
 }
}
class root$$Builder1 extends SubBuilderIntermediate {
 root$$Builder1(SubBuilder parent, SubBuilder prev, String key, Object val) {
   super(parent, prev, key, val);
 }
 public root$$Builder2 openChildObject() {
   return new root$$Builder2(this);
 }
}
class root$$Builder2 extends SubBuilderIdentity {
 root$$Builder2(SubBuilder parent) {
   super(parent.ref, parent);
 }
 public root$$Builder3 setGrandchildNumber(Double val) {
   return new root$$Builder3(parent.parent, parent, "grandchildNumber", val);
 }
 public root$$Builder3 setGrandchildNumber(Integer val) {
   return new root$$Builder3(parent.parent, parent, "grandchildNumber", val);
 }
 public root$$Builder4 closeChildObject() {
   return new root$$Builder4(parent.parent, parent);
 }
}
class root$$Builder3 extends SubBuilderIntermediate {
 root$$Builder3(SubBuilder parent, SubBuilder prev, String key, Object val) {
   super(parent, prev, key, val);
 }
 public root$$Builder4 closeChildObject() {
   return new root$$Builder4(parent.parent, parent);
 }
}
class root$$Builder4 extends SubBuilderLast<root$$Value> {

 root$$Builder4(SubBuilder parent, SubBuilder prev) {
   super(parent, prev);
 }
 public root$$Value write() {
   return new root$$Value(this);
 }
}
class root$$Builder5 extends SubBuilderIdentity {
 root$$Builder5(SubBuilder parent) {
   super(parent.ref, parent);
 }
 public root$$Builder6 setName(String val) {
   return new root$$Builder6(parent.parent, parent, "name", val);
 }
 public root$$Builder7 setAge(Double val) {
   return new root$$Builder7(parent.parent, parent, "age", val);
 }
 public root$$Builder7 setAge(Integer val) {
   return new root$$Builder7(parent.parent, parent, "age", val);
 }
 public root$$Builder8 close$userid() {
   return new root$$Builder8(parent.parent, parent);
 }
}
class root$$Builder6 extends SubBuilderIntermediate {
 root$$Builder6(SubBuilder parent, SubBuilder prev, String key, Object val) {
   super(parent, prev, key, val);
 }
 public root$$Builder7 setAge(Double val) {
   return new root$$Builder7(parent.parent, parent, "age", val);
 }
 public root$$Builder7 setAge(Integer val) {
   return new root$$Builder7(parent.parent, parent, "age", val);
 }
 public root$$Builder8 close$userid() {
   return new root$$Builder8(parent.parent, parent);
 }
}
class root$$Builder7 extends SubBuilderIntermediate {
 root$$Builder7(SubBuilder parent, SubBuilder prev, String key, Object val) {
   super(parent, prev, key, val);
 }
 public root$$Builder8 close$userid() {
   return new root$$Builder8(parent.parent, parent);
 }
}
class root$$Builder8 extends SubBuilderLast<root$$Value> {

 root$$Builder8(SubBuilder parent, SubBuilder prev) {
   super(parent, prev);
 }
 public root$$Value write() {
   return new root$$Value(this);
 }
}
class root$$Builder9 extends SubBuilderLast<root$$Value> {

 root$$Builder9(SubBuilder prev) {
   super(null, prev);
 }
 public root$$Value value() {
   return new root$$Value(this);
 }
}
class root$$Value extends Val {
  root$$Value(SubBuilder prev) {
    super(prev);
  }
}
class root$ extends Ref<root$$Builder0> {
 root$() {
   super(new Firebase(""));
 }
 public root$childString childString = new root$childString();
 public root$childObject childObject = new root$childObject();
 public root$$userid $(String key) {return null;}
 public root$$Builder0 openWrite() {
   return new root$$Builder0(this);
 }
}
class root$childString$Value extends Val {
  root$childString$Value(SubBuilder prev) {
    super(prev);
  }
}
class root$childString {
 public void write(String val) {
 }
}
class root$childObject$Builder0 extends SubBuilderIdentity {
 root$childObject$Builder0(Ref ref) {
   super(ref, null);
 }
 public root$childObject$Builder1 setGrandchildNumber(Double val) {
   return new root$childObject$Builder1(parent.parent, parent, "grandchildNumber", val);
 }
 public root$childObject$Builder1 setGrandchildNumber(Integer val) {
   return new root$childObject$Builder1(parent.parent, parent, "grandchildNumber", val);
 }
 public root$childObject$Value write() {
   return new root$childObject$Value(parent.parent);
 }
}
class root$childObject$Builder1 extends SubBuilderIntermediate {
 root$childObject$Builder1(SubBuilder parent, SubBuilder prev, String key, Object val) {
   super(parent, prev, key, val);
 }
 public root$childObject$Value write() {
   return new root$childObject$Value(parent.parent);
 }
}
class root$childObject$Builder2 extends SubBuilderLast<root$childObject$Value> {

 root$childObject$Builder2(SubBuilder prev) {
   super(null, prev);
 }
 public root$childObject$Value value() {
   return new root$childObject$Value(this);
 }
}
class root$childObject$Value extends Val {
  root$childObject$Value(SubBuilder prev) {
    super(prev);
  }
}
class root$childObject extends Ref<root$childObject$Builder0> {
 root$childObject() {
   super(new Firebase("childObject"));
 }
 public root$childObject$grandchildNumber grandchildNumber = new root$childObject$grandchildNumber();
 public root$childObject$Builder0 openWrite() {
   return new root$childObject$Builder0(this);
 }
}
class root$childObject$grandchildNumber$Value extends Val {
  root$childObject$grandchildNumber$Value(SubBuilder prev) {
    super(prev);
  }
}
class root$childObject$grandchildNumber {
 public void write(Double val) {
 }
 public void write(Integer val) {
 }
}
class root$$userid$Builder0 extends SubBuilderIdentity {
 root$$userid$Builder0(Ref ref) {
   super(ref, null);
 }
 public root$$userid$Builder1 setName(String val) {
   return new root$$userid$Builder1(parent.parent, parent, "name", val);
 }
 public root$$userid$Builder2 setAge(Double val) {
   return new root$$userid$Builder2(parent.parent, parent, "age", val);
 }
 public root$$userid$Builder2 setAge(Integer val) {
   return new root$$userid$Builder2(parent.parent, parent, "age", val);
 }
 public root$$userid$Value write() {
   return new root$$userid$Value(parent.parent);
 }
}
class root$$userid$Builder1 extends SubBuilderIntermediate {
 root$$userid$Builder1(SubBuilder parent, SubBuilder prev, String key, Object val) {
   super(parent, prev, key, val);
 }
 public root$$userid$Builder2 setAge(Double val) {
   return new root$$userid$Builder2(parent.parent, parent, "age", val);
 }
 public root$$userid$Builder2 setAge(Integer val) {
   return new root$$userid$Builder2(parent.parent, parent, "age", val);
 }
 public root$$userid$Value write() {
   return new root$$userid$Value(parent.parent);
 }
}
class root$$userid$Builder2 extends SubBuilderIntermediate {
 root$$userid$Builder2(SubBuilder parent, SubBuilder prev, String key, Object val) {
   super(parent, prev, key, val);
 }
 public root$$userid$Value write() {
   return new root$$userid$Value(parent.parent);
 }
}
class root$$userid$Builder3 extends SubBuilderLast<root$$userid$Value> {

 root$$userid$Builder3(SubBuilder prev) {
   super(null, prev);
 }
 public root$$userid$Value value() {
   return new root$$userid$Value(this);
 }
}
class root$$userid$Value extends Val {
  root$$userid$Value(SubBuilder prev) {
    super(prev);
  }
}
class root$$userid extends Ref<root$$userid$Builder0> {
 root$$userid() {
   super(new Firebase("$userid"));
 }
 public root$$userid$name name = new root$$userid$name();
 public root$$userid$age age = new root$$userid$age();
 public root$$userid$Builder0 openWrite() {
   return new root$$userid$Builder0(this);
 }
}
class root$$userid$name$Value extends Val {
  root$$userid$name$Value(SubBuilder prev) {
    super(prev);
  }
}
class root$$userid$name {
 public void write(String val) {
 }
}
class root$$userid$age$Value extends Val {
  root$$userid$age$Value(SubBuilder prev) {
    super(prev);
  }
}
class root$$userid$age {
 public void write(Double val) {
 }
 public void write(Integer val) {
 }
}
public class root {
 public static root$childString childString = new root$childString();
 public static root$childObject childObject = new root$childObject();
 public static root$$userid $(String key) {return null;}
 public static root$$Builder0 openWrite() {
   return new root$$Builder0(new root$());
 }
}