@@ -0,0 +1,2107 @@
+package org.rocket.network;%0A%0Aimport com.google.common.reflect.TypeToken;%0A%0Aimport java.lang.annotation.Annotation;%0Aimport java.util.Optional;%0A%0Aimport static java.util.Objects.requireNonNull;%0A%0Apublic final class PropKey %7B%0A    private final TypeToken%3C?%3E component;%0A    private final Optional%3CClass%3C? extends Annotation%3E%3E annotation;%0A%0A    private PropKey(TypeToken%3C?%3E component, Optional%3CClass%3C? extends Annotation%3E%3E annotation) %7B%0A        this.component = requireNonNull(component, %22component%22);%0A        this.annotation = requireNonNull(annotation, %22annotation%22);%0A    %7D%0A%0A    public static PropKey of(TypeToken%3C?%3E component, Optional%3CClass%3C? extends Annotation%3E%3E annotation) %7B%0A        return new PropKey(component, annotation);%0A    %7D%0A%0A    public static PropKey of(TypeToken%3C?%3E component) %7B%0A        return of(component, Optional.empty());%0A    %7D%0A%0A    public static PropKey of(TypeToken%3C?%3E component, Class%3C? extends Annotation%3E annotation) %7B%0A        return of(component, Optional.of(annotation));%0A    %7D%0A%0A    public TypeToken%3C?%3E getComponent() %7B%0A        return component;%0A    %7D%0A%0A    public Optional%3CClass%3C? extends Annotation%3E%3E getAnnotation() %7B%0A        return annotation;%0A    %7D%0A%0A    public PropKey withComponent(TypeToken%3C?%3E component) %7B%0A        return new PropKey(component, annotation);%0A    %7D%0A%0A    public PropKey withAnnotation(Optional%3CClass%3C? extends Annotation%3E%3E annotation) %7B%0A        return new PropKey(component, annotation);%0A    %7D%0A%0A    @Override%0A    public boolean equals(Object o) %7B%0A        if (this == o) return true;%0A        if (o == null %7C%7C getClass() != o.getClass()) return false;%0A%0A        PropKey propKey = (PropKey) o;%0A%0A        return annotation.equals(propKey.annotation) &&%0A                component.equals(propKey.component);%0A%0A    %7D%0A%0A    @Override%0A    public int hashCode() %7B%0A        int result = component.hashCode();%0A        result = 31 * result + annotation.hashCode();%0A        return result;%0A    %7D%0A%0A    @Override%0A    public String toString() %7B%0A        return %22PropKey(%22 +%0A                %22component=%22 + component +%0A                %22, annotation=%22 + annotation +%0A                ')';%0A    %7D%0A%7D%0A

create PropKey class