import java.util.HashSet;
public final int A;
public final int B;
if (a == b)
A = a;
B = b;
}
@Override
public boolean equals
(Object o
) { if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return (A == that.A && B == that.B || A == that.B && B == that.A);
}
@Override
public int hashCode() {
return A ^ B;
}
@Override
return "Connection{" +
"A=" + A +
", B=" + B +
'}';
}
}
class Ideone {
HashSet<Connection> s = new HashSet<>();
}
// output:
// Connection{A=2, B=3}
// Connection{A=1, B=3}
}
}
aW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwoKZmluYWwgY2xhc3MgQ29ubmVjdGlvbiB7CiAgICBwdWJsaWMgZmluYWwgaW50IEE7CiAgICBwdWJsaWMgZmluYWwgaW50IEI7CgogICAgcHVibGljIENvbm5lY3Rpb24oZmluYWwgaW50IGEsIGZpbmFsIGludCBiKSB7CiAgICAgICAgaWYgKGEgPT0gYikKICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicG9pbnRzIG11c3QgYmUgZGlmZmVyZW50Iik7CiAgICAgICAgQSA9IGE7CiAgICAgICAgQiA9IGI7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CgogICAgICAgIENvbm5lY3Rpb24gdGhhdCA9IChDb25uZWN0aW9uKSBvOwoKICAgICAgICByZXR1cm4gKEEgPT0gdGhhdC5BICYmIEIgPT0gdGhhdC5CIHx8IEEgPT0gdGhhdC5CICYmIEIgPT0gdGhhdC5BKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgcmV0dXJuIEEgXiBCOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gIkNvbm5lY3Rpb257IiArCiAgICAgICAgICAgICAgICAiQT0iICsgQSArCiAgICAgICAgICAgICAgICAiLCBCPSIgKyBCICsKICAgICAgICAgICAgICAgICd9JzsKICAgIH0KfQoKCmNsYXNzIElkZW9uZSB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CiAgICAgICAgSGFzaFNldDxDb25uZWN0aW9uPiBzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgIHMuYWRkKG5ldyBDb25uZWN0aW9uKDEsIDMpKTsKICAgICAgICBzLmFkZChuZXcgQ29ubmVjdGlvbigyLCAzKSk7CiAgICAgICAgcy5hZGQobmV3IENvbm5lY3Rpb24oMywgMikpOwogICAgICAgIHMuYWRkKG5ldyBDb25uZWN0aW9uKDEsIDMpKTsKICAgICAgICBzLmFkZChuZXcgQ29ubmVjdGlvbigyLCAxKSk7CgogICAgICAgIHMucmVtb3ZlKG5ldyBDb25uZWN0aW9uKDEsIDIpKTsKCiAgICAgICAgZm9yIChDb25uZWN0aW9uIHggOiBzKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4KTsKICAgICAgICB9CgogICAgICAgIC8vIG91dHB1dDoKICAgICAgICAvLyBDb25uZWN0aW9ue0E9MiwgQj0zfQogICAgICAgIC8vIENvbm5lY3Rpb257QT0xLCBCPTN9CiAgICB9Cn0=