#include <assert.h>
#include <errno.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <inttypes.h>
#include <unistd.h>

typedef enum Fighter {
  NONE, GIGACHAD, SHREK
} Fighter;

typedef enum OperationType {
  PUSH, POP, SWAP, DUP, SNGOP, BINOP, CALL, RET
} OperationType;

typedef struct Operation {
  union {
    long int value;
    long int (*sngop)(long int);
    long int (*binop)(long int, long int);
    size_t fun_id;
  };
  OperationType type;
} Operation;

#define MAX_FUNS  8
#define INSTR_BUF 256
#define STACK_BUF 0256
#define LINE_BUF  (1024 * 1024)

Fighter player = NONE;

size_t max_instrs = 16;
size_t max_stack_size = STACK_BUF;

size_t curr_function = 0;
char **names;
Operation *functions;
size_t *fun_lens;

Operation *instructions;
size_t instr_len;

long int *stack;
size_t stack_size;

char *buf;

bool push(long int value) {
  if (stack_size == max_stack_size) { return false; }
  stack[stack_size++] = value;
  return true;
}

bool pop(long int *value) {
  if (stack_size == 0) { return false; }
  *value = stack[--stack_size];
  return true;
}

bool r_interpret(Operation *instrs, size_t len) {
  if (len >= INSTR_BUF) {
    return false;
  }

  Operation *start_instrs = instrs;

  while (true) {
    long int v1;
    long int v2;
    switch (instrs->type) {
      case PUSH:
        if (!push(instrs->value)) { return false; }
        break;
      case POP:
        if (!pop(&v1)) { return false; }
        break;
      case DUP:
        if (!pop(&v1)) { return false; }
        if (!push(v1)) { return false; }
        if (!push(v1)) { return false; }
        break;
      case SWAP:
        if (!pop(&v1)) { return false; }
        if (!pop(&v2)) { return false; }
        if (!push(v1)) { return false; }
        if (!push(v2)) { return false; }
        break;
      case SNGOP:
        if (!pop(&v1)) { return false; }
        if (!push(instrs->sngop(v1))) { return false; }
        break;
      case BINOP:
        if (!pop(&v1)) { return false; }
        if (!pop(&v2)) { return false; }
        if (!push(instrs->binop(v1, v2))) { return false; }
        break;
      case CALL:
        if (!r_interpret(&functions[instrs->fun_id * INSTR_BUF], fun_lens[instrs->fun_id])) { return false; }
        break;
      case RET:
        return true;
    }

    instrs++;
  }
}

bool intrepret() {
  stack_size = 0;
  return r_interpret(instructions, instr_len);
}

long int sub(long int a, long int b) { return a - b; }
long int add(long int a, long int b) { return a + b; }
long int mul(long int a, long int b) { return a * b; }
long int dvd(long int a, long int b) { return a / b; }
long int neg(long int a) { return -a; }

bool parse(char *str) {
  char *token;
  size_t i = 0;
  while ((token = strtok(str, " ")) != NULL) {
    str = NULL;

    for (size_t j = 0; j < curr_function; j++) {
      if (strcmp(token, names[j]) == 0) {
        instructions[i].type = CALL;
        instructions[i].fun_id = j;
        goto next;
      }
    }

    char *end = &token[1];
    size_t indices_size = 0;
    if (token[0] != '\0' && token[1] == '\0') {
      switch (token[0]) {
        case '\'': instructions[i].type = POP;   goto next;
        case '=':  instructions[i].type = DUP;   goto next;
        case '$':  instructions[i].type = SWAP;  goto next;
        case '-':  instructions[i].type = BINOP; instructions[i].binop = sub;  goto next;
        case '+':  instructions[i].type = BINOP; instructions[i].binop = add;  goto next;
        case '*':  instructions[i].type = BINOP; instructions[i].binop = mul;  goto next;
        case '/':  instructions[i].type = BINOP; instructions[i].binop = dvd;  goto next;
        case '~':  instructions[i].type = SNGOP; instructions[i].sngop = neg;  goto next;
        case '|':  instructions[i].type = SNGOP; instructions[i].sngop = labs; goto next;
      }
    }

    errno = 0;
    long int value = strtoll(token, &end, 0);
    if (errno != 0 || *end != '\0') { return false; }

    instructions[i].type = PUSH;
    instructions[i].value = value;
    indices_size = 1;

next:
    i++;
    if (i == max_instrs - 1) { return false; }
  }

  instructions[i].type = RET;
  instr_len = i + 1;
  return true;
}

bool readline(char *buf) {
  for (size_t i = 0; i < LINE_BUF; i++) {
    long int c = getchar();
    if (c == EOF) { exit(1); }
    if (c == '\n') { buf[i] = '\0'; return true; }

    buf[i] = c;
  }

  return false;
}

void print_file(char *name, long int tamper1, long int tamper2);

void play(char *name) {
  if (player == NONE) {
    exit(1);
  }

  if (player == GIGACHAD) {
    long int message = 7233177252578945383;
    int res = write(STDOUT_FILENO, &message, 8);
    print_file("gigachad.txt", *(long int *)name, 0);
  }
}

void print_file(char *name, long int tamper1, long int tamper2) {
  if (tamper2 != 67) {
    return;
  }

  FILE *file = fopen(name, "r");
  if (tamper1 != 67) {
    fclose(file);
    play("f1.txt");
    return;
  }

  long int c;
  while ((c = getc(file)) != EOF) {
    putchar(c);
  }
  fclose(file);

  putchar('\n');
}

int main() {
  print_file("main.c", 67, 67);
  print_file("main.asm", 67, 67);

  setvbuf(stdout, NULL, _IONBF, 0);

  long int _stack[STACK_BUF];
  stack = _stack;

  fun_lens = malloc(MAX_FUNS * sizeof(char *));
  names = malloc(MAX_FUNS * sizeof(size_t));
  functions = malloc(MAX_FUNS * INSTR_BUF * sizeof(Operation));
  instructions = malloc(INSTR_BUF * sizeof(Operation));
  buf = malloc(LINE_BUF * sizeof(char));

  while (true) {
    printf("> ");
    if (!readline(buf)) {
      printf("Input too long\n");
      continue;
    }

    if ((buf[0] == '\0' || buf[1] != ' ' || (buf[0] != 'f' && buf[0] != 'r')) && buf[0] != 'o') {
      printf("Please input either 'f ' to create a function or 'r ' to run code\n");
      continue;
    }

    if (buf[0] == 'f') {
      if (curr_function == MAX_FUNS) {
        printf("Too many functions\n");
        continue;
      }

      if (strstr(&buf[2], " ") != NULL) {
        printf("Invalid name\n");
        continue;
      }

      names[curr_function++] = strdup(&buf[2]);

      printf("= ");
      if (!readline(buf)) {
        printf("Input too long\n");
        curr_function--;
        free(names[curr_function]);
        continue;
      }

      if (!parse(buf)) {
        printf("Parse error\n");
        curr_function--;
        free(names[curr_function]);
        continue;
      }

      memcpy(&functions[(curr_function - 1) * INSTR_BUF], instructions, INSTR_BUF * sizeof(Operation));
      fun_lens[curr_function - 1] = instr_len;
    } else if (buf[0] == 'r') {
      if (!parse(&buf[2])) {
        printf("Parse error\n");
        continue;
      }

      if (!intrepret()) {
        printf("Error while running\n");
        continue;
      }

      for (size_t i = 0; i < stack_size; i++) {
        printf("%ld", stack[stack_size - 1 - i]);
        if (i != stack_size - 1) { printf(" "); }
      }

      printf("\n");
    } else {
      if (buf[1] == ' ' && buf[2] != '\0' && buf[3] == '\0') {
        max_stack_size = 256;
        max_instrs = 256;

        if (buf[2] == '1') {
          printf("⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⢴⢲⣤⣤⢤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢐⣾⡿⣻⣿⣽⣦⡙⣯⣩⣾⡛⢦⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠏⣞⣹⣿⣶⣿⣿⣟⣹⣿⣿⡀⣇⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣃⣼⣻⣫⡾⡿⠉⠙⠻⠿⠿⢿⣧⡟⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣫⠾⠁⠀⠀⢃⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⠃⠀⢿⣿⣿⣿⠄⢦⣤⡿⠃⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⠿⣾⣿⠀⢀⠀⠉⠉⣿⡄⠻⡿⠃⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣏⣳⣾⣆⣠⣾⡿⣿⠀⡸⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡿⣿⠷⣯⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣠⣤⣤⣴⣶⣶⣦⣾⣿⠀⠹⣿⣿⡿⣿⢁⠀⢻⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣭⣿⣿⣿⣿⣿⠟⠉⠙⣿⠀⠀⢸⣿⡿⢿⣮⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⠀⣠⣿⡿⠋⢨⣿⠟⠋⠉⠉⠉⠛⠻⢿⣿⣿⡄⠀⠀⢻⠀⠀⢸⡟⠀⠀⠀⠀⠉⠉⠢⣄⠀⠀⠀⠀⠀⠀⠀⠀\n⢰⣿⠋⠀⠀⣾⡇⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⣿⡂⠀⢘⣧⣠⡟⠀⠀⣤⢖⣴⠂⠀⠀⠈⠳⡀⠀⠀⠀⠀⠀⠀\n⣾⣇⠀⠀⠀⢸⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣷⣤⣼⣿⣿⣁⣴⣿⣴⠾⠃⠒⠂⢄⡀⠀⠘⠄⡀⠀⠀⠀⠀\n⠈⢿⡆⠀⠀⠀⠘⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠈⠳⡀⠀⠀\n⠀⠈⣿⠀⠀⢰⣾⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⣻⣿⡏⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⡆⠀⠀⠘⣄⠀\n⠀⣠⡟⠁⣰⣿⡟⡬⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠸⡄\n⡞⠋⠀⣠⡿⢿⣆⢡⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⡇\n⣅⣠⡾⠋⠀⠀⢻⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⣰⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⢀⠀⠀⡏⠀⠀⠀⡸⠀\n⠛⠉⠀⠀⠀⠀⠀⠻⣿⣿⣷⣄⣀⠀⠀⢀⣼⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⢋⣶⡿⠀⠀⠑⢦⠀⠀⡇⠀\n⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⡙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣀⠀⠀⠀⠀⠀⡰⢋⣰⣿⢿⡇⠀⠀⠀⠀⢣⠀⠘⡄\n⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⢷⣤⣿⠿⠟⠛⢿⣿⠿⠿⢿⣿⣷⣶⣤⣀⣼⣴⡞⢻⡏⠸⣇⠀⠀⠀⠀⢀⡇⠀⢳\n⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⡄⣿⣧⣤⣤⣤⣸⣟⣀⡀⠀⠀⠹⣿⠉⢉⡵⠋⣠⢼⡇⠀⢿⡄⠀⠀⢀⡎⠀⠀⡞\n⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡉⣿⠁⠀⠀⠀⢹⣿⠉⠛⠛⠒⠛⢻⡀⢈⡤⢊⡇⠈⢿⣶⠞⢷⡀⠀⢾⠀⠀⠈⡄\n⠀⠀⠀⠀⠀⠀⠀⢀⣾⡏⠳⣿⣶⣦⣤⠶⢾⡿⠲⠦⠤⠤⠤⢾⡁⢈⠔⢉⠇⠀⠈⢿⣷⢼⣿⡆⠀⢣⠀⠀⣸\x1b[15A\x1b[9D");
          player = GIGACHAD;
        } else if (buf[2] == '2') {
          printf("⣿⣿⣿⣿⣿⣯⡀⠀⠀⠀⠀⠀⠀⠉⠻⣀⡄⠀⢀⣸⣇⣀⣤⣼⣿⠻⠄⠈⠩⢥⣤⡤⠴⠿⠿⢒⠻⠎⣻⣾⣦⣿⣼⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⠿⠛⠷⠦⣇⠀⠀⠀⠀⠀⠁⣠⡴⠞⠉⠁⠀⠀⠀⠈⠉⠙⠲⢦⣴⠋⠁⠀⣄⢰⣦⣼⡿⢦⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢿\n⣿⣿⣿⡟⣁⡈⢠⣶⣿⠿⣶⣆⣨⡄⣴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠈⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣥⢜\n⣿⣿⣯⣴⣿⣷⣿⣷⣾⣿⠋⢩⡝⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠛⢿⣿\n⣿⣿⣿⣿⣋⣿⣿⣿⣿⠃⠀⡏⡇⢹⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⡿⢿⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣇⣼⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣀⣛⣥⠘⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢶⣿⠿⠋⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⡟⠹⠿⠛⠉⠙⣿⣇⠈⠉⠉⢻⣦⡀⠀⠀⠀⢀⡴⠋⠀⠀⠀⣠⣶⣿⠿⠷⣦⣄⠀⠀⠀⠀⢈⣳⣄⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⡇⢀⣀⡀⠀⠀⠀⣤⠀⠀⠀⠘⠉⠇⠀⠀⢰⣿⠁⠀⠀⠤⠞⠉⠉⠀⠀⠀⠈⢻⡀⠀⠀⡰⠋⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣷⡌⣿⣾⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠲⣤⡀⠀⠀⠀⠀⠀⠀⡤⠀⣸⠀⠀⣼⠁⠀⢀⣿⣿⣎⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣾⡥⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡷⣶⣖⠒⢲⣶⣧⡠⠟⠀⣼⡥⢤⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣌⡛⠦⠬⠿⠋⠀⠀⠀⢿⣴⣀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿\n⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠙⠋⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣾\n⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡟⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣶⣶⣦⡀⠀⠀⠀⢠⡟⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡄⠀⠀⠈⠻⠿⣿⣥⠼⠋⠀⣠⡿⣇⣾⣿⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣱⣿⣇⢸⡀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣟⢻⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠋⢀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⣰⣿⡇⣿⢏⣿⣹⡇⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿\n⡟⣿⣯⡀⢻⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠉⠉⠉⠀⠐⠊⢰⣿⣿⠿⠟⣿⣿⣿⡇⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣟⣿⣷⣦⡝⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣟⣻⣿⠂⢘⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿\n⣿⢻⣿⣿⣿⣷⡜⢿⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣽⣿⣿⡆⢼⣿⡿⣿⠃⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿\n⣿⠄⣿⣿⣿⣿⣿⣮⡳⠽⢷⣦⡀⠀⠀⠘⠢⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⡠⢀⣿⣷⣿⣿⣿⠿⣿⡶⢻⡏⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡉⠻⢿⣶⣦⣀⣀⢀⣿⣷⣦⣤⣤⣤⣤⡶⠊⢀⡾⢻⣾⢿⣿⣿⣿⣿⣦⡾⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣀⠠⠽⣏⣝⣿⣫⡽⠯⠥⠞⠀⢀⡴⢋⣴⣿⣿⣯⣿⣿⣿⣿⣿⡇⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠁⠈⠁⠀⠀⠀⣀⡴⣻⣷⣿⣹⣿⣿⣻⣿⣻⣿⣿⣿⡇⠀⠀⣸⣿⡿⢿⣿⡿⠏⠙⠛⠛\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢻⣿⣿⣿⣷⣦⣤⣀⣀⣠⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⣯⣭⣤⣄⣀⡀⠀⠀⠀⠀\x1b[7A\x1b[21D");
          player = SHREK;
        } else {
          break;
        }

        readline(buf) &&
          (printf("\x1b[2J\x1b[H"), parse(buf)) &&
          intrepret();
      }

      break;
    }
  }

  return 0;
}
