UNPKG

browserfs

Version:

A filesystem in your browser!

281 lines 38.9 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 file_system = require('../core/file_system'); var api_error_1 = require('../core/api_error'); var file_flag_1 = require('../core/file_flag'); var util_1 = require('../core/util'); var preload_file = require('../generic/preload_file'); var xhr = require('../generic/xhr'); var file_index_1 = require('../generic/file_index'); function tryToString(buff, encoding, cb) { try { cb(null, buff.toString(encoding)); } catch (e) { cb(e); } } var XmlHttpRequest = (function (_super) { __extends(XmlHttpRequest, _super); function XmlHttpRequest(listingUrlOrObj, prefixUrl) { if (prefixUrl === void 0) { prefixUrl = ''; } _super.call(this); if (!listingUrlOrObj) { listingUrlOrObj = 'index.json'; } if (prefixUrl.length > 0 && prefixUrl.charAt(prefixUrl.length - 1) !== '/') { prefixUrl = prefixUrl + '/'; } this.prefixUrl = prefixUrl; var listing = null; if (typeof (listingUrlOrObj) === "string") { listing = this._requestFileSync(listingUrlOrObj, 'json'); if (!listing) { throw new Error("Unable to find listing at URL: ${listingUrlOrObj}"); } } else { listing = listingUrlOrObj; } this._index = file_index_1.FileIndex.fromListing(listing); } XmlHttpRequest.prototype.empty = function () { this._index.fileIterator(function (file) { file.file_data = null; }); }; XmlHttpRequest.prototype.getXhrPath = function (filePath) { if (filePath.charAt(0) === '/') { filePath = filePath.slice(1); } return this.prefixUrl + filePath; }; XmlHttpRequest.prototype._requestFileSizeAsync = function (path, cb) { xhr.getFileSizeAsync(this.getXhrPath(path), cb); }; XmlHttpRequest.prototype._requestFileSizeSync = function (path) { return xhr.getFileSizeSync(this.getXhrPath(path)); }; XmlHttpRequest.prototype._requestFileAsync = function (p, type, cb) { xhr.asyncDownloadFile(this.getXhrPath(p), type, cb); }; XmlHttpRequest.prototype._requestFileSync = function (p, type) { return xhr.syncDownloadFile(this.getXhrPath(p), type); }; XmlHttpRequest.prototype.getName = function () { return 'XmlHttpRequest'; }; XmlHttpRequest.isAvailable = function () { return typeof XMLHttpRequest !== "undefined" && XMLHttpRequest !== null; }; XmlHttpRequest.prototype.diskSpace = function (path, cb) { cb(0, 0); }; XmlHttpRequest.prototype.isReadOnly = function () { return true; }; XmlHttpRequest.prototype.supportsLinks = function () { return false; }; XmlHttpRequest.prototype.supportsProps = function () { return false; }; XmlHttpRequest.prototype.supportsSynch = function () { return true; }; XmlHttpRequest.prototype.preloadFile = function (path, buffer) { var inode = this._index.getInode(path); if (file_index_1.isFileInode(inode)) { if (inode === null) { throw api_error_1.ApiError.ENOENT(path); } var stats = inode.getData(); stats.size = buffer.length; stats.file_data = buffer; } else { throw api_error_1.ApiError.EISDIR(path); } }; XmlHttpRequest.prototype.stat = function (path, isLstat, cb) { var inode = this._index.getInode(path); if (inode === null) { return cb(api_error_1.ApiError.ENOENT(path)); } var stats; if (file_index_1.isFileInode(inode)) { stats = inode.getData(); if (stats.size < 0) { this._requestFileSizeAsync(path, function (e, size) { if (e) { return cb(e); } stats.size = size; cb(null, stats.clone()); }); } else { cb(null, stats.clone()); } } else if (file_index_1.isDirInode(inode)) { stats = inode.getStats(); cb(null, stats); } else { cb(api_error_1.ApiError.FileError(api_error_1.ErrorCode.EINVAL, path)); } }; XmlHttpRequest.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(); if (stats.size < 0) { stats.size = this._requestFileSizeSync(path); } } else if (file_index_1.isDirInode(inode)) { stats = inode.getStats(); } else { throw api_error_1.ApiError.FileError(api_error_1.ErrorCode.EINVAL, path); } return stats; }; XmlHttpRequest.prototype.open = function (path, flags, mode, cb) { if (flags.isWriteable()) { return cb(new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, path)); } var _this = this; var inode = this._index.getInode(path); if (inode === null) { return cb(api_error_1.ApiError.ENOENT(path)); } if (file_index_1.isFileInode(inode)) { var stats = inode.getData(); switch (flags.pathExistsAction()) { case file_flag_1.ActionType.THROW_EXCEPTION: case file_flag_1.ActionType.TRUNCATE_FILE: return cb(api_error_1.ApiError.EEXIST(path)); case file_flag_1.ActionType.NOP: if (stats.file_data != null) { return cb(null, new preload_file.NoSyncFile(_this, path, flags, stats.clone(), stats.file_data)); } this._requestFileAsync(path, 'buffer', function (err, buffer) { if (err) { return cb(err); } stats.size = buffer.length; stats.file_data = buffer; return cb(null, new preload_file.NoSyncFile(_this, path, flags, stats.clone(), buffer)); }); break; default: return cb(new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid FileMode object.')); } } else { return cb(api_error_1.ApiError.EISDIR(path)); } }; XmlHttpRequest.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 === null) { throw api_error_1.ApiError.ENOENT(path); } if (file_index_1.isFileInode(inode)) { var stats = inode.getData(); 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: if (stats.file_data != null) { return new preload_file.NoSyncFile(this, path, flags, stats.clone(), stats.file_data); } var buffer = this._requestFileSync(path, 'buffer'); stats.size = buffer.length; stats.file_data = buffer; return new preload_file.NoSyncFile(this, path, flags, stats.clone(), buffer); default: throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid FileMode object.'); } } else { throw api_error_1.ApiError.EISDIR(path); } }; XmlHttpRequest.prototype.readdir = function (path, cb) { try { cb(null, this.readdirSync(path)); } catch (e) { cb(e); } }; XmlHttpRequest.prototype.readdirSync = function (path) { var inode = this._index.getInode(path); if (inode === null) { 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); } }; XmlHttpRequest.prototype.readFile = function (fname, encoding, flag, cb) { var oldCb = cb; this.open(fname, flag, 0x1a4, function (err, fd) { if (err) { return cb(err); } cb = function (err, arg) { fd.close(function (err2) { if (err == null) { err = err2; } return oldCb(err, arg); }); }; var fdCast = fd; var fdBuff = fdCast.getBuffer(); if (encoding === null) { cb(err, util_1.copyingSlice(fdBuff)); } else { tryToString(fdBuff, encoding, cb); } }); }; XmlHttpRequest.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(); } }; return XmlHttpRequest; }(file_system.BaseFileSystem)); exports.__esModule = true; exports["default"] = XmlHttpRequest; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWG1sSHR0cFJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZC9YbWxIdHRwUmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFPLFdBQVcsV0FBVyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BELDBCQUFrQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ3RELDBCQUFtQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ3ZELHFCQUEyQixjQUFjLENBQUMsQ0FBQTtBQUcxQyxJQUFPLFlBQVksV0FBVyx5QkFBeUIsQ0FBQyxDQUFDO0FBQ3pELElBQU8sR0FBRyxXQUFXLGdCQUFnQixDQUFDLENBQUM7QUFDdkMsMkJBQTZFLHVCQUF1QixDQUFDLENBQUE7QUFPckcscUJBQXFCLElBQVksRUFBRSxRQUFnQixFQUFFLEVBQXNDO0lBQ3pGLElBQUksQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUU7SUFBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztBQUNILENBQUM7QUFLRDtJQUE0QyxrQ0FBMEI7SUFVcEUsd0JBQVksZUFBZ0MsRUFBRSxTQUFzQjtRQUF0Qix5QkFBc0IsR0FBdEIsY0FBc0I7UUFDbEUsaUJBQU8sQ0FBQztRQUNSLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQixlQUFlLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzRSxTQUFTLEdB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Jy4uL2NvcmUvZmlsZV9zeXN0ZW0nKTtcbmltcG9ydCB7QXBpRXJyb3IsIEVycm9yQ29kZX0gZnJvbSAnLi4vY29yZS9hcGlfZXJyb3InO1xuaW1wb3J0IHtGaWxlRmxhZywgQWN0aW9uVHlwZX0gZnJvbSAnLi4vY29yZS9maWxlX2ZsYWcnO1xuaW1wb3J0IHtjb3B5aW5nU2xpY2V9IGZyb20gJy4uL2NvcmUvdXRpbCc7XG5pbXBvcnQgZmlsZSA9IHJlcXVpcmUoJy4uL2NvcmUvZmlsZScpO1xuaW1wb3J0IFN0YXRzIGZyb20gJy4uL2NvcmUvbm9kZV9mc19zdGF0cyc7XG5pbXBvcnQgcHJlbG9hZF9maWxlID0gcmVxdWlyZSgnLi4vZ2VuZXJpYy9wcmVsb2FkX2ZpbGUnKTtcbmltcG9ydCB4aHIgPSByZXF1aXJlKCcuLi9nZW5lcmljL3hocicpO1xuaW1wb3J0IHtGaWxlSW5kZXgsIERpcklub2RlLCBGaWxlSW5vZGUsIElub2RlLCBpc0ZpbGVJbm9kZSwgaXNEaXJJbm9kZX0gZnJvbSAnLi4vZ2VuZXJpYy9maWxlX2luZGV4JztcblxuLyoqXG4gKiBUcnkgdG8gY29udmVydCB0aGUgZ2l2ZW4gYnVmZmVyIGludG8gYSBzdHJpbmcsIGFuZCBwYXNzIGl0IHRvIHRoZSBjYWxsYmFjay5cbiAqIE9wdGltaXphdGlvbiB0aGF0IHJlbW92ZXMgdGhlIG5lZWRlZCB0cnkvY2F0Y2ggaW50byBhIGhlbHBlciBmdW5jdGlvbiwgYXNcbiAqIHRoaXMgaXMgYW4gdW5jb21tb24gY2FzZS5cbiAqL1xuZnVuY3Rpb24gdHJ5VG9TdHJpbmcoYnVmZjogQnVmZmVyLCBlbmNvZGluZzogc3RyaW5nLCBjYjogKGU6IEFwaUVycm9yLCBydj86IHN0cmluZykgPT4gdm9pZCkge1xuICB0cnkge1xuICAgIGNiKG51bGwsIGJ1ZmYudG9TdHJpbmcoZW5jb2RpbmcpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNiKGUpO1xuICB9XG59XG5cbi8qKlxuICogQSBzaW1wbGUgZmlsZXN5c3RlbSBiYWNrZWQgYnkgWG1sSHR0cFJlcXVlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBYbWxIdHRwUmVxdWVzdCBleHRlbmRzIGZpbGVfc3lzdGVtLkJhc2VGaWxlU3lzdGVtIGltcGxlbWVudHMgZmlsZV9zeXN0ZW0uRmlsZVN5c3RlbSB7XG4gIHByaXZhdGUgX2luZGV4OiBGaWxlSW5kZXg8e30+O1xuICBwdWJsaWMgcHJlZml4VXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBmaWxlIHN5c3RlbS5cbiAgICogQHBhcmFtIGxpc3RpbmdVcmxPck9iaiBpbmRleCBvYmplY3Qgb3IgdGhlIHBhdGggdG8gdGhlIEpTT04gZmlsZSBpbmRleCBnZW5lcmF0ZWQgYnlcbiAgICogICB0b29scy9YSFJJbmRleGVyLmNvZmZlZS4gVGhpcyBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd2VicGFnZSBVUkxcbiAgICogICBvciBhYnNvbHV0ZWx5IHNwZWNpZmllZC5cbiAgICogQHBhcmFtIHByZWZpeFVybCBUaGUgdXJsIHByZWZpeCB0byB1c2UgZm9yIGFsbCB3ZWItc2VydmVyIHJlcXVlc3RzLlxuICAgKi9cbiAgY29uc3RydWN0b3IobGlzdGluZ1VybE9yT2JqOiBzdHJpbmcgfCBPYmplY3QsIHByZWZpeFVybDogc3RyaW5nID0gJycpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICghbGlzdGluZ1VybE9yT2JqKSB7XG4gICAgICBsaXN0aW5nVXJsT3JPYmogPSAnaW5kZXguanNvbic7XG4gICAgfVxuICAgIC8vIHByZWZpeF91cmwgbXVzdCBlbmQgaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLlxuICAgIGlmIChwcmVmaXhVcmwubGVuZ3RoID4gMCAmJiBwcmVmaXhVcmwuY2hhckF0KHByZWZpeFVybC5sZW5ndGggLSAxKSAhPT0gJy8nKSB7XG4gICAgICBwcmVmaXhVcmwgPSBwcmVmaXhVcmwgKyAnLyc7XG4gICAgfVxuICAgIHRoaXMucHJlZml4VXJsID0gcHJlZml4VXJsO1xuXG4gICAgbGV0IGxpc3Rpbmc6IE9iamVjdCA9IG51bGw7XG4gICAgaWYgKHR5cGVvZihsaXN0aW5nVXJsT3JPYmopID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBsaXN0aW5nID0gdGhpcy5fcmVxdWVzdEZpbGVTeW5jKDxzdHJpbmc+IGxpc3RpbmdVcmxPck9iaiwgJ2pzb24nKTtcbiAgICAgIGlmICghbGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBsaXN0aW5nIGF0IFVSTDogJHtsaXN0aW5nVXJsT3JPYmp9XCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0aW5nID0gbGlzdGluZ1VybE9yT2JqO1xuICAgIH1cblxuICAgIHRoaXMuX2luZGV4ID0gRmlsZUluZGV4LmZyb21MaXN0aW5nKGxpc3RpbmcpO1xuICB9XG5cbiAgcHVibGljIGVtcHR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2luZGV4LmZpbGVJdGVyYXRvcihmdW5jdGlvbihmaWxlOiBTdGF0cykge1xuICAgICAgZmlsZS5maWxlX2RhdGEgPSBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRYaHJQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmaWxlUGF0aC5jaGFyQXQoMCkgPT09ICcvJykge1xuICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJlZml4VXJsICsgZmlsZVBhdGg7XG4gIH1cblxuICAvKipcbiAgICogT25seSByZXF1ZXN0cyB0aGUgSEVBRCBjb250ZW50LCBmb3IgdGhlIGZpbGUgc2l6ZS5cbiAgICovXG4gIHB1YmxpYyBfcmVxdWVzdEZpbGVTaXplQXN5bmMocGF0aDogc3RyaW5nLCBjYjogKGVycjogQXBpRXJyb3IsIHNpemU/OiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB4aHIuZ2V0RmlsZVNpemVBc3luYyh0aGlzLmdldFhoclBhdGgocGF0aCksIGNiKTtcbiAgfVxuICBwdWJsaWMgX3JlcXVlc3RGaWxlU2l6ZVN5bmMocGF0aDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4geGhyLmdldEZpbGVTaXplU3luYyh0aGlzLmdldFhoclBhdGgocGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IGRvd25sb2FkIHRoZSBnaXZlbiBmaWxlLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVxdWVzdEZpbGVBc3luYyhwOiBzdHJpbmcsIHR5cGU6ICdidWZmZXInLCBjYjogKGVycjogQXBpRXJyb3IsIGRhdGE/OiBOb2RlQnVmZmVyKSA9PiB2b2lkKTogdm9pZDtcbiAgcHJpdmF0ZSBfcmVxdWVzdEZpbGVBc3luYyhwOiBzdHJpbmcsIHR5cGU6ICdqc29uJywgY2I6IChlcnI6IEFwaUVycm9yLCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgcHJpdmF0ZSBfcmVxdWVzdEZpbGVBc3luYyhwOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY2I6IChlcnI6IEFwaUVycm9yLCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgcHJpdmF0ZSBfcmVxdWVzdEZpbGVBc3luYyhwOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY2I6IChlcnI6IEFwaUVycm9yLCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgeGhyLmFzeW5jRG93bmxvYWRGaWxlKHRoaXMuZ2V0WGhyUGF0aChwKSwgdHlwZSwgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgZG93bmxvYWQgdGhlIGdpdmVuIGZpbGUuXG4gICAqL1xuICBwcml2YXRlIF9yZXF1ZXN0RmlsZVN5bmMocDogc3RyaW5nLCB0eXBlOiAnYnVmZmVyJyk6IE5vZGVCdWZmZXI7XG4gIHByaXZhdGUgX3JlcXVlc3RGaWxlU3luYyhwOiBzdHJpbmcsIHR5cGU6ICdqc29uJyk6IGFueTtcbiAgcHJpdmF0ZSBfcmVxdWVzdEZpbGVTeW5jKHA6IHN0cmluZywgdHlwZTogc3RyaW5nKTogYW55O1xuICBwcml2YXRlIF9yZXF1ZXN0RmlsZVN5bmMocDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB4aHIuc3luY0Rvd25sb2FkRmlsZSh0aGlzLmdldFhoclBhdGgocCksIHR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1htbEh0dHBSZXF1ZXN0JztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgLy8gQHRvZG8gT2xkZXIgYnJvd3NlcnMgdXNlIGEgZGlmZmVyZW50IG5hbWUgZm9yIFhIUiwgaWlyYy5cbiAgICByZXR1cm4gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFhNTEh0dHBSZXF1ZXN0ICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIGRpc2tTcGFjZShwYXRoOiBzdHJpbmcsIGNiOiAodG90YWw6IG51bWJlciwgZnJlZTogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gUmVhZC1vbmx5IGZpbGUgc3lzdGVtLiBXZSBjb3VsZCBjYWxjdWxhdGUgdGhlIHRvdGFsIHNwYWNlLCBidXQgdGhhdCdzIG5vdFxuICAgIC8vIGltcG9ydGFudCByaWdodCBub3cuXG4gICAgY2IoMCwgMCk7XG4gIH1cblxuICBwdWJsaWMgaXNSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdXBwb3J0c0xpbmtzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzdXBwb3J0c1Byb3BzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzdXBwb3J0c1N5bmNoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpYWwgWEhSIGZ1bmN0aW9uOiBQcmVsb2FkIHRoZSBnaXZlbiBmaWxlIGludG8gdGhlIGluZGV4LlxuICAgKiBAcGFyYW0gW1N0cmluZ10gcGF0aFxuICAgKiBAcGFyYW0gW0Jyb3dzZXJGUy5CdWZmZXJdIGJ1ZmZlclxuICAgKi9cbiAgcHVibGljIHByZWxvYWRGaWxlKHBhdGg6IHN0cmluZywgYnVmZmVyOiBOb2RlQnVmZmVyKTogdm9pZCB7XG4gICAgdmFyIGlub2RlID0gdGhpcy5faW5kZXguZ2V0SW5vZGUocGF0aCk7XG4gICAgaWYgKGlzRmlsZUlub2RlPFN0YXRzPihpbm9kZSkpIHtcbiAgICAgIGlmIChpbm9kZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBBcGlFcnJvci5FTk9FTlQocGF0aCk7XG4gICAgICB9XG4gICAgICB2YXIgc3RhdHMgPSBpbm9kZS5nZXREYXRhKCk7XG4gICAgICBzdGF0cy5zaXplID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIHN0YXRzLmZpbGVfZGF0YSA9IGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgQXBpRXJyb3IuRUlTRElSKHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0KHBhdGg6IHN0cmluZywgaXNMc3RhdDogYm9vbGVhbiwgY2I6IChlOiBBcGlFcnJvciwgc3RhdD86IFN0YXRzKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdmFyIGlub2RlID0gdGhpcy5faW5kZXguZ2V0SW5vZGUocGF0aCk7XG4gICAgaWYgKGlub2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gY2IoQXBpRXJyb3IuRU5PRU5UKHBhdGgpKTtcbiAgICB9XG4gICAgdmFyIHN0YXRzOiBTdGF0cztcbiAgICBpZiAoaXNGaWxlSW5vZGU8U3RhdHM+KGlub2RlKSkge1xuICAgICAgc3RhdHMgPSBpbm9kZS5nZXREYXRhKCk7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCBhIG5vbi1vcGVuZWQgZmlsZSB3aWxsIHN0aWxsIGhhdmUgZGVmYXVsdCBzdGF0cyBmcm9tIHRoZSBsaXN0aW5nLlxuICAgICAgaWYgKHN0YXRzLnNpemUgPCAwKSB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RGaWxlU2l6ZUFzeW5jKHBhdGgsIGZ1bmN0aW9uKGU6IEFwaUVycm9yLCBzaXplPzogbnVtYmVyKSB7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdHMuc2l6ZSA9IHNpemU7XG4gICAgICAgICAgY2IobnVsbCwgc3RhdHMuY2xvbmUoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2IobnVsbCwgc3RhdHMuY2xvbmUoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Rpcklub2RlKGlub2RlKSkge1xuICAgICAgc3RhdHMgPSBpbm9kZS5nZXRTdGF0cygpO1xuICAgICAgY2IobnVsbCwgc3RhdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYihBcGlFcnJvci5GaWxlRXJyb3IoRXJyb3JDb2RlLkVJTlZBTCwgcGF0aCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0U3luYyhwYXRoOiBzdHJpbmcsIGlzTHN0YXQ6IGJvb2xlYW4pOiBTdGF0cyB7XG4gICAgdmFyIGlub2RlID0gdGhpcy5faW5kZXguZ2V0SW5vZGUocGF0aCk7XG4gICAgaWYgKGlub2RlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBBcGlFcnJvci5FTk9FTlQocGF0aCk7XG4gICAgfVxuICAgIHZhciBzdGF0czogU3RhdHM7XG4gICAgaWYgKGlzRmlsZUlub2RlPFN0YXRzPihpbm9kZSkpIHtcbiAgICAgIHN0YXRzID0gaW5vZGUuZ2V0RGF0YSgpO1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgYSBub24tb3BlbmVkIGZpbGUgd2lsbCBzdGlsbCBoYXZlIGRlZmF1bHQgc3RhdHMgZnJvbSB0aGUgbGlzdGluZy5cbiAgICAgIGlmIChzdGF0cy5zaXplIDwgMCkge1xuICAgICAgICBzdGF0cy5zaXplID0gdGhpcy5fcmVxdWVzdEZpbGVTaXplU3luYyhwYXRoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzRGlySW5vZGUoaW5vZGUpKSB7XG4gICAgICBzdGF0cyA9IGlub2RlLmdldFN0YXRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEFwaUVycm9yLkZpbGVFcnJvcihFcnJvckNvZGUuRUlOVkFMLCBwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRzO1xuICB9XG5cbiAgcHVibGljIG9wZW4ocGF0aDogc3RyaW5nLCBmbGFnczogRmlsZUZsYWcsIG1vZGU6IG51bWJlciwgY2I6IChlOiBBcGlFcnJvciwgZmlsZT86IGZpbGUuRmlsZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIC8vIElOVkFSSUFOVDogWW91IGNhbid0IHdyaXRlIHRvIGZpbGVzIG9uIHRoaXMgZmlsZSBzeXN0ZW0uXG4gICAgaWYgKGZsYWdzLmlzV3JpdGVhYmxlKCkpIHtcbiAgICAgIHJldHVybiBjYihuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVQRVJNLCBwYXRoKSk7XG4gICAgfVxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhdGggZXhpc3RzLCBhbmQgaXMgYSBmaWxlLlxuICAgIHZhciBpbm9kZSA9IHRoaXMuX2luZGV4LmdldElub2RlKHBhdGgpO1xuICAgIGlmIChpbm9kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNiKEFwaUVycm9yLkVOT0VOVChwYXRoKSk7XG4gICAgfVxuICAgIGlmIChpc0ZpbGVJbm9kZTxTdGF0cz4oaW5vZGUpKSB7XG4gICAgICB2YXIgc3RhdHMgPSBpbm9kZS5nZXREYXRhKCk7XG4gICAgICBzd2l0Y2ggKGZsYWdzLnBhdGhFeGlzdHNBY3Rpb24oKSkge1xuICAgICAgICBjYXNlIEFjdGlvblR5cGUuVEhST1dfRVhDRVBUSU9OOlxuICAgICAgICBjYXNlIEFjdGlvblR5cGUuVFJVTkNBVEVfRklMRTpcbiAgICAgICAgICByZXR1cm4gY2IoQXBpRXJyb3IuRUVYSVNUKHBhdGgpKTtcbiAgICAgICAgY2FzZSBBY3Rpb25UeXBlLk5PUDpcbiAgICAgICAgICAvLyBVc2UgZXhpc3RpbmcgZmlsZSBjb250ZW50cy5cbiAgICAgICAgICAvLyBYWFg6IFVoLCB0aGlzIG1haW50YWlucyB0aGUgcHJldmlvdXNseS11c2VkIGZsYWcuXG4gICAgICAgICAgaWYgKHN0YXRzLmZpbGVfZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgbmV3IHByZWxvYWRfZmlsZS5Ob1N5bmNGaWxlKF90aGlzLCBwYXRoLCBmbGFncywgc3RhdHMuY2xvbmUoKSwgc3RhdHMuZmlsZV9kYXRhKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEB0b2RvIGJlIGxhemllciBhYm91dCBhY3R1YWxseSByZXF1ZXN0aW5nIHRoZSBmaWxlXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdEZpbGVBc3luYyhwYXRoLCAnYnVmZmVyJywgZnVuY3Rpb24oZXJyOiBBcGlFcnJvciwgYnVmZmVyPzogTm9kZUJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGRvbid0IGluaXRpYWxseSBoYXZlIGZpbGUgc2l6ZXNcbiAgICAgICAgICAgIHN0YXRzLnNpemUgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgc3RhdHMuZmlsZV9kYXRhID0gYnVmZmVyO1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIG5ldyBwcmVsb2FkX2ZpbGUuTm9TeW5jRmlsZShfdGhpcywgcGF0aCwgZmxhZ3MsIHN0YXRzLmNsb25lKCksIGJ1ZmZlcikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBjYihuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVJTlZBTCwgJ0ludmFsaWQgRmlsZU1vZGUgb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNiKEFwaUVycm9yLkVJU0RJUihwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5TeW5jKHBhdGg6IHN0cmluZywgZmxhZ3M6IEZpbGVGbGFnLCBtb2RlOiBudW1iZXIpOiBmaWxlLkZpbGUge1xuICAgIC8vIElOVkFSSUFOVDogWW91IGNhbid0IHdyaXRlIHRvIGZpbGVzIG9uIHRoaXMgZmlsZSBzeXN0ZW0uXG4gICAgaWYgKGZsYWdzLmlzV3JpdGVhYmxlKCkpIHtcbiAgICAgIHRocm93IG5ldyBBcGlFcnJvcihFcnJvckNvZGUuRVBFUk0sIHBhdGgpO1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBleGlzdHMsIGFuZCBpcyBhIGZpbGUuXG4gICAgdmFyIGlub2RlID0gdGhpcy5faW5kZXguZ2V0SW5vZGUocGF0aCk7XG4gICAgaWYgKGlub2RlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBBcGlFcnJvci5FTk9FTlQocGF0aCk7XG4gICAgfVxuICAgIGlmIChpc0ZpbGVJbm9kZTxTdGF0cz4oaW5vZGUpKSB7XG4gICAgICB2YXIgc3RhdHMgPSBpbm9kZS5nZXREYXRhKCk7XG4gICAgICBzd2l0Y2ggKGZsYWdzLnBhdGhFeGlzdHNBY3Rpb24oKSkge1xuICAgICAgICBjYXNlIEFjdGlvblR5cGUuVEhST1dfRVhDRVBUSU9OOlxuICAgICAgICBjYXNlIEFjdGlvblR5cGUuVFJVTkNBVEVfRklMRTpcbiAgICAgICAgICB0aHJvdyBBcGlFcnJvci5FRVhJU1QocGF0aCk7XG4gICAgICAgIGNhc2UgQWN0aW9uVHlwZS5OT1A6XG4gICAgICAgICAgLy8gVXNlIGV4aXN0aW5nIGZpbGUgY29udGVudHMuXG4gICAgICAgICAgLy8gWFhYOiBVaCwgdGhpcyBtYWludGFpbnMgdGhlIHByZXZpb3VzbHktdXNlZCBmbGFnLlxuICAgICAgICAgIGlmIChzdGF0cy5maWxlX2RhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBwcmVsb2FkX2ZpbGUuTm9TeW5jRmlsZSh0aGlzLCBwYXRoLCBmbGFncywgc3RhdHMuY2xvbmUoKSwgc3RhdHMuZmlsZV9kYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQHRvZG8gYmUgbGF6aWVyIGFib3V0IGFjdHVhbGx5IHJlcXVlc3RpbmcgdGhlIGZpbGVcbiAgICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5fcmVxdWVzdEZpbGVTeW5jKHBhdGgsICdidWZmZXInKTtcbiAgICAgICAgICAvLyB3ZSBkb24ndCBpbml0aWFsbHkgaGF2ZSBmaWxlIHNpemVzXG4gICAgICAgICAgc3RhdHMuc2l6ZSA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgc3RhdHMuZmlsZV9kYXRhID0gYnVmZmVyO1xuICAgICAgICAgIHJldHVybiBuZXcgcHJlbG9hZF9maWxlLk5vU3luY0ZpbGUodGhpcywgcGF0aCwgZmxhZ3MsIHN0YXRzLmNsb25lKCksIGJ1ZmZlcik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKEVycm9yQ29kZS5FSU5WQUwsICdJbnZhbGlkIEZpbGVNb2RlIG9iamVjdC4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgQXBpRXJyb3IuRUlTRElSKHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWFkZGlyKHBhdGg6IHN0cmluZywgY2I6IChlOiBBcGlFcnJvciwgbGlzdGluZz86IHN0cmluZ1tdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNiKG51bGwsIHRoaXMucmVhZGRpclN5bmMocGF0aCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNiKGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWFkZGlyU3luYyhwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgLy8gQ2hlY2sgaWYgaXQgZXhpc3RzLlxuICAgIHZhciBpbm9kZSA9IHRoaXMuX2luZGV4LmdldElub2RlKHBhdGgpO1xuICAgIGlmIChpbm9kZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgQXBpRXJyb3IuRU5PRU5UKHBhdGgpO1xuICAgIH0gZWxzZSBpZiAoaXNEaXJJbm9kZShpbm9kZSkpIHtcbiAgICAgIHJldHVybiBpbm9kZS5nZXRMaXN0aW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEFwaUVycm9yLkVOT1RESVIocGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdlIGhhdmUgdGhlIGVudGlyZSBmaWxlIGFzIGEgYnVmZmVyOyBvcHRpbWl6ZSByZWFkRmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkRmlsZShmbmFtZTogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nLCBmbGFnOiBGaWxlRmxhZywgY2I6IChlcnI6IEFwaUVycm9yLCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gV3JhcCBjYiBpbiBmaWxlIGNsb3NpbmcgY29kZS5cbiAgICB2YXIgb2xkQ2IgPSBjYjtcbiAgICAvLyBHZXQgZmlsZS5cbiAgICB0aGlzLm9wZW4oZm5hbWUsIGZsYWcsIDB4MWE0LCBmdW5jdGlvbihlcnI6IEFwaUVycm9yLCBmZD86IGZpbGUuRmlsZSkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgIH1cbiAgICAgIGNiID0gZnVuY3Rpb24oZXJyOiBBcGlFcnJvciwgYXJnPzogQnVmZmVyKSB7XG4gICAgICAgIGZkLmNsb3NlKGZ1bmN0aW9uKGVycjI6IGFueSkge1xuICAgICAgICAgIGlmIChlcnIgPT0gbnVsbCkge1xuICAgICAgICAgICAgZXJyID0gZXJyMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9sZENiKGVyciwgYXJnKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdmFyIGZkQ2FzdCA9IDxwcmVsb2FkX2ZpbGUuTm9TeW5jRmlsZTxYbWxIdHRwUmVxdWVzdD4+IGZkO1xuICAgICAgdmFyIGZkQnVmZiA9IDxCdWZmZXI+IGZkQ2FzdC5nZXRCdWZmZXIoKTtcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gbnVsbCkge1xuICAgICAgICBjYihlcnIsIGNvcHlpbmdTbGljZShmZEJ1ZmYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeVRvU3RyaW5nKGZkQnVmZiwgZW5jb2RpbmcsIGNiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWFsbHktb3B0aW1pemVkIHJlYWRmaWxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRGaWxlU3luYyhmbmFtZTogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nLCBmbGFnOiBGaWxlRmxhZyk6IGFueSB7XG4gICAgLy8gR2V0IGZpbGUuXG4gICAgdmFyIGZkID0gdGhpcy5vcGVuU3luYyhmbmFtZSwgZmxhZywgMHgxYTQpO1xuICAgIHRyeSB7XG4gICAgICB2YXIgZmRDYXN0ID0gPHByZWxvYWRfZmlsZS5Ob1N5bmNGaWxlPFhtbEh0dHBSZXF1ZXN0Pj4gZmQ7XG4gICAgICB2YXIgZmRCdWZmID0gPEJ1ZmZlcj4gZmRDYXN0LmdldEJ1ZmZlcigpO1xuICAgICAgaWYgKGVuY29kaW5nID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjb3B5aW5nU2xpY2UoZmRCdWZmKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZEJ1ZmYudG9TdHJpbmcoZW5jb2RpbmcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBmZC5jbG9zZVN5bmMoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==