549 lines
18 KiB
TypeScript
549 lines
18 KiB
TypeScript
import { dicHero } from "./dictionary/DicHero";
|
||
import { dicGoods, blueprt, dicJewel, figureCondition } from "./dictionary/DicGoods";
|
||
import { dicBlueprtCompose } from "./dictionary/DicBlueprtCompose";
|
||
import { dicBlueprtPossibility } from "./dictionary/DicBlueprtPossibility";
|
||
import { dicDaily } from "./dictionary/DicDaily";
|
||
import { dicEvent } from "./dictionary/DicEvent";
|
||
import { dicExpedition } from "./dictionary/DicExpedition";
|
||
import { dicExpeditionPoint } from "./dictionary/DicExpeditionPoint";
|
||
import { dicFuncSwitch } from "./dictionary/DicFuncSwitch";
|
||
import { dicHeroSkill } from "./dictionary/DicHeroSkill";
|
||
import { dicJob, jobClassAndgrades, jobClassMaxGrades } from "./dictionary/DicJob";
|
||
import { dicKingExp, maxPlayerLv } from "./dictionary/DicKingExp";
|
||
import { dicCharExp } from "./dictionary/DicCharExp";
|
||
import { dicQuestion } from "./dictionary/DicQuestion";
|
||
import { dicSe } from "./dictionary/DicSe";
|
||
import { dicTower } from "./dictionary/DicTower";
|
||
import { dicTowerTask } from "./dictionary/DicTowerTask";
|
||
import { dicWar, dicWarPvp } from "./dictionary/DicWar";
|
||
import { dicWarJson } from "./dictionary/DicWarJson";
|
||
import { dicXunbao } from "./dictionary/DicXunbao";
|
||
import { SPECIAL_ATTR } from "../consts/consts";
|
||
import { dicFashions } from "./dictionary/DicFashions";
|
||
import { friendShips, friendShipHidAandIds } from "./dictionary/DicFriendShip";
|
||
import { maxFriendShipLv, dicFriendShipLevelMap } from "./dictionary/DicFriendShipLevel";
|
||
import { dicHeroQualityUp } from "./dictionary/DicHeroQualityUp";
|
||
import { dicHeroStar } from "./dictionary/DicHeroStar";
|
||
import { dicHeroWake } from "./dictionary/DicHeroWake";
|
||
import { dicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||
import { dicStrengthenCost } from './dictionary/DicStrengthenCost';
|
||
import { dicRefine } from './dictionary/DicRefine';
|
||
import { dicHeroEquip } from './dictionary/DicHeroEquip';
|
||
import { dicSuit } from './dictionary/DicSuit';
|
||
import { dicTitle } from './dictionary/DicTitle';
|
||
import { dicTeraph } from './dictionary/DicTeraph';
|
||
import { dicSchool } from './dictionary/DicSchool';
|
||
import { dicSchoolRate } from './dictionary/DicSchoolRate';
|
||
import { dicHeroScroll, preHeroScroll } from './dictionary/DicHeroScroll';
|
||
import { dicPvpOpponent } from './dictionary/DicPvpOpponent';
|
||
import { dicPvpTeamLevel } from './dictionary/DicPvpTeamLevel';
|
||
import { dicPvpRefreshConsume, maxPvpRefreshCnt } from './dictionary/DicPvpRefreshConsume';
|
||
import { dicGkPvp, dicGkPvps } from './dictionary/DicGkPvp';
|
||
import { dicHeroRewads } from './dictionary/DicPvpHeroReward';
|
||
import { dicRankRewads, dicRankMax } from './dictionary/DicPvpRankReward';
|
||
import { dicPvpBoxs } from './dictionary/DicPvpBox';
|
||
import { dicGuildAuth } from './dictionary/DicGuildAuth';
|
||
import { dicCenterBase, dicEquipPriduceBase, dicBossBase, dicTrainBase, dicDonateBase, dicWishPoolBase, dicStoreBase, dicStructureConsume } from "./dictionary/DicStructure";
|
||
import { dicGuildActiveDayReward } from './dictionary/DicGuildActiveDayReward';
|
||
import { dicGuildActiveWeekReward } from './dictionary/DicGuildActiveWeekReward';
|
||
import { dicGuildActiveWays } from './dictionary/DicGuildActiveWays';
|
||
import { dicGuildPosition } from "./dictionary/DicGuildPosition";
|
||
import { dicMail } from "./dictionary/DicMail";
|
||
import { dicArmyTrainJuDian } from './dictionary/DicArmyTrainJuDian';
|
||
import { dicTrainSoloReward } from './dictionary/DicTrainSoloReward';
|
||
import { RewardInter } from "./interface";
|
||
import { dicArmyDevelopConsume } from '../pubUtils/dictionary/DicArmyDevelopConsume';
|
||
import { dicArmyBossRank } from '../pubUtils/dictionary/DicArmyBossRank';
|
||
import { dicArmyDonate } from '../pubUtils/dictionary/DicArmyDonateBoxReward';
|
||
import { dicRoleFriend, DicRoleFriend } from "./dictionary/DicRoleFriend";
|
||
import { dicRoleFriendLv } from "./dictionary/DicRoleFriendLv";
|
||
import { Attribute } from "../domain/roleField/attribute";
|
||
import { dicGuildActivity, DicGuildActivity } from './dictionary/DicGuildActivity';
|
||
import { dicGateActivityPoint } from './dictionary/DicGateActivityPoint';
|
||
import { dicGuildAuction } from './dictionary/DicGuildAuction';
|
||
import { getCurDay } from "./timeUtil";
|
||
import { dicCityActivity } from "./dictionary/DicCityActivity";
|
||
import { dicChatAccuse } from "./dictionary/DicChatAccuse";
|
||
import { dicCityActivityReward } from "./dictionary/DicCityActivityReward";
|
||
import { dicRaceActivity, dicRaceTypes } from './dictionary/DicRaceActivity';
|
||
import { GUILDACTIVITY } from "./dicParam";
|
||
import { decodeIdCntArrayStr, parseGoodStr, decodeArrayListStr, getRandValueByMinMax } from "./util";
|
||
import { GUILD_SELECT, RACE_EVENT_TYPE } from "../consts";
|
||
import { dicShop, dicShopItem } from "./dictionary/DicShop";
|
||
import { dicShopList } from "./dictionary/DicShopList";
|
||
|
||
export const gameData = {
|
||
blurprtCompose: dicBlueprtCompose,
|
||
blueprtPossibility: dicBlueprtPossibility,
|
||
daily: dicDaily,
|
||
event: dicEvent,
|
||
expedition: dicExpedition,
|
||
expeditionPoint: dicExpeditionPoint,
|
||
funcsSwitch: dicFuncSwitch,
|
||
goods: dicGoods,
|
||
hero: dicHero,
|
||
heroQualityUp: dicHeroQualityUp,
|
||
heroSkill: dicHeroSkill,
|
||
heroStar: dicHeroStar,
|
||
heroWake: dicHeroWake,
|
||
job: dicJob,
|
||
jobClassMaxGrades: jobClassMaxGrades,
|
||
jobClassAndgrades: jobClassAndgrades,
|
||
kingexp: dicKingExp,
|
||
maxPlayerLv: maxPlayerLv,
|
||
charexp: dicCharExp,
|
||
question: dicQuestion,
|
||
se: dicSe,
|
||
tower: dicTower,
|
||
towerTask: dicTowerTask,
|
||
war: dicWar,
|
||
warJson: dicWarJson,
|
||
xunbao: dicXunbao,
|
||
btlBossHpSum: new Map<number, number>(),
|
||
btlBossHp: new Map<number, Array<{dataId: number, hp: number, actorId: number}>>(),
|
||
blueprtToWar: new Map<number, number>(),
|
||
blueprt: blueprt,
|
||
fashion: dicFashions,
|
||
friendShips: friendShips,
|
||
friendShipHidAandIds: friendShipHidAandIds,
|
||
maxFriendShipLv: maxFriendShipLv,
|
||
friendShipLevelMap: dicFriendShipLevelMap,
|
||
randomEffectPool: dicRandomEffectPool,
|
||
strengthenCost: dicStrengthenCost,
|
||
refine: dicRefine,
|
||
jewels: dicJewel,
|
||
dicHeroEquip: dicHeroEquip,
|
||
suit: dicSuit,
|
||
title: dicTitle,
|
||
teraphs: dicTeraph,
|
||
school: dicSchool,
|
||
schoolRate: dicSchoolRate,
|
||
heroScroll: dicHeroScroll,
|
||
preHeroScroll: preHeroScroll,
|
||
pvpOpponent: dicPvpOpponent,
|
||
pvpTeamLevel: dicPvpTeamLevel,
|
||
pvpWar: dicWarPvp,
|
||
pvpRefreshConsume: dicPvpRefreshConsume,
|
||
maxPvpRefreshCnt: maxPvpRefreshCnt,
|
||
pvpGk: dicGkPvp,
|
||
pvpGks: dicGkPvps,
|
||
pvpHeroRewards: dicHeroRewads,
|
||
pvpRankRewards: dicRankRewads,
|
||
pvpBoxs: dicPvpBoxs,
|
||
pvpRankMax: dicRankMax,
|
||
guildAuth: dicGuildAuth,
|
||
centerBase: dicCenterBase,
|
||
equipProduceBase: dicEquipPriduceBase,
|
||
bossBase: dicBossBase,
|
||
trainBase: dicTrainBase,
|
||
donateBase: dicDonateBase,
|
||
armyWishPool: dicWishPoolBase,
|
||
storeBase: dicStoreBase,
|
||
structureConsume: dicStructureConsume,
|
||
guildActiveDayReward: dicGuildActiveDayReward,
|
||
guildActiveWeekReward: dicGuildActiveWeekReward,
|
||
guildPosition: dicGuildPosition,
|
||
armyTrainJuDian: dicArmyTrainJuDian,
|
||
trainSoloReward: dicTrainSoloReward,
|
||
mail: dicMail,
|
||
guildActiveWays: dicGuildActiveWays,
|
||
armyDevelopConsume: dicArmyDevelopConsume,
|
||
armyBossRank: dicArmyBossRank,
|
||
armyDonateBox: dicArmyDonate,
|
||
roleFriend: dicRoleFriend,
|
||
roleFriendLv: dicRoleFriendLv,
|
||
figureCondition: figureCondition,
|
||
guildActivity: dicGuildActivity,
|
||
gateActivityPoint: dicGateActivityPoint,
|
||
guildAuction: dicGuildAuction,
|
||
cityActivity: dicCityActivity,
|
||
chatAccuse: dicChatAccuse,
|
||
cityActivityReward: dicCityActivityReward,
|
||
raceActivityEvents: dicRaceActivity,
|
||
raceTypes: dicRaceTypes,
|
||
raceActivityEncounter: decodeRaceActivityEncounter(),
|
||
raceNormalItems: decodeRaceNormalItems(),
|
||
raceEventItems: decodeRaceEventItems(),
|
||
shop: dicShop,
|
||
shopItem: dicShopItem,
|
||
shopList: dicShopList
|
||
};
|
||
|
||
// 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据
|
||
|
||
/**
|
||
* 根据主公当前经验获得当前等级
|
||
* @param exp 累积经验
|
||
*/
|
||
export function getLvByExp(exp: number) {
|
||
let curLv = 0;
|
||
let entries = gameData.kingexp.entries();
|
||
for (let [lv, {sum}] of entries) {
|
||
curLv = lv;
|
||
if(exp < sum) break;
|
||
}
|
||
|
||
return curLv;
|
||
}
|
||
|
||
/**
|
||
* 根据主公当前等级,获得累积经验,1=> 1级满经验
|
||
* @param lv 等级
|
||
*/
|
||
export function getExpByLv(lv: number) {
|
||
return gameData.kingexp.get(lv);
|
||
}
|
||
|
||
/**
|
||
* 根据武将当前经验获得当前等级
|
||
* @param exp 累积经验
|
||
*/
|
||
export function getHeroLvByExp(exp: number) {
|
||
let curLv = 0;
|
||
let entries = gameData.charexp.entries();
|
||
for (let [lv, sum] of entries) {
|
||
curLv = lv;
|
||
if(exp < sum) break;
|
||
}
|
||
|
||
return curLv;
|
||
}
|
||
|
||
/**
|
||
* 根据武将当前等级,获得累积经验,1=> 1级满经验
|
||
* @param lv
|
||
*/
|
||
export function getHeroExpByLv(lv: number) {
|
||
return gameData.charexp.get(lv);
|
||
}
|
||
|
||
/**
|
||
* 根据武将当前好感获得好感等级
|
||
* @param exp 累积经验
|
||
*/
|
||
export function getFavourLvByExp(exp: number) {
|
||
let curLv = 0;
|
||
let entries = gameData.friendShipLevelMap.entries();
|
||
for (let [lv, { expSum: sum }] of entries) {
|
||
curLv = lv;
|
||
if(exp < sum) break;
|
||
}
|
||
|
||
return curLv;
|
||
}
|
||
|
||
export function getBossHpByWarId(warId: number) {
|
||
let bossHpSum = gameData.btlBossHpSum.get(warId) || 0;
|
||
let bossHpArr = gameData.btlBossHp.get(warId) || [];
|
||
if (!bossHpSum || !bossHpArr) {
|
||
const warInfo = dicWarJson.get(warId);
|
||
if (warInfo && warInfo.length) {
|
||
warInfo.forEach(hero => {
|
||
let { attribute, dataId, relation, actorId } = hero;
|
||
if (relation === 2) {
|
||
let newAttr = new Attribute();
|
||
newAttr.setByWarJson(attribute, 1);
|
||
let attrJson = newAttr.getReduceAttributes();
|
||
|
||
const hp = attrJson.hp||0;
|
||
if (hp > 0) {
|
||
bossHpArr.push({dataId, hp, actorId});
|
||
bossHpSum += hp;
|
||
}
|
||
}
|
||
})
|
||
gameData.btlBossHp.set(warId, bossHpArr);
|
||
gameData.btlBossHpSum.set(warId, bossHpSum);
|
||
}
|
||
}
|
||
return { bossHpSum, bossHpArr };
|
||
}
|
||
|
||
|
||
export function getWarIdByBlueprtId(blueprtId: number) {
|
||
let warId = gameData.blueprtToWar.get(blueprtId);
|
||
if (!warId) {
|
||
let blueprt = gameData.goods.get(blueprtId);
|
||
if(blueprt) {
|
||
const { specialAttr } = blueprt;
|
||
warId = specialAttr.get(SPECIAL_ATTR.WAR_ID);
|
||
if(warId)
|
||
gameData.blueprtToWar.set(blueprtId, warId);
|
||
}
|
||
}
|
||
return warId;
|
||
}
|
||
|
||
export function getHeroStarByQuality(quality: number, star: number) {
|
||
return gameData.heroStar.get(`${quality}_${star}`);
|
||
}
|
||
|
||
export function getHeroWakeByQuality(quality: number, star: number) {
|
||
return gameData.heroWake.get(`${quality}_${star}`);
|
||
}
|
||
|
||
export function getMaxGradeByjobClass(jobClass: number) {
|
||
const job = gameData.jobClassMaxGrades.get(jobClass);
|
||
return job?.jobid;
|
||
}
|
||
|
||
export function getJobByGradeAndClass(jobClass: number, grade: number) {
|
||
return gameData.jobClassAndgrades.get(jobClass +'_' + grade);
|
||
}
|
||
|
||
export function getFriendShipById(shipId: number, level: number) {
|
||
return gameData.friendShips.get(shipId +'_' + level);
|
||
}
|
||
|
||
export function getGoodById(gid:number) {
|
||
return gameData.goods.get(gid);
|
||
}
|
||
|
||
export function getJewelById(gid:number) {
|
||
return gameData.jewels.get(gid);
|
||
}
|
||
|
||
export function getHeroEquipByClassId(classId:number) {
|
||
return gameData.dicHeroEquip.get(classId);
|
||
}
|
||
|
||
export function getHeroJob(jobId: number) {
|
||
const job = gameData.job.get(jobId);
|
||
return job;
|
||
}
|
||
|
||
export function getTitle(titleLv: number) {
|
||
const titleInfo = gameData.title.get(titleLv);
|
||
return titleInfo;
|
||
}
|
||
|
||
export function getTeraph(id: number, grade: number) {
|
||
const teraphInfo = gameData.teraphs.get(id +'_'+ grade);
|
||
return teraphInfo;
|
||
}
|
||
|
||
export function getSchoolRateByStar(star: number, colorStar: number, quality: number) {
|
||
const schoolRate = gameData.schoolRate.get(`${star}_${colorStar}_${quality}`);
|
||
return schoolRate;
|
||
}
|
||
|
||
export function getScollByStar(quality: number, star: number, curQuality: number, colorStar: number) {
|
||
const heroScroll = gameData.heroScroll.get(`${quality}_${star}_${curQuality}_${colorStar}`);
|
||
return heroScroll;
|
||
}
|
||
|
||
export function getSuit(id: number) {
|
||
const suitInfo = gameData.suit.get(id);
|
||
return suitInfo;
|
||
}
|
||
|
||
export function getFuncsSwitch(id:number) {
|
||
const funcInfo = gameData.funcsSwitch.get(id);
|
||
return funcInfo;
|
||
}
|
||
|
||
export function getPLvByScore(score: number) {
|
||
let lv = 0;
|
||
for(let {teamLv, topLineupMin, topLineupMax} of gameData.pvpTeamLevel) {
|
||
if(score >= topLineupMin) lv = teamLv;
|
||
if(score < topLineupMax) break;
|
||
}
|
||
return lv;
|
||
}
|
||
|
||
export function getPvpGkByWarId (warId: number) {
|
||
return gameData.pvpGk.get(warId);
|
||
}
|
||
|
||
export function getPvpGkWarIds() {
|
||
let warIds = gameData.pvpGks;
|
||
return warIds;
|
||
}
|
||
|
||
export function getPvpHeroRewards() {
|
||
return gameData.pvpHeroRewards;
|
||
}
|
||
|
||
export function getPvpRankRewards() {
|
||
return gameData.pvpRankRewards;
|
||
}
|
||
|
||
export function getPvpBoxs() {
|
||
return gameData.pvpBoxs;
|
||
}
|
||
|
||
export function getResultMaxRank() {
|
||
return gameData.pvpRankMax;
|
||
}
|
||
|
||
export function getStructureConsume(structureId: number, level: number) {
|
||
return gameData.structureConsume.get(structureId).get(level);
|
||
}
|
||
|
||
export function hasStructureConsume(structureId: number, level: number) {
|
||
return gameData.structureConsume.get(structureId).has(level);
|
||
}
|
||
|
||
export function getBossByLv(lv: number) {
|
||
return gameData.bossBase.get(lv);
|
||
}
|
||
|
||
export function getArmyTrainJuDian(trainId: number) {
|
||
return gameData.armyTrainJuDian.get(trainId);
|
||
}
|
||
|
||
export function getTrainSoloReward(id: number) {
|
||
return gameData.trainSoloReward.get(id);
|
||
}
|
||
|
||
export function getTrainBaseByLv(lv: number) {
|
||
return gameData.trainBase.get(lv);
|
||
}
|
||
|
||
export function getGuildActiveWeekReward(rank: number) {
|
||
let result = gameData.guildActiveWeekReward.find(cur => {
|
||
let {rankMax, rankMin} = cur;
|
||
return rank >= rankMin && rank <= (rankMax || rankMax == -1);
|
||
});
|
||
let reward = new Array<RewardInter>();
|
||
if(result) reward = result.reward;
|
||
return reward;
|
||
}
|
||
|
||
export function getGuildActiveByIdAndType(id: number, type: number) {
|
||
let dicWay = gameData.guildActiveWays.get(id);
|
||
if(!dicWay) return 0;
|
||
return dicWay.activePoint.get(type.toString());
|
||
}
|
||
export function getArmyDevelopConsumeById(id: number) {
|
||
let result = gameData.armyDevelopConsume.get(id);
|
||
return result;
|
||
}
|
||
|
||
export function getArmyDevelopConsume() {
|
||
return gameData.armyDevelopConsume;
|
||
}
|
||
|
||
export function getArmyBossRank() {
|
||
return gameData.armyBossRank;
|
||
}
|
||
|
||
export function getArmyDonateBaseByLv(lv: number) {
|
||
return gameData.donateBase.get(lv);
|
||
}
|
||
|
||
export function getArmyDonateBoxBaseById(id: number) {
|
||
return gameData.armyDonateBox.get(id);
|
||
}
|
||
export function getArmyWishPoolBaseByLv(lv: number) {
|
||
return gameData.armyWishPool.get(lv);
|
||
}
|
||
|
||
export function getFriendLvByExp(exp: number) {
|
||
let resultLv = 1;
|
||
for(let [lv, {sum}] of gameData.roleFriendLv.entries()) {
|
||
resultLv = lv;
|
||
if(exp < sum) break;
|
||
}
|
||
return resultLv;
|
||
}
|
||
|
||
/**
|
||
* 根据主公当前经验获得当前等级
|
||
* @param exp 累积经验
|
||
*/
|
||
export function getDicFriendByLv(lv: number) {
|
||
let dicFriend: DicRoleFriend;
|
||
let entries = gameData.roleFriend.entries();
|
||
for (let [dicLv, dic ] of entries) {
|
||
dicFriend = dic;
|
||
if(lv > dicLv) break;
|
||
}
|
||
|
||
return dicFriend;
|
||
}
|
||
|
||
|
||
/**
|
||
* @description 获取今天开启的活动的配置
|
||
*/
|
||
export function getTodayGuildActivity() {
|
||
let today = getCurDay();
|
||
let dic: DicGuildActivity;
|
||
for(let [_id, dicGuildActivity] of gameData.guildActivity) {
|
||
if(dicGuildActivity.openDay.includes(today)) {
|
||
dic = dicGuildActivity;
|
||
break;
|
||
}
|
||
}
|
||
return dic;
|
||
}
|
||
|
||
/**
|
||
* 根据军团活动排名获得奖励
|
||
* @param aid 活动id
|
||
* @param rank 排名
|
||
*/
|
||
export function getGuildAuctionRewards(aid: number, rank: number) {
|
||
let ranksReward = gameData.guildAuction.get(aid)||[];
|
||
let dic = ranksReward.find(cur => {
|
||
return rank >= cur.min && (rank <= cur.max || cur.max == 0);
|
||
});
|
||
return dic?dic.rewards: new Array<RewardInter>();
|
||
}
|
||
|
||
/**
|
||
* 根据军团活动排名获得功勋奖励
|
||
* @param type 城池类型
|
||
* @param guildRank 军团排名
|
||
* @param rank 成员在军团内部排名
|
||
*/
|
||
export function getCityActivityRewards(type: number, guildRank: number, rank: number) {
|
||
let ranksReward = gameData.cityActivityReward.get(type)||[];
|
||
let dic = ranksReward.find(cur => {
|
||
return cur.guildRank == guildRank && (rank >= cur.min && (rank <= cur.max || cur.max == 0));
|
||
});
|
||
return dic?dic.honour: 0;
|
||
}
|
||
|
||
function decodeRaceActivityEncounter() {
|
||
let str = GUILDACTIVITY.RACEACTIVITY_ENCOUNTER;
|
||
let map = decodeIdCntArrayStr(str, 1);
|
||
let newMap = new Map<number, number>();
|
||
let eventNum = 0;
|
||
for(let [key, value] of map) {
|
||
if(value == RACE_EVENT_TYPE.EVENT) eventNum ++;
|
||
newMap.set(parseInt(key), parseInt(value));
|
||
}
|
||
return { events: newMap, eventNum };
|
||
}
|
||
|
||
function decodeRaceNormalItems() {
|
||
let str = GUILDACTIVITY.RACEACTIVITY_NORMAL_ITEMS;
|
||
|
||
let result = new Array<{ id: number, min: number, max: number }>();
|
||
if (!str) return result;
|
||
let decodeArr = decodeArrayListStr(str);
|
||
for (let [id, min, max] of decodeArr) {
|
||
if (isNaN(parseInt(id)) || isNaN(parseInt(min)) || isNaN(parseInt(max))) {
|
||
throw new Error('data table format wrong');
|
||
}
|
||
result.push({ id: parseInt(id), min: parseInt(min), max: parseInt(max) });
|
||
}
|
||
return result
|
||
}
|
||
|
||
function decodeRaceEventItems() {
|
||
let str = GUILDACTIVITY.RACEACTIVITY_EVENT_ITEMS||"";
|
||
return parseGoodStr(str);
|
||
}
|
||
|
||
export function getRaceEventItems() {
|
||
let items = gameData.raceNormalItems;
|
||
let result = new Array<RewardInter>();
|
||
for(let {id, min, max} of items) {
|
||
let count = getRandValueByMinMax(min, max, 0);
|
||
result.push({ id, count });
|
||
}
|
||
return result;
|
||
} |