UNPKG

browserfs

Version:

A filesystem in your browser!

488 lines 89.6 kB
"use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var api_error_1 = require('../core/api_error'); var node_fs_stats_1 = require('../core/node_fs_stats'); var file_system = require('../core/file_system'); var file_flag_1 = require('../core/file_flag'); var preload_file = require('../generic/preload_file'); var util_1 = require('../core/util'); var extended_ascii_1 = require('bfs-buffer/js/extended_ascii'); var inflateRaw = require('pako/dist/pako_inflate.min').inflateRaw; var file_index_1 = require('../generic/file_index'); (function (ExternalFileAttributeType) { ExternalFileAttributeType[ExternalFileAttributeType["MSDOS"] = 0] = "MSDOS"; ExternalFileAttributeType[ExternalFileAttributeType["AMIGA"] = 1] = "AMIGA"; ExternalFileAttributeType[ExternalFileAttributeType["OPENVMS"] = 2] = "OPENVMS"; ExternalFileAttributeType[ExternalFileAttributeType["UNIX"] = 3] = "UNIX"; ExternalFileAttributeType[ExternalFileAttributeType["VM_CMS"] = 4] = "VM_CMS"; ExternalFileAttributeType[ExternalFileAttributeType["ATARI_ST"] = 5] = "ATARI_ST"; ExternalFileAttributeType[ExternalFileAttributeType["OS2_HPFS"] = 6] = "OS2_HPFS"; ExternalFileAttributeType[ExternalFileAttributeType["MAC"] = 7] = "MAC"; ExternalFileAttributeType[ExternalFileAttributeType["Z_SYSTEM"] = 8] = "Z_SYSTEM"; ExternalFileAttributeType[ExternalFileAttributeType["CP_M"] = 9] = "CP_M"; ExternalFileAttributeType[ExternalFileAttributeType["NTFS"] = 10] = "NTFS"; ExternalFileAttributeType[ExternalFileAttributeType["MVS"] = 11] = "MVS"; ExternalFileAttributeType[ExternalFileAttributeType["VSE"] = 12] = "VSE"; ExternalFileAttributeType[ExternalFileAttributeType["ACORN_RISC"] = 13] = "ACORN_RISC"; ExternalFileAttributeType[ExternalFileAttributeType["VFAT"] = 14] = "VFAT"; ExternalFileAttributeType[ExternalFileAttributeType["ALT_MVS"] = 15] = "ALT_MVS"; ExternalFileAttributeType[ExternalFileAttributeType["BEOS"] = 16] = "BEOS"; ExternalFileAttributeType[ExternalFileAttributeType["TANDEM"] = 17] = "TANDEM"; ExternalFileAttributeType[ExternalFileAttributeType["OS_400"] = 18] = "OS_400"; ExternalFileAttributeType[ExternalFileAttributeType["OSX"] = 19] = "OSX"; })(exports.ExternalFileAttributeType || (exports.ExternalFileAttributeType = {})); var ExternalFileAttributeType = exports.ExternalFileAttributeType; (function (CompressionMethod) { CompressionMethod[CompressionMethod["STORED"] = 0] = "STORED"; CompressionMethod[CompressionMethod["SHRUNK"] = 1] = "SHRUNK"; CompressionMethod[CompressionMethod["REDUCED_1"] = 2] = "REDUCED_1"; CompressionMethod[CompressionMethod["REDUCED_2"] = 3] = "REDUCED_2"; CompressionMethod[CompressionMethod["REDUCED_3"] = 4] = "REDUCED_3"; CompressionMethod[CompressionMethod["REDUCED_4"] = 5] = "REDUCED_4"; CompressionMethod[CompressionMethod["IMPLODE"] = 6] = "IMPLODE"; CompressionMethod[CompressionMethod["DEFLATE"] = 8] = "DEFLATE"; CompressionMethod[CompressionMethod["DEFLATE64"] = 9] = "DEFLATE64"; CompressionMethod[CompressionMethod["TERSE_OLD"] = 10] = "TERSE_OLD"; CompressionMethod[CompressionMethod["BZIP2"] = 12] = "BZIP2"; CompressionMethod[CompressionMethod["LZMA"] = 14] = "LZMA"; CompressionMethod[CompressionMethod["TERSE_NEW"] = 18] = "TERSE_NEW"; CompressionMethod[CompressionMethod["LZ77"] = 19] = "LZ77"; CompressionMethod[CompressionMethod["WAVPACK"] = 97] = "WAVPACK"; CompressionMethod[CompressionMethod["PPMD"] = 98] = "PPMD"; })(exports.CompressionMethod || (exports.CompressionMethod = {})); var CompressionMethod = exports.CompressionMethod; function msdos2date(time, date) { var day = date & 0x1F; var month = ((date >> 5) & 0xF) - 1; var year = (date >> 9) + 1980; var second = time & 0x1F; var minute = (time >> 5) & 0x3F; var hour = time >> 11; return new Date(year, month, day, hour, minute, second); } function safeToString(buff, useUTF8, start, length) { if (length === 0) { return ""; } else if (useUTF8) { return buff.toString('utf8', start, start + length); } else { return extended_ascii_1["default"].byte2str(buff.slice(start, start + length)); } } var FileHeader = (function () { function FileHeader(data) { this.data = data; if (data.readUInt32LE(0) !== 0x04034b50) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid Zip file: Local file header has invalid signature: " + this.data.readUInt32LE(0)); } } FileHeader.prototype.versionNeeded = function () { return this.data.readUInt16LE(4); }; FileHeader.prototype.flags = function () { return this.data.readUInt16LE(6); }; FileHeader.prototype.compressionMethod = function () { return this.data.readUInt16LE(8); }; FileHeader.prototype.lastModFileTime = function () { return msdos2date(this.data.readUInt16LE(10), this.data.readUInt16LE(12)); }; FileHeader.prototype.rawLastModFileTime = function () { return this.data.readUInt32LE(10); }; FileHeader.prototype.crc32 = function () { return this.data.readUInt32LE(14); }; FileHeader.prototype.fileNameLength = function () { return this.data.readUInt16LE(26); }; FileHeader.prototype.extraFieldLength = function () { return this.data.readUInt16LE(28); }; FileHeader.prototype.fileName = function () { return safeToString(this.data, this.useUTF8(), 30, this.fileNameLength()); }; FileHeader.prototype.extraField = function () { var start = 30 + this.fileNameLength(); return this.data.slice(start, start + this.extraFieldLength()); }; FileHeader.prototype.totalSize = function () { return 30 + this.fileNameLength() + this.extraFieldLength(); }; FileHeader.prototype.useUTF8 = function () { return (this.flags() & 0x800) === 0x800; }; return FileHeader; }()); exports.FileHeader = FileHeader; var FileData = (function () { function FileData(header, record, data) { this.header = header; this.record = record; this.data = data; } FileData.prototype.decompress = function () { var compressionMethod = this.header.compressionMethod(); switch (compressionMethod) { case CompressionMethod.DEFLATE: var data = inflateRaw(util_1.buffer2Arrayish(this.data.slice(0, this.record.compressedSize())), { chunkSize: this.record.uncompressedSize() }); return util_1.arrayish2Buffer(data); case CompressionMethod.STORED: return util_1.copyingSlice(this.data, 0, this.record.uncompressedSize()); default: var name = CompressionMethod[compressionMethod]; name = name ? name : "Unknown: " + compressionMethod; throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid compression method on file '" + this.header.fileName() + "': " + name); } }; FileData.prototype.getHeader = function () { return this.header; }; FileData.prototype.getRecord = function () { return this.record; }; FileData.prototype.getRawData = function () { return this.data; }; return FileData; }()); exports.FileData = FileData; var DataDescriptor = (function () { function DataDescriptor(data) { this.data = data; } DataDescriptor.prototype.crc32 = function () { return this.data.readUInt32LE(0); }; DataDescriptor.prototype.compressedSize = function () { return this.data.readUInt32LE(4); }; DataDescriptor.prototype.uncompressedSize = function () { return this.data.readUInt32LE(8); }; return DataDescriptor; }()); exports.DataDescriptor = DataDescriptor; var ArchiveExtraDataRecord = (function () { function ArchiveExtraDataRecord(data) { this.data = data; if (this.data.readUInt32LE(0) !== 0x08064b50) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid archive extra data record signature: " + this.data.readUInt32LE(0)); } } ArchiveExtraDataRecord.prototype.length = function () { return this.data.readUInt32LE(4); }; ArchiveExtraDataRecord.prototype.extraFieldData = function () { return this.data.slice(8, 8 + this.length()); }; return ArchiveExtraDataRecord; }()); exports.ArchiveExtraDataRecord = ArchiveExtraDataRecord; var DigitalSignature = (function () { function DigitalSignature(data) { this.data = data; if (this.data.readUInt32LE(0) !== 0x05054b50) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid digital signature signature: " + this.data.readUInt32LE(0)); } } DigitalSignature.prototype.size = function () { return this.data.readUInt16LE(4); }; DigitalSignature.prototype.signatureData = function () { return this.data.slice(6, 6 + this.size()); }; return DigitalSignature; }()); exports.DigitalSignature = DigitalSignature; var CentralDirectory = (function () { function CentralDirectory(zipData, data) { this.zipData = zipData; this.data = data; if (this.data.readUInt32LE(0) !== 0x02014b50) throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid Zip file: Central directory record has invalid signature: " + this.data.readUInt32LE(0)); this._filename = this.produceFilename(); } CentralDirectory.prototype.versionMadeBy = function () { return this.data.readUInt16LE(4); }; CentralDirectory.prototype.versionNeeded = function () { return this.data.readUInt16LE(6); }; CentralDirectory.prototype.flag = function () { return this.data.readUInt16LE(8); }; CentralDirectory.prototype.compressionMethod = function () { return this.data.readUInt16LE(10); }; CentralDirectory.prototype.lastModFileTime = function () { return msdos2date(this.data.readUInt16LE(12), this.data.readUInt16LE(14)); }; CentralDirectory.prototype.rawLastModFileTime = function () { return this.data.readUInt32LE(12); }; CentralDirectory.prototype.crc32 = function () { return this.data.readUInt32LE(16); }; CentralDirectory.prototype.compressedSize = function () { return this.data.readUInt32LE(20); }; CentralDirectory.prototype.uncompressedSize = function () { return this.data.readUInt32LE(24); }; CentralDirectory.prototype.fileNameLength = function () { return this.data.readUInt16LE(28); }; CentralDirectory.prototype.extraFieldLength = function () { return this.data.readUInt16LE(30); }; CentralDirectory.prototype.fileCommentLength = function () { return this.data.readUInt16LE(32); }; CentralDirectory.prototype.diskNumberStart = function () { return this.data.readUInt16LE(34); }; CentralDirectory.prototype.internalAttributes = function () { return this.data.readUInt16LE(36); }; CentralDirectory.prototype.externalAttributes = function () { return this.data.readUInt32LE(38); }; CentralDirectory.prototype.headerRelativeOffset = function () { return this.data.readUInt32LE(42); }; CentralDirectory.prototype.produceFilename = function () { var fileName = safeToString(this.data, this.useUTF8(), 46, this.fileNameLength()); return fileName.replace(/\\/g, "/"); }; CentralDirectory.prototype.fileName = function () { return this._filename; }; CentralDirectory.prototype.rawFileName = function () { return this.data.slice(46, 46 + this.fileNameLength()); }; CentralDirectory.prototype.extraField = function () { var start = 44 + this.fileNameLength(); return this.data.slice(start, start + this.extraFieldLength()); }; CentralDirectory.prototype.fileComment = function () { var start = 46 + this.fileNameLength() + this.extraFieldLength(); return safeToString(this.data, this.useUTF8(), start, this.fileCommentLength()); }; CentralDirectory.prototype.rawFileComment = function () { var start = 46 + this.fileNameLength() + this.extraFieldLength(); return this.data.slice(start, start + this.fileCommentLength()); }; CentralDirectory.prototype.totalSize = function () { return 46 + this.fileNameLength() + this.extraFieldLength() + this.fileCommentLength(); }; CentralDirectory.prototype.isDirectory = function () { var fileName = this.fileName(); return (this.externalAttributes() & 0x10 ? true : false) || (fileName.charAt(fileName.length - 1) === '/'); }; CentralDirectory.prototype.isFile = function () { return !this.isDirectory(); }; CentralDirectory.prototype.useUTF8 = function () { return (this.flag() & 0x800) === 0x800; }; CentralDirectory.prototype.isEncrypted = function () { return (this.flag() & 0x1) === 0x1; }; CentralDirectory.prototype.getFileData = function () { var start = this.headerRelativeOffset(); var header = new FileHeader(this.zipData.slice(start)); return new FileData(header, this, this.zipData.slice(start + header.totalSize())); }; CentralDirectory.prototype.getData = function () { return this.getFileData().decompress(); }; CentralDirectory.prototype.getRawData = function () { return this.getFileData().getRawData(); }; CentralDirectory.prototype.getStats = function () { return new node_fs_stats_1["default"](node_fs_stats_1.FileType.FILE, this.uncompressedSize(), 0x16D, new Date(), this.lastModFileTime()); }; return CentralDirectory; }()); exports.CentralDirectory = CentralDirectory; var EndOfCentralDirectory = (function () { function EndOfCentralDirectory(data) { this.data = data; if (this.data.readUInt32LE(0) !== 0x06054b50) throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid Zip file: End of central directory record has invalid signature: " + this.data.readUInt32LE(0)); } EndOfCentralDirectory.prototype.diskNumber = function () { return this.data.readUInt16LE(4); }; EndOfCentralDirectory.prototype.cdDiskNumber = function () { return this.data.readUInt16LE(6); }; EndOfCentralDirectory.prototype.cdDiskEntryCount = function () { return this.data.readUInt16LE(8); }; EndOfCentralDirectory.prototype.cdTotalEntryCount = function () { return this.data.readUInt16LE(10); }; EndOfCentralDirectory.prototype.cdSize = function () { return this.data.readUInt32LE(12); }; EndOfCentralDirectory.prototype.cdOffset = function () { return this.data.readUInt32LE(16); }; EndOfCentralDirectory.prototype.cdZipCommentLength = function () { return this.data.readUInt16LE(20); }; EndOfCentralDirectory.prototype.cdZipComment = function () { return safeToString(this.data, true, 22, this.cdZipCommentLength()); }; EndOfCentralDirectory.prototype.rawCdZipComment = function () { return this.data.slice(22, 22 + this.cdZipCommentLength()); }; return EndOfCentralDirectory; }()); exports.EndOfCentralDirectory = EndOfCentralDirectory; var ZipTOC = (function () { function ZipTOC(index, directoryEntries, eocd, data) { this.index = index; this.directoryEntries = directoryEntries; this.eocd = eocd; this.data = data; } return ZipTOC; }()); exports.ZipTOC = ZipTOC; var ZipFS = (function (_super) { __extends(ZipFS, _super); function ZipFS(input, name) { if (name === void 0) { name = ''; } _super.call(this); this.input = input; this.name = name; this._index = new file_index_1.FileIndex(); this._directoryEntries = []; this._eocd = null; if (input instanceof ZipTOC) { this._index = input.index; this._directoryEntries = input.directoryEntries; this._eocd = input.eocd; this.data = input.data; } else { this.data = input; this.populateIndex(); } } ZipFS.prototype.getName = function () { return 'ZipFS' + (this.name !== '' ? ' ' + this.name : ''); }; ZipFS.prototype.getCentralDirectoryEntry = function (path) { var inode = this._index.getInode(path); if (inode === null) { throw api_error_1.ApiError.ENOENT(path); } if (file_index_1.isFileInode(inode)) { return inode.getData(); } else if (file_index_1.isDirInode(inode)) { return inode.getData(); } }; ZipFS.prototype.getCentralDirectoryEntryAt = function (index) { var dirEntry = this._directoryEntries[index]; if (!dirEntry) { throw new RangeError("Invalid directory index: " + index + "."); } return dirEntry; }; ZipFS.prototype.getNumberOfCentralDirectoryEntries = function () { return this._directoryEntries.length; }; ZipFS.prototype.getEndOfCentralDirectory = function () { return this._eocd; }; ZipFS.isAvailable = function () { return true; }; ZipFS.prototype.diskSpace = function (path, cb) { cb(this.data.length, 0); }; ZipFS.prototype.isReadOnly = function () { return true; }; ZipFS.prototype.supportsLinks = function () { return false; }; ZipFS.prototype.supportsProps = function () { return false; }; ZipFS.prototype.supportsSynch = function () { return true; }; ZipFS.prototype.statSync = function (path, isLstat) { var inode = this._index.getInode(path); if (inode === null) { throw api_error_1.ApiError.ENOENT(path); } var stats; if (file_index_1.isFileInode(inode)) { stats = inode.getData().getStats(); } else if (file_index_1.isDirInode(inode)) { stats = inode.getStats(); } else { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid inode."); } return stats; }; ZipFS.prototype.openSync = function (path, flags, mode) { if (flags.isWriteable()) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, path); } var inode = this._index.getInode(path); if (!inode) { throw api_error_1.ApiError.ENOENT(path); } else if (file_index_1.isFileInode(inode)) { var cdRecord = inode.getData(); var stats = cdRecord.getStats(); switch (flags.pathExistsAction()) { case file_flag_1.ActionType.THROW_EXCEPTION: case file_flag_1.ActionType.TRUNCATE_FILE: throw api_error_1.ApiError.EEXIST(path); case file_flag_1.ActionType.NOP: return new preload_file.NoSyncFile(this, path, flags, stats, cdRecord.getData()); default: throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid FileMode object.'); } } else { throw api_error_1.ApiError.EISDIR(path); } }; ZipFS.prototype.readdirSync = function (path) { var inode = this._index.getInode(path); if (!inode) { throw api_error_1.ApiError.ENOENT(path); } else if (file_index_1.isDirInode(inode)) { return inode.getListing(); } else { throw api_error_1.ApiError.ENOTDIR(path); } }; ZipFS.prototype.readFileSync = function (fname, encoding, flag) { var fd = this.openSync(fname, flag, 0x1a4); try { var fdCast = fd; var fdBuff = fdCast.getBuffer(); if (encoding === null) { return util_1.copyingSlice(fdBuff); } return fdBuff.toString(encoding); } finally { fd.closeSync(); } }; ZipFS.getEOCD = function (data) { var startOffset = 22; var endOffset = Math.min(startOffset + 0xFFFF, data.length - 1); for (var i = startOffset; i < endOffset; i++) { if (data.readUInt32LE(data.length - i) === 0x06054b50) { return new EndOfCentralDirectory(data.slice(data.length - i)); } } throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid ZIP file: Could not locate End of Central Directory signature."); }; ZipFS.addToIndex = function (cd, index) { var filename = cd.fileName(); if (filename.charAt(0) === '/') throw new Error("WHY IS THIS ABSOLUTE"); if (filename.charAt(filename.length - 1) === '/') { filename = filename.substr(0, filename.length - 1); } if (cd.isDirectory()) { index.addPathFast('/' + filename, new file_index_1.DirInode(cd)); } else { index.addPathFast('/' + filename, new file_index_1.FileInode(cd)); } }; ZipFS.computeIndexResponsive = function (data, index, cdPtr, cdEnd, cb, cdEntries, eocd) { if (cdPtr < cdEnd) { var count = 0; while (count++ < 200 && cdPtr < cdEnd) { var cd = new CentralDirectory(data, data.slice(cdPtr)); ZipFS.addToIndex(cd, index); cdPtr += cd.totalSize(); cdEntries.push(cd); } setImmediate(function () { ZipFS.computeIndexResponsive(data, index, cdPtr, cdEnd, cb, cdEntries, eocd); }); } else { cb(new ZipTOC(index, cdEntries, eocd, data)); } }; ZipFS.computeIndex = function (data, cb) { var index = new file_index_1.FileIndex(); var eocd = ZipFS.getEOCD(data); if (eocd.diskNumber() !== eocd.cdDiskNumber()) throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "ZipFS does not support spanned zip files."); var cdPtr = eocd.cdOffset(); if (cdPtr === 0xFFFFFFFF) throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "ZipFS does not support Zip64."); var cdEnd = cdPtr + eocd.cdSize(); ZipFS.computeIndexResponsive(data, index, cdPtr, cdEnd, cb, [], eocd); }; ZipFS.prototype.populateIndex = function () { var eocd = this._eocd = ZipFS.getEOCD(this.data); if (eocd.diskNumber() !== eocd.cdDiskNumber()) throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "ZipFS does not support spanned zip files."); var cdPtr = eocd.cdOffset(); if (cdPtr === 0xFFFFFFFF) throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "ZipFS does not support Zip64."); var cdEnd = cdPtr + eocd.cdSize(); while (cdPtr < cdEnd) { var cd = new CentralDirectory(this.data, this.data.slice(cdPtr)); cdPtr += cd.totalSize(); ZipFS.addToIndex(cd, this._index); this._directoryEntries.push(cd); } }; return ZipFS; }(file_system.SynchronousFileSystem)); exports.__esModule = true; exports["default"] = ZipFS; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmlwRlMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZC9aaXBGUy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUErQ0EsMEJBQWtDLG1CQUFtQixDQUFDLENBQUE7QUFDdEQsOEJBQXlDLHVCQUF1QixDQUFDLENBQUE7QUFDakUsSUFBTyxXQUFXLFdBQVcscUJBQXFCLENBQUMsQ0FBQztBQUVwRCwwQkFBbUMsbUJBQW1CLENBQUMsQ0FBQTtBQUN2RCxJQUFPLFlBQVksV0FBVyx5QkFBeUIsQ0FBQyxDQUFDO0FBQ3pELHFCQUF1RSxjQUFjLENBQUMsQ0FBQTtBQUN0RiwrQkFBMEIsOEJBQThCLENBQUMsQ0FBQTtBQUN6RCxJQUFJLFVBQVUsR0FJVixPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDckQsMkJBQXNFLHVCQUF1QixDQUFDLENBQUE7QUFNOUYsV0FBWSx5QkFBeUI7SUFDbkMsMkVBQVMsQ0FBQTtJQUFFLDJFQUFTLENBQUE7SUFBRSwrRUFBVyxDQUFBO0lBQUUseUVBQVEsQ0FBQTtJQUFFLDZFQUFVLENBQUE7SUFBRSxpRkFBWSxDQUFBO0lBQ3JFLGlGQUFZLENBQUE7SUFBRSx1RUFBTyxDQUFBO0lBQUUsaUZBQVksQ0FBQTtJQUFFLHlFQUFRLENBQUE7SUFBRSwwRUFBUyxDQUFBO0lBQUUsd0VBQVEsQ0FBQTtJQUFFLHdFQUFRLENBQUE7SUFDNUUsc0ZBQWUsQ0FBQTtJQUFFLDBFQUFTLENBQUE7SUFBRSxnRkFBWSxDQUFBO0lBQUUsMEVBQVMsQ0FBQTtJQUFFLDhFQUFXLENBQUE7SUFBRSw4RUFBVyxDQUFBO0lBQzdFLHdFQUFRLENBQUE7QUFDVixDQUFDLEVBTFcsaUNBQXlCLEtBQXpCLGlDQUF5QixRQUtwQztBQUxELElBQVkseUJBQXlCLEdBQXpCLGlDQUtYLENBQUE7QUFLRCxXQUFZLGlCQUFpQjtJQUMzQiw2REFBVSxDQUFBO0lBQ1YsNkRBQVUsQ0FBQTtJ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QyxxQkFBUyxDQUFDLE1BQU0sRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO1FBRXBGLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxvQkFBUSxDQUFDLHFCQUFTLENBQUMsTUFBTSxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFDeEUsSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNyQixJQUFNLEVBQUUsR0FBcUIsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckYsS0FBSyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUNILFlBQUM7QUFBRCxDQUFDLEFBalBELENBQW1DLFdBQVcsQ0FBQyxxQkFBcUIsR0FpUG5FO0FBalBEOzBCQWlQQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBaaXAgZmlsZS1iYWNrZWQgZmlsZXN5c3RlbVxuICogSW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZDpcbiAqIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFRcbiAqXG4gKiBXaGlsZSB0aGVyZSBhcmUgYSBmZXcgemlwIGxpYnJhcmllcyBmb3IgSmF2YVNjcmlwdCAoZS5nLiBKU1ppcCBhbmQgemlwLmpzKSxcbiAqIHRoZXkgYXJlIG5vdCBhIGdvb2QgbWF0Y2ggZm9yIEJyb3dzZXJGUy4gSW4gcGFydGljdWxhciwgdGhlc2UgbGlicmFyaWVzXG4gKiBwZXJmb3JtIGEgbG90IG9mIHVubmVlZGVkIGRhdGEgY29weWluZywgYW5kIGVhZ2VybHkgZGVjb21wcmVzcyBldmVyeSBmaWxlXG4gKiBpbiB0aGUgemlwIGZpbGUgdXBvb