ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
293 lines • 24.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* 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.
*****************************************************************************/
class Assets {
/**
* @param {?} clientId
*/
constructor(clientId) {
this.toLoad = new Array();
this.assets = {};
this.clientId = clientId;
}
/**
* @return {?}
*/
loaded() {
/** @type {?} */
let i = 0;
for (let v in this.assets)
i++;
return i;
}
}
if (false) {
/** @type {?} */
Assets.prototype.clientId;
/** @type {?} */
Assets.prototype.toLoad;
/** @type {?} */
Assets.prototype.assets;
/** @type {?} */
Assets.prototype.textureLoader;
}
export class SharedAssetManager {
/**
* @param {?=} pathPrefix
*/
constructor(pathPrefix = "") {
this.clientAssets = {};
this.queuedAssets = {};
this.rawAssets = {};
this.errors = {};
this.pathPrefix = pathPrefix;
}
/**
* @private
* @param {?} clientId
* @param {?} textureLoader
* @param {?} path
* @return {?}
*/
queueAsset(clientId, textureLoader, path) {
/** @type {?} */
let clientAssets = this.clientAssets[clientId];
if (clientAssets === null || clientAssets === undefined) {
clientAssets = new Assets(clientId);
this.clientAssets[clientId] = clientAssets;
}
if (textureLoader !== null)
clientAssets.textureLoader = textureLoader;
clientAssets.toLoad.push(path);
// check if already queued, in which case we can skip actual
// loading
if (this.queuedAssets[path] === path) {
return false;
}
else {
this.queuedAssets[path] = path;
return true;
}
}
/**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
loadText(clientId, path) {
path = this.pathPrefix + path;
if (!this.queueAsset(clientId, null, path))
return;
/** @type {?} */
let request = new XMLHttpRequest();
request.onreadystatechange = (/**
* @return {?}
*/
() => {
if (request.readyState == XMLHttpRequest.DONE) {
if (request.status >= 200 && request.status < 300) {
this.rawAssets[path] = request.responseText;
}
else {
this.errors[path] = `Couldn't load text ${path}: status ${request.status}, ${request.responseText}`;
}
}
});
request.open("GET", path, true);
request.send();
}
/**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
loadJson(clientId, path) {
path = this.pathPrefix + path;
if (!this.queueAsset(clientId, null, path))
return;
/** @type {?} */
let request = new XMLHttpRequest();
request.onreadystatechange = (/**
* @return {?}
*/
() => {
if (request.readyState == XMLHttpRequest.DONE) {
if (request.status >= 200 && request.status < 300) {
this.rawAssets[path] = JSON.parse(request.responseText);
}
else {
this.errors[path] = `Couldn't load text ${path}: status ${request.status}, ${request.responseText}`;
}
}
});
request.open("GET", path, true);
request.send();
}
/**
* @param {?} clientId
* @param {?} textureLoader
* @param {?} path
* @return {?}
*/
loadTexture(clientId, textureLoader, path) {
path = this.pathPrefix + path;
if (!this.queueAsset(clientId, textureLoader, path))
return;
/** @type {?} */
let img = new Image();
img.src = path;
img.crossOrigin = "anonymous";
img.onload = (/**
* @param {?} ev
* @return {?}
*/
ev => {
this.rawAssets[path] = img;
});
img.onerror = (/**
* @param {?} ev
* @return {?}
*/
ev => {
this.errors[path] = `Couldn't load image ${path}`;
});
}
/**
* @param {?} clientId
* @param {?} path
* @return {?}
*/
get(clientId, path) {
path = this.pathPrefix + path;
/** @type {?} */
let clientAssets = this.clientAssets[clientId];
if (clientAssets === null || clientAssets === undefined)
return true;
return clientAssets.assets[path];
}
/**
* @private
* @param {?} clientAssets
* @return {?}
*/
updateClientAssets(clientAssets) {
for (let i = 0; i < clientAssets.toLoad.length; i++) {
/** @type {?} */
let path = clientAssets.toLoad[i];
/** @type {?} */
let asset = clientAssets.assets[path];
if (asset === null || asset === undefined) {
/** @type {?} */
let rawAsset = this.rawAssets[path];
if (rawAsset === null || rawAsset === undefined)
continue;
if (rawAsset instanceof HTMLImageElement) {
clientAssets.assets[path] = clientAssets.textureLoader((/** @type {?} */ (rawAsset)));
}
else {
clientAssets.assets[path] = rawAsset;
}
}
}
}
/**
* @param {?} clientId
* @return {?}
*/
isLoadingComplete(clientId) {
/** @type {?} */
let clientAssets = this.clientAssets[clientId];
if (clientAssets === null || clientAssets === undefined)
return true;
this.updateClientAssets(clientAssets);
return clientAssets.toLoad.length == clientAssets.loaded();
}
/*remove (clientId: string, path: string) {
path = this.pathPrefix + path;
let asset = this.assets[path];
if ((<any>asset).dispose) (<any>asset).dispose();
this.assets[path] = null;
}
removeAll () {
for (let key in this.assets) {
let asset = this.assets[key];
if ((<any>asset).dispose) (<any>asset).dispose();
}
this.assets = {};
}*/
/**
* @return {?}
*/
dispose() {
// this.removeAll();
}
/**
* @return {?}
*/
hasErrors() {
return Object.keys(this.errors).length > 0;
}
/**
* @return {?}
*/
getErrors() {
return this.errors;
}
}
if (false) {
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.pathPrefix;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.clientAssets;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.queuedAssets;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.rawAssets;
/**
* @type {?}
* @private
*/
SharedAssetManager.prototype.errors;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkQXNzZXRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvU2hhcmVkQXNzZXRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JBLE1BQU0sTUFBTTs7OztJQUtWLFlBQVksUUFBZ0I7UUFINUIsV0FBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDN0IsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUdwQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDOzs7O0lBQ0QsTUFBTTs7WUFDQSxDQUFDLEdBQUcsQ0FBQztRQUNULEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRjs7O0lBWkMsMEJBQWlCOztJQUNqQix3QkFBNkI7O0lBQzdCLHdCQUFzQjs7SUFDdEIsK0JBQWdEOztBQVVsRCxNQUFNLE9BQU8sa0JBQWtCOzs7O0lBTTdCLFlBQVksYUFBcUIsRUFBRTtRQUozQixpQkFBWSxHQUFnQixFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBZ0IsRUFBRSxDQUFDO1FBQy9CLGNBQVMsR0FBYSxFQUFFLENBQUM7UUFDekIsV0FBTSxHQUFnQixFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQzs7Ozs7Ozs7SUFDTyxVQUFVLENBQ2hCLFFBQWdCLEVBQ2hCLGFBQStDLEVBQy9DLElBQVk7O1lBRVIsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQzlDLElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQ3ZELFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQztTQUM1QztRQUNELElBQUksYUFBYSxLQUFLLElBQUk7WUFBRSxZQUFZLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUN2RSxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQiw0REFBNEQ7UUFDNUQsVUFBVTtRQUNWLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDcEMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7Ozs7OztJQUNELFFBQVEsQ0FBQyxRQUFnQixFQUFFLElBQVk7UUFDckMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQUUsT0FBTzs7WUFDL0MsT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFO1FBQ2xDLE9BQU8sQ0FBQyxrQkFBa0I7OztRQUFHLEdBQUcsRUFBRTtZQUNoQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksY0FBYyxDQUFDLElBQUksRUFBRTtnQkFDN0MsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtvQkFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2lCQUM3QztxQkFBTTtvQkFDTCxJQUFJLENBQUMsTUFBTSxDQUNULElBQUksQ0FDTCxHQUFHLHNCQUFzQixJQUFJLFlBQVksT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7aUJBQ3JGO2FBQ0Y7UUFDSCxDQUFDLENBQUEsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakIsQ0FBQzs7Ozs7O0lBQ0QsUUFBUSxDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUNyQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7WUFBRSxPQUFPOztZQUMvQyxPQUFPLEdBQUcsSUFBSSxjQUFjLEVBQUU7UUFDbEMsT0FBTyxDQUFDLGtCQUFrQjs7O1FBQUcsR0FBRyxFQUFFO1lBQ2hDLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsSUFBSSxFQUFFO2dCQUM3QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO29CQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUN6RDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsTUFBTSxDQUNULElBQUksQ0FDTCxHQUFHLHNCQUFzQixJQUFJLFlBQVksT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7aUJBQ3JGO2FBQ0Y7UUFDSCxDQUFDLENBQUEsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakIsQ0FBQzs7Ozs7OztJQUNELFdBQVcsQ0FDVCxRQUFnQixFQUNoQixhQUErQyxFQUMvQyxJQUFZO1FBRVosSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDO1lBQUUsT0FBTzs7WUFDeEQsR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFO1FBQ3JCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2YsR0FBRyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDOUIsR0FBRyxDQUFDLE1BQU07Ozs7UUFBRyxFQUFFLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QixDQUFDLENBQUEsQ0FBQztRQUNGLEdBQUcsQ0FBQyxPQUFPOzs7O1FBQUcsRUFBRSxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsSUFBSSxFQUFFLENBQUM7UUFDcEQsQ0FBQyxDQUFBLENBQUM7SUFDSixDQUFDOzs7Ozs7SUFDRCxHQUFHLENBQUMsUUFBZ0IsRUFBRSxJQUFZO1FBQ2hDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzs7WUFDMUIsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQzlDLElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JFLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7Ozs7SUFDTyxrQkFBa0IsQ0FBQyxZQUFvQjtRQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUMvQyxJQUFJLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7O2dCQUM3QixLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDckMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7O29CQUNyQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ25DLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUztvQkFBRSxTQUFTO2dCQUMxRCxJQUFJLFFBQVEsWUFBWSxnQkFBZ0IsRUFBRTtvQkFDeEMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLG1CQUV0RCxRQUFRLEVBQUEsQ0FBQyxDQUFDO2lCQUNaO3FCQUFNO29CQUNMLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO2lCQUN0QzthQUNGO1NBQ0Y7SUFDSCxDQUFDOzs7OztJQUNELGlCQUFpQixDQUFDLFFBQWdCOztZQUM1QixZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDOUMsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDckUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzdELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBY0QsT0FBTztRQUNMLG9CQUFvQjtJQUN0QixDQUFDOzs7O0lBQ0QsU0FBUztRQUNQLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDOzs7O0lBQ0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0Y7Ozs7OztJQXJJQyx3Q0FBMkI7Ozs7O0lBQzNCLDBDQUF1Qzs7Ozs7SUFDdkMsMENBQXVDOzs7OztJQUN2Qyx1Q0FBaUM7Ozs7O0lBQ2pDLG9DQUFpQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgTWFwLCBEaXNwb3NhYmxlIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuXHJcbmNsYXNzIEFzc2V0cyB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICB0b0xvYWQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gIGFzc2V0czogTWFwPGFueT4gPSB7fTtcclxuICB0ZXh0dXJlTG9hZGVyOiAoaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IGFueTtcclxuICBjb25zdHJ1Y3RvcihjbGllbnRJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7XHJcbiAgfVxyXG4gIGxvYWRlZCgpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAobGV0IHYgaW4gdGhpcy5hc3NldHMpIGkrKztcclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgU2hhcmVkQXNzZXRNYW5hZ2VyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XHJcbiAgcHJpdmF0ZSBwYXRoUHJlZml4OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBjbGllbnRBc3NldHM6IE1hcDxBc3NldHM+ID0ge307XHJcbiAgcHJpdmF0ZSBxdWV1ZWRBc3NldHM6IE1hcDxzdHJpbmc+ID0ge307XHJcbiAgcHJpdmF0ZSByYXdBc3NldHM6IE1hcDxhbnk+ID0ge307XHJcbiAgcHJpdmF0ZSBlcnJvcnM6IE1hcDxzdHJpbmc+ID0ge307XHJcbiAgY29uc3RydWN0b3IocGF0aFByZWZpeDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgdGhpcy5wYXRoUHJlZml4ID0gcGF0aFByZWZpeDtcclxuICB9XHJcbiAgcHJpdmF0ZSBxdWV1ZUFzc2V0KFxyXG4gICAgY2xpZW50SWQ6IHN0cmluZyxcclxuICAgIHRleHR1cmVMb2FkZXI6IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4gYW55LFxyXG4gICAgcGF0aDogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY2xpZW50QXNzZXRzID0gdGhpcy5jbGllbnRBc3NldHNbY2xpZW50SWRdO1xyXG4gICAgaWYgKGNsaWVudEFzc2V0cyA9PT0gbnVsbCB8fCBjbGllbnRBc3NldHMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjbGllbnRBc3NldHMgPSBuZXcgQXNzZXRzKGNsaWVudElkKTtcclxuICAgICAgdGhpcy5jbGllbnRBc3NldHNbY2xpZW50SWRdID0gY2xpZW50QXNzZXRzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRleHR1cmVMb2FkZXIgIT09IG51bGwpIGNsaWVudEFzc2V0cy50ZXh0dXJlTG9hZGVyID0gdGV4dHVyZUxvYWRlcjtcclxuICAgIGNsaWVudEFzc2V0cy50b0xvYWQucHVzaChwYXRoKTtcclxuICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgcXVldWVkLCBpbiB3aGljaCBjYXNlIHdlIGNhbiBza2lwIGFjdHVhbFxyXG4gICAgLy8gbG9hZGluZ1xyXG4gICAgaWYgKHRoaXMucXVldWVkQXNzZXRzW3BhdGhdID09PSBwYXRoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucXVldWVkQXNzZXRzW3BhdGhdID0gcGF0aDtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGxvYWRUZXh0KGNsaWVudElkOiBzdHJpbmcsIHBhdGg6IHN0cmluZykge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICBpZiAoIXRoaXMucXVldWVBc3NldChjbGllbnRJZCwgbnVsbCwgcGF0aCkpIHJldHVybjtcclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XHJcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID49IDIwMCAmJiByZXF1ZXN0LnN0YXR1cyA8IDMwMCkge1xyXG4gICAgICAgICAgdGhpcy5yYXdBc3NldHNbcGF0aF0gPSByZXF1ZXN0LnJlc3BvbnNlVGV4dDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICAgIHBhdGhcclxuICAgICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0ICR7cGF0aH06IHN0YXR1cyAke3JlcXVlc3Quc3RhdHVzfSwgJHtyZXF1ZXN0LnJlc3BvbnNlVGV4dH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCBwYXRoLCB0cnVlKTtcclxuICAgIHJlcXVlc3Quc2VuZCgpO1xyXG4gIH1cclxuICBsb2FkSnNvbihjbGllbnRJZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcclxuICAgIHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG4gICAgaWYgKCF0aGlzLnF1ZXVlQXNzZXQoY2xpZW50SWQsIG51bGwsIHBhdGgpKSByZXR1cm47XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA+PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgIHRoaXMucmF3QXNzZXRzW3BhdGhdID0gSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JzW1xyXG4gICAgICAgICAgICBwYXRoXHJcbiAgICAgICAgICBdID0gYENvdWxkbid0IGxvYWQgdGV4dCAke3BhdGh9OiBzdGF0dXMgJHtyZXF1ZXN0LnN0YXR1c30sICR7cmVxdWVzdC5yZXNwb25zZVRleHR9YDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgcGF0aCwgdHJ1ZSk7XHJcbiAgICByZXF1ZXN0LnNlbmQoKTtcclxuICB9XHJcbiAgbG9hZFRleHR1cmUoXHJcbiAgICBjbGllbnRJZDogc3RyaW5nLFxyXG4gICAgdGV4dHVyZUxvYWRlcjogKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiBhbnksXHJcbiAgICBwYXRoOiBzdHJpbmdcclxuICApIHtcclxuICAgIHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG4gICAgaWYgKCF0aGlzLnF1ZXVlQXNzZXQoY2xpZW50SWQsIHRleHR1cmVMb2FkZXIsIHBhdGgpKSByZXR1cm47XHJcbiAgICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcuc3JjID0gcGF0aDtcclxuICAgIGltZy5jcm9zc09yaWdpbiA9IFwiYW5vbnltb3VzXCI7XHJcbiAgICBpbWcub25sb2FkID0gZXYgPT4ge1xyXG4gICAgICB0aGlzLnJhd0Fzc2V0c1twYXRoXSA9IGltZztcclxuICAgIH07XHJcbiAgICBpbWcub25lcnJvciA9IGV2ID0+IHtcclxuICAgICAgdGhpcy5lcnJvcnNbcGF0aF0gPSBgQ291bGRuJ3QgbG9hZCBpbWFnZSAke3BhdGh9YDtcclxuICAgIH07XHJcbiAgfVxyXG4gIGdldChjbGllbnRJZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcclxuICAgIHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG4gICAgbGV0IGNsaWVudEFzc2V0cyA9IHRoaXMuY2xpZW50QXNzZXRzW2NsaWVudElkXTtcclxuICAgIGlmIChjbGllbnRBc3NldHMgPT09IG51bGwgfHwgY2xpZW50QXNzZXRzID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGNsaWVudEFzc2V0cy5hc3NldHNbcGF0aF07XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlQ2xpZW50QXNzZXRzKGNsaWVudEFzc2V0czogQXNzZXRzKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaWVudEFzc2V0cy50b0xvYWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBhdGggPSBjbGllbnRBc3NldHMudG9Mb2FkW2ldO1xyXG4gICAgICBsZXQgYXNzZXQgPSBjbGllbnRBc3NldHMuYXNzZXRzW3BhdGhdO1xyXG4gICAgICBpZiAoYXNzZXQgPT09IG51bGwgfHwgYXNzZXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGxldCByYXdBc3NldCA9IHRoaXMucmF3QXNzZXRzW3BhdGhdO1xyXG4gICAgICAgIGlmIChyYXdBc3NldCA9PT0gbnVsbCB8fCByYXdBc3NldCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcclxuICAgICAgICBpZiAocmF3QXNzZXQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XHJcbiAgICAgICAgICBjbGllbnRBc3NldHMuYXNzZXRzW3BhdGhdID0gY2xpZW50QXNzZXRzLnRleHR1cmVMb2FkZXIoPFxyXG4gICAgICAgICAgICBIVE1MSW1hZ2VFbGVtZW50XHJcbiAgICAgICAgICA+cmF3QXNzZXQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjbGllbnRBc3NldHMuYXNzZXRzW3BhdGhdID0gcmF3QXNzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzTG9hZGluZ0NvbXBsZXRlKGNsaWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBjbGllbnRBc3NldHMgPSB0aGlzLmNsaWVudEFzc2V0c1tjbGllbnRJZF07XHJcbiAgICBpZiAoY2xpZW50QXNzZXRzID09PSBudWxsIHx8IGNsaWVudEFzc2V0cyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcclxuICAgIHRoaXMudXBkYXRlQ2xpZW50QXNzZXRzKGNsaWVudEFzc2V0cyk7XHJcbiAgICByZXR1cm4gY2xpZW50QXNzZXRzLnRvTG9hZC5sZW5ndGggPT0gY2xpZW50QXNzZXRzLmxvYWRlZCgpO1xyXG4gIH1cclxuICAvKnJlbW92ZSAoY2xpZW50SWQ6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XHJcblx0XHRcdHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG5cdFx0XHRsZXQgYXNzZXQgPSB0aGlzLmFzc2V0c1twYXRoXTtcclxuXHRcdFx0aWYgKCg8YW55PmFzc2V0KS5kaXNwb3NlKSAoPGFueT5hc3NldCkuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLmFzc2V0c1twYXRoXSA9IG51bGw7XHJcblx0XHR9XHJcblx0XHRyZW1vdmVBbGwgKCkge1xyXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5hc3NldHMpIHtcclxuXHRcdFx0XHRsZXQgYXNzZXQgPSB0aGlzLmFzc2V0c1trZXldO1xyXG5cdFx0XHRcdGlmICgoPGFueT5hc3NldCkuZGlzcG9zZSkgKDxhbnk+YXNzZXQpLmRpc3Bvc2UoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmFzc2V0cyA9IHt9O1xyXG5cdFx0fSovXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIC8vIHRoaXMucmVtb3ZlQWxsKCk7XHJcbiAgfVxyXG4gIGhhc0Vycm9ycygpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmVycm9ycykubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgZ2V0RXJyb3JzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzO1xyXG4gIH1cclxufVxyXG4iXX0=