package day13

import java.io.File

/* Syntax sugar */
typealias Dot = Pair<Int, Int>
typealias PaperFold = Pair<Char, Int>

private val Dot.x: Int
  get() = this.first

private val Dot.y: Int
  get() = this.second
/* end */

fun parseInput(lines: List<String>): Pair<List<Dot>, List<PaperFold>> {
  val dots =
    lines
      .takeWhile { it.isNotEmpty() && it.first().isDigit() }
      .map {
        val (x, y) = it.split(",").map(String::toInt)
        x to y
      }

  fun extractAxisAndValue(string: String): Pair<Char, Int> {
    val (sentence, value) = string.split("=")
    return (sentence.last() to value.toInt())
  }

  val paperFolds = lines
    .drop(dots.size + 1) // removing also the empty line separator
    .map(::extractAxisAndValue)

  return Pair(dots, paperFolds)
}

fun fold(dots: List<Dot>, paperFold: PaperFold): List<Dot> {
  val (axis, value) = paperFold
  return when (axis) {
    'x' -> {
      val (base, foldingSide) = dots
        .filterNot { it.x == value }
        .partition { it.x < value }

      (base + foldingSide.map { (value - (it.x - value)) to it.y }).distinct()
    }
    'y' -> {
      val (base, foldingSide) = dots
        .filterNot { it.y == value }
        .partition { it.y < value }

      (base + foldingSide.map { it.x to (value - (it.y - value)) }).distinct()
    }
    else -> TODO("Not supported axis :)")
  }
}

// Actually not needed
fun countVisibleDotsAfterFolding(dots: List<Dot>, paperFolds: List<PaperFold>): Int =
  paperFolds.fold(dots, ::fold).size

fun countVisibleDotsAfterFirstFolding(dots: List<Dot>, paperFolds: List<PaperFold>): Int =
  fold(dots, paperFolds.first()).size

fun printAfterAllFolds(dots: List<Dot>, paperFolds: List<PaperFold>) {
  fun print(dots: List<Dot>) {
    val rowMax = dots.maxOf { it.y }
    val columnMax = dots.maxOf { it.x }

    (0..rowMax).forEach { y ->
      (0..columnMax).forEach { x ->
        if (dots.contains(x to y)) print('#')
        else print('.')
      }
      println()
    }
  }

  print(paperFolds.fold(dots, ::fold))
}

fun main() {
  File("./input/day13.txt").useLines { lines ->
    val (dots, folds) = parseInput(lines.toList())
    println(countVisibleDotsAfterFirstFolding(dots, folds))
    printAfterAllFolds(dots, folds)
  }
}

// ARHZPCUH

Compiled from "Day13.kt"
public final class day13.Day13Kt {
  private static final int getX(kotlin.Pair<java.lang.Integer, java.lang.Integer>);
    Code:
       0: aload_0
       1: invokevirtual #13                 // Method kotlin/Pair.getFirst:()Ljava/lang/Object;
       4: checkcast     #15                 // class java/lang/Number
       7: invokevirtual #19                 // Method java/lang/Number.intValue:()I
      10: ireturn

  private static final int getY(kotlin.Pair<java.lang.Integer, java.lang.Integer>);
    Code:
       0: aload_0
       1: invokevirtual #25                 // Method kotlin/Pair.getSecond:()Ljava/lang/Object;
       4: checkcast     #15                 // class java/lang/Number
       7: invokevirtual #19                 // Method java/lang/Number.intValue:()I
      10: ireturn

  public static final kotlin.Pair<java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>, java.util.List<kotlin.Pair<java.lang.Character, java.lang.Integer>>> parseInput(java.util.List<java.lang.String>);
    Code:
       0: aload_0
       1: ldc           #32                 // String lines
       3: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_0
       7: checkcast     #40                 // class java/lang/Iterable
      10: astore_2
      11: nop
      12: iconst_0
      13: istore_3
      14: new           #42                 // class java/util/ArrayList
      17: dup
      18: invokespecial #46                 // Method java/util/ArrayList."<init>":()V
      21: astore        4
      23: aload_2
      24: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      29: astore        5
      31: aload         5
      33: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      38: ifeq          117
      41: aload         5
      43: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      48: astore        6
      50: aload         6
      52: checkcast     #61                 // class java/lang/String
      55: astore        7
      57: iconst_0
      58: istore        8
      60: aload         7
      62: checkcast     #63                 // class java/lang/CharSequence
      65: invokeinterface #66,  1           // InterfaceMethod java/lang/CharSequence.length:()I
      70: ifle          77
      73: iconst_1
      74: goto          78
      77: iconst_0
      78: ifeq          99
      81: aload         7
      83: checkcast     #63                 // class java/lang/CharSequence
      86: invokestatic  #72                 // Method kotlin/text/StringsKt.first:(Ljava/lang/CharSequence;)C
      89: invokestatic  #78                 // Method java/lang/Character.isDigit:(C)Z
      92: ifeq          99
      95: iconst_1
      96: goto          100
      99: iconst_0
     100: ifne          106
     103: goto          117
     106: aload         4
     108: aload         6
     110: invokevirtual #82                 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
     113: pop
     114: goto          31
     117: aload         4
     119: checkcast     #84                 // class java/util/List
     122: checkcast     #40                 // class java/lang/Iterable
     125: astore_2
     126: nop
     127: iconst_0
     128: istore_3
     129: aload_2
     130: astore        4
     132: new           #42                 // class java/util/ArrayList
     135: dup
     136: aload_2
     137: bipush        10
     139: invokestatic  #90                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     142: invokespecial #93                 // Method java/util/ArrayList."<init>":(I)V
     145: checkcast     #95                 // class java/util/Collection
     148: astore        5
     150: iconst_0
     151: istore        6
     153: aload         4
     155: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     160: astore        7
     162: aload         7
     164: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     169: ifeq          384
     172: aload         7
     174: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     179: astore        8
     181: aload         5
     183: aload         8
     185: checkcast     #61                 // class java/lang/String
     188: astore        9
     190: astore        22
     192: iconst_0
     193: istore        10
     195: aload         9
     197: checkcast     #63                 // class java/lang/CharSequence
     200: iconst_1
     201: anewarray     #61                 // class java/lang/String
     204: astore        11
     206: aload         11
     208: iconst_0
     209: ldc           #97                 // String ,
     211: aastore
     212: aload         11
     214: iconst_0
     215: iconst_0
     216: bipush        6
     218: aconst_null
     219: invokestatic  #101                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
     222: checkcast     #40                 // class java/lang/Iterable
     225: astore        11
     227: iconst_0
     228: istore        12
     230: aload         11
     232: astore        13
     234: new           #42                 // class java/util/ArrayList
     237: dup
     238: aload         11
     240: bipush        10
     242: invokestatic  #90                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     245: invokespecial #93                 // Method java/util/ArrayList."<init>":(I)V
     248: checkcast     #95                 // class java/util/Collection
     251: astore        14
     253: iconst_0
     254: istore        15
     256: aload         13
     258: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     263: astore        16
     265: aload         16
     267: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     272: ifeq          319
     275: aload         16
     277: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     282: astore        17
     284: aload         14
     286: aload         17
     288: checkcast     #61                 // class java/lang/String
     291: astore        18
     293: astore        19
     295: iconst_0
     296: istore        20
     298: aload         18
     300: invokestatic  #107                // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     303: nop
     304: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     307: aload         19
     309: swap
     310: invokeinterface #112,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     315: pop
     316: goto          265
     319: aload         14
     321: checkcast     #84                 // class java/util/List
     324: nop
     325: astore        21
     327: aload         21
     329: iconst_0
     330: invokeinterface #116,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     335: checkcast     #15                 // class java/lang/Number
     338: invokevirtual #19                 // Method java/lang/Number.intValue:()I
     341: istore        11
     343: aload         21
     345: iconst_1
     346: invokeinterface #116,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     351: checkcast     #15                 // class java/lang/Number
     354: invokevirtual #19                 // Method java/lang/Number.intValue:()I
     357: istore        12
     359: iload         11
     361: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     364: iload         12
     366: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     369: invokestatic  #122                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     372: aload         22
     374: swap
     375: invokeinterface #112,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     380: pop
     381: goto          162
     384: aload         5
     386: checkcast     #84                 // class java/util/List
     389: nop
     390: astore_1
     391: aload_0
     392: checkcast     #40                 // class java/lang/Iterable
     395: aload_1
     396: invokeinterface #125,  1          // InterfaceMethod java/util/List.size:()I
     401: iconst_1
     402: iadd
     403: invokestatic  #129                // Method kotlin/collections/CollectionsKt.drop:(Ljava/lang/Iterable;I)Ljava/util/List;
     406: checkcast     #40                 // class java/lang/Iterable
     409: astore_3
     410: nop
     411: iconst_0
     412: istore        4
     414: aload_3
     415: astore        5
     417: new           #42                 // class java/util/ArrayList
     420: dup
     421: aload_3
     422: bipush        10
     424: invokestatic  #90                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     427: invokespecial #93                 // Method java/util/ArrayList."<init>":(I)V
     430: checkcast     #95                 // class java/util/Collection
     433: astore        6
     435: iconst_0
     436: istore        7
     438: aload         5
     440: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     445: astore        8
     447: aload         8
     449: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     454: ifeq          497
     457: aload         8
     459: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     464: astore        9
     466: aload         6
     468: aload         9
     470: checkcast     #61                 // class java/lang/String
     473: astore        10
     475: astore        22
     477: iconst_0
     478: istore        11
     480: aload         10
     482: invokestatic  #133                // Method parseInput$extractAxisAndValue:(Ljava/lang/String;)Lkotlin/Pair;
     485: aload         22
     487: swap
     488: invokeinterface #112,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     493: pop
     494: goto          447
     497: aload         6
     499: checkcast     #84                 // class java/util/List
     502: nop
     503: astore_2
     504: new           #9                  // class kotlin/Pair
     507: dup
     508: aload_1
     509: aload_2
     510: invokespecial #136                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     513: areturn

  public static final java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>> fold(java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>, kotlin.Pair<java.lang.Character, java.lang.Integer>);
    Code:
       0: aload_0
       1: ldc           #167                // String dots
       3: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #169                // String paperFold
       9: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_1
      13: invokevirtual #172                // Method kotlin/Pair.component1:()Ljava/lang/Object;
      16: checkcast     #74                 // class java/lang/Character
      19: invokevirtual #176                // Method java/lang/Character.charValue:()C
      22: istore_2
      23: aload_1
      24: invokevirtual #179                // Method kotlin/Pair.component2:()Ljava/lang/Object;
      27: checkcast     #15                 // class java/lang/Number
      30: invokevirtual #19                 // Method java/lang/Number.intValue:()I
      33: istore_3
      34: iload_2
      35: tableswitch   { // 120 to 121
                   120: 56
                   121: 439
               default: 822
          }
      56: aload_0
      57: checkcast     #40                 // class java/lang/Iterable
      60: astore        5
      62: nop
      63: iconst_0
      64: istore        6
      66: aload         5
      68: astore        7
      70: new           #42                 // class java/util/ArrayList
      73: dup
      74: invokespecial #46                 // Method java/util/ArrayList."<init>":()V
      77: checkcast     #95                 // class java/util/Collection
      80: astore        8
      82: iconst_0
      83: istore        9
      85: aload         7
      87: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      92: astore        10
      94: aload         10
      96: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     101: ifeq          153
     104: aload         10
     106: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     111: astore        11
     113: aload         11
     115: checkcast     #9                  // class kotlin/Pair
     118: astore        12
     120: iconst_0
     121: istore        13
     123: aload         12
     125: invokestatic  #181                // Method getX:(Lkotlin/Pair;)I
     128: iload_3
     129: if_icmpne     136
     132: iconst_1
     133: goto          137
     136: iconst_0
     137: ifne          94
     140: aload         8
     142: aload         11
     144: invokeinterface #112,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     149: pop
     150: goto          94
     153: aload         8
     155: checkcast     #84                 // class java/util/List
     158: nop
     159: checkcast     #40                 // class java/lang/Iterable
     162: astore        5
     164: nop
     165: iconst_0
     166: istore        6
     168: new           #42                 // class java/util/ArrayList
     171: dup
     172: invokespecial #46                 // Method java/util/ArrayList."<init>":()V
     175: astore        7
     177: new           #42                 // class java/util/ArrayList
     180: dup
     181: invokespecial #46                 // Method java/util/ArrayList."<init>":()V
     184: astore        8
     186: aload         5
     188: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     193: astore        9
     195: aload         9
     197: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     202: ifeq          262
     205: aload         9
     207: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     212: astore        10
     214: aload         10
     216: checkcast     #9                  // class kotlin/Pair
     219: astore        11
     221: iconst_0
     222: istore        12
     224: aload         11
     226: invokestatic  #181                // Method getX:(Lkotlin/Pair;)I
     229: iload_3
     230: if_icmpge     237
     233: iconst_1
     234: goto          238
     237: iconst_0
     238: ifeq          251
     241: aload         7
     243: aload         10
     245: invokevirtual #82                 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
     248: goto          258
     251: aload         8
     253: aload         10
     255: invokevirtual #82                 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
     258: pop
     259: goto          195
     262: new           #9                  // class kotlin/Pair
     265: dup
     266: aload         7
     268: aload         8
     270: invokespecial #136                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     273: astore        4
     275: aload         4
     277: invokevirtual #172                // Method kotlin/Pair.component1:()Ljava/lang/Object;
     280: checkcast     #84                 // class java/util/List
     283: astore        5
     285: aload         4
     287: invokevirtual #179                // Method kotlin/Pair.component2:()Ljava/lang/Object;
     290: checkcast     #84                 // class java/util/List
     293: astore        6
     295: aload         5
     297: checkcast     #95                 // class java/util/Collection
     300: aload         6
     302: checkcast     #40                 // class java/lang/Iterable
     305: astore        7
     307: astore        16
     309: iconst_0
     310: istore        8
     312: aload         7
     314: astore        9
     316: new           #42                 // class java/util/ArrayList
     319: dup
     320: aload         7
     322: bipush        10
     324: invokestatic  #90                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     327: invokespecial #93                 // Method java/util/ArrayList."<init>":(I)V
     330: checkcast     #95                 // class java/util/Collection
     333: astore        10
     335: iconst_0
     336: istore        11
     338: aload         9
     340: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     345: astore        12
     347: aload         12
     349: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     354: ifeq          415
     357: aload         12
     359: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     364: astore        13
     366: aload         10
     368: aload         13
     370: checkcast     #9                  // class kotlin/Pair
     373: astore        14
     375: astore        17
     377: iconst_0
     378: istore        15
     380: iload_3
     381: aload         14
     383: invokestatic  #181                // Method getX:(Lkotlin/Pair;)I
     386: iload_3
     387: isub
     388: isub
     389: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     392: aload         14
     394: invokestatic  #183                // Method getY:(Lkotlin/Pair;)I
     397: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     400: invokestatic  #122                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     403: aload         17
     405: swap
     406: invokeinterface #112,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     411: pop
     412: goto          347
     415: aload         10
     417: checkcast     #84                 // class java/util/List
     420: nop
     421: aload         16
     423: swap
     424: checkcast     #40                 // class java/lang/Iterable
     427: invokestatic  #187                // Method kotlin/collections/CollectionsKt.plus:(Ljava/util/Collection;Ljava/lang/Iterable;)Ljava/util/List;
     430: checkcast     #40                 // class java/lang/Iterable
     433: invokestatic  #191                // Method kotlin/collections/CollectionsKt.distinct:(Ljava/lang/Iterable;)Ljava/util/List;
     436: goto          854
     439: aload_0
     440: checkcast     #40                 // class java/lang/Iterable
     443: astore        5
     445: nop
     446: iconst_0
     447: istore        6
     449: aload         5
     451: astore        7
     453: new           #42                 // class java/util/ArrayList
     456: dup
     457: invokespecial #46                 // Method java/util/ArrayList."<init>":()V
     460: checkcast     #95                 // class java/util/Collection
     463: astore        8
     465: iconst_0
     466: istore        9
     468: aload         7
     470: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     475: astore        10
     477: aload         10
     479: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     484: ifeq          536
     487: aload         10
     489: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     494: astore        11
     496: aload         11
     498: checkcast     #9                  // class kotlin/Pair
     501: astore        12
     503: iconst_0
     504: istore        13
     506: aload         12
     508: invokestatic  #183                // Method getY:(Lkotlin/Pair;)I
     511: iload_3
     512: if_icmpne     519
     515: iconst_1
     516: goto          520
     519: iconst_0
     520: ifne          477
     523: aload         8
     525: aload         11
     527: invokeinterface #112,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     532: pop
     533: goto          477
     536: aload         8
     538: checkcast     #84                 // class java/util/List
     541: nop
     542: checkcast     #40                 // class java/lang/Iterable
     545: astore        5
     547: nop
     548: iconst_0
     549: istore        6
     551: new           #42                 // class java/util/ArrayList
     554: dup
     555: invokespecial #46                 // Method java/util/ArrayList."<init>":()V
     558: astore        7
     560: new           #42                 // class java/util/ArrayList
     563: dup
     564: invokespecial #46                 // Method java/util/ArrayList."<init>":()V
     567: astore        8
     569: aload         5
     571: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     576: astore        9
     578: aload         9
     580: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     585: ifeq          645
     588: aload         9
     590: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     595: astore        10
     597: aload         10
     599: checkcast     #9                  // class kotlin/Pair
     602: astore        11
     604: iconst_0
     605: istore        12
     607: aload         11
     609: invokestatic  #183                // Method getY:(Lkotlin/Pair;)I
     612: iload_3
     613: if_icmpge     620
     616: iconst_1
     617: goto          621
     620: iconst_0
     621: ifeq          634
     624: aload         7
     626: aload         10
     628: invokevirtual #82                 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
     631: goto          641
     634: aload         8
     636: aload         10
     638: invokevirtual #82                 // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
     641: pop
     642: goto          578
     645: new           #9                  // class kotlin/Pair
     648: dup
     649: aload         7
     651: aload         8
     653: invokespecial #136                // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
     656: astore        4
     658: aload         4
     660: invokevirtual #172                // Method kotlin/Pair.component1:()Ljava/lang/Object;
     663: checkcast     #84                 // class java/util/List
     666: astore        5
     668: aload         4
     670: invokevirtual #179                // Method kotlin/Pair.component2:()Ljava/lang/Object;
     673: checkcast     #84                 // class java/util/List
     676: astore        6
     678: aload         5
     680: checkcast     #95                 // class java/util/Collection
     683: aload         6
     685: checkcast     #40                 // class java/lang/Iterable
     688: astore        7
     690: astore        16
     692: iconst_0
     693: istore        8
     695: aload         7
     697: astore        9
     699: new           #42                 // class java/util/ArrayList
     702: dup
     703: aload         7
     705: bipush        10
     707: invokestatic  #90                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     710: invokespecial #93                 // Method java/util/ArrayList."<init>":(I)V
     713: checkcast     #95                 // class java/util/Collection
     716: astore        10
     718: iconst_0
     719: istore        11
     721: aload         9
     723: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     728: astore        12
     730: aload         12
     732: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     737: ifeq          798
     740: aload         12
     742: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     747: astore        13
     749: aload         10
     751: aload         13
     753: checkcast     #9                  // class kotlin/Pair
     756: astore        14
     758: astore        17
     760: iconst_0
     761: istore        15
     763: aload         14
     765: invokestatic  #181                // Method getX:(Lkotlin/Pair;)I
     768: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     771: iload_3
     772: aload         14
     774: invokestatic  #183                // Method getY:(Lkotlin/Pair;)I
     777: iload_3
     778: isub
     779: isub
     780: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     783: invokestatic  #122                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     786: aload         17
     788: swap
     789: invokeinterface #112,  2          // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     794: pop
     795: goto          730
     798: aload         10
     800: checkcast     #84                 // class java/util/List
     803: nop
     804: aload         16
     806: swap
     807: checkcast     #40                 // class java/lang/Iterable
     810: invokestatic  #187                // Method kotlin/collections/CollectionsKt.plus:(Ljava/util/Collection;Ljava/lang/Iterable;)Ljava/util/List;
     813: checkcast     #40                 // class java/lang/Iterable
     816: invokestatic  #191                // Method kotlin/collections/CollectionsKt.distinct:(Ljava/lang/Iterable;)Ljava/util/List;
     819: goto          854
     822: ldc           #193                // String Not supported axis :)
     824: astore        4
     826: new           #195                // class kotlin/NotImplementedError
     829: dup
     830: new           #197                // class java/lang/StringBuilder
     833: dup
     834: invokespecial #198                // Method java/lang/StringBuilder."<init>":()V
     837: ldc           #200                // String An operation is not implemented:
     839: invokevirtual #204                // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     842: aload         4
     844: invokevirtual #204                // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     847: invokevirtual #208                // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     850: invokespecial #211                // Method kotlin/NotImplementedError."<init>":(Ljava/lang/String;)V
     853: athrow
     854: areturn

  public static final int countVisibleDotsAfterFolding(java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>, java.util.List<kotlin.Pair<java.lang.Character, java.lang.Integer>>);
    Code:
       0: aload_0
       1: ldc           #167                // String dots
       3: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #236                // String paperFolds
       9: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_1
      13: checkcast     #40                 // class java/lang/Iterable
      16: astore_2
      17: iconst_0
      18: istore_3
      19: aload_0
      20: astore        4
      22: aload_2
      23: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      28: astore        5
      30: aload         5
      32: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      37: ifeq          75
      40: aload         5
      42: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      47: astore        6
      49: aload         4
      51: aload         6
      53: checkcast     #9                  // class kotlin/Pair
      56: astore        7
      58: astore        8
      60: iconst_0
      61: istore        9
      63: aload         8
      65: aload         7
      67: invokestatic  #238                // Method fold:(Ljava/util/List;Lkotlin/Pair;)Ljava/util/List;
      70: astore        4
      72: goto          30
      75: aload         4
      77: invokeinterface #125,  1          // InterfaceMethod java/util/List.size:()I
      82: ireturn

  public static final int countVisibleDotsAfterFirstFolding(java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>, java.util.List<kotlin.Pair<java.lang.Character, java.lang.Integer>>);
    Code:
       0: aload_0
       1: ldc           #167                // String dots
       3: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #236                // String paperFolds
       9: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_0
      13: aload_1
      14: invokestatic  #247                // Method kotlin/collections/CollectionsKt.first:(Ljava/util/List;)Ljava/lang/Object;
      17: checkcast     #9                  // class kotlin/Pair
      20: invokestatic  #238                // Method fold:(Ljava/util/List;Lkotlin/Pair;)Ljava/util/List;
      23: invokeinterface #125,  1          // InterfaceMethod java/util/List.size:()I
      28: ireturn

  public static final void printAfterAllFolds(java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>, java.util.List<kotlin.Pair<java.lang.Character, java.lang.Integer>>);
    Code:
       0: aload_0
       1: ldc           #167                // String dots
       3: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_1
       7: ldc           #236                // String paperFolds
       9: invokestatic  #38                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
      12: aload_1
      13: checkcast     #40                 // class java/lang/Iterable
      16: astore_2
      17: iconst_0
      18: istore_3
      19: aload_0
      20: astore        4
      22: aload_2
      23: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      28: astore        5
      30: aload         5
      32: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      37: ifeq          75
      40: aload         5
      42: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      47: astore        6
      49: aload         4
      51: aload         6
      53: checkcast     #9                  // class kotlin/Pair
      56: astore        7
      58: astore        8
      60: iconst_0
      61: istore        9
      63: aload         8
      65: aload         7
      67: invokestatic  #238                // Method fold:(Ljava/util/List;Lkotlin/Pair;)Ljava/util/List;
      70: astore        4
      72: goto          30
      75: aload         4
      77: invokestatic  #254                // Method printAfterAllFolds$print:(Ljava/util/List;)V
      80: return

  public static final void main();
    Code:
       0: new           #260                // class java/io/File
       3: dup
       4: ldc_w         #262                // String ./input/day13.txt
       7: invokespecial #263                // Method java/io/File."<init>":(Ljava/lang/String;)V
      10: astore_0
      11: getstatic     #269                // Field kotlin/text/Charsets.UTF_8:Ljava/nio/charset/Charset;
      14: astore_1
      15: iconst_0
      16: istore_2
      17: aload_0
      18: astore_3
      19: sipush        8192
      22: istore        4
      24: aload_3
      25: astore        5
      27: new           #271                // class java/io/InputStreamReader
      30: dup
      31: new           #273                // class java/io/FileInputStream
      34: dup
      35: aload         5
      37: invokespecial #276                // Method java/io/FileInputStream."<init>":(Ljava/io/File;)V
      40: checkcast     #278                // class java/io/InputStream
      43: aload_1
      44: invokespecial #281                // Method java/io/InputStreamReader."<init>":(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
      47: checkcast     #283                // class java/io/Reader
      50: astore        5
      52: aload         5
      54: instanceof    #285                // class java/io/BufferedReader
      57: ifeq          68
      60: aload         5
      62: checkcast     #285                // class java/io/BufferedReader
      65: goto          79
      68: new           #285                // class java/io/BufferedReader
      71: dup
      72: aload         5
      74: iload         4
      76: invokespecial #288                // Method java/io/BufferedReader."<init>":(Ljava/io/Reader;I)V
      79: checkcast     #290                // class java/io/Closeable
      82: astore_3
      83: aconst_null
      84: astore        4
      86: nop
      87: aload_3
      88: checkcast     #285                // class java/io/BufferedReader
      91: astore        5
      93: iconst_0
      94: istore        6
      96: aload         5
      98: invokestatic  #296                // Method kotlin/io/TextStreamsKt.lineSequence:(Ljava/io/BufferedReader;)Lkotlin/sequences/Sequence;
     101: astore        7
     103: iconst_0
     104: istore        8
     106: aload         7
     108: invokestatic  #302                // Method kotlin/sequences/SequencesKt.toList:(Lkotlin/sequences/Sequence;)Ljava/util/List;
     111: invokestatic  #304                // Method parseInput:(Ljava/util/List;)Lkotlin/Pair;
     114: astore        9
     116: aload         9
     118: invokevirtual #172                // Method kotlin/Pair.component1:()Ljava/lang/Object;
     121: checkcast     #84                 // class java/util/List
     124: astore        10
     126: aload         9
     128: invokevirtual #179                // Method kotlin/Pair.component2:()Ljava/lang/Object;
     131: checkcast     #84                 // class java/util/List
     134: astore        11
     136: aload         10
     138: aload         11
     140: invokestatic  #306                // Method countVisibleDotsAfterFirstFolding:(Ljava/util/List;Ljava/util/List;)I
     143: istore        12
     145: getstatic     #312                // Field java/lang/System.out:Ljava/io/PrintStream;
     148: iload         12
     150: invokevirtual #317                // Method java/io/PrintStream.println:(I)V
     153: aload         10
     155: aload         11
     157: invokestatic  #319                // Method printAfterAllFolds:(Ljava/util/List;Ljava/util/List;)V
     160: nop
     161: getstatic     #325                // Field kotlin/Unit.INSTANCE:Lkotlin/Unit;
     164: astore        5
     166: aload_3
     167: aload         4
     169: invokestatic  #331                // Method kotlin/io/CloseableKt.closeFinally:(Ljava/io/Closeable;Ljava/lang/Throwable;)V
     172: goto          195
     175: astore        6
     177: aload         6
     179: astore        4
     181: aload         6
     183: athrow
     184: astore        6
     186: aload_3
     187: aload         4
     189: invokestatic  #331                // Method kotlin/io/CloseableKt.closeFinally:(Ljava/io/Closeable;Ljava/lang/Throwable;)V
     192: aload         6
     194: athrow
     195: nop
     196: return
    Exception table:
       from    to  target type
          86   166   175   Class java/lang/Throwable
          86   166   184   any
         175   184   184   any
         184   186   184   any

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

  private static final kotlin.Pair<java.lang.Character, java.lang.Integer> parseInput$extractAxisAndValue(java.lang.String);
    Code:
       0: aload_0
       1: checkcast     #63                 // class java/lang/CharSequence
       4: iconst_1
       5: anewarray     #61                 // class java/lang/String
       8: astore_2
       9: aload_2
      10: iconst_0
      11: ldc_w         #353                // String =
      14: aastore
      15: aload_2
      16: iconst_0
      17: iconst_0
      18: bipush        6
      20: aconst_null
      21: invokestatic  #101                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      24: astore_1
      25: aload_1
      26: iconst_0
      27: invokeinterface #116,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      32: checkcast     #61                 // class java/lang/String
      35: astore_2
      36: aload_1
      37: iconst_1
      38: invokeinterface #116,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
      43: checkcast     #61                 // class java/lang/String
      46: astore_3
      47: aload_2
      48: checkcast     #63                 // class java/lang/CharSequence
      51: invokestatic  #356                // Method kotlin/text/StringsKt.last:(Ljava/lang/CharSequence;)C
      54: invokestatic  #359                // Method java/lang/Character.valueOf:(C)Ljava/lang/Character;
      57: aload_3
      58: invokestatic  #107                // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
      61: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      64: invokestatic  #122                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
      67: areturn

  private static final void printAfterAllFolds$print(java.util.List<kotlin.Pair<java.lang.Integer, java.lang.Integer>>);
    Code:
       0: aload_0
       1: checkcast     #40                 // class java/lang/Iterable
       4: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
       9: astore_3
      10: aload_3
      11: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      16: ifne          27
      19: new           #364                // class java/util/NoSuchElementException
      22: dup
      23: invokespecial #365                // Method java/util/NoSuchElementException."<init>":()V
      26: athrow
      27: aload_3
      28: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      33: checkcast     #9                  // class kotlin/Pair
      36: astore        4
      38: iconst_0
      39: istore        5
      41: aload         4
      43: invokestatic  #183                // Method getY:(Lkotlin/Pair;)I
      46: istore        4
      48: aload_3
      49: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      54: ifeq          92
      57: aload_3
      58: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      63: checkcast     #9                  // class kotlin/Pair
      66: astore        5
      68: iconst_0
      69: istore        6
      71: aload         5
      73: invokestatic  #183                // Method getY:(Lkotlin/Pair;)I
      76: istore        5
      78: iload         4
      80: iload         5
      82: if_icmpge     48
      85: iload         5
      87: istore        4
      89: goto          48
      92: iload         4
      94: istore_1
      95: aload_0
      96: checkcast     #40                 // class java/lang/Iterable
      99: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     104: astore        4
     106: aload         4
     108: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     113: ifne          124
     116: new           #364                // class java/util/NoSuchElementException
     119: dup
     120: invokespecial #365                // Method java/util/NoSuchElementException."<init>":()V
     123: athrow
     124: aload         4
     126: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     131: checkcast     #9                  // class kotlin/Pair
     134: astore        5
     136: iconst_0
     137: istore        6
     139: aload         5
     141: invokestatic  #181                // Method getX:(Lkotlin/Pair;)I
     144: istore        5
     146: aload         4
     148: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     153: ifeq          192
     156: aload         4
     158: invokeinterface #59,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     163: checkcast     #9                  // class kotlin/Pair
     166: astore        6
     168: iconst_0
     169: istore        7
     171: aload         6
     173: invokestatic  #181                // Method getX:(Lkotlin/Pair;)I
     176: istore        6
     178: iload         5
     180: iload         6
     182: if_icmpge     146
     185: iload         6
     187: istore        5
     189: goto          146
     192: iload         5
     194: istore_2
     195: new           #367                // class kotlin/ranges/IntRange
     198: dup
     199: iconst_0
     200: iload_1
     201: invokespecial #370                // Method kotlin/ranges/IntRange."<init>":(II)V
     204: checkcast     #40                 // class java/lang/Iterable
     207: astore_3
     208: iconst_0
     209: istore        4
     211: aload_3
     212: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     217: astore        5
     219: aload         5
     221: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     226: ifeq          365
     229: aload         5
     231: checkcast     #372                // class kotlin/collections/IntIterator
     234: invokevirtual #375                // Method kotlin/collections/IntIterator.nextInt:()I
     237: istore        6
     239: iload         6
     241: istore        7
     243: iconst_0
     244: istore        8
     246: new           #367                // class kotlin/ranges/IntRange
     249: dup
     250: iconst_0
     251: iload_2
     252: invokespecial #370                // Method kotlin/ranges/IntRange."<init>":(II)V
     255: checkcast     #40                 // class java/lang/Iterable
     258: astore        9
     260: iconst_0
     261: istore        10
     263: aload         9
     265: invokeinterface #50,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     270: astore        11
     272: aload         11
     274: invokeinterface #56,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     279: ifeq          353
     282: aload         11
     284: checkcast     #372                // class kotlin/collections/IntIterator
     287: invokevirtual #375                // Method kotlin/collections/IntIterator.nextInt:()I
     290: istore        12
     292: iload         12
     294: istore        13
     296: iconst_0
     297: istore        14
     299: aload_0
     300: iload         13
     302: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     305: iload         7
     307: invokestatic  #111                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     310: invokestatic  #122                // Method kotlin/TuplesKt.to:(Ljava/lang/Object;Ljava/lang/Object;)Lkotlin/Pair;
     313: invokeinterface #378,  2          // InterfaceMethod java/util/List.contains:(Ljava/lang/Object;)Z
     318: ifeq          336
     321: bipush        35
     323: istore        15
     325: getstatic     #312                // Field java/lang/System.out:Ljava/io/PrintStream;
     328: iload         15
     330: invokevirtual #382                // Method java/io/PrintStream.print:(C)V
     333: goto          348
     336: bipush        46
     338: istore        15
     340: getstatic     #312                // Field java/lang/System.out:Ljava/io/PrintStream;
     343: iload         15
     345: invokevirtual #382                // Method java/io/PrintStream.print:(C)V
     348: nop
     349: nop
     350: goto          272
     353: nop
     354: getstatic     #312                // Field java/lang/System.out:Ljava/io/PrintStream;
     357: invokevirtual #384                // Method java/io/PrintStream.println:()V
     360: nop
     361: nop
     362: goto          219
     365: nop
     366: return
}


package day22

import java.io.File

private const val OFF = false
private const val ON = true

typealias Cube = Triple<Int, Int, Int>

data class RebootStep(val x: IntRange, val y: IntRange, val z: IntRange, val state: Boolean)

data class LitRegion(val x: IntRange, val y: IntRange, val z: IntRange) {
  private fun isEmptyRegion(): Boolean = x.isEmpty() || y.isEmpty() || z.isEmpty()
  private fun overlapsWith(other: LitRegion): Boolean = TODO()
  fun subtract(other: LitRegion): List<LitRegion> {
    if (other.isEmptyRegion() || !overlapsWith(other)) return listOf(this)
    else {
      TODO()
    }
  }
}

fun parseInput(lines: List<String>): List<RebootStep> {
  fun parseRange(range: String): IntRange {
    val (n1, n2) = range.split("..").map(String::toInt)
    return n1..n2
  }

  fun extractRanges(ranges: String): Triple<IntRange, IntRange, IntRange> {
    val (x, y, z) = ranges.split(",").map { parseRange(it.drop(2)) }
    return Triple(x, y, z)
  }
  return lines.map { line ->
    when {
      line.startsWith("on") -> {
        val (x, y, z) = extractRanges(line.removePrefix("on "))
        RebootStep(x, y, z, ON)
      }
      line.startsWith("off") -> {
        val (x, y, z) = extractRanges(line.removePrefix("off "))
        RebootStep(x, y, z, OFF)
      }
      else -> TODO()
    }
  }
}

fun countCubesOnRestricted(steps: List<RebootStep>): Int {
  fun isOutOfRange(step: RebootStep): Boolean =
    listOf(step.x, step.y, step.z).any { it.first < -50 || it.last > 50 }

  val cubes = Array(101) { Array(101) { Array(101) { OFF } } }
  for (step in steps.filterNot(::isOutOfRange)) {
    step.x.forEach { x ->
      step.y.forEach { y ->
        step.z.forEach { z ->
          cubes[x + 50][y + 50][z + 50] = step.state
        }
      }
    }
  }
  return cubes.sumOf { it.sumOf { it.count { it == ON } } }
}

fun countCubesUnbounded(steps: List<RebootStep>): Long {
  val cubesOn = HashSet<Cube>()
  for (step in steps) {
    println(step)
    val cubes = step.x.flatMap { x -> step.y.flatMap { y -> step.z.map { z -> Cube(x, y, z) } } }
    if (step.state == ON) cubesOn.addAll(cubes)
    else cubesOn.removeAll(cubes)
  }
  return cubesOn.sumOf { 1L }
}

fun main() {
  File("./input/day22.txt").useLines { lines ->
    val rebootSteps = parseInput(lines.toList())
    println(countCubesOnRestricted(rebootSteps))
  }
}

Compiled from "Day22.kt"
public final class day22.Day22Kt {
  private static final boolean OFF;

  private static final boolean ON;

  public static final java.util.List<day22.RebootStep> parseInput(java.util.List<java.lang.String>);
    Code:
       0: aload_0
       1: ldc           #10                 // String lines
       3: invokestatic  #16                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: aload_0
       7: checkcast     #18                 // class java/lang/Iterable
      10: astore_1
      11: iconst_0
      12: istore_2
      13: aload_1
      14: astore_3
      15: new           #20                 // class java/util/ArrayList
      18: dup
      19: aload_1
      20: bipush        10
      22: invokestatic  #26                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      25: invokespecial #30                 // Method java/util/ArrayList."<init>":(I)V
      28: checkcast     #32                 // class java/util/Collection
      31: astore        4
      33: iconst_0
      34: istore        5
      36: aload_3
      37: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      42: astore        6
      44: aload         6
      46: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      51: ifeq          252
      54: aload         6
      56: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      61: astore        7
      63: aload         4
      65: aload         7
      67: checkcast     #48                 // class java/lang/String
      70: astore        8
      72: astore        14
      74: iconst_0
      75: istore        9
      77: nop
      78: aload         8
      80: ldc           #50                 // String on
      82: iconst_0
      83: iconst_2
      84: aconst_null
      85: invokestatic  #56                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
      88: ifeq          153
      91: aload         8
      93: ldc           #58                 // String on
      95: checkcast     #60                 // class java/lang/CharSequence
      98: invokestatic  #64                 // Method kotlin/text/StringsKt.removePrefix:(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String;
     101: invokestatic  #68                 // Method parseInput$extractRanges:(Ljava/lang/String;)Lkotlin/Triple;
     104: astore        10
     106: aload         10
     108: invokevirtual #73                 // Method kotlin/Triple.component1:()Ljava/lang/Object;
     111: checkcast     #75                 // class kotlin/ranges/IntRange
     114: astore        11
     116: aload         10
     118: invokevirtual #78                 // Method kotlin/Triple.component2:()Ljava/lang/Object;
     121: checkcast     #75                 // class kotlin/ranges/IntRange
     124: astore        12
     126: aload         10
     128: invokevirtual #81                 // Method kotlin/Triple.component3:()Ljava/lang/Object;
     131: checkcast     #75                 // class kotlin/ranges/IntRange
     134: astore        13
     136: new           #83                 // class day22/RebootStep
     139: dup
     140: aload         11
     142: aload         12
     144: aload         13
     146: iconst_1
     147: invokespecial #86                 // Method day22/RebootStep."<init>":(Lkotlin/ranges/IntRange;Lkotlin/ranges/IntRange;Lkotlin/ranges/IntRange;Z)V
     150: goto          239
     153: aload         8
     155: ldc           #88                 // String off
     157: iconst_0
     158: iconst_2
     159: aconst_null
     160: invokestatic  #56                 // Method kotlin/text/StringsKt.startsWith$default:(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z
     163: ifeq          228
     166: aload         8
     168: ldc           #90                 // String off
     170: checkcast     #60                 // class java/lang/CharSequence
     173: invokestatic  #64                 // Method kotlin/text/StringsKt.removePrefix:(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String;
     176: invokestatic  #68                 // Method parseInput$extractRanges:(Ljava/lang/String;)Lkotlin/Triple;
     179: astore        10
     181: aload         10
     183: invokevirtual #73                 // Method kotlin/Triple.component1:()Ljava/lang/Object;
     186: checkcast     #75                 // class kotlin/ranges/IntRange
     189: astore        11
     191: aload         10
     193: invokevirtual #78                 // Method kotlin/Triple.component2:()Ljava/lang/Object;
     196: checkcast     #75                 // class kotlin/ranges/IntRange
     199: astore        12
     201: aload         10
     203: invokevirtual #81                 // Method kotlin/Triple.component3:()Ljava/lang/Object;
     206: checkcast     #75                 // class kotlin/ranges/IntRange
     209: astore        13
     211: new           #83                 // class day22/RebootStep
     214: dup
     215: aload         11
     217: aload         12
     219: aload         13
     221: iconst_0
     222: invokespecial #86                 // Method day22/RebootStep."<init>":(Lkotlin/ranges/IntRange;Lkotlin/ranges/IntRange;Lkotlin/ranges/IntRange;Z)V
     225: goto          239
     228: new           #92                 // class kotlin/NotImplementedError
     231: dup
     232: aconst_null
     233: iconst_1
     234: aconst_null
     235: invokespecial #95                 // Method kotlin/NotImplementedError."<init>":(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
     238: athrow
     239: nop
     240: aload         14
     242: swap
     243: invokeinterface #99,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     248: pop
     249: goto          44
     252: aload         4
     254: checkcast     #101                // class java/util/List
     257: nop
     258: areturn

  public static final int countCubesOnRestricted(java.util.List<day22.RebootStep>);
    Code:
       0: aload_0
       1: ldc           #124                // String steps
       3: invokestatic  #16                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: iconst_0
       7: istore_2
       8: bipush        101
      10: anewarray     #126                // class "[[Ljava/lang/Boolean;"
      13: astore_3
      14: iload_2
      15: bipush        101
      17: if_icmpge     121
      20: iload_2
      21: istore        4
      23: aload_3
      24: iload         4
      26: iconst_0
      27: istore        5
      29: bipush        101
      31: anewarray     #128                // class "[Ljava/lang/Boolean;"
      34: astore        6
      36: istore        27
      38: astore        26
      40: iload         5
      42: bipush        101
      44: if_icmpge     108
      47: iload         5
      49: istore        7
      51: aload         6
      53: iload         7
      55: iconst_0
      56: istore        8
      58: bipush        101
      60: anewarray     #130                // class java/lang/Boolean
      63: astore        9
      65: istore        29
      67: astore        28
      69: iload         8
      71: bipush        101
      73: if_icmpge     95
      76: iload         8
      78: istore        10
      80: aload         9
      82: iload         10
      84: iconst_0
      85: invokestatic  #134                // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
      88: aastore
      89: iinc          8, 1
      92: goto          69
      95: aload         28
      97: iload         29
      99: aload         9
     101: aastore
     102: iinc          5, 1
     105: goto          40
     108: aload         26
     110: iload         27
     112: aload         6
     114: aastore
     115: iinc          2, 1
     118: goto          14
     121: aload_3
     122: astore_1
     123: aload_0
     124: checkcast     #18                 // class java/lang/Iterable
     127: astore_3
     128: iconst_0
     129: istore        4
     131: aload_3
     132: astore        5
     134: new           #20                 // class java/util/ArrayList
     137: dup
     138: invokespecial #137                // Method java/util/ArrayList."<init>":()V
     141: checkcast     #32                 // class java/util/Collection
     144: astore        6
     146: iconst_0
     147: istore        7
     149: aload         5
     151: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     156: astore        8
     158: aload         8
     160: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     165: ifeq          208
     168: aload         8
     170: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     175: astore        9
     177: aload         9
     179: checkcast     #83                 // class day22/RebootStep
     182: astore        10
     184: iconst_0
     185: istore        11
     187: aload         10
     189: invokestatic  #141                // Method countCubesOnRestricted$isOutOfRange:(Lday22/RebootStep;)Z
     192: ifne          158
     195: aload         6
     197: aload         9
     199: invokeinterface #99,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     204: pop
     205: goto          158
     208: aload         6
     210: checkcast     #101                // class java/util/List
     213: nop
     214: invokeinterface #142,  1          // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
     219: astore_2
     220: aload_2
     221: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     226: ifeq          430
     229: aload_2
     230: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     235: checkcast     #83                 // class day22/RebootStep
     238: astore_3
     239: aload_3
     240: invokevirtual #146                // Method day22/RebootStep.getX:()Lkotlin/ranges/IntRange;
     243: checkcast     #18                 // class java/lang/Iterable
     246: astore        4
     248: iconst_0
     249: istore        5
     251: aload         4
     253: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     258: astore        6
     260: aload         6
     262: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     267: ifeq          426
     270: aload         6
     272: checkcast     #148                // class kotlin/collections/IntIterator
     275: invokevirtual #152                // Method kotlin/collections/IntIterator.nextInt:()I
     278: istore        7
     280: iload         7
     282: istore        8
     284: iconst_0
     285: istore        9
     287: aload_3
     288: invokevirtual #155                // Method day22/RebootStep.getY:()Lkotlin/ranges/IntRange;
     291: checkcast     #18                 // class java/lang/Iterable
     294: astore        10
     296: iconst_0
     297: istore        11
     299: aload         10
     301: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     306: astore        12
     308: aload         12
     310: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     315: ifeq          420
     318: aload         12
     320: checkcast     #148                // class kotlin/collections/IntIterator
     323: invokevirtual #152                // Method kotlin/collections/IntIterator.nextInt:()I
     326: istore        13
     328: iload         13
     330: istore        14
     332: iconst_0
     333: istore        15
     335: aload_3
     336: invokevirtual #158                // Method day22/RebootStep.getZ:()Lkotlin/ranges/IntRange;
     339: checkcast     #18                 // class java/lang/Iterable
     342: astore        16
     344: iconst_0
     345: istore        17
     347: aload         16
     349: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     354: astore        18
     356: aload         18
     358: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     363: ifeq          414
     366: aload         18
     368: checkcast     #148                // class kotlin/collections/IntIterator
     371: invokevirtual #152                // Method kotlin/collections/IntIterator.nextInt:()I
     374: istore        19
     376: iload         19
     378: istore        20
     380: iconst_0
     381: istore        21
     383: aload_1
     384: iload         8
     386: bipush        50
     388: iadd
     389: aaload
     390: iload         14
     392: bipush        50
     394: iadd
     395: aaload
     396: iload         20
     398: bipush        50
     400: iadd
     401: aload_3
     402: invokevirtual #161                // Method day22/RebootStep.getState:()Z
     405: invokestatic  #134                // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
     408: aastore
     409: nop
     410: nop
     411: goto          356
     414: nop
     415: nop
     416: nop
     417: goto          308
     420: nop
     421: nop
     422: nop
     423: goto          260
     426: nop
     427: goto          220
     430: aload_1
     431: checkcast     #163                // class "[Ljava/lang/Object;"
     434: astore_2
     435: iconst_0
     436: istore_3
     437: iconst_0
     438: istore        4
     440: aload_2
     441: arraylength
     442: istore        5
     444: iload         4
     446: iload         5
     448: if_icmpge     616
     451: aload_2
     452: iload         4
     454: aaload
     455: astore        6
     457: iload_3
     458: aload         6
     460: checkcast     #126                // class "[[Ljava/lang/Boolean;"
     463: astore        7
     465: istore        26
     467: iconst_0
     468: istore        8
     470: aload         7
     472: checkcast     #163                // class "[Ljava/lang/Object;"
     475: astore        9
     477: iconst_0
     478: istore        10
     480: iconst_0
     481: istore        11
     483: aload         9
     485: arraylength
     486: istore        12
     488: iload         11
     490: iload         12
     492: if_icmpge     599
     495: aload         9
     497: iload         11
     499: aaload
     500: astore        13
     502: iload         10
     504: aload         13
     506: checkcast     #128                // class "[Ljava/lang/Boolean;"
     509: astore        14
     511: istore        15
     513: iconst_0
     514: istore        16
     516: aload         14
     518: astore        17
     520: iconst_0
     521: istore        18
     523: iconst_0
     524: istore        19
     526: iconst_0
     527: istore        20
     529: aload         17
     531: arraylength
     532: istore        21
     534: iload         20
     536: iload         21
     538: if_icmpge     581
     541: aload         17
     543: iload         20
     545: aaload
     546: astore        22
     548: aload         22
     550: invokevirtual #166                // Method java/lang/Boolean.booleanValue:()Z
     553: istore        23
     555: iconst_0
     556: istore        24
     558: iload         23
     560: iconst_1
     561: if_icmpne     568
     564: iconst_1
     565: goto          569
     568: iconst_0
     569: ifeq          575
     572: iinc          19, 1
     575: iinc          20, 1
     578: goto          534
     581: iload         19
     583: nop
     584: istore        25
     586: iload         15
     588: iload         25
     590: iadd
     591: istore        10
     593: iinc          11, 1
     596: goto          488
     599: iload         10
     601: nop
     602: istore        27
     604: iload         26
     606: iload         27
     608: iadd
     609: istore_3
     610: iinc          4, 1
     613: goto          444
     616: iload_3
     617: ireturn

  public static final long countCubesUnbounded(java.util.List<day22.RebootStep>);
    Code:
       0: aload_0
       1: ldc           #124                // String steps
       3: invokestatic  #16                 // Method kotlin/jvm/internal/Intrinsics.checkNotNullParameter:(Ljava/lang/Object;Ljava/lang/String;)V
       6: new           #197                // class java/util/HashSet
       9: dup
      10: invokespecial #198                // Method java/util/HashSet."<init>":()V
      13: astore_1
      14: aload_0
      15: invokeinterface #142,  1          // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
      20: astore_2
      21: aload_2
      22: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      27: ifeq          380
      30: aload_2
      31: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      36: checkcast     #83                 // class day22/RebootStep
      39: astore_3
      40: getstatic     #204                // Field java/lang/System.out:Ljava/io/PrintStream;
      43: aload_3
      44: invokevirtual #210                // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      47: aload_3
      48: invokevirtual #146                // Method day22/RebootStep.getX:()Lkotlin/ranges/IntRange;
      51: checkcast     #18                 // class java/lang/Iterable
      54: astore        5
      56: iconst_0
      57: istore        6
      59: aload         5
      61: astore        7
      63: new           #20                 // class java/util/ArrayList
      66: dup
      67: invokespecial #137                // Method java/util/ArrayList."<init>":()V
      70: checkcast     #32                 // class java/util/Collection
      73: astore        8
      75: iconst_0
      76: istore        9
      78: aload         7
      80: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      85: astore        10
      87: aload         10
      89: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      94: ifeq          339
      97: aload         10
      99: checkcast     #148                // class kotlin/collections/IntIterator
     102: invokevirtual #152                // Method kotlin/collections/IntIterator.nextInt:()I
     105: istore        11
     107: iload         11
     109: istore        12
     111: iconst_0
     112: istore        13
     114: aload_3
     115: invokevirtual #155                // Method day22/RebootStep.getY:()Lkotlin/ranges/IntRange;
     118: checkcast     #18                 // class java/lang/Iterable
     121: astore        14
     123: iconst_0
     124: istore        15
     126: aload         14
     128: astore        16
     130: new           #20                 // class java/util/ArrayList
     133: dup
     134: invokespecial #137                // Method java/util/ArrayList."<init>":()V
     137: checkcast     #32                 // class java/util/Collection
     140: astore        17
     142: iconst_0
     143: istore        18
     145: aload         16
     147: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     152: astore        19
     154: aload         19
     156: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     161: ifeq          316
     164: aload         19
     166: checkcast     #148                // class kotlin/collections/IntIterator
     169: invokevirtual #152                // Method kotlin/collections/IntIterator.nextInt:()I
     172: istore        20
     174: iload         20
     176: istore        21
     178: iconst_0
     179: istore        22
     181: aload_3
     182: invokevirtual #158                // Method day22/RebootStep.getZ:()Lkotlin/ranges/IntRange;
     185: checkcast     #18                 // class java/lang/Iterable
     188: astore        23
     190: iconst_0
     191: istore        24
     193: aload         23
     195: astore        25
     197: new           #20                 // class java/util/ArrayList
     200: dup
     201: aload         23
     203: bipush        10
     205: invokestatic  #26                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
     208: invokespecial #30                 // Method java/util/ArrayList."<init>":(I)V
     211: checkcast     #32                 // class java/util/Collection
     214: astore        26
     216: iconst_0
     217: istore        27
     219: aload         25
     221: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     226: astore        28
     228: aload         28
     230: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     235: ifeq          293
     238: aload         28
     240: checkcast     #148                // class kotlin/collections/IntIterator
     243: invokevirtual #152                // Method kotlin/collections/IntIterator.nextInt:()I
     246: istore        29
     248: aload         26
     250: iload         29
     252: istore        30
     254: astore        31
     256: iconst_0
     257: istore        32
     259: new           #70                 // class kotlin/Triple
     262: dup
     263: iload         12
     265: invokestatic  #215                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     268: iload         21
     270: invokestatic  #215                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     273: iload         30
     275: invokestatic  #215                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     278: invokespecial #218                // Method kotlin/Triple."<init>":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
     281: aload         31
     283: swap
     284: invokeinterface #99,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     289: pop
     290: goto          228
     293: aload         26
     295: checkcast     #101                // class java/util/List
     298: nop
     299: checkcast     #18                 // class java/lang/Iterable
     302: nop
     303: astore        21
     305: aload         17
     307: aload         21
     309: invokestatic  #222                // Method kotlin/collections/CollectionsKt.addAll:(Ljava/util/Collection;Ljava/lang/Iterable;)Z
     312: pop
     313: goto          154
     316: aload         17
     318: checkcast     #101                // class java/util/List
     321: nop
     322: checkcast     #18                 // class java/lang/Iterable
     325: nop
     326: astore        12
     328: aload         8
     330: aload         12
     332: invokestatic  #222                // Method kotlin/collections/CollectionsKt.addAll:(Ljava/util/Collection;Ljava/lang/Iterable;)Z
     335: pop
     336: goto          87
     339: aload         8
     341: checkcast     #101                // class java/util/List
     344: nop
     345: astore        4
     347: aload_3
     348: invokevirtual #161                // Method day22/RebootStep.getState:()Z
     351: iconst_1
     352: if_icmpne     367
     355: aload_1
     356: aload         4
     358: checkcast     #32                 // class java/util/Collection
     361: invokevirtual #225                // Method java/util/HashSet.addAll:(Ljava/util/Collection;)Z
     364: goto          376
     367: aload_1
     368: aload         4
     370: checkcast     #32                 // class java/util/Collection
     373: invokevirtual #228                // Method java/util/HashSet.removeAll:(Ljava/util/Collection;)Z
     376: pop
     377: goto          21
     380: aload_1
     381: checkcast     #18                 // class java/lang/Iterable
     384: astore_2
     385: lconst_0
     386: lstore_3
     387: aload_2
     388: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
     393: astore        5
     395: aload         5
     397: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
     402: ifeq          439
     405: aload         5
     407: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
     412: astore        6
     414: lload_3
     415: aload         6
     417: checkcast     #70                 // class kotlin/Triple
     420: astore        7
     422: lstore        33
     424: iconst_0
     425: istore        8
     427: lconst_1
     428: lstore        35
     430: lload         33
     432: lload         35
     434: ladd
     435: lstore_3
     436: goto          395
     439: lload_3
     440: lreturn

  public static final void main();
    Code:
       0: new           #245                // class java/io/File
       3: dup
       4: ldc           #247                // String ./input/day22.txt
       6: invokespecial #250                // Method java/io/File."<init>":(Ljava/lang/String;)V
       9: astore_0
      10: getstatic     #256                // Field kotlin/text/Charsets.UTF_8:Ljava/nio/charset/Charset;
      13: astore_1
      14: iconst_0
      15: istore_2
      16: aload_0
      17: astore_3
      18: sipush        8192
      21: istore        4
      23: aload_3
      24: astore        5
      26: new           #258                // class java/io/InputStreamReader
      29: dup
      30: new           #260                // class java/io/FileInputStream
      33: dup
      34: aload         5
      36: invokespecial #263                // Method java/io/FileInputStream."<init>":(Ljava/io/File;)V
      39: checkcast     #265                // class java/io/InputStream
      42: aload_1
      43: invokespecial #268                // Method java/io/InputStreamReader."<init>":(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
      46: checkcast     #270                // class java/io/Reader
      49: astore        5
      51: aload         5
      53: instanceof    #272                // class java/io/BufferedReader
      56: ifeq          67
      59: aload         5
      61: checkcast     #272                // class java/io/BufferedReader
      64: goto          78
      67: new           #272                // class java/io/BufferedReader
      70: dup
      71: aload         5
      73: iload         4
      75: invokespecial #275                // Method java/io/BufferedReader."<init>":(Ljava/io/Reader;I)V
      78: checkcast     #277                // class java/io/Closeable
      81: astore_3
      82: aconst_null
      83: astore        4
      85: nop
      86: aload_3
      87: checkcast     #272                // class java/io/BufferedReader
      90: astore        5
      92: iconst_0
      93: istore        6
      95: aload         5
      97: invokestatic  #283                // Method kotlin/io/TextStreamsKt.lineSequence:(Ljava/io/BufferedReader;)Lkotlin/sequences/Sequence;
     100: astore        7
     102: iconst_0
     103: istore        8
     105: aload         7
     107: invokestatic  #289                // Method kotlin/sequences/SequencesKt.toList:(Lkotlin/sequences/Sequence;)Ljava/util/List;
     110: invokestatic  #291                // Method parseInput:(Ljava/util/List;)Ljava/util/List;
     113: astore        9
     115: aload         9
     117: invokestatic  #293                // Method countCubesOnRestricted:(Ljava/util/List;)I
     120: istore        10
     122: getstatic     #204                // Field java/lang/System.out:Ljava/io/PrintStream;
     125: iload         10
     127: invokevirtual #295                // Method java/io/PrintStream.println:(I)V
     130: nop
     131: getstatic     #301                // Field kotlin/Unit.INSTANCE:Lkotlin/Unit;
     134: astore        5
     136: aload_3
     137: aload         4
     139: invokestatic  #307                // Method kotlin/io/CloseableKt.closeFinally:(Ljava/io/Closeable;Ljava/lang/Throwable;)V
     142: goto          165
     145: astore        6
     147: aload         6
     149: astore        4
     151: aload         6
     153: athrow
     154: astore        6
     156: aload_3
     157: aload         4
     159: invokestatic  #307                // Method kotlin/io/CloseableKt.closeFinally:(Ljava/io/Closeable;Ljava/lang/Throwable;)V
     162: aload         6
     164: athrow
     165: nop
     166: return
    Exception table:
       from    to  target type
          85   136   145   Class java/lang/Throwable
          85   136   154   any
         145   154   154   any
         154   156   154   any

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

  private static final kotlin.ranges.IntRange parseInput$parseRange(java.lang.String);
    Code:
       0: aload_0
       1: checkcast     #60                 // class java/lang/CharSequence
       4: iconst_1
       5: anewarray     #48                 // class java/lang/String
       8: astore_2
       9: aload_2
      10: iconst_0
      11: ldc_w         #330                // String ..
      14: aastore
      15: aload_2
      16: iconst_0
      17: iconst_0
      18: bipush        6
      20: aconst_null
      21: invokestatic  #334                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      24: checkcast     #18                 // class java/lang/Iterable
      27: astore_2
      28: iconst_0
      29: istore_3
      30: aload_2
      31: astore        4
      33: new           #20                 // class java/util/ArrayList
      36: dup
      37: aload_2
      38: bipush        10
      40: invokestatic  #26                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      43: invokespecial #30                 // Method java/util/ArrayList."<init>":(I)V
      46: checkcast     #32                 // class java/util/Collection
      49: astore        5
      51: iconst_0
      52: istore        6
      54: aload         4
      56: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      61: astore        7
      63: aload         7
      65: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      70: ifeq          117
      73: aload         7
      75: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      80: astore        8
      82: aload         5
      84: aload         8
      86: checkcast     #48                 // class java/lang/String
      89: astore        9
      91: astore        11
      93: iconst_0
      94: istore        10
      96: aload         9
      98: invokestatic  #338                // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     101: nop
     102: invokestatic  #215                // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
     105: aload         11
     107: swap
     108: invokeinterface #99,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     113: pop
     114: goto          63
     117: aload         5
     119: checkcast     #101                // class java/util/List
     122: nop
     123: astore_1
     124: aload_1
     125: iconst_0
     126: invokeinterface #342,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     131: checkcast     #344                // class java/lang/Number
     134: invokevirtual #347                // Method java/lang/Number.intValue:()I
     137: istore_2
     138: aload_1
     139: iconst_1
     140: invokeinterface #342,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     145: checkcast     #344                // class java/lang/Number
     148: invokevirtual #347                // Method java/lang/Number.intValue:()I
     151: istore_3
     152: new           #75                 // class kotlin/ranges/IntRange
     155: dup
     156: iload_2
     157: iload_3
     158: invokespecial #350                // Method kotlin/ranges/IntRange."<init>":(II)V
     161: areturn

  private static final kotlin.Triple<kotlin.ranges.IntRange, kotlin.ranges.IntRange, kotlin.ranges.IntRange> parseInput$extractRanges(java.lang.String);
    Code:
       0: aload_0
       1: checkcast     #60                 // class java/lang/CharSequence
       4: iconst_1
       5: anewarray     #48                 // class java/lang/String
       8: astore_2
       9: aload_2
      10: iconst_0
      11: ldc_w         #357                // String ,
      14: aastore
      15: aload_2
      16: iconst_0
      17: iconst_0
      18: bipush        6
      20: aconst_null
      21: invokestatic  #334                // Method kotlin/text/StringsKt.split$default:(Ljava/lang/CharSequence;[Ljava/lang/String;ZIILjava/lang/Object;)Ljava/util/List;
      24: checkcast     #18                 // class java/lang/Iterable
      27: astore_2
      28: iconst_0
      29: istore_3
      30: aload_2
      31: astore        4
      33: new           #20                 // class java/util/ArrayList
      36: dup
      37: aload_2
      38: bipush        10
      40: invokestatic  #26                 // Method kotlin/collections/CollectionsKt.collectionSizeOrDefault:(Ljava/lang/Iterable;I)I
      43: invokespecial #30                 // Method java/util/ArrayList."<init>":(I)V
      46: checkcast     #32                 // class java/util/Collection
      49: astore        5
      51: iconst_0
      52: istore        6
      54: aload         4
      56: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      61: astore        7
      63: aload         7
      65: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      70: ifeq          117
      73: aload         7
      75: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      80: astore        8
      82: aload         5
      84: aload         8
      86: checkcast     #48                 // class java/lang/String
      89: astore        9
      91: astore        11
      93: iconst_0
      94: istore        10
      96: aload         9
      98: iconst_2
      99: invokestatic  #361                // Method kotlin/text/StringsKt.drop:(Ljava/lang/String;I)Ljava/lang/String;
     102: invokestatic  #363                // Method parseInput$parseRange:(Ljava/lang/String;)Lkotlin/ranges/IntRange;
     105: aload         11
     107: swap
     108: invokeinterface #99,  2           // InterfaceMethod java/util/Collection.add:(Ljava/lang/Object;)Z
     113: pop
     114: goto          63
     117: aload         5
     119: checkcast     #101                // class java/util/List
     122: nop
     123: astore_1
     124: aload_1
     125: iconst_0
     126: invokeinterface #342,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     131: checkcast     #75                 // class kotlin/ranges/IntRange
     134: astore_2
     135: aload_1
     136: iconst_1
     137: invokeinterface #342,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     142: checkcast     #75                 // class kotlin/ranges/IntRange
     145: astore_3
     146: aload_1
     147: iconst_2
     148: invokeinterface #342,  2          // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
     153: checkcast     #75                 // class kotlin/ranges/IntRange
     156: astore        4
     158: new           #70                 // class kotlin/Triple
     161: dup
     162: aload_2
     163: aload_3
     164: aload         4
     166: invokespecial #218                // Method kotlin/Triple."<init>":(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
     169: areturn

  private static final boolean countCubesOnRestricted$isOutOfRange(day22.RebootStep);
    Code:
       0: iconst_3
       1: anewarray     #75                 // class kotlin/ranges/IntRange
       4: astore_1
       5: aload_1
       6: iconst_0
       7: aload_0
       8: invokevirtual #146                // Method day22/RebootStep.getX:()Lkotlin/ranges/IntRange;
      11: aastore
      12: aload_1
      13: iconst_1
      14: aload_0
      15: invokevirtual #155                // Method day22/RebootStep.getY:()Lkotlin/ranges/IntRange;
      18: aastore
      19: aload_1
      20: iconst_2
      21: aload_0
      22: invokevirtual #158                // Method day22/RebootStep.getZ:()Lkotlin/ranges/IntRange;
      25: aastore
      26: aload_1
      27: invokestatic  #369                // Method kotlin/collections/CollectionsKt.listOf:([Ljava/lang/Object;)Ljava/util/List;
      30: checkcast     #18                 // class java/lang/Iterable
      33: astore_1
      34: iconst_0
      35: istore_2
      36: aload_1
      37: instanceof    #32                 // class java/util/Collection
      40: ifeq          59
      43: aload_1
      44: checkcast     #32                 // class java/util/Collection
      47: invokeinterface #372,  1          // InterfaceMethod java/util/Collection.isEmpty:()Z
      52: ifeq          59
      55: iconst_0
      56: goto          126
      59: aload_1
      60: invokeinterface #36,  1           // InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
      65: astore_3
      66: aload_3
      67: invokeinterface #42,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
      72: ifeq          125
      75: aload_3
      76: invokeinterface #46,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
      81: astore        4
      83: aload         4
      85: checkcast     #75                 // class kotlin/ranges/IntRange
      88: astore        5
      90: iconst_0
      91: istore        6
      93: aload         5
      95: invokevirtual #375                // Method kotlin/ranges/IntRange.getFirst:()I
      98: bipush        -50
     100: if_icmplt     113
     103: aload         5
     105: invokevirtual #378                // Method kotlin/ranges/IntRange.getLast:()I
     108: bipush        50
     110: if_icmple     117
     113: iconst_1
     114: goto          118
     117: iconst_0
     118: ifeq          66
     121: iconst_1
     122: goto          126
     125: iconst_0
     126: ireturn
}