hxp
2018-08-25 c3f001417a8ca59a1286d71c1cbbab0109bba319
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
x{[c@sìdZddlZddlZddlZddlZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl Z ddl Z ddlZddlZiaiadZdZd„Zd„Zd„Zd„Zd    „Zd
„Zd „Zd „Zd „Zd„Zd„Zd„Zd„Z d„Z!d„Z"d„Z#d„Z$d„Z%d„Z&d„Z'd„Z(d„Z)d„Z*d„Z+d„Z,d„Z-de.fd „ƒYZ/d!e.fd"„ƒYZ0dS(#sVersion = 2014-10-20 18:00iÿÿÿÿNiicCs"tjdƒ}tjtj|ƒS(NtBourseDefState(t IpyGameDataPYt
GetFuncCfgtPlayerDBGSEventtGetDBGSTrig_ByKeytDef_BourseState(R((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt GetOpenState/scCstjtj|dkƒdS(Ni(RtSetDBGSTrig_ByKeyR(tvalue((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt SetOpenState3scCs~tjdƒ}|r)||kr)||S|s8i}ntjd|ƒ}|sTiS|jƒ}|||<tjd|ƒ|S(NtBourseQueryTypeDictt MarketQuery(Rt GetConfigExtGetIpyGameDatat GetLimitInfot SetConfigEx(t    queryTypeR
tipyDatat    LimitInfo((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytGetBourseQueryTypeDefineDict;s     
cCs'tƒs dStjtƒ||ƒdS(N(Rt    GameWorldt GetPsycoFunct__Func_QueryPlayerBourseItem(tindexttick((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnQueryPlayerBourseItemPs    cCsCtjdƒtjƒ}|j|ƒ}t|ƒtjdƒdS(Ns"Bourse### QueryPlayerBourseItem ins#Bourse### QueryPlayerBourseItem out(RtDebugLogtGetPlayerManagertGetPlayerByIndextSyncPlayerBourseItem(RRt playerManagert    curPlayer((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRZs
 
cCstƒs dS|jƒdS(N(RtSync_PlayerBourseItem(R((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRds    
cCsß|jƒ}tjƒ}|j|ƒ}g}xt|ƒD]}|j||ƒ}|s^q:n|jƒr:|jƒdkr:|jƒ|jƒkr:t    |ƒr¹|j
|j ƒƒq¹q:q:Wx|D]}|j |ƒqÄWdS(Ni( tGetIDRtGetBourseManagertGetPlayerBourseItemCounttxrangetGetPlayerBourseItemByIndext GetIsSoldOuttGetCustomerPlayerIDt GetPlayerIDt__GivePlayerBourseGainstappendt GetItemGUIDt DeleteByGUID(Rt curPlayerIDt bourseManagertcurPlayerItemCountt DelItemListtitcurBourseItemDatatitemGUID((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytCheckPlayerEarningsls    cCs.tjƒj|tƒt|ƒt|ƒdS(N(t PyDataManagertGetBourseRecordManagertSyncBourseRecordtTrueR4R(R((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt OnPlayerLogin€s
 
cCs'tƒs dStjtƒ||ƒdS(N(RRRt__Func_QueryBourseItemOnSale(RR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnQueryBourseItemOnSaleŒs    cCsdS(N((RR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR:–scCsétjƒj|ƒ}|j}|j}|j}|s<|r^tjƒ}|jƒ}g}    x•t|dddƒD]}}
|j    |
ƒ} t
| ƒr˜qqn|rÃ|| j ƒkrÃ|    j | ƒqqn|rq|| j ƒkrq|    j | ƒqqqqqqWt|    ƒ} |j|d| | ƒx|    D]} |j| ƒqW|jƒ|rØtjƒj||ƒqØnzt||ƒ}t|ƒ}tjd||fƒ|j|d||ƒx%t|ƒD]}
|j||
ƒq³W|jƒtjdƒdS(Niiÿÿÿÿis?Bourse### QueryBourseItemOnSale queryTypeCount=%s, queryType=%ss#Bourse### QueryBourseItemOnSale out(RRRt    QueryTypetItemNametItemIDR"tCountR$tAttCheckBourseItemDataSaleStatet GetItemNameR*t GetItemTypeIDtlentBegin_AddBourseItemOnSaletAdd_BourseItemOnSaletSync_BourseItemOnSaleR5tGetBourseItemLastPriceManagertSyncBourseItemPricet GetTypeListR(Rt
clientDataRRRtitemNametitemIDR.tbourseItemCounttbourseItemDataListR1R2t
queryCounttbourseItemDatat queryTypeListtqueryTypeCount((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnPYQueryBourseItemOnSale¢sD                  
 
 
 cCs|tj|dƒ}tj|dƒ}tjdƒ}|dksO|||krlt|ƒ|}|t|<ntj|gƒS(NitBourseUpdataCD(tg_lastSortTimeForQueryTypeDicttgettg_dict_Of_QueryTypeIndexListtNoneRRt SortIndexList(RRt lastSortTickRRtDef_Sort_IndexList_Interval((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRJÓs
 cCsg}tjƒ}|jƒ}x^t|dddƒD]F}|j|ƒ}t|ƒr\q5nt||ƒr5|j|ƒq5q5W|t|<dS(Niiÿÿÿÿ(    RR"R?R$R@RAtCheckQueryTypeItemR*RX(RtcurQueryTypeListR.RNRR2((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRZås   
c
CsPt|ƒ}|ikrtS|jdgƒ}|rM|jƒ|krMtSn|jdgƒ}|r~|jƒ|kr~tSn|jdgƒ}|r¯|jƒ|kr¯tSn|jdgƒ}|rê|jƒd}||krêtSn|jdgƒ}|r|jƒ|krtSn|jdgƒ}    |    rL|jƒ|    krLtSnt    S(Nt SpecialItemIDtItemTypet
EquipPlacetJobidt
LimitUseLVt ItemQuality(
RtFalseRWRCtGetTypet GetEquipPlacet GetJobLimittGetUseLVtGetItemQualityR8(
R2Rt curDefineDicttSpecialItemIDListt ItemTypeListtEquipPlaceListtJobListtJobLimitRcRd((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR]ús:   cCs|jƒrtStS(N(R&R8Re(R2((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRA,s cCs^tjjƒ}tj|ƒ}|dks6|dkr:dS||}|jdd|jdS(Niii<(tdatetimettodayRtGetDateTimeByStrRYtdaystseconds(tcompareTimeStrt curDataTimetcompareDataTimet pastTimeDelta((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt GetPastMinute7s 
c    Cstjd|jƒtƒs!dStjd|j|j|j|j|jfƒ|j}tjƒ}|j    |ƒ}tjd|ƒt
j dƒ}t j ƒ}||_|j|_|j|_|j|_|j|_|j|_||k|_tj|||ƒtjd|jƒdS(Ns3Bourse### MGCheckAddPlayerBourseItem in,PlayerID %ssaBourse### MGCheckAddPlayerBourseItem PlayerID=%s ItemIndex=%s Count=%s PriceType=%s PriceCount=%ss1Bourse### MGCheckAddPlayerBourseItem now count %stBourseSaleLimits2Bourse### MGCheckAddPlayerBourseItem out Result %s(RRtPlayerIDRt    ItemIndexR?t    PriceTypet
PriceCountR"R#RRtChGameToMapPyPackt#tagGMCheckAddPlayerBourseItemResulttPwdtResultt NetPackCommontSendPyPackToMapServer(    t
routeIndextmapIDt curPackDataRR-R.tcounttBourseCountLimittsendPack((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGCheckAddPlayerBourseItemMs*                    c    CsÓtjdƒtƒsdStjd|jƒ|j}tjƒ}tjƒ}|j|_|j|_    |j
|_
|j ||j |ƒ}|j |jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j |j!j"ƒƒ|j#|j$j"ƒƒ|j%|j&ƒ|j'|j(ƒ|j)tj*ƒƒtj+ƒj,|ƒ}|r²t-|ƒnt.j/||ƒtjdƒdS(Ns&Bourse### MGAddPlayerSellBourseItem ins/Bourse### MGAddPlayerSellBourseItem PlayerID %ss'Bourse### MGAddPlayerSellBourseItem out(0RRRR|R"tIPY_GameServertIpyBourseRoleItemR?t
ItemTypeIDR>tUserDatatAddItemt
PlayerNamet SetPriceTypeR~t SetPriceCountRtSetTypetTypet SetEquipPlaceRatSetLVtLVtSetUseLVtUseLVt SetJobLimitRptSetItemQualityRdt SetItemColort    ItemColort SetItemTypeIDt SetItemNameR=tstriptSetPwdR‚t
SetEquipGStEquipGStSetOperateInfot OperateInfot SetOnSaleTimetGetCurrentDataTimeStrRtFindPlayerByIDRtDataRecordPacktDR_BourseAddItem(    R†R‡RˆRR-R.tcurBourseRoleItemt curBourseItemR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGAddPlayerSellBourseItemis@                cCstjd|jƒtƒs!dStjƒ}|j|jƒ}|sŽtjƒj|jƒ}|rvt    j
|dƒntjd|jƒdS|j ƒ|jkr»tjd|jƒdS|j ƒrtjƒj|jƒ}|røt    j
|dƒntjd|jƒdS|j ƒjƒ|jjƒkrŒtjƒj|jƒ}|rbt    j
|dƒntjd|j|j ƒ|jfƒdStjƒ}|j|_|j|_|jƒ|_|jƒ|_|jƒ|_tj|||ƒtjdƒdS(    Ns.Bourse### MGCheckBuyBourseItem in, PlayerID %stGeRen_liubo_403656s3Bourse### MGCheckBuyBourseItem ItemGUID %s No Founds6Bourse### MGCheckBuyBourseItem ItemGUID %s is SelfItems5Bourse### MGCheckBuyBourseItem ItemGUID %s is SoldOuttBoursePasswordErrorsBBourse### MGCheckBuyBourseItem ItemGUID %s  pwd is error! %s != %ss"Bourse### MGCheckBuyBourseItem out(RRR|RR"t
FindByGUIDtItemGUIDRRªt PlayerControlt
NotifyCodeR(R&tGetPwdR¢R‚R€ttagGMCheckBuyBourseItemResultt GetPriceTypeR~t GetPriceCountRRBR=R„R…(R†R‡RˆRR.R®RR‹((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGCheckBuyBourseItem˜sF      !&    cCs•tjd|jƒtƒs!dS|j}tjƒ}|j|jƒ}|sitjd|j|ƒdSt|ƒrtjd|j|ƒdSt    ||ƒ}t
j |||ƒ|j t ƒ|j|ƒ|j|jƒttjƒƒ}|jt|ƒƒtjƒj|ƒ}    |    rL|    jddddƒ|    j|ƒ|    jƒn|jƒd|jƒj}
|
dkr{dn    t|
ƒ}
tjƒj|j ƒ|
ƒtj!ƒ} |jƒ} i| j"d    6| j#d
6|j$ƒd 6| jd 6} | j%|t&|| d|jƒƒ|j'ƒ}t(j)||j'ƒ|ƒt*|ƒrU|j+|j,ƒƒntjƒj|ƒ}|r}t-|ƒntjd |jƒdS(Ns-Bourse### MGBuyBourseItemSure in, PlayerID %ssSÍæ¼ÒÈ·ÈϹºÂò½»Ò×ËùÎïÆ· ÒѸ¶Ç®£¡£¬Bourse### MGBuyBourseItemSure ItemGUID %s No FoundsHÍæ¼ÒÈ·ÈϹºÂò½»Ò×ËùÎïÆ· Bourse### MGBuyBourseItemSure ItemGUID %s SoldOutiÿiigð?iÂë RMtuserDatatequipGSR‰s-Bourse### MGBuyBourseItemSure out ItemGUID %s(.RRR|RR"R²R³tLogRAtGetGMGiveBourseItemPackR„R…t SetIsSoldOutR8tSetCustomerPlayerIDtSetCustomerPlayerNameR’tintttimetSetSoldOutTimetstrRRªRERFRGR¹tGetBourseRoleItemR?R5RHtUpdateBourseItemPriceRCR6R>Rt
GetEquipGStAddBourseRecordtDef_Bourse_BuyR(R«tDR_BourseBuyItemR)R,R+R(R†R‡RˆRR-R.R®R‹t soldOutTimeRt    unitPricetbourseRecordMgrtcurRoleItemDatatitemInfot sellPlayerIDt curSellPlayer((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGBuyBourseItemSureÉsP                1"   c
Csâ|jƒ}tjƒj|ƒ}|s+dS|jƒ}i|jd6|jd6|jƒd6|jd6}|j    ƒ}|j
ƒ}|j ƒ}tj |j ƒdƒ}t|||||gƒ}    |jddd|    t|    ƒƒtS(NRMR»R¼R‰itGivePlayerBourseGains(R(RRRªRÆR>RRÈR?R¹R¸RBtToIntDeftGetSoldOutTimeRÅtMapServer_QueryPlayerResultRDR8(
R®R-RÒRÏRÐt
priceCountt    priceTypeRLRÌtresult((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR)s  1   cCs`|\}}}}tjƒ}|j|jƒt||||ƒtj|jƒ|||ƒdS(N(R5R6RÉR!tDef_Bourse_SellR«tDR_BourseGiveGains(Rt
resultInfoRÌttaxMoneyt    giveMoneyRÐRÎ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnGivePlayerBourseGainsResults
 "c    CsŸtjd|j|jfƒtƒs*dS|j}tjƒ}|j|jƒ}|sotjd|jƒdS|jƒ|krŸtjd|j|fƒdS|jƒrì|j    ƒdkrì|j    ƒ|jƒkrìtjd|jƒnj|j
dkrtjd|ƒdSt ||ƒ}t j |||ƒtj||ƒtjd|jƒ|j|jƒtjƒj|ƒ}|rŽt|ƒntjdƒdS(    Ns@Bourse### MGPlayerRecaptureBourseItem in PlayerID %s ItemGUID %ss:Bourse### MGPlayerRecaptureBourseItem ItemGUID %s No FoundsIBourse### MGPlayerRecaptureBourseItem ItemGUID %s not belong to Player %sisGBourse### MGPlayerRecaptureBourseItem ItemGUID %s GivePlayerBourseGainss>Bourse### MGPlayerRecaptureBourseItem PlayerID %s noSpaceCounts@Bourse### MGPlayerRecaptureBourseItem ItemGUID %s GiveBourseItems)Bourse### MGPlayerRecaptureBourseItem out(RRR|R³RR"R²R(R&R'tPackSpaceCountR¾R„R…R«tDR_BourseCancelItemR,RRªR(    R†R‡RˆRR-R.R®R‹R((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGPlayerRecaptureBourseItem"s8         
  cCs¾tjƒ}||_|jƒ|_|jƒ|_|jƒ|_||j    ƒkrid|_d|_n|j
ƒ}|j |_ |j |_ |j |_ t|j ƒ|_|jƒ|_|S(Ni(R€ttagGMGiveBourseItemR|R+R³R¸R~R¹RR(RÆR>R?RRDt UserDataLenRÈR¥(R-R®R‹RÏ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR¾Xs              cCs´tjddƒ}i}tjƒ}|jƒ}xt|dddƒD]}|j|ƒ}t|ƒrnqGnt|j    ƒƒ}||kr’qGn|j
ƒ}|j ƒ}g}    i}
|j ƒ|
d<|j|
d<|j |
d<|    j|
ƒ|jƒ} ||kr||j| ƒn | g||<tj|| |ƒt|| |    ƒqGWx`|jƒD]R\}} x| D]} |j| ƒqmWtjƒj|ƒ}|rZt|ƒqZqZWdS(NR{iiiÿÿÿÿR>R?R(RRRR"R?R$R@RARzt GetOnSaleTimeR(RÆRCRR*R+R«tDR_BourseDeleteOverTimeLongItemtSendOverTimeItemMailtitemsR,RRªR(tBourseSaleTimeMinutet DelItemDictR.RNRR2t
pastMinuteRÑtbourseRoleItemt addItemListt curItemDicttGUIDt itemGUIDListR3RÒ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOverTimeItemsDealns@             cCs)ddl}|jd|g|gƒdS(Niÿÿÿÿt BourseTimeOut(tPlayerCompensationt SendMailByKey(RÑRðRîRô((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRè¥s tBourseRecordManagercBsGeZejdƒZd„Zd„Zed„Zd„Z    d„Z
RS(tBourseMaxRecordcCs i|_dS(N(t BourseRecord(tself((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt__init__²s    c Cs|js dS|jj|gƒ}t|ƒ|jkrA|d=ntj|dtƒ}tjƒ}    |    j    ƒ||    _
||    _ ||    _ ||    _ ||    _||    _t|    jƒ|    _|j|    ƒ||j|<tjd|||f|ƒtjƒj|ƒ}
|
r|j|
ƒntS(Nit ensure_asciis4AddBourseRecord playerID=%s,tradeType=%s,userData=%s(t    maxRecordRøRWRDtjsontdumpsRetPyGameDataStructttagDBPyBourseRecordtclearR|R–t    TimestamptTradeTaxt
TradeMoneyRRåR*RRRRªR7R8( RùtplayerIDt    tradeTypeRÌRÐRÞRßt
recordListR»trecordR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRɶs.    
 
                              c    Cs|jƒ}|jj|gƒ}|r-|n
|dg}|sDdStjƒ}|jƒg|_x‚|D]z}tjƒ}|jƒ|j|_|j    |_    |j
|_
|j |_ |j |_ t|j ƒ|_|jj|ƒqjWt|jƒ|_tj||ƒdS(s(
        @param isAll: ÊÇ·ñÈ«²¿
        iÿÿÿÿN(R(RøRWtChPyNetSendPackttagGCBourseRecordInfotCleart
RecordListttagGCBourseRecordR–RRRRtItemDataRDt ItemDataLenR*R?R„t SendFakePack(    RùRtisAllRRtsyncListt
recordInfot
syncRecordR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR7×s*  
      
     cCs|d}d}d}xB|jjƒD]1}x(|D] }|d7}||jƒ7}q/Wq"Wtjd|ƒtj||ƒ|S(NtiisSaveBourseRecord cnt :%s(Røtvaluest    getBufferRR½tCommFunct
WriteDWORD(RùtsavaDatatcntDatatcntRR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt GetSaveDataós 
c    Cs´tj||ƒ\}}tjd|ƒi|_x{t|ƒD]m}tjƒ}|jƒ||j    |||ƒ7}|j
}|jj |gƒ}|j |ƒ||j|<q?W|S(NsLoadBourseRecord cnt :%s( Rt    ReadDWORDRR½RøR$RÿRRtreadDataR|RWR*(    RùtdatastpostdataslenRt_RRR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytLoadPyGameDatas     
     ( t__name__t
__module__RRRüRúRÉReR7RR$(((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRö®s         !      tBourseItemLastPriceManagercBs5eZd„Zd„Zd„Zd„Zd„ZRS(cCs i|_dS(N(tItemLastPriceDict(Rù((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRús    cCsPtjƒ}|jƒ||_||_||j|<tjd||fƒdS(Ns-¸üн»Ò×ËùÎïÆ·×îгɽ»µ¥¼Û itemid=%s,price=%s(RÿttagDBPyBourseItemLastPriceRR>t    LastPriceR(RR(Rùtitemidtpricet itemLastPrice((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRÇs 
         cCsa|jj|dƒ}|sdStjƒ}|jƒ|j|_|j|_t    j
||ƒdS(N( R(RWRYR    ttagGCBourseItemPriceR R>R*tPriceR„R(RùRRMt    priceDatat    priceInfo((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRI$s 
  cCskd}d}d}x1|jjƒD] }|d7}||jƒ7}q"Wtjd|ƒtj||ƒ|S(NRiisSaveBourseItemLastPrice cnt :%s(R(RRRR½RR(RùRRRR-((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR1s
cCs’tj||ƒ\}}tjd|ƒi|_xYt|ƒD]K}tjƒ}|jƒ||j    |||ƒ7}|j
}||j|<q?W|S(NsLoadBourseItemLastPrice cnt :%s( RRRR½R(R$RÿR)RRR>(RùR R!R"RR#tdataR+((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR$=s     
    (R%R&RúRÇRIRR$(((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR's
                   (1t__doc__RRR€R„RqRRR´R«RRÿR5R    RÃRýRVRXRÊRÛRR    RRRRR4R9R;R:RTRJRZR]RARzRŒR¯RºRÓR)RàRãR¾RòRètobjectRöR'(((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt<module>s^                               
    
                 
         1            2                 /    1    8             6        7        e