var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0) { leftCoin = nextDrawal - this.totalCoin; if (leftCoin > 0) str = "\u8FD8\u5DEE" + (leftCoin / 10000).toFixed(3) + "\u91D1\u989D\u53EF\u63D0\u73B0"; } this.tiplab.text = str; this.tiplab.visible = Boolean(nextDrawal); return [2 /*return*/]; } }); }); }; return RedDrawal; }(Laya.Script)); exports.default = RedDrawal; },{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/PcSdk":9}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var layaMaxUI_1 = require("./ui/layaMaxUI"); var AdManager_1 = require("./sdk/AdManager"); var ShakeModel_1 = require("./sdk/model/ShakeModel"); var RedpacketModel_1 = require("./sdk/model/RedpacketModel"); var PcSdk_1 = require("./sdk/PcSdk"); var NativeAd_1 = require("./sdk/NativeAd"); var TestScene = /** @class */ (function (_super) { __extends(TestScene, _super); function TestScene() { var _this = _super.call(this) || this; _this.isLongVibrate = false; //关闭多点触控,否则就无敌了 Laya.MouseManager.multiTouchEnabled = false; console.log('---------------TestScene-------'); return _this; // this.NativeAD.visible = false; } TestScene.prototype.onEnable = function () { var _this = this; this.btnServer.on(Laya.Event.CLICK, this, this.openServer); this.btnVibrate.on(Laya.Event.CLICK, this, function () { PcSdk_1.default.I.vibrate(_this.isLongVibrate ? 0 : 1); _this.isLongVibrate = !_this.isLongVibrate; }); this.btnDrawal.on(Laya.Event.CLICK, this, this.openPersonal); this.btnInvite.on(Laya.Event.CLICK, this, this.invitation); this.btn_shake.on(Laya.Event.CLICK, this, this.touchShake); this.btnPreloadAD.on(Laya.Event.CLICK, this, this.preloadAD); this.btnShowBanner.on(Laya.Event.CLICK, this, this.showBanner); this.btnShowFullAd.on(Laya.Event.CLICK, this, this.showFullAd); this.btnShowNativeAd.on(Laya.Event.CLICK, this, this.showNativeAd); this.btnShowInterAd.on(Laya.Event.CLICK, this, this.showInterAd); this.btnRewardAd.on(Laya.Event.CLICK, this, this.showRewardAd); this.btnRedpacket.on(Laya.Event.CLICK, this, this.openRedpacket); this.btnPreVideo.on(Laya.Event.CLICK, this, this.preloadRewardAd); this.btnPreFull.on(Laya.Event.CLICK, this, this.preloadFull); this.btnPreInsert.on(Laya.Event.CLICK, this, this.preloadInterAd); this.btnPreNative.on(Laya.Event.CLICK, this, this.preloadNativeAd); this.btnCloseBanner.on(Laya.Event.CLICK, this, this.closeAdBanner); this.btnCloseNative.on(Laya.Event.CLICK, this, this.closeAdverDialog); this.btnMinWithDrawal.on(Laya.Event.CLICK, this, this.minWithDrawal); }; /**预加载广告 */ TestScene.prototype.preloadAD = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: console.log('---------------preloadAD-------'); return [4 /*yield*/, AdManager_1.default.I.preloadBanner()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; TestScene.prototype.preloadRewardAd = function () { AdManager_1.default.I.preloadRewardAd(); }; TestScene.prototype.preloadFull = function () { AdManager_1.default.I.preloadFullAd(); }; TestScene.prototype.preloadInterAd = function () { AdManager_1.default.I.preloadInterAd(); }; TestScene.prototype.preloadNativeAd = function () { this.NativeAD.getComponent(NativeAd_1.default).initNativeAd(1); }; TestScene.prototype.closeAdverDialog = function () { AdManager_1.default.I.closeAdverDialog(); }; TestScene.prototype.closeAdBanner = function () { AdManager_1.default.I.closeAdBanner(); }; /**显示全屏广告 */ TestScene.prototype.showFullAd = function () { console.log('---------------showFullAd-------'); AdManager_1.default.I.showFullAd(); }; /**显示banner */ TestScene.prototype.showBanner = function () { console.log('---------------showBanner-------'); AdManager_1.default.I.showBanner(); }; /**信息流广告 */ TestScene.prototype.showNativeAd = function () { this.NativeAD.getComponent(NativeAd_1.default).initNativeAd(); }; /**插屏广告 */ TestScene.prototype.showInterAd = function () { console.log('---------------showInterAd-------'); AdManager_1.default.I.showInterAd(); }; /**激励视频广告 */ TestScene.prototype.showRewardAd = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: console.log('---------------showRewardAd-------'); return [4 /*yield*/, AdManager_1.default.I.showRewardAd()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; /**意见反馈 */ TestScene.prototype.openServer = function () { console.log('---------------openServer-------'); PcSdk_1.default.I.feedback(); }; TestScene.prototype.openRedpacket = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { RedpacketModel_1.default.I.checkRedpacket(); return [2 /*return*/]; }); }); }; TestScene.prototype.minWithDrawal = function () { return __awaiter(this, void 0, void 0, function () { var money; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, PcSdk_1.default.I.minWithDrawal()]; case 1: money = _a.sent(); this.minWithDrawalLab.text = '最低提现:' + money; return [2 /*return*/]; } }); }); }; /**打开个人中心 */ TestScene.prototype.openPersonal = function () { console.log('---------------openServer-------'); PcSdk_1.default.I.personal(0); }; /**邀请好友 */ TestScene.prototype.invitation = function () { PcSdk_1.default.I.invitation(); }; /** * 1 金币 2 激励视频后金币 3 4 5 6 7 游戏中对应的道具 8 空 */ TestScene.prototype.touchShake = function () { console.log('---------------touchShake-------'); PcSdk_1.default.I.vibrate(); /** * 1.回去星星 道具 * 2.红包 直接获得⾦币;或者直接弹激励视频后,获得⾦币 * 3.无道具 * 直接展⽰插屏 * */ var data = ShakeModel_1.default.I.getShakeType(); console.log('摇一摇获取结果:' + JSON.stringify(data)); if (!data) return; var type = data.type; switch (type) { case 8: /** '谢谢参与,下次好运!'*/ ; AdManager_1.default.I.showInterAd(); break; case 1: this.getCoin(); break; case 2: this.watchADCoin(); break; case 3: case 4: case 5: case 6: case 7: this.getProps(data); break; } }; TestScene.prototype.getProps = function (data) { var booster; var rewardNum = data.num; var type = data.type; /** * 处理游戏中的道具显示 */ // switch (type) { // case 4: // booster = BoosterType.Remove; // break; // case 6: // booster = BoosterType.Change; // break; // case 5: // booster = BoosterType.Refresh; // break; // case 7: // booster = BoosterType.RandRemove; // break; // case 3: // booster = BoosterType.Star; // break; // } // ViewManager.I.openPopwin(ReceivePropsPopwin, booster, rewardNum); }; /** * 看广告获得红包 */ TestScene.prototype.watchADCoin = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AdManager_1.default.I.showRewardAd()]; case 1: _a.sent(); this.getCoin(); return [2 /*return*/]; } }); }); }; /**直接获得红包 */ TestScene.prototype.getCoin = function () { //刷新总金币 // AppManager.I.redpacket.getRepacket() // ViewManager.I.openPopwin(RedPacketReward, 2); }; return TestScene; }(layaMaxUI_1.ui.TestSceneUI)); exports.default = TestScene; },{"./sdk/AdManager":7,"./sdk/NativeAd":8,"./sdk/PcSdk":9,"./sdk/model/RedpacketModel":13,"./sdk/model/ShakeModel":14,"./ui/layaMaxUI":15}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var EventCenter = /** @class */ (function () { function EventCenter() { } Object.defineProperty(EventCenter, "I", { get: function () { window['ev'] = this._instance; return this._instance || (this._instance = new Laya.EventDispatcher); }, enumerable: true, configurable: true }); EventCenter.emit = function (event) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } this.I.event(event.toString(), args); }; EventCenter.add = function (type, caller, listener, args) { this.I.on(type.toString(), caller, listener, args); }; EventCenter.remove = function (type, caller, listener) { this.I.off(type.toString(), caller, listener); }; return EventCenter; }()); exports.EventCenter = EventCenter; },{}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EventEnum; (function (EventEnum) { EventEnum[EventEnum["CHECK_REDPACKET"] = 'check_redpacket'] = "CHECK_REDPACKET"; EventEnum[EventEnum["APP_SHOW"] = 'app.show'] = "APP_SHOW"; EventEnum[EventEnum["APP_HIDE"] = 'app.hide'] = "APP_HIDE"; EventEnum[EventEnum["UPDATE_COIN"] = 'update.coin'] = "UPDATE_COIN"; })(EventEnum = exports.EventEnum || (exports.EventEnum = {})); },{}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TTAdSdk_1 = require("./TTAdSdk"); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var AdManager = /** @class */ (function () { function AdManager() { } AdManager.prototype.init = function () { this.preloadRewardAd(); }; AdManager.prototype.preloadBanner = function () { TTAdSdk_1.default.I.loadBannerExpressAd(1); }; AdManager.prototype.preloadRewardAd = function () { TTAdSdk_1.default.I.showRewardVideoAd(1); }; AdManager.prototype.preloadFullAd = function () { TTAdSdk_1.default.I.loadFullScreenVideoAd(1); }; AdManager.prototype.preloadInterAd = function () { TTAdSdk_1.default.I.loadFullScreenVideoAd(1); }; AdManager.prototype.preloadNativeAd = function () { // TTAdSdk.I.loadFullScreenVideoAd(1); }; AdManager.prototype.closeAdverDialog = function () { TTAdSdk_1.default.I.closeAdverDialog(); }; AdManager.prototype.closeAdBanner = function () { TTAdSdk_1.default.I.closeAdBanner(); }; AdManager.prototype.showRewardAd = function () { return __awaiter(this, void 0, void 0, function () { var ret, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, TTAdSdk_1.default.I.showRewardVideoAd()]; case 1: ret = _a.sent(); this.lastVideoTime = Laya.timer.currTimer; this.preloadRewardAd(); return [2 /*return*/, Promise.resolve(ret)]; case 2: e_1 = _a.sent(); this.preloadRewardAd(); return [2 /*return*/, Promise.reject(e_1)]; case 3: return [2 /*return*/]; } }); }); }; AdManager.prototype.showFullAd = function () { return __awaiter(this, void 0, void 0, function () { var ret, e_2; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, TTAdSdk_1.default.I.loadFullScreenVideoAd()]; case 1: ret = _a.sent(); this.preloadFullAd(); return [2 /*return*/, Promise.resolve(ret)]; case 2: e_2 = _a.sent(); this.preloadFullAd(); return [2 /*return*/, Promise.reject(e_2)]; case 3: return [2 /*return*/]; } }); }); }; AdManager.prototype.showInterAd = function () { return __awaiter(this, void 0, void 0, function () { var ret, e_3; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, TTAdSdk_1.default.I.showInteractionExpressAd()]; case 1: ret = _a.sent(); this.preloadInterAd(); return [2 /*return*/, Promise.resolve(ret)]; case 2: e_3 = _a.sent(); this.preloadInterAd(); return [2 /*return*/, Promise.reject(e_3)]; case 3: return [2 /*return*/]; } }); }); }; AdManager.prototype.checkVideoInCd = function () { return this.lastVideoTime && (Laya.timer.currTimer - this.lastVideoTime <= 30000); }; AdManager.prototype.showBanner = function () { TTAdSdk_1.default.I.loadBannerExpressAd(); }; AdManager.prototype.showNativeAd = function (x, y, w, h, preload) { if (preload === void 0) { preload = 0; } TTAdSdk_1.default.I.loadNativeExpressAd(x, y, w, h, preload); }; Object.defineProperty(AdManager, "I", { get: function () { return ObjectInstance_1.default.get(AdManager); }, enumerable: true, configurable: true }); return AdManager; }()); exports.default = AdManager; },{"../uitl/ObjectInstance":18,"./TTAdSdk":10}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AdManager_1 = require("./AdManager"); var NativeAd = /** @class */ (function (_super) { __extends(NativeAd, _super); function NativeAd() { return _super !== null && _super.apply(this, arguments) || this; } NativeAd.prototype.initNativeAd = function (preload) { if (preload === void 0) { preload = 0; } var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true); AdManager_1.default.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height, preload); }; NativeAd.prototype.onEnable = function () { this.initNativeAd(); }; NativeAd.prototype.onDisable = function () { AdManager_1.default.I.closeAdverDialog(); }; Object.defineProperty(NativeAd.prototype, "item", { get: function () { return this.owner; }, enumerable: true, configurable: true }); return NativeAd; }(Laya.Script)); exports.default = NativeAd; },{"./AdManager":7}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var EventCenter_1 = require("../event/EventCenter"); var EventEnum_1 = require("../event/EventEnum"); var PcSdk = /** @class */ (function () { function PcSdk() { } PcSdk.prototype.init = function () { this.getSystemInfo(); }; Object.defineProperty(PcSdk.prototype, "myBridge", { get: function () { if (MyBridge) { return MyBridge; } }, enumerable: true, configurable: true }); /**获取基本版本信息以及手机的配置 */ PcSdk.prototype.getSystemInfo = function (key) { if (key === void 0) { key = 0; } var _a; var ret = this.myBridge.getSystemInfo(key); var _b = JSON.parse(ret), w = _b.w, h = _b.h, versionName = _b.versionName, channel = _b.channel, pangolin = _b.pangolin, adnet = _b.adnet, level = _b.level; _a = [w, h, versionName, channel, pangolin, adnet, level], this._width = _a[0], this._height = _a[1], this._version = _a[2], this._channel = _a[3], this.pangolinId = _a[4], this.adnetId = _a[5], this._level = _a[6]; }; PcSdk.prototype.initGameConfig = function () { this._gameConfig = this.getGameConfig(); }; /** * 震动 * @param key 0 短震动 1 长震动 */ PcSdk.prototype.vibrate = function (key) { if (key === void 0) { key = 0; } this.myBridge.openSystemFun(key); }; /**隐藏启动屏 */ PcSdk.prototype.hideSplash = function () { this.myBridge.hideSplash(); }; /**弹出提现 */ PcSdk.prototype.withDrawal = function () { this.myBridge.withDrawal(); }; /**意见反馈 */ PcSdk.prototype.feedback = function () { this.myBridge.feedback(); }; /** * key 默认0 ,签到 1 */ PcSdk.prototype.personal = function (key) { if (key === void 0) { key = 0; } this.myBridge.personal(key); }; /**邀请好友*/ PcSdk.prototype.invitation = function () { this.myBridge.invitation(); }; /** * 获取金币配表 * @param key 1红包 2 摇一摇红包 */ PcSdk.prototype.getGameConfig = function () { var result = this.myBridge.getGameConfig(); // console.log('---------------getGameConfig-------' + JSON.stringify(result)) return JSON.parse(result); }; /** * 要求发放金币 * @param key 1红包 */ PcSdk.prototype.addGold = function (key) { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.myBridge.addGold(key, function (res) { res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data); } else { reject(msg); } })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); })]; }); }); }; /**获取总金币 */ PcSdk.prototype.myCoin = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.myBridge.myCoin(function (res) { res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data['coin']); } else { reject(msg); } })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); })]; }); }); }; /**获取当前提现的档位 */ PcSdk.prototype.minWithDrawal = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.myBridge.minWithDrawal(function (res) { res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data['money']); } else { reject(msg); } })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); })]; }); }); }; /**上报埋点 */ PcSdk.prototype.appDotLog = function (key, value) { this.myBridge.appDotLog(key, value); }; /**热云打点 */ PcSdk.prototype.appDotTracKing = function (key) { this.myBridge.appDotTracKing(key); }; PcSdk.prototype.setCallback = function (funName, pramas) { var _this = this; console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge)); return new Promise(function (resolve, reject) { _this.myBridge[funName](pramas, function (res) { var _a = JSON.parse(res), code = _a.code, data = _a.data; if ('0' === code) { resolve(data); } else { reject(0); } }); }); }; PcSdk.prototype.closeAdverDialog = function () { this.myBridge.closeAdverDialog(); }; PcSdk.prototype.closeAdBanner = function () { this.myBridge.closeAdBanner(); }; /**激励视频 */ PcSdk.prototype.showRewardVideoAd = function (value, JBCallback) { this.myBridge.showRewardVideoAd(value, JBCallback); }; /** 全屏广告*/ PcSdk.prototype.loadFullScreenVideoAd = function (data, JBCallback) { this.myBridge.showRewardVideoAd(data, JBCallback); }; /**信息流广告 */ PcSdk.prototype.loadNativeExpressAd = function (data, JBCallback) { this.myBridge.loadNativeExpressAd(data, JBCallback); }; /**banner */ PcSdk.prototype.loadBannerExpressAd = function (data, JBCallback) { this.myBridge.loadBannerExpressAd(data, JBCallback); }; /**插屏广告 */ PcSdk.prototype.showInteractionExpressAd = function (data, JBCallback) { this.myBridge.showInteractionExpressAd(data, JBCallback); }; Object.defineProperty(PcSdk.prototype, "level", { get: function () { return this._level; }, enumerable: true, configurable: true }); Object.defineProperty(PcSdk.prototype, "width", { get: function () { return this._width; }, enumerable: true, configurable: true }); Object.defineProperty(PcSdk.prototype, "height", { get: function () { return this._height; }, enumerable: true, configurable: true }); Object.defineProperty(PcSdk.prototype, "version", { get: function () { return this._version; }, enumerable: true, configurable: true }); Object.defineProperty(PcSdk.prototype, "channel", { get: function () { return this._channel; }, enumerable: true, configurable: true }); Object.defineProperty(PcSdk.prototype, "bridge", { get: function () { return null; }, enumerable: true, configurable: true }); Object.defineProperty(PcSdk.prototype, "gameConfig", { get: function () { return this._gameConfig; }, enumerable: true, configurable: true }); Object.defineProperty(PcSdk, "I", { get: function () { return ObjectInstance_1.default.get(PcSdk); }, enumerable: true, configurable: true }); return PcSdk; }()); exports.default = PcSdk; // //这里是浏览器环境下, 接收web传过来的消息 window.onMyBridgeReady = function () { console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms"); MyBridge.App.onResume = function () { var ret = []; for (var _i = 0; _i < arguments.length; _i++) { ret[_i] = arguments[_i]; } console.log(' laya onResume', ret); EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.APP_SHOW); }; MyBridge.App.onPause = function () { var ret = []; for (var _i = 0; _i < arguments.length; _i++) { ret[_i] = arguments[_i]; } console.log(' laya onPause', ret); EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.APP_HIDE); }; }; },{"../event/EventCenter":5,"../event/EventEnum":6,"../uitl/ObjectInstance":18}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var PcSdk_1 = require("./PcSdk"); var TTAdSdk = /** @class */ (function () { function TTAdSdk() { } /** * * @param preload 0 直接加载;1 预加载 */ TTAdSdk.prototype.showRewardVideoAd = function (preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { type: 1, preloading: preload, }; return [2 /*return*/, new Promise(function (resolve, reject) { var isComplete = false; PcSdk_1.default.I.showRewardVideoAd(data, function (ret) { var _a = JSON.parse(ret), code = _a.code, message = _a.message; switch (code) { case -1: reject('error'); /**'暂无视频广告!每日0点重置'*/ ; break; case 200: isComplete = true; break; case 100: break; case 0: if (isComplete) { resolve(); } else { reject('unComplete'); } break; } }); })]; }); }); }; TTAdSdk.prototype.loadFullScreenVideoAd = function (preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { w: PcSdk_1.default.I.width, h: PcSdk_1.default.I.width * 90 / 600, preloading: 0, type: 1 }; return [2 /*return*/, new Promise(function (resolve, reject) { PcSdk_1.default.I.loadFullScreenVideoAd(JSON.stringify(data), function (res) { resolve(res); }); })]; }); }); }; TTAdSdk.prototype.loadNativeExpressAd = function (x, y, width, height, type, preload) { if (type === void 0) { type = 1; } if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var scaleX, scaleY, data; return __generator(this, function (_a) { scaleX = PcSdk_1.default.I.width / Laya.stage.width; scaleY = PcSdk_1.default.I.height / Laya.stage.height; data = { type: type, preloading: preload, w: width * scaleX, h: height * scaleY, left: x * scaleX, top: y * scaleY }; PcSdk_1.default.I.loadNativeExpressAd(JSON.stringify(data), function (res) { return Promise.resolve(res); }); return [2 /*return*/]; }); }); }; TTAdSdk.prototype.loadBannerExpressAd = function (preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { w: PcSdk_1.default.I.width, h: PcSdk_1.default.I.width * 90 / 600, preloading: preload, type: 1 }; return [2 /*return*/, new Promise(function (resolve, reject) { PcSdk_1.default.I.loadBannerExpressAd(JSON.stringify(data), function (res) { resolve(res); }); })]; }); }); }; TTAdSdk.prototype.closeAdverDialog = function () { PcSdk_1.default.I.closeAdverDialog(); }; TTAdSdk.prototype.closeAdBanner = function () { PcSdk_1.default.I.closeAdBanner(); }; TTAdSdk.prototype.showInteractionExpressAd = function (preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { w: PcSdk_1.default.I.width * 0.8, h: PcSdk_1.default.I.height, preloading: preload, }; return [2 /*return*/, new Promise(function (resolve, reject) { var isComplete = false; PcSdk_1.default.I.showInteractionExpressAd(JSON.stringify(data), function (res) { resolve(res); }); })]; }); }); }; Object.defineProperty(TTAdSdk, "I", { get: function () { return ObjectInstance_1.default.get(TTAdSdk); }, enumerable: true, configurable: true }); return TTAdSdk; }()); exports.default = TTAdSdk; },{"../uitl/ObjectInstance":18,"./PcSdk":9}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var PcSdk_1 = require("./PcSdk"); /** * 上报热云埋点⽇志 * 具体的打点需要跟运营联系 */ var TrackingSdk = /** @class */ (function () { function TrackingSdk() { } TrackingSdk.prototype.dot = function (key) { PcSdk_1.default.I.appDotTracKing(key); }; Object.defineProperty(TrackingSdk, "I", { get: function () { return ObjectInstance_1.default.get(TrackingSdk); }, enumerable: true, configurable: true }); return TrackingSdk; }()); exports.default = TrackingSdk; var TrackingKey; (function (TrackingKey) { TrackingKey["RedPack1"] = "event_5"; TrackingKey["RedPack5"] = "event_6"; })(TrackingKey = exports.TrackingKey || (exports.TrackingKey = {})); },{"../uitl/ObjectInstance":18,"./PcSdk":9}],12:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ArrayUtils_1 = require("../../uitl/ArrayUtils"); /* * name; */ var BaseModel = /** @class */ (function () { function BaseModel() { this._data = {}; this.updateArr = []; this.keyUpdateArr = {}; } BaseModel.prototype.update = function (data) { return __awaiter(this, void 0, void 0, function () { var _loop_1, this_1, key; var _this = this; return __generator(this, function (_a) { this._data = __assign({}, this._data, data); this.updateArr.forEach(function (func) { func(_this._data); }); _loop_1 = function (key) { var value = data[key]; if (value != null) { var arr = this_1.keyUpdateArr[key]; arr && arr.forEach(function (func) { func(value); }); } }; this_1 = this; for (key in this.keyUpdateArr) { _loop_1(key); } return [2 /*return*/]; }); }); }; BaseModel.prototype.waitFor = function (key) { var _this = this; return new Promise(function (resolve) { var value; value = _this._data[key]; if (value) { resolve(value); return; } var cb = function (data) { if (data) { resolve(data); _this.offUpdate(cb, key); } }; _this.onUpdate(cb, key, true); }); }; BaseModel.prototype.onUpdate = function (func, key, run) { if (run === void 0) { run = true; } if (key) { var value = this._data[key]; run && value != null && func(value); var arr = this.keyUpdateArr[key]; !arr && (this.keyUpdateArr[key] = arr = []); arr.push(func); } else { run && func(this._data); this.updateArr.push(func); } }; BaseModel.prototype.offUpdate = function (func, key) { if (key) { ArrayUtils_1.default.removeFromArr(this.keyUpdateArr[key], func); } else { ArrayUtils_1.default.removeFromArr(this.updateArr, func); } }; BaseModel.prototype.clearGame = function () { this._data = {}; }; return BaseModel; }()); exports.default = BaseModel; },{"../../uitl/ArrayUtils":16}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseModel_1 = require("./BaseModel"); var AdManager_1 = require("../../sdk/AdManager"); var TrackingSdk_1 = require("../../sdk/TrackingSdk"); var DateUtils_1 = require("../../uitl/DateUtils"); var Util_1 = require("../../uitl/Util"); var ObjectInstance_1 = require("../../uitl/ObjectInstance"); var EventCenter_1 = require("../../event/EventCenter"); var EventEnum_1 = require("../../event/EventEnum"); var PcSdk_1 = require("../PcSdk"); var RedpacketModel = /** @class */ (function (_super) { __extends(RedpacketModel, _super); function RedpacketModel() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.MAX = 20; /**当天领取红包的最大次数 */ _this.DAY_MAX_CNT = 50; _this.curRedpacket = 0; _this.confLen = 0; return _this; } /**初始化红包配置 */ RedpacketModel.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var arr, cash; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getRedConfig()]; case 1: arr = _a.sent(); console.log('---------------RedpacketModel-------' + JSON.stringify(arr)); cash = 0; this.conf = {}; arr.forEach(function (confData) { _this.conf[confData.id] = confData; }); this.update(this.initData()); this.confLen = this.conf.length; return [2 /*return*/]; } }); }); }; RedpacketModel.prototype.initData = function () { var data = new RedpacketData; var lastTime = Util_1.default.I.getItem(Util_1.DataKey.lastTime) || '0'; data.lastTime = parseInt(lastTime); var last = DateUtils_1.default.timeDay(data.lastTime); var today = DateUtils_1.default.today; if (last != today) { data.todayCnt = 0; lastTime = DateUtils_1.default.nowTime.toString(); Util_1.default.I.setItem(Util_1.DataKey.lastTime, lastTime); Util_1.default.I.setItem(Util_1.DataKey.todayCnt, 0); } else { var todayCnt = Util_1.default.I.getItem(Util_1.DataKey.todayCnt) || '0'; data.todayCnt = parseInt(todayCnt); } data.lastTime = parseInt(lastTime); var dataCnt = Util_1.default.I.getItem(Util_1.DataKey.dataCNT) || '0'; data.cnt = parseInt(dataCnt); data.list = []; return data; }; RedpacketModel.prototype.getRedConfig = function () { return __awaiter(this, void 0, void 0, function () { var result, configJson; return __generator(this, function (_a) { switch (_a.label) { case 0: result = PcSdk_1.default.I.gameConfig; console.log('--------------- 获取配置静态表-----' + JSON.stringify(result)); if (!result) return [3 /*break*/, 2]; return [4 /*yield*/, this.loadGoldCfg(result['coin_config'][0])]; case 1: configJson = _a.sent(); console.log('-------------- 获取红包静态表-----' + JSON.stringify(result)); return [2 /*return*/, configJson]; case 2: PcSdk_1.default.I.initGameConfig(); _a.label = 3; case 3: return [2 /*return*/]; } }); }); }; RedpacketModel.prototype.loadGoldCfg = function (res) { return __awaiter(this, void 0, void 0, function () { var configJson; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.load(res)]; case 1: configJson = _a.sent(); return [2 /*return*/, configJson]; } }); }); }; RedpacketModel.prototype.load = function (res, onProgress) { var _this = this; return new Promise(function (suc, fail) { Laya.loader.load(res, Laya.Handler.create(_this, suc), onProgress); }); }; RedpacketModel.prototype.checkRedpacket = function () { return __awaiter(this, void 0, void 0, function () { var cnt, data, ran2, cash; return __generator(this, function (_a) { switch (_a.label) { case 0: if (this.data.todayCnt >= this.DAY_MAX_CNT) return [2 /*return*/, false]; if (AdManager_1.default.I.checkVideoInCd()) return [2 /*return*/, false]; /**红包获取后没有看广告领取,再次获得红包的机会,不会获取红包, 自己也可以处理成 对应的红包提醒或不需要这里的判断 */ if (this.curRedpacket) { return [2 /*return*/, false]; } if (undefined === this.data.cnt) this.data.cnt = 0; cnt = this.data.cnt; if (cnt >= this.confLen) cnt = this.confLen - 1; data = this.conf[cnt + 1]; ran2 = Math.random(); if (!(data && ran2 < data.per)) return [3 /*break*/, 2]; cash = 0.000001; this.curRedpacket = cash; //**弹出红包的界面, 暂时处理成 直接看广告获取金币 */ return [4 /*yield*/, AdManager_1.default.I.showRewardAd()]; case 1: //**弹出红包的界面, 暂时处理成 直接看广告获取金币 */ _a.sent(); console.log('--------------- 触发了红包-----'); this.getRepacket(); /**更新基本显示 */ EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.UPDATE_COIN); /*** */ return [2 /*return*/, true]; case 2: return [2 /*return*/, false]; } }); }); }; RedpacketModel.prototype.getRepacket = function () { if (!this.curRedpacket) return; this.data.cnt += 1; this.data.list.push(this.curRedpacket); this.data.lastTime = (new Date).getTime(); this.data.todayCnt += 1; if (this.data.cnt == 1) TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack1); if (this.data.cnt == 5) TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack5); this.curRedpacket = 0; Util_1.default.I.setItem(Util_1.DataKey.dataCNT, this.data.cnt); Util_1.default.I.setItem(Util_1.DataKey.todayCnt, this.data.todayCnt); this.update(this.data); }; /** */ RedpacketModel.prototype.getCurRedpacket = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.curRedpacket]; }); }); }; Object.defineProperty(RedpacketModel.prototype, "data", { get: function () { return this._data; }, enumerable: true, configurable: true }); /**获取总共的金币数 */ RedpacketModel.prototype.getTotalCoin = function () { return __awaiter(this, void 0, void 0, function () { var totalCoin; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, PcSdk_1.default.I.myCoin()]; case 1: totalCoin = _a.sent(); return [2 /*return*/, totalCoin]; } }); }); }; /**获取本次奖励的金币数 */ RedpacketModel.prototype.addCoin = function (key) { if (key === void 0) { key = 1; } return __awaiter(this, void 0, void 0, function () { var coinData; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, PcSdk_1.default.I.addGold(key)]; case 1: coinData = _a.sent(); return [2 /*return*/, coinData['coin']]; } }); }); }; /**获取最低提档 */ RedpacketModel.prototype.minWithDrawal = function () { return __awaiter(this, void 0, void 0, function () { var minCoin; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, PcSdk_1.default.I.minWithDrawal()]; case 1: minCoin = _a.sent(); return [2 /*return*/, minCoin]; } }); }); }; Object.defineProperty(RedpacketModel, "I", { get: function () { return ObjectInstance_1.default.get(RedpacketModel); }, enumerable: true, configurable: true }); return RedpacketModel; }(BaseModel_1.default)); exports.default = RedpacketModel; var RedpacketData = /** @class */ (function () { function RedpacketData() { } return RedpacketData; }()); var RedpacketConfigData = /** @class */ (function () { function RedpacketConfigData() { } return RedpacketConfigData; }()); },{"../../event/EventCenter":5,"../../event/EventEnum":6,"../../sdk/AdManager":7,"../../sdk/TrackingSdk":11,"../../uitl/DateUtils":17,"../../uitl/ObjectInstance":18,"../../uitl/Util":21,"../PcSdk":9,"./BaseModel":12}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseModel_1 = require("./BaseModel"); var DateUtils_1 = require("../../uitl/DateUtils"); var Util_1 = require("../../uitl/Util"); var ObjectInstance_1 = require("../../uitl/ObjectInstance"); var PcSdk_1 = require("../PcSdk"); /** * */ var ShakeModel = /** @class */ (function (_super) { __extends(ShakeModel, _super); function ShakeModel() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.eleProbabilityArr = []; _this.totalWeight = 0; _this.proArrLen = 0; /**红包出现的总次数每日 */ _this.red_day_limit = 0; _this.cur_red_day_limit = 0; /**摇一摇出现的总次数 */ _this.shake_day_limit = 0; _this.cur_shake_day_limit = 0; return _this; } ShakeModel.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var result, gameData; return __generator(this, function (_a) { result = PcSdk_1.default.I.gameConfig; ; console.log('---------------ShakeModel-- 获取摇一摇静态表-----' + JSON.stringify(result)); if (result['config']) { gameData = result['config']; this.update(this.initData(gameData)); } return [2 /*return*/]; }); }); }; ShakeModel.prototype.initData = function (gameData) { var data = new ShakeData; var lastTime = Util_1.default.I.getItem(Util_1.DataKey.shakeLastTime) || '0'; var lt = parseInt(lastTime); var last = DateUtils_1.default.timeDay(lt); var today = DateUtils_1.default.today; if (last != today) { this.cur_shake_day_limit = 0; this.cur_red_day_limit = 0; lastTime = DateUtils_1.default.nowTime.toString(); Util_1.default.I.setItem(Util_1.DataKey.cur_shake_day_limit, 0); Util_1.default.I.setItem(Util_1.DataKey.cur_red_day_limit, 0); Util_1.default.I.setItem(Util_1.DataKey.shakeLastTime, lastTime); } else { var cur_red_day_limit = Util_1.default.I.getItem(Util_1.DataKey.cur_red_day_limit) || '0'; this.cur_red_day_limit = parseInt(cur_red_day_limit); var cur_shake_day_limit = Util_1.default.I.getItem(Util_1.DataKey.cur_shake_day_limit) || '0'; this.cur_shake_day_limit = parseInt(cur_shake_day_limit); } data.config = gameData['config']; gameData['shake'].forEach(function (ele) { data.shakeWeightList.push(ele); }); this.conf = []; this.conf = data.shakeWeightList; this.initProbability(); this.shake_day_limit = data.config.shake_day_limit; this.red_day_limit = data.config.red_day_limit; return data; }; ShakeModel.prototype.initProbability = function () { var _this = this; this.totalWeight = 0; this.conf.forEach(function (ele, index) { _this.totalWeight += ele.weight; var itemW = ele.weight; if (index > 0) itemW += _this.eleProbabilityArr[index - 1]; _this.eleProbabilityArr = _this.eleProbabilityArr.concat([itemW]); }); this.proArrLen = this.eleProbabilityArr.length; }; ShakeModel.prototype.getShakeType = function () { ++this.cur_shake_day_limit; Util_1.default.I.setItem(Util_1.DataKey.cur_shake_day_limit, this.cur_shake_day_limit); if (this.cur_shake_day_limit > this.shake_day_limit) { /**'次数达到上限,请明天再来*/ /**在此处可以弹框等处理 */ return false; } var ran = Math.floor(Math.random() * this.totalWeight); for (var index = 0; index < this.proArrLen; index++) { var ele = this.eleProbabilityArr[index]; if (ele >= ran) { if (0 === index || 1 === index) { ++this.cur_red_day_limit; Util_1.default.I.setItem(Util_1.DataKey.cur_red_day_limit, this.cur_red_day_limit); if (this.cur_red_day_limit > this.red_day_limit) { return this.conf[this.proArrLen - 1]; } } return this.conf[index]; } } return this.conf[this.proArrLen - 1]; }; Object.defineProperty(ShakeModel.prototype, "data", { get: function () { return this._data; }, enumerable: true, configurable: true }); Object.defineProperty(ShakeModel, "I", { get: function () { return ObjectInstance_1.default.get(ShakeModel); }, enumerable: true, configurable: true }); return ShakeModel; }(BaseModel_1.default)); exports.default = ShakeModel; var ShakeData = /** @class */ (function () { function ShakeData() { this.shakeWeightList = []; } return ShakeData; }()); },{"../../uitl/DateUtils":17,"../../uitl/ObjectInstance":18,"../../uitl/Util":21,"../PcSdk":9,"./BaseModel":12}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Scene = Laya.Scene; var REG = Laya.ClassUtils.regClass; var ui; (function (ui) { var TestSceneUI = /** @class */ (function (_super) { __extends(TestSceneUI, _super); function TestSceneUI() { return _super.call(this) || this; } TestSceneUI.prototype.createChildren = function () { _super.prototype.createChildren.call(this); this.loadScene("TestScene"); }; return TestSceneUI; }(Scene)); ui.TestSceneUI = TestSceneUI; REG("ui.TestSceneUI", TestSceneUI); })(ui = exports.ui || (exports.ui = {})); },{}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ArrayUtils = /** @class */ (function () { function ArrayUtils() { } /** * 移除元素 */ ArrayUtils.removeFromArr = function (arr, obj) { var index = arr.indexOf(obj); arr.splice(index, 1); }; ArrayUtils.randomFromArr = function (arr) { var index = Math.floor(Math.random() * arr.length); return arr[index]; }; /** * 数组随机排序 */ ArrayUtils.shuffle = function (arr) { return arr.sort(function () { return Math.random() - 0.5; }); }; ArrayUtils.indexOf = function (arr, callback, ctx) { for (var i = 0; i < arr.length; i++) { if (callback.call(ctx, this[i], i)) return i; } return -1; }; ArrayUtils.each = function (arr, callback, context) { if (typeof callback !== 'function') throw new TypeError(); for (var i = 0, len = arr.length; i < len; i++) { if (callback.call(context, arr[i], i, arr)) break; } }; ArrayUtils.queue = function (arr) { return __awaiter(this, void 0, void 0, function () { var res, _i, arr_1, promise; return __generator(this, function (_a) { switch (_a.label) { case 0: res = null; _i = 0, arr_1 = arr; _a.label = 1; case 1: if (!(_i < arr_1.length)) return [3 /*break*/, 4]; promise = arr_1[_i]; return [4 /*yield*/, promise(res)]; case 2: res = _a.sent(); _a.label = 3; case 3: _i++; return [3 /*break*/, 1]; case 4: return [4 /*yield*/, res]; case 5: return [2 /*return*/, _a.sent()]; } }); }); }; ArrayUtils.getRandomArray = function (arr, count) { var shuffled = arr.slice(0); var len = arr.length; var min = len - count, temp, index; while (len-- > min) { index = Math.floor((len + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[len]; shuffled[len] = temp; } return shuffled.slice(min); }; return ArrayUtils; }()); exports.default = ArrayUtils; },{}],17:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 日期工具类 */ var DateUtils = /** @class */ (function () { function DateUtils() { } Object.defineProperty(DateUtils, "now", { get: function () { return Math.floor(this.nowTime / 1000); }, enumerable: true, configurable: true }); Object.defineProperty(DateUtils, "nowTime", { get: function () { return new Date().getTime(); }, enumerable: true, configurable: true }); Object.defineProperty(DateUtils, "today", { get: function () { var time = new Date(this.nowTime); var year = time.getFullYear(); var month = time.getMonth() + 1; var date = time.getDate(); return year + "-" + this.add(month) + "-" + this.add(date); }, enumerable: true, configurable: true }); DateUtils.timeDay = function (timeNum) { var time = new Date(timeNum); var year = time.getFullYear(); var month = time.getMonth() + 1; var date = time.getDate(); return year + "-" + this.add(month) + "-" + this.add(date); }; /** * 根据秒数格式化字符串 * @param second 秒数 * @param type 1:00:00:00 2:yyyy-mm-dd h:m:s 3:00:00 4:xx天前,xx小时前,xx分钟前 * @return */ DateUtils.getFormatBySecond = function (second, type) { if (type === void 0) { type = 1; } var str = ""; switch (type) { case 0: str = this.getFormatBySecond0(second); break; case 1: str = this.getFormatBySecond1(second); break; case 2: str = this.getFormatBySecond2(second); break; case 3: str = this.getFormatBySecond3(second); break; case 4: str = this.getFormatBySecond4(second); break; case 5: str = this.getFormatBySecond5(second); break; } return str; }; // 0: 00:00 DateUtils.getFormatBySecond0 = function (t) { if (t === void 0) { t = 0; } var minst = Math.floor(t / 60); var secondt = Math.floor(t % 60); var mins; var sens; if (minst == 0) { mins = "00"; } else if (minst < 10) { mins = "0" + minst; } else { mins = "" + minst; } if (secondt == 0) { sens = "00"; } else if (secondt < 10) { sens = "0" + secondt; } else { sens = "" + secondt; } return mins + ":" + sens; }; //1: 00:00:00 DateUtils.getFormatBySecond1 = function (t) { if (t === void 0) { t = 0; } var hourst = Math.floor(t / 3600); var hours; var day = ''; if (hourst == 0) { hours = "00"; } else { if (hourst < 10) hours = "0" + hourst; else { var h = hourst % 24; if (hourst >= 24) { hours = h < 10 ? "0" + h : '' + h; day = Math.floor(hourst / 24) + 'd '; } else hours = h < 10 ? "0" + h : '' + h; } } var minst = Math.floor((t - hourst * 3600) / 60); var secondt = Math.floor((t - hourst * 3600) % 60); var mins; var sens; if (minst == 0) { mins = "00"; } else if (minst < 10) { mins = "0" + minst; } else { mins = "" + minst; } if (secondt == 0) { sens = "00"; } else if (secondt < 10) { sens = "0" + secondt; } else { sens = "" + secondt; } return day + hours + ":" + mins + ":" + sens; }; //3: 00:00 DateUtils.getFormatBySecond3 = function (t) { if (t === void 0) { t = 0; } var hourst = Math.floor(t / 3600); var minst = Math.floor((t - hourst * 3600) / 60); var secondt = Math.floor((t - hourst * 3600) % 60); var mins; var sens; if (minst == 0) { mins = "00"; } else if (minst < 10) { mins = "0" + minst; } else { mins = "" + minst; } if (secondt == 0) { sens = "00"; } else if (secondt < 10) { sens = "0" + secondt; } else { sens = "" + secondt; } return mins + ":" + sens; }; //2:yyyy-mm-dd h:m:s DateUtils.getFormatBySecond2 = function (time) { var date = new Date(time); var year = date.getFullYear(); var month = date.getMonth() + 1; //返回的月份从0-11; var day = date.getDate(); var hours = date.getHours(); var minute = date.getMinutes(); var second = date.getSeconds(); return year + "-" + month + "-" + day + " " + hours + ":" + minute + ":" + second; }; //4:xx天前,xx小时前,xx分钟前 DateUtils.getFormatBySecond4 = function (time) { var t = Math.floor(time / 3600); if (t > 0) { if (t > 24) { return Math.floor(t / 24) + "天前"; } else { return t + "小时前"; } } else { return Math.floor(time / 60) + "分钟前"; } }; DateUtils.getFormatBySecond5 = function (time) { // 每个时间单位所对应的秒数 var oneDay = 3600 * 24; var oneHourst = 3600; var oneMinst = 60; var days = Math.floor(time / oneDay); var hourst = Math.floor(time % oneDay / oneHourst); var minst = Math.floor((time - hourst * oneHourst) / oneMinst); //Math.floor(time % oneDay % oneHourst / oneMinst); var secondt = Math.floor((time - hourst * oneHourst) % oneMinst); //time; var dayss = ""; var hourss = ""; var minss = ""; var secss = ""; if (time > 0) { //天 if (days == 0) { dayss = ""; //小时 if (hourst == 0) { hourss = ""; //分 if (minst == 0) { minss = ""; if (secondt == 0) { secss = ""; } else if (secondt < 10) { secss = "0" + secondt + "秒"; } else { secss = "" + secondt + "秒"; } return secss; } else { minss = "" + minst + "分钟"; if (secondt == 0) { secss = ""; } else if (secondt < 10) { secss = "0" + secondt + "秒"; } else { secss = "" + secondt + "秒"; } } return minss + secss; } else { hourss = hourst + "小时"; if (minst == 0) { minss = ""; if (secondt == 0) { secss = ""; } else if (secondt < 10) { secss = "0" + secondt + "秒"; } else { secss = "" + secondt + "秒"; } return hourss + secss; } else if (minst < 10) { minss = "0" + minst + "分钟"; } else { minss = "" + minst + "分钟"; } return hourss + minss; } } else { dayss = days + "天"; if (hourst == 0) { hourss = ""; } else { if (hourst < 10) hourss = "0" + hourst + "小时"; else hourss = "" + hourst + "小时"; ; } return dayss + hourss; } } return ""; }; DateUtils.add = function (num) { return num < 10 ? '0' + num : num; }; return DateUtils; }()); exports.default = DateUtils; },{}],18:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectPool_1 = require("./ObjectPool"); /* * name; */ var ObjectInstance = /** @class */ (function () { function ObjectInstance() { } ObjectInstance.get = function (cls) { var idx = this.clzs.indexOf(cls); return (idx >= 0 && this.objects[idx]) || this.create(cls); }; ObjectInstance.create = function (cls) { var obj = ObjectPool_1.default.pop(cls); this.objects.push(obj); this.clzs.push(cls); return obj; }; ObjectInstance.clzs = []; ObjectInstance.objects = []; return ObjectInstance; }()); exports.default = ObjectInstance; },{"./ObjectPool":19}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectPool = /** @class */ (function () { function ObjectPool() { } ObjectPool.pop = function (cls) { var idx = this.clsArr.indexOf(cls); if (idx < 0) { idx = this.clsArr.length; this.clsArr.push(cls); } var key = 'poolKey' + idx; var item = Laya.Pool.getItemByClass(key, cls); item.poolKey = key; return item; }; ObjectPool.push = function (item) { Laya.Pool.recover(item.poolKey, item); }; ObjectPool.clsArr = []; return ObjectPool; }()); exports.default = ObjectPool; },{}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ScaleButtonScript = /** @class */ (function () { function ScaleButtonScript() { this.delayTime = 0; this.minScale = 0; } Object.defineProperty(ScaleButtonScript.prototype, "owner", { /** *设置owner函数,可以直接获取到添加附加脚本的组件实例 **/ set: function (value) { this.monkeyBox = value; //自定义的脚本会有时序问题,所以在此添加一个延时 this.monkeyBox.frameOnce(2, this, this.onLoaded); }, enumerable: true, configurable: true }); ScaleButtonScript.prototype.onLoaded = function () { /* 设置按钮为单态按钮 ** 取值: ** 1:单态。图片不做切割,按钮的皮肤状态只有一种。 ** 2:两态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、按下和经过及选中状态皮肤。 ** 3:三态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、经过状态皮肤、按下和选中状态皮肤 */ //添加鼠标按下事件侦听。按时时缩小按钮。 this.monkeyBox.on(Laya.Event.MOUSE_DOWN, this, this.scaleSmall); //添加鼠标抬起事件侦听。抬起时还原按钮。 this.monkeyBox.on(Laya.Event.MOUSE_UP, this, this.scaleBig); //添加鼠标离开事件侦听。离开时还原按钮。 this.monkeyBox.on(Laya.Event.MOUSE_OUT, this, this.scaleBig); }; ScaleButtonScript.prototype.scaleSmall = function () { //缩小至0.8的缓动效果 Laya.Tween.to(this.monkeyBox, { scaleX: 0.8, scaleY: 0.8 }, 2); }; ScaleButtonScript.prototype.scaleBig = function () { //变大还原的缓动效果 Laya.Tween.to(this.monkeyBox, { scaleX: 1, scaleY: 1 }, 2); }; return ScaleButtonScript; }()); exports.default = ScaleButtonScript; },{}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Util = /** @class */ (function () { function Util() { } Util.prototype.load = function (res, onProgress) { var _this = this; return new Promise(function (suc, fail) { Laya.loader.load(res, Laya.Handler.create(_this, suc), onProgress); }); }; Util.prototype.setItem = function (key, value) { Laya.LocalStorage.setItem(key, value.toString()); }; Util.prototype.getItem = function (key) { return Laya.LocalStorage.getItem(key); }; Object.defineProperty(Util, "I", { get: function () { return this._instance || (this._instance = new Util); }, enumerable: true, configurable: true }); return Util; }()); exports.default = Util; var DataKey; (function (DataKey) { DataKey["cur_red_day_limit"] = "cur_red_day_limit"; DataKey["cur_shake_day_limit"] = "cur_shake_day_limit"; DataKey["shakeLastTime"] = "shakeLastTime"; DataKey["dataCNT"] = "dataCNT"; DataKey["todayCnt"] = "todayCnt"; DataKey["lastTime"] = "lastTime"; })(DataKey = exports.DataKey || (exports.DataKey = {})); },{}]},{},[2]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvYXBwL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvR2FtZUNvbmZpZy50cyIsInNyYy9NYWluLnRzIiwic3JjL1JlZERyYXdhbC50cyIsInNyYy9UZXN0U2NlbmUudHMiLCJzcmMvZXZlbnQvRXZlbnRDZW50ZXIudHMiLCJzcmMvZXZlbnQvRXZlbnRFbnVtLnRzIiwic3JjL3Nkay9BZE1hbmFnZXIudHMiLCJzcmMvc2RrL05hdGl2ZUFkLnRzIiwic3JjL3Nkay9QY1Nkay50cyIsInNyYy9zZGsvVFRBZFNkay50cyIsInNyYy9zZGsvVHJhY2tpbmdTZGsudHMiLCJzcmMvc2RrL21vZGVsL0Jhc2VNb2RlbC50cyIsInNyYy9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWwudHMiLCJzcmMvc2RrL21vZGVsL1NoYWtlTW9kZWwudHMiLCJzcmMvdWkvbGF5YU1heFVJLnRzIiwic3JjL3VpdGwvQXJyYXlVdGlscy50cyIsInNyYy91aXRsL0RhdGVVdGlscy50cyIsInNyYy91aXRsL09iamVjdEluc3RhbmNlLnRzIiwic3JjL3VpdGwvT2JqZWN0UG9vbC50cyIsInNyYy91aXRsL1NjYWxlQnV0dG9uU2NyaXB0LnRzIiwic3JjL3VpdGwvVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNWQSxnR0FBZ0c7QUFDaEcseUNBQW1DO0FBQ25DLDhEQUF3RDtBQUN4RCx5Q0FBbUM7QUFDbkMsMkNBQXFDO0FBQ3JDOztFQUVFO0FBQ0Y7SUFhSTtJQUFjLENBQUM7SUFDUixlQUFJLEdBQVg7UUFDSSxJQUFJLEdBQUcsR0FBYSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUM3QyxHQUFHLENBQUMs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QUFDLGFBQWEsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtB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Q0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7UUFDekQsQ0FBQzs7O09BQUE7SUFDTCxXQUFDO0FBQUQsQ0FqQkEsQUFpQkMsSUFBQTs7QUFFRCxJQUFZLE9BT1g7QUFQRCxXQUFZLE9BQU87SUFDZixrREFBdUMsQ0FBQTtJQUN2QyxzREFBMkMsQ0FBQTtJQUMzQywwQ0FBK0IsQ0FBQTtJQUMvQiw4QkFBbUIsQ0FBQTtJQUNuQixnQ0FBcUIsQ0FBQTtJQUNyQixnQ0FBcUIsQ0FBQTtBQUN6QixDQUFDLEVBUFcsT0FBTyxHQUFQLGVBQU8sS0FBUCxlQUFPLFFBT2xCIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlRoaXMgY2xhc3MgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTGF5YUFpcklERSwgcGxlYXNlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zLiAqL1xyXG5pbXBvcnQgVGVzdFNjZW5lIGZyb20gXCIuL1Rlc3RTY2VuZVwiXG5pbXBvcnQgU2NhbGVCdXR0b25TY3JpcHQgZnJvbSBcIi4vdWl0bC9TY2FsZUJ1dHRvblNjcmlwdFwiXG5pbXBvcnQgUmVkRHJhd2FsIGZyb20gXCIuL1JlZERyYXdhbFwiXG5pbXBvcnQgTmF0aXZlQWQgZnJvbSBcIi4vc2RrL05hdGl2ZUFkXCJcclxuLypcclxuKiDmuLjmiI/liJ3lp4vljJbphY3nva47XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDb25maWd7XHJcbiAgICBzdGF0aWMgd2lkdGg6bnVtYmVyPTc1MDtcclxuICAgIHN0YXRpYyBoZWlnaHQ6bnVtYmVyPTEzMzQ7XHJcbiAgICBzdGF0aWMgc2NhbGVNb2RlOnN0cmluZz1cImZpeGVkd2lkdGhcIjtcclxuICAgIHN0YXRpYyBzY3JlZW5Nb2RlOnN0cmluZz1cIm5vbmVcIjtcclxuICAgIHN0YXRpYyBhbGlnblY6c3RyaW5nPVwidG9wXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25IOnN0cmluZz1cImxlZnRcIjtcclxuICAgIHN0YXRpYyBzdGFydFNjZW5lOmFueT1cIlRlc3RTY2VuZS5zY2VuZVwiO1xyXG4gICAgc3RhdGljIHNjZW5lUm9vdDpzdHJpbmc9XCJcIjtcclxuICAgIHN0YXRpYyBkZWJ1Zzpib29sZWFuPWZhbHNlO1xyXG4gICAgc3RhdGljIHN0YXQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBwaHlzaWNzRGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBleHBvcnRTY2VuZVRvSnNvbjpib29sZWFuPXRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe31cclxuICAgIHN0YXRpYyBpbml0KCl7XHJcbiAgICAgICAgdmFyIHJlZzogRnVuY3Rpb24gPSBMYXlhLkNsYXNzVXRpbHMucmVnQ2xhc3M7XHJcbiAgICAgICAgcmVnKFwiVGVzdFNjZW5lLnRzXCIsVGVzdFNjZW5lKTtcbiAgICAgICAgcmVnKFwidWl0bC9TY2FsZUJ1dHRvblNjcmlwdC50c1wiLFNjYWxlQnV0dG9uU2NyaXB0KTtcbiAgICAgICAgcmVnKFwiUmVkRHJhd2FsLnRzXCIsUmVkRHJhd2FsKTtcbiAgICAgICAgcmVnKFwic2RrL05hdGl2ZUFkLnRzXCIsTmF0aXZlQWQpO1xyXG4gICAgfVxyXG59XHJcbkdhbWVDb25maWcuaW5pdCgpOyIsImltcG9ydCBHYW1lQ29uZmlnIGZyb20gXCIuL0dhbWVDb25maWdcIjtcclxuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9zZGsvQWRNYW5hZ2VyXCI7XHJcbmltcG9ydCBTaGFrZU1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9TaGFrZU1vZGVsXCI7XHJcbmltcG9ydCBQY1NkayBmcm9tIFwiLi9zZGsvUGNTZGtcIjtcclxuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xyXG5jbGFzcyBNYWluIHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdC8v5qC55o2uSURF6K6+572u5Yid5aeL5YyW5byV5pOOXHRcdFxyXG5cdFx0aWYgKHdpbmRvd1tcIkxheWEzRFwiXSkgTGF5YTNELmluaXQoR2FtZUNvbmZpZy53aWR0aCwgR2FtZUNvbmZpZy5oZWlnaHQpO1xyXG5cdFx0ZWxzZSBMYXlhLmluaXQoR2FtZUNvbmZpZy53aWR0aCwgR2FtZUNvbmZpZy5oZWlnaHQsIExheWFbXCJXZWJHTFwiXSk7XHJcblx0XHRMYXlhW1wiUGh5c2ljc1wiXSAmJiBMYXlhW1wiUGh5c2ljc1wiXS5lbmFibGUoKTtcclxuXHRcdExheWFbXCJEZWJ1Z1BhbmVsXCJdICYmIExheWFbXCJEZWJ1Z1BhbmVsXCJdLmVuYWJsZSgpO1xyXG5cdFx0TGF5YS5zdGFnZS5zY2FsZU1vZGUgPSBHYW1lQ29uZmlnLnNjYWxlTW9kZTtcclxuXHRcdExheWEuc3RhZ2Uuc2NyZWVuTW9kZSA9IEdhbWVDb25maWcuc2NyZWVuTW9kZTtcclxuXHRcdExheWEuc3RhZ2UuYWxpZ25WID0gR2FtZUNvbmZpZy5hbGlnblY7XHJcblx0XHRMYXlhLnN0YWdlLmFsaWduSCA9IEdhbWVDb25maWcuYWxpZ25IO1xyXG5cdFx0Ly/lhbzlrrnlvq7kv6HkuI3mlK/mjIHliqDovb1zY2VuZeWQjue8gOWcuuaZr1xyXG5cdFx0TGF5YS5VUkwuZXhwb3J0U2NlbmVUb0pzb24gPSBHYW1lQ29uZmlnLmV4cG9ydFNjZW5lVG9Kc29uO1xyXG5cclxuXHRcdC8v5omT5byA6LCD6K+V6Z2i5p2/77yI6YCa6L+HSURF6K6+572u6LCD6K+V5qih5byP77yM5oiW6ICFdXJs5Zyw5Z2A5aKe5YqgZGVidWc9dHJ1ZeWPguaVsO+8jOWdh+WPr+aJk+W8gOiwg+ivlemdouadv++8iVxyXG5cdFx0aWYgKEdhbWVDb25maWcuZGVidWcgfHwgTGF5YS5VdGlscy5nZXRRdWVyeVN0cmluZyhcImRlYnVnXCIpID09IFwidHJ1ZVwiKSBMYXlhLmVuYWJsZURlYnVnUGFuZWwoKTtcclxuXHRcdGlmIChHYW1lQ29uZmlnLnBoeXNpY3NEZWJ1ZyAmJiBMYXlhW1wiUGh5c2ljc0RlYnVnRHJhd1wiXSkgTGF5YVtcIlBoeXNpY3NEZWJ1Z0RyYXdcIl0uZW5hYmxlKCk7XHJcblx0XHRpZiAoR2FtZUNvbmZpZy5zdGF0KSBMYXlhLlN0YXQuc2hvdygpO1xyXG5cdFx0TGF5YS5hbGVydEdsb2JhbEVycm9yID0gdHJ1ZTtcclxuXHJcblx0XHQvL+a/gOa0u+i1hOa6kOeJiOacrOaOp+WItu+8jHZlcnNpb24uanNvbueUsUlEReWPkeW4g+WKn+iDveiHquWKqOeUn+aIkO+8jOWmguaenOayoeacieS5n+S4jeW9seWTjeWQjue7rea1geeoi1xyXG5cdFx0TGF5YS5SZXNvdXJjZVZlcnNpb24uZW5hYmxlKFwidmVyc2lvbi5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vblZlcnNpb25Mb2FkZWQpLCBMYXlhLlJlc291cmNlVmVyc2lvbi5GSUxFTkFNRV9WRVJTSU9OKTtcclxuXHR9XHJcblxyXG5cdG9uVmVyc2lvbkxvYWRlZCgpOiB2b2lkIHtcclxuXHRcdC8v5r+A5rS75aSn5bCP5Zu+5pig5bCE77yM5Yqg6L295bCP5Zu+55qE5pe25YCZ77yM5aaC5p6c5Y+R546w5bCP5Zu+5Zyo5aSn5Zu+5ZCI6ZuG6YeM6Z2i77yM5YiZ5LyY5YWI5Yqg6L295aSn5Zu+5ZCI6ZuG77yM6ICM5LiN5piv5bCP5Zu+XHJcblx0XHRMYXlhLkF0bGFzSW5mb01hbmFnZXIuZW5hYmxlKFwiZmlsZWNvbmZpZy5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkNvbmZpZ0xvYWRlZCkpO1xyXG5cdH1cclxuXHJcblx0b25Db25maWdMb2FkZWQoKTogdm9pZCB7XHJcblxyXG5cdFx0dGhpcy5pbml0RGF0YSgpO1xyXG5cdFx0Ly/liqDovb1JREXmjIflrprnmoTlnLrmma9cclxuXHRcdEdhbWVDb25maWcuc3RhcnRTY2VuZSAmJiBMYXlhLlNjZW5lLm9wZW4oR2FtZUNvbmZpZy5zdGFydFNjZW5lKTtcclxuXHR9XHJcblxyXG5cdC8qKuWIneWni+WMllNESyAqL1xyXG5cdGFzeW5jIGluaXREYXRhKCkge1xyXG5cdFx0Lyoq6ZqQ6JeP5ZCv5Yqo5bGPICovXHJcblx0XHRQY1Nkay5JLmhpZGVTcGxhc2goKVxyXG5cdFx0Lyoq5Yid5aeL5YyWYWRrIOiOt+WPlmFwcOmFjee9ruS/oeaBryAqL1xyXG5cdFx0UGNTZGsuSS5pbml0KCk7XHJcblx0XHQvKirpooTliqDovb3op4bpopEgKi9cclxuXHRcdEFkTWFuYWdlci5JLmluaXQoKTtcclxuXHRcdC8qKuiOt+WPlue6ouWMhemFjee9riDmkYfkuIDmkYcg562J6Z2Z5oCB5pWw5o2uICovXHJcblx0XHRhd2FpdCBQY1Nkay5JLmluaXRHYW1lQ29uZmlnKCk7XHJcblxyXG5cclxuXHRcdGF3YWl0IFJlZHBhY2tldE1vZGVsLkkuaW5pdCgpXHJcblxyXG4gICAgICAgIGF3YWl0IFNoYWtlTW9kZWwuSS5pbml0KCk7XHJcblx0fVxyXG59XHJcbi8v5r+A5rS75ZCv5Yqo57G7XHJcbm5ldyBNYWluKCk7XHJcbiIsImltcG9ydCBSZWRwYWNrZXRNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWxcIjtcbmltcG9ydCB7IEV2ZW50Q2VudGVyIH0gZnJvbSBcIi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuL2V2ZW50L0V2ZW50RW51bVwiO1xuaW1wb3J0IFBjU2RrIGZyb20gXCIuL3Nkay9QY1Nka1wiO1xuLyoqXG4gKiDkuLvnlYzpnaIgIOmHkeW4gemHkeminVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWREcmF3YWwgZXh0ZW5kcyBMYXlhLlNjcmlwdCB7XG4gICAgLyoqIEBwcm9wIHtuYW1lOmNvaW5sYWIsIHRpcHM6XCLph5HluIFcIiwgdHlwZTpOb2RlfSovXG4gICAgY29pbmxhYjogTGF5YS5MYWJlbDtcbiAgICAvKiogQHByb3Age25hbWU6dGlwbGFiLCB0aXBzOlwi5o+Q56S6XCIsIHR5cGU6Tm9kZX0qL1xuICAgIHRpcGxhYjogTGF5YS5MYWJlbDtcblxuICAgIHByaXZhdGUgdG90YWxDb2luOiBudW1iZXIgPSAxMTA7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuICAgIG9uU3RhcnQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhcigpO1xuICAgICAgICAvLyB0aGlzLnRpcGxhYi52aXNpYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIG9uRW5hYmxlKCkge1xuICAgICAgICBFdmVudENlbnRlci5hZGQoRXZlbnRFbnVtLkFQUF9TSE9XLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgICAgICBFdmVudENlbnRlci5hZGQoRXZlbnRFbnVtLlVQREFURV9DT0lOLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgIH1cblxuICAgIG9uRGlzYWJsZSgpIHtcbiAgICAgICAgRXZlbnRDZW50ZXIucmVtb3ZlKEV2ZW50RW51bS5BUFBfU0hPVywgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICAgICAgRXZlbnRDZW50ZXIucmVtb3ZlKEV2ZW50RW51bS5VUERBVEVfQ09JTiwgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVTdGFyKCkge1xuICAgICAgICBsZXQgY29pbiA9IGF3YWl0IFBjU2RrLkkubXlDb2luKCk7XG4gICAgICAgIHRoaXMudG90YWxDb2luID0gY29pbjtcbiAgICAgICAgdGhpcy5jb2lubGFiLnRleHQgPSAnJyArIGNvaW47XG4gICAgICAgIGxldCBzdHIgPSAn5Y+v5o+Q546wJztcbiAgICAgICAgLyoq5pu05paw5LiL5LiL5LiA5qyh5o+Q546w55qE6aKd5bqmICovXG4gICAgICAgIGxldCBuZXh0RHJhd2FsID0gYXdhaXQgIFBjU2RrLkkubWluV2l0aERyYXdhbCgpO1xuICAgICAgICBpZiAodGhpcy50b3RhbENvaW4gPiAwKSB7XG4gICAgICAgICAgICBsZXQgbGVmdENvaW4gPSBuZXh0RHJhd2FsIC0gdGhpcy50b3RhbENvaW47XG4gICAgICAgICAgICBpZiAobGVmdENvaW4gPiAwKVxuICAgICAgICAgICAgICAgIHN0ciA9IGDov5jlt64keyhsZWZ0Q29pbiAvIDEwMDAwKS50b0ZpeGVkKDMpfemHkemineWPr+aPkOeOsGA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXBsYWIudGV4dCA9IHN0cjtcbiAgICAgICAgdGhpcy50aXBsYWIudmlzaWJsZSA9IEJvb2xlYW4obmV4dERyYXdhbCk7XG4gICAgfVxufSIsImltcG9ydCB7IHVpIH0gZnJvbSBcIi4vdWkvbGF5YU1heFVJXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuL3Nkay9BZE1hbmFnZXJcIjtcbmltcG9ydCBTaGFrZU1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9TaGFrZU1vZGVsXCI7XG5pbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgUGNTZGsgZnJvbSBcIi4vc2RrL1BjU2RrXCI7XG5pbXBvcnQgTmF0aXZlQWQgZnJvbSBcIi4vc2RrL05hdGl2ZUFkXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi91aXRsL1V0aWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFNjZW5lIGV4dGVuZHMgdWkuVGVzdFNjZW5lVUkge1xuICAgIHByaXZhdGUgaXNMb25nVmlicmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvL+WFs+mXreWkmueCueinpuaOp++8jOWQpuWImeWwseaXoOaVjOS6hlxuICAgICAgICBMYXlhLk1vdXNlTWFuYWdlci5tdWx0aVRvdWNoRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tVGVzdFNjZW5lLS0tLS0tLScpXG4gICAgICAgIC8vIHRoaXMuTmF0aXZlQUQudmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgfVxuXG4gICAgb25FbmFibGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnRuU2VydmVyLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblNlcnZlcik7XG4gICAgICAgIHRoaXMuYnRuVmlicmF0ZS5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICBQY1Nkay5JLnZpYnJhdGUodGhpcy5pc0xvbmdWaWJyYXRlID8gMCA6IDEpO1xuICAgICAgICAgICAgdGhpcy5pc0xvbmdWaWJyYXRlID0gIXRoaXMuaXNMb25nVmlicmF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYnRuRHJhd2FsLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblBlcnNvbmFsKTtcbiAgICAgICAgdGhpcy5idG5JbnZpdGUub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5pbnZpdGF0aW9uKTtcbiAgICAgICAgdGhpcy5idG5fc2hha2Uub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy50b3VjaFNoYWtlKTtcbiAgICAgICAgdGhpcy5idG5QcmVsb2FkQUQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkQUQpO1xuICAgICAgICB0aGlzLmJ0blNob3dCYW5uZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93QmFubmVyKTtcbiAgICAgICAgdGhpcy5idG5TaG93RnVsbEFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0Z1bGxBZCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd05hdGl2ZUFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd05hdGl2ZUFkKTtcbiAgICAgICAgdGhpcy5idG5TaG93SW50ZXJBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dJbnRlckFkKTtcbiAgICAgICAgdGhpcy5idG5SZXdhcmRBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dSZXdhcmRBZCk7XG4gICAgICAgIHRoaXMuYnRuUmVkcGFja2V0Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblJlZHBhY2tldCk7XG5cbiAgICAgICAgdGhpcy5idG5QcmVWaWRlby5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnByZWxvYWRSZXdhcmRBZCk7XG4gICAgICAgIHRoaXMuYnRuUHJlRnVsbC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnByZWxvYWRGdWxsKTtcbiAgICAgICAgdGhpcy5idG5QcmVJbnNlcnQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkSW50ZXJBZCk7XG4gICAgICAgIHRoaXMuYnRuUHJlTmF0aXZlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMucHJlbG9hZE5hdGl2ZUFkKTtcbiAgICAgICAgdGhpcy5idG5DbG9zZUJhbm5lci5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLmNsb3NlQWRCYW5uZXIpO1xuICAgICAgICB0aGlzLmJ0bkNsb3NlTmF0aXZlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuY2xvc2VBZHZlckRpYWxvZyk7XG4gICAgICAgIHRoaXMuYnRuTWluV2l0aERyYXdhbC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm1pbldpdGhEcmF3YWwpO1xuXG4gICAgfVxuXG4gICAgLyoq6aKE5Yqg6L295bm/5ZGKICovXG4gICAgYXN5bmMgcHJlbG9hZEFEKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tcHJlbG9hZEFELS0tLS0tLScpXG4gICAgICAgIGF3YWl0IEFkTWFuYWdlci5JLnByZWxvYWRCYW5uZXIoKTtcbiAgICB9XG5cbiAgICBwcmVsb2FkUmV3YXJkQWQoKSB7XG4gICAgICAgIEFkTWFuYWdlci5JLnByZWxvYWRSZXdhcmRBZCgpO1xuICAgIH1cblxuICAgIHByZWxvYWRGdWxsKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5wcmVsb2FkRnVsbEFkKCk7XG4gICAgfVxuXG4gICAgcHJlbG9hZEludGVyQWQoKSB7XG4gICAgICAgIEFkTWFuYWdlci5JLnByZWxvYWRJbnRlckFkKCk7XG4gICAgfVxuXG4gICAgcHJlbG9hZE5hdGl2ZUFkKCkge1xuICAgICAgICB0aGlzLk5hdGl2ZUFELmdldENvbXBvbmVudChOYXRpdmVBZCkuaW5pdE5hdGl2ZUFkKDEpO1xuICAgIH1cblxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XG4gICAgICAgIEFkTWFuYWdlci5JLmNsb3NlQWR2ZXJEaWFsb2coKVxuICAgIH1cbiAgICBjbG9zZUFkQmFubmVyKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkQmFubmVyKClcbiAgICB9XG5cbiAgICAvKirmmL7npLrlhajlsY/lub/lkYogKi9cbiAgICBzaG93RnVsbEFkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0Z1bGxBZC0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93RnVsbEFkKCk7XG4gICAgfVxuICAgIC8qKuaYvuekumJhbm5lciAqL1xuICAgIHNob3dCYW5uZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93QmFubmVyLS0tLS0tLScpXG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dCYW5uZXIoKTtcbiAgICB9XG5cbiAgICAvKirkv6Hmga/mtYHlub/lkYogKi9cbiAgICBzaG93TmF0aXZlQWQoKSB7XG4gICAgICAgIHRoaXMuTmF0aXZlQUQuZ2V0Q29tcG9uZW50KE5hdGl2ZUFkKS5pbml0TmF0aXZlQWQoKTtcbiAgICB9XG5cbiAgICAvKirmj5LlsY/lub/lkYogKi9cbiAgICBzaG93SW50ZXJBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dJbnRlckFkLS0tLS0tLScpXG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dJbnRlckFkKCk7XG4gICAgfVxuICAgIC8qKua/gOWKseinhumikeW5v+WRiiAqL1xuICAgIGFzeW5jIHNob3dSZXdhcmRBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dSZXdhcmRBZC0tLS0tLS0nKVxuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoKTtcbiAgICAgICAgLyoq5oiQ5Yqf5ZCO5omn6KGM5a+55bqU55qE5aWW5YqxICovXG4gICAgfVxuICAgIC8qKuaEj+ingeWPjemmiCAqL1xuICAgIG9wZW5TZXJ2ZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1vcGVuU2VydmVyLS0tLS0tLScpXG4gICAgICAgIFBjU2RrLkkuZmVlZGJhY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuUmVkcGFja2V0KCkge1xuICAgICAgICBSZWRwYWNrZXRNb2RlbC5JLmNoZWNrUmVkcGFja2V0KClcbiAgICB9XG5cbiAgICBhc3luYyBtaW5XaXRoRHJhd2FsKCkge1xuICAgICAgICBsZXQgbW9uZXkgPSBhd2FpdCBQY1Nkay5JLm1pbldpdGhEcmF3YWwoKVxuICAgICAgICB0aGlzLm1pbldpdGhEcmF3YWxMYWIudGV4dCA9ICfmnIDkvY7mj5DnjrA6JyArIG1vbmV5O1xuICAgIH1cblxuXG4gICAgLyoq5omT5byA5Liq5Lq65Lit5b+DICovXG4gICAgb3BlblBlcnNvbmFsKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tb3BlblNlcnZlci0tLS0tLS0nKVxuICAgICAgICBQY1Nkay5JLnBlcnNvbmFsKDApO1xuICAgIH1cbiAgICAvKirpgoDor7flpb3lj4sgKi9cbiAgICBpbnZpdGF0aW9uKCkge1xuICAgICAgICBQY1Nkay5JLmludml0YXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxXHTph5HluIFcbiAgICAyXHTmv4DlirHop4bpopHlkI7ph5HluIFcbiAgICAzXHQ0IDUgNiA3IOa4uOaIj+S4reWvueW6lOeahOmBk+WFt1xuICAgIDhcdOepulxuICAgICAqL1xuICAgIHRvdWNoU2hha2UoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS10b3VjaFNoYWtlLS0tLS0tLScpXG4gICAgICAgIFBjU2RrLkkudmlicmF0ZSgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogMS7lm57ljrvmmJ/mmJ8g6YGT5YW3IFxuICAgICAgICAgKiAyLue6ouWMhSAgIOebtOaOpeiOt+W+l+K+puW4ge+8m+aIluiAheebtOaOpeW8uea/gOWKseinhumikeWQju+8jOiOt+W+l+K+puW4gVxuICAgICAgICAgKiAzLuaXoOmBk+WFt1xuICAgICAgICAgKiDnm7TmjqXlsZXivbDmj5LlsY9cbiAgICAgICAgICogICovXG4gICAgICAgIGxldCBkYXRhID0gU2hha2VNb2RlbC5JLmdldFNoYWtlVHlwZSgpO1xuICAgICAgICBjb25zb2xlLmxvZygn5pGH5LiA5pGH6I635Y+W57uT5p6c77yaJyArIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgICAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGU7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgLyoqICfosKLosKLlj4LkuI7vvIzkuIvmrKHlpb3ov5DvvIEnKi87XG4gICAgICAgICAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd0ludGVyQWQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvaW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICB0aGlzLndhdGNoQURDb2luKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wcyhkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFByb3BzKGRhdGEpIHtcbiAgICAgICAgbGV0IGJvb3N0ZXI7XG4gICAgICAgIGxldCByZXdhcmROdW0gPSBkYXRhLm51bTtcbiAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlpITnkIbmuLjmiI/kuK3nmoTpgZPlhbfmmL7npLpcbiAgICAgICAgICovXG4gICAgICAgIC8vIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAvLyAgICAgY2FzZSA0OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5SZW1vdmU7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDY6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLkNoYW5nZTtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgNTpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmVmcmVzaDtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgNzpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmFuZFJlbW92ZTtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgMzpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuU3RhcjtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JLm9wZW5Qb3B3aW4oUmVjZWl2ZVByb3BzUG9wd2luLCBib29zdGVyLCByZXdhcmROdW0pO1xuXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOeci+W5v+WRiuiOt+W+l+e6ouWMhVxuICAgICAqL1xuICAgIGFzeW5jIHdhdGNoQURDb2luKCkge1xuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoKTtcbiAgICAgICAgdGhpcy5nZXRDb2luKCk7XG4gICAgfVxuICAgIC8qKuebtOaOpeiOt+W+l+e6ouWMhSAqL1xuICAgIGdldENvaW4oKSB7XG4gICAgICAgIC8vXGLliLfmlrDmgLvph5HluIFcbiAgICAgICAgLy8gQXBwTWFuYWdlci5JLnJlZHBhY2tldC5nZXRSZXBhY2tldCgpXG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkkub3BlblBvcHdpbihSZWRQYWNrZXRSZXdhcmQsIDIpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi9FdmVudEVudW1cIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgY2xhc3MgRXZlbnRDZW50ZXIge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTGF5YS5FdmVudERpc3BhdGNoZXI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IEkoKTogTGF5YS5FdmVudERpc3BhdGNoZXIge1xuICAgICAgICB3aW5kb3dbJ2V2J10gPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlIHx8ICh0aGlzLl9pbnN0YW5jZSA9IG5ldyBMYXlhLkV2ZW50RGlzcGF0Y2hlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbWl0KGV2ZW50OiBFdmVudEVudW0sIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5JLmV2ZW50KGV2ZW50LnRvU3RyaW5nKCksIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWRkKHR5cGU6IEV2ZW50RW51bSwgY2FsbGVyOiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiwgYXJncz86IEFycmF5PGFueT4pIHtcbiAgICAgICAgdGhpcy5JLm9uKHR5cGUudG9TdHJpbmcoKSwgY2FsbGVyLCBsaXN0ZW5lciwgYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmUodHlwZTogRXZlbnRFbnVtLCBjYWxsZXI6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuSS5vZmYodHlwZS50b1N0cmluZygpLCBjYWxsZXIsIGxpc3RlbmVyKTtcbiAgICB9XG59IiwiZXhwb3J0IGVudW0gRXZlbnRFbnVtIHtcblxuXHRDSEVDS19SRURQQUNLRVQgPSA8YW55PidjaGVja19yZWRwYWNrZXQnLFxuXHRBUFBfU0hPVyA9IDxhbnk+J2FwcC5zaG93Jyxcblx0QVBQX0hJREUgPSA8YW55PidhcHAuaGlkZScsXG5cblxuXHRVUERBVEVfQ09JTiA9IDxhbnk+J3VwZGF0ZS5jb2luJyxcblxufSIsImltcG9ydCBUVEFkU2RrIGZyb20gXCIuL1RUQWRTZGtcIjtcclxuaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZE1hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBsYXN0VmlkZW9UaW1lOiBudW1iZXI7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZFJld2FyZEFkKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5zaG93UmV3YXJkVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkRnVsbEFkKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZEludGVyQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkTmF0aXZlQWQoKXtcclxuICAgICAgICAvLyBUVEFkU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmNsb3NlQWR2ZXJEaWFsb2coKVxyXG4gICAgfVxyXG4gICAgY2xvc2VBZEJhbm5lcigpIHtcclxuICAgICAgICBUVEFkU2RrLkkuY2xvc2VBZEJhbm5lcigpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd1Jld2FyZEFkKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBUVEFkU2RrLkkuc2hvd1Jld2FyZFZpZGVvQWQoKTtcclxuICAgICAgICAgICAgdGhpcy5sYXN0VmlkZW9UaW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIHNob3dGdWxsQWQoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoKTtcclxuICAgICAgICAgICAgdGhpcy5wcmVsb2FkRnVsbEFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dJbnRlckFkKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBUVEFkU2RrLkkuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEludGVyQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVsb2FkSW50ZXJBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjaGVja1ZpZGVvSW5DZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0VmlkZW9UaW1lICYmIChMYXlhLnRpbWVyLmN1cnJUaW1lciAtIHRoaXMubGFzdFZpZGVvVGltZSA8PSAzMDAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Jhbm5lcigpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZEJhbm5lckV4cHJlc3NBZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgc2hvd05hdGl2ZUFkKHgsIHksIHcsIGgscHJlbG9hZD0wKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWROYXRpdmVFeHByZXNzQWQoeCwgeSwgdywgaCxwcmVsb2FkKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBnZXQgSSgpOiBBZE1hbmFnZXIge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoQWRNYW5hZ2VyKTtcclxuICAgIH1cclxufVxyXG5cclxuIiwiaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9BZE1hbmFnZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF0aXZlQWQgZXh0ZW5kcyBMYXlhLlNjcmlwdCB7XG5cbiAgIHB1YmxpYyBpbml0TmF0aXZlQWQocHJlbG9hZD0wKXtcbiAgICAgICAgbGV0IGdsb2JhbFBvaW50ID0gdGhpcy5pdGVtLmxvY2FsVG9HbG9iYWwoTGF5YS5Qb2ludC5FTVBUWSwgdHJ1ZSk7XG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dOYXRpdmVBZChnbG9iYWxQb2ludC54LCBnbG9iYWxQb2ludC55LCB0aGlzLml0ZW0ud2lkdGgsIHRoaXMuaXRlbS5oZWlnaHQscHJlbG9hZCk7XG4gICAgfVxuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xuICAgICAgIHRoaXMuaW5pdE5hdGl2ZUFkKCk7ICAgXG4gICAgfVxuXG4gICAgb25EaXNhYmxlKCk6IHZvaWQge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkdmVyRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXRlbSgpOiBMYXlhLlZpZXcge1xuICAgICAgICByZXR1cm4gdGhpcy5vd25lciBhcyBhbnk7XG4gICAgfVxufSIsImltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuLi9ldmVudC9FdmVudEVudW1cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGNTZGsge1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfY2hhbm5lbDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3ZlcnNpb246IHN0cmluZztcbiAgICBwcml2YXRlIF9sZXZlbDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2dhbWVDb25maWc6IG51bWJlcjtcblxuICAgIHB1YmxpYyBwYW5nb2xpbklkOiBzdHJpbmc7XG4gICAgcHVibGljIGFkbmV0SWQ6IHN0cmluZztcblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMuZ2V0U3lzdGVtSW5mbygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG15QnJpZGdlKCkge1xuICAgICAgICBpZiAoTXlCcmlkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBNeUJyaWRnZTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAvKirojrflj5bln7rmnKzniYjmnKzkv6Hmga/ku6Xlj4rmiYvmnLrnmoTphY3nva4gKi9cbiAgICBwcml2YXRlIGdldFN5c3RlbUluZm8oa2V5OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGxldCByZXQgPSB0aGlzLm15QnJpZGdlLmdldFN5c3RlbUluZm8oa2V5KTtcbiAgICAgICAgbGV0IHsgdywgaCwgdmVyc2lvbk5hbWUsIGNoYW5uZWwsIHBhbmdvbGluLCBhZG5ldCwgbGV2ZWwgfSA9IEpTT04ucGFyc2UocmV0KTtcbiAgICAgICAgW3RoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRoaXMuX3ZlcnNpb24sXG4gICAgICAgIHRoaXMuX2NoYW5uZWwsIHRoaXMucGFuZ29saW5JZCxcbiAgICAgICAgdGhpcy5hZG5ldElkLCB0aGlzLl9sZXZlbF0gPSBbdywgaCwgdmVyc2lvbk5hbWUsIGNoYW5uZWwsIHBhbmdvbGluLCBhZG5ldCwgbGV2ZWxdO1xuICAgIH1cblxuICAgIGluaXRHYW1lQ29uZmlnKCkge1xuICAgICAgICB0aGlzLl9nYW1lQ29uZmlnID0gdGhpcy5nZXRHYW1lQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6ZyH5YqoXG4gICAgICogQHBhcmFtIGtleSAwIOefremch+WKqCAxIOmVv+mch+WKqFxuICAgICAqL1xuICAgIHZpYnJhdGUoa2V5OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uub3BlblN5c3RlbUZ1bihrZXkpO1xuICAgIH1cblxuICAgIC8qKumakOiXj+WQr+WKqOWxjyAqL1xuICAgIGhpZGVTcGxhc2goKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuaGlkZVNwbGFzaCgpO1xuICAgIH1cblxuICAgIC8qKuW8ueWHuuaPkOeOsCAqL1xuICAgIHdpdGhEcmF3YWwoKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uud2l0aERyYXdhbCgpO1xuICAgIH1cbiAgICAvKirmhI/op4Hlj43ppoggKi9cbiAgICBmZWVkYmFjaygpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5mZWVkYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBrZXkg6buY6K6kMCDvvIznrb7liLAgMVxuICAgICAqL1xuICAgIHBlcnNvbmFsKGtleSA9IDApIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5wZXJzb25hbChrZXkpO1xuICAgIH1cbiAgICAvKirpgoDor7flpb3lj4sqL1xuICAgIGludml0YXRpb24oKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuaW52aXRhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDojrflj5bph5HluIHphY3ooahcbiAgICAgKiBAcGFyYW0ga2V5IDHnuqLljIUgICAyIOaRh+S4gOaRh+e6ouWMhVxuICAgICAqL1xuICAgIGdldEdhbWVDb25maWcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm15QnJpZGdlLmdldEdhbWVDb25maWcoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLWdldEdhbWVDb25maWctLS0tLS0tJyArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOimgeaxguWPkeaUvumHkeW4gVxuICAgICAqIEBwYXJhbSBrZXkgMee6ouWMhVxuICAgICAqL1xuICAgIGFzeW5jIGFkZEdvbGQoa2V5KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXlCcmlkZ2UuYWRkR29sZChrZXksIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG4gICAgLyoq6I635Y+W5oC76YeR5biBICovXG4gICAgYXN5bmMgbXlDb2luKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLm15Q29pbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGFbJ2NvaW4nXSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cblxuICAgIC8qKuiOt+WPluW9k+WJjeaPkOeOsOeahOaho+S9jSAqL1xuICAgIGFzeW5jIG1pbldpdGhEcmF3YWwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXlCcmlkZ2UubWluV2l0aERyYXdhbChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGFbJ21vbmV5J10pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoq5LiK5oql5Z+L54K5ICovXG4gICAgYXBwRG90TG9nKGtleTogc3RyaW5nLCB2YWx1ZT8pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5hcHBEb3RMb2coa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKueDreS6keaJk+eCuSAqL1xuICAgIGFwcERvdFRyYWNLaW5nKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuYXBwRG90VHJhY0tpbmcoa2V5KTtcbiAgICB9XG5cbiAgICBzZXRDYWxsYmFjayhmdW5OYW1lOiBzdHJpbmcsIHByYW1hcz86IGFueSkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2V0Q2FsbGJhY2stLS0tIHRoaXMubXlCcmlkZ2UtLS0nICsgSlNPTi5zdHJpbmdpZnkodGhpcy5teUJyaWRnZSkpXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm15QnJpZGdlW2Z1bk5hbWVdKHByYW1hcywgcmVzID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgeyBjb2RlLCBkYXRhIH0gPSBKU09OLnBhcnNlKHJlcyk7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuY2xvc2VBZHZlckRpYWxvZygpO1xuICAgIH1cbiAgICBjbG9zZUFkQmFubmVyKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmNsb3NlQWRCYW5uZXIoKTtcbiAgICB9XG4gICAgLyoq5r+A5Yqx6KeG6aKRICovXG4gICAgc2hvd1Jld2FyZFZpZGVvQWQodmFsdWU6IElWaWRlbywgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5zaG93UmV3YXJkVmlkZW9BZCh2YWx1ZSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoqIOWFqOWxj+W5v+WRiiovXG4gICAgbG9hZEZ1bGxTY3JlZW5WaWRlb0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5zaG93UmV3YXJkVmlkZW9BZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKirkv6Hmga/mtYHlub/lkYogKi9cbiAgICBsb2FkTmF0aXZlRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkTmF0aXZlRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKmJhbm5lciAqL1xuICAgIGxvYWRCYW5uZXJFeHByZXNzQWQoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmxvYWRCYW5uZXJFeHByZXNzQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoq5o+S5bGP5bm/5ZGKICovXG4gICAgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5zaG93SW50ZXJhY3Rpb25FeHByZXNzQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG5cbiAgICBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgICB9XG4gICAgZ2V0IHdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgZ2V0IGhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgZ2V0IGNoYW5uZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFubmVsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgYnJpZGdlKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZ2FtZUNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dhbWVDb25maWc7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgSSgpOiBQY1NkayB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoUGNTZGspO1xuICAgIH1cbn1cbi8vICAgICAvL+i/memHjOaYr+a1j+iniOWZqOeOr+Wig+S4i++8jCDmjqXmlLZ3ZWLkvKDov4fmnaXnmoTmtojmga9cbndpbmRvdy5vbk15QnJpZGdlUmVhZHkgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJvbk15QnJpZGdlUmVhZHkgbG9hZCBmaW5pc2gsIGNvc3Q6XCIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpICsgXCJtc1wiKTtcbiAgICBNeUJyaWRnZS5BcHAub25SZXN1bWUgPSAoLi4ucmV0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgIGxheWEgb25SZXN1bWUnLCByZXQpXG4gICAgICAgIEV2ZW50Q2VudGVyLmVtaXQoRXZlbnRFbnVtLkFQUF9TSE9XKTtcbiAgICB9XG4gICAgTXlCcmlkZ2UuQXBwLm9uUGF1c2UgPSAoLi4ucmV0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgbGF5YSBvblBhdXNlJywgcmV0KVxuICAgICAgICBFdmVudENlbnRlci5lbWl0KEV2ZW50RW51bS5BUFBfSElERSk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgSVZpZGVvIHtcbiAgICBwcmVsb2FkaW5nOiBudW1iZXIsXG4gICAgdHlwZTogbnVtYmVyLFxufSIsImltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5pbXBvcnQgUGNTZGsgZnJvbSBcIi4vUGNTZGtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRUQWRTZGsge1xyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBwcmVsb2FkICAwIOebtOaOpeWKoOi9ve+8mzEg6aKE5Yqg6L29XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNob3dSZXdhcmRWaWRlb0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdHlwZTogMSxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgUGNTZGsuSS5zaG93UmV3YXJkVmlkZW9BZChkYXRhLCByZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSwgbWVzc2FnZSB9ID0gSlNPTi5wYXJzZShyZXQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAtMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIC8qKifmmoLml6Dop4bpopHlub/lkYrvvIHmr4/ml6Uw54K56YeN572uJyovO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3VuQ29tcGxldGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRGdWxsU2NyZWVuVmlkZW9BZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IFBjU2RrLkkud2lkdGgsXHJcbiAgICAgICAgICAgIGg6IFBjU2RrLkkud2lkdGggKiA5MCAvIDYwMCxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogMCxcclxuICAgICAgICAgICAgdHlwZTogMVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBQY1Nkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZChKU09OLnN0cmluZ2lmeShkYXRhKSxyZXM9PntcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZE5hdGl2ZUV4cHJlc3NBZCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0eXBlID0gMSwgcHJlbG9hZDogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIGxldCBzY2FsZVggPSBQY1Nkay5JLndpZHRoIC8gTGF5YS5zdGFnZS53aWR0aDtcclxuICAgICAgICBsZXQgc2NhbGVZID0gUGNTZGsuSS5oZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICAgICAgdzogd2lkdGggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgIGg6IGhlaWdodCAqIHNjYWxlWSxcclxuICAgICAgICAgICAgbGVmdDogeCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgdG9wOiB5ICogc2NhbGVZXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFBjU2RrLkkubG9hZE5hdGl2ZUV4cHJlc3NBZChKU09OLnN0cmluZ2lmeShkYXRhKSxyZXM9PntcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEJhbm5lckV4cHJlc3NBZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IFBjU2RrLkkud2lkdGgsXHJcbiAgICAgICAgICAgIGg6IFBjU2RrLkkud2lkdGggKiA5MCAvIDYwMCxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICAgICAgdHlwZTogMVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBQY1Nkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoSlNPTi5zdHJpbmdpZnkoZGF0YSkscmVzPT57XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlcylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XHJcbiAgICAgICAgUGNTZGsuSS5jbG9zZUFkdmVyRGlhbG9nKCk7XHJcbiAgICB9XHJcbiAgICBjbG9zZUFkQmFubmVyKCkge1xyXG4gICAgICAgIFBjU2RrLkkuY2xvc2VBZEJhbm5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IFBjU2RrLkkud2lkdGggKiAwLjgsXHJcbiAgICAgICAgICAgIGg6IFBjU2RrLkkuaGVpZ2h0LFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXNDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBQY1Nkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChKU09OLnN0cmluZ2lmeShkYXRhKSxyZXM9PntcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IFRUQWRTZGsge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoVFRBZFNkaykgYXMgVFRBZFNkaztcclxuICAgIH1cclxufSIsImltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5pbXBvcnQgUGNTZGsgZnJvbSBcIi4vUGNTZGtcIjtcclxuLyoqXHJcbiAqIOS4iuaKpeeDreS6keWfi+eCueK9h+W/l1xyXG4gKiDlhbfkvZPnmoTmiZPngrnpnIDopoHot5/ov5DokKXogZTns7tcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYWNraW5nU2RrIHtcclxuICAgIGRvdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIFBjU2RrLkkuYXBwRG90VHJhY0tpbmcoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVHJhY2tpbmdTZGsge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoVHJhY2tpbmdTZGspIGFzIFRyYWNraW5nU2RrO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUcmFja2luZ0tleSB7XHJcbiAgICBSZWRQYWNrMSA9ICdldmVudF81JyxcclxuICAgIFJlZFBhY2s1ID0gJ2V2ZW50XzYnXHJcbn1cclxuIiwiaW1wb3J0IEFycmF5VXRpbHMgZnJvbSBcIi4uLy4uL3VpdGwvQXJyYXlVdGlsc1wiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VNb2RlbCB7XG4gICAgcHJvdGVjdGVkIF9kYXRhOiBhbnkgPSB7fTtcbiAgICBwcml2YXRlIHVwZGF0ZUFycjogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gICAgcHJpdmF0ZSBrZXlVcGRhdGVBcnI6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZShkYXRhOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGEsXG4gICAgICAgICAgICAuLi5kYXRhXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBcnIuZm9yRWFjaChmdW5jID0+IHtcbiAgICAgICAgICAgIGZ1bmModGhpcy5fZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmtleVVwZGF0ZUFycikge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5rZXlVcGRhdGVBcnJba2V5XTtcbiAgICAgICAgICAgICAgICBhcnIgJiYgYXJyLmZvckVhY2goZnVuYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmModmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd2FpdEZvcihrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2RhdGFba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjYiA9IGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmVXBkYXRlKGNiLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25VcGRhdGUoY2IsIGtleSwgdHJ1ZSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG9uVXBkYXRlKGZ1bmM6IEZ1bmN0aW9uLCBrZXk/OiBzdHJpbmcsIHJ1bjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgcnVuICYmIHZhbHVlICE9IG51bGwgJiYgZnVuYyh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5rZXlVcGRhdGVBcnJba2V5XTtcbiAgICAgICAgICAgICFhcnIgJiYgKHRoaXMua2V5VXBkYXRlQXJyW2tleV0gPSBhcnIgPSBbXSk7XG4gICAgICAgICAgICBhcnIucHVzaChmdW5jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1biAmJiBmdW5jKHRoaXMuX2RhdGEpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBcnIucHVzaChmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvZmZVcGRhdGUoZnVuYzogRnVuY3Rpb24sIGtleT86IHN0cmluZykge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBBcnJheVV0aWxzLnJlbW92ZUZyb21BcnIodGhpcy5rZXlVcGRhdGVBcnJba2V5XSwgZnVuYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBBcnJheVV0aWxzLnJlbW92ZUZyb21BcnIodGhpcy51cGRhdGVBcnIsIGZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyR2FtZSgpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cbn0iLCJpbXBvcnQgQmFzZU1vZGVsIGZyb20gXCIuL0Jhc2VNb2RlbFwiO1xuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi4vLi4vc2RrL0FkTWFuYWdlclwiO1xuaW1wb3J0IFRlYVNkaywgeyBEb3RLZXkgfSBmcm9tIFwiLi4vLi4vc2RrL1RlYVNka1wiO1xuaW1wb3J0IFRyYWNraW5nU2RrLCB7IFRyYWNraW5nS2V5IH0gZnJvbSBcIi4uLy4uL3Nkay9UcmFja2luZ1Nka1wiO1xuaW1wb3J0IERhdGVVdGlscyBmcm9tIFwiLi4vLi4vdWl0bC9EYXRlVXRpbHNcIjtcbmltcG9ydCBVdGlsLCB7IERhdGFLZXkgfSBmcm9tIFwiLi4vLi4vdWl0bC9VdGlsXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uLy4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCB7IEV2ZW50Q2VudGVyIH0gZnJvbSBcIi4uLy4uL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi4vLi4vZXZlbnQvRXZlbnRFbnVtXCI7XG5pbXBvcnQgUGNTZGsgZnJvbSBcIi4uL1BjU2RrXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZHBhY2tldE1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgICBwcml2YXRlIE1BWCA9IDIwO1xuICAgIC8qKuW9k+WkqemihuWPlue6ouWMheeahOacgOWkp+asoeaVsCAqL1xuICAgIHByaXZhdGUgREFZX01BWF9DTlQgPSA1MDtcbiAgICBwcml2YXRlIGNvbmY6IGFueTtcbiAgICBwdWJsaWMgY3VyUmVkcGFja2V0OiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBjb25mTGVuOiBudW1iZXIgPSAwO1xuXG4gICAgLyoq5Yid5aeL5YyW57qi5YyF6YWN572uICovXG4gICAgYXN5bmMgaW5pdCgpIHtcblxuICAgICAgICBsZXQgYXJyID0gYXdhaXQgdGhpcy5nZXRSZWRDb25maWcoKTtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLVJlZHBhY2tldE1vZGVsLS0tLS0tLScgKyBKU09OLnN0cmluZ2lmeShhcnIpKVxuICAgICAgICBsZXQgY2FzaCA9IDA7XG4gICAgICAgIHRoaXMuY29uZiA9IHt9O1xuICAgICAgICBhcnIuZm9yRWFjaChjb25mRGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZbY29uZkRhdGEuaWRdID0gY29uZkRhdGE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaW5pdERhdGEoKSk7XG4gICAgICAgIHRoaXMuY29uZkxlbiA9IHRoaXMuY29uZi5sZW5ndGg7XG5cbiAgICB9XG5cblxuXG4gICAgaW5pdERhdGEoKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFJlZHBhY2tldERhdGE7XG4gICAgICAgIGxldCBsYXN0VGltZSA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkubGFzdFRpbWUpIHx8ICcwJztcbiAgICAgICAgZGF0YS5sYXN0VGltZSA9IHBhcnNlSW50KGxhc3RUaW1lKTtcblxuICAgICAgICBsZXQgbGFzdCA9IERhdGVVdGlscy50aW1lRGF5KGRhdGEubGFzdFRpbWUpO1xuICAgICAgICBsZXQgdG9kYXkgPSBEYXRlVXRpbHMudG9kYXk7XG4gICAgICAgIGlmIChsYXN0ICE9IHRvZGF5KSB7XG4gICAgICAgICAgICBkYXRhLnRvZGF5Q250ID0gMDtcbiAgICAgICAgICAgIGxhc3RUaW1lID0gRGF0ZVV0aWxzLm5vd1RpbWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkubGFzdFRpbWUsIGxhc3RUaW1lKVxuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS50b2RheUNudCwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9kYXlDbnQgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5LnRvZGF5Q250KSB8fCAnMCc7XG4gICAgICAgICAgICBkYXRhLnRvZGF5Q250ID0gcGFyc2VJbnQodG9kYXlDbnQpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEubGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XG4gICAgICAgIGxldCBkYXRhQ250ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5kYXRhQ05UKSB8fCAnMCc7XG4gICAgICAgIGRhdGEuY250ID0gcGFyc2VJbnQoZGF0YUNudCk7XG4gICAgICAgIGRhdGEubGlzdCA9IFtdO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cblxuICAgIGFzeW5jIGdldFJlZENvbmZpZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFBjU2RrLkkuZ2FtZUNvbmZpZztcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLSDojrflj5bphY3nva7pnZnmgIHooagtLS0tLScgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IHRoaXMubG9hZEdvbGRDZmcocmVzdWx0Wydjb2luX2NvbmZpZyddWzBdKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tIOiOt+WPlue6ouWMhemdmeaAgeihqC0tLS0tJyArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnSnNvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFBjU2RrLkkuaW5pdEdhbWVDb25maWcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsb2FkR29sZENmZyhyZXM6IHN0cmluZykge1xuICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IHRoaXMubG9hZChyZXMpO1xuICAgICAgICByZXR1cm4gY29uZmlnSnNvbjtcbiAgICB9XG5cbiAgICBsb2FkKHJlcywgb25Qcm9ncmVzcz86IExheWEuSGFuZGxlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoc3VjLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHJlcywgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBzdWMpLCBvblByb2dyZXNzKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja1JlZHBhY2tldCgpIHtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLnRvZGF5Q250ID49IHRoaXMuREFZX01BWF9DTlQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFkTWFuYWdlci5JLmNoZWNrVmlkZW9JbkNkKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLyoq57qi5YyF6I635Y+W5ZCO5rKh5pyJ55yL5bm/5ZGK6aKG5Y+W77yM5YaN5qyh6I635b6X57qi5YyF55qE5py65Lya77yM5LiN5Lya6I635Y+W57qi5YyF77yMIOiHquW3seS5n+WPr+S7peWkhOeQhuaIkCDlr7nlupTnmoTnuqLljIXmj5DphpLmiJbkuI3pnIDopoHov5nph4znmoTliKTmlq0gKi9cbiAgICAgICAgaWYgKHRoaXMuY3VyUmVkcGFja2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gdGhpcy5kYXRhLmNudCkgdGhpcy5kYXRhLmNudCA9IDA7XG4gICAgICAgIGxldCBjbnQgPSB0aGlzLmRhdGEuY250O1xuICAgICAgICBpZiAoY250ID49IHRoaXMuY29uZkxlbikgY250ID0gdGhpcy5jb25mTGVuIC0gMTtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmNvbmZbY250ICsgMV07XG4gICAgICAgIGxldCByYW4yID0gTWF0aC5yYW5kb20oKTtcblxuICAgICAgICBpZiAoZGF0YSAmJiByYW4yIDwgZGF0YS5wZXIpIHtcbiAgICAgICAgICAgIGxldCBjYXNoID0gMC4wMDAwMDE7XG4gICAgICAgICAgICB0aGlzLmN1clJlZHBhY2tldCA9IGNhc2g7XG4gICAgICAgICAgICAvLyoq5by55Ye657qi5YyF55qE55WM6Z2iLCAg5pqC5pe25aSE55CG5oiQIOebtOaOpeeci+W5v+WRiuiOt+WPlumHkeW4gSAqL1xuICAgICAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKClcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0g6Kem5Y+R5LqG57qi5YyFLS0tLS0nKVxuICAgICAgICAgICAgdGhpcy5nZXRSZXBhY2tldCgpXG4gICAgICAgICAgICAvKirmm7TmlrDln7rmnKzmmL7npLogKi9cbiAgICAgICAgICAgIEV2ZW50Q2VudGVyLmVtaXQoRXZlbnRFbnVtLlVQREFURV9DT0lOKTtcblxuICAgICAgICAgICAgLyoqKiAqL1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldFJlcGFja2V0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VyUmVkcGFja2V0KSByZXR1cm47XG4gICAgICAgIHRoaXMuZGF0YS5jbnQgKz0gMTtcbiAgICAgICAgdGhpcy5kYXRhLmxpc3QucHVzaCh0aGlzLmN1clJlZHBhY2tldCk7XG4gICAgICAgIHRoaXMuZGF0YS5sYXN0VGltZSA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmRhdGEudG9kYXlDbnQgKz0gMTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jbnQgPT0gMSlcbiAgICAgICAgICAgIFRyYWNraW5nU2RrLkkuZG90KFRyYWNraW5nS2V5LlJlZFBhY2sxKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jbnQgPT0gNSlcbiAgICAgICAgICAgIFRyYWNraW5nU2RrLkkuZG90KFRyYWNraW5nS2V5LlJlZFBhY2s1KTtcbiAgICAgICAgdGhpcy5jdXJSZWRwYWNrZXQgPSAwO1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmRhdGFDTlQsIHRoaXMuZGF0YS5jbnQpO1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnRvZGF5Q250LCB0aGlzLmRhdGEudG9kYXlDbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqICovXG4gICAgYXN5bmMgZ2V0Q3VyUmVkcGFja2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJSZWRwYWNrZXQ7XG4gICAgfVxuXG4gICAgZ2V0IGRhdGEoKTogUmVkcGFja2V0RGF0YSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICAvKirojrflj5bmgLvlhbHnmoTph5HluIHmlbAgKi9cbiAgICBhc3luYyBnZXRUb3RhbENvaW4oKSB7XG4gICAgICAgIGxldCB0b3RhbENvaW4gPSBhd2FpdCBQY1Nkay5JLm15Q29pbigpO1xuICAgICAgICByZXR1cm4gdG90YWxDb2luO1xuICAgIH1cbiAgICAvKirojrflj5bmnKzmrKHlpZblirHnmoTph5HluIHmlbAgKi9cbiAgICBhc3luYyBhZGRDb2luKGtleTogbnVtYmVyID0gMSkge1xuICAgICAgICBsZXQgY29pbkRhdGEgPSBhd2FpdCBQY1Nkay5JLmFkZEdvbGQoa2V5KTtcbiAgICAgICAgcmV0dXJuIGNvaW5EYXRhWydjb2luJ107XG4gICAgfVxuXG4gICAgLyoq6I635Y+W5pyA5L2O5o+Q5qGjICovXG4gICAgYXN5bmMgIG1pbldpdGhEcmF3YWwoKSB7XG4gICAgICAgIGxldCBtaW5Db2luID0gYXdhaXQgUGNTZGsuSS5taW5XaXRoRHJhd2FsKCk7XG4gICAgICAgIHJldHVybiBtaW5Db2luO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogUmVkcGFja2V0TW9kZWwge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFJlZHBhY2tldE1vZGVsKSBhcyBSZWRwYWNrZXRNb2RlbDtcbiAgICB9XG59XG5cbmNsYXNzIFJlZHBhY2tldERhdGEge1xuICAgIGNudDogbnVtYmVyO1xuICAgIGxpc3Q6IEFycmF5PG51bWJlcj47XG4gICAgbGFzdFRpbWU6IG51bWJlcjtcbiAgICB0b2RheUNudDogbnVtYmVyO1xufVxuXG5jbGFzcyBSZWRwYWNrZXRDb25maWdEYXRhIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIHBlcjogbnVtYmVyO1xuICAgIGNhc2g6IG51bWJlcjtcbn0iLCJpbXBvcnQgQmFzZU1vZGVsIGZyb20gXCIuL0Jhc2VNb2RlbFwiO1xuaW1wb3J0IERhdGVVdGlscyBmcm9tIFwiLi4vLi4vdWl0bC9EYXRlVXRpbHNcIjtcbmltcG9ydCBVdGlsLCB7IERhdGFLZXkgfSBmcm9tIFwiLi4vLi4vdWl0bC9VdGlsXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uLy4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCBQY1NkayBmcm9tIFwiLi4vUGNTZGtcIjtcblxuLyoqXG4gKiBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hha2VNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG5cbiAgICBwcml2YXRlIGNvbmY6IGFueTtcbiAgICBwcml2YXRlIGVsZVByb2JhYmlsaXR5QXJyOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgdG90YWxXZWlnaHQ6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBwcm9BcnJMZW46IG51bWJlciA9IDA7XG4gICAgLyoq57qi5YyF5Ye6546w55qE5oC75qyh5pWw5q+P5pelICovXG4gICAgcHJpdmF0ZSByZWRfZGF5X2xpbWl0OiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgY3VyX3JlZF9kYXlfbGltaXQ6IG51bWJlciA9IDA7XG4gICAgLyoq5pGH5LiA5pGH5Ye6546w55qE5oC75qyh5pWwICovXG4gICAgcHJpdmF0ZSBzaGFrZV9kYXlfbGltaXQ6IG51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIGN1cl9zaGFrZV9kYXlfbGltaXQ6IG51bWJlciA9IDA7XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gUGNTZGsuSS5nYW1lQ29uZmlnOztcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLVNoYWtlTW9kZWwtLSDojrflj5bmkYfkuIDmkYfpnZnmgIHooagtLS0tLScgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICBpZiAocmVzdWx0Wydjb25maWcnXSkge1xuICAgICAgICAgICAgbGV0IGdhbWVEYXRhID0gcmVzdWx0Wydjb25maWcnXTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaW5pdERhdGEoZ2FtZURhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXREYXRhKGdhbWVEYXRhKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFNoYWtlRGF0YTtcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5zaGFrZUxhc3RUaW1lKSB8fCAnMCc7XG4gICAgICAgIGxldCBsdCA9IHBhcnNlSW50KGxhc3RUaW1lKTtcbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShsdCk7XG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcblxuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xuICAgICAgICAgICAgdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPSAwO1xuICAgICAgICAgICAgbGFzdFRpbWUgPSBEYXRlVXRpbHMubm93VGltZS50b1N0cmluZygpO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfc2hha2VfZGF5X2xpbWl0LCAwKTtcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkuY3VyX3JlZF9kYXlfbGltaXQsIDApO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5zaGFrZUxhc3RUaW1lLCBsYXN0VGltZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjdXJfcmVkX2RheV9saW1pdCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuY3VyX3JlZF9kYXlfbGltaXQpIHx8ICcwJztcbiAgICAgICAgICAgIHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPSBwYXJzZUludChjdXJfcmVkX2RheV9saW1pdCk7XG4gICAgICAgICAgICBsZXQgY3VyX3NoYWtlX2RheV9saW1pdCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuY3VyX3NoYWtlX2RheV9saW1pdCkgfHwgJzAnO1xuICAgICAgICAgICAgdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0ID0gcGFyc2VJbnQoY3VyX3NoYWtlX2RheV9saW1pdCk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmNvbmZpZyA9IGdhbWVEYXRhWydjb25maWcnXTtcbiAgICAgICAgZ2FtZURhdGFbJ3NoYWtlJ10uZm9yRWFjaChlbGUgPT4ge1xuICAgICAgICAgICAgZGF0YS5zaGFrZVdlaWdodExpc3QucHVzaChlbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25mID0gW107XG4gICAgICAgIHRoaXMuY29uZiA9IGRhdGEuc2hha2VXZWlnaHRMaXN0O1xuICAgICAgICB0aGlzLmluaXRQcm9iYWJpbGl0eSgpO1xuICAgICAgICB0aGlzLnNoYWtlX2RheV9saW1pdCA9IGRhdGEuY29uZmlnLnNoYWtlX2RheV9saW1pdDtcbiAgICAgICAgdGhpcy5yZWRfZGF5X2xpbWl0ID0gZGF0YS5jb25maWcucmVkX2RheV9saW1pdDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaW5pdFByb2JhYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnRvdGFsV2VpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5jb25mLmZvckVhY2goKGVsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG90YWxXZWlnaHQgKz0gZWxlLndlaWdodDtcbiAgICAgICAgICAgIGxldCBpdGVtVyA9IGVsZS53ZWlnaHQ7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIGl0ZW1XICs9IHRoaXMuZWxlUHJvYmFiaWxpdHlBcnJbaW5kZXggLSAxXTtcbiAgICAgICAgICAgIHRoaXMuZWxlUHJvYmFiaWxpdHlBcnIgPSBbLi4udGhpcy5lbGVQcm9iYWJpbGl0eUFyciwgaXRlbVddO1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLnByb0FyckxlbiA9IHRoaXMuZWxlUHJvYmFiaWxpdHlBcnIubGVuZ3RoO1xuXG4gICAgfVxuXG4gICAgZ2V0U2hha2VUeXBlKCkge1xuICAgICAgICArK3RoaXMuY3VyX3NoYWtlX2RheV9saW1pdDtcbiAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfc2hha2VfZGF5X2xpbWl0LCB0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQgPiB0aGlzLnNoYWtlX2RheV9saW1pdCkge1xuICAgICAgICAgICAgLyoqJ+asoeaVsOi+vuWIsOS4iumZkO+8jOivt+aYjuWkqeWGjeadpSovXG5cbiAgICAgICAgICAgIC8qKuWcqOatpOWkhOWPr+S7peW8ueahhuetieWkhOeQhiAqL1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCByYW4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLnRvdGFsV2VpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucHJvQXJyTGVuOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGUgPSB0aGlzLmVsZVByb2JhYmlsaXR5QXJyW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGUgPj0gcmFuKSB7XG4gICAgICAgICAgICAgICAgaWYgKDAgPT09IGluZGV4IHx8IDEgPT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICsrdGhpcy5jdXJfcmVkX2RheV9saW1pdDtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfcmVkX2RheV9saW1pdCwgdGhpcy5jdXJfcmVkX2RheV9saW1pdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9yZWRfZGF5X2xpbWl0ID4gdGhpcy5yZWRfZGF5X2xpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25mW3RoaXMucHJvQXJyTGVuIC0gMV07XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25mW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25mW3RoaXMucHJvQXJyTGVuIC0gMV07XG4gICAgfVxuXG4gICAgZ2V0IGRhdGEoKTogU2hha2VEYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBJKCk6IFNoYWtlTW9kZWwge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFNoYWtlTW9kZWwpIGFzIFNoYWtlTW9kZWw7XG4gICAgfVxufVxuXG5cbmNsYXNzIFNoYWtlRGF0YSB7XG4gICAgY29uZmlnOiBTaGFrZUNvbmZpZztcbiAgICBzaGFrZVdlaWdodExpc3Q6IFNoYWtlV2VpZ2h0RGF0YVtdID0gW107XG59XG5pbnRlcmZhY2UgU2hha2VDb25maWcge1xuICAgIHJlZF9kYXlfbGltaXQ6IG51bWJlcixcbiAgICBzaGFrZV9kYXlfbGltaXQ6IG51bWJlcixcbiAgICBpbnRlcnN0aXRpYWxfY250OiBudW1iZXIsXG4gICAgaW50ZXJzdGl0aWFsX2RlbGF5OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIFNoYWtlV2VpZ2h0RGF0YSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0eXBlOiBudW1iZXI7XG4gICAgd2VpZ2h0OiBudW1iZXI7XG4gICAgbnVtOiBudW1iZXI7XG59XG5cblxuIiwiLyoqVGhpcyBjbGFzcyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBMYXlhQWlySURFLCBwbGVhc2UgZG8gbm90IG1ha2UgYW55IG1vZGlmaWNhdGlvbnMuICovXG5pbXBvcnQgVmlldz1MYXlhLlZpZXc7XHJcbmltcG9ydCBEaWFsb2c9TGF5YS5EaWFsb2c7XHJcbmltcG9ydCBTY2VuZT1MYXlhLlNjZW5lO1xudmFyIFJFRzogRnVuY3Rpb24gPSBMYXlhLkNsYXNzVXRpbHMucmVnQ2xhc3M7XG5leHBvcnQgbW9kdWxlIHVpIHtcclxuICAgIGV4cG9ydCBjbGFzcyBUZXN0U2NlbmVVSSBleHRlbmRzIFNjZW5lIHtcclxuXHRcdHB1YmxpYyBidG5JbnZpdGU6TGF5YS5TcHJpdGU7XG5cdFx0cHVibGljIGJ0blNlcnZlcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuVmlicmF0ZTpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuX3NoYWtlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5EcmF3YWw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZWxvYWRBRDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Jhbm5lcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Z1bGxBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd05hdGl2ZUFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93SW50ZXJBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUmV3YXJkQWQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blJlZHBhY2tldDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUHJlTmF0aXZlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5QcmVGdWxsOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5QcmVJbnNlcnQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZVZpZGVvOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5DbG9zZU5hdGl2ZTpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuQ2xvc2VCYW5uZXI6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0bk1pbldpdGhEcmF3YWw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIG1pbldpdGhEcmF3YWxMYWI6TGF5YS5MYWJlbDtcblx0XHRwdWJsaWMgTmF0aXZlQUQ6VmlldztcbiAgICAgICAgY29uc3RydWN0b3IoKXsgc3VwZXIoKX1cclxuICAgICAgICBjcmVhdGVDaGlsZHJlbigpOnZvaWQge1xyXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVDaGlsZHJlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTY2VuZShcIlRlc3RTY2VuZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBSRUcoXCJ1aS5UZXN0U2NlbmVVSVwiLFRlc3RTY2VuZVVJKTtcclxufVxyIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJyYXlVdGlscyB7XG4gICAgLyoqXG4gICAgICog56e76Zmk5YWD57SgXG4gICAgICovXG4gICAgc3RhdGljIHJlbW92ZUZyb21BcnIoYXJyOiBBcnJheTxhbnk+LCBvYmo6IGFueSkge1xuICAgICAgICBsZXQgaW5kZXggPSBhcnIuaW5kZXhPZihvYmopO1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmFuZG9tRnJvbUFycihhcnI6IEFycmF5PGFueT4pIHtcbiAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhcnJbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaVsOe7hOmaj+acuuaOkuW6j1xuICAgICAqL1xuICAgIHN0YXRpYyBzaHVmZmxlKGFycjogQXJyYXk8YW55Pikge1xuICAgICAgICByZXR1cm4gYXJyLnNvcnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgLSAwLjU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbmRleE9mKGFyciwgY2FsbGJhY2ssIGN0eD8pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGN0eCwgdGhpc1tpXSwgaSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHN0YXRpYyBlYWNoKGFyciwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2suY2FsbChjb250ZXh0LCBhcnJbaV0sIGksIGFycikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcXVldWUoYXJyKSB7XG4gICAgICAgIGxldCByZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBwcm9taXNlIG9mIGFycikge1xuICAgICAgICAgICAgcmVzID0gYXdhaXQgcHJvbWlzZShyZXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmFuZG9tQXJyYXkoYXJyLCBjb3VudCkge1xuICAgICAgICBsZXQgc2h1ZmZsZWQgPSBhcnIuc2xpY2UoMCk7XG4gICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBsZXQgbWluID0gbGVuIC0gY291bnQsIHRlbXAsIGluZGV4O1xuICAgICAgICB3aGlsZSAobGVuLS0gPiBtaW4pIHtcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcigobGVuICsgMSkgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgIHRlbXAgPSBzaHVmZmxlZFtpbmRleF07XG4gICAgICAgICAgICBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtsZW5dO1xuICAgICAgICAgICAgc2h1ZmZsZWRbbGVuXSA9IHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNodWZmbGVkLnNsaWNlKG1pbik7XG4gICAgfVxufSIsIi8qKlxuICog5pel5pyf5bel5YW357G7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGVVdGlscyB7XG4gICAgc3RhdGljIGdldCBub3coKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5ub3dUaW1lIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBub3dUaW1lKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IHRvZGF5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGhpcy5ub3dUaW1lKTtcbiAgICAgICAgbGV0IHllYXIgPSB0aW1lLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgIGxldCBkYXRlID0gdGltZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke3RoaXMuYWRkKG1vbnRoKX0tJHt0aGlzLmFkZChkYXRlKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyB0aW1lRGF5KHRpbWVOdW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGltZU51bSk7XG4gICAgICAgIGxldCB5ZWFyID0gdGltZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBsZXQgbW9udGggPSB0aW1lLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBsZXQgZGF0ZSA9IHRpbWUuZ2V0RGF0ZSgpO1xuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHt0aGlzLmFkZChtb250aCl9LSR7dGhpcy5hZGQoZGF0ZSl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLnmja7np5LmlbDmoLzlvI/ljJblrZfnrKbkuLJcbiAgICAgKiBAcGFyYW0gc2Vjb25kIOenkuaVsFxuICAgICAqIEBwYXJhbSB0eXBlIDE6MDA6MDA6MDAgICAyOnl5eXktbW0tZGQgaDptOnMgICAgMzowMDowMCAgIDQ6eHjlpKnliY3vvIx4eOWwj+aXtuWJje+8jHh45YiG6ZKf5YmNXG4gICAgICogQHJldHVyblxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZChzZWNvbmQ6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSk6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQwKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDEoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kMihzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQzKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDQoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kNShzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLy8gMDogMDA6MDBcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDAodDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gNjApO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcih0ICUgNjApO1xuICAgICAgICB2YXIgbWluczogc3RyaW5nO1xuICAgICAgICB2YXIgc2Vuczogc3RyaW5nO1xuICAgICAgICBpZiAobWluc3QgPT0gMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5zdCA8IDEwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwXCIgKyBtaW5zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIlwiICsgbWluc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZHQgPT0gMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjBcIiArIHNlY29uZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5zID0gXCJcIiArIHNlY29uZHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbnMgKyBcIjpcIiArIHNlbnM7XG4gICAgfVxuXG4gICAgLy8xOiAwMDowMDowMFxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMSh0OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhvdXJzdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gMzYwMCk7XG4gICAgICAgIGxldCBob3Vyczogc3RyaW5nO1xuICAgICAgICBsZXQgZGF5ID0gJyc7XG4gICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgaG91cnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaG91cnN0IDwgMTApXG4gICAgICAgICAgICAgICAgaG91cnMgPSBcIjBcIiArIGhvdXJzdDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBoID0gaG91cnN0ICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA+PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gTWF0aC5mbG9vcihob3Vyc3QgLyAyNCkgKyAnZCAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluc3Q6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAvIDYwKTtcbiAgICAgICAgbGV0IHNlY29uZHQ6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAlIDYwKTtcbiAgICAgICAgbGV0IG1pbnM6IHN0cmluZztcbiAgICAgICAgbGV0IHNlbnM6IHN0cmluZztcbiAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMFwiICsgbWluc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaW5zID0gXCJcIiArIG1pbnN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kdCA8IDEwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwXCIgKyBzZWNvbmR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VucyA9IFwiXCIgKyBzZWNvbmR0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXkgKyBob3VycyArIFwiOlwiICsgbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzM6IDAwOjAwXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQzKHQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyAzNjAwKTtcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgJSA2MCk7XG4gICAgICAgIHZhciBtaW5zOiBzdHJpbmc7XG4gICAgICAgIHZhciBzZW5zOiBzdHJpbmc7XG4gICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjBcIiArIG1pbnN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWlucyA9IFwiXCIgKyBtaW5zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMFwiICsgc2Vjb25kdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIlwiICsgc2Vjb25kdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzI6eXl5eS1tbS1kZCBoOm06c1xuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICB2YXIgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7IFx0Ly/ov5Tlm57nmoTmnIjku73ku44wLTEx77ybXG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgdmFyIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICByZXR1cm4geWVhciArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRheSArIFwiIFwiICsgaG91cnMgKyBcIjpcIiArIG1pbnV0ZSArIFwiOlwiICsgc2Vjb25kO1xuXG4gICAgfVxuXG4gICAgLy80Onh45aSp5YmN77yMeHjlsI/ml7bliY3vvIx4eOWIhumSn+WJjVxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgdCA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xuICAgICAgICBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0ID4gMjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0IC8gMjQpICsgXCLlpKnliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ICsgXCLlsI/ml7bliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWUgLyA2MCkgKyBcIuWIhumSn+WJjVwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQ1KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vIOavj+S4quaXtumXtOWNleS9jeaJgOWvueW6lOeahOenkuaVsFxuICAgICAgICB2YXIgb25lRGF5OiBudW1iZXIgPSAzNjAwICogMjQ7XG4gICAgICAgIHZhciBvbmVIb3Vyc3Q6IG51bWJlciA9IDM2MDA7XG4gICAgICAgIHZhciBvbmVNaW5zdDogbnVtYmVyID0gNjA7XG5cbiAgICAgICAgdmFyIGRheXMgPSBNYXRoLmZsb29yKHRpbWUgLyBvbmVEYXkpO1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSBvbmVEYXkgLyBvbmVIb3Vyc3QpXG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgLyBvbmVNaW5zdCkgIC8vTWF0aC5mbG9vcih0aW1lICUgb25lRGF5ICUgb25lSG91cnN0IC8gb25lTWluc3QpO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgJSBvbmVNaW5zdCkgLy90aW1lO1xuXG4gICAgICAgIHZhciBkYXlzczogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzczogc3RyaW5nID0gXCJcIlxuICAgICAgICB2YXIgbWluc3M6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBzZWNzczogc3RyaW5nID0gXCJcIlxuICAgICAgICBpZiAodGltZSA+IDApIHtcbiAgICAgICAgICAgIC8v5aSpXG4gICAgICAgICAgICBpZiAoZGF5cyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGF5c3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIC8v5bCP5pe2XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8v5YiGXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Vjc3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWluc3MgKyBzZWNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgc2Vjc3NcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCIwXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgbWluc3M7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXlzcyA9IGRheXMgKyBcIuWkqVwiO1xuICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBob3Vyc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiMFwiICsgaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCJcIiArIGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheXNzICsgaG91cnNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZChudW0pIHtcbiAgICAgICAgcmV0dXJuIG51bSA8IDEwID8gJzAnICsgbnVtIDogbnVtO1xuICAgIH1cblxuXG59XG4iLCJpbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9PYmplY3RQb29sXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0SW5zdGFuY2Uge1xuICAgIHByaXZhdGUgc3RhdGljIGNsenMgPSBbXTtcbiAgICBwcml2YXRlIHN0YXRpYyBvYmplY3RzID0gW107XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldChjbHM6IGFueSkge1xuICAgICAgICBsZXQgaWR4ID0gdGhpcy5jbHpzLmluZGV4T2YoY2xzKTtcbiAgICAgICAgcmV0dXJuIChpZHggPj0gMCAmJiB0aGlzLm9iamVjdHNbaWR4XSkgfHwgdGhpcy5jcmVhdGUoY2xzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGUoY2xzOiBhbnkpIHtcbiAgICAgICAgdmFyIG9iaiA9IE9iamVjdFBvb2wucG9wKGNscyk7XG4gICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG9iaik7XG4gICAgICAgIHRoaXMuY2x6cy5wdXNoKGNscyk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0UG9vbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2xzQXJyID0gW107XG5cbiAgICBzdGF0aWMgcG9wKGNsczogYW55KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNsc0Fyci5pbmRleE9mKGNscyk7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLmNsc0Fyci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmNsc0Fyci5wdXNoKGNscyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGtleSA9ICdwb29sS2V5JyArIGlkeDtcbiAgICAgICAgbGV0IGl0ZW0gPSBMYXlhLlBvb2wuZ2V0SXRlbUJ5Q2xhc3Moa2V5LCBjbHMpO1xuICAgICAgICBpdGVtLnBvb2xLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBwdXNoKGl0ZW0pIHtcbiAgICAgICAgTGF5YS5Qb29sLnJlY292ZXIoaXRlbS5wb29sS2V5LCBpdGVtKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFNjYWxlQnV0dG9uU2NyaXB0IHtcbiBcbiAgICBwdWJsaWMgZGVsYXlUaW1lOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBtaW5TY2FsZTogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIG1vbmtleUJveDogTGF5YS5JbWFnZTtcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICrorr7nva5vd25lcuWHveaVsO+8jOWPr+S7peebtOaOpeiOt+WPluWIsOa3u+WKoOmZhOWKoOiEmuacrOeahOe7hOS7tuWunuS+iyBcbiAgICAgKiovXG4gICAgcHVibGljIHNldCBvd25lcih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubW9ua2V5Qm94ID0gdmFsdWU7XG4gICAgICAgIC8v6Ieq5a6a5LmJ55qE6ISa5pys5Lya5pyJ5pe25bqP6Zeu6aKY77yM5omA5Lul5Zyo5q2k5re75Yqg5LiA5Liq5bu25pe2XG4gICAgICAgIHRoaXMubW9ua2V5Qm94LmZyYW1lT25jZSgyLCB0aGlzLCB0aGlzLm9uTG9hZGVkKTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgb25Mb2FkZWQoKTogdm9pZCB7XG4gICAgICAgLyog6K6+572u5oyJ6ZKu5Li65Y2V5oCB5oyJ6ZKuXG4gICAgICAgICoqIOWPluWAvO+8mlxuICAgICAgICAqKiAx77ya5Y2V5oCB44CC5Zu+54mH5LiN5YGa5YiH5Ymy77yM5oyJ6ZKu55qE55qu6IKk54q25oCB5Y+q5pyJ5LiA56eN44CCXG4gICAgICAgICoqIDLvvJrkuKTmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB5oyJ5LiL5ZKM57uP6L+H5Y+K6YCJ5Lit54q25oCB55qu6IKk44CCXG4gICAgICAgICoqIDPvvJrkuInmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB57uP6L+H54q25oCB55qu6IKk44CB5oyJ5LiL5ZKM6YCJ5Lit54q25oCB55qu6IKkXG4gICAgICAgICovXG4gICAgICAgIC8v5re75Yqg6byg5qCH5oyJ5LiL5LqL5Lu25L6m5ZCs44CC5oyJ5pe25pe257yp5bCP5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5zY2FsZVNtYWxsKTtcbiAgICAgICAgLy/mt7vliqDpvKDmoIfmiqzotbfkuovku7bkvqblkKzjgILmiqzotbfml7bov5jljp/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9VUCwgdGhpcywgdGhpcy5zY2FsZUJpZyk7XG4gICAgICAgIC8v5re75Yqg6byg5qCH56a75byA5LqL5Lu25L6m5ZCs44CC56a75byA5pe26L+Y5Y6f5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcbiAgICB9XG4gICAgXG4gICAgXG4gICAgcHJpdmF0ZSBzY2FsZVNtYWxsKCk6dm9pZHtcbiAgICAgICAgLy/nvKnlsI/oh7MwLjjnmoTnvJPliqjmlYjmnpxcbiAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLm1vbmtleUJveCwge3NjYWxlWDowLjgsIHNjYWxlWTogMC44fSwgMik7XG4gICAgfVxuICAgIHByaXZhdGUgc2NhbGVCaWcoKTp2b2lke1xuICAgICAgICAvL+WPmOWkp+i/mOWOn+eahOe8k+WKqOaViOaenFxuICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMubW9ua2V5Qm94LCB7c2NhbGVYOjEsIHNjYWxlWToxfSwgMik7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFV0aWwge1xuICAgIHB1YmxpYyBsb2FkKHJlcywgb25Qcm9ncmVzcz86IExheWEuSGFuZGxlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoc3VjLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHJlcywgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBzdWMpLCBvblByb2dyZXNzKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZS50b1N0cmluZygpKVxuICAgIH1cbiAgICBnZXRJdGVtKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVXRpbDtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJKCk6IFV0aWwge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IFV0aWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGF0YUtleSB7XG4gICAgY3VyX3JlZF9kYXlfbGltaXQgPSAnY3VyX3JlZF9kYXlfbGltaXQnLFxuICAgIGN1cl9zaGFrZV9kYXlfbGltaXQgPSAnY3VyX3NoYWtlX2RheV9saW1pdCcsXG4gICAgc2hha2VMYXN0VGltZSA9ICdzaGFrZUxhc3RUaW1lJyxcbiAgICBkYXRhQ05UID0gJ2RhdGFDTlQnLFxuICAgIHRvZGF5Q250ID0gJ3RvZGF5Q250JyxcbiAgICBsYXN0VGltZSA9ICdsYXN0VGltZScsXG59Il19