[r25]: / trunk / Library / POUs / FB_Assert / AssertEquals / svnobj  Maximize  Restore  History

Download this file

301 lines (301 with data), 35.2 kB

Gx_lB┴!0┘jЭoЄlддp╠f[n╠System.StringL{f8a58466-d7f6-439f-bbb8-d4600e41d099}ImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocumentL{f3878285-8e4f-490b-bb1b-9acbb7eb04db}TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}	Id
longTagText
:IF GVL.IgnoreCurrentTest THEN    RETURN;END_IFNAnyComparator(AnyValueOne := Expected, 4			AnyValueTwo := Actual);л(* First check whether the input data are any of the standard data types that are supported by TcUnit.т   In this case call the standard Assert-methods for that data. But before doing that we need to make sureJ   that both the expected and actual:B   - Have both the same data typeB   - Both have the same data size*)╗IF NOT AnyComparator.DataTypesNotEquals AND NOT AnyComparator.DataSizeNotEquals THEN    (* BOOL *)·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_BOOL THEN╬        //MEMCPY(destAddr := ADR(boolExpected), srcAddr := Expected.pValue, n := SIZEOF(BOOL));╝		MEMCPY(destAddr := ADR(boolExpected), srcAddr := Expected.pValue, n := SIZEOF(BOOL));╡        MEMCPY(destAddr := ADR(boolActual), srcAddr := Actual.pValue, n := SIZEOF(BOOL));╪        AssertEquals_BOOL(Expected := boolExpected, Actual := boolActual, Message := Message);         RETURN;!    END_IF"    (* BYTE *)#·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_BYTE THEN$╨        MEMCPY(destAddr := ADR(byteExpected), srcAddr := Expected.pValue, n := SIZEOF(BYTE));%╡        MEMCPY(destAddr := ADR(byteActual), srcAddr := Actual.pValue, n := SIZEOF(BYTE));&╪        AssertEquals_BYTE(Expected := byteExpected, Actual := byteActual, Message := Message);'    (* DATE *)(·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_DATE THEN)╨        MEMCPY(destAddr := ADR(dateExpected), srcAddr := Expected.pValue, n := SIZEOF(DATE));*╡        MEMCPY(destAddr := ADR(dateActual), srcAddr := Actual.pValue, n := SIZEOF(DATE));+╪        AssertEquals_DATE(Expected := dateExpected, Actual := dateActual, Message := Message);,.    (* DATE_AND_TIME *)-╛    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_DATEANDTIME THEN.з        MEMCPY(destAddr := ADR(dateAndTimeExpected), srcAddr := Expected.pValue, n := SIZEOF(DATE_AND_TIME));/р        MEMCPY(destAddr := ADR(dateAndTimeActual), srcAddr := Actual.pValue, n := SIZEOF(DATE_AND_TIME));0Й        AssertEquals_DATE_AND_TIME(Expected := dateAndTimeExpected, Actual := dateAndTimeActual, Message := Message);1    (* DINT *)2·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_DINT THEN3╨        MEMCPY(destAddr := ADR(dintExpected), srcAddr := Expected.pValue, n := SIZEOF(DINT));4╡        MEMCPY(destAddr := ADR(dintActual), srcAddr := Actual.pValue, n := SIZEOF(DINT));5╪        AssertEquals_DINT(Expected := dintExpected, Actual := dintActual, Message := Message);6    (* DWORD *)7═    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_DWORD THEN8╬        MEMCPY(destAddr := ADR(dwordExpected), srcAddr := Expected.pValue, n := SIZEOF(DWORD));9І        MEMCPY(destAddr := ADR(dwordActual), srcAddr := Actual.pValue, n := SIZEOF(DWORD));:б        AssertEquals_DWORD(Expected := dwordExpected, Actual := dwordActual, Message := Message);;    (* INT *)<°    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_INT THEN=І        MEMCPY(destAddr := ADR(intExpected), srcAddr := Expected.pValue, n := SIZEOF(INT));>╝        MEMCPY(destAddr := ADR(intActual), srcAddr := Actual.pValue, n := SIZEOF(INT));?І        AssertEquals_INT(Expected := intExpected, Actual := intActual, Message := Message);@    (* LINT *)A·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_LINT THENB╨        MEMCPY(destAddr := ADR(lintExpected), srcAddr := Expected.pValue, n := SIZEOF(LINT));C╡        MEMCPY(destAddr := ADR(lintActual), srcAddr := Actual.pValue, n := SIZEOF(LINT));D╪        AssertEquals_LINT(Expected := lintExpected, Actual := lintActual, Message := Message);E    (* LREAL *)F═    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_LREAL THENG╬        MEMCPY(destAddr := ADR(lrealExpected), srcAddr := Expected.pValue, n := SIZEOF(LREAL));HІ        MEMCPY(destAddr := ADR(lrealActual), srcAddr := Actual.pValue, n := SIZEOF(LREAL));Iч        AssertEquals_LREAL(Expected := lrealExpected, Actual := lrealActual, Delta := 0.0, Message := Message);J    (* LTIME *)K═    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_LTIME THENL╬        MEMCPY(destAddr := ADR(ltimeExpected), srcAddr := Expected.pValue, n := SIZEOF(LTIME));MІ        MEMCPY(destAddr := ADR(ltimeActual), srcAddr := Actual.pValue, n := SIZEOF(LTIME));Nб        AssertEquals_LTIME(Expected := ltimeExpected, Actual := ltimeActual, Message := Message);O    (* LWORD *)P═    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_LWORD THENQ╬        MEMCPY(destAddr := ADR(lwordExpected), srcAddr := Expected.pValue, n := SIZEOF(LWORD));RІ        MEMCPY(destAddr := ADR(lwordActual), srcAddr := Actual.pValue, n := SIZEOF(LWORD));Sб        AssertEquals_LWORD(Expected := lwordExpected, Actual := lwordActual, Message := Message);T    (* REAL *)U·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_REAL THENV╨        MEMCPY(destAddr := ADR(realExpected), srcAddr := Expected.pValue, n := SIZEOF(REAL));W╡        MEMCPY(destAddr := ADR(realActual), srcAddr := Actual.pValue, n := SIZEOF(REAL));Xь        AssertEquals_REAL(Expected := realExpected, Actual := realActual, Delta := 0.0, Message := Message);Y    (* SINT *)Z·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_SINT THEN[╨        MEMCPY(destAddr := ADR(sintExpected), srcAddr := Expected.pValue, n := SIZEOF(SINT));\╡        MEMCPY(destAddr := ADR(sintActual), srcAddr := Actual.pValue, n := SIZEOF(SINT));]╪        AssertEquals_SINT(Expected := sintExpected, Actual := sintActual, Message := Message);^     (* STRING *)_╒    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_STRING THEN`Б        MEMCPY(destAddr := ADR(stringExpected), srcAddr := Expected.pValue, n := DINT_TO_UDINT(Expected.diSize));aж        MEMCPY(destAddr := ADR(stringActual), srcAddr := Actual.pValue, n := DINT_TO_UDINT(Actual.diSize));bх        AssertEquals_STRING(Expected := stringExpected, Actual := stringActual, Message := Message);c    (* TIME *)d·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_TIME THENe╨        MEMCPY(destAddr := ADR(timeExpected), srcAddr := Expected.pValue, n := SIZEOF(TIME));f╡        MEMCPY(destAddr := ADR(timeActual), srcAddr := Actual.pValue, n := SIZEOF(TIME));g╪        AssertEquals_TIME(Expected := timeExpected, Actual := timeActual, Message := Message);h*    (* TIME_OF_DAY *)i╗    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_TIMEOFDAY THENjр        MEMCPY(destAddr := ADR(timeOfDayExpected), srcAddr := Expected.pValue, n := SIZEOF(TIME_OF_DAY));kй        MEMCPY(destAddr := ADR(timeOfDayActual), srcAddr := Actual.pValue, n := SIZEOF(TIME_OF_DAY));lч        AssertEquals_TIME_OF_DAY(Expected := timeOfDayExpected, Actual := timeOfDayActual, Message := Message);m    (* UDINT *)n═    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_UDINT THENo╬        MEMCPY(destAddr := ADR(udintExpected), srcAddr := Expected.pValue, n := SIZEOF(UDINT));pІ        MEMCPY(destAddr := ADR(udintActual), srcAddr := Actual.pValue, n := SIZEOF(UDINT));qб        AssertEquals_UDINT(Expected := udintExpected, Actual := udintActual, Message := Message);r    (* UINT *)s·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_UINT THENt╨        MEMCPY(destAddr := ADR(uintExpected), srcAddr := Expected.pValue, n := SIZEOF(UINT));u╡        MEMCPY(destAddr := ADR(uintActual), srcAddr := Actual.pValue, n := SIZEOF(UINT));v╪        AssertEquals_UINT(Expected := uintExpected, Actual := uintActual, Message := Message);w    (* ULINT *)x═    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_ULINT THENy╬        MEMCPY(destAddr := ADR(ulintExpected), srcAddr := Expected.pValue, n := SIZEOF(ULINT));zІ        MEMCPY(destAddr := ADR(ulintActual), srcAddr := Actual.pValue, n := SIZEOF(ULINT));{б        AssertEquals_ULINT(Expected := ulintExpected, Actual := ulintActual, Message := Message);|    (* USINT *)}═    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_USINT THEN~╬        MEMCPY(destAddr := ADR(usintExpected), srcAddr := Expected.pValue, n := SIZEOF(USINT));І        MEMCPY(destAddr := ADR(usintActual), srcAddr := Actual.pValue, n := SIZEOF(USINT));─б        AssertEquals_USINT(Expected := usintExpected, Actual := usintActual, Message := Message);│    (* WORD *)┌·    IF UDINT_TO_INT(Expected.TypeClass) = IBaseLibrary.TypeClass.TYPE_WORD THEN┐╨        MEMCPY(destAddr := ADR(wordExpected), srcAddr := Expected.pValue, n := SIZEOF(WORD));└╡        MEMCPY(destAddr := ADR(wordActual), srcAddr := Actual.pValue, n := SIZEOF(WORD));┘╪        AssertEquals_WORD(Expected := wordExpected, Actual := wordActual, Message := Message);├Х(* If we've come to this row, it means that the data input is not any of the standard primitive data types, and thus┤H   we need to do special handling *)┬╬TestInstancePath := AddTestNameToInstancePath(TestInstancePath := FINDTestSuiteInstancePath());┴PIF AnyComparator.DataTypesNotEquals THEN┼Б    ExpectedDataString := CONCAT(STR1 := '(Type class = ', STR2 := F_AnyTypeClassToString((Expected.TypeClass)));▀■    ExpectedDataString := CONCAT(STR1 := ExpectedDataString, STR2 := ')');▄ж    ActualDataString := CONCAT(STR1 := '(Type class = ', STR2 := F_AnyTypeClassToString(Actual.TypeClass));█▄    ActualDataString := CONCAT(STR1 := ActualDataString, STR2 := ')');▌TELSIF AnyComparator.DataSizeNotEquals THEN▐д    ExpectedDataString := CONCAT(STR1 := 'Data size = ', STR2 := DINT_TO_STRING(Expected.diSize));░╪    ActualDataString := CONCAT(STR1 := 'Data size = ', STR2 := DINT_TO_STRING(Actual.diSize));▒ZELSIF AnyComparator.DataContentNotEquals THEN▓Э    FOR Count := 0 TO MIN(Expected.diSize-1, 38) BY 1 DO // One byte will equal two characters (example: 255 = 0xff, 1 = 0x01)⌠─        ExpectedDataString := CONCAT(STR1 := ExpectedDataString,■л                                                  STR2 := BYTE_TO_HEXSTR(in := Expected.pValue[Count],∙н                                                                                       iPrecision := 2,√т                                                                                       bLoCase := FALSE));≈    END_FOR≤√    ExpectedDataString := CONCAT(STR1 := '0x', STR2 := ExpectedDataString);≥Ь    FOR Count := 0 TO MIN(Actual.diSize-1, 38) BY 1 DO // One byte will equal two characters (example: 255 = 0xff, 1 = 0x01) x        ActualDataString := CONCAT(STR1 := ActualDataString,⌡д                                                STR2 := BYTE_TO_HEXSTR(in := Actual.pValue[Count],°й                                                                                     iPrecision := 2,²п                                                                                     bLoCase := FALSE));·▌    ActualDataString := CONCAT(STR1 := '0x', STR2 := ActualDataString);÷ФIF (AnyComparator.DataTypesNotEquals OR AnyComparator.DataSizeNotEquals OR AnyComparator.DataContentNotEquals) THEN═h    AssertResults.ReportResult(Expected := Expected,║`                               Actual := Actual,╒d                               Message := Message,ё┬                               TestInstancePath := TestInstancePath,є├                               AlreadyReported => AlreadyReported);╔√IF NOT AlreadyReported AND (AnyComparator.DataTypesNotEquals OR AnyComparator.DataSizeNotEquals OR AnyComparator.DataContentNotEquals) THENі(    SetTestFailed();ї√    AssertMessageFormatter.LogAssertFailure(Expected := ExpectedDataString,╗▌                                            Actual := ActualDataString,╘~                                            Message := Message,╙є                                            TestInstancePath := TestInstancePath);╚Interface╛L{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}ґ(*╝й    Asserts that two objects (of any type) are equal. If they are not, an assertion error is created.╞н    For REAL and LREAL it's recommended to use the AssertEquals_REAL or AssertEquals_LREAL respectively╟І    as these give the possibility to specify a delta between the expected and actual value.╠4METHOD PUBLIC AssertEquals╡VAR_INPUTЁJ    Expected : ANY; // Expected valueЄp    Actual : ANY; // The value to check against expected╣     Message : T_MaxString; // The identifying message for the assertion errorІEND_VARЇVAR╦"    Count : DINT;╧H    ExpectedDataString : STRING(80);╨D    ActualDataString : STRING(80);╩F    TestInstancePath : T_MaxString;╪6    AlreadyReported : BOOL;ҐJ    AnyComparator : FB_AnyComparator;╬0    boolExpected : BOOL;©,    boolActual : BOOL;ю0    byteExpected : BYTE;а,    byteActual : BYTE;б0    dateExpected : DATE;ц,    dateActual : DATE;дP    dateAndTimeExpected : DATE_AND_TIME;еL    dateAndTimeActual : DATE_AND_TIME;ф0    dintExpected : DINT;г,    dintActual : DINT;х4    dwordExpected : DWORD;и0    dwordActual : DWORD;й,    intExpected : INT;к(    intActual : INT;л0    lintExpected : LINT;м,    lintActual : LINT;н4    lrealExpected : LREAL;о0    lrealActual : LREAL;п4    ltimeExpected : LTIME;я0    ltimeActual : LTIME;р4    lwordExpected : LWORD;с0    lwordActual : LWORD;т0    realExpected : REAL;у,    realActual : REAL;ж0    sintExpected : SINT;в,    sintActual : SINT;ьB    stringExpected : T_MaxString;ы>    stringActual : T_MaxString;з0    timeExpected : TIME;ш,    timeActual : TIME;эH    timeOfDayExpected : TIME_OF_DAY;щD    timeOfDayActual : TIME_OF_DAY;ч4    udintExpected : UDINT;ъ0    udintActual : UDINT;Ю0    uintExpected : UINT;А,    uintActual : UINT;Б4    ulintExpected : ULINT;Ц0    ulintActual : ULINT;Д4    usintExpected : USINT;Е0    usintActual : USINT;Ф0    wordExpected : WORD;Г,    wordActual : WORD;пппEКпп	
ґзп-
пп	
ґзп-пп	
ґзп-пп	
ґзп-пп	
ґзп-пп	
ґ(зп-пп	
ґ	зп-пп	
ґ
зп-пп	
ґзп-пп	
ґзп-пп	
ґ
зп-пп	
ґзп-пп	
ґзп-пп	
ґзп-пп	
ґзп-пп	
ґзп-пп	
ґзп-пп	
ґзп-пп	
ґ)зп-пп	
ґ*зп-пп	
ґзп-пп	
ґзп-пп	
ґзп- пп	
ґзп-!пп	
ґзп-пп	
ґзп-"пп	
ґзп-#пп	
ґзп-$пп	
ґзп-%пп	
ґзп-&пп	
ґзп- пп	
ґ зп-!пп	
ґ!зп-пп	
ґ"зп-'пп	
ґ#зп-(пп	
ґ$зп-)пп	
ґ%зп-*пп	
ґ&зп-+пп	
ґ'зп- пп	
ґ(зп-!пп	
ґ)зп-пп	
ґ*зп-,пп	
ґ+зп--пп	
ґ,зп-.пп	
ґ-зп-/пп	
ґ.зп-0пп	
ґ/зп- пп	
ґ0зп-!пп	
ґ1зп-пп	
ґ2зп-1пп	
ґ3зп-2пп	
ґ4зп-3пп	
ґ5зп-4пп	
ґ6зп-5пп	
ґ7зп- пп	
ґ8зп-!пп	
ґ9зп-пп	
ґ:зп-6пп	
ґ;зп-7пп	
ґ<зп-8пп	
ґ=зп-9пп	
ґ>зп-:пп	
ґ?зп- пп	
ґ@зп-!пп	
ґAзп-пп	
ґBзп-;пп	
ґCзп-<пп	
ґDзп-=пп	
ґEзп->пп	
ґFзп-?пп	
ґGзп- пп	
ґHзп-!пп	
ґIзп-пп	
ґJзп-@пп	
ґKзп-Aпп	
ґLзп-Bпп	
ґMзп-Cпп	
ґNзп-Dпп	
ґOзп- пп	
ґPзп-!пп	
ґQзп-пп	
ґRзп-Eпп	
ґSзп-Fпп	
ґTзп-Gпп	
ґUзп-Hпп	
ґVзп-Iпп	
ґWзп- пп	
ґXзп-!пп	
ґYзп-пп	
ґZзп-Jпп	
ґ[зп-Kпп	
ґ\зп-Lпп	
ґ]зп-Mпп	
ґ^зп-Nпп	
ґ_зп- пп	
ґ`зп-!пп	
ґaзп-пп	
ґbзп-Oпп	
ґcзп-Pпп	
ґdзп-Qпп	
ґeзп-Rпп	
ґfзп-Sпп	
ґgзп- пп	
ґhзп-!пп	
ґiзп-пп	
ґjзп-Tпп	
ґkзп-Uпп	
ґlзп-Vпп	
ґmзп-Wпп	
ґnзп-Xпп	
ґoзп- пп	
ґpзп-!пп	
ґqзп-пп	
ґrзп-Yпп	
ґsзп-Zпп	
ґtзп-[пп	
ґuзп-\пп	
ґvзп-]пп	
ґwзп- пп	
ґxзп-!пп	
ґyзп-пп	
ґzзп-^пп	
ґ{зп-_пп	
ґ|зп-`пп	
ґ}зп-aпп	
ґ~зп-bпп	
ґзп- пп	
ґ─зп-!пп	
ґ│зп-пп	
ґ┌зп-cпп	
ґ┐зп-dпп	
ґ└зп-eпп	
ґ┘зп-fпп	
ґ├зп-gпп	
ґ┤зп- пп	
ґ┬зп-!пп	
ґ┴зп-пп	
ґ┼зп-hпп	
ґ▀зп-iпп	
ґ▄зп-jпп	
ґ█зп-kпп	
ґ▌зп-lпп	
ґ▐зп- пп	
ґ░зп-!пп	
ґ▒зп-пп	
ґ▓зп-mпп	
ґ⌠зп-nпп	
ґ■зп-oпп	
ґ∙зп-pпп	
ґ√зп-qпп	
ґ≈зп- пп	
ґ≤зп-!пп	
ґ≥зп-пп	
ґ зп-rпп	
ґ⌡зп-sпп	
ґ°зп-tпп	
ґ²зп-uпп	
ґ·зп-vпп	
ґ÷зп- пп	
ґ═зп-!пп	
ґ║зп-пп	
ґ╒зп-wпп	
ґёзп-xпп	
ґєзп-yпп	
ґ╔зп-zпп	
ґізп-{пп	
ґїзп- пп	
ґ╗зп-!пп	
ґ╘зп-пп	
ґ╙зп-|пп	
ґ╚зп-}пп	
ґ╛зп-~пп	
ґґзп-пп	
ґ╝зп-─пп	
ґ╞зп- пп	
ґ╟зп-!пп	
ґ╠зп-пп	
ґ╡зп-│пп	
ґЁзп-┌пп	
ґЄзп-┐пп	
ґ╣зп-└пп	
ґІзп-┘пп	
ґЇзп- пп	
ґ╦зп-!пп	
ґ╧зп-пп	
ґ╨зп-пп	
ґ╩зп-пп	
ґ╪зп-├пп	
ґҐзп-┤пп	
ґ╬зп-┬пп	
ґ©зп-пп	
ґюзп-┴пп	
ґазп-┼пп	
ґбзп-▀пп	
ґцзп-▄пп	
ґдзп-█пп	
ґезп-▌пп	
ґфзп-▐пп	
ґгзп-▀пп	
ґхзп-░пп	
ґизп-█пп	
ґйзп-▒пп	
ґкзп-▓пп	
ґлзп-⌠пп	
ґмзп-■пп	
ґнзп-∙пп	
ґозп-√пп	
ґпзп-≈пп	
ґязп-≤пп	
ґрзп-пп	
ґсзп-≥пп	
ґтзп- пп	
ґузп-⌡пп	
ґжзп-°пп	
ґвзп-²пп	
ґьзп-≈пп	
ґызп-·пп	
ґззп-пп	
ґшзп-пп	
ґэзп-÷пп	
ґщзп-═пп	
ґчзп-║пп	
ґъзп-╒пп	
ґЮзп-ёпп	
ґАзп-єпп	
ґБзп-пп	
ґЦзп-пп	
ґДзп-╔пп	
ґЕзп-іпп	
ґФзп-пп	
ґГзп-їпп	
ґХзп-╗пп	
ґИзп-╘пп	
ґЙзп-╙пп	
ґзп-п╚╛пE>пп	
ґКзп-ґпп	
ґЛзп-╝пп	
ґМзп-╞пп	
ґНзп-╟пп	
ґОзп-пп	
ґПзп-╠пп	
ґЯзп-╡пп	
ґРзп-Ёпп	
ґСзп-Єпп	
ґТзп-╣пп	
ґУзп-Іпп	
ґЖзп-Їпп	
ґВзп-╦пп	
ґЬзп-╧пп	
ґЫзп-╨пп	
ґЗзп-╩пп	
ґШзп-╪пп	
ґЭзп-Ґпп	
ґЩзп-пп	
ґЧзп-╬пп	
ґЪзп-©пп	
ґзп-юпп	
ґзп-апп	
ґзп-бпп	
ґзп-цпп	
ґзп-дпп	
ґзп-епп	
ґзп-фпп	
ґзп-гпп	
ґзп-хпп	
ґ	зп-ипп	
ґ
зп-йпп	
ґзп-кпп	
ґзп-лпп	
ґ
зп-мпп	
ґзп-нпп	
ґзп-опп	
ґзп-ппп	
ґзп-япп	
ґзп-рпп	
ґзп-спп	
ґзп-тпп	
ґзп-упп	
ґзп-жпп	
ґзп-впп	
ґзп-ьпп	
ґзп-ыпп	
ґзп-зпп	
ґзп-шпп	
ґзп-эпп	
ґзп-щпп	
ґзп-чпп	
ґзп-ъпп	
ґ зп-Юпп	
ґ!зп-Апп	
ґ"зп-Бпп	
ґ#зп-Цпп	
ґ$зп-Дпп	
ґ%зп-Епп	
ґ&зп-Фпп	
ґ'зп-Гпп	
ґзп-І