ALGORYTM OBLICZANIA WSKAŹNIKA BAROMETRU RYZYKA NADUŻYĆ W ZAMÓWIENIACH PUBLICZNYCH

Uwaga! Cały czas ulepszamy i modyfikujemy nasz algorytm. Aktualna wersja algorytmu może nieco różnić się od zaprezentowanej poniżej bazowej wersji algorytmu.

Struktura rekordu danych

Pojedynczy rekord to jedna część zamówienia (w przypadku zamówień jednoczęściowych mamy oczywiście tylko jeden element) do której doklejone są dane z całego ogłoszenia o zamówieniu. Pomiar ryzyka dotyczy zawsze poszczególnych części zamówienia.

UWAGA! W przypadku, gdy wykonawcą jest konsorcjum a dane konsorcjantów są wprowadzone poprawnie i jest możliwość ich rozdzielenie, każdy rekord jest powielony tyle razy ile było rozpoznanych konsorcjantów.

Poniżej opis poszczególnych kolumn dla każdego rekordu:

Nazwa kolumny Znaczenie kolumny Pochodzenie Obliczenia w BRN Uwagi
id unikalne dla miesiąca w danym roku id wyniku wynik NIE
id_ogloszenia id ogłoszenia o zamówieniu ogloszenie TAK 0 - jeśli brak ogłoszenia o zamówieniu
id_wyniku id ogloszenia o wyniku wynik NIE 0 - jeśli brak ogłoszenia o zamówieniu
nr_czesci nr części, której dotyczy wynik wynik NIE
cpv4 pierwsze 4 cyfry kodu CPV ogloszenie/wynik TAK Jeżeli było więcej kodów CPV przypisanych do wyniku, bierzemy pierwszy wskazany kod. Może zdażyć się tak, że w wyniku nie było kodu CPV w takim wypadku tę wartość pobieramy z ogłoszenia (o ile istnieje)
iloscOfert ilość złożonych ofert wynik TAK
iloscOfertOdrzuconych ilość ofert odrzuconych przez zamawiającego wynik TAK
ofert_prawidlowych ilość ofert złożonych minus ilość ofert odrzuconych przez zamawiającego wynik = iloscOfert - iloscOfertOdrzuconych TAK
kwota_eur kwota w walucie EUR przypisana do beneficjenta wynik TAK
tryb_postepowania tryb postępowania ogloszenie/wynik TAK w przykładzie algorytmu wykorzystujemy notację składającą się z dwóch liter np. "PO" (przetarg ograniczony),"LE" (licytacja elektroniczna),"PN" (przetarg nieograniczony)
terminwnioski pierwszy termin składania wniosków ogloszenie TAK 0 jeżeli brak terminu składania wniosków
wartość to timestamp w formie liczby całkowitej reprezentujący ilość sekund jakie upłynęły od dnia 1970-01-01.
Można wykorzystywać własną notację daty, w takim przypadku należy zaktualizować metodę obliczania różnic w czasie tak by była możliwość obliczania różnicy dni.
zmiana_terminu termin skłądania wniosków po ostatniej zmianie zmiana TAK 0 - jeżeli nie było zmiany terminu
wartość to timestamp w formie liczby całkowitej reprezentujący ilość sekund jakie upłynęły od dnia 1970-01-01.
Można wykorzystywać własną notację daty, w takim przypadku należy zaktualizować metodę obliczania różnic w czasie tak by była możliwość obliczania różnicy dni.
dataZamieszczenia data opublikowania ogłoszenia o zamówieniu ogłoszenie TAK 0 jeżeli nie było ogłoszenia o zamówieniu
czas_na_oferte ilość dni od publikacji do złożenia ofert ogłoszenie jeśli zmiana_terminu != 0 to czas = zmiana_terminu-dataZamieszczenia
w innym przypadku jeśli terminwnioski!=0 to czas = terminwnioski - dataZamieszczenia
czas_na_oferte = wartość_całkowita(czas / 86400)
TAK
waga_kryterium_ceny waga stosowania kryterium ceny ogłoszenie = wartość całkowita od ((suma wag określonych jako kryterium ceny *100) / suma wszystkich wag wskazanych kryteriów) TAK wartość procentowa od 0-100
ilosc_wymaganych_dokumentow ilość wymaganych dla oferentów dodatkowych dokumentów, które muszą złożyć wraz z ofertą ogłoszenie TAK W bazie BZP każdy dokument określony jest oddzielnym TAGiem w dokumencie XML. Wartość ta to suma wszystkie wskazanych jako wymagane dokumentów.
dlugosc_warunkow liczba znaków treści warunków do spełnienia przez oferentów aby przystąpić do postępowania ogłoszenie TAK
dlugosc_przedmiotu liczba znaków treści przedmiotu zamówienia opisanego w ogłoszeniu o zamówienie ogłoszenie TAK
wadium wadium wymagane by przystąpić do postępowania ogloszenie TAK sumaryczne wadium dla wszystkich części
cv5 przynależność do grupy wartości postępowania w danej branży cpv4 wynik TAK Należy sprawdzić, w której grupie wartości dla wskazanego kodu CPV4 znajduje się dany rekord wyniku. Grup jest 5.
data_udzielenia data udzielenia zamówienia wynik TAK wartość to timestamp w formie liczby całkowitej reprezentujący ilość sekund jakie upłynęły od dnia 1970-01-01.
Można wykorzystywać własną notację daty, w takim przypadku należy zaktualizować metodę obliczania różnic w czasie tak by była możliwość obliczania różnicy dni.
czas_decyzji ilość dni od terminu złożenia ofert do ogłoszenia wyniku wynik jeśli zmiana_terminu != 0 to czasw = data_udzielenia-zmiana_terminu
w innym przypadku jeśli terminwnioski!=0 to czasw = data_udzielenia-terminwnioski
czas_decyzji = wartość_całkowita(czasw / 86400)
TAK

Składowe wskaźnika BRN

Składowymi wskaźnika BRN są wartości obliczane na podstawie wybranych wskaźników. Aktualnie jest to 9 wskaźników. Sposób obliczania każej składowej jest przedstawiony w dalszej części algorytmu.

Dla wyników z ogłoszeniami o zamówieniu

  • BRN_1 - obliczany na podstawie wartości ofert_prawidlowych
  • BRN_2 - obliczany na podstawie wartości tryb_postepowania
  • BRN_3 - obliczany na podstawie wartości waga_kryterium_ceny
  • BRN_4 - obliczany na podstawie wartości czas_na_oferte
  • BRN_5 - obliczany na podstawie wartości czas_decyzji
  • BRN_6 - obliczany na podstawie wartości dlugosc_przedmiotu
  • BRN_7 - obliczany na podstawie wartości dlugosc_warunkow
  • BRN_8 - obliczany na podstawie wartości ilosc_wymaganych_dokumentow
  • BRN_9 - obliczany na podstawie wartości wadium

BRN = SUM(BRN_1:BRN_9)/9
(suma wszystkich składowych wskaźnika BRN podzielona przez 9)

Dla wyników bez ogłoszeń o zamówieniu

  • BRN_1 - obliczany na podstawie wartości ofert_prawidlowych
  • BRN_2 - obliczany na podstawie wartości tryb_postepowania
  • BRN_3 - obliczany na podstawie wartości waga_kryterium_ceny

BRN = SUM(BRN_1:BRN_3)/3
(suma wszystkich składowych wskaźnika BRN podzielona przez 3)


Kolejność działań

Bardzo istotne jest aby zachować odpowiednią kolejność działań. Jedne wartości wynikają z innych i nie można dopuścić do sytuacji w której będziemy liczyć wartości do których nie posiadamy jeszcze danych. Aby to ułatwić opracowaliśmy najlepszy sposób na zapewnienie dogodnych warunków dla wszystkich obliczeń. Namenklaturę i nazwy zmiennych opisane są w dalszej części algorytmu:

  1. Tworzymy Tabele pomocnicze średnich i liczności rekordów
  2. Dla wszystkich rekordów liczymy skorygowany wskaźnik wartości (na podstawie kwota_eur oraz cpv4_XXXX_WAR liczymy kwota_eur_COR)
  3. Liczymy Tabelę pomocniczną z wartościami granicznymi dla 5 grup wartości
  4. Na podstawie Tabeli pomocnicznej z wartościami granicznymi dla 5 grup wartości określamy przynależność go grupy wartości dla każdego badanego rekordu.
  5. Dla wszystkich rekordów liczymy pozostałe skorygowaną wskaźniki
  6. Liczymy Tabelę pomocniczną dla pozostałych skorygownych wskaźników
  7. Na podstawie Tabeli pomocnicznej z wartościami granicznymi dla 25 grup wartości określamy przynależność go grupy pozostałe skorygowane wskaźniki.
  8. Posiadając obliczone przynależności do grup dla wszystkich wskaźników dokonujemy obliczenia BRN na ich podstawie zgodnie z opisaną niżej metodą Obliczania Składowych Wskaźnika BRN.

Tabele pomocnicze

Rozpatrując algorytm pod kątem pełnego, ograniczonego zbioru, mamy pewne zmienne stałe, które będą wykorzystywane wielokrotnie. Dobrą praktyką jest aby nie obliczać ich wielokrotnie, zatem warto jest przygotować sobie tabele z tymi danymi.
Jeżeli planujemy realizację dynamicznego indeksu, przeliczanie potencjalnie powinno odbywać się za każdym dołożeniem nowego rekordu. Nie mniej jednak w takim przypadku także można zastosować tabele pomocnicze, obliczane np. co miesiąc lub co kwartał.

Średnie i ilości

W algorytmie potrzebujemy danych ilościowych z konkretnych rynków do testów walidacyjnych oraz średnich wymaganych przy kwalifikowaniu rekordów do odpowiednich grup. Są to:

  • cpv4_XXXX_UB - ilość unikalnych beneficjentów
  • cpv4_XXXX_IW - ilość wyników dla CPV4
  • cpv2_XX_IW - ilość wyników dla CPV2
  • cpv4_XXXX_SWD - średnia ilość wynaganych dokumentów
  • cpv4_XXXX_SKC - średnia wagi kryteriów ceny
  • cpv4_XXXX_GRW_Y_SDP - średnia długość opisu przedmiotu zamówienia - to oprócz grupowania po 4 cyfrach CPV odbywa się dodatkowe grupowanie po wartości
  • cpv2_XX_SDW - średnia długość opisu wymagań dla oferentów (kryteriów przystąpienia) - w tym przypadku grupowanie jest po 2 cyfrach kodu CPV
  • cpv4_XXXX_SWA* - średnie stosunku wadium do wartości
  • cpv4_XXXX_STS - średnia ilość dni na złożenie oferty
  • cpv4_XXXX_SPU - średnia ilość dni od terminu składania ofert do dania publikacji
  • cpv4_XXXX_WAR - średnia wartość części

cpv4_XXXX - oznacza, że badamy cały zbiór rekordów, dla którego pole cpv4 przyjmuje wartość wskazaną w XXXX (4 pierwsze cyfry kodu CPV)
cpv2_XX - oznacza, że badamy cały zbiór rekordów, dla którego pole cpv4 przyjmuje wartość wskazaną w XX% (2 pierwsze cyfry kodu CPV i dowolne kolejne 2 cyfry)
cpv4_XXXX_GRW_Y_ - oznacza, że badamy cały zbiór rekordów, dla którego pole cpv4 przyjmuje wartość wskazaną w XXXX (4 pierwsze cyfry kodu CPV) oraz pole cv5 wskazuje Y (obliczoną grupę wartości w danym rynku CPV4)
* - Uwaga! w przypadku wadium porównujemy stosunek wadium do wartości wygranej - w odpowiedniej walucie - czyli wadium_ratio = wadium / kwota_EUR dla wadium podane w EUR lub wadium_ratio = wadium / kwota_PLN jeżeli wadium było podane w PLN.

Kwalifikacja przynależności rekordu do grup wskaźnika

Wartość składowych wskaźnika BRN bazuje w większości przypadków na analizie skorygowanych wskaźników pod kątem uszeregowania danego wskaźnika przetargu w całym zbiorze danych. Za każdym razem gdy obliczamy tę składową rozkładamy wszystkie rekordy na równe pod kątem ilości przypadków 5 lub 25 grup. Następnie na podstawie zaszeregowania konkretnego przypadku ustalana jest wartość składowej wskaźnika BRN.

Podobnie jak w przypadku średnich i stałych ilości, trudno w systemach relacyjnych ustalać miejsce zaszeregowania w locie. To mnóstwo kosztownych obliczeń. Warto zatem przygotować progi dla każdej z grup, na podstawie których będzie można zakwalifikować dany wynik bez konieczności sięgania do wartości wszystkich innych rekordów.

Korekta wskaźników

Aby obliczenia były porównywalne względem różnych rynków najpierw musimy znormalizować szukane dane. Dlaczego taki zabieg jest konieczny dowiesz się z metodologii. Tu opiszemy jak dokonać korekty wskaźników.

Skorygowane wskaźniki obliczamy na podstawie średnich policzonych wcześniej dla odpowiednich rynków CPV4 lub CPV2. W jednym przypadku do obliczeń należy wykorzystać już wcześniej przypisaną grupę wartości do której przynależy dany rekord. Dla każdego wykorzystywanego wskaźnika przedstawię wzór wyliczenia:

Zalecamy wyliczenie skorygowanych wartości w następującej kolejności

  • kwota_eur_COR = kwota_eur - cpv4_XXXX_WAR
  • ilosc_wymaganych_dokumentow_COR = ilosc_wymaganych_dokumentow - cpv4_XXXX_SWD
  • waga_kryterium_ceny_COR = waga_kryterium_ceny - cpv4_XXXX_SKC
  • dlugosc_warunkow_COR = dlugosc_warunkow - cpv2_XX_SDW
  • wadium_COR = wadium_ratio - cpv4_XXXX_SWA
  • czas_na_oferte_COR = czas_na_oferte - cpv4_XXXX_STS
  • czas_decyzji_COR = czas_decyzji - cpv4_XXXX_SPU

Przed policzeniem ostatniego wskaźnika - skorygowanej długości opisu przedmiou zamówienia, musimy policzyć przynależność do grupy wartości - należy to zrobić na podstawie wskaźnika kwota_eur_COR wg. metody opisanej poniżej. Po przypisaniu do grupy, możemy przystąpić do obliczenie ostatniego skorygowanego wskaźnika:

  • dlugosc_przedmiotu_COR = dlugosc_przedmiotu - cpv4_XXXX_GRW_Y_SDP

Metodologia przydzielania rekordów do grup na podstawie wskaźników

Wszystkie rekordy, które badamy rozdzielamy na podstawie wybranego skorygowanego wskaźnika na 5 lub 25 równolicznych* grup, posortowanych rosnąco lub malejąco.
* do rozdzielenia grup używamy funkcji odpowiadającej funkcji xtile z aplikacji Stata. Oznacza to, że nasze grupy mogą nie być równoliczne, co więcej część grup może być pusta. Dzieje się tak dla tego, że wszystkie takie same wartości ostatniego skorygowanego wskaźnika w danej grupie są wciągane do tej grupy. Miejsce w kolejnej grupie jest jednak nadal zarezerowane dla tych pozycji. W przypadku w którym ilość takich samych wartości znajduje się np. w 3 grupach po sobie następujących, druga grupa w kolejności będzie całkowicie pusta. Opis tej metody rozdzielnia rekordów na grupy można sprawdzić tutaj.

Poniżej zobrazujemy jak to się robi.

Grupy, do których musimy przypisać każdy rekord to:

  • kwota_eur_GR - kwalifikacja do grupy na podstawie znormalizowanej wartości udzielonego rekordu kwota_eur_COR, rozkład na 5 grup
  • ilosc_wymaganych_dokumentow_GR - kwalifikacja do grupy na podstawie znormalizowanej ilości wymaganych dokumentów udzielonego rekordu ilosc_wymaganych_dokumentow_COR, rozkład na 25 grup
  • waga_kryterium_ceny_GR - kwalifikacja do grupy na podstawie znormalizowanej wagi kryteriów ceny udzielonego rekordu waga_kryterium_ceny_COR, rozkład na 25 grup
  • dlugosc_warunkow_GR - kwalifikacja do grupy na podstawie znormalizowanej długości tekstu warunków przystąpienia do przetargu udzielonego rekordu dlugosc_warunkow_COR, rozkład na 25 grup
  • wadium_GR - kwalifikacja do grupy na podstawie znormalizowanej wartości wadium udzielonego rekordu wadium_COR, rozkład na 25 grup
  • czas_na_oferte_GR - kwalifikacja do grupy na podstawie znormalizowanej liczby dni na złożenie oferty udzielonego rekordu czas_na_oferte_COR, rozkład na 25 grup
  • czas_decyzji_GR - kwalifikacja do grupy na podstawie znormalizowanej liczby dni podjęcia decyzji o udzieleniu udzielonego rekordu czas_decyzji_COR, rozkład na 25 grup
  • dlugosc_przedmiotu_GR - kwalifikacja do grupy na podstawie znormalizowanej długości tekstu opisu przedmiotu zamówienia udzielonego rekordu dlugosc_przedmiotu_COR oraz przynależności do grupy kwota_eur_GR, rozkład na 25 grup

Załóżmy że mamy zbiór danych składający się z 20 wskaźników.
Chcemy podzielić go na 5 równolicznych grup.
Nasze dane i wyniki to:

Dane wejściowe Rozkład normalny Rozkład xtile
Dana Wartość Grupa Wartość Grupa Wartość
p1 1 1 1 1 1
p2 1 1 1 1 1
p3 2 1 2 1 2
p4 3 1 3 1 3
p5 4 2 4 2 4
p6 5 2 5 2 5
p7 5 2 5 2 5
p8 5 2 5 2 5
p9 5 3 5 2 5
p10 5 3 5 2 5
p11 5 3 5 2 5
p12 7 3 7 3 7
p13 8 4 8 4 8
p14 8 4 8 4 8
p15 8 4 8 4 8
p16 9 4 9 4 9
p17 10 5 10 5 10
p18 11 5 11 5 11
p19 12 5 12 5 12
p20 12 5 12 5 12

Jak widać powyżej w rozkład normalny daje nam 5 równolicznych grup. Rozkład xtile sprawił, że rekordy z grupy 3 trafiły do grupy 2 ponieważ były takie same jak ostatni rekord tej grupy. W grupie 3 pozostał natomiast tylko jeden rekord, ponieważ 3 poprzedzające miejsca zostały zablokowane przez przesunięte rekordy. Należy zwrócić uwagę, że jeżeli rekord p12 o wartości 7 miałby wartość 5, to grupa 3 byłaby całkowicie pusta, co także jest dopuszczalne.

Powyższe rozwiązanie daje nam to, że grnice każdej z grup są domknięte, co w sumie ułatwi nam ich obliczanie w systemie relacyjnych baz danych.

Aby ułatwić sobie sprawę w liczeniu rozkładzie na grupy możemy przyjąć następującą metodologię:

  1. Liczymy ilość wszystkich rekordów
  2. Liczbę rekordów (lr) dzielimy przez liczbę grup (lg) na którą chcemy rozłożyć rekordy i otrzymujemy liczbę (grl)
  3. Sortujemy rekordy po danym skorygowanym wskaźniku w zależności od wymagań (rosnąco lub malejąco)
  4. Z posortowanego zbioru pobieramy lg-1 rekordów co otrzymaną liczbę grl
  5. Każda wartość skorygowanego wskaźnika tak wybranego rekordu to górna granica kolejnych grup - ostatnia grupa nie ma górnej granicy
  6. Przypisanie grupy następuje po zweryfikowaniu pomiędzy którymi granicami dana skorygowana wartość się znajduje. Należy pamiętać, że górne granice są domknięte.

KIERUNEK SORTOWANIA PRZY SZEREGOWANIU REKORDÓW W GRUPACH
kwota_eur_COR rosnąco
ilosc_wymaganych_dokumentow_COR      rosnąco
waga_kryterium_ceny_COR malejąco
dlugosc_warunkow_COR rosnąco
wadium_COR rosnąco
czas_na_oferte_COR rosnąco
czas_decyzji_COR rosnąco
dlugosc_przedmiotu_COR rosnąco

Dane (obliczone tabele) za lata 01.2010 - 09.2015 można pobrać ze strony "Bazy Danych".

Obliczanie składowych wskaźnika

UWAGA! Kolejność kroków jest dość istotna. Zaoszczędzi także czas obliczeniowy skryptów.

1. Walidacja danych wejściowych

Na wstępnie walidujemy dane wejściowe w celu usunięcia z obliczeń zbyt małych rynków oraz błędnych danych.

  • oznaczamy każdy rekord statusem VALIDATED = 1
  • jeżeli ofert_prawidlowych = 0, to VALIDATED = 0
  • jeżeli kwota_eur < 1000, to VALIDATED = 0
  • jeżeli cpv4_XXXX_IW (ilość wyników dla okresu i rynku - CPV4) < 10, to VALIDATED = 0
  • jeżeli cpv2_XX_IW (ilość wyników dla okresu i rynku - CPV2) < 50, to VALIDATED = 0
  • jeżeli cpv4_XXXX_UB (ilość unikalnych beneficjentów dla okresu i rynku - CPV4) < 6, to VALIDATED = 0
  • jeżeli ofert_prawidlowych =< 0, to VALIDATED = 0
Jeżeli VALIDATED = 0, nie prowadzimy dalszych obliczeń i nie uwzględniamy tego rekordu w jakichkolwiek danych statystycznych wyliczanych w dalszej części algorytmu. Uwaga! Pomimo braku walidacji dane z tego rekordu wchodzą do średnich wyliczanych w tabeli pomocniczej.

2. BRN_1 - obliczany na podstawie wartości ofert_prawidlowych

Warunek BRN_1
Jeśli ofert_prawidlowych > 1 0
Jeśli ofert_prawidlowych = 1 1

3. BRN_2 - obliczany na podstawie wartości tryb_postepowania

Warunek dla x = tryb_postepowania BRN_2
Jeśli x = DK 0.33
Jeśli x = KU 0
Jeśli x = LE 0
Jeśli x = NB 0.66
Jeśli x = NO 0.33
Jeśli x = PN 0
Jeśli x = PO 0.33
Jeśli x = WR 1
Jeśli x = ZC 0
Jeśli x = {inny/błąd} 0

4. BRN_3 - obliczany na podstawie wartości waga_kryterium_ceny_GR

Warunek dla x=waga_kryterium_ceny_GR BRN_3
Jeśli x <= 10 0.5
Jeśli x >= 11 i x <= 20 0
Jeśli x >= 21 i x <= 25 1
Jeśli x = {inna wartość} lub {błąd} 0

5. BRN_4 - obliczany na podstawie wartości czas_na_oferte_GR

Warunek dla x=czas_na_oferte_GR BRN_4
Jeśli x >= 1 i x <=7 1
Jeśli x >= 8 i x <=9 0.66
Jeśli x >= 10 i x <=12 0.33
Jeśli x >= 13 i x <=15 0
Jeśli x >= 16 i x <=19 0
Jeśli x >= 20 i x <=24 0
Jeśli x = 25 0
Jeśli x = {inna wartość} lub {błąd} 0

6. BRN_5 - obliczany na podstawie wartości czas_decyzji_GR

Warunek dla x=czas_decyzji_GR BRN_5
Jeśli x >= 1 i x <=3 0
Jeśli x >= 4 i x <=7 0
Jeśli x >= 8 i x <=13 0
Jeśli x >= 14 i x <=20 0
Jeśli x >= 21 i x <=25 0
Jeśli x = {inna wartość} lub {błąd} 0

7. BRN_6 - obliczany na podstawie wartości dlugosc_przedmiotu_GR

Warunek dla x=dlugosc_przedmiotu_GR BRN_6
Jeśli x = 1 1
Jeśli x >= 2 i x<=19 0
Jeśli x >= 20 i x <=25 0.5
Jeśli x = {inna wartość} lub {błąd} 0

8. BRN_7 - obliczany na podstawie wartości dlugosc_warunkow_GR

Warunek dla x=dlugosc_warunkow_GR BRN_7
Jeśli x >= 1 i x <=8 0
Jeśli x >= 9 i x <=14 0.5
Jeśli x = 25 1
Jeśli x = {inna wartość} lub {błąd} 0

9. BRN_8 - obliczany na podstawie wartości ilosc_wymaganych_dokumentow_GR

Warunek dla x=ilosc_wymaganych_dokumentow_GR BRN_8
Jeśli x >= 1 i x <=3 0
Jeśli x >= 4 i x <=8 0.33
Jeśli x >= 9 i x <=23 0.66
Jeśli x >= 24 i x <=25 1
Jeśli x = {inna wartość} lub {błąd} 0

10. BRN_9 - obliczany na podstawie wartości wadium_GR

Warunek dla x=wadium_GR BRN_9
Jeśli x >= 1 i x <=19 0
Jeśli x >= 20 i x <= 25 1
Jeśli x = {inna wartość} lub {błąd} 0