// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// This file was autogenerated by the pkg/compiler/tool/graph_isomorphizer.dart.
import "package:expect/expect.dart";

void v(Set<String> u, String name, int bit) {
  Expect.isTrue(u.add(name));
  Expect.equals(name[bit], '1');
}

class C_100 {
  const C_100();
}

class M_100 {}

class T_100 {}

const C_100 iC_100 = const C_100();
closureC_100(foo) => (C_100 unused) => iC_100.toString() == foo.toString();

class C_101 {
  const C_101();
}

class M_101 {}

class T_101 {}

const C_101 iC_101 = const C_101();
closureC_101(foo) => (C_101 unused) => iC_101.toString() == foo.toString();

class C_111 {
  const C_111();
}

class M_111 {}

class T_111 {}

const C_111 iC_111 = const C_111();
closureC_111(foo) => (C_111 unused) => iC_111.toString() == foo.toString();

class C_010 {
  const C_010();
}

class M_010 {}

class T_010 {}

const C_010 iC_010 = const C_010();
closureC_010(foo) => (C_010 unused) => iC_010.toString() == foo.toString();

class C_011 {
  const C_011();
}

class M_011 {}

class T_011 {}

const C_011 iC_011 = const C_011();
closureC_011(foo) => (C_011 unused) => iC_011.toString() == foo.toString();

class C_001 {
  const C_001();
}

class M_001 {}

class T_001 {}

const C_001 iC_001 = const C_001();
closureC_001(foo) => (C_001 unused) => iC_001.toString() == foo.toString();

class C_101_class_1 extends C_100
    with M_100, M_101, M_111, M_001
    implements C_101, C_111, C_001 {
  const C_101_class_1();
}

const C_101_class_1 iC_101_class_1 = const C_101_class_1();
closureC_101_class_1(foo) =>
    (C_101_class_1 unused) => iC_101_class_1.toString() == foo.toString();

class T_101_type__1 extends T_100
    with M_100, M_101, M_111, M_001
    implements T_101, T_111, T_001 {}

class C_101_class_2 extends C_101
    with M_100, M_101, M_111, M_001
    implements C_100, C_111, C_001 {
  const C_101_class_2();
}

const C_101_class_2 iC_101_class_2 = const C_101_class_2();
closureC_101_class_2(foo) =>
    (C_101_class_2 unused) => iC_101_class_2.toString() == foo.toString();

class T_101_type__2 extends T_101
    with M_100, M_101, M_111, M_001
    implements T_100, T_111, T_001 {}

class C_101_class_3 extends C_111
    with M_100, M_101, M_111, M_001
    implements C_100, C_101, C_001 {
  const C_101_class_3();
}

const C_101_class_3 iC_101_class_3 = const C_101_class_3();
closureC_101_class_3(foo) =>
    (C_101_class_3 unused) => iC_101_class_3.toString() == foo.toString();

class T_101_type__3 extends T_111
    with M_100, M_101, M_111, M_001
    implements T_100, T_101, T_001 {}

class C_101_class_4 extends C_001
    with M_100, M_101, M_111, M_001
    implements C_100, C_101, C_111 {
  const C_101_class_4();
}

const C_101_class_4 iC_101_class_4 = const C_101_class_4();
closureC_101_class_4(foo) =>
    (C_101_class_4 unused) => iC_101_class_4.toString() == foo.toString();

class T_101_type__4 extends T_001
    with M_100, M_101, M_111, M_001
    implements T_100, T_101, T_111 {}

class C_111_class_1 extends C_100
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements C_101, C_111, C_010, C_011, C_001 {
  const C_111_class_1();
}

const C_111_class_1 iC_111_class_1 = const C_111_class_1();
closureC_111_class_1(foo) =>
    (C_111_class_1 unused) => iC_111_class_1.toString() == foo.toString();

class T_111_type__1 extends T_100
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements T_101, T_111, T_010, T_011, T_001 {}

class C_111_class_2 extends C_101
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements C_100, C_111, C_010, C_011, C_001 {
  const C_111_class_2();
}

const C_111_class_2 iC_111_class_2 = const C_111_class_2();
closureC_111_class_2(foo) =>
    (C_111_class_2 unused) => iC_111_class_2.toString() == foo.toString();

class T_111_type__2 extends T_101
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements T_100, T_111, T_010, T_011, T_001 {}

class C_111_class_3 extends C_111
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements C_100, C_101, C_010, C_011, C_001 {
  const C_111_class_3();
}

const C_111_class_3 iC_111_class_3 = const C_111_class_3();
closureC_111_class_3(foo) =>
    (C_111_class_3 unused) => iC_111_class_3.toString() == foo.toString();

class T_111_type__3 extends T_111
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements T_100, T_101, T_010, T_011, T_001 {}

class C_111_class_4 extends C_010
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements C_100, C_101, C_111, C_011, C_001 {
  const C_111_class_4();
}

const C_111_class_4 iC_111_class_4 = const C_111_class_4();
closureC_111_class_4(foo) =>
    (C_111_class_4 unused) => iC_111_class_4.toString() == foo.toString();

class T_111_type__4 extends T_010
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements T_100, T_101, T_111, T_011, T_001 {}

class C_111_class_5 extends C_011
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements C_100, C_101, C_111, C_010, C_001 {
  const C_111_class_5();
}

const C_111_class_5 iC_111_class_5 = const C_111_class_5();
closureC_111_class_5(foo) =>
    (C_111_class_5 unused) => iC_111_class_5.toString() == foo.toString();

class T_111_type__5 extends T_011
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements T_100, T_101, T_111, T_010, T_001 {}

class C_111_class_6 extends C_001
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements C_100, C_101, C_111, C_010, C_011 {
  const C_111_class_6();
}

const C_111_class_6 iC_111_class_6 = const C_111_class_6();
closureC_111_class_6(foo) =>
    (C_111_class_6 unused) => iC_111_class_6.toString() == foo.toString();

class T_111_type__6 extends T_001
    with M_100, M_101, M_111, M_010, M_011, M_001
    implements T_100, T_101, T_111, T_010, T_011 {}

class C_011_class_1 extends C_010
    with M_010, M_011, M_001
    implements C_011, C_001 {
  const C_011_class_1();
}

const C_011_class_1 iC_011_class_1 = const C_011_class_1();
closureC_011_class_1(foo) =>
    (C_011_class_1 unused) => iC_011_class_1.toString() == foo.toString();

class T_011_type__1 extends T_010
    with M_010, M_011, M_001
    implements T_011, T_001 {}

class C_011_class_2 extends C_011
    with M_010, M_011, M_001
    implements C_010, C_001 {
  const C_011_class_2();
}

const C_011_class_2 iC_011_class_2 = const C_011_class_2();
closureC_011_class_2(foo) =>
    (C_011_class_2 unused) => iC_011_class_2.toString() == foo.toString();

class T_011_type__2 extends T_011
    with M_010, M_011, M_001
    implements T_010, T_001 {}

class C_011_class_3 extends C_001
    with M_010, M_011, M_001
    implements C_010, C_011 {
  const C_011_class_3();
}

const C_011_class_3 iC_011_class_3 = const C_011_class_3();
closureC_011_class_3(foo) =>
    (C_011_class_3 unused) => iC_011_class_3.toString() == foo.toString();

class T_011_type__3 extends T_001
    with M_010, M_011, M_001
    implements T_010, T_011 {}

@pragma('dart2js:noInline')
f_100(Set<String> u, int b) => v(u, '100', b);
@pragma('dart2js:noInline')
f_101(Set<String> u, int b) => v(u, '101', b);
@pragma('dart2js:noInline')
f_111(Set<String> u, int b) => v(u, '111', b);
@pragma('dart2js:noInline')
f_010(Set<String> u, int b) => v(u, '010', b);
@pragma('dart2js:noInline')
f_011(Set<String> u, int b) => v(u, '011', b);
@pragma('dart2js:noInline')
f_001(Set<String> u, int b) => v(u, '001', b);
