Commit 5518df2acf6513405d24821572fbf559bbbc8db9
1 parent
8ce59702
Exists in
2.0
m conlict
Showing
18 changed files
with
842 additions
and
639 deletions
Show diff stats
puchi_laya/.DS_Store
No preview for this file type
puchi_laya/bin/js/bundle.js
... | ... | @@ -46,14 +46,14 @@ var GameConfig = /** @class */ (function () { |
46 | 46 | exports.default = GameConfig; |
47 | 47 | GameConfig.init(); |
48 | 48 | |
49 | -},{"./RedDrawal":3,"./TestScene":4,"./sdk/NativeAd":8,"./uitl/ScaleButtonScript":20}],2:[function(require,module,exports){ | |
49 | +},{"./RedDrawal":3,"./TestScene":4,"./sdk/NativeAd":9,"./uitl/ScaleButtonScript":20}],2:[function(require,module,exports){ | |
50 | 50 | "use strict"; |
51 | 51 | Object.defineProperty(exports, "__esModule", { value: true }); |
52 | 52 | var GameConfig_1 = require("./GameConfig"); |
53 | 53 | var AdManager_1 = require("./sdk/AdManager"); |
54 | 54 | var ShakeModel_1 = require("./sdk/model/ShakeModel"); |
55 | -var PcSdk_1 = require("./sdk/PcSdk"); | |
56 | 55 | var RedpacketModel_1 = require("./sdk/model/RedpacketModel"); |
56 | +var AppSdk_1 = require("./sdk/AppSdk"); | |
57 | 57 | var Main = /** @class */ (function () { |
58 | 58 | function Main() { |
59 | 59 | //根据IDE设置初始化引擎 |
... | ... | @@ -95,17 +95,17 @@ var Main = /** @class */ (function () { |
95 | 95 | return __generator(this, function (_a) { |
96 | 96 | switch (_a.label) { |
97 | 97 | case 0: |
98 | - /**隐藏启动屏 */ | |
99 | - PcSdk_1.default.I.hideSplash(); | |
100 | 98 | /**初始化adk 获取app配置信息 */ |
101 | - PcSdk_1.default.I.init(); | |
99 | + AppSdk_1.default.I.init(); | |
102 | 100 | /**预加载视频 */ |
103 | 101 | AdManager_1.default.I.init(); |
104 | 102 | /**获取红包配置 摇一摇 等静态数据 */ |
105 | - return [4 /*yield*/, PcSdk_1.default.I.initGameConfig()]; | |
103 | + return [4 /*yield*/, AppSdk_1.default.I.initGameConfig()]; | |
106 | 104 | case 1: |
107 | 105 | /**获取红包配置 摇一摇 等静态数据 */ |
108 | 106 | _a.sent(); |
107 | + /**隐藏启动屏 */ | |
108 | + AppSdk_1.default.I.hideSplash(); | |
109 | 109 | return [4 /*yield*/, RedpacketModel_1.default.I.init()]; |
110 | 110 | case 2: |
111 | 111 | _a.sent(); |
... | ... | @@ -122,12 +122,12 @@ var Main = /** @class */ (function () { |
122 | 122 | //激活启动类 |
123 | 123 | new Main(); |
124 | 124 | |
125 | -},{"./GameConfig":1,"./sdk/AdManager":7,"./sdk/PcSdk":9,"./sdk/model/RedpacketModel":13,"./sdk/model/ShakeModel":14}],3:[function(require,module,exports){ | |
125 | +},{"./GameConfig":1,"./sdk/AdManager":7,"./sdk/AppSdk":8,"./sdk/model/RedpacketModel":13,"./sdk/model/ShakeModel":14}],3:[function(require,module,exports){ | |
126 | 126 | "use strict"; |
127 | 127 | Object.defineProperty(exports, "__esModule", { value: true }); |
128 | 128 | var EventCenter_1 = require("./event/EventCenter"); |
129 | 129 | var EventEnum_1 = require("./event/EventEnum"); |
130 | -var PcSdk_1 = require("./sdk/PcSdk"); | |
130 | +var AppSdk_1 = require("./sdk/AppSdk"); | |
131 | 131 | /** |
132 | 132 | * 主界面 金币金额 |
133 | 133 | */ |
... | ... | @@ -155,13 +155,13 @@ var RedDrawal = /** @class */ (function (_super) { |
155 | 155 | var coin, str, nextDrawal, leftCoin; |
156 | 156 | return __generator(this, function (_a) { |
157 | 157 | switch (_a.label) { |
158 | - case 0: return [4 /*yield*/, PcSdk_1.default.I.myCoin()]; | |
158 | + case 0: return [4 /*yield*/, AppSdk_1.default.I.myCoin()]; | |
159 | 159 | case 1: |
160 | 160 | coin = _a.sent(); |
161 | 161 | this.totalCoin = coin; |
162 | 162 | this.coinlab.text = '' + coin; |
163 | 163 | str = '可提现'; |
164 | - return [4 /*yield*/, PcSdk_1.default.I.minWithDrawal()]; | |
164 | + return [4 /*yield*/, AppSdk_1.default.I.minWithDrawal()]; | |
165 | 165 | case 2: |
166 | 166 | nextDrawal = _a.sent(); |
167 | 167 | if (this.totalCoin > 0) { |
... | ... | @@ -180,15 +180,15 @@ var RedDrawal = /** @class */ (function (_super) { |
180 | 180 | }(Laya.Script)); |
181 | 181 | exports.default = RedDrawal; |
182 | 182 | |
183 | -},{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/PcSdk":9}],4:[function(require,module,exports){ | |
183 | +},{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/AppSdk":8}],4:[function(require,module,exports){ | |
184 | 184 | "use strict"; |
185 | 185 | Object.defineProperty(exports, "__esModule", { value: true }); |
186 | 186 | var layaMaxUI_1 = require("./ui/layaMaxUI"); |
187 | 187 | var AdManager_1 = require("./sdk/AdManager"); |
188 | 188 | var ShakeModel_1 = require("./sdk/model/ShakeModel"); |
189 | 189 | var RedpacketModel_1 = require("./sdk/model/RedpacketModel"); |
190 | -var PcSdk_1 = require("./sdk/PcSdk"); | |
191 | 190 | var NativeAd_1 = require("./sdk/NativeAd"); |
191 | +var AppSdk_1 = require("./sdk/AppSdk"); | |
192 | 192 | var TestScene = /** @class */ (function (_super) { |
193 | 193 | __extends(TestScene, _super); |
194 | 194 | function TestScene() { |
... | ... | @@ -204,7 +204,7 @@ var TestScene = /** @class */ (function (_super) { |
204 | 204 | var _this = this; |
205 | 205 | this.btnServer.on(Laya.Event.CLICK, this, this.openServer); |
206 | 206 | this.btnVibrate.on(Laya.Event.CLICK, this, function () { |
207 | - PcSdk_1.default.I.vibrate(_this.isLongVibrate ? 0 : 1); | |
207 | + AppSdk_1.default.I.vibrate(_this.isLongVibrate ? 0 : 1); | |
208 | 208 | _this.isLongVibrate = !_this.isLongVibrate; |
209 | 209 | }); |
210 | 210 | this.btnDrawal.on(Laya.Event.CLICK, this, this.openPersonal); |
... | ... | @@ -295,7 +295,7 @@ var TestScene = /** @class */ (function (_super) { |
295 | 295 | /**意见反馈 */ |
296 | 296 | TestScene.prototype.openServer = function () { |
297 | 297 | console.log('---------------openServer-------'); |
298 | - PcSdk_1.default.I.feedback(); | |
298 | + AppSdk_1.default.I.feedback(); | |
299 | 299 | }; |
300 | 300 | TestScene.prototype.openRedpacket = function () { |
301 | 301 | return __awaiter(this, void 0, void 0, function () { |
... | ... | @@ -310,7 +310,7 @@ var TestScene = /** @class */ (function (_super) { |
310 | 310 | var money; |
311 | 311 | return __generator(this, function (_a) { |
312 | 312 | switch (_a.label) { |
313 | - case 0: return [4 /*yield*/, PcSdk_1.default.I.minWithDrawal()]; | |
313 | + case 0: return [4 /*yield*/, AppSdk_1.default.I.minWithDrawal()]; | |
314 | 314 | case 1: |
315 | 315 | money = _a.sent(); |
316 | 316 | this.minWithDrawalLab.text = '最低提现:' + money; |
... | ... | @@ -322,11 +322,11 @@ var TestScene = /** @class */ (function (_super) { |
322 | 322 | /**打开个人中心 */ |
323 | 323 | TestScene.prototype.openPersonal = function () { |
324 | 324 | console.log('---------------openServer-------'); |
325 | - PcSdk_1.default.I.personal(0); | |
325 | + AppSdk_1.default.I.personal(); | |
326 | 326 | }; |
327 | 327 | /**邀请好友 */ |
328 | 328 | TestScene.prototype.invitation = function () { |
329 | - PcSdk_1.default.I.invitation(); | |
329 | + AppSdk_1.default.I.invitation(); | |
330 | 330 | }; |
331 | 331 | /** |
332 | 332 | * 1 金币 |
... | ... | @@ -336,7 +336,7 @@ var TestScene = /** @class */ (function (_super) { |
336 | 336 | */ |
337 | 337 | TestScene.prototype.touchShake = function () { |
338 | 338 | console.log('---------------touchShake-------'); |
339 | - PcSdk_1.default.I.vibrate(); | |
339 | + AppSdk_1.default.I.vibrate(); | |
340 | 340 | /** |
341 | 341 | * 1.回去星星 道具 |
342 | 342 | * 2.红包 直接获得⾦币;或者直接弹激励视频后,获得⾦币 |
... | ... | @@ -420,7 +420,7 @@ var TestScene = /** @class */ (function (_super) { |
420 | 420 | }(layaMaxUI_1.ui.TestSceneUI)); |
421 | 421 | exports.default = TestScene; |
422 | 422 | |
423 | -},{"./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){ | |
423 | +},{"./sdk/AdManager":7,"./sdk/AppSdk":8,"./sdk/NativeAd":9,"./sdk/model/RedpacketModel":13,"./sdk/model/ShakeModel":14,"./ui/layaMaxUI":15}],5:[function(require,module,exports){ | |
424 | 424 | "use strict"; |
425 | 425 | Object.defineProperty(exports, "__esModule", { value: true }); |
426 | 426 | /* |
... | ... | @@ -581,51 +581,37 @@ var AdManager = /** @class */ (function () { |
581 | 581 | return AdManager; |
582 | 582 | }()); |
583 | 583 | exports.default = AdManager; |
584 | +var ADPoint; | |
585 | +(function (ADPoint) { | |
586 | + ADPoint["GAME"] = "game"; | |
587 | + ADPoint["RECORD"] = "record"; | |
588 | + ADPoint["BOOSTER"] = "booster"; | |
589 | + ADPoint["CHALLENGE"] = "challenge"; | |
590 | + ADPoint["CHALLENGE_REWARD"] = "challenge_reward"; | |
591 | + ADPoint["LEVEL_REWARD"] = "level_reward"; | |
592 | + ADPoint["LOGIN_REWARD"] = "login_reward"; | |
593 | + ADPoint["REDPACKET"] = "redpacket"; | |
594 | + ADPoint["PRIVILEGE"] = "privilege"; | |
595 | + ADPoint["RELIVE"] = "relive"; | |
596 | + ADPoint["CHALLENGE_RESET"] = "challenge_reset"; | |
597 | + ADPoint["BOOSTER_REWARD"] = "booster_reward"; | |
598 | + ADPoint["SUPER_REWARD"] = "super_reward"; | |
599 | + ADPoint["TIPS"] = "tips"; | |
600 | + ADPoint["RESULT"] = "result"; | |
601 | + ADPoint["REDPACKET_REWARD"] = "redPacket_reward"; | |
602 | +})(ADPoint = exports.ADPoint || (exports.ADPoint = {})); | |
584 | 603 | |
585 | 604 | },{"../uitl/ObjectInstance":18,"./TTAdSdk":10}],8:[function(require,module,exports){ |
586 | 605 | "use strict"; |
587 | 606 | Object.defineProperty(exports, "__esModule", { value: true }); |
588 | -var AdManager_1 = require("./AdManager"); | |
589 | -var NativeAd = /** @class */ (function (_super) { | |
590 | - __extends(NativeAd, _super); | |
591 | - function NativeAd() { | |
592 | - return _super !== null && _super.apply(this, arguments) || this; | |
593 | - } | |
594 | - NativeAd.prototype.initNativeAd = function (preload) { | |
595 | - if (preload === void 0) { preload = 0; } | |
596 | - var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true); | |
597 | - AdManager_1.default.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height, preload); | |
598 | - }; | |
599 | - NativeAd.prototype.onEnable = function () { | |
600 | - this.initNativeAd(); | |
601 | - }; | |
602 | - NativeAd.prototype.onDisable = function () { | |
603 | - AdManager_1.default.I.closeAdverDialog(); | |
604 | - }; | |
605 | - Object.defineProperty(NativeAd.prototype, "item", { | |
606 | - get: function () { | |
607 | - return this.owner; | |
608 | - }, | |
609 | - enumerable: true, | |
610 | - configurable: true | |
611 | - }); | |
612 | - return NativeAd; | |
613 | -}(Laya.Script)); | |
614 | -exports.default = NativeAd; | |
615 | - | |
616 | -},{"./AdManager":7}],9:[function(require,module,exports){ | |
617 | -"use strict"; | |
618 | -Object.defineProperty(exports, "__esModule", { value: true }); | |
619 | 607 | var ObjectInstance_1 = require("../uitl/ObjectInstance"); |
620 | -var EventCenter_1 = require("../event/EventCenter"); | |
621 | -var EventEnum_1 = require("../event/EventEnum"); | |
622 | -var PcSdk = /** @class */ (function () { | |
623 | - function PcSdk() { | |
608 | +var AppSdk = /** @class */ (function () { | |
609 | + function AppSdk() { | |
624 | 610 | } |
625 | - PcSdk.prototype.init = function () { | |
611 | + AppSdk.prototype.init = function () { | |
626 | 612 | this.getSystemInfo(); |
627 | 613 | }; |
628 | - Object.defineProperty(PcSdk.prototype, "myBridge", { | |
614 | + Object.defineProperty(AppSdk.prototype, "myBridge", { | |
629 | 615 | get: function () { |
630 | 616 | if (MyBridge) { |
631 | 617 | return MyBridge; |
... | ... | @@ -635,61 +621,79 @@ var PcSdk = /** @class */ (function () { |
635 | 621 | configurable: true |
636 | 622 | }); |
637 | 623 | /**获取基本版本信息以及手机的配置 */ |
638 | - PcSdk.prototype.getSystemInfo = function (key) { | |
624 | + AppSdk.prototype.getSystemInfo = function (key) { | |
639 | 625 | if (key === void 0) { key = 0; } |
640 | 626 | var _a; |
641 | 627 | var ret = this.myBridge.getSystemInfo(key); |
642 | 628 | 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; |
643 | 629 | _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]; |
644 | 630 | }; |
645 | - PcSdk.prototype.initGameConfig = function () { | |
631 | + AppSdk.prototype.initGameConfig = function () { | |
646 | 632 | this._gameConfig = this.getGameConfig(); |
647 | 633 | }; |
648 | 634 | /** |
649 | 635 | * 震动 |
650 | 636 | * @param key 0 短震动 1 长震动 |
651 | 637 | */ |
652 | - PcSdk.prototype.vibrate = function (key) { | |
653 | - if (key === void 0) { key = 0; } | |
638 | + AppSdk.prototype.vibrate = function (key) { | |
639 | + if (key === void 0) { key = 1; } | |
654 | 640 | this.myBridge.openSystemFun(key); |
655 | 641 | }; |
656 | 642 | /**隐藏启动屏 */ |
657 | - PcSdk.prototype.hideSplash = function () { | |
643 | + AppSdk.prototype.hideSplash = function () { | |
658 | 644 | this.myBridge.hideSplash(); |
659 | 645 | }; |
660 | 646 | /**弹出提现 */ |
661 | - PcSdk.prototype.withDrawal = function () { | |
647 | + AppSdk.prototype.withDrawal = function () { | |
662 | 648 | this.myBridge.withDrawal(); |
663 | 649 | }; |
664 | 650 | /**意见反馈 */ |
665 | - PcSdk.prototype.feedback = function () { | |
651 | + AppSdk.prototype.feedback = function () { | |
666 | 652 | this.myBridge.feedback(); |
667 | 653 | }; |
668 | 654 | /** |
669 | 655 | * key 默认0 ,签到 1 |
670 | 656 | */ |
671 | - PcSdk.prototype.personal = function (key) { | |
672 | - if (key === void 0) { key = 0; } | |
673 | - this.myBridge.personal(key); | |
657 | + AppSdk.prototype.personal = function () { | |
658 | + this.myBridge.personal(); | |
674 | 659 | }; |
675 | 660 | /**邀请好友*/ |
676 | - PcSdk.prototype.invitation = function () { | |
661 | + AppSdk.prototype.invitation = function () { | |
677 | 662 | this.myBridge.invitation(); |
678 | 663 | }; |
664 | + /**邀请好友*/ | |
665 | + AppSdk.prototype.openReward = function () { | |
666 | + this.myBridge.openReward(); | |
667 | + }; | |
668 | + /**签到*/ | |
669 | + AppSdk.prototype.openSignin = function () { | |
670 | + this.myBridge.openSingin(); | |
671 | + }; | |
672 | + AppSdk.prototype.putData = function (key, value) { | |
673 | + this.myBridge.putData(key, value); | |
674 | + }; | |
675 | + /** | |
676 | + * @param key 存数据的时候的唯一key | |
677 | + * @return 存储的数据 | |
678 | + * */ | |
679 | + AppSdk.prototype.getData = function (key) { | |
680 | + var ret = this.myBridge.getData(key); | |
681 | + return JSON.parse(ret); | |
682 | + }; | |
679 | 683 | /** |
680 | 684 | * 获取金币配表 |
681 | 685 | * @param key 1红包 2 摇一摇红包 |
682 | 686 | */ |
683 | - PcSdk.prototype.getGameConfig = function () { | |
687 | + AppSdk.prototype.getGameConfig = function () { | |
684 | 688 | var result = this.myBridge.getGameConfig(); |
685 | - // console.log('---------------getGameConfig-------' + JSON.stringify(result)) | |
686 | 689 | return JSON.parse(result); |
687 | 690 | }; |
688 | 691 | /** |
689 | 692 | * 要求发放金币 |
690 | 693 | * @param key 1红包 |
691 | 694 | */ |
692 | - PcSdk.prototype.addGold = function (key) { | |
695 | + AppSdk.prototype.addGold = function (key) { | |
696 | + if (key === void 0) { key = 1; } | |
693 | 697 | return __awaiter(this, void 0, void 0, function () { |
694 | 698 | var _this = this; |
695 | 699 | return __generator(this, function (_a) { |
... | ... | @@ -716,7 +720,7 @@ var PcSdk = /** @class */ (function () { |
716 | 720 | }); |
717 | 721 | }; |
718 | 722 | /**获取总金币 */ |
719 | - PcSdk.prototype.myCoin = function () { | |
723 | + AppSdk.prototype.myCoin = function () { | |
720 | 724 | return __awaiter(this, void 0, void 0, function () { |
721 | 725 | var _this = this; |
722 | 726 | return __generator(this, function (_a) { |
... | ... | @@ -743,7 +747,7 @@ var PcSdk = /** @class */ (function () { |
743 | 747 | }); |
744 | 748 | }; |
745 | 749 | /**获取当前提现的档位 */ |
746 | - PcSdk.prototype.minWithDrawal = function () { | |
750 | + AppSdk.prototype.minWithDrawal = function () { | |
747 | 751 | return __awaiter(this, void 0, void 0, function () { |
748 | 752 | var _this = this; |
749 | 753 | return __generator(this, function (_a) { |
... | ... | @@ -770,14 +774,14 @@ var PcSdk = /** @class */ (function () { |
770 | 774 | }); |
771 | 775 | }; |
772 | 776 | /**上报埋点 */ |
773 | - PcSdk.prototype.appDotLog = function (key, value) { | |
777 | + AppSdk.prototype.appDotLog = function (key, value) { | |
774 | 778 | this.myBridge.appDotLog(key, value); |
775 | 779 | }; |
776 | 780 | /**热云打点 */ |
777 | - PcSdk.prototype.appDotTracKing = function (key) { | |
781 | + AppSdk.prototype.appDotTracKing = function (key) { | |
778 | 782 | this.myBridge.appDotTracKing(key); |
779 | 783 | }; |
780 | - PcSdk.prototype.setCallback = function (funName, pramas) { | |
784 | + AppSdk.prototype.setCallback = function (funName, pramas) { | |
781 | 785 | var _this = this; |
782 | 786 | console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge)); |
783 | 787 | return new Promise(function (resolve, reject) { |
... | ... | @@ -792,91 +796,91 @@ var PcSdk = /** @class */ (function () { |
792 | 796 | }); |
793 | 797 | }); |
794 | 798 | }; |
795 | - PcSdk.prototype.closeAdverDialog = function () { | |
799 | + AppSdk.prototype.closeAdverDialog = function () { | |
796 | 800 | this.myBridge.closeAdverDialog(); |
797 | 801 | }; |
798 | - PcSdk.prototype.closeAdBanner = function () { | |
802 | + AppSdk.prototype.closeAdBanner = function () { | |
799 | 803 | this.myBridge.closeAdBanner(); |
800 | 804 | }; |
801 | 805 | /**激励视频 */ |
802 | - PcSdk.prototype.showRewardVideoAd = function (value, JBCallback) { | |
806 | + AppSdk.prototype.showRewardVideoAd = function (value, JBCallback) { | |
803 | 807 | this.myBridge.showRewardVideoAd(value, JBCallback); |
804 | 808 | }; |
805 | 809 | /** 全屏广告*/ |
806 | - PcSdk.prototype.loadFullScreenVideoAd = function (data, JBCallback) { | |
810 | + AppSdk.prototype.loadFullScreenVideoAd = function (data, JBCallback) { | |
807 | 811 | this.myBridge.showRewardVideoAd(data, JBCallback); |
808 | 812 | }; |
809 | 813 | /**信息流广告 */ |
810 | - PcSdk.prototype.loadNativeExpressAd = function (data, JBCallback) { | |
814 | + AppSdk.prototype.loadNativeExpressAd = function (data, JBCallback) { | |
811 | 815 | this.myBridge.loadNativeExpressAd(data, JBCallback); |
812 | 816 | }; |
813 | 817 | /**banner */ |
814 | - PcSdk.prototype.loadBannerExpressAd = function (data, JBCallback) { | |
818 | + AppSdk.prototype.loadBannerExpressAd = function (data, JBCallback) { | |
815 | 819 | this.myBridge.loadBannerExpressAd(data, JBCallback); |
816 | 820 | }; |
817 | 821 | /**插屏广告 */ |
818 | - PcSdk.prototype.showInteractionExpressAd = function (data, JBCallback) { | |
822 | + AppSdk.prototype.showInteractionExpressAd = function (data, JBCallback) { | |
819 | 823 | this.myBridge.showInteractionExpressAd(data, JBCallback); |
820 | 824 | }; |
821 | - Object.defineProperty(PcSdk.prototype, "level", { | |
825 | + Object.defineProperty(AppSdk.prototype, "level", { | |
822 | 826 | get: function () { |
823 | 827 | return this._level; |
824 | 828 | }, |
825 | 829 | enumerable: true, |
826 | 830 | configurable: true |
827 | 831 | }); |
828 | - Object.defineProperty(PcSdk.prototype, "width", { | |
832 | + Object.defineProperty(AppSdk.prototype, "width", { | |
829 | 833 | get: function () { |
830 | 834 | return this._width; |
831 | 835 | }, |
832 | 836 | enumerable: true, |
833 | 837 | configurable: true |
834 | 838 | }); |
835 | - Object.defineProperty(PcSdk.prototype, "height", { | |
839 | + Object.defineProperty(AppSdk.prototype, "height", { | |
836 | 840 | get: function () { |
837 | 841 | return this._height; |
838 | 842 | }, |
839 | 843 | enumerable: true, |
840 | 844 | configurable: true |
841 | 845 | }); |
842 | - Object.defineProperty(PcSdk.prototype, "version", { | |
846 | + Object.defineProperty(AppSdk.prototype, "version", { | |
843 | 847 | get: function () { |
844 | 848 | return this._version; |
845 | 849 | }, |
846 | 850 | enumerable: true, |
847 | 851 | configurable: true |
848 | 852 | }); |
849 | - Object.defineProperty(PcSdk.prototype, "channel", { | |
853 | + Object.defineProperty(AppSdk.prototype, "channel", { | |
850 | 854 | get: function () { |
851 | 855 | return this._channel; |
852 | 856 | }, |
853 | 857 | enumerable: true, |
854 | 858 | configurable: true |
855 | 859 | }); |
856 | - Object.defineProperty(PcSdk.prototype, "bridge", { | |
860 | + Object.defineProperty(AppSdk.prototype, "bridge", { | |
857 | 861 | get: function () { |
858 | 862 | return null; |
859 | 863 | }, |
860 | 864 | enumerable: true, |
861 | 865 | configurable: true |
862 | 866 | }); |
863 | - Object.defineProperty(PcSdk.prototype, "gameConfig", { | |
867 | + Object.defineProperty(AppSdk.prototype, "gameConfig", { | |
864 | 868 | get: function () { |
865 | 869 | return this._gameConfig; |
866 | 870 | }, |
867 | 871 | enumerable: true, |
868 | 872 | configurable: true |
869 | 873 | }); |
870 | - Object.defineProperty(PcSdk, "I", { | |
874 | + Object.defineProperty(AppSdk, "I", { | |
871 | 875 | get: function () { |
872 | - return ObjectInstance_1.default.get(PcSdk); | |
876 | + return ObjectInstance_1.default.get(AppSdk); | |
873 | 877 | }, |
874 | 878 | enumerable: true, |
875 | 879 | configurable: true |
876 | 880 | }); |
877 | - return PcSdk; | |
881 | + return AppSdk; | |
878 | 882 | }()); |
879 | -exports.default = PcSdk; | |
883 | +exports.default = AppSdk; | |
880 | 884 | // //这里是浏览器环境下, 接收web传过来的消息 |
881 | 885 | window.onMyBridgeReady = function () { |
882 | 886 | console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms"); |
... | ... | @@ -886,7 +890,6 @@ window.onMyBridgeReady = function () { |
886 | 890 | ret[_i] = arguments[_i]; |
887 | 891 | } |
888 | 892 | console.log(' laya onResume', ret); |
889 | - EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.APP_SHOW); | |
890 | 893 | }; |
891 | 894 | MyBridge.App.onPause = function () { |
892 | 895 | var ret = []; |
... | ... | @@ -894,15 +897,41 @@ window.onMyBridgeReady = function () { |
894 | 897 | ret[_i] = arguments[_i]; |
895 | 898 | } |
896 | 899 | console.log(' laya onPause', ret); |
897 | - EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.APP_HIDE); | |
898 | 900 | }; |
899 | 901 | }; |
900 | 902 | |
901 | -},{"../event/EventCenter":5,"../event/EventEnum":6,"../uitl/ObjectInstance":18}],10:[function(require,module,exports){ | |
903 | +},{"../uitl/ObjectInstance":18}],9:[function(require,module,exports){ | |
902 | 904 | "use strict"; |
903 | 905 | Object.defineProperty(exports, "__esModule", { value: true }); |
906 | +var AdManager_1 = require("../sdk/AdManager"); | |
907 | +var NativeAd = /** @class */ (function (_super) { | |
908 | + __extends(NativeAd, _super); | |
909 | + function NativeAd() { | |
910 | + return _super.call(this) || this; | |
911 | + } | |
912 | + NativeAd.prototype.onEnable = function () { | |
913 | + var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true); | |
914 | + AdManager_1.default.I.showNativeAd(this.point, globalPoint.x, globalPoint.y, this.item.width, this.item.height); | |
915 | + }; | |
916 | + NativeAd.prototype.onDisable = function () { | |
917 | + AdManager_1.default.I.closeAdverDialog(); | |
918 | + }; | |
919 | + Object.defineProperty(NativeAd.prototype, "item", { | |
920 | + get: function () { | |
921 | + return this.owner; | |
922 | + }, | |
923 | + enumerable: true, | |
924 | + configurable: true | |
925 | + }); | |
926 | + return NativeAd; | |
927 | +}(Laya.Script)); | |
928 | +exports.default = NativeAd; | |
929 | + | |
930 | +},{"../sdk/AdManager":7}],10:[function(require,module,exports){ | |
931 | +"use strict"; | |
932 | +Object.defineProperty(exports, "__esModule", { value: true }); | |
933 | +var AppSdk_1 = require("./AppSdk"); | |
904 | 934 | var ObjectInstance_1 = require("../uitl/ObjectInstance"); |
905 | -var PcSdk_1 = require("./PcSdk"); | |
906 | 935 | var TTAdSdk = /** @class */ (function () { |
907 | 936 | function TTAdSdk() { |
908 | 937 | } |
... | ... | @@ -921,7 +950,7 @@ var TTAdSdk = /** @class */ (function () { |
921 | 950 | }; |
922 | 951 | return [2 /*return*/, new Promise(function (resolve, reject) { |
923 | 952 | var isComplete = false; |
924 | - PcSdk_1.default.I.showRewardVideoAd(data, function (ret) { | |
953 | + AppSdk_1.default.I.showRewardVideoAd(data, function (ret) { | |
925 | 954 | var _a = JSON.parse(ret), code = _a.code, message = _a.message; |
926 | 955 | switch (code) { |
927 | 956 | case -1: |
... | ... | @@ -951,13 +980,13 @@ var TTAdSdk = /** @class */ (function () { |
951 | 980 | var data; |
952 | 981 | return __generator(this, function (_a) { |
953 | 982 | data = { |
954 | - w: PcSdk_1.default.I.width, | |
955 | - h: PcSdk_1.default.I.width * 90 / 600, | |
983 | + w: AppSdk_1.default.I.width, | |
984 | + h: AppSdk_1.default.I.width * 90 / 600, | |
956 | 985 | preloading: preload, |
957 | 986 | type: 1 |
958 | 987 | }; |
959 | 988 | return [2 /*return*/, new Promise(function (resolve, reject) { |
960 | - PcSdk_1.default.I.loadFullScreenVideoAd(JSON.stringify(data), function (res) { | |
989 | + AppSdk_1.default.I.loadFullScreenVideoAd(JSON.stringify(data), function (res) { | |
961 | 990 | resolve(res); |
962 | 991 | }); |
963 | 992 | })]; |
... | ... | @@ -970,8 +999,8 @@ var TTAdSdk = /** @class */ (function () { |
970 | 999 | return __awaiter(this, void 0, void 0, function () { |
971 | 1000 | var scaleX, scaleY, data; |
972 | 1001 | return __generator(this, function (_a) { |
973 | - scaleX = PcSdk_1.default.I.width / Laya.stage.width; | |
974 | - scaleY = PcSdk_1.default.I.height / Laya.stage.height; | |
1002 | + scaleX = AppSdk_1.default.I.width / Laya.stage.width; | |
1003 | + scaleY = AppSdk_1.default.I.height / Laya.stage.height; | |
975 | 1004 | data = { |
976 | 1005 | type: type, |
977 | 1006 | preloading: preload, |
... | ... | @@ -980,7 +1009,7 @@ var TTAdSdk = /** @class */ (function () { |
980 | 1009 | left: x * scaleX, |
981 | 1010 | top: y * scaleY |
982 | 1011 | }; |
983 | - PcSdk_1.default.I.loadNativeExpressAd(JSON.stringify(data), function (res) { | |
1012 | + AppSdk_1.default.I.loadNativeExpressAd(JSON.stringify(data), function (res) { | |
984 | 1013 | return Promise.resolve(res); |
985 | 1014 | }); |
986 | 1015 | return [2 /*return*/]; |
... | ... | @@ -993,13 +1022,13 @@ var TTAdSdk = /** @class */ (function () { |
993 | 1022 | var data; |
994 | 1023 | return __generator(this, function (_a) { |
995 | 1024 | data = { |
996 | - w: PcSdk_1.default.I.width, | |
997 | - h: PcSdk_1.default.I.width * 90 / 600, | |
1025 | + w: AppSdk_1.default.I.width, | |
1026 | + h: AppSdk_1.default.I.width * 90 / 600, | |
998 | 1027 | preloading: preload, |
999 | 1028 | type: 1 |
1000 | 1029 | }; |
1001 | 1030 | return [2 /*return*/, new Promise(function (resolve, reject) { |
1002 | - PcSdk_1.default.I.loadBannerExpressAd(JSON.stringify(data), function (res) { | |
1031 | + AppSdk_1.default.I.loadBannerExpressAd(JSON.stringify(data), function (res) { | |
1003 | 1032 | resolve(res); |
1004 | 1033 | }); |
1005 | 1034 | })]; |
... | ... | @@ -1007,10 +1036,10 @@ var TTAdSdk = /** @class */ (function () { |
1007 | 1036 | }); |
1008 | 1037 | }; |
1009 | 1038 | TTAdSdk.prototype.closeAdverDialog = function () { |
1010 | - PcSdk_1.default.I.closeAdverDialog(); | |
1039 | + AppSdk_1.default.I.closeAdverDialog(); | |
1011 | 1040 | }; |
1012 | 1041 | TTAdSdk.prototype.closeAdBanner = function () { |
1013 | - PcSdk_1.default.I.closeAdBanner(); | |
1042 | + AppSdk_1.default.I.closeAdBanner(); | |
1014 | 1043 | }; |
1015 | 1044 | TTAdSdk.prototype.showInteractionExpressAd = function (preload) { |
1016 | 1045 | if (preload === void 0) { preload = 0; } |
... | ... | @@ -1018,13 +1047,13 @@ var TTAdSdk = /** @class */ (function () { |
1018 | 1047 | var data; |
1019 | 1048 | return __generator(this, function (_a) { |
1020 | 1049 | data = { |
1021 | - w: PcSdk_1.default.I.width * 0.8, | |
1022 | - h: PcSdk_1.default.I.height, | |
1050 | + w: AppSdk_1.default.I.width * 0.8, | |
1051 | + h: AppSdk_1.default.I.height, | |
1023 | 1052 | preloading: preload, |
1024 | 1053 | }; |
1025 | 1054 | return [2 /*return*/, new Promise(function (resolve, reject) { |
1026 | 1055 | var isComplete = false; |
1027 | - PcSdk_1.default.I.showInteractionExpressAd(JSON.stringify(data), function (res) { | |
1056 | + AppSdk_1.default.I.showInteractionExpressAd(JSON.stringify(data), function (res) { | |
1028 | 1057 | resolve(res); |
1029 | 1058 | }); |
1030 | 1059 | })]; |
... | ... | @@ -1042,20 +1071,16 @@ var TTAdSdk = /** @class */ (function () { |
1042 | 1071 | }()); |
1043 | 1072 | exports.default = TTAdSdk; |
1044 | 1073 | |
1045 | -},{"../uitl/ObjectInstance":18,"./PcSdk":9}],11:[function(require,module,exports){ | |
1074 | +},{"../uitl/ObjectInstance":18,"./AppSdk":8}],11:[function(require,module,exports){ | |
1046 | 1075 | "use strict"; |
1047 | 1076 | Object.defineProperty(exports, "__esModule", { value: true }); |
1077 | +var AppSdk_1 = require("./AppSdk"); | |
1048 | 1078 | var ObjectInstance_1 = require("../uitl/ObjectInstance"); |
1049 | -var PcSdk_1 = require("./PcSdk"); | |
1050 | -/** | |
1051 | - * 上报热云埋点⽇志 | |
1052 | - * 具体的打点需要跟运营联系 | |
1053 | - */ | |
1054 | 1079 | var TrackingSdk = /** @class */ (function () { |
1055 | 1080 | function TrackingSdk() { |
1056 | 1081 | } |
1057 | 1082 | TrackingSdk.prototype.dot = function (key) { |
1058 | - PcSdk_1.default.I.appDotTracKing(key); | |
1083 | + AppSdk_1.default.I.appDotTracKing(key); | |
1059 | 1084 | }; |
1060 | 1085 | Object.defineProperty(TrackingSdk, "I", { |
1061 | 1086 | get: function () { |
... | ... | @@ -1073,7 +1098,7 @@ var TrackingKey; |
1073 | 1098 | TrackingKey["RedPack5"] = "event_6"; |
1074 | 1099 | })(TrackingKey = exports.TrackingKey || (exports.TrackingKey = {})); |
1075 | 1100 | |
1076 | -},{"../uitl/ObjectInstance":18,"./PcSdk":9}],12:[function(require,module,exports){ | |
1101 | +},{"../uitl/ObjectInstance":18,"./AppSdk":8}],12:[function(require,module,exports){ | |
1077 | 1102 | "use strict"; |
1078 | 1103 | Object.defineProperty(exports, "__esModule", { value: true }); |
1079 | 1104 | var ArrayUtils_1 = require("../../uitl/ArrayUtils"); |
... | ... | @@ -1170,7 +1195,7 @@ var Util_1 = require("../../uitl/Util"); |
1170 | 1195 | var ObjectInstance_1 = require("../../uitl/ObjectInstance"); |
1171 | 1196 | var EventCenter_1 = require("../../event/EventCenter"); |
1172 | 1197 | var EventEnum_1 = require("../../event/EventEnum"); |
1173 | -var PcSdk_1 = require("../PcSdk"); | |
1198 | +var AppSdk_1 = require("../AppSdk"); | |
1174 | 1199 | var RedpacketModel = /** @class */ (function (_super) { |
1175 | 1200 | __extends(RedpacketModel, _super); |
1176 | 1201 | function RedpacketModel() { |
... | ... | @@ -1233,7 +1258,7 @@ var RedpacketModel = /** @class */ (function (_super) { |
1233 | 1258 | return __generator(this, function (_a) { |
1234 | 1259 | switch (_a.label) { |
1235 | 1260 | case 0: |
1236 | - result = PcSdk_1.default.I.gameConfig; | |
1261 | + result = AppSdk_1.default.I.gameConfig; | |
1237 | 1262 | console.log('--------------- 获取配置静态表-----' + JSON.stringify(result)); |
1238 | 1263 | if (!result) return [3 /*break*/, 2]; |
1239 | 1264 | return [4 /*yield*/, this.loadGoldCfg(result['coin_config'][0])]; |
... | ... | @@ -1242,7 +1267,7 @@ var RedpacketModel = /** @class */ (function (_super) { |
1242 | 1267 | console.log('-------------- 获取红包静态表-----' + JSON.stringify(result)); |
1243 | 1268 | return [2 /*return*/, configJson]; |
1244 | 1269 | case 2: |
1245 | - PcSdk_1.default.I.initGameConfig(); | |
1270 | + AppSdk_1.default.I.initGameConfig(); | |
1246 | 1271 | _a.label = 3; |
1247 | 1272 | case 3: return [2 /*return*/]; |
1248 | 1273 | } |
... | ... | @@ -1345,7 +1370,7 @@ var RedpacketModel = /** @class */ (function (_super) { |
1345 | 1370 | var totalCoin; |
1346 | 1371 | return __generator(this, function (_a) { |
1347 | 1372 | switch (_a.label) { |
1348 | - case 0: return [4 /*yield*/, PcSdk_1.default.I.myCoin()]; | |
1373 | + case 0: return [4 /*yield*/, AppSdk_1.default.I.myCoin()]; | |
1349 | 1374 | case 1: |
1350 | 1375 | totalCoin = _a.sent(); |
1351 | 1376 | return [2 /*return*/, totalCoin]; |
... | ... | @@ -1360,7 +1385,7 @@ var RedpacketModel = /** @class */ (function (_super) { |
1360 | 1385 | var coinData; |
1361 | 1386 | return __generator(this, function (_a) { |
1362 | 1387 | switch (_a.label) { |
1363 | - case 0: return [4 /*yield*/, PcSdk_1.default.I.addGold(key)]; | |
1388 | + case 0: return [4 /*yield*/, AppSdk_1.default.I.addGold(key)]; | |
1364 | 1389 | case 1: |
1365 | 1390 | coinData = _a.sent(); |
1366 | 1391 | return [2 /*return*/, coinData['coin']]; |
... | ... | @@ -1374,7 +1399,7 @@ var RedpacketModel = /** @class */ (function (_super) { |
1374 | 1399 | var minCoin; |
1375 | 1400 | return __generator(this, function (_a) { |
1376 | 1401 | switch (_a.label) { |
1377 | - case 0: return [4 /*yield*/, PcSdk_1.default.I.minWithDrawal()]; | |
1402 | + case 0: return [4 /*yield*/, AppSdk_1.default.I.minWithDrawal()]; | |
1378 | 1403 | case 1: |
1379 | 1404 | minCoin = _a.sent(); |
1380 | 1405 | return [2 /*return*/, minCoin]; |
... | ... | @@ -1403,14 +1428,14 @@ var RedpacketConfigData = /** @class */ (function () { |
1403 | 1428 | return RedpacketConfigData; |
1404 | 1429 | }()); |
1405 | 1430 | |
1406 | -},{"../../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){ | |
1431 | +},{"../../event/EventCenter":5,"../../event/EventEnum":6,"../../sdk/AdManager":7,"../../sdk/TrackingSdk":11,"../../uitl/DateUtils":17,"../../uitl/ObjectInstance":18,"../../uitl/Util":21,"../AppSdk":8,"./BaseModel":12}],14:[function(require,module,exports){ | |
1407 | 1432 | "use strict"; |
1408 | 1433 | Object.defineProperty(exports, "__esModule", { value: true }); |
1409 | 1434 | var BaseModel_1 = require("./BaseModel"); |
1410 | 1435 | var DateUtils_1 = require("../../uitl/DateUtils"); |
1411 | 1436 | var Util_1 = require("../../uitl/Util"); |
1412 | 1437 | var ObjectInstance_1 = require("../../uitl/ObjectInstance"); |
1413 | -var PcSdk_1 = require("../PcSdk"); | |
1438 | +var AppSdk_1 = require("../AppSdk"); | |
1414 | 1439 | /** |
1415 | 1440 | * |
1416 | 1441 | */ |
... | ... | @@ -1433,7 +1458,7 @@ var ShakeModel = /** @class */ (function (_super) { |
1433 | 1458 | return __awaiter(this, void 0, void 0, function () { |
1434 | 1459 | var result, gameData; |
1435 | 1460 | return __generator(this, function (_a) { |
1436 | - result = PcSdk_1.default.I.gameConfig; | |
1461 | + result = AppSdk_1.default.I.gameConfig; | |
1437 | 1462 | ; |
1438 | 1463 | console.log('---------------ShakeModel-- 获取摇一摇静态表-----' + JSON.stringify(result)); |
1439 | 1464 | if (result['config']) { |
... | ... | @@ -1535,7 +1560,7 @@ var ShakeData = /** @class */ (function () { |
1535 | 1560 | return ShakeData; |
1536 | 1561 | }()); |
1537 | 1562 | |
1538 | -},{"../../uitl/DateUtils":17,"../../uitl/ObjectInstance":18,"../../uitl/Util":21,"../PcSdk":9,"./BaseModel":12}],15:[function(require,module,exports){ | |
1563 | +},{"../../uitl/DateUtils":17,"../../uitl/ObjectInstance":18,"../../uitl/Util":21,"../AppSdk":8,"./BaseModel":12}],15:[function(require,module,exports){ | |
1539 | 1564 | "use strict"; |
1540 | 1565 | Object.defineProperty(exports, "__esModule", { value: true }); |
1541 | 1566 | var Scene = Laya.Scene; |
... | ... | @@ -2069,4 +2094,4 @@ var DataKey; |
2069 | 2094 | })(DataKey = exports.DataKey || (exports.DataKey = {})); |
2070 | 2095 | |
2071 | 2096 | },{}]},{},[2]) |
2072 | -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvYXBwL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvR2FtZUNvbmZpZy50cyIsInNyYy9NYWluLnRzIiwic3JjL1JlZERyYXdhbC50cyIsInNyYy9UZXN0U2NlbmUudHMiLCJzcmMvZXZlbnQvRXZlbnRDZW50ZXIudHMiLCJzcmMvZXZlbnQvRXZlbnRFbnVtLnRzIiwic3JjL3Nkay9BZE1hbmFnZXIudHMiLCJzcmMvc2RrL05hdGl2ZUFkLnRzIiwic3JjL3Nkay9QY1Nkay50cyIsInNyYy9zZGsvVFRBZFNkay50cyIsInNyYy9zZGsvVHJhY2tpbmdTZGsudHMiLCJzcmMvc2RrL21vZGVsL0Jhc2VNb2RlbC50cyIsInNyYy9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWwudHMiLCJzcmMvc2RrL21vZGVsL1NoYWtlTW9kZWwudHMiLCJzcmMvdWkvbGF5YU1heFVJLnRzIiwic3JjL3VpdGwvQXJyYXlVdGlscy50cyIsInNyYy91aXRsL0RhdGVVdGlscy50cyIsInNyYy91aXRsL09iamVjdEluc3RhbmNlLnRzIiwic3JjL3VpdGwvT2JqZWN0UG9vbC50cyIsInNyYy91aXRsL1NjYWxlQnV0dG9uU2NyaXB0LnRzIiwic3JjL3VpdGwvVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNWQSxnR0FBZ0c7QUFDaEcseUNBQW1DO0FBQ25DLDhEQUF3RDtBQUN4RCx5Q0FBbUM7QUFDbkMsMkNBQXFDO0FBQ3JDOztFQUVFO0FBQ0Y7SUFhSTtJQUFjLENBQUM7SUFDUixlQUFJLEdBQVg7UUFDSSxJQUFJLEdBQUcsR0FBYSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUM3QyxHQUFHLENBQUMs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QUFDLGFBQWEsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtB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QUFDLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3pELENBQUM7OztPQUFBO0lBQ0wsV0FBQztBQUFELENBakJBLEFBaUJDLElBQUE7O0FBRUQsSUFBWSxPQU9YO0FBUEQsV0FBWSxPQUFPO0lBQ2Ysa0RBQXVDLENBQUE7SUFDdkMsc0RBQTJDLENBQUE7SUFDM0MsMENBQStCLENBQUE7SUFDL0IsOEJBQW1CLENBQUE7SUFDbkIsZ0NBQXFCLENBQUE7SUFDckIsZ0NBQXFCLENBQUE7QUFDekIsQ0FBQyxFQVBXLE9BQU8sR0FBUCxlQUFPLEtBQVAsZUFBTyxRQU9sQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcbn0pKCk7XHJcbihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cclxuaW1wb3J0IFRlc3RTY2VuZSBmcm9tIFwiLi9UZXN0U2NlbmVcIlxuaW1wb3J0IFNjYWxlQnV0dG9uU2NyaXB0IGZyb20gXCIuL3VpdGwvU2NhbGVCdXR0b25TY3JpcHRcIlxuaW1wb3J0IFJlZERyYXdhbCBmcm9tIFwiLi9SZWREcmF3YWxcIlxuaW1wb3J0IE5hdGl2ZUFkIGZyb20gXCIuL3Nkay9OYXRpdmVBZFwiXHJcbi8qXHJcbiog5ri45oiP5Yid5aeL5YyW6YWN572uO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lQ29uZmlne1xyXG4gICAgc3RhdGljIHdpZHRoOm51bWJlcj03NTA7XHJcbiAgICBzdGF0aWMgaGVpZ2h0Om51bWJlcj0xMzM0O1xyXG4gICAgc3RhdGljIHNjYWxlTW9kZTpzdHJpbmc9XCJmaXhlZHdpZHRoXCI7XHJcbiAgICBzdGF0aWMgc2NyZWVuTW9kZTpzdHJpbmc9XCJub25lXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25WOnN0cmluZz1cInRvcFwiO1xyXG4gICAgc3RhdGljIGFsaWduSDpzdHJpbmc9XCJsZWZ0XCI7XHJcbiAgICBzdGF0aWMgc3RhcnRTY2VuZTphbnk9XCJUZXN0U2NlbmUuc2NlbmVcIjtcclxuICAgIHN0YXRpYyBzY2VuZVJvb3Q6c3RyaW5nPVwiXCI7XHJcbiAgICBzdGF0aWMgZGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBzdGF0OmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgcGh5c2ljc0RlYnVnOmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgZXhwb3J0U2NlbmVUb0pzb246Ym9vbGVhbj10cnVlO1xyXG4gICAgY29uc3RydWN0b3IoKXt9XHJcbiAgICBzdGF0aWMgaW5pdCgpe1xyXG4gICAgICAgIHZhciByZWc6IEZ1bmN0aW9uID0gTGF5YS5DbGFzc1V0aWxzLnJlZ0NsYXNzO1xyXG4gICAgICAgIHJlZyhcIlRlc3RTY2VuZS50c1wiLFRlc3RTY2VuZSk7XG4gICAgICAgIHJlZyhcInVpdGwvU2NhbGVCdXR0b25TY3JpcHQudHNcIixTY2FsZUJ1dHRvblNjcmlwdCk7XG4gICAgICAgIHJlZyhcIlJlZERyYXdhbC50c1wiLFJlZERyYXdhbCk7XG4gICAgICAgIHJlZyhcInNkay9OYXRpdmVBZC50c1wiLE5hdGl2ZUFkKTtcclxuICAgIH1cclxufVxyXG5HYW1lQ29uZmlnLmluaXQoKTsiLCJpbXBvcnQgR2FtZUNvbmZpZyBmcm9tIFwiLi9HYW1lQ29uZmlnXCI7XHJcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vc2RrL0FkTWFuYWdlclwiO1xyXG5pbXBvcnQgU2hha2VNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvU2hha2VNb2RlbFwiO1xyXG5pbXBvcnQgUGNTZGsgZnJvbSBcIi4vc2RrL1BjU2RrXCI7XHJcbmltcG9ydCBSZWRwYWNrZXRNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWxcIjtcclxuY2xhc3MgTWFpbiB7XHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblx0XHQvL+agueaNrklEReiuvue9ruWIneWni+WMluW8leaTjlx0XHRcclxuXHRcdGlmICh3aW5kb3dbXCJMYXlhM0RcIl0pIExheWEzRC5pbml0KEdhbWVDb25maWcud2lkdGgsIEdhbWVDb25maWcuaGVpZ2h0KTtcclxuXHRcdGVsc2UgTGF5YS5pbml0KEdhbWVDb25maWcud2lkdGgsIEdhbWVDb25maWcuaGVpZ2h0LCBMYXlhW1wiV2ViR0xcIl0pO1xyXG5cdFx0TGF5YVtcIlBoeXNpY3NcIl0gJiYgTGF5YVtcIlBoeXNpY3NcIl0uZW5hYmxlKCk7XHJcblx0XHRMYXlhW1wiRGVidWdQYW5lbFwiXSAmJiBMYXlhW1wiRGVidWdQYW5lbFwiXS5lbmFibGUoKTtcclxuXHRcdExheWEuc3RhZ2Uuc2NhbGVNb2RlID0gR2FtZUNvbmZpZy5zY2FsZU1vZGU7XHJcblx0XHRMYXlhLnN0YWdlLnNjcmVlbk1vZGUgPSBHYW1lQ29uZmlnLnNjcmVlbk1vZGU7XHJcblx0XHRMYXlhLnN0YWdlLmFsaWduViA9IEdhbWVDb25maWcuYWxpZ25WO1xyXG5cdFx0TGF5YS5zdGFnZS5hbGlnbkggPSBHYW1lQ29uZmlnLmFsaWduSDtcclxuXHRcdC8v5YW85a655b6u5L+h5LiN5pSv5oyB5Yqg6L29c2NlbmXlkI7nvIDlnLrmma9cclxuXHRcdExheWEuVVJMLmV4cG9ydFNjZW5lVG9Kc29uID0gR2FtZUNvbmZpZy5leHBvcnRTY2VuZVRvSnNvbjtcclxuXHJcblx0XHQvL+aJk+W8gOiwg+ivlemdouadv++8iOmAmui/h0lEReiuvue9ruiwg+ivleaooeW8j++8jOaIluiAhXVybOWcsOWdgOWinuWKoGRlYnVnPXRydWXlj4LmlbDvvIzlnYflj6/miZPlvIDosIPor5XpnaLmnb/vvIlcclxuXHRcdGlmIChHYW1lQ29uZmlnLmRlYnVnIHx8IExheWEuVXRpbHMuZ2V0UXVlcnlTdHJpbmcoXCJkZWJ1Z1wiKSA9PSBcInRydWVcIikgTGF5YS5lbmFibGVEZWJ1Z1BhbmVsKCk7XHJcblx0XHRpZiAoR2FtZUNvbmZpZy5waHlzaWNzRGVidWcgJiYgTGF5YVtcIlBoeXNpY3NEZWJ1Z0RyYXdcIl0pIExheWFbXCJQaHlzaWNzRGVidWdEcmF3XCJdLmVuYWJsZSgpO1xyXG5cdFx0aWYgKEdhbWVDb25maWcuc3RhdCkgTGF5YS5TdGF0LnNob3coKTtcclxuXHRcdExheWEuYWxlcnRHbG9iYWxFcnJvciA9IHRydWU7XHJcblxyXG5cdFx0Ly/mv4DmtLvotYTmupDniYjmnKzmjqfliLbvvIx2ZXJzaW9uLmpzb27nlLFJREXlj5HluIPlip/og73oh6rliqjnlJ/miJDvvIzlpoLmnpzmsqHmnInkuZ/kuI3lvbHlk43lkI7nu63mtYHnqItcclxuXHRcdExheWEuUmVzb3VyY2VWZXJzaW9uLmVuYWJsZShcInZlcnNpb24uanNvblwiLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25WZXJzaW9uTG9hZGVkKSwgTGF5YS5SZXNvdXJjZVZlcnNpb24uRklMRU5BTUVfVkVSU0lPTik7XHJcblx0fVxyXG5cclxuXHRvblZlcnNpb25Mb2FkZWQoKTogdm9pZCB7XHJcblx0XHQvL+a/gOa0u+Wkp+Wwj+WbvuaYoOWwhO+8jOWKoOi9veWwj+WbvueahOaXtuWAme+8jOWmguaenOWPkeeOsOWwj+WbvuWcqOWkp+WbvuWQiOmbhumHjOmdou+8jOWImeS8mOWFiOWKoOi9veWkp+WbvuWQiOmbhu+8jOiAjOS4jeaYr+Wwj+WbvlxyXG5cdFx0TGF5YS5BdGxhc0luZm9NYW5hZ2VyLmVuYWJsZShcImZpbGVjb25maWcuanNvblwiLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Db25maWdMb2FkZWQpKTtcclxuXHR9XHJcblxyXG5cdG9uQ29uZmlnTG9hZGVkKCk6IHZvaWQge1xyXG5cclxuXHRcdHRoaXMuaW5pdERhdGEoKTtcclxuXHRcdC8v5Yqg6L29SURF5oyH5a6a55qE5Zy65pmvXHJcblx0XHRHYW1lQ29uZmlnLnN0YXJ0U2NlbmUgJiYgTGF5YS5TY2VuZS5vcGVuKEdhbWVDb25maWcuc3RhcnRTY2VuZSk7XHJcblx0fVxyXG5cclxuXHQvKirliJ3lp4vljJZTREsgKi9cclxuXHRhc3luYyBpbml0RGF0YSgpIHtcclxuXHRcdC8qKumakOiXj+WQr+WKqOWxjyAqL1xyXG5cdFx0UGNTZGsuSS5oaWRlU3BsYXNoKClcclxuXHRcdC8qKuWIneWni+WMlmFkayDojrflj5ZhcHDphY3nva7kv6Hmga8gKi9cclxuXHRcdFBjU2RrLkkuaW5pdCgpO1xyXG5cdFx0Lyoq6aKE5Yqg6L296KeG6aKRICovXHJcblx0XHRBZE1hbmFnZXIuSS5pbml0KCk7XHJcblx0XHQvKirojrflj5bnuqLljIXphY3nva4g5pGH5LiA5pGHIOetiemdmeaAgeaVsOaNriAqL1xyXG5cdFx0YXdhaXQgUGNTZGsuSS5pbml0R2FtZUNvbmZpZygpO1xyXG5cclxuXHJcblx0XHRhd2FpdCBSZWRwYWNrZXRNb2RlbC5JLmluaXQoKVxyXG5cclxuICAgICAgICBhd2FpdCBTaGFrZU1vZGVsLkkuaW5pdCgpO1xyXG5cdH1cclxufVxyXG4vL+a/gOa0u+WQr+WKqOexu1xyXG5uZXcgTWFpbigpO1xyXG4iLCJpbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgeyBFdmVudENlbnRlciB9IGZyb20gXCIuL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi9ldmVudC9FdmVudEVudW1cIjtcbmltcG9ydCBQY1NkayBmcm9tIFwiLi9zZGsvUGNTZGtcIjtcbi8qKlxuICog5Li755WM6Z2iICDph5HluIHph5Hpop1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkRHJhd2FsIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuICAgIC8qKiBAcHJvcCB7bmFtZTpjb2lubGFiLCB0aXBzOlwi6YeR5biBXCIsIHR5cGU6Tm9kZX0qL1xuICAgIGNvaW5sYWI6IExheWEuTGFiZWw7XG4gICAgLyoqIEBwcm9wIHtuYW1lOnRpcGxhYiwgdGlwczpcIuaPkOekulwiLCB0eXBlOk5vZGV9Ki9cbiAgICB0aXBsYWI6IExheWEuTGFiZWw7XG5cbiAgICBwcml2YXRlIHRvdGFsQ29pbjogbnVtYmVyID0gMTEwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cbiAgICBvblN0YXJ0KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXIoKTtcbiAgICAgICAgLy8gdGhpcy50aXBsYWIudmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBvbkVuYWJsZSgpIHtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5BUFBfU0hPVywgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5VUERBVEVfQ09JTiwgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICB9XG5cbiAgICBvbkRpc2FibGUoKSB7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uQVBQX1NIT1csIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uVVBEQVRFX0NPSU4sIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlU3RhcigpIHtcbiAgICAgICAgbGV0IGNvaW4gPSBhd2FpdCBQY1Nkay5JLm15Q29pbigpO1xuICAgICAgICB0aGlzLnRvdGFsQ29pbiA9IGNvaW47XG4gICAgICAgIHRoaXMuY29pbmxhYi50ZXh0ID0gJycgKyBjb2luO1xuICAgICAgICBsZXQgc3RyID0gJ+WPr+aPkOeOsCc7XG4gICAgICAgIC8qKuabtOaWsOS4i+S4i+S4gOasoeaPkOeOsOeahOmineW6piAqL1xuICAgICAgICBsZXQgbmV4dERyYXdhbCA9IGF3YWl0ICBQY1Nkay5JLm1pbldpdGhEcmF3YWwoKTtcbiAgICAgICAgaWYgKHRoaXMudG90YWxDb2luID4gMCkge1xuICAgICAgICAgICAgbGV0IGxlZnRDb2luID0gbmV4dERyYXdhbCAtIHRoaXMudG90YWxDb2luO1xuICAgICAgICAgICAgaWYgKGxlZnRDb2luID4gMClcbiAgICAgICAgICAgICAgICBzdHIgPSBg6L+Y5beuJHsobGVmdENvaW4gLyAxMDAwMCkudG9GaXhlZCgzKX3ph5Hpop3lj6/mj5DnjrBgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGlwbGFiLnRleHQgPSBzdHI7XG4gICAgICAgIHRoaXMudGlwbGFiLnZpc2libGUgPSBCb29sZWFuKG5leHREcmF3YWwpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyB1aSB9IGZyb20gXCIuL3VpL2xheWFNYXhVSVwiO1xuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9zZGsvQWRNYW5hZ2VyXCI7XG5pbXBvcnQgU2hha2VNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvU2hha2VNb2RlbFwiO1xuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xuaW1wb3J0IFBjU2RrIGZyb20gXCIuL3Nkay9QY1Nka1wiO1xuaW1wb3J0IE5hdGl2ZUFkIGZyb20gXCIuL3Nkay9OYXRpdmVBZFwiO1xuaW1wb3J0IFV0aWwgZnJvbSBcIi4vdWl0bC9VdGlsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RTY2VuZSBleHRlbmRzIHVpLlRlc3RTY2VuZVVJIHtcbiAgICBwcml2YXRlIGlzTG9uZ1ZpYnJhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy/lhbPpl63lpJrngrnop6bmjqfvvIzlkKbliJnlsLHml6DmlYzkuoZcbiAgICAgICAgTGF5YS5Nb3VzZU1hbmFnZXIubXVsdGlUb3VjaEVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLVRlc3RTY2VuZS0tLS0tLS0nKVxuICAgICAgICAvLyB0aGlzLk5hdGl2ZUFELnZpc2libGUgPSBmYWxzZTtcblxuICAgIH1cblxuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJ0blNlcnZlci5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5TZXJ2ZXIpO1xuICAgICAgICB0aGlzLmJ0blZpYnJhdGUub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgUGNTZGsuSS52aWJyYXRlKHRoaXMuaXNMb25nVmlicmF0ZSA/IDAgOiAxKTtcbiAgICAgICAgICAgIHRoaXMuaXNMb25nVmlicmF0ZSA9ICF0aGlzLmlzTG9uZ1ZpYnJhdGU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJ0bkRyYXdhbC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5QZXJzb25hbCk7XG4gICAgICAgIHRoaXMuYnRuSW52aXRlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuaW52aXRhdGlvbik7XG4gICAgICAgIHRoaXMuYnRuX3NoYWtlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMudG91Y2hTaGFrZSk7XG4gICAgICAgIHRoaXMuYnRuUHJlbG9hZEFELm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMucHJlbG9hZEFEKTtcbiAgICAgICAgdGhpcy5idG5TaG93QmFubmVyLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0Jhbm5lcik7XG4gICAgICAgIHRoaXMuYnRuU2hvd0Z1bGxBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dGdWxsQWQpO1xuICAgICAgICB0aGlzLmJ0blNob3dOYXRpdmVBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dOYXRpdmVBZCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd0ludGVyQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93SW50ZXJBZCk7XG4gICAgICAgIHRoaXMuYnRuUmV3YXJkQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93UmV3YXJkQWQpO1xuICAgICAgICB0aGlzLmJ0blJlZHBhY2tldC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9wZW5SZWRwYWNrZXQpO1xuXG4gICAgICAgIHRoaXMuYnRuUHJlVmlkZW8ub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkUmV3YXJkQWQpO1xuICAgICAgICB0aGlzLmJ0blByZUZ1bGwub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkRnVsbCk7XG4gICAgICAgIHRoaXMuYnRuUHJlSW5zZXJ0Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMucHJlbG9hZEludGVyQWQpO1xuICAgICAgICB0aGlzLmJ0blByZU5hdGl2ZS5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnByZWxvYWROYXRpdmVBZCk7XG4gICAgICAgIHRoaXMuYnRuQ2xvc2VCYW5uZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5jbG9zZUFkQmFubmVyKTtcbiAgICAgICAgdGhpcy5idG5DbG9zZU5hdGl2ZS5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLmNsb3NlQWR2ZXJEaWFsb2cpO1xuICAgICAgICB0aGlzLmJ0bk1pbldpdGhEcmF3YWwub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5taW5XaXRoRHJhd2FsKTtcblxuICAgIH1cblxuICAgIC8qKumihOWKoOi9veW5v+WRiiAqL1xuICAgIGFzeW5jIHByZWxvYWRBRCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXByZWxvYWRBRC0tLS0tLS0nKVxuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5wcmVsb2FkQmFubmVyKCk7XG4gICAgfVxuXG4gICAgcHJlbG9hZFJld2FyZEFkKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5wcmVsb2FkUmV3YXJkQWQoKTtcbiAgICB9XG5cbiAgICBwcmVsb2FkRnVsbCgpIHtcbiAgICAgICAgQWRNYW5hZ2VyLkkucHJlbG9hZEZ1bGxBZCgpO1xuICAgIH1cblxuICAgIHByZWxvYWRJbnRlckFkKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5wcmVsb2FkSW50ZXJBZCgpO1xuICAgIH1cblxuICAgIHByZWxvYWROYXRpdmVBZCgpIHtcbiAgICAgICAgdGhpcy5OYXRpdmVBRC5nZXRDb21wb25lbnQoTmF0aXZlQWQpLmluaXROYXRpdmVBZCgxKTtcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkdmVyRGlhbG9nKClcbiAgICB9XG4gICAgY2xvc2VBZEJhbm5lcigpIHtcbiAgICAgICAgQWRNYW5hZ2VyLkkuY2xvc2VBZEJhbm5lcigpXG4gICAgfVxuXG4gICAgLyoq5pi+56S65YWo5bGP5bm/5ZGKICovXG4gICAgc2hvd0Z1bGxBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dGdWxsQWQtLS0tLS0tJylcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd0Z1bGxBZCgpO1xuICAgIH1cbiAgICAvKirmmL7npLpiYW5uZXIgKi9cbiAgICBzaG93QmFubmVyKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0Jhbm5lci0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93QmFubmVyKCk7XG4gICAgfVxuXG4gICAgLyoq5L+h5oGv5rWB5bm/5ZGKICovXG4gICAgc2hvd05hdGl2ZUFkKCkge1xuICAgICAgICB0aGlzLk5hdGl2ZUFELmdldENvbXBvbmVudChOYXRpdmVBZCkuaW5pdE5hdGl2ZUFkKCk7XG4gICAgfVxuXG4gICAgLyoq5o+S5bGP5bm/5ZGKICovXG4gICAgc2hvd0ludGVyQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93SW50ZXJBZC0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93SW50ZXJBZCgpO1xuICAgIH1cbiAgICAvKirmv4DlirHop4bpopHlub/lkYogKi9cbiAgICBhc3luYyBzaG93UmV3YXJkQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93UmV3YXJkQWQtLS0tLS0tJylcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCk7XG4gICAgICAgIC8qKuaIkOWKn+WQjuaJp+ihjOWvueW6lOeahOWlluWKsSAqL1xuICAgIH1cbiAgICAvKirmhI/op4Hlj43ppoggKi9cbiAgICBvcGVuU2VydmVyKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tb3BlblNlcnZlci0tLS0tLS0nKVxuICAgICAgICBQY1Nkay5JLmZlZWRiYWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlblJlZHBhY2tldCgpIHtcbiAgICAgICAgUmVkcGFja2V0TW9kZWwuSS5jaGVja1JlZHBhY2tldCgpXG4gICAgfVxuXG4gICAgYXN5bmMgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1vbmV5ID0gYXdhaXQgUGNTZGsuSS5taW5XaXRoRHJhd2FsKClcbiAgICAgICAgdGhpcy5taW5XaXRoRHJhd2FsTGFiLnRleHQgPSAn5pyA5L2O5o+Q546wOicgKyBtb25leTtcbiAgICB9XG5cblxuICAgIC8qKuaJk+W8gOS4quS6uuS4reW/gyAqL1xuICAgIG9wZW5QZXJzb25hbCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLW9wZW5TZXJ2ZXItLS0tLS0tJylcbiAgICAgICAgUGNTZGsuSS5wZXJzb25hbCgwKTtcbiAgICB9XG4gICAgLyoq6YKA6K+35aW95Y+LICovXG4gICAgaW52aXRhdGlvbigpIHtcbiAgICAgICAgUGNTZGsuSS5pbnZpdGF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMVx06YeR5biBXG4gICAgMlx05r+A5Yqx6KeG6aKR5ZCO6YeR5biBXG4gICAgM1x0NCA1IDYgNyDmuLjmiI/kuK3lr7nlupTnmoTpgZPlhbdcbiAgICA4XHTnqbpcbiAgICAgKi9cbiAgICB0b3VjaFNoYWtlKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tdG91Y2hTaGFrZS0tLS0tLS0nKVxuICAgICAgICBQY1Nkay5JLnZpYnJhdGUoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIDEu5Zue5Y675pif5pifIOmBk+WFtyBcbiAgICAgICAgICogMi7nuqLljIUgICDnm7TmjqXojrflvpfivqbluIHvvJvmiJbogIXnm7TmjqXlvLnmv4DlirHop4bpopHlkI7vvIzojrflvpfivqbluIFcbiAgICAgICAgICogMy7ml6DpgZPlhbdcbiAgICAgICAgICog55u05o6l5bGV4r2w5o+S5bGPXG4gICAgICAgICAqICAqL1xuICAgICAgICBsZXQgZGF0YSA9IFNoYWtlTW9kZWwuSS5nZXRTaGFrZVR5cGUoKTtcbiAgICAgICAgY29uc29sZS5sb2coJ+aRh+S4gOaRh+iOt+WPlue7k+aenO+8micgKyBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgIC8qKiAn6LCi6LCi5Y+C5LiO77yM5LiL5qyh5aW96L+Q77yBJyovO1xuICAgICAgICAgICAgICAgIEFkTWFuYWdlci5JLnNob3dJbnRlckFkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb2luKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaEFEQ29pbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcHMoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQcm9wcyhkYXRhKSB7XG4gICAgICAgIGxldCBib29zdGVyO1xuICAgICAgICBsZXQgcmV3YXJkTnVtID0gZGF0YS5udW07XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICAvKipcbiAgICAgICAgICog5aSE55CG5ri45oiP5Lit55qE6YGT5YW35pi+56S6XG4gICAgICAgICAqL1xuICAgICAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgLy8gICAgIGNhc2UgNDpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmVtb3ZlO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSA2OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5DaGFuZ2U7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDU6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJlZnJlc2g7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDc6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJhbmRSZW1vdmU7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDM6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlN0YXI7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlY2VpdmVQcm9wc1BvcHdpbiwgYm9vc3RlciwgcmV3YXJkTnVtKTtcblxuICAgIH1cbiAgICAvKipcbiAgICAgKiDnnIvlub/lkYrojrflvpfnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyB3YXRjaEFEQ29pbigpIHtcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCk7XG4gICAgICAgIHRoaXMuZ2V0Q29pbigpO1xuICAgIH1cbiAgICAvKirnm7TmjqXojrflvpfnuqLljIUgKi9cbiAgICBnZXRDb2luKCkge1xuICAgICAgICAvL1xi5Yi35paw5oC76YeR5biBXG4gICAgICAgIC8vIEFwcE1hbmFnZXIuSS5yZWRwYWNrZXQuZ2V0UmVwYWNrZXQoKVxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JLm9wZW5Qb3B3aW4oUmVkUGFja2V0UmV3YXJkLCAyKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vRXZlbnRFbnVtXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEV2ZW50Q2VudGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IExheWEuRXZlbnREaXNwYXRjaGVyO1xuICAgIHByaXZhdGUgc3RhdGljIGdldCBJKCk6IExheWEuRXZlbnREaXNwYXRjaGVyIHtcbiAgICAgICAgd2luZG93WydldiddID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW1pdChldmVudDogRXZlbnRFbnVtLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuSS5ldmVudChldmVudC50b1N0cmluZygpLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZCh0eXBlOiBFdmVudEVudW0sIGNhbGxlcjogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIGFyZ3M/OiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuSS5vbih0eXBlLnRvU3RyaW5nKCksIGNhbGxlciwgbGlzdGVuZXIsIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHR5cGU6IEV2ZW50RW51bSwgY2FsbGVyOiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLkkub2ZmKHR5cGUudG9TdHJpbmcoKSwgY2FsbGVyLCBsaXN0ZW5lcik7XG4gICAgfVxufSIsImV4cG9ydCBlbnVtIEV2ZW50RW51bSB7XG5cblx0Q0hFQ0tfUkVEUEFDS0VUID0gPGFueT4nY2hlY2tfcmVkcGFja2V0Jyxcblx0QVBQX1NIT1cgPSA8YW55PidhcHAuc2hvdycsXG5cdEFQUF9ISURFID0gPGFueT4nYXBwLmhpZGUnLFxuXG5cblx0VVBEQVRFX0NPSU4gPSA8YW55Pid1cGRhdGUuY29pbicsXG5cbn0iLCJpbXBvcnQgVFRBZFNkayBmcm9tIFwiLi9UVEFkU2RrXCI7XHJcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRNYW5hZ2VyIHtcclxuICAgIHByaXZhdGUgbGFzdFZpZGVvVGltZTogbnVtYmVyO1xyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5wcmVsb2FkUmV3YXJkQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkQmFubmVyKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkQmFubmVyRXhwcmVzc0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRSZXdhcmRBZCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkuc2hvd1Jld2FyZFZpZGVvQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZEZ1bGxBZCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRJbnRlckFkKCkge1xyXG4gICAgICAgIC8vIFRUQWRTZGsuSS5zaG93SW50ZXJhY3Rpb25FeHByZXNzQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZE5hdGl2ZUFkKCl7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5jbG9zZUFkdmVyRGlhbG9nKClcclxuICAgIH1cclxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmNsb3NlQWRCYW5uZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dSZXdhcmRBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dSZXdhcmRWaWRlb0FkKCk7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFZpZGVvVGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBzaG93RnVsbEFkKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBUVEFkU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRGdWxsQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93SW50ZXJBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgpO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRJbnRlckFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEludGVyQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hlY2tWaWRlb0luQ2QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZpZGVvVGltZSAmJiAoTGF5YS50aW1lci5jdXJyVGltZXIgLSB0aGlzLmxhc3RWaWRlb1RpbWUgPD0gMzAwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHNob3dOYXRpdmVBZCh4LCB5LCB3LCBoLHByZWxvYWQ9MCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkTmF0aXZlRXhwcmVzc0FkKHgsIHksIHcsIGgscHJlbG9hZCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogQWRNYW5hZ2VyIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KEFkTWFuYWdlcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vQWRNYW5hZ2VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdGl2ZUFkIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuXG4gICBwdWJsaWMgaW5pdE5hdGl2ZUFkKHByZWxvYWQ9MCl7XG4gICAgICAgIGxldCBnbG9iYWxQb2ludCA9IHRoaXMuaXRlbS5sb2NhbFRvR2xvYmFsKExheWEuUG9pbnQuRU1QVFksIHRydWUpO1xuICAgICAgICBBZE1hbmFnZXIuSS5zaG93TmF0aXZlQWQoZ2xvYmFsUG9pbnQueCwgZ2xvYmFsUG9pbnQueSwgdGhpcy5pdGVtLndpZHRoLCB0aGlzLml0ZW0uaGVpZ2h0LHByZWxvYWQpO1xuICAgIH1cbiAgICBvbkVuYWJsZSgpOiB2b2lkIHtcbiAgICAgICB0aGlzLmluaXROYXRpdmVBZCgpOyAgIFxuICAgIH1cblxuICAgIG9uRGlzYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgQWRNYW5hZ2VyLkkuY2xvc2VBZHZlckRpYWxvZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGl0ZW0oKTogTGF5YS5WaWV3IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3duZXIgYXMgYW55O1xuICAgIH1cbn0iLCJpbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCB7IEV2ZW50Q2VudGVyIH0gZnJvbSBcIi4uL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi4vZXZlbnQvRXZlbnRFbnVtXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBjU2RrIHtcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2hlaWdodDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2NoYW5uZWw6IHN0cmluZztcbiAgICBwcml2YXRlIF92ZXJzaW9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfbGV2ZWw6IG51bWJlcjtcbiAgICBwcml2YXRlIF9nYW1lQ29uZmlnOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgcGFuZ29saW5JZDogc3RyaW5nO1xuICAgIHB1YmxpYyBhZG5ldElkOiBzdHJpbmc7XG5cbiAgICBpbml0KCkge1xuICAgICAgICB0aGlzLmdldFN5c3RlbUluZm8oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBteUJyaWRnZSgpIHtcbiAgICAgICAgaWYgKE15QnJpZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gTXlCcmlkZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgLyoq6I635Y+W5Z+65pys54mI5pys5L+h5oGv5Lul5Y+K5omL5py655qE6YWN572uICovXG4gICAgcHJpdmF0ZSBnZXRTeXN0ZW1JbmZvKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICBsZXQgcmV0ID0gdGhpcy5teUJyaWRnZS5nZXRTeXN0ZW1JbmZvKGtleSk7XG4gICAgICAgIGxldCB7IHcsIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsIH0gPSBKU09OLnBhcnNlKHJldCk7XG4gICAgICAgIFt0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0aGlzLl92ZXJzaW9uLFxuICAgICAgICB0aGlzLl9jaGFubmVsLCB0aGlzLnBhbmdvbGluSWQsXG4gICAgICAgIHRoaXMuYWRuZXRJZCwgdGhpcy5fbGV2ZWxdID0gW3csIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsXTtcbiAgICB9XG5cbiAgICBpbml0R2FtZUNvbmZpZygpIHtcbiAgICAgICAgdGhpcy5fZ2FtZUNvbmZpZyA9IHRoaXMuZ2V0R2FtZUNvbmZpZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmch+WKqFxuICAgICAqIEBwYXJhbSBrZXkgMCDnn63pnIfliqggMSDplb/pnIfliqhcbiAgICAgKi9cbiAgICB2aWJyYXRlKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5TeXN0ZW1GdW4oa2V5KTtcbiAgICB9XG5cbiAgICAvKirpmpDol4/lkK/liqjlsY8gKi9cbiAgICBoaWRlU3BsYXNoKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmhpZGVTcGxhc2goKTtcbiAgICB9XG5cbiAgICAvKirlvLnlh7rmj5DnjrAgKi9cbiAgICB3aXRoRHJhd2FsKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLndpdGhEcmF3YWwoKTtcbiAgICB9XG4gICAgLyoq5oSP6KeB5Y+N6aaIICovXG4gICAgZmVlZGJhY2soKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuZmVlZGJhY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoga2V5IOm7mOiupDAg77yM562+5YiwIDFcbiAgICAgKi9cbiAgICBwZXJzb25hbChrZXkgPSAwKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UucGVyc29uYWwoa2V5KTtcbiAgICB9XG4gICAgLyoq6YKA6K+35aW95Y+LKi9cbiAgICBpbnZpdGF0aW9uKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmludml0YXRpb24oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6I635Y+W6YeR5biB6YWN6KGoXG4gICAgICogQHBhcmFtIGtleSAx57qi5YyFICAgMiDmkYfkuIDmkYfnuqLljIVcbiAgICAgKi9cbiAgICBnZXRHYW1lQ29uZmlnKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5teUJyaWRnZS5nZXRHYW1lQ29uZmlnKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1nZXRHYW1lQ29uZmlnLS0tLS0tLScgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDopoHmsYLlj5HmlL7ph5HluIFcbiAgICAgKiBAcGFyYW0ga2V5IDHnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyBhZGRHb2xkKGtleSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLmFkZEdvbGQoa2V5LCByZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIC8qKuiOt+WPluaAu+mHkeW4gSAqL1xuICAgIGFzeW5jIG15Q29pbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5teUJyaWRnZS5teUNvaW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydjb2luJ10pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvKirojrflj5blvZPliY3mj5DnjrDnmoTmoaPkvY0gKi9cbiAgICBhc3luYyBtaW5XaXRoRHJhd2FsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLm1pbldpdGhEcmF3YWwocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydtb25leSddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKuS4iuaKpeWfi+eCuSAqL1xuICAgIGFwcERvdExvZyhrZXk6IHN0cmluZywgdmFsdWU/KSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuYXBwRG90TG9nKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKirng63kupHmiZPngrkgKi9cbiAgICBhcHBEb3RUcmFjS2luZyhrZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmFwcERvdFRyYWNLaW5nKGtleSk7XG4gICAgfVxuXG4gICAgc2V0Q2FsbGJhY2soZnVuTmFtZTogc3RyaW5nLCBwcmFtYXM/OiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNldENhbGxiYWNrLS0tLSB0aGlzLm15QnJpZGdlLS0tJyArIEpTT04uc3RyaW5naWZ5KHRoaXMubXlCcmlkZ2UpKVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5teUJyaWRnZVtmdW5OYW1lXShwcmFtYXMsIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSwgZGF0YSB9ID0gSlNPTi5wYXJzZShyZXMpO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmNsb3NlQWR2ZXJEaWFsb2coKTtcbiAgICB9XG4gICAgY2xvc2VBZEJhbm5lcigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5jbG9zZUFkQmFubmVyKCk7XG4gICAgfVxuICAgIC8qKua/gOWKseinhumikSAqL1xuICAgIHNob3dSZXdhcmRWaWRlb0FkKHZhbHVlOiBJVmlkZW8sIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd1Jld2FyZFZpZGVvQWQodmFsdWUsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKiDlhajlsY/lub/lkYoqL1xuICAgIGxvYWRGdWxsU2NyZWVuVmlkZW9BZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd1Jld2FyZFZpZGVvQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoq5L+h5oGv5rWB5bm/5ZGKICovXG4gICAgbG9hZE5hdGl2ZUV4cHJlc3NBZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UubG9hZE5hdGl2ZUV4cHJlc3NBZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKipiYW5uZXIgKi9cbiAgICBsb2FkQmFubmVyRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkQmFubmVyRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKuaPkuWxj+W5v+WRiiAqL1xuICAgIHNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuXG4gICAgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gICAgfVxuICAgIGdldCB3aWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH1cblxuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cblxuICAgIGdldCBjaGFubmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhbm5lbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGJyaWRnZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGdhbWVDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nYW1lQ29uZmlnO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogUGNTZGsge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFBjU2RrKTtcbiAgICB9XG59XG4vLyAgICAgLy/ov5nph4zmmK/mtY/op4jlmajnjq/looPkuIvvvIwg5o6l5pS2d2Vi5Lyg6L+H5p2l55qE5raI5oGvXG53aW5kb3cub25NeUJyaWRnZVJlYWR5ID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwib25NeUJyaWRnZVJlYWR5IGxvYWQgZmluaXNoLCBjb3N0OlwiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpKSArIFwibXNcIik7XG4gICAgTXlCcmlkZ2UuQXBwLm9uUmVzdW1lID0gKC4uLnJldCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgICBsYXlhIG9uUmVzdW1lJywgcmV0KVxuICAgICAgICBFdmVudENlbnRlci5lbWl0KEV2ZW50RW51bS5BUFBfU0hPVyk7XG4gICAgfVxuICAgIE15QnJpZGdlLkFwcC5vblBhdXNlID0gKC4uLnJldCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIGxheWEgb25QYXVzZScsIHJldClcbiAgICAgICAgRXZlbnRDZW50ZXIuZW1pdChFdmVudEVudW0uQVBQX0hJREUpO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElWaWRlbyB7XG4gICAgcHJlbG9hZGluZzogbnVtYmVyLFxuICAgIHR5cGU6IG51bWJlcixcbn0iLCJpbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuaW1wb3J0IFBjU2RrIGZyb20gXCIuL1BjU2RrXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUVEFkU2RrIHtcclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJlbG9hZCAgMCDnm7TmjqXliqDovb3vvJsxIOmihOWKoOi9vVxyXG4gICAgICovXHJcbiAgICBhc3luYyBzaG93UmV3YXJkVmlkZW9BZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IDEsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFBjU2RrLkkuc2hvd1Jld2FyZFZpZGVvQWQoZGF0YSwgcmV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB7IGNvZGUsIG1lc3NhZ2UgfSA9IEpTT04ucGFyc2UocmV0KTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgLTE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAvKion5pqC5peg6KeG6aKR5bm/5ZGK77yB5q+P5pelMOeCuemHjee9ricqLztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgndW5Db21wbGV0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEZ1bGxTY3JlZW5WaWRlb0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogUGNTZGsuSS53aWR0aCxcclxuICAgICAgICAgICAgaDogUGNTZGsuSS53aWR0aCAqIDkwIC8gNjAwLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB0eXBlOiAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFBjU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLHJlcz0+e1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkTmF0aXZlRXhwcmVzc0FkKHgsIHksIHdpZHRoLCBoZWlnaHQsIHR5cGUgPSAxLCBwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IHNjYWxlWCA9IFBjU2RrLkkud2lkdGggLyBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgIGxldCBzY2FsZVkgPSBQY1Nkay5JLmhlaWdodCAvIExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB3OiB3aWR0aCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgaDogaGVpZ2h0ICogc2NhbGVZLFxyXG4gICAgICAgICAgICBsZWZ0OiB4ICogc2NhbGVYLFxyXG4gICAgICAgICAgICB0b3A6IHkgKiBzY2FsZVlcclxuICAgICAgICB9XHJcbiAgICAgICAgUGNTZGsuSS5sb2FkTmF0aXZlRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLHJlcz0+e1xyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXMpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQmFubmVyRXhwcmVzc0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogUGNTZGsuSS53aWR0aCxcclxuICAgICAgICAgICAgaDogUGNTZGsuSS53aWR0aCAqIDkwIC8gNjAwLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB0eXBlOiAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFBjU2RrLkkubG9hZEJhbm5lckV4cHJlc3NBZChKU09OLnN0cmluZ2lmeShkYXRhKSxyZXM9PntcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VBZHZlckRpYWxvZygpIHtcclxuICAgICAgICBQY1Nkay5JLmNsb3NlQWR2ZXJEaWFsb2coKTtcclxuICAgIH1cclxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XHJcbiAgICAgICAgUGNTZGsuSS5jbG9zZUFkQmFubmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogUGNTZGsuSS53aWR0aCAqIDAuOCxcclxuICAgICAgICAgICAgaDogUGNTZGsuSS5oZWlnaHQsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFBjU2RrLkkuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLHJlcz0+e1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVFRBZFNkayB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChUVEFkU2RrKSBhcyBUVEFkU2RrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcbmltcG9ydCBQY1NkayBmcm9tIFwiLi9QY1Nka1wiO1xyXG4vKipcclxuICog5LiK5oql54Ot5LqR5Z+L54K54r2H5b+XXHJcbiAqIOWFt+S9k+eahOaJk+eCuemcgOimgei3n+i/kOiQpeiBlOezu1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhY2tpbmdTZGsge1xyXG4gICAgZG90KGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgUGNTZGsuSS5hcHBEb3RUcmFjS2luZyhrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgSSgpOiBUcmFja2luZ1NkayB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChUcmFja2luZ1NkaykgYXMgVHJhY2tpbmdTZGs7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRyYWNraW5nS2V5IHtcclxuICAgIFJlZFBhY2sxID0gJ2V2ZW50XzUnLFxyXG4gICAgUmVkUGFjazUgPSAnZXZlbnRfNidcclxufVxyXG4iLCJpbXBvcnQgQXJyYXlVdGlscyBmcm9tIFwiLi4vLi4vdWl0bC9BcnJheVV0aWxzXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgICBwcm90ZWN0ZWQgX2RhdGE6IGFueSA9IHt9O1xuICAgIHByaXZhdGUgdXBkYXRlQXJyOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcbiAgICBwcml2YXRlIGtleVVwZGF0ZUFycjogYW55ID0ge307XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGRhdGE6IGFueSkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fZGF0YSxcbiAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUFyci5mb3JFYWNoKGZ1bmMgPT4ge1xuICAgICAgICAgICAgZnVuYyh0aGlzLl9kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMua2V5VXBkYXRlQXJyKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBhcnIgPSB0aGlzLmtleVVwZGF0ZUFycltrZXldO1xuICAgICAgICAgICAgICAgIGFyciAmJiBhcnIuZm9yRWFjaChmdW5jID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZnVuYyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3YWl0Rm9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNiID0gZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZVcGRhdGUoY2IsIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZShjYiwga2V5LCB0cnVlKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VcGRhdGUoZnVuYzogRnVuY3Rpb24sIGtleT86IHN0cmluZywgcnVuOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLl9kYXRhW2tleV07XG4gICAgICAgICAgICBydW4gJiYgdmFsdWUgIT0gbnVsbCAmJiBmdW5jKHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBhcnIgPSB0aGlzLmtleVVwZGF0ZUFycltrZXldO1xuICAgICAgICAgICAgIWFyciAmJiAodGhpcy5rZXlVcGRhdGVBcnJba2V5XSA9IGFyciA9IFtdKTtcbiAgICAgICAgICAgIGFyci5wdXNoKGZ1bmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuICYmIGZ1bmModGhpcy5fZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFyci5wdXNoKGZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9mZlVwZGF0ZShmdW5jOiBGdW5jdGlvbiwga2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIEFycmF5VXRpbHMucmVtb3ZlRnJvbUFycih0aGlzLmtleVVwZGF0ZUFycltrZXldLCBmdW5jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEFycmF5VXRpbHMucmVtb3ZlRnJvbUFycih0aGlzLnVwZGF0ZUFyciwgZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJHYW1lKCkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxufSIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSBcIi4vQmFzZU1vZGVsXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuLi8uLi9zZGsvQWRNYW5hZ2VyXCI7XG5pbXBvcnQgVGVhU2RrLCB7IERvdEtleSB9IGZyb20gXCIuLi8uLi9zZGsvVGVhU2RrXCI7XG5pbXBvcnQgVHJhY2tpbmdTZGssIHsgVHJhY2tpbmdLZXkgfSBmcm9tIFwiLi4vLi4vc2RrL1RyYWNraW5nU2RrXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi4vLi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuLi8uLi9ldmVudC9FdmVudEVudW1cIjtcbmltcG9ydCBQY1NkayBmcm9tIFwiLi4vUGNTZGtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkcGFja2V0TW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAgIHByaXZhdGUgTUFYID0gMjA7XG4gICAgLyoq5b2T5aSp6aKG5Y+W57qi5YyF55qE5pyA5aSn5qyh5pWwICovXG4gICAgcHJpdmF0ZSBEQVlfTUFYX0NOVCA9IDUwO1xuICAgIHByaXZhdGUgY29uZjogYW55O1xuICAgIHB1YmxpYyBjdXJSZWRwYWNrZXQ6IG51bWJlciA9IDA7XG4gICAgcHVibGljIGNvbmZMZW46IG51bWJlciA9IDA7XG5cbiAgICAvKirliJ3lp4vljJbnuqLljIXphY3nva4gKi9cbiAgICBhc3luYyBpbml0KCkge1xuXG4gICAgICAgIGxldCBhcnIgPSBhd2FpdCB0aGlzLmdldFJlZENvbmZpZygpO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tUmVkcGFja2V0TW9kZWwtLS0tLS0tJyArIEpTT04uc3RyaW5naWZ5KGFycikpXG4gICAgICAgIGxldCBjYXNoID0gMDtcbiAgICAgICAgdGhpcy5jb25mID0ge307XG4gICAgICAgIGFyci5mb3JFYWNoKGNvbmZEYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZltjb25mRGF0YS5pZF0gPSBjb25mRGF0YTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5pbml0RGF0YSgpKTtcbiAgICAgICAgdGhpcy5jb25mTGVuID0gdGhpcy5jb25mLmxlbmd0aDtcblxuICAgIH1cblxuXG5cbiAgICBpbml0RGF0YSgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgUmVkcGFja2V0RGF0YTtcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5sYXN0VGltZSkgfHwgJzAnO1xuICAgICAgICBkYXRhLmxhc3RUaW1lID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuXG4gICAgICAgIGxldCBsYXN0ID0gRGF0ZVV0aWxzLnRpbWVEYXkoZGF0YS5sYXN0VGltZSk7XG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcbiAgICAgICAgaWYgKGxhc3QgIT0gdG9kYXkpIHtcbiAgICAgICAgICAgIGRhdGEudG9kYXlDbnQgPSAwO1xuICAgICAgICAgICAgbGFzdFRpbWUgPSBEYXRlVXRpbHMubm93VGltZS50b1N0cmluZygpO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5sYXN0VGltZSwgbGFzdFRpbWUpXG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnRvZGF5Q250LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0b2RheUNudCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkudG9kYXlDbnQpIHx8ICcwJztcbiAgICAgICAgICAgIGRhdGEudG9kYXlDbnQgPSBwYXJzZUludCh0b2RheUNudCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5sYXN0VGltZSA9IHBhcnNlSW50KGxhc3RUaW1lKTtcbiAgICAgICAgbGV0IGRhdGFDbnQgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5LmRhdGFDTlQpIHx8ICcwJztcbiAgICAgICAgZGF0YS5jbnQgPSBwYXJzZUludChkYXRhQ250KTtcbiAgICAgICAgZGF0YS5saXN0ID0gW107XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuXG4gICAgYXN5bmMgZ2V0UmVkQ29uZmlnKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gUGNTZGsuSS5nYW1lQ29uZmlnO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tIOiOt+WPlumFjee9rumdmeaAgeihqC0tLS0tJyArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBjb25maWdKc29uID0gYXdhaXQgdGhpcy5sb2FkR29sZENmZyhyZXN1bHRbJ2NvaW5fY29uZmlnJ11bMF0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0g6I635Y+W57qi5YyF6Z2Z5oCB6KGoLS0tLS0nICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSlcbiAgICAgICAgICAgIHJldHVybiBjb25maWdKc29uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUGNTZGsuSS5pbml0R2FtZUNvbmZpZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGxvYWRHb2xkQ2ZnKHJlczogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb25maWdKc29uID0gYXdhaXQgdGhpcy5sb2FkKHJlcyk7XG4gICAgICAgIHJldHVybiBjb25maWdKc29uO1xuICAgIH1cblxuICAgIGxvYWQocmVzLCBvblByb2dyZXNzPzogTGF5YS5IYW5kbGVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChzdWMsIGZhaWwpID0+IHtcbiAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQocmVzLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHN1YyksIG9uUHJvZ3Jlc3MpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrUmVkcGFja2V0KCkge1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEudG9kYXlDbnQgPj0gdGhpcy5EQVlfTUFYX0NOVCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQWRNYW5hZ2VyLkkuY2hlY2tWaWRlb0luQ2QoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvKirnuqLljIXojrflj5blkI7msqHmnInnnIvlub/lkYrpooblj5bvvIzlho3mrKHojrflvpfnuqLljIXnmoTmnLrkvJrvvIzkuI3kvJrojrflj5bnuqLljIXvvIwg6Ieq5bex5Lmf5Y+v5Lul5aSE55CG5oiQIOWvueW6lOeahOe6ouWMheaPkOmGkuaIluS4jemcgOimgei/memHjOeahOWIpOaWrSAqL1xuICAgICAgICBpZiAodGhpcy5jdXJSZWRwYWNrZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5kZWZpbmVkID09PSB0aGlzLmRhdGEuY250KSB0aGlzLmRhdGEuY250ID0gMDtcbiAgICAgICAgbGV0IGNudCA9IHRoaXMuZGF0YS5jbnQ7XG4gICAgICAgIGlmIChjbnQgPj0gdGhpcy5jb25mTGVuKSBjbnQgPSB0aGlzLmNvbmZMZW4gLSAxO1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuY29uZltjbnQgKyAxXTtcbiAgICAgICAgbGV0IHJhbjIgPSBNYXRoLnJhbmRvbSgpO1xuXG4gICAgICAgIGlmIChkYXRhICYmIHJhbjIgPCBkYXRhLnBlcikge1xuICAgICAgICAgICAgbGV0IGNhc2ggPSAwLjAwMDAwMTtcbiAgICAgICAgICAgIHRoaXMuY3VyUmVkcGFja2V0ID0gY2FzaDtcbiAgICAgICAgICAgIC8vKirlvLnlh7rnuqLljIXnmoTnlYzpnaIsICDmmoLml7blpITnkIbmiJAg55u05o6l55yL5bm/5ZGK6I635Y+W6YeR5biBICovXG4gICAgICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLSDop6blj5HkuobnuqLljIUtLS0tLScpXG4gICAgICAgICAgICB0aGlzLmdldFJlcGFja2V0KClcbiAgICAgICAgICAgIC8qKuabtOaWsOWfuuacrOaYvuekuiAqL1xuICAgICAgICAgICAgRXZlbnRDZW50ZXIuZW1pdChFdmVudEVudW0uVVBEQVRFX0NPSU4pO1xuXG4gICAgICAgICAgICAvKioqICovXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0UmVwYWNrZXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJSZWRwYWNrZXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5kYXRhLmNudCArPSAxO1xuICAgICAgICB0aGlzLmRhdGEubGlzdC5wdXNoKHRoaXMuY3VyUmVkcGFja2V0KTtcbiAgICAgICAgdGhpcy5kYXRhLmxhc3RUaW1lID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuZGF0YS50b2RheUNudCArPSAxO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSAxKVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazEpO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSA1KVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazUpO1xuICAgICAgICB0aGlzLmN1clJlZHBhY2tldCA9IDA7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkuZGF0YUNOVCwgdGhpcy5kYXRhLmNudCk7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkudG9kYXlDbnQsIHRoaXMuZGF0YS50b2RheUNudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICAvKiogKi9cbiAgICBhc3luYyBnZXRDdXJSZWRwYWNrZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1clJlZHBhY2tldDtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBSZWRwYWNrZXREYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIC8qKuiOt+WPluaAu+WFseeahOmHkeW4geaVsCAqL1xuICAgIGFzeW5jIGdldFRvdGFsQ29pbigpIHtcbiAgICAgICAgbGV0IHRvdGFsQ29pbiA9IGF3YWl0IFBjU2RrLkkubXlDb2luKCk7XG4gICAgICAgIHJldHVybiB0b3RhbENvaW47XG4gICAgfVxuICAgIC8qKuiOt+WPluacrOasoeWlluWKseeahOmHkeW4geaVsCAqL1xuICAgIGFzeW5jIGFkZENvaW4oa2V5OiBudW1iZXIgPSAxKSB7XG4gICAgICAgIGxldCBjb2luRGF0YSA9IGF3YWl0IFBjU2RrLkkuYWRkR29sZChrZXkpO1xuICAgICAgICByZXR1cm4gY29pbkRhdGFbJ2NvaW4nXTtcbiAgICB9XG5cbiAgICAvKirojrflj5bmnIDkvY7mj5DmoaMgKi9cbiAgICBhc3luYyAgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1pbkNvaW4gPSBhd2FpdCBQY1Nkay5JLm1pbldpdGhEcmF3YWwoKTtcbiAgICAgICAgcmV0dXJuIG1pbkNvaW47XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgSSgpOiBSZWRwYWNrZXRNb2RlbCB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoUmVkcGFja2V0TW9kZWwpIGFzIFJlZHBhY2tldE1vZGVsO1xuICAgIH1cbn1cblxuY2xhc3MgUmVkcGFja2V0RGF0YSB7XG4gICAgY250OiBudW1iZXI7XG4gICAgbGlzdDogQXJyYXk8bnVtYmVyPjtcbiAgICBsYXN0VGltZTogbnVtYmVyO1xuICAgIHRvZGF5Q250OiBudW1iZXI7XG59XG5cbmNsYXNzIFJlZHBhY2tldENvbmZpZ0RhdGEge1xuICAgIGlkOiBudW1iZXI7XG4gICAgcGVyOiBudW1iZXI7XG4gICAgY2FzaDogbnVtYmVyO1xufSIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSBcIi4vQmFzZU1vZGVsXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IFBjU2RrIGZyb20gXCIuLi9QY1Nka1wiO1xuXG4vKipcbiAqIFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFrZU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcblxuICAgIHByaXZhdGUgY29uZjogYW55O1xuICAgIHByaXZhdGUgZWxlUHJvYmFiaWxpdHlBcnI6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSB0b3RhbFdlaWdodDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHByb0FyckxlbjogbnVtYmVyID0gMDtcbiAgICAvKirnuqLljIXlh7rnjrDnmoTmgLvmrKHmlbDmr4/ml6UgKi9cbiAgICBwcml2YXRlIHJlZF9kYXlfbGltaXQ6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBjdXJfcmVkX2RheV9saW1pdDogbnVtYmVyID0gMDtcbiAgICAvKirmkYfkuIDmkYflh7rnjrDnmoTmgLvmrKHmlbAgKi9cbiAgICBwcml2YXRlIHNoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgY3VyX3NoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBQY1Nkay5JLmdhbWVDb25maWc7O1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tU2hha2VNb2RlbC0tIOiOt+WPluaRh+S4gOaRh+mdmeaAgeihqC0tLS0tJyArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgIGlmIChyZXN1bHRbJ2NvbmZpZyddKSB7XG4gICAgICAgICAgICBsZXQgZ2FtZURhdGEgPSByZXN1bHRbJ2NvbmZpZyddO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy5pbml0RGF0YShnYW1lRGF0YSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdERhdGEoZ2FtZURhdGEpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgU2hha2VEYXRhO1xuICAgICAgICBsZXQgbGFzdFRpbWUgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5LnNoYWtlTGFzdFRpbWUpIHx8ICcwJztcbiAgICAgICAgbGV0IGx0ID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuICAgICAgICBsZXQgbGFzdCA9IERhdGVVdGlscy50aW1lRGF5KGx0KTtcbiAgICAgICAgbGV0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5O1xuXG4gICAgICAgIGlmIChsYXN0ICE9IHRvZGF5KSB7XG4gICAgICAgICAgICB0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQgPSAwO1xuICAgICAgICAgICAgdGhpcy5jdXJfcmVkX2RheV9saW1pdCA9IDA7XG4gICAgICAgICAgICBsYXN0VGltZSA9IERhdGVVdGlscy5ub3dUaW1lLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmN1cl9zaGFrZV9kYXlfbGltaXQsIDApO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfcmVkX2RheV9saW1pdCwgMCk7XG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnNoYWtlTGFzdFRpbWUsIGxhc3RUaW1lKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGN1cl9yZWRfZGF5X2xpbWl0ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5jdXJfcmVkX2RheV9saW1pdCkgfHwgJzAnO1xuICAgICAgICAgICAgdGhpcy5jdXJfcmVkX2RheV9saW1pdCA9IHBhcnNlSW50KGN1cl9yZWRfZGF5X2xpbWl0KTtcbiAgICAgICAgICAgIGxldCBjdXJfc2hha2VfZGF5X2xpbWl0ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5jdXJfc2hha2VfZGF5X2xpbWl0KSB8fCAnMCc7XG4gICAgICAgICAgICB0aGlzLmN1cl9zaGFrZV9kYXlfbGltaXQgPSBwYXJzZUludChjdXJfc2hha2VfZGF5X2xpbWl0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuY29uZmlnID0gZ2FtZURhdGFbJ2NvbmZpZyddO1xuICAgICAgICBnYW1lRGF0YVsnc2hha2UnXS5mb3JFYWNoKGVsZSA9PiB7XG4gICAgICAgICAgICBkYXRhLnNoYWtlV2VpZ2h0TGlzdC5wdXNoKGVsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmYgPSBbXTtcbiAgICAgICAgdGhpcy5jb25mID0gZGF0YS5zaGFrZVdlaWdodExpc3Q7XG4gICAgICAgIHRoaXMuaW5pdFByb2JhYmlsaXR5KCk7XG4gICAgICAgIHRoaXMuc2hha2VfZGF5X2xpbWl0ID0gZGF0YS5jb25maWcuc2hha2VfZGF5X2xpbWl0O1xuICAgICAgICB0aGlzLnJlZF9kYXlfbGltaXQgPSBkYXRhLmNvbmZpZy5yZWRfZGF5X2xpbWl0O1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpbml0UHJvYmFiaWxpdHkoKSB7XG4gICAgICAgIHRoaXMudG90YWxXZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmNvbmYuZm9yRWFjaCgoZWxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b3RhbFdlaWdodCArPSBlbGUud2VpZ2h0O1xuICAgICAgICAgICAgbGV0IGl0ZW1XID0gZWxlLndlaWdodDtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApXG4gICAgICAgICAgICAgICAgaXRlbVcgKz0gdGhpcy5lbGVQcm9iYWJpbGl0eUFycltpbmRleCAtIDFdO1xuICAgICAgICAgICAgdGhpcy5lbGVQcm9iYWJpbGl0eUFyciA9IFsuLi50aGlzLmVsZVByb2JhYmlsaXR5QXJyLCBpdGVtV107XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMucHJvQXJyTGVuID0gdGhpcy5lbGVQcm9iYWJpbGl0eUFyci5sZW5ndGg7XG5cbiAgICB9XG5cbiAgICBnZXRTaGFrZVR5cGUoKSB7XG4gICAgICAgICsrdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0O1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmN1cl9zaGFrZV9kYXlfbGltaXQsIHRoaXMuY3VyX3NoYWtlX2RheV9saW1pdCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VyX3NoYWtlX2RheV9saW1pdCA+IHRoaXMuc2hha2VfZGF5X2xpbWl0KSB7XG4gICAgICAgICAgICAvKion5qyh5pWw6L6+5Yiw5LiK6ZmQ77yM6K+35piO5aSp5YaN5p2lKi9cblxuICAgICAgICAgICAgLyoq5Zyo5q2k5aSE5Y+v5Lul5by55qGG562J5aSE55CGICovXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhbiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMudG90YWxXZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5wcm9BcnJMZW47IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IHRoaXMuZWxlUHJvYmFiaWxpdHlBcnJbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGVsZSA+PSByYW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gaW5kZXggfHwgMSA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmN1cl9yZWRfZGF5X2xpbWl0O1xuICAgICAgICAgICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmN1cl9yZWRfZGF5X2xpbWl0LCB0aGlzLmN1cl9yZWRfZGF5X2xpbWl0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPiB0aGlzLnJlZF9kYXlfbGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZbdGhpcy5wcm9BcnJMZW4gLSAxXTtcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZbdGhpcy5wcm9BcnJMZW4gLSAxXTtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBTaGFrZURhdGEge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IEkoKTogU2hha2VNb2RlbCB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoU2hha2VNb2RlbCkgYXMgU2hha2VNb2RlbDtcbiAgICB9XG59XG5cblxuY2xhc3MgU2hha2VEYXRhIHtcbiAgICBjb25maWc6IFNoYWtlQ29uZmlnO1xuICAgIHNoYWtlV2VpZ2h0TGlzdDogU2hha2VXZWlnaHREYXRhW10gPSBbXTtcbn1cbmludGVyZmFjZSBTaGFrZUNvbmZpZyB7XG4gICAgcmVkX2RheV9saW1pdDogbnVtYmVyLFxuICAgIHNoYWtlX2RheV9saW1pdDogbnVtYmVyLFxuICAgIGludGVyc3RpdGlhbF9jbnQ6IG51bWJlcixcbiAgICBpbnRlcnN0aXRpYWxfZGVsYXk6IG51bWJlclxufVxuXG5pbnRlcmZhY2UgU2hha2VXZWlnaHREYXRhIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIHR5cGU6IG51bWJlcjtcbiAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICBudW06IG51bWJlcjtcbn1cblxuXG4iLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cbmltcG9ydCBWaWV3PUxheWEuVmlldztcclxuaW1wb3J0IERpYWxvZz1MYXlhLkRpYWxvZztcclxuaW1wb3J0IFNjZW5lPUxheWEuU2NlbmU7XG52YXIgUkVHOiBGdW5jdGlvbiA9IExheWEuQ2xhc3NVdGlscy5yZWdDbGFzcztcbmV4cG9ydCBtb2R1bGUgdWkge1xyXG4gICAgZXhwb3J0IGNsYXNzIFRlc3RTY2VuZVVJIGV4dGVuZHMgU2NlbmUge1xyXG5cdFx0cHVibGljIGJ0bkludml0ZTpMYXlhLlNwcml0ZTtcblx0XHRwdWJsaWMgYnRuU2VydmVyOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5WaWJyYXRlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5fc2hha2U6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0bkRyYXdhbDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUHJlbG9hZEFEOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93QmFubmVyOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93RnVsbEFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93TmF0aXZlQWQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blNob3dJbnRlckFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5SZXdhcmRBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUmVkcGFja2V0OkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5QcmVOYXRpdmU6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZUZ1bGw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZUluc2VydDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUHJlVmlkZW86TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0bkNsb3NlTmF0aXZlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5DbG9zZUJhbm5lcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuTWluV2l0aERyYXdhbDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgbWluV2l0aERyYXdhbExhYjpMYXlhLkxhYmVsO1xuXHRcdHB1YmxpYyBOYXRpdmVBRDpWaWV3O1xuICAgICAgICBjb25zdHJ1Y3RvcigpeyBzdXBlcigpfVxyXG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHN1cGVyLmNyZWF0ZUNoaWxkcmVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFNjZW5lKFwiVGVzdFNjZW5lXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFJFRyhcInVpLlRlc3RTY2VuZVVJXCIsVGVzdFNjZW5lVUkpO1xyXG59XHIiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBBcnJheVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiDnp7vpmaTlhYPntKBcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVtb3ZlRnJvbUFycihhcnI6IEFycmF5PGFueT4sIG9iajogYW55KSB7XG4gICAgICAgIGxldCBpbmRleCA9IGFyci5pbmRleE9mKG9iaik7XG4gICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21Gcm9tQXJyKGFycjogQXJyYXk8YW55Pikge1xuICAgICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGFycltpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pWw57uE6ZqP5py65o6S5bqPXG4gICAgICovXG4gICAgc3RhdGljIHNodWZmbGUoYXJyOiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHJldHVybiBhcnIuc29ydChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAtIDAuNTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGluZGV4T2YoYXJyLCBjYWxsYmFjaywgY3R4Pykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoY3R4LCB0aGlzW2ldLCBpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgc3RhdGljIGVhY2goYXJyLCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGNvbnRleHQsIGFycltpXSwgaSwgYXJyKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBxdWV1ZShhcnIpIHtcbiAgICAgICAgbGV0IHJlcyA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IHByb21pc2Ugb2YgYXJyKSB7XG4gICAgICAgICAgICByZXMgPSBhd2FpdCBwcm9taXNlKHJlcylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSYW5kb21BcnJheShhcnIsIGNvdW50KSB7XG4gICAgICAgIGxldCBzaHVmZmxlZCA9IGFyci5zbGljZSgwKTtcbiAgICAgICAgbGV0IGxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIGxldCBtaW4gPSBsZW4gLSBjb3VudCwgdGVtcCwgaW5kZXg7XG4gICAgICAgIHdoaWxlIChsZW4tLSA+IG1pbikge1xuICAgICAgICAgICAgaW5kZXggPSBNYXRoLmZsb29yKChsZW4gKyAxKSAqIE1hdGgucmFuZG9tKCkpO1xuICAgICAgICAgICAgdGVtcCA9IHNodWZmbGVkW2luZGV4XTtcbiAgICAgICAgICAgIHNodWZmbGVkW2luZGV4XSA9IHNodWZmbGVkW2xlbl07XG4gICAgICAgICAgICBzaHVmZmxlZFtsZW5dID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2h1ZmZsZWQuc2xpY2UobWluKTtcbiAgICB9XG59IiwiLyoqXG4gKiDml6XmnJ/lt6XlhbfnsbtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0ZVV0aWxzIHtcbiAgICBzdGF0aWMgZ2V0IG5vdygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLm5vd1RpbWUgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IG5vd1RpbWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgdG9kYXkoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHRpbWUgPSBuZXcgRGF0ZSh0aGlzLm5vd1RpbWUpO1xuICAgICAgICBsZXQgeWVhciA9IHRpbWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgbGV0IG1vbnRoID0gdGltZS5nZXRNb250aCgpICsgMTtcbiAgICAgICAgbGV0IGRhdGUgPSB0aW1lLmdldERhdGUoKTtcbiAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7dGhpcy5hZGQobW9udGgpfS0ke3RoaXMuYWRkKGRhdGUpfWA7XG4gICAgfVxuXG4gICAgc3RhdGljIHRpbWVEYXkodGltZU51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHRpbWUgPSBuZXcgRGF0ZSh0aW1lTnVtKTtcbiAgICAgICAgbGV0IHllYXIgPSB0aW1lLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgIGxldCBkYXRlID0gdGltZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke3RoaXMuYWRkKG1vbnRoKX0tJHt0aGlzLmFkZChkYXRlKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOagueaNruenkuaVsOagvOW8j+WMluWtl+espuS4slxuICAgICAqIEBwYXJhbSBzZWNvbmQg56eS5pWwXG4gICAgICogQHBhcmFtIHR5cGUgMTowMDowMDowMCAgIDI6eXl5eS1tbS1kZCBoOm06cyAgICAzOjAwOjAwICAgNDp4eOWkqeWJje+8jHh45bCP5pe25YmN77yMeHjliIbpkp/liY1cbiAgICAgKiBAcmV0dXJuXG4gICAgICovXG4gICAgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kKHNlY29uZDogbnVtYmVyLCB0eXBlOiBudW1iZXIgPSAxKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDAoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kMShzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQyKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDMoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kNChzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQ1KHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvLyAwOiAwMDowMFxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMCh0OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyA2MCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgJSA2MCk7XG4gICAgICAgIHZhciBtaW5zOiBzdHJpbmc7XG4gICAgICAgIHZhciBzZW5zOiBzdHJpbmc7XG4gICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjBcIiArIG1pbnN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWlucyA9IFwiXCIgKyBtaW5zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMFwiICsgc2Vjb25kdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIlwiICsgc2Vjb25kdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzE6IDAwOjAwOjAwXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQxKHQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICBsZXQgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyAzNjAwKTtcbiAgICAgICAgbGV0IGhvdXJzOiBzdHJpbmc7XG4gICAgICAgIGxldCBkYXkgPSAnJztcbiAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICBob3VycyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChob3Vyc3QgPCAxMClcbiAgICAgICAgICAgICAgICBob3VycyA9IFwiMFwiICsgaG91cnN0O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGggPSBob3Vyc3QgJSAyNDtcbiAgICAgICAgICAgICAgICBpZiAoaG91cnN0ID49IDI0KSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzID0gaCA8IDEwID8gXCIwXCIgKyBoIDogJycgKyBoO1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBNYXRoLmZsb29yKGhvdXJzdCAvIDI0KSArICdkICc7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGhvdXJzID0gaCA8IDEwID8gXCIwXCIgKyBoIDogJycgKyBoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcigodCAtIGhvdXJzdCAqIDM2MDApIC8gNjApO1xuICAgICAgICBsZXQgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcigodCAtIGhvdXJzdCAqIDM2MDApICUgNjApO1xuICAgICAgICBsZXQgbWluczogc3RyaW5nO1xuICAgICAgICBsZXQgc2Vuczogc3RyaW5nO1xuICAgICAgICBpZiAobWluc3QgPT0gMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5zdCA8IDEwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwXCIgKyBtaW5zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIlwiICsgbWluc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZHQgPT0gMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjBcIiArIHNlY29uZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5zID0gXCJcIiArIHNlY29uZHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRheSArIGhvdXJzICsgXCI6XCIgKyBtaW5zICsgXCI6XCIgKyBzZW5zO1xuICAgIH1cblxuICAgIC8vMzogMDA6MDBcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDModDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBob3Vyc3Q6IG51bWJlciA9IE1hdGguZmxvb3IodCAvIDM2MDApO1xuICAgICAgICB2YXIgbWluc3Q6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAvIDYwKTtcbiAgICAgICAgdmFyIHNlY29uZHQ6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAlIDYwKTtcbiAgICAgICAgdmFyIG1pbnM6IHN0cmluZztcbiAgICAgICAgdmFyIHNlbnM6IHN0cmluZztcbiAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMFwiICsgbWluc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaW5zID0gXCJcIiArIG1pbnN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kdCA8IDEwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwXCIgKyBzZWNvbmR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VucyA9IFwiXCIgKyBzZWNvbmR0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5zICsgXCI6XCIgKyBzZW5zO1xuICAgIH1cblxuICAgIC8vMjp5eXl5LW1tLWRkIGg6bTpzXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQyKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodGltZSk7XG4gICAgICAgIHZhciB5ZWFyOiBudW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHZhciBtb250aDogbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTsgXHQvL+i/lOWbnueahOaciOS7veS7jjAtMTHvvJtcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICB2YXIgbWludXRlOiBudW1iZXIgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgIHJldHVybiB5ZWFyICsgXCItXCIgKyBtb250aCArIFwiLVwiICsgZGF5ICsgXCIgXCIgKyBob3VycyArIFwiOlwiICsgbWludXRlICsgXCI6XCIgKyBzZWNvbmQ7XG5cbiAgICB9XG5cbiAgICAvLzQ6eHjlpKnliY3vvIx4eOWwj+aXtuWJje+8jHh45YiG6ZKf5YmNXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQ0KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHZhciB0ID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XG4gICAgICAgIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgaWYgKHQgPiAyNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHQgLyAyNCkgKyBcIuWkqeWJjVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgKyBcIuWwj+aXtuWJjVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGltZSAvIDYwKSArIFwi5YiG6ZKf5YmNXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgLy8g5q+P5Liq5pe26Ze05Y2V5L2N5omA5a+55bqU55qE56eS5pWwXG4gICAgICAgIHZhciBvbmVEYXk6IG51bWJlciA9IDM2MDAgKiAyNDtcbiAgICAgICAgdmFyIG9uZUhvdXJzdDogbnVtYmVyID0gMzYwMDtcbiAgICAgICAgdmFyIG9uZU1pbnN0OiBudW1iZXIgPSA2MDtcblxuICAgICAgICB2YXIgZGF5cyA9IE1hdGguZmxvb3IodGltZSAvIG9uZURheSk7XG4gICAgICAgIHZhciBob3Vyc3Q6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIG9uZURheSAvIG9uZUhvdXJzdClcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lIC0gaG91cnN0ICogb25lSG91cnN0KSAvIG9uZU1pbnN0KSAgLy9NYXRoLmZsb29yKHRpbWUgJSBvbmVEYXkgJSBvbmVIb3Vyc3QgLyBvbmVNaW5zdCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lIC0gaG91cnN0ICogb25lSG91cnN0KSAlIG9uZU1pbnN0KSAvL3RpbWU7XG5cbiAgICAgICAgdmFyIGRheXNzOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgaG91cnNzOiBzdHJpbmcgPSBcIlwiXG4gICAgICAgIHZhciBtaW5zczogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIHNlY3NzOiBzdHJpbmcgPSBcIlwiXG4gICAgICAgIGlmICh0aW1lID4gMCkge1xuICAgICAgICAgICAgLy/lpKlcbiAgICAgICAgICAgIGlmIChkYXlzID09IDApIHtcbiAgICAgICAgICAgICAgICBkYXlzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgLy/lsI/ml7ZcbiAgICAgICAgICAgICAgICBpZiAoaG91cnN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy/liIZcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCIwXCIgKyBzZWNvbmR0ICsgXCLnp5JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWNzcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIiArIG1pbnN0ICsgXCLliIbpkp9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCIwXCIgKyBzZWNvbmR0ICsgXCLnp5JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW5zcyArIHNlY3NzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCIwXCIgKyBzZWNvbmR0ICsgXCLnp5JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBob3Vyc3MgKyBzZWNzc1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluc3MgPSBcIjBcIiArIG1pbnN0ICsgXCLliIbpkp9cIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCJcIiArIG1pbnN0ICsgXCLliIbpkp9cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBob3Vyc3MgKyBtaW5zcztcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRheXNzID0gZGF5cyArIFwi5aSpXCI7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA8IDEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCIwXCIgKyBob3Vyc3QgKyBcIuWwj+aXtlwiO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBob3Vyc3MgPSBcIlwiICsgaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF5c3MgKyBob3Vyc3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkKG51bSkge1xuICAgICAgICByZXR1cm4gbnVtIDwgMTAgPyAnMCcgKyBudW0gOiBudW07XG4gICAgfVxuXG5cbn1cbiIsImltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuL09iamVjdFBvb2xcIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYmplY3RJbnN0YW5jZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2x6cyA9IFtdO1xuICAgIHByaXZhdGUgc3RhdGljIG9iamVjdHMgPSBbXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0KGNsczogYW55KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNsenMuaW5kZXhPZihjbHMpO1xuICAgICAgICByZXR1cm4gKGlkeCA+PSAwICYmIHRoaXMub2JqZWN0c1tpZHhdKSB8fCB0aGlzLmNyZWF0ZShjbHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZShjbHM6IGFueSkge1xuICAgICAgICB2YXIgb2JqID0gT2JqZWN0UG9vbC5wb3AoY2xzKTtcbiAgICAgICAgdGhpcy5vYmplY3RzLnB1c2gob2JqKTtcbiAgICAgICAgdGhpcy5jbHpzLnB1c2goY2xzKTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBPYmplY3RQb29sIHtcbiAgICBwcml2YXRlIHN0YXRpYyBjbHNBcnIgPSBbXTtcblxuICAgIHN0YXRpYyBwb3AoY2xzOiBhbnkpIHtcbiAgICAgICAgbGV0IGlkeCA9IHRoaXMuY2xzQXJyLmluZGV4T2YoY2xzKTtcbiAgICAgICAgaWYgKGlkeCA8IDApIHtcbiAgICAgICAgICAgIGlkeCA9IHRoaXMuY2xzQXJyLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuY2xzQXJyLnB1c2goY2xzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQga2V5ID0gJ3Bvb2xLZXknICsgaWR4O1xuICAgICAgICBsZXQgaXRlbSA9IExheWEuUG9vbC5nZXRJdGVtQnlDbGFzcyhrZXksIGNscyk7XG4gICAgICAgIGl0ZW0ucG9vbEtleSA9IGtleTtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgc3RhdGljIHB1c2goaXRlbSkge1xuICAgICAgICBMYXlhLlBvb2wucmVjb3ZlcihpdGVtLnBvb2xLZXksIGl0ZW0pO1xuICAgIH1cbn0iLCJleHBvcnQgZGVmYXVsdCAgY2xhc3MgU2NhbGVCdXR0b25TY3JpcHQge1xuIFxuICAgIHB1YmxpYyBkZWxheVRpbWU6IG51bWJlciA9IDA7XG4gICAgcHVibGljIG1pblNjYWxlOiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgbW9ua2V5Qm94OiBMYXlhLkltYWdlO1xuXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKuiuvue9rm93bmVy5Ye95pWw77yM5Y+v5Lul55u05o6l6I635Y+W5Yiw5re75Yqg6ZmE5Yqg6ISa5pys55qE57uE5Lu25a6e5L6LIFxuICAgICAqKi9cbiAgICBwdWJsaWMgc2V0IG93bmVyKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5tb25rZXlCb3ggPSB2YWx1ZTtcbiAgICAgICAgLy/oh6rlrprkuYnnmoTohJrmnKzkvJrmnInml7bluo/pl67popjvvIzmiYDku6XlnKjmraTmt7vliqDkuIDkuKrlu7bml7ZcbiAgICAgICAgdGhpcy5tb25rZXlCb3guZnJhbWVPbmNlKDIsIHRoaXMsIHRoaXMub25Mb2FkZWQpO1xuICAgICAgICBcbiAgICB9XG5cbiAgICBvbkxvYWRlZCgpOiB2b2lkIHtcbiAgICAgICAvKiDorr7nva7mjInpkq7kuLrljZXmgIHmjInpkq5cbiAgICAgICAgKiog5Y+W5YC877yaXG4gICAgICAgICoqIDHvvJrljZXmgIHjgILlm77niYfkuI3lgZrliIflibLvvIzmjInpkq7nmoTnmq7ogqTnirbmgIHlj6rmnInkuIDnp43jgIJcbiAgICAgICAgKiogMu+8muS4pOaAgeOAguWbvueJh+WwhuS7peerluebtOaWueWQkeiiq+etieavlOWIh+WJsuS4ujLpg6jliIbvvIzku47kuIrlkJHkuIvvvIzkvp3mrKHkuLrlvLnotbfnirbmgIHnmq7ogqTjgIHmjInkuIvlkoznu4/ov4flj4rpgInkuK3nirbmgIHnmq7ogqTjgIJcbiAgICAgICAgKiogM++8muS4ieaAgeOAguWbvueJh+WwhuS7peerluebtOaWueWQkeiiq+etieavlOWIh+WJsuS4ujLpg6jliIbvvIzku47kuIrlkJHkuIvvvIzkvp3mrKHkuLrlvLnotbfnirbmgIHnmq7ogqTjgIHnu4/ov4fnirbmgIHnmq7ogqTjgIHmjInkuIvlkozpgInkuK3nirbmgIHnmq7ogqRcbiAgICAgICAgKi9cbiAgICAgICAgLy/mt7vliqDpvKDmoIfmjInkuIvkuovku7bkvqblkKzjgILmjInml7bml7bnvKnlsI/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLnNjYWxlU21hbGwpO1xuICAgICAgICAvL+a3u+WKoOm8oOagh+aKrOi1t+S6i+S7tuS+puWQrOOAguaKrOi1t+aXtui/mOWOn+aMiemSruOAglxuICAgICAgICB0aGlzLm1vbmtleUJveC5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcbiAgICAgICAgLy/mt7vliqDpvKDmoIfnprvlvIDkuovku7bkvqblkKzjgILnprvlvIDml7bov5jljp/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9PVVQsIHRoaXMsIHRoaXMuc2NhbGVCaWcpO1xuICAgIH1cbiAgICBcbiAgICBcbiAgICBwcml2YXRlIHNjYWxlU21hbGwoKTp2b2lke1xuICAgICAgICAvL+e8qeWwj+iHszAuOOeahOe8k+WKqOaViOaenFxuICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMubW9ua2V5Qm94LCB7c2NhbGVYOjAuOCwgc2NhbGVZOiAwLjh9LCAyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzY2FsZUJpZygpOnZvaWR7XG4gICAgICAgIC8v5Y+Y5aSn6L+Y5Y6f55qE57yT5Yqo5pWI5p6cXG4gICAgICAgIExheWEuVHdlZW4udG8odGhpcy5tb25rZXlCb3gsIHtzY2FsZVg6MSwgc2NhbGVZOjF9LCAyKTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCAgY2xhc3MgVXRpbCB7XG4gICAgcHVibGljIGxvYWQocmVzLCBvblByb2dyZXNzPzogTGF5YS5IYW5kbGVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChzdWMsIGZhaWwpID0+IHtcbiAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQocmVzLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHN1YyksIG9uUHJvZ3Jlc3MpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgfVxuICAgIGdldEl0ZW0oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVdGlsO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEkoKTogVXRpbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgVXRpbCk7XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBEYXRhS2V5IHtcbiAgICBjdXJfcmVkX2RheV9saW1pdCA9ICdjdXJfcmVkX2RheV9saW1pdCcsXG4gICAgY3VyX3NoYWtlX2RheV9saW1pdCA9ICdjdXJfc2hha2VfZGF5X2xpbWl0JyxcbiAgICBzaGFrZUxhc3RUaW1lID0gJ3NoYWtlTGFzdFRpbWUnLFxuICAgIGRhdGFDTlQgPSAnZGF0YUNOVCcsXG4gICAgdG9kYXlDbnQgPSAndG9kYXlDbnQnLFxuICAgIGxhc3RUaW1lID0gJ2xhc3RUaW1lJyxcbn0iXX0= | |
2097 | +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvYXBwL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvR2FtZUNvbmZpZy50cyIsInNyYy9NYWluLnRzIiwic3JjL1JlZERyYXdhbC50cyIsInNyYy9UZXN0U2NlbmUudHMiLCJzcmMvZXZlbnQvRXZlbnRDZW50ZXIudHMiLCJzcmMvZXZlbnQvRXZlbnRFbnVtLnRzIiwic3JjL3Nkay9BZE1hbmFnZXIudHMiLCJzcmMvc2RrL0FwcFNkay50cyIsInNyYy9zZGsvTmF0aXZlQWQudHMiLCJzcmMvc2RrL1RUQWRTZGsudHMiLCJzcmMvc2RrL1RyYWNraW5nU2RrLnRzIiwic3JjL3Nkay9tb2RlbC9CYXNlTW9kZWwudHMiLCJzcmMvc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsLnRzIiwic3JjL3Nkay9tb2RlbC9TaGFrZU1vZGVsLnRzIiwic3JjL3VpL2xheWFNYXhVSS50cyIsInNyYy91aXRsL0FycmF5VXRpbHMudHMiLCJzcmMvdWl0bC9EYXRlVXRpbHMudHMiLCJzcmMvdWl0bC9PYmplY3RJbnN0YW5jZS50cyIsInNyYy91aXRsL09iamVjdFBvb2wudHMiLCJzcmMvdWl0bC9TY2FsZUJ1dHRvblNjcmlwdC50cyIsInNyYy91aXRsL1V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsZ0dBQWdHO0FBQ2hHLHlDQUFtQztBQUNuQyw4REFBd0Q7QUFDeEQseUNBQW1DO0FBQ25DLDJDQUFxQztBQUNyQzs7RUFFRTtBQUNGO0lBYUk7SUFBYyxDQUFDO0lBQ1IsZUFBSSxHQUFYO1FBQ0ksSUFBSSxHQUFHLEdBQWEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDN0MsR0FBRyxDQUFD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QTNDQSxBQTJDQyxJQUFBOzs7Ozs7QUMzQ0Q7SUFBQTtJQWlCQSxDQUFDO0lBaEJVLG1CQUFJLEdBQVgsVUFBWSxHQUFHLEVBQUUsVUFBeUI7UUFBMUMsaUJBSUM7UUFIRyxPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsR0FBRyxFQUFFLElBQUk7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxzQkFBTyxHQUFQLFVBQVEsR0FBVyxFQUFFLEtBQVU7UUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFDRCxzQkFBTyxHQUFQLFVBQVEsR0FBVztRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELHNCQUFrQixTQUFDO2FBQW5CO1lBQ0ksT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3pELENBQUM7OztPQUFBO0lBQ0wsV0FBQztBQUFELENBakJBLEFBaUJDLElBQUE7O0FBRUQsSUFBWSxPQU9YO0FBUEQsV0FBWSxPQUFPO0lBQ2Ysa0RBQXVDLENBQUE7SUFDdkMsc0RBQTJDLENBQUE7SUFDM0MsMENBQStCLENBQUE7SUFDL0IsOEJBQW1CLENBQUE7SUFDbkIsZ0NBQXFCLENBQUE7SUFDckIsZ0NBQXFCLENBQUE7QUFDekIsQ0FBQyxFQVBXLE9BQU8sR0FBUCxlQUFPLEtBQVAsZUFBTyxRQU9sQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcbn0pKCk7XHJcbihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cclxuaW1wb3J0IFRlc3RTY2VuZSBmcm9tIFwiLi9UZXN0U2NlbmVcIlxuaW1wb3J0IFNjYWxlQnV0dG9uU2NyaXB0IGZyb20gXCIuL3VpdGwvU2NhbGVCdXR0b25TY3JpcHRcIlxuaW1wb3J0IFJlZERyYXdhbCBmcm9tIFwiLi9SZWREcmF3YWxcIlxuaW1wb3J0IE5hdGl2ZUFkIGZyb20gXCIuL3Nkay9OYXRpdmVBZFwiXHJcbi8qXHJcbiog5ri45oiP5Yid5aeL5YyW6YWN572uO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lQ29uZmlne1xyXG4gICAgc3RhdGljIHdpZHRoOm51bWJlcj03NTA7XHJcbiAgICBzdGF0aWMgaGVpZ2h0Om51bWJlcj0xMzM0O1xyXG4gICAgc3RhdGljIHNjYWxlTW9kZTpzdHJpbmc9XCJmaXhlZHdpZHRoXCI7XHJcbiAgICBzdGF0aWMgc2NyZWVuTW9kZTpzdHJpbmc9XCJub25lXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25WOnN0cmluZz1cInRvcFwiO1xyXG4gICAgc3RhdGljIGFsaWduSDpzdHJpbmc9XCJsZWZ0XCI7XHJcbiAgICBzdGF0aWMgc3RhcnRTY2VuZTphbnk9XCJUZXN0U2NlbmUuc2NlbmVcIjtcclxuICAgIHN0YXRpYyBzY2VuZVJvb3Q6c3RyaW5nPVwiXCI7XHJcbiAgICBzdGF0aWMgZGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBzdGF0OmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgcGh5c2ljc0RlYnVnOmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgZXhwb3J0U2NlbmVUb0pzb246Ym9vbGVhbj10cnVlO1xyXG4gICAgY29uc3RydWN0b3IoKXt9XHJcbiAgICBzdGF0aWMgaW5pdCgpe1xyXG4gICAgICAgIHZhciByZWc6IEZ1bmN0aW9uID0gTGF5YS5DbGFzc1V0aWxzLnJlZ0NsYXNzO1xyXG4gICAgICAgIHJlZyhcIlRlc3RTY2VuZS50c1wiLFRlc3RTY2VuZSk7XG4gICAgICAgIHJlZyhcInVpdGwvU2NhbGVCdXR0b25TY3JpcHQudHNcIixTY2FsZUJ1dHRvblNjcmlwdCk7XG4gICAgICAgIHJlZyhcIlJlZERyYXdhbC50c1wiLFJlZERyYXdhbCk7XG4gICAgICAgIHJlZyhcInNkay9OYXRpdmVBZC50c1wiLE5hdGl2ZUFkKTtcclxuICAgIH1cclxufVxyXG5HYW1lQ29uZmlnLmluaXQoKTsiLCJpbXBvcnQgR2FtZUNvbmZpZyBmcm9tIFwiLi9HYW1lQ29uZmlnXCI7XHJcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vc2RrL0FkTWFuYWdlclwiO1xyXG5pbXBvcnQgU2hha2VNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvU2hha2VNb2RlbFwiO1xyXG5pbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XHJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vc2RrL0FwcFNka1wiO1xyXG5jbGFzcyBNYWluIHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdC8v5qC55o2uSURF6K6+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+WMllNESyAqL1xyXG5cdGFzeW5jIGluaXREYXRhKCkge1xyXG5cclxuXHRcdC8qKuWIneWni+WMlmFkayDojrflj5ZhcHDphY3nva7kv6Hmga8gKi9cclxuXHRcdEFwcFNkay5JLmluaXQoKTtcclxuXHRcdC8qKumihOWKoOi9veinhumikSAqL1xyXG5cdFx0QWRNYW5hZ2VyLkkuaW5pdCgpO1xyXG5cdFx0Lyoq6I635Y+W57qi5YyF6YWN572uIOaRh+S4gOaRhyDnrYnpnZnmgIHmlbDmja4gKi9cclxuXHRcdGF3YWl0IEFwcFNkay5JLmluaXRHYW1lQ29uZmlnKCk7XHJcblx0XHQvKirpmpDol4/lkK/liqjlsY8gKi9cclxuXHRcdEFwcFNkay5JLmhpZGVTcGxhc2goKVxyXG5cclxuXHRcdGF3YWl0IFJlZHBhY2tldE1vZGVsLkkuaW5pdCgpXHJcblxyXG5cdFx0YXdhaXQgU2hha2VNb2RlbC5JLmluaXQoKTtcclxuXHR9XHJcbn1cclxuLy/mv4DmtLvlkK/liqjnsbtcclxubmV3IE1haW4oKTtcclxuIiwiaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi9ldmVudC9FdmVudENlbnRlclwiO1xuaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vZXZlbnQvRXZlbnRFbnVtXCI7XG5pbXBvcnQgQXBwU2RrIGZyb20gXCIuL3Nkay9BcHBTZGtcIjtcbi8qKlxuICog5Li755WM6Z2iICDph5HluIHph5Hpop1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkRHJhd2FsIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuICAgIC8qKiBAcHJvcCB7bmFtZTpjb2lubGFiLCB0aXBzOlwi6YeR5biBXCIsIHR5cGU6Tm9kZX0qL1xuICAgIGNvaW5sYWI6IExheWEuTGFiZWw7XG4gICAgLyoqIEBwcm9wIHtuYW1lOnRpcGxhYiwgdGlwczpcIuaPkOekulwiLCB0eXBlOk5vZGV9Ki9cbiAgICB0aXBsYWI6IExheWEuTGFiZWw7XG5cbiAgICBwcml2YXRlIHRvdGFsQ29pbjogbnVtYmVyID0gMTEwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cbiAgICBvblN0YXJ0KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXIoKTtcbiAgICAgICAgLy8gdGhpcy50aXBsYWIudmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBvbkVuYWJsZSgpIHtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5BUFBfU0hPVywgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5VUERBVEVfQ09JTiwgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICB9XG5cbiAgICBvbkRpc2FibGUoKSB7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uQVBQX1NIT1csIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uVVBEQVRFX0NPSU4sIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlU3RhcigpIHtcbiAgICAgICAgbGV0IGNvaW4gPSBhd2FpdCBBcHBTZGsuSS5teUNvaW4oKTtcbiAgICAgICAgdGhpcy50b3RhbENvaW4gPSBjb2luO1xuICAgICAgICB0aGlzLmNvaW5sYWIudGV4dCA9ICcnICsgY29pbjtcbiAgICAgICAgbGV0IHN0ciA9ICflj6/mj5DnjrAnO1xuICAgICAgICAvKirmm7TmlrDkuIvkuIvkuIDmrKHmj5DnjrDnmoTpop3luqYgKi9cbiAgICAgICAgbGV0IG5leHREcmF3YWwgPSBhd2FpdCAgQXBwU2RrLkkubWluV2l0aERyYXdhbCgpO1xuICAgICAgICBpZiAodGhpcy50b3RhbENvaW4gPiAwKSB7XG4gICAgICAgICAgICBsZXQgbGVmdENvaW4gPSBuZXh0RHJhd2FsIC0gdGhpcy50b3RhbENvaW47XG4gICAgICAgICAgICBpZiAobGVmdENvaW4gPiAwKVxuICAgICAgICAgICAgICAgIHN0ciA9IGDov5jlt64keyhsZWZ0Q29pbiAvIDEwMDAwKS50b0ZpeGVkKDMpfemHkemineWPr+aPkOeOsGA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXBsYWIudGV4dCA9IHN0cjtcbiAgICAgICAgdGhpcy50aXBsYWIudmlzaWJsZSA9IEJvb2xlYW4obmV4dERyYXdhbCk7XG4gICAgfVxufSIsImltcG9ydCB7IHVpIH0gZnJvbSBcIi4vdWkvbGF5YU1heFVJXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuL3Nkay9BZE1hbmFnZXJcIjtcbmltcG9ydCBTaGFrZU1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9TaGFrZU1vZGVsXCI7XG5pbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgTmF0aXZlQWQgZnJvbSBcIi4vc2RrL05hdGl2ZUFkXCI7XG5pbXBvcnQgVXRpbCBmcm9tIFwiLi91aXRsL1V0aWxcIjtcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vc2RrL0FwcFNka1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0U2NlbmUgZXh0ZW5kcyB1aS5UZXN0U2NlbmVVSSB7XG4gICAgcHJpdmF0ZSBpc0xvbmdWaWJyYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8v5YWz6Zet5aSa54K56Kem5o6n77yM5ZCm5YiZ5bCx5peg5pWM5LqGXG4gICAgICAgIExheWEuTW91c2VNYW5hZ2VyLm11bHRpVG91Y2hFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1UZXN0U2NlbmUtLS0tLS0tJylcbiAgICAgICAgLy8gdGhpcy5OYXRpdmVBRC52aXNpYmxlID0gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBvbkVuYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idG5TZXJ2ZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5vcGVuU2VydmVyKTtcbiAgICAgICAgdGhpcy5idG5WaWJyYXRlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgIEFwcFNkay5JLnZpYnJhdGUodGhpcy5pc0xvbmdWaWJyYXRlID8gMCA6IDEpO1xuICAgICAgICAgICAgdGhpcy5pc0xvbmdWaWJyYXRlID0gIXRoaXMuaXNMb25nVmlicmF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYnRuRHJhd2FsLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblBlcnNvbmFsKTtcbiAgICAgICAgdGhpcy5idG5JbnZpdGUub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5pbnZpdGF0aW9uKTtcbiAgICAgICAgdGhpcy5idG5fc2hha2Uub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy50b3VjaFNoYWtlKTtcbiAgICAgICAgdGhpcy5idG5QcmVsb2FkQUQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkQUQpO1xuICAgICAgICB0aGlzLmJ0blNob3dCYW5uZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93QmFubmVyKTtcbiAgICAgICAgdGhpcy5idG5TaG93RnVsbEFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0Z1bGxBZCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd05hdGl2ZUFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd05hdGl2ZUFkKTtcbiAgICAgICAgdGhpcy5idG5TaG93SW50ZXJBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dJbnRlckFkKTtcbiAgICAgICAgdGhpcy5idG5SZXdhcmRBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dSZXdhcmRBZCk7XG4gICAgICAgIHRoaXMuYnRuUmVkcGFja2V0Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblJlZHBhY2tldCk7XG5cbiAgICAgICAgdGhpcy5idG5QcmVWaWRlby5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnByZWxvYWRSZXdhcmRBZCk7XG4gICAgICAgIHRoaXMuYnRuUHJlRnVsbC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnByZWxvYWRGdWxsKTtcbiAgICAgICAgdGhpcy5idG5QcmVJbnNlcnQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkSW50ZXJBZCk7XG4gICAgICAgIHRoaXMuYnRuUHJlTmF0aXZlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMucHJlbG9hZE5hdGl2ZUFkKTtcbiAgICAgICAgdGhpcy5idG5DbG9zZUJhbm5lci5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLmNsb3NlQWRCYW5uZXIpO1xuICAgICAgICB0aGlzLmJ0bkNsb3NlTmF0aXZlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuY2xvc2VBZHZlckRpYWxvZyk7XG4gICAgICAgIHRoaXMuYnRuTWluV2l0aERyYXdhbC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm1pbldpdGhEcmF3YWwpO1xuXG4gICAgfVxuXG4gICAgLyoq6aKE5Yqg6L295bm/5ZGKICovXG4gICAgYXN5bmMgcHJlbG9hZEFEKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tcHJlbG9hZEFELS0tLS0tLScpXG4gICAgICAgIGF3YWl0IEFkTWFuYWdlci5JLnByZWxvYWRCYW5uZXIoKTtcbiAgICB9XG5cbiAgICBwcmVsb2FkUmV3YXJkQWQoKSB7XG4gICAgICAgIEFkTWFuYWdlci5JLnByZWxvYWRSZXdhcmRBZCgpO1xuICAgIH1cblxuICAgIHByZWxvYWRGdWxsKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5wcmVsb2FkRnVsbEFkKCk7XG4gICAgfVxuXG4gICAgcHJlbG9hZEludGVyQWQoKSB7XG4gICAgICAgIEFkTWFuYWdlci5JLnByZWxvYWRJbnRlckFkKCk7XG4gICAgfVxuXG4gICAgcHJlbG9hZE5hdGl2ZUFkKCkge1xuICAgICAgICB0aGlzLk5hdGl2ZUFELmdldENvbXBvbmVudChOYXRpdmVBZCkuaW5pdE5hdGl2ZUFkKDEpO1xuICAgIH1cblxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XG4gICAgICAgIEFkTWFuYWdlci5JLmNsb3NlQWR2ZXJEaWFsb2coKVxuICAgIH1cbiAgICBjbG9zZUFkQmFubmVyKCkge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkQmFubmVyKClcbiAgICB9XG5cbiAgICAvKirmmL7npLrlhajlsY/lub/lkYogKi9cbiAgICBzaG93RnVsbEFkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0Z1bGxBZC0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93RnVsbEFkKCk7XG4gICAgfVxuICAgIC8qKuaYvuekumJhbm5lciAqL1xuICAgIHNob3dCYW5uZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93QmFubmVyLS0tLS0tLScpXG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dCYW5uZXIoKTtcbiAgICB9XG5cbiAgICAvKirkv6Hmga/mtYHlub/lkYogKi9cbiAgICBzaG93TmF0aXZlQWQoKSB7XG4gICAgICAgIHRoaXMuTmF0aXZlQUQuZ2V0Q29tcG9uZW50KE5hdGl2ZUFkKS5pbml0TmF0aXZlQWQoKTtcbiAgICB9XG5cbiAgICAvKirmj5LlsY/lub/lkYogKi9cbiAgICBzaG93SW50ZXJBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dJbnRlckFkLS0tLS0tLScpXG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dJbnRlckFkKCk7XG4gICAgfVxuICAgIC8qKua/gOWKseinhumikeW5v+WRiiAqL1xuICAgIGFzeW5jIHNob3dSZXdhcmRBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dSZXdhcmRBZC0tLS0tLS0nKVxuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoKTtcbiAgICAgICAgLyoq5oiQ5Yqf5ZCO5omn6KGM5a+55bqU55qE5aWW5YqxICovXG4gICAgfVxuICAgIC8qKuaEj+ingeWPjemmiCAqL1xuICAgIG9wZW5TZXJ2ZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1vcGVuU2VydmVyLS0tLS0tLScpXG4gICAgICAgIEFwcFNkay5JLmZlZWRiYWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlblJlZHBhY2tldCgpIHtcbiAgICAgICAgUmVkcGFja2V0TW9kZWwuSS5jaGVja1JlZHBhY2tldCgpXG4gICAgfVxuXG4gICAgYXN5bmMgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1vbmV5ID0gYXdhaXQgQXBwU2RrLkkubWluV2l0aERyYXdhbCgpXG4gICAgICAgIHRoaXMubWluV2l0aERyYXdhbExhYi50ZXh0ID0gJ+acgOS9juaPkOeOsDonICsgbW9uZXk7XG4gICAgfVxuXG5cbiAgICAvKirmiZPlvIDkuKrkurrkuK3lv4MgKi9cbiAgICBvcGVuUGVyc29uYWwoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1vcGVuU2VydmVyLS0tLS0tLScpXG4gICAgICAgIEFwcFNkay5JLnBlcnNvbmFsKCk7XG4gICAgfVxuICAgIC8qKumCgOivt+WlveWPiyAqL1xuICAgIGludml0YXRpb24oKSB7XG4gICAgICAgIEFwcFNkay5JLmludml0YXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxXHTph5HluIFcbiAgICAyXHTmv4DlirHop4bpopHlkI7ph5HluIFcbiAgICAzXHQ0IDUgNiA3IOa4uOaIj+S4reWvueW6lOeahOmBk+WFt1xuICAgIDhcdOepulxuICAgICAqL1xuICAgIHRvdWNoU2hha2UoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS10b3VjaFNoYWtlLS0tLS0tLScpXG4gICAgICAgIEFwcFNkay5JLnZpYnJhdGUoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIDEu5Zue5Y675pif5pifIOmBk+WFtyBcbiAgICAgICAgICogMi7nuqLljIUgICDnm7TmjqXojrflvpfivqbluIHvvJvmiJbogIXnm7TmjqXlvLnmv4DlirHop4bpopHlkI7vvIzojrflvpfivqbluIFcbiAgICAgICAgICogMy7ml6DpgZPlhbdcbiAgICAgICAgICog55u05o6l5bGV4r2w5o+S5bGPXG4gICAgICAgICAqICAqL1xuICAgICAgICBsZXQgZGF0YSA9IFNoYWtlTW9kZWwuSS5nZXRTaGFrZVR5cGUoKTtcbiAgICAgICAgY29uc29sZS5sb2coJ+aRh+S4gOaRh+iOt+WPlue7k+aenO+8micgKyBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgIC8qKiAn6LCi6LCi5Y+C5LiO77yM5LiL5qyh5aW96L+Q77yBJyovO1xuICAgICAgICAgICAgICAgIEFkTWFuYWdlci5JLnNob3dJbnRlckFkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb2luKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaEFEQ29pbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcHMoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQcm9wcyhkYXRhKSB7XG4gICAgICAgIGxldCBib29zdGVyO1xuICAgICAgICBsZXQgcmV3YXJkTnVtID0gZGF0YS5udW07XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICAvKipcbiAgICAgICAgICog5aSE55CG5ri45oiP5Lit55qE6YGT5YW35pi+56S6XG4gICAgICAgICAqL1xuICAgICAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgLy8gICAgIGNhc2UgNDpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmVtb3ZlO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSA2OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5DaGFuZ2U7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDU6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJlZnJlc2g7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDc6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJhbmRSZW1vdmU7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDM6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlN0YXI7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlY2VpdmVQcm9wc1BvcHdpbiwgYm9vc3RlciwgcmV3YXJkTnVtKTtcblxuICAgIH1cbiAgICAvKipcbiAgICAgKiDnnIvlub/lkYrojrflvpfnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyB3YXRjaEFEQ29pbigpIHtcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCk7XG4gICAgICAgIHRoaXMuZ2V0Q29pbigpO1xuICAgIH1cbiAgICAvKirnm7TmjqXojrflvpfnuqLljIUgKi9cbiAgICBnZXRDb2luKCkge1xuICAgICAgICAvL1xi5Yi35paw5oC76YeR5biBXG4gICAgICAgIC8vIEFwcE1hbmFnZXIuSS5yZWRwYWNrZXQuZ2V0UmVwYWNrZXQoKVxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JLm9wZW5Qb3B3aW4oUmVkUGFja2V0UmV3YXJkLCAyKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vRXZlbnRFbnVtXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEV2ZW50Q2VudGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IExheWEuRXZlbnREaXNwYXRjaGVyO1xuICAgIHByaXZhdGUgc3RhdGljIGdldCBJKCk6IExheWEuRXZlbnREaXNwYXRjaGVyIHtcbiAgICAgICAgd2luZG93WydldiddID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW1pdChldmVudDogRXZlbnRFbnVtLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuSS5ldmVudChldmVudC50b1N0cmluZygpLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZCh0eXBlOiBFdmVudEVudW0sIGNhbGxlcjogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIGFyZ3M/OiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuSS5vbih0eXBlLnRvU3RyaW5nKCksIGNhbGxlciwgbGlzdGVuZXIsIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHR5cGU6IEV2ZW50RW51bSwgY2FsbGVyOiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLkkub2ZmKHR5cGUudG9TdHJpbmcoKSwgY2FsbGVyLCBsaXN0ZW5lcik7XG4gICAgfVxufSIsImV4cG9ydCBlbnVtIEV2ZW50RW51bSB7XG5cblx0Q0hFQ0tfUkVEUEFDS0VUID0gPGFueT4nY2hlY2tfcmVkcGFja2V0Jyxcblx0QVBQX1NIT1cgPSA8YW55PidhcHAuc2hvdycsXG5cdEFQUF9ISURFID0gPGFueT4nYXBwLmhpZGUnLFxuXG5cblx0VVBEQVRFX0NPSU4gPSA8YW55Pid1cGRhdGUuY29pbicsXG5cbn0iLCJpbXBvcnQgVFRBZFNkayBmcm9tIFwiLi9UVEFkU2RrXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRNYW5hZ2VyIHtcbiAgICBwcml2YXRlIGxhc3RWaWRlb1RpbWU6IG51bWJlcjtcblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XG4gICAgfVxuXG4gICAgcHJlbG9hZEJhbm5lcigpIHtcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoMSk7XG4gICAgfVxuXG4gICAgcHJlbG9hZFJld2FyZEFkKCkge1xuICAgICAgICBUVEFkU2RrLkkuc2hvd1Jld2FyZFZpZGVvQWQoMSk7XG4gICAgfVxuXG4gICAgcHJlbG9hZEZ1bGxBZCgpIHtcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcbiAgICB9XG5cbiAgICBwcmVsb2FkSW50ZXJBZCgpIHtcbiAgICAgICAgLy8gVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgxKTtcbiAgICB9XG5cbiAgICBwcmVsb2FkTmF0aXZlQWQoKXtcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICBUVEFkU2RrLkkuY2xvc2VBZHZlckRpYWxvZygpXG4gICAgfVxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XG4gICAgICAgIFRUQWRTZGsuSS5jbG9zZUFkQmFubmVyKClcbiAgICB9XG5cbiAgICBhc3luYyBzaG93UmV3YXJkQWQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dSZXdhcmRWaWRlb0FkKCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RWaWRlb1RpbWUgPSBMYXlhLnRpbWVyLmN1cnJUaW1lcjtcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGFzeW5jIHNob3dGdWxsQWQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgpO1xuICAgICAgICAgICAgdGhpcy5wcmVsb2FkRnVsbEFkKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0ludGVyQWQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgpO1xuICAgICAgICAgICAgdGhpcy5wcmVsb2FkSW50ZXJBZCgpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnByZWxvYWRJbnRlckFkKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGNoZWNrVmlkZW9JbkNkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0VmlkZW9UaW1lICYmIChMYXlhLnRpbWVyLmN1cnJUaW1lciAtIHRoaXMubGFzdFZpZGVvVGltZSA8PSAzMDAwMCk7XG4gICAgfVxuXG4gICAgc2hvd0Jhbm5lcigpIHtcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoKTtcbiAgICB9XG5cbiAgICBcbiAgICBzaG93TmF0aXZlQWQoeCwgeSwgdywgaCxwcmVsb2FkPTApIHtcbiAgICAgICAgVFRBZFNkay5JLmxvYWROYXRpdmVFeHByZXNzQWQoeCwgeSwgdywgaCxwcmVsb2FkKTtcbiAgICB9XG5cblxuXG4gICAgc3RhdGljIGdldCBJKCk6IEFkTWFuYWdlciB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoQWRNYW5hZ2VyKTtcbiAgICB9XG59XG5leHBvcnQgZW51bSBBRFBvaW50IHtcbiAgICBHQU1FID0gJ2dhbWUnLFxuICAgIFJFQ09SRCA9ICdyZWNvcmQnLFxuICAgIEJPT1NURVIgPSAnYm9vc3RlcicsXG4gICAgQ0hBTExFTkdFID0gJ2NoYWxsZW5nZScsXG4gICAgQ0hBTExFTkdFX1JFV0FSRCA9ICdjaGFsbGVuZ2VfcmV3YXJkJyxcbiAgICBMRVZFTF9SRVdBUkQgPSAnbGV2ZWxfcmV3YXJkJyxcbiAgICBMT0dJTl9SRVdBUkQgPSAnbG9naW5fcmV3YXJkJyxcbiAgICBSRURQQUNLRVQgPSAncmVkcGFja2V0JyxcbiAgICBQUklWSUxFR0UgPSAncHJpdmlsZWdlJyxcbiAgICBSRUxJVkUgPSAncmVsaXZlJyxcbiAgICBDSEFMTEVOR0VfUkVTRVQgPSAnY2hhbGxlbmdlX3Jlc2V0JyxcbiAgICBCT09TVEVSX1JFV0FSRCA9ICdib29zdGVyX3Jld2FyZCcsXG4gICAgU1VQRVJfUkVXQVJEID0gJ3N1cGVyX3Jld2FyZCcsXG4gICAgVElQUyA9ICd0aXBzJyxcbiAgICBSRVNVTFQgPSAncmVzdWx0JyxcbiAgICBSRURQQUNLRVRfUkVXQVJEID0gJ3JlZFBhY2tldF9yZXdhcmQnLFxufVxuIiwiaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4uL2V2ZW50L0V2ZW50RW51bVwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcHBTZGsge1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfY2hhbm5lbDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3ZlcnNpb246IHN0cmluZztcbiAgICBwcml2YXRlIF9sZXZlbDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2dhbWVDb25maWc6IG51bWJlcjtcblxuICAgIHB1YmxpYyBwYW5nb2xpbklkOiBzdHJpbmc7XG4gICAgcHVibGljIGFkbmV0SWQ6IHN0cmluZztcblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMuZ2V0U3lzdGVtSW5mbygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG15QnJpZGdlKCkge1xuICAgICAgICBpZiAoTXlCcmlkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBNeUJyaWRnZTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAvKirojrflj5bln7rmnKzniYjmnKzkv6Hmga/ku6Xlj4rmiYvmnLrnmoTphY3nva4gKi9cbiAgICBwcml2YXRlIGdldFN5c3RlbUluZm8oa2V5OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGxldCByZXQgPSB0aGlzLm15QnJpZGdlLmdldFN5c3RlbUluZm8oa2V5KTtcbiAgICAgICAgbGV0IHsgdywgaCwgdmVyc2lvbk5hbWUsIGNoYW5uZWwsIHBhbmdvbGluLCBhZG5ldCwgbGV2ZWwgfSA9IEpTT04ucGFyc2UocmV0KTtcbiAgICAgICAgW3RoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRoaXMuX3ZlcnNpb24sXG4gICAgICAgIHRoaXMuX2NoYW5uZWwsIHRoaXMucGFuZ29saW5JZCxcbiAgICAgICAgdGhpcy5hZG5ldElkLCB0aGlzLl9sZXZlbF0gPSBbdywgaCwgdmVyc2lvbk5hbWUsIGNoYW5uZWwsIHBhbmdvbGluLCBhZG5ldCwgbGV2ZWxdO1xuICAgIH1cblxuICAgIGluaXRHYW1lQ29uZmlnKCkge1xuICAgICAgICB0aGlzLl9nYW1lQ29uZmlnID0gdGhpcy5nZXRHYW1lQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6ZyH5YqoXG4gICAgICogQHBhcmFtIGtleSAwIOefremch+WKqCAxIOmVv+mch+WKqFxuICAgICAqL1xuICAgIHZpYnJhdGUoa2V5OiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uub3BlblN5c3RlbUZ1bihrZXkpO1xuICAgIH1cblxuICAgIC8qKumakOiXj+WQr+WKqOWxjyAqL1xuICAgIGhpZGVTcGxhc2goKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuaGlkZVNwbGFzaCgpO1xuICAgIH1cblxuICAgIC8qKuW8ueWHuuaPkOeOsCAqL1xuICAgIHdpdGhEcmF3YWwoKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uud2l0aERyYXdhbCgpO1xuICAgIH1cbiAgICAvKirmhI/op4Hlj43ppoggKi9cbiAgICBmZWVkYmFjaygpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5mZWVkYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBrZXkg6buY6K6kMCDvvIznrb7liLAgMVxuICAgICAqL1xuICAgIHBlcnNvbmFsKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLnBlcnNvbmFsKCk7XG4gICAgfVxuICAgIC8qKumCgOivt+WlveWPiyovXG4gICAgaW52aXRhdGlvbigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5pbnZpdGF0aW9uKCk7XG4gICAgfVxuXG5cbiAgICAvKirpgoDor7flpb3lj4sqL1xuICAgIG9wZW5SZXdhcmQoKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uub3BlblJld2FyZCgpO1xuICAgIH1cbiAgICAvKirnrb7liLAqL1xuICAgIG9wZW5TaWduaW4oKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uub3BlblNpbmdpbigpO1xuICAgIH1cblxuXG4gICAgcHV0RGF0YShrZXk6IFN0cmluZywgdmFsdWU6IFN0cmluZykge1xuXG4gICAgICAgIHRoaXMubXlCcmlkZ2UucHV0RGF0YShrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleSAg5a2Y5pWw5o2u55qE5pe25YCZ55qE5ZSv5LiAa2V5XG4gICAgICogQHJldHVybiAg5a2Y5YKo55qE5pWw5o2uXG4gICAgICogKi9cbiAgICBnZXREYXRhKGtleTogU3RyaW5nKSB7XG4gICAgICAgIGxldCByZXQgPSB0aGlzLm15QnJpZGdlLmdldERhdGEoa2V5KTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmV0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDojrflj5bph5HluIHphY3ooahcbiAgICAgKiBAcGFyYW0ga2V5IDHnuqLljIUgICAyIOaRh+S4gOaRh+e6ouWMhVxuICAgICAqL1xuICAgIGdldEdhbWVDb25maWcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm15QnJpZGdlLmdldEdhbWVDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6KaB5rGC5Y+R5pS+6YeR5biBXG4gICAgICogQHBhcmFtIGtleSAx57qi5YyFXG4gICAgICovXG4gICAgYXN5bmMgYWRkR29sZChrZXk9MSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLmFkZEdvbGQoa2V5LCByZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIC8qKuiOt+WPluaAu+mHkeW4gSAqL1xuICAgIGFzeW5jIG15Q29pbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5teUJyaWRnZS5teUNvaW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydjb2luJ10pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvKirojrflj5blvZPliY3mj5DnjrDnmoTmoaPkvY0gKi9cbiAgICBhc3luYyBtaW5XaXRoRHJhd2FsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLm1pbldpdGhEcmF3YWwocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydtb25leSddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKuS4iuaKpeWfi+eCuSAqL1xuICAgIGFwcERvdExvZyhrZXk6IHN0cmluZywgdmFsdWU/KSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuYXBwRG90TG9nKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKirng63kupHmiZPngrkgKi9cbiAgICBhcHBEb3RUcmFjS2luZyhrZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmFwcERvdFRyYWNLaW5nKGtleSk7XG4gICAgfVxuXG4gICAgc2V0Q2FsbGJhY2soZnVuTmFtZTogc3RyaW5nLCBwcmFtYXM/OiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNldENhbGxiYWNrLS0tLSB0aGlzLm15QnJpZGdlLS0tJyArIEpTT04uc3RyaW5naWZ5KHRoaXMubXlCcmlkZ2UpKVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5teUJyaWRnZVtmdW5OYW1lXShwcmFtYXMsIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSwgZGF0YSB9ID0gSlNPTi5wYXJzZShyZXMpO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmNsb3NlQWR2ZXJEaWFsb2coKTtcbiAgICB9XG4gICAgY2xvc2VBZEJhbm5lcigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5jbG9zZUFkQmFubmVyKCk7XG4gICAgfVxuICAgIC8qKua/gOWKseinhumikSAqL1xuICAgIHNob3dSZXdhcmRWaWRlb0FkKHZhbHVlOiBJVmlkZW8sIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd1Jld2FyZFZpZGVvQWQodmFsdWUsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKiDlhajlsY/lub/lkYoqL1xuICAgIGxvYWRGdWxsU2NyZWVuVmlkZW9BZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd1Jld2FyZFZpZGVvQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoq5L+h5oGv5rWB5bm/5ZGKICovXG4gICAgbG9hZE5hdGl2ZUV4cHJlc3NBZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UubG9hZE5hdGl2ZUV4cHJlc3NBZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKipiYW5uZXIgKi9cbiAgICBsb2FkQmFubmVyRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkQmFubmVyRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKuaPkuWxj+W5v+WRiiAqL1xuICAgIHNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuXG4gICAgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gICAgfVxuICAgIGdldCB3aWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH1cblxuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cblxuICAgIGdldCBjaGFubmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhbm5lbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGJyaWRnZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGdhbWVDb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nYW1lQ29uZmlnO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogQXBwU2RrIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChBcHBTZGspO1xuICAgIH1cbn1cbi8vICAgICAvL+i/memHjOaYr+a1j+iniOWZqOeOr+Wig+S4i++8jCDmjqXmlLZ3ZWLkvKDov4fmnaXnmoTmtojmga9cbndpbmRvdy5vbk15QnJpZGdlUmVhZHkgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJvbk15QnJpZGdlUmVhZHkgbG9hZCBmaW5pc2gsIGNvc3Q6XCIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpICsgXCJtc1wiKTtcbiAgICBNeUJyaWRnZS5BcHAub25SZXN1bWUgPSAoLi4ucmV0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgIGxheWEgb25SZXN1bWUnLCByZXQpXG4gICAgICAgXG4gICAgfVxuICAgIE15QnJpZGdlLkFwcC5vblBhdXNlID0gKC4uLnJldCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIGxheWEgb25QYXVzZScsIHJldClcbiAgICB9XG59XG5cbmludGVyZmFjZSBJVmlkZW8ge1xuICAgIHByZWxvYWRpbmc6IG51bWJlcixcbiAgICB0eXBlOiBudW1iZXIsXG59IiwiaW1wb3J0IEFkTWFuYWdlciwgeyBBRFBvaW50IH0gZnJvbSBcIi4uL3Nkay9BZE1hbmFnZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF0aXZlQWQgZXh0ZW5kcyBMYXlhLlNjcmlwdCB7XG4gICAgLyoqIEBwcm9wIHtuYW1lOnBvaW50LCB0aXBzOlwi5bm/5ZGK54K5XCIsIHR5cGU6U3RyaW5nfSovXG4gICAgcHVibGljIHBvaW50OiBBRFBvaW50O1xuXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cblxuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xuICAgICAgICBsZXQgZ2xvYmFsUG9pbnQgPSB0aGlzLml0ZW0ubG9jYWxUb0dsb2JhbChMYXlhLlBvaW50LkVNUFRZLCB0cnVlKTtcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd05hdGl2ZUFkKHRoaXMucG9pbnQsIGdsb2JhbFBvaW50LngsIGdsb2JhbFBvaW50LnksIHRoaXMuaXRlbS53aWR0aCwgdGhpcy5pdGVtLmhlaWdodCk7XG4gICAgfVxuXG4gICAgb25EaXNhYmxlKCk6IHZvaWQge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkdmVyRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXRlbSgpOiBMYXlhLlZpZXcge1xuICAgICAgICByZXR1cm4gdGhpcy5vd25lciBhcyBhbnk7XG4gICAgfVxufSIsImltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVFRBZFNkayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHByZWxvYWQgIDAg55u05o6l5Yqg6L2977ybMSDpooTliqDovb1cbiAgICAgKi9cbiAgICBhc3luYyBzaG93UmV3YXJkVmlkZW9BZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgICAgICAgICBBcHBTZGsuSS5zaG93UmV3YXJkVmlkZW9BZChkYXRhLCByZXQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IGNvZGUsIG1lc3NhZ2UgfSA9IEpTT04ucGFyc2UocmV0KTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAtMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgLyoqJ+aaguaXoOinhumikeW5v+WRiu+8geavj+aXpTDngrnph43nva4nKi87XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3VuQ29tcGxldGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZEZ1bGxTY3JlZW5WaWRlb0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcbiAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICB3OiBBcHBTZGsuSS53aWR0aCxcbiAgICAgICAgICAgIGg6IEFwcFNkay5JLndpZHRoICogOTAgLyA2MDAsXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxuICAgICAgICAgICAgdHlwZTogMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBBcHBTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoSlNPTi5zdHJpbmdpZnkoZGF0YSkscmVzPT57XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGFzeW5jIGxvYWROYXRpdmVFeHByZXNzQWQoeCwgeSwgd2lkdGgsIGhlaWdodCwgdHlwZSA9IDEsIHByZWxvYWQ6IG51bWJlciA9IDApIHtcbiAgICAgICAgbGV0IHNjYWxlWCA9IEFwcFNkay5JLndpZHRoIC8gTGF5YS5zdGFnZS53aWR0aDtcbiAgICAgICAgbGV0IHNjYWxlWSA9IEFwcFNkay5JLmhlaWdodCAvIExheWEuc3RhZ2UuaGVpZ2h0O1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxuICAgICAgICAgICAgdzogd2lkdGggKiBzY2FsZVgsXG4gICAgICAgICAgICBoOiBoZWlnaHQgKiBzY2FsZVksXG4gICAgICAgICAgICBsZWZ0OiB4ICogc2NhbGVYLFxuICAgICAgICAgICAgdG9wOiB5ICogc2NhbGVZXG4gICAgICAgIH1cbiAgICAgICAgQXBwU2RrLkkubG9hZE5hdGl2ZUV4cHJlc3NBZChKU09OLnN0cmluZ2lmeShkYXRhKSxyZXM9PntcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcylcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkQmFubmVyRXhwcmVzc0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcbiAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICB3OiBBcHBTZGsuSS53aWR0aCxcbiAgICAgICAgICAgIGg6IEFwcFNkay5JLndpZHRoICogOTAgLyA2MDAsXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxuICAgICAgICAgICAgdHlwZTogMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBBcHBTZGsuSS5sb2FkQmFubmVyRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLHJlcz0+e1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICBBcHBTZGsuSS5jbG9zZUFkdmVyRGlhbG9nKCk7XG4gICAgfVxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XG4gICAgICAgIEFwcFNkay5JLmNsb3NlQWRCYW5uZXIoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaG93SW50ZXJhY3Rpb25FeHByZXNzQWQocHJlbG9hZDogbnVtYmVyID0gMCkge1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIHc6IEFwcFNkay5JLndpZHRoICogMC44LFxuICAgICAgICAgICAgaDogQXBwU2RrLkkuaGVpZ2h0LFxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgIEFwcFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChKU09OLnN0cmluZ2lmeShkYXRhKSxyZXM9PntcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBJKCk6IFRUQWRTZGsge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFRUQWRTZGspIGFzIFRUQWRTZGs7XG4gICAgfVxufSIsImltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhY2tpbmdTZGsge1xuICAgIGRvdChrZXk6IHN0cmluZykge1xuICAgICAgICBBcHBTZGsuSS5hcHBEb3RUcmFjS2luZyhrZXkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgSSgpOiBUcmFja2luZ1NkayB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoVHJhY2tpbmdTZGspIGFzIFRyYWNraW5nU2RrO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gVHJhY2tpbmdLZXkge1xuICAgIFJlZFBhY2sxID0gJ2V2ZW50XzUnLFxuICAgIFJlZFBhY2s1ID0gJ2V2ZW50XzYnXG59XG4iLCJpbXBvcnQgQXJyYXlVdGlscyBmcm9tIFwiLi4vLi4vdWl0bC9BcnJheVV0aWxzXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgICBwcm90ZWN0ZWQgX2RhdGE6IGFueSA9IHt9O1xuICAgIHByaXZhdGUgdXBkYXRlQXJyOiBBcnJheTxGdW5jdGlvbj4gPSBbXTtcbiAgICBwcml2YXRlIGtleVVwZGF0ZUFycjogYW55ID0ge307XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGRhdGE6IGFueSkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fZGF0YSxcbiAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUFyci5mb3JFYWNoKGZ1bmMgPT4ge1xuICAgICAgICAgICAgZnVuYyh0aGlzLl9kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMua2V5VXBkYXRlQXJyKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBhcnIgPSB0aGlzLmtleVVwZGF0ZUFycltrZXldO1xuICAgICAgICAgICAgICAgIGFyciAmJiBhcnIuZm9yRWFjaChmdW5jID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZnVuYyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3YWl0Rm9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNiID0gZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZVcGRhdGUoY2IsIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZShjYiwga2V5LCB0cnVlKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VcGRhdGUoZnVuYzogRnVuY3Rpb24sIGtleT86IHN0cmluZywgcnVuOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLl9kYXRhW2tleV07XG4gICAgICAgICAgICBydW4gJiYgdmFsdWUgIT0gbnVsbCAmJiBmdW5jKHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBhcnIgPSB0aGlzLmtleVVwZGF0ZUFycltrZXldO1xuICAgICAgICAgICAgIWFyciAmJiAodGhpcy5rZXlVcGRhdGVBcnJba2V5XSA9IGFyciA9IFtdKTtcbiAgICAgICAgICAgIGFyci5wdXNoKGZ1bmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuICYmIGZ1bmModGhpcy5fZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFyci5wdXNoKGZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9mZlVwZGF0ZShmdW5jOiBGdW5jdGlvbiwga2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIEFycmF5VXRpbHMucmVtb3ZlRnJvbUFycih0aGlzLmtleVVwZGF0ZUFycltrZXldLCBmdW5jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEFycmF5VXRpbHMucmVtb3ZlRnJvbUFycih0aGlzLnVwZGF0ZUFyciwgZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJHYW1lKCkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxufSIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSBcIi4vQmFzZU1vZGVsXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuLi8uLi9zZGsvQWRNYW5hZ2VyXCI7XG5pbXBvcnQgVGVhU2RrLCB7IERvdEtleSB9IGZyb20gXCIuLi8uLi9zZGsvVGVhU2RrXCI7XG5pbXBvcnQgVHJhY2tpbmdTZGssIHsgVHJhY2tpbmdLZXkgfSBmcm9tIFwiLi4vLi4vc2RrL1RyYWNraW5nU2RrXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi4vLi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuLi8uLi9ldmVudC9FdmVudEVudW1cIjtcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4uL0FwcFNka1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRwYWNrZXRNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gICAgcHJpdmF0ZSBNQVggPSAyMDtcbiAgICAvKirlvZPlpKnpooblj5bnuqLljIXnmoTmnIDlpKfmrKHmlbAgKi9cbiAgICBwcml2YXRlIERBWV9NQVhfQ05UID0gNTA7XG4gICAgcHJpdmF0ZSBjb25mOiBhbnk7XG4gICAgcHVibGljIGN1clJlZHBhY2tldDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgY29uZkxlbjogbnVtYmVyID0gMDtcblxuICAgIC8qKuWIneWni+WMlue6ouWMhemFjee9riAqL1xuICAgIGFzeW5jIGluaXQoKSB7XG5cbiAgICAgICAgbGV0IGFyciA9IGF3YWl0IHRoaXMuZ2V0UmVkQ29uZmlnKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1SZWRwYWNrZXRNb2RlbC0tLS0tLS0nICsgSlNPTi5zdHJpbmdpZnkoYXJyKSlcbiAgICAgICAgbGV0IGNhc2ggPSAwO1xuICAgICAgICB0aGlzLmNvbmYgPSB7fTtcbiAgICAgICAgYXJyLmZvckVhY2goY29uZkRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25mW2NvbmZEYXRhLmlkXSA9IGNvbmZEYXRhO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmluaXREYXRhKCkpO1xuICAgICAgICB0aGlzLmNvbmZMZW4gPSB0aGlzLmNvbmYubGVuZ3RoO1xuXG4gICAgfVxuXG5cblxuICAgIGluaXREYXRhKCkge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBSZWRwYWNrZXREYXRhO1xuICAgICAgICBsZXQgbGFzdFRpbWUgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5Lmxhc3RUaW1lKSB8fCAnMCc7XG4gICAgICAgIGRhdGEubGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XG5cbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShkYXRhLmxhc3RUaW1lKTtcbiAgICAgICAgbGV0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5O1xuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xuICAgICAgICAgICAgZGF0YS50b2RheUNudCA9IDA7XG4gICAgICAgICAgICBsYXN0VGltZSA9IERhdGVVdGlscy5ub3dUaW1lLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5Lmxhc3RUaW1lLCBsYXN0VGltZSlcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkudG9kYXlDbnQsIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvZGF5Q250ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS50b2RheUNudCkgfHwgJzAnO1xuICAgICAgICAgICAgZGF0YS50b2RheUNudCA9IHBhcnNlSW50KHRvZGF5Q250KTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmxhc3RUaW1lID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuICAgICAgICBsZXQgZGF0YUNudCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuZGF0YUNOVCkgfHwgJzAnO1xuICAgICAgICBkYXRhLmNudCA9IHBhcnNlSW50KGRhdGFDbnQpO1xuICAgICAgICBkYXRhLmxpc3QgPSBbXTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG5cbiAgICBhc3luYyBnZXRSZWRDb25maWcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBBcHBTZGsuSS5nYW1lQ29uZmlnO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tIOiOt+WPlumFjee9rumdmeaAgeihqC0tLS0tJyArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBjb25maWdKc29uID0gYXdhaXQgdGhpcy5sb2FkR29sZENmZyhyZXN1bHRbJ2NvaW5fY29uZmlnJ11bMF0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0g6I635Y+W57qi5YyF6Z2Z5oCB6KGoLS0tLS0nICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSlcbiAgICAgICAgICAgIHJldHVybiBjb25maWdKc29uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQXBwU2RrLkkuaW5pdEdhbWVDb25maWcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsb2FkR29sZENmZyhyZXM6IHN0cmluZykge1xuICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IHRoaXMubG9hZChyZXMpO1xuICAgICAgICByZXR1cm4gY29uZmlnSnNvbjtcbiAgICB9XG5cbiAgICBsb2FkKHJlcywgb25Qcm9ncmVzcz86IExheWEuSGFuZGxlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoc3VjLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHJlcywgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBzdWMpLCBvblByb2dyZXNzKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja1JlZHBhY2tldCgpIHtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLnRvZGF5Q250ID49IHRoaXMuREFZX01BWF9DTlQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFkTWFuYWdlci5JLmNoZWNrVmlkZW9JbkNkKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLyoq57qi5YyF6I635Y+W5ZCO5rKh5pyJ55yL5bm/5ZGK6aKG5Y+W77yM5YaN5qyh6I635b6X57qi5YyF55qE5py65Lya77yM5LiN5Lya6I635Y+W57qi5YyF77yMIOiHquW3seS5n+WPr+S7peWkhOeQhuaIkCDlr7nlupTnmoTnuqLljIXmj5DphpLmiJbkuI3pnIDopoHov5nph4znmoTliKTmlq0gKi9cbiAgICAgICAgaWYgKHRoaXMuY3VyUmVkcGFja2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gdGhpcy5kYXRhLmNudCkgdGhpcy5kYXRhLmNudCA9IDA7XG4gICAgICAgIGxldCBjbnQgPSB0aGlzLmRhdGEuY250O1xuICAgICAgICBpZiAoY250ID49IHRoaXMuY29uZkxlbikgY250ID0gdGhpcy5jb25mTGVuIC0gMTtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmNvbmZbY250ICsgMV07XG4gICAgICAgIGxldCByYW4yID0gTWF0aC5yYW5kb20oKTtcblxuICAgICAgICBpZiAoZGF0YSAmJiByYW4yIDwgZGF0YS5wZXIpIHtcbiAgICAgICAgICAgIGxldCBjYXNoID0gMC4wMDAwMDE7XG4gICAgICAgICAgICB0aGlzLmN1clJlZHBhY2tldCA9IGNhc2g7XG4gICAgICAgICAgICAvLyoq5by55Ye657qi5YyF55qE55WM6Z2iLCAg5pqC5pe25aSE55CG5oiQIOebtOaOpeeci+W5v+WRiuiOt+WPlumHkeW4gSAqL1xuICAgICAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKClcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0g6Kem5Y+R5LqG57qi5YyFLS0tLS0nKVxuICAgICAgICAgICAgdGhpcy5nZXRSZXBhY2tldCgpXG4gICAgICAgICAgICAvKirmm7TmlrDln7rmnKzmmL7npLogKi9cbiAgICAgICAgICAgIEV2ZW50Q2VudGVyLmVtaXQoRXZlbnRFbnVtLlVQREFURV9DT0lOKTtcblxuICAgICAgICAgICAgLyoqKiAqL1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldFJlcGFja2V0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VyUmVkcGFja2V0KSByZXR1cm47XG4gICAgICAgIHRoaXMuZGF0YS5jbnQgKz0gMTtcbiAgICAgICAgdGhpcy5kYXRhLmxpc3QucHVzaCh0aGlzLmN1clJlZHBhY2tldCk7XG4gICAgICAgIHRoaXMuZGF0YS5sYXN0VGltZSA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLmRhdGEudG9kYXlDbnQgKz0gMTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jbnQgPT0gMSlcbiAgICAgICAgICAgIFRyYWNraW5nU2RrLkkuZG90KFRyYWNraW5nS2V5LlJlZFBhY2sxKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jbnQgPT0gNSlcbiAgICAgICAgICAgIFRyYWNraW5nU2RrLkkuZG90KFRyYWNraW5nS2V5LlJlZFBhY2s1KTtcbiAgICAgICAgdGhpcy5jdXJSZWRwYWNrZXQgPSAwO1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LmRhdGFDTlQsIHRoaXMuZGF0YS5jbnQpO1xuICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5LnRvZGF5Q250LCB0aGlzLmRhdGEudG9kYXlDbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqICovXG4gICAgYXN5bmMgZ2V0Q3VyUmVkcGFja2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJSZWRwYWNrZXQ7XG4gICAgfVxuXG4gICAgZ2V0IGRhdGEoKTogUmVkcGFja2V0RGF0YSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICAvKirojrflj5bmgLvlhbHnmoTph5HluIHmlbAgKi9cbiAgICBhc3luYyBnZXRUb3RhbENvaW4oKSB7XG4gICAgICAgIGxldCB0b3RhbENvaW4gPSBhd2FpdCBBcHBTZGsuSS5teUNvaW4oKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsQ29pbjtcbiAgICB9XG4gICAgLyoq6I635Y+W5pys5qyh5aWW5Yqx55qE6YeR5biB5pWwICovXG4gICAgYXN5bmMgYWRkQ29pbihrZXk6IG51bWJlciA9IDEpIHtcbiAgICAgICAgbGV0IGNvaW5EYXRhID0gYXdhaXQgQXBwU2RrLkkuYWRkR29sZChrZXkpO1xuICAgICAgICByZXR1cm4gY29pbkRhdGFbJ2NvaW4nXTtcbiAgICB9XG5cbiAgICAvKirojrflj5bmnIDkvY7mj5DmoaMgKi9cbiAgICBhc3luYyAgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1pbkNvaW4gPSBhd2FpdCBBcHBTZGsuSS5taW5XaXRoRHJhd2FsKCk7XG4gICAgICAgIHJldHVybiBtaW5Db2luO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogUmVkcGFja2V0TW9kZWwge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFJlZHBhY2tldE1vZGVsKSBhcyBSZWRwYWNrZXRNb2RlbDtcbiAgICB9XG59XG5cbmNsYXNzIFJlZHBhY2tldERhdGEge1xuICAgIGNudDogbnVtYmVyO1xuICAgIGxpc3Q6IEFycmF5PG51bWJlcj47XG4gICAgbGFzdFRpbWU6IG51bWJlcjtcbiAgICB0b2RheUNudDogbnVtYmVyO1xufVxuXG5jbGFzcyBSZWRwYWNrZXRDb25maWdEYXRhIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIHBlcjogbnVtYmVyO1xuICAgIGNhc2g6IG51bWJlcjtcbn0iLCJpbXBvcnQgQmFzZU1vZGVsIGZyb20gXCIuL0Jhc2VNb2RlbFwiO1xuaW1wb3J0IERhdGVVdGlscyBmcm9tIFwiLi4vLi4vdWl0bC9EYXRlVXRpbHNcIjtcbmltcG9ydCBVdGlsLCB7IERhdGFLZXkgfSBmcm9tIFwiLi4vLi4vdWl0bC9VdGlsXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uLy4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4uL0FwcFNka1wiO1xuXG4vKipcbiAqIFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFrZU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcblxuICAgIHByaXZhdGUgY29uZjogYW55O1xuICAgIHByaXZhdGUgZWxlUHJvYmFiaWxpdHlBcnI6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSB0b3RhbFdlaWdodDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHByb0FyckxlbjogbnVtYmVyID0gMDtcbiAgICAvKirnuqLljIXlh7rnjrDnmoTmgLvmrKHmlbDmr4/ml6UgKi9cbiAgICBwcml2YXRlIHJlZF9kYXlfbGltaXQ6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBjdXJfcmVkX2RheV9saW1pdDogbnVtYmVyID0gMDtcbiAgICAvKirmkYfkuIDmkYflh7rnjrDnmoTmgLvmrKHmlbAgKi9cbiAgICBwcml2YXRlIHNoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgY3VyX3NoYWtlX2RheV9saW1pdDogbnVtYmVyID0gMDtcblxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBBcHBTZGsuSS5nYW1lQ29uZmlnOztcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLVNoYWtlTW9kZWwtLSDojrflj5bmkYfkuIDmkYfpnZnmgIHooagtLS0tLScgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICBpZiAocmVzdWx0Wydjb25maWcnXSkge1xuICAgICAgICAgICAgbGV0IGdhbWVEYXRhID0gcmVzdWx0Wydjb25maWcnXTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMuaW5pdERhdGEoZ2FtZURhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXREYXRhKGdhbWVEYXRhKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFNoYWtlRGF0YTtcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5zaGFrZUxhc3RUaW1lKSB8fCAnMCc7XG4gICAgICAgIGxldCBsdCA9IHBhcnNlSW50KGxhc3RUaW1lKTtcbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShsdCk7XG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcblxuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xuICAgICAgICAgICAgdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPSAwO1xuICAgICAgICAgICAgbGFzdFRpbWUgPSBEYXRlVXRpbHMubm93VGltZS50b1N0cmluZygpO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5jdXJfc2hha2VfZGF5X2xpbWl0LCAwKTtcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkuY3VyX3JlZF9kYXlfbGltaXQsIDApO1xuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5zaGFrZUxhc3RUaW1lLCBsYXN0VGltZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjdXJfcmVkX2RheV9saW1pdCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuY3VyX3JlZF9kYXlfbGltaXQpIHx8ICcwJztcbiAgICAgICAgICAgIHRoaXMuY3VyX3JlZF9kYXlfbGltaXQgPSBwYXJzZUludChjdXJfcmVkX2RheV9saW1pdCk7XG4gICAgICAgICAgICBsZXQgY3VyX3NoYWtlX2RheV9saW1pdCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuY3VyX3NoYWtlX2RheV9saW1pdCkgfHwgJzAnO1xuICAgICAgICAgICAgdGhpcy5jdXJfc2hha2VfZGF5X2xpbWl0ID0gcGFyc2VJbnQoY3VyX3NoYWtlX2RheV9saW1pdCk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmNvbmZpZyA9IGdhbWVEYXRhWydjb25maWcnXTtcbiAgICAgICAgZ2FtZURhdGFbJ3NoYWtlJ10uZm9yRWFjaChlbGUgPT4ge1xuICAgICAgICAgICAgZGF0YS5zaGFrZVdlaWdodExpc3QucHVzaChlbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25mID0gW107XG4gICAgICAgIHRoaXMuY29uZiA9IGRhdGEuc2hha2VXZWlnaHRMaXN0O1xuICAgICAgICB0aGlzLmluaXRQcm9iYWJpbGl0eSgpO1xuICAgICAgICB0aGlzLnNoYWtlX2RheV9saW1pdCA9IGRhdGEuY29uZmlnLnNoYWtlX2RheV9saW1pdDtcbiAgICAgICAgdGhpcy5yZWRfZGF5X2xpbWl0ID0gZGF0YS5jb25maWcucmVkX2RheV9saW1pdDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaW5pdFByb2JhYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnRvdGFsV2VpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5jb25mLmZvckVhY2goKGVsZSwgaW5kZXgpID0+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 | ... | ... |
puchi_laya/src/Main.ts
1 | 1 | import GameConfig from "./GameConfig"; |
2 | 2 | import AdManager from "./sdk/AdManager"; |
3 | 3 | import ShakeModel from "./sdk/model/ShakeModel"; |
4 | -import PcSdk from "./sdk/PcSdk"; | |
5 | 4 | import RedpacketModel from "./sdk/model/RedpacketModel"; |
5 | +import AppSdk from "./sdk/AppSdk"; | |
6 | 6 | class Main { |
7 | 7 | constructor() { |
8 | 8 | //根据IDE设置初始化引擎 |
... | ... | @@ -41,19 +41,19 @@ class Main { |
41 | 41 | |
42 | 42 | /**初始化SDK */ |
43 | 43 | async initData() { |
44 | - /**隐藏启动屏 */ | |
45 | - PcSdk.I.hideSplash() | |
44 | + | |
46 | 45 | /**初始化adk 获取app配置信息 */ |
47 | - PcSdk.I.init(); | |
46 | + AppSdk.I.init(); | |
48 | 47 | /**预加载视频 */ |
49 | 48 | AdManager.I.init(); |
50 | 49 | /**获取红包配置 摇一摇 等静态数据 */ |
51 | - await PcSdk.I.initGameConfig(); | |
52 | - | |
50 | + await AppSdk.I.initGameConfig(); | |
51 | + /**隐藏启动屏 */ | |
52 | + AppSdk.I.hideSplash() | |
53 | 53 | |
54 | 54 | await RedpacketModel.I.init() |
55 | 55 | |
56 | - await ShakeModel.I.init(); | |
56 | + await ShakeModel.I.init(); | |
57 | 57 | } |
58 | 58 | } |
59 | 59 | //激活启动类 | ... | ... |
puchi_laya/src/RedDrawal.ts
1 | 1 | import RedpacketModel from "./sdk/model/RedpacketModel"; |
2 | 2 | import { EventCenter } from "./event/EventCenter"; |
3 | 3 | import { EventEnum } from "./event/EventEnum"; |
4 | -import PcSdk from "./sdk/PcSdk"; | |
4 | +import AppSdk from "./sdk/AppSdk"; | |
5 | 5 | /** |
6 | 6 | * 主界面 金币金额 |
7 | 7 | */ |
... | ... | @@ -29,12 +29,12 @@ export default class RedDrawal extends Laya.Script { |
29 | 29 | } |
30 | 30 | |
31 | 31 | async updateStar() { |
32 | - let coin = await PcSdk.I.myCoin(); | |
32 | + let coin = await AppSdk.I.myCoin(); | |
33 | 33 | this.totalCoin = coin; |
34 | 34 | this.coinlab.text = '' + coin; |
35 | 35 | let str = '可提现'; |
36 | 36 | /**更新下下一次提现的额度 */ |
37 | - let nextDrawal = await PcSdk.I.minWithDrawal(); | |
37 | + let nextDrawal = await AppSdk.I.minWithDrawal(); | |
38 | 38 | if (this.totalCoin > 0) { |
39 | 39 | let leftCoin = nextDrawal - this.totalCoin; |
40 | 40 | if (leftCoin > 0) | ... | ... |
puchi_laya/src/TestScene.ts
... | ... | @@ -2,9 +2,9 @@ import { ui } from "./ui/layaMaxUI"; |
2 | 2 | import AdManager from "./sdk/AdManager"; |
3 | 3 | import ShakeModel from "./sdk/model/ShakeModel"; |
4 | 4 | import RedpacketModel from "./sdk/model/RedpacketModel"; |
5 | -import PcSdk from "./sdk/PcSdk"; | |
6 | 5 | import NativeAd from "./sdk/NativeAd"; |
7 | 6 | import Util from "./uitl/Util"; |
7 | +import AppSdk from "./sdk/AppSdk"; | |
8 | 8 | |
9 | 9 | export default class TestScene extends ui.TestSceneUI { |
10 | 10 | private isLongVibrate: boolean = false; |
... | ... | @@ -20,7 +20,7 @@ export default class TestScene extends ui.TestSceneUI { |
20 | 20 | onEnable(): void { |
21 | 21 | this.btnServer.on(Laya.Event.CLICK, this, this.openServer); |
22 | 22 | this.btnVibrate.on(Laya.Event.CLICK, this, () => { |
23 | - PcSdk.I.vibrate(this.isLongVibrate ? 0 : 1); | |
23 | + AppSdk.I.vibrate(this.isLongVibrate ? 0 : 1); | |
24 | 24 | this.isLongVibrate = !this.isLongVibrate; |
25 | 25 | }); |
26 | 26 | this.btnDrawal.on(Laya.Event.CLICK, this, this.openPersonal); |
... | ... | @@ -103,7 +103,7 @@ export default class TestScene extends ui.TestSceneUI { |
103 | 103 | /**意见反馈 */ |
104 | 104 | openServer() { |
105 | 105 | console.log('---------------openServer-------') |
106 | - PcSdk.I.feedback(); | |
106 | + AppSdk.I.feedback(); | |
107 | 107 | } |
108 | 108 | |
109 | 109 | async openRedpacket() { |
... | ... | @@ -111,7 +111,7 @@ export default class TestScene extends ui.TestSceneUI { |
111 | 111 | } |
112 | 112 | |
113 | 113 | async minWithDrawal() { |
114 | - let money = await PcSdk.I.minWithDrawal() | |
114 | + let money = await AppSdk.I.minWithDrawal() | |
115 | 115 | this.minWithDrawalLab.text = '最低提现:' + money; |
116 | 116 | } |
117 | 117 | |
... | ... | @@ -119,11 +119,11 @@ export default class TestScene extends ui.TestSceneUI { |
119 | 119 | /**打开个人中心 */ |
120 | 120 | openPersonal() { |
121 | 121 | console.log('---------------openServer-------') |
122 | - PcSdk.I.personal(0); | |
122 | + AppSdk.I.personal(); | |
123 | 123 | } |
124 | 124 | /**邀请好友 */ |
125 | 125 | invitation() { |
126 | - PcSdk.I.invitation(); | |
126 | + AppSdk.I.invitation(); | |
127 | 127 | } |
128 | 128 | |
129 | 129 | /** |
... | ... | @@ -134,7 +134,7 @@ export default class TestScene extends ui.TestSceneUI { |
134 | 134 | */ |
135 | 135 | touchShake() { |
136 | 136 | console.log('---------------touchShake-------') |
137 | - PcSdk.I.vibrate(); | |
137 | + AppSdk.I.vibrate(); | |
138 | 138 | /** |
139 | 139 | * 1.回去星星 道具 |
140 | 140 | * 2.红包 直接获得⾦币;或者直接弹激励视频后,获得⾦币 | ... | ... |
No preview for this file type
puchi_laya/src/sdk/AdManager.ts
1 | -import TTAdSdk from "./TTAdSdk"; | |
2 | -import ObjectInstance from "../uitl/ObjectInstance"; | |
3 | - | |
4 | -export default class AdManager { | |
5 | - private lastVideoTime: number; | |
6 | - | |
7 | - init() { | |
8 | - this.preloadRewardAd(); | |
9 | - } | |
10 | - | |
11 | - preloadBanner() { | |
12 | - TTAdSdk.I.loadBannerExpressAd(1); | |
13 | - } | |
14 | - | |
15 | - preloadRewardAd() { | |
16 | - TTAdSdk.I.showRewardVideoAd(1); | |
17 | - } | |
18 | - | |
19 | - preloadFullAd() { | |
20 | - TTAdSdk.I.loadFullScreenVideoAd(1); | |
21 | - } | |
22 | - | |
23 | - preloadInterAd() { | |
24 | - // TTAdSdk.I.showInteractionExpressAd(1); | |
25 | - } | |
26 | - | |
27 | - preloadNativeAd(){ | |
28 | - TTAdSdk.I.loadFullScreenVideoAd(1); | |
29 | - } | |
30 | - | |
31 | - closeAdverDialog() { | |
32 | - TTAdSdk.I.closeAdverDialog() | |
33 | - } | |
34 | - closeAdBanner() { | |
35 | - TTAdSdk.I.closeAdBanner() | |
36 | - } | |
37 | - | |
38 | - async showRewardAd() { | |
39 | - try { | |
40 | - let ret = await TTAdSdk.I.showRewardVideoAd(); | |
41 | - this.lastVideoTime = Laya.timer.currTimer; | |
42 | - this.preloadRewardAd(); | |
43 | - return Promise.resolve(ret); | |
44 | - } catch (e) { | |
45 | - this.preloadRewardAd(); | |
46 | - return Promise.reject(e); | |
47 | - } | |
48 | - } | |
49 | - | |
50 | - | |
51 | - async showFullAd() { | |
52 | - try { | |
53 | - let ret = await TTAdSdk.I.loadFullScreenVideoAd(); | |
54 | - this.preloadFullAd(); | |
55 | - return Promise.resolve(ret); | |
56 | - } catch (e) { | |
57 | - this.preloadFullAd(); | |
58 | - return Promise.reject(e); | |
59 | - } | |
60 | - } | |
61 | - | |
62 | - async showInterAd() { | |
63 | - try { | |
64 | - let ret = await TTAdSdk.I.showInteractionExpressAd(); | |
65 | - this.preloadInterAd(); | |
66 | - return Promise.resolve(ret); | |
67 | - } catch (e) { | |
68 | - this.preloadInterAd(); | |
69 | - return Promise.reject(e); | |
70 | - } | |
71 | - } | |
72 | - | |
73 | - | |
74 | - checkVideoInCd() { | |
75 | - return this.lastVideoTime && (Laya.timer.currTimer - this.lastVideoTime <= 30000); | |
76 | - } | |
77 | - | |
78 | - showBanner() { | |
79 | - TTAdSdk.I.loadBannerExpressAd(); | |
80 | - } | |
81 | - | |
82 | - | |
83 | - showNativeAd(x, y, w, h,preload=0) { | |
84 | - TTAdSdk.I.loadNativeExpressAd(x, y, w, h,preload); | |
85 | - } | |
86 | - | |
87 | - | |
88 | - | |
89 | - static get I(): AdManager { | |
90 | - return ObjectInstance.get(AdManager); | |
91 | - } | |
92 | -} | |
93 | - | |
1 | +import TTAdSdk from "./TTAdSdk"; | |
2 | +import ObjectInstance from "../uitl/ObjectInstance"; | |
3 | + | |
4 | +export default class AdManager { | |
5 | + private lastVideoTime: number; | |
6 | + | |
7 | + init() { | |
8 | + this.preloadRewardAd(); | |
9 | + } | |
10 | + | |
11 | + preloadBanner() { | |
12 | + TTAdSdk.I.loadBannerExpressAd(1); | |
13 | + } | |
14 | + | |
15 | + preloadRewardAd() { | |
16 | + TTAdSdk.I.showRewardVideoAd(1); | |
17 | + } | |
18 | + | |
19 | + preloadFullAd() { | |
20 | + TTAdSdk.I.loadFullScreenVideoAd(1); | |
21 | + } | |
22 | + | |
23 | + preloadInterAd() { | |
24 | + // TTAdSdk.I.showInteractionExpressAd(1); | |
25 | + } | |
26 | + | |
27 | + preloadNativeAd(){ | |
28 | + TTAdSdk.I.loadFullScreenVideoAd(1); | |
29 | + } | |
30 | + | |
31 | + closeAdverDialog() { | |
32 | + TTAdSdk.I.closeAdverDialog() | |
33 | + } | |
34 | + closeAdBanner() { | |
35 | + TTAdSdk.I.closeAdBanner() | |
36 | + } | |
37 | + | |
38 | + async showRewardAd() { | |
39 | + try { | |
40 | + let ret = await TTAdSdk.I.showRewardVideoAd(); | |
41 | + this.lastVideoTime = Laya.timer.currTimer; | |
42 | + this.preloadRewardAd(); | |
43 | + return Promise.resolve(ret); | |
44 | + } catch (e) { | |
45 | + this.preloadRewardAd(); | |
46 | + return Promise.reject(e); | |
47 | + } | |
48 | + } | |
49 | + | |
50 | + | |
51 | + async showFullAd() { | |
52 | + try { | |
53 | + let ret = await TTAdSdk.I.loadFullScreenVideoAd(); | |
54 | + this.preloadFullAd(); | |
55 | + return Promise.resolve(ret); | |
56 | + } catch (e) { | |
57 | + this.preloadFullAd(); | |
58 | + return Promise.reject(e); | |
59 | + } | |
60 | + } | |
61 | + | |
62 | + async showInterAd() { | |
63 | + try { | |
64 | + let ret = await TTAdSdk.I.showInteractionExpressAd(); | |
65 | + this.preloadInterAd(); | |
66 | + return Promise.resolve(ret); | |
67 | + } catch (e) { | |
68 | + this.preloadInterAd(); | |
69 | + return Promise.reject(e); | |
70 | + } | |
71 | + } | |
72 | + | |
73 | + | |
74 | + checkVideoInCd() { | |
75 | + return this.lastVideoTime && (Laya.timer.currTimer - this.lastVideoTime <= 30000); | |
76 | + } | |
77 | + | |
78 | + showBanner() { | |
79 | + TTAdSdk.I.loadBannerExpressAd(); | |
80 | + } | |
81 | + | |
82 | + | |
83 | + showNativeAd(x, y, w, h,preload=0) { | |
84 | + TTAdSdk.I.loadNativeExpressAd(x, y, w, h,preload); | |
85 | + } | |
86 | + | |
87 | + | |
88 | + | |
89 | + static get I(): AdManager { | |
90 | + return ObjectInstance.get(AdManager); | |
91 | + } | |
92 | +} | |
93 | +export enum ADPoint { | |
94 | + GAME = 'game', | |
95 | + RECORD = 'record', | |
96 | + BOOSTER = 'booster', | |
97 | + CHALLENGE = 'challenge', | |
98 | + CHALLENGE_REWARD = 'challenge_reward', | |
99 | + LEVEL_REWARD = 'level_reward', | |
100 | + LOGIN_REWARD = 'login_reward', | |
101 | + REDPACKET = 'redpacket', | |
102 | + PRIVILEGE = 'privilege', | |
103 | + RELIVE = 'relive', | |
104 | + CHALLENGE_RESET = 'challenge_reset', | |
105 | + BOOSTER_REWARD = 'booster_reward', | |
106 | + SUPER_REWARD = 'super_reward', | |
107 | + TIPS = 'tips', | |
108 | + RESULT = 'result', | |
109 | + REDPACKET_REWARD = 'redPacket_reward', | |
110 | +} | ... | ... |
... | ... | @@ -0,0 +1,248 @@ |
1 | +import { EventEnum } from "../event/EventEnum"; | |
2 | +import { EventCenter } from "../event/EventCenter"; | |
3 | +import ObjectInstance from "../uitl/ObjectInstance"; | |
4 | + | |
5 | +export default class AppSdk { | |
6 | + private _width: number; | |
7 | + private _height: number; | |
8 | + private _channel: string; | |
9 | + private _version: string; | |
10 | + private _level: number; | |
11 | + private _gameConfig: number; | |
12 | + | |
13 | + public pangolinId: string; | |
14 | + public adnetId: string; | |
15 | + | |
16 | + init() { | |
17 | + this.getSystemInfo(); | |
18 | + } | |
19 | + | |
20 | + private get myBridge() { | |
21 | + if (MyBridge) { | |
22 | + return MyBridge; | |
23 | + } | |
24 | + } | |
25 | + | |
26 | + | |
27 | + | |
28 | + /**获取基本版本信息以及手机的配置 */ | |
29 | + private getSystemInfo(key: number = 0) { | |
30 | + let ret = this.myBridge.getSystemInfo(key); | |
31 | + let { w, h, versionName, channel, pangolin, adnet, level } = JSON.parse(ret); | |
32 | + [this._width, this._height, this._version, | |
33 | + this._channel, this.pangolinId, | |
34 | + this.adnetId, this._level] = [w, h, versionName, channel, pangolin, adnet, level]; | |
35 | + } | |
36 | + | |
37 | + initGameConfig() { | |
38 | + this._gameConfig = this.getGameConfig(); | |
39 | + } | |
40 | + | |
41 | + /** | |
42 | + * 震动 | |
43 | + * @param key 0 短震动 1 长震动 | |
44 | + */ | |
45 | + vibrate(key: number = 1) { | |
46 | + this.myBridge.openSystemFun(key); | |
47 | + } | |
48 | + | |
49 | + /**隐藏启动屏 */ | |
50 | + hideSplash() { | |
51 | + this.myBridge.hideSplash(); | |
52 | + } | |
53 | + | |
54 | + /**弹出提现 */ | |
55 | + withDrawal() { | |
56 | + this.myBridge.withDrawal(); | |
57 | + } | |
58 | + /**意见反馈 */ | |
59 | + feedback() { | |
60 | + this.myBridge.feedback(); | |
61 | + } | |
62 | + /** | |
63 | + * key 默认0 ,签到 1 | |
64 | + */ | |
65 | + personal() { | |
66 | + this.myBridge.personal(); | |
67 | + } | |
68 | + /**邀请好友*/ | |
69 | + invitation() { | |
70 | + this.myBridge.invitation(); | |
71 | + } | |
72 | + | |
73 | + | |
74 | + /**邀请好友*/ | |
75 | + openReward() { | |
76 | + this.myBridge.openReward(); | |
77 | + } | |
78 | + /**签到*/ | |
79 | + openSignin() { | |
80 | + this.myBridge.openSingin(); | |
81 | + } | |
82 | + | |
83 | + | |
84 | + putData(key: String, value: String) { | |
85 | + | |
86 | + this.myBridge.putData(key, value); | |
87 | + } | |
88 | + /** | |
89 | + * @param key 存数据的时候的唯一key | |
90 | + * @return 存储的数据 | |
91 | + * */ | |
92 | + getData(key: String) { | |
93 | + let ret = this.myBridge.getData(key); | |
94 | + return JSON.parse(ret); | |
95 | + } | |
96 | + | |
97 | + /** | |
98 | + * 获取金币配表 | |
99 | + * @param key 1红包 2 摇一摇红包 | |
100 | + */ | |
101 | + getGameConfig() { | |
102 | + let result = this.myBridge.getGameConfig(); | |
103 | + return JSON.parse(result); | |
104 | + } | |
105 | + /** | |
106 | + * 要求发放金币 | |
107 | + * @param key 1红包 | |
108 | + */ | |
109 | + async addGold(key=1) { | |
110 | + return new Promise<any>(async (resolve, reject) => { | |
111 | + await this.myBridge.addGold(key, res => { | |
112 | + res = JSON.parse(res) | |
113 | + const { code, data, msg } = res; | |
114 | + if ('0' === code || !code) { | |
115 | + resolve(data) | |
116 | + } else { | |
117 | + reject(msg); | |
118 | + } | |
119 | + }); | |
120 | + }) | |
121 | + } | |
122 | + /**获取总金币 */ | |
123 | + async myCoin() { | |
124 | + return new Promise<any>(async (resolve, reject) => { | |
125 | + await this.myBridge.myCoin(res => { | |
126 | + res = JSON.parse(res) | |
127 | + const { code, data, msg } = res; | |
128 | + if ('0' === code || !code) { | |
129 | + resolve(data['coin']) | |
130 | + } else { | |
131 | + reject(msg); | |
132 | + } | |
133 | + }); | |
134 | + }) | |
135 | + } | |
136 | + | |
137 | + | |
138 | + /**获取当前提现的档位 */ | |
139 | + async minWithDrawal() { | |
140 | + return new Promise<any>(async (resolve, reject) => { | |
141 | + await this.myBridge.minWithDrawal(res => { | |
142 | + res = JSON.parse(res) | |
143 | + const { code, data, msg } = res; | |
144 | + if ('0' === code || !code) { | |
145 | + resolve(data['money']) | |
146 | + } else { | |
147 | + reject(msg); | |
148 | + } | |
149 | + }); | |
150 | + }) | |
151 | + } | |
152 | + | |
153 | + /**上报埋点 */ | |
154 | + appDotLog(key: string, value?) { | |
155 | + this.myBridge.appDotLog(key, value); | |
156 | + } | |
157 | + /**热云打点 */ | |
158 | + appDotTracKing(key: string) { | |
159 | + this.myBridge.appDotTracKing(key); | |
160 | + } | |
161 | + | |
162 | + setCallback(funName: string, pramas?: any) { | |
163 | + console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge)) | |
164 | + return new Promise((resolve, reject) => { | |
165 | + this.myBridge[funName](pramas, res => { | |
166 | + let { code, data } = JSON.parse(res); | |
167 | + if ('0' === code) { | |
168 | + resolve(data); | |
169 | + } else { | |
170 | + reject(0); | |
171 | + } | |
172 | + }) | |
173 | + }) | |
174 | + } | |
175 | + | |
176 | + closeAdverDialog() { | |
177 | + this.myBridge.closeAdverDialog(); | |
178 | + } | |
179 | + closeAdBanner() { | |
180 | + this.myBridge.closeAdBanner(); | |
181 | + } | |
182 | + /**激励视频 */ | |
183 | + showRewardVideoAd(value: IVideo, JBCallback: Function) { | |
184 | + this.myBridge.showRewardVideoAd(value, JBCallback) | |
185 | + } | |
186 | + /** 全屏广告*/ | |
187 | + loadFullScreenVideoAd(data: any, JBCallback: Function) { | |
188 | + this.myBridge.showRewardVideoAd(data, JBCallback) | |
189 | + } | |
190 | + /**信息流广告 */ | |
191 | + loadNativeExpressAd(data: any, JBCallback: Function) { | |
192 | + this.myBridge.loadNativeExpressAd(data, JBCallback) | |
193 | + } | |
194 | + /**banner */ | |
195 | + loadBannerExpressAd(data: any, JBCallback: Function) { | |
196 | + this.myBridge.loadBannerExpressAd(data, JBCallback) | |
197 | + } | |
198 | + /**插屏广告 */ | |
199 | + showInteractionExpressAd(data: any, JBCallback: Function) { | |
200 | + this.myBridge.showInteractionExpressAd(data, JBCallback) | |
201 | + } | |
202 | + | |
203 | + get level() { | |
204 | + return this._level; | |
205 | + } | |
206 | + get width() { | |
207 | + return this._width; | |
208 | + } | |
209 | + | |
210 | + get height() { | |
211 | + return this._height; | |
212 | + } | |
213 | + | |
214 | + get version() { | |
215 | + return this._version; | |
216 | + } | |
217 | + | |
218 | + get channel() { | |
219 | + return this._channel; | |
220 | + } | |
221 | + | |
222 | + protected get bridge() { | |
223 | + return null; | |
224 | + } | |
225 | + | |
226 | + get gameConfig() { | |
227 | + return this._gameConfig; | |
228 | + } | |
229 | + static get I(): AppSdk { | |
230 | + return ObjectInstance.get(AppSdk); | |
231 | + } | |
232 | +} | |
233 | +// //这里是浏览器环境下, 接收web传过来的消息 | |
234 | +window.onMyBridgeReady = () => { | |
235 | + console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms"); | |
236 | + MyBridge.App.onResume = (...ret) => { | |
237 | + console.log(' laya onResume', ret) | |
238 | + | |
239 | + } | |
240 | + MyBridge.App.onPause = (...ret) => { | |
241 | + console.log(' laya onPause', ret) | |
242 | + } | |
243 | +} | |
244 | + | |
245 | +interface IVideo { | |
246 | + preloading: number, | |
247 | + type: number, | |
248 | +} | |
0 | 249 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,111 @@ |
1 | +import AppSdk from "./AppSdk"; | |
2 | +import DateUtils from "../uitl/DateUtils"; | |
3 | +import ObjectInstance from "../uitl/ObjectInstance"; | |
4 | + | |
5 | +/**转盘 获取转盘机会的 */ | |
6 | +export default class LuckDrawModel { | |
7 | + private _data: LuckDrawData; | |
8 | + | |
9 | + private propRemove: number = 0; | |
10 | + private propChange: number = 0; | |
11 | + async init() { | |
12 | + this._data = await this.initData(); | |
13 | + AppSdk.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: 0 })) | |
14 | + AppSdk.I.putData('LuckDrawToSign', JSON.stringify({ istoSignin: 0 })) | |
15 | + } | |
16 | + | |
17 | + async initData() { | |
18 | + let data = new LuckDrawData; | |
19 | + let lastTime = Laya.LocalStorage.getItem('LuckDrawLastTime') || '0'; | |
20 | + data.luckDrawLastTime = parseInt(lastTime); | |
21 | + let last = DateUtils.timeDay(data.luckDrawLastTime); | |
22 | + let today = DateUtils.today; | |
23 | + if (last != today) { | |
24 | + lastTime = DateUtils.nowTime.toString(); | |
25 | + Laya.LocalStorage.setItem('LuckDrawLastTime', lastTime); | |
26 | + data.luckDrawLastTime = parseInt(lastTime); | |
27 | + /**初始化数据 | |
28 | + * 1 签到 | |
29 | + * 2 视频 | |
30 | + * 3 摇一摇 | |
31 | + * 4 红包 | |
32 | + */ | |
33 | + data.list = []; | |
34 | + let list = []; | |
35 | + for (let index = 0; index < 4; index++) { | |
36 | + let item = new LuckDrawVo; | |
37 | + item.type = index + 1; | |
38 | + item.num = 0; | |
39 | + item.isUse = 0; | |
40 | + item.useNum = 0; | |
41 | + list.push(item); | |
42 | + } | |
43 | + data.list = list; | |
44 | + | |
45 | + } else { | |
46 | + let luckDrawData: any = await AppSdk.I.getData('LuckDrawData'); | |
47 | + data.list = luckDrawData.data.list; | |
48 | + } | |
49 | + // UtilTool.log('------LuckDrawData--update init -data----' + JSON.stringify(data)) | |
50 | + AppSdk.I.putData('LuckDrawData', JSON.stringify(data)) | |
51 | + this._data = data; | |
52 | + return data; | |
53 | + } | |
54 | + get data(): LuckDrawData { | |
55 | + return this._data; | |
56 | + } | |
57 | + | |
58 | + updateData(index: number, addNum: number = 1) { | |
59 | + this.data.list[index].num += addNum; | |
60 | + AppSdk.I.putData('LuckDrawData', JSON.stringify(this.data)) | |
61 | + } | |
62 | + | |
63 | + async getPropData() { | |
64 | + // AppSdk.I.putData('luckDrawProp', JSON.stringify({remove:3,change:2})) | |
65 | + let luckDrawProp: any = await AppSdk.I.getData('luckDrawProp'); | |
66 | + // let luckDrawProp = { code: 0, data: { remove: 3, change: 2 } } | |
67 | + this.propRemove = Number(luckDrawProp.data.remove); | |
68 | + this.propChange = Number(luckDrawProp.data.change); | |
69 | + | |
70 | + if (this.propRemove > 0) { | |
71 | + this.updateRemoveProp(); | |
72 | + } else { | |
73 | + this.updateChangeProp(); | |
74 | + } | |
75 | + return luckDrawProp; | |
76 | + } | |
77 | + | |
78 | + async updateRemoveProp() { | |
79 | + if (this.propRemove > 0) { | |
80 | + // ViewManager.I.openPopwin(ReceivePropsPopwin, BoosterType.Remove, this.propRemove, true); | |
81 | + // ViewManager.I.openPopwin(GetpropPopwin,PropType.hammer,1) | |
82 | + this.propRemove = 0; | |
83 | + AppSdk.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: this.propChange })); | |
84 | + } | |
85 | + } | |
86 | + | |
87 | + updateChangeProp() { | |
88 | + if (this.propChange > 0) { | |
89 | + // ViewManager.I.openPopwin(ReceivePropsPopwin, BoosterType.Change, this.propChange); | |
90 | + // ViewManager.I.openPopwin(GetpropPopwin,PropType.refresh,1) | |
91 | + this.propChange = 0; | |
92 | + AppSdk.I.putData('luckDrawProp', JSON.stringify({ remove: this.propRemove, change: 0 })); | |
93 | + } | |
94 | + } | |
95 | + | |
96 | + static get I(): LuckDrawModel { | |
97 | + return ObjectInstance.get(LuckDrawModel) as LuckDrawModel; | |
98 | + } | |
99 | +} | |
100 | + | |
101 | +class LuckDrawData { | |
102 | + list: LuckDrawVo[]; | |
103 | + luckDrawLastTime: number; | |
104 | +} | |
105 | + | |
106 | +class LuckDrawVo { | |
107 | + type: number; | |
108 | + num: number; | |
109 | + isUse: number; | |
110 | + useNum: number; | |
111 | +} | |
0 | 112 | \ No newline at end of file | ... | ... |
puchi_laya/src/sdk/NativeAd.ts
1 | -import AdManager from "./AdManager"; | |
1 | +import AdManager, { ADPoint } from "../sdk/AdManager"; | |
2 | 2 | |
3 | 3 | export default class NativeAd extends Laya.Script { |
4 | + /** @prop {name:point, tips:"广告点", type:String}*/ | |
5 | + public point: ADPoint; | |
6 | + | |
7 | + constructor() { super(); } | |
4 | 8 | |
5 | - public initNativeAd(preload=0){ | |
6 | - let globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true); | |
7 | - AdManager.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height,preload); | |
8 | - } | |
9 | 9 | onEnable(): void { |
10 | - this.initNativeAd(); | |
10 | + let globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true); | |
11 | + AdManager.I.showNativeAd(this.point, globalPoint.x, globalPoint.y, this.item.width, this.item.height); | |
11 | 12 | } |
12 | 13 | |
13 | 14 | onDisable(): void { | ... | ... |
puchi_laya/src/sdk/PcSdk.ts
... | ... | @@ -1,235 +0,0 @@ |
1 | -import ObjectInstance from "../uitl/ObjectInstance"; | |
2 | - | |
3 | -export default class PcSdk { | |
4 | - private _width: number; | |
5 | - private _height: number; | |
6 | - private _channel: string; | |
7 | - private _version: string; | |
8 | - private _level: number; | |
9 | - private _gameConfig: number; | |
10 | - | |
11 | - public pangolinId: string; | |
12 | - public adnetId: string; | |
13 | - | |
14 | - init() { | |
15 | - this.getSystemInfo(); | |
16 | - } | |
17 | - | |
18 | - private get myBridge() { | |
19 | - if (MyBridge) { | |
20 | - return MyBridge; | |
21 | - } | |
22 | - } | |
23 | - | |
24 | - | |
25 | - | |
26 | - /**获取基本版本信息以及手机的配置 */ | |
27 | - private getSystemInfo(key: number = 0) { | |
28 | - let ret = this.myBridge.getSystemInfo(key); | |
29 | - let { w, h, versionName, channel, pangolin, adnet, level } = JSON.parse(ret); | |
30 | - [this._width, this._height, this._version, | |
31 | - this._channel, this.pangolinId, | |
32 | - this.adnetId, this._level] = [w, h, versionName, channel, pangolin, adnet, level]; | |
33 | - } | |
34 | - | |
35 | - initGameConfig() { | |
36 | - this._gameConfig = this.getGameConfig(); | |
37 | - } | |
38 | - | |
39 | - /** | |
40 | - * 震动 | |
41 | - * @param key 0 短震动 1 长震动 | |
42 | - */ | |
43 | - vibrate(key: number = 0) { | |
44 | - this.myBridge.openSystemFun(key); | |
45 | - } | |
46 | - | |
47 | - /**隐藏启动屏 */ | |
48 | - hideSplash() { | |
49 | - this.myBridge.hideSplash(); | |
50 | - } | |
51 | - | |
52 | - /**弹出提现 */ | |
53 | - withDrawal() { | |
54 | - this.myBridge.withDrawal(); | |
55 | - } | |
56 | - /**意见反馈 */ | |
57 | - feedback() { | |
58 | - this.myBridge.feedback(); | |
59 | - } | |
60 | - /** | |
61 | - * key 默认0 ,签到 1 | |
62 | - */ | |
63 | - personal(key = 0) { | |
64 | - this.myBridge.personal(key); | |
65 | - } | |
66 | - /**邀请好友*/ | |
67 | - invitation() { | |
68 | - this.myBridge.invitation(); | |
69 | - } | |
70 | - | |
71 | - | |
72 | - /**邀请好友*/ | |
73 | - openReward() { | |
74 | - this.myBridge.openReward(); | |
75 | - } | |
76 | - /**签到*/ | |
77 | - openSignin() { | |
78 | - this.myBridge.openSingin(); | |
79 | - } | |
80 | - | |
81 | - | |
82 | - /** | |
83 | - * 获取金币配表 | |
84 | - * @param key 1红包 2 摇一摇红包 | |
85 | - */ | |
86 | - getGameConfig() { | |
87 | - let result = this.myBridge.getGameConfig(); | |
88 | - // console.log('---------------getGameConfig-------' + JSON.stringify(result)) | |
89 | - return JSON.parse(result); | |
90 | - } | |
91 | - /** | |
92 | - * 要求发放金币 | |
93 | - * @param key 1红包 | |
94 | - */ | |
95 | - async addGold(key) { | |
96 | - return new Promise<any>(async (resolve, reject) => { | |
97 | - await this.myBridge.addGold(key, res => { | |
98 | - res = JSON.parse(res) | |
99 | - const { code, data, msg } = res; | |
100 | - if ('0' === code || !code) { | |
101 | - resolve(data) | |
102 | - } else { | |
103 | - reject(msg); | |
104 | - } | |
105 | - }); | |
106 | - }) | |
107 | - } | |
108 | - /**获取总金币 */ | |
109 | - async myCoin() { | |
110 | - return new Promise<any>(async (resolve, reject) => { | |
111 | - await this.myBridge.myCoin(res => { | |
112 | - res = JSON.parse(res) | |
113 | - const { code, data, msg } = res; | |
114 | - if ('0' === code || !code) { | |
115 | - resolve(data['coin']) | |
116 | - } else { | |
117 | - reject(msg); | |
118 | - } | |
119 | - }); | |
120 | - }) | |
121 | - } | |
122 | - | |
123 | - | |
124 | - /**获取当前提现的档位 */ | |
125 | - async minWithDrawal() { | |
126 | - return new Promise<any>(async (resolve, reject) => { | |
127 | - await this.myBridge.minWithDrawal(res => { | |
128 | - res = JSON.parse(res) | |
129 | - const { code, data, msg } = res; | |
130 | - if ('0' === code || !code) { | |
131 | - resolve(data['money']) | |
132 | - } else { | |
133 | - reject(msg); | |
134 | - } | |
135 | - }); | |
136 | - }) | |
137 | - } | |
138 | - | |
139 | - /**上报埋点 */ | |
140 | - appDotLog(key: string, value?) { | |
141 | - this.myBridge.appDotLog(key, value); | |
142 | - } | |
143 | - /**热云打点 */ | |
144 | - appDotTracKing(key: string) { | |
145 | - this.myBridge.appDotTracKing(key); | |
146 | - } | |
147 | - | |
148 | - setCallback(funName: string, pramas?: any) { | |
149 | - console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge)) | |
150 | - return new Promise((resolve, reject) => { | |
151 | - this.myBridge[funName](pramas, res => { | |
152 | - let { code, data } = JSON.parse(res); | |
153 | - if ('0' === code) { | |
154 | - resolve(data); | |
155 | - } else { | |
156 | - reject(0); | |
157 | - } | |
158 | - }) | |
159 | - }) | |
160 | - } | |
161 | - | |
162 | - closeAdverDialog() { | |
163 | - this.myBridge.closeAdverDialog(); | |
164 | - } | |
165 | - closeAdBanner() { | |
166 | - this.myBridge.closeAdBanner(); | |
167 | - } | |
168 | - /**激励视频 */ | |
169 | - showRewardVideoAd(value: IVideo, JBCallback: Function) { | |
170 | - this.myBridge.showRewardVideoAd(value, JBCallback) | |
171 | - } | |
172 | - /** 全屏广告*/ | |
173 | - loadFullScreenVideoAd(data: any, JBCallback: Function) { | |
174 | - this.myBridge.showRewardVideoAd(data, JBCallback) | |
175 | - } | |
176 | - /**信息流广告 */ | |
177 | - loadNativeExpressAd(data: any, JBCallback: Function) { | |
178 | - this.myBridge.loadNativeExpressAd(data, JBCallback) | |
179 | - } | |
180 | - /**banner */ | |
181 | - loadBannerExpressAd(data: any, JBCallback: Function) { | |
182 | - this.myBridge.loadBannerExpressAd(data, JBCallback) | |
183 | - } | |
184 | - /**插屏广告 */ | |
185 | - showInteractionExpressAd(data: any, JBCallback: Function) { | |
186 | - this.myBridge.showInteractionExpressAd(data, JBCallback) | |
187 | - } | |
188 | - | |
189 | - get level() { | |
190 | - return this._level; | |
191 | - } | |
192 | - get width() { | |
193 | - return this._width; | |
194 | - } | |
195 | - | |
196 | - get height() { | |
197 | - return this._height; | |
198 | - } | |
199 | - | |
200 | - get version() { | |
201 | - return this._version; | |
202 | - } | |
203 | - | |
204 | - get channel() { | |
205 | - return this._channel; | |
206 | - } | |
207 | - | |
208 | - protected get bridge() { | |
209 | - return null; | |
210 | - } | |
211 | - | |
212 | - get gameConfig() { | |
213 | - return this._gameConfig; | |
214 | - } | |
215 | - static get I(): PcSdk { | |
216 | - return ObjectInstance.get(PcSdk); | |
217 | - } | |
218 | -} | |
219 | -// //这里是浏览器环境下, 接收web传过来的消息 | |
220 | -window.onMyBridgeReady = () => { | |
221 | - console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms"); | |
222 | - MyBridge.App.onResume = (...ret) => { | |
223 | - console.log(' laya onResume', ret) | |
224 | - // EventCenter.emit(EventEnum.APP_SHOW); | |
225 | - } | |
226 | - MyBridge.App.onPause = (...ret) => { | |
227 | - console.log(' laya onPause', ret) | |
228 | - // EventCenter.emit(EventEnum.APP_HIDE); | |
229 | - } | |
230 | -} | |
231 | - | |
232 | -interface IVideo { | |
233 | - preloading: number, | |
234 | - type: number, | |
235 | -} | |
236 | 0 | \ No newline at end of file |
... | ... | @@ -0,0 +1,22 @@ |
1 | +export default class SDKConst { | |
2 | + static CHANNEL: string = '1010'; | |
3 | + static VERSION: string = '1.0'; | |
4 | + static GAME_NAME: string = 'pstar'; | |
5 | + // static DEFAULT_BANNER: string = 'adunit-01a3e1d3472491f4'; | |
6 | + // static InterstitialAd: string = 'adunit-73a39af8d3a2f82b'; | |
7 | + static CACHE_KEY = 'pstar_app_500_cache'; | |
8 | + | |
9 | + static LEVEL_REWARD_PROB = [0.2, 0.2, 0.2, 0.2, 0.2]; | |
10 | + static CHALLENGE: boolean = true; | |
11 | + static CHALLENGE_TIME: number = 60; | |
12 | + static CHALLENGE_STAR_PROB: number = 0.03; | |
13 | + static PACKET: boolean = false; | |
14 | + static INTER_AD_CD: number = 30; | |
15 | + static INTER_AD_CD2: number = 20; | |
16 | + static CLOSE_REDPACKET_NUM:number = 3; | |
17 | + static INTER_AD_ID: string = ''; | |
18 | + static REWARD_AD_ID: string = '942652664'; | |
19 | + static NATIVE_AD_ID: string = '942652780'; | |
20 | + static BANNER_AD_ID: string = '942652648'; | |
21 | + static FULL_AD_ID: string = '942652655'; | |
22 | +} | |
0 | 23 | \ No newline at end of file | ... | ... |
puchi_laya/src/sdk/TTAdSdk.ts
1 | -import ObjectInstance from "../uitl/ObjectInstance"; | |
2 | -import PcSdk from "./PcSdk"; | |
3 | - | |
4 | -export default class TTAdSdk { | |
5 | - /** | |
6 | - * | |
7 | - * @param preload 0 直接加载;1 预加载 | |
8 | - */ | |
9 | - async showRewardVideoAd(preload: number = 0) { | |
10 | - let data = { | |
11 | - type: 1, | |
12 | - preloading: preload, | |
13 | - } | |
14 | - return new Promise((resolve, reject) => { | |
15 | - let isComplete = false; | |
16 | - PcSdk.I.showRewardVideoAd(data, ret => { | |
17 | - let { code, message } = JSON.parse(ret); | |
18 | - switch (code) { | |
19 | - case -1: | |
20 | - reject('error'); | |
21 | - /**'暂无视频广告!每日0点重置'*/; | |
22 | - break; | |
23 | - case 102: | |
24 | - isComplete = true; | |
25 | - break; | |
26 | - case 101: | |
27 | - if (isComplete) { | |
28 | - resolve(); | |
29 | - } else { | |
30 | - reject('unComplete'); | |
31 | - } | |
32 | - break; | |
33 | - } | |
34 | - }) | |
35 | - }) | |
36 | - } | |
37 | - | |
38 | - async loadFullScreenVideoAd(preload: number = 0) { | |
39 | - let data = { | |
40 | - w: PcSdk.I.width, | |
41 | - h: PcSdk.I.width * 90 / 600, | |
42 | - preloading: preload, | |
43 | - type: 1 | |
44 | - } | |
45 | - return new Promise((resolve, reject) => { | |
46 | - PcSdk.I.loadFullScreenVideoAd(JSON.stringify(data),res=>{ | |
47 | - resolve(res) | |
48 | - }) | |
49 | - }) | |
50 | - } | |
51 | - | |
52 | - async loadNativeExpressAd(x, y, width, height, type = 1, preload: number = 0) { | |
53 | - let scaleX = PcSdk.I.width / Laya.stage.width; | |
54 | - let scaleY = PcSdk.I.height / Laya.stage.height; | |
55 | - let data = { | |
56 | - type: type, | |
57 | - preloading: preload, | |
58 | - w: width * scaleX, | |
59 | - h: height * scaleY, | |
60 | - left: x * scaleX, | |
61 | - top: y * scaleY | |
62 | - } | |
63 | - PcSdk.I.loadNativeExpressAd(JSON.stringify(data),res=>{ | |
64 | - return Promise.resolve(res) | |
65 | - }) | |
66 | - } | |
67 | - | |
68 | - async loadBannerExpressAd(preload: number = 0) { | |
69 | - let data = { | |
70 | - w: PcSdk.I.width, | |
71 | - h: PcSdk.I.width * 90 / 600, | |
72 | - preloading: preload, | |
73 | - type: 1 | |
74 | - } | |
75 | - return new Promise((resolve, reject) => { | |
76 | - PcSdk.I.loadBannerExpressAd(JSON.stringify(data),res=>{ | |
77 | - resolve(res) | |
78 | - }) | |
79 | - }) | |
80 | - } | |
81 | - | |
82 | - closeAdverDialog() { | |
83 | - PcSdk.I.closeAdverDialog(); | |
84 | - } | |
85 | - closeAdBanner() { | |
86 | - PcSdk.I.closeAdBanner(); | |
87 | - } | |
88 | - | |
89 | - async showInteractionExpressAd(preload: number = 0) { | |
90 | - let data = { | |
91 | - w: PcSdk.I.width * 0.8, | |
92 | - h: PcSdk.I.height, | |
93 | - preloading: preload, | |
94 | - } | |
95 | - return new Promise((resolve, reject) => { | |
96 | - let isComplete = false; | |
97 | - PcSdk.I.showInteractionExpressAd(JSON.stringify(data),res=>{ | |
98 | - resolve(res) | |
99 | - }) | |
100 | - }) | |
101 | - } | |
102 | - | |
103 | - static get I(): TTAdSdk { | |
104 | - return ObjectInstance.get(TTAdSdk) as TTAdSdk; | |
105 | - } | |
1 | +import AppSdk from "./AppSdk"; | |
2 | +import ObjectInstance from "../uitl/ObjectInstance"; | |
3 | + | |
4 | +export default class TTAdSdk { | |
5 | + /** | |
6 | + * | |
7 | + * @param preload 0 直接加载;1 预加载 | |
8 | + */ | |
9 | + async showRewardVideoAd(preload: number = 0) { | |
10 | + let data = { | |
11 | + type: 1, | |
12 | + preloading: preload, | |
13 | + } | |
14 | + return new Promise((resolve, reject) => { | |
15 | + let isComplete = false; | |
16 | + AppSdk.I.showRewardVideoAd(data, ret => { | |
17 | + let { code, message } = JSON.parse(ret); | |
18 | + switch (code) { | |
19 | + case -1: | |
20 | + reject('error'); | |
21 | + /**'暂无视频广告!每日0点重置'*/; | |
22 | + break; | |
23 | + case 102: | |
24 | + isComplete = true; | |
25 | + break; | |
26 | + case 101: | |
27 | + if (isComplete) { | |
28 | + resolve(); | |
29 | + } else { | |
30 | + reject('unComplete'); | |
31 | + } | |
32 | + break; | |
33 | + } | |
34 | + }) | |
35 | + }) | |
36 | + } | |
37 | + | |
38 | + async loadFullScreenVideoAd(preload: number = 0) { | |
39 | + let data = { | |
40 | + w: AppSdk.I.width, | |
41 | + h: AppSdk.I.width * 90 / 600, | |
42 | + preloading: preload, | |
43 | + type: 1 | |
44 | + } | |
45 | + return new Promise((resolve, reject) => { | |
46 | + AppSdk.I.loadFullScreenVideoAd(JSON.stringify(data),res=>{ | |
47 | + resolve(res) | |
48 | + }) | |
49 | + }) | |
50 | + } | |
51 | + | |
52 | + async loadNativeExpressAd(x, y, width, height, type = 1, preload: number = 0) { | |
53 | + let scaleX = AppSdk.I.width / Laya.stage.width; | |
54 | + let scaleY = AppSdk.I.height / Laya.stage.height; | |
55 | + let data = { | |
56 | + type: type, | |
57 | + preloading: preload, | |
58 | + w: width * scaleX, | |
59 | + h: height * scaleY, | |
60 | + left: x * scaleX, | |
61 | + top: y * scaleY | |
62 | + } | |
63 | + AppSdk.I.loadNativeExpressAd(JSON.stringify(data),res=>{ | |
64 | + return Promise.resolve(res) | |
65 | + }) | |
66 | + } | |
67 | + | |
68 | + async loadBannerExpressAd(preload: number = 0) { | |
69 | + let data = { | |
70 | + w: AppSdk.I.width, | |
71 | + h: AppSdk.I.width * 90 / 600, | |
72 | + preloading: preload, | |
73 | + type: 1 | |
74 | + } | |
75 | + return new Promise((resolve, reject) => { | |
76 | + AppSdk.I.loadBannerExpressAd(JSON.stringify(data),res=>{ | |
77 | + resolve(res) | |
78 | + }) | |
79 | + }) | |
80 | + } | |
81 | + | |
82 | + closeAdverDialog() { | |
83 | + AppSdk.I.closeAdverDialog(); | |
84 | + } | |
85 | + closeAdBanner() { | |
86 | + AppSdk.I.closeAdBanner(); | |
87 | + } | |
88 | + | |
89 | + async showInteractionExpressAd(preload: number = 0) { | |
90 | + let data = { | |
91 | + w: AppSdk.I.width * 0.8, | |
92 | + h: AppSdk.I.height, | |
93 | + preloading: preload, | |
94 | + } | |
95 | + return new Promise((resolve, reject) => { | |
96 | + let isComplete = false; | |
97 | + AppSdk.I.showInteractionExpressAd(JSON.stringify(data),res=>{ | |
98 | + resolve(res) | |
99 | + }) | |
100 | + }) | |
101 | + } | |
102 | + | |
103 | + static get I(): TTAdSdk { | |
104 | + return ObjectInstance.get(TTAdSdk) as TTAdSdk; | |
105 | + } | |
106 | 106 | } |
107 | 107 | \ No newline at end of file | ... | ... |
puchi_laya/src/sdk/TeaSdk.ts
1 | -import ObjectInstance from "../uitl/ObjectInstance"; | |
2 | -import PcSdk from "./PcSdk"; | |
3 | -/** | |
4 | - * 上报埋点⽇志 | |
5 | - * 具体的打点需要跟运营联系 | |
6 | - */ | |
7 | -export default class TeaSdk { | |
8 | - dot(key: string, value?) { | |
9 | - if (!value) { | |
10 | - value = ''; | |
11 | - } else if (typeof (value) == 'object') { | |
12 | - value = JSON.stringify(value); | |
13 | - } | |
14 | - PcSdk.I.appDotLog(key, value); | |
15 | - } | |
16 | - | |
17 | - static get I(): TeaSdk { | |
18 | - return ObjectInstance.get(TeaSdk) as TeaSdk; | |
19 | - } | |
20 | -} | |
21 | - | |
22 | -export enum DotKey { | |
23 | - NativeAd = 'native_ad', | |
24 | -} | |
1 | +import AppSdk from "./AppSdk"; | |
2 | +import ObjectInstance from "../uitl/ObjectInstance"; | |
3 | +/** | |
4 | + * 数据打点 | |
5 | + */ | |
6 | +export default class TeaSdk { | |
7 | + dot(key: string, value?) { | |
8 | + if (!value) { | |
9 | + value = ''; | |
10 | + } else if (typeof (value) == 'object') { | |
11 | + value = JSON.stringify(value); | |
12 | + } | |
13 | + AppSdk.I.appDotLog(key, value); | |
14 | + } | |
15 | + | |
16 | + static get I(): TeaSdk { | |
17 | + return ObjectInstance.get(TeaSdk) as TeaSdk; | |
18 | + } | |
19 | +} | |
20 | + | |
21 | +export enum DotKey { | |
22 | + NativeAd = 'native_ad', | |
23 | + RewardAd = 'reward_ad', //用户看激励视频,在成功回调后打点,参数from:看视频的点 | |
24 | + REDPACKET = 'redpacket',// 用户得到红包,内容参考消星星打点 | |
25 | + GameStart = 'gt_start_play', // 游戏开始一局 | |
26 | + GameEnd = 'gt_end_play', // 游戏结束 | |
27 | + GameRelive = 'gt_revive', // 复活 | |
28 | +} | ... | ... |
puchi_laya/src/sdk/TrackingSdk.ts
1 | -import ObjectInstance from "../uitl/ObjectInstance"; | |
2 | -import PcSdk from "./PcSdk"; | |
3 | -/** | |
4 | - * 上报热云埋点⽇志 | |
5 | - * 具体的打点需要跟运营联系 | |
6 | - */ | |
7 | -export default class TrackingSdk { | |
8 | - dot(key: string) { | |
9 | - PcSdk.I.appDotTracKing(key); | |
10 | - } | |
11 | - | |
12 | - static get I(): TrackingSdk { | |
13 | - return ObjectInstance.get(TrackingSdk) as TrackingSdk; | |
14 | - } | |
15 | -} | |
16 | - | |
17 | -export enum TrackingKey { | |
18 | - RedPack1 = 'event_5', | |
19 | - RedPack5 = 'event_6' | |
20 | -} | |
1 | +import AppSdk from "./AppSdk"; | |
2 | +import ObjectInstance from "../uitl/ObjectInstance"; | |
3 | + | |
4 | +export default class TrackingSdk { | |
5 | + dot(key: string) { | |
6 | + AppSdk.I.appDotTracKing(key); | |
7 | + } | |
8 | + | |
9 | + static get I(): TrackingSdk { | |
10 | + return ObjectInstance.get(TrackingSdk) as TrackingSdk; | |
11 | + } | |
12 | +} | |
13 | + | |
14 | +export enum TrackingKey { | |
15 | + RedPack1 = 'event_5', | |
16 | + RedPack5 = 'event_6' | |
17 | +} | ... | ... |
... | ... | @@ -0,0 +1,13 @@ |
1 | +export class UtilTool { | |
2 | + static isPrint: boolean = false; | |
3 | + static log(...pram) { | |
4 | + if (!this.isPrint) return; | |
5 | + console.log(...pram); | |
6 | + } | |
7 | + | |
8 | + static load(res, onProgress?: Laya.Handler): Promise<any> { | |
9 | + return new Promise((suc, fail) => { | |
10 | + Laya.loader.load(res, Laya.Handler.create(this, suc), onProgress); | |
11 | + }) | |
12 | + } | |
13 | +} | |
0 | 14 | \ No newline at end of file | ... | ... |
puchi_laya/src/sdk/model/RedpacketModel.ts
... | ... | @@ -7,7 +7,7 @@ import Util, { DataKey } from "../../uitl/Util"; |
7 | 7 | import ObjectInstance from "../../uitl/ObjectInstance"; |
8 | 8 | import { EventCenter } from "../../event/EventCenter"; |
9 | 9 | import { EventEnum } from "../../event/EventEnum"; |
10 | -import PcSdk from "../PcSdk"; | |
10 | +import AppSdk from "../AppSdk"; | |
11 | 11 | |
12 | 12 | export default class RedpacketModel extends BaseModel { |
13 | 13 | private MAX = 20; |
... | ... | @@ -60,14 +60,14 @@ export default class RedpacketModel extends BaseModel { |
60 | 60 | |
61 | 61 | |
62 | 62 | async getRedConfig() { |
63 | - let result = PcSdk.I.gameConfig; | |
63 | + let result = AppSdk.I.gameConfig; | |
64 | 64 | console.log('--------------- 获取配置静态表-----' + JSON.stringify(result)) |
65 | 65 | if (result) { |
66 | 66 | let configJson = await this.loadGoldCfg(result['coin_config'][0]) |
67 | 67 | console.log('-------------- 获取红包静态表-----' + JSON.stringify(result)) |
68 | 68 | return configJson; |
69 | 69 | } else { |
70 | - PcSdk.I.initGameConfig(); | |
70 | + AppSdk.I.initGameConfig(); | |
71 | 71 | } |
72 | 72 | } |
73 | 73 | async loadGoldCfg(res: string) { |
... | ... | @@ -138,18 +138,18 @@ export default class RedpacketModel extends BaseModel { |
138 | 138 | } |
139 | 139 | /**获取总共的金币数 */ |
140 | 140 | async getTotalCoin() { |
141 | - let totalCoin = await PcSdk.I.myCoin(); | |
141 | + let totalCoin = await AppSdk.I.myCoin(); | |
142 | 142 | return totalCoin; |
143 | 143 | } |
144 | 144 | /**获取本次奖励的金币数 */ |
145 | 145 | async addCoin(key: number = 1) { |
146 | - let coinData = await PcSdk.I.addGold(key); | |
146 | + let coinData = await AppSdk.I.addGold(key); | |
147 | 147 | return coinData['coin']; |
148 | 148 | } |
149 | 149 | |
150 | 150 | /**获取最低提档 */ |
151 | 151 | async minWithDrawal() { |
152 | - let minCoin = await PcSdk.I.minWithDrawal(); | |
152 | + let minCoin = await AppSdk.I.minWithDrawal(); | |
153 | 153 | return minCoin; |
154 | 154 | } |
155 | 155 | static get I(): RedpacketModel { | ... | ... |
puchi_laya/src/sdk/model/ShakeModel.ts
... | ... | @@ -2,7 +2,7 @@ import BaseModel from "./BaseModel"; |
2 | 2 | import DateUtils from "../../uitl/DateUtils"; |
3 | 3 | import Util, { DataKey } from "../../uitl/Util"; |
4 | 4 | import ObjectInstance from "../../uitl/ObjectInstance"; |
5 | -import PcSdk from "../PcSdk"; | |
5 | +import AppSdk from "../AppSdk"; | |
6 | 6 | |
7 | 7 | /** |
8 | 8 | * |
... | ... | @@ -22,7 +22,7 @@ export default class ShakeModel extends BaseModel { |
22 | 22 | private cur_shake_day_limit: number = 0; |
23 | 23 | |
24 | 24 | async init() { |
25 | - let result = PcSdk.I.gameConfig;; | |
25 | + let result = AppSdk.I.gameConfig;; | |
26 | 26 | console.log('---------------ShakeModel-- 获取摇一摇静态表-----' + JSON.stringify(result)) |
27 | 27 | if (result['config']) { |
28 | 28 | let gameData = result['config']; | ... | ... |