{
  "version": 3,
  "sources": ["../../../node_modules/.pnpm/buffer-crc32@0.2.13/node_modules/buffer-crc32/index.js", "../../../node_modules/.pnpm/yazl@2.5.1/node_modules/yazl/index.js", "../fabric.ts", "../utils.ts", "../liteloader.ts", "../forge.ts", "../downloadTask.ts", "../minecraft.ts", "../zipValdiator.ts", "../profile.ts", "../manifest.ts", "../neoForged.ts", "../optifine.ts", "../java.ts", "../java-runtime.ts", "../diagnose.ts", "../quilt.ts", "../unzip.ts", "../labymod.ts"],
  "sourcesContent": ["var Buffer = require('buffer').Buffer;\n\nvar CRC_TABLE = [\n  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,\n  0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,\n  0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,\n  0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,\n  0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,\n  0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,\n  0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,\n  0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,\n  0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,\n  0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,\n  0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,\n  0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,\n  0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,\n  0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,\n  0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,\n  0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,\n  0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,\n  0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,\n  0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,\n  0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,\n  0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,\n  0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,\n  0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,\n  0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n  0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,\n  0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,\n  0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,\n  0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,\n  0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,\n  0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,\n  0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,\n  0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,\n  0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,\n  0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,\n  0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,\n  0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,\n  0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,\n  0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,\n  0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,\n  0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,\n  0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,\n  0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,\n  0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,\n  0x2d02ef8d\n];\n\nif (typeof Int32Array !== 'undefined') {\n  CRC_TABLE = new Int32Array(CRC_TABLE);\n}\n\nfunction ensureBuffer(input) {\n  if (Buffer.isBuffer(input)) {\n    return input;\n  }\n\n  var hasNewBufferAPI =\n      typeof Buffer.alloc === \"function\" &&\n      typeof Buffer.from === \"function\";\n\n  if (typeof input === \"number\") {\n    return hasNewBufferAPI ? Buffer.alloc(input) : new Buffer(input);\n  }\n  else if (typeof input === \"string\") {\n    return hasNewBufferAPI ? Buffer.from(input) : new Buffer(input);\n  }\n  else {\n    throw new Error(\"input must be buffer, number, or string, received \" +\n                    typeof input);\n  }\n}\n\nfunction bufferizeInt(num) {\n  var tmp = ensureBuffer(4);\n  tmp.writeInt32BE(num, 0);\n  return tmp;\n}\n\nfunction _crc32(buf, previous) {\n  buf = ensureBuffer(buf);\n  if (Buffer.isBuffer(previous)) {\n    previous = previous.readUInt32BE(0);\n  }\n  var crc = ~~previous ^ -1;\n  for (var n = 0; n < buf.length; n++) {\n    crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8);\n  }\n  return (crc ^ -1);\n}\n\nfunction crc32() {\n  return bufferizeInt(_crc32.apply(null, arguments));\n}\ncrc32.signed = function () {\n  return _crc32.apply(null, arguments);\n};\ncrc32.unsigned = function () {\n  return _crc32.apply(null, arguments) >>> 0;\n};\n\nmodule.exports = crc32;\n", "var fs = require(\"fs\");\nvar Transform = require(\"stream\").Transform;\nvar PassThrough = require(\"stream\").PassThrough;\nvar zlib = require(\"zlib\");\nvar util = require(\"util\");\nvar EventEmitter = require(\"events\").EventEmitter;\nvar crc32 = require(\"buffer-crc32\");\n\nexports.ZipFile = ZipFile;\nexports.dateToDosDateTime = dateToDosDateTime;\n\nutil.inherits(ZipFile, EventEmitter);\nfunction ZipFile() {\n  this.outputStream = new PassThrough();\n  this.entries = [];\n  this.outputStreamCursor = 0;\n  this.ended = false; // .end() sets this\n  this.allDone = false; // set when we've written the last bytes\n  this.forceZip64Eocd = false; // configurable in .end()\n}\n\nZipFile.prototype.addFile = function(realPath, metadataPath, options) {\n  var self = this;\n  metadataPath = validateMetadataPath(metadataPath, false);\n  if (options == null) options = {};\n\n  var entry = new Entry(metadataPath, false, options);\n  self.entries.push(entry);\n  fs.stat(realPath, function(err, stats) {\n    if (err) return self.emit(\"error\", err);\n    if (!stats.isFile()) return self.emit(\"error\", new Error(\"not a file: \" + realPath));\n    entry.uncompressedSize = stats.size;\n    if (options.mtime == null) entry.setLastModDate(stats.mtime);\n    if (options.mode == null) entry.setFileAttributesMode(stats.mode);\n    entry.setFileDataPumpFunction(function() {\n      var readStream = fs.createReadStream(realPath);\n      entry.state = Entry.FILE_DATA_IN_PROGRESS;\n      readStream.on(\"error\", function(err) {\n        self.emit(\"error\", err);\n      });\n      pumpFileDataReadStream(self, entry, readStream);\n    });\n    pumpEntries(self);\n  });\n};\n\nZipFile.prototype.addReadStream = function(readStream, metadataPath, options) {\n  var self = this;\n  metadataPath = validateMetadataPath(metadataPath, false);\n  if (options == null) options = {};\n  var entry = new Entry(metadataPath, false, options);\n  self.entries.push(entry);\n  entry.setFileDataPumpFunction(function() {\n    entry.state = Entry.FILE_DATA_IN_PROGRESS;\n    pumpFileDataReadStream(self, entry, readStream);\n  });\n  pumpEntries(self);\n};\n\nZipFile.prototype.addBuffer = function(buffer, metadataPath, options) {\n  var self = this;\n  metadataPath = validateMetadataPath(metadataPath, false);\n  if (buffer.length > 0x3fffffff) throw new Error(\"buffer too large: \" + buffer.length + \" > \" + 0x3fffffff);\n  if (options == null) options = {};\n  if (options.size != null) throw new Error(\"options.size not allowed\");\n  var entry = new Entry(metadataPath, false, options);\n  entry.uncompressedSize = buffer.length;\n  entry.crc32 = crc32.unsigned(buffer);\n  entry.crcAndFileSizeKnown = true;\n  self.entries.push(entry);\n  if (!entry.compress) {\n    setCompressedBuffer(buffer);\n  } else {\n    zlib.deflateRaw(buffer, function(err, compressedBuffer) {\n      setCompressedBuffer(compressedBuffer);\n    });\n  }\n  function setCompressedBuffer(compressedBuffer) {\n    entry.compressedSize = compressedBuffer.length;\n    entry.setFileDataPumpFunction(function() {\n      writeToOutputStream(self, compressedBuffer);\n      writeToOutputStream(self, entry.getDataDescriptor());\n      entry.state = Entry.FILE_DATA_DONE;\n\n      // don't call pumpEntries() recursively.\n      // (also, don't call process.nextTick recursively.)\n      setImmediate(function() {\n        pumpEntries(self);\n      });\n    });\n    pumpEntries(self);\n  }\n};\n\nZipFile.prototype.addEmptyDirectory = function(metadataPath, options) {\n  var self = this;\n  metadataPath = validateMetadataPath(metadataPath, true);\n  if (options == null) options = {};\n  if (options.size != null) throw new Error(\"options.size not allowed\");\n  if (options.compress != null) throw new Error(\"options.compress not allowed\");\n  var entry = new Entry(metadataPath, true, options);\n  self.entries.push(entry);\n  entry.setFileDataPumpFunction(function() {\n    writeToOutputStream(self, entry.getDataDescriptor());\n    entry.state = Entry.FILE_DATA_DONE;\n    pumpEntries(self);\n  });\n  pumpEntries(self);\n};\n\nvar eocdrSignatureBuffer = bufferFrom([0x50, 0x4b, 0x05, 0x06]);\n\nZipFile.prototype.end = function(options, finalSizeCallback) {\n  if (typeof options === \"function\") {\n    finalSizeCallback = options;\n    options = null;\n  }\n  if (options == null) options = {};\n  if (this.ended) return;\n  this.ended = true;\n  this.finalSizeCallback = finalSizeCallback;\n  this.forceZip64Eocd = !!options.forceZip64Format;\n  if (options.comment) {\n    if (typeof options.comment === \"string\") {\n      this.comment = encodeCp437(options.comment);\n    } else {\n      // It should be a Buffer\n      this.comment = options.comment;\n    }\n    if (this.comment.length > 0xffff) throw new Error(\"comment is too large\");\n    // gotta check for this, because the zipfile format is actually ambiguous.\n    if (bufferIncludes(this.comment, eocdrSignatureBuffer)) throw new Error(\"comment contains end of central directory record signature\");\n  } else {\n    // no comment.\n    this.comment = EMPTY_BUFFER;\n  }\n  pumpEntries(this);\n};\n\nfunction writeToOutputStream(self, buffer) {\n  self.outputStream.write(buffer);\n  self.outputStreamCursor += buffer.length;\n}\n\nfunction pumpFileDataReadStream(self, entry, readStream) {\n  var crc32Watcher = new Crc32Watcher();\n  var uncompressedSizeCounter = new ByteCounter();\n  var compressor = entry.compress ? new zlib.DeflateRaw() : new PassThrough();\n  var compressedSizeCounter = new ByteCounter();\n  readStream.pipe(crc32Watcher)\n            .pipe(uncompressedSizeCounter)\n            .pipe(compressor)\n            .pipe(compressedSizeCounter)\n            .pipe(self.outputStream, {end: false});\n  compressedSizeCounter.on(\"end\", function() {\n    entry.crc32 = crc32Watcher.crc32;\n    if (entry.uncompressedSize == null) {\n      entry.uncompressedSize = uncompressedSizeCounter.byteCount;\n    } else {\n      if (entry.uncompressedSize !== uncompressedSizeCounter.byteCount) return self.emit(\"error\", new Error(\"file data stream has unexpected number of bytes\"));\n    }\n    entry.compressedSize = compressedSizeCounter.byteCount;\n    self.outputStreamCursor += entry.compressedSize;\n    writeToOutputStream(self, entry.getDataDescriptor());\n    entry.state = Entry.FILE_DATA_DONE;\n    pumpEntries(self);\n  });\n}\n\nfunction pumpEntries(self) {\n  if (self.allDone) return;\n  // first check if finalSize is finally known\n  if (self.ended && self.finalSizeCallback != null) {\n    var finalSize = calculateFinalSize(self);\n    if (finalSize != null) {\n      // we have an answer\n      self.finalSizeCallback(finalSize);\n      self.finalSizeCallback = null;\n    }\n  }\n\n  // pump entries\n  var entry = getFirstNotDoneEntry();\n  function getFirstNotDoneEntry() {\n    for (var i = 0; i < self.entries.length; i++) {\n      var entry = self.entries[i];\n      if (entry.state < Entry.FILE_DATA_DONE) return entry;\n    }\n    return null;\n  }\n  if (entry != null) {\n    // this entry is not done yet\n    if (entry.state < Entry.READY_TO_PUMP_FILE_DATA) return; // input file not open yet\n    if (entry.state === Entry.FILE_DATA_IN_PROGRESS) return; // we'll get there\n    // start with local file header\n    entry.relativeOffsetOfLocalHeader = self.outputStreamCursor;\n    var localFileHeader = entry.getLocalFileHeader();\n    writeToOutputStream(self, localFileHeader);\n    entry.doFileDataPump();\n  } else {\n    // all cought up on writing entries\n    if (self.ended) {\n      // head for the exit\n      self.offsetOfStartOfCentralDirectory = self.outputStreamCursor;\n      self.entries.forEach(function(entry) {\n        var centralDirectoryRecord = entry.getCentralDirectoryRecord();\n        writeToOutputStream(self, centralDirectoryRecord);\n      });\n      writeToOutputStream(self, getEndOfCentralDirectoryRecord(self));\n      self.outputStream.end();\n      self.allDone = true;\n    }\n  }\n}\n\nfunction calculateFinalSize(self) {\n  var pretendOutputCursor = 0;\n  var centralDirectorySize = 0;\n  for (var i = 0; i < self.entries.length; i++) {\n    var entry = self.entries[i];\n    // compression is too hard to predict\n    if (entry.compress) return -1;\n    if (entry.state >= Entry.READY_TO_PUMP_FILE_DATA) {\n      // if addReadStream was called without providing the size, we can't predict the final size\n      if (entry.uncompressedSize == null) return -1;\n    } else {\n      // if we're still waiting for fs.stat, we might learn the size someday\n      if (entry.uncompressedSize == null) return null;\n    }\n    // we know this for sure, and this is important to know if we need ZIP64 format.\n    entry.relativeOffsetOfLocalHeader = pretendOutputCursor;\n    var useZip64Format = entry.useZip64Format();\n\n    pretendOutputCursor += LOCAL_FILE_HEADER_FIXED_SIZE + entry.utf8FileName.length;\n    pretendOutputCursor += entry.uncompressedSize;\n    if (!entry.crcAndFileSizeKnown) {\n      // use a data descriptor\n      if (useZip64Format) {\n        pretendOutputCursor += ZIP64_DATA_DESCRIPTOR_SIZE;\n      } else {\n        pretendOutputCursor += DATA_DESCRIPTOR_SIZE;\n      }\n    }\n\n    centralDirectorySize += CENTRAL_DIRECTORY_RECORD_FIXED_SIZE + entry.utf8FileName.length + entry.fileComment.length;\n    if (useZip64Format) {\n      centralDirectorySize += ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE;\n    }\n  }\n\n  var endOfCentralDirectorySize = 0;\n  if (self.forceZip64Eocd ||\n      self.entries.length >= 0xffff ||\n      centralDirectorySize >= 0xffff ||\n      pretendOutputCursor >= 0xffffffff) {\n    // use zip64 end of central directory stuff\n    endOfCentralDirectorySize += ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE + ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIZE;\n  }\n  endOfCentralDirectorySize += END_OF_CENTRAL_DIRECTORY_RECORD_SIZE + self.comment.length;\n  return pretendOutputCursor + centralDirectorySize + endOfCentralDirectorySize;\n}\n\nvar ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE = 56;\nvar ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIZE = 20;\nvar END_OF_CENTRAL_DIRECTORY_RECORD_SIZE = 22;\nfunction getEndOfCentralDirectoryRecord(self, actuallyJustTellMeHowLongItWouldBe) {\n  var needZip64Format = false;\n  var normalEntriesLength = self.entries.length;\n  if (self.forceZip64Eocd || self.entries.length >= 0xffff) {\n    normalEntriesLength = 0xffff;\n    needZip64Format = true;\n  }\n  var sizeOfCentralDirectory = self.outputStreamCursor - self.offsetOfStartOfCentralDirectory;\n  var normalSizeOfCentralDirectory = sizeOfCentralDirectory;\n  if (self.forceZip64Eocd || sizeOfCentralDirectory >= 0xffffffff) {\n    normalSizeOfCentralDirectory = 0xffffffff;\n    needZip64Format = true;\n  }\n  var normalOffsetOfStartOfCentralDirectory = self.offsetOfStartOfCentralDirectory;\n  if (self.forceZip64Eocd || self.offsetOfStartOfCentralDirectory >= 0xffffffff) {\n    normalOffsetOfStartOfCentralDirectory = 0xffffffff;\n    needZip64Format = true;\n  }\n  if (actuallyJustTellMeHowLongItWouldBe) {\n    if (needZip64Format) {\n      return (\n        ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE +\n        ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIZE +\n        END_OF_CENTRAL_DIRECTORY_RECORD_SIZE\n      );\n    } else {\n      return END_OF_CENTRAL_DIRECTORY_RECORD_SIZE;\n    }\n  }\n\n  var eocdrBuffer = bufferAlloc(END_OF_CENTRAL_DIRECTORY_RECORD_SIZE + self.comment.length);\n  // end of central dir signature                       4 bytes  (0x06054b50)\n  eocdrBuffer.writeUInt32LE(0x06054b50, 0);\n  // number of this disk                                2 bytes\n  eocdrBuffer.writeUInt16LE(0, 4);\n  // number of the disk with the start of the central directory  2 bytes\n  eocdrBuffer.writeUInt16LE(0, 6);\n  // total number of entries in the central directory on this disk  2 bytes\n  eocdrBuffer.writeUInt16LE(normalEntriesLength, 8);\n  // total number of entries in the central directory   2 bytes\n  eocdrBuffer.writeUInt16LE(normalEntriesLength, 10);\n  // size of the central directory                      4 bytes\n  eocdrBuffer.writeUInt32LE(normalSizeOfCentralDirectory, 12);\n  // offset of start of central directory with respect to the starting disk number  4 bytes\n  eocdrBuffer.writeUInt32LE(normalOffsetOfStartOfCentralDirectory, 16);\n  // .ZIP file comment length                           2 bytes\n  eocdrBuffer.writeUInt16LE(self.comment.length, 20);\n  // .ZIP file comment                                  (variable size)\n  self.comment.copy(eocdrBuffer, 22);\n\n  if (!needZip64Format) return eocdrBuffer;\n\n  // ZIP64 format\n  // ZIP64 End of Central Directory Record\n  var zip64EocdrBuffer = bufferAlloc(ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE);\n  // zip64 end of central dir signature                                             4 bytes  (0x06064b50)\n  zip64EocdrBuffer.writeUInt32LE(0x06064b50, 0);\n  // size of zip64 end of central directory record                                  8 bytes\n  writeUInt64LE(zip64EocdrBuffer, ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE - 12, 4);\n  // version made by                                                                2 bytes\n  zip64EocdrBuffer.writeUInt16LE(VERSION_MADE_BY, 12);\n  // version needed to extract                                                      2 bytes\n  zip64EocdrBuffer.writeUInt16LE(VERSION_NEEDED_TO_EXTRACT_ZIP64, 14);\n  // number of this disk                                                            4 bytes\n  zip64EocdrBuffer.writeUInt32LE(0, 16);\n  // number of the disk with the start of the central directory                     4 bytes\n  zip64EocdrBuffer.writeUInt32LE(0, 20);\n  // total number of entries in the central directory on this disk                  8 bytes\n  writeUInt64LE(zip64EocdrBuffer, self.entries.length, 24);\n  // total number of entries in the central directory                               8 bytes\n  writeUInt64LE(zip64EocdrBuffer, self.entries.length, 32);\n  // size of the central directory                                                  8 bytes\n  writeUInt64LE(zip64EocdrBuffer, sizeOfCentralDirectory, 40);\n  // offset of start of central directory with respect to the starting disk number  8 bytes\n  writeUInt64LE(zip64EocdrBuffer, self.offsetOfStartOfCentralDirectory, 48);\n  // zip64 extensible data sector                                                   (variable size)\n  // nothing in the zip64 extensible data sector\n\n\n  // ZIP64 End of Central Directory Locator\n  var zip64EocdlBuffer = bufferAlloc(ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIZE);\n  // zip64 end of central dir locator signature                               4 bytes  (0x07064b50)\n  zip64EocdlBuffer.writeUInt32LE(0x07064b50, 0);\n  // number of the disk with the start of the zip64 end of central directory  4 bytes\n  zip64EocdlBuffer.writeUInt32LE(0, 4);\n  // relative offset of the zip64 end of central directory record             8 bytes\n  writeUInt64LE(zip64EocdlBuffer, self.outputStreamCursor, 8);\n  // total number of disks                                                    4 bytes\n  zip64EocdlBuffer.writeUInt32LE(1, 16);\n\n\n  return Buffer.concat([\n    zip64EocdrBuffer,\n    zip64EocdlBuffer,\n    eocdrBuffer,\n  ]);\n}\n\nfunction validateMetadataPath(metadataPath, isDirectory) {\n  if (metadataPath === \"\") throw new Error(\"empty metadataPath\");\n  metadataPath = metadataPath.replace(/\\\\/g, \"/\");\n  if (/^[a-zA-Z]:/.test(metadataPath) || /^\\//.test(metadataPath)) throw new Error(\"absolute path: \" + metadataPath);\n  if (metadataPath.split(\"/\").indexOf(\"..\") !== -1) throw new Error(\"invalid relative path: \" + metadataPath);\n  var looksLikeDirectory = /\\/$/.test(metadataPath);\n  if (isDirectory) {\n    // append a trailing '/' if necessary.\n    if (!looksLikeDirectory) metadataPath += \"/\";\n  } else {\n    if (looksLikeDirectory) throw new Error(\"file path cannot end with '/': \" + metadataPath);\n  }\n  return metadataPath;\n}\n\nvar EMPTY_BUFFER = bufferAlloc(0);\n\n// this class is not part of the public API\nfunction Entry(metadataPath, isDirectory, options) {\n  this.utf8FileName = bufferFrom(metadataPath);\n  if (this.utf8FileName.length > 0xffff) throw new Error(\"utf8 file name too long. \" + utf8FileName.length + \" > \" + 0xffff);\n  this.isDirectory = isDirectory;\n  this.state = Entry.WAITING_FOR_METADATA;\n  this.setLastModDate(options.mtime != null ? options.mtime : new Date());\n  if (options.mode != null) {\n    this.setFileAttributesMode(options.mode);\n  } else {\n    this.setFileAttributesMode(isDirectory ? 0o40775 : 0o100664);\n  }\n  if (isDirectory) {\n    this.crcAndFileSizeKnown = true;\n    this.crc32 = 0;\n    this.uncompressedSize = 0;\n    this.compressedSize = 0;\n  } else {\n    // unknown so far\n    this.crcAndFileSizeKnown = false;\n    this.crc32 = null;\n    this.uncompressedSize = null;\n    this.compressedSize = null;\n    if (options.size != null) this.uncompressedSize = options.size;\n  }\n  if (isDirectory) {\n    this.compress = false;\n  } else {\n    this.compress = true; // default\n    if (options.compress != null) this.compress = !!options.compress;\n  }\n  this.forceZip64Format = !!options.forceZip64Format;\n  if (options.fileComment) {\n    if (typeof options.fileComment === \"string\") {\n      this.fileComment = bufferFrom(options.fileComment, \"utf-8\");\n    } else {\n      // It should be a Buffer\n      this.fileComment = options.fileComment;\n    }\n    if (this.fileComment.length > 0xffff) throw new Error(\"fileComment is too large\");\n  } else {\n    // no comment.\n    this.fileComment = EMPTY_BUFFER;\n  }\n}\nEntry.WAITING_FOR_METADATA = 0;\nEntry.READY_TO_PUMP_FILE_DATA = 1;\nEntry.FILE_DATA_IN_PROGRESS = 2;\nEntry.FILE_DATA_DONE = 3;\nEntry.prototype.setLastModDate = function(date) {\n  var dosDateTime = dateToDosDateTime(date);\n  this.lastModFileTime = dosDateTime.time;\n  this.lastModFileDate = dosDateTime.date;\n};\nEntry.prototype.setFileAttributesMode = function(mode) {\n  if ((mode & 0xffff) !== mode) throw new Error(\"invalid mode. expected: 0 <= \" + mode + \" <= \" + 0xffff);\n  // http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute/14727#14727\n  this.externalFileAttributes = (mode << 16) >>> 0;\n};\n// doFileDataPump() should not call pumpEntries() directly. see issue #9.\nEntry.prototype.setFileDataPumpFunction = function(doFileDataPump) {\n  this.doFileDataPump = doFileDataPump;\n  this.state = Entry.READY_TO_PUMP_FILE_DATA;\n};\nEntry.prototype.useZip64Format = function() {\n  return (\n    (this.forceZip64Format) ||\n    (this.uncompressedSize != null && this.uncompressedSize > 0xfffffffe) ||\n    (this.compressedSize != null && this.compressedSize > 0xfffffffe) ||\n    (this.relativeOffsetOfLocalHeader != null && this.relativeOffsetOfLocalHeader > 0xfffffffe)\n  );\n}\nvar LOCAL_FILE_HEADER_FIXED_SIZE = 30;\nvar VERSION_NEEDED_TO_EXTRACT_UTF8 = 20;\nvar VERSION_NEEDED_TO_EXTRACT_ZIP64 = 45;\n// 3 = unix. 63 = spec version 6.3\nvar VERSION_MADE_BY = (3 << 8) | 63;\nvar FILE_NAME_IS_UTF8 = 1 << 11;\nvar UNKNOWN_CRC32_AND_FILE_SIZES = 1 << 3;\nEntry.prototype.getLocalFileHeader = function() {\n  var crc32 = 0;\n  var compressedSize = 0;\n  var uncompressedSize = 0;\n  if (this.crcAndFileSizeKnown) {\n    crc32 = this.crc32;\n    compressedSize = this.compressedSize;\n    uncompressedSize = this.uncompressedSize;\n  }\n\n  var fixedSizeStuff = bufferAlloc(LOCAL_FILE_HEADER_FIXED_SIZE);\n  var generalPurposeBitFlag = FILE_NAME_IS_UTF8;\n  if (!this.crcAndFileSizeKnown) generalPurposeBitFlag |= UNKNOWN_CRC32_AND_FILE_SIZES;\n\n  // local file header signature     4 bytes  (0x04034b50)\n  fixedSizeStuff.writeUInt32LE(0x04034b50, 0);\n  // version needed to extract       2 bytes\n  fixedSizeStuff.writeUInt16LE(VERSION_NEEDED_TO_EXTRACT_UTF8, 4);\n  // general purpose bit flag        2 bytes\n  fixedSizeStuff.writeUInt16LE(generalPurposeBitFlag, 6);\n  // compression method              2 bytes\n  fixedSizeStuff.writeUInt16LE(this.getCompressionMethod(), 8);\n  // last mod file time              2 bytes\n  fixedSizeStuff.writeUInt16LE(this.lastModFileTime, 10);\n  // last mod file date              2 bytes\n  fixedSizeStuff.writeUInt16LE(this.lastModFileDate, 12);\n  // crc-32                          4 bytes\n  fixedSizeStuff.writeUInt32LE(crc32, 14);\n  // compressed size                 4 bytes\n  fixedSizeStuff.writeUInt32LE(compressedSize, 18);\n  // uncompressed size               4 bytes\n  fixedSizeStuff.writeUInt32LE(uncompressedSize, 22);\n  // file name length                2 bytes\n  fixedSizeStuff.writeUInt16LE(this.utf8FileName.length, 26);\n  // extra field length              2 bytes\n  fixedSizeStuff.writeUInt16LE(0, 28);\n  return Buffer.concat([\n    fixedSizeStuff,\n    // file name (variable size)\n    this.utf8FileName,\n    // extra field (variable size)\n    // no extra fields\n  ]);\n};\nvar DATA_DESCRIPTOR_SIZE = 16;\nvar ZIP64_DATA_DESCRIPTOR_SIZE = 24;\nEntry.prototype.getDataDescriptor = function() {\n  if (this.crcAndFileSizeKnown) {\n    // the Mac Archive Utility requires this not be present unless we set general purpose bit 3\n    return EMPTY_BUFFER;\n  }\n  if (!this.useZip64Format()) {\n    var buffer = bufferAlloc(DATA_DESCRIPTOR_SIZE);\n    // optional signature (required according to Archive Utility)\n    buffer.writeUInt32LE(0x08074b50, 0);\n    // crc-32                          4 bytes\n    buffer.writeUInt32LE(this.crc32, 4);\n    // compressed size                 4 bytes\n    buffer.writeUInt32LE(this.compressedSize, 8);\n    // uncompressed size               4 bytes\n    buffer.writeUInt32LE(this.uncompressedSize, 12);\n    return buffer;\n  } else {\n    // ZIP64 format\n    var buffer = bufferAlloc(ZIP64_DATA_DESCRIPTOR_SIZE);\n    // optional signature (unknown if anyone cares about this)\n    buffer.writeUInt32LE(0x08074b50, 0);\n    // crc-32                          4 bytes\n    buffer.writeUInt32LE(this.crc32, 4);\n    // compressed size                 8 bytes\n    writeUInt64LE(buffer, this.compressedSize, 8);\n    // uncompressed size               8 bytes\n    writeUInt64LE(buffer, this.uncompressedSize, 16);\n    return buffer;\n  }\n};\nvar CENTRAL_DIRECTORY_RECORD_FIXED_SIZE = 46;\nvar ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE = 28;\nEntry.prototype.getCentralDirectoryRecord = function() {\n  var fixedSizeStuff = bufferAlloc(CENTRAL_DIRECTORY_RECORD_FIXED_SIZE);\n  var generalPurposeBitFlag = FILE_NAME_IS_UTF8;\n  if (!this.crcAndFileSizeKnown) generalPurposeBitFlag |= UNKNOWN_CRC32_AND_FILE_SIZES;\n\n  var normalCompressedSize = this.compressedSize;\n  var normalUncompressedSize = this.uncompressedSize;\n  var normalRelativeOffsetOfLocalHeader = this.relativeOffsetOfLocalHeader;\n  var versionNeededToExtract;\n  var zeiefBuffer;\n  if (this.useZip64Format()) {\n    normalCompressedSize = 0xffffffff;\n    normalUncompressedSize = 0xffffffff;\n    normalRelativeOffsetOfLocalHeader = 0xffffffff;\n    versionNeededToExtract = VERSION_NEEDED_TO_EXTRACT_ZIP64;\n\n    // ZIP64 extended information extra field\n    zeiefBuffer = bufferAlloc(ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE);\n    // 0x0001                  2 bytes    Tag for this \"extra\" block type\n    zeiefBuffer.writeUInt16LE(0x0001, 0);\n    // Size                    2 bytes    Size of this \"extra\" block\n    zeiefBuffer.writeUInt16LE(ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE - 4, 2);\n    // Original Size           8 bytes    Original uncompressed file size\n    writeUInt64LE(zeiefBuffer, this.uncompressedSize, 4);\n    // Compressed Size         8 bytes    Size of compressed data\n    writeUInt64LE(zeiefBuffer, this.compressedSize, 12);\n    // Relative Header Offset  8 bytes    Offset of local header record\n    writeUInt64LE(zeiefBuffer, this.relativeOffsetOfLocalHeader, 20);\n    // Disk Start Number       4 bytes    Number of the disk on which this file starts\n    // (omit)\n  } else {\n    versionNeededToExtract = VERSION_NEEDED_TO_EXTRACT_UTF8;\n    zeiefBuffer = EMPTY_BUFFER;\n  }\n\n  // central file header signature   4 bytes  (0x02014b50)\n  fixedSizeStuff.writeUInt32LE(0x02014b50, 0);\n  // version made by                 2 bytes\n  fixedSizeStuff.writeUInt16LE(VERSION_MADE_BY, 4);\n  // version needed to extract       2 bytes\n  fixedSizeStuff.writeUInt16LE(versionNeededToExtract, 6);\n  // general purpose bit flag        2 bytes\n  fixedSizeStuff.writeUInt16LE(generalPurposeBitFlag, 8);\n  // compression method              2 bytes\n  fixedSizeStuff.writeUInt16LE(this.getCompressionMethod(), 10);\n  // last mod file time              2 bytes\n  fixedSizeStuff.writeUInt16LE(this.lastModFileTime, 12);\n  // last mod file date              2 bytes\n  fixedSizeStuff.writeUInt16LE(this.lastModFileDate, 14);\n  // crc-32                          4 bytes\n  fixedSizeStuff.writeUInt32LE(this.crc32, 16);\n  // compressed size                 4 bytes\n  fixedSizeStuff.writeUInt32LE(normalCompressedSize, 20);\n  // uncompressed size               4 bytes\n  fixedSizeStuff.writeUInt32LE(normalUncompressedSize, 24);\n  // file name length                2 bytes\n  fixedSizeStuff.writeUInt16LE(this.utf8FileName.length, 28);\n  // extra field length              2 bytes\n  fixedSizeStuff.writeUInt16LE(zeiefBuffer.length, 30);\n  // file comment length             2 bytes\n  fixedSizeStuff.writeUInt16LE(this.fileComment.length, 32);\n  // disk number start               2 bytes\n  fixedSizeStuff.writeUInt16LE(0, 34);\n  // internal file attributes        2 bytes\n  fixedSizeStuff.writeUInt16LE(0, 36);\n  // external file attributes        4 bytes\n  fixedSizeStuff.writeUInt32LE(this.externalFileAttributes, 38);\n  // relative offset of local header 4 bytes\n  fixedSizeStuff.writeUInt32LE(normalRelativeOffsetOfLocalHeader, 42);\n\n  return Buffer.concat([\n    fixedSizeStuff,\n    // file name (variable size)\n    this.utf8FileName,\n    // extra field (variable size)\n    zeiefBuffer,\n    // file comment (variable size)\n    this.fileComment,\n  ]);\n};\nEntry.prototype.getCompressionMethod = function() {\n  var NO_COMPRESSION = 0;\n  var DEFLATE_COMPRESSION = 8;\n  return this.compress ? DEFLATE_COMPRESSION : NO_COMPRESSION;\n};\n\nfunction dateToDosDateTime(jsDate) {\n  var date = 0;\n  date |= jsDate.getDate() & 0x1f; // 1-31\n  date |= ((jsDate.getMonth() + 1) & 0xf) << 5; // 0-11, 1-12\n  date |= ((jsDate.getFullYear() - 1980) & 0x7f) << 9; // 0-128, 1980-2108\n\n  var time = 0;\n  time |= Math.floor(jsDate.getSeconds() / 2); // 0-59, 0-29 (lose odd numbers)\n  time |= (jsDate.getMinutes() & 0x3f) << 5; // 0-59\n  time |= (jsDate.getHours() & 0x1f) << 11; // 0-23\n\n  return {date: date, time: time};\n}\n\nfunction writeUInt64LE(buffer, n, offset) {\n  // can't use bitshift here, because JavaScript only allows bitshifting on 32-bit integers.\n  var high = Math.floor(n / 0x100000000);\n  var low = n % 0x100000000;\n  buffer.writeUInt32LE(low, offset);\n  buffer.writeUInt32LE(high, offset + 4);\n}\n\nfunction defaultCallback(err) {\n  if (err) throw err;\n}\n\nutil.inherits(ByteCounter, Transform);\nfunction ByteCounter(options) {\n  Transform.call(this, options);\n  this.byteCount = 0;\n}\nByteCounter.prototype._transform = function(chunk, encoding, cb) {\n  this.byteCount += chunk.length;\n  cb(null, chunk);\n};\n\nutil.inherits(Crc32Watcher, Transform);\nfunction Crc32Watcher(options) {\n  Transform.call(this, options);\n  this.crc32 = 0;\n}\nCrc32Watcher.prototype._transform = function(chunk, encoding, cb) {\n  this.crc32 = crc32.unsigned(chunk, this.crc32);\n  cb(null, chunk);\n};\n\nvar cp437 = '\\u0000\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\u00B6\u00A7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u00FF\u00D6\u00DC\u00A2\u00A3\u00A5\u20A7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u2310\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0';\nif (cp437.length !== 256) throw new Error(\"assertion failure\");\nvar reverseCp437 = null;\n\nfunction encodeCp437(string) {\n  if (/^[\\x20-\\x7e]*$/.test(string)) {\n    // CP437, ASCII, and UTF-8 overlap in this range.\n    return bufferFrom(string, \"utf-8\");\n  }\n\n  // This is the slow path.\n  if (reverseCp437 == null) {\n    // cache this once\n    reverseCp437 = {};\n    for (var i = 0; i < cp437.length; i++) {\n      reverseCp437[cp437[i]] = i;\n    }\n  }\n\n  var result = bufferAlloc(string.length);\n  for (var i = 0; i < string.length; i++) {\n    var b = reverseCp437[string[i]];\n    if (b == null) throw new Error(\"character not encodable in CP437: \" + JSON.stringify(string[i]));\n    result[i] = b;\n  }\n\n  return result;\n}\n\nfunction bufferAlloc(size) {\n  bufferAlloc = modern;\n  try {\n    return bufferAlloc(size);\n  } catch (e) {\n    bufferAlloc = legacy;\n    return bufferAlloc(size);\n  }\n  function modern(size) {\n    return Buffer.allocUnsafe(size);\n  }\n  function legacy(size) {\n    return new Buffer(size);\n  }\n}\nfunction bufferFrom(something, encoding) {\n  bufferFrom = modern;\n  try {\n    return bufferFrom(something, encoding);\n  } catch (e) {\n    bufferFrom = legacy;\n    return bufferFrom(something, encoding);\n  }\n  function modern(something, encoding) {\n    return Buffer.from(something, encoding);\n  }\n  function legacy(something, encoding) {\n    return new Buffer(something, encoding);\n  }\n}\nfunction bufferIncludes(buffer, content) {\n  bufferIncludes = modern;\n  try {\n    return bufferIncludes(buffer, content);\n  } catch (e) {\n    bufferIncludes = legacy;\n    return bufferIncludes(buffer, content);\n  }\n  function modern(buffer, content) {\n    return buffer.includes(content);\n  }\n  function legacy(buffer, content) {\n    for (var i = 0; i <= buffer.length - content.length; i++) {\n      for (var j = 0;; j++) {\n        if (j === content.length) return true;\n        if (buffer[i + j] !== content[j]) break;\n      }\n    }\n    return false;\n  }\n}\n", "import { MinecraftFolder, MinecraftLocation } from '@xmcl/core'\nimport type { Version } from '@xmcl/core'\nimport { writeFile } from 'fs/promises'\nimport { FetchOptions, InstallOptions, doFetch, ensureFile } from './utils'\n\nexport interface FabricArtifactVersion {\n  gameVersion?: string // \"20w10a\",\n  separator?: string\n  build?: number\n  maven: string // \"net.fabricmc:yarn:20w10a+build.7\",\n  version: string // \"20w10a+build.7\",\n  stable: boolean\n}\n\nexport interface FabricArtifacts {\n  mappings: FabricArtifactVersion[]\n  loader: FabricArtifactVersion[]\n}\n\nexport interface FabricLoaderArtifact {\n  loader: FabricArtifactVersion\n  intermediary: FabricArtifactVersion\n  launcherMeta: {\n    version: number\n    libraries: {\n      client: { name: string; url: string }[]\n      common: { name: string; url: string }[]\n      server: { name: string; url: string }[]\n    }\n    mainClass: {\n      client: string\n      server: string\n    }\n  }\n}\n\n/**\n * Get supported fabric game versions\n */\nexport async function getFabricGames(options?: FetchOptions): Promise<string[]> {\n  const response = await doFetch(options, `${DEFAULT_META_URL_FABRIC}/v2/game`)\n  const body = await response.json() as Array<{ version: string }>\n  return body.map((g) => g.version)\n}\n\n/**\n * Get fabric-loader artifact list\n */\nexport async function getFabricLoaders(options?: FetchOptions): Promise<FabricArtifactVersion[]> {\n  const response = await doFetch(options, `${DEFAULT_META_URL_FABRIC}/v2/versions/loader`)\n  const body = response.json()\n  return body\n}\n\n/**\n * Get fabric-loader artifact list by Minecraft version\n * @param minecraft The minecraft version\n */\nexport async function getLoaderArtifactListFor(minecraft: string, options?: FetchOptions): Promise<FabricLoaderArtifact[]> {\n  const response = await doFetch(options, `${DEFAULT_META_URL_FABRIC}/v2/versions/loader/` + minecraft)\n  const body = response.json()\n  return body\n}\n/**\n * Get fabric-loader artifact list by Minecraft version\n * @param minecraft The minecraft version\n * @param loader The yarn-loader version\n */\nexport async function getFabricLoaderArtifact(minecraft: string, loader: string, options?: FetchOptions): Promise<FabricLoaderArtifact> {\n  const response = await doFetch(options, `${DEFAULT_META_URL_FABRIC}/v2/versions/loader/` + minecraft + '/' + loader)\n  const body = response.json()\n  return body\n}\n\nexport interface FabricInstallOptions extends InstallOptions {\n  side?: 'client' | 'server'\n}\n\n/**\n * Generate fabric version json from loader artifact.\n * @param loader The fabric loader artifact\n * @param side The side of the fabric\n * @param options\n * @returns The generated version json\n */\nexport function getVersionJsonFromLoaderArtifact(loader: FabricLoaderArtifact, side: 'client' | 'server', options: FabricInstallOptions = {}) {\n  const mcversion = loader.intermediary.version\n  const id = options.versionId || `${mcversion}-fabric${loader.loader.version}`\n  const libraries = [\n    { name: loader.loader.maven, url: 'https://maven.fabricmc.net/' },\n    { name: loader.intermediary.maven, url: 'https://maven.fabricmc.net/' },\n    ...loader.launcherMeta.libraries.common,\n    ...loader.launcherMeta.libraries[side],\n  ]\n  const mainClass = loader.launcherMeta.mainClass[side]\n  const inheritsFrom = options.inheritsFrom || mcversion\n\n  return {\n    id,\n    inheritsFrom,\n    mainClass,\n    libraries,\n    arguments: {\n      game: [],\n      jvm: [],\n    },\n    releaseTime: new Date().toJSON(),\n    time: new Date().toJSON(),\n  }\n}\n\n/**\n * Install fabric version json.\n *\n * If side is `server`, it requires the Minecraft version json to be installed.\n *\n * @returns The installed version id\n */\nexport async function installFabricByLoaderArtifact(loader: FabricLoaderArtifact, minecraft: MinecraftLocation, options: FabricInstallOptions = {}) {\n  const folder = MinecraftFolder.from(minecraft)\n\n  const side = options.side || 'client'\n  const version = getVersionJsonFromLoaderArtifact(loader, side, options)\n\n  const jsonFile = side === 'client' ? folder.getVersionJson(version.id) : folder.getVersionServerJson(version.id)\n  await ensureFile(jsonFile)\n  await writeFile(jsonFile, JSON.stringify(version, null, 4))\n\n  return version.id\n}\n\nexport interface InstallFabricVersionOptions extends FetchOptions {\n  minecraftVersion: string\n  version: string\n  minecraft: MinecraftLocation\n  side?: 'client' | 'server'\n}\n\nexport const DEFAULT_META_URL_FABRIC = 'https://meta.fabricmc.net'\n\nexport async function installFabric(options: InstallFabricVersionOptions) {\n  const side = options.side ?? 'client'\n  const url = side === 'client'\n    ? `${DEFAULT_META_URL_FABRIC}/v2/versions/loader/${options.minecraftVersion}/${options.version}/profile/json`\n    : `${DEFAULT_META_URL_FABRIC}/v2/versions/loader/${options.minecraftVersion}/${options.version}/server/json`\n  const response = await doFetch(options, url)\n  const content: Version = await response.json() as any\n\n  const minecraft = MinecraftFolder.from(options.minecraft)\n  const versionName = `${options.minecraftVersion}-fabric${options.version}`\n  content.id = versionName\n\n  const jsonPath = side === 'client' ? minecraft.getVersionJson(versionName) : minecraft.getVersionServerJson(versionName)\n\n  await ensureFile(jsonPath)\n  await writeFile(jsonPath, JSON.stringify(content))\n\n  return versionName\n}\n", "/* eslint-disable n/no-unsupported-features/node-builtins */\nimport { ChildProcess, ExecOptions, spawn, SpawnOptions } from 'child_process'\nimport { Abortable } from 'events'\nimport { access, mkdir, stat } from 'fs/promises'\nimport { dirname } from 'path'\n\nexport { checksum } from '@xmcl/core'\n\nexport function missing(target: string) {\n  return access(target).then(() => false, () => true)\n}\n\nexport async function ensureDir(target: string) {\n  try {\n    await mkdir(target)\n  } catch (err) {\n    const e: any = err\n    if (await stat(target).then((s) => s.isDirectory()).catch(() => false)) { return }\n    if (e.code === 'EEXIST') { return }\n    if (e.code === 'ENOENT') {\n      if (dirname(target) === target) {\n        throw e\n      }\n      try {\n        await ensureDir(dirname(target))\n        await mkdir(target)\n      } catch {\n        if (await stat(target).then((s) => s.isDirectory()).catch((e) => false)) { return }\n        throw e\n      }\n      return\n    }\n    throw e\n  }\n}\n\nexport interface SpawnJavaOptions {\n  /**\n   * The java exectable path. It will use `java` by default.\n   *\n   * @defaults \"java\"\n   */\n  java?: string\n\n  /**\n   * The spawn process function. Used for spawn the java process at the end.\n   *\n   * By default, it will be the spawn function from \"child_process\" module. You can use this option to change the 3rd party spawn like [cross-spawn](https://www.npmjs.com/package/cross-spawn)\n   */\n  spawn?: (command: string, args?: ReadonlyArray<string>, options?: SpawnOptions) => ChildProcess\n}\n\nexport function ensureFile(target: string) {\n  return ensureDir(dirname(target))\n}\nexport function normalizeArray<T>(arr: T | T[] = []): T[] {\n  return arr instanceof Array ? arr : [arr]\n}\nexport function spawnProcess(spawnJavaOptions: SpawnJavaOptions, args: string[], options?: ExecOptions) {\n  const process = (spawnJavaOptions?.spawn ?? spawn)(spawnJavaOptions.java ?? 'java', args, options)\n  return waitProcess(process)\n}\n\nexport function waitProcess(process: ChildProcess) {\n  return new Promise<void>((resolve, reject) => {\n    const errorMsg: string[] = []\n    process.on('error', (err) => {\n      reject(err)\n    })\n    process.on('close', (code) => {\n      if (code !== 0) { reject(new Error(errorMsg.join(''))) } else { resolve() }\n    })\n    process.on('exit', (code) => {\n      if (code !== 0) { reject(new Error(errorMsg.join(''))) } else { resolve() }\n    })\n    process.stdout?.setEncoding('utf-8')\n    process.stdout?.on('data', (buf) => { })\n    process.stderr?.setEncoding('utf-8')\n    process.stderr?.on('data', (buf) => { errorMsg.push(buf.toString()) })\n  })\n}\n\n/**\n * Join two urls\n */\nexport function joinUrl(a: string, b: string) {\n  if (a.endsWith('/') && b.startsWith('/')) {\n    return a + b.substring(1)\n  }\n  if (!a.endsWith('/') && !b.startsWith('/')) {\n    return a + '/' + b\n  }\n  return a + b\n}\n\nexport interface ParallelTaskOptions {\n  throwErrorImmediately?: boolean\n}\n/**\n * Shared install options\n */\nexport interface InstallOptions {\n  /**\n     * When you want to install a version over another one.\n     *\n     * Like, you want to install liteloader over a forge version.\n     * You should fill this with that forge version id.\n     */\n  inheritsFrom?: string\n\n  /**\n     * Override the newly installed version id.\n     *\n     * If this is absent, the installed version id will be either generated or provided by installer.\n     */\n  versionId?: string\n}\n\nexport function errorToString(e: any) {\n  if (e instanceof Error) {\n    return e.stack ? e.stack : e.message\n  }\n  return e.toString()\n}\n\nexport interface FetchOptions extends Abortable {\n  fetch?: (url: string, init?: RequestInit) => Promise<Response>\n}\n\nexport function doFetch(o: FetchOptions | undefined, url: string, init?: RequestInit) {\n  if (init) {\n    init.signal = o?.signal\n  } else {\n    init = { signal: o?.signal }\n  }\n  return o?.fetch ? o.fetch(url, init) : fetch(url, init)\n}\n", "import { MinecraftFolder, MinecraftLocation } from '@xmcl/core'\nimport { Task, task } from '@xmcl/task'\nimport { readFile, writeFile } from 'fs/promises'\nimport { join } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { ensureDir, InstallOptions, missing } from './utils'\n\nexport const DEFAULT_VERSION_MANIFEST = 'http://dl.liteloader.com/versions/versions.json'\n/**\n * The liteloader version list. Containing the minecraft version -> liteloader version info mapping.\n */\nexport interface LiteloaderVersionList {\n  meta: {\n    description: string\n    authors: string\n    url: string\n    updated: string\n    updatedTime: number\n  }\n  versions: { [version: string]: { snapshot?: LiteloaderVersion; release?: LiteloaderVersion } }\n}\nfunction processLibraries(lib: { name: string; url?: string }) {\n  if (Object.keys(lib).length === 1 && lib.name) {\n    if (lib.name.startsWith('org.ow2.asm')) {\n      lib.url = 'https://files.minecraftforge.net/maven/'\n    }\n  }\n  return lib\n}\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace LiteloaderVersionList {\n  export function parse(content: string) {\n    const result = JSON.parse(content)\n    const metalist = { meta: result.meta, versions: {} }\n    for (const mcversion in result.versions) {\n      const versions: { release?: LiteloaderVersion; snapshot?: LiteloaderVersion } =\n                (metalist.versions as any)[mcversion] = {}\n      const snapshots = result.versions[mcversion].snapshots\n      const artifacts = result.versions[mcversion].artefacts // that's right, artefact\n      const url = result.versions[mcversion].repo.url\n      if (snapshots) {\n        const { stream, file, version, md5, timestamp, tweakClass, libraries } = snapshots['com.mumfrey:liteloader'].latest\n        const type = (stream === 'RELEASE' ? 'RELEASE' : 'SNAPSHOT')\n        versions.snapshot = {\n          url,\n          type,\n          file,\n          version,\n          md5,\n          timestamp,\n          mcversion,\n          tweakClass,\n          libraries: libraries.map(processLibraries),\n        }\n      }\n      if (artifacts) {\n        const { stream, file, version, md5, timestamp, tweakClass, libraries } = artifacts['com.mumfrey:liteloader'].latest\n        const type = (stream === 'RELEASE' ? 'RELEASE' : 'SNAPSHOT')\n        versions.release = {\n          url,\n          type,\n          file,\n          version,\n          md5,\n          timestamp,\n          mcversion,\n          tweakClass,\n          libraries: libraries.map(processLibraries),\n        }\n      }\n    }\n    return metalist\n  }\n}\n\n/**\n * A liteloader remote version information\n */\nexport interface LiteloaderVersion {\n  version: string\n  url: string\n  file: string\n  mcversion: string\n  type: 'RELEASE' | 'SNAPSHOT'\n  md5: string\n  timestamp: string\n  libraries: Array<{ name: string; url?: string }>\n  tweakClass: string\n}\n\nconst snapshotRoot = 'http://dl.liteloader.com/versions/'\nconst releaseRoot = 'http://repo.mumfrey.com/content/repositories/liteloader/'\n\n/**\n * This error is only thrown from liteloader install currently.\n */\nexport class MissingVersionJsonError extends Error {\n  constructor(public version: string,\n    /**\n         * The path of version json\n         */\n    public path: string) {\n    super()\n    this.name = 'MissingVersionJson'\n  }\n}\n/**\n * Get or update the LiteLoader version list.\n *\n * This will request liteloader offical json by default. You can replace the request by assigning the remote option.\n */\nexport async function getLiteloaderVersionList(options: {\n  /**\n     * The request dispatcher\n     */\n  dispatcher?: Dispatcher\n} = {}): Promise<LiteloaderVersionList> {\n  const response = await request(DEFAULT_VERSION_MANIFEST, { dispatcher: options.dispatcher, throwOnError: true })\n  const body = await response.body.text()\n  return LiteloaderVersionList.parse(body)\n}\n\n/**\n * Install the liteloader to specific minecraft location.\n *\n * This will install the liteloader amount on the corresponded Minecraft version by default.\n * If you want to install over the forge. You should first install forge and pass the installed forge version id to the third param,\n * like `1.12-forge-xxxx`\n *\n * @param versionMeta The liteloader version metadata.\n * @param location The minecraft location you want to install\n * @param version The real existed version id (under the the provided minecraft location) you want to installed liteloader inherit\n * @throws {@link MissingVersionJsonError}\n */\nexport function installLiteloader(versionMeta: LiteloaderVersion, location: MinecraftLocation, options?: InstallOptions) {\n  return installLiteloaderTask(versionMeta, location, options).startAndWait()\n}\n\nfunction buildVersionInfo(versionMeta: LiteloaderVersion, mountedJSON: any) {\n  const id = `${mountedJSON.id}-Liteloader${versionMeta.mcversion}-${versionMeta.version}`\n  const time = new Date(Number.parseInt(versionMeta.timestamp, 10) * 1000).toISOString()\n  const releaseTime = time\n  const type = versionMeta.type\n  const libraries = [\n    {\n      name: `com.mumfrey:liteloader:${versionMeta.version}`,\n      url: type === 'SNAPSHOT' ? snapshotRoot : releaseRoot,\n    },\n    ...versionMeta.libraries.map(processLibraries),\n  ]\n  const mainClass = 'net.minecraft.launchwrapper.Launch'\n  const inheritsFrom = mountedJSON.id\n  const jar = mountedJSON.jar || mountedJSON.id\n  const info: any = {\n    id, time, releaseTime, type, libraries, mainClass, inheritsFrom, jar,\n  }\n  if (mountedJSON.arguments) {\n    // liteloader not supported for version > 1.12...\n    // just write this for exception\n    info.arguments = {\n      game: ['--tweakClass', versionMeta.tweakClass],\n      jvm: [],\n    }\n  } else {\n    info.minecraftArguments = `--tweakClass ${versionMeta.tweakClass} ` + mountedJSON.minecraftArguments\n  }\n  return info\n}\n\n/**\n * Install the liteloader to specific minecraft location.\n *\n * This will install the liteloader amount on the corresponded Minecraft version by default.\n * If you want to install over the forge. You should first install forge and pass the installed forge version id to the third param,\n * like `1.12-forge-xxxx`\n *\n * @tasks installLiteloader, installLiteloader.resolveVersionJson installLiteloader.generateLiteloaderJson\n *\n * @param versionMeta The liteloader version metadata.\n * @param location The minecraft location you want to install\n * @param version The real existed version id (under the the provided minecraft location) you want to installed liteloader inherit\n */\nexport function installLiteloaderTask(versionMeta: LiteloaderVersion, location: MinecraftLocation, options: InstallOptions = {}): Task<string> {\n  return task('installLiteloader', async function installLiteloader() {\n    const mc: MinecraftFolder = MinecraftFolder.from(location)\n\n    const mountVersion = options.inheritsFrom || versionMeta.mcversion\n\n    const mountedJSON: any = await this.yield(task('resolveVersionJson', async function resolveVersionJson() {\n      if (await missing(mc.getVersionJson(mountVersion))) {\n        throw new MissingVersionJsonError(mountVersion, mc.getVersionJson(mountVersion))\n      }\n      return readFile(mc.getVersionJson(mountVersion)).then((b) => b.toString()).then(JSON.parse)\n    }))\n\n    const versionInf = await this.yield(task('generateLiteloaderJson', async function generateLiteloaderJson() {\n      const inf = buildVersionInfo(versionMeta, mountedJSON)\n\n      inf.id = options.versionId || inf.id\n      inf.inheritsFrom = options.inheritsFrom || inf.inheritsFrom\n\n      const versionPath = mc.getVersionRoot(inf.id)\n\n      await ensureDir(versionPath)\n      await writeFile(join(versionPath, inf.id + '.json'), JSON.stringify(inf, undefined, 4))\n\n      return inf\n    }))\n    return versionInf.id as string\n  })\n}\n", "import { LibraryInfo, MinecraftFolder, MinecraftLocation, Version as VersionJson } from '@xmcl/core'\nimport { getDownloadBaseOptions } from '@xmcl/file-transfer'\nimport { parse as parseForge } from '@xmcl/forge-site-parser'\nimport { Task, task } from '@xmcl/task'\nimport { filterEntries, open, openEntryReadStream, readAllEntries, readEntry } from '@xmcl/unzip'\nimport { createWriteStream } from 'fs'\nimport { writeFile } from 'fs/promises'\nimport { basename, dirname, join, relative, sep } from 'path'\nimport { pipeline } from 'stream/promises'\nimport { Dispatcher, request } from 'undici'\nimport { Entry, ZipFile } from 'yauzl'\nimport { ZipFile as WriteableZipFile } from 'yazl'\nimport { DownloadTask } from './downloadTask'\nimport { LibraryOptions, resolveLibraryDownloadUrls } from './minecraft'\nimport { InstallProfile, InstallProfileOption, installByProfileTask } from './profile'\nimport { InstallOptions as InstallOptionsBase, ensureDir, ensureFile, joinUrl, normalizeArray } from './utils'\nimport { ZipValidator } from './zipValdiator'\n\nexport interface ForgeVersionList {\n  mcversion: string\n  versions: ForgeVersion[]\n}\n/**\n * The forge version metadata to download a forge\n */\nexport interface ForgeVersion {\n  /**\n     * The installer info\n     */\n  installer: {\n    md5: string\n    sha1: string\n    /**\n         * The url path to concat with forge maven\n         */\n    path: string\n  }\n  universal: {\n    md5: string\n    sha1: string\n    /**\n         * The url path to concat with forge maven\n         */\n    path: string\n  }\n  /**\n     * The minecraft version\n     */\n  mcversion: string\n  /**\n     * The forge version (without minecraft version)\n     */\n  version: string\n\n  type: 'buggy' | 'recommended' | 'common' | 'latest'\n}\n\n/**\n * All the useful entries in forge installer jar\n */\nexport interface ForgeInstallerEntries {\n  /**\n     *  maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}.jar\n     */\n  forgeJar?: Entry\n  /**\n     *  maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-universal.jar\n     */\n  forgeUniversalJar?: Entry\n  /**\n     * data/client.lzma\n     */\n  clientLzma?: Entry\n  /**\n     * data/server.lzma\n     */\n  serverLzma?: Entry\n  /**\n     * install_profile.json\n     */\n  installProfileJson?: Entry\n  /**\n     * version.json\n     */\n  versionJson?: Entry\n  /**\n   * forge-${forgeVersion}-universal.jar\n   */\n  legacyUniversalJar?: Entry\n  /**\n   * data/run.sh\n   */\n  runSh?: Entry\n  /**\n   * data/run.bat\n   */\n  runBat?: Entry\n  /**\n     * data/unix_args.txt\n     */\n  unixArgs?: Entry\n  /**\n   * data/user_jvm_args.txt\n   */\n  userJvmArgs?: Entry\n  /**\n   * data/win_args.txt\n   */\n  winArgs?: Entry\n}\n\nexport type ForgeInstallerEntriesPattern = ForgeInstallerEntries & Required<Pick<ForgeInstallerEntries, 'versionJson' | 'installProfileJson'>>\nexport type ForgeLegacyInstallerEntriesPattern = Required<Pick<ForgeInstallerEntries, 'installProfileJson' | 'legacyUniversalJar'>>\n\ntype RequiredVersion = {\n  /**\n     * The installer info.\n     *\n     * If this is not presented, it will genreate from mcversion and forge version.\n     */\n  installer?: {\n    sha1?: string\n    /**\n     * The url path to concat with forge maven\n     */\n    path: string\n  }\n  /**\n   * The minecraft version\n   */\n  mcversion: string\n  /**\n   * The forge version (without minecraft version)\n   */\n  version: string\n}\n\nexport const DEFAULT_FORGE_MAVEN = 'http://files.minecraftforge.net/maven'\n\n/**\n * The options to install forge.\n */\nexport interface InstallForgeOptions extends LibraryOptions, InstallOptionsBase, InstallProfileOption {\n  side?: 'client' | 'server'\n}\n\nexport class DownloadForgeInstallerTask extends DownloadTask {\n  readonly installJarPath: string\n\n  constructor(forgeVersion: string, installer: RequiredVersion['installer'], minecraft: MinecraftFolder, options: InstallForgeOptions, legacy?: boolean) {\n    const classifier = legacy ? 'universal' : 'installer'\n    const ext = legacy ? 'zip' : 'jar'\n    const path = installer\n      ? installer.path\n      : `net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-${classifier}.${ext}`\n    let url: string\n    if (installer) {\n      try {\n        const parsedUrl = new URL(path)\n        url = parsedUrl.toString()\n      } catch (e) {\n        const forgeMavenPath = path.replace('/maven', '').replace('maven', '')\n        url = joinUrl(DEFAULT_FORGE_MAVEN, forgeMavenPath)\n      }\n    } else {\n      const forgeMavenPath = path.replace('/maven', '').replace('maven', '')\n      url = joinUrl(DEFAULT_FORGE_MAVEN, forgeMavenPath)\n    }\n\n    const library = VersionJson.resolveLibrary({\n      name: `net.minecraftforge:forge:${forgeVersion}:${classifier}`,\n      downloads: {\n        artifact: {\n          url,\n          path: `net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-${classifier}.${ext}`,\n          size: -1,\n          sha1: installer?.sha1 || '',\n        },\n      },\n    })!\n    const mavenHost = options.mavenHost ? normalizeArray(options.mavenHost) : []\n\n    if (mavenHost.indexOf(DEFAULT_FORGE_MAVEN) === -1) {\n      mavenHost.push(DEFAULT_FORGE_MAVEN)\n    }\n\n    const urls = resolveLibraryDownloadUrls(library, { ...options, mavenHost })\n\n    const installJarPath = minecraft.getLibraryByPath(library.path)\n\n    super({\n      url: urls,\n      destination: installJarPath,\n      validator: installer?.sha1\n        ? options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: installer?.sha1 }) || { algorithm: 'sha1', hash: installer?.sha1 }\n        : new ZipValidator(),\n      ...getDownloadBaseOptions(options),\n    })\n\n    this.installJarPath = installJarPath\n    this.name = 'downloadInstaller'\n    this.param = { version: forgeVersion }\n  }\n}\n\nfunction getLibraryPathWithoutMaven(mc: MinecraftFolder, name: string) {\n  // remove the maven/ prefix\n  return mc.getLibraryByPath(name.substring(name.indexOf('/') + 1))\n}\nfunction extractEntryTo(zip: ZipFile, e: Entry, dest: string) {\n  return openEntryReadStream(zip, e).then((stream) => pipeline(stream, createWriteStream(dest)))\n}\n\nasync function installLegacyForgeFromUniversalZip(forgeZip: ZipFile, mc: MinecraftFolder, forgeVersion: string, mcVersion: string) {\n  const minecraftZip = await open(mc.getVersionJar(mcVersion), { lazyEntries: true, autoClose: false })\n  const forgeEntries = await readAllEntries(forgeZip)\n  const mcEntries = await readAllEntries(minecraftZip)\n  const finalZipEntries: Record<string, [Entry, ZipFile]> = {}\n  // forge entries overwrite mc entries\n  for (const e of mcEntries) {\n    if (e.fileName.startsWith('META-INF')) continue\n    finalZipEntries[e.fileName] = [e, minecraftZip]\n  }\n  for (const e of forgeEntries) {\n    if (e.fileName.startsWith('META-INF')) continue\n    finalZipEntries[e.fileName] = [e, forgeZip]\n  }\n  const finalZip = new WriteableZipFile()\n  for (const [k, [e, zip]] of Object.entries(finalZipEntries)) {\n    finalZip.addReadStream(await openEntryReadStream(zip, e), e.fileName)\n  }\n  finalZip.end()\n  const dest = mc.getLibraryByPath(`net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}.jar`)\n  await ensureDir(dirname(dest))\n  await pipeline(finalZip.outputStream, createWriteStream(dest))\n  const versionId = `${mcVersion}-forge-${forgeVersion}`\n  await ensureDir(mc.getVersionRoot(versionId))\n  const versionJson: VersionJson = {\n    id: versionId,\n    inheritsFrom: mcVersion,\n    time: new Date().toUTCString(),\n    type: 'release',\n    releaseTime: new Date().toUTCString(),\n    minimumLauncherVersion: 4,\n    arguments: {\n      game: [\n      ],\n      // eslint-disable-next-line no-template-curly-in-string\n      jvm: ['-Dminecraft.applet.TargetDirectory=${game_directory}'],\n    },\n    mainClass: 'net.minecraft.launchwrapper.Launch',\n    libraries: [\n      { name: `net.minecraftforge:forge:${forgeVersion}` },\n      {\n        downloads: {\n          artifact: {\n            path: 'guava-12.0.1.jar',\n            sha1: 'b8e78b9af7bf45900e14c6f958486b6ca682195f',\n            size: -1,\n            url: 'https://files.minecraftforge.net/maven/com/google/guava/guava/12.0.1/guava-12.0.1.jar',\n          },\n        },\n        name: 'com.google.guava:guava:12.0.1',\n      },\n      {\n        downloads: {\n          artifact: {\n            path: 'argo-2.25.jar',\n            sha1: 'bb672829fde76cb163004752b86b0484bd0a7f4b',\n            size: -1,\n            url: 'https://files.minecraftforge.net/maven/net/sourceforge/argo/argo/2.25/argo-2.25.jar',\n          },\n        },\n        name: 'net.sourceforge.argo:argo:2.25',\n      },\n      {\n        downloads: {\n          artifact: {\n            path: 'asm-all-4.0.jar',\n            sha1: '98308890597acb64047f7e896638e0d98753ae82',\n            size: -1,\n            url: 'https://files.multimc.org/fmllibs/asm-all-4.0.jar',\n          },\n        },\n        name: 'org.ow2.asm:asm-all:4.0',\n      },\n      {\n        downloads: {\n          artifact: {\n            path: 'bcprov-jdk15on-147.jar',\n            sha1: 'b6f5d9926b0afbde9f4dbe3db88c5247be7794bb',\n            size: -1,\n            url: 'https://files.multimc.org/fmllibs/bcprov-jdk15on-147.jar',\n          },\n        },\n        name: 'org.bouncycastle:bcprov-jdk15on:1.47',\n      },\n    ],\n  }\n  await writeFile(mc.getVersionJson(versionId), JSON.stringify(versionJson, null, 4))\n  return versionId\n}\n\nasync function installLegacyForgeFromZip(zip: ZipFile, entries: ForgeLegacyInstallerEntriesPattern, profile: InstallProfile, mc: MinecraftFolder, jarFilePath: string, options: InstallForgeOptions) {\n  const versionJson = profile.versionInfo\n  if (!versionJson) {\n    throw new Error(`Malform legacy installer json ${profile.version}`)\n  }\n\n  // apply override for inheritsFrom\n  versionJson.id = options.versionId || versionJson.id\n  versionJson.inheritsFrom = options.inheritsFrom || versionJson.inheritsFrom\n\n  const rootPath = mc.getVersionRoot(versionJson.id)\n  const versionJsonPath = join(rootPath, `${versionJson.id}.json`)\n  await ensureFile(versionJsonPath)\n\n  const forgeLib = versionJson.libraries.find((l) => l.name.startsWith('net.minecraftforge:forge') || l.name.startsWith('net.minecraftforge:minecraftforge'))\n  if (!forgeLib) {\n    throw new BadForgeInstallerJarError(jarFilePath)\n  }\n  const library = LibraryInfo.resolve(forgeLib)\n  const jarPath = mc.getLibraryByPath(library.path)\n  await ensureFile(jarPath)\n\n  await Promise.all([\n    writeFile(versionJsonPath, JSON.stringify(versionJson, undefined, 4)),\n    extractEntryTo(zip, entries.legacyUniversalJar, jarPath),\n  ])\n\n  return versionJson.id\n}\n\n/**\n * Unpack forge installer jar file content to the version library artifact directory.\n * @param zip The forge jar file\n * @param entries The entries\n * @param profile The forge install profile\n * @param mc The minecraft location\n * @returns The installed version id\n */\nexport async function unpackForgeInstaller(zip: ZipFile, entries: ForgeInstallerEntriesPattern, profile: InstallProfile, mc: MinecraftFolder, jarPath: string, options: InstallForgeOptions) {\n  const versionJson: VersionJson = await readEntry(zip, entries.versionJson).then((b) => b.toString()).then(JSON.parse)\n\n  // apply override for inheritsFrom\n  versionJson.id = options.versionId || versionJson.id\n  versionJson.inheritsFrom = options.inheritsFrom || versionJson.inheritsFrom\n\n  // resolve all the required paths\n  const rootPath = mc.getVersionRoot(versionJson.id)\n\n  const versionJsonPath = join(rootPath, `${versionJson.id}.json`)\n  const installJsonPath = join(rootPath, 'install_profile.json')\n\n  const mavenLibVersionPath = dirname(jarPath)\n\n  const unpackData = (entry: Entry) => {\n    promises.push(extractEntryTo(zip, entry, join(mavenLibVersionPath, entry.fileName.substring('data/'.length))))\n  }\n\n  await ensureFile(versionJsonPath)\n\n  const promises: Promise<void>[] = []\n  if (entries.forgeUniversalJar) {\n    promises.push(extractEntryTo(zip, entries.forgeUniversalJar, getLibraryPathWithoutMaven(mc, entries.forgeUniversalJar.fileName)))\n  }\n\n  if (!profile.data) {\n    profile.data = {}\n  }\n\n  const mavenPaths = relative(mc.libraries, mavenLibVersionPath).split(sep)\n  const mavenVersion = mavenPaths.pop()\n  const mavenArtifact = mavenPaths.pop()\n  const mavenGroup = mavenPaths.join('.')\n  const mavenPath = `${mavenGroup}:${mavenArtifact}:${mavenVersion}`\n\n  const installerMaven = `${mavenPath}:installer`\n  profile.data.INSTALLER = {\n    client: `[${installerMaven}]`,\n    server: `[${installerMaven}]`,\n  }\n\n  if (entries.serverLzma) {\n    // forge version and mavens, compatible with twitch api\n    const serverMaven = `${mavenPath}:serverdata@lzma`\n    // override forge bin patch location\n    profile.data.BINPATCH.server = `[${serverMaven}]`\n\n    const serverBinPath = mc.getLibraryByPath(LibraryInfo.resolve(serverMaven).path)\n    await ensureFile(serverBinPath)\n    promises.push(extractEntryTo(zip, entries.serverLzma, serverBinPath))\n  }\n\n  if (entries.clientLzma) {\n    // forge version and mavens, compatible with twitch api\n    const clientMaven = `${mavenPath}:clientdata@lzma`\n    // override forge bin patch location\n    profile.data.BINPATCH.client = `[${clientMaven}]`\n\n    const clientBinPath = mc.getLibraryByPath(LibraryInfo.resolve(clientMaven).path)\n    await ensureFile(clientBinPath)\n    promises.push(extractEntryTo(zip, entries.clientLzma, clientBinPath))\n  }\n\n  if (entries.forgeJar) {\n    promises.push(extractEntryTo(zip, entries.forgeJar, getLibraryPathWithoutMaven(mc, entries.forgeJar.fileName)))\n  }\n  if (entries.runBat) { unpackData(entries.runBat) }\n  if (entries.runSh) { unpackData(entries.runSh) }\n  if (entries.winArgs) { unpackData(entries.winArgs) }\n  if (entries.unixArgs) { unpackData(entries.unixArgs) }\n  if (entries.userJvmArgs) { unpackData(entries.userJvmArgs) }\n\n  promises.push(\n    writeFile(installJsonPath, JSON.stringify(profile)),\n    writeFile(versionJsonPath, JSON.stringify(versionJson)),\n  )\n\n  await Promise.all(promises)\n\n  return versionJson.id\n}\n\nexport function isLegacyForgeInstallerEntries(entries: ForgeInstallerEntries): entries is ForgeLegacyInstallerEntriesPattern {\n  return !!entries.legacyUniversalJar && !!entries.installProfileJson\n}\n\nexport function isForgeInstallerEntries(entries: ForgeInstallerEntries): entries is ForgeInstallerEntriesPattern {\n  return !!entries.installProfileJson && !!entries.versionJson\n}\n\n/**\n * Walk the forge installer file to find key entries\n * @param zip THe forge instal\n * @param forgeVersion Forge version to install\n */\nexport async function walkForgeInstallerEntries(zip: ZipFile, forgeVersion: string): Promise<ForgeInstallerEntries> {\n  const [forgeJar, forgeUniversalJar, clientLzma, serverLzma, installProfileJson, versionJson, legacyUniversalJar, runSh, runBat, unixArgs, userJvmArgs, winArgs] = await filterEntries(zip, [\n    `maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}.jar`,\n    `maven/net/minecraftforge/forge/${forgeVersion}/forge-${forgeVersion}-universal.jar`,\n    'data/client.lzma',\n    'data/server.lzma',\n    'install_profile.json',\n    'version.json',\n    (e) => e.fileName === `forge-${forgeVersion}-universal.jar` || (e.fileName.startsWith('forge-') && e.fileName.endsWith('-universal.jar')) || (e.fileName.startsWith('minecraftforge-universal-')), // legacy installer format\n    'data/run.sh',\n    'data/run.bat',\n    'data/unix_args.txt',\n    'data/user_jvm_args.txt',\n    'data/win_args.txt',\n  ])\n  return {\n    forgeJar,\n    forgeUniversalJar,\n    clientLzma,\n    serverLzma,\n    installProfileJson,\n    versionJson,\n    legacyUniversalJar,\n    runSh,\n    runBat,\n    unixArgs,\n    userJvmArgs,\n    winArgs,\n  }\n}\n\nexport class BadForgeInstallerJarError extends Error {\n  name = 'BadForgeInstallerJarError'\n\n  constructor(\n    public jarPath: string,\n    /**\n         * What entry in jar is missing\n         */\n    public entry?: string) {\n    super(entry ? `Missing entry ${entry} in forge installer jar: ${jarPath}` : `Bad forge installer: ${jarPath}`)\n  }\n}\n\nexport function installByInstallerTask(version: RequiredVersion, minecraft: MinecraftLocation, options: InstallForgeOptions) {\n  return task('installForge', async function () {\n    function getForgeArtifactVersion() {\n      const [_, minor] = version.mcversion.split('.')\n      const minorVersion = Number.parseInt(minor)\n      if (minorVersion >= 7 && minorVersion <= 8) {\n        return `${version.mcversion}-${version.version}-${version.mcversion}`\n      }\n      if (version.version.startsWith(version.mcversion)) {\n        return version.version\n      }\n      return `${version.mcversion}-${version.version}`\n    }\n    const forgeVersion = getForgeArtifactVersion()\n    const isLegacy = version.mcversion.startsWith('1.4.')\n    const mc = MinecraftFolder.from(minecraft)\n    const jarPath: string = await this.yield(new DownloadForgeInstallerTask(forgeVersion, version.installer, mc, options, isLegacy)\n      .map(function () { return this.installJarPath }))\n\n    if (isLegacy) {\n      const forgeZip = await open(jarPath, { lazyEntries: true, autoClose: false })\n      const versionId = await installLegacyForgeFromUniversalZip(forgeZip, mc, forgeVersion, version.mcversion)\n      return versionId\n    }\n\n    const zip = await open(jarPath, { lazyEntries: true, autoClose: false })\n    const entries = await walkForgeInstallerEntries(zip, forgeVersion)\n\n    if (!entries.installProfileJson) {\n      throw new BadForgeInstallerJarError(jarPath, 'install_profile.json')\n    }\n    const profile: InstallProfile = await readEntry(zip, entries.installProfileJson).then((b) => b.toString()).then(JSON.parse)\n    if (isForgeInstallerEntries(entries)) {\n      // new forge\n      const versionId = await unpackForgeInstaller(zip, entries, profile, mc, jarPath, options)\n      await this.concat(installByProfileTask(profile, minecraft, options))\n      return versionId\n    } else if (isLegacyForgeInstallerEntries(entries)) {\n      // legacy forge\n      return installLegacyForgeFromZip(zip, entries, profile, mc, jarPath, options)\n    } else {\n      // bad forge\n      throw new BadForgeInstallerJarError(jarPath)\n    }\n  })\n}\n\n/**\n * Install forge to target location.\n * Installation task for forge with mcversion >= 1.13 requires java installed on your pc.\n * @param version The forge version meta\n * @returns The installed version name.\n * @throws {@link BadForgeInstallerJarError}\n */\nexport function installForge(version: RequiredVersion, minecraft: MinecraftLocation, options?: InstallForgeOptions) {\n  return installForgeTask(version, minecraft, options).startAndWait()\n}\n\n/**\n * Install forge to target location.\n * Installation task for forge with mcversion >= 1.13 requires java installed on your pc.\n * @param version The forge version meta\n * @returns The task to install the forge\n * @throws {@link BadForgeInstallerJarError}\n */\nexport function installForgeTask(version: RequiredVersion, minecraft: MinecraftLocation, options: InstallForgeOptions = {}): Task<string> {\n  return installByInstallerTask(version, minecraft, options)\n}\n\n/**\n * Query the webpage content from files.minecraftforge.net.\n *\n * You can put the last query result to the fallback option. It will check if your old result is up-to-date.\n * It will request a new page only when the fallback option is outdated.\n *\n * @param option The option can control querying minecraft version, and page caching.\n */\nexport async function getForgeVersionList(options: {\n  /**\n     * The minecraft version you are requesting\n     */\n  minecraft?: string\n  dispatcher?: Dispatcher\n} = {}): Promise<ForgeVersionList> {\n  const mcversion = options.minecraft || ''\n  const url = mcversion === '' ? 'http://files.minecraftforge.net/maven/net/minecraftforge/forge/index.html' : `http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_${mcversion}.html`\n  const response = await request(url, {\n    dispatcher: options.dispatcher,\n    maxRedirections: 3,\n  })\n  const body = parseForge(await response.body.text())\n  return body as any\n}\n", "import { download, DownloadOptions } from '@xmcl/file-transfer'\nimport { AbortableTask } from '@xmcl/task'\nimport { errors } from 'undici'\n\nexport class DownloadTask extends AbortableTask<void> {\n  protected controller: AbortController | undefined\n\n  constructor(protected options: DownloadOptions) {\n    super()\n    this._from = options.url instanceof Array ? options.url[0] : options.url\n    this._to = options.destination\n  }\n\n  protected abort(): void {\n    if (this.controller) {\n      this.controller.abort()\n    }\n  }\n\n  protected process(): Promise<void> {\n    this.controller = new AbortController()\n    const signal = this.controller.signal\n    return download({\n      ...this.options,\n      progressController: (url, chunkSize, progress, total) => {\n        this._progress = progress\n        this._total = total\n        this._from = url.toString()\n        this.update(chunkSize)\n      },\n      abortSignal: signal,\n    })\n  }\n\n  protected isAbortedError(e: any): boolean {\n    if (e instanceof errors.RequestAbortedError || e.code === 'UND_ERR_ABORTED') {\n      return true\n    }\n    return false\n  }\n}\n\nexport class DownloadMultipleTask extends AbortableTask<void> {\n  protected controller: AbortController | undefined\n  protected progresses: number[] = []\n  protected totals: number[] = []\n\n  constructor(protected options: DownloadOptions[]) {\n    super()\n    this._progress = -1\n    this._total = -1\n  }\n\n  get total(): number {\n    if (this._total === -1) {\n      this._total = this.totals.reduce((a, b) => a + b, 0)\n    }\n    return this._total\n  }\n\n  get progress(): number {\n    if (this._progress === -1) {\n      this._progress = this.progresses.reduce((a, b) => a + b, 0)\n    }\n    return this._progress\n  }\n\n  protected onFinished?: (index: number) => void\n\n  protected async process(): Promise<void> {\n    this.progresses = this.options.map(() => 0)\n    this.totals = this.options.map(() => 0)\n    this.controller = new AbortController()\n    const results = await Promise.allSettled(this.options.map(async (options, i) => {\n      await download({\n        ...options,\n        progressController: (url, chunkSize, written, total) => {\n          this.progresses[i] = written\n          this.totals[i] = total\n\n          this._total = -1\n          this._progress = -1\n\n          this.update(chunkSize)\n          this._from = url.toString()\n        },\n        abortSignal: this.controller?.signal,\n      })\n      this.progresses[i] = this.totals[i]\n      this.update(0)\n      this.onFinished?.(i)\n    }))\n    const rejecteds = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected')\n    if (rejecteds.length > 0) {\n      if (this.isAbortedError(rejecteds[0].reason)) {\n        throw rejecteds[0].reason\n      }\n      throw new AggregateError(rejecteds.map((r) => r.reason).flatMap(r => r instanceof AggregateError ? r.errors : r))\n    }\n  }\n\n  protected abort(isCancelled: boolean): void {\n    if (this.controller) {\n      this.controller.abort()\n    }\n  }\n\n  protected isAbortedError(e: any): boolean {\n    if (e instanceof errors.RequestAbortedError || e.code === 'UND_ERR_ABORTED') {\n      return true\n    }\n    return false\n  }\n}\n", "/* eslint-disable n/no-unsupported-features/node-builtins */\nimport { MinecraftFolder, MinecraftLocation, ResolvedLibrary, ResolvedVersion, Version, Version as VersionJson } from '@xmcl/core'\nimport { ChecksumNotMatchError, ChecksumValidatorOptions, DownloadBaseOptions, JsonValidator, Validator, getDownloadBaseOptions } from '@xmcl/file-transfer'\nimport { Task, task } from '@xmcl/task'\nimport { link } from 'fs'\nimport { readFile, stat, writeFile } from 'fs/promises'\nimport { join, relative, sep } from 'path'\nimport { promisify } from 'util'\nimport { DownloadMultipleTask, DownloadTask } from './downloadTask'\nimport { ParallelTaskOptions, ensureDir, joinUrl, normalizeArray } from './utils'\nimport { ZipValidator } from './zipValdiator'\n\n/**\n * The function to swap library host.\n */\nexport type LibraryHost = (library: ResolvedLibrary) => string | string[] | undefined\n\nexport interface MinecraftVersionBaseInfo {\n  /**\n     * The version id, like 1.14.4\n     */\n  id: string\n  /**\n     * The version json download url\n     */\n  url: string\n}\n\n/**\n * The version metadata containing the version information, like download url\n */\nexport interface MinecraftVersion extends MinecraftVersionBaseInfo {\n  /**\n     * The version id, like 1.14.4\n     */\n  id: string\n  type: string\n  time: string\n  releaseTime: string\n  /**\n     * The version json download url\n     */\n  url: string\n}\n\nexport interface AssetInfo {\n  name: string\n  hash: string\n  size: number\n}\n\n/**\n * Minecraft version metadata list\n */\nexport interface MinecraftVersionList {\n  latest: {\n    /**\n         * Snapshot version id of the Minecraft\n         */\n    snapshot: string\n    /**\n         * Release version id of the Minecraft, like 1.14.2\n         */\n    release: string\n  }\n  /**\n     * All the vesrsion list\n     */\n  versions: MinecraftVersion[]\n}\n\n/**\n * Default minecraft version manifest url.\n */\nexport const DEFAULT_VERSION_MANIFEST_URL = 'https://launchermeta.mojang.com/mc/game/version_manifest.json'\n/**\n * Default resource/assets url root\n */\nexport const DEFAULT_RESOURCE_ROOT_URL = 'https://resources.download.minecraft.net'\n\n/**\n * Get and update the version list.\n * This try to send http GET request to offical Minecraft metadata endpoint by default.\n * You can swap the endpoint by passing url on `remote` in option.\n *\n * @returns The new list if there is\n */\nexport async function getVersionList(options: {\n  /**\n   * Request dispatcher\n   */\n  fetch?: typeof fetch,\n  remote?: string\n} = {}): Promise<MinecraftVersionList> {\n  const response = await (options.fetch ?? fetch)(options.remote ?? DEFAULT_VERSION_MANIFEST_URL);\n  return await response.json() as any\n}\n\n/**\n * Change the library host url\n */\nexport interface LibraryOptions extends DownloadBaseOptions, ParallelTaskOptions {\n  /**\n   * A more flexiable way to control library download url.\n   * @see mavenHost\n   */\n  libraryHost?: LibraryHost\n  /**\n   * The alterative maven host to download library. It will try to use these host from the `[0]` to the `[maven.length - 1]`\n   */\n  mavenHost?: string | string[]\n  /**\n   * Control how many libraries download task should run at the same time.\n   * It will override the `maxConcurrencyOption` if this is presented.\n   *\n   * This will be ignored if you have your own downloader assigned.\n   */\n  librariesDownloadConcurrency?: number\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n}\n/**\n * Change the host url of assets download\n */\nexport interface AssetsOptions extends DownloadBaseOptions, ParallelTaskOptions {\n  /**\n   * The alternative assets host to download asset. It will try to use these host from the `[0]` to the `[assetsHost.length - 1]`\n   */\n  assetsHost?: string | string[]\n  /**\n   * Control how many assets download task should run at the same time.\n   * It will override the `maxConcurrencyOption` if this is presented.\n   *\n   * This will be ignored if you have your own downloader assigned.\n   */\n  assetsDownloadConcurrency?: number\n  /**\n   * Use hash as the assets index file name. Default is `false`\n   */\n  useHashForAssetsIndex?: boolean\n  /**\n   * The assets index download or url replacement\n   */\n  assetsIndexUrl?: string | string[] | ((version: ResolvedVersion) => string | string[])\n\n  fetch?: typeof fetch\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n  /**\n   * Only precheck the size of the assets. Do not check the hash.\n   */\n  prevalidSizeOnly?: boolean\n}\n\nexport type InstallLibraryVersion = Pick<ResolvedVersion, 'libraries' | 'minecraftDirectory'>\n\nfunction resolveDownloadUrls<T>(original: string, version: T, option?: string | string[] | ((version: T) => string | string[])) {\n  const result = [] as string[]\n  if (typeof option === 'function') {\n    result.unshift(...normalizeArray(option(version)))\n  } else {\n    result.unshift(...normalizeArray(option))\n  }\n  if (result.indexOf(original) === -1) {\n    result.push(original)\n  }\n  return result\n}\n/**\n * Replace the minecraft client or server jar download\n */\nexport interface JarOption extends DownloadBaseOptions, ParallelTaskOptions, InstallSideOption {\n  /**\n   * The version json url replacement\n   */\n  json?: string | string[] | ((version: MinecraftVersionBaseInfo) => string | string[])\n  /**\n   * The client jar url replacement\n   */\n  client?: string | string[] | ((version: ResolvedVersion) => string | string[])\n  /**\n   * The server jar url replacement\n   */\n  server?: string | string[] | ((version: ResolvedVersion) => string | string[])\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n}\n\nexport interface InstallSideOption {\n  /**\n     * The installation side\n     */\n  side?: 'client' | 'server'\n}\n\nexport type Options = DownloadBaseOptions & ParallelTaskOptions & AssetsOptions & JarOption & LibraryOptions & InstallSideOption\n\n/**\n * Install the Minecraft game to a location by version metadata.\n *\n * This will install version json, version jar, and all dependencies (assets, libraries)\n *\n * @param versionMeta The version metadata\n * @param minecraft The Minecraft location\n * @param option\n */\nexport async function install(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, option: Options = {}): Promise<ResolvedVersion> {\n  return installTask(versionMeta, minecraft, option).startAndWait()\n}\n\n/**\n * Only install the json/jar. Do not install dependencies.\n *\n * @param versionMeta the version metadata; get from updateVersionMeta\n * @param minecraft minecraft location\n */\nexport function installVersion(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: JarOption = {}): Promise<ResolvedVersion> {\n  return installVersionTask(versionMeta, minecraft, options).startAndWait()\n}\n\n/**\n * Install the completeness of the Minecraft game assets and libraries on a existed version.\n *\n * @param version The resolved version produced by Version.parse\n * @param minecraft The minecraft location\n */\nexport function installDependencies(version: ResolvedVersion, options?: Options): Promise<ResolvedVersion> {\n  return installDependenciesTask(version, options).startAndWait()\n}\n\n/**\n * Install or check the assets to resolved version\n *\n * @param version The target version\n * @param options The option to replace assets host url\n */\nexport function installAssets(version: ResolvedVersion, options: AssetsOptions = {}): Promise<ResolvedVersion> {\n  return installAssetsTask(version, options).startAndWait()\n}\n\n/**\n * Install all the libraries of providing version\n * @param version The target version\n * @param options The library host swap option\n */\nexport function installLibraries(version: ResolvedVersion, options: LibraryOptions = {}): Promise<void> {\n  return installLibrariesTask(version, options).startAndWait()\n}\n\n/**\n * Only install several resolved libraries\n * @param libraries The resolved libraries\n * @param minecraft The minecraft location\n * @param option The install option\n */\nexport async function installResolvedLibraries(libraries: ResolvedLibrary[], minecraft: MinecraftLocation, option?: LibraryOptions): Promise<void> {\n  await installLibrariesTask({ libraries, minecraftDirectory: typeof minecraft === 'string' ? minecraft : minecraft.root }, option).startAndWait()\n}\n\n/**\n * Install the Minecraft game to a location by version metadata.\n *\n * This will install version json, version jar, and all dependencies (assets, libraries)\n *\n * @param type The type of game, client or server\n * @param versionMeta The version metadata\n * @param minecraft The Minecraft location\n * @param options\n */\nexport function installTask(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: Options = {}): Task<ResolvedVersion> {\n  return task('install', async function () {\n    const version = await this.yield(installVersionTask(versionMeta, minecraft, options))\n    if (options.side !== 'server') {\n      await this.yield(installDependenciesTask(version, options))\n    }\n    return version\n  })\n}\n/**\n * Only install the json/jar. Do not install dependencies.\n *\n * @param type client or server\n * @param versionMeta the version metadata; get from updateVersionMeta\n * @param minecraft minecraft location\n */\nexport function installVersionTask(versionMeta: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: JarOption = {}): Task<ResolvedVersion> {\n  return task('version', async function () {\n    const folder = MinecraftFolder.from(minecraft)\n    await this.yield(new InstallJsonTask(versionMeta, folder, options))\n    const version = await VersionJson.parse(folder, versionMeta.id)\n    const side = options.side ?? 'client'\n    if (version.downloads[side]) {\n      await this.yield(new InstallJarTask(version as any, folder, options))\n    }\n    if (side === 'server') {\n      const jarPath = folder.getVersionJar(versionMeta.id, 'server')\n      const server: Version = {\n        id: versionMeta.id,\n        type: 'release',\n        time: version.time,\n        releaseTime: version.releaseTime,\n        jar: relative(folder.libraries, jarPath).replaceAll(sep, '/'),\n        arguments: {\n          game: [],\n          jvm: [],\n        },\n        mainClass: '',\n        minimumLauncherVersion: 13,\n        libraries: [],\n      }\n      await writeFile(join(folder.getVersionRoot(versionMeta.id), 'server.json'), JSON.stringify(server, null, 2))\n    }\n    return version\n  }, versionMeta)\n}\n\n/**\n * Install the completeness of the Minecraft game assets and libraries on a existed version.\n *\n * @param version The resolved version produced by Version.parse\n * @param minecraft The minecraft location\n */\nexport function installDependenciesTask(version: ResolvedVersion, options: Options = {}): Task<ResolvedVersion> {\n  return task('dependencies', async function () {\n    await Promise.all([\n      this.yield(installAssetsTask(version, options)),\n      this.yield(installLibrariesTask(version, options)),\n    ])\n    return version\n  })\n}\n\n/**\n * Install or check the assets to resolved version\n *\n * @param version The target version\n * @param options The option to replace assets host url\n */\nexport function installAssetsTask(version: ResolvedVersion, options: AssetsOptions = {}): Task<ResolvedVersion> {\n  return task('assets', async function () {\n    const folder = MinecraftFolder.from(version.minecraftDirectory)\n    if (version.logging?.client?.file) {\n      const file = version.logging.client.file\n\n      await this.yield(new DownloadTask({\n        url: file.url,\n        validator: {\n          algorithm: 'sha1',\n          hash: file.sha1,\n        },\n        destination: folder.getLogConfig(file.id),\n        ...getDownloadBaseOptions(options),\n      }).setName('asset', { name: file.id, hash: file.sha1, size: file.size }))\n    }\n    const jsonPath = folder.getPath('assets', 'indexes', (version.assetIndex?.sha1 ?? version.assets) + '.json')\n\n    if (version.assetIndex) {\n      await this.yield(new InstallAssetIndexTask(version as any, options))\n      await promisify(link)(\n        folder.getPath('assets', 'indexes', version.assetIndex.sha1 + '.json'),\n        folder.getPath('assets', 'indexes', version.assets + '.json'),\n      ).catch(() => { })\n    }\n\n    await ensureDir(folder.getPath('assets', 'objects'))\n    interface AssetIndex {\n      objects: {\n        [key: string]: {\n          hash: string\n          size: number\n        }\n      }\n    }\n\n    const getAssetIndexFallback = async () => {\n      const urls = resolveDownloadUrls(version.assetIndex!.url, version, options.assetsIndexUrl)\n      for (const url of urls) {\n        try {\n          const response = await (options.fetch || fetch)(url, { })\n          const json = await response.json() as any\n          await writeFile(jsonPath, JSON.stringify(json))\n          return json\n        } catch {\n          // ignore\n        }\n      }\n    }\n\n    let objectArray: any[]\n    try {\n      const { objects } = JSON.parse(await readFile(jsonPath).then((b) => b.toString())) as AssetIndex\n      objectArray = Object.keys(objects).map((k) => ({ name: k, ...objects[k] }))\n    } catch (e) {\n      const { objects } = await getAssetIndexFallback()\n      objectArray = Object.keys(objects).map((k) => ({ name: k, ...objects[k] }))\n    }\n    await this.yield(new InstallAssetTask(objectArray, folder, options))\n\n    return version\n  })\n}\n\n/**\n * Install all the libraries of providing version\n * @param version The target version\n * @param options The library host swap option\n */\nexport function installLibrariesTask(version: InstallLibraryVersion, options: LibraryOptions = {}): Task<void> {\n  return new InstallLibraryTask(version.libraries, MinecraftFolder.from(version.minecraftDirectory), options)\n    .setName('libraries', { count: version.libraries.length })\n}\n\n/**\n * Only install several resolved libraries\n * @param libraries The resolved libraries\n * @param minecraft The minecraft location\n * @param option The install option\n */\nexport function installResolvedLibrariesTask(libraries: ResolvedLibrary[], minecraft: MinecraftLocation, option?: LibraryOptions) {\n  return installLibrariesTask({ libraries, minecraftDirectory: typeof minecraft === 'string' ? minecraft : minecraft.root }, option)\n}\n\n/**\n * Only install several resolved assets.\n * @param assets The assets to install\n * @param folder The minecraft folder\n * @param options The asset option\n */\nexport function installResolvedAssetsTask(assets: AssetInfo[], folder: MinecraftFolder, options: AssetsOptions = {}) {\n  return task('assets', async function () {\n    await ensureDir(folder.getPath('assets', 'objects'))\n\n    await this.yield(new InstallAssetTask(assets, folder, options))\n  })\n}\n\nexport class InstallJsonTask extends DownloadTask {\n  constructor(version: MinecraftVersionBaseInfo, minecraft: MinecraftLocation, options: Options) {\n    const folder = MinecraftFolder.from(minecraft)\n    const destination = folder.getVersionJson(version.id)\n    const expectSha1 = version.url.split('/')[5]\n    const urls = resolveDownloadUrls(version.url, version, options.json)\n\n    super({\n      url: urls,\n      validator: expectSha1 ? options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 } : new JsonValidator(),\n      destination,\n      ...getDownloadBaseOptions(options),\n    })\n\n    this.name = 'json'\n    this.param = version\n  }\n}\n\nexport class InstallJarTask extends DownloadTask {\n  constructor(version: ResolvedVersion & { downloads: Required<ResolvedVersion>['downloads'] }, minecraft: MinecraftLocation, options: Options) {\n    const folder = MinecraftFolder.from(minecraft)\n    const type = options.side ?? 'client'\n    const destination = folder.getVersionJar(version.id, type)\n    const download = version.downloads[type]\n    if (!download) {\n      throw new Error(`Cannot find downloadable jar in ${type}`)\n    }\n    const urls = resolveDownloadUrls(download.url, version, options[type])\n    const expectSha1 = download.sha1\n\n    super({\n      url: urls,\n      validator: options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 },\n      destination,\n      ...getDownloadBaseOptions(options),\n    })\n\n    this.name = 'jar'\n    this.param = version\n  }\n}\n\nexport class InstallAssetIndexTask extends DownloadTask {\n  constructor(version: ResolvedVersion & { assetIndex: Version.AssetIndex }, options: AssetsOptions = {}) {\n    const folder = MinecraftFolder.from(version.minecraftDirectory)\n    const expectSha1 = version.assetIndex.sha1\n    const jsonPath = folder.getPath('assets', 'indexes', (options.useHashForAssetsIndex ? expectSha1 : version.assets) + '.json')\n\n    super({\n      url: resolveDownloadUrls(version.assetIndex.url, version, options.assetsIndexUrl),\n      destination: jsonPath,\n      validator: options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 },\n      ...getDownloadBaseOptions(options),\n    })\n\n    this.name = 'assetIndex'\n    this.param = version\n  }\n}\n\nexport class InstallLibraryTask extends DownloadMultipleTask {\n  constructor(libs: ResolvedLibrary[], folder: MinecraftFolder, options: LibraryOptions) {\n    super(libs.map(lib => {\n      const libraryPath = lib.download.path\n      const destination = join(folder.libraries, libraryPath)\n      const urls: string[] = resolveLibraryDownloadUrls(lib, options)\n      const expectSha1 = lib.download.sha1\n      return {\n        url: urls,\n        validator: lib.download.sha1 === ''\n          ? new ZipValidator()\n          : options.checksumValidatorResolver?.({ algorithm: 'sha1', hash: expectSha1 }) || { algorithm: 'sha1', hash: expectSha1 },\n        destination,\n        ...getDownloadBaseOptions(options),\n        skipHead: lib.download.size < 2 * 1024 * 1024,\n      }\n    }))\n\n    this.name = 'library'\n    this._total = libs.reduce((a, b) => a + (b.download?.size ?? 0), 0)\n    this.param = { count: libs.length }\n  }\n}\n\nexport class InstallAssetTask extends DownloadMultipleTask {\n  #total = 0\n\n  constructor(assets: AssetInfo[], folder: MinecraftFolder, options: AssetsOptions) {\n    const assetsHosts = normalizeArray(options.assetsHost || [])\n\n    if (assetsHosts.indexOf(DEFAULT_RESOURCE_ROOT_URL) === -1) {\n      assetsHosts.push(DEFAULT_RESOURCE_ROOT_URL)\n    }\n\n    super(assets.map((asset) => {\n      const { hash, size, name } = asset\n      const head = hash.substring(0, 2)\n      const dir = folder.getPath('assets', 'objects', head)\n      const file = join(dir, hash)\n      const urls = assetsHosts.map((h) => `${h}/${head}/${hash}`)\n      return {\n        url: urls,\n        destination: file,\n        validator: options.prevalidSizeOnly\n          ? {\n            async validate(destination, url) {\n              const fstat = await stat(destination).catch(() => ({ size: -1 }))\n              if (fstat.size !== size) {\n                throw new ChecksumNotMatchError('size', size.toString(), fstat.size.toString(), destination, url)\n              }\n            },\n          }\n          : options.checksumValidatorResolver?.({ algorithm: 'sha1', hash }) || { algorithm: 'sha1', hash },\n        ...getDownloadBaseOptions(options),\n        skipHead: asset.size < 2 * 1024 * 1024,\n      }\n    }))\n\n    this.#total = assets.reduce((a, b) => a + b.size, 0)\n    this.name = 'asset'\n    this.param = { count: assets.length }\n  }\n\n  get total(): number {\n    return this.#total\n  }\n}\n\nconst DEFAULT_MAVENS = ['https://repo1.maven.org/maven2/']\n\n/**\n * Resolve a library download urls with fallback.\n *\n * @param library The resolved library\n * @param libraryOptions The library install options\n */\nexport function resolveLibraryDownloadUrls(library: ResolvedLibrary, libraryOptions: LibraryOptions): string[] {\n  const urls = libraryOptions.libraryHost?.(library) ?? [\n    ...normalizeArray(libraryOptions.mavenHost).map((m) => joinUrl(m, library.download.path)),\n    library.download.url,\n    ...DEFAULT_MAVENS.map((m) => joinUrl(m, library.download.path)),\n  ]\n\n  return [...new Set(normalizeArray(urls))]\n}\n", "import { ValidationError, Validator } from '@xmcl/file-transfer'\nimport { open } from '@xmcl/unzip'\n\nexport class ZipValidator implements Validator {\n  async validate(destination: string, url: string): Promise<void> {\n    try {\n      const file = await open(destination, { autoClose: false, lazyEntries: true })\n      file.close()\n    } catch (e) {\n      throw new ValidationError('InvalidZipError', (e as any).message)\n    }\n  }\n}\n", "import { LibraryInfo, MinecraftFolder, MinecraftLocation, Version, Version as VersionJson } from '@xmcl/core'\nimport { AbortableTask, CancelledError, Task, task } from '@xmcl/task'\nimport { filterEntries, open, readEntry, walkEntriesGenerator } from '@xmcl/unzip'\nimport { spawn } from 'child_process'\nimport { readFile, writeFile } from 'fs/promises'\nimport { delimiter, dirname, join, relative, sep } from 'path'\nimport { ZipFile } from 'yauzl'\nimport { convertClasspathToMaven, parseManifest } from './manifest'\nimport { InstallLibraryTask, InstallSideOption, LibraryOptions } from './minecraft'\nimport { SpawnJavaOptions, checksum, missing, waitProcess } from './utils'\n\nexport interface PostProcessor {\n  /**\n   * The executable jar path\n   */\n  jar: string\n  /**\n   * The classpath to run\n   */\n  classpath: string[]\n  args: string[]\n  outputs?: { [key: string]: string }\n  sides?: Array<'client' | 'server'>\n}\n\nexport interface InstallProfile {\n  spec?: number\n  /**\n   * The type of this installation, like \"forge\"\n   */\n  profile: string\n  /**\n   * The version of this installation\n   */\n  version: string\n  /**\n   * The version json path\n   */\n  json: string\n  /**\n   * The maven artifact name: `<org>:<artifact-id>:<version>`\n   */\n  path: string\n  /**\n   * The minecraft version\n   */\n  minecraft: string\n  /**\n   * The processor shared variables. The key is the name of variable to replace.\n   *\n   * The value of client/server is the value of the variable.\n   */\n  data?: { [key: string]: { client: string; server: string } }\n  /**\n   * The post processor. Which require java to run.\n   */\n  processors?: Array<PostProcessor>\n  /**\n   * The required install profile libraries\n   */\n  libraries: VersionJson.NormalLibrary[]\n  /**\n   * Legacy format\n   */\n  versionInfo?: VersionJson\n}\n\nexport interface PostProcessOptions extends SpawnJavaOptions {\n  /**\n   * Custom handlers to handle the post processor\n   */\n  handler?: (postProcessor: PostProcessor) => Promise<boolean>\n  onPostProcessFailed?: (proc: PostProcessor, jar: string, classPaths: string, mainClass: string, args: string[], error: unknown) => void\n  onPostProcessSuccess?: (proc: PostProcessor, jar: string, classPaths: string, mainClass: string, args: string[]) => void\n  customPostProcessTask?: (processor: PostProcessor[], minecraftFolder: MinecraftFolder, options: PostProcessOptions, originalTask: () => Task<void>) => Task<void>\n}\n\nexport interface InstallProfileOption extends LibraryOptions, InstallSideOption, PostProcessOptions {\n  /**\n   * New forge (>=1.13) require java to install. Can be a executor or java executable path.\n   */\n  java?: string\n}\n\n/**\n * Resolve processors in install profile\n */\nexport function resolveProcessors(side: 'client' | 'server', installProfile: InstallProfile, minecraft: MinecraftFolder) {\n  function normalizePath(val: string) {\n    if (val && val.match(/^\\[.+\\]$/g)) { // match sth like [net.minecraft:client:1.15.2:slim]\n      const name = val.substring(1, val.length - 1)\n      return minecraft.getLibraryByPath(LibraryInfo.resolve(name).path)\n    }\n    return val\n  }\n\n  const normalizeVariable = (val: string) => {\n    if (!val) return val\n    // replace \"{A}/{B}, which the value of A and B are from varaiables\n    // for example, variables = { A: \"a\", B: \"b\" }\n    // \"{A}/{B}\" => \"a/b\"\n    // The key variable name can be any alphabet characters and number other special characters\n    // Another example, \"{A}\" => \"a\"\n    return val.replace(/{([A-Za-z0-9_-]+)}/g, (_, key) => variables[key]?.[side] ?? '')\n  }\n\n  // store the mapping of {VARIABLE_NAME} -> real path in disk\n  const variables: Record<string, { client: string; server: string }> = {\n    SIDE: {\n      client: 'client',\n      server: 'server',\n    },\n    MINECRAFT_JAR: {\n      client: minecraft.getVersionJar(installProfile.minecraft),\n      server: minecraft.getVersionJar(installProfile.minecraft, 'server'),\n    },\n    ROOT: {\n      client: minecraft.root,\n      server: minecraft.root,\n    },\n    MINECRAFT_VERSION: {\n      client: installProfile.minecraft,\n      server: installProfile.minecraft,\n    },\n    LIBRARY_DIR: {\n      client: minecraft.libraries,\n      server: minecraft.libraries,\n    },\n  }\n  if (installProfile.data) {\n    for (const key in installProfile.data) {\n      const { client, server } = installProfile.data[key]\n      variables[key] = {\n        client: normalizePath(client),\n        server: normalizePath(server),\n      }\n    }\n  }\n\n  const resolveOutputs = (proc: PostProcessor, args: string[]) => {\n    const original = proc.outputs\n      ? Object.entries(proc.outputs).map(([k, v]) => ({ [normalizeVariable(k)]: normalizeVariable(v) })).reduce((a, b) => Object.assign(a, b), {})\n      : {}\n    for (const [key, val] of Object.entries(original)) {\n      original[key] = val.replace(/'/g, '')\n    }\n    const outputIndex = args.indexOf('--output') === -1 ? args.indexOf('--out-jar') : args.indexOf('--output')\n    const outputFile = outputIndex !== -1 ? args[outputIndex + 1] : undefined\n    if (outputFile && !original[outputFile]) {\n      original[outputFile] = ''\n    }\n    return original\n  }\n  const processors = (installProfile.processors || []).map((proc) => {\n    const args = proc.args.map(normalizePath).map(normalizeVariable)\n    return {\n      ...proc,\n      args,\n      outputs: resolveOutputs(proc, args),\n    }\n  }).filter((proc) => proc.sides ? proc.sides.indexOf(side) !== -1 : true)\n  return processors\n}\n\n/**\n * Post process the post processors from `InstallProfile`.\n *\n * @param processors The processor info\n * @param minecraft The minecraft location\n * @param java The java executable path\n * @throws {@link PostProcessError}\n */\nexport function postProcess(processors: PostProcessor[], minecraft: MinecraftFolder, options: PostProcessOptions) {\n  return new PostProcessingTask(processors, minecraft, options).startAndWait()\n}\n\n/**\n * Install by install profile. The install profile usually contains some preprocess should run before installing dependencies.\n *\n * @param installProfile The install profile\n * @param minecraft The minecraft location\n * @param options The options to install\n * @throws {@link PostProcessError}\n */\nexport function installByProfile(installProfile: InstallProfile, minecraft: MinecraftLocation, options: InstallProfileOption = {}) {\n  return installByProfileTask(installProfile, minecraft, options).startAndWait()\n}\n\nfunction parseArgumentsFromArgsFile(content: string, parentDir: string, serverProfile: Version) {\n  const args = content.split('\\n').map(v => v.trim().split(' ')).flatMap(v => v).filter(v => v)\n  // find the Main class or -jar\n  let mainClass: string = ''\n  let jar: string | undefined\n  let found = false\n  for (let i = 0; i < args.length; i++) {\n    if (args[i].startsWith('-')) {\n      if (args[i] === '-jar') {\n        jar = join(parentDir, args[i + 1])\n        found = true\n        i++\n        continue\n      }\n    } else if (!mainClass) {\n      mainClass = args[i]\n      found = true\n      continue\n    }\n    if (!found) {\n      if (!args[i].startsWith('-D')) {\n        serverProfile.arguments!.jvm.push(args[i], args[i + 1])\n        i++\n      } else {\n        serverProfile.arguments!.jvm.push(args[i])\n      }\n    } else {\n      serverProfile.arguments!.game.push(args[i])\n    }\n  }\n\n  serverProfile.mainClass = mainClass\n\n  return jar\n}\n\nasync function parseJar(minecraftFolder: MinecraftFolder, jar: string, installProfile: InstallProfile, serverVersion: Version) {\n  let zip: ZipFile | undefined\n  try {\n    const jsonContent: Version = JSON.parse(await readFile(minecraftFolder.getVersionJson(installProfile.version), 'utf-8'))\n    zip = await open(jar, { lazyEntries: true, autoClose: false })\n    const [entry] = await filterEntries(zip, ['META-INF/MANIFEST.MF'])\n    if (entry) {\n      const manifestContent = await readEntry(zip, entry).then((b) => b.toString())\n      const result = parseManifest(manifestContent)\n      serverVersion.mainClass = result.mainClass\n      const cp = [...result.classPath, relative(minecraftFolder.libraries, jar).replaceAll(sep, '/')]\n      serverVersion.libraries.push(...jsonContent.libraries.filter(l => !l.name.endsWith(':client')))\n      const mavenPaths = convertClasspathToMaven(cp)\n      for (const name of mavenPaths) {\n        if (serverVersion.libraries.find(l => l.name === name)) continue\n        if (name.startsWith(':')) continue\n        serverVersion.libraries.push({ name })\n      }\n    }\n  } catch (e) {\n    throw new PostProcessBadJarError(jar, e as any)\n  } finally {\n    zip?.close()\n  }\n}\n\n/**\n * Install by install profile. The install profile usually contains some preprocess should run before installing dependencies.\n *\n * @param installProfile The install profile\n * @param minecraft The minecraft location\n * @param options The options to install\n */\nexport function installByProfileTask(installProfile: InstallProfile, minecraft: MinecraftLocation, options: InstallProfileOption = {}) {\n  return task('installByProfile', async function () {\n    const minecraftFolder = MinecraftFolder.from(minecraft)\n\n    const side = options.side === 'server' ? 'server' : 'client'\n\n    const processor = resolveProcessors(side, installProfile, minecraftFolder)\n\n    const installRequiredLibs = VersionJson.resolveLibraries(installProfile.libraries)\n\n    await this.yield(new InstallLibraryTask(installRequiredLibs, minecraftFolder, options))\n\n    if (options.customPostProcessTask) {\n      await this.yield(options.customPostProcessTask(processor, minecraftFolder, options, () => new PostProcessingTask(processor, minecraftFolder, options)))\n    } else {\n      await this.yield(new PostProcessingTask(processor, minecraftFolder, options))\n    }\n\n    if (side === 'client') {\n      const versionJson: VersionJson = await readFile(minecraftFolder.getVersionJson(installProfile.version)).then((b) => b.toString()).then(JSON.parse)\n      const libraries = VersionJson.resolveLibraries(versionJson.libraries)\n      await this.yield(new InstallLibraryTask(libraries, minecraftFolder, options))\n    } else {\n      const argsText = process.platform === 'win32' ? 'win_args.txt' : 'unix_args.txt'\n\n      if (!installProfile.processors) { return }\n\n      let txtPath: string | undefined\n      for (const p of installProfile.processors) {\n        txtPath = p.args.find(a => a.startsWith('{ROOT}') && a.endsWith(argsText))\n        if (txtPath) {\n          txtPath = txtPath.replace('{ROOT}', minecraftFolder.root)\n          if (await missing(txtPath)) {\n            throw new Error(`No ${argsText} found in the forge jar`)\n          }\n          break\n        }\n      }\n      const serverProfile: Version = {\n        id: installProfile.version,\n        libraries: [],\n        type: 'release',\n        arguments: {\n          game: [],\n          jvm: [],\n        },\n        releaseTime: new Date().toJSON(),\n        time: new Date().toJSON(),\n        minimumLauncherVersion: 13,\n        mainClass: '',\n        inheritsFrom: installProfile.minecraft,\n      }\n\n      let jar: string | undefined\n\n      if (!txtPath) {\n        // legacy\n        const info = LibraryInfo.resolve(installProfile.path)\n        const libPath = minecraftFolder.getLibraryByPath(info.path)\n        jar = libPath\n      } else {\n        const content = await readFile(txtPath, 'utf-8')\n        jar = parseArgumentsFromArgsFile(content, dirname(txtPath), serverProfile)\n      }\n\n      if (jar) {\n        await parseJar(minecraftFolder, jar, installProfile, serverProfile)\n      }\n\n      if (!serverProfile.mainClass) {\n        throw new PostProcessNoMainClassError(jar!)\n      }\n\n      await writeFile(join(minecraftFolder.getVersionRoot(serverProfile.id), 'server.json'), JSON.stringify(serverProfile, null, 4))\n\n      const resolvedLibraries = VersionJson.resolveLibraries(serverProfile.libraries)\n      await this.yield(new InstallLibraryTask(resolvedLibraries, minecraftFolder, options))\n    }\n  })\n}\n\nexport class PostProcessBadJarError extends Error {\n  constructor(public jarPath: string, public causeBy: Error) {\n    super(`Fail to post process bad jar: ${jarPath}`)\n  }\n\n  name = 'PostProcessBadJarError'\n}\n\nexport class PostProcessNoMainClassError extends Error {\n  constructor(public jarPath: string) {\n    super(`Fail to post process bad jar without main class: ${jarPath}`)\n  }\n\n  name = 'PostProcessNoMainClassError'\n}\n\nexport class PostProcessFailedError extends Error {\n  constructor(public jarPath: string, public commands: string[], message: string) {\n    super(message)\n  }\n\n  name = 'PostProcessFailedError'\n}\n\nexport class PostProcessValidationFailedError extends PostProcessFailedError {\n  constructor(jarPath: string, commands: string[], message: string, readonly file: string, readonly expect: string, readonly actual: string) {\n    super(jarPath, commands, message)\n  }\n\n  name = 'PostProcessValidationFailedError'\n}\n\nconst PAUSEED = Symbol('PAUSED')\n/**\n * Post process the post processors from `InstallProfile`.\n *\n * @param processors The processor info\n * @param minecraft The minecraft location\n * @param java The java executable path\n * @throws {@link PostProcessError}\n */\nexport class PostProcessingTask extends AbortableTask<void> {\n  readonly name: string = 'postProcessing'\n\n  private pointer = 0\n\n  private _abort = () => { }\n\n  constructor(private processors: PostProcessor[], private minecraft: MinecraftFolder, private options: PostProcessOptions) {\n    super()\n    this.param = processors\n    this._total = processors.length\n  }\n\n  protected async findMainClass(lib: string) {\n    let zip: ZipFile | undefined\n    let mainClass: string | undefined\n    try {\n      zip = await open(lib, { lazyEntries: true })\n      for await (const entry of walkEntriesGenerator(zip)) {\n        if (entry.fileName === 'META-INF/MANIFEST.MF') {\n          const content = await readEntry(zip, entry).then((b) => b.toString())\n          mainClass = content.split('\\n')\n            .map((l) => l.split(': '))\n            .find((arr) => arr[0] === 'Main-Class')?.[1].trim()\n          break\n        }\n      }\n    } catch (e) {\n      throw new PostProcessBadJarError(lib, e as any)\n    } finally {\n      zip?.close()\n    }\n    if (!mainClass) {\n      throw new PostProcessNoMainClassError(lib)\n    }\n    return mainClass\n  }\n\n  protected async isInvalid(outputs: Required<PostProcessor>['outputs']) {\n    for (const [file, expect] of Object.entries(outputs)) {\n      if (!expect) {\n        return false\n      }\n      const sha1 = await checksum(file, 'sha1').catch((e) => '') as string\n      const expected = expect.replace(/'/g, '')\n      if (!sha1) return [file, expected, sha1] as const // if file not exist, the file is not generated\n      if (!expect) return false // if expect is empty, we just need file exists\n      if (expected !== sha1) {\n        return [file, expected, sha1] as const\n      }\n    }\n    return false\n  }\n\n  protected async postProcess(mc: MinecraftFolder, proc: PostProcessor, options: PostProcessOptions) {\n    if (await options.handler?.(proc).catch(() => false)) {\n      return\n    }\n    const jarRealPath = mc.getLibraryByPath(LibraryInfo.resolve(proc.jar).path)\n    const mainClass = await this.findMainClass(jarRealPath)\n    this._to = proc.jar\n    const cp = [...proc.classpath, proc.jar].map(LibraryInfo.resolve).map((p) => mc.getLibraryByPath(p.path)).join(delimiter)\n    const cmd = ['-cp', cp, mainClass, ...proc.args]\n    try {\n      await new Promise((resolve, reject) => {\n        const process = (options?.spawn ?? spawn)(options.java ?? 'java', cmd)\n        waitProcess(process).then(resolve, reject)\n        this._abort = () => {\n          reject(PAUSEED)\n          process.kill(1)\n        }\n      })\n      options.onPostProcessSuccess?.(proc, jarRealPath, cp, mainClass, proc.args)\n    } catch (e) {\n      if (e !== PAUSEED) {\n        options.onPostProcessFailed?.(proc, jarRealPath, cp, mainClass, proc.args, e)\n      }\n      if (e instanceof Error && e.name === 'Error') {\n        throw new PostProcessFailedError(proc.jar, [options.java ?? 'java', ...cmd], e.message)\n      }\n      throw e\n    }\n    // if (proc.outputs) {\n    //   const invalidation = await this.isInvalid(proc.outputs)\n    //   if (invalidation) {\n    //     const [file, expect, actual] = invalidation\n    //     throw new PostProcessValidationFailedError(proc.jar, [options.java ?? 'java', ...cmd], 'Validate the output of process failed!', file, expect, actual)\n    //   }\n    // }\n  }\n\n  protected async process(): Promise<void> {\n    for (; this.pointer < this.processors.length; this.pointer++) {\n      const proc = this.processors[this.pointer]\n      if (this.isCancelled) {\n        throw new CancelledError()\n      }\n      if (this.isPaused) {\n        throw PAUSEED\n      }\n      await this.postProcess(this.minecraft, proc, this.options)\n      if (this.isCancelled) {\n        throw new CancelledError()\n      }\n      if (this.isPaused) {\n        throw PAUSEED\n      }\n      this._progress = this.pointer\n      this.update(1)\n    }\n  }\n\n  protected async abort(isCancelled: boolean): Promise<void> {\n    this._abort()\n  }\n\n  protected isAbortedError(e: any): boolean {\n    return e === PAUSEED\n  }\n}\n", "export function convertClasspathToMaven(paths: string[]): string[] {\n  return paths.map(path => {\n    const trimmedPath = path.replace(/^libraries\\//, '')\n\n    const parts = trimmedPath.split('/')\n\n    let jarName = parts.pop()\n    const version = parts.pop()\n    const artifactId = parts.pop()\n    const groupIdParts = parts\n\n    const groupId = groupIdParts.join('.')\n\n    let classifier = ''\n\n    if (jarName) {\n      jarName = jarName.replace(/\\.jar$/, '')\n      const jarParts = jarName?.substring(`${artifactId}-${version}`.length + 1).split('-')\n      if (jarParts && jarParts.length > 0) {\n        classifier = jarParts[0]\n      }\n    }\n\n    let mavenCoordinate = `${groupId}:${artifactId}:${version}`\n    if (classifier) {\n      mavenCoordinate += `:${classifier}`\n    }\n\n    return mavenCoordinate\n  })\n}\n\nexport function parseManifest(manifestContent: string): { mainClass: string; classPath: string[] } {\n  const lines = manifestContent.split('\\r\\n')\n  let mainClass = ''\n  let classPath = [] as string[]\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i].trim()\n    if (line.startsWith('Main-Class:')) {\n      mainClass = line.substring('Main-Class:'.length).trim()\n    } else if (line.startsWith('Class-Path:')) {\n      let classPathLine = line.substring('Class-Path:'.length).trim()\n      while (i + 1 < lines.length && lines[i + 1].startsWith(' ')) {\n        i++\n        classPathLine += lines[i].slice(1)\n      }\n      classPath = classPathLine.split(' ').filter(path => path.length > 0)\n    }\n  }\n\n  return {\n    mainClass,\n    classPath,\n  }\n}\n", "import { MinecraftFolder, MinecraftLocation, Version as VersionJson } from '@xmcl/core'\nimport { getDownloadBaseOptions } from '@xmcl/file-transfer'\nimport { Task, task } from '@xmcl/task'\nimport { open, readEntry } from '@xmcl/unzip'\nimport { DownloadTask } from './downloadTask'\nimport { BadForgeInstallerJarError, InstallForgeOptions, isForgeInstallerEntries, unpackForgeInstaller, walkForgeInstallerEntries } from './forge'\nimport { resolveLibraryDownloadUrls } from './minecraft'\nimport { InstallProfile, installByProfileTask } from './profile'\nimport { normalizeArray } from './utils'\nimport { ZipValidator } from './zipValdiator'\n\nexport class DownloadNeoForgedInstallerTask extends DownloadTask {\n  readonly installJarPath: string\n\n  constructor(project: 'forge' | 'neoforge', version: string, minecraft: MinecraftFolder, options: InstallForgeOptions) {\n    const url = `https://maven.neoforged.net/releases/net/neoforged/${project}/${version}/${project}-${version}-installer.jar`\n\n    const library = VersionJson.resolveLibrary({\n      name: `net.neoforged:${project}:${version}:installer`,\n      downloads: {\n        artifact: {\n          url,\n          path: `net/neoforged/${project}/${version}/${project}-${version}-installer.jar`,\n          size: -1,\n          sha1: '',\n        },\n      },\n    })!\n    const mavenHost = options.mavenHost ? normalizeArray(options.mavenHost) : []\n\n    const urls = resolveLibraryDownloadUrls(library, { ...options, mavenHost })\n\n    const installJarPath = minecraft.getLibraryByPath(library.path)\n\n    super({\n      url: urls,\n      destination: installJarPath,\n      validator: new ZipValidator(),\n      ...getDownloadBaseOptions(options),\n    })\n\n    this.installJarPath = installJarPath\n    this.name = 'downloadInstaller'\n    this.param = { version }\n  }\n}\n\nexport async function installNeoForged(project: 'forge' | 'neoforge', version: string, minecraft: MinecraftLocation, options: InstallForgeOptions): Promise<string> {\n  return installNeoForgedTask(project, version, minecraft, options).startAndWait()\n}\n\nexport function installNeoForgedTask(project: 'forge' | 'neoforge', version: string, minecraft: MinecraftLocation, options: InstallForgeOptions): Task<string> {\n  return task('installForge', async function () {\n    const [_, forgeVersion = version] = version.split('-')\n    const mc = MinecraftFolder.from(minecraft)\n    const jarPath = await this.yield(new DownloadNeoForgedInstallerTask(project, version, mc, options)\n      .map(function () { return this.installJarPath }))\n\n    const zip = await open(jarPath, { lazyEntries: true, autoClose: false })\n    const entries = await walkForgeInstallerEntries(zip, forgeVersion)\n\n    if (!entries.installProfileJson) {\n      throw new BadForgeInstallerJarError(jarPath, 'install_profile.json')\n    }\n    const profile: InstallProfile = await readEntry(zip, entries.installProfileJson).then((b) => b.toString()).then(JSON.parse)\n    if (isForgeInstallerEntries(entries)) {\n      // new forge\n      const versionId = await unpackForgeInstaller(zip, entries, profile, mc, jarPath, options)\n      await this.concat(installByProfileTask(profile, minecraft, options))\n      return versionId\n    } else {\n      // bad forge\n      throw new BadForgeInstallerJarError(jarPath)\n    }\n  })\n}\n", "import { ClassReader, ClassVisitor, Opcodes } from '@xmcl/asm'\nimport { MinecraftFolder, MinecraftLocation, Version } from '@xmcl/core'\nimport { task } from '@xmcl/task'\nimport { getEntriesRecord, open, readAllEntries, readEntry } from '@xmcl/unzip'\nimport { writeFile } from 'fs/promises'\nimport { ensureFile, InstallOptions, SpawnJavaOptions, spawnProcess } from './utils'\n\nexport interface InstallOptifineOptions extends InstallOptions, SpawnJavaOptions {\n  /**\n   * Use \"optifine.OptiFineForgeTweaker\" instead of \"optifine.OptiFineTweaker\" for tweakClass.\n   *\n   * If you want to install upon forge, you should use this.\n   */\n  useForgeTweaker?: boolean\n}\n\n/**\n * Generate the optifine version json from provided info.\n * @param editionRelease The edition + release with _\n * @param minecraftVersion The minecraft version\n * @param launchWrapperVersion The launch wrapper version\n * @param options The install options\n * @beta Might be changed and don't break the major version\n */\nexport function generateOptifineVersion(editionRelease: string, minecraftVersion: string, launchWrapperVersion?: string, options: InstallOptifineOptions = {}): Version {\n  const id = options.versionId ?? `${minecraftVersion}-Optifine_${editionRelease}`\n  const inheritsFrom = options.inheritsFrom ?? minecraftVersion\n  const mainClass = 'net.minecraft.launchwrapper.Launch'\n  const libraries = [{ name: `optifine:Optifine:${minecraftVersion}_${editionRelease}` }]\n  if (launchWrapperVersion) {\n    libraries.unshift({ name: `optifine:launchwrapper-of:${launchWrapperVersion}` })\n  } else {\n    libraries.unshift({ name: 'net.minecraft:launchwrapper:1.12' })\n  }\n  return {\n    id,\n    inheritsFrom,\n    arguments: {\n      game: ['--tweakClass', options.useForgeTweaker ? 'optifine.OptiFineForgeTweaker' : 'optifine.OptiFineTweaker'],\n      jvm: [],\n    },\n    releaseTime: new Date().toJSON(),\n    time: new Date().toJSON(),\n    type: 'release',\n    libraries,\n    mainClass,\n    minimumLauncherVersion: 21,\n  }\n}\n\n/**\n * Install optifine by optifine installer\n *\n * @param installer The installer jar file path\n * @param minecraft The minecraft location\n * @param options The option to install\n * @beta Might be changed and don't break the major version\n * @throws {@link BadOptifineJarError}\n */\nexport function installOptifine(installer: string, minecraft: MinecraftLocation, options?: InstallOptifineOptions) {\n  return installOptifineTask(installer, minecraft, options).startAndWait()\n}\n\nexport class BadOptifineJarError extends Error {\n  constructor(\n    public optifine: string,\n    /**\n         * What entry in jar is missing\n         */\n    public entry: string,\n  ) {\n    super(`Missing entry ${entry} in optifine installer: ${optifine}`)\n  }\n\n  error = 'BadOptifineJarError'\n}\n\n/**\n * Install optifine by optifine installer task\n *\n * @param installer The installer jar file path\n * @param minecraft The minecraft location\n * @param options The option to install\n * @beta Might be changed and don't break the major version\n * @throws {@link BadOptifineJarError}\n */\nexport function installOptifineTask(installer: string, minecraft: MinecraftLocation, options: InstallOptifineOptions = {}) {\n  return task('installOptifine', async function () {\n    const mc = MinecraftFolder.from(minecraft)\n\n    // context.update(0, 100);\n\n    const zip = await open(installer)\n    const entries = await readAllEntries(zip)\n    const record = getEntriesRecord(entries)\n    // context.update(10, 100);\n\n    const entry = record['net/optifine/Config.class'] ?? record['Config.class'] ?? record['notch/net/optifine/Config.class']\n    if (!entry) {\n      throw new BadOptifineJarError(installer, 'net/optifine/Config.class')\n    }\n\n    const launchWrapperVersionEntry = record['launchwrapper-of.txt']\n    const launchWrapperVersion = launchWrapperVersionEntry\n      ? await readEntry(zip, launchWrapperVersionEntry).then((b) => b.toString())\n      : undefined\n    // context.update(15, 100);\n\n    const buf = await readEntry(zip, entry)\n    const reader = new ClassReader(buf)\n    class OptifineVisitor extends ClassVisitor {\n      fields: Record<string, any> = {}\n      visitField(access: number, name: string, desc: string, signature: string, value: any) {\n        this.fields[name] = value\n        return null\n      }\n    }\n    const visitor = new OptifineVisitor(Opcodes.ASM5)\n    reader.accept(visitor)\n    const mcversion: string = visitor.fields.MC_VERSION // 1.14.4\n    const edition: string = visitor.fields.OF_EDITION // HD_U\n    const release: string = visitor.fields.OF_RELEASE // F5\n    const editionRelease = edition + '_' + release\n\n    const versionJSON = generateOptifineVersion(editionRelease, mcversion, launchWrapperVersion, options)\n    const versionJSONPath = mc.getVersionJson(versionJSON.id)\n\n    // context.update(20, 100);\n    // write version json\n    await this.yield(task('json', async () => {\n      await ensureFile(versionJSONPath)\n      await writeFile(versionJSONPath, JSON.stringify(versionJSON, null, 4))\n    }))\n\n    const launchWrapperEntry = record[`launchwrapper-of-${launchWrapperVersion}.jar`]\n    // write launch wrapper\n    if (launchWrapperEntry) {\n      await this.yield(task('library', async () => {\n        const wrapperDest = mc.getLibraryByPath(`optifine/launchwrapper-of/${launchWrapperVersion}/launchwrapper-of-${launchWrapperVersion}.jar`)\n        await ensureFile(wrapperDest)\n        await writeFile(wrapperDest, await readEntry(zip, launchWrapperEntry))\n      }))\n    }\n\n    // write the optifine\n    await this.yield(task('jar', async () => {\n      const dest = mc.getLibraryByPath(`optifine/Optifine/${mcversion}_${editionRelease}/Optifine-${mcversion}_${editionRelease}.jar`)\n      const mcJar = mc.getVersionJar(mcversion)\n\n      await ensureFile(dest)\n      await spawnProcess(options, ['-cp', installer, 'optifine.Patcher', mcJar, installer, dest]).catch((e) => {\n        e.name = 'OptifinePatchError'\n        throw e\n      })\n    }))\n\n    return versionJSON.id\n  })\n}\n", "import { getPlatform, Platform } from '@xmcl/core'\nimport { DownloadBaseOptions, getDownloadBaseOptions } from '@xmcl/file-transfer'\nimport { Task, task } from '@xmcl/task'\nimport { exec } from 'child_process'\nimport { stat, unlink } from 'fs/promises'\nimport { EOL, platform, tmpdir } from 'os'\nimport { basename, join, resolve } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { DownloadTask } from './downloadTask'\nimport { ensureDir, missing } from './utils'\n\nexport interface JavaInfo {\n  /**\n     * Full java executable path\n     */\n  path: string\n  /**\n     * Java version string\n     */\n  version: string\n  /**\n     * Major version of java\n     */\n  majorVersion: number\n}\n\nexport interface InstallJavaOptions extends DownloadBaseOptions {\n  /**\n     * The destination of this installation\n     */\n  destination: string\n  /**\n     * The cached directory which compressed java lzma will be download to.\n     * @default os.tempdir()\n     */\n  cacheDir?: string\n  /**\n     * The platform to install. It will be auto-resolved by default.\n     * @default currentPlatform\n     */\n  platform?: Platform\n  /**\n     * Unpack lzma function. It must present, else it will not be able to unpack mojang provided LZMA.\n     */\n  unpackLZMA: UnpackLZMAFunction\n  /**\n     * The dispatcher for API\n     */\n  dispatcher?: Dispatcher\n}\n\nexport type UnpackLZMAFunction =\n    ((src: string, dest: string) => Promise<void>) |\n    ((src: string, dest: string) => Task<void>)\n\nexport class DownloadJRETask extends DownloadTask {\n  constructor(jre: DownloadInfo, dir: string, options: InstallJavaOptions) {\n    const { sha1, url } = jre\n    const filename = basename(url)\n    const downloadDestination = resolve(dir, filename)\n\n    super({\n      url,\n      destination: downloadDestination,\n      validator: {\n        algorithm: 'sha1',\n        hash: sha1,\n      },\n      ...getDownloadBaseOptions(options),\n    })\n\n    this.name = 'downloadJre'\n    this.param = jre\n  }\n}\n\ninterface DownloadInfo { sha1: string; url: string; version: string }\n\n/**\n * Install JRE from Mojang offical resource. It should install jdk 8.\n * @param options The install options\n */\nexport function installJreFromMojangTask(options: InstallJavaOptions) {\n  const {\n    destination,\n    unpackLZMA,\n    cacheDir = tmpdir(),\n    platform = getPlatform(),\n  } = options\n  return task('installJreFromMojang', async function () {\n    const info: { [system: string]: { [arch: string]: { jre: DownloadInfo } } } =\n            await this.yield(task('fetchInfo', async () => {\n              const response = await request('https://launchermeta.mojang.com/mc/launcher.json', { dispatcher: options.dispatcher, throwOnError: true })\n              return response.body.json() as any\n            }))\n    const system = platform.name\n    function resolveArch() {\n      switch (platform.arch) {\n        case 'x86':\n        case 'x32': return '32'\n        case 'x64': return '64'\n        default: return '32'\n      }\n    }\n    const currentArch = resolveArch()\n\n    if (!info[system] || !info[system][currentArch] || !info[system][currentArch].jre) {\n      throw new Error('No Java package available for your platform')\n    }\n    const lzmaPath = await this.yield(new DownloadJRETask(info[system][currentArch].jre, cacheDir, options).map(function () { return this.to! }))\n    const result = unpackLZMA(lzmaPath, destination)\n    await ensureDir(destination)\n    if (result instanceof Promise) {\n      await this.yield(task('decompress', () => result))\n    } else {\n      await this.yield(result)\n    }\n    await this.yield(task('cleanup', () => unlink(lzmaPath)))\n  })\n}\n\n/**\n * Install JRE from Mojang offical resource. It should install jdk 8.\n * @param options The install options\n */\nexport function installJreFromMojang(options: InstallJavaOptions) {\n  return installJreFromMojangTask(options).startAndWait()\n}\n\n/**\n * Try to resolve a java info at this path. This will call `java -version`\n * @param path The java exectuable path.\n */\nexport async function resolveJava(path: string): Promise<JavaInfo | undefined> {\n  if (await missing(path)) { return undefined }\n\n  return new Promise((resolve) => {\n    exec(`\"${path}\" -version`, (_err, _sout, serr) => {\n      if (serr) {\n        const ver = parseJavaVersion(serr)\n        if (ver) {\n          resolve({ path, ...ver })\n        } else {\n          resolve(undefined)\n        }\n      } else {\n        resolve(undefined)\n      }\n    })\n  })\n}\n\nexport class ParseJavaVersionError extends Error {\n  name = 'ParseJavaVersionError'\n\n  constructor(message: string) { super(message) }\n}\n\n/**\n * Parse version string and major version number from stderr of java process.\n *\n * @param versionText The stderr for `java -version`\n */\nexport function parseJavaVersion(versionText: string): { version: string; majorVersion: number; patch: number } | undefined {\n  const getVersion = (str?: string) => {\n    if (!str) { return undefined }\n    const match = /(\\d+)\\.(\\d)+\\.(\\d+)(_\\d+)?/.exec(str)\n    if (match === null) {\n      const openjdkMatch = /openjdk version \"(\\d+)\"/.exec(str)\n      if (openjdkMatch) {\n        return {\n          version: openjdkMatch[1],\n          majorVersion: Number.parseInt(openjdkMatch[1]),\n          patch: -1,\n        }\n      }\n      return undefined\n    }\n    if (match[1] === '1') {\n      return {\n        version: match[0],\n        majorVersion: Number.parseInt(match[2]),\n        patch: Number.parseInt(match[4]?.substring(1) ?? '-1'),\n      }\n    }\n    return {\n      version: match[0],\n      majorVersion: Number.parseInt(match[1]),\n      patch: Number.parseInt(match[3]),\n    }\n  }\n  try {\n    const javaVersion = getVersion(versionText)\n    if (!javaVersion) { return undefined }\n    return javaVersion\n  } catch (e) {\n    throw new ParseJavaVersionError(`Fail to parse java version [${versionText}]: ${(e as any).message}`)\n  }\n}\n\n/**\n * Get all potential java locations for Minecraft.\n *\n * On mac/linux, it will perform `which java`. On win32, it will perform `where java`\n *\n * @returns The absolute java locations path\n */\nexport async function getPotentialJavaLocations(): Promise<string[]> {\n  const unchecked = new Set<string>()\n  const currentPlatform = platform()\n  const javaFile = currentPlatform === 'win32' ? 'java.exe' : 'java'\n\n  if (process.env.JAVA_HOME) {\n    unchecked.add(join(process.env.JAVA_HOME, 'bin', javaFile))\n  }\n\n  const which = () => new Promise<string>((resolve) => {\n    exec('which java', (_error, stdout) => {\n      if (!_error) resolve(stdout.replace('\\n', ''))\n      else resolve('')\n    }).once('error', () => resolve(''))\n  })\n  const where = () => new Promise<string[]>((resolve) => {\n    exec('where java', (_error, stdout) => {\n      if (!_error) resolve(stdout.split('\\r\\n'))\n      else resolve([])\n    }).once('error', () => resolve([]))\n  })\n\n  if (currentPlatform === 'win32') {\n    const out = await new Promise<string[]>((resolve) => {\n      exec('REG QUERY HKEY_LOCAL_MACHINE\\\\Software\\\\JavaSoft\\\\ /s /v JavaHome', (_error, stdout) => {\n        if (!stdout) { resolve([]) }\n        resolve(stdout.split(EOL).map((item) => item.replace(/[\\r\\n]/g, ''))\n          .filter((item) => item !== null && item !== undefined)\n          .filter((item) => item[0] === ' ')\n          .map((item) => `${item.split('    ')[3]}\\\\bin\\\\java.exe`))\n      })\n    })\n    for (const o of [...out, ...await where()]) {\n      unchecked.add(o)\n    }\n  } else if (currentPlatform === 'darwin') {\n    unchecked.add('/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java')\n    unchecked.add(await which())\n  } else {\n    unchecked.add(await which())\n  }\n\n  const checkingList = Array.from(unchecked).filter((jPath) => typeof jPath === 'string').filter((p) => p !== '')\n\n  return checkingList\n}\n\nasync function dedupJreExecutables(files: Iterable<string>) {\n  // some file might shared same ino\n  const inos = new Set<number>()\n  const result: string[] = []\n  for (const file of files) {\n    const fstat = await stat(file).catch(() => ({ ino: -1 }))\n    if (inos.has(fstat.ino)) {\n      continue\n    }\n    inos.add(fstat.ino)\n    result.push(file)\n  }\n  return result\n}\n\n/**\n * Scan local java version on the disk.\n *\n * It will check if the passed `locations` are the home of java.\n * Notice that the locations should not be the executable, but the path of java installation, like JAVA_HOME.\n *\n * This will call `getPotentialJavaLocations` and then `resolveJava`\n *\n * @param locations The location (like java_home) want to check.\n * @returns All validate java info\n */\nexport async function scanLocalJava(locations: string[]): Promise<JavaInfo[]> {\n  const unchecked = new Set(locations)\n  const potential = await getPotentialJavaLocations()\n  potential.forEach((p) => unchecked.add(p))\n\n  const checkingList = await dedupJreExecutables([...unchecked].filter((jPath) => typeof jPath === 'string').filter((p) => p !== ''))\n\n  const javas = await Promise.all(checkingList.map((jPath) => resolveJava(jPath)))\n  return javas.filter(((j) => j !== undefined) as (j?: JavaInfo) => j is JavaInfo)\n}\n", "import { getPlatform, Platform } from '@xmcl/core'\nimport { ChecksumValidatorOptions, DownloadBaseOptions, DownloadOptions, getDownloadBaseOptions, Validator } from '@xmcl/file-transfer'\nimport { Task, task, TaskRoutine } from '@xmcl/task'\nimport { link, readFile } from 'fs/promises'\nimport { dirname, join } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { DownloadMultipleTask, DownloadTask } from './downloadTask'\nimport { ensureDir, ParallelTaskOptions } from './utils'\n/**\n * Contain all java runtimes basic info\n */\nexport interface JavaRuntimes {\n  linux: JavaRuntimeTargets\n  'linux-i386': JavaRuntimeTargets\n  'mac-os': JavaRuntimeTargets\n  'mac-os-arm64': JavaRuntimeTargets\n  'windows-x64': JavaRuntimeTargets\n  'windows-x86': JavaRuntimeTargets\n  'windows-arm64': JavaRuntimeTargets\n}\n\nexport interface JavaRuntimeTargets {\n  'java-runtime-alpha': JavaRuntimeTarget[]\n  'java-runtime-beta': JavaRuntimeTarget[]\n  'jre-legacy': JavaRuntimeTarget[]\n  'minecraft-java-exe': JavaRuntimeTarget[]\n  [key: string]: JavaRuntimeTarget[]\n}\n\nexport enum JavaRuntimeTargetType {\n  /**\n   * The legacy java version\n   */\n  Legacy = 'jre-legacy',\n  /**\n   * The new java environment, which is the java 16\n   */\n  Alpha = 'java-runtime-alpha',\n  Beta = 'java-runtime-beta',\n  Delta = 'java-runtime-delta',\n  Gamma = 'java-runtime-gamma',\n  JavaExe = 'minecraft-java-exe',\n}\n\n/**\n * Represent a java runtime\n */\nexport interface JavaRuntimeTarget {\n  /**\n     * Guessing this is the flight of this java runtime\n     */\n  availability: {\n    group: number\n    progress: number\n  }\n  /**\n   * The manifest detail of the resource\n   */\n  manifest: DownloadInfo\n  /**\n   * The basic version info of the manifest\n   */\n  version: {\n    /**\n     * The name of the version. e.g. `8u51`, `12`, `16.0.1.9.1`\n     */\n    name: string\n    /**\n     * The date string (UTC)\n     */\n    released: string\n  }\n}\n\nexport interface Entry {\n  type: 'file' | 'link' | 'directory'\n}\n\nexport interface LinkEntry extends Entry {\n  type: 'link'\n  /**\n   * The link target\n   */\n  target: string\n}\n\nexport interface DirectoryEntry extends Entry {\n  type: 'directory'\n}\n\nexport interface DownloadInfo {\n  /**\n   * The sha info of the resource\n   */\n  sha1: string\n  /**\n   * The size of the resource\n   */\n  size: number\n  /**\n   * The url to download resource\n   */\n  url: string\n}\n\nexport interface FileEntry extends Entry {\n  type: 'file'\n  executable: boolean\n  downloads: {\n    /**\n     * The raw format of the file\n     */\n    raw: DownloadInfo\n    /**\n     * The lzma format of the file\n     */\n    lzma?: DownloadInfo\n  }\n}\n\nexport type AnyEntry = FileEntry | DirectoryEntry | LinkEntry\n\n/**\n * Contains info about every files in this java runtime\n */\nexport interface JavaRuntimeManifest {\n  target: JavaRuntimeTargetType | string\n  /**\n   * The files of the java runtime\n   */\n  files: Record<string, AnyEntry>\n\n  version: JavaRuntimeTarget['version']\n}\n\nexport const DEFAULT_RUNTIME_ALL_URL = 'https://launchermeta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json'\n\nfunction normalizeUrls(url: string, fileHost?: string | string[]): string[] {\n  if (!fileHost) {\n    return [url]\n  }\n  if (typeof fileHost === 'string') {\n    const u = new URL(url)\n    u.hostname = fileHost\n    const result = u.toString()\n    if (result !== url) {\n      return [result, url]\n    }\n    return [result]\n  }\n  const result = fileHost.map((host) => {\n    const u = new URL(url)\n    u.hostname = host\n    return u.toString()\n  })\n\n  if (result.indexOf(url) === -1) {\n    result.push(url)\n  }\n\n  return result\n}\n\nexport interface FetchJavaRuntimeManifestOptions extends DownloadBaseOptions {\n  /**\n   * The alternative download host for the file\n   */\n  apiHost?: string | string[]\n  /**\n   * The url of the all runtime json\n   */\n  url?: string\n  /**\n   * The platform to install. It will be auto-resolved by default.\n   * @default getPlatform()\n   */\n  platform?: Platform\n  /**\n   * The install java runtime type\n   * @default InstallJavaRuntimeTarget.Next\n   */\n  target?: JavaRuntimeTargetType | string\n  /**\n   * The index manifest of the java runtime. If this is not presented, it will fetch by platform and all platform url.\n   */\n  manifestIndex?: JavaRuntimes\n  /**\n   * The dispatcher to request API\n   */\n  dispatcher?: Dispatcher\n}\n\n/**\n * Fetch java runtime manifest. It should be able to resolve to your platform, or you can assign the platform.\n *\n * Also, you should assign the target to download, or it will use the latest java 16.\n * @param options The options of fetch runtime manifest\n */\nexport async function fetchJavaRuntimeManifest(options: FetchJavaRuntimeManifestOptions = {}): Promise<JavaRuntimeManifest> {\n  let manifestIndex = options.manifestIndex\n  if (!manifestIndex) {\n    const response = await request(normalizeUrls(options.url ?? DEFAULT_RUNTIME_ALL_URL, options.apiHost)[0], { dispatcher: options.dispatcher, throwOnError: true })\n    manifestIndex = await response.body.json() as JavaRuntimes\n  }\n  const manifest = manifestIndex\n  const platform = options.platform ?? getPlatform()\n  const runtimeTarget = options.target ?? JavaRuntimeTargetType.Beta\n  const resolveTarget = () => {\n    if (platform.name === 'windows') {\n      if (platform.arch === 'x64') {\n        return manifest['windows-x64']\n      }\n      if (platform.arch === 'x86' || platform.arch === 'x32') {\n        return manifest['windows-x86']\n      }\n      if (platform.arch === 'arm64') {\n        return manifest['windows-arm64']\n      }\n      return manifest['windows-x64']\n    }\n    if (platform.name === 'osx') {\n      if (platform.arch === 'arm64') {\n        return manifest['mac-os-arm64']\n      }\n      return manifest['mac-os']\n    }\n    if (platform.name === 'linux') {\n      if (platform.arch === 'x86' || platform.arch === 'x32') {\n        return manifest['linux-i386']\n      }\n      if (platform.arch === 'x64') {\n        return manifest.linux\n      }\n      return manifest.linux\n    }\n    throw new Error('Cannot resolve platform')\n  }\n  const targets = resolveTarget()[runtimeTarget]\n  if (targets && targets.length > 0) {\n    const target = targets[0]\n    const manifestUrl = normalizeUrls(target.manifest.url, options.apiHost)[0]\n    const response = await request(manifestUrl, { dispatcher: options.dispatcher, throwOnError: true })\n    const manifest: JavaRuntimeManifest = await response.body.json() as any\n    const result: JavaRuntimeManifest = {\n      files: manifest.files,\n      target: runtimeTarget,\n      version: target.version,\n    }\n    return result\n  } else {\n    throw new Error()\n  }\n}\n\n\nasync function downloadFiles(this: TaskRoutine<any>, destination: string, options: InstallJavaRuntimeWithJsonOptions | InstallJavaRuntimeOptions, manifest: JavaRuntimeManifest) {\n  const downloadLzma = false\n  await this.yield(new DownloadMultipleTask(Object.entries(manifest.files)\n    .filter(([file, entry]) => entry.type === 'file')\n    .map(([file, entry]) => {\n      const fEntry = entry as FileEntry\n      const downloadInfo = (downloadLzma && fEntry.downloads.lzma) ? fEntry.downloads.lzma : fEntry.downloads.raw\n      const isLzma = downloadInfo === fEntry.downloads.lzma\n      const dest = isLzma ? (join(destination, file) + '.lzma') : join(destination, file)\n      const urls = normalizeUrls(downloadInfo.url, options.apiHost)\n      const hash = downloadInfo.sha1\n      const downloadOptions: DownloadOptions = {\n        url: urls,\n        validator: options.checksumValidatorResolver?.({ algorithm: 'sha1', hash }) || { algorithm: 'sha1', hash },\n        destination: dest,\n        ...getDownloadBaseOptions(options),\n      }\n      return downloadOptions\n    })\n  ).setName('download'))\n  await Promise.all(Object.entries(manifest.files)\n    .filter(([file, entry]) => entry.type !== 'file')\n    .map(async ([file, entry]) => {\n      const dest = join(destination, file)\n      if (entry.type === 'directory') {\n        await ensureDir(dest)\n      } else if (entry.type === 'link') {\n        await link(dest, join(dirname(dest), entry.target)).catch(() => { })\n      }\n    }))\n}\n\nexport interface InstallJavaRuntimeOptions extends DownloadBaseOptions, ParallelTaskOptions {\n  /**\n     * The alternative download host for the file\n     */\n  apiHost?: string | string[]\n  /**\n     * The destination of this installation\n     */\n  destination: string\n  /**\n     * The actual manfiest to install.\n     */\n  manifest: JavaRuntimeManifest\n  /**\n     * Download lzma compressed version instead of raw version.\n     * - If `true`, it will just download lzma file version, you need to decompress by youself!\n     * - If `Function`, it will use that function to decompress the file!\n     */\n  lzma?: boolean | ((compressedFilePath: string, targetPath: string) => Promise<void>)\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n}\n\n/**\n * Install java runtime from java runtime manifest\n * @param options The options to install java runtime\n */\nexport function installJavaRuntimeTask(options: InstallJavaRuntimeOptions): Task<void> {\n  return task('installJavaRuntime', async function () {\n    const destination = options.destination\n    const manifest = options.manifest\n    await downloadFiles.call(this, destination, options, manifest)\n  })\n}\n\n\nexport interface InstallJavaRuntimeWithJsonOptions extends DownloadBaseOptions, ParallelTaskOptions {\n  /**\n   * The alternative download host for the file\n   */\n  apiHost?: string | string[]\n  /**\n   * The destination of this installation\n   */\n  destination: string\n  /**\n   * The actual manfiest metadata.\n   */\n  target: JavaRuntimeTarget\n  /**\n   * Download lzma compressed version instead of raw version.\n   * - If `true`, it will just download lzma file version, you need to decompress by youself!\n   * - If `Function`, it will use that function to decompress the file!\n   */\n  lzma?: boolean | ((compressedFilePath: string, targetPath: string) => Promise<void>)\n\n  checksumValidatorResolver?: (checksum: ChecksumValidatorOptions) => Validator\n}\n\n/**\n * Install java runtime from java runtime manifest\n * @param options The options to install java runtime\n */\nexport function installJavaRuntimeWithJsonTask(options: InstallJavaRuntimeWithJsonOptions): Task<void> {\n  return task('installJavaRuntime', async function () {\n    const destination = options.destination\n    const target = options.target\n    const downloadOptions = getDownloadBaseOptions(options)\n    const jsonPath = join(destination, 'manifest.json')\n    const manifestUrl = normalizeUrls(target.manifest.url, options.apiHost)\n    await this.yield(new DownloadTask({\n      destination: jsonPath,\n      url: manifestUrl,\n      validator: {\n        algorithm: 'sha1',\n        hash: target.manifest.sha1,\n      },\n      ...downloadOptions,\n    }).setName('json'))\n\n    const content = await readFile(jsonPath, 'utf-8')\n    const manifest: JavaRuntimeManifest = JSON.parse(content)\n\n    await downloadFiles.call(this, destination, options, manifest)\n  })\n}\n", "import { diagnoseFile, Issue, LibraryIssue, MinecraftFolder, MinecraftLocation, Version } from '@xmcl/core'\nimport { InstallProfile, resolveProcessors, PostProcessor } from './profile'\n\nexport type InstallIssues = ProcessorIssue | LibraryIssue\n\n/**\n * The processor issue\n */\nexport interface ProcessorIssue extends Issue {\n  role: 'processor'\n\n  /**\n     * The processor\n     */\n  processor: PostProcessor\n}\n\nexport interface InstallProfileIssueReport {\n  minecraftLocation: MinecraftFolder\n  installProfile: InstallProfile\n  issues: InstallIssues[]\n}\n\n/**\n * Diagnose a install profile status. Check if it processor output correctly processed.\n *\n * This can be used for check if forge correctly installed when minecraft >= 1.13\n * @beta\n *\n * @param installProfile The install profile.\n * @param minecraftLocation The minecraft location\n */\nexport async function diagnoseInstall(installProfile: InstallProfile, minecraftLocation: MinecraftLocation, side: 'client' | 'server' = 'client'): Promise<InstallProfileIssueReport> {\n  const mc = MinecraftFolder.from(minecraftLocation)\n  const report: InstallProfileIssueReport = {\n    minecraftLocation: mc,\n    installProfile,\n    issues: [],\n  }\n  const issues = report.issues\n  const processors: PostProcessor[] = resolveProcessors(side, installProfile, mc)\n  await Promise.all(Version.resolveLibraries(installProfile.libraries).map(async (lib) => {\n    const libPath = mc.getLibraryByPath(lib.download.path)\n    const issue = await diagnoseFile({\n      role: 'library',\n      file: libPath,\n      expectedChecksum: lib.download.sha1,\n      hint: 'Problem on install_profile! Please consider to use Installer.installByProfile to fix.',\n    })\n    if (issue) {\n      issues.push(Object.assign(issue, { library: lib }))\n    }\n  }))\n  for (const proc of processors) {\n    if (proc.outputs) {\n      for (const [file, checksum] of Object.entries(proc.outputs)) {\n        const issue = await diagnoseFile({\n          role: 'processor',\n          file,\n          expectedChecksum: checksum.replace(/'/g, ''),\n          hint: 'Re-install this installer profile!',\n        })\n        if (issue) {\n          issues.push(Object.assign(issue, { processor: proc }))\n        }\n      }\n    }\n  }\n  return report\n}\n", "import { MinecraftFolder, MinecraftLocation, Version } from '@xmcl/core'\nimport { writeFile } from 'fs/promises'\nimport { FetchOptions, doFetch, ensureFile } from './utils'\nimport { FabricArtifactVersion, FabricLoaderArtifact } from './fabric'\n\nexport const DEFAULT_META_URL_QUILT = 'https://meta.quiltmc.org'\n\nexport interface GetQuiltOptions extends FetchOptions {\n  minecraftVersion: string\n}\n\nexport interface QuiltLoaderArtifact extends FabricLoaderArtifact {\n  hashed: FabricLoaderArtifact['intermediary']\n}\n\n/**\n * Get supported fabric game versions\n */\nexport async function getQuiltGames(options?: FetchOptions): Promise<string[]> {\n  const response = await doFetch(options, `${DEFAULT_META_URL_QUILT}/v3/game`)\n  const body = await response.json() as Array<{ version: string }>\n  return body.map((g) => g.version)\n}\n\n/**\n * Get quilt-loader artifact list\n */\nexport async function getQuiltLoaders(options?: FetchOptions): Promise<FabricArtifactVersion[]> {\n  const response = await doFetch(options, `${DEFAULT_META_URL_QUILT}/v3/versions/loader`)\n  const body = response.json()\n  return body\n}\n\n/**\n * Get quilt loader versions list for a specific minecraft version\n */\nexport async function getQuiltLoaderVersionsByMinecraft(options: GetQuiltOptions): Promise<QuiltLoaderArtifact[]> {\n  const response = await doFetch(options, `${DEFAULT_META_URL_QUILT}/v3/versions/loader/${options.minecraftVersion}`)\n  const content: QuiltLoaderArtifact[] = await response.json()\n  return content\n}\n\nexport interface InstallQuiltVersionOptions extends FetchOptions {\n  minecraftVersion: string\n  version: string\n  minecraft: MinecraftLocation\n  side?: 'client' | 'server'\n}\n\n/**\n * Install quilt version via profile API\n */\nexport async function installQuiltVersion(options: InstallQuiltVersionOptions) {\n  const side = options.side ?? 'client'\n  const url = side === 'client'\n    ? `${DEFAULT_META_URL_QUILT}/v3/versions/loader/${options.minecraftVersion}/${options.version}/profile/json`\n    : `${DEFAULT_META_URL_QUILT}/v3/versions/loader/${options.minecraftVersion}/${options.version}/server/json`\n  const response = await doFetch(options, url)\n  const content: Version = await response.json() as any\n\n  const minecraft = MinecraftFolder.from(options.minecraft)\n  const versionName = `${options.minecraftVersion}-quilt${options.version}`\n  content.id = versionName\n\n  const jsonPath = side === 'client' ? minecraft.getVersionJson(versionName) : minecraft.getVersionServerJson(versionName)\n\n  await ensureFile(jsonPath)\n  await writeFile(jsonPath, JSON.stringify(content))\n\n  return versionName\n}\n", "import { BaseTask, CancelledError, TaskState } from '@xmcl/task'\nimport { openEntryReadStream } from '@xmcl/unzip'\nimport { createWriteStream } from 'fs'\nimport { join } from 'path'\nimport { Readable, Writable } from 'stream'\nimport { pipeline } from 'stream/promises'\nimport { Entry, ZipFile } from 'yauzl'\nimport { ensureFile } from './utils'\n\nexport interface EntryResolver {\n  (entry: Entry): Promise<string> | string\n}\n\nexport function getDefaultEntryResolver(): EntryResolver {\n  return (e) => e.fileName\n}\n\nexport class UnzipTask extends BaseTask<void> {\n  private streams: [Readable, Writable][] = []\n  private _onCancelled = () => { }\n\n  constructor(readonly zipFile: ZipFile, readonly entries: Entry[], destination: string, readonly resolver: EntryResolver = getDefaultEntryResolver(), readonly interpreter: (input: Readable, file: string) => void = () => { }) {\n    super()\n    this._to = destination\n  }\n\n  protected async handleEntry(entry: Entry, relativePath: string) {\n    const file = join(this.to!, relativePath)\n    if (this._state === TaskState.Cancelled) {\n      throw new CancelledError()\n    }\n\n    const readStream = await openEntryReadStream(this.zipFile, entry)\n    if (this.isCancelled) {\n      throw new CancelledError()\n    }\n    if (this._state === TaskState.Paused) {\n      readStream.pause()\n    }\n\n    await ensureFile(file)\n    this.interpreter(readStream, file)\n    const writeStream = createWriteStream(file)\n    readStream.on('data', (buf: Buffer) => {\n      this._progress += buf.length\n      this.update(buf.length)\n    })\n    this.streams.push([readStream, writeStream])\n    await pipeline(readStream, writeStream)\n  }\n\n  protected async runTask(): Promise<void> {\n    const promises: Promise<void>[] = []\n\n    for (const e of this.entries) {\n      const path = await this.resolver(e)\n      if (this.isCancelled) {\n        throw new CancelledError()\n      }\n      this._total += e.uncompressedSize\n      promises.push(this.handleEntry(e, path))\n    }\n\n    this.update(0)\n\n    try {\n      await Promise.all(promises)\n    } catch (e) {\n      if (e instanceof CancelledError) {\n        this._onCancelled()\n      }\n      throw e\n    }\n  }\n\n  protected cancelTask(): Promise<void> {\n    for (const [read, write] of this.streams) {\n      read.unpipe()\n      read.destroy(new CancelledError())\n      this.zipFile.close()\n      write.destroy(new CancelledError())\n    }\n    return new Promise((resolve) => {\n      this._onCancelled = resolve\n    })\n  }\n\n  protected async pauseTask(): Promise<void> {\n    const promise = Promise.all(this.streams.map(([read]) => new Promise((resolve) =>\n      read.once('pause', resolve))))\n    for (const [read] of this.streams) {\n      read.pause()\n    }\n    await promise\n  }\n\n  protected async resumeTask(): Promise<void> {\n    const promise = Promise.all(this.streams.map(([read]) => new Promise((resolve) =>\n      read.once('readable', resolve))))\n    for (const [read] of this.streams) {\n      read.resume()\n    }\n    await promise\n  }\n}\n", "/* eslint-disable n/no-unsupported-features/node-builtins */\nimport { LibraryInfo, MinecraftFolder, MinecraftLocation } from '@xmcl/core'\nimport { DownloadBaseOptions, getDownloadBaseOptions } from '@xmcl/file-transfer'\nimport { AbortableTask, CancelledError, Task, task } from '@xmcl/task'\nimport { writeFile } from 'fs/promises'\nimport { dirname } from 'path'\nimport { Dispatcher, request } from 'undici'\nimport { DownloadTask } from './downloadTask'\nimport { ensureDir } from './utils'\n\nexport interface LabyModManifest {\n  labyModVersion: string\n  commitReference: string\n  sha1: string\n  releaseTime: number\n  size: number\n\n  assets: {\n    shader: string\n    common: string\n    fonts: string\n    'vanilla-theme': string\n    'fancy-theme': string\n    i18n: string\n  }\n\n  minecraftVersions: MinecraftVersion[]\n}\n\ninterface MinecraftVersion {\n  tag: string\n  version: string\n  index: number\n  type: string\n  runtime: {\n    name: string\n    version: number\n  }\n  customManifestUrl: string\n}\n\nexport async function getLabyModManifest(env = 'production', options?: { dispatcher?: Dispatcher }): Promise<LabyModManifest> {\n  const url = `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/manifest/${env}/latest.json`\n  const res = await request(url, options)\n  return await res.body.json() as any\n}\n\nexport interface InstallLabyModOptions extends DownloadBaseOptions {\n  dispatcher?: Dispatcher\n  environment?: string\n  fetch?: typeof fetch\n}\n\nclass JsonTask extends AbortableTask<string> {\n  private controller = new AbortController()\n\n  constructor(private manifest: LabyModManifest, private tag: string, private folder: MinecraftFolder, private environment: string, private fetch?: typeof globalThis.fetch) {\n    super()\n    this.name = 'json'\n    this.param = { version: tag }\n  }\n\n  protected async process(): Promise<string> {\n    this.controller = new AbortController()\n    const librariesUrl = `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/libraries/${this.environment}.json`\n    const versionInfo = this.manifest.minecraftVersions.find((v) => v.tag === this.tag)!\n\n    if (!versionInfo) {\n      throw Object.assign(new Error(`Cannot find version info for ${this.tag}`), {\n        name: 'VersionInfoNotFoundError',\n      })\n    }\n\n    interface LibInfo {\n      name: string\n      url: string\n      minecraftVersion: string\n      sha1: string\n      size: number\n      natives: any[]\n      resolvedAt: number\n    }\n\n    const fetch = this.fetch ?? globalThis.fetch\n\n    const metadataResponse = await fetch(librariesUrl, { signal: this.controller.signal })\n\n    if (!metadataResponse.ok) {\n      throw Object.assign(new Error(`Failed to fetch libraries metadata: ${metadataResponse.statusText}: ${await metadataResponse.text()}`), {\n        name: 'FetchLabyModMetadataError',\n      })\n    }\n    // Get version json and merge with libraries\n    const libraries: LibInfo[] = await metadataResponse.json()\n      .then((res) => res.libraries as LibInfo[])\n      .then((libs) => libs.filter(lib => lib.minecraftVersion === 'all' || lib.minecraftVersion === this.tag))\n\n    const versionJsonResponse = await fetch(versionInfo.customManifestUrl, { signal: this.controller.signal })\n\n    if (!versionJsonResponse.ok) {\n      throw Object.assign(new Error(`Failed to fetch version json: ${versionJsonResponse.statusText}: ${await versionJsonResponse.text()}`), {\n        name: 'FetchLabyModVersionJsonError',\n      })\n    }\n    const versionJson = await versionJsonResponse.json()\n\n    versionJson.libraries.push(...libraries.map((l) => ({\n      name: l.name,\n      downloads: {\n        artifact: {\n          path: LibraryInfo.resolve(l.name).path,\n          sha1: l.sha1,\n          size: l.size,\n          url: l.url,\n        },\n      },\n    })), {\n      name: `net.labymod:LabyMod:${this.manifest.labyModVersion}`,\n      downloads: {\n        artifact: {\n          path: `net/labymod/LabyMod/${this.manifest.labyModVersion}/LabyMod-${this.manifest.labyModVersion}.jar`,\n          sha1: this.manifest.sha1,\n          size: this.manifest.size,\n          url: `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/download/labymod4/${this.environment}/${this.manifest.commitReference}.jar`,\n        },\n      },\n    })\n    versionJson.id = `LabyMod-4-${this.tag}-${this.manifest.commitReference}`\n\n    // write json to file\n    const versionPath = this.folder.getPath('versions', versionJson.id, `${versionJson.id}.json`)\n    await ensureDir(dirname(versionPath))\n    await writeFile(versionPath, JSON.stringify(versionJson, null, 4))\n\n    return versionJson.id\n  }\n\n  protected abort(isCancelled: boolean): void {\n    this.controller.abort(new CancelledError())\n  }\n\n  protected isAbortedError(e: any): boolean {\n    return e instanceof CancelledError\n  }\n}\n\nexport function installLabyMod4Task(manifest: LabyModManifest, tag: string, minecraft: MinecraftLocation, options?: InstallLabyModOptions): Task<string> {\n  return task('installLabyMod', async function () {\n    const folder = MinecraftFolder.from(minecraft)\n    const environment = options?.environment ?? 'production'\n\n    const versionId = await this.yield(new JsonTask(manifest, tag, folder, environment, options?.fetch))\n\n    // Download assets\n    for (const [name, hash] of Object.entries(manifest.assets)) {\n      const url = `https://laby-releases.s3.de.io.cloud.ovh.net/api/v1/download/assets/labymod4/${environment}/${manifest.commitReference}/${name}/${hash}.jar`\n      const destination = folder.getPath('labymod-neo', 'assets', `${name}.jar`)\n      await this.yield(new DownloadTask({\n        url,\n        destination,\n        validator: { algorithm: 'sha1', hash },\n        ...getDownloadBaseOptions(options),\n      }).setName('asset', { name }))\n    }\n\n    return versionId\n  })\n}\n\nexport function installLaby4Mod(manifest: LabyModManifest, tag: string, minecraft: MinecraftLocation, options?: InstallLabyModOptions): Promise<string> {\n  return installLabyMod4Task(manifest, tag, minecraft, options).startAndWait()\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,QAAIA,UAAS,UAAQ,QAAQ,EAAE;AAE/B,QAAI,YAAY;AAAA,MACd;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAChD;AAAA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",
  "names": ["Buffer", "err", "entry", "crc32", "size", "something", "encoding", "buffer", "content", "e", "process", "resolve", "MinecraftFolder", "writeFile", "LiteloaderVersionList", "installLiteloader", "MinecraftFolder", "writeFile", "LibraryInfo", "MinecraftFolder", "VersionJson", "getDownloadBaseOptions", "task", "filterEntries", "open", "readEntry", "writeFile", "dirname", "join", "relative", "sep", "request", "MinecraftFolder", "task", "readFile", "stat", "writeFile", "join", "task", "MinecraftFolder", "writeFile", "join", "readFile", "download", "stat", "MinecraftFolder", "VersionJson", "AbortableTask", "task", "open", "spawn", "readFile", "writeFile", "dirname", "join", "relative", "sep", "join", "readFile", "open", "relative", "sep", "task", "MinecraftFolder", "VersionJson", "dirname", "writeFile", "AbortableTask", "resolve", "process", "spawn", "VersionJson", "getDownloadBaseOptions", "open", "WriteableZipFile", "dirname", "writeFile", "join", "LibraryInfo", "readEntry", "relative", "sep", "filterEntries", "task", "MinecraftFolder", "request", "MinecraftFolder", "VersionJson", "getDownloadBaseOptions", "task", "open", "readEntry", "VersionJson", "getDownloadBaseOptions", "task", "MinecraftFolder", "open", "readEntry", "MinecraftFolder", "task", "open", "readAllEntries", "readEntry", "writeFile", "task", "MinecraftFolder", "open", "readAllEntries", "readEntry", "access", "writeFile", "getDownloadBaseOptions", "task", "stat", "basename", "join", "request", "basename", "getDownloadBaseOptions", "platform", "task", "request", "resolve", "join", "stat", "getPlatform", "getDownloadBaseOptions", "task", "link", "readFile", "dirname", "join", "request", "JavaRuntimeTargetType", "result", "request", "platform", "getPlatform", "manifest", "join", "getDownloadBaseOptions", "link", "dirname", "task", "readFile", "MinecraftFolder", "Version", "MinecraftFolder", "Version", "checksum", "MinecraftFolder", "writeFile", "MinecraftFolder", "writeFile", "CancelledError", "openEntryReadStream", "createWriteStream", "join", "pipeline", "join", "CancelledError", "openEntryReadStream", "createWriteStream", "pipeline", "resolve", "LibraryInfo", "MinecraftFolder", "getDownloadBaseOptions", "AbortableTask", "CancelledError", "task", "writeFile", "dirname", "request", "request", "AbortableTask", "fetch", "LibraryInfo", "dirname", "writeFile", "CancelledError", "task", "MinecraftFolder", "getDownloadBaseOptions"]
}
