var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 0 ? ang.y = ang.y + 2 * a : ang.y = ang.y - 2 * a; // var ab=new Laya.Quaternion(); // Laya.Quaternion.createFromAxisAngle(this.forw,-a,ab) // this.goS.CreateRay(poi, ab, BulletType.BulletG); this.goS.CreateRay(poi, ang, _type); } } else { this.RemoveTar(); this.go.transform.localScaleZ = 50; this.goS.SetNextNotActive(); } }; Bullet.prototype.SetNextNotActive = function () { if (this.go) { this.go.active = false; if (this.goS) this.goS.SetNextNotActive(); } }; Bullet.prototype.RemoveTar = function () { if (this.HitTar) { this.HitTar = null; } }; Bullet.prototype.SetTar = function (tar) { this.HitTar = tar; }; Bullet.prototype.Hit = function () { if (this.HitTar) { if (this.HitTar.layer == GameDefined_1.default.player_layer || this.HitTar.layer == GameDefined_1.default.moster_layer) { var r = this.HitTar.getComponent(Role_1.Role); r.HitEd(); this.CreateRay(this.tempPos, this.tempRotation); } } }; Bullet.prototype.onEnable = function () { EventManager_1.EventManager.on(GameDefined_1.default.HitEvent, this, this.Hit); }; Bullet.prototype.onDisable = function () { EventManager_1.EventManager.off(GameDefined_1.default.HitEvent, this, this.Hit); }; return Bullet; }(Laya.Script3D)); exports.Bullet = Bullet; },{"../game_module/EventManager":14,"../game_module/GameDefined":16,"../game_tool/Game_Tool":22,"./BulletController":4,"./GameSceneController":6,"./Role":10}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Pool_Manager_1 = require("./Pool_Manager"); var GameSceneController_1 = require("./GameSceneController"); var BulletController = /** @class */ (function () { function BulletController() { } Object.defineProperty(BulletController, "Instance", { get: function () { return this.instance || (this.instance = new BulletController()); }, enumerable: true, configurable: true }); // private bulletPref: Sprite3D; BulletController.prototype.init = function (bullet, poolName) { bullet.removeSelf(); // this.bulletPref = bullet; Pool_Manager_1.Pool_Manager.Instance.InitData(poolName, bullet); }; BulletController.prototype.CreateBullet = function (bulletName) { //if (this.bullet) return this.bullet; var go = Pool_Manager_1.Pool_Manager.Instance.SetActiveObject(bulletName); GameSceneController_1.default.Instance.game_scene.addChild(go); // this.bullet = go; return go; }; return BulletController; }()); exports.default = BulletController; },{"./GameSceneController":6,"./Pool_Manager":9}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EventManager_1 = require("../game_module/EventManager"); var GameDefined_1 = require("../game_module/GameDefined"); var GameController = /** @class */ (function () { function GameController() { this.ishit = false; this.gameStart = false; this.gameover = true; } Object.defineProperty(GameController, "Instance", { get: function () { return this.instasnce || (this.instasnce = new GameController()); }, enumerable: true, configurable: true }); GameController.prototype.Hit = function () { EventManager_1.EventManager.event(GameDefined_1.default.HitEvent); }; GameController.prototype.GameStart = function () { this.gameStart = true; this.gameover = false; }; return GameController; }()); exports.GameController = GameController; },{"../game_module/EventManager":14,"../game_module/GameDefined":16}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResourceLoad_1 = require("../game_module/ResourceLoad"); var BulletController_1 = require("./BulletController"); var RoleController_1 = require("./RoleController"); var GameDefined_1 = require("../game_module/GameDefined"); var GameSceneController = /** @class */ (function () { function GameSceneController() { } Object.defineProperty(GameSceneController, "Instance", { get: function () { return this.instance || (this.instance = new GameSceneController()); }, enumerable: true, configurable: true }); GameSceneController.prototype.CreateScene = function () { var _this = this; ResourceLoad_1.default.LoadResource([GameDefined_1.default.game_scene_path], function () { var t = Laya.loader.getRes(GameDefined_1.default.game_scene_path); Laya.stage.addChild(t); _this.game_scene = t; var _bulletG = t.getChildByName("bulletG"); var _bulletR = t.getChildByName("bulletR"); BulletController_1.default.Instance.init(_bulletG, GameDefined_1.default.poolName.bulletG); BulletController_1.default.Instance.init(_bulletR, GameDefined_1.default.poolName.BulletR); // var _role1 = t.getChildByName("role1") as Sprite3D; // var _role2 = t.getChildByName("role2") as Sprite3D; // var _moster1 = t.getChildByName("moster1") as Sprite3D; // var _moster2= t.getChildByName("moster2") as Sprite3D; var players = t.getChildByName("Players"); var mosters = t.getChildByName("Mosters"); RoleController_1.RoleController.Instance.initPlayer(players._children); RoleController_1.RoleController.Instance.initMoster(mosters._children); RoleController_1.RoleController.Instance.CreateRay(); }); }; return GameSceneController; }()); exports.default = GameSceneController; },{"../game_module/GameDefined":16,"../game_module/ResourceLoad":17,"./BulletController":4,"./RoleController":11}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GameDefined_1 = require("../game_module/GameDefined"); var Role_1 = require("./Role"); var Vector3 = Laya.Vector3; var Ray = Laya.Ray; var HitResult = Laya.HitResult; var Bullet_1 = require("./Bullet"); var BulletController_1 = require("./BulletController"); var GameSceneController_1 = require("./GameSceneController"); var Game_Tool_1 = require("../game_tool/Game_Tool"); var EventManager_1 = require("../game_module/EventManager"); var Moster = /** @class */ (function (_super) { __extends(Moster, _super); function Moster() { return _super.call(this) || this; } Moster.prototype.onAwake = function () { _super.prototype.onAwake.call(this); this._type = GameDefined_1.CheckType.Moster; this.forw = new Vector3(0, 0, 0); this._corss = new Vector3(0, 0, 0); this._bulletPos = this.self.getChildByName("bulletPos"); }; Moster.prototype.CreateRay = function () { this._transform.getForward(this.forw); this.forw = new Vector3(-this.forw.x, -this.forw.y, -this.forw.z); if (!this._ray) { this._ray = new Ray(this._bulletPos.transform.position, this.forw); this._hit = new HitResult(); } else { this._ray.origin = this._bulletPos.transform.position; this._ray.direction = this.forw; } if (!this.go) { this.go = BulletController_1.default.Instance.CreateBullet(GameDefined_1.default.poolName.BulletR); var gs = this.go.getComponent(Bullet_1.Bullet); if (!gs) this.goS = this.go.addComponent(Bullet_1.Bullet); } this.go.transform.position = this._bulletPos.transform.position; this.go.transform.rotation = this._transform.rotation; var isS = GameSceneController_1.default.Instance.game_scene.physicsSimulation.rayCast(this._ray, this._hit); if (isS) { var poi = this._hit.point; var dis = Vector3.distance(this._bulletPos.transform.position, poi); this.go.transform.localScaleZ = dis; var other = this._hit.collider.owner; if (other.layer == GameDefined_1.default.player_layer || other.layer == GameDefined_1.default.moster_layer) { this.SetTar(other); this.goS.SetNextNotActive(); } else { this.RemoveTar(); var nor = this._hit.normal; nor.x = Math.abs(nor.x) < 0.001 ? 0 : nor.x; nor.y = Math.abs(nor.y) < 0.001 ? 0 : nor.y; nor.z = Math.abs(nor.z) < 0.001 ? 0 : nor.z; Vector3.cross(this.forw, nor, this._corss); //大于0在左方 小于0在右方 var a = Game_Tool_1.default.getReflectAng(this.forw); var ang = this._transform.rotationEuler.clone(); this._corss.y >= 0 ? ang.y = ang.y + 2 * a : ang.y = ang.y - 2 * a; this.goS.CreateRay(poi, ang, GameDefined_1.BulletType.BulletR); } } else { this.RemoveTar(); this.go.transform.localScaleZ = 50; this.goS.SetNextNotActive(); } }; Moster.prototype.RotationSelf = function (rota) { this._transform.rotate(rota); this.CreateRay(); }; Moster.prototype.SetNextNotActive = function () { if (this.go) { this.go.active = false; if (this.goS) this.goS.SetNextNotActive(); } }; Moster.prototype.RemoveTar = function () { if (this.HitTar) { this.HitTar = null; } }; Moster.prototype.SetTar = function (tar) { this.HitTar = tar; }; Moster.prototype.Hit = function () { if (this.HitTar) { //Game_Tool.CreateText(this.HitTar.name+"被击杀!"); if (this.HitTar.layer == GameDefined_1.default.player_layer || this.HitTar.layer == GameDefined_1.default.moster_layer) { var r = this.HitTar.getComponent(Role_1.Role); r.HitEd(); this.CreateRay(); // this.CreateRay(); } // EventManager.off(GameDefined.HitEvent,this, this.Hit); } }; Moster.prototype.onEnable = function () { EventManager_1.EventManager.on(GameDefined_1.default.HitEvent, this, this.Hit); this._ishited = false; }; Moster.prototype.onDisable = function () { EventManager_1.EventManager.off(GameDefined_1.default.HitEvent, this, this.Hit); }; return Moster; }(Role_1.Role)); exports.Moster = Moster; },{"../game_module/EventManager":14,"../game_module/GameDefined":16,"../game_tool/Game_Tool":22,"./Bullet":3,"./BulletController":4,"./GameSceneController":6,"./Role":10}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Role_1 = require("./Role"); var GameDefined_1 = require("../game_module/GameDefined"); var Vector3 = Laya.Vector3; var Ray = Laya.Ray; var HitResult = Laya.HitResult; var GameSceneController_1 = require("./GameSceneController"); var BulletController_1 = require("./BulletController"); var Bullet_1 = require("./Bullet"); var Game_Tool_1 = require("../game_tool/Game_Tool"); var EventManager_1 = require("../game_module/EventManager"); var Player = /** @class */ (function (_super) { __extends(Player, _super); function Player() { var _this = _super.call(this) || this; _this.idhit = false; return _this; } Player.prototype.onAwake = function () { _super.prototype.onAwake.call(this); this._type = GameDefined_1.CheckType.Player; this.forw = new Vector3(0, 0, 0); this._corss = new Vector3(0, 0, 0); this._bulletPos = this.self.getChildByName("bulletPos"); }; Player.prototype.CreateRay = function () { this._transform.getForward(this.forw); this.forw = new Vector3(-this.forw.x, -this.forw.y, -this.forw.z); if (!this._ray) { this._ray = new Ray(this._bulletPos.transform.position, this.forw); this._hit = new HitResult(); } else { this._ray.origin = this._bulletPos.transform.position; this._ray.direction = this.forw; } if (!this.go) { this.go = BulletController_1.default.Instance.CreateBullet(GameDefined_1.default.poolName.bulletG); var gs = this.go.getComponent(Bullet_1.Bullet); if (!gs) this.goS = this.go.addComponent(Bullet_1.Bullet); } this.go.transform.position = this._bulletPos.transform.position; this.go.transform.rotation = this._transform.rotation; var isS = GameSceneController_1.default.Instance.game_scene.physicsSimulation.rayCast(this._ray, this._hit); if (isS) { var poi = this._hit.point; var dis = Vector3.distance(this._bulletPos.transform.position, poi); this.go.transform.localScaleZ = dis; var other = this._hit.collider.owner; if (other.layer == GameDefined_1.default.player_layer || other.layer == GameDefined_1.default.moster_layer) { this.SetTar(other); this.goS.SetNextNotActive(); } else { this.RemoveTar(); var nor = this._hit.normal; nor.x = Math.abs(nor.x) < 0.001 ? 0 : nor.x; nor.y = Math.abs(nor.y) < 0.001 ? 0 : nor.y; nor.z = Math.abs(nor.z) < 0.001 ? 0 : nor.z; Vector3.cross(this.forw, nor, this._corss); //大于0在左方 小于0在右方 var a = Game_Tool_1.default.getReflectAng(this.forw); var ang = this._transform.rotationEuler.clone(); this._corss.y >= 0 ? ang.y = ang.y + 2 * a : ang.y = ang.y - 2 * a; // var v1=new Vector3(0.8,0,0.6); //向量1 // var nor=new Vector3(-1,0,0); //v1碰撞法线 // var ab=new Laya.Quaternion(); // Laya.Quaternion.createFromAxisAngle(this.forw,a,ab) // this.goS.CreateRay(poi, ab, BulletType.BulletG); this.goS.CreateRay(poi, ang, GameDefined_1.BulletType.BulletG); } } else { this.RemoveTar(); this.go.transform.localScaleZ = 50; this.goS.SetNextNotActive(); } }; Player.prototype.RotationSelf = function (rota) { // console.log(rota); // console.log(this._transform.rotationEuler); this._transform.rotate(rota); // console.log(this._transform.rotationEuler); this.CreateRay(); }; Player.prototype.SetNextNotActive = function () { if (this.go) { this.go.active = false; if (this.goS) this.goS.SetNextNotActive(); } }; Player.prototype.RemoveTar = function () { if (this.HitTar) { this.HitTar = null; } }; Player.prototype.SetTar = function (tar) { this.HitTar = tar; }; Player.prototype.Hit = function () { if (this.HitTar) { if (this.HitTar.layer == GameDefined_1.default.player_layer || this.HitTar.layer == GameDefined_1.default.moster_layer) { var r = this.HitTar.getComponent(Role_1.Role); r.HitEd(); this.CreateRay(); } } }; Player.prototype.onEnable = function () { EventManager_1.EventManager.on(GameDefined_1.default.HitEvent, this, this.Hit); this._ishited = false; }; Player.prototype.onDisable = function () { EventManager_1.EventManager.off(GameDefined_1.default.HitEvent, this, this.Hit); }; return Player; }(Role_1.Role)); exports.Player = Player; },{"../game_module/EventManager":14,"../game_module/GameDefined":16,"../game_tool/Game_Tool":22,"./Bullet":3,"./BulletController":4,"./GameSceneController":6,"./Role":10}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Dictionary_1 = require("../game_tool/Dictionary"); var Vector3 = Laya.Vector3; var Pool_Manager = /** @class */ (function () { function Pool_Manager() { this.poolDic = new Dictionary_1.default(); this.prefabDic = new Dictionary_1.default(); } Object.defineProperty(Pool_Manager, "Instance", { get: function () { return Pool_Manager.instance || (Pool_Manager.instance = new Pool_Manager()); }, enumerable: true, configurable: true }); // [ ] Pool_Manager.prototype.InitData = function (name, prefab) { if (prefab != null) { if (!this.prefabDic.has(name)) this.prefabDic.set(name, prefab); } }; Pool_Manager.prototype.SetActiveObject = function (name, scale) { if (this.poolDic.has(name)) { if (this.poolDic.get(name).length > 0) { var result = this.poolDic.get(name).shift(); result.active = true; return result; } else { if (this.prefabDic.has(name)) { var curObj = Laya.Sprite3D.instantiate(this.prefabDic.get(name)); if (scale != null) { curObj.transform.localScale = new Vector3(scale, scale, scale); } curObj.name = name; return curObj; } else { return null; } } } else { if (this.prefabDic.has(name)) { var curObj = Laya.Sprite3D.instantiate(this.prefabDic.get(name)); if (scale != null) { curObj.transform.localScale = new Vector3(scale, scale, scale); } curObj.name = name; return curObj; } else { return null; } } }; //隐藏对象到dic Pool_Manager.prototype.SetDisableObject = function (go) { if (go) go.active = false; var key = go.name; if (!this.poolDic.has(key)) { this.poolDic.set(key, new Array()); } this.poolDic.get(key).push(go); }; Pool_Manager.prototype.DestoryObj = function (go) { if (go) go.destroy(true); }; //延时隐藏对象到dic Pool_Manager.prototype.SetDisableMutiObject = function (go, timer) { var _this = this; Laya.timer.once(timer, this, function () { if (go) go.active = false; var key = go.name; if (!_this.poolDic.has(key)) { _this.poolDic.set(key, new Array()); } _this.poolDic.get(key).push(go); }); }; return Pool_Manager; }()); exports.Pool_Manager = Pool_Manager; },{"../game_tool/Dictionary":21}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GameDefined_1 = require("../game_module/GameDefined"); var Role = /** @class */ (function (_super) { __extends(Role, _super); function Role() { return _super.call(this) || this; } Role.prototype.onAwake = function () { this.self = this.owner; this._transform = this.self.transform; }; Role.prototype.HitEd = function () { if (this._ishited) return; switch (this._type) { case GameDefined_1.CheckType.Player: console.log(); break; case GameDefined_1.CheckType.Moster: break; } this.SetNextNotActive(); this.self.active = false; }; Role.prototype.SetNextNotActive = function () { }; return Role; }(Laya.Script3D)); exports.Role = Role; },{"../game_module/GameDefined":16}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Player_1 = require("./Player"); var Moster_1 = require("./Moster"); var RoleController = /** @class */ (function () { function RoleController() { // public player:Sprite3D; // public playerS:Player; this.playerArr = []; this.mosterArr = []; this.behaviorArr = []; } Object.defineProperty(RoleController, "Instance", { get: function () { return this.instasnce || (this.instasnce = new RoleController()); }, enumerable: true, configurable: true }); RoleController.prototype.initPlayer = function (roles) { for (var index = 0; index < roles.length; index++) { var element = roles[index]; var beh = element.addComponent(Player_1.Player); this.behaviorArr.push(beh); } // if(role){ // this.player=role; // this.playerS=this.player.addComponent(Player); // } }; RoleController.prototype.initMoster = function (mosters) { for (var index = 0; index < mosters.length; index++) { var element = mosters[index]; var beh = element.addComponent(Moster_1.Moster); this.behaviorArr.push(beh); } }; RoleController.prototype.CreateRay = function () { for (var index = 0; index < this.behaviorArr.length; index++) { var element = this.behaviorArr[index]; element.CreateRay(); } // if(this.playerS)this.playerS.CreateRay(); }; RoleController.prototype.RoleRotation = function (rota) { // if(this.playerS)this.playerS.RotationSelf(rota); for (var index = 0; index < this.behaviorArr.length; index++) { var element = this.behaviorArr[index]; element.RotationSelf(rota); } }; return RoleController; }()); exports.RoleController = RoleController; },{"./Moster":7,"./Player":8}],12:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var SoundManager = Laya.SoundManager; var WXSdk_1 = require("../game_module/WXSdk"); var SettingController = /** @class */ (function () { function SettingController() { this.vibrate = true; this.sound = true; this.temp = 0; this.badMove = "res/Sound/BadMove.mp3"; this.click = "res/Sound/click.mp3"; this.Continue = "res/Sound/Continue.mp3"; this.LevelComp = "res/Sound/LevelComp.mp3"; this.TrainCrash = "res/Sound/TrainCrash.mp3"; this.TrainLoop = "res/Sound/TrainLoop.mp3"; this.TrainStop = "res/Sound/TrainStop.mp3"; this.Coin = "res/Sound/Coin1.mp3"; this.Jump = [ "res/Sound/PassengerJumpIn1.mp3", "res/Sound/PassengerJumpIn2.mp3", "res/Sound/PassengerJumpIn3.mp3", "res/Sound/PassengerJumpIn4.mp3", "res/Sound/PassengerJumpIn5.mp3", "res/Sound/PassengerJumpIn6.mp3", "res/Sound/PassengerJumpIn7.mp3", "res/Sound/PassengerJumpIn8.mp3", ]; } Object.defineProperty(SettingController, "Instance", { get: function () { return this.instasnce || (this.instasnce = new SettingController()); }, enumerable: true, configurable: true }); SettingController.prototype.SettingSound = function (value) { if (!this.sound) return; SoundManager.setSoundVolume(value); SoundManager.setMusicVolume(value); }; SettingController.prototype._playMusic = function (on) { if (!this.sound) return; if (on) { if (this.soundChannel == null) { this.soundChannel = SoundManager.playMusic(this.TrainLoop, 0); this.soundChannel.volume = 0.5; } this.soundChannel.resume(); } else { if (this.soundChannel) { this.soundChannel.pause(); } } }; SettingController.prototype._playBadMove = function () { WXSdk_1.WXSdk.ShortVibrate(); if (!this.sound) return; SoundManager.playSound(this.badMove); }; SettingController.prototype._Click = function () { if (!this.sound) return; SoundManager.playSound(this.click); }; SettingController.prototype._Continue = function (on) { if (!this.sound) return; if (on) { SoundManager.playSound(this.Continue); } else { SoundManager.stopSound(this.Continue); } }; SettingController.prototype._LevelComp = function () { if (!this.sound) return; SoundManager.playSound(this.LevelComp); }; SettingController.prototype._TrainCrash = function () { WXSdk_1.WXSdk.LongVibrate(); if (!this.sound) return; SoundManager.playSound(this.TrainCrash); }; SettingController.prototype._TrainStop = function () { if (!this.sound) return; SoundManager.playSound(this.TrainStop); }; SettingController.prototype._Coin = function () { WXSdk_1.WXSdk.ShortVibrate(); if (!this.sound) return; SoundManager.playSound(this.Coin); }; SettingController.prototype._Jump = function () { WXSdk_1.WXSdk.ShortVibrate(); if (!this.sound) return; SoundManager.playSound(this.Jump[this.temp]); this.temp++; if (this.temp == 8) this.temp = 0; }; return SettingController; }()); exports.SettingController = SettingController; },{"../game_module/WXSdk":20}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Dictionary_1 = require("../game_tool/Dictionary"); var game_ui_1 = require("../game_ui/game_ui"); var main_ui_1 = require("../game_ui/main_ui"); var ViewType; (function (ViewType) { ViewType[ViewType["game_ui"] = 0] = "game_ui"; ViewType[ViewType["main_ui"] = 1] = "main_ui"; })(ViewType = exports.ViewType || (exports.ViewType = {})); var ViewManager = /** @class */ (function () { function ViewManager() { this.viewDic = []; this.addViewDic = new Dictionary_1.default(); this.init(); } Object.defineProperty(ViewManager, "Instance", { get: function () { return this.instance || (this.instance = new ViewManager()); }, enumerable: true, configurable: true }); ViewManager.prototype.init = function () { this.viewDic[ViewType.game_ui] = game_ui_1.game_ui; this.viewDic[ViewType.main_ui] = main_ui_1.main_ui; }; ViewManager.prototype.OpenView = function (view, data) { if (this.curView != null) { this.curView.OnClose(); Laya.stage.removeChild(this.curView); this.curView.destroy(true); this.curView = null; } this.curView = new this.viewDic[view]; Laya.stage.addChild(this.curView); this.curView.OnShow(data); }; Object.defineProperty(ViewManager.prototype, "getCurView", { get: function () { return this.curView; }, enumerable: true, configurable: true }); ViewManager.prototype.AddView = function (view, data) { if (this.addViewDic.has(view)) return; var t_view = new this.viewDic[view]; this.addViewDic.set(view, t_view); Laya.stage.addChild(t_view); t_view.OnShow(data); }; ViewManager.prototype.RemoveView = function () { if (this.curView != null) { this.curView.OnClose(); Laya.stage.removeChild(this.curView); this.curView.destroy(true); this.curView = null; } }; ViewManager.prototype.CloseView = function (view) { if (!this.addViewDic.has(view)) return; var t_view = this.addViewDic.get(view); t_view.OnClose(); Laya.stage.removeChild(t_view); t_view.destroy(true); this.addViewDic.delete(view); }; ViewManager.prototype.OpenMask = function () { if (this.curMask != null) { return; } // this.curMask = new Mask_ui(); if (!this.curMask) return; Laya.stage.addChild(this.curMask); }; ViewManager.prototype.CloseMask = function () { if (this.curMask != null) { this.curMask.OnClose(); Laya.stage.removeChild(this.curMask); this.curMask.destroy(true); this.curMask = null; } }; return ViewManager; }()); exports.default = ViewManager; },{"../game_tool/Dictionary":21,"../game_ui/game_ui":24,"../game_ui/main_ui":25}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EventManager = /** @class */ (function () { function EventManager() { } Object.defineProperty(EventManager, "Disispatcher", { get: function () { return EventManager.disispatcher || (EventManager.disispatcher = new Laya.EventDispatcher()); }, enumerable: true, configurable: true }); EventManager.on = function (type, call, data) { this.Disispatcher.on(type, call, data); }; EventManager.off = function (type, call, data) { this.Disispatcher.off(type, call, data); }; EventManager.event = function (type, data) { if (data === void 0) { data = null; } this.Disispatcher.event(type, data); }; return EventManager; }()); exports.EventManager = EventManager; },{}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UserModel_1 = require("./UserModel"); var Main_1 = require("../Main"); var EventManager_1 = require("./EventManager"); var FYHD_Sdk = /** @class */ (function () { function FYHD_Sdk() { } //初始化sdk FYHD_Sdk.InitSdk = function () { Laya.Browser.window.sdk.getFyhd().startSdk(); FYHD_Sdk.UserInfoAuth(); }; //用户授权 FYHD_Sdk.UserInfoAuth = function () { if (!Main_1.Main.IsWx) return; Laya.Browser.window.sdk.getFyhd().getFyhdUserInfo(null, false, function (data) { console.log("无授权回调:" + JSON.stringify(data)); if (data.result.user) { FYHD_Sdk.openid = data.result.user.openid; FYHD_Sdk.AuthInfo(); } }); }; FYHD_Sdk.AuthInfo = function () { var args = { openid: FYHD_Sdk.openid, }; Laya.Browser.window.sdk.getFyhd().loginData(args, function (data) { console.log("授权上报回调:" + JSON.stringify(data)); FYHD_Sdk.ValueUser(); }); }; FYHD_Sdk.ValueUser = function () { var args = { openid: FYHD_Sdk.openid, }; Laya.Browser.window.sdk.getFyhd().valueuser(args, function (data) { console.log("有效用户上报:" + JSON.stringify(data)); }); }; //创角色 FYHD_Sdk.RoleData = function () { if (!Main_1.Main.IsWx) return; var args = { openid: FYHD_Sdk.openid, role_id: UserModel_1.default.Instance.CurModel.userid, create_time: UserModel_1.default.Instance.CurModel.ServerTime }; Laya.Browser.window.sdk.getFyhd().roleData(args, function (data) { console.log("创建角色:" + JSON.stringify(data)); FYHD_Sdk.Login(); }); }; //登录信息上报 FYHD_Sdk.Login = function () { if (!Main_1.Main.IsWx) return; var openid = FYHD_Sdk.openid ? FYHD_Sdk.openid : UserModel_1.default.Instance.CurModel.openid; var args = { openid: openid, role_id: UserModel_1.default.Instance.CurModel.userid, create_time: UserModel_1.default.Instance.CurModel.ServerTime.toString() }; console.log("登录参数:" + JSON.stringify(args)); Laya.Browser.window.sdk.getFyhd().uploginData(args, function (data) { console.log("登录结果:" + JSON.stringify(data)); // FYHD_Sdk.PushData(); }); }; //点击事件上报 FYHD_Sdk.ClickAd = function (ad_type) { if (!Main_1.Main.IsWx) return; var param = { ad_type: ad_type, }; console.log("点击参数:" + param); Laya.Browser.window.sdk.getFyhd().advertisement(param, function (data) { console.log("点击结果:" + JSON.stringify(data)); }); }; FYHD_Sdk.PushData = function () { if (!Main_1.Main.IsWx) return; var param = {}; Laya.Browser.window.sdk.getFyhd().shareRecommend(param, function (data) { if (data.data) { FYHD_Sdk.pushData = data.data; FYHD_Sdk.pushData.sort(FYHD_Sdk.ListSort); EventManager_1.EventManager.event(FYHD_Sdk.ShowAd); FYHD_Sdk.isHaveDate = true; } console.log("获取互推信息:" + JSON.stringify(FYHD_Sdk.pushData)); }); }; FYHD_Sdk.ShowHuTuiJump = function (data) { if (!Main_1.Main.IsWx) return; if (data.jump_type == 2) //二维码跳转方法 { Laya.Browser.window.wx.previewImage({ current: data.qrcode, urls: [data.qrcode] }); } else if (data.jump_type == 1) //直跳方法 { Laya.Browser.window.wx.navigateToMiniProgram({ appId: data.to_appid, path: data.jump_path, success: function (res) { // 打开成功 console.log("上报成功:" + JSON.stringify(res)); FYHD_Sdk.PushClick(data.to_appid); } }); } else if (data.jump_type == 0) //平台跳转方法 { Laya.Browser.window.wx.navigateToMiniProgram({ appId: data.platform_appid, path: data.jump_path, success: function (res) { // 打开成功 console.log("上报成功:" + JSON.stringify(res)); FYHD_Sdk.PushClick(data.to_appid); } }); } }; FYHD_Sdk.PushClick = function (to_appid) { if (!Main_1.Main.IsWx) return; var param = { openid: FYHD_Sdk.openid, to_appid: to_appid, }; Laya.Browser.window.sdk.getFyhd().sharePlay(param, function (data) { console.log("点击上报结果:" + JSON.stringify(data)); }); }; FYHD_Sdk.ListSort = function (a, b) { if (Number(a["panel"]) < Number(b["panel"])) { return -1; } if (Number(a["panel"]) == Number(b["panel"])) { return 0; } if (Number(a["panel"]) > Number(b["panel"])) { return 1; } }; FYHD_Sdk.Ad_ClickType = { Video: "video_click", Watch: "watch", Share: "share", Banner: "banner", Push: "push" }; FYHD_Sdk.pushData = []; FYHD_Sdk.isHaveDate = false; FYHD_Sdk.ShowAd = "ShowAd"; return FYHD_Sdk; }()); exports.FYHD_Sdk = FYHD_Sdk; },{"../Main":2,"./EventManager":14,"./UserModel":19}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GameDefined = /** @class */ (function () { function GameDefined() { } GameDefined.player_layer = 9; GameDefined.wall_layer = 8; GameDefined.moster_layer = 10; GameDefined.boss_layer = 11; GameDefined.tree_layer = 12; GameDefined.bomb_layer = 13; GameDefined.HitEvent = "HitEvent"; GameDefined.game_scene_path = "res/LayaScene_GameScene/Conventional/GameScene.ls"; GameDefined.poolName = { bulletG: "bulletG", BulletR: "BulletR" }; GameDefined.uiRes = [ "res/atlas/main_res.atlas", "res/atlas/main_res.png " ]; return GameDefined; }()); exports.default = GameDefined; var CheckType; (function (CheckType) { CheckType[CheckType["Player"] = 0] = "Player"; CheckType[CheckType["Moster"] = 1] = "Moster"; CheckType[CheckType["Boss"] = 2] = "Boss"; CheckType[CheckType["Bomb"] = 3] = "Bomb"; CheckType[CheckType["Tree"] = 4] = "Tree"; })(CheckType = exports.CheckType || (exports.CheckType = {})); var BulletType; (function (BulletType) { BulletType[BulletType["BulletR"] = 0] = "BulletR"; BulletType[BulletType["BulletG"] = 1] = "BulletG"; })(BulletType = exports.BulletType || (exports.BulletType = {})); },{}],17:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResourceLoad = /** @class */ (function () { function ResourceLoad() { } ResourceLoad.LoadResource = function (path, complet) { Laya.loader.retryNum = 2; Laya.loader.maxLoader = 3; Laya.loader.retryDelay = 100; Laya.loader.create(path, new Laya.Handler(this, complet)); Laya.loader.on(Laya.Event.ERROR, this, function (data) { console.log(data + " 资源加载失败"); }); }; return ResourceLoad; }()); exports.default = ResourceLoad; },{}],18:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var WXSdk_1 = require("./WXSdk"); var FYHD_Sdk_1 = require("./FYHD_Sdk"); var ShareModule = /** @class */ (function () { function ShareModule() { } ShareModule.GoShare = function (callBack) { ShareModule.ShareTime = new Date().getTime(); console.log("分享点击时间=" + ShareModule.ShareTime); ShareModule.IsSharing = true; ShareModule.callback = callBack; }; ShareModule.OnShowHandle = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onShow(function (option) { console.log("onshow share start"); console.log("进入微信"); //Laya.timer.scale=1; if (ShareModule.IsSharing) { ShareModule.IsSharing = false; var time = new Date().getTime(); console.log("分享回到游戏时间" + time); var wait = (time - ShareModule.ShareTime) / 1000; console.log("分享停留时间为:" + wait); var shareSuccess = false; var realSuccess = false; if (wait >= 2) { if (Math.random() <= 0.5) { shareSuccess = true; FYHD_Sdk_1.FYHD_Sdk.ClickAd(FYHD_Sdk_1.FYHD_Sdk.Ad_ClickType.Share); if (!ShareModule.callback) return; ShareModule.callback(true); Laya.Browser.window.wx.showToast({ title: "分享成功!" }); } else { if (!ShareModule.callback) return; if (Math.random() <= 0.5) { Laya.Browser.window.wx.showToast({ title: "分享失败!" }); } else { WXSdk_1.WXSdk.ShowToast("请分享到不同群^-^", false); } ShareModule.callback(false); } } } }); } }; ShareModule.IsSharing = false; return ShareModule; }()); exports.ShareModule = ShareModule; },{"./FYHD_Sdk":15,"./WXSdk":20}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UserConfigName; (function (UserConfigName) { UserConfigName[UserConfigName["train"] = 0] = "train"; UserConfigName[UserConfigName["sign"] = 1] = "sign"; UserConfigName[UserConfigName["rewards"] = 2] = "rewards"; })(UserConfigName = exports.UserConfigName || (exports.UserConfigName = {})); //用户信息属性 var UserAttr; (function (UserAttr) { UserAttr[UserAttr["equip_train"] = 0] = "equip_train"; UserAttr[UserAttr["user_id"] = 1] = "user_id"; UserAttr[UserAttr["stage"] = 2] = "stage"; UserAttr[UserAttr["get_trains"] = 3] = "get_trains"; UserAttr[UserAttr["money"] = 4] = "money"; UserAttr[UserAttr["progress_trains"] = 5] = "progress_trains"; })(UserAttr = exports.UserAttr || (exports.UserAttr = {})); var NetUserModel = /** @class */ (function () { function NetUserModel(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_lottery, _user_treasure, t, _user_achievement, _user_sign, _user_arena) { this.loginSeverTime = 0; this.localTime = Laya.timer.currTimer; this.loginSeverTime = t; this.m_token = _token; this.m_configs = _config; this.m_app_setting = _appSetting; this.m_user = _user; this.m_user_base = _userbase; this.m_user_invite = _useInvite; this.m_user_lottery = _user_lottery; this.m_user_treasure = _user_treasure; this.m_user_achievement = _user_achievement; this.m_user_sign = _user_sign; this.m_user_arena = _user_arena; this.userid = this.m_user["user_id"]; this.openid = this.m_user_base["openid"]; this.nickname = this.m_user_base["nickname"]; } Object.defineProperty(NetUserModel.prototype, "Cfg", { set: function (cfg) { this.m_configs = cfg; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "sharetitle", { get: function () { if (this.m_app_setting["sharetitle"]) { return this.m_app_setting["sharetitle"]; } return ""; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "shareimage", { get: function () { if (this.m_app_setting["shareimage"]) { return this.m_app_setting["shareimage"]; } return ""; }, enumerable: true, configurable: true }); NetUserModel.prototype.GetCfg = function (type) { var _type = UserConfigName[type]; return this.m_configs[_type]; }; NetUserModel.prototype.GetUserAttr = function (_attr) { var attr = UserAttr[_attr]; return this.m_user[attr]; }; Object.defineProperty(NetUserModel.prototype, "ServerTime", { get: function () { var time = Laya.timer.currTimer; var stime = this.loginSeverTime + Math.ceil((time - this.localTime) / 1000); return stime; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "GuideLevel", { get: function () { if (this.m_app_setting["GuideLevel"]) { return Number(this.m_app_setting["GuideLevel"]); } return 1; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "BannerMoveTime", { get: function () { if (this.m_app_setting["BannerMoveTime"]) { return Number(this.m_app_setting["BannerMoveTime"]); } return 0; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "HaveBanner", { get: function () { if (this.m_app_setting["HaveBanner"]) { return Number(this.m_app_setting["HaveBanner"]); } return 0; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "IsShare", { get: function () { if (this.m_app_setting["IsShare"]) { return Number(this.m_app_setting["IsShare"]); } return 0; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "BtnCanMove", { get: function () { if (this.m_app_setting["BtnCanMove"]) { return Number(this.m_app_setting["BtnCanMove"]); } return 0; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "ISShareThenVideo", { get: function () { if (this.m_app_setting["ISShareThenVideo"]) { return Number(this.m_app_setting["ISShareThenVideo"]); } return 0; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "OpenSceneValue", { get: function () { if (this.m_app_setting["OpenSceneValue"]) { return Number(this.m_app_setting["OpenSceneValue"]); } return 0; }, enumerable: true, configurable: true }); Object.defineProperty(NetUserModel.prototype, "IsOpenTryOut", { get: function () { if (this.m_app_setting["IsOpenTryOut"]) { var num = Number(this.m_app_setting["IsOpenTryOut"]); if (num == 0) return 0; if (Math.random() < num) { return 1; } else { return 0; } } return 0; }, enumerable: true, configurable: true }); return NetUserModel; }()); exports.NetUserModel = NetUserModel; var UserModel = /** @class */ (function () { function UserModel(code, nickname, avatar, gender, country, province, city, device, share_id, scene) { UserModel.instance = this; this.m_code = code; this.m_nickname = nickname ? nickname : "游客"; this.m_avatar = avatar ? avatar : ""; this.m_gender = gender ? gender : 0; this.m_city = city ? city : ""; this.m_device = device ? device : ""; this.m_share_id = share_id ? share_id : ""; this.m_scene = scene ? scene : ""; this.m_country = country ? country : ""; this.m_province = province ? province : ""; } Object.defineProperty(UserModel.prototype, "CurModel", { get: function () { return this.curModel; }, enumerable: true, configurable: true }); Object.defineProperty(UserModel, "Instance", { get: function () { if (UserModel.instance) { return UserModel.instance; } else { UserModel.instance = new UserModel("11", "游客", "", null, "", "", "", "iphone6s", "", ""); return UserModel.instance; } }, enumerable: true, configurable: true }); UserModel.prototype.SetUserModel = function (_model) { this.curModel = _model; }; return UserModel; }()); exports.default = UserModel; },{}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Main_1 = require("../Main"); var ViewManager_1 = require("../game_logic/ViewManager"); var SettingController_1 = require("../game_logic/SettingController"); var ShareModule_1 = require("./ShareModule"); var UserModel_1 = require("./UserModel"); var WXSdk = /** @class */ (function () { function WXSdk() { this.shareId = ""; this.shareScene = ""; } WXSdk.prototype.setShareId = function (tid) { if (tid != "" && tid != null) { this.shareId = tid; console.log("[LOG]: setShareOpenId.tid=", this.shareId); } }; Object.defineProperty(WXSdk, "Instance", { get: function () { return WXSdk.instance || (WXSdk.instance = new WXSdk()); }, enumerable: true, configurable: true }); Object.defineProperty(WXSdk.prototype, "getShareId", { get: function () { return this.shareId; }, enumerable: true, configurable: true }); Object.defineProperty(WXSdk.prototype, "ShareScene", { get: function () { return this.shareScene; }, set: function (sceneS) { if (sceneS != "" && sceneS != null) { this.shareScene = sceneS; } }, enumerable: true, configurable: true }); WXSdk.prototype.init = function (cb) { Laya.Browser.window.wx.showShareMenu({ withShareTicket: true }); //this.shezhiShareMessage(null, null); Laya.Browser.window.wx.onShow(function (option) { var shareTicket = option.shareTicket; var shareid = option.query.shareid; var scene = decodeURIComponent(option.query.scene); console.log("全局path=:", option.path); console.log("decodeURIComponent", option.query.scene); var sceneQuery = JSON.stringify(option.query); if (Main_1.Main.wxValue == "") { Main_1.Main.wxValue = option.scene; } console.log("scene", option.scene); console.log("sceneQuery", sceneQuery); var channel = option.query.channel; var appid; if (option.referrerInfo) { console.log("referrerInfo:" + JSON.stringify(option.referrerInfo)); appid = option.referrerInfo.appId; if (appid) { console.log("onShow appis is:", appid); } else { console.log("onShow appis is null"); } } else { console.log("referrerInfo为空"); } if (channel != null) { console.log("onShow channel is:", channel); } cb(shareTicket, shareid, channel, appid); }); }; WXSdk.ShareMessage = function (title, imageUrl) { if (!Main_1.Main.IsWx) return; var t = UserModel_1.default.Instance.CurModel.ServerTime; var _title = title; var _url = imageUrl; if (!_title) { _title = UserModel_1.default.Instance.CurModel.sharetitle; _url = UserModel_1.default.Instance.CurModel.shareimage; } Laya.Browser.window.wx.onShareAppMessage(function () { return ({ title: _title, imageUrl: _url, query: "shareid=" + UserModel_1.default.Instance.CurModel.userid + "_" + t + "_" + Math.floor(9999 * Math.random()).toString() }); }); }; WXSdk.prototype.wx_login = function (cb) { if (WXSdk.Lodining) { return; } WXSdk.Lodining = true; console.log("Excute wx.login! shareOpenId: " + this.shareId); Laya.Browser.window.wx.login({ success: function (res) { console.log("wx.login: success! res.code=" + res.code); if (res.code) { WXSdk.Lodining = false; console.log("将要传递的参数:" + res); cb(res); } else { console.log('获取用户登录态失败!' + res.errMsg); cb("error"); } }, fail: function (res) { console.log("wx.login: failed, res=" + res); WXSdk.Lodining = false; cb("error"); } }); }; //显示加载信息 WXSdk.ShowLoading = function (title, isShowWx) { if (title === void 0) { title = "加载中..."; } if (isShowWx === void 0) { isShowWx = true; } if (Laya.Browser.window && Laya.Browser.window.wx) { if (isShowWx) { Laya.Browser.window.wx.showLoading({ title: title, mask: true }); } ViewManager_1.default.Instance.OpenMask(); } }; WXSdk.SystemInfo = function () { if (Laya.Browser.window.wx) { return Laya.Browser.window.wx.getSystemInfoSync(); } }; // private static button; // public static showbjWxGameQuan(flag: boolean): void { // if (Laya.Browser.window.wx == null) { // return; // } // if (flag) { // if (WeiXinSDK.button == null) { // let info = Laya.Browser.window.wx.getSystemInfoSync(); // if (!info) return; // var top = 474 * info.windowHeight / Laya.stage.height; // var height = 94 * info.windowHeight / Laya.stage.height; // var width = height * 95 / 94; // WeiXinSDK.button = Laya.Browser.window.wx.createGameClubButton // ({ // type: "image", // image: 'res/wx.png', // style: // { // left: 0, // top: top, // width: width, // height: height // } // }) // } // WeiXinSDK.button.show(); // } // else { // if (WeiXinSDK.button) { // WeiXinSDK.button.hide(); // } // } // } //退出 // 显示提示信息// WXSdk.ShowToast = function (text, icon) { if (icon === void 0) { icon = true; } if (Laya.Browser.window.wx) { var t_icon = icon ? "success" : "none"; Laya.Browser.window.wx.showToast({ title: text, icon: t_icon }); } else { console.log(text); } }; //1:pet 2:人物 // public static XianShi_Model(content: string, callback: Function = null, type = 1, title = "") { // if (Laya.Browser.window && Laya.Browser.window.wx) { // if (type == 1) { // var cancelText = "残忍丢掉"; // var confirmText = "带上一起"; // } else { // var cancelText = "不想"; // var confirmText = "想"; // } // Laya.Browser.window.wx.showModal({ // title: title, // content: content, // cancelText: cancelText, // confirmText: confirmText, // success(res) { // if (res.confirm) { // console.log('用户点击确定'); // callback(true); // } else if (res.cancel) { // console.log('用户点击取消'); // callback(false); // } // }, // fail(res?) { // console.log('用户点击取消'); // callback(false); // } // }) // } // } WXSdk.ShortVibrate = function () { if (Laya.Browser.window.wx && SettingController_1.SettingController.Instance.vibrate) { Laya.Browser.window.wx.vibrateShort({}); } }; WXSdk.LongVibrate = function () { if (Laya.Browser.window.wx && SettingController_1.SettingController.Instance.vibrate) { Laya.Browser.window.wx.vibrateLong({}); } }; WXSdk.HideLoading = function (isShowWx) { if (isShowWx === void 0) { isShowWx = true; } if (Laya.Browser.window && Laya.Browser.window.wx) { if (isShowWx) { Laya.Browser.window.wx.hideLoading(); } ViewManager_1.default.Instance.CloseMask(); } }; WXSdk.Success = function (stageId) { if (!Main_1.Main.IsWx) return; Laya.Browser.window.wx.aldStage.onEnd({ stageId: stageId, stageName: "第" + stageId + "关", event: "complete", params: { desc: "关卡完成" //描述 } }); }; //记录阿拉丁事件 WXSdk.AldEvent = function (eventName, key, value) { if (Laya.Browser.window && Laya.Browser.window.wx) { if (!key) key = "用户id"; if (!value) { value = ""; console.log(value); } Laya.Browser.window.wx.aldSendEvent(eventName, { key: value }); } }; WXSdk.Fail = function (stageId) { if (!Main_1.Main.IsWx) return; Laya.Browser.window.wx.aldStage.onEnd({ stageId: stageId, stageName: "第" + stageId + "关", event: "fail", params: { desc: "关卡失败", } }); }; // public static leveleRuning(stageId: string, userid: string, eventtype: number, itemName: string) { // if (Laya.Browser.window && Laya.Browser.window.wx) { // //Laya.Browser.window.wx.aldStage.onRunning({"stageId":stageId,"stageName":stageName,"userId":userid}); // var eventT = eventtype == 0 ? "award" : "revive"; // Laya.Browser.window.wx.aldStage.onRunning({ // stageId: stageId, // stageName: "第" + stageId + "关", // userId: userid, // event: eventT, // params: { // itemName: itemName, // } // }) // } // } WXSdk.Start = function (stageId) { if (!Main_1.Main.IsWx) return; Laya.Browser.window.wx.aldStage.onStart({ stageId: stageId, stageName: "第" + stageId + "关", }); }; WXSdk.Game_Share = function (callback, channel) { if (callback === void 0) { callback = null; } if (channel === void 0) { channel = ""; } if (!Main_1.Main.IsWx) { return; } var url; var title; url = UserModel_1.default.Instance.CurModel.shareimage; title = UserModel_1.default.Instance.CurModel.sharetitle; console.log(url + " " + title); if (channel != null) { // WeiXinSDK.AldEvent("用户分享"); } var t; // = UserModel.Get_Instance.CurModel.HuoQu_ServerTime; var path = ""; Laya.Browser.window.wx.aldShareAppMessage({ title: title, imageUrl: url, query: "shareid=" + UserModel_1.default.Instance.CurModel.userid + "_" + "other" + "_" + t + "_" + Math.floor(9999 * Math.random()).toString(), }); ShareModule_1.ShareModule.GoShare(callback); }; WXSdk.Lodining = false; return WXSdk; }()); exports.WXSdk = WXSdk; },{"../Main":2,"../game_logic/SettingController":12,"../game_logic/ViewManager":13,"./ShareModule":18,"./UserModel":19}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Dictionary = /** @class */ (function () { function Dictionary() { this._container = {}; this._length = 0; } Object.defineProperty(Dictionary.prototype, "container", { get: function () { return this._container; }, enumerable: true, configurable: true }); Object.defineProperty(Dictionary.prototype, "size", { //获取字典长度 get: function () { return this._length; }, enumerable: true, configurable: true }); //添加 Dictionary.prototype.set = function (key, value) { if (!this._container.hasOwnProperty(key)) { this._length++; } this._container[key] = value; }; //删除 Dictionary.prototype.delete = function (key) { if (this._container.hasOwnProperty(key)) { delete this._container[key]; this._length--; } }; //查找 Dictionary.prototype.has = function (key) { return this._container.hasOwnProperty(key) ? true : false; }; //获取 Dictionary.prototype.get = function (key) { if (this._container.hasOwnProperty(key)) { return this._container[key]; } else { return undefined; } }; //清空 Dictionary.prototype.clear = function () { this._container = {}; this._length = 0; }; return Dictionary; }()); exports.default = Dictionary; },{}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Game_Tool = /** @class */ (function () { function Game_Tool() { } Game_Tool.GetObjKey = function (obj) { if (obj == null) return null; for (var key in obj) { if (obj.hasOwnProperty(key)) { return key; } } }; //返回一个随机整数[min,max] Game_Tool.randomInt = function (min, max) { return parseInt(Math.random() * (max - min + 1) + min); }; //p1 左向量 p2 Game_Tool.getAng = function (xx, yy, obl) { return 180 / Math.PI * this.getRad(xx, yy, obl); }; //返回角度 Game_Tool.getRad = function (xx, yy, obl) { // 方法一:asin() // var rad:Number = xx > 0 ? ((Math.PI * 3)/2 + Math.asin(-yy/obl)) : (Math.PI / 2 - Math.asin(-yy/obl)); // 方法二:acos() var rad = yy < 0 ? Math.acos(xx / obl) : (Math.PI * 2 - Math.acos(xx / obl)); // 方法三:atan2() // var rad:Number = yy < 0 ? Math.atan2(-yy, xx) : Math.PI * 2 + Math.atan2(-yy, xx); return rad; }; Game_Tool.getM_Vector = function (v1, v2) { var temp = new Laya.Vector3(); Laya.Vector3.add(v1, v2, temp); return new Laya.Vector3(temp.x * 0.5, temp.y * 0.5, temp.z * 0.5); }; Game_Tool.getReflectAng = function (dir) { var xx = Math.abs(dir.x); var zz = Math.abs(dir.z); var obl = Math.sqrt(Math.pow(dir.x, 2) + Math.pow(dir.z, 2)); return 90 - 180 / Math.PI * Math.acos(xx / obl); }; Game_Tool.random_1to1 = function () { var iszheng = Math.random() > 0.5 ? -1 : 1; return Math.random() * iszheng; }; Game_Tool.get64Encode = function (str) { var c1, c2, c3; var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var i = 0, len = str.length, string = ''; while (i < len) { c1 = str.charCodeAt(i++) & 0xff; if (i == len) { string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt((c1 & 0x3) << 4); string += "=="; break; } c2 = str.charCodeAt(i++); if (i == len) { string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); string += base64EncodeChars.charAt((c2 & 0xF) << 2); string += "="; break; } c3 = str.charCodeAt(i++); string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6)); string += base64EncodeChars.charAt(c3 & 0x3F); } return string; }; // public static SetHuTuiList(list:Laya.List,data?,scrol:number=1,type:number=0){ //scrol 1:竖的 2横的 // var arr=data?data:FYHD_Sdk.pushData; // list.selectEnable = false; // scrol==1?list.vScrollBarSkin = "":list.hScrollBarSkin = ""; // list.renderHandler = Laya.Handler.create(this, this.updateItem, [type], false); // list.array = arr; // list.refresh(); // } // private static updateItem(type,cell: Laya.Box, index: number){ // var aditem=cell.getComponent(HuiTuiItem)as HuiTuiItem; // aditem.Refresh(type); // } // public static makeRandomArr(arrList,num){ // if(num>arrList.length){ // return; // } // var tempArr=arrList.slice(0); // var newArrList=[]; // for(var i=0;i 0) offestX = offestX < 5 ? offestX : 5; if (offestX < 0) offestX = offestX > -5 ? offestX : -5; var rotateDir = new Vector3(0, -offestX * 0.01, 0); RoleController_1.RoleController.Instance.RoleRotation(rotateDir); this.curMousePos = new Vector3(Laya.MouseManager.instance.mouseX, Laya.MouseManager.instance.mouseY); ; }; game_ui.prototype.OnClose = function () { EventManager_1.EventManager.off(Laya.Event.RESIZE, this, this.resizeHander); this.off(Laya.Event.MOUSE_DOWN, this, this.OnClickDown); this.off(Laya.Event.MOUSE_UP, this, this.OnClickUp); this.off(Laya.Event.MOUSE_OUT, this, this.OnClickUp); }; game_ui.prototype.MouseD = function () { var _this = this; this.isexceed = false; Laya.timer.once(500, this, function () { _this.isexceed = true; }); }; game_ui.prototype.MouseU = function () { var dis = Vector3.distance(this.startPos, this.endPos); if (dis > 30 || this.isexceed) { return; } else { GameController_1.GameController.Instance.Hit(); } }; return game_ui; }(layaMaxUI_1.ui.game_uiUI)); exports.game_ui = game_ui; },{"../game_logic/GameController":5,"../game_logic/RoleController":11,"../game_module/EventManager":14,"../ui/layaMaxUI":26}],25:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var layaMaxUI_1 = require("../ui/layaMaxUI"); var EventManager_1 = require("../game_module/EventManager"); var ViewManager_1 = require("../game_logic/ViewManager"); var GameController_1 = require("../game_logic/GameController"); var main_ui = /** @class */ (function (_super) { __extends(main_ui, _super); function main_ui() { var _this = _super.call(this) || this; _this.resizeHander(); EventManager_1.EventManager.on(Laya.Event.RESIZE, _this, _this.resizeHander); return _this; } main_ui.prototype.OnShow = function (data) { this.ButtonClickHandle(); }; main_ui.prototype.resizeHander = function () { this.height = Laya.stage.height; }; main_ui.prototype.ButtonClickHandle = function () { this.start_btn._mclickHandler = function () { ViewManager_1.default.Instance.OpenView(ViewManager_1.ViewType.game_ui); GameController_1.GameController.Instance.GameStart(); }; }; main_ui.prototype.OnClose = function () { this.start_btn.ClearRunTime(); }; return main_ui; }(layaMaxUI_1.ui.main_uiUI)); exports.main_ui = main_ui; },{"../game_logic/GameController":5,"../game_logic/ViewManager":13,"../game_module/EventManager":14,"../ui/layaMaxUI":26}],26:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Scene = Laya.Scene; var REG = Laya.ClassUtils.regClass; var ui; (function (ui) { var game_uiUI = /** @class */ (function (_super) { __extends(game_uiUI, _super); function game_uiUI() { return _super.call(this) || this; } game_uiUI.prototype.createChildren = function () { _super.prototype.createChildren.call(this); this.createView(game_uiUI.uiView); }; game_uiUI.uiView = { "type": "Scene", "props": { "zOrder": 1, "width": 720, "height": 1280 }, "compId": 2, "loadList": [], "loadList3D": [] }; return game_uiUI; }(Scene)); ui.game_uiUI = game_uiUI; REG("ui.game_uiUI", game_uiUI); var main_uiUI = /** @class */ (function (_super) { __extends(main_uiUI, _super); function main_uiUI() { return _super.call(this) || this; } main_uiUI.prototype.createChildren = function () { _super.prototype.createChildren.call(this); this.createView(main_uiUI.uiView); }; main_uiUI.uiView = { "type": "Scene", "props": { "zOrder": 1, "width": 720, "height": 1280 }, "compId": 2, "child": [{ "type": "Image", "props": { "y": 640, "x": 360, "var": "start_btn", "skin": "main_res/jiemian_xin_1_1.png", "runtime": "game_ui/RunTimeScript/ButtonRunTime.ts", "centerY": 0, "centerX": 0, "anchorY": 0.5, "anchorX": 0.5 }, "compId": 3 }], "loadList": ["main_res/jiemian_xin_1_1.png"], "loadList3D": [] }; return main_uiUI; }(Scene)); ui.main_uiUI = main_uiUI; REG("ui.main_uiUI", main_uiUI); })(ui = exports.ui || (exports.ui = {})); },{}]},{},[2]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkQ6L0xheWFCb3gvTGF5YTIuMS4wYmVhdC9MYXlhQWlySURFX2JldGEvcmVzb3VyY2VzL2FwcC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwic3JjL0dhbWVDb25maWcudHMiLCJzcmMvTWFpbi50cyIsInNyYy9nYW1lX2xvZ2ljL0J1bGxldC50cyIsInNyYy9nYW1lX2xvZ2ljL0J1bGxldENvbnRyb2xsZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9HYW1lQ29udHJvbGxlci50cyIsInNyYy9nYW1lX2xvZ2ljL0dhbWVTY2VuZUNvbnRyb2xsZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9Nb3N0ZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9QbGF5ZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9Qb29sX01hbmFnZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9Sb2xlLnRzIiwic3JjL2dhbWVfbG9naWMvUm9sZUNvbnRyb2xsZXIudHMiLCJzcmMvZ2FtZV9sb2dpYy9TZXR0aW5nQ29udHJvbGxlci50cyIsInNyYy9nYW1lX2xvZ2ljL1ZpZXdNYW5hZ2VyLnRzIiwic3JjL2dhbWVfbW9kdWxlL0V2ZW50TWFuYWdlci50cyIsInNyYy9nYW1lX21vZHVsZS9GWUhEX1Nkay50cyIsInNyYy9nYW1lX21vZHVsZS9HYW1lRGVmaW5lZC50cyIsInNyYy9nYW1lX21vZHVsZS9SZXNvdXJjZUxvYWQudHMiLCJzcmMvZ2FtZV9tb2R1bGUvU2hhcmVNb2R1bGUudHMiLCJzcmMvZ2FtZV9tb2R1bGUvVXNlck1vZGVsLnRzIiwic3JjL2dhbWVfbW9kdWxlL1dYU2RrLnRzIiwic3JjL2dhbWVfdG9vbC9EaWN0aW9uYXJ5LnRzIiwic3JjL2dhbWVfdG9vbC9HYW1lX1Rvb2wudHMiLCJzcmMvZ2FtZV91aS9SdW5UaW1lU2NyaXB0L0J1dHRvblJ1blRpbWUudHMiLCJzcmMvZ2FtZV91aS9nYW1lX3VpLnRzIiwic3JjL2dhbWVfdWkvbWFpbl91aS50cyIsInNyYy91aS9sYXlhTWF4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a0NBQWMsR0FBZDtZQUNJLGlCQUFNLGNBQWMsV0FBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFMYyxnQkFBTSxHQUFNLEVBQUMsTUFBTSxFQUFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxHQUFHLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxLQUFLLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyw4QkFBOEIsRUFBQyxTQUFTLEVBQUMsd0NBQXdDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxHQUFHLEVBQUMsU0FBUyxFQUFDLEdBQUcsRUFBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLDhCQUE4QixDQUFDLEVBQUMsWUFBWSxFQUFDLEVBQUUsRUFBQyxDQUFDO1FBTXJZLGdCQUFDO0tBUkQsQUFRQyxDQVI4QixLQUFLLEdBUW5DO0lBUlksWUFBUyxZQVFyQixDQUFBO0lBQ0QsR0FBRyxDQUFDLGNBQWMsRUFBQyxTQUFTLENBQUMsQ0FBQztBQUNsQyxDQUFDLEVBcEJhLEVBQUUsR0FBRixVQUFFLEtBQUYsVUFBRSxRQW9CZiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcbn0pKCk7XHJcbihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cclxuaW1wb3J0IEJ1dHRvblJ1blRpbWUgZnJvbSBcIi4vZ2FtZV91aS9SdW5UaW1lU2NyaXB0L0J1dHRvblJ1blRpbWVcIlxyXG4vKlxyXG4qIOa4uOaIj+WIneWni+WMlumFjee9rjtcclxuKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FtZUNvbmZpZ3tcclxuICAgIHN0YXRpYyB3aWR0aDpudW1iZXI9NzIwO1xyXG4gICAgc3RhdGljIGhlaWdodDpudW1iZXI9MTI4MDtcclxuICAgIHN0YXRpYyBzY2FsZU1vZGU6c3RyaW5nPVwiZml4ZWR3aWR0aFwiO1xyXG4gICAgc3RhdGljIHNjcmVlbk1vZGU6c3RyaW5nPVwibm9uZVwiO1xyXG4gICAgc3RhdGljIGFsaWduVjpzdHJpbmc9XCJtaWRkbGVcIjtcclxuICAgIHN0YXRpYyBhbGlnbkg6c3RyaW5nPVwiY2VudGVyXCI7XHJcbiAgICBzdGF0aWMgc3RhcnRTY2VuZTphbnk9XCJnYW1lX3VpLnNjZW5lXCI7XHJcbiAgICBzdGF0aWMgc2NlbmVSb290OnN0cmluZz1cIlwiO1xyXG4gICAgc3RhdGljIGRlYnVnOmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgc3RhdDpib29sZWFuPWZhbHNlO1xyXG4gICAgc3RhdGljIHBoeXNpY3NEZWJ1Zzpib29sZWFuPWZhbHNlO1xyXG4gICAgc3RhdGljIGV4cG9ydFNjZW5lVG9Kc29uOmJvb2xlYW49dHJ1ZTtcclxuICAgIGNvbnN0cnVjdG9yKCl7fVxyXG4gICAgc3RhdGljIGluaXQoKXtcclxuICAgICAgICB2YXIgcmVnOiBGdW5jdGlvbiA9IExheWEuQ2xhc3NVdGlscy5yZWdDbGFzcztcclxuICAgICAgICByZWcoXCJnYW1lX3VpL1J1blRpbWVTY3JpcHQvQnV0dG9uUnVuVGltZS50c1wiLEJ1dHRvblJ1blRpbWUpO1xyXG4gICAgfVxyXG59XHJcbkdhbWVDb25maWcuaW5pdCgpOyIsImltcG9ydCBHYW1lQ29uZmlnIGZyb20gXCIuL0dhbWVDb25maWdcIjtcclxuaW1wb3J0IFZpZXdNYW5hZ2VyLCB7IFZpZXdUeXBlIH0gZnJvbSBcIi4vZ2FtZV9sb2dpYy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgUmVzb3VyY2VMb2FkIGZyb20gXCIuL2dhbWVfbW9kdWxlL1Jlc291cmNlTG9hZFwiO1xyXG5pbXBvcnQgR2FtZURlZmluZWQgZnJvbSBcIi4vZ2FtZV9tb2R1bGUvR2FtZURlZmluZWRcIjtcclxuaW1wb3J0IHsgV1hTZGsgfSBmcm9tIFwiLi9nYW1lX21vZHVsZS9XWFNka1wiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuL2dhbWVfbW9kdWxlL0ZZSERfU2RrXCI7XHJcbmltcG9ydCBBc3NldENvbnRyb2xsZXIgZnJvbSBcIi4vZ2FtZV9sb2dpYy9Bc3NldENvbnRyb2xsZXJcIjtcclxuaW1wb3J0IEdhbWVTY2VuZUNvbnRyb2xsZXIgZnJvbSBcIi4vZ2FtZV9sb2dpYy9HYW1lU2NlbmVDb250cm9sbGVyXCI7XHJcbmV4cG9ydCBjbGFzcyBNYWluIHtcclxuXHJcblx0cHVibGljIHN0YXRpYyBub3dyYXRpbzogbnVtYmVyO1xyXG5cdHB1YmxpYyBzdGF0aWMgSXNXeDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHB1YmxpYyBzdGF0aWMgVlJFID0gXCIxLjAuMFwiO1xyXG5cdHB1YmxpYyBzdGF0aWMgQ0ZHID0gXCJDRkdcIjtcclxuXHRwdWJsaWMgc3RhdGljIHd4VmFsdWUgPSBcIlwiO1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0Ly/moLnmja5JREXorr7nva7liJ3lp4vljJblvJXmk45cdFx0XHJcblx0XHRpZiAod2luZG93W1wiTGF5YTNEXCJdKSBMYXlhM0QuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCk7XHJcblx0XHRlbHNlIExheWEuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCwgTGF5YVtcIldlYkdMXCJdKTtcclxuXHRcdExheWFbXCJQaHlzaWNzXCJdICYmIExheWFbXCJQaHlzaWNzXCJdLmVuYWJsZSgpO1xyXG5cdFx0TGF5YVtcIkRlYnVnUGFuZWxcIl0gJiYgTGF5YVtcIkRlYnVnUGFuZWxcIl0uZW5hYmxlKCk7XHJcblx0XHRMYXlhLnN0YWdlLnNjYWxlTW9kZSA9IEdhbWVDb25maWcuc2NhbGVNb2RlO1xyXG5cdFx0TGF5YS5zdGFnZS5zY3JlZW5Nb2RlID0gR2FtZUNvbmZpZy5zY3JlZW5Nb2RlO1xyXG5cdFx0Ly/lhbzlrrnlvq7kv6HkuI3mlK/mjIHliqDovb1zY2VuZeWQjue8gOWcuuaZr1xyXG5cdFx0TGF5YS5VUkwuZXhwb3J0U2NlbmVUb0pzb24gPSBHYW1lQ29uZmlnLmV4cG9ydFNjZW5lVG9Kc29uO1xyXG5cclxuXHRcdC8v5omT5byA6LCD6K+V6Z2i5p2/77yI6YCa6L+HSURF6K6+572u6LCD6K+V5qih5byP77yM5oiW6ICFdXJs5Zyw5Z2A5aKe5YqgZGVidWc9dHJ1ZeWPguaVsO+8jOWdh+WPr+aJk+W8gOiwg+ivlemdouadv++8iVxyXG5cdFx0aWYgKEdhbWVDb25maWcuZGVidWcgfHwgTGF5YS5VdGlscy5nZXRRdWVyeVN0cmluZyhcImRlYnVnXCIpID09IFwidHJ1ZVwiKSBMYXlhLmVuYWJsZURlYnVnUGFuZWwoKTtcclxuXHRcdGlmIChHYW1lQ29uZmlnLnBoeXNpY3NEZWJ1ZyAmJiBMYXlhW1wiUGh5c2ljc0RlYnVnRHJhd1wiXSkgTGF5YVtcIlBoeXNpY3NEZWJ1Z0RyYXdcIl0uZW5hYmxlKCk7XHJcblx0XHRpZiAoR2FtZUNvbmZpZy5zdGF0KSBMYXlhLlN0YXQuc2hvdygpO1xyXG5cdFx0TGF5YS5hbGVydEdsb2JhbEVycm9yID0gdHJ1ZTtcclxuXHRcdE1haW4ubm93cmF0aW8gPSBMYXlhLnN0YWdlLndpZHRoIC8gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcblxyXG5cdFx0TWFpbi5Jc1d4ID0gTGF5YS5Ccm93c2VyLm9uV2VpWGluO1xyXG5cclxuXHRcdGlmIChNYWluLklzV3gpIHtcclxuXHRcdFx0V1hTZGsuSW5zdGFuY2UuaW5pdCgoc2hhcmVUaWNrZXQ6IHN0cmluZywgc2hhcmVpZDogc3RyaW5nLCBzY2VuZTogc3RyaW5nLCBhcHBpZDogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5vblNob3dIYW5kbGVyKHNoYXJlVGlja2V0LCBzaGFyZWlkLCBzY2VuZSwgYXBwaWQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0RllIRF9TZGsuSW5pdFNkaygpO1xyXG5cdFx0fVxyXG5cdFx0Ly/mv4DmtLvotYTmupDniYjmnKzmjqfliLbvvIx2ZXJzaW9uLmpzb27nlLFJREXlj5HluIPlip/og73oh6rliqjnlJ/miJDvvIzlpoLmnpzmsqHmnInkuZ/kuI3lvbHlk43lkI7nu63mtYHnqItcclxuXHRcdExheWEuUmVzb3VyY2VWZXJzaW9uLmVuYWJsZShcInZlcnNpb24uanNvblwiLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25WZXJzaW9uTG9hZGVkKSwgTGF5YS5SZXNvdXJjZVZlcnNpb24uRklMRU5BTUVfVkVSU0lPTik7XHJcblx0XHR0aGlzLklzTmVlZFVwZGF0ZSgpO1xyXG5cdH1cclxuXHRwcml2YXRlIElzTmVlZFVwZGF0ZSgpIHtcclxuXHRcdGlmICghTWFpbi5Jc1d4KSByZXR1cm47XHJcblx0XHRjb25zdCB1cGRhdGVNYW5hZ2VyID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRVcGRhdGVNYW5hZ2VyKCk7XHJcblx0XHR1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoZnVuY3Rpb24gKHJlcykge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcIuacgOaWsOeJiOacrDpcIiArIHJlcy5oYXNVcGRhdGUpO1xyXG5cdFx0fVxyXG5cdFx0KTtcclxuXHRcdHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeShmdW5jdGlvbiAoKSB7XHJcblx0XHRcdExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKHtcclxuXHRcdFx0XHRzaG93Q2FuY2VsOiBmYWxzZSxcclxuXHRcdFx0XHR0aXRsZTogJ+abtOaWsOaPkOekuicsXHJcblx0XHRcdFx0Y29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXHJcblx0XHRcdFx0c3VjY2VzcyhyZXMpIHtcclxuXHRcdFx0XHRcdHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGZhaWwocmVzPykge1xyXG5cdFx0XHRcdFx0dXBkYXRlTWFuYWdlci5hcHBseVVwZGF0ZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb25TaG93SGFuZGxlcihzaGFyZVRpY2tldDogc3RyaW5nLCBzaGFyZUlkOiBzdHJpbmcsIHNjZW5lOiBzdHJpbmcsIGFwcGlkOiBzdHJpbmcpIHtcclxuXHRcdGNvbnNvbGUubG9nKFwiW0xPR106IOWIhuS6q+i/m+WFpTogc2hhcmVUaWNrZXQ6XCIsIHNoYXJlVGlja2V0LCBcIiwgb3BlbklkPVwiLCBzaGFyZUlkLCBcIiwgc2NlbmU9XCIsIHNjZW5lKTtcclxuXHRcdC8vIGlmICghTWFpbi5tU2hhcmVQZW9wbGVTY2VuZSkge1xyXG5cdFx0Ly8gXHRNYWluLm1TaGFyZVBlb3BsZVNjZW5lID0gc2NlbmU7XHJcblx0XHQvLyB9XHJcblx0XHQvLyBpZiAoIU1haW4uYXBwaWQpIHtcclxuXHRcdC8vIFx0TWFpbi5hcHBpZCA9IGFwcGlkO1xyXG5cdFx0Ly8gfVxyXG5cdFx0aWYgKHNjZW5lICE9IG51bGwgJiYgc2NlbmUgIT0gXCJcIikge1xyXG5cdFx0XHRXWFNkay5JbnN0YW5jZS5TaGFyZVNjZW5lID0gc2NlbmU7XHJcblx0XHR9XHJcblx0XHRpZiAoc2hhcmVJZCAhPSBudWxsICYmIHNoYXJlSWQgIT0gXCJcIikge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcIuiuvue9ruWIhuS6q2lkXCIgKyBzaGFyZUlkKTtcclxuXHRcdFx0V1hTZGsuSW5zdGFuY2Uuc2V0U2hhcmVJZChzaGFyZUlkKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uVmVyc2lvbkxvYWRlZCgpOiB2b2lkIHtcclxuXHRcdC8v5r+A5rS75aSn5bCP5Zu+5pig5bCE77yM5Yqg6L295bCP5Zu+55qE5pe25YCZ77yM5aaC5p6c5Y+R546w5bCP5Zu+5Zyo5aSn5Zu+5ZCI6ZuG6YeM6Z2i77yM5YiZ5LyY5YWI5Yqg6L295aSn5Zu+5ZCI6ZuG77yM6ICM5LiN5piv5bCP5Zu+XHJcblx0XHRMYXlhLkF0bGFzSW5mb01hbmFnZXIuZW5hYmxlKFwiZmlsZWNvbmZpZy5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkNvbmZpZ0xvYWRlZCkpO1xyXG5cdFx0TGF5YS5Nb3VzZU1hbmFnZXIubXVsdGlUb3VjaEVuYWJsZWQgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdG9uQ29uZmlnTG9hZGVkKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5Mb2FkVUkoKTtcclxuXHR9XHJcblx0TG9hZFVJKCkge1xyXG5cdFx0Vmlld01hbmFnZXIuSW5zdGFuY2UuT3BlblZpZXcoVmlld1R5cGUubWFpbl91aSk7XHJcblx0XHRHYW1lU2NlbmVDb250cm9sbGVyLkluc3RhbmNlLkNyZWF0ZVNjZW5lKCk7XHJcblx0XHRcdC8vdGhpcy50ZXN0KCk7XHJcblx0fVxyXG5cclxuXHR0ZXN0KCkge1xyXG5cdFx0dmFyIHYxPW5ldyBMYXlhLlZlY3RvcjMoLTMsMCwxKTtcclxuXHRcdHZhciB2Mj1uZXcgTGF5YS5WZWN0b3IzKDAsMCwtMSk7XHJcblx0XHR2YXIgdjM9bmV3IExheWEuVmVjdG9yMygwLDAsMCk7XHJcblx0XHRMYXlhLlZlY3RvcjMuY3Jvc3ModjEsdjIsdjMpO1xyXG5cdFx0Y29uc29sZS5sb2codjMpO1xyXG5cdH1cclxufVxyXG4vL+a/gOa0u+WQr+WKqOexu1xyXG5uZXcgTWFpbigpO1xyXG4iLCJcclxuaW1wb3J0IEdhbWVEZWZpbmVkLCB7IENoZWNrVHlwZSwgQnVsbGV0VHlwZSB9IGZyb20gXCIuLi9nYW1lX21vZHVsZS9HYW1lRGVmaW5lZFwiO1xyXG5pbXBvcnQgVmVjdG9yMyA9IExheWEuVmVjdG9yMztcclxuaW1wb3J0IFJheSA9IExheWEuUmF5O1xyXG5pbXBvcnQgSGl0UmVzdWx0ID0gTGF5YS5IaXRSZXN1bHQ7XHJcbmltcG9ydCBHYW1lU2NlbmVDb250cm9sbGVyIGZyb20gXCIuL0dhbWVTY2VuZUNvbnRyb2xsZXJcIjtcclxuaW1wb3J0IEJ1bGxldENvbnRyb2xsZXIgZnJvbSBcIi4vQnVsbGV0Q29udHJvbGxlclwiO1xyXG5pbXBvcnQgU3ByaXRlM0QgPSBMYXlhLlNwcml0ZTNEO1xyXG5pbXBvcnQgVHJhbnNmb3JtM0QgPSBMYXlhLlRyYW5zZm9ybTNEO1xyXG5pbXBvcnQgR2FtZV9Ub29sIGZyb20gXCIuLi9nYW1lX3Rvb2wvR2FtZV9Ub29sXCI7XHJcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gXCIuLi9nYW1lX21vZHVsZS9FdmVudE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL1JvbGVcIjtcclxuZXhwb3J0IGNsYXNzIEJ1bGxldCBleHRlbmRzIExheWEuU2NyaXB0M0Qge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06IFRyYW5zZm9ybTNEO1xyXG4gICAgcHJpdmF0ZSBzZWxmOiBTcHJpdGUzRDtcclxuICAgIG9uQXdha2UoKSB7XHJcbiAgICAgICAgdGhpcy5zZWxmID0gdGhpcy5vd25lciBhcyBTcHJpdGUzRDtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSB0aGlzLnNlbGYudHJhbnNmb3JtO1xyXG4gICAgICAgIHRoaXMuZm9ydyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG4gICAgICAgIHRoaXMuX2NvcnNzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb3J3OiBWZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBfcmF5OiBSYXk7XHJcbiAgICBwcml2YXRlIF9oaXQ6IEhpdFJlc3VsdDtcclxuICAgIHByaXZhdGUgZ286IFNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBnb1M6IEJ1bGxldDtcclxuICAgIHByaXZhdGUgX2NvcnNzOiBWZWN0b3IzO1xyXG4gICAgQ3JlYXRlUmF5KHBvczogVmVjdG9yMywgX3JvdGF0aW9uLCBfdHlwZT8pIHtcclxuICAgICAgICBpZiAoIXRoaXMuZ28pIHtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgQnVsbGV0VHlwZS5CdWxsZXRHOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ28gPSBCdWxsZXRDb250cm9sbGVyLkluc3RhbmNlLkNyZWF0ZUJ1bGxldChHYW1lRGVmaW5lZC5wb29sTmFtZS5idWxsZXRHKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIEJ1bGxldFR5cGUuQnVsbGV0UjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdvID0gQnVsbGV0Q29udHJvbGxlci5JbnN0YW5jZS5DcmVhdGVCdWxsZXQoR2FtZURlZmluZWQucG9vbE5hbWUuQnVsbGV0Uik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGdzID0gdGhpcy5nby5nZXRDb21wb25lbnQoQnVsbGV0KTtcclxuICAgICAgICAgICAgaWYgKCFncykgdGhpcy5nb1MgPSB0aGlzLmdvLmFkZENvbXBvbmVudChCdWxsZXQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ28uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3MuY2xvbmUoKTtcclxuICAgICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5yb3RhdGlvbkV1bGVyID0gX3JvdGF0aW9uO1xyXG4gICAgICAgIHRoaXMuZ28udHJhbnNmb3JtLnJvdGF0ZSA9IF9yb3RhdGlvbjtcclxuICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5nZXRGb3J3YXJkKHRoaXMuZm9ydyk7XHJcbiAgICAgICAgdGhpcy5mb3J3ID0gbmV3IFZlY3RvcjMoLXRoaXMuZm9ydy54LCAtdGhpcy5mb3J3LnksIC10aGlzLmZvcncueik7XHJcbiAgICAgICAgdmFyIHRlbXAgPSB0aGlzLmZvcncuY2xvbmUoKTtcclxuICAgICAgICBWZWN0b3IzLm5vcm1hbGl6ZSh0ZW1wLCB0ZW1wKTtcclxuICAgICAgICBwb3MueCA9IHBvcy54ICsgdGVtcC54ICogMC4wMTtcclxuICAgICAgICBwb3MueSA9IHBvcy55ICsgdGVtcC55ICogMC4wMTtcclxuICAgICAgICBwb3MueiA9IHBvcy56ICsgdGVtcC56ICogMC4wMTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9yYXkpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmF5ID0gbmV3IFJheShwb3MsIHRoaXMuZm9ydyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hpdCA9IG5ldyBIaXRSZXN1bHQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkub3JpZ2luID0gcG9zO1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkuZGlyZWN0aW9uID0gdGhpcy5mb3J3O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGlzUyA9IEdhbWVTY2VuZUNvbnRyb2xsZXIuSW5zdGFuY2UuZ2FtZV9zY2VuZS5waHlzaWNzU2ltdWxhdGlvbi5yYXlDYXN0KHRoaXMuX3JheSwgdGhpcy5faGl0KTtcclxuICAgICAgICBpZiAoaXNTKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2kgPSB0aGlzLl9oaXQucG9pbnQ7XHJcbiAgICAgICAgICAgIHZhciBkaXMgPSBWZWN0b3IzLmRpc3RhbmNlKHBvcywgcG9pKTtcclxuICAgICAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ubG9jYWxTY2FsZVogPSBkaXM7XHJcbiAgICAgICAgICAgIHZhciBvdGhlciA9IHRoaXMuX2hpdC5jb2xsaWRlci5vd25lciBhcyBTcHJpdGUzRDtcclxuICAgICAgICAgICAgaWYgKG90aGVyLmxheWVyID09IEdhbWVEZWZpbmVkLnBsYXllcl9sYXllciB8fCBvdGhlci5sYXllciA9PSBHYW1lRGVmaW5lZC5tb3N0ZXJfbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcFBvcyA9IHBvcztcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcFJvdGF0aW9uID0gX3JvdGF0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRUYXIob3RoZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nb1MuU2V0TmV4dE5vdEFjdGl2ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZW1vdmVUYXIoKTtcclxuICAgICAgICAgICAgICAgIHZhciBub3IgPSB0aGlzLl9oaXQubm9ybWFsO1xyXG4gICAgICAgICAgICAgICAgbm9yLnggPSBNYXRoLmFicyhub3IueCkgPCAwLjAwMSA/IDAgOiBub3IueDtcclxuICAgICAgICAgICAgICAgIG5vci55ID0gTWF0aC5hYnMobm9yLnkpIDwgMC4wMDEgPyAwIDogbm9yLnk7XHJcbiAgICAgICAgICAgICAgICBub3IueiA9IE1hdGguYWJzKG5vci56KSA8IDAuMDAxID8gMCA6IG5vci56O1xyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgVmVjdG9yMy5jcm9zcyh0aGlzLmZvcncsIG5vciwgdGhpcy5fY29yc3MpOy8v5aSn5LqOMOWcqOW3puaWuSDlsI/kuo4w5Zyo5Y+z5pa5XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBhID0gR2FtZV9Ub29sLmdldFJlZmxlY3RBbmcodGhpcy5mb3J3KTtcclxuICAgICAgICAgICAgICAgIC8vIExheWEuUXVhdGVybmlvbi5cclxuICAgICAgICAgICAgICAgIHZhciBhbmcgPSB0aGlzLmdvLl90cmFuc2Zvcm0ucm90YXRpb25FdWxlci5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29yc3MueSA+PSAwID8gYW5nLnkgPSBhbmcueSArIDIgKiBhIDogYW5nLnkgPSBhbmcueSAtIDIgKiBhO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZhciBhYj1uZXcgTGF5YS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSh0aGlzLmZvcncsLWEsYWIpXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmdvUy5DcmVhdGVSYXkocG9pLCBhYiwgQnVsbGV0VHlwZS5CdWxsZXRHKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5nb1MuQ3JlYXRlUmF5KHBvaSwgYW5nLCBfdHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLlJlbW92ZVRhcigpO1xyXG4gICAgICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5sb2NhbFNjYWxlWiA9IDUwO1xyXG4gICAgICAgICAgICB0aGlzLmdvUy5TZXROZXh0Tm90QWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFNldE5leHROb3RBY3RpdmUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ28pIHtcclxuICAgICAgICAgICAgdGhpcy5nby5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ29TKSB0aGlzLmdvUy5TZXROZXh0Tm90QWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEhpdFRhcjogU3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIFJlbW92ZVRhcigpIHtcclxuICAgICAgICBpZiAodGhpcy5IaXRUYXIpIHtcclxuICAgICAgICAgICAgdGhpcy5IaXRUYXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgU2V0VGFyKHRhcikge1xyXG4gICAgICAgIHRoaXMuSGl0VGFyID0gdGFyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIHRlbXBQb3M6IFZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHRlbXBSb3RhdGlvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBIaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuSGl0VGFyKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkhpdFRhci5sYXllciA9PSBHYW1lRGVmaW5lZC5wbGF5ZXJfbGF5ZXIgfHwgdGhpcy5IaXRUYXIubGF5ZXIgPT0gR2FtZURlZmluZWQubW9zdGVyX2xheWVyKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuSGl0VGFyLmdldENvbXBvbmVudChSb2xlKSBhcyBSb2xlO1xyXG4gICAgICAgICAgICAgICAgci5IaXRFZCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DcmVhdGVSYXkodGhpcy50ZW1wUG9zLCB0aGlzLnRlbXBSb3RhdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25FbmFibGUoKSB7XHJcbiAgICAgICAgRXZlbnRNYW5hZ2VyLm9uKEdhbWVEZWZpbmVkLkhpdEV2ZW50LCB0aGlzLCB0aGlzLkhpdCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EaXNhYmxlKCkge1xyXG4gICAgICAgIEV2ZW50TWFuYWdlci5vZmYoR2FtZURlZmluZWQuSGl0RXZlbnQsIHRoaXMsIHRoaXMuSGl0KTtcclxuICAgIH1cclxufSIsImltcG9ydCBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0Q7XHJcbmltcG9ydCB7IFBvb2xfTWFuYWdlciB9IGZyb20gXCIuL1Bvb2xfTWFuYWdlclwiO1xyXG5pbXBvcnQgR2FtZURlZmluZWQgZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0dhbWVEZWZpbmVkXCI7XHJcbmltcG9ydCBHYW1lU2NlbmVDb250cm9sbGVyIGZyb20gXCIuL0dhbWVTY2VuZUNvbnRyb2xsZXJcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVsbGV0Q29udHJvbGxlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQnVsbGV0Q29udHJvbGxlcjtcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IEJ1bGxldENvbnRyb2xsZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlIHx8ICh0aGlzLmluc3RhbmNlID0gbmV3IEJ1bGxldENvbnRyb2xsZXIoKSk7XHJcbiAgICB9XHJcbiAgIC8vIHByaXZhdGUgYnVsbGV0UHJlZjogU3ByaXRlM0Q7XHJcbiAgICBwdWJsaWMgaW5pdChidWxsZXQ6IFNwcml0ZTNELHBvb2xOYW1lOnN0cmluZykge1xyXG4gICAgICAgIGJ1bGxldC5yZW1vdmVTZWxmKCk7XHJcbiAgICAgIC8vICB0aGlzLmJ1bGxldFByZWYgPSBidWxsZXQ7XHJcbiAgICAgICAgUG9vbF9NYW5hZ2VyLkluc3RhbmNlLkluaXREYXRhKHBvb2xOYW1lLCBidWxsZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVsbGV0OiBTcHJpdGUzRDtcclxuICAgIHB1YmxpYyBDcmVhdGVCdWxsZXQoYnVsbGV0TmFtZSk6IFNwcml0ZTNEIHtcclxuICAgICAgICAvL2lmICh0aGlzLmJ1bGxldCkgcmV0dXJuIHRoaXMuYnVsbGV0O1xyXG4gICAgICAgIHZhciBnbyA9IFBvb2xfTWFuYWdlci5JbnN0YW5jZS5TZXRBY3RpdmVPYmplY3QoYnVsbGV0TmFtZSk7XHJcbiAgICAgICAgR2FtZVNjZW5lQ29udHJvbGxlci5JbnN0YW5jZS5nYW1lX3NjZW5lLmFkZENoaWxkKGdvKTtcclxuICAgICAgIC8vIHRoaXMuYnVsbGV0ID0gZ287XHJcbiAgICAgICAgcmV0dXJuIGdvO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gXCIuLi9nYW1lX21vZHVsZS9FdmVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEdhbWVEZWZpbmVkIGZyb20gXCIuLi9nYW1lX21vZHVsZS9HYW1lRGVmaW5lZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdhbWVDb250cm9sbGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3Rhc25jZTogR2FtZUNvbnRyb2xsZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBHYW1lQ29udHJvbGxlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFzbmNlIHx8ICh0aGlzLmluc3Rhc25jZSA9IG5ldyBHYW1lQ29udHJvbGxlcigpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGlzaGl0ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgSGl0KCkge1xyXG4gICAgICAgIEV2ZW50TWFuYWdlci5ldmVudChHYW1lRGVmaW5lZC5IaXRFdmVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnYW1lU3RhcnQgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBnYW1lb3ZlciA9IHRydWU7XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2FtZVN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuZ2FtZVN0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmdhbWVvdmVyID0gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgUmVzb3VyY2VMb2FkIGZyb20gXCIuLi9nYW1lX21vZHVsZS9SZXNvdXJjZUxvYWRcIjtcclxuaW1wb3J0IFNjZW5lM0QgPSBMYXlhLlNjZW5lM0Q7XHJcbmltcG9ydCBCdWxsZXRDb250cm9sbGVyIGZyb20gXCIuL0J1bGxldENvbnRyb2xsZXJcIjtcclxuaW1wb3J0IHsgUm9sZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi9Sb2xlQ29udHJvbGxlclwiO1xyXG5pbXBvcnQgR2FtZURlZmluZWQgZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0dhbWVEZWZpbmVkXCI7XHJcbmltcG9ydCBTcHJpdGUzRD1MYXlhLlNwcml0ZTNEO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lU2NlbmVDb250cm9sbGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBHYW1lU2NlbmVDb250cm9sbGVyO1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogR2FtZVNjZW5lQ29udHJvbGxlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UgfHwgKHRoaXMuaW5zdGFuY2UgPSBuZXcgR2FtZVNjZW5lQ29udHJvbGxlcigpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdhbWVfc2NlbmU6IFNjZW5lM0Q7XHJcbiAgXHJcbiAgICBwdWJsaWMgQ3JlYXRlU2NlbmUoKSB7XHJcbiAgICAgICAgUmVzb3VyY2VMb2FkLkxvYWRSZXNvdXJjZShbR2FtZURlZmluZWQuZ2FtZV9zY2VuZV9wYXRoXSwgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgdCA9IExheWEubG9hZGVyLmdldFJlcyhHYW1lRGVmaW5lZC5nYW1lX3NjZW5lX3BhdGgpIGFzIFNjZW5lM0Q7XHJcbiAgICAgICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2FtZV9zY2VuZSA9IHQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgX2J1bGxldEcgPSB0LmdldENoaWxkQnlOYW1lKFwiYnVsbGV0R1wiKSBhcyBTcHJpdGUzRDtcclxuICAgICAgICAgICAgdmFyIF9idWxsZXRSPXQuZ2V0Q2hpbGRCeU5hbWUoXCJidWxsZXRSXCIpYXMgU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIEJ1bGxldENvbnRyb2xsZXIuSW5zdGFuY2UuaW5pdChfYnVsbGV0RyxHYW1lRGVmaW5lZC5wb29sTmFtZS5idWxsZXRHKTtcclxuICAgICAgICAgICAgQnVsbGV0Q29udHJvbGxlci5JbnN0YW5jZS5pbml0KF9idWxsZXRSLEdhbWVEZWZpbmVkLnBvb2xOYW1lLkJ1bGxldFIpO1xyXG5cclxuICAgICAgICAgICAgLy8gdmFyIF9yb2xlMSA9IHQuZ2V0Q2hpbGRCeU5hbWUoXCJyb2xlMVwiKSBhcyBTcHJpdGUzRDtcclxuICAgICAgICAgICAgLy8gdmFyIF9yb2xlMiA9IHQuZ2V0Q2hpbGRCeU5hbWUoXCJyb2xlMlwiKSBhcyBTcHJpdGUzRDtcclxuXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyB2YXIgX21vc3RlcjEgPSB0LmdldENoaWxkQnlOYW1lKFwibW9zdGVyMVwiKSBhcyBTcHJpdGUzRDtcclxuICAgICAgICAgICAgLy8gdmFyIF9tb3N0ZXIyPSB0LmdldENoaWxkQnlOYW1lKFwibW9zdGVyMlwiKSBhcyBTcHJpdGUzRDtcclxuICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgdmFyIHBsYXllcnM9dC5nZXRDaGlsZEJ5TmFtZShcIlBsYXllcnNcIilhcyBTcHJpdGUzRDtcclxuICAgICAgICAgICAgdmFyIG1vc3RlcnM9dC5nZXRDaGlsZEJ5TmFtZShcIk1vc3RlcnNcIilhcyBTcHJpdGUzRDtcclxuXHJcbiAgICAgICAgICAgIFJvbGVDb250cm9sbGVyLkluc3RhbmNlLmluaXRQbGF5ZXIocGxheWVycy5fY2hpbGRyZW4pO1xyXG5cclxuICAgICAgICAgICAgUm9sZUNvbnRyb2xsZXIuSW5zdGFuY2UuaW5pdE1vc3Rlcihtb3N0ZXJzLl9jaGlsZHJlbik7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIFJvbGVDb250cm9sbGVyLkluc3RhbmNlLkNyZWF0ZVJheSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufSIsIlxyXG5pbXBvcnQgR2FtZURlZmluZWQsIHsgQ2hlY2tUeXBlLCBCdWxsZXRUeXBlIH0gZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0dhbWVEZWZpbmVkXCI7XHJcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9Sb2xlXCI7XHJcbmltcG9ydCBWZWN0b3IzPUxheWEuVmVjdG9yMztcclxuaW1wb3J0IFJheT1MYXlhLlJheTtcclxuaW1wb3J0IEhpdFJlc3VsdD1MYXlhLkhpdFJlc3VsdDtcclxuaW1wb3J0IFNwcml0ZTNEPUxheWEuU3ByaXRlM0RcclxuaW1wb3J0IHsgQnVsbGV0IH0gZnJvbSBcIi4vQnVsbGV0XCI7XHJcbmltcG9ydCBCdWxsZXRDb250cm9sbGVyIGZyb20gXCIuL0J1bGxldENvbnRyb2xsZXJcIjtcclxuaW1wb3J0IEdhbWVTY2VuZUNvbnRyb2xsZXIgZnJvbSBcIi4vR2FtZVNjZW5lQ29udHJvbGxlclwiO1xyXG5pbXBvcnQgR2FtZV9Ub29sIGZyb20gXCIuLi9nYW1lX3Rvb2wvR2FtZV9Ub29sXCI7XHJcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gXCIuLi9nYW1lX21vZHVsZS9FdmVudE1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNb3N0ZXIgZXh0ZW5kcyBSb2xlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Bd2FrZSgpIHtcclxuICAgICAgICBzdXBlci5vbkF3YWtlKCk7XHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IENoZWNrVHlwZS5Nb3N0ZXI7XHJcbiAgICAgICAgdGhpcy5mb3J3ID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAgICAgdGhpcy5fY29yc3MgPSBuZXcgVmVjdG9yMygwLCAwLCAwKTtcclxuICAgICAgICB0aGlzLl9idWxsZXRQb3MgPSB0aGlzLnNlbGYuZ2V0Q2hpbGRCeU5hbWUoXCJidWxsZXRQb3NcIikgYXMgU3ByaXRlM0Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb3J3OiBWZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBfcmF5OiBSYXk7XHJcbiAgICBwcml2YXRlIF9oaXQ6IEhpdFJlc3VsdDtcclxuXHJcbiAgICBwcml2YXRlIF9jb3JzczogVmVjdG9yMztcclxuXHJcbiAgICBwcml2YXRlIGdvOiBTcHJpdGUzRDtcclxuICAgIHByaXZhdGUgZ29TOiBCdWxsZXQ7XHJcbiAgICBDcmVhdGVSYXkoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLmdldEZvcndhcmQodGhpcy5mb3J3KTtcclxuICAgICAgICB0aGlzLmZvcncgPSBuZXcgVmVjdG9yMygtdGhpcy5mb3J3LngsIC10aGlzLmZvcncueSwgLXRoaXMuZm9ydy56KTtcclxuICAgICAgICBpZiAoIXRoaXMuX3JheSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkgPSBuZXcgUmF5KHRoaXMuX2J1bGxldFBvcy50cmFuc2Zvcm0ucG9zaXRpb24sIHRoaXMuZm9ydyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hpdCA9IG5ldyBIaXRSZXN1bHQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkub3JpZ2luID0gdGhpcy5fYnVsbGV0UG9zLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5fcmF5LmRpcmVjdGlvbiA9IHRoaXMuZm9ydztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmdvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ28gPSBCdWxsZXRDb250cm9sbGVyLkluc3RhbmNlLkNyZWF0ZUJ1bGxldChHYW1lRGVmaW5lZC5wb29sTmFtZS5CdWxsZXRSKTtcclxuICAgICAgICAgICAgdmFyIGdzID0gdGhpcy5nby5nZXRDb21wb25lbnQoQnVsbGV0KTtcclxuICAgICAgICAgICAgaWYgKCFncykgdGhpcy5nb1MgPSB0aGlzLmdvLmFkZENvbXBvbmVudChCdWxsZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX2J1bGxldFBvcy50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ucm90YXRpb24gPSB0aGlzLl90cmFuc2Zvcm0ucm90YXRpb247XHJcbiAgICAgICAgdmFyIGlzUyA9IEdhbWVTY2VuZUNvbnRyb2xsZXIuSW5zdGFuY2UuZ2FtZV9zY2VuZS5waHlzaWNzU2ltdWxhdGlvbi5yYXlDYXN0KHRoaXMuX3JheSwgdGhpcy5faGl0KTtcclxuICAgICAgICBpZiAoaXNTKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2kgPSB0aGlzLl9oaXQucG9pbnQ7XHJcbiAgICAgICAgICAgIHZhciBkaXMgPSBWZWN0b3IzLmRpc3RhbmNlKHRoaXMuX2J1bGxldFBvcy50cmFuc2Zvcm0ucG9zaXRpb24sIHBvaSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ28udHJhbnNmb3JtLmxvY2FsU2NhbGVaID0gZGlzO1xyXG5cclxuICAgICAgICAgICAgdmFyIG90aGVyID0gdGhpcy5faGl0LmNvbGxpZGVyLm93bmVyIGFzIFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBpZiAob3RoZXIubGF5ZXIgPT0gR2FtZURlZmluZWQucGxheWVyX2xheWVyIHx8IG90aGVyLmxheWVyID09IEdhbWVEZWZpbmVkLm1vc3Rlcl9sYXllcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRUYXIob3RoZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nb1MuU2V0TmV4dE5vdEFjdGl2ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZW1vdmVUYXIoKTtcclxuICAgICAgICAgICAgICAgIHZhciBub3IgPSB0aGlzLl9oaXQubm9ybWFsO1xyXG4gICAgICAgICAgICAgICAgbm9yLnggPSBNYXRoLmFicyhub3IueCkgPCAwLjAwMSA/IDAgOiBub3IueDtcclxuICAgICAgICAgICAgICAgIG5vci55ID0gTWF0aC5hYnMobm9yLnkpIDwgMC4wMDEgPyAwIDogbm9yLnk7XHJcbiAgICAgICAgICAgICAgICBub3IueiA9IE1hdGguYWJzKG5vci56KSA8IDAuMDAxID8gMCA6IG5vci56O1xyXG4gICAgICAgICAgICAgICAgVmVjdG9yMy5jcm9zcyh0aGlzLmZvcncsIG5vciwgdGhpcy5fY29yc3MpOy8v5aSn5LqOMOWcqOW3puaWuSDlsI/kuo4w5Zyo5Y+z5pa5XHJcbiAgICAgICAgICAgICAgICB2YXIgYSA9IEdhbWVfVG9vbC5nZXRSZWZsZWN0QW5nKHRoaXMuZm9ydyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgYW5nID0gdGhpcy5fdHJhbnNmb3JtLnJvdGF0aW9uRXVsZXIuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvcnNzLnkgPj0gMCA/IGFuZy55ID0gYW5nLnkgKyAyICogYSA6IGFuZy55ID0gYW5nLnkgLSAyICogYTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ29TLkNyZWF0ZVJheShwb2ksIGFuZyxCdWxsZXRUeXBlLkJ1bGxldFIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5SZW1vdmVUYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ubG9jYWxTY2FsZVogPSA1MDtcclxuICAgICAgICAgICAgdGhpcy5nb1MuU2V0TmV4dE5vdEFjdGl2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBSb3RhdGlvblNlbGYocm90YTogVmVjdG9yMykge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS5yb3RhdGUocm90YSk7XHJcbiAgICAgICAgdGhpcy5DcmVhdGVSYXkoKTtcclxuICAgIH1cclxuXHJcbiAgICBTZXROZXh0Tm90QWN0aXZlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmdvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ28uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdvUykgdGhpcy5nb1MuU2V0TmV4dE5vdEFjdGl2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBIaXRUYXI6U3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIFJlbW92ZVRhcigpe1xyXG4gICAgICAgIGlmKHRoaXMuSGl0VGFyKXtcclxuICAgICAgICAgICAgdGhpcy5IaXRUYXI9bnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIFNldFRhcih0YXIpe1xyXG4gICAgICAgIHRoaXMuSGl0VGFyPXRhcjtcclxuICAgIH1cclxuICAgIHByaXZhdGUgSGl0KCl7XHJcbiAgICAgICAgaWYodGhpcy5IaXRUYXIpe1xyXG4gICAgICAgICAgICAvL0dhbWVfVG9vbC5DcmVhdGVUZXh0KHRoaXMuSGl0VGFyLm5hbWUrXCLooqvlh7vmnYAhXCIpO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5IaXRUYXIubGF5ZXIgPT0gR2FtZURlZmluZWQucGxheWVyX2xheWVyIHx8ICB0aGlzLkhpdFRhci5sYXllciA9PSBHYW1lRGVmaW5lZC5tb3N0ZXJfbGF5ZXIpe1xyXG4gICAgICAgICAgICAgIHZhciByPSAgdGhpcy5IaXRUYXIuZ2V0Q29tcG9uZW50KFJvbGUpYXMgUm9sZTtcclxuICAgICAgICAgICAgICByLkhpdEVkKCk7XHJcbiAgICAgICAgICAgICB0aGlzLkNyZWF0ZVJheSgpO1xyXG4gICAgICAgICAgICAvLyAgdGhpcy5DcmVhdGVSYXkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAvLyBFdmVudE1hbmFnZXIub2ZmKEdhbWVEZWZpbmVkLkhpdEV2ZW50LHRoaXMsIHRoaXMuSGl0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBvbkVuYWJsZSgpe1xyXG4gICAgICAgIEV2ZW50TWFuYWdlci5vbihHYW1lRGVmaW5lZC5IaXRFdmVudCx0aGlzLCB0aGlzLkhpdCk7XHJcbiAgICAgICAgdGhpcy5faXNoaXRlZD1mYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRpc2FibGUoKXtcclxuICAgICAgICBFdmVudE1hbmFnZXIub2ZmKEdhbWVEZWZpbmVkLkhpdEV2ZW50LHRoaXMsIHRoaXMuSGl0KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9Sb2xlXCI7XHJcbmltcG9ydCBHYW1lRGVmaW5lZCwgeyBDaGVja1R5cGUsIEJ1bGxldFR5cGUgfSBmcm9tIFwiLi4vZ2FtZV9tb2R1bGUvR2FtZURlZmluZWRcIjtcclxuaW1wb3J0IFZlY3RvcjMgPSBMYXlhLlZlY3RvcjM7XHJcbmltcG9ydCBSYXkgPSBMYXlhLlJheTtcclxuaW1wb3J0IEhpdFJlc3VsdCA9IExheWEuSGl0UmVzdWx0O1xyXG5pbXBvcnQgR2FtZVNjZW5lQ29udHJvbGxlciBmcm9tIFwiLi9HYW1lU2NlbmVDb250cm9sbGVyXCI7XHJcbmltcG9ydCBCdWxsZXRDb250cm9sbGVyIGZyb20gXCIuL0J1bGxldENvbnRyb2xsZXJcIjtcclxuaW1wb3J0IFNwcml0ZTNEID0gTGF5YS5TcHJpdGUzRDtcclxuaW1wb3J0IHsgQnVsbGV0IH0gZnJvbSBcIi4vQnVsbGV0XCI7XHJcbmltcG9ydCBHYW1lX1Rvb2wgZnJvbSBcIi4uL2dhbWVfdG9vbC9HYW1lX1Rvb2xcIjtcclxuaW1wb3J0IHsgRXZlbnRNYW5hZ2VyIH0gZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0V2ZW50TWFuYWdlclwiO1xyXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUm9sZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQXdha2UoKSB7XHJcbiAgICAgICAgc3VwZXIub25Bd2FrZSgpO1xyXG4gICAgICAgIHRoaXMuX3R5cGUgPSBDaGVja1R5cGUuUGxheWVyO1xyXG4gICAgICAgIHRoaXMuZm9ydyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG4gICAgICAgIHRoaXMuX2NvcnNzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAgICAgdGhpcy5fYnVsbGV0UG9zID0gdGhpcy5zZWxmLmdldENoaWxkQnlOYW1lKFwiYnVsbGV0UG9zXCIpIGFzIFNwcml0ZTNEO1xyXG4gICAgfVxyXG4gICAgaWRoaXQgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIGZvcnc6IFZlY3RvcjM7XHJcbiAgICBwcml2YXRlIF9yYXk6IFJheTtcclxuICAgIHByaXZhdGUgX2hpdDogSGl0UmVzdWx0O1xyXG5cclxuICAgIHByaXZhdGUgX2NvcnNzOiBWZWN0b3IzO1xyXG5cclxuICAgIHB1YmxpYyBnbzogU3ByaXRlM0Q7XHJcbiAgICBwdWJsaWMgZ29TOiBCdWxsZXQ7XHJcbiAgICBDcmVhdGVSYXkoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLmdldEZvcndhcmQodGhpcy5mb3J3KTtcclxuICAgICAgICB0aGlzLmZvcncgPSBuZXcgVmVjdG9yMygtdGhpcy5mb3J3LngsIC10aGlzLmZvcncueSwgLXRoaXMuZm9ydy56KTtcclxuICAgICAgICBpZiAoIXRoaXMuX3JheSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkgPSBuZXcgUmF5KHRoaXMuX2J1bGxldFBvcy50cmFuc2Zvcm0ucG9zaXRpb24sIHRoaXMuZm9ydyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hpdCA9IG5ldyBIaXRSZXN1bHQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9yYXkub3JpZ2luID0gdGhpcy5fYnVsbGV0UG9zLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5fcmF5LmRpcmVjdGlvbiA9IHRoaXMuZm9ydztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmdvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ28gPSBCdWxsZXRDb250cm9sbGVyLkluc3RhbmNlLkNyZWF0ZUJ1bGxldChHYW1lRGVmaW5lZC5wb29sTmFtZS5idWxsZXRHKTtcclxuICAgICAgICAgICAgdmFyIGdzID0gdGhpcy5nby5nZXRDb21wb25lbnQoQnVsbGV0KTtcclxuICAgICAgICAgICAgaWYgKCFncykgdGhpcy5nb1MgPSB0aGlzLmdvLmFkZENvbXBvbmVudChCdWxsZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX2J1bGxldFBvcy50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgdGhpcy5nby50cmFuc2Zvcm0ucm90YXRpb24gPSB0aGlzLl90cmFuc2Zvcm0ucm90YXRpb247XHJcbiAgICAgICAgdmFyIGlzUyA9IEdhbWVTY2VuZUNvbnRyb2xsZXIuSW5zdGFuY2UuZ2FtZV9zY2VuZS5waHlzaWNzU2ltdWxhdGlvbi5yYXlDYXN0KHRoaXMuX3JheSwgdGhpcy5faGl0KTtcclxuICAgICAgICBpZiAoaXNTKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2kgPSB0aGlzLl9oaXQucG9pbnQ7XHJcbiAgICAgICAgICAgIHZhciBkaXMgPSBWZWN0b3IzLmRpc3RhbmNlKHRoaXMuX2J1bGxldFBvcy50cmFuc2Zvcm0ucG9zaXRpb24sIHBvaSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ28udHJhbnNmb3JtLmxvY2FsU2NhbGVaID0gZGlzO1xyXG5cclxuICAgICAgICAgICAgdmFyIG90aGVyID0gdGhpcy5faGl0LmNvbGxpZGVyLm93bmVyIGFzIFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBpZiAob3RoZXIubGF5ZXIgPT0gR2FtZURlZmluZWQucGxheWVyX2xheWVyIHx8IG90aGVyLmxheWVyID09IEdhbWVEZWZpbmVkLm1vc3Rlcl9sYXllcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRUYXIob3RoZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nb1MuU2V0TmV4dE5vdEFjdGl2ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZW1vdmVUYXIoKTtcclxuICAgICAgICAgICAgICAgIHZhciBub3IgPSB0aGlzLl9oaXQubm9ybWFsO1xyXG4gICAgICAgICAgICAgICAgbm9yLnggPSBNYXRoLmFicyhub3IueCkgPCAwLjAwMSA/IDAgOiBub3IueDtcclxuICAgICAgICAgICAgICAgIG5vci55ID0gTWF0aC5hYnMobm9yLnkpIDwgMC4wMDEgPyAwIDogbm9yLnk7XHJcbiAgICAgICAgICAgICAgICBub3IueiA9IE1hdGguYWJzKG5vci56KSA8IDAuMDAxID8gMCA6IG5vci56O1xyXG4gICAgICAgICAgICAgICAgVmVjdG9yMy5jcm9zcyh0aGlzLmZvcncsIG5vciwgdGhpcy5fY29yc3MpOy8v5aSn5LqOMOWcqOW3puaWuSDlsI/kuo4w5Zyo5Y+z5pa5XHJcbiAgICAgICAgICAgICAgICB2YXIgYSA9IEdhbWVfVG9vbC5nZXRSZWZsZWN0QW5nKHRoaXMuZm9ydyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgYW5nID0gdGhpcy5fdHJhbnNmb3JtLnJvdGF0aW9uRXVsZXIuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvcnNzLnkgPj0gMCA/IGFuZy55ID0gYW5nLnkgKyAyICogYSA6IGFuZy55ID0gYW5nLnkgLSAyICogYTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gdmFyIHYxPW5ldyBWZWN0b3IzKDAuOCwwLDAuNik7ICAvL+WQkemHjzEgXHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgbm9yPW5ldyBWZWN0b3IzKC0xLDAsMCk7ICAgIC8vdjHnorDmkp7ms5Xnur9cclxuXHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgYWI9bmV3IExheWEuUXVhdGVybmlvbigpO1xyXG4gICAgICAgICAgICAgICAgLy8gTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUodGhpcy5mb3J3LGEsYWIpXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmdvUy5DcmVhdGVSYXkocG9pLCBhYiwgQnVsbGV0VHlwZS5CdWxsZXRHKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdvUy5DcmVhdGVSYXkocG9pLCBhbmcsIEJ1bGxldFR5cGUuQnVsbGV0Ryk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLlJlbW92ZVRhcigpO1xyXG4gICAgICAgICAgICB0aGlzLmdvLnRyYW5zZm9ybS5sb2NhbFNjYWxlWiA9IDUwO1xyXG4gICAgICAgICAgICB0aGlzLmdvUy5TZXROZXh0Tm90QWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFJvdGF0aW9uU2VsZihyb3RhOiBWZWN0b3IzKSB7XHJcbiAgICAgIC8vICBjb25zb2xlLmxvZyhyb3RhKTtcclxuICAgICAgLy8gIGNvbnNvbGUubG9nKHRoaXMuX3RyYW5zZm9ybS5yb3RhdGlvbkV1bGVyKTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucm90YXRlKHJvdGEpO1xyXG4gICAgICAvLyAgY29uc29sZS5sb2codGhpcy5fdHJhbnNmb3JtLnJvdGF0aW9uRXVsZXIpO1xyXG4gICAgICAgIHRoaXMuQ3JlYXRlUmF5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2V0TmV4dE5vdEFjdGl2ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5nbykge1xyXG4gICAgICAgICAgICB0aGlzLmdvLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nb1MpIHRoaXMuZ29TLlNldE5leHROb3RBY3RpdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBIaXRUYXI6IFNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBSZW1vdmVUYXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuSGl0VGFyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSGl0VGFyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIFNldFRhcih0YXIpIHtcclxuICAgICAgICB0aGlzLkhpdFRhciA9IHRhcjtcclxuICAgIH1cclxuICAgIHByaXZhdGUgSGl0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLkhpdFRhcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5IaXRUYXIubGF5ZXIgPT0gR2FtZURlZmluZWQucGxheWVyX2xheWVyIHx8IHRoaXMuSGl0VGFyLmxheWVyID09IEdhbWVEZWZpbmVkLm1vc3Rlcl9sYXllcikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLkhpdFRhci5nZXRDb21wb25lbnQoUm9sZSkgYXMgUm9sZTtcclxuICAgICAgICAgICAgICAgIHIuSGl0RWQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3JlYXRlUmF5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25FbmFibGUoKSB7XHJcbiAgICAgICAgRXZlbnRNYW5hZ2VyLm9uKEdhbWVEZWZpbmVkLkhpdEV2ZW50LCB0aGlzLCB0aGlzLkhpdCk7XHJcbiAgICAgICAgdGhpcy5faXNoaXRlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGlzYWJsZSgpIHtcclxuICAgICAgICBFdmVudE1hbmFnZXIub2ZmKEdhbWVEZWZpbmVkLkhpdEV2ZW50LCB0aGlzLCB0aGlzLkhpdCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgRGljdGlvbmFyeSBmcm9tIFwiLi4vZ2FtZV90b29sL0RpY3Rpb25hcnlcIjtcclxuaW1wb3J0IFZlY3RvcjM9TGF5YS5WZWN0b3IzO1xyXG5leHBvcnQgY2xhc3MgUG9vbF9NYW5hZ2VyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBQb29sX01hbmFnZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBQb29sX01hbmFnZXIge1xyXG4gICAgICAgIHJldHVybiBQb29sX01hbmFnZXIuaW5zdGFuY2UgfHwgKFBvb2xfTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBQb29sX01hbmFnZXIoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wb29sRGljID0gbmV3IERpY3Rpb25hcnkoKTtcclxuICAgICAgICB0aGlzLnByZWZhYkRpYyA9IG5ldyBEaWN0aW9uYXJ5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/lrZjlgqjlpJrkuKpcclxuICAgIHByaXZhdGUgcG9vbERpYzogRGljdGlvbmFyeTtcclxuXHJcbiAgICAvL+mihOiuvuWvueixoVxyXG4gICAgcHJpdmF0ZSBwcmVmYWJEaWM6IERpY3Rpb25hcnk7XHJcblxyXG4gICAgLy8gWyAgXVxyXG4gICAgcHVibGljIEluaXREYXRhKG5hbWU6IHN0cmluZywgcHJlZmFiKSB7XHJcbiAgICAgICAgaWYgKHByZWZhYiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVmYWJEaWMuaGFzKG5hbWUpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmYWJEaWMuc2V0KG5hbWUsIHByZWZhYik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIFNldEFjdGl2ZU9iamVjdChuYW1lOiBzdHJpbmcsc2NhbGU/KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9vbERpYy5oYXMobmFtZSkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucG9vbERpYy5nZXQobmFtZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucG9vbERpYy5nZXQobmFtZSkuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5hY3RpdmU9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlZmFiRGljLmhhcyhuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJPYmogPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKHRoaXMucHJlZmFiRGljLmdldChuYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgICAgICBpZihzY2FsZSE9bnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ck9iai50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGN1ck9iai5uYW1lID0gbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VyT2JqO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVmYWJEaWMuaGFzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VyT2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZSh0aGlzLnByZWZhYkRpYy5nZXQobmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBpZihzY2FsZSE9bnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyT2JqLnRyYW5zZm9ybS5sb2NhbFNjYWxlPW5ldyBWZWN0b3IzKHNjYWxlLHNjYWxlLHNjYWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGN1ck9iai5uYW1lID0gbmFtZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJPYmo7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy/pmpDol4/lr7nosaHliLBkaWNcclxuICAgIHB1YmxpYyBTZXREaXNhYmxlT2JqZWN0KGdvOiBMYXlhLlNwcml0ZTNEKSB7XHJcbiAgICAgICAgaWYgKGdvKSBnby5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB2YXIga2V5ID0gZ28ubmFtZTtcclxuICAgICAgICBpZiAoIXRoaXMucG9vbERpYy5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvb2xEaWMuc2V0KGtleSwgbmV3IEFycmF5PGFueT4oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9vbERpYy5nZXQoa2V5KS5wdXNoKGdvKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdG9yeU9iaihnbzpMYXlhLlNwcml0ZTNEKXtcclxuICAgICAgICBpZiAoZ28pIGdvLmRlc3Ryb3kodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/lu7bml7bpmpDol4/lr7nosaHliLBkaWNcclxuICAgIHB1YmxpYyBTZXREaXNhYmxlTXV0aU9iamVjdChnbzogTGF5YS5TcHJpdGUzRCwgdGltZXIpIHtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UodGltZXIsIHRoaXMsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGdvKSBnby5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIGtleSA9IGdvLm5hbWU7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wb29sRGljLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvb2xEaWMuc2V0KGtleSwgbmV3IEFycmF5PGFueT4oKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wb29sRGljLmdldChrZXkpLnB1c2goZ28pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJpbXBvcnQgU3ByaXRlM0QgPSBMYXlhLlNwcml0ZTNEO1xyXG5pbXBvcnQgVHJhbnNmb3JtM0QgPSBMYXlhLlRyYW5zZm9ybTNEO1xyXG5pbXBvcnQgR2FtZURlZmluZWQsIHsgQ2hlY2tUeXBlIH0gZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0dhbWVEZWZpbmVkXCI7XHJcbmltcG9ydCBWZWN0b3IzID0gTGF5YS5WZWN0b3IzO1xyXG5pbXBvcnQgUmF5ID0gTGF5YS5SYXk7XHJcbmltcG9ydCBIaXRSZXN1bHQgPSBMYXlhLkhpdFJlc3VsdDtcclxuaW1wb3J0IHsgQnVsbGV0IH0gZnJvbSBcIi4vQnVsbGV0XCI7XHJcbmltcG9ydCBCdWxsZXRDb250cm9sbGVyIGZyb20gXCIuL0J1bGxldENvbnRyb2xsZXJcIjtcclxuaW1wb3J0IEdhbWVTY2VuZUNvbnRyb2xsZXIgZnJvbSBcIi4vR2FtZVNjZW5lQ29udHJvbGxlclwiO1xyXG5pbXBvcnQgR2FtZV9Ub29sIGZyb20gXCIuLi9nYW1lX3Rvb2wvR2FtZV9Ub29sXCI7XHJcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gXCIuLi9nYW1lX21vZHVsZS9FdmVudE1hbmFnZXJcIjtcclxuZXhwb3J0IGNsYXNzIFJvbGUgZXh0ZW5kcyBMYXlhLlNjcmlwdDNEIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNlbGY6IFNwcml0ZTNEO1xyXG4gICAgcHJvdGVjdGVkIF90cmFuc2Zvcm06IFRyYW5zZm9ybTNEO1xyXG4gICAgcHJvdGVjdGVkIF90eXBlOiBDaGVja1R5cGU7XHJcbiAgICBwcm90ZWN0ZWQgX2J1bGxldFBvczogU3ByaXRlM0Q7XHJcbiAgICBwcm90ZWN0ZWQgX2lzaGl0ZWQ6IGJvb2xlYW47XHJcbiAgICBvbkF3YWtlKCkge1xyXG4gICAgICAgIHRoaXMuc2VsZiA9IHRoaXMub3duZXIgYXMgU3ByaXRlM0Q7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5zZWxmLnRyYW5zZm9ybTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgSGl0RWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzaGl0ZWQpIHJldHVybjtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuX3R5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBDaGVja1R5cGUuUGxheWVyOlxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ2hlY2tUeXBlLk1vc3RlcjpcclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5TZXROZXh0Tm90QWN0aXZlKCk7XHJcbiAgICAgICAgdGhpcy5zZWxmLmFjdGl2ZT1mYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgIFNldE5leHROb3RBY3RpdmUoKSB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG59IiwiXHJcbmltcG9ydCBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0Q7XHJcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuL1BsYXllclwiO1xyXG5pbXBvcnQgVmVjdG9yMyA9IExheWEuVmVjdG9yMztcclxuaW1wb3J0IHsgTW9zdGVyIH0gZnJvbSBcIi4vTW9zdGVyXCI7XHJcbmV4cG9ydCBjbGFzcyBSb2xlQ29udHJvbGxlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YXNuY2U6IFJvbGVDb250cm9sbGVyO1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogUm9sZUNvbnRyb2xsZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3Rhc25jZSB8fCAodGhpcy5pbnN0YXNuY2UgPSBuZXcgUm9sZUNvbnRyb2xsZXIoKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBwbGF5ZXI6U3ByaXRlM0Q7XHJcbiAgICAvLyBwdWJsaWMgcGxheWVyUzpQbGF5ZXI7XHJcblxyXG4gICAgcHVibGljIHBsYXllckFyciA9IFtdO1xyXG4gICAgcHVibGljIG1vc3RlckFyciA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBiZWhhdmlvckFyciA9IFtdO1xyXG4gICAgcHVibGljIGluaXRQbGF5ZXIocm9sZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm9sZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByb2xlc1tpbmRleF07XHJcbiAgICAgICAgICAgIHZhciBiZWggPSBlbGVtZW50LmFkZENvbXBvbmVudChQbGF5ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmJlaGF2aW9yQXJyLnB1c2goYmVoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYocm9sZSl7XHJcbiAgICAgICAgLy8gICAgIHRoaXMucGxheWVyPXJvbGU7XHJcbiAgICAgICAgLy8gICAgIHRoaXMucGxheWVyUz10aGlzLnBsYXllci5hZGRDb21wb25lbnQoUGxheWVyKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRNb3N0ZXIobW9zdGVycykge1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtb3N0ZXJzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbW9zdGVyc1tpbmRleF07XHJcbiAgICAgICAgICAgIHZhciBiZWggPSBlbGVtZW50LmFkZENvbXBvbmVudChNb3N0ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmJlaGF2aW9yQXJyLnB1c2goYmVoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgQ3JlYXRlUmF5KCkge1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmJlaGF2aW9yQXJyLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5iZWhhdmlvckFycltpbmRleF07XHJcbiAgICAgICAgICAgIGVsZW1lbnQuQ3JlYXRlUmF5KCk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyAgaWYodGhpcy5wbGF5ZXJTKXRoaXMucGxheWVyUy5DcmVhdGVSYXkoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBSb2xlUm90YXRpb24ocm90YTogVmVjdG9yMykge1xyXG4gICAgICAgIC8vIGlmKHRoaXMucGxheWVyUyl0aGlzLnBsYXllclMuUm90YXRpb25TZWxmKHJvdGEpO1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmJlaGF2aW9yQXJyLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5iZWhhdmlvckFycltpbmRleF07XHJcbiAgICAgICAgICAgIGVsZW1lbnQuUm90YXRpb25TZWxmKHJvdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBTb3VuZE1hbmFnZXIgPSBMYXlhLlNvdW5kTWFuYWdlcjtcclxuaW1wb3J0IHsgV1hTZGsgfSBmcm9tIFwiLi4vZ2FtZV9tb2R1bGUvV1hTZGtcIjtcclxuZXhwb3J0IGNsYXNzIFNldHRpbmdDb250cm9sbGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3Rhc25jZTogU2V0dGluZ0NvbnRyb2xsZXI7XHJcbiAgICBwdWJsaWMgdmlicmF0ZSA9IHRydWU7XHJcbiAgICBwdWJsaWMgc291bmQ9dHJ1ZTtcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFNldHRpbmdDb250cm9sbGVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YXNuY2UgfHwgKHRoaXMuaW5zdGFzbmNlID0gbmV3IFNldHRpbmdDb250cm9sbGVyKCkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFNldHRpbmdTb3VuZCh2YWx1ZT86IG51bWJlcikge1xyXG4gICAgICAgICAgIGlmKCF0aGlzLnNvdW5kKXJldHVybjtcclxuICAgICAgICAgICAgU291bmRNYW5hZ2VyLnNldFNvdW5kVm9sdW1lKHZhbHVlKTtcclxuICAgICAgICAgICAgU291bmRNYW5hZ2VyLnNldE11c2ljVm9sdW1lKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNvdW5kQ2hhbm5lbDogTGF5YS5Tb3VuZENoYW5uZWw7XHJcbiAgICBwdWJsaWMgX3BsYXlNdXNpYyhvbikge1xyXG4gICAgICAgIGlmKCF0aGlzLnNvdW5kKXJldHVybjtcclxuICAgICAgICBpZiAob24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc291bmRDaGFubmVsID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc291bmRDaGFubmVsID0gU291bmRNYW5hZ2VyLnBsYXlNdXNpYyh0aGlzLlRyYWluTG9vcCwgMCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdW5kQ2hhbm5lbC52b2x1bWUgPSAwLjVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNvdW5kQ2hhbm5lbC5yZXN1bWUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zb3VuZENoYW5uZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc291bmRDaGFubmVsLnBhdXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIF9wbGF5QmFkTW92ZSgpIHtcclxuICAgICAgIFxyXG4gICAgICAgIFdYU2RrLlNob3J0VmlicmF0ZSgpO1xyXG4gICAgICAgIGlmKCF0aGlzLnNvdW5kKXJldHVybjtcclxuICAgICAgICBTb3VuZE1hbmFnZXIucGxheVNvdW5kKHRoaXMuYmFkTW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIF9DbGljaygpIHtcclxuICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgU291bmRNYW5hZ2VyLnBsYXlTb3VuZCh0aGlzLmNsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgX0NvbnRpbnVlKG9uKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuc291bmQpcmV0dXJuO1xyXG4gICAgICAgIGlmIChvbikge1xyXG4gICAgICAgICAgICBTb3VuZE1hbmFnZXIucGxheVNvdW5kKHRoaXMuQ29udGludWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFNvdW5kTWFuYWdlci5zdG9wU291bmQodGhpcy5Db250aW51ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgX0xldmVsQ29tcCgpIHtcclxuICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgU291bmRNYW5hZ2VyLnBsYXlTb3VuZCh0aGlzLkxldmVsQ29tcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIF9UcmFpbkNyYXNoKCkge1xyXG4gICAgICAgIFdYU2RrLkxvbmdWaWJyYXRlKCk7XHJcbiAgICAgICAgaWYoIXRoaXMuc291bmQpcmV0dXJuO1xyXG4gICAgICAgIFNvdW5kTWFuYWdlci5wbGF5U291bmQodGhpcy5UcmFpbkNyYXNoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBfVHJhaW5TdG9wKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLnNvdW5kKXJldHVybjtcclxuICAgICAgICBTb3VuZE1hbmFnZXIucGxheVNvdW5kKHRoaXMuVHJhaW5TdG9wKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBfQ29pbigpIHtcclxuICAgICAgICBXWFNkay5TaG9ydFZpYnJhdGUoKTtcclxuICAgICAgICBpZighdGhpcy5zb3VuZClyZXR1cm47XHJcbiAgICAgICAgU291bmRNYW5hZ2VyLnBsYXlTb3VuZCh0aGlzLkNvaW4pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIHRlbXAgPSAwO1xyXG4gICAgcHVibGljIF9KdW1wKCkge1xyXG4gICAgICAgIFdYU2RrLlNob3J0VmlicmF0ZSgpO1xyXG4gICAgICAgIGlmKCF0aGlzLnNvdW5kKXJldHVybjtcclxuICAgICAgICBTb3VuZE1hbmFnZXIucGxheVNvdW5kKHRoaXMuSnVtcFt0aGlzLnRlbXBdKTtcclxuICAgICAgICB0aGlzLnRlbXArKztcclxuICAgICAgICBpZiAodGhpcy50ZW1wID09IDgpIHRoaXMudGVtcCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiYWRNb3ZlID0gXCJyZXMvU291bmQvQmFkTW92ZS5tcDNcIjtcclxuICAgIHByaXZhdGUgY2xpY2sgPSBcInJlcy9Tb3VuZC9jbGljay5tcDNcIjtcclxuICAgIHByaXZhdGUgQ29udGludWUgPSBcInJlcy9Tb3VuZC9Db250aW51ZS5tcDNcIjtcclxuICAgIHByaXZhdGUgTGV2ZWxDb21wID0gXCJyZXMvU291bmQvTGV2ZWxDb21wLm1wM1wiO1xyXG4gICAgcHJpdmF0ZSBUcmFpbkNyYXNoID0gXCJyZXMvU291bmQvVHJhaW5DcmFzaC5tcDNcIjtcclxuICAgIHByaXZhdGUgVHJhaW5Mb29wID0gXCJyZXMvU291bmQvVHJhaW5Mb29wLm1wM1wiO1xyXG4gICAgcHJpdmF0ZSBUcmFpblN0b3AgPSBcInJlcy9Tb3VuZC9UcmFpblN0b3AubXAzXCI7XHJcbiAgICBwcml2YXRlIENvaW49XCJyZXMvU291bmQvQ29pbjEubXAzXCI7XHJcbiAgICBwcml2YXRlIEp1bXAgPVxyXG4gICAgICAgIFtcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluMS5tcDNcIixcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluMi5tcDNcIixcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluMy5tcDNcIixcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluNC5tcDNcIixcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluNS5tcDNcIixcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluNi5tcDNcIixcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluNy5tcDNcIixcclxuICAgICAgICAgICAgXCJyZXMvU291bmQvUGFzc2VuZ2VySnVtcEluOC5tcDNcIixcclxuICAgICAgICBdO1xyXG5cclxufSIsImltcG9ydCBEaWN0aW9uYXJ5IGZyb20gXCIuLi9nYW1lX3Rvb2wvRGljdGlvbmFyeVwiO1xyXG5pbXBvcnQgeyBnYW1lX3VpIH0gZnJvbSBcIi4uL2dhbWVfdWkvZ2FtZV91aVwiO1xyXG5pbXBvcnQgeyBtYWluX3VpIH0gZnJvbSBcIi4uL2dhbWVfdWkvbWFpbl91aVwiO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIFZpZXdUeXBlIHtcclxuICAgIGdhbWVfdWksXHJcbiAgICBtYWluX3VpXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld01hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFZpZXdNYW5hZ2VyO1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogVmlld01hbmFnZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlIHx8ICh0aGlzLmluc3RhbmNlID0gbmV3IFZpZXdNYW5hZ2VyKCkpO1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHZpZXdEaWMgPSBbXTtcclxuICAgIHByaXZhdGUgY3VyVmlldzogYW55O1xyXG4gICAgcHJpdmF0ZSBhZGRWaWV3RGljID0gbmV3IERpY3Rpb25hcnkoKTtcclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgdGhpcy52aWV3RGljW1ZpZXdUeXBlLmdhbWVfdWldID0gZ2FtZV91aTtcclxuICAgICAgICB0aGlzLnZpZXdEaWNbVmlld1R5cGUubWFpbl91aV0gPSBtYWluX3VpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIE9wZW5WaWV3KHZpZXc6IFZpZXdUeXBlLCBkYXRhPzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyVmlldyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyVmlldy5PbkNsb3NlKCk7XHJcbiAgICAgICAgICAgIExheWEuc3RhZ2UucmVtb3ZlQ2hpbGQodGhpcy5jdXJWaWV3KTtcclxuICAgICAgICAgICAgdGhpcy5jdXJWaWV3LmRlc3Ryb3kodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyVmlldyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VyVmlldyA9IG5ldyB0aGlzLnZpZXdEaWNbdmlld107XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5jdXJWaWV3KTtcclxuICAgICAgXHJcbiAgICAgICAgdGhpcy5jdXJWaWV3Lk9uU2hvdyhkYXRhKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBnZXRDdXJWaWV3KCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyVmlldztcclxuICAgIH1cclxuICAgIHB1YmxpYyBBZGRWaWV3KHZpZXc6IFZpZXdUeXBlLCBkYXRhPzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWRkVmlld0RpYy5oYXModmlldykpIHJldHVybjtcclxuICAgICAgICBsZXQgdF92aWV3ID0gbmV3IHRoaXMudmlld0RpY1t2aWV3XTtcclxuICAgICAgICB0aGlzLmFkZFZpZXdEaWMuc2V0KHZpZXcsIHRfdmlldyk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0X3ZpZXcpO1xyXG4gICAgICAgIHRfdmlldy5PblNob3coZGF0YSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgUmVtb3ZlVmlldygpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJWaWV3ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJWaWV3Lk9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5yZW1vdmVDaGlsZCh0aGlzLmN1clZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLmN1clZpZXcuZGVzdHJveSh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJWaWV3ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgQ2xvc2VWaWV3KHZpZXc6IFZpZXdUeXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFkZFZpZXdEaWMuaGFzKHZpZXcpKSByZXR1cm47XHJcbiAgICAgICAgbGV0IHRfdmlldyA9IHRoaXMuYWRkVmlld0RpYy5nZXQodmlldyk7XHJcbiAgICAgICAgdF92aWV3Lk9uQ2xvc2UoKTtcclxuICAgICAgICBMYXlhLnN0YWdlLnJlbW92ZUNoaWxkKHRfdmlldyk7XHJcbiAgICAgICAgdF92aWV3LmRlc3Ryb3kodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hZGRWaWV3RGljLmRlbGV0ZSh2aWV3KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgY3VyTWFzazogYW55O1xyXG4gICAgcHVibGljIE9wZW5NYXNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1ck1hc2sgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vICB0aGlzLmN1ck1hc2sgPSBuZXcgTWFza191aSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5jdXJNYXNrKSByZXR1cm47XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLmN1ck1hc2spO1xyXG4gICAgfVxyXG4gICAgcHVibGljIENsb3NlTWFzaygpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJNYXNrICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJNYXNrLk9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5yZW1vdmVDaGlsZCh0aGlzLmN1ck1hc2spO1xyXG4gICAgICAgICAgICB0aGlzLmN1ck1hc2suZGVzdHJveSh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJNYXNrID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIEV2ZW50TWFuYWdlciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBkaXNpc3BhdGNoZXI6IExheWEuRXZlbnREaXNwYXRjaGVyO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IERpc2lzcGF0Y2hlcigpOiBMYXlhLkV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgICAgICAgcmV0dXJuIEV2ZW50TWFuYWdlci5kaXNpc3BhdGNoZXIgfHwgKEV2ZW50TWFuYWdlci5kaXNpc3BhdGNoZXIgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvbih0eXBlOiBzdHJpbmcsIGNhbGw6IGFueSwgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5EaXNpc3BhdGNoZXIub24odHlwZSwgY2FsbCwgZGF0YSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIG9mZih0eXBlOiBzdHJpbmcsIGNhbGw6IGFueSwgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5EaXNpc3BhdGNoZXIub2ZmKHR5cGUsIGNhbGwsIGRhdGEpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBldmVudCh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLkRpc2lzcGF0Y2hlci5ldmVudCh0eXBlLCBkYXRhKTtcclxuICAgIH1cclxufSIsImltcG9ydCBVc2VyTW9kZWwgZnJvbSBcIi4vVXNlck1vZGVsXCI7XHJcbmltcG9ydCB7IE1haW4gfSBmcm9tIFwiLi4vTWFpblwiO1xyXG5pbXBvcnQgeyBFdmVudE1hbmFnZXIgfSBmcm9tIFwiLi9FdmVudE1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGWUhEX1NkayB7XHJcbiAgICBwdWJsaWMgc3RhdGljIEFkX0NsaWNrVHlwZSA9IHtcclxuICAgICAgICBWaWRlbzogXCJ2aWRlb19jbGlja1wiLFxyXG4gICAgICAgIFdhdGNoOiBcIndhdGNoXCIsXHJcbiAgICAgICAgU2hhcmU6IFwic2hhcmVcIixcclxuICAgICAgICBCYW5uZXI6IFwiYmFubmVyXCIsXHJcbiAgICAgICAgUHVzaDogXCJwdXNoXCJcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHB1c2hEYXRhID0gW107XHJcbiAgICBwcml2YXRlIHN0YXRpYyBvcGVuaWQ6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzSGF2ZURhdGUgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dBZCA9IFwiU2hvd0FkXCI7XHJcbiAgICAvL+WIneWni+WMlnNka1xyXG4gICAgcHVibGljIHN0YXRpYyBJbml0U2RrKCkge1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5zdGFydFNkaygpO1xyXG4gICAgICAgIEZZSERfU2RrLlVzZXJJbmZvQXV0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v55So5oi35o6I5p2DXHJcbiAgICBwdWJsaWMgc3RhdGljIFVzZXJJbmZvQXV0aCgpIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5nZXRGeWhkVXNlckluZm8obnVsbCwgZmFsc2UsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5peg5o6I5p2D5Zue6LCDOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQudXNlcikge1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsub3BlbmlkID0gZGF0YS5yZXN1bHQudXNlci5vcGVuaWQ7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5BdXRoSW5mbygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHN0YXRpYyBBdXRoSW5mbygpIHtcclxuICAgICAgICB2YXIgYXJncyA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5sb2dpbkRhdGEoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmjojmnYPkuIrmiqXlm57osIM6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgICAgIEZZSERfU2RrLlZhbHVlVXNlcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVVc2VyKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0ge1xyXG4gICAgICAgICAgICBvcGVuaWQ6IEZZSERfU2RrLm9wZW5pZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnZhbHVldXNlcihhcmdzLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuacieaViOeUqOaIt+S4iuaKpTpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL+WIm+inkuiJslxyXG4gICAgcHVibGljIHN0YXRpYyBSb2xlRGF0YSgpIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBhcmdzID0ge1xyXG4gICAgICAgICAgICBvcGVuaWQ6IEZZSERfU2RrLm9wZW5pZCxcclxuICAgICAgICAgICAgcm9sZV9pZDogVXNlck1vZGVsLkluc3RhbmNlLkN1ck1vZGVsLnVzZXJpZCxcclxuICAgICAgICAgICAgY3JlYXRlX3RpbWU6IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5TZXJ2ZXJUaW1lXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5yb2xlRGF0YShhcmdzLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWIm+W7uuinkuiJsjpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICAgICAgRllIRF9TZGsuTG9naW4oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8v55m75b2V5L+h5oGv5LiK5oqlXHJcbiAgICBwdWJsaWMgc3RhdGljIExvZ2luKCkge1xyXG4gICAgICAgIGlmICghTWFpbi5Jc1d4KSByZXR1cm47XHJcbiAgICAgICAgdmFyIG9wZW5pZCA9IEZZSERfU2RrLm9wZW5pZCA/IEZZSERfU2RrLm9wZW5pZCA6IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5vcGVuaWQ7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSB7XHJcbiAgICAgICAgICAgIG9wZW5pZDogb3BlbmlkLFxyXG4gICAgICAgICAgICByb2xlX2lkOiBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwudXNlcmlkLFxyXG4gICAgICAgICAgICBjcmVhdGVfdGltZTogVXNlck1vZGVsLkluc3RhbmNlLkN1ck1vZGVsLlNlcnZlclRpbWUudG9TdHJpbmcoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhcIueZu+W9leWPguaVsDpcIiArIEpTT04uc3RyaW5naWZ5KGFyZ3MpKTtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkudXBsb2dpbkRhdGEoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnmbvlvZXnu5Pmnpw6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgICAgIC8vIEZZSERfU2RrLlB1c2hEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/ngrnlh7vkuovku7bkuIrmiqVcclxuICAgIHB1YmxpYyBzdGF0aWMgQ2xpY2tBZChhZF90eXBlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBwYXJhbSA9IHtcclxuICAgICAgICAgICAgYWRfdHlwZTogYWRfdHlwZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLngrnlh7vlj4LmlbA6XCIgKyBwYXJhbSk7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLmFkdmVydGlzZW1lbnQocGFyYW0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi54K55Ye757uT5p6cOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUHVzaERhdGEoKSB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICB2YXIgcGFyYW0gPSB7fTtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuc2hhcmVSZWNvbW1lbmQocGFyYW0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLnB1c2hEYXRhID0gZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsucHVzaERhdGEuc29ydChGWUhEX1Nkay5MaXN0U29ydCk7XHJcbiAgICAgICAgICAgICAgICBFdmVudE1hbmFnZXIuZXZlbnQoRllIRF9TZGsuU2hvd0FkKTtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLmlzSGF2ZURhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6I635Y+W5LqS5o6o5L+h5oGvOlwiICsgSlNPTi5zdHJpbmdpZnkoRllIRF9TZGsucHVzaERhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0h1VHVpSnVtcChkYXRhKSB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICBpZiAoZGF0YS5qdW1wX3R5cGUgPT0gMikgLy/kuoznu7TnoIHot7Povazmlrnms5VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gucHJldmlld0ltYWdlKHsgY3VycmVudDogZGF0YS5xcmNvZGUsIHVybHM6IFtkYXRhLnFyY29kZV0gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRhdGEuanVtcF90eXBlID09IDEpIC8v55u06Lez5pa55rOVXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSh7XHJcbiAgICAgICAgICAgICAgICBhcHBJZDogZGF0YS50b19hcHBpZCxcclxuICAgICAgICAgICAgICAgIHBhdGg6IGRhdGEuanVtcF9wYXRoLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyDmiZPlvIDmiJDlip9cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeaIkOWKnzpcIiArIEpTT04uc3RyaW5naWZ5KHJlcykpO1xyXG4gICAgICAgICAgICAgICAgICAgIEZZSERfU2RrLlB1c2hDbGljayhkYXRhLnRvX2FwcGlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZGF0YS5qdW1wX3R5cGUgPT0gMCkvL+W5s+WPsOi3s+i9rOaWueazlVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oe1xyXG4gICAgICAgICAgICAgICAgYXBwSWQ6IGRhdGEucGxhdGZvcm1fYXBwaWQsXHJcbiAgICAgICAgICAgICAgICBwYXRoOiBkYXRhLmp1bXBfcGF0aCxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5omT5byA5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXmiJDlip86XCIgKyBKU09OLnN0cmluZ2lmeShyZXMpKTtcclxuICAgICAgICAgICAgICAgICAgICBGWUhEX1Nkay5QdXNoQ2xpY2soZGF0YS50b19hcHBpZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBQdXNoQ2xpY2sodG9fYXBwaWQpIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBwYXJhbSA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgICAgIHRvX2FwcGlkOiB0b19hcHBpZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnNoYXJlUGxheShwYXJhbSwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLngrnlh7vkuIrmiqXnu5Pmnpw6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdFNvcnQoYSwgYik6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKE51bWJlcihhW1wicGFuZWxcIl0pIDwgTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTnVtYmVyKGFbXCJwYW5lbFwiXSkgPT0gTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChOdW1iZXIoYVtcInBhbmVsXCJdKSA+IE51bWJlcihiW1wicGFuZWxcIl0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIlxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lRGVmaW5lZCB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHBsYXllcl9sYXllciA9IDk7XHJcbiAgICBwdWJsaWMgc3RhdGljIHdhbGxfbGF5ZXIgPSA4O1xyXG4gICAgcHVibGljIHN0YXRpYyBtb3N0ZXJfbGF5ZXIgPSAxMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgYm9zc19sYXllciA9IDExO1xyXG4gICAgcHVibGljIHN0YXRpYyB0cmVlX2xheWVyID0gMTI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGJvbWJfbGF5ZXIgPSAxMztcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBIaXRFdmVudCA9IFwiSGl0RXZlbnRcIjtcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnYW1lX3NjZW5lX3BhdGggPS8vXCJyZXMvTGF5YVNjZW5lX21haW4vQ29udmVudGlvbmFsL21haW4ubHNcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlcy9MYXlhU2NlbmVfR2FtZVNjZW5lL0NvbnZlbnRpb25hbC9HYW1lU2NlbmUubHNcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHBvb2xOYW1lID0ge1xyXG4gICAgICAgIGJ1bGxldEc6IFwiYnVsbGV0R1wiLFxyXG4gICAgICAgIEJ1bGxldFI6IFwiQnVsbGV0UlwiXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB1aVJlcyA9IFtcclxuICAgICAgICBcInJlcy9hdGxhcy9tYWluX3Jlcy5hdGxhc1wiLFxyXG4gICAgICAgIFwicmVzL2F0bGFzL21haW5fcmVzLnBuZyBcIlxyXG4gICAgXTtcclxufVxyXG5leHBvcnQgZW51bSBDaGVja1R5cGUge1xyXG4gICAgUGxheWVyLFxyXG4gICAgTW9zdGVyLFxyXG4gICAgQm9zcyxcclxuICAgIEJvbWIsXHJcbiAgICBUcmVlXHJcbn1cclxuZXhwb3J0IGVudW0gQnVsbGV0VHlwZSB7XHJcbiAgICBCdWxsZXRSLFxyXG4gICAgQnVsbGV0R1xyXG59XHJcbiIsIlxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZUxvYWQge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTG9hZFJlc291cmNlKHBhdGg6QXJyYXk8YW55Pixjb21wbGV0PzpGdW5jdGlvbil7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIucmV0cnlOdW09MjtcclxuICAgICAgICBMYXlhLmxvYWRlci5tYXhMb2FkZXI9MztcclxuICAgICAgICBMYXlhLmxvYWRlci5yZXRyeURlbGF5PTEwMDtcclxuICAgICAgICBMYXlhLmxvYWRlci5jcmVhdGUocGF0aCxuZXcgTGF5YS5IYW5kbGVyKHRoaXMsY29tcGxldCkpO1xyXG4gICAgICAgIExheWEubG9hZGVyLm9uKExheWEuRXZlbnQuRVJST1IsdGhpcywoZGF0YSk9PntcclxuICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhK1wiIOi1hOa6kOWKoOi9veWksei0pVwiKTtcclxuICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgV1hTZGsgfSBmcm9tIFwiLi9XWFNka1wiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuL0ZZSERfU2RrXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNoYXJlTW9kdWxlIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgSXNTaGFyaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR29TaGFyZShjYWxsQmFjayk6IHZvaWQge1xyXG4gICAgICAgIFNoYXJlTW9kdWxlLlNoYXJlVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr54K55Ye75pe26Ze0PVwiICsgU2hhcmVNb2R1bGUuU2hhcmVUaW1lKTtcclxuICAgICAgICBTaGFyZU1vZHVsZS5Jc1NoYXJpbmcgPSB0cnVlO1xyXG4gICAgICAgIFNoYXJlTW9kdWxlLmNhbGxiYWNrID0gY2FsbEJhY2s7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIFNoYXJlVGltZTogbnVtYmVyO1xyXG4gICAgcHVibGljIHN0YXRpYyBPblNob3dIYW5kbGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vblNob3coZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvbnNob3cgc2hhcmUgc3RhcnRcIik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIui/m+WFpeW+ruS/oVwiKTtcclxuICAgICAgICAgICAgICAgIC8vTGF5YS50aW1lci5zY2FsZT0xO1xyXG4gICAgICAgICAgICAgICAgaWYgKFNoYXJlTW9kdWxlLklzU2hhcmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIFNoYXJlTW9kdWxlLklzU2hhcmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliIbkuqvlm57liLDmuLjmiI/ml7bpl7RcIiArIHRpbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YWl0ID0gKHRpbWUgLSBTaGFyZU1vZHVsZS5TaGFyZVRpbWUpIC8gMTAwMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWIhuS6q+WBnOeVmeaXtumXtOS4uu+8mlwiICsgd2FpdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNoYXJlU3VjY2VzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWFsU3VjY2VzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWl0ID49IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPD0gMC41KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRllIRF9TZGsuQ2xpY2tBZChGWUhEX1Nkay5BZF9DbGlja1R5cGUuU2hhcmUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTaGFyZU1vZHVsZS5jYWxsYmFjaykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVNb2R1bGUuY2FsbGJhY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCh7IHRpdGxlOiBcIuWIhuS6q+aIkOWKn++8gVwiIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTaGFyZU1vZHVsZS5jYWxsYmFjaykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPD0gMC41KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoeyB0aXRsZTogXCLliIbkuqvlpLHotKXvvIFcIiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1hTZGsuU2hvd1RvYXN0KFwi6K+35YiG5Lqr5Yiw5LiN5ZCM576kXi1eXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlTW9kdWxlLmNhbGxiYWNrKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBjYWxsYmFjaztcclxufSIsImltcG9ydCB7IE1haW4gfSBmcm9tIFwiLi4vTWFpblwiO1xyXG5pbXBvcnQgTmV0TWFuYWdlciBmcm9tIFwiLi9OZXRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERhdGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2dhbWVfbG9naWMvRGF0ZUNvbnRyb2xsZXJcIjtcclxuXHJcblxyXG5leHBvcnQgZW51bSBVc2VyQ29uZmlnTmFtZSB7XHJcbiAgICB0cmFpbiwgc2lnbiwgcmV3YXJkc1xyXG59XHJcbi8v55So5oi35L+h5oGv5bGe5oCnXHJcbmV4cG9ydCBlbnVtIFVzZXJBdHRyIHtcclxuICAgIGVxdWlwX3RyYWluLCB1c2VyX2lkLCBzdGFnZSwgZ2V0X3RyYWlucywgbW9uZXksIHByb2dyZXNzX3RyYWluc1xyXG59XHJcbmV4cG9ydCBjbGFzcyBOZXRVc2VyTW9kZWwge1xyXG4gICAgcHVibGljIG1fdXNlcl9iYXNlOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyX2ludml0ZTogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fdXNlcl9sb3R0ZXJ5OiBvYmplY3RcclxuICAgIHByaXZhdGUgbG9naW5TZXZlclRpbWU6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbV91c2VyX3RyZWFzdXJlOiBvYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyX2FjaGlldmVtZW50OiBvYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyX3NpZ246IE9iamVjdDtcclxuICAgIHByaXZhdGUgbV91c2VyX2FyZW5hOiBPYmplY3Q7XHJcbiAgICBwcml2YXRlIGxvY2FsVGltZTogbnVtYmVyO1xyXG4gICAgcHVibGljIG5pY2tuYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgb3BlbmlkOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgdXNlcmlkOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbV90b2tlbjogc3RyaW5nO1xyXG4gICAgcHVibGljIG1fY29uZmlnczogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fYXBwX3NldHRpbmc6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZXI6IE9iamVjdDtcclxuICAgIGNvbnN0cnVjdG9yKF90b2tlbjogc3RyaW5nLCBfY29uZmlnOiBPYmplY3QsIF9hcHBTZXR0aW5nOiBPYmplY3QsIF91c2VyOiBPYmplY3QsIF91c2VyYmFzZTogT2JqZWN0LCBfdXNlSW52aXRlOiBPYmplY3QsIF91c2VyX2xvdHRlcnk6IE9iamVjdCwgX3VzZXJfdHJlYXN1cmU6IE9iamVjdCwgdCwgX3VzZXJfYWNoaWV2ZW1lbnQsIF91c2VyX3NpZ24sIF91c2VyX2FyZW5hKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbFRpbWUgPSBMYXlhLnRpbWVyLmN1cnJUaW1lcjtcclxuICAgICAgICB0aGlzLmxvZ2luU2V2ZXJUaW1lID0gdDtcclxuICAgICAgICB0aGlzLm1fdG9rZW4gPSBfdG9rZW47XHJcbiAgICAgICAgdGhpcy5tX2NvbmZpZ3MgPSBfY29uZmlnO1xyXG4gICAgICAgIHRoaXMubV9hcHBfc2V0dGluZyA9IF9hcHBTZXR0aW5nO1xyXG4gICAgICAgIHRoaXMubV91c2VyID0gX3VzZXI7XHJcbiAgICAgICAgdGhpcy5tX3VzZXJfYmFzZSA9IF91c2VyYmFzZTtcclxuICAgICAgICB0aGlzLm1fdXNlcl9pbnZpdGUgPSBfdXNlSW52aXRlO1xyXG4gICAgICAgIHRoaXMubV91c2VyX2xvdHRlcnkgPSBfdXNlcl9sb3R0ZXJ5O1xyXG4gICAgICAgIHRoaXMubV91c2VyX3RyZWFzdXJlID0gX3VzZXJfdHJlYXN1cmU7XHJcbiAgICAgICAgdGhpcy5tX3VzZXJfYWNoaWV2ZW1lbnQgPSBfdXNlcl9hY2hpZXZlbWVudDtcclxuICAgICAgICB0aGlzLm1fdXNlcl9zaWduID0gX3VzZXJfc2lnbjtcclxuICAgICAgICB0aGlzLm1fdXNlcl9hcmVuYSA9IF91c2VyX2FyZW5hO1xyXG4gICAgICAgIHRoaXMudXNlcmlkID0gdGhpcy5tX3VzZXJbXCJ1c2VyX2lkXCJdO1xyXG4gICAgICAgIHRoaXMub3BlbmlkID0gdGhpcy5tX3VzZXJfYmFzZVtcIm9wZW5pZFwiXTtcclxuICAgICAgICB0aGlzLm5pY2tuYW1lID0gdGhpcy5tX3VzZXJfYmFzZVtcIm5pY2tuYW1lXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBDZmcoY2ZnKSB7XHJcbiAgICAgICAgdGhpcy5tX2NvbmZpZ3MgPSBjZmc7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNoYXJldGl0bGUoKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodGhpcy5tX2FwcF9zZXR0aW5nW1wic2hhcmV0aXRsZVwiXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wic2hhcmV0aXRsZVwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNoYXJlaW1hZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodGhpcy5tX2FwcF9zZXR0aW5nW1wic2hhcmVpbWFnZVwiXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wic2hhcmVpbWFnZVwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0Q2ZnKHR5cGU6IFVzZXJDb25maWdOYW1lKTogYW55IHtcclxuICAgICAgICB2YXIgX3R5cGUgPSBVc2VyQ29uZmlnTmFtZVt0eXBlXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2NvbmZpZ3NbX3R5cGVdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIEdldFVzZXJBdHRyKF9hdHRyOiBVc2VyQXR0cikge1xyXG4gICAgICAgIHZhciBhdHRyID0gVXNlckF0dHJbX2F0dHJdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fdXNlclthdHRyXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgU2VydmVyVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0aW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XHJcbiAgICAgICAgbGV0IHN0aW1lID0gdGhpcy5sb2dpblNldmVyVGltZSArIE1hdGguY2VpbCgodGltZSAtIHRoaXMubG9jYWxUaW1lKSAvIDEwMDApO1xyXG4gICAgICAgIHJldHVybiBzdGltZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgR3VpZGVMZXZlbCgpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLm1fYXBwX3NldHRpbmdbXCJHdWlkZUxldmVsXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiR3VpZGVMZXZlbFwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgQmFubmVyTW92ZVRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodGhpcy5tX2FwcF9zZXR0aW5nW1wiQmFubmVyTW92ZVRpbWVcIl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJCYW5uZXJNb3ZlVGltZVwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBIYXZlQmFubmVyKCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMubV9hcHBfc2V0dGluZ1tcIkhhdmVCYW5uZXJcIl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJIYXZlQmFubmVyXCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IElzU2hhcmUoKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodGhpcy5tX2FwcF9zZXR0aW5nW1wiSXNTaGFyZVwiXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcIklzU2hhcmVcIl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgQnRuQ2FuTW92ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLm1fYXBwX3NldHRpbmdbXCJCdG5DYW5Nb3ZlXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiQnRuQ2FuTW92ZVwiXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBJU1NoYXJlVGhlblZpZGVvKCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMubV9hcHBfc2V0dGluZ1tcIklTU2hhcmVUaGVuVmlkZW9cIl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJJU1NoYXJlVGhlblZpZGVvXCJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IE9wZW5TY2VuZVZhbHVlKCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMubV9hcHBfc2V0dGluZ1tcIk9wZW5TY2VuZVZhbHVlXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiT3BlblNjZW5lVmFsdWVcIl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IElzT3BlblRyeU91dCgpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLm1fYXBwX3NldHRpbmdbXCJJc09wZW5UcnlPdXRcIl0pIHtcclxuICAgICAgICAgICAgdmFyIG51bSA9IE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJJc09wZW5UcnlPdXRcIl0pO1xyXG4gICAgICAgICAgICBpZiAobnVtID09IDApIHJldHVybiAwO1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IG51bSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgSnVuZGdDZmdGb3JDZG4oY2FsbGJhbGw6IEZ1bmN0aW9uKSB7XHJcbiAgICAvLyAgICAgdGhpcy5tX2NvbmZpZ3MgPSBudWxsO1xyXG4gICAgLy8gICAgIGlmICh0aGlzLm1fY29uZmlncykge1xyXG4gICAgLy8gICAgICAgICBjYWxsYmFsbCgpO1xyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBjZmcgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKE1haW4uY2ZnKTtcclxuICAgIC8vICAgICAgICAgaWYgKGNmZykge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKGNmZy5WRVIgPT0gdGhpcy5HZXRDZmdWZXIpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLm1fY29uZmlncyA9IGNmZztcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNmZ+WtmOWcqFwiKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjYWxsYmFsbCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNmZ+WtmOWcqOS9huaYr+i/h+acn+S6hlwiKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKE1haW4uY2ZnKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFwiY2ZnLmpzb25cIiwgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoZGF0YSkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNmZ+S4i+i9veWujOaIkFwiKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oTWFpbi5jZmcsIGRhdGEpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMubV9jb25maWdzID0gZGF0YTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY2FsbGJhbGwoKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFwiY2ZnLmpzb25cIiwgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoZGF0YSkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Zn5LiL6L295a6M5oiQXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oTWFpbi5jZmcsIGRhdGEpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLm1fY29uZmlncyA9IGRhdGE7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FsbGJhbGwoKTtcclxuICAgIC8vICAgICAgICAgICAgIH0pKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgSnVuZGdDZmcodmVyLCBjYWxsYmFsbDogRnVuY3Rpb24pIHtcclxuICAgIC8vICAgICB0aGlzLm1fY29uZmlncyA9IG51bGw7XHJcbiAgICAvLyAgICAgaWYgKHRoaXMubV9jb25maWdzKSB7XHJcbiAgICAvLyAgICAgICAgIGNhbGxiYWxsKHRydWUpO1xyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBjZmcgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKE1haW4uQ0ZHKTtcclxuICAgIC8vICAgICAgICAgaWYgKGNmZykge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKGNmZy5WRVIgPT0gdmVyKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5DZmcgPSBjZmc7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bey57uP5oul5pyJLOS4jeeUqOabtOaWsFwiKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBEYXRlQ29udHJvbGxlci5TZXRDZmcoKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjYWxsYmFsbCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjZmflrZjlnKjkvYbmmK/ov4fmnJ/kuoZcIik7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShNYWluLkNGRyk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgTmV0TWFuYWdlci5JbnN0YW5jZS5Qb3N0Q2ZnUmVxdWVzdCgoZGF0YSkgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBkYXRhLlZFUiA9IHZlcjtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihNYWluLkNGRywgZGF0YSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2ZnID0gZGF0YTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgRGF0ZUNvbnRyb2xsZXIuU2V0Q2ZnKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWxsKHRydWUpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0sIChkYXRhKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6YWN572u6I635Y+W5aSx6LSlXCIgKyBkYXRhKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY2FsbGJhbGwoZmFsc2UpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuacrOWcsOayoeaciWNmZ1wiKTtcclxuICAgIC8vICAgICAgICAgICAgIE5ldE1hbmFnZXIuSW5zdGFuY2UuUG9zdENmZ1JlcXVlc3QoKGRhdGEpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNmZ1wiICsgZGF0YSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZGF0YS5WRVIgPSB2ZXI7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihNYWluLkNGRywgZGF0YSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5DZmcgPSBkYXRhO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIERhdGVDb250cm9sbGVyLlNldENmZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhbGxiYWxsKHRydWUpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSwgKGRhdGEpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumFjee9ruiOt+WPluWksei0pVwiICsgZGF0YSk7XHJcbiAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvL31cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlck1vZGVsIHtcclxuICAgIHB1YmxpYyBnZXQgQ3VyTW9kZWwoKTogTmV0VXNlck1vZGVsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJNb2RlbDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlO1xyXG4gICAgcHVibGljIG1fY29kZTogc3RyaW5nO1xyXG4gICAgcHVibGljIG1fZ2VuZGVyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgbV9jb3VudHJ5OiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIG5pY2tuYW1lOiBzdHJpbmcsIGF2YXRhcjogc3RyaW5nLCBnZW5kZXI6IG51bWJlciwgY291bnRyeTogc3RyaW5nLCBwcm92aW5jZTogc3RyaW5nLCBjaXR5OiBzdHJpbmcsIGRldmljZTogc3RyaW5nLCBzaGFyZV9pZDogc3RyaW5nLCBzY2VuZTogc3RyaW5nKSB7XHJcbiAgICAgICAgVXNlck1vZGVsLmluc3RhbmNlID0gdGhpcztcclxuICAgICAgICB0aGlzLm1fY29kZSA9IGNvZGU7XHJcbiAgICAgICAgdGhpcy5tX25pY2tuYW1lID0gbmlja25hbWUgPyBuaWNrbmFtZSA6IFwi5ri45a6iXCI7XHJcbiAgICAgICAgdGhpcy5tX2F2YXRhciA9IGF2YXRhciA/IGF2YXRhciA6IFwiXCI7XHJcbiAgICAgICAgdGhpcy5tX2dlbmRlciA9IGdlbmRlciA/IGdlbmRlciA6IDA7XHJcbiAgICAgICAgdGhpcy5tX2NpdHkgPSBjaXR5ID8gY2l0eSA6IFwiXCI7XHJcbiAgICAgICAgdGhpcy5tX2RldmljZSA9IGRldmljZSA/IGRldmljZSA6IFwiXCI7XHJcbiAgICAgICAgdGhpcy5tX3NoYXJlX2lkID0gc2hhcmVfaWQgPyBzaGFyZV9pZCA6IFwiXCI7XHJcbiAgICAgICAgdGhpcy5tX3NjZW5lID0gc2NlbmUgPyBzY2VuZSA6IFwiXCI7XHJcbiAgICAgICAgdGhpcy5tX2NvdW50cnkgPSBjb3VudHJ5ID8gY291bnRyeSA6IFwiXCI7XHJcbiAgICAgICAgdGhpcy5tX3Byb3ZpbmNlID0gcHJvdmluY2UgPyBwcm92aW5jZSA6IFwiXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbV9jaXR5OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbV9kZXZpY2U6IHN0cmluZztcclxuICAgIHB1YmxpYyBtX3NoYXJlX2lkOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbV9zY2VuZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogVXNlck1vZGVsIHtcclxuICAgICAgICBpZiAoVXNlck1vZGVsLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBVc2VyTW9kZWwuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBVc2VyTW9kZWwuaW5zdGFuY2UgPSBuZXcgVXNlck1vZGVsKFwiMTFcIiwgXCLmuLjlrqJcIiwgXCJcIiwgbnVsbCwgXCJcIiwgXCJcIiwgXCJcIiwgXCJpcGhvbmU2c1wiLCBcIlwiLCBcIlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFVzZXJNb2RlbC5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbV9wcm92aW5jZTogc3RyaW5nO1xyXG4gICAgcHVibGljIG1fbmlja25hbWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBtX2F2YXRhcjogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBjdXJNb2RlbDogTmV0VXNlck1vZGVsO1xyXG4gICAgcHVibGljIFNldFVzZXJNb2RlbChfbW9kZWw6IE5ldFVzZXJNb2RlbCkge1xyXG4gICAgICAgIHRoaXMuY3VyTW9kZWwgPSBfbW9kZWw7XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBNYWluIH0gZnJvbSBcIi4uL01haW5cIjtcclxuaW1wb3J0IFZpZXdNYW5hZ2VyIGZyb20gXCIuLi9nYW1lX2xvZ2ljL1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFNldHRpbmdDb250cm9sbGVyIH0gZnJvbSBcIi4uL2dhbWVfbG9naWMvU2V0dGluZ0NvbnRyb2xsZXJcIjtcclxuaW1wb3J0IHsgU2hhcmVNb2R1bGUgfSBmcm9tIFwiLi9TaGFyZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXNlck1vZGVsIGZyb20gXCIuL1VzZXJNb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdYU2RrIHtcclxuICAgIHB1YmxpYyBzZXRTaGFyZUlkKHRpZCkge1xyXG4gICAgICAgIGlmICh0aWQgIT0gXCJcIiAmJiB0aWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlSWQgPSB0aWQ7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0xPR106IHNldFNoYXJlT3BlbklkLnRpZD1cIiwgdGhpcy5zaGFyZUlkKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBXWFNkaztcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFdYU2RrIHtcclxuICAgICAgICByZXR1cm4gV1hTZGsuaW5zdGFuY2UgfHwgKFdYU2RrLmluc3RhbmNlID0gbmV3IFdYU2RrKCkpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBMb2RpbmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGdldCBnZXRTaGFyZUlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJlSWQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IFNoYXJlU2NlbmUoc2NlbmVTKSB7XHJcbiAgICAgICAgaWYgKHNjZW5lUyAhPSBcIlwiICYmIHNjZW5lUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVTY2VuZSA9IHNjZW5lUztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgaW5pdChjYjogYW55KSB7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93U2hhcmVNZW51KHtcclxuICAgICAgICAgICAgd2l0aFNoYXJlVGlja2V0OiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy90aGlzLnNoZXpoaVNoYXJlTWVzc2FnZShudWxsLCBudWxsKTtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hvdyhmdW5jdGlvbiAob3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBzaGFyZVRpY2tldCA9IG9wdGlvbi5zaGFyZVRpY2tldDtcclxuICAgICAgICAgICAgdmFyIHNoYXJlaWQgPSBvcHRpb24ucXVlcnkuc2hhcmVpZDtcclxuICAgICAgICAgICAgdmFyIHNjZW5lID0gZGVjb2RlVVJJQ29tcG9uZW50KG9wdGlvbi5xdWVyeS5zY2VuZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YWo5bGAcGF0aD06XCIsIG9wdGlvbi5wYXRoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJkZWNvZGVVUklDb21wb25lbnRcIiwgb3B0aW9uLnF1ZXJ5LnNjZW5lKTtcclxuICAgICAgICAgICAgdmFyIHNjZW5lUXVlcnkgPSBKU09OLnN0cmluZ2lmeShvcHRpb24ucXVlcnkpO1xyXG4gICAgICAgICAgICBpZiAoTWFpbi53eFZhbHVlID09XCJcIikgIHtcclxuICAgICAgICAgICAgICAgIE1haW4ud3hWYWx1ZSA9IG9wdGlvbi5zY2VuZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNjZW5lXCIsIG9wdGlvbi5zY2VuZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2NlbmVRdWVyeVwiLCBzY2VuZVF1ZXJ5KTtcclxuICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBvcHRpb24ucXVlcnkuY2hhbm5lbDtcclxuICAgICAgICAgICAgdmFyIGFwcGlkO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uLnJlZmVycmVySW5mbykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZWZlcnJlckluZm86XCIgKyBKU09OLnN0cmluZ2lmeShvcHRpb24ucmVmZXJyZXJJbmZvKSk7XHJcbiAgICAgICAgICAgICAgICBhcHBpZCA9IG9wdGlvbi5yZWZlcnJlckluZm8uYXBwSWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uU2hvdyBhcHBpcyBpczpcIiwgYXBwaWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uU2hvdyBhcHBpcyBpcyBudWxsXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZWZlcnJlckluZm/kuLrnqbpcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvblNob3cgY2hhbm5lbCBpczpcIiwgY2hhbm5lbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2Ioc2hhcmVUaWNrZXQsIHNoYXJlaWQsIGNoYW5uZWwsIGFwcGlkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgU2hhcmVTY2VuZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVNjZW5lO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBTaGFyZU1lc3NhZ2UodGl0bGU/LCBpbWFnZVVybD8pIHtcclxuICAgICAgICBpZiAoIU1haW4uSXNXeCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciB0OiBudW1iZXIgPSBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwuU2VydmVyVGltZTtcclxuICAgICAgICB2YXIgX3RpdGxlID0gdGl0bGU7XHJcbiAgICAgICAgdmFyIF91cmwgPSBpbWFnZVVybDtcclxuICAgICAgICBpZiAoIV90aXRsZSkge1xyXG4gICAgICAgICAgICBfdGl0bGUgPSBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwuc2hhcmV0aXRsZTtcclxuICAgICAgICAgICAgX3VybCA9IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5zaGFyZWltYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hhcmVBcHBNZXNzYWdlKCgpID0+ICh7XHJcbiAgICAgICAgICAgIHRpdGxlOiBfdGl0bGUsXHJcbiAgICAgICAgICAgIGltYWdlVXJsOiBfdXJsLFxyXG4gICAgICAgICAgICBxdWVyeTogXCJzaGFyZWlkPVwiICsgVXNlck1vZGVsLkluc3RhbmNlLkN1ck1vZGVsLnVzZXJpZCArIFwiX1wiICsgdCArIFwiX1wiICsgTWF0aC5mbG9vcig5OTk5ICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKVxyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyB3eF9sb2dpbihjYjogRnVuY3Rpb24pIHtcclxuICAgICAgICBpZiAoV1hTZGsuTG9kaW5pbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBXWFNkay5Mb2RpbmluZyA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJFeGN1dGUgd3gubG9naW4hIHNoYXJlT3BlbklkOiBcIiArIHRoaXMuc2hhcmVJZCk7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5sb2dpbih7XHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid3gubG9naW46IHN1Y2Nlc3MhIHJlcy5jb2RlPVwiICsgcmVzLmNvZGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hTZGsuTG9kaW5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWwhuimgeS8oOmAkueahOWPguaVsDpcIiArIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2IocmVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfojrflj5bnlKjmiLfnmbvlvZXmgIHlpLHotKXvvIEnICsgcmVzLmVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2IoXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChyZXMpIHsgY29uc29sZS5sb2coXCJ3eC5sb2dpbjogZmFpbGVkLCByZXM9XCIgKyByZXMpOyBXWFNkay5Mb2RpbmluZyA9IGZhbHNlOyBjYihcImVycm9yXCIpOyB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHNoYXJlSWQgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBzaGFyZVNjZW5lID0gXCJcIjtcclxuICAgIC8v5pi+56S65Yqg6L295L+h5oGvXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dMb2FkaW5nKHRpdGxlOiBzdHJpbmcgPSBcIuWKoOi9veS4rS4uLlwiLCBpc1Nob3dXeCA9IHRydWUpIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KSB7XHJcbiAgICAgICAgICAgIGlmIChpc1Nob3dXeCkge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93TG9hZGluZyh7IHRpdGxlOiB0aXRsZSwgbWFzazogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5PcGVuTWFzaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgU3lzdGVtSW5mbygpIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHByaXZhdGUgc3RhdGljIGJ1dHRvbjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgc2hvd2JqV3hHYW1lUXVhbihmbGFnOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cud3ggPT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGlmIChmbGFnKSB7XHJcbiAgICAvLyAgICAgICAgIGlmIChXZWlYaW5TREsuYnV0dG9uID09IG51bGwpIHtcclxuICAgIC8vICAgICAgICAgICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKCFpbmZvKSByZXR1cm47XHJcbiAgICAvLyAgICAgICAgICAgICB2YXIgdG9wID0gNDc0ICogaW5mby53aW5kb3dIZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgIC8vICAgICAgICAgICAgIHZhciBoZWlnaHQgPSA5NCAqIGluZm8ud2luZG93SGVpZ2h0IC8gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICAvLyAgICAgICAgICAgICB2YXIgd2lkdGggPSBoZWlnaHQgKiA5NSAvIDk0O1xyXG4gICAgLy8gICAgICAgICAgICAgV2VpWGluU0RLLmJ1dHRvbiA9IExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlR2FtZUNsdWJCdXR0b25cclxuICAgIC8vICAgICAgICAgICAgICAgICAoe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImltYWdlXCIsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGltYWdlOiAncmVzL3d4LnBuZycsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN0eWxlOlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiB0b3AsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfSlcclxuXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgV2VpWGluU0RLLmJ1dHRvbi5zaG93KCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGVsc2Uge1xyXG4gICAgLy8gICAgICAgICBpZiAoV2VpWGluU0RLLmJ1dHRvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgV2VpWGluU0RLLmJ1dHRvbi5oaWRlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcbiAgICAvL+mAgOWHulxyXG5cclxuXHJcbiAgICAvLyDmmL7npLrmj5DnpLrkv6Hmga8vL1xyXG4gICAgcHVibGljIHN0YXRpYyBTaG93VG9hc3QodGV4dDogc3RyaW5nLCBpY29uID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4KSB7XHJcbiAgICAgICAgICAgIHZhciB0X2ljb24gPSBpY29uID8gXCJzdWNjZXNzXCIgOiBcIm5vbmVcIjtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoeyB0aXRsZTogdGV4dCwgaWNvbjogdF9pY29uIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8xOnBldCAyOuS6uueJqVxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBYaWFuU2hpX01vZGVsKGNvbnRlbnQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCwgdHlwZSA9IDEsIHRpdGxlID0gXCJcIikge1xyXG4gICAgLy8gICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgIC8vICAgICAgICAgaWYgKHR5cGUgPT0gMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIGNhbmNlbFRleHQgPSBcIuaui+W/jeS4ouaOiVwiO1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIGNvbmZpcm1UZXh0ID0gXCLluKbkuIrkuIDotbdcIjtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgIHZhciBjYW5jZWxUZXh0ID0gXCLkuI3mg7NcIjtcclxuICAgIC8vICAgICAgICAgICAgIHZhciBjb25maXJtVGV4dCA9IFwi5oOzXCI7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKHtcclxuICAgIC8vICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgIC8vICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXHJcbiAgICAvLyAgICAgICAgICAgICBjYW5jZWxUZXh0OiBjYW5jZWxUZXh0LFxyXG4gICAgLy8gICAgICAgICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxyXG4gICAgLy8gICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocmVzLmNvbmZpcm0pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eUqOaIt+eCueWHu+ehruWumicpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5jYW5jZWwpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eUqOaIt+eCueWHu+WPlua2iCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfSxcclxuICAgIC8vICAgICAgICAgICAgIGZhaWwocmVzPykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfnlKjmiLfngrnlh7vlj5bmtognKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH0pXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG4gICAgcHVibGljIHN0YXRpYyBTaG9ydFZpYnJhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cud3ggJiYgU2V0dGluZ0NvbnRyb2xsZXIuSW5zdGFuY2UudmlicmF0ZSkge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnZpYnJhdGVTaG9ydCh7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTG9uZ1ZpYnJhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cud3ggJiYgU2V0dGluZ0NvbnRyb2xsZXIuSW5zdGFuY2UudmlicmF0ZSkge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnZpYnJhdGVMb25nKHt9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIEhpZGVMb2FkaW5nKGlzU2hvd1d4ID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAgICAgaWYgKGlzU2hvd1d4KSB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmhpZGVMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuQ2xvc2VNYXNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBTdWNjZXNzKHN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghTWFpbi5Jc1d4KSByZXR1cm47XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vbkVuZChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgICAgICAgICBzdGFnZU5hbWU6IFwi56ysXCIgKyBzdGFnZUlkICsgXCLlhbNcIiwgLy/lhbPljaHlkI3np7AgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiY29tcGxldGVcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zOlxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlhbPljaHlrozmiJBcIiAgIC8v5o+P6L+wXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgICAvL+iusOW9lemYv+aLieS4geS6i+S7tlxyXG4gICAgcHVibGljIHN0YXRpYyBBbGRFdmVudChldmVudE5hbWU6IHN0cmluZywga2V5Pzogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAgICAgaWYgKCFrZXkpIGtleSA9IFwi55So5oi3aWRcIjtcclxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFNlbmRFdmVudChldmVudE5hbWUsIHsga2V5OiB2YWx1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIEZhaWwoc3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uRW5kKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogXCLnrKxcIiArIHN0YWdlSWQgKyBcIuWFs1wiLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgICAgICAgICBldmVudDogXCJmYWlsXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAgICAgICAgIHBhcmFtczpcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5aSx6LSlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIGxldmVsZVJ1bmluZyhzdGFnZUlkOiBzdHJpbmcsIHVzZXJpZDogc3RyaW5nLCBldmVudHR5cGU6IG51bWJlciwgaXRlbU5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgIC8vICAgICAgICAgLy9MYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uUnVubmluZyh7XCJzdGFnZUlkXCI6c3RhZ2VJZCxcInN0YWdlTmFtZVwiOnN0YWdlTmFtZSxcInVzZXJJZFwiOnVzZXJpZH0pO1xyXG4gICAgLy8gICAgICAgICB2YXIgZXZlbnRUID0gZXZlbnR0eXBlID09IDAgPyBcImF3YXJkXCIgOiBcInJldml2ZVwiO1xyXG4gICAgLy8gICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uUnVubmluZyh7XHJcbiAgICAvLyAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLFxyXG4gICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lOiBcIuesrFwiICsgc3RhZ2VJZCArIFwi5YWzXCIsXHJcbiAgICAvLyAgICAgICAgICAgICB1c2VySWQ6IHVzZXJpZCxcclxuICAgIC8vICAgICAgICAgICAgIGV2ZW50OiBldmVudFQsXHJcbiAgICAvLyAgICAgICAgICAgICBwYXJhbXM6IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpdGVtTmFtZTogaXRlbU5hbWUsXHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH0pXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU3RhcnQoc3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uU3RhcnQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0YWdlSWQ6IHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBcIuesrFwiICsgc3RhZ2VJZCArIFwi5YWzXCIsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2FtZV9TaGFyZShjYWxsYmFjazogRnVuY3Rpb24gPSBudWxsLCBjaGFubmVsOiBzdHJpbmcgPSBcIlwiKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFNYWluLklzV3gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdXJsO1xyXG4gICAgICAgIHZhciB0aXRsZTtcclxuICAgICAgICB1cmwgPSBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwuc2hhcmVpbWFnZTtcclxuICAgICAgICB0aXRsZSA9IFVzZXJNb2RlbC5JbnN0YW5jZS5DdXJNb2RlbC5zaGFyZXRpdGxlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHVybCArIFwiICBcIiArIHRpdGxlKTtcclxuXHJcbiAgICAgICBcclxuICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFdlaVhpblNESy5BbGRFdmVudChcIueUqOaIt+WIhuS6q1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHQ6IG51bWJlcjsvLyA9IFVzZXJNb2RlbC5HZXRfSW5zdGFuY2UuQ3VyTW9kZWwuSHVvUXVfU2VydmVyVGltZTtcclxuICAgICAgICB2YXIgcGF0aCA9IFwiXCI7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTaGFyZUFwcE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGltYWdlVXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHF1ZXJ5OiBcInNoYXJlaWQ9XCIgKyBVc2VyTW9kZWwuSW5zdGFuY2UuQ3VyTW9kZWwudXNlcmlkICsgXCJfXCIgKyBcIm90aGVyXCIgKyBcIl9cIiArIHQgKyBcIl9cIiArIE1hdGguZmxvb3IoOTk5OSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKCksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIFNoYXJlTW9kdWxlLkdvU2hhcmUoY2FsbGJhY2spO1xyXG5cclxuICAgIH1cclxufSIsIlxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWN0aW9uYXJ5IHtcclxuICAgIHByaXZhdGUgX2xlbmd0aDogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lcjogYW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2xlbmd0aCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb250YWluZXIoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8v6I635Y+W5a2X5YW46ZW/5bqmICAgIFxyXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvL+a3u+WKoFxyXG4gICAgcHVibGljIHNldChrZXk6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyLmhhc093blByb3BlcnR5KGtleSkpICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb250YWluZXJba2V5XSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yig6ZmkICAgICBcclxuICAgIHB1YmxpYyBkZWxldGUoa2V5OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyLmhhc093blByb3BlcnR5KGtleSkpICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jb250YWluZXJba2V5XTtcclxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoLS07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v5p+l5om+ICAgXHJcbiAgICBwdWJsaWMgaGFzKGtleTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5oYXNPd25Qcm9wZXJ0eShrZXkpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8v6I635Y+WIFxyXG4gICAgcHVibGljIGdldChrZXk6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lci5oYXNPd25Qcm9wZXJ0eShrZXkpKSAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyW2tleV07XHJcbiAgICAgICAgfSBlbHNlICB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy/muIXnqbogICAgXHJcbiAgICBwdWJsaWMgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0ge307XHJcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcclxuICAgIH1cclxuXHJcblxyXG59IiwiXHJcbmltcG9ydCBVc2VyTW9kZWwgZnJvbSBcIi4uL2dhbWVfbW9kdWxlL1VzZXJNb2RlbFwiO1xyXG5pbXBvcnQgVmVjdG9yMz1MYXlhLlZlY3RvcjM7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVfVG9vbCB7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRPYmpLZXkob2JqOiBhbnkpIHtcclxuICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL+i/lOWbnuS4gOS4qumaj+acuuaVtOaVsFttaW4sbWF4XVxyXG4gICAgcHVibGljIHN0YXRpYyByYW5kb21JbnQobWluOiBhbnksIG1heDogYW55KTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSArIG1pbik7XHJcbiAgICB9XHJcbiAgICAvL3AxIOW3puWQkemHjyBwMlxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmcoeHg6IG51bWJlciwgeXk6IG51bWJlciwgb2JsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiAxODAgLyBNYXRoLlBJICogdGhpcy5nZXRSYWQoeHgsIHl5LCBvYmwpO1xyXG4gICAgfVxyXG4gICAgLy/ov5Tlm57op5LluqZcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmFkKHh4OiBudW1iZXIsIHl5OiBudW1iZXIsIG9ibDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICAvLyDmlrnms5XkuIDvvJphc2luKClcclxuICAgICAgICAvLyB2YXIgcmFkOk51bWJlciA9IHh4ID4gMCA/ICgoTWF0aC5QSSAqIDMpLzIgICsgTWF0aC5hc2luKC15eS9vYmwpKSA6IChNYXRoLlBJIC8gMiAtICBNYXRoLmFzaW4oLXl5L29ibCkpO1xyXG4gICAgICAgIC8vIOaWueazleS6jO+8mmFjb3MoKVxyXG4gICAgICAgIHZhciByYWQ6IG51bWJlciA9IHl5IDwgMCA/IE1hdGguYWNvcyh4eCAvIG9ibCkgOiAoTWF0aC5QSSAqIDIgLSBNYXRoLmFjb3MoeHggLyBvYmwpKTtcclxuICAgICAgICAvLyDmlrnms5XkuInvvJphdGFuMigpXHJcbiAgICAgICAgLy8gdmFyIHJhZDpOdW1iZXIgPSB5eSA8IDAgPyBNYXRoLmF0YW4yKC15eSwgeHgpIDogTWF0aC5QSSAqIDIgKyBNYXRoLmF0YW4yKC15eSwgeHgpO1xyXG4gICAgICAgIHJldHVybiByYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRNX1ZlY3Rvcih2MTogTGF5YS5WZWN0b3IzLCB2MjogTGF5YS5WZWN0b3IzKTogTGF5YS5WZWN0b3IzIHtcclxuICAgICAgICBsZXQgdGVtcCA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgICAgICBMYXlhLlZlY3RvcjMuYWRkKHYxLCB2MiwgdGVtcCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMYXlhLlZlY3RvcjModGVtcC54ICogMC41LCB0ZW1wLnkgKiAwLjUsIHRlbXAueiAqIDAuNSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVmbGVjdEFuZyhkaXI6VmVjdG9yMyl7XHJcbiAgICAgICAgdmFyIHh4PU1hdGguYWJzKGRpci54KTtcclxuICAgICAgICB2YXIgeno9TWF0aC5hYnMoZGlyLnopO1xyXG4gICAgICAgIHZhciBvYmw9IE1hdGguc3FydChNYXRoLnBvdyhkaXIueCwgMikgKyBNYXRoLnBvdyhkaXIueiwgMikpO1xyXG4gICAgICAgIHJldHVybiA5MC0gMTgwIC8gTWF0aC5QSSAqIE1hdGguYWNvcyh4eCAvIG9ibCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyByYW5kb21fMXRvMSgpOm51bWJlcnsgXHJcbiAgICAgICAgdmFyIGlzemhlbmc9TWF0aC5yYW5kb20oKT4wLjU/LTE6MTtcclxuICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSppc3poZW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0NjRFbmNvZGUoc3RyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgYzEsIGMyLCBjMztcclxuICAgICAgICB2YXIgYmFzZTY0RW5jb2RlQ2hhcnMgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcclxuICAgICAgICB2YXIgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGgsIHN0cmluZyA9ICcnO1xyXG4gICAgICAgIHdoaWxlIChpIDwgbGVuKSB7XHJcbiAgICAgICAgICAgIGMxID0gc3RyLmNoYXJDb2RlQXQoaSsrKSAmIDB4ZmY7XHJcbiAgICAgICAgICAgIGlmIChpID09IGxlbikge1xyXG4gICAgICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKGMxICYgMHgzKSA8PCA0KTtcclxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBcIj09XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XHJcbiAgICAgICAgICAgIGlmIChpID09IGxlbikge1xyXG4gICAgICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKChjMSAmIDB4MykgPDwgNCkgfCAoKGMyICYgMHhGMCkgPj4gNCkpO1xyXG4gICAgICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzIgJiAweEYpIDw8IDIpO1xyXG4gICAgICAgICAgICAgICAgc3RyaW5nICs9IFwiPVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYzMgPSBzdHIuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzEgJiAweDMpIDw8IDQpIHwgKChjMiAmIDB4RjApID4+IDQpKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMyICYgMHhGKSA8PCAyKSB8ICgoYzMgJiAweEMwKSA+PiA2KSk7XHJcbiAgICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoYzMgJiAweDNGKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgU2V0SHVUdWlMaXN0KGxpc3Q6TGF5YS5MaXN0LGRhdGE/LHNjcm9sOm51bWJlcj0xLHR5cGU6bnVtYmVyPTApeyAvL3Njcm9sIDE656uW55qEICAy5qiq55qEXHJcbiAgICAvLyAgICAgdmFyIGFycj1kYXRhP2RhdGE6RllIRF9TZGsucHVzaERhdGE7XHJcbiAgICAvLyAgICAgbGlzdC5zZWxlY3RFbmFibGUgPSBmYWxzZTtcclxuICAgIC8vICAgICBzY3JvbD09MT9saXN0LnZTY3JvbGxCYXJTa2luID0gXCJcIjpsaXN0LmhTY3JvbGxCYXJTa2luID0gXCJcIjtcclxuICAgIC8vICAgICBsaXN0LnJlbmRlckhhbmRsZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMudXBkYXRlSXRlbSwgW3R5cGVdLCBmYWxzZSk7XHJcbiAgICAvLyAgICAgbGlzdC5hcnJheSA9IGFycjtcclxuICAgIC8vICAgICBsaXN0LnJlZnJlc2goKTtcclxuICAgIC8vICB9XHJcbiAgICAvLyAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlSXRlbSh0eXBlLGNlbGw6IExheWEuQm94LCBpbmRleDogbnVtYmVyKXtcclxuICAgIC8vICAgICAgdmFyIGFkaXRlbT1jZWxsLmdldENvbXBvbmVudChIdWlUdWlJdGVtKWFzIEh1aVR1aUl0ZW07XHJcbiAgICAvLyAgICAgIGFkaXRlbS5SZWZyZXNoKHR5cGUpO1xyXG4gICAgLy8gIH1cclxuICAgIC8vICBwdWJsaWMgc3RhdGljIG1ha2VSYW5kb21BcnIoYXJyTGlzdCxudW0pe1xyXG4gICAgLy8gICAgIGlmKG51bT5hcnJMaXN0Lmxlbmd0aCl7XHJcbiAgICAvLyAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB2YXIgdGVtcEFycj1hcnJMaXN0LnNsaWNlKDApO1xyXG4gICAgLy8gICAgIHZhciBuZXdBcnJMaXN0PVtdOyAgICBcclxuICAgIC8vICAgICBmb3IodmFyIGk9MDtpPG51bTtpKyspe1xyXG4gICAgLy8gICAgICAgICB2YXIgcmFuZG9tPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoodGVtcEFyci5sZW5ndGgtMSkpO1xyXG4gICAgLy8gICAgICAgICB2YXIgYXJyPXRlbXBBcnJbcmFuZG9tXTtcclxuICAgIC8vICAgICAgICAgdGVtcEFyci5zcGxpY2UocmFuZG9tLCAxKTtcclxuICAgIC8vICAgICAgICAgbmV3QXJyTGlzdC5wdXNoKGFycik7ICAgIFxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gbmV3QXJyTGlzdDtcclxuICAgIC8vIH1cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQ29weUFycihvKTphbnl7XHJcbiAgICAvLyAgICAgdmFyIGFycj1bXTtcclxuICAgIC8vICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgby5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9baW5kZXhdO1xyXG4gICAgLy8gICAgICAgICBhcnIucHVzaChlbGVtZW50KTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIGFycjtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBTaG93UWlhbkRhbygpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBsZXQgdG9kYXlaZXJvID0gbmV3IERhdGUoVXNlck1vZGVsLkluc3RhbmNlLkN1ck1vZGVsLlNlcnZlclRpbWUgKiAxMDAwKTtcclxuICAgIC8vICAgICB0b2RheVplcm8uc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICAvLyAgICAgaWYoIVBsYXllck1hbmFnZXIuSW5zdGFuY2Uuc2lnbilyZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB2YXIgbGFzdFRpbWUgPSBOdW1iZXIoUGxheWVyTWFuYWdlci5JbnN0YW5jZS5zaWduW1wic2lnbl90aW1lXCJdKSAqIDEwMDA7XHJcbiAgICAvLyAgICAgbGV0IGxhc3RTaWduVGltZSA9IG5ldyBEYXRlKGxhc3RUaW1lKTtcclxuICAgIC8vICAgICBpZiAobGFzdFRpbWUgPT0gMCkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgaWYgKGxhc3RTaWduVGltZS52YWx1ZU9mKCkgPCB0b2RheVplcm8udmFsdWVPZigpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDcmVhdGVUZXh0KGNvbnRlbnQ6c3RyaW5nKXtcclxuICAgICAgICB2YXIgY3VyVGV4dCA9IG5ldyBMYXlhLlRleHQ7XHJcbiAgICAgICAgY3VyVGV4dC53aWR0aCA9IDMwMDtcclxuICAgICAgICBjdXJUZXh0LmhlaWdodCA9IDUwO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGN1clRleHQuYWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIGN1clRleHQudmFsaWduID0gXCJtaWRkbGVcIjtcclxuICAgICAgICBjdXJUZXh0LmZvbnQgPSBcIk1pY3Jvc29mdCBZYUhlaVwiO1xyXG4gICAgICAgIGN1clRleHQuZm9udFNpemUgPSAzNTtcclxuICAgICAgICBjdXJUZXh0LmNvbG9yID0gXCIjZmY4ZTAwXCI7XHJcbiAgICAgICAgY3VyVGV4dC5ib2xkID0gdHJ1ZTtcclxuICAgICAgICBjdXJUZXh0LmZvbnQgPSBcIk1pY3Jvc29mdCBZYUhlaVwiO1xyXG4gICAgICAgIGN1clRleHQudGV4dCA9IGNvbnRlbnQ7XHJcbiAgICAgICAgY3VyVGV4dC54ID0gNjA7XHJcbiAgICAgICAgY3VyVGV4dC55ID0gMTA7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChjdXJUZXh0KTtcclxuICAgICAgICBjb25zb2xlLmxvZyhjdXJUZXh0KTtcclxuICAgICAgICB2YXIgdHdlZW4gPSBMYXlhLlR3ZWVuLnRvKHBhcmVudCx7eTpjdXJUZXh0LnkgLSAyMDB9LDEwMDAsTGF5YS5FYXNlLmV4cG9Jbk91dCxMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsKCk9PlxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHdlZW4uY2xlYXIoKTtcclxuICAgICAgICAgICAgY3VyVGV4dC5kZXN0cm95KCk7XHJcbiAgICAgICAgfSksMTAwKTtcclxuICAgIH1cclxufSIsImltcG9ydCBUd2VlbiA9IExheWEuVHdlZW47XHJcbmltcG9ydCB7IFNldHRpbmdDb250cm9sbGVyIH0gZnJvbSBcIi4uLy4uL2dhbWVfbG9naWMvU2V0dGluZ0NvbnRyb2xsZXJcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2VSdW5UaW1lIGV4dGVuZHMgTGF5YS5JbWFnZSB7XHJcbiAgICBwdWJsaWMgc2NhbGVUaW1lOiBudW1iZXIgPSA4MDtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgLy/orr7nva7nu4Tku7bnmoTkuK3lv4PngrlcclxuICAgICAgICB0aGlzLmFuY2hvclggPSB0aGlzLmFuY2hvclkgPSAwLjU7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50Lk1PVVNFX0RPV04sIHRoaXMsIHRoaXMuc2NhbGVTbWFsbCk7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcclxuICAgICAgICB0aGlzLm9uKExheWEuRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfbWNsaWNrSGFuZGxlcjogRnVuY3Rpb247XHJcbiAgICBwcml2YXRlIGJpZ1R3ZWVuOiBUd2VlbjtcclxuICAgIHByaXZhdGUgU21hbGxUd2VlbjogVHdlZW47XHJcbiAgICBwcml2YXRlIGNsaWNrSWQ9ZmFsc2U7XHJcbiAgICBwcml2YXRlIHNjYWxlQmlnKGU6TGF5YS5FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8v5Y+Y5aSn6L+Y5Y6f55qE57yT5Yqo5pWI5p6cXHJcbiAgICAgXHJcbiAgICAgICAgaWYoIXRoaXMuY2xpY2tJZClyZXR1cm47XHJcbiAgICAgICAgdGhpcy5jbGlja0lkPWZhbHNlO1xyXG4gICAgICBcclxuICAgICAgICB0aGlzLmJpZ1R3ZWVuID0gVHdlZW4udG8odGhpcywgeyBzY2FsZVg6IDEsIHNjYWxlWTogMSB9LCB0aGlzLnNjYWxlVGltZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuX21jbGlja0hhbmRsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWNsaWNrSGFuZGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgc2NhbGVTbWFsbChlOkxheWEuRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICAvL+e8qeWwj+iHszAuOOeahOe8k+WKqOaViOaenFxyXG4gICAgICAgIFNldHRpbmdDb250cm9sbGVyLkluc3RhbmNlLl9DbGljaygpO1xyXG4gICAgICAgIHRoaXMuY2xpY2tJZD10cnVlO1xyXG4gICAgICAgIHRoaXMuU21hbGxUd2VlbiA9IFR3ZWVuLnRvKHRoaXMsIHsgc2NhbGVYOiAwLjgsIHNjYWxlWTogMC44IH0sIHRoaXMuc2NhbGVUaW1lKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBDbGVhclJ1blRpbWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmlnVHdlZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5iaWdUd2Vlbi5jbGVhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5TbWFsbFR3ZWVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU21hbGxUd2Vlbi5jbGVhcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vZmYoTGF5YS5FdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLnNjYWxlU21hbGwpO1xyXG4gICAgICAgIHRoaXMub2ZmKExheWEuRXZlbnQuTU9VU0VfVVAsIHRoaXMsIHRoaXMuc2NhbGVCaWcpO1xyXG4gICAgICAgIHRoaXMub2ZmKExheWEuRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcclxuICAgICAgICB0aGlzLl9tY2xpY2tIYW5kbGVyID0gbnVsbDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IHVpIH0gZnJvbSBcIi4uL3VpL2xheWFNYXhVSVwiO1xyXG5pbXBvcnQgeyBFdmVudE1hbmFnZXIgfSBmcm9tIFwiLi4vZ2FtZV9tb2R1bGUvRXZlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFJvbGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2dhbWVfbG9naWMvUm9sZUNvbnRyb2xsZXJcIjtcclxuaW1wb3J0IFZlY3RvcjMgPSBMYXlhLlZlY3RvcjM7XHJcbmltcG9ydCB7IEdhbWVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2dhbWVfbG9naWMvR2FtZUNvbnRyb2xsZXJcIjtcclxuZXhwb3J0IGNsYXNzIGdhbWVfdWkgZXh0ZW5kcyB1aS5nYW1lX3VpVUkgaW1wbGVtZW50cyBVSV9JbnRlcmZhY2Uge1xyXG5cclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnJlc2l6ZUhhbmRlcigpO1xyXG4gICAgICAgIEV2ZW50TWFuYWdlci5vbihMYXlhLkV2ZW50LlJFU0laRSwgdGhpcywgdGhpcy5yZXNpemVIYW5kZXIpO1xyXG4gICAgfVxyXG4gICAgcmVzaXplSGFuZGVyKCkge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBPblNob3coZGF0YT86IGFueSkge1xyXG4gICAgICAgIHRoaXMuVWlFdmVudEhhbmRsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBVaUV2ZW50SGFuZGxlcigpIHtcclxuICAgICAgICB0aGlzLm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5PbkNsaWNrRG93bik7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLk9uQ2xpY2tVcCk7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50Lk1PVVNFX09VVCwgdGhpcywgdGhpcy5PbkNsaWNrVXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNkb3duID0gZmFsc2U7XHJcbiAgICBPbkNsaWNrRG93bihlOiBMYXlhLkV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0IGluc3RhbmNlb2YgTGF5YS5VSUNvbXBvbmVudCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghR2FtZUNvbnRyb2xsZXIuSW5zdGFuY2UuZ2FtZVN0YXJ0IHx8IEdhbWVDb250cm9sbGVyLkluc3RhbmNlLmdhbWVvdmVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5pc2Rvd24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub24oTGF5YS5FdmVudC5NT1VTRV9NT1ZFLCB0aGlzLCB0aGlzLk9uU2xpZGVyKTtcclxuICAgICAgICB0aGlzLmN1ck1vdXNlUG9zID0gbmV3IFZlY3RvcjMoTGF5YS5Nb3VzZU1hbmFnZXIuaW5zdGFuY2UubW91c2VYLCBMYXlhLk1vdXNlTWFuYWdlci5pbnN0YW5jZS5tb3VzZVkpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXJ0UG9zID0gdGhpcy5jdXJNb3VzZVBvcy5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuTW91c2VEKCk7XHJcbiAgICB9XHJcbiAgICBPbkNsaWNrVXAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzZG93bikgcmV0dXJuO1xyXG4gICAgICAgIGlmICghR2FtZUNvbnRyb2xsZXIuSW5zdGFuY2UuZ2FtZVN0YXJ0IHx8IEdhbWVDb250cm9sbGVyLkluc3RhbmNlLmdhbWVvdmVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5pc2Rvd24gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9mZihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsIHRoaXMsIHRoaXMuT25TbGlkZXIpO1xyXG4gICAgICAgIHRoaXMuZW5kUG9zID0gdGhpcy5jdXJNb3VzZVBvcy5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuTW91c2VVKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3VyTW91c2VQb3M6IFZlY3RvcjM7XHJcbiAgICBPblNsaWRlcigpIHtcclxuICAgICAgICB2YXIgTW91c2VQb3MgPSBuZXcgVmVjdG9yMyhMYXlhLk1vdXNlTWFuYWdlci5pbnN0YW5jZS5tb3VzZVgsIExheWEuTW91c2VNYW5hZ2VyLmluc3RhbmNlLm1vdXNlWSk7XHJcbiAgICAgICAgdmFyIG9mZmVzdFggPSBNb3VzZVBvcy54IC0gdGhpcy5jdXJNb3VzZVBvcy54O1xyXG4gICAgICAgIGlmIChvZmZlc3RYID4gMCkgb2ZmZXN0WCA9IG9mZmVzdFggPCA1ID8gb2ZmZXN0WCA6IDU7XHJcbiAgICAgICAgaWYgKG9mZmVzdFggPCAwKSBvZmZlc3RYID0gb2ZmZXN0WCA+IC01ID8gb2ZmZXN0WCA6IC01O1xyXG4gICAgICAgIHZhciByb3RhdGVEaXIgPSBuZXcgVmVjdG9yMygwLCAtb2ZmZXN0WCAqIDAuMDEsIDApO1xyXG4gICAgICAgIFJvbGVDb250cm9sbGVyLkluc3RhbmNlLlJvbGVSb3RhdGlvbihyb3RhdGVEaXIpO1xyXG4gICAgICAgIHRoaXMuY3VyTW91c2VQb3MgPSBuZXcgVmVjdG9yMyhMYXlhLk1vdXNlTWFuYWdlci5pbnN0YW5jZS5tb3VzZVgsIExheWEuTW91c2VNYW5hZ2VyLmluc3RhbmNlLm1vdXNlWSk7O1xyXG4gICAgfVxyXG4gICAgT25DbG9zZSgpIHtcclxuICAgICAgICBFdmVudE1hbmFnZXIub2ZmKExheWEuRXZlbnQuUkVTSVpFLCB0aGlzLCB0aGlzLnJlc2l6ZUhhbmRlcik7XHJcbiAgICAgICAgdGhpcy5vZmYoTGF5YS5FdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLk9uQ2xpY2tEb3duKTtcclxuICAgICAgICB0aGlzLm9mZihMYXlhLkV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLk9uQ2xpY2tVcCk7XHJcbiAgICAgICAgdGhpcy5vZmYoTGF5YS5FdmVudC5NT1VTRV9PVVQsIHRoaXMsIHRoaXMuT25DbGlja1VwKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy/ngrnlh7vnmoTliKTmlq1cclxuICAgIHByaXZhdGUgc3RhcnRQb3M7XHJcbiAgICBwcml2YXRlIGlzZXhjZWVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIE1vdXNlRCgpIHtcclxuICAgICAgICB0aGlzLmlzZXhjZWVkID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDUwMCwgdGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZXhjZWVkID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZW5kUG9zO1xyXG4gICAgcHJpdmF0ZSBNb3VzZVUoKSB7XHJcbiAgICAgICAgdmFyIGRpcyA9IFZlY3RvcjMuZGlzdGFuY2UodGhpcy5zdGFydFBvcywgdGhpcy5lbmRQb3MpO1xyXG4gICAgICAgIGlmIChkaXMgPiAzMCB8fCB0aGlzLmlzZXhjZWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBHYW1lQ29udHJvbGxlci5JbnN0YW5jZS5IaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyB1aSB9IGZyb20gXCIuLi91aS9sYXlhTWF4VUlcIjtcclxuaW1wb3J0IHsgRXZlbnRNYW5hZ2VyIH0gZnJvbSBcIi4uL2dhbWVfbW9kdWxlL0V2ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgVmlld01hbmFnZXIsIHsgVmlld1R5cGUgfSBmcm9tIFwiLi4vZ2FtZV9sb2dpYy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHYW1lQ29udHJvbGxlciB9IGZyb20gXCIuLi9nYW1lX2xvZ2ljL0dhbWVDb250cm9sbGVyXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIG1haW5fdWkgZXh0ZW5kcyB1aS5tYWluX3VpVUkgaW1wbGVtZW50cyBVSV9JbnRlcmZhY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVIYW5kZXIoKTtcclxuICAgICAgICBFdmVudE1hbmFnZXIub24oTGF5YS5FdmVudC5SRVNJWkUsIHRoaXMsIHRoaXMucmVzaXplSGFuZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBPblNob3coZGF0YT86IGFueSkge1xyXG4gICAgICAgIHRoaXMuQnV0dG9uQ2xpY2tIYW5kbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNpemVIYW5kZXIoKSB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgQnV0dG9uQ2xpY2tIYW5kbGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydF9idG4uX21jbGlja0hhbmRsZXIgPSAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5PcGVuVmlldyhWaWV3VHlwZS5nYW1lX3VpKTtcclxuICAgICAgICAgICAgR2FtZUNvbnRyb2xsZXIuSW5zdGFuY2UuR2FtZVN0YXJ0KCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIE9uQ2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydF9idG4uQ2xlYXJSdW5UaW1lKCk7XHJcbiAgICB9XHJcbn0iLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cbmltcG9ydCBWaWV3PUxheWEuVmlldztcclxuaW1wb3J0IERpYWxvZz1MYXlhLkRpYWxvZztcclxuaW1wb3J0IFNjZW5lPUxheWEuU2NlbmU7XG52YXIgUkVHOiBGdW5jdGlvbiA9IExheWEuQ2xhc3NVdGlscy5yZWdDbGFzcztcbmV4cG9ydCBtb2R1bGUgdWkge1xyXG4gICAgZXhwb3J0IGNsYXNzIGdhbWVfdWlVSSBleHRlbmRzIFNjZW5lIHtcclxuICAgICAgICBwdWJsaWMgc3RhdGljICB1aVZpZXc6YW55ID17XCJ0eXBlXCI6XCJTY2VuZVwiLFwicHJvcHNcIjp7XCJ6T3JkZXJcIjoxLFwid2lkdGhcIjo3MjAsXCJoZWlnaHRcIjoxMjgwfSxcImNvbXBJZFwiOjIsXCJsb2FkTGlzdFwiOltdLFwibG9hZExpc3QzRFwiOltdfTtcclxuICAgICAgICBjb25zdHJ1Y3RvcigpeyBzdXBlcigpfVxyXG4gICAgICAgIGNyZWF0ZUNoaWxkcmVuKCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHN1cGVyLmNyZWF0ZUNoaWxkcmVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVmlldyhnYW1lX3VpVUkudWlWaWV3KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBSRUcoXCJ1aS5nYW1lX3VpVUlcIixnYW1lX3VpVUkpO1xyXG4gICAgZXhwb3J0IGNsYXNzIG1haW5fdWlVSSBleHRlbmRzIFNjZW5lIHtcclxuXHRcdHB1YmxpYyBzdGFydF9idG46YW55O1xuICAgICAgICBwdWJsaWMgc3RhdGljICB1aVZpZXc6YW55ID17XCJ0eXBlXCI6XCJTY2VuZVwiLFwicHJvcHNcIjp7XCJ6T3JkZXJcIjoxLFwid2lkdGhcIjo3MjAsXCJoZWlnaHRcIjoxMjgwfSxcImNvbXBJZFwiOjIsXCJjaGlsZFwiOlt7XCJ0eXBlXCI6XCJJbWFnZVwiLFwicHJvcHNcIjp7XCJ5XCI6NjQwLFwieFwiOjM2MCxcInZhclwiOlwic3RhcnRfYnRuXCIsXCJza2luXCI6XCJtYWluX3Jlcy9qaWVtaWFuX3hpbl8xXzEucG5nXCIsXCJydW50aW1lXCI6XCJnYW1lX3VpL1J1blRpbWVTY3JpcHQvQnV0dG9uUnVuVGltZS50c1wiLFwiY2VudGVyWVwiOjAsXCJjZW50ZXJYXCI6MCxcImFuY2hvcllcIjowLjUsXCJhbmNob3JYXCI6MC41fSxcImNvbXBJZFwiOjN9XSxcImxvYWRMaXN0XCI6W1wibWFpbl9yZXMvamllbWlhbl94aW5fMV8xLnBuZ1wiXSxcImxvYWRMaXN0M0RcIjpbXX07XHJcbiAgICAgICAgY29uc3RydWN0b3IoKXsgc3VwZXIoKX1cclxuICAgICAgICBjcmVhdGVDaGlsZHJlbigpOnZvaWQge1xyXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVDaGlsZHJlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVZpZXcobWFpbl91aVVJLnVpVmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgUkVHKFwidWkubWFpbl91aVVJXCIsbWFpbl91aVVJKTtcclxufVxyIl19