UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

336 lines 31.9 kB
/** * @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 { Texture, TextureWrap, TextureRegion } from "./Texture"; var TextureAtlas = /** @class */ (function () { function TextureAtlas(atlasText, textureLoader) { this.pages = new Array(); this.regions = new Array(); this.load(atlasText, textureLoader); } /** * @private * @param {?} atlasText * @param {?} textureLoader * @return {?} */ TextureAtlas.prototype.load = /** * @private * @param {?} atlasText * @param {?} textureLoader * @return {?} */ function (atlasText, textureLoader) { if (textureLoader == null) throw new Error("textureLoader cannot be null."); /** @type {?} */ var reader = new TextureAtlasReader(atlasText); /** @type {?} */ var tuple = new Array(4); /** @type {?} */ var page = null; while (true) { /** @type {?} */ var line = reader.readLine(); if (line == null) break; line = line.trim(); if (line.length == 0) page = null; else if (!page) { page = new TextureAtlasPage(); page.name = line; if (reader.readTuple(tuple) == 2) { // size is only optional for an atlas packed with an old TexturePacker. page.width = parseInt(tuple[0]); page.height = parseInt(tuple[1]); reader.readTuple(tuple); } // page.format = Format[tuple[0]]; we don't need format in WebGL reader.readTuple(tuple); page.minFilter = Texture.filterFromString(tuple[0]); page.magFilter = Texture.filterFromString(tuple[1]); /** @type {?} */ var direction = reader.readValue(); page.uWrap = TextureWrap.ClampToEdge; page.vWrap = TextureWrap.ClampToEdge; if (direction == "x") page.uWrap = TextureWrap.Repeat; else if (direction == "y") page.vWrap = TextureWrap.Repeat; else if (direction == "xy") page.uWrap = page.vWrap = TextureWrap.Repeat; page.texture = textureLoader(line); page.texture.setFilters(page.minFilter, page.magFilter); page.texture.setWraps(page.uWrap, page.vWrap); page.width = page.texture.getImage().width; page.height = page.texture.getImage().height; this.pages.push(page); } else { /** @type {?} */ var region = new TextureAtlasRegion(); region.name = line; region.page = page; /** @type {?} */ var rotateValue = reader.readValue(); if (rotateValue.toLocaleLowerCase() == "true") { region.degrees = 90; } else if (rotateValue.toLocaleLowerCase() == "false") { region.degrees = 0; } else { region.degrees = parseFloat(rotateValue); } region.rotate = region.degrees == 90; reader.readTuple(tuple); /** @type {?} */ var x = parseInt(tuple[0]); /** @type {?} */ var y = parseInt(tuple[1]); reader.readTuple(tuple); /** @type {?} */ var width = parseInt(tuple[0]); /** @type {?} */ var height = parseInt(tuple[1]); region.u = x / page.width; region.v = y / page.height; if (region.rotate) { region.u2 = (x + height) / page.width; region.v2 = (y + width) / page.height; } else { region.u2 = (x + width) / page.width; region.v2 = (y + height) / page.height; } region.x = x; region.y = y; region.width = Math.abs(width); region.height = Math.abs(height); if (reader.readTuple(tuple) == 4) { // split is optional // region.splits = new Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3])); if (reader.readTuple(tuple) == 4) { // pad is optional, but only present with splits //region.pads = Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3])); reader.readTuple(tuple); } } region.originalWidth = parseInt(tuple[0]); region.originalHeight = parseInt(tuple[1]); reader.readTuple(tuple); region.offsetX = parseInt(tuple[0]); region.offsetY = parseInt(tuple[1]); region.index = parseInt(reader.readValue()); region.texture = page.texture; this.regions.push(region); } } }; /** * @param {?} name * @return {?} */ TextureAtlas.prototype.findRegion = /** * @param {?} name * @return {?} */ function (name) { for (var i = 0; i < this.regions.length; i++) { if (this.regions[i].name == name) { return this.regions[i]; } } return null; }; /** * @return {?} */ TextureAtlas.prototype.dispose = /** * @return {?} */ function () { for (var i = 0; i < this.pages.length; i++) { this.pages[i].texture.dispose(); } }; return TextureAtlas; }()); export { TextureAtlas }; if (false) { /** @type {?} */ TextureAtlas.prototype.pages; /** @type {?} */ TextureAtlas.prototype.regions; } var TextureAtlasReader = /** @class */ (function () { function TextureAtlasReader(text) { this.index = 0; this.lines = text.split(/\r\n|\r|\n/); } /** * @return {?} */ TextureAtlasReader.prototype.readLine = /** * @return {?} */ function () { if (this.index >= this.lines.length) return null; return this.lines[this.index++]; }; /** * @return {?} */ TextureAtlasReader.prototype.readValue = /** * @return {?} */ function () { /** @type {?} */ var line = this.readLine(); /** @type {?} */ var colon = line.indexOf(":"); if (colon == -1) throw new Error("Invalid line: " + line); return line.substring(colon + 1).trim(); }; /** * @param {?} tuple * @return {?} */ TextureAtlasReader.prototype.readTuple = /** * @param {?} tuple * @return {?} */ function (tuple) { /** @type {?} */ var line = this.readLine(); /** @type {?} */ var colon = line.indexOf(":"); if (colon == -1) throw new Error("Invalid line: " + line); /** @type {?} */ var i = 0; /** @type {?} */ var lastMatch = colon + 1; for (; i < 3; i++) { /** @type {?} */ var comma = line.indexOf(",", lastMatch); if (comma == -1) break; tuple[i] = line.substr(lastMatch, comma - lastMatch).trim(); lastMatch = comma + 1; } tuple[i] = line.substring(lastMatch).trim(); return i + 1; }; return TextureAtlasReader; }()); if (false) { /** @type {?} */ TextureAtlasReader.prototype.lines; /** @type {?} */ TextureAtlasReader.prototype.index; } var TextureAtlasPage = /** @class */ (function () { function TextureAtlasPage() { } return TextureAtlasPage; }()); export { TextureAtlasPage }; if (false) { /** @type {?} */ TextureAtlasPage.prototype.name; /** @type {?} */ TextureAtlasPage.prototype.minFilter; /** @type {?} */ TextureAtlasPage.prototype.magFilter; /** @type {?} */ TextureAtlasPage.prototype.uWrap; /** @type {?} */ TextureAtlasPage.prototype.vWrap; /** @type {?} */ TextureAtlasPage.prototype.texture; /** @type {?} */ TextureAtlasPage.prototype.width; /** @type {?} */ TextureAtlasPage.prototype.height; } var TextureAtlasRegion = /** @class */ (function (_super) { tslib_1.__extends(TextureAtlasRegion, _super); function TextureAtlasRegion() { return _super !== null && _super.apply(this, arguments) || this; } return TextureAtlasRegion; }(TextureRegion)); export { TextureAtlasRegion }; if (false) { /** @type {?} */ TextureAtlasRegion.prototype.page; /** @type {?} */ TextureAtlasRegion.prototype.name; /** @type {?} */ TextureAtlasRegion.prototype.x; /** @type {?} */ TextureAtlasRegion.prototype.y; /** @type {?} */ TextureAtlasRegion.prototype.index; /** @type {?} */ TextureAtlasRegion.prototype.rotate; /** @type {?} */ TextureAtlasRegion.prototype.degrees; /** @type {?} */ TextureAtlasRegion.prototype.texture; /** @type {?} */ TextureAtlasRegion.prototype.u; /** @type {?} */ TextureAtlasRegion.prototype.v; /** @type {?} */ TextureAtlasRegion.prototype.u2; /** @type {?} */ TextureAtlasRegion.prototype.v2; /** @type {?} */ TextureAtlasRegion.prototype.width; /** @type {?} */ TextureAtlasRegion.prototype.height; /** @type {?} */ TextureAtlasRegion.prototype.originalWidth; /** @type {?} */ TextureAtlasRegion.prototype.originalHeight; /** @type {?} */ TextureAtlasRegion.prototype.offsetX; /** @type {?} */ TextureAtlasRegion.prototype.offsetY; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dHVyZUF0bGFzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvVGV4dHVyZUF0bGFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBaUIsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRS9FO0lBR0Usc0JBQVksU0FBaUIsRUFBRSxhQUFvQztRQUZuRSxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUM7UUFDdEMsWUFBTyxHQUFHLElBQUksS0FBSyxFQUFzQixDQUFDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7Ozs7SUFDTywyQkFBSTs7Ozs7O0lBQVosVUFBYSxTQUFpQixFQUFFLGFBQW9DO1FBQ2xFLElBQUksYUFBYSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7O1lBQ3hFLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQzs7WUFDMUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQzs7WUFDNUIsSUFBSSxHQUFxQixJQUFJO1FBQ2pDLE9BQU8sSUFBSSxFQUFFOztnQkFDUCxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUM1QixJQUFJLElBQUksSUFBSSxJQUFJO2dCQUFFLE1BQU07WUFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDO2lCQUM3QixJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNkLElBQUksR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQzlC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QUNkLGtDQUFlOztBQUVqQjtJQUF3Qyw4Q0FBYTtJQUFyRDs7SUFtQkEsQ0FBQztJQUFELHlCQUFDO0FBQUQsQ0FBQyxBQW5CRCxDQUF3QyxhQUFhLEdBbUJwRDs7OztJQWxCQyxrQ0FBdUI7O0lBQ3ZCLGtDQUFhOztJQUNiLCtCQUFVOztJQUNWLCtCQUFVOztJQUNWLG1DQUFjOztJQUNkLG9DQUFnQjs7SUFDaEIscUNBQWdCOztJQUNoQixxQ0FBaUI7O0lBQ2pCLCtCQUFVOztJQUNWLCtCQUFVOztJQUNWLGdDQUFXOztJQUNYLGdDQUFXOztJQUNYLG1DQUFjOztJQUNkLG9DQUFlOztJQUNmLDJDQUFzQjs7SUFDdEIsNENBQXVCOztJQUN2QixxQ0FBZ0I7O0lBQ2hCLHFDQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbmltcG9ydCB7IFRleHR1cmUsIFRleHR1cmVXcmFwLCBUZXh0dXJlRmlsdGVyLCBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4vVGV4dHVyZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhcyBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xyXG4gIHBhZ2VzID0gbmV3IEFycmF5PFRleHR1cmVBdGxhc1BhZ2U+KCk7XHJcbiAgcmVnaW9ucyA9IG5ldyBBcnJheTxUZXh0dXJlQXRsYXNSZWdpb24+KCk7XHJcbiAgY29uc3RydWN0b3IoYXRsYXNUZXh0OiBzdHJpbmcsIHRleHR1cmVMb2FkZXI6IChwYXRoOiBzdHJpbmcpID0+IGFueSkge1xyXG4gICAgdGhpcy5sb2FkKGF0bGFzVGV4dCwgdGV4dHVyZUxvYWRlcik7XHJcbiAgfVxyXG4gIHByaXZhdGUgbG9hZChhdGxhc1RleHQ6IHN0cmluZywgdGV4dHVyZUxvYWRlcjogKHBhdGg6IHN0cmluZykgPT4gYW55KSB7XHJcbiAgICBpZiAodGV4dHVyZUxvYWRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ0ZXh0dXJlTG9hZGVyIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIGxldCByZWFkZXIgPSBuZXcgVGV4dHVyZUF0bGFzUmVhZGVyKGF0bGFzVGV4dCk7XHJcbiAgICBsZXQgdHVwbGUgPSBuZXcgQXJyYXk8c3RyaW5nPig0KTtcclxuICAgIGxldCBwYWdlOiBUZXh0dXJlQXRsYXNQYWdlID0gbnVsbDtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgIGxldCBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7XHJcbiAgICAgIGlmIChsaW5lID09IG51bGwpIGJyZWFrO1xyXG4gICAgICBsaW5lID0gbGluZS50cmltKCk7XHJcbiAgICAgIGlmIChsaW5lLmxlbmd0aCA9PSAwKSBwYWdlID0gbnVsbDtcclxuICAgICAgZWxzZSBpZiAoIXBhZ2UpIHtcclxuICAgICAgICBwYWdlID0gbmV3IFRleHR1cmVBdGxhc1BhZ2UoKTtcclxuICAgICAgICBwYWdlLm5hbWUgPSBsaW5lO1xyXG4gICAgICAgIGlmIChyZWFkZXIucmVhZFR1cGxlKHR1cGxlKSA9PSAyKSB7XHJcbiAgICAgICAgICAvLyBzaXplIGlzIG9ubHkgb3B0aW9uYWwgZm9yIGFuIGF0bGFzIHBhY2tlZCB3aXRoIGFuIG9sZCBUZXh0dXJlUGFja2VyLlxyXG4gICAgICAgICAgcGFnZS53aWR0aCA9IHBhcnNlSW50KHR1cGxlWzBdKTtcclxuICAgICAgICAgIHBhZ2UuaGVpZ2h0ID0gcGFyc2VJbnQodHVwbGVbMV0pO1xyXG4gICAgICAgICAgcmVhZGVyLnJlYWRUdXBsZSh0dXBsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHBhZ2UuZm9ybWF0ID0gRm9ybWF0W3R1cGxlWzBdXTsgd2UgZG9uJ3QgbmVlZCBmb3JtYXQgaW4gV2ViR0xcclxuICAgICAgICByZWFkZXIucmVhZFR1cGxlKHR1cGxlKTtcclxuICAgICAgICBwYWdlLm1pbkZpbHRlciA9IFRleHR1cmUuZmlsdGVyRnJvbVN0cmluZyh0dXBsZVswXSk7XHJcbiAgICAgICAgcGFnZS5tYWdGaWx0ZXIgPSBUZXh0dXJlLmZpbHRlckZyb21TdHJpbmcodHVwbGVbMV0pO1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSByZWFkZXIucmVhZFZhbHVlKCk7XHJcbiAgICAgICAgcGFnZS51V3JhcCA9IFRleHR1cmVXcmFwLkNsYW1wVG9FZGdlO1xyXG4gICAgICAgIHBhZ2UudldyYXAgPSBUZXh0dXJlV3JhcC5DbGFtcFRvRWRnZTtcclxuICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwieFwiKSBwYWdlLnVXcmFwID0gVGV4dHVyZVdyYXAuUmVwZWF0O1xyXG4gICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBcInlcIikgcGFnZS52V3JhcCA9IFRleHR1cmVXcmFwLlJlcGVhdDtcclxuICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gXCJ4eVwiKVxyXG4gICAgICAgICAgcGFnZS51V3JhcCA9IHBhZ2UudldyYXAgPSBUZXh0dXJlV3JhcC5SZXBlYXQ7XHJcbiAgICAgICAgcGFnZS50ZXh0dXJlID0gdGV4dHVyZUxvYWRlcihsaW5lKTtcclxuICAgICAgICBwYWdlLnRleHR1cmUuc2V0RmlsdGVycyhwYWdlLm1pbkZpbHRlciwgcGFnZS5tYWdGaWx0ZXIpO1xyXG4gICAgICAgIHBhZ2UudGV4dHVyZS5zZXRXcmFwcyhwYWdlLnVXcmFwLCBwYWdlLnZXcmFwKTtcclxuICAgICAgICBwYWdlLndpZHRoID0gcGFnZS50ZXh0dXJlLmdldEltYWdlKCkud2lkdGg7XHJcbiAgICAgICAgcGFnZS5oZWlnaHQgPSBwYWdlLnRleHR1cmUuZ2V0SW1hZ2UoKS5oZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5wYWdlcy5wdXNoKHBhZ2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCByZWdpb246IFRleHR1cmVBdGxhc1JlZ2lvbiA9IG5ldyBUZXh0dXJlQXRsYXNSZWdpb24oKTtcclxuICAgICAgICByZWdpb24ubmFtZSA9IGxpbmU7XHJcbiAgICAgICAgcmVnaW9uLnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIGxldCByb3RhdGVWYWx1ZSA9IHJlYWRlci5yZWFkVmFsdWUoKTtcclxuICAgICAgICBpZiAocm90YXRlVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgcmVnaW9uLmRlZ3JlZXMgPSA5MDtcclxuICAgICAgICB9IGVsc2UgaWYgKHJvdGF0ZVZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJmYWxzZVwiKSB7XHJcbiAgICAgICAgICByZWdpb24uZGVncmVlcyA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlZ2lvbi5kZWdyZWVzID0gcGFyc2VGbG9hdChyb3RhdGVWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlZ2lvbi5yb3RhdGUgPSByZWdpb24uZGVncmVlcyA9PSA5MDtcclxuICAgICAgICByZWFkZXIucmVhZFR1cGxlKHR1cGxlKTtcclxuICAgICAgICBsZXQgeCA9IHBhcnNlSW50KHR1cGxlWzBdKTtcclxuICAgICAgICBsZXQgeSA9IHBhcnNlSW50KHR1cGxlWzFdKTtcclxuICAgICAgICByZWFkZXIucmVhZFR1cGxlKHR1cGxlKTtcclxuICAgICAgICBsZXQgd2lkdGggPSBwYXJzZUludCh0dXBsZVswXSk7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHBhcnNlSW50KHR1cGxlWzFdKTtcclxuICAgICAgICByZWdpb24udSA9IHggLyBwYWdlLndpZHRoO1xyXG4gICAgICAgIHJlZ2lvbi52ID0geSAvIHBhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIGlmIChyZWdpb24ucm90YXRlKSB7XHJcbiAgICAgICAgICByZWdpb24udTIgPSAoeCArIGhlaWdodCkgLyBwYWdlLndpZHRoO1xyXG4gICAgICAgICAgcmVnaW9uLnYyID0gKHkgKyB3aWR0aCkgLyBwYWdlLmhlaWdodDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVnaW9uLnUyID0gKHggKyB3aWR0aCkgLyBwYWdlLndpZHRoO1xyXG4gICAgICAgICAgcmVnaW9uLnYyID0gKHkgKyBoZWlnaHQpIC8gcGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlZ2lvbi54ID0geDtcclxuICAgICAgICByZWdpb24ueSA9IHk7XHJcbiAgICAgICAgcmVnaW9uLndpZHRoID0gTWF0aC5hYnMod2lkdGgpO1xyXG4gICAgICAgIHJlZ2lvbi5oZWlnaHQgPSBNYXRoLmFicyhoZWlnaHQpO1xyXG4gICAgICAgIGlmIChyZWFkZXIucmVhZFR1cGxlKHR1cGxlKSA9PSA0KSB7XHJcbiAgICAgICAgICAvLyBzcGxpdCBpcyBvcHRpb25hbFxyXG4gICAgICAgICAgLy8gcmVnaW9uLnNwbGl0cyA9IG5ldyBWZWN0b3IuPGludD4ocGFyc2VJbnQodHVwbGVbMF0pLCBwYXJzZUludCh0dXBsZVsxXSksIHBhcnNlSW50KHR1cGxlWzJdKSwgcGFyc2VJbnQodHVwbGVbM10pKTtcclxuICAgICAgICAgIGlmIChyZWFkZXIucmVhZFR1cGxlKHR1cGxlKSA9PSA0KSB7XHJcbiAgICAgICAgICAgIC8vIHBhZCBpcyBvcHRpb25hbCwgYnV0IG9ubHkgcHJlc2VudCB3aXRoIHNwbGl0c1xyXG4gICAgICAgICAgICAvL3JlZ2lvbi5wYWRzID0gVmVjdG9yLjxpbnQ+KHBhcnNlSW50KHR1cGxlWzBdKSwgcGFyc2VJbnQodHVwbGVbMV0pLCBwYXJzZUludCh0dXBsZVsyXSksIHBhcnNlSW50KHR1cGxlWzNdKSk7XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkVHVwbGUodHVwbGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZWdpb24ub3JpZ2luYWxXaWR0aCA9IHBhcnNlSW50KHR1cGxlWzBdKTtcclxuICAgICAgICByZWdpb24ub3JpZ2luYWxIZWlnaHQgPSBwYXJzZUludCh0dXBsZVsxXSk7XHJcbiAgICAgICAgcmVhZGVyLnJlYWRUdXBsZSh0dXBsZSk7XHJcbiAgICAgICAgcmVnaW9uLm9mZnNldFggPSBwYXJzZUludCh0dXBsZVswXSk7XHJcbiAgICAgICAgcmVnaW9uLm9mZnNldFkgPSBwYXJzZUludCh0dXBsZVsxXSk7XHJcbiAgICAgICAgcmVnaW9uLmluZGV4ID0gcGFyc2VJbnQocmVhZGVyLnJlYWRWYWx1ZSgpKTtcclxuICAgICAgICByZWdpb24udGV4dHVyZSA9IHBhZ2UudGV4dHVyZTtcclxuICAgICAgICB0aGlzLnJlZ2lvbnMucHVzaChyZWdpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZpbmRSZWdpb24obmFtZTogc3RyaW5nKTogVGV4dHVyZUF0bGFzUmVnaW9uIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZWdpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnJlZ2lvbnNbaV0ubmFtZSA9PSBuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaW9uc1tpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5wYWdlc1tpXS50ZXh0dXJlLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuY2xhc3MgVGV4dHVyZUF0bGFzUmVhZGVyIHtcclxuICBsaW5lczogQXJyYXk8c3RyaW5nPjtcclxuICBpbmRleDogbnVtYmVyID0gMDtcclxuICBjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGluZXMgPSB0ZXh0LnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pO1xyXG4gIH1cclxuICByZWFkTGluZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaW5kZXggPj0gdGhpcy5saW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMubGluZXNbdGhpcy5pbmRleCsrXTtcclxuICB9XHJcbiAgcmVhZFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbGluZSA9IHRoaXMucmVhZExpbmUoKTtcclxuICAgIGxldCBjb2xvbiA9IGxpbmUuaW5kZXhPZihcIjpcIik7XHJcbiAgICBpZiAoY29sb24gPT0gLTEpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGluZTogXCIgKyBsaW5lKTtcclxuICAgIHJldHVybiBsaW5lLnN1YnN0cmluZyhjb2xvbiArIDEpLnRyaW0oKTtcclxuICB9XHJcbiAgcmVhZFR1cGxlKHR1cGxlOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lID0gdGhpcy5yZWFkTGluZSgpO1xyXG4gICAgbGV0IGNvbG9uID0gbGluZS5pbmRleE9mKFwiOlwiKTtcclxuICAgIGlmIChjb2xvbiA9PSAtMSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW5lOiBcIiArIGxpbmUpO1xyXG4gICAgbGV0IGkgPSAwLFxyXG4gICAgICBsYXN0TWF0Y2ggPSBjb2xvbiArIDE7XHJcbiAgICBmb3IgKDsgaSA8IDM7IGkrKykge1xyXG4gICAgICBsZXQgY29tbWEgPSBsaW5lLmluZGV4T2YoXCIsXCIsIGxhc3RNYXRjaCk7XHJcbiAgICAgIGlmIChjb21tYSA9PSAtMSkgYnJlYWs7XHJcbiAgICAgIHR1cGxlW2ldID0gbGluZS5zdWJzdHIobGFzdE1hdGNoLCBjb21tYSAtIGxhc3RNYXRjaCkudHJpbSgpO1xyXG4gICAgICBsYXN0TWF0Y2ggPSBjb21tYSArIDE7XHJcbiAgICB9XHJcbiAgICB0dXBsZVtpXSA9IGxpbmUuc3Vic3RyaW5nKGxhc3RNYXRjaCkudHJpbSgpO1xyXG4gICAgcmV0dXJuIGkgKyAxO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVGV4dHVyZUF0bGFzUGFnZSB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIG1pbkZpbHRlcjogVGV4dHVyZUZpbHRlcjtcclxuICBtYWdGaWx0ZXI6IFRleHR1cmVGaWx0ZXI7XHJcbiAgdVdyYXA6IFRleHR1cmVXcmFwO1xyXG4gIHZXcmFwOiBUZXh0dXJlV3JhcDtcclxuICB0ZXh0dXJlOiBUZXh0dXJlO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhc1JlZ2lvbiBleHRlbmRzIFRleHR1cmVSZWdpb24ge1xyXG4gIHBhZ2U6IFRleHR1cmVBdGxhc1BhZ2U7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHg6IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbiAgaW5kZXg6IG51bWJlcjtcclxuICByb3RhdGU6IGJvb2xlYW47XHJcbiAgZGVncmVlczogbnVtYmVyO1xyXG4gIHRleHR1cmU6IFRleHR1cmU7XHJcbiAgdTogbnVtYmVyO1xyXG4gIHY6IG51bWJlcjtcclxuICB1MjogbnVtYmVyO1xyXG4gIHYyOiBudW1iZXI7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxuICBoZWlnaHQ6IG51bWJlcjtcclxuICBvcmlnaW5hbFdpZHRoOiBudW1iZXI7XHJcbiAgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcjtcclxuICBvZmZzZXRYOiBudW1iZXI7XHJcbiAgb2Zmc2V0WTogbnVtYmVyO1xyXG59XHJcbiJdfQ==