(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/battle/view/battle_effect.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, 'd438f2lEQNFq5Fa074aWZ5t', 'battle_effect'); // Scripts/mod/battle/view/battle_effect.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 战斗特效单位 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var BattleRolePool = require("battle_role_pool"); var LoaderManager = require("loadermanager"); var PathTool = require("pathtool"); var BattleResPool = require("battle_res_pool"); var BattleEffect = cc.Class({ "extends": BaseClass, properties: { skelon_cache: { "default": {} } }, ctor: function ctor() { this.initConfig(); }, initConfig: function initConfig() { this.effect = null; // 特效单位 this.skelon_cache = {}; // 动画缓存 this.effect_active = true; this.action_call_list = {}; // 制动动作回调 this.model = require("battle_controller").getInstance().getModel(); }, /** * 创建特效 * @param {*} parent 特效父节点 * @param {*} scene_pos 场景位置,像素坐标不是格子 * @param {*} reverse 是否反转 * @param {*} res_id 特效id */ createEffect: function createEffect(parent, scene_pos, reverse, res_id) { this.parent = parent; this.scene_pos = scene_pos; this.reverse = reverse || 1; this.res_id = res_id; var pools = BattleRolePool.getInstance().getEffectPools(); var effect = null; if (pools.size() > 0) { effect = pools.get(); effect.active = true; this.createEffectWnd(effect); } else { this.createEffectWnd(); } // 对特效资源进行计数 // LoaderManager.getInstance().countSkeleton(this.res_id); }, // 创建特效具体 createEffectWnd: function createEffectWnd(effect) { if (effect == null) { effect = new cc.Node(); effect.setAnchorPoint(0.5, 0.5); effect.addComponent(sp.Skeleton); } this.effect = effect; this.effect.scaleX = this.reverse; this.effect.rotation = 0; if (this.parent) { this.parent.addChild(this.effect); } this.skeleton = this.effect.getComponent(sp.Skeleton); // 设置位置 this.effect.setPosition(this.scene_pos.x, this.scene_pos.y); // 设置当前的模型速率 if (this.skeleton_time_scale) { this.skeleton.timeScale = this.skeleton_time_scale; this.skeleton_time_scale = null; } else { var timeScale = this.model.getTimeScale(); // if(this.model.isInRealBattle() == true){ // timeScale = this.model.getTimeScale(); // } this.skeleton.timeScale = timeScale; } this.resetInitStatus(); this.registerEvent(); }, // 设置特效位置 resetScenePos: function resetScenePos(scene_pos) { this.scene_pos = scene_pos; if (this.effect) { this.effect.setPosition(this.scene_pos.x, this.scene_pos.y); } }, // 特效反转 resetReverse: function resetReverse(reverse) { this.reverse = reverse; if (this.effect) { this.effect.scaleX = this.reverse; } }, // 添加对象 registerEvent: function registerEvent() { this.skeleton.setCompleteListener(function (trackEntry, loopCount) { var animationName = trackEntry.animation ? trackEntry.animation.name : ""; if (this.over_func) { this.over_func(animationName); // 清掉动作事件 this.over_func = null; this.event_func = null; // 单循环特效,可以直接清掉,这里可能会有问题,暂时这样处理 this.play_action_name = ""; } }.bind(this)); this.skeleton.setEventListener(function (trackEntry, event) { if (this.event_func) { this.event_func(event.data.name); } }.bind(this)); }, // 设置动作伴随事件和动作结束事件回调 setAnimationActionFunc: function setAnimationActionFunc(event_func, over_func) { this.event_func = event_func; this.over_func = over_func; }, // 播放动作 playActionOnce: function playActionOnce(action_name, res_name, is_loop) { res_name = res_name || "action"; if (is_loop == null) { is_loop = true; } this.effect_play_key = Utils.getNorKey(this.res_id, action_name); //储存一下当前特效资源和动作 var target_key = Utils.getNorKey(this.res_id, res_name); if (this.play_action_res == target_key) { if (this.play_action_name != action_name) { this.play_action_name = action_name; this.skeleton.setAnimation(0, action_name, is_loop); } return; } this.play_action_res = target_key; var skeleton_path = PathTool.getSpinePath(this.res_id, res_name); // var skeletonData = this.skelon_cache[skeleton_path] // if (skeletonData) { // this.play_action_name = action_name // this.skeleton.skeletonData = skeletonData; // this.skeleton.setAnimation(0, action_name, is_loop); // } else { // LoaderManager.getInstance().loadRes(skeleton_path, function (res_object) { // this.play_action_name = action_name // this.skeleton.skeletonData = res_object; // this.skeleton.setAnimation(0, action_name, is_loop); // if (!this.skelon_cache[skeleton_path]) { // this.skelon_cache[skeleton_path] = res_object; // } // }.bind(this)) // } if (this.skelon_cache[skeleton_path]) { this.play_action_name = action_name; this.skeleton.skeletonData = this.skelon_cache[skeleton_path]; this.skeleton.setAnimation(0, action_name, is_loop); } else { BattleResPool.getInstance().getRes(skeleton_path, function (res_object) { this.play_action_name = action_name; this.skeleton.skeletonData = res_object; this.skeleton.setAnimation(0, action_name, is_loop); if (!this.skelon_cache[skeleton_path]) { this.skelon_cache[skeleton_path] = res_object; } }.bind(this)); } }, getEffectKey: function getEffectKey() { return this.effect_play_key || ""; }, // 当前深度值 setLocalZOrder: function setLocalZOrder(zIndex) { if (this.effect) { this.effect.zIndex = zIndex; } }, // 战斗动作播报 runAction: function runAction(action) { if (this.effect) { this.effect.stopAllActions(); this.effect.runAction(action); } }, // 挂接到战斗单位身上的特效,当引用次数为0的时候,不需要移除掉,只要不可见,退出单位统一移除 setActiveEffect: function setActiveEffect(status) { if (this.effect_active == status) { return; } this.effect_active = status; if (this.effect) { this.effect.active = status; } }, // 初始化众泰 resetInitStatus: function resetInitStatus() { if (this.skeleton) { this.skeleton.setToSetupPose(); this.skeleton.clearTracks(); } }, // 子弹需要旋转角度 setRotation: function setRotation(degree) { if (this.effect) { this.effect.rotation = degree; } }, // 设置特效的播放速率 setTimeScale: function setTimeScale(speed) { if (this.skeleton == null || this.skeleton.skeletonData == null) { this.skeleton_time_scale = speed; } else { if (this.skeleton_timeScale == speed) return; this.skeleton_timeScale = speed; this.skeleton.timeScale = speed; } }, deleEffect: function deleEffect() { this.effect.stopAllActions(); this.skeleton.skeletonData = null; // 清掉加载资源 for (var skeletonIndex in this.skelon_cache) { BattleResPool.getInstance().delRes(skeletonIndex); // LoaderManager.getInstance().releaseRes(skeletonIndex); } this.skelon_cache = {}; // 回收掉 BattleRolePool.getInstance().pushBackEffect(this.effect); } }); cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXHZpZXdcXGJhdHRsZV9lZmZlY3QuanMiXSwibmFtZXMiOlsiQmF0dGxlUm9sZVBvb2wiLCJyZXF1aXJlIiwiTG9hZGVyTWFuYWdlciIsIlBhdGhUb29sIiwiQmF0dGxlUmVzUG9vbCIsIkJhdHRsZUVmZmVjdCIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJwcm9wZXJ0aWVzIiwic2tlbG9uX2NhY2hlIiwiY3RvciIsImluaXRDb25maWciLCJlZmZlY3QiLCJlZmZlY3RfYWN0aXZlIiwiYWN0aW9uX2NhbGxfbGlzdCIsIm1vZGVsIiwiZ2V0SW5zdGFuY2UiLCJnZXRNb2RlbCIsImNyZWF0ZUVmZmVjdCIsInBhcmVudCIsInNjZW5lX3BvcyIsInJldmVyc2UiLCJyZXNfaWQiLCJwb29scyIsImdldEVmZmVjdFBvb2xzIiwic2l6ZSIsImdldCIsImFjdGl2ZSIsImNyZWF0ZUVmZmVjdFduZCIsIk5vZGUiLCJzZXRBbmNob3JQb2ludCIsImFkZENvbXBvbmVudCIsInNwIiwiU2tlbGV0b24iLCJzY2FsZVgiLCJyb3RhdGlvbiIsImFkZENoaWxkIiwic2tlbGV0b24iLCJnZXRDb21wb25lbnQiLCJzZXRQb3NpdGlvbiIsIngiLCJ5Iiwic2tlbGV0b25fdGltZV9zY2FsZSIsInRpbWVTY2FsZSIsImdldFRpbWVTY2FsZSIsInJlc2V0SW5pdFN0YXR1cyIsInJlZ2lzdGVyRXZlbnQiLCJyZXNldFNjZW5lUG9zIiwicmVzZXRSZXZlcnNlIiwic2V0Q29tcGxldGVMaXN0ZW5lciIsInRyYWNrRW50cnkiLCJsb29wQ291bnQiLCJhbmltYXRpb25OYW1lIiwiYW5pbWF0aW9uIiwibmFtZSIsIm92ZXJfZnVuYyIsImV2ZW50X2Z1bmMiLCJwbGF5X2FjdGlvbl9uYW1lIiwiYmluZCIsInNldEV2ZW50TGlzdGVuZXIiLCJldmVudCIsImRhdGEiLCJzZXRBbmltYXRpb25BY3Rpb25GdW5jIiwicGxheUFjdGlvbk9uY2UiLCJhY3Rpb25fbmFtZSIsInJlc19uYW1lIiwiaXNfbG9vcCIsImVmZmVjdF9wbGF5X2tleSIsIlV0aWxzIiwiZ2V0Tm9yS2V5IiwidGFyZ2V0X2tleSIsInBsYXlfYWN0aW9uX3JlcyIsInNldEFuaW1hdGlvbiIsInNrZWxldG9uX3BhdGgiLCJnZXRTcGluZVBhdGgiLCJza2VsZXRvbkRhdGEiLCJnZXRSZXMiLCJyZXNfb2JqZWN0IiwiZ2V0RWZmZWN0S2V5Iiwic2V0TG9jYWxaT3JkZXIiLCJ6SW5kZXgiLCJydW5BY3Rpb24iLCJhY3Rpb24iLCJzdG9wQWxsQWN0aW9ucyIsInNldEFjdGl2ZUVmZmVjdCIsInN0YXR1cyIsInNldFRvU2V0dXBQb3NlIiwiY2xlYXJUcmFja3MiLCJzZXRSb3RhdGlvbiIsImRlZ3JlZSIsInNldFRpbWVTY2FsZSIsInNwZWVkIiwic2tlbGV0b25fdGltZVNjYWxlIiwiZGVsZUVmZmVjdCIsInNrZWxldG9uSW5kZXgiLCJkZWxSZXMiLCJwdXNoQmFja0VmZmVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxjQUFjLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUE1Qjs7QUFDQSxJQUFJQyxhQUFhLEdBQUdELE9BQU8sQ0FBQyxlQUFELENBQTNCOztBQUNBLElBQUlFLFFBQVEsR0FBR0YsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUcsYUFBYSxHQUFHSCxPQUFPLENBQUMsaUJBQUQsQ0FBM0I7O0FBRUEsSUFBSUksWUFBWSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUN4QixhQUFTQyxTQURlO0FBR3hCQyxFQUFBQSxVQUFVLEVBQUU7QUFDUkMsSUFBQUEsWUFBWSxFQUFFO0FBQ1YsaUJBQVM7QUFEQztBQUROLEdBSFk7QUFTeEJDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLFVBQUw7QUFDSCxHQVh1QjtBQWF4QkEsRUFBQUEsVUFBVSxFQUFDLHNCQUFV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LENBQWNzQyxZQUFkLEdBQTZCLElBQTdCLENBRmlCLENBSWpCOztBQUNBLFNBQUssSUFBSW1CLGFBQVQsSUFBMEIsS0FBS3JGLFlBQS9CLEVBQTZDO0FBQ3pDTixNQUFBQSxhQUFhLENBQUNhLFdBQWQsR0FBNEIrRSxNQUE1QixDQUFtQ0QsYUFBbkMsRUFEeUMsQ0FFekM7QUFDSDs7QUFFRCxTQUFLckYsWUFBTCxHQUFvQixFQUFwQixDQVZpQixDQVlqQjs7QUFDQVYsSUFBQUEsY0FBYyxDQUFDaUIsV0FBZixHQUE2QmdGLGNBQTdCLENBQTRDLEtBQUtwRixNQUFqRDtBQUNIO0FBblB1QixDQUFULENBQW5CIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDmiJjmlpfnibnmlYjljZXkvY1cbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgQmF0dGxlUm9sZVBvb2wgPSByZXF1aXJlKFwiYmF0dGxlX3JvbGVfcG9vbFwiKTtcbnZhciBMb2FkZXJNYW5hZ2VyID0gcmVxdWlyZShcImxvYWRlcm1hbmFnZXJcIik7XG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIilcbnZhciBCYXR0bGVSZXNQb29sID0gcmVxdWlyZShcImJhdHRsZV9yZXNfcG9vbFwiKTtcblxudmFyIEJhdHRsZUVmZmVjdCA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHNrZWxvbl9jYWNoZToge1xuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpXG4gICAgfSxcblxuICAgIGluaXRDb25maWc6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5lZmZlY3QgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgIC8vIOeJueaViOWNleS9jVxuICAgICAgICB0aGlzLnNrZWxvbl9jYWNoZSA9IHt9OyAgICAgICAgICAgICAgICAgLy8g5Yqo55S757yT5a2YXG4gICAgICAgIHRoaXMuZWZmZWN0X2FjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWN0aW9uX2NhbGxfbGlzdCA9IHt9OyAgICAgICAgICAgICAvLyDliLbliqjliqjkvZzlm57osINcblxuICAgICAgICB0aGlzLm1vZGVsID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Yib5bu654m55pWIXG4gICAgICogQHBhcmFtIHsqfSBwYXJlbnQg54m55pWI54i26IqC54K5XG4gICAgICogQHBhcmFtIHsqfSBzY2VuZV9wb3Mg5Zy65pmv5L2N572uLOWDj+e0oOWdkOagh+S4jeaYr+agvOWtkFxuICAgICAqIEBwYXJhbSB7Kn0gcmV2ZXJzZSDmmK/lkKblj43ovaxcbiAgICAgKiBAcGFyYW0geyp9IHJlc19pZCDnibnmlYhpZFxuICAgICAqL1xuICAgIGNyZWF0ZUVmZmVjdDpmdW5jdGlvbihwYXJlbnQsIHNjZW5lX3BvcywgcmV2ZXJzZSwgcmVzX2lkKXtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuc2NlbmVfcG9zID0gc2NlbmVfcG9zO1xuICAgICAgICB0aGlzLnJldmVyc2UgPSByZXZlcnNlIHx8IDE7XG4gICAgICAgIHRoaXMucmVzX2lkID0gcmVzX2lkO1xuICAgICAgICBsZXQgcG9vbHMgPSBCYXR0bGVSb2xlUG9vbC5nZXRJbnN0YW5jZSgpLmdldEVmZmVjdFBvb2xzKClcbiAgICAgICAgbGV0IGVmZmVjdCA9IG51bGw7XG4gICAgICAgIGlmKHBvb2xzLnNpemUoKSA+IDApe1xuICAgICAgICAgICAgZWZmZWN0ID0gcG9vbHMuZ2V0KCk7XG4gICAgICAgICAgICBlZmZlY3QuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRWZmZWN0V25kKGVmZmVjdClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUVmZmVjdFduZCgpXG4gICAgICAgIH1cbiAgICAgICAgLy8g5a+554m55pWI6LWE5rqQ6L+b6KGM6K6h5pWwXG4gICAgICAgIC8vIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jb3VudFNrZWxldG9uKHRoaXMucmVzX2lkKTtcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu654m55pWI5YW35L2TXG4gICAgY3JlYXRlRWZmZWN0V25kOmZ1bmN0aW9uKGVmZmVjdCl7XG4gICAgICAgIGlmIChlZmZlY3QgPT0gbnVsbCl7XG4gICAgICAgICAgICBlZmZlY3QgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgZWZmZWN0LnNldEFuY2hvclBvaW50KDAuNSwgMC41KTtcbiAgICAgICAgICAgIGVmZmVjdC5hZGRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWZmZWN0ID0gZWZmZWN0O1xuICAgICAgICB0aGlzLmVmZmVjdC5zY2FsZVggPSB0aGlzLnJldmVyc2U7XG4gICAgICAgIHRoaXMuZWZmZWN0LnJvdGF0aW9uID0gMDtcblxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpe1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkQ2hpbGQodGhpcy5lZmZlY3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2tlbGV0b24gPSB0aGlzLmVmZmVjdC5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICAvLyDorr7nva7kvY3nva5cbiAgICAgICAgdGhpcy5lZmZlY3Quc2V0UG9zaXRpb24odGhpcy5zY2VuZV9wb3MueCwgdGhpcy5zY2VuZV9wb3MueSk7XG4gICAgICAgIC8vIOiuvue9ruW9k+WJjeeahOaooeWei+mAn+eOh1xuICAgICAgICBpZiAodGhpcy5za2VsZXRvbl90aW1lX3NjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uLnRpbWVTY2FsZSA9IHRoaXMuc2tlbGV0b25fdGltZV9zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b25fdGltZV9zY2FsZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGltZVNjYWxlID0gdGhpcy5tb2RlbC5nZXRUaW1lU2NhbGUoKTtcbiAgICAgICAgICAgIC8vIGlmKHRoaXMubW9kZWwuaXNJblJlYWxCYXR0bGUoKSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICAvLyB0aW1lU2NhbGUgPSB0aGlzLm1vZGVsLmdldFRpbWVTY2FsZSgpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgdGhpcy5za2VsZXRvbi50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEluaXRTdGF0dXMoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KCk7XG4gICAgfSxcblxuICAgIC8vIOiuvue9rueJueaViOS9jee9rlxuICAgIHJlc2V0U2NlbmVQb3M6ZnVuY3Rpb24oc2NlbmVfcG9zKXtcbiAgICAgICAgdGhpcy5zY2VuZV9wb3MgPSBzY2VuZV9wb3M7XG4gICAgICAgIGlmKHRoaXMuZWZmZWN0KXtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0LnNldFBvc2l0aW9uKHRoaXMuc2NlbmVfcG9zLngsIHRoaXMuc2NlbmVfcG9zLnkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOeJueaViOWPjei9rFxuICAgIHJlc2V0UmV2ZXJzZTpmdW5jdGlvbihyZXZlcnNlKXtcbiAgICAgICAgdGhpcy5yZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgICAgaWYodGhpcy5lZmZlY3Qpe1xuICAgICAgICAgICAgdGhpcy5lZmZlY3Quc2NhbGVYID0gdGhpcy5yZXZlcnNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOa3u+WKoOWvueixoVxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5za2VsZXRvbi5zZXRDb21wbGV0ZUxpc3RlbmVyKChmdW5jdGlvbiAodHJhY2tFbnRyeSwgbG9vcENvdW50KSB7XG4gICAgICAgICAgICB2YXIgYW5pbWF0aW9uTmFtZSA9IHRyYWNrRW50cnkuYW5pbWF0aW9uID8gdHJhY2tFbnRyeS5hbmltYXRpb24ubmFtZSA6IFwiXCI7XG4gICAgICAgICAgICBpZiAodGhpcy5vdmVyX2Z1bmMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJfZnVuYyhhbmltYXRpb25OYW1lKTtcbiAgICAgICAgICAgICAgICAvLyDmuIXmjonliqjkvZzkuovku7ZcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJfZnVuYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudF9mdW5jID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyDljZXlvqrnjq/nibnmlYgs5Y+v5Lul55u05o6l5riF5o6JLOi/memHjOWPr+iDveS8muaciemXrumimCzmmoLml7bov5nmoLflpITnkIZcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfYWN0aW9uX25hbWUgPSBcIlwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5za2VsZXRvbi5zZXRFdmVudExpc3RlbmVyKChmdW5jdGlvbiAodHJhY2tFbnRyeSwgZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50X2Z1bmMpe1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRfZnVuYyhldmVudC5kYXRhLm5hbWUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIC8vIOiuvue9ruWKqOS9nOS8tOmaj+S6i+S7tuWSjOWKqOS9nOe7k+adn+S6i+S7tuWbnuiwg1xuICAgIHNldEFuaW1hdGlvbkFjdGlvbkZ1bmM6IGZ1bmN0aW9uIChldmVudF9mdW5jLCBvdmVyX2Z1bmMpIHtcbiAgICAgICAgdGhpcy5ldmVudF9mdW5jID0gZXZlbnRfZnVuYztcbiAgICAgICAgdGhpcy5vdmVyX2Z1bmMgPSBvdmVyX2Z1bmM7XG4gICAgfSxcblxuICAgIC8vIOaSreaUvuWKqOS9nFxuICAgIHBsYXlBY3Rpb25PbmNlOmZ1bmN0aW9uKGFjdGlvbl9uYW1lLCByZXNfbmFtZSwgaXNfbG9vcCl7XG4gICAgICAgIHJlc19uYW1lID0gcmVzX25hbWUgfHwgXCJhY3Rpb25cIjtcbiAgICAgICAgaWYoaXNfbG9vcCA9PSBudWxsKXtcbiAgICAgICAgICAgIGlzX2xvb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWZmZWN0X3BsYXlfa2V5ID0gVXRpbHMuZ2V0Tm9yS2V5KHRoaXMucmVzX2lkLCBhY3Rpb25fbmFtZSk7IC8v5YKo5a2Y5LiA5LiL5b2T5YmN54m55pWI6LWE5rqQ5ZKM5Yqo5L2cXG5cbiAgICAgICAgdmFyIHRhcmdldF9rZXkgPSBVdGlscy5nZXROb3JLZXkodGhpcy5yZXNfaWQsIHJlc19uYW1lKTtcbiAgICAgICAgaWYgKHRoaXMucGxheV9hY3Rpb25fcmVzID09IHRhcmdldF9rZXkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXlfYWN0aW9uX25hbWUgIT0gYWN0aW9uX25hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfYWN0aW9uX25hbWUgPSBhY3Rpb25fbmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBhY3Rpb25fbmFtZSwgaXNfbG9vcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGF5X2FjdGlvbl9yZXMgPSB0YXJnZXRfa2V5O1xuICAgICAgICB2YXIgc2tlbGV0b25fcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aCh0aGlzLnJlc19pZCwgcmVzX25hbWUpO1xuICAgICAgICAvLyB2YXIgc2tlbGV0b25EYXRhID0gdGhpcy5za2Vsb25fY2FjaGVbc2tlbGV0b25fcGF0aF1cbiAgICAgICAgLy8gaWYgKHNrZWxldG9uRGF0YSkge1xuICAgICAgICAvLyAgICAgdGhpcy5wbGF5X2FjdGlvbl9uYW1lID0gYWN0aW9uX25hbWVcbiAgICAgICAgLy8gICAgIHRoaXMuc2tlbGV0b24uc2tlbGV0b25EYXRhID0gc2tlbGV0b25EYXRhO1xuICAgICAgICAvLyAgICAgdGhpcy5za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgYWN0aW9uX25hbWUsIGlzX2xvb3ApO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoc2tlbGV0b25fcGF0aCwgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnBsYXlfYWN0aW9uX25hbWUgPSBhY3Rpb25fbmFtZVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuc2tlbGV0b24uc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBhY3Rpb25fbmFtZSwgaXNfbG9vcCk7XG4gICAgICAgIC8vICAgICAgICAgaWYgKCF0aGlzLnNrZWxvbl9jYWNoZVtza2VsZXRvbl9wYXRoXSkge1xuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNrZWxvbl9jYWNoZVtza2VsZXRvbl9wYXRoXSA9IHJlc19vYmplY3Q7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2tlbG9uX2NhY2hlW3NrZWxldG9uX3BhdGhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5X2FjdGlvbl9uYW1lID0gYWN0aW9uX25hbWVcbiAgICAgICAgICAgICAgICB0aGlzLnNrZWxldG9uLnNrZWxldG9uRGF0YSA9IHRoaXMuc2tlbG9uX2NhY2hlW3NrZWxldG9uX3BhdGhdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tlbGV0b24uc2V0QW5pbWF0aW9uKDAsIGFjdGlvbl9uYW1lLCBpc19sb29wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJhdHRsZVJlc1Bvb2wuZ2V0SW5zdGFuY2UoKS5nZXRSZXMoc2tlbGV0b25fcGF0aCwgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfYWN0aW9uX25hbWUgPSBhY3Rpb25fbmFtZVxuICAgICAgICAgICAgICAgIHRoaXMuc2tlbGV0b24uc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgICAgICB0aGlzLnNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBhY3Rpb25fbmFtZSwgaXNfbG9vcCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNrZWxvbl9jYWNoZVtza2VsZXRvbl9wYXRoXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNrZWxvbl9jYWNoZVtza2VsZXRvbl9wYXRoXSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIGdldEVmZmVjdEtleTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5lZmZlY3RfcGxheV9rZXkgfHwgXCJcIjtcbiAgICB9LFxuXG4gICAgLy8g5b2T5YmN5rex5bqm5YC8XG4gICAgc2V0TG9jYWxaT3JkZXI6IGZ1bmN0aW9uICh6SW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdC56SW5kZXggPSB6SW5kZXg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5oiY5paX5Yqo5L2c5pKt5oqlXG4gICAgcnVuQWN0aW9uOiBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdCkge1xuICAgICAgICAgICAgdGhpcy5lZmZlY3Quc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0LnJ1bkFjdGlvbihhY3Rpb24pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaMguaOpeWIsOaImOaWl+WNleS9jei6q+S4iueahOeJueaViCzlvZPlvJXnlKjmrKHmlbDkuLow55qE5pe25YCZLOS4jemcgOimgeenu+mZpOaOiSzlj6ropoHkuI3lj6/op4Es6YCA5Ye65Y2V5L2N57uf5LiA56e76ZmkXG4gICAgc2V0QWN0aXZlRWZmZWN0OmZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdF9hY3RpdmUgPT0gc3RhdHVzKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVmZmVjdF9hY3RpdmUgPSBzdGF0dXM7XG4gICAgICAgIGlmKHRoaXMuZWZmZWN0KXtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0LmFjdGl2ZSA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkvJfms7BcbiAgICByZXNldEluaXRTdGF0dXM6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKHRoaXMuc2tlbGV0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b24uc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b24uY2xlYXJUcmFja3MoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlrZDlvLnpnIDopoHml4vovazop5LluqZcbiAgICBzZXRSb3RhdGlvbjpmdW5jdGlvbihkZWdyZWUpe1xuICAgICAgICBpZih0aGlzLmVmZmVjdCl7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdC5yb3RhdGlvbiA9IGRlZ3JlZVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiuvue9rueJueaViOeahOaSreaUvumAn+eOh1xuICAgIHNldFRpbWVTY2FsZTpmdW5jdGlvbihzcGVlZCl7XG4gICAgICAgIGlmICh0aGlzLnNrZWxldG9uID09IG51bGwgfHwgdGhpcy5za2VsZXRvbi5za2VsZXRvbkRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5za2VsZXRvbl90aW1lX3NjYWxlID0gc3BlZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5za2VsZXRvbl90aW1lU2NhbGUgPT0gc3BlZWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b25fdGltZVNjYWxlID0gc3BlZWQ7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uLnRpbWVTY2FsZSA9IHNwZWVkO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlbGVFZmZlY3Q6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5lZmZlY3Quc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5za2VsZXRvbi5za2VsZXRvbkRhdGEgPSBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8g5riF5o6J5Yqg6L296LWE5rqQXG4gICAgICAgIGZvciAodmFyIHNrZWxldG9uSW5kZXggaW4gdGhpcy5za2Vsb25fY2FjaGUpIHtcbiAgICAgICAgICAgIEJhdHRsZVJlc1Bvb2wuZ2V0SW5zdGFuY2UoKS5kZWxSZXMoc2tlbGV0b25JbmRleCk7XG4gICAgICAgICAgICAvLyBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyhza2VsZXRvbkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2tlbG9uX2NhY2hlID0ge307XG5cbiAgICAgICAgLy8g5Zue5pS25o6JXG4gICAgICAgIEJhdHRsZVJvbGVQb29sLmdldEluc3RhbmNlKCkucHVzaEJhY2tFZmZlY3QodGhpcy5lZmZlY3QpO1xuICAgIH1cbn0pOyJdfQ==