int main() {
  
  fruit::NormalizedComponent<> normalizedComponent(getComponent());
  fruit::Injector<XAnnot> injector(normalizedComponent, getComponent2());
  
  injector.get<XAnnot>();
  
  return 0;
}
int main() {
  fruit::NormalizedComponent<fruit::Required<XAnnot>, Y> normalizedComponent(getComponent());
  
  X x{};
  
  fruit::Injector<XAnnot> injector(normalizedComponent, fruit::Component<XAnnot>(fruit::createComponent().bindInstance<XAnnot>(x)));
  injector.get<fruit::Annotated<Annotation, X*>>();
  
  fruit::Injector<Y> injector2(normalizedComponent, getXComponent(x));
  injector2.get<Y*>();
  
  fruit::Injector<Y> injector3(normalizedComponent, getXComponent(x));
  injector3.get<Y*>();
  
  fruit::Injector<XAnnot> injector4(normalizedComponent, fruit::Component<XAnnot>(fruit::createComponent().bindInstance<XAnnot>(x)));
  injector4.get<fruit::Annotated<Annotation, X*>>();
  
  return 0;
}
int main() {
  fruit::NormalizedComponent<fruit::Required<fruit::Annotated<Annotation, X>>> normalizedComponent(getComponent());
  fruit::Injector<> injector(normalizedComponent, fruit::Component<>(fruit::createComponent()));
  
  return 0;
}
int main() {
  fruit::NormalizedComponent<> normalizedComponent(fruit::createComponent());
  fruit::Injector<X> injector(std::move(normalizedComponent), fruit::createComponent());
  
  return 0;
}
int main() {
  fruit::NormalizedComponent<XAnnot> normalizedComponent(fruit::createComponent());
  fruit::Injector<XAnnot> injector(normalizedComponent, getComponent());
  
  return 0;
}
int main() {
  fruit::NormalizedComponent<> normalizedComponent(fruit::createComponent());
  fruit::Injector<X> injector(normalizedComponent, fruit::Component<>(fruit::createComponent()));
  
  return 0;
}