ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
575 lines • 45.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { FakeTexture } from "./Texture";
import { TextureAtlas } from "./TextureAtlas";
var AssetManager = /** @class */ (function () {
function AssetManager(textureLoader, pathPrefix) {
if (pathPrefix === void 0) { pathPrefix = ""; }
this.assets = {};
this.errors = {};
this.toLoad = 0;
this.loaded = 0;
this.textureLoader = textureLoader;
this.pathPrefix = pathPrefix;
}
/**
* @private
* @param {?} url
* @param {?} success
* @param {?} error
* @return {?}
*/
AssetManager.downloadText = /**
* @private
* @param {?} url
* @param {?} success
* @param {?} error
* @return {?}
*/
function (url, success, error) {
/** @type {?} */
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.onload = (/**
* @return {?}
*/
function () {
if (request.status == 200) {
success(request.responseText);
}
else {
error(request.status, request.responseText);
}
});
request.onerror = (/**
* @return {?}
*/
function () {
error(request.status, request.responseText);
});
request.send();
};
/**
* @private
* @param {?} url
* @param {?} success
* @param {?} error
* @return {?}
*/
AssetManager.downloadBinary = /**
* @private
* @param {?} url
* @param {?} success
* @param {?} error
* @return {?}
*/
function (url, success, error) {
/** @type {?} */
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = "arraybuffer";
request.onload = (/**
* @return {?}
*/
function () {
if (request.status == 200) {
success(new Uint8Array((/** @type {?} */ (request.response))));
}
else {
error(request.status, request.responseText);
}
});
request.onerror = (/**
* @return {?}
*/
function () {
error(request.status, request.responseText);
});
request.send();
};
/**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
AssetManager.prototype.loadBinary = /**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
function (path, success, error) {
var _this = this;
if (success === void 0) { success = null; }
if (error === void 0) { error = null; }
path = this.pathPrefix + path;
this.toLoad++;
AssetManager.downloadBinary(path, (/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.assets[path] = data;
if (success)
success(path, data);
_this.toLoad--;
_this.loaded++;
}), (/**
* @param {?} state
* @param {?} responseText
* @return {?}
*/
function (state, responseText) {
_this.errors[path] = "Couldn't load binary " + path + ": status " + status + ", " + responseText;
if (error)
error(path, "Couldn't load binary " + path + ": status " + status + ", " + responseText);
_this.toLoad--;
_this.loaded++;
}));
};
/**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
AssetManager.prototype.loadText = /**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
function (path, success, error) {
var _this = this;
if (success === void 0) { success = null; }
if (error === void 0) { error = null; }
path = this.pathPrefix + path;
this.toLoad++;
AssetManager.downloadText(path, (/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.assets[path] = data;
if (success)
success(path, data);
_this.toLoad--;
_this.loaded++;
}), (/**
* @param {?} state
* @param {?} responseText
* @return {?}
*/
function (state, responseText) {
_this.errors[path] = "Couldn't load text " + path + ": status " + status + ", " + responseText;
if (error)
error(path, "Couldn't load text " + path + ": status " + status + ", " + responseText);
_this.toLoad--;
_this.loaded++;
}));
};
/**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
AssetManager.prototype.loadTexture = /**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
function (path, success, error) {
var _this = this;
if (success === void 0) { success = null; }
if (error === void 0) { error = null; }
path = this.pathPrefix + path;
this.toLoad++;
/** @type {?} */
var img = new Image();
img.crossOrigin = "anonymous";
img.onload = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
/** @type {?} */
var texture = _this.textureLoader(img);
_this.assets[path] = texture;
_this.toLoad--;
_this.loaded++;
if (success)
success(path, img);
});
img.onerror = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
_this.errors[path] = "Couldn't load image " + path;
_this.toLoad--;
_this.loaded++;
if (error)
error(path, "Couldn't load image " + path);
});
img.src = path;
};
/**
* @param {?} path
* @param {?} data
* @param {?=} success
* @param {?=} error
* @return {?}
*/
AssetManager.prototype.loadTextureData = /**
* @param {?} path
* @param {?} data
* @param {?=} success
* @param {?=} error
* @return {?}
*/
function (path, data, success, error) {
var _this = this;
if (success === void 0) { success = null; }
if (error === void 0) { error = null; }
path = this.pathPrefix + path;
this.toLoad++;
/** @type {?} */
var img = new Image();
img.onload = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
/** @type {?} */
var texture = _this.textureLoader(img);
_this.assets[path] = texture;
_this.toLoad--;
_this.loaded++;
if (success)
success(path, img);
});
img.onerror = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
_this.errors[path] = "Couldn't load image " + path;
_this.toLoad--;
_this.loaded++;
if (error)
error(path, "Couldn't load image " + path);
});
img.src = data;
};
/**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
AssetManager.prototype.loadTextureAtlas = /**
* @param {?} path
* @param {?=} success
* @param {?=} error
* @return {?}
*/
function (path, success, error) {
var _this = this;
if (success === void 0) { success = null; }
if (error === void 0) { error = null; }
/** @type {?} */
var parent = path.lastIndexOf("/") >= 0
? path.substring(0, path.lastIndexOf("/"))
: "";
path = this.pathPrefix + path;
this.toLoad++;
AssetManager.downloadText(path, (/**
* @param {?} atlasData
* @return {?}
*/
function (atlasData) {
var e_1, _a;
/** @type {?} */
var pagesLoaded = { count: 0 };
/** @type {?} */
var atlasPages = new Array();
try {
/** @type {?} */
var atlas = new TextureAtlas(atlasData, (/**
* @param {?} path
* @return {?}
*/
function (path) {
atlasPages.push(parent + "/" + path);
/** @type {?} */
var image = (/** @type {?} */ (document.createElement("img")));
image.width = 16;
image.height = 16;
return new FakeTexture(image);
}));
}
catch (e) {
/** @type {?} */
var ex = (/** @type {?} */ (e));
_this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message;
if (error)
error(path, "Couldn't load texture atlas " + path + ": " + ex.message);
_this.toLoad--;
_this.loaded++;
return;
}
var _loop_1 = function (atlasPage) {
/** @type {?} */
var pageLoadError = false;
_this.loadTexture(atlasPage, (/**
* @param {?} imagePath
* @param {?} image
* @return {?}
*/
function (imagePath, image) {
pagesLoaded.count++;
if (pagesLoaded.count == atlasPages.length) {
if (!pageLoadError) {
try {
/** @type {?} */
var atlas = new TextureAtlas(atlasData, (/**
* @param {?} path
* @return {?}
*/
function (path) {
return _this.get(parent + "/" + path);
}));
_this.assets[path] = atlas;
if (success)
success(path, atlas);
_this.toLoad--;
_this.loaded++;
}
catch (e) {
/** @type {?} */
var ex = (/** @type {?} */ (e));
_this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message;
if (error)
error(path, "Couldn't load texture atlas " + path + ": " + ex.message);
_this.toLoad--;
_this.loaded++;
}
}
else {
_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
if (error)
error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
_this.toLoad--;
_this.loaded++;
}
}
}), (/**
* @param {?} imagePath
* @param {?} errorMessage
* @return {?}
*/
function (imagePath, errorMessage) {
pageLoadError = true;
pagesLoaded.count++;
if (pagesLoaded.count == atlasPages.length) {
_this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path;
if (error)
error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path);
_this.toLoad--;
_this.loaded++;
}
}));
};
try {
for (var atlasPages_1 = tslib_1.__values(atlasPages), atlasPages_1_1 = atlasPages_1.next(); !atlasPages_1_1.done; atlasPages_1_1 = atlasPages_1.next()) {
var atlasPage = atlasPages_1_1.value;
_loop_1(atlasPage);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (atlasPages_1_1 && !atlasPages_1_1.done && (_a = atlasPages_1.return)) _a.call(atlasPages_1);
}
finally { if (e_1) throw e_1.error; }
}
}), (/**
* @param {?} state
* @param {?} responseText
* @return {?}
*/
function (state, responseText) {
_this.errors[path] = "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText;
if (error)
error(path, "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText);
_this.toLoad--;
_this.loaded++;
}));
};
/**
* @param {?} path
* @return {?}
*/
AssetManager.prototype.get = /**
* @param {?} path
* @return {?}
*/
function (path) {
path = this.pathPrefix + path;
return this.assets[path];
};
/**
* @param {?} path
* @return {?}
*/
AssetManager.prototype.remove = /**
* @param {?} path
* @return {?}
*/
function (path) {
path = this.pathPrefix + path;
/** @type {?} */
var asset = this.assets[path];
if (((/** @type {?} */ (asset))).dispose)
((/** @type {?} */ (asset))).dispose();
this.assets[path] = null;
};
/**
* @return {?}
*/
AssetManager.prototype.removeAll = /**
* @return {?}
*/
function () {
for (var key in this.assets) {
/** @type {?} */
var asset = this.assets[key];
if (((/** @type {?} */ (asset))).dispose)
((/** @type {?} */ (asset))).dispose();
}
this.assets = {};
};
/**
* @return {?}
*/
AssetManager.prototype.isLoadingComplete = /**
* @return {?}
*/
function () {
return this.toLoad == 0;
};
/**
* @return {?}
*/
AssetManager.prototype.getToLoad = /**
* @return {?}
*/
function () {
return this.toLoad;
};
/**
* @return {?}
*/
AssetManager.prototype.getLoaded = /**
* @return {?}
*/
function () {
return this.loaded;
};
/**
* @return {?}
*/
AssetManager.prototype.dispose = /**
* @return {?}
*/
function () {
this.removeAll();
};
/**
* @return {?}
*/
AssetManager.prototype.hasErrors = /**
* @return {?}
*/
function () {
return Object.keys(this.errors).length > 0;
};
/**
* @return {?}
*/
AssetManager.prototype.getErrors = /**
* @return {?}
*/
function () {
return this.errors;
};
return AssetManager;
}());
export { AssetManager };
if (false) {
/**
* @type {?}
* @private
*/
AssetManager.prototype.pathPrefix;
/**
* @type {?}
* @private
*/
AssetManager.prototype.textureLoader;
/**
* @type {?}
* @private
*/
AssetManager.prototype.assets;
/**
* @type {?}
* @private
*/
AssetManager.prototype.errors;
/**
* @type {?}
* @private
*/
AssetManager.prototype.toLoad;
/**
* @type {?}
* @private
*/
AssetManager.prototype.loaded;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNzZXRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvQXNzZXRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QztJQU9FLHNCQUNFLGFBQStDLEVBQy9DLFVBQXVCO1FBQXZCLDJCQUFBLEVBQUEsZUFBdUI7UUFOakIsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixXQUFNLEdBQWdCLEVBQUUsQ0FBQztRQUN6QixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUtqQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDOzs7Ozs7OztJQUNjLHlCQUFZOzs7Ozs7O0lBQTNCLFVBQ0UsR0FBVyxFQUNYLE9BQStCLEVBQy9CLEtBQXFEOztZQUVqRCxPQUFPLEdBQUcsSUFBSSxjQUFjLEVBQUU7UUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxNQUFNOzs7UUFBRztZQUNmLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDL0I7aUJBQU07Z0JBQ0wsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxDQUFBLENBQUM7UUFDRixPQUFPLENBQUMsT0FBTzs7O1FBQUc7WUFDaEIs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QUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDNUIsSUFBSSxDQUFDLG1CQUFLLEtBQUssRUFBQSxDQUFDLENBQUMsT0FBTztnQkFBRSxDQUFDLG1CQUFLLEtBQUssRUFBQSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDOzs7O0lBQ0Qsd0NBQWlCOzs7SUFBakI7UUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7Ozs7SUFDRCxnQ0FBUzs7O0lBQVQ7UUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQzs7OztJQUNELGdDQUFTOzs7SUFBVDtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7O0lBQ0QsOEJBQU87OztJQUFQO1FBQ0UsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7Ozs7SUFDRCxnQ0FBUzs7O0lBQVQ7UUFDRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7OztJQUNELGdDQUFTOzs7SUFBVDtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBalRELElBaVRDOzs7Ozs7O0lBaFRDLGtDQUEyQjs7Ozs7SUFDM0IscUNBQXdEOzs7OztJQUN4RCw4QkFBOEI7Ozs7O0lBQzlCLDhCQUFpQzs7Ozs7SUFDakMsOEJBQW1COzs7OztJQUNuQiw4QkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IE1hcCwgRGlzcG9zYWJsZSB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbmltcG9ydCB7IEZha2VUZXh0dXJlIH0gZnJvbSBcIi4vVGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tIFwiLi9UZXh0dXJlQXRsYXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBc3NldE1hbmFnZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcclxuICBwcml2YXRlIHBhdGhQcmVmaXg6IHN0cmluZztcclxuICBwcml2YXRlIHRleHR1cmVMb2FkZXI6IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4gYW55O1xyXG4gIHByaXZhdGUgYXNzZXRzOiBNYXA8YW55PiA9IHt9O1xyXG4gIHByaXZhdGUgZXJyb3JzOiBNYXA8c3RyaW5nPiA9IHt9O1xyXG4gIHByaXZhdGUgdG9Mb2FkID0gMDtcclxuICBwcml2YXRlIGxvYWRlZCA9IDA7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0ZXh0dXJlTG9hZGVyOiAoaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IGFueSxcclxuICAgIHBhdGhQcmVmaXg6IHN0cmluZyA9IFwiXCJcclxuICApIHtcclxuICAgIHRoaXMudGV4dHVyZUxvYWRlciA9IHRleHR1cmVMb2FkZXI7XHJcbiAgICB0aGlzLnBhdGhQcmVmaXggPSBwYXRoUHJlZml4O1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBkb3dubG9hZFRleHQoXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIHN1Y2Nlc3M6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQsXHJcbiAgICBlcnJvcjogKHN0YXR1czogbnVtYmVyLCByZXNwb25zZVRleHQ6IHN0cmluZykgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xyXG4gICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICBzdWNjZXNzKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBlcnJvcihyZXF1ZXN0LnN0YXR1cywgcmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICBlcnJvcihyZXF1ZXN0LnN0YXR1cywgcmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG4gICAgfTtcclxuICAgIHJlcXVlc3Quc2VuZCgpO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyBkb3dubG9hZEJpbmFyeShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQsXHJcbiAgICBlcnJvcjogKHN0YXR1czogbnVtYmVyLCByZXNwb25zZVRleHQ6IHN0cmluZykgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xyXG4gICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XHJcbiAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgIHN1Y2Nlc3MobmV3IFVpbnQ4QXJyYXkocmVxdWVzdC5yZXNwb25zZSBhcyBBcnJheUJ1ZmZlcikpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGVycm9yKHJlcXVlc3Quc3RhdHVzLCByZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgIGVycm9yKHJlcXVlc3Quc3RhdHVzLCByZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICB9O1xyXG4gICAgcmVxdWVzdC5zZW5kKCk7XHJcbiAgfVxyXG4gIGxvYWRCaW5hcnkoXHJcbiAgICBwYXRoOiBzdHJpbmcsXHJcbiAgICBzdWNjZXNzOiAocGF0aDogc3RyaW5nLCBiaW5hcnk6IFVpbnQ4QXJyYXkpID0+IHZvaWQgPSBudWxsLFxyXG4gICAgZXJyb3I6IChwYXRoOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsXHJcbiAgKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBBc3NldE1hbmFnZXIuZG93bmxvYWRCaW5hcnkoXHJcbiAgICAgIHBhdGgsXHJcbiAgICAgIChkYXRhOiBVaW50OEFycmF5KTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5hc3NldHNbcGF0aF0gPSBkYXRhO1xyXG4gICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKHBhdGgsIGRhdGEpO1xyXG4gICAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgfSxcclxuICAgICAgKHN0YXRlOiBudW1iZXIsIHJlc3BvbnNlVGV4dDogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICBwYXRoXHJcbiAgICAgICAgXSA9IGBDb3VsZG4ndCBsb2FkIGJpbmFyeSAke3BhdGh9OiBzdGF0dXMgJHtzdGF0dXN9LCAke3Jlc3BvbnNlVGV4dH1gO1xyXG4gICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgIGVycm9yKFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCBiaW5hcnkgJHtwYXRofTogc3RhdHVzICR7c3RhdHVzfSwgJHtyZXNwb25zZVRleHR9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGxvYWRUZXh0KFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgdGV4dDogc3RyaW5nKSA9PiB2b2lkID0gbnVsbCxcclxuICAgIGVycm9yOiAocGF0aDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkID0gbnVsbFxyXG4gICkge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICB0aGlzLnRvTG9hZCsrO1xyXG4gICAgQXNzZXRNYW5hZ2VyLmRvd25sb2FkVGV4dChcclxuICAgICAgcGF0aCxcclxuICAgICAgKGRhdGE6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuYXNzZXRzW3BhdGhdID0gZGF0YTtcclxuICAgICAgICBpZiAoc3VjY2Vzcykgc3VjY2VzcyhwYXRoLCBkYXRhKTtcclxuICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIH0sXHJcbiAgICAgIChzdGF0ZTogbnVtYmVyLCByZXNwb25zZVRleHQ6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuZXJyb3JzW1xyXG4gICAgICAgICAgcGF0aFxyXG4gICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0ICR7cGF0aH06IHN0YXR1cyAke3N0YXR1c30sICR7cmVzcG9uc2VUZXh0fWA7XHJcbiAgICAgICAgaWYgKGVycm9yKVxyXG4gICAgICAgICAgZXJyb3IoXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgIGBDb3VsZG4ndCBsb2FkIHRleHQgJHtwYXRofTogc3RhdHVzICR7c3RhdHVzfSwgJHtyZXNwb25zZVRleHR9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGxvYWRUZXh0dXJlKFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHZvaWQgPSBudWxsLFxyXG4gICAgZXJyb3I6IChwYXRoOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsXHJcbiAgKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcuY3Jvc3NPcmlnaW4gPSBcImFub255bW91c1wiO1xyXG4gICAgaW1nLm9ubG9hZCA9IGV2ID0+IHtcclxuICAgICAgbGV0IHRleHR1cmUgPSB0aGlzLnRleHR1cmVMb2FkZXIoaW1nKTtcclxuICAgICAgdGhpcy5hc3NldHNbcGF0aF0gPSB0ZXh0dXJlO1xyXG4gICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICB0aGlzLmxvYWRlZCsrO1xyXG4gICAgICBpZiAoc3VjY2Vzcykgc3VjY2VzcyhwYXRoLCBpbWcpO1xyXG4gICAgfTtcclxuICAgIGltZy5vbmVycm9yID0gZXYgPT4ge1xyXG4gICAgICB0aGlzLmVycm9yc1twYXRoXSA9IGBDb3VsZG4ndCBsb2FkIGltYWdlICR7cGF0aH1gO1xyXG4gICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICB0aGlzLmxvYWRlZCsrO1xyXG4gICAgICBpZiAoZXJyb3IpIGVycm9yKHBhdGgsIGBDb3VsZG4ndCBsb2FkIGltYWdlICR7cGF0aH1gKTtcclxuICAgIH07XHJcbiAgICBpbWcuc3JjID0gcGF0aDtcclxuICB9XHJcbiAgbG9hZFRleHR1cmVEYXRhKFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgZGF0YTogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHZvaWQgPSBudWxsLFxyXG4gICAgZXJyb3I6IChwYXRoOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsXHJcbiAgKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcub25sb2FkID0gZXYgPT4ge1xyXG4gICAgICBsZXQgdGV4dHVyZSA9IHRoaXMudGV4dHVyZUxvYWRlcihpbWcpO1xyXG4gICAgICB0aGlzLmFzc2V0c1twYXRoXSA9IHRleHR1cmU7XHJcbiAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKHBhdGgsIGltZyk7XHJcbiAgICB9O1xyXG4gICAgaW1nLm9uZXJyb3IgPSBldiA9PiB7XHJcbiAgICAgIHRoaXMuZXJyb3JzW3BhdGhdID0gYENvdWxkbid0IGxvYWQgaW1hZ2UgJHtwYXRofWA7XHJcbiAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgIGlmIChlcnJvcikgZXJyb3IocGF0aCwgYENvdWxkbid0IGxvYWQgaW1hZ2UgJHtwYXRofWApO1xyXG4gICAgfTtcclxuICAgIGltZy5zcmMgPSBkYXRhO1xyXG4gIH1cclxuICBsb2FkVGV4dHVyZUF0bGFzKFxyXG4gICAgcGF0aDogc3RyaW5nLFxyXG4gICAgc3VjY2VzczogKHBhdGg6IHN0cmluZywgYXRsYXM6IFRleHR1cmVBdGxhcykgPT4gdm9pZCA9IG51bGwsXHJcbiAgICBlcnJvcjogKHBhdGg6IHN0cmluZywgZXJyb3I6IHN0cmluZykgPT4gdm9pZCA9IG51bGxcclxuICApIHtcclxuICAgIGxldCBwYXJlbnQgPVxyXG4gICAgICBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA+PSAwXHJcbiAgICAgICAgPyBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSlcclxuICAgICAgICA6IFwiXCI7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHRoaXMudG9Mb2FkKys7XHJcbiAgICBBc3NldE1hbmFnZXIuZG93bmxvYWRUZXh0KFxyXG4gICAgICBwYXRoLFxyXG4gICAgICAoYXRsYXNEYXRhOiBzdHJpbmcpOiB2b2lkID0+IHtcclxuICAgICAgICBsZXQgcGFnZXNMb2FkZWQ6IGFueSA9IHsgY291bnQ6IDAgfTtcclxuICAgICAgICBsZXQgYXRsYXNQYWdlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGxldCBhdGxhcyA9IG5ldyBUZXh0dXJlQXRsYXMoYXRsYXNEYXRhLCAocGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGF0bGFzUGFnZXMucHVzaChwYXJlbnQgKyBcIi9cIiArIHBhdGgpO1xyXG4gICAgICAgICAgICBsZXQgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGltYWdlLndpZHRoID0gMTY7XHJcbiAgICAgICAgICAgIGltYWdlLmhlaWdodCA9IDE2O1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZha2VUZXh0dXJlKGltYWdlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGxldCBleCA9IGUgYXMgRXJyb3I7XHJcbiAgICAgICAgICB0aGlzLmVycm9yc1tcclxuICAgICAgICAgICAgcGF0aFxyXG4gICAgICAgICAgXSA9IGBDb3VsZG4ndCBsb2FkIHRleHR1cmUgYXRsYXMgJHtwYXRofTogJHtleC5tZXNzYWdlfWA7XHJcbiAgICAgICAgICBpZiAoZXJyb3IpXHJcbiAgICAgICAgICAgIGVycm9yKHBhdGgsIGBDb3VsZG4ndCBsb2FkIHRleHR1cmUgYXRsYXMgJHtwYXRofTogJHtleC5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgdGhpcy50b0xvYWQtLTtcclxuICAgICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGF0bGFzUGFnZSBvZiBhdGxhc1BhZ2VzKSB7XHJcbiAgICAgICAgICBsZXQgcGFnZUxvYWRFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5sb2FkVGV4dHVyZShcclxuICAgICAgICAgICAgYXRsYXNQYWdlLFxyXG4gICAgICAgICAgICAoaW1hZ2VQYXRoOiBzdHJpbmcsIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgcGFnZXNMb2FkZWQuY291bnQrKztcclxuICAgICAgICAgICAgICBpZiAocGFnZXNMb2FkZWQuY291bnQgPT0gYXRsYXNQYWdlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcGFnZUxvYWRFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhdGxhcyA9IG5ldyBUZXh0dXJlQXRsYXMoYXRsYXNEYXRhLCAocGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQocGFyZW50ICsgXCIvXCIgKyBwYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2V0c1twYXRoXSA9IGF0bGFzO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSBzdWNjZXNzKHBhdGgsIGF0bGFzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkKys7XHJcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXggPSBlIGFzIEVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzW1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzICR7cGF0aH06ICR7ZXgubWVzc2FnZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzICR7cGF0aH06ICR7ZXgubWVzc2FnZX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9Mb2FkLS07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aFxyXG4gICAgICAgICAgICAgICAgICBdID0gYENvdWxkbid0IGxvYWQgdGV4dHVyZSBhdGxhcyBwYWdlICR7aW1hZ2VQYXRofX0gb2YgYXRsYXMgJHtwYXRofWA7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzIHBhZ2UgJHtpbWFnZVBhdGh9IG9mIGF0bGFzICR7cGF0aH1gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy50b0xvYWQtLTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChpbWFnZVBhdGg6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBwYWdlTG9hZEVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBwYWdlc0xvYWRlZC5jb3VudCsrO1xyXG4gICAgICAgICAgICAgIGlmIChwYWdlc0xvYWRlZC5jb3VudCA9PSBhdGxhc1BhZ2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICAgICAgICAgIHBhdGhcclxuICAgICAgICAgICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzIHBhZ2UgJHtpbWFnZVBhdGh9fSBvZiBhdGxhcyAke3BhdGh9YDtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgICAgICAgICAgZXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzIHBhZ2UgJHtpbWFnZVBhdGh9IG9mIGF0bGFzICR7cGF0aH1gXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvTG9hZC0tO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQrKztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoc3RhdGU6IG51bWJlciwgcmVzcG9uc2VUZXh0OiBzdHJpbmcpOiB2b2lkID0+IHtcclxuICAgICAgICB0aGlzLmVycm9yc1tcclxuICAgICAgICAgIHBhdGhcclxuICAgICAgICBdID0gYENvdWxkbid0IGxvYWQgdGV4dHVyZSBhdGxhcyAke3BhdGh9OiBzdGF0dXMgJHtzdGF0dXN9LCAke3Jlc3BvbnNlVGV4dH1gO1xyXG4gICAgICAgIGlmIChlcnJvcilcclxuICAgICAgICAgIGVycm9yKFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICBgQ291bGRuJ3QgbG9hZCB0ZXh0dXJlIGF0bGFzICR7cGF0aH06IHN0YXR1cyAke3N0YXR1c30sICR7cmVzcG9uc2VUZXh0fWBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgdGhpcy50b0xvYWQtLTtcclxuICAgICAgICB0aGlzLmxvYWRlZCsrO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICBnZXQocGF0aDogc3RyaW5nKSB7XHJcbiAgICBwYXRoID0gdGhpcy5wYXRoUHJlZml4ICsgcGF0aDtcclxuICAgIHJldHVybiB0aGlzLmFzc2V0c1twYXRoXTtcclxuICB9XHJcbiAgcmVtb3ZlKHBhdGg6IHN0cmluZykge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICBsZXQgYXNzZXQgPSB0aGlzLmFzc2V0c1twYXRoXTtcclxuICAgIGlmICgoPGFueT5hc3NldCkuZGlzcG9zZSkgKDxhbnk+YXNzZXQpLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuYXNzZXRzW3BhdGhdID0gbnVsbDtcclxuICB9XHJcbiAgcmVtb3ZlQWxsKCkge1xyXG4gICAgZm9yIChsZXQga2V5IGluIHRoaXMuYXNzZXRzKSB7XHJcbiAgICAgIGxldCBhc3NldCA9IHRoaXMuYXNzZXRzW2tleV07XHJcbiAgICAgIGlmICgoPGFueT5hc3NldCkuZGlzcG9zZSkgKDxhbnk+YXNzZXQpLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXNzZXRzID0ge307XHJcbiAgfVxyXG4gIGlzTG9hZGluZ0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudG9Mb2FkID09IDA7XHJcbiAgfVxyXG4gIGdldFRvTG9hZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG9Mb2FkO1xyXG4gIH1cclxuICBnZXRMb2FkZWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlZDtcclxuICB9XHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMucmVtb3ZlQWxsKCk7XHJcbiAgfVxyXG4gIGhhc0Vycm9ycygpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmVycm9ycykubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgZ2V0RXJyb3JzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzO1xyXG4gIH1cclxufVxyXG4iXX0=