OpenCoverage

qtimezoneprivate_icu.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/tools/qtimezoneprivate_icu.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8static UCalendarDisplayNameType ucalDisplayNameType(QTimeZone::TimeType timeType, QTimeZone::NameType nameType)-
9{-
10-
11 switch (nameType) {-
12 case
executed 4 times by 1 test: case QTimeZone::ShortName :
Executed by:
  • tst_QTimeZone
QTimeZone::ShortName :
executed 4 times by 1 test: case QTimeZone::ShortName :
Executed by:
  • tst_QTimeZone
4
13 case
never executed: case QTimeZone::OffsetName :
QTimeZone::OffsetName :
never executed: case QTimeZone::OffsetName :
0
14 if (timeType == QTimeZone::DaylightTime
timeType == QT...::DaylightTimeDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tst_QTimeZone
)
2
15 return
executed 2 times by 1 test: return UCAL_SHORT_DST;
Executed by:
  • tst_QTimeZone
UCAL_SHORT_DST;
executed 2 times by 1 test: return UCAL_SHORT_DST;
Executed by:
  • tst_QTimeZone
2
16-
17 return
executed 2 times by 1 test: return UCAL_SHORT_STANDARD;
Executed by:
  • tst_QTimeZone
UCAL_SHORT_STANDARD;
executed 2 times by 1 test: return UCAL_SHORT_STANDARD;
Executed by:
  • tst_QTimeZone
2
18 case
executed 1233 times by 1 test: case QTimeZone::DefaultName :
Executed by:
  • tst_QTimeZone
QTimeZone::DefaultName :
executed 1233 times by 1 test: case QTimeZone::DefaultName :
Executed by:
  • tst_QTimeZone
1233
19 case
never executed: case QTimeZone::LongName :
QTimeZone::LongName :
never executed: case QTimeZone::LongName :
0
20 if (timeType == QTimeZone::DaylightTime
timeType == QT...::DaylightTimeDescription
TRUEevaluated 432 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEevaluated 801 times by 1 test
Evaluated by:
  • tst_QTimeZone
)
432-801
21 return
executed 432 times by 1 test: return UCAL_DST;
Executed by:
  • tst_QTimeZone
UCAL_DST;
executed 432 times by 1 test: return UCAL_DST;
Executed by:
  • tst_QTimeZone
432
22-
23 return
executed 801 times by 1 test: return UCAL_STANDARD;
Executed by:
  • tst_QTimeZone
UCAL_STANDARD;
executed 801 times by 1 test: return UCAL_STANDARD;
Executed by:
  • tst_QTimeZone
801
24 }-
25 return
never executed: return UCAL_STANDARD;
UCAL_STANDARD;
never executed: return UCAL_STANDARD;
0
26}-
27-
28-
29static QByteArray ucalDefaultTimeZoneId()-
30{-
31 int32_t size = 30;-
32 QString result(size, Qt::Uninitialized);-
33 UErrorCode status = U_ZERO_ERROR;-
34-
35-
36 size = ucal_getDefaultTimeZone_52(reinterpret_cast<UChar *>(result.data()), size, &status);-
37-
38-
39 if (status == U_BUFFER_OVERFLOW_ERROR
status == U_BU...OVERFLOW_ERRORDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • tst_QTimeZone
) {
0-1
40 result.resize(size);-
41 status = U_ZERO_ERROR;-
42 size = ucal_getDefaultTimeZone_52(reinterpret_cast<UChar *>(result.data()), size, &status);-
43 }
never executed: end of block
0
44-
45-
46 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
) {
0-1
47 result.resize(size);-
48 return
executed 1 time by 1 test: return result.toUtf8();
Executed by:
  • tst_QTimeZone
result.toUtf8();
executed 1 time by 1 test: return result.toUtf8();
Executed by:
  • tst_QTimeZone
1
49 }-
50-
51 return
never executed: return QByteArray();
QByteArray();
never executed: return QByteArray();
0
52}-
53-
54-
55static QString ucalTimeZoneDisplayName(UCalendar *ucal, QTimeZone::TimeType timeType,-
56 QTimeZone::NameType nameType,-
57 const QString &localeCode)-
58{-
59 int32_t size = 50;-
60 QString result(size, Qt::Uninitialized);-
61 UErrorCode status = U_ZERO_ERROR;-
62-
63-
64 size = ucal_getTimeZoneDisplayName_52(ucal,-
65 ucalDisplayNameType(timeType, nameType),-
66 localeCode.toUtf8(),-
67 reinterpret_cast<UChar *>(result.data()),-
68 size,-
69 &status);-
70-
71-
72 if (status == U_BUFFER_OVERFLOW_ERROR
status == U_BU...OVERFLOW_ERRORDescription
TRUEnever evaluated
FALSEevaluated 1237 times by 1 test
Evaluated by:
  • tst_QTimeZone
) {
0-1237
73 result.resize(size);-
74 status = U_ZERO_ERROR;-
75 size = ucal_getTimeZoneDisplayName_52(ucal,-
76 ucalDisplayNameType(timeType, nameType),-
77 localeCode.toUtf8(),-
78 reinterpret_cast<UChar *>(result.data()),-
79 size,-
80 &status);-
81 }
never executed: end of block
0
82-
83-
84 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 1237 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
) {
0-1237
85 result.resize(size);-
86 return
executed 1237 times by 1 test: return result;
Executed by:
  • tst_QTimeZone
result;
executed 1237 times by 1 test: return result;
Executed by:
  • tst_QTimeZone
1237
87 }-
88-
89 return
never executed: return QString();
QString();
never executed: return QString();
0
90}-
91-
92-
93static bool ucalOffsetsAtTime(UCalendar *m_ucal, qint64 atMSecsSinceEpoch,-
94 int *utcOffset, int *dstOffset)-
95{-
96 *utcOffset = 0;-
97 *dstOffset = 0;-
98-
99-
100 UErrorCode status = U_ZERO_ERROR;-
101 UCalendar *ucal = ucal_clone_52(m_ucal, &status);-
102 if (!U_SUCCESS(status)
!U_SUCCESS(status)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • tst_QTimeZone
)
0-8
103 return
never executed: return false;
false;
never executed: return false;
0
104-
105-
106 status = U_ZERO_ERROR;-
107 ucal_setMillis_52(ucal, atMSecsSinceEpoch, &status);-
108-
109 int32_t utc = 0;-
110 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
) {
0-8
111 status = U_ZERO_ERROR;-
112-
113 utc = ucal_get_52(ucal, UCAL_ZONE_OFFSET, &status) / 1000;-
114 }
executed 8 times by 1 test: end of block
Executed by:
  • tst_QTimeZone
8
115-
116 int32_t dst = 0;-
117 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
) {
0-8
118 status = U_ZERO_ERROR;-
119-
120 dst = ucal_get_52(ucal, UCAL_DST_OFFSET, &status) / 1000;-
121 }
executed 8 times by 1 test: end of block
Executed by:
  • tst_QTimeZone
8
122-
123 ucal_close_52(ucal);-
124 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
) {
0-8
125 *utcOffset = utc;-
126 *dstOffset = dst;-
127 return
executed 8 times by 1 test: return true;
Executed by:
  • tst_QTimeZone
true;
executed 8 times by 1 test: return true;
Executed by:
  • tst_QTimeZone
8
128 }-
129 return
never executed: return false;
false;
never executed: return false;
0
130}-
131static QList<QByteArray> uenumToIdList(UEnumeration *uenum)-
132{-
133 QList<QByteArray> list;-
134 int32_t size = 0;-
135 UErrorCode status = U_ZERO_ERROR;-
136-
137 QByteArray result = uenum_next_52(uenum, &size, &status);-
138 while (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 263952 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
&& !result.isEmpty()
!result.isEmpty()Description
TRUEevaluated 263529 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEevaluated 423 times by 1 test
Evaluated by:
  • tst_QTimeZone
) {
0-263952
139 list << result;-
140 status = U_ZERO_ERROR;-
141 result = uenum_next_52(uenum, &size, &status);-
142 }
executed 263529 times by 1 test: end of block
Executed by:
  • tst_QTimeZone
263529
143 std::sort(list.begin(), list.end());-
144 list.erase(std::unique(list.begin(), list.end()), list.end());-
145 return
executed 423 times by 1 test: return list;
Executed by:
  • tst_QTimeZone
list;
executed 423 times by 1 test: return list;
Executed by:
  • tst_QTimeZone
423
146}-
147-
148-
149static int ucalDaylightOffset(const QByteArray &id)-
150{-
151 UErrorCode status = U_ZERO_ERROR;-
152 const int32_t dstMSecs = ucal_getDSTSavings_52(reinterpret_cast<const UChar *>(id.data()), &status);-
153 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
)
0-1
154 return
executed 1 time by 1 test: return (dstMSecs / 1000);
Executed by:
  • tst_QTimeZone
(dstMSecs / 1000);
executed 1 time by 1 test: return (dstMSecs / 1000);
Executed by:
  • tst_QTimeZone
1
155 else-
156 return
never executed: return 0;
0;
never executed: return 0;
0
157}-
158-
159-
160QIcuTimeZonePrivate::QIcuTimeZonePrivate()-
161 : m_ucal(0)-
162{-
163-
164 init(ucalDefaultTimeZoneId());-
165}
executed 1 time by 1 test: end of block
Executed by:
  • tst_QTimeZone
1
166-
167-
168QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId)-
169 : m_ucal(0)-
170{-
171-
172 if (availableTimeZoneIds().contains(ianaId)
availableTimeZ...ntains(ianaId)Description
TRUEevaluated 412 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEevaluated 11 times by 1 test
Evaluated by:
  • tst_QTimeZone
)
11-412
173 init(ianaId);
executed 412 times by 1 test: init(ianaId);
Executed by:
  • tst_QTimeZone
412
174}
executed 423 times by 1 test: end of block
Executed by:
  • tst_QTimeZone
423
175-
176QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other)-
177 : QTimeZonePrivate(other), m_ucal(0)-
178{-
179-
180 UErrorCode status = U_ZERO_ERROR;-
181 m_ucal = ucal_clone_52(other.m_ucal, &status);-
182 if (!U_SUCCESS(status)
!U_SUCCESS(status)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
183 m_id.clear();-
184 m_ucal = 0;-
185 }
never executed: end of block
0
186}
never executed: end of block
0
187-
188QIcuTimeZonePrivate::~QIcuTimeZonePrivate()-
189{-
190 ucal_close_52(m_ucal);-
191}
executed 424 times by 1 test: end of block
Executed by:
  • tst_QTimeZone
424
192-
193QTimeZonePrivate *QIcuTimeZonePrivate::clone()-
194{-
195 return
never executed: return new QIcuTimeZonePrivate(*this);
new QIcuTimeZonePrivate(*this);
never executed: return new QIcuTimeZonePrivate(*this);
0
196}-
197-
198void QIcuTimeZonePrivate::init(const QByteArray &ianaId)-
199{-
200 m_id = ianaId;-
201-
202 const QString id = QString::fromUtf8(m_id);-
203 UErrorCode status = U_ZERO_ERROR;-
204-
205 m_ucal = ucal_open_52(reinterpret_cast<const UChar *>(id.data()), id.size(),-
206 QLocale().name().toUtf8(), UCAL_GREGORIAN, &status);-
207-
208 if (!U_SUCCESS(status)
!U_SUCCESS(status)Description
TRUEnever evaluated
FALSEevaluated 413 times by 1 test
Evaluated by:
  • tst_QTimeZone
) {
0-413
209 m_id.clear();-
210 m_ucal = 0;-
211 }
never executed: end of block
0
212}
executed 413 times by 1 test: end of block
Executed by:
  • tst_QTimeZone
413
213-
214QString QIcuTimeZonePrivate::displayName(QTimeZone::TimeType timeType,-
215 QTimeZone::NameType nameType,-
216 const QLocale &locale) const-
217{-
218-
219 if (nameType == QTimeZone::OffsetName
nameType == QT...ne::OffsetNameDescription
TRUEnever evaluated
FALSEevaluated 1237 times by 1 test
Evaluated by:
  • tst_QTimeZone
) {
0-1237
220 const Data nowData = data(QDateTime::currentMSecsSinceEpoch());-
221-
222-
223 if (timeType == QTimeZone::DaylightTime
timeType == QT...::DaylightTimeDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
224 return
never executed: return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
never executed: return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
0
225 else-
226 return
never executed: return isoOffsetFormat(nowData.standardTimeOffset);
isoOffsetFormat(nowData.standardTimeOffset);
never executed: return isoOffsetFormat(nowData.standardTimeOffset);
0
227 }-
228 return
executed 1237 times by 1 test: return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
Executed by:
  • tst_QTimeZone
ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
executed 1237 times by 1 test: return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
Executed by:
  • tst_QTimeZone
1237
229}-
230-
231QString QIcuTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const-
232{-
233-
234 if (isDaylightTime(atMSecsSinceEpoch)
isDaylightTime...ecsSinceEpoch)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tst_QTimeZone
)
2
235 return
executed 2 times by 1 test: return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QString());
Executed by:
  • tst_QTimeZone
displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QString());
executed 2 times by 1 test: return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QString());
Executed by:
  • tst_QTimeZone
2
236 else-
237 return
executed 2 times by 1 test: return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QString());
Executed by:
  • tst_QTimeZone
displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QString());
executed 2 times by 1 test: return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QString());
Executed by:
  • tst_QTimeZone
2
238}-
239-
240int QIcuTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const-
241{-
242 int stdOffset = 0;-
243 int dstOffset = 0;-
244 ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);-
245 return
executed 2 times by 1 test: return stdOffset + dstOffset;
Executed by:
  • tst_QTimeZone
stdOffset + dstOffset;
executed 2 times by 1 test: return stdOffset + dstOffset;
Executed by:
  • tst_QTimeZone
2
246}-
247-
248int QIcuTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const-
249{-
250 int stdOffset = 0;-
251 int dstOffset = 0;-
252 ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);-
253 return
executed 2 times by 1 test: return stdOffset;
Executed by:
  • tst_QTimeZone
stdOffset;
executed 2 times by 1 test: return stdOffset;
Executed by:
  • tst_QTimeZone
2
254}-
255-
256int QIcuTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const-
257{-
258 int stdOffset = 0;-
259 int dstOffset = 0;-
260 ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);-
261 return
executed 2 times by 1 test: return dstOffset;
Executed by:
  • tst_QTimeZone
dstOffset;
executed 2 times by 1 test: return dstOffset;
Executed by:
  • tst_QTimeZone
2
262}-
263-
264bool QIcuTimeZonePrivate::hasDaylightTime() const-
265{-
266-
267 return
executed 1 time by 1 test: return (ucalDaylightOffset(m_id) != 0);
Executed by:
  • tst_QTimeZone
(ucalDaylightOffset(m_id) != 0);
executed 1 time by 1 test: return (ucalDaylightOffset(m_id) != 0);
Executed by:
  • tst_QTimeZone
1
268}-
269-
270bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const-
271{-
272-
273 UErrorCode status = U_ZERO_ERROR;-
274 UCalendar *ucal = ucal_clone_52(m_ucal, &status);-
275 if (!U_SUCCESS(status)
!U_SUCCESS(status)Description
TRUEnever evaluated
FALSEevaluated 417 times by 1 test
Evaluated by:
  • tst_QTimeZone
)
0-417
276 return
never executed: return false;
false;
never executed: return false;
0
277-
278-
279 status = U_ZERO_ERROR;-
280 ucal_setMillis_52(ucal, atMSecsSinceEpoch, &status);-
281-
282 bool result = false;-
283 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 417 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
) {
0-417
284 status = U_ZERO_ERROR;-
285 result = ucal_inDaylightTime_52(ucal, &status);-
286 }
executed 417 times by 1 test: end of block
Executed by:
  • tst_QTimeZone
417
287-
288 ucal_close_52(ucal);-
289 return
executed 417 times by 1 test: return result;
Executed by:
  • tst_QTimeZone
result;
executed 417 times by 1 test: return result;
Executed by:
  • tst_QTimeZone
417
290}-
291-
292QTimeZonePrivate::Data QIcuTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const-
293{-
294-
295-
296 QTimeZonePrivate::Data data = invalidData();-
297-
298-
299-
300-
301 ucalOffsetsAtTime(m_ucal, forMSecsSinceEpoch, &data.standardTimeOffset,-
302 &data.daylightTimeOffset);-
303 data.offsetFromUtc = data.standardTimeOffset + data.daylightTimeOffset;-
304 data.abbreviation = abbreviation(forMSecsSinceEpoch);-
305-
306 data.atMSecsSinceEpoch = forMSecsSinceEpoch;-
307 return
executed 2 times by 1 test: return data;
Executed by:
  • tst_QTimeZone
data;
executed 2 times by 1 test: return data;
Executed by:
  • tst_QTimeZone
2
308}-
309-
310bool QIcuTimeZonePrivate::hasTransitions() const-
311{-
312-
313-
314-
315-
316-
317 return
executed 1 time by 1 test: return false;
Executed by:
  • tst_QTimeZone
false;
executed 1 time by 1 test: return false;
Executed by:
  • tst_QTimeZone
1
318-
319}-
320-
321QTimeZonePrivate::Data QIcuTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const-
322{-
323-
324-
325-
326-
327-
328 (void)afterMSecsSinceEpoch;-
329 return
never executed: return invalidData();
invalidData();
never executed: return invalidData();
0
330-
331}-
332-
333QTimeZonePrivate::Data QIcuTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const-
334{-
335-
336-
337-
338-
339-
340 (void)beforeMSecsSinceEpoch;-
341 return
never executed: return invalidData();
invalidData();
never executed: return invalidData();
0
342-
343}-
344-
345QByteArray QIcuTimeZonePrivate::systemTimeZoneId() const-
346{-
347-
348-
349 return
never executed: return ucalDefaultTimeZoneId();
ucalDefaultTimeZoneId();
never executed: return ucalDefaultTimeZoneId();
0
350}-
351-
352QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds() const-
353{-
354 UErrorCode status = U_ZERO_ERROR;-
355 UEnumeration *uenum = ucal_openTimeZones_52(&status);-
356 QList<QByteArray> result;-
357 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEevaluated 423 times by 1 test
Evaluated by:
  • tst_QTimeZone
FALSEnever evaluated
)
0-423
358 result = uenumToIdList(uenum);
executed 423 times by 1 test: result = uenumToIdList(uenum);
Executed by:
  • tst_QTimeZone
423
359 uenum_close_52(uenum);-
360 return
executed 423 times by 1 test: return result;
Executed by:
  • tst_QTimeZone
result;
executed 423 times by 1 test: return result;
Executed by:
  • tst_QTimeZone
423
361}-
362-
363QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const-
364{-
365 QByteArray regionCode = QLocalePrivate::countryToCode(country).toUtf8();-
366 UErrorCode status = U_ZERO_ERROR;-
367 UEnumeration *uenum = ucal_openCountryTimeZones_52(regionCode, &status);-
368 QList<QByteArray> result;-
369 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
370 result = uenumToIdList(uenum);
never executed: result = uenumToIdList(uenum);
0
371 uenum_close_52(uenum);-
372 return
never executed: return result;
result;
never executed: return result;
0
373}-
374-
375QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const-
376{-
377-
378-
379 UErrorCode status = U_ZERO_ERROR;-
380 UEnumeration *uenum = ucal_openTimeZoneIDEnumeration_52(UCAL_ZONE_TYPE_ANY, 0,-
381 &offsetFromUtc, &status);-
382 QList<QByteArray> result;-
383 if (U_SUCCESS(status)
U_SUCCESS(status)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
384 result = uenumToIdList(uenum);
never executed: result = uenumToIdList(uenum);
0
385 uenum_close_52(uenum);-
386 return
never executed: return result;
result;
never executed: return result;
0
387-
388-
389-
390}-
391-
392-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9