plcjiemi
微信掃一掃,加我為好友
級(jí)別: 工控俠客
|
Siemens PPI協(xié)議分析 大家好:由于前段時(shí)間的瘋狂的研究西門(mén)子PPI協(xié)議解密之故,所以無(wú)心插柳的研究出了較實(shí)用的西門(mén)子S7-200 PPI協(xié)議,今天奉獻(xiàn)大家。我們經(jīng)常要用于上位機(jī)、現(xiàn)場(chǎng)設(shè)備與S7-200CPU之間的通訊,但是西門(mén)子公司沒(méi)有公布PPI協(xié)議的格式,用戶如果想使用PPI協(xié)議監(jiān)控,必須購(gòu)買(mǎi)其監(jiān)控產(chǎn)品或第三方廠家的組態(tài)軟件。大家要知道國(guó)內(nèi)的組態(tài)王、紫金橋、力控等等組態(tài)公司是花了多少錢(qián)才得到的PPI的深層協(xié)議嗎?其實(shí)西門(mén)子工控產(chǎn)品的超高價(jià)壟斷掠奪行為已經(jīng)引起了我們國(guó)家及業(yè)內(nèi)人士的抵制和抗議,他們的什么軟件都需要授權(quán)且對(duì)于系統(tǒng)的霸道性是有目共睹的。這樣給用戶自主開(kāi)發(fā)就帶來(lái)了一定的困難,特別是想用VB、VC等語(yǔ)言自行開(kāi)發(fā),根本沒(méi)辦法接入PLC,要么你大把掏錢(qián)給他們。我是通過(guò)一個(gè)串口監(jiān)視軟件的數(shù)據(jù)監(jiān)視與分析,找出了PPI協(xié)議的關(guān)鍵報(bào)文格式所在。 其實(shí)西門(mén)子S7-200 PLC之間或者PLC與PC之間通信有很多種方式:自由口,PPI方式,MPI方式,Profibus方式。使用自由口方式進(jìn)行編程時(shí),在上位機(jī)和PLC中都要編寫(xiě)數(shù)據(jù)通信程序。使用PPI協(xié)議進(jìn)行通信時(shí),PLC可以不用編程,而且可讀寫(xiě)所有數(shù)據(jù)區(qū),快捷方便。這也是我們之所以要研究、找出PPI協(xié)議的源動(dòng)力! 下面我們就要說(shuō)說(shuō)分析的方法了! 西門(mén)子的STEP 7 MicroWIN 是用于S7-200系列PLC的開(kāi)發(fā)工具,它使用PC機(jī)上的COM口通過(guò)一條PC/PPI編程電纜連到PLC的編程口上。這說(shuō)明,PC實(shí)際上是可以通過(guò)串口同S7-200 CPU通訊。只是我們不知道通訊協(xié)議而已。通過(guò)截獲PC機(jī)串口上的收發(fā)數(shù)據(jù),對(duì)照Step 7軟件發(fā)出的指令,我們就有可能分析出有關(guān)指令的報(bào)文和通訊方式;然后,直接通過(guò)串口向PLC發(fā)送報(bào)文,以驗(yàn)證這些指令報(bào)文是否正確。本著這一思想,我們采用以下步驟獲得這些報(bào)文。 你首先下載上面那個(gè)英文的串口監(jiān)控軟件,英文不好的網(wǎng)友可以使用我們?yōu)槟銤h化的漢化包,替換原文件即可,你必須使用這個(gè)軟件,因?yàn)槲蚁惹笆褂眠^(guò)很多的監(jiān)控軟件,在收發(fā)數(shù)據(jù)很多的情況下都有死機(jī)現(xiàn)象,造成數(shù)據(jù)丟失,容易給我們錯(cuò)誤分析。接下來(lái)你先打開(kāi)這個(gè)軟件,新建、選擇端口COM1,然后再將PC/PPI編程電纜接在COM1上,這樣,Step7 Micro/Win發(fā)給PLC的報(bào)文就可以在監(jiān)視軟件上完全裸露的展現(xiàn)在你的面前了。我們按S7-200系統(tǒng)手冊(cè)設(shè)置好串口參數(shù):9600,8,E偶校驗(yàn),1位停止位。然后設(shè)置好Step7軟件,使之能與S7-200 CPU正常通訊。從Step7軟件中發(fā)出一個(gè)明確指令,監(jiān)視軟件就能顯示這條報(bào)文了(用16進(jìn)制顯示,ASCII碼的只能看到幾個(gè)版本號(hào)之類(lèi)的,其他都沒(méi)有意義)。 我們的破解策略就是通過(guò)軟件監(jiān)視的方法,分析PLC內(nèi)部固有的PPI通訊協(xié)議,然后上位機(jī)采用VB編程,遵循PPI通訊協(xié)議,讀寫(xiě)PLC數(shù)據(jù),實(shí)現(xiàn)人機(jī)操作任務(wù)。這種通訊方法,與一般的自由通訊協(xié)議相比,省略了PLC的通訊程序編寫(xiě),只需編寫(xiě)上位機(jī)的通訊程序資源。S7-200的編程口物理層為RS-485結(jié)構(gòu),SIEMENS提供MicroWin軟件,采用的是PPI(Point to Point)協(xié)議,關(guān)于232串口轉(zhuǎn)485你可以采用我們網(wǎng)站開(kāi)發(fā)研制的自制PPI電纜,效果倍好哦!請(qǐng)點(diǎn)擊下載!還是自己動(dòng)手,豐衣足食啊! 不能光說(shuō)不練啊!下面我們就說(shuō)說(shuō)西門(mén)子PLC到底是怎么通訊的。 PC與PLC采用主從方式通訊,PC按如下文的格式發(fā)讀寫(xiě)指令,PLC作出接收正確的響應(yīng)(返回應(yīng)答數(shù)據(jù)E5H或F9H見(jiàn)下文分析),上位機(jī)接到此響應(yīng)則發(fā)出確認(rèn)命令(10 02 00 5C 5E 16),PLC再返回給上位機(jī)相應(yīng)數(shù)據(jù)。一般上位機(jī)要連接PLC就要先發(fā)送如下尋呼數(shù)據(jù) 10 02 00 49 4B 16 同志們吶!我們可都是有血、有肉、有思想、有靈感的高級(jí)動(dòng)物啊,面對(duì)這么多枯燥、無(wú)味、復(fù)雜、混亂的機(jī)器數(shù)字你怎么記呢?反正我是記不住啊!(^_^開(kāi)始洗腦)這時(shí)你可以閉上眼睛,安靜、靜、再靜。。。。。。想一想戰(zhàn)爭(zhēng)時(shí)期的戰(zhàn)地對(duì)講機(jī)通話模式,那么這個(gè)初始的尋呼指令(10 02 00 49 4B 16)就可以理解為:“洞兩洞兩(02),我是洞洞(00),聽(tīng)到請(qǐng)回答,聽(tīng)到請(qǐng)回答!over!”。 現(xiàn)在我們來(lái)簡(jiǎn)單的分析一下這個(gè)指令的具體含義: 10起始符,咳嗽一聲要開(kāi)始講話的意思。02是上位機(jī)要聯(lián)系的下位機(jī)PLC的地址站號(hào),就是要找的人。 00就是上位機(jī)電腦本身自己的站號(hào)。49尋呼指令,呼叫尋找的意思。16終止符,over、完畢、結(jié)束的意思。 其中4B為校驗(yàn)碼,防止數(shù)據(jù)傳輸出錯(cuò)而設(shè)計(jì)的,它是這樣得來(lái)的:02+00+49和的最后兩位就是校驗(yàn)碼,這就是所說(shuō)的偶校驗(yàn)或稱和校驗(yàn)也稱余校驗(yàn),因?yàn)槿〉氖浅?00后的余數(shù)。計(jì)算器在16進(jìn)制計(jì)算時(shí)公式(02+00+49)mod 100得出的數(shù)就是校驗(yàn)碼,你計(jì)算一下是不是等于4B啊!其他的所有PPI協(xié)議校驗(yàn)都是如此。假如02站號(hào)的PLC收到尋呼信號(hào)那么會(huì)回答: 10 00 02 00 02 16 意思是:“報(bào)告洞洞(00) ,洞兩(02)收到,請(qǐng)指示,over!” 這樣的解釋是不是很好理解啊!你有更好的解釋嗎?既然找到了要找的人,接下來(lái)PC上位機(jī)電腦,就是司令啦!就可以發(fā)號(hào)施令了。這時(shí)上位機(jī)發(fā)出一條指令,這個(gè)指令下面詳細(xì)解說(shuō),發(fā)號(hào)施令后如果PLC正確接收就會(huì)返回 E5 字符,意思是:“明白!”。其實(shí)啊,說(shuō)到這里PLC只說(shuō)他明白,他已經(jīng)明白了上位機(jī)PC的指示,但并沒(méi)有執(zhí)行命令,那么要怎么他才執(zhí)行命令呢?就是上位機(jī)PC發(fā)出確認(rèn)命令后才執(zhí)行。這時(shí)上位機(jī)會(huì)發(fā)出確認(rèn)指令(10 02 00 5C 5E 16),這里的5C是執(zhí)行指令,意思是:“請(qǐng)洞兩立即執(zhí)行,over!”。然后PLC就干他該干的工作了!原來(lái)PLC也不容易啊,怪不得叫下位機(jī)呢!就是下人的意思! 說(shuō)了這么多亂不亂吶?目的就是要理清上下級(jí)關(guān)系、主從關(guān)系,指令的順序,用一個(gè)好的記憶方法記住枯燥無(wú)味的機(jī)器碼。 下面我們列表分析讀取PLC密碼的指令:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 08 00 00 03 00 05 E0 D2 16 讀命令分析:一次讀一條數(shù)據(jù) 1.開(kāi)始定界符(68H) 2.報(bào)文數(shù)據(jù)長(zhǎng)度 3.重復(fù)數(shù)據(jù)長(zhǎng)度 4.開(kāi)始定界符(68H) 5.遠(yuǎn)程目標(biāo)地址,指該地址的值,就是PLC的地址 6.本地地址,指該地址的指針,就是上位機(jī)自己的地址 7.功能碼,5CH為交替周期觸發(fā),6CH為首次信息周期觸發(fā),7CH為交替周期觸發(fā)。 8-17.目的服務(wù)存取點(diǎn) 18-22.源服務(wù)存取點(diǎn) 18位分析:01:位排列 02:字節(jié)排列 04:字排列 06:雙字排列 23-31.數(shù)據(jù)單元 32.校驗(yàn)碼 33.結(jié)束分界符(16H) 報(bào)文數(shù)據(jù)長(zhǎng)度和重復(fù)數(shù)據(jù)長(zhǎng)度為自DA至DU的數(shù)據(jù)長(zhǎng)度,校驗(yàn)碼為DA至DU數(shù)據(jù)的和校驗(yàn),只取其中的末字節(jié)值關(guān)于這個(gè)校驗(yàn)碼的計(jì)算方法同上面說(shuō)明。 在讀寫(xiě)PLC的變量數(shù)據(jù)中,讀數(shù)據(jù)的功能碼為 6CH,寫(xiě)數(shù)據(jù)的功能碼為 7CH。 對(duì)于一次讀取一個(gè)數(shù)據(jù),讀命令都是33個(gè)字節(jié)。前面的1—22字節(jié)是相同的,為
Byte 23 讀取數(shù)據(jù)的長(zhǎng)度 01:1 Bit 02:1 Byte 04:1 Word 06:Double Word Byte 25數(shù)據(jù)個(gè)數(shù),這里是01 ,一次讀多個(gè)數(shù)據(jù)時(shí)見(jiàn)下面的說(shuō)明。 Byte 27 存儲(chǔ)器類(lèi)型,01:V存儲(chǔ)器 00:其它 Byte 28 存儲(chǔ)器類(lèi)型 04:S 05:SM 06:AI 07:AQ 1E: C 81:I 82:Q 83:M 84:V 1F: T Byte 29,30,31存儲(chǔ)器偏移量指針(存儲(chǔ)器地址*8),如:VB100,存儲(chǔ)器地址為100,偏移量指針為800,轉(zhuǎn)換成16進(jìn)制就是320H,則Byte 29—31這三個(gè)字節(jié)就是:00 03 20。 Byte 32 校驗(yàn)和,前面已說(shuō)到這是從(DA+SA+DSAP+SSAP+DU) Mod 256 。 一次讀多條數(shù)據(jù) 對(duì)于一次讀多個(gè)數(shù)據(jù)的情況,前21Byte與上面相似只是長(zhǎng)度LD,LDr及Byte 15不同: Byte 15 數(shù)據(jù)塊占位字節(jié),它指明數(shù)據(jù)塊占用的字節(jié)數(shù)。與數(shù)據(jù)塊數(shù)量有關(guān),長(zhǎng)度=4+數(shù)據(jù)塊數(shù)*10,如:一條數(shù)據(jù)時(shí)為4+10=0E(H);同時(shí)讀M,V,Q三個(gè)不同的數(shù)據(jù)塊時(shí)為4+3*10=22(H)。 Byte 23 總是02 即以Byte為單位。 Byte 25 以字節(jié)為單位,連續(xù)讀取的字節(jié)數(shù)。如讀2個(gè)VD則Byte25=8 Byte 19---30 按上述一次讀一個(gè)數(shù)據(jù)的格式依次列出, Byte 31---42 另一類(lèi)型的數(shù)據(jù),也是按上述格式給出。 以此類(lèi)推,一次最多讀取222個(gè)字節(jié)的數(shù)據(jù)。 寫(xiě)命令分析: 一次寫(xiě)一個(gè)Double Word類(lèi)型的數(shù)據(jù),寫(xiě)命令是40個(gè)字節(jié),其余為38個(gè)字節(jié)。寫(xiě)一個(gè)Double Word類(lèi)型的數(shù)據(jù),前面的1—22字節(jié)為 :
寫(xiě)一個(gè)其它類(lèi)型的數(shù)據(jù),前面的0—21字節(jié)為 :(與上面比較,只是長(zhǎng)度字節(jié)發(fā)生變化) 68 21 21 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
本帖最近評(píng)分記錄:
|
plcjiemi
微信掃一掃,加我為好友
級(jí)別: 工控俠客
|
從22字節(jié)開(kāi)始根據(jù)寫(xiě)入數(shù)據(jù)的值和位置不同而變化。上表是幾個(gè)寫(xiě)命令的Byte22—40。 字 節(jié) 23 24 25 26 276 28 298 30 31 32 33 34 35 36 37 387 39 40 41 寫(xiě)入位置及值長(zhǎng)度 個(gè)數(shù) 類(lèi)型 偏移量 位數(shù) 值、校驗(yàn)碼、 結(jié)束符 M0.0=1 01 00 01 00 00 82 00 00 00 00 03 00 01 01 00 71 16 M0.0=0 01 00 01 00 00 83 00 00 00 00 03 00 01 00 00 70 16 M0.1=1 01 00 01 00 00 83 00 00 01 00 03 00 01 01 00 72 16 vb100=10 02 00 01 00 01 84 00 03 20 00 04 00 08 10 00 AE 16 vb100=FF 02 00 01 00 01 84 00 03 20 00 04 00 08 FF 00 9D 16 VW100=FFFF 04 00 01 00 01 84 00 03 20 00 04 00 10 FF FF A6 16 VD100=FFFFFFFF 06 00 01 00 01 84 00 03 20 00 04 00 20 FF FF FF FF B8 1 寫(xiě)命令的Byte22—最后, 經(jīng)分析我們可以得出以下結(jié)果: Byte 23-- Byte 31 寫(xiě)入數(shù)據(jù)的長(zhǎng)度、存儲(chǔ)器類(lèi)型、存儲(chǔ)器偏移量與讀命令相同。T,C等不能用寫(xiě)命令寫(xiě)入。 Byte 33 如果寫(xiě)入的是位數(shù)據(jù)這一字節(jié)為03,其它則為04 Byte 35 寫(xiě)入數(shù)據(jù)的位數(shù) 01: 1 Bit 08: 1 Byte 10H: 1 Word 20H: 1 Double Word Byte 36--41值、校驗(yàn)碼、結(jié)束符 如果寫(xiě)入的是位、字節(jié)數(shù)據(jù),Byte35就是寫(xiě)入的值,Byte36=00,Byte37=檢驗(yàn)碼,Byte38=16H,結(jié)束。如果寫(xiě)個(gè)的是字?jǐn)?shù)據(jù)(雙字節(jié)),Byte35,Byte36就是寫(xiě)入的值, Byte37=檢驗(yàn)碼,Byte38=16H,結(jié)束。如果寫(xiě)個(gè)的是雙字?jǐn)?shù)據(jù)(四字節(jié)),Byte35—38就是寫(xiě)入的值, Byte39=檢驗(yàn)碼,Byte40=16H,結(jié)束。 看完上面的指令分析我們現(xiàn)在就舉例幾個(gè)常用的PPI協(xié)議來(lái)分析一下: PC尋呼:10 02 00 49 4B 16 PLC返回:10 00 02 02 04 16 PC發(fā)送:10 02 00 5C 5E 16 PLC返回: E5 我們先來(lái)看看西門(mén)子S7-200PLC的讀取密碼指令: 請(qǐng)用串口軟件以16進(jìn)制發(fā)送,端口設(shè)置9600;e;8;1 發(fā)送:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 08 00 00 03 00 05 E0 D2 16 意思:要求傳送(03區(qū))系統(tǒng)存儲(chǔ)區(qū)05E0位開(kāi)始的8個(gè)字符(這就是8個(gè)密碼數(shù)值)。 如果通訊無(wú)誤,PLC會(huì)返回 E5,意思:已經(jīng)收到 那么這時(shí)上位機(jī)再次發(fā)送確認(rèn)執(zhí)行指令 10 02 00 5C 5E 16 意思:請(qǐng)執(zhí)行命令。(說(shuō)到這里打住一下,PLC返回E5指令后上位機(jī)PC要在很短的時(shí)間內(nèi)發(fā)送確認(rèn)指令,晚了剛才的指令就無(wú)效了具體多長(zhǎng)時(shí)間我也沒(méi)測(cè)準(zhǔn),反正1、2秒時(shí)間是沒(méi)有問(wèn)題的。這也是很多網(wǎng)友問(wèn)我通訊失敗的原因所在)那么這時(shí)PLC還就真的乖乖的執(zhí)行命令,返回如下字符:68 1D 1D 68 00 02 08 32 03 00 00 00 00 00 02 00 0C 00 00 04 01 FF 04 00 40 9B 98 02 06 9D 9A 00 76 7D 16 好了,說(shuō)到這里就此停止,大家看看密碼是多少啊!你如果真正明白了PPI協(xié)議就不難找出出密碼了,但是這個(gè)密碼是經(jīng)過(guò)二次加密的,并不是真正的密碼,還需要破譯,至于密碼算法在此不便公開(kāi),不過(guò)你多做實(shí)驗(yàn)一定能得出結(jié)果的。 下面再看一個(gè)讀取PLC版本號(hào)的指令: 我們?cè)诮饷苤惺紫纫_定的是PLC的版本號(hào)。就是要看看是老版本還是02版的,也好做出加解密方案。他的通訊源碼是這樣的: 68 1B 1B 68 02 00 7C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 14 00 00 03 00 00 00 09 16 發(fā)送完上面數(shù)據(jù)PLC返回E5. 再次發(fā)送確認(rèn)指令:10 02 00 5C 5E 16 這時(shí)plc的版本號(hào)就返回來(lái)了。看下面: 68 29 29 68 00 02 08 32 03 00 00 00 00 00 02 00 18 00 00 04 01 FF 04 00 A0 43 50 55 20 32 32 36 20 43 4E 20 20 20 20 20 20 30 32 30 31 D7 16 你看這一段:43 50 55 20 32 32 36 20 43 4E 20 20 20 20 20 20 30 32 30 31 就是plc版本號(hào)的ASCII碼。用ASC方式顯示就會(huì)看的更明白上面數(shù)據(jù)是:C P U SP 2 2 6 SP C N 0 2 0 1 (sp就是空格)0201是版本號(hào)。 再一個(gè)就是讀TD200密碼指令: 68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 02 00 01 84 00 00 50 B9 16 (VW10) 寫(xiě)M0指令: 68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 01 00 01 00 00 83 00 00 00 00 03 00 01 01 80 16 讀222位3區(qū)(系統(tǒng)區(qū))數(shù)據(jù)指令: 68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 DE 00 00 03 00 00 00 C3 16 讀取密碼保護(hù)位指令: 68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 01 00 00 03 00 05 D8 C3 16 改寫(xiě)密碼保護(hù)位指令:(你來(lái)驗(yàn)證是否可行) 68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 08 00 01 00 00 03 00 05 D8 00 04 00 08 04 EF 16 68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 02 00 01 00 00 03 00 05 D8 00 03 00 08 04 E8 16 全部清除指令: 68 21 21 68 02 00 7C 32 07 00 00 00 24 00 08 00 0C 00 01 12 04 11 45 01 00 FF 09 00 08 16 19 06 0D 01 08 18 1E EE 16 關(guān)于此PPI協(xié)議我也是初步研究難免有失誤之處,希望眾網(wǎng)友有更好的見(jiàn)解與發(fā)現(xiàn)能夠到我們論壇發(fā)表,也可以給我QQ留言! |
|
---|---|---|
|
tkggtdkjpl
工欲善其事,必先利其器!
級(jí)別: 網(wǎng)絡(luò)英雄
|
報(bào)文都研究透了,歷害! |
|
---|---|---|
|
往事如風(fēng)
科技改變制造
級(jí)別: 網(wǎng)絡(luò)英雄
|
厲害,為樓主點(diǎn)贊! |
|
---|---|---|
|
abc526938417
級(jí)別: 正式會(huì)員
|
|
---|---|
|