fun main() {
    fun parseInput(name: String) =
        readInput(name).map { it.toList() }.map { row -> row.map { height -> height.digitToInt() } }

    fun getListOfTrees(input: List<List<Int>>): List<Tree> {
        val columns = input.transpose()
        val (width, height) = columns.size to input.size
        val resultList = mutableListOf<Tree>()

        input.forEachIndexed { rowIndex, row ->
            columns.forEachIndexed { colIndex, column ->
                resultList.add(Tree(
                    height = input[rowIndex][colIndex],
                    allOnLeft = row.subList(0, colIndex).reversed(),
                    allOnRight = colIndex.takeIf { it < width - 1 }?.let { row.subList(it + 1, width) } ?: emptyList(),
                    allOnTop = column.subList(0, rowIndex).reversed(),
                    allOnBottom = rowIndex.takeIf { it < height - 1 }?.let { column.subList(it + 1, height) }
                        ?: emptyList()
                ))
            }
        }
        return resultList
    }

    fun part1(input: List<Tree>) = input.count { it.isVisible }

    fun part2(input: List<Tree>) = input.maxOfOrNull { it.scenicScore }

    val testInput = getListOfTrees(parseInput("Day08_test"))
    check(part1((testInput)) == 21)
    check(part2(testInput) == 8)

    val input = getListOfTrees(parseInput("Day08"))
    println(part1(input))
    println(part2(input))

}

private data class Tree(
    val height: Int,
    val allOnLeft: List<Int>,
    val allOnRight: List<Int>,
    val allOnTop: List<Int>,
    val allOnBottom: List<Int>
) {
    private val maxInAllDirections: List<Int>
        get() = allDirections.map { it.takeIf { it.isNotEmpty() }?.max() ?: 0 }

    private val allDirections: List<List<Int>>
        get() = listOf(allOnLeft, allOnRight, allOnTop, allOnBottom)

    private val visibleTreesInAllDirection: List<Int>
        get() = allDirections.map { it.numberOfVisibleTrees() }

    val isVisible: Boolean
        get() = allDirections.any { it.isEmpty() }.or(maxInAllDirections.min() < height)
    val scenicScore: Int
        get() = visibleTreesInAllDirection.reduce { acc, numOfTrees -> acc * numOfTrees }

    private fun List<Int>.numberOfVisibleTrees(): Int =
        indexOfFirst { it >= height }.takeIf { it >= 0 }?.plus(1) ?: size
}

Compiled from "Day08.kt"
public final class Day08Kt {
  public static final void main();
    Code:
       0: ldc           #8                  // String Day08_test
       2: invokestatic  #12                 // Method main$parseInput:(Ljava/lang/String;)Ljava/util/List;
       5: invokestatic  #16                 // Method main$getListOfTrees:(Ljava/util/List;)Ljava/util/List;
       8: astore_0
       9: aload_0
      10: invokestatic  #20                 // Method main$part1:(Ljava/util/List;)I
      13: bipush        21
      15: if_icmpne     22
      18: iconst_1
      19: goto          23
      22: iconst_0
      23: ifne          36
      26: new           #22                 // class java/lang/IllegalStateException
      29: dup
      30: ldc           #24                 // String Check failed.
      32: invokespecial #28                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
      35: athrow
      36: aload_0
      37: invokestatic  #32                 // Method main$part2:(Ljava/util/List;)Ljava/lang/Integer;
      40: bipush        8
      42: istore_1
      43: dup
      44: ifnonnull     51
      47: pop
      48: goto          62
      51: invokevirtual #38                 // Method java/lang/Integer.intValue:()I
      54: iload_1
      55: if_icmpne     62
      58: iconst_1
      59: goto          63
      62: iconst_0
      63: ifne          76
      66: new           #22                 // class java/lang/IllegalStateException
      69: dup
      70: ldc           #24                 // String Check failed.
      72: invokespecial #28                 // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
      75: athrow
      76: ldc           #40                 // String Day08
      78: invokestatic  #12                 // Method main$parseInput:(Ljava/lang/String;)Ljava/util/List;
      81: invokestatic  #16                 // Method main$getListOfTrees:(Ljava/util/List;)Ljava/util/List;
      84: astore_1
      85: aload_1
      86: invokestatic  #20                 // Method main$part1:(Ljava/util/List;)I
      89: istore_2
      90: getstatic     #46                 // Field java/lang/System.out:Ljava/io/PrintStream;
      93: iload_2
      94: invokevirtual #52                 // Method java/io/PrintStream.println:(I)V
      97: aload_1
      98: invokestatic  #32                 // Method main$part2:(Ljava/util/List;)Ljava/lang/Integer;
     101: getstatic     #46                 // Field java/lang/System.out:Ljava/io/PrintStream;
     104: swap
     105: invokevirtual #55                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     108: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #63                 // Method main:()V
       3: return

  private static final java.util.List<java.util.List<java.lang.Integer>> main$parseInput(java.lang.String);
    Code:
       0: aload_0
       1: invokestatic  #71                 // Method UtilsKt.readInput:(Ljava/lang/String;)Ljava/util/List;
       4: checkcast     #73                 // class java/lang/Iterable
       7: astore_1
       8: iconst_0
       9: istore_2
      10: aload_1
      11: astore_3
      12: new           #75                 // class java/util/ArrayList
      15: dup
      16: aload_1
      17: bipush        10
      19: invokestatic  #81                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      22: invokespecial #83                 // Method java/util/ArrayList."<init>":(I)V
      25: checkcast     #85                 // class java/util/Collection
      28: astore        4
      30: iconst_0
      31: istore        5
      33: aload_3
      34: invokeinterface #89,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      39: astore        6
      41: aload         6
      43: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      48: ifeq          94
      51: aload         6
      53: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      58: astore        7
      60: aload         4
      62: aload         7
      64: checkcast     #101                // class java/lang/String
      67: astore        8
      69: astore        20
      71: iconst_0
      72: istore        9
      74: aload         8
      76: checkcast     #103                // class java/lang/CharSequence
      79: invokestatic  #109                // Method kotlin/text/StringsKt.toList:(Ljava/lang/CharSequence;)Ljava/util/List;
      82: aload         20
      84: swap
      85: invokeinterface #113,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
      90: pop
      91: goto          41
      94: aload         4
      96: checkcast     #60                 // class java/util/List
      99: nop
     100: checkcast     #73                 // class java/lang/Iterable
     103: astore_1
     104: nop
     105: iconst_0
     106: istore_2
     107: aload_1
     108: astore_3
     109: new           #75                 // class java/util/ArrayList
     112: dup
     113: aload_1
     114: bipush        10
     116: invokestatic  #81                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     119: invokespecial #83                 // Method java/util/ArrayList."<init>":(I)V
     122: checkcast     #85                 // class java/util/Collection
     125: astore        4
     127: iconst_0
     128: istore        5
     130: aload_3
     131: invokeinterface #89,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     136: astore        6
     138: aload         6
     140: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     145: ifeq          291
     148: aload         6
     150: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     155: astore        7
     157: aload         4
     159: aload         7
     161: checkcast     #60                 // class java/util/List
     164: astore        8
     166: astore        20
     168: iconst_0
     169: istore        9
     171: aload         8
     173: checkcast     #73                 // class java/lang/Iterable
     176: astore        10
     178: iconst_0
     179: istore        11
     181: aload         10
     183: astore        12
     185: new           #75                 // class java/util/ArrayList
     188: dup
     189: aload         10
     191: bipush        10
     193: invokestatic  #81                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     196: invokespecial #83                 // Method java/util/ArrayList."<init>":(I)V
     199: checkcast     #85                 // class java/util/Collection
     202: astore        13
     204: iconst_0
     205: istore        14
     207: aload         12
     209: invokeinterface #89,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     214: astore        15
     216: aload         15
     218: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     223: ifeq          272
     226: aload         15
     228: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     233: astore        16
     235: aload         13
     237: aload         16
     239: checkcast     #115                // class java/lang/Character
     242: invokevirtual #119                // Method java/lang/Character.charValue:()C
     245: istore        17
     247: astore        18
     249: iconst_0
     250: istore        19
     252: iload         17
     254: invokestatic  #125                // Method kotlin/text/CharsKt.digitToInt:(C)I
     257: invokestatic  #129                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     260: aload         18
     262: swap
     263: invokeinterface #113,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     268: pop
     269: goto          216
     272: aload         13
     274: checkcast     #60                 // class java/util/List
     277: nop
     278: nop
     279: aload         20
     281: swap
     282: invokeinterface #113,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     287: pop
     288: goto          138
     291: aload         4
     293: checkcast     #60                 // class java/util/List
     296: nop
     297: areturn

  private static final java.util.List<Tree> main$getListOfTrees(java.util.List<? extends java.util.List<java.lang.Integer>>);
    Code:
       0: aload_0
       1: invokestatic  #152                // Method UtilsKt.transpose:(Ljava/util/List;)Ljava/util/List;
       4: astore_1
       5: aload_1
       6: invokeinterface #155,  1          // InterfaceMethod java/util/List.size:()I
      11: invokestatic  #129                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      14: aload_0
      15: invokeinterface #155,  1          // InterfaceMethod java/util/List.size:()I
      20: invokestatic  #129                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      23: invokestatic  #161                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
      26: astore_2
      27: aload_2
      28: invokevirtual #166                // Method kotlin/Pair.component1:()Ljava/lang/Object;
      31: checkcast     #168                // class java/lang/Number
      34: invokevirtual #169                // Method java/lang/Number.intValue:()I
      37: istore_3
      38: aload_2
      39: invokevirtual #172                // Method kotlin/Pair.component2:()Ljava/lang/Object;
      42: checkcast     #168                // class java/lang/Number
      45: invokevirtual #169                // Method java/lang/Number.intValue:()I
      48: istore        4
      50: new           #75                 // class java/util/ArrayList
      53: dup
      54: invokespecial #174                // Method java/util/ArrayList."<init>":()V
      57: checkcast     #60                 // class java/util/List
      60: astore        5
      62: aload_0
      63: checkcast     #73                 // class java/lang/Iterable
      66: astore        6
      68: iconst_0
      69: istore        7
      71: iconst_0
      72: istore        8
      74: aload         6
      76: invokeinterface #89,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      81: astore        9
      83: aload         9
      85: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      90: ifeq          540
      93: aload         9
      95: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     100: astore        10
     102: iload         8
     104: iinc          8, 1
     107: istore        11
     109: iload         11
     111: ifge          117
     114: invokestatic  #177                // Method kotlin/collections/CollectionsKt.throwIndexOverflow:()V
     117: iload         11
     119: aload         10
     121: checkcast     #60                 // class java/util/List
     124: astore        12
     126: istore        13
     128: iconst_0
     129: istore        14
     131: aload_1
     132: checkcast     #73                 // class java/lang/Iterable
     135: astore        15
     137: iconst_0
     138: istore        16
     140: iconst_0
     141: istore        17
     143: aload         15
     145: invokeinterface #89,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     150: astore        18
     152: aload         18
     154: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     159: ifeq          534
     162: aload         18
     164: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     169: astore        19
     171: iload         17
     173: iinc          17, 1
     176: istore        20
     178: iload         20
     180: ifge          186
     183: invokestatic  #177                // Method kotlin/collections/CollectionsKt.throwIndexOverflow:()V
     186: iload         20
     188: aload         19
     190: checkcast     #60                 // class java/util/List
     193: astore        21
     195: istore        22
     197: iconst_0
     198: istore        23
     200: aload         5
     202: aload_0
     203: iload         13
     205: invokeinterface #181,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     210: checkcast     #60                 // class java/util/List
     213: iload         22
     215: invokeinterface #181,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     220: checkcast     #168                // class java/lang/Number
     223: invokevirtual #169                // Method java/lang/Number.intValue:()I
     226: aload         12
     228: iconst_0
     229: iload         22
     231: invokeinterface #185,  3          // InterfaceMethod java/util/List.subList:(II)Ljava/util/List;
     236: checkcast     #73                 // class java/lang/Iterable
     239: invokestatic  #189                // Method kotlin/collections/CollectionsKt.reversed:(Ljava/lang/Iterable;)Ljava/util/List;
     242: iload         22
     244: invokestatic  #129                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     247: astore        24
     249: aload         24
     251: checkcast     #168                // class java/lang/Number
     254: invokevirtual #169                // Method java/lang/Number.intValue:()I
     257: istore        25
     259: astore        26
     261: istore        27
     263: astore        28
     265: iconst_0
     266: istore        29
     268: iload         25
     270: iload_3
     271: iconst_1
     272: isub
     273: if_icmpge     280
     276: iconst_1
     277: goto          281
     280: iconst_0
     281: istore        30
     283: aload         28
     285: iload         27
     287: aload         26
     289: iload         30
     291: ifeq          299
     294: aload         24
     296: goto          300
     299: aconst_null
     300: dup
     301: ifnull        348
     304: checkcast     #168                // class java/lang/Number
     307: invokevirtual #169                // Method java/lang/Number.intValue:()I
     310: istore        29
     312: astore        26
     314: istore        27
     316: astore        28
     318: iconst_0
     319: istore        31
     321: aload         12
     323: iload         29
     325: iconst_1
     326: iadd
     327: iload_3
     328: invokeinterface #185,  3          // InterfaceMethod java/util/List.subList:(II)Ljava/util/List;
     333: astore        30
     335: aload         28
     337: iload         27
     339: aload         26
     341: aload         30
     343: nop
     344: dup
     345: ifnonnull     352
     348: pop
     349: invokestatic  #193                // Method kotlin/collections/CollectionsKt.emptyList:()Ljava/util/List;
     352: aload         21
     354: iconst_0
     355: iload         13
     357: invokeinterface #185,  3          // InterfaceMethod java/util/List.subList:(II)Ljava/util/List;
     362: checkcast     #73                 // class java/lang/Iterable
     365: invokestatic  #189                // Method kotlin/collections/CollectionsKt.reversed:(Ljava/lang/Iterable;)Ljava/util/List;
     368: iload         13
     370: invokestatic  #129                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     373: astore        24
     375: aload         24
     377: checkcast     #168                // class java/lang/Number
     380: invokevirtual #169                // Method java/lang/Number.intValue:()I
     383: istore        25
     385: astore        32
     387: astore        30
     389: astore        26
     391: istore        27
     393: astore        28
     395: iconst_0
     396: istore        29
     398: iload         25
     400: iload         4
     402: iconst_1
     403: isub
     404: if_icmpge     411
     407: iconst_1
     408: goto          412
     411: iconst_0
     412: istore        33
     414: aload         28
     416: iload         27
     418: aload         26
     420: aload         30
     422: aload         32
     424: iload         33
     426: ifeq          434
     429: aload         24
     431: goto          435
     434: aconst_null
     435: dup
     436: ifnull        492
     439: checkcast     #168                // class java/lang/Number
     442: invokevirtual #169                // Method java/lang/Number.intValue:()I
     445: istore        29
     447: astore        32
     449: astore        30
     451: astore        26
     453: istore        27
     455: astore        28
     457: iconst_0
     458: istore        31
     460: aload         21
     462: iload         29
     464: iconst_1
     465: iadd
     466: iload         4
     468: invokeinterface #185,  3          // InterfaceMethod java/util/List.subList:(II)Ljava/util/List;
     473: astore        33
     475: aload         28
     477: iload         27
     479: aload         26
     481: aload         30
     483: aload         32
     485: aload         33
     487: nop
     488: dup
     489: ifnonnull     496
     492: pop
     493: invokestatic  #193                // Method kotlin/collections/CollectionsKt.emptyList:()Ljava/util/List;
     496: astore        34
     498: astore        35
     500: astore        36
     502: astore        37
     504: istore        38
     506: new           #195                // class Tree
     509: dup
     510: iload         38
     512: aload         37
     514: aload         36
     516: aload         35
     518: aload         34
     520: invokespecial #198                // Method Tree."<init>":(ILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V
     523: invokeinterface #199,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     528: pop
     529: nop
     530: nop
     531: goto          152
     534: nop
     535: nop
     536: nop
     537: goto          83
     540: nop
     541: aload         5
     543: areturn

  private static final int main$part1(java.util.List<Tree>);
    Code:
       0: aload_0
       1: checkcast     #73                 // class java/lang/Iterable
       4: astore_1
       5: iconst_0
       6: istore_2
       7: aload_1
       8: instanceof    #85                 // class java/util/Collection
      11: ifeq          30
      14: aload_1
      15: checkcast     #85                 // class java/util/Collection
      18: invokeinterface #219,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
      23: ifeq          30
      26: iconst_0
      27: goto          91
      30: iconst_0
      31: istore_3
      32: aload_1
      33: invokeinterface #89,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      38: astore        4
      40: aload         4
      42: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      47: ifeq          90
      50: aload         4
      52: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      57: astore        5
      59: aload         5
      61: checkcast     #195                // class Tree
      64: astore        6
      66: iconst_0
      67: istore        7
      69: aload         6
      71: invokevirtual #222                // Method Tree.isVisible:()Z
      74: ifeq          40
      77: iinc          3, 1
      80: iload_3
      81: ifge          40
      84: invokestatic  #225                // Method kotlin/collections/CollectionsKt.throwCountOverflow:()V
      87: goto          40
      90: iload_3
      91: ireturn

  private static final java.lang.Integer main$part2(java.util.List<Tree>);
    Code:
       0: aload_0
       1: checkcast     #73                 // class java/lang/Iterable
       4: invokeinterface #89,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
       9: astore_1
      10: aload_1
      11: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      16: ifne          23
      19: aconst_null
      20: goto          95
      23: aload_1
      24: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      29: checkcast     #195                // class Tree
      32: astore_2
      33: iconst_0
      34: istore_3
      35: aload_2
      36: invokevirtual #235                // Method Tree.getScenicScore:()I
      39: invokestatic  #129                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      42: checkcast     #237                // class java/lang/Comparable
      45: astore_2
      46: aload_1
      47: invokeinterface #95,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      52: ifeq          94
      55: aload_1
      56: invokeinterface #99,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      61: checkcast     #195                // class Tree
      64: astore_3
      65: iconst_0
      66: istore        4
      68: aload_3
      69: invokevirtual #235                // Method Tree.getScenicScore:()I
      72: invokestatic  #129                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      75: checkcast     #237                // class java/lang/Comparable
      78: astore_3
      79: aload_2
      80: aload_3
      81: invokeinterface #241,  2          // InterfaceMethod java/lang/Comparable.compareTo:(Ljava/lang/Object;)I
      86: ifge          46
      89: aload_3
      90: astore_2
      91: goto          46
      94: aload_2
      95: checkcast     #34                 // class java/lang/Integer
      98: areturn
}


import java.lang.IllegalArgumentException

private fun parseMonkey(monkeyData: String): Monkey {
    return Monkey.build {
        monkeyData.lines().forEach { line ->
            with(line.trim()) {
                when {
                    startsWith("Monkey") -> {
                        id = getAllInts().first()
                    }

                    startsWith("Starting items:") -> {
                        items = getAllInts().map { it.toLong() }.toMutableList()
                    }

                    startsWith("Operation") -> {
                        operation = "\\w+ [*+-/]? \\w+".toRegex().find(this)?.value.orEmpty()
                    }

                    startsWith("Test:") -> {
                        testDivisor = getAllInts().first().toLong()
                    }

                    startsWith("If true:") -> {
                        idIfTrue = getAllInts().first()
                    }

                    startsWith("If false:") -> {
                        idIfFalse = getAllInts().first()
                    }
                }
            }
        }
    }
}

private fun parseInput(name: String) = readGroupedInput(name).map { parseMonkey(it) }
fun main() {
    fun simulate(monkeys: List<Monkey>, rounds: Int, reduceOperation: (Long) -> Long): List<Long> {
        val inspectionCounters = MutableList(monkeys.size) { 0L }
        repeat(rounds) {
            monkeys.forEach { monkey ->
                monkey.items.forEach { item ->
                    val newItemValue = reduceOperation(monkey.calculate(item))
                    monkeys[monkey.getMonkeyIdToPass(newItemValue)].items.add(newItemValue)
                    inspectionCounters[monkey.id]++
                }
                monkey.items.clear()
            }
        }
        return inspectionCounters
    }

    fun monkeyBusiness(inspections: List<Long>) =
        inspections
            .sortedDescending()
            .take(2)
            .factorial()

    fun part1(monkeys: List<Monkey>) = monkeyBusiness(simulate(monkeys, 20) { it / 3 })

    fun part2(monkeys: List<Monkey>) =
        monkeyBusiness(
            simulate(monkeys, 10_000) {
                it % monkeys.map { monkey -> monkey.testDivisor }.factorial()
            }
        )

    check(part1(parseInput("Day11_test")) == 10605L)
    check(part2(parseInput("Day11_test")) == 2713310158L)

    println(part1(parseInput("Day11")))
    println(part2(parseInput("Day11")))
}

private data class Monkey(
    val id: Int,
    val items: MutableList<Long> = mutableListOf(),
    private val operation: String,
    val testDivisor: Long,
    private val idIfTrue: Int,
    private val idIfFalse: Int
) {
    private constructor(builder: Builder) : this(
        builder.id,
        builder.items,
        builder.operation,
        builder.testDivisor,
        builder.idIfTrue,
        builder.idIfFalse
    )

    fun getMonkeyIdToPass(value: Long) =
        idIfTrue.takeIf { value % testDivisor == 0L } ?: idIfFalse

    fun calculate(value: Long): Long {
        val (_, type, second) = operation.takeIf { it.isNotEmpty() }?.splitWords() ?: return -1L
        val arg = if (second == "old") value else second.toLong()
        return when (type) {
            "+" -> value + arg
            "-" -> value - arg
            "*" -> value * arg
            "/" -> value / arg
            else -> throw IllegalArgumentException("wrong operation type $operation")
        }
    }

    companion object {
        inline fun build(block: Builder.() -> Unit) = Builder().apply(block).build()
    }

    class Builder {
        var id = 0
        var items: MutableList<Long> = mutableListOf()
        var operation: String = ""
        var testDivisor: Long = 0L
        var idIfTrue: Int = 0
        var idIfFalse: Int = 0

        fun build() = Monkey(this)
    }
}

Compiled from "Day11.kt"
public final class Day11Kt {
  private static final Monkey parseMonkey(java.lang.String);
    Code:
       0: getstatic     #12                 // Field Monkey.Companion:LMonkey$Companion;
       3: astore_1
       4: iconst_0
       5: istore_2
       6: new           #14                 // class Monkey$Builder
       9: dup
      10: invokespecial #18                 // Method Monkey$Builder."<init>":()V
      13: astore_3
      14: aload_3
      15: astore        4
      17: iconst_0
      18: istore        5
      20: aload_0
      21: checkcast     #20                 // class java/lang/CharSequence
      24: invokestatic  #26                 // Method kotlin/text/StringsKt.lines:(Ljava/lang/CharSequence;)Ljava/util/List;
      27: checkcast     #28                 // class java/lang/Iterable
      30: astore        6
      32: iconst_0
      33: istore        7
      35: aload         6
      37: invokeinterface #32,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      42: astore        8
      44: aload         8
      46: invokeinterface #38,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      51: ifeq          437
      54: aload         8
      56: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      61: astore        9
      63: aload         9
      65: checkcast     #44                 // class java/lang/String
      68: astore        10
      70: iconst_0
      71: istore        11
      73: aload         10
      75: checkcast     #20                 // class java/lang/CharSequence
      78: invokestatic  #48                 // Method kotlin/text/StringsKt.trim:(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
      81: invokevirtual #52                 // Method java/lang/Object.toString:()Ljava/lang/String;
      84: astore        12
      86: iconst_0
      87: istore        13
      89: nop
      90: aload         12
      92: ldc           #53                 // String Monkey
      94: iconst_0
      95: iconst_2
      96: aconst_null
      97: invokestatic  #57                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
     100: ifeq          125
     103: aload         4
     105: aload         12
     107: invokestatic  #63                 // Method UtilsKt.getAllInts:(Ljava/lang/String;)Ljava/util/List;
     110: invokestatic  #69                 // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
     113: checkcast     #71                 // class java/lang/Number
     116: invokevirtual #75                 // Method java/lang/Number.intValue:()I
     119: invokevirtual #79                 // Method Monkey$Builder.setId:(I)V
     122: goto          430
     125: aload         12
     127: ldc           #81                 // String Starting items:
     129: iconst_0
     130: iconst_2
     131: aconst_null
     132: invokestatic  #57                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
     135: ifeq          265
     138: aload         4
     140: aload         12
     142: invokestatic  #63                 // Method UtilsKt.getAllInts:(Ljava/lang/String;)Ljava/util/List;
     145: checkcast     #28                 // class java/lang/Iterable
     148: astore        14
     150: astore        15
     152: iconst_0
     153: istore        16
     155: aload         14
     157: astore        17
     159: new           #83                 // class java/util/ArrayList
     162: dup
     163: aload         14
     165: bipush        10
     167: invokestatic  #87                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     170: invokespecial #89                 // Method java/util/ArrayList."<init>":(I)V
     173: checkcast     #91                 // class java/util/Collection
     176: astore        18
     178: iconst_0
     179: istore        19
     181: aload         17
     183: invokeinterface #32,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     188: astore        20
     190: aload         20
     192: invokeinterface #38,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     197: ifeq          244
     200: aload         20
     202: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     207: astore        21
     209: aload         18
     211: aload         21
     213: checkcast     #71                 // class java/lang/Number
     216: invokevirtual #75                 // Method java/lang/Number.intValue:()I
     219: istore        22
     221: astore        23
     223: iconst_0
     224: istore        24
     226: iload         22
     228: i2l
     229: invokestatic  #97                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     232: aload         23
     234: swap
     235: invokeinterface #101,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     240: pop
     241: goto          190
     244: aload         18
     246: checkcast     #103                // class java/util/List
     249: nop
     250: aload         15
     252: swap
     253: checkcast     #91                 // class java/util/Collection
     256: invokestatic  #107                // Method kotlin/collections/CollectionsKt.toMutableList:(Ljava/util/Collection;)Ljava/util/List;
     259: invokevirtual #111                // Method Monkey$Builder.setItems:(Ljava/util/List;)V
     262: goto          430
     265: aload         12
     267: ldc           #113                // String Operation
     269: iconst_0
     270: iconst_2
     271: aconst_null
     272: invokestatic  #57                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
     275: ifeq          327
     278: aload         4
     280: new           #115                // class kotlin/text/Regex
     283: dup
     284: ldc           #117                // String \\w+ [*+-/]? \\w+
     286: invokespecial #120                // Method kotlin/text/Regex."<init>":(Ljava/lang/String;)V
     289: aload         12
     291: checkcast     #20                 // class java/lang/CharSequence
     294: iconst_0
     295: iconst_2
     296: aconst_null
     297: invokestatic  #124                // Method kotlin/text/Regex.find$default:(Lkotlin/text/Regex;Ljava/lang/CharSequence;IILjava/lang/Object;)Lkotlin/text/MatchResult;
     300: dup
     301: ifnull        312
     304: invokeinterface #129,  1          // InterfaceMethod kotlin/text/MatchResult.getValue:()Ljava/lang/String;
     309: goto          314
     312: pop
     313: aconst_null
     314: dup
     315: ifnonnull     321
     318: pop
     319: ldc           #131                // String
     321: invokevirtual #134                // Method Monkey$Builder.setOperation:(Ljava/lang/String;)V
     324: goto          430
     327: aload         12
     329: ldc           #136                // String Test:
     331: iconst_0
     332: iconst_2
     333: aconst_null
     334: invokestatic  #57                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
     337: ifeq          363
     340: aload         4
     342: aload         12
     344: invokestatic  #63                 // Method UtilsKt.getAllInts:(Ljava/lang/String;)Ljava/util/List;
     347: invokestatic  #69                 // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
     350: checkcast     #71                 // class java/lang/Number
     353: invokevirtual #75                 // Method java/lang/Number.intValue:()I
     356: i2l
     357: invokevirtual #140                // Method Monkey$Builder.setTestDivisor:(J)V
     360: goto          430
     363: aload         12
     365: ldc           #142                // String If true:
     367: iconst_0
     368: iconst_2
     369: aconst_null
     370: invokestatic  #57                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
     373: ifeq          398
     376: aload         4
     378: aload         12
     380: invokestatic  #63                 // Method UtilsKt.getAllInts:(Ljava/lang/String;)Ljava/util/List;
     383: invokestatic  #69                 // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
     386: checkcast     #71                 // class java/lang/Number
     389: invokevirtual #75                 // Method java/lang/Number.intValue:()I
     392: invokevirtual #145                // Method Monkey$Builder.setIdIfTrue:(I)V
     395: goto          430
     398: aload         12
     400: ldc           #147                // String If false:
     402: iconst_0
     403: iconst_2
     404: aconst_null
     405: invokestatic  #57                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
     408: ifeq          430
     411: aload         4
     413: aload         12
     415: invokestatic  #63                 // Method UtilsKt.getAllInts:(Ljava/lang/String;)Ljava/util/List;
     418: invokestatic  #69                 // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
     421: checkcast     #71                 // class java/lang/Number
     424: invokevirtual #75                 // Method java/lang/Number.intValue:()I
     427: invokevirtual #150                // Method Monkey$Builder.setIdIfFalse:(I)V
     430: nop
     431: nop
     432: nop
     433: nop
     434: goto          44
     437: nop
     438: nop
     439: aload_3
     440: invokevirtual #154                // Method Monkey$Builder.build:()LMonkey;
     443: areturn

  private static final java.util.List<Monkey> parseInput(java.lang.String);
    Code:
       0: aload_0
       1: invokestatic  #187                // Method UtilsKt.readGroupedInput:(Ljava/lang/String;)Ljava/util/List;
       4: checkcast     #28                 // class java/lang/Iterable
       7: astore_1
       8: iconst_0
       9: istore_2
      10: aload_1
      11: astore_3
      12: new           #83                 // class java/util/ArrayList
      15: dup
      16: aload_1
      17: bipush        10
      19: invokestatic  #87                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      22: invokespecial #89                 // Method java/util/ArrayList."<init>":(I)V
      25: checkcast     #91                 // class java/util/Collection
      28: astore        4
      30: iconst_0
      31: istore        5
      33: aload_3
      34: invokeinterface #32,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      39: astore        6
      41: aload         6
      43: invokeinterface #38,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      48: ifeq          91
      51: aload         6
      53: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      58: astore        7
      60: aload         4
      62: aload         7
      64: checkcast     #44                 // class java/lang/String
      67: astore        8
      69: astore        10
      71: iconst_0
      72: istore        9
      74: aload         8
      76: invokestatic  #189                // Method parseMonkey:(Ljava/lang/String;)LMonkey;
      79: aload         10
      81: swap
      82: invokeinterface #101,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
      87: pop
      88: goto          41
      91: aload         4
      93: checkcast     #103                // class java/util/List
      96: nop
      97: areturn

  public static final void main();
    Code:
       0: ldc           #194                // String Day11_test
       2: invokestatic  #196                // Method parseInput:(Ljava/lang/String;)Ljava/util/List;
       5: invokestatic  #200                // Method main$part1:(Ljava/util/List;)J
       8: ldc2_w        #201                // long 10605l
      11: lcmp
      12: ifne          19
      15: iconst_1
      16: goto          20
      19: iconst_0
      20: ifne          33
      23: new           #204                // class java/lang/IllegalStateException
      26: dup
      27: ldc           #206                // String Check failed.
      29: invokespecial #207                // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
      32: athrow
      33: ldc           #194                // String Day11_test
      35: invokestatic  #196                // Method parseInput:(Ljava/lang/String;)Ljava/util/List;
      38: invokestatic  #210                // Method main$part2:(Ljava/util/List;)J
      41: ldc2_w        #211                // long 2713310158l
      44: lcmp
      45: ifne          52
      48: iconst_1
      49: goto          53
      52: iconst_0
      53: ifne          66
      56: new           #204                // class java/lang/IllegalStateException
      59: dup
      60: ldc           #206                // String Check failed.
      62: invokespecial #207                // Method java/lang/IllegalStateException."<init>":(Ljava/lang/String;)V
      65: athrow
      66: ldc           #214                // String Day11
      68: invokestatic  #196                // Method parseInput:(Ljava/lang/String;)Ljava/util/List;
      71: invokestatic  #200                // Method main$part1:(Ljava/util/List;)J
      74: lstore_0
      75: getstatic     #220                // Field java/lang/System.out:Ljava/io/PrintStream;
      78: lload_0
      79: invokevirtual #225                // Method java/io/PrintStream.println:(J)V
      82: ldc           #214                // String Day11
      84: invokestatic  #196                // Method parseInput:(Ljava/lang/String;)Ljava/util/List;
      87: invokestatic  #210                // Method main$part2:(Ljava/util/List;)J
      90: lstore_0
      91: getstatic     #220                // Field java/lang/System.out:Ljava/io/PrintStream;
      94: lload_0
      95: invokevirtual #225                // Method java/io/PrintStream.println:(J)V
      98: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #228                // Method main:()V
       3: return

  private static final java.util.List<java.lang.Long> main$simulate(java.util.List<Monkey>, int, kotlin.jvm.functions.Function1<? super java.lang.Long, java.lang.Long>);
    Code:
       0: aload_0
       1: invokeinterface #236,  1          // InterfaceMethod java/util/List.size:()I
       6: istore        4
       8: new           #83                 // class java/util/ArrayList
      11: dup
      12: iload         4
      14: invokespecial #89                 // Method java/util/ArrayList."<init>":(I)V
      17: astore        5
      19: iconst_0
      20: istore        6
      22: iload         6
      24: iload         4
      26: if_icmpge     61
      29: iload         6
      31: istore        7
      33: aload         5
      35: iload         7
      37: istore        8
      39: astore        25
      41: iconst_0
      42: istore        9
      44: lconst_0
      45: invokestatic  #97                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      48: aload         25
      50: swap
      51: invokevirtual #237                // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
      54: pop
      55: iinc          6, 1
      58: goto          22
      61: aload         5
      63: checkcast     #103                // class java/util/List
      66: astore_3
      67: iconst_0
      68: istore        4
      70: iload         4
      72: iload_1
      73: if_icmpge     306
      76: iload         4
      78: istore        5
      80: iconst_0
      81: istore        6
      83: aload_0
      84: checkcast     #28                 // class java/lang/Iterable
      87: astore        7
      89: iconst_0
      90: istore        8
      92: aload         7
      94: invokeinterface #32,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      99: astore        9
     101: aload         9
     103: invokeinterface #38,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     108: ifeq          298
     111: aload         9
     113: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     118: astore        10
     120: aload         10
     122: checkcast     #8                  // class Monkey
     125: astore        11
     127: iconst_0
     128: istore        12
     130: aload         11
     132: invokevirtual #241                // Method Monkey.getItems:()Ljava/util/List;
     135: checkcast     #28                 // class java/lang/Iterable
     138: astore        13
     140: iconst_0
     141: istore        14
     143: aload         13
     145: invokeinterface #32,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     150: astore        15
     152: aload         15
     154: invokeinterface #38,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     159: ifeq          282
     162: aload         15
     164: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     169: astore        16
     171: aload         16
     173: checkcast     #71                 // class java/lang/Number
     176: invokevirtual #245                // Method java/lang/Number.longValue:()J
     179: lstore        17
     181: iconst_0
     182: istore        19
     184: aload_2
     185: aload         11
     187: lload         17
     189: invokevirtual #249                // Method Monkey.calculate:(J)J
     192: invokestatic  #97                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     195: invokeinterface #255,  2          // InterfaceMethod kotlin/jvm/functions/Function1.invoke:(Ljava/lang/Object;)Ljava/lang/Object;
     200: checkcast     #71                 // class java/lang/Number
     203: invokevirtual #245                // Method java/lang/Number.longValue:()J
     206: lstore        20
     208: aload_0
     209: aload         11
     211: lload         20
     213: invokevirtual #259                // Method Monkey.getMonkeyIdToPass:(J)I
     216: invokeinterface #263,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     221: checkcast     #8                  // class Monkey
     224: invokevirtual #241                // Method Monkey.getItems:()Ljava/util/List;
     227: lload         20
     229: invokestatic  #97                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     232: invokeinterface #264,  2          // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
     237: pop
     238: aload         11
     240: invokevirtual #267                // Method Monkey.getId:()I
     243: istore        22
     245: aload_3
     246: iload         22
     248: invokeinterface #263,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     253: checkcast     #71                 // class java/lang/Number
     256: invokevirtual #245                // Method java/lang/Number.longValue:()J
     259: lstore        23
     261: aload_3
     262: iload         22
     264: lload         23
     266: lconst_1
     267: ladd
     268: invokestatic  #97                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
     271: invokeinterface #271,  3          // InterfaceMethod java/util/List.set:(ILjava/lang/Object;)Ljava/lang/Object;
     276: pop
     277: nop
     278: nop
     279: goto          152
     282: nop
     283: aload         11
     285: invokevirtual #241                // Method Monkey.getItems:()Ljava/util/List;
     288: invokeinterface #274,  1          // InterfaceMethod java/util/List.clear:()V
     293: nop
     294: nop
     295: goto          101
     298: nop
     299: nop
     300: iinc          4, 1
     303: goto          70
     306: aload_3
     307: areturn

  private static final long main$monkeyBusiness(java.util.List<java.lang.Long>);
    Code:
       0: aload_0
       1: checkcast     #28                 // class java/lang/Iterable
       4: invokestatic  #295                // Method kotlin/collections/CollectionsKt.sortedDescending:(Ljava/lang/Iterable;)Ljava/util/List;
       7: checkcast     #28                 // class java/lang/Iterable
      10: iconst_2
      11: invokestatic  #299                // Method kotlin/collections/CollectionsKt.take:(Ljava/lang/Iterable;I)Ljava/util/List;
      14: invokestatic  #302                // Method UtilsKt.factorial:(Ljava/util/List;)J
      17: lreturn

  private static final long main$part1$lambda$9(long);
    Code:
       0: lload_0
       1: iconst_3
       2: i2l
       3: ldiv
       4: lreturn

  private static final long main$part1(java.util.List<Monkey>);
    Code:
       0: aload_0
       1: bipush        20
       3: invokedynamic #321,  0            // InvokeDynamic #0:invoke:()Lkotlin/jvm/functions/Function1;
       8: invokestatic  #323                // Method main$simulate:(Ljava/util/List;ILkotlin/jvm/functions/Function1;)Ljava/util/List;
      11: invokestatic  #325                // Method main$monkeyBusiness:(Ljava/util/List;)J
      14: lreturn

  private static final long main$part2$lambda$11(java.util.List, long);
    Code:
       0: lload_1
       1: aload_0
       2: checkcast     #28                 // class java/lang/Iterable
       5: astore_3
       6: lstore        12
       8: iconst_0
       9: istore        4
      11: aload_3
      12: astore        5
      14: new           #83                 // class java/util/ArrayList
      17: dup
      18: aload_3
      19: bipush        10
      21: invokestatic  #87                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      24: invokespecial #89                 // Method java/util/ArrayList."<init>":(I)V
      27: checkcast     #91                 // class java/util/Collection
      30: astore        6
      32: iconst_0
      33: istore        7
      35: aload         5
      37: invokeinterface #32,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      42: astore        8
      44: aload         8
      46: invokeinterface #38,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      51: ifeq          97
      54: aload         8
      56: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      61: astore        9
      63: aload         6
      65: aload         9
      67: checkcast     #8                  // class Monkey
      70: astore        10
      72: astore        14
      74: iconst_0
      75: istore        11
      77: aload         10
      79: invokevirtual #330                // Method Monkey.getTestDivisor:()J
      82: invokestatic  #97                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      85: aload         14
      87: swap
      88: invokeinterface #101,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
      93: pop
      94: goto          44
      97: aload         6
      99: checkcast     #103                // class java/util/List
     102: nop
     103: astore        14
     105: lload         12
     107: aload         14
     109: invokestatic  #302                // Method UtilsKt.factorial:(Ljava/util/List;)J
     112: lrem
     113: lreturn

  private static final long main$part2(java.util.List<Monkey>);
    Code:
       0: aload_0
       1: sipush        10000
       4: aload_0
       5: invokedynamic #338,  0            // InvokeDynamic #1:invoke:(Ljava/util/List;)Lkotlin/jvm/functions/Function1;
      10: invokestatic  #323                // Method main$simulate:(Ljava/util/List;ILkotlin/jvm/functions/Function1;)Ljava/util/List;
      13: invokestatic  #325                // Method main$monkeyBusiness:(Ljava/util/List;)J
      16: lreturn
}


import java.io.File

fun main() {
    val programs = File("src/day24/input.txt").readText().split("inp w\n").drop(1)
        .map { it.split("\n").dropLast(1).map { it.split(" ") } }
    val variables = programs.map { Variables(it[3][2].toInt(), it[4][2].toInt(), it[14][2].toInt()) }
    val solutions = solve(variables)
    println(solutions.maxOf { it })
    println(solutions.minOf { it })
}

data class Variables(val zDiv: Int, val xAdd: Int, val yAdd: Int) {
    fun execute(input: Int, zReg: Int): Int {
        val x = if (((zReg % 26) + xAdd) != input) 1 else 0
        return ((zReg / zDiv) * ((25 * x) + 1)) + ((input + yAdd) * x)
    }
}

fun solve(variablesList: List<Variables>): List<String> {

    var validZOutputs = setOf(0)
    val validZsByIndex = variablesList.reversed().map { variables ->
        (1..9).associateWith { input ->
            (0..10000000).filter { z -> variables.execute(input, z) in validZOutputs }.toSet()
        }.also { validZs ->
            validZOutputs = validZs.values.flatten().toSet()
        }
    }.reversed()

    fun findModelNumbers(index: Int, z: Int): List<String> {
        val inputs = validZsByIndex[index].entries.filter { z in it.value }.map { it.key }
        return if (index == 13) inputs.map { it.toString() } else inputs.flatMap { input ->
            val nextZ = variablesList[index].execute(input, z)
            findModelNumbers(index + 1, nextZ).map { input.toString() + it }
        }
    }

    return findModelNumbers(0, 0)
}

Compiled from "result.kt"
public final class ResultKt {
  public static final void main();
    Code:
       0: new           #8                  // class java/io/File
       3: dup
       4: ldc           #10                 // String src/day24/input.txt
       6: invokespecial #14                 // Method java/io/File."<init>":(Ljava/lang/String;)V
       9: aconst_null
      10: iconst_1
      11: aconst_null
      12: invokestatic  #20                 // Method kotlin/io/FilesKt.readText$default:(Ljava/io/File;Ljava/nio/charset/Charset;ILjava/lang/Object;)Ljava/lang/String;
      15: checkcast     #22                 // class java/lang/CharSequence
      18: iconst_1
      19: anewarray     #24                 // class java/lang/String
      22: astore_1
      23: aload_1
      24: iconst_0
      25: ldc           #26                 // String inp w\n
      27: aastore
      28: aload_1
      29: iconst_0
      30: iconst_0
      31: bipush        6
      33: aconst_null
      34: invokestatic  #32                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      37: checkcast     #34                 // class java/lang/Iterable
      40: iconst_1
      41: invokestatic  #40                 // Method kotlin/collections/CollectionsKt.drop:(Ljava/lang/Iterable;I)Ljava/util/List;
      44: checkcast     #34                 // class java/lang/Iterable
      47: astore_1
      48: nop
      49: iconst_0
      50: istore_2
      51: aload_1
      52: astore_3
      53: new           #42                 // class java/util/ArrayList
      56: dup
      57: aload_1
      58: bipush        10
      60: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      63: invokespecial #49                 // Method java/util/ArrayList."<init>":(I)V
      66: checkcast     #51                 // class java/util/Collection
      69: astore        4
      71: iconst_0
      72: istore        5
      74: aload_3
      75: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      80: astore        6
      82: aload         6
      84: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      89: ifeq          280
      92: aload         6
      94: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      99: astore        7
     101: aload         4
     103: aload         7
     105: checkcast     #24                 // class java/lang/String
     108: astore        8
     110: astore        21
     112: iconst_0
     113: istore        9
     115: aload         8
     117: checkcast     #22                 // class java/lang/CharSequence
     120: iconst_1
     121: anewarray     #24                 // class java/lang/String
     124: astore        10
     126: aload         10
     128: iconst_0
     129: ldc           #67                 // String \n
     131: aastore
     132: aload         10
     134: iconst_0
     135: iconst_0
     136: bipush        6
     138: aconst_null
     139: invokestatic  #32                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     142: iconst_1
     143: invokestatic  #71                 // Method kotlin/collections/CollectionsKt.dropLast:(Ljava/util/List;I)Ljava/util/List;
     146: checkcast     #34                 // class java/lang/Iterable
     149: astore        10
     151: iconst_0
     152: istore        11
     154: aload         10
     156: astore        12
     158: new           #42                 // class java/util/ArrayList
     161: dup
     162: aload         10
     164: bipush        10
     166: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     169: invokespecial #49                 // Method java/util/ArrayList."<init>":(I)V
     172: checkcast     #51                 // class java/util/Collection
     175: astore        13
     177: iconst_0
     178: istore        14
     180: aload         12
     182: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     187: astore        15
     189: aload         15
     191: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     196: ifeq          261
     199: aload         15
     201: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     206: astore        16
     208: aload         13
     210: aload         16
     212: checkcast     #24                 // class java/lang/String
     215: astore        17
     217: astore        18
     219: iconst_0
     220: istore        19
     222: aload         17
     224: checkcast     #22                 // class java/lang/CharSequence
     227: iconst_1
     228: anewarray     #24                 // class java/lang/String
     231: astore        20
     233: aload         20
     235: iconst_0
     236: ldc           #73                 // String
     238: aastore
     239: aload         20
     241: iconst_0
     242: iconst_0
     243: bipush        6
     245: aconst_null
     246: invokestatic  #32                 // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     249: aload         18
     251: swap
     252: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     257: pop
     258: goto          189
     261: aload         13
     263: checkcast     #79                 // class java/util/List
     266: nop
     267: nop
     268: aload         21
     270: swap
     271: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     276: pop
     277: goto          82
     280: aload         4
     282: checkcast     #79                 // class java/util/List
     285: nop
     286: astore_0
     287: aload_0
     288: checkcast     #34                 // class java/lang/Iterable
     291: astore_2
     292: iconst_0
     293: istore_3
     294: aload_2
     295: astore        4
     297: new           #42                 // class java/util/ArrayList
     300: dup
     301: aload_2
     302: bipush        10
     304: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     307: invokespecial #49                 // Method java/util/ArrayList."<init>":(I)V
     310: checkcast     #51                 // class java/util/Collection
     313: astore        5
     315: iconst_0
     316: istore        6
     318: aload         4
     320: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     325: astore        7
     327: aload         7
     329: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     334: ifeq          449
     337: aload         7
     339: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     344: astore        8
     346: aload         5
     348: aload         8
     350: checkcast     #79                 // class java/util/List
     353: astore        9
     355: astore        21
     357: iconst_0
     358: istore        10
     360: new           #81                 // class Variables
     363: dup
     364: aload         9
     366: iconst_3
     367: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     372: checkcast     #79                 // class java/util/List
     375: iconst_2
     376: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     381: checkcast     #24                 // class java/lang/String
     384: invokestatic  #91                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     387: aload         9
     389: iconst_4
     390: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     395: checkcast     #79                 // class java/util/List
     398: iconst_2
     399: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     404: checkcast     #24                 // class java/lang/String
     407: invokestatic  #91                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     410: aload         9
     412: bipush        14
     414: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     419: checkcast     #79                 // class java/util/List
     422: iconst_2
     423: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     428: checkcast     #24                 // class java/lang/String
     431: invokestatic  #91                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     434: invokespecial #94                 // Method Variables."<init>":(III)V
     437: aload         21
     439: swap
     440: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     445: pop
     446: goto          327
     449: aload         5
     451: checkcast     #79                 // class java/util/List
     454: nop
     455: astore_1
     456: aload_1
     457: invokestatic  #98                 // Method solve:(Ljava/util/List;)Ljava/util/List;
     460: astore_2
     461: aload_2
     462: checkcast     #34                 // class java/lang/Iterable
     465: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     470: astore        4
     472: aload         4
     474: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     479: ifne          490
     482: new           #100                // class java/util/NoSuchElementException
     485: dup
     486: invokespecial #102                // Method java/util/NoSuchElementException."<init>":()V
     489: athrow
     490: aload         4
     492: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     497: checkcast     #24                 // class java/lang/String
     500: astore        5
     502: iconst_0
     503: istore        6
     505: aload         5
     507: checkcast     #104                // class java/lang/Comparable
     510: astore        5
     512: aload         4
     514: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     519: ifeq          563
     522: aload         4
     524: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     529: checkcast     #24                 // class java/lang/String
     532: astore        6
     534: iconst_0
     535: istore        7
     537: aload         6
     539: checkcast     #104                // class java/lang/Comparable
     542: astore        6
     544: aload         5
     546: aload         6
     548: invokeinterface #108,  2          // InterfaceMethod java/lang/Comparable.compareTo:(Ljava/lang/Object;)I
     553: ifge          512
     556: aload         6
     558: astore        5
     560: goto          512
     563: aload         5
     565: astore_3
     566: getstatic     #114                // Field java/lang/System.out:Ljava/io/PrintStream;
     569: aload_3
     570: invokevirtual #120                // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     573: aload_2
     574: checkcast     #34                 // class java/lang/Iterable
     577: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     582: astore        4
     584: aload         4
     586: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     591: ifne          602
     594: new           #100                // class java/util/NoSuchElementException
     597: dup
     598: invokespecial #102                // Method java/util/NoSuchElementException."<init>":()V
     601: athrow
     602: aload         4
     604: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     609: checkcast     #24                 // class java/lang/String
     612: astore        5
     614: iconst_0
     615: istore        6
     617: aload         5
     619: checkcast     #104                // class java/lang/Comparable
     622: astore        5
     624: aload         4
     626: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     631: ifeq          675
     634: aload         4
     636: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     641: checkcast     #24                 // class java/lang/String
     644: astore        6
     646: iconst_0
     647: istore        7
     649: aload         6
     651: checkcast     #104                // class java/lang/Comparable
     654: astore        6
     656: aload         5
     658: aload         6
     660: invokeinterface #108,  2          // InterfaceMethod java/lang/Comparable.compareTo:(Ljava/lang/Object;)I
     665: ifle          624
     668: aload         6
     670: astore        5
     672: goto          624
     675: aload         5
     677: astore_3
     678: getstatic     #114                // Field java/lang/System.out:Ljava/io/PrintStream;
     681: aload_3
     682: invokevirtual #120                // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     685: return

  public static final java.util.List<java.lang.String> solve(java.util.List<Variables>);
    Code:
       0: aload_0
       1: ldc           #145                // String variablesList
       3: invokestatic  #151                // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aconst_null
       7: astore_1
       8: iconst_0
       9: invokestatic  #155                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      12: invokestatic  #161                // Method kotlin/collections/SetsKt.setOf:(Ljava/lang/Object;)Ljava/util/Set;
      15: astore_1
      16: aload_0
      17: checkcast     #34                 // class java/lang/Iterable
      20: invokestatic  #165                // Method kotlin/collections/CollectionsKt.reversed:(Ljava/lang/Iterable;)Ljava/util/List;
      23: checkcast     #34                 // class java/lang/Iterable
      26: astore_3
      27: iconst_0
      28: istore        4
      30: aload_3
      31: astore        5
      33: new           #42                 // class java/util/ArrayList
      36: dup
      37: aload_3
      38: bipush        10
      40: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      43: invokespecial #49                 // Method java/util/ArrayList."<init>":(I)V
      46: checkcast     #51                 // class java/util/Collection
      49: astore        6
      51: iconst_0
      52: istore        7
      54: aload         5
      56: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      61: astore        8
      63: aload         8
      65: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      70: ifeq          389
      73: aload         8
      75: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      80: astore        9
      82: aload         6
      84: aload         9
      86: checkcast     #81                 // class Variables
      89: astore        10
      91: astore        33
      93: iconst_0
      94: istore        11
      96: new           #167                // class kotlin/ranges/IntRange
      99: dup
     100: iconst_1
     101: bipush        9
     103: invokespecial #170                // Method kotlin/ranges/IntRange."<init>":(II)V
     106: checkcast     #34                 // class java/lang/Iterable
     109: astore        12
     111: iconst_0
     112: istore        13
     114: new           #172                // class java/util/LinkedHashMap
     117: dup
     118: aload         12
     120: bipush        10
     122: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     125: invokestatic  #178                // Method kotlin/collections/MapsKt.mapCapacity:(I)I
     128: bipush        16
     130: invokestatic  #184                // Method kotlin/ranges/RangesKt.coerceAtLeast:(II)I
     133: invokespecial #185                // Method java/util/LinkedHashMap."<init>":(I)V
     136: astore        14
     138: aload         12
     140: astore        15
     142: iconst_0
     143: istore        16
     145: aload         15
     147: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     152: astore        17
     154: aload         17
     156: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     161: ifeq          338
     164: aload         17
     166: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     171: astore        18
     173: aload         14
     175: checkcast     #187                // class java/util/Map
     178: aload         18
     180: aload         18
     182: checkcast     #189                // class java/lang/Number
     185: invokevirtual #193                // Method java/lang/Number.intValue:()I
     188: istore        19
     190: astore        20
     192: astore        21
     194: iconst_0
     195: istore        22
     197: new           #167                // class kotlin/ranges/IntRange
     200: dup
     201: iconst_0
     202: ldc           #194                // int 10000000
     204: invokespecial #170                // Method kotlin/ranges/IntRange."<init>":(II)V
     207: checkcast     #34                 // class java/lang/Iterable
     210: astore        23
     212: iconst_0
     213: istore        24
     215: aload         23
     217: astore        25
     219: new           #42                 // class java/util/ArrayList
     222: dup
     223: invokespecial #195                // Method java/util/ArrayList."<init>":()V
     226: checkcast     #51                 // class java/util/Collection
     229: astore        26
     231: iconst_0
     232: istore        27
     234: aload         25
     236: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     241: astore        28
     243: aload         28
     245: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     250: ifeq          309
     253: aload         28
     255: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     260: astore        29
     262: aload         29
     264: checkcast     #189                // class java/lang/Number
     267: invokevirtual #193                // Method java/lang/Number.intValue:()I
     270: istore        30
     272: iconst_0
     273: istore        31
     275: aload_1
     276: aload         10
     278: iload         19
     280: iload         30
     282: invokevirtual #198                // Method Variables.execute:(II)I
     285: invokestatic  #155                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     288: invokeinterface #203,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
     293: ifeq          243
     296: aload         26
     298: aload         29
     300: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     305: pop
     306: goto          243
     309: aload         26
     311: checkcast     #79                 // class java/util/List
     314: nop
     315: checkcast     #34                 // class java/lang/Iterable
     318: invokestatic  #207                // Method kotlin/collections/CollectionsKt.toSet:(Ljava/lang/Iterable;)Ljava/util/Set;
     321: astore        32
     323: aload         21
     325: aload         20
     327: aload         32
     329: invokeinterface #211,  3          // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
     334: pop
     335: goto          154
     338: aload         14
     340: checkcast     #187                // class java/util/Map
     343: nop
     344: astore        12
     346: aload         12
     348: astore        13
     350: iconst_0
     351: istore        14
     353: aload         13
     355: invokeinterface #215,  1          // InterfaceMethod java/util/Map.values:()Ljava/util/Collection;
     360: checkcast     #34                 // class java/lang/Iterable
     363: invokestatic  #218                // Method kotlin/collections/CollectionsKt.flatten:(Ljava/lang/Iterable;)Ljava/util/List;
     366: checkcast     #34                 // class java/lang/Iterable
     369: invokestatic  #207                // Method kotlin/collections/CollectionsKt.toSet:(Ljava/lang/Iterable;)Ljava/util/Set;
     372: astore_1
     373: nop
     374: aload         12
     376: nop
     377: aload         33
     379: swap
     380: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     385: pop
     386: goto          63
     389: aload         6
     391: checkcast     #79                 // class java/util/List
     394: nop
     395: checkcast     #34                 // class java/lang/Iterable
     398: invokestatic  #165                // Method kotlin/collections/CollectionsKt.reversed:(Ljava/lang/Iterable;)Ljava/util/List;
     401: astore_2
     402: aload_2
     403: aload_0
     404: iconst_0
     405: iconst_0
     406: invokestatic  #222                // Method solve$findModelNumbers:(Ljava/util/List;Ljava/util/List;II)Ljava/util/List;
     409: areturn

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #247                // Method main:()V
       3: return

  private static final java.util.List<java.lang.String> solve$findModelNumbers(java.util.List<? extends java.util.Map<java.lang.Integer, ? extends java.util.Set<java.lang.Integer>>>, java.util.List<Variables>, int, int);
    Code:
       0: aload_0
       1: iload_2
       2: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
       7: checkcast     #187                // class java/util/Map
      10: invokeinterface #254,  1          // InterfaceMethod java/util/Map.entrySet:()Ljava/util/Set;
      15: checkcast     #34                 // class java/lang/Iterable
      18: astore        5
      20: iconst_0
      21: istore        6
      23: aload         5
      25: astore        7
      27: new           #42                 // class java/util/ArrayList
      30: dup
      31: invokespecial #195                // Method java/util/ArrayList."<init>":()V
      34: checkcast     #51                 // class java/util/Collection
      37: astore        8
      39: iconst_0
      40: istore        9
      42: aload         7
      44: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      49: astore        10
      51: aload         10
      53: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      58: ifeq          115
      61: aload         10
      63: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      68: astore        11
      70: aload         11
      72: checkcast     #256                // class java/util/Map$Entry
      75: astore        12
      77: iconst_0
      78: istore        13
      80: aload         12
      82: invokeinterface #259,  1          // InterfaceMethod java/util/Map$Entry.getValue:()Ljava/lang/Object;
      87: checkcast     #200                // class java/util/Set
      90: iload_3
      91: invokestatic  #155                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      94: invokeinterface #203,  2          // InterfaceMethod java/util/Set.contains:(Ljava/lang/Object;)Z
      99: ifeq          51
     102: aload         8
     104: aload         11
     106: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     111: pop
     112: goto          51
     115: aload         8
     117: checkcast     #79                 // class java/util/List
     120: nop
     121: checkcast     #34                 // class java/lang/Iterable
     124: astore        5
     126: nop
     127: iconst_0
     128: istore        6
     130: aload         5
     132: astore        7
     134: new           #42                 // class java/util/ArrayList
     137: dup
     138: aload         5
     140: bipush        10
     142: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     145: invokespecial #49                 // Method java/util/ArrayList."<init>":(I)V
     148: checkcast     #51                 // class java/util/Collection
     151: astore        8
     153: iconst_0
     154: istore        9
     156: aload         7
     158: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     163: astore        10
     165: aload         10
     167: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     172: ifeq          226
     175: aload         10
     177: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     182: astore        11
     184: aload         8
     186: aload         11
     188: checkcast     #256                // class java/util/Map$Entry
     191: astore        12
     193: astore        26
     195: iconst_0
     196: istore        13
     198: aload         12
     200: invokeinterface #262,  1          // InterfaceMethod java/util/Map$Entry.getKey:()Ljava/lang/Object;
     205: checkcast     #189                // class java/lang/Number
     208: invokevirtual #193                // Method java/lang/Number.intValue:()I
     211: invokestatic  #155                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     214: aload         26
     216: swap
     217: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     222: pop
     223: goto          165
     226: aload         8
     228: checkcast     #79                 // class java/util/List
     231: nop
     232: astore        4
     234: iload_2
     235: bipush        13
     237: if_icmpne     347
     240: aload         4
     242: checkcast     #34                 // class java/lang/Iterable
     245: astore        5
     247: iconst_0
     248: istore        6
     250: aload         5
     252: astore        7
     254: new           #42                 // class java/util/ArrayList
     257: dup
     258: aload         5
     260: bipush        10
     262: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     265: invokespecial #49                 // Method java/util/ArrayList."<init>":(I)V
     268: checkcast     #51                 // class java/util/Collection
     271: astore        8
     273: iconst_0
     274: istore        9
     276: aload         7
     278: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     283: astore        10
     285: aload         10
     287: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     292: ifeq          338
     295: aload         10
     297: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     302: astore        11
     304: aload         8
     306: aload         11
     308: checkcast     #189                // class java/lang/Number
     311: invokevirtual #193                // Method java/lang/Number.intValue:()I
     314: istore        12
     316: astore        26
     318: iconst_0
     319: istore        13
     321: iload         12
     323: invokestatic  #265                // Method java/lang/String.valueOf:(I)Ljava/lang/String;
     326: aload         26
     328: swap
     329: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     334: pop
     335: goto          285
     338: aload         8
     340: checkcast     #79                 // class java/util/List
     343: nop
     344: goto          582
     347: aload         4
     349: checkcast     #34                 // class java/lang/Iterable
     352: astore        5
     354: iconst_0
     355: istore        6
     357: aload         5
     359: astore        7
     361: new           #42                 // class java/util/ArrayList
     364: dup
     365: invokespecial #195                // Method java/util/ArrayList."<init>":()V
     368: checkcast     #51                 // class java/util/Collection
     371: astore        8
     373: iconst_0
     374: istore        9
     376: aload         7
     378: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     383: astore        10
     385: aload         10
     387: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     392: ifeq          576
     395: aload         10
     397: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     402: astore        11
     404: aload         11
     406: checkcast     #189                // class java/lang/Number
     409: invokevirtual #193                // Method java/lang/Number.intValue:()I
     412: istore        12
     414: iconst_0
     415: istore        13
     417: aload_1
     418: iload_2
     419: invokeinterface #85,  2           // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     424: checkcast     #81                 // class Variables
     427: iload         12
     429: iload_3
     430: invokevirtual #198                // Method Variables.execute:(II)I
     433: istore        14
     435: aload_0
     436: aload_1
     437: iload_2
     438: iconst_1
     439: iadd
     440: iload         14
     442: invokestatic  #222                // Method solve$findModelNumbers:(Ljava/util/List;Ljava/util/List;II)Ljava/util/List;
     445: checkcast     #34                 // class java/lang/Iterable
     448: astore        15
     450: iconst_0
     451: istore        16
     453: aload         15
     455: astore        17
     457: new           #42                 // class java/util/ArrayList
     460: dup
     461: aload         15
     463: bipush        10
     465: invokestatic  #46                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     468: invokespecial #49                 // Method java/util/ArrayList."<init>":(I)V
     471: checkcast     #51                 // class java/util/Collection
     474: astore        18
     476: iconst_0
     477: istore        19
     479: aload         17
     481: invokeinterface #55,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     486: astore        20
     488: aload         20
     490: invokeinterface #61,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     495: ifeq          553
     498: aload         20
     500: invokeinterface #65,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     505: astore        21
     507: aload         18
     509: aload         21
     511: checkcast     #24                 // class java/lang/String
     514: astore        22
     516: astore        23
     518: iconst_0
     519: istore        24
     521: new           #267                // class java/lang/StringBuilder
     524: dup
     525: invokespecial #268                // Method java/lang/StringBuilder."<init>":()V
     528: iload         12
     530: invokevirtual #272                // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
     533: aload         22
     535: invokevirtual #275                // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     538: invokevirtual #279                // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     541: aload         23
     543: swap
     544: invokeinterface #77,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     549: pop
     550: goto          488
     553: aload         18
     555: checkcast     #79                 // class java/util/List
     558: nop
     559: checkcast     #34                 // class java/lang/Iterable
     562: nop
     563: astore        25
     565: aload         8
     567: aload         25
     569: invokestatic  #283                // Method kotlin/collections/CollectionsKt.addAll:(Ljava/util/Collection;Ljava/lang/Iterable;)Z
     572: pop
     573: goto          385
     576: aload         8
     578: checkcast     #79                 // class java/util/List
     581: nop
     582: areturn
}