// Path: src/main/java/net/kimleo/rec/common/exception/InitializationException.java
// public class InitializationException extends RuntimeException {
//     public InitializationException(String s, Exception ex) {
//         super(s, ex);
//     }
// 
//     public InitializationException(String message) {
//         super(message);
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/scripting/Scripting.java
// public class Scripting {
//     public static void runfile(File file,
//                                String filename,
//                                boolean enableRetry,
//                                String retryFile) throws Exception {
//         Context ctx = Context.enter();
//         ctx.putThreadLocal("SCRIPT_PATH", file.getAbsoluteFile().getParent());
// 
//         ScriptableObject scope = ctx.initStandardObjects();
// 
//         NativeExecutionContext executionContext = initializeNativeExecutionContext(
//                 file,
//                 enableRetry,
//                 retryFile,
//                 ctx);
// 
//         scope.putConst("context", scope, javaToJS(executionContext, scope));
// 
//         ctx.setLanguageVersion(VERSION_1_8);
//         Require require = new RequireBuilder()
//                 .setModuleScriptProvider(new SoftCachingModuleScriptProvider(new NativeModuleSourceProvider()))
//                 .createRequire(ctx, scope);
//         require.install(scope);
//         require.requireMain(ctx, filename);
//     }
// 
//     private static NativeExecutionContext initializeNativeExecutionContext(File file,
//                                                                            boolean enableRetry,
//                                                                            String retryFile,
//                                                                            Context ctx) {
//         NativeExecutionContext executionContext = initialContext();
// 
//         executionContext.setScriptPath(file.getAbsoluteFile().getParent());
//         executionContext.setJsContext(ctx);
//         executionContext.setEnableRetry(enableRetry);
//         executionContext.setRetryFile(retryFile);
//         return executionContext;
//     }
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/utils/Records.java
// public class Records {
//     public static ByteBuffer encode(Mapped<String> record, List<String> keys) {
//         int size = keys.size();
//         ByteBuffer byteBuffer = ByteBuffer.allocate(sizeof(record, keys));
// 
//         byteBuffer.putInt(size);
//         for (String key : keys) {
//             String field = record.get(key);
//             byteBuffer.putInt(field.getBytes().length);
//             byteBuffer.put(field.getBytes());
//         }
//         return byteBuffer;
//     }
// 
//     private static int sizeof(Mapped<String> record, List<String> keys) {
//         int size = 4;
// 
//         for (String key : keys) {
//             size += 4;
//             size += record.get(key).getBytes().length;
//         }
//         return size;
//     }
// 
//     public static Pair<List<String>, Integer> decode(ByteBuffer buffer, int readPos, int expectedSize) {
// 
//         buffer.position(readPos);
//         int size = buffer.getInt();
//         if (size != expectedSize) return null;
//         ArrayList<String> items = new ArrayList<>(size);
// 
//         for (int i = 0; i < size; i++) {
//             int length = buffer.getInt();
//             byte[] bytes = new byte[length];
//             buffer.get(bytes, 0, length);
//             items.add(new String(bytes));
// 
//         }
// 
//         return new Pair<>(items, buffer.position() - readPos);
//     }
// 
//     public static void dump(File file, int expectSize) {
//         try {
//             long length = file.length();
//             MappedByteBuffer byteBuffer = FileChannel.open(file.toPath(), StandardOpenOption.READ)
//                     .map(FileChannel.MapMode.READ_ONLY, 0, (int) length);
// 
//             int readPos = 0;
// 
//             while (readPos < byteBuffer.limit()) {
//                 Pair<List<String>, Integer> result = decode(byteBuffer, readPos, expectSize);
//                 if (result == null) break;
//                 readPos += result.second;
// 
//                 System.out.println(result.first.stream().collect(Collectors.joining(", ")));
//             }
//         } catch (IOException e) {
//             throw new ResourceAccessException("Unable to dump file: [" + file.getName() + "]", e);
//         }
//     }
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/util/Sys.java
// public static void die(String format, String... args) {
//     System.err.println(new Formatter().format(format, (Object[]) args));
//     exit(-1);
// }


import net.kimleo.rec.common.exception.InitializationException;
import net.kimleo.rec.v2.scripting.Scripting;
import net.kimleo.rec.v2.utils.Records;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.Arrays;
import static net.kimleo.rec.util.Sys.die;

        if (args.length >= 2) {
            dispatch(args);
        }

        LOGGER.info("Application ended");
    }

    private static void dispatch(String[] args) throws Exception {
        String retryFile = null;
        int retry = Arrays.asList(args).indexOf("--retry");
        if (retry > 0 && args.length >= retry) {

            retryFile = args[retry + 1];
        }
        String command = args[0];
        switch (command) {
            case "js":
            case "script":
                execute(args[1], retryFile != null, retryFile);
                break;
            case "dump":
                String fileName = args[1];
                File binFile = new File(fileName);
                int size;
                if (args.length == 3) {
                    size = Integer.parseInt(args[2]);
                } else {
                    size = inferSizeFromFileName(fileName);
                }
// Path: src/main/java/net/kimleo/rec/common/exception/InitializationException.java
// public class InitializationException extends RuntimeException {
//     public InitializationException(String s, Exception ex) {
//         super(s, ex);
//     }
// 
//     public InitializationException(String message) {
//         super(message);
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/scripting/Scripting.java
// public class Scripting {
//     public static void runfile(File file,
//                                String filename,
//                                boolean enableRetry,
//                                String retryFile) throws Exception {
//         Context ctx = Context.enter();
//         ctx.putThreadLocal("SCRIPT_PATH", file.getAbsoluteFile().getParent());
// 
//         ScriptableObject scope = ctx.initStandardObjects();
// 
//         NativeExecutionContext executionContext = initializeNativeExecutionContext(
//                 file,
//                 enableRetry,
//                 retryFile,
//                 ctx);
// 
//         scope.putConst("context", scope, javaToJS(executionContext, scope));
// 
//         ctx.setLanguageVersion(VERSION_1_8);
//         Require require = new RequireBuilder()
//                 .setModuleScriptProvider(new SoftCachingModuleScriptProvider(new NativeModuleSourceProvider()))
//                 .createRequire(ctx, scope);
//         require.install(scope);
//         require.requireMain(ctx, filename);
//     }
// 
//     private static NativeExecutionContext initializeNativeExecutionContext(File file,
//                                                                            boolean enableRetry,
//                                                                            String retryFile,
//                                                                            Context ctx) {
//         NativeExecutionContext executionContext = initialContext();
// 
//         executionContext.setScriptPath(file.getAbsoluteFile().getParent());
//         executionContext.setJsContext(ctx);
//         executionContext.setEnableRetry(enableRetry);
//         executionContext.setRetryFile(retryFile);
//         return executionContext;
//     }
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/utils/Records.java
// public class Records {
//     public static ByteBuffer encode(Mapped<String> record, List<String> keys) {
//         int size = keys.size();
//         ByteBuffer byteBuffer = ByteBuffer.allocate(sizeof(record, keys));
// 
//         byteBuffer.putInt(size);
//         for (String key : keys) {
//             String field = record.get(key);
//             byteBuffer.putInt(field.getBytes().length);
//             byteBuffer.put(field.getBytes());
//         }
//         return byteBuffer;
//     }
// 
//     private static int sizeof(Mapped<String> record, List<String> keys) {
//         int size = 4;
// 
//         for (String key : keys) {
//             size += 4;
//             size += record.get(key).getBytes().length;
//         }
//         return size;
//     }
// 
//     public static Pair<List<String>, Integer> decode(ByteBuffer buffer, int readPos, int expectedSize) {
// 
//         buffer.position(readPos);
//         int size = buffer.getInt();
//         if (size != expectedSize) return null;
//         ArrayList<String> items = new ArrayList<>(size);
// 
//         for (int i = 0; i < size; i++) {
//             int length = buffer.getInt();
//             byte[] bytes = new byte[length];
//             buffer.get(bytes, 0, length);
//             items.add(new String(bytes));
// 
//         }
// 
//         return new Pair<>(items, buffer.position() - readPos);
//     }
// 
//     public static void dump(File file, int expectSize) {
//         try {
//             long length = file.length();
//             MappedByteBuffer byteBuffer = FileChannel.open(file.toPath(), StandardOpenOption.READ)
//                     .map(FileChannel.MapMode.READ_ONLY, 0, (int) length);
// 
//             int readPos = 0;
// 
//             while (readPos < byteBuffer.limit()) {
//                 Pair<List<String>, Integer> result = decode(byteBuffer, readPos, expectSize);
//                 if (result == null) break;
//                 readPos += result.second;
// 
//                 System.out.println(result.first.stream().collect(Collectors.joining(", ")));
//             }
//         } catch (IOException e) {
//             throw new ResourceAccessException("Unable to dump file: [" + file.getName() + "]", e);
//         }
//     }
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/util/Sys.java
// public static void die(String format, String... args) {
//     System.err.println(new Formatter().format(format, (Object[]) args));
//     exit(-1);
// }


// Path: src/main/java/net/kimleo/rec/App.java
import net.kimleo.rec.common.exception.InitializationException;
import net.kimleo.rec.v2.scripting.Scripting;
import net.kimleo.rec.v2.utils.Records;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.Arrays;
import static net.kimleo.rec.util.Sys.die;


        if (args.length >= 2) {
            dispatch(args);
        }

        LOGGER.info("Application ended");
    }

    private static void dispatch(String[] args) throws Exception {
        String retryFile = null;
        int retry = Arrays.asList(args).indexOf("--retry");
        if (retry > 0 && args.length >= retry) {

            retryFile = args[retry + 1];
        }
        String command = args[0];
        switch (command) {
            case "js":
            case "script":
                execute(args[1], retryFile != null, retryFile);
                break;
            case "dump":
                String fileName = args[1];
                File binFile = new File(fileName);
                int size;
                if (args.length == 3) {
                    size = Integer.parseInt(args[2]);
                } else {
                    size = inferSizeFromFileName(fileName);
                }
                Records.dump(binFile, size);